diff --git a/CMakeLists.txt b/CMakeLists.txt index 2cd51d1f364..a36ab662bb9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -760,8 +760,8 @@ endif() # Unit testing option(WITH_GTESTS "Enable GTest unit testing" OFF) -option(WITH_OPENGL_RENDER_TESTS "Enable OpenGL render related unit testing (Experimental)" OFF) -option(WITH_OPENGL_DRAW_TESTS "Enable OpenGL UI drawing related unit testing (Experimental)" OFF) +option(WITH_GPU_RENDER_TESTS "Enable GPU render related unit testing (EEVEE, Workbench and Grease Pencil)" OFF) +option(WITH_GPU_DRAW_TESTS "Enable GPU drawing related unit testing (GPU backends and draw manager)" OFF) option(WITH_COMPOSITOR_REALTIME_TESTS "Enable regression testing for realtime compositor" OFF) if(UNIX AND NOT (APPLE OR HAIKU)) option(WITH_UI_TESTS "\ diff --git a/build_files/build_environment/cmake/ocloc.cmake b/build_files/build_environment/cmake/ocloc.cmake index c9ed61b91d7..2d55c133e80 100644 --- a/build_files/build_environment/cmake/ocloc.cmake +++ b/build_files/build_environment/cmake/ocloc.cmake @@ -17,6 +17,7 @@ ExternalProject_Add(external_ocloc PREFIX ${BUILD_DIR}/ocloc CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/ocloc ${DEFAULT_CMAKE_FLAGS} ${OCLOC_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/ocloc + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/ocloc/src/external_ocloc/ < ${PATCH_DIR}/ocloc.diff ) add_dependencies( diff --git a/build_files/build_environment/cmake/openimagedenoise.cmake b/build_files/build_environment/cmake/openimagedenoise.cmake index 62da42a01a1..04d5b848aeb 100644 --- a/build_files/build_environment/cmake/openimagedenoise.cmake +++ b/build_files/build_environment/cmake/openimagedenoise.cmake @@ -14,6 +14,7 @@ if(NOT APPLE) ${OIDN_EXTRA_ARGS} -DOIDN_DEVICE_SYCL=ON -DOIDN_DEVICE_SYCL_AOT=OFF + -DOIDN_DEVICE_HIP=ON -DLEVEL_ZERO_ROOT=${LIBDIR}/level-zero/lib ) endif() diff --git a/build_files/build_environment/cmake/openvdb.cmake b/build_files/build_environment/cmake/openvdb.cmake index fe5f94e8f6c..5d213076fab 100644 --- a/build_files/build_environment/cmake/openvdb.cmake +++ b/build_files/build_environment/cmake/openvdb.cmake @@ -47,12 +47,6 @@ set(OPENVDB_EXTRA_ARGS ) set(OPENVDB_PATCH ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/openvdb/src/openvdb < ${PATCH_DIR}/openvdb.diff) -if(APPLE) - set(OPENVDB_PATCH - ${OPENVDB_PATCH} && - ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/openvdb/src/openvdb < ${PATCH_DIR}/openvdb_metal.diff - ) -endif() ExternalProject_Add(openvdb URL file://${PACKAGE_DIR}/${OPENVDB_FILE} diff --git a/build_files/build_environment/patches/ocloc.diff b/build_files/build_environment/patches/ocloc.diff new file mode 100644 index 00000000000..11fb8a6b26f --- /dev/null +++ b/build_files/build_environment/patches/ocloc.diff @@ -0,0 +1,14 @@ +diff --git a/shared/offline_compiler/source/ocloc_fatbinary.cpp b/shared/offline_compiler/source/ocloc_fatbinary.cpp +index 98a1c0e..4d9b5b0 100644 +--- a/shared/offline_compiler/source/ocloc_fatbinary.cpp ++++ b/shared/offline_compiler/source/ocloc_fatbinary.cpp +@@ -286,7 +286,9 @@ int buildFatBinaryForTarget(int retVal, const std::vector &argsCopy + productConfig = ProductConfigHelper::parseMajorMinorRevisionValue(argHelper->productConfigHelper->getProductConfigFromDeviceName(product)); + } + +- fatbinary.appendFileEntry(pointerSize + "." + productConfig, pCompiler->getPackedDeviceBinaryOutput()); ++ // Storing binaries under the hardware prefix instead of the full architecture version number, ++ // as they would otherwise be ignored if they do not fully match that of the execution device. ++ fatbinary.appendFileEntry(pointerSize + "." + NEO::hardwarePrefix[argHelper->productConfigHelper->getProductFamilyFromDeviceName(productConfig)], pCompiler->getPackedDeviceBinaryOutput()); + return retVal; + } diff --git a/build_files/build_environment/patches/openvdb_metal.diff b/build_files/build_environment/patches/openvdb_metal.diff deleted file mode 100644 index ba3e5bca939..00000000000 --- a/build_files/build_environment/patches/openvdb_metal.diff +++ /dev/null @@ -1,7976 +0,0 @@ -diff --git a/nanovdb/nanovdb/NanoVDB.h b/nanovdb/nanovdb/NanoVDB.h -index fde5c47..cff460a 100644 ---- a/nanovdb/nanovdb/NanoVDB.h -+++ b/nanovdb/nanovdb/NanoVDB.h -@@ -140,7 +140,27 @@ - #define NANOVDB_ALIGN(n) alignas(n) - #endif // !defined(NANOVDB_ALIGN) - --#ifdef __CUDACC_RTC__ -+#ifdef __KERNEL_METAL__ -+ -+using namespace metal; -+#define std metal -+#define double uint64_t -+#define __global__ device -+#define __local__ thread -+#define __constant__ constant -+#define sqrtf sqrt -+#define rintf rint -+#define fminf fmin -+#define fmaxf fmax -+#define floorf floor -+#define ceilf ceil -+#define fabs abs -+#define fmaf fma -+#define tanf tan -+ -+#define NANOVDB_ASSERT(x) -+ -+#elif defined(__CUDACC_RTC__) - - typedef signed char int8_t; - typedef short int16_t; -@@ -157,6 +177,10 @@ typedef unsigned long long uint64_t; - - #else // !__CUDACC_RTC__ - -+#define __constant__ const -+#define __global__ -+#define __local__ -+ - #include // for abs in clang7 - #include // for types like int32_t etc - #include // for size_t type -@@ -262,7 +286,7 @@ enum class GridType : uint32_t { Unknown = 0, - Index = 19,// index into an external array of values - End = 20 }; - --#ifndef __CUDACC_RTC__ -+#if !defined(__CUDACC_RTC__) && !defined(__KERNEL_METAL__) - /// @brief Retuns a c-string used to describe a GridType - inline const char* toStr(GridType gridType) - { -@@ -289,7 +313,7 @@ enum class GridClass : uint32_t { Unknown = 0, - IndexGrid = 8,// grid whose values are offsets, e.g. into an external array - End = 9 }; - --#ifndef __CUDACC_RTC__ -+#if !defined(__CUDACC_RTC__) && !defined(__KERNEL_METAL__) - /// @brief Retuns a c-string used to describe a GridClass - inline const char* toStr(GridClass gridClass) - { -@@ -313,7 +337,7 @@ enum class GridFlags : uint32_t { - End = 1 << 6, - }; - --#ifndef __CUDACC_RTC__ -+#if !defined(__CUDACC_RTC__) && !defined(__KERNEL_METAL__) - /// @brief Retuns a c-string used to describe a GridFlags - inline const char* toStr(GridFlags gridFlags) - { -@@ -355,13 +379,13 @@ enum class GridBlindDataSemantic : uint32_t { Unknown = 0, - template - struct is_same - { -- static constexpr bool value = false; -+ static __constant__ constexpr bool value = false; - }; - - template - struct is_same - { -- static constexpr bool value = true; -+ static __constant__ constexpr bool value = true; - }; - - // --------------------------> enable_if <------------------------------------ -@@ -383,13 +407,13 @@ struct enable_if - template - struct is_const - { -- static constexpr bool value = false; -+ static __constant__ constexpr bool value = false; - }; - - template - struct is_const - { -- static constexpr bool value = true; -+ static __constant__ constexpr bool value = true; - }; - - // --------------------------> remove_const <------------------------------------ -@@ -412,7 +436,7 @@ struct remove_const - template - struct is_floating_point - { -- static const bool value = is_same::value || is_same::value; -+ static __constant__ const bool value = is_same::value || is_same::value; - }; - - // --------------------------> is_specialization <------------------------------------ -@@ -425,12 +449,12 @@ struct is_floating_point - template class TemplateType> - struct is_specialization - { -- static const bool value = false; -+ static __constant__ const bool value = false; - }; - template class TemplateType> - struct is_specialization, TemplateType> - { -- static const bool value = true; -+ static __constant__ const bool value = true; - }; - - // --------------------------> Value Map <------------------------------------ -@@ -495,19 +519,19 @@ struct BuildToValueMap - // --------------------------> utility functions related to alignment <------------------------------------ - - /// @brief return true if the specified pointer is aligned --__hostdev__ inline static bool isAligned(const void* p) -+__hostdev__ inline static bool isAligned(__global__ const void* p) - { - return uint64_t(p) % NANOVDB_DATA_ALIGNMENT == 0; - } - - /// @brief return true if the specified pointer is aligned and not NULL --__hostdev__ inline static bool isValid(const void* p) -+__hostdev__ inline static bool isValid(__global__ const void* p) - { - return p != nullptr && uint64_t(p) % NANOVDB_DATA_ALIGNMENT == 0; - } - - /// @brief return the smallest number of bytes that when added to the specified pointer results in an aligned pointer --__hostdev__ inline static uint64_t alignmentPadding(const void* p) -+__hostdev__ inline static uint64_t alignmentPadding(__global__ const void* p) - { - NANOVDB_ASSERT(p); - return (NANOVDB_DATA_ALIGNMENT - (uint64_t(p) % NANOVDB_DATA_ALIGNMENT)) % NANOVDB_DATA_ALIGNMENT; -@@ -515,43 +539,66 @@ __hostdev__ inline static uint64_t alignmentPadding(const void* p) - - /// @brief offset the specified pointer so it is aligned. - template --__hostdev__ inline static T* alignPtr(T* p) -+__hostdev__ inline static __global__ T* alignPtr(__global__ T* p) - { - NANOVDB_ASSERT(p); -- return reinterpret_cast( (uint8_t*)p + alignmentPadding(p) ); -+ return reinterpret_cast<__global__ T*>( (__global__ uint8_t*)p + alignmentPadding(p) ); - } - - /// @brief offset the specified pointer so it is aligned. - template --__hostdev__ inline static const T* alignPtr(const T* p) -+__hostdev__ inline static __global__ const T* alignPtr(__global__ const T* p) - { - NANOVDB_ASSERT(p); -- return reinterpret_cast( (const uint8_t*)p + alignmentPadding(p) ); -+ return reinterpret_cast<__global__ const T*>( (__global__ const uint8_t*)p + alignmentPadding(p) ); - } - - // --------------------------> PtrDiff PtrAdd <------------------------------------ - - template --__hostdev__ inline static int64_t PtrDiff(const T1* p, const T2* q) -+__hostdev__ inline static int64_t PtrDiff(__global__ const T1* p, __global__ const T2* q) - { - NANOVDB_ASSERT(p && q); -- return reinterpret_cast(p) - reinterpret_cast(q); -+ return reinterpret_cast<__global__ const char*>(p) - reinterpret_cast<__global__ const char*>(q); - } -+#if defined(__KERNEL_METAL__) -+template -+__hostdev__ inline static int64_t PtrDiff(__local__ const T1* p, __local__ const T2* q) -+{ -+ NANOVDB_ASSERT(p && q); -+ return reinterpret_cast<__local__ const char*>(p) - reinterpret_cast<__local__ const char*>(q); -+} -+#endif - - template --__hostdev__ inline static DstT* PtrAdd(SrcT *p, int64_t offset) -+__hostdev__ inline static __global__ DstT* PtrAdd(__global__ SrcT *p, int64_t offset) - { - NANOVDB_ASSERT(p); -- return reinterpret_cast(reinterpret_cast(p) + offset); -+ return reinterpret_cast<__global__ DstT*>(reinterpret_cast<__global__ char*>(p) + offset); - } -+#if defined(__KERNEL_METAL__) -+template -+__hostdev__ inline static __local__ DstT* PtrAdd(__local__ SrcT *p, int64_t offset) -+{ -+ NANOVDB_ASSERT(p); -+ return reinterpret_cast<__local__ DstT*>(reinterpret_cast<__local__ char*>(p) + offset); -+} -+#endif - - template --__hostdev__ inline static const DstT* PtrAdd(const SrcT *p, int64_t offset) -+__hostdev__ inline static __global__ const DstT* PtrAdd(__global__ const SrcT *p, int64_t offset) - { - NANOVDB_ASSERT(p); -- return reinterpret_cast(reinterpret_cast(p) + offset); -+ return reinterpret_cast<__global__ const DstT*>(reinterpret_cast<__global__ const char*>(p) + offset); - } -- -+#if defined(__KERNEL_METAL__) -+template -+__hostdev__ inline static __local__ const DstT* PtrAdd(__local__ const SrcT *p, int64_t offset) -+{ -+ NANOVDB_ASSERT(p); -+ return reinterpret_cast<__local__ const DstT*>(reinterpret_cast<__local__ const char*>(p) + offset); -+} -+#endif - // --------------------------> Rgba8 <------------------------------------ - - /// @brief 8-bit red, green, blue, alpha packed into 32 bit unsigned int -@@ -562,13 +609,13 @@ class Rgba8 - uint32_t packed;// 32 bit packed representation - } mData; - public: -- static const int SIZE = 4; -+ static __constant__ const int SIZE = 4; - using ValueType = uint8_t; - -- Rgba8(const Rgba8&) = default; -- Rgba8(Rgba8&&) = default; -- Rgba8& operator=(Rgba8&&) = default; -- Rgba8& operator=(const Rgba8&) = default; -+ Rgba8(__global__ const Rgba8&) = default; -+ Rgba8(__global__ Rgba8&&) = default; -+ __global__ Rgba8& operator=(__global__ Rgba8&&) __global__ = default; -+ __global__ Rgba8& operator=(__global__ const Rgba8&) __global__ = default; - __hostdev__ Rgba8() : mData{0,0,0,0} {static_assert(sizeof(uint32_t) == sizeof(Rgba8),"Unexpected sizeof");} - __hostdev__ Rgba8(uint8_t r, uint8_t g, uint8_t b, uint8_t a = 255u) : mData{r, g, b, a} {} - explicit __hostdev__ Rgba8(uint8_t v) : Rgba8(v,v,v,v) {} -@@ -579,8 +626,8 @@ public: - (uint8_t(0.5f + a * 255.0f))}// round to nearest - { - } -- __hostdev__ bool operator<(const Rgba8& rhs) const { return mData.packed < rhs.mData.packed; } -- __hostdev__ bool operator==(const Rgba8& rhs) const { return mData.packed == rhs.mData.packed; } -+ __hostdev__ bool operator<(__global__ const Rgba8& rhs) const { return mData.packed < rhs.mData.packed; } -+ __hostdev__ bool operator==(__global__ const Rgba8& rhs) const { return mData.packed == rhs.mData.packed; } - __hostdev__ float lengthSqr() const - { - return 0.0000153787005f*(float(mData.c[0])*mData.c[0] + -@@ -588,18 +635,18 @@ public: - float(mData.c[2])*mData.c[2]);//1/255^2 - } - __hostdev__ float length() const { return sqrtf(this->lengthSqr() ); } -- __hostdev__ const uint8_t& operator[](int n) const { return mData.c[n]; } -- __hostdev__ uint8_t& operator[](int n) { return mData.c[n]; } -- __hostdev__ const uint32_t& packed() const { return mData.packed; } -- __hostdev__ uint32_t& packed() { return mData.packed; } -- __hostdev__ const uint8_t& r() const { return mData.c[0]; } -- __hostdev__ const uint8_t& g() const { return mData.c[1]; } -- __hostdev__ const uint8_t& b() const { return mData.c[2]; } -- __hostdev__ const uint8_t& a() const { return mData.c[3]; } -- __hostdev__ uint8_t& r() { return mData.c[0]; } -- __hostdev__ uint8_t& g() { return mData.c[1]; } -- __hostdev__ uint8_t& b() { return mData.c[2]; } -- __hostdev__ uint8_t& a() { return mData.c[3]; } -+ __hostdev__ __global__ const uint8_t& operator[](int n) const __global__ { return mData.c[n]; } -+ __hostdev__ __global__ uint8_t& operator[](int n) __global__ { return mData.c[n]; } -+ __hostdev__ __global__ const uint32_t& packed() const __global__ { return mData.packed; } -+ __hostdev__ __global__ uint32_t& packed() __global__ { return mData.packed; } -+ __hostdev__ __global__ const uint8_t& r() const __global__ { return mData.c[0]; } -+ __hostdev__ __global__ const uint8_t& g() const __global__ { return mData.c[1]; } -+ __hostdev__ __global__ const uint8_t& b() const __global__ { return mData.c[2]; } -+ __hostdev__ __global__ const uint8_t& a() const __global__ { return mData.c[3]; } -+ __hostdev__ __global__ uint8_t& r() __global__ { return mData.c[0]; } -+ __hostdev__ __global__ uint8_t& g() __global__ { return mData.c[1]; } -+ __hostdev__ __global__ uint8_t& b() __global__ { return mData.c[2]; } -+ __hostdev__ __global__ uint8_t& a() __global__ { return mData.c[3]; } - };// Rgba8 - - using PackedRGBA8 = Rgba8;// for backwards compatibility -@@ -660,17 +707,17 @@ public: - NANOVDB_ASSERT(minor < (1u << 11));// max value of minor is 2047 - NANOVDB_ASSERT(patch < (1u << 10));// max value of patch is 1023 - } -- __hostdev__ bool operator==(const Version &rhs) const {return mData == rhs.mData;} -- __hostdev__ bool operator< (const Version &rhs) const {return mData < rhs.mData;} -- __hostdev__ bool operator<=(const Version &rhs) const {return mData <= rhs.mData;} -- __hostdev__ bool operator> (const Version &rhs) const {return mData > rhs.mData;} -- __hostdev__ bool operator>=(const Version &rhs) const {return mData >= rhs.mData;} -+ __hostdev__ bool operator==(__global__ const Version &rhs) const {return mData == rhs.mData;} -+ __hostdev__ bool operator< (__global__ const Version &rhs) const {return mData < rhs.mData;} -+ __hostdev__ bool operator<=(__global__ const Version &rhs) const {return mData <= rhs.mData;} -+ __hostdev__ bool operator> (__global__ const Version &rhs) const {return mData > rhs.mData;} -+ __hostdev__ bool operator>=(__global__ const Version &rhs) const {return mData >= rhs.mData;} - __hostdev__ uint32_t id() const { return mData; } - __hostdev__ uint32_t getMajor() const { return (mData >> 21) & ((1u << 11) - 1);} - __hostdev__ uint32_t getMinor() const { return (mData >> 10) & ((1u << 11) - 1);} - __hostdev__ uint32_t getPatch() const { return mData & ((1u << 10) - 1);} - --#ifndef __CUDACC_RTC__ -+#if !defined(__CUDACC_RTC__) && !defined(__KERNEL_METAL__) - const char* c_str() const - { - char *buffer = (char*)malloc(4 + 1 + 4 + 1 + 4 + 1);// xxxx.xxxx.xxxx\0 -@@ -749,7 +796,7 @@ struct Maximum - //@} - - template --__hostdev__ inline bool isApproxZero(const Type& x) -+__hostdev__ inline bool isApproxZero(__global__ const Type& x) - { - return !(x > Tolerance::value()) && !(x < -Tolerance::value()); - } -@@ -771,10 +818,12 @@ __hostdev__ inline float Min(float a, float b) - { - return fminf(a, b); - } -+#ifndef __KERNEL_METAL__ - __hostdev__ inline double Min(double a, double b) - { - return fmin(a, b); - } -+#endif - template - __hostdev__ inline Type Max(Type a, Type b) - { -@@ -793,45 +842,55 @@ __hostdev__ inline float Max(float a, float b) - { - return fmaxf(a, b); - } -+#ifndef __KERNEL_METAL__ - __hostdev__ inline double Max(double a, double b) - { - return fmax(a, b); - } -+#endif - __hostdev__ inline float Clamp(float x, float a, float b) - { - return Max(Min(x, b), a); - } -+#ifndef __KERNEL_METAL__ - __hostdev__ inline double Clamp(double x, double a, double b) - { - return Max(Min(x, b), a); - } -+#endif - - __hostdev__ inline float Fract(float x) - { - return x - floorf(x); - } -+#ifndef __KERNEL_METAL__ - __hostdev__ inline double Fract(double x) - { - return x - floor(x); - } -+#endif - - __hostdev__ inline int32_t Floor(float x) - { - return int32_t(floorf(x)); - } -+#ifndef __KERNEL_METAL__ - __hostdev__ inline int32_t Floor(double x) - { - return int32_t(floor(x)); - } -+#endif - - __hostdev__ inline int32_t Ceil(float x) - { - return int32_t(ceilf(x)); - } -+#ifndef __KERNEL_METAL__ - __hostdev__ inline int32_t Ceil(double x) - { - return int32_t(ceil(x)); - } -+#endif - - template - __hostdev__ inline T Pow2(T x) -@@ -875,46 +934,78 @@ __hostdev__ inline int Abs(int x) - } - - template class Vec3T> --__hostdev__ inline CoordT Round(const Vec3T& xyz); -+__hostdev__ inline CoordT Round(__global__ const Vec3T& xyz); -+#if defined(__KERNEL_METAL__) -+template class Vec3T> -+__hostdev__ inline CoordT Round(__local__ const Vec3T& xyz); -+#endif - - template class Vec3T> --__hostdev__ inline CoordT Round(const Vec3T& xyz) -+__hostdev__ inline CoordT Round(__global__ const Vec3T& xyz) - { - return CoordT(int32_t(rintf(xyz[0])), int32_t(rintf(xyz[1])), int32_t(rintf(xyz[2]))); - //return CoordT(int32_t(roundf(xyz[0])), int32_t(roundf(xyz[1])), int32_t(roundf(xyz[2])) ); - //return CoordT(int32_t(floorf(xyz[0] + 0.5f)), int32_t(floorf(xyz[1] + 0.5f)), int32_t(floorf(xyz[2] + 0.5f))); - } -+#if defined(__KERNEL_METAL__) -+template class Vec3T> -+__hostdev__ inline CoordT Round(__local__ const Vec3T& xyz) -+{ -+ return CoordT(int32_t(rintf(xyz[0])), int32_t(rintf(xyz[1])), int32_t(rintf(xyz[2]))); -+ //return CoordT(int32_t(roundf(xyz[0])), int32_t(roundf(xyz[1])), int32_t(roundf(xyz[2])) ); -+ //return CoordT(int32_t(floorf(xyz[0] + 0.5f)), int32_t(floorf(xyz[1] + 0.5f)), int32_t(floorf(xyz[2] + 0.5f))); -+} -+#endif - - template class Vec3T> --__hostdev__ inline CoordT Round(const Vec3T& xyz) -+__hostdev__ inline CoordT Round(__global__ const Vec3T& xyz) - { - return CoordT(int32_t(floor(xyz[0] + 0.5)), int32_t(floor(xyz[1] + 0.5)), int32_t(floor(xyz[2] + 0.5))); - } -+#if defined(__KERNEL_METAL__) -+template class Vec3T> -+__hostdev__ inline CoordT Round(__local__ const Vec3T& xyz) -+{ -+ return CoordT(int32_t(floor(xyz[0] + 0.5)), int32_t(floor(xyz[1] + 0.5)), int32_t(floor(xyz[2] + 0.5))); -+} -+#endif - - template class Vec3T> --__hostdev__ inline CoordT RoundDown(const Vec3T& xyz) -+__hostdev__ inline CoordT RoundDown(__global__ const Vec3T& xyz) - { - return CoordT(Floor(xyz[0]), Floor(xyz[1]), Floor(xyz[2])); - } -- -+#if defined(__KERNEL_METAL__) -+template class Vec3T> -+__hostdev__ inline CoordT RoundDown(__local__ const Vec3T& xyz) -+{ -+ return CoordT(Floor(xyz[0]), Floor(xyz[1]), Floor(xyz[2])); -+} -+#endif - //@{ - /// Return the square root of a floating-point value. - __hostdev__ inline float Sqrt(float x) - { - return sqrtf(x); - } -+#ifndef __KERNEL_METAL__ - __hostdev__ inline double Sqrt(double x) - { - return sqrt(x); - } -+#endif - //@} - - /// Return the sign of the given value as an integer (either -1, 0 or 1). - template --__hostdev__ inline T Sign(const T &x) { return ((T(0) < x)?T(1):T(0)) - ((x < T(0))?T(1):T(0)); } -+__hostdev__ inline T Sign(__global__ const T &x) { return ((T(0) < x)?T(1):T(0)) - ((x < T(0))?T(1):T(0)); } -+#if defined(__KERNEL_METAL__) -+template -+__hostdev__ inline T Sign(__local__ const T &x) { return ((T(0) < x)?T(1):T(0)) - ((x < T(0))?T(1):T(0)); } -+#endif - - template --__hostdev__ inline int MinIndex(const Vec3T& v) -+__hostdev__ inline int MinIndex(__global__ const Vec3T& v) - { - #if 0 - static const int hashTable[8] = {2, 1, 9, 1, 2, 9, 0, 0}; //9 are dummy values -@@ -930,8 +1021,27 @@ __hostdev__ inline int MinIndex(const Vec3T& v) - #endif - } - -+#if defined(__KERNEL_METAL__) - template --__hostdev__ inline int MaxIndex(const Vec3T& v) -+__hostdev__ inline int MinIndex(__local__ const Vec3T& v) -+{ -+#if 0 -+ static const int hashTable[8] = {2, 1, 9, 1, 2, 9, 0, 0}; //9 are dummy values -+ const int hashKey = ((v[0] < v[1]) << 2) + ((v[0] < v[2]) << 1) + (v[1] < v[2]); // ?*4+?*2+?*1 -+ return hashTable[hashKey]; -+#else -+ if (v[0] < v[1] && v[0] < v[2]) -+ return 0; -+ if (v[1] < v[2]) -+ return 1; -+ else -+ return 2; -+#endif -+} -+#endif -+ -+template -+__hostdev__ inline int MaxIndex(__global__ const Vec3T& v) - { - #if 0 - static const int hashTable[8] = {2, 1, 9, 1, 2, 9, 0, 0}; //9 are dummy values -@@ -947,6 +1057,25 @@ __hostdev__ inline int MaxIndex(const Vec3T& v) - #endif - } - -+#if defined(__KERNEL_METAL__) -+template -+__hostdev__ inline int MaxIndex(__local__ const Vec3T& v) -+{ -+#if 0 -+ static const int hashTable[8] = {2, 1, 9, 1, 2, 9, 0, 0}; //9 are dummy values -+ const int hashKey = ((v[0] > v[1]) << 2) + ((v[0] > v[2]) << 1) + (v[1] > v[2]); // ?*4+?*2+?*1 -+ return hashTable[hashKey]; -+#else -+ if (v[0] > v[1] && v[0] > v[2]) -+ return 0; -+ if (v[1] > v[2]) -+ return 1; -+ else -+ return 2; -+#endif -+} -+#endif -+ - /// @brief round up byteSize to the nearest wordSize, e.g. to align to machine word: AlignUp -- __hostdev__ Coord& operator=(const CoordT &other) -+ __hostdev__ __global__ Coord& operator=(__global__ const CoordT &other) __global__ - { - static_assert(sizeof(Coord) == sizeof(CoordT), "Mis-matched sizeof"); - mVec[0] = other[0]; -@@ -1025,6 +1160,17 @@ public: - mVec[2] = other[2]; - return *this; - } -+#if defined(__KERNEL_METAL__) -+ template -+ __hostdev__ __local__ Coord& operator=(__local__ const CoordT &other) __local__ -+ { -+ static_assert(sizeof(Coord) == sizeof(CoordT), "Mis-matched sizeof"); -+ mVec[0] = other[0]; -+ mVec[1] = other[1]; -+ mVec[2] = other[2]; -+ return *this; -+ } -+#endif - - /// @brief Return a new instance with coordinates masked by the given unsigned integer. - __hostdev__ Coord operator&(IndexType n) const { return Coord(mVec[0] & n, mVec[1] & n, mVec[2] & n); } -@@ -1036,52 +1182,52 @@ public: - __hostdev__ Coord operator>>(IndexType n) const { return Coord(mVec[0] >> n, mVec[1] >> n, mVec[2] >> n); } - - /// @brief Return true if this Coord is lexicographically less than the given Coord. -- __hostdev__ bool operator<(const Coord& rhs) const -+ __hostdev__ bool operator<(__global__ const Coord& rhs) const - { - return mVec[0] < rhs[0] ? true : mVec[0] > rhs[0] ? false : mVec[1] < rhs[1] ? true : mVec[1] > rhs[1] ? false : mVec[2] < rhs[2] ? true : false; - } - - // @brief Return true if the Coord components are identical. -- __hostdev__ bool operator==(const Coord& rhs) const { return mVec[0] == rhs[0] && mVec[1] == rhs[1] && mVec[2] == rhs[2]; } -- __hostdev__ bool operator!=(const Coord& rhs) const { return mVec[0] != rhs[0] || mVec[1] != rhs[1] || mVec[2] != rhs[2]; } -- __hostdev__ Coord& operator&=(int n) -+ __hostdev__ bool operator==(__global__ const Coord& rhs) const { return mVec[0] == rhs[0] && mVec[1] == rhs[1] && mVec[2] == rhs[2]; } -+ __hostdev__ bool operator!=(__global__ const Coord& rhs) const { return mVec[0] != rhs[0] || mVec[1] != rhs[1] || mVec[2] != rhs[2]; } -+ __hostdev__ __global__ Coord& operator&=(int n) __global__ - { - mVec[0] &= n; - mVec[1] &= n; - mVec[2] &= n; - return *this; - } -- __hostdev__ Coord& operator<<=(uint32_t n) -+ __hostdev__ __global__ Coord& operator<<=(uint32_t n) __global__ - { - mVec[0] <<= n; - mVec[1] <<= n; - mVec[2] <<= n; - return *this; - } -- __hostdev__ Coord& operator>>=(uint32_t n) -+ __hostdev__ __global__ Coord& operator>>=(uint32_t n) __global__ - { - mVec[0] >>= n; - mVec[1] >>= n; - mVec[2] >>= n; - return *this; - } -- __hostdev__ Coord& operator+=(int n) -+ __hostdev__ __global__ Coord& operator+=(int n) __global__ - { - mVec[0] += n; - mVec[1] += n; - mVec[2] += n; - return *this; - } -- __hostdev__ Coord operator+(const Coord& rhs) const { return Coord(mVec[0] + rhs[0], mVec[1] + rhs[1], mVec[2] + rhs[2]); } -- __hostdev__ Coord operator-(const Coord& rhs) const { return Coord(mVec[0] - rhs[0], mVec[1] - rhs[1], mVec[2] - rhs[2]); } -- __hostdev__ Coord& operator+=(const Coord& rhs) -+ __hostdev__ Coord operator+(__global__ const Coord& rhs) const { return Coord(mVec[0] + rhs[0], mVec[1] + rhs[1], mVec[2] + rhs[2]); } -+ __hostdev__ Coord operator-(__global__ const Coord& rhs) const { return Coord(mVec[0] - rhs[0], mVec[1] - rhs[1], mVec[2] - rhs[2]); } -+ __hostdev__ __global__ Coord& operator+=(__global__ const Coord& rhs) __global__ - { - mVec[0] += rhs[0]; - mVec[1] += rhs[1]; - mVec[2] += rhs[2]; - return *this; - } -- __hostdev__ Coord& operator-=(const Coord& rhs) -+ __hostdev__ __global__ Coord& operator-=(__global__ const Coord& rhs) __global__ - { - mVec[0] -= rhs[0]; - mVec[1] -= rhs[1]; -@@ -1090,7 +1236,7 @@ public: - } - - /// @brief Perform a component-wise minimum with the other Coord. -- __hostdev__ Coord& minComponent(const Coord& other) -+ __hostdev__ __global__ Coord& minComponent(__global__ const Coord& other) __global__ - { - if (other[0] < mVec[0]) - mVec[0] = other[0]; -@@ -1102,7 +1248,7 @@ public: - } - - /// @brief Perform a component-wise maximum with the other Coord. -- __hostdev__ Coord& maxComponent(const Coord& other) -+ __hostdev__ __global__ Coord& maxComponent(__global__ const Coord& other) __global__ - { - if (other[0] > mVec[0]) - mVec[0] = other[0]; -@@ -1113,16 +1259,16 @@ public: - return *this; - } - -- __hostdev__ Coord offsetBy(ValueType dx, ValueType dy, ValueType dz) const -+ __hostdev__ Coord offsetBy(ValueType dx, ValueType dy, ValueType dz) const __global__ - { - return Coord(mVec[0] + dx, mVec[1] + dy, mVec[2] + dz); - } - -- __hostdev__ Coord offsetBy(ValueType n) const { return this->offsetBy(n, n, n); } -+ __hostdev__ Coord offsetBy(ValueType n) const __global__ { return this->offsetBy(n, n, n); } - - /// Return true if any of the components of @a a are smaller than the - /// corresponding components of @a b. -- __hostdev__ static inline bool lessThan(const Coord& a, const Coord& b) -+ __hostdev__ static inline bool lessThan(__global__ const Coord& a, __global__ const Coord& b) - { - return (a[0] < b[0] || a[1] < b[1] || a[2] < b[2]); - } -@@ -1130,7 +1276,13 @@ public: - /// @brief Return the largest integer coordinates that are not greater - /// than @a xyz (node centered conversion). - template -- __hostdev__ static Coord Floor(const Vec3T& xyz) { return Coord(nanovdb::Floor(xyz[0]), nanovdb::Floor(xyz[1]), nanovdb::Floor(xyz[2])); } -+ __hostdev__ static Coord Floor(__global__ const Vec3T& xyz) { return Coord(nanovdb::Floor(xyz[0]), nanovdb::Floor(xyz[1]), nanovdb::Floor(xyz[2])); } -+#if defined __KERNEL_METAL__ -+ /// @brief Return the largest integer coordinates that are not greater -+ /// than @a xyz (node centered conversion). -+ template -+ __hostdev__ static Coord Floor(__local__ const Vec3T& xyz) { return Coord(nanovdb::Floor(xyz[0]), nanovdb::Floor(xyz[1]), nanovdb::Floor(xyz[2])); } -+#endif - - /// @brief Return a hash key derived from the existing coordinates. - /// @details For details on this hash function please see the VDB paper. -@@ -1159,7 +1311,7 @@ class Vec3 - T mVec[3]; - - public: -- static const int SIZE = 3; -+ static __constant__ const int SIZE = 3; - using ValueType = T; - Vec3() = default; - __hostdev__ explicit Vec3(T x) -@@ -1171,30 +1323,36 @@ public: - { - } - template -- __hostdev__ explicit Vec3(const Vec3& v) -+ __hostdev__ explicit Vec3(__global__ const Vec3& v) - : mVec{T(v[0]), T(v[1]), T(v[2])} - { - } -- __hostdev__ explicit Vec3(const Coord& ijk) -+ __hostdev__ explicit Vec3(__global__ const Coord& ijk) - : mVec{T(ijk[0]), T(ijk[1]), T(ijk[2])} - { - } -- __hostdev__ bool operator==(const Vec3& rhs) const { return mVec[0] == rhs[0] && mVec[1] == rhs[1] && mVec[2] == rhs[2]; } -- __hostdev__ bool operator!=(const Vec3& rhs) const { return mVec[0] != rhs[0] || mVec[1] != rhs[1] || mVec[2] != rhs[2]; } -+ __hostdev__ bool operator==(__global__ const Vec3& rhs) const { return mVec[0] == rhs[0] && mVec[1] == rhs[1] && mVec[2] == rhs[2]; } -+ __hostdev__ bool operator!=(__global__ const Vec3& rhs) const { return mVec[0] != rhs[0] || mVec[1] != rhs[1] || mVec[2] != rhs[2]; } - template -- __hostdev__ Vec3& operator=(const Vec3T& rhs) -+ __hostdev__ __global__ Vec3& operator=(__global__ const Vec3T& rhs) - { - mVec[0] = rhs[0]; - mVec[1] = rhs[1]; - mVec[2] = rhs[2]; - return *this; - } -- __hostdev__ const T& operator[](int i) const { return mVec[i]; } -- __hostdev__ T& operator[](int i) { return mVec[i]; } -+ __hostdev__ __global__ const T& operator[](int i) const __global__ { return mVec[i]; } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ __local__ const T& operator[](int i) const __local__ { return mVec[i]; } -+#endif -+ __hostdev__ __global__ T& operator[](int i) __global__ { return mVec[i]; } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ __local__ T& operator[](int i) __local__ { return mVec[i]; } -+#endif - template -- __hostdev__ T dot(const Vec3T& v) const { return mVec[0] * v[0] + mVec[1] * v[1] + mVec[2] * v[2]; } -+ __hostdev__ T dot(__global__ const Vec3T& v) const { return mVec[0] * v[0] + mVec[1] * v[1] + mVec[2] * v[2]; } - template -- __hostdev__ Vec3 cross(const Vec3T& v) const -+ __hostdev__ Vec3 cross(__global__ const Vec3T& v) const - { - return Vec3(mVec[1] * v[2] - mVec[2] * v[1], - mVec[2] * v[0] - mVec[0] * v[2], -@@ -1206,37 +1364,62 @@ public: - } - __hostdev__ T length() const { return Sqrt(this->lengthSqr()); } - __hostdev__ Vec3 operator-() const { return Vec3(-mVec[0], -mVec[1], -mVec[2]); } -- __hostdev__ Vec3 operator*(const Vec3& v) const { return Vec3(mVec[0] * v[0], mVec[1] * v[1], mVec[2] * v[2]); } -- __hostdev__ Vec3 operator/(const Vec3& v) const { return Vec3(mVec[0] / v[0], mVec[1] / v[1], mVec[2] / v[2]); } -- __hostdev__ Vec3 operator+(const Vec3& v) const { return Vec3(mVec[0] + v[0], mVec[1] + v[1], mVec[2] + v[2]); } -- __hostdev__ Vec3 operator-(const Vec3& v) const { return Vec3(mVec[0] - v[0], mVec[1] - v[1], mVec[2] - v[2]); } -- __hostdev__ Vec3 operator*(const T& s) const { return Vec3(s * mVec[0], s * mVec[1], s * mVec[2]); } -- __hostdev__ Vec3 operator/(const T& s) const { return (T(1) / s) * (*this); } -- __hostdev__ Vec3& operator+=(const Vec3& v) -+ __hostdev__ Vec3 operator*(__global__ const Vec3& v) const { return Vec3(mVec[0] * v[0], mVec[1] * v[1], mVec[2] * v[2]); } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ Vec3 operator*(__local__ const Vec3& v) const { return Vec3(mVec[0] * v[0], mVec[1] * v[1], mVec[2] * v[2]); } -+#endif -+ __hostdev__ Vec3 operator/(__global__ const Vec3& v) const { return Vec3(mVec[0] / v[0], mVec[1] / v[1], mVec[2] / v[2]); } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ Vec3 operator/(__local__ const Vec3& v) const { return Vec3(mVec[0] / v[0], mVec[1] / v[1], mVec[2] / v[2]); } -+#endif -+ __hostdev__ Vec3 operator+(__global__ const Vec3& v) const { return Vec3(mVec[0] + v[0], mVec[1] + v[1], mVec[2] + v[2]); } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ Vec3 operator-(__local__ const Vec3& v) const { return Vec3(mVec[0] - v[0], mVec[1] - v[1], mVec[2] - v[2]); } -+ __hostdev__ Vec3 operator+(__local__ const Vec3& v) const { return Vec3(mVec[0] + v[0], mVec[1] + v[1], mVec[2] + v[2]); } -+#endif -+ __hostdev__ Vec3 operator-(__global__ const Vec3& v) const { return Vec3(mVec[0] - v[0], mVec[1] - v[1], mVec[2] - v[2]); } -+ __hostdev__ Vec3 operator*(__global__ const T& s) const { return Vec3(s * mVec[0], s * mVec[1], s * mVec[2]); } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ Vec3 operator*(__local__ const T& s) const { return Vec3(s * mVec[0], s * mVec[1], s * mVec[2]); } -+#endif -+ __hostdev__ Vec3 operator/(__global__ const T& s) const { return (T(1) / s) * (*this); } -+ __hostdev__ __global__ Vec3& operator+=(__global__ const Vec3& v) - { - mVec[0] += v[0]; - mVec[1] += v[1]; - mVec[2] += v[2]; - return *this; - } -- __hostdev__ Vec3& operator-=(const Vec3& v) -+ __hostdev__ __global__ Vec3& operator-=(__global__ const Vec3& v) - { - mVec[0] -= v[0]; - mVec[1] -= v[1]; - mVec[2] -= v[2]; - return *this; - } -- __hostdev__ Vec3& operator*=(const T& s) -+ __hostdev__ __global__ Vec3& operator*=(__global__ const T& s) - { - mVec[0] *= s; - mVec[1] *= s; - mVec[2] *= s; - return *this; - } -- __hostdev__ Vec3& operator/=(const T& s) { return (*this) *= T(1) / s; } -- __hostdev__ Vec3& normalize() { return (*this) /= this->length(); } -+#if defined __KERNEL_METAL__ -+ __hostdev__ __local__ Vec3& operator*=(__local__ const T& s) -+ { -+ mVec[0] *= s; -+ mVec[1] *= s; -+ mVec[2] *= s; -+ return *this; -+ } -+#endif -+ __hostdev__ __global__ Vec3& operator/=(__global__ const T& s) { return (*this) *= T(1) / s; } -+#if defined __KERNEL_METAL__ -+ __hostdev__ __local__ Vec3& operator/=(__local__ const T& s) { return (*this) *= T(1) / s; } -+#endif -+ __hostdev__ __global__ Vec3& normalize() { return (*this) /= this->length(); } - /// @brief Perform a component-wise minimum with the other Coord. -- __hostdev__ Vec3& minComponent(const Vec3& other) -+ __hostdev__ __global__ Vec3& minComponent(__global__ const Vec3& other) - { - if (other[0] < mVec[0]) - mVec[0] = other[0]; -@@ -1248,7 +1431,7 @@ public: - } - - /// @brief Perform a component-wise maximum with the other Coord. -- __hostdev__ Vec3& maxComponent(const Vec3& other) -+ __hostdev__ __global__ Vec3& maxComponent(__global__ const Vec3& other) - { - if (other[0] > mVec[0]) - mVec[0] = other[0]; -@@ -1274,15 +1457,29 @@ public: - }; // Vec3 - - template --__hostdev__ inline Vec3 operator*(T1 scalar, const Vec3& vec) -+__hostdev__ inline Vec3 operator*(T1 scalar, __global__ const Vec3& vec) - { - return Vec3(scalar * vec[0], scalar * vec[1], scalar * vec[2]); - } -+#if defined(__KERNEL_METAL__) - template --__hostdev__ inline Vec3 operator/(T1 scalar, const Vec3& vec) -+__hostdev__ inline Vec3 operator*(T1 scalar, __local__ const Vec3& vec) -+{ -+ return Vec3(scalar * vec[0], scalar * vec[1], scalar * vec[2]); -+} -+#endif -+template -+__hostdev__ inline Vec3 operator/(T1 scalar, __global__ const Vec3& vec) - { - return Vec3(scalar / vec[0], scalar / vec[1], scalar / vec[2]); - } -+#if defined(__KERNEL_METAL__) -+template -+__hostdev__ inline Vec3 operator/(T1 scalar, __local__ const Vec3& vec) -+{ -+ return Vec3(scalar / vec[0], scalar / vec[1], scalar / vec[2]); -+} -+#endif - - using Vec3R = Vec3; - using Vec3d = Vec3; -@@ -1304,7 +1501,7 @@ class Vec4 - T mVec[4]; - - public: -- static const int SIZE = 4; -+ static __constant__ const int SIZE = 4; - using ValueType = T; - Vec4() = default; - __hostdev__ explicit Vec4(T x) -@@ -1316,14 +1513,14 @@ public: - { - } - template -- __hostdev__ explicit Vec4(const Vec4& v) -+ __hostdev__ explicit Vec4(__global__ const Vec4& v) - : mVec{T(v[0]), T(v[1]), T(v[2]), T(v[3])} - { - } -- __hostdev__ bool operator==(const Vec4& rhs) const { return mVec[0] == rhs[0] && mVec[1] == rhs[1] && mVec[2] == rhs[2] && mVec[3] == rhs[3]; } -- __hostdev__ bool operator!=(const Vec4& rhs) const { return mVec[0] != rhs[0] || mVec[1] != rhs[1] || mVec[2] != rhs[2] || mVec[3] != rhs[3]; } -+ __hostdev__ bool operator==(__global__ const Vec4& rhs) const { return mVec[0] == rhs[0] && mVec[1] == rhs[1] && mVec[2] == rhs[2] && mVec[3] == rhs[3]; } -+ __hostdev__ bool operator!=(__global__ const Vec4& rhs) const { return mVec[0] != rhs[0] || mVec[1] != rhs[1] || mVec[2] != rhs[2] || mVec[3] != rhs[3]; } - template -- __hostdev__ Vec4& operator=(const Vec4T& rhs) -+ __hostdev__ __global__ Vec4& operator=(__global__ const Vec4T& rhs) - { - mVec[0] = rhs[0]; - mVec[1] = rhs[1]; -@@ -1331,23 +1528,23 @@ public: - mVec[3] = rhs[3]; - return *this; - } -- __hostdev__ const T& operator[](int i) const { return mVec[i]; } -- __hostdev__ T& operator[](int i) { return mVec[i]; } -+ __hostdev__ __global__ const T& operator[](int i) const { return mVec[i]; } -+ __hostdev__ __global__ T& operator[](int i) { return mVec[i]; } - template -- __hostdev__ T dot(const Vec4T& v) const { return mVec[0] * v[0] + mVec[1] * v[1] + mVec[2] * v[2] + mVec[3] * v[3]; } -+ __hostdev__ T dot(__global__ const Vec4T& v) const { return mVec[0] * v[0] + mVec[1] * v[1] + mVec[2] * v[2] + mVec[3] * v[3]; } - __hostdev__ T lengthSqr() const - { - return mVec[0] * mVec[0] + mVec[1] * mVec[1] + mVec[2] * mVec[2] + mVec[3] * mVec[3]; // 7 flops - } - __hostdev__ T length() const { return Sqrt(this->lengthSqr()); } - __hostdev__ Vec4 operator-() const { return Vec4(-mVec[0], -mVec[1], -mVec[2], -mVec[3]); } -- __hostdev__ Vec4 operator*(const Vec4& v) const { return Vec4(mVec[0] * v[0], mVec[1] * v[1], mVec[2] * v[2], mVec[3] * v[3]); } -- __hostdev__ Vec4 operator/(const Vec4& v) const { return Vec4(mVec[0] / v[0], mVec[1] / v[1], mVec[2] / v[2], mVec[3] / v[3]); } -- __hostdev__ Vec4 operator+(const Vec4& v) const { return Vec4(mVec[0] + v[0], mVec[1] + v[1], mVec[2] + v[2], mVec[3] + v[3]); } -- __hostdev__ Vec4 operator-(const Vec4& v) const { return Vec4(mVec[0] - v[0], mVec[1] - v[1], mVec[2] - v[2], mVec[3] - v[3]); } -- __hostdev__ Vec4 operator*(const T& s) const { return Vec4(s * mVec[0], s * mVec[1], s * mVec[2], s * mVec[3]); } -- __hostdev__ Vec4 operator/(const T& s) const { return (T(1) / s) * (*this); } -- __hostdev__ Vec4& operator+=(const Vec4& v) -+ __hostdev__ Vec4 operator*(__global__ const Vec4& v) const { return Vec4(mVec[0] * v[0], mVec[1] * v[1], mVec[2] * v[2], mVec[3] * v[3]); } -+ __hostdev__ Vec4 operator/(__global__ const Vec4& v) const { return Vec4(mVec[0] / v[0], mVec[1] / v[1], mVec[2] / v[2], mVec[3] / v[3]); } -+ __hostdev__ Vec4 operator+(__global__ const Vec4& v) const { return Vec4(mVec[0] + v[0], mVec[1] + v[1], mVec[2] + v[2], mVec[3] + v[3]); } -+ __hostdev__ Vec4 operator-(__global__ const Vec4& v) const { return Vec4(mVec[0] - v[0], mVec[1] - v[1], mVec[2] - v[2], mVec[3] - v[3]); } -+ __hostdev__ Vec4 operator*(__global__ const T& s) const { return Vec4(s * mVec[0], s * mVec[1], s * mVec[2], s * mVec[3]); } -+ __hostdev__ Vec4 operator/(__global__ const T& s) const { return (T(1) / s) * (*this); } -+ __hostdev__ __global__ Vec4& operator+=(__global__ const Vec4& v) - { - mVec[0] += v[0]; - mVec[1] += v[1]; -@@ -1355,7 +1552,7 @@ public: - mVec[3] += v[3]; - return *this; - } -- __hostdev__ Vec4& operator-=(const Vec4& v) -+ __hostdev__ __global__ Vec4& operator-=(__global__ const Vec4& v) - { - mVec[0] -= v[0]; - mVec[1] -= v[1]; -@@ -1363,7 +1560,7 @@ public: - mVec[3] -= v[3]; - return *this; - } -- __hostdev__ Vec4& operator*=(const T& s) -+ __hostdev__ __global__ Vec4& operator*=(__global__ const T& s) - { - mVec[0] *= s; - mVec[1] *= s; -@@ -1371,10 +1568,10 @@ public: - mVec[3] *= s; - return *this; - } -- __hostdev__ Vec4& operator/=(const T& s) { return (*this) *= T(1) / s; } -- __hostdev__ Vec4& normalize() { return (*this) /= this->length(); } -+ __hostdev__ __global__ Vec4& operator/=(__global__ const T& s) { return (*this) *= T(1) / s; } -+ __hostdev__ __global__ Vec4& normalize() { return (*this) /= this->length(); } - /// @brief Perform a component-wise minimum with the other Coord. -- __hostdev__ Vec4& minComponent(const Vec4& other) -+ __hostdev__ __global__ Vec4& minComponent(__global__ const Vec4& other) - { - if (other[0] < mVec[0]) - mVec[0] = other[0]; -@@ -1388,7 +1585,7 @@ public: - } - - /// @brief Perform a component-wise maximum with the other Coord. -- __hostdev__ Vec4& maxComponent(const Vec4& other) -+ __hostdev__ __global__ Vec4& maxComponent(__global__ const Vec4& other) - { - if (other[0] > mVec[0]) - mVec[0] = other[0]; -@@ -1403,12 +1600,12 @@ public: - }; // Vec4 - - template --__hostdev__ inline Vec4 operator*(T1 scalar, const Vec4& vec) -+__hostdev__ inline Vec4 operator*(T1 scalar, __global__ const Vec4& vec) - { - return Vec4(scalar * vec[0], scalar * vec[1], scalar * vec[2], scalar * vec[3]); - } - template --__hostdev__ inline Vec4 operator/(T1 scalar, const Vec3& vec) -+__hostdev__ inline Vec4 operator/(T1 scalar, __global__ const Vec3& vec) - { - return Vec4(scalar / vec[0], scalar / vec[1], scalar / vec[2], scalar / vec[3]); - } -@@ -1428,23 +1625,23 @@ struct TensorTraits; - template - struct TensorTraits - { -- static const int Rank = 0; // i.e. scalar -- static const bool IsScalar = true; -- static const bool IsVector = false; -- static const int Size = 1; -+ static __constant__ const int Rank = 0; // i.e. scalar -+ static __constant__ const bool IsScalar = true; -+ static __constant__ const bool IsVector = false; -+ static __constant__ const int Size = 1; - using ElementType = T; -- static T scalar(const T& s) { return s; } -+ static T scalar(__global__ const T& s) { return s; } - }; - - template - struct TensorTraits - { -- static const int Rank = 1; // i.e. vector -- static const bool IsScalar = false; -- static const bool IsVector = true; -- static const int Size = T::SIZE; -+ static __constant__ const int Rank = 1; // i.e. vector -+ static __constant__ const bool IsScalar = false; -+ static __constant__ const bool IsVector = true; -+ static __constant__ const int Size = T::SIZE; - using ElementType = typename T::ValueType; -- static ElementType scalar(const T& v) { return v.length(); } -+ static ElementType scalar(__global__ const T& v) { return v.length(); } - }; - - // ----------------------------> FloatTraits <-------------------------------------- -@@ -1528,71 +1725,80 @@ __hostdev__ inline GridType mapToGridType() - // ----------------------------> matMult <-------------------------------------- - - template --__hostdev__ inline Vec3T matMult(const float* mat, const Vec3T& xyz) -+__hostdev__ inline Vec3T matMult(__global__ const float* mat, __global__ const Vec3T& xyz) - { - return Vec3T(fmaf(xyz[0], mat[0], fmaf(xyz[1], mat[1], xyz[2] * mat[2])), - fmaf(xyz[0], mat[3], fmaf(xyz[1], mat[4], xyz[2] * mat[5])), - fmaf(xyz[0], mat[6], fmaf(xyz[1], mat[7], xyz[2] * mat[8]))); // 6 fmaf + 3 mult = 9 flops - } -- -+#if defined(__KERNEL_METAL__) - template --__hostdev__ inline Vec3T matMult(const double* mat, const Vec3T& xyz) -+__hostdev__ inline Vec3T matMult(__global__ const float* mat, __local__ const Vec3T& xyz) -+{ -+ return Vec3T(fmaf(xyz[0], mat[0], fmaf(xyz[1], mat[1], xyz[2] * mat[2])), -+ fmaf(xyz[0], mat[3], fmaf(xyz[1], mat[4], xyz[2] * mat[5])), -+ fmaf(xyz[0], mat[6], fmaf(xyz[1], mat[7], xyz[2] * mat[8]))); // 6 fmaf + 3 mult = 9 flops -+} -+#endif -+#ifndef __KERNEL_METAL__ -+template -+__hostdev__ inline Vec3T matMult(__global__ const double* mat, __global__ const Vec3T& xyz) - { - return Vec3T(fma(static_cast(xyz[0]), mat[0], fma(static_cast(xyz[1]), mat[1], static_cast(xyz[2]) * mat[2])), - fma(static_cast(xyz[0]), mat[3], fma(static_cast(xyz[1]), mat[4], static_cast(xyz[2]) * mat[5])), - fma(static_cast(xyz[0]), mat[6], fma(static_cast(xyz[1]), mat[7], static_cast(xyz[2]) * mat[8]))); // 6 fmaf + 3 mult = 9 flops - } -- -+#endif - template --__hostdev__ inline Vec3T matMult(const float* mat, const float* vec, const Vec3T& xyz) -+__hostdev__ inline Vec3T matMult(__global__ const float* mat, __global__ const float* vec, __global__ const Vec3T& xyz) - { - return Vec3T(fmaf(xyz[0], mat[0], fmaf(xyz[1], mat[1], fmaf(xyz[2], mat[2], vec[0]))), - fmaf(xyz[0], mat[3], fmaf(xyz[1], mat[4], fmaf(xyz[2], mat[5], vec[1]))), - fmaf(xyz[0], mat[6], fmaf(xyz[1], mat[7], fmaf(xyz[2], mat[8], vec[2])))); // 9 fmaf = 9 flops - } -- -+#ifndef __KERNEL_METAL__ - template --__hostdev__ inline Vec3T matMult(const double* mat, const double* vec, const Vec3T& xyz) -+__hostdev__ inline Vec3T matMult(__global__ const double* mat, __global__ const double* vec, __global__ const Vec3T& xyz) - { - return Vec3T(fma(static_cast(xyz[0]), mat[0], fma(static_cast(xyz[1]), mat[1], fma(static_cast(xyz[2]), mat[2], vec[0]))), - fma(static_cast(xyz[0]), mat[3], fma(static_cast(xyz[1]), mat[4], fma(static_cast(xyz[2]), mat[5], vec[1]))), - fma(static_cast(xyz[0]), mat[6], fma(static_cast(xyz[1]), mat[7], fma(static_cast(xyz[2]), mat[8], vec[2])))); // 9 fma = 9 flops - } -- -+#endif - // matMultT: Multiply with the transpose: - - template --__hostdev__ inline Vec3T matMultT(const float* mat, const Vec3T& xyz) -+__hostdev__ inline Vec3T matMultT(__global__ const float* mat, __global__ const Vec3T& xyz) - { - return Vec3T(fmaf(xyz[0], mat[0], fmaf(xyz[1], mat[3], xyz[2] * mat[6])), - fmaf(xyz[0], mat[1], fmaf(xyz[1], mat[4], xyz[2] * mat[7])), - fmaf(xyz[0], mat[2], fmaf(xyz[1], mat[5], xyz[2] * mat[8]))); // 6 fmaf + 3 mult = 9 flops - } -- -+#ifndef __KERNEL_METAL__ - template --__hostdev__ inline Vec3T matMultT(const double* mat, const Vec3T& xyz) -+__hostdev__ inline Vec3T matMultT(__global__ const double* mat, __global__ const Vec3T& xyz) - { - return Vec3T(fma(static_cast(xyz[0]), mat[0], fma(static_cast(xyz[1]), mat[3], static_cast(xyz[2]) * mat[6])), - fma(static_cast(xyz[0]), mat[1], fma(static_cast(xyz[1]), mat[4], static_cast(xyz[2]) * mat[7])), - fma(static_cast(xyz[0]), mat[2], fma(static_cast(xyz[1]), mat[5], static_cast(xyz[2]) * mat[8]))); // 6 fmaf + 3 mult = 9 flops - } -- -+#endif - template --__hostdev__ inline Vec3T matMultT(const float* mat, const float* vec, const Vec3T& xyz) -+__hostdev__ inline Vec3T matMultT(__global__ const float* mat, __global__ const float* vec, __global__ const Vec3T& xyz) - { - return Vec3T(fmaf(xyz[0], mat[0], fmaf(xyz[1], mat[3], fmaf(xyz[2], mat[6], vec[0]))), - fmaf(xyz[0], mat[1], fmaf(xyz[1], mat[4], fmaf(xyz[2], mat[7], vec[1]))), - fmaf(xyz[0], mat[2], fmaf(xyz[1], mat[5], fmaf(xyz[2], mat[8], vec[2])))); // 9 fmaf = 9 flops - } -- -+#ifndef __KERNEL_METAL__ - template --__hostdev__ inline Vec3T matMultT(const double* mat, const double* vec, const Vec3T& xyz) -+__hostdev__ inline Vec3T matMultT(__global__ const double* mat, __global__ const double* vec, __global__ const Vec3T& xyz) - { - return Vec3T(fma(static_cast(xyz[0]), mat[0], fma(static_cast(xyz[1]), mat[3], fma(static_cast(xyz[2]), mat[6], vec[0]))), - fma(static_cast(xyz[0]), mat[1], fma(static_cast(xyz[1]), mat[4], fma(static_cast(xyz[2]), mat[7], vec[1]))), - fma(static_cast(xyz[0]), mat[2], fma(static_cast(xyz[1]), mat[5], fma(static_cast(xyz[2]), mat[8], vec[2])))); // 9 fma = 9 flops - } -- -+#endif - // ----------------------------> BBox <------------------------------------- - - // Base-class for static polymorphism (cannot be constructed directly) -@@ -1600,22 +1806,34 @@ template - struct BaseBBox - { - Vec3T mCoord[2]; -- __hostdev__ bool operator==(const BaseBBox& rhs) const { return mCoord[0] == rhs.mCoord[0] && mCoord[1] == rhs.mCoord[1]; }; -- __hostdev__ bool operator!=(const BaseBBox& rhs) const { return mCoord[0] != rhs.mCoord[0] || mCoord[1] != rhs.mCoord[1]; }; -- __hostdev__ const Vec3T& operator[](int i) const { return mCoord[i]; } -- __hostdev__ Vec3T& operator[](int i) { return mCoord[i]; } -- __hostdev__ Vec3T& min() { return mCoord[0]; } -- __hostdev__ Vec3T& max() { return mCoord[1]; } -- __hostdev__ const Vec3T& min() const { return mCoord[0]; } -- __hostdev__ const Vec3T& max() const { return mCoord[1]; } -- __hostdev__ Coord& translate(const Vec3T& xyz) -+ __hostdev__ bool operator==(__global__ const BaseBBox& rhs) const __global__ { return mCoord[0] == rhs.mCoord[0] && mCoord[1] == rhs.mCoord[1]; }; -+ __hostdev__ bool operator!=(__global__ const BaseBBox& rhs) const __global__ { return mCoord[0] != rhs.mCoord[0] || mCoord[1] != rhs.mCoord[1]; }; -+ __hostdev__ __global__ const Vec3T& operator[](int i) const __global__ { return mCoord[i]; } -+ __hostdev__ __global__ Vec3T& operator[](int i) __global__ { return mCoord[i]; } -+ __hostdev__ __global__ Vec3T& min() __global__ { return mCoord[0]; } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ __global__ Vec3T& min() __local__ { return mCoord[0]; } -+#endif -+ __hostdev__ __global__ Vec3T& max() __global__ { return mCoord[1]; } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ __global__ Vec3T& max() __local__ { return mCoord[1]; } -+#endif -+ __hostdev__ __global__ const Vec3T& min() const __global__ { return mCoord[0]; } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ __local__ const Vec3T& min() const __local__ { return mCoord[0]; } -+#endif -+ __hostdev__ __global__ const Vec3T& max() const __global__ { return mCoord[1]; } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ __local__ const Vec3T& max() const __local__ { return mCoord[1]; } -+#endif -+ __hostdev__ __global__ Coord& translate(__global__ const Vec3T& xyz) __global__ - { - mCoord[0] += xyz; - mCoord[1] += xyz; - return *this; - } - // @brief Expand this bounding box to enclose point (i, j, k). -- __hostdev__ BaseBBox& expand(const Vec3T& xyz) -+ __hostdev__ __global__ BaseBBox& expand(__global__ const Vec3T& xyz) __global__ - { - mCoord[0].minComponent(xyz); - mCoord[1].maxComponent(xyz); -@@ -1623,7 +1841,7 @@ struct BaseBBox - } - - /// @brief Intersect this bounding box with the given bounding box. -- __hostdev__ BaseBBox& intersect(const BaseBBox& bbox) -+ __hostdev__ __global__ BaseBBox& intersect(__global__ const BaseBBox& bbox) __global__ - { - mCoord[0].maxComponent(bbox.min()); - mCoord[1].minComponent(bbox.max()); -@@ -1634,7 +1852,7 @@ struct BaseBBox - //{ - // return BaseBBox(mCoord[0].offsetBy(-padding),mCoord[1].offsetBy(padding)); - //} -- __hostdev__ bool isInside(const Vec3T& xyz) -+ __hostdev__ bool isInside(__global__ const Vec3T& xyz) - { - if (xyz[0] < mCoord[0][0] || xyz[1] < mCoord[0][1] || xyz[2] < mCoord[0][2]) - return false; -@@ -1642,10 +1860,20 @@ struct BaseBBox - return false; - return true; - } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ bool isInside(__local__ const Vec3T& xyz) -+ { -+ if (xyz[0] < mCoord[0][0] || xyz[1] < mCoord[0][1] || xyz[2] < mCoord[0][2]) -+ return false; -+ if (xyz[0] > mCoord[1][0] || xyz[1] > mCoord[1][1] || xyz[2] > mCoord[1][2]) -+ return false; -+ return true; -+ } -+#endif - - protected: - __hostdev__ BaseBBox() {} -- __hostdev__ BaseBBox(const Vec3T& min, const Vec3T& max) -+ __hostdev__ BaseBBox(__global__ const Vec3T& min, __global__ const Vec3T& max) - : mCoord{min, max} - { - } -@@ -1659,38 +1887,45 @@ struct BBox; - /// @note Min is inclusive and max is exclusive. If min = max the dimension of - /// the bounding box is zero and therefore it is also empty. - template --struct BBox : public BaseBBox -+struct BBox -+#if !defined(__KERNEL_METAL__) -+ : public BaseBBox -+#endif - { - using Vec3Type = Vec3T; - using ValueType = typename Vec3T::ValueType; - static_assert(is_floating_point::value, "Expected a floating point coordinate type"); - using BaseT = BaseBBox; -+#if defined(__KERNEL_METAL__) -+ BaseBBox mCoord; -+#else - using BaseT::mCoord; -+#endif -+ - __hostdev__ BBox() - : BaseT(Vec3T( Maximum::value()), - Vec3T(-Maximum::value())) - { - } -- __hostdev__ BBox(const Vec3T& min, const Vec3T& max) -+ __hostdev__ BBox(__global__ const Vec3T& min, __global__ const Vec3T& max) - : BaseT(min, max) - { - } -- __hostdev__ BBox(const Coord& min, const Coord& max) -+ __hostdev__ BBox(__global__ const Coord& min, __global__ const Coord& max) - : BaseT(Vec3T(ValueType(min[0]), ValueType(min[1]), ValueType(min[2])), - Vec3T(ValueType(max[0] + 1), ValueType(max[1] + 1), ValueType(max[2] + 1))) - { - } -- __hostdev__ static BBox createCube(const Coord& min, typename Coord::ValueType dim) -+ __hostdev__ static BBox createCube(__global__ const Coord& min, typename Coord::ValueType dim) - { - return BBox(min, min.offsetBy(dim)); - } -- -- __hostdev__ BBox(const BaseBBox& bbox) : BBox(bbox[0], bbox[1]) {} -+ __hostdev__ BBox(__global__ const BaseBBox& bbox) __global__ : BBox(bbox[0], bbox[1]) {} - __hostdev__ bool empty() const { return mCoord[0][0] >= mCoord[1][0] || - mCoord[0][1] >= mCoord[1][1] || - mCoord[0][2] >= mCoord[1][2]; } - __hostdev__ Vec3T dim() const { return this->empty() ? Vec3T(0) : this->max() - this->min(); } -- __hostdev__ bool isInside(const Vec3T& p) const -+ __hostdev__ bool isInside(__global__ const Vec3T& p) const - { - return p[0] > mCoord[0][0] && p[1] > mCoord[0][1] && p[2] > mCoord[0][2] && - p[0] < mCoord[1][0] && p[1] < mCoord[1][1] && p[2] < mCoord[1][2]; -@@ -1703,24 +1938,32 @@ struct BBox : public BaseBBox - /// @note Both min and max are INCLUDED in the bbox so dim = max - min + 1. So, - /// if min = max the bounding box contains exactly one point and dim = 1! - template --struct BBox : public BaseBBox -+struct BBox -+#if !defined(__KERNEL_METAL__) -+ : public BaseBBox -+#endif - { -+ - static_assert(is_same::value, "Expected \"int\" coordinate type"); - using BaseT = BaseBBox; -+#if defined(__KERNEL_METAL__) -+ BaseBBox mCoord; -+#else - using BaseT::mCoord; -+#endif - /// @brief Iterator over the domain covered by a BBox - /// @details z is the fastest-moving coordinate. - class Iterator - { -- const BBox& mBBox; -+ __global__ const BBox& mBBox; - CoordT mPos; - public: -- __hostdev__ Iterator(const BBox& b) -+ __hostdev__ Iterator(__global__ const BBox& b) - : mBBox(b) - , mPos(b.min()) - { - } -- __hostdev__ Iterator& operator++() -+ __hostdev__ __global__ Iterator& operator++() - { - if (mPos[2] < mBBox[1][2]) {// this is the most common case - ++mPos[2]; -@@ -1734,7 +1977,7 @@ struct BBox : public BaseBBox - } - return *this; - } -- __hostdev__ Iterator operator++(int) -+ __hostdev__ Iterator operator++(int) __global__ - { - auto tmp = *this; - ++(*this); -@@ -1742,20 +1985,20 @@ struct BBox : public BaseBBox - } - /// @brief Return @c true if the iterator still points to a valid coordinate. - __hostdev__ operator bool() const { return mPos[0] <= mBBox[1][0]; } -- __hostdev__ const CoordT& operator*() const { return mPos; } -+ __hostdev__ __global__ const CoordT& operator*() const { return mPos; } - }; // Iterator - __hostdev__ Iterator begin() const { return Iterator{*this}; } - __hostdev__ BBox() - : BaseT(CoordT::max(), CoordT::min()) - { - } -- __hostdev__ BBox(const CoordT& min, const CoordT& max) -+ __hostdev__ BBox(__global__ const CoordT& min, __global__ const CoordT& max) - : BaseT(min, max) - { - } - - template -- __hostdev__ BBox(BBox& other, const SplitT&) -+ __hostdev__ BBox(__global__ BBox& other, __global__ const SplitT&) - : BaseT(other.mCoord[0], other.mCoord[1]) - { - NANOVDB_ASSERT(this->is_divisible()); -@@ -1764,7 +2007,7 @@ struct BBox : public BaseBBox - other.mCoord[0][n] = mCoord[1][n] + 1; - } - -- __hostdev__ static BBox createCube(const CoordT& min, typename CoordT::ValueType dim) -+ __hostdev__ static BBox createCube(__global__ const CoordT& min, typename CoordT::ValueType dim) - { - return BBox(min, min.offsetBy(dim - 1)); - } -@@ -1778,15 +2021,23 @@ struct BBox : public BaseBBox - mCoord[0][2] > mCoord[1][2]; } - __hostdev__ CoordT dim() const { return this->empty() ? Coord(0) : this->max() - this->min() + Coord(1); } - __hostdev__ uint64_t volume() const { auto d = this->dim(); return uint64_t(d[0])*uint64_t(d[1])*uint64_t(d[2]); } -- __hostdev__ bool isInside(const CoordT& p) const { return !(CoordT::lessThan(p, this->min()) || CoordT::lessThan(this->max(), p)); } -- /// @brief Return @c true if the given bounding box is inside this bounding box. -- __hostdev__ bool isInside(const BBox& b) const -+ __hostdev__ bool isInside(__global__ const CoordT& p) const { return !(CoordT::lessThan(p, this->min()) || CoordT::lessThan(this->max(), p)); } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ bool isInside(__local__ const CoordT& p) const { return !(CoordT::lessThan(p, this->min()) || CoordT::lessThan(this->max(), p)); } -+#endif -+ __hostdev__ bool isInside(__global__ const BBox& b) const - { - return !(CoordT::lessThan(b.min(), this->min()) || CoordT::lessThan(this->max(), b.max())); - } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ bool isInside(__local__ const BBox& b) const -+ { -+ return !(CoordT::lessThan(b.min(), this->min()) || CoordT::lessThan(this->max(), b.max())); -+ } -+#endif - - /// @brief Return @c true if the given bounding box overlaps with this bounding box. -- __hostdev__ bool hasOverlap(const BBox& b) const -+ __hostdev__ bool hasOverlap(__global__ const BBox& b) const - { - return !(CoordT::lessThan(this->max(), b.min()) || CoordT::lessThan(b.max(), this->min())); - } -@@ -1826,6 +2077,8 @@ __hostdev__ static inline uint32_t FindLowestOn(uint32_t v) - return static_cast(index); - #elif (defined(__GNUC__) || defined(__clang__)) && defined(NANOVDB_USE_INTRINSICS) - return static_cast(__builtin_ctzl(v)); -+#elif defined(__KERNEL_METAL__) -+ return ctz(v); - #else - //#warning Using software implementation for FindLowestOn(uint32_t) - static const unsigned char DeBruijn[32] = { -@@ -1856,6 +2109,8 @@ __hostdev__ static inline uint32_t FindHighestOn(uint32_t v) - return static_cast(index); - #elif (defined(__GNUC__) || defined(__clang__)) && defined(NANOVDB_USE_INTRINSICS) - return sizeof(unsigned long) * 8 - 1 - __builtin_clzl(v); -+#elif defined(__KERNEL_METAL__) -+ return clz(v); - #else - //#warning Using software implementation for FindHighestOn(uint32_t) - static const unsigned char DeBruijn[32] = { -@@ -1884,6 +2139,8 @@ __hostdev__ static inline uint32_t FindLowestOn(uint64_t v) - return static_cast(index); - #elif (defined(__GNUC__) || defined(__clang__)) && defined(NANOVDB_USE_INTRINSICS) - return static_cast(__builtin_ctzll(v)); -+#elif defined(__KERNEL_METAL__) -+ return ctz(v); - #else - //#warning Using software implementation for FindLowestOn(uint64_t) - static const unsigned char DeBruijn[64] = { -@@ -1918,6 +2175,8 @@ __hostdev__ static inline uint32_t FindHighestOn(uint64_t v) - return static_cast(index); - #elif (defined(__GNUC__) || defined(__clang__)) && defined(NANOVDB_USE_INTRINSICS) - return sizeof(unsigned long) * 8 - 1 - __builtin_clzll(v); -+#elif defined(__KERNEL_METAL__) -+ return clz(v); - #else - const uint32_t* p = reinterpret_cast(&v); - return p[1] ? 32u + FindHighestOn(p[1]) : FindHighestOn(p[0]); -@@ -1955,8 +2214,8 @@ __hostdev__ inline uint32_t CountOn(uint64_t v) - template - class Mask - { -- static constexpr uint32_t SIZE = 1U << (3 * LOG2DIM); // Number of bits in mask -- static constexpr uint32_t WORD_COUNT = SIZE >> 6; // Number of 64 bit words -+ static __constant__ constexpr uint32_t SIZE = 1U << (3 * LOG2DIM); // Number of bits in mask -+ static __constant__ constexpr uint32_t WORD_COUNT = SIZE >> 6; // Number of 64 bit words - uint64_t mWords[WORD_COUNT]; - - public: -@@ -1973,7 +2232,7 @@ public: - __hostdev__ uint32_t countOn() const - { - uint32_t sum = 0, n = WORD_COUNT; -- for (const uint64_t* w = mWords; n--; ++w) -+ for (__global__ const uint64_t* w = mWords; n--; ++w) - sum += CountOn(*w); - return sum; - } -@@ -1982,7 +2241,7 @@ public: - inline __hostdev__ uint32_t countOn(uint32_t i) const - { - uint32_t n = i >> 6, sum = CountOn( mWords[n] & ((uint64_t(1) << (i & 63u))-1u) ); -- for (const uint64_t* w = mWords; n--; ++w) sum += CountOn(*w); -+ for (__global__ const uint64_t* w = mWords; n--; ++w) sum += CountOn(*w); - return sum; - } - -@@ -1990,13 +2249,21 @@ public: - class Iterator - { - public: -- __hostdev__ Iterator() : mPos(Mask::SIZE), mParent(nullptr){} -- __hostdev__ Iterator(uint32_t pos, const Mask* parent) : mPos(pos), mParent(parent){} -- Iterator& operator=(const Iterator&) = default; -+ __hostdev__ Iterator() -+ : mPos(Mask::SIZE) -+ , mParent(nullptr) -+ { -+ } -+ __hostdev__ Iterator(uint32_t pos, __global__ const Mask* parent) -+ : mPos(pos) -+ , mParent(parent) -+ { -+ } -+ __global__ Iterator& operator=(__global__ const Iterator&) = default; - __hostdev__ uint32_t operator*() const { return mPos; } - __hostdev__ uint32_t pos() const { return mPos; } - __hostdev__ operator bool() const { return mPos != Mask::SIZE; } -- __hostdev__ Iterator& operator++() -+ __hostdev__ __global__ Iterator& operator++() - { - mPos = mParent->findNext(mPos + 1); - return *this; -@@ -2010,7 +2277,7 @@ public: - - private: - uint32_t mPos; -- const Mask* mParent; -+ __global__ const Mask* mParent; - }; // Member class Iterator - - using OnIterator = Iterator; -@@ -2034,7 +2301,7 @@ public: - } - - /// @brief Copy constructor -- __hostdev__ Mask(const Mask& other) -+ __hostdev__ Mask(__global__ const Mask& other) - { - for (uint32_t i = 0; i < WORD_COUNT; ++i) - mWords[i] = other.mWords[i]; -@@ -2042,36 +2309,36 @@ public: - - /// @brief Return a const reference to the nth word of the bit mask, for a word of arbitrary size. - template -- __hostdev__ const WordT& getWord(int n) const -+ __hostdev__ __global__ const WordT& getWord(int n) const - { - NANOVDB_ASSERT(n * 8 * sizeof(WordT) < SIZE); -- return reinterpret_cast(mWords)[n]; -+ return reinterpret_cast<__global__ const WordT*>(mWords)[n]; - } - - /// @brief Return a reference to the nth word of the bit mask, for a word of arbitrary size. - template -- __hostdev__ WordT& getWord(int n) -+ __hostdev__ __global__ WordT& getWord(int n) - { - NANOVDB_ASSERT(n * 8 * sizeof(WordT) < SIZE); -- return reinterpret_cast(mWords)[n]; -+ return reinterpret_cast<__global__ WordT*>(mWords)[n]; - } - - /// @brief Assignment operator that works with openvdb::util::NodeMask - template -- __hostdev__ Mask& operator=(const MaskT& other) -+ __hostdev__ __global__ Mask& operator=(__global__ const MaskT& other) - { - static_assert(sizeof(Mask) == sizeof(MaskT), "Mismatching sizeof"); - static_assert(WORD_COUNT == MaskT::WORD_COUNT, "Mismatching word count"); - static_assert(LOG2DIM == MaskT::LOG2DIM, "Mismatching LOG2DIM"); -- auto *src = reinterpret_cast(&other); -- uint64_t *dst = mWords; -+ __global__ auto *src = reinterpret_cast<__global__ const uint64_t*>(&other); -+ __global__ uint64_t *dst = mWords; - for (uint32_t i = 0; i < WORD_COUNT; ++i) { - *dst++ = *src++; - } - return *this; - } - -- __hostdev__ bool operator==(const Mask& other) const -+ __hostdev__ bool operator==(__global__ const Mask& other) const - { - for (uint32_t i = 0; i < WORD_COUNT; ++i) { - if (mWords[i] != other.mWords[i]) return false; -@@ -2079,22 +2346,33 @@ public: - return true; - } - -- __hostdev__ bool operator!=(const Mask& other) const { return !((*this) == other); } -+ __hostdev__ bool operator!=(__global__ const Mask& other) const { return !((*this) == other); } - - /// @brief Return true if the given bit is set. -- __hostdev__ bool isOn(uint32_t n) const { return 0 != (mWords[n >> 6] & (uint64_t(1) << (n & 63))); } -- -+ __hostdev__ bool isOn(uint32_t n) const __global__ { return 0 != (mWords[n >> 6] & (uint64_t(1) << (n & 63))); } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ bool isOn(uint32_t n) const __local__ { return 0 != (mWords[n >> 6] & (uint64_t(1) << (n & 63))); } -+#endif - /// @brief Return true if the given bit is NOT set. -- __hostdev__ bool isOff(uint32_t n) const { return 0 == (mWords[n >> 6] & (uint64_t(1) << (n & 63))); } -+ __hostdev__ bool isOff(uint32_t n) const __global__ { return 0 == (mWords[n >> 6] & (uint64_t(1) << (n & 63))); } - - /// @brief Return true if all the bits are set in this Mask. -- __hostdev__ bool isOn() const -+ __hostdev__ bool isOn() const __global__ - { - for (uint32_t i = 0; i < WORD_COUNT; ++i) - if (mWords[i] != ~uint64_t(0)) - return false; - return true; - } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ bool isOn() const __local__ -+ { -+ for (uint32_t i = 0; i < WORD_COUNT; ++i) -+ if (mWords[i] != ~uint64_t(0)) -+ return false; -+ return true; -+ } -+#endif - - /// @brief Return true if none of the bits are set in this Mask. - __hostdev__ bool isOff() const -@@ -2115,7 +2393,7 @@ public: - __hostdev__ void set(uint32_t n, bool On) - { - #if 1 // switch between branchless -- auto &word = mWords[n >> 6]; -+ __global__ auto &word = mWords[n >> 6]; - n &= 63; - word &= ~(uint64_t(1) << n); - word |= uint64_t(On) << n; -@@ -2149,40 +2427,40 @@ public: - __hostdev__ void toggle() - { - uint32_t n = WORD_COUNT; -- for (auto* w = mWords; n--; ++w) -+ for (__global__ auto* w = mWords; n--; ++w) - *w = ~*w; - } - __hostdev__ void toggle(uint32_t n) { mWords[n >> 6] ^= uint64_t(1) << (n & 63); } - - /// @brief Bitwise intersection -- __hostdev__ Mask& operator&=(const Mask& other) -+ __hostdev__ __global__ Mask& operator&=(__global__ const Mask& other) - { -- uint64_t *w1 = mWords; -- const uint64_t *w2 = other.mWords; -+ __global__ uint64_t *w1 = mWords; -+ __global__ const uint64_t *w2 = other.mWords; - for (uint32_t n = WORD_COUNT; n--; ++w1, ++w2) *w1 &= *w2; - return *this; - } - /// @brief Bitwise union -- __hostdev__ Mask& operator|=(const Mask& other) -+ __hostdev__ __global__ Mask& operator|=(__global__ const Mask& other) - { -- uint64_t *w1 = mWords; -- const uint64_t *w2 = other.mWords; -+ __global__ uint64_t *w1 = mWords; -+ __global__ const uint64_t *w2 = other.mWords; - for (uint32_t n = WORD_COUNT; n--; ++w1, ++w2) *w1 |= *w2; - return *this; - } - /// @brief Bitwise difference -- __hostdev__ Mask& operator-=(const Mask& other) -+ __hostdev__ __global__ Mask& operator-=(__global__ const Mask& other) - { -- uint64_t *w1 = mWords; -- const uint64_t *w2 = other.mWords; -+ __global__ uint64_t *w1 = mWords; -+ __global__ const uint64_t *w2 = other.mWords; - for (uint32_t n = WORD_COUNT; n--; ++w1, ++w2) *w1 &= ~*w2; - return *this; - } - /// @brief Bitwise XOR -- __hostdev__ Mask& operator^=(const Mask& other) -+ __hostdev__ __global__ Mask& operator^=(__global__ const Mask& other) - { -- uint64_t *w1 = mWords; -- const uint64_t *w2 = other.mWords; -+ __global__ uint64_t *w1 = mWords; -+ __global__ const uint64_t *w2 = other.mWords; - for (uint32_t n = WORD_COUNT; n--; ++w1, ++w2) *w1 ^= *w2; - return *this; - } -@@ -2194,7 +2472,7 @@ private: - __hostdev__ uint32_t findFirst() const - { - uint32_t n = 0; -- const uint64_t* w = mWords; -+ __global__ const uint64_t* w = mWords; - for (; n -- __hostdev__ void set(const Mat3T& mat, const Mat3T& invMat, const Vec3T& translate, double taper); -+ __hostdev__ void set(__global__ const Mat3T& mat, __global__ const Mat3T& invMat, __global__ const Vec3T& translate, double taper) __global__; - - /// @brief Initialize the member data - /// @note The last (4th) row of invMat is actually ignored. - template -- __hostdev__ void set(const Mat4T& mat, const Mat4T& invMat, double taper) {this->set(mat, invMat, mat[3], taper);} -+ __hostdev__ void set(__global__ const Mat4T& mat, __global__ const Mat4T& invMat, double taper) __global__ {this->set(mat, invMat, mat[3], taper);} - - template -- __hostdev__ void set(double scale, const Vec3T &translation, double taper); -+ __hostdev__ void set(double scale, __global__ const Vec3T &translation, double taper) __global__; - - template -- __hostdev__ Vec3T applyMap(const Vec3T& xyz) const { return matMult(mMatD, mVecD, xyz); } -+ __hostdev__ Vec3T applyMap(__global__ const Vec3T& xyz) const { return matMult(mMatD, mVecD, xyz); } - template -- __hostdev__ Vec3T applyMapF(const Vec3T& xyz) const { return matMult(mMatF, mVecF, xyz); } -+ __hostdev__ Vec3T applyMapF(__global__ const Vec3T& xyz) const { return matMult(mMatF, mVecF, xyz); } - - template -- __hostdev__ Vec3T applyJacobian(const Vec3T& xyz) const { return matMult(mMatD, xyz); } -+ __hostdev__ Vec3T applyJacobian(__global__ const Vec3T& xyz) const { return matMult(mMatD, xyz); } - template -- __hostdev__ Vec3T applyJacobianF(const Vec3T& xyz) const { return matMult(mMatF, xyz); } -+ __hostdev__ Vec3T applyJacobianF(__global__ const Vec3T& xyz) const { return matMult(mMatF, xyz); } - - template -- __hostdev__ Vec3T applyInverseMap(const Vec3T& xyz) const -+ __hostdev__ Vec3T applyInverseMap(__global__ const Vec3T& xyz) const __global__ - { - return matMult(mInvMatD, Vec3T(xyz[0] - mVecD[0], xyz[1] - mVecD[1], xyz[2] - mVecD[2])); - } -+#if defined(__KERNEL_METAL__) - template -- __hostdev__ Vec3T applyInverseMapF(const Vec3T& xyz) const -+ __hostdev__ Vec3T applyInverseMap(__local__ const Vec3T& xyz) const __global__ -+ { -+ return matMult(mInvMatD, Vec3T(xyz[0] - mVecD[0], xyz[1] - mVecD[1], xyz[2] - mVecD[2])); -+ } -+#endif -+ template -+ __hostdev__ Vec3T applyInverseMapF(const __global__ Vec3T& xyz) const __global__ - { - return matMult(mInvMatF, Vec3T(xyz[0] - mVecF[0], xyz[1] - mVecF[1], xyz[2] - mVecF[2])); - } -+#if defined(__KERNEL_METAL__) -+ template -+ __hostdev__ Vec3T applyInverseMapF(const __local__ Vec3T& xyz) const __global__ -+ { -+ return matMult(mInvMatF, Vec3T(xyz[0] - mVecF[0], xyz[1] - mVecF[1], xyz[2] - mVecF[2])); -+ } -+#endif - - template -- __hostdev__ Vec3T applyInverseJacobian(const Vec3T& xyz) const { return matMult(mInvMatD, xyz); } -+ __hostdev__ Vec3T applyInverseJacobian(__global__ const Vec3T& xyz) const __global__ { return matMult(mInvMatD, xyz); } - template -- __hostdev__ Vec3T applyInverseJacobianF(const Vec3T& xyz) const { return matMult(mInvMatF, xyz); } -+ __hostdev__ Vec3T applyInverseJacobianF(__global__ const Vec3T& xyz) const __global__ { return matMult(mInvMatF, xyz); } -+#if defined(__KERNEL_METAL__) -+ template -+ __hostdev__ Vec3T applyInverseJacobianF(__local__ const Vec3T& xyz) const __global__ { return matMult(mInvMatF, xyz); } -+#endif - - template -- __hostdev__ Vec3T applyIJT(const Vec3T& xyz) const { return matMultT(mInvMatD, xyz); } -+ __hostdev__ Vec3T applyIJT(__global__ const Vec3T& xyz) const { return matMultT(mInvMatD, xyz); } - template -- __hostdev__ Vec3T applyIJTF(const Vec3T& xyz) const { return matMultT(mInvMatF, xyz); } -+ __hostdev__ Vec3T applyIJTF(__global__ const Vec3T& xyz) const { return matMultT(mInvMatF, xyz); } - }; // Map - - template --__hostdev__ inline void Map::set(const Mat3T& mat, const Mat3T& invMat, const Vec3T& translate, double taper) -+__hostdev__ inline void Map::set(__global__ const Mat3T& mat, __global__ const Mat3T& invMat, __global__ const Vec3T& translate, double taper) __global__ - { -- float *mf = mMatF, *vf = mVecF, *mif = mInvMatF; -- double *md = mMatD, *vd = mVecD, *mid = mInvMatD; -+ __global__ float * mf = mMatF, *vf = mVecF; -+ __global__ float* mif = mInvMatF; -+ __global__ double *md = mMatD, *vd = mVecD; -+ __global__ double* mid = mInvMatD; - mTaperF = static_cast(taper); - mTaperD = taper; - for (int i = 0; i < 3; ++i) { -@@ -2295,8 +2593,19 @@ __hostdev__ inline void Map::set(const Mat3T& mat, const Mat3T& invMat, const Ve - } - - template --__hostdev__ inline void Map::set(double dx, const Vec3T &trans, double taper) -+__hostdev__ inline void Map::set(double dx, __global__ const Vec3T &trans, double taper) __global__ - { -+#if defined __KERNEL_METAL__ -+ const float mat[3][3] = { -+ {(float)dx, 0.0, 0.0}, // row 0 -+ {0.0, (float)dx, 0.0}, // row 1 -+ {0.0, 0.0, (float)dx}, // row 2 -+ }, idx = 1.0/(float)dx, invMat[3][3] = { -+ {idx, 0.0, 0.0}, // row 0 -+ {0.0, idx, 0.0}, // row 1 -+ {0.0, 0.0, idx}, // row 2 -+ }; -+#else - const double mat[3][3] = { - {dx, 0.0, 0.0}, // row 0 - {0.0, dx, 0.0}, // row 1 -@@ -2306,6 +2615,7 @@ __hostdev__ inline void Map::set(double dx, const Vec3T &trans, double taper) - {0.0, idx, 0.0}, // row 1 - {0.0, 0.0, idx}, // row 2 - }; -+#endif - this->set(mat, invMat, trans, taper); - } - -@@ -2313,7 +2623,7 @@ __hostdev__ inline void Map::set(double dx, const Vec3T &trans, double taper) - - struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) GridBlindMetaData - { -- static const int MaxNameSize = 256;// due to NULL termination the maximum length is one less! -+ static __constant__ const int MaxNameSize = 256;// due to NULL termination the maximum length is one less! - int64_t mByteOffset; // byte offset to the blind data, relative to the GridData. - uint64_t mElementCount; // number of elements, e.g. point count - uint32_t mFlags; // flags -@@ -2328,10 +2638,10 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) GridBlindMetaData - return blindDataCount * sizeof(GridBlindMetaData); - } - -- __hostdev__ void setBlindData(void *ptr) { mByteOffset = PtrDiff(ptr, this); } -+ __hostdev__ void setBlindData(__global__ void *ptr) __global__ { mByteOffset = PtrDiff(ptr, this); } - - template -- __hostdev__ const T* getBlindData() const { return PtrAdd(this, mByteOffset); } -+ __hostdev__ __global__ const T* getBlindData() const { return PtrAdd(this, mByteOffset); } - - }; // GridBlindMetaData - -@@ -2430,7 +2740,7 @@ struct NodeTrait - /// @note No client code should (or can) interface with this struct so it can safely be ignored! - struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) GridData - {// sizeof(GridData) = 672B -- static const int MaxNameSize = 256;// due to NULL termination the maximum length is one less -+ static __constant__ const int MaxNameSize = 256;// due to NULL termination the maximum length is one less - uint64_t mMagic; // 8B (0) magic to validate it is valid grid data. - uint64_t mChecksum; // 8B (8). Checksum of grid buffer. - Version mVersion;// 4B (16) major, minor, and patch version numbers -@@ -2450,8 +2760,8 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) GridData - uint64_t mData1, mData2;// 2x8B (656) padding to 32 B alignment. mData1 is use for the total number of values indexed by an IndexGrid - - // Set and unset various bit flags -- __hostdev__ void setFlagsOff() { mFlags = uint32_t(0); } -- __hostdev__ void setMinMaxOn(bool on = true) -+ __hostdev__ void setFlagsOff() __global__ { mFlags = uint32_t(0); } -+ __hostdev__ void setMinMaxOn(bool on = true) __global__ - { - if (on) { - mFlags |= static_cast(GridFlags::HasMinMax); -@@ -2459,7 +2769,7 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) GridData - mFlags &= ~static_cast(GridFlags::HasMinMax); - } - } -- __hostdev__ void setBBoxOn(bool on = true) -+ __hostdev__ void setBBoxOn(bool on = true) __global__ - { - if (on) { - mFlags |= static_cast(GridFlags::HasBBox); -@@ -2467,7 +2777,7 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) GridData - mFlags &= ~static_cast(GridFlags::HasBBox); - } - } -- __hostdev__ void setLongGridNameOn(bool on = true) -+ __hostdev__ void setLongGridNameOn(bool on = true) __global__ - { - if (on) { - mFlags |= static_cast(GridFlags::HasLongGridName); -@@ -2475,7 +2785,7 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) GridData - mFlags &= ~static_cast(GridFlags::HasLongGridName); - } - } -- __hostdev__ void setAverageOn(bool on = true) -+ __hostdev__ void setAverageOn(bool on = true) __global__ - { - if (on) { - mFlags |= static_cast(GridFlags::HasAverage); -@@ -2483,7 +2793,7 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) GridData - mFlags &= ~static_cast(GridFlags::HasAverage); - } - } -- __hostdev__ void setStdDeviationOn(bool on = true) -+ __hostdev__ void setStdDeviationOn(bool on = true) __global__ - { - if (on) { - mFlags |= static_cast(GridFlags::HasStdDeviation); -@@ -2491,7 +2801,7 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) GridData - mFlags &= ~static_cast(GridFlags::HasStdDeviation); - } - } -- __hostdev__ void setBreadthFirstOn(bool on = true) -+ __hostdev__ void setBreadthFirstOn(bool on = true) __global__ - { - if (on) { - mFlags |= static_cast(GridFlags::IsBreadthFirst); -@@ -2502,37 +2812,49 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) GridData - - // Affine transformations based on double precision - template -- __hostdev__ Vec3T applyMap(const Vec3T& xyz) const { return mMap.applyMap(xyz); } // Pos: index -> world -+ __hostdev__ Vec3T applyMap(__global__ const Vec3T& xyz) const __global__ { return mMap.applyMap(xyz); } // Pos: index -> world - template -- __hostdev__ Vec3T applyInverseMap(const Vec3T& xyz) const { return mMap.applyInverseMap(xyz); } // Pos: world -> index -+ __hostdev__ Vec3T applyInverseMap(__global__ const Vec3T& xyz) const __global__ { return mMap.applyInverseMap(xyz); } // Pos: world -> index -+#if defined(__KERNEL_METAL__) - template -- __hostdev__ Vec3T applyJacobian(const Vec3T& xyz) const { return mMap.applyJacobian(xyz); } // Dir: index -> world -+ __hostdev__ Vec3T applyInverseMap(__local__ const Vec3T& xyz) const __global__ { return mMap.applyInverseMap(xyz); } // Pos: world -> index -+#endif - template -- __hostdev__ Vec3T applyInverseJacobian(const Vec3T& xyz) const { return mMap.applyInverseJacobian(xyz); } // Dir: world -> index -+ __hostdev__ Vec3T applyJacobian(__global__ const Vec3T& xyz) const __global__ { return mMap.applyJacobian(xyz); } // Dir: index -> world - template -- __hostdev__ Vec3T applyIJT(const Vec3T& xyz) const { return mMap.applyIJT(xyz); } -+ __hostdev__ Vec3T applyInverseJacobian(__global__ const Vec3T& xyz) const __global__ { return mMap.applyInverseJacobian(xyz); } // Dir: world -> index -+ template -+ __hostdev__ Vec3T applyIJT(__global__ const Vec3T& xyz) const __global__ { return mMap.applyIJT(xyz); } - // Affine transformations based on single precision - template -- __hostdev__ Vec3T applyMapF(const Vec3T& xyz) const { return mMap.applyMapF(xyz); } // Pos: index -> world -+ __hostdev__ Vec3T applyMapF(__global__ const Vec3T& xyz) const __global__ { return mMap.applyMapF(xyz); } // Pos: index -> world - template -- __hostdev__ Vec3T applyInverseMapF(const Vec3T& xyz) const { return mMap.applyInverseMapF(xyz); } // Pos: world -> index -+ __hostdev__ Vec3T applyInverseMapF(__global__ const Vec3T& xyz) const __global__ { return mMap.applyInverseMapF(xyz); } // Pos: world -> index -+#if defined(__KERNEL_METAL__) - template -- __hostdev__ Vec3T applyJacobianF(const Vec3T& xyz) const { return mMap.applyJacobianF(xyz); } // Dir: index -> world -+ __hostdev__ Vec3T applyInverseMapF(__local__ const Vec3T& xyz) const __global__ { return mMap.applyInverseMapF(xyz); } // Pos: world -> index -+#endif - template -- __hostdev__ Vec3T applyInverseJacobianF(const Vec3T& xyz) const { return mMap.applyInverseJacobianF(xyz); } // Dir: world -> index -+ __hostdev__ Vec3T applyJacobianF(__global__ const Vec3T& xyz) const __global__ { return mMap.applyJacobianF(xyz); } // Dir: index -> world - template -- __hostdev__ Vec3T applyIJTF(const Vec3T& xyz) const { return mMap.applyIJTF(xyz); } -+ __hostdev__ Vec3T applyInverseJacobianF(__global__ const Vec3T& xyz) const __global__ { return mMap.applyInverseJacobianF(xyz); } // Dir: world -> index -+#if defined(__KERNEL_METAL__) -+ template -+ __hostdev__ Vec3T applyInverseJacobianF(__local__ const Vec3T& xyz) const __global__ { return mMap.applyInverseJacobianF(xyz); } // Dir: world -> index -+#endif -+ template -+ __hostdev__ Vec3T applyIJTF(__global__ const Vec3T& xyz) const __global__ { return mMap.applyIJTF(xyz); } - - // @brief Return a non-const void pointer to the tree -- __hostdev__ void* treePtr() { return this + 1; } -+ __hostdev__ __global__ void* treePtr() __global__ { return this + 1; } - - // @brief Return a const void pointer to the tree -- __hostdev__ const void* treePtr() const { return this + 1; } -+ __hostdev__ __global__ const void* treePtr() const __global__ { return this + 1; } - - /// @brief Returns a const reference to the blindMetaData at the specified linear offset. - /// - /// @warning The linear offset is assumed to be in the valid range -- __hostdev__ const GridBlindMetaData* blindMetaData(uint32_t n) const -+ __hostdev__ __global__ const GridBlindMetaData* blindMetaData(uint32_t n) const __global__ - { - NANOVDB_ASSERT(n < mBlindMetadataCount); - return PtrAdd(this, mBlindMetadataOffset) + n; -@@ -2552,8 +2874,17 @@ using DefaultReadAccessor = ReadAccessor; - /// - /// @note This the API of this class to interface with client code - template --class Grid : private GridData -+class Grid -+#if !defined(__KERNEL_METAL__) -+ : private GridData -+#endif - { -+#if defined(__KERNEL_METAL__) -+ GridData _base; -+#define BASE(v) _base.v -+#else -+#define BASE(v) DataType::v -+#endif - public: - using TreeType = TreeT; - using RootType = typename TreeT::RootType; -@@ -2566,183 +2897,195 @@ public: - /// @brief Disallow constructions, copy and assignment - /// - /// @note Only a Serializer, defined elsewhere, can instantiate this class -- Grid(const Grid&) = delete; -- Grid& operator=(const Grid&) = delete; -+ Grid(__global__ const Grid&) __global__ = delete; -+ __global__ Grid& operator=(__global__ const Grid&) __global__ = delete; - ~Grid() = delete; - -- __hostdev__ Version version() const { return DataType::mVersion; } -+ __hostdev__ Version version() const __global__ { return BASE(mVersion); } - -- __hostdev__ DataType* data() { return reinterpret_cast(this); } -+ __hostdev__ __global__ DataType* data() __global__ { return reinterpret_cast<__global__ DataType*>(this); } - -- __hostdev__ const DataType* data() const { return reinterpret_cast(this); } -+ __hostdev__ __global__ const DataType* data() const __global__ { return reinterpret_cast<__global__ const DataType*>(this); } - - /// @brief Return memory usage in bytes for this class only. - __hostdev__ static uint64_t memUsage() { return sizeof(GridData); } - - /// @brief Return the memory footprint of the entire grid, i.e. including all nodes and blind data -- __hostdev__ uint64_t gridSize() const { return DataType::mGridSize; } -+ __hostdev__ uint64_t gridSize() const __global__ { return BASE(mGridSize); } - - /// @brief Return index of this grid in the buffer -- __hostdev__ uint32_t gridIndex() const { return DataType::mGridIndex; } -+ __hostdev__ uint32_t gridIndex() const __global__ { return BASE(mGridIndex); } - - /// @brief Return total number of grids in the buffer -- __hostdev__ uint32_t gridCount() const { return DataType::mGridCount; } -+ __hostdev__ uint32_t gridCount() const __global__ { return BASE(mGridCount); } - - /// @brief @brief Return the total number of values indexed by this IndexGrid - /// - /// @note This method is only defined for IndexGrid = NanoGrid - template -- __hostdev__ typename enable_if::value, const uint64_t&>::type valueCount() const {return DataType::mData1;} -+ __hostdev__ typename enable_if::value, uint64_t>::type valueCount() const {return BASE(mData1);} - - /// @brief Return a const reference to the tree -- __hostdev__ const TreeT& tree() const { return *reinterpret_cast(this->treePtr()); } -+ __hostdev__ __global__ const TreeT& tree() const __global__ { return *reinterpret_cast<__global__ const TreeT*>(BASE(treePtr)()); } - - /// @brief Return a non-const reference to the tree -- __hostdev__ TreeT& tree() { return *reinterpret_cast(this->treePtr()); } -+ __hostdev__ __global__ TreeT& tree() __global__ { return *reinterpret_cast<__global__ TreeT*>(BASE(treePtr)()); } - - /// @brief Return a new instance of a ReadAccessor used to access values in this grid -- __hostdev__ AccessorType getAccessor() const { return AccessorType(this->tree().root()); } -+ __hostdev__ AccessorType getAccessor() const __global__ { return AccessorType(this->tree().root()); } - - /// @brief Return a const reference to the size of a voxel in world units -- __hostdev__ const Vec3R& voxelSize() const { return DataType::mVoxelSize; } -+ __hostdev__ const __global__ Vec3R& voxelSize() const __global__ { return BASE(mVoxelSize); } - - /// @brief Return a const reference to the Map for this grid -- __hostdev__ const Map& map() const { return DataType::mMap; } -+ __hostdev__ const __global__ Map& map() const __global__ { return BASE(mMap); } - - /// @brief world to index space transformation - template -- __hostdev__ Vec3T worldToIndex(const Vec3T& xyz) const { return this->applyInverseMap(xyz); } -+ __hostdev__ Vec3T worldToIndex(__global__ const Vec3T& xyz) const __global__ { return BASE(applyInverseMap)(xyz); } -+ -+#if defined(__KERNEL_METAL__) -+ template -+ __hostdev__ Vec3T worldToIndex(__local__ const Vec3T& xyz) const __global__ { return BASE(applyInverseMap)(xyz); } -+#endif - - /// @brief index to world space transformation - template -- __hostdev__ Vec3T indexToWorld(const Vec3T& xyz) const { return this->applyMap(xyz); } -+ __hostdev__ Vec3T indexToWorld(__global__ const Vec3T& xyz) const __global__ { return this->applyMap(xyz); } - - /// @brief transformation from index space direction to world space direction - /// @warning assumes dir to be normalized - template -- __hostdev__ Vec3T indexToWorldDir(const Vec3T& dir) const { return this->applyJacobian(dir); } -+ __hostdev__ Vec3T indexToWorldDir(__global__ const Vec3T& dir) const __global__ { return this->applyJacobian(dir); } - - /// @brief transformation from world space direction to index space direction - /// @warning assumes dir to be normalized - template -- __hostdev__ Vec3T worldToIndexDir(const Vec3T& dir) const { return this->applyInverseJacobian(dir); } -+ __hostdev__ Vec3T worldToIndexDir(__global__ const Vec3T& dir) const __global__ { return this->applyInverseJacobian(dir); } - - /// @brief transform the gradient from index space to world space. - /// @details Applies the inverse jacobian transform map. - template -- __hostdev__ Vec3T indexToWorldGrad(const Vec3T& grad) const { return this->applyIJT(grad); } -+ __hostdev__ Vec3T indexToWorldGrad(__global__ const Vec3T& grad) const __global__ { return this->applyIJT(grad); } - - /// @brief world to index space transformation - template -- __hostdev__ Vec3T worldToIndexF(const Vec3T& xyz) const { return this->applyInverseMapF(xyz); } -+ __hostdev__ Vec3T worldToIndexF(__global__ const Vec3T& xyz) const __global__ { return BASE(applyInverseMapF)(xyz); } -+#if defined(__KERNEL_METAL__) -+ template -+ __hostdev__ Vec3T worldToIndexF(__local__ const Vec3T& xyz) const __global__ { return BASE(applyInverseMapF)(xyz); } -+#endif - - /// @brief index to world space transformation - template -- __hostdev__ Vec3T indexToWorldF(const Vec3T& xyz) const { return this->applyMapF(xyz); } -+ __hostdev__ Vec3T indexToWorldF(__global__ const Vec3T& xyz) const __global__ { return this->applyMapF(xyz); } - - /// @brief transformation from index space direction to world space direction - /// @warning assumes dir to be normalized - template -- __hostdev__ Vec3T indexToWorldDirF(const Vec3T& dir) const { return this->applyJacobianF(dir); } -+ __hostdev__ Vec3T indexToWorldDirF(__global__ const Vec3T& dir) const __global__ { return this->applyJacobianF(dir); } - - /// @brief transformation from world space direction to index space direction - /// @warning assumes dir to be normalized - template -- __hostdev__ Vec3T worldToIndexDirF(const Vec3T& dir) const { return this->applyInverseJacobianF(dir); } -+ __hostdev__ Vec3T worldToIndexDirF(__global__ const Vec3T& dir) const __global__ { return BASE(applyInverseJacobianF)(dir); } -+#if defined(__KERNEL_METAL__) -+ template -+ __hostdev__ Vec3T worldToIndexDirF(__local__ const Vec3T& dir) const __global__ { return BASE(applyInverseJacobianF)(dir); } -+#endif - - /// @brief Transforms the gradient from index space to world space. - /// @details Applies the inverse jacobian transform map. - template -- __hostdev__ Vec3T indexToWorldGradF(const Vec3T& grad) const { return DataType::applyIJTF(grad); } -+ __hostdev__ Vec3T indexToWorldGradF(__global__ const Vec3T& grad) const __global__ { return BASE(applyIJTF(grad)); } - - /// @brief Computes a AABB of active values in world space -- __hostdev__ const BBox& worldBBox() const { return DataType::mWorldBBox; } -+ __hostdev__ __global__ const BBox& worldBBox() const __global__ { return BASE(mWorldBBox); } - - /// @brief Computes a AABB of active values in index space - /// - /// @note This method is returning a floating point bounding box and not a CoordBBox. This makes - /// it more useful for clipping rays. -- __hostdev__ const BBox& indexBBox() const { return this->tree().bbox(); } -+ __hostdev__ __global__ const BBox& indexBBox() const __global__ { return this->tree().bbox(); } - - /// @brief Return the total number of active voxels in this tree. -- __hostdev__ uint64_t activeVoxelCount() const { return this->tree().activeVoxelCount(); } -+ __hostdev__ uint64_t activeVoxelCount() const __global__ { return this->tree().activeVoxelCount(); } - - /// @brief Methods related to the classification of this grid -- __hostdev__ bool isValid() const { return DataType::mMagic == NANOVDB_MAGIC_NUMBER; } -- __hostdev__ const GridType& gridType() const { return DataType::mGridType; } -- __hostdev__ const GridClass& gridClass() const { return DataType::mGridClass; } -- __hostdev__ bool isLevelSet() const { return DataType::mGridClass == GridClass::LevelSet; } -- __hostdev__ bool isFogVolume() const { return DataType::mGridClass == GridClass::FogVolume; } -- __hostdev__ bool isStaggered() const { return DataType::mGridClass == GridClass::Staggered; } -- __hostdev__ bool isPointIndex() const { return DataType::mGridClass == GridClass::PointIndex; } -- __hostdev__ bool isGridIndex() const { return DataType::mGridClass == GridClass::IndexGrid; } -- __hostdev__ bool isPointData() const { return DataType::mGridClass == GridClass::PointData; } -- __hostdev__ bool isMask() const { return DataType::mGridClass == GridClass::Topology; } -- __hostdev__ bool isUnknown() const { return DataType::mGridClass == GridClass::Unknown; } -- __hostdev__ bool hasMinMax() const { return DataType::mFlags & static_cast(GridFlags::HasMinMax); } -- __hostdev__ bool hasBBox() const { return DataType::mFlags & static_cast(GridFlags::HasBBox); } -- __hostdev__ bool hasLongGridName() const { return DataType::mFlags & static_cast(GridFlags::HasLongGridName); } -- __hostdev__ bool hasAverage() const { return DataType::mFlags & static_cast(GridFlags::HasAverage); } -- __hostdev__ bool hasStdDeviation() const { return DataType::mFlags & static_cast(GridFlags::HasStdDeviation); } -- __hostdev__ bool isBreadthFirst() const { return DataType::mFlags & static_cast(GridFlags::IsBreadthFirst); } -+ __hostdev__ bool isValid() const __global__ { return BASE(mMagic) == NANOVDB_MAGIC_NUMBER; } -+ __hostdev__ const __global__ GridType& gridType() const __global__ { return BASE(mGridType); } -+ __hostdev__ const __global__ GridClass& gridClass() const __global__ { return BASE(mGridClass); } -+ __hostdev__ bool isLevelSet() const __global__ { return BASE(mGridClass) == GridClass::LevelSet; } -+ __hostdev__ bool isFogVolume() const __global__ { return BASE(mGridClass) == GridClass::FogVolume; } -+ __hostdev__ bool isStaggered() const __global__ { return BASE(mGridClass) == GridClass::Staggered; } -+ __hostdev__ bool isPointIndex() const __global__ { return BASE(mGridClass) == GridClass::PointIndex; } -+ __hostdev__ bool isGridIndex() const __global__ { return BASE(mGridClass) == GridClass::IndexGrid; } -+ __hostdev__ bool isPointData() const __global__ { return BASE(mGridClass) == GridClass::PointData; } -+ __hostdev__ bool isMask() const __global__ { return BASE(mGridClass) == GridClass::Topology; } -+ __hostdev__ bool isUnknown() const __global__ { return BASE(mGridClass) == GridClass::Unknown; } -+ __hostdev__ bool hasMinMax() const __global__ { return BASE(mFlags) & static_cast(GridFlags::HasMinMax); } -+ __hostdev__ bool hasBBox() const __global__ { return BASE(mFlags) & static_cast(GridFlags::HasBBox); } -+ __hostdev__ bool hasLongGridName() const __global__ { return BASE(mFlags) & static_cast(GridFlags::HasLongGridName); } -+ __hostdev__ bool hasAverage() const __global__ { return BASE(mFlags) & static_cast(GridFlags::HasAverage); } -+ __hostdev__ bool hasStdDeviation() const __global__ { return BASE(mFlags) & static_cast(GridFlags::HasStdDeviation); } -+ __hostdev__ bool isBreadthFirst() const __global__ { return BASE(mFlags) & static_cast(GridFlags::IsBreadthFirst); } - - /// @brief return true if the specified node type is layed out breadth-first in memory and has a fixed size. - /// This allows for sequential access to the nodes. - template -- __hostdev__ bool isSequential() const { return NodeT::FIXED_SIZE && this->isBreadthFirst(); } -+ __hostdev__ bool isSequential() const __global__ { return NodeT::FIXED_SIZE && this->isBreadthFirst(); } - - /// @brief return true if the specified node level is layed out breadth-first in memory and has a fixed size. - /// This allows for sequential access to the nodes. - template -- __hostdev__ bool isSequential() const { return NodeTrait::type::FIXED_SIZE && this->isBreadthFirst(); } -+ __hostdev__ bool isSequential() const __global__ { return NodeTrait::type::FIXED_SIZE && this->isBreadthFirst(); } - - /// @brief Return a c-string with the name of this grid -- __hostdev__ const char* gridName() const -+ __hostdev__ __global__ const char* gridName() const __global__ - { - if (this->hasLongGridName()) { - NANOVDB_ASSERT(DataType::mBlindMetadataCount>0); -- const auto &metaData = this->blindMetaData(DataType::mBlindMetadataCount-1);// always the last -+ __global__ const auto &metaData = this->blindMetaData(BASE(mBlindMetadataCount)-1);// always the last - NANOVDB_ASSERT(metaData.mDataClass == GridBlindDataClass::GridName); - return metaData.template getBlindData(); - } -- return DataType::mGridName; -+ return BASE(mGridName); - } - - /// @brief Return a c-string with the name of this grid, truncated to 255 characters -- __hostdev__ const char* shortGridName() const { return DataType::mGridName; } -- -+ __hostdev__ __global__ const char* shortGridName() const __global__ { return BASE(mGridName); } - /// @brief Return checksum of the grid buffer. -- __hostdev__ uint64_t checksum() const { return DataType::mChecksum; } -+ __hostdev__ uint64_t checksum() const __global__ { return BASE(mChecksum); } - - /// @brief Return true if this grid is empty, i.e. contains no values or nodes. -- __hostdev__ bool isEmpty() const { return this->tree().isEmpty(); } -+ __hostdev__ bool isEmpty() const __global__ { return this->tree().isEmpty(); } - - /// @brief Return the count of blind-data encoded in this grid -- __hostdev__ uint32_t blindDataCount() const { return DataType::mBlindMetadataCount; } -+ __hostdev__ uint32_t blindDataCount() const __global__ { return BASE(mBlindMetadataCount); } - - /// @brief Return the index of the blind data with specified semantic if found, otherwise -1. -- __hostdev__ int findBlindDataForSemantic(GridBlindDataSemantic semantic) const; -+ __hostdev__ int findBlindDataForSemantic(GridBlindDataSemantic semantic) const __global__; - - /// @brief Returns a const pointer to the blindData at the specified linear offset. - /// - /// @warning Point might be NULL and the linear offset is assumed to be in the valid range -- __hostdev__ const void* blindData(uint32_t n) const -+ __hostdev__ __global__ const void* blindData(uint32_t n) const __global__ - { -- if (DataType::mBlindMetadataCount == 0u) { -+ if (BASE(mBlindMetadataCount) == 0u) { - return nullptr; - } - NANOVDB_ASSERT(n < DataType::mBlindMetadataCount); - return this->blindMetaData(n).template getBlindData(); - } -- -- __hostdev__ const GridBlindMetaData& blindMetaData(uint32_t n) const { return *DataType::blindMetaData(n); } -+ -+ __hostdev__ __global__ const GridBlindMetaData& blindMetaData(uint32_t n) const __global__ { return *BASE(blindMetaData)(n); } - - private: - static_assert(sizeof(GridData) % NANOVDB_DATA_ALIGNMENT == 0, "sizeof(GridData) is misaligned"); - }; // Class Grid - - template --__hostdev__ int Grid::findBlindDataForSemantic(GridBlindDataSemantic semantic) const -+__hostdev__ int Grid::findBlindDataForSemantic(GridBlindDataSemantic semantic) const __global__ - { - for (uint32_t i = 0, n = this->blindDataCount(); i < n; ++i) - if (this->blindMetaData(i).mSemantic == semantic) -@@ -2762,14 +3105,14 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) TreeData - uint64_t mVoxelCount;// 8B, total number of active voxels in the root and all its child nodes. - // No padding since it's always 32B aligned - template -- __hostdev__ void setRoot(const RootT* root) { mNodeOffset[3] = PtrDiff(root, this); } -+ __hostdev__ void setRoot(__global__ const RootT* root) __global__ { mNodeOffset[3] = PtrDiff(root, this); } - template -- __hostdev__ RootT* getRoot() { return PtrAdd(this, mNodeOffset[3]); } -+ __hostdev__ __global__ RootT* getRoot() __global__ { return PtrAdd(this, mNodeOffset[3]); } - template -- __hostdev__ const RootT* getRoot() const { return PtrAdd(this, mNodeOffset[3]); } -+ __hostdev__ __global__ const RootT* getRoot() const __global__ { return PtrAdd(this, mNodeOffset[3]); } - - template -- __hostdev__ void setFirstNode(const NodeT* node) -+ __hostdev__ void setFirstNode(__global__ const NodeT* node) __global__ - { - mNodeOffset[NodeT::LEVEL] = node ? PtrDiff(node, this) : 0; - } -@@ -2795,8 +3138,17 @@ struct GridTree - - /// @brief VDB Tree, which is a thin wrapper around a RootNode. - template --class Tree : private TreeData -+class Tree -+#if !defined(__KERNEL_METAL__) -+ : private TreeData -+#endif - { -+#if defined(__KERNEL_METAL__) -+ TreeData _base; -+#define BASE(v) _base.v -+#else -+#define BASE(v) DataType::v -+#endif - static_assert(RootT::LEVEL == 3, "Tree depth is not supported"); - static_assert(RootT::ChildNodeType::LOG2DIM == 5, "Tree configuration is not supported"); - static_assert(RootT::ChildNodeType::ChildNodeType::LOG2DIM == 4, "Tree configuration is not supported"); -@@ -2817,79 +3169,86 @@ public: - using Node0 = LeafNodeType; - - /// @brief This class cannot be constructed or deleted -- Tree() = delete; -- Tree(const Tree&) = delete; -- Tree& operator=(const Tree&) = delete; -- ~Tree() = delete; -+ Tree() __global__ = delete; -+ Tree(__global__ const Tree&) __global__ = delete; -+ __global__ Tree& operator=(__global__ const Tree&) __global__ = delete; -+ ~Tree() __global__ = delete; - -- __hostdev__ DataType* data() { return reinterpret_cast(this); } -+ __hostdev__ __global__ DataType* data() __global__ { return reinterpret_cast<__global__ DataType*>(this); } - -- __hostdev__ const DataType* data() const { return reinterpret_cast(this); } -+ __hostdev__ __global__ const DataType* data() const __global__ { return reinterpret_cast<__global__ const DataType*>(this); } - - /// @brief return memory usage in bytes for the class - __hostdev__ static uint64_t memUsage() { return sizeof(DataType); } - -- __hostdev__ RootT& root() { return *DataType::template getRoot(); } -+ __hostdev__ __global__ RootT& root() __global__ { return *BASE(template) getRoot(); } - -- __hostdev__ const RootT& root() const { return *DataType::template getRoot(); } -+ __hostdev__ __global__ const RootT& root() const __global__ { return *BASE(template) getRoot(); } - -- __hostdev__ AccessorType getAccessor() const { return AccessorType(this->root()); } -+ __hostdev__ AccessorType getAccessor() const __global__ { return AccessorType(this->root()); } - - /// @brief Return the value of the given voxel (regardless of state or location in the tree.) -- __hostdev__ ValueType getValue(const CoordType& ijk) const { return this->root().getValue(ijk); } -+ __hostdev__ ValueType getValue(__global__ const CoordType& ijk) const __global__ { return this->root().getValue(ijk); } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ ValueType getValue(__local__ const CoordType& ijk) const __global__ { return this->root().getValue(ijk); } -+#endif - - /// @brief Return the active state of the given voxel (regardless of state or location in the tree.) -- __hostdev__ bool isActive(const CoordType& ijk) const { return this->root().isActive(ijk); } -+ __hostdev__ bool isActive(__global__ const CoordType& ijk) const __global__ { return this->root().isActive(ijk); } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ bool isActive(__local__ const CoordType& ijk) const __global__ { return this->root().isActive(ijk); } -+ __hostdev__ bool isActive(__local__ const CoordType& ijk) const __local__ { return this->root().isActive(ijk); } -+#endif - - /// @brief Return true if this tree is empty, i.e. contains no values or nodes -- __hostdev__ bool isEmpty() const { return this->root().isEmpty(); } -+ __hostdev__ bool isEmpty() const __global__ { return this->root().isEmpty(); } - - /// @brief Combines the previous two methods in a single call -- __hostdev__ bool probeValue(const CoordType& ijk, ValueType& v) const { return this->root().probeValue(ijk, v); } -+ __hostdev__ bool probeValue(__global__ const CoordType& ijk, __global__ ValueType& v) const { return this->root().probeValue(ijk, v); } - - /// @brief Return a const reference to the background value. -- __hostdev__ const ValueType& background() const { return this->root().background(); } -+ __hostdev__ __global__ const ValueType& background() const __global__ { return this->root().background(); } - - /// @brief Sets the extrema values of all the active values in this tree, i.e. in all nodes of the tree -- __hostdev__ void extrema(ValueType& min, ValueType& max) const; -+ __hostdev__ void extrema(__global__ ValueType& min, __global__ ValueType& max) const __global__; - - /// @brief Return a const reference to the index bounding box of all the active values in this tree, i.e. in all nodes of the tree -- __hostdev__ const BBox& bbox() const { return this->root().bbox(); } -+ __hostdev__ __global__ const BBox& bbox() const __global__ { return this->root().bbox(); } - - /// @brief Return the total number of active voxels in this tree. -- __hostdev__ uint64_t activeVoxelCount() const { return DataType::mVoxelCount; } -+ __hostdev__ uint64_t activeVoxelCount() const __global__ { return BASE(mVoxelCount); } - - /// @brief Return the total number of active tiles at the specified level of the tree. - /// - /// @details level = 1,2,3 corresponds to active tile count in lower internal nodes, upper - /// internal nodes, and the root level. Note active values at the leaf level are - /// referred to as active voxels (see activeVoxelCount defined above). -- __hostdev__ const uint32_t& activeTileCount(uint32_t level) const -+ __hostdev__ __global__ const uint32_t& activeTileCount(uint32_t level) const __global__ - { - NANOVDB_ASSERT(level > 0 && level <= 3);// 1, 2, or 3 -- return DataType::mTileCount[level - 1]; -+ return BASE(mTileCount)[level - 1]; - } - - template -- __hostdev__ uint32_t nodeCount() const -+ __hostdev__ uint32_t nodeCount() const __global__ - { - static_assert(NodeT::LEVEL < 3, "Invalid NodeT"); -- return DataType::mNodeCount[NodeT::LEVEL]; -+ return BASE(mNodeCount)[NodeT::LEVEL]; - } - -- __hostdev__ uint32_t nodeCount(int level) const -+ __hostdev__ uint32_t nodeCount(int level) const __global__ - { - NANOVDB_ASSERT(level < 3); -- return DataType::mNodeCount[level]; -+ return BASE(mNodeCount)[level]; - } - - /// @brief return a pointer to the first node of the specified type - /// - /// @warning Note it may return NULL if no nodes exist - template -- __hostdev__ NodeT* getFirstNode() -+ __hostdev__ __global__ NodeT* getFirstNode() __global__ - { -- const uint64_t offset = DataType::mNodeOffset[NodeT::LEVEL]; -+ const uint64_t offset = BASE(mNodeOffset)[NodeT::LEVEL]; - return offset>0 ? PtrAdd(this, offset) : nullptr; - } - -@@ -2897,9 +3256,9 @@ public: - /// - /// @warning Note it may return NULL if no nodes exist - template -- __hostdev__ const NodeT* getFirstNode() const -+ __hostdev__ __global__ const NodeT* getFirstNode() const __global__ - { -- const uint64_t offset = DataType::mNodeOffset[NodeT::LEVEL]; -+ const uint64_t offset = BASE(mNodeOffset)[NodeT::LEVEL]; - return offset>0 ? PtrAdd(this, offset) : nullptr; - } - -@@ -2907,8 +3266,8 @@ public: - /// - /// @warning Note it may return NULL if no nodes exist - template -- __hostdev__ typename NodeTrait::type* -- getFirstNode() -+ __hostdev__ __global__ typename NodeTrait::type* -+ getFirstNode() __global__ - { - return this->template getFirstNode::type>(); - } -@@ -2917,27 +3276,28 @@ public: - /// - /// @warning Note it may return NULL if no nodes exist - template -- __hostdev__ const typename NodeTrait::type* -- getFirstNode() const -+ __hostdev__ __global__ const typename NodeTrait::type* -+ getFirstNode() const __global__ - { - return this->template getFirstNode::type>(); - } - - /// @brief Template specializations of getFirstNode -- __hostdev__ LeafNodeType* getFirstLeaf() {return this->getFirstNode();} -- __hostdev__ const LeafNodeType* getFirstLeaf() const {return this->getFirstNode();} -- __hostdev__ typename NodeTrait::type* getFirstLower() {return this->getFirstNode<1>();} -- __hostdev__ const typename NodeTrait::type* getFirstLower() const {return this->getFirstNode<1>();} -- __hostdev__ typename NodeTrait::type* getFirstUpper() {return this->getFirstNode<2>();} -- __hostdev__ const typename NodeTrait::type* getFirstUpper() const {return this->getFirstNode<2>();} -+ __hostdev__ __global__ LeafNodeType* getFirstLeaf() {return this->getFirstNode();} -+ __hostdev__ __global__ const LeafNodeType* getFirstLeaf() const {return this->getFirstNode();} -+ __hostdev__ __global__ typename NodeTrait::type* getFirstLower() {return this->getFirstNode<1>();} -+ __hostdev__ __global__ const typename NodeTrait::type* getFirstLower() const {return this->getFirstNode<1>();} -+ __hostdev__ __global__ typename NodeTrait::type* getFirstUpper() {return this->getFirstNode<2>();} -+ __hostdev__ __global__ const typename NodeTrait::type* getFirstUpper() const {return this->getFirstNode<2>();} - - private: - static_assert(sizeof(DataType) % NANOVDB_DATA_ALIGNMENT == 0, "sizeof(TreeData) is misaligned"); - -+#undef BASE - }; // Tree class - - template --__hostdev__ void Tree::extrema(ValueType& min, ValueType& max) const -+__hostdev__ void Tree::extrema(__global__ ValueType& min, __global__ ValueType& max) const __global__ - { - min = this->root().minimum(); - max = this->root().maximum(); -@@ -2955,13 +3315,13 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) RootData - using BuildT = typename ChildT::BuildType;// in rare cases BuildType != ValueType, e.g. then BuildType = ValueMask and ValueType = bool - using CoordT = typename ChildT::CoordType; - using StatsT = typename ChildT::FloatType; -- static constexpr bool FIXED_SIZE = false; -+ static __constant__ constexpr bool FIXED_SIZE = false; - - /// @brief Return a key based on the coordinates of a voxel - #ifdef USE_SINGLE_ROOT_KEY - using KeyT = uint64_t; - template -- __hostdev__ static KeyT CoordToKey(const CoordType& ijk) -+ __hostdev__ static KeyT CoordToKey(__global__ const CoordType& ijk) - { - static_assert(sizeof(CoordT) == sizeof(CoordType), "Mismatching sizeof"); - static_assert(32 - ChildT::TOTAL <= 21, "Cannot use 64 bit root keys"); -@@ -2969,17 +3329,28 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) RootData - (KeyT(uint32_t(ijk[1]) >> ChildT::TOTAL) << 21) | // y is the middle 21 bits - (KeyT(uint32_t(ijk[0]) >> ChildT::TOTAL) << 42); // x is the upper 21 bits - } -- __hostdev__ static CoordT KeyToCoord(const KeyT& key) -+#if defined(__KERNEL_METAL__) -+ template -+ __hostdev__ static KeyT CoordToKey(__local__ const CoordType& ijk) -+ { -+ static_assert(sizeof(CoordT) == sizeof(CoordType), "Mismatching sizeof"); -+ static_assert(32 - ChildT::TOTAL <= 21, "Cannot use 64 bit root keys"); -+ return (KeyT(uint32_t(ijk[2]) >> ChildT::TOTAL)) | // z is the lower 21 bits -+ (KeyT(uint32_t(ijk[1]) >> ChildT::TOTAL) << 21) | // y is the middle 21 bits -+ (KeyT(uint32_t(ijk[0]) >> ChildT::TOTAL) << 42); // x is the upper 21 bits -+ } -+#endif -+ static __constant__ constexpr uint64_t MASK = (1u << 21) - 1; -+ __hostdev__ static CoordT KeyToCoord(__global__ const KeyT& key) - { -- static constexpr uint64_t MASK = (1u << 21) - 1; - return CoordT(((key >> 42) & MASK) << ChildT::TOTAL, - ((key >> 21) & MASK) << ChildT::TOTAL, - (key & MASK) << ChildT::TOTAL); - } - #else - using KeyT = CoordT; -- __hostdev__ static KeyT CoordToKey(const CoordT& ijk) { return ijk & ~ChildT::MASK; } -- __hostdev__ static CoordT KeyToCoord(const KeyT& key) { return key; } -+ __hostdev__ static KeyT CoordToKey(__global__ const CoordT& ijk) { return ijk & ~ChildT::MASK; } -+ __hostdev__ static CoordT KeyToCoord(__global__ const KeyT& key) { return key; } - #endif - BBox mBBox; // 24B. AABB of active values in index space. - uint32_t mTableSize; // 4B. number of tiles and child pointers in the root node -@@ -3000,23 +3371,23 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) RootData - struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) Tile - { - template -- __hostdev__ void setChild(const CoordType& k, const ChildT *ptr, const RootData *data) -+ __hostdev__ void setChild(__global__ const CoordType& k, __global__ const ChildT *ptr, __global__ const RootData *data) - { - key = CoordToKey(k); - child = PtrDiff(ptr, data); - } - template -- __hostdev__ void setValue(const CoordType& k, bool s, const ValueType &v) -+ __hostdev__ void setValue(__global__ const CoordType& k, bool s, __global__ const ValueType &v) - { - key = CoordToKey(k); - state = s; - value = v; - child = 0; - } -- __hostdev__ bool isChild() const { return child!=0; } -- __hostdev__ bool isValue() const { return child==0; } -- __hostdev__ bool isActive() const { return child==0 && state; } -- __hostdev__ CoordT origin() const { return KeyToCoord(key); } -+ __hostdev__ bool isChild() const __global__ { return child!=0; } -+ __hostdev__ bool isValue() const __global__ { return child==0; } -+ __hostdev__ bool isActive() const __global__ { return child==0 && state; } -+ __hostdev__ CoordT origin() const __global__ { return KeyToCoord(key); } - KeyT key; // USE_SINGLE_ROOT_KEY ? 8B : 12B - int64_t child; // 8B. signed byte offset from this node to the child node. 0 means it is a constant tile, so use value. - uint32_t state; // 4B. state of tile value -@@ -3026,53 +3397,64 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) RootData - /// @brief Returns a non-const reference to the tile at the specified linear offset. - /// - /// @warning The linear offset is assumed to be in the valid range -- __hostdev__ const Tile* tile(uint32_t n) const -+ __hostdev__ __global__ const Tile* tile(uint32_t n) const - { - NANOVDB_ASSERT(n < mTableSize); -- return reinterpret_cast(this + 1) + n; -+ return reinterpret_cast<__global__ const Tile*>(this + 1) + n; - } -- __hostdev__ Tile* tile(uint32_t n) -+ __hostdev__ __global__ Tile* tile(uint32_t n) - { - NANOVDB_ASSERT(n < mTableSize); -- return reinterpret_cast(this + 1) + n; -+ return reinterpret_cast<__global__ Tile*>(this + 1) + n; - } - - /// @brief Returns a const reference to the child node in the specified tile. - /// - /// @warning A child node is assumed to exist in the specified tile -- __hostdev__ ChildT* getChild(const Tile* tile) -+ __hostdev__ __global__ ChildT* getChild(__global__ const Tile* tile) __global__ - { - NANOVDB_ASSERT(tile->child); - return PtrAdd(this, tile->child); - } -- __hostdev__ const ChildT* getChild(const Tile* tile) const -+ __hostdev__ __global__ const ChildT* getChild(__global__ const Tile* tile) const __global__ - { - NANOVDB_ASSERT(tile->child); - return PtrAdd(this, tile->child); - } - -- __hostdev__ const ValueT& getMin() const { return mMinimum; } -- __hostdev__ const ValueT& getMax() const { return mMaximum; } -- __hostdev__ const StatsT& average() const { return mAverage; } -- __hostdev__ const StatsT& stdDeviation() const { return mStdDevi; } -+ __hostdev__ __global__ const ValueT& getMin() const { return mMinimum; } -+ __hostdev__ __global__ const ValueT& getMax() const { return mMaximum; } -+ __hostdev__ __global__ const StatsT& average() const { return mAverage; } -+ __hostdev__ __global__ const StatsT& stdDeviation() const { return mStdDevi; } - -- __hostdev__ void setMin(const ValueT& v) { mMinimum = v; } -- __hostdev__ void setMax(const ValueT& v) { mMaximum = v; } -- __hostdev__ void setAvg(const StatsT& v) { mAverage = v; } -- __hostdev__ void setDev(const StatsT& v) { mStdDevi = v; } -+ __hostdev__ void setMin(__global__ const ValueT& v) { mMinimum = v; } -+ __hostdev__ void setMax(__global__ const ValueT& v) { mMaximum = v; } -+ __hostdev__ void setAvg(__global__ const StatsT& v) { mAverage = v; } -+ __hostdev__ void setDev(__global__ const StatsT& v) { mStdDevi = v; } - - /// @brief This class cannot be constructed or deleted - RootData() = delete; -- RootData(const RootData&) = delete; -- RootData& operator=(const RootData&) = delete; -+ RootData(__global__ const RootData&) = delete; -+ __global__ RootData& operator=(__global__ const RootData&) = delete; - ~RootData() = delete; - }; // RootData - - /// @brief Top-most node of the VDB tree structure. - template --class RootNode : private RootData -+class RootNode -+#if !defined(__KERNEL_METAL__) -+ : private RootData -+#endif - { - public: -+#if defined(__KERNEL_METAL__) -+ -+ RootData _base; -+#define BASE(v) _base.v -+#else -+#define BASE(v) DataType::v -+#endif -+ - using DataType = RootData; - using LeafNodeType = typename ChildT::LeafNodeType; - using ChildNodeType = ChildT; -@@ -3086,27 +3468,27 @@ public: - using BBoxType = BBox; - using AccessorType = DefaultReadAccessor; - using Tile = typename DataType::Tile; -- static constexpr bool FIXED_SIZE = DataType::FIXED_SIZE; -+ static __constant__ constexpr bool FIXED_SIZE = DataType::FIXED_SIZE; - -- static constexpr uint32_t LEVEL = 1 + ChildT::LEVEL; // level 0 = leaf -+ static __constant__ constexpr uint32_t LEVEL = 1 + ChildT::LEVEL; // level 0 = leaf - - class ChildIterator - { -- const DataType *mParent; -- uint32_t mPos, mSize; -+ __global__ const DataType *mParent; -+ uint32_t mPos, mSize; - public: - __hostdev__ ChildIterator() : mParent(nullptr), mPos(0), mSize(0) {} -- __hostdev__ ChildIterator(const RootNode *parent) : mParent(parent->data()), mPos(0), mSize(parent->tileCount()) { -+ __hostdev__ ChildIterator(__global__ const RootNode *parent) : mParent(parent->data()), mPos(0), mSize(parent->tileCount()) { - NANOVDB_ASSERT(mParent); - while (mPostile(mPos)->isChild()) ++mPos; - } -- ChildIterator& operator=(const ChildIterator&) = default; -- __hostdev__ const ChildT& operator*() const {NANOVDB_ASSERT(*this); return *mParent->getChild(mParent->tile(mPos));} -- __hostdev__ const ChildT* operator->() const {NANOVDB_ASSERT(*this); return mParent->getChild(mParent->tile(mPos));} -+ __global__ ChildIterator& operator=(__global__ const ChildIterator&) = default; -+ __hostdev__ __global__ const ChildT& operator*() const {NANOVDB_ASSERT(*this); return *mParent->getChild(mParent->tile(mPos));} -+ __hostdev__ __global__ const ChildT* operator->() const {NANOVDB_ASSERT(*this); return mParent->getChild(mParent->tile(mPos));} - __hostdev__ CoordType getOrigin() const { NANOVDB_ASSERT(*this); mParent->tile(mPos)->origin();} - __hostdev__ operator bool() const {return mPos < mSize;} - __hostdev__ uint32_t pos() const {return mPos;} -- __hostdev__ ChildIterator& operator++() { -+ __hostdev__ __global__ ChildIterator& operator++() { - NANOVDB_ASSERT(mParent); - ++mPos; - while (mPos < mSize && mParent->tile(mPos)->isValue()) ++mPos; -@@ -3123,21 +3505,21 @@ public: - - class ValueIterator - { -- const DataType *mParent; -- uint32_t mPos, mSize; -+ __global__ const DataType *mParent; -+ uint32_t mPos, mSize; - public: - __hostdev__ ValueIterator() : mParent(nullptr), mPos(0), mSize(0) {} -- __hostdev__ ValueIterator(const RootNode *parent) : mParent(parent->data()), mPos(0), mSize(parent->tileCount()){ -+ __hostdev__ ValueIterator(__global__ const RootNode *parent) : mParent(parent->data()), mPos(0), mSize(parent->tileCount()){ - NANOVDB_ASSERT(mParent); - while (mPos < mSize && mParent->tile(mPos)->isChild()) ++mPos; - } -- ValueIterator& operator=(const ValueIterator&) = default; -+ __global__ ValueIterator& operator=(__global__ const ValueIterator&) = default; - __hostdev__ ValueType operator*() const {NANOVDB_ASSERT(*this); return mParent->tile(mPos)->value;} - __hostdev__ bool isActive() const {NANOVDB_ASSERT(*this); return mParent->tile(mPos)->state;} - __hostdev__ operator bool() const {return mPos < mSize;} - __hostdev__ uint32_t pos() const {return mPos;} - __hostdev__ CoordType getOrigin() const { NANOVDB_ASSERT(*this); mParent->tile(mPos)->origin();} -- __hostdev__ ValueIterator& operator++() { -+ __hostdev__ __global__ ValueIterator& operator++() { - NANOVDB_ASSERT(mParent); - ++mPos; - while (mPos < mSize && mParent->tile(mPos)->isChild()) ++mPos; -@@ -3154,20 +3536,20 @@ public: - - class ValueOnIterator - { -- const DataType *mParent; -+ __global__ const DataType *mParent; - uint32_t mPos, mSize; - public: - __hostdev__ ValueOnIterator() : mParent(nullptr), mPos(0), mSize(0) {} -- __hostdev__ ValueOnIterator(const RootNode *parent) : mParent(parent->data()), mPos(0), mSize(parent->tileCount()){ -+ __hostdev__ ValueOnIterator(__global__ const RootNode *parent) : mParent(parent->data()), mPos(0), mSize(parent->tileCount()){ - NANOVDB_ASSERT(mParent); - while (mPos < mSize && !mParent->tile(mPos)->isActive()) ++mPos; - } -- ValueOnIterator& operator=(const ValueOnIterator&) = default; -+ __global__ ValueOnIterator& operator=(__global__ const ValueOnIterator&) = default; - __hostdev__ ValueType operator*() const {NANOVDB_ASSERT(*this); return mParent->tile(mPos)->value;} - __hostdev__ operator bool() const {return mPos < mSize;} - __hostdev__ uint32_t pos() const {return mPos;} - __hostdev__ CoordType getOrigin() const { NANOVDB_ASSERT(*this); mParent->tile(mPos)->origin();} -- __hostdev__ ValueOnIterator& operator++() { -+ __hostdev__ __global__ ValueOnIterator& operator++() { - NANOVDB_ASSERT(mParent); - ++mPos; - while (mPos < mSize && !mParent->tile(mPos)->isActive()) ++mPos; -@@ -3183,75 +3565,107 @@ public: - ValueOnIterator beginValueOn() const {return ValueOnIterator(this);} - - /// @brief This class cannot be constructed or deleted -- RootNode() = delete; -- RootNode(const RootNode&) = delete; -- RootNode& operator=(const RootNode&) = delete; -- ~RootNode() = delete; -+ RootNode() __global__ = delete; -+ RootNode(__global__ const RootNode&) __global__ = delete; -+ __global__ RootNode& operator=(__global__ const RootNode&) __global__ = delete; -+ ~RootNode() __global__ = delete; - -- __hostdev__ AccessorType getAccessor() const { return AccessorType(*this); } -+ __hostdev__ AccessorType getAccessor() const __global__ { return AccessorType(*this); } - -- __hostdev__ DataType* data() { return reinterpret_cast(this); } -+ __hostdev__ __global__ DataType* data() __global__ { return reinterpret_cast<__global__ DataType*>(this); } - -- __hostdev__ const DataType* data() const { return reinterpret_cast(this); } -+ __hostdev__ __global__ const DataType* data() const __global__ { return reinterpret_cast<__global__ const DataType*>(this); } - - /// @brief Return a const reference to the index bounding box of all the active values in this tree, i.e. in all nodes of the tree -- __hostdev__ const BBoxType& bbox() const { return DataType::mBBox; } -+ __hostdev__ __global__ const BBoxType& bbox() const __global__ { return BASE(mBBox); } - - /// @brief Return the total number of active voxels in the root and all its child nodes. - - /// @brief Return a const reference to the background value, i.e. the value associated with - /// any coordinate location that has not been set explicitly. -- __hostdev__ const ValueType& background() const { return DataType::mBackground; } -+ __hostdev__ __global__ const ValueType& background() const __global__ { return DataType::mBackground; } - - /// @brief Return the number of tiles encoded in this root node -- __hostdev__ const uint32_t& tileCount() const { return DataType::mTableSize; } -+ __hostdev__ __global__ const uint32_t& tileCount() const __global__ { return DataType::mTableSize; } - - /// @brief Return a const reference to the minimum active value encoded in this root node and any of its child nodes -- __hostdev__ const ValueType& minimum() const { return this->getMin(); } -+ __hostdev__ __global__ const ValueType& minimum() const __global__ { return this->getMin(); } - - /// @brief Return a const reference to the maximum active value encoded in this root node and any of its child nodes -- __hostdev__ const ValueType& maximum() const { return this->getMax(); } -+ __hostdev__ __global__ const ValueType& maximum() const __global__ { return this->getMax(); } - - /// @brief Return a const reference to the average of all the active values encoded in this root node and any of its child nodes -- __hostdev__ const FloatType& average() const { return DataType::mAverage; } -+ __hostdev__ __global__ const FloatType& average() const __global__ { return DataType::mAverage; } - - /// @brief Return the variance of all the active values encoded in this root node and any of its child nodes -- __hostdev__ FloatType variance() const { return DataType::mStdDevi * DataType::mStdDevi; } -+ __hostdev__ FloatType variance() const __global__ { return DataType::mStdDevi * DataType::mStdDevi; } - - /// @brief Return a const reference to the standard deviation of all the active values encoded in this root node and any of its child nodes -- __hostdev__ const FloatType& stdDeviation() const { return DataType::mStdDevi; } -+ __hostdev__ __global__ const FloatType& stdDeviation() const __global__ { return DataType::mStdDevi; } - - /// @brief Return the expected memory footprint in bytes with the specified number of tiles - __hostdev__ static uint64_t memUsage(uint32_t tableSize) { return sizeof(RootNode) + tableSize * sizeof(Tile); } - - /// @brief Return the actual memory footprint of this root node -- __hostdev__ uint64_t memUsage() const { return sizeof(RootNode) + DataType::mTableSize * sizeof(Tile); } -+ __hostdev__ uint64_t memUsage() const __global__ { return sizeof(RootNode) + DataType::mTableSize * sizeof(Tile); } - - /// @brief Return the value of the given voxel -- __hostdev__ ValueType getValue(const CoordType& ijk) const -+ __hostdev__ ValueType getValue(__global__ const CoordType& ijk) const __global__ - { -- if (const Tile* tile = this->probeTile(ijk)) { -+ if (__global__ const Tile* tile = this->probeTile(ijk)) { - return tile->isChild() ? this->getChild(tile)->getValue(ijk) : tile->value; - } - return DataType::mBackground; - } -- -- __hostdev__ bool isActive(const CoordType& ijk) const -+#if defined(__KERNEL_METAL__) -+ __hostdev__ ValueType getValue(__local__ const CoordType& ijk) const __global__ - { -- if (const Tile* tile = this->probeTile(ijk)) { -- return tile->isChild() ? this->getChild(tile)->isActive(ijk) : tile->state; -+ if (__global__ const Tile* tile = this->findTile(ijk)) { -+ return tile->isChild() ? this->getChild(tile)->getValue(ijk) : tile->value; -+ } -+ return DataType::mBackground; -+ } -+ __hostdev__ ValueType getValue(__local__ const CoordType& ijk) const __local__ -+ { -+ if (__global__ const Tile* tile = this->findTile(ijk)) { -+ return tile->isChild() ? this->getChild(tile)->getValue(ijk) : tile->value; -+ } -+ return DataType::mBackground; -+ } -+#endif -+ -+ __hostdev__ bool isActive(__global__ const CoordType& ijk) const __global__ -+ { -+ if (__global__ const Tile* tile = this->findTile(ijk)) { -+ return tile->isChild() ? BASE(getChild)(tile)->isActive(ijk) : tile->state; - } - return false; - } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ bool isActive(__local__ const CoordType& ijk) const __global__ -+ { -+ if (__global__ const Tile* tile = this->findTile(ijk)) { -+ return tile->isChild() ? BASE(getChild)(tile)->isActive(ijk) : tile->state; -+ } -+ return false; -+ } -+ __hostdev__ bool isActive(__local__ const CoordType& ijk) const __local__ -+ { -+ if (__global__ const Tile* tile = this->findTile(ijk)) { -+ return tile->isChild() ? BASE(getChild)(tile)->isActive(ijk) : tile->state; -+ } -+ return false; -+ } -+#endif - - /// @brief Return true if this RootNode is empty, i.e. contains no values or nodes -- __hostdev__ bool isEmpty() const { return DataType::mTableSize == uint32_t(0); } -+ __hostdev__ bool isEmpty() const __global__ { return BASE(mTableSize) == uint32_t(0); } - -- __hostdev__ bool probeValue(const CoordType& ijk, ValueType& v) const -+ __hostdev__ bool probeValue(__global__ const CoordType& ijk, __global__ ValueType& v) const __global__ - { -- if (const Tile* tile = this->probeTile(ijk)) { -+ if (__global__ const Tile* tile = this->probeTile(ijk)) { - if (tile->isChild()) { -- const auto *child = this->getChild(tile); -+ __global__ const auto *child = this->getChild(tile); - return child->probeValue(ijk, v); - } - v = tile->value; -@@ -3260,33 +3674,49 @@ public: - v = DataType::mBackground; - return false; - } -- -- __hostdev__ const LeafNodeType* probeLeaf(const CoordType& ijk) const -+#if defined(__KERNEL_METAL__) -+ __hostdev__ bool probeValue(__local__ const CoordType& ijk, __local__ ValueType& v) const __global__ - { -- const Tile* tile = this->probeTile(ijk); -+ if (__global__ const Tile* tile = this->findTile(ijk)) { -+ if (tile->isChild()) { -+ __global__ const auto *child = BASE(getChild)(tile); -+ return child->probeValue(ijk, v); -+ } -+ v = tile->value; -+ return tile->state; -+ } -+ v = BASE(mBackground); -+ return false; -+ } -+#endif -+ -+ __hostdev__ __global__ const LeafNodeType* probeLeaf(__global__ const CoordType& ijk) const -+ { -+ __global__ const Tile* tile = this->probeTile(ijk); - if (tile && tile->isChild()) { -- const auto *child = this->getChild(tile); -+ const __global__ auto *child = this->getChild(tile); - return child->probeLeaf(ijk); - } - return nullptr; - } - -- __hostdev__ const ChildNodeType* probeChild(const CoordType& ijk) const -+ __hostdev__ __global__ const ChildNodeType* probeChild(__global__ const CoordType& ijk) const - { -- const Tile* tile = this->probeTile(ijk); -+ __global__ const Tile* tile = this->probeTile(ijk); - if (tile && tile->isChild()) { - return this->getChild(tile); - } - return nullptr; - } - -+ - /// @brief Find and return a Tile of this root node -- __hostdev__ const Tile* probeTile(const CoordType& ijk) const -+ __hostdev__ __global__ const Tile* probeTile(__global__ const CoordType& ijk) const __global__ - { -- const Tile* tiles = reinterpret_cast(this + 1); -- const auto key = DataType::CoordToKey(ijk); -+ __global__ const Tile* tiles = reinterpret_cast<__global__ const Tile*>(this + 1); -+ const auto key = BASE(CoordToKey)(ijk); - #if 1 // switch between linear and binary seach -- for (uint32_t i = 0; i < DataType::mTableSize; ++i) { -+ for (uint32_t i = 0; i < BASE(mTableSize); ++i) { - if (tiles[i].key == key) return &tiles[i]; - } - #else// do not enable binary search if tiles are not guaranteed to be sorted!!!!!! -@@ -3306,6 +3736,33 @@ public: - #endif - return nullptr; - } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ __global__ const Tile* findTile(__local__ const CoordType& ijk) const __global__ -+ { -+ __global__ const Tile* tiles = reinterpret_cast<__global__ const Tile*>(this + 1); -+ const auto key = BASE(CoordToKey)(ijk); -+#if 1 // switch between linear and binary seach -+ for (uint32_t i = 0; i < BASE(mTableSize); ++i) { -+ if (tiles[i].key == key) return &tiles[i]; -+ } -+#else// do not enable binary search if tiles are not guaranteed to be sorted!!!!!! -+ // binary-search of pre-sorted elements -+ int32_t low = 0, high = DataType::mTableSize; // low is inclusive and high is exclusive -+ while (low != high) { -+ int mid = low + ((high - low) >> 1); -+ const Tile* tile = &tiles[mid]; -+ if (tile->key == key) { -+ return tile; -+ } else if (tile->key < key) { -+ low = mid + 1; -+ } else { -+ high = mid; -+ } -+ } -+#endif -+ return nullptr; -+ } -+#endif - - private: - static_assert(sizeof(DataType) % NANOVDB_DATA_ALIGNMENT == 0, "sizeof(RootData) is misaligned"); -@@ -3319,12 +3776,12 @@ private: - - /// @brief Private method to return node information and update a ReadAccessor - template -- __hostdev__ typename AccT::NodeInfo getNodeInfoAndCache(const CoordType& ijk, const AccT& acc) const -+ __hostdev__ typename AccT::NodeInfo getNodeInfoAndCache(__global__ const CoordType& ijk, __global__ const AccT& acc) const - { - using NodeInfoT = typename AccT::NodeInfo; -- if (const Tile* tile = this->probeTile(ijk)) { -+ if (__global__ const Tile* tile = this->probeTile(ijk)) { - if (tile->isChild()) { -- const auto *child = this->getChild(tile); -+ __global__ const auto *child = this->getChild(tile); - acc.insert(ijk, child); - return child->getNodeInfoAndCache(ijk, acc); - } -@@ -3337,11 +3794,11 @@ private: - - /// @brief Private method to return a voxel value and update a ReadAccessor - template -- __hostdev__ ValueType getValueAndCache(const CoordType& ijk, const AccT& acc) const -+ __hostdev__ ValueType getValueAndCache(__global__ const CoordType& ijk, __global__ const AccT& acc) const __global__ - { -- if (const Tile* tile = this->probeTile(ijk)) { -+ if (__global__ const Tile* tile = this->probeTile(ijk)) { - if (tile->isChild()) { -- const auto *child = this->getChild(tile); -+ __global__ const auto *child = this->getChild(tile); - acc.insert(ijk, child); - return child->getValueAndCache(ijk, acc); - } -@@ -3349,25 +3806,66 @@ private: - } - return DataType::mBackground; - } -+#if defined(__KERNEL_METAL__) -+ template -+ __hostdev__ ValueType getValueAndCache(__local__ const CoordType& ijk, __local__ const AccT& acc) const __global__ -+ { -+ if (__global__ const Tile* tile = this->findTile(ijk)) { -+ if (tile->isChild()) { -+ __global__ const auto *child = BASE(getChild)(tile); -+ acc.insert(ijk, child); -+ return child->getValueAndCache(ijk, acc); -+ } -+ return tile->value; -+ } -+ return BASE(mBackground); -+ } -+ template -+ __hostdev__ ValueType getValueAndCache(__local__ const CoordType& ijk, __local__ const AccT& acc) const __local__ -+ { -+ if (__global__ const Tile* tile = this->findTile(ijk)) { -+ if (tile->isChild()) { -+ __global__ const auto *child = BASE(getChild)(tile); -+ acc.insert(ijk, child); -+ return child->getValueAndCache(ijk, acc); -+ } -+ return tile->value; -+ } -+ return BASE(mBackground); -+ } -+#endif - - template -- __hostdev__ bool isActiveAndCache(const CoordType& ijk, const AccT& acc) const -+ __hostdev__ bool isActiveAndCache(__global__ const CoordType& ijk, __global__ const AccT& acc) const - { -- const Tile* tile = this->probeTile(ijk); -+ __global__ const Tile* tile = this->probeTile(ijk); - if (tile && tile->isChild()) { -- const auto *child = this->getChild(tile); -+ __global__ const auto *child = BASE(getChild)(tile); - acc.insert(ijk, child); - return child->isActiveAndCache(ijk, acc); - } - return false; - } -+#if defined(__KERNEL_METAL__) -+ template -+ __hostdev__ bool isActiveAndCache(__local__ const CoordType& ijk, __local__ const AccT& acc) const __global__ -+ { -+ __global__ const Tile* tile = this->findTile(ijk); -+ if (tile && tile->isChild()) { -+ __global__ const auto *child = BASE(getChild)(tile); -+ acc.insert(ijk, child); -+ return child->isActiveAndCache(ijk, acc); -+ } -+ return false; -+ } -+#endif - - template -- __hostdev__ bool probeValueAndCache(const CoordType& ijk, ValueType& v, const AccT& acc) const -+ __hostdev__ bool probeValueAndCache(__global__ const CoordType& ijk, __global__ ValueType& v, __global__ const AccT& acc) const - { -- if (const Tile* tile = this->probeTile(ijk)) { -+ if (__global__ const Tile* tile = this->probeTile(ijk)) { - if (tile->isChild()) { -- const auto *child = this->getChild(tile); -+ __global__ const auto *child = BASE(getChild)(tile); - acc.insert(ijk, child); - return child->probeValueAndCache(ijk, v, acc); - } -@@ -3379,11 +3877,11 @@ private: - } - - template -- __hostdev__ const LeafNodeType* probeLeafAndCache(const CoordType& ijk, const AccT& acc) const -+ __hostdev__ __global__ const LeafNodeType* probeLeafAndCache(__global__ const CoordType& ijk, __global__ const AccT& acc) const - { -- const Tile* tile = this->probeTile(ijk); -+ __global__ const Tile* tile = this->probeTile(ijk); - if (tile && tile->isChild()) { -- const auto *child = this->getChild(tile); -+ __global__ const auto *child = BASE(getChild)(tile); - acc.insert(ijk, child); - return child->probeLeafAndCache(ijk, acc); - } -@@ -3391,11 +3889,11 @@ private: - } - - template -- __hostdev__ uint32_t getDimAndCache(const CoordType& ijk, const RayT& ray, const AccT& acc) const -+ __hostdev__ uint32_t getDimAndCache(__global__ const CoordType& ijk, __global__ const RayT& ray, __global__ const AccT& acc) const __global__ - { -- if (const Tile* tile = this->probeTile(ijk)) { -+ if (__global__ const Tile* tile = this->probeTile(ijk)) { - if (tile->isChild()) { -- const auto *child = this->getChild(tile); -+ __global__ const auto *child = BASE(getChild)(tile); - acc.insert(ijk, child); - return child->getDimAndCache(ijk, ray, acc); - } -@@ -3403,7 +3901,23 @@ private: - } - return ChildNodeType::dim(); // background - } -+#if defined(__KERNEL_METAL__) -+ template -+ __hostdev__ uint32_t getDimAndCache(__local__ const CoordType& ijk, __local__ const RayT& ray, __local__ const AccT& acc) const __global__ -+ { -+ if (__global__ const Tile* tile = this->probeTile(ijk)) { -+ if (tile->isChild()) { -+ __global__ const auto *child = BASE(getChild)(tile); -+ acc.insert(ijk, child); -+ return child->getDimAndCache(ijk, ray, acc); -+ } -+ return 1 << ChildT::TOTAL; //tile value -+ } -+ return ChildNodeType::dim(); // background -+ } -+#endif - -+#undef BASE - }; // RootNode class - - // After the RootNode the memory layout is assumed to be the sorted Tiles -@@ -3421,7 +3935,7 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) InternalData - using StatsT = typename ChildT::FloatType; - using CoordT = typename ChildT::CoordType; - using MaskT = typename ChildT::template MaskType; -- static constexpr bool FIXED_SIZE = true; -+ static __constant__ constexpr bool FIXED_SIZE = true; - - union Tile - { -@@ -3429,8 +3943,8 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) InternalData - int64_t child;//signed 64 bit byte offset relative to the InternalData!! - /// @brief This class cannot be constructed or deleted - Tile() = delete; -- Tile(const Tile&) = delete; -- Tile& operator=(const Tile&) = delete; -+ Tile(__global__ const Tile&) = delete; -+ __global__ Tile& operator=(__global__ const Tile&) = delete; - ~Tile() = delete; - }; - -@@ -3456,32 +3970,32 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) InternalData - - __hostdev__ static uint64_t memUsage() { return sizeof(InternalData); } - -- __hostdev__ void setChild(uint32_t n, const void *ptr) -+ __hostdev__ void setChild(uint32_t n, __global__ const void *ptr) - { - NANOVDB_ASSERT(mChildMask.isOn(n)); - mTable[n].child = PtrDiff(ptr, this); - } - - template -- __hostdev__ void setValue(uint32_t n, const ValueT &v) -+ __hostdev__ void setValue(uint32_t n, __global__ const ValueT &v) - { - NANOVDB_ASSERT(!mChildMask.isOn(n)); - mTable[n].value = v; - } - - /// @brief Returns a pointer to the child node at the specifed linear offset. -- __hostdev__ ChildT* getChild(uint32_t n) -+ __hostdev__ __global__ ChildT* getChild(uint32_t n) __global__ - { - NANOVDB_ASSERT(mChildMask.isOn(n)); - return PtrAdd(this, mTable[n].child); - } -- __hostdev__ const ChildT* getChild(uint32_t n) const -+ __hostdev__ __global__ const ChildT* getChild(uint32_t n) const __global__ - { - NANOVDB_ASSERT(mChildMask.isOn(n)); - return PtrAdd(this, mTable[n].child); - } - -- __hostdev__ ValueT getValue(uint32_t n) const -+ __hostdev__ ValueT getValue(uint32_t n) const __global__ - { - NANOVDB_ASSERT(!mChildMask.isOn(n)); - return mTable[n].value; -@@ -3496,29 +4010,38 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) InternalData - __hostdev__ bool isChild(uint32_t n) const {return mChildMask.isOn(n);} - - template -- __hostdev__ void setOrigin(const T& ijk) { mBBox[0] = ijk; } -+ __hostdev__ void setOrigin(__global__ const T& ijk) { mBBox[0] = ijk; } - -- __hostdev__ const ValueT& getMin() const { return mMinimum; } -- __hostdev__ const ValueT& getMax() const { return mMaximum; } -- __hostdev__ const StatsT& average() const { return mAverage; } -- __hostdev__ const StatsT& stdDeviation() const { return mStdDevi; } -+ __hostdev__ __global__ const ValueT& getMin() const { return mMinimum; } -+ __hostdev__ __global__ const ValueT& getMax() const { return mMaximum; } -+ __hostdev__ __global__ const StatsT& average() const { return mAverage; } -+ __hostdev__ __global__ const StatsT& stdDeviation() const { return mStdDevi; } - -- __hostdev__ void setMin(const ValueT& v) { mMinimum = v; } -- __hostdev__ void setMax(const ValueT& v) { mMaximum = v; } -- __hostdev__ void setAvg(const StatsT& v) { mAverage = v; } -- __hostdev__ void setDev(const StatsT& v) { mStdDevi = v; } -+ __hostdev__ void setMin(__global__ const ValueT& v) { mMinimum = v; } -+ __hostdev__ void setMax(__global__ const ValueT& v) { mMaximum = v; } -+ __hostdev__ void setAvg(__global__ const StatsT& v) { mAverage = v; } -+ __hostdev__ void setDev(__global__ const StatsT& v) { mStdDevi = v; } - - /// @brief This class cannot be constructed or deleted - InternalData() = delete; -- InternalData(const InternalData&) = delete; -- InternalData& operator=(const InternalData&) = delete; -+ InternalData(__global__ const InternalData&) = delete; -+ __global__ InternalData& operator=(__global__ const InternalData&) = delete; - ~InternalData() = delete; - }; // InternalData - - /// @brief Internal nodes of a VDB treedim(), - template --class InternalNode : private InternalData -+class InternalNode -+#if !defined(__KERNEL_METAL__) -+ : private InternalData -+#endif - { -+#if defined(__KERNEL_METAL__) -+ InternalData _base; -+#define BASE(v) _base.v -+#else -+#define BASE(v) DataType::v -+#endif - public: - using DataType = InternalData; - using ValueType = typename DataType::ValueT; -@@ -3527,76 +4050,109 @@ public: - using LeafNodeType = typename ChildT::LeafNodeType; - using ChildNodeType = ChildT; - using CoordType = typename ChildT::CoordType; -- static constexpr bool FIXED_SIZE = DataType::FIXED_SIZE; -+ static __constant__ constexpr bool FIXED_SIZE = DataType::FIXED_SIZE; - template - using MaskType = typename ChildT::template MaskType; - template - using MaskIterT = typename Mask::template Iterator; - -- static constexpr uint32_t LOG2DIM = Log2Dim; -- static constexpr uint32_t TOTAL = LOG2DIM + ChildT::TOTAL; // dimension in index space -- static constexpr uint32_t DIM = 1u << TOTAL; // number of voxels along each axis of this node -- static constexpr uint32_t SIZE = 1u << (3 * LOG2DIM); // number of tile values (or child pointers) -- static constexpr uint32_t MASK = (1u << TOTAL) - 1u; -- static constexpr uint32_t LEVEL = 1 + ChildT::LEVEL; // level 0 = leaf -- static constexpr uint64_t NUM_VALUES = uint64_t(1) << (3 * TOTAL); // total voxel count represented by this node -+ static __constant__ constexpr uint32_t LOG2DIM = Log2Dim; -+ static __constant__ constexpr uint32_t TOTAL = LOG2DIM + ChildT::TOTAL; // dimension in index space -+ static __constant__ constexpr uint32_t DIM = 1u << TOTAL; // number of voxels along each axis of this node -+ static __constant__ constexpr uint32_t SIZE = 1u << (3 * LOG2DIM); // number of tile values (or child pointers) -+ static __constant__ constexpr uint32_t MASK = (1u << TOTAL) - 1u; -+ static __constant__ constexpr uint32_t LEVEL = 1 + ChildT::LEVEL; // level 0 = leaf -+ static __constant__ constexpr uint64_t NUM_VALUES = uint64_t(1) << (3 * TOTAL); // total voxel count represented by this node - - /// @brief Visits child nodes of this node only -- class ChildIterator : public MaskIterT -+ class ChildIterator -+#if !defined (__KERNEL_METAL__) -+ : public MaskIterT -+#endif - { -+#if defined (__KERNEL_METAL__) -+ MaskIterT BaseT; -+#define BASE(v) BaseT.v -+#else - using BaseT = MaskIterT; -- const DataType *mParent; -+#define BASE(v) BaseT::v -+#endif -+ __global__ const DataType *mParent; - public: - __hostdev__ ChildIterator() : BaseT(), mParent(nullptr) {} -- __hostdev__ ChildIterator(const InternalNode* parent) : BaseT(parent->data()->mChildMask.beginOn()), mParent(parent->data()) {} -- ChildIterator& operator=(const ChildIterator&) = default; -- __hostdev__ const ChildT& operator*() const {NANOVDB_ASSERT(*this); return *mParent->getChild(BaseT::pos());} -- __hostdev__ const ChildT* operator->() const {NANOVDB_ASSERT(*this); return mParent->getChild(BaseT::pos());} -+ __hostdev__ ChildIterator(__global__ const InternalNode* parent) : BaseT(parent->data()->mChildMask.beginOn()), mParent(parent->data()) {} -+ __global__ ChildIterator& operator=(__global__ const ChildIterator&) = default; -+ __hostdev__ __global__ const ChildT& operator*() const {NANOVDB_ASSERT(*this); return *mParent->getChild(BASE(pos)());} -+ __hostdev__ __global__ const ChildT* operator->() const {NANOVDB_ASSERT(*this); return mParent->getChild(BASE(pos)());} - __hostdev__ CoordType getOrigin() const { NANOVDB_ASSERT(*this); return (*this)->origin();} - }; // Member class ChildIterator - - ChildIterator beginChild() const {return ChildIterator(this);} - - /// @brief Visits all tile values in this node, i.e. both inactive and active tiles -- class ValueIterator : public MaskIterT -+ class ValueIterator -+#if !defined (__KERNEL_METAL__) -+ : public MaskIterT -+#endif - { -+#if defined (__KERNEL_METAL__) -+ MaskIterT BaseT; -+#define BASE(v) BaseT.v -+#else - using BaseT = MaskIterT; -- const InternalNode *mParent; -+#define BASE(v) BaseT::v -+#endif -+ __global__ const InternalNode *mParent; - public: - __hostdev__ ValueIterator() : BaseT(), mParent(nullptr) {} -- __hostdev__ ValueIterator(const InternalNode* parent) : BaseT(parent->data()->mChildMask.beginOff()), mParent(parent) {} -- ValueIterator& operator=(const ValueIterator&) = default; -- __hostdev__ ValueType operator*() const {NANOVDB_ASSERT(*this); return mParent->data()->getValue(BaseT::pos());} -- __hostdev__ CoordType getOrigin() const { NANOVDB_ASSERT(*this); return mParent->localToGlobalCoord(BaseT::pos());} -- __hostdev__ bool isActive() const { NANOVDB_ASSERT(*this); return mParent->data()->isActive(BaseT::mPos);} -+ __hostdev__ ValueIterator(__global__ const InternalNode* parent) : BaseT(parent->data()->mChildMask.beginOff()), mParent(parent) {} -+ __global__ ValueIterator& operator=(__global__ const ValueIterator&) = default; -+ __hostdev__ ValueType operator*() const {NANOVDB_ASSERT(*this); return mParent->data()->getValue(BASE(pos)());} -+ __hostdev__ CoordType getOrigin() const { NANOVDB_ASSERT(*this); return mParent->localToGlobalCoord(BASE(pos)());} -+ __hostdev__ bool isActive() const { NANOVDB_ASSERT(*this); return mParent->data()->isActive(BASE(mPos));} - }; // Member class ValueIterator - - ValueIterator beginValue() const {return ValueIterator(this);} - - /// @brief Visits active tile values of this node only -- class ValueOnIterator : public MaskIterT -+ class ValueOnIterator -+#if !defined (__KERNEL_METAL__) -+ : public MaskIterT -+#endif - { -+#if defined (__KERNEL_METAL__) -+ MaskIterT BaseT; -+#define BASE(v) BaseT.v -+#else - using BaseT = MaskIterT; -- const InternalNode *mParent; -+#define BASE(v) BaseT::v -+#endif -+ __global__ const InternalNode *mParent; - public: - __hostdev__ ValueOnIterator() : BaseT(), mParent(nullptr) {} -- __hostdev__ ValueOnIterator(const InternalNode* parent) : BaseT(parent->data()->mValueMask.beginOn()), mParent(parent) {} -- ValueOnIterator& operator=(const ValueOnIterator&) = default; -- __hostdev__ ValueType operator*() const {NANOVDB_ASSERT(*this); return mParent->data()->getValue(BaseT::pos());} -- __hostdev__ CoordType getOrigin() const { NANOVDB_ASSERT(*this); return mParent->localToGlobalCoord(BaseT::pos());} -+ __hostdev__ ValueOnIterator(__global__ const InternalNode* parent) : BaseT(parent->data()->mValueMask.beginOn()), mParent(parent) {} -+ __global__ ValueOnIterator& operator=(__global__ const ValueOnIterator&) = default; -+ __hostdev__ ValueType operator*() const {NANOVDB_ASSERT(*this); return mParent->data()->getValue(BASE(pos)());} -+ __hostdev__ CoordType getOrigin() const { NANOVDB_ASSERT(*this); return mParent->localToGlobalCoord(BASE(pos)());} - }; // Member class ValueOnIterator - - ValueOnIterator beginValueOn() const {return ValueOnIterator(this);} - -+#if defined(__KERNEL_METAL__) -+#define BASE(v) _base.v -+#else -+#define BASE(v) DataType::v -+#endif -+ - /// @brief This class cannot be constructed or deleted -- InternalNode() = delete; -- InternalNode(const InternalNode&) = delete; -- InternalNode& operator=(const InternalNode&) = delete; -+ InternalNode() __global__ = delete; -+ InternalNode(__global__ const InternalNode&) __global__ = delete; -+ __global__ InternalNode& operator=(__global__ const InternalNode&) __global__ = delete; - ~InternalNode() = delete; - -- __hostdev__ DataType* data() { return reinterpret_cast(this); } -+ __hostdev__ __global__ DataType* data() __global__ { return reinterpret_cast<__global__ DataType*>(this); } - -- __hostdev__ const DataType* data() const { return reinterpret_cast(this); } -+ __hostdev__ __global__ const DataType* data() const __global__ { return reinterpret_cast<__global__ const DataType*>(this); } - - /// @brief Return the dimension, in voxel units, of this internal node (typically 8*16 or 8*16*32) - __hostdev__ static uint32_t dim() { return 1u << TOTAL; } -@@ -3605,47 +4161,66 @@ public: - __hostdev__ static size_t memUsage() { return DataType::memUsage(); } - - /// @brief Return a const reference to the bit mask of active voxels in this internal node -- __hostdev__ const MaskType& valueMask() const { return DataType::mValueMask; } -+ __hostdev__ __global__ const MaskType& valueMask() const __global__ { return BASE(mValueMask); } - - /// @brief Return a const reference to the bit mask of child nodes in this internal node -- __hostdev__ const MaskType& childMask() const { return DataType::mChildMask; } -+ __hostdev__ __global__ const MaskType& childMask() const __global__ { return DataType::mChildMask; } - - /// @brief Return the origin in index space of this leaf node -- __hostdev__ CoordType origin() const { return DataType::mBBox.min() & ~MASK; } -+ __hostdev__ CoordType origin() const __global__ { return DataType::mBBox.min() & ~MASK; } - - /// @brief Return a const reference to the minimum active value encoded in this internal node and any of its child nodes -- __hostdev__ const ValueType& minimum() const { return this->getMin(); } -+ __hostdev__ __global__ const ValueType& minimum() const __global__ { return this->getMin(); } - - /// @brief Return a const reference to the maximum active value encoded in this internal node and any of its child nodes -- __hostdev__ const ValueType& maximum() const { return this->getMax(); } -+ __hostdev__ __global__ const ValueType& maximum() const __global__ { return this->getMax(); } - - /// @brief Return a const reference to the average of all the active values encoded in this internal node and any of its child nodes -- __hostdev__ const FloatType& average() const { return DataType::mAverage; } -+ __hostdev__ __global__ const FloatType& average() const __global__ { return DataType::mAverage; } - - /// @brief Return the variance of all the active values encoded in this internal node and any of its child nodes -- __hostdev__ FloatType variance() const { return DataType::mStdDevi*DataType::mStdDevi; } -+ __hostdev__ FloatType variance() const __global__ { return DataType::mStdDevi*DataType::mStdDevi; } - - /// @brief Return a const reference to the standard deviation of all the active values encoded in this internal node and any of its child nodes -- __hostdev__ const FloatType& stdDeviation() const { return DataType::mStdDevi; } -+ __hostdev__ __global__ const FloatType& stdDeviation() const __global__ { return DataType::mStdDevi; } - - /// @brief Return a const reference to the bounding box in index space of active values in this internal node and any of its child nodes -- __hostdev__ const BBox& bbox() const { return DataType::mBBox; } -+ __hostdev__ __global__ const BBox& bbox() const __global__ { return DataType::mBBox; } - - /// @brief Return the value of the given voxel -- __hostdev__ ValueType getValue(const CoordType& ijk) const -+ __hostdev__ ValueType getValue(__global__ const CoordType& ijk) const __global__ - { - const uint32_t n = CoordToOffset(ijk); - return DataType::mChildMask.isOn(n) ? this->getChild(n)->getValue(ijk) : DataType::getValue(n); - } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ ValueType getValue(__local__ const CoordType& ijk) const __global__ -+ { -+ const uint32_t n = CoordToOffset(ijk); -+ return DataType::mChildMask.isOn(n) ? this->getChild(n)->getValue(ijk) : DataType::mTable[n].value; -+ } -+#endif - -- __hostdev__ bool isActive(const CoordType& ijk) const -+ __hostdev__ bool isActive(__global__ const CoordType& ijk) const __global__ - { - const uint32_t n = CoordToOffset(ijk); - return DataType::mChildMask.isOn(n) ? this->getChild(n)->isActive(ijk) : DataType::isActive(n); - } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ bool isActive(__local__ const CoordType& ijk) const __global__ -+ { -+ const uint32_t n = CoordToOffset(ijk); -+ return DataType::mChildMask.isOn(n) ? this->getChild(n)->isActive(ijk) : DataType::isActive(n); -+ } -+ __hostdev__ bool isActive(__local__ const CoordType& ijk) const __local__ -+ { -+ const uint32_t n = CoordToOffset(ijk); -+ return DataType::mChildMask.isOn(n) ? this->getChild(n)->isActive(ijk) : DataType::isActive(n); -+ } -+#endif - - /// @brief return the state and updates the value of the specified voxel -- __hostdev__ bool probeValue(const CoordType& ijk, ValueType& v) const -+ __hostdev__ bool probeValue(__global__ const CoordType& ijk, __global__ ValueType& v) const __global__ - { - const uint32_t n = CoordToOffset(ijk); - if (DataType::mChildMask.isOn(n)) -@@ -3653,8 +4228,18 @@ public: - v = DataType::getValue(n); - return DataType::isActive(n); - } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ bool probeValue(__local__ const CoordType& ijk, __local__ ValueType& v) const __global__ -+ { -+ const uint32_t n = CoordToOffset(ijk); -+ if (DataType::mChildMask.isOn(n)) -+ return this->getChild(n)->probeValue(ijk, v); -+ v = DataType::getValue(n); -+ return DataType::isActive(n); -+ } -+#endif - -- __hostdev__ const LeafNodeType* probeLeaf(const CoordType& ijk) const -+ __hostdev__ __global__ const LeafNodeType* probeLeaf(__global__ const CoordType& ijk) const __global__ - { - const uint32_t n = CoordToOffset(ijk); - if (DataType::mChildMask.isOn(n)) -@@ -3662,14 +4247,14 @@ public: - return nullptr; - } - -- __hostdev__ const ChildNodeType* probeChild(const CoordType& ijk) const -+ __hostdev__ __global__ const ChildNodeType* probeChild(__global__ const CoordType& ijk) const __global__ - { - const uint32_t n = CoordToOffset(ijk); - return DataType::mChildMask.isOn(n) ? this->getChild(n) : nullptr; - } - - /// @brief Return the linear offset corresponding to the given coordinate -- __hostdev__ static uint32_t CoordToOffset(const CoordType& ijk) -+ __hostdev__ static uint32_t CoordToOffset(__global__ const CoordType& ijk) - { - #if 0 - return (((ijk[0] & MASK) >> ChildT::TOTAL) << (2 * LOG2DIM)) + -@@ -3681,6 +4266,20 @@ public: - ((ijk[2] & MASK) >> ChildT::TOTAL); - #endif - } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ static uint32_t CoordToOffset(__local__ const CoordType& ijk) -+ { -+#if 0 -+ return (((ijk[0] & MASK) >> ChildT::TOTAL) << (2 * LOG2DIM)) + -+ (((ijk[1] & MASK) >> ChildT::TOTAL) << (LOG2DIM)) + -+ ((ijk[2] & MASK) >> ChildT::TOTAL); -+#else -+ return (((ijk[0] & MASK) >> ChildT::TOTAL) << (2 * LOG2DIM)) | -+ (((ijk[1] & MASK) >> ChildT::TOTAL) << (LOG2DIM)) | -+ ((ijk[2] & MASK) >> ChildT::TOTAL); -+#endif -+ } -+#endif - - /// @return the local coordinate of the n'th tile or child node - __hostdev__ static Coord OffsetToLocalCoord(uint32_t n) -@@ -3691,13 +4290,13 @@ public: - } - - /// @brief modifies local coordinates to global coordinates of a tile or child node -- __hostdev__ void localToGlobalCoord(Coord& ijk) const -+ __hostdev__ void localToGlobalCoord(__global__ Coord& ijk) const __global__ - { - ijk <<= ChildT::TOTAL; - ijk += this->origin(); - } - -- __hostdev__ Coord offsetToGlobalCoord(uint32_t n) const -+ __hostdev__ Coord offsetToGlobalCoord(uint32_t n) const __global__ - { - Coord ijk = InternalNode::OffsetToLocalCoord(n); - this->localToGlobalCoord(ijk); -@@ -3705,13 +4304,24 @@ public: - } - - /// @brief Return true if this node or any of its child nodes contain active values -- __hostdev__ bool isActive() const -+ __hostdev__ bool isActive() const __global__ - { - return DataType::mFlags & uint32_t(2); - } -+#if defined(__KERNEL_METAL__) -+ /// @brief Retrun true if this node or any of its child nodes contain active values -+ __hostdev__ bool isActive() const __local__ -+ { -+ return DataType::mFlags & uint32_t(2); -+ } -+#endif - - private: -+#if !defined(__KERNEL_METAL__) - static_assert(sizeof(DataType) % NANOVDB_DATA_ALIGNMENT == 0, "sizeof(InternalData) is misaligned"); -+#else -+ static_assert(sizeof(_base) % NANOVDB_DATA_ALIGNMENT == 0, "sizeof(InternalData) is misaligned"); -+#endif - //static_assert(offsetof(DataType, mTable) % 32 == 0, "InternalData::mTable is misaligned"); - - template -@@ -3724,18 +4334,30 @@ private: - - /// @brief Private read access method used by the ReadAccessor - template -- __hostdev__ ValueType getValueAndCache(const CoordType& ijk, const AccT& acc) const -+ __hostdev__ ValueType getValueAndCache(__global__ const CoordType& ijk, __global__ const AccT& acc) const __global__ - { - const uint32_t n = CoordToOffset(ijk); - if (!DataType::mChildMask.isOn(n)) -- return DataType::getValue(n); -- const ChildT* child = this->getChild(n); -+ return BASE(getValue)(n); -+ __global__ const ChildT* child = BASE(getChild)(n); - acc.insert(ijk, child); - return child->getValueAndCache(ijk, acc); - } -+#if defined(__KERNEL_METAL__) -+ template -+ __hostdev__ ValueType getValueAndCache(__local__ const CoordType& ijk, __local__ const AccT& acc) const __global__ -+ { -+ const uint32_t n = CoordToOffset(ijk); -+ if (!BASE(mChildMask).isOn(n)) -+ return BASE(getValue)(n); -+ __global__ const ChildT* child = BASE(getChild)(n); -+ acc.insert(ijk, child); -+ return child->getValueAndCache(ijk, acc); -+ } -+#endif - - template -- __hostdev__ typename AccT::NodeInfo getNodeInfoAndCache(const CoordType& ijk, const AccT& acc) const -+ __hostdev__ typename AccT::NodeInfo getNodeInfoAndCache(__global__ const CoordType& ijk, __global__ const AccT& acc) const __global__ - { - using NodeInfoT = typename AccT::NodeInfo; - const uint32_t n = CoordToOffset(ijk); -@@ -3743,61 +4365,91 @@ private: - return NodeInfoT{LEVEL, this->dim(), this->minimum(), this->maximum(), this->average(), - this->stdDeviation(), this->bbox()[0], this->bbox()[1]}; - } -- const ChildT* child = this->getChild(n); -+ __global__ const ChildT* child = BASE(getChild)(n); - acc.insert(ijk, child); - return child->getNodeInfoAndCache(ijk, acc); - } - - template -- __hostdev__ bool isActiveAndCache(const CoordType& ijk, const AccT& acc) const -+ __hostdev__ bool isActiveAndCache(__global__ const CoordType& ijk, __global__ const AccT& acc) const __global__ - { - const uint32_t n = CoordToOffset(ijk); - if (!DataType::mChildMask.isOn(n)) - return DataType::isActive(n); -- const ChildT* child = this->getChild(n); -+ __global__ const ChildT* child = BASE(getChild)(n); - acc.insert(ijk, child); - return child->isActiveAndCache(ijk, acc); - } -+#if defined(__KERNEL_METAL__) -+ template -+ __hostdev__ bool isActiveAndCache(__local__ const CoordType& ijk, __local__ const AccT& acc) const __global__ -+ { -+ const uint32_t n = CoordToOffset(ijk); -+ if (!BASE(mChildMask).isOn(n)) -+ return BASE(mValueMask).isOn(n); -+ __global__ const ChildT* child = BASE(getChild)(n); -+ acc.insert(ijk, child); -+ return child->isActiveAndCache(ijk, acc); -+ } -+#endif - - template -- __hostdev__ bool probeValueAndCache(const CoordType& ijk, ValueType& v, const AccT& acc) const -+ __hostdev__ bool probeValueAndCache(__global__ const CoordType& ijk, __global__ ValueType& v, __global__ const AccT& acc) const __global__ - { - const uint32_t n = CoordToOffset(ijk); - if (!DataType::mChildMask.isOn(n)) { - v = DataType::getValue(n); - return DataType::isActive(n); - } -- const ChildT* child = this->getChild(n); -+ __global__ const ChildT* child = BASE(getChild)(n); - acc.insert(ijk, child); - return child->probeValueAndCache(ijk, v, acc); - } - - template -- __hostdev__ const LeafNodeType* probeLeafAndCache(const CoordType& ijk, const AccT& acc) const -+ __hostdev__ __global__ const LeafNodeType* probeLeafAndCache(__global__ const CoordType& ijk, __global__ const AccT& acc) const __global__ - { - const uint32_t n = CoordToOffset(ijk); - if (!DataType::mChildMask.isOn(n)) - return nullptr; -- const ChildT* child = this->getChild(n); -+ __global__ const ChildT* child = BASE(getChild)(n); - acc.insert(ijk, child); - return child->probeLeafAndCache(ijk, acc); - } - - template -- __hostdev__ uint32_t getDimAndCache(const CoordType& ijk, const RayT& ray, const AccT& acc) const -+ __hostdev__ uint32_t getDimAndCache(__global__ const CoordType& ijk, __global__ const RayT& ray, __global__ const AccT& acc) const __global__ - { - if (DataType::mFlags & uint32_t(1u)) return this->dim(); // skip this node if the 1st bit is set - //if (!ray.intersects( this->bbox() )) return 1<getChild(n); -+ __global__ const ChildT* child = BASE(getChild)(n); - acc.insert(ijk, child); - return child->getDimAndCache(ijk, ray, acc); - } - return ChildNodeType::dim(); // tile value - } -+#if defined(__KERNEL_METAL__) -+ template -+ __hostdev__ uint32_t getDimAndCache(__local__ const CoordType& ijk, __local__ const RayT& ray, __local__ const AccT& acc) const __global__ -+ { -+ if (BASE(mFlags) & uint32_t(1)) -+ this->dim(); //ship this node if first bit is set -+ //if (!ray.intersects( this->bbox() )) return 1<getDimAndCache(ijk, ray, acc); -+ } -+ return ChildNodeType::dim(); // tile value -+ } -+#endif -+ -+#undef BASE - }; // InternalNode class - - // --------------------------> LeafNode <------------------------------------ -@@ -3814,7 +4466,7 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) LeafData - using BuildType = ValueT; - using FloatType = typename FloatTraits::FloatType; - using ArrayType = ValueT;// type used for the internal mValue array -- static constexpr bool FIXED_SIZE = true; -+ static __constant__ constexpr bool FIXED_SIZE = true; - - CoordT mBBoxMin; // 12B. - uint8_t mBBoxDif[3]; // 3B. -@@ -3826,7 +4478,7 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) LeafData - FloatType mAverage; // typically 4B, average of all the active values in this node and its child nodes - FloatType mStdDevi; // typically 4B, standard deviation of all the active values in this node and its child nodes - alignas(32) ValueType mValues[1u << 3 * LOG2DIM]; -- -+ - /// @brief Return padding of this class in bytes, due to aliasing and 32B alignment - /// - /// @note The extra bytes are not necessarily at the end, but can come from aliasing of individual data members. -@@ -3838,32 +4490,35 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) LeafData - __hostdev__ static uint64_t memUsage() { return sizeof(LeafData); } - - //__hostdev__ const ValueType* values() const { return mValues; } -- __hostdev__ ValueType getValue(uint32_t i) const { return mValues[i]; } -- __hostdev__ void setValueOnly(uint32_t offset, const ValueType& value) { mValues[offset] = value; } -- __hostdev__ void setValue(uint32_t offset, const ValueType& value) -+ __hostdev__ ValueType getValue(uint32_t i) const __global__ { return mValues[i]; } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ ValueType getValue(uint32_t i) const __local__ { return mValues[i]; } -+#endif -+ __hostdev__ void setValueOnly(uint32_t offset, __global__ const ValueType& value) __global__ { mValues[offset] = value; } -+ __hostdev__ void setValue(uint32_t offset, __global__ const ValueType& value) __global__ - { - mValueMask.setOn(offset); - mValues[offset] = value; - } - -- __hostdev__ ValueType getMin() const { return mMinimum; } -- __hostdev__ ValueType getMax() const { return mMaximum; } -- __hostdev__ FloatType getAvg() const { return mAverage; } -- __hostdev__ FloatType getDev() const { return mStdDevi; } -+ __hostdev__ ValueType getMin() const __global__ { return mMinimum; } -+ __hostdev__ ValueType getMax() const __global__ { return mMaximum; } -+ __hostdev__ FloatType getAvg() const __global__ { return mAverage; } -+ __hostdev__ FloatType getDev() const __global__ { return mStdDevi; } - -- __hostdev__ void setMin(const ValueType& v) { mMinimum = v; } -- __hostdev__ void setMax(const ValueType& v) { mMaximum = v; } -- __hostdev__ void setAvg(const FloatType& v) { mAverage = v; } -- __hostdev__ void setDev(const FloatType& v) { mStdDevi = v; } -+ __hostdev__ void setMin(__global__ const ValueType& v) __global__ { mMinimum = v; } -+ __hostdev__ void setMax(__global__ const ValueType& v) __global__ { mMaximum = v; } -+ __hostdev__ void setAvg(__global__ const FloatType& v) __global__ { mAverage = v; } -+ __hostdev__ void setDev(__global__ const FloatType& v) __global__ { mStdDevi = v; } - - template -- __hostdev__ void setOrigin(const T& ijk) { mBBoxMin = ijk; } -+ __hostdev__ void setOrigin(__global__ const T& ijk) __global__ { mBBoxMin = ijk; } - - /// @brief This class cannot be constructed or deleted -- LeafData() = delete; -- LeafData(const LeafData&) = delete; -- LeafData& operator=(const LeafData&) = delete; -- ~LeafData() = delete; -+ LeafData() __global__ = delete; -+ LeafData(__global__ const LeafData&) __global__ = delete; -+ __global__ LeafData& operator=(__global__ const LeafData&) __global__ = delete; -+ ~LeafData() __global__ = delete; - }; // LeafData - - /// @brief Base-class for quantized float leaf nodes -@@ -3892,39 +4547,39 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) LeafFnBase - __hostdev__ static constexpr uint32_t padding() { - return sizeof(LeafFnBase) - (12 + 3 + 1 + sizeof(MaskT) + 2*4 + 4*2); - } -- __hostdev__ void init(float min, float max, uint8_t bitWidth) -+ __hostdev__ void init(float min, float max, uint8_t bitWidth) __global__ - { - mMinimum = min; - mQuantum = (max - min)/float((1 << bitWidth)-1); - } - - /// @brief return the quantized minimum of the active values in this node -- __hostdev__ float getMin() const { return mMin*mQuantum + mMinimum; } -+ __hostdev__ float getMin() const __global__ { return mMin*mQuantum + mMinimum; } - - /// @brief return the quantized maximum of the active values in this node -- __hostdev__ float getMax() const { return mMax*mQuantum + mMinimum; } -+ __hostdev__ float getMax() const __global__ { return mMax*mQuantum + mMinimum; } - - /// @brief return the quantized average of the active values in this node -- __hostdev__ float getAvg() const { return mAvg*mQuantum + mMinimum; } -+ __hostdev__ float getAvg() const __global__ { return mAvg*mQuantum + mMinimum; } - /// @brief return the quantized standard deviation of the active values in this node - - /// @note 0 <= StdDev <= max-min or 0 <= StdDev/(max-min) <= 1 -- __hostdev__ float getDev() const { return mDev*mQuantum; } -+ __hostdev__ float getDev() const __global__ { return mDev*mQuantum; } - - /// @note min <= X <= max or 0 <= (X-min)/(min-max) <= 1 -- __hostdev__ void setMin(float min) { mMin = uint16_t((min - mMinimum)/mQuantum + 0.5f); } -+ __hostdev__ void setMin(float min) __global__ { mMin = uint16_t((min - mMinimum)/mQuantum + 0.5f); } - - /// @note min <= X <= max or 0 <= (X-min)/(min-max) <= 1 -- __hostdev__ void setMax(float max) { mMax = uint16_t((max - mMinimum)/mQuantum + 0.5f); } -+ __hostdev__ void setMax(float max) __global__ { mMax = uint16_t((max - mMinimum)/mQuantum + 0.5f); } - - /// @note min <= avg <= max or 0 <= (avg-min)/(min-max) <= 1 -- __hostdev__ void setAvg(float avg) { mAvg = uint16_t((avg - mMinimum)/mQuantum + 0.5f); } -+ __hostdev__ void setAvg(float avg) __global__ { mAvg = uint16_t((avg - mMinimum)/mQuantum + 0.5f); } - - /// @note 0 <= StdDev <= max-min or 0 <= StdDev/(max-min) <= 1 -- __hostdev__ void setDev(float dev) { mDev = uint16_t(dev/mQuantum + 0.5f); } -+ __hostdev__ void setDev(float dev) __global__ { mDev = uint16_t(dev/mQuantum + 0.5f); } - - template -- __hostdev__ void setOrigin(const T& ijk) { mBBoxMin = ijk; } -+ __hostdev__ void setOrigin(__global__ const T& ijk) __global__ { mBBoxMin = ijk; } - };// LeafFnBase - - /// @brief Stuct with all the member data of the LeafNode (useful during serialization of an openvdb LeafNode) -@@ -3932,12 +4587,24 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) LeafFnBase - /// @note No client code should (or can) interface with this struct so it can safely be ignored! - template class MaskT, uint32_t LOG2DIM> - struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) LeafData -+#if !defined(__KERNEL_METAL__) - : public LeafFnBase -+#endif - { -+#if defined(__KERNEL_METAL__) -+ LeafFnBase _base; -+#define BASE(v) _base.v -+#else -+#define BASE(v) BaseT::v -+#endif - using BaseT = LeafFnBase; - using BuildType = Fp4; - using ArrayType = uint8_t;// type used for the internal mValue array -- static constexpr bool FIXED_SIZE = true; -+#if defined(__KERNEL_METAL__) -+ using ValueType = typename BaseT::ValueType; -+ using FloatType = typename BaseT::FloatType; -+#endif -+ static __constant__ constexpr bool FIXED_SIZE = true; - alignas(32) uint8_t mCode[1u << (3 * LOG2DIM - 1)];// LeafFnBase is 32B aligned and so is mCode - - __hostdev__ static constexpr uint64_t memUsage() { return sizeof(LeafData); } -@@ -3947,31 +4614,53 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) LeafData>1]; - return ( (i&1) ? c >> 4 : c & uint8_t(15) )*BaseT::mQuantum + BaseT::mMinimum; - #else -- return ((mCode[i>>1] >> ((i&1)<<2)) & uint8_t(15))*BaseT::mQuantum + BaseT::mMinimum; -+ return ((mCode[i>>1] >> ((i&1)<<2)) & uint8_t(15))*BASE(mQuantum) + BASE(mMinimum); - #endif - } -+#endif -+#if defined(__KERNEL_METAL__) -+__hostdev__ float getValue(uint32_t i) const __local__ -+ { -+#if 0 -+ const uint8_t c = mCode[i>>1]; -+ return ( (i&1) ? c >> 4 : c & uint8_t(15) )*BaseT::mQuantum + BaseT::mMinimum; -+#else -+ return ((mCode[i>>1] >> ((i&1)<<2)) & uint8_t(15))*BASE(mQuantum) + BASE(mMinimum); -+#endif -+ } -+#endif - - /// @brief This class cannot be constructed or deleted -- LeafData() = delete; -- LeafData(const LeafData&) = delete; -- LeafData& operator=(const LeafData&) = delete; -- ~LeafData() = delete; -+ LeafData() __global__ = delete; -+ LeafData(__global__ const LeafData&) __global__ = delete; -+ __global__ LeafData& operator=(__global__ const LeafData&) __global__ = delete; -+ ~LeafData() __global__ = delete; -+#undef BASE - }; // LeafData - - template class MaskT, uint32_t LOG2DIM> - struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) LeafData -+#if !defined(__KERNEL_METAL__) - : public LeafFnBase -+#endif - { -+#if defined(__KERNEL_METAL__) -+ LeafFnBase _base; -+#define BASE(v) _base.v -+#else -+#define BASE(v) BaseT::v -+#endif - using BaseT = LeafFnBase; - using BuildType = Fp8; - using ArrayType = uint8_t;// type used for the internal mValue array -- static constexpr bool FIXED_SIZE = true; -+ static __constant__ constexpr bool FIXED_SIZE = true; - alignas(32) uint8_t mCode[1u << 3 * LOG2DIM]; - __hostdev__ static constexpr int64_t memUsage() { return sizeof(LeafData); } - __hostdev__ static constexpr uint32_t padding() { -@@ -3980,25 +4669,44 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) LeafData - - template class MaskT, uint32_t LOG2DIM> - struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) LeafData -+#if !defined(__KERNEL_METAL__) - : public LeafFnBase -+#endif - { -+#if defined(__KERNEL_METAL__) -+ LeafFnBase _base; -+#define BASE(v) _base.v -+#else -+#define BASE(v) BaseT::v -+#endif - using BaseT = LeafFnBase; - using BuildType = Fp16; - using ArrayType = uint16_t;// type used for the internal mValue array -- static constexpr bool FIXED_SIZE = true; -+#if defined(__KERNEL_METAL__) -+ using ValueType = typename BaseT::ValueType; -+ using FloatType = typename BaseT::FloatType; -+#endif -+ static __constant__ constexpr bool FIXED_SIZE = true; - alignas(32) uint16_t mCode[1u << 3 * LOG2DIM]; - - __hostdev__ static constexpr uint64_t memUsage() { return sizeof(LeafData); } -@@ -4008,35 +4716,93 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) LeafData - - template class MaskT, uint32_t LOG2DIM> - struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) LeafData -+#if !defined(__KERNEL_METAL__) - : public LeafFnBase -+#endif - {// this class has no data members, however every instance is immediately followed - // bitWidth*64 bytes. Since its base class is 32B aligned so are the bitWidth*64 bytes -+#if defined(__KERNEL_METAL__) -+ LeafFnBase _base; -+#define BASE(v) _base.v -+#else -+#define BASE(v) BaseT::v -+#endif - using BaseT = LeafFnBase; - using BuildType = FpN; -- static constexpr bool FIXED_SIZE = false; -+ static __constant__ constexpr bool FIXED_SIZE = false; -+#if defined(__KERNEL_METAL__) -+ using ValueType = typename BaseT::ValueType; -+ using FloatType = typename BaseT::FloatType; -+#endif - __hostdev__ static constexpr uint32_t padding() { - static_assert(BaseT::padding()==0, "expected no padding in LeafFnBase"); - return 0; - } - -- __hostdev__ uint8_t bitWidth() const { return 1 << (BaseT::mFlags >> 5); }// 4,8,16,32 = 2^(2,3,4,5) -- __hostdev__ size_t memUsage() const { return sizeof(*this) + this->bitWidth()*64; } -+ __hostdev__ uint8_t bitWidth() const __global__ { return 1 << (BaseT::mFlags >> 5); }// 4,8,16,32 = 2^(2,3,4,5) -+ __hostdev__ size_t memUsage() const __global__ { return sizeof(*this) + this->bitWidth()*64; } - __hostdev__ static size_t memUsage(uint32_t bitWidth) { return 96u + bitWidth*64; } -- __hostdev__ float getValue(uint32_t i) const -+ __hostdev__ float getValue(uint32_t i) const __global__ -+ { -+#ifdef NANOVDB_FPN_BRANCHLESS// faster -+ const int b = BASE(mFlags) >> 5;// b = 0, 1, 2, 3, 4 corresponding to 1, 2, 4, 8, 16 bits -+#if 0// use LUT -+ uint16_t code = reinterpret_cast(this + 1)[i >> (4 - b)]; -+ const static uint8_t shift[5] = {15, 7, 3, 1, 0}; -+ const static uint16_t mask[5] = {1, 3, 15, 255, 65535}; -+ code >>= (i & shift[b]) << b; -+ code &= mask[b]; -+#else// no LUT -+ uint32_t code = reinterpret_cast<__global__ const uint32_t*>(this + 1)[i >> (5 - b)]; -+ //code >>= (i & ((16 >> b) - 1)) << b; -+ code >>= (i & ((32 >> b) - 1)) << b; -+ code &= (1 << (1 << b)) - 1; -+#endif -+#else// use branched version (slow) -+ float code; -+ __global__ auto *values = reinterpret_cast(this+1); -+ switch (BaseT::mFlags >> 5) { -+ case 0u:// 1 bit float -+ code = float((values[i>>3] >> (i&7) ) & uint8_t(1)); -+ break; -+ case 1u:// 2 bits float -+ code = float((values[i>>2] >> ((i&3)<<1)) & uint8_t(3)); -+ break; -+ case 2u:// 4 bits float -+ code = float((values[i>>1] >> ((i&1)<<2)) & uint8_t(15)); -+ break; -+ case 3u:// 8 bits float -+ code = float(values[i]); -+ break; -+ default:// 16 bits float -+ code = float(reinterpret_cast(values)[i]); -+ } -+#endif -+ return float(code) * BASE(mQuantum) + BASE(mMinimum);// code * (max-min)/UNITS + min -+ } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ float getValue(uint32_t i) const __local__ - { - #ifdef NANOVDB_FPN_BRANCHLESS// faster - const int b = BaseT::mFlags >> 5;// b = 0, 1, 2, 3, 4 corresponding to 1, 2, 4, 8, 16 bits -@@ -4047,14 +4813,14 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) LeafData>= (i & shift[b]) << b; - code &= mask[b]; - #else// no LUT -- uint32_t code = reinterpret_cast(this + 1)[i >> (5 - b)]; -+ uint32_t code = reinterpret_cast<__global__ const uint32_t*>(this + 1)[i >> (5 - b)]; - //code >>= (i & ((16 >> b) - 1)) << b; - code >>= (i & ((32 >> b) - 1)) << b; - code &= (1 << (1 << b)) - 1; - #endif - #else// use branched version (slow) - float code; -- auto *values = reinterpret_cast(this+1); -+ __global__ auto *values = reinterpret_cast(this+1); - switch (BaseT::mFlags >> 5) { - case 0u:// 1 bit float - code = float((values[i>>3] >> (i&7) ) & uint8_t(1)); -@@ -4074,12 +4840,15 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) LeafData - - // Partial template specialization of LeafData with bool -@@ -4092,7 +4861,7 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) LeafData;// type used for the internal mValue array -- static constexpr bool FIXED_SIZE = true; -+ static __constant__ constexpr bool FIXED_SIZE = true; - - CoordT mBBoxMin; // 12B. - uint8_t mBBoxDif[3]; // 3B. -@@ -4104,31 +4873,34 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) LeafData) - 16u;} - __hostdev__ static uint64_t memUsage() { return sizeof(LeafData); } - -- //__hostdev__ const ValueType* values() const { return nullptr; } -- __hostdev__ bool getValue(uint32_t i) const { return mValues.isOn(i); } -- __hostdev__ bool getMin() const { return false; }// dummy -- __hostdev__ bool getMax() const { return false; }// dummy -- __hostdev__ bool getAvg() const { return false; }// dummy -- __hostdev__ bool getDev() const { return false; }// dummy -- __hostdev__ void setValue(uint32_t offset, bool v) -+ //__hostdev__ __global__ const ValueType* values() const __global__ { return nullptr; } -+ __hostdev__ bool getValue(uint32_t i) const __global__ { return mValues.isOn(i); } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ bool getValue(uint32_t i) const __local__ { return mValues.isOn(i); } -+#endif -+ __hostdev__ bool getMin() const __global__ { return false; }// dummy -+ __hostdev__ bool getMax() const __global__ { return false; }// dummy -+ __hostdev__ bool getAvg() const __global__ { return false; }// dummy -+ __hostdev__ bool getDev() const __global__ { return false; }// dummy -+ __hostdev__ void setValue(uint32_t offset, bool v) __global__ - { - mValueMask.setOn(offset); - mValues.set(offset, v); - } - -- __hostdev__ void setMin(const bool&) {}// no-op -- __hostdev__ void setMax(const bool&) {}// no-op -- __hostdev__ void setAvg(const bool&) {}// no-op -- __hostdev__ void setDev(const bool&) {}// no-op -+ __hostdev__ void setMin(__global__ const bool&) __global__ {}// no-op -+ __hostdev__ void setMax(__global__ const bool&) __global__ {}// no-op -+ __hostdev__ void setAvg(__global__ const bool&) __global__ {}// no-op -+ __hostdev__ void setDev(__global__ const bool&) __global__ {}// no-op - - template -- __hostdev__ void setOrigin(const T& ijk) { mBBoxMin = ijk; } -+ __hostdev__ void setOrigin(__global__ const T& ijk) __global__ { mBBoxMin = ijk; } - - /// @brief This class cannot be constructed or deleted -- LeafData() = delete; -- LeafData(const LeafData&) = delete; -- LeafData& operator=(const LeafData&) = delete; -- ~LeafData() = delete; -+ LeafData() __global__ = delete; -+ LeafData(__global__ const LeafData&) __global__ = delete; -+ __global__ LeafData& operator=(__global__ const LeafData&) __global__ = delete; -+ ~LeafData() __global__ = delete; - }; // LeafData - - // Partial template specialization of LeafData with ValueMask -@@ -4141,7 +4913,7 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) LeafData -- __hostdev__ void setOrigin(const T& ijk) { mBBoxMin = ijk; } -+ __hostdev__ void setOrigin(__global__ const T& ijk) __global__ { mBBoxMin = ijk; } - - /// @brief This class cannot be constructed or deleted -- LeafData() = delete; -- LeafData(const LeafData&) = delete; -- LeafData& operator=(const LeafData&) = delete; -- ~LeafData() = delete; -+ LeafData() __global__ = delete; -+ LeafData(__global__ const LeafData&) __global__ = delete; -+ __global__ LeafData& operator=(__global__ const LeafData&) __global__ = delete; -+ ~LeafData() __global__ = delete; - }; // LeafData - - // Partial template specialization of LeafData with ValueIndex -@@ -4191,7 +4966,7 @@ struct NANOVDB_ALIGN(NANOVDB_DATA_ALIGNMENT) LeafData -- __hostdev__ void setMin(const T &min, T *p) { NANOVDB_ASSERT(mStatsOff); p[mStatsOff + 0] = min; } -+ __hostdev__ void setMin(__global__ const T &min, __global__ T *p) __global__ { NANOVDB_ASSERT(mStatsOff); p[mStatsOff + 0] = min; } - template -- __hostdev__ void setMax(const T &max, T *p) { NANOVDB_ASSERT(mStatsOff); p[mStatsOff + 1] = max; } -+ __hostdev__ void setMax(__global__ const T &max, __global__ T *p) __global__ { NANOVDB_ASSERT(mStatsOff); p[mStatsOff + 1] = max; } - template -- __hostdev__ void setAvg(const T &avg, T *p) { NANOVDB_ASSERT(mStatsOff); p[mStatsOff + 2] = avg; } -+ __hostdev__ void setAvg(__global__ const T &avg, __global__ T *p) __global__ { NANOVDB_ASSERT(mStatsOff); p[mStatsOff + 2] = avg; } - template -- __hostdev__ void setDev(const T &dev, T *p) { NANOVDB_ASSERT(mStatsOff); p[mStatsOff + 3] = dev; } -+ __hostdev__ void setDev(__global__ const T &dev, __global__ T *p) __global__ { NANOVDB_ASSERT(mStatsOff); p[mStatsOff + 3] = dev; } - template -- __hostdev__ void setOrigin(const T &ijk) { mBBoxMin = ijk; } -+ __hostdev__ void setOrigin(__global__ const T &ijk) __global__ { mBBoxMin = ijk; } - - /// @brief This class cannot be constructed or deleted -- LeafData() = delete; -- LeafData(const LeafData&) = delete; -- LeafData& operator=(const LeafData&) = delete; -- ~LeafData() = delete; -+ LeafData() __global__ = delete; -+ LeafData(__global__ const LeafData&) __global__ = delete; -+ __global__ LeafData& operator=(__global__ const LeafData&) __global__ = delete; -+ ~LeafData() __global__ = delete; - }; // LeafData - - /// @brief Leaf nodes of the VDB tree. (defaults to 8x8x8 = 512 voxels) -@@ -4248,13 +5031,22 @@ template class MaskT = Mask, - uint32_t Log2Dim = 3> --class LeafNode : private LeafData -+class LeafNode -+#if !defined(__KERNEL_METAL__) -+ : private LeafData -+#endif - { -+#if defined(__KERNEL_METAL__) -+ LeafData _base; -+#define BASE(v) _base.v -+#else -+#define BASE(v) DataType::v -+#endif - public: - struct ChildNodeType - { -- static constexpr uint32_t TOTAL = 0; -- static constexpr uint32_t DIM = 1; -+ static __constant__ constexpr uint32_t TOTAL = 0; -+ static __constant__ constexpr uint32_t DIM = 1; - __hostdev__ static uint32_t dim() { return 1u; } - }; // Voxel - using LeafNodeType = LeafNode; -@@ -4263,38 +5055,56 @@ public: - using FloatType = typename DataType::FloatType; - using BuildType = typename DataType::BuildType; - using CoordType = CoordT; -- static constexpr bool FIXED_SIZE = DataType::FIXED_SIZE; -+ static __constant__ constexpr bool FIXED_SIZE = DataType::FIXED_SIZE; - template - using MaskType = MaskT; - template - using MaskIterT = typename Mask::template Iterator; - - /// @brief Visits all active values in a leaf node -- class ValueOnIterator : public MaskIterT -+ class ValueOnIterator -+#if !defined (__KERNEL_METAL__) -+ : public MaskIterT -+#endif - { -+#if defined(__KERNEL_METAL__) -+ MaskIterT BaseT; -+#define BASE(v) BaseT.v -+#else - using BaseT = MaskIterT; -- const LeafNode *mParent; -+#define BASE(v) BaseT::v -+#endif -+ __global__ const LeafNode *mParent; - public: - __hostdev__ ValueOnIterator() : BaseT(), mParent(nullptr) {} -- __hostdev__ ValueOnIterator(const LeafNode* parent) : BaseT(parent->data()->mValueMask.beginOn()), mParent(parent) {} -- ValueOnIterator& operator=(const ValueOnIterator&) = default; -- __hostdev__ ValueType operator*() const {NANOVDB_ASSERT(*this); return mParent->getValue(BaseT::pos());} -- __hostdev__ CoordT getCoord() const { NANOVDB_ASSERT(*this); return mParent->offsetToGlobalCoord(BaseT::pos());} -+ __hostdev__ ValueOnIterator(__global__ const LeafNode* parent) : BaseT(parent->data()->mValueMask.beginOn()), mParent(parent) {} -+ __global__ ValueOnIterator& operator=(__global__ const ValueOnIterator&) = default; -+ __hostdev__ ValueType operator*() const {NANOVDB_ASSERT(*this); return mParent->getValue(BASE(pos)());} -+ __hostdev__ CoordT getCoord() const { NANOVDB_ASSERT(*this); return mParent->offsetToGlobalCoord(BASE(pos)());} - }; // Member class ValueOnIterator - - ValueOnIterator beginValueOn() const {return ValueOnIterator(this);} - - /// @brief Visits all inactive values in a leaf node -- class ValueOffIterator : public MaskIterT -+ class ValueOffIterator -+#if !defined (__KERNEL_METAL__) -+ : public MaskIterT -+#endif - { -+#if defined(__KERNEL_METAL__) -+ MaskIterT BaseT; -+#define BASE(v) BaseT.v -+#else - using BaseT = MaskIterT; -- const LeafNode *mParent; -+#define BASE(v) BaseT::v -+#endif -+ __global__ const LeafNode *mParent; - public: - __hostdev__ ValueOffIterator() : BaseT(), mParent(nullptr) {} -- __hostdev__ ValueOffIterator(const LeafNode* parent) : BaseT(parent->data()->mValueMask.beginOff()), mParent(parent) {} -- ValueOffIterator& operator=(const ValueOffIterator&) = default; -- __hostdev__ ValueType operator*() const {NANOVDB_ASSERT(*this); return mParent->getValue(BaseT::pos());} -- __hostdev__ CoordT getCoord() const { NANOVDB_ASSERT(*this); return mParent->offsetToGlobalCoord(BaseT::pos());} -+ __hostdev__ ValueOffIterator(__global__ const LeafNode* parent) : BaseT(parent->data()->mValueMask.beginOff()), mParent(parent) {} -+ __global__ ValueOffIterator& operator=(__global__ const ValueOffIterator&) = default; -+ __hostdev__ ValueType operator*() const {NANOVDB_ASSERT(*this); return mParent->getValue(BASE(pos)());} -+ __hostdev__ CoordT getCoord() const { NANOVDB_ASSERT(*this); return mParent->offsetToGlobalCoord(BASE(pos)());} - }; // Member class ValueOffIterator - - ValueOffIterator beginValueOff() const {return ValueOffIterator(this);} -@@ -4302,17 +5112,17 @@ public: - /// @brief Visits all values in a leaf node, i.e. both active and inactive values - class ValueIterator - { -- const LeafNode *mParent; -+ __global__ const LeafNode *mParent; - uint32_t mPos; - public: - __hostdev__ ValueIterator() : mParent(nullptr), mPos(1u << 3 * Log2Dim) {} -- __hostdev__ ValueIterator(const LeafNode* parent) : mParent(parent), mPos(0) {NANOVDB_ASSERT(parent);} -- ValueIterator& operator=(const ValueIterator&) = default; -+ __hostdev__ ValueIterator(__global__ const LeafNode* parent) : mParent(parent), mPos(0) {NANOVDB_ASSERT(parent);} -+ __global__ ValueIterator& operator=(__global__ const ValueIterator&) = default; - __hostdev__ ValueType operator*() const { NANOVDB_ASSERT(*this); return mParent->getValue(mPos);} - __hostdev__ CoordT getCoord() const { NANOVDB_ASSERT(*this); return mParent->offsetToGlobalCoord(mPos);} - __hostdev__ bool isActive() const { NANOVDB_ASSERT(*this); return mParent->isActive(mPos);} - __hostdev__ operator bool() const {return mPos < (1u << 3 * Log2Dim);} -- __hostdev__ ValueIterator& operator++() {++mPos; return *this;} -+ __hostdev__ __global__ ValueIterator& operator++() {++mPos; return *this;} - __hostdev__ ValueIterator operator++(int) { - auto tmp = *this; - ++(*this); -@@ -4320,43 +5130,49 @@ public: - } - }; // Member class ValueIterator - -+#if defined(__KERNEL_METAL__) -+#define BASE(v) _base.v -+#else -+#define BASE(v) DataType::v -+#endif -+ - ValueIterator beginValue() const {return ValueIterator(this);} - - static_assert(is_same::Type>::value, "Mismatching BuildType"); -- static constexpr uint32_t LOG2DIM = Log2Dim; -- static constexpr uint32_t TOTAL = LOG2DIM; // needed by parent nodes -- static constexpr uint32_t DIM = 1u << TOTAL; // number of voxels along each axis of this node -- static constexpr uint32_t SIZE = 1u << 3 * LOG2DIM; // total number of voxels represented by this node -- static constexpr uint32_t MASK = (1u << LOG2DIM) - 1u; // mask for bit operations -- static constexpr uint32_t LEVEL = 0; // level 0 = leaf -- static constexpr uint64_t NUM_VALUES = uint64_t(1) << (3 * TOTAL); // total voxel count represented by this node -+ static __constant__ constexpr uint32_t LOG2DIM = Log2Dim; -+ static __constant__ constexpr uint32_t TOTAL = LOG2DIM; // needed by parent nodes -+ static __constant__ constexpr uint32_t DIM = 1u << TOTAL; // number of voxels along each axis of this node -+ static __constant__ constexpr uint32_t SIZE = 1u << 3 * LOG2DIM; // total number of voxels represented by this node -+ static __constant__ constexpr uint32_t MASK = (1u << LOG2DIM) - 1u; // mask for bit operations -+ static __constant__ constexpr uint32_t LEVEL = 0; // level 0 = leaf -+ static __constant__ constexpr uint64_t NUM_VALUES = uint64_t(1) << (3 * TOTAL); // total voxel count represented by this node - -- __hostdev__ DataType* data() { return reinterpret_cast(this); } -+ __hostdev__ __global__ DataType* data() __global__ { return reinterpret_cast<__global__ DataType*>(this); } - -- __hostdev__ const DataType* data() const { return reinterpret_cast(this); } -+ __hostdev__ __global__ const DataType* data() __global__ const { return reinterpret_cast<__global__ const DataType*>(this); } - - /// @brief Return a const reference to the bit mask of active voxels in this leaf node -- __hostdev__ const MaskType& valueMask() const { return DataType::mValueMask; } -+ __hostdev__ __global__ const MaskType& valueMask() const __global__ { return DataType::mValueMask; } - - /// @brief Return a const reference to the minimum active value encoded in this leaf node -- __hostdev__ ValueType minimum() const { return this->getMin(); } -+ __hostdev__ ValueType minimum() const __global__ { return this->getMin(); } - - /// @brief Return a const reference to the maximum active value encoded in this leaf node -- __hostdev__ ValueType maximum() const { return this->getMax(); } -+ __hostdev__ ValueType maximum() const __global__ { return this->getMax(); } - - /// @brief Return a const reference to the average of all the active values encoded in this leaf node -- __hostdev__ FloatType average() const { return DataType::getAvg(); } -+ __hostdev__ FloatType average() const __global__ { return DataType::getAvg(); } - - /// @brief Return the variance of all the active values encoded in this leaf node -- __hostdev__ FloatType variance() const { return DataType::getDev()*DataType::getDev(); } -+ __hostdev__ FloatType variance() const __global__ { return DataType::getDev()*DataType::getDev(); } - - /// @brief Return a const reference to the standard deviation of all the active values encoded in this leaf node -- __hostdev__ FloatType stdDeviation() const { return DataType::getDev(); } -+ __hostdev__ FloatType stdDeviation() const __global__ { return DataType::getDev(); } - -- __hostdev__ uint8_t flags() const { return DataType::mFlags; } -+ __hostdev__ uint8_t flags() const __global__ { return DataType::mFlags; } - - /// @brief Return the origin in index space of this leaf node -- __hostdev__ CoordT origin() const { return DataType::mBBoxMin & ~MASK; } -+ __hostdev__ CoordT origin() const __global__ { return DataType::mBBoxMin & ~MASK; } - - __hostdev__ static CoordT OffsetToLocalCoord(uint32_t n) - { -@@ -4366,9 +5182,9 @@ public: - } - - /// @brief Converts (in place) a local index coordinate to a global index coordinate -- __hostdev__ void localToGlobalCoord(Coord& ijk) const { ijk += this->origin(); } -+ __hostdev__ void localToGlobalCoord(__global__ Coord& ijk) const __global__ { ijk += this->origin(); } - -- __hostdev__ CoordT offsetToGlobalCoord(uint32_t n) const -+ __hostdev__ CoordT offsetToGlobalCoord(uint32_t n) const __global__ - { - return OffsetToLocalCoord(n) + this->origin(); - } -@@ -4377,7 +5193,7 @@ public: - __hostdev__ static uint32_t dim() { return 1u << LOG2DIM; } - - /// @brief Return the bounding box in index space of active values in this leaf node -- __hostdev__ BBox bbox() const -+ __hostdev__ BBox bbox() const __global__ - { - BBox bbox(DataType::mBBoxMin, DataType::mBBoxMin); - if ( this->hasBBox() ) { -@@ -4399,54 +5215,85 @@ public: - __hostdev__ uint64_t memUsage() { return DataType::memUsage(); } - - /// @brief This class cannot be constructed or deleted -- LeafNode() = delete; -- LeafNode(const LeafNode&) = delete; -- LeafNode& operator=(const LeafNode&) = delete; -- ~LeafNode() = delete; -+ LeafNode() __global__ = delete; -+ LeafNode(__global__ const LeafNode&) __global__ = delete; -+ __global__ LeafNode& operator=(__global__ const LeafNode&) __global__ = delete; -+ ~LeafNode() __global__ = delete; - - /// @brief Return the voxel value at the given offset. -- __hostdev__ ValueType getValue(uint32_t offset) const { return DataType::getValue(offset); } -+ -+ __hostdev__ ValueType getValue(uint32_t offset) const __global__ { return DataType::getValue(offset); } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ ValueType getValue(uint32_t offset) const __local__ { return DataType::getValue(offset); } -+#endif - - /// @brief Return the voxel value at the given coordinate. -- __hostdev__ ValueType getValue(const CoordT& ijk) const { return DataType::getValue(CoordToOffset(ijk)); } -+ __hostdev__ ValueType getValue(__global__ const CoordT& ijk) const __global__ { return BASE(getValue)(CoordToOffset(ijk)); } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ ValueType getValue(__local__ const CoordT& ijk) const __global__ { return BASE(getValue)(CoordToOffset(ijk)); } -+ __hostdev__ ValueType getValue(__local__ const CoordT& ijk) const __local__ { return BASE(getValue)(CoordToOffset(ijk)); } -+#endif - - /// @brief Sets the value at the specified location and activate its state. - /// - /// @note This is safe since it does not change the topology of the tree (unlike setValue methods on the other nodes) -- __hostdev__ void setValue(const CoordT& ijk, const ValueType& v) { DataType::setValue(CoordToOffset(ijk), v); } -+ __hostdev__ void setValue(__global__ const CoordT& ijk, __global__ const ValueType& v) __global__ { DataType::setValue(CoordToOffset(ijk), v); } - - /// @brief Sets the value at the specified location but leaves its state unchanged. - /// - /// @note This is safe since it does not change the topology of the tree (unlike setValue methods on the other nodes) -- __hostdev__ void setValueOnly(uint32_t offset, const ValueType& v) { DataType::setValueOnly(offset, v); } -- __hostdev__ void setValueOnly(const CoordT& ijk, const ValueType& v) { DataType::setValueOnly(CoordToOffset(ijk), v); } -+ __hostdev__ void setValueOnly(uint32_t offset, __global__ const ValueType& v) __global__ { DataType::setValueOnly(offset, v); } -+ __hostdev__ void setValueOnly(__global__ const CoordT& ijk, __global__ const ValueType& v) __global__ { DataType::setValueOnly(CoordToOffset(ijk), v); } - - /// @brief Return @c true if the voxel value at the given coordinate is active. -- __hostdev__ bool isActive(const CoordT& ijk) const { return DataType::mValueMask.isOn(CoordToOffset(ijk)); } -- __hostdev__ bool isActive(uint32_t n) const { return DataType::mValueMask.isOn(n); } -+ __hostdev__ bool isActive(__global__ const CoordT& ijk) const __global__ { return BASE(mValueMask).isOn(CoordToOffset(ijk)); } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ bool isActive(__local__ const CoordT& ijk) const __global__ { return BASE(mValueMask).isOn(CoordToOffset(ijk)); } -+ __hostdev__ bool isActive(__local__ const CoordT& ijk) const __local__ { return BASE(mValueMask).isOn(CoordToOffset(ijk)); } -+#endif -+ -+ __hostdev__ bool isActive(uint32_t n) const __global__ { return BASE(mValueMask).isOn(n); } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ bool isActive(uint32_t n) const __local__ { return BASE(mValueMask).isOn(n); } -+#endif - - /// @brief Return @c true if any of the voxel value are active in this leaf node. -- __hostdev__ bool isActive() const -+ __hostdev__ bool isActive() const __global__ - { - //NANOVDB_ASSERT( bool(DataType::mFlags & uint8_t(2)) != DataType::mValueMask.isOff() ); - //return DataType::mFlags & uint8_t(2); - return !DataType::mValueMask.isOff(); - } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ bool isActive() const __local__ -+ { -+ NANOVDB_ASSERT( bool(DataType::mFlags & uint8_t(2)) != BASE(mValueMask).isOff() ); -+ return DataType::mFlags & uint8_t(2); -+ } -+#endif - - __hostdev__ bool hasBBox() const {return DataType::mFlags & uint8_t(2);} - - /// @brief Return @c true if the voxel value at the given coordinate is active and updates @c v with the value. -- __hostdev__ bool probeValue(const CoordT& ijk, ValueType& v) const -+ __hostdev__ bool probeValue(__global__ const CoordT& ijk, __global__ ValueType& v) const __global__ - { - const uint32_t n = CoordToOffset(ijk); - v = DataType::getValue(n); -- return DataType::mValueMask.isOn(n); -+ return BASE(mValueMask).isOn(n); - } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ bool probeValue(__local__ const CoordT& ijk, __local__ ValueType& v) const __global__ -+ { -+ const uint32_t n = CoordToOffset(ijk); -+ v = BASE(getValue)(n); -+ return BASE(mValueMask).isOn(n); -+ } -+#endif - -- __hostdev__ const LeafNode* probeLeaf(const CoordT&) const { return this; } -+ __hostdev__ __global__ const LeafNode* probeLeaf(__global__ const CoordT&) const __global__ { return this; } - - /// @brief Return the linear offset corresponding to the given coordinate -- __hostdev__ static uint32_t CoordToOffset(const CoordT& ijk) -+ __hostdev__ static uint32_t CoordToOffset(__global__ const CoordT& ijk) - { - #if 0 - return ((ijk[0] & MASK) << (2 * LOG2DIM)) + ((ijk[1] & MASK) << LOG2DIM) + (ijk[2] & MASK); -@@ -4454,6 +5301,16 @@ public: - return ((ijk[0] & MASK) << (2 * LOG2DIM)) | ((ijk[1] & MASK) << LOG2DIM) | (ijk[2] & MASK); - #endif - } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ static uint32_t CoordToOffset(__local__ const CoordT& ijk) -+ { -+ #if 0 -+ return ((ijk[0] & MASK) << (2 * LOG2DIM)) + ((ijk[1] & MASK) << LOG2DIM) + (ijk[2] & MASK); -+ #else -+ return ((ijk[0] & MASK) << (2 * LOG2DIM)) | ((ijk[1] & MASK) << LOG2DIM) | (ijk[2] & MASK); -+ #endif -+ } -+#endif - - /// @brief Updates the local bounding box of active voxels in this node. Return true if bbox was updated. - /// -@@ -4461,8 +5318,9 @@ public: - /// - /// @details This method is based on few (intrinsic) bit operations and hence is relatively fast. - /// However, it should only only be called of either the value mask has changed or if the -+ - /// active bounding box is still undefined. e.g. during construction of this node. -- __hostdev__ bool updateBBox(); -+ __hostdev__ bool updateBBox() __global__; - - private: - static_assert(sizeof(DataType) % NANOVDB_DATA_ALIGNMENT == 0, "sizeof(LeafData) is misaligned"); -@@ -4478,49 +5336,77 @@ private: - - /// @brief Private method to return a voxel value and update a (dummy) ReadAccessor - template -- __hostdev__ ValueType getValueAndCache(const CoordT& ijk, const AccT&) const { return this->getValue(ijk); } -+ __hostdev__ ValueType getValueAndCache(__global__ const CoordT& ijk, __global__ const AccT&) const __global__ { return this->getValue(ijk); } -+#if defined(__KERNEL_METAL__) -+ template -+ __hostdev__ ValueType getValueAndCache(__local__ const CoordT& ijk, __local__ const AccT&) const __global__ { return this->getValue(ijk); } -+#endif - - /// @brief Return the node information. - template -- __hostdev__ typename AccT::NodeInfo getNodeInfoAndCache(const CoordType& /*ijk*/, const AccT& /*acc*/) const { -+ __hostdev__ typename AccT::NodeInfo getNodeInfoAndCache(__global__ const CoordType& /*ijk*/, __global__ const AccT& /*acc*/) const __global__ { - using NodeInfoT = typename AccT::NodeInfo; - return NodeInfoT{LEVEL, this->dim(), this->minimum(), this->maximum(), - this->average(), this->stdDeviation(), this->bbox()[0], this->bbox()[1]}; - } - - template -- __hostdev__ bool isActiveAndCache(const CoordT& ijk, const AccT&) const { return this->isActive(ijk); } -+ __hostdev__ bool isActiveAndCache(__global__ const CoordT& ijk, __global__ const AccT&) const __global__ { return this->isActive(ijk); } -+#if defined(__KERNEL_METAL__) -+ template -+ __hostdev__ bool isActiveAndCache(__local__ const CoordT& ijk, __local__ const AccT&) const __global__ { return this->isActive(ijk); } -+#endif - - template -- __hostdev__ bool probeValueAndCache(const CoordT& ijk, ValueType& v, const AccT&) const { return this->probeValue(ijk, v); } -+ __hostdev__ bool probeValueAndCache(__global__ const CoordT& ijk, __global__ ValueType& v, __global__ const AccT&) const __global__ { return this->probeValue(ijk, v); } - - template -- __hostdev__ const LeafNode* probeLeafAndCache(const CoordT&, const AccT&) const { return this; } -+ __hostdev__ __global__ const LeafNode* probeLeafAndCache(__global__ const CoordT&, __global__ const AccT&) const __global__ { return this; } - - template -- __hostdev__ uint32_t getDimAndCache(const CoordT&, const RayT& /*ray*/, const AccT&) const -+ __hostdev__ uint32_t getDimAndCache(__global__ const CoordT&, __global__ const RayT& /*ray*/, __global__ const AccT&) const __global__ - { - if (DataType::mFlags & uint8_t(1u)) return this->dim(); // skip this node if the 1st bit is set - - //if (!ray.intersects( this->bbox() )) return 1 << LOG2DIM; - return ChildNodeType::dim(); - } -- -+#if defined(__KERNEL_METAL__) -+ template -+ __hostdev__ uint32_t getDimAndCache(__local__ const CoordT&, __local__ const RayT& /*ray*/, __local__ const AccT&) const __global__ -+ { -+ if (BASE(mFlags) & uint8_t(1)) -+ return this->dim(); // skip this node if first bit is set -+ //if (!ray.intersects( this->bbox() )) return 1 << LOG2DIM; -+ return ChildNodeType::dim(); -+ } -+#endif -+#undef BASE - }; // LeafNode class - - template class MaskT, uint32_t LOG2DIM> --__hostdev__ inline bool LeafNode::updateBBox() -+__hostdev__ inline bool LeafNode::updateBBox() __global__ - { - static_assert(LOG2DIM == 3, "LeafNode::updateBBox: only supports LOGDIM = 3!"); - if (DataType::mValueMask.isOff()) { - DataType::mFlags &= ~uint8_t(2);// set 2nd bit off, which indicates that this nodes has no bbox - return false; - } -+#if defined(__KERNEL_METAL__) -+ struct Update { -+ static void update(__global__ DataType &d, uint32_t min, uint32_t max, int axis) { -+ NANOVDB_ASSERT(min <= max && max < 8); -+ d.mBBoxMin[axis] = (d.mBBoxMin[axis] & ~MASK) + int(min); -+ d.mBBoxDif[axis] = uint8_t(max - min); -+ } -+ }; -+#else - auto update = [&](uint32_t min, uint32_t max, int axis) { - NANOVDB_ASSERT(min <= max && max < 8); - DataType::mBBoxMin[axis] = (DataType::mBBoxMin[axis] & ~MASK) + int(min); - DataType::mBBoxDif[axis] = uint8_t(max - min); - }; -+#endif - uint64_t word64 = DataType::mValueMask.template getWord(0); - uint32_t Xmin = word64 ? 0u : 8u; - uint32_t Xmax = Xmin; -@@ -4534,6 +5420,17 @@ __hostdev__ inline bool LeafNode::updateBBox() - } - } - NANOVDB_ASSERT(word64); -+#if defined(__KERNEL_METAL__) -+ Update::update(this, Xmin, Xmax, 0); -+ Update::update(this, FindLowestOn(word64) >> 3, FindHighestOn(word64) >> 3, 1); -+ __local__ const uint32_t *p = reinterpret_cast<__local__ const uint32_t*>(&word64), word32 = p[0] | p[1]; -+ __local__ const uint16_t *q = reinterpret_cast<__local__ const uint16_t*>(&word32), word16 = q[0] | q[1]; -+ __local__ const uint8_t *b = reinterpret_cast<__local__ const uint8_t* >(&word16), byte = b[0] | b[1]; -+ NANOVDB_ASSERT(byte); -+ Update::update(this, FindLowestOn(static_cast(byte)), FindHighestOn(static_cast(byte)), 2); -+ DataType::mFlags |= uint8_t(2);// set 2nd bit on, which indicates that this nodes has a bbox -+ return true; -+#else - update(Xmin, Xmax, 0); - update(FindLowestOn(word64) >> 3, FindHighestOn(word64) >> 3, 1); - const uint32_t *p = reinterpret_cast(&word64), word32 = p[0] | p[1]; -@@ -4541,8 +5438,9 @@ __hostdev__ inline bool LeafNode::updateBBox() - const uint8_t *b = reinterpret_cast(&word16), byte = b[0] | b[1]; - NANOVDB_ASSERT(byte); - update(FindLowestOn(static_cast(byte)), FindHighestOn(static_cast(byte)), 2); -- DataType::mFlags |= uint8_t(2);// set 2nd bit on, which indicates that this nodes has a bbox -+ DataType::mFlags |= uint8_t(2);// set 2nd bit on, which indicates that this nodes has a bbox - return true; -+#endif - } // LeafNode::updateBBox - - // --------------------------> Template specializations and traits <------------------------------------ -@@ -4651,12 +5549,12 @@ class ReadAccessor - using FloatType = typename RootT::FloatType; - using CoordValueType = typename RootT::CoordType::ValueType; - -- mutable const RootT* mRoot; // 8 bytes (mutable to allow for access methods to be const) -+ mutable __global__ const RootT* mRoot; // 8 bytes (mutable to allow for access methods to be const) - public: - using ValueType = typename RootT::ValueType; - using CoordType = typename RootT::CoordType; - -- static const int CacheLevels = 0; -+ static __constant__ const int CacheLevels = 0; - - struct NodeInfo { - uint32_t mLevel; // 4B -@@ -4670,60 +5568,77 @@ public: - }; - - /// @brief Constructor from a root node -- __hostdev__ ReadAccessor(const RootT& root) : mRoot{&root} {} -+ __hostdev__ ReadAccessor(__global__ const RootT& root) __local__ : mRoot{&root} {} - - /// @brief Constructor from a grid -- __hostdev__ ReadAccessor(const GridT& grid) : ReadAccessor(grid.tree().root()) {} -+ __hostdev__ ReadAccessor(__global__ const GridT& grid) __local__ : ReadAccessor(grid.tree().root()) {} - - /// @brief Constructor from a tree -- __hostdev__ ReadAccessor(const TreeT& tree) : ReadAccessor(tree.root()) {} -+ __hostdev__ ReadAccessor(__global__ const TreeT& tree) __local__ : ReadAccessor(tree.root()) {} - - /// @brief Reset this access to its initial state, i.e. with an empty cache - /// @node Noop since this template specialization has no cache - __hostdev__ void clear() {} - -- __hostdev__ const RootT& root() const { return *mRoot; } -+ __hostdev__ __global__ const RootT& root() const __global__ { return *mRoot; } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ __global__ const RootT& root() const __local__ { return *mRoot; } -+#endif - - /// @brief Defaults constructors -- ReadAccessor(const ReadAccessor&) = default; -- ~ReadAccessor() = default; -- ReadAccessor& operator=(const ReadAccessor&) = default; -+ ReadAccessor(__local__ const ReadAccessor&) __local__ = default; -+ ~ReadAccessor() __local__ = default; -+ __local__ ReadAccessor& operator=(__local__ const ReadAccessor&) __local__ = default; - -- __hostdev__ ValueType getValue(const CoordType& ijk) const -+ __hostdev__ ValueType getValue(__global__ const CoordType& ijk) const __local__ - { - return mRoot->getValueAndCache(ijk, *this); - } -- __hostdev__ ValueType operator()(const CoordType& ijk) const -+ -+#if defined(__KERNEL_METAL__) -+ __hostdev__ ValueType getValue(__local__ const CoordType& ijk) const __local__ -+ { -+ return mRoot->getValueAndCache(ijk, *this); -+ } -+#endif -+ -+ __hostdev__ ValueType operator()(__global__ const CoordType& ijk) const __local__ - { - return this->getValue(ijk); - } -- __hostdev__ ValueType operator()(int i, int j, int k) const -+ __hostdev__ ValueType operator()(int i, int j, int k) const __local__ - { - return this->getValue(CoordType(i,j,k)); - } - -- __hostdev__ NodeInfo getNodeInfo(const CoordType& ijk) const -+ __hostdev__ NodeInfo getNodeInfo(__global__ const CoordType& ijk) const __local__ - { - return mRoot->getNodeInfoAndCache(ijk, *this); - } - -- __hostdev__ bool isActive(const CoordType& ijk) const -+ __hostdev__ bool isActive(__global__ const CoordType& ijk) const __local__ - { - return mRoot->isActiveAndCache(ijk, *this); - } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ bool isActive(__local__ const CoordType& ijk) const __local__ -+ { -+ return mRoot->isActiveAndCache(ijk, *this); -+ } -+#endif - -- __hostdev__ bool probeValue(const CoordType& ijk, ValueType& v) const -+ __hostdev__ bool probeValue(__global__ const CoordType& ijk, __global__ ValueType& v) const __local__ - { - return mRoot->probeValueAndCache(ijk, v, *this); - } - -- __hostdev__ const LeafT* probeLeaf(const CoordType& ijk) const -+ __hostdev__ __global__ const LeafT* probeLeaf(__global__ const CoordType& ijk) const __local__ - { - return mRoot->probeLeafAndCache(ijk, *this); - } - - template -- __hostdev__ uint32_t getDim(const CoordType& ijk, const RayT& ray) const -+ __hostdev__ uint32_t getDim(__global__ const CoordType& ijk, __global__ const RayT& ray) const __local__ - { - return mRoot->getDimAndCache(ijk, ray, *this); - } -@@ -4739,7 +5654,11 @@ private: - - /// @brief No-op - template -- __hostdev__ void insert(const CoordType&, const NodeT*) const {} -+ __hostdev__ void insert(__global__ const CoordType&, __global__ const NodeT*) const __local__ {} -+#if defined(__KERNEL_METAL__) -+ template -+ __hostdev__ void insert(__local__ const CoordType&, __global__ const NodeT*) const __local__ {} -+#endif - }; // ReadAccessor class - - /// @brief Node caching at a single tree level -@@ -4761,19 +5680,19 @@ class ReadAccessor//e.g. 0, 1, 2 - - // All member data are mutable to allow for access methods to be const - mutable CoordT mKey; // 3*4 = 12 bytes -- mutable const RootT* mRoot; // 8 bytes -- mutable const NodeT* mNode; // 8 bytes -+ mutable __global__ const RootT* mRoot; // 8 bytes -+ mutable __global__ const NodeT* mNode; // 8 bytes - - public: - using ValueType = ValueT; - using CoordType = CoordT; - -- static const int CacheLevels = 1; -+ static __constant__ const int CacheLevels = 1; - - using NodeInfo = typename ReadAccessor::NodeInfo; - - /// @brief Constructor from a root node -- __hostdev__ ReadAccessor(const RootT& root) -+ __hostdev__ ReadAccessor(__global__ const RootT& root) __local__ - : mKey(CoordType::max()) - , mRoot(&root) - , mNode(nullptr) -@@ -4781,10 +5700,10 @@ public: - } - - /// @brief Constructor from a grid -- __hostdev__ ReadAccessor(const GridT& grid) : ReadAccessor(grid.tree().root()) {} -+ __hostdev__ ReadAccessor(__global__ const GridT& grid) __local__ : ReadAccessor(grid.tree().root()) {} - - /// @brief Constructor from a tree -- __hostdev__ ReadAccessor(const TreeT& tree) : ReadAccessor(tree.root()) {} -+ __hostdev__ ReadAccessor(__global__ const TreeT& tree) __local__ : ReadAccessor(tree.root()) {} - - /// @brief Reset this access to its initial state, i.e. with an empty cache - __hostdev__ void clear() -@@ -4793,37 +5712,64 @@ public: - mNode = nullptr; - } - -- __hostdev__ const RootT& root() const { return *mRoot; } -+ __hostdev__ __global__ const RootT& root() const __global__ { return *mRoot; } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ __global__ const RootT& root() const __local__ { return *mRoot; } -+#endif - - /// @brief Defaults constructors -- ReadAccessor(const ReadAccessor&) = default; -- ~ReadAccessor() = default; -- ReadAccessor& operator=(const ReadAccessor&) = default; -+ ReadAccessor(__global__ const ReadAccessor&) __global__ = default; -+ ~ReadAccessor() __global__ = default; -+ __global__ ReadAccessor& operator=(__global__ const ReadAccessor&) __global__ = default; - -- __hostdev__ bool isCached(const CoordType& ijk) const -+ __hostdev__ bool isCached(__global__ const CoordType& ijk) const __global__ - { - return (ijk[0] & int32_t(~NodeT::MASK)) == mKey[0] && - (ijk[1] & int32_t(~NodeT::MASK)) == mKey[1] && - (ijk[2] & int32_t(~NodeT::MASK)) == mKey[2]; - } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ bool isCached(__local__ const CoordType& ijk) const __global__ -+ { -+ return (ijk[0] & int32_t(~NodeT::MASK)) == mKey[0] && -+ (ijk[1] & int32_t(~NodeT::MASK)) == mKey[1] && -+ (ijk[2] & int32_t(~NodeT::MASK)) == mKey[2]; -+ } -+ __hostdev__ bool isCached(__local__ const CoordType& ijk) const __local__ -+ { -+ return (ijk[0] & int32_t(~NodeT::MASK)) == mKey[0] && -+ (ijk[1] & int32_t(~NodeT::MASK)) == mKey[1] && -+ (ijk[2] & int32_t(~NodeT::MASK)) == mKey[2]; -+ } -+#endif - -- __hostdev__ ValueType getValue(const CoordType& ijk) const -+ __hostdev__ ValueType getValue(__global__ const CoordType& ijk) const __global__ - { - if (this->isCached(ijk)) { - return mNode->getValueAndCache(ijk, *this); - } - return mRoot->getValueAndCache(ijk, *this); - } -- __hostdev__ ValueType operator()(const CoordType& ijk) const -+#if defined(__KERNEL_METAL__) -+ __hostdev__ ValueType getValue(__local__ const CoordType& ijk) const __global__ -+ { -+ if (this->isCached(ijk)) { -+ return mNode->getValueAndCache(ijk, *this); -+ } -+ return mRoot->getValueAndCache(ijk, *this); -+ } -+#endif -+ -+ __hostdev__ ValueType operator()(__global__ const CoordType& ijk) const __global__ - { - return this->getValue(ijk); - } -- __hostdev__ ValueType operator()(int i, int j, int k) const -+ __hostdev__ ValueType operator()(int i, int j, int k) const __global__ - { - return this->getValue(CoordType(i,j,k)); - } - -- __hostdev__ NodeInfo getNodeInfo(const CoordType& ijk) const -+ __hostdev__ NodeInfo getNodeInfo(__global__ const CoordType& ijk) const __global__ - { - if (this->isCached(ijk)) { - return mNode->getNodeInfoAndCache(ijk, *this); -@@ -4831,15 +5777,24 @@ public: - return mRoot->getNodeInfoAndCache(ijk, *this); - } - -- __hostdev__ bool isActive(const CoordType& ijk) const -+ __hostdev__ bool isActive(__global__ const CoordType& ijk) const __global__ - { - if (this->isCached(ijk)) { - return mNode->isActiveAndCache(ijk, *this); - } - return mRoot->isActiveAndCache(ijk, *this); - } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ bool isActive(__global__ const CoordType& ijk) const __local__ -+ { -+ if (this->isCached(ijk)) { -+ return mNode->isActiveAndCache(ijk, *this); -+ } -+ return mRoot->isActiveAndCache(ijk, *this); -+ } -+#endif - -- __hostdev__ bool probeValue(const CoordType& ijk, ValueType& v) const -+ __hostdev__ bool probeValue(__global__ const CoordType& ijk, __global__ ValueType& v) const __global__ - { - if (this->isCached(ijk)) { - return mNode->probeValueAndCache(ijk, v, *this); -@@ -4847,7 +5802,7 @@ public: - return mRoot->probeValueAndCache(ijk, v, *this); - } - -- __hostdev__ const LeafT* probeLeaf(const CoordType& ijk) const -+ __hostdev__ __global__ const LeafT* probeLeaf(__global__ const CoordType& ijk) const __global__ - { - if (this->isCached(ijk)) { - return mNode->probeLeafAndCache(ijk, *this); -@@ -4856,7 +5811,7 @@ public: - } - - template -- __hostdev__ uint32_t getDim(const CoordType& ijk, const RayT& ray) const -+ __hostdev__ uint32_t getDim(__global__ const CoordType& ijk, __global__ const RayT& ray) const __global__ - { - if (this->isCached(ijk)) { - return mNode->getDimAndCache(ijk, ray, *this); -@@ -4874,15 +5829,26 @@ private: - friend class LeafNode; - - /// @brief Inserts a leaf node and key pair into this ReadAccessor -- __hostdev__ void insert(const CoordType& ijk, const NodeT* node) const -+ __hostdev__ void insert(__global__ const CoordType& ijk, __global__ const NodeT* node) const __local__ - { - mKey = ijk & ~NodeT::MASK; - mNode = node; - } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ void insert(__local__ const CoordType& ijk, __global__ const NodeT* node) const __local__ -+ { -+ mKey = ijk & ~NodeT::MASK; -+ mNode = node; -+ } -+#endif - - // no-op - template -- __hostdev__ void insert(const CoordType&, const OtherNodeT*) const {} -+ __hostdev__ void insert(__global__ const CoordType&, __global__ const OtherNodeT*) const __local__ {} -+#if defined(__KERNEL_METAL__) -+ template -+ __hostdev__ void insert(__local__ const CoordType&, __global__ const OtherNodeT*) const __local__ {} -+#endif - - }; // ReadAccessor - -@@ -4909,20 +5875,20 @@ class ReadAccessor//e.g. (0,1), (1,2), (0,2) - #else // 68 bytes total - mutable CoordT mKeys[2]; // 2*3*4 = 24 bytes - #endif -- mutable const RootT* mRoot; -- mutable const Node1T* mNode1; -- mutable const Node2T* mNode2; -+ mutable __global__ const RootT* mRoot; -+ mutable __global__ const Node1T* mNode1; -+ mutable __global__ const Node2T* mNode2; - - public: - using ValueType = ValueT; - using CoordType = CoordT; - -- static const int CacheLevels = 2; -+ static __constant__ const int CacheLevels = 2; - - using NodeInfo = typename ReadAccessor::NodeInfo; - - /// @brief Constructor from a root node -- __hostdev__ ReadAccessor(const RootT& root) -+ __hostdev__ ReadAccessor(__global__ const RootT& root) __local__ - #ifdef USE_SINGLE_ACCESSOR_KEY - : mKey(CoordType::max()) - #else -@@ -4935,10 +5901,10 @@ public: - } - - /// @brief Constructor from a grid -- __hostdev__ ReadAccessor(const GridT& grid) : ReadAccessor(grid.tree().root()) {} -+ __hostdev__ ReadAccessor(__global__ const GridT& grid) __local__ : ReadAccessor(grid.tree().root()) {} - - /// @brief Constructor from a tree -- __hostdev__ ReadAccessor(const TreeT& tree) : ReadAccessor(tree.root()) {} -+ __hostdev__ ReadAccessor(__global__ const TreeT& tree) __local__ : ReadAccessor(tree.root()) {} - - /// @brief Reset this access to its initial state, i.e. with an empty cache - __hostdev__ void clear() -@@ -4952,15 +5918,18 @@ public: - mNode2 = nullptr; - } - -- __hostdev__ const RootT& root() const { return *mRoot; } -+ __hostdev__ __global__ const RootT& root() const __global__ { return *mRoot; } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ __global__ const RootT& root() const __local__ { return *mRoot; } -+#endif - - /// @brief Defaults constructors -- ReadAccessor(const ReadAccessor&) = default; -+ ReadAccessor(__global__ const ReadAccessor&) __global__ = default; - ~ReadAccessor() = default; -- ReadAccessor& operator=(const ReadAccessor&) = default; -+ __global__ ReadAccessor& operator=(__global__ const ReadAccessor&) __global__ = default; - - #ifdef USE_SINGLE_ACCESSOR_KEY -- __hostdev__ bool isCached1(CoordValueType dirty) const -+ __hostdev__ bool isCached1(CoordValueType dirty) const __global__ - { - if (!mNode1) - return false; -@@ -4970,7 +5939,7 @@ public: - } - return true; - } -- __hostdev__ bool isCached2(CoordValueType dirty) const -+ __hostdev__ bool isCached2(CoordValueType dirty) const __global__ - { - if (!mNode2) - return false; -@@ -4980,18 +5949,18 @@ public: - } - return true; - } -- __hostdev__ CoordValueType computeDirty(const CoordType& ijk) const -+ __hostdev__ CoordValueType computeDirty(__global__ const CoordType& ijk) const __global__ - { - return (ijk[0] ^ mKey[0]) | (ijk[1] ^ mKey[1]) | (ijk[2] ^ mKey[2]); - } - #else -- __hostdev__ bool isCached1(const CoordType& ijk) const -+ __hostdev__ bool isCached1(__global__ const CoordType& ijk) const __global__ - { - return (ijk[0] & int32_t(~Node1T::MASK)) == mKeys[0][0] && - (ijk[1] & int32_t(~Node1T::MASK)) == mKeys[0][1] && - (ijk[2] & int32_t(~Node1T::MASK)) == mKeys[0][2]; - } -- __hostdev__ bool isCached2(const CoordType& ijk) const -+ __hostdev__ bool isCached2(__global__ const CoordType& ijk) const __global__ - { - return (ijk[0] & int32_t(~Node2T::MASK)) == mKeys[1][0] && - (ijk[1] & int32_t(~Node2T::MASK)) == mKeys[1][1] && -@@ -4999,12 +5968,12 @@ public: - } - #endif - -- __hostdev__ ValueType getValue(const CoordType& ijk) const -+ __hostdev__ ValueType getValue(__global__ const CoordType& ijk) const __global__ - { - #ifdef USE_SINGLE_ACCESSOR_KEY - const CoordValueType dirty = this->computeDirty(ijk); - #else -- auto&& dirty = ijk; -+ __global__ auto&& dirty = ijk; - #endif - if (this->isCached1(dirty)) { - return mNode1->getValueAndCache(ijk, *this); -@@ -5013,21 +5982,37 @@ public: - } - return mRoot->getValueAndCache(ijk, *this); - } -- __hostdev__ ValueType operator()(const CoordType& ijk) const -- { -- return this->getValue(ijk); -- } -- __hostdev__ ValueType operator()(int i, int j, int k) const -- { -- return this->getValue(CoordType(i,j,k)); -- } -- -- __hostdev__ NodeInfo getNodeInfo(const CoordType& ijk) const -+#if defined(__KERNEL_METAL__) -+ __hostdev__ ValueType getValue(__local__ const CoordType& ijk) const __global__ - { - #ifdef USE_SINGLE_ACCESSOR_KEY - const CoordValueType dirty = this->computeDirty(ijk); - #else -- auto&& dirty = ijk; -+ __global__ auto&& dirty = ijk; -+#endif -+ if (this->isCached1(dirty)) { -+ return mNode1->getValueAndCache(ijk, *this); -+ } else if (this->isCached2(dirty)) { -+ return mNode2->getValueAndCache(ijk, *this); -+ } -+ return mRoot->getValueAndCache(ijk, *this); -+ } -+#endif -+ __hostdev__ ValueType operator()(__global__ const CoordType& ijk) const __global__ -+ { -+ return this->getValue(ijk); -+ } -+ __hostdev__ ValueType operator()(int i, int j, int k) const __global__ -+ { -+ return this->getValue(CoordType(i,j,k)); -+ } -+ -+ __hostdev__ NodeInfo getNodeInfo(__global__ const CoordType& ijk) const __global__ -+ { -+#ifdef USE_SINGLE_ACCESSOR_KEY -+ const CoordValueType dirty = this->computeDirty(ijk); -+#else -+ __global__ auto&& dirty = ijk; - #endif - if (this->isCached1(dirty)) { - return mNode1->getNodeInfoAndCache(ijk, *this); -@@ -5037,12 +6022,12 @@ public: - return mRoot->getNodeInfoAndCache(ijk, *this); - } - -- __hostdev__ bool isActive(const CoordType& ijk) const -+ __hostdev__ bool isActive(__global__ const CoordType& ijk) const __global__ - { - #ifdef USE_SINGLE_ACCESSOR_KEY - const CoordValueType dirty = this->computeDirty(ijk); - #else -- auto&& dirty = ijk; -+ __global__ auto&& dirty = ijk; - #endif - if (this->isCached1(dirty)) { - return mNode1->isActiveAndCache(ijk, *this); -@@ -5052,12 +6037,12 @@ public: - return mRoot->isActiveAndCache(ijk, *this); - } - -- __hostdev__ bool probeValue(const CoordType& ijk, ValueType& v) const -+ __hostdev__ bool probeValue(__global__ const CoordType& ijk, __global__ ValueType& v) const __global__ - { - #ifdef USE_SINGLE_ACCESSOR_KEY - const CoordValueType dirty = this->computeDirty(ijk); - #else -- auto&& dirty = ijk; -+ __global__ auto&& dirty = ijk; - #endif - if (this->isCached1(dirty)) { - return mNode1->probeValueAndCache(ijk, v, *this); -@@ -5067,12 +6052,12 @@ public: - return mRoot->probeValueAndCache(ijk, v, *this); - } - -- __hostdev__ const LeafT* probeLeaf(const CoordType& ijk) const -+ __hostdev__ __global__ const LeafT* probeLeaf(__global__ const CoordType& ijk) const __global__ - { - #ifdef USE_SINGLE_ACCESSOR_KEY - const CoordValueType dirty = this->computeDirty(ijk); - #else -- auto&& dirty = ijk; -+ __global__ auto&& dirty = ijk; - #endif - if (this->isCached1(dirty)) { - return mNode1->probeLeafAndCache(ijk, *this); -@@ -5083,12 +6068,12 @@ public: - } - - template -- __hostdev__ uint32_t getDim(const CoordType& ijk, const RayT& ray) const -+ __hostdev__ uint32_t getDim(__global__ const CoordType& ijk, __global__ const RayT& ray) const __global__ - { - #ifdef USE_SINGLE_ACCESSOR_KEY - const CoordValueType dirty = this->computeDirty(ijk); - #else -- auto&& dirty = ijk; -+ __global__ auto&& dirty = ijk; - #endif - if (this->isCached1(dirty)) { - return mNode1->getDimAndCache(ijk, ray, *this); -@@ -5108,7 +6093,7 @@ private: - friend class LeafNode; - - /// @brief Inserts a leaf node and key pair into this ReadAccessor -- __hostdev__ void insert(const CoordType& ijk, const Node1T* node) const -+ __hostdev__ void insert(__global__ const CoordType& ijk, __global__ const Node1T* node) const __local__ - { - #ifdef USE_SINGLE_ACCESSOR_KEY - mKey = ijk; -@@ -5117,7 +6102,7 @@ private: - #endif - mNode1 = node; - } -- __hostdev__ void insert(const CoordType& ijk, const Node2T* node) const -+ __hostdev__ void insert(__local__ const CoordType& ijk, __global__ const Node2T* node) const __local__ - { - #ifdef USE_SINGLE_ACCESSOR_KEY - mKey = ijk; -@@ -5127,7 +6112,11 @@ private: - mNode2 = node; - } - template -- __hostdev__ void insert(const CoordType&, const OtherNodeT*) const {} -+ __hostdev__ void insert(__global__ const CoordType&, __global__ const OtherNodeT*) const __local__ {} -+#if defined(__KERNEL_METAL__) -+ template -+ __hostdev__ void insert(__local__ const CoordType&, __global__ const OtherNodeT*) const __local__ {} -+#endif - }; // ReadAccessor - - -@@ -5145,7 +6134,7 @@ class ReadAccessor - using ValueT = typename RootT::ValueType; - - using FloatType = typename RootT::FloatType; -- using CoordValueType = typename RootT::CoordT::ValueType; -+ using CoordValueType = typename RootT::CoordType::ValueType; - - // All member data are mutable to allow for access methods to be const - #ifdef USE_SINGLE_ACCESSOR_KEY // 44 bytes total -@@ -5153,19 +6142,19 @@ class ReadAccessor - #else // 68 bytes total - mutable CoordT mKeys[3]; // 3*3*4 = 36 bytes - #endif -- mutable const RootT* mRoot; -- mutable const void* mNode[3]; // 4*8 = 32 bytes -+ mutable __global__ const RootT* mRoot; -+ mutable __global__ const void* mNode[3]; // 4*8 = 32 bytes - - public: - using ValueType = ValueT; - using CoordType = CoordT; - -- static const int CacheLevels = 3; -+ static __constant__ const int CacheLevels = 3; - - using NodeInfo = typename ReadAccessor::NodeInfo; - - /// @brief Constructor from a root node -- __hostdev__ ReadAccessor(const RootT& root) -+ __hostdev__ ReadAccessor(__global__ const RootT& root) __local__ - #ifdef USE_SINGLE_ACCESSOR_KEY - : mKey(CoordType::max()) - #else -@@ -5177,35 +6166,38 @@ public: - } - - /// @brief Constructor from a grid -- __hostdev__ ReadAccessor(const GridT& grid) : ReadAccessor(grid.tree().root()) {} -+ __hostdev__ ReadAccessor(__global__ const GridT& grid) __local__ : ReadAccessor(grid.tree().root()) {} - - /// @brief Constructor from a tree -- __hostdev__ ReadAccessor(const TreeT& tree) : ReadAccessor(tree.root()) {} -+ __hostdev__ ReadAccessor(__global__ const TreeT& tree) __local__ : ReadAccessor(tree.root()) {} - -- __hostdev__ const RootT& root() const { return *mRoot; } -+ __hostdev__ __global__ const RootT& root() const __global__ { return *mRoot; } -+#if defined(__KERNEL_METAL__) -+ __hostdev__ __global__ const RootT& root() const __local__ { return *mRoot; } -+#endif - - /// @brief Defaults constructors -- ReadAccessor(const ReadAccessor&) = default; -- ~ReadAccessor() = default; -- ReadAccessor& operator=(const ReadAccessor&) = default; -+ ReadAccessor(__local__ const ReadAccessor&) __local__ = default; -+ ~ReadAccessor() __global__ = default; -+ __global__ ReadAccessor& operator=(__global__ const ReadAccessor&) __global__ = default; - - /// @brief Return a const point to the cached node of the specified type - /// - /// @warning The return value could be NULL. - template -- __hostdev__ const NodeT* getNode() const -+ __hostdev__ __global__ const NodeT* getNode() const __global__ - { - using T = typename NodeTrait::type; - static_assert(is_same::value, "ReadAccessor::getNode: Invalid node type"); -- return reinterpret_cast(mNode[NodeT::LEVEL]); -+ return reinterpret_cast<__global__ const T*>(mNode[NodeT::LEVEL]); - } - - template -- __hostdev__ const typename NodeTrait::type* getNode() const -+ __hostdev__ __global__ const typename NodeTrait::type* getNode() const - { - using T = typename NodeTrait::type; - static_assert(LEVEL>=0 && LEVEL<=2, "ReadAccessor::getNode: Invalid node type"); -- return reinterpret_cast(mNode[LEVEL]); -+ return reinterpret_cast<__global__ const T*>(mNode[LEVEL]); - } - - -@@ -5222,7 +6214,7 @@ public: - - #ifdef USE_SINGLE_ACCESSOR_KEY - template -- __hostdev__ bool isCached(CoordValueType dirty) const -+ __hostdev__ bool isCached(CoordValueType dirty) const __global__ - { - if (!mNode[NodeT::LEVEL]) - return false; -@@ -5233,128 +6225,229 @@ public: - return true; - } - -- __hostdev__ CoordValueType computeDirty(const CoordType& ijk) const -+ __hostdev__ CoordValueType computeDirty(const CoordType& ijk) const __global__ - { - return (ijk[0] ^ mKey[0]) | (ijk[1] ^ mKey[1]) | (ijk[2] ^ mKey[2]); - } - #else - template -- __hostdev__ bool isCached(const CoordType& ijk) const -+ __hostdev__ bool isCached(__global__ const CoordType& ijk) const __global__ - { - return (ijk[0] & int32_t(~NodeT::MASK)) == mKeys[NodeT::LEVEL][0] && (ijk[1] & int32_t(~NodeT::MASK)) == mKeys[NodeT::LEVEL][1] && (ijk[2] & int32_t(~NodeT::MASK)) == mKeys[NodeT::LEVEL][2]; - } -+#if defined(__KERNEL_METAL__) -+ template -+ __hostdev__ bool isCached(__local__ const CoordType& ijk) const __global__ -+ { -+ return (ijk[0] & int32_t(~NodeT::MASK)) == mKeys[NodeT::LEVEL][0] && (ijk[1] & int32_t(~NodeT::MASK)) == mKeys[NodeT::LEVEL][1] && (ijk[2] & int32_t(~NodeT::MASK)) == mKeys[NodeT::LEVEL][2]; -+ } -+ template -+ __hostdev__ bool isCached(__local__ const CoordType& ijk) const __local__ -+ { -+ return (ijk[0] & int32_t(~NodeT::MASK)) == mKeys[NodeT::LEVEL][0] && (ijk[1] & int32_t(~NodeT::MASK)) == mKeys[NodeT::LEVEL][1] && (ijk[2] & int32_t(~NodeT::MASK)) == mKeys[NodeT::LEVEL][2]; -+ } -+#endif // __KERNEL_METAL__ - #endif - -- __hostdev__ ValueType getValue(const CoordType& ijk) const -+ __hostdev__ ValueType getValue(__global__ const CoordType& ijk) const __global__ - { - #ifdef USE_SINGLE_ACCESSOR_KEY - const CoordValueType dirty = this->computeDirty(ijk); - #else -- auto&& dirty = ijk; -+ __global__ auto&& dirty = ijk; - #endif - if (this->isCached(dirty)) { -- return ((LeafT*)mNode[0])->getValue(ijk); -+ return ((__global__ LeafT*)mNode[0])->getValue(ijk); - } else if (this->isCached(dirty)) { -- return ((NodeT1*)mNode[1])->getValueAndCache(ijk, *this); -+ return ((__global__ NodeT1*)mNode[1])->getValueAndCache(ijk, *this); - } else if (this->isCached(dirty)) { -- return ((NodeT2*)mNode[2])->getValueAndCache(ijk, *this); -+ return ((__global__ NodeT2*)mNode[2])->getValueAndCache(ijk, *this); - } - return mRoot->getValueAndCache(ijk, *this); - } -- __hostdev__ ValueType operator()(const CoordType& ijk) const -+#if defined(__KERNEL_METAL__) -+ __hostdev__ ValueType getValue(__local__ const CoordType& ijk) const __global__ -+ { -+#ifdef USE_SINGLE_ACCESSOR_KEY -+ const CoordValueType dirty = this->computeDirty(ijk); -+#else -+ __local__ auto&& dirty = ijk; -+#endif -+ if (this->isCached(dirty)) { -+ return ((__global__ LeafT*)mNode[0])->getValue(ijk); -+ } else if (this->isCached(dirty)) { -+ return ((__global__ NodeT1*)mNode[1])->getValueAndCache(ijk, *this); -+ } else if (this->isCached(dirty)) { -+ return ((__global__ NodeT2*)mNode[2])->getValueAndCache(ijk, *this); -+ } -+ return mRoot->getValueAndCache(ijk, *this); -+ } -+ __hostdev__ ValueType getValue(__local__ const CoordType& ijk) const __local__ -+ { -+#ifdef USE_SINGLE_ACCESSOR_KEY -+ const CoordValueType dirty = this->computeDirty(ijk); -+#else -+ __local__ auto&& dirty = ijk; -+#endif -+ if (this->isCached(dirty)) { -+ return ((__global__ LeafT*)mNode[0])->getValue(ijk); -+ } else if (this->isCached(dirty)) { -+ return ((__global__ NodeT1*)mNode[1])->getValueAndCache(ijk, *this); -+ } else if (this->isCached(dirty)) { -+ return ((__global__ NodeT2*)mNode[2])->getValueAndCache(ijk, *this); -+ } -+ return mRoot->getValueAndCache(ijk, *this); -+ } -+#endif // __KERNEL_METAL__ -+ -+ __hostdev__ ValueType operator()(__global__ const CoordType& ijk) const __global__ - { - return this->getValue(ijk); - } -- __hostdev__ ValueType operator()(int i, int j, int k) const -+ __hostdev__ ValueType operator()(int i, int j, int k) const __global__ - { - return this->getValue(CoordType(i,j,k)); - } - -- __hostdev__ NodeInfo getNodeInfo(const CoordType& ijk) const -+ __hostdev__ NodeInfo getNodeInfo(__global__ const CoordType& ijk) const __global__ - { - #ifdef USE_SINGLE_ACCESSOR_KEY - const CoordValueType dirty = this->computeDirty(ijk); - #else -- auto&& dirty = ijk; -+ __global__ auto&& dirty = ijk; - #endif - if (this->isCached(dirty)) { -- return ((LeafT*)mNode[0])->getNodeInfoAndCache(ijk, *this); -+ return ((__global__ LeafT*)mNode[0])->getNodeInfoAndCache(ijk, *this); - } else if (this->isCached(dirty)) { -- return ((NodeT1*)mNode[1])->getNodeInfoAndCache(ijk, *this); -+ return ((__global__ NodeT1*)mNode[1])->getNodeInfoAndCache(ijk, *this); - } else if (this->isCached(dirty)) { -- return ((NodeT2*)mNode[2])->getNodeInfoAndCache(ijk, *this); -+ return ((__global__ NodeT2*)mNode[2])->getNodeInfoAndCache(ijk, *this); - } - return mRoot->getNodeInfoAndCache(ijk, *this); - } - -- __hostdev__ bool isActive(const CoordType& ijk) const -+ __hostdev__ bool isActive(__global__ const CoordType& ijk) const __global__ - { - #ifdef USE_SINGLE_ACCESSOR_KEY - const CoordValueType dirty = this->computeDirty(ijk); - #else -- auto&& dirty = ijk; -+ __global__ auto&& dirty = ijk; - #endif - if (this->isCached(dirty)) { -- return ((LeafT*)mNode[0])->isActive(ijk); -+ return ((__global__ LeafT*)mNode[0])->isActive(ijk); - } else if (this->isCached(dirty)) { -- return ((NodeT1*)mNode[1])->isActiveAndCache(ijk, *this); -+ return ((__global__ NodeT1*)mNode[1])->isActiveAndCache(ijk, *this); - } else if (this->isCached(dirty)) { -- return ((NodeT2*)mNode[2])->isActiveAndCache(ijk, *this); -+ return ((__global__ NodeT2*)mNode[2])->isActiveAndCache(ijk, *this); - } - return mRoot->isActiveAndCache(ijk, *this); - } -- -- __hostdev__ bool probeValue(const CoordType& ijk, ValueType& v) const -+#if defined(__KERNEL_METAL__) -+ __hostdev__ bool isActive(__local__ const CoordType& ijk) const __local__ - { - #ifdef USE_SINGLE_ACCESSOR_KEY - const CoordValueType dirty = this->computeDirty(ijk); - #else -- auto&& dirty = ijk; -+ __local__ auto&& dirty = ijk; - #endif - if (this->isCached(dirty)) { -- return ((LeafT*)mNode[0])->probeValue(ijk, v); -+ return ((__global__ LeafT*)mNode[0])->isActive(ijk); - } else if (this->isCached(dirty)) { -- return ((NodeT1*)mNode[1])->probeValueAndCache(ijk, v, *this); -+ return ((__global__ NodeT1*)mNode[1])->isActiveAndCache(ijk, *this); - } else if (this->isCached(dirty)) { -- return ((NodeT2*)mNode[2])->probeValueAndCache(ijk, v, *this); -+ return ((__global__ NodeT2*)mNode[2])->isActiveAndCache(ijk, *this); -+ } -+ return mRoot->isActiveAndCache(ijk, *this); -+ } -+#endif -+ -+ __hostdev__ bool probeValue(__global__ const CoordType& ijk, __global__ ValueType& v) const __global__ -+ { -+#ifdef USE_SINGLE_ACCESSOR_KEY -+ const CoordValueType dirty = this->computeDirty(ijk); -+#else -+ __global__ auto&& dirty = ijk; -+#endif -+ if (this->isCached(dirty)) { -+ return ((__global__ LeafT*)mNode[0])->probeValue(ijk, v); -+ } else if (this->isCached(dirty)) { -+ return ((__global__ NodeT1*)mNode[1])->probeValueAndCache(ijk, v, *this); -+ } else if (this->isCached(dirty)) { -+ return ((__global__ NodeT2*)mNode[2])->probeValueAndCache(ijk, v, *this); - } - return mRoot->probeValueAndCache(ijk, v, *this); - } - -- __hostdev__ const LeafT* probeLeaf(const CoordType& ijk) const -+ __hostdev__ __global__ const LeafT* probeLeaf(__global__ const CoordType& ijk) const __global__ - { - #ifdef USE_SINGLE_ACCESSOR_KEY - const CoordValueType dirty = this->computeDirty(ijk); - #else -- auto&& dirty = ijk; -+ __global__ auto&& dirty = ijk; - #endif - if (this->isCached(dirty)) { -- return ((LeafT*)mNode[0]); -+ return ((__global__ LeafT*)mNode[0]); - } else if (this->isCached(dirty)) { -- return ((NodeT1*)mNode[1])->probeLeafAndCache(ijk, *this); -+ return ((__global__ NodeT1*)mNode[1])->probeLeafAndCache(ijk, *this); - } else if (this->isCached(dirty)) { -- return ((NodeT2*)mNode[2])->probeLeafAndCache(ijk, *this); -+ return ((__global__ NodeT2*)mNode[2])->probeLeafAndCache(ijk, *this); - } - return mRoot->probeLeafAndCache(ijk, *this); - } - - template -- __hostdev__ uint32_t getDim(const CoordType& ijk, const RayT& ray) const -+ __hostdev__ uint32_t getDim(__global__ const CoordType& ijk, __global__ const RayT& ray) const __global__ - { - #ifdef USE_SINGLE_ACCESSOR_KEY - const CoordValueType dirty = this->computeDirty(ijk); - #else -- auto&& dirty = ijk; -+ __global__ auto&& dirty = ijk; - #endif - if (this->isCached(dirty)) { -- return ((LeafT*)mNode[0])->getDimAndCache(ijk, ray, *this); -+ return ((__global__ LeafT*)mNode[0])->getDimAndCache(ijk, ray, *this); - } else if (this->isCached(dirty)) { -- return ((NodeT1*)mNode[1])->getDimAndCache(ijk, ray, *this); -+ return ((__global__ NodeT1*)mNode[1])->getDimAndCache(ijk, ray, *this); - } else if (this->isCached(dirty)) { -- return ((NodeT2*)mNode[2])->getDimAndCache(ijk, ray, *this); -+ return ((__global__ NodeT2*)mNode[2])->getDimAndCache(ijk, ray, *this); - } - return mRoot->getDimAndCache(ijk, ray, *this); - } -+#if defined(__KERNEL_METAL__) -+ template -+ __hostdev__ uint32_t getDim(__global__ const CoordType& ijk, __local__ const RayT& ray) const __global__ -+ { -+#ifdef USE_SINGLE_ACCESSOR_KEY -+ const CoordValueType dirty = this->computeDirty(ijk); -+#else -+ __global__ auto&& dirty = ijk; -+#endif -+ if (this->isCached(dirty)) { -+ return ((__global__ LeafT*)mNode[0])->getDimAndCache(ijk, ray, *this); -+ } else if (this->isCached(dirty)) { -+ return ((__global__ NodeT1*)mNode[1])->getDimAndCache(ijk, ray, *this); -+ } else if (this->isCached(dirty)) { -+ return ((__global__ NodeT2*)mNode[2])->getDimAndCache(ijk, ray, *this); -+ } -+ return mRoot->getDimAndCache(ijk, ray, *this); -+ } -+ template -+ __hostdev__ uint32_t getDim(__local__ const CoordType& ijk, __local__ const RayT& ray) const __local__ -+ { -+#ifdef USE_SINGLE_ACCESSOR_KEY -+ const CoordValueType dirty = this->computeDirty(ijk); -+#else -+ __local__ auto&& dirty = ijk; -+#endif -+ if (this->isCached(dirty)) { -+ return ((__global__ LeafT*)mNode[0])->getDimAndCache(ijk, ray, *this); -+ } else if (this->isCached(dirty)) { -+ return ((__global__ NodeT1*)mNode[1])->getDimAndCache(ijk, ray, *this); -+ } else if (this->isCached(dirty)) { -+ return ((__global__ NodeT2*)mNode[2])->getDimAndCache(ijk, ray, *this); -+ } -+ return mRoot->getDimAndCache(ijk, ray, *this); -+ } -+#endif // __KERNEL_METAL__ - - private: - /// @brief Allow nodes to insert themselves into the cache. -@@ -5367,7 +6460,7 @@ private: - - /// @brief Inserts a leaf node and key pair into this ReadAccessor - template -- __hostdev__ void insert(const CoordType& ijk, const NodeT* node) const -+ __hostdev__ void insert(__global__ const CoordType& ijk, __global__ const NodeT* node) const __local__ - { - #ifdef USE_SINGLE_ACCESSOR_KEY - mKey = ijk; -@@ -5376,6 +6469,28 @@ private: - #endif - mNode[NodeT::LEVEL] = node; - } -+#if defined(__KERNEL_METAL__) -+ template -+ __hostdev__ void insert(__local__ const CoordType& ijk, __global__ const NodeT* node) const __local__ -+ { -+#ifdef USE_SINGLE_ACCESSOR_KEY -+ mKey = ijk; -+#else -+ mKeys[NodeT::LEVEL] = ijk & ~NodeT::MASK; -+#endif -+ mNode[NodeT::LEVEL] = node; -+ } -+ template -+ __hostdev__ void insert(__local__ const CoordType& ijk, __global__ const NodeT* node) const __global__ -+ { -+#ifdef USE_SINGLE_ACCESSOR_KEY -+ mKey = ijk; -+#else -+ mKeys[NodeT::LEVEL] = ijk & ~NodeT::MASK; -+#endif -+ mNode[NodeT::LEVEL] = node; -+ } -+#endif // __KERNEL_METAL__ - }; // ReadAccessor - - ////////////////////////////////////////////////// -@@ -5393,19 +6508,19 @@ private: - /// createAccessor<0,1,2>(grid): Caching of all nodes at all tree levels - - template --ReadAccessor createAccessor(const NanoGrid &grid) -+ReadAccessor createAccessor(__global__ const NanoGrid &grid) - { - return ReadAccessor(grid); - } - - template --ReadAccessor createAccessor(const NanoTree &tree) -+ReadAccessor createAccessor(__global__ const NanoTree &tree) - { - return ReadAccessor(tree); - } - - template --ReadAccessor createAccessor(const NanoRoot &root) -+ReadAccessor createAccessor(__global__ const NanoRoot &root) - { - return ReadAccessor(root); - } -@@ -5424,52 +6539,59 @@ class GridMetaData - // memory-layout of the data structure and the reasons why certain methods are safe - // to call and others are not! - using GridT = NanoGrid; -- __hostdev__ const GridT& grid() const { return *reinterpret_cast(this); } -+ __hostdev__ __global__ const GridT& grid() const __global__ { return *reinterpret_cast<__global__ const GridT*>(this); } - - public: -- __hostdev__ bool isValid() const { return this->grid().isValid(); } -- __hostdev__ uint64_t gridSize() const { return this->grid().gridSize(); } -- __hostdev__ uint32_t gridIndex() const { return this->grid().gridIndex(); } -- __hostdev__ uint32_t gridCount() const { return this->grid().gridCount(); } -- __hostdev__ const char* shortGridName() const { return this->grid().shortGridName(); } -- __hostdev__ GridType gridType() const { return this->grid().gridType(); } -- __hostdev__ GridClass gridClass() const { return this->grid().gridClass(); } -- __hostdev__ bool isLevelSet() const { return this->grid().isLevelSet(); } -- __hostdev__ bool isFogVolume() const { return this->grid().isFogVolume(); } -- __hostdev__ bool isPointIndex() const { return this->grid().isPointIndex(); } -- __hostdev__ bool isPointData() const { return this->grid().isPointData(); } -- __hostdev__ bool isMask() const { return this->grid().isMask(); } -- __hostdev__ bool isStaggered() const { return this->grid().isStaggered(); } -- __hostdev__ bool isUnknown() const { return this->grid().isUnknown(); } -- __hostdev__ const Map& map() const { return this->grid().map(); } -- __hostdev__ const BBox& worldBBox() const { return this->grid().worldBBox(); } -- __hostdev__ const BBox& indexBBox() const { return this->grid().indexBBox(); } -- __hostdev__ Vec3R voxelSize() const { return this->grid().voxelSize(); } -- __hostdev__ int blindDataCount() const { return this->grid().blindDataCount(); } -- __hostdev__ const GridBlindMetaData& blindMetaData(uint32_t n) const { return this->grid().blindMetaData(n); } -- __hostdev__ uint64_t activeVoxelCount() const { return this->grid().activeVoxelCount(); } -- __hostdev__ const uint32_t& activeTileCount(uint32_t level) const { return this->grid().tree().activeTileCount(level); } -- __hostdev__ uint32_t nodeCount(uint32_t level) const { return this->grid().tree().nodeCount(level); } -- __hostdev__ uint64_t checksum() const { return this->grid().checksum(); } -- __hostdev__ bool isEmpty() const { return this->grid().isEmpty(); } -- __hostdev__ Version version() const { return this->grid().version(); } -+ __hostdev__ bool isValid() const __global__ { return this->grid().isValid(); } -+ __hostdev__ uint64_t gridSize() const __global__ { return this->grid().gridSize(); } -+ __hostdev__ uint32_t gridIndex() const __global__ { return this->grid().gridIndex(); } -+ __hostdev__ uint32_t gridCount() const __global__ { return this->grid().gridCount(); } -+ __hostdev__ __global__ const char* shortGridName() const __global__ { return this->grid().shortGridName(); } -+ __hostdev__ GridType gridType() const __global__ { return this->grid().gridType(); } -+ __hostdev__ GridClass gridClass() const __global__ { return this->grid().gridClass(); } -+ __hostdev__ bool isLevelSet() const __global__ { return this->grid().isLevelSet(); } -+ __hostdev__ bool isFogVolume() const __global__ { return this->grid().isFogVolume(); } -+ __hostdev__ bool isPointIndex() const __global__ { return this->grid().isPointIndex(); } -+ __hostdev__ bool isPointData() const __global__ { return this->grid().isPointData(); } -+ __hostdev__ bool isMask() const __global__ { return this->grid().isMask(); } -+ __hostdev__ bool isStaggered() const __global__ { return this->grid().isStaggered(); } -+ __hostdev__ bool isUnknown() const __global__ { return this->grid().isUnknown(); } -+ __hostdev__ __global__ const Map& map() const __global__ { return this->grid().map(); } -+ __hostdev__ __global__ const BBox& worldBBox() const __global__ { return this->grid().worldBBox(); } -+ __hostdev__ __global__ const BBox& indexBBox() const __global__ { return this->grid().indexBBox(); } -+ __hostdev__ Vec3R voxelSize() const __global__ { return this->grid().voxelSize(); } -+ __hostdev__ int blindDataCount() const __global__ { return this->grid().blindDataCount(); } -+ __hostdev__ __global__ const GridBlindMetaData& blindMetaData(uint32_t n) const __global__ { return this->grid().blindMetaData(n); } -+ __hostdev__ uint64_t activeVoxelCount() const __global__ { return this->grid().activeVoxelCount(); } -+ __hostdev__ __global__ const uint32_t& activeTileCount(uint32_t level) const __global__ { return this->grid().tree().activeTileCount(level); } -+ __hostdev__ uint32_t nodeCount(uint32_t level) const __global__ { return this->grid().tree().nodeCount(level); } -+ __hostdev__ uint64_t checksum() const __global__ { return this->grid().checksum(); } -+ __hostdev__ bool isEmpty() const __global__ { return this->grid().isEmpty(); } -+ __hostdev__ Version version() const __global__ { return this->grid().version(); } - }; // GridMetaData - - /// @brief Class to access points at a specific voxel location - template --class PointAccessor : public DefaultReadAccessor -+class PointAccessor -+#if !defined(__KERNEL_METAL__) -+ : public DefaultReadAccessor -+#endif - { -+#if defined(__KERNEL_METAL__) -+ DefaultReadAccessor AccT; -+#else - using AccT = DefaultReadAccessor; -- const UInt32Grid* mGrid; -- const AttT* mData; -+#endif -+ const __global__ UInt32Grid* mGrid; -+ const __global__ AttT* mData; - - public: - using LeafNodeType = typename NanoRoot::LeafNodeType; - -- PointAccessor(const UInt32Grid& grid) -+ PointAccessor(__global__ const UInt32Grid& grid) __local__ - : AccT(grid.tree().root()) - , mGrid(&grid) -- , mData(reinterpret_cast(grid.blindData(0))) -+ , mData(reinterpret_cast<__global__ const AttT*>(grid.blindData(0))) - { - NANOVDB_ASSERT(grid.gridType() == GridType::UInt32); - NANOVDB_ASSERT((grid.gridClass() == GridClass::PointIndex && is_same::value) || -@@ -5478,7 +6600,7 @@ public: - } - /// @brief Return the total number of point in the grid and set the - /// iterators to the complete range of points. -- __hostdev__ uint64_t gridPoints(const AttT*& begin, const AttT*& end) const -+ __hostdev__ uint64_t gridPoints(__global__ const AttT*& begin, __global__ const AttT*& end) const __global__ - { - const uint64_t count = mGrid->blindMetaData(0u).mElementCount; - begin = mData; -@@ -5488,9 +6610,9 @@ public: - /// @brief Return the number of points in the leaf node containing the coordinate @a ijk. - /// If this return value is larger than zero then the iterators @a begin and @a end - /// will point to all the attributes contained within that leaf node. -- __hostdev__ uint64_t leafPoints(const Coord& ijk, const AttT*& begin, const AttT*& end) const -+ __hostdev__ uint64_t leafPoints(__global__ const Coord& ijk, __global__ const AttT*& begin, __global__ const AttT*& end) const __global__ - { -- auto* leaf = this->probeLeaf(ijk); -+ __global__ auto* leaf = this->probeLeaf(ijk); - if (leaf == nullptr) { - return 0; - } -@@ -5500,14 +6622,14 @@ public: - } - - /// @brief get iterators over offsets to points at a specific voxel location -- __hostdev__ uint64_t voxelPoints(const Coord& ijk, const AttT*& begin, const AttT*& end) const -+ __hostdev__ uint64_t voxelPoints(__global__ const Coord& ijk, __global__ const AttT*& begin, __global__ const AttT*& end) const __global__ - { -- auto* leaf = this->probeLeaf(ijk); -+ __global__ auto* leaf = this->probeLeaf(ijk); - if (leaf == nullptr) - return 0; - const uint32_t offset = LeafNodeType::CoordToOffset(ijk); - if (leaf->isActive(offset)) { -- auto* p = mData + leaf->minimum(); -+ __global__ auto* p = mData + leaf->minimum(); - begin = p + (offset == 0 ? 0 : leaf->getValue(offset - 1)); - end = p + leaf->getValue(offset); - return end - begin; -@@ -5520,11 +6642,20 @@ public: - /// - /// @note The ChannelT template parameter can be either const and non-const. - template --class ChannelAccessor : public DefaultReadAccessor -+class ChannelAccessor -+#if !defined (__KERNEL_METAL__) -+ : public DefaultReadAccessor -+#endif - { -+#if defined (__KERNEL_METAL__) -+ DefaultReadAccessor BaseT; -+#define BASE(v) BaseT.v -+#else - using BaseT = DefaultReadAccessor; -- const IndexGrid &mGrid; -- ChannelT *mChannel; -+#define BASE(v) BaseT::v -+#endif -+ __global__ const IndexGrid &mGrid; -+ __global__ ChannelT *mChannel; - - public: - using ValueType = ChannelT; -@@ -5533,7 +6664,7 @@ public: - - /// @brief Ctor from an IndexGrid and an integer ID of an internal channel - /// that is assumed to exist as blind data in the IndexGrid. -- __hostdev__ ChannelAccessor(const IndexGrid& grid, uint32_t channelID = 0u) -+ __hostdev__ ChannelAccessor(__global__ const IndexGrid& grid, uint32_t channelID = 0u) - : BaseT(grid.tree().root()) - , mGrid(grid) - , mChannel(nullptr) -@@ -5544,7 +6675,7 @@ public: - } - - /// @brief Ctor from an IndexGrid and an external channel -- __hostdev__ ChannelAccessor(const IndexGrid& grid, ChannelT *channelPtr) -+ __hostdev__ ChannelAccessor(__global__ const IndexGrid& grid, __global__ ChannelT *channelPtr) - : BaseT(grid.tree().root()) - , mGrid(grid) - , mChannel(channelPtr) -@@ -5555,19 +6686,19 @@ public: - } - - /// @brief Return a const reference to the IndexGrid -- __hostdev__ const IndexGrid &grid() const {return mGrid;} -+ __hostdev__ __global__ const IndexGrid &grid() const {return mGrid;} - - /// @brief Return a const reference to the tree of the IndexGrid -- __hostdev__ const IndexTree &tree() const {return mGrid.tree();} -+ __hostdev__ __global__ const IndexTree &tree() const {return mGrid.tree();} - - /// @brief Return a vector of the axial voxel sizes -- __hostdev__ const Vec3R& voxelSize() const { return mGrid.voxelSize(); } -+ __hostdev__ __global__ const Vec3R& voxelSize() const { return mGrid.voxelSize(); } - - /// @brief Return total number of values indexed by the IndexGrid -- __hostdev__ const uint64_t& valueCount() const { return mGrid.valueCount(); } -+ __hostdev__ uint64_t valueCount() const { return mGrid.valueCount(); } - - /// @brief Change to an external channel -- __hostdev__ void setChannel(ChannelT *channelPtr) -+ __hostdev__ void setChannel(__global__ ChannelT *channelPtr) - { - mChannel = channelPtr; - NANOVDB_ASSERT(mChannel); -@@ -5577,23 +6708,24 @@ public: - /// in the IndexGrid. - __hostdev__ void setChannel(uint32_t channelID) - { -- this->setChannel(reinterpret_cast(const_cast(mGrid.blindData(channelID)))); -+ this->setChannel(reinterpret_cast<__global__ ChannelT*>(const_cast<__global__ void*>(mGrid.blindData(channelID)))); - } - - /// @brief Return the linear offset into a channel that maps to the specified coordinate -- __hostdev__ uint64_t getIndex(const Coord& ijk) const {return BaseT::getValue(ijk);} -- __hostdev__ uint64_t idx(int i, int j, int k) const {return BaseT::getValue(Coord(i,j,k));} -+ __hostdev__ uint64_t getIndex(__global__ const Coord& ijk) const {return BASE(getValue)(ijk);} -+ __hostdev__ uint64_t idx(int i, int j, int k) const {return BASE(getValue)(Coord(i,j,k));} - - /// @brief Return the value from a cached channel that maps to the specified coordinate -- __hostdev__ ChannelT& getValue(const Coord& ijk) const {return mChannel[BaseT::getValue(ijk)];} -- __hostdev__ ChannelT& operator()(const Coord& ijk) const {return this->getValue(ijk);} -- __hostdev__ ChannelT& operator()(int i, int j, int k) const {return this->getValue(Coord(i,j,k));} -+ __hostdev__ __global__ ChannelT& getValue(__global__ const Coord& ijk) const {return mChannel[BASE(getValue)(ijk)];} -+ __hostdev__ __global__ ChannelT& operator()(__global__ const Coord& ijk) const {return this->getValue(ijk);} -+ __hostdev__ __global__ ChannelT& operator()(int i, int j, int k) const {return this->getValue(Coord(i,j,k));} - - /// @brief return the state and updates the value of the specified voxel -- __hostdev__ bool probeValue(const CoordType& ijk, typename remove_const::type &v) const -+ using CoordType = DefaultReadAccessor::CoordType; -+ __hostdev__ bool probeValue(__global__ const CoordType& ijk, __global__ typename remove_const::type &v) const - { - uint64_t idx; -- const bool isActive = BaseT::probeValue(ijk, idx); -+ const bool isActive = BASE(probeValue)(ijk, idx); - v = mChannel[idx]; - return isActive; - } -@@ -5601,7 +6733,7 @@ public: - /// - /// @note The template parameter can be either const or non-const - template -- __hostdev__ T& getValue(const Coord& ijk, T* channelPtr) const {return channelPtr[BaseT::getValue(ijk)];} -+ __hostdev__ __global__ T& getValue(__global__ const Coord& ijk, __global__ T* channelPtr) const {return channelPtr[BASE(getValue)(ijk)];} - - }; // ChannelAccessor - -@@ -5643,6 +6775,7 @@ namespace io { - /// @throw std::invalid_argument if buffer does not point to a valid NanoVDB grid. - /// - /// @warning This is pretty ugly code that involves lots of pointer and bit manipulations - not for the faint of heart :) -+#if !defined(__KERNEL_METAL__) - template // StreamT class must support: "void write(char*, size_t)" - void writeUncompressedGrid(StreamT &os, const void *buffer) - { -@@ -5768,7 +6901,7 @@ VecT readUncompressedGrids(const char *fileName, const typename Gri - } - return readUncompressedGrids(is, buffer); - }// readUncompressedGrids -- -+#endif // #if !defined(__KERNEL_METAL__) - } // namespace io - - #endif// if !defined(__CUDA_ARCH__) && !defined(__HIP__) -diff --git a/nanovdb/nanovdb/util/SampleFromVoxels.h b/nanovdb/nanovdb/util/SampleFromVoxels.h -index e779d66..e2f9283 100644 ---- a/nanovdb/nanovdb/util/SampleFromVoxels.h -+++ b/nanovdb/nanovdb/util/SampleFromVoxels.h -@@ -1,983 +1,1120 @@ --// Copyright Contributors to the OpenVDB Project --// SPDX-License-Identifier: MPL-2.0 -- --////////////////////////////////////////////////////////////////////////// --/// --/// @file SampleFromVoxels.h --/// --/// @brief NearestNeighborSampler, TrilinearSampler, TriquadraticSampler and TricubicSampler --/// --/// @note These interpolators employ internal caching for better performance when used repeatedly --/// in the same voxel location, so try to reuse an instance of these classes more than once. --/// --/// @warning While all the interpolators defined below work with both scalars and vectors --/// values (e.g. float and Vec3) TrilinarSampler::zeroCrossing and --/// Trilinear::gradient will only compile with floating point value types. --/// --/// @author Ken Museth --/// --/////////////////////////////////////////////////////////////////////////// -- --#ifndef NANOVDB_SAMPLE_FROM_VOXELS_H_HAS_BEEN_INCLUDED --#define NANOVDB_SAMPLE_FROM_VOXELS_H_HAS_BEEN_INCLUDED -- --// Only define __hostdev__ when compiling as NVIDIA CUDA --#if defined(__CUDACC__) || defined(__HIP__) --#define __hostdev__ __host__ __device__ --#else --#include // for floor --#define __hostdev__ --#endif -- --namespace nanovdb { -- --// Forward declaration of sampler with specific polynomial orders --template --class SampleFromVoxels; -- --/// @brief Factory free-function for a sampler of specific polynomial orders --/// --/// @details This allows for the compact syntax: --/// @code --/// auto acc = grid.getAccessor(); --/// auto smp = nanovdb::createSampler<1>( acc ); --/// @endcode --template --__hostdev__ SampleFromVoxels createSampler(const TreeOrAccT& acc) --{ -- return SampleFromVoxels(acc); --} -- --/// @brief Utility function that returns the Coord of the round-down of @a xyz --/// and redefined @xyz as the fractional part, ie xyz-in = return-value + xyz-out --template class Vec3T> --__hostdev__ inline CoordT Floor(Vec3T& xyz); -- --/// @brief Template specialization of Floor for Vec3 --template class Vec3T> --__hostdev__ inline CoordT Floor(Vec3T& xyz) --{ -- const float ijk[3] = {floorf(xyz[0]), floorf(xyz[1]), floorf(xyz[2])}; -- xyz[0] -= ijk[0]; -- xyz[1] -= ijk[1]; -- xyz[2] -= ijk[2]; -- return CoordT(int32_t(ijk[0]), int32_t(ijk[1]), int32_t(ijk[2])); --} -- --/// @brief Template specialization of Floor for Vec3 --template class Vec3T> --__hostdev__ inline CoordT Floor(Vec3T& xyz) --{ -- const double ijk[3] = {floor(xyz[0]), floor(xyz[1]), floor(xyz[2])}; -- xyz[0] -= ijk[0]; -- xyz[1] -= ijk[1]; -- xyz[2] -= ijk[2]; -- return CoordT(int32_t(ijk[0]), int32_t(ijk[1]), int32_t(ijk[2])); --} -- --// ------------------------------> NearestNeighborSampler <-------------------------------------- -- --/// @brief Nearest neighbor, i.e. zero order, interpolator with caching --template --class SampleFromVoxels --{ --public: -- using ValueT = typename TreeOrAccT::ValueType; -- using CoordT = typename TreeOrAccT::CoordType; -- -- static const int ORDER = 0; -- /// @brief Construction from a Tree or ReadAccessor -- __hostdev__ SampleFromVoxels(const TreeOrAccT& acc) -- : mAcc(acc) -- , mPos(CoordT::max()) -- { -- } -- -- __hostdev__ const TreeOrAccT& accessor() const { return mAcc; } -- -- /// @note xyz is in index space space -- template -- inline __hostdev__ ValueT operator()(const Vec3T& xyz) const; -- -- inline __hostdev__ ValueT operator()(const CoordT& ijk) const; -- --private: -- const TreeOrAccT& mAcc; -- mutable CoordT mPos; -- mutable ValueT mVal; // private cache --}; // SampleFromVoxels -- --/// @brief Nearest neighbor, i.e. zero order, interpolator without caching --template --class SampleFromVoxels --{ --public: -- using ValueT = typename TreeOrAccT::ValueType; -- using CoordT = typename TreeOrAccT::CoordType; -- static const int ORDER = 0; -- -- /// @brief Construction from a Tree or ReadAccessor -- __hostdev__ SampleFromVoxels(const TreeOrAccT& acc) -- : mAcc(acc) -- { -- } -- -- __hostdev__ const TreeOrAccT& accessor() const { return mAcc; } -- -- /// @note xyz is in index space space -- template -- inline __hostdev__ ValueT operator()(const Vec3T& xyz) const; -- -- inline __hostdev__ ValueT operator()(const CoordT& ijk) const { return mAcc.getValue(ijk);} -- --private: -- const TreeOrAccT& mAcc; --}; // SampleFromVoxels -- --template --template --__hostdev__ typename TreeOrAccT::ValueType SampleFromVoxels::operator()(const Vec3T& xyz) const --{ -- const CoordT ijk = Round(xyz); -- if (ijk != mPos) { -- mPos = ijk; -- mVal = mAcc.getValue(mPos); -- } -- return mVal; --} -- --template --__hostdev__ typename TreeOrAccT::ValueType SampleFromVoxels::operator()(const CoordT& ijk) const --{ -- if (ijk != mPos) { -- mPos = ijk; -- mVal = mAcc.getValue(mPos); -- } -- return mVal; --} -- --template --template --__hostdev__ typename TreeOrAccT::ValueType SampleFromVoxels::operator()(const Vec3T& xyz) const --{ -- return mAcc.getValue(Round(xyz)); --} -- --// ------------------------------> TrilinearSampler <-------------------------------------- -- --/// @brief Tri-linear sampler, i.e. first order, interpolator --template --class TrilinearSampler --{ --protected: -- const TreeOrAccT& mAcc; -- --public: -- using ValueT = typename TreeOrAccT::ValueType; -- using CoordT = typename TreeOrAccT::CoordType; -- static const int ORDER = 1; -- -- /// @brief Protected constructor from a Tree or ReadAccessor -- __hostdev__ TrilinearSampler(const TreeOrAccT& acc) : mAcc(acc) {} -- -- __hostdev__ const TreeOrAccT& accessor() const { return mAcc; } -- -- /// @brief Extract the stencil of 8 values -- inline __hostdev__ void stencil(CoordT& ijk, ValueT (&v)[2][2][2]) const; -- -- template class Vec3T> -- static inline __hostdev__ ValueT sample(const Vec3T &uvw, const ValueT (&v)[2][2][2]); -- -- template class Vec3T> -- static inline __hostdev__ Vec3T gradient(const Vec3T &uvw, const ValueT (&v)[2][2][2]); -- -- static inline __hostdev__ bool zeroCrossing(const ValueT (&v)[2][2][2]); --}; // TrilinearSamplerBase -- --template --__hostdev__ void TrilinearSampler::stencil(CoordT& ijk, ValueT (&v)[2][2][2]) const --{ -- v[0][0][0] = mAcc.getValue(ijk); // i, j, k -- -- ijk[2] += 1; -- v[0][0][1] = mAcc.getValue(ijk); // i, j, k + 1 -- -- ijk[1] += 1; -- v[0][1][1] = mAcc.getValue(ijk); // i, j+1, k + 1 -- -- ijk[2] -= 1; -- v[0][1][0] = mAcc.getValue(ijk); // i, j+1, k -- -- ijk[0] += 1; -- ijk[1] -= 1; -- v[1][0][0] = mAcc.getValue(ijk); // i+1, j, k -- -- ijk[2] += 1; -- v[1][0][1] = mAcc.getValue(ijk); // i+1, j, k + 1 -- -- ijk[1] += 1; -- v[1][1][1] = mAcc.getValue(ijk); // i+1, j+1, k + 1 -- -- ijk[2] -= 1; -- v[1][1][0] = mAcc.getValue(ijk); // i+1, j+1, k --} -- --template --template class Vec3T> --__hostdev__ typename TreeOrAccT::ValueType TrilinearSampler::sample(const Vec3T &uvw, const ValueT (&v)[2][2][2]) --{ --#if 0 -- auto lerp = [](ValueT a, ValueT b, ValueT w){ return fma(w, b-a, a); };// = w*(b-a) + a -- //auto lerp = [](ValueT a, ValueT b, ValueT w){ return fma(w, b, fma(-w, a, a));};// = (1-w)*a + w*b --#else -- auto lerp = [](ValueT a, ValueT b, RealT w) { return a + ValueT(w) * (b - a); }; --#endif -- return lerp(lerp(lerp(v[0][0][0], v[0][0][1], uvw[2]), lerp(v[0][1][0], v[0][1][1], uvw[2]), uvw[1]), -- lerp(lerp(v[1][0][0], v[1][0][1], uvw[2]), lerp(v[1][1][0], v[1][1][1], uvw[2]), uvw[1]), -- uvw[0]); --} -- --template --template class Vec3T> --__hostdev__ Vec3T TrilinearSampler::gradient(const Vec3T &uvw, const ValueT (&v)[2][2][2]) --{ -- static_assert(is_floating_point::value, "TrilinearSampler::gradient requires a floating-point type"); --#if 0 -- auto lerp = [](ValueT a, ValueT b, ValueT w){ return fma(w, b-a, a); };// = w*(b-a) + a -- //auto lerp = [](ValueT a, ValueT b, ValueT w){ return fma(w, b, fma(-w, a, a));};// = (1-w)*a + w*b --#else -- auto lerp = [](ValueT a, ValueT b, RealT w) { return a + ValueT(w) * (b - a); }; --#endif -- -- ValueT D[4] = {v[0][0][1] - v[0][0][0], v[0][1][1] - v[0][1][0], v[1][0][1] - v[1][0][0], v[1][1][1] - v[1][1][0]}; -- -- // Z component -- Vec3T grad(0, 0, lerp(lerp(D[0], D[1], uvw[1]), lerp(D[2], D[3], uvw[1]), uvw[0])); -- -- const ValueT w = ValueT(uvw[2]); -- D[0] = v[0][0][0] + D[0] * w; -- D[1] = v[0][1][0] + D[1] * w; -- D[2] = v[1][0][0] + D[2] * w; -- D[3] = v[1][1][0] + D[3] * w; -- -- // X component -- grad[0] = lerp(D[2], D[3], uvw[1]) - lerp(D[0], D[1], uvw[1]); -- -- // Y component -- grad[1] = lerp(D[1] - D[0], D[3] - D[2], uvw[0]); -- -- return grad; --} -- --template --__hostdev__ bool TrilinearSampler::zeroCrossing(const ValueT (&v)[2][2][2]) --{ -- static_assert(is_floating_point::value, "TrilinearSampler::zeroCrossing requires a floating-point type"); -- const bool less = v[0][0][0] < ValueT(0); -- return (less ^ (v[0][0][1] < ValueT(0))) || -- (less ^ (v[0][1][1] < ValueT(0))) || -- (less ^ (v[0][1][0] < ValueT(0))) || -- (less ^ (v[1][0][0] < ValueT(0))) || -- (less ^ (v[1][0][1] < ValueT(0))) || -- (less ^ (v[1][1][1] < ValueT(0))) || -- (less ^ (v[1][1][0] < ValueT(0))); --} -- --/// @brief Template specialization that does not use caching of stencil points --template --class SampleFromVoxels : public TrilinearSampler --{ -- using BaseT = TrilinearSampler; -- using ValueT = typename TreeOrAccT::ValueType; -- using CoordT = typename TreeOrAccT::CoordType; -- --public: -- -- /// @brief Construction from a Tree or ReadAccessor -- __hostdev__ SampleFromVoxels(const TreeOrAccT& acc) : BaseT(acc) {} -- -- /// @note xyz is in index space space -- template class Vec3T> -- inline __hostdev__ ValueT operator()(Vec3T xyz) const; -- -- /// @note ijk is in index space space -- __hostdev__ ValueT operator()(const CoordT &ijk) const {return BaseT::mAcc.getValue(ijk);} -- -- /// @brief Return the gradient in index space. -- /// -- /// @warning Will only compile with floating point value types -- template class Vec3T> -- inline __hostdev__ Vec3T gradient(Vec3T xyz) const; -- -- /// @brief Return true if the tr-linear stencil has a zero crossing at the specified index position. -- /// -- /// @warning Will only compile with floating point value types -- template class Vec3T> -- inline __hostdev__ bool zeroCrossing(Vec3T xyz) const; -- --}; // SampleFromVoxels -- --/// @brief Template specialization with caching of stencil values --template --class SampleFromVoxels : public TrilinearSampler --{ -- using BaseT = TrilinearSampler; -- using ValueT = typename TreeOrAccT::ValueType; -- using CoordT = typename TreeOrAccT::CoordType; -- -- mutable CoordT mPos; -- mutable ValueT mVal[2][2][2]; -- -- template class Vec3T> -- __hostdev__ void cache(Vec3T& xyz) const; --public: -- -- /// @brief Construction from a Tree or ReadAccessor -- __hostdev__ SampleFromVoxels(const TreeOrAccT& acc) : BaseT(acc), mPos(CoordT::max()){} -- -- /// @note xyz is in index space space -- template class Vec3T> -- inline __hostdev__ ValueT operator()(Vec3T xyz) const; -- -- // @note ijk is in index space space -- __hostdev__ ValueT operator()(const CoordT &ijk) const; -- -- /// @brief Return the gradient in index space. -- /// -- /// @warning Will only compile with floating point value types -- template class Vec3T> -- inline __hostdev__ Vec3T gradient(Vec3T xyz) const; -- -- /// @brief Return true if the tr-linear stencil has a zero crossing at the specified index position. -- /// -- /// @warning Will only compile with floating point value types -- template class Vec3T> -- inline __hostdev__ bool zeroCrossing(Vec3T xyz) const; -- -- /// @brief Return true if the cached tri-linear stencil has a zero crossing. -- /// -- /// @warning Will only compile with floating point value types -- __hostdev__ bool zeroCrossing() const { return BaseT::zeroCrossing(mVal); } -- --}; // SampleFromVoxels -- --template --template class Vec3T> --__hostdev__ typename TreeOrAccT::ValueType SampleFromVoxels::operator()(Vec3T xyz) const --{ -- this->cache(xyz); -- return BaseT::sample(xyz, mVal); --} -- --template --__hostdev__ typename TreeOrAccT::ValueType SampleFromVoxels::operator()(const CoordT &ijk) const --{ -- return ijk == mPos ? mVal[0][0][0] : BaseT::mAcc.getValue(ijk); --} -- --template --template class Vec3T> --__hostdev__ Vec3T SampleFromVoxels::gradient(Vec3T xyz) const --{ -- this->cache(xyz); -- return BaseT::gradient(xyz, mVal); --} -- --template --template class Vec3T> --__hostdev__ bool SampleFromVoxels::zeroCrossing(Vec3T xyz) const --{ -- this->cache(xyz); -- return BaseT::zeroCrossing(mVal); --} -- --template --template class Vec3T> --__hostdev__ void SampleFromVoxels::cache(Vec3T& xyz) const --{ -- CoordT ijk = Floor(xyz); -- if (ijk != mPos) { -- mPos = ijk; -- BaseT::stencil(ijk, mVal); -- } --} -- --#if 0 -- --template --template class Vec3T> --__hostdev__ typename TreeOrAccT::ValueType SampleFromVoxels::operator()(Vec3T xyz) const --{ -- ValueT val[2][2][2]; -- CoordT ijk = Floor(xyz); -- BaseT::stencil(ijk, val); -- return BaseT::sample(xyz, val); --} -- --#else -- --template --template class Vec3T> --__hostdev__ typename TreeOrAccT::ValueType SampleFromVoxels::operator()(Vec3T xyz) const --{ -- auto lerp = [](ValueT a, ValueT b, RealT w) { return a + ValueT(w) * (b - a); }; -- -- CoordT coord = Floor(xyz); -- -- ValueT vx, vx1, vy, vy1, vz, vz1; -- -- vz = BaseT::mAcc.getValue(coord); -- coord[2] += 1; -- vz1 = BaseT::mAcc.getValue(coord); -- vy = lerp(vz, vz1, xyz[2]); -- -- coord[1] += 1; -- -- vz1 = BaseT::mAcc.getValue(coord); -- coord[2] -= 1; -- vz = BaseT::mAcc.getValue(coord); -- vy1 = lerp(vz, vz1, xyz[2]); -- -- vx = lerp(vy, vy1, xyz[1]); -- -- coord[0] += 1; -- -- vz = BaseT::mAcc.getValue(coord); -- coord[2] += 1; -- vz1 = BaseT::mAcc.getValue(coord); -- vy1 = lerp(vz, vz1, xyz[2]); -- -- coord[1] -= 1; -- -- vz1 = BaseT::mAcc.getValue(coord); -- coord[2] -= 1; -- vz = BaseT::mAcc.getValue(coord); -- vy = lerp(vz, vz1, xyz[2]); -- -- vx1 = lerp(vy, vy1, xyz[1]); -- -- return lerp(vx, vx1, xyz[0]); --} --#endif -- -- --template --template class Vec3T> --__hostdev__ inline Vec3T SampleFromVoxels::gradient(Vec3T xyz) const --{ -- ValueT val[2][2][2]; -- CoordT ijk = Floor(xyz); -- BaseT::stencil(ijk, val); -- return BaseT::gradient(xyz, val); --} -- --template --template class Vec3T> --__hostdev__ bool SampleFromVoxels::zeroCrossing(Vec3T xyz) const --{ -- ValueT val[2][2][2]; -- CoordT ijk = Floor(xyz); -- BaseT::stencil(ijk, val); -- return BaseT::zeroCrossing(val); --} -- --// ------------------------------> TriquadraticSampler <-------------------------------------- -- --/// @brief Tri-quadratic sampler, i.e. second order, interpolator --template --class TriquadraticSampler --{ --protected: -- const TreeOrAccT& mAcc; -- --public: -- using ValueT = typename TreeOrAccT::ValueType; -- using CoordT = typename TreeOrAccT::CoordType; -- static const int ORDER = 1; -- -- /// @brief Protected constructor from a Tree or ReadAccessor -- __hostdev__ TriquadraticSampler(const TreeOrAccT& acc) : mAcc(acc) {} -- -- __hostdev__ const TreeOrAccT& accessor() const { return mAcc; } -- -- /// @brief Extract the stencil of 27 values -- inline __hostdev__ void stencil(const CoordT &ijk, ValueT (&v)[3][3][3]) const; -- -- template class Vec3T> -- static inline __hostdev__ ValueT sample(const Vec3T &uvw, const ValueT (&v)[3][3][3]); -- -- static inline __hostdev__ bool zeroCrossing(const ValueT (&v)[3][3][3]); --}; // TriquadraticSamplerBase -- --template --__hostdev__ void TriquadraticSampler::stencil(const CoordT &ijk, ValueT (&v)[3][3][3]) const --{ -- CoordT p(ijk[0] - 1, 0, 0); -- for (int dx = 0; dx < 3; ++dx, ++p[0]) { -- p[1] = ijk[1] - 1; -- for (int dy = 0; dy < 3; ++dy, ++p[1]) { -- p[2] = ijk[2] - 1; -- for (int dz = 0; dz < 3; ++dz, ++p[2]) { -- v[dx][dy][dz] = mAcc.getValue(p);// extract the stencil of 27 values -- } -- } -- } --} -- --template --template class Vec3T> --__hostdev__ typename TreeOrAccT::ValueType TriquadraticSampler::sample(const Vec3T &uvw, const ValueT (&v)[3][3][3]) --{ -- auto kernel = [](const ValueT* value, double weight)->ValueT { -- return weight * (weight * (0.5f * (value[0] + value[2]) - value[1]) + -- 0.5f * (value[2] - value[0])) + value[1]; -- }; -- -- ValueT vx[3]; -- for (int dx = 0; dx < 3; ++dx) { -- ValueT vy[3]; -- for (int dy = 0; dy < 3; ++dy) { -- vy[dy] = kernel(&v[dx][dy][0], uvw[2]); -- }//loop over y -- vx[dx] = kernel(vy, uvw[1]); -- }//loop over x -- return kernel(vx, uvw[0]); --} -- --template --__hostdev__ bool TriquadraticSampler::zeroCrossing(const ValueT (&v)[3][3][3]) --{ -- static_assert(is_floating_point::value, "TrilinearSampler::zeroCrossing requires a floating-point type"); -- const bool less = v[0][0][0] < ValueT(0); -- for (int dx = 0; dx < 3; ++dx) { -- for (int dy = 0; dy < 3; ++dy) { -- for (int dz = 0; dz < 3; ++dz) { -- if (less ^ (v[dx][dy][dz] < ValueT(0))) return true; -- } -- } -- } -- return false; --} -- --/// @brief Template specialization that does not use caching of stencil points --template --class SampleFromVoxels : public TriquadraticSampler --{ -- using BaseT = TriquadraticSampler; -- using ValueT = typename TreeOrAccT::ValueType; -- using CoordT = typename TreeOrAccT::CoordType; --public: -- -- /// @brief Construction from a Tree or ReadAccessor -- __hostdev__ SampleFromVoxels(const TreeOrAccT& acc) : BaseT(acc) {} -- -- /// @note xyz is in index space space -- template class Vec3T> -- inline __hostdev__ ValueT operator()(Vec3T xyz) const; -- -- __hostdev__ ValueT operator()(const CoordT &ijk) const {return BaseT::mAcc.getValue(ijk);} -- -- /// @brief Return true if the tr-linear stencil has a zero crossing at the specified index position. -- /// -- /// @warning Will only compile with floating point value types -- template class Vec3T> -- inline __hostdev__ bool zeroCrossing(Vec3T xyz) const; -- --}; // SampleFromVoxels -- --/// @brief Template specialization with caching of stencil values --template --class SampleFromVoxels : public TriquadraticSampler --{ -- using BaseT = TriquadraticSampler; -- using ValueT = typename TreeOrAccT::ValueType; -- using CoordT = typename TreeOrAccT::CoordType; -- -- mutable CoordT mPos; -- mutable ValueT mVal[3][3][3]; -- -- template class Vec3T> -- __hostdev__ void cache(Vec3T& xyz) const; --public: -- -- /// @brief Construction from a Tree or ReadAccessor -- __hostdev__ SampleFromVoxels(const TreeOrAccT& acc) : BaseT(acc), mPos(CoordT::max()){} -- -- /// @note xyz is in index space space -- template class Vec3T> -- inline __hostdev__ ValueT operator()(Vec3T xyz) const; -- -- inline __hostdev__ ValueT operator()(const CoordT &ijk) const; -- -- /// @brief Return true if the tr-linear stencil has a zero crossing at the specified index position. -- /// -- /// @warning Will only compile with floating point value types -- template class Vec3T> -- inline __hostdev__ bool zeroCrossing(Vec3T xyz) const; -- -- /// @brief Return true if the cached tri-linear stencil has a zero crossing. -- /// -- /// @warning Will only compile with floating point value types -- __hostdev__ bool zeroCrossing() const { return BaseT::zeroCrossing(mVal); } -- --}; // SampleFromVoxels -- --template --template class Vec3T> --__hostdev__ typename TreeOrAccT::ValueType SampleFromVoxels::operator()(Vec3T xyz) const --{ -- this->cache(xyz); -- return BaseT::sample(xyz, mVal); --} -- --template --__hostdev__ typename TreeOrAccT::ValueType SampleFromVoxels::operator()(const CoordT &ijk) const --{ -- return ijk == mPos ? mVal[1][1][1] : BaseT::mAcc.getValue(ijk); --} -- --template --template class Vec3T> --__hostdev__ bool SampleFromVoxels::zeroCrossing(Vec3T xyz) const --{ -- this->cache(xyz); -- return BaseT::zeroCrossing(mVal); --} -- --template --template class Vec3T> --__hostdev__ void SampleFromVoxels::cache(Vec3T& xyz) const --{ -- CoordT ijk = Floor(xyz); -- if (ijk != mPos) { -- mPos = ijk; -- BaseT::stencil(ijk, mVal); -- } --} -- --template --template class Vec3T> --__hostdev__ typename TreeOrAccT::ValueType SampleFromVoxels::operator()(Vec3T xyz) const --{ -- ValueT val[3][3][3]; -- CoordT ijk = Floor(xyz); -- BaseT::stencil(ijk, val); -- return BaseT::sample(xyz, val); --} -- --template --template class Vec3T> --__hostdev__ bool SampleFromVoxels::zeroCrossing(Vec3T xyz) const --{ -- ValueT val[3][3][3]; -- CoordT ijk = Floor(xyz); -- BaseT::stencil(ijk, val); -- return BaseT::zeroCrossing(val); --} -- --// ------------------------------> TricubicSampler <-------------------------------------- -- --/// @brief Tri-cubic sampler, i.e. third order, interpolator. --/// --/// @details See the following paper for implementation details: --/// Lekien, F. and Marsden, J.: Tricubic interpolation in three dimensions. --/// In: International Journal for Numerical Methods --/// in Engineering (2005), No. 63, p. 455-471 -- --template --class TricubicSampler --{ --protected: -- using ValueT = typename TreeOrAccT::ValueType; -- using CoordT = typename TreeOrAccT::CoordType; -- -- const TreeOrAccT& mAcc; -- --public: -- /// @brief Construction from a Tree or ReadAccessor -- __hostdev__ TricubicSampler(const TreeOrAccT& acc) -- : mAcc(acc) -- { -- } -- -- __hostdev__ const TreeOrAccT& accessor() const { return mAcc; } -- -- /// @brief Extract the stencil of 8 values -- inline __hostdev__ void stencil(const CoordT& ijk, ValueT (&c)[64]) const; -- -- template class Vec3T> -- static inline __hostdev__ ValueT sample(const Vec3T &uvw, const ValueT (&c)[64]); --}; // TricubicSampler -- --template --__hostdev__ void TricubicSampler::stencil(const CoordT& ijk, ValueT (&C)[64]) const --{ -- auto fetch = [&](int i, int j, int k) -> ValueT& { return C[((i + 1) << 4) + ((j + 1) << 2) + k + 1]; }; -- -- // fetch 64 point stencil values -- for (int i = -1; i < 3; ++i) { -- for (int j = -1; j < 3; ++j) { -- fetch(i, j, -1) = mAcc.getValue(ijk + CoordT(i, j, -1)); -- fetch(i, j, 0) = mAcc.getValue(ijk + CoordT(i, j, 0)); -- fetch(i, j, 1) = mAcc.getValue(ijk + CoordT(i, j, 1)); -- fetch(i, j, 2) = mAcc.getValue(ijk + CoordT(i, j, 2)); -- } -- } -- const ValueT half(0.5), quarter(0.25), eighth(0.125); -- const ValueT X[64] = {// values of f(x,y,z) at the 8 corners (each from 1 stencil value). -- fetch(0, 0, 0), -- fetch(1, 0, 0), -- fetch(0, 1, 0), -- fetch(1, 1, 0), -- fetch(0, 0, 1), -- fetch(1, 0, 1), -- fetch(0, 1, 1), -- fetch(1, 1, 1), -- // values of df/dx at the 8 corners (each from 2 stencil values). -- half * (fetch(1, 0, 0) - fetch(-1, 0, 0)), -- half * (fetch(2, 0, 0) - fetch(0, 0, 0)), -- half * (fetch(1, 1, 0) - fetch(-1, 1, 0)), -- half * (fetch(2, 1, 0) - fetch(0, 1, 0)), -- half * (fetch(1, 0, 1) - fetch(-1, 0, 1)), -- half * (fetch(2, 0, 1) - fetch(0, 0, 1)), -- half * (fetch(1, 1, 1) - fetch(-1, 1, 1)), -- half * (fetch(2, 1, 1) - fetch(0, 1, 1)), -- // values of df/dy at the 8 corners (each from 2 stencil values). -- half * (fetch(0, 1, 0) - fetch(0, -1, 0)), -- half * (fetch(1, 1, 0) - fetch(1, -1, 0)), -- half * (fetch(0, 2, 0) - fetch(0, 0, 0)), -- half * (fetch(1, 2, 0) - fetch(1, 0, 0)), -- half * (fetch(0, 1, 1) - fetch(0, -1, 1)), -- half * (fetch(1, 1, 1) - fetch(1, -1, 1)), -- half * (fetch(0, 2, 1) - fetch(0, 0, 1)), -- half * (fetch(1, 2, 1) - fetch(1, 0, 1)), -- // values of df/dz at the 8 corners (each from 2 stencil values). -- half * (fetch(0, 0, 1) - fetch(0, 0, -1)), -- half * (fetch(1, 0, 1) - fetch(1, 0, -1)), -- half * (fetch(0, 1, 1) - fetch(0, 1, -1)), -- half * (fetch(1, 1, 1) - fetch(1, 1, -1)), -- half * (fetch(0, 0, 2) - fetch(0, 0, 0)), -- half * (fetch(1, 0, 2) - fetch(1, 0, 0)), -- half * (fetch(0, 1, 2) - fetch(0, 1, 0)), -- half * (fetch(1, 1, 2) - fetch(1, 1, 0)), -- // values of d2f/dxdy at the 8 corners (each from 4 stencil values). -- quarter * (fetch(1, 1, 0) - fetch(-1, 1, 0) - fetch(1, -1, 0) + fetch(-1, -1, 0)), -- quarter * (fetch(2, 1, 0) - fetch(0, 1, 0) - fetch(2, -1, 0) + fetch(0, -1, 0)), -- quarter * (fetch(1, 2, 0) - fetch(-1, 2, 0) - fetch(1, 0, 0) + fetch(-1, 0, 0)), -- quarter * (fetch(2, 2, 0) - fetch(0, 2, 0) - fetch(2, 0, 0) + fetch(0, 0, 0)), -- quarter * (fetch(1, 1, 1) - fetch(-1, 1, 1) - fetch(1, -1, 1) + fetch(-1, -1, 1)), -- quarter * (fetch(2, 1, 1) - fetch(0, 1, 1) - fetch(2, -1, 1) + fetch(0, -1, 1)), -- quarter * (fetch(1, 2, 1) - fetch(-1, 2, 1) - fetch(1, 0, 1) + fetch(-1, 0, 1)), -- quarter * (fetch(2, 2, 1) - fetch(0, 2, 1) - fetch(2, 0, 1) + fetch(0, 0, 1)), -- // values of d2f/dxdz at the 8 corners (each from 4 stencil values). -- quarter * (fetch(1, 0, 1) - fetch(-1, 0, 1) - fetch(1, 0, -1) + fetch(-1, 0, -1)), -- quarter * (fetch(2, 0, 1) - fetch(0, 0, 1) - fetch(2, 0, -1) + fetch(0, 0, -1)), -- quarter * (fetch(1, 1, 1) - fetch(-1, 1, 1) - fetch(1, 1, -1) + fetch(-1, 1, -1)), -- quarter * (fetch(2, 1, 1) - fetch(0, 1, 1) - fetch(2, 1, -1) + fetch(0, 1, -1)), -- quarter * (fetch(1, 0, 2) - fetch(-1, 0, 2) - fetch(1, 0, 0) + fetch(-1, 0, 0)), -- quarter * (fetch(2, 0, 2) - fetch(0, 0, 2) - fetch(2, 0, 0) + fetch(0, 0, 0)), -- quarter * (fetch(1, 1, 2) - fetch(-1, 1, 2) - fetch(1, 1, 0) + fetch(-1, 1, 0)), -- quarter * (fetch(2, 1, 2) - fetch(0, 1, 2) - fetch(2, 1, 0) + fetch(0, 1, 0)), -- // values of d2f/dydz at the 8 corners (each from 4 stencil values). -- quarter * (fetch(0, 1, 1) - fetch(0, -1, 1) - fetch(0, 1, -1) + fetch(0, -1, -1)), -- quarter * (fetch(1, 1, 1) - fetch(1, -1, 1) - fetch(1, 1, -1) + fetch(1, -1, -1)), -- quarter * (fetch(0, 2, 1) - fetch(0, 0, 1) - fetch(0, 2, -1) + fetch(0, 0, -1)), -- quarter * (fetch(1, 2, 1) - fetch(1, 0, 1) - fetch(1, 2, -1) + fetch(1, 0, -1)), -- quarter * (fetch(0, 1, 2) - fetch(0, -1, 2) - fetch(0, 1, 0) + fetch(0, -1, 0)), -- quarter * (fetch(1, 1, 2) - fetch(1, -1, 2) - fetch(1, 1, 0) + fetch(1, -1, 0)), -- quarter * (fetch(0, 2, 2) - fetch(0, 0, 2) - fetch(0, 2, 0) + fetch(0, 0, 0)), -- quarter * (fetch(1, 2, 2) - fetch(1, 0, 2) - fetch(1, 2, 0) + fetch(1, 0, 0)), -- // values of d3f/dxdydz at the 8 corners (each from 8 stencil values). -- eighth * (fetch(1, 1, 1) - fetch(-1, 1, 1) - fetch(1, -1, 1) + fetch(-1, -1, 1) - fetch(1, 1, -1) + fetch(-1, 1, -1) + fetch(1, -1, -1) - fetch(-1, -1, -1)), -- eighth * (fetch(2, 1, 1) - fetch(0, 1, 1) - fetch(2, -1, 1) + fetch(0, -1, 1) - fetch(2, 1, -1) + fetch(0, 1, -1) + fetch(2, -1, -1) - fetch(0, -1, -1)), -- eighth * (fetch(1, 2, 1) - fetch(-1, 2, 1) - fetch(1, 0, 1) + fetch(-1, 0, 1) - fetch(1, 2, -1) + fetch(-1, 2, -1) + fetch(1, 0, -1) - fetch(-1, 0, -1)), -- eighth * (fetch(2, 2, 1) - fetch(0, 2, 1) - fetch(2, 0, 1) + fetch(0, 0, 1) - fetch(2, 2, -1) + fetch(0, 2, -1) + fetch(2, 0, -1) - fetch(0, 0, -1)), -- eighth * (fetch(1, 1, 2) - fetch(-1, 1, 2) - fetch(1, -1, 2) + fetch(-1, -1, 2) - fetch(1, 1, 0) + fetch(-1, 1, 0) + fetch(1, -1, 0) - fetch(-1, -1, 0)), -- eighth * (fetch(2, 1, 2) - fetch(0, 1, 2) - fetch(2, -1, 2) + fetch(0, -1, 2) - fetch(2, 1, 0) + fetch(0, 1, 0) + fetch(2, -1, 0) - fetch(0, -1, 0)), -- eighth * (fetch(1, 2, 2) - fetch(-1, 2, 2) - fetch(1, 0, 2) + fetch(-1, 0, 2) - fetch(1, 2, 0) + fetch(-1, 2, 0) + fetch(1, 0, 0) - fetch(-1, 0, 0)), -- eighth * (fetch(2, 2, 2) - fetch(0, 2, 2) - fetch(2, 0, 2) + fetch(0, 0, 2) - fetch(2, 2, 0) + fetch(0, 2, 0) + fetch(2, 0, 0) - fetch(0, 0, 0))}; -- -- // 4Kb of static table (int8_t has a range of -127 -> 127 which suffices) -- static const int8_t A[64][64] = { -- {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {-3, 3, 0, 0, 0, 0, 0, 0, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {2, -2, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {-3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {9, -9, -9, 9, 0, 0, 0, 0, 6, 3, -6, -3, 0, 0, 0, 0, 6, -6, 3, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {-6, 6, 6, -6, 0, 0, 0, 0, -3, -3, 3, 3, 0, 0, 0, 0, -4, 4, -2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {2, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 2, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {-6, 6, 6, -6, 0, 0, 0, 0, -4, -2, 4, 2, 0, 0, 0, 0, -3, 3, -3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -1, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {4, -4, -4, 4, 0, 0, 0, 0, 2, 2, -2, -2, 0, 0, 0, 0, 2, -2, 2, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 3, 0, 0, 0, 0, 0, 0, -2, -1, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, -1, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, -9, -9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, -6, -3, 0, 0, 0, 0, 6, -6, 3, -3, 0, 0, 0, 0, 4, 2, 2, 1, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6, 6, 6, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, -3, 3, 3, 0, 0, 0, 0, -4, 4, -2, 2, 0, 0, 0, 0, -2, -2, -1, -1, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6, 6, 6, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, -2, 4, 2, 0, 0, 0, 0, -3, 3, -3, 3, 0, 0, 0, 0, -2, -1, -2, -1, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, -4, -4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, -2, -2, 0, 0, 0, 0, 2, -2, 2, -2, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0}, -- {-3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {9, -9, 0, 0, -9, 9, 0, 0, 6, 3, 0, 0, -6, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, -6, 0, 0, 3, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {-6, 6, 0, 0, 6, -6, 0, 0, -3, -3, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, 4, 0, 0, -2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -2, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, -1, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, -9, 0, 0, -9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 0, 0, -6, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, -6, 0, 0, 3, -3, 0, 0, 4, 2, 0, 0, 2, 1, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6, 6, 0, 0, 6, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, -3, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, 4, 0, 0, -2, 2, 0, 0, -2, -2, 0, 0, -1, -1, 0, 0}, -- {9, 0, -9, 0, -9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 3, 0, -6, 0, -3, 0, 6, 0, -6, 0, 3, 0, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 9, 0, -9, 0, -9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 3, 0, -6, 0, -3, 0, 6, 0, -6, 0, 3, 0, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 0, 2, 0, 1, 0}, -- {-27, 27, 27, -27, 27, -27, -27, 27, -18, -9, 18, 9, 18, 9, -18, -9, -18, 18, -9, 9, 18, -18, 9, -9, -18, 18, 18, -18, -9, 9, 9, -9, -12, -6, -6, -3, 12, 6, 6, 3, -12, -6, 12, 6, -6, -3, 6, 3, -12, 12, -6, 6, -6, 6, -3, 3, -8, -4, -4, -2, -4, -2, -2, -1}, -- {18, -18, -18, 18, -18, 18, 18, -18, 9, 9, -9, -9, -9, -9, 9, 9, 12, -12, 6, -6, -12, 12, -6, 6, 12, -12, -12, 12, 6, -6, -6, 6, 6, 6, 3, 3, -6, -6, -3, -3, 6, 6, -6, -6, 3, 3, -3, -3, 8, -8, 4, -4, 4, -4, 2, -2, 4, 4, 2, 2, 2, 2, 1, 1}, -- {-6, 0, 6, 0, 6, 0, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, -3, 0, 3, 0, 3, 0, -4, 0, 4, 0, -2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, -2, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, -6, 0, 6, 0, 6, 0, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, -3, 0, 3, 0, 3, 0, -4, 0, 4, 0, -2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, -2, 0, -1, 0, -1, 0}, -- {18, -18, -18, 18, -18, 18, 18, -18, 12, 6, -12, -6, -12, -6, 12, 6, 9, -9, 9, -9, -9, 9, -9, 9, 12, -12, -12, 12, 6, -6, -6, 6, 6, 3, 6, 3, -6, -3, -6, -3, 8, 4, -8, -4, 4, 2, -4, -2, 6, -6, 6, -6, 3, -3, 3, -3, 4, 2, 4, 2, 2, 1, 2, 1}, -- {-12, 12, 12, -12, 12, -12, -12, 12, -6, -6, 6, 6, 6, 6, -6, -6, -6, 6, -6, 6, 6, -6, 6, -6, -8, 8, 8, -8, -4, 4, 4, -4, -3, -3, -3, -3, 3, 3, 3, 3, -4, -4, 4, 4, -2, -2, 2, 2, -4, 4, -4, 4, -2, 2, -2, 2, -2, -2, -2, -2, -1, -1, -1, -1}, -- {2, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {-6, 6, 0, 0, 6, -6, 0, 0, -4, -2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 3, 0, 0, -3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -1, 0, 0, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {4, -4, 0, 0, -4, 4, 0, 0, 2, 2, 0, 0, -2, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -2, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6, 6, 0, 0, 6, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, -2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 3, 0, 0, -3, 3, 0, 0, -2, -1, 0, 0, -2, -1, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, -4, 0, 0, -4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, -2, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -2, 0, 0, 2, -2, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0}, -- {-6, 0, 6, 0, 6, 0, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, 0, -2, 0, 4, 0, 2, 0, -3, 0, 3, 0, -3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, -1, 0, -2, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, -6, 0, 6, 0, 6, 0, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, 0, -2, 0, 4, 0, 2, 0, -3, 0, 3, 0, -3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, -1, 0, -2, 0, -1, 0}, -- {18, -18, -18, 18, -18, 18, 18, -18, 12, 6, -12, -6, -12, -6, 12, 6, 12, -12, 6, -6, -12, 12, -6, 6, 9, -9, -9, 9, 9, -9, -9, 9, 8, 4, 4, 2, -8, -4, -4, -2, 6, 3, -6, -3, 6, 3, -6, -3, 6, -6, 3, -3, 6, -6, 3, -3, 4, 2, 2, 1, 4, 2, 2, 1}, -- {-12, 12, 12, -12, 12, -12, -12, 12, -6, -6, 6, 6, 6, 6, -6, -6, -8, 8, -4, 4, 8, -8, 4, -4, -6, 6, 6, -6, -6, 6, 6, -6, -4, -4, -2, -2, 4, 4, 2, 2, -3, -3, 3, 3, -3, -3, 3, 3, -4, 4, -2, 2, -4, 4, -2, 2, -2, -2, -1, -1, -2, -2, -1, -1}, -- {4, 0, -4, 0, -4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, -2, 0, -2, 0, 2, 0, -2, 0, 2, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -- {0, 0, 0, 0, 0, 0, 0, 0, 4, 0, -4, 0, -4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, -2, 0, -2, 0, 2, 0, -2, 0, 2, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0}, -- {-12, 12, 12, -12, 12, -12, -12, 12, -8, -4, 8, 4, 8, 4, -8, -4, -6, 6, -6, 6, 6, -6, 6, -6, -6, 6, 6, -6, -6, 6, 6, -6, -4, -2, -4, -2, 4, 2, 4, 2, -4, -2, 4, 2, -4, -2, 4, 2, -3, 3, -3, 3, -3, 3, -3, 3, -2, -1, -2, -1, -2, -1, -2, -1}, -- {8, -8, -8, 8, -8, 8, 8, -8, 4, 4, -4, -4, -4, -4, 4, 4, 4, -4, 4, -4, -4, 4, -4, 4, 4, -4, -4, 4, 4, -4, -4, 4, 2, 2, 2, 2, -2, -2, -2, -2, 2, 2, -2, -2, 2, 2, -2, -2, 2, -2, 2, -2, 2, -2, 2, -2, 1, 1, 1, 1, 1, 1, 1, 1}}; -- -- for (int i = 0; i < 64; ++i) { // C = A * X -- C[i] = ValueT(0); --#if 0 -- for (int j = 0; j < 64; j += 4) { -- C[i] = fma(A[i][j], X[j], fma(A[i][j+1], X[j+1], fma(A[i][j+2], X[j+2], fma(A[i][j+3], X[j+3], C[i])))); -- } --#else -- for (int j = 0; j < 64; j += 4) { -- C[i] += A[i][j] * X[j] + A[i][j + 1] * X[j + 1] + A[i][j + 2] * X[j + 2] + A[i][j + 3] * X[j + 3]; -- } --#endif -- } --} -- --template --template class Vec3T> --__hostdev__ typename TreeOrAccT::ValueType TricubicSampler::sample(const Vec3T &xyz, const ValueT (&C)[64]) --{ -- ValueT zPow(1), sum(0); -- for (int k = 0, n = 0; k < 4; ++k) { -- ValueT yPow(1); -- for (int j = 0; j < 4; ++j, n += 4) { --#if 0 -- sum = fma( yPow, zPow * fma(xyz[0], fma(xyz[0], fma(xyz[0], C[n + 3], C[n + 2]), C[n + 1]), C[n]), sum); --#else -- sum += yPow * zPow * (C[n] + xyz[0] * (C[n + 1] + xyz[0] * (C[n + 2] + xyz[0] * C[n + 3]))); --#endif -- yPow *= xyz[1]; -- } -- zPow *= xyz[2]; -- } -- return sum; --} -- --template --class SampleFromVoxels : public TricubicSampler --{ -- using BaseT = TricubicSampler; -- using ValueT = typename TreeOrAccT::ValueType; -- using CoordT = typename TreeOrAccT::CoordType; -- -- mutable CoordT mPos; -- mutable ValueT mC[64]; -- -- template class Vec3T> -- __hostdev__ void cache(Vec3T& xyz) const; -- --public: -- /// @brief Construction from a Tree or ReadAccessor -- __hostdev__ SampleFromVoxels(const TreeOrAccT& acc) -- : BaseT(acc) -- { -- } -- -- /// @note xyz is in index space space -- template class Vec3T> -- inline __hostdev__ ValueT operator()(Vec3T xyz) const; -- -- // @brief Return value at the coordinate @a ijk in index space space -- __hostdev__ ValueT operator()(const CoordT &ijk) const {return BaseT::mAcc.getValue(ijk);} -- --}; // SampleFromVoxels -- --template --template class Vec3T> --__hostdev__ typename TreeOrAccT::ValueType SampleFromVoxels::operator()(Vec3T xyz) const --{ -- this->cache(xyz); -- return BaseT::sample(xyz, mC); --} -- --template --template class Vec3T> --__hostdev__ void SampleFromVoxels::cache(Vec3T& xyz) const --{ -- CoordT ijk = Floor(xyz); -- if (ijk != mPos) { -- mPos = ijk; -- BaseT::stencil(ijk, mC); -- } --} -- --template --class SampleFromVoxels : public TricubicSampler --{ -- using BaseT = TricubicSampler; -- using ValueT = typename TreeOrAccT::ValueType; -- using CoordT = typename TreeOrAccT::CoordType; -- --public: -- /// @brief Construction from a Tree or ReadAccessor -- __hostdev__ SampleFromVoxels(const TreeOrAccT& acc) -- : BaseT(acc) -- { -- } -- -- /// @note xyz is in index space space -- template class Vec3T> -- inline __hostdev__ ValueT operator()(Vec3T xyz) const; -- -- __hostdev__ ValueT operator()(const CoordT &ijk) const {return BaseT::mAcc.getValue(ijk);} -- --}; // SampleFromVoxels -- --template --template class Vec3T> --__hostdev__ typename TreeOrAccT::ValueType SampleFromVoxels::operator()(Vec3T xyz) const --{ -- ValueT C[64]; -- CoordT ijk = Floor(xyz); -- BaseT::stencil(ijk, C); -- return BaseT::sample(xyz, C); --} -- --} // namespace nanovdb -- --#endif // NANOVDB_SAMPLE_FROM_VOXELS_H_HAS_BEEN_INCLUDED -+// SampleFromVoxels.h -+// Copyright Contributors to the OpenVDB Project -+// SPDX-License-Identifier: MPL-2.0 -+ -+////////////////////////////////////////////////////////////////////////// -+/// -+/// @file SampleFromVoxels.h -+/// -+/// @brief NearestNeighborSampler, TrilinearSampler, TriquadraticSampler and TricubicSampler -+/// -+/// @note These interpolators employ internal caching for better performance when used repeatedly -+/// in the same voxel location, so try to reuse an instance of these classes more than once. -+/// -+/// @warning While all the interpolators defined below work with both scalars and vectors -+/// values (e.g. float and Vec3) TrilinarSampler::zeroCrossing and -+/// Trilinear::gradient will only compile with floating point value types. -+/// -+/// @author Ken Museth -+/// -+/////////////////////////////////////////////////////////////////////////// -+ -+#ifndef NANOVDB_SAMPLE_FROM_VOXELS_H_HAS_BEEN_INCLUDED -+#define NANOVDB_SAMPLE_FROM_VOXELS_H_HAS_BEEN_INCLUDED -+ -+// Only define __hostdev__ when compiling as NVIDIA CUDA -+#ifdef __CUDACC__ -+#define __hostdev__ __host__ __device__ -+#elif defined(__KERNEL_METAL__) -+#else -+#include // for floor -+#define __hostdev__ -+#endif -+ -+namespace nanovdb { -+ -+// Forward declaration of sampler with specific polynomial orders -+template -+class SampleFromVoxels; -+ -+/// @brief Factory free-function for a sampler of specific polynomial orders -+/// -+/// @details This allows for the compact syntax: -+/// @code -+/// auto acc = grid.getAccessor(); -+/// auto smp = nanovdb::createSampler<1>( acc ); -+/// @endcode -+template -+__hostdev__ SampleFromVoxels createSampler(__global__ const TreeOrAccT& acc) -+{ -+ return SampleFromVoxels(acc); -+} -+ -+/// @brief Utility function that returns the Coord of the round-down of @a xyz -+/// and redefined @xyz as the fractional part, ie xyz-in = return-value + xyz-out -+template class Vec3T> -+__hostdev__ inline CoordT Floor(__global__ Vec3T& xyz); -+ -+/// @brief Template specialization of Floor for Vec3 -+template class Vec3T> -+__hostdev__ inline CoordT Floor(__global__ Vec3T& xyz) -+{ -+ const float ijk[3] = {floorf(xyz[0]), floorf(xyz[1]), floorf(xyz[2])}; -+ xyz[0] -= ijk[0]; -+ xyz[1] -= ijk[1]; -+ xyz[2] -= ijk[2]; -+ return CoordT(int32_t(ijk[0]), int32_t(ijk[1]), int32_t(ijk[2])); -+} -+ -+/// @brief Template specialization of Floor for Vec3 -+template class Vec3T> -+__hostdev__ inline CoordT Floor(__global__ Vec3T& xyz) -+{ -+ const double ijk[3] = {floor(xyz[0]), floor(xyz[1]), floor(xyz[2])}; -+ xyz[0] -= ijk[0]; -+ xyz[1] -= ijk[1]; -+ xyz[2] -= ijk[2]; -+ return CoordT(int32_t(ijk[0]), int32_t(ijk[1]), int32_t(ijk[2])); -+} -+ -+#if defined(__KERNEL_METAL__) -+/// @brief Template specialization of Floor for Vec3 -+template class Vec3T> -+__hostdev__ inline CoordT Floor(__local__ Vec3T& xyz) -+{ -+ const float ijk[3] = {floorf(xyz[0]), floorf(xyz[1]), floorf(xyz[2])}; -+ xyz[0] -= ijk[0]; -+ xyz[1] -= ijk[1]; -+ xyz[2] -= ijk[2]; -+ return CoordT(int32_t(ijk[0]), int32_t(ijk[1]), int32_t(ijk[2])); -+} -+ -+/// @brief Template specialization of Floor for Vec3 -+template class Vec3T> -+__hostdev__ inline CoordT Floor(__local__ Vec3T& xyz) -+{ -+ const double ijk[3] = {floor(xyz[0]), floor(xyz[1]), floor(xyz[2])}; -+ xyz[0] -= ijk[0]; -+ xyz[1] -= ijk[1]; -+ xyz[2] -= ijk[2]; -+ return CoordT(int32_t(ijk[0]), int32_t(ijk[1]), int32_t(ijk[2])); -+} -+#endif -+ -+// ------------------------------> NearestNeighborSampler <-------------------------------------- -+ -+/// @brief Nearest neighbor, i.e. zero order, interpolator with caching -+template -+class SampleFromVoxels -+{ -+public: -+ using ValueT = typename TreeOrAccT::ValueType; -+ using CoordT = typename TreeOrAccT::CoordType; -+ -+ static __constant__ const int ORDER = 0; -+ /// @brief Construction from a Tree or ReadAccessor -+ __hostdev__ SampleFromVoxels(__local__ const TreeOrAccT& acc) -+ : mAcc(acc) -+ , mPos(CoordT::max()) -+ { -+ } -+ -+ __hostdev__ __global__ const TreeOrAccT& accessor() const { return mAcc; } -+ -+ /// @note xyz is in index space space -+ template -+ inline __hostdev__ ValueT operator()(__global__ const Vec3T& xyz) const __local__; -+#if defined(__KERNEL_METAL__) -+ template -+ inline __hostdev__ ValueT operator()(__local__ const Vec3T& xyz) const __local__; -+#endif -+ -+ inline __hostdev__ ValueT operator()(__global__ const CoordT& ijk) const __local__; -+ -+ inline __hostdev__ ValueT operator()() const; -+ -+private: -+ __global__ const TreeOrAccT& mAcc; -+ mutable CoordT mPos; -+ mutable ValueT mVal; // private cache -+}; // SampleFromVoxels -+ -+/// @brief Nearest neighbor, i.e. zero order, interpolator without caching -+template -+class SampleFromVoxels -+{ -+public: -+ using ValueT = typename TreeOrAccT::ValueType; -+ using CoordT = typename TreeOrAccT::CoordType; -+ static __constant__ const int ORDER = 0; -+ -+ /// @brief Construction from a Tree or ReadAccessor -+ __hostdev__ SampleFromVoxels(__local__ const TreeOrAccT& acc) -+ : mAcc(acc) -+ { -+ } -+ -+ __hostdev__ __global__ const TreeOrAccT& accessor() const __local__ { return mAcc; } -+ -+ /// @note xyz is in index space space -+ template -+ inline __hostdev__ ValueT operator()(__global__ const Vec3T& xyz) const __local__; -+#if defined(__KERNEL_METAL__) -+ template -+ inline __hostdev__ ValueT operator()(__local__ const Vec3T& xyz) const __local__; -+#endif -+ -+ inline __hostdev__ ValueT operator()(__global__ const CoordT& ijk) const __local__ { return mAcc.getValue(ijk);} -+ -+private: -+ __local__ const TreeOrAccT& mAcc; -+}; // SampleFromVoxels -+ -+template -+template -+typename TreeOrAccT::ValueType SampleFromVoxels::operator()(__global__ const Vec3T& xyz) const __local__ -+{ -+ const CoordT ijk = Round(xyz); -+ if (ijk != mPos) { -+ mPos = ijk; -+ mVal = mAcc.getValue(mPos); -+ } -+ return mVal; -+} -+#if defined(__KERNEL_METAL__) -+template -+template -+typename TreeOrAccT::ValueType SampleFromVoxels::operator()(__local__ const Vec3T& xyz) const __local__ -+{ -+ const CoordT ijk = Round(xyz); -+ if (ijk != mPos) { -+ mPos = ijk; -+ mVal = mAcc.getValue(mPos); -+ } -+ return mVal; -+} -+#endif -+ -+template -+typename TreeOrAccT::ValueType SampleFromVoxels::operator()(__global__ const CoordT& ijk) const __local__ -+{ -+ if (ijk != mPos) { -+ mPos = ijk; -+ mVal = mAcc.getValue(mPos); -+ } -+ return mVal; -+} -+ -+template -+template -+typename TreeOrAccT::ValueType SampleFromVoxels::operator()(__global__ const Vec3T& xyz) const __local__ -+{ -+ return mAcc.getValue(Round(xyz)); -+} -+ -+#if defined(__KERNEL_METAL__) -+template -+template -+typename TreeOrAccT::ValueType SampleFromVoxels::operator()(__local__ const Vec3T& xyz) const __local__ -+{ -+ return mAcc.getValue(Round(xyz)); -+} -+#endif -+ -+// ------------------------------> TrilinearSampler <-------------------------------------- -+ -+/// @brief Tri-linear sampler, i.e. first order, interpolator -+template -+class TrilinearSampler -+{ -+#if defined(__KERNEL_METAL__) -+public: -+#else -+protected: -+#endif -+ __local__ const TreeOrAccT& mAcc; -+ -+public: -+ using ValueT = typename TreeOrAccT::ValueType; -+ using CoordT = typename TreeOrAccT::CoordType; -+ static __constant__ const int ORDER = 1; -+ -+ /// @brief Protected constructor from a Tree or ReadAccessor -+ __hostdev__ TrilinearSampler(__local__ const TreeOrAccT& acc) : mAcc(acc) {} -+ -+ __hostdev__ __global__ const TreeOrAccT& accessor() const { return mAcc; } -+ -+ /// @brief Extract the stencil of 8 values -+ inline __hostdev__ void stencil(__global__ CoordT& ijk, __global__ ValueT (&v)[2][2][2]) const; -+ -+ template class Vec3T> -+ static inline __hostdev__ ValueT sample(__global__ const Vec3T &uvw, __global__ const ValueT (&v)[2][2][2]); -+ -+ template class Vec3T> -+ static inline __hostdev__ Vec3T gradient(__global__ const Vec3T &uvw, __global__ const ValueT (&v)[2][2][2]); -+ -+ static inline __hostdev__ bool zeroCrossing(__global__ const ValueT (&v)[2][2][2]); -+}; // TrilinearSamplerBase -+ -+template -+void TrilinearSampler::stencil(__global__ CoordT& ijk, __global__ ValueT (&v)[2][2][2]) const -+{ -+ v[0][0][0] = mAcc.getValue(ijk); // i, j, k -+ -+ ijk[2] += 1; -+ v[0][0][1] = mAcc.getValue(ijk); // i, j, k + 1 -+ -+ ijk[1] += 1; -+ v[0][1][1] = mAcc.getValue(ijk); // i, j+1, k + 1 -+ -+ ijk[2] -= 1; -+ v[0][1][0] = mAcc.getValue(ijk); // i, j+1, k -+ -+ ijk[0] += 1; -+ ijk[1] -= 1; -+ v[1][0][0] = mAcc.getValue(ijk); // i+1, j, k -+ -+ ijk[2] += 1; -+ v[1][0][1] = mAcc.getValue(ijk); // i+1, j, k + 1 -+ -+ ijk[1] += 1; -+ v[1][1][1] = mAcc.getValue(ijk); // i+1, j+1, k + 1 -+ -+ ijk[2] -= 1; -+ v[1][1][0] = mAcc.getValue(ijk); // i+1, j+1, k -+} -+ -+template -+template class Vec3T> -+typename TreeOrAccT::ValueType TrilinearSampler::sample(__global__ const Vec3T &uvw, __global__ const ValueT (&v)[2][2][2]) -+{ -+#if 0 -+ auto lerp = [](ValueT a, ValueT b, ValueT w){ return fma(w, b-a, a); };// = w*(b-a) + a -+ //auto lerp = [](ValueT a, ValueT b, ValueT w){ return fma(w, b, fma(-w, a, a));};// = (1-w)*a + w*b -+#else -+ struct Lerp { -+ static ValueT lerp(ValueT a, ValueT b, RealT w) { return a + ValueT(w) * (b - a); } -+ }; -+#endif -+ return Lerp::lerp(Lerp::lerp(Lerp::lerp(v[0][0][0], v[0][0][1], uvw[2]), Lerp::lerp(v[0][1][0], v[0][1][1], uvw[2]), uvw[1]), -+ Lerp::lerp(Lerp::lerp(v[1][0][0], v[1][0][1], uvw[2]), Lerp::lerp(v[1][1][0], v[1][1][1], uvw[2]), uvw[1]), -+ uvw[0]); -+} -+ -+template -+template class Vec3T> -+Vec3T TrilinearSampler::gradient(__global__ const Vec3T &uvw, __global__ const ValueT (&v)[2][2][2]) -+{ -+ static_assert(is_floating_point::value, "TrilinearSampler::gradient requires a floating-point type"); -+#if 0 -+ auto lerp = [](ValueT a, ValueT b, ValueT w){ return fma(w, b-a, a); };// = w*(b-a) + a -+ //auto lerp = [](ValueT a, ValueT b, ValueT w){ return fma(w, b, fma(-w, a, a));};// = (1-w)*a + w*b -+#else -+ struct Lerp { -+ static ValueT lerp(ValueT a, ValueT b, RealT w) { return a + ValueT(w) * (b - a); } -+ }; -+#endif -+ -+ ValueT D[4] = {v[0][0][1] - v[0][0][0], v[0][1][1] - v[0][1][0], v[1][0][1] - v[1][0][0], v[1][1][1] - v[1][1][0]}; -+ -+ // Z component -+ Vec3T grad(0, 0, Lerp::lerp(Lerp::lerp(D[0], D[1], uvw[1]), lerp(D[2], D[3], uvw[1]), uvw[0])); -+ -+ const ValueT w = ValueT(uvw[2]); -+ D[0] = v[0][0][0] + D[0] * w; -+ D[1] = v[0][1][0] + D[1] * w; -+ D[2] = v[1][0][0] + D[2] * w; -+ D[3] = v[1][1][0] + D[3] * w; -+ -+ // X component -+ grad[0] = Lerp::lerp(D[2], D[3], uvw[1]) - Lerp::lerp(D[0], D[1], uvw[1]); -+ -+ // Y component -+ grad[1] = Lerp::lerp(D[1] - D[0], D[3] - D[2], uvw[0]); -+ -+ return grad; -+} -+ -+template -+bool TrilinearSampler::zeroCrossing(__global__ const ValueT (&v)[2][2][2]) -+{ -+ static_assert(is_floating_point::value, "TrilinearSampler::zeroCrossing requires a floating-point type"); -+ const bool less = v[0][0][0] < ValueT(0); -+ return (less ^ (v[0][0][1] < ValueT(0))) || -+ (less ^ (v[0][1][1] < ValueT(0))) || -+ (less ^ (v[0][1][0] < ValueT(0))) || -+ (less ^ (v[1][0][0] < ValueT(0))) || -+ (less ^ (v[1][0][1] < ValueT(0))) || -+ (less ^ (v[1][1][1] < ValueT(0))) || -+ (less ^ (v[1][1][0] < ValueT(0))); -+} -+ -+/// @brief Template specialization that does not use caching of stencil points -+template -+class SampleFromVoxels -+#if !defined(__KERNEL_METAL__) -+ : public TrilinearSampler -+#endif -+{ -+#if defined(__KERNEL_METAL__) -+ -+ TrilinearSampler _base; -+#define BASE(v) _base.v -+#else -+#define BASE(v) BaseT::v -+ -+#endif -+ using BaseT = TrilinearSampler; -+ using ValueT = typename TreeOrAccT::ValueType; -+ using CoordT = typename TreeOrAccT::CoordType; -+ -+public: -+ -+ /// @brief Construction from a Tree or ReadAccessor -+#if defined(__KERNEL_METAL__) -+ __hostdev__ SampleFromVoxels(__local__ const TreeOrAccT& acc) : _base(acc) {} -+#else -+ __hostdev__ SampleFromVoxels(__local__ const TreeOrAccT& acc) : BaseT(acc) {} -+#endif -+ -+ /// @note xyz is in index space space -+ template class Vec3T> -+ inline __hostdev__ ValueT operator()(Vec3T xyz) const; -+ -+ /// @note ijk is in index space space -+ __hostdev__ ValueT operator()(__global__ const CoordT &ijk) const {return BaseT::mAcc.getValue(ijk);} -+ -+ /// @brief Return the gradient in index space. -+ /// -+ /// @warning Will only compile with floating point value types -+ template class Vec3T> -+ inline __hostdev__ Vec3T gradient(Vec3T xyz) const; -+ -+ /// @brief Return true if the tr-linear stencil has a zero crossing at the specified index position. -+ /// -+ /// @warning Will only compile with floating point value types -+ template class Vec3T> -+ inline __hostdev__ bool zeroCrossing(Vec3T xyz) const; -+ -+}; // SampleFromVoxels -+ -+/// @brief Template specialization with caching of stencil values -+template -+class SampleFromVoxels -+#if !defined(__KERNEL_METAL__) -+ : public TrilinearSampler -+#endif -+{ -+#if defined(__KERNEL_METAL__) -+ TrilinearSampler _base; -+#endif -+ using BaseT = TrilinearSampler; -+ using ValueT = typename TreeOrAccT::ValueType; -+ using CoordT = typename TreeOrAccT::CoordType; -+ -+ mutable CoordT mPos; -+ mutable ValueT mVal[2][2][2]; -+ -+ template class Vec3T> -+ __hostdev__ void cache(__global__ Vec3T& xyz) const; -+public: -+ -+ /// @brief Construction from a Tree or ReadAccessor -+ __hostdev__ SampleFromVoxels(__local__ const TreeOrAccT& acc) : BaseT(acc), mPos(CoordT::max()){} -+ -+ /// @note xyz is in index space space -+ template class Vec3T> -+ inline __hostdev__ ValueT operator()(Vec3T xyz) const; -+ -+ // @note ijk is in index space space -+ __hostdev__ ValueT operator()(__global__ const CoordT &ijk) const; -+ -+ /// @brief Return the gradient in index space. -+ /// -+ /// @warning Will only compile with floating point value types -+ template class Vec3T> -+ inline __hostdev__ Vec3T gradient(Vec3T xyz) const; -+ -+ /// @brief Return true if the tr-linear stencil has a zero crossing at the specified index position. -+ /// -+ /// @warning Will only compile with floating point value types -+ template class Vec3T> -+ inline __hostdev__ bool zeroCrossing(Vec3T xyz) const; -+ -+ /// @brief Return true if the cached tri-linear stencil has a zero crossing. -+ /// -+ /// @warning Will only compile with floating point value types -+ __hostdev__ bool zeroCrossing() const { return BaseT::zeroCrossing(mVal); } -+ -+}; // SampleFromVoxels -+ -+template -+template class Vec3T> -+typename TreeOrAccT::ValueType SampleFromVoxels::operator()(Vec3T xyz) const -+{ -+ this->cache(xyz); -+ return BaseT::sample(xyz, mVal); -+} -+ -+template -+typename TreeOrAccT::ValueType SampleFromVoxels::operator()(__global__ const CoordT &ijk) const -+{ -+ return ijk == mPos ? mVal[0][0][0] : BaseT::mAcc.getValue(ijk); -+} -+ -+template -+template class Vec3T> -+Vec3T SampleFromVoxels::gradient(Vec3T xyz) const -+{ -+ this->cache(xyz); -+ return BaseT::gradient(xyz, mVal); -+} -+ -+template -+template class Vec3T> -+__hostdev__ bool SampleFromVoxels::zeroCrossing(Vec3T xyz) const -+{ -+ this->cache(xyz); -+ return BaseT::zeroCrossing(mVal); -+} -+ -+template -+template class Vec3T> -+void SampleFromVoxels::cache(__global__ Vec3T& xyz) const -+{ -+ CoordT ijk = Floor(xyz); -+ if (ijk != mPos) { -+ mPos = ijk; -+ BaseT::stencil(ijk, mVal); -+ } -+} -+ -+#if 0 -+ -+template -+template class Vec3T> -+typename TreeOrAccT::ValueType SampleFromVoxels::operator()(Vec3T xyz) const -+{ -+ ValueT val[2][2][2]; -+ CoordT ijk = Floor(xyz); -+ BaseT::stencil(ijk, val); -+ return BaseT::sample(xyz, val); -+} -+ -+#else -+ -+template -+template class Vec3T> -+typename TreeOrAccT::ValueType SampleFromVoxels::operator()(Vec3T xyz) const -+{ -+ struct Lerp { -+ static ValueT lerp(ValueT a, ValueT b, RealT w) { return a + ValueT(w) * (b - a); } -+ }; -+ -+ CoordT coord = Floor(xyz); -+ -+ ValueT vx, vx1, vy, vy1, vz, vz1; -+ -+ vz = BASE(mAcc).getValue(coord); -+ coord[2] += 1; -+ vz1 = BASE(mAcc).getValue(coord); -+ vy = Lerp::lerp(vz, vz1, xyz[2]); -+ -+ coord[1] += 1; -+ -+ vz1 = BASE(mAcc).getValue(coord); -+ coord[2] -= 1; -+ vz = BASE(mAcc).getValue(coord); -+ vy1 = Lerp::lerp(vz, vz1, xyz[2]); -+ -+ vx = Lerp::lerp(vy, vy1, xyz[1]); -+ -+ coord[0] += 1; -+ -+ vz = BASE(mAcc).getValue(coord); -+ coord[2] += 1; -+ vz1 = BASE(mAcc).getValue(coord); -+ vy1 = Lerp::lerp(vz, vz1, xyz[2]); -+ -+ coord[1] -= 1; -+ -+ vz1 = BASE(mAcc).getValue(coord); -+ coord[2] -= 1; -+ vz = BASE(mAcc).getValue(coord); -+ vy = Lerp::lerp(vz, vz1, xyz[2]); -+ -+ vx1 = Lerp::lerp(vy, vy1, xyz[1]); -+ -+ return Lerp::lerp(vx, vx1, xyz[0]); -+} -+#endif -+ -+ -+template -+template class Vec3T> -+inline Vec3T SampleFromVoxels::gradient(Vec3T xyz) const -+{ -+ ValueT val[2][2][2]; -+ CoordT ijk = Floor(xyz); -+ BaseT::stencil(ijk, val); -+ return BaseT::gradient(xyz, val); -+} -+ -+template -+template class Vec3T> -+bool SampleFromVoxels::zeroCrossing(Vec3T xyz) const -+{ -+ ValueT val[2][2][2]; -+ CoordT ijk = Floor(xyz); -+ BaseT::stencil(ijk, val); -+ return BaseT::zeroCrossing(val); -+} -+ -+// ------------------------------> TriquadraticSampler <-------------------------------------- -+ -+/// @brief Tri-quadratic sampler, i.e. second order, interpolator -+template -+class TriquadraticSampler -+{ -+protected: -+ __local__ const TreeOrAccT& mAcc; -+ -+public: -+ using ValueT = typename TreeOrAccT::ValueType; -+ using CoordT = typename TreeOrAccT::CoordType; -+ static __constant__ const int ORDER = 1; -+ -+ /// @brief Protected constructor from a Tree or ReadAccessor -+ __hostdev__ TriquadraticSampler(__local__ const TreeOrAccT& acc) : mAcc(acc) {} -+ -+ __hostdev__ __global__ const TreeOrAccT& accessor() const { return mAcc; } -+ -+ /// @brief Extract the stencil of 27 values -+ inline __hostdev__ void stencil(__local__ const CoordT &ijk, __local__ ValueT (&v)[3][3][3]) const; -+ -+ template class Vec3T> -+ static inline __hostdev__ ValueT sample(__local__ const Vec3T &uvw, __local__ const ValueT (&v)[3][3][3]); -+ -+ static inline __hostdev__ bool zeroCrossing(__global__ const ValueT (&v)[3][3][3]); -+}; // TriquadraticSamplerBase -+ -+template -+void TriquadraticSampler::stencil(__local__ const CoordT &ijk, __local__ ValueT (&v)[3][3][3]) const -+{ -+ CoordT p(ijk[0] - 1, 0, 0); -+ for (int dx = 0; dx < 3; ++dx, ++p[0]) { -+ p[1] = ijk[1] - 1; -+ for (int dy = 0; dy < 3; ++dy, ++p[1]) { -+ p[2] = ijk[2] - 1; -+ for (int dz = 0; dz < 3; ++dz, ++p[2]) { -+ v[dx][dy][dz] = mAcc.getValue(p);// extract the stencil of 27 values -+ } -+ } -+ } -+} -+ -+template -+template class Vec3T> -+typename TreeOrAccT::ValueType TriquadraticSampler::sample(__local__ const Vec3T &uvw, __local__ const ValueT (&v)[3][3][3]) -+{ -+ struct Kernel { -+ static ValueT _kernel(__local__ const ValueT* value, double weight) { -+ return weight * (weight * (0.5f * (value[0] + value[2]) - value[1]) + 0.5f * (value[2] - value[0])) + value[1]; -+ } -+ }; -+ -+ ValueT vx[3]; -+ for (int dx = 0; dx < 3; ++dx) { -+ ValueT vy[3]; -+ for (int dy = 0; dy < 3; ++dy) { -+ vy[dy] = Kernel::_kernel(&v[dx][dy][0], uvw[2]); -+ }//loop over y -+ vx[dx] = Kernel::_kernel(vy, uvw[1]); -+ }//loop over x -+ return Kernel::_kernel(vx, uvw[0]); -+} -+ -+template -+bool TriquadraticSampler::zeroCrossing(__global__ const ValueT (&v)[3][3][3]) -+{ -+ static_assert(is_floating_point::value, "TrilinearSampler::zeroCrossing requires a floating-point type"); -+ const bool less = v[0][0][0] < ValueT(0); -+ for (int dx = 0; dx < 3; ++dx) { -+ for (int dy = 0; dy < 3; ++dy) { -+ for (int dz = 0; dz < 3; ++dz) { -+ if (less ^ (v[dx][dy][dz] < ValueT(0))) return true; -+ } -+ } -+ } -+ return false; -+} -+ -+/// @brief Template specialization that does not use caching of stencil points -+template -+class SampleFromVoxels -+#if !defined(__KERNEL_METAL__) -+ : public TriquadraticSampler -+#endif -+{ -+#if defined(__KERNEL_METAL__) -+ TriquadraticSampler _base; -+#define BASE(v) _base.v -+#else -+#define BASE(v) BaseT::v -+#endif -+ using BaseT = TriquadraticSampler; -+ using ValueT = typename TreeOrAccT::ValueType; -+ using CoordT = typename TreeOrAccT::CoordType; -+public: -+ -+ /// @brief Construction from a Tree or ReadAccessor -+#if defined(__KERNEL_METAL__) -+ __hostdev__ SampleFromVoxels(__local__ const TreeOrAccT& acc) : _base(acc) {} -+#else -+ __hostdev__ SampleFromVoxels(__local__ const TreeOrAccT& acc) : BaseT(acc) {} -+#endif -+ -+ /// @note xyz is in index space space -+ template class Vec3T> -+ inline __hostdev__ ValueT operator()(Vec3T xyz) const; -+ -+ __hostdev__ ValueT operator()(__global__ const CoordT &ijk) const {return BaseT::mAcc.getValue(ijk);} -+ -+ /// @brief Return true if the tr-linear stencil has a zero crossing at the specified index position. -+ /// -+ /// @warning Will only compile with floating point value types -+ template class Vec3T> -+ inline __hostdev__ bool zeroCrossing(Vec3T xyz) const; -+ -+}; // SampleFromVoxels -+ -+/// @brief Template specialization with caching of stencil values -+template -+class SampleFromVoxels -+#if !defined(__KERNEL_METAL__) -+ : public TriquadraticSampler -+#endif -+{ -+#if defined(__KERNEL_METAL__) -+ TriquadraticSampler _base; -+#define BASE(v) _base.v -+#else -+#define BASE(v) BaseT::v -+#endif -+ using BaseT = TriquadraticSampler; -+ using ValueT = typename TreeOrAccT::ValueType; -+ using CoordT = typename TreeOrAccT::CoordType; -+ -+ mutable CoordT mPos; -+ mutable ValueT mVal[3][3][3]; -+ -+ template class Vec3T> -+ __hostdev__ void cache(__global__ Vec3T& xyz) const; -+public: -+ -+ /// @brief Construction from a Tree or ReadAccessor -+ __hostdev__ SampleFromVoxels(__local__ const TreeOrAccT& acc) : BaseT(acc), mPos(CoordT::max()){} -+ -+ /// @note xyz is in index space space -+ template class Vec3T> -+ inline __hostdev__ ValueT operator()(Vec3T xyz) const; -+ -+ inline __hostdev__ ValueT operator()(__global__ const CoordT &ijk) const; -+ -+ /// @brief Return true if the tr-linear stencil has a zero crossing at the specified index position. -+ /// -+ /// @warning Will only compile with floating point value types -+ template class Vec3T> -+ inline __hostdev__ bool zeroCrossing(Vec3T xyz) const; -+ -+ /// @brief Return true if the cached tri-linear stencil has a zero crossing. -+ /// -+ /// @warning Will only compile with floating point value types -+ __hostdev__ bool zeroCrossing() const { return BaseT::zeroCrossing(mVal); } -+ -+}; // SampleFromVoxels -+ -+template -+template class Vec3T> -+typename TreeOrAccT::ValueType SampleFromVoxels::operator()(Vec3T xyz) const -+{ -+ this->cache(xyz); -+ return BaseT::sample(xyz, mVal); -+} -+ -+template -+typename TreeOrAccT::ValueType SampleFromVoxels::operator()(__global__ const CoordT &ijk) const -+{ -+ return ijk == mPos ? mVal[1][1][1] : BaseT::mAcc.getValue(ijk); -+} -+ -+template -+template class Vec3T> -+__hostdev__ bool SampleFromVoxels::zeroCrossing(Vec3T xyz) const -+{ -+ this->cache(xyz); -+ return BaseT::zeroCrossing(mVal); -+} -+ -+template -+template class Vec3T> -+void SampleFromVoxels::cache(__global__ Vec3T& xyz) const -+{ -+ CoordT ijk = Floor(xyz); -+ if (ijk != mPos) { -+ mPos = ijk; -+ BaseT::stencil(ijk, mVal); -+ } -+} -+ -+template -+template class Vec3T> -+typename TreeOrAccT::ValueType SampleFromVoxels::operator()(Vec3T xyz) const -+{ -+ ValueT val[3][3][3]; -+ CoordT ijk = Floor(xyz); -+ BASE(stencil)(ijk, val); -+ return BaseT::sample(xyz, val); -+} -+ -+template -+template class Vec3T> -+bool SampleFromVoxels::zeroCrossing(Vec3T xyz) const -+{ -+ ValueT val[3][3][3]; -+ CoordT ijk = Floor(xyz); -+ BaseT::stencil(ijk, val); -+ return BaseT::zeroCrossing(val); -+} -+ -+// ------------------------------> TricubicSampler <-------------------------------------- -+ -+/// @brief Tri-cubic sampler, i.e. third order, interpolator. -+/// -+/// @details See the following paper for implementation details: -+/// Lekien, F. and Marsden, J.: Tricubic interpolation in three dimensions. -+/// In: International Journal for Numerical Methods -+/// in Engineering (2005), No. 63, p. 455-471 -+ -+template -+class TricubicSampler -+{ -+protected: -+ using ValueT = typename TreeOrAccT::ValueType; -+ using CoordT = typename TreeOrAccT::CoordType; -+ -+ __global__ const TreeOrAccT& mAcc; -+ -+public: -+ /// @brief Construction from a Tree or ReadAccessor -+ __hostdev__ TricubicSampler(__global__ const TreeOrAccT& acc) -+ : mAcc(acc) -+ { -+ } -+ -+ __hostdev__ __global__ const TreeOrAccT& accessor() const { return mAcc; } -+ -+ /// @brief Extract the stencil of 8 values -+ inline __hostdev__ void stencil(__global__ const CoordT& ijk, __global__ ValueT (&c)[64]) const; -+ -+ template class Vec3T> -+ static inline __hostdev__ ValueT sample(__global__ const Vec3T &uvw, __global__ const ValueT (&c)[64]); -+}; // TricubicSampler -+ -+// 4Kb of static table (int8_t has a range of -127 -> 127 which suffices) -+static __constant__ const int8_t TricubicSampler_A[64][64] = { -+ {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {-3, 3, 0, 0, 0, 0, 0, 0, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {2, -2, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {-3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {9, -9, -9, 9, 0, 0, 0, 0, 6, 3, -6, -3, 0, 0, 0, 0, 6, -6, 3, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {-6, 6, 6, -6, 0, 0, 0, 0, -3, -3, 3, 3, 0, 0, 0, 0, -4, 4, -2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {2, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 2, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {-6, 6, 6, -6, 0, 0, 0, 0, -4, -2, 4, 2, 0, 0, 0, 0, -3, 3, -3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -1, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {4, -4, -4, 4, 0, 0, 0, 0, 2, 2, -2, -2, 0, 0, 0, 0, 2, -2, 2, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 3, 0, 0, 0, 0, 0, 0, -2, -1, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, -1, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, -9, -9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, -6, -3, 0, 0, 0, 0, 6, -6, 3, -3, 0, 0, 0, 0, 4, 2, 2, 1, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6, 6, 6, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, -3, 3, 3, 0, 0, 0, 0, -4, 4, -2, 2, 0, 0, 0, 0, -2, -2, -1, -1, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6, 6, 6, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, -2, 4, 2, 0, 0, 0, 0, -3, 3, -3, 3, 0, 0, 0, 0, -2, -1, -2, -1, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, -4, -4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, -2, -2, 0, 0, 0, 0, 2, -2, 2, -2, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0}, -+ {-3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {9, -9, 0, 0, -9, 9, 0, 0, 6, 3, 0, 0, -6, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, -6, 0, 0, 3, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {-6, 6, 0, 0, 6, -6, 0, 0, -3, -3, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, 4, 0, 0, -2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -2, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, -1, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, -9, 0, 0, -9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 0, 0, -6, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, -6, 0, 0, 3, -3, 0, 0, 4, 2, 0, 0, 2, 1, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6, 6, 0, 0, 6, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, -3, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, 4, 0, 0, -2, 2, 0, 0, -2, -2, 0, 0, -1, -1, 0, 0}, -+ {9, 0, -9, 0, -9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 3, 0, -6, 0, -3, 0, 6, 0, -6, 0, 3, 0, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 9, 0, -9, 0, -9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 3, 0, -6, 0, -3, 0, 6, 0, -6, 0, 3, 0, -3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 0, 2, 0, 1, 0}, -+ {-27, 27, 27, -27, 27, -27, -27, 27, -18, -9, 18, 9, 18, 9, -18, -9, -18, 18, -9, 9, 18, -18, 9, -9, -18, 18, 18, -18, -9, 9, 9, -9, -12, -6, -6, -3, 12, 6, 6, 3, -12, -6, 12, 6, -6, -3, 6, 3, -12, 12, -6, 6, -6, 6, -3, 3, -8, -4, -4, -2, -4, -2, -2, -1}, -+ {18, -18, -18, 18, -18, 18, 18, -18, 9, 9, -9, -9, -9, -9, 9, 9, 12, -12, 6, -6, -12, 12, -6, 6, 12, -12, -12, 12, 6, -6, -6, 6, 6, 6, 3, 3, -6, -6, -3, -3, 6, 6, -6, -6, 3, 3, -3, -3, 8, -8, 4, -4, 4, -4, 2, -2, 4, 4, 2, 2, 2, 2, 1, 1}, -+ {-6, 0, 6, 0, 6, 0, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, -3, 0, 3, 0, 3, 0, -4, 0, 4, 0, -2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, -2, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, -6, 0, 6, 0, 6, 0, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 0, -3, 0, 3, 0, 3, 0, -4, 0, 4, 0, -2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, -2, 0, -1, 0, -1, 0}, -+ {18, -18, -18, 18, -18, 18, 18, -18, 12, 6, -12, -6, -12, -6, 12, 6, 9, -9, 9, -9, -9, 9, -9, 9, 12, -12, -12, 12, 6, -6, -6, 6, 6, 3, 6, 3, -6, -3, -6, -3, 8, 4, -8, -4, 4, 2, -4, -2, 6, -6, 6, -6, 3, -3, 3, -3, 4, 2, 4, 2, 2, 1, 2, 1}, -+ {-12, 12, 12, -12, 12, -12, -12, 12, -6, -6, 6, 6, 6, 6, -6, -6, -6, 6, -6, 6, 6, -6, 6, -6, -8, 8, 8, -8, -4, 4, 4, -4, -3, -3, -3, -3, 3, 3, 3, 3, -4, -4, 4, 4, -2, -2, 2, 2, -4, 4, -4, 4, -2, 2, -2, 2, -2, -2, -2, -2, -1, -1, -1, -1}, -+ {2, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {-6, 6, 0, 0, 6, -6, 0, 0, -4, -2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 3, 0, 0, -3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -1, 0, 0, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {4, -4, 0, 0, -4, 4, 0, 0, 2, 2, 0, 0, -2, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -2, 0, 0, 2, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6, 6, 0, 0, 6, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, -2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -3, 3, 0, 0, -3, 3, 0, 0, -2, -1, 0, 0, -2, -1, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, -4, 0, 0, -4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, -2, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -2, 0, 0, 2, -2, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0}, -+ {-6, 0, 6, 0, 6, 0, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, 0, -2, 0, 4, 0, 2, 0, -3, 0, 3, 0, -3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, -1, 0, -2, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, -6, 0, 6, 0, 6, 0, -6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, 0, -2, 0, 4, 0, 2, 0, -3, 0, 3, 0, -3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, -1, 0, -2, 0, -1, 0}, -+ {18, -18, -18, 18, -18, 18, 18, -18, 12, 6, -12, -6, -12, -6, 12, 6, 12, -12, 6, -6, -12, 12, -6, 6, 9, -9, -9, 9, 9, -9, -9, 9, 8, 4, 4, 2, -8, -4, -4, -2, 6, 3, -6, -3, 6, 3, -6, -3, 6, -6, 3, -3, 6, -6, 3, -3, 4, 2, 2, 1, 4, 2, 2, 1}, -+ {-12, 12, 12, -12, 12, -12, -12, 12, -6, -6, 6, 6, 6, 6, -6, -6, -8, 8, -4, 4, 8, -8, 4, -4, -6, 6, 6, -6, -6, 6, 6, -6, -4, -4, -2, -2, 4, 4, 2, 2, -3, -3, 3, 3, -3, -3, 3, 3, -4, 4, -2, 2, -4, 4, -2, 2, -2, -2, -1, -1, -2, -2, -1, -1}, -+ {4, 0, -4, 0, -4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, -2, 0, -2, 0, 2, 0, -2, 0, 2, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, -+ {0, 0, 0, 0, 0, 0, 0, 0, 4, 0, -4, 0, -4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, -2, 0, -2, 0, 2, 0, -2, 0, 2, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0}, -+ {-12, 12, 12, -12, 12, -12, -12, 12, -8, -4, 8, 4, 8, 4, -8, -4, -6, 6, -6, 6, 6, -6, 6, -6, -6, 6, 6, -6, -6, 6, 6, -6, -4, -2, -4, -2, 4, 2, 4, 2, -4, -2, 4, 2, -4, -2, 4, 2, -3, 3, -3, 3, -3, 3, -3, 3, -2, -1, -2, -1, -2, -1, -2, -1}, -+ {8, -8, -8, 8, -8, 8, 8, -8, 4, 4, -4, -4, -4, -4, 4, 4, 4, -4, 4, -4, -4, 4, -4, 4, 4, -4, -4, 4, 4, -4, -4, 4, 2, 2, 2, 2, -2, -2, -2, -2, 2, 2, -2, -2, 2, 2, -2, -2, 2, -2, 2, -2, 2, -2, 2, -2, 1, 1, 1, 1, 1, 1, 1, 1}}; -+ -+template -+void TricubicSampler::stencil(__global__ const CoordT& ijk, __global__ ValueT (&C)[64]) const -+{ -+ struct Fetch { -+ Fetch(__global__ ValueT (&_C)[64]):C(_C) {} -+ __global__ ValueT& fetch(int i, int j, int k) { return C[((i + 1) << 4) + ((j + 1) << 2) + k + 1]; } -+ -+ __global__ ValueT (&C)[64]; -+ }; -+ Fetch f(C); -+ -+ // fetch 64 point stencil values -+ for (int i = -1; i < 3; ++i) { -+ for (int j = -1; j < 3; ++j) { -+ Fetch::fetch(i, j, -1) = mAcc.getValue(ijk + CoordT(i, j, -1)); -+ Fetch::fetch(i, j, 0) = mAcc.getValue(ijk + CoordT(i, j, 0)); -+ Fetch::fetch(i, j, 1) = mAcc.getValue(ijk + CoordT(i, j, 1)); -+ Fetch::fetch(i, j, 2) = mAcc.getValue(ijk + CoordT(i, j, 2)); -+ } -+ } -+ const ValueT _half(0.5), quarter(0.25), eighth(0.125); -+ const ValueT X[64] = {// values of f(x,y,z) at the 8 corners (each from 1 stencil value). -+ f.fetch(0, 0, 0), -+ f.fetch(1, 0, 0), -+ f.fetch(0, 1, 0), -+ f.fetch(1, 1, 0), -+ f.fetch(0, 0, 1), -+ f.fetch(1, 0, 1), -+ f.fetch(0, 1, 1), -+ f.fetch(1, 1, 1), -+ // values of df/dx at the 8 corners (each from 2 stencil values). -+ _half * (f.fetch(1, 0, 0) - f.fetch(-1, 0, 0)), -+ _half * (f.fetch(2, 0, 0) - f.fetch(0, 0, 0)), -+ _half * (f.fetch(1, 1, 0) - f.fetch(-1, 1, 0)), -+ _half * (f.fetch(2, 1, 0) - f.fetch(0, 1, 0)), -+ _half * (f.fetch(1, 0, 1) - f.fetch(-1, 0, 1)), -+ _half * (f.fetch(2, 0, 1) - f.fetch(0, 0, 1)), -+ _half * (f.fetch(1, 1, 1) - f.fetch(-1, 1, 1)), -+ _half * (f.fetch(2, 1, 1) - f.fetch(0, 1, 1)), -+ // values of df/dy at the 8 corners (each from 2 stencil values). -+ _half * (f.fetch(0, 1, 0) - f.fetch(0, -1, 0)), -+ _half * (f.fetch(1, 1, 0) - f.fetch(1, -1, 0)), -+ _half * (f.fetch(0, 2, 0) - f.fetch(0, 0, 0)), -+ _half * (f.fetch(1, 2, 0) - f.fetch(1, 0, 0)), -+ _half * (f.fetch(0, 1, 1) - f.fetch(0, -1, 1)), -+ _half * (f.fetch(1, 1, 1) - f.fetch(1, -1, 1)), -+ _half * (f.fetch(0, 2, 1) - f.fetch(0, 0, 1)), -+ _half * (f.fetch(1, 2, 1) - f.fetch(1, 0, 1)), -+ // values of df/dz at the 8 corners (each from 2 stencil values). -+ _half * (f.fetch(0, 0, 1) - f.fetch(0, 0, -1)), -+ _half * (f.fetch(1, 0, 1) - f.fetch(1, 0, -1)), -+ _half * (f.fetch(0, 1, 1) - f.fetch(0, 1, -1)), -+ _half * (f.fetch(1, 1, 1) - f.fetch(1, 1, -1)), -+ _half * (f.fetch(0, 0, 2) - f.fetch(0, 0, 0)), -+ _half * (f.fetch(1, 0, 2) - f.fetch(1, 0, 0)), -+ _half * (f.fetch(0, 1, 2) - f.fetch(0, 1, 0)), -+ _half * (f.fetch(1, 1, 2) - f.fetch(1, 1, 0)), -+ // values of d2f/dxdy at the 8 corners (each from 4 stencil values). -+ quarter * (f.fetch(1, 1, 0) - f.fetch(-1, 1, 0) - f.fetch(1, -1, 0) + f.fetch(-1, -1, 0)), -+ quarter * (f.fetch(2, 1, 0) - f.fetch(0, 1, 0) - f.fetch(2, -1, 0) + f.fetch(0, -1, 0)), -+ quarter * (f.fetch(1, 2, 0) - f.fetch(-1, 2, 0) - f.fetch(1, 0, 0) + f.fetch(-1, 0, 0)), -+ quarter * (f.fetch(2, 2, 0) - f.fetch(0, 2, 0) - f.fetch(2, 0, 0) + f.fetch(0, 0, 0)), -+ quarter * (f.fetch(1, 1, 1) - f.fetch(-1, 1, 1) - f.fetch(1, -1, 1) + f.fetch(-1, -1, 1)), -+ quarter * (f.fetch(2, 1, 1) - f.fetch(0, 1, 1) - f.fetch(2, -1, 1) + f.fetch(0, -1, 1)), -+ quarter * (f.fetch(1, 2, 1) - f.fetch(-1, 2, 1) - f.fetch(1, 0, 1) + f.fetch(-1, 0, 1)), -+ quarter * (f.fetch(2, 2, 1) - f.fetch(0, 2, 1) - f.fetch(2, 0, 1) + f.fetch(0, 0, 1)), -+ // values of d2f/dxdz at the 8 corners (each from 4 stencil values). -+ quarter * (f.fetch(1, 0, 1) - f.fetch(-1, 0, 1) - f.fetch(1, 0, -1) + f.fetch(-1, 0, -1)), -+ quarter * (f.fetch(2, 0, 1) - f.fetch(0, 0, 1) - f.fetch(2, 0, -1) + f.fetch(0, 0, -1)), -+ quarter * (f.fetch(1, 1, 1) - f.fetch(-1, 1, 1) - f.fetch(1, 1, -1) + f.fetch(-1, 1, -1)), -+ quarter * (f.fetch(2, 1, 1) - f.fetch(0, 1, 1) - f.fetch(2, 1, -1) + f.fetch(0, 1, -1)), -+ quarter * (f.fetch(1, 0, 2) - f.fetch(-1, 0, 2) - f.fetch(1, 0, 0) + f.fetch(-1, 0, 0)), -+ quarter * (f.fetch(2, 0, 2) - f.fetch(0, 0, 2) - f.fetch(2, 0, 0) + f.fetch(0, 0, 0)), -+ quarter * (f.fetch(1, 1, 2) - f.fetch(-1, 1, 2) - f.fetch(1, 1, 0) + f.fetch(-1, 1, 0)), -+ quarter * (f.fetch(2, 1, 2) - f.fetch(0, 1, 2) - f.fetch(2, 1, 0) + f.fetch(0, 1, 0)), -+ // values of d2f/dydz at the 8 corners (each from 4 stencil values). -+ quarter * (f.fetch(0, 1, 1) - f.fetch(0, -1, 1) - f.fetch(0, 1, -1) + f.fetch(0, -1, -1)), -+ quarter * (f.fetch(1, 1, 1) - f.fetch(1, -1, 1) - f.fetch(1, 1, -1) + f.fetch(1, -1, -1)), -+ quarter * (f.fetch(0, 2, 1) - f.fetch(0, 0, 1) - f.fetch(0, 2, -1) + f.fetch(0, 0, -1)), -+ quarter * (f.fetch(1, 2, 1) - f.fetch(1, 0, 1) - f.fetch(1, 2, -1) + f.fetch(1, 0, -1)), -+ quarter * (f.fetch(0, 1, 2) - f.fetch(0, -1, 2) - f.fetch(0, 1, 0) + f.fetch(0, -1, 0)), -+ quarter * (f.fetch(1, 1, 2) - f.fetch(1, -1, 2) - f.fetch(1, 1, 0) + f.fetch(1, -1, 0)), -+ quarter * (f.fetch(0, 2, 2) - f.fetch(0, 0, 2) - f.fetch(0, 2, 0) + f.fetch(0, 0, 0)), -+ quarter * (f.fetch(1, 2, 2) - f.fetch(1, 0, 2) - f.fetch(1, 2, 0) + f.fetch(1, 0, 0)), -+ // values of d3f/dxdydz at the 8 corners (each from 8 stencil values). -+ eighth * (f.fetch(1, 1, 1) - f.fetch(-1, 1, 1) - f.fetch(1, -1, 1) + f.fetch(-1, -1, 1) - f.fetch(1, 1, -1) + f.fetch(-1, 1, -1) + f.fetch(1, -1, -1) - f.fetch(-1, -1, -1)), -+ eighth * (f.fetch(2, 1, 1) - f.fetch(0, 1, 1) - f.fetch(2, -1, 1) + f.fetch(0, -1, 1) - f.fetch(2, 1, -1) + f.fetch(0, 1, -1) + f.fetch(2, -1, -1) - f.fetch(0, -1, -1)), -+ eighth * (f.fetch(1, 2, 1) - f.fetch(-1, 2, 1) - f.fetch(1, 0, 1) + f.fetch(-1, 0, 1) - f.fetch(1, 2, -1) + f.fetch(-1, 2, -1) + f.fetch(1, 0, -1) - f.fetch(-1, 0, -1)), -+ eighth * (f.fetch(2, 2, 1) - f.fetch(0, 2, 1) - f.fetch(2, 0, 1) + f.fetch(0, 0, 1) - f.fetch(2, 2, -1) + f.fetch(0, 2, -1) + f.fetch(2, 0, -1) - f.fetch(0, 0, -1)), -+ eighth * (f.fetch(1, 1, 2) - f.fetch(-1, 1, 2) - f.fetch(1, -1, 2) + f.fetch(-1, -1, 2) - f.fetch(1, 1, 0) + f.fetch(-1, 1, 0) + f.fetch(1, -1, 0) - f.fetch(-1, -1, 0)), -+ eighth * (f.fetch(2, 1, 2) - f.fetch(0, 1, 2) - f.fetch(2, -1, 2) + f.fetch(0, -1, 2) - f.fetch(2, 1, 0) + f.fetch(0, 1, 0) + f.fetch(2, -1, 0) - f.fetch(0, -1, 0)), -+ eighth * (f.fetch(1, 2, 2) - f.fetch(-1, 2, 2) - f.fetch(1, 0, 2) + f.fetch(-1, 0, 2) - f.fetch(1, 2, 0) + f.fetch(-1, 2, 0) + f.fetch(1, 0, 0) - f.fetch(-1, 0, 0)), -+ eighth * (f.fetch(2, 2, 2) - f.fetch(0, 2, 2) - f.fetch(2, 0, 2) + f.fetch(0, 0, 2) - f.fetch(2, 2, 0) + f.fetch(0, 2, 0) + f.fetch(2, 0, 0) - f.fetch(0, 0, 0))}; -+ -+ for (int i = 0; i < 64; ++i) { // C = A * X -+ C[i] = ValueT(0); -+#if 0 -+ for (int j = 0; j < 64; j += 4) { -+ C[i] = fma(A[i][j], X[j], fma(A[i][j+1], X[j+1], fma(A[i][j+2], X[j+2], fma(A[i][j+3], X[j+3], C[i])))); -+ } -+#else -+ for (int j = 0; j < 64; j += 4) { -+ C[i] += TricubicSampler_A[i][j] * X[j] + TricubicSampler_A[i][j + 1] * X[j + 1] + -+ TricubicSampler_A[i][j + 2] * X[j + 2] + TricubicSampler_A[i][j + 3] * X[j + 3]; -+ } -+#endif -+ } -+} -+ -+template -+template class Vec3T> -+__hostdev__ typename TreeOrAccT::ValueType TricubicSampler::sample(__global__ const Vec3T &xyz, __global__ const ValueT (&C)[64]) -+{ -+ ValueT zPow(1), sum(0); -+ for (int k = 0, n = 0; k < 4; ++k) { -+ ValueT yPow(1); -+ for (int j = 0; j < 4; ++j, n += 4) { -+#if 0 -+ sum = fma( yPow, zPow * fma(xyz[0], fma(xyz[0], fma(xyz[0], C[n + 3], C[n + 2]), C[n + 1]), C[n]), sum); -+#else -+ sum += yPow * zPow * (C[n] + xyz[0] * (C[n + 1] + xyz[0] * (C[n + 2] + xyz[0] * C[n + 3]))); -+#endif -+ yPow *= xyz[1]; -+ } -+ zPow *= xyz[2]; -+ } -+ return sum; -+} -+ -+template -+class SampleFromVoxels -+#if !defined(__KERNEL_METAL__) -+ : public TricubicSampler -+#endif -+{ -+#if defined(__KERNEL_METAL__) -+ TricubicSampler _base; -+#define BASE(v) _base.v -+#else -+#define BASE(v) BaseT::v -+#endif -+ using BaseT = TricubicSampler; -+ using ValueT = typename TreeOrAccT::ValueType; -+ using CoordT = typename TreeOrAccT::CoordType; -+ -+ mutable CoordT mPos; -+ mutable ValueT mC[64]; -+ -+ template class Vec3T> -+ __hostdev__ void cache(__global__ Vec3T& xyz) const; -+ -+public: -+ /// @brief Construction from a Tree or ReadAccessor -+ __hostdev__ SampleFromVoxels(__local__ const TreeOrAccT& acc) -+ : BaseT(acc) -+ { -+ } -+ -+ /// @note xyz is in index space space -+ template class Vec3T> -+ inline __hostdev__ ValueT operator()(Vec3T xyz) const; -+ -+ // @brief Return value at the coordinate @a ijk in index space space -+ __hostdev__ ValueT operator()(__global__ const CoordT &ijk) const {return BaseT::mAcc.getValue(ijk);} -+ -+}; // SampleFromVoxels -+ -+template -+template class Vec3T> -+typename TreeOrAccT::ValueType SampleFromVoxels::operator()(Vec3T xyz) const -+{ -+ this->cache(xyz); -+ return BaseT::sample(xyz, mC); -+} -+ -+template -+template class Vec3T> -+void SampleFromVoxels::cache(__global__ Vec3T& xyz) const -+{ -+ CoordT ijk = Floor(xyz); -+ if (ijk != mPos) { -+ mPos = ijk; -+ BaseT::stencil(ijk, mC); -+ } -+} -+ -+template -+class SampleFromVoxels -+#if !defined(__KERNEL_METAL__) -+ : public TricubicSampler -+#endif -+{ -+#if defined(__KERNEL_METAL__) -+ TricubicSampler _base; -+#define BASE(v) _base.v -+#else -+#define BASE(v) BaseT::v -+#endif -+ using BaseT = TricubicSampler; -+ using ValueT = typename TreeOrAccT::ValueType; -+ using CoordT = typename TreeOrAccT::CoordType; -+ -+public: -+ /// @brief Construction from a Tree or ReadAccessor -+ __hostdev__ SampleFromVoxels(__local__ const TreeOrAccT& acc) -+ : BaseT(acc) -+ { -+ } -+ -+ /// @note xyz is in index space space -+ template class Vec3T> -+ inline __hostdev__ ValueT operator()(Vec3T xyz) const; -+ -+ __hostdev__ ValueT operator()(__global__ const CoordT &ijk) const {return BaseT::mAcc.getValue(ijk);} -+ -+}; // SampleFromVoxels -+ -+template -+template class Vec3T> -+__hostdev__ typename TreeOrAccT::ValueType SampleFromVoxels::operator()(Vec3T xyz) const -+{ -+ ValueT C[64]; -+ CoordT ijk = Floor(xyz); -+ BaseT::stencil(ijk, C); -+ return BaseT::sample(xyz, C); -+} -+ -+} // namespace nanovdb -+ -+#endif // NANOVDB_SAMPLE_FROM_VOXELS_H_HAS_BEEN_INCLUDED diff --git a/build_files/config/pipeline_config.yaml b/build_files/config/pipeline_config.yaml index 193a493318c..2f548165cd2 100644 --- a/build_files/config/pipeline_config.yaml +++ b/build_files/config/pipeline_config.yaml @@ -19,7 +19,7 @@ buildbot: optix: version: '7.3.0' ocloc: - version: '101.4723' + version: '101.4723p0' cmake: default: version: any diff --git a/build_files/windows/parse_arguments.cmd b/build_files/windows/parse_arguments.cmd index 7a592618ec5..7771c6206a8 100644 --- a/build_files/windows/parse_arguments.cmd +++ b/build_files/windows/parse_arguments.cmd @@ -17,8 +17,8 @@ if NOT "%1" == "" ( shift /1 ) else if "%1" == "with_tests" ( set TESTS_CMAKE_ARGS=%TESTS_CMAKE_ARGS% -DWITH_GTESTS=On - ) else if "%1" == "with_opengl_tests" ( - set TESTS_CMAKE_ARGS=%TESTS_CMAKE_ARGS% -DWITH_OPENGL_DRAW_TESTS=On -DWITH_OPENGL_RENDER_TESTS=On + ) else if "%1" == "with_gpu_tests" ( + set TESTS_CMAKE_ARGS=%TESTS_CMAKE_ARGS% -DWITH_GPU_DRAW_TESTS=On -DWITH_GPU_RENDER_TESTS=On ) else if "%1" == "full" ( set TARGET=Full set BUILD_CMAKE_ARGS=%BUILD_CMAKE_ARGS% ^ diff --git a/build_files/windows/show_help.cmd b/build_files/windows/show_help.cmd index 86b9785ebbc..43448ac6d99 100644 --- a/build_files/windows/show_help.cmd +++ b/build_files/windows/show_help.cmd @@ -39,7 +39,7 @@ echo - doc_py ^(Generate sphinx python api docs^) echo. echo Experimental options -echo - with_opengl_tests ^(enable both the render and draw opengl test suites^) +echo - with_gpu_tests ^(enable both the render and draw gpu test suites including EEVEE, Workbench, Grease Pencil, draw manager and GPU backends^) echo - clang ^(enable building with clang^) echo - asan ^(enable asan when building with clang^) echo - ninja ^(enable building with ninja instead of msbuild^) diff --git a/doc/license/SPDX-license-identifiers.txt b/doc/license/SPDX-license-identifiers.txt index 705169b1af7..62aa0bbb4cd 100644 --- a/doc/license/SPDX-license-identifiers.txt +++ b/doc/license/SPDX-license-identifiers.txt @@ -7,4 +7,5 @@ GPL-2.0-or-later GPL-license.txt https://spdx.org/licenses/GP GPL-3.0-or-later GPL3-license.txt https://spdx.org/licenses/GPL-3.0-or-later.html LGPL-2.1-or-later LGPL2.1-license.txt https://spdx.org/licenses/LGPL-2.1-or-later.html MIT MIT-license.txt https://spdx.org/licenses/MIT.html +MPL-2.0 MPL-2.0.txt https://spdx.org/licenses/MPL-2.0.html Zlib Zlib-license.txt https://spdx.org/licenses/Zlib.html diff --git a/intern/cycles/CMakeLists.txt b/intern/cycles/CMakeLists.txt index 192b4e3c55d..2047a6fc98a 100644 --- a/intern/cycles/CMakeLists.txt +++ b/intern/cycles/CMakeLists.txt @@ -191,13 +191,6 @@ if(CXX_HAS_AVX2) add_definitions(-DWITH_KERNEL_AVX2) endif() -# LLVM and OSL need to build without RTTI -if(WIN32 AND MSVC) - set(RTTI_DISABLE_FLAGS "/GR- -DBOOST_NO_RTTI -DBOOST_NO_TYPEID") -elseif(CMAKE_COMPILER_IS_GNUCC OR (CMAKE_C_COMPILER_ID MATCHES "Clang")) - set(RTTI_DISABLE_FLAGS "-fno-rtti -DBOOST_NO_RTTI -DBOOST_NO_TYPEID") -endif() - # Definitions and Includes add_definitions( diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index 6cf30b21e18..71730f1ef7d 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -2272,6 +2272,7 @@ class CYCLES_RENDER_PT_simplify_viewport(CyclesButtonsPanel, Panel): col.prop(rd, "simplify_child_particles", text="Child Particles") col.prop(cscene, "texture_limit", text="Texture Limit") col.prop(rd, "simplify_volumes", text="Volume Resolution") + col.prop(rd, "use_simplify_normals", text="Normals") class CYCLES_RENDER_PT_simplify_render(CyclesButtonsPanel, Panel): diff --git a/intern/cycles/blender/mesh.cpp b/intern/cycles/blender/mesh.cpp index cdfeadb806a..bde5f3c39d8 100644 --- a/intern/cycles/blender/mesh.cpp +++ b/intern/cycles/blender/mesh.cpp @@ -326,13 +326,13 @@ static void attr_create_generic(Scene *scene, } else { for (const int i : looptris.index_range()) { - const MLoopTri &tri = looptris[i]; + const MLoopTri < = looptris[i]; data[i * 3 + 0] = make_uchar4( - src[tri.tri[0]][0], src[tri.tri[0]][1], src[tri.tri[0]][2], src[tri.tri[0]][3]); + src[lt.tri[0]][0], src[lt.tri[0]][1], src[lt.tri[0]][2], src[lt.tri[0]][3]); data[i * 3 + 1] = make_uchar4( - src[tri.tri[1]][0], src[tri.tri[1]][1], src[tri.tri[1]][2], src[tri.tri[1]][3]); + src[lt.tri[1]][0], src[lt.tri[1]][1], src[lt.tri[1]][2], src[lt.tri[1]][3]); data[i * 3 + 2] = make_uchar4( - src[tri.tri[2]][0], src[tri.tri[2]][1], src[tri.tri[2]][2], src[tri.tri[2]][3]); + src[lt.tri[2]][0], src[lt.tri[2]][1], src[lt.tri[2]][2], src[lt.tri[2]][3]); } } return true; @@ -376,10 +376,10 @@ static void attr_create_generic(Scene *scene, } else { for (const int i : looptris.index_range()) { - const MLoopTri &tri = looptris[i]; - data[i * 3 + 0] = Converter::convert(src[tri.tri[0]]); - data[i * 3 + 1] = Converter::convert(src[tri.tri[1]]); - data[i * 3 + 2] = Converter::convert(src[tri.tri[2]]); + const MLoopTri < = looptris[i]; + data[i * 3 + 0] = Converter::convert(src[lt.tri[0]]); + data[i * 3 + 1] = Converter::convert(src[lt.tri[1]]); + data[i * 3 + 2] = Converter::convert(src[lt.tri[2]]); } } break; @@ -469,10 +469,10 @@ static void attr_create_uv_map(Scene *scene, uv_name.c_str(), ATTR_DOMAIN_CORNER); float2 *fdata = uv_attr->data_float2(); for (const int i : looptris.index_range()) { - const MLoopTri &tri = looptris[i]; - fdata[i * 3 + 0] = make_float2(b_uv_map[tri.tri[0]][0], b_uv_map[tri.tri[0]][1]); - fdata[i * 3 + 1] = make_float2(b_uv_map[tri.tri[1]][0], b_uv_map[tri.tri[1]][1]); - fdata[i * 3 + 2] = make_float2(b_uv_map[tri.tri[2]][0], b_uv_map[tri.tri[2]][1]); + const MLoopTri < = looptris[i]; + fdata[i * 3 + 0] = make_float2(b_uv_map[lt.tri[0]][0], b_uv_map[lt.tri[0]][1]); + fdata[i * 3 + 1] = make_float2(b_uv_map[lt.tri[1]][0], b_uv_map[lt.tri[1]][1]); + fdata[i * 3 + 2] = make_float2(b_uv_map[lt.tri[2]][0], b_uv_map[lt.tri[2]][1]); } } @@ -915,10 +915,10 @@ static void create_mesh(Scene *scene, const blender::Span looptris = b_mesh.looptris(); for (const int i : looptris.index_range()) { - const MLoopTri &tri = looptris[i]; - triangles[i * 3 + 0] = corner_verts[tri.tri[0]]; - triangles[i * 3 + 1] = corner_verts[tri.tri[1]]; - triangles[i * 3 + 2] = corner_verts[tri.tri[2]]; + const MLoopTri < = looptris[i]; + triangles[i * 3 + 0] = corner_verts[lt.tri[0]]; + triangles[i * 3 + 1] = corner_verts[lt.tri[1]]; + triangles[i * 3 + 2] = corner_verts[lt.tri[2]]; } if (!material_indices.is_empty()) { @@ -944,9 +944,9 @@ static void create_mesh(Scene *scene, if (use_loop_normals && !corner_normals.is_empty()) { for (const int i : looptris.index_range()) { - const MLoopTri &tri = looptris[i]; + const MLoopTri < = looptris[i]; for (int i = 0; i < 3; i++) { - const int corner = tri.tri[i]; + const int corner = lt.tri[i]; const int vert = corner_verts[corner]; const float *normal = corner_normals[corner]; N[vert] = make_float3(normal[0], normal[1], normal[2]); diff --git a/intern/cycles/device/cpu/device_impl.cpp b/intern/cycles/device/cpu/device_impl.cpp index cbbdb844323..ba838233855 100644 --- a/intern/cycles/device/cpu/device_impl.cpp +++ b/intern/cycles/device/cpu/device_impl.cpp @@ -313,7 +313,7 @@ void CPUDevice::get_cpu_kernel_thread_globals( kernel_thread_globals.clear(); void *osl_memory = get_cpu_osl_memory(); for (int i = 0; i < info.cpu_threads; i++) { - kernel_thread_globals.emplace_back(kernel_globals, osl_memory, profiler); + kernel_thread_globals.emplace_back(kernel_globals, osl_memory, profiler, i); } } diff --git a/intern/cycles/device/cpu/kernel.h b/intern/cycles/device/cpu/kernel.h index 688d9335221..a69f4b906e4 100644 --- a/intern/cycles/device/cpu/kernel.h +++ b/intern/cycles/device/cpu/kernel.h @@ -60,7 +60,7 @@ class CPUKernels { int x, int y, float threshold, - bool reset, + int reset, int offset, int stride)>; diff --git a/intern/cycles/device/cpu/kernel_thread_globals.cpp b/intern/cycles/device/cpu/kernel_thread_globals.cpp index 546061a5086..998a63aa334 100644 --- a/intern/cycles/device/cpu/kernel_thread_globals.cpp +++ b/intern/cycles/device/cpu/kernel_thread_globals.cpp @@ -12,14 +12,16 @@ CCL_NAMESPACE_BEGIN CPUKernelThreadGlobals::CPUKernelThreadGlobals(const KernelGlobalsCPU &kernel_globals, void *osl_globals_memory, - Profiler &cpu_profiler) + Profiler &cpu_profiler, + const int thread_index) : KernelGlobalsCPU(kernel_globals), cpu_profiler_(cpu_profiler) { clear_runtime_pointers(); #ifdef WITH_OSL - OSLGlobals::thread_init(this, static_cast(osl_globals_memory)); + OSLGlobals::thread_init(this, static_cast(osl_globals_memory), thread_index); #else + (void)thread_index; (void)osl_globals_memory; #endif diff --git a/intern/cycles/device/cpu/kernel_thread_globals.h b/intern/cycles/device/cpu/kernel_thread_globals.h index dc4b693702a..3dbc35fefa3 100644 --- a/intern/cycles/device/cpu/kernel_thread_globals.h +++ b/intern/cycles/device/cpu/kernel_thread_globals.h @@ -23,7 +23,8 @@ class CPUKernelThreadGlobals : public KernelGlobalsCPU { * without OSL support. Will avoid need to those unnamed pointers and casts. */ CPUKernelThreadGlobals(const KernelGlobalsCPU &kernel_globals, void *osl_globals_memory, - Profiler &cpu_profiler); + Profiler &cpu_profiler, + const int thread_index); ~CPUKernelThreadGlobals(); diff --git a/intern/cycles/device/hip/device.cpp b/intern/cycles/device/hip/device.cpp index d102805b778..c5f3083c7f4 100644 --- a/intern/cycles/device/hip/device.cpp +++ b/intern/cycles/device/hip/device.cpp @@ -10,6 +10,8 @@ # include "device/device.h" # include "device/hip/device_impl.h" +# include "integrator/denoiser_oidn_gpu.h" + # include "util/string.h" # include "util/windows.h" #endif /* WITH_HIP */ @@ -158,6 +160,11 @@ void device_hip_info(vector &devices) info.has_light_tree = true; info.has_mnee = true; info.denoisers = 0; +# if defined(WITH_OPENIMAGEDENOISE) + if (OIDNDenoiserGPU::is_device_supported(info)) { + info.denoisers |= DENOISER_OPENIMAGEDENOISE; + } +# endif info.has_gpu_queue = true; /* Check if the device has P2P access to any other device in the system. */ diff --git a/intern/cycles/device/metal/device_impl.h b/intern/cycles/device/metal/device_impl.h index 1598d2cba01..ec708e08bd7 100644 --- a/intern/cycles/device/metal/device_impl.h +++ b/intern/cycles/device/metal/device_impl.h @@ -73,7 +73,7 @@ class MetalDevice : public Device { /* Bindless Textures */ bool is_texture(const TextureInfo &tex); device_vector texture_info; - bool need_texture_info; + bool need_texture_info = false; id mtlTextureArgEncoder = nil; id mtlBufferArgEncoder = nil; id buffer_bindings_1d = nil; diff --git a/intern/cycles/device/oneapi/queue.h b/intern/cycles/device/oneapi/queue.h index bf792e9e383..c7fb832210c 100644 --- a/intern/cycles/device/oneapi/queue.h +++ b/intern/cycles/device/oneapi/queue.h @@ -40,7 +40,7 @@ class OneapiDeviceQueue : public DeviceQueue { virtual void copy_to_device(device_memory &mem) override; virtual void copy_from_device(device_memory &mem) override; - virtual bool supports_local_atomic_sort() const + virtual bool supports_local_atomic_sort() const override { return true; } diff --git a/intern/cycles/device/queue.h b/intern/cycles/device/queue.h index 3f8d42695ac..190e1c77d20 100644 --- a/intern/cycles/device/queue.h +++ b/intern/cycles/device/queue.h @@ -27,7 +27,6 @@ struct DeviceKernelArguments { POINTER, INT32, FLOAT32, - BOOLEAN, KERNEL_FILM_CONVERT, }; @@ -66,10 +65,6 @@ struct DeviceKernelArguments { { add(FLOAT32, value, sizeof(float)); } - void add(const bool *value) - { - add(BOOLEAN, value, 4); - } void add(const Type type, const void *value, size_t size) { assert(count < MAX_ARGS); diff --git a/intern/cycles/integrator/denoiser.cpp b/intern/cycles/integrator/denoiser.cpp index 2735de9a12e..7106213d4cc 100644 --- a/intern/cycles/integrator/denoiser.cpp +++ b/intern/cycles/integrator/denoiser.cpp @@ -27,7 +27,9 @@ unique_ptr Denoiser::create(Device *path_trace_device, const DenoisePa #endif #ifdef WITH_OPENIMAGEDENOISE - if (params.type == DENOISER_OPENIMAGEDENOISE && path_trace_device->info.type == DEVICE_ONEAPI) { + if (params.type == DENOISER_OPENIMAGEDENOISE && path_trace_device->info.type != DEVICE_CPU && + OIDNDenoiserGPU::is_device_supported(path_trace_device->info)) + { return make_unique(path_trace_device, params); } #endif diff --git a/intern/cycles/integrator/denoiser_gpu.h b/intern/cycles/integrator/denoiser_gpu.h index 7ba53af03df..095a7995288 100644 --- a/intern/cycles/integrator/denoiser_gpu.h +++ b/intern/cycles/integrator/denoiser_gpu.h @@ -103,7 +103,7 @@ class DenoiserGPU : public Denoiser { int denoised_offset; int num_components; - bool use_compositing; + int use_compositing; bool use_denoising_albedo; }; diff --git a/intern/cycles/integrator/denoiser_oidn_gpu.cpp b/intern/cycles/integrator/denoiser_oidn_gpu.cpp index f1025c178c6..79bab94f310 100644 --- a/intern/cycles/integrator/denoiser_oidn_gpu.cpp +++ b/intern/cycles/integrator/denoiser_oidn_gpu.cpp @@ -30,16 +30,48 @@ CCL_NAMESPACE_BEGIN bool OIDNDenoiserGPU::is_device_supported(const DeviceInfo &device) { - /* Currently falls back to checking just the device type, can be improved. */ + int device_type = OIDN_DEVICE_TYPE_DEFAULT; switch (device.type) { # ifdef OIDN_DEVICE_SYCL - /* Assume all devices with Cycles support are also supported by OIDN2. */ case DEVICE_ONEAPI: - return true; + device_type = OIDN_DEVICE_TYPE_SYCL; + break; # endif +# ifdef OIDN_DEVICE_HIP + case DEVICE_HIP: + device_type = OIDN_DEVICE_TYPE_HIP; + break; +# endif +# ifdef OIDN_DEVICE_CUDA + case DEVICE_CUDA: + case DEVICE_OPTIX: + device_type = OIDN_DEVICE_TYPE_CUDA; + break; +# endif + case DEVICE_CPU: + /* This is the GPU denoiser - CPU devices shouldn't end up here. */ + assert(0); default: return false; } + + /* Match GPUs by their PCI ID. */ + const int num_devices = oidnGetNumPhysicalDevices(); + for (int i = 0; i < num_devices; i++) { + if (oidnGetPhysicalDeviceInt(i, "type") == device_type) { + if (oidnGetPhysicalDeviceBool(i, "pciAddressSupported")) { + unsigned int pci_domain = oidnGetPhysicalDeviceInt(i, "pciDomain"); + unsigned int pci_bus = oidnGetPhysicalDeviceInt(i, "pciBus"); + unsigned int pci_device = oidnGetPhysicalDeviceInt(i, "pciDevice"); + string pci_id = string_printf("%04x:%02x:%02x", pci_domain, pci_bus, pci_device); + if (device.id.find(pci_id) != string::npos) { + return true; + } + } + } + } + + return false; } OIDNDenoiserGPU::OIDNDenoiserGPU(Device *path_trace_device, const DenoiseParams ¶ms) @@ -78,6 +110,9 @@ uint OIDNDenoiserGPU::get_device_type_mask() const uint device_mask = 0; # ifdef OIDN_DEVICE_SYCL device_mask |= DEVICE_MASK_ONEAPI; +# endif +# ifdef OIDN_DEVICE_HIP + device_mask |= DEVICE_MASK_HIP; # endif return device_mask; } @@ -122,15 +157,27 @@ bool OIDNDenoiserGPU::denoise_create_if_needed(DenoiseContext &context) 1); denoiser_queue_->init_execution(); break; +# endif +# if defined(OIDN_DEVICE_HIP) && defined(WITH_HIP) + case DEVICE_HIP: { + hipStream_t stream = nullptr; + oidn_device_ = oidnNewHIPDevice(&denoiser_device_->info.num, &stream, 1); + break; + } # endif default: break; } + if (!oidn_device_) { denoiser_device_->set_error("Failed to create OIDN device"); return false; } + if (denoiser_queue_) { + denoiser_queue_->init_execution(); + } + oidnCommitDevice(oidn_device_); oidn_filter_ = create_filter(); diff --git a/intern/cycles/integrator/path_trace_work_gpu.cpp b/intern/cycles/integrator/path_trace_work_gpu.cpp index 2d1bab41b06..41882b85b64 100644 --- a/intern/cycles/integrator/path_trace_work_gpu.cpp +++ b/intern/cycles/integrator/path_trace_work_gpu.cpp @@ -1055,6 +1055,7 @@ int PathTraceWorkGPU::adaptive_sampling_convergence_check_count_active(float thr queue_->zero_to_device(num_active_pixels); const int work_size = effective_buffer_params_.width * effective_buffer_params_.height; + const int reset_int = reset; /* No bool kernel arguments. */ DeviceKernelArguments args(&buffers_->buffer.device_pointer, &effective_buffer_params_.full_x, @@ -1062,7 +1063,7 @@ int PathTraceWorkGPU::adaptive_sampling_convergence_check_count_active(float thr &effective_buffer_params_.width, &effective_buffer_params_.height, &threshold, - &reset, + &reset_int, &effective_buffer_params_.offset, &effective_buffer_params_.stride, &num_active_pixels.device_pointer); diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt index 379da25826c..b0e7290c2cc 100644 --- a/intern/cycles/kernel/CMakeLists.txt +++ b/intern/cycles/kernel/CMakeLists.txt @@ -327,6 +327,7 @@ set(SRC_KERNEL_UTIL_HEADERS util/color.h util/differential.h util/lookup_table.h + util/nanovdb.h util/profiling.h ) @@ -483,8 +484,7 @@ if(WITH_CYCLES_CUDA_BINARIES) if(WITH_NANOVDB) set(cuda_flags ${cuda_flags} - -D WITH_NANOVDB - -I "${NANOVDB_INCLUDE_DIR}") + -D WITH_NANOVDB) endif() if(WITH_CYCLES_DEBUG) @@ -634,8 +634,7 @@ if(WITH_CYCLES_HIP_BINARIES AND WITH_CYCLES_DEVICE_HIP) if(WITH_NANOVDB) set(hip_flags ${hip_flags} - -D WITH_NANOVDB - -I "${NANOVDB_INCLUDE_DIR}") + -D WITH_NANOVDB) endif() if(WITH_CYCLES_DEBUG) @@ -755,8 +754,7 @@ if(WITH_CYCLES_DEVICE_OPTIX AND WITH_CYCLES_CUDA_BINARIES) if(WITH_NANOVDB) set(cuda_flags ${cuda_flags} - -D WITH_NANOVDB - -I "${NANOVDB_INCLUDE_DIR}") + -D WITH_NANOVDB) endif() if(WITH_CYCLES_OSL) set(cuda_flags ${cuda_flags} @@ -936,8 +934,7 @@ if(WITH_CYCLES_DEVICE_ONEAPI) if(WITH_NANOVDB) list(APPEND sycl_compiler_flags - -DWITH_NANOVDB - -I"${NANOVDB_INCLUDE_DIR}") + -DWITH_NANOVDB) endif() if(WITH_CYCLES_EMBREE AND EMBREE_SYCL_SUPPORT) @@ -1256,16 +1253,3 @@ delayed_install(${CMAKE_CURRENT_SOURCE_DIR} "${SRC_KERNEL_SVM_HEADERS}" ${CYCLES delayed_install(${CMAKE_CURRENT_SOURCE_DIR} "${SRC_KERNEL_TYPES_HEADERS}" ${CYCLES_INSTALL_PATH}/source/kernel) delayed_install(${CMAKE_CURRENT_SOURCE_DIR} "${SRC_KERNEL_UTIL_HEADERS}" ${CYCLES_INSTALL_PATH}/source/kernel/util) delayed_install(${CMAKE_CURRENT_SOURCE_DIR} "${SRC_UTIL_HEADERS}" ${CYCLES_INSTALL_PATH}/source/util) - -if(WITH_NANOVDB) - set(SRC_NANOVDB_HEADERS - nanovdb/NanoVDB.h - nanovdb/CNanoVDB.h - ) - set(SRC_NANOVDB_UTIL_HEADERS - nanovdb/util/CSampleFromVoxels.h - nanovdb/util/SampleFromVoxels.h - ) - delayed_install(${NANOVDB_INCLUDE_DIR} "${SRC_NANOVDB_HEADERS}" ${CYCLES_INSTALL_PATH}/source/nanovdb) - delayed_install(${NANOVDB_INCLUDE_DIR} "${SRC_NANOVDB_UTIL_HEADERS}" ${CYCLES_INSTALL_PATH}/source/nanovdb/util) -endif() diff --git a/intern/cycles/kernel/device/cpu/globals.h b/intern/cycles/kernel/device/cpu/globals.h index 90a274b2bcf..d0495883e27 100644 --- a/intern/cycles/kernel/device/cpu/globals.h +++ b/intern/cycles/kernel/device/cpu/globals.h @@ -49,6 +49,7 @@ typedef struct KernelGlobalsCPU { OSLGlobals *osl = nullptr; OSLShadingSystem *osl_ss = nullptr; OSLThreadData *osl_tdata = nullptr; + int osl_thread_index = 0; #endif #ifdef __PATH_GUIDING__ diff --git a/intern/cycles/kernel/device/cpu/image.h b/intern/cycles/kernel/device/cpu/image.h index 3e4542c7539..9ad3ff761d2 100644 --- a/intern/cycles/kernel/device/cpu/image.h +++ b/intern/cycles/kernel/device/cpu/image.h @@ -5,9 +5,7 @@ #pragma once #ifdef WITH_NANOVDB -# define NANOVDB_USE_INTRINSICS -# include -# include +# include "kernel/util/nanovdb.h" #endif CCL_NAMESPACE_BEGIN @@ -685,46 +683,59 @@ template struct TextureInterpolator { }; #ifdef WITH_NANOVDB -template struct NanoVDBInterpolator { - - typedef typename nanovdb::NanoGrid::AccessorType AccessorType; +template struct NanoVDBInterpolator { static ccl_always_inline float read(float r) { return r; } - static ccl_always_inline float4 read(nanovdb::Vec3f r) + static ccl_always_inline float4 read(const packed_float3 r) { - return make_float4(r[0], r[1], r[2], 1.0f); + return make_float4(r.x, r.y, r.z, 1.0f); } - static ccl_always_inline OutT interp_3d_closest(const AccessorType &acc, - float x, - float y, - float z) + template + static ccl_always_inline OutT interp_3d_closest(const Acc &acc, float x, float y, float z) { - const nanovdb::Vec3f xyz(x, y, z); - return read(nanovdb::SampleFromVoxels(acc)(xyz)); + const nanovdb::Coord coord((int32_t)floorf(x), (int32_t)floorf(y), (int32_t)floorf(z)); + return read(acc.getValue(coord)); } - static ccl_always_inline OutT interp_3d_linear(const AccessorType &acc, - float x, - float y, - float z) + template + static ccl_always_inline OutT interp_3d_linear(const Acc &acc, float x, float y, float z) { - const nanovdb::Vec3f xyz(x - 0.5f, y - 0.5f, z - 0.5f); - return read(nanovdb::SampleFromVoxels(acc)(xyz)); + int ix, iy, iz; + const float tx = frac(x - 0.5f, &ix); + const float ty = frac(y - 0.5f, &iy); + const float tz = frac(z - 0.5f, &iz); + + return mix(mix(mix(read(acc.getValue(nanovdb::Coord(ix, iy, iz))), + read(acc.getValue(nanovdb::Coord(ix, iy, iz + 1))), + tz), + mix(read(acc.getValue(nanovdb::Coord(ix, iy + 1, iz + 1))), + read(acc.getValue(nanovdb::Coord(ix, iy + 1, iz))), + 1.0f - tz), + ty), + mix(mix(read(acc.getValue(nanovdb::Coord(ix + 1, iy + 1, iz))), + read(acc.getValue(nanovdb::Coord(ix + 1, iy + 1, iz + 1))), + tz), + mix(read(acc.getValue(nanovdb::Coord(ix + 1, iy, iz + 1))), + read(acc.getValue(nanovdb::Coord(ix + 1, iy, iz))), + 1.0f - tz), + 1.0f - ty), + tx); } /* Tricubic b-spline interpolation. */ + template # if defined(__GNUC__) || defined(__clang__) static ccl_always_inline # else static ccl_never_inline # endif OutT - interp_3d_cubic(const AccessorType &acc, float x, float y, float z) + interp_3d_cubic(const Acc &acc, float x, float y, float z) { int ix, iy, iz; int nix, niy, niz; @@ -779,15 +790,20 @@ template struct NanoVDBInterpolator { using namespace nanovdb; NanoGrid *const grid = (NanoGrid *)info.data; - AccessorType acc = grid->getAccessor(); switch ((interp == INTERPOLATION_NONE) ? info.interpolation : interp) { - case INTERPOLATION_CLOSEST: + case INTERPOLATION_CLOSEST: { + ReadAccessor acc(grid->tree().root()); return interp_3d_closest(acc, x, y, z); - case INTERPOLATION_LINEAR: + } + case INTERPOLATION_LINEAR: { + CachedReadAccessor acc(grid->tree().root()); return interp_3d_linear(acc, x, y, z); - default: + } + default: { + CachedReadAccessor acc(grid->tree().root()); return interp_3d_cubic(acc, x, y, z); + } } } }; @@ -880,7 +896,7 @@ ccl_device float4 kernel_tex_image_interp_3d(KernelGlobals kg, return make_float4(f, f, f, 1.0f); } case IMAGE_DATA_TYPE_NANOVDB_FLOAT3: - return NanoVDBInterpolator::interp_3d(info, P.x, P.y, P.z, interp); + return NanoVDBInterpolator::interp_3d(info, P.x, P.y, P.z, interp); case IMAGE_DATA_TYPE_NANOVDB_FPN: { const float f = NanoVDBInterpolator::interp_3d( info, P.x, P.y, P.z, interp); diff --git a/intern/cycles/kernel/device/cpu/kernel_arch.h b/intern/cycles/kernel/device/cpu/kernel_arch.h index 4e0187f5cba..e3759327f5d 100644 --- a/intern/cycles/kernel/device/cpu/kernel_arch.h +++ b/intern/cycles/kernel/device/cpu/kernel_arch.h @@ -101,7 +101,7 @@ bool KERNEL_FUNCTION_FULL_NAME(adaptive_sampling_convergence_check)( int x, int y, float threshold, - bool reset, + int reset, int offset, int stride); diff --git a/intern/cycles/kernel/device/cpu/kernel_arch_impl.h b/intern/cycles/kernel/device/cpu/kernel_arch_impl.h index d7dd9f8f097..b10b7d2b2ac 100644 --- a/intern/cycles/kernel/device/cpu/kernel_arch_impl.h +++ b/intern/cycles/kernel/device/cpu/kernel_arch_impl.h @@ -164,7 +164,7 @@ bool KERNEL_FUNCTION_FULL_NAME(adaptive_sampling_convergence_check)( int x, int y, float threshold, - bool reset, + int reset, int offset, int stride) { diff --git a/intern/cycles/kernel/device/cuda/compat.h b/intern/cycles/kernel/device/cuda/compat.h index 6e9ee5e99ad..16ea936b8ce 100644 --- a/intern/cycles/kernel/device/cuda/compat.h +++ b/intern/cycles/kernel/device/cuda/compat.h @@ -45,6 +45,7 @@ typedef unsigned long long uint64_t; #define ccl_global #define ccl_inline_constant __constant__ #define ccl_device_constant __constant__ __device__ +#define ccl_static_constexpr static constexpr #define ccl_constant const #define ccl_gpu_shared __shared__ #define ccl_private diff --git a/intern/cycles/kernel/device/gpu/image.h b/intern/cycles/kernel/device/gpu/image.h index 4e0cb7ffd8b..0101bf4e67a 100644 --- a/intern/cycles/kernel/device/gpu/image.h +++ b/intern/cycles/kernel/device/gpu/image.h @@ -8,12 +8,17 @@ CCL_NAMESPACE_BEGIN #if !defined __KERNEL_METAL__ # ifdef WITH_NANOVDB -# define NDEBUG /* Disable "assert" in device code */ -# define NANOVDB_USE_INTRINSICS -# include "nanovdb/NanoVDB.h" -# include "nanovdb/util/SampleFromVoxels.h" +# include "kernel/util/nanovdb.h" # endif #endif + +ccl_device_inline float frac(float x, ccl_private int *ix) +{ + int i = float_to_int(x) - ((x < 0.0f) ? 1 : 0); + *ix = i; + return x - (float)i; +} + /* w0, w1, w2, and w3 are the four cubic B-spline basis functions. */ ccl_device float cubic_w0(float a) { @@ -126,63 +131,121 @@ kernel_tex_image_interp_tricubic(ccl_global const TextureInfo &info, float x, fl } #ifdef WITH_NANOVDB -template -ccl_device typename nanovdb::NanoGrid::ValueType kernel_tex_image_interp_tricubic_nanovdb( - ccl_private S &s, float x, float y, float z) +template +ccl_device OutT +kernel_tex_image_interp_trilinear_nanovdb(ccl_private Acc &acc, float x, float y, float z) { - float px = floorf(x); - float py = floorf(y); - float pz = floorf(z); - float fx = x - px; - float fy = y - py; - float fz = z - pz; + int ix, iy, iz; + const float tx = frac(x - 0.5f, &ix); + const float ty = frac(y - 0.5f, &iy); + const float tz = frac(z - 0.5f, &iz); - float g0x = cubic_g0(fx); - float g1x = cubic_g1(fx); - float g0y = cubic_g0(fy); - float g1y = cubic_g1(fy); - float g0z = cubic_g0(fz); - float g1z = cubic_g1(fz); + return mix(mix(mix(OutT(acc.getValue(nanovdb::Coord(ix, iy, iz))), + OutT(acc.getValue(nanovdb::Coord(ix, iy, iz + 1))), + tz), + mix(OutT(acc.getValue(nanovdb::Coord(ix, iy + 1, iz + 1))), + OutT(acc.getValue(nanovdb::Coord(ix, iy + 1, iz))), + 1.0f - tz), + ty), + mix(mix(OutT(acc.getValue(nanovdb::Coord(ix + 1, iy + 1, iz))), + OutT(acc.getValue(nanovdb::Coord(ix + 1, iy + 1, iz + 1))), + tz), + mix(OutT(acc.getValue(nanovdb::Coord(ix + 1, iy, iz + 1))), + OutT(acc.getValue(nanovdb::Coord(ix + 1, iy, iz))), + 1.0f - tz), + 1.0f - ty), + tx); +} - float x0 = px + cubic_h0(fx); - float x1 = px + cubic_h1(fx); - float y0 = py + cubic_h0(fy); - float y1 = py + cubic_h1(fy); - float z0 = pz + cubic_h0(fz); - float z1 = pz + cubic_h1(fz); +template +ccl_device OutT +kernel_tex_image_interp_tricubic_nanovdb(ccl_private Acc &acc, float x, float y, float z) +{ + int ix, iy, iz; + int nix, niy, niz; + int pix, piy, piz; + int nnix, nniy, nniz; - using namespace nanovdb; + /* A -0.5 offset is used to center the cubic samples around the sample point. */ + const float tx = frac(x - 0.5f, &ix); + const float ty = frac(y - 0.5f, &iy); + const float tz = frac(z - 0.5f, &iz); - return g0z * (g0y * (g0x * s(Vec3f(x0, y0, z0)) + g1x * s(Vec3f(x1, y0, z0))) + - g1y * (g0x * s(Vec3f(x0, y1, z0)) + g1x * s(Vec3f(x1, y1, z0)))) + - g1z * (g0y * (g0x * s(Vec3f(x0, y0, z1)) + g1x * s(Vec3f(x1, y0, z1))) + - g1y * (g0x * s(Vec3f(x0, y1, z1)) + g1x * s(Vec3f(x1, y1, z1)))); + pix = ix - 1; + piy = iy - 1; + piz = iz - 1; + nix = ix + 1; + niy = iy + 1; + niz = iz + 1; + nnix = ix + 2; + nniy = iy + 2; + nniz = iz + 2; + + const int xc[4] = {pix, ix, nix, nnix}; + const int yc[4] = {piy, iy, niy, nniy}; + const int zc[4] = {piz, iz, niz, nniz}; + float u[4], v[4], w[4]; + + /* Some helper macros to keep code size reasonable. + * Lets the compiler inline all the matrix multiplications. + */ +# define SET_CUBIC_SPLINE_WEIGHTS(u, t) \ + { \ + u[0] = (((-1.0f / 6.0f) * t + 0.5f) * t - 0.5f) * t + (1.0f / 6.0f); \ + u[1] = ((0.5f * t - 1.0f) * t) * t + (2.0f / 3.0f); \ + u[2] = ((-0.5f * t + 0.5f) * t + 0.5f) * t + (1.0f / 6.0f); \ + u[3] = (1.0f / 6.0f) * t * t * t; \ + } \ + (void)0 + +# define DATA(x, y, z) (OutT(acc.getValue(nanovdb::Coord(xc[x], yc[y], zc[z])))) +# define COL_TERM(col, row) \ + (v[col] * (u[0] * DATA(0, col, row) + u[1] * DATA(1, col, row) + u[2] * DATA(2, col, row) + \ + u[3] * DATA(3, col, row))) +# define ROW_TERM(row) \ + (w[row] * (COL_TERM(0, row) + COL_TERM(1, row) + COL_TERM(2, row) + COL_TERM(3, row))) + + SET_CUBIC_SPLINE_WEIGHTS(u, tx); + SET_CUBIC_SPLINE_WEIGHTS(v, ty); + SET_CUBIC_SPLINE_WEIGHTS(w, tz); + + /* Actual interpolation. */ + return ROW_TERM(0) + ROW_TERM(1) + ROW_TERM(2) + ROW_TERM(3); + +# undef COL_TERM +# undef ROW_TERM +# undef DATA +# undef SET_CUBIC_SPLINE_WEIGHTS } # if defined(__KERNEL_METAL__) -template -__attribute__((noinline)) typename nanovdb::NanoGrid::ValueType kernel_tex_image_interp_nanovdb( +template +__attribute__((noinline)) OutT kernel_tex_image_interp_nanovdb( ccl_global const TextureInfo &info, float x, float y, float z, uint interpolation) # else -template -ccl_device_noinline typename nanovdb::NanoGrid::ValueType kernel_tex_image_interp_nanovdb( +template +ccl_device_noinline OutT kernel_tex_image_interp_nanovdb( ccl_global const TextureInfo &info, float x, float y, float z, uint interpolation) # endif { using namespace nanovdb; ccl_global NanoGrid *const grid = (ccl_global NanoGrid *)info.data; - typedef typename nanovdb::NanoGrid::AccessorType AccessorType; - AccessorType acc = grid->getAccessor(); switch (interpolation) { - case INTERPOLATION_CLOSEST: - return SampleFromVoxels(acc)(Vec3f(x, y, z)); - case INTERPOLATION_LINEAR: - return SampleFromVoxels(acc)(Vec3f(x - 0.5f, y - 0.5f, z - 0.5f)); - default: - SampleFromVoxels s(acc); - return kernel_tex_image_interp_tricubic_nanovdb(s, x - 0.5f, y - 0.5f, z - 0.5f); + case INTERPOLATION_CLOSEST: { + ReadAccessor acc(grid->tree().root()); + const nanovdb::Coord coord((int32_t)floorf(x), (int32_t)floorf(y), (int32_t)floorf(z)); + return OutT(acc.getValue(coord)); + } + case INTERPOLATION_LINEAR: { + CachedReadAccessor acc(grid->tree().root()); + return kernel_tex_image_interp_trilinear_nanovdb(acc, x, y, z); + } + default: { + CachedReadAccessor acc(grid->tree().root()); + return kernel_tex_image_interp_tricubic_nanovdb(acc, x, y, z); + } } } #endif @@ -240,20 +303,20 @@ ccl_device float4 kernel_tex_image_interp_3d(KernelGlobals kg, #ifdef WITH_NANOVDB if (texture_type == IMAGE_DATA_TYPE_NANOVDB_FLOAT) { - float f = kernel_tex_image_interp_nanovdb(info, x, y, z, interpolation); + float f = kernel_tex_image_interp_nanovdb(info, x, y, z, interpolation); return make_float4(f, f, f, 1.0f); } if (texture_type == IMAGE_DATA_TYPE_NANOVDB_FLOAT3) { - nanovdb::Vec3f f = kernel_tex_image_interp_nanovdb( + float3 f = kernel_tex_image_interp_nanovdb( info, x, y, z, interpolation); - return make_float4(f[0], f[1], f[2], 1.0f); + return make_float4(f.x, f.y, f.z, 1.0f); } if (texture_type == IMAGE_DATA_TYPE_NANOVDB_FPN) { - float f = kernel_tex_image_interp_nanovdb(info, x, y, z, interpolation); + float f = kernel_tex_image_interp_nanovdb(info, x, y, z, interpolation); return make_float4(f, f, f, 1.0f); } if (texture_type == IMAGE_DATA_TYPE_NANOVDB_FP16) { - float f = kernel_tex_image_interp_nanovdb(info, x, y, z, interpolation); + float f = kernel_tex_image_interp_nanovdb(info, x, y, z, interpolation); return make_float4(f, f, f, 1.0f); } #endif diff --git a/intern/cycles/kernel/device/gpu/kernel.h b/intern/cycles/kernel/device/gpu/kernel.h index b82c0d0a9fc..a16a3631b1e 100644 --- a/intern/cycles/kernel/device/gpu/kernel.h +++ b/intern/cycles/kernel/device/gpu/kernel.h @@ -668,7 +668,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS) int sw, int sh, float threshold, - bool reset, + int reset, int offset, int stride, ccl_global uint *num_active_pixels) @@ -1104,7 +1104,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS) int pass_denoised, int pass_sample_count, int num_components, - bool use_compositing) + int use_compositing) { const int work_index = ccl_gpu_global_id_x(); const int y = work_index / width; diff --git a/intern/cycles/kernel/device/hip/compat.h b/intern/cycles/kernel/device/hip/compat.h index aa23fd80929..2ec740c7078 100644 --- a/intern/cycles/kernel/device/hip/compat.h +++ b/intern/cycles/kernel/device/hip/compat.h @@ -38,6 +38,7 @@ typedef unsigned long long uint64_t; #define ccl_global #define ccl_inline_constant __constant__ #define ccl_device_constant __constant__ __device__ +#define ccl_static_constexpr static constexpr #define ccl_constant const #define ccl_gpu_shared __shared__ #define ccl_private diff --git a/intern/cycles/kernel/device/metal/compat.h b/intern/cycles/kernel/device/metal/compat.h index 21741b0b7c0..4d3c535b0d7 100644 --- a/intern/cycles/kernel/device/metal/compat.h +++ b/intern/cycles/kernel/device/metal/compat.h @@ -47,6 +47,7 @@ using namespace metal::raytracing; #define ccl_global device #define ccl_inline_constant static constant constexpr #define ccl_device_constant constant +#define ccl_static_constexpr static constant constexpr #define ccl_constant constant #define ccl_gpu_shared threadgroup #define ccl_private thread diff --git a/intern/cycles/kernel/device/metal/context_begin.h b/intern/cycles/kernel/device/metal/context_begin.h index 262cd9122d9..024dea6be35 100644 --- a/intern/cycles/kernel/device/metal/context_begin.h +++ b/intern/cycles/kernel/device/metal/context_begin.h @@ -5,10 +5,7 @@ // clang-format off #ifdef WITH_NANOVDB -# define NDEBUG /* Disable "assert" in device code */ -# define NANOVDB_USE_INTRINSICS -# include "nanovdb/NanoVDB.h" -# include "nanovdb/util/SampleFromVoxels.h" +# include "kernel/util/nanovdb.h" #endif /* Open the Metal kernel context class diff --git a/intern/cycles/kernel/device/oneapi/compat.h b/intern/cycles/kernel/device/oneapi/compat.h index 7c7f4f7e29f..f16a53f846b 100644 --- a/intern/cycles/kernel/device/oneapi/compat.h +++ b/intern/cycles/kernel/device/oneapi/compat.h @@ -40,7 +40,8 @@ #define ccl_device_inline inline #define ccl_noinline __attribute__((noinline)) #define ccl_inline_constant const constexpr -#define ccl_static_constant const +#define ccl_device_constant static constexpr +#define ccl_static_constexpr static constexpr #define ccl_device_forceinline __attribute__((always_inline)) #define ccl_device_noinline ccl_device ccl_noinline #define ccl_device_noinline_cpu ccl_device diff --git a/intern/cycles/kernel/device/oneapi/context_begin.h b/intern/cycles/kernel/device/oneapi/context_begin.h index ca9d6b53c01..a332b90a18d 100644 --- a/intern/cycles/kernel/device/oneapi/context_begin.h +++ b/intern/cycles/kernel/device/oneapi/context_begin.h @@ -34,8 +34,7 @@ typedef struct ccl_vdb_double_t { } ccl_vdb_double_t; # define double ccl_vdb_double_t -# include -# include +# include "kernel/util/nanovdb.h" # undef double #endif diff --git a/intern/cycles/kernel/device/oneapi/image.h b/intern/cycles/kernel/device/oneapi/image.h index 84a17745774..a50b4cad414 100644 --- a/intern/cycles/kernel/device/oneapi/image.h +++ b/intern/cycles/kernel/device/oneapi/image.h @@ -202,48 +202,64 @@ ccl_device float4 kernel_tex_image_interp(KernelGlobals, int id, float x, float } #ifdef WITH_NANOVDB -template struct NanoVDBInterpolator { +template struct NanoVDBInterpolator { - typedef typename nanovdb::NanoGrid::AccessorType AccessorType; - - static ccl_always_inline float4 read(float r) + static ccl_always_inline float read(float r) { - return make_float4(r, r, r, 1.0f); + return r; } - static ccl_always_inline float4 read(nanovdb::Vec3f r) + static ccl_always_inline float4 read(const packed_float3 r) { - return make_float4(r[0], r[1], r[2], 1.0f); + return make_float4(r.x, r.y, r.z, 1.0f); } - static ccl_always_inline float4 interp_3d_closest(const AccessorType &acc, - float x, - float y, - float z) + template + static ccl_always_inline OutT interp_3d_closest(const Acc &acc, float x, float y, float z) { - const nanovdb::Vec3f xyz(x, y, z); - return read(nanovdb::SampleFromVoxels(acc)(xyz)); + const nanovdb::Coord coord(int32_t(rintf(x)), int32_t(rintf(y)), int32_t(rintf(z))); + return read(acc.getValue(coord)); } - static ccl_always_inline float4 interp_3d_linear(const AccessorType &acc, - float x, - float y, - float z) + template + static ccl_always_inline OutT interp_3d_linear(const Acc &acc, float x, float y, float z) { - const nanovdb::Vec3f xyz(x - 0.5f, y - 0.5f, z - 0.5f); - return read(nanovdb::SampleFromVoxels(acc)(xyz)); + int ix, iy, iz; + const float tx = svm_image_texture_frac(x - 0.5f, &ix); + const float ty = svm_image_texture_frac(y - 0.5f, &iy); + const float tz = svm_image_texture_frac(z - 0.5f, &iz); + + return mix(mix(mix(read(acc.getValue(nanovdb::Coord(ix, iy, iz))), + read(acc.getValue(nanovdb::Coord(ix, iy, iz + 1))), + tz), + mix(read(acc.getValue(nanovdb::Coord(ix, iy + 1, iz + 1))), + read(acc.getValue(nanovdb::Coord(ix, iy + 1, iz))), + 1.0f - tz), + ty), + mix(mix(read(acc.getValue(nanovdb::Coord(ix + 1, iy + 1, iz))), + read(acc.getValue(nanovdb::Coord(ix + 1, iy + 1, iz + 1))), + tz), + mix(read(acc.getValue(nanovdb::Coord(ix + 1, iy, iz + 1))), + read(acc.getValue(nanovdb::Coord(ix + 1, iy, iz))), + 1.0f - tz), + 1.0f - ty), + tx); } - static float4 interp_3d_cubic(const AccessorType &acc, float x, float y, float z) + /* Tricubic b-spline interpolation. */ + template + static ccl_always_inline OutT interp_3d_cubic(const Acc &acc, float x, float y, float z) { int ix, iy, iz; int nix, niy, niz; int pix, piy, piz; int nnix, nniy, nniz; - /* Tri-cubic b-spline interpolation. */ + + /* A -0.5 offset is used to center the cubic samples around the sample point. */ const float tx = svm_image_texture_frac(x - 0.5f, &ix); const float ty = svm_image_texture_frac(y - 0.5f, &iy); const float tz = svm_image_texture_frac(z - 0.5f, &iz); + pix = ix - 1; piy = iy - 1; piz = iz - 1; @@ -259,8 +275,8 @@ template struct NanoVDBInterpolator { const int zc[4] = {piz, iz, niz, nniz}; float u[4], v[4], w[4]; - /* Some helper macro to keep code reasonable size, - * let compiler to inline all the matrix multiplications. + /* Some helper macros to keep code size reasonable. + * Lets the compiler inline all the matrix multiplications. */ # define DATA(x, y, z) (read(acc.getValue(nanovdb::Coord(xc[x], yc[y], zc[z])))) # define COL_TERM(col, row) \ @@ -281,21 +297,26 @@ template struct NanoVDBInterpolator { # undef DATA } - static ccl_always_inline float4 + static ccl_always_inline OutT interp_3d(const TextureInfo &info, float x, float y, float z, int interp) { using namespace nanovdb; - NanoGrid *const grid = (NanoGrid *)info.data; - AccessorType acc = grid->getAccessor(); + NanoGrid *const grid = (NanoGrid *)info.data; - switch ((interp == INTERPOLATION_NONE) ? info.interpolation : interp) { - case INTERPOLATION_CLOSEST: + switch (interp) { + case INTERPOLATION_CLOSEST: { + ReadAccessor acc(grid->tree().root()); return interp_3d_closest(acc, x, y, z); - case INTERPOLATION_LINEAR: + } + case INTERPOLATION_LINEAR: { + CachedReadAccessor acc(grid->tree().root()); return interp_3d_linear(acc, x, y, z); - default: + } + default: { + CachedReadAccessor acc(grid->tree().root()); return interp_3d_cubic(acc, x, y, z); + } } } }; @@ -318,16 +339,21 @@ ccl_device float4 kernel_tex_image_interp_3d(KernelGlobals, int id, float3 P, in #ifdef WITH_NANOVDB if (info.data_type == IMAGE_DATA_TYPE_NANOVDB_FLOAT) { - return NanoVDBInterpolator::interp_3d(info, x, y, z, interpolation); + const float f = NanoVDBInterpolator::interp_3d(info, x, y, z, interpolation); + return make_float4(f, f, f, 1.0f); } else if (info.data_type == IMAGE_DATA_TYPE_NANOVDB_FLOAT3) { - return NanoVDBInterpolator::interp_3d(info, x, y, z, interpolation); + return NanoVDBInterpolator::interp_3d(info, x, y, z, interpolation); } else if (info.data_type == IMAGE_DATA_TYPE_NANOVDB_FPN) { - return NanoVDBInterpolator::interp_3d(info, x, y, z, interpolation); + const float f = NanoVDBInterpolator::interp_3d( + info, x, y, z, interpolation); + return make_float4(f, f, f, 1.0f); } else if (info.data_type == IMAGE_DATA_TYPE_NANOVDB_FP16) { - return NanoVDBInterpolator::interp_3d(info, x, y, z, interpolation); + const float f = NanoVDBInterpolator::interp_3d( + info, x, y, z, interpolation); + return make_float4(f, f, f, 1.0f); } #else if (info.data_type == IMAGE_DATA_TYPE_NANOVDB_FLOAT || diff --git a/intern/cycles/kernel/device/optix/compat.h b/intern/cycles/kernel/device/optix/compat.h index 9322f1a016d..7a2c0dcdd3b 100644 --- a/intern/cycles/kernel/device/optix/compat.h +++ b/intern/cycles/kernel/device/optix/compat.h @@ -45,6 +45,7 @@ typedef unsigned long long uint64_t; #define ccl_global #define ccl_inline_constant static __constant__ #define ccl_device_constant __constant__ __device__ +#define ccl_static_constexpr static constexpr #define ccl_constant const #define ccl_gpu_shared __shared__ #define ccl_private diff --git a/intern/cycles/kernel/film/adaptive_sampling.h b/intern/cycles/kernel/film/adaptive_sampling.h index 0820a10767e..e717bac9326 100644 --- a/intern/cycles/kernel/film/adaptive_sampling.h +++ b/intern/cycles/kernel/film/adaptive_sampling.h @@ -34,7 +34,7 @@ ccl_device bool film_adaptive_sampling_convergence_check(KernelGlobals kg, int x, int y, float threshold, - bool reset, + int reset, int offset, int stride) { diff --git a/intern/cycles/kernel/osl/CMakeLists.txt b/intern/cycles/kernel/osl/CMakeLists.txt index e0231796c90..653ed660dc7 100644 --- a/intern/cycles/kernel/osl/CMakeLists.txt +++ b/intern/cycles/kernel/osl/CMakeLists.txt @@ -36,9 +36,6 @@ set(LIB ${LLVM_LIBRARY} ) -# OSL and LLVM are built without RTTI -string(APPEND CMAKE_CXX_FLAGS " ${RTTI_DISABLE_FLAGS}") - if(APPLE) # Disable allocation warning on macOS prior to 10.14: the OSLRenderServices # contains member which is 64 bytes aligned (cache inside of OIIO's diff --git a/intern/cycles/kernel/osl/closures.cpp b/intern/cycles/kernel/osl/closures.cpp index 808e13f48d6..4a5906873af 100644 --- a/intern/cycles/kernel/osl/closures.cpp +++ b/intern/cycles/kernel/osl/closures.cpp @@ -110,7 +110,17 @@ void osl_eval_nodes(const KernelGlobalsCPU *kg, if (sd->object == OBJECT_NONE && sd->lamp == LAMP_NONE) { /* background */ if (kg->osl->background_state) { +#if OSL_LIBRARY_VERSION_CODE >= 11304 + ss->execute(*octx, + *(kg->osl->background_state), + kg->osl_thread_index, + 0, + *globals, + nullptr, + nullptr); +#else ss->execute(octx, *(kg->osl->background_state), *globals); +#endif } } else { @@ -150,8 +160,18 @@ void osl_eval_nodes(const KernelGlobalsCPU *kg, globals->dPdy = TO_VEC3(tmp_dP.dy); } - /* execute bump shader */ +/* execute bump shader */ +#if OSL_LIBRARY_VERSION_CODE >= 11304 + ss->execute(*octx, + *(kg->osl->bump_state[shader]), + kg->osl_thread_index, + 0, + *globals, + nullptr, + nullptr); +#else ss->execute(octx, *(kg->osl->bump_state[shader]), *globals); +#endif /* reset state */ sd->P = P; @@ -164,7 +184,17 @@ void osl_eval_nodes(const KernelGlobalsCPU *kg, /* surface shader */ if (kg->osl->surface_state[shader]) { +#if OSL_LIBRARY_VERSION_CODE >= 11304 + ss->execute(*octx, + *(kg->osl->surface_state[shader]), + kg->osl_thread_index, + 0, + *globals, + nullptr, + nullptr); +#else ss->execute(octx, *(kg->osl->surface_state[shader]), *globals); +#endif } } @@ -208,7 +238,17 @@ void osl_eval_nodes(const KernelGlobalsCPU *kg, int shader = sd->shader & SHADER_MASK; if (kg->osl->volume_state[shader]) { +#if OSL_LIBRARY_VERSION_CODE >= 11304 + ss->execute(*octx, + *(kg->osl->volume_state[shader]), + kg->osl_thread_index, + 0, + *globals, + nullptr, + nullptr); +#else ss->execute(octx, *(kg->osl->volume_state[shader]), *globals); +#endif } /* flatten closure tree */ @@ -245,7 +285,17 @@ void osl_eval_nodes(const KernelGlobalsCPU *kg, int shader = sd->shader & SHADER_MASK; if (kg->osl->displacement_state[shader]) { +#if OSL_LIBRARY_VERSION_CODE >= 11304 + ss->execute(*octx, + *(kg->osl->displacement_state[shader]), + kg->osl_thread_index, + 0, + *globals, + nullptr, + nullptr); +#else ss->execute(octx, *(kg->osl->displacement_state[shader]), *globals); +#endif } /* get back position */ diff --git a/intern/cycles/kernel/osl/globals.cpp b/intern/cycles/kernel/osl/globals.cpp index c4f055af7f7..573ddb6f362 100644 --- a/intern/cycles/kernel/osl/globals.cpp +++ b/intern/cycles/kernel/osl/globals.cpp @@ -14,7 +14,7 @@ CCL_NAMESPACE_BEGIN -void OSLGlobals::thread_init(KernelGlobalsCPU *kg, OSLGlobals *osl_globals) +void OSLGlobals::thread_init(KernelGlobalsCPU *kg, OSLGlobals *osl_globals, const int thread_index) { /* no osl used? */ if (!osl_globals->use) { @@ -37,6 +37,7 @@ void OSLGlobals::thread_init(KernelGlobalsCPU *kg, OSLGlobals *osl_globals) kg->osl_ss = (OSLShadingSystem *)ss; kg->osl_tdata = tdata; + kg->osl_thread_index = thread_index; } void OSLGlobals::thread_free(KernelGlobalsCPU *kg) diff --git a/intern/cycles/kernel/osl/globals.h b/intern/cycles/kernel/osl/globals.h index 9656ef08306..cf24c62613b 100644 --- a/intern/cycles/kernel/osl/globals.h +++ b/intern/cycles/kernel/osl/globals.h @@ -45,7 +45,9 @@ struct OSLGlobals { } /* per thread data */ - static void thread_init(struct KernelGlobalsCPU *kg, OSLGlobals *osl_globals); + static void thread_init(struct KernelGlobalsCPU *kg, + OSLGlobals *osl_globals, + const int thread_init); static void thread_free(struct KernelGlobalsCPU *kg); bool use; diff --git a/intern/cycles/kernel/osl/osl.h b/intern/cycles/kernel/osl/osl.h index 347b635632a..3238eb5096b 100644 --- a/intern/cycles/kernel/osl/osl.h +++ b/intern/cycles/kernel/osl/osl.h @@ -52,6 +52,11 @@ ccl_device_inline void shaderdata_to_shaderglobals(KernelGlobals kg, /* shader data to be used in services callbacks */ globals->renderstate = sd; +#if OSL_LIBRARY_VERSION_CODE >= 11304 + globals->shadingStateUniform = nullptr; + globals->thread_index = 0; + globals->shade_index = 0; +#endif /* hacky, we leave it to services to fetch actual object matrix */ globals->shader2common = sd; diff --git a/intern/cycles/kernel/osl/services.cpp b/intern/cycles/kernel/osl/services.cpp index 02dc1cd1aec..93595b0a458 100644 --- a/intern/cycles/kernel/osl/services.cpp +++ b/intern/cycles/kernel/osl/services.cpp @@ -1165,7 +1165,18 @@ bool OSLRenderServices::get_userdata( return false; /* disabled by lockgeom */ } -#if OSL_LIBRARY_VERSION_CODE >= 11100 +#if OSL_LIBRARY_VERSION_CODE >= 11304 +TextureSystem::TextureHandle *OSLRenderServices::get_texture_handle(OSLUStringHash filename, + OSL::ShadingContext *context, + const TextureOpt *opt) +{ + return get_texture_handle(to_ustring(filename), context, opt); +} + +TextureSystem::TextureHandle *OSLRenderServices::get_texture_handle(OSL::ustring filename, + OSL::ShadingContext *, + const TextureOpt *) +#elif OSL_LIBRARY_VERSION_CODE >= 11100 TextureSystem::TextureHandle *OSLRenderServices::get_texture_handle(OSLUStringHash filename, OSL::ShadingContext *) #else @@ -1616,7 +1627,17 @@ bool OSLRenderServices::environment(OSLUStringHash filename, return status; } -#if OSL_LIBRARY_VERSION_CODE >= 11100 +#if OSL_LIBRARY_VERSION_CODE >= 11304 +bool OSLRenderServices::get_texture_info(OSLUStringHash filename, + TextureHandle *texture_handle, + TexturePerthread *texture_thread_info, + OSL::ShaderGlobals *, + int subimage, + OSLUStringHash dataname, + TypeDesc datatype, + void *data, + OSLUStringHash *) +#elif OSL_LIBRARY_VERSION_CODE >= 11100 bool OSLRenderServices::get_texture_info(OSLUStringHash filename, TextureHandle *texture_handle, TexturePerthread *texture_thread_info, @@ -1627,7 +1648,7 @@ bool OSLRenderServices::get_texture_info(OSLUStringHash filename, void *data, OSLUStringHash *) #else -bool OSLRenderServices::get_texture_info(OSL::ShaderGlobals *sg, +bool OSLRenderServices::get_texture_info(OSL::ShaderGlobals *, OSLUStringHash filename, TextureHandle *texture_handle, int subimage, diff --git a/intern/cycles/kernel/osl/services.h b/intern/cycles/kernel/osl/services.h index b674fa7c7a7..62d8a4c5416 100644 --- a/intern/cycles/kernel/osl/services.h +++ b/intern/cycles/kernel/osl/services.h @@ -189,7 +189,14 @@ class OSLRenderServices : public OSL::RendererServices { void *val, bool derivatives) override; -#if OSL_LIBRARY_VERSION_CODE >= 11100 +#if OSL_LIBRARY_VERSION_CODE >= 11304 + TextureSystem::TextureHandle *get_texture_handle(OSL::ustring filename, + OSL::ShadingContext *context, + const TextureOpt *options) override; + TextureSystem::TextureHandle *get_texture_handle(OSLUStringHash filename, + OSL::ShadingContext *context, + const TextureOpt *options) override; +#elif OSL_LIBRARY_VERSION_CODE >= 11100 TextureSystem::TextureHandle *get_texture_handle(OSLUStringHash filename, OSL::ShadingContext *context) override; #else @@ -245,7 +252,17 @@ class OSLRenderServices : public OSL::RendererServices { float *dresultdt, OSLUStringHash *errormessage) override; -#if OSL_LIBRARY_VERSION_CODE >= 11100 +#if OSL_LIBRARY_VERSION_CODE >= 11304 + bool get_texture_info(OSLUStringHash filename, + TextureHandle *texture_handle, + TexturePerthread *texture_thread_info, + OSL::ShaderGlobals *sg, + int subimage, + OSLUStringHash dataname, + TypeDesc datatype, + void *data, + OSLUStringHash *errormessage) override; +#elif OSL_LIBRARY_VERSION_CODE >= 11100 bool get_texture_info(OSLUStringHash filename, TextureHandle *texture_handle, TexturePerthread *texture_thread_info, diff --git a/intern/cycles/kernel/osl/types.h b/intern/cycles/kernel/osl/types.h index 71c808ff91b..8cb5779961a 100644 --- a/intern/cycles/kernel/osl/types.h +++ b/intern/cycles/kernel/osl/types.h @@ -86,8 +86,10 @@ struct ShaderGlobals { ccl_private void *tracedata; ccl_private void *objdata; void *context; -#if OSL_LIBRARY_VERSION_CODE >= 11302 +#if OSL_LIBRARY_VERSION_CODE >= 11304 void *shadingStateUniform; + int thread_index; + int shade_index; #endif void *renderer; ccl_private void *object2common; diff --git a/intern/cycles/kernel/util/nanovdb.h b/intern/cycles/kernel/util/nanovdb.h new file mode 100644 index 00000000000..6073eb1266e --- /dev/null +++ b/intern/cycles/kernel/util/nanovdb.h @@ -0,0 +1,441 @@ +/* SPDX-FileCopyrightText: 2020-2021 Contributors to the OpenVDB Project + * + * SPDX-License-Identifier: MPL-2.0 + * + * This is an extract from NanoVDB.h, with minimal code needed for kernel side access to grids. The + * original headers are not compatible with Metal due to missing address space qualifiers. */ + +#pragma once + +CCL_NAMESPACE_BEGIN + +#define NANOVDB_USE_SINGLE_ROOT_KEY +#define NANOVDB_DATA_ALIGNMENT 32 + +namespace nanovdb { + +/* Utilities */ + +template +ccl_device ccl_global const DstT *PtrAdd(ccl_global const SrcT *p, int64_t offset) +{ + return reinterpret_cast(reinterpret_cast(p) + + offset); +} + +/* Coord */ + +struct Coord { + int x, y, z; + + ccl_device_inline_method explicit Coord(int32_t n) : x(n), y(n), z(n) {} + ccl_device_inline_method Coord(int32_t x, int32_t y, int32_t z) : x(x), y(y), z(z) {} + + ccl_device_inline_method Coord operator&(int32_t n) const + { + return Coord(x & n, y & n, z & n); + } +}; + +/* Mask */ + +template struct Mask { + ccl_static_constexpr uint32_t SIZE = 1U << (3 * LOG2DIM); + ccl_static_constexpr uint32_t WORD_COUNT = SIZE >> 6; + uint64_t mWords[WORD_COUNT]; + + ccl_device_inline_method bool isOff(uint32_t n) const ccl_global + { + return 0 == (mWords[n >> 6] & (uint64_t(1) << (n & 63))); + } +}; + +/* Grid */ + +template struct alignas(NANOVDB_DATA_ALIGNMENT) Grid { + ccl_static_constexpr int MaxNameSize = 256; + uint64_t mMagic; + uint64_t mChecksum; + uint32_t mVersion; + uint32_t mFlags; + uint32_t mGridIndex; + uint32_t mGridCount; + uint64_t mGridSize; + char mGridName[MaxNameSize]; + uint8_t mMap[264]; + uint8_t mWorldBBox[48]; // double[6], but no doubles in Metal + uint8_t mVoxelSize[24]; // double[3], but no doubles in Metal + uint32_t mGridClass; + uint32_t mGridType; + uint32_t mData0; + uint64_t mData1, mData2; + + using BuildType = typename TreeT::BuildType; + + ccl_device_inline_method ccl_global const TreeT &tree() const ccl_global + { + return *reinterpret_cast(this + 1); + } +}; + +/* Tree */ + +template struct alignas(NANOVDB_DATA_ALIGNMENT) Tree { + int64_t mNodeOffset[4]; + uint32_t mNodeCount[3]; + uint32_t mTileCount[3]; + uint64_t mVoxelCount; + + using ValueType = typename RootT::ValueType; + using BuildType = typename RootT::BuildType; + + ccl_device_inline_method ccl_global const RootT &root() const ccl_global + { + return *reinterpret_cast( + mNodeOffset[3] ? PtrAdd(this, mNodeOffset[3]) : nullptr); + } +}; + +/* RootNode */ + +template struct alignas(NANOVDB_DATA_ALIGNMENT) RootNode { + using ValueType = typename ChildT::ValueType; + using BuildType = typename ChildT::BuildType; + +#ifdef NANOVDB_USE_SINGLE_ROOT_KEY + using KeyT = uint64_t; + ccl_device_inline_method static uint64_t CoordToKey(const Coord ijk) + { + return (uint64_t(uint32_t(ijk.z) >> ChildT::TOTAL)) | + (uint64_t(uint32_t(ijk.y) >> ChildT::TOTAL) << 21) | + (uint64_t(uint32_t(ijk.x) >> ChildT::TOTAL) << 42); + } +#else + using KeyT = Coord; + ccl_device_inline_method static Coord CoordToKey(const CoordT ijk) + { + return ijk & ~ChildT::MASK; + } +#endif + Coord mBBox[2]; + uint32_t mTableSize; + + ValueType mBackground; + ValueType mMinimum; + ValueType mMaximum; + float mAverage; + float mStdDevi; + + struct alignas(NANOVDB_DATA_ALIGNMENT) Tile { + KeyT key; + int64_t child; + uint32_t state; + ValueType value; + }; + + ccl_device_inline_method ccl_global const Tile *probeTile(const Coord ijk) const ccl_global + { + const auto key = CoordToKey(ijk); + ccl_global const Tile *p = reinterpret_cast(this + 1); + ccl_global const Tile *q = p + mTableSize; + for (; p < q; ++p) { + if (p->key == key) { + return p; + } + } + return nullptr; + } + + ccl_device_inline_method ccl_global const ChildT *getChild(ccl_global const Tile *tile) const + ccl_global + { + return PtrAdd(this, tile->child); + } + + ccl_static_constexpr uint32_t LEVEL = 1 + ChildT::LEVEL; +}; + +/* InternalNode */ + +template +struct alignas(NANOVDB_DATA_ALIGNMENT) InternalNode { + using ValueType = typename ChildT::ValueType; + using BuildType = typename ChildT::BuildType; + + union Tile { + ValueType value; + int64_t child; + }; + + Coord mBBox[2]; + uint64_t mFlags; + Mask mValueMask; + Mask mChildMask; + + ValueType mMinimum; + ValueType mMaximum; + float mAverage; + float mStdDevi; + + alignas(32) Tile mTable[1u << (3 * Log2Dim)]; + + ccl_device_inline_method ccl_global const ChildT *getChild(uint32_t n) const ccl_global + { + return PtrAdd(this, mTable[n].child); + } + + ccl_static_constexpr uint32_t LOG2DIM = Log2Dim; + ccl_static_constexpr uint32_t TOTAL = LOG2DIM + ChildT::TOTAL; + ccl_static_constexpr uint32_t DIM = 1u << TOTAL; + ccl_static_constexpr uint32_t SIZE = 1u << (3 * LOG2DIM); + ccl_static_constexpr uint32_t MASK = (1u << TOTAL) - 1u; + ccl_static_constexpr uint32_t LEVEL = 1 + ChildT::LEVEL; + + ccl_device_inline_method static uint32_t CoordToOffset(const Coord ijk) + { + return (((ijk.x & MASK) >> ChildT::TOTAL) << (2 * LOG2DIM)) | + (((ijk.y & MASK) >> ChildT::TOTAL) << (LOG2DIM)) | ((ijk.z & MASK) >> ChildT::TOTAL); + } +}; + +/* LeafData */ + +template struct alignas(NANOVDB_DATA_ALIGNMENT) LeafData { + using ValueType = ValueT; + using BuildType = ValueT; + + Coord mBBoxMin; + uint8_t mBBoxDif[3]; + uint8_t mFlags; + Mask mValueMask; + + ValueType mMinimum; + ValueType mMaximum; + float mAverage; + float mStdDevi; + alignas(32) ValueType mValues[1u << 3 * LOG2DIM]; + + ccl_device_inline_method ValueType getValue(uint32_t i) const ccl_global + { + return mValues[i]; + } +}; + +/* LeafFnBase */ + +template struct alignas(NANOVDB_DATA_ALIGNMENT) LeafFnBase { + Coord mBBoxMin; + uint8_t mBBoxDif[3]; + uint8_t mFlags; + Mask mValueMask; + + float mMinimum; + float mQuantum; + uint16_t mMin, mMax, mAvg, mDev; +}; + +/* LeafData */ + +class Fp16 { +}; + +template struct alignas(NANOVDB_DATA_ALIGNMENT) LeafData { + using ValueType = float; + using BuildType = Fp16; + + LeafFnBase base; + alignas(32) uint16_t mCode[1u << 3 * LOG2DIM]; + + ccl_device_inline_method float getValue(uint32_t i) const ccl_global + { + return mCode[i] * base.mQuantum + base.mMinimum; + } +}; + +/* LeafData */ + +class FpN { +}; + +template struct alignas(NANOVDB_DATA_ALIGNMENT) LeafData { + using ValueType = float; + using BuildType = FpN; + + LeafFnBase base; + + ccl_device_inline_method float getValue(uint32_t i) const ccl_global + { + const int b = base.mFlags >> 5; + uint32_t code = reinterpret_cast(this + 1)[i >> (5 - b)]; + code >>= (i & ((32 >> b) - 1)) << b; + code &= (1 << (1 << b)) - 1; + return float(code) * base.mQuantum + base.mMinimum; + } +}; + +/* LeafNode */ + +template struct alignas(NANOVDB_DATA_ALIGNMENT) LeafNode { + using DataType = LeafData; + using ValueType = typename DataType::ValueType; + using BuildType = typename DataType::BuildType; + + DataType data; + + ccl_static_constexpr uint32_t LOG2DIM = Log2Dim; + ccl_static_constexpr uint32_t TOTAL = LOG2DIM; + ccl_static_constexpr uint32_t DIM = 1u << TOTAL; + ccl_static_constexpr uint32_t SIZE = 1u << 3 * LOG2DIM; + ccl_static_constexpr uint32_t MASK = (1u << LOG2DIM) - 1u; + ccl_static_constexpr uint32_t LEVEL = 0; + + ccl_device_inline_method static uint32_t CoordToOffset(const Coord ijk) + { + return ((ijk.x & MASK) << (2 * LOG2DIM)) | ((ijk.y & MASK) << LOG2DIM) | (ijk.z & MASK); + } + + ccl_device_inline_method ValueType getValue(uint32_t offset) const ccl_global + { + return data.getValue(offset); + } + + ccl_device_inline_method ValueType getValue(const Coord ijk) const ccl_global + { + return getValue(CoordToOffset(ijk)); + } +}; + +/* Template Specializations */ + +template using NanoLeaf = LeafNode; +template using NanoLower = InternalNode, 4>; +template using NanoUpper = InternalNode, 5>; +template using NanoRoot = RootNode>; +template using NanoTree = Tree>; +template using NanoGrid = Grid>; + +/* ReadAccessor */ + +template class ReadAccessor { + using RootT = NanoRoot; + using LeafT = NanoLeaf; + + mutable ccl_global const RootT *mRoot; + + public: + using ValueType = typename RootT::ValueType; + + ccl_device_inline_method ReadAccessor(ccl_global const RootT &root) : mRoot(&root) {} + + ccl_device_inline_method ValueType getValue(const Coord ijk) const + { + ccl_global const auto *tile = mRoot->probeTile(ijk); + if (tile == nullptr) { + return mRoot->mBackground; + } + if (tile->child == 0) { + return tile->value; + } + + ccl_global const auto *upper = mRoot->getChild(tile); + const uint32_t upper_n = upper->CoordToOffset(ijk); + if (upper->mChildMask.isOff(upper_n)) { + return upper->mTable[upper_n].value; + } + + ccl_global const auto *lower = upper->getChild(upper_n); + const uint32_t lower_n = lower->CoordToOffset(ijk); + if (lower->mChildMask.isOff(lower_n)) { + return lower->mTable[lower_n].value; + } + + ccl_global const LeafT *leaf = lower->getChild(lower_n); + return leaf->getValue(ijk); + } +}; + +template class CachedReadAccessor { + using RootT = NanoRoot; + using UpperT = NanoUpper; + using LowerT = NanoLower; + using LeafT = NanoLeaf; + + mutable Coord mKeys[3]; + mutable ccl_global const RootT *mRoot; + mutable ccl_global const void *mNode[3]; + + public: + using ValueType = typename RootT::ValueType; + + ccl_device_inline_method CachedReadAccessor(ccl_global const RootT &root) + : mKeys{Coord(INT_MAX), Coord(INT_MAX), Coord(INT_MAX)}, + mRoot(&root), + mNode{nullptr, nullptr, nullptr} + { + } + + template ccl_device_inline_method bool isCached(const Coord ijk) const + { + return (ijk.x & int32_t(~NodeT::MASK)) == mKeys[NodeT::LEVEL].x && + (ijk.y & int32_t(~NodeT::MASK)) == mKeys[NodeT::LEVEL].y && + (ijk.z & int32_t(~NodeT::MASK)) == mKeys[NodeT::LEVEL].z; + } + + ccl_device_inline_method ValueType getValueAndCache(ccl_global const RootT &node, + const Coord ijk) const + { + if (ccl_global const auto *tile = node.probeTile(ijk)) { + if (tile->child != 0) { + ccl_global const auto *child = node.getChild(tile); + insert(ijk, child); + return getValueAndCache(*child, ijk); + } + return tile->value; + } + return node.mBackground; + } + + ccl_device_inline_method ValueType getValueAndCache(ccl_global const LeafT &node, + const Coord ijk) const + { + return node.getValue(ijk); + } + + template + ccl_device_inline_method ValueType getValueAndCache(ccl_global const NodeT &node, + const Coord ijk) const + { + const uint32_t n = node.CoordToOffset(ijk); + if (node.mChildMask.isOff(n)) { + return node.mTable[n].value; + } + ccl_global const auto *child = node.getChild(n); + insert(ijk, child); + return getValueAndCache(*child, ijk); + } + + ccl_device_inline_method ValueType getValue(const Coord ijk) const + { + if (isCached(ijk)) { + return getValueAndCache(*((ccl_global const LeafT *)mNode[0]), ijk); + } + else if (isCached(ijk)) { + return getValueAndCache(*((ccl_global const LowerT *)mNode[1]), ijk); + } + else if (isCached(ijk)) { + return getValueAndCache(*((ccl_global const UpperT *)mNode[2]), ijk); + } + return getValueAndCache(*mRoot, ijk); + } + + template + ccl_device_inline_method void insert(const Coord ijk, ccl_global const NodeT *node) const + { + mKeys[NodeT::LEVEL] = ijk & ~NodeT::MASK; + mNode[NodeT::LEVEL] = node; + } +}; + +} // namespace nanovdb + +CCL_NAMESPACE_END diff --git a/intern/cycles/scene/CMakeLists.txt b/intern/cycles/scene/CMakeLists.txt index 92b19303c94..ce4093cdf03 100644 --- a/intern/cycles/scene/CMakeLists.txt +++ b/intern/cycles/scene/CMakeLists.txt @@ -108,8 +108,6 @@ if(WITH_CYCLES_OSL) list(APPEND LIB cycles_kernel_osl ) - - set_property(SOURCE osl.cpp PROPERTY COMPILE_FLAGS ${RTTI_DISABLE_FLAGS}) endif() if(WITH_OPENCOLORIO) diff --git a/intern/cycles/scene/curves.cpp b/intern/cycles/scene/curves.cpp index ec84e43f66d..d5f5aca9730 100644 --- a/intern/cycles/scene/curves.cpp +++ b/intern/cycles/scene/curves.cpp @@ -35,7 +35,7 @@ void curvebounds(float *lower, float *upper, float3 *p, int dim) float ta = -1.0f; float tb = -1.0f; - if (discroot >= 0) { + if (discroot >= 0 && curve_coef[3] != 0.0f) { discroot = sqrtf(discroot); ta = (-curve_coef[2] - discroot) / (3 * curve_coef[3]); tb = (-curve_coef[2] + discroot) / (3 * curve_coef[3]); diff --git a/intern/cycles/scene/image_vdb.cpp b/intern/cycles/scene/image_vdb.cpp index 478b88c6d54..d94a7973adc 100644 --- a/intern/cycles/scene/image_vdb.cpp +++ b/intern/cycles/scene/image_vdb.cpp @@ -11,6 +11,7 @@ # include #endif #ifdef WITH_NANOVDB +# define NANOVDB_USE_OPENVDB # include #endif @@ -52,23 +53,49 @@ struct ToNanoOp { { if constexpr (!std::is_same_v) { try { - FloatGridType floatgrid(*openvdb::gridConstPtrCast(grid)); +# if NANOVDB_MAJOR_VERSION_NUMBER > 32 || \ + (NANOVDB_MAJOR_VERSION_NUMBER == 32 && NANOVDB_MINOR_VERSION_NUMBER >= 6) + /* OpenVDB 11. */ if constexpr (std::is_same_v) { + openvdb::FloatGrid floatgrid(*openvdb::gridConstPtrCast(grid)); if (precision == 0) { - nanogrid = nanovdb::openToNanoVDB(floatgrid); - return true; + nanogrid = nanovdb::createNanoGrid(floatgrid); } else if (precision == 16) { - nanogrid = nanovdb::openToNanoVDB(floatgrid); - return true; + nanogrid = nanovdb::createNanoGrid(floatgrid); + } + else { + nanogrid = nanovdb::createNanoGrid(floatgrid); } } - - nanogrid = nanovdb::openToNanoVDB(floatgrid); + else if constexpr (std::is_same_v) { + openvdb::Vec3fGrid floatgrid(*openvdb::gridConstPtrCast(grid)); + nanogrid = nanovdb::createNanoGrid( + floatgrid, nanovdb::StatsMode::Disable); + } +# else + /* OpenVDB 10. */ + if constexpr (std::is_same_v) { + openvdb::FloatGrid floatgrid(*openvdb::gridConstPtrCast(grid)); + if (precision == 0) { + nanogrid = + nanovdb::openToNanoVDB( + floatgrid); + } + else if (precision == 16) { + nanogrid = + nanovdb::openToNanoVDB( + floatgrid); + } + else { + nanogrid = nanovdb::openToNanoVDB(floatgrid); + } + } + else if constexpr (std::is_same_v) { + openvdb::Vec3fGrid floatgrid(*openvdb::gridConstPtrCast(grid)); + nanogrid = nanovdb::openToNanoVDB(floatgrid); + } +# endif } catch (const std::exception &e) { VLOG_WARNING << "Error converting OpenVDB to NanoVDB grid: " << e.what(); diff --git a/intern/cycles/scene/shader_nodes.cpp b/intern/cycles/scene/shader_nodes.cpp index a04b4c5a1ff..304eab9ddbe 100644 --- a/intern/cycles/scene/shader_nodes.cpp +++ b/intern/cycles/scene/shader_nodes.cpp @@ -3372,14 +3372,23 @@ PrincipledHairBsdfNode::PrincipledHairBsdfNode() : BsdfBaseNode(get_node_type()) closure = CLOSURE_BSDF_HAIR_HUANG_ID; } -void PrincipledHairBsdfNode::attributes(Shader *shader, AttributeRequestSet *attributes) +/* Treat hair as transparent if the hit is outside of the projected width. */ +bool PrincipledHairBsdfNode::has_surface_transparent() { if (model == NODE_PRINCIPLED_HAIR_HUANG) { - /* Make sure we have the normal for elliptical cross section tracking. */ if (aspect_ratio != 1.0f || input("Aspect Ratio")->link) { - attributes->add(ATTR_STD_VERTEX_NORMAL); + return true; } } + return false; +} + +void PrincipledHairBsdfNode::attributes(Shader *shader, AttributeRequestSet *attributes) +{ + if (has_surface_transparent()) { + /* Make sure we have the normal for elliptical cross section tracking. */ + attributes->add(ATTR_STD_VERTEX_NORMAL); + } if (!input("Random")->link) { /* Enable retrieving Hair Info -> Random if Random isn't linked. */ diff --git a/intern/cycles/scene/shader_nodes.h b/intern/cycles/scene/shader_nodes.h index c5643c2166a..cd437d3f885 100644 --- a/intern/cycles/scene/shader_nodes.h +++ b/intern/cycles/scene/shader_nodes.h @@ -851,6 +851,8 @@ class PrincipledHairBsdfNode : public BsdfBaseNode { { return ShaderNode::get_feature() | KERNEL_FEATURE_NODE_PRINCIPLED_HAIR; } + + bool has_surface_transparent(); }; class HairBsdfNode : public BsdfNode { diff --git a/intern/cycles/util/defines.h b/intern/cycles/util/defines.h index dd0299ae731..fe59b497ac8 100644 --- a/intern/cycles/util/defines.h +++ b/intern/cycles/util/defines.h @@ -61,6 +61,7 @@ /* Address spaces for GPU. */ # define ccl_global # define ccl_inline_constant inline constexpr +# define ccl_static_constexpr static constexpr # define ccl_constant const # define ccl_private # define ccl_ray_data ccl_private diff --git a/intern/dualcon/dualcon.h b/intern/dualcon/dualcon.h index 0a2e7ac7bbe..d84fc17cc68 100644 --- a/intern/dualcon/dualcon.h +++ b/intern/dualcon/dualcon.h @@ -26,7 +26,7 @@ typedef struct DualConInput { int co_stride; int totco; - DualConTri looptri; + DualConTri looptris; int tri_stride; int tottri; diff --git a/intern/dualcon/intern/dualcon_c_api.cpp b/intern/dualcon/intern/dualcon_c_api.cpp index 206aca9f37c..587563185cd 100644 --- a/intern/dualcon/intern/dualcon_c_api.cpp +++ b/intern/dualcon/intern/dualcon_c_api.cpp @@ -22,7 +22,7 @@ static void veccopy(float dst[3], const float src[3]) } #define GET_TRI(_mesh, _n) \ - (*(DualConTri)(((char *)(_mesh)->looptri) + ((_n) * (_mesh)->tri_stride))) + (*(DualConTri)(((char *)(_mesh)->looptris) + ((_n) * (_mesh)->tri_stride))) #define GET_CO(_mesh, _n) (*(DualConCo)(((char *)(_mesh)->co) + ((_n) * (_mesh)->co_stride))) diff --git a/intern/ffmpeg/ffmpeg_compat.h b/intern/ffmpeg/ffmpeg_compat.h index c8a4989aa34..91ea1701db6 100644 --- a/intern/ffmpeg/ffmpeg_compat.h +++ b/intern/ffmpeg/ffmpeg_compat.h @@ -16,6 +16,7 @@ #include #include +#include /* Check if our ffmpeg is new enough, avoids user complaints. * Minimum supported version is currently 3.2.0 which mean the following library versions: @@ -46,6 +47,11 @@ # define FFMPEG_USE_OLD_CHANNEL_VARS #endif +/* Threaded sws_scale_frame was added in ffmpeg 5.0 (swscale version 6.1). */ +#if (LIBSWSCALE_VERSION_INT >= AV_VERSION_INT(6, 1, 100)) +# define FFMPEG_SWSCALE_THREADING +#endif + /* AV_CODEC_CAP_AUTO_THREADS was renamed to AV_CODEC_CAP_OTHER_THREADS with * upstream commit * github.com/FFmpeg/FFmpeg/commit/7d09579190def3ef7562399489e628f3b65714ce diff --git a/intern/ghost/intern/GHOST_SystemCocoa.hh b/intern/ghost/intern/GHOST_SystemCocoa.hh index 37340af489b..da1813a88ad 100644 --- a/intern/ghost/intern/GHOST_SystemCocoa.hh +++ b/intern/ghost/intern/GHOST_SystemCocoa.hh @@ -176,6 +176,13 @@ class GHOST_SystemCocoa : public GHOST_System { */ GHOST_TSuccess setCursorPosition(int32_t x, int32_t y); + /** + * Get the color of the pixel at the current mouse cursor location + * \param r_color: returned sRGB float colors + * \return Success value (true == successful and supported by platform) + */ + GHOST_TSuccess getPixelAtCursor(float r_color[3]) const; + /*************************************************************************************** * Access to mouse button and keyboard states. ***************************************************************************************/ @@ -318,7 +325,7 @@ class GHOST_SystemCocoa : public GHOST_System { /** Temporarily ignore momentum scroll events */ bool m_ignoreMomentumScroll; - /** Is the scroll wheel event generated by a multi-touch track-pad or mouse? */ + /** Is the scroll wheel event generated by a multi-touch trackpad or mouse? */ bool m_multiTouchScroll; /** To prevent multiple warp, we store the time of the last warp event * and ignore mouse moved events generated before that. */ diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm b/intern/ghost/intern/GHOST_SystemCocoa.mm index e4a97d0bdda..855ae09b21e 100644 --- a/intern/ghost/intern/GHOST_SystemCocoa.mm +++ b/intern/ghost/intern/GHOST_SystemCocoa.mm @@ -549,7 +549,7 @@ GHOST_SystemCocoa::GHOST_SystemCocoa() sysctl(mib, 2, &boottime, &len, nullptr, 0); m_start_time = ((boottime.tv_sec * 1000) + (boottime.tv_usec / 1000)); - /* Detect multi-touch track-pad. */ + /* Detect multi-touch trackpad. */ mib[0] = CTL_HW; mib[1] = HW_MODEL; sysctl(mib, 2, nullptr, &len, nullptr, 0); @@ -888,6 +888,71 @@ GHOST_TSuccess GHOST_SystemCocoa::setCursorPosition(int32_t x, int32_t y) return GHOST_kSuccess; } +GHOST_TSuccess GHOST_SystemCocoa::getPixelAtCursor(float r_color[3]) const +{ + /* NOTE: There are known issues/limitations at the moment: + * + * - User needs to allow screen capture permission for Blender. + * - Blender has no control of the cursor outside of its window, so it is + * not going to be the eyedropper icon. + * - GHOST does not report click events from outside of the window, so the + * user needs to press Enter instead. + * + * Ref #111303. + */ + + @autoreleasepool { + /* Check for screen capture access permission early to prevent issues. + * Without permission, macOS may capture only the Blender window, wallpaper, and taskbar. + * This behavior could confuse users, especially when trying to pick a color from another app, + * potentially capturing the wallpaper under that app window. + */ + if (@available(macOS 11.0, *)) { + /* Although these methods are documented as available for macOS 10.15, they are not actually + * shipped, leading to a crash if used on macOS 10.15. + * + * Ref: https://developer.apple.com/forums/thread/683860?answerId=684400022#684400022 + */ + if (!CGPreflightScreenCaptureAccess()) { + CGRequestScreenCaptureAccess(); + return GHOST_kFailure; + } + } + + CGEventRef event = CGEventCreate(nil); + if (!event) { + return GHOST_kFailure; + } + CGPoint mouseLocation = CGEventGetLocation(event); + CFRelease(event); + + CGRect rect = CGRectMake(mouseLocation.x, mouseLocation.y, 1, 1); + CGImageRef image = CGWindowListCreateImage( + rect, kCGWindowListOptionOnScreenOnly, kCGNullWindowID, kCGWindowImageDefault); + if (!image) { + return GHOST_kFailure; + } + NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithCGImage:image]; + CGImageRelease(image); + + NSColor *color = [bitmap colorAtX:0 y:0]; + if (!color) { + return GHOST_kFailure; + } + NSColor *srgbColor = [color colorUsingColorSpace:[NSColorSpace sRGBColorSpace]]; + if (!srgbColor) { + return GHOST_kFailure; + } + + CGFloat red = 0.0, green = 0.0, blue = 0.0; + [color getRed:&red green:&green blue:&blue alpha:nil]; + r_color[0] = red; + r_color[1] = green; + r_color[2] = blue; + } + return GHOST_kSuccess; +} + GHOST_TSuccess GHOST_SystemCocoa::setMouseCursorPosition(int32_t x, int32_t y) { float xf = (float)x, yf = (float)y; @@ -953,8 +1018,6 @@ GHOST_TCapabilityFlag GHOST_SystemCocoa::getCapabilities() const ~( /* Cocoa has no support for a primary selection clipboard. */ GHOST_kCapabilityPrimaryClipboard | - /* Cocoa has no support for sampling colors from the desktop. */ - GHOST_kCapabilityDesktopSample | /* This Cocoa back-end has not yet implemented image copy/paste. */ GHOST_kCapabilityClipboardImages)); } diff --git a/intern/ghost/intern/GHOST_SystemWayland.cc b/intern/ghost/intern/GHOST_SystemWayland.cc index f3ce36bc714..b8098fb03f0 100644 --- a/intern/ghost/intern/GHOST_SystemWayland.cc +++ b/intern/ghost/intern/GHOST_SystemWayland.cc @@ -120,6 +120,11 @@ static void gwl_seat_capability_pointer_disable(GWL_Seat *seat); static void gwl_seat_capability_keyboard_disable(GWL_Seat *seat); static void gwl_seat_capability_touch_disable(GWL_Seat *seat); +static void gwl_seat_cursor_anim_begin(GWL_Seat *seat); +static void gwl_seat_cursor_anim_begin_if_needed(GWL_Seat *seat); +static void gwl_seat_cursor_anim_end(GWL_Seat *seat); +static void gwl_seat_cursor_anim_reset(GWL_Seat *seat); + static bool gwl_registry_entry_remove_by_name(GWL_Display *display, uint32_t name, int *r_interface_slot); @@ -135,11 +140,6 @@ static void gwl_display_event_thread_destroy(GWL_Display *display); static void ghost_wl_display_lock_without_input(wl_display *wl_display, std::mutex *server_mutex); -static void cursor_anim_begin_if_needed(GWL_Seat *seat); -static void cursor_anim_begin(GWL_Seat *seat); -static void cursor_anim_end(GWL_Seat *seat); -static void cursor_anim_reset(GWL_Seat *seat); - /** Default size for pending event vector. */ constexpr size_t events_pending_default_size = 4096 / sizeof(void *); @@ -1336,7 +1336,7 @@ static void gwl_display_destroy(GWL_Display *display) /* Stop all animated cursors (freeing their #GWL_Cursor_AnimHandle). */ for (GWL_Seat *seat : display->seats) { - cursor_anim_end(seat); + gwl_seat_cursor_anim_end(seat); } /* For typical WAYLAND use this will always be set. @@ -1675,6 +1675,11 @@ static void gwl_registry_entry_update_all(GWL_Display *display, const int interf /** \name Private Utility Functions * \{ */ +static uint64_t sub_abs_u64(const uint64_t a, const uint64_t b) +{ + return a > b ? a - b : b - a; +} + /** * Return milliseconds from a microsecond uint32 pair (used by some wayland functions). */ @@ -2026,6 +2031,7 @@ static const char *ghost_wl_mime_send[] = { "text/plain", }; +#ifdef USE_EVENT_BACKGROUND_THREAD static void pthread_set_min_priority(pthread_t handle) { int policy; @@ -2046,6 +2052,7 @@ static void thread_set_min_priority(std::thread &thread) * This cast might be avoided with clever template use. */ pthread_set_min_priority(reinterpret_cast(thread.native_handle())); } +#endif /* USE_EVENT_BACKGROUND_THREAD */ static int memfd_create_sealed(const char *name) { @@ -2383,6 +2390,321 @@ static char *read_file_as_buffer(const int fd, const bool nil_terminate, size_t /** \} */ +/* -------------------------------------------------------------------- */ +/** \name Private Cursor API + * \{ */ + +static void cursor_buffer_set_surface_impl(const wl_cursor_image *wl_image, + wl_buffer *buffer, + wl_surface *wl_surface, + const int scale) +{ + const int32_t image_size_x = int32_t(wl_image->width); + const int32_t image_size_y = int32_t(wl_image->height); + GHOST_ASSERT((image_size_x % scale) == 0 && (image_size_y % scale) == 0, + "The size must be a multiple of the scale!"); + + wl_surface_set_buffer_scale(wl_surface, scale); + wl_surface_attach(wl_surface, buffer, 0, 0); + wl_surface_damage(wl_surface, 0, 0, image_size_x, image_size_y); + wl_surface_commit(wl_surface); +} + +/** + * Needed to ensure the cursor size is always a multiple of scale. + */ +static int cursor_buffer_compatible_scale_from_image(const wl_cursor_image *wl_image, int scale) +{ + const int32_t image_size_x = int32_t(wl_image->width); + const int32_t image_size_y = int32_t(wl_image->height); + while (scale > 1) { + if ((image_size_x % scale) == 0 && (image_size_y % scale) == 0) { + break; + } + scale -= 1; + } + return scale; +} + +static const wl_cursor *gwl_seat_cursor_find_from_shape(GWL_Seat *seat, + const GHOST_TStandardCursor shape, + const char **r_cursor_name) +{ + /* Caller must lock `server_mutex`. */ + GWL_Cursor *cursor = &seat->cursor; + wl_cursor *wl_cursor = nullptr; + + const char *cursor_name = ghost_wl_cursors.names[shape]; + if (cursor_name[0] != '\0') { + if (!cursor->wl.theme) { + /* The cursor wl_surface hasn't entered an output yet. Initialize theme with scale 1. */ + cursor->wl.theme = wl_cursor_theme_load( + cursor->theme_name.c_str(), cursor->theme_size, seat->system->wl_shm_get()); + } + + if (cursor->wl.theme) { + wl_cursor = wl_cursor_theme_get_cursor(cursor->wl.theme, cursor_name); + if (!wl_cursor) { + GHOST_PRINT("cursor '" << cursor_name << "' does not exist" << std::endl); + } + } + } + + if (r_cursor_name && wl_cursor) { + *r_cursor_name = cursor_name; + } + return wl_cursor; +} + +/** + * Show the buffer defined by #gwl_seat_cursor_buffer_set without changing anything else, + * so #gwl_seat_cursor_buffer_hide can be used to display it again. + * + * The caller is responsible for setting `seat->cursor.visible`. + */ +static void gwl_seat_cursor_buffer_show(GWL_Seat *seat) +{ + const GWL_Cursor *cursor = &seat->cursor; + + if (seat->wl.pointer) { + const int scale = cursor->is_custom ? cursor->custom_scale : seat->pointer.theme_scale; + const int32_t hotspot_x = int32_t(cursor->wl.image.hotspot_x) / scale; + const int32_t hotspot_y = int32_t(cursor->wl.image.hotspot_y) / scale; + wl_pointer_set_cursor( + seat->wl.pointer, seat->pointer.serial, cursor->wl.surface_cursor, hotspot_x, hotspot_y); + } + + if (!seat->wp.tablet_tools.empty()) { + const int scale = cursor->is_custom ? cursor->custom_scale : seat->tablet.theme_scale; + const int32_t hotspot_x = int32_t(cursor->wl.image.hotspot_x) / scale; + const int32_t hotspot_y = int32_t(cursor->wl.image.hotspot_y) / scale; + for (zwp_tablet_tool_v2 *zwp_tablet_tool_v2 : seat->wp.tablet_tools) { + GWL_TabletTool *tablet_tool = static_cast( + zwp_tablet_tool_v2_get_user_data(zwp_tablet_tool_v2)); + zwp_tablet_tool_v2_set_cursor(zwp_tablet_tool_v2, + seat->tablet.serial, + tablet_tool->wl.surface_cursor, + hotspot_x, + hotspot_y); +#ifdef USE_KDE_TABLET_HIDDEN_CURSOR_HACK + wl_surface_commit(tablet_tool->wl.surface_cursor); +#endif + } + } + + gwl_seat_cursor_anim_reset(seat); +} + +/** + * Hide the buffer defined by #gwl_seat_cursor_buffer_set without changing anything else, + * so #gwl_seat_cursor_buffer_show can be used to display it again. + * + * The caller is responsible for setting `seat->cursor.visible`. + */ +static void gwl_seat_cursor_buffer_hide(GWL_Seat *seat) +{ + gwl_seat_cursor_anim_end(seat); + + wl_pointer_set_cursor(seat->wl.pointer, seat->pointer.serial, nullptr, 0, 0); + for (zwp_tablet_tool_v2 *zwp_tablet_tool_v2 : seat->wp.tablet_tools) { + zwp_tablet_tool_v2_set_cursor(zwp_tablet_tool_v2, seat->tablet.serial, nullptr, 0, 0); + } +} + +static void gwl_seat_cursor_buffer_set(const GWL_Seat *seat, + const wl_cursor_image *wl_image, + wl_buffer *buffer) +{ + const GWL_Cursor *cursor = &seat->cursor; + const bool visible = (cursor->visible && cursor->is_hardware); + + /* This is a requirement of WAYLAND, when this isn't the case, + * it causes Blender's window to close intermittently. */ + if (seat->wl.pointer) { + const int scale = cursor_buffer_compatible_scale_from_image( + wl_image, cursor->is_custom ? cursor->custom_scale : seat->pointer.theme_scale); + const int32_t hotspot_x = int32_t(wl_image->hotspot_x) / scale; + const int32_t hotspot_y = int32_t(wl_image->hotspot_y) / scale; + cursor_buffer_set_surface_impl(wl_image, buffer, cursor->wl.surface_cursor, scale); + wl_pointer_set_cursor(seat->wl.pointer, + seat->pointer.serial, + visible ? cursor->wl.surface_cursor : nullptr, + hotspot_x, + hotspot_y); + } + + /* Set the cursor for all tablet tools as well. */ + if (!seat->wp.tablet_tools.empty()) { + const int scale = cursor_buffer_compatible_scale_from_image( + wl_image, cursor->is_custom ? cursor->custom_scale : seat->tablet.theme_scale); + const int32_t hotspot_x = int32_t(wl_image->hotspot_x) / scale; + const int32_t hotspot_y = int32_t(wl_image->hotspot_y) / scale; + for (zwp_tablet_tool_v2 *zwp_tablet_tool_v2 : seat->wp.tablet_tools) { + GWL_TabletTool *tablet_tool = static_cast( + zwp_tablet_tool_v2_get_user_data(zwp_tablet_tool_v2)); + cursor_buffer_set_surface_impl(wl_image, buffer, tablet_tool->wl.surface_cursor, scale); + zwp_tablet_tool_v2_set_cursor(zwp_tablet_tool_v2, + seat->tablet.serial, + visible ? tablet_tool->wl.surface_cursor : nullptr, + hotspot_x, + hotspot_y); + } + } +} + +static void gwl_seat_cursor_buffer_set_current(GWL_Seat *seat) +{ + const GWL_Cursor *cursor = &seat->cursor; + gwl_seat_cursor_anim_end(seat); + gwl_seat_cursor_buffer_set(seat, &cursor->wl.image, cursor->wl.buffer); + gwl_seat_cursor_anim_begin_if_needed(seat); +} + +enum eCursorSetMode { + CURSOR_VISIBLE_ALWAYS_SET = 1, + CURSOR_VISIBLE_ONLY_HIDE, + CURSOR_VISIBLE_ONLY_SHOW, +}; + +static void gwl_seat_cursor_visible_set(GWL_Seat *seat, + const bool visible, + const bool is_hardware, + const enum eCursorSetMode set_mode) +{ + GWL_Cursor *cursor = &seat->cursor; + const bool was_visible = cursor->is_hardware && cursor->visible; + const bool use_visible = is_hardware && visible; + + if (set_mode == CURSOR_VISIBLE_ALWAYS_SET) { + /* Pass. */ + } + else if (set_mode == CURSOR_VISIBLE_ONLY_SHOW) { + if (!use_visible) { + return; + } + } + else if (set_mode == CURSOR_VISIBLE_ONLY_HIDE) { + if (use_visible) { + return; + } + } + + if (use_visible) { + if (!was_visible) { + gwl_seat_cursor_buffer_show(seat); + } + } + else { + if (was_visible) { + gwl_seat_cursor_buffer_hide(seat); + } + } + cursor->visible = visible; + cursor->is_hardware = is_hardware; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Private Cursor Animation API + * \{ */ + +#ifdef USE_EVENT_BACKGROUND_THREAD + +static bool gwl_seat_cursor_anim_check(GWL_Seat *seat) +{ + const wl_cursor *wl_cursor = seat->cursor.wl.theme_cursor; + if (!wl_cursor) { + return false; + } + /* NOTE: return true to stress test animated cursor, + * to ensure (otherwise rare) issues are triggered more frequently. */ + // return true; + + return wl_cursor->image_count > 1; +} + +static void gwl_seat_cursor_anim_begin(GWL_Seat *seat) +{ + /* Caller must lock `server_mutex`. */ + GHOST_ASSERT(seat->cursor.anim_handle == nullptr, "Must be cleared"); + + /* Callback for updating the cursor animation. */ + auto cursor_anim_frame_step_fn = + [](GWL_Seat *seat, GWL_Cursor_AnimHandle *anim_handle, int delay) { + /* It's possible the `wl_cursor` is reloaded while the cursor is animating. + * Don't access outside the lock, that's why the `delay` is passed in. */ + std::mutex *server_mutex = seat->system->server_mutex; + int frame = 0; + while (!anim_handle->exit_pending.load()) { + std::this_thread::sleep_for(std::chrono::milliseconds(delay)); + if (!anim_handle->exit_pending.load()) { + std::lock_guard lock_server_guard{*server_mutex}; + if (!anim_handle->exit_pending.load()) { + const struct wl_cursor *wl_cursor = seat->cursor.wl.theme_cursor; + frame = (frame + 1) % wl_cursor->image_count; + wl_cursor_image *image = wl_cursor->images[frame]; + wl_buffer *buffer = wl_cursor_image_get_buffer(image); + gwl_seat_cursor_buffer_set(seat, image, buffer); + delay = wl_cursor->images[frame]->delay; + /* Without this the cursor won't update when other processes are occupied. */ + wl_display_flush(seat->system->wl_display_get()); + } + } + } + delete anim_handle; + }; + + /* Allocate so this can be set before the thread begins. */ + GWL_Cursor_AnimHandle *anim_handle = new GWL_Cursor_AnimHandle; + seat->cursor.anim_handle = anim_handle; + + const int delay = seat->cursor.wl.theme_cursor->images[0]->delay; + std::thread cursor_anim_thread(cursor_anim_frame_step_fn, seat, anim_handle, delay); + /* Application logic should take priority. */ + thread_set_min_priority(cursor_anim_thread); + cursor_anim_thread.detach(); +} + +static void gwl_seat_cursor_anim_begin_if_needed(GWL_Seat *seat) +{ + if (gwl_seat_cursor_anim_check(seat)) { + gwl_seat_cursor_anim_begin(seat); + } +} + +static void gwl_seat_cursor_anim_end(GWL_Seat *seat) +{ + GWL_Cursor *cursor = &seat->cursor; + if (cursor->anim_handle) { + GWL_Cursor_AnimHandle *anim_handle = cursor->anim_handle; + cursor->anim_handle = nullptr; + anim_handle->exit_pending.store(true); + } +} + +static void gwl_seat_cursor_anim_reset(GWL_Seat *seat) +{ + gwl_seat_cursor_anim_end(seat); + gwl_seat_cursor_anim_begin_if_needed(seat); +} + +#else + +/* Unfortunately cursor animation requires a background thread. */ +[[maybe_unused]] static bool gwl_seat_cursor_anim_check(GWL_Seat * /*seat*/) +{ + return false; +} +[[maybe_unused]] static void gwl_seat_cursor_anim_begin(GWL_Seat * /*seat*/) {} +[[maybe_unused]] static void gwl_seat_cursor_anim_begin_if_needed(GWL_Seat * /*seat*/) {} +[[maybe_unused]] static void gwl_seat_cursor_anim_end(GWL_Seat * /*seat*/) {} +[[maybe_unused]] static void gwl_seat_cursor_anim_reset(GWL_Seat * /*seat*/) {} + +#endif /* !USE_EVENT_BACKGROUND_THREAD */ + +/** \} */ + /* -------------------------------------------------------------------- */ /** \name Private Keyboard Depressed Key Tracking * @@ -3552,7 +3874,7 @@ static void gesture_pinch_handle_begin(void *data, seat->pointer_gesture_pinch.rotation.factor = 5; if (win) { - /* NOTE(@ideasman42): Blender's use of track-pad coordinates is inconsistent and needs work. + /* NOTE(@ideasman42): Blender's use of trackpad coordinates is inconsistent and needs work. * This isn't specific to WAYLAND, in practice they tend to work well enough in most cases. * Some operators scale by the UI scale, some don't. * Even though the window scale is correct, it doesn't account for the UI scale preference @@ -7378,185 +7700,6 @@ GHOST_IWindow *GHOST_SystemWayland::createWindow(const char *title, return window; } -/** - * Show the buffer defined by #cursor_buffer_set without changing anything else, - * so #cursor_buffer_hide can be used to display it again. - * - * The caller is responsible for setting `seat->cursor.visible`. - */ -static void cursor_buffer_show(GWL_Seat *seat) -{ - const GWL_Cursor *cursor = &seat->cursor; - - if (seat->wl.pointer) { - const int scale = cursor->is_custom ? cursor->custom_scale : seat->pointer.theme_scale; - const int32_t hotspot_x = int32_t(cursor->wl.image.hotspot_x) / scale; - const int32_t hotspot_y = int32_t(cursor->wl.image.hotspot_y) / scale; - wl_pointer_set_cursor( - seat->wl.pointer, seat->pointer.serial, cursor->wl.surface_cursor, hotspot_x, hotspot_y); - } - - if (!seat->wp.tablet_tools.empty()) { - const int scale = cursor->is_custom ? cursor->custom_scale : seat->tablet.theme_scale; - const int32_t hotspot_x = int32_t(cursor->wl.image.hotspot_x) / scale; - const int32_t hotspot_y = int32_t(cursor->wl.image.hotspot_y) / scale; - for (zwp_tablet_tool_v2 *zwp_tablet_tool_v2 : seat->wp.tablet_tools) { - GWL_TabletTool *tablet_tool = static_cast( - zwp_tablet_tool_v2_get_user_data(zwp_tablet_tool_v2)); - zwp_tablet_tool_v2_set_cursor(zwp_tablet_tool_v2, - seat->tablet.serial, - tablet_tool->wl.surface_cursor, - hotspot_x, - hotspot_y); -#ifdef USE_KDE_TABLET_HIDDEN_CURSOR_HACK - wl_surface_commit(tablet_tool->wl.surface_cursor); -#endif - } - } - - cursor_anim_reset(seat); -} - -/** - * Hide the buffer defined by #cursor_buffer_set without changing anything else, - * so #cursor_buffer_show can be used to display it again. - * - * The caller is responsible for setting `seat->cursor.visible`. - */ -static void cursor_buffer_hide(GWL_Seat *seat) -{ - cursor_anim_end(seat); - - wl_pointer_set_cursor(seat->wl.pointer, seat->pointer.serial, nullptr, 0, 0); - for (zwp_tablet_tool_v2 *zwp_tablet_tool_v2 : seat->wp.tablet_tools) { - zwp_tablet_tool_v2_set_cursor(zwp_tablet_tool_v2, seat->tablet.serial, nullptr, 0, 0); - } -} - -/** - * Needed to ensure the cursor size is always a multiple of scale. - */ -static int cursor_buffer_compatible_scale_from_image(const wl_cursor_image *wl_image, int scale) -{ - const int32_t image_size_x = int32_t(wl_image->width); - const int32_t image_size_y = int32_t(wl_image->height); - while (scale > 1) { - if ((image_size_x % scale) == 0 && (image_size_y % scale) == 0) { - break; - } - scale -= 1; - } - return scale; -} - -static void cursor_buffer_set_surface_impl(const wl_cursor_image *wl_image, - wl_buffer *buffer, - wl_surface *wl_surface, - const int scale) -{ - const int32_t image_size_x = int32_t(wl_image->width); - const int32_t image_size_y = int32_t(wl_image->height); - GHOST_ASSERT((image_size_x % scale) == 0 && (image_size_y % scale) == 0, - "The size must be a multiple of the scale!"); - - wl_surface_set_buffer_scale(wl_surface, scale); - wl_surface_attach(wl_surface, buffer, 0, 0); - wl_surface_damage(wl_surface, 0, 0, image_size_x, image_size_y); - wl_surface_commit(wl_surface); -} - -static void cursor_buffer_set(const GWL_Seat *seat, - const wl_cursor_image *wl_image, - wl_buffer *buffer) -{ - const GWL_Cursor *cursor = &seat->cursor; - const bool visible = (cursor->visible && cursor->is_hardware); - - /* This is a requirement of WAYLAND, when this isn't the case, - * it causes Blender's window to close intermittently. */ - if (seat->wl.pointer) { - const int scale = cursor_buffer_compatible_scale_from_image( - wl_image, cursor->is_custom ? cursor->custom_scale : seat->pointer.theme_scale); - const int32_t hotspot_x = int32_t(wl_image->hotspot_x) / scale; - const int32_t hotspot_y = int32_t(wl_image->hotspot_y) / scale; - cursor_buffer_set_surface_impl(wl_image, buffer, cursor->wl.surface_cursor, scale); - wl_pointer_set_cursor(seat->wl.pointer, - seat->pointer.serial, - visible ? cursor->wl.surface_cursor : nullptr, - hotspot_x, - hotspot_y); - } - - /* Set the cursor for all tablet tools as well. */ - if (!seat->wp.tablet_tools.empty()) { - const int scale = cursor_buffer_compatible_scale_from_image( - wl_image, cursor->is_custom ? cursor->custom_scale : seat->tablet.theme_scale); - const int32_t hotspot_x = int32_t(wl_image->hotspot_x) / scale; - const int32_t hotspot_y = int32_t(wl_image->hotspot_y) / scale; - for (zwp_tablet_tool_v2 *zwp_tablet_tool_v2 : seat->wp.tablet_tools) { - GWL_TabletTool *tablet_tool = static_cast( - zwp_tablet_tool_v2_get_user_data(zwp_tablet_tool_v2)); - cursor_buffer_set_surface_impl(wl_image, buffer, tablet_tool->wl.surface_cursor, scale); - zwp_tablet_tool_v2_set_cursor(zwp_tablet_tool_v2, - seat->tablet.serial, - visible ? tablet_tool->wl.surface_cursor : nullptr, - hotspot_x, - hotspot_y); - } - } -} - -static void cursor_buffer_set_from_seat(GWL_Seat *seat) -{ - const GWL_Cursor *cursor = &seat->cursor; - cursor_anim_end(seat); - cursor_buffer_set(seat, &cursor->wl.image, cursor->wl.buffer); - cursor_anim_begin_if_needed(seat); -} - -enum eCursorSetMode { - CURSOR_VISIBLE_ALWAYS_SET = 1, - CURSOR_VISIBLE_ONLY_HIDE, - CURSOR_VISIBLE_ONLY_SHOW, -}; - -static void cursor_visible_set(GWL_Seat *seat, - const bool visible, - const bool is_hardware, - const enum eCursorSetMode set_mode) -{ - GWL_Cursor *cursor = &seat->cursor; - const bool was_visible = cursor->is_hardware && cursor->visible; - const bool use_visible = is_hardware && visible; - - if (set_mode == CURSOR_VISIBLE_ALWAYS_SET) { - /* Pass. */ - } - else if (set_mode == CURSOR_VISIBLE_ONLY_SHOW) { - if (!use_visible) { - return; - } - } - else if (set_mode == CURSOR_VISIBLE_ONLY_HIDE) { - if (use_visible) { - return; - } - } - - if (use_visible) { - if (!was_visible) { - cursor_buffer_show(seat); - } - } - else { - if (was_visible) { - cursor_buffer_hide(seat); - } - } - cursor->visible = visible; - cursor->is_hardware = is_hardware; -} - static bool cursor_is_software(const GHOST_TGrabCursorMode mode, const bool use_software_confine) { if (mode == GHOST_kGrabWrap) { @@ -7574,114 +7717,6 @@ static bool cursor_is_software(const GHOST_TGrabCursorMode mode, const bool use_ return false; } -static bool cursor_anim_check(GWL_Seat *seat) -{ - const wl_cursor *wl_cursor = seat->cursor.wl.theme_cursor; - if (!wl_cursor) { - return false; - } - /* NOTE: return true to stress test animated cursor, - * to ensure (otherwise rare) issues are triggered more frequently. */ - // return true; - - return wl_cursor->image_count > 1; -} - -static void cursor_anim_begin(GWL_Seat *seat) -{ - /* Caller must lock `server_mutex`. */ - GHOST_ASSERT(seat->cursor.anim_handle == nullptr, "Must be cleared"); - - /* Callback for updating the cursor animation. */ - auto cursor_anim_frame_step_fn = - [](GWL_Seat *seat, GWL_Cursor_AnimHandle *anim_handle, int delay) { - /* It's possible the `wl_cursor` is reloaded while the cursor is animating. - * Don't access outside the lock, that's why the `delay` is passed in. */ - std::mutex *server_mutex = seat->system->server_mutex; - int frame = 0; - while (!anim_handle->exit_pending.load()) { - std::this_thread::sleep_for(std::chrono::milliseconds(delay)); - if (!anim_handle->exit_pending.load()) { - std::lock_guard lock_server_guard{*server_mutex}; - if (!anim_handle->exit_pending.load()) { - const struct wl_cursor *wl_cursor = seat->cursor.wl.theme_cursor; - frame = (frame + 1) % wl_cursor->image_count; - wl_cursor_image *image = wl_cursor->images[frame]; - wl_buffer *buffer = wl_cursor_image_get_buffer(image); - cursor_buffer_set(seat, image, buffer); - delay = wl_cursor->images[frame]->delay; - /* Without this the cursor won't update when other processes are occupied. */ - wl_display_flush(seat->system->wl_display_get()); - } - } - } - delete anim_handle; - }; - - /* Allocate so this can be set before the thread begins. */ - GWL_Cursor_AnimHandle *anim_handle = new GWL_Cursor_AnimHandle; - seat->cursor.anim_handle = anim_handle; - - const int delay = seat->cursor.wl.theme_cursor->images[0]->delay; - std::thread cursor_anim_thread(cursor_anim_frame_step_fn, seat, anim_handle, delay); - /* Application logic should take priority. */ - thread_set_min_priority(cursor_anim_thread); - cursor_anim_thread.detach(); -} - -static void cursor_anim_begin_if_needed(GWL_Seat *seat) -{ - if (cursor_anim_check(seat)) { - cursor_anim_begin(seat); - } -} - -static void cursor_anim_end(GWL_Seat *seat) -{ - GWL_Cursor *cursor = &seat->cursor; - if (cursor->anim_handle) { - GWL_Cursor_AnimHandle *anim_handle = cursor->anim_handle; - cursor->anim_handle = nullptr; - anim_handle->exit_pending.store(true); - } -} - -static void cursor_anim_reset(GWL_Seat *seat) -{ - cursor_anim_end(seat); - cursor_anim_begin_if_needed(seat); -} - -static const wl_cursor *cursor_find_from_shape(GWL_Seat *seat, - const GHOST_TStandardCursor shape, - const char **r_cursor_name) -{ - /* Caller must lock `server_mutex`. */ - GWL_Cursor *cursor = &seat->cursor; - wl_cursor *wl_cursor = nullptr; - - const char *cursor_name = ghost_wl_cursors.names[shape]; - if (cursor_name[0] != '\0') { - if (!cursor->wl.theme) { - /* The cursor wl_surface hasn't entered an output yet. Initialize theme with scale 1. */ - cursor->wl.theme = wl_cursor_theme_load( - cursor->theme_name.c_str(), cursor->theme_size, seat->system->wl_shm_get()); - } - - if (cursor->wl.theme) { - wl_cursor = wl_cursor_theme_get_cursor(cursor->wl.theme, cursor_name); - if (!wl_cursor) { - GHOST_PRINT("cursor '" << cursor_name << "' does not exist" << std::endl); - } - } - } - - if (r_cursor_name && wl_cursor) { - *r_cursor_name = cursor_name; - } - return wl_cursor; -} - GHOST_TSuccess GHOST_SystemWayland::cursor_shape_set(const GHOST_TStandardCursor shape) { /* Caller must lock `server_mutex`. */ @@ -7692,7 +7727,7 @@ GHOST_TSuccess GHOST_SystemWayland::cursor_shape_set(const GHOST_TStandardCursor } const char *cursor_name = nullptr; - const wl_cursor *wl_cursor = cursor_find_from_shape(seat, shape, &cursor_name); + const wl_cursor *wl_cursor = gwl_seat_cursor_find_from_shape(seat, shape, &cursor_name); if (wl_cursor == nullptr) { return GHOST_kFailure; } @@ -7711,7 +7746,7 @@ GHOST_TSuccess GHOST_SystemWayland::cursor_shape_set(const GHOST_TStandardCursor cursor->wl.theme_cursor = wl_cursor; cursor->wl.theme_cursor_name = cursor_name; - cursor_buffer_set_from_seat(seat); + gwl_seat_cursor_buffer_set_current(seat); return GHOST_kSuccess; } @@ -7720,7 +7755,7 @@ GHOST_TSuccess GHOST_SystemWayland::cursor_shape_check(const GHOST_TStandardCurs { /* No need to lock `server_mutex`. */ GWL_Seat *seat = gwl_display_seat_active_get(display_); - const wl_cursor *wl_cursor = cursor_find_from_shape(seat, cursorShape, nullptr); + const wl_cursor *wl_cursor = gwl_seat_cursor_find_from_shape(seat, cursorShape, nullptr); if (wl_cursor == nullptr) { return GHOST_kFailure; } @@ -7800,7 +7835,7 @@ GHOST_TSuccess GHOST_SystemWayland::cursor_shape_custom_set(const uint8_t *bitma cursor->wl.theme_cursor = nullptr; cursor->wl.theme_cursor_name = nullptr; - cursor_buffer_set_from_seat(seat); + gwl_seat_cursor_buffer_set_current(seat); return GHOST_kSuccess; } @@ -7840,7 +7875,7 @@ GHOST_TSuccess GHOST_SystemWayland::cursor_visibility_set(const bool visible) return GHOST_kFailure; } - cursor_visible_set(seat, visible, seat->cursor.is_hardware, CURSOR_VISIBLE_ALWAYS_SET); + gwl_seat_cursor_visible_set(seat, visible, seat->cursor.is_hardware, CURSOR_VISIBLE_ALWAYS_SET); return GHOST_kSuccess; } @@ -8231,15 +8266,31 @@ uint64_t GHOST_SystemWayland::ms_from_input_time(const uint32_t timestamp_as_uin * use `timestamp_as_uint` to calculate an offset which is applied to future events. * This is updated because time may have passed between generating the time-stamp and `now`. * The method here is used by SDL. */ + uint64_t timestamp = uint64_t(timestamp_as_uint); GWL_DisplayTimeStamp &input_timestamp = display_->input_timestamp; - if (timestamp_as_uint < input_timestamp.last) { - /* 32-bit timer rollover, bump the offset. */ - input_timestamp.offset += uint64_t(std::numeric_limits::max()) + 1; + if (UNLIKELY(timestamp_as_uint < input_timestamp.last)) { + /* NOTE(@ideasman42): Sometimes event times are out of order, + * while this should _never_ happen, it occasionally does when resizing the window then + * clicking on the window with GNOME+LIBDECOR. + * Accept events must occur within ~25 days, out-of-order time-stamps above this time-frame + * will be treated as a wrapped integer. */ + if (input_timestamp.last - timestamp_as_uint > std::numeric_limits::max() / 2) { + /* Finally check to avoid invalid rollover, + * ensure the rolled over time is closer to "now" than it is currently. */ + const uint64_t offset_test = input_timestamp.offset + + uint64_t(std::numeric_limits::max()) + 1; + const uint64_t now = getMilliSeconds(); + if (sub_abs_u64(now, timestamp + offset_test) < + sub_abs_u64(now, timestamp + input_timestamp.offset)) + { + /* 32-bit timer rollover, bump the offset. */ + input_timestamp.offset = offset_test; + } + } } input_timestamp.last = timestamp_as_uint; - uint64_t timestamp = uint64_t(timestamp_as_uint); if (input_timestamp.exact_match) { timestamp += input_timestamp.offset; } @@ -8432,7 +8483,7 @@ bool GHOST_SystemWayland::window_cursor_grab_set(const GHOST_TGrabCursorMode mod /* Only hide so the cursor is not made visible before it's location is restored. * This function is called again at the end of this function which only shows. */ - cursor_visible_set(seat, use_visible, is_hardware_cursor, CURSOR_VISIBLE_ONLY_HIDE); + gwl_seat_cursor_visible_set(seat, use_visible, is_hardware_cursor, CURSOR_VISIBLE_ONLY_HIDE); /* Switching from one grab mode to another, * in this case disable the current locks as it makes logic confusing, @@ -8574,7 +8625,7 @@ bool GHOST_SystemWayland::window_cursor_grab_set(const GHOST_TGrabCursorMode mod } /* Only show so the cursor is made visible as the last step. */ - cursor_visible_set(seat, use_visible, is_hardware_cursor, CURSOR_VISIBLE_ONLY_SHOW); + gwl_seat_cursor_visible_set(seat, use_visible, is_hardware_cursor, CURSOR_VISIBLE_ONLY_SHOW); #ifdef USE_GNOME_CONFINE_HACK seat->use_pointer_software_confine = use_software_confine; diff --git a/intern/ghost/intern/GHOST_SystemX11.cc b/intern/ghost/intern/GHOST_SystemX11.cc index 723ac2ed68f..14c140159d0 100644 --- a/intern/ghost/intern/GHOST_SystemX11.cc +++ b/intern/ghost/intern/GHOST_SystemX11.cc @@ -1785,8 +1785,6 @@ GHOST_TCapabilityFlag GHOST_SystemX11::getCapabilities() const { return GHOST_TCapabilityFlag(GHOST_CAPABILITY_FLAG_ALL & ~( - /* No support yet for desktop sampling. */ - GHOST_kCapabilityDesktopSample | /* No support yet for image copy/paste. */ GHOST_kCapabilityClipboardImages | /* No support yet for IME input methods. */ diff --git a/intern/ghost/intern/GHOST_WindowWayland.cc b/intern/ghost/intern/GHOST_WindowWayland.cc index db92aedb6a0..90f450c1d51 100644 --- a/intern/ghost/intern/GHOST_WindowWayland.cc +++ b/intern/ghost/intern/GHOST_WindowWayland.cc @@ -62,29 +62,37 @@ static constexpr size_t base_dpi = 96; #endif #ifdef WITH_GHOST_WAYLAND_LIBDECOR -struct WGL_LibDecor_Window { +struct GWL_LibDecor_Window { libdecor_frame *frame = nullptr; /** - * Used at startup to set the initial window size - * (before fractional scale information is available). + * Store the last size applied from #libdecor_frame_interface::configure + * This is meant to be equivalent of calling: + * `libdecor_frame_get_content_width(frame)` + * `libdecor_frame_get_content_height(frame)` + * However these functions are only available via the plugin API, + * so they need to be stored somewhere. */ - int scale_fractional_from_output = 0; + struct { + int32_t size[2] = {0, 0}; + } applied; /** The window has been configured (see #xdg_surface_ack_configure). */ bool initial_configure_seen = false; + /** The window size has been configured. */ + bool initial_configure_seen_with_size = false; /** The window state has been configured. */ bool initial_state_seen = false; }; -static void gwl_libdecor_window_destroy(WGL_LibDecor_Window *decor) +static void gwl_libdecor_window_destroy(GWL_LibDecor_Window *decor) { libdecor_frame_unref(decor->frame); delete decor; } #endif /* WITH_GHOST_WAYLAND_LIBDECOR */ -struct WGL_XDG_Decor_Window { +struct GWL_XDG_Decor_Window { xdg_surface *surface = nullptr; zxdg_toplevel_decoration_v1 *toplevel_decor = nullptr; xdg_toplevel *toplevel = nullptr; @@ -105,7 +113,7 @@ struct WGL_XDG_Decor_Window { bool initial_configure_seen = false; }; -static void gwl_xdg_decor_window_destroy(WGL_XDG_Decor_Window *decor) +static void gwl_xdg_decor_window_destroy(GWL_XDG_Decor_Window *decor) { if (decor->toplevel_decor) { zxdg_toplevel_decoration_v1_destroy(decor->toplevel_decor); @@ -295,9 +303,9 @@ struct GWL_Window { std::vector outputs; #ifdef WITH_GHOST_WAYLAND_LIBDECOR - WGL_LibDecor_Window *libdecor = nullptr; + GWL_LibDecor_Window *libdecor = nullptr; #endif - WGL_XDG_Decor_Window *xdg_decor = nullptr; + GWL_XDG_Decor_Window *xdg_decor = nullptr; /** * The current value of frame, copied from `frame_pending` when applying updates. @@ -352,13 +360,13 @@ static void gwl_window_title_set(GWL_Window *win, const char *title) { #ifdef WITH_GHOST_WAYLAND_LIBDECOR if (use_libdecor) { - WGL_LibDecor_Window &decor = *win->libdecor; + GWL_LibDecor_Window &decor = *win->libdecor; libdecor_frame_set_title(decor.frame, title); } else #endif { - WGL_XDG_Decor_Window &decor = *win->xdg_decor; + GWL_XDG_Decor_Window &decor = *win->xdg_decor; xdg_toplevel_set_title(decor.toplevel, title); } @@ -669,16 +677,9 @@ static void gwl_window_activate(GWL_Window *win) /** \name Internal #GWL_Window Pending Actions * \{ */ -static void gwl_window_frame_pending_fractional_scale_set(GWL_Window *win, - bool *r_surface_needs_commit, - bool *r_surface_needs_buffer_scale) +static void gwl_window_frame_pending_fractional_scale_set_notest( + GWL_Window *win, bool *r_surface_needs_commit, bool *r_surface_needs_buffer_scale) { - if (win->frame_pending.fractional_scale == win->frame.fractional_scale && - win->frame_pending.buffer_scale == win->frame.buffer_scale) - { - return; - } - if (win->frame_pending.fractional_scale) { win->frame.fractional_scale = win->frame_pending.fractional_scale; gwl_window_viewport_set(win, r_surface_needs_commit, r_surface_needs_buffer_scale); @@ -706,6 +707,19 @@ static void gwl_window_frame_pending_fractional_scale_set(GWL_Window *win, } } +static void gwl_window_frame_pending_fractional_scale_set(GWL_Window *win, + bool *r_surface_needs_commit, + bool *r_surface_needs_buffer_scale) +{ + if (win->frame_pending.fractional_scale == win->frame.fractional_scale && + win->frame_pending.buffer_scale == win->frame.buffer_scale) + { + return; + } + gwl_window_frame_pending_fractional_scale_set_notest( + win, r_surface_needs_commit, r_surface_needs_buffer_scale); +} + static void gwl_window_frame_pending_size_set(GWL_Window *win, bool *r_surface_needs_commit, bool *r_surface_needs_resize_for_backend, @@ -830,7 +844,7 @@ static void gwl_window_frame_update_from_pending_no_lock(GWL_Window *win) } if (win->xdg_decor) { - WGL_XDG_Decor_Window &decor = *win->xdg_decor; + GWL_XDG_Decor_Window &decor = *win->xdg_decor; if (decor.pending.ack_configure) { xdg_surface_ack_configure(decor.surface, decor.pending.ack_configure_serial); /* The XDG spec states a commit event is required after ACK configure. */ @@ -885,7 +899,7 @@ static void gwl_window_frame_update_from_pending_no_lock(GWL_Window *win) win->frame_pending.size[1] = 0; } -static void gwl_window_frame_update_from_pending(GWL_Window *win) +[[maybe_unused]] static void gwl_window_frame_update_from_pending(GWL_Window *win) { #ifdef USE_EVENT_BACKGROUND_THREAD std::lock_guard lock_frame_guard{win->frame_pending_mutex}; @@ -1150,20 +1164,27 @@ static void libdecor_frame_handle_configure(libdecor_frame *frame, }(); # endif - GWL_WindowFrame *frame_pending = &static_cast(data)->frame_pending; + GWL_WindowFrame &frame_pending = static_cast(data)->frame_pending; /* Set the size. */ - int size_decor[2] = { - libdecor_frame_get_content_width(frame), - libdecor_frame_get_content_height(frame), - }; int size_next[2] = {0, 0}; bool has_size = false; + + /* Keep track the current size of window decorations (last set by this function). */ + int size_decor[2] = {0, 0}; + + { + const GWL_Window *win = static_cast(data); + const GWL_LibDecor_Window &decor = *win->libdecor; + if (decor.initial_configure_seen_with_size) { + size_decor[0] = decor.applied.size[0]; + size_decor[1] = decor.applied.size[1]; + } + } + { GWL_Window *win = static_cast(data); - const int fractional_scale = win->frame.fractional_scale ? - win->frame.fractional_scale : - win->libdecor->scale_fractional_from_output; + const int fractional_scale = win->frame.fractional_scale; /* It's important `fractional_scale` has a fractional component or rounding up will fail * to produce the correct whole-number scale. */ GHOST_ASSERT((fractional_scale == 0) || @@ -1177,26 +1198,24 @@ static void libdecor_frame_handle_configure(libdecor_frame *frame, const int scale_as_fractional = scale * FRACTIONAL_DENOMINATOR; if (libdecor_configuration_get_content_size( configuration, frame, &size_next[0], &size_next[1])) { - if (win->frame.fractional_scale) { - win->frame_pending.size[0] = gwl_window_fractional_to_viewport_round(win->frame, - size_next[0]); - win->frame_pending.size[1] = gwl_window_fractional_to_viewport_round(win->frame, - size_next[1]); + if (fractional_scale) { + frame_pending.size[0] = gwl_window_fractional_to_viewport_round(win->frame, size_next[0]); + frame_pending.size[1] = gwl_window_fractional_to_viewport_round(win->frame, size_next[1]); } else if (fractional_scale && (fractional_scale != (scale * FRACTIONAL_DENOMINATOR))) { /* The windows `preferred_scale` is not yet available, * set the size as if fractional scale is available. */ - frame_pending->size[0] = ((size_next[0] * scale) * fractional_scale) / scale_as_fractional; - frame_pending->size[1] = ((size_next[1] * scale) * fractional_scale) / scale_as_fractional; + frame_pending.size[0] = ((size_next[0] * scale) * fractional_scale) / scale_as_fractional; + frame_pending.size[1] = ((size_next[1] * scale) * fractional_scale) / scale_as_fractional; } else { - frame_pending->size[0] = size_next[0] * scale; - frame_pending->size[1] = size_next[1] * scale; + frame_pending.size[0] = size_next[0] * scale; + frame_pending.size[1] = size_next[1] * scale; } /* Account for buffer rounding requirement, once fractional scaling is enabled * the buffer scale will be 1, rounding is a requirement until then. */ - gwl_round_int2_by(frame_pending->size, win->frame.buffer_scale); + gwl_round_int2_by(frame_pending.size, win->frame.buffer_scale); has_size = true; } @@ -1218,25 +1237,15 @@ static void libdecor_frame_handle_configure(libdecor_frame *frame, } } } - -# ifdef USE_EVENT_BACKGROUND_THREAD - /* NOTE(@ideasman42): when running from the event handling thread, - * don't apply the new window size back to LIBDECOR, otherwise the window content - * (which uses a deferred update) and the window get noticeably out of sync. - * Rely on the new `frame_pending->size` to resize the window later. */ - if (is_main_thread == false) { - has_size = false; - } -# endif } /* Set the state. */ { enum libdecor_window_state window_state; if (libdecor_configuration_get_window_state(configuration, &window_state)) { - frame_pending->is_maximised = window_state & LIBDECOR_WINDOW_STATE_MAXIMIZED; - frame_pending->is_fullscreen = window_state & LIBDECOR_WINDOW_STATE_FULLSCREEN; - frame_pending->is_active = window_state & LIBDECOR_WINDOW_STATE_ACTIVE; + frame_pending.is_maximised = window_state & LIBDECOR_WINDOW_STATE_MAXIMIZED; + frame_pending.is_fullscreen = window_state & LIBDECOR_WINDOW_STATE_FULLSCREEN; + frame_pending.is_active = window_state & LIBDECOR_WINDOW_STATE_ACTIVE; } } @@ -1257,18 +1266,23 @@ static void libdecor_frame_handle_configure(libdecor_frame *frame, /* Commit the changes. */ { GWL_Window *win = static_cast(data); - WGL_LibDecor_Window &decor = *win->libdecor; + GWL_LibDecor_Window &decor = *win->libdecor; if (has_size == false) { + /* Keep the current decor size. */ size_next[0] = size_decor[0]; size_next[1] = size_decor[1]; } - libdecor_state *state = libdecor_state_new(UNPACK2(size_next)); - libdecor_frame_commit(frame, state, configuration); - libdecor_state_free(state); + else { + /* Store the new size for later reuse. */ + decor.applied.size[0] = size_next[0]; + decor.applied.size[1] = size_next[1]; + } - /* Only ever use this once, after initial creation: - * #wp_fractional_scale_v1_listener::preferred_scale provides fractional scaling values. */ - decor.scale_fractional_from_output = 0; + if (size_next[0] && size_next[1]) { + libdecor_state *state = libdecor_state_new(UNPACK2(size_next)); + libdecor_frame_commit(frame, state, configuration); + libdecor_state_free(state); + } if (decor.initial_configure_seen == false) { decor.initial_configure_seen = true; @@ -1278,6 +1292,11 @@ static void libdecor_frame_handle_configure(libdecor_frame *frame, decor.initial_state_seen = true; } } + if (decor.initial_configure_seen_with_size == false) { + if (size_next[0] && size_next[1]) { + decor.initial_configure_seen_with_size = true; + } + } } } @@ -1489,25 +1508,18 @@ GHOST_WindowWayland::GHOST_WindowWayland(GHOST_SystemWayland *system, * So leave the buffer scaled up because there is no *guarantee* the fractional scaling support * will run which could result in an incorrect buffer scale. */ int scale_fractional_from_output; - window_->frame.buffer_scale = outputs_uniform_scale_or_default( - system_->outputs_get(), 1, &scale_fractional_from_output); - window_->frame_pending.buffer_scale = window_->frame.buffer_scale; + const int buffer_scale_from_output = outputs_uniform_scale_or_default( + system_->outputs_get(), 0, &scale_fractional_from_output); window_->frame.size[0] = int32_t(width); window_->frame.size[1] = int32_t(height); - /* The window surface must be rounded to the scale, - * failing to do so causes the WAYLAND-server to close the window immediately. */ - gwl_round_int2_by(window_->frame.size, window_->frame.buffer_scale); - window_->is_dialog = is_dialog; /* Window surfaces. */ window_->wl.surface = wl_compositor_create_surface(system_->wl_compositor_get()); ghost_wl_surface_tag(window_->wl.surface); - wl_surface_set_buffer_scale(window_->wl.surface, window_->frame.buffer_scale); - wl_surface_add_listener(window_->wl.surface, &wl_surface_listener, window_); wp_fractional_scale_manager_v1 *fractional_scale_manager = @@ -1529,8 +1541,8 @@ GHOST_WindowWayland::GHOST_WindowWayland(GHOST_SystemWayland *system, #ifdef WITH_GHOST_WAYLAND_LIBDECOR if (use_libdecor) { - window_->libdecor = new WGL_LibDecor_Window; - WGL_LibDecor_Window &decor = *window_->libdecor; + window_->libdecor = new GWL_LibDecor_Window; + GWL_LibDecor_Window &decor = *window_->libdecor; /* create window decorations */ decor.frame = libdecor_decorate( @@ -1541,7 +1553,7 @@ GHOST_WindowWayland::GHOST_WindowWayland(GHOST_SystemWayland *system, libdecor_frame_set_app_id(decor.frame, xdg_app_id); if (parentWindow) { - WGL_LibDecor_Window &decor_parent = + GWL_LibDecor_Window &decor_parent = *dynamic_cast(parentWindow)->window_->libdecor; libdecor_frame_set_parent(decor.frame, decor_parent.frame); } @@ -1549,8 +1561,8 @@ GHOST_WindowWayland::GHOST_WindowWayland(GHOST_SystemWayland *system, else #endif { - window_->xdg_decor = new WGL_XDG_Decor_Window; - WGL_XDG_Decor_Window &decor = *window_->xdg_decor; + window_->xdg_decor = new GWL_XDG_Decor_Window; + GWL_XDG_Decor_Window &decor = *window_->xdg_decor; decor.surface = xdg_wm_base_get_xdg_surface(system_->xdg_decor_shell_get(), window_->wl.surface); decor.toplevel = xdg_surface_get_toplevel(decor.surface); @@ -1562,7 +1574,7 @@ GHOST_WindowWayland::GHOST_WindowWayland(GHOST_SystemWayland *system, xdg_toplevel_add_listener(decor.toplevel, &xdg_toplevel_listener, window_); if (parentWindow && is_dialog) { - WGL_XDG_Decor_Window &decor_parent = + GWL_XDG_Decor_Window &decor_parent = *dynamic_cast(parentWindow)->window_->xdg_decor; xdg_toplevel_set_parent(decor.toplevel, decor_parent.toplevel); } @@ -1578,15 +1590,131 @@ GHOST_WindowWayland::GHOST_WindowWayland(GHOST_SystemWayland *system, /* Causes a glitch with `libdecor` for some reason. */ #ifdef WITH_GHOST_WAYLAND_LIBDECOR if (use_libdecor) { - WGL_LibDecor_Window &decor = *window_->libdecor; - if (fractional_scale_manager && - (gwl_round_int_test(scale_fractional_from_output, FRACTIONAL_DENOMINATOR) == false)) - { - decor.scale_fractional_from_output = scale_fractional_from_output; + /* Pass. */ + } + else +#endif /* WITH_GHOST_WAYLAND_LIBDECOR */ + { + GWL_XDG_Decor_Window &decor = *window_->xdg_decor; + + if (system_->xdg_decor_manager_get()) { + decor.toplevel_decor = zxdg_decoration_manager_v1_get_toplevel_decoration( + system_->xdg_decor_manager_get(), decor.toplevel); + zxdg_toplevel_decoration_v1_add_listener( + decor.toplevel_decor, &xdg_toplevel_decoration_v1_listener, window_); + zxdg_toplevel_decoration_v1_set_mode(decor.toplevel_decor, + ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE); } + /* Commit needed to so configure callback runs. */ + wl_surface_commit(window_->wl.surface); + while (!decor.initial_configure_seen) { + wl_display_flush(system->wl_display_get()); + wl_display_dispatch(system->wl_display_get()); + } + } + + /* If the scale is known early, setup the window scale. + * Otherwise accept an unsightly flicker once the outputs scale can be found. */ + int early_buffer_scale = 0; + int early_fractional_scale = 0; + + if (const int test_fractional_scale = + fractional_scale_manager ? (window_->frame_pending.fractional_scale_preferred ? + window_->frame_pending.fractional_scale_preferred : + scale_fractional_from_output) : + 0) + { + if (!gwl_round_int_test(test_fractional_scale, FRACTIONAL_DENOMINATOR)) { + early_fractional_scale = test_fractional_scale; + } + else { + /* Rounded, use simple integer buffer scaling. */ + early_buffer_scale = test_fractional_scale / FRACTIONAL_DENOMINATOR; + early_fractional_scale = 0; + } + } + else if (buffer_scale_from_output) { + early_buffer_scale = buffer_scale_from_output; + } + + if (early_fractional_scale != 0) { + /* Fractional scale is known. */ + + window_->frame.fractional_scale_preferred = early_fractional_scale; + window_->frame.fractional_scale = early_fractional_scale; + window_->frame.buffer_scale = 1; + + window_->frame_pending.fractional_scale_preferred = early_fractional_scale; + window_->frame_pending.fractional_scale = early_fractional_scale; + window_->frame_pending.buffer_scale = 1; + + /* The scale is considered initialized now. */ + window_->frame_pending.is_scale_init = true; + + /* Always commit and set the scale. */ + bool surface_needs_commit_dummy = false, surface_needs_buffer_scale_dummy = false; + gwl_window_frame_pending_fractional_scale_set_notest( + window_, &surface_needs_commit_dummy, &surface_needs_buffer_scale_dummy); + } + else if (early_buffer_scale != 0) { + /* Non-fractional scale is known. */ + + /* No fractional scale, simple initialization. */ + window_->frame.buffer_scale = early_buffer_scale; + window_->frame_pending.buffer_scale = early_buffer_scale; + + /* The scale is considered initialized now. */ + window_->frame_pending.is_scale_init = true; + + /* The window surface must be rounded to the scale, + * failing to do so causes the WAYLAND-server to close the window immediately. */ + gwl_round_int2_by(window_->frame.size, window_->frame.buffer_scale); + } + else { + /* Scale isn't known (the windows size may flicker when #outputs_changed_update_scale runs). */ + window_->frame.buffer_scale = 1; + window_->frame_pending.buffer_scale = 1; + GHOST_ASSERT(window_->frame_pending.is_scale_init == false, + "An initialized scale is not expected"); + } + + if (window_->frame_pending.is_scale_init) { + /* If the output scale changes here it means the scale settings were not properly set. */ + GHOST_ASSERT(outputs_changed_update_scale() == false, + "Fractional scale was not properly initialized"); + } + + wl_surface_set_buffer_scale(window_->wl.surface, window_->frame.buffer_scale); + +/* Postpone binding the buffer until after it's decor has been configured: + * - Ensure the window is sized properly (with XDG window decorations), see: #113059. + * - Avoids flickering on startup. + */ +#ifdef WITH_OPENGL_BACKEND + if (type == GHOST_kDrawingContextTypeOpenGL) { + window_->backend.egl_window = wl_egl_window_create( + window_->wl.surface, int(window_->frame.size[0]), int(window_->frame.size[1])); + } +#endif +#ifdef WITH_VULKAN_BACKEND + if (type == GHOST_kDrawingContextTypeVulkan) { + window_->backend.vulkan_window_info = new GHOST_ContextVK_WindowInfo; + window_->backend.vulkan_window_info->size[0] = window_->frame.size[0]; + window_->backend.vulkan_window_info->size[1] = window_->frame.size[1]; + } +#endif + + /* Drawing context. */ + if (setDrawingContextType(type) == GHOST_kFailure) { + GHOST_PRINT("Failed to create drawing context" << std::endl); + } + +#ifdef WITH_GHOST_WAYLAND_LIBDECOR + if (use_libdecor) { /* Commit needed so the top-level callbacks run (and `toplevel` can be accessed). */ wl_surface_commit(window_->wl.surface); + GWL_LibDecor_Window &decor = *window_->libdecor; /* Additional round-trip is needed to ensure `xdg_toplevel` is set. */ wl_display_roundtrip(system_->wl_display_get()); @@ -1618,53 +1746,14 @@ GHOST_WindowWayland::GHOST_WindowWayland(GHOST_SystemWayland *system, else #endif /* WITH_GHOST_WAYLAND_LIBDECOR */ { - WGL_XDG_Decor_Window &decor = *window_->xdg_decor; - - if (system_->xdg_decor_manager_get()) { - decor.toplevel_decor = zxdg_decoration_manager_v1_get_toplevel_decoration( - system_->xdg_decor_manager_get(), decor.toplevel); - zxdg_toplevel_decoration_v1_add_listener( - decor.toplevel_decor, &xdg_toplevel_decoration_v1_listener, window_); - zxdg_toplevel_decoration_v1_set_mode(decor.toplevel_decor, - ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE); - } - gwl_window_state_set(window_, state); - - /* Commit needed to so configure callback runs. */ - wl_surface_commit(window_->wl.surface); - while (!decor.initial_configure_seen) { - wl_display_flush(system->wl_display_get()); - wl_display_dispatch(system->wl_display_get()); - } } - /* Postpone binding the buffer until after it's decor has been configured: - * - Ensure the window is sized properly (with XDG window decorations), see: #113059. - * - Avoids flickering on startup. - */ -#ifdef WITH_OPENGL_BACKEND - if (type == GHOST_kDrawingContextTypeOpenGL) { - window_->backend.egl_window = wl_egl_window_create( - window_->wl.surface, int(window_->frame.size[0]), int(window_->frame.size[1])); - } -#endif -#ifdef WITH_VULKAN_BACKEND - if (type == GHOST_kDrawingContextTypeVulkan) { - window_->backend.vulkan_window_info = new GHOST_ContextVK_WindowInfo; - window_->backend.vulkan_window_info->size[0] = window_->frame.size[0]; - window_->backend.vulkan_window_info->size[1] = window_->frame.size[1]; - } -#endif - - /* Commit after setting the buffer. */ + /* Commit after setting the buffer. + * While postponing until after the buffer drawing is context is set + * isn't essential, it reduces flickering. */ wl_surface_commit(window_->wl.surface); - /* Drawing context. */ - if (setDrawingContextType(type) == GHOST_kFailure) { - GHOST_PRINT("Failed to create drawing context" << std::endl); - } - /* Set swap interval to 0 to prevent blocking. */ setSwapInterval(0); } diff --git a/intern/ghost/intern/GHOST_WindowWayland.hh b/intern/ghost/intern/GHOST_WindowWayland.hh index e3f15ecc2f4..71a07573806 100644 --- a/intern/ghost/intern/GHOST_WindowWayland.hh +++ b/intern/ghost/intern/GHOST_WindowWayland.hh @@ -51,6 +51,9 @@ * * - Lock #GWL_Window.frame_pending_mutex before changing window size & frame settings, * this is flushed in #GHOST_WindowWayland::pending_actions_handle. + * + * \note Keep this define as it can be useful to disable threading when troubleshooting + * issues with events. */ #define USE_EVENT_BACKGROUND_THREAD diff --git a/intern/opensubdiv/CMakeLists.txt b/intern/opensubdiv/CMakeLists.txt index f4d6fcdd7aa..00cd6de23d3 100644 --- a/intern/opensubdiv/CMakeLists.txt +++ b/intern/opensubdiv/CMakeLists.txt @@ -10,11 +10,11 @@ set(INC_SYS ) set(SRC - opensubdiv_capi.h - opensubdiv_capi_type.h - opensubdiv_converter_capi.h - opensubdiv_evaluator_capi.h - opensubdiv_topology_refiner_capi.h + opensubdiv_capi.hh + opensubdiv_capi_type.hh + opensubdiv_converter_capi.hh + opensubdiv_evaluator_capi.hh + opensubdiv_topology_refiner_capi.hh ) set(LIB diff --git a/intern/opensubdiv/internal/base/opensubdiv_capi.cc b/intern/opensubdiv/internal/base/opensubdiv_capi.cc index 8bfb6fe54be..3cd6e4e6203 100644 --- a/intern/opensubdiv/internal/base/opensubdiv_capi.cc +++ b/intern/opensubdiv/internal/base/opensubdiv_capi.cc @@ -2,7 +2,7 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ -#include "opensubdiv_capi.h" +#include "opensubdiv_capi.hh" #include "opensubdiv/version.h" #ifdef _MSC_VER # include diff --git a/intern/opensubdiv/internal/base/type_convert.h b/intern/opensubdiv/internal/base/type_convert.h index db6d438a1d3..03f569b3d4b 100644 --- a/intern/opensubdiv/internal/base/type_convert.h +++ b/intern/opensubdiv/internal/base/type_convert.h @@ -14,7 +14,7 @@ #include #include -#include "opensubdiv_capi_type.h" +#include "opensubdiv_capi_type.hh" struct OpenSubdiv_Converter; diff --git a/intern/opensubdiv/internal/evaluator/eval_output.h b/intern/opensubdiv/internal/evaluator/eval_output.h index 6d3c1b6a89d..5eb28ec73fb 100644 --- a/intern/opensubdiv/internal/evaluator/eval_output.h +++ b/intern/opensubdiv/internal/evaluator/eval_output.h @@ -15,7 +15,7 @@ #include "internal/base/type.h" #include "internal/evaluator/evaluator_impl.h" -#include "opensubdiv_evaluator_capi.h" +#include "opensubdiv_evaluator_capi.hh" using OpenSubdiv::Far::PatchTable; using OpenSubdiv::Far::StencilTable; diff --git a/intern/opensubdiv/internal/evaluator/eval_output_gpu.cc b/intern/opensubdiv/internal/evaluator/eval_output_gpu.cc index 0757ee24c4e..237ea914714 100644 --- a/intern/opensubdiv/internal/evaluator/eval_output_gpu.cc +++ b/intern/opensubdiv/internal/evaluator/eval_output_gpu.cc @@ -6,7 +6,7 @@ #include "internal/evaluator/eval_output_gpu.h" -#include "opensubdiv_evaluator_capi.h" +#include "opensubdiv_evaluator_capi.hh" using OpenSubdiv::Osd::PatchArray; using OpenSubdiv::Osd::PatchArrayVector; diff --git a/intern/opensubdiv/internal/evaluator/evaluator_cache_impl.h b/intern/opensubdiv/internal/evaluator/evaluator_cache_impl.h index f25467b8ef3..e1f023cb2d8 100644 --- a/intern/opensubdiv/internal/evaluator/evaluator_cache_impl.h +++ b/intern/opensubdiv/internal/evaluator/evaluator_cache_impl.h @@ -7,7 +7,7 @@ #include "internal/base/memory.h" -#include "opensubdiv_capi_type.h" +#include "opensubdiv_capi_type.hh" struct OpenSubdiv_EvaluatorCacheImpl { public: diff --git a/intern/opensubdiv/internal/evaluator/evaluator_capi.cc b/intern/opensubdiv/internal/evaluator/evaluator_capi.cc index 96960337e94..3301208fb64 100644 --- a/intern/opensubdiv/internal/evaluator/evaluator_capi.cc +++ b/intern/opensubdiv/internal/evaluator/evaluator_capi.cc @@ -4,7 +4,7 @@ * * Author: Sergey Sharybin. */ -#include "opensubdiv_evaluator_capi.h" +#include "opensubdiv_evaluator_capi.hh" #include diff --git a/intern/opensubdiv/internal/evaluator/evaluator_impl.cc b/intern/opensubdiv/internal/evaluator/evaluator_impl.cc index a356851c7c8..0b8ae6f2d2f 100644 --- a/intern/opensubdiv/internal/evaluator/evaluator_impl.cc +++ b/intern/opensubdiv/internal/evaluator/evaluator_impl.cc @@ -28,8 +28,8 @@ #include "internal/evaluator/evaluator_cache_impl.h" #include "internal/evaluator/patch_map.h" #include "internal/topology/topology_refiner_impl.h" -#include "opensubdiv_evaluator_capi.h" -#include "opensubdiv_topology_refiner_capi.h" +#include "opensubdiv_evaluator_capi.hh" +#include "opensubdiv_topology_refiner_capi.hh" using OpenSubdiv::Far::PatchTable; using OpenSubdiv::Far::PatchTableFactory; diff --git a/intern/opensubdiv/internal/evaluator/evaluator_impl.h b/intern/opensubdiv/internal/evaluator/evaluator_impl.h index 8fb7be920a1..c01351ac3ec 100644 --- a/intern/opensubdiv/internal/evaluator/evaluator_impl.h +++ b/intern/opensubdiv/internal/evaluator/evaluator_impl.h @@ -16,7 +16,7 @@ #include "internal/base/memory.h" -#include "opensubdiv_capi_type.h" +#include "opensubdiv_capi_type.hh" struct OpenSubdiv_Buffer; struct OpenSubdiv_EvaluatorCacheImpl; diff --git a/intern/opensubdiv/internal/topology/mesh_topology_compare.cc b/intern/opensubdiv/internal/topology/mesh_topology_compare.cc index f741d0864fd..8ec27261202 100644 --- a/intern/opensubdiv/internal/topology/mesh_topology_compare.cc +++ b/intern/opensubdiv/internal/topology/mesh_topology_compare.cc @@ -12,7 +12,7 @@ #include "internal/base/type.h" -#include "opensubdiv_converter_capi.h" +#include "opensubdiv_converter_capi.hh" namespace blender { namespace opensubdiv { diff --git a/intern/opensubdiv/internal/topology/topology_refiner_capi.cc b/intern/opensubdiv/internal/topology/topology_refiner_capi.cc index e60dbea1a28..6404f6b270f 100644 --- a/intern/opensubdiv/internal/topology/topology_refiner_capi.cc +++ b/intern/opensubdiv/internal/topology/topology_refiner_capi.cc @@ -4,7 +4,7 @@ * * Author: Sergey Sharybin. */ -#include "opensubdiv_topology_refiner_capi.h" +#include "opensubdiv_topology_refiner_capi.hh" #include "MEM_guardedalloc.h" #include "internal/base/type_convert.h" diff --git a/intern/opensubdiv/internal/topology/topology_refiner_factory.cc b/intern/opensubdiv/internal/topology/topology_refiner_factory.cc index 4f3501507a8..0b201970a77 100644 --- a/intern/opensubdiv/internal/topology/topology_refiner_factory.cc +++ b/intern/opensubdiv/internal/topology/topology_refiner_factory.cc @@ -19,7 +19,7 @@ #include "internal/base/type_convert.h" #include "internal/topology/mesh_topology.h" -#include "opensubdiv_converter_capi.h" +#include "opensubdiv_converter_capi.hh" using blender::opensubdiv::min; using blender::opensubdiv::stack; diff --git a/intern/opensubdiv/internal/topology/topology_refiner_impl.h b/intern/opensubdiv/internal/topology/topology_refiner_impl.h index c5aff23e78b..87700a30bd2 100644 --- a/intern/opensubdiv/internal/topology/topology_refiner_impl.h +++ b/intern/opensubdiv/internal/topology/topology_refiner_impl.h @@ -15,7 +15,7 @@ #include "internal/base/memory.h" #include "internal/topology/mesh_topology.h" -#include "opensubdiv_topology_refiner_capi.h" +#include "opensubdiv_topology_refiner_capi.hh" struct OpenSubdiv_Converter; diff --git a/intern/opensubdiv/internal/topology/topology_refiner_impl_compare.cc b/intern/opensubdiv/internal/topology/topology_refiner_impl_compare.cc index 074e442b276..be12808d148 100644 --- a/intern/opensubdiv/internal/topology/topology_refiner_impl_compare.cc +++ b/intern/opensubdiv/internal/topology/topology_refiner_impl_compare.cc @@ -11,7 +11,7 @@ #include "internal/topology/mesh_topology.h" #include "internal/topology/topology_refiner_impl.h" -#include "opensubdiv_converter_capi.h" +#include "opensubdiv_converter_capi.hh" namespace blender { namespace opensubdiv { diff --git a/intern/opensubdiv/opensubdiv_capi.h b/intern/opensubdiv/opensubdiv_capi.h deleted file mode 100644 index c82b81c0cf3..00000000000 --- a/intern/opensubdiv/opensubdiv_capi.h +++ /dev/null @@ -1,28 +0,0 @@ -/* SPDX-FileCopyrightText: 2013 Blender Foundation - * - * SPDX-License-Identifier: GPL-2.0-or-later - * - * Author: Sergey Sharybin. */ - -#ifndef OPENSUBDIV_CAPI_H_ -#define OPENSUBDIV_CAPI_H_ - -#include "opensubdiv_capi_type.h" - -#ifdef __cplusplus -extern "C" { -#endif - -// Global initialization/deinitialization. -// -// Supposed to be called from main thread. -void openSubdiv_init(void); -void openSubdiv_cleanup(void); - -int openSubdiv_getVersionHex(void); - -#ifdef __cplusplus -} -#endif - -#endif // OPENSUBDIV_CAPI_H_ diff --git a/intern/opensubdiv/opensubdiv_capi.hh b/intern/opensubdiv/opensubdiv_capi.hh new file mode 100644 index 00000000000..ca07b549b98 --- /dev/null +++ b/intern/opensubdiv/opensubdiv_capi.hh @@ -0,0 +1,15 @@ +/* SPDX-FileCopyrightText: 2013 Blender Foundation + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#include "opensubdiv_capi_type.hh" + +// Global initialization/deinitialization. +// +// Supposed to be called from main thread. +void openSubdiv_init(); +void openSubdiv_cleanup(); + +int openSubdiv_getVersionHex(); diff --git a/intern/opensubdiv/opensubdiv_capi_type.h b/intern/opensubdiv/opensubdiv_capi_type.hh similarity index 52% rename from intern/opensubdiv/opensubdiv_capi_type.h rename to intern/opensubdiv/opensubdiv_capi_type.hh index 37de7e5842c..ac6170eef8b 100644 --- a/intern/opensubdiv/opensubdiv_capi_type.h +++ b/intern/opensubdiv/opensubdiv_capi_type.hh @@ -1,54 +1,41 @@ /* SPDX-FileCopyrightText: 2013 Blender Foundation * - * SPDX-License-Identifier: GPL-2.0-or-later - * - * Author: Sergey Sharybin. */ + * SPDX-License-Identifier: GPL-2.0-or-later */ -#ifndef OPENSUBDIV_CAPI_TYPES_H_ -#define OPENSUBDIV_CAPI_TYPES_H_ +#pragma once -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum eOpenSubdivEvaluator { +enum eOpenSubdivEvaluator { OPENSUBDIV_EVALUATOR_CPU = 0, OPENSUBDIV_EVALUATOR_GPU = 1, -} eOpenSubdivEvaluator; +}; -typedef enum OpenSubdiv_SchemeType { +enum OpenSubdiv_SchemeType { OSD_SCHEME_BILINEAR, OSD_SCHEME_CATMARK, OSD_SCHEME_LOOP, -} OpenSubdiv_SchemeType; +}; -typedef enum OpenSubdiv_VtxBoundaryInterpolation { +enum OpenSubdiv_VtxBoundaryInterpolation { // Do not interpolate boundaries OSD_VTX_BOUNDARY_NONE, // Sharpen edges. OSD_VTX_BOUNDARY_EDGE_ONLY, // sharpen edges and corners, OSD_VTX_BOUNDARY_EDGE_AND_CORNER, -} OpenSubdiv_VtxBoundaryInterpolation; +}; -typedef enum OpenSubdiv_FVarLinearInterpolation { +enum OpenSubdiv_FVarLinearInterpolation { OSD_FVAR_LINEAR_INTERPOLATION_NONE, OSD_FVAR_LINEAR_INTERPOLATION_CORNERS_ONLY, OSD_FVAR_LINEAR_INTERPOLATION_CORNERS_PLUS1, OSD_FVAR_LINEAR_INTERPOLATION_CORNERS_PLUS2, OSD_FVAR_LINEAR_INTERPOLATION_BOUNDARIES, OSD_FVAR_LINEAR_INTERPOLATION_ALL, -} OpenSubdiv_FVarLinearInterpolation; +}; -typedef struct OpenSubdiv_PatchCoord { +struct OpenSubdiv_PatchCoord { int ptex_face; // Parametric location on patch. float u, v; -} OpenSubdiv_PatchCoord; - -#ifdef __cplusplus -} -#endif - -#endif // OPENSUBDIV_CAPI_TYPES_H_ +}; diff --git a/intern/opensubdiv/opensubdiv_converter_capi.h b/intern/opensubdiv/opensubdiv_converter_capi.hh similarity index 59% rename from intern/opensubdiv/opensubdiv_converter_capi.h rename to intern/opensubdiv/opensubdiv_converter_capi.hh index 60b80f1c64a..188d6fd2c0f 100644 --- a/intern/opensubdiv/opensubdiv_converter_capi.h +++ b/intern/opensubdiv/opensubdiv_converter_capi.hh @@ -1,27 +1,20 @@ /* SPDX-FileCopyrightText: 2015 Blender Foundation * - * SPDX-License-Identifier: GPL-2.0-or-later - * - * Author: Sergey Sharybin. */ + * SPDX-License-Identifier: GPL-2.0-or-later */ -#ifndef OPENSUBDIV_CONVERTER_CAPI_H_ -#define OPENSUBDIV_CONVERTER_CAPI_H_ +#pragma once -#include // for bool +#include // for bool -#include "opensubdiv_capi_type.h" +#include "opensubdiv_capi_type.hh" -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct OpenSubdiv_Converter { - OpenSubdiv_SchemeType (*getSchemeType)(const struct OpenSubdiv_Converter *converter); +struct OpenSubdiv_Converter { + OpenSubdiv_SchemeType (*getSchemeType)(const OpenSubdiv_Converter *converter); OpenSubdiv_VtxBoundaryInterpolation (*getVtxBoundaryInterpolation)( - const struct OpenSubdiv_Converter *converter); + const OpenSubdiv_Converter *converter); OpenSubdiv_FVarLinearInterpolation (*getFVarLinearInterpolation)( - const struct OpenSubdiv_Converter *converter); + const OpenSubdiv_Converter *converter); // Denotes whether this converter specifies full topology, which includes // vertices, edges, faces, vertices+edges of a face and edges/faces of a @@ -32,29 +25,29 @@ typedef struct OpenSubdiv_Converter { // NOTE: Even if converter does not provide full topology, it still needs // to provide number of edges and vertices-of-edge. Those are used to assign // topology tags. - bool (*specifiesFullTopology)(const struct OpenSubdiv_Converter *converter); + bool (*specifiesFullTopology)(const OpenSubdiv_Converter *converter); ////////////////////////////////////////////////////////////////////////////// // Global geometry counters. // Number of faces/edges/vertices in the base mesh. - int (*getNumFaces)(const struct OpenSubdiv_Converter *converter); - int (*getNumEdges)(const struct OpenSubdiv_Converter *converter); - int (*getNumVertices)(const struct OpenSubdiv_Converter *converter); + int (*getNumFaces)(const OpenSubdiv_Converter *converter); + int (*getNumEdges)(const OpenSubdiv_Converter *converter); + int (*getNumVertices)(const OpenSubdiv_Converter *converter); ////////////////////////////////////////////////////////////////////////////// // Face relationships. // Number of vertices the face consists of. - int (*getNumFaceVertices)(const struct OpenSubdiv_Converter *converter, const int face_index); + int (*getNumFaceVertices)(const OpenSubdiv_Converter *converter, const int face_index); // Array of vertex indices the face consists of. - void (*getFaceVertices)(const struct OpenSubdiv_Converter *converter, + void (*getFaceVertices)(const OpenSubdiv_Converter *converter, const int face_index, int *face_vertices); // Array of edge indices the face consists of. // Aligned with the vertex indices array, edge i connects face vertex i // with face index i+1. - void (*getFaceEdges)(const struct OpenSubdiv_Converter *converter, + void (*getFaceEdges)(const OpenSubdiv_Converter *converter, const int face_index, int *face_edges); @@ -62,42 +55,38 @@ typedef struct OpenSubdiv_Converter { // Edge relationships. // Vertices the edge consists of. - void (*getEdgeVertices)(const struct OpenSubdiv_Converter *converter, + void (*getEdgeVertices)(const OpenSubdiv_Converter *converter, const int edge_index, int edge_vertices[2]); // Number of faces which are sharing the given edge. - int (*getNumEdgeFaces)(const struct OpenSubdiv_Converter *converter, const int edge_index); + int (*getNumEdgeFaces)(const OpenSubdiv_Converter *converter, const int edge_index); // Array of face indices which are sharing the given edge. - void (*getEdgeFaces)(const struct OpenSubdiv_Converter *converter, - const int edge, - int *edge_faces); + void (*getEdgeFaces)(const OpenSubdiv_Converter *converter, const int edge, int *edge_faces); // Edge sharpness (aka crease). - float (*getEdgeSharpness)(const struct OpenSubdiv_Converter *converter, const int edge_index); + float (*getEdgeSharpness)(const OpenSubdiv_Converter *converter, const int edge_index); ////////////////////////////////////////////////////////////////////////////// // Vertex relationships. // Number of edges which are adjacent to the given vertex. - int (*getNumVertexEdges)(const struct OpenSubdiv_Converter *converter, const int vertex_index); + int (*getNumVertexEdges)(const OpenSubdiv_Converter *converter, const int vertex_index); // Array fo edge indices which are adjacent to the given vertex. - void (*getVertexEdges)(const struct OpenSubdiv_Converter *converter, + void (*getVertexEdges)(const OpenSubdiv_Converter *converter, const int vertex_index, int *vertex_edges); // Number of faces which are adjacent to the given vertex. - int (*getNumVertexFaces)(const struct OpenSubdiv_Converter *converter, const int vertex_index); + int (*getNumVertexFaces)(const OpenSubdiv_Converter *converter, const int vertex_index); // Array fo face indices which are adjacent to the given vertex. - void (*getVertexFaces)(const struct OpenSubdiv_Converter *converter, + void (*getVertexFaces)(const OpenSubdiv_Converter *converter, const int vertex_index, int *vertex_faces); // Check whether vertex is to be marked as an infinite sharp. // This is a way to make sharp vertices which are adjacent to a loose edges. - bool (*isInfiniteSharpVertex)(const struct OpenSubdiv_Converter *converter, - const int vertex_index); + bool (*isInfiniteSharpVertex)(const OpenSubdiv_Converter *converter, const int vertex_index); // If vertex is not infinitely sharp, this is its actual sharpness. - float (*getVertexSharpness)(const struct OpenSubdiv_Converter *converter, - const int vertex_index); + float (*getVertexSharpness)(const OpenSubdiv_Converter *converter, const int vertex_index); ////////////////////////////////////////////////////////////////////////////// // Face-varying data. @@ -106,7 +95,7 @@ typedef struct OpenSubdiv_Converter { // UV coordinates. // Number of UV layers. - int (*getNumUVLayers)(const struct OpenSubdiv_Converter *converter); + int (*getNumUVLayers)(const OpenSubdiv_Converter *converter); // We need some corner connectivity information, which might not be trivial // to be gathered (might require multiple matching calculations per corver @@ -116,27 +105,21 @@ typedef struct OpenSubdiv_Converter { // complex complex-to-calculate information. // finish() is called after converter is done porting UV layer to OpenSubdiv, // allowing to free cached data. - void (*precalcUVLayer)(const struct OpenSubdiv_Converter *converter, const int layer_index); - void (*finishUVLayer)(const struct OpenSubdiv_Converter *converter); + void (*precalcUVLayer)(const OpenSubdiv_Converter *converter, const int layer_index); + void (*finishUVLayer)(const OpenSubdiv_Converter *converter); // Get number of UV coordinates in the current layer (layer which was // specified in precalcUVLayer(). - int (*getNumUVCoordinates)(const struct OpenSubdiv_Converter *converter); + int (*getNumUVCoordinates)(const OpenSubdiv_Converter *converter); // For the given face index and its corner (known as loop in Blender) // get corresponding UV coordinate index. - int (*getFaceCornerUVIndex)(const struct OpenSubdiv_Converter *converter, + int (*getFaceCornerUVIndex)(const OpenSubdiv_Converter *converter, const int face_index, const int corner_index); ////////////////////////////////////////////////////////////////////////////// // User data associated with this converter. - void (*freeUserData)(const struct OpenSubdiv_Converter *converter); + void (*freeUserData)(const OpenSubdiv_Converter *converter); void *user_data; -} OpenSubdiv_Converter; - -#ifdef __cplusplus -} -#endif - -#endif /* OPENSUBDIV_CONVERTER_CAPI_H_ */ +}; diff --git a/intern/opensubdiv/opensubdiv_evaluator_capi.h b/intern/opensubdiv/opensubdiv_evaluator_capi.hh similarity index 67% rename from intern/opensubdiv/opensubdiv_evaluator_capi.h rename to intern/opensubdiv/opensubdiv_evaluator_capi.hh index 98b51e7a4e5..47a1d9bfc81 100644 --- a/intern/opensubdiv/opensubdiv_evaluator_capi.h +++ b/intern/opensubdiv/opensubdiv_evaluator_capi.hh @@ -1,51 +1,46 @@ /* SPDX-FileCopyrightText: 2013 Blender Foundation * - * SPDX-License-Identifier: GPL-2.0-or-later - * - * Author: Sergey Sharybin. */ + * SPDX-License-Identifier: GPL-2.0-or-later */ -#ifndef OPENSUBDIV_EVALUATOR_CAPI_H_ -#define OPENSUBDIV_EVALUATOR_CAPI_H_ +#pragma once -#include // for uint64_t +#include // for uint64_t -#include "opensubdiv_capi_type.h" - -#ifdef __cplusplus -extern "C" { -#endif +#include "opensubdiv_capi_type.hh" +struct OpenSubdiv_EvaluatorCacheImpl; +struct OpenSubdiv_EvaluatorImpl; struct OpenSubdiv_EvaluatorInternal; struct OpenSubdiv_PatchCoord; struct OpenSubdiv_TopologyRefiner; -typedef struct OpenSubdiv_EvaluatorSettings { +struct OpenSubdiv_EvaluatorSettings { // Number of smoothly interpolated vertex data channels. int num_vertex_data; -} OpenSubdiv_EvaluatorSettings; +}; // Callback type for doing input/output operations on buffers. // Useful to abstract GPU buffers. -typedef struct OpenSubdiv_Buffer { +struct OpenSubdiv_Buffer { // Bind the buffer to the GPU. - void (*bind_gpu)(const struct OpenSubdiv_Buffer *buffer); + void (*bind_gpu)(const OpenSubdiv_Buffer *buffer); // Allocate the buffer directly on the host for the given size in bytes. This has to return // a pointer to the newly allocated memory. - void *(*alloc)(const struct OpenSubdiv_Buffer *buffer, const unsigned int size); + void *(*alloc)(const OpenSubdiv_Buffer *buffer, const unsigned int size); // Allocate the buffer directly on the device for the given size in bytes. - void (*device_alloc)(const struct OpenSubdiv_Buffer *buffer, const unsigned int size); + void (*device_alloc)(const OpenSubdiv_Buffer *buffer, const unsigned int size); // Update the given range of the buffer with new data. - void (*device_update)(const struct OpenSubdiv_Buffer *buffer, + void (*device_update)(const OpenSubdiv_Buffer *buffer, unsigned int start, unsigned int len, const void *data); // Wrap an existing GPU buffer, given its device handle, into the client's buffer type for // read-only use. - void (*wrap_device_handle)(const struct OpenSubdiv_Buffer *buffer, uint64_t device_ptr); + void (*wrap_device_handle)(const OpenSubdiv_Buffer *buffer, uint64_t device_ptr); // Offset in the buffer where the data starts, if a single buffer is used for multiple data // channels. @@ -54,25 +49,25 @@ typedef struct OpenSubdiv_Buffer { // Pointer to the client buffer data, which is modified or initialized through the various // callbacks. void *data; -} OpenSubdiv_Buffer; +}; -typedef struct OpenSubdiv_Evaluator { +struct OpenSubdiv_Evaluator { // Set settings for data buffers used. - void (*setSettings)(struct OpenSubdiv_Evaluator *evaluator, + void (*setSettings)(OpenSubdiv_Evaluator *evaluator, const OpenSubdiv_EvaluatorSettings *settings); // Set coarse positions from a continuous array of coordinates. - void (*setCoarsePositions)(struct OpenSubdiv_Evaluator *evaluator, + void (*setCoarsePositions)(OpenSubdiv_Evaluator *evaluator, const float *positions, const int start_vertex_index, const int num_vertices); // Set vertex data from a continuous array of coordinates. - void (*setVertexData)(struct OpenSubdiv_Evaluator *evaluator, + void (*setVertexData)(OpenSubdiv_Evaluator *evaluator, const float *data, const int start_vertex_index, const int num_vertices); // Set varying data from a continuous array of data. - void (*setVaryingData)(struct OpenSubdiv_Evaluator *evaluator, + void (*setVaryingData)(OpenSubdiv_Evaluator *evaluator, const float *varying_data, const int start_vertex_index, const int num_vertices); @@ -80,7 +75,7 @@ typedef struct OpenSubdiv_Evaluator { // // TODO(sergey): Find a better name for vertex here. It is not the vertex of // geometry, but a vertex of UV map. - void (*setFaceVaryingData)(struct OpenSubdiv_Evaluator *evaluator, + void (*setFaceVaryingData)(OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, const float *face_varying_data, const int start_vertex_index, @@ -89,7 +84,7 @@ typedef struct OpenSubdiv_Evaluator { // Set coarse vertex position from a continuous memory buffer where // first coordinate starts at offset of `start_offset` and there is `stride` // bytes between adjacent vertex coordinates. - void (*setCoarsePositionsFromBuffer)(struct OpenSubdiv_Evaluator *evaluator, + void (*setCoarsePositionsFromBuffer)(OpenSubdiv_Evaluator *evaluator, const void *buffer, const int start_offset, const int stride, @@ -98,7 +93,7 @@ typedef struct OpenSubdiv_Evaluator { // Set varying data from a continuous memory buffer where // first coordinate starts at offset of `start_offset` and there is `stride` // bytes between adjacent vertex coordinates. - void (*setVaryingDataFromBuffer)(struct OpenSubdiv_Evaluator *evaluator, + void (*setVaryingDataFromBuffer)(OpenSubdiv_Evaluator *evaluator, const void *buffer, const int start_offset, const int stride, @@ -110,7 +105,7 @@ typedef struct OpenSubdiv_Evaluator { // // TODO(sergey): Find a better name for vertex here. It is not the vertex of // geometry, but a vertex of UV map. - void (*setFaceVaryingDataFromBuffer)(struct OpenSubdiv_Evaluator *evaluator, + void (*setFaceVaryingDataFromBuffer)(OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, const void *buffer, const int start_offset, @@ -119,11 +114,11 @@ typedef struct OpenSubdiv_Evaluator { const int num_vertices); // Refine after coarse positions update. - void (*refine)(struct OpenSubdiv_Evaluator *evaluator); + void (*refine)(OpenSubdiv_Evaluator *evaluator); // Evaluate given ptex face at given bilinear coordinate. // If derivatives are NULL, they will not be evaluated. - void (*evaluateLimit)(struct OpenSubdiv_Evaluator *evaluator, + void (*evaluateLimit)(OpenSubdiv_Evaluator *evaluator, const int ptex_face_index, float face_u, float face_v, @@ -132,14 +127,14 @@ typedef struct OpenSubdiv_Evaluator { float dPdv[3]); // Evaluate vertex data at a given bilinear coordinate of given ptex face. - void (*evaluateVertexData)(struct OpenSubdiv_Evaluator *evaluator, + void (*evaluateVertexData)(OpenSubdiv_Evaluator *evaluator, const int ptex_face_index, float face_u, float face_v, float data[]); // Evaluate varying data at a given bilinear coordinate of given ptex face. - void (*evaluateVarying)(struct OpenSubdiv_Evaluator *evaluator, + void (*evaluateVarying)(OpenSubdiv_Evaluator *evaluator, const int ptex_face_index, float face_u, float face_v, @@ -147,7 +142,7 @@ typedef struct OpenSubdiv_Evaluator { // Evaluate face-varying data at a given bilinear coordinate of given // ptex face. - void (*evaluateFaceVarying)(struct OpenSubdiv_Evaluator *evaluator, + void (*evaluateFaceVarying)(OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, const int ptex_face_index, float face_u, @@ -160,79 +155,77 @@ typedef struct OpenSubdiv_Evaluator { // If derivatives are NULL, they will not be evaluated. // // NOTE: Output arrays must point to a memory of size float[3]*num_patch_coords. - void (*evaluatePatchesLimit)(struct OpenSubdiv_Evaluator *evaluator, - const struct OpenSubdiv_PatchCoord *patch_coords, + void (*evaluatePatchesLimit)(OpenSubdiv_Evaluator *evaluator, + const OpenSubdiv_PatchCoord *patch_coords, const int num_patch_coords, float *P, float *dPdu, float *dPdv); // Copy the patch map to the given buffers, and output some topology information. - void (*getPatchMap)(struct OpenSubdiv_Evaluator *evaluator, - struct OpenSubdiv_Buffer *patch_map_handles, - struct OpenSubdiv_Buffer *patch_map_quadtree, + void (*getPatchMap)(OpenSubdiv_Evaluator *evaluator, + OpenSubdiv_Buffer *patch_map_handles, + OpenSubdiv_Buffer *patch_map_quadtree, int *min_patch_face, int *max_patch_face, int *max_depth, int *patches_are_triangular); // Fill the given buffer with data from the evaluator's patch array buffer. - void (*fillPatchArraysBuffer)(struct OpenSubdiv_Evaluator *evaluator, - struct OpenSubdiv_Buffer *patch_array_buffer); + void (*fillPatchArraysBuffer)(OpenSubdiv_Evaluator *evaluator, + OpenSubdiv_Buffer *patch_array_buffer); // Fill the given buffer with data from the evaluator's patch index buffer. - void (*wrapPatchIndexBuffer)(struct OpenSubdiv_Evaluator *evaluator, - struct OpenSubdiv_Buffer *patch_index_buffer); + void (*wrapPatchIndexBuffer)(OpenSubdiv_Evaluator *evaluator, + OpenSubdiv_Buffer *patch_index_buffer); // Fill the given buffer with data from the evaluator's patch parameter buffer. - void (*wrapPatchParamBuffer)(struct OpenSubdiv_Evaluator *evaluator, - struct OpenSubdiv_Buffer *patch_param_buffer); + void (*wrapPatchParamBuffer)(OpenSubdiv_Evaluator *evaluator, + OpenSubdiv_Buffer *patch_param_buffer); // Fill the given buffer with data from the evaluator's source buffer. - void (*wrapSrcBuffer)(struct OpenSubdiv_Evaluator *evaluator, - struct OpenSubdiv_Buffer *src_buffer); + void (*wrapSrcBuffer)(OpenSubdiv_Evaluator *evaluator, OpenSubdiv_Buffer *src_buffer); // Fill the given buffer with data from the evaluator's extra source buffer. - void (*wrapSrcVertexDataBuffer)(struct OpenSubdiv_Evaluator *evaluator, - struct OpenSubdiv_Buffer *src_buffer); + void (*wrapSrcVertexDataBuffer)(OpenSubdiv_Evaluator *evaluator, OpenSubdiv_Buffer *src_buffer); // Fill the given buffer with data from the evaluator's face varying patch array buffer. - void (*fillFVarPatchArraysBuffer)(struct OpenSubdiv_Evaluator *evaluator, + void (*fillFVarPatchArraysBuffer)(OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, - struct OpenSubdiv_Buffer *patch_array_buffer); + OpenSubdiv_Buffer *patch_array_buffer); // Fill the given buffer with data from the evaluator's face varying patch index buffer. - void (*wrapFVarPatchIndexBuffer)(struct OpenSubdiv_Evaluator *evaluator, + void (*wrapFVarPatchIndexBuffer)(OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, - struct OpenSubdiv_Buffer *patch_index_buffer); + OpenSubdiv_Buffer *patch_index_buffer); // Fill the given buffer with data from the evaluator's face varying patch parameter buffer. - void (*wrapFVarPatchParamBuffer)(struct OpenSubdiv_Evaluator *evaluator, + void (*wrapFVarPatchParamBuffer)(OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, - struct OpenSubdiv_Buffer *patch_param_buffer); + OpenSubdiv_Buffer *patch_param_buffer); // Fill the given buffer with data from the evaluator's face varying source buffer. - void (*wrapFVarSrcBuffer)(struct OpenSubdiv_Evaluator *evaluator, + void (*wrapFVarSrcBuffer)(OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, - struct OpenSubdiv_Buffer *src_buffer); + OpenSubdiv_Buffer *src_buffer); // Return true if the evaluator has source vertex data set. - bool (*hasVertexData)(struct OpenSubdiv_Evaluator *evaluator); + bool (*hasVertexData)(OpenSubdiv_Evaluator *evaluator); // Implementation of the evaluator. - struct OpenSubdiv_EvaluatorImpl *impl; + OpenSubdiv_EvaluatorImpl *impl; // Type of the evaluator. eOpenSubdivEvaluator type; -} OpenSubdiv_Evaluator; +}; -typedef struct OpenSubdiv_EvaluatorCache { +struct OpenSubdiv_EvaluatorCache { // Implementation of the evaluator cache. - struct OpenSubdiv_EvaluatorCacheImpl *impl; -} OpenSubdiv_EvaluatorCache; + OpenSubdiv_EvaluatorCacheImpl *impl; +}; OpenSubdiv_Evaluator *openSubdiv_createEvaluatorFromTopologyRefiner( - struct OpenSubdiv_TopologyRefiner *topology_refiner, + OpenSubdiv_TopologyRefiner *topology_refiner, eOpenSubdivEvaluator evaluator_type, OpenSubdiv_EvaluatorCache *evaluator_cache); @@ -245,9 +238,3 @@ void openSubdiv_deleteEvaluatorCache(OpenSubdiv_EvaluatorCache *evaluator_cache) // Return the GLSL source code from the OpenSubDiv library used for patch evaluation. // This function is not thread-safe. const char *openSubdiv_getGLSLPatchBasisSource(void); - -#ifdef __cplusplus -} -#endif - -#endif // OPENSUBDIV_EVALUATOR_CAPI_H_ diff --git a/intern/opensubdiv/opensubdiv_topology_refiner_capi.h b/intern/opensubdiv/opensubdiv_topology_refiner_capi.hh similarity index 62% rename from intern/opensubdiv/opensubdiv_topology_refiner_capi.h rename to intern/opensubdiv/opensubdiv_topology_refiner_capi.hh index 3549eccef65..169607c51e6 100644 --- a/intern/opensubdiv/opensubdiv_topology_refiner_capi.h +++ b/intern/opensubdiv/opensubdiv_topology_refiner_capi.hh @@ -1,19 +1,12 @@ /* SPDX-FileCopyrightText: 2018 Blender Foundation * - * SPDX-License-Identifier: GPL-2.0-or-later - * - * Author: Sergey Sharybin. */ + * SPDX-License-Identifier: GPL-2.0-or-later */ -#ifndef OPENSUBDIV_TOPOLOGY_REFINER_CAPI_H_ -#define OPENSUBDIV_TOPOLOGY_REFINER_CAPI_H_ +#pragma once -#include // for bool +#include // for bool -#include "opensubdiv_capi_type.h" - -#ifdef __cplusplus -extern "C" { -#endif +#include "opensubdiv_capi_type.hh" struct OpenSubdiv_Converter; struct OpenSubdiv_TopologyRefinerImpl; @@ -23,19 +16,19 @@ struct OpenSubdiv_TopologyRefinerImpl; // make it possible to ensure we are not trying to abuse same OpenSubdiv's // topology refiner with different subdivision levels or with different // adaptive settings. -typedef struct OpenSubdiv_TopologyRefinerSettings { +struct OpenSubdiv_TopologyRefinerSettings { bool is_adaptive; int level; -} OpenSubdiv_TopologyRefinerSettings; +}; // C-style wrapper around actual topology refiner. // // The only purpose is to allow C-only code to access C++ implementation of the // topology refiner. -typedef struct OpenSubdiv_TopologyRefiner { +struct OpenSubdiv_TopologyRefiner { // Query subdivision level the refiner is created for. - int (*getSubdivisionLevel)(const struct OpenSubdiv_TopologyRefiner *topology_refiner); - bool (*getIsAdaptive)(const struct OpenSubdiv_TopologyRefiner *topology_refiner); + int (*getSubdivisionLevel)(const OpenSubdiv_TopologyRefiner *topology_refiner); + bool (*getIsAdaptive)(const OpenSubdiv_TopologyRefiner *topology_refiner); // NOTE: All queries are querying base level. // @@ -47,28 +40,27 @@ typedef struct OpenSubdiv_TopologyRefiner { ////////////////////////////////////////////////////////////////////////////// // Query basic topology information from base level. - int (*getNumVertices)(const struct OpenSubdiv_TopologyRefiner *topology_refiner); - int (*getNumEdges)(const struct OpenSubdiv_TopologyRefiner *topology_refiner); - int (*getNumFaces)(const struct OpenSubdiv_TopologyRefiner *topology_refiner); + int (*getNumVertices)(const OpenSubdiv_TopologyRefiner *topology_refiner); + int (*getNumEdges)(const OpenSubdiv_TopologyRefiner *topology_refiner); + int (*getNumFaces)(const OpenSubdiv_TopologyRefiner *topology_refiner); - int (*getNumFaceVertices)(const struct OpenSubdiv_TopologyRefiner *topology_refiner, + int (*getNumFaceVertices)(const OpenSubdiv_TopologyRefiner *topology_refiner, const int face_index); - void (*getFaceVertices)(const struct OpenSubdiv_TopologyRefiner *topology_refiner, + void (*getFaceVertices)(const OpenSubdiv_TopologyRefiner *topology_refiner, const int face_index, int *face_vertices_indices); - int (*getNumFaceEdges)(const struct OpenSubdiv_TopologyRefiner *topology_refiner, - const int face_index); - void (*getFaceEdges)(const struct OpenSubdiv_TopologyRefiner *topology_refiner, + int (*getNumFaceEdges)(const OpenSubdiv_TopologyRefiner *topology_refiner, const int face_index); + void (*getFaceEdges)(const OpenSubdiv_TopologyRefiner *topology_refiner, const int face_index, int *face_edges_indices); - void (*getEdgeVertices)(const struct OpenSubdiv_TopologyRefiner *topology_refiner, + void (*getEdgeVertices)(const OpenSubdiv_TopologyRefiner *topology_refiner, const int edge_index, int edge_vertices_indices[2]); - int (*getNumVertexEdges)(const struct OpenSubdiv_TopologyRefiner *topology_refiner, + int (*getNumVertexEdges)(const OpenSubdiv_TopologyRefiner *topology_refiner, const int vertex_index); - void (*getVertexEdges)(const struct OpenSubdiv_TopologyRefiner *topology_refiner, + void (*getVertexEdges)(const OpenSubdiv_TopologyRefiner *topology_refiner, const int vertex_index, int *vertex_edges_indices); @@ -82,9 +74,9 @@ typedef struct OpenSubdiv_TopologyRefiner { // - Quad face consists of a single ptex face. // - N-gons (similar to triangle) consists of N ptex faces, ordered same // way as for triangle. - int (*getNumFacePtexFaces)(const struct OpenSubdiv_TopologyRefiner *topology_refiner, + int (*getNumFacePtexFaces)(const OpenSubdiv_TopologyRefiner *topology_refiner, const int face_index); - int (*getNumPtexFaces)(const struct OpenSubdiv_TopologyRefiner *topology_refiner); + int (*getNumPtexFaces)(const OpenSubdiv_TopologyRefiner *topology_refiner); // Initialize a per-base-face offset measured in ptex face indices. // @@ -92,25 +84,24 @@ typedef struct OpenSubdiv_TopologyRefiner { // faces created for bases faces [0 .. base_face_index - 1]. // // The array must contain at least total number of ptex faces elements. - void (*fillFacePtexIndexOffset)(const struct OpenSubdiv_TopologyRefiner *topology_refiner, + void (*fillFacePtexIndexOffset)(const OpenSubdiv_TopologyRefiner *topology_refiner, int *face_ptex_index_offset); ////////////////////////////////////////////////////////////////////////////// // Face-varying data. // Number of face-varying channels (or how they are called in Blender layers). - int (*getNumFVarChannels)(const struct OpenSubdiv_TopologyRefiner *topology_refiner); + int (*getNumFVarChannels)(const OpenSubdiv_TopologyRefiner *topology_refiner); // Get face-varying interpolation type. OpenSubdiv_FVarLinearInterpolation (*getFVarLinearInterpolation)( - const struct OpenSubdiv_TopologyRefiner *topology_refiner); + const OpenSubdiv_TopologyRefiner *topology_refiner); // Get total number of face-varying values in a particular channel. - int (*getNumFVarValues)(const struct OpenSubdiv_TopologyRefiner *topology_refiner, - const int channel); + int (*getNumFVarValues)(const OpenSubdiv_TopologyRefiner *topology_refiner, const int channel); // Get face-varying value indices associated with a particular face. // // This is an array of indices inside of face-varying array, array elements // are aligned with face corners (or loops in Blender terminology). - const int *(*getFaceFVarValueIndices)(const struct OpenSubdiv_TopologyRefiner *topology_refiner, + const int *(*getFaceFVarValueIndices)(const OpenSubdiv_TopologyRefiner *topology_refiner, const int face_index, const int channel); @@ -118,13 +109,13 @@ typedef struct OpenSubdiv_TopologyRefiner { // Internal use. // Implementation of the topology refiner. - struct OpenSubdiv_TopologyRefinerImpl *impl; -} OpenSubdiv_TopologyRefiner; + OpenSubdiv_TopologyRefinerImpl *impl; +}; // NOTE: Will return NULL in cases of bad topology. // NOTE: Mesh without faces is considered a bad topology. OpenSubdiv_TopologyRefiner *openSubdiv_createTopologyRefinerFromConverter( - struct OpenSubdiv_Converter *converter, const OpenSubdiv_TopologyRefinerSettings *settings); + OpenSubdiv_Converter *converter, const OpenSubdiv_TopologyRefinerSettings *settings); void openSubdiv_deleteTopologyRefiner(OpenSubdiv_TopologyRefiner *topology_refiner); @@ -135,11 +126,4 @@ void openSubdiv_deleteTopologyRefiner(OpenSubdiv_TopologyRefiner *topology_refin // and compare with existing refiner before going into more computationally // complicated parts of subdivision process. bool openSubdiv_topologyRefinerCompareWithConverter( - const OpenSubdiv_TopologyRefiner *topology_refiner, - const struct OpenSubdiv_Converter *converter); - -#ifdef __cplusplus -} -#endif - -#endif // OPENSUBDIV_TOPOLOGY_REFINER_CAPI_H_ + const OpenSubdiv_TopologyRefiner *topology_refiner, const OpenSubdiv_Converter *converter); diff --git a/intern/opensubdiv/stub/opensubdiv_evaluator_stub.cc b/intern/opensubdiv/stub/opensubdiv_evaluator_stub.cc index 92fd23651c3..641f8016e0a 100644 --- a/intern/opensubdiv/stub/opensubdiv_evaluator_stub.cc +++ b/intern/opensubdiv/stub/opensubdiv_evaluator_stub.cc @@ -4,7 +4,7 @@ * * Author: Sergey Sharybin. */ -#include "opensubdiv_evaluator_capi.h" +#include "opensubdiv_evaluator_capi.hh" #include diff --git a/intern/opensubdiv/stub/opensubdiv_stub.cc b/intern/opensubdiv/stub/opensubdiv_stub.cc index af8147aecf0..7a42dd59e99 100644 --- a/intern/opensubdiv/stub/opensubdiv_stub.cc +++ b/intern/opensubdiv/stub/opensubdiv_stub.cc @@ -4,7 +4,7 @@ * * Author: Sergey Sharybin. */ -#include "opensubdiv_capi.h" +#include "opensubdiv_capi.hh" #include diff --git a/intern/opensubdiv/stub/opensubdiv_topology_refiner_stub.cc b/intern/opensubdiv/stub/opensubdiv_topology_refiner_stub.cc index c423edf6555..b6538f293db 100644 --- a/intern/opensubdiv/stub/opensubdiv_topology_refiner_stub.cc +++ b/intern/opensubdiv/stub/opensubdiv_topology_refiner_stub.cc @@ -4,7 +4,7 @@ * * Author: Sergey Sharybin. */ -#include "opensubdiv_topology_refiner_capi.h" +#include "opensubdiv_topology_refiner_capi.hh" #include diff --git a/intern/wayland_dynload/extern/wayland_dynload_libdecor.h b/intern/wayland_dynload/extern/wayland_dynload_libdecor.h index 82afefdf4f4..4e1f206dfdb 100644 --- a/intern/wayland_dynload/extern/wayland_dynload_libdecor.h +++ b/intern/wayland_dynload/extern/wayland_dynload_libdecor.h @@ -21,8 +21,6 @@ WAYLAND_DYNLOAD_FN(libdecor_configuration_get_window_state) WAYLAND_DYNLOAD_FN(libdecor_decorate) WAYLAND_DYNLOAD_FN(libdecor_dispatch) WAYLAND_DYNLOAD_FN(libdecor_frame_commit) -WAYLAND_DYNLOAD_FN(libdecor_frame_get_content_height) -WAYLAND_DYNLOAD_FN(libdecor_frame_get_content_width) WAYLAND_DYNLOAD_FN(libdecor_frame_get_xdg_toplevel) WAYLAND_DYNLOAD_FN(libdecor_frame_map) WAYLAND_DYNLOAD_FN(libdecor_frame_set_app_id) @@ -78,8 +76,6 @@ struct WaylandDynload_Libdecor { void WL_DYN_FN(libdecor_frame_commit)(struct libdecor_frame *frame, struct libdecor_state *state, struct libdecor_configuration *configuration); - int WL_DYN_FN(libdecor_frame_get_content_width)(struct libdecor_frame *frame); - int WL_DYN_FN(libdecor_frame_get_content_height)(struct libdecor_frame *frame); struct xdg_toplevel *WL_DYN_FN(libdecor_frame_get_xdg_toplevel)(struct libdecor_frame *frame); void WL_DYN_FN(libdecor_frame_map)(struct libdecor_frame *frame); void WL_DYN_FN(libdecor_frame_set_app_id)(struct libdecor_frame *frame, const char *app_id); @@ -116,10 +112,6 @@ struct WaylandDynload_Libdecor { # define libdecor_dispatch(...) (*wayland_dynload_libdecor.libdecor_dispatch)(__VA_ARGS__) # define libdecor_frame_commit(...) \ (*wayland_dynload_libdecor.libdecor_frame_commit)(__VA_ARGS__) -# define libdecor_frame_get_content_height(...) \ - (*wayland_dynload_libdecor.libdecor_frame_get_content_height)(__VA_ARGS__) -# define libdecor_frame_get_content_width(...) \ - (*wayland_dynload_libdecor.libdecor_frame_get_content_width)(__VA_ARGS__) # define libdecor_frame_get_xdg_toplevel(...) \ (*wayland_dynload_libdecor.libdecor_frame_get_xdg_toplevel)(__VA_ARGS__) # define libdecor_frame_map(...) (*wayland_dynload_libdecor.libdecor_frame_map)(__VA_ARGS__) diff --git a/locale/languages b/locale/languages index 814b9d51bd8..f0ed5e6aab8 100644 --- a/locale/languages +++ b/locale/languages @@ -17,6 +17,8 @@ 8:French (Français):fr_FR 2:Japanese (日本語):ja_JP 47:Slovak (Slovenčina):sk_SK +41:Vietnamese (Tiếng Việt):vi_VN +13:Simplified Chinese (简体中文):zh_HANS # 0:In Progress: 11:Czech (Čeština):cs_CZ @@ -28,15 +30,13 @@ 12:Portuguese (Português):pt_PT 15:Russian (Русский):ru_RU 18:Ukrainian (Українська):uk_UA -41:Vietnamese (Tiếng Việt):vi_VN -13:Simplified Chinese (简体中文):zh_HANS 14:Traditional Chinese (繁體中文):zh_HANT # 0:Starting: 45:Abkhaz (Аԥсуа бызшәа):ab # Skipped (see IMPORT_LANGUAGES_SKIP in settings.py). #37:Amharic (አማርኛ):am_ET 21:Arabic (ﺔﻴﺑﺮﻌﻟﺍ):ar_EG -# Skipped (see IMPORT_LANGUAGES_SKIP in settings.py). #52:Belarusian (беларуску):be +52:Belarusian (беларуску):be 22:Bulgarian (Български):bg_BG 23:Greek (Ελληνικά):el_GR 35:Esperanto (Esperanto):eo diff --git a/locale/po/ab.po b/locale/po/ab.po index e284146e60a..0399fe79671 100644 --- a/locale/po/ab.po +++ b/locale/po/ab.po @@ -1,7 +1,7 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" "\"POT-Creation-Date: 2019-02-25 20:41:30\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" diff --git a/locale/po/ar.po b/locale/po/ar.po index 16a1c6cf3e9..c8c16e468a0 100644 --- a/locale/po/ar.po +++ b/locale/po/ar.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2016-04-23 22:41+0300\n" "Last-Translator: Yousef Harfoush \n" "Language-Team: Yousef Harfoush, Amine Moussaoui \n" @@ -7373,6 +7373,18 @@ msgid "Whether this path is saved in bookmarks, or generated from OS" msgstr "ﻡﺎﻈﻨﻟﺍ ﻦﻣ ﺓﺪﻟﻮﺘﻤﻟﺍ ﻭﺍ ﻦﻳﻭﺎﻨﻌﻟﺍ ﻲﻓ ﻅﻮﻔﺤﻣ ﺭﺎﺴﻤﻟﺍ ﺍﺬﻫ ﻥﺎﻛ ﺎﻣ ﺍﺫﺍ" +msgid "File Extensions" +msgstr "ﻒﻠﻤﻟﺍ ﺕﺎﺌﻴﻫ" + + +msgid "Operator" +msgstr "ﻞﻣﺎﻋ" + + +msgid "Label" +msgstr "ﻖﺼﻠﻣ" + + msgid "Animations" msgstr "ﺕﺎﻜﻳﺮﺤﺘﻟﺍ" @@ -11899,10 +11911,6 @@ msgid "Node tree consisting of linked nodes used for shading, textures and compo msgstr "ﺐﻴﻛﺮﺘﻟﺍ ﻭ ,ﺔﺠﺴﻧﻷﺍ ,ﻞﻴﻠﻈﺘﻠﻟ ﺔﻣﺪﺨﺘﺴﻤﻟﺍ ﻭ ﺔﻄﺒﺗﺮﻤﻟﺍ ﺪﻘﻌﻟﺍ ﻦﻣ ﺔﻧﻮﻜﻤﻟﺍ ﺓﺪﻘﻌﻟﺍ ﺓﺮﺠﺷ" -msgid "Label" -msgstr "ﻖﺼﻠﻣ" - - msgid "The node tree label" msgstr "ﺓﺪﻘﻌﻟﺍ ﺓﺮﺠﺷ ﻖﺼﻠﻣ" @@ -27689,10 +27697,6 @@ msgid "Falloff Type" msgstr "ﻲﺷﻼﺘﻟﺍ ﻉﻮﻧ" -msgid "Operator" -msgstr "ﻞﻣﺎﻋ" - - msgid "Sharpen" msgstr "ﺩﺎﺣ" @@ -29741,10 +29745,6 @@ msgid "Palette Color" msgstr "ﻥﻮﻠﻟﺍ ﺔﺣﻮﻟ" -msgid "Refraction" -msgstr "ﺭﺎﺴﻜﻧﻻﺍ" - - msgid "Integrator Presets" msgstr "ﻞﻣﺎﻜﻤﻠﻟ ﺔﻘﺒﺴﻤﻟﺍ ﺕﺍﺩﺍﺪﻋﻹﺍ" @@ -32822,10 +32822,6 @@ msgid "Process the render result through the compositing pipeline, if compositin msgstr "ﺔﻠﻌﻔﻣ ﺐﻴﻛﺮﺘﻟﺍ ﺪﻘﻋ ﺖﻧﺎﻛ ﺍﺫﺇ ،ﺐﻴﻛﺮﺘﻟﺍ ﻞﺣﺍﺮﻣ ﺮﺒﻋ ﺮﻴﻴﺼﺘﻟﺍ ﺔﺠﻴﺘﻧ ﺔﺠﻟﺎﻌﻣ" -msgid "File Extensions" -msgstr "ﻒﻠﻤﻟﺍ ﺕﺎﺌﻴﻫ" - - msgid "Add the file format extensions to the rendered file name (eg: filename + .jpg)" msgstr " (jpg. + ﻒﻠﻣ_ﻢﺳﺇ :ﻝﺎﺜﻣ) ﺮﻴّﺼﻤﻟﺍ ﻒﻠﻤﻟﺍ ﻢﺳﺇ ﻰﻟﺇ ﻒﻠﻤﻟﺍ ﺔﺌﻴﻫ ﻒﺿﺃ" @@ -35481,10 +35477,6 @@ msgid "Display vertex-per-face normals as lines" msgstr "ﻁﻮﻄﺨﻛ ﻪﺟﻭ-ﻞﻜﻟ-ﺔﻄﻘﻧ ﻢﻇﺍﻮﻧ ﺽﺮﻋﺇ" -msgid "Stat Vis" -msgstr "ﺔﻴﺋﺎﺼﺣﺇ ﺔﻨﻳﺎﻌﻣ" - - msgid "Display statistical information about the mesh" msgstr "ﻢﺴﺠﻤﻟﺍ ﻦﻋ ﺔﻴﺋﺎﺼﺣﺇ ﺕﺎﻣﻮﻠﻌﻣ ﺽﺮﻋﺇ" @@ -36431,6 +36423,10 @@ msgid "Auto-Step" msgstr "ﻲﺋﺎﻘﻠﺗ ﻡﺪﻘﺗ" +msgid "Refraction" +msgstr "ﺭﺎﺴﻜﻧﻻﺍ" + + msgid "Paths:" msgstr ":ﺕﺍﺭﺎﺴﻤﻟﺍ" diff --git a/locale/po/be.po b/locale/po/be.po new file mode 100644 index 00000000000..5efe0390d70 --- /dev/null +++ b/locale/po/be.po @@ -0,0 +1,360 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" +"PO-Revision-Date: 2023-12-11 10:35+0000\n" +"Last-Translator: Aleh \n" +"Language-Team: Belarusian \n" +"Language: be\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\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 5.0.1" + + +msgid "Shader AOV" +msgstr "Шэйдар АВП" + + +msgid "Valid" +msgstr "Сапраўдны" + + +msgid "Is the name of the AOV conflicting" +msgstr "Ці канфліктуе назва АВП" + + +msgid "Name" +msgstr "Назва" + + +msgid "Name of the AOV" +msgstr "Назва АВП" + + +msgid "Type" +msgstr "Тып" + + +msgid "Data type of the AOV" +msgstr "Тып дадзеных АВП" + + +msgid "Color" +msgstr "Колер" + + +msgid "Value" +msgstr "Значэнне" + + +msgid "List of AOVs" +msgstr "Спіс АВП" + + +msgid "Collection of AOVs" +msgstr "Калекцыя АВП" + + +msgid "Action F-Curves" +msgstr "Ф-крывыя дзеянняў" + + +msgid "Collection of action F-Curves" +msgstr "Калекцыя Ф-крывых дзеянняў" + + +msgid "Action Group" +msgstr "Група дзеянняў" + + +msgid "Groups of F-Curves" +msgstr "Групы Ф-крывых" + + +msgid "Channels" +msgstr "Каналы" + + +msgid "F-Curves in this group" +msgstr "Ф-крывыя ў гэтай групе" + + +msgid "Color Set" +msgstr "Набор колераў" + + +msgid "Custom color set to use" +msgstr "Карыстальніцкі набор колераў для выкарыстання" + + +msgid "Default Colors" +msgstr "Колеры па змаўчанні" + + +msgid "01 - Theme Color Set" +msgstr "01 - Колеравая тэма" + + +msgid "02 - Theme Color Set" +msgstr "02 - Колеравая тэма" + + +msgid "03 - Theme Color Set" +msgstr "03 - Колеравая тэма" + + +msgid "04 - Theme Color Set" +msgstr "04 - Колеравая тэма" + + +msgid "05 - Theme Color Set" +msgstr "05 - Колеравая тэма" + + +msgid "06 - Theme Color Set" +msgstr "06 - Колеравая тэма" + + +msgid "07 - Theme Color Set" +msgstr "07 - Колеравая тэма" + + +msgid "08 - Theme Color Set" +msgstr "08 - Колеравая тэма" + + +msgid "09 - Theme Color Set" +msgstr "09 - Колеравая тэма" + + +msgid "10 - Theme Color Set" +msgstr "10 - Колеравая тэма" + + +msgid "11 - Theme Color Set" +msgstr "11 - Колеравая тэма" + + +msgid "12 - Theme Color Set" +msgstr "12 - Колеравая тэма" + + +msgid "13 - Theme Color Set" +msgstr "13 - Колеравая тэма" + + +msgid "14 - Theme Color Set" +msgstr "14 - Колеравая тэма" + + +msgid "15 - Theme Color Set" +msgstr "15 - Колеравая тэма" + + +msgid "16 - Theme Color Set" +msgstr "16 - Колеравая тэма" + + +msgid "17 - Theme Color Set" +msgstr "17 - Колеравая тэма" + + +msgid "18 - Theme Color Set" +msgstr "18 - Колеравая тэма" + + +msgid "19 - Theme Color Set" +msgstr "19 - Колеравая тэма" + + +msgid "20 - Theme Color Set" +msgstr "20 - Колеравая тэма" + + +msgid "Custom Color Set" +msgstr "Карыстальніцкі набор колераў" + + +msgid "Colors" +msgstr "Колеры" + + +msgid "Copy of the colors associated with the group's color set" +msgstr "Копія колераў, асацыяваных з наборам колераў групы" + + +msgid "Color set is user-defined instead of a fixed theme color set" +msgstr "Набор колераў, зададзены карыстальнікам, замест фіксаванай колеравай тэмы" + + +msgid "Lock" +msgstr "Заблакаваць" + + +msgid "Action group is locked" +msgstr "Група дзеянняў заблакавана" + + +msgid "Mute" +msgstr "Прыглушыць" + + +msgid "Action group is muted" +msgstr "Група дзеянняў прыглушана" + + +msgid "Select" +msgstr "Выбраць" + + +msgid "Action group is selected" +msgstr "Група дзеянняў выбрана" + + +msgid "Expanded" +msgstr "Разгорнуты" + + +msgid "Action group is expanded except in graph editor" +msgstr "Група дзеянняў разгорнута, акрамя рэдактара графаў" + + +msgid "Expanded in Graph Editor" +msgstr "Разгорнута ў рэдактары графаў" + + +msgid "Action group is expanded in graph editor" +msgstr "Група дзеянняў разгорнута ў рэдактары графаў" + + +msgid "Pin in Graph Editor" +msgstr "Прышпіліць у рэдактары графаў" + + +msgid "Action Groups" +msgstr "Групы дзеянняў" + + +msgid "Collection of action groups" +msgstr "Калекцыя груп дзеянняў" + + +msgid "Action Pose Markers" +msgstr "Маркеры поз дзеянняў" + + +msgid "Collection of timeline markers" +msgstr "Калекцыя маркераў шкалы часу" + + +msgid "Active Pose Marker" +msgstr "Актыўны маркер позы" + + +msgid "Active pose marker for this action" +msgstr "Актыўны маркер позы для гэтага дзеяння" + + +msgid "Active Pose Marker Index" +msgstr "Індэкс актыўнага маркера позы" + + +msgid "Index of active pose marker" +msgstr "Індэкс актыўнага маркера позы" + + +msgid "Add-on" +msgstr "Дадатак" + + +msgid "Python add-ons to be loaded automatically" +msgstr "Дадаткі Python, якія будуць загружацца аўтаматычна" + + +msgid "Module" +msgstr "Модуль" + + +msgid "Module name" +msgstr "Назва модуля" + + +msgid "Add-on Preferences" +msgstr "Налады дадатка" + + +msgid "Password" +msgstr "Пароль" + + +msgid "E-mail address" +msgstr "Адрасы электроннай пошты" + + +msgid "Error Message" +msgstr "Паведамленне аб памылцы" + + +msgid "Message" +msgstr "Паведамленне" + + +msgid "Compute Device Type" +msgstr "Тып вылічальнай прылады" + + +msgid "Device to use for computation (rendering with Cycles)" +msgstr "Прылада, якая выкарыстоўваецца для вылічэння (рэндэрынг з дапамогай Cycles)" + + +msgid "Kernel Optimization" +msgstr "Аптымізацыя ядра" + + +msgid "Kernels can be optimized based on scene content. Optimized kernels are requested at the start of a render. If optimized kernels are not available, rendering will proceed using generic kernels until the optimized set is available in the cache. This can result in additional CPU usage for a brief time (tens of seconds)" +msgstr "Ядры могуць быць аптымізаваныя на грунце змесціва сцэны. Аптымізаваныя ядры запытваюцца ў пачатку рэндэрынгу. Калі аптымізаваныя ядры недаступныя, рэндэрынг будзе адбывацца з выкарыстаннем агульных ядраў, пакуль аптымізаваны набор не будзе даступны ў кэшы. Гэта можа прывесці да дадатковага выкарыстання ЦП на кароткі час (дзясяткі секундаў)" + + +msgid "Off" +msgstr "Выключана" + + +msgid "Disable kernel optimization. Slowest rendering, no extra background CPU usage" +msgstr "Адключэнне аптымізацыі ядра. Самы павольны рэндэрынг, без дадатковай фонавай загрузкі ЦП" + + +msgid "Intersection only" +msgstr "Толькі перасячэнні" + + +msgid "Optimize only intersection kernels. Faster rendering, negligible extra background CPU usage" +msgstr "Аптымізацыя толькі ядраў перасячэння. Больш хуткі рэндэрынг, нязначнае дадатковае выкарыстанне ЦП ў фонавым рэжыме" + + +msgid "Full" +msgstr "Поўнае" + + +msgid "Optimize all kernels. Fastest rendering, may result in extra background CPU usage" +msgstr "Аптымізацыя ўсіх ядраў. Самы хуткі рэндэрынг, можа прывесці да дадатковай загрузцы ЦП ў фонавым рэжыме" + + +msgid "MetalRT" +msgstr "MetalRT" + + +msgid "MetalRT for ray tracing uses less memory for scenes which use curves extensively, and can give better performance in specific cases" +msgstr "MetalRT выкарыстоўвае менш памяці для трасіроўкі прамянёў у сцэнах, якія актыўна выкарыстоўваюць крывыя, і можа даць лепшую прадукцыйнасць у пэўных выпадках" + + +msgid "On" +msgstr "Уключана" + + +msgid "Import Paths" +msgstr "Шляхі імпарту" + diff --git a/locale/po/bg.po b/locale/po/bg.po index e2c3385421c..96d701e540b 100644 --- a/locale/po/bg.po +++ b/locale/po/bg.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2023-09-26 10:37+0000\n" "Last-Translator: Gilberto Rodrigues \n" "Language-Team: Bulgarian \n" diff --git a/locale/po/ca.po b/locale/po/ca.po index 874486b4bdc..8840d597fcd 100644 --- a/locale/po/ca.po +++ b/locale/po/ca.po @@ -1,10 +1,10 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" -"PO-Revision-Date: 2023-12-04 05:17+0000\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" +"PO-Revision-Date: 2023-12-09 14:02+0000\n" "Last-Translator: Joan Pujolar \n" "Language-Team: Catalan \n" "Language: ca\n" @@ -407,6 +407,14 @@ msgid "Display glTF UI to manage animations" msgstr "Mostrar la IU de glTF per gestionar animacions" +msgid "glTFpack file path" +msgstr "Ruta de document glTFpack" + + +msgid "Path to gltfpack binary" +msgstr "Ruta a binari glTFpack" + + msgid "Displays glTF Material Output node in Shader Editor (Menu Add > Output)" msgstr "Mostra el node de material glTF egressat a l'editor d'aspecte (Menú afegir > egressió)" @@ -584,7 +592,7 @@ msgstr "Magatzem d'acció en mode retoc" msgid "Slot to temporarily hold the main action while in tweak mode" -msgstr "Epígraf on es reté temporalment l'acció principal mentre s'està en mode ajustament" +msgstr "Franja on es reté temporalment l'acció principal mentre s'està en mode ajustament" msgid "Drivers" @@ -1463,6 +1471,10 @@ msgid "Custom" msgstr "Esprés" +msgid "Show assets from the asset libraries configured in the Preferences" +msgstr "Mostra els recursos de les biblioteques de recursos configurades a les Preferències" + + msgid "ID Name" msgstr "Nom d'ID" @@ -3300,7 +3312,7 @@ msgstr "[Land Persona Space]: El radi d'espai personal dels eixams en terra (% d msgid "Landing Smoothness" -msgstr "Suavitat de l'aterratge" +msgstr "Suavitat d'aterratge" msgid "How smoothly the boids land" @@ -4625,7 +4637,7 @@ msgstr "Emplenar" msgid "Eraser Soft" -msgstr "Esborrador suau" +msgstr "Esborrador feble" msgid "Eraser Hard" @@ -6621,7 +6633,7 @@ msgstr "Superposició" msgid "Soft Light" -msgstr "Llum suau" +msgstr "Llum feble" msgid "Linear Light" @@ -9616,7 +9628,7 @@ msgstr "Col·lecció de punts de perfil" msgid "Curve Slice" -msgstr "Llesca de corba" +msgstr "Llenca de corba" msgid "A single curve from a curves data-block" @@ -10244,7 +10256,7 @@ msgstr "[Source]: Bloc d'IDs que representa les dades d'origen, normalment ID_SC msgid "Sort Data-Blocks" -msgstr "Ordenar bocs de dades" +msgstr "Ordenar blocs de dades" msgid "Alphabetically sorts data-blocks - mainly objects in the scene (disable to increase viewport speed)" @@ -10621,7 +10633,7 @@ msgstr "Eix Z" msgid "Smooth Radius" -msgstr "Radi suau" +msgstr "Radi suavitzat" msgid "Smooth falloff added after solid radius" @@ -10633,7 +10645,7 @@ msgstr "Força d'esborrall" msgid "Smudge effect strength" -msgstr "[Smudge Strength]: Força de l'efecte d'esborrallar" +msgstr "[Smudge Strength]: Força de l'efecte esborrallar" msgid "Solid Radius" @@ -11110,7 +11122,7 @@ msgstr "Usar encongiment" msgid "Process shrink effect (shrink paint areas)" -msgstr "[Use Shrink]: Processa efecte d'encongiment (redueix les àrees de pintura)" +msgstr "[Use Shrink]: Processa efecte d'encongiment (redueix les àrees de pintat)" msgid "Use Spread" @@ -11142,7 +11154,7 @@ msgstr "Factor d'afebliment d'ona" msgid "Smoothness" -msgstr "Suavitat" +msgstr "Suavització" msgid "Limit maximum steepness of wave slope between simulation points (use higher values for smoother waves at expense of reduced detail)" @@ -13143,6 +13155,18 @@ msgid "Whether this path is saved in bookmarks, or generated from OS" msgstr "Indica si la ruta està desada entre les dreceres o ha estat generada pel SO" +msgid "File Extensions" +msgstr "Extensions de document" + + +msgid "Operator" +msgstr "Operador" + + +msgid "Label" +msgstr "Etiqueta" + + msgid "File Select Entry" msgstr "Entrada de selecció de document" @@ -13828,7 +13852,7 @@ msgstr "Mètode d'interpolació per a volums de fum/foc en mode sòlid" msgid "Good smoothness and speed" -msgstr "Bona suavitzat i rapidesa" +msgstr "Bona suavitat i rapidesa" msgid "Cubic" @@ -13836,7 +13860,7 @@ msgstr "Cúbica" msgid "Smoothed high quality interpolation, but slower" -msgstr "Interpolació suau d'alta qualitat, però més lenta" +msgstr "Interpolació suavitzada d'alta qualitat, però més lenta" msgid "Closest" @@ -14357,19 +14381,19 @@ msgstr "Ajusta la direcció dels fragments segons la direcció de la vista" msgid "Slice along the X axis" -msgstr "Fragmenta al llarg de l'eix X" +msgstr "Fragmentar seguint eix X" msgid "Slice along the Y axis" -msgstr "Fragmenta al llarg de l'eix Y" +msgstr "Fragmentar seguint eix Y" msgid "Slice along the Z axis" -msgstr "Fragmenta al llarg de l'eix Z" +msgstr "Fragmentar seguint eix Z" msgid "Position of the slice" -msgstr "Posició del fragment" +msgstr "Ubicació del fragment" msgid "Slice Per Voxel" @@ -14737,11 +14761,11 @@ msgstr "[Use Noise]: Activa el soroll de fluid (utilitzant amplificació)" msgid "Slice" -msgstr "Fracciona" +msgstr "Fragmentar" msgid "Perform a single slice of the domain object" -msgstr "[Slice]: Realitza un únic fraccionament de l'objecte de domini" +msgstr "[Slice]: Realitza una sola fragmentació de l'objecte de domini" msgid "Speed Vectors" @@ -15661,11 +15685,11 @@ msgstr "[Ridges and Valleys]: Activa crestes i valls" msgid "Face Smoothness" -msgstr "Suavitat de cares" +msgstr "Suavitzat de cares" msgid "Take face smoothness into account in view map calculation" -msgstr "[Face Smoothness]: Té en compte la suavitat de cara en al càlcul del mapa de visió" +msgstr "[Face Smoothness]: Té en compte el suavitzat de cara en el càlcul del mapa de visió" msgid "Suggestive Contours" @@ -16137,7 +16161,7 @@ msgstr "Mostrar pells de ceba l'abans i després del fotograma actual" msgid "Solo Mode" -msgstr "Mode solo" +msgstr "Mode exclusiu" msgid "In Draw Mode only display layers with keyframe in current frame" @@ -17718,7 +17742,7 @@ msgstr "Quadrat invers" msgctxt "Curve" msgid "Sharp" -msgstr "Agut" +msgstr "Sobtat" msgctxt "Curve" @@ -18680,7 +18704,7 @@ msgstr "[Keep Shape]: Intenta mantenir la forma globalment" msgid "Shrinkwrap Modifier" -msgstr "Modificador Sobrecobert" +msgstr "Modificador Sobrecobrir" msgid "Shrink wrapping modifier to shrink wrap and object to a target" @@ -18828,7 +18852,7 @@ msgstr "[Merge]: Simplifica el traç tot fusionant els vèrtexs que estan a una msgid "Sharp Threshold" -msgstr "Llindar agut" +msgstr "Llindar d'agudesa" msgid "Preserve corners that have sharper angle than this threshold" @@ -18848,7 +18872,7 @@ msgstr "[Smooth Modifier]: Modificador amb efecte suavitzador" msgid "Amount of smooth to apply" -msgstr "Intensitat de suavitat a aplicar" +msgstr "Intensitat de suavitzat a aplicar" msgid "Number of times to apply smooth (high numbers can reduce fps)" @@ -19917,7 +19941,7 @@ msgstr "Usar el mode de fusió de superposició mentre es pinta" msgid "Use Soft Light blending mode while painting" -msgstr "Usar el mode de fusió de llum suau mentre es pinta" +msgstr "Usar el mode de fusió de llum feble mentre es pinta" msgid "Use Hard Light blending mode while painting" @@ -20306,7 +20330,7 @@ msgstr "Arrel" msgctxt "Curves" msgid "Sharp" -msgstr "Aguda" +msgstr "Contrastat" msgctxt "Curves" @@ -20316,7 +20340,7 @@ msgstr "Lineal" msgctxt "Curves" msgid "Sharper" -msgstr "Més aguda" +msgstr "Més contrastat" msgctxt "Curves" @@ -20598,7 +20622,7 @@ msgstr "Suavitzar els colors amb el color de mitjana sota el pinzell" msgid "Smudge colors by grabbing and dragging them" -msgstr "Esborrallar colors quan en agafar i arrossegar" +msgstr "Esborrallar colors en agafar i arrossegar-los" msgid "Replace the color of stroke points that already have a color applied" @@ -20676,7 +20700,7 @@ msgstr "Eina de pintar imatges" msgctxt "Brush" msgid "Soften" -msgstr "Suavitzar" +msgstr "Ablanir" msgctxt "Brush" @@ -20787,7 +20811,7 @@ msgstr "Màscara textura" msgid "Mask Texture Slot" -msgstr "[Mask Texture]: Casella per a la màscara de textura" +msgstr "[Mask Texture]: Posella per a la màscara de textura" msgctxt "Mask" @@ -21049,7 +21073,7 @@ msgstr "Rotar" msgctxt "Brush" msgid "Slide Relax" -msgstr "Moderar pendent" +msgstr "Lliscar i destensar" msgctxt "Brush" @@ -21092,7 +21116,7 @@ msgstr "Color secundari" msgid "Threshold below which, no sharpening is done" -msgstr "Llindar sota el qual no es fa cap angle més agut" +msgstr "Llindar sota el qual no es fa més contrastat" msgid "Show Cursor Preview" @@ -21256,7 +21280,7 @@ msgstr "[Texture Sample Bias]: Valor afegit a les mostres de textura" msgid "Texture Slot" -msgstr "Epígraf de textura" +msgstr "Posella de textura" msgid "Tilt Strength" @@ -21288,7 +21312,7 @@ msgstr "Rasclet topològic" msgid "Automatically align edges to the brush direction to generate cleaner topology and define sharp features. Best used on low-poly meshes as it has a performance impact" -msgstr "[Topology Rake]: Alinea automàticament les arestes en la direcció del pinzell per tal de generar una topologia més polida i definir fesomies més destacades. Millor usar-ho per a malles de baix poligonat, ja que impacta en el rendiment" +msgstr "[Topology Rake]: Alinea automàticament les arestes en la direcció del pinzell per tal de generar una topologia més polida i definir les fesomies més destacades. Millor usar-ho per a malles de baix poligonat, ja que impacta en el rendiment" msgid "Unprojected Radius" @@ -21516,11 +21540,11 @@ msgstr "[Use Pressure for Hardness]: Utilitza la pressió per modular la duresa" msgid "Inverse Smooth Pressure" -msgstr "Pressió suau inversa" +msgstr "Pressió suavitzat invers" msgid "Lighter pressure causes more smoothing to be applied" -msgstr "[Inverse Smooth Pressure]: Una pressió més suau fa que s'hafi d'aplicar més suavitzat" +msgstr "[Inverse Smooth Pressure]: Una pressió més suau fa que s'apliqui més suavitzat" msgid "Radius Unit" @@ -23119,7 +23143,7 @@ msgstr "[Truncate]: Escapça el text que sortiria fora dels quadres de text" msgid "Shear" -msgstr "Inclinació" +msgstr "Estrebament" msgid "Italic angle of the characters" @@ -23259,7 +23283,7 @@ msgstr "Textura activa" msgid "Active texture slot being displayed" -msgstr "[Active Texture]: Epígraf de la textura activa que s'està mostrant" +msgstr "[Active Texture]: Posella amb la textura activa que s'està mostrant" msgid "Active Texture Index" @@ -23267,7 +23291,7 @@ msgstr "Índex de textura activa" msgid "Index of active texture slot" -msgstr "Índex de l'epígraf de la textura activa" +msgstr "Índex de la posella de textura activa" msgid "Alpha Transparency" @@ -23587,7 +23611,7 @@ msgstr "Ordenació" msgid "Select the sort order" -msgstr "[Sort Order]: Selecciona d'ordre en què es vol posar" +msgstr "[Sort Order]: Selecciona l'ordre en què es vol posar" msgid "Default order of the sort key" @@ -24455,7 +24479,7 @@ msgstr "Píxels d'imatge del regulador de memòria en valors de coma flotant" msgid "Render Slots" -msgstr "Epígrafs de revelat" +msgstr "Poselles de revelat" msgid "Render slots of the image" @@ -24910,7 +24934,7 @@ msgstr "[Shadow Color]: Color de les ombres que irradia la llum" msgid "Shadow Soft Size" -msgstr "Mida suavitzat d'ombra" +msgstr "Mida d'ombra feble" msgid "Light size for ray shadow sampling (Raytraced shadows)" @@ -24918,7 +24942,7 @@ msgstr "[Shadow Soft Size]: Mida de la llum per al mostreig de rajos associats a msgid "Shadow Softness Factor" -msgstr "Factor suavitat d'ombra" +msgstr "Factor feblesa d'ombra" msgid "Scale light shape for smaller penumbra" @@ -25563,7 +25587,7 @@ msgstr "Índex del pintat de textura actiu" msgid "Index of active texture paint slot" -msgstr "[Active Paint Texture Index]: Epígraf de l'índex del pintat de textura actiu" +msgstr "[Active Paint Texture Index]: Índex de la posella de pintat de textura activa" msgid "Clone Paint Texture Index" @@ -25571,7 +25595,7 @@ msgstr "Clonar - Índex de pintat de textura" msgid "Index of clone texture paint slot" -msgstr "[Clone Texture Paint Index]: Epígraf d'índex del pintat de textura per clonar" +msgstr "[Clone Texture Paint Index]: Índex de la posella del pintat de textura per clonar" msgid "Index number for the \"Material Index\" render pass" @@ -25739,7 +25763,7 @@ msgstr "Permet la transparència de colors, però és incompatible amb les passa msgid "Texture Slot Images" -msgstr "Imatges dels epígrafs de textures" +msgstr "Imatges de les poselles de textures" msgid "Texture images used for texture painting" @@ -26014,6 +26038,14 @@ msgid "Mirror the left/right vertex groups when painting. The symmetry axis is d msgstr "[Mirror Vertex Groups]: Emmiralla els grups de vèrtexs esquerra/dreta mentre es pinta. L'eix de simetria es determina amb la paràmetres de simetria" +msgid "Bone Selection" +msgstr "Selecció d'ossos" + + +msgid "Bone selection during painting" +msgstr "Selecció d'ossos durant el pintat" + + msgid "Paint Mask" msgstr "Màscara de pintar" @@ -26238,10 +26270,6 @@ msgid "Node tree consisting of linked nodes used for shading, textures and compo msgstr "Arbre de nodes que consisteix en nodes enllaçats utilitzats per a l'aspecte, textures i compositació" -msgid "Label" -msgstr "Etiqueta" - - msgid "The node tree label" msgstr "[Label]: Etiqueta d'arbre de nodes" @@ -28041,15 +28069,15 @@ msgstr "[Mass]: Massa de les partícules" msgid "Index of material slot used for rendering particles" -msgstr "Índex de l'epígraf del material usat per a revelar les partícules" +msgstr "Índex de la posella del material usat per a revelar les partícules" msgid "Material Slot" -msgstr "Epígraf de material" +msgstr "Posella del material" msgid "Material slot used for rendering particles" -msgstr "[Material Slot]: Epígraf del material usat per a revelar les partícules" +msgstr "[Material Slot]: Posella del material emprat per a revelar les partícules" msgid "Dummy" @@ -28986,7 +29014,7 @@ msgstr "No sincronitzar, reproduir cada fotograma" msgid "Frame Dropping" -msgstr "Excloure fotogrames" +msgstr "Exclusió de fotogrames" msgid "Drop frames if playback is too slow" @@ -29014,7 +29042,7 @@ msgstr "Paràmetres d'eines" msgid "Transform Orientation Slots" -msgstr "Transformació caselles d'orientació" +msgstr "Opcions de transformació d'orientacions" msgid "Unit Settings" @@ -29802,11 +29830,11 @@ msgstr "Tipus de soroll" msgid "Soft" -msgstr "Suau" +msgstr "Feble" msgid "Generate soft noise (smooth transitions)" -msgstr "[Soft]: Genera soroll suau (transicions suaus)" +msgstr "[Soft]: Genera soroll feble (transicions suaus)" msgid "Hard" @@ -30108,7 +30136,7 @@ msgstr "Usa marbre tou" msgid "Sharp" -msgstr "Brusc" +msgstr "Contrastat" msgid "Use more clearly defined marble" @@ -30116,7 +30144,7 @@ msgstr "Usa marbre més definit" msgid "Sharper" -msgstr "Més brusc" +msgstr "Més contrastat" msgid "Use very clearly defined marble" @@ -34669,7 +34697,7 @@ msgstr "Índex del mostrari de línies actiu" msgid "Index of active line set slot" -msgstr "Índex de l'epígraf del mostrari de línies actiu" +msgstr "Índex de l'epígraf actiu del mostrari de línies" msgid "Loop Colors" @@ -36106,7 +36134,7 @@ msgstr "[Index of this loop triangle]: Índexs dels bucles de malla que formen e msgid "Material slot index of this triangle" -msgstr "Índex de l'epígraf de material d'aquest triangle" +msgstr "Índex dels epígrafs de material d'aquest triangle" msgid "Triangle Normal" @@ -36202,7 +36230,7 @@ msgstr "[Loop Total]: Nombre de bucles que hi ha en la cara" msgid "Material slot index of this face" -msgstr "Índex d'epígraf de material de la cara" +msgstr "Índex dels epígrafs de material de la cara" msgid "Polygon Normal" @@ -36298,11 +36326,11 @@ msgstr "Protrusió mín" msgid "Sharpness Max" -msgstr "Agudesa màx" +msgstr "Contrast màx" msgid "Sharpness Min" -msgstr "Agudesa mín" +msgstr "Contrast mín" msgid "Thickness Max" @@ -37146,7 +37174,7 @@ msgstr "Usar pesos de grups de vèrtexs per seleccionar si es bisellen vèrtexs msgid "Loop Slide" -msgstr "Desplaçar bucle" +msgstr "Escórrer bucles" msgid "Prefer sliding along edges to having even widths" @@ -38881,7 +38909,7 @@ msgstr "Mantenir cantells" msgid "Smooth boundaries, but corners are kept sharp" -msgstr "[Keep Corners]: Suavitza els límits, però els cantells es mantenen escairats" +msgstr "[Keep Corners]: Suavitza els límits, però els cantells es mantenen aguts" msgid "Smooth boundaries, including corners" @@ -38969,11 +38997,11 @@ msgstr "[UV Smooth]: Controla com s'aplica el suavitzat als UVs" msgid "UVs are not smoothed, boundaries are kept sharp" -msgstr "Els UVs no se suavitzen, els límits es mantenen ben marcats" +msgstr "Els UVs no se suavitzen, els límits es mantenen ben contrastats" msgid "UVs are smoothed, corners on discontinuous boundary are kept sharp" -msgstr "Els UVs se suavitzen, els cantells en els contorns discontinus es mantenen escairats" +msgstr "Els UVs se suavitzen, els cantells en els contorns discontinus es mantenen cantelluts" msgid "Keep Corners, Junctions" @@ -38981,7 +39009,7 @@ msgstr "Mantenir cantells, confluències" msgid "UVs are smoothed, corners on discontinuous boundary and junctions of 3 or more regions are kept sharp" -msgstr "[Keep Corners, Junctions]: Se suavitzen els UVs, mentre que es mantenen escairats els contorns discontinus i confluències de 3 o més regions" +msgstr "[Keep Corners, Junctions]: Se suavitzen els UVs, mentre que es mantenen cantelluts els contorns discontinus i confluències de 3 o més regions" msgid "Keep Corners, Junctions, Concave" @@ -38989,7 +39017,7 @@ msgstr "Mantenir cantells, confluències, concavats" msgid "UVs are smoothed, corners on discontinuous boundary, junctions of 3 or more regions and darts and concave corners are kept sharp" -msgstr "[Keep Corners, Junctions, Concave]: Se suavitzen els UVs, els cantells en contorns discontinus, les confluències de 3 o més regions i les pinces i cantells còncaus es mantenen afuats" +msgstr "[Keep Corners, Junctions, Concave]: Se suavitzen els UVs, els cantells en contorns discontinus, les confluències de 3 o més regions i les pinces i cantells còncaus es mantenen cantelluts" msgid "Keep Boundaries" @@ -38997,7 +39025,7 @@ msgstr "Mantenir límits" msgid "UVs are smoothed, boundaries are kept sharp" -msgstr "[Keep Boundaries]: Se suavitzen els UVs, es mantenen afuats els límits" +msgstr "[Keep Boundaries]: Se suavitzen els UVs, es mantenen contrastats els límits" msgid "UVs and boundaries are smoothed" @@ -39245,7 +39273,7 @@ msgstr "Resolució de la superfície generada per a revelar i precuinar" msgid "Sharpen peak" -msgstr "Aguditzar pics" +msgstr "Aguditzar pic" msgid "Peak sharpening for 'JONSWAP' and 'TMA' models" @@ -39538,7 +39566,7 @@ msgstr "[Blocks]: Egressa una superfície cantelluda sense suavitzar" msgid "Output a smooth surface with no sharp-features detection" -msgstr "Egressa una superfície llisa sense elements destacats" +msgstr "Egressa una superfície llisa sense la detecció d'elements cantelluts" msgid "Output a surface that reproduces sharp edges and corners from the input mesh" @@ -39562,7 +39590,7 @@ msgstr "Relació de la dimensió més gran del model sobre la mida de la graella msgid "Sharpness" -msgstr "Agudesa" +msgstr "Constrast" msgid "Tolerance for outliers; lower values filter noise while higher values will reproduce edges closer to the input" @@ -39578,11 +39606,11 @@ msgstr "Suprimir desconnectats" msgid "Smooth Shading" -msgstr "Aspecte suau" +msgstr "Suavitzar aspecte" msgid "Output faces with smooth shading rather than flat shaded" -msgstr "[Smooth Shading]: Egressa cares d'aspecte suau preferiblement a no aplanat" +msgstr "[Smooth Shading]: Egressa cares d'aspecte suavitzat preferiblement a no aplanat" msgid "Screw Modifier" @@ -39759,7 +39787,7 @@ msgstr "[Skin Modifier]: Genera pell" msgid "Branch Smoothing" -msgstr "Suavitzar branques" +msgstr "Suavitzat de branques" msgid "Smooth complex geometry around branches" @@ -40055,7 +40083,7 @@ msgstr "Usar superfície límit" msgid "Place vertices at the surface that would be produced with infinite levels of subdivision (smoothest possible shape)" -msgstr "[Use Limit Surface]: Col·loca els vèrtexs a la superfície que es produirien amb nivells infinits de subdivisió (forma més suau possible)" +msgstr "[Use Limit Surface]: Col·loca els vèrtexs a la superfície que es produirien amb nivells infinits de subdivisió (forma més suavitzada possible)" msgid "SurfaceDeform Modifier" @@ -43834,11 +43862,11 @@ msgstr "Tipus de filtre" msgid "Soften" -msgstr "Suavitzar" +msgstr "Afeblir" msgid "Box Sharpen" -msgstr "Contrastar polígons" +msgstr "Contrastar caixa" msgid "An aggressive sharpening filter" @@ -43846,11 +43874,11 @@ msgstr "[Box Sharpen]: Un filtre de contrastat agressiu" msgid "Diamond Sharpen" -msgstr "Rebaixat amb diamant" +msgstr "Aguditzar amb diamant" msgid "A moderate sharpening filter" -msgstr "Un filtre de rebaixat moderat" +msgstr "Un filtre d'aguditzat moderat" msgid "Laplace" @@ -44107,7 +44135,7 @@ msgstr "Controla com de direccional és el filtre. 0 vol dir que el filtre és t msgid "Controls the sharpness of the filter. 0 means completely smooth while 1 means completely sharp" -msgstr "Controla l'exactitud del filtre. 0 vol dir totalment flexible mentre que 1 vol dir totalment estricte" +msgstr "Controla l'agudesa del filtre. 0 vol dir totalment suabitzat mentre que 1 vol dir totalment cantellut" msgid "Uniformity" @@ -44678,11 +44706,11 @@ msgstr "[Base Path]: Ruta base d'egressió per a la imatge" msgid "File Slots" -msgstr "Epígrafs de documents" +msgstr "Borns de documents" msgid "EXR Layer Slots" -msgstr "[File Slots]: Epígrafs de les capes EXR" +msgstr "[File Slots]: Borns de les capes EXR" msgid "Pixelate" @@ -44834,7 +44862,7 @@ msgstr "Apagat: primer born, engegat: segon born" msgid "Switch View" -msgstr "Canviar visualització" +msgstr "Canviar visionat" msgid "Node Output" @@ -46101,11 +46129,11 @@ msgstr "[Curve Tilt]: Extreu l'angle de cada punt de control utilitzat per rosca msgid "Is Edge Smooth" -msgstr "És cantell suabitzat" +msgstr "És cantell suavitzat" msgid "Retrieve whether each edge is marked for smooth or split normals" -msgstr "[Is Edge Smooth]: Extreu si cada cantell està assenyalat per a normals suaus o separades" +msgstr "[Is Edge Smooth]: Extreu si cada cantell està assenyalat per a normals suavitzades o separades" msgid "Retrieve a stable random identifier value from the \"id\" attribute on the point domain, or the index if the attribute does not exist" @@ -46241,11 +46269,11 @@ msgstr "Extreu la dada temporal en l'animació de l'escena en unitats de segons msgid "Is Face Smooth" -msgstr "És cara suau" +msgstr "És cara suavitzada" msgid "Retrieve whether each face is marked for smooth or sharp normals" -msgstr "[Is Shade Smooth]: Extreu si cada cara està assenyalada com de normals suaus of separades" +msgstr "[Is Shade Smooth]: Extreu si cada cara està assenyalada com de normals suavitzades o agudes" msgid "Shortest Edge Paths" @@ -46657,7 +46685,7 @@ msgstr "Índex d'inspecció" msgid "Iteration index that is used by inspection features like the viewer node or socket inspection" -msgstr "Índex d'iteració que usen les funcions d'inspecció com el node de visualització o la inspecció del sòcol" +msgstr "Índex d'iteració que usen les funcions d'inspecció com el node de visionat o la inspecció dels borns" msgid "Replace Material" @@ -46937,7 +46965,7 @@ msgstr "Especificar aspecte com a suavitzat" msgid "Control the smoothness of mesh normals around each face by changing the \"shade smooth\" attribute" -msgstr "[Set Shade Smooth]: Controla la suavitat de les normals de malla al voltant de cada cara amb el canvi de l'atribut «aspecte suau»" +msgstr "[Set Shade Smooth]: Controla el suavitzat de les normals de malla al voltant de cada cara amb el canvi de l'atribut «aspecte suavitzat»" msgid "Set Spline Cyclic" @@ -46968,10 +46996,6 @@ msgid "Simulation Output" msgstr "Sortida de simulació" -msgid " Output data from the simulation zone" -msgstr " Dades d'egressió des de la zona de simulació" - - msgid "Spline Length" msgstr "Longitud de spline" @@ -47004,10 +47028,6 @@ msgid "Create separate geometries containing the elements from the same group" msgstr "[Split to Instances]: Crea geometries separades que contenen els elements del mateix grup" -msgid "Attribute domain for the selection and group id inputs" -msgstr "Domini d'atribut per a la selecció i ingressions d'id de grup" - - msgid "Store Named Attribute" msgstr "Guardar atribut amb nom" @@ -47109,7 +47129,7 @@ msgstr "[Subdivide Mesh]: Divideix les cares de malla en cares més petites sens msgid "Divide mesh faces to form a smooth surface, using the Catmull-Clark subdivision method" -msgstr "Divideix les cares de malla per formar una superfície suau, amb l'ús del mètode de subdivisió Catmull-Clark" +msgstr "Divideix les cares de malla per formar una superfície suavitzada, amb l'ús del mètode de subdivisió Catmull-Clark" msgid "Switch between two inputs" @@ -47302,7 +47322,7 @@ msgstr "Redireccionar" msgid "A single-socket organization tool that supports one input and multiple outputs" -msgstr "[Reroute]: Una eina d'organització d'un sol circuit que admet una ingressió i múltiples egressions" +msgstr "[Reroute]: Una eina d'organització d'un sol born que admet una ingressió i múltiples egressions" msgid "Shader Node" @@ -47894,7 +47914,7 @@ msgstr "Pas més suau" msgid "Smoother Hermite edge interpolation between From Min and From Max values" -msgstr "[Smoother Step]: Interpolació d'Hermite més suau de la vora entre els valors Des de mínim i Des de màxim" +msgstr "[Smoother Step]: Interpolació d'Hermite més suavitzada de la vora entre els valors Des de mínim i Des de màxim" msgid "Transform the input vector by applying translation, rotation, and scale" @@ -48503,7 +48523,7 @@ msgstr "Resultat més desigual (varia amb la ubicació), més similar a un terre msgid "Create sharp peaks" -msgstr "Crea pics afuats" +msgstr "Crear pics aguts" msgid "Create peaks and valleys with different roughness values" @@ -48807,7 +48827,7 @@ msgstr "Calcula la distància al segon punt més proper, així com la seva posic msgid "Smooth F1" -msgstr "F1 suau" +msgstr "F1 suavitzat" msgid "Smoothed version of F1. Weighted sum of neighbor voronoi cells" @@ -49391,15 +49411,15 @@ msgstr "Col·lecció d'enllaços de nodes" msgid "Output File Slot" -msgstr "Epígraf del document d'egressió" +msgstr "Born del document d'egressió" msgid "Single layer file slot of the file output node" -msgstr "[Output File Slot]: Inscripció de document unicapa per al node del document d'egressió" +msgstr "[Output File Slot]: Born de document unicapa per al node del document d'egressió" msgid "Subpath used for this slot" -msgstr "Subruta usada per a aquest epígraf" +msgstr "Subruta usada per a aquest born" msgid "Save as Render" @@ -49415,15 +49435,15 @@ msgstr "Usar format de node" msgid "Output File Layer Slot" -msgstr "Epígraf de capa de document d'egressió" +msgstr "Born de capa de document d'egressió" msgid "Multilayer slot of the file output node" -msgstr "Epígraf multicapa del node de document d'egressió" +msgstr "Born multicapa del node de document d'egressió" msgid "OpenEXR layer name used for this slot" -msgstr "Nom de capa OpenEXR usada per a aquest epígraf" +msgstr "Nom de capa OpenEXR usada per a aquest born" msgid "Node Outputs" @@ -49483,11 +49503,11 @@ msgstr "Diamant amb punt interior" msgid "Enable the socket" -msgstr "Activa el born" +msgstr "Activar born" msgid "Hide the socket" -msgstr "Amaga el born" +msgstr "Amagar born" msgid "Hide Value" @@ -49507,7 +49527,7 @@ msgstr "Enllaçat" msgid "True if the socket is connected" -msgstr "[Linked]: Ver si el born té connexió" +msgstr "[Linked]: Ver si el born està connectat" msgid "Multi Input" @@ -49623,7 +49643,7 @@ msgstr "Born numèric enter d'un node" msgid "Material Node Socket" -msgstr "Sòcol de node de material" +msgstr "Born de node de material" msgid "Material socket of a node" @@ -49647,11 +49667,11 @@ msgstr "Born de valors de rotació d'un node" msgid "Shader Node Socket" -msgstr "Born de node d'aspector" +msgstr "Born de node aspector" msgid "Shader socket of a node" -msgstr "Born d'aspector d'un node" +msgstr "Born d'un node d'aspecte" msgid "String Node Socket" @@ -49659,7 +49679,7 @@ msgstr "Born de node de cadena" msgid "String socket of a node" -msgstr "Born de cadena d'un node" +msgstr "Born de node d'una cadena" msgid "Texture Node Socket" @@ -49667,15 +49687,15 @@ msgstr "Born del node de textura" msgid "Texture socket of a node" -msgstr "Born de textura d'un node" +msgstr "Born d'un node de textura" msgid "Vector Node Socket" -msgstr "Sòcol de node de vector" +msgstr "Born de node de vector" msgid "3D vector socket of a node" -msgstr "Born vectorial 3D d'un node" +msgstr "Born d'un node vectorial 3D" msgid "Virtual Node Socket" @@ -49683,7 +49703,7 @@ msgstr "Born de node virtual" msgid "Virtual socket of a node" -msgstr "Born virtual d'un node" +msgstr "Born d'un node virtual" msgid "Node Tree Interface" @@ -50812,7 +50832,7 @@ msgstr "Desvincular acció" msgid "Unlink this action from the active action slot (and/or exit Tweak Mode)" -msgstr "[Unlink Action]: Desenllaça aquesta acció des de l'epígraf d'acció activa (i/o surt del mode de retocat)" +msgstr "[Unlink Action]: Desenllaça aquesta acció des de la posella d'acció activa (i/o surt del mode de retocat)" msgid "Force Delete" @@ -51435,10 +51455,6 @@ msgid "Isolate" msgstr "Isolar" -msgid "Hides all other F-Curves other than the ones being framed" -msgstr "Amaga totes corbes-F que no s'estiguin emmarcant" - - msgctxt "Operator" msgid "Align Bones" msgstr "Alinear ossos" @@ -51682,11 +51698,6 @@ msgid "Name of the bone collection to unassign this bone from; empty to unassign msgstr "Nom de la col·lecció d'ossos d'on desassignar aquest os; buit per desassignar de la col·lecció activa" -msgctxt "Operator" -msgid "Remove Bone from Bone collections" -msgstr "Suprimir os de les col·leccions d'ossos" - - msgid "Unassign the bone from this bone collection" msgstr "Desassigna l'os d'aquesta col·lecció d'ossos" @@ -52395,7 +52406,7 @@ msgstr "Eliminar la regla d'eixam vigent" msgctxt "Operator" msgid "Move Down Boid Rule" -msgstr "Moure avall la regla d'eixam" +msgstr "Abaixar regla d'eixam" msgid "Move boid rule down in the list" @@ -52404,7 +52415,7 @@ msgstr "[Move Down Boid Rule]: Mou la regla d'eixam més avall de la llista" msgctxt "Operator" msgid "Move Up Boid Rule" -msgstr "Moure amunt la regla d'eixam" +msgstr "Elevar la regla d'eixam" msgid "Move boid rule up in the list" @@ -53564,11 +53575,11 @@ msgstr "Desplaçament en unitats de coma flotant, 1,0 és l'amplada i l'alçada msgctxt "Operator" msgid "Slide Plane Marker" -msgstr "Marcador de pla delimitat" +msgstr "Marcador de lliscament de pla" msgid "Slide plane marker areas" -msgstr "[Slide Plane Marker]: Àrees marcades delimitant un pla" +msgstr "[Slide Plane Marker]: Àrees marcades de seplaçament d'un pla" msgctxt "Operator" @@ -54692,7 +54703,7 @@ msgstr "Traduir temps" msgid "Time Slide" -msgstr "Ajust de temps" +msgstr "Lliscament de temps" msgid "Time Extend" @@ -54704,11 +54715,11 @@ msgstr "Precuinar període" msgid "Edge Slide" -msgstr "Desplaçament d'aresta" +msgstr "Corriment d'aresta" msgid "Sequence Slide" -msgstr "Lliscador de seqüència" +msgstr "Lliscament de seqüència" msgid "Grease Pencil Opacity" @@ -55115,7 +55126,7 @@ msgstr "[Shade Flat]: Especifica l'aspecte com a aplanat" msgctxt "Operator" msgid "Shade Smooth" -msgstr "Aspecte suavitzat" +msgstr "Aspectar suavitzat" msgid "Set shading to smooth" @@ -55137,7 +55148,7 @@ msgstr "[Smooth]: Aplana els angles dels punts seleccionats" msgctxt "Operator" msgid "Smooth Curve Radius" -msgstr "Suavitzar radi de" +msgstr "Suavitzar radi de corba" msgid "Interpolate radii of selected points" @@ -56269,11 +56280,11 @@ msgstr "Bits de quantificació per a valors normals (0 = sense quantificació)" msgid "Position quantization bits" -msgstr "Bits de quantificació de posició" +msgstr "Bits de quantificació d'ubicació" msgid "Quantization bits for position values (0 = no quantization)" -msgstr "Bits de quantificació per als valors de posició (0 = sense quantificació)" +msgstr "Bits de quantificació per als valors d'ubicació (0 = sense quantificació)" msgid "Texcoord quantization bits" @@ -56324,6 +56335,106 @@ msgid "Clips animations to selected playback range" msgstr "[Limit to Playback Range]: Retalla les animacions a l'interval seleccionat perquè es reprodueixi" +msgid "Disable Quantization" +msgstr "Desactivar quantitficació" + + +msgid "Disable quantization; produces much larger glTF files with no extensions" +msgstr "Desactiva la quantificació; produeix documents glTF molt més grans i sense extensions" + + +msgid "Aggressive Mesh Simplification" +msgstr "Simplificació de malla agressiva" + + +msgid "Aggressively simplify to the target ratio disregarding quality" +msgstr "Simplifica agressivament a la proporció buscada sense tenir en compte la qualitat" + + +msgid "Mesh Simplification Ratio" +msgstr "Proporció de simplificació de malla" + + +msgid "Simplify meshes targeting triangle count ratio" +msgstr "Simplifica les malles recorrent a les proporcions de nombres de triangles" + + +msgid "Lock Mesh Border Vertices" +msgstr "Bloqueja els vèrtexs de la vora de la malla" + + +msgid "Lock border vertices during simplification to avoid gaps on connected meshes" +msgstr "Bloqueja els vèrtexs de contron durant la simplificació per evitar buits a les malles connectades" + + +msgid "KTX2 Compression" +msgstr "Compressió KTX2" + + +msgid "Convert all textures to KTX2 with BasisU supercompression" +msgstr "Convertir totes les textures a KTX2 amb la supercompressió BasisU" + + +msgid "Texture Encoding Quality" +msgstr "Qualitat de codificació de textura" + + +msgid "Texture encoding quality" +msgstr "Qualitat de codificació de la textura" + + +msgid "Vertex Color Quantization" +msgstr "Quantificació de color de vèrtex" + + +msgid "Use N-bit quantization for colors" +msgstr "Usa una quantificació per als colors de N bits" + + +msgid "Normal/Tangent Quantization" +msgstr "Quantificació de normal/tangent" + + +msgid "Use N-bit quantization for normals and tangents" +msgstr "Usa una quantificació de N bits per a normals i tangents" + + +msgid "Position Quantization" +msgstr "Quantificació d'ubicació" + + +msgid "Use N-bit quantization for positions" +msgstr "Usar quantificació de N bits per a ubicacions" + + +msgid "Vertex Position Attributes" +msgstr "Atributs d'ubicació de vèrtex" + + +msgid "Type to use for vertex position attributes" +msgstr "Tipus a emprar per als atributs d'ubicació de vèrtex" + + +msgid "Use integer attributes for positions" +msgstr "Usar atributs enters per a les ubicacions" + + +msgid "Use normalized attributes for positions" +msgstr "Usar atributs normalitzats per a les ubicacions" + + +msgid "Use floating-point attributes for positions" +msgstr "Usar atributs de coma flotant per a les ubicacions" + + +msgid "Texture Coordinate Quantization" +msgstr "Quantificació de coordenades de textura" + + +msgid "Use N-bit quantization for texture coordinates" +msgstr "Usar quantificació de N bits per a coordenades de textura" + + msgid "Geometry Nodes Instances (Experimental)" msgstr "Instàncies de nodes de geometria (experimental)" @@ -56541,11 +56652,11 @@ msgstr "[Negative Frames]: Els fotogrames negatius es desplacen o retallen" msgid "Slide" -msgstr "Desplaçar" +msgstr "Lliscar" msgid "Slide animation to start at frame 0" -msgstr "[Slide]: Desplaça la animació perquè comenci en el fotograma 0" +msgstr "[Slide]: Desplaça l'animació perquè comenci en el fotograma 0" msgid "Keep only frames above frame 0" @@ -56680,6 +56791,14 @@ msgid "Export image texture nodes not assigned to any material. This feature is msgstr "Exporta els nodes de d'imatge textura no assignats a cap material. Aquesta característica no és estàndard, requereix una extensió externa per incloure's al document glTF" +msgid "Use Gltfpack" +msgstr "Emprar Gltfpack" + + +msgid "Use gltfpack to simplify the mesh and/or compress its textures" +msgstr "Empra gltfpack per simplificar la malla i/o comprimir-ne les textures" + + msgid "+Y Up" msgstr "+Y amunt" @@ -60122,7 +60241,7 @@ msgstr "Invertir colors" msgid "Switch tint colors" -msgstr "[Flip Colors]: Capgira la cromaticitat" +msgstr "[Flip Colors]: Inverteix la cromaticitat" msgctxt "Operator" @@ -60783,7 +60902,7 @@ msgstr "Sigma" msgid "The shape of the gaussian distribution, lower values make it sharper" -msgstr "La forma de la distribució gaussiana, els valors inferiors la fan més aguda" +msgstr "La forma de la distribució gaussiana, els valors inferiors la fan més contrastada" msgctxt "Operator" @@ -61277,6 +61396,10 @@ msgid "Enter/Exit draw mode for grease pencil" msgstr "[Grease Pencil Draw Mode Toggle]: Entra/Surt del mode de dibuix per al llapis de greix" +msgid "Duplicate the selected points" +msgstr "Duplicar punts seleccionats" + + msgid "Duplicate" msgstr "Duplicar" @@ -61289,6 +61412,15 @@ msgid "Insert a blank frame in all editable layers" msgstr "Inserir un fotograma en blanc en totes les capes editables" +msgctxt "Operator" +msgid "Set Active Layer" +msgstr "Consignar capa activa" + + +msgid "Set the active Grease Pencil layer" +msgstr "Consignar la capa activa de Llapis de greix" + + msgid "Add a new Grease Pencil layer in the active object" msgstr "Afegir una capa de Llapis de greix a l'objecte actiu" @@ -61352,6 +61484,11 @@ msgid "Hide inactive materials instead of the active one" msgstr "Ocultar materials inactius en lloc dels actius" +msgctxt "Operator" +msgid "Lock Unselected Materials" +msgstr "Bloquejar materials no seleccionats" + + msgid "Lock and hide any material not used" msgstr "Bloqueja i amaga qualsevol material no utilitzat" @@ -61450,10 +61587,6 @@ msgid "Assign Material" msgstr "Assignar material" -msgid "Change Stroke material with selected material" -msgstr "Canviar el material del traç pel material seleccionat" - - msgid "Simplify selected strokes" msgstr "Simplificar traços seleccionats" @@ -61464,11 +61597,11 @@ msgstr "Suavitzar punts finals" msgctxt "Operator" msgid "Add Render Slot" -msgstr "Afegir epígraf de revelat" +msgstr "Afegir posella de revelat" msgid "Add a new render slot" -msgstr "[Add Render Slot]: Afegir un nou epígraf de revelat" +msgstr "[Add Render Slot]: Afegeix una nova capa de revelat" msgctxt "Operator" @@ -61482,11 +61615,11 @@ msgstr "[Clear Render Region]: Retira les vores de la regió de revelat i la des msgctxt "Operator" msgid "Clear Render Slot" -msgstr "Retirar epígraf de revelat" +msgstr "Retirar posella de revelat" msgid "Clear the currently selected render slot" -msgstr "[Clear Render Slot]: Retira l'epígraf de revelat presentment seleccionat" +msgstr "[Clear Render Slot]: Retira la posella de revelat presentment seleccionada" msgctxt "Operator" @@ -61530,11 +61663,11 @@ msgstr "Mida de mostra" msgctxt "Operator" msgid "Cycle Render Slot" -msgstr "Epígraf de revelat de cicle" +msgstr "Posella de revelat de cicle" msgid "Cycle through all non-void render slots" -msgstr "Cicle al llarg de tots els epígrafs de revelat no buits" +msgstr "Cicle al llarg de totes les poselles de revelat no buides" msgid "Cycle in Reverse" @@ -61731,11 +61864,11 @@ msgstr "Torna a carregar la imatge actual des del disc" msgctxt "Operator" msgid "Remove Render Slot" -msgstr "Suprimir epígraf de revelat" +msgstr "Suprimir posella de revelat" msgid "Remove the current render slot" -msgstr "[Remove Render Slot]: Suprimeix l'epígraf de revelat actual" +msgstr "[Remove Render Slot]: Suprimeix la posella de revelat actual" msgctxt "Operator" @@ -63106,7 +63239,7 @@ msgstr "Lliscar vora difusa" msgid "First try to slide feather instead of vertex" -msgstr "Intentar primer fer lliscar la vora difusa enlloc del vèrtex" +msgstr "Intenta primer fer lliscar la vora difusa enlloc del vèrtex" msgctxt "Operator" @@ -63299,7 +63432,7 @@ msgstr "Determinar la força de cara només en les cares noves i modificades" msgid "Prefer sliding along edges to even widths" -msgstr "Preferir de lliscar al llarg d'arestes que en amplades regulars" +msgstr "Preferir de escórrer al llarg d'arestes que en amplades regulars" msgid "Material for bevel faces (-1 means use adjacent faces)" @@ -63447,7 +63580,7 @@ msgstr "Quantes noves arestes intermediàries s'encongeixen/expandeixen" msgid "Smoothness factor" -msgstr "Factor suavitat" +msgstr "Factor suavitzat" msgid "Twist offset for closed loops" @@ -63483,19 +63616,11 @@ msgid "Reverse Colors" msgstr "Invertir colors" -msgid "Flip direction of vertex colors inside faces" -msgstr "Inverteix la direcció dels colors de vèrtex dins les cares" - - msgctxt "Operator" msgid "Rotate Colors" msgstr "Rotar colors" -msgid "Rotate color attributes inside faces" -msgstr "Fa girar els atributs de color dins de les cares" - - msgid "Counter Clockwise" msgstr "Sentit antihorari" @@ -64102,7 +64227,7 @@ msgstr "Mostrar aplanades les cares" msgid "Display faces smooth (using vertex normals)" -msgstr "Mostra les cares suaus (usant normals de vèrtex)" +msgstr "Mostra les cares suavitzades (usant normals de vèrtex)" msgctxt "Operator" @@ -64501,7 +64626,7 @@ msgstr "Índex d'objecte" msgctxt "Operator" msgid "Loop Cut and Slide" -msgstr "Inserir bucle i desplaçar-lo" +msgstr "Inserir bucle i escórrer-lo" msgid "Cut mesh loop and slide it" @@ -64513,7 +64638,7 @@ msgstr "Inserir bucle" msgid "Slide an edge loop along a mesh" -msgstr "Desplaça un bucle d'arestes al llarg d'una malla" +msgstr "Escorre un bucle d'arestes al llarg d'una malla" msgctxt "Operator" @@ -64720,7 +64845,7 @@ msgstr "Desplaçar arestes lliscant" msgid "Offset edge loop slide" -msgstr "[Offset Edge Slide]: Desplaça lliscant-lo el bucle d'arestes" +msgstr "[Offset Edge Slide]: Desplaça el bucle d'arestes escorregut" msgid "Offset Edge Loop" @@ -64742,11 +64867,11 @@ msgstr "Valor mínim de la màscara per considerar vàlid el vèrtex per extreur msgctxt "Operator" msgid "Mask Slice" -msgstr "Màscara fragment" +msgstr "Fragmentar amb màscara" msgid "Slices the paint mask from the mesh" -msgstr "[Mask Slice]: Fragmenta la màscara de pintar des de la malla" +msgstr "[Mask Slice]: Fragmenta la malla amb la màscara de pintar" msgid "Fill Holes" @@ -65767,7 +65892,7 @@ msgstr "Coplanar" msgctxt "Mesh" msgid "Flat/Smooth" -msgstr "Aplanat/Suau" +msgstr "Aplanat/Suavitzat" msgctxt "Mesh" @@ -66370,10 +66495,6 @@ msgid "Bake scale channels" msgstr "Precuinar canals d'escala" -msgid "Bake b-bone channels" -msgstr "Precuinar canals d'ossos-d" - - msgid "Clean Curves" msgstr "Netejar corbes" @@ -67094,7 +67215,7 @@ msgstr "Revessar borns de node ocults" msgid "Toggle unused node socket display" -msgstr "Revessa la visualització del born de node no utilitzat" +msgstr "Revessa el visionat del born de node no utilitzat" msgctxt "Operator" @@ -67243,7 +67364,7 @@ msgstr "Fer enllaços" msgid "Makes a link between selected output in input sockets" -msgstr "[Make Links]: Fa un enllaç entre la sortida seleccionada els borns d'entrada" +msgstr "[Make Links]: Fa un enllaç entre la sortida seleccionada als borns d'entrada" msgid "Replace socket connections with the new links" @@ -67643,7 +67764,7 @@ msgstr "Afegir un objecte amb nom" msgid "Drop X" -msgstr "Blanc X" +msgstr "Deposar X" msgid "X-coordinate (screen space) to place the new object under" @@ -67651,7 +67772,7 @@ msgstr "[Drop X]: Coordenada X (quadre de pantalla) sota la qual col·locar el n msgid "Drop Y" -msgstr "Blanc Y" +msgstr "Deposar Y" msgid "Y-coordinate (screen space) to place the new object under" @@ -67848,7 +67969,7 @@ msgstr "Afegir a l'escena la col·lecció arrossegada" msgid "Add the dropped collection as collection instance" -msgstr "Afegir la col·lecció llançada com a instància de la col·lecció" +msgstr "Afegir la col·lecció deposada com a instància de la col·lecció" msgctxt "Operator" @@ -68135,11 +68256,11 @@ msgstr "Suprimir objecte de totes les escenes" msgctxt "Operator" msgid "Drop Geometry Node Group on Object" -msgstr "Llançar grup de nodes de geometria sobre objecte" +msgstr "Deposar grup de nodes de geometria sobre objecte" msgid "Session UUID of the geometry node group being dropped" -msgstr "UUID de sessió del grup de nodes de geometria que es deixa caure" +msgstr "UUID de sessió del grup de nodes de geometria que es deposa" msgid "Show the datablock selector in the modifier" @@ -68148,7 +68269,7 @@ msgstr "Mostra el selector de blocs de dades en el modificador" msgctxt "Operator" msgid "Add Empty Image/Drop Image to Empty" -msgstr "Afegir imatge buida/llançar imatge a Buit" +msgstr "Afegir imatge buida/deposar imatge a Buit" msgid "Add an empty image type to scene with data" @@ -68165,7 +68286,7 @@ msgstr "Ruta al document d'imatge" msgctxt "Operator" msgid "Drop Named Material on Object" -msgstr "Llançar material anomenat sobre objecte" +msgstr "Deposar material anomenat sobre objecte" msgctxt "Operator" @@ -68404,7 +68525,7 @@ msgstr "Copia el modificador de l'objecte actiu a tots els objectes seleccionats msgctxt "Operator" msgid "Move Down Modifier" -msgstr "Moure modificador avall" +msgstr "Abaixar modificador" msgid "Move modifier down in the stack" @@ -68426,7 +68547,7 @@ msgstr "L'índex al qual moure el modificador" msgctxt "Operator" msgid "Move Up Modifier" -msgstr "Moure modificador amunt" +msgstr "Elevar modificador" msgid "Move modifier up in the stack" @@ -69061,12 +69182,12 @@ msgstr "Afegir epígraf de material" msgid "Add a new material slot" -msgstr "[Add Material Slot]: Afegir un nou epígraf de material" +msgstr "[Add Material Slot]: Afegeix un nou epígraf de material" msgctxt "Operator" msgid "Assign Material Slot" -msgstr "Assigna a epígraf de material" +msgstr "Assignar a epígraf de material" msgid "Assign active material slot to selection" @@ -69513,7 +69634,7 @@ msgstr "Afegir epígraf de sistema de partícules" msgid "Add a particle system" -msgstr "[Add Particle System Slot]: Afegir un sistema de partícules" +msgstr "[Add Particle System Slot]: Afegeix un sistema de partícules" msgctxt "Operator" @@ -69742,7 +69863,7 @@ msgstr "Conservar agudesa" msgid "Try to preserve sharp features on the mesh" -msgstr "[Preserve Sharp]: Intenta preservar les característiques destacades a la malla" +msgstr "[Preserve Sharp]: Intenta preservar les característiques cantelludes a la malla" msgctxt "Operator" @@ -70087,7 +70208,7 @@ msgstr "Defineix l'agudesa de les arestes de malla en base a l'angle entre cares msgid "Maximum angle between face normals that will be considered as smooth" -msgstr "Angle màxim entre normals de cara que es consideraran suaus" +msgstr "Angle màxim entre normals de cara que es consideraran suavitzades" msgctxt "Operator" @@ -70195,7 +70316,7 @@ msgstr "Nom del l'aspector d'efectes especials a editar" msgctxt "Operator" msgid "Move Down Effect" -msgstr "Moure efecte avall" +msgstr "Abaixar efecte" msgid "Move effect down in the stack" @@ -70217,7 +70338,7 @@ msgstr "L'índex al qual moure l'efecte" msgctxt "Operator" msgid "Move Up Effect" -msgstr "Moure efecte amunt" +msgstr "Elevar efecte" msgid "Move effect up in the stack" @@ -71376,7 +71497,7 @@ msgstr "Operació de dades" msgctxt "Operator" msgid "Data Stack Drop" -msgstr "Toquerejar dades d'estiba" +msgstr "Deposar dades d'estiba" msgid "Copy or reorder modifiers, constraints, and effects" @@ -71538,11 +71659,11 @@ msgstr "Selecciona un interval des d'un element actiu" msgctxt "Operator" msgid "Drag and Drop" -msgstr "Arrossegar i llançar" +msgstr "Arrossegar i deposar" msgid "Drag and drop element to another place" -msgstr "[Drag and Drop]: Arrossega i deixa caure l'element en un altre lloc" +msgstr "[Drag and Drop]: Arrossega i deposa l'element en un altre lloc" msgctxt "Operator" @@ -71723,7 +71844,7 @@ msgstr "Eliminar els sobreseïments locals seleccionades (incloent-hi les jerarq msgctxt "Operator" msgid "Drop Material on Object" -msgstr "Llançar material sobre l'objecte" +msgstr "Deposar material sobre l'objecte" msgid "Drag material to object in Outliner" @@ -71803,7 +71924,7 @@ msgstr "[Recursive Delete]: Comprova recursivament si hi ha blocs de dades no ut msgctxt "Operator" msgid "Drop to Clear Parent (hold Alt to keep transforms)" -msgstr "Llançar per retirar paternitat (mantenir Alt per conservar les transformacions)" +msgstr "Deposar per retirar paternitat (mantenir Alt per conservar les transformacions)" msgid "Drag to clear parent in Outliner" @@ -71812,7 +71933,7 @@ msgstr "Arrossegar per retirar paternitat en l'inventari" msgctxt "Operator" msgid "Drop to Set Parent (hold Alt to keep transforms)" -msgstr "Deixar anar per especificar pare (mantenir Alt per conservar les transformacions)" +msgstr "Deposar per especificar pare (mantenir Alt per conservar les transformacions)" msgid "Drag to parent in Outliner" @@ -71821,7 +71942,7 @@ msgstr "Arrossega al pare en l'inventari" msgctxt "Operator" msgid "Drop Object to Scene" -msgstr "Llançar objecte a escena" +msgstr "Deposar objecte a escena" msgid "Drag object to scene in Outliner" @@ -71959,7 +72080,7 @@ msgstr "Lliscar punt de corba de pintura" msgid "Select and slide paint curve point" -msgstr "Selecciona i llisca el punt de corba de pintura" +msgstr "Selecciona i llisca el punt de corba de pintat" msgctxt "Operator" @@ -72008,7 +72129,7 @@ msgstr "(Des)seleccionar-ho tot" msgctxt "Operator" msgid "Slide Paint Curve Point" -msgstr "Lliscar punt de corba de pintura" +msgstr "Lliscar punt de corba de pintat" msgid "Align Handles" @@ -72784,7 +72905,7 @@ msgstr "Mou avall de la llista l'objecte instància" msgctxt "Operator" msgid "Move Up Instance Object" -msgstr "Moure amunt l'objecte instància" +msgstr "Elevar objecte instància" msgid "Move instance object up in the list" @@ -72967,7 +73088,7 @@ msgstr "Subdividir segments de les partícules seleccionades (afegeix fites)" msgctxt "Operator" msgid "Move Down Target" -msgstr "Mou avall referent" +msgstr "Abaixar referent" msgid "Move particle target down in the list" @@ -72976,7 +73097,7 @@ msgstr "Mou avall de la llista el referent de la partícula" msgctxt "Operator" msgid "Move Up Target" -msgstr "Mou amunt referent" +msgstr "Elevar referent" msgid "Move particle target up in the list" @@ -74924,7 +75045,7 @@ msgstr "Sincronització" msgid "Drop frames to maintain framerate" -msgstr "Descarta fotogrames per a mantenir els fotogrames per segon" +msgstr "Exclou fotogrames per a mantenir els fotogrames per segon" msgctxt "Operator" @@ -75764,7 +75885,7 @@ msgstr "Posicions raonables" msgid "Creates a smooth as possible geometry patch from the Face Set minimizing changes in vertex positions" -msgstr "Crea un pedaç de geometria tant suau com es pot a partir del joc de cares tot minimitzant els canvis en les posicions dels vèrtexs" +msgstr "Crea un pedaç de geometria tant suavitzada com es pot a partir del joc de cares tot minimitzant els canvis en les posicions dels vèrtexs" msgid "Fair Tangency" @@ -75772,26 +75893,13 @@ msgstr "Tangència raonable" msgid "Creates a smooth as possible geometry patch from the Face Set minimizing changes in vertex tangents" -msgstr "Crea un pedaç de geometria tant suau com es pot a partir del joc de cares, tot minimitzant els canvis en les tangents de vèrtex" +msgstr "Crea un pedaç de geometria tant suavitzada com es pot a partir del joc de cares, tot minimitzant els canvis en les tangents de vèrtex" msgid "Modify Hidden" msgstr "Modificar ocults" -msgid "Apply the edit operation to hidden Face Sets" -msgstr "Aplica l'operació d'edició als jocs de cares ocults" - - -msgctxt "Operator" -msgid "Invert Face Set Visibility" -msgstr "Invertir visibilitat de joc de cares" - - -msgid "Invert the visibility of the Face Sets of the sculpt" -msgstr "Canvia la visibilitat dels jocs de cares de l'escultura" - - msgctxt "Operator" msgid "Face Set Lasso Gesture" msgstr "Joc de cares amb el gest de llaç" @@ -75983,15 +76091,15 @@ msgstr "Filtre que s'aplicarà a la màscara" msgid "Smooth Mask" -msgstr "Suavitzar màscara" +msgstr "Màscara de suavitzat" msgid "Smooth mask" -msgstr "[Smooth Mask]: Suavitza la màscara" +msgstr "[Smooth Mask]: Màscara del suavitzat" msgid "Sharpen Mask" -msgstr "Aguditzar màscara" +msgstr "Contrastar màscara" msgid "Sharpen mask" @@ -76055,10 +76163,6 @@ msgid "Use settings from here" msgstr "Usa la configuració des d'aquí" -msgid "Operator" -msgstr "Operador" - - msgid "Use settings from operator properties" msgstr "Usa els paràmetres de propietats de l'operador" @@ -76138,7 +76242,7 @@ msgstr "Iteracions de suavització de curvatura" msgid "How much smooth the resulting shape is, ignoring high frequency details" -msgstr "Quant de suau ha de ser la forma resultant, ignorant detalls d'alta freqüència" +msgstr "Quant de suavitzada ha de ser la forma resultant, ignorant detalls d'alta freqüència" msgid "Intensify Details" @@ -78534,7 +78638,7 @@ msgstr "[Edge Crease]: Canvia el cairat de les arestes" msgctxt "Operator" msgid "Edge Slide" -msgstr "Lliscar aresta" +msgstr "Escórrer aresta" msgid "Correct UVs" @@ -78737,7 +78841,7 @@ msgstr "Selecciona l'orientació de la transformació" msgctxt "Operator" msgid "Sequence Slide" -msgstr "Lliscador de seqüència" +msgstr "Lliscar seqüència" msgid "Edge Pan" @@ -78843,11 +78947,11 @@ msgstr "[Vertex Crease]: Canvia el cairat de vèrtexs" msgctxt "Operator" msgid "Vertex Slide" -msgstr "Lliscar vèrtex" +msgstr "Escórrer vèrtex" msgid "Slide a vertex along a mesh" -msgstr "[Vertex Slide]: Llisca un vèrtex al llarg d'una malla" +msgstr "[Vertex Slide]: Fa lliscar un vèrtex al llarg d'una malla" msgctxt "Operator" @@ -79008,7 +79112,7 @@ msgstr "Copiar a tots els elements seleccionats de la corrua" msgctxt "Operator" msgid "Drop Color" -msgstr "Llançar color" +msgstr "Deposar color" msgid "Drop colors to buttons" @@ -79029,7 +79133,7 @@ msgstr "El color d'origen té la gamma corregida" msgctxt "Operator" msgid "Drop Material in Material slots" -msgstr "Llançar material en epígrafs de materials" +msgstr "Deposar material en epígrafs de materials" msgid "Drag material to Material slots in Properties" @@ -79038,15 +79142,15 @@ msgstr "Arrossega el material als epígrafs de materials a Propietats" msgctxt "Operator" msgid "Drop Name" -msgstr "Llançar nom" +msgstr "Deposar nom" msgid "Drop name to button" -msgstr "[Drop Name]: Deixa caure el nom sobre botó" +msgstr "[Drop Name]: Deposa el nom sobre botó" msgid "The string value to drop into the button" -msgstr "El valor de la cadena que s'ha de deixar caure al botó" +msgstr "El valor de la cadena que s'ha de deposar al botó" msgctxt "Operator" @@ -79575,11 +79679,11 @@ msgstr "Retirar la propietat i usa el valor predeterminat o el valor generat en msgctxt "Operator" msgid "View Drop" -msgstr "Llançament a la vista" +msgstr "Deposar a la vista" msgid "Drag and drop onto a data-set or item within the data-set" -msgstr "Arrossega i llança sobre un conjunt de dades o sobre un ítem dins del conjunt de dades" +msgstr "Arrossega i deposa sobre un conjunt de dades o sobre un ítem dins del conjunt de dades" msgctxt "Operator" @@ -80889,11 +80993,11 @@ msgstr "Posició de regió Y" msgctxt "Operator" msgid "Drop World" -msgstr "Llançar món" +msgstr "Deposar món" msgid "Drop a world into the scene" -msgstr "Deixa caure un món dins l'escena" +msgstr "Deposa un món dins l'escena" msgctxt "Operator" @@ -81146,7 +81250,7 @@ msgstr "Nom d'objecte" msgctxt "Operator" msgid "Smooth View" -msgstr "Suavitzar visualització" +msgstr "Suavitzar visionat" msgctxt "Operator" @@ -81510,7 +81614,7 @@ msgstr "Visualització perspectiva/ortogràfica" msgid "Switch the current view from perspective/orthographic projection" -msgstr "Alterna la visualització actual des de la projecció perspectiva/ortogràfica" +msgstr "Alterna el visionat actual des de la projecció perspectiva/ortogràfica" msgctxt "Operator" @@ -82728,7 +82832,7 @@ msgstr "Visualitza un manual en línia contextualitzat en un navegador web" msgctxt "Operator" msgid "Handle dropped .blend file" -msgstr "Gestiona document .blend llançat" +msgstr "Gestiona document .blend deposat" msgctxt "Operator" @@ -83060,6 +83164,14 @@ msgid "Resize the objects to keep bounding box under this value. Value 0 disable msgstr "Redimensiona els objectes per a mantenir la capsa contenidora per sota d'aquest valor. El valor 0 desactiva l'estrenyiment" +msgid "Path Separator" +msgstr "Separador de ruta" + + +msgid "Character used to separate objects name into hierarchical structure" +msgstr "Caràcter emprat per separar el nom dels objectes en una estructura jeràrquica" + + msgid "Import OBJ groups as vertex groups" msgstr "Importar grups OBJ com a grups de vèrtexs" @@ -83486,15 +83598,15 @@ msgstr "[A string value]: Edita un valor de python directament, per als tipus de msgid "Soft Max" -msgstr "Màx. suau" +msgstr "Màx. suavitat" msgid "Soft Min" -msgstr "Mín. suau" +msgstr "Mín. suavitat" msgid "Soft Limits" -msgstr "Límits suaus" +msgstr "Límits suavitat" msgid "Limits the Property Value slider to a range, values outside the range must be inputted numerically" @@ -83995,7 +84107,7 @@ msgstr "[Cross-Eyed]: L'ull dret ha de veure la imatge esquerra i viceversa" msgctxt "Operator" msgid "Splash Screen" -msgstr "Careta d'entrada" +msgstr "Careta d'inici" msgid "Open the splash screen with release info" @@ -85345,18 +85457,6 @@ msgid "Panel containing UI elements" msgstr "Plafó que conté elements de la IU" -msgid "Refraction" -msgstr "Refracció" - - -msgid "Screen Tracing" -msgstr "Traçat de pantalla" - - -msgid "Denoising" -msgstr "Dessorollar" - - msgid "Light Groups" msgstr "Grups d'il·luminació" @@ -85769,6 +85869,10 @@ msgid "Optimize Shape Keys" msgstr "Optimitzar morfofites" +msgid "gltfpack" +msgstr "gltfpack" + + msgid "Unused Textures & Images" msgstr "Imatges i textures no usades" @@ -86244,6 +86348,10 @@ msgid "Indirect Lighting" msgstr "Il·luminació indirecta" +msgid "Denoising" +msgstr "Dessorollar" + + msgid "Horizon Scan" msgstr "Visura d'horitzó" @@ -86252,18 +86360,14 @@ msgid "Raytracing" msgstr "Radiotraçat" +msgid "Screen Tracing" +msgstr "Traçat de pantalla" + + msgid "Shadows" msgstr "Ombres" -msgid "Volumes Lighting" -msgstr "Il·luminació de volums" - - -msgid "Volumes Shadows" -msgstr "Ombres de volums" - - msgid "Screen Space Reflections" msgstr "Reflexos de quadre de pantalla" @@ -86998,7 +87102,7 @@ msgstr "Empènyer" msgctxt "Operator" msgid "Slide Relax" -msgstr "Moderar pendent" +msgstr "Lliscar i desplaçar" msgctxt "Operator" @@ -88179,7 +88283,7 @@ msgstr "Paràm de CI" msgid "Parameters for IK solver" -msgstr "[IK Param]: Paràmetres per al resolutor de cinètica invertida" +msgstr "[IK Param]: Paràmetres per al resolutor de cinemàtica inversa" msgid "Selection of IK solver for IK chain" @@ -90322,7 +90426,7 @@ msgstr "Activa l'acceleració de la GPU per avaluar els últims modificadors de msgid "Overlay Smooth Wires" -msgstr "Superposar Suavitzar cables" +msgstr "Superposició Suavitzar cables" msgid "Enable overlay smooth wires, reducing aliasing" @@ -90866,7 +90970,7 @@ msgstr "Inclou el nom de l'orientació de la vista en la bambolina de text infor msgid "Smooth View" -msgstr "Suavitzar visualització" +msgstr "Suavitzar visió" msgid "Time to animate the view in milliseconds, zero to disable" @@ -91518,7 +91622,7 @@ msgstr "Mostreig d'importància múltiple" msgid "Use multiple importance sampling for the light, reduces noise for area lights and sharp glossy materials" -msgstr "Usa un mostreig d'importància múltiple per a la llum, redueix el soroll per als llums d'àrea i els materials setinats" +msgstr "Usa un mostreig d'importància múltiple per a la llum, redueix el soroll per als llums d'àrea i els materials molt setinats" msgctxt "Light" @@ -93368,7 +93472,7 @@ msgstr "Filtre bilateral" msgid "Blur the resolved radiance using a bilateral filter" -msgstr "Difumina la radiància resolt tot fent ús d'un filtre bilateral" +msgstr "Difumina la radiància resolta tot fent ús d'un filtre bilateral" msgid "Spatial Reuse" @@ -94311,10 +94415,6 @@ msgid "Crop the rendered frame to the defined render region size" msgstr "Retalla el fotograma revelat a la mida definida de la regió de revelat" -msgid "File Extensions" -msgstr "Extensions de document" - - msgid "Add the file format extensions to the rendered file name (eg: filename + .jpg)" msgstr "Afegir les extensions de format de document al nom del document revelat (p. ex. nom del document + .jpg)" @@ -94544,15 +94644,15 @@ msgstr "Sistema de càmera múltiple, ajusta les càmeres individualment" msgid "Render Slot" -msgstr "Epígraf de revelat" +msgstr "Posella de revelat" msgid "Parameters defining the render slot" -msgstr "Paràmetres que defineixen l'epígraf del revelat" +msgstr "Paràmetres que defineixen la posella del revelat" msgid "Render slot name" -msgstr "Nom de l'epígraf de revelat" +msgstr "Nom de la posella de revelat" msgid "Collection of render layers" @@ -94560,7 +94660,7 @@ msgstr "Col·lecció de capes de revelat" msgid "Active render slot of the image" -msgstr "Epígraf actiu de revelat de la imatge" +msgstr "Posella activa de revelat de la imatge" msgid "Render View" @@ -95483,14 +95583,6 @@ msgid "Brightness threshold for using sprite base depth of field" msgstr "[Sprite Threshold]: Llindar de brillantor per a usar la profunditat de camp bàsica de l'esquitxada" -msgid "Diffuse Trace Options" -msgstr "Opcions de traçat difusiu" - - -msgid "EEVEE settings for tracing diffuse reflections" -msgstr "Paràmetres d'EEVEE per a traçar reflexos difusius" - - msgid "Auto Bake" msgstr "Autoprecuinar" @@ -95715,26 +95807,6 @@ msgid "Percentage of render size to add as overscan to the internal render buffe msgstr "[Overscan Size]: Percentatge de la mida de revelat que s'afegeix com a margenació a les memòries intermèdies internes" -msgid "Options Split" -msgstr "Separació d'opcions" - - -msgid "Split settings per ray type" -msgstr "Separa la configuració per tipus de raig" - - -msgid "Unified" -msgstr "Unificat" - - -msgid "All ray types use the same settings" -msgstr "Tots els tipus de raig usen els mateixos paràmetres" - - -msgid "Settings are individual to each ray type" -msgstr "Els paràmetres són específics per tipus de raig" - - msgid "Tracing Method" msgstr "Mètode de traçat" @@ -95763,14 +95835,6 @@ msgid "EEVEE settings for tracing reflections" msgstr "Paràmetres d'EEVEE per a traçar reflexos" -msgid "Refraction Trace Options" -msgstr "Opcions de traçat de refracció" - - -msgid "EEVEE settings for tracing refractions" -msgstr "Paràmetres d'EEVEE per a traçar refraccions" - - msgid "Directional Shadows Resolution" msgstr "Resolució d'ombres direccionals" @@ -95791,10 +95855,6 @@ msgid "Shadow Normal Bias" msgstr "Biaix de normals d'ombra" -msgid "Move along their normal" -msgstr "Moure seguint la normal" - - msgid "Shadow Pool Size" msgstr "Mida de reserva d'ombres" @@ -95928,11 +95988,11 @@ msgstr "Activa la projecció d'ombres a partir dels llums" msgid "Soft Shadows" -msgstr "Ombres suaus" +msgstr "Ombres febles" msgid "Randomize shadowmaps origin to create soft shadows" -msgstr "Aleatoritza l'origen dels mapes d'ombres per a crear ombres suaus" +msgstr "Aleatoritza l'origen dels mapes d'ombres per a crear ombres febles" msgid "Enable screen space reflection" @@ -96312,7 +96372,7 @@ msgstr "So" msgctxt "Sequence" msgid "Cross" -msgstr "Trans" +msgstr "Transició" msgctxt "Sequence" @@ -97075,7 +97135,7 @@ msgstr "Pendent invers" msgid "Invert the slope color" -msgstr "[Inverse Slope]: Inverteix el color pendent" +msgstr "[Inverse Slope]: Inverteix el color de pendent" msgid "Color balance lift (shadows)" @@ -100217,7 +100277,7 @@ msgstr "Limita la vista al contingut" msgid "Limit timeline height to maximum used channel slot" -msgstr "Limita l'alçada del cronograma al màxim de nivells de canal usats" +msgstr "Limita l'alçada del cronograma al màxim de ranures de canal usades" msgid "Transform markers as well as strips" @@ -101147,7 +101207,7 @@ msgstr "Oculta aquesta corba en mode edició" msgid "Material slot index of this curve" -msgstr "Índex d'epígraf de material de la corba" +msgstr "Índex d'epígraf de materials de la corba" msgid "Order U" @@ -101496,7 +101556,7 @@ msgstr "Si s'ha d'utilitzar el valor mínim de segat" msgid "Texture Paint Slot" -msgstr "Epígraf de pintat de textura" +msgstr "Epígraf de pintats de textura" msgid "Slot that contains information about texture painting" @@ -102308,7 +102368,7 @@ msgstr "Lliscadors de valors" msgid "View Sliders" -msgstr "Lliscadors de visualització" +msgstr "Lliscadors de visionat" msgid "Theme File Browser" @@ -104567,7 +104627,7 @@ msgstr "Nom de l'orientació de transformació adaptada" msgid "Orientation Slot" -msgstr "Epígraf d'orientació" +msgstr "Posella d'orientació" msgid "Current Transform Orientation" @@ -105412,8 +105472,8 @@ msgid "Display scene statistics overlay text" msgstr "Mostrar text sobreimprès d'estadístiques d'escena" -msgid "Stat Vis" -msgstr "Vis est" +msgid "Mesh Analysis" +msgstr "Anàlisi de malla" msgid "Display statistical information about the mesh" @@ -106880,10 +106940,6 @@ msgid "Vector2D" msgstr "Vector 2D" -msgid "2D float vector action, representing a thumbstick or trackpad" -msgstr "Acció vectorial de flotant en 2D, que representa un polzeprem o una estora tàctil" - - msgid "3D pose action, representing a controller's location and rotation" msgstr "Acció de posat 3D, que representa la ubicació i la rotació d'un controlador" @@ -108369,21 +108425,11 @@ msgid "Stop Move Left" msgstr "Aturar a esquerra" -msgctxt "WindowManager" -msgid "Stop Mode Right" -msgstr "Aturar a dreta" - - msgctxt "WindowManager" msgid "Stop Move Global Up" msgstr "Aturar moviment global en amunt" -msgctxt "WindowManager" -msgid "Stop Mode Global Down" -msgstr "Aturar mode global en avall" - - msgctxt "WindowManager" msgid "Stop Move Local Up" msgstr "Aturar moviment local en amunt" @@ -109254,7 +109300,7 @@ msgstr "Lligam de node (desactivat)" msgctxt "WindowManager" msgid "Vert/Edge Slide" -msgstr "Lliscar vèrtex/aresta" +msgstr "Escórrer vèrtex/aresta" msgctxt "WindowManager" @@ -109888,6 +109934,10 @@ msgid "glTF 2.0 (.glb/.gltf)" msgstr "glTF 2.0 (.glb/.gltf)" +msgid "Vertex positions" +msgstr "Ubicacions de vertexs" + + msgid "Quantize Position" msgstr "Quantificar ubicació" @@ -109908,6 +109958,10 @@ msgid "Animation UI" msgstr "IU d'animació" +msgid "Path to gltfpack" +msgstr "Ruta a gltfpack" + + msgid "Export only deformation bones is not possible when not sampling animation" msgstr "Exportar només ossos de deformació no és possible quan no es mostreja l'animació" @@ -111929,7 +111983,7 @@ msgstr "Interpolació U" msgid "Shadow Softness" -msgstr "Suavitzat d'ombra" +msgstr "Feblesa d'ombra" msgid "Trace Distance" @@ -112532,7 +112586,7 @@ msgstr "Usa el perfil de gruix" msgid "Source Clone Slot" -msgstr "Epígraf d'origen de clonació" +msgstr "Posella d'origen de clonació" msgid "Source Clone Image" @@ -113289,6 +113343,10 @@ msgid "Max Depth" msgstr "Profunditat màx" +msgid "Refraction" +msgstr "Refracció" + + msgid "Cascade Size" msgstr "Mida de cascada" @@ -113335,10 +113393,6 @@ msgid "Render Engine" msgstr "Motor de revelat" -msgid "Reflection / Refraction / Diffuse" -msgstr "Reflexió / refracció / difusivitat" - - msgctxt "Operator" msgid "Bake Cubemap Only" msgstr "Precuinar sols cubografia" @@ -114293,7 +114347,7 @@ msgstr "Mostrar el mateix material" msgctxt "Operator" msgid "Render Slot Cycle Next" -msgstr "Següent en el cicle d'epígrafs de revelats" +msgstr "Següent en el cicle de poselles de revelats" msgctxt "Operator" @@ -114448,7 +114502,7 @@ msgstr "Subdivisions fixades" msgctxt "Operator" msgid "Render Slot Cycle Previous" -msgstr "Anterior en el cicle d'epígrafs de revelats" +msgstr "Anterior en el cicle de poselles de revelats" msgctxt "Operator" @@ -114511,11 +114565,51 @@ msgid "Toggle Fullscreen Area" msgstr "Revessar àrea de pantalla completa" +msgctxt "Operator" +msgid "Action" +msgstr "Acció" + + +msgctxt "Operator" +msgid "Transition" +msgstr "Transició" + + msgctxt "Operator" msgid "Sound" msgstr "So" +msgctxt "Operator" +msgid "Selected Objects" +msgstr "Objectes seleccionats" + + +msgctxt "Operator" +msgid "Make Meta" +msgstr "Produir meta" + + +msgctxt "Operator" +msgid "Remove Meta" +msgstr "Suprimir meta" + + +msgctxt "Operator" +msgid "Swap" +msgstr "Intercanviar" + + +msgctxt "Operator" +msgid "Move Up" +msgstr "Elevar" + + +msgctxt "Operator" +msgid "Move Down" +msgstr "Abaixar" + + msgctxt "Operator" msgid "Rename..." msgstr "Reanomenar..." @@ -114526,11 +114620,31 @@ msgid "Track Ordering..." msgstr "Ordre de restres..." +msgctxt "Operator" +msgid "Add Above Selected" +msgstr "Afegir damunt dels seleccionats" + + +msgctxt "Operator" +msgid "Linked Duplicate" +msgstr "Duplicat vinculat" + + msgctxt "Operator" msgid "Stop Tweaking Strip Actions" msgstr "Deixar de manipular accions de segment" +msgctxt "Operator" +msgid "Add Track" +msgstr "Afegir pista" + + +msgctxt "Operator" +msgid "Add Track Above Selected" +msgstr "Afegeix pistes sobre les seleccionades" + + msgctxt "Operator" msgid "Stop Editing Stashed Action" msgstr "Deixar l'edició de l'acció estibada" @@ -115883,7 +115997,7 @@ msgstr "Revertir a preferències desades" msgid "Splash Screen" -msgstr "Careta d'entrada" +msgstr "Careta d'inici" msgid "User Tooltips" @@ -116956,7 +117070,7 @@ msgstr "Suavitzar màscara" msgctxt "Operator" msgid "Sharpen Mask" -msgstr "Aguditzar màscara" +msgstr "Contrastar màscara" msgctxt "Operator" @@ -116991,12 +117105,12 @@ msgstr "Expandir màscara per normals" msgctxt "Operator" msgid "Mask Slice and Fill Holes" -msgstr "Llescar amb màscara i omplir forats" +msgstr "Fragmentar amb màscara i omplir forats" msgctxt "Operator" msgid "Mask Slice to New Object" -msgstr "Llescar amb màscara a objecte nou" +msgstr "Fragmentar amb màscara a objecte nou" msgctxt "Operator" @@ -117043,16 +117157,6 @@ msgid "Extract Face Set" msgstr "Extreure joc de cares" -msgctxt "Operator" -msgid "Invert Visible Face Sets" -msgstr "Invertir jocs de cares visibles" - - -msgctxt "Operator" -msgid "Show All Face Sets" -msgstr "Mostrar tots els jocs de cares" - - msgctxt "Operator" msgid "Randomize Colors" msgstr "Aleatoritzar colors" @@ -117234,7 +117338,7 @@ msgstr "Arrencar vèrtexs i estendre" msgctxt "Operator" msgid "Slide Vertices" -msgstr "Lliscar vèrtexs" +msgstr "Escórrer vèrtexs" msgctxt "Operator" @@ -117487,10 +117591,6 @@ msgid "Vertex Group Weights" msgstr "Pesos de grup de vèrtexs" -msgid "Mesh Analysis" -msgstr "Anàlisi de malla" - - msgid "Face Angle" msgstr "Angle de cara" @@ -117902,7 +118002,7 @@ msgstr "Suavitzar cantells" msgctxt "Operator" msgid "Sharp Vertices" -msgstr "Aguditzar vèrtexs" +msgstr "Vèrtexs aguts" msgctxt "Operator" @@ -118090,11 +118190,6 @@ msgid "Duplicate Active Keyframe (All Layers)" msgstr "Duplicar fotofita activa (totes les capes)" -msgctxt "Operator" -msgid "Insert Blank Keyframe (All Layer)" -msgstr "Inserir fotofita en blanc (tota la capa)" - - msgctxt "Operator" msgid "Hide Active Layer" msgstr "Amagar capa activa" @@ -118939,10 +119034,6 @@ msgid "Int" msgstr "Ent" -msgid "PreviewCol" -msgstr "ColPrevis" - - msgid "TexturedCol" msgstr "ColTexturat" @@ -118967,10 +119058,6 @@ msgid "OS Loop" msgstr "Bucle del SO" -msgid "PreviewLoopCol" -msgstr "BucleColPrevis" - - msgid "Int8" msgstr "Ent8" @@ -119550,10 +119637,6 @@ msgid "No valid formats found" msgstr "No s'han trobat formats vàlids" -msgid "Can't allocate ffmpeg format context" -msgstr "No es pot assignar el context de format ffmpeg" - - msgid "Render width has to be 720 pixels for DV!" msgstr "L'amplada de revelat ha de ser de 720 píxels per a VD!" @@ -119566,10 +119649,6 @@ msgid "Render height has to be 576 pixels for DV-PAL!" msgstr "L'alçada de revelat ha de ser de 576 píxels per a VD-PAL!" -msgid "FFmpeg only supports 48khz / stereo audio for DV!" -msgstr "FFMPEG només admet àudio de 48khz / estèreo per a VD!" - - msgid "Error initializing video stream" msgstr "Error en inicialitzar flux de vídeo" @@ -121576,15 +121655,15 @@ msgstr "Referència de python en línia" msgid "Drop %s on slot %d (replacing %s) of %s" -msgstr "Deixar caure %s sobre l'epígraf %d (reemplaçant %s) de %s" +msgstr "Deposar %s sobre l'epígraf %d (reemplaçant %s) de %s" msgid "Drop %s on slot %d (active slot) of %s" -msgstr "Deixar caure %s sobre l'epígraf %d (epígraf actiu) de %s" +msgstr "Deposar %s sobre l'epígraf %d (epígraf actiu) de %s" msgid "Drop %s on slot %d of %s" -msgstr "Deixar caure %s sobre l'epígraf %d de %s" +msgstr "Deposar %s sobre l'epígraf %d de %s" msgid "Expected an array of numbers: [n, n, ...]" @@ -123726,11 +123805,11 @@ msgstr "Objecte (mantenir transformacions sense invers)" msgid "Drop %s on %s (slot %d, replacing %s)" -msgstr "Deixar caure %s sobre %s (epígraf %d, substituint %s)" +msgstr "Deposar %s sobre %s (epígraf %d, substituint %s)" msgid "Drop %s on %s (slot %d)" -msgstr "Deixar caure %s sobre %s (epígraf %d)" +msgstr "Deposar %s sobre %s (epígraf %d)" msgid "Add modifier with node group \"%s\" on object \"%s\"" @@ -124214,7 +124293,7 @@ msgstr "Totxo (Comú)" msgid "Brick (Soft)" -msgstr "Rajol (Suau)" +msgstr "Rajol (Tou)" msgid "Brass" @@ -124790,6 +124869,10 @@ msgid " Materials," msgstr " Materials," +msgid " Textures (or linked)," +msgstr " Textures (o vinculats)," + + msgid " Stencil," msgstr " Plantilla," @@ -125243,7 +125326,7 @@ msgstr "Noves línies no compatibles, incoquen l'operador molts cops" msgid "Catalog cannot be dropped into itself" -msgstr "El catàleg no es pot llançar dins de si mateix" +msgstr "El catàleg no es pot deposar dins de si mateix" msgid "Catalog is already placed inside this catalog" @@ -126339,6 +126422,10 @@ msgid "Text not used by any node, no update done" msgstr "Text no utilitzat per cap node, no s'ha fet cap actualització" +msgid "Render size too large for GPU, use CPU compositor instead" +msgstr "Mida de revelat excessiva per a la GPU, en lloc d'això, feu servir el compositador de CPU" + + msgid "Not inside node group" msgstr "No està dins del grup de nodes" @@ -126943,6 +127030,14 @@ msgid "File '%s' could not be loaded" msgstr "No s'ha pogut carregar el document '%s'" +msgid "Please select all related strips" +msgstr "Selecciona tots els segments relacionats" + + +msgid "No strips to paste" +msgstr "No hi ha segments per enganxar" + + msgid "Slip offset: %s" msgstr "Contingut desplaçat: %s" @@ -126983,14 +127078,6 @@ msgid "No valid inputs to swap" msgstr "No hi ha entrades vàlides per intercanviar" -msgid "Please select all related strips" -msgstr "Selecciona tots els segments relacionats" - - -msgid "No strips to paste" -msgstr "No hi ha segments per enganxar" - - msgid "Please select two strips" msgstr "Selecciona dos segments" @@ -127688,7 +127775,7 @@ msgstr "(Agut)" msgid "(Smooth)" -msgstr "(Suau)" +msgstr "(Suavitzat)" msgid "(Root)" @@ -127812,7 +127899,7 @@ msgstr "Seqüència - Lliscar: %s%s" msgid "Edge Slide: " -msgstr "Aresta - Lliscar: " +msgstr "Aresta - Escórrer: " msgid "(E)ven: %s, " @@ -127892,7 +127979,7 @@ msgstr "EscalaX: %s" msgid "TimeSlide: %s" -msgstr "Ajust de temps: %s" +msgstr "Lliscament de temps: %s" msgid "DeltaX: %s" @@ -127936,7 +128023,7 @@ msgstr "Usar el mode de transformació «TimeTranslate» enlloc del mode «Trans msgid "Vertex Slide: " -msgstr "Vèrteix - lliscar: " +msgstr "Vèrteix - escórrer: " msgid "Create Orientation's 'use' parameter only valid in a 3DView context" @@ -128258,7 +128345,7 @@ msgstr "Cairar en suavitzat" msgid "Crease On Sharp" -msgstr "Cairar en aplanat" +msgstr "Cantells en aguts" msgid "Force Backface Culling" @@ -128595,6 +128682,10 @@ msgid "An exception occurred invoking USD hook '%s'" msgstr "S'ha produït una excepció en invocar el ganxo USD '%s'" +msgid "%s: Error: Couldn't get input socket %s for node %s" +msgstr "%s: Error: no s'ha aconseguit el born d'entrada %s per al node %s" + + msgid "Unsupported type %s for mesh data" msgstr "El tipus de dades de malla %s no és compatible" @@ -128747,6 +128838,14 @@ msgid "USD does not support animating curve types. The curve type changes from % msgstr "USD no suporta tipus de corbes d'animació. El tipus de corba canvia de %s a %s al fotograma %f" +msgid "%s: Couldn't create USD shader for UV map" +msgstr "%s: no s'ha pogut crear l'aspector USD per al mapa UV" + + +msgid "%s: Couldn't create USD shader for mapping node" +msgstr "%s: no s'ha pogut crear l'aspector USD per al node de mapejat" + + msgid "USD export: couldn't export in-memory texture to %s" msgstr "Exportació USD: no s'ha pogut exportar la textura en memòria a %s" @@ -131422,7 +131521,7 @@ msgstr "L'alçada perpendicular a la base de l'espiral" msgid "Switch the direction from clockwise to counterclockwise" -msgstr "Canvia la direcció des del sentit horari al sentit antihorari" +msgstr "Inverteix la direcció des del sentit horari al sentit antihorari" msgid "Inner Radius" @@ -132203,7 +132302,7 @@ msgstr "Aresta d'on extraure les dades. Per defecte va a l'aresta des del contex msgid "Values that sort the corners attached to the edge" -msgstr "Valors que ordenen les canells associats a l'aresta" +msgstr "Valors que ordenen els cantells associats a l'aresta" msgid "Which of the sorted corners to output" @@ -133190,10 +133289,6 @@ msgid "Incident" msgstr "Incident" -msgid "Ior" -msgstr "IDR" - - msgid "No mesh in active object" msgstr "No hi ha malla a l'objecte actiu" @@ -134808,6 +134903,10 @@ msgid "Swahili (Kiswahili)" msgstr "Suahili (Kiswahili)" +msgid "Belarusian (беларуску)" +msgstr "Bielorús (беларуску)" + + msgid "Complete" msgstr "Completat" @@ -135937,7 +136036,7 @@ msgstr "Retalla les corbes del pèl aleatòriament fins a una certa quantitat" msgid "Smooth by Angle" -msgstr "autosuavitzar segons angle" +msgstr "Autosuavitzar segons angle" msgid "Maximum face angle for smooth edges" diff --git a/locale/po/cs.po b/locale/po/cs.po index 8a056d4c67c..5a797bdb4b4 100644 --- a/locale/po/cs.po +++ b/locale/po/cs.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2023-10-12 15:54+0000\n" "Last-Translator: Zdeněk Doležal \n" "Language-Team: Czech \n" @@ -7131,6 +7131,18 @@ msgid "Save" msgstr "Uložit" +msgid "File Extensions" +msgstr "Přípony souborů" + + +msgid "Operator" +msgstr "Operátor" + + +msgid "Label" +msgstr "Úroveň" + + msgid "Icon ID" msgstr "ID Ikony" @@ -10713,10 +10725,6 @@ msgid "Proxy Custom Directory" msgstr "Adresář zvuků" -msgid "Label" -msgstr "Úroveň" - - msgid "Grease Pencil Data" msgstr "Kresba skicovací tužkou" @@ -23894,10 +23902,6 @@ msgid "Reverse Colors" msgstr "Nová vertexová barva" -msgid "Flip direction of vertex colors inside faces" -msgstr "Přepíná směr vybraných ploškových vrcholů a ploškových normál" - - msgctxt "Operator" msgid "Rotate Colors" msgstr "Vložit barvu" @@ -29179,10 +29183,6 @@ msgid "Decrease Contrast" msgstr "Snížit Kontrast" -msgid "Operator" -msgstr "Operátor" - - msgctxt "Operator" msgid "Filter Mesh" msgstr "Filtrovat Síť" @@ -32427,14 +32427,6 @@ msgid "Restrict" msgstr "Omezit" -msgid "Refraction" -msgstr "Lom" - - -msgid "Denoising" -msgstr "Odstranění šumu" - - msgid "Integrator Presets" msgstr "Generátory" @@ -33019,6 +33011,10 @@ msgid "Indirect Lighting" msgstr "Nepřímé osvětlení" +msgid "Denoising" +msgstr "Odstranění šumu" + + msgid "Shadows" msgstr "Stíny" @@ -35915,10 +35911,6 @@ msgid "Crop the rendered frame to the defined render region size" msgstr "Oříznout vykreslený snímek do definovaný velikosti vykreslovací oblasti" -msgid "File Extensions" -msgstr "Přípony souborů" - - msgid "Draw stylized strokes using Freestyle" msgstr "Kreslení stylizovaných tahů pomocí Freestyle" @@ -39715,6 +39707,10 @@ msgid "Show dashed lines indicating parent or constraint relationships" msgstr "Zobrazuje čárkované čáry naznačující vztahy s nadřazenými objekty, nebo vazby mezi objekty" +msgid "Mesh Analysis" +msgstr "Analýza sítě" + + msgid "Display vertex normals as lines" msgstr "Zobrazí normály vertexů pomocí čárek" @@ -41214,6 +41210,10 @@ msgid "Light Clamping" msgstr "Svorka Světla" +msgid "Refraction" +msgstr "Lom" + + msgid "Cascade Size" msgstr "Velikost kaskády" @@ -43108,16 +43108,6 @@ msgid "Face Set from Visible" msgstr "Sada Ploch z Viditelného" -msgctxt "Operator" -msgid "Invert Visible Face Sets" -msgstr "Invertovat Viditelné Sady Ploch" - - -msgctxt "Operator" -msgid "Show All Face Sets" -msgstr "Zobrazit Všechny Viditelné Sady Ploch" - - msgctxt "Operator" msgid "Randomize Colors" msgstr "Randomizovat barvy" @@ -43350,10 +43340,6 @@ msgid "Seams" msgstr "Švy" -msgid "Mesh Analysis" -msgstr "Analýza sítě" - - msgid "Face Angle" msgstr "Úhel plochy" @@ -45875,6 +45861,10 @@ msgid "Mask not found" msgstr "Maska nebyla nalezena" +msgid "Please select all related strips" +msgstr "Odstranit označené značky" + + msgid "Cannot apply effects to audio sequence strips" msgstr "První frame animace" @@ -45887,10 +45877,6 @@ msgid "No valid inputs to swap" msgstr "Jméno skriptu" -msgid "Please select all related strips" -msgstr "Odstranit označené značky" - - msgid "Please select two strips" msgstr "Odstranit označené značky" diff --git a/locale/po/de.po b/locale/po/de.po index b2cadc71227..1c4ddc9bc32 100644 --- a/locale/po/de.po +++ b/locale/po/de.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: \n" "Last-Translator: Martin Reininger \n" "Language-Team: German translation team\n" @@ -9759,6 +9759,18 @@ msgid "Save" msgstr "Speichern" +msgid "File Extensions" +msgstr "Dateiendungen" + + +msgid "Operator" +msgstr "Operator" + + +msgid "Label" +msgstr "Beschriftung" + + msgid "File Select Entry" msgstr "Eintrag zur Dateiauswahl" @@ -15435,10 +15447,6 @@ msgid "Node tree consisting of linked nodes used for shading, textures and compo msgstr "Knotenbaum beinhaltet verknüpfte Knoten, die für Shading, Texturen und Kompositionen verwendet wurden" -msgid "Label" -msgstr "Beschriftung" - - msgid "Grease Pencil Data" msgstr "Wachsstift-Daten" @@ -32957,10 +32965,6 @@ msgid "Reverse Colors" msgstr "Farben umkehren" -msgid "Flip direction of vertex colors inside faces" -msgstr "Umkehrrichtung der Punktfarben innerhalb von Flächen" - - msgctxt "Operator" msgid "Rotate Colors" msgstr "Farben drehen" @@ -38493,10 +38497,6 @@ msgid "Decrease Contrast" msgstr "Kontrast verringern" -msgid "Operator" -msgstr "Operator" - - msgctxt "Operator" msgid "Init Mask" msgstr "Maske initializieren" @@ -42136,14 +42136,6 @@ msgid "Active Palette Color" msgstr "Aktive Farbpalette" -msgid "Refraction" -msgstr "Strahlenbrechnung" - - -msgid "Denoising" -msgstr "Rauschreduzierung" - - msgid "Integrator Presets" msgstr "Integrator-Voreinstellungen" @@ -42748,6 +42740,10 @@ msgid "Indirect Lighting" msgstr "Indirekte Beleuchtung" +msgid "Denoising" +msgstr "Rauschreduzierung" + + msgid "Shadows" msgstr "Schatten" @@ -46682,10 +46678,6 @@ msgid "Crop the rendered frame to the defined render region size" msgstr "Beschneidet den gerenderten Rahmen auf die definierte Größe des Renderbereichs" -msgid "File Extensions" -msgstr "Dateiendungen" - - msgid "Add the file format extensions to the rendered file name (eg: filename + .jpg)" msgstr "Dateiformaterweiterungen zu Dateinamen hinzufügen (z.B.: Dateiname + .jpg)" @@ -54936,6 +54928,10 @@ msgid "Auto-Step" msgstr "Auto-Schritt" +msgid "Refraction" +msgstr "Strahlenbrechnung" + + msgctxt "Operator" msgid "Bake Indirect Lighting" msgstr "Indirekte Beleuchtung backen" @@ -58671,10 +58667,6 @@ msgid "Int" msgstr "Int" -msgid "PreviewCol" -msgstr "Vorschaufarbe" - - msgid "TexturedCol" msgstr "Texturierte Farbe" @@ -61689,14 +61681,6 @@ msgid "File '%s' could not be loaded" msgstr "Datei '%s' konnte nicht geladen werden" -msgid "Cannot apply effects to audio sequence strips" -msgstr "Effekt kann nicht auf Audio-Sequenzstreifen angewandt werden" - - -msgid "Cannot apply effect to more than 3 sequence strips" -msgstr "Effekt kann nicht auf mehr als 3 Sequenzstreifen angewandt werden" - - msgid "Please select all related strips" msgstr "Bitte alle beziehenden Streifen auswählen" @@ -61705,6 +61689,14 @@ msgid "No strips to paste" msgstr "Keine Streifen zum einfügen" +msgid "Cannot apply effects to audio sequence strips" +msgstr "Effekt kann nicht auf Audio-Sequenzstreifen angewandt werden" + + +msgid "Cannot apply effect to more than 3 sequence strips" +msgstr "Effekt kann nicht auf mehr als 3 Sequenzstreifen angewandt werden" + + msgid "Please select two strips" msgstr "Bitte zwei Steifen auswählen" diff --git a/locale/po/el.po b/locale/po/el.po index 867293a94cd..3da3aa23f68 100644 --- a/locale/po/el.po +++ b/locale/po/el.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2008-03-23 12:20+0200\n" "Last-Translator: Kostas Karvouniaris \n" "Language-Team: \n" diff --git a/locale/po/es.po b/locale/po/es.po index b630b2f014e..916a0902a51 100644 --- a/locale/po/es.po +++ b/locale/po/es.po @@ -1,11 +1,11 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" -"PO-Revision-Date: 2023-12-04 05:17+0000\n" -"Last-Translator: Gabriel Gazzán \n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" +"PO-Revision-Date: 2023-12-09 04:50+0000\n" +"Last-Translator: Darwin Yip \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" @@ -1458,6 +1458,10 @@ msgid "Custom" msgstr "Personalizado" +msgid "Show assets from the asset libraries configured in the Preferences" +msgstr "Mostrar recursos de las bibliotecas de recursos configurados en las preferencias" + + msgid "ID Name" msgstr "Nombre" @@ -13118,6 +13122,18 @@ msgid "Whether this path is saved in bookmarks, or generated from OS" msgstr "Indica si esta ruta se encuentra guardada en los marcadores o proviene del sistema operativo" +msgid "File Extensions" +msgstr "Extensiones de archivo" + + +msgid "Operator" +msgstr "Operador" + + +msgid "Label" +msgstr "Etiqueta" + + msgid "File Select Entry" msgstr "Archivo seleccionado" @@ -25425,6 +25441,14 @@ msgid "True if this material has grease pencil data" msgstr "Verdadero si este material contiene datos de lápiz de cera" +msgid "Light Probe Volume Single Sided" +msgstr "Volumen de sonda de luz de un solo lado" + + +msgid "Consider material single sided for light probe volume capture. Additionally helps rejecting probes inside the object to avoid light leaks" +msgstr "Considere el material de un solo lado para la captura del volumen de la sonda de luz. Además ayuda a rechazar sondas dentro del objeto para evitar fugas de luz" + + msgid "Line Color" msgstr "Color de línea" @@ -25625,6 +25649,18 @@ msgid "How intense (bright) the specular reflection is" msgstr "Qué tan intensa es la reflectividad" +msgid "Surface Render Method" +msgstr "Método de procesar superficie" + + +msgid "Controls the blending and the compatibility with certain features" +msgstr "Controla la mezcla y la compatibilidad con ciertas características" + + +msgid "Blended" +msgstr "Mezclado" + + msgid "Texture Slot Images" msgstr "Imágenes del contenedor de texturas" @@ -26073,10 +26109,6 @@ msgid "Node tree consisting of linked nodes used for shading, textures and compo msgstr "Árbol de nodos compuesto por nodos vinculados entre sí; usados para sombreado, texturizado y composición" -msgid "Label" -msgstr "Etiqueta" - - msgid "The node tree label" msgstr "Etiqueta del árbol de nodos" @@ -51356,11 +51388,6 @@ msgid "Name of the bone collection to unassign this bone from; empty to unassign msgstr "Nombre de la colección de la cual quitar este hueso; dejar vacío para quitarlo de la colección activa" -msgctxt "Operator" -msgid "Remove Bone from Bone collections" -msgstr "Eliminar hueso de colección de huesos" - - msgid "Unassign the bone from this bone collection" msgstr "Quita el hueso de esta colección de huesos" @@ -63015,19 +63042,11 @@ msgid "Reverse Colors" msgstr "Invertir colores" -msgid "Flip direction of vertex colors inside faces" -msgstr "Invierte la dirección de los colores de vértices dentro de las caras" - - msgctxt "Operator" msgid "Rotate Colors" msgstr "Rotar colores" -msgid "Rotate color attributes inside faces" -msgstr "Rota los atributos de color dentro de las caras" - - msgid "Counter Clockwise" msgstr "Antihorario" @@ -75207,19 +75226,6 @@ msgid "Modify Hidden" msgstr "Modificar ocultos" -msgid "Apply the edit operation to hidden Face Sets" -msgstr "Permite aplicar la operación de edición a los conjuntos de caras ocultos" - - -msgctxt "Operator" -msgid "Invert Face Set Visibility" -msgstr "Invertir visibilidad de conjuntos de caras" - - -msgid "Invert the visibility of the Face Sets of the sculpt" -msgstr "Permite invertir la visibilidad de los conjuntos de caras de la escultura" - - msgctxt "Operator" msgid "Face Set Lasso Gesture" msgstr "Gesto de conjunto de caras con lazo" @@ -75483,10 +75489,6 @@ msgid "Use settings from here" msgstr "Usar opciones de aquí" -msgid "Operator" -msgstr "Operador" - - msgid "Use settings from operator properties" msgstr "Usar opciones de propiedades del operador" @@ -84706,18 +84708,6 @@ msgid "Panel containing UI elements" msgstr "Panel que contiene elementos de la interfaz" -msgid "Refraction" -msgstr "Refracción" - - -msgid "Screen Tracing" -msgstr "Trazado en pantalla" - - -msgid "Denoising" -msgstr "Reducción de ruidos" - - msgid "Light Groups" msgstr "Grupos de luces" @@ -85596,10 +85586,18 @@ msgid "Indirect Lighting" msgstr "Iluminación indirecta" +msgid "Denoising" +msgstr "Reducción de ruidos" + + msgid "Raytracing" msgstr "Trazado de rayos" +msgid "Screen Tracing" +msgstr "Trazado en pantalla" + + msgid "Shadows" msgstr "Sombras" @@ -93603,10 +93601,6 @@ msgid "Crop the rendered frame to the defined render region size" msgstr "Recorta la imagen procesada al tamaño definido por la región" -msgid "File Extensions" -msgstr "Extensiones de archivo" - - msgid "Add the file format extensions to the rendered file name (eg: filename + .jpg)" msgstr "Agrega la extensión del formato de archivo al nombre del archivo procesado (p.ej: nombre + .jpg)" @@ -94775,14 +94769,6 @@ msgid "Brightness threshold for using sprite base depth of field" msgstr "Umbral de brillo para la profundidad de campo basada en sprites" -msgid "Diffuse Trace Options" -msgstr "Opciones de trazado de difusión" - - -msgid "EEVEE settings for tracing diffuse reflections" -msgstr "Opciones de EEVEE para el trazado de rayos de reflexión difusa" - - msgid "Auto Bake" msgstr "Captura automática" @@ -94995,26 +94981,6 @@ msgid "Percentage of render size to add as overscan to the internal render buffe msgstr "Porcentaje del tamaño de procesamiento a agregar como sobrebarrido a los buffers internos de procesamiento" -msgid "Options Split" -msgstr "División de opciones" - - -msgid "Split settings per ray type" -msgstr "Divide las opciones por tipo de rayo" - - -msgid "Unified" -msgstr "Unificado" - - -msgid "All ray types use the same settings" -msgstr "Todos los tipos de rayo usarán las mismas opciones" - - -msgid "Settings are individual to each ray type" -msgstr "Opciones individuales para cada tipo de rayo" - - msgid "Tracing Method" msgstr "Método de trazado" @@ -95043,14 +95009,6 @@ msgid "EEVEE settings for tracing reflections" msgstr "Opciones de EEVEE para el trazado de reflexiones" -msgid "Refraction Trace Options" -msgstr "Opciones de trazado de refracción" - - -msgid "EEVEE settings for tracing refractions" -msgstr "Opciones de EEVEE para el trazado de refracciones" - - msgid "Directional Shadows Resolution" msgstr "Resolución de sombras direccionales" @@ -104642,8 +104600,8 @@ msgid "Display scene statistics overlay text" msgstr "Mostrar sobreimpreso texto con estadísticas de la escena" -msgid "Stat Vis" -msgstr "Vis. estad." +msgid "Mesh Analysis" +msgstr "Análisis de mallas" msgid "Display statistical information about the mesh" @@ -106110,10 +106068,6 @@ msgid "Vector2D" msgstr "Vector2D" -msgid "2D float vector action, representing a thumbstick or trackpad" -msgstr "Acción vectorial 2D decimal, representando un panel táctil" - - msgid "3D pose action, representing a controller's location and rotation" msgstr "Acción de pose 3D, representando la posición y rotación de un controlador" @@ -107589,11 +107543,6 @@ msgid "Stop Move Left" msgstr "Detener mov a izquierda" -msgctxt "WindowManager" -msgid "Stop Mode Right" -msgstr "Detener mov a derecha" - - msgctxt "WindowManager" msgid "Teleport" msgstr "Teletransportación" @@ -109151,6 +109100,10 @@ msgid "No glTF Animation" msgstr "No existe ninguna animación glTF" +msgid "No Actions in .blend file" +msgstr "No hay acciones en el archivo .blend" + + msgid "Variant" msgstr "Variante" @@ -112436,6 +112389,10 @@ msgid "Light Clamping" msgstr "Limitación de luz" +msgid "Refraction" +msgstr "Refracción" + + msgid "Cascade Size" msgstr "Tamaño cascada" @@ -113638,6 +113595,16 @@ msgid "Sound" msgstr "Sonido" +msgctxt "Operator" +msgid "Move Up" +msgstr "Mover arriba" + + +msgctxt "Operator" +msgid "Move Down" +msgstr "Mover abajo" + + msgctxt "Operator" msgid "Rename..." msgstr "Renombrar..." @@ -116140,16 +116107,6 @@ msgid "Extract Face Set" msgstr "Extraer conjunto de caras" -msgctxt "Operator" -msgid "Invert Visible Face Sets" -msgstr "Invertir conjuntos de caras visibles" - - -msgctxt "Operator" -msgid "Show All Face Sets" -msgstr "Mostrar todos los conjuntos de caras" - - msgctxt "Operator" msgid "Randomize Colors" msgstr "Aleatorizar colores" @@ -116574,10 +116531,6 @@ msgid "Vertex Group Weights" msgstr "Influencias de grupos de vértices" -msgid "Mesh Analysis" -msgstr "Análisis de mallas" - - msgid "Face Angle" msgstr "Ángulo de caras" @@ -117997,10 +117950,6 @@ msgid "Int" msgstr "Entero" -msgid "PreviewCol" -msgstr "ColPrevisualización" - - msgid "TexturedCol" msgstr "ColTexturizado" @@ -118025,10 +117974,6 @@ msgid "OS Loop" msgstr "Bucle del SO" -msgid "PreviewLoopCol" -msgstr "ColPrevisualizaciónBucle" - - msgid "Int8" msgstr "Entero8" @@ -118596,10 +118541,6 @@ msgid "No valid formats found" msgstr "No se encontraron formatos válidos" -msgid "Can't allocate ffmpeg format context" -msgstr "No es posible asignar el contexto del formato FFmpeg" - - msgid "Render width has to be 720 pixels for DV!" msgstr "¡El ancho de la imagen procesada debe ser de 720 píxeles para DV!" @@ -118612,10 +118553,6 @@ msgid "Render height has to be 576 pixels for DV-PAL!" msgstr "¡La altura de la imagen procesada debe ser de 576 píxeles para DV-PAL!" -msgid "FFmpeg only supports 48khz / stereo audio for DV!" -msgstr "¡FFmpeg sólo soporta audio estéreo de 48khz para DV!" - - msgid "Error initializing video stream" msgstr "Error inicializando flujo de video" @@ -125894,6 +125831,14 @@ msgid "File '%s' could not be loaded" msgstr "No fue posible cargar el archivo '%s'" +msgid "Please select all related strips" +msgstr "Por favor seleccionar todos los clips relacionados" + + +msgid "No strips to paste" +msgstr "No hay clips para pegar" + + msgid "Slip offset: %s" msgstr "Deslizamiento: %s" @@ -125934,14 +125879,6 @@ msgid "No valid inputs to swap" msgstr "No hay entradas válidas para intercambiar" -msgid "Please select all related strips" -msgstr "Por favor seleccionar todos los clips relacionados" - - -msgid "No strips to paste" -msgstr "No hay clips para pegar" - - msgid "Please select two strips" msgstr "Por favor seleccionar dos clips" @@ -132073,10 +132010,6 @@ msgid "Incident" msgstr "Incidente" -msgid "Ior" -msgstr "IR" - - msgid "No mesh in active object" msgstr "Ninguna malla en el objeto activo" @@ -133831,6 +133764,10 @@ msgid "Interpolates existing guide curves on a surface mesh" msgstr "Interpola las curvas guía existentes sobre la superficie de una malla" +msgid "Follow Surface Normal" +msgstr "Seguir la normal de la superficie" + + msgid "Redistribute Curve Points" msgstr "Redistribuir puntos de curva" @@ -133855,6 +133792,18 @@ msgid "Rolls up hair curves starting from their tips" msgstr "Enrolla las curvas de pelo, desde sus puntas" +msgid "Variation Level" +msgstr "Nivel de variación" + + +msgid "Retain Overall Shape" +msgstr "Conservar la forma general" + + +msgid "Roll Direction" +msgstr "Dirección de rollo" + + msgid "Rotate Hair Curves" msgstr "Rotar curvas de pelo" @@ -133867,6 +133816,14 @@ msgid "Sets the radius attribute of hair curves according to a profile shape" msgstr "Define el atributo de radio de las curvas de pelo mediante una forma de perfil" +msgid "Replace Radius" +msgstr "Reemplazar radio" + + +msgid "Replace the original radius" +msgstr "Reemplazar el radio original" + + msgid "Shrinkwrap Hair Curves" msgstr "Envolver curvas de pelo" @@ -133875,6 +133832,10 @@ msgid "Shrinkwraps hair curves to a mesh surface from below and optionally from msgstr "Envuelve las curvas de pelo alrededor de la superficie de una malla situada por debajo y opcionalmente por encima" +msgid "Lock Roots" +msgstr "Encerrar raíces" + + msgid "Smooth Hair Curves" msgstr "Suavizar curvas de pelo" @@ -133883,6 +133844,14 @@ msgid "Smoothes the shape of hair curves" msgstr "Suaviza la forma de las curvas de pelo" +msgid "Lock Tips" +msgstr "Encerrar puntas" + + +msgid "Lock tip position when smoothing" +msgstr "Encerrar posición de la punta al alisar" + + msgid "Straighten Hair Curves" msgstr "Enderezar curvas de pelo" @@ -133891,6 +133860,10 @@ msgid "Straightens hair curves between root and tip" msgstr "Endereza las curvas de pelo, de su raíz a su punta" +msgid "Amount of straightening" +msgstr "Cantidad de alisado" + + msgid "Trim Hair Curves" msgstr "Recortar curvas de pelo" @@ -133899,6 +133872,22 @@ msgid "Trims or scales hair curves to a certain length" msgstr "Recorta o escala las curvas de pelo a una cierta longitud" +msgid "Multiply the original length by a factor" +msgstr "Multiplicar el largo original por un factor" + + +msgid "Mask to blend overall effect" +msgstr "Máscara para mezclar el efecto general" + + msgid "Smooth by Angle" msgstr "Suavizar por ángulo" + +msgid "Maximum face angle for smooth edges" +msgstr "Ángulo de cara máximo para bordes lisos" + + +msgid "Ignore Sharpness" +msgstr "Ignorar nitidez" + diff --git a/locale/po/eu.po b/locale/po/eu.po index 46f9517989f..15bc6c83bbb 100644 --- a/locale/po/eu.po +++ b/locale/po/eu.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Ainhize & Miriam \n" "Language-Team: Euskara \n" @@ -1706,10 +1706,6 @@ msgid "Save System Info" msgstr "Sistemaren Informazioa Gorde" -msgid "Refraction" -msgstr "Errefrakzioa" - - msgctxt "Operator" msgid "Scale" msgstr "Eskalatu" @@ -1908,6 +1904,10 @@ msgid "Upper" msgstr "Altua" +msgid "Refraction" +msgstr "Errefrakzioa" + + msgctxt "Image" msgid "New" msgstr "Berria" diff --git a/locale/po/fa.po b/locale/po/fa.po index 376d396f23a..e64d501c052 100644 --- a/locale/po/fa.po +++ b/locale/po/fa.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2023-11-30 20:00+0000\n" "Last-Translator: \"M. Amin Taheri\" \n" "Language-Team: Persian \n" @@ -2281,6 +2281,10 @@ msgid "Save" msgstr "ﻩﺮﯿﺧﺫ" +msgid "Operator" +msgstr "ﻞﻣﺎﻋ" + + msgid "Link" msgstr "ﺪﻧﻮﯿﭘ" @@ -4230,10 +4234,6 @@ msgid "Experimental" msgstr "ﯽﺸﯾﺎﻣﺯﺁ" -msgid "Operator" -msgstr "ﻞﻣﺎﻋ" - - msgctxt "Operator" msgid "Sculpt Mode" msgstr "ﯼﺭﺎﺠﺣ ﺖﻟﺎﺣ" diff --git a/locale/po/fi.po b/locale/po/fi.po index 1e1f10824e1..57020dfb16c 100644 --- a/locale/po/fi.po +++ b/locale/po/fi.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" diff --git a/locale/po/fr.po b/locale/po/fr.po index 502df8f1c5b..df4b5d546cb 100644 --- a/locale/po/fr.po +++ b/locale/po/fr.po @@ -1,10 +1,10 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" -"PO-Revision-Date: 2023-12-02 06:55+0000\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" +"PO-Revision-Date: 2023-12-11 03:52+0000\n" "Last-Translator: Damien Picard \n" "Language-Team: French \n" "Language: fr\n" @@ -407,6 +407,14 @@ msgid "Display glTF UI to manage animations" msgstr "Afficher l’interface glTF pour gérer les animations" +msgid "glTFpack file path" +msgstr "Chemin de gltfpack" + + +msgid "Path to gltfpack binary" +msgstr "Chemin vers l’exécutable gltfpack" + + msgid "Displays glTF Material Output node in Shader Editor (Menu Add > Output)" msgstr "Afficher le nœud de sortie de matériau glTF (glTF Material Output) dans l’éditeur de shaders (menu Ajouter > Sortie)" @@ -1463,6 +1471,10 @@ msgid "Custom" msgstr "Personnalisée" +msgid "Show assets from the asset libraries configured in the Preferences" +msgstr "Afficher les assets depuis les bibliothèques d’assets définies dans les préférences" + + msgid "ID Name" msgstr "Nom de l’ID" @@ -6393,7 +6405,7 @@ msgstr "AgX log" msgid "Log Encoding with Chroma inset and rotation, and with 25 Stops of Dynamic Range" -msgstr "Encodage log avec rapetissement et rotation chroma, et 25 stops de gamme dynamique" +msgstr "Encodage log avec rétrécissement et rotation chroma, et 25 stops de gamme dynamique" msgid "Display P3" @@ -6409,7 +6421,7 @@ msgstr "Filmic Log" msgid "Log based filmic shaper with 16.5 stops of latitude, and 25 stops of dynamic range" -msgstr "Formante basée sur filmic avec 16,5 stops de latitude et 25 stops de gamme dynamique" +msgstr "Formante basée sur Filmic avec 16,5 stops de latitude et 25 stops de gamme dynamique" msgid "Filmic sRGB" @@ -13143,6 +13155,18 @@ msgid "Whether this path is saved in bookmarks, or generated from OS" msgstr "Si ce chemin est enregistré dans les signets, ou généré par l’OS" +msgid "File Extensions" +msgstr "Extensions de fichier" + + +msgid "Operator" +msgstr "Opérateur" + + +msgid "Label" +msgstr "Libellé" + + msgid "File Select Entry" msgstr "Entrée de sélection de fichier" @@ -26014,6 +26038,14 @@ msgid "Mirror the left/right vertex groups when painting. The symmetry axis is d msgstr "Peindre les groupes de sommets de gauche ou de droite en miroir. L’axe de symétrie est déterminé par les réglages de symétrie" +msgid "Bone Selection" +msgstr "Sélection d’os" + + +msgid "Bone selection during painting" +msgstr "Sélection d’os pendant la peinture" + + msgid "Paint Mask" msgstr "Masque de peinture" @@ -26238,10 +26270,6 @@ msgid "Node tree consisting of linked nodes used for shading, textures and compo msgstr "Arborescence de nœuds faite de nœuds liés, utilisée pour l’ombrage, les textures et le compositing" -msgid "Label" -msgstr "Libellé" - - msgid "The node tree label" msgstr "Le libellé de l’arborescence de nœuds" @@ -46970,10 +46998,6 @@ msgid "Simulation Output" msgstr "Sortie de simulation" -msgid " Output data from the simulation zone" -msgstr " Données de sortie pour la zone de simulation" - - msgid "Spline Length" msgstr "Longueur de spline" @@ -47006,10 +47030,6 @@ msgid "Create separate geometries containing the elements from the same group" msgstr "Créer des géométries séparées contenant les éléments du même groupe" -msgid "Attribute domain for the selection and group id inputs" -msgstr "Domaine d’attribut pour les entrées sélection et ID de groupe" - - msgid "Store Named Attribute" msgstr "Stocker en attribut nommé" @@ -51437,10 +51457,6 @@ msgid "Isolate" msgstr "Isoler" -msgid "Hides all other F-Curves other than the ones being framed" -msgstr "Cacher toutes les autres F-courbes autres que les courbes choisies à afficher" - - msgctxt "Operator" msgid "Align Bones" msgstr "Aligner les os" @@ -51684,11 +51700,6 @@ msgid "Name of the bone collection to unassign this bone from; empty to unassign msgstr "Nom de la collection d’os de laquelle retirer l’os ; laisser vide pour retirer de la collection d’os active" -msgctxt "Operator" -msgid "Remove Bone from Bone collections" -msgstr "Retirer l’os de la collection d’os" - - msgid "Unassign the bone from this bone collection" msgstr "Ne plus assigner l’os à cette collection d’os" @@ -56326,6 +56337,106 @@ msgid "Clips animations to selected playback range" msgstr "Limiter les animations à l’intervalle de lecture défini" +msgid "Disable Quantization" +msgstr "Désactiver la quantification" + + +msgid "Disable quantization; produces much larger glTF files with no extensions" +msgstr "Produit des fichiers glTF beaucoup plus lourds sans extensions" + + +msgid "Aggressive Mesh Simplification" +msgstr "Simplification de maillage agressive" + + +msgid "Aggressively simplify to the target ratio disregarding quality" +msgstr "Simplifier violemment à la proportion souhaitée, sans tenir compte de la qualité" + + +msgid "Mesh Simplification Ratio" +msgstr "Proportion de simplification du maillage" + + +msgid "Simplify meshes targeting triangle count ratio" +msgstr "Simplifier les maillages en visant une proportion du nombre de triangles" + + +msgid "Lock Mesh Border Vertices" +msgstr "Verrouiller les sommets en bordure de maillage" + + +msgid "Lock border vertices during simplification to avoid gaps on connected meshes" +msgstr "Verrouiller les sommets en bordure pendant la simplification, pour éviter d’avoir des écarts dans les maillages connectés" + + +msgid "KTX2 Compression" +msgstr "Compression KTX2" + + +msgid "Convert all textures to KTX2 with BasisU supercompression" +msgstr "Convertir toutes les textures en KTX2 avec surcompression BasisU" + + +msgid "Texture Encoding Quality" +msgstr "Qualité d’encodage de texture" + + +msgid "Texture encoding quality" +msgstr "Qualité d’encodage de texture" + + +msgid "Vertex Color Quantization" +msgstr "Quantification des couleurs de sommets" + + +msgid "Use N-bit quantization for colors" +msgstr "Utiliser une quantification à N bits pour les couleurs" + + +msgid "Normal/Tangent Quantization" +msgstr "Quantification des normales/tangentes" + + +msgid "Use N-bit quantization for normals and tangents" +msgstr "Utiliser une quantification à N bits pour les normales et tangentes" + + +msgid "Position Quantization" +msgstr "Quantification des positions" + + +msgid "Use N-bit quantization for positions" +msgstr "Utiliser une quantification à N bits pour les positions" + + +msgid "Vertex Position Attributes" +msgstr "Attributs de position des sommets" + + +msgid "Type to use for vertex position attributes" +msgstr "Type à utiliser pour les attributs de position des sommets" + + +msgid "Use integer attributes for positions" +msgstr "Utiliser des attributs entiers pour les positions" + + +msgid "Use normalized attributes for positions" +msgstr "Utiliser des attributs normalisés pour les positions" + + +msgid "Use floating-point attributes for positions" +msgstr "Utiliser des attributs à virgule flottante pour les positions" + + +msgid "Texture Coordinate Quantization" +msgstr "Quantification des coordonnées de texture" + + +msgid "Use N-bit quantization for texture coordinates" +msgstr "Utiliser une quantification à N bits pour les coordonnées de texture" + + msgid "Geometry Nodes Instances (Experimental)" msgstr "Instances de nœuds de géométrie (expérimental)" @@ -56682,6 +56793,14 @@ msgid "Export image texture nodes not assigned to any material. This feature is msgstr "Exporter les nœuds de textures d’images assignés à aucun matériau. Cette fonctionnalité n’est pas standard et nécessite qu’une extension externe soit incluse dans le fichier glTF" +msgid "Use Gltfpack" +msgstr "Utiliser gltfpack" + + +msgid "Use gltfpack to simplify the mesh and/or compress its textures" +msgstr "Utiliser gltfpack pour simplifier le maillage ou compresser ses textures" + + msgid "+Y Up" msgstr "+Y en haut" @@ -61279,6 +61398,10 @@ msgid "Enter/Exit draw mode for grease pencil" msgstr "Entrer/sortir du mode dessin de Grease Pencil" +msgid "Duplicate the selected points" +msgstr "Dupliquer les points sélectionnés" + + msgid "Duplicate" msgstr "Dupliquer" @@ -61291,6 +61414,15 @@ msgid "Insert a blank frame in all editable layers" msgstr "Insérer une frame vide dans tous les calques éditables" +msgctxt "Operator" +msgid "Set Active Layer" +msgstr "Définir le calque actif" + + +msgid "Set the active Grease Pencil layer" +msgstr "Définir le calque de Grease Pencil actif" + + msgid "Add a new Grease Pencil layer in the active object" msgstr "Ajouter un nouveau calque de Grease Pencil à l’objet actif" @@ -61354,6 +61486,11 @@ msgid "Hide inactive materials instead of the active one" msgstr "Cacher les matériaux inactifs au lieu de l’actif" +msgctxt "Operator" +msgid "Lock Unselected Materials" +msgstr "Verrouiller les matériaux désélectionnés" + + msgid "Lock and hide any material not used" msgstr "Verrouiller et cacher tous les matériaux inutilisés" @@ -61452,10 +61589,6 @@ msgid "Assign Material" msgstr "Assigner le matériau" -msgid "Change Stroke material with selected material" -msgstr "Assigner l’emplacement de matériau actif aux traits sélectionnés" - - msgid "Simplify selected strokes" msgstr "Simplifier les traits sélectionnés" @@ -63485,19 +63618,11 @@ msgid "Reverse Colors" msgstr "Inverser les couleurs" -msgid "Flip direction of vertex colors inside faces" -msgstr "Inverser la direction des couleurs de sommets dans les faces" - - msgctxt "Operator" msgid "Rotate Colors" msgstr "Tourner les couleurs" -msgid "Rotate color attributes inside faces" -msgstr "Faire tourner les attributs de couleur dans les faces" - - msgid "Counter Clockwise" msgstr "Sens antihoraire" @@ -66372,10 +66497,6 @@ msgid "Bake scale channels" msgstr "Précalculer les canaux d’échelle" -msgid "Bake b-bone channels" -msgstr "Précalculer les canaux de B-os" - - msgid "Clean Curves" msgstr "Nettoyer les courbes" @@ -66640,7 +66761,7 @@ msgstr "Ajouter des pistes NLA au-dessus ou en dessous des pistes sélectionnée msgid "Above Selected" -msgstr "Au-dessus des sélectionnées" +msgstr "Au-dessus de la sélection" msgid "Add a new NLA Track above every existing selected one" @@ -75781,19 +75902,6 @@ msgid "Modify Hidden" msgstr "Modifier les cachés" -msgid "Apply the edit operation to hidden Face Sets" -msgstr "Appliquer l’opération aux ensembles de faces cachés" - - -msgctxt "Operator" -msgid "Invert Face Set Visibility" -msgstr "Inverser la visibilité des ensembles de faces" - - -msgid "Invert the visibility of the Face Sets of the sculpt" -msgstr "Inverser la visibilité des ensembles de faces de la sculpture" - - msgctxt "Operator" msgid "Face Set Lasso Gesture" msgstr "Gestuelle d’ensemble de faces par lasso" @@ -76057,10 +76165,6 @@ msgid "Use settings from here" msgstr "Utiliser ces réglages" -msgid "Operator" -msgstr "Opérateur" - - msgid "Use settings from operator properties" msgstr "Utiliser les réglages des propriétés de l’opérateur" @@ -83062,6 +83166,14 @@ msgid "Resize the objects to keep bounding box under this value. Value 0 disable msgstr "Redimensionner les objets pour garder leur boîte englobante sous cette valeur. Une valeur de 0 désactive cette limitation" +msgid "Path Separator" +msgstr "Séparateur de chemin" + + +msgid "Character used to separate objects name into hierarchical structure" +msgstr "Caractère utilisé pour séparer les noms d’objets en une structure hiérarchique" + + msgid "Import OBJ groups as vertex groups" msgstr "Importer les groupes OBJ comme groupes de sommets" @@ -85347,18 +85459,6 @@ msgid "Panel containing UI elements" msgstr "Panneau contenant des éléments d’interface" -msgid "Refraction" -msgstr "Réfraction" - - -msgid "Screen Tracing" -msgstr "Lancer en espace écran" - - -msgid "Denoising" -msgstr "Débruitage" - - msgid "Light Groups" msgstr "Groupes d’éclairage" @@ -85771,6 +85871,10 @@ msgid "Optimize Shape Keys" msgstr "Optimiser les clés de forme" +msgid "gltfpack" +msgstr "gltfpack" + + msgid "Unused Textures & Images" msgstr "Textures inutilisées et images" @@ -86246,6 +86350,10 @@ msgid "Indirect Lighting" msgstr "Éclairage indirect" +msgid "Denoising" +msgstr "Débruitage" + + msgid "Horizon Scan" msgstr "Scan d’horizon" @@ -86254,18 +86362,14 @@ msgid "Raytracing" msgstr "Lancer de rayons" +msgid "Screen Tracing" +msgstr "Lancer en espace écran" + + msgid "Shadows" msgstr "Ombres" -msgid "Volumes Lighting" -msgstr "Éclairage des volumes" - - -msgid "Volumes Shadows" -msgstr "Ombres des volumes" - - msgid "Screen Space Reflections" msgstr "Réflexions en espace écran" @@ -86575,7 +86679,7 @@ msgstr "Thème de liste de cet espace" msgid "Panel Colors" -msgstr "Couleurs de panneaux" +msgstr "Couleurs des panneaux" msgid "Collection Colors" @@ -89302,11 +89406,11 @@ msgstr "Le chemin vers le dossier « /branches » de la copie locale de svn-tr msgid "Image Editor" -msgstr "Éditeur d’image" +msgstr "Éditeur d’images" msgid "Path to an image editor" -msgstr "Chemin vers l’éditeur d’image préféré" +msgstr "Chemin vers un éditeur d’images" msgid "Recent Files" @@ -90728,11 +90832,11 @@ msgstr "Le rendu des images est effectué sans changer l’interface utilisateur msgid "Images are rendered in a maximized Image Editor" -msgstr "Le rendu des images est effectué dans un éditeur d’image en plein écran" +msgstr "Le rendu des images est effectué dans un éditeur d’images en plein écran" msgid "Images are rendered in an Image Editor" -msgstr "Le rendu des images est effectué dans un éditeur d’image" +msgstr "Le rendu des images est effectué dans un éditeur d’images" msgid "Images are rendered in a new window" @@ -94313,10 +94417,6 @@ msgid "Crop the rendered frame to the defined render region size" msgstr "Recadrer l’image rendue aux dimensions de la région de rendu" -msgid "File Extensions" -msgstr "Extensions de fichier" - - msgid "Add the file format extensions to the rendered file name (eg: filename + .jpg)" msgstr "Ajouter les extensions de format de fichier aux noms des fichiers rendus (par ex. : nomdefichier + .jpg)" @@ -95485,14 +95585,6 @@ msgid "Brightness threshold for using sprite base depth of field" msgstr "Seuil de luminosité pour l’utilisation d’une profondeur de champ fondée sur des sprites" -msgid "Diffuse Trace Options" -msgstr "Options de lancer diffus" - - -msgid "EEVEE settings for tracing diffuse reflections" -msgstr "Réglages EEVEE pour le lancer des réflexions diffuses" - - msgid "Auto Bake" msgstr "Précalcul auto" @@ -95717,26 +95809,6 @@ msgid "Percentage of render size to add as overscan to the internal render buffe msgstr "Pourcentage de la taille de rendu à ajouter en surbalayage aux tampons de rendu internes" -msgid "Options Split" -msgstr "Séparer les options" - - -msgid "Split settings per ray type" -msgstr "Séparer les réglages par type de rayon" - - -msgid "Unified" -msgstr "Unifiés" - - -msgid "All ray types use the same settings" -msgstr "Tous les types de rayons utilisent les mêmes réglages" - - -msgid "Settings are individual to each ray type" -msgstr "Les réglages sont propres à chaque type de rayon" - - msgid "Tracing Method" msgstr "Méthode de lancer" @@ -95765,14 +95837,6 @@ msgid "EEVEE settings for tracing reflections" msgstr "Réglages EEVEE pour le lancer des réflexions" -msgid "Refraction Trace Options" -msgstr "Options du lancer de réfraction" - - -msgid "EEVEE settings for tracing refractions" -msgstr "Réglages EEVEE pour le lancer des réfractions" - - msgid "Directional Shadows Resolution" msgstr "Résolution des ombres directionnelles" @@ -95793,10 +95857,6 @@ msgid "Shadow Normal Bias" msgstr "Biais normal des ombres" -msgid "Move along their normal" -msgstr "Déplacer les ombres le long de leurs normales" - - msgid "Shadow Pool Size" msgstr "Taille du pool d’ombre" @@ -99202,11 +99262,11 @@ msgstr "N’afficher et éditer que les poignées des images clés sélectionné msgid "Space Image Editor" -msgstr "Espace éditeur d’image" +msgstr "Espace éditeur d’images" msgid "Image and UV editor space data" -msgstr "Données de l’espace éditeur d’image et d’UV" +msgstr "Données de l’espace éditeur d’images et d’UV" msgid "Display Channels" @@ -99270,7 +99330,7 @@ msgstr "Réglages de surimpression" msgid "Settings for display of overlays in the UV/Image editor" -msgstr "Réglages pour l’affichage des surimpressions dans l’éditeur d’image et d’UV" +msgstr "Réglages pour l’affichage des surimpressions dans l’éditeur d’images et d’UV" msgid "Rotation/Scaling Pivot" @@ -100963,7 +101023,7 @@ msgstr "Espace éditeur UV" msgid "UV editor data for the image editor space" -msgstr "Données de l’éditeur d’UV pour l’espace de l’éditeur d’image" +msgstr "Données de l’éditeur d’UV pour l’espace de l’éditeur d’images" msgid "Dynamic Grid Size" @@ -103547,7 +103607,7 @@ msgstr "Diamètre en pixels pour l’affichage de l’origine des objets et écl msgid "Object Selected" -msgstr "Objets sélectionnés" +msgstr "Objet sélectionné" msgid "Outline Width" @@ -105414,8 +105474,8 @@ msgid "Display scene statistics overlay text" msgstr "Afficher le texte des statistiques de scène en surimpression" -msgid "Stat Vis" -msgstr "Afficher les statistiques de maillage" +msgid "Mesh Analysis" +msgstr "Analyse du maillage" msgid "Display statistical information about the mesh" @@ -106882,10 +106942,6 @@ msgid "Vector2D" msgstr "Vecteur2D" -msgid "2D float vector action, representing a thumbstick or trackpad" -msgstr "Action de vecteur 2D de flottants, représentant un joystick ou un trackpad" - - msgid "3D pose action, representing a controller's location and rotation" msgstr "Action de pose 3D, représentant la position et la rotation d’un contrôleur" @@ -108371,21 +108427,11 @@ msgid "Stop Move Left" msgstr "Arrêter le déplacement vers la gauche" -msgctxt "WindowManager" -msgid "Stop Mode Right" -msgstr "Arrêter le déplacement vers la droite" - - msgctxt "WindowManager" msgid "Stop Move Global Up" msgstr "Arrêter le déplacement vers le haut global" -msgctxt "WindowManager" -msgid "Stop Mode Global Down" -msgstr "Arrêter le déplacement vers le bas global" - - msgctxt "WindowManager" msgid "Stop Move Local Up" msgstr "Arrêter le déplacement vers le haut local" @@ -108651,32 +108697,32 @@ msgstr "Éditeur UV" msgctxt "WindowManager" msgid "Image Editor Tool: Uv, Move" -msgstr "Outil d’éditeur d’image : UV, déplacer" +msgstr "Outil d’éditeur d’images : UV, déplacer" msgctxt "WindowManager" msgid "Image Editor Tool: Uv, Move (fallback)" -msgstr "Outil d’éditeur d’image : UV, déplacer (secondaire)" +msgstr "Outil d’éditeur d’images : UV, déplacer (secondaire)" msgctxt "WindowManager" msgid "Image Editor Tool: Uv, Rotate" -msgstr "Outil d’éditeur d’image : UV, tourner" +msgstr "Outil d’éditeur d’images : UV, tourner" msgctxt "WindowManager" msgid "Image Editor Tool: Uv, Rotate (fallback)" -msgstr "Outil d’éditeur d’image : UV, tourner (secondaire)" +msgstr "Outil d’éditeur d’images : UV, tourner (secondaire)" msgctxt "WindowManager" msgid "Image Editor Tool: Uv, Scale" -msgstr "Outil d’éditeur d’image : UV, redimensionner" +msgstr "Outil d’éditeur d’images : UV, redimensionner" msgctxt "WindowManager" msgid "Image Editor Tool: Uv, Scale (fallback)" -msgstr "Outil d’éditeur d’image : UV, redimensionner (secondaire)" +msgstr "Outil d’éditeur d’images : UV, redimensionner (secondaire)" msgctxt "WindowManager" @@ -108691,12 +108737,12 @@ msgstr "Vue image" msgctxt "WindowManager" msgid "Image Editor Tool: Sample" -msgstr "Outil éditeur d’image : échantillonner" +msgstr "Outil d’éditeur d’images : échantillonner" msgctxt "WindowManager" msgid "Image Editor Tool: Sample (fallback)" -msgstr "Outil éditeur d’image : échantillonner (secondaire)" +msgstr "Outil d’éditeur d’images : échantillonner (secondaire)" msgctxt "WindowManager" @@ -109890,6 +109936,10 @@ msgid "glTF 2.0 (.glb/.gltf)" msgstr "glTF 2.0 (.glb/.gltf)" +msgid "Vertex positions" +msgstr "Positions de sommets" + + msgid "Quantize Position" msgstr "Quantifier la position" @@ -109910,6 +109960,10 @@ msgid "Animation UI" msgstr "Interface d’animation" +msgid "Path to gltfpack" +msgstr "Chemin de gltfpack" + + msgid "Export only deformation bones is not possible when not sampling animation" msgstr "Impossible de n’exporter que les os de déformation si l’animation n’est pas échantillonnée" @@ -110754,7 +110808,7 @@ msgstr "Impossible de trouver l’image « %s »" msgid "Image editor could not be launched, ensure that the path in User Preferences > File is valid, and Blender has rights to launch it" -msgstr "L’éditeur d’image n’a pas pu être lancé, veuillez vous assurer que le chemin défini dans les Préférences de Blender > Chemins de fichiers est valide, et que Blender a le droit de le lancer" +msgstr "L’éditeur d’images n’a pas pu être lancé, veuillez vous assurer que le chemin défini dans les Préférences de Blender > Chemins de fichiers est valide, et que Blender a les droits pour le lancer" msgid "Context incorrect, image not found" @@ -113291,6 +113345,10 @@ msgid "Max Depth" msgstr "Profondeur max" +msgid "Refraction" +msgstr "Réfraction" + + msgid "Cascade Size" msgstr "Taille de cascade" @@ -113337,10 +113395,6 @@ msgid "Render Engine" msgstr "Moteur de rendu" -msgid "Reflection / Refraction / Diffuse" -msgstr "Réflexion, réfraction, diffusion" - - msgctxt "Operator" msgid "Bake Cubemap Only" msgstr "Précalculer cubemap uniquement" @@ -114513,11 +114567,51 @@ msgid "Toggle Fullscreen Area" msgstr "(Dés)activer la zone en plein écran" +msgctxt "Operator" +msgid "Action" +msgstr "Action" + + +msgctxt "Operator" +msgid "Transition" +msgstr "Transition" + + msgctxt "Operator" msgid "Sound" msgstr "Son" +msgctxt "Operator" +msgid "Selected Objects" +msgstr "Objets sélectionnés" + + +msgctxt "Operator" +msgid "Make Meta" +msgstr "Rendre méta" + + +msgctxt "Operator" +msgid "Remove Meta" +msgstr "Rendre non-méta" + + +msgctxt "Operator" +msgid "Swap" +msgstr "Intervertir" + + +msgctxt "Operator" +msgid "Move Up" +msgstr "Vers le haut" + + +msgctxt "Operator" +msgid "Move Down" +msgstr "Vers le bas" + + msgctxt "Operator" msgid "Rename..." msgstr "Renommer…" @@ -114528,11 +114622,31 @@ msgid "Track Ordering..." msgstr "Ordre des pistes…" +msgctxt "Operator" +msgid "Add Above Selected" +msgstr "Ajouter au-dessus de la sélection" + + +msgctxt "Operator" +msgid "Linked Duplicate" +msgstr "Dupliquer liées" + + msgctxt "Operator" msgid "Stop Tweaking Strip Actions" msgstr "Arrêter l’ajustage des bandes d’action" +msgctxt "Operator" +msgid "Add Track" +msgstr "Ajouter une piste" + + +msgctxt "Operator" +msgid "Add Track Above Selected" +msgstr "Ajouter une piste au-dessus de la sélection" + + msgctxt "Operator" msgid "Stop Editing Stashed Action" msgstr "Arrêter l’édition de l’action réservée" @@ -117045,16 +117159,6 @@ msgid "Extract Face Set" msgstr "Extraire l’ensemble de faces" -msgctxt "Operator" -msgid "Invert Visible Face Sets" -msgstr "Inverser les ensembles de faces visibles" - - -msgctxt "Operator" -msgid "Show All Face Sets" -msgstr "Afficher tous les ensembles de faces" - - msgctxt "Operator" msgid "Randomize Colors" msgstr "Randomiser les couleurs" @@ -117489,10 +117593,6 @@ msgid "Vertex Group Weights" msgstr "Poids des groupes de sommets" -msgid "Mesh Analysis" -msgstr "Analyse du maillage" - - msgid "Face Angle" msgstr "Angles des faces" @@ -118092,11 +118192,6 @@ msgid "Duplicate Active Keyframe (All Layers)" msgstr "Dupliquer l’image clé active (tous les calques)" -msgctxt "Operator" -msgid "Insert Blank Keyframe (All Layer)" -msgstr "Insérer une image clé vide (tous les calques)" - - msgctxt "Operator" msgid "Hide Active Layer" msgstr "Cacher le calque actif" @@ -118941,10 +119036,6 @@ msgid "Int" msgstr "Entier" -msgid "PreviewCol" -msgstr "CoulPrévis" - - msgid "TexturedCol" msgstr "CoulTexturée" @@ -118969,10 +119060,6 @@ msgid "OS Loop" msgstr "Boucle OS" -msgid "PreviewLoopCol" -msgstr "CoulBouclePrévis" - - msgid "Int8" msgstr "Int8" @@ -119552,10 +119639,6 @@ msgid "No valid formats found" msgstr "Aucun format valide trouvé" -msgid "Can't allocate ffmpeg format context" -msgstr "Impossible d’allouer le contexte de format ffmpeg" - - msgid "Render width has to be 720 pixels for DV!" msgstr "La largeur de rendu doit être de 720 pixels pour le DV !" @@ -119568,10 +119651,6 @@ msgid "Render height has to be 576 pixels for DV-PAL!" msgstr "La hauteur du rendu doit être de 576 pixels pour le DV PAL !" -msgid "FFmpeg only supports 48khz / stereo audio for DV!" -msgstr "FFmpeg ne prend en charge que l’audio 48kHz stéréo pour le DV !" - - msgid "Error initializing video stream" msgstr "Erreur à l’initialisation du flux vidéo" @@ -121469,7 +121548,7 @@ msgstr "Voir une seule dans l’éditeur de graphes" msgctxt "Operator" msgid "View All in Graph Editor" -msgstr "Tout voir dans l’éditeur de graphes" +msgstr "Voir tout dans l’éditeur de graphes" msgctxt "Operator" @@ -121504,7 +121583,7 @@ msgstr "Ajouter tout à l’ensemble de clés" msgctxt "Operator" msgid "Add Single to Keying Set" -msgstr "Ajouter unique à l’ensemble de clés" +msgstr "Ajouter une seule à l’ensemble de clés" msgctxt "Operator" @@ -121534,12 +121613,12 @@ msgstr "Définir une redéfinition" msgctxt "Operator" msgid "Reset All to Default Values" -msgstr "Tout réinitialiser aux valeurs par défaut" +msgstr "Réinitialiser tout aux valeurs par défaut" msgctxt "Operator" msgid "Reset Single to Default Value" -msgstr "Réinitialiser unique à valeur par défaut" +msgstr "Réinitialiser une seule à la valeur par défaut" msgctxt "Operator" @@ -124792,6 +124871,10 @@ msgid " Materials," msgstr " Matériaux," +msgid " Textures (or linked)," +msgstr " Textures (ou liées)," + + msgid " Stencil," msgstr " Pochoir," @@ -126341,6 +126424,10 @@ msgid "Text not used by any node, no update done" msgstr "Le texte n’est utilisé par aucun nœud, aucune mise à jour n’a été faite" +msgid "Render size too large for GPU, use CPU compositor instead" +msgstr "Taille de rendu trop grande pour le GPU, utiliser plutôt le compositeur CPU" + + msgid "Not inside node group" msgstr "Pas à l’intérieur d’un groupe de nœuds" @@ -126945,6 +127032,14 @@ msgid "File '%s' could not be loaded" msgstr "Le fichier « %s » n’a pu être chargé" +msgid "Please select all related strips" +msgstr "Veuillez sélectionner toutes les bandes concernées" + + +msgid "No strips to paste" +msgstr "Aucune bande à coller" + + msgid "Slip offset: %s" msgstr "Décalage glissement : %s" @@ -126985,14 +127080,6 @@ msgid "No valid inputs to swap" msgstr "Pas d’entrées valides à intervertir" -msgid "Please select all related strips" -msgstr "Veuillez sélectionner toutes les bandes concernées" - - -msgid "No strips to paste" -msgstr "Aucune bande à coller" - - msgid "Please select two strips" msgstr "Veuillez sélectionner deux bandes" @@ -128597,6 +128684,10 @@ msgid "An exception occurred invoking USD hook '%s'" msgstr "Une exception a eu lieu à l’invocation du callback USD « %s »" +msgid "%s: Error: Couldn't get input socket %s for node %s" +msgstr "%s : Erreur : Impossible de trouver la prise d’entrée %s pour le nœud %s" + + msgid "Unsupported type %s for mesh data" msgstr "Type non pris en charge pour les données de maillage %s" @@ -128749,6 +128840,14 @@ msgid "USD does not support animating curve types. The curve type changes from % msgstr "USD ne prend pas en charge l’animation du type de courbe. Le type de courbe change de %s vers %s à la frame %f" +msgid "%s: Couldn't create USD shader for UV map" +msgstr "%s : Impossible de créer le shader USD pour la carte UV" + + +msgid "%s: Couldn't create USD shader for mapping node" +msgstr "%s : Impossible de créer le shader USD pour le nœud de placage" + + msgid "USD export: couldn't export in-memory texture to %s" msgstr "Export USD : les textures en mémoire n’ont pas pu être exportées vers %s" @@ -133192,10 +133291,6 @@ msgid "Incident" msgstr "Incident" -msgid "Ior" -msgstr "IDR" - - msgid "No mesh in active object" msgstr "Pas de maillage dans l’objet actif" @@ -133593,7 +133688,7 @@ msgstr "Écraser ce fichier avec une version plus ancienne de Blender ?" msgid "Save changes before closing?" -msgstr "Enregistrer les changements avant de quitter ?" +msgstr "Enregistrer les modifications avant de quitter ?" msgid "Unable to create user config path" @@ -134810,6 +134905,10 @@ msgid "Swahili (Kiswahili)" msgstr "Swahili (Kiswahili)" +msgid "Belarusian (беларуску)" +msgstr "Bélarusse (беларуску)" + + msgid "Complete" msgstr "Complètes" diff --git a/locale/po/ha.po b/locale/po/ha.po index 0740fa39e88..a166a8c7897 100644 --- a/locale/po/ha.po +++ b/locale/po/ha.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2017-12-25 14:01+0100\n" "Last-Translator: UMAR HARUNA ABDULLAHI \n" "Language-Team: BlenderNigeria \n" diff --git a/locale/po/he.po b/locale/po/he.po index c2c21adadef..ea08f932213 100644 --- a/locale/po/he.po +++ b/locale/po/he.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2023-10-06 09:54+0000\n" "Last-Translator: Eitan Traurig \n" "Language-Team: Hebrew \n" diff --git a/locale/po/hi.po b/locale/po/hi.po index ed11e6f6157..8017f51160d 100644 --- a/locale/po/hi.po +++ b/locale/po/hi.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2015-03-03 16:21+0530\n" "Last-Translator: Roshan Lal Gumasta \n" "Language-Team: Hindi \n" @@ -1401,6 +1401,14 @@ msgid "Save" msgstr "सहेजें" +msgid "Operator" +msgstr "संचालक" + + +msgid "Label" +msgstr "सूचक पत्र" + + msgid "Relative Path" msgstr "सापेक्ष पथ" @@ -2222,10 +2230,6 @@ msgid "Never" msgstr "कभी नहीं" -msgid "Label" -msgstr "सूचक पत्र" - - msgid "Links" msgstr "कड़ियाँ" @@ -4205,10 +4209,6 @@ msgid "Sculpt" msgstr "गढन" -msgid "Operator" -msgstr "संचालक" - - msgctxt "Operator" msgid "Sculpt Mode" msgstr "शिल्प रूप" @@ -4629,10 +4629,6 @@ msgid "Lock Y" msgstr "तालाबंदी y" -msgid "Refraction" -msgstr "अपवर्तन" - - msgid "Film" msgstr "चलचित्र" @@ -5591,6 +5587,10 @@ msgid "Auto-Step" msgstr "स्वत:-चरण" +msgid "Refraction" +msgstr "अपवर्तन" + + msgid "Paths:" msgstr "पथ:" diff --git a/locale/po/hu.po b/locale/po/hu.po index 5d9d7551195..d1b9eca1f01 100644 --- a/locale/po/hu.po +++ b/locale/po/hu.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2015-02-21 19:17+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -13,9 +13,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.7.4\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -25,9 +25,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -37,9 +37,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -49,9 +49,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -61,9 +61,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -73,9 +73,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -85,9 +85,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -97,9 +97,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -109,9 +109,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -121,9 +121,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -133,9 +133,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -145,9 +145,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -157,9 +157,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -169,9 +169,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -181,9 +181,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -193,9 +193,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -205,9 +205,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -217,9 +217,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -229,9 +229,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -241,9 +241,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -253,9 +253,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -265,9 +265,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -277,9 +277,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -289,9 +289,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -301,9 +301,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -313,9 +313,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -325,9 +325,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -337,9 +337,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -349,9 +349,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -361,9 +361,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-12-27 18:52+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -373,9 +373,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.7.1\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -385,9 +385,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -397,9 +397,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -409,9 +409,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -421,9 +421,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -433,9 +433,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -445,9 +445,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -457,9 +457,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -469,9 +469,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -481,9 +481,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -493,9 +493,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -505,9 +505,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -517,9 +517,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -529,9 +529,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -541,9 +541,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -553,9 +553,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -565,9 +565,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -577,9 +577,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -589,9 +589,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -601,9 +601,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -613,9 +613,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -625,9 +625,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -637,9 +637,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -649,9 +649,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -661,9 +661,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -673,9 +673,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -685,9 +685,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -697,9 +697,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -709,9 +709,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -721,9 +721,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-11-05 17:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -733,9 +733,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -745,9 +745,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -757,9 +757,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -769,9 +769,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -781,9 +781,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -793,9 +793,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -805,9 +805,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -817,9 +817,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -829,9 +829,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -841,9 +841,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -853,9 +853,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -865,9 +865,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -877,9 +877,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -889,9 +889,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -901,9 +901,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -913,9 +913,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -925,9 +925,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -937,9 +937,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -949,9 +949,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -961,9 +961,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -973,9 +973,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -985,9 +985,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -997,9 +997,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1009,9 +1009,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1021,9 +1021,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1033,9 +1033,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1045,9 +1045,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1057,9 +1057,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1069,9 +1069,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1081,9 +1081,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2015-01-10 20:46+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1093,9 +1093,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.7.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1105,9 +1105,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1117,9 +1117,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1129,9 +1129,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1141,9 +1141,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1153,9 +1153,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1165,9 +1165,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1177,9 +1177,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1189,9 +1189,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1201,9 +1201,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1213,9 +1213,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1225,9 +1225,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1237,9 +1237,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1249,9 +1249,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1261,9 +1261,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1273,9 +1273,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1285,9 +1285,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1297,9 +1297,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1309,9 +1309,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1321,9 +1321,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1333,9 +1333,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1345,9 +1345,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1357,9 +1357,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1369,9 +1369,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1381,9 +1381,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1393,9 +1393,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1405,9 +1405,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1417,9 +1417,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1429,9 +1429,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1441,9 +1441,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-12-27 18:52+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1453,9 +1453,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.7.1\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1465,9 +1465,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1477,9 +1477,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1489,9 +1489,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1501,9 +1501,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1513,9 +1513,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1525,9 +1525,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1537,9 +1537,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1549,9 +1549,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1561,9 +1561,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1573,9 +1573,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1585,9 +1585,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1597,9 +1597,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1609,9 +1609,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1621,9 +1621,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1633,9 +1633,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1645,9 +1645,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1657,9 +1657,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1669,9 +1669,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1681,9 +1681,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1693,9 +1693,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1705,9 +1705,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1717,9 +1717,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1729,9 +1729,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1741,9 +1741,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1753,9 +1753,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1765,9 +1765,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1777,9 +1777,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1789,9 +1789,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1801,9 +1801,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-11-05 17:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1813,9 +1813,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1825,9 +1825,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1837,9 +1837,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1849,9 +1849,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1861,9 +1861,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1873,9 +1873,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1885,9 +1885,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1897,9 +1897,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1909,9 +1909,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1921,9 +1921,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1933,9 +1933,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1945,9 +1945,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1957,9 +1957,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1969,9 +1969,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -1981,9 +1981,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -1993,9 +1993,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2005,9 +2005,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2017,9 +2017,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2029,9 +2029,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2041,9 +2041,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2053,9 +2053,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2065,9 +2065,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2077,9 +2077,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2089,9 +2089,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2101,9 +2101,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2113,9 +2113,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2125,9 +2125,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2137,9 +2137,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2149,9 +2149,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2161,9 +2161,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2015-01-30 16:20+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2173,9 +2173,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.7.4\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2185,9 +2185,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2197,9 +2197,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2209,9 +2209,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2221,9 +2221,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2233,9 +2233,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2245,9 +2245,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2257,9 +2257,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2269,9 +2269,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2281,9 +2281,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2293,9 +2293,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2305,9 +2305,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2317,9 +2317,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2329,9 +2329,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2341,9 +2341,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2353,9 +2353,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2365,9 +2365,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2377,9 +2377,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2389,9 +2389,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2401,9 +2401,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2413,9 +2413,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2425,9 +2425,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2437,9 +2437,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2449,9 +2449,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2461,9 +2461,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2473,9 +2473,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2485,9 +2485,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2497,9 +2497,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2509,9 +2509,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2521,9 +2521,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-12-27 18:52+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2533,9 +2533,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.7.1\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2545,9 +2545,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2557,9 +2557,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2569,9 +2569,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2581,9 +2581,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2593,9 +2593,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2605,9 +2605,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2617,9 +2617,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2629,9 +2629,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2641,9 +2641,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2653,9 +2653,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2665,9 +2665,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2677,9 +2677,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2689,9 +2689,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2701,9 +2701,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2713,9 +2713,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2725,9 +2725,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2737,9 +2737,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2749,9 +2749,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2761,9 +2761,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2773,9 +2773,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2785,9 +2785,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2797,9 +2797,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2809,9 +2809,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2821,9 +2821,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2833,9 +2833,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2845,9 +2845,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2857,9 +2857,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2869,9 +2869,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2881,9 +2881,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-11-05 17:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2893,9 +2893,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2905,9 +2905,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2917,9 +2917,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2929,9 +2929,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2941,9 +2941,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -2953,9 +2953,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2965,9 +2965,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2977,9 +2977,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -2989,9 +2989,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3001,9 +3001,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3013,9 +3013,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3025,9 +3025,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3037,9 +3037,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3049,9 +3049,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3061,9 +3061,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3073,9 +3073,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3085,9 +3085,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3097,9 +3097,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3109,9 +3109,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3121,9 +3121,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3133,9 +3133,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3145,9 +3145,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3157,9 +3157,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3169,9 +3169,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3181,9 +3181,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3193,9 +3193,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3205,9 +3205,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3217,9 +3217,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3229,9 +3229,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3241,9 +3241,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2015-01-10 20:46+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3253,9 +3253,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.7.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3265,9 +3265,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3277,9 +3277,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3289,9 +3289,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3301,9 +3301,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3313,9 +3313,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3325,9 +3325,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3337,9 +3337,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3349,9 +3349,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3361,9 +3361,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3373,9 +3373,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3385,9 +3385,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3397,9 +3397,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3409,9 +3409,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3421,9 +3421,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3433,9 +3433,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3445,9 +3445,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3457,9 +3457,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3469,9 +3469,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3481,9 +3481,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3493,9 +3493,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3505,9 +3505,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3517,9 +3517,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3529,9 +3529,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3541,9 +3541,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3553,9 +3553,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3565,9 +3565,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3577,9 +3577,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3589,9 +3589,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3601,9 +3601,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-12-27 18:52+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3613,9 +3613,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.7.1\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3625,9 +3625,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3637,9 +3637,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3649,9 +3649,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3661,9 +3661,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3673,9 +3673,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3685,9 +3685,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3697,9 +3697,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3709,9 +3709,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3721,9 +3721,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3733,9 +3733,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3745,9 +3745,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3757,9 +3757,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3769,9 +3769,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3781,9 +3781,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3793,9 +3793,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3805,9 +3805,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3817,9 +3817,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3829,9 +3829,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3841,9 +3841,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3853,9 +3853,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3865,9 +3865,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3877,9 +3877,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3889,9 +3889,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3901,9 +3901,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3913,9 +3913,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3925,9 +3925,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3937,9 +3937,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3949,9 +3949,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3961,9 +3961,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-11-05 17:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -3973,9 +3973,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3985,9 +3985,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -3997,9 +3997,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4009,9 +4009,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4021,9 +4021,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -4033,9 +4033,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4045,9 +4045,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4057,9 +4057,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4069,9 +4069,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4081,9 +4081,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -4093,9 +4093,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4105,9 +4105,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4117,9 +4117,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4129,9 +4129,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4141,9 +4141,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-11-05 16:47+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -4153,9 +4153,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.10\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4165,9 +4165,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4177,9 +4177,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4189,9 +4189,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4201,9 +4201,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-09-08 18:25+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -4213,9 +4213,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.9\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4225,9 +4225,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4237,9 +4237,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4249,9 +4249,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4261,9 +4261,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2014-02-06 23:05+0100\n" "Last-Translator: Pomsár Miklós \n" "Language-Team: MagyarBlender \n" @@ -4273,9 +4273,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.6.3\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:27+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4285,9 +4285,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-03 20:47+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4297,9 +4297,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-09 21:29+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -4309,9 +4309,9 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Basepath: .\n" "X-Generator: Poedit 1.5.5\n" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-08-19 16:10+0100\n" "Last-Translator: Pomsár András \n" "Language-Team: MagyarBlender \n" @@ -7250,6 +7250,14 @@ msgid "Save" msgstr "Mentés" +msgid "File Extensions" +msgstr "Fájlkiterjesztések" + + +msgid "Operator" +msgstr "Operátor" + + msgid "Relative Path" msgstr "Relatív útvonal" @@ -15650,10 +15658,6 @@ msgid "Falloff Type" msgstr "Elenyészés típusa" -msgid "Operator" -msgstr "Operátor" - - msgctxt "Sequence" msgid "Type" msgstr "Típus" @@ -16588,10 +16592,6 @@ msgid "Detail Size" msgstr "Részlet mérete" -msgid "Refraction" -msgstr "Fénytörés" - - msgid "Film" msgstr "Film" @@ -17779,10 +17779,6 @@ msgid "Process the render result through the compositing pipeline, if compositin msgstr "A render eredmény végigvitele a kompozitor folyamaton, ha a kompozitor csomópontok engedélyezve vannak" -msgid "File Extensions" -msgstr "Fájlkiterjesztések" - - msgid "Add the file format extensions to the rendered file name (eg: filename + .jpg)" msgstr "Fájlformátum kiterjesztések hozzáadása a renderelt fájl nevéhez (pl.: fájlnév + .jpg)" @@ -19266,6 +19262,10 @@ msgid "Exponent" msgstr "Exponenciális" +msgid "Refraction" +msgstr "Fénytörés" + + msgid "Paths:" msgstr "Útvonalak:" diff --git a/locale/po/id.po b/locale/po/id.po index 75b9c0583ae..62e50626a1f 100644 --- a/locale/po/id.po +++ b/locale/po/id.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2023-12-04 11:07+0000\n" "Last-Translator: Mohamad Rido \n" "Language-Team: Indonesian \n" diff --git a/locale/po/it.po b/locale/po/it.po index 73ceb42169d..dbb0fe10684 100644 --- a/locale/po/it.po +++ b/locale/po/it.po @@ -1,10 +1,10 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" -"PO-Revision-Date: 2023-12-04 05:17+0000\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" +"PO-Revision-Date: 2023-12-07 13:11+0000\n" "Last-Translator: Alessandro Vecchio \n" "Language-Team: Italian \n" "Language: it\n" @@ -911,6 +911,10 @@ msgid "Motion tracking tools" msgstr "Strumenti tracciatura movimento" +msgid "Dope Sheet" +msgstr "Foglio d'esposizione" + + msgid "Adjust timing of keyframes" msgstr "Aggiusta temporizzazione dei fotogrammi chiave" @@ -1195,6 +1199,10 @@ msgid "Full Path" msgstr "Percorso Completo" +msgid "Absolute path to the .blend file containing this asset extended with the path of the asset inside the file" +msgstr "Percorso assoluto del file .blend contenente questa risorsa, esteso con il percorso della risorsa all'interno del file" + + msgctxt "ID" msgid "Data-block Type" msgstr "Tipo Blocco-dati" @@ -1394,6 +1402,10 @@ msgid "World" msgstr "Mondo" +msgid "The local data-block this asset represents; only valid if that is a data-block in this file" +msgstr "Il blocco-dati locale rappresentato da questa risorsa; valido solo se si tratta di un blocco-dati in questo file" + + msgid "Asset Metadata" msgstr "Metadati degli Assets" @@ -1402,18 +1414,42 @@ msgid "Additional information about the asset" msgstr "Informazioni aggiuntive dell'asset" +msgid "Asset Shelf" +msgstr "Scaffale delle Risorse" + + +msgid "Regions for quick access to assets" +msgstr "Regioni di accesso rapido alle risorse" + + msgid "Asset Library" msgstr "Libreria Assets" +msgid "Choose the asset library to display assets from" +msgstr "Scegli la libreria di risorse da cui visualizzare le risorse" + + msgid "All" msgstr "Tutti" +msgid "Show assets from all of the listed asset libraries" +msgstr "Mostra risorse da tutte le librerie di risorse elencate" + + msgid "Current File" msgstr "File Corrente" +msgid "Show the assets currently available in this Blender session" +msgstr "Mostra le risorse attualmente disponibili in questa sessione di Blender" + + +msgid "Show the basic building blocks and utilities coming with Blender" +msgstr "Mostra i moduli di base e le utilità fornite con Blender" + + msgid "Custom" msgstr "Personalizzato" @@ -1422,10 +1458,18 @@ msgid "ID Name" msgstr "Nome ID" +msgid "If this is set, the asset gets a custom ID, otherwise it takes the name of the class used to define the menu (for example, if the class name is \"OBJECT_AST_hello\", and bl_idname is not set by the script, then bl_idname = \"OBJECT_AST_hello\")" +msgstr "Se impostato, la risorsa ottiene un ID personalizzato, altrimenti prende il nome della classe utilizzata per definire il menu (ad esempio, se il nome della classe è \"OBJECT_AST_ciao\" e bl_idname non è impostato dallo script, allora bl_idname = \"OBJECT_AST_ciao\")" + + msgid "Options" msgstr "Opzioni" +msgid "Options for this asset shelf type" +msgstr "Opzioni per questo tipo di scaffale delle risorse" + + msgid "Space Type" msgstr "Tipo Spazio" @@ -10349,6 +10393,18 @@ msgid "Save" msgstr "Salva" +msgid "File Extensions" +msgstr "Estensioni File" + + +msgid "Operator" +msgstr "Operatore" + + +msgid "Label" +msgstr "Etichetta" + + msgid "Icon ID" msgstr "ID Icona" @@ -15319,10 +15375,6 @@ msgid "Create proxy images in a custom directory (default is movie location)" msgstr "Crea immagini proxy in una directory personalizzata (la definita è la posizione del filmato)" -msgid "Label" -msgstr "Etichetta" - - msgid "Grease Pencil Data" msgstr "Dati Matita" @@ -33131,10 +33183,6 @@ msgid "Reverse Colors" msgstr "Inverti Colori" -msgid "Flip direction of vertex colors inside faces" -msgstr "Scambia la direzione dei colori di vertice all'interno delle facce" - - msgctxt "Operator" msgid "Rotate Colors" msgstr "Ruota Colori" @@ -39775,10 +39823,6 @@ msgid "Falloff Type" msgstr "Tipo Decadimento" -msgid "Operator" -msgstr "Operatore" - - msgid "Sharpen" msgstr "Affilatura" @@ -43931,14 +43975,6 @@ msgid "Active Palette Color" msgstr "Colore Tavolozza Attivo" -msgid "Refraction" -msgstr "Rifrazione" - - -msgid "Denoising" -msgstr "Riduzione Rumore" - - msgid "Integrator Presets" msgstr "Preimpostazioni Integratore" @@ -44426,6 +44462,10 @@ msgid "Indirect Lighting" msgstr "Illuminazione Indiretta" +msgid "Denoising" +msgstr "Riduzione Rumore" + + msgid "Shadows" msgstr "Ombre" @@ -48125,10 +48165,6 @@ msgid "Process the render result through the compositing pipeline, if compositin msgstr "Elabora il risultato del render attraverso la sequenza del Compositore, se i nodi di composizione sono abilitati" -msgid "File Extensions" -msgstr "Estensioni File" - - msgid "Add the file format extensions to the rendered file name (eg: filename + .jpg)" msgstr "Aggiunge l'estensione del formato al nome del file (es: nomefile + .jpg)" @@ -52828,8 +52864,8 @@ msgid "Display vertex-per-face normals as lines" msgstr "Mostra le normali vertex-per-face come linee" -msgid "Stat Vis" -msgstr "Vis Stat" +msgid "Mesh Analysis" +msgstr "Analisi Mesh" msgid "Display statistical information about the mesh" @@ -54344,6 +54380,10 @@ msgid "Auto-Step" msgstr "Passo Automatico" +msgid "Refraction" +msgstr "Rifrazione" + + msgid "Render Engine" msgstr "Motore di Rendering" @@ -56349,10 +56389,6 @@ msgid "Vertex Group Weights" msgstr "Peso Gruppo Vertici" -msgid "Mesh Analysis" -msgstr "Analisi Mesh" - - msgid "Face Angle" msgstr "Angolo Faccia" @@ -56964,10 +57000,6 @@ msgid "Int" msgstr "Int" -msgid "PreviewCol" -msgstr "AnteprimaCol" - - msgid "TexturedCol" msgstr "TexturizzatoCol" diff --git a/locale/po/ja.po b/locale/po/ja.po index 940cc9db84a..b0ef7b0ad3f 100644 --- a/locale/po/ja.po +++ b/locale/po/ja.po @@ -1,10 +1,10 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" -"PO-Revision-Date: 2023-10-30 06:54+0000\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" +"PO-Revision-Date: 2023-12-04 21:38+0000\n" "Last-Translator: Satoshi Yamasaki \n" "Language-Team: Japanese \n" "Language: ja\n" @@ -347,6 +347,10 @@ msgid "Optimize all kernels. Fastest rendering, may result in extra background C msgstr "全カーネルを最適化します.レンダリングが最も高速になりますが,バックグラウンドでの CPU の使用が追加されます" +msgid "MetalRT" +msgstr "MetalRT" + + msgid "On" msgstr "オン" @@ -13193,6 +13197,18 @@ msgid "Whether this path is saved in bookmarks, or generated from OS" msgstr "このパスをブックマークに保存,または OS から生成します" +msgid "File Extensions" +msgstr "ファイル拡張子" + + +msgid "Operator" +msgstr "オペレーター" + + +msgid "Label" +msgstr "ラベル" + + msgid "File Select Entry" msgstr "ファイル選択エントリ" @@ -26302,10 +26318,6 @@ msgid "Node tree consisting of linked nodes used for shading, textures and compo msgstr "シェーディング,テクスチャ,コンポジティングで使用される,ノードの連結からなるノードツリー" -msgid "Label" -msgstr "ラベル" - - msgid "The node tree label" msgstr "ノードツリー名" @@ -51742,11 +51754,6 @@ msgid "Name of the bone collection to unassign this bone from; empty to unassign msgstr "割り当てを解除するボーンのボーンコレクション名.空でアクティブボーンコレクションから割り当て解除します" -msgctxt "Operator" -msgid "Remove Bone from Bone collections" -msgstr "ボーンをボーンコレクションから除外" - - msgid "Unassign the bone from this bone collection" msgstr "ボーンをこのボーンコレクションから割り当て解除します" @@ -63522,19 +63529,11 @@ msgid "Reverse Colors" msgstr "色を反転" -msgid "Flip direction of vertex colors inside faces" -msgstr "面内のカラー属性の方向を反転します" - - msgctxt "Operator" msgid "Rotate Colors" msgstr "色を回転" -msgid "Rotate color attributes inside faces" -msgstr "面の中でカラー属性を回転させます" - - msgid "Counter Clockwise" msgstr "反時計回り" @@ -75781,19 +75780,6 @@ msgid "Modify Hidden" msgstr "非表示を変更" -msgid "Apply the edit operation to hidden Face Sets" -msgstr "編集の操作を非表示の面セットに適用します" - - -msgctxt "Operator" -msgid "Invert Face Set Visibility" -msgstr "面セットの可視性を反転" - - -msgid "Invert the visibility of the Face Sets of the sculpt" -msgstr "スカルプトの面セットの可視性を反転します" - - msgctxt "Operator" msgid "Face Set Lasso Gesture" msgstr "面セット投げ縄ジェスチャ" @@ -76059,10 +76045,6 @@ msgid "Use settings from here" msgstr "使用する設定" -msgid "Operator" -msgstr "オペレーター" - - msgid "Use settings from operator properties" msgstr "オペレータープロパティの設定を使用します" @@ -85353,18 +85335,6 @@ msgid "Panel containing UI elements" msgstr "UIの要素を含むパネル" -msgid "Refraction" -msgstr "屈折" - - -msgid "Screen Tracing" -msgstr "スクリーントレーシング" - - -msgid "Denoising" -msgstr "デノイズ" - - msgid "Light Groups" msgstr "ライトグループ" @@ -86243,10 +86213,18 @@ msgid "Indirect Lighting" msgstr "間接照明" +msgid "Denoising" +msgstr "デノイズ" + + msgid "Raytracing" msgstr "レイトレーシング" +msgid "Screen Tracing" +msgstr "スクリーントレーシング" + + msgid "Shadows" msgstr "影" @@ -94373,10 +94351,6 @@ msgid "Crop the rendered frame to the defined render region size" msgstr "レンダリングしたフレームを,設定されたレンダー領域のサイズで切り取ります" -msgid "File Extensions" -msgstr "ファイル拡張子" - - msgid "Add the file format extensions to the rendered file name (eg: filename + .jpg)" msgstr "レンダリングしたファイルの名前にファイルフォーマット拡張子を追加します(例:ファイル名+.jpg)" @@ -95547,14 +95521,6 @@ msgid "Brightness threshold for using sprite base depth of field" msgstr "被写界深度を元にしたスプライト使用の輝度のしきい値" -msgid "Diffuse Trace Options" -msgstr "ディフューズトレースオプション" - - -msgid "EEVEE settings for tracing diffuse reflections" -msgstr "EEVEE のディフューズ反射トレース用設定" - - msgid "Auto Bake" msgstr "自動ベイク" @@ -95771,26 +95737,6 @@ msgid "Percentage of render size to add as overscan to the internal render buffe msgstr "オーバースキャンとして内部レンダーバッファに追加する,レンダーサイズの割合" -msgid "Options Split" -msgstr "オプション分割" - - -msgid "Split settings per ray type" -msgstr "レイタイプ毎の分割設定" - - -msgid "Unified" -msgstr "統一" - - -msgid "All ray types use the same settings" -msgstr "全レイタイプで同じ設定を使用します" - - -msgid "Settings are individual to each ray type" -msgstr "各レイタイプで個別に設定します" - - msgid "Tracing Method" msgstr "トレーシング方法" @@ -95819,14 +95765,6 @@ msgid "EEVEE settings for tracing reflections" msgstr "EEVEE の反射トレース用設定" -msgid "Refraction Trace Options" -msgstr "屈折トレースオプション" - - -msgid "EEVEE settings for tracing refractions" -msgstr "EEVEE の屈折トレース用設定" - - msgid "Directional Shadows Resolution" msgstr "指向性の影の解像度" @@ -105454,8 +105392,8 @@ msgid "Display scene statistics overlay text" msgstr "シーン統計のオーバーレイテキストを表示します" -msgid "Stat Vis" -msgstr "統計の視覚化" +msgid "Mesh Analysis" +msgstr "メッシュ分析" msgid "Display statistical information about the mesh" @@ -106935,10 +106873,6 @@ msgid "Vector2D" msgstr "ベクトル2D" -msgid "2D float vector action, representing a thumbstick or trackpad" -msgstr "2D Float ベクトルアクション.サムスティックまたはトラックパッドを表します" - - msgid "3D pose action, representing a controller's location and rotation" msgstr "3Dポーズアクション.コントローラーの位置と回転を表します" @@ -108421,11 +108355,6 @@ msgid "Stop Move Left" msgstr "左移動を停止" -msgctxt "WindowManager" -msgid "Stop Mode Right" -msgstr "右移動を停止" - - msgctxt "WindowManager" msgid "Teleport" msgstr "テレポート" @@ -113250,6 +113179,10 @@ msgid "Light Clamping" msgstr "光の範囲制限" +msgid "Refraction" +msgstr "屈折" + + msgid "Cascade Size" msgstr "カスケードサイズ" @@ -115909,7 +115842,7 @@ msgstr "最小グリッド間隔" msgid "Only Insert Needed" -msgstr "必要な時のみを挿入" +msgstr "必要な時のみ挿入" msgid "Auto-Keyframing" @@ -116954,16 +116887,6 @@ msgid "Extract Face Set" msgstr "面セットを抽出" -msgctxt "Operator" -msgid "Invert Visible Face Sets" -msgstr "面セットの表示を反転" - - -msgctxt "Operator" -msgid "Show All Face Sets" -msgstr "すべての面セットを表示" - - msgctxt "Operator" msgid "Randomize Colors" msgstr "ランダムカラー" @@ -117388,10 +117311,6 @@ msgid "Vertex Group Weights" msgstr "頂点グループウェイト" -msgid "Mesh Analysis" -msgstr "メッシュ分析" - - msgid "Face Angle" msgstr "面の角度" @@ -118803,10 +118722,6 @@ msgid "Int" msgstr "Int" -msgid "PreviewCol" -msgstr "プレビュー色" - - msgid "TexturedCol" msgstr "テクスチャ色" @@ -118831,10 +118746,6 @@ msgid "OS Loop" msgstr "OSループ" -msgid "PreviewLoopCol" -msgstr "プレビューループ色" - - msgid "Int8" msgstr "Int8" @@ -119362,10 +119273,6 @@ msgid "No valid formats found" msgstr "有効なフォーマットがありません" -msgid "Can't allocate ffmpeg format context" -msgstr "ffmpeg フォーマットコンテクストがアロケートできません" - - msgid "Render width has to be 720 pixels for DV!" msgstr "DV用では幅が720ピクセルでないといけません!" @@ -119378,10 +119285,6 @@ msgid "Render height has to be 576 pixels for DV-PAL!" msgstr "DV-PAL用では高さが576ピクセルでないといけません!" -msgid "FFmpeg only supports 48khz / stereo audio for DV!" -msgstr "FFmpeg ではDVは48khz/ステレオ音声のみ対応しています!" - - msgid "Error initializing video stream" msgstr "ビデオストリーム初期化エラー" @@ -126664,6 +126567,14 @@ msgid "File '%s' could not be loaded" msgstr "ファイル「%s」が読み込めません" +msgid "Please select all related strips" +msgstr "関連するストリップをすべて選択してください" + + +msgid "No strips to paste" +msgstr "貼り付けるストリップがありません" + + msgid "Slip offset: %s" msgstr "スリップオフセット: %s" @@ -126704,14 +126615,6 @@ msgid "No valid inputs to swap" msgstr "入れ替えに適切な入力ではありません" -msgid "Please select all related strips" -msgstr "関連するストリップをすべて選択してください" - - -msgid "No strips to paste" -msgstr "貼り付けるストリップがありません" - - msgid "Please select two strips" msgstr "ストリップを2つ選択してください" @@ -132892,10 +132795,6 @@ msgid "Incident" msgstr "入射" -msgid "Ior" -msgstr "IOR" - - msgid "No mesh in active object" msgstr "アクティブオブジェクトにメッシュがありません" diff --git a/locale/po/ka.po b/locale/po/ka.po index 0fd097ce5a5..ed7b4ffb272 100644 --- a/locale/po/ka.po +++ b/locale/po/ka.po @@ -1,10 +1,10 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" -"PO-Revision-Date: 2023-12-04 05:17+0000\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" +"PO-Revision-Date: 2023-12-11 03:52+0000\n" "Last-Translator: Tamar \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -343,10 +343,18 @@ msgid "Optimize all kernels. Fastest rendering, may result in extra background C msgstr "ყველა ბირთვის ოპტიმიზაცია. უსწრაფესი რენდერი, შესაძლოა, გამოიწვიოს ფონზე CPU-ს დამატებითი გამოყენება" +msgid "MetalRT" +msgstr "MetalRT" + + msgid "MetalRT for ray tracing uses less memory for scenes which use curves extensively, and can give better performance in specific cases" msgstr "MetalRT სხივების მიდევნებისთვის ნაკლებ მეხსიერებას ხარჯავს იმ სცენებზე, რომლებიც ბევრ წირს იყენებენ, და შეუძლია, კონკრეტულ შემთხვევებში უკეთესად იმუშავოს" +msgid "On" +msgstr "ჩართული" + + msgid "Auto" msgstr "ავტომატური" @@ -1246,6 +1254,11 @@ msgid "Grease Pencil" msgstr "ცვილის ფანქარი" +msgctxt "ID" +msgid "Grease Pencil v3" +msgstr "Grease Pencil v3" + + msgctxt "ID" msgid "Image" msgstr "გამოსახულება" @@ -13033,6 +13046,18 @@ msgid "Whether this path is saved in bookmarks, or generated from OS" msgstr "ეს მისამართი სანიშნეებში ინახება, თუ OS-დან წარმოიქმნება" +msgid "File Extensions" +msgstr "ფაილის გაფართოებები" + + +msgid "Operator" +msgstr "ოპერატორი" + + +msgid "Label" +msgstr "იარლიყი" + + msgid "File Select Entry" msgstr "ფაილის მონიშნვის ჩანაწერი" @@ -25860,10 +25885,6 @@ msgid "Node tree consisting of linked nodes used for shading, textures and compo msgstr "კვანძური ხე, რომელიც შედგება შეფერადებისთვის, ტექსტურებისა და კომპოზიტინგისთვის გამოყენებული ურთიერთდაკავშირებული კვანძებისგან" -msgid "Label" -msgstr "იარლიყი" - - msgid "The node tree label" msgstr "კვანძური ხის იარლიყი" @@ -39943,11 +39964,6 @@ msgid "Name of the bone collection to unassign this bone from; empty to unassign msgstr "სახელი ძვალთა კოლექციისა, რომლისადმი კუთვნილებაც უნდა მოვუშალოთ ძვალს; ძვალთა აქტიური კოლექციისადმი კუთვნილების მოსაშლელად დატოვე ცარიელი" -msgctxt "Operator" -msgid "Remove Bone from Bone collections" -msgstr "მოაშორე ძვალი ძვალთა კოლექციებიდან" - - msgid "Unassign the bone from this bone collection" msgstr "მოუშალე ძვალს ძვალთა ამ კოლექციისადმი კუთვნილება" @@ -45477,6 +45493,11 @@ msgid "Circular" msgstr "წრიული" +msgctxt "GPencil" +msgid "Back" +msgstr "უკან" + + msgctxt "GPencil" msgid "Bounce" msgstr "ასხლტომა" @@ -49138,19 +49159,11 @@ msgid "Reverse Colors" msgstr "შემოატრიალე ფერები" -msgid "Flip direction of vertex colors inside faces" -msgstr "შეატრიალე წვეროთა ფერების მიმართულება წახნაგთა შორის" - - msgctxt "Operator" msgid "Rotate Colors" msgstr "აბრუნე ფერები" -msgid "Rotate color attributes inside faces" -msgstr "აბრუნე ფერთა ატრიბუტები წახნაგთა შორის" - - msgid "Counter Clockwise" msgstr "საათის ისრის საწინააღმდეგოდ" @@ -57792,7 +57805,7 @@ msgstr "დააექსპორტირე კლავიშების msgctxt "Operator" msgid "Import Key Configuration..." -msgstr "დააიმპორტირე კლავიშთა კონფიგურაცია" +msgstr "დააიმპორტირე კლავიშთა კონფიგურაცია..." msgid "Import key configuration from a Python script" @@ -59339,6 +59352,10 @@ msgid "Use the view axis to limit the force and set the gravity direction" msgstr "გამოიყენე ხედისმიერი ღერძი ალის შესაზღუდად და მიზიდულობის მიმართულების დასაყენებლად" +msgid "Starting Mouse" +msgstr "თაგვის საწყისი პოზიცია" + + msgid "Filter strength" msgstr "ფილტრის სიძლიერე" @@ -59501,6 +59518,10 @@ msgid "Max Vertex Count for Geodesic Move Preview" msgstr "გეოდეზიური სვლის წინასწარი ხედის წვეროთა მაქსიმალური რიცხვი" +msgid "Maximum number of vertices in the mesh for using geodesic falloff when moving the origin of expand. If the total number of vertices is greater than this value, the falloff will be set to spherical when moving" +msgstr "მეშში წვეროების მაქსიმალური რიცხვი გაფართოების ამოსავალი წერტილის გადაადგილებისას გეოდეზიური მილევის გამოსაყენებლად. თუ წვეროთა ჯამი ამ სიდიდეს აღემატება, მილევა გადაადგილებისას სფერულზე დაყენდება" + + msgid "Normal Smooth" msgstr "ნორმალის დაგლუვება" @@ -59514,7 +59535,7 @@ msgstr "სამიზნე მონაცემები" msgid "Data that is going to be modified in the expand operation" -msgstr "მონაცემები, რომლებიც მოდიფიცირებული იქნება გაფართოების ოპერაციის დროს" +msgstr "მონაცემები, რომლებიც მოდიფიცირებული იქნება გაფართოების ოპერაციის დროს" msgid "Auto Create" @@ -59627,19 +59648,6 @@ msgid "Modify Hidden" msgstr "დაამოდიფიცირე დამალული" -msgid "Apply the edit operation to hidden Face Sets" -msgstr "გამოიყენე რედაქტირების ოპერაცია დამალულ წახნაგთა ნაკრებზე" - - -msgctxt "Operator" -msgid "Invert Face Set Visibility" -msgstr "შეაქციე წახნაგთა ნაკრების ხილულობა" - - -msgid "Invert the visibility of the Face Sets of the sculpt" -msgstr "შეაქციე ნაძერწის წახნაგების ნაკრებთა ხილულობა" - - msgid "Add face set within the lasso as you move the brush" msgstr "ფუნჯის მოძრაობისას ქამადით გამოსახულ ფორმაში დაამატე წახნაგების ჯგუფი" @@ -59734,26 +59742,299 @@ msgid "Create Face Sets using Edge Creases as boundaries" msgstr "შექმენი წახნაგთა ნაკრებები წიბოთა ნაკერების ზღუდეებად გამოყენებით" +msgid "Face Sets from Bevel Weight" +msgstr "წახნაგთა ნაკრები ცერობის წონისგან" + + +msgid "Create Face Sets using Bevel Weights as boundaries" +msgstr "შექმენი წახნაგთა ნაკრები ზღუდეებად ცერობის წონების გამოყენების გზით" + + +msgid "Face Sets from Sharp Edges" +msgstr "წახნაგთა ნაკრებები მკვეთრი წიბოებისგან" + + +msgid "Create Face Sets using Sharp Edges as boundaries" +msgstr "შექმები წახნაგთა ნაკრებები ზღუდეებად მკვეთრი წიბოების გამოყენებით" + + +msgid "Face Sets from Face Set Boundaries" +msgstr "წახნაგთა ნაკრებები წახნაგთა ნაკრების ზღუდეებისგან" + + +msgid "Create a Face Set per isolated Face Set" +msgstr "შექმენი წახნაგთა ნაკრები ყოველ იზოლირებულ წახნაგთა ნაკრებზე" + + +msgid "Minimum value to consider a certain attribute a boundary when creating the Face Sets" +msgstr "მინიმალური მნიშვნელობა წახნაგების ნაკრებთა შექმნისას რომელიმე ატრიბუტის ზღუდედ ჩასათვლელად" + + +msgctxt "Operator" +msgid "Randomize Face Sets Colors" +msgstr "გააშემთხვევითე წახნაგების ნაკრებთა ფერები" + + +msgid "Generates a new set of random colors to render the Face Sets in the viewport" +msgstr "წარმოქმნის შემთხვევით ფერთა ახალ ნაკრებს სარკმელში წახნაგების ნაკრებთა დასარენდერებლად" + + +msgctxt "Operator" +msgid "Mask by Color" +msgstr "შენიღბე ფერის მიხედვით" + + +msgid "Creates a mask based on the active color attribute" +msgstr "აქტიური ფერით ატრიბუტის მიხედვით ჰქმნის ნიღაბს" + + +msgid "Invert the generated mask" +msgstr "შეაქციე წარმოქმნილი ნიღაბი" + + +msgid "Preserve Previous Mask" +msgstr "შეინარჩუნე წინა ნიღაბი" + + +msgid "Preserve the previous mask and add or subtract the new one generated by the colors" +msgstr "შეინარჩუნე უწინდელი ნიღაბი და დაამატე, ან გამოაკელი ფერების მიერ წარმოქმნილი ახალი შენიღბვა" + + +msgid "How much changes in color affect the mask generation" +msgstr "რამდენად ახდებს ნიღბის წარმოქმნაზე გავლენას ფერის ცვლილება" + + +msgctxt "Operator" +msgid "Mask Filter" +msgstr "ნიღბის ფილტრი" + + +msgid "Applies a filter to modify the current mask" +msgstr "იყენებს ფილტრს ამჟამინდელი შენიღბვის დასამოდიფიცირებლად" + + +msgid "Auto Iteration Count" +msgstr "ავტოიტერაციების რიცხვი" + + +msgid "Use a automatic number of iterations based on the number of vertices of the sculpt" +msgstr "გამოიყენე იტერაციათა ავტომატური რიცხვი, რომელიც ნაძერწის წვეროთა რაოდენობაზეა დაფუძნებული" + + +msgid "Filter that is going to be applied to the mask" +msgstr "ფილტრი, რომელიც იქნება გამოყენებული ნიღაბზე" + + +msgid "Smooth Mask" +msgstr "შეარბილე ნიღაბი" + + +msgid "Smooth mask" +msgstr "შეარბილე ნიღაბი" + + +msgid "Sharpen Mask" +msgstr "გაამკვეთრე ნიღაბი" + + +msgid "Sharpen mask" +msgstr "გაამკვეთრე ნიღაბი" + + +msgid "Grow Mask" +msgstr "გაზარდე ნიღაბი" + + +msgid "Grow mask" +msgstr "გაზარდე ნიღაბი" + + +msgid "Shrink Mask" +msgstr "შეკუმშე ნიღაბი" + + +msgid "Shrink mask" +msgstr "შეკუმშე ნიღაბი" + + +msgid "Increase Contrast" +msgstr "გაზარდე კონტრასტი" + + +msgid "Increase the contrast of the paint mask" +msgstr "გაზარდე დახატული ნიღბის კონტრასტი" + + +msgid "Decrease Contrast" +msgstr "შეამცირე კონტრასტი" + + +msgid "Decrease the contrast of the paint mask" +msgstr "შეამცირე დახატული ნიღბის კონტრასტი" + + +msgid "Number of times that the filter is going to be applied" +msgstr "რამდენჯერ იქნება ფილტრი გამოყენებული" + + +msgctxt "Operator" +msgid "Mask From Cavity" +msgstr "ნიღაბი ჩაქნექილობებისგან" + + +msgid "Creates a mask based on the curvature of the surface" +msgstr "ქმნის ნიღაბს ზედაპირის სიმრუდის მიხედვით" + + +msgid "Cavity (Inverted)" +msgstr "ჩაზნექილობა (შექცეული)" + + +msgid "Mix mode" +msgstr "შერევის რეჟიმი" + + +msgid "Use settings from here" +msgstr "გამოიყენე პარამეტრები აქედან" + + +msgid "Use settings from operator properties" +msgstr "გამოიყენე პარამეტრები ოპერატორის თვისებებიდან" + + +msgid "Use settings from brush" +msgstr "გამოიყენე პარამეტრები ფუნჯიდან" + + +msgid "Use settings from scene" +msgstr "გამოიყენე პარამეტრები სცენიდან" + + +msgid "Creates a new mask for the entire mesh" +msgstr "ქმნის ახალ ნიღაბს მთელი მეშისთვის" + + +msgid "Random per Vertex" +msgstr "შემთხვევითი ყოველ წვეროზე" + + +msgid "Random per Face Set" +msgstr "შემთხვევითი ყოველ წახნაგთა ნაკრებზე" + + +msgid "Random per Loose Part" +msgstr "შემთხვევითი ყოველ დაუმაგრებელ ნაწილზე" + + +msgctxt "Operator" +msgid "Filter Mesh" +msgstr "გაფილტრე მეში" + + msgid "Applies a filter to modify the current mesh" msgstr "იყენებს ფილტრს მიმდინარე მეშის მოდიფიკაციისთვის" +msgid "Apply the deformation in the selected axis" +msgstr "გამოიყენე დეფორმაცია მონიშნულ ღერძში" + + +msgid "Deform in the X axis" +msgstr "დაადეფორმირე X ღერძში" + + +msgid "Deform in the Y axis" +msgstr "დაადეფორმირე Y ღერძში" + + +msgid "Deform in the Z axis" +msgstr "დაადეფორმირე Z ღერძში" + + +msgid "Use the local axis to limit the displacement" +msgstr "გადანაცვლების შესაზღუდად გამოიყენე ლოკალური ღერძი" + + +msgid "Use the global axis to limit the displacement" +msgstr "გადანაცვლების შესაზღუდად გამოიყენე გლობალური ღერძი" + + +msgid "Use the view axis to limit the displacement" +msgstr "გადანაცვლების შესაზღუდად გამოიყენე ხედის ღერძი" + + +msgid "Curvature Smooth Iterations" +msgstr "სიმრუდის დაგლუვების იტერაციები" + + +msgid "Intensify Details" +msgstr "გააინტენსიურე დეტალები" + + +msgid "Smooth Ratio" +msgstr "დაგლუვების ფარდობა" + + +msgid "How much smoothing is applied to polished surfaces" +msgstr "რა ოდენობის დაგლუვება გამოიყენება გაპრიალებულ ზედაპირებზე" + + +msgid "Smooth mesh" +msgstr "დააგლუვე მეში" + + +msgid "Scale mesh" +msgstr "დაამასშტაბირე მეში" + + +msgid "Inflate mesh" +msgstr "გაბერე მეში" + + +msgid "Morph into sphere" +msgstr "დაამორფირე სფეროდ" + + +msgid "Randomize vertex positions" +msgstr "გააშემთხვევითე წვეროთა პოზიციები" + + +msgid "Relax mesh" +msgstr "მოუშვი მეში" + + msgid "Relax Face Sets" -msgstr "წახნაგების წყების მოშვება" +msgstr "მოუშვი წახნაგების ნაკრები" + + +msgid "Smooth the edges of all the Face Sets" +msgstr "დააგლუვე წახნაგთა ყველა ნაკრების წიბოები" msgid "Surface Smooth" msgstr "ზედაპირის დაგლუვება" +msgid "Smooth the surface of the mesh, preserving the volume" +msgstr "დააგლუვე მეშის ზედაპირი, მოცუოლობის შენარჩუნებით" + + msgid "Sharpen" -msgstr "გამახვილება" +msgstr "გაამკვეთრე" + + +msgid "Sharpen the cavities of the mesh" +msgstr "გაამკვეთრე მეშის ჩაზნექილობები" msgid "Enhance Details" msgstr "დეტალების გაუმჯობესება" +msgid "Enhance the high frequency surface detail" +msgstr "გააუმჯობესე მაღალი სიხშირის ზედაპირის დეტალები" + + msgid "Erase Displacement" msgstr "გადანაცვლების წაშლა" @@ -59767,6 +60048,27 @@ msgid "Project the geometry onto a plane defined by a line" msgstr "დააპროექცირე გეომეტრია ხაზით განსაზღვრულ სიბრტყეზე" +msgid "Sample the vertex color of the active vertex" +msgstr "აიღე აქტიური წვეროს ფერის ნიმუში" + + +msgctxt "Operator" +msgid "Sample Detail Size" +msgstr "აიღე დეტალის ზომის ნიმუში" + + +msgid "Sample the mesh detail on clicked point" +msgstr "აიღე მეშის დეტალის ნიმუში დაწკაპუნებული წერტილიდან" + + +msgid "Screen coordinates of sampling" +msgstr "ნიმუშის აღების კოორდინატები ეკრანზე" + + +msgid "Detail Mode" +msgstr "დეტალის რეჟიმი" + + msgid "Dyntopo" msgstr "დინტოპო" @@ -59776,63 +60078,216 @@ msgid "Sculpt Mode" msgstr "ძერწვის რეჟიმი" +msgid "Toggle sculpt mode in 3D view" +msgstr "გადართე ძერწვის რეჟიმი 3გ ხედში" + + +msgctxt "Operator" +msgid "Set Detail Size" +msgstr "დააყენე დეტალის ზომა" + + +msgid "Set the mesh detail (either relative or constant one, depending on current dyntopo mode)" +msgstr "დააყენე მეშის დეტალი (ან ფარდობითი, ან მუდმივი, დინტოპოს მიმდინარე რეჟიმის მიხედვით)" + + msgctxt "Operator" msgid "Set Persistent Base" msgstr "დააყენე მუდმივი ფუძე" +msgctxt "Operator" +msgid "Set Pivot Position" +msgstr "დააყენე ბრუნვის ცენტრის პოზიცია" + + +msgid "Sets the sculpt transform pivot position" +msgstr "აყენებს ნაძერწის გარდაქმნის ბრუნვის ცენტრის პოზიციას" + + +msgid "Sets the pivot to the origin of the sculpt" +msgstr "აყენებს ბრუნვის ცენტრს ნაძერწის ამოსავალ წერტილთან" + + +msgid "Unmasked" +msgstr "შეუნიღბავი" + + +msgid "Sets the pivot position to the average position of the unmasked vertices" +msgstr "აყენებს ბრუნვის ცენტრის პოზიციას შეუნიღბავი წვეროების საშუალო პოზიციასთან" + + +msgid "Mask Border" +msgstr "ნიღბის საზღვარი" + + +msgid "Sets the pivot position to the center of the border of the mask" +msgstr "აყენებს ბრუნვის ცენტრის პოზიციას ნიღბის საზღვრის ცენტრთან" + + msgid "Active Vertex" msgstr "აქტიური წვერო" +msgid "Sets the pivot position to the active vertex position" +msgstr "აყენებს ბრუნვის ცენტრის პოზიციას აქტიური წვეროს პოზიციასთან" + + +msgid "Sets the pivot position to the surface under the cursor" +msgstr "აყენებს ბრუნვის ცენტრის პოზიციას კურსორს ქვეში მდებარე ზედაპირთან" + + +msgid "Mouse Position X" +msgstr "თაგვის პოზიცია X" + + +msgid "Position of the mouse used for \"Surface\" mode" +msgstr "თაგვის პოზიცია გამოყენებული რეჟიმისთვის \"ზედაპირი\"" + + +msgid "Mouse Position Y" +msgstr "თაგვის პოზიცია Y" + + +msgid "Symmetrize the topology modifications" +msgstr "გაასიმეტრიულე ტოპოლოგიის მოდიფიკაციები" + + +msgid "Distance within which symmetrical vertices are merged" +msgstr "მანძილი, რომლის ფარგლებშიც სიმეტრიული წვეროები შეირწყმება" + + msgid "Trims the mesh within the box as you move the brush" msgstr "ფუნჯის მოძრაობით ჭრის მართკუთხედში მოქცეულ მეშს" +msgid "Extrude Mode" +msgstr "ამოყვანის რეჟიმი" + + +msgid "Project back faces when extruding" +msgstr "ამოყვანისას დააპროექცირე წახნაგთა უკუმხარეები" + + +msgid "Extrude back faces by fixed amount" +msgstr "დააპროექცირე უკუმხარეები ფიქსირებული ოდენობით" + + msgid "Trim Mode" msgstr "მოჭრის რეჟიმი" +msgid "Use a difference boolean operation" +msgstr "გამოიყენე სხვაობის ლოგიკური ოპერაცია" + + +msgid "Use a union boolean operation" +msgstr "გამოიყენე ერთობის ლოგიკური ოპერაცია" + + +msgid "Join the new mesh as separate geometry, without performing any boolean operation" +msgstr "შეაერთე ახალი მეში ცალკე გეომეტრიად, ყოველგვარი ლოგიკური ოპერაციის ჩატარების გარეში" + + msgid "Shape Orientation" msgstr "ფორმის ორიენტირება" +msgid "Use the view to orientate the trimming shape" +msgstr "გამოიყენე ხედი მოჭრის ფორმის ორიენტირებისათვის" + + +msgid "Use the surface normal to orientate the trimming shape" +msgstr "გამოიყენე ზედაპირის ნორმალი მოჭრის ფორმის ორიენტირებისთვის" + + msgid "Use Cursor for Depth" msgstr "სიღრმისთვის გამოიყენე კურსორი" +msgid "Use cursor location and radius for the dimensions and position of the trimming shape" +msgstr "გამოიყენე ადგილმდებარეობა და რადიუსი მოჭრის ფორმის პოზიციისა და განზომილებებისთვის" + + msgid "Trims the mesh within the lasso as you move the brush" msgstr "ფუნჯის მოძრაობით ჭრის ქამანდის მონახაზში მოქცეულ მეშს" +msgctxt "Operator" +msgid "Sculpt UVs" +msgstr "გამოძერწე UV-ები" + + +msgid "Sculpt UVs using a brush" +msgstr "გამოძერწე UV-ები ფუნჯის მეშვეობით" + + +msgid "Switch brush to relax mode for duration of stroke" +msgstr "მოსმის განმავლობაში გადაიყვანე ფუნჯი მოშვების რეჟიმში" + + +msgctxt "Operator" +msgid "Change Effect Input" +msgstr "შეცვალე ეფექტის შენატანი" + + +msgctxt "Operator" +msgid "Change Effect Type" +msgstr "შეცვალე ეფექტის ტიპი" + + msgctxt "Sequence" msgid "Type" msgstr "ტიპი" +msgid "Sequencer effect type" +msgstr "სეკვენსერის ეფექტის ტიპი" + + msgctxt "Sequence" msgid "Add" msgstr "დამატება" +msgid "Add effect strip type" +msgstr "ეფექტის ლენტის ტიპი დამატება" + + msgctxt "Sequence" msgid "Subtract" msgstr "გამოაკელი" +msgid "Subtract effect strip type" +msgstr "ეფექტის ლენტის ტიპი გამოკლება" + + msgctxt "Sequence" msgid "Alpha Over" msgstr "ალფა ზემოდან" +msgid "Alpha Over effect strip type" +msgstr "ეფექტის ლენტის ტიპი ალფა ზემოდან" + + msgctxt "Sequence" msgid "Alpha Under" msgstr "ალფა ქვეშ" +msgid "Alpha Under effect strip type" +msgstr "ეფექტის ლენტის ტიპი ალფა ქვეშ" + + msgctxt "Sequence" msgid "Gamma Cross" -msgstr "ფერთა გამის ურთიერთკვეთა" +msgstr "გამის ურთიერთკვეთა" + + +msgid "Gamma Cross effect strip type" +msgstr "ეფექტის ლენტის ტიპი გამის ურთიერთკვეთა" msgctxt "Sequence" @@ -59840,19 +60295,35 @@ msgid "Multiply" msgstr "გამრავლება" +msgid "Multiply effect strip type" +msgstr "ეფექტის ლენტის ტიპი გამრავლება" + + msgctxt "Sequence" msgid "Wipe" msgstr "გაწმენდა" +msgid "Wipe effect strip type" +msgstr "ეფექტის ლენტის ტიპი გაწმენდა" + + msgctxt "Sequence" msgid "Glow" msgstr "ელვარება" +msgid "Glow effect strip type" +msgstr "ეფექტის ლენტის ტიპი ელვარება" + + msgctxt "Sequence" msgid "Transform" -msgstr "გარდაქმენი" +msgstr "გარდაქმნა" + + +msgid "Transform effect strip type" +msgstr "ეფექტის ლენტის ტიპი გარდაქმნა" msgctxt "Sequence" @@ -59860,6 +60331,10 @@ msgid "Color" msgstr "ფერი" +msgid "Color effect strip type" +msgstr "ეფექტის ლენტის ტიპი ფერი" + + msgctxt "Sequence" msgid "Speed" msgstr "სიჩქარე" @@ -59890,29 +60365,104 @@ msgid "Color Mix" msgstr "ფერების შეზავება" +msgctxt "Operator" +msgid "Change Data/Files" +msgstr "შეცვალე მონაცემები/ფაილები" + + msgctxt "Operator" msgid "Change Scene" msgstr "სცენის შეცვლა" +msgid "Change Scene assigned to Strip" +msgstr "შეცვალე ლენტას მიკუთვნებული სცენა" + + msgctxt "Operator" msgid "Copy" msgstr "დააკოპირე" +msgid "Cursor location in normalized preview coordinates" +msgstr "კურსორის მდებარეობა ნორმალიზებული წინასწარი ხედის კოორდინატებში" + + +msgid "Delete selected strips from the sequencer" +msgstr "წაშალე მონიშნული ლენტები სეკვენსერიდან" + + msgid "Delete Data" msgstr "მონაცემთა წაშლა" +msgid "After removing the Strip, delete the associated data also" +msgstr "ლენტის მოშორების შემდეგ წაშალე მასთან ასოცირებული მონაცემებიც" + + +msgid "Duplicate the selected strips" +msgstr "დაადუბლირე მონიშნული ლენტები" + + +msgid "Duplicate selected strips and move them" +msgstr "დაადუბლირე მონიშნული ლენტები და გადააადგილე" + + +msgctxt "Operator" +msgid "Add Effect Strip" +msgstr "დაამატე ეფექტის ლენტი" + + +msgid "Add an effect to the sequencer, most are applied on top of existing strips" +msgstr "დაამატე სეკვენსერში ეფექტი, უმეტესობა არსებული ლენტების ზემოდან გამოიყენება" + + +msgid "Channel to place this strip into" +msgstr "ლენტის მოსათავსებელი არხი" + + +msgid "Allow Overlap" +msgstr "დაუშვი გადაფარება" + + +msgid "Override Overlap Shuffle Behavior" +msgstr "უკუაგდე გადაფარების არევის ქცევა" + + +msgid "Replace Selection" +msgstr "ჩაანაცვლე მონიშნული" + + +msgid "Replace the current selection" +msgstr "ჩაანაცვლე მიმდინარე მონიშვნა" + + msgctxt "Operator" msgid "Export Subtitles" msgstr "სუბტიტრების ექსპორტი" +msgid "Export .srt file containing text strips" +msgstr "დააექსპორტირე .srt ფაილის შემცველი ტექსტის ლენტები" + + +msgctxt "Operator" +msgid "Add Fades" +msgstr "დაამატე ქრობები" + + +msgid "Adds or updates a fade animation for either visual or audio strips" +msgstr "ამატებს, ან ანახლებს ქრობის ანიმაციას ვიზუალური, ან აუდიო ლენტებისთვის" + + msgid "Fade Duration" msgstr "ქრობის ხანგრძლივობა" +msgid "Duration of the fade in seconds" +msgstr "ქრობის ხანგრძლივობა წამებში" + + msgid "Fade Type" msgstr "ქრობის ტიპი" @@ -59933,63 +60483,294 @@ msgid "From Current Frame" msgstr "მიმდინარე კადრიდან" +msgid "Fade from the time cursor to the end of overlapping sequences" +msgstr "ქრობა დროის კურსორიდან ურთიერთგადაფარებული სეკვენციების ბოლოსკენ" + + msgid "To Current Frame" msgstr "მიმდინარე კადრისკენ" +msgid "Fade from the start of sequences under the time cursor to the current frame" +msgstr "ქრობა დროის კურსორის ქვეშ მდებარე სეკვენციების დასაწყისიდან მიმდინარე კადრამდე" + + msgctxt "Operator" msgid "Clear Fades" msgstr "ქრობების გასუფთავება" +msgid "Removes fade animation from selected sequences" +msgstr "მონიშნულ სეკვენციებს ხსნის ქრობის ანიმაციას" + + msgctxt "Operator" msgid "Insert Gaps" msgstr "ნაპრალების ჩასმა" +msgid "Insert gap at current frame to first strips at the right, independent of selection or locked state of strips" +msgstr "ჩასვი ნაპრალი მიმდინარე კადრთან მარჯვნივ პირველ ლენტებამდე, ლენტების მონიშვნისა და ბლოკირების მიუხედავად" + + +msgid "Frames to insert after current strip" +msgstr "მიმდინარე ლენტის შემდეგ ჩასასმელი კადრები" + + msgctxt "Operator" msgid "Remove Gaps" msgstr "ნაპრალების მოცილება" +msgid "Remove gap at current frame to first strip at the right, independent of selection or locked state of strips" +msgstr "მოაშორე ნაპრალი მიმდინარე კადრთან მარჯვნივ პირველ ლენტებამდე, ლენტების მონიშვნისა და ბლოკირების მიუხედავად" + + msgid "All Gaps" msgstr "ყველა ნაპრალი" +msgctxt "Operator" +msgid "Add Image Strip" +msgstr "დაამატე გამოსახულების ლენტა" + + +msgid "Add an image or image sequence to the sequencer" +msgstr "დაამატე სეკვენსერში გამოსახულება, ან გამოსახულებათა თანამიმდევრობა" + + +msgid "Scale fit method" +msgstr "მასშტაბის მორგების მეთოდი" + + +msgid "Scale image to fit within the canvas" +msgstr "დაამასშტაბირე გამოსახულება ტილოზე დასატევად" + + +msgid "Scale to Fill" +msgstr "დაამასშტაბირე შესავსებად" + + +msgid "Scale image to completely fill the canvas" +msgstr "დაამასშტაბირე გამოსახულება ტილოს სრულიად შესავსებად" + + +msgid "Stretch to Fill" +msgstr "გაწელე შესავსებად" + + +msgid "Stretch image to fill the canvas" +msgstr "გაწელე გამოსახულება ტილოს შესავსებად" + + +msgid "Use Original Size" +msgstr "გამოიყენე თავდაპირველი ზომა" + + +msgid "Keep image at its original size" +msgstr "დატოვე გამოსახულება თავის თავდაპირველ ზომაზე" + + +msgid "Set View Transform" +msgstr "დააყენე ხედის გარდაქმნა" + + +msgid "Set appropriate view transform based on media color space" +msgstr "დააყენე ხედის ჯეროვანი გარდაქმნა მედიის ფერითი სივრცის მიხედვით" + + +msgctxt "Operator" +msgid "Separate Images" +msgstr "განაცალკევე გამოსახულებები" + + +msgid "On image sequence strips, it returns a strip for each image" +msgstr "გამოსახულებათა თანამიმდევრობის ლენტებზე, აბრუნებს ლენტას ყოველი გამოსახულებისთვის" + + +msgid "Length of each frame" +msgstr "თითოეული კადრის სიგრძე" + + msgctxt "Operator" msgid "Lock Strips" msgstr "ლენტების დაბლოკვა" +msgid "Lock strips so they can't be transformed" +msgstr "დაბლოკე ლენტები, რომ ვეღარ გარდაიქმნან" + + +msgctxt "Operator" +msgid "Add Mask Strip" +msgstr "დაამატე ნიღბის ლენტა" + + +msgid "Add a mask strip to the sequencer" +msgstr "დაამატე სეკვენსერს ნიღბის ლენტა" + + +msgctxt "Operator" +msgid "Make Meta Strip" +msgstr "გააკეთე მეტა ლენტა" + + +msgid "Group selected strips into a meta-strip" +msgstr "დააჯგუფე მონიშნული ლენტები მეტა-ლენტად" + + +msgctxt "Operator" +msgid "UnMeta Strip" +msgstr "განამეტავე ლენტა" + + +msgid "Put the contents of a meta-strip back in the sequencer" +msgstr "დააბრუნე მეტა-ლენტის შიგთავსი სეკვენსერში" + + +msgctxt "Operator" +msgid "Toggle Meta Strip" +msgstr "გადართე მეტა ლენტა" + + +msgid "Toggle a meta-strip (to edit enclosed strips)" +msgstr "გადართე მეტა-ლენტა (მასში მოქცეულ ლენტების რედაქტირებისთვის)" + + +msgctxt "Operator" +msgid "Add Movie Strip" +msgstr "დაამატე ვიდეო ლენტა" + + +msgid "Add a movie strip to the sequencer" +msgstr "დაამატე სეკვენსერს ვიდეო ლენტა" + + +msgid "Adjust Playback Rate" +msgstr "დაარეგულირე დაკვრის სიხშირე" + + +msgid "Play at normal speed regardless of scene FPS" +msgstr "დაუკარი ნორმალური სიჩქარით სცენის FPS-ის მიუხედავად" + + +msgid "Load sound with the movie" +msgstr "დაუკარი ხმა ვიდეოსთან ერთად" + + +msgid "Use Movie Framerate" +msgstr "გამოიყენე ვიდეოს კადრების სიხშირე" + + +msgid "Use framerate from the movie to keep sound and video in sync" +msgstr "გამოიყენე კადრების სიხშირე ვიდეოდან, რათა შეინარჩუნო ხმისა და ვიდეოს სინქრონი" + + +msgctxt "Operator" +msgid "Add MovieClip Strip" +msgstr "დაამატე ვიდეოკლიპის ლენტა" + + +msgid "Add a movieclip strip to the sequencer" +msgstr "დაამატე სეკვენსერს ვიდეოკლიპის ლენტა" + + +msgctxt "Operator" +msgid "Mute Strips" +msgstr "ჩაახშე ლენტები" + + +msgid "Mute (un)selected strips" +msgstr "ჩაახშე მონიშნული/მოუნიშნავი ლენტები" + + +msgid "Mute unselected rather than selected strips" +msgstr "ჩაახშე მოუნიშნავი და არა მონიშნული ლენტები" + + msgctxt "Operator" msgid "Clear Strip Offset" msgstr "ლენტის აცდენის გასუფთავება" +msgid "Clear strip offsets from the start and end frames" +msgstr "გაასუფთავე ლენტის აცდენები საწყისი და ბოლო კადრებიდან" + + msgctxt "Operator" msgid "Paste" msgstr "ჩასვი" +msgid "Keep strip offset relative to the current frame when pasting" +msgstr "ჩასმისას ლენტის აცდენა მიმდინარე კადრთან მიმართებაში დატოვე" + + +msgctxt "Operator" +msgid "Reassign Inputs" +msgstr "ხელახლა მიაკუთვნე შენატანები" + + +msgid "Reassign the inputs for the effect strip" +msgstr "ხელახლა მიაკუთვნე შენატანები ეფექტის ლენტისთვის" + + msgctxt "Operator" msgid "Refresh Sequencer" msgstr "სეკვენსერის განახლება" +msgid "Refresh the sequencer editor" +msgstr "განაახლე სეკვენსერის რედაქტორი" + + msgctxt "Operator" msgid "Reload Strips" msgstr "ლენტების ხელახლა ჩატვირთვა" +msgid "Reload strips in the sequencer" +msgstr "ხელახლა ჩატვირთე ლენტები სეკვენსერში" + + msgid "Adjust Length" msgstr "სიგრძის დარეგულირება" +msgid "Adjust length of strips to their data length" +msgstr "დაარეგულირე ლენტების სიგრძე მონაცემთა სიგრძის მიხედვით" + + msgctxt "Operator" msgid "Set Render Size" msgstr "რენდერის ზომის დაყენება" +msgid "Set render size and aspect from active sequence" +msgstr "დააყენე რენდერის ზომა და პროპორცია აქტიური თანამიმდევრობიდან" + + +msgctxt "Operator" +msgid "Add Freeze Frame" +msgstr "დაამატე გაყინული კადრი" + + +msgid "Add freeze frame" +msgstr "დაამატე გაყინული კადრი" + + +msgid "Duration of freeze frame segment" +msgstr "გაყინული კადრის სეგმენტის ხანგრძლივობა" + + +msgid "Timeline Frame" +msgstr "დროის ზოლის კადრი" + + +msgid "Frame where key will be added" +msgstr "კადრი, რომელზეც სოლი დაემატება" + + msgctxt "Operator" msgid "Reset Retiming" msgstr "დროში გადანაწილების პარამეტრების ჩამოყრა" @@ -60000,19 +60781,143 @@ msgid "Set Speed" msgstr "სიჩქარის დაყენება" +msgid "Set speed of retimed segment" +msgstr "დააყენე სიჩქარე დროში ხელახლა განაწილებული სეგმენტისთვის" + + +msgid "New speed of retimed segment" +msgstr "დროში ხელახლა განაწილებული სეგმენტის ახალი სიჩქარე" + + +msgctxt "Operator" +msgid "Retime Strips" +msgstr "ხელახლა გაანაწილე ლენტები დროში" + + +msgctxt "Operator" +msgid "Add Speed Transition" +msgstr "დაამატე სიჩქარის გადასვლა" + + +msgid "Add smooth transition between 2 retimed segments" +msgstr "დაამატე თანაბარი გადასვლა დროში ხელახა განაწილებულ 2 სეგმენტს შორის" + + +msgid "Use mouse to sample color in current frame" +msgstr "გამოიყენე თაგვი მიმდინარე კადრში ფერის ნიმუშის ასაღებად" + + msgctxt "Operator" msgid "Update Scene Frame Range" msgstr "განაახლე სცენის კადრთა დიაპაზონი" +msgid "Update frame range of scene strip" +msgstr "განაახლე სცენის ლენტის კადრთა დიაპაზონი" + + +msgctxt "Operator" +msgid "Add Scene Strip" +msgstr "დაამატე სცენის ლენტა" + + +msgid "Add a strip to the sequencer using a Blender scene as a source" +msgstr "დაამატე სეკვენსერს ლენტა ბლენდერის სცენის წყაროდ გამოყენებით" + + +msgctxt "Operator" +msgid "Add Strip with a new Scene" +msgstr "დაამატე ლენტა ახალი სცენით" + + +msgid "Create a new Strip and assign a new Scene as source" +msgstr "შექმენი ახალი ლენტა და მიაკუთვნე ახალი სცენა წყაროდ" + + +msgid "Add new Strip with a new empty Scene with default settings" +msgstr "დაამატე ახალი ლენტა ნაგულისხმები პარმეტრების მქონე ცარიელი სცენით" + + +msgid "Add a new Strip, with an empty scene, and copy settings from the current scene" +msgstr "დაამატე ახალი ლენტა ცარიელი სცენით და დააკოპირე პარამეტრები მიმდინარე სცენიდან" + + +msgid "Add a Strip and make a full copy of the current scene" +msgstr "დაამატე ლენტა და გააკეთე მიმდინარე სცენის სრული ასლი" + + +msgid "Select a strip (last selected becomes the \"active strip\")" +msgstr "მონიშნე ლენტა (ბოლოს მონიშნული ხდება \"აქტიური ლენტა\")" + + +msgid "Use the object center when selecting, in edit mode used to extend object selection" +msgstr "მონიშვნისას გამოიყენე ობიექტის ცენტრი, დამუშავების რეჟიმში გამოიყენება ობიექტთა მონიშვნის განსავრცობად" + + +msgid "Linked Handle" +msgstr "დაკავშირებული სახელური" + + +msgid "Select handles next to the active strip" +msgstr "მონიშნე აქტიური ლენტის გვერდით მყოფი სახელურები" + + +msgid "Linked Time" +msgstr "დაკავშირებული დრო" + + +msgid "Select other strips at the same time" +msgstr "მონიშნე ერთდროული სხვა ლენტები" + + msgid "Side of Frame" msgstr "კადრის მხარე" +msgid "Select all strips on same side of the current frame as the mouse cursor" +msgstr "მონიშნე მიმდინარე კადრის იმავე მხარეს მყოფი ლენტები, რომელზეც თაგვის კურსორია" + + +msgid "Select or deselect all strips" +msgstr "მონიშნე, ან გაუუქმე მონიშვნა ყველა ლენტას" + + +msgid "Select strips using box selection" +msgstr "მონიშნე ლენტები მართკუთხა მონიშვნის მეშვეობით" + + +msgid "Select Handles" +msgstr "მონიშნე სახელურები" + + +msgid "Select the strips and their handles" +msgstr "მონშნე ლენტები და მათი სახელურები" + + +msgid "Select all strips grouped by various properties" +msgstr "მონიშნე სხვადასხვა თვისების მიხედვით დაჯგუფებული ყველა ლენტა" + + +msgid "Shared strip type" +msgstr "საზიარო ლენტის ტიპი" + + msgid "Global Type" msgstr "გლობალური ტიპი" +msgid "All strips of same basic type (graphical or sound)" +msgstr "ერთი და იგივე ძირითადი ტიპის (გრაფიკული, ან ხმოვანი) ყველა ლენტა" + + +msgid "Shared strip effect type (if active strip is not an effect one, select all non-effect strips)" +msgstr "საზიარო ლენტის ეფექტის ტიპი (თუ აქტიური ლენტი ეფექტისა არაა, მონიშნე ყველა არა-ეფექტის ლენტი)" + + +msgid "Shared data (scene, image, sound, etc.)" +msgstr "საზიარო მონაცემები (სცენა, გამოსახულება, ხმა და სხვ.)" + + msgid "Effect" msgstr "ეფექტი" @@ -60021,6 +60926,14 @@ msgid "Shared effects" msgstr "საზიარო ეფექტები" +msgid "Effect/Linked" +msgstr "ეფექტი/დაკავშირებული" + + +msgid "Other strips affected by the active one (sharing some time, and below or effect-assigned)" +msgstr "აქტიური ლენტის ზემოქმედების ქვეში მყოფი სხვა ლენტები (გარკვეულწილად საზიარო დროით, ქვეშ, ან ეფექტ-მიკუთვნებული)" + + msgid "Overlap" msgstr "გადაკვეთა" @@ -60029,11 +60942,23 @@ msgid "Same Channel" msgstr "იგივე არხი" +msgid "Only consider strips on the same channel as the active one" +msgstr "მხედველობაში მიიღე მხოლოდ იმავე არხზე მყოფი ლენტები, რომელზეცაა აქტიური" + + msgctxt "Operator" msgid "Select Handles" msgstr "მონიშნე სახელურები" +msgid "Select gizmo handles on the sides of the selected strip" +msgstr "მონიშნე მანიპულატორის სახელურები მონიშნული ლენტის გვერდებზე" + + +msgid "The side of the handle that is selected" +msgstr "მონიშნული სახელურის მხარე" + + msgid "Left Neighbor" msgstr "მარცხენა მეზობელი" @@ -60046,11 +60971,91 @@ msgid "Both Neighbors" msgstr "ორივე მეზობელი" +msgid "Shrink the current selection of adjacent selected strips" +msgstr "შეკუმშე მონიშნული მოსაზღვრე ლენტების ამჟამინდელი მონიშვნა" + + +msgid "Select all strips adjacent to the current selection" +msgstr "მონიშნე ამჟამინდელი მონიშვნის მოსაზღვრე ყველა ლენტა" + + +msgctxt "Operator" +msgid "Select Pick Linked" +msgstr "მონიშნე დაკავშირებულის არჩევა" + + +msgid "Select a chain of linked strips nearest to the mouse pointer" +msgstr "მონიშნე თაგვის მიმთითებელთან ყველაზე ახლოს მდებარე დაკავშირებული ლენტების ჯაჭვი" + + +msgid "Select more strips adjacent to the current selection" +msgstr "მონიშნე მიმდინარე მონიშვნის მოსაზღვრე მეტი ლენტა" + + +msgctxt "Operator" +msgid "Select Side" +msgstr "მონიშნე მხარე" + + +msgid "Select strips on the nominated side of the selected strips" +msgstr "მონიშნე მონიშნული ლენტების ნომინირებული მხარეს მდებარე ლენტები" + + +msgid "The side to which the selection is applied" +msgstr "მხარე, რომელზეც გამოიყენება მონიშვნა" + + +msgid "Mouse Position" +msgstr "თაგვის პოზიცია" + + +msgid "No Change" +msgstr "არანაირი ცვლილება" + + +msgctxt "Operator" +msgid "Select Side of Frame" +msgstr "მონიშნე კადრის მხარე" + + +msgid "Select strips relative to the current frame" +msgstr "მონიშნე ლენტები მიმდინარე კადრთან მიმართებაში" + + +msgid "Select to the left of the current frame" +msgstr "მონიშნე მიმდინარე კადრის მარცხნივ" + + +msgid "Select to the right of the current frame" +msgstr "მონიშნე მიმდინარე კადრის მარჯვნივ" + + +msgid "Select intersecting with the current frame" +msgstr "მონიშნე მიმდინარე კადრთან გადამკვეთი" + + +msgctxt "Operator" +msgid "Set Range to Strips" +msgstr "დააყენე დიაპაზონი ლენტებზე" + + +msgid "Set the frame range to the selected strips start and end" +msgstr "დააყენე კადრთა დიაპაზონი მონიშნული ლენტების დასაწყისსა და დასასრულზე" + + +msgid "Set the preview range instead" +msgstr "მაგიერად დააყენა წინასწარი ხედის დიაპაზონი" + + msgctxt "Operator" msgid "Snap Strips to the Current Frame" msgstr "ლენტების მიკვრა მიმდინარე კადრზე" +msgid "Frame where selected strips will be snapped" +msgstr "კადრი, რომელზეც მონიშნული ლენტები მიეკრობა" + + msgctxt "Operator" msgid "Add Sound Strip" msgstr "დაამატე ხმის ლენტი" @@ -60060,21 +61065,288 @@ msgid "Add a sound strip to the sequencer" msgstr "დაამატე სეკვენსერს ხმის ლენტი" +msgid "Cache the sound in memory" +msgstr "დააკეშირე ხმა მეხსიერებაში" + + +msgid "Merge all the sound's channels into one" +msgstr "შერწყი ყველა ხმოვანი არხი ერთში" + + +msgid "Split the selected strips in two" +msgstr "გახლიჩე მონიშნული ლენტები ორად" + + +msgid "Channel in which strip will be cut" +msgstr "არხი, რომელშიც ლენტი გაიჭრება" + + +msgid "Frame where selected strips will be split" +msgstr "კადრი, რომელშიც მონიშნული ლენტები გაიპობა" + + +msgid "Ignore Selection" +msgstr "დააიგნორირე მონიშვნა" + + +msgid "Make cut even if strip is not selected preserving selection state after cut" +msgstr "გაკვეთე მაშინაც კი, თუ ლენტი მოუნიშნავია, გაკვეთის შემდეგ მონიშნულობის შენარჩუნებით" + + +msgid "The side that remains selected after splitting" +msgstr "მხარე, რომელიც გახლეჩის შემდეგ მონიშნული რჩება" + + +msgid "The type of split operation to perform on strips" +msgstr "ლენტებზე ჩასატარებელი გახლეჩვის ოპერაციის ტიპი" + + +msgid "Use Cursor Position" +msgstr "გამოიყენე კურსორის პოზიცია" + + +msgid "Split at position of the cursor instead of current frame" +msgstr "გახლიჩე კურსორის პოზიციაზე მიმდინარე კადრის ნაცვლად" + + +msgctxt "Operator" +msgid "Split Multicam" +msgstr "გახლიჩე მრავალკამერიანი" + + +msgid "Split multicam strip and select camera" +msgstr "გახლიჩე მრავალკამერიანი ლენტა და მონიშნე კამერა" + + +msgid "Set a color tag for the selected strips" +msgstr "მონიშნე ფერის ეტიკეტი მონიშნული ლენტებისთვის" + + +msgid "Color 09" +msgstr "ფერი 09" + + +msgctxt "Operator" +msgid "Jump to Strip" +msgstr "გადახტი ლენტაზე" + + +msgid "Move frame to previous edit point" +msgstr "გადაიტანე კადრი რედაქტირების უწინდელ წერილთან" + + +msgid "Use Strip Center" +msgstr "გამოიყენე ლენტის შუაგული" + + +msgid "Next Strip" +msgstr "მომდევნო ლენტა" + + +msgctxt "Operator" +msgid "Add Strip Modifier" +msgstr "დაამატე ლენტის მოდიფიკატორი" + + +msgid "Add a modifier to the strip" +msgstr "დაამატე ლენტას მოდიფიკატორი" + + +msgctxt "Operator" +msgid "Copy to Selected Strips" +msgstr "გადააკოპირე მონიშნულ ლენტებზე" + + +msgid "Copy modifiers of the active strip to all selected strips" +msgstr "გადააკოპირე აქტიური ლენტის მოდიფიკატორები ყველა მონიშნულ ლენტაზე" + + +msgid "Replace modifiers in destination" +msgstr "ჩაანაცვლე დანიშნულების ადგილას მყოფი მოდიფიკატორები" + + +msgid "Graphs" +msgstr "ველები" + + +msgid "Number of graphs" +msgstr "ველების რაოდენობა" + + +msgid "Unique" +msgstr "უნიკალური" + + +msgid "One unique graphical definition" +msgstr "ერთი უნიკალური გრაფიკული განსაზღვრება" + + +msgid "Graphical definition in 2 sections" +msgstr "გრაფიკული განსაზღვრება 2 განყოფილებაში" + + +msgid "Triplet" +msgstr "სამი ტყუპი" + + +msgid "Graphical definition in 3 sections" +msgstr "გრაფიკული განსაზღვრება 3 განყოფილებაში" + + +msgid "Name of modifier to redefine" +msgstr "ხელახლა განსასაზღვრი მოდიფიკატორის სახელი" + + +msgctxt "Operator" +msgid "Move Strip Modifier" +msgstr "გადაიტანე ლენტის მოდიფიკატორი" + + +msgid "Move modifier up and down in the stack" +msgstr "გადაიტანე მოდიფიკატორი სტეკში ზევით-ქვევით" + + +msgid "Name of modifier to remove" +msgstr "მოსაშორებელი მოდიფიკატორის სახელი" + + +msgctxt "Operator" +msgid "Remove Strip Modifier" +msgstr "მოაშორე ლენტის მოდიფიკატორი" + + +msgid "Remove a modifier from the strip" +msgstr "მოაშორე მოდიფიკატორი ლენტიდან" + + +msgctxt "Operator" +msgid "Clear Strip Transform" +msgstr "გაასუფთავე ლენტის გარდაქმნა" + + +msgid "Reset image transformation to default value" +msgstr "დააბრუნე გამოსახულების გარდაქმნა ნაგულიხმებ მნიშვნელობაზე" + + +msgid "Property" +msgstr "თვისება" + + +msgid "Strip transform property to be reset" +msgstr "ლენტის გარდაქმნის მახასიათებელი, რომელიც საწყის პარამეტრებზე უნდა დაბრუნდეს" + + +msgid "Reset strip transform location" +msgstr "დააბრუნე ლენტის გარდაქმნის ადგილმდებარეობა" + + +msgid "Reset strip transform scale" +msgstr "დააბრუნე ლენტის გარდაქმნის მასშტაბი" + + +msgid "Reset strip transform rotation" +msgstr "დააბრუნე ლენტის გარდაქმნის ბრუნვა" + + +msgid "Reset strip transform location, scale and rotation" +msgstr "დააბრუნე ლენტის გარდაქმნის ადგილმდებარეობა, მასშტაბი და ბრუნვა" + + +msgid "Scale image so fits in preview" +msgstr "დაამასშტაბირე გამოსახულება ისე, წინასწარ ხედს რომ მოერგოს" + + +msgid "Scale image so it fills preview completely" +msgstr "დაამასშტაბირე გამოსახულება ისე, წინასწარი ხედი სრულად რომ შეავსოს" + + +msgid "Stretch image so it fills preview" +msgstr "გაწელე გამოსახულება ისე, წინასწარი ხედი რომ შეავსოს" + + msgctxt "Operator" msgid "Swap Strip" msgstr "ლენტის გადაცვლა" +msgid "Swap active strip with strip to the right or left" +msgstr "გადაცვალე აქტიური ლენტა მარჯვნივ, ან მარცხნივ მდებარე ლენტაზე" + + +msgid "Side of the strip to swap" +msgstr "ლენტის გადაცვლის მხარე" + + +msgctxt "Operator" +msgid "Sequencer Swap Data" +msgstr "სეკვენსერის გადაცვლის მონაცემები" + + +msgid "Swap 2 sequencer strips" +msgstr "გადაცვალე სეკვენსერის 2 ლენტა" + + +msgctxt "Operator" +msgid "Swap Inputs" +msgstr "გადაცვალე შენატანები" + + +msgid "Swap the first two inputs for the effect strip" +msgstr "გადაცვალე პირველი ორი შენატანი ეფექტის ლენტაზე" + + msgctxt "Operator" msgid "Unlock Strips" msgstr "ლენტების განბლოკვა" +msgid "Unlock strips so they can be transformed" +msgstr "განბლოკე ლენტები, მათი გარდაქმნა რომ შეიძლებოდეს" + + msgctxt "Operator" msgid "Unmute Strips" msgstr "ლენტის ჩახშობის გამორთვა" +msgid "Unmute (un)selected strips" +msgstr "მოუნიშნავი/მონიშნული ლენტების ჩახშობის გამორთვა" + + +msgid "Unmute unselected rather than selected strips" +msgstr "გამორთე უფრო მოუნიშნავი და არა მონიშნული ლენტების ჩახშობა" + + +msgid "View all the strips in the sequencer" +msgstr "დაათვალიერე ყველა ლენტა სეკვენსერში" + + +msgid "Zoom preview to fit in the area" +msgstr "დაზუმე წინასწარი ხედი, რომ არეალს მოერგოს" + + +msgid "Zoom the sequencer on the selected strips" +msgstr "დაზუმე სეკვენსერი მონიშნულ ლენტებზე" + + +msgctxt "Operator" +msgid "Sequencer View Zoom Ratio" +msgstr "სეკვენსერის ხედის ზუმის პროპორციები" + + +msgid "Change zoom ratio of sequencer preview" +msgstr "შეცვალე სეკვენსერის წინასწარი ხედის ზუმის პროპორციები" + + +msgctxt "Operator" +msgid "Update Animation Cache" +msgstr "განაახლე ანიმაციის კეში" + + +msgid "Update the audio animation cache" +msgstr "განაახლე აუდიო ანიმაციის კეში" + + msgid "Mix the scene's audio to a sound file" msgstr "სცენის აუდიოს მიქშირება ხმოვან ფაილში" @@ -60083,6 +61355,42 @@ msgid "File format" msgstr "ფაილის ფორმატი" +msgid "ac3" +msgstr "ac3" + + +msgid "flac" +msgstr "flac" + + +msgid "mkv" +msgstr "mkv" + + +msgid "mp2" +msgstr "mp2" + + +msgid "mp3" +msgstr "mp3" + + +msgid "ogg" +msgstr "ogg" + + +msgid "wav" +msgstr "wav" + + +msgid "Split channels" +msgstr "გახლიჩე არხები" + + +msgid "Each channel will be rendered into a mono file" +msgstr "თითოეული არხი დარენდერდება მონოფაილში" + + msgctxt "Operator" msgid "Open Sound" msgstr "გახსენი ხმა" @@ -60092,6 +61400,82 @@ msgid "Load a sound file" msgstr "ჩატვირთე ხმოვანი ფაილი" +msgctxt "Operator" +msgid "Open Sound Mono" +msgstr "გახსენი ხმოვანი მონო" + + +msgid "Load a sound file as mono" +msgstr "ჩატვირთე ხმოვანი ფაილი მონოდ" + + +msgctxt "Operator" +msgid "Pack Sound" +msgstr "შეფუთე ხმა" + + +msgid "Pack the sound into the current blend file" +msgstr "ჩადე ხმა მიმდინარე blend ფაილში" + + +msgctxt "Operator" +msgid "Unpack Sound" +msgstr "ამოალაგე ხმა" + + +msgid "Sound Name" +msgstr "ხმის სახელი" + + +msgid "Sound data-block name to unpack" +msgstr "ამოსალაგებელი ხმის მონაცემთა ბლოკის სახელი" + + +msgctxt "Operator" +msgid "Update Animation" +msgstr "განაახლე ანიმაცია" + + +msgid "Update animation flags" +msgstr "განაახლე ანიმაციის დროშები" + + +msgctxt "Operator" +msgid "Add Row Filter" +msgstr "დაამატე რიგების ფილტრი" + + +msgid "Add a filter to remove rows from the displayed data" +msgstr "დაამატე ფილტრი ასახული მონაცემებიდან რიგების მოსაშორებლად" + + +msgctxt "Operator" +msgid "Change Visible Data Source" +msgstr "შეცვალე მონაცემთა ხილული წყარო" + + +msgid "Component Type" +msgstr "კომპონენტის ტიპი" + + +msgctxt "Operator" +msgid "Remove Row Filter" +msgstr "მოაშორე რიგების ფილტრი" + + +msgid "Remove a row filter from the rules" +msgstr "მოაშორე რიგების ფილტრი წესებიდან" + + +msgctxt "Operator" +msgid "Toggle Pin" +msgstr "გადართე სამაგრი" + + +msgid "Turn on or off pinning" +msgstr "ჩართე, ან გამორთე მიმაგრება" + + msgctxt "Operator" msgid "Add Surface Circle" msgstr "დაამატე ზედაპირის წრე" @@ -60182,30 +61566,233 @@ msgid "Copy the texture settings and nodes" msgstr "დააკოპირე ტექსტურის პარამეტრები და კვანძები" +msgctxt "Operator" +msgid "Add Text Editor Preset" +msgstr "დაამატე ტექსტის რედაქტორის კონფიგურაცია" + + +msgid "Add or remove a Text Editor Preset" +msgstr "დაამატე, ან მოაშორე ტექსტის რედაქტორის კონფიგურაცია" + + +msgctxt "Operator" +msgid "Text Auto Complete" +msgstr "ტექსტის ავტოდასრულება" + + +msgid "Show a list of used text in the open document" +msgstr "აჩვენე გამოყენებული ტექსტის სია გახსნილ დოკუმენტში" + + +msgctxt "Operator" +msgid "Toggle Comments" +msgstr "გადართე კომენტარები" + + +msgid "Add or remove comments" +msgstr "დაამატე, ან მოაშორე კომენტარები" + + +msgid "Toggle Comments" +msgstr "გადართე კომენტარები" + + +msgid "Set cursor position" +msgstr "დააყენე კურსორის პოზიცია" + + msgctxt "Operator" msgid "Cut" msgstr "გაჭრა" +msgctxt "Operator" +msgid "Duplicate Line" +msgstr "დაადუბლირე ხაზი" + + +msgid "Duplicate the current line" +msgstr "დაადუბლირე მიმდინარე ხაზი" + + msgctxt "Operator" msgid "Find Next" msgstr "იპოვე მომდევნო" +msgid "Find specified text" +msgstr "იპოვე მითითებული ტექსტი" + + +msgctxt "Operator" +msgid "Find & Set Selection" +msgstr "იპოვე და დააყენე მონიშვნა" + + +msgid "Find specified text and set as selected" +msgstr "იპოვე მითითებული ტექსტი და დააყენე მონიშნულად" + + +msgid "Indent selected text" +msgstr "შეწიე მონიშნული ტექსტი" + + +msgctxt "Operator" +msgid "Jump" +msgstr "გადახტი" + + +msgid "Jump cursor to line" +msgstr "გადაახტუნე კურსორი ხაზთან" + + +msgid "Line number to jump to" +msgstr "გადასახტომი ხაზის ნომერი" + + +msgctxt "Operator" +msgid "Jump to File at Point" +msgstr "გადახტი ფაილთან წერტილზე" + + +msgid "Jump to a file for the text editor" +msgstr "გადახტი ფაილზე ტექსტის რედაქტორისთვის" + + msgid "Column" msgstr "სვეტი" +msgid "Column to jump to" +msgstr "გადასახტომი სვეტი" + + +msgid "Line to jump to" +msgstr "გადასახტომი ხაზი" + + +msgctxt "Operator" +msgid "Line Number" +msgstr "ხაზის ნომერი" + + +msgid "The current line number" +msgstr "მიმდინარე ხაზის ნომერი" + + +msgctxt "Operator" +msgid "Make Internal" +msgstr "აქციე შიდად" + + +msgid "Make active text file internal" +msgstr "აქციე აქტიური ტექსტი ფაილის შინაგანად" + + +msgid "File Top" +msgstr "ფაილის თავი" + + +msgid "File Bottom" +msgstr "ფაილის ძირი" + + +msgctxt "Operator" +msgid "Move Lines" +msgstr "გადაიტანე ხაზები" + + +msgid "Move the currently selected line(s) up/down" +msgstr "გადაიტანე ამჟამად მონიშნული ხაზ(ებ)ი ზევით/ქვევით" + + msgctxt "Operator" msgid "New Text" msgstr "ახალი ტექსტი" +msgid "Create a new text data-block" +msgstr "შექმენი ახალი ტექსტის მონაცემთა ბლოკი" + + +msgctxt "Operator" +msgid "Open Text" +msgstr "გახსენი ტექსტი" + + +msgid "Open a new text data-block" +msgstr "გახსენი ტექსტის მონაცემთა ბლოკი" + + +msgid "Make Internal" +msgstr "აქციე შიდად" + + +msgid "Make text file internal after loading" +msgstr "აქციე ტექსტური ფაილები შიდად ჩატვირთვის შემდეგ" + + +msgctxt "Operator" +msgid "Toggle Overwrite" +msgstr "გადართე ზედ გადაწერა" + + +msgid "Toggle overwrite while typing" +msgstr "გადართე აკრეფვისას ზედ გადაწერა" + + +msgctxt "Operator" +msgid "Reload" +msgstr "ხელახლა ჩატვირთე" + + +msgid "Reload active text data-block from its file" +msgstr "ხელახლა ჩატვირთე ტექსტის მონაცემთა ბლოკი თავისი ფაილიდან" + + msgctxt "Operator" msgid "Replace" msgstr "ჩანაცვლება" +msgid "Replace text with the specified text" +msgstr "ჩაანაცვლე ტექსტი მითითებული ტექსტით" + + +msgid "Replace All" +msgstr "ჩაანაცვლე ყველა" + + +msgid "Replace all occurrences" +msgstr "ჩაანაცვლე ყველა შემთხვევა" + + +msgctxt "Operator" +msgid "Replace & Set Selection" +msgstr "ჩაანაცვლე და დააყენე მონიშვნა" + + +msgid "Replace text with specified text and set as selected" +msgstr "ჩაანაცვლე ტექსტი მითითებული ტექსტით და დააყენე მონიშნულად" + + +msgctxt "Operator" +msgid "Resolve Conflict" +msgstr "მოაგვარე კონფლიქტი" + + +msgid "When external text is out of sync, resolve the conflict" +msgstr "როცა გარე ფაილი არასინქრონირებულია, მოაგვარე კონფლიქტი" + + +msgid "How to solve conflict due to differences in internal and external text" +msgstr "როგორ მოგვარდეს შიდა და გარე ტექსტებს შორის განსხვავების მიერ გამოწვეული კონფლიქტი" + + +msgid "Ignore" +msgstr "დააიგნორირე" + + msgctxt "Operator" msgid "Run Script" msgstr "გაუშვი სკრიპტი" @@ -60233,11 +61820,29 @@ msgid "Save active text file with options" msgstr "შეინახე აქტიური ტექსტური ფაილი პარამეტრებით" +msgctxt "Operator" +msgid "Scroll" +msgstr "გააცოცე" + + +msgid "Number of lines to scroll" +msgstr "გასაცოცებელი ხაზების რიცხვი" + + msgctxt "Operator" msgid "Scrollbar" msgstr "ცოცია" +msgctxt "Operator" +msgid "Select Line" +msgstr "მონიშნე ხაზი" + + +msgid "Select text by line" +msgstr "მონიშნე ტექსტი ხაზის მიხედვით" + + msgid "Set text selection" msgstr "დააყენე ტექსტის მონიშვნა" @@ -60247,6 +61852,35 @@ msgid "Find" msgstr "იპოვე" +msgid "Start searching text" +msgstr "დაიწყე ტექსტის ძიება" + + +msgctxt "Operator" +msgid "To 3D Object" +msgstr "3გ ობიექტად" + + +msgid "Create 3D text object from active text data-block" +msgstr "შექმენი 3გ ტექსტის ობიექტი აქტიური ტექსტის მონაცემთა ბლოკისგან" + + +msgid "Split Lines" +msgstr "გახლიჩე ხაზები" + + +msgid "Create one object per line in the text" +msgstr "შექმენი თითო ობიექტი ტექსტის ყოველ ხაზზე" + + +msgid "Unindent selected text" +msgstr "გამოწიე მონიშნული ტექსტი" + + +msgid "Unlink active text data-block" +msgstr "მოხსენი აქტიური ტექსტის მონაცემთა ბლოკის მაკავშირებელი ბმული" + + msgctxt "Operator" msgid "Scale B-Bone" msgstr "დ-ძვლების მასშტაბირება" @@ -60256,6 +61890,14 @@ msgid "Scale selected bendy bones display size" msgstr "მოახდინე დრეკად ძვალთა ასახვის ზომის მასშტაბირება" +msgid "Constraint Axis" +msgstr "ბორკილის ღერძი" + + +msgid "Matrix Orientation" +msgstr "მატრიცის ორიენტაცია" + + msgid "Transformation orientation" msgstr "გარდაქმნის ორიენტაცია" @@ -60264,6 +61906,26 @@ msgid "Bend selected items between the 3D cursor and the mouse" msgstr "დახარე მონიშნული ელემენტები 3გ კურსორსა და მაუსს შორის" +msgid "Center Override" +msgstr "ცენტრის უკუგდება" + + +msgid "Force using this center value (when set)" +msgstr "იძულებით მოახდინე ამ ცენტრის მნიშვნელობის (როცა დაყენებულია) გამოყენება" + + +msgid "Edit Grease Pencil" +msgstr "დაარედაქტირე Grease Pencil" + + +msgid "Edit selected Grease Pencil strokes" +msgstr "დაარედაქტირე მონიშნული Grease Pencil-ის მონასმები" + + +msgid "Use Snapping Options" +msgstr "გამოიყენე მიკვრის ვარიანტები" + + msgctxt "Operator" msgid "Create Orientation" msgstr "შექმენი ორიენტაცია" @@ -60315,11 +61977,19 @@ msgid "Edge Bevel Weight" msgstr "წიბოს დაცერობების წონა" +msgid "Change the bevel weight of edges" +msgstr "შეცვალე წიბოთა დაცერობების წონა" + + msgctxt "Operator" msgid "Edge Crease" msgstr "წიბოს ნაკეცი" +msgid "Change the crease of edges" +msgstr "შეცვალე წიბოთა ნაკეცი" + + msgctxt "Operator" msgid "Edge Slide" msgstr "გააცურე წიბო" @@ -60333,10 +62003,22 @@ msgid "Correct UV coordinates when transforming" msgstr "გარდაქმნისას შეასწორე UV კოორდინატები" +msgid "When Even mode is active, flips between the two adjacent edge loops" +msgstr "როცა თანაბარი რეჟიმი აქტიურია, ახდენს ორ მოსაზღვრე წიბოთა მარყუჟს შორის შეტრიალებას" + + +msgid "Single Side" +msgstr "ცალი მხარე" + + msgid "Snap to Elements" msgstr "მიაკარი ელემენტებს" +msgid "Snap to increments" +msgstr "მიაკარი ნამატებს" + + msgid "Snap to vertices" msgstr "მიაკარი წვეროებს" @@ -60345,6 +62027,10 @@ msgid "Snap to edges" msgstr "მიაკარი წიბოებს" +msgid "Snap by projecting onto faces" +msgstr "მიაკარი წახნაგებზე პროექციის მეშვეობით" + + msgid "Snap to volume" msgstr "მიაკარი მოცულობას" @@ -60365,6 +62051,59 @@ msgid "Snap to the nearest point on an edge" msgstr "მიაკარი უახლოეს წერტილს წიბოზე" +msgid "Face Project" +msgstr "პროექცია წახნაგზე" + + +msgid "Face Nearest" +msgstr "წახნაგის უახლოესზე" + + +msgid "Snap to nearest point on faces" +msgstr "მიაკარი უახლოეს წერტილს წახნაგებზე" + + +msgid "Snap closest point onto target" +msgstr "მიაკარი უახლოესი წერტილი სამიზნეს" + + +msgid "Snap transformation center onto target" +msgstr "მიაკარი გარდაქმნის ცენტრი სამიზნეს" + + +msgid "Snap active onto target" +msgstr "მიაკარი აქტიური სამიზნეს" + + +msgid "Make the edge loop match the shape of the adjacent edge loop" +msgstr "შეუსაბამე წიბოთა მარყუჟი მოსაზღვრე წიბოთა მარყუჟის ფორმას" + + +msgid "Target: Include Edit" +msgstr "სამიზნე: მოიცავი რედაქტირებული" + + +msgid "Target: Include Non-Edited" +msgstr "სამიზნე: მოიცავი არარედაქტირებული" + + +msgid "Project Individual Elements" +msgstr "დააპროექცირე ინდივიდუალური ელემენტები" + + +msgid "Target: Exclude Non-Selectable" +msgstr "სამიზნე: გამორიცხე შეურჩევადი" + + +msgid "Target: Include Active" +msgstr "სამიზნე: მოიცავი აქტიური" + + +msgctxt "Operator" +msgid "Transform from Gizmo" +msgstr "გარდაქმენი მანიპულატორისგან" + + msgid "Mirror selected items around one or more axes" msgstr "გააკეთე მონიშნული ელემეტების სარკისებური ანარეკლი ერთ, ან მეტ ღერძზე" @@ -60387,10 +62126,34 @@ msgid "Scale (resize) selected items" msgstr "შეუცვალე მასშტაბი (ზომა) მონიშნულ ელემენტებს" +msgid "Mouse Directional Constraint" +msgstr "თაგვის მიმართულებითი ბორკილი" + + +msgid "Remove on Cancel" +msgstr "მოაშორე გაუქმებისას" + + +msgid "Remove elements on cancel" +msgstr "მოაშორე ელემენტები გაუქმებისას" + + +msgid "Edit Texture Space" +msgstr "დაარედაქტირე ტექსტურული სივრცე" + + +msgid "Edit object data texture space" +msgstr "დაარედაქტირე ობიექტის მონაცემთა ტექსტურული სივრცე" + + msgid "Duplicated Keyframes" msgstr "დუბლირებული საკვანძო ფაზები" +msgid "Transform duplicated keyframes" +msgstr "გარდაქმენი დუბლირებული საკვანძო ფაზები" + + msgctxt "Operator" msgid "Rotate" msgstr "ბრუნვა" @@ -60405,6 +62168,10 @@ msgid "Rotate Normals" msgstr "აბრუნე ნორმალები" +msgid "Rotate split normal of selected items" +msgstr "აბრუნე მონიშნული ელემენტთა გახლეჩილი ნორმალი" + + msgctxt "Operator" msgid "Select Orientation" msgstr "აარჩიე ორიენტაცია" @@ -60419,6 +62186,14 @@ msgid "Shear" msgstr "წანაცვლება" +msgid "Shear selected items along the given axis" +msgstr "წაანაცვლე მონიშნული ელემენტები მოცემული ღერძის გასწვრივ" + + +msgid "Axis Ortho" +msgstr "ორთო ღერძი" + + msgctxt "Operator" msgid "Shrink/Fatten" msgstr "შეკუმშვა/გაბერვა" @@ -60452,6 +62227,18 @@ msgid "Transform" msgstr "გარდაქმნა" +msgid "Align with Point Normal" +msgstr "გაუსწორე წერტილის ნორმალს" + + +msgid "Auto Merge & Split" +msgstr "ავტოშერწყმა და გახლეჩა" + + +msgid "Forces the use of Auto Merge and Split" +msgstr "იძულებით ახდენს ავტო შერწყმისა და გახლეჩის გამოყენებას" + + msgid "Values" msgstr "სიდიდეები" @@ -60470,6 +62257,10 @@ msgid "Vertex Crease" msgstr "წვეროს ნაკეცი" +msgid "Change the crease of vertices" +msgstr "შეცვალე წვეროთა ნაკეცები" + + msgctxt "Operator" msgid "Vertex Slide" msgstr "წვეროს გაცურება" @@ -60492,6 +62283,10 @@ msgid "Align offset direction to normals" msgstr "გაუსწორე აცდენის მიმართულება ნორმალებს" +msgid "Distance to offset" +msgstr "ასაცდენი მანძილი" + + msgid "Increase for uniform offset distance" msgstr "აცდენის ერთგვაროვანი მანძილის მომატება" @@ -60501,6 +62296,44 @@ msgid "Warp" msgstr "დაბრეცა" +msgid "Warp vertices around the cursor" +msgstr "შემობრიცე წვეროები კურსორის ირგვლივ" + + +msgid "Offset Angle" +msgstr "აცდენის კუთხე" + + +msgid "Angle to use as the basis for warping" +msgstr "აცდენის საფუძვლად გამოსაყენებელი კუთხე" + + +msgid "Warp Angle" +msgstr "დაბრეცის კუთხე" + + +msgid "Amount to warp about the cursor" +msgstr "კურორის ირგვლივ დაბრეცვის ოდენობა" + + +msgctxt "Operator" +msgid "Add Entry" +msgstr "დაამატე ჩანაწერი" + + +msgid "Add an entry to the list after the current active item" +msgstr "დაამატე სიას ჩანაწერი ამჟამად აქტიური ელემენტის შემდეგ" + + +msgctxt "Operator" +msgid "Move Entry" +msgstr "გადაიტანე ჩანაწერი" + + +msgid "Move an entry in the list up or down" +msgstr "გადაიტანე ჩანაწერილ სიაში ზევით, ან ქვევით" + + msgid "UP" msgstr "ზევით" @@ -60514,6 +62347,28 @@ msgid "Remove Selected Entry" msgstr "წაშალე მონიშნული ჩანაწერი" +msgid "Remove the selected entry from the list" +msgstr "ამოიღე მონიშნული ჩანაწერი სიიდან" + + +msgctxt "Operator" +msgid "Assign Value as Default" +msgstr "მიაკუთვნე მნიშვნელობა, როგორც ნაგულისხმები" + + +msgid "Set this property's current value as the new default" +msgstr "დააყენე ამ თვისების ამჟამინდელი მნიშვნელობა ახალ ნაგულისხმებად" + + +msgctxt "Operator" +msgid "Press Button" +msgstr "დააჭირე ღილაკს" + + +msgid "Presses active button" +msgstr "აჭერს აქტიურ ღილაკს" + + msgctxt "Operator" msgid "Clear Button String" msgstr "გაასუფთავე ღილაკის სტრიქონი" @@ -60523,6 +62378,155 @@ msgid "Unsets the text of the active button" msgstr "ხსნის აქტიური ღილაკის ტექსტს" +msgctxt "Operator" +msgid "Copy as New Driver" +msgstr "დააკოპირე ახალ დრაივერად" + + +msgctxt "Operator" +msgid "Copy Data Path" +msgstr "დააკოპირე მონაცემთა მისამართი" + + +msgid "Copy full data path" +msgstr "დააკოპირე მონაცემთა სრული მისამართი" + + +msgctxt "Operator" +msgid "Copy Python Command" +msgstr "დააკოპირე Python-ის ბრძანება" + + +msgid "Copy the Python command matching this button" +msgstr "დააკოპირე Python-ის ბრძანება, რომელიც ამ ღილაკს ემთხვევა" + + +msgctxt "Operator" +msgid "Copy to Selected" +msgstr "გადააკოპირე მონიშნულზე" + + +msgid "Copy the property's value from the active item to the same property of all selected items if the same property exists" +msgstr "გადააკოპირე თვისების მნიშვნელობა აქტიური ელემენტიდან ყველა მონიშნული ელემენტის იმავე თვისებაზე, თუ იგივე თვისება არსებობს" + + +msgid "Copy to selected all elements of the array" +msgstr "გადააკოპირე მასივის ყველა მონიშნულ ელემენტზე" + + +msgctxt "Operator" +msgid "Drop Color" +msgstr "დააგდე ფერი" + + +msgid "Drop colors to buttons" +msgstr "დაყარე ფერები ღილაკებზე" + + +msgid "Source color" +msgstr "წყაროს ფერი" + + +msgid "Gamma Corrected" +msgstr "გამა კორექტირებული" + + +msgid "The source color is gamma corrected" +msgstr "წყაროს ფერი გამა კორექტირებულია" + + +msgctxt "Operator" +msgid "Drop Material in Material slots" +msgstr "ჩაყარე მასალები მასალების სლოტებში" + + +msgid "Drag material to Material slots in Properties" +msgstr "გადაათრი მასალა თვისებებში მასალების სლოტებზე" + + +msgctxt "Operator" +msgid "Drop Name" +msgstr "დააგდე სახელი" + + +msgid "Drop name to button" +msgstr "დააგდე სახელი ღილაკზე" + + +msgid "The string value to drop into the button" +msgstr "ღილაკში ჩასაგდები სტრიქონული მნიშვნელობა" + + +msgctxt "Operator" +msgid "Edit Source" +msgstr "დაარედაქტირე წყარო" + + +msgid "Edit UI source code of the active button" +msgstr "დაარედაქტირე აქტიური ღილაკის UI წყაროს კოდი" + + +msgctxt "Operator" +msgid "Edit Translation" +msgstr "დაარედაქტირე თარგმანი" + + +msgid "Label of the control" +msgstr "სამართავის იარლიყი" + + +msgid "Some error occurred with this message" +msgstr "ამ შეტყობინებასთან დაკავშირებით რაღაც შეცდომა მოხდა" + + +msgid "Remove all local translation files, to be able to use the system ones again" +msgstr "მოაშორე ყველა ლოკალური თარგმანის ფაილი, რომ სისტემურების გამოყენება კვლავ შეიძლებოდეს" + + +msgid "Current (translated) language" +msgstr "მიმდინარე (ნათარგმნი) ენა" + + +msgid "Original label of the control" +msgstr "სამართავის ორიგინალი იარლიყი" + + +msgid "Original tip of the control" +msgstr "სამართავის ორიგინალი მინიშნება" + + +msgid "Path to the matching po file" +msgstr "შესაბამისი po ფაილის მისამართი" + + +msgid "RNA context for label" +msgstr "RNA კონტექსტი იარლიყისთვის" + + +msgid "RNA-defined label of the control, if any" +msgstr "სამართავის RNA-ის მიერ განსაზღვრული იარლიყი, თუ არსებობს" + + +msgid "Identifier of the RNA property, if any" +msgstr "RNA თვისების იდენტიფიკატორი, თუ არსებობს" + + +msgid "RNA-defined tip of the control, if any" +msgstr "სამართავის RNA-ის მიერ განსაზღვრული მინიშნება, თუ არსებობს" + + +msgid "Stats from opened po" +msgstr "სტატისტიკა გახსნილი po-დან" + + +msgid "Try to rebuild mo file, and refresh Blender's UI" +msgstr "შეეცადე, ხელახლა ააგო mo ფაილი და განაახლე Blender-ის UI" + + +msgid "Update po file, try to rebuild mo file, and refresh Blender's UI" +msgstr "განაახლე po ფაილი,შეეცადე, ხელახლა ააგო mo ფაილი და განაახლე Blender-ის UI" + + msgctxt "Operator" msgid "Eyedropper" msgstr "პიპეტი" @@ -60532,31 +62536,384 @@ msgid "Sample a color from the Blender window to store in a property" msgstr "აიღე ფერის ნიმუში ბლენდერის ფანჯრიდან და შეინახე თვისებაში" +msgctxt "Operator" +msgid "Eyedropper Depth" +msgstr "პიპეტის სიღრმე" + + +msgid "Sample depth from the 3D view" +msgstr "აიღე სიღრმის ნიმუში 3გ ხედში" + + +msgctxt "Operator" +msgid "Eyedropper Driver" +msgstr "პიპეტის დრაივერი" + + +msgid "Pick a property to use as a driver target" +msgstr "აარჩიე დრაივერის სამიზნედ გამოსაყენებელი თვისება" + + +msgid "Mapping Type" +msgstr "განლაგების ტიპი" + + +msgid "Method used to match target and driven properties" +msgstr "სამიზნისა და მართული თვისებების დასამთხვევად გამოყენებული მეთოდი" + + +msgid "All from Target" +msgstr "სამიზნიდან ყველა" + + +msgid "Drive all components of this property using the target picked" +msgstr "მართე ამ თვისების ყველა კომპონენტი არჩეული სამიზნის გამოყენებით" + + +msgid "Single from Target" +msgstr "სამიზნიდან ცალი" + + +msgid "Drive this component of this property using the target picked" +msgstr "მართე ამ თვისების ეს კომპონენტი არჩეული სამიზნის გამოყენებით" + + +msgid "Match Indices" +msgstr "შეათავსე ინდექსები" + + +msgid "Create drivers for each pair of corresponding elements" +msgstr "შექმენი დრაივერები ურთიერთშესაბამისი ელემენტების ყოველი წყვილისთვის" + + +msgid "Manually Create Later" +msgstr "ხელით შექმენი მოგვიანებით" + + +msgid "Create drivers for all properties without assigning any targets yet" +msgstr "შექმენი დრაივერები ყველა თვისებისთვის სამიზნეების დროებით მიუნიჭებლად" + + +msgid "Manually Create Later (Single)" +msgstr "ხელით შექმენი მოგვიანებით (ცალი)" + + +msgid "Create driver for this property only and without assigning any targets yet" +msgstr "შექმენი დრაივერი მხოლოდ ამ თვისებისთვის და სამიზნეების დროებით მიუნიჭებლად" + + +msgctxt "Operator" +msgid "Grease Pencil Eyedropper" +msgstr "Grease Pencil-ის პიპეტი" + + msgid "Sample a color from the Blender Window and create Grease Pencil material" msgstr "აიღე ბლენდერის ფანჯრიდან ფერის ნიმუში და შექმენი ცვილის ფანქრის მასალა" +msgctxt "Operator" +msgid "Eyedropper Data-Block" +msgstr "პიპეტის მონაცემთა ბლოკი" + + +msgid "Sample a data-block from the 3D View to store in a property" +msgstr "აიღე მონაცემთა ბლოკის ნიმუში 3გ ხედიდან და შეინახე თვისებაში" + + +msgctxt "Operator" +msgid "I18n Add-on Export" +msgstr "I18n დანამატის ექსპორტი" + + +msgid "Export given add-on's translation data as PO files" +msgstr "დააექსპორტირე მოცემული დანამატის თარგმანის მონაცემები PO ფაილებად" + + +msgid "Add-on to process" +msgstr "დასაპროცესირებელი დანამატი" + + +msgid "Export POT" +msgstr "დააექსპორტირე POT" + + +msgid "Export (generate) a POT file too" +msgstr "დააექსპორტირე (წარმოქმენი) POT ფაილიც" + + +msgid "Update Existing" +msgstr "განაახლე არსებული" + + +msgid "Update existing po files, if any, instead of overwriting them" +msgstr "არსებობის შემთხვევაში განაახლე po ფაილები ზედ გადაწერის მაგივრად" + + +msgctxt "Operator" +msgid "I18n Add-on Import" +msgstr "I18n დანამატის იმპორტი" + + +msgid "Import given add-on's translation data from PO files" +msgstr "დააიმპორტირე მოცემული დანამატის გარდაქმნის მონაცემები PO ფაილებიდან" + + +msgctxt "Operator" +msgid "Update I18n Add-on" +msgstr "განაახლე I18n დანამატი" + + +msgid "Operator Name" +msgstr "ოპერატორის სახელი" + + +msgid "Name (id) of the operator to invoke" +msgstr "გამოსაძახებელი ოპერატორის სახელი (id)" + + +msgid "Clean up i18n working repository (po files)" +msgstr "გაასუფთავე I18n სამუშაო საცავი (po ფაილები)" + + +msgctxt "Operator" +msgid "Edit Translation Update Mo" +msgstr "დაარედაქტირე თარგმანის განახლების Mo" + + +msgid "Try to \"compile\" given po file into relevant blender.mo file" +msgstr "სცადე მოცემული po ფაილის \"კომპილაცია\" შესაბამის blender.mo ფაილში" + + +msgctxt "Operator" +msgid "I18n Load Settings" +msgstr "I18n ჩატვირთე პარამეტრები" + + +msgid "Path to the saved settings file" +msgstr "შენახული პარამეტრების ფაილის მისამართი" + + +msgctxt "Operator" +msgid "I18n Save Settings" +msgstr "I18n შეინახე პარამეტრები" + + +msgid "Update i18n data (po files) in Blender source code repository" +msgstr "განაახლე i18n მონაცემები (po ფაილები) Blender-ის წყაროს კოდის საცავში" + + +msgid "(De)select (or invert selection of) all languages for i18n files update operators" +msgstr "მონიშნე/გაუუქმე (ან შეუქციე) მონიშვნა ყველა ენას i18n ფაილების განახლების ოპერატორებს" + + +msgid "Invert Selection" +msgstr "შეაქციე მონიშვნა" + + +msgid "Inverse selection (overrides 'Select All' when True)" +msgstr "შექცეული მონიშვნა (როცა ჭეშმარიტია, უკუაგდებს 'მონიშნე ყველა'-ს)" + + +msgid "Select All" +msgstr "მონიშნე ყველა" + + +msgid "Select all if True, else deselect all" +msgstr "თუ ჭეშმარიტია, მონიშნე ყველა, წინააღმდეგ შემთხვევაში გააუქმე ყველა მონიშვნა" + + +msgctxt "Operator" +msgid "Update I18n Statistics" +msgstr "განაახლე I18n სტატისტიკა" + + +msgid "Create or extend a 'i18n_info.txt' Text datablock" +msgstr "შექმენი, ან განავრცე 'i18n_info.txt' ტექსტის მონაცემთა ბლოკი" + + +msgid "Update i18n working repository (po files)" +msgstr "განაახლე I18n სამუშაო საცავი (po ფაილები)" + + +msgid "Skip POT" +msgstr "გამოტოვე POT" + + +msgid "Skip POT file generation" +msgstr "გამოტოვე POT ფაილის წარმოქმნა" + + +msgctxt "Operator" +msgid "Jump to Target" +msgstr "გადახტი სამიზნეზე" + + +msgid "Switch to the target object or bone" +msgstr "გადაინაცვლე სამიზნე ობიექტზე, ან ძვალზე" + + +msgctxt "Operator" +msgid "List Filter" +msgstr "სიის ფილტრი" + + +msgid "Start entering filter text for the list in focus" +msgstr "დაიწყე ფილტრაციის ტექსტის შეყვანა ფოკუსში მოქცეული სიისთვის" + + +msgid "Delete the selected local override and relink its usages to the linked data-block if possible, else reset it and mark it as non editable" +msgstr "წაშალე მონიშნული ლოკალური უკუგდება და შეძლებისდაგვარად გადააკავშირე მისი გამოყენებები დაკავშირებულ მონაცემთა ბლოკთან, სხვა შემთხვევაში ჩამოუყარე პარამეტრები და აღნიშნე არარედაქტირებადად" + + +msgid "Create a local override of the selected linked data-block, and its hierarchy of dependencies" +msgstr "შექმენი მონიშნული დაკავშირებული მონაცემთა ბლოკისა და მის დამოკიდებულებათა იერარქიის ლოკალური უკუგდება" + + +msgctxt "Operator" +msgid "Remove Override" +msgstr "მოხსენი უკუგდება" + + +msgid "Remove an override operation" +msgstr "მოხსენი უკუგდების ოპერაცია" + + +msgid "Reset to default values all elements of the array" +msgstr "დააბრუნე მასივის ყველა ელემენტი ნაგულისხმებ მნიშვნელობებზე" + + +msgctxt "Operator" +msgid "Define Override Type" +msgstr "განსაზღვრე უკუგდების ტიპი" + + +msgid "Create an override operation, or set the type of an existing one" +msgstr "შექმენი უკუგდების ოპერაცია, ან დააყენე უკვე არსებულის ტიპი" + + +msgid "Type of override operation" +msgstr "უკუგდების ოპერაციის ტიპი" + + +msgid "Completely replace value from linked data by local one" +msgstr "სრულად ჩაანაცვლე მნიშვნელობა დაკავშირებული მონაცემებიდან ლოკალური მნიშვნელობით" + + +msgctxt "Operator" +msgid "Reload Translation" +msgstr "გადატვირთე თარგმანი" + + +msgid "Force a full reload of UI translation" +msgstr "იძულებით მოახდინე UI თარგმანის სრული გადატვირთვა" + + +msgctxt "Operator" +msgid "Reset to Default Value" +msgstr "დააბრუნე ნაგულისხმებ მნიშვნელობაზე" + + +msgid "Reset this property's value to its default value" +msgstr "დააბრუნე ამ თვისების მნიშვნელობა თავის ნაგულისხმებ მნიშვნელობაზე" + + +msgctxt "Operator" +msgid "Unset Property" +msgstr "გადააყენე თვისება" + + +msgid "Clear the property and use default or generated value in operators" +msgstr "გაასუფთავე თვისება და გამოიყენე ნაგულისხმები, ან წარმოქმნილი მნიშვნელობა ოპერატორებში" + + +msgctxt "Operator" +msgid "View Drop" +msgstr "ხედის დაგდება" + + +msgid "Drag and drop onto a data-set or item within the data-set" +msgstr "გაათრიე და დააგდე მონაცემთა ნაკრებზე, ან ელემენტზე მონაცემთა ნაკრებში" + + +msgctxt "Operator" +msgid "Rename View Item" +msgstr "გადაარქვი ხედის ელემენტს სახელი" + + +msgid "Rename the active item in the data-set view" +msgstr "გადაარქვი სახელი აქტიურ ელემენტს მონაცემთა ნაკრების ხედში" + + +msgctxt "Operator" +msgid "View Filter" +msgstr "ხედის ფილტრი" + + +msgid "Start entering filter text for the data-set in focus" +msgstr "დაიწყე ფილტრაციის ტექსტის შეყვანა ფოკუსში მყოფი მონაცემების ნაკრებისთვის" + + msgctxt "Operator" msgid "Align" -msgstr "გაუსწორე" +msgstr "გაამწკრივე" + + +msgid "Aligns selected UV vertices on a line" +msgstr "ხაზზე ამწკრივებს მონიშნულ UV წვეროებს" + + +msgid "Axis to align UV locations on" +msgstr "ღერძი, რომელზეც უნდა გასწორდეს UV მდებარეობები" msgid "Straighten" msgstr "გაასწორე" +msgid "Align UV vertices along the line defined by the endpoints" +msgstr "გაამწკრივე UV წვეროები ბოლოწერტილთა მიერ განსაზღვრულ ხაზის გასწვრივ" + + msgid "Straighten X" msgstr "გაასწორე X-ზე" +msgid "Align UV vertices, moving them horizontally to the line defined by the endpoints" +msgstr "გაამწკრივე UV წვეროები, ბოლოწერტილთა მიერ განსაზღვრული ხაზისკენ მათი ჰორიზონტალურად გადაადგილების მეშვეობით" + + msgid "Straighten Y" -msgstr "გაასწორე Y" +msgstr "გაასწორე Y-ზე" + + +msgid "Align UV vertices, moving them vertically to the line defined by the endpoints" +msgstr "გაამწკრივე UV წვეროები, ბოლოწერტილთა მიერ განსაზღვრული ხაზისკენ მათი ვერტიკალურად გადაადგილების მეშვეობით" msgid "Align Auto" msgstr "გაუსწორე ავტომატურად" +msgid "Automatically choose the direction on which there is most alignment already" +msgstr "ავტომატურად აარჩიე მიმართულება, რომელზეც უკვე ყველაზე მეტი გამწკრივება არსებობს" + + +msgid "Align Vertically" +msgstr "გაამწკრივე ვერტიკალურად" + + +msgid "Align UV vertices on a vertical line" +msgstr "გაამწკრივე UV წვეროები ვერტიკალურ ხაზზე" + + +msgid "Align Horizontally" +msgstr "გაამწკრივე ჰორიზონტალურად" + + +msgid "Align UV vertices on a horizontal line" +msgstr "გაამწკრივე UV წვეროები ჰორიზონტალურ ხაზზე" + + msgctxt "Operator" msgid "Align Rotation" msgstr "გაუსწორე ბრუნვა" @@ -60570,6 +62927,18 @@ msgid "Axis to align to" msgstr "ღერძი, რომელსაც უნდა გაუსწორდეს" +msgid "Correct Aspect" +msgstr "სწორი პროპორცია" + + +msgid "Take image aspect ratio into account" +msgstr "მხედველობაში იქონიე გამოსახულების პროპორციული თანაფარდობა" + + +msgid "Method to calculate rotation angle" +msgstr "ბრუნვის კუთხის გამოსაანგარიშებელი მეთოდი" + + msgid "Only selected edges" msgstr "მხოლოდ მონიშნული წიბოები" @@ -60583,6 +62952,18 @@ msgid "Average Islands Scale" msgstr "გაასაშუალოვე კუნძულების მასშტაბი" +msgid "Average the size of separate UV islands, based on their area in 3D space" +msgstr "გაასაშუალოვე ცალკეული UV კუნძულების ზომები 3გ სივრცეში მათი არეალის მიხედვით" + + +msgid "Scale U and V independently" +msgstr "დამოუკიდებლად დაამასშტაბირე U და V" + + +msgid "Reduce shear within islands" +msgstr "შეამცირე წანაცვლება კუნძულებს შიგნით" + + msgctxt "Operator" msgid "Copy UVs" msgstr "დააკოპირე UV-ები" @@ -60597,45 +62978,258 @@ msgid "Cube Projection" msgstr "კუბური პროექცია" +msgid "Project the UV vertices of the mesh over the six faces of a cube" +msgstr "დააპროექცირე მეშის UV წვეროები კუბის ექვს წახნაგზე" + + +msgid "Map UVs taking image aspect ratio into account" +msgstr "რუკაზე განალაგე UV-ები გამოსახულების პროპორციული თანაფარდობის გათვალისწინებით" + + msgid "Cube Size" msgstr "კუბის ზომა" +msgid "Size of the cube to project on" +msgstr "ზომა კუბისა, რომელზეც უნდა მოხდეს პროექცირება" + + +msgid "Scale to Bounds" +msgstr "მასშტაბი ზღუდეებამდე" + + msgctxt "Operator" msgid "Cylinder Projection" msgstr "ცილინდრული პროექცია" +msgid "Project the UV vertices of the mesh over the curved wall of a cylinder" +msgstr "დააპროექცირე მეშის UV წვეროები ცილინდრის მორკალულ კედელზე" + + +msgid "How to determine rotation around the pole" +msgstr "როგორ დადგილნდეს ბრუნვა პოლუსის ირგვლივ" + + +msgid "Polar ZX" +msgstr "პოლარული ZX" + + +msgid "Polar 0 is X" +msgstr "პოლარული 0 არის X" + + +msgid "Polar ZY" +msgstr "პოლარული ZY" + + +msgid "Polar 0 is Y" +msgstr "პოლარული 0 არის Y" + + +msgid "Direction of the sphere or cylinder" +msgstr "სფეროს, ან ცილინდრის მიმართულება" + + +msgid "View on Equator" +msgstr "ხედი ეკვატორზე" + + +msgid "3D view is on the equator" +msgstr "3გ ხედი ეკვატორზეა" + + +msgid "View on Poles" +msgstr "ხედი პოლუსებზე" + + +msgid "3D view is on the poles" +msgstr "3გ ხედი პოლუსებზეა" + + +msgid "Align to Object" +msgstr "გაუსწორე ობიექტს" + + +msgid "Align according to object transform" +msgstr "გაასწორე ობიექტის გარდაქმნის მიხედვით" + + +msgid "Pole" +msgstr "პოლუსი" + + +msgid "How to handle faces at the poles" +msgstr "როგორ მოხდეს პოლუსებთან მდებარე წახნაგებთან მოპყრობა" + + +msgid "UVs are pinched at the poles" +msgstr "UV-ები პოლუსებთან მოჩქმეტილია" + + +msgid "UVs are fanned at the poles" +msgstr "UV-ები პოლუსებთან გაშლილია" + + +msgid "Radius of the sphere or cylinder" +msgstr "სფეროს, ან ცილინდრის რადიუსი" + + msgid "Preserve Seams" msgstr "შეინარჩუნე ნაკერები" +msgid "Separate projections by islands isolated by seams" +msgstr "განაცალკევე პროექციები ნაკერებით იზოლირებულ კუნძულებად" + + msgctxt "Operator" msgid "Export UV Layout" msgstr "დააექსპორტირე UV განლაგება" +msgid "Export UV layout to file" +msgstr "დააექსპორტირე UV განლაგება ფაილში" + + msgid "All UVs" msgstr "ყველა UV" +msgid "Export all UVs in this mesh (not just visible ones)" +msgstr "დააექსპორტირე ამ მეშის ყველა UV (არა მხოლოდ ხილული)" + + +msgid "File format to export the UV layout to" +msgstr "ფაილის ფორმატი, რომელშიც უნდა დაექსპორტირდეს UV განლაგება" + + +msgid "Export the UV layout to a vector SVG file" +msgstr "დააექსპორტირე UV განლაგება ვექტორულ SVG ფაილად" + + +msgid "Export the UV layout to a vector EPS file" +msgstr "დააექსპორტირე UV განლაგება ვექტორულ EPS ფაილად" + + +msgid "PNG Image (.png)" +msgstr "PNG გამოსახულება (.png)" + + +msgctxt "Mesh" +msgid "Modified" +msgstr "მოდიფიცირებული" + + +msgid "Exports UVs from the modified mesh" +msgstr "აექსპორტირებს UV-ებს მოდიფიცირებული მეშიდან" + + +msgid "Fill Opacity" +msgstr "შევსების გაუმჭვირვალობა" + + +msgid "Set amount of opacity for exported UV layout" +msgstr "დააყენე გაუმჭვირვალობის ოდენობა ექსპორტირებული UV განლაგებისთვის" + + +msgid "Dimensions of the exported file" +msgstr "ექსპორტირებული ფაილის ზომები" + + msgctxt "Operator" msgid "Follow Active Quads" msgstr "მიჰყევი აქტიურ ოთხკუთხედებს" +msgid "Edge Length Mode" +msgstr "წიბოს სიგრძის რეჟიმი" + + +msgid "Method to space UV edge loops" +msgstr "UV-ის წიბოთა მარყუჟების დაშორების მეთოდი" + + +msgid "Space all UVs evenly" +msgstr "დააშორე ყველა UV თანაბრად" + + +msgid "Length Average" +msgstr "სიგრძეების საშუალო" + + +msgid "Hide (un)selected UV vertices" +msgstr "დამალე მოუნიშნავი/მონიშნული UV წვეროები" + + msgctxt "Operator" msgid "Lightmap Pack" msgstr "შუქის რუკის ჩალაგება" +msgid "Pack each face's UVs into the UV bounds" +msgstr "ჩაალაგე ყოველი წახნაგის UV-ები UV ზღუდეებში" + + +msgid "Pack Quality" +msgstr "ჩალაგების ხარისხი" + + +msgid "Quality of the packing. Higher values will be slower but waste less space" +msgstr "ჩალაგების ხარისხი. უფრო დიდი მნიშვნელობები უფრო ნელი იქნება, მაგრამ ნაკლებ ადგილს გაფლანგავს" + + +msgid "Selected Faces" +msgstr "მონიშნული წახნაგები" + + +msgid "All Faces" +msgstr "ყველა წახნაგი" + + +msgid "New UV Map" +msgstr "ახალი UV რუკა" + + +msgid "Create a new UV map for every mesh packed" +msgstr "შექმენი ახალი UV რუკა ყოველი ჩალაგებული მეშისთვის" + + +msgid "Share Texture Space" +msgstr "გააზიარე ტექსტურული სივრცე" + + +msgid "Objects share texture space, map all objects into a single UV map" +msgstr "ობიექტებს აქვთ საზიარო ტექსტურული სივრცე, გაანაწილე ყველა ობიექტი ერთ UV რუკაში" + + +msgid "Mark selected UV edges as seams" +msgstr "აღნიშნე მონიშნული UV წიბოები ნაკერებად" + + msgid "Clear Seams" -msgstr "წაშალე ნაკერები" +msgstr "გაასუფთავე ნაკერები" + + +msgid "Clear instead of marking seams" +msgstr "აღნიშვნის მაგივრად გაასუფთავე ნაკერები" msgctxt "Operator" msgid "Minimize Stretch" -msgstr "შეამცირე გაწელვა მინიმუმამდე" +msgstr "დაიყვანე გაწელვა მინიმუმამდე" + + +msgid "Reduce UV stretching by relaxing angles" +msgstr "შეამცირე UV-ის გაწელვა კუთხეების მოშვების გზით" + + +msgid "Blend factor between stretch minimized and original" +msgstr "შეზავების კოეფიციენტი მინიმიზირებულ გაწელვასა და ორიგინალს შორის" + + +msgid "Number of iterations to run, 0 is unlimited when run interactively" +msgstr "გასაშვები იტერაციების რიცხვი, 0 ნიშნავს შეუზღუდავს ინტერაქტიულად გაშვების დროს" msgctxt "Operator" @@ -60643,6 +63237,10 @@ msgid "Pack Islands" msgstr "ჩააწყვე კუნძულები" +msgid "Transform all islands so that they fill up the UV/UDIM space as much as possible" +msgstr "გარდაქმენი ყველა კუნძული ისე, რომ UV/UDIM სივრცე რაც შეიძლება, მეტად შეავსონ" + + msgid "Space between islands" msgstr "სივრცე კუნძულთა შორის" @@ -60655,14 +63253,122 @@ msgid "Scaled" msgstr "დამასშტაბირებული" +msgid "Use scale of existing UVs to multiply margin" +msgstr "გამოიყენე არსებული UV-ების მასშტაბი მინდვრის გასამრავლებლად" + + +msgid "Just add the margin, ignoring any UV scale" +msgstr "უბრალოდ დაამატე მინდორი, ყველანაირი UV მასშტაბის იგნორირებით" + + +msgid "Merge Overlapping" +msgstr "შერწყი გადაფარებულები" + + +msgid "Overlapping islands stick together" +msgstr "ურთიერთგადაფარებული კუნძულები ერთმანეთს ეწებება" + + +msgid "Lock Pinned Islands" +msgstr "დაბლოკე მიბნეული კუნძულები" + + +msgid "Constrain islands containing any pinned UV's" +msgstr "შეზღუდე კუნძულები, რომლებიც მიბნეულ UV-ებს მოიცავენ" + + +msgid "Pin Method" +msgstr "მიბნევის მეთოდი" + + +msgid "Pinned islands won't rescale" +msgstr "მიბნეული კუნძულები მასშტაბს არ შეიცვლის" + + +msgid "Pinned islands won't rotate" +msgstr "მიბნეული კუნძულები არ იბრუნებს" + + +msgid "Rotation and Scale" +msgstr "ბრუნვა და მასშტაბი" + + +msgid "Pinned islands will translate only" +msgstr "მიბნეული კუნძულები მხოლოდ გადაადგილდება" + + +msgid "Pinned islands are locked in place" +msgstr "მიბნეული კუნძულები ადგილზეა დამაგრებული" + + +msgid "Rotate islands to improve layout" +msgstr "აბრუნე კუნძულები განლაგების გასაუმჯობესებლად" + + msgid "Rotation Method" msgstr "ბრუნვის მეთოდი" +msgid "Axis-aligned" +msgstr "ღერძ-გასწორებული" + + +msgid "Only 90 degree rotations are allowed" +msgstr "მხოლოდ 90 გრადუსიანი ბრუნვებია ნებადართული" + + +msgid "Any angle is allowed for rotation" +msgstr "ნებისმიერი კუთხე ნებადართულია ბრუნვისთვის" + + +msgid "Scale islands to fill unit square" +msgstr "დაამასშტაბირე კუნძულები ერთეულის კვადრატის შესავსებად" + + +msgid "Shape Method" +msgstr "ფორმირების მეთოდი" + + +msgid "Exact Shape (Concave)" +msgstr "ზუსტი ფორმა (ჩაზნექილი)" + + +msgid "Uses exact geometry" +msgstr "იყენებს ზუსტ გეომეტრიას" + + +msgid "Boundary Shape (Convex)" +msgstr "ზღუდის ფორმა (ამოზნექილი)" + + +msgid "Uses bounding boxes" +msgstr "იყენებს მზღუდავ კოლოფებს" + + +msgid "Pack to" +msgstr "ჩაწყობის ადგილი" + + +msgid "Closest UDIM" +msgstr "უახლოეს UDIM-ში" + + +msgid "Pack islands to closest UDIM" +msgstr "ჩააწყვე კუნძული უახლოეს UDIM-ში" + + msgid "Active UDIM" msgstr "აქტიური UDIM" +msgid "Pack islands to active UDIM image tile or UDIM grid tile where 2D cursor is located" +msgstr "ააწყვე კუნძულები აქტიურ UDIM გამოსახულების ფილაში, ან UDIM ცხრილის იმ ფილაში, სადაც 2გ კურსორი მდებარეობს" + + +msgid "Original bounding box" +msgstr "ორიგინალი მზღუდავი კოლოფი" + + msgctxt "Operator" msgid "Paste UVs" msgstr "ჩასვი UV-ები" @@ -60677,27 +63383,167 @@ msgid "Pin" msgstr "დაამაგრე" +msgid "Clear pinning for the selection instead of setting it" +msgstr "გაასუფთავე მონიშნულის მიბნევა დაყენების მაგივრად" + + +msgid "Invert pinning for the selection instead of setting it" +msgstr "შეაქციე მონიშნულის მიბნევა დაყენების მაგივრად" + + msgctxt "Operator" msgid "Project from View" msgstr "დააპროექცირე ხედიდან" +msgid "Project the UV vertices of the mesh as seen in current 3D view" +msgstr "დააპროექცირე მეშის UV წვეროები, როგორც ჩანს მიმდინარე 3გ ხედში" + + +msgid "Camera Bounds" +msgstr "კამერის ზღუდეები" + + +msgid "Map UVs to the camera region taking resolution and aspect into account" +msgstr "გაანაწილე UV-ები კამერის მონაკვეთზე გარჩევადობისა და პროპორციების გათვალისწინებით" + + +msgid "Use orthographic projection" +msgstr "გამოიყენე ორთოგრაფიული პროექცია" + + +msgid "Randomize the UV island's location, rotation, and scale" +msgstr "გაშემთხვევითე UV კუნძულის ადგილმდებარეობა, ბრუნვა და მასშტაბი" + + msgid "Maximum rotation" msgstr "მაქსიმალური ბრუნვა" +msgid "Use the same scale value for both axes" +msgstr "ორივე ღერძისთვის მასშტაბის ერთი და იგივე მნიშვნელობა გამოიყენე" + + +msgid "Randomize the rotation value" +msgstr "გააშემთხვევითე ბრუნვის მნიშვნელობა" + + +msgctxt "Operator" +msgid "Merge UVs by Distance" +msgstr "შერწყი UV-ები მანძილის მიხედვით" + + +msgid "Selected UV vertices that are within a radius of each other are welded together" +msgstr "ერთმანეთისგან გარკვეული რადიუსში მყოფი მონიშნული UV წვეროები ერთად შეირწყმენა" + + +msgid "Maximum distance between welded vertices" +msgstr "მაქსიმალური მანძილი შერწყმულ წვეროებს შორის" + + msgctxt "Operator" msgid "Reset" msgstr "დააბრუნე საწყის მდგომარეობაში" +msgid "Reset UV projection" +msgstr "დააბრუნე UV პროექცია საწყის პარამეტრებზე" + + +msgid "Reveal all hidden UV vertices" +msgstr "გამოავლინე ყველა დამალული UV წვერო" + + +msgctxt "Operator" +msgid "UV Rip" +msgstr "გახიე UV" + + +msgid "Rip selected vertices or a selected region" +msgstr "გახიე მონიშნული წვეროები, ან მონიშნული მონაკვეთი" + + +msgctxt "Operator" +msgid "UV Rip Move" +msgstr "გახიე გადააადგილე UV" + + +msgid "Unstitch UVs and move the result" +msgstr "მოარღვიე UV-ები და გადააადგილე შედეგი" + + +msgid "UV Rip" +msgstr "UV გახევა" + + msgctxt "Operator" msgid "Seams from Islands" msgstr "ნაკერები კუნძულებისგან" +msgid "Set mesh seams according to island setup in the UV editor" +msgstr "დააყენე მეშის ნაკერები UV რედაქტორში კუნძულის აწყობის მიხედვით" + + +msgid "Mark boundary edges as seams" +msgstr "აღნიშნე ზღუდის კიდეები ნაკერებად" + + +msgid "Mark boundary edges as sharp" +msgstr "აღნიშნე ზღუდის კიდეები მკვეთრად" + + +msgid "Select UV vertices" +msgstr "მონიშნე UV წვეროები" + + +msgid "Change selection of all UV vertices" +msgstr "შეცვალე ყველა UV წვეროს მონიშვნა" + + +msgid "Select UV vertices using box selection" +msgstr "მონიშნე UV წვეროები მართკუთხა მონიშვნის მეშვეობით" + + msgid "Pinned" -msgstr "დამაგრებული" +msgstr "მიბნეული" + + +msgid "Select UV vertices using circle selection" +msgstr "მონიშნე UV წვეროები წრიული მონიშვნის მეშვეობით" + + +msgid "Select an edge ring of connected UV vertices" +msgstr "მონიშნე დაკავშირებულ UV წვეროთა წიბოების რგოლი" + + +msgctxt "Operator" +msgid "Lasso Select UV" +msgstr "ქამანდით მონიშნე UV" + + +msgid "Select UVs using lasso selection" +msgstr "მონიშნე UV-ები ქამანდით მონიშვნის მეშვეობით" + + +msgid "Deselect UV vertices at the boundary of each selection region" +msgstr "გააუქმე UV წვეროების მონიშვნა თითოეული მონიშნული მონაკვეთის ზღვართან" + + +msgid "Select all UV vertices linked to the active UV map" +msgstr "მონიშნე აქტივ UV რუკასთან დაკავშირებული ყველა UV წვერო" + + +msgid "Select all UV vertices linked under the mouse" +msgstr "მონიშნე ყველა UV წვერო დაკავშირებული თაგვის ქვეშ" + + +msgid "Deselect linked UV vertices rather than selecting them" +msgstr "უფრო გააუქმე დაკავშირებული UV წვეროები, ვიდრე მონიშნავ მათ" + + +msgid "Select a loop of connected UV vertices" +msgstr "მონიშნე დაკავშირებული UV წვეროების მარყუჟი" msgctxt "Operator" @@ -60717,14 +63563,60 @@ msgid "Island selection mode" msgstr "კუნძულების მონიშვნის რეჟიმი" +msgid "Select more UV vertices connected to initial selection" +msgstr "მონიშნე თავდაპირველ მონიშვნასთან დაკავშირებული მეტი UV წვერო" + + msgctxt "Operator" msgid "Select Overlap" -msgstr "მოპნიშნე ურთიერთგადაკვეთა" +msgstr "მონიშნე ურთიერთგადაკვეთა" + + +msgid "Select all UV faces which overlap each other" +msgstr "მონიშნე ყველა UV წახნაგი, რომელიც ერთმანეთს ეფარება" + + +msgctxt "Operator" +msgid "Selected Pinned" +msgstr "მონიშნული მიბნეული" + + +msgid "Select all pinned UV vertices" +msgstr "მონიშნლე ყველა მიბნეული UV წვერო" + + +msgid "Select similar UVs by property types" +msgstr "მონშნე მსგავსი UV-ები თვისებათა ტიპის მიხედვით" + + +msgctxt "Mesh" +msgid "Pinned" +msgstr "მიბნეული" + + +msgctxt "Mesh" +msgid "Length 3D" +msgstr "სიგრძე 3გ" + + +msgctxt "Mesh" +msgid "Area 3D" +msgstr "არეალი 3გ" + + +msgctxt "Mesh" +msgid "Object" +msgstr "ობიექტი" + + +msgctxt "Mesh" +msgid "Amount of Faces in Island" +msgstr "წახნაგების რაოდენობა კუნძულში" msgctxt "Operator" msgid "Select Split" -msgstr "მონიშნე გაყოფილი" +msgstr "მონიშნე გახლეჩილი" msgid "Select only entirely selected faces" @@ -60736,15 +63628,40 @@ msgid "Smart UV Project" msgstr "UV-ის ჭკვიანური პროექცია" +msgid "Lower for more projection groups, higher for less distortion" +msgstr "უფრო დაბალი - პროექციის მეტი ჯგუფისთვის, უფრო მაღალი - ნაკლები გამრუდებისთვის" + + msgid "Area Weight" msgstr "არეალის წონა" +msgid "Island Margin" +msgstr "კუნძულის მინდორი" + + +msgctxt "Operator" +msgid "Snap Cursor" +msgstr "კურსორის მიკვრა" + + +msgid "Snap cursor to target type" +msgstr "მიაკარი კურსორი სამიზნე ტიპს" + + +msgid "Target to snap the selected UVs to" +msgstr "სამიზნე, რომელსაც უნდა მიეკრას UV-ები" + + msgctxt "Operator" msgid "Snap Selection" msgstr "მიაკარი მონიშნული" +msgid "Snap selected UV vertices to target type" +msgstr "მიაკარი მონიშნული UV წვეროები სამიზნე ტიპს" + + msgid "Cursor (Offset)" msgstr "კურსორი (აცდენა)" @@ -60758,33 +63675,117 @@ msgid "Sphere Projection" msgstr "სფერული პროექცია" +msgid "Project the UV vertices of the mesh over the curved surface of a sphere" +msgstr "დააპროექცირე მეშის UV წვეროები სფეროს მორკალულ ზედაპირზე" + + msgctxt "Operator" msgid "Stitch" msgstr "შეკერე" +msgid "Stitch selected UV vertices by proximity" +msgstr "შეკერე მონიშნული UV წვეროები სიახლოვის მიხედვით" + + +msgid "Index of the active object" +msgstr "აქტიური ობიექტის ინდექსი" + + +msgid "Clear seams of stitched edges" +msgstr "გაასუფთავე შეკერილი კიდეების ნაკერები" + + +msgid "Limit distance in normalized coordinates" +msgstr "შეზღუდე მანძილი ნორმალიზებულ კოორდინატებში" + + msgid "Snap at Midpoint" msgstr "მიაკარი შუაწერტილს" +msgid "UVs are stitched at midpoint instead of at static island" +msgstr "UV-ები შუაწერტილთან იკერება და არა სტატიკურ კუნძულთან" + + msgid "Operation Mode" msgstr "ოპერაციის რეჟიმი" +msgid "Use vertex or edge stitching" +msgstr "გამოიყენე წვეროს, ან წიბოს შეკერვა" + + +msgid "Objects Selection Count" +msgstr "ობიექტების მონიშვნის თვლა" + + msgid "Snap Islands" msgstr "მიაკარი კუნძულები" +msgid "Snap islands together (on edge stitch mode, rotates the islands too)" +msgstr "მიაკარი კუნძულები ერთმანეთს (წიბოს კერვის რეჟიმში, კუნძულებს აბრუნებს კიდეც)" + + +msgid "Static Island" +msgstr "სტატიკური კუნძული" + + +msgid "Island that stays in place when stitching islands" +msgstr "კუნძული, რომელიც ადგილზე რჩება კუნძულთა მიკერებისას" + + +msgid "Stored Operation Mode" +msgstr "შენახული ოპერაციის რეჟიმი" + + +msgid "Use Limit" +msgstr "გამოიყენე ლიმიტი" + + +msgid "Stitch UVs within a specified limit distance" +msgstr "შეკერე UV-ები მითითებული შეზღუდული მანძილის ფარგლებში" + + msgctxt "Operator" msgid "Unwrap" msgstr "გადააძრე" +msgid "Unwrap the mesh of the object being edited" +msgstr "გადააძრე რედაქტირებადი ობიექტის მეშს" + + +msgid "Unwrapping method (Angle Based usually gives better results than Conformal, while being somewhat slower)" +msgstr "გადაძრობის მეთოდი (ჩვეულებრივ, კუთხეზე დაფუძნებული უკეთეს შედეგებს იძლევა, ვიდრე მორგებადი, ამასთან გარკვეულწილად უფრო ნელია)" + + +msgid "Use Subdivision Surface" +msgstr "გამოიყენე დაყოფის ზედაპირი" + + +msgid "Map UVs taking vertex position after Subdivision Surface modifier has been applied" +msgstr "გაანაწილე UV-ები წვეროს პოზიციის აღებით დაყოფის ზედაპირის მოდიფიკატორის გამოყენების შემდეგ" + + msgctxt "Operator" msgid "Weld" msgstr "შეადუღე" +msgid "Weld selected UV vertices together" +msgstr "შეადუღე UV წვეროები ერთად" + + +msgid "Delta X" +msgstr "დელტა X" + + +msgid "Delta Y" +msgstr "დელტა Y" + + msgctxt "Operator" msgid "Reset View" msgstr "ხედის პირველსახე" @@ -60794,6 +63795,103 @@ msgid "Reset the view" msgstr "ხედის პარამეტრების ჩამოყრა" +msgctxt "Operator" +msgid "Scroll Down" +msgstr "ჩამოცოცდი" + + +msgid "Scroll the view down" +msgstr "ჩამოცოცდი ხედში" + + +msgid "Page" +msgstr "გვერდი" + + +msgid "Scroll down one page" +msgstr "ჩამოცოცდი ერთი გვერდით" + + +msgctxt "Operator" +msgid "Scroll Left" +msgstr "გაცოცდი მარცხნივ" + + +msgid "Scroll the view left" +msgstr "გაცოცდი ხედში მარცხნივ" + + +msgctxt "Operator" +msgid "Scroll Right" +msgstr "გაცოცდი მარჯვნივ" + + +msgid "Scroll the view right" +msgstr "გაცოცდი ხედში მარჯვნივ" + + +msgctxt "Operator" +msgid "Scroll Up" +msgstr "აცოცდი" + + +msgid "Scroll the view up" +msgstr "აცოცდი ხედში" + + +msgctxt "Operator" +msgid "Scroller Activate" +msgstr "გაააქტიურე ცოცია" + + +msgid "Scroll view by mouse click and drag" +msgstr "გააცოცე ხედი თაგვის დაწკაპუნებითა და გათრევით" + + +msgctxt "Operator" +msgid "Zoom 2D View" +msgstr "დაზუმე 2გ ხედი" + + +msgid "Zoom Factor X" +msgstr "ზუმის კოეფიციენტი X" + + +msgid "Zoom Factor Y" +msgstr "ზუმის კოეფიციენტი Y" + + +msgctxt "Operator" +msgid "Add Background Image" +msgstr "დაამატე ფონური გამოსახულება" + + +msgid "Add a new background image" +msgstr "დაამატე ახალი ფონური გამოსახულება" + + +msgctxt "Operator" +msgid "Remove Background Image" +msgstr "მოაშორე ფონური გამოსახულება" + + +msgid "Remove a background image from the 3D view" +msgstr "მოაშორე ფონური გამოსახულება 3გ ხედიდან" + + +msgid "Background image index to remove" +msgstr "მოსაშორებელი ფონური გამოსახულების ინდექსი" + + +msgctxt "Operator" +msgid "Select Menu" +msgstr "მონიშნე მენიუ" + + +msgid "Menu bone selection" +msgstr "ძვლის მონიშვნის მენიუ" + + msgctxt "Operator" msgid "Align Camera to View" msgstr "მიუსადაგე კამერა ხედს" @@ -60834,6 +63932,26 @@ msgid "Set the location of the 3D cursor" msgstr "დააყენე 3გ კურსორის ადგილმდებარეობა" +msgid "Preset viewpoint to use" +msgstr "წინასწარ დაყენებული თვალთახედვის წერტილი" + + +msgid "Leave orientation unchanged" +msgstr "დატოვე ორიენტაცია უცვლელი" + + +msgid "Orient to the viewport" +msgstr "ორიენტირება სარკმლისკენ" + + +msgid "Orient to the current transform setting" +msgstr "ორიენტირება მიმდინარე გარდაქმნის პარამეტრისკენ" + + +msgid "Match the surface normal" +msgstr "შეუსაბამე ზედაპირის ნორმალს" + + msgid "Surface Project" msgstr "პროექცია ზედაპირზე" @@ -60851,6 +63969,42 @@ msgid "Dolly in/out in the view" msgstr "ურიკით წინსვლა/უკუსვლა ხედში" +msgid "Region Position X" +msgstr "მონაკვეთის პოზიცია X-ზე" + + +msgid "Region Position Y" +msgstr "მონაკვეთის პოზიცია Y-ზე" + + +msgctxt "Operator" +msgid "Drop World" +msgstr "ჩააგდე სამყარო" + + +msgid "Drop a world into the scene" +msgstr "ჩააგდე სცენაში სამყარო" + + +msgctxt "Operator" +msgid "Extrude Individual and Move" +msgstr "ამოიყვანე ინდივიდუალურად და გადააადგილე" + + +msgctxt "Operator" +msgid "Extrude and Move on Normals" +msgstr "ამოიყვანე და გადააადგილე ნორმალებზე" + + +msgid "Dissolves adjacent faces and intersects new geometry" +msgstr "ანქარწყლებს მოსაზღვრე წახნაგებს და გადაკვეთს ახალ გეომეტრიას" + + +msgctxt "Operator" +msgid "Extrude and Move on Individual Normals" +msgstr "ამოიყვანე და გადააადგილე ინდივიდუალურ ნორმალებზე" + + msgctxt "Operator" msgid "Fly Navigation" msgstr "ფრენის ნავიგაცია" @@ -60927,6 +64081,51 @@ msgid "Move the view" msgstr "ხედის გადაადგილება" +msgctxt "Operator" +msgid "View Navigation (Walk/Fly)" +msgstr "ხედში გზისკვლევა (სიარული/ფრენა)" + + +msgid "Interactively navigate around the scene (uses the mode (walk/fly) preference)" +msgstr "ინტერაქტიულად გაიკვლიე გზა სცენაში (იყენებს რეჟიმის (სიარული/ფრენა) სასურველ პარამეტრებს)" + + +msgctxt "Operator" +msgid "NDOF Transform View" +msgstr "ხედის NDOF გარდაქმნა" + + +msgid "Pan and rotate the view with the 3D mouse" +msgstr "დააპანორამირე და აბრუნე ხედი 3გ თაგვით" + + +msgctxt "Operator" +msgid "NDOF Orbit View" +msgstr "ხედის NDOF ორბიტირება" + + +msgid "Orbit the view using the 3D mouse" +msgstr "დააორბიტირე ხედი 3გ თაგვით" + + +msgctxt "Operator" +msgid "NDOF Orbit View with Zoom" +msgstr "ხედის NDOF ორბიტირება ზუმთან ერთად" + + +msgid "Orbit and zoom the view using the 3D mouse" +msgstr "დააორბიტირე და დაზუმე ხედი 3გ თაგვით" + + +msgctxt "Operator" +msgid "NDOF Pan View" +msgstr "ხედის NDOF პანორამირება" + + +msgid "Pan the view with the 3D mouse" +msgstr "დააპანორამირე ხედი 3გ თაგვით" + + msgctxt "Operator" msgid "Set Active Object as Camera" msgstr "აქტიური ობიექტის კამერად დაყენება" @@ -60946,6 +64145,14 @@ msgid "Paste Objects" msgstr "ობიექტების ჩასმა" +msgid "Put pasted objects in the active collection" +msgstr "ჩადე ჩასმული ობიექტები აქტიურ კოლექციაში" + + +msgid "Select pasted objects" +msgstr "მონიშნე ჩასმული ობიექტები" + + msgctxt "Operator" msgid "Set Render Region" msgstr "დააყენე სარენდერო მონაკვეთი" @@ -60964,10 +64171,36 @@ msgid "Rotate the view" msgstr "დაატრიალე ხედი" +msgctxt "Operator" +msgid "Ruler Add" +msgstr "სახაზავის დამატება" + + +msgid "Add ruler" +msgstr "დაამატე სახაზავი" + + +msgctxt "Operator" +msgid "Ruler Remove" +msgstr "სახაზავის მოშორება" + + msgid "Select and activate item(s)" msgstr "მონიშნე და გაააქტიურე საგნები" +msgid "Enumerate" +msgstr "დანომრე" + + +msgid "List objects under the mouse (object mode only)" +msgstr "ჩამოთვალე ობიექტები თაგვის ქვეშ (მხოლოდ ობიექტის რეჟიმი)" + + +msgid "Use object selection (edit mode only)" +msgstr "გამოიყენე ობიექტის მონიშვნა (მხოლოდ რედაქტირების რეჟიმი)" + + msgid "Select items using box selection" msgstr "მონიშნე ელემენტები მართკუთხა მონიშვნის გამოყენებით" @@ -61042,6 +64275,10 @@ msgid "Snap selected item(s) to the 3D cursor" msgstr "მიაკარი მონიშნული ელემენტ(ებ)ი 3გ კურსორს" +msgid "If the selection should be snapped as a whole or by each object center" +msgstr "მთლიანად უნდა მიეკრას მონიშნული, თუ ყოველი ობიექტის ცენტრით" + + msgid "Snap selected item(s) to their nearest grid division" msgstr "მიაკარი მონიშნული ელემენტ(ებ)ი უახლოეს ცხრილის განყოფილებას" @@ -61088,6 +64325,15 @@ msgid "Transparent scene display. Allow selecting through items" msgstr "სცენის გამჭვირვალე ასახვა. იძლევა საგნების მიღმა მონიშვნის საშუალებას" +msgctxt "Operator" +msgid "Transform Gizmo Set" +msgstr "გარდაქმნის მანიპულატორის დაყენება" + + +msgid "Set the current transform gizmo" +msgstr "დააყენე მიმდინარე გარდაქმნის მანიპულატორი" + + msgid "View all objects in scene" msgstr "მაჩვენე სცენაში არსებული ყველა ობიექტი" @@ -61096,10 +64342,31 @@ msgid "All Regions" msgstr "ყველა რეგიონი" +msgid "View selected for all regions" +msgstr "დაათვალიერე მონიშნული ყველა მონაკვეთისთვის" + + +msgctxt "Operator" +msgid "View Axis" +msgstr "ხედის ღერძი" + + msgid "Use a preset viewpoint" msgstr "წინასწარ დაყენებული თვალთახედვის დაყენება" +msgid "Align Active" +msgstr "გაუსწორე აქტიური" + + +msgid "Align to the active object's axis" +msgstr "გაუსწორე აქტიური ობიექტის ღერძს" + + +msgid "Rotate relative to the current orientation" +msgstr "აბრუნე მიმდინარე ორიენტაციასთან მიმართებაში" + + msgctxt "View3D" msgid "Left" msgstr "მარცხნიდან" @@ -61162,11 +64429,24 @@ msgid "Center the camera view, resizing the view to fit its bounds" msgstr "კამერის ხედის ცენტრში მოქცევა, ხედის ზომის შეცვლით მის საზღვრებზე მოსარგებად" +msgctxt "Operator" +msgid "View Lock Center" +msgstr "ხედის ბლოკის ცენტრი" + + +msgid "Center the view lock offset" +msgstr "დააცენტრირე ხედის ბლოკის აცდენა" + + msgctxt "Operator" msgid "Center View to Mouse" msgstr "მოაქციე ხედი თაგვის ირგვლივ" +msgid "Center the view to the Z-depth position under the mouse cursor" +msgstr "დააცენტრირე ხედი Z-სიღრმის პოზიციაზე თაგვის კურსორის ქვეშ" + + msgctxt "Operator" msgid "View Lock Clear" msgstr "ხედის მიმაგრების გასუფთავება" @@ -61185,6 +64465,11 @@ msgid "Lock the view to the active object/bone" msgstr "მიამაგრე ხედი აქტიურ ობიექტს/ძვალს" +msgctxt "Operator" +msgid "View Orbit" +msgstr "ხედის ორბიტირება" + + msgid "Orbit the view" msgstr "დააორბიტირე ხედი" @@ -61367,8 +64652,185 @@ msgid "Export current scene in an Alembic archive" msgstr "მიმდინარე სცენის ექსპორტი Alembic არქივში" +msgid "Apply Subdivision Surface" +msgstr "გამოიყენე დაყოფის ზედაპირი" + + +msgid "Export subdivision surfaces as meshes" +msgstr "დააექსპორტირე დაყოფის ზედაპირები მეშებად" + + +msgid "Run as Background Job" +msgstr "გაუშვი ფონურ პროცესად" + + +msgid "Curves as Mesh" +msgstr "წირები მეშად" + + +msgid "Export curves and NURBS surfaces as meshes" +msgstr "დააექსპორტირე წირები და NURBS ზედაპირები მეშებად" + + +msgid "End frame of the export, use the default value to take the end frame of the current scene" +msgstr "ექსპორტის დასასრულის კადრი, მიმდინარე სცენის დამაბოლოვებელი კადრის ასაღებად გამოიყენე ნაგულისხმები მნიშვნელობა" + + +msgid "Use Settings for" +msgstr "გამოიყენე პარამეტრები ამ მიზნით" + + +msgid "Determines visibility of objects, modifier settings, and other areas where there are different settings for viewport and rendering" +msgstr "ადგენს ობიექტების ხილულობას, მოდიფიკატორის პარამეტრებს, და სხვა არეალებს, სადაც არის სხვადასხვა პარამეტრები სარკმლისა და რენდერისთვის" + + +msgid "Use Render settings for object visibility, modifier settings, etc" +msgstr "გამოიყენე რენდერის პარამეტრები ობიექტის ხილულობისთვის, მოდიფიკატორის პარამეტრებისთვის და სხვა" + + +msgid "Use Viewport settings for object visibility, modifier settings, etc" +msgstr "გამოიტენე სარკმლის პარამეტრები ობიექტის ხილულობისთვის, მოდიფიკატორის პარამეტრებისთვის და სხვა" + + +msgid "Export Custom Properties" +msgstr "დააექსპორტირე მორგებული თვისებები" + + +msgid "Export custom properties to Alembic .userProperties" +msgstr "დაექსპორტირე მორგებული თვისებები Alembic-ის .userProperties-ად" + + +msgid "Export Hair" +msgstr "დააექსპორტირე თმა" + + +msgid "Exports hair particle systems as animated curves" +msgstr "აექსპორტირებს თმის ნაწილაკთა სისტემებს ანიმირებულ წირებად" + + +msgid "Export Particles" +msgstr "დააექსპორტირე ნაწილაკები" + + +msgid "Exports non-hair particle systems" +msgstr "დააექსპორტირე არა-თმის ნაწილაკთა სისტემები" + + +msgid "Export per face shading group assignments" +msgstr "დააექსპორტირე თითო წახნაგზე შეფერადების ჯგუფის მიკუთვნებები" + + +msgid "Flatten Hierarchy" +msgstr "დააბრტყელე იერარქია" + + +msgid "Do not preserve objects' parent/children relationship" +msgstr "ნუ შეინარჩუნებ ობიექტის მშობელ-შვილის ურთიერთკავშირს" + + +msgid "Value by which to enlarge or shrink the objects with respect to the world's origin" +msgstr "სიდიდე, რომლითაც უნდა გაიზარდოს, ან შეიკუმშოს ობიექტები სამყაროსეულ ამოსავალ წერტილთან მიმართებაში" + + +msgid "Export normals" +msgstr "დააექსპორტირე ნორმალები" + + +msgid "Export undeformed mesh vertex coordinates" +msgstr "დააექსპორტირე არადეფორმირებული მეშის წვეროების კოორდინატები" + + +msgid "Export UVs with packed island" +msgstr "დააექსპორტირე UV-ები ჩაწყობილი კუნძულით" + + +msgid "Selected Objects Only" +msgstr "მხოლოდ მონიშნული ობიექტები" + + +msgid "Export only selected objects" +msgstr "დააექსპორტირე მხოლოდ მონიშნული ობიექტები" + + +msgid "Start frame of the export, use the default value to take the start frame of the current scene" +msgstr "ექსპორტის საწყისი კადრი, მიმდინარე სცენის საწყისი კადრის ასაღებად გამოიყენე ნაგულისხმები მნიშვნელობა" + + +msgid "Use Subdivision Schema" +msgstr "გამოიყენე დაყოფის სქემა" + + +msgid "Export meshes using Alembic's subdivision schema" +msgstr "დააექსპორტირე მეშები Alembic-ის დაყოფის სქემის გამოყენებით" + + +msgid "Export polygons (quads and n-gons) as triangles" +msgstr "დააექსპორტირე პოლიგონები (ოთხკუთხედები და მრავალკუთხედები) სამკუთხედებად" + + +msgid "Use Instancing" +msgstr "გამოიყენე ინსტანცირება" + + +msgid "Export data of duplicated objects as Alembic instances; speeds up the export and can be disabled for compatibility with other software" +msgstr "დააექსპორტირე დუბლირებულ ობიექტთა მონაცემები Alembic ინსტანციებად; აჩქარებს ექსპორტს და შეიძლება, გაითიშოს სხვა პროგრამებთან თავსებადობისთვის" + + +msgid "Export UVs" +msgstr "დააექსპორტირე UV-ები" + + +msgid "Export color attributes" +msgstr "დააექსპორტირე ფერის ატრიბუტები" + + +msgid "Visible Objects Only" +msgstr "მხოლოდ ხილული ობიექტები" + + +msgid "Export only objects that are visible" +msgstr "დააექსპორტირე მხოლოდ ის ობიექტები, რომლებიც ჩანს" + + +msgid "Transform Samples" +msgstr "გარდაქმნის სემპლები" + + +msgid "Number of times per frame transformations are sampled" +msgstr "კადრზე რამდენჯერ სემპლირდება გარდაქმნები" + + +msgctxt "Operator" +msgid "Import Alembic" +msgstr "დააიმპორტირე Alembic-ი" + + msgid "Load an Alembic archive" -msgstr "Alembic არქივის ჩატვირთვა" +msgstr "Alembic-ის არქივის ჩატვირთვა" + + +msgid "Always Add Cache Reader" +msgstr "ყოველთვის დაამატე კეშის წამკითხველი" + + +msgid "Add cache modifiers and constraints to imported objects even if they are not animated so that they can be updated when reloading the Alembic archive" +msgstr "დაამატე კეშის მოდიფიკატორები და ბორკილები იმპორტირებულ ობიექტებს მაშინაც კი, როცა ისინი ანიმირებული არაა, რაღა შეიძლებოდეს მათი განახლება Alembic-ის არქივის ხელახლა ჩატვირთვისას" + + +msgid "Set to true if the cache is split into separate files" +msgstr "დააყენე ჭეშმარიტად, თუ კეში ცალკეულ ფაილებადაა გახლეჩილი" + + +msgid "Set Frame Range" +msgstr "დააყენე კადრთა დიაპაზონი" + + +msgid "Validate Meshes" +msgstr "მეშების ვალიდაცია" + + +msgid "Check imported mesh objects for invalid data (slow)" +msgstr "შეამოწმე იმპორტირებული მეშის ობიექტები უვარგის მონაცემებზე (ნელი)" msgctxt "Operator" @@ -61380,10 +64842,46 @@ msgid "Append from a Library .blend file" msgstr "მომაგრება ბიბლიოთეკის .blend ფაილიდან" +msgid "Put new objects on the active collection" +msgstr "ჩადე ახალი ობიექტები აქტიურ კოლექციაში" + + +msgid "Select new objects" +msgstr "მონიშნე ახალი ობიექტები" + + msgid "Clear Asset Data" msgstr "გაასუფთავე აქტივის მონაცემები" +msgid "Don't add asset meta-data or tags from the original data-block" +msgstr "ნუ დაამატებ აქტივის მეტა-მონაცემებს, ან ეტიკეტებს მონაცემთა ორიგინალი ბლოკიდან" + + +msgid "Re-Use Local Data" +msgstr "ხელახლა გამოიყენე ლოკალური მონაცემები" + + +msgid "Instance Collections" +msgstr "ინსტანციის კოლექციები" + + +msgid "Create instances for collections, rather than adding them directly to the scene" +msgstr "შექმენი კოლექციებისთვის ინსტანციები, სცენაში მათი პირდაპირი დამატების მაგივრად" + + +msgid "Instance Object Data" +msgstr "დააინსტანცირე ობიექტის მონაცემები" + + +msgid "Create instances for object data which are not referenced by any objects" +msgstr "შექმენი ინსტანციები ობიექტთა მონაცემებისთვის, რომლებზეც მითითება არ აქვს არც ერთ ობიექტს" + + +msgid "Localize All" +msgstr "დაალოკალიზირე ყველა" + + msgctxt "Operator" msgid "Batch Rename" msgstr "სახელების ერთობლივი გადარქმევა" @@ -61393,10 +64891,36 @@ msgid "Rename multiple items at once" msgstr "რამდენიმე ელემენტისთვის სახელის ერთდროულად შეცვლა" +msgid "Type of data to rename" +msgstr "სახელ გადასარქმევი მონაცემების ტიპი" + + +msgid "Grease Pencils" +msgstr "Grease Pencil-ები" + + +msgid "Sequence Strips" +msgstr "სეკვენციის ლენტები" + + msgid "Action Clips" msgstr "ქმედების კლიპები" +msgctxt "Operator" +msgid "Validate .blend strings" +msgstr "მოახდინე .blend სტრიქონების ვალიდაცია" + + +msgid "Check and fix all strings in current .blend file to be valid UTF-8 Unicode (needed for some old, 2.4x area files)" +msgstr "შეამოწმე და შეასწორე ყველა სტრიქონი მიმდინარე .blend ფაილში UTF-8 უნიკოდის ვარგისიანობისთვის (საჭიროა ზოგიერთი ძველი, 2.4 არეალის ფაილისთვის)" + + +msgctxt "Operator" +msgid "Call Menu" +msgstr "გამოიძახე მენიუ" + + msgid "Open a predefined menu" msgstr "გახსენი წინასწარ განსაზღვრული მენიუ" @@ -61405,6 +64929,11 @@ msgid "Name of the menu" msgstr "მენიუს სახელი" +msgctxt "Operator" +msgid "Call Panel" +msgstr "გამოიძახე პანელი" + + msgid "Open a predefined panel" msgstr "წინასწარ განსაზღვრული პანელის გახსნა" @@ -61434,14 +64963,407 @@ msgid "Apply Global Orientation" msgstr "მიუსადაგე გლობალური ორიენტაცია" +msgid "Rotate all root objects to match the global orientation settings otherwise set the global orientation per Collada asset" +msgstr "აბრუნე ყველა ძირეული ობიექტი, რომ გლობალური ორიენტაციის პარამეტრებს ემთხვეოდეს, სხვა შემთხვევაში დააყენე გლობალური ორიენტაცია ყოველ Collada აქტივზე" + + +msgid "Apply modifiers to exported mesh (non destructive)" +msgstr "გამოიყენე მოდიფიკატორები ექსპორტირებულ მეშზე (არა გამანადგურებელი)" + + +msgid "Deform Bones Only" +msgstr "მხოლოდ დეფორმირებადი ძვლები" + + +msgid "Only export deforming bones with armatures" +msgstr "დააექსპორტირე მხოლოდ დეფორმირებადი ძვლები არმატურებით" + + +msgid "Transformation type for translation, scale and rotation. Note: The Animation transformation type in the Anim Tab is always equal to the Object transformation type in the Geom tab" +msgstr "გარდაქმნის ტიპი გადაადგილების, მასშტაბისა და ბრუნვისთვის. შენიშვნა: ანიმაციის გარდაქმნის ტიპი ანიმაციის ჩანართში ყოველთვის უდრის ობიექტის გარდაქმნის ტიპს გეომეტრიის ჩანართში" + + +msgid "Use representation for exported transformations" +msgstr "გამოიყენე <მატრიცა> წარმოდგენა ექსპორტირებული გარდაქმნებისთვის" + + +msgid "Use , and representation for exported transformations" +msgstr "გამოიყენე <ბრუნვა>, <გარდაქმნა> და <მასშტაბი> წარმოდგენა ექსპორტირებული გარდაქმნებისთვის" + + +msgid "Key Type" +msgstr "სოლის ტიპი" + + +msgid "Type for exported animations (use sample keys or Curve keys)" +msgstr "ტიპი ექსპორტირებული ანიმაციებისთვის (გამოიყენე სემპლების, ან წირების სოლები)" + + +msgid "Export Sampled points guided by sampling rate" +msgstr "დააექსპორტირე სემპლირებული წერტილები მართული სემპლირების სიხშირის მიერ" + + +msgid "Export Curves (note: guided by curve keys)" +msgstr "დააექსპორტირე წირები (შენიშვნა: მართული წირის სოლების მიერ)" + + +msgid "Global Forward Axis" +msgstr "გლობალური წინ ღერძი" + + +msgid "Global Forward axis for export" +msgstr "გლობალური წინ ღერძი ექსპორტისთვის" + + +msgid "Global Forward is positive X Axis" +msgstr "გლობალური წინ ღერძი დადებითი X ღერძია" + + +msgid "Global Forward is positive Y Axis" +msgstr "გლობალური წინ ღერძი დადებითი Y ღერძია" + + +msgid "Global Forward is positive Z Axis" +msgstr "გლობალური წინ ღერძი დადებითი Z ღერძია" + + +msgid "Global Forward is negative X Axis" +msgstr "გლობალური წინ ღერძი უარყოფითი X ღერძია" + + +msgid "Global Forward is negative Y Axis" +msgstr "გლობალური წინ ღერძი უარყოფითი Y ღერძია" + + +msgid "Global Forward is negative Z Axis" +msgstr "გლობალური წინ ღერძი უარყოფითი Z ღერძია" + + +msgid "Global Up Axis" +msgstr "გლობალური ზევით ღერძი" + + +msgid "Global Up axis for export" +msgstr "გლობალური ზევით ღერძი ექსპორტისთვის" + + +msgid "Global UP is positive X Axis" +msgstr "გლობალური ზევით დადებითი X ღერძია" + + +msgid "Global UP is positive Y Axis" +msgstr "გლობალური ზევით დადებითი Y ღერძია" + + +msgid "Global UP is positive Z Axis" +msgstr "გლობალური ზევით დადებითი Z ღერძია" + + +msgid "Global UP is negative X Axis" +msgstr "გლობალური ზევით უარყოფითი X ღერძია" + + +msgid "Global UP is negative Y Axis" +msgstr "გლობალური ზევით უარყოფითი Y ღერძია" + + +msgid "Global UP is negative Z Axis" +msgstr "გლობალური ზევით უარყოფითი Z ღერძია" + + +msgid "Modifier resolution for export" +msgstr "მოდიფიკატორის გარჩევადობა ექსპორტისთვის" + + +msgid "Apply modifier's viewport settings" +msgstr "გამოიყენე მოდიფიკატორის სარკმლის პარამეტრები" + + +msgid "Apply modifier's render settings" +msgstr "გამოიყენე მოდიფიკატორის რენდერის პარამეტრები" + + +msgid "Object Transformation type for translation, scale and rotation" +msgstr "ობიექტის გარდაქმნის ტიპი გადაადგილების, მასშტაბისა და ბრუნვისთვის" + + +msgid "Include all Actions" +msgstr "მოიცავი ყველა ქმედება" + + +msgid "Export also unassigned actions (this allows you to export entire animation libraries for your character(s))" +msgstr "დააექსპორტირე მიუკუთვნებელი ქმედებებიც (ეს საშუალებას გაძლევს, დააექსპორტირო ანიმაციის მთელი ბიბლიოთეკები შენი პერსონაჟ(ებ)ისთვის)" + + +msgid "Include Animations" +msgstr "მოიცავი ანიმაციები" + + +msgid "Include Armatures" +msgstr "მოიცავი არმატურები" + + +msgid "Export related armatures (even if not selected)" +msgstr "დააექსპორტირე მონათესავე არმატურები (მაშინაც კი, როცა მოუნიშნავია)" + + +msgid "Include Children" +msgstr "მოიცავი შვილები" + + +msgid "Export all children of selected objects (even if not selected)" +msgstr "დააექსპორტირე მონიშნულ ობიექტთა ყველა შვილი (მაშინაც კი, როცა მოუნიშნავია)" + + +msgid "Include Shape Keys" +msgstr "მოიცავი ფორმის სოლები" + + +msgid "Export all Shape Keys from Mesh Objects" +msgstr "დააექსპორტირე ფორმის ყველა სოლი მეშის ობიექტებიდან" + + +msgid "All Keyed Curves" +msgstr "ყველა ჩასოლილი წირი" + + +msgid "Export also curves which have only one key or are totally flat" +msgstr "დააექსპორტირე წირებიც, რომლებსაც მხოლოდ თითო სოლი აქვთ და სრულიად ბრტყელები არიან" + + +msgid "Keep Keyframes" +msgstr "დაიტოვე საკვანძო ფაზები" + + +msgid "Keep Smooth curves" +msgstr "დაიტოვე გლუვი წირები" + + +msgid "Limit Precision" +msgstr "შეზღუდე სიზუსტე" + + +msgid "Reduce the precision of the exported data to 6 digits" +msgstr "შეზღუდე ექსპორტირებულ მონაცემთა სიზუსტე 6 ნიშნამდე" + + +msgid "Export to SL/OpenSim" +msgstr "დააექსპორტირე SL/OpenSim-ში" + + +msgid "Compatibility mode for Second Life, OpenSimulator and other compatible online worlds" +msgstr "თავსებადობის რეჟიმი Second Life-ის, OpenSimulator-ისა და სხვა თავსებადი ონლაინ სამყაროებისთვის" + + +msgid "Export Section" +msgstr "დააექსპორტირე განყოფილება" + + +msgid "Only for User Interface organization" +msgstr "მხოლოდ მომხმარებლის ინტერფეისის ორანიზებისთვის" + + +msgid "Data export section" +msgstr "მონაცემთა ექსპორტის განყოფილება" + + +msgid "Geom" +msgstr "გეომ" + + +msgid "Geometry export section" +msgstr "გეომეტრიის ექსპორტის განყოფილება" + + +msgid "Arm" +msgstr "არმ" + + +msgid "Armature export section" +msgstr "არმატურის ექსპორტის განყოფილება" + + +msgid "Anim" +msgstr "ანიმ" + + +msgid "Animation export section" +msgstr "ანიმაციის ექსპორტის განყოფილება" + + +msgid "Extra" +msgstr "ექსტრა" + + +msgid "Collada export section" +msgstr "Collada-ს ექსპორტის განყოფილება" + + +msgid "The distance between 2 keyframes (1 to key every frame)" +msgstr "მანძილი 2 საკვანძო ფაზას შორის (1 ყველა კადრის ჩასასოლად)" + + +msgid "Export only selected elements" +msgstr "დააექსპორტირე მხოლოდ მონიშნული ელემენტები" + + +msgid "Sort by Object name" +msgstr "დაალაგე ობიექტის სახელის მიხედვით" + + +msgid "Sort exported data by Object name" +msgstr "დაალაგე ექსპორტირებული მონაცემები ობიექტის სახელის მიხედვით" + + +msgid "Use Blender Profile" +msgstr "გამოიყენე ბლენდერის პროფილი" + + +msgid "Export additional Blender specific information (for material, shaders, bones, etc.)" +msgstr "დააექსპორტირე ბლენდერისთვის დამახასიათებელი დამატებითი ინფორმაცია (მასალების, იერფერების, ძვლებისთვის და ა.შ.)" + + +msgid "Use Object Instances" +msgstr "გამოიყენე ობიექტთა ინსტანციები" + + +msgid "Instantiate multiple Objects from same Data" +msgstr "დააინსტანცირე მრავალი ობიექტი ერთი და იგივე მონაცემებიდან" + + +msgid "Copy textures to same folder where the .dae file is exported" +msgstr "დააკოპირე ტექსტურები იმავე საქაღალდეში, სადაც .dae ფაილი ექსპორტირდება" + + +msgctxt "Operator" +msgid "Import COLLADA" +msgstr "დააიმპორტირე COLLADA" + + msgid "Load a Collada file" msgstr "Collada ფაილის ჩატვირთვა" +msgid "Auto Connect" +msgstr "ავტოდაკავშირება" + + +msgid "Import custom normals, if available (otherwise Blender will compute them)" +msgstr "დააიმპორტირე მორგებული ნორმალები, თუ ხელმისაწვდომია (წინააღმდეგ შემთხვევაში მათ ბლენდერი გამოითვლის)" + + +msgid "Find Bone Chains" +msgstr "იპოვე ძვალთა ჯაჭვები" + + +msgid "Find best matching Bone Chains and ensure bones in chain are connected" +msgstr "იპოვე ყველაზე უკეთ შესაბამისი ძვალთა ჯაჭვები და იზრუნე, რომ ჯაჭვში არსებული ძვლები დაკავშირებულია" + + +msgid "Import Units" +msgstr "დააიმპორტირე ერთეულები" + + +msgid "If disabled match import to Blender's current Unit settings, otherwise use the settings from the Imported scene" +msgstr "თუ გათიშულია, დააიმპორტირე ბლენდერის ამჟამინდელი ერთეულების პარამეტრები, სხვა შემთხვევაში გამოიყენე პარამეტრები იმპორტირებული სცენიდან" + + +msgid "Minimum Chain Length" +msgstr "ჯაჭვის მინიმალური სიგრძე" + + +msgid "When searching Bone Chains disregard chains of length below this value" +msgstr "ძვალთა ჯაჭვის ძიებისას უგულვებელჰყავი ამ მნიშვნელობაზე ნაკლები სიგრძის ჯაჭვები" + + +msgctxt "Operator" +msgid "Context Collection Boolean Set" +msgstr "კონტექსტის კოლექციის ლოგიკური წყობა" + + +msgid "Set boolean values for a collection of items" +msgstr "დააყენე ლოგიკური მნიშვნელობები ელემენტთა კოლექციისთვის" + + +msgctxt "Operator" +msgid "Context Array Cycle" +msgstr "კონტექსტის მასივის ციკლი" + + +msgid "Set a context array value (useful for cycling the active mesh edit mode)" +msgstr "დააყენე კონტექსტის მასივის მნიშვნელობა (სასარგებლოა აქტიური მეშის რედაქტირების რეჟიმის ციკლირებისთვის)" + + +msgid "Context Attributes" +msgstr "კონტექსტის ატრიბუტები" + + +msgid "Context data-path (expanded using visible windows in the current .blend file)" +msgstr "კონტექსტის მონაცემთა მისამართი (ფართოვდება ხილული ფანჯრების გამოყენებით მიმდინარე .blend ფაილში)" + + +msgid "Cycle backwards" +msgstr "ციკლირება უკან" + + +msgid "Toggle a context value" +msgstr "გადართე კონტექსტის მნიშვნელობა" + + +msgctxt "Operator" +msgid "Context Modal Mouse" +msgstr "კონტექსტის მოდალური თაგვი" + + msgid "Header Text" msgstr "სათაურის ტექსტი" +msgid "Text to display in header during scale" +msgstr "მასშტაბირებისას სათაურში საჩვენებელი ტექსტი" + + +msgid "Scale the mouse movement by this value before applying the delta" +msgstr "დელტას გამოყენებამდე დაამასშტაბირე თაგვის მოძრაობა ამ მნიშვნელობით" + + +msgid "Invert the mouse input" +msgstr "შეაქციე თაგვის შენატანი" + + +msgid "Scale a float context value" +msgstr "დაამასშტაბირე ათწილადის კონტექსტის მნიშვნელობა" + + +msgid "Assign value" +msgstr "მიაკუთვნე მნიშვნელობა" + + +msgid "Scale an int context value" +msgstr "დაამასშტაბირე მთელი რიცხვის კონტექსტის მნიშვნელობა" + + +msgid "Always adjust the value by a minimum of 1 when 'value' is not 1.0" +msgstr "ყოველთვის დაარეგულირე მნიშვნელობა მინიმუმ 1-ით, როცა 'მნიშვნელობა' 1.0 არაა" + + +msgid "Set a context value" +msgstr "დააყენე კონტექსტის მნიშვნელობა" + + +msgid "Apply relative to the current value (delta)" +msgstr "გამოიყენე ამჟამინდელ მნიშვნელობასთან შეფარდებით (დელტა)" + + +msgctxt "Operator" +msgid "Set Library ID" +msgstr "დააყენე ბიბლიოთეკის ID" + + +msgid "Set a context value to an ID data-block" +msgstr "დააყენე კონტექსტური მნიშვნელობა ID მონაცემთა ბლოკზე" + + msgctxt "Operator" msgid "Debug Menu" msgstr "გამართვის მენიუ" @@ -61451,6 +65373,119 @@ msgid "Open a popup to set the debug level" msgstr "კონტექსტური მენიუს გახსნა გამართვის დონის დასაყენებლად" +msgctxt "Operator" +msgid "Demo" +msgstr "დემო" + + +msgctxt "Operator" +msgid "Control" +msgstr "კონტროლი" + + +msgid "Prev" +msgstr "წინა" + + +msgid "Pause" +msgstr "პაუზა" + + +msgctxt "Operator" +msgid "Demo Mode (Start)" +msgstr "დემო რეჟიმი (დაწყება)" + + +msgctxt "Operator" +msgid "Demo Mode (Setup)" +msgstr "დემო რეჟიმი (აწყობა)" + + +msgid "Create a demo script and optionally execute it" +msgstr "შექმენი დემო სკრიპტი და საჭიროების შემთხვევაში გაუშვი იგი" + + +msgid "Number of times to play the animation" +msgstr "რამდენჯერ იქნას ანიმაცია დაკრული" + + +msgid "Render Anim" +msgstr "ანიმ. რენდერი" + + +msgid "Render entire animation (render mode only)" +msgstr "დაარენდერე მთელი ანიმაცია (მხოლოდ რენდერის რეჟიმი)" + + +msgid "Screen Switch" +msgstr "ეკრანის გამოცვლა" + + +msgid "Time between switching screens (in seconds) or 0 to disable" +msgstr "დრო ეკრანთა შორის გადასვლისთვის (წამებში), ან 0 გასათიშად" + + +msgid "Time Max" +msgstr "მაქს. დრო" + + +msgid "Maximum number of seconds to show the animation for (in case the end frame is very high for no reason)" +msgstr "მაქსიმალური რაოდენობა წამებისა, რომელთა განმავლობაშიც ანიმაცია უნდა იყოს ნაჩვენები (იმ შემთხვევისთვის, როცა დამასრულებელი კადრი უმიზეზოდ ძალიან მაღალია)" + + +msgid "Time Min" +msgstr "მინ. დრო" + + +msgid "Minimum number of seconds to show the animation for (for small loops)" +msgstr "მინიმალური რაოდენობა წამებისა, რომელთა განმავლობაშიც ანიმაცია უნდა იყოს ნაჩვენები (პატარა ციკლებისთვის)" + + +msgid "Search Path" +msgstr "ძიების მისამართი" + + +msgid "Directory used for importing the file" +msgstr "ფაილის დასაიმპორტირებლად გამოსაყენებელი საქაღალდე" + + +msgid "Render Delay" +msgstr "რენდერის დაყოვნება" + + +msgid "Time to display the rendered image before moving on (in seconds)" +msgstr "რამდენი ხნით იყოს ნაჩვენები დარენდერებული გამოსახულება გაგრძელებამდე (წამებში)" + + +msgid "Run once and exit" +msgstr "ერთხეულ გაუშვი და გამოდი" + + +msgid "Random Order" +msgstr "შემთხვევითი თანმიმდევრობა" + + +msgid "Select files randomly" +msgstr "მონიშნე ფაილები შემთხვევითად" + + +msgid "Run Immediately!" +msgstr "გაუშვი დაუყოვნებლივ!" + + +msgid "Run demo immediately" +msgstr "დაუყოვნებლივ გაუშვი დემო" + + +msgctxt "Operator" +msgid "View Documentation" +msgstr "დოკუმენტაციის ნახვა" + + +msgid "Doc ID" +msgstr "დოკ. ID" + + msgctxt "Operator" msgid "View Manual" msgstr "სახელმძღვანელოს ნახვა" @@ -61465,6 +65500,10 @@ msgid "View Online Manual" msgstr "ონლაინ სახელმძღვანელოს ნახვა" +msgid "View a context based online manual in a web browser" +msgstr "დაათვალიერე კონტექსტზე დაფუძნებული ონლაინ სახელმძღვანელო ვებ ბრაუზერში" + + msgctxt "Operator" msgid "Export to PDF" msgstr "ექსპორტი PDF-ად" @@ -61474,10 +65513,118 @@ msgid "Export grease pencil to PDF" msgstr "grease pencil-ის ექსპორტი PDF-ად" +msgid "Which frames to include in the export" +msgstr "რომელი კადრები იქნას ჩათვლილი ექსპორტში" + + +msgid "Include only active frame" +msgstr "ჩათვალე მხოლოდ აქტიური კადრი" + + +msgid "Include selected frames" +msgstr "ჩათვალე მონიშნული კადრები" + + +msgid "Include all scene frames" +msgstr "ჩათვალე სცენის ყველა კადრი" + + +msgid "Which objects to include in the export" +msgstr "რომელი ობიექტები ჩაითვალოს ექსპორტში" + + +msgid "Include only the active object" +msgstr "ჩათვალე მხოლოდ აქტიური ობიექტი" + + +msgid "Include selected objects" +msgstr "ჩათვალე მონიშნული ობიექტები" + + +msgid "Include all visible objects" +msgstr "ჩათვალე ყველა ხილული ობიექტი" + + +msgid "Precision of stroke sampling. Low values mean a more precise result, and zero disables sampling" +msgstr "მონასმის სემპლირების სიზუსტე. დაბალი მნიშვნელობები ნიშნას უფრო ზუსტ შედეგს, ხოლოდ ნული თიშავს სემპლირებას" + + +msgid "Export strokes with fill enabled" +msgstr "დააექსპორტირე მონასმები ჩართული შევსებით" + + +msgid "Export strokes with constant thickness" +msgstr "დააექსპორტირე მონასმები მუდმივი სისქით" + + +msgctxt "Operator" +msgid "Export to SVG" +msgstr "დააექსპორტირე SVG-დ" + + +msgid "Export grease pencil to SVG" +msgstr "დააექსპორტირე grease pencil-ი SVG-დ" + + +msgid "Clip Camera" +msgstr "შემოჭერი კამერაზე" + + +msgid "Clip drawings to camera size when export in camera view" +msgstr "კამერის ხედში ექსპორტირებისას შემოჭერი ნახატები კამერის ზომაზე" + + msgid "Import SVG into grease pencil" msgstr "SVG-ის იმპორტირება ცვილის ფანქარში" +msgid "Resolution of the generated strokes" +msgstr "წარმოქმნილი მონასმების გარჩევადობა" + + +msgid "Scale of the final strokes" +msgstr "საბოლოო მონასმების მასშტაბი" + + +msgctxt "Operator" +msgid "Add Theme Preset" +msgstr "დამატე თემის წინასწარი აწყობა" + + +msgid "Add or remove a theme preset" +msgstr "დაამატე, ან მოაშორე თემის წინასწარი აწყობა" + + +msgctxt "Operator" +msgid "Add Keyconfig Preset" +msgstr "დაამატე კლავიშკონფიგის წინასწარი აწყობა" + + +msgid "Add or remove a Key-config Preset" +msgstr "დაამატე, ან მოაშორე კლავიშ-კონფიგის წინასწარი აწყობა" + + +msgctxt "Operator" +msgid "Reload Library" +msgstr "გადატვირთე ბიბლიოთეკა" + + +msgid "Reload the given library" +msgstr "გადატვირთე მოცემული ბიბლიოთეკა" + + +msgid "Library to reload" +msgstr "გადასატვირთი ბიბლიოთეკა" + + +msgid "Relocate the given library to one or several others" +msgstr "გადაიტანე მოცემული ბიბლიოთეკა სხვა რამდენიმედან ერთერთზე" + + +msgid "Library to relocate" +msgstr "გადასატანი ბიბლიოთეკა" + + msgctxt "Operator" msgid "Link" msgstr "ბმულით დააკავშირე" @@ -61505,14 +65652,154 @@ msgid "Save the scene to a Wavefront OBJ file" msgstr "შეინახე სცენა Wavefront OBJ ფაილში" +msgid "Apply modifiers to exported meshes" +msgstr "გამოიყენე მოდიფიკატორები ექსპორტირებულ მეშებზე" + + +msgid "The last frame to be exported" +msgstr "დასაექსპორტირებელი ბოლო კადრი" + + +msgid "Export Animation" +msgstr "დააექსპორტირე ანიმაცია" + + +msgid "Export multiple frames instead of the current frame only" +msgstr "დააექსპორტირე მრავალი კადრი და არა მხოლოდ მიმდინარე" + + +msgid "Export Colors" +msgstr "დააექსპორტირე ფერები" + + +msgid "Export per-vertex colors" +msgstr "დააექსპორტირე თითოეული წვეროს ფერი" + + +msgid "Export Curves as NURBS" +msgstr "დააექსპორტირე წირები NURBS-ად" + + +msgid "Export curves in parametric form instead of exporting as mesh" +msgstr "დააექსპორტირე წირები პარამეტრული ფორმით და არა მეშად" + + msgid "Object Properties" msgstr "ობიექტის თვისებები" +msgid "Determines properties like object visibility, modifiers etc., where they differ for Render and Viewport" +msgstr "ადგენს თვისებებს, როგორიცაა ობიექტის ხილულობა, მოდიფიკატორები და სხვ., როცა ისინი სხვადასსხვანაირია რენდერსა და სარკმელში" + + +msgid "Export objects as they appear in render" +msgstr "დააექსპორტირე ობიექტები ისე, როგორც რენდერში ჩანან" + + +msgid "Export objects as they appear in the viewport" +msgstr "დაექსპორტირე ობიექტები ისე, როგორც სარკმელში ჩანან" + + msgid "Export Material Groups" msgstr "დააექსპორტირე მასალის ჯგუფები" +msgid "Generate an OBJ group for each part of a geometry using a different material" +msgstr "წარმოქმენი OBJ ჯგუფი გეომეტრიის ყოველი ნაწილისთვის, რომელიც სხვა მასალას იყენებს" + + +msgid "Export Materials" +msgstr "დააექსპორტირე მასალები" + + +msgid "Export Normals" +msgstr "დააექსპორტირე ნორმალები" + + +msgid "Export per-face normals if the face is flat-shaded, per-face-per-loop normals if smooth-shaded" +msgstr "დააექსპორტირე ნორმალები ყოველ წახნაგზე, თუ წახნაგი ბრტყლად შეფერადებულია, და ნორმალები ყოველ წახნაგ-მარყუჟზე - თუ გლუვად შეფერადებულია" + + +msgid "Export Object Groups" +msgstr "დააექსპორტირე ობიექტის ჯგუფები" + + +msgid "Export Materials with PBR Extensions" +msgstr "დააექსპორტირე მასალები PBR გაფართოებებით" + + +msgid "Export MTL library using PBR extensions (roughness, metallic, sheen, coat, anisotropy, transmission)" +msgstr "დააექსპორტირე MTL ბიბლიოთეკა PBR გაფართოებების გამოყენებით (სიხეშეშე, ლითონურობა, ბრწყინვა, ლაქი, ანიზოტროპია, გადაცემა)" + + +msgid "Export Selected Objects" +msgstr "დააექსპორტირე მონიშნული ობიექტები" + + +msgid "Export only selected objects instead of all supported objects" +msgstr "დააექსპორტირე მხოლოდ მონიშნული ობიექტები და არა ყველა მხარდაჭერილი ობიექტი" + + +msgid "Export Smooth Groups" +msgstr "დააექსპოტირე სიგლუვის ჯგუფები" + + +msgid "Every smooth-shaded face is assigned group \"1\" and every flat-shaded face \"off\"" +msgstr "ყოველ გლუვად შეფერადებულ წახნაგს მიეკუთვნება ჯგუფი \"1\" და ყოველ ბრტყლად შეფერადებულს - \"off\"" + + +msgid "Export Triangulated Mesh" +msgstr "დააექსპორტირე გასამკუთხედებული მეში" + + +msgid "All ngons with four or more vertices will be triangulated. Meshes in the scene will not be affected. Behaves like Triangulate Modifier with ngon-method: \"Beauty\", quad-method: \"Shortest Diagonal\", min vertices: 4" +msgstr "ოთხი, ან მეტი წვეროს მქონე ყველა მრავალკუთხედი გასამკუთხედდება. სცენის მეშებზე ზემოქმედება არ მოხდება. იქცევა, როგორც გასამკუთხედების მოდიფიკატორი მრავალკუთხედის მეთოდით: \"სილამაზე\", ოთხკუთხედის მეთოდით: \"უმოკლესი დიაგონალი\", მინ. წვეროები: 4" + + +msgid "Export Vertex Groups" +msgstr "დააექსპორტირე წვეროთა ჯგუფები" + + +msgid "Positive X axis" +msgstr "დადებითი X ღერძი" + + +msgid "Positive Y axis" +msgstr "დადებითი Y ღერძი" + + +msgid "Positive Z axis" +msgstr "დადებითი Z ღერძი" + + +msgid "Negative X axis" +msgstr "უარყოფითი X ღერძი" + + +msgid "Negative Y axis" +msgstr "უარყოფითი Y ღერძი" + + +msgid "Negative Z axis" +msgstr "უარყოფითი Z ღერძი" + + +msgid "Write relative paths where possible" +msgstr "სადაც შესაძლებელია, ჩაწერე შეფარდებითი მისამართები" + + +msgid "Write filename only" +msgstr "ჩაწერე მხოლოდ ფაილის სახელი" + + +msgid "Copy the file to the destination path" +msgstr "გადააკოპირე ფაილი დანიშნულების მისამართზე" + + +msgid "The first frame to be exported" +msgstr "დასაექსპორტებელი პირველი კადრი" + + msgctxt "Operator" msgid "Import Wavefront OBJ" msgstr "დააიმპორტირე Wavefront OBJ" @@ -61522,6 +65809,26 @@ msgid "Load a Wavefront OBJ scene" msgstr "ჩატვირთე Wavefront OBJ სცენა" +msgid "Clamp Bounding Box" +msgstr "აღკვეთე მზღუდავი კოლოფი" + + +msgid "Resize the objects to keep bounding box under this value. Value 0 disables clamping" +msgstr "შეცვალე ობიექტების ზომა, რომ მზღუდავი კოლოფი ამ მნიშვნელობის ქვემოთ დატოვო. მნიშვნელობა 0 აღკვეთას თიშავს" + + +msgid "Import OBJ groups as vertex groups" +msgstr "დააიმპორტირე OBJ ჯგუფები წვეროთა ჯგუფებად" + + +msgid "Split By Group" +msgstr "გახლიჩე ჯგუფის მიხედვით" + + +msgid "Split By Object" +msgstr "გახლიჩე ობიექტის მიხედვით" + + msgctxt "Operator" msgid "Open" msgstr "გახსენი" @@ -61535,6 +65842,10 @@ msgid "Load UI" msgstr "ჩატვირთე UI" +msgid "Load user interface setup in the .blend file" +msgstr "ჩატვირთე მომხმარებლის ინტერფეისის კონფიგურაცია .blend ფაილში" + + msgid "State" msgstr "მდგომარეობა" @@ -61543,6 +65854,52 @@ msgid "Trusted Source" msgstr "სანდო წყარო" +msgid "Allow .blend file to execute scripts automatically, default available from system preferences" +msgstr "ნება დართე .blend ფაილს, სკრიპტები ავტომატურად გაუშვას, ნაგულისხმები ხელმისაწვდომია სისტემის პარამეტრებში" + + +msgid "List all the operators in a text-block, useful for scripting" +msgstr "ჩამოთვალე ყველა ოპერატორი ტექსტის ბლოკში, გამოსადეგია სკრიპტინგისთვის" + + +msgctxt "Operator" +msgid "Restore Operator Defaults" +msgstr "აღადგინე ოპერატორის ნაგულისხმები" + + +msgid "Set the active operator to its default values" +msgstr "დააყენე აქტიური ოპერატორი ნაგულისხმებ მნიშვნელობებზე" + + +msgid "Operator name (in Python as string)" +msgstr "ოპერატორის სახელი (Python-ში სტრიქონად)" + + +msgid "Property name (as a string)" +msgstr "თვისების სახელი (სტრიქონად)" + + +msgctxt "Operator" +msgid "Operator Preset" +msgstr "ოპერატორის წინასწარი წყობა" + + +msgid "Add or remove an Operator Preset" +msgstr "დაამატე, ან მოაშორე ოპერატორის წინასწარი წყობა" + + +msgid "Disable add-on for workspace" +msgstr "გათიშე დანამატი სამუშაო სივრცისთვის" + + +msgid "UI Tag" +msgstr "UI ეტიკეტი" + + +msgid "Enable add-on for workspace" +msgstr "ჩართე დანამატი სამუშაო სივრცისთვის" + + msgid "Open a path in a file browser" msgstr "გახსენი მისამართი ფაილების ბრაუზერში" @@ -61556,19 +65913,51 @@ msgid "Save the scene to a PLY file" msgstr "შეინახე სცენა PLY ფაილში" +msgid "ASCII Format" +msgstr "ASCII ფორმატი" + + +msgid "Export file in ASCII format, export as binary otherwise" +msgstr "დააექსპორტირე ფაილი ASCII ფორმატში, სხვა შემთხვევაში დააექსპორტირე ბინარულად" + + msgid "Export Vertex Colors" msgstr "დააექსპორტირე წვეროთა ფერები" +msgid "Do not import/export color attributes" +msgstr "ნუ დააიმპორტირებ/დააექსპორტირებ ფერთა ატრიბუტებს" + + +msgid "Vertex colors in the file are in sRGB color space" +msgstr "წვეროთა ფერები ფაილში sRGB ფერით სივრცეშია" + + +msgid "Vertex colors in the file are in linear color space" +msgstr "წვეროთა ფერები ფაილში წრფივ ფერით სივრცეშია" + + msgid "Export Vertex Normals" msgstr "დააექსპორტირე წვეროთა ნორმალები" +msgid "Export specific vertex normals if available, export calculated normals otherwise" +msgstr "თუ შესაძლებელია, დააექსპორტირე კონკრეტული წვეროთა ნორმალები, წინააღმდეგ შემთხვევაში დააექსპორტირე გამოთვლილი ნორმალები" + + msgctxt "Operator" msgid "Import PLY" msgstr "დააიმპორტირე PLY" +msgid "Import an PLY file as an object" +msgstr "დააიმპორტირე PLY ფაილი ობიექტად" + + +msgid "Merges vertices by distance" +msgstr "შერწყამს წვეროებს მანძილის მიხედვით" + + msgctxt "Operator" msgid "Batch-Clear Previews" msgstr "წინასწარი ხედების ერთობლივი გასუფთავება" @@ -61578,6 +65967,38 @@ msgid "Clear selected .blend file's previews" msgstr "არჩეული .blend ფაილის წინასწარი ხედების გასუფთავება" +msgid "Save Backups" +msgstr "შეინახე სათადარიგოები" + + +msgid "Keep a backup (.blend1) version of the files when saving with cleared previews" +msgstr "დაიტოვე ფაილების სათადარიგო (.blend1) ვერსია, როცა გასუფთავებული წინასწარი ხედებით ინახავ" + + +msgid "Clear collections' previews" +msgstr "გაასუფთავე კოლექციების წინასწარი ხედები" + + +msgid "Materials & Textures" +msgstr "მასალები და ტექსტურები" + + +msgid "Clear 'internal' previews (materials, textures, images, etc.)" +msgstr "გაასუფთავე 'შიდა' წინასწარი ხედები (მასალები, ტექსტურები, გამოსახულებები და სხვ.)" + + +msgid "Clear objects' previews" +msgstr "გაასუფთავე ობიექტების წინასწარი ხედები" + + +msgid "Clear scenes' previews" +msgstr "გაასუფთავე სცენების წინასწარი ხედები" + + +msgid "Trusted Blend Files" +msgstr "სანდო Blend ფაილები" + + msgctxt "Operator" msgid "Batch-Generate Previews" msgstr "წინასწარი ხედების ერთობლივი გენერირება" @@ -61587,6 +66008,42 @@ msgid "Generate selected .blend file's previews" msgstr "არჩეული .blend ფაილის წინასწარი ხედების გენერირება" +msgid "Root path of all files listed in `files` collection" +msgstr "კოლექციაში 'ფაილები' ჩამოთვლილი ყველა ფაილის ძირეული მისამართი" + + +msgid "Collection of file paths with common `directory` root" +msgstr "საერთო `საქაღალდე`-ს ძირის მქონე ფაილთა მისამართების კოლექცია" + + +msgid "Show Blender files in the File Browser" +msgstr "აჩვენე ბლენდერის ფაილები ფაილების ბრაუზერში" + + +msgid "Show folders in the File Browser" +msgstr "აჩვენე საქაღალდეები ფაილების ბრაუზერში" + + +msgid "Keep a backup (.blend1) version of the files when saving with generated previews" +msgstr "წარმოქმნილი წინასწარი ხედებით შენახვისას დაიტოვე ფაილების სათადარიგო (.blend1) ვერსია" + + +msgid "Generate collections' previews" +msgstr "წარმოქმენი კოლექციების წინასწარი ხედები" + + +msgid "Generate 'internal' previews (materials, textures, images, etc.)" +msgstr "წარმოქმენი 'შიდა' წინასწარი ხედები (მასალები, ტექსტურები, გამოსახულებები და სხვ.)" + + +msgid "Generate objects' previews" +msgstr "წარმოქმენი ობიექტების წინასწარი ხედები" + + +msgid "Generate scenes' previews" +msgstr "წარმოქმენი სცენების წინასწარი ხედები" + + msgctxt "Operator" msgid "Clear Data-Block Previews" msgstr "გაასუფთავე მონაცემთა ბლოკების წინასწარი ხედები" @@ -61600,6 +66057,10 @@ msgid "Data-Block Type" msgstr "მონაცემთა ბლოკის ტიპი" +msgid "Which data-block previews to clear" +msgstr "მონაცემთა ბლოკების რომელი წინასწარი ხედები გასუფთავდეს" + + msgid "All Types" msgstr "ყველა ტიპი" @@ -61608,6 +66069,18 @@ msgid "All Geometry Types" msgstr "გეომეტრიის ყველა ტიპი" +msgid "Clear previews for scenes, collections and objects" +msgstr "გაასუფთავე წინასწარი ხედები სცენების, კოლექციებისა და ობიექტებისთვის" + + +msgid "All Shading Types" +msgstr "შეფერადების ყველა ტიპი" + + +msgid "Clear previews for materials, lights, worlds, textures and images" +msgstr "გაასუფთავე წინასწარი ხედები მასალების, სინათლეების, სამყაროების, ტექსტურებისა და გამოსახულებებისთვის" + + msgctxt "Operator" msgid "Refresh Data-Block Previews" msgstr "მონაცემთა ბლოკების წინასწარი ხედის განახლება" @@ -61630,6 +66103,10 @@ msgid "Property Edit" msgstr "თვისების დამუშავება" +msgid "Jump to a different tab inside the properties editor" +msgstr "გადახტი სხვა ჩანართზე თვისებათა რედაქტორში" + + msgid "Context" msgstr "კონტექსტი" @@ -61691,6 +66168,18 @@ msgid "An array of integers" msgstr "მთელი რიცხვების მასივ" +msgid "A true or false value" +msgstr "ჭეშმარიტი, ან მცდარი მნიშვნელობა" + + +msgid "Boolean Array" +msgstr "ლოგიკური მასივი" + + +msgid "An array of true or false values" +msgstr "ჭეშმარიტი, ან მცდარი მნიშვნელობების მასივი" + + msgid "A string value" msgstr "ტექსტური მნიშვნელობა" @@ -61699,6 +66188,14 @@ msgid "Data-Block" msgstr "მონაცემთა ბლოკი" +msgid "A data-block value" +msgstr "მონაცემთა ბლოკის მნიშვნელობა" + + +msgid "Edit a Python value directly, for unsupported property types" +msgstr "დაარედაქტირე Python-ის მნიშვნელობა პირდაპირ, თვისებათა მხარდაუჭერელი ტიპებისთვის" + + msgid "Soft Max" msgstr "რბილი მაქსიმუმი" @@ -61746,10 +66243,50 @@ msgid "Quit Blender" msgstr "ბლენდერის დახურვა" +msgid "Set some size property (e.g. brush size) with mouse wheel" +msgstr "დააყენე იმავე ზომის თვისება (მაგ.: ფუნჯის ზომა) თაგვის გორგოლაჭით" + + +msgid "Color Path" +msgstr "ფერის მისამართი" + + +msgid "Path of property used to set the color of the control" +msgstr "მისამართი თვისებისა, რომელიც გამოიყენება კონტროლის ფერის დასაყენებლად" + + +msgid "Fill Color Override Path" +msgstr "ფერით შევსების უკუგდების მისამართი" + + +msgid "Fill Color Override Test" +msgstr "ფერით შევსების უკუგდების ტესტი" + + +msgid "Fill Color Path" +msgstr "ფერით შევსების მისამართი" + + +msgid "Path of property used to set the fill color of the control" +msgstr "მისამართი თვისებისა, რომელიც გამოიყენება კონტროლისთვის ფერით შევსების დასაყენებლად" + + msgid "Image ID" msgstr "გამოსახულების ID" +msgid "Path of ID that is used to generate an image for the control" +msgstr "მისამართი ID-სა, რომელიც გამოიყენება კონტროლისთვის გამოსახულების წარმოსაქმნელად" + + +msgid "Confirm On Release" +msgstr "დაადასტურე აშვებისას" + + +msgid "Finish operation on key release" +msgstr "დაასრულე ოპერაცია კლავიშის აშვებისას" + + msgctxt "Operator" msgid "Load Factory Settings" msgstr "ჩატვირთე თავდაპირველი პარამეტრები" @@ -61759,6 +66296,45 @@ msgid "Load factory default startup file and preferences. To make changes perman msgstr "ჩატვირთე თავდაპირველი საწყისი ფაილისა და პარამეტრები. იმისთვის, რომ ცვლილებები მუდმივი გახდეს, გამოიყენე \"საწყისი ფაილის შენახვა\" და \"პარამეტრების შენახვა\"" +msgctxt "Operator" +msgid "Load Factory Preferences" +msgstr "ჩატვირთე ქარხნული პარამეტრები" + + +msgid "Load factory default preferences. To make changes to preferences permanent, use \"Save Preferences\"" +msgstr "ჩატვირთე ქარხნული ნაგულისხმები პარამეტრები. იმისათვის, რომ პარამეტრებში შეტანილი ცვლილებები სამუდამო გახდეს, გამოიყენე \"შეინახე პარამეტრები\"" + + +msgctxt "Operator" +msgid "Reload History File" +msgstr "გადატვირთე ისტორიის ფაილი" + + +msgid "Reloads history and bookmarks" +msgstr "გადატვირთავს ისტორიასა და სანიშნეებს" + + +msgctxt "Operator" +msgid "Reload Start-Up File" +msgstr "გადატვირთე გაშვების ფაილი" + + +msgid "Open the default file" +msgstr "გახსენი ნაგულისხმები ფაილი" + + +msgid "Path to an alternative start-up file" +msgstr "ალტერნატიული გაშვების ფაილის მისამართი" + + +msgid "Load user interface setup from the .blend file" +msgstr "ჩატვირთე მომხმარებლის ინტერფეისის კონფიგურაცია .blend ფაილიდან" + + +msgid "Factory Startup" +msgstr "ქარხნული გაშვება" + + msgctxt "Operator" msgid "Load Preferences" msgstr "ჩატვირთე პარამეტრები" @@ -61795,10 +66371,18 @@ msgid "Simple redraw timer to test the speed of updating the interface" msgstr "ხელახლა გამოსახვის მარტივი წამმზომი ინტერფეისის განახლების სიჩქარის გამოსაცდელად" +msgid "Number of times to redraw" +msgstr "ხელახლა გამოსახვის რაოდენობა" + + msgid "Time Limit" msgstr "დროის ლიმიტი" +msgid "Seconds to run the test for (override iterations)" +msgstr "წამები, რომელთა განმავლობაშიც უნდა მიმდინარეობდეს ტესტი (უკუაგდე იტერაციები)" + + msgid "Draw Region" msgstr "მონაკვეთის გამოსახვა" @@ -61880,6 +66464,14 @@ msgid "Save a copy of the actual working state but does not make saved file acti msgstr "შეინახე მიმდინარე სამუშაო მდგომარეობის ასლი, მაგრამ არ გაააქტიურო შენახული ფაილი" +msgid "Remap Relative" +msgstr "ხელახლა გაანაწილე შეფარდებითი" + + +msgid "Remap relative paths when saving to a different directory" +msgstr "ხელახლა გაანაწილე შეფარდებითი მისამართები, როცა სხვა საქაღალდეში ინახავ" + + msgctxt "Operator" msgid "Save Startup File" msgstr "შეინახე საწყისი ფაილი" @@ -61911,18 +66503,77 @@ msgid "Make the current preferences default" msgstr "გადააქციე ახლანდელი პარამეტრები ნაგულისხმებად" +msgctxt "Operator" +msgid "Search Menu" +msgstr "ძიების მენიუ" + + msgid "Pop-up a search over all menus in the current context" msgstr "გახსენი კონტექსტური ძიება ყველა მენიუში" +msgctxt "Operator" +msgid "Search Operator" +msgstr "ძიების ოპერატორი" + + +msgid "Pop-up a search for a menu in current context" +msgstr "გახსენი მენიუს კონტექსტური ძიება მიმდინარე კონტექსტში" + + +msgid "Menu Name" +msgstr "მენიუს სახელი" + + +msgid "Menu to search in" +msgstr "მენიუ, რომელშიც უნდა მოიძებნოს" + + +msgctxt "Operator" +msgid "Set Stereo 3D" +msgstr "დააყენე სტერეო 3გ" + + +msgid "Toggle 3D stereo support for current window (or change the display mode)" +msgstr "გადართე 3გ სტერეოს მხარდაჭერა ამჟამინდელი ფანჯრისთვის (ან შეცვალე ასახვის რეჟიმი)" + + +msgid "Yellow-Blue" +msgstr "ყვითელ-ლურჯი" + + msgid "Side-by-Side" msgstr "გვერდიგვერდ" +msgid "Render views for left and right eyes side-by-side" +msgstr "დაარენდერე ხედები მარცხენა და მარჯვენა თვალისთვის გვერდიგვერდ" + + msgid "Top-Bottom" msgstr "ზემოდან ქვემოთ" +msgid "Render views for left and right eyes one above another" +msgstr "დაარენდერე ხედები მარცხენა და მარჯვენა თვალებისთვის ერთიმეორის ზემოთ" + + +msgid "Swap Left/Right" +msgstr "გაცვალე მარცხენა/მარჯვენა" + + +msgid "Swap left and right stereo channels" +msgstr "გაცვალე მარცხენა და მარჯვენა სტერეო არხები" + + +msgid "Cross-Eyed" +msgstr "დაელმებული" + + +msgid "Right eye should see left image and vice versa" +msgstr "მარჯვენა თვალი უნდა ხედავდეს მარცხენა გამოსახულებას და პირიქით" + + msgctxt "Operator" msgid "Splash Screen" msgstr "ქუდი" @@ -61941,6 +66592,10 @@ msgid "Open a window with information about Blender" msgstr "ბლენდერის შესახებ ინფორმაციის მქონე ფანჯრის გახსნა" +msgid "Import an STL file as an object" +msgstr "დააიმპორტირე STL ფაილი ობიექტად" + + msgctxt "Operator" msgid "Save System Info" msgstr "სისტემური ინფორმაციის შენახვა" @@ -61950,6 +66605,40 @@ msgid "Generate system information, saved into a text file" msgstr "ტექსტურ ფაილში შენახული სისტემური ინფორმაციის წარმოქმნა" +msgctxt "Operator" +msgid "Set Tool by Name" +msgstr "დააყენე ხელსაწყო სახელის მიხედვით" + + +msgid "Set the tool by name (for key-maps)" +msgstr "დააყენე ხელსაწყო სახელის მიხედვით (კლავიშ-რუკებისთვის)" + + +msgid "Cycle" +msgstr "ციკლი" + + +msgid "Cycle through tools in this group" +msgstr "ამ ჯგუფის ხელსაწყოების ციკლური ცვლა" + + +msgid "Identifier of the tool" +msgstr "ხელსაწყოს ინდეტიფიკატორი" + + +msgctxt "Operator" +msgid "Set Tool by Index" +msgstr "დააყენე ხელსაწყო ინდექსის მიხედვით" + + +msgid "Set the tool by index (for key-maps)" +msgstr "დააყენე ხელსაწყო ინდექსის მიხედვით (კლავიშ-რუკებისთვის)" + + +msgid "Include tool subgroups" +msgstr "მოიცავი ხელსაწყოთა ქვეჯგუფები" + + msgid "Index in Toolbar" msgstr "ინდექსი ხელსაწყოთა ზოლში" @@ -61959,8 +66648,29 @@ msgid "Toolbar" msgstr "ხელსაწყოთა ზოლი" +msgid "Open a website in the web browser" +msgstr "გახსენი ვებსაიტი ვებ ბრაუზერში" + + +msgid "URL" +msgstr "URL" + + +msgid "URL to open" +msgstr "გასახსნელი URL" + + +msgctxt "Operator" +msgid "Open Preset Website" +msgstr "გახსენი წინასწარი წყობის ვებსაიტი" + + msgid "Open a preset website in the web browser" -msgstr "ვებ ბრაუზერში ვებსაიტის გახსნა" +msgstr "გახსენი წინასწარი წყობის ვებსაიტი ვებ ბრაუზერში" + + +msgid "Site" +msgstr "საიტი" msgctxt "Operator" @@ -61972,22 +66682,78 @@ msgid "Export current scene in a USD archive" msgstr "მიმდინარე სცენის ექსპორტირება USD არქივში" +msgid "Export all frames in the render frame range, rather than only the current frame" +msgstr "დააექსპორტირე ყველა კადრი რენდერის კადრთა დიაპაზონში და არა მხოლოდ მიმდინარე კადრი" + + +msgid "Export hair particle systems as USD curves" +msgstr "დააექსპორტირე თმების ნაწილაკთა სისტემები USD წირებად" + + +msgid "Export viewport settings of materials as USD preview materials, and export material assignments as geometry subsets" +msgstr "დააექსპორტირე მასალების სარკმლის პარამეტრები USD წინასწარი ხედის მასალებად და დააექსპორტირე მასალის მიკუთვნებები გეომეტრიის ქვეწყებებად" + + +msgid "Include mesh color attributes in the export" +msgstr "მიათვალე მეშის ფერების ატრიბუტები ექსპორტში" + + +msgid "Include normals of exported meshes in the export" +msgstr "მიათვალე დაექსპორტირებული მეშების ნორმალები ექსპორტში" + + msgid "Export Textures" msgstr "ტექსტურების ექსპორტი" +msgid "If exporting materials, export textures referenced by material nodes to a 'textures' directory in the same directory as the USD file" +msgstr "თუ ექსპორტირდება მასალები, დააექსპორტირე მასალის კვანძების მიერ მითითებული ტექსტურები საქაღალდეში 'ტექსტურები', იმავე საქაღალდეში, სადაც USD ფაილია" + + msgid "UV Maps" msgstr "UV რუკები" +msgid "Include all mesh UV maps in the export" +msgstr "მიათვალე მეშების ყველა UV რუკა ექსპორტში" + + +msgid "To USD Preview Surface" +msgstr "USD-ის წინასწარი ხედის ხედაპირად" + + +msgid "Overwrite Textures" +msgstr "გადააწერე ტექსტურებს" + + +msgid "Overwrite existing files when exporting textures" +msgstr "როცა ტექსტურებს აექსპორტირებ, გადააწერე არსებულ ფაილებს" + + +msgid "Use relative paths to reference external files (i.e. textures, volumes) in USD, otherwise use absolute paths" +msgstr "გამოიყენე შეფარდებითი მისამართები გარე ფაილებზე მითითებისთვის (მაგ.: ტექსტურები, მოცულობები) USD-ში, წინააღმდეგ შემთხვევაში გამოიყენე აბსოლუტური მისამართები" + + +msgid "Only export selected objects. Unselected parents of selected objects are exported as empty transform" +msgstr "დააექსპორტირე მხოლოდ მონიშნული ობიექტები. მონიშნული ობიექტების მოუნიშნავი მშობლები ექსპორტირდება ცარიელ გარდაქმნებად" + + msgid "Instancing" msgstr "ინსტანცირება" +msgid "Export instanced objects as references in USD rather than real objects" +msgstr "დააექსპორტირე ინსტანცირებული ობიექტები მითითებებად USD-ში და არა ნამდვილ ობიექტებად" + + msgid "Visible Only" msgstr "მხოლოდ ხილული" +msgid "Only export visible objects. Invisible parents of exported objects are exported as empty transforms" +msgstr "დააექსპორტირე მხოლოდ ხილული ობიექტები. ექსპორტირებული ობიექტების უხილავი მშობლები ექსპორტირდება ცარიელ გარდაქმნებად" + + msgctxt "Operator" msgid "Import USD" msgstr "USD-ის იმპორტი" @@ -62001,10 +66767,30 @@ msgid "Create Collection" msgstr "კოლექციის შექმნა" +msgid "Add all imported objects to a new collection" +msgstr "დაამატე ყველა იმპორტირებული ობიექტი ახალ კოლექციაში" + + msgid "Import All Materials" msgstr "დააიმპორტირე ყველა მასალა" +msgid "Also import materials that are not used by any geometry. Note that when this option is false, materials referenced by geometry will still be imported" +msgstr "აგრეთვე დააიმპორტირე მასალები, რომლებსაც არანაირი გეომეტრია არ იყენებს. გაითვალისწინე, რომ როცა ეს ვარიანტი მცდარია, გეომეტრიის მიერ მითითებული მასალები მაინც იმპორტირდება" + + +msgid "Blend Shapes" +msgstr "შეაზავე ფორმები" + + +msgid "Create unique Blender objects for USD instances" +msgstr "შექმენი ბლენდერის უნიკალური ობიექტები USD ინსტანციებისთვის" + + +msgid "Import final render geometry" +msgstr "დააიმპორტირე საბოლოო სარენდერო გეომეტრია" + + msgid "Shapes" msgstr "ფორმები" @@ -62013,14 +66799,134 @@ msgid "Skeletons" msgstr "ჩონჩხები" +msgid "Import Subdivision Scheme" +msgstr "დააიმპორტირე დაყოფის სქემა" + + +msgid "Create subdivision surface modifiers based on the USD SubdivisionScheme attribute" +msgstr "შექმენი დაყოფის ზედაპირის მოდიფიკატორები USD ატრიბუტის დაყოფისსქემა გამოყენებით" + + +msgid "Textures Directory" +msgstr "ტექსტურების საქაღალდე" + + +msgid "Path to the directory where imported textures will be copied" +msgstr "მისამართი საქაღალდისა, სადაც იმპორტირებული ტექსტურები გადაკოპირდება" + + msgid "Import Textures" msgstr "დააიმპორტირე ტექსტურები" +msgid "Behavior when importing textures from a USDZ archive" +msgstr "ქცევა ტექსტურების USDZ არქივიდან იმპორტირებისას" + + +msgid "Don't import textures" +msgstr "ნუ დააიმპორტირებ ტექსტურებს" + + +msgid "Packed" +msgstr "ჩალაგებული" + + +msgid "Import textures as packed data" +msgstr "დააიმპორტირე ტექსტურები ჩალაგებულ მონაცემებად" + + +msgid "Copy files to textures directory" +msgstr "გადააკოპირე ფაილები ტექსტურების საქაღალდეში" + + +msgid "Import USD Preview" +msgstr "დააიმპორტირე USD-ს წინასწარი ხედი" + + +msgid "Visible Primitives Only" +msgstr "მხოლოდ ხილული პრიმიტივები" + + +msgid "Do not import invisible USD primitives. Only applies to primitives with a non-animated visibility attribute. Primitives with animated visibility will always be imported" +msgstr "ნუ დააიმპორტირებ უხილავ USD პრიმიტივებს. ეხება მხოლოდ პრიმიტივებს არაანიმირებული ხილულობის ატრიბუტით. პრიმიტივები ანიმირებული ხილულობით ყოველთვის იმპორტირდება" + + +msgid "Light Intensity Scale" +msgstr "სინათლის ინტენსივობის მასშტაბი" + + +msgid "Scale for the intensity of imported lights" +msgstr "მასშტაბი იმპორტირებული სინათლეების ინტენსივობისთვის" + + +msgid "Behavior when the name of an imported material conflicts with an existing material" +msgstr "ქცევა, როცა იმპორტირებული მასალის სახელი კონფლიქტში მოდის არსებულ მასალასთან" + + +msgid "Make Unique" +msgstr "გააუნიკალურე" + + +msgid "Import each USD material as a unique Blender material" +msgstr "დააიმპორტირე თითოეული USD მასალა ბლენდერის უნიკალურ მასალად" + + +msgid "Reference Existing" +msgstr "მიუთითე არსებულზე" + + +msgid "If a material with the same name already exists, reference that instead of importing" +msgstr "თუ იმავე სახელის მქონე მასალა უკვე არსებობს, იმპორტირების მაგივრად მიუთითე მასზე" + + +msgid "Path Mask" +msgstr "მისამართის ნიღაბი" + + +msgid "Import only the primitive at the given path and its descendants. Multiple paths may be specified in a list delimited by commas or semicolons" +msgstr "დააიმპორტირე მხოლოდ მოცემულ მისამართზე მყოფი პრიმიტივი და მისი შთამომავლები. მძიმეებით, ან წერტილმძიმეებით გამიჯნულ სიაში შეიძლება, მრავალი მისამართი იყოს განსაზღვრული" + + msgid "Mesh Attributes" msgstr "მეშის ატრიბუტები" +msgid "Read mesh color attributes" +msgstr "წაიკითხე მეშის ფერითი ატრიბუტები" + + +msgid "Read mesh UV coordinates" +msgstr "წაიკითხე მეშის UV კოორდინატები" + + +msgid "Update the scene's start and end frame to match those of the USD archive" +msgstr "განაახლე სცენის საწყისი და დამაბოლოვებელი კადრები, რომ USD არქივისას ემთხვეოდეს" + + +msgid "Set Material Blend" +msgstr "დააყენე მასალის შეზავება" + + +msgid "If the Import USD Preview option is enabled, the material blend method will automatically be set based on the shader's opacity and opacityThreshold inputs" +msgstr "თუ ვარიანტი დააიმპორტირე USD-ის წინასწარი ხედი ჩართულია, მასალის შეზავების მეთოდი ავტომატურად დაყენდება იერფერის გაუმჭვირვალობისა და გაუმჭვირვალობის ზღვრის შემავალი მონაცემების მიხედვით" + + +msgid "Behavior when the name of an imported texture file conflicts with an existing file" +msgstr "ქცევა, როცა იმპორტირებული ტექსტურის ფაილის სახელი კონფლიქტში მოდის არსებულ ფაილთან" + + +msgid "Use Existing" +msgstr "გამოიყენე არსებული" + + +msgid "If a file with the same name already exists, use that instead of copying" +msgstr "თუ იმავე სახელის მქონე ფაილი უკვე არსებობს, გამოიყენე იგი კოპირების მაგივრად" + + +msgid "Overwrite existing files" +msgstr "გადააწერე არსებულ ფაილებს" + + msgctxt "Operator" msgid "Close Window" msgstr "დახურე ფანჯარა" @@ -62035,6 +66941,10 @@ msgid "Toggle Window Fullscreen" msgstr "სრულ ეკრანზე ჩვენების ჩართვა-გამორთვა" +msgid "Toggle the current window full-screen" +msgstr "გადართე მიმდინარე ფანჯრის სრულ ეკრანზე ჩვენება" + + msgctxt "Operator" msgid "New Window" msgstr "ახალი ფანჯარა" @@ -62053,6 +66963,227 @@ msgid "Create a new main window with its own workspace and scene selection" msgstr "ახალი მთავარი ფანჯრის შექმნა თავისი საკუთარი სამუშაო სივრცითა და სცენის არჩევანით" +msgctxt "Operator" +msgid "XR Navigation Fly" +msgstr "XR გზისკვლევა ფრენით" + + +msgid "Move/turn relative to the VR viewer or controller" +msgstr "იმოძრავე/მოუხვიე VR მაჩვენებელთან, ან კონტროლერთან მიმართებაში" + + +msgid "Lock Direction" +msgstr "დაბლოკე მიმართულება" + + +msgid "Limit movement to viewer's initial direction" +msgstr "შეზღუდე მოძრაობა დამთვალიერებლის თავდაპირველი მიმართულებით" + + +msgid "Lock Elevation" +msgstr "დაბლოკე ამაღლება" + + +msgid "Prevent changes to viewer elevation" +msgstr "თავიდან აიცილე დამთვალიერებლის სიმაღლეში ცვლილებები" + + +msgid "Fly mode" +msgstr "ფრენის რეჟიმი" + + +msgid "Move along navigation forward axis" +msgstr "იმოძრავე გზაკვლევის წინ ღერძის გასწვრივ" + + +msgid "Move along navigation back axis" +msgstr "იმოძრავე გზაკვლევის უკან ღერძის გასწვრივ" + + +msgid "Move along navigation left axis" +msgstr "იმოძრავე გზაკვლევის მარცხნივ ღერძის გასწვრივ" + + +msgid "Move along navigation right axis" +msgstr "იმოძრავე გზაკვლევის მარჯვნივ ღერძის გასწვრივ" + + +msgid "Move along navigation up axis" +msgstr "იმოძრავე გზაკვლევის ზევით ღერძის გასწვრივ" + + +msgid "Move along navigation down axis" +msgstr "იმოძრავე გზაკვლევის ქვევით ღერძის გასწვრივ" + + +msgid "Turn Left" +msgstr "მოუხვიე მარცხნივ" + + +msgid "Turn counter-clockwise around navigation up axis" +msgstr "მოუხვიე საათის ისრის საწინააღმდეგოდ გზაკვლევის ზევით ღერძის გარშემო" + + +msgid "Turn Right" +msgstr "მოუხვიე მარჯვნივ" + + +msgid "Turn clockwise around navigation up axis" +msgstr "მოუხვიე საათის ისრის მიმართულებით გზაკვლევის ზევით ღერძის გარშემო" + + +msgid "Viewer Forward" +msgstr "დამთვალიერებლის წინ" + + +msgid "Move along viewer's forward axis" +msgstr "იმოძრავე დამთვალიერებლის წინ ღერძის გასწვრივ" + + +msgid "Viewer Back" +msgstr "დამთვალიერებლის უკან" + + +msgid "Move along viewer's back axis" +msgstr "იმოძრავე დამთვალიერებლის უკან ღერძის გასწვრივ" + + +msgid "Viewer Left" +msgstr "დამთვალიერებლის მარცხნივ" + + +msgid "Move along viewer's left axis" +msgstr "იმოძრავე დამთვალიერებლის მარცხნივ ღერძის გასწვრივ" + + +msgid "Viewer Right" +msgstr "დამთვალიერებლის მარჯვნივ" + + +msgid "Move along viewer's right axis" +msgstr "იმოძრავე დამთვალიერებლის მარჯვნივ ღერძის გასწვრივ" + + +msgid "Controller Forward" +msgstr "კონტროლერის წინ" + + +msgid "Move along controller's forward axis" +msgstr "იმოძრავე კონტროლერის წინ ღერძის გასწვრივ" + + +msgid "Frame Based Speed" +msgstr "კადრზე დამოკიდებული სიჩქარე" + + +msgid "Apply fixed movement deltas every update" +msgstr "გამოიყენე ფიქსირებული მოძრაობის დელტები ყოველ განახლებაზე" + + +msgid "Speed Interpolation 0" +msgstr "სიჩქარის ინტერპოლაცია 0" + + +msgid "First cubic spline control point between min/max speeds" +msgstr "პირველი კუბური სფლაინის სამართავი წერტილი მინ./მაქს. სიჩქარეებს შორის" + + +msgid "Speed Interpolation 1" +msgstr "სიჩქარის ინტერპოლაცია 1" + + +msgid "Second cubic spline control point between min/max speeds" +msgstr "მეორე კუბური სფლაინის სამართავი წერტილი მინ./მაქს. სიჩქარეებს შორის" + + +msgid "Maximum Speed" +msgstr "მაქსიმალური სიჩქარე" + + +msgid "Minimum Speed" +msgstr "მინიმალური სიჩქარე" + + +msgctxt "Operator" +msgid "XR Navigation Grab" +msgstr "XR გზაკვლევის ბღაუჭი" + + +msgid "Navigate the VR scene by grabbing with controllers" +msgstr "გაიკვლიე გზა VR სცენაში კონტროლერებით ჩაბღაუჭების მეშვეობით" + + +msgid "Prevent changes to viewer location" +msgstr "თავიდან აიცილე დამთვალიერებლის ადგილმდებარეობის ცვლილებები" + + +msgid "Prevent changes to viewer rotation" +msgstr "თავიდან აიცილე დამთვალიერებლის ბრუნვის ცვლილებები" + + +msgid "Lock Up Orientation" +msgstr "დაბლოკე ზევით ორიენტაცია" + + +msgid "Prevent changes to viewer up orientation" +msgstr "თავიდან აიცილე დამთვალიერებლის ზევით ორიენტაციის ცვლილებები" + + +msgid "Prevent changes to viewer scale" +msgstr "თავიდან აიცილე დამთვალიერებლის მასშტაბირების ცვლილებები" + + +msgctxt "Operator" +msgid "XR Navigation Reset" +msgstr "XR გზაკვლევის პარამეტრების ჩამოყრა" + + +msgid "Reset location deltas" +msgstr "ჩამოყარე ადგილმდებარეობის დელტები" + + +msgid "Reset rotation deltas" +msgstr "ჩამოყარე ბრუნვის დელტები" + + +msgid "Reset scale deltas" +msgstr "ჩამოყარე მასშტაბის დელტები" + + +msgctxt "Operator" +msgid "XR Navigation Teleport" +msgstr "XR გზაკვლევა ტელეპორტირებით" + + +msgid "From Viewer" +msgstr "დამთვალიერებლიდან" + + +msgid "Interpolation factor between viewer and hit locations" +msgstr "დამთვალიერებლისა და დაცემის ადგილმდებარეობებს შორის ინტერპოლაციის კოეფიციენტი" + + +msgid "Offset along hit normal to subtract from final location" +msgstr "საბოლოო ადგილმდებარეობიდან გამოსაკლები აცდენა დაცემის ნორმალის გასწვრივ" + + +msgid "Selectable Only" +msgstr "მხოლოდ მონიშვნადი" + + +msgid "Teleport Axes" +msgstr "ტელეპორტირების ღერძები" + + +msgid "Enabled teleport axes in navigation space" +msgstr "ჩართე ტელეპორტირების ღერძები გზაკვლევის სივრცეში" + + +msgctxt "Operator" +msgid "Toggle VR Session" +msgstr "გადართე VR სესია" + + msgctxt "Operator" msgid "Add Workspace" msgstr "დაამატე სამუშაო სივრცე" @@ -62097,10 +67228,58 @@ msgid "Add a new workspace" msgstr "დაამატე ახალი სამუშაო სივრცე" +msgctxt "Operator" +msgid "Workspace Reorder to Back" +msgstr "გადაიტანე სამუშაო სივრცე უკან" + + +msgid "Reorder workspace to be last in the list" +msgstr "გადაიტანე სამუშაო სივრცე სიაში ბოლო ადგილზე" + + +msgctxt "Operator" +msgid "Workspace Reorder to Front" +msgstr "გადაიტანე სამუშაო სივრცე წინ" + + +msgid "Reorder workspace to be first in the list" +msgstr "გადაიტანე სამუშაო სივრცე სიაში პირველ ადგილზე" + + +msgctxt "Operator" +msgid "Pin Scene to Workspace" +msgstr "მიაბნიე სცენა სამუშაო სივრცეს" + + +msgid "Remember the last used scene for the current workspace and switch to it whenever this workspace is activated again" +msgstr "დაიმახსოვრე ბოლოს გამოყენებული სცენა მიმდინარე სამუშაო სივრცისთვის და გადადი მასზე, რამდენჯერაც ეს სამუშაო სივრცე კვლავ გააქტიურდება" + + +msgctxt "Operator" +msgid "New World" +msgstr "ახალი სამყარო" + + +msgid "Create a new world Data-Block" +msgstr "შექმენი ახალი სამყაროს მონაცემთა ბლოკი" + + +msgid "External file packed into the .blend file" +msgstr "გარე ფაილი ჩადებული .blend ფაილში" + + +msgid "Size of packed file in bytes" +msgstr "ალაგებული ფაილის ზომა ბაიტებში" + + msgid "Active Brush" msgstr "აქტიური ფუნჯი" +msgid "Editable cavity curve" +msgstr "ჩაზნექილობის რედაქტირებადი წირი" + + msgid "Active Palette" msgstr "აქტიური პალიტრა" @@ -62117,82 +67296,410 @@ msgid "Fast Navigate" msgstr "სწრაფი ნავიგაცია" +msgid "Tiling offset for the X Axis" +msgstr "მიჯრის აცდენა X ღერძისთვის" + + +msgid "Tile X" +msgstr "მიჯრა X-ზე" + + +msgid "Tile along X axis" +msgstr "მიჯრით გაამწკრივე X ღერძზე" + + +msgid "Tile Y" +msgstr "მიჯრა Y-ზე" + + +msgid "Tile along Y axis" +msgstr "მიჯრით გაამწკრივე Y ღერძზე" + + +msgid "Tile Z" +msgstr "მიჯრა Z" + + +msgid "Tile along Z axis" +msgstr "მიჯრით გაამწკრივე Z ღერძზე" + + +msgid "Paint Tool Slots" +msgstr "ხატვის ხელსაწყოს სლოტები" + + +msgid "Mask painting according to mesh geometry cavity" +msgstr "შენიღბე ხატვა მეშის გეომეტრიის ჩაზნექილობის მიხედვით" + + msgid "Delay Viewport Updates" msgstr "ასახე სარკმლის განახლებები" +msgid "Update the geometry when it enters the view, providing faster view navigation" +msgstr "განაახლე გეომეტრია, როცა ხედში შემოვა, რაც ხედში გზის გაკვლევას ააჩქარებს" + + +msgid "Symmetry Feathering" +msgstr "სიმეტრიის შემოცვეთა" + + +msgid "Symmetry X" +msgstr "სიმეტრია X-ზე" + + +msgid "Mirror brush across the X axis" +msgstr "სარკისებურად არეკლე ფუნჯი X ღერძზე" + + +msgid "Symmetry Y" +msgstr "სიმეტრია Y-ზე" + + +msgid "Mirror brush across the Y axis" +msgstr "სარკისებურად არეკლე ფუნჯი Y ღერძზე" + + +msgid "Symmetry Z" +msgstr "სიმეტრია Z-ზე" + + +msgid "Mirror brush across the Z axis" +msgstr "სარკისებურად არეკლე ფუნჯი Z ღერძზე" + + +msgid "Grease Pencil Paint" +msgstr "Grease Pencil-ის ხატვა" + + +msgid "Paint Mode" +msgstr "ხატვის რეჟიმი" + + +msgid "Paint using the active material base color" +msgstr "დახატე აქტიური მასალის საბაზისო ფერის გამოყენებით" + + +msgid "Paint the material with a color attribute" +msgstr "დახატე მასალა ფერითი ატრიბუტით" + + +msgid "Image Paint" +msgstr "გამოსახულების ხატვა" + + +msgid "Properties of image and texture painting mode" +msgstr "გამოსახულებისა და ტექსტურის ხატვის რეჟიმის თვისებები" + + +msgid "Canvas" +msgstr "ტილო" + + +msgid "Image used as canvas" +msgstr "ტილოდ გამოყენებული გამოსახულება" + + +msgid "Image used as clone source" +msgstr "კლონირების წყაროდ გამოყენებული გამოსახულება" + + msgid "Dither" msgstr "გაფანტული ხმაური" +msgid "Texture filtering type" +msgstr "ტექსტურის გაფილტრვის ტიპი" + + +msgid "Missing Materials" +msgstr "დაკარგული მასალები" + + +msgid "The mesh is missing materials" +msgstr "მეშს დაკარგული აქვს მასალები" + + +msgid "Missing Texture" +msgstr "დაკარგული ტექსტურა" + + +msgid "Image Painting does not have a texture to paint on" +msgstr "გამოსახულების ხატვას არ აქვს ტექსტურა, რომელზეც დახატავდა" + + +msgid "Missing UVs" +msgstr "დაკარგული UV-ები" + + +msgid "A UV layer is missing on the mesh" +msgstr "მეშს არ აქვს UV შრე" + + +msgid "Mode of operation for projection painting" +msgstr "ოპერაციის რეჟიმი პროექციის ხატვისთვის" + + +msgid "Detect image slots from the material" +msgstr "აღმოაჩინე გამოსახულების სლოტები მატერიალიდან" + + +msgid "Set image for texture painting directly" +msgstr "დააყენე გამოსახულება ტექსტურის პირდაპირ ხატვისთვის" + + msgid "Cull" msgstr "გამოხშირე" +msgid "Ignore faces pointing away from the view (faster)" +msgstr "დააიგნორირე წახნაგები, რომლებიც ხედის საპირისპირო მიმართულებით იყურება (უფრო სწრაფია)" + + +msgid "Use another UV map as clone source, otherwise use the 3D cursor as the source" +msgstr "კლონის წყაროდ გამოიყენე სხვა UV რუკა, სხვა შემთხვევაში წყაროდ გამოიყენე 3გ კურსორი" + + +msgid "Paint most on faces pointing towards the view" +msgstr "მეტწილად დახატე ხედისკენ მომართულ წახნაგებზე" + + +msgid "Area Normal Falloff" +msgstr "არეალის ნორმალის მილევა" + + +msgid "Extend the angular range with a falloff gradient" +msgstr "გააფართოვე კუთხოვანი დიაპაზონი მილევის გრადიენტით" + + +msgid "Area Normal Limit" +msgstr "არეალის ნორმალის ლიმიტი" + + +msgid "The range of angles that will be affected" +msgstr "იმ კუთხეთა დიაპაზონი, რომლებზეც მოხდება ზემოქმედება" + + +msgid "View Normal Falloff" +msgstr "ხედის ნორმალის მილევა" + + +msgid "View Normal Limit" +msgstr "ხედის ნორმალის ლიმიტი" + + +msgid "Detail Percentage" +msgstr "დეტალის პროცენტული მნიშვნელობა" + + +msgid "Maximum edge length for dynamic topology sculpting (in brush percenage)" +msgstr "წიბოს მაქსიმალური სიგრძე დინამიური ტოპოლოგიის ძერწვისთვის (ფუნჯის პროცენტებში)" + + msgid "Detail Refine Method" msgstr "დეტალების დახვეწის მეთოდი" +msgid "In dynamic-topology mode, how to add or remove mesh detail" +msgstr "დინამიური ტოპოლოგიის რეჟიმში როგორ დაემატოს, ან მოშორდეს მეშს დეტალი" + + msgid "Subdivide Edges" msgstr "დაყავი წიბოები" +msgid "Subdivide long edges to add mesh detail where needed" +msgstr "დაყავი გრძელი წიბოები, რათა დაამატო მეშს დეტალი, სადაც საჭიროა" + + msgid "Collapse Edges" msgstr "ჩამოშალე წიბოები" +msgid "Collapse short edges to remove mesh detail where possible" +msgstr "ჩაშალე მოკლე წიბოები, რათა მოაშორო მეშის დეტალი, სადაც შესაძლებელია" + + msgid "Subdivide Collapse" -msgstr "დაყავი და ჩამოშალე" +msgstr "დაყავი და ჩაშალე" + + +msgid "Both subdivide long edges and collapse short edges to refine mesh detail" +msgstr "გრძელი წიბოებიც დაყავი და მოკლე წიბოებიც ჩაშალე, რათა დახვეწო მეშის დეტალი" msgid "Detail Size" msgstr "დეტალების ზომა" +msgid "Maximum edge length for dynamic topology sculpting (in pixels)" +msgstr "წიბოს მაქსიმალური სიგრძე დინამიური ტოპოლოგიის ძერწვისთვის (პიქსელებში)" + + msgid "Detail Type Method" msgstr "დეტალის ტიპის მეთოდი" +msgid "In dynamic-topology mode, how mesh detail size is calculated" +msgstr "დინამიური ტოპოლოგიის რეჟიმში როგორ გამოითვლება მეშის დეტალის ზომა" + + msgid "Relative Detail" msgstr "შეფარდებითი დეტალი" +msgid "Mesh detail is relative to the brush size and detail size" +msgstr "მეშის დეტალი არის შეფარდებითი ფუნჯისა და დეტალის ზომებთან" + + msgid "Constant Detail" msgstr "მუდმივი დეტალი" +msgid "Mesh detail is constant in world space according to detail size" +msgstr "მეშის დეტალი მუდმივია სამყაროსეულ სივრცეში დეტალის ზომის მიხედვით" + + msgid "Brush Detail" msgstr "ფუნჯისმიერი დეტალი" +msgid "Mesh detail is relative to brush radius" +msgstr "მეშის დეტალი შეფარდებითია ფუნჯის რადიუსთან" + + msgid "Manual Detail" msgstr "მექანიკური დეტალი" +msgid "Mesh detail does not change on each stroke, only when using Flood Fill" +msgstr "მეშის დეტალი არ იცვლება ყოველ მოსმაზე, არამედ მხოლოდ ჩაღვრით შევსების გამოყენებისას" + + +msgid "Object whose Z axis defines orientation of gravity" +msgstr "ობიექტი, რომლის Z ღერძიც განსაზღვრავს მიზიდულობის ორიენტაციას" + + +msgid "Lock X" +msgstr "დაბლოკე X" + + +msgid "Disallow changes to the X axis of vertices" +msgstr "არ დაუშვა ცვლილებები წვეროთა X ღერძზე" + + +msgid "Lock Y" +msgstr "დაბლოკე Y" + + +msgid "Disallow changes to the Y axis of vertices" +msgstr "არ დაუშვა ცვლილებები წვეროთა Y ღერძზე" + + +msgid "Lock Z" +msgstr "დაბლოკე Z" + + +msgid "Disallow changes to the Z axis of vertices" +msgstr "არ დაუშვა ცვლილებები წვეროთა Z ღერძზე" + + +msgid "Radial Symmetry Count X Axis" +msgstr "რადიალური სიმეტრიის სათვალავი X ღერძზე" + + +msgid "Number of times to copy strokes across the surface" +msgstr "რამდენჯერ დაკოპირდეს მონასმები ზედაპირზე" + + +msgid "Source and destination for symmetrize operator" +msgstr "წყარო და დანიშნულების ადგილი გასიმეტრიულების ოპერატორისთვის" + + msgid "Transform Mode" msgstr "გარდაქმნის რეჟიმი" +msgid "How the transformation is going to be applied to the target" +msgstr "როგორ იქნება გარდაქმნა გამოყენებული სამიზნეზე" + + +msgid "Applies the transformation to all vertices in the mesh" +msgstr "იყენებს გარდაქმნას მეშში ყველა წვეროზე" + + +msgid "Applies the transformation simulating elasticity using the radius of the cursor" +msgstr "იყენებს გარდაქმნას ელასტიურობის სიმულირებისას კურსორის რადიუსის გამოყენებით" + + msgid "Use Deform Only" msgstr "გამოიყენე მხოლოდ დეფორმირება" +msgid "Use only deformation modifiers (temporary disable all constructive modifiers except multi-resolution)" +msgstr "გამოიყენე მხოლოდ დეფორმაციის მოდიფიკატორი (დროებით გათიშე აგების ყველა მოდიფიკატორი მრავალგარჩევადობის გარდა)" + + msgid "UV Sculpting" msgstr "UV-ის ძერწვა" -msgid "Refraction" -msgstr "გარდატეხა" +msgid "Properties of vertex and weight paint mode" +msgstr "წვეროებისა და წონის ხატვის რეჟიმის თვისებები" -msgid "Denoising" -msgstr "განხმაურება" +msgid "Properties of paint mode" +msgstr "ხატვის რეჟიმის თვისებები" + + +msgid "Image used as painting target" +msgstr "ხატვის სამიზნედ გამოყენებული გამოსახულება" + + +msgid "Source to select canvas from" +msgstr "წყარო, რომლიდანაც უნდა შეირჩეს ტილო" + + +msgid "Paint Tool Slot" +msgstr "ხატვის ხელსაწყოს სლოტი" + + +msgid "Palette Color" +msgstr "პალიტრის ფერი" + + +msgid "Palette Splines" +msgstr "პალიტრის სფლაინები" + + +msgid "Collection of palette colors" +msgstr "პალიტრის ფერების კოლექცია" + + +msgid "Active Palette Color" +msgstr "აქტიური პალიტრის ფერი" + + +msgid "Panel containing UI elements" +msgstr "პანელი, რომელიც UI-ს ელემენტებს შეიცავს" msgid "Light Groups" msgstr "სინათლეების ჯგუფები" +msgid "Integrator Presets" +msgstr "ინტეგრატორის წინასწარი წყობები" + + +msgid "Selectability & Visibility" +msgstr "მონიშვნადობა და ხილვადობა" + + +msgid "Physical light sources" +msgstr "ფიზიკური სინათლის წყარო" + + msgid "Film" msgstr "ფილმი" @@ -62201,6 +67708,18 @@ msgid "Passes" msgstr "გადავლები" +msgid "Chain Scaling" +msgstr "ჯაჭვის მასშტაბირება" + + +msgid "Fitting" +msgstr "მორგება" + + +msgid "Bone Constraints" +msgstr "ძვლის ბორკილები" + + msgid "Bendy Bones" msgstr "დრეკადი ძვლები" @@ -62213,14 +67732,67 @@ msgid "Custom Shape" msgstr "მორგებული ფორმა" +msgid "Camera Presets" +msgstr "კამერის წინასწარი წყობები" + + msgid "2D Cursor" msgstr "2გ კურსორი" +msgid "Footage" +msgstr "ვიდეოჩანაწერი" + + +msgid "Footage Settings" +msgstr "ვიდეოჩანაწერის პარამეტრები" + + +msgid "Marker Display" +msgstr "მარკერის ასახვა" + + +msgid "Mask Settings" +msgstr "ნიღბის პარამეტრები" + + +msgid "Mask Display" +msgstr "ნიღბის ასახვა" + + +msgid "Stabilization" +msgstr "სტაბილიზაცია" + + +msgid "2D Stabilization" +msgstr "2გ სტაბილიზაცია" + + msgid "Mask Tools" msgstr "შემნიღბავი ხელსაწყოები" +msgid "Transforms" +msgstr "გარდაქმნები" + + +msgid "Color Presets" +msgstr "ფერთა წინასწარი წყობები" + + +msgctxt "Camera" +msgid "Lens" +msgstr "ლინზა" + + +msgid "Cloth Presets" +msgstr "ქსოვილის წინასწარი წყობები" + + +msgid "Beam Shape" +msgstr "სვეტის ფორმა" + + msgid "Caustics" msgstr "კაუსტიკა" @@ -62289,6 +67861,26 @@ msgid "Render Pass" msgstr "რენდერის გადავლა" +msgid "Mist Pass" +msgstr "ნისლის გადავლა" + + +msgid "Custom Distance" +msgstr "მორგებული მანძილი" + + +msgid "Cascaded Shadow Map" +msgstr "კასკადური ჩრდილის რუკა" + + +msgid "Contact Shadows" +msgstr "კონტაქტის ჩრდილები" + + +msgid "Composition Guides" +msgstr "კომპოზიციის ნიშნულები" + + msgid "Stereoscopy" msgstr "სტერეოსკოპია" @@ -62301,18 +67893,42 @@ msgid "Geometry Data" msgstr "გეომეტრიული მონაცემები" +msgid "Start & End Mapping" +msgstr "დასაწყისისა და დასასრულის გადანაწილება" + + +msgid "Adjustments" +msgstr "რეგულირებები" + + msgid "Probe" msgstr "ზონდი" +msgid "Custom Parallax" +msgstr "მორგებული პარალაქსი" + + +msgid "Path Animation" +msgstr "ბილიკის ანიმაცია" + + msgid "Effects" msgstr "ეფექტები" +msgid "Text Boxes" +msgstr "ტექსტური ველები" + + msgid "OpenVDB File" msgstr "გახსენი OpenVDB ფაილი" +msgid "Create Pose Asset" +msgstr "შექმენი პოზის აქტივი" + + msgid "Filters" msgstr "ფილტრები" @@ -62350,6 +67966,10 @@ msgid "Filter Settings" msgstr "ფილტრის პარამეტრები" +msgid "Fluid Presets" +msgstr "დენადი ნივთიერების წინასწარი წყობები" + + msgid "Notes" msgstr "შენიშვნები" @@ -62358,6 +67978,30 @@ msgid "Optimize Animations" msgstr "დააოპტიმიზირე ანიმაციები" +msgid "Rest & Ranges" +msgstr "მოსვენება და დიაპაზონები" + + +msgid "Shape Keys Animation" +msgstr "ფორმის სოლების ანიმაცია" + + +msgid "Scene Graph" +msgstr "სცენის გრაფა" + + +msgid "Optimize Shape Keys" +msgstr "მოახდინე ფორმის სოლთა ოპტიმიზაცია" + + +msgid "Exporter Extensions" +msgstr "ექსპორტიორის გაფართოებები" + + +msgid "Importer Extensions" +msgstr "იმპორტიორის გაფართოებები" + + msgid "Active Tool" msgstr "აქტიური ხელსაწყო" @@ -62374,6 +68018,10 @@ msgid "UV Editing" msgstr "UV რედაქტირება" +msgid "Clone from Image/UV Map" +msgstr "დააკლონირე გამოსახულებიდან/UV რუკიდან" + + msgid "Color Picker" msgstr "ფერის ამომრჩევი" @@ -62387,6 +68035,10 @@ msgid "Sample" msgstr "ნიმუში" +msgid "Sample pixel values under the cursor" +msgstr "აიღე კურსორის ქვეშ მყოფი პიქსელების მნიშვნელობათა ნიმუში" + + msgctxt "Operator" msgid "Annotate" msgstr "ანოტაცია" @@ -62502,6 +68154,22 @@ msgid "Histogram" msgstr "ჰისტოგრამა" +msgid "Freestyle Line" +msgstr "თავისუფალი სტილის ხაზი" + + +msgid "Material settings" +msgstr "მასალის პარამეტრები" + + +msgid "Material Presets" +msgstr "მასალის წინასწარი წყობები" + + +msgid "Grease Pencil Material Slots" +msgstr "Grease Pencil-ის მასალის სლოტები" + + msgid "Backdrop" msgstr "ფონი" @@ -62514,6 +68182,10 @@ msgid "Slot" msgstr "სლოტი" +msgid "Predefined node color" +msgstr "კვანძის წინასწარ განსაზღვრული ფერი" + + msgid "Simulation State" msgstr "სიმულაციის მდგომარეობა" @@ -62526,6 +68198,22 @@ msgid "Scale by Face Size" msgstr "მასშტაბირება წახნაგის ზომის მიხედვით" +msgid "Object Scatter" +msgstr "ობიექტის გაფანტვა" + + +msgid "Boid Brain" +msgstr "ბოიდის ტვინი" + + +msgid "Clumping" +msgstr "მოგროვება" + + +msgid "Clump Noise" +msgstr "გროვის ხმაური" + + msgid "Kink" msgstr "დახვევა" @@ -62544,6 +68232,14 @@ msgid "Emission" msgstr "გამოცემა" +msgid "Field Weights" +msgstr "ველის წონები" + + +msgid "Force Field Settings" +msgstr "ძალის ველის პარამეტრები" + + msgid "Type 1" msgstr "ტიპი 1" @@ -62552,6 +68248,90 @@ msgid "Type 2" msgstr "ტიპი 2" +msgid "Hair Dynamics" +msgstr "თმის დინამიკა" + + +msgid "Collisions" +msgstr "შეჯახებები" + + +msgid "Hair Dynamics Presets" +msgstr "თმის დინამიკის წინასწარი წყობა" + + +msgid "Structure" +msgstr "სტრუქტურა" + + +msgid "Hair Shape" +msgstr "თმის ფორმა" + + +msgid "Battle" +msgstr "ბრძოლა" + + +msgid "Misc" +msgstr "სხვადასხვა" + + +msgid "Movement" +msgstr "მოძრაობა" + + +msgid "Deflection" +msgstr "ასხლეტა" + + +msgid "Fluid Interaction" +msgstr "დენადი ნივთიერების ურთიერთქმედება" + + +msgid "Springs" +msgstr "ზამბარები" + + +msgid "Forces" +msgstr "ძალები" + + +msgid "Internal Springs" +msgstr "შინაგანი ზამბარები" + + +msgid "Object Collisions" +msgstr "ობიექტის შეჯახებები" + + +msgid "Physical Properties" +msgstr "ფიზიკური თვისებები" + + +msgid "Property Weights" +msgstr "თვისების წონები" + + +msgid "Self Collisions" +msgstr "თვითშეჯახებები" + + +msgid "Softbody & Cloth" +msgstr "რბილი სხეული და ქსოვილი" + + +msgid "Diffusion" +msgstr "დიფუზია" + + +msgid "Falloff Ramp" +msgstr "მილევის გრადაცია" + + +msgid "Waves" +msgstr "ტალღები" + + msgid "Force Fields" msgstr "ძალოვანი ველები" @@ -62568,6 +68348,10 @@ msgid "Sensitivity" msgstr "მგრძნობიარობა" +msgid "Dynamics" +msgstr "დინამიკა" + + msgid "Deactivation" msgstr "დეაქტივაცია" @@ -62580,6 +68364,42 @@ msgid "Aerodynamics" msgstr "აეროდინამიკა" +msgid "Strengths" +msgstr "სიძლიერეები" + + +msgid "Diagnostics" +msgstr "დიაგნოსტიკა" + + +msgid "Helpers" +msgstr "დამხმარეები" + + +msgid "Viscosity" +msgstr "წებოვნება" + + +msgid "Show options for the properties editor" +msgstr "აჩვენე ვარიანტები თვისებათა რედაქტორისთვის" + + +msgid "Creates a panel in the View Layer context of the properties editor" +msgstr "ქმნის პანელს თვისებათა რედაქტორის ხედის შრის კონტექსტში" + + +msgid "Freestyle Line Style SVG Export" +msgstr "თავისუფალი სტილის ხაზის სტილის SVG-ის ექსპორტი" + + +msgid "Creates a Panel in the render context of the properties editor" +msgstr "ქმნის პანელს თვისებათა რედაქტორის რენდერის კონტექსტში" + + +msgid "Freestyle SVG Export" +msgstr "თავისუფალი სტილის SVG-ის ექსპორტი" + + msgid "Bloom" msgstr "ბრწყინვა" @@ -62588,6 +68408,18 @@ msgid "Indirect Lighting" msgstr "ირიბი განათება" +msgid "Denoising" +msgstr "განხმაურება" + + +msgid "Raytracing" +msgstr "სხივის მიდევნება" + + +msgid "Screen Tracing" +msgstr "ეკრანზე მიდევნება" + + msgid "Shadows" msgstr "ჩრდილები" @@ -62616,10 +68448,18 @@ msgid "Video" msgstr "ვიდეო" +msgid "FFmpeg Presets" +msgstr "FFmpeg წინასწარი წყობები" + + msgid "Format Presets" msgstr "ფორმატის შაბლონები" +msgid "Hydra Debug" +msgstr "Hydra-ს ხარვეზების აღმოფხვრა" + + msgid "Views" msgstr "ხედები" @@ -62648,6 +68488,35 @@ msgid "Cache Settings" msgstr "კეშის პარამეტრები" +msgid "Frame Overlay" +msgstr "კადრის გადაფარება" + + +msgid "Scene Strip Display" +msgstr "სცენის ლენტის ასახვა" + + +msgid "Preview Overlays" +msgstr "წინასწარი ხედის გადაფარებები" + + +msgid "Sequencer Overlays" +msgstr "სეკვენსერის გადაფარებები" + + +msgid "Strip Cache" +msgstr "ლენტის კეში" + + +msgctxt "Operator" +msgid "Blade" +msgstr "დანის პირი" + + +msgid "Feature Weights" +msgstr "თვისების წონები" + + msgid "Find & Replace" msgstr "იპოვე & ჩაანაცვლე" @@ -62660,6 +68529,10 @@ msgid "Rename Active Item" msgstr "აქტიური ელემენტის სახელის გადარქმევა" +msgid "Rename Marker" +msgstr "გადარქვი მარკერს სახელი" + + msgid "" "\n" " Popover panel for adding extra options that don't fit in the tool settings header\n" @@ -62674,10 +68547,18 @@ msgid "Extra Options" msgstr "დამატებითი ვარიანტები" +msgid "I18n Update Translation" +msgstr "I18n განაახლე თარგმანი" + + msgid "Timeline" msgstr "დროის ზოლი" +msgid "Copy on Duplicate" +msgstr "დააკოპირე დუბლირებისას" + + msgid "New Objects" msgstr "ახალი ობიექტები" @@ -62694,6 +68575,10 @@ msgid "Prototypes" msgstr "პროტოტიპები" +msgid "Extension Repositories" +msgstr "გაფართოების საცავები" + + msgid "Applications" msgstr "აპლიკაციები" @@ -62706,6 +68591,10 @@ msgid "Development" msgstr "დეველოპმენტი" +msgid "Script Directories" +msgstr "სკრიპტების საქაღალდეები" + + msgid "Tablet" msgstr "პლანშეტი" @@ -62747,6 +68636,10 @@ msgid "Walk" msgstr "სიარული" +msgid "Orbit & Pan" +msgstr "ორბიტირება და პანორამირება" + + msgid "3D Mouse Settings" msgstr "3გ თაგვის პარამეტრები" @@ -62755,6 +68648,10 @@ msgid "Save Preferences" msgstr "პარამეტრების შენახვა" +msgid "Auto Run Python Scripts" +msgstr "ავტომატურად გაუშვი Python-ის სკრიპტები" + + msgid "Blend Files" msgstr "Blend ფაილები" @@ -62772,7 +68669,11 @@ msgstr "ფიქსირებული მასალები" msgid "HDRIs" -msgstr "HDRIები" +msgstr "HDRI-ები" + + +msgid "Cycles Render Devices" +msgstr "Cycles-ის რენდერის მოწყობილობები" msgid "Memory & Limits" @@ -62783,6 +68684,10 @@ msgid "Operating System Settings" msgstr "ოპერაციული სისტემის პარამეტრები" +msgid "Text Editor Presets" +msgstr "ტექსტური რედაქტორის წინასწარი წყობები" + + msgid "Bone Color Sets" msgstr "ძვლების ფერთა ნაკრებები" @@ -62919,6 +68824,10 @@ msgid "Drawing Plane" msgstr "სახატავი სიბრტყე" +msgid "Multi Frame" +msgstr "მრავალკადრიანი" + + msgid "Stroke Placement" msgstr "მონასმის განთავსება" @@ -62959,6 +68868,10 @@ msgid "Analyze" msgstr "ანალიზი" +msgid "Quad View" +msgstr "ოთხმაგი ხედი" + + msgid "Auto-Masking" msgstr "ავტომატური შენიღბვა" @@ -63076,14 +68989,38 @@ msgid "Comb" msgstr "დავარცხნა" +msgid "Comb hairs" +msgstr "დავარცხნე თმა" + + +msgid "Smooth hairs" +msgstr "დააგლუვე თმა" + + +msgid "Add hairs" +msgstr "დაამატე თმა" + + msgctxt "Operator" msgid "Length" msgstr "სიგრძე" +msgid "Make hairs longer or shorter" +msgstr "დააგრძელე, ან დაამოკლე თმა" + + msgctxt "Operator" msgid "Puff" -msgstr "აფუება" +msgstr "ააფუე" + + +msgid "Make hairs stand up" +msgstr "თმა ყალყზე დააყენე" + + +msgid "Cut hairs" +msgstr "შეჭერი თმა" msgctxt "Operator" @@ -63091,6 +69028,10 @@ msgid "Weight" msgstr "წონა" +msgid "Weight hair particles" +msgstr "მიანიჭე თმის ნაწილაკებს წონა" + + msgctxt "Operator" msgid "Draw Sharp" msgstr "მკვეთრად დახატვა" @@ -63206,6 +69147,11 @@ msgid "Multires Displacement Smear" msgstr "მულტირეზ. გადაადგილების გადღაბნა" +msgctxt "Operator" +msgid "Paint" +msgstr "დახატე" + + msgctxt "Operator" msgid "Box Mask" msgstr "მართკუთხა შენიღბვა" @@ -63360,11 +69306,26 @@ msgid "Strength" msgstr "ძალა" +msgctxt "Operator" +msgid "Paint Selection" +msgstr "მოხატე მონიშნული" + + +msgctxt "Operator" +msgid "Density" +msgstr "სისქე" + + msgctxt "Operator" msgid "Grow / Shrink" msgstr "გაზარდე / შეკუმშე" +msgctxt "Operator" +msgid "Slide" +msgstr "გააცურე" + + msgid "Clone from Paint Slot" msgstr "დააკლონირე ნახატის სლოტიდან" @@ -63377,6 +69338,10 @@ msgid "Normal Falloff" msgstr "ნორმალის მინავლება" +msgid "Gap Closure" +msgstr "ნაპრალის ამოვსება" + + msgid "Post-Processing" msgstr "თანამდევი დამუშავება" @@ -63385,6 +69350,10 @@ msgid "Particle Tool" msgstr "ნაწილაკის ხელსაწყო" +msgid "Default tools for particle mode" +msgstr "ნაგულისხმები ხელსაწყოები ნაწილაკების რეჟიმისთვის" + + msgid "Cut Particles to Shape" msgstr "გამოჭერი ნაწილაკები ფორმაზე" @@ -63409,10 +69378,74 @@ msgid "VR" msgstr "ვრ" +msgid "Action Maps" +msgstr "ქმედებათა რუკები" + + +msgid "VR Session" +msgstr "VR სესია" + + +msgid "Edge Detection" +msgstr "წიბოს აღმოჩენა" + + +msgid "Edge Type" +msgstr "წიბოს ტიპი" + + +msgid "Face Marks" +msgstr "წახნაგის ნიშნები" + + +msgid "Freestyle Alpha" +msgstr "თავისუფალი სტილის ალფა" + + +msgid "Freestyle Color" +msgstr "თავისუფალი სტილის ფერი" + + +msgid "Freestyle Geometry" +msgstr "თავისუფალი სტილის გეომეტრია" + + +msgid "Freestyle Strokes" +msgstr "თავისუფალი სტილის მონასმები" + + +msgid "Splitting" +msgstr "გახლეჩა" + + +msgid "Split Pattern" +msgstr "გახლიჩე შაბლონი" + + +msgid "Freestyle Texture" +msgstr "თავისუფალი სტილის ტექსტურა" + + +msgid "Freestyle Thickness" +msgstr "თავისუფალი სტილის სისქე" + + msgid "Filter Add-ons" msgstr "გაფილტრე დანამატები" +msgid "Particle in a particle system" +msgstr "ნაწილაკი ნაწილაკთა სისტემაში" + + +msgid "Alive State" +msgstr "ცოცხალი მდგომარეობა" + + +msgid "Dying" +msgstr "კვდომა" + + msgid "Birth Time" msgstr "დაბადების დრო" @@ -63421,70 +69454,854 @@ msgid "Die Time" msgstr "სიკვდილის დრო" +msgid "Exists" +msgstr "არსებობს" + + +msgid "Particle Location" +msgstr "ნაწილაკის ადგილმდებარეობა" + + +msgid "Keyed States" +msgstr "ჩასოლილი მდგომარეობები" + + +msgid "Previous Particle Location" +msgstr "ნაწილაკის უწინდელი ადგილმდებარეობა" + + +msgid "Previous Rotation" +msgstr "უწინდელი ბრუნვა" + + +msgid "Previous Particle Velocity" +msgstr "ნაწილაკის უწინდელი სისწრაფე" + + msgid "Particle Brush" msgstr "ნაწილაკების ფუნჯი" +msgid "Particle editing brush" +msgstr "ნაწილაკის რედაქტირების ფუნჯი" + + +msgid "Particle count" +msgstr "ნაწილაკების რიცხვი" + + msgid "Length Mode" msgstr "სიგრძის რეჟიმი" +msgid "Make hairs longer" +msgstr "დააგრძელე თმა" + + +msgid "Make hairs shorter" +msgstr "დაამოკლე თმა" + + msgid "Puff Mode" msgstr "აფუების რეჟიმი" +msgid "Make hairs more puffy" +msgstr "გახადე თმა უფრო ფუმფულა" + + msgid "Sub" msgstr "მოაკელი" +msgid "Make hairs less puffy" +msgstr "გახადე თმა ნაკლებად ფუმფულა" + + +msgid "Brush steps" +msgstr "ფუნჯის ნაბიჯები" + + +msgid "Brush strength" +msgstr "ფუნჯის სიძლიერე" + + msgid "Puff Volume" msgstr "აფუების მოცულობა" +msgid "Apply puff to unselected end-points (helps maintain hair volume when puffing root)" +msgstr "გამოიყენე აფუება მოუნიშნავ ბოლოებზე (ეხმარება თმის მოცულობის შენარჩუნებას ძირის აფუებისას)" + + +msgid "Particle Instance Object Weight" +msgstr "ნაწილაკის ინსტანციის ობიექტის წონა" + + +msgid "Weight of a particle instance object in a collection" +msgstr "კოლექციაში ნაწილაკის ინსტანციის ობიექტის წონა" + + +msgid "The number of times this object is repeated with respect to other objects" +msgstr "რამდენჯერ მეორდება ეს ობიექტი სხვა ობიექტებთან მიმართებაში" + + +msgid "Particle instance object name" +msgstr "ნაწილაკის ინსტანციის ობიექტის სახელი" + + +msgid "Properties of particle editing mode" +msgstr "ნაწილაკის რედაქტირების რეჟიმის თვისებები" + + msgid "Keys" msgstr "გასაღებები" +msgid "How many keys to make new particles with" +msgstr "რამდენი სოლით შეიქმნას ახალი ნაწილაკები" + + +msgid "How many steps to display the path with" +msgstr "რამდენი საფეხურით აისახოს ბილიკი" + + +msgid "Emitter Distance" +msgstr "გამომცემის მანძილი" + + +msgid "Distance to keep particles away from the emitter" +msgstr "რა დაშორებაზე დარჩეს ნაწილაკები გამომცემისგან" + + +msgid "How many frames to fade" +msgstr "რამდენ კადრში გაქრეს" + + +msgid "Editable" +msgstr "რედაქტირებადი" + + +msgid "A valid edit mode exists" +msgstr "ვარგისი რედაქტირების რეჟიმი არსებობს" + + +msgid "Editing hair" +msgstr "თმის რედაქტირება" + + +msgid "The edited object" +msgstr "რედაქტირებაში მყოფი ობიექტი" + + +msgid "Selection Mode" +msgstr "მონიშვნის რეჟიმი" + + +msgid "Particle select and display mode" +msgstr "ნაწილაკის მონიშვნისა და ასახვის რეჟიმი" + + +msgid "Path edit mode" +msgstr "ბილიკის რედაქტირების რეჟიმი" + + +msgid "Point select mode" +msgstr "წერტილის მონიშვნის რეჟიმი" + + +msgid "Tip" +msgstr "წვეტი" + + +msgid "Tip select mode" +msgstr "წვეტის მონიშვნის რეჟიმი" + + msgid "Shape Object" msgstr "ფორმის ობიექტი" +msgid "Outer shape to use for tools" +msgstr "ხელსაწყოებისთვის გამოსაყენებელი გარეგანი ფორმა" + + +msgid "Display Particles" +msgstr "ასახე ნაწილაკები" + + +msgid "Display actual particles" +msgstr "ასახე ნამდვილი ნაწილაკები" + + msgid "Auto Velocity" msgstr "ავტომატური სისწრაფე" +msgid "Calculate point velocities automatically" +msgstr "ავტომატურად გამოთვალე წერტილთა სისწრაფეები" + + +msgid "Interpolate new particles from the existing ones" +msgstr "ახალი ნაწილაკების ინტერპოლაცია არსებულებისგან" + + msgid "Deflect Emitter" msgstr "გამომცემის ასხლეტა" +msgid "Keep paths from intersecting the emitter" +msgstr "შეაკავე ბილიკების გადაკვეთა გამომცემთან" + + msgid "Fade Time" msgstr "გაქრობის დრო" +msgid "Fade paths and keys further away from current frame" +msgstr "გააქრე ბილიკები და სოლები მიმდინარე კადრიდან მოშორებით" + + msgid "Keep Lengths" msgstr "შეინარჩუნე სიგრძეები" +msgid "Keep path lengths constant" +msgstr "დატოვე ბილიკების სიგრძე მუდმივი" + + msgid "Keep Root" msgstr "შეინარჩუნე ძირები" +msgid "Keep root keys unmodified" +msgstr "დატოვე ძირების სოლები დაუმოდიფიცირებელი" + + +msgid "Particle Hair Key" +msgstr "ნაწილაკების თმის სოლი" + + +msgid "Particle key for hair particle system" +msgstr "ნაწილაკის სოლი თმის ნაწილაკთა სისტემისთვის" + + +msgid "Location (Object Space)" +msgstr "ადგილმდებარეობა (ობიექტის სივრცე)" + + +msgid "Location of the hair key in object space" +msgstr "თმის სოლის ადგილმდებარეობა ობიექტის სივრცეში" + + +msgid "Location of the hair key in its local coordinate system, relative to the emitting face" +msgstr "თმის სოლის ადგილმდებარეობა თავის ლოკალურ კოორდინატთა სისტემაში, გამომცემ წახნაგთან მიმართებაში" + + +msgid "Weight for cloth simulation" +msgstr "წონა ქსოვილის სიმულაციისთვის" + + +msgid "Particle Key" +msgstr "ნაწილაკის სოლი" + + +msgid "Key location" +msgstr "სოლის ადგილმდებარეობა" + + +msgid "Key rotation quaternion" +msgstr "სოლის ბრუნვა კვატერნიონი" + + +msgid "Key velocity" +msgstr "სოლის სისწრაფე" + + +msgid "Particle system in an object" +msgstr "ნაწილაკთა სისტემა ობიექტში" + + +msgid "Active Particle Target" +msgstr "აქტიური ნაწილაკის სამიზნე" + + +msgid "Active Particle Target Index" +msgstr "აქტიური ნაწილაკის სამიზნის ინდექსი" + + msgid "Child Particles" msgstr "შვილი ნაწილაკები" +msgid "Child particles generated by the particle system" +msgstr "ნაწილაკთა სისტემის მიერ წარმოქმნილი შვილი ნაწილაკები" + + +msgid "Cloth dynamics for hair" +msgstr "ქსოვილის დინამიკა თმისთვის" + + +msgid "Multiple Caches" +msgstr "მრავალი კეში" + + +msgid "Particle system can be edited in particle mode" +msgstr "ნაწილაკთა სისტემა შეიძლება, რედაქტირდეს ნაწილაკის რეჟიმში" + + +msgid "Edited" +msgstr "რედაქტირებული" + + +msgid "Particle system has been edited in particle mode" +msgstr "ნაწილაკთა სისტემა დარედაქტირდა ნაწილაკის რეჟიმში" + + +msgid "Global Hair" +msgstr "გლობალური თმა" + + +msgid "Hair keys are in global coordinate space" +msgstr "თმის სოლები გლობალური კოორდინატების სივრცეშია" + + +msgid "Particle system name" +msgstr "ნაწილაკთა სისტემის სახელი" + + +msgid "Use this object's coordinate system instead of global coordinate system" +msgstr "გამოიყენე ამ ობიექტის კოორდინატების სისტემა გლობალური კოორდინატების სისტემის მაგივრად" + + +msgid "Particles generated by the particle system" +msgstr "ნაწილაკები წარმოქმნილი ნაწილაკების სისტემის მიერ" + + +msgid "Reactor Target Object" +msgstr "რეაქტორის სამიზნე ობიექტი" + + +msgid "For reactor systems, the object that has the target particle system (empty if same object)" +msgstr "რეაქტორი სისტემებისთვის, ობიექტი, რომელსაც აქვს ნაწილაკთა სამიზნე სისტემა (ცარიელი, თუ იგივე ობიექტია)" + + +msgid "Reactor Target Particle System" +msgstr "რეაქტორის ნაწილაკთა სამიზნე სისტემა" + + +msgid "For reactor systems, index of particle system on the target object" +msgstr "რეაქტორი სისტემებისთვის, ინდექსი ნაწილაკთა სისტემისა სამიზნე ობიექტზე" + + +msgid "Particle system settings" +msgstr "ნაწილაკთა სისტემის პარამეტრები" + + +msgid "Target particle systems" +msgstr "ნაწილაკთა სამიზნე სისტემა" + + +msgid "Enable hair dynamics using cloth simulation" +msgstr "ჩართე თმის დინამიკა ქსოვილის სიმულაციის გამოყენებით" + + +msgid "Keyed Timing" +msgstr "დროის ჩასოლილი განაწილება" + + +msgid "Vertex Group Clump" +msgstr "წვეროთა ჯგუფი შეგროვებისთვის" + + +msgid "Vertex group to control clump" +msgstr "წვეროთა ჯგუფი შეგროვების საკონტროლებლად" + + +msgid "Vertex Group Density" +msgstr "წვეროთა ჯგუფი სიმკვრივისთვის" + + +msgid "Vertex group to control density" +msgstr "წვეროთა ჯგუფი სიმკვრივის საკონტროლებლად" + + +msgid "Vertex Group Field" +msgstr "წვეროთა ჯგუფი ველისთვის" + + +msgid "Vertex group to control field" +msgstr "წვეროთა ჯგუფი ველის საკონტროლებლად" + + +msgid "Vertex Group Length" +msgstr "წვეროთა ჯგუფი სიგრძისთვის" + + +msgid "Vertex group to control length" +msgstr "წვეროთა ჯგუფი სიგრძის საკონტროლებლად" + + +msgid "Vertex Group Rotation" +msgstr "წვეროთა ჯგუფი ბრუნვისთვის" + + +msgid "Vertex group to control rotation" +msgstr "წვეროთა ჯგუფი ბრუნვის საკონტროლებლად" + + +msgid "Vertex Group Roughness 1" +msgstr "წვეროთა ჯგუფი სიხეშეშისთვის 1" + + +msgid "Vertex group to control roughness 1" +msgstr "წვეროთა ჯგუფი სიხეშეშის საკონტროლებლად 1" + + +msgid "Vertex Group Roughness 2" +msgstr "წვეროთა ჯგუფი სიხეშეშისთვის 2" + + +msgid "Vertex group to control roughness 2" +msgstr "წვეროთა ჯგუფი სიხეშეშის საკონტროლებლად 2" + + +msgid "Vertex Group Size" +msgstr "წვეროთა ჯგუფი ზომისთვის" + + +msgid "Vertex group to control size" +msgstr "წვეროთა ჯგუფი ზომის საკონტროლებლად" + + +msgid "Vertex Group Tangent" +msgstr "წვეროთა ჯგუფი მხებისთვის" + + +msgid "Vertex group to control tangent" +msgstr "წვეროთა ჯგუფი მხების საკონტროლებლად" + + +msgid "Vertex Group Twist" +msgstr "წვეროთა ჯგუფი მოგრეხვისთვის" + + +msgid "Vertex group to control twist" +msgstr "წვეროთა ჯგუფი მოგრეხვის საკონტროლებლად" + + +msgid "Vertex Group Velocity" +msgstr "წვეროთა ჯგუფი სისწრაფისთვის" + + +msgid "Vertex group to control velocity" +msgstr "წვეროთა ჯგუფი სისწრაფის საკონტროლებლად" + + +msgid "Collection of particle systems" +msgstr "ნაწილაკთა სისტემების კოლექცია" + + +msgid "Active Particle System" +msgstr "ნაწილაკთა აქტიური სისტემა" + + +msgid "Active particle system being displayed" +msgstr "ამჟამად ასახული ნაწილაკთა აქტიური სისტემა" + + +msgid "Active Particle System Index" +msgstr "ნაწილაკთა აქტიური სისტემის ინდექსი" + + +msgid "Index of active particle system slot" +msgstr "ნაწილაკთა აქტიური სისტემის სლოტის ინდექსი" + + +msgid "Particle Target" +msgstr "ნაწილაკოვანი სამიზნე" + + +msgid "Target particle system" +msgstr "ნაწილაკთა სამიზნე სისტემა" + + +msgid "Friend" +msgstr "მეგობარი" + + +msgid "Neutral" +msgstr "ნეიტრალური" + + +msgid "Enemy" +msgstr "მტერი" + + +msgid "Particle target name" +msgstr "ნაწილაკოვანი სამიზნის სახელი" + + +msgid "The object that has the target particle system (empty if same object)" +msgstr "ობიექტი, რომელსაც აქვს სამიზნე ნაწილაკოვანი სისტემა (თუ იგივე ობიექტია - ცარიელი)" + + +msgid "Target Particle System" +msgstr "სამიზნე ნაწილაკოვანი სისტემა" + + +msgid "The index of particle system on the target object" +msgstr "ნაწილაკოვანი სისტემის ინდექსი სამიზნე ობიექტზე" + + +msgid "Path Compare" +msgstr "შეადარე ბილიკი" + + +msgid "Match paths against this value" +msgstr "შეადარე ბილიკები ამ მნიშვნელობას" + + +msgid "Paths Compare" +msgstr "შეადარე ბილიკები" + + +msgid "Collection of paths" +msgstr "ბილიკების კოლექცია" + + +msgid "Point in a point cloud" +msgstr "წერტილი წერტილოვან ღრუბელში" + + +msgid "Active Point Cache" +msgstr "აქტიური წერტილების კეში" + + +msgid "Active point cache for physics simulations" +msgstr "აქტიური წერტილების კეში ფიზიკის სიმულაციებისთვის" + + +msgid "Cache Compression" +msgstr "კეშის კომპრესია" + + +msgid "No compression" +msgstr "კომპრესიის გარეშე" + + +msgid "Lite" +msgstr "მსუბუქი" + + +msgid "Fast but not so effective compression" +msgstr "სწრაფი, მაგრამ არც ისე ეფექტური კომპრესია" + + msgid "Heavy" msgstr "მძიმე" +msgid "Cache file path" +msgstr "კეშის ფაილის მისამართი" + + +msgid "Frame on which the simulation stops" +msgstr "კადრი, რომელზეც ჩერდება სიმულაცია" + + +msgid "Frame on which the simulation starts" +msgstr "კადრი, რომელზეც სიმულაცია იწყება" + + +msgid "Cache Step" +msgstr "კეშის საფეხური" + + +msgid "Number of frames between cached frames" +msgstr "კადრების რაოდენობა კეშირებულ კადრებს შორის" + + +msgid "Cache Index" +msgstr "კეშის ინდექსი" + + +msgid "Index number of cache files" +msgstr "კეშის ფაილების ინდექს ნომერი" + + +msgid "Cache Info" +msgstr "კეშის ინფო" + + +msgid "Info on current cache status" +msgstr "ინფორმაცია კეშის ამჟამინდელი სტატუსზე" + + +msgid "The cache is baked" +msgstr "კეში გამომცხვარია" + + +msgid "The cache is being baked" +msgstr "კეში ცხვება" + + +msgid "Some frames were skipped while baking/saving that cache" +msgstr "ზოგი კადრი გამოტოვებული იქნა იმ კეშის ცხობის/შენახვის დროს" + + +msgid "Cache Is Outdated" +msgstr "კეში ვადაგასულია" + + +msgid "Cache name" +msgstr "კეშის სახელი" + + +msgid "Point Cache List" +msgstr "წერტილების კეშის სია" + + +msgid "Disk Cache" +msgstr "კეში დისკზე" + + +msgid "Save cache files to disk (.blend file must be saved first)" +msgstr "შეინახე კეშის ფაილები დისკზე (.blend ფაილი პირველი უნდა შეინახოს)" + + +msgid "Read cache from an external location" +msgstr "წაიკითხე კეში გარე ლოკაციიდან" + + +msgid "Library Path" +msgstr "ბიბლიოთეკის მისამართი" + + +msgid "Use this file's path for the disk cache when library linked into another file (for local bakes per scene file, disable this option)" +msgstr "გამოიყენე ამ ფაილის მისამართი დისკის კეშისთვის, როცა ბიბლიოთეკა სხვა ფაილთანაა დაკავშირებული (ყოველ სცენის ფაილზე ლოკალური ცხობისთვის გათიშე ეს ვარიანტი)" + + +msgid "Point cache for physics simulations" +msgstr "წერტილების კეში ფიზიკის სიმულაციებისთვის" + + +msgid "Point Caches" +msgstr "წერტილების კეში" + + +msgid "Collection of point caches" +msgstr "წერტილების კეშების კოლექციები" + + +msgid "A collection of pose channels, including settings for animating bones" +msgstr "პოზების არხების კოლექცია, მათ შორის პარამეტრები ძვლების ანიმაციისთვის" + + +msgid "Pose Bones" +msgstr "პოზის ძვლები" + + +msgid "Individual pose bones for the armature" +msgstr "პოზის ინდივიდუალური ძვლები არმატურისთვის" + + +msgid "IK Param" +msgstr "ი. კ. პარამეტრები" + + msgid "Auto IK" msgstr "ავტომატური ი. კ." +msgid "Add temporary IK constraints while grabbing bones in Pose Mode" +msgstr "დაამატე დროებითი ი. კ. ბორკილები პოზის რეჟიმში ძვლებზე ჩაბღაუჭებისას" + + msgid "Relative Mirror" msgstr "შეფარდებითი სარკისებური ეფექტი" +msgid "Apply relative transformations in X-mirror mode (not supported with Auto IK)" +msgstr "გამოიყენე ფარდობითი გარდაქმნები X-სარკის რეჟიმში (ავტომატურ ი.კ.-სთან მხარდაჭერა არ აქვს)" + + +msgid "Channel defining pose data for a bone in a Pose" +msgstr "არხის განმსაზღვრელი პოზის მონაცემები ძვლისთვის პოზაში" + + +msgid "Bone associated with this PoseBone" +msgstr "ამ პოზის ძვალთან ასოცირებული ძვალი" + + +msgid "Child of this pose bone" +msgstr "ამ პოზის ძვლის შვილი" + + +msgid "Constraints that act on this pose channel" +msgstr "ამ პოზის არხზე მოქმედი ბორკილები" + + +msgid "Custom Object" +msgstr "მორგებული ობიექტი" + + +msgid "Object that defines custom display shape for this bone" +msgstr "ობიექტი, რომელიც განსაზღვრავს მორგებულ ასახვის ფორმას ამ ძვლისთვის" + + +msgid "Custom Shape Rotation" +msgstr "მორგებული ფორმის ბრუნვა" + + +msgid "Adjust the rotation of the custom shape" +msgstr "დაარეგულირე მორგებული ფორმის ბრუნვა" + + +msgid "Custom Shape Scale" +msgstr "მორგებული ფორმის მასშტაბი" + + +msgid "Adjust the size of the custom shape" +msgstr "დაარეგულირე მორგებული ფორმის ზომა" + + +msgid "Custom Shape Transform" +msgstr "მორგებული ფორმის გარდაქმნა" + + +msgid "Bone that defines the display transform of this custom shape" +msgstr "ძვალი, რომელიც განსაზღვრავს ამ მორგებული ფორმის ასახვის გარდაქმნას" + + +msgid "Custom Shape Translation" +msgstr "მორგებული ფორმის გადაადგილება" + + +msgid "Adjust the location of the custom shape" +msgstr "დაარეგულირე მორგებული ფორმის ადგილმდებარეობა" + + +msgid "Pose Head Position" +msgstr "პოზის თავის პოზიცია" + + +msgid "Location of head of the channel's bone" +msgstr "არხის ძვლის თავის ადგილმდებარეობა" + + +msgid "Weight of scale constraint for IK" +msgstr "მასშტაბის ბორკილის წონა ი. კ.-სთვის" + + +msgid "IK X Maximum" +msgstr "ი. კ. X-ის მაქსიმუმი" + + +msgid "Maximum angles for IK Limit" +msgstr "მაქსიმალური კუთხეები ი. კ.-ის შეზღუდვისთვის" + + +msgid "IK Y Maximum" +msgstr "ი. კ. Y-ის მაქსიმუმი" + + +msgid "IK Z Maximum" +msgstr "ი. კ. Z-ის მაქსიმუმი" + + +msgid "IK X Minimum" +msgstr "ი. კ. X-ის მინიმუმი" + + +msgid "Minimum angles for IK Limit" +msgstr "მინიმალური კუთხეები ი. კ.-ის შეზღუდვისთვის" + + +msgid "IK Y Minimum" +msgstr "ი. კ. Y-ის მინიმუმი" + + +msgid "IK Z Minimum" +msgstr "ი. კ. Z-ის მინიმუმი" + + +msgid "IK Rotation Weight" +msgstr "ი. კ. ბრუნვის წონა" + + +msgid "Weight of rotation constraint for IK" +msgstr "ბრუნვის ბორკილის წონა ი. კ.-ისთვის" + + +msgid "IK X Stiffness" +msgstr "ი. კ. X-ის გახევება" + + +msgid "IK stiffness around the X axis" +msgstr "ი. კ. გახევება ღერძის X გარშემო" + + +msgid "IK Y Stiffness" +msgstr "ი. კ. Y-ის გახევება" + + +msgid "IK stiffness around the Y axis" +msgstr "ი. კ. გახევება Y ღერძის გარშემო" + + +msgid "IK Z Stiffness" +msgstr "ი. კ. Z-ის გახევება" + + +msgid "IK stiffness around the Z axis" +msgstr "ი. კ. გახევება Z ღერძის გარშემო" + + +msgid "IK Stretch" +msgstr "ი. კ. გაწელვა" + + +msgid "Allow scaling of the bone for IK" +msgstr "დაუშვი ძვლის მასშტაბირება ი. კ.-სთვის" + + +msgid "Has IK" +msgstr "აქვს ი. კ." + + +msgid "Is part of an IK chain" +msgstr "არის ი. კ. ჯაჭვის ნაწილი" + + +msgid "IK X Lock" +msgstr "ი. კ. X-ის დაბლოკვა" + + +msgid "Disallow movement around the X axis" +msgstr "აკრძალე მოძრაობა X ღერძის გარშემო" + + +msgid "IK Y Lock" +msgstr "ი. კ. Y-ის დაბლოკვა" + + +msgid "Disallow movement around the Y axis" +msgstr "აკრძალე მოძრაობა Y ღერძის გარშემო" + + +msgid "IK Z Lock" +msgstr "ი. კ. Z-ის დაბლოკვა" + + +msgid "Disallow movement around the Z axis" +msgstr "აკრძალე მოძრაობა Z ღერძის გარშემო" + + +msgid "Pose Matrix" +msgstr "პოზის მატრიცა" + + msgid "Global preferences" msgstr "გლობალური პარამეტრები" @@ -64395,10 +71212,6 @@ msgid "Crop to Render Region" msgstr "მოჭერი სარენდერო არეალზე" -msgid "File Extensions" -msgstr "ფაილის გაფართოებები" - - msgid "Use Freestyle" msgstr "გამოიყენე თავისუფალი სტილი" @@ -64583,10 +71396,6 @@ msgid "Overscan Size" msgstr "გადასკანირების ზომა" -msgid "Unified" -msgstr "გაერთიანებული" - - msgid "Tracing Method" msgstr "მიდევნების მეთოდი" @@ -69187,6 +75996,10 @@ msgid "Light Clamping" msgstr "სინათლის აღკვეთა" +msgid "Refraction" +msgstr "გარდატეხა" + + msgid "Cascade Size" msgstr "კასკადის ზომა" @@ -71650,16 +78463,6 @@ msgid "Extract Face Set" msgstr "ამოიღე წახნაგთა ნაკრები" -msgctxt "Operator" -msgid "Invert Visible Face Sets" -msgstr "მოახდინე ხილული წახნაგების ნაკრების ინვერსია" - - -msgctxt "Operator" -msgid "Show All Face Sets" -msgstr "მაჩვენე ყველა წახნაგთა ნაკრები" - - msgctxt "Operator" msgid "Randomize Colors" msgstr "გააშემთხვევითე ფერები" diff --git a/locale/po/km.po b/locale/po/km.po index 236605b4c54..d213086191d 100644 --- a/locale/po/km.po +++ b/locale/po/km.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/locale/po/ko.po b/locale/po/ko.po index c88a52c9c0f..ad5474cacc4 100644 --- a/locale/po/ko.po +++ b/locale/po/ko.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2023-11-14 19:14+0000\n" "Last-Translator: Lee YeonJoo \n" "Language-Team: Korean \n" @@ -10409,6 +10409,18 @@ msgid "Whether this path is saved in bookmarks, or generated from OS" msgstr "이 경로는 북마크에서 저장되는지 여부, 또는 OS로부터 생성되는지" +msgid "File Extensions" +msgstr "파일 확장자" + + +msgid "Operator" +msgstr "작업자" + + +msgid "Label" +msgstr "레이블" + + msgid "Icon ID" msgstr "아이콘 ID" @@ -18748,10 +18760,6 @@ msgid "Node tree consisting of linked nodes used for shading, textures and compo msgstr "셰이딩, 텍스처 및 컴포지팅에 사용되는 연결된 노드로 구성된 노드 트리" -msgid "Label" -msgstr "레이블" - - msgid "The node tree label" msgstr "노드 트리 레이블" @@ -44013,10 +44021,6 @@ msgid "Reverse Colors" msgstr "컬러를 반전" -msgid "Flip direction of vertex colors inside faces" -msgstr "페이스 내부의 버텍스 컬러의 방향을 뒤집기" - - msgctxt "Operator" msgid "Rotate Colors" msgstr "컬러를 회전" @@ -52940,10 +52944,6 @@ msgid "Number of times that the filter is going to be applied" msgstr "필터가 적용되는 횟수" -msgid "Operator" -msgstr "작업자" - - msgid "Applies a filter to modify the current mesh" msgstr "현재 메쉬를 수정하기 위해 필터를 적용합니다" @@ -58923,14 +58923,6 @@ msgid "Panel containing UI elements" msgstr "UI 요소가 포함된 패널" -msgid "Refraction" -msgstr "굴절" - - -msgid "Denoising" -msgstr "노이즈 제거" - - msgid "Integrator Presets" msgstr "적분기 프리셋" @@ -59637,6 +59629,10 @@ msgid "Indirect Lighting" msgstr "간접 라이트닝" +msgid "Denoising" +msgstr "노이즈 제거" + + msgid "Shadows" msgstr "섀도우" @@ -65015,10 +65011,6 @@ msgid "Crop the rendered frame to the defined render region size" msgstr "렌더링된 프레임을 정의된 렌더링 영역 크기로 자릅니다" -msgid "File Extensions" -msgstr "파일 확장자" - - msgid "Add the file format extensions to the rendered file name (eg: filename + .jpg)" msgstr "렌더된 파일 이름에 파일 형식 확장자를 추가 (예: 파일 이름 + .JPG)" @@ -73150,8 +73142,8 @@ msgid "Display vertex-per-face normals as lines" msgstr "라인으로 페이스 당 버텍스 노멀을 표시" -msgid "Stat Vis" -msgstr "스탯 비스" +msgid "Mesh Analysis" +msgstr "메쉬 분석" msgid "Display statistical information about the mesh" @@ -76077,6 +76069,10 @@ msgid "Light Clamping" msgstr "라이트 클램핑" +msgid "Refraction" +msgstr "굴절" + + msgid "Cascade Size" msgstr "캐스케이드 크기" @@ -78716,10 +78712,6 @@ msgid "Vertex Group Weights" msgstr "버텍스 그룹 웨이트" -msgid "Mesh Analysis" -msgstr "메쉬 분석" - - msgid "Face Angle" msgstr "페이스 각도" @@ -79504,10 +79496,6 @@ msgid "Int" msgstr "정수" -msgid "PreviewCol" -msgstr "PreviewCol" - - msgid "TexturedCol" msgstr "택스처화 Col" @@ -79532,10 +79520,6 @@ msgid "OS Loop" msgstr "OS 루프" -msgid "PreviewLoopCol" -msgstr "PreviewLoopCol" - - msgid "Source or destination meshes do not have any vertices, cannot transfer vertex data" msgstr "소스 또는 대상 메쉬는 어떠한 버택스도 없음, 버택스 데이터를 전송할 수 없습니다" @@ -83904,6 +83888,10 @@ msgid "File '%s' could not be loaded" msgstr "파일 '%s'을 불러올 수 없습니다" +msgid "Please select all related strips" +msgstr "관련 스트립을 모두 선택하십시오" + + msgid "Cannot apply effects to audio sequence strips" msgstr "오디오 시퀀스 스트립에 이펙트를 적용 할 수 없습니다" @@ -83928,10 +83916,6 @@ msgid "No valid inputs to swap" msgstr "교환하는 유효한 입력이 없음" -msgid "Please select all related strips" -msgstr "관련 스트립을 모두 선택하십시오" - - msgid "Please select two strips" msgstr "두 스트립을 선택하십시오" diff --git a/locale/po/ky.po b/locale/po/ky.po index 2ed6707c01f..41a3fbe7fac 100644 --- a/locale/po/ky.po +++ b/locale/po/ky.po @@ -1,10 +1,10 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "(b'0000000000000000000000000000000000000000')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2013-11-05 13:47+0600\n" "Last-Translator: Chyngyz Dzhumaliev \n" "Language-Team: Kirghiz \n" @@ -787,6 +787,10 @@ msgid "Save" msgstr "Сактоо" +msgid "Operator" +msgstr "Оператор" + + msgid "End" msgstr "Соңу" @@ -2405,10 +2409,6 @@ msgid "Editing" msgstr "Оңдоо" -msgid "Operator" -msgstr "Оператор" - - msgctxt "Operator" msgid "Sculpt Mode" msgstr "Скульптинг режими" diff --git a/locale/po/ne.po b/locale/po/ne.po index 3adf4ec3551..ed1ebda639e 100644 --- a/locale/po/ne.po +++ b/locale/po/ne.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: \n" "Last-Translator: Yudhir Khanal \n" "Language-Team: Yudhir\n" @@ -145,6 +145,10 @@ msgid "High Quality" msgstr "उच्च कोटी " +msgid "Operator" +msgstr "संचालक " + + msgid "End" msgstr "अन्त्य " @@ -435,10 +439,6 @@ msgid "ID name of the menu this was called from" msgstr "सुचीको परिचय नाम जसबाट यो कार्य चलेको थियो " -msgid "Operator" -msgstr "संचालक " - - msgctxt "Operator" msgid "Deinterlace Movies" msgstr "चलचित्रहरु De-interlace " diff --git a/locale/po/nl.po b/locale/po/nl.po index 5f3955681fc..69b094fee1c 100644 --- a/locale/po/nl.po +++ b/locale/po/nl.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2023-10-08 06:34+0000\n" "Last-Translator: Wannes Malfait \n" "Language-Team: Dutch \n" diff --git a/locale/po/pl.po b/locale/po/pl.po index bc9c769d767..37575f25f59 100644 --- a/locale/po/pl.po +++ b/locale/po/pl.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2017-08-26 11:13+0200\n" "Last-Translator: Mikołaj Juda \n" "Language: pl\n" @@ -6684,10 +6684,6 @@ msgid "Col" msgstr "Kol" -msgid "PreviewCol" -msgstr "KolorPodglądu" - - msgid "TexturedCol" msgstr "TeksturowanyKolor" @@ -6712,10 +6708,6 @@ msgid "OS Loop" msgstr "OS Loop" -msgid "PreviewLoopCol" -msgstr "PreviewLoopCol" - - msgid "Not enough free memory" msgstr "Za mało wolnej pamięci" @@ -9578,6 +9570,10 @@ msgid "File '%s' could not be loaded" msgstr "Plik '%s' nie mógł być załadowany" +msgid "Please select all related strips" +msgstr "Proszę zaznaczyć wszystkie powiązane paski" + + msgid "Cannot apply effects to audio sequence strips" msgstr "Nie można zaaplikować efektów na dźwiękowe paski sekwencji" @@ -9602,10 +9598,6 @@ msgid "No valid inputs to swap" msgstr "Brak prawidłowych wejść do zamiany" -msgid "Please select all related strips" -msgstr "Proszę zaznaczyć wszystkie powiązane paski" - - msgid "Please select two strips" msgstr "Proszę zaznaczyć dwa paski" diff --git a/locale/po/pt.po b/locale/po/pt.po index 96a448b3e9d..78c623c4769 100644 --- a/locale/po/pt.po +++ b/locale/po/pt.po @@ -1,10 +1,10 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: Ivan Paulos Tomé \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" -"PO-Revision-Date: 2023-11-30 20:00+0000\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" +"PO-Revision-Date: 2023-12-10 14:41+0000\n" "Last-Translator: Duarte Ramos \n" "Language-Team: Portuguese \n" "Language: pt\n" @@ -9659,22 +9659,122 @@ msgid "The factor to apply to the original point's opacity for the new points" msgstr "O factor a aplicar à opacidade original do ponto para novos pontos" +msgid "The factor to apply to the original point's radius for the new points" +msgstr "O factor a aplicar o raio do ponto original para os novos pontos" + + +msgid "Enable cyclic on individual stroke dashes" +msgstr "Activar cíclico em linhas individuais do traço" + + msgid "Dependency Graph" msgstr "Gráfico de dependências" +msgid "IDs" +msgstr "IDs" + + +msgid "All evaluated data-blocks" +msgstr "Todos os data-blocks avaliados" + + +msgid "Evaluation mode" +msgstr "Modo de avaliação" + + msgid "Viewport" msgstr "Porta de visão" +msgid "Viewport non-rendered mode" +msgstr "Modo não renderizado da Janela de Visualização" + + msgid "Render" msgstr "Renderizar" +msgid "Object Instances" +msgstr "Instâncias de objeto" + + +msgid "All object instances to display or render (Warning: Only use this as an iterator, never as a sequence, and do not keep any references to its items)" +msgstr "Todas as instâncias de objectos a visualizar ou renderizar (Aviso: Usar apenas como iterador, nunca como sequência, e não manter referências aos seus itens)" + + +msgid "Evaluated objects in the dependency graph" +msgstr "Objectos avaliados no grafo de dependências" + + msgid "Scene" msgstr "Cena" +msgid "Original scene dependency graph is built for" +msgstr "Cena original para a qual o grafo de dependências foi construido" + + +msgid "Scene at its evaluated state" +msgstr "Cena no seu estado avaliado" + + +msgid "Updates" +msgstr "Atualizações" + + +msgid "Updates to data-blocks" +msgstr "Actualizações dos data-blocks" + + +msgid "View Layer" +msgstr "Camada de Visualização" + + +msgid "Original view layer dependency graph is built for" +msgstr "Camada de visualização original para a qual o grafo de dependências foi construido" + + +msgid "View layer at its evaluated state" +msgstr "Camada de visualização no seu estado avaliado" + + +msgid "Dependency Graph Object Instance" +msgstr "Instância de objecto do Grafo de Dependências" + + +msgid "Extended information about dependency graph object iterator (Warning: All data here is 'evaluated' one, not original .blend IDs)" +msgstr "Informação expandida sobre o iterador de objects do grafo de Dependências (Aviso: Toda a informação aqui é a avaliada, não os IDs .blend originais)" + + +msgid "Instance Object" +msgstr "Objecto Instância" + + +msgid "Evaluated object which is being instanced by this iterator" +msgstr "Objecto avaliado que está a ser instanciado por este iterador" + + +msgid "Is Instance" +msgstr "É Instância" + + +msgid "Denotes if the object is generated by another object" +msgstr "Denota se o object está a ser gerado por outro objecto" + + +msgid "Generated Matrix" +msgstr "Matriz gerada" + + +msgid "Generated transform matrix in world space" +msgstr "Matrix de transformação gerada em coordenadas do mundo" + + +msgid "Evaluated object the iterator points to" +msgstr "Objecto avaliado para o qual o iterador aponta" + + msgid "Generated Coordinates" msgstr "Coordenadas geradas" @@ -9683,10 +9783,18 @@ msgid "Generated coordinates in parent object space" msgstr "Coordenadas geradas no espaço do objeto parente." +msgid "If the object is an instance, the parent object that generated it" +msgstr "Se o objecto é uma instância, o objecto pai que a gerou" + + msgid "Particle System" msgstr "Sistema de partículas" +msgid "Evaluated particle system that this object was instanced from" +msgstr "Sistema de partículas avaliado do qual este objecto foi instanciado" + + msgid "Persistent ID" msgstr "Identificador persistente" @@ -9695,6 +9803,30 @@ msgid "Persistent identifier for inter-frame matching of objects with motion blu msgstr "Identificador persistente para combinação de inter-fotogramas para objetos com desfoque de movimento." +msgid "Instance Random ID" +msgstr "ID Aleatório da Instância" + + +msgid "Random id for this instance, typically for randomized shading" +msgstr "Identificação aleatória para esta instância, geralmente para sombreamento aleatório" + + +msgid "Show Particles" +msgstr "Mostrar partículas" + + +msgid "Particles part of the object should be visible in the render" +msgstr "Partículas parte do objecto devem ser visíveis no render" + + +msgid "Show Self" +msgstr "Mostrar-se" + + +msgid "The object geometry itself should be visible in the render" +msgstr "A geometria do próprio objecto deve ser visível no render" + + msgid "UV Coordinates" msgstr "Coordenadas UV" @@ -9703,26 +9835,54 @@ msgid "UV coordinates in parent object space" msgstr "Coordenadas UV dentro do espaço do objeto parente." +msgid "Dependency Graph Update" +msgstr "Actualizar Grafo de dependências" + + +msgid "Information about ID that was updated" +msgstr "Informação sobre o ID que foi actualizado" + + msgid "ID" msgstr "Identificador" +msgid "Updated data-block" +msgstr "Data-block actualizado" + + msgid "Geometry" msgstr "Geometria" +msgid "Object geometry is updated" +msgstr "A geometria do objecto está actualizada" + + msgid "Shading" msgstr "Sombreamento" +msgid "Object shading is updated" +msgstr "O sombreamento do objecto está actualizado" + + msgid "Transform" msgstr "Transformações" +msgid "Object transformation is updated" +msgstr "A transformação do objecto está actualizada" + + msgid "Safe Areas" msgstr "Áreas de segurança" +msgid "Safe areas used in 3D view and the sequencer" +msgstr "Áreas de segurança usadas na janela de visualização 3D e no editor de sequências de vídeo" + + msgid "Action Safe Margins" msgstr "Margens de segurança para ações" @@ -9759,6 +9919,14 @@ msgid "Settings for filtering the channels shown in animation editors" msgstr "Definições para a filtragem de canais mostrados dentro dos editores de animação." +msgid "Filtering Collection" +msgstr "Collecção Filtro" + + +msgid "Collection that included object should be a member of" +msgstr "Colecção da qual o objecto incluído deve ser membro" + + msgid "F-Curve Name Filter" msgstr "Filtrar curvas-f por nome" @@ -9783,6 +9951,14 @@ msgid "Include visualization of armature related animation data" msgstr "Inclui a visualização dos dados de animação relacionados a armações de ossos." +msgid "Display Cache Files" +msgstr "Mostrar Ficheiros de Cache" + + +msgid "Include visualization of cache file related animation data" +msgstr "Incluir visualização de informação de animação com relacionada com ficheiros de armazenamento" + + msgid "Display Camera" msgstr "Mostrar câmaras" @@ -9799,6 +9975,10 @@ msgid "Include visualization of curve related animation data" msgstr "Inclui a visualização dos dados de animação relacionados a curvas." +msgid "Show Data-Block Filters" +msgstr "Mostrar filtros de Data-Blocks" + + msgid "Show options for whether channels related to certain types of data are included" msgstr "Mostra as opções para definir a inclusão ou exclusão de canais relacionados a certos tipos de dados." @@ -9819,6 +9999,14 @@ msgid "Include visualization of Grease Pencil related animation data and frames" msgstr "Inclui a visualização dos dados e fotogramas de animação relacionados ao lápis de cera." +msgid "Display Hair" +msgstr "Mostrar Cabelos" + + +msgid "Include visualization of hair related animation data" +msgstr "Incluir visualização de informação de animação com relacionada com cabelos" + + msgid "Show Hidden" msgstr "Mostrar ocultos" @@ -9835,6 +10023,14 @@ msgid "Include visualization of lattice related animation data" msgstr "Inclui a visualização dos dados de animação relacionados a treliças." +msgid "Display Light" +msgstr "Mostrar Luzes" + + +msgid "Include visualization of light related animation data" +msgstr "Incluir visualização de informação de animação com relacionada com luzes" + + msgid "Display Line Style" msgstr "Mostrar estilos de linha" @@ -9883,6 +10079,14 @@ msgid "Include visualization of animation data related to data-blocks linked to msgstr "Inclui a visualização de dados de animação relacionados a blocos de dados vinculados a modificadores." +msgid "Display Movie Clips" +msgstr "Mostrar Clipe de Vídeo" + + +msgid "Include visualization of movie clip related animation data" +msgstr "Incluir visualização de informação de animação com relacionada com clipes de video" + + msgid "Display Node" msgstr "Mostrar nós" @@ -9891,10 +10095,18 @@ msgid "Include visualization of node related animation data" msgstr "Inclui a visualização dos dados de animação relacionados aos nós." +msgid "Only Show Errors" +msgstr "Mostrar Apenas Erros" + + msgid "Only include F-Curves and drivers that are disabled or have errors" msgstr "Inclui somente as curvas-f e controladores que estão desativados ou possuem erros." +msgid "Only Show Selected" +msgstr "Mostrar apenas Seleccionados" + + msgid "Only include channels relating to selected objects and data" msgstr "Inclui somente os canais que são relacionados aos dados e objetos selecionados." @@ -9907,6 +10119,14 @@ msgid "Include visualization of particle related animation data" msgstr "Inclui a visualização dos dados de animação relacionados as partículas." +msgid "Display Point Cloud" +msgstr "Mostrar Nuvens de Pontos" + + +msgid "Include visualization of point cloud related animation data" +msgstr "Incluir visualização de informação de animação com relacionada com nuvens de pontos" + + msgid "Display Scene" msgstr "Mostrar cena" @@ -9915,6 +10135,10 @@ msgid "Include visualization of scene related animation data" msgstr "Inclui a visualização dos dados de animação relacionados a cena." +msgid "Display Shape Keys" +msgstr "Mostrar as ShapeKeys" + + msgid "Include visualization of shape key related animation data" msgstr "Inclui a visualização dos dados de animação relacionados a chaves de formato." @@ -9951,6 +10175,14 @@ msgid "Include visualization of object-level animation data (mostly transforms)" msgstr "Inclui a visualização dos dados de animação relacionados a nível-objeto (em maioria transformações)." +msgid "Display Volume" +msgstr "Mostrar Volume" + + +msgid "Include visualization of volume related animation data" +msgstr "Incluir visualização de informação de animação com relacionada com volumes" + + msgid "Display World" msgstr "Mostrar mundo" @@ -9979,10 +10211,20 @@ msgid "Invert" msgstr "Inverter" +msgid "Invert filter search" +msgstr "Inverter filtro de pesquisa" + + msgid "Multi-Word Fuzzy Filter" msgstr "Filtro múltiplo para palavras difusas " +msgid "" +"Perform fuzzy/multi-word matching.\n" +"Warning: May be slow" +msgstr "Fazer correspondência difusa ou de múltiplas palavras. Aviso: Pode ser lento" + + msgid "Driver for the value of a setting based on an external value" msgstr "Controlador para o valor de uma definição tendo como base um valor externo." @@ -9995,6 +10237,14 @@ msgid "Expression to use for Scripted Expression" msgstr "Expressão para ser usada por uma expressão escrita em um script" +msgid "Simple Expression" +msgstr "Expressão simples" + + +msgid "The scripted expression can be evaluated without using the full Python interpreter" +msgstr "A expressão de script pode ser avaliada sem usar o interpretador Python completo" + + msgid "Invalid" msgstr "Inválido" @@ -10059,6 +10309,30 @@ msgid "Name of PoseBone to use as target" msgstr "Nome do osso de pose para usar como alvo." +msgid "Context Property" +msgstr "Contexto da Propriedade" + + +msgid "Type of a context-dependent data-block to access property from" +msgstr "Tipo de data-block dependente de contexto a partir do qual aceder à propriedade" + + +msgid "Active Scene" +msgstr "Cena Activa" + + +msgid "Currently evaluating scene" +msgstr "Cena actualmente avaliada" + + +msgid "Active View Layer" +msgstr "Camada de Visualização Activa" + + +msgid "Currently evaluating view layer" +msgstr "Camada de visualização actualmente avaliada" + + msgid "Data Path" msgstr "Caminho dos dados" @@ -10084,6 +10358,10 @@ msgid "Rotation Mode" msgstr "Modo de rotação" +msgid "Mode for calculating rotation channel values" +msgstr "Modo para calcular valores de canais de rotação" + + msgid "Transform Space" msgstr "Espaço de transformação" @@ -10108,6 +10386,14 @@ msgid "Driver variable type" msgstr "Tipo de variável de controlador." +msgid "W Rotation" +msgstr "Rotação W" + + +msgid "Average Scale" +msgstr "Escala Média" + + msgid "Driver Variable" msgstr "Variável de controlador" @@ -10136,6 +10422,10 @@ msgid "Single Property" msgstr "Propriedade única" +msgid "Use the value from some RNA property" +msgstr "Usa o valor de uma propriedade RNA" + + msgid "Final transformation value of object or bone" msgstr "Valor de transformação final para objeto ou osso." @@ -10152,6 +10442,10 @@ msgid "Distance between two bones or objects" msgstr "Distância entre dois ossos ou objetos." +msgid "Use the value from some RNA property within the current evaluation context" +msgstr "Usa o valor de uma propriedade RNA dentro do actual contexto de avaliação" + + msgid "Brush Settings" msgstr "Definições de pincel" @@ -10236,10 +10530,30 @@ msgid "The particle system to paint with" msgstr "O sistema de partículas com o qual pintar." +msgctxt "Brush" +msgid "Falloff" +msgstr "Decaimento" + + msgid "Proximity falloff type" msgstr "Tipo de decaimento por proximidade." +msgctxt "Brush" +msgid "Smooth" +msgstr "Suave" + + +msgctxt "Brush" +msgid "Constant" +msgstr "Constante" + + +msgctxt "Brush" +msgid "Color Ramp" +msgstr "Gradiente de Cor" + + msgid "Ray Direction" msgstr "Direção do raio" @@ -10392,6 +10706,31 @@ msgid "Multiplier for wave influence of this brush" msgstr "Multiplicador para a influência de onda deste pincel." +msgctxt "Simulation" +msgid "Wave Type" +msgstr "Tipo de Onda" + + +msgctxt "Simulation" +msgid "Depth Change" +msgstr "Alteração de Profundidade" + + +msgctxt "Simulation" +msgid "Obstacle" +msgstr "Obstáculo" + + +msgctxt "Simulation" +msgid "Force" +msgstr "Força" + + +msgctxt "Simulation" +msgid "Reflect Only" +msgstr "Apenas Reflectir" + + msgid "Canvas Settings" msgstr "Definições de lona" @@ -10416,6 +10755,14 @@ msgid "A canvas surface layer" msgstr "Uma camada de superfície de lona." +msgid "Brush Collection" +msgstr "Colecção de Pincel" + + +msgid "Only use brush objects from this collection" +msgstr "Usar apenas objectos de pincel desta colecção" + + msgid "Influence Scale" msgstr "Escala de influência" @@ -10468,6 +10815,10 @@ msgid "Displacement" msgstr "Deslocamento" +msgid "Dissolve Time" +msgstr "Tempo de Dissolução" + + msgid "Approximately in how many frames should dissolve happen" msgstr "Aproximadamente em quantos fotogramas a dissolução ocorre." @@ -10488,6 +10839,10 @@ msgid "How much surface velocity affects dripping" msgstr "Define quanto a velocidade da superfície afetará o gotejamento." +msgid "Dry Time" +msgstr "Tempo de Secagem" + + msgid "Approximately in how many frames should drying happen" msgstr "Aproximadamente em quantos fotogramas a secagem deverá ocorrer." @@ -10528,6 +10883,10 @@ msgid "File Format" msgstr "Formato de ficheiro" +msgid "PNG" +msgstr "PNG" + + msgid "OpenEXR" msgstr "OpenEXR" @@ -10640,6 +10999,10 @@ msgid "Anti-Aliasing" msgstr "Antisserrilhamento" +msgid "Use 5× multisampling to smooth paint edges" +msgstr "Usa multi-amostragem 5× para suavizar limites de pintura" + + msgid "Enable to make surface changes disappear over time" msgstr "Ative para fazer com que as alterações de superfície desapareçam com o tempo." @@ -10688,6 +11051,10 @@ msgid "Save this output layer" msgstr "Guarda esta camada de saída." +msgid "Premultiply Alpha" +msgstr "Pré-Multiplicar Alfa" + + msgid "Multiply color by alpha (recommended for Blender input)" msgstr "Multiplica a cor pelo alfa (recomendado para a entrada Blender)." @@ -10776,6 +11143,10 @@ msgid "Active Point Cache Index" msgstr "Índice do cache de pontos ativo" +msgid "EQCurveMappingData" +msgstr "EQCurveMappingData" + + msgid "Curve Mapping" msgstr "Mapeamento de curva" @@ -10784,6 +11155,10 @@ msgid "Edit Bone" msgstr "Edição de osso" +msgid "Edit mode bone in an armature data-block" +msgstr "O osso em modo de edição num data-block de armação" + + msgid "Location of head end of the bone" msgstr "Localização do final da cabeça do osso." @@ -10792,10 +11167,22 @@ msgid "Bone is not visible when in Edit Mode" msgstr "O osso não é visível durante o modo de edição." +msgid "Length of the bone. Changing moves the tail end" +msgstr "Comprimento do Osso. Alterar move a ponta da cauda" + + msgid "Bone is not able to be transformed when in Edit Mode" msgstr "O osso não é passível de ser transformado quando em modo de edição." +msgid "Edit Bone Matrix" +msgstr "Matriz de Edição de Osso" + + +msgid "Matrix combining location and rotation of the bone (head position, direction and roll), in armature space (does not include/support bone's length/size)" +msgstr "A matriz combinando a localização e rotação do osso (posição da cabeça, direção e rolagem), no espaço da armação (não inclui ou suporta o tamanho ou comprimento do osso)" + + msgid "Parent edit bone (in same Armature)" msgstr "Osso de edição de parente (na mesma armação)." @@ -10852,6 +11239,14 @@ msgid "Charge effector weight" msgstr "Peso de influência do efetor carga." +msgid "Effector Collection" +msgstr "Colecção de Efector" + + +msgid "Limit effectors to this collection" +msgstr "Limita os efectores a esta collecção" + + msgid "Curve Guide" msgstr "Curva guia" @@ -10904,6 +11299,14 @@ msgid "Magnetic effector weight" msgstr "Peso de influência do efetor magnético." +msgid "Fluid Flow" +msgstr "Fluxo do Fluído" + + +msgid "Fluid Flow effector weight" +msgstr "Peso do efector de fluxo de fluido" + + msgid "Texture effector weight" msgstr "Peso de influência do efetor textura." @@ -10976,6 +11379,26 @@ msgid "Index to the specific property affected by F-Curve if applicable" msgstr "Índice para a propriedade especifica afetada pela curva-f caso aplicável." +msgid "Auto Handle Smoothing" +msgstr "Suavização Automática de Manípulos" + + +msgid "Algorithm used to compute automatic handles" +msgstr "Algoritmo usado para computar manípulos automáticos" + + +msgid "Automatic handles only take immediately adjacent keys into account" +msgstr "Manípulos automáticos apenas têm em conta chaves imediatamente adjacentes" + + +msgid "Continuous Acceleration" +msgstr "Aceleração Contínua" + + +msgid "Automatic handles are adjusted to avoid jumps in acceleration, resulting in smoother curves. However, key changes may affect interpolation over a larger stretch of the curve" +msgstr "Manípulos automáticos são ajustados para evitar saltos na aceleração, resultando em curvas mais suaves. No entanto alterações chave podem afectar a interpolação numa extensão maior da curva" + + msgid "Color of the F-Curve in the Graph Editor" msgstr "Cor da curva-f dentro do editor gráfico" @@ -11056,6 +11479,10 @@ msgid "F-Curve and its keyframes are hidden in the Graph Editor graphs" msgstr "A curva-f e seus fotogramas chave são ocultados dentro dos gráficos do editor gráfico." +msgid "True if the curve contributes no animation due to lack of keyframes or useful modifiers, and should be deleted" +msgstr "Verdadeiro se a curva não contribui nenhuma animação por falta de fotogramas-chave, ou modificadores úteis, e deve ser apagada" + + msgid "False when F-Curve could not be evaluated in past, so should be skipped when evaluating" msgstr "Falso quando a curva-f não pôde ser avaliada no passado, portanto será desprezada nas procedências das avaliações." @@ -11084,6 +11511,10 @@ msgid "Muted" msgstr "Mudo" +msgid "Disable F-Curve evaluation" +msgstr "Desactivar avaliação da Curva-F" + + msgid "Sampled Points" msgstr "Pontos de amostra" @@ -11200,6 +11631,42 @@ msgid "FFmpeg audio codec to use" msgstr "Codificador de áudio FFmpeg para usar." +msgid "No Audio" +msgstr "Sem Áudio" + + +msgid "Disables audio output, for video-only renders" +msgstr "desactivar saída de audio, para renders apenas de vídeo" + + +msgid "AAC" +msgstr "AAC" + + +msgid "AC3" +msgstr "AC3" + + +msgid "FLAC" +msgstr "FLAC" + + +msgid "MP2" +msgstr "MP2" + + +msgid "MP3" +msgstr "MP3" + + +msgid "Opus" +msgstr "Opus" + + +msgid "PCM" +msgstr "PCM" + + msgid "Vorbis" msgstr "Vorbis" @@ -11208,6 +11675,10 @@ msgid "Sample Rate" msgstr "Taxa de amostragem" +msgid "Audio sample rate (samples/s)" +msgstr "Taxa de amostras de áudio (amostras/s)" + + msgctxt "Sound" msgid "Volume" msgstr "Volume" @@ -11225,10 +11696,30 @@ msgid "Rate control: buffer size (kb)" msgstr "O controlo da taxa de amostragem através do tamanho do contingenciador (em kilobytes)." +msgid "Video Codec" +msgstr "Codec Vídeo" + + +msgid "FFmpeg codec to use for video output" +msgstr "Codec FFmpeg usado para saída de vídeo" + + +msgid "No Video" +msgstr "Sem Vídeo" + + +msgid "Disables video output, for audio-only renders" +msgstr "Desactiva a saída de vídeo, para renders apenas de audio" + + msgid "DNxHD" msgstr "Formato Avid DNxHD" +msgid "DV" +msgstr "DV" + + msgid "FFmpeg video codec #1" msgstr "Codificador de vídeo FFmpeg #1" @@ -11253,6 +11744,10 @@ msgid "MPEG-2" msgstr "MPEG-2" +msgid "MPEG-4 (divx)" +msgstr "MPEG-4 (divx)" + + msgid "QT rle / QT Animation" msgstr "Animação Quicktime / RLE" @@ -11261,26 +11756,90 @@ msgid "Theora" msgstr "Formato Ogg Theora" +msgid "WebM / VP9" +msgstr "WebM / VP9" + + +msgid "AV1" +msgstr "AV1" + + +msgid "Output Quality" +msgstr "Qualidade de Saída" + + msgid "Constant Rate Factor (CRF); tradeoff between video quality and file size" msgstr "Taxa de constância de erro (CRF), como um equilíbrio entre a qualidade do vídeo e o tamanho do ficheiro exportado." +msgid "Constant Bitrate" +msgstr "Taxa de Bits Constante" + + +msgid "Configure constant bit rate, rather than constant output quality" +msgstr "Configurar taxa de bits constante, em vez de qualidade de saída constante" + + msgid "Lossless" msgstr "Sem perdas" +msgid "Perceptually Lossless" +msgstr "Sem Perdas Perceptíveis" + + msgid "High Quality" msgstr "Alta qualidade" +msgid "Medium Quality" +msgstr "Qualidade Média" + + +msgid "Low Quality" +msgstr "Qualidade Baixa" + + +msgid "Very Low Quality" +msgstr "Qualidade Muito Baixa" + + +msgid "Lowest Quality" +msgstr "Qualidade Mais Baixa" + + +msgid "Encoding Speed" +msgstr "Velocidade de Codificação" + + msgid "Tradeoff between encoding speed and compression ratio" msgstr "Equilíbrio entre a velocidade de codificação e a taxa de compressão." +msgid "Slowest" +msgstr "Mais Lenta" + + +msgid "Recommended if you have lots of time and want the best compression efficiency" +msgstr "Recomendado se dispõe de muito tempo e pretende a melhor eficiência de compressão" + + +msgid "Good" +msgstr "Bom" + + +msgid "The default and recommended for most applications" +msgstr "A pré definição e recomendada para a maioria das aplicações" + + msgid "Realtime" msgstr "Tempo real" +msgid "Recommended for fast encoding" +msgstr "Recomendada para codificação rápida" + + msgid "Container" msgstr "Contêiner" @@ -11293,6 +11852,14 @@ msgid "MPEG-4" msgstr "MPEG-4" +msgid "AVI" +msgstr "AVI" + + +msgid "QuickTime" +msgstr "QuickTime" + + msgid "Ogg" msgstr "Ogg" @@ -11305,10 +11872,22 @@ msgid "Flash" msgstr "Flash" +msgid "WebM" +msgstr "WebM" + + +msgid "Keyframe Interval" +msgstr "Intervalo de Fotogramas Chave" + + msgid "Distance between key frames, also known as GOP size; influences file size and seekability" msgstr "A distância entre os fotogramas chave, também conhecida como tamanho de grupo de figuras (GOP), influenciando o tamanho do ficheiro e seus espaçamentos de pontos de pesquisa." +msgid "Max B-Frames" +msgstr "Máximo de Fotogramas-B" + + msgid "Maximum number of B-frames between non-B-frames; influences file size and seekability" msgstr "O número máximo de fotogramas-b entre os fotogramas não-b, influenciando o tamanho do ficheiro e seus espaçamentos de pontos de pesquisa." @@ -11317,14 +11896,26 @@ msgid "Max Rate" msgstr "Taxa máxima" +msgid "Rate control: max rate (kbit/s)" +msgstr "Controlo de taxa: taxa máxima (kbit/s)" + + msgid "Min Rate" msgstr "Taxa mínima" +msgid "Rate control: min rate (kbit/s)" +msgstr "Controlo de taxa: taxa mínima (kbit/s)" + + msgid "Mux Rate" msgstr "Taxa de multiplexação" +msgid "Mux rate (bits/second)" +msgstr "Taxa de multiplexação (bits/segundo)" + + msgid "Mux Packet Size" msgstr "Tamanho do pacote multiplexado" @@ -11349,10 +11940,18 @@ msgid "Use lossless output for video streams" msgstr "Usa um formato de saída de fluxo de vídeo sem perdas." +msgid "Use Max B-Frames" +msgstr "Usa o máximo de Fotogramas-B" + + msgid "Set a maximum number of B-frames" msgstr "Permite definir um número máximo de fotogramas-b. " +msgid "Video bitrate (kbit/s)" +msgstr "Taxa de bits de vídeo (kbit/s)" + + msgid "F-Modifier" msgstr "Modificador-f" @@ -11361,6 +11960,10 @@ msgid "Modifier for values of F-Curve" msgstr "Modificador para os valores de curva-f" +msgid "F-Curve modifier will show settings in the editor" +msgstr "O modificador de Curva-F vai mostrar definições no editor" + + msgid "Blend In" msgstr "Misturar de Entrada" @@ -11397,34 +12000,95 @@ msgid "F-Curve Modifier has invalid settings and will not be evaluated" msgstr "O modificador de curva-f possui definições inválidas e não será avaliado." +msgid "Enable F-Curve modifier evaluation" +msgstr "Activar avaliação do modificadore de Curvas-F" + + +msgid "F-Curve Modifier name" +msgstr "Nome do Modificador de Curva-F" + + msgid "F-Curve Modifier's panel is expanded in UI" msgstr "O painel de modificadores de curvas-f é expandido na interface de utilizador." +msgctxt "Action" +msgid "Type" +msgstr "Tipo" + + msgid "F-Curve Modifier Type" msgstr "Modificador de tipo de curva-f" +msgctxt "Action" +msgid "Invalid" +msgstr "Inválido" + + +msgctxt "Action" +msgid "Generator" +msgstr "Gerador" + + msgid "Generate a curve using a factorized or expanded polynomial" msgstr "Gera uma curva usando um polinômio fatorizado ou expandido." +msgctxt "Action" +msgid "Built-In Function" +msgstr "Função Interna" + + msgid "Generate a curve using standard math functions such as sin and cos" msgstr "Gera uma curva usando funções matemáticas padrão como seno e co-seno." +msgctxt "Action" +msgid "Envelope" +msgstr "Envelope" + + +msgid "Reshape F-Curve values, e.g. change amplitude of movements" +msgstr "Remodelar valores das Curvas-f, por exemplo alterando a amplitude dos movimentos" + + +msgctxt "Action" +msgid "Cycles" +msgstr "Cíclico" + + msgid "Cyclic extend/repeat keyframe sequence" msgstr "Estende ou repete ciclicamente a sequência de fotogramas chave." +msgctxt "Action" +msgid "Noise" +msgstr "Ruído" + + msgid "Add pseudo-random noise on top of F-Curves" msgstr "Adiciona um ruído pseudo aleatorizado no topo das curvas-f." +msgctxt "Action" +msgid "Limits" +msgstr "Limites" + + msgid "Restrict maximum and minimum values of F-Curve" msgstr "Restringe os valores mínimos e máximos da curva-f." +msgctxt "Action" +msgid "Stepped Interpolation" +msgstr "Interpolação em Passos" + + +msgid "Snap values to nearest grid step, e.g. for a stop-motion look" +msgstr "Aderir valores ao passo da grelha mais próximo, por exemplo, para aparência stop-motion" + + msgid "Use Influence" msgstr "Usar influência" @@ -11557,6 +12221,10 @@ msgid "Built-In Function F-Modifier" msgstr "Modificador-f de função embutida" +msgid "Generate values using a built-in function" +msgstr "Gerar valores usando uma função interna" + + msgid "Amplitude" msgstr "Amplitude" @@ -11593,6 +12261,10 @@ msgid "sin(x) / x" msgstr "seno (x) / x" +msgid "Phase Multiple" +msgstr "Multiplicador de Fase" + + msgid "Scale factor determining the 'speed' of the function" msgstr "Fator de escala que determina a \"velocidade\" da função." @@ -11781,6 +12453,14 @@ msgid "Field settings for an object in physics simulation" msgstr "Definições de campo para um objeto dentro da simulação física." +msgid "Affect particle's location" +msgstr "Afecta localização de partículas" + + +msgid "Affect particle's dynamic rotation" +msgstr "Afecta rotação dinâmica de partículas" + + msgid "Maximum Distance" msgstr "Distância máxima" @@ -11789,10 +12469,18 @@ msgid "Maximum distance for the field to work" msgstr "Distância máxima para o funcionamento dos campos de força." +msgid "Minimum distance for the field's falloff" +msgstr "Distância mínima para o decaimento do campo" + + msgid "Falloff Power" msgstr "Potência de decaimento" +msgid "How quickly strength falls off with distance from the force field" +msgstr "Quão rápido a força diminui com a distância do campo de forças" + + msgid "Cone" msgstr "Cone" @@ -11857,10 +12545,50 @@ msgid "Adjust the offset to the beginning/end" msgstr "Ajusta o deslocamento para o início ou para o final." +msgctxt "ParticleSettings" +msgid "Kink" +msgstr "Torção Angular" + + msgid "Type of periodic offset on the curve" msgstr "Tipo do deslocamento periódico na curva." +msgctxt "ParticleSettings" +msgid "None" +msgstr "Nenhum" + + +msgctxt "ParticleSettings" +msgid "Braid" +msgstr "Entrançar" + + +msgctxt "ParticleSettings" +msgid "Curl" +msgstr "Encaracolar" + + +msgctxt "ParticleSettings" +msgid "Radial" +msgstr "Radial" + + +msgctxt "ParticleSettings" +msgid "Roll" +msgstr "Rolagem" + + +msgctxt "ParticleSettings" +msgid "Rotation" +msgstr "Rotação" + + +msgctxt "ParticleSettings" +msgid "Wave" +msgstr "Onda" + + msgid "The distance from which particles are affected fully" msgstr "A distância na qual as partículas são afetadas completamente." @@ -11925,6 +12653,10 @@ msgid "Minimum Radial Distance" msgstr "Distância radial mínima" +msgid "Minimum radial distance for the field's falloff" +msgstr "Distância radial mínima para o decaimento do campo" + + msgid "Rest Length" msgstr "Comprimento de descanso" @@ -11945,10 +12677,30 @@ msgid "Which direction is used to calculate the effector force" msgstr "Qual direção é usada para calcular a força do efetor." +msgid "Field originates from the object center" +msgstr "O campo origina do centro do objecto" + + +msgid "Field originates from the local Z axis of the object" +msgstr "O campo origina do eixo Z local do objecto" + + +msgid "Field originates from the local XY plane of the object" +msgstr "O campo origina do plano local XY do objecto" + + +msgid "Field originates from the surface of the object" +msgstr "O campo origina da superfície do objecto" + + msgid "Every Point" msgstr "Cada ponto" +msgid "Field originates from all of the vertices of the object" +msgstr "O campo origina de todos os vértices do objecto" + + msgid "Size" msgstr "Tamanho" @@ -11977,6 +12729,10 @@ msgid "Texture Mode" msgstr "Modo de textura" +msgid "How the texture effect is calculated (RGB and Curl need a RGB texture, else Gradient will be used instead)" +msgstr "Como o efeito de textura é calculado (RGB e Curl precisam de uma textura RGB, caso contrário será usado um Gradiente)" + + msgid "Curl" msgstr "Encaracolar" @@ -11997,6 +12753,10 @@ msgid "Type of field" msgstr "Tipo de campo" +msgid "Create a force that acts as a boid's predators or target" +msgstr "Criar uma força que age como predador ou alvo de Boids" + + msgid "Spherical forcefield based on the charge of particles, only influences other charge force fields" msgstr "Campo de força esférico com base na carga das partículas, apenas influencia a carga de outros campos de força." @@ -12009,6 +12769,10 @@ msgid "Create a force that dampens motion" msgstr "Cria uma força que amortece o movimento." +msgid "Create a force based on fluid simulation velocities" +msgstr "Cria uma força com base nas velocidades de simulações de fluidos" + + msgid "Radial field toward the center of object" msgstr "Campo radial apontando para o centro do objeto." @@ -12025,6 +12789,10 @@ msgid "Forcefield depends on the speed of the particles" msgstr "Campo de força depende da velocidade das partículas." +msgid "Force field based on a texture" +msgstr "O campo de força baseado numa textura" + + msgid "Create turbulence with a noise field" msgstr "Cria turbulência com um campo de ruídos." @@ -12089,10 +12857,18 @@ msgid "Use Min" msgstr "Usar mínimo" +msgid "Use a minimum distance for the field's falloff" +msgstr "Usa uma distância mínima para o decaimento do campo" + + msgid "Multiple Springs" msgstr "Múltiplas molas" +msgid "Every point is affected by multiple springs" +msgstr "Todos os pontos são afectados por várias molas" + + msgid "Use Coordinates" msgstr "Usar coordenadas" @@ -12105,6 +12881,10 @@ msgid "Use a maximum radial distance for the field to work" msgstr "Usa uma distância radial máxima para o funcionamento dos campos de força." +msgid "Use a minimum radial distance for the field's falloff" +msgstr "Usa uma distância radial mínima para" + + msgid "Root Texture Coordinates" msgstr "Coordenadas de textura das raízes" @@ -12121,6 +12901,14 @@ msgid "Adjust force strength based on smoke density" msgstr "Ajusta a potência da força com base na densidade do fumo." +msgid "Wind Factor" +msgstr "Factor do Vento" + + +msgid "How much the force is reduced when acting parallel to a surface, e.g. cloth" +msgstr "Quantidade de redução da força quando age paralelamente à superfície, e.g. textil" + + msgid "Z Direction" msgstr "Direção Z" @@ -12133,22 +12921,166 @@ msgid "Both Z" msgstr "Ambos Z" +msgid "File Select Asset Filter" +msgstr "Filtro de Recurso de Selecção de Ficheiro" + + +msgid "Which asset types to show/hide, when browsing an asset library" +msgstr "Que tipos de recurso mostrar/ocultar, ao navegar a biblioteca de recursos" + + +msgid "Show Armature data-blocks" +msgstr "Mostrar Data-Blocks de Armações" + + +msgid "Show Brushes data-blocks" +msgstr "Mostrar Data-Blocks de Pincéis" + + +msgid "Show Cache File data-blocks" +msgstr "Mostrar Data-Blocks de Ficheiros de Cache" + + +msgid "Show Camera data-blocks" +msgstr "Mostrar Data-Blocks de Câmaras" + + +msgid "Show Curve data-blocks" +msgstr "Mostrar Data-Blocks de Curvas" + + +msgid "Show/hide Curves data-blocks" +msgstr "Mostrar/Ocultar Data-Blocks de Curvas" + + msgid "Fonts" msgstr "Fontes" +msgid "Show Font data-blocks" +msgstr "Mostrar Data-Blocks de Fontes" + + +msgid "Show Grease pencil data-blocks" +msgstr "Mostrar Data-Blocks de Grease Pencil" + + +msgid "Show Image data-blocks" +msgstr "Mostrar Data-Blocks de Imagem" + + +msgid "Show Lattice data-blocks" +msgstr "Mostrar Data-Blocks de Treliça" + + +msgid "Show Light data-blocks" +msgstr "Mostrar Data-Blocks de Luz" + + +msgid "Show Light Probe data-blocks" +msgstr "Mostrar Data-Blocks de Sondas de Luz" + + msgid "Freestyle Linestyles" msgstr "Freestyle - Estilos de linhas" +msgid "Show Freestyle's Line Style data-blocks" +msgstr "Mostrar Data-Blocks de Freestyle" + + +msgid "Show Mask data-blocks" +msgstr "Mostrar Data-Blocks de Máscara" + + +msgid "Show Mesh data-blocks" +msgstr "Mostrar Data-Blocks de Malha" + + +msgid "Show Metaball data-blocks" +msgstr "Mostrar Data-Blocks de Meta-Esferas" + + +msgid "Show Movie Clip data-blocks" +msgstr "Mostrar data-blocks de clipes de filme" + + +msgid "Show Paint Curve data-blocks" +msgstr "Mostrar data-blocks de Traços de Pintura" + + +msgid "Show Palette data-blocks" +msgstr "Mostrar data-blocks de Paletas" + + msgid "Particles Settings" msgstr "Definições de partículas" +msgid "Show Particle Settings data-blocks" +msgstr "Mostrar data-blocks de Definições de Partículas" + + +msgid "Show/hide Point Cloud data-blocks" +msgstr "Mostrar/ocultar data-blocks de Nuvens de Pontos" + + +msgid "Show Scene data-blocks" +msgstr "Mostrar data-blocks de Cena" + + +msgid "Show Sound data-blocks" +msgstr "Mostrar data-blocks de Som" + + +msgid "Show Speaker data-blocks" +msgstr "Mostrar data-blocks de Altifalantes" + + +msgid "Show Text data-blocks" +msgstr "Mostrar data-blocks de Texto" + + +msgid "Show Texture data-blocks" +msgstr "Mostrar data-blocks de Textura" + + +msgid "Show/hide Volume data-blocks" +msgstr "Mostrar/ocultar data-blocks de Volume" + + +msgid "Show workspace data-blocks" +msgstr "Mostrar Data-Blocks de Área de Trabalho" + + +msgid "Show Action data-blocks" +msgstr "Mostrar Data-Blocks de Acção" + + +msgid "Show Collection data-blocks" +msgstr "Mostrar Data-Blocks de Colecções" + + +msgid "Show Material data-blocks" +msgstr "Mostrar Data-Blocks de Materiais" + + msgid "Node Trees" msgstr "Árvores de nós" +msgid "Show Node Tree data-blocks" +msgstr "Mostrar Data-Blocks de Árvores de Nós" + + +msgid "Show Object data-blocks" +msgstr "Mostrar Data-Blocks de Objetos" + + +msgid "Show World data-blocks" +msgstr "Mostrar Data-Blocks de ambiente (Mundo)" + + msgid "File Select Parameters" msgstr "Parâmetros de seleção de ficheiro" @@ -12165,14 +13097,50 @@ msgid "Whether this path is saved in bookmarks, or generated from OS" msgstr "Permite definir se este caminho será guardado através da marcação de favoritos, ou gerado a partir do sistema operativo." +msgid "File Extensions" +msgstr "Extensões de ficheiro" + + +msgid "Operator" +msgstr "Operador" + + +msgid "Label" +msgstr "Rótulo" + + +msgid "File Select Entry" +msgstr "Entrada de Selecção de Ficheiro" + + +msgid "A file viewable in the File Browser" +msgstr "Ficheiro visualizável no Navegador de Ficheiros" + + +msgid "Asset data, valid if the file represents an asset" +msgstr "Informação de Recurso, válida se o ficheiro representar um recurso" + + msgid "Icon ID" msgstr "Identificador de ícone" +msgid "Unique integer identifying the preview of this file as an icon (zero means invalid)" +msgstr "Um número inteiro único identificando a pré visualização deste ficheiro como um ícone (zero significa inválido)" + + msgid "Relative Path" msgstr "Diretórios relativos" +msgid "Path relative to the directory currently displayed in the File Browser (includes the file name)" +msgstr "Caminho relativo à pasta actualmente exibida no Navegador de Ficheiros (inclui o nome do ficheiro)" + + +msgid "File Select ID Filter" +msgstr "ID de Filtro de Selecção de Ficheiro" + + msgid "Which ID types to show/hide, when browsing a library" msgstr "Quais tipos de identificador serão mostrados ou ocultados, ao navegar nas bibliotecas." @@ -12181,18 +13149,54 @@ msgid "Animations" msgstr "Animações" +msgid "Show animation data" +msgstr "Mostra dados de animação" + + msgid "Environment" msgstr "Ambiente" +msgid "Show worlds, lights, cameras and speakers" +msgstr "Mostrar ambientes, lâmpadas, câmaras e altifalantes" + + +msgid "Show meshes, curves, lattice, armatures and metaballs data" +msgstr "Mostrar malhas, curvas, treliças, armações e meta-esferas" + + msgid "Images & Sounds" msgstr "Imagens e sons" +msgid "Show images, movie clips, sounds and masks" +msgstr "Mostrar imagens, clipes de vídeo, sons e máscaras" + + msgid "Miscellaneous" msgstr "Miscelânea" +msgid "Show other data types" +msgstr "Mostrar outros tipos de dados" + + +msgid "Objects & Collections" +msgstr "Objectos e Colecções" + + +msgid "Show objects and collections" +msgstr "Mostrar objectos e colecções" + + +msgid "Show scenes" +msgstr "Mostra cenas" + + +msgid "Show materials, node-trees, textures and Freestyle's line-styles" +msgstr "Mostrar materiais, árvores de nós, texturas e estilos de linha Freestyle" + + msgid "Directory" msgstr "Diretório" @@ -12205,10 +13209,34 @@ msgid "Display Size" msgstr "Tamanho para mostrar" +msgid "Change the size of thumbnails" +msgstr "Alterar o tamanho das miniaturas" + + +msgid "Change the size of thumbnails in discrete steps" +msgstr "Alterar o tamanho das miniaturas em incrementos discretos" + + +msgid "Tiny" +msgstr "Diminuto" + + +msgid "Small" +msgstr "Pequeno" + + msgid "Medium" msgstr "Média" +msgid "Big" +msgstr "Grande" + + +msgid "Large" +msgstr "Muito Grande" + + msgid "Display Mode" msgstr "Modo de visualização" @@ -12217,6 +13245,22 @@ msgid "Display mode for the file list" msgstr "Modo de visualização para a lista de ficheiros." +msgid "Vertical List" +msgstr "Lista Vertical" + + +msgid "Display files as a vertical list" +msgstr "Mostra ficheiros como uma lista vertical" + + +msgid "Horizontal List" +msgstr "Lista Horizontal" + + +msgid "Display files as a horizontal list" +msgstr "Mostra ficheiros como uma lista horizontal" + + msgid "Thumbnails" msgstr "Miniaturas" @@ -12237,6 +13281,22 @@ msgid "Extension Filter" msgstr "Filtro de extensão" +msgid "UNIX shell-like filename patterns matching, supports wildcards ('*') and list of patterns separated by ';'" +msgstr "Correspondência de nomes de ficheiros tipo UNIX shell, suporta símbolos ('*') e padrões de lista separados por ';'" + + +msgid "Filter ID Types" +msgstr "Filtrar Tipos de ID" + + +msgid "Name or Tag Filter" +msgstr "Filtro de Nome ou Etiqueta" + + +msgid "Filter by name or tag, supports '*' wildcard" +msgstr "Filtrar por nome ou etiqueta, suporta símbolo \"*\"" + + msgid "Recursion" msgstr "Recursão" @@ -12281,6 +13341,22 @@ msgid "List all sub-directories' content, three levels of recursion" msgstr "Lista o conteúdo de todos os sub-diretórios, com três níveis de recursão." +msgid "File Modification Date" +msgstr "Data de Modificação do Ficheiro" + + +msgid "Show a column listing the date and time of modification for each file" +msgstr "Mostrar uma coluna listando a data e hora de modificação de cada ficheiro" + + +msgid "File Size" +msgstr "Tamanho do ficheiro" + + +msgid "Show a column listing the size of each file" +msgstr "Mostrar uma coluna listando o tamanho de cada ficheiro" + + msgid "Show hidden dot files" msgstr "Exibe os ficheiros ocultos, que iniciam com ponto." @@ -12301,6 +13377,10 @@ msgid "Sort the file list by extension/type" msgstr "Ordena a lista de ficheiros pelo tipo ou extensão." +msgid "Modified Date" +msgstr "Data de Modificação" + + msgid "Sort files by modification time" msgstr "Ordena a lista de ficheiros por data de modificação." @@ -12325,6 +13405,18 @@ msgid "Enable filtering of files" msgstr "Ativa os filtros para tipos de ficheiro conhecidos." +msgid "Only Assets" +msgstr "Apenas Recursos" + + +msgid "Hide .blend files items that are not data-blocks with asset metadata" +msgstr "Esconder itens .blend que não são data-blocks com meta-dados de recurso" + + +msgid "Filter Blender Backup Files" +msgstr "Filtrar Ficheiros de Cópia de Segurança Blender" + + msgid "Show .blend1, .blend2, etc. files" msgstr "Mostra os ficheiros das cópias de segurança do Blender com extensões \".blend1\", \".blend2\", \".blend*\", etc." @@ -12401,26 +13493,142 @@ msgid "Show text files" msgstr "Mostra os ficheiros de texto." +msgid "Filter Volume" +msgstr "Filtrar Volume" + + +msgid "Show 3D volume files" +msgstr "Mostrar Ficheiros de Volume 3D" + + msgid "Library Browser" msgstr "Navegador de bibliotecas" +msgid "Whether we may browse Blender files' content or not" +msgstr "Se se pode ou não navegar conteúdo de ficheiros Blender" + + +msgid "Reverse Sorting" +msgstr "Ordem Inversa" + + +msgid "Sort items descending, from highest value to lowest" +msgstr "Ordenar itens por ordem descendente, do valor mais alto para o mais baixo" + + +msgid "Asset Select Parameters" +msgstr "Parâmetros de seleção de recursos" + + +msgid "Settings for the file selection in Asset Browser mode" +msgstr "Definições para seleção de ficheiros no modo de Navegação de Recursos" + + +msgid "The UUID of the catalog shown in the browser" +msgstr "O UUID do catálogo exibido no navegador" + + +msgid "Filter Asset Types" +msgstr "Filtrar Tipos de Recursos" + + +msgid "Import Method" +msgstr "Método de Importação" + + +msgid "Determine how the asset will be imported" +msgstr "Determinar como o recurso será importado" + + +msgid "Follow Preferences" +msgstr "Seguir Preferências" + + +msgid "Use the import method set in the Preferences for this asset library, don't override it for this Asset Browser" +msgstr "Usar o modo de importação definido nas preferências para esta biblioteca de recursos, não revoga-lo para este Navegador de Recursos" + + msgid "Link" msgstr "Vincular" +msgid "Import the assets as linked data-block" +msgstr "Importar os recursos como data-blocks ligados" + + msgid "Append" msgstr "Anexar" +msgid "Import the assets as copied data-block, with no link to the original asset data-block" +msgstr "Importar os recursos como data-blocs copiados, sem ligação ao data-block original do recurso" + + +msgid "Append (Reuse Data)" +msgstr "Acrescentar (Reutilizar Dados)" + + +msgid "Import the assets as copied data-block while avoiding multiple copies of nested, typically heavy data. For example the textures of a material asset, or the mesh of an object asset, don't have to be copied every time this asset is imported. The instances of the asset share the data instead" +msgstr "Importar os recursos como data-blocks copiados, evitando cópias múltiplas de informação anexa tipicamente pesada. Por exemplo as texturas de recurso de material, ou malhas de um recurso de objecto não têm de ser copiadas cada vez que o recurso é importado. As instâncias deste recurso partilham a informação" + + +msgid "Float2 Attribute Value" +msgstr "Valor de Atributo Float2" + + +msgid "2D Vector value in geometry attribute" +msgstr "Valor de Vector 2D em atributo de geometria" + + +msgid "2D vector" +msgstr "Vector 2D" + + +msgid "Float Attribute Value" +msgstr "Valor de Atributo Float" + + +msgid "Floating-point value in geometry attribute" +msgstr "Valor float-point em atributo de geometria" + + +msgid "Float Color Attribute Value" +msgstr "Valor Float de cor em atributo de geometria" + + +msgid "Float Vector Attribute Value" +msgstr "Valor vecrir de float em atributo de geometria" + + +msgid "Vector value in geometry attribute" +msgstr "Valor de Vector em atributo de geometria" + + +msgid "3D vector" +msgstr "Vector 3D" + + +msgid "Read-Only Vector" +msgstr "Vector Apenas Leitura" + + msgid "Domain Settings" msgstr "Definições de domínio" +msgid "Fluid domain settings" +msgstr "Definições de domínio de fluído" + + msgid "Margin added around fluid to minimize boundary interference" msgstr "Margens adicionadas em torno do fluido para minimizar a interferência das extremidades." +msgid "Minimum amount of fluid a cell can contain before it is considered empty" +msgstr "Quantidade mínima de fluido que uma célula pode conter antes de ser considerada vazia" + + msgid "Additional" msgstr "Adicional" @@ -12429,22 +13637,118 @@ msgid "Maximum number of additional cells" msgstr "Número máximo de células adicionais." +msgid "Buoyancy Density" +msgstr "Densidade de Flutuabilidade" + + +msgid "Buoyant force based on smoke density (higher value results in faster rising smoke)" +msgstr "Força de Flutuabilidade baseada na densidade do fumo (valor mais alto resulta em fumo com ascenção mais rápida)" + + +msgid "Buoyancy Heat" +msgstr "Calor de Flutuabilidade" + + +msgid "Buoyant force based on smoke heat (higher value results in faster rising smoke)" +msgstr "Força de flutuabilidade baseada no calor do fumo (valores mais altos resultam em fumo com ascenção mais rápida)" + + +msgid "Speed of the burning reaction (higher value results in smaller flames)" +msgstr "Velocidade da reação de combustão (valores mais altos resultam em chamas menores)" + + +msgid "Select the file format to be used for caching volumetric data" +msgstr "Selecionar o formato de ficheiros a usar para armazenar dados volumétricos" + + +msgid "Cache directory" +msgstr "Pasta de armazenagem" + + +msgid "Directory that contains fluid cache files" +msgstr "Pasta que contem os ficheiros de armazenagem" + + msgid "End" msgstr "Fim" +msgid "Frame on which the simulation stops. This is the last frame that will be baked" +msgstr "Forograma em que a simulação pára. Este será o último fotograma que será calculado" + + +msgid "Frame offset that is used when loading the simulation from the cache. It is not considered when baking the simulation, only when loading it" +msgstr "Afastamento de fotograma que será usado quando carregar a simulação do armazenamento. Não é tido em conta quando fazendo bake à simulação, apenas quando a carregar" + + msgid "Start" msgstr "Início" +msgid "Frame on which the simulation starts. This is the first frame that will be baked" +msgstr "Fotograma no qual a simulação começa. Este é o primeiro fotograma que será pré calculado" + + +msgid "Select the file format to be used for caching surface data" +msgstr "Selecionar o formato de ficheiros para ser usado para armazenar informação de superfície" + + +msgid "Select the file format to be used for caching noise data" +msgstr "Selecionar o formato de ficheiros para ser usado para armazenar informação de ruído" + + +msgid "Select the file format to be used for caching particle data" +msgstr "Selecionar o formato de ficheiros para ser usado para armazenar informação de partículas" + + +msgid "Resumable" +msgstr "Resumível" + + +msgid "Additional data will be saved so that the bake jobs can be resumed after pausing. Because more data will be written to disk it is recommended to avoid enabling this option when baking at high resolutions" +msgstr "Informação adicional será guardada de forma a que o processo de pré cálculo possa ser retomado após pausa. Por ser escrita mais informação para o disco recomenda-se desactivar esta opção quando pré calcular em alta resolução" + + +msgid "Change the cache type of the simulation" +msgstr "Alterar o tipo de armazenamento da simulação." + + +msgid "Replay" +msgstr "Repetir" + + +msgid "Use the timeline to bake the scene" +msgstr "Usar a linha do tempo para pré calcular a cena" + + +msgid "Modular" +msgstr "Modular" + + +msgid "Bake every stage of the simulation separately" +msgstr "Pré calcular cada etapa da simulação separadamente" + + +msgid "Bake all simulation settings at once" +msgstr "Pré calcular todas as definições da simulação de uma vez" + + msgid "Cell Size" msgstr "Tamanho da célula" +msgid "Maximal velocity per cell (greater CFL numbers will minimize the number of simulation steps and the computation time.)" +msgstr "Velocidade máxima por célula (valores CFL mais altos minimizam o número de passos da simulação e o tempo de computação)" + + msgid "Clipping" msgstr "Vinculação" +msgid "Value under which voxels are considered empty space to optimize rendering" +msgstr "Valor abaixo do qual voxeis são considerados espaços vazios para optimizar a renderização" + + msgid "Color Grid" msgstr "Grelha de cor" @@ -12461,6 +13765,18 @@ msgid "Simulation field to color map" msgstr "Um espaço de simulação convertido em mapa de cores." +msgid "Multiplier for scaling the selected field to color map" +msgstr "Multiplicador para redimensionar o campo seleccionado para mapa de cor" + + +msgid "Clear In Obstacle" +msgstr "Eliminar dento de Obstáculo" + + +msgid "Delete fluid inside obstacles" +msgstr "Apagar fluido dentro de obstáculos" + + msgid "Density Grid" msgstr "Grelha de densidade" @@ -12469,6 +13785,10 @@ msgid "Smoke density grid" msgstr "Grelha de densidade do fumo." +msgid "Interpolation method to use for smoke/fire volumes in solid mode" +msgstr "Método de interpolação a utilizar para fumo/fogo em modo sólido" + + msgid "Good smoothness and speed" msgstr "Fornece uma boa suavização e velocidade." @@ -12489,10 +13809,18 @@ msgid "No interpolation" msgstr "Sem interpolação." +msgid "Thickness of smoke display in the viewport" +msgstr "Espessura do desenho do fumo na janela de visualização" + + msgid "Dissolve Speed" msgstr "Velocidade de dissolução." +msgid "Determine how quickly the smoke dissolves (lower value makes smoke disappear faster)" +msgstr "Determina quão rápido o fumo se dissolve (valores mais baixos fazem o fumo desaparecer mais depressa)" + + msgid "res" msgstr "Resolução" @@ -12501,6 +13829,34 @@ msgid "Smoke Grid Resolution" msgstr "Grelha de resolução do fumo" +msgid "Domain Type" +msgstr "Tipo de Domínio" + + +msgid "Change domain type of the simulation" +msgstr "Alterar o tipo de domínio da simulação" + + +msgid "Create domain for gases" +msgstr "Criar domínio para gases" + + +msgid "Liquid" +msgstr "Líquido" + + +msgid "Create domain for liquids" +msgstr "Criar domínio para líquidos" + + +msgid "Export Mantaflow Script" +msgstr "Exportar Script Mantaflow" + + +msgid "Generate and export Mantaflow script from current domain settings during bake. This is only needed if you plan to analyze the cache (e.g. view grids, velocity vectors, particles) in Mantaflow directly (outside of Blender) after baking the simulation" +msgstr "Gerar e exportar script Mantaflow das definições do actual domínio durante o pré cálculo. Apenas necessário se pretender analizar o armazenamento (por exemplos ver grelhas, vectores de velocidades, partículas) directamente no Mantaflow (fora do Blender) após pré calcular a simulação" + + msgid "Flame Grid" msgstr "Grelha de chamas" @@ -12509,6 +13865,14 @@ msgid "Smoke flame grid" msgstr "A grelha de chamas do fumo." +msgid "Minimum temperature of the flames (higher value results in faster rising flames)" +msgstr "Temperatura mínima das chamas (valor mais alto faz chamas com ascençao mais rápida)" + + +msgid "Maximum temperature of the flames (higher value results in faster rising flames)" +msgstr "Temperatura máxima das chamas (valor mais alto faz chamas com ascençao mais rápida)" + + msgid "Smoke" msgstr "Fumo" @@ -12533,10 +13897,54 @@ msgid "Additional vorticity for the flames" msgstr "Vorticidade adicional para as chamas." +msgid "FLIP Ratio" +msgstr "Rácio FLIP" + + +msgid "PIC/FLIP Ratio. A value of 1.0 will result in a completely FLIP based simulation. Use a lower value for simulations which should produce smaller splashes" +msgstr "Rácio PIC/FLIP. Um valor de 1.0 resulta numa simulação totalmente baseada em FLIP. Usar valor inferior para simulações que devem produzir salpicos menores" + + +msgid "Fluid Collection" +msgstr "Colecção de Fluido" + + +msgid "Limit fluid objects to this collection" +msgstr "Limita os objetos de fluido a esta colecção" + + +msgid "Force Collection" +msgstr "Colecção de Força" + + +msgid "Limit forces to this collection" +msgstr "Limita forcas para esta colecção" + + +msgid "Obstacle Distance" +msgstr "Distância de Obstáculo" + + +msgid "Determines how far apart fluid and obstacle are (higher values will result in fluid being further away from obstacles, smaller values will let fluid move towards the inside of obstacles)" +msgstr "Determina a que distância ficam o fluido e o obstáculo (valores mais altos fazem o fluido ficar mais afastado dos obstáculos valores mais baixos deixam o fluido mover para dentro dos obstáculos)" + + +msgid "Obstacle Threshold" +msgstr "Limite de Obstáculo" + + +msgid "Determines how much fluid is allowed in an obstacle cell (higher values will tag a boundary cell as an obstacle easier and reduce the boundary smoothening effect)" +msgstr "Determina a quantidade de fluido permitida numa células de obstáculo (valor mais alto marca uma fronteira de célula mais fácil de ultrapassar e reduz o efeito de suavização de fronteira)" + + msgid "Gravity in X, Y and Z direction" msgstr "Gravidade na direção X, Y e Z." +msgid "Cell Type" +msgstr "Tipo de Célula" + + msgid "Fluid" msgstr "Fluido" @@ -12549,10 +13957,34 @@ msgid "Outflow" msgstr "Escoamento" +msgid "Flags" +msgstr "Etiquetas" + + +msgid "Choose where to get guiding velocities from" +msgstr "Escolher de onde obter velocidades guia" + + +msgid "Use a fluid domain for guiding (domain needs to be baked already so that velocities can be extracted). Guiding domain can be of any type (i.e. gas or liquid)" +msgstr "Usar domínio fluído como guia (o domínio precisa de estar já pré calculado para que se possam extrair velocidades). Domínio guia pode ser de qualquer tipo (gás ou líquido)" + + +msgid "Effector" +msgstr "Efector" + + +msgid "Use guiding (effector) objects to create fluid guiding (guiding objects should be animated and baked once set up completely)" +msgstr "Usar objectos guia (efectores) para criar objectos guia de fluidos (objectos guia devem ser animados e pré calculados após configuração)" + + msgid "Velocity Factor" msgstr "Fator de velocidade" +msgid "Guiding velocity factor (higher value results in greater guiding velocities)" +msgstr "Factor de velocidade guia (valor mais alto resulta em velocidades guia mais altas)" + + msgid "Heat Grid" msgstr "Grelha calorífica" @@ -12577,14 +14009,54 @@ msgid "Nearest" msgstr "Mais próximo" +msgid "Lower Concavity" +msgstr "Concavidade Inferior" + + +msgid "Lower mesh concavity bound (high values tend to smoothen and fill out concave regions)" +msgstr "Limite de concavidade inferior (valores mais altos tendem a suavizar e preencher regiões)" + + +msgid "Upper Concavity" +msgstr "Concavidade Superior" + + +msgid "Upper mesh concavity bound (high values tend to smoothen and fill out concave regions)" +msgstr "Limite superior de concavidade da malha (valores altos tendem a suavizar e preencher regiões côncavas)" + + +msgid "Mesh generator" +msgstr "Gerador de malha" + + +msgid "Which particle level set generator to use" +msgstr "Que gerador de nível de partículas usar" + + msgid "Final" msgstr "Final" +msgid "Use improved particle level set (slower but more precise and with mesh smoothening options)" +msgstr "Gerador de nível de partículas melhorado (mais lento mas mais preciso e com opções de suavização de malha)" + + msgid "Preview" msgstr "Previsão" +msgid "Use union particle level set (faster but lower quality)" +msgstr "Usar nível de partículas unificado (mais rápido mas menor qualidade)" + + +msgid "Particle radius factor (higher value results in larger (meshed) particles). Needs to be adjusted after changing the mesh scale" +msgstr "Factor do raio das partículas (valor mais alto resulta em malhas de partículas maiores). Necessita de ser ajustado após mudança de escala da malha" + + +msgid "Mesh scale" +msgstr "Escala da Malha" + + msgid "Strength of noise" msgstr "Força de ruído." @@ -12593,6 +14065,10 @@ msgid "Time" msgstr "Tempo" +msgid "Animation time of noise" +msgstr "Tempo de animação do ruído" + + msgid "Compression" msgstr "Compressão" @@ -12625,10 +14101,91 @@ msgid "Data Depth" msgstr "Profundidade de dados" +msgid "Bit depth for fluid particles and grids (lower bit values reduce file size)" +msgstr "Profundidade de bits para partículas de fluidos e grelhas (valores de bits mais baixos reduzem tamanho do ficheiro)" + + +msgid "Particle (narrow) band width (higher value results in thicker band and more particles)" +msgstr "Largura de banda (estreita de partículas (valor mais altos resulta em banda mais larga e mais partículas)" + + +msgid "Maximum number of particles per cell (ensures that each cell has at most this amount of particles)" +msgstr "Número máximo de partículas por célula (assegura que cada célula tem no máximo esta quantidade de partículas)" + + +msgid "Minimum number of particles per cell (ensures that each cell has at least this amount of particles)" +msgstr "Número mínimo de partículas por célula (assegura que cada célula tem no mínimo esta quantidade de partículas)" + + +msgctxt "Amount" +msgid "Number" +msgstr "Número" + + +msgid "Particle number factor (higher value results in more particles)" +msgstr "Factor de número de partículas (valor mais alto resulta em mais partículas)" + + +msgid "Particle radius factor. Increase this value if the simulation appears to leak volume, decrease it if the simulation seems to gain volume" +msgstr "Factor do raio das partículas. Aumentar este valor se a simulação parece perder volume, diminuir se o volume parece aumentar" + + msgid "Randomness" msgstr "Aleatorização" +msgid "Randomness factor for particle sampling" +msgstr "Factor de aleatoriedade para amostragem de partículas" + + +msgid "Particle scale" +msgstr "Escala de partículas" + + +msgid "The particle simulation is scaled up by this factor (compared to the base resolution of the domain)" +msgstr "A simulação de partículas é aumentada por este factor de escala (comparado com a resolução base do domínio)" + + +msgid "Maximum Resolution" +msgstr "Resolução Máxima" + + +msgid "Resolution used for the fluid domain. Value corresponds to the longest domain side (resolution for other domain sides is calculated automatically)" +msgstr "Resolução usada para o domínio do fluido. O valor corresponde ao lado mais longo do domínio (a resolução para os lados do domínio são calculados automáticamente)" + + +msgid "Gridlines" +msgstr "Linhas de Grelha" + + +msgid "Show gridlines" +msgstr "Mostrar linha da grelha" + + +msgid "Vector Display" +msgstr "Mostrar Vectores" + + +msgid "Visualize vector fields" +msgstr "Visualizar campos de vectores" + + +msgid "Simulation Method" +msgstr "Método de Simulação" + + +msgid "Change the underlying simulation method" +msgstr "Alterar o método subjacente de simulação" + + +msgid "Use FLIP as the simulation method (more splashy behavior)" +msgstr "Usar FLIP como método de simulação (comportamento com mais salpicos)" + + +msgid "Use APIC as the simulation method (more energetic and stable behavior)" +msgstr "Usar APIC como método de simulação (comportamento mais energético e estável)" + + msgid "Adjust slice direction according to the view direction" msgstr "Ajusta a direção do fatiamento de " @@ -12657,10 +14214,38 @@ msgid "How many slices per voxel should be generated" msgstr "Define quantas fatias por voxel deverão ser geradas." +msgid "Particles in Boundary" +msgstr "Partículas na Fronteira" + + +msgid "How particles that left the domain are treated" +msgstr "Como são tratadas as partículas que deixaram o domínio" + + msgid "Delete" msgstr "Apagar" +msgid "Delete secondary particles that are inside obstacles or left the domain" +msgstr "Apagar partículas secundárias que estão dentro de obstáculos ou abandonaram o domínio" + + +msgid "Push Out" +msgstr "Empurrar para Fora" + + +msgid "Push secondary particles that left the domain back into the domain" +msgstr "Empurrar partículas secundadas que abandonaram o domínio de volta para dentro do domínios" + + +msgid "Bubble Buoyancy" +msgstr "Flutuabilidade das Bolhas" + + +msgid "Amount of buoyancy force that rises bubbles (high value results in bubble movement mainly upwards)" +msgstr "Quantidade de força de flutuação que eleva bolhas (valor alto resulta em movimento de bolhas maioritariamente ascendente)" + + msgid "p0" msgstr "Ponto inicial" @@ -16524,6 +18109,10 @@ msgid "Freehand annotation sketchbook" msgstr "Bloco de anotações de rascunho a mão livre." +msgid "Annotation" +msgstr "Anotação" + + msgid "Layers" msgstr "Camadas" @@ -17564,10 +19153,6 @@ msgid "Node tree consisting of linked nodes used for shading, textures and compo msgstr "Árvore de nós consistindo de nós conectados, usados para sombreamento, texturas e composição." -msgid "Label" -msgstr "Rótulo" - - msgid "The node tree label" msgstr "O rótulo da árvore de nós." @@ -19356,6 +20941,10 @@ msgid "Play audio from Sequence Editor while scrubbing" msgstr "Reproduz áudio a partir do editor de sequências durante o posicionamento do cursor (como em gravadores analógicos)." +msgid "Custom Simulation Range" +msgstr "Intervalo de Simulação Personalizado" + + msgid "Global Gravity" msgstr "Gravidade global" @@ -19582,6 +21171,11 @@ msgid "Filename of the text file" msgstr "Nome de ficheiro para o ficheiro de texto" +msgctxt "Text" +msgid "Indentation" +msgstr "Recuo" + + msgid "Text file has been edited since last save" msgstr "O ficheiro de texto foi editado desde a última vez que foi guardado." @@ -22522,6 +24116,10 @@ msgid "Insert a keyframe on each of the location and scale channels" msgstr "Insere um fotograma chave em cada um dos canais de localização e escala." +msgid "Location & Scale" +msgstr "Posição e Escala" + + msgid "Insert a keyframe on each of the rotation and scale channels" msgstr "Insere um fotograma chave em cada um dos canais de rotação e escala." @@ -38571,10 +40169,6 @@ msgid "Reverse Colors" msgstr "Inverter as cores" -msgid "Flip direction of vertex colors inside faces" -msgstr "Alterna a direção da pintura das cores dos vértices nas faces selecionadas." - - msgctxt "Operator" msgid "Rotate Colors" msgstr "Rotacionar cores" @@ -45721,10 +47315,6 @@ msgid "Falloff Type" msgstr "Tipo de decaimento" -msgid "Operator" -msgstr "Operador" - - msgid "Sharpen" msgstr "Aguçar" @@ -50469,14 +52059,6 @@ msgid "Active Palette Color" msgstr "Cor ativa da paleta" -msgid "Refraction" -msgstr "Refração" - - -msgid "Denoising" -msgstr "Redução de ruídos" - - msgid "Integrator Presets" msgstr "Predefinições de integrador" @@ -50817,6 +52399,10 @@ msgid "Indirect Lighting" msgstr "Iluminação indireta" +msgid "Denoising" +msgstr "Redução de ruídos" + + msgid "Shadows" msgstr "Sombras" @@ -54521,10 +56107,6 @@ msgid "Process the render result through the compositing pipeline, if compositin msgstr "Processa o resultado da renderização através da linha de trabalho de composição, caso os nós de composição estejam ativos." -msgid "File Extensions" -msgstr "Extensões de ficheiro" - - msgid "Add the file format extensions to the rendered file name (eg: filename + .jpg)" msgstr "Adiciona as extensões de formato de ficheiro como sufixos para os nomes dos ficheiros renderizados (exemplo: nome_do_ficheiro + \".jpg\")." @@ -60610,8 +62192,8 @@ msgid "Display vertex-per-face normals as lines" msgstr "Mostra as normais dos vértices por face como linhas." -msgid "Stat Vis" -msgstr "Visualização de estatísticas" +msgid "Mesh Analysis" +msgstr "Análise da malha" msgid "Display statistical information about the mesh" @@ -61987,6 +63569,10 @@ msgid "Auto-Step" msgstr "Passos automáticos" +msgid "Refraction" +msgstr "Refração" + + msgid "Paths:" msgstr "Caminhos:" @@ -63291,10 +64877,6 @@ msgid "Seams" msgstr "Costuras" -msgid "Mesh Analysis" -msgstr "Análise da malha" - - msgid "Edge Marks" msgstr "Marcações de arestas" @@ -63766,10 +65348,6 @@ msgid "Int" msgstr "Inteiro" -msgid "PreviewCol" -msgstr "Cor de previsão" - - msgid "TexturedCol" msgstr "Cor texturizada" @@ -63794,10 +65372,6 @@ msgid "OS Loop" msgstr "Ciclo de sistema operativo" -msgid "PreviewLoopCol" -msgstr "Previsão de ciclo de cor" - - msgid "Source or destination meshes do not have any vertices, cannot transfer vertex data" msgstr "As malhas de fonte ou destinação não possuem quaisquer vértices, não é possível transferir os dados de vértices." @@ -67143,6 +68717,10 @@ msgid "File '%s' could not be loaded" msgstr "Ficheiro '%s' não pode ser carregado." +msgid "Please select all related strips" +msgstr "Por favor, selecione as faixas relacionadas." + + msgid "Cannot apply effects to audio sequence strips" msgstr "Não é possível aplicar efeitos para as faixas de sequência de áudio." @@ -67167,10 +68745,6 @@ msgid "No valid inputs to swap" msgstr "Sem entradas válidas para trocar." -msgid "Please select all related strips" -msgstr "Por favor, selecione as faixas relacionadas." - - msgid "Please select two strips" msgstr "Por favor, selecione duas faixas." diff --git a/locale/po/pt_BR.po b/locale/po/pt_BR.po index ccc92deecff..087633a9f47 100644 --- a/locale/po/pt_BR.po +++ b/locale/po/pt_BR.po @@ -1,10 +1,10 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: Leandro Paganelli \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" -"PO-Revision-Date: 2023-11-27 09:55+0000\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" +"PO-Revision-Date: 2023-12-06 06:42+0000\n" "Last-Translator: Gilberto Rodrigues \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" @@ -412,6 +412,10 @@ msgid "Fribidi Library" msgstr "Biblioteca FriBidi" +msgid "The FriBidi C compiled library (.so under Linux, .dll under windows...), you’ll likely have to edit it if you’re under Windows, e.g. using the one included in Blender libraries repository" +msgstr "A biblioteca Fribidi C compilada (.so em sistemas Linux, .dll em sistemas Windows...), você provavelmente precisará editá-la se estiver no Windows, ex: usando a inclusa dentro das bibliotecas no repositório svn" + + msgid "Translation Root" msgstr "Raiz das traduções" @@ -500,6 +504,10 @@ msgid "Combine" msgstr "Combinar" +msgid "The strip values are combined with accumulated results by appropriately using addition, multiplication, or quaternion math, based on channel type" +msgstr "Os valores da faixa são combinados com resultados acumulados usando apropriadamente adição, multiplicação ou matemática de quatérnios, com base no tipo de canal" + + msgid "Add" msgstr "Adicionar" @@ -552,6 +560,10 @@ msgid "Amount the Active Action contributes to the result of the NLA stack" msgstr "O quanto a ação ativa contribui para o resultado da pilha de animação não linear" +msgid "Slot to temporarily hold the main action while in tweak mode" +msgstr "Slot para segurar temporariamente a ação principal enquanto estiver no modo de ajuste" + + msgid "Drivers" msgstr "Controladores" @@ -609,7 +621,7 @@ msgstr "Gerar e gravar posição" msgid "When calculating Bone Paths, use Head or Tips" -msgstr "Durante os cálculos dos caminhos dos ossos, define o uso das cabeças ou bases para gerar e gravar." +msgstr "Durante os cálculos dos caminhos dos ossos, define o uso das cabeças ou bases para gerar e gravar" msgid "Heads" @@ -617,7 +629,7 @@ msgstr "Cabeças" msgid "Calculate bone paths from heads" -msgstr "Calcula o caminho dos ossos a partir das cabeças." +msgstr "Calcula o caminho dos ossos a partir das cabeças" msgid "Tails" @@ -629,7 +641,7 @@ msgstr "Depois do atual" msgid "Number of frames to show after the current frame (only for 'Around Current Frame' Onion-skinning method)" -msgstr "Número de quadros a exibir após o quadro atual (apenas para o método de criação de fantasmas \"Ao redor do quadro\")." +msgstr "Número de quadros a exibir após o quadro atual (apenas para o método de criação de fantasmas \"Ao redor do quadro\")" msgid "Before Current" @@ -637,7 +649,7 @@ msgstr "Antes do atual" msgid "Number of frames to show before the current frame (only for 'Around Current Frame' Onion-skinning method)" -msgstr "Números de quadros a exibir antes do quadro atual (apenas para o método de criação de fantasmas \"Ao redor do quadro\")." +msgstr "Números de quadros a exibir antes do quadro atual (apenas para o método de criação de fantasmas \"Ao redor do quadro\")" msgid "End Frame" @@ -645,7 +657,7 @@ msgstr "Quadro final" msgid "End frame of range of paths to display/calculate (not for 'Around Current Frame' Onion-skinning method)" -msgstr "Quadro final do intervalo de caminhos para exibir ou calcular (não usado para o método de criação de fantasmas \"Ao redor do quadro\")." +msgstr "Quadro final do intervalo de caminhos para exibir ou calcular (não usado para o método de criação de fantasmas \"Ao redor do quadro\")" msgid "Start Frame" @@ -653,7 +665,7 @@ msgstr "Quadro inicial" msgid "Starting frame of range of paths to display/calculate (not for 'Around Current Frame' Onion-skinning method)" -msgstr "Quadro inicial do intervalo de caminhos para exibir ou calcular (não usado para o método de criação de fantasmas \"Ao redor do quadro\")." +msgstr "Quadro inicial do intervalo de caminhos para exibir ou calcular (não usado para o método de criação de fantasmas \"Ao redor do quadro\")" msgid "Frame Step" @@ -661,7 +673,7 @@ msgstr "Intervalos de quadros" msgid "Number of frames between paths shown (not for 'On Keyframes' Onion-skinning method)" -msgstr "O passo do número de quadros exibidos no caminho de movimento gerado. A divisão em passos não é usada na marcação dos quadros-chave nos fantasmas ou caminhos de movimento." +msgstr "O passo do número de quadros exibidos no caminho de movimento gerado. A divisão em passos não é usada na marcação dos quadros-chave nos fantasmas ou caminhos de movimento" msgid "Has Motion Paths" @@ -669,19 +681,39 @@ msgstr "Possui caminhos de movimento" msgid "Are there any bone paths that will need updating (read-only)" -msgstr "Existem ainda alguns caminhos de ossos que necessitam atualização (modo de somente leitura)." +msgstr "Existem ainda alguns caminhos de ossos que necessitam atualização (modo de somente leitura)" + + +msgid "Paths Range" +msgstr "Faixa de caminhos" + + +msgid "Type of range to calculate for Motion Paths" +msgstr "Tipo de intervalo a exibir para os caminhos de movimento" + + +msgid "From the first keyframe to the last" +msgstr "Do primeiro quadro ao último" msgid "Selected Keys" msgstr "Chaves Selecionadas" +msgid "The entire Scene / Preview range" +msgstr "Toda a faixa de cena/visualização" + + +msgid "Manually determined frame range" +msgstr "Intervalo de quadros determinado manualmente" + + msgid "Show Frame Numbers" msgstr "Mostrar número dos quadros" msgid "Show frame numbers on Motion Paths" -msgstr "Mostra os números dos quadros nos caminhos de movimento." +msgstr "Mostra os números dos quadros nos caminhos de movimento" msgid "All Action Keyframes" @@ -689,7 +721,7 @@ msgstr "Todos os quadros-chave de ação" msgid "For bone motion paths, search whole Action for keyframes instead of in group with matching name only (is slower)" -msgstr "Para os caminhos de movimento dos ossos, pesquisa toda a ação presente nos quadros-chave ao invés de pesquisar somente no grupo de nome correspondente (é mais lento)." +msgstr "Para os caminhos de movimento dos ossos, pesquisa toda a ação presente nos quadros-chave ao invés de pesquisar somente no grupo de nome correspondente (é mais lento)" msgid "Highlight Keyframes" @@ -697,7 +729,7 @@ msgstr "Destacar quadros-chave" msgid "Emphasize position of keyframes on Motion Paths" -msgstr "Enfatiza a posição dos quadros-chave nos caminhos de movimento." +msgstr "Enfatiza a posição dos quadros-chave nos caminhos de movimento" msgid "Show Keyframe Numbers" @@ -705,7 +737,7 @@ msgstr "Mostrar números dos quadros-chave" msgid "Show frame numbers of Keyframes on Motion Paths" -msgstr "Exibe os números dos quadros que contém quadros-chave nos caminhos de movimento." +msgstr "Exibe os números dos quadros que contém quadros-chave nos caminhos de movimento" msgid "Paths Type" @@ -713,7 +745,7 @@ msgstr "Tipo de caminhos" msgid "Type of range to show for Motion Paths" -msgstr "Tipo de intervalo a exibir para os caminhos de movimento." +msgstr "Tipo de intervalo a exibir para os caminhos de movimento" msgid "Around Frame" @@ -721,7 +753,7 @@ msgstr "Ao redor do quadro" msgid "Display Paths of poses within a fixed number of frames around the current frame" -msgstr "Exibe caminhos das poses e movimentos dentro de um número fixo de quadros ao redor do quadro atual." +msgstr "Exibe caminhos das poses e movimentos dentro de um número fixo de quadros ao redor do quadro atual" msgid "In Range" @@ -729,7 +761,7 @@ msgstr "Dentro do intervalo" msgid "Display Paths of poses within specified range" -msgstr "Exibe caminhos das poses e movimentos dentro de um intervalo especificado." +msgstr "Exibe caminhos das poses e movimentos dentro de um intervalo especificado" msgid "Any Type" @@ -737,11 +769,11 @@ msgstr "Qualquer tipo" msgid "RNA type used for pointers to any possible data" -msgstr "Tipo de RNA usado para ponteiros de quaisquer dados possíveis." +msgstr "Tipo de RNA usado para ponteiros de quaisquer dados possíveis" msgid "Area in a subdivided screen, containing an editor" -msgstr "Área numa tela subdividida, contendo um editor." +msgstr "Área numa tela subdividida, contendo um editor" msgid "Height" @@ -757,7 +789,7 @@ msgstr "Regiões" msgid "Regions this area is subdivided in" -msgstr "Regiões em que esta área está subdividida." +msgstr "Regiões em que esta área está subdividida" msgid "Show Menus" @@ -773,7 +805,7 @@ msgstr "Espaços" msgid "Spaces contained in this area, the first being the active space (NOTE: Useful for example to restore a previously used 3D view space in a certain area to get the old view orientation)" -msgstr "Espaços contidos nesta área, sendo o primeiro, o espaço ativo (isso é útil, por exemplo, para restaurar um espaço da janela de visualização 3D usado anteriormente numa certa área para obter a orientação de uma vista antiga)." +msgstr "Espaços contidos nesta área, sendo o primeiro, o espaço ativo (isso é útil, por exemplo, para restaurar um espaço da janela de visualização 3D usado anteriormente numa certa área para obter a orientação de uma vista antiga)" msgid "Editor Type" @@ -792,12 +824,16 @@ msgid "3D Viewport" msgstr "Janela de Exibição 3D" +msgid "Manipulate objects in a 3D environment" +msgstr "Manipule objetos em um ambiente 3D" + + msgid "UV/Image Editor" msgstr "Editor de imagens e UVs" msgid "View and edit images and UV Maps" -msgstr "Permite visualizar e editar imagens e mapas UV." +msgstr "Permite visualizar e editar imagens e mapas UV" msgid "Node Editor" @@ -805,7 +841,7 @@ msgstr "Editor de nós" msgid "Editor for node-based shading and compositing tools" -msgstr "Editor para sombreamento embasado em nós e ferramentas de composição." +msgstr "Editor para sombreamento embasado em nós e ferramentas de composição" msgid "Video Sequencer" @@ -829,7 +865,7 @@ msgstr "Tabela de animação" msgid "Adjust timing of keyframes" -msgstr "Permite ajustar a temporização dos quadros-chave." +msgstr "Permite ajustar a temporização dos quadros-chave" msgid "Graph Editor" @@ -837,7 +873,7 @@ msgstr "Editor gráfico" msgid "Edit drivers and keyframe interpolation" -msgstr "Permite editar controladores e interpolação de quadros-chave." +msgstr "Permite editar controladores e interpolação de quadros-chave" msgid "Nonlinear Animation" @@ -845,7 +881,7 @@ msgstr "Animação não linear" msgid "Combine and layer Actions" -msgstr "Permite a combinação entre movimentos e camadas de ações." +msgstr "Permite a combinação entre movimentos e camadas de ações" msgid "Text Editor" @@ -853,7 +889,7 @@ msgstr "Editor de texto" msgid "Edit scripts and in-file documentation" -msgstr "Permite editar scripts e documentação presente em arquivos." +msgstr "Permite editar scripts e documentação presente em arquivos" msgid "Python Console" @@ -861,13 +897,17 @@ msgstr "Console Python" msgid "Interactive programmatic console for advanced editing and script development" -msgstr "Console interativo programável para edições avançadas e desenvolvimento de scripts." +msgstr "Console interativo programável para edições avançadas e desenvolvimento de scripts" msgid "Info" msgstr "Janela de informações" +msgid "Log of operations, warnings and error messages" +msgstr "Registros de operações, avisos e mensagens de erro" + + msgid "Top Bar" msgstr "Barra Superior" @@ -876,12 +916,16 @@ msgid "Status Bar" msgstr "Barra de Status" +msgid "Global bar at the bottom of the screen for general status information" +msgstr "Barra global na parte inferior da tela para informações gerais de status" + + msgid "Outliner" msgstr "Esquematizador" msgid "Overview of scene graph and all available data-blocks" -msgstr "Visão geral dos gráficos de cena e todos os blocos de dados disponíveis." +msgstr "Visão geral dos gráficos de cena e todos os blocos de dados disponíveis" msgid "Properties" @@ -889,7 +933,7 @@ msgstr "Propriedades" msgid "Edit properties of active object and related data-blocks" -msgstr "Permite editar as propriedades do objeto ativo e blocos de dados relacionados." +msgstr "Permite editar as propriedades do objeto ativo e blocos de dados relacionados" msgid "File Browser" @@ -897,19 +941,23 @@ msgstr "Navegador de arquivos" msgid "Browse for files and assets" -msgstr "Permite navegar em locais, pastas, arquivos e recursos." +msgstr "Permite navegar em locais, pastas, arquivos e recursos" msgid "Spreadsheet" msgstr "Planilha" +msgid "Explore geometry data in a table" +msgstr "Explore dados da geometria em uma tabela" + + msgid "Preferences" msgstr "Preferências" msgid "Edit persistent configuration settings" -msgstr "Permite editar definições de configuração persistentes." +msgstr "Permite editar definições de configuração persistentes" msgid "Width" @@ -925,7 +973,7 @@ msgstr "Posição X" msgid "The window relative vertical location of the area" -msgstr "A localização vertical relativa da área da janela." +msgstr "A localização vertical relativa da área da janela" msgid "Y Position" @@ -933,7 +981,7 @@ msgstr "Posição Y" msgid "The window relative horizontal location of the area" -msgstr "A localização horizontal relativa da área da janela." +msgstr "A localização horizontal relativa da área da janela" msgid "Area Spaces" @@ -949,7 +997,7 @@ msgstr "Espaço ativo" msgid "Space currently being displayed in this area" -msgstr "O espaço sendo mostrado atualmente nesta área." +msgstr "O espaço sendo mostrado atualmente nesta área" msgid "Armature Bones" @@ -981,25 +1029,89 @@ msgstr "Osso de edição ativo" msgid "Armatures active edit bone" -msgstr "Osso ativo na edição da armação de ossos." +msgstr "Osso ativo na edição da armação de ossos" + + +msgid "Catalog Path" +msgstr "Caminho do catálogo" + + +msgid "Asset Library Reference" +msgstr "Referência da Biblioteca de Ativos" + + +msgid "Identifier to refer to the asset library" +msgstr "Identificador para se referir à biblioteca de ativos" + + +msgid "Asset Data" +msgstr "Dados de ativos" msgid "Active Tag" msgstr "Etiqueta Ativa" +msgid "Index of the tag set for editing" +msgstr "Índice da etiqueta definida para edição" + + msgid "Author" msgstr "Autor" +msgid "Name of the creator of the asset" +msgstr "Nome do criador do ativo" + + +msgid "Catalog UUID" +msgstr "Catálogo UUID" + + +msgid "Identifier for the asset's catalog, used by Blender to look up the asset's catalog path. Must be a UUID according to RFC4122" +msgstr "Identificador do catálogo de ativos, usado pelo Blender para procurar o caminho do catálogo de ativos. Deve ser um UUID de acordo com RFC4122" + + +msgid "Catalog Simple Name" +msgstr "Nome Simples do Catálogo" + + +msgid "Simple name of the asset's catalog, for debugging and data recovery purposes" +msgstr "Nome simples do catálogo de ativos, para fins de depuração e recuperação de dados" + + msgid "Description" msgstr "Descrição" +msgid "A description of the asset to be displayed for the user" +msgstr "Uma descrição do ativo a ser exibido para o usuário" + + msgid "Tags" msgstr "Tags" +msgid "Asset Representation" +msgstr "Representação de Ativos" + + +msgid "Full Library Path" +msgstr "Caminho completo da biblioteca" + + +msgid "Absolute path to the .blend file containing this asset" +msgstr "Caminho absoluto para o arquivo .blend que contém este ativo" + + +msgid "Full Path" +msgstr "Caminho completo" + + +msgid "Absolute path to the .blend file containing this asset extended with the path of the asset inside the file" +msgstr "Caminho absoluto para o arquivo .blend que contém este ativo estendido com o caminho do ativo dentro do arquivo" + + msgctxt "ID" msgid "Action" msgstr "Ação" @@ -1180,10 +1292,26 @@ msgid "World" msgstr "Ambiente" +msgid "Additional information about the asset" +msgstr "Informações adicionais sobre o ativo" + + +msgid "Asset Shelf" +msgstr "Prateleira de Ativos" + + +msgid "Regions for quick access to assets" +msgstr "Regiões para acesso rápido aos ativos" + + msgid "Asset Library" msgstr "Biblioteca de Recursos" +msgid "Choose the asset library to display assets from" +msgstr "Escolha a biblioteca de ativos para exibir os ativos" + + msgid "All" msgstr "Todos" @@ -1196,42 +1324,122 @@ msgid "ID Name" msgstr "Nome do identificador" +msgid "If this is set, the asset gets a custom ID, otherwise it takes the name of the class used to define the menu (for example, if the class name is \"OBJECT_AST_hello\", and bl_idname is not set by the script, then bl_idname = \"OBJECT_AST_hello\")" +msgstr "Caso isto seja configurado, a lista de interface de usuário \"uilist\" terá um identificador personalizado, caso contrário, ela terá o nome da classe usada para definir a lista (por exemplo, caso o nome da classe seja \"OBJECT_UL_vgroups\", e o bl_idname não seja configurado pelo script, então o bl_idname = \"OBJECT_UL_vgroups\")" + + msgid "Options" msgstr "Opções" +msgid "Options for this asset shelf type" +msgstr "Opções para este tipo de prateleira de ativos" + + +msgid "No Asset Dragging" +msgstr "Sem arrastar ativos" + + msgid "Space Type" msgstr "Tipo de espaço" +msgid "The space where the asset shelf is going to be used in" +msgstr "O espaço no qual a prateleira de ativos será utilizada" + + +msgid "Preview Size" +msgstr "Tamanho da visualização" + + +msgid "Size of the asset preview thumbnails in pixels" +msgstr "Tamanho das miniaturas de visualização de ativos em pixels" + + msgid "Display Filter" msgstr "Mostrar filtro" +msgid "Filter assets by name" +msgstr "Filtrar ativos por nome" + + msgid "Show Names" msgstr "Mostrar nomes" +msgid "Show the asset name together with the preview. Otherwise only the preview will be visible" +msgstr "Mostre o nome do ativo junto com a visualização. Caso contrário, apenas a pré-visualização ficará visível" + + +msgid "Asset Tag" +msgstr "Etiqueta de ativo" + + +msgid "User defined tag (name token)" +msgstr "Etiqueta definida pelo usuário (nome simbólico)" + + +msgid "The identifier that makes up this tag" +msgstr "O identificador que compõe esta etiqueta" + + +msgid "Asset Tags" +msgstr "Etiquetas de Ativos" + + +msgid "Collection of custom asset tags" +msgstr "Coleção de etiquetas de ativos personalizadas" + + +msgid "Geometry attribute" +msgstr "Atributo de geometria" + + msgid "Data Type" msgstr "Tipo de dados" +msgid "Type of data stored in attribute" +msgstr "Tipo de dados armazenados no atributo" + + msgid "Float" msgstr "Ponto flutuante" +msgid "Floating-point value" +msgstr "Valor em ponto flutuante" + + msgid "Integer" msgstr "Inteiro" +msgid "32-bit integer" +msgstr "Inteiro de 32 bits" + + msgid "Vector" msgstr "Vetor" +msgid "3D vector with floating-point values" +msgstr "Vetor 3D com valores do tipo ponto flutuante" + + +msgid "RGBA color with 32-bit floating-point values" +msgstr "Cor RGBA com valores de ponto flutuante de 32 bits" + + msgid "String" msgstr "Variável de texto" +msgid "Text string" +msgstr "Sequência de texto" + + msgid "Boolean" msgstr "Booliana" @@ -1244,46 +1452,202 @@ msgid "2D Vector" msgstr "Vetor 2D" +msgid "2D vector with floating-point values" +msgstr "Vetor 2D com valores de ponto flutuante" + + +msgid "8-Bit Integer" +msgstr "Inteiro de 8 bits" + + +msgid "Smaller integer with a range from -128 to 127" +msgstr "Inteiro curto, com intervalo de -128 a 127" + + +msgid "2D Integer Vector" +msgstr "Vetor de inteiros 2D" + + +msgid "32-bit signed integer vector" +msgstr "Vetor de inteiro de 32 bits com sinal" + + msgid "Quaternion" msgstr "Quaternião" +msgid "Floating point quaternion rotation" +msgstr "Rotação de quatérnio de ponto flutuante" + + msgid "Domain" msgstr "Domínio" +msgid "Domain of the Attribute" +msgstr "Domínio do Atributo" + + msgid "Point" msgstr "Pontos" +msgid "Attribute on point" +msgstr "Atributo no ponto" + + msgid "Edge" msgstr "Arestas" +msgid "Attribute on mesh edge" +msgstr "Atributo na aresta da malha" + + msgid "Face" msgstr "Faces" +msgid "Attribute on mesh faces" +msgstr "Atributo em faces de malha" + + msgid "Face Corner" msgstr "Canto da Face" +msgid "Attribute on mesh face corner" +msgstr "Atributo no canto da face da malha" + + msgid "Spline" msgstr "Spline" +msgid "Attribute on spline" +msgstr "Atributo na curva" + + msgid "Instance" msgstr "Instância" +msgid "Attribute on instance" +msgstr "Atributo na instância" + + msgid "Layer" msgstr "Camadas" +msgid "Is Internal" +msgstr "É interno" + + +msgid "The attribute is meant for internal use by Blender" +msgstr "O atributo é destinado ao uso interno do Blender" + + +msgid "Is Required" +msgstr "É necessário" + + +msgid "Whether the attribute can be removed or renamed" +msgstr "Se o atributo pode ser removido ou renomeado" + + +msgid "Name of the Attribute" +msgstr "Nome do Atributo" + + +msgid "Bool Attribute" +msgstr "Atributo Booleano" + + +msgid "Geometry attribute that stores booleans" +msgstr "Atributo de geometria que armazena booleanos" + + +msgid "Byte Color Attribute" +msgstr "Atributo de cor de byte" + + +msgid "Geometry attribute that stores RGBA colors as positive integer values using 8-bits per channel" +msgstr "Atributo de geometria que armazena cores RGBA como valores inteiros positivos usando 8 bits por canal" + + +msgid "Geometry attribute that stores 8-bit integers" +msgstr "Atributo de geometria que armazena inteiros de 8-bits" + + +msgid "Geometry attribute that stores floating-point 2D vectors" +msgstr "Atributo de geometria que armazena vetores 2D de ponto flutuante" + + +msgid "Float Attribute" +msgstr "Atributo decimal (Float)" + + +msgid "Geometry attribute that stores floating-point values" +msgstr "Atributo de geometria que armazena valores decimais (de ponto flutuante)" + + +msgid "Float Color Attribute" +msgstr "Atributo decimal de cor (Float)" + + +msgid "Geometry attribute that stores RGBA colors as floating-point values using 32-bits per channel" +msgstr "Atributo de geometria que armazena cores RGBA como valores de ponto flutuante usando 32 bits por canal" + + +msgid "Float Vector Attribute" +msgstr "Vetor de atributo decimal (Float)" + + +msgid "Geometry attribute that stores floating-point 3D vectors" +msgstr "Atributo de geometria que armazena vetores 3D de ponto flutuante" + + +msgid "2D Integer Vector Attribute" +msgstr "Atributo de vetor 2D de inteiros" + + +msgid "Geometry attribute that stores 2D integer vectors" +msgstr "Atributo de geometria que armazena vetores 2D de inteiros" + + +msgid "Integer Attribute" +msgstr "Atributo de Inteiro" + + +msgid "Geometry attribute that stores integer values" +msgstr "Atributo de geometria que armazena valores inteiros" + + +msgid "Quaternion Attribute" +msgstr "Atributo Quatérnio" + + +msgid "Geometry attribute that stores rotation" +msgstr "Atributo de geometria que armazena rotação" + + msgid "String Attribute" msgstr "Atributo do Fio" +msgid "Geometry attribute that stores strings" +msgstr "Atributo de geometria que armazena sequências de texto" + + +msgid "Attribute Group" +msgstr "Grupo de Atributos" + + +msgid "Group of geometry attributes" +msgstr "Grupo de atributos de geometria" + + msgid "Active Attribute" msgstr "Atributo Ativo" @@ -1292,6 +1656,34 @@ msgid "Active attribute" msgstr "Atributo ativo" +msgid "Active Color" +msgstr "Cor Ativa" + + +msgid "Active color attribute for display and editing" +msgstr "Atributo de cor ativo para exibição e edição" + + +msgid "Active color attribute index" +msgstr "Índice de atributos de cores ativos" + + +msgid "Active Color Attribute" +msgstr "Atributo de cor ativo" + + +msgid "The name of the active color attribute for display and editing" +msgstr "O nome do atributo de cor ativo para exibição e edição" + + +msgid "Active Attribute Index" +msgstr "Índice do Atributo Ativo" + + +msgid "Active attribute index" +msgstr "Índice do atributo ativo" + + msgid "Bake Data" msgstr "Gerar e gravar dados" @@ -9309,6 +9701,18 @@ msgid "Whether this path is saved in bookmarks, or generated from OS" msgstr "Permite definir se este caminho será salvo através da marcação de favoritos, ou gerado a partir do sistema operacional." +msgid "File Extensions" +msgstr "Extensões de arquivo" + + +msgid "Operator" +msgstr "Operador" + + +msgid "Label" +msgstr "Rótulo" + + msgid "A file viewable in the File Browser" msgstr "Arquivo visualizável no Navegador de Arquivos" @@ -15187,10 +15591,6 @@ msgid "Node tree consisting of linked nodes used for shading, textures and compo msgstr "Árvore de nós consistindo de nós conectados, usados para sombreamento, texturas e composição." -msgid "Label" -msgstr "Rótulo" - - msgid "The node tree label" msgstr "O rótulo da árvore de nós." @@ -38370,10 +38770,6 @@ msgid "Reverse Colors" msgstr "Inverter as cores" -msgid "Flip direction of vertex colors inside faces" -msgstr "Alterna a direção da pintura das cores dos vértices nas faces selecionadas." - - msgctxt "Operator" msgid "Rotate Colors" msgstr "Rotacionar cores" @@ -46620,10 +47016,6 @@ msgid "Mask Filter" msgstr "Filtro de Máscara" -msgid "Operator" -msgstr "Operador" - - msgctxt "Operator" msgid "Init Mask" msgstr "Máscara de inicialização" @@ -51869,14 +52261,6 @@ msgid "Active Palette Color" msgstr "Cor ativa da paleta" -msgid "Refraction" -msgstr "Refração" - - -msgid "Denoising" -msgstr "Redução de ruídos" - - msgid "Integrator Presets" msgstr "Predefinições de integrador" @@ -52361,6 +52745,10 @@ msgid "Indirect Lighting" msgstr "Iluminação indireta" +msgid "Denoising" +msgstr "Redução de ruídos" + + msgid "Shadows" msgstr "Sombras" @@ -56957,10 +57345,6 @@ msgid "Crop the rendered frame to the defined render region size" msgstr "Recorta o quadro renderizado para o tamanho definido nas margens" -msgid "File Extensions" -msgstr "Extensões de arquivo" - - msgid "Add the file format extensions to the rendered file name (eg: filename + .jpg)" msgstr "Adiciona as extensões de formato de arquivo como sufixos para os nomes dos arquivos renderizados (exemplo: nome_do_arquivo + \".jpg\")." @@ -63410,8 +63794,8 @@ msgid "Display vertex-per-face normals as lines" msgstr "Mostra as normais dos vértices por face como linhas." -msgid "Stat Vis" -msgstr "Visualização de estatísticas" +msgid "Mesh Analysis" +msgstr "Análise da malha" msgid "Display statistical information about the mesh" @@ -65205,6 +65589,10 @@ msgid "Auto-Step" msgstr "Passos automáticos" +msgid "Refraction" +msgstr "Refração" + + msgctxt "Operator" msgid "Bake Indirect Lighting" msgstr "Capturar Luz Indireta" @@ -67241,11 +67629,6 @@ msgid "Clear Mask" msgstr "Limpar máscara" -msgctxt "Operator" -msgid "Invert Visible Face Sets" -msgstr "Inverter Conjunto de Faces Visíveis" - - msgctxt "Operator" msgid "By Loose Parts" msgstr "Através das partes soltas" @@ -67429,10 +67812,6 @@ msgid "Seams" msgstr "Costuras" -msgid "Mesh Analysis" -msgstr "Análise da malha" - - msgid "Edge Marks" msgstr "Marcações de arestas" @@ -68154,10 +68533,6 @@ msgid "Int" msgstr "Inteiro" -msgid "PreviewCol" -msgstr "Cor de previsão" - - msgid "TexturedCol" msgstr "Cor texturizada" @@ -68182,10 +68557,6 @@ msgid "OS Loop" msgstr "Ciclo de sistema operacional" -msgid "PreviewLoopCol" -msgstr "Previsão de ciclo de cor" - - msgid "Int8" msgstr "Int8" @@ -71868,6 +72239,10 @@ msgid "File '%s' could not be loaded" msgstr "Arquivo '%s' não pode ser carregado." +msgid "Please select all related strips" +msgstr "Por favor, selecione as faixas relacionadas." + + msgid "Cannot apply effects to audio sequence strips" msgstr "Não é possível aplicar efeitos para as faixas de sequência de áudio." @@ -71892,10 +72267,6 @@ msgid "No valid inputs to swap" msgstr "Sem entradas válidas para trocar." -msgid "Please select all related strips" -msgstr "Por favor, selecione as faixas relacionadas." - - msgid "Please select two strips" msgstr "Por favor, selecione duas faixas." diff --git a/locale/po/ru.po b/locale/po/ru.po index 91ebf8efc79..02143342c2c 100644 --- a/locale/po/ru.po +++ b/locale/po/ru.po @@ -1,17 +1,18 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" -"PO-Revision-Date: 2018-01-03 14:47+0000\n" -"Last-Translator: Lockal , 2023\n" -"Language-Team: Russian (https://app.transifex.com/translateblender/teams/82039/ru/)\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" +"PO-Revision-Date: 2023-12-11 03:52+0000\n" +"Last-Translator: Lockal \n" +"Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" +"X-Generator: Weblate 5.0.1" msgid "Shader AOV" @@ -339,13 +340,37 @@ msgstr "Полностью" msgid "Optimize all kernels. Fastest rendering, may result in extra background CPU usage" -msgstr "Оптимизировать все ядра. Самый быстрый рендеринг, может привести к дополнительной загрузке процессора в фоновом режиме." +msgstr "Оптимизировать все ядра. Самый быстрый рендеринг, может привести к дополнительной загрузке процессора в фоновом режиме" + + +msgid "MetalRT" +msgstr "MetalRT" + + +msgid "MetalRT for ray tracing uses less memory for scenes which use curves extensively, and can give better performance in specific cases" +msgstr "MetalRT для трассировки лучей использует меньше памяти для сцен, в которых широко используются кривые, и в определенных случаях может обеспечить более высокую производительность" + + +msgid "Disable MetalRT (uses BVH2 layout for intersection queries)" +msgstr "Отключить MetalRT (использует систему BVH2 для запросов на пересечение)" + + +msgid "On" +msgstr "Включить" + + +msgid "Enable MetalRT for intersection queries" +msgstr "Включить MetalRT для запросов на пересечение" msgid "Auto" msgstr "Авто" +msgid "Automatically pick the fastest intersection method" +msgstr "Автоматически выбрать быстрейший метод пересечений" + + msgid "Distribute memory across devices" msgstr "Распределить память между устройствами" @@ -354,6 +379,22 @@ msgid "Make more room for large scenes to fit by distributing memory across inte msgstr "Освободите место для больших сцен, распределяя память между взаимосвязанными устройствами (например, через NVLink), а не дублируя ее" +msgid "HIP RT (Experimental)" +msgstr "HIP RT (экспериментально)" + + +msgid "HIP RT enables AMD hardware ray tracing on RDNA2 and above, with shader fallback on older cards. This feature is experimental and some scenes may render incorrectly" +msgstr "HIP RT позволяет использовать аппаратную трассировку лучей AMD на картах RDNA2 и выше, с резервной реализацией шейдеров на более ранних картах. Данная функция является экспериментальной, и некоторые сцены могут отображаться некорректно" + + +msgid "Embree on GPU" +msgstr "Embree на GPU" + + +msgid "Embree on GPU enables the use of hardware ray tracing on Intel GPUs, providing better overall performance" +msgstr "Embree с помощью GPU позволяет использовать аппаратную трассировку лучей на графических процессорах Intel, обеспечивая более высокую общую производительность" + + msgid "KHR_materials_variants_ui" msgstr "KHR_materials_variants_ui" @@ -362,6 +403,10 @@ msgid "Displays glTF UI to manage material variants" msgstr "Показать пользовательский интерфейс glTF для управления вариантами материалов" +msgid "Display glTF UI to manage animations" +msgstr "Показать пользовательский интерфейс glTF для управления анимациями" + + msgid "Displays glTF Material Output node in Shader Editor (Menu Add > Output)" msgstr "Отобразить ноду вывода материала glTF в редакторе шейдеров (меню Добавить > Вывод)" @@ -370,6 +415,10 @@ msgid "Fribidi Library" msgstr "Библиотека FriBidi" +msgid "The FriBidi C compiled library (.so under Linux, .dll under windows...), you’ll likely have to edit it if you’re under Windows, e.g. using the one included in Blender libraries repository" +msgstr "Скомпилированная библиотека FriBidi на языке Си (.so в Linux, .dll в windows…). Для работы в Windows необходимо вручную указать правильный путь, например, на файл из репозитария библиотек Blender" + + msgid "Translation Root" msgstr "Корневая папка переводов" @@ -467,7 +516,7 @@ msgstr "Данные клипа будут комбинироваться с р msgid "Add" -msgstr "Добавить" +msgstr "Добавление" msgid "Weighted result of strip is added to the accumulated results" @@ -483,7 +532,7 @@ msgstr "Взвешенный результат клипа удаляется и msgid "Multiply" -msgstr "Умножить" +msgstr "Умножение" msgid "Weighted result of strip is multiplied with the accumulated results" @@ -530,6 +579,14 @@ msgid "Amount the Active Action contributes to the result of the NLA stack" msgstr "Вклад активного действия, вносимый в результирующий стек НЛА" +msgid "Tweak Mode Action Storage" +msgstr "Хранилище данных о действиях в режиме подстройки" + + +msgid "Slot to temporarily hold the main action while in tweak mode" +msgstr "Слот для временного удержания основного действия в режиме подстройки" + + msgid "Drivers" msgstr "Драйверы" @@ -607,7 +664,7 @@ msgstr "Расчёт траекторий кости с их начала" msgid "Tails" -msgstr "Концы" +msgstr "Оконцовки" msgid "Calculate bone paths from tails" @@ -795,7 +852,7 @@ msgstr "Показать меню в заголовке" msgid "Spaces" -msgstr "Spaces" +msgstr "Пробелы" msgid "Spaces contained in this area, the first being the active space (NOTE: Useful for example to restore a previously used 3D view space in a certain area to get the old view orientation)" @@ -1094,6 +1151,10 @@ msgid "Copyright" msgstr "Копирайт" +msgid "Copyright notice for this asset. An empty copyright notice does not necessarily indicate that this is copyright-free. Contact the author if any clarification is needed" +msgstr "Уведомление об авторских правах на этот ассет. Отсутствие информации об авторских правах не обязательно означает, что он не защищен авторскими правами. Свяжитесь с автором, если необходимы какие-либо разъяснения" + + msgid "Description" msgstr "Описание" @@ -1106,6 +1167,10 @@ msgid "License" msgstr "Лицензия" +msgid "The type of license this asset is distributed under. An empty license name does not necessarily indicate that this is free of licensing terms. Contact the author if any clarification is needed" +msgstr "Тип лицензии, по которой распространяется этот ассет. Отсутствие информации о лицензии не обязательно означает, что на него не распространены условия лицензирования. Свяжитесь с автором, если необходимы какие-либо разъяснения" + + msgid "Tags" msgstr "Теги" @@ -1114,6 +1179,39 @@ msgid "Custom tags (name tokens) for the asset, used for filtering and general a msgstr "Пользовательские теги (метки) для ассета, используемые для фильтрации и управления ассетами" +msgid "Asset Representation" +msgstr "Представление ассета" + + +msgid "Information about an entity that makes it possible for the asset system to deal with the entity as asset" +msgstr "Информация об объекте, позволяющая системе ассетов работать с ним как с ассетом" + + +msgid "Full Library Path" +msgstr "Полный путь к библиотеке" + + +msgid "Absolute path to the .blend file containing this asset" +msgstr "Абсолютный путь к файлу .blend, содержащему этот ассет" + + +msgid "Full Path" +msgstr "Полный путь" + + +msgid "Absolute path to the .blend file containing this asset extended with the path of the asset inside the file" +msgstr "Абсолютный путь к .blend-файлу, содержащему данный ассет, расширенный за счет пути ассета внутри файла" + + +msgctxt "ID" +msgid "Data-block Type" +msgstr "Тип блока данных" + + +msgid "The type of the data-block, if the asset represents one ('NONE' otherwise)" +msgstr "Тип блока данных, если файл является блоком данных (иначе 'NONE')" + + msgctxt "ID" msgid "Action" msgstr "Действие" @@ -1164,6 +1262,11 @@ msgid "Grease Pencil" msgstr "Grease Pencil" +msgctxt "ID" +msgid "Grease Pencil v3" +msgstr "Grease Pencil v3" + + msgctxt "ID" msgid "Image" msgstr "Изображение" @@ -1259,6 +1362,11 @@ msgid "Scene" msgstr "Сцена" +msgctxt "ID" +msgid "Screen" +msgstr "Экран" + + msgctxt "ID" msgid "Sound" msgstr "Звук" @@ -1299,14 +1407,58 @@ msgid "World" msgstr "Мир" +msgid "The local data-block this asset represents; only valid if that is a data-block in this file" +msgstr "Локальный дата-блок, который представляет этот ассет; действителен только в том случае, если это дата-блок в данном файле" + + +msgid "Asset Metadata" +msgstr "Метаданные ассета" + + +msgid "Additional information about the asset" +msgstr "Дополнительная информация об ассете" + + +msgid "Asset Shelf" +msgstr "Полка с ассетами" + + +msgid "Regions for quick access to assets" +msgstr "Регионы для быстрого доступа к ассетам" + + msgid "Asset Library" msgstr "Библиотека ассетов" +msgid "Choose the asset library to display assets from" +msgstr "Выберите библиотеку ассетов, из которой будут отображаться ассеты" + + msgid "All" msgstr "Все" +msgid "Show assets from all of the listed asset libraries" +msgstr "Показать ассеты из всех перечисленных библиотек ассетов" + + +msgid "Current File" +msgstr "Текущий файл" + + +msgid "Show the assets currently available in this Blender session" +msgstr "Показать ассеты, доступные в текущей сессии Blender" + + +msgid "Essentials" +msgstr "Основные" + + +msgid "Show the basic building blocks and utilities coming with Blender" +msgstr "Покажите базовые блоки и средства, входящие в состав Blender" + + msgid "Custom" msgstr "Особый" @@ -1315,22 +1467,58 @@ msgid "ID Name" msgstr "Имя идентификатора" +msgid "If this is set, the asset gets a custom ID, otherwise it takes the name of the class used to define the menu (for example, if the class name is \"OBJECT_AST_hello\", and bl_idname is not set by the script, then bl_idname = \"OBJECT_AST_hello\")" +msgstr "Если установлено, ассет приобретает особый идентификатор. В противном случае он принимает имя класса, используемого для определения меню (например, если имя класса «OBJECT_AST_hello» и bl_idname не установлено скриптом, тогда bl_idname = \"OBJECT_AST_hello\")" + + msgid "Options" msgstr "Опции" +msgid "Options for this asset shelf type" +msgstr "Опции для данного типа полки ассетов" + + +msgid "No Asset Dragging" +msgstr "Отключить перетаскивание ассетов" + + +msgid "Disable the default asset dragging on drag events. Useful for implementing custom dragging via custom key-map items" +msgstr "Отключить перетаскивание ассетов по умолчанию по событиям перетаскивания. Полезно для реализации пользовательского перетаскивания через пользовательские элементы карты клавиш" + + msgid "Space Type" msgstr "Тип пространства" +msgid "The space where the asset shelf is going to be used in" +msgstr "Пространство, в котором будет использоваться полка ассетов" + + +msgid "Preview Size" +msgstr "Размер предпросмотра" + + +msgid "Size of the asset preview thumbnails in pixels" +msgstr "Размер миниатюр предварительного просмотра ассетов в пикселях" + + msgid "Display Filter" msgstr "Фильтр отображения" +msgid "Filter assets by name" +msgstr "Фильтровать ассеты по имени" + + msgid "Show Names" msgstr "Отображать имена" +msgid "Show the asset name together with the preview. Otherwise only the preview will be visible" +msgstr "Показывать имя ассета вместе с предварительным просмотром. В противном случае будет виден только предварительный просмотр" + + msgid "Asset Tag" msgstr "Тег ассета" @@ -1351,6 +1539,14 @@ msgid "Collection of custom asset tags" msgstr "Коллекция тегов ассета" +msgid "Asset Weak Reference" +msgstr "Слабая ссылка на ассет" + + +msgid "Weak reference to some asset" +msgstr "Слабая ссылка на ассет" + + msgid "Geometry attribute" msgstr "Атрибут геометрии" @@ -1431,10 +1627,22 @@ msgid "Smaller integer with a range from -128 to 127" msgstr "Целое число в диапазоне от -128 до 127" +msgid "2D Integer Vector" +msgstr "2D-вектор целых чисел" + + +msgid "32-bit signed integer vector" +msgstr "32-битный целочисленный вектор со знаком" + + msgid "Quaternion" msgstr "Кватернион" +msgid "Floating point quaternion rotation" +msgstr "Вращение кватерниона с плавающей точкой" + + msgid "Domain" msgstr "Домен" @@ -1495,6 +1703,10 @@ msgid "Layer" msgstr "Слой" +msgid "Attribute on Grease Pencil layer" +msgstr "Атрибут слоя Grease Pencil" + + msgid "Is Internal" msgstr "Является внутренним" @@ -1503,6 +1715,14 @@ msgid "The attribute is meant for internal use by Blender" msgstr "Атрибут предназначен для внутреннего использования в Blender" +msgid "Is Required" +msgstr "Является обязательным" + + +msgid "Whether the attribute can be removed or renamed" +msgstr "Возможность удалить или переименовать атрибут" + + msgid "Name of the Attribute" msgstr "Имя атрибута" @@ -1523,14 +1743,30 @@ msgid "Geometry attribute that stores RGBA colors as positive integer values usi msgstr "Атрибут геометрии, который хранит цвета RGBA как положительные целочисленные значения, используя 8 бит на канал" +msgid "8-bit Integer Attribute" +msgstr "Атрибут 8-битного целого числа" + + +msgid "Geometry attribute that stores 8-bit integers" +msgstr "Атрибут геометрии, хранящий 8-битные целые числа" + + msgid "Float2 Attribute" msgstr "Атрибут Float2" +msgid "Geometry attribute that stores floating-point 2D vectors" +msgstr "Атрибут геометрии, хранящий двумерные векторы с плавающей точкой" + + msgid "Float Attribute" msgstr "Числовой атрибут с плавающей точкой" +msgid "Geometry attribute that stores floating-point values" +msgstr "Атрибут геометрии, хранящий значения с плавающей точкой" + + msgid "Float Color Attribute" msgstr "Атрибут цвета с плавающей точкой" @@ -1543,10 +1779,42 @@ msgid "Float Vector Attribute" msgstr "Атрибут вектора чисел с плавающей точкой" +msgid "Geometry attribute that stores floating-point 3D vectors" +msgstr "Атрибут геометрии, хранящий 3D-векторы с плавающей точкой" + + +msgid "2D Integer Vector Attribute" +msgstr "Атрибут двухмерного целочисленного вектора" + + +msgid "Geometry attribute that stores 2D integer vectors" +msgstr "Атрибут геометрии, хранящий двумерные целочисленные векторы" + + +msgid "Integer Attribute" +msgstr "Целочисленный атрибут" + + +msgid "Geometry attribute that stores integer values" +msgstr "Атрибут геометрии, хранящий целочисленные значения" + + +msgid "Quaternion Attribute" +msgstr "Атрибут-кватернион" + + +msgid "Geometry attribute that stores rotation" +msgstr "Атрибут геометрии, хранящий вращение" + + msgid "String Attribute" msgstr "Строковой атрибут" +msgid "Geometry attribute that stores strings" +msgstr "Атрибут геометрии, хранящий строки" + + msgid "Attribute Group" msgstr "Группа атрибутов" @@ -1563,6 +1831,54 @@ msgid "Active attribute" msgstr "Активный атрибут" +msgid "Active Color" +msgstr "Активный цвет" + + +msgid "Active color attribute for display and editing" +msgstr "Активный атрибут цвета для отображения и редактирования" + + +msgid "Active Color Index" +msgstr "Индекс активного цвета" + + +msgid "Active color attribute index" +msgstr "Индекс атрибута активного цвета" + + +msgid "Active Color Attribute" +msgstr "Активный атрибут цвета" + + +msgid "The name of the active color attribute for display and editing" +msgstr "Имя активного атрибута цвета для отображения и редактирования" + + +msgid "Active Attribute Index" +msgstr "Индекс активного атрибута" + + +msgid "Active attribute index" +msgstr "Индекс активного атрибута" + + +msgid "Default Color Attribute" +msgstr "Атрибут цвета по умолчанию" + + +msgid "The name of the default color attribute used as a fallback for rendering" +msgstr "Имя атрибута цвета по умолчанию, используемого в качестве резервного варианта при рендеринге" + + +msgid "Active Render Color Index" +msgstr "Индекс цвета активного рендеринга" + + +msgid "The index of the color attribute used as a fallback for rendering" +msgstr "Индекс цветового атрибута, используемого в качестве резервного при рендеринге" + + msgid "Bake Data" msgstr "Данные запекания" @@ -1611,10 +1927,30 @@ msgid "Extends the baked result as a post process filter" msgstr "Расширить результат запекания с помощью фильтра постобработки" +msgid "Margin Type" +msgstr "Тип отступа" + + +msgid "Algorithm to extend the baked result" +msgstr "Алгоритм расширения запеченного результата" + + +msgid "Adjacent Faces" +msgstr "Примыкающие грани" + + +msgid "Use pixels from adjacent faces across UV seams" +msgstr "Использовать пиксели с примыкающих граней через UV-швы" + + msgid "Extend" msgstr "Расширить" +msgid "Extend border pixels outwards" +msgstr "Расширить границы пикселей за пределы" + + msgid "Max Ray Distance" msgstr "Макс. расстояние луча" @@ -1680,7 +2016,7 @@ msgstr "Тангенс" msgid "Bake the normals in tangent space" -msgstr "Запечь нормали в тангенциальном пространстве (пространстве касательной)" +msgstr "Запечь нормали в тангенциальном пространстве (пространстве касательных)" msgid "Pass Filter" @@ -1708,7 +2044,7 @@ msgstr "Отражённое" msgid "Diffuse" -msgstr "Диффуз." +msgstr "Диффузная" msgid "Glossy" @@ -1759,6 +2095,10 @@ msgid "Bake to image data-blocks associated with active image texture nodes in m msgstr "Запечь в датаблоки изображений, связанных с активным нодом изобрежения-текстуры в материалах" +msgid "Bake to the active color attribute on meshes" +msgstr "Запечь активный атрибут цвета на мешах" + + msgid "Automatic Name" msgstr "Автоматическое имя" @@ -1827,14 +2167,30 @@ msgid "Split external images per material (external only)" msgstr "Разделить изображения по материалу (только для внешних изображений)" +msgid "View From" +msgstr "Вид с" + + +msgid "Source of reflection ray directions" +msgstr "Источник направлений лучей отражения" + + msgid "Above Surface" msgstr "Над поверхностью" +msgid "Cast rays from above the surface" +msgstr "Отбрасывать лучи от поверхности" + + msgid "Active Camera" msgstr "Активная камера" +msgid "Use the active camera's position to cast rays" +msgstr "Использовать положение активной камеры для отбрасывания лучей" + + msgid "Horizontal dimension of the baking map" msgstr "Горизонтальное разрешение запекаемой карты" @@ -2031,10 +2387,26 @@ msgid "Grease Pencil" msgstr "Grease Pencil" +msgid "Grease Pencil data-blocks" +msgstr "Датаблоки Grease Pencil" + + +msgid "Grease Pencil v3" +msgstr "Grease Pencil v3" + + +msgid "Grease Pencil v3 data-blocks" +msgstr "Датаблоки Grease Pencil v3" + + msgid "Hair Curves" msgstr "Кривые волос" +msgid "Hair curve data-blocks" +msgstr "Датаблоки кривых волос" + + msgid "Images" msgstr "Изображения" @@ -2183,6 +2555,10 @@ msgid "Point Clouds" msgstr "Облака точек" +msgid "Point cloud data-blocks" +msgstr "Датаблоки облак точек" + + msgid "Scenes" msgstr "Сцены" @@ -2256,7 +2632,7 @@ msgstr "Версия Blender, в которой сохранён .blend-файл msgid "Volumes" -msgstr "Volumes" +msgstr "Объёмы" msgid "Volume data-blocks" @@ -2359,6 +2735,10 @@ msgid "Collection of grease pencils" msgstr "Коллекция Grease Pencil" +msgid "Main Hair Curves" +msgstr "Основные кривые волос" + + msgid "Collection of hair curves" msgstr "Коллекция кривых волос" @@ -2483,6 +2863,10 @@ msgid "Collection of particle settings" msgstr "Коллекция параметров частиц" +msgid "Main Point Clouds" +msgstr "Основные облака точек" + + msgid "Collection of point clouds" msgstr "Коллекция облаков точек" @@ -3134,7 +3518,7 @@ msgstr "Способ вычисления рукоятки конца B-кост msgid "Automatic" -msgstr "Автоматический" +msgstr "Автоматически" msgid "Use connected parent and children to compute the handle" @@ -3201,14 +3585,30 @@ msgid "Multiply B-Bone Scale In channels by the local scale values of the start msgstr "Умножить каналы масштаба начала (Scale In) B-кости на локальные значения масштаба начальной рукоятки. Это выполняется после масштабирования ослабления и не зависит от него" +msgid "B-Bone Vertex Mapping Mode" +msgstr "Режим сопоставления вершин B-кости" + + +msgid "Selects how the vertices are mapped to B-Bone segments based on their position" +msgstr "Выбор способа отображения вершин на сегменты B-кости в зависимости от их положения" + + msgid "Straight" msgstr "Прямой" +msgid "Fast mapping that is good for most situations, but ignores the rest pose curvature of the B-Bone" +msgstr "Выбор способа сопоставления вершин с сегментами B-костей в зависимости от их положения" + + msgid "Curved" msgstr "По кривой" +msgid "Slower mapping that gives better deformation for B-Bones that are sharply curved in rest pose" +msgstr "Более медленное отображение, обеспечивающее лучшую деформацию B-кости, резко изогнутой в позе покоя" + + msgid "Roll In" msgstr "Крен начало" @@ -3273,6 +3673,10 @@ msgid "Bones which are children of this bone" msgstr "Кости, являющиеся потомками этой кости" +msgid "Bone Collections that contain this bone" +msgstr "Коллекции костей, в которых содержится эта кость" + + msgid "Envelope Deform Distance" msgstr "Расстояние деформации оболочки" @@ -3346,7 +3750,7 @@ msgstr "Наследовать масштаб, но убрать скос с п msgid "Rotate non-uniform parent scaling to align with the child, applying parent X scale to child X axis, and so forth" -msgstr "Повернуть неравномерные родительские масштабы для выравнивания с потомком, применив применив родительский X-масштаб к X-масштабу потомка и т. д." +msgstr "Повернуть неравномерные родительские масштабы для выравнивания с потомком, применив родительский X-масштаб к X-масштабу потомка и т. д" msgid "Inherit uniform scaling representing the overall change in the volume of the parent" @@ -3362,7 +3766,7 @@ msgstr "Нет (старое)" msgid "Ignore parent scaling without compensating for parent shear. Replicates the effect of disabling the original Inherit Scale checkbox" -msgstr "Игнорировать масштаб без компенсации родительского скоса. Повторяет поведение старой версии с отключённым масштабированием." +msgstr "Игнорировать масштаб без компенсации родительского скоса. Повторяет поведение старой версии с отключённым масштабированием" msgid "Length" @@ -3377,10 +3781,18 @@ msgid "Bone Matrix" msgstr "Матрица кости" +msgid "3×3 bone matrix" +msgstr "Матрица кости 3×3" + + msgid "Bone Armature-Relative Matrix" msgstr "Матрица кости относительно арматуры" +msgid "4×4 bone matrix relative to armature" +msgstr "Матрица кости 4×4 по отношению к арматуре" + + msgid "Parent" msgstr "Родитель" @@ -3501,18 +3913,90 @@ msgid "Multiply the final easing values by the Scale In/Out Y factors" msgstr "Умножить окончательные значения ослабления на множители масштаба начала/конца по Y" +msgid "Bone collection in an Armature data-block" +msgstr "Коллекция костей в датаблоке арматуры" + + msgid "Bones" msgstr "Кости" +msgid "Bones assigned to this bone collection. In armature edit mode this will always return an empty list of bones, as the bone collection memberships are only synchronized when exiting edit mode" +msgstr "Кости, назначенные этой коллекции костей. В режиме редактирования скелета всегда будет возвращаться пустой список костей, так как состав коллекции костей синхронизируется только при выходе из режима редактирования" + + +msgid "Is Editable" +msgstr "Можно редактировать" + + +msgid "This collection is owned by a local Armature, or was added via a library override in the current blend file" +msgstr "Эта коллекция принадлежит локальному скелету или была добавлена через переопределение библиотеки в текущем blend-файле" + + +msgid "Is Local Override" +msgstr "Локально переопределена" + + +msgid "This collection was added via a library override in the current blend file" +msgstr "Эта коллекция была добавлена через переопределение библиотеки в текущем blend-файле" + + msgid "Visible" msgstr "Видимо" +msgid "Bones in this collection will be visible in pose/object mode" +msgstr "Показывать кости из этой коллекции в режиме позы/объекта" + + +msgid "Unique within the Armature" +msgstr "Уникальное в скелете" + + +msgid "Bone Collection Memberships" +msgstr "Принадлежность к коллекциям костей" + + +msgid "The Bone Collections that contain this Bone" +msgstr "Коллекции костей, которые содержат эту кость" + + +msgid "Armature Bone Collections" +msgstr "Коллекции костей скелета" + + +msgid "The Bone Collections of this Armature" +msgstr "Коллекции костей этого скелета" + + msgid "Active Collection" msgstr "Активная коллекция" +msgid "The index of the Armature's active bone collection; -1 when there is no active collection" +msgstr "Индекс активной коллекции костей скелета; -1, если активной коллекции нет" + + +msgid "The name of the Armature's active bone collection; empty when there is no active collection" +msgstr "Имя активной коллекции костей скелета; пустое, если активной коллекции нет" + + +msgid "Theme color or custom color of a bone" +msgstr "Цвет темы или пользовательский цвет кости" + + +msgid "The custom bone colors, used when palette is 'CUSTOM'" +msgstr "Пользовательские цвета костей; используются, когда палитра имеет значение 'CUSTOM'" + + +msgid "A color palette is user-defined, instead of using a theme-defined one" +msgstr "Палитра цветов задана пользователем, а палитра темы не используется" + + +msgid "Color palette to use" +msgstr "Палитра цветов" + + msgid "Bool Attribute Value" msgstr "Значение булевого атрибута" @@ -3645,26 +4129,122 @@ msgid "Has Weight" msgstr "С весом" +msgid "Curves Sculpt Brush Settings" +msgstr "Настройки кисти скульптинга кривых" + + msgid "Count" msgstr "Количество" +msgid "Number of curves added by the Add brush" +msgstr "Количество кривых, добавляемых кистью" + + +msgid "Curve Length" +msgstr "Длина кривой" + + msgid "Length of newly added curves when it is not interpolated from other curves" msgstr "Длина добавленных кривых, если она не интерполирована от других кривых" +msgid "Curve Parameter Falloff" +msgstr "Спад параметров кривой" + + +msgid "Falloff that is applied from the tip to the root of each curve" +msgstr "Спад, применяемый от вершины к корню каждой кривой" + + +msgid "Density Add Attempts" +msgstr "Попытки добавления плотности" + + msgid "How many times the Density brush tries to add a new curve" msgstr "Количество попыток кисти «‎Плотность»‎ добавить новую кривую" +msgid "Density Mode" +msgstr "Режим плотности" + + +msgid "Determines whether the brush adds or removes curves" +msgstr "Добавлять или удалять кривые с помощью кисти" + + +msgid "Either add or remove curves depending on the minimum distance of the curves under the cursor" +msgstr "Добавлять или удалять кривые в зависимости от минимального расстояния между кривыми под курсором" + + +msgid "Add new curves between existing curves, taking the minimum distance into account" +msgstr "Добавлять новые кривые между существующими кривыми с учетом минимального расстояния" + + msgid "Remove" msgstr "Удалить" +msgid "Remove curves whose root points are too close" +msgstr "Удалять кривые, корневые точки которых расположены слишком близко" + + +msgid "Interpolate Length" +msgstr "Интерполировать длины" + + +msgid "Use length of the curves in close proximity" +msgstr "Использовать длину близкорасположенных кривых" + + +msgid "Interpolate Point Count" +msgstr "Интерполировать число точек" + + +msgid "Use the number of points from the curves in close proximity" +msgstr "Использовать количество точек близкорасположенных кривых" + + +msgid "Interpolate Shape" +msgstr "Интерполировать форму" + + +msgid "Use shape of the curves in close proximity" +msgstr "Использовать форму близкорасположенных кривых" + + msgid "Minimum Distance" msgstr "Мин. расстояние" +msgid "Goal distance between curve roots for the Density brush" +msgstr "Целевое расстояние между корнями кривых для кисти плотности" + + +msgid "Minimum Length" +msgstr "Минимальная длина" + + +msgid "Avoid shrinking curves shorter than this length" +msgstr "Не укорачивать кривые меньше этой длины" + + +msgid "Points per Curve" +msgstr "Точек на кривую" + + +msgid "Number of control points in a newly added curve" +msgstr "Количество контрольных точек во добавляемых кривых" + + +msgid "Scale Uniform" +msgstr "Равномерное масштабирование" + + +msgid "Grow or shrink curves by changing their size uniformly instead of using trimming or extrapolation" +msgstr "Увеличивать или уменьшать кривые, равномерно изменяя их размер, вместо того чтобы использовать обрезку или экстраполяцию" + + msgid "Grease Pencil Brush Settings" msgstr "Параметры кисти Grease Pencil" @@ -3769,6 +4349,14 @@ msgid "Curve used for the strength" msgstr "Кривая, используемая для интенсивности" +msgid "Dilate/Contract" +msgstr "Расширить/сократить" + + +msgid "Number of pixels to expand or contract fill area" +msgstr "Количество пикселей для расширения или сокращения области заливки" + + msgid "Direction" msgstr "Направление" @@ -3821,6 +4409,10 @@ msgid "Amount of erasing for thickness" msgstr "Величина стирания толщины" +msgid "Closure Size" +msgstr "Размер зазоров" + + msgid "Strokes end extension for closing gaps, use zero to disable" msgstr "Величина продления штрихов для замыкания контуров, используйте 0 для отключения" @@ -3869,10 +4461,26 @@ msgid "Use edit lines as fill boundary limits" msgstr "Использовать управляющие линии для заполнения границ" +msgid "Closure Mode" +msgstr "Режим зазоров" + + +msgid "Types of stroke extensions used for closing gaps" +msgstr "Виды удлинителей штрихов, используемых для закрытия зазоров" + + +msgid "Extend strokes in straight lines" +msgstr "Удлинить штрихи по прямым линиям" + + msgid "Radius" msgstr "Радиус" +msgid "Connect endpoints that are close together" +msgstr "Соединить конечные точки, расположенные близко друг к другу" + + msgid "Precision" msgstr "Точность" @@ -4029,10 +4637,18 @@ msgid "Material used for strokes drawn using this brush" msgstr "Материал, используемый для штрихов от этой кисти" +msgid "Material used for secondary uses for this brush" +msgstr "Материал, используемый для вторичного применения этой кисти" + + msgid "Thickness" msgstr "Толщина" +msgid "Thickness of the outline stroke relative to current brush thickness" +msgstr "Толщина контурного штриха относительно текущей толщины кисти" + + msgctxt "Brush" msgid "Jitter" msgstr "Дрожание" @@ -4131,7 +4747,7 @@ msgstr "Показывать вспомогательные линии прод msgid "Show Lasso" -msgstr "Показать лассо" +msgstr "Показать обводку" msgid "Do not display fill color while drawing the stroke" @@ -5325,6 +5941,10 @@ msgid "Include" msgstr "Включить" +msgid "Exclude" +msgstr "Исключить" + + msgid "Collection Objects" msgstr "Объекты коллекции" @@ -5485,14 +6105,34 @@ msgid "Color space in the image file, to convert to and from when saving and loa msgstr "Цветовое пространство изображения, из которого и в которое его нужно конвертировать при сохранении и загрузке" +msgid "ACES2065-1" +msgstr "ACES2065-1" + + +msgid "ACEScg" +msgstr "ACEScg" + + msgid "Filmic sRGB" msgstr "Кинематографичный sRGB" +msgid "sRGB display space with Filmic view transform" +msgstr "Пространство отображения sRGB с Filmic-преобразованием" + + msgid "Non-Color" msgstr "Нецветовое" +msgid "Rec.1886" +msgstr "Rec.1886" + + +msgid "Rec.2020" +msgstr "Rec.2020" + + msgid "Do not perform any color transform on load, treat colors as in scene linear space already" msgstr "Не выполнять цветовое преобразование при загрузке, считать, что цвета уже в линейном пространстве сцены" @@ -5673,6 +6313,14 @@ msgid "RGB" msgstr "RGB" +msgid "HSV" +msgstr "HSV" + + +msgid "HSL" +msgstr "HSL" + + msgid "Elements" msgstr "Элементы" @@ -5722,7 +6370,7 @@ msgstr "B-сплайн" msgid "Constant" -msgstr "Постоянно" +msgstr "Константа" msgid "Color Ramp Element" @@ -6375,7 +7023,7 @@ msgstr "Видеофрагмент, выступающий источником msgid "Active Clip" -msgstr "Акт. видеофр." +msgstr "Активный фрагмент" msgid "Use active clip defined in scene" @@ -6703,7 +7351,7 @@ msgstr "После оригинала" msgid "Apply copied rotation after original, as if the constraint target is a child" -msgstr "Применить скопированное вращение после оригинального, как если бы целью ограничителя был потомок." +msgstr "Применить скопированное вращение после оригинального, как если бы целью ограничителя был потомок" msgid "Offset (Legacy)" @@ -6739,7 +7387,7 @@ msgstr "Копировать масштаб целевого объекта" msgid "Power" -msgstr "Степень" +msgstr "Мощность" msgid "Raise the target's scale to the specified power" @@ -6823,7 +7471,7 @@ msgstr "Убрать сдвиг цели" msgid "Remove shear from the target transformation before combining" -msgstr "Убрать сдвиг с целевого преобразования перед объединением" +msgstr "Убрать сдвиг с целевого преобразования перед объединением" msgid "Damped Track Constraint" @@ -7995,7 +8643,7 @@ msgstr "Разложить на поворот, чтобы навести ось msgid "Map From" -msgstr "Разметка с…" +msgstr "Разметка от" msgid "The transformation type to use from the target" @@ -8007,11 +8655,11 @@ msgstr "Положение" msgid "Map To" -msgstr "Разметка для…" +msgstr "Разметка до" msgid "Map To X From" -msgstr "Разметка на X с…" +msgstr "Разметка до X от" msgid "The source axis constrained object's X axis uses" @@ -8019,7 +8667,7 @@ msgstr "Ось источника, которую ограничиваемый msgid "Map To Y From" -msgstr "Разметка на Y с…" +msgstr "Разметка до Y от" msgid "The source axis constrained object's Y axis uses" @@ -8027,7 +8675,7 @@ msgstr "Ось источника, которую ограничиваемый msgid "Map To Z From" -msgstr "Разметка на Z с…" +msgstr "Разметка до Z от" msgid "The source axis constrained object's Z axis uses" @@ -8355,7 +9003,7 @@ msgstr "Инкрементально пересчитать кривую (выс msgid "Split" -msgstr "Разбиение" +msgstr "Разделить" msgid "Split the curve until the tolerance is met (fast)" @@ -8394,6 +9042,10 @@ msgid "Plane for projected stroke" msgstr "Плоскость проецирования штрихов" +msgid "Normal to Surface" +msgstr "Нормаль к поверхности" + + msgid "View" msgstr "Вид" @@ -8564,6 +9216,10 @@ msgid "Dash" msgstr "Штрихи" +msgid "Gap" +msgstr "Промежуток" + + msgid "Material Index" msgstr "Индекс материала" @@ -9393,6 +10049,11 @@ msgid "Proximity falloff type" msgstr "Тип спада по близости" +msgctxt "Brush" +msgid "Constant" +msgstr "Постоянный" + + msgid "Ray Direction" msgstr "Направление луча" @@ -9434,7 +10095,7 @@ msgstr "Чёткий радиус" msgid "Radius that will be painted solid" -msgstr "Радиус, на на котором краска одноцветна" +msgstr "Радиус, на котором краска одноцветна" msgid "Absolute Alpha" @@ -9697,6 +10358,10 @@ msgid "File Format" msgstr "Формат файла" +msgid "PNG" +msgstr "PNG" + + msgid "OpenEXR" msgstr "OpenEXR" @@ -10441,10 +11106,34 @@ msgid "Disables audio output, for video-only renders" msgstr "Отключить звуковой вывод, только для рендеринга видео" +msgid "AAC" +msgstr "AAC" + + +msgid "AC3" +msgstr "AC3" + + +msgid "FLAC" +msgstr "FLAC" + + +msgid "MP2" +msgstr "MP2" + + +msgid "MP3" +msgstr "MP3" + + msgid "Opus" msgstr "Opus" +msgid "PCM" +msgstr "PCM" + + msgid "Vorbis" msgstr "Vorbis" @@ -10490,6 +11179,10 @@ msgid "DNxHD" msgstr "DNxHD" +msgid "DV" +msgstr "DV" + + msgid "FFmpeg video codec #1" msgstr "Видеокодек FFmpeg #1" @@ -10526,6 +11219,10 @@ msgid "Theora" msgstr "Theora" +msgid "AV1" +msgstr "AV1" + + msgid "Output Quality" msgstr "Выходное качество" @@ -10614,6 +11311,14 @@ msgid "MPEG-4" msgstr "MPEG-4" +msgid "AVI" +msgstr "AVI" + + +msgid "QuickTime" +msgstr "QuickTime" + + msgid "Ogg" msgstr "Ogg" @@ -11779,6 +12484,18 @@ msgid "Whether this path is saved in bookmarks, or generated from OS" msgstr "Сохранён ли путь в закладки или сгенерирован операционной системой" +msgid "File Extensions" +msgstr "С расширением" + + +msgid "Operator" +msgstr "Оператор" + + +msgid "Label" +msgstr "Метка" + + msgid "File Select Entry" msgstr "Выбираемый файл" @@ -12052,7 +12769,7 @@ msgstr "Фильтровать файлы резервный копий Blender" msgid "Show .blend1, .blend2, etc. files" -msgstr "Отображать файлы .blend1, .blend2 и т. д." +msgstr "Отображать файлы .blend1, .blend2 и последующие" msgid "Filter Blender" @@ -12159,6 +12876,10 @@ msgid "The UUID of the catalog shown in the browser" msgstr "UUID каталога, отображаемого в браузере" +msgid "Filter Asset Types" +msgstr "Фильтровать по типу ассета" + + msgid "Determine how the asset will be imported" msgstr "Способ импорта ассета" @@ -12183,6 +12904,10 @@ msgid "Import the assets as copied data-block, with no link to the original asse msgstr "Импортировать ассеты как скопированные датаблоки, не создавая ссылки на исходные датаблоки ассета" +msgid "Import the assets as copied data-block while avoiding multiple copies of nested, typically heavy data. For example the textures of a material asset, or the mesh of an object asset, don't have to be copied every time this asset is imported. The instances of the asset share the data instead" +msgstr "Импортировать ассет как скопированный блок данных, но без многократного копирования вложенных, обычно тяжёлых данных. Например, зависимые текстуры и меш не нужно копировать каждый раз при импорте этого ассета. Вместо этого экземпляры ассета будут использовать общие данные" + + msgid "Float2 Attribute Value" msgstr "Значение атрибута Float2" @@ -12912,6 +13637,10 @@ msgid "Use FLIP as the simulation method (more splashy behavior)" msgstr "Использовать метод моделирования FLIP (создаёт больше брызг)" +msgid "APIC" +msgstr "APIC" + + msgid "Use APIC as the simulation method (more energetic and stable behavior)" msgstr "Использовать метод моделирования APIC (более энергичное и стабильное поведение)" @@ -14033,7 +14762,7 @@ msgstr "Отбирать рёбра складок (рёбра, прилежащ msgid "Select edge marks (edges annotated by Freestyle edge marks)" -msgstr "Отбирать отмеченные рёбра (рёбра с установленной меткой ребра Freestyle)" +msgstr "Отбирать отмеченные рёбра (с установленной меткой Freestyle)" msgid "Select external contours (outer silhouettes of occluding and occluded objects)" @@ -15073,7 +15802,7 @@ msgstr "UV-заливка" msgid "Internal UV factor for filling" -msgstr "Внутренний множитель UVдля заливки" +msgstr "Внутренний множитель UV для заливки" msgid "Color used to mix with point color to get final color" @@ -15350,6 +16079,10 @@ msgid "Tool Header" msgstr "Панель инструментов" +msgid "XR" +msgstr "XR" + + msgid "The space where the panel is going to be used in" msgstr "Пространство, в котором будет использоваться панель" @@ -15394,6 +16127,10 @@ msgid "Modifier affecting the Grease Pencil object" msgstr "Модификатор, влияющий на объект Grease Pencil" +msgid "Override Modifier" +msgstr "Переопределить модификатор" + + msgid "Modifier name" msgstr "Имя модификатора" @@ -15802,6 +16539,10 @@ msgid "Hide points from the end of each stroke to the start (e.g. for animating msgstr "Скрывать точки с концов каждого штриха до начала (т. е. анимировать стирание штрихов)" +msgid "Vanish" +msgstr "Исчезновение" + + msgid "Hide points in the order they occur in each stroke (e.g. for animating ink fading or vanishing after getting drawn)" msgstr "Скрывать точки в порядке появления в каждом штрихе (т. е. анимировать выцветание чернил или исчезновение после рисования)" @@ -15870,6 +16611,10 @@ msgid "Inverse VertexGroup" msgstr "Инвертировать группу вершин" +msgid "Fills" +msgstr "Заполнение" + + msgid "Vertex group name for modulating the deform" msgstr "Имя группы вершин, регулирующей деформацию" @@ -16884,6 +17629,10 @@ msgid "Keep frame and do not change with time" msgstr "Сохранять кадр и не менять со временем" +msgid "Chain" +msgstr "Цепочка" + + msgid "Frame Offset" msgstr "Смещение кадра" @@ -17278,7 +18027,7 @@ msgstr "Корневой ID-тип" msgid "Type of ID block that action can be used on - DO NOT CHANGE UNLESS YOU KNOW WHAT YOU ARE DOING" -msgstr "Тип ID-блока, с которым может использоваться это действие. Не изменяйте это значение, если не уверены в своих действиях!" +msgstr "Тип ID-блока, с которым может использоваться это действие. Не изменяйте это значение, если не уверены в своих действиях" msgid "Pose Markers" @@ -17405,6 +18154,10 @@ msgid "Ratio between the brush radius and the radius that is going to be used to msgstr "Соотношение между радиусом кисти и радиусом, который будет использоваться для выборки центра области" +msgid "Auto-Smooth" +msgstr "Автосглаживание" + + msgid "Amount of smoothing to automatically apply to each stroke" msgstr "Величина сглаживания, автоматически применяемого к каждому штриху" @@ -17691,6 +18444,11 @@ msgid "Smooth" msgstr "Гладкая" +msgctxt "Curves" +msgid "Smoother" +msgstr "Более гладко" + + msgctxt "Curves" msgid "Sphere" msgstr "Сферическая" @@ -17734,6 +18492,10 @@ msgid "Length of a dash cycle measured in stroke samples" msgstr "Длина цикличного повторения, измеряемая в штриховых сэмплах" +msgid "Maximum distance to search for disconnected loose parts in the mesh" +msgstr "Максимальное расстояние для поиска разъединённых частей в сетке" + + msgid "Poisson ratio for elastic deformation. Higher values preserve volume more, but also lead to more bulging" msgstr "Коэффициент Пуассона для упругой деформации. Более высокие значения лучше сохраняют объём, но также приводят к выпячиванию" @@ -17794,6 +18556,11 @@ msgid "Gpencil Settings" msgstr "Настройки Grease Pencil" +msgctxt "Brush" +msgid "Grease Pencil Draw Tool" +msgstr "Инструмент рисования Grease Pencil" + + msgid "The brush is of type used for drawing strokes" msgstr "Кисть этого типа используется для рисования штрихов" @@ -17966,6 +18733,11 @@ msgid "Z Plane" msgstr "Плоскость Z" +msgctxt "Brush" +msgid "Sculpt Tool" +msgstr "Инструмент скульптинга" + + msgid "Secondary Color" msgstr "Вторичный цвет" @@ -18138,6 +18910,10 @@ msgid "Affect only vertices connected to the active vertex under the brush" msgstr "Влияние кисти распространяется только на точки, соединённые с ближайшей к кисти" +msgid "Occlusion" +msgstr "Перекрытие" + + msgid "Vector Displacement" msgstr "Векторное смещение" @@ -18637,7 +19413,7 @@ msgstr "Равноцельный рыбий глаз" msgid "Similar to most fisheye modern lens, takes sensor dimensions into consideration" -msgstr "Похож на большинство современных объективов типа «рыбий глаз», учитывает размеры сенсора" +msgstr "Похож на большинство современных объективов типа «рыбий глаз», учитывает размеры сенсора" msgid "Passepartout Alpha" @@ -18920,6 +19696,10 @@ msgid "Offset from the origin to use when instancing" msgstr "Смещение экземпляра от исходного объекта" +msgid "Usage" +msgstr "Использование" + + msgid "Objects that are directly in this collection" msgstr "Объекты, непосредственно находящиеся в этой коллекции" @@ -19045,11 +19825,11 @@ msgstr "Объект кривой, управляющей конусообраз msgid "Texture Space Location" -msgstr "Положение текстурного простр." +msgstr "Положение текстурного пространства" msgid "Texture Space Size" -msgstr "Размер текстурного простр." +msgstr "Размер текстурного пространства" msgid "Twist Method" @@ -19236,6 +20016,10 @@ msgid "Text Selected" msgstr "Выдел. текст" +msgid "Selected Bold" +msgstr "Выделение жирного шрифта" + + msgid "X Offset" msgstr "Смещение X" @@ -19405,7 +20189,7 @@ msgstr "Минимальный 2D-угол для разделения штри msgid "Caps" -msgstr "Концы" +msgstr "Колпаки" msgid "Select the shape of both ends of strokes" @@ -20228,6 +21012,10 @@ msgid "Format used for re-saving this file" msgstr "Формат, используемый для пересохранения этого файла" +msgid "BMP" +msgstr "BMP" + + msgid "Output image in bitmap format" msgstr "Сохранять изображение в формате BMP" @@ -20240,6 +21028,10 @@ msgid "Output image in PNG format" msgstr "Сохранять изображение в формате PNG" +msgid "JPEG" +msgstr "JPEG" + + msgid "Output image in JPEG format" msgstr "Сохранять изображение в формате JPEG" @@ -20276,6 +21068,10 @@ msgid "Output image in Cineon format" msgstr "Сохранять изображение в формате Cineon" +msgid "DPX" +msgstr "DPX" + + msgid "Output image in DPX format" msgstr "Сохранять изображение в формате DPX" @@ -20300,10 +21096,18 @@ msgid "Output image in Radiance HDR format" msgstr "Сохранять изображение в формате Radiance HDR" +msgid "TIFF" +msgstr "TIFF" + + msgid "Output image in TIFF format" msgstr "Сохранять изображение в формате TIFF" +msgid "WebP" +msgstr "WebP" + + msgid "AVI JPEG" msgstr "AVI JPEG" @@ -21695,10 +22499,6 @@ msgid "Node tree consisting of linked nodes used for shading, textures and compo msgstr "Нодовая система, состоящая из связанных нодов для шейдинга, текстурирования и постобработки" -msgid "Label" -msgstr "Метка" - - msgid "The node tree label" msgstr "Метка нодовой системы" @@ -21787,6 +22587,10 @@ msgid "Tiled" msgstr "Черепица" +msgid "GPU" +msgstr "GPU" + + msgid "Render Quality" msgstr "Качество рендера" @@ -22164,7 +22968,7 @@ msgstr "Маска" msgid "Render objects as a holdout or matte, creating a hole in the image with zero alpha, to fill out in compositing with real footage or another render" -msgstr "Рендерить объекты в виде маски; на месте объекта создаётся полностью прозрачная область, которую потом можно заполнить из реального видеоматериала или другого рендера" +msgstr "Рендерить объекты в виде маски; на месте объекта создаётся полностью прозрачная область, которую потом можно заполнить из реального видеоматериала или другого рендера" msgid "Shadow Catcher" @@ -22927,6 +23731,10 @@ msgid "Midpoint" msgstr "Средняя точка" +msgid "RK4" +msgstr "RK4" + + msgid "Invert Grid" msgstr "Инвертировать сетку" @@ -23440,7 +24248,7 @@ msgstr "Порождать в случайном порядке элементо msgid "Even Distribution" -msgstr "Равномерное распред." +msgstr "Равномерное распределение" msgid "Use even distribution from faces based on face areas or edge lengths" @@ -23744,6 +24552,10 @@ msgid "Grease Pencil data-block used for annotations in the 3D view" msgstr "Датаблок Grease Pencil, используемого для аннотаций в 3D-виде" +msgid "Hydra" +msgstr "Hydra" + + msgid "Whether there is any action referenced by NLA being edited (strictly read-only)" msgstr "Есть ли действие, на которое ссылается НЛА, редактируемая в данный момент (только для чтения)" @@ -23985,16 +24797,24 @@ msgid "Sound data-block referencing an external or packed sound file" msgstr "Датаблок звука, ссылающийся на внешний или упакованный звуковой файл" +msgid "Audio channels" +msgstr "Аудиоканалы" + + +msgid "5 Channels" +msgstr "5-канальная" + + msgid "Sound sample file used by this Sound data-block" msgstr "Звуковой файл, используемый этим датаблоком звука" msgid "Caching" -msgstr "Кэширование" +msgstr "Закэшировать" msgid "The sound file is decoded and loaded into RAM" -msgstr "Звуковой файл декодирован и загружен в оперативную память" +msgstr "Декодировать и загрузить звуковой файл в оперативную память" msgid "If the file contains multiple audio channels they are rendered to a single one" @@ -24119,6 +24939,11 @@ msgid "Use tabs or spaces for indentation" msgstr "Использовать пробелы или табуляцию для отступов" +msgctxt "Text" +msgid "Tabs" +msgstr "Табуляция" + + msgid "Indent using tabs" msgstr "Отступ с помощью табуляции" @@ -24639,7 +25464,7 @@ msgstr "Эксцентриситет фильтра" msgid "Maximum eccentricity (higher gives less blur at distant/oblique angles, but is also slower)" -msgstr "Максимальный эксцентриситет (чем выше, тем меньше размытие на больших расстояниях/косых углах, но также и медленней)" +msgstr "Максимальный эксцентриситет (чем выше, тем меньше размытие на больших расстояниях/косых углах, но также и медленней)" msgid "Filter Probes" @@ -24666,6 +25491,14 @@ msgid "Texture filter to use for sampling image" msgstr "Текстурный фильтр, используемый при сэмплировании изображения" +msgid "EWA" +msgstr "EWA" + + +msgid "FELINE" +msgstr "FELINE" + + msgid "Area" msgstr "Область" @@ -25538,6 +26371,10 @@ msgid "Selective Damped Least Square" msgstr "Выборочная амортизация методом наименьших квадратов" +msgid "DLS" +msgstr "DLS" + + msgid "Damped Least Square with Numerical Filtering" msgstr "Амортизация методом наименьших квадратов с числовой фильтрацией" @@ -25614,10 +26451,18 @@ msgid "Choose BW for saving grayscale images, RGB for saving red, green and blue msgstr "Выберите BW для сохранения изображений в градациях серого, RGB для сохранения каналов красного, зелёного и синего, RGBA для сохранения каналов красного, зелёного, синего и альфа-канала" +msgid "BW" +msgstr "ч/б" + + msgid "Images are saved with RGB (color) data" msgstr "Сохранять изображения в цветовой модели RGB" +msgid "RGBA" +msgstr "RGBA" + + msgid "Images are saved with RGB and Alpha data (if supported)" msgstr "Сохранять изображения в цветовой модели RGB с альфа-каналом (если поддерживается)" @@ -25670,6 +26515,14 @@ msgid "File format to save the rendered images as" msgstr "Формат файла для сохранения рендеров" +msgid "JP2" +msgstr "JP2" + + +msgid "J2K" +msgstr "J2K" + + msgid "Quality for image formats that support lossy compression" msgstr "Качество для форматов изображений, поддерживающих сжатие с потерями" @@ -25682,6 +26535,10 @@ msgid "Deflate" msgstr "Deflate" +msgid "LZW" +msgstr "LZW" + + msgid "Pack Bits" msgstr "PackBits" @@ -25802,6 +26659,10 @@ msgid "View in multilayer image" msgstr "Вид в многослойном изображении" +msgid "Tile" +msgstr "Тайл" + + msgid "Auto Refresh" msgstr "Обновлять автоматически" @@ -25827,11 +26688,11 @@ msgstr "Указывает на то, что клавиатурная настр msgid "Key Maps" -msgstr "Сочетания клавиш" +msgstr "Раскладка клавиш" msgid "Key maps configured as part of this configuration" -msgstr "Сочетания клавиш, настроенные как часть этой конфигурации" +msgstr "Сочетания клавиш, используемые в этой конфигурации" msgid "Name of the key configuration" @@ -25914,6 +26775,14 @@ msgid "Items in the keymap, linking an operator to an input event" msgstr "Элементы клавиатурной раскладки, связывающие оператор и событие ввода" +msgid "Modal Events" +msgstr "Модальные события" + + +msgid "Give access to the possible event values of this modal keymap's items (#KeyMapItem.propvalue), for API introspection" +msgstr "Предоставить доступ к возможным значениям событий для элементов этой модальной карты (#KeyMapItem.propvalue), для интроспекции API" + + msgid "Name of the key map" msgstr "Название клавиатурной раскладки" @@ -26157,6 +27026,10 @@ msgid "MsRot" msgstr "ВращМ" +msgid "MsSmartZoom" +msgstr "MsSmartZoom" + + msgctxt "UI_Events_KeyMaps" msgid "Wheel Up" msgstr "Колёсико вверх" @@ -26203,6 +27076,26 @@ msgid "B" msgstr "B" +msgctxt "UI_Events_KeyMaps" +msgid "C" +msgstr "C" + + +msgctxt "UI_Events_KeyMaps" +msgid "D" +msgstr "D" + + +msgctxt "UI_Events_KeyMaps" +msgid "E" +msgstr "E" + + +msgctxt "UI_Events_KeyMaps" +msgid "F" +msgstr "F" + + msgctxt "UI_Events_KeyMaps" msgid "G" msgstr "G" @@ -26213,6 +27106,51 @@ msgid "H" msgstr "H" +msgctxt "UI_Events_KeyMaps" +msgid "I" +msgstr "I" + + +msgctxt "UI_Events_KeyMaps" +msgid "J" +msgstr "J" + + +msgctxt "UI_Events_KeyMaps" +msgid "K" +msgstr "K" + + +msgctxt "UI_Events_KeyMaps" +msgid "L" +msgstr "L" + + +msgctxt "UI_Events_KeyMaps" +msgid "M" +msgstr "M" + + +msgctxt "UI_Events_KeyMaps" +msgid "N" +msgstr "N" + + +msgctxt "UI_Events_KeyMaps" +msgid "O" +msgstr "O" + + +msgctxt "UI_Events_KeyMaps" +msgid "P" +msgstr "P" + + +msgctxt "UI_Events_KeyMaps" +msgid "Q" +msgstr "Q" + + msgctxt "UI_Events_KeyMaps" msgid "R" msgstr "R" @@ -26223,6 +27161,11 @@ msgid "S" msgstr "S" +msgctxt "UI_Events_KeyMaps" +msgid "T" +msgstr "T" + + msgctxt "UI_Events_KeyMaps" msgid "U" msgstr "U" @@ -26316,6 +27259,15 @@ msgid "Cmd" msgstr "Cmd" +msgctxt "UI_Events_KeyMaps" +msgid "Application" +msgstr "Приложение" + + +msgid "App" +msgstr "Прил." + + msgctxt "UI_Events_KeyMaps" msgid "Grless" msgstr "Grless" @@ -26350,6 +27302,11 @@ msgid "Line Feed" msgstr "Перевод строки" +msgctxt "UI_Events_KeyMaps" +msgid "Backspace" +msgstr "Backspace" + + msgid "BkSpace" msgstr "BkSpace" @@ -26588,6 +27545,116 @@ msgid "F2" msgstr "F2" +msgctxt "UI_Events_KeyMaps" +msgid "F3" +msgstr "F3" + + +msgctxt "UI_Events_KeyMaps" +msgid "F4" +msgstr "F4" + + +msgctxt "UI_Events_KeyMaps" +msgid "F5" +msgstr "F5" + + +msgctxt "UI_Events_KeyMaps" +msgid "F6" +msgstr "F6" + + +msgctxt "UI_Events_KeyMaps" +msgid "F7" +msgstr "F7" + + +msgctxt "UI_Events_KeyMaps" +msgid "F8" +msgstr "F8" + + +msgctxt "UI_Events_KeyMaps" +msgid "F9" +msgstr "F9" + + +msgctxt "UI_Events_KeyMaps" +msgid "F10" +msgstr "F10" + + +msgctxt "UI_Events_KeyMaps" +msgid "F11" +msgstr "F11" + + +msgctxt "UI_Events_KeyMaps" +msgid "F12" +msgstr "F12" + + +msgctxt "UI_Events_KeyMaps" +msgid "F13" +msgstr "F13" + + +msgctxt "UI_Events_KeyMaps" +msgid "F14" +msgstr "F14" + + +msgctxt "UI_Events_KeyMaps" +msgid "F15" +msgstr "F15" + + +msgctxt "UI_Events_KeyMaps" +msgid "F16" +msgstr "F16" + + +msgctxt "UI_Events_KeyMaps" +msgid "F17" +msgstr "F17" + + +msgctxt "UI_Events_KeyMaps" +msgid "F18" +msgstr "F18" + + +msgctxt "UI_Events_KeyMaps" +msgid "F19" +msgstr "F19" + + +msgctxt "UI_Events_KeyMaps" +msgid "F20" +msgstr "F20" + + +msgctxt "UI_Events_KeyMaps" +msgid "F21" +msgstr "F21" + + +msgctxt "UI_Events_KeyMaps" +msgid "F22" +msgstr "F22" + + +msgctxt "UI_Events_KeyMaps" +msgid "F23" +msgstr "F23" + + +msgctxt "UI_Events_KeyMaps" +msgid "F24" +msgstr "F24" + + msgctxt "UI_Events_KeyMaps" msgid "Pause" msgstr "Pause" @@ -26635,21 +27702,37 @@ msgid "Media Play/Pause" msgstr "Медиа пауза/воспроизведение" +msgid "⏯" +msgstr "⏯" + + msgctxt "UI_Events_KeyMaps" msgid "Media Stop" msgstr "Медиа остановка" +msgid "⏹" +msgstr "⏹" + + msgctxt "UI_Events_KeyMaps" msgid "Media First" msgstr "Медиа к началу" +msgid "⏮" +msgstr "⏮" + + msgctxt "UI_Events_KeyMaps" msgid "Media Last" msgstr "Медиа к концу" +msgid "⏭" +msgstr "⏭" + + msgctxt "UI_Events_KeyMaps" msgid "Text Input" msgstr "Ввод текста" @@ -27122,6 +28205,11 @@ msgid "Properties to set when the operator is called" msgstr "Свойства, устанавливаемые при вызове оператора" +msgctxt "WindowManager" +msgid "Property Value" +msgstr "Значение свойства" + + msgid "The value this event translates to in a modal keymap" msgstr "Значение, передаваемое событием в модальную раскладку" @@ -28187,7 +29275,7 @@ msgstr "Центр трансформации относительно штри msgid "Pivot X" -msgstr "X центра преобр." +msgstr "Точка вращения X" msgid "2D X coordinate of the absolute pivot" @@ -28195,7 +29283,7 @@ msgstr "X-координата абсолютного центра вращен msgid "Pivot Y" -msgstr "Y центра вр." +msgstr "Точка вращения Y" msgid "2D Y coordinate of the absolute pivot" @@ -28892,7 +29980,7 @@ msgstr "Заливать область изображением текстур msgid "Flip" -msgstr "Развернуть" +msgstr "Отразить" msgid "Flip filling colors" @@ -28944,7 +30032,7 @@ msgstr "Защитить цвет от дальнейшего редактиро msgid "Mix Color" -msgstr "Смешиваемый цвет" +msgstr "Смешать цвета" msgid "Color for mixing with primary filling color" @@ -29024,6 +30112,10 @@ msgid "Disable stencil and overlap self intersections with alpha materials" msgstr "Отключить трафарет и перекрытие самопересечений с помощью прозрачных материалов" +msgid "Effectiveness" +msgstr "Эффективность" + + msgid "Material slot in an object" msgstr "Слот материала в объекте" @@ -29044,6 +30136,14 @@ msgid "Asset" msgstr "Ассет" +msgid "Catalog" +msgstr "Каталог" + + +msgid "Assets" +msgstr "Ассеты" + + msgctxt "MovieClip" msgid "Clip" msgstr "Видеофрагмент" @@ -29196,6 +30296,10 @@ msgid "Primitives" msgstr "Примитивы" +msgid "Adjust" +msgstr "Коррекция" + + msgid "Keying" msgstr "Кеинг" @@ -29224,11 +30328,23 @@ msgid "Attribute" msgstr "Атрибут" +msgid "Read" +msgstr "Прочитать" + + +msgid "Write" +msgstr "Записать" + + msgctxt "NodeTree" msgid "Constant" msgstr "Константа" +msgid "Instances" +msgstr "Экземпляры" + + msgid "Node Color Specials" msgstr "Настройка цвета ноды" @@ -30351,7 +31467,7 @@ msgstr "Метод ограничения" msgid "Bevel the entire mesh by a constant amount" -msgstr "Создать фаски одинакового размера на всем меше" +msgstr "Создать фаски одинакового размера на всем меше" msgid "Only bevel edges with sharp enough angles between faces" @@ -30470,6 +31586,10 @@ msgid "The profile shape (0.5 = round)" msgstr "Форма профиля (0.5 = круг)" +msgid "Superellipse" +msgstr "Суперэллипс" + + msgid "Number of segments for round edges/verts" msgstr "Количество сегментов в скруглённых рёбрах/вершинах" @@ -30538,6 +31658,10 @@ msgid "Threshold for checking overlapping geometry" msgstr "Порог для проверки объектов на наложение друг на друга" +msgid "Transfer" +msgstr "Перенести" + + msgid "Mesh object to use for Boolean operation" msgstr "Объект меша, используемый в булевой операции" @@ -31598,6 +32722,14 @@ msgid "Cache Mesh" msgstr "Кэш меша" +msgid "MDD" +msgstr "MDD" + + +msgid "PC2" +msgstr "PC2" + + msgid "Deform Mode" msgstr "Режим деформации" @@ -32058,6 +33190,10 @@ msgid "Size of the simulation domain (in meters), and of the generated geometry msgstr "Размер домена симуляции (в метрах) и генерируемой геометрии (в ед. Blender)" +msgid "Spectrum" +msgstr "Спектр" + + msgid "Spray Map" msgstr "Карта брызг" @@ -33049,7 +34185,7 @@ msgstr "Расстояние, отображаемое на вес 0.0" msgid "Proximity Geometry" -msgstr "Расстояние до…" +msgstr "Близлежащая геометрия" msgid "Use the shortest computed distance to target object's geometry as weight" @@ -33624,6 +34760,18 @@ msgid "K3" msgstr "К3" +msgid "K4" +msgstr "K4" + + +msgid "P1" +msgstr "P1" + + +msgid "P2" +msgstr "P2" + + msgid "Distortion Model" msgstr "Модель искажения" @@ -34498,7 +35646,7 @@ msgstr "Выделить по шаблону" msgid "Track's pattern area is selected" -msgstr "Область шаблона трека выбрана" +msgstr "Область шаблона трека выбрана" msgid "Select Search" @@ -34858,6 +36006,10 @@ msgid "Alpha Over" msgstr "Альфа-наложение" +msgid "Convert Premultiplied" +msgstr "Конвертировать предумножение" + + msgid "Bilateral Blur" msgstr "Двустороннее размытие" @@ -34998,6 +36150,10 @@ msgid "Y position of the middle of the box" msgstr "Положение по Y середины прямоугольника" +msgid "Brightness/Contrast" +msgstr "Яркость/контраст" + + msgid "Keep output image premultiplied alpha" msgstr "Сохранять предумноженный альфа-канал выходного изображения" @@ -35095,11 +36251,11 @@ msgstr "Метод коррекции" msgid "Lift/Gamma/Gain" -msgstr "Тени/средние тона/светлые тона" +msgstr "Тени/средние тона/света" msgid "Offset/Power/Slope (ASC-CDL)" -msgstr "Смещение/мощность/уклон (ASC-CDL)" +msgstr "Смещение/мощность/наклон (ASC-CDL)" msgid "ASC-CDL standard color correction" @@ -35119,7 +36275,7 @@ msgstr "Включить поддержку отрицательного цве msgid "Slope" -msgstr "Уклон" +msgstr "Наклон" msgid "Color Correction" @@ -35382,6 +36538,10 @@ msgid "Combine YUVA" msgstr "Объединить YUVA" +msgid "Combine Color" +msgstr "Скомбинировать цвет" + + msgid "Combine XYZ" msgstr "Объединить XYZ" @@ -35842,6 +37002,10 @@ msgid "Hue Correct" msgstr "Смена оттенка" +msgid "Hue/Saturation/Value" +msgstr "Тон/насыщенность/яркость" + + msgid "ID Mask" msgstr "Маска по ID" @@ -35866,6 +37030,10 @@ msgid "Distance to inpaint (number of iterations)" msgstr "Расстояние ретуширования (количество итераций)" +msgid "Invert Color" +msgstr "Инвертировать цвет" + + msgid "Post Blur" msgstr "Пост-размытие" @@ -35959,6 +37127,10 @@ msgid "Tracking Object" msgstr "Отслеживаемый объект" +msgid "Kuwahara" +msgstr "Кувахара" + + msgid "Eccentricity" msgstr "Эксцентриситет" @@ -36147,6 +37319,11 @@ msgid "A power B" msgstr "A в степени B" +msgctxt "NodeTree" +msgid "Logarithm" +msgstr "Логарифм" + + msgid "Logarithm A base B" msgstr "Логарифм A по основанию B" @@ -36174,6 +37351,10 @@ msgid "Exponent" msgstr "Экспонента" +msgid "exp(A)" +msgstr "exp(A)" + + msgctxt "NodeTree" msgid "Minimum" msgstr "Минимум" @@ -36210,6 +37391,11 @@ msgid "1 if A > B else 0" msgstr "1 если A>B, иначе 0" +msgctxt "NodeTree" +msgid "Sign" +msgstr "Знак" + + msgctxt "NodeTree" msgid "Compare" msgstr "Сравнить" @@ -36298,22 +37484,54 @@ msgid "tan(A)" msgstr "tan(A)" +msgctxt "NodeTree" +msgid "Arcsine" +msgstr "Арксинус" + + msgid "arcsin(A)" msgstr "arcsin(A)" +msgctxt "NodeTree" +msgid "Arccosine" +msgstr "Арккосинус" + + msgid "arccos(A)" msgstr "arccos(A)" +msgctxt "NodeTree" +msgid "Arctangent" +msgstr "Арктангенс" + + msgid "arctan(A)" msgstr "arctan(A)" +msgctxt "NodeTree" +msgid "Arctan2" +msgstr "Арктангенс2" + + msgid "The signed angle arctan(A / B)" msgstr "Арктангенс с определением направления (A / B)" +msgid "sinh(A)" +msgstr "sinh(A)" + + +msgid "cosh(A)" +msgstr "cosh(A)" + + +msgid "tanh(A)" +msgstr "tanh(A)" + + msgid "Include alpha of second input in this operation" msgstr "Включить значения альфа-канала со второго входа в этой операции" @@ -36362,6 +37580,10 @@ msgid "Plane Track Deform" msgstr "Деформация трека-плоскости" +msgid "Posterize" +msgstr "Постеризация" + + msgid "Alpha Convert" msgstr "Альфа-преобразование" @@ -36370,6 +37592,14 @@ msgid "Conversion between premultiplied alpha and key alpha" msgstr "Преобразование между альфа-каналом с предумножением и альфа-каналом в виде ключа" +msgid "Convert straight to premultiplied" +msgstr "Конвертировать прямой альфа-канал в предумноженный" + + +msgid "Convert premultiplied to straight" +msgstr "Конвертировать предумноженный альфа-канал в прямой" + + msgid "RGB to BW" msgstr "RGB в оттенки серого" @@ -36414,6 +37644,10 @@ msgid "Separate YUVA" msgstr "Разделить YUVA" +msgid "Separate Color" +msgstr "Разделить цвет" + + msgid "Separate XYZ" msgstr "Разделить XYZ" @@ -36447,7 +37681,7 @@ msgstr "Длина лучей в форме множителя к размеру msgid "Switch" -msgstr "Переключить" +msgstr "Переключатель" msgid "Off: first socket, On: second socket" @@ -36666,14 +37900,34 @@ msgid "Anti-alias the z-buffer to try to avoid artifacts, mostly useful for Blen msgstr "Использовать сглаживание в z-буфере для предотвращения артефактов, полезно для рендеров в Blender" +msgid "And" +msgstr "И" + + +msgid "Or" +msgstr "ИЛИ" + + +msgid "Nor" +msgstr "ИЛИ-НЕ" + + msgid "Equal" msgstr "Равно" +msgid "Imply" +msgstr "Импликация" + + msgid "Compare" msgstr "Сравнить" +msgid "Element-Wise" +msgstr "Поэлементно" + + msgid "Dot Product" msgstr "Скал. произведение" @@ -36686,14 +37940,39 @@ msgid "Greater Than" msgstr "Больше чем" +msgid "Brighter" +msgstr "Ярче" + + +msgid "Darker" +msgstr "Темнее" + + +msgctxt "NodeTree" +msgid "Ceiling" +msgstr "Округлить вверх" + + msgid "Input value used for unconnected socket" msgstr "Входное значение, используемое для несоединённого сокета" +msgid "Random Value" +msgstr "Случайное значение" + + +msgid "Domain Size" +msgstr "Размер домена" + + msgid "Component" msgstr "Компонента" +msgid "Attribute Statistic" +msgstr "Статистика по атрибуту" + + msgid "Original" msgstr "Оригинал" @@ -36702,6 +37981,22 @@ msgid "Convex Hull" msgstr "Выпуклая оболочка" +msgid "Quadrilateral" +msgstr "Четырехугольник" + + +msgid "Parallelogram" +msgstr "Параллелограмм" + + +msgid "Trapezoid" +msgstr "Трапеция" + + +msgid "Kite" +msgstr "Дельтоид" + + msgid "Set Handle Type" msgstr "Установить тип рукоятки" @@ -36710,6 +38005,18 @@ msgid "Set Spline Type" msgstr "Установить тип сплайна" +msgid "NURBS" +msgstr "NURBS" + + +msgid "Star" +msgstr "Звезда" + + +msgid "Evaluated" +msgstr "Вычисленное" + + msgid "Only Edges & Faces" msgstr "Только рёбра и грани" @@ -36718,6 +38025,10 @@ msgid "Only Faces" msgstr "Только грани" +msgid "N-gons" +msgstr "N-угольники" + + msgctxt "Image" msgid "Mirror" msgstr "Отразить" @@ -36747,6 +38058,10 @@ msgid "Fill Type" msgstr "Тип заполнения" +msgid "N-Gon" +msgstr "N-угольник" + + msgid "Ico Sphere" msgstr "Икосфера" @@ -36759,6 +38074,10 @@ msgid "Object Info" msgstr "Информация об объекте" +msgid "Clamp the indices to the size of the attribute domain instead of outputting a default value for invalid indices" +msgstr "Ограничить индексы размером области атрибутов вместо того, чтобы выводить значение по умолчанию для недействительных индексов" + + msgid "Z Up" msgstr "Вверх по Z" @@ -36813,11 +38132,11 @@ msgstr "Уменьшить рамку до минимального габари msgid "Group Input" -msgstr "Вход группы" +msgstr "Входы группы" msgid "Group Output" -msgstr "Выход группы" +msgstr "Выходы группы" msgid "Active Output" @@ -36832,6 +38151,10 @@ msgid "Reroute" msgstr "Перенаправление" +msgid "A single-socket organization tool that supports one input and multiple outputs" +msgstr "Организационный инструмент с одним разветвителем, поддерживающий один вход и несколько выходов" + + msgid "Shader Node" msgstr "Нода шейдера" @@ -36844,6 +38167,10 @@ msgid "Add Shader" msgstr "Добавляющий шейдер" +msgid "Add two Shaders together" +msgstr "Сложить два шейдера" + + msgid "Ambient Occlusion" msgstr "Ambient Occlusion" @@ -36864,6 +38191,10 @@ msgid "Number of rays to trace per shader evaluation" msgstr "Количество лучей для трассировки на вычисление шейдера" +msgid "Retrieve attributes attached to objects or geometry" +msgstr "Извлечь атрибуты, прикреплённые к объектам или геометрии" + + msgid "Attribute Name" msgstr "Имя атрибута" @@ -36876,14 +38207,30 @@ msgid "Blackbody" msgstr "Тепловое излучение" +msgid "Convert a blackbody temperature to an RGB value" +msgstr "Преобразовать температуру теплового излучения в значение RGB" + + +msgid "Control the brightness and contrast of the input color" +msgstr "Управляет яркостью и контрастностью входного цвета" + + msgid "Glossy BSDF" msgstr "Глянцевый BSDF" +msgid "Reflection with microfacet distribution, used for materials such as metal or mirrors" +msgstr "Отражение с распределением микрограней, используемое для таких материалов, как металл или зеркала" + + msgid "Beckmann" msgstr "Бекман" +msgid "GGX" +msgstr "GGX" + + msgid "Ashikhmin-Shirley" msgstr "Ашихмин-Ширли" @@ -36896,10 +38243,18 @@ msgid "Diffuse BSDF" msgstr "Диффузный BSDF" +msgid "Lambertian and Oren-Nayar diffuse reflection" +msgstr "Диффузное отражение Ламберта и Орена-Наяра" + + msgid "Glass BSDF" msgstr "BSDF стекла" +msgid "Glass-like shader mixing refraction and reflection at grazing angles" +msgstr "Шейдер, имитирующий стекло, смешивает преломление и отражение в зависимости от угла падения луча" + + msgid "Hair BSDF" msgstr "BSDF волос" @@ -36912,6 +38267,10 @@ msgid "Principled Hair BSDF" msgstr "Принципиальный BSDF волос" +msgid "Huang" +msgstr "Хуанг" + + msgid "Select the shader's color parametrization" msgstr "Параметризация цвета шейдера" @@ -36928,6 +38287,10 @@ msgid "Principled BSDF" msgstr "Принципиальный BSDF" +msgid "Physically-based, easy-to-use shader for rendering surface materials, based on the Disney principled model also known as the \"PBR\" shader" +msgstr "Физически точный, простой в использовании шейдер для рендеринга поверхностных материалов, основанный на принципиальной модели Disney, также известной как PBR-шейдер" + + msgid "Subsurface Method" msgstr "Подповерхностный метод" @@ -36936,6 +38299,10 @@ msgid "Method for rendering subsurface scattering" msgstr "Метод рендеринга подповерхностного рассеивания" +msgid "Christensen-Burley" +msgstr "Кристенсен-Бёрли" + + msgid "Random Walk" msgstr "Случайный обход" @@ -36944,6 +38311,22 @@ msgid "Refraction BSDF" msgstr "Преломляющий BSDF" +msgid "Glossy refraction with sharp or microfacet distribution, typically used for materials that transmit light" +msgstr "Глянцевое преломление с резким или плавным распределением; обычно используется для материалов, пропускающих свет" + + +msgid "Sheen BSDF" +msgstr "BSDF ткани" + + +msgid "Sheen shading model" +msgstr "Модель затенения ткани" + + +msgid "Ashikhmin" +msgstr "Ашихмин" + + msgid "Toon BSDF" msgstr "Toon BSDF" @@ -36952,14 +38335,26 @@ msgid "Translucent BSDF" msgstr "Просвечивающий BSDF" +msgid "Lambertian diffuse transmission" +msgstr "Диффузное пропускание Ламберта" + + msgid "Transparent BSDF" msgstr "Прозрачный BSDF" +msgid "Transparency without refraction, passing straight through the surface as if there were no geometry" +msgstr "Прозрачность без преломления, проходящая прямо через поверхность, как если бы не было геометрии" + + msgid "Bump" msgstr "Карта неровностей" +msgid "Generate a perturbed normal from a height texture for bump mapping. Typically used for faking highly detailed surfaces" +msgstr "Сгенерировать возмущенную нормаль из текстуры высот для отображения карты неровности. Обычно используется для имитации поверхностей с высокой детализацией" + + msgid "Invert the bump mapping direction to push into the surface instead of out" msgstr "Инвертировать направление карты неровностей (вдавливать поверхность вместо выдавливания)" @@ -36968,6 +38363,14 @@ msgid "Camera Data" msgstr "Данные камеры" +msgid "Retrieve information about the camera and how it relates to the current shading point's position" +msgstr "Извлечь информацию о камере и о том, как она связана с текущим положением точки затенения" + + +msgid "Clamp a value between a minimum and a maximum" +msgstr "Ограничить значение между минимумом и максимумом" + + msgid "Combine HSV" msgstr "Объединить HSV" @@ -36976,6 +38379,10 @@ msgid "Combine RGB" msgstr "Объединить RGB" +msgid "Create a vector from X, Y, and Z components" +msgstr "Создать вектор из компонентов X, Y и Z" + + msgid "Shader Custom Group" msgstr "Особая группа шейдера" @@ -37000,18 +38407,46 @@ msgid "Displacement is in world space, not affected by object scale" msgstr "Смещение в пространстве мира без воздействия масштаба объекта" +msgid "Specular BSDF" +msgstr "Отражающий BSDF" + + +msgid "Similar to the Principled BSDF node but uses the specular workflow instead of metallic, which functions by specifying the facing (along normal) reflection color. Energy is not conserved, so the result may not be physically accurate" +msgstr "Подобен ноду «Принципиальный BSDF», но использует зеркальный рабочий процесс вместо металлического, т. е. функционирует путём указания цвета отражения, направленного вдоль нормали. Энергия не сохраняется, поэтому результат может быть не физически точным" + + msgid "Emission" msgstr "Излучение" +msgid "Lambertian emission shader" +msgstr "Шейдер излучения Ламберта" + + msgid "Fresnel" msgstr "Френель" +msgid "Apply a gamma correction" +msgstr "Применить гамма-коррекцию" + + msgid "Curves Info" msgstr "Информация о кривых" +msgid "Retrieve hair curve information" +msgstr "Извлечь информацию о кривых волос" + + +msgid "Apply a color transformation in the HSV color model" +msgstr "Применить преобразование цвета в цветовой модели HSV" + + +msgid "Invert a color, producing a negative" +msgstr "Инвертировать цвет, создав негатив" + + msgid "Layer Weight" msgstr "Вес слоя" @@ -37020,10 +38455,22 @@ msgid "Light Falloff" msgstr "Спад света" +msgid "Manipulate how light intensity decreases over distance. Typically used for non-physically-based effects; in reality light always falls off quadratically" +msgstr "Управляет тем, как интенсивность света уменьшается с расстоянием. Обычно используется для физически не точных эффектов; в реальности свет всегда падает квадратично" + + msgid "Light Path" msgstr "Путь света" +msgid "" +"Retrieve the type of incoming ray for which the shader is being executed.\n" +"Typically used for non-physically-based tricks" +msgstr "" +"Извлечь тип падающего луча, для которого выполняется шейдер.\n" +"Обычно используется для эффектов, не требующих физически корректного рендеринга" + + msgid "Remap a value from a range to a target range" msgstr "Переназначить значение из диапазона в целевой диапазон" @@ -37032,6 +38479,10 @@ msgid "Clamp the result to the target range [To Min, To Max]" msgstr "Обрезать результат до нужного диапазона [To Min, To Max]" +msgid "Transform the input vector by applying translation, rotation, and scale" +msgstr "Преобразовать входной вектор, применив перемещение, вращение и масштаб" + + msgid "Type of vector that the mapping transforms" msgstr "Тип вектора на который накладывается трансформация" @@ -37052,8 +38503,16 @@ msgid "Transform a unit normal vector. Location is ignored" msgstr "Преобразовать единичный вектор нормали. Местоположение игнорируется" +msgid "Perform math operations" +msgstr "Выполнить математические операции" + + +msgid "Mix values by a factor" +msgstr "Смешать значения по множителю" + + msgid "Clamp Factor" -msgstr "Ограничить коэффициент" +msgstr "Ограничить множитель" msgid "Clamp Result" @@ -37068,6 +38527,22 @@ msgid "Mix Shader" msgstr "Смешивающий шейдер" +msgid "Mix two shaders together. Typically used for material layering" +msgstr "Смешать два шейдера вместе. Обычно используется для наслоения одного материала на другой" + + +msgid "Retrieve geometric information about the current shading point" +msgstr "Извлечь геометрическую информацию о текущей точке затенения" + + +msgid "Generate a normal vector and a dot product" +msgstr "Сгенерировать вектор нормали и скалярное произведение" + + +msgid "Generate a perturbed normal from an RGB normal map image. Typically used for faking highly detailed surfaces" +msgstr "Сгенерировать возмущённую нормаль из RGB изображения карты нормалей. Обычно используется для имитации поверхностей с высокой детализацией" + + msgid "Space of the input normal" msgstr "Пространство входных нормалей" @@ -37108,6 +38583,10 @@ msgid "UV Map for tangent space maps" msgstr "UV-карта для карт пространства касательных" +msgid "Retrieve information about the object instance" +msgstr "Извлечь данные об экземпляра объекта" + + msgid "AOV Output" msgstr "Вывод AOV" @@ -37144,6 +38623,10 @@ msgid "Material Output" msgstr "Вывод материала" +msgid "Output surface material information for use in rendering" +msgstr "Вывести информацию о материале поверхности для использования в рендеринге" + + msgid "World Output" msgstr "Вывод окружающей среды" @@ -37152,10 +38635,30 @@ msgid "Particle Info" msgstr "Информация о частице" +msgid "Retrieve the data of the particle that spawned the object instance, for example to give variation to multiple instances of an object" +msgstr "Извлечь информацию о частице, которая породила экземпляр объекта, например, чтобы дать вариацию нескольким экземплярам объекта" + + msgid "Point Info" msgstr "Информация о точке" +msgid "Retrieve information about points in a point cloud" +msgstr "Извлечь информацию о точках в облаке точек" + + +msgid "A color picker" +msgstr "Выбор цвета" + + +msgid "Apply color corrections for each color channel" +msgstr "Применить цветокоррекцию для каждого цветового канала" + + +msgid "Convert a color's luminance to a grayscale value" +msgstr "Преобразовать яркость цвета в значение оттенков серого" + + msgid "Bytecode" msgstr "Байт-код" @@ -37200,6 +38703,10 @@ msgid "Automatically update the shader when the .osl file changes (external scri msgstr "Автоматически обновлять шейдер при изменении файла .osl (только для внешних скриптов)" +msgid "Split a color into its individual components using multiple models" +msgstr "Разделить цвет на отдельные компоненты с помощью разных моделей" + + msgid "Separate HSV" msgstr "Разделить HSV" @@ -37220,6 +38727,18 @@ msgid "Subsurface Scattering" msgstr "Подповерхностное рассеивание" +msgid "" +"Subsurface multiple scattering shader to simulate light entering the surface and bouncing internally.\n" +"Typically used for materials such as skin, wax, marble or milk" +msgstr "" +"Подповерхностный шейдер многократного рассеивания для имитации света, попадающего на поверхность и отражающегося от неё.\n" +"Обычно используется для таких материалов, как кожа, воск, мрамор или молоко" + + +msgid "Generate a tangent direction for the Anisotropic BSDF" +msgstr "Сгенерировать направление касательных для анизотропного BSDF" + + msgid "Axis for radial tangents" msgstr "Ось радиальных касательных" @@ -37256,6 +38775,10 @@ msgid "Brick Texture" msgstr "Текстура плитки" +msgid "Generate a procedural texture producing bricks" +msgstr "Сгенерировать процедурную текстуру кирпича" + + msgid "Offset Amount" msgstr "Величина отступа" @@ -37280,10 +38803,22 @@ msgid "Checker Texture" msgstr "Текстура шахм. доски" +msgid "Generate a checkerboard texture" +msgstr "Сгенерировать текстуру шахматной доски" + + msgid "Texture Coordinate" msgstr "Текстурные координаты" +msgid "" +"Retrieve multiple types of texture coordinates.\n" +"Typically used as inputs for texture nodes" +msgstr "" +"Извлечь текстурные координаты разных типов.\n" +"Обычно используется в качестве входных данных для текстурных нодов" + + msgid "From Instancer" msgstr "От инстансера" @@ -37296,6 +38831,10 @@ msgid "Environment Texture" msgstr "Текстура окр. среды" +msgid "Sample an image file as an environment texture. Typically used to light the scene with the background node" +msgstr "Сэмплировать файл изображения в качестве текстуры окружающей среды. Обычно используется для освещения сцены вместе с нодом фона" + + msgid "Texture interpolation" msgstr "Интерполяция текстуры" @@ -37324,6 +38863,10 @@ msgid "Gradient Texture" msgstr "Текстура градиента" +msgid "Generate interpolated color and intensity values based on the input vector" +msgstr "Сгенерировать интерполированные значения цвета и интенсивности на основе входного вектора" + + msgid "IES Texture" msgstr "IES-текстура" @@ -37344,6 +38887,10 @@ msgid "Use external .ies file" msgstr "Использовать внешний файл .ies" +msgid "Sample an image file as a texture" +msgstr "Сэмплировать файл изображения в качестве текстуры" + + msgid "Method to project 2D image on object with a 3D texture vector" msgstr "Метод проецирования 2D-изображения на объект с трёхмерным текстурный вектором" @@ -37372,14 +38919,30 @@ msgid "For box projection, amount of blend to use between sides" msgstr "Величина смешения между сторонами при использовании коробочного проецирования" +msgid "Generate a psychedelic color texture" +msgstr "Сгенерировать психоделическую цветовую текстуру" + + msgid "Level of detail in the added turbulent noise" msgstr "Уровень детализации в добавленном турбулентном шуме" +msgid "Generate fractal Perlin noise" +msgstr "Сгенерировать фрактальный шум Перлина" + + msgid "Use the scalar value W as input" msgstr "Использовать линейное значение W в качестве входа" +msgid "The standard fractal Perlin noise" +msgstr "Стандартный фрактальный шум Перлина" + + +msgid "Generate a volumetric point for each particle or vertex of another object" +msgstr "Сгенерировать объёмную точку для каждой частицы или вершины другого объекта" + + msgid "Object to take point data from" msgstr "Объект, от которого принимаются данные о точках" @@ -37468,6 +39031,10 @@ msgid "Sky Texture" msgstr "Текстура неба" +msgid "Generate a procedural sky texture" +msgstr "Сгенерировать процедурную текстуру неба" + + msgid "Air" msgstr "Воздух" @@ -37492,6 +39059,10 @@ msgid "Hosek / Wilkie" msgstr "Хосек / Уилки" +msgid "Nishita" +msgstr "Нисита" + + msgid "Sun Direction" msgstr "Направление солнца" @@ -37512,6 +39083,10 @@ msgid "Voronoi Texture" msgstr "Текстура Вороного" +msgid "Generate Worley noise based on the distance to random points. Typically used to generate textures such as stones, water, or biological cells" +msgstr "Сгенерировать шум Уорли на основе расстояния до случайных точек. Обычно используется для создания текстур, таких как камни, вода или биологические клетки" + + msgid "Euclidean" msgstr "Эвклидово" @@ -37572,6 +39147,10 @@ msgid "Wave Texture" msgstr "Текстура волны" +msgid "Generate procedural bands or rings with noise" +msgstr "Сгенерировать процедурные полосы или кольца с шумом" + + msgid "Wave Profile" msgstr "Волновой профиль" @@ -37600,6 +39179,10 @@ msgid "White Noise Texture" msgstr "Текстура белого шума" +msgid "Return a random value or color based on an input seed" +msgstr "Получить случайное значение или цвет на основе входного начального числа" + + msgid "UV Along Stroke" msgstr "UV вдоль штриха" @@ -37612,10 +39195,30 @@ msgid "Lower half of the texture is for tips of the stroke" msgstr "Использовать нижнюю половину текстуры для концов штрихов" +msgid "Retrieve a UV map from the geometry, or the default fallback if none is specified" +msgstr "Извлечь UV-карту из геометрии или активную UV-карту, если ничего не выбрано" + + msgid "UV coordinates to be used for mapping" msgstr "UV-координаты, используемые для сопоставления" +msgid "Map values to colors with the use of a gradient" +msgstr "Отобразить значения цветов с использованием градиента" + + +msgid "Used to Input numerical values to other nodes in the tree" +msgstr "Используется для ввода числовых значений в другие ноды дерева" + + +msgid "Map an input vectors to curves, used to fine-tune the interpolation of the input" +msgstr "Отобразить входные векторы в кривые, используемые для точной настройки интерполяции входных данных" + + +msgid "Displace the surface along an arbitrary direction" +msgstr "Сместить поверхность вдоль произвольного направления" + + msgid "Tangent space vector displacement mapping" msgstr "Отображение смещения по векторам в пространстве касательных" @@ -37628,6 +39231,14 @@ msgid "World space vector displacement mapping" msgstr "Отображение смещения по векторам в пространстве мира" +msgid "Vector Math" +msgstr "Векторная математика" + + +msgid "Perform vector math operation" +msgstr "Выполнить операцию векторной математики" + + msgid "A cross B" msgstr "A × B" @@ -37669,6 +39280,10 @@ msgid "Vector Rotate" msgstr "Повернуть вектор" +msgid "Rotate a vector around a pivot point (center)" +msgstr "Поверуть вектор вокруг точки вращения (центра)" + + msgid "Z Axis" msgstr "Ось Z" @@ -37677,6 +39292,10 @@ msgid "Vector Transform" msgstr "Преобразовать вектор" +msgid "Convert a vector, point, or normal between world, camera, and object coordinate space" +msgstr "Преобразовать вектор, точку или нормаль между миром, камерой и координатным пространством объекта" + + msgid "Convert From" msgstr "Преобразовать из" @@ -37705,10 +39324,18 @@ msgid "Color Attribute" msgstr "Атрибут цвета" +msgid "Retrieve a color attribute, or the default fallback if none is specified" +msgstr "Извлечь атрибут цвета или активный атрибут, если ничего не выбрано" + + msgid "Volume Absorption" msgstr "Поглощение объёма" +msgid "Absorb light as it passes through the volume" +msgstr "Поглощает свет при его прохождении через объём" + + msgid "Volume Info" msgstr "Информация о волюметрике" @@ -37717,10 +39344,22 @@ msgid "Principled Volume" msgstr "Принципиальный объём" +msgid "Combine all volume shading components into a single easy to use node" +msgstr "Объединить все компоненты объёмного затенения в один, простой в использовании, нод" + + msgid "Volume Scatter" msgstr "Рассеивание объёма" +msgid "Scatter light as it passes through the volume, often used to add fog to a scene" +msgstr "Рассеивать свет при прохождении через объём; часто используется для добавления тумана в сцену" + + +msgid "Convert a wavelength value to an RGB value" +msgstr "Преобразовать значение длины волны в значение RGB" + + msgid "Use screen pixel size instead of world units" msgstr "Использовать размер пикселя экрана вместо единиц мира" @@ -37881,6 +39520,10 @@ msgid "Tooltip" msgstr "Подсказка" +msgid "Socket tooltip" +msgstr "Всплывающая подсказка сокета" + + msgid "Socket shape" msgstr "Форма сокета" @@ -37937,6 +39580,10 @@ msgid "True if the socket is an output, otherwise input" msgstr "True для выходных сокетов, иначе False" +msgid "Unavailable" +msgstr "Недоступный" + + msgid "Link Limit" msgstr "Ограничение связей" @@ -38025,6 +39672,14 @@ msgid "Virtual socket of a node" msgstr "Виртуальный сокет ноды" +msgid "Socket" +msgstr "Сокет" + + +msgid "Socket description" +msgstr "Описание сокета" + + msgid "Socket Type" msgstr "Тип сокета" @@ -38141,6 +39796,10 @@ msgid "Angles smaller than this will be treated as creases" msgstr "Углы меньше этого значения будут рассматриваться как складки" +msgid "Inherit" +msgstr "Наследовать" + + msgid "Object Modifiers" msgstr "Модификаторы объекта" @@ -38607,7 +40266,7 @@ msgstr "Инвертировать выделение всех элементо msgctxt "Operator" msgid "Box Select" -msgstr "Прямоугольное выделение" +msgstr "Выделить прямоугольником" msgid "Select all keyframes within the specified region" @@ -38685,11 +40344,11 @@ msgstr "Между минимальным и максимальным выдел msgctxt "Operator" msgid "Lasso Select" -msgstr "Выделить с лассо" +msgstr "Выделить обводкой" msgid "Select keyframe points using lasso selection" -msgstr "Выделить точки ключевых кадров с помощью инструмента лассо" +msgstr "Выделить точки ключевых кадров с помощью обводки" msgctxt "Operator" @@ -38973,6 +40632,11 @@ msgid "To Bottom" msgstr "К низу" +msgctxt "Operator" +msgid "Rename Channel" +msgstr "Переименовать канал" + + msgid "Rename animation channel under mouse" msgstr "Переименовать канал анимации под курсором мыши" @@ -38993,6 +40657,11 @@ msgid "Extend selection instead of deselecting everything first" msgstr "Расширить выделение вместо предварительного снятия выделения со всего" +msgctxt "Operator" +msgid "Filter Channels" +msgstr "Фильтровать каналы" + + msgctxt "Operator" msgid "Disable Channel Setting" msgstr "Отключить настройку канала" @@ -39039,7 +40708,7 @@ msgstr "Только неиспользуемое" msgid "Only unused (Fake User only) actions get considered" -msgstr "Только для неиспользуемых действий (действий с фиктивным пользователем)" +msgstr "Только для неиспользуемых действий (с фиктивным пользователем)" msgctxt "Operator" @@ -40050,6 +41719,10 @@ msgid "Reset the stencil transformation to the default" msgstr "Сбросить трансформацию трафарета на значения по умолчанию" +msgid "Clear the search filter" +msgstr "Очистить фильтр поиска" + + msgctxt "Operator" msgid "Context Menu" msgstr "Контекстное меню" @@ -40748,7 +42421,7 @@ msgstr "Выделить все треки, реконструкция кото msgid "Select markers using lasso selection" -msgstr "Выделить маркеры с помощью инструмента лассо" +msgstr "Выделить маркеры с помощью обводки" msgctxt "Operator" @@ -41490,7 +43163,7 @@ msgstr "Отключить, сохраняя трансформацию" msgid "Set the influence of this constraint to zero while trying to maintain the object's transformation. Other active constraints can still influence the final transformation" -msgstr "Установить влияние этого ограничителя на ноль, пытаясь сохранить положение объекта. Другие активные ограничители могут продолжать оказывать влияние на итоговую трансформацию." +msgstr "Установить влияние этого ограничителя на ноль, пытаясь сохранить положение объекта. Другие активные ограничители могут продолжать оказывать влияние на итоговую трансформацию" msgctxt "Operator" @@ -41573,6 +43246,10 @@ msgid "Select Random" msgstr "Выделить случайным образом" +msgid "Probability" +msgstr "Вероятность" + + msgctxt "Operator" msgid "Toggle Cyclic" msgstr "Переключить замкнутость" @@ -41955,7 +43632,7 @@ msgstr "Количество убранных из выделения элеме msgctxt "Operator" msgid "Select Previous" -msgstr "Выделить пред." +msgstr "Выделить предыдущее" msgid "Select control points preceding already selected ones along the curves" @@ -42581,7 +44258,7 @@ msgstr "Узел FBX «Null», схоже с пустышками в Blender (п msgid "'Root' FBX node, supposed to be the root of chains of bones..." -msgstr "Узел FBS «root», считается за корень цепочки костей" +msgstr "Узел FBX 'Root', считается за корень цепочки костей..." msgid "LimbNode" @@ -42589,7 +44266,7 @@ msgstr "Узел конечности (LimbNode)" msgid "'LimbNode' FBX node, a regular joint between two bones..." -msgstr "Узел FBS «LimbNode», обычное сочленение между двумя костями" +msgstr "Узел FBX 'LimbNode', обычное сочленение между двумя костями..." msgid "Baked Animation" @@ -42668,6 +44345,10 @@ msgid "Each collection (including master, non-data-block one) of the active scen msgstr "Все коллекции (включая мастер-коллекцию, не из датаблоков) активной сцены в файл, включая содержимое дочерних коллекций" +msgid "sRGB" +msgstr "sRGB" + + msgid "Embed Textures" msgstr "Встроить текстуры" @@ -43248,6 +44929,10 @@ msgid "Execute selected file" msgstr "Запустить выбранный файл" +msgid "Search for files of this type" +msgstr "Найти файлы этого типа" + + msgid "Show" msgstr "Показать" @@ -43256,6 +44941,14 @@ msgid "Play" msgstr "Воспроизвести" +msgid "Install" +msgstr "Установить" + + +msgid "Search for items in this folder" +msgstr "Искать в этой папке" + + msgctxt "Operator" msgid "Increment Number in Filename" msgstr "Увеличить счётчик в имени файла" @@ -44341,7 +46034,7 @@ msgstr "Автоматические веса" msgid "Ratio between bone length and influence radius" -msgstr "Соотношение между длинами костей и радиусами влияния" +msgstr "Соотношение между длинами костей и радиусами влияния" msgctxt "Operator" @@ -44770,11 +46463,11 @@ msgstr "Общие материалы" msgctxt "Operator" msgid "Lasso Select Strokes" -msgstr "Выделить штрихи инструментом Лассо" +msgstr "Выделить штрихи обводкой" msgid "Select Grease Pencil strokes using lasso selection" -msgstr "Выделить точки Grease Pencil с помощью инструмента лассо" +msgstr "Выделить штрихи Grease Pencil с помощью обводки" msgctxt "Operator" @@ -44903,7 +46596,7 @@ msgstr "Установить режим концов штрихов" msgid "Both" -msgstr "Оба(е)" +msgstr "С двух сторон" msgid "Set as default rounded" @@ -44945,6 +46638,10 @@ msgid "Create new geometry for closing stroke" msgstr "Создать новую геометрию для замыкания штриха" +msgid "Threshold on the maximum deviation from the actual stroke" +msgstr "Пороговое значение максимального отклонения от фактического штриха" + + msgctxt "Operator" msgid "Flip Stroke" msgstr "Перевернуть штрих" @@ -45033,6 +46730,14 @@ msgid "Use whole stroke, not only selected points" msgstr "Использовать весь штрих, а не только выделенные точки" +msgid "Saturation Threshold" +msgstr "Порог насыщенности" + + +msgid "Value Threshold" +msgstr "Порог значения" + + msgid "New Material" msgstr "Создать материал" @@ -45158,6 +46863,11 @@ msgid "Unlock all Grease Pencil layers so that they can be edited" msgstr "Разблокировать все слои Grease Pencil, чтобы их можно было редактировать" +msgctxt "Operator" +msgid "Vertex Paint Brightness/Contrast" +msgstr "Яркость/контраст рисования вершин" + + msgid "Adjust vertex color brightness/contrast" msgstr "Настроить яркость/контраст цветов вершин" @@ -45509,6 +47219,10 @@ msgid "Flip times of selected keyframes, effectively reversing the order they ap msgstr "Развернуть выделенные ключевые кадры по времени, обратив порядок их появления" +msgid "Cursor Value" +msgstr "Значение у курсора" + + msgctxt "Operator" msgid "Reveal Curves" msgstr "Отобразить скрытые кривые" @@ -45599,6 +47313,11 @@ msgid "Flat" msgstr "Плоский" +msgctxt "Operator" +msgid "Grease Pencil Draw Mode Toggle" +msgstr "Переключить режим рисования Grease Pencil" + + msgid "Duplicate" msgstr "Дублировать" @@ -45747,7 +47466,7 @@ msgstr "Ширина изображения" msgctxt "Operator" msgid "Open Image" -msgstr "Открыть изображение…" +msgstr "Открыть изображение" msgid "Open image" @@ -45858,7 +47577,7 @@ msgstr "Сэмплировать отрезок показать её в пан msgid "Mouse cursor style to use during the modal operator" -msgstr "Стиль курсора мыши, используемый во время работы с модальным оператором" +msgstr "Стиль курсора мыши, используемый во время работы с модальным оператором" msgid "X End" @@ -45897,7 +47616,7 @@ msgstr "Сохранить все изменённые изображения" msgctxt "Operator" msgid "Save As Image" -msgstr "Сохранить изображение как…" +msgstr "Сохранить изображение как" msgid "Save the image with another name and/or settings" @@ -46035,7 +47754,7 @@ msgstr "Обновить частоту кадров сцены" msgid "Set the scene framerate to that of the BVH file (note that this nullifies the 'Scale FPS' option, as the scale will be 1:1)" -msgstr "Установить такую же частоту кадров, как в файле BVH (внимание, это отменяет параметр «Mасштабировать FPS», он будет возвращен к значению 1:1)" +msgstr "Установить такую же частоту кадров, как в файле BVH (внимание, это отменяет параметр «Масштабировать FPS», он будет возвращен к значению 1:1)" msgid "Loop the animation playback" @@ -46043,7 +47762,7 @@ msgstr "Зациклить воспроизведение анимации" msgid "Scale FPS" -msgstr "Mасштабировать FPS" +msgstr "Масштабировать FPS" msgid "Scale the framerate from the BVH to the current scenes, otherwise each BVH frame maps directly to a Blender frame" @@ -46538,7 +48257,7 @@ msgstr "Переключить выделение всех видимых отч msgid "Toggle box selection" -msgstr "Переключать на прямоугольное выделение" +msgstr "Переключить на выделение прямоугольником" msgctxt "Operator" @@ -46914,7 +48633,7 @@ msgstr "Выделить точки кривой с помощью окружн msgid "Select curve points using lasso selection" -msgstr "Выделить точки кривой с помощью инструмента лассо" +msgstr "Выделить точки кривой с помощью обводки" msgid "Deselect spline points at the boundary of each selection region" @@ -47290,10 +49009,6 @@ msgid "Reverse Colors" msgstr "Обратить цвета" -msgid "Flip direction of vertex colors inside faces" -msgstr "Перевернуть направление цветов вершин внутри граней" - - msgctxt "Operator" msgid "Rotate Colors" msgstr "Повернуть цвета" @@ -48003,7 +49718,7 @@ msgstr "Обменять" msgid "Use with difference intersection to swap which side is kept" -msgstr "Cохраняемая сторона в режиме пересечения «разница»" +msgstr "Сохраняемая сторона в режиме пересечения «разница»" msgctxt "Operator" @@ -48212,6 +49927,10 @@ msgid "Strong" msgstr "Сильная" +msgid "Set Value" +msgstr "Установить значение" + + msgctxt "Operator" msgid "Recalculate Normals" msgstr "Пересчитать нормали" @@ -48259,7 +49978,7 @@ msgstr "Умножить нормали" msgid "Multiply normal vector with selection" -msgstr "Перемножить вектора нормалей с выделением" +msgstr "Перемножить вектора нормалей с выделением" msgid "Reset Normal" @@ -48434,7 +50153,7 @@ msgstr "Использовать точное преобразование" msgid "Proportional Editing" -msgstr "Пропорциональное редакт." +msgstr "Пропорциональное редактирование" msgid "Projected (2D)" @@ -50210,6 +51929,10 @@ msgid "Find Node" msgstr "Найти ноду" +msgid "Search for a node by name and focus and select it" +msgstr "Найти узел по имени и выбрать его" + + msgctxt "Operator" msgid "Edit Group" msgstr "Редактировать группу" @@ -50355,6 +52078,15 @@ msgid "Remove all links to selected nodes, and try to connect neighbor nodes tog msgstr "Удалить все связи с выделенными нодами и попытаться связать соседние ноды между собой" +msgctxt "Operator" +msgid "Mute Links" +msgstr "Выключить связи" + + +msgid "Use the mouse to mute links" +msgstr "Выключить связи с помощью мыши" + + msgctxt "Operator" msgid "Detach" msgstr "Отсоединить" @@ -50496,7 +52228,7 @@ msgstr "Выделить ноды со схожими свойствами" msgid "Select nodes using lasso selection" -msgstr "Выделить ноды с помощью лассо" +msgstr "Выделить ноды с помощью обводки" msgctxt "Operator" @@ -50514,7 +52246,7 @@ msgstr "Связать с нодой предпросмотра" msgctxt "Operator" msgid "Select Linked From" -msgstr "Выделить связанные из…" +msgstr "Выделить связанные из" msgid "Select nodes linked from the selected ones" @@ -50523,7 +52255,7 @@ msgstr "Выделить ноды, связанные обратной связ msgctxt "Operator" msgid "Select Linked To" -msgstr "Выделить связанные с…" +msgstr "Выделить связанные с" msgid "Select nodes linked to the selected ones" @@ -50532,7 +52264,7 @@ msgstr "Выделить ноды, связанные прямой связью msgctxt "Operator" msgid "Activate Same Type Next/Prev" -msgstr "Активировать след./пред. того же типа" +msgstr "Активировать вперёд/назад с тем же типом" msgid "Activate and view same node type, step by step" @@ -51739,7 +53471,7 @@ msgstr "Центр объекта к 3D-курсору" msgid "Move object origin to position of the 3D cursor" -msgstr "Переместить центр объекта объекта на место 3D-курсора" +msgstr "Переместить центр объекта на место 3D-курсора" msgid "Origin to Center of Mass (Surface)" @@ -52570,7 +54302,7 @@ msgstr "Трансформации в дельта" msgid "Convert normal object transforms to delta transforms, any existing delta transforms will be included as well" -msgstr "Преобразовать обычную трансформацию объекта в дельта-трансформацию, любые существующие дельта-трансформации будут так-же включены." +msgstr "Преобразовать обычную трансформацию объекта в дельта-трансформацию, любые существующие дельта-трансформации будут также включены" msgid "Which transforms to transfer" @@ -53860,7 +55592,7 @@ msgstr "Маска произвольной формы" msgid "Add mask within the lasso as you move the brush" -msgstr "Добавить маску внутри лассо-выделения" +msgstr "Добавить маску внутри выделения обводкой" msgctxt "Operator" @@ -54464,7 +56196,7 @@ msgstr "Предыдущий ключевой кадр" msgid "Frame number of keyframe immediately before the current frame" -msgstr "Номер кадра ближайшего ключевого ключевого кадра перед текущим кадром" +msgstr "Номер кадра ближайшего ключевого кадра перед текущим кадром" msgctxt "Operator" @@ -56133,6 +57865,11 @@ msgid "Save Screenshot" msgstr "Сохранить снимок экрана" +msgctxt "Operator" +msgid "Save Screenshot (Editor)" +msgstr "Сохранить снимок редактора" + + msgctxt "Operator" msgid "Cycle Space Context" msgstr "Цикл по контекстам пространства" @@ -56240,6 +57977,10 @@ msgid "Operation that is going to be applied to the mesh" msgstr "Операция, которая будет применена к мешу" +msgid "Change value" +msgstr "Изменить значение" + + msgctxt "Operator" msgid "Detail Flood Fill" msgstr "Детализационная заливка" @@ -56288,7 +58029,7 @@ msgstr "Автоматическое количество итераций" msgid "Use a automatic number of iterations based on the number of vertices of the sculpt" -msgstr "Использовать автоматическое количество итераций в зависимости от количества вершин модели." +msgstr "Использовать автоматическое количество итераций в зависимости от количества вершин модели" msgid "Filter that is going to be applied to the mask" @@ -56339,10 +58080,6 @@ msgid "Number of times that the filter is going to be applied" msgstr "Сколько раз фильтр будет применён" -msgid "Operator" -msgstr "Оператор" - - msgid "Applies a filter to modify the current mesh" msgstr "Применить фильтр, чтобы изменить текущий меш" @@ -57140,7 +58877,7 @@ msgstr "Смещение к данным клипа" msgctxt "Operator" msgid "Snap Strips to the Current Frame" -msgstr "Привязать клипы к текущему кадру" +msgstr "Сдвинуть клипы к текущему кадру" msgid "Frame where selected strips will be snapped" @@ -57681,7 +59418,7 @@ msgstr "Найти заданный текст" msgid "Find specified text and set as selected" -msgstr "Найти заданный текст и и установить выделение на результат поиска" +msgstr "Найти заданный текст и установить выделение на результат поиска" msgid "Indent selected text" @@ -57839,7 +59576,7 @@ msgstr "Сохранить текст активного датаблока" msgctxt "Operator" msgid "Save As" -msgstr "Сохранить как…" +msgstr "Сохранить как" msgid "Save active text file with options" @@ -59192,11 +60929,11 @@ msgstr "Выделить UV-вершины с помощью выделяюще msgctxt "Operator" msgid "Lasso Select UV" -msgstr "Выделить UV с помощью лассо" +msgstr "Выделить UV обводкой" msgid "Select UVs using lasso selection" -msgstr "Выделить UV-вершины с помощью инструмента лассо" +msgstr "Выделить UV-вершины с помощью обводки" msgid "Deselect UV vertices at the boundary of each selection region" @@ -59281,7 +61018,7 @@ msgstr "Отступ для уменьшения цветопротекания msgctxt "Operator" msgid "Snap Cursor" -msgstr "Переместить курсор к..." +msgstr "Переместить курсор к" msgid "Snap cursor to target type" @@ -59789,7 +61526,7 @@ msgstr "Выделить элементы с помощью выделяющей msgid "Select items using lasso selection" -msgstr "Выделить элементы при помощи выделяющего лассо" +msgstr "Выделить элементы при помощи выделяющей обводки" msgid "Menu object selection" @@ -59952,21 +61689,45 @@ msgid "Left" msgstr "Слева" +msgid "View from the left" +msgstr "Вид слева" + + msgctxt "View3D" msgid "Right" msgstr "Справа" +msgid "View from the right" +msgstr "Вид справа" + + msgctxt "View3D" msgid "Bottom" msgstr "Снизу" +msgid "View from the bottom" +msgstr "Вид снизу" + + +msgid "View from the top" +msgstr "Вид сверху" + + +msgid "View from the front" +msgstr "Вид спереди" + + msgctxt "View3D" msgid "Back" msgstr "Сзади" +msgid "View from the back" +msgstr "Вид сзади" + + msgctxt "Operator" msgid "View Camera" msgstr "Вид из камеры" @@ -60067,7 +61828,7 @@ msgstr "Панорамировать влево" msgid "Pan Right" -msgstr "Панорамировать вправо" +msgstr "Панорамировать вправо" msgid "Pan Up" @@ -60119,6 +61880,14 @@ msgid "Move the view to the selection center" msgstr "Переместить область просмотра к центру выделенных объектов" +msgid "Create a new Camera and VR Landmark from the viewer pose of the running VR session and select it" +msgstr "Создать новую камеру и VR-ориентир из позы зрителя запущенной VR сессии и выделить его" + + +msgid "Add VR landmark from the viewer pose of the running VR session to the list and select it" +msgstr "Добавить в список и выбрать VR-ориентир из позы зрителя в текущем сеансе VR" + + msgctxt "Operator" msgid "Walk Navigation" msgstr "Навигация ходьбой" @@ -61031,7 +62800,7 @@ msgstr "Задержка рендера" msgid "Time to display the rendered image before moving on (in seconds)" -msgstr "Время показа рендерa перед продолжением (в секундах)" +msgstr "Время показа рендера перед продолжением (в секундах)" msgid "Run once and exit" @@ -61151,6 +62920,10 @@ msgid "Object Properties" msgstr "Настройки объекта" +msgid "Export MTL library using PBR extensions (roughness, metallic, sheen, coat, anisotropy, transmission)" +msgstr "Экспортировать библиотеку MTL, используя расширения PBR (шероховатость, металлик, ткань, покрытие, анизотропию, передачу)" + + msgid "Import OBJ groups as vertex groups" msgstr "Импортировать группы OBJ как группы вершин" @@ -61514,6 +63287,10 @@ msgid "Reload Start-Up File" msgstr "Перезагрузить начальный файл" +msgid "Open the default file" +msgstr "Открыть файл по умолчанию" + + msgid "Path to an alternative start-up file" msgstr "Путь к альтернативному стартовому файлу" @@ -61563,7 +63340,7 @@ msgstr "Количество перерисовок" msgid "Time Limit" -msgstr "Временное ограничениеё" +msgstr "Ограничение времени" msgid "Seconds to run the test for (override iterations)" @@ -61637,13 +63414,17 @@ msgid "Exit Blender after saving" msgstr "Закрыть Blender после сохранения" +msgid "Save the current Blender file with a numerically incremented name that does not overwrite any existing files" +msgstr "Сохранить текущий файл Blender с численно увеличенным именем, которое не перезаписывает существующие файлы" + + msgctxt "Operator" msgid "Save Preferences" msgstr "Сохранить настройки" msgid "Make the current preferences default" -msgstr "Установить текущие настройки по умолчанию" +msgstr "Установить выбранные настройки по умолчанию" msgctxt "Operator" @@ -61788,6 +63569,11 @@ msgid "Toolbar" msgstr "Панель инструментов" +msgctxt "Operator" +msgid "Toolbar Prompt" +msgstr "Запрос панели инструментов" + + msgid "URL" msgstr "URL" @@ -61825,6 +63611,14 @@ msgid "Textures Directory" msgstr "Папка с текстурами" +msgid "Behavior when the name of an imported material conflicts with an existing material" +msgstr "Поведение при конфликте имени импортированного материала с именем существующего материала" + + +msgid "Behavior when the name of an imported texture file conflicts with an existing file" +msgstr "Поведение при конфликте имени импортируемого файла текстуры с существующим файлом" + + msgctxt "Operator" msgid "Close Window" msgstr "Закрыть окно" @@ -62368,14 +64162,6 @@ msgid "Panel containing UI elements" msgstr "Панель содержит элементы интерфейса" -msgid "Refraction" -msgstr "Преломление" - - -msgid "Denoising" -msgstr "Шумоподавление" - - msgid "Integrator Presets" msgstr "Предустановки интегратора" @@ -62742,7 +64528,7 @@ msgstr "Подстройка" msgctxt "Operator" msgid "Select Box" -msgstr "Прямоугольное выделение" +msgstr "Выделение прямоугольником" msgctxt "Operator" @@ -62752,7 +64538,7 @@ msgstr "Выделяющий круг" msgctxt "Operator" msgid "Select Lasso" -msgstr "Выделяющее лассо" +msgstr "Выделить обводкой" msgctxt "Operator" @@ -62769,6 +64555,10 @@ msgid "Scale" msgstr "Масштабировать" +msgid "Supports any combination of grab, rotate, and scale at once" +msgstr "Комбинация захвата, вращения и масштабирования" + + msgctxt "Operator" msgid "Rip Region" msgstr "Отделить область" @@ -63087,6 +64877,10 @@ msgid "Indirect Lighting" msgstr "Отражённое освещение" +msgid "Denoising" +msgstr "Шумоподавление" + + msgid "Shadows" msgstr "Тени" @@ -63782,6 +65576,10 @@ msgid "Post-Processing" msgstr "Постобработка" +msgid "Particle Tool" +msgstr "Инструмент частиц" + + msgid "Default tools for particle mode" msgstr "Инструменты по умолчанию для режима частиц" @@ -65042,6 +66840,10 @@ msgid "Align Object To" msgstr "Выравнивание новых объектов" +msgid "The default alignment for objects added from a 3D viewport menu" +msgstr "Выравнивание по умолчанию для объектов, добавленных из меню 3D-вида" + + msgid "Align newly added objects to the world coordinate system" msgstr "Выравнивать добавляемые объекты по мировой системе координат" @@ -66402,6 +68204,14 @@ msgid "Display splash screen on startup" msgstr "Отображать заставку при запуске" +msgid "Show Scene Duration" +msgstr "Показывать длительность сцены" + + +msgid "Show scene duration" +msgstr "Показывать длительность сцены" + + msgid "Tooltips" msgstr "Подсказки" @@ -66510,6 +68320,10 @@ msgid "Ask for confirmation when quitting with unsaved changes" msgstr "Запрашивать подтверждение при выходе с несохранёнными данными" +msgid "Text Subpixel Anti-Aliasing" +msgstr "Субпиксельное сглаживание текста" + + msgid "Translate Interface" msgstr "Переводить интерфейс" @@ -66806,6 +68620,10 @@ msgid "Control accuracy of motion blur, more steps gives more memory usage (actu msgstr "Точность размытия движения, чем выше, тем больше расход памяти (реальное количество шагов: 2^(шаги - 1))" +msgid "Shadow Terminator Shading Offset" +msgstr "Сдвиг терминатора тени" + + msgid "Use Adaptive Subdivision" msgstr "Использовать адаптивное подразделение" @@ -67019,7 +68837,7 @@ msgstr "Камера дробления" msgid "Camera to use as reference point when subdividing geometry, useful to avoid crawling artifacts in animations when the scene camera is moving" -msgstr "Камера, которая используется для ориентира при подразделении поверхности, полезно для избежания артефактов в анимации, когда камера движется." +msgstr "Камера, которая используется для ориентира при подразделении поверхности, помогает устранить смещающиеся артефакты в анимации, когда камера движется" msgid "Dicing Rate" @@ -67358,6 +69176,10 @@ msgid "Ignore per render layer number of samples" msgstr "Игнорировать послойные значения сэмплов" +msgid "Sample multiple lights more efficiently based on estimated contribution at every shading point" +msgstr "Использовать более эффективный алгоритм рассчёта нескольких источников света на основе оценки их вклада в освещение объектов" + + msgid "Volume Bounces" msgstr "Отскоки в объёме" @@ -68051,7 +69873,7 @@ msgstr "Выполнять проход расчёта подповерхнос msgid "Subsurface Indirect" -msgstr "Подпов. отраж." +msgstr "Подповерхностное отражение" msgid "Deliver subsurface indirect pass" @@ -68506,10 +70328,6 @@ msgid "Crop the rendered frame to the defined render region size" msgstr "Обрезать кадр рендера до заданной области рендера" -msgid "File Extensions" -msgstr "С расширением" - - msgid "Add the file format extensions to the rendered file name (eg: filename + .jpg)" msgstr "Добавлять расширение формата файла к имени результирующего файла рендера (например, имя_файла + .jpg)" @@ -69459,7 +71277,7 @@ msgstr "Радиус по множителю" msgid "Interaction radius is a factor of 4 * particle size" -msgstr "Радиус взаимодействия определяется как результат выражения 4 * размер частицы" +msgstr "Радиус взаимодействия определяется как результат выражения 4 * размер частицы" msgid "Factor Repulsion" @@ -71088,6 +72906,10 @@ msgid "Use a custom file to read proxy data from" msgstr "Использовать особый файл для чтения данных прокси" +msgid "Lock channel" +msgstr "Заблокировать канал" + + msgid "Mute channel" msgstr "Выключить канал" @@ -72736,6 +74558,16 @@ msgid "Node tree being displayed and edited" msgstr "Отображаемая и редактируемая нода системы" +msgctxt "ID" +msgid "Modifier" +msgstr "Модификатор" + + +msgctxt "ID" +msgid "Tool" +msgstr "Инструмент" + + msgid "Data-block whose nodes are being edited" msgstr "Датаблок редактируемой ноды" @@ -73077,6 +74909,11 @@ msgid "Object Constraint Properties" msgstr "Настройки ограничителей объекта" +msgctxt "ID" +msgid "Modifiers" +msgstr "Модификаторы" + + msgid "Modifier Properties" msgstr "Настройки модификаторов" @@ -73910,7 +75747,7 @@ msgstr "Директория, где хранится кэш освещённо msgid "SH Cache Path" -msgstr "Путь к кэшу студ. освещ." +msgstr "Путь к кэшу студии освещения" msgid "Path where the spherical harmonics cache is stored" @@ -74900,6 +76737,10 @@ msgid "Nonlinear Animation Channel" msgstr "Канал нелинейной анимации" +msgid "Sub-channel" +msgstr "Подканал" + + msgid "Meta Strips" msgstr "Метаклипы" @@ -76733,8 +78574,8 @@ msgid "Display vertex-per-face normals as lines" msgstr "Отображать нормали к вершинам на грань в виде линий" -msgid "Stat Vis" -msgstr "Визуализировать статистику" +msgid "Mesh Analysis" +msgstr "Анализ меша" msgid "Display statistical information about the mesh" @@ -77188,7 +79029,7 @@ msgstr "Ассет Cryptomatte" msgid "Render cryptomatte asset pass, for isolating groups of objects with the same parent" -msgstr "Рендерить проход ассетов Сryptomatte, изолирующий группы и объекты с общим родителем" +msgstr "Рендерить проход ассетов Cryptomatte, изолирующий группы и объекты с общим родителем" msgid "Cryptomatte Material" @@ -77196,7 +79037,7 @@ msgstr "Материал Cryptomatte" msgid "Render cryptomatte material pass, for isolating materials in compositing" -msgstr "Рендерить проход материалов Сryptomatte, изолирующий материалы в постобработке" +msgstr "Рендерить проход материалов Cryptomatte, изолирующий материалы в постобработке" msgid "Cryptomatte Object" @@ -77204,7 +79045,7 @@ msgstr "Объекты Cryptomatte" msgid "Render cryptomatte object pass, for isolating objects in compositing" -msgstr "Рендерить проход объектов Сryptomatte, изолирующий объекты в постобработке" +msgstr "Рендерить проход объектов Cryptomatte, изолирующий объекты в постобработке" msgctxt "Volume" @@ -77431,10 +79272,38 @@ msgid "WorkSpace UI Tags" msgstr "Теги интрефейса рабочего пространства" +msgid "Mouse button used for selection" +msgstr "Кнопка мыши, используемая для выделения" + + +msgid "Action when 'Space' is pressed" +msgstr "Действие по нажатию пробела" + + msgid "Search" msgstr "Поиск" +msgid "" +"Hold Alt-LMB to place the Cursor (instead of LMB), allows tools to activate on press instead of drag.\n" +"Incompatible with the input preference \"Emulate 3 Button Mouse\" when the \"Alt\" key is used" +msgstr "" +"Удерживайте Alt-ЛКМ для установки курсора (вместо ЛКМ), это позволяет активировать инструменты при нажатии, а не при перетаскивании.\n" +"Несовместимо с режимом ввода «‎Эмулировать 3-кнопочную мышь», если используется клавиша Alt" + + +msgid "" +"Hold Alt to use the active tool when the gizmo would normally be required\n" +"Incompatible with the input preference \"Emulate 3 Button Mouse\" when the \"Alt\" key is used" +msgstr "" +"Удерживайте Alt для использования инструмента, если требуется гизмо.\n" +"Несовместимо с режимом ввода «‎Эмулировать 3-кнопочную мышь», если используется клавиша Alt" + + +msgid "Action when 'Tilde' is pressed" +msgstr "Действия по нажатию тильды" + + msgid "Navigate" msgstr "Навигация" @@ -77491,7 +79360,7 @@ msgstr "Инструмент 3D-вида: сдвиг" msgctxt "WindowManager" msgid "3D View Tool: Select Box" -msgstr "Инструмент 3D-вида: прямоугольное выделение" +msgstr "Инструмент 3D-вида: выделение прямоугольником" msgctxt "WindowManager" @@ -77501,7 +79370,7 @@ msgstr "Инструмент 3D-вида: выделяющий круг" msgctxt "WindowManager" msgid "3D View Tool: Select Lasso" -msgstr "Инструмент 3D-вида: выделяющее лассо" +msgstr "Инструмент 3D-вида: выделяющая обводка" msgctxt "WindowManager" @@ -78260,6 +80129,10 @@ msgid "Volume Resolution" msgstr "Разрешение объёмов" +msgid "Max Samples" +msgstr "Макс. сэмплов" + + msgid "Min Samples" msgstr "Мин. сэмплов" @@ -78482,6 +80355,18 @@ msgid "Result" msgstr "Результат" +msgid "Generate Settings:" +msgstr "Настройки генерации:" + + +msgid "Animate Settings:" +msgstr "Настройки анимации:" + + +msgid "Render Settings:" +msgstr "Настройки рендера:" + + msgid "Demo Mode:" msgstr "Режим демонстрации:" @@ -78649,6 +80534,14 @@ msgid "Torus" msgstr "Тор" +msgid "No active bone to copy from" +msgstr "Нет активной кости, с которой можно что-то скопировать" + + +msgid "No selected bones to copy to" +msgstr "Нет выделенных костей, на которые можно что-то скопировать" + + msgid "Active object is not a mesh" msgstr "Активный объект не является мешем" @@ -78658,7 +80551,7 @@ msgstr "Перезагрузить начальный файл для восст msgid "Shortcuts" -msgstr "Сочетания клавиш" +msgstr "Раскладка" msgctxt "Operator" @@ -78678,6 +80571,14 @@ msgid "%s: %s" msgstr "%s: %s" +msgid "Import Existing Settings" +msgstr "Импортировать существующие настройки" + + +msgid "Create New Settings" +msgstr "Создать новые настройки" + + msgid "Select With" msgstr "Кнопка выделения" @@ -78695,6 +80596,16 @@ msgid "Getting Started" msgstr "Приступая к работе" +msgctxt "Operator" +msgid "Donate" +msgstr "Пожертвовать" + + +msgctxt "Operator" +msgid "What's New" +msgstr "Что нового" + + msgctxt "Operator" msgid "Credits" msgstr "Авторы" @@ -78729,6 +80640,15 @@ msgid "Assign" msgstr "Назначить" +msgid "Read about what's new in this version of Blender" +msgstr "Прочитайте о том, что нового появилось в этой версии Blender" + + +msgctxt "Operator" +msgid "See What's New..." +msgstr "Узнайте, что нового..." + + msgctxt "Operator" msgid "Manual" msgstr "Руководство" @@ -78761,6 +80681,11 @@ msgid "Branch: %s" msgstr "Ветка: %s" +msgctxt "Operator" +msgid "Load Blender %d.%d Settings" +msgstr "Загрузить настройки Blender %d.%d" + + msgid "Unknown" msgstr "Неизвестно" @@ -78830,6 +80755,10 @@ msgid "Extrapolate" msgstr "Экстраполировать" +msgid "Blender 2.6 doesn't support Python constraints yet" +msgstr "Blender 2.6 пока не поддерживает Python-ограничители" + + msgctxt "Operator" msgid "Add Target Bone" msgstr "Добавить целевую кость" @@ -79142,6 +81071,11 @@ msgid "Update on Edit" msgstr "Обновлять при редактировании" +msgctxt "Operator" +msgid "Search..." +msgstr "Поиск..." + + msgid "Distance Reference" msgstr "Эталонное расстояние" @@ -79957,6 +81891,10 @@ msgid "Light Clamping" msgstr "Ограничение яркости" +msgid "Refraction" +msgstr "Преломление" + + msgid "Cascade Size" msgstr "Размер каскадов" @@ -80421,7 +82359,7 @@ msgstr "Разместить" msgctxt "Operator" msgid "Box Select (Axis Range)" -msgstr "Прямоугольное выделение (по диапазону оси)" +msgstr "Выделение прямоугольником (по диапазону оси)" msgctxt "Operator" @@ -80599,7 +82537,7 @@ msgstr "Переключить тип экспозиционного листа" msgctxt "Operator" msgid "Box Select (Include Handles)" -msgstr "Прямоугольное выделение (включая рычаги)" +msgstr "Выделение прямоугольником (включая рычаги)" msgctxt "Operator" @@ -80688,7 +82626,7 @@ msgstr "Перейти к следующему слоту рендера" msgctxt "Operator" msgid "Box Select Pinned" -msgstr "Прямоугольное выделение закреплено" +msgstr "Выделение прямоугольником закреплено" msgctxt "Operator" @@ -80927,12 +82865,12 @@ msgstr "Вписать подложку в доступное пространс msgctxt "Operator" msgid "Activate Same Type Previous" -msgstr "Активировать предыдущую того же типа" +msgstr "Активировать назад с тем же типом" msgctxt "Operator" msgid "Activate Same Type Next" -msgstr "Активировать следующую того же типа" +msgstr "Активировать вперёд с тем же типом" msgctxt "Operator" @@ -81177,7 +83115,7 @@ msgstr "Обменять данные" msgctxt "Operator" msgid "Slip Strip Contents" -msgstr "Сместить содержимое клип" +msgstr "Сместить содержимое клипа" msgid "Position X" @@ -81578,6 +83516,10 @@ msgid "Intersections" msgstr "Пересечения" +msgid "Add cube to mesh interactively" +msgstr "Интерактивное добавление куба к мешу" + + msgctxt "Operator" msgid "Install Application Template..." msgstr "Установить шаблон приложения…" @@ -81655,7 +83597,7 @@ msgstr "Показать анимацию" msgctxt "Operator" msgid "Adjust Last Operation..." -msgstr "Настроить последнюю операцию" +msgstr "Настроить последнюю операцию..." msgctxt "Operator" @@ -81708,6 +83650,11 @@ msgid "Back to Previous" msgstr "К предыдущему виду" +msgctxt "Operator" +msgid "Save Incremental" +msgstr "Сохранить инкрементально" + + msgctxt "Operator" msgid "Save Copy..." msgstr "Сохранить копию…" @@ -81718,6 +83665,11 @@ msgid "General" msgstr "Общее" +msgctxt "Operator" +msgid "Load Factory Blender Settings" +msgstr "Загрузить заводские настройки Blender" + + msgctxt "Operator" msgid "Alembic (.abc)" msgstr "Alembic (.abc)" @@ -81787,6 +83739,14 @@ msgid "User Tooltips" msgstr "Подсказки для пользователей" +msgid "Sort by Most Recent" +msgstr "Сортировать по недавнему ипользованию" + + +msgid "Subpixel Anti-Aliasing" +msgstr "Субпиксельное сглаживание" + + msgid "Hinting" msgstr "Хинтинг" @@ -81803,6 +83763,10 @@ msgid "Scene Statistics" msgstr "Статистика сцены" +msgid "Scene Duration" +msgstr "Длительность сцены" + + msgid "System Memory" msgstr "Системная память" @@ -81912,6 +83876,11 @@ msgid "Axis X" msgstr "Ось X" +msgctxt "Text" +msgid "Weight" +msgstr "Вес" + + msgid "Shadow Offset X" msgstr "Отступ тени по X" @@ -82033,6 +84002,10 @@ msgid "Internet:" msgstr "Интернет:" +msgid "User:" +msgstr "Пользователь:" + + msgid "description" msgstr "описание" @@ -82224,6 +84197,16 @@ msgid "Levels" msgstr "Уровни" +msgctxt "Operator" +msgid "Hue/Saturation/Value" +msgstr "Тон/насыщенность/яркость" + + +msgctxt "Operator" +msgid "Brightness/Contrast" +msgstr "Яркость/контраст" + + msgctxt "Operator" msgid "Plane" msgstr "Плоскость" @@ -82828,10 +84811,6 @@ msgid "Vertex Group Weights" msgstr "Веса группы вершин" -msgid "Mesh Analysis" -msgstr "Анализ меша" - - msgid "Face Angle" msgstr "Угол грани" @@ -83392,6 +85371,16 @@ msgid "Camera Lens Scale" msgstr "Масштаб объектива камеры" +msgctxt "Operator" +msgid "Adjust Extrusion" +msgstr "Корректировать экструзию" + + +msgctxt "Operator" +msgid "Adjust Offset" +msgstr "Корректировать отступ" + + msgctxt "Operator" msgid "Remove from All" msgstr "Убрать из всех групп" @@ -83673,10 +85662,6 @@ msgid "Int" msgstr "Целое число" -msgid "PreviewCol" -msgstr "ЦветПредпросмотра" - - msgid "TexturedCol" msgstr "ЦветТекстуры" @@ -83701,10 +85686,6 @@ msgid "OS Loop" msgstr "Петля исходного пространства" -msgid "PreviewLoopCol" -msgstr "Цвет петли на предпросмотре" - - msgid "Source or destination meshes do not have any vertices, cannot transfer vertex data" msgstr "У мешей источника или получателя нет вершин, перенос данных вершин невозможен" @@ -83799,6 +85780,10 @@ msgid "Render error (%s) cannot save: '%s'" msgstr "Ошибка рендера (%s) нельзя сохранить: «%s»" +msgid "ipos" +msgstr "ipos" + + msgid "Key %d" msgstr "Ключ %d" @@ -84557,15 +86542,15 @@ msgstr "Инструмент скольжения" msgid "[X]/Y/Z axis only (X to clear)" -msgstr "Только ось [X]/Y/Z (X для отмены)" +msgstr "Только ось [X]/Y/Z (X для отмены)" msgid "X/[Y]/Z axis only (Y to clear)" -msgstr "Только ось X/[Y]/Z (Y для отмены)" +msgstr "Только ось X/[Y]/Z (Y для отмены)" msgid "X/Y/[Z] axis only (Z to clear)" -msgstr "Только ось X/Y/[Z] (Z для отмены)" +msgstr "Только ось X/Y/[Z] (Z для отмены)" msgid "X/Y/Z = Axis Constraint" @@ -84992,6 +86977,10 @@ msgid "Confirm: Enter/LClick, Cancel: (Esc/RClick) %s" msgstr "Подтвердить: Enter/ЛКМ, Отменить: (Esc/ПКМ) %s" +msgid "Skin_light" +msgstr "Skin_light" + + msgid "Failed to set value" msgstr "Ошибка установки значения" @@ -85183,6 +87172,18 @@ msgid "Hex" msgstr "Hex" +msgid "Hue:" +msgstr "Тон:" + + +msgid "Saturation:" +msgstr "Насыщенность:" + + +msgid "Hue, Saturation, Lightness" +msgstr "Тон, насыщенность, светимость" + + msgid "Lightness" msgstr "Яркость" @@ -85191,6 +87192,16 @@ msgid "Hex triplet for color (#RRGGBB)" msgstr "Цвет в шестнадцатеричном формате (#RRGGBB)" +msgctxt "Color" +msgid "Value:" +msgstr "Яркость:" + + +msgctxt "Color" +msgid "Value" +msgstr "Яркость" + + msgid "Redo" msgstr "Вернуть" @@ -85643,7 +87654,7 @@ msgstr "Создать" msgid "%d items" -msgstr "%d элем." +msgstr "%d элементов" msgid "Manual Transform" @@ -86466,7 +88477,7 @@ msgstr "Конструктивные модификаторы не могут б msgid "Reshape can work only with higher levels of subdivisions" -msgstr "Изменение формы работает только с более высоким уровнем подразделений" +msgstr "Изменение формы работает только с более высоким уровнем подразделений" msgid "Second selected mesh object required to copy shape from" @@ -86873,6 +88884,30 @@ msgid "Rigid Body World has no associated physics data to export" msgstr "У среды твёрдых тел нет связанных физических данных для экспорта" +msgid "3D Local View " +msgstr "Локальный 3D-вид " + + +msgid "3D View " +msgstr "3D-вид " + + +msgid "Frame:" +msgstr "Кадр:" + + +msgid "Time:" +msgstr "Время:" + + +msgid "Mem:%.2fM (Peak %.2fM)" +msgstr "| Память:%.2fМбайт, пик: %.2fМбайт" + + +msgid "Mem:%.2fM, Peak: %.2fM" +msgstr "Память:%.2fМбайт, пик: %.2fМбайт" + + msgid "Cannot write a single file with an animation format selected" msgstr "Невозможно записать анимацию в одиночный файл выбранного формата" @@ -87379,7 +89414,7 @@ msgstr "%d × %d" msgid ", %d float channel(s)" -msgstr ", %d нецелочисл. кан." +msgstr ", %d нецелочисленных каналов" msgid ", RGBA float" @@ -87399,7 +89434,7 @@ msgstr ", RGB 8 бит/канал" msgid ", %.2f fps" -msgstr ", %.2f кадров/с." +msgstr ", %.2f кадров/с" msgid ", failed to load" @@ -87495,7 +89530,7 @@ msgstr "Ошибка при создании папки с заданным им msgid "'%s' given path is OS-invalid, creating '%s' path instead" -msgstr "Путь «%s» для системы неверен, изменён на «%s»" +msgstr "Путь «%s» для системы неверен, изменён на «%s»" msgid "Could not create new folder: %s" @@ -87784,7 +89819,7 @@ msgstr "Не удалось загрузить изображение" msgid "%d float channel(s)" -msgstr "%d нецелочисл. кан." +msgstr "%d нецелочисленных каналов" msgid " RGBA float" @@ -87959,6 +89994,10 @@ msgid "Select an existing NLA Track or an empty action line first" msgstr "Сначала выделите существующий трек НЛА или пустую строку действия" +msgid " Named Attribute" +msgstr " Именованный атрибут" + + msgid "More than one collection is selected" msgstr "Выделено больше одной коллекции" @@ -88000,7 +90039,7 @@ msgid "" "* Shift to set children" msgstr "" "Временно скрыть во вьюпорте\n" -"* Shift — установить также и на потомков" +"* Shift — применить также и на потомков" msgid "" @@ -88008,7 +90047,7 @@ msgid "" "* Shift to set children" msgstr "" "Запретить выделять объект во вьюпорте\n" -"* Shift — установить также и на потомков" +"* Shift — применить также и на потомков" msgid "" @@ -88016,7 +90055,7 @@ msgid "" "* Shift to set children" msgstr "" "Глобально убрать объект во вьюпортах\n" -"* Shift — установить также и на потомков" +"* Shift — применить также и на потомков" msgid "" @@ -88024,7 +90063,7 @@ msgid "" "* Shift to set children" msgstr "" "Глобально отключить на рендере\n" -"* Shift — установить также и на потомков" +"* Shift — применить также и на потомков" msgid "Restrict visibility in the 3D View" @@ -88060,7 +90099,7 @@ msgid "" "* Ctrl to isolate collection\n" "* Shift to set inside collections" msgstr "" -"Объекты из коллекции видны только через отражённые лучи (через тени и отражения) в этом слое визуализации:\n" +"Объекты из коллекции видны только через отражённые лучи (через тени и отражения) в этом слое визуализации:\n" "* Ctrl: изолировать коллекцию\n" "* Shift: установить внутри коллекции" @@ -88211,6 +90250,10 @@ msgid "File '%s' could not be loaded" msgstr "Файл «%s» не может быть загружен" +msgid "Please select all related strips" +msgstr "Необходимо выделить все связанные клипы" + + msgid "Cannot apply effects to audio sequence strips" msgstr "Невозможно применить эффекты к аудиоклипам" @@ -88235,10 +90278,6 @@ msgid "No valid inputs to swap" msgstr "Нет допустимых входов для обмена" -msgid "Please select all related strips" -msgstr "Необходимо выделить все связанные клипы" - - msgid "Please select two strips" msgstr "Необходимо выделить два клипа" @@ -88336,7 +90375,7 @@ msgstr "Нет недавних файлов" msgid "Open Recent" -msgstr "Недавние файлы…" +msgstr "Недавние файлы" msgid "Undo History" @@ -88636,7 +90675,7 @@ msgstr "Вставлено %d объектов" msgid "No active element found!" -msgstr "Не найден активный элемент" +msgstr "Не найден активный элемент!" msgid "No active camera" @@ -89262,7 +91301,7 @@ msgstr "Кривая «%s» не содержит заданный сплайн" msgid "Dependency graph update requested during evaluation" -msgstr "Запрашивать обновления графа зависимостей во время выполнения " +msgstr "Запрашивать обновления графа зависимостей во время выполнения" msgid "Variable does not exist in this driver" @@ -89775,7 +91814,7 @@ msgstr "Свойство «%s.%s» не найдено" msgid "Gizmo target '%s.%s' expects '%s', '%s.%s' is '%s'" -msgstr "Для цели Gizmo '%s.%s' ожидается '%s', '%s.%s' является '%s'" +msgstr "Для цели Gizmo '%s.%s' ожидается '%s', '%s.%s' является '%s'" msgid "Gizmo target property '%s.%s' expects an array of length %d, found %d" @@ -89799,7 +91838,7 @@ msgstr "wmOwnerID «%s» не в рабочем пространстве «%s»" msgid "Operator '%s' not found!" -msgstr "Оператор «%s» не найден" +msgstr "Оператор «%s» не найден!" msgid "Gizmo group '%s' not found!" @@ -89936,7 +91975,7 @@ msgstr "Снаружи" msgid "Adaptive Subdivision" -msgstr " Адаптивное подразделение" +msgstr "Адаптивное подразделение" msgid "Levels Viewport" @@ -89975,6 +92014,14 @@ msgid "Fac" msgstr "Коэфф." +msgid "Inner Mask" +msgstr "Внутренняя маска" + + +msgid "Outer Mask" +msgstr "Внешняя маска" + + msgid "Dot" msgstr "Скаляр" @@ -90051,14 +92098,42 @@ msgid "Random Roughness" msgstr "Нерегулярность шероховатости" +msgid "Optional factor for modulating the component which is transmitted into the hair, reflected off the backside of the hair and then transmitted out of the hair. This component is oriented approximately around the incoming direction, and picks up the color of the pigment inside the hair. Keep this 1.0 for physical correctness" +msgstr "Дополнительный коэффициент для регулировки компонента, который попадает в волос, отражается от его обратной стороны и затем выходит из волоса. Этот компонент ориентирован примерно вокруг входящего направления и принимает цвет пигмента внутри волоса. Оставьте значение 1.0 для физической корректности" + + +msgid "Subsurface Weight" +msgstr "Вес подповерхностного рассеивания" + + msgid "Subsurface Radius" msgstr "Радиус подповерхностного рассеивания" +msgid "Subsurface Scale" +msgstr "Масштаб подповерхностного рассеивания" + + +msgid "Subsurface IOR" +msgstr "Коэффициент преломления подповерхностного рассеивания" + + +msgid "Subsurface Anisotropy" +msgstr "Анизотропия подповерхностного рассеивания" + + msgid "Anisotropic Rotation" msgstr "Поворот анизотропии" +msgid "Sheen Weight" +msgstr "Вес эффекта ткани" + + +msgid "Sheen Roughness" +msgstr "Шероховатость эффекта ткани" + + msgid "Emission Color" msgstr "Цвет свечения" @@ -90067,6 +92142,24 @@ msgid "Emission Strength" msgstr "Интенсивность свечения" +msgctxt "NodeTree" +msgid "Specular Tint" +msgstr "Оттенок блика" + + +msgctxt "NodeTree" +msgid "Sheen Tint" +msgstr "Оттенок ткани" + + +msgid "Blend between diffuse surface and subsurface scattering. Typically should be zero or one (either fully diffuse or subsurface)" +msgstr "Смесь между диффузным поверхностным и подповерхностным рассеянием. Обычно равна нулю или единице (либо полностью диффузное, либо подповерхностное рассеяние)" + + +msgid "Sheen" +msgstr "Ткань" + + msgid "View Vector" msgstr "Вектор вида" @@ -90108,7 +92201,7 @@ msgstr "Вект. к наблюдателю" msgid "Parametric" -msgstr "Параметр. коорд." +msgstr "Параметрические" msgid "Backfacing" @@ -90379,6 +92472,11 @@ msgid "Hue Correct" msgstr "Смена оттенка" +msgctxt "Sequence" +msgid "Brightness/Contrast" +msgstr "Яркость/контраст" + + msgctxt "Sequence" msgid "Tonemap" msgstr "Тоновая карта" @@ -90489,7 +92587,7 @@ msgstr "Невозможно перезаписать используемую msgid "Saved \"%s\"" -msgstr " «%s» сохранено" +msgstr "«%s» сохранено" msgid "Not a library" @@ -90606,7 +92704,7 @@ msgstr "Регистрация класса оператора: «%s», неве msgid "Registering operator class: '%s', invalid bl_idname '%s', is too long, maximum length is %d" -msgstr "Регистрация класса оператора: «%s», слишком длинный bl_idname «%s», максимальная длина — %d зн." +msgstr "Регистрация класса оператора: «%s», слишком длинный bl_idname «%s», максимальная длина — %d" msgid "Registering operator class: '%s', invalid bl_idname '%s', must contain 1 '.' character" @@ -90649,6 +92747,10 @@ msgid "Property from path '%s' has length %d instead of %d" msgstr "Длина свойства по пути «%s» составляет %d, а не %d" +msgid "%d × %s: %.4f ms, average: %.8f ms" +msgstr "%d × %s: %.4f мс, в среднем: %.8f мс" + + msgctxt "WindowManager" msgid "Limited Platform Support" msgstr "Платформа поддерживается ограниченно" @@ -90674,6 +92776,16 @@ msgid "Platform Unsupported" msgstr "Платформа не поддерживается" +msgctxt "WindowManager" +msgid "Your graphics card or macOS version is not supported" +msgstr "Ваша видеокарта или драйвер не поддерживается" + + +msgctxt "WindowManager" +msgid "Upgrading to the latest macOS version may improve Blender support" +msgstr "Обновление до последней версии macOS может улучшить поддержку Blender" + + msgctxt "WindowManager" msgid "Your graphics card or driver is not supported." msgstr "Ваша видеокарта или драйвер не поддерживается." @@ -90708,6 +92820,10 @@ msgid "Stereo 3D Mode requires the window to be fullscreen" msgstr "Для работы в режиме стерео-3d необходимо полноэкранное окно" +msgid "(Unsaved)" +msgstr "(Не сохранено)" + + msgctxt "WorkSpace" msgid "2D Animation" msgstr "2D-анимация" @@ -90773,6 +92889,10 @@ msgid "Video Editing" msgstr "Редактирование видео" +msgid "This is an early, limited preview of in development VR support for Blender." +msgstr "Это ранний, ограниченный пробный вариант разрабатываемой поддержки VR для Blender." + + msgid "UV Layout" msgstr "UV-развёртка" @@ -90980,3 +93100,23 @@ msgstr "В процессе" msgid "Starting" msgstr "Недавно начатые" + +msgid "Surface Normal" +msgstr "Нормаль к поверхности" + + +msgid "Blend Radius" +msgstr "Радиус смешения" + + +msgid "Duplicate Hair Curves" +msgstr "Дублировать кривую волос" + + +msgid "Hair Attachment Info" +msgstr "Информация о прикреплении волос" + + +msgid "Smooth by Angle" +msgstr "Сглаживание под углом" + diff --git a/locale/po/sk.po b/locale/po/sk.po index 8a68f26aa58..988a8640ced 100644 --- a/locale/po/sk.po +++ b/locale/po/sk.po @@ -1,10 +1,10 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" -"PO-Revision-Date: 2023-11-30 09:34+0000\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" +"PO-Revision-Date: 2023-12-11 10:34+0000\n" "Last-Translator: Jozef Matta \n" "Language-Team: Slovak \n" "Language: sk\n" @@ -1362,6 +1362,11 @@ msgid "Scene" msgstr "Scéna" +msgctxt "ID" +msgid "Screen" +msgstr "Obrazovka" + + msgctxt "ID" msgid "Sound" msgstr "Zvuk" @@ -1534,6 +1539,14 @@ msgid "Collection of custom asset tags" msgstr "Kolekcia vlastných príznakov aktív" +msgid "Asset Weak Reference" +msgstr "Slabý odkaz na aktívum" + + +msgid "Weak reference to some asset" +msgstr "Slabý odkaz na nejaké aktívum" + + msgid "Geometry attribute" msgstr "Atribút geometrie" @@ -1690,6 +1703,10 @@ msgid "Layer" msgstr "Vrstva" +msgid "Attribute on Grease Pencil layer" +msgstr "Atribút na vrstve Pastelky" + + msgid "Is Internal" msgstr "Je interný" @@ -1943,7 +1960,7 @@ msgstr "Maximálna vzdialenosť lúčov pre združovanie bodov medzi aktívnymi msgid "Normal Space" -msgstr "Priestor normálov" +msgstr "Priestor normál" msgid "Axis to bake in blue channel" @@ -1983,7 +2000,7 @@ msgstr "Osi na zapečenie v červenom kanáli" msgid "Choose normal space for baking" -msgstr "Vyberie priestor normálov pre zapečenie" +msgstr "Vyberie priestor normál pre zapečenie" msgid "Object" @@ -2378,6 +2395,10 @@ msgid "Grease Pencil v3" msgstr "Pastelka v3" +msgid "Grease Pencil v3 data-blocks" +msgstr "Blok údajov Pastelky v3" + + msgid "Hair Curves" msgstr "Krivky vlasov" @@ -3900,6 +3921,10 @@ msgid "Bones" msgstr "Kosti" +msgid "Bones assigned to this bone collection. In armature edit mode this will always return an empty list of bones, as the bone collection memberships are only synchronized when exiting edit mode" +msgstr "Kosti priradené k tejto kolekcii kostí. V režime editácie armatúry to vždy vráti prázdny zoznam kostí, pretože príslušnosť ku kolekcii kostí sa synchronizuje až po opustení režimu editácie" + + msgid "Is Editable" msgstr "Je upraviteľné" @@ -4428,7 +4453,7 @@ msgstr "Smer výplne" msgid "Normal" -msgstr "Normál" +msgstr "Normála" msgid "Fill internal area" @@ -5744,7 +5769,7 @@ msgstr "Vnútorná maximálna odchýlka pružiny" msgid "How much the rays used to connect the internal points can diverge from the vertex normal" -msgstr "Koľko lúčov použitých na spojenie vnútorných bodov sa môže líšiť od normálu vrcholu" +msgstr "Koľko lúčov použitých na spojenie vnútorných bodov sa môže líšiť od normály vrcholu" msgid "Internal Spring Max Length" @@ -5760,7 +5785,7 @@ msgstr "Skontrolujte normály vnútornej pružiny" msgid "Require the points the internal springs connect to have opposite normal directions" -msgstr "Vyžaduje body, ktoré spájajú vnútorné pružiny, aby mali opačný smer normálov" +msgstr "Vyžaduje body, ktoré spájajú vnútorné pružiny, aby mali opačný smer normál" msgid "Tension Stiffness" @@ -6264,7 +6289,7 @@ msgstr "Jednostranný" msgid "Cloth collision acts with respect to the collider normals (improves penetration recovery)" -msgstr "Pôsobenie kolízia plášťa s ohľadom na kolízie normálov (zlepšuje zotavenie z prerazenia)" +msgstr "Pôsobenie kolízie plášťa s ohľadom na kolízie normál (zlepšuje zotavenie z prerazenia)" msgid "Override Normals" @@ -6272,7 +6297,7 @@ msgstr "Prepísať normály" msgid "Cloth collision impulses act in the direction of the collider normals (more reliable in some cases)" -msgstr "Impulzy kolízie plášťa účinkujú v smere kolíznych normálov (v niektorých prípadoch spoľahlivejšie)" +msgstr "Impulzy kolízie plášťa účinkujú v smere kolíznych normál (v niektorých prípadoch spoľahlivejšie)" msgid "Kill Particles" @@ -6304,7 +6329,7 @@ msgstr "Sú údaje" msgid "Treat image as non-color data without color management, like normal or displacement maps" -msgstr "Zaobchádza s obrázkom ako s nefarebnými údajmi bez správy farieb, ako sú napríklad mapovanie normálov alebo posunov" +msgstr "Zaobchádza s obrázkom ako s nefarebnými údajmi bez správy farieb, ako sú napríklad mapovanie normál alebo posunov" msgid "Input Color Space" @@ -8581,11 +8606,11 @@ msgstr "Zmrští polohu na najbližší cieľový vrchol" msgid "Target Normal Project" -msgstr "Premietnuť cieľový normál" +msgstr "Premietnuť cieľovú normálu" msgid "Shrink the location to the nearest target surface along the interpolated vertex normals of the target" -msgstr "Zmrští polohu na najbližší cieľový povrch pozdĺž interpolovaných normálov vrcholov cieľa" +msgstr "Zmrští polohu na najbližší cieľový povrch pozdĺž interpolovaných normál vrcholov cieľa" msgid "Target Mesh object" @@ -8593,7 +8618,7 @@ msgstr "Cieľová povrchová sieť objektu" msgid "Axis that is aligned to the normal" -msgstr "Os zarovnaná na normál" +msgstr "Os zarovnaná na normálu" msgid "Invert Cull" @@ -8613,11 +8638,11 @@ msgstr "Premietnutie určený v oboch a opačných smeroch" msgid "Align Axis To Normal" -msgstr "Zarovnať os na normál" +msgstr "Zarovnať os na normálu" msgid "Align the specified axis to the surface normal" -msgstr "Zarovná určenú os na normál povrchu" +msgstr "Zarovná určenú os na normálu povrchu" msgid "Snap Mode" @@ -8649,7 +8674,7 @@ msgstr "Bod je vynútený na povrchu cieľového objektu, posunom vzdialenosti v msgid "The point is constrained to the surface of the target object, with distance offset applied exactly along the target normal" -msgstr "Bod je vynútený na povrchu cieľového objektu, s posunom vzdialenosti presne pozdĺž cieľového normálu" +msgstr "Bod je vynútený na povrchu cieľového objektu, s posunom vzdialenosti presne pozdĺž cieľovej normály" msgid "Spline IK Constraint" @@ -9409,7 +9434,7 @@ msgstr "Rovina pre premietaný ťah" msgid "Normal to Surface" -msgstr "Normál na povrch" +msgstr "Normála na povrch" msgid "Draw in a plane perpendicular to the surface" @@ -13118,6 +13143,18 @@ msgid "Whether this path is saved in bookmarks, or generated from OS" msgstr "Či táto cesta je uložená v záložkách, alebo generovaná operačným systémom" +msgid "File Extensions" +msgstr "Prípony súborov" + + +msgid "Operator" +msgstr "Operátor" + + +msgid "Label" +msgstr "Nápis" + + msgid "File Select Entry" msgstr "Položka výberu súboru" @@ -15172,7 +15209,7 @@ msgstr "Násobiteľ rýchlosti zdroja prešiel do kvapaliny (rýchlosť zdroja j msgid "Amount of normal directional velocity" -msgstr "Veľkosť smerovej rýchlosti normálov" +msgstr "Veľkosť smerovej rýchlosti normál" msgid "Amount of random velocity" @@ -18695,7 +18732,7 @@ msgstr "Úrovne rozdelenia" msgid "Number of subdivisions that must be performed before extracting vertices' positions and normals" -msgstr "Počet delení, ktoré sa musia vykonať pred extrahovaním pozícií vrcholov a normálov" +msgstr "Počet delení, ktoré sa musia vykonať pred extrahovaním pozícií vrcholov a normál" msgid "Mesh target to shrink to" @@ -18739,7 +18776,7 @@ msgstr "Zmrští povrchovú sieť na najbližší cieľový vrchol" msgid "Shrink the mesh to the nearest target surface along the interpolated vertex normals of the target" -msgstr "Zmrští povrchovú sieť na najbližší cieľový povrch pozdĺž interpólovaných normálov vrcholov cieľa" +msgstr "Zmrští povrchovú sieť na najbližší cieľový povrch pozdĺž interpólovaných normál vrcholov cieľa" msgid "Select how vertices are constrained to the target surface" @@ -19218,6 +19255,34 @@ msgid "Grid scale" msgstr "Mierka mriežky" +msgid "Collection of related drawings" +msgstr "Kolekcia súvisiacich kresieb" + + +msgid "Set layer visibility" +msgstr "Nastaviť viditeľnosť vrstvy" + + +msgid "Grease Pencil Layer Group" +msgstr "Skupina vrstiev Pastelky" + + +msgid "Group of Grease Pencil layers" +msgstr "Skupina vrstiev Pastelky" + + +msgid "Set layer group visibility" +msgstr "Nastaviť viditeľnosť skupiny vrstiev" + + +msgid "Protect group from further editing and/or frame changes" +msgstr "Ochráni skupinu pred ďalšími úpravami a/alebo zmenami snímok" + + +msgid "Group name" +msgstr "Názov skupiny" + + msgid "Grease Pencil Layers" msgstr "Vrstvy pastelky" @@ -19262,6 +19327,10 @@ msgid "Active index in layer mask array" msgstr "Aktívny index v poli vrstiev masky" +msgid "Collection of Grease Pencil layers" +msgstr "Kolekcia vrstiev Pastelky" + + msgid "Active Grease Pencil layer" msgstr "Aktívna vrstva pastelky" @@ -19644,7 +19713,7 @@ msgstr "Zobrazí kosti ako jednoduché 2D čiary s bodkami" msgid "B-Bone" -msgstr "Kosť ohybu" +msgstr "ohyb kosti" msgid "Display bones as boxes, showing subdivision and B-Splines" @@ -20761,11 +20830,11 @@ msgstr "Normálny polomer" msgid "Ratio between the brush radius and the radius that is going to be used to sample the normal" -msgstr "Pomer medzi polomerom štetca a polomerom použitým na snímku normálu" +msgstr "Pomer medzi polomerom štetca a polomerom použitým na snímku normály" msgid "Normal Weight" -msgstr "Váha normálov" +msgstr "Normálna váha" msgid "How much grab will pull vertices out of surface during a grab" @@ -21311,11 +21380,11 @@ msgstr "Ovplyvní iba vrcholy, ktoré zdieľajú nastavenie plôšky s aktívnym msgid "Area Normal" -msgstr "Oblasť normálu" +msgstr "Normálna oblasť" msgid "Affect only vertices with a similar normal to where the stroke starts" -msgstr "Ovplyvní iba vrcholy s podobným normálom, ako je miesto, kde začína ťah" +msgstr "Ovplyvní iba vrcholy s podobnou normálou, ako je miesto, kde začína ťah" msgid "Affect only vertices connected to the active vertex under the brush" @@ -21323,11 +21392,11 @@ msgstr "Ovplyvní iba vrcholy spojené s aktívnym vrcholom pod štetcom" msgid "View Normal" -msgstr "Zobraziť normál" +msgstr "Zobraziť normálu" msgid "Affect only vertices with a normal that faces the viewer" -msgstr "Ovplyvní iba vrcholy s normálom, ktorý je otočený k divákovi" +msgstr "Ovplyvní iba vrcholy s normálou, ktorá je otočená k divákovi" msgid "Occlusion" @@ -21499,11 +21568,11 @@ msgstr "Povolí citlivosť na tlak tabletu pre posuv" msgid "Original Normal" -msgstr "Originálny normál" +msgstr "Originálna normála" msgid "When locked keep using normal of surface where stroke was initiated" -msgstr "Keď je zamknutá zachová použitie normálov povrchu, kde bol začatý ťah" +msgstr "Keď je zamknutá zachová použitie normály povrchu, kde bol začatý ťah" msgid "Original Plane" @@ -22646,7 +22715,7 @@ msgstr "Polovičná" msgid "Distance to move the curve parallel to its normals" -msgstr "Vzdialenosť na posun krivky rovnobežne s jej normálmi" +msgstr "Vzdialenosť na posun krivky rovnobežne s jej normálami" msgid "Path Duration" @@ -23146,7 +23215,7 @@ msgstr "Normály" msgid "The curve normal value at each of the curve's control points" -msgstr "Hodnota normálu krivky v každom z riadiacich bodov krivky" +msgstr "Hodnota normály krivky v každom z riadiacich bodov krivky" msgid "Control points of all curves" @@ -24065,6 +24134,14 @@ msgid "Layer Groups" msgstr "Skupiny vrstiev" +msgid "Grease Pencil layer groups" +msgstr "Skupiny vrstiev Pastelky" + + +msgid "Grease Pencil layers" +msgstr "Vrstvy Pastelky" + + msgid "Image data-block referencing an external or packed image" msgstr "Blok údajov obrázku odkazujúci na externý alebo zabalený obrázok" @@ -25016,6 +25093,10 @@ msgid "Probe clip start, below which objects will not appear in reflections" msgstr "Snímač začiatok klipu, za ktorým sa objekty nezobrazia v odrazoch" +msgid "Display Data Size" +msgstr "Veľkosť zobrazenia údajov" + + msgid "Viewport display size of the sampled data" msgstr "Veľkosť zobrazenia záberu snímaných údajov" @@ -25105,11 +25186,11 @@ msgstr "Plynulejšia interpolácia vyžiarenia, ale pridáva ľahké presvitanie msgid "Normal Bias" -msgstr "Sklon normálu" +msgstr "Sklon normály" msgid "Offset sampling of the irradiance grid in the surface normal direction to reduce light bleeding" -msgstr "Posunutie vzorkovania mriežky ožiarenia v smere normály povrchu s cieľom znížiť presvitanie svetla" +msgstr "Posunutie snímania mriežky ožiarenia v smere normály povrchu s cieľom znížiť presvitanie svetla" msgid "Resolution X" @@ -25256,6 +25337,10 @@ msgid "Enable custom settings for the parallax correction volume" msgstr "Povolí vlastné nastavenia pre objem korekcie paralaxy" +msgid "Display Data" +msgstr "Údaje zobrazenia" + + msgid "Display sampled data in the viewport to debug captured light" msgstr "Zobrazenie snímaných údajov v zábere na ladenie zachyteného svetla" @@ -25465,6 +25550,10 @@ msgid "Line art settings for material" msgstr "Nastavenie Čiarovej grafiky pre materiál" +msgid "Max Vertex Displacement" +msgstr "Maximálny posun vrcholu" + + msgid "The max distance a vertex can be displaced. Displacements over this threshold may cause visibility issues" msgstr "Maximálna vzdialenosť, o ktorú môže byť vrchol posunutý. Posun nad túto hranicu môže spôsobiť problémy s viditeľnosťou" @@ -25645,10 +25734,18 @@ msgid "Controls the blending and the compatibility with certain features" msgstr "Riadi prelínanie a kompatibilitu s určitými funkciami" +msgid "Dithered" +msgstr "Rozptýlené" + + msgid "Allows for grayscale hashed transparency, and compatible with render passes and raytracing. Also known as deferred rendering" msgstr "Umožňuje priehľadnosť v odtieňoch sivej a je kompatibilný s priechodmi prekresľovania a sledovaním lúčov. Známe aj ako odložené prekresľovanie" +msgid "Blended" +msgstr "Prelínané" + + msgid "Allows for colored transparency, but incompatible with render passes and raytracing. Also known as forward rendering" msgstr "Umožňuje farebnú priehľadnosť, ale je nekompatibilný s priechodmi prekresľovania a sledovaním lúčov. Známe aj ako dopredné prekresľovanie" @@ -25673,6 +25770,10 @@ msgid "Use back face culling to hide the back side of faces" msgstr "Použitím vyradenia zadnej plôšky sa skryje zadná strana plôšky" +msgid "Shadow Backface Culling" +msgstr "Vyradenie tienenia zadnej plôšky" + + msgid "Use back face culling when casting shadows" msgstr "Pri vrhaní tieňov použije vylúčenie zadnej plôšky" @@ -25713,6 +25814,10 @@ msgid "Use transparent shadows for this material if it contains a Transparent BS msgstr "Použije priehľadné tiene pre tento materiál, ak obsahuje transparentné BSDF, vypnutím sa bude prekresľovať rýchlejšie, ale nedáva presné tiene" +msgid "Volume Intersection Method" +msgstr "Metóda prekríženia objemov" + + msgid "Determines which inner part of the mesh will produce volumetric effect" msgstr "Určuje, ktorá vnútorná časť povrchovej siete bude vytvárať objemový efekt" @@ -25758,7 +25863,7 @@ msgstr "Má vlastné normály" msgid "True if there are custom split normals data in this mesh" -msgstr "Platí, ak existujú vlastné údaje delenia normálov v tejto povrchovej sieti" +msgstr "Platí, ak existujú vlastné údaje delenia normál v tejto povrchovej sieti" msgid "Triangle Faces" @@ -25789,6 +25894,10 @@ msgid "Normal Domain" msgstr "Bežná doména" +msgid "The attribute domain that gives enough information to represent the mesh's normals" +msgstr "Doména atribútov, ktorá poskytuje dostatok informácií na reprezentáciu normál povrchovej siete" + + msgid "Corner" msgstr "Rohové" @@ -25798,7 +25907,7 @@ msgstr "Normály polygónov" msgid "The normal direction of each face, defined by the winding order and position of its vertices" -msgstr "Smer normálu každej steny definovaný poradím navíjania a polohou jej vrcholov" +msgstr "Smer normály každej steny definovaný poradím navíjania a polohou jej vrcholov" msgid "Polygons" @@ -25937,6 +26046,18 @@ msgid "Fix Poles" msgstr "Opraviť póly" +msgid "Produces fewer poles and a better topology flow" +msgstr "Vytvorí menej pólov a vylepšuje prúdenie topológie" + + +msgid "Preserve Attributes" +msgstr "Zachovať atribúty" + + +msgid "Transfer all attributes to the new mesh" +msgstr "Prenos všetkých atribútov do novej povrchovej siete" + + msgid "Projects the mesh to preserve the volume and details of the original mesh" msgstr "Premietne povrchovú sieť pre zachovanie objemu a detailov pôvodnej povrchovej siete" @@ -25994,7 +26115,7 @@ msgstr "Normály vrcholov" msgid "The normal direction of each vertex, defined as the average of the surrounding face normals" -msgstr "Normálový smer každého vrcholu definovaný ako priemer normálov okolitých plôšok" +msgstr "Smer normály každého vrcholu definovaný ako priemer normál okolitých plôšok" msgid "Vertices" @@ -26129,10 +26250,6 @@ msgid "Node tree consisting of linked nodes used for shading, textures and compo msgstr "Uzol stromu pozostávajúci z prepojených uzlov používaných na tieňovanie, textúry a kompozíciu" -msgid "Label" -msgstr "Nápis" - - msgid "The node tree label" msgstr "Nápis uzla stromu" @@ -26321,6 +26438,18 @@ msgid "Use GPU accelerated compositing with more limited functionality" msgstr "Použijete GPU akcelerovanú kompozíciu s obmedzenejšou funkčnosťou" +msgid "The precision of compositor intermediate result" +msgstr "Presnosť medzivýsledku kompozítora" + + +msgid "Full precision for final renders, half precision otherwise" +msgstr "Plná presnosť pre finálne prekreslenie, polovičná presnosť v ostatných prípadoch" + + +msgid "Full precision" +msgstr "Úplná presnosť" + + msgid "Render Quality" msgstr "Kvalita prekreslenia" @@ -26377,6 +26506,10 @@ msgid "The node group is used in edit mode" msgstr "Skupina uzlov sa používa v režime editácie" +msgid "The node group is used in object mode" +msgstr "Skupina uzlov sa používa v režime objektu" + + msgid "Sculpt" msgstr "Tvarovanie" @@ -26717,6 +26850,22 @@ msgid "Modifiers affecting the data of the grease pencil object" msgstr "Modifikátory ovplyvňujúce údaje objektu pastelky" +msgid "Disable in Planar Light Probes" +msgstr "Zakázať v snímačoch rovinného osvetlenia" + + +msgid "Globally disable in planar light probes" +msgstr "Globálne zakázané v snímačoch rovinného osvetlenia" + + +msgid "Disable in Spherical Light Probes" +msgstr "Zakázať v sférických snímačoch svetla" + + +msgid "Globally disable in spherical light probes" +msgstr "Globálne zakázané v snímačoch sférického osvetlenia" + + msgid "Disable in Volume Probes" msgstr "Zakázať v snímačoch objemu" @@ -27210,7 +27359,7 @@ msgstr "Nastavenia pre simuláciu mäkkého telesa" msgid "Axis that points in the 'forward' direction (applies to Instance Vertices when Align to Vertex Normal is enabled)" -msgstr "Os smerujúca „vpred“ (platí pre vrcholy inštancií, keď je povolená možnosť Zarovnať podľa normálu vrcholu)" +msgstr "Os smerujúca „vpred“ (platí pre vrcholy inštancií, keď je povolená možnosť Zarovnať podľa normály vrcholu)" msgctxt "ID" @@ -27238,7 +27387,7 @@ msgstr "Prázdny" msgid "Axis that points in the upward direction (applies to Instance Vertices when Align to Vertex Normal is enabled)" -msgstr "Os smerujúca nahor (platí pre vrcholy inštancií, keď je zapnutá možnosť Zarovnať podľa normálu vrcholu)" +msgstr "Os smerujúca nahor (platí pre vrcholy inštancií, keď je zapnutá možnosť Zarovnať podľa normály vrcholu)" msgid "Camera Parent Lock" @@ -27274,11 +27423,11 @@ msgstr "Mierka inštancie na základe veľkosti plôšky" msgid "Orient with Normals" -msgstr "Orientácia normálmi" +msgstr "Orientácia normálami" msgid "Rotate instance according to vertex normal" -msgstr "Otáča inštanciou podľa normálov vrcholov" +msgstr "Otáča inštanciou podľa normál vrcholov" msgid "Enable mesh symmetry in the X axis" @@ -27916,7 +28065,7 @@ msgstr "Zdanlivý" msgid "Let the surface normal give the particle a starting velocity" -msgstr "Dovolí normálu povrchu dať častici počiatočnú rýchlosť" +msgstr "Dovolí normále povrchu dať častici počiatočnú rýchlosť" msgid "Object Aligned" @@ -28064,7 +28213,7 @@ msgstr "Osi orientácie častíc (neovplyvňuje výsledky modifikátora výbuchu msgid "Normal-Tangent" -msgstr "Normál-dotyčnica" +msgstr "Normála-dotyčnica" msgid "Velocity / Hair" @@ -29549,7 +29698,7 @@ msgstr "Stupne sivej" msgid "Size of derivative offset used for calculating normal" -msgstr "Veľkosť derivačného posuvu použitého na výpočet normálu" +msgstr "Veľkosť derivačného posuvu použitého na výpočet normály" msgid "Noise Basis" @@ -29935,11 +30084,11 @@ msgstr "Zrkadlový odraz obrazu v smere Y" msgid "Normal Map" -msgstr "Mapovanie normálu" +msgstr "Mapa normál" msgid "Use image RGB values for normal mapping" -msgstr "Používa obrazové RGB hodnoty pre mapovanie normálu" +msgstr "Používa obrazové RGB hodnoty pre mapovanie normál" msgid "Magic Texture" @@ -30462,6 +30611,14 @@ msgid "Maintained by community developers" msgstr "Udržiavané komunitou vývojárov" +msgid "Testing" +msgstr "Testovanie" + + +msgid "Newly contributed scripts (excluded from release builds)" +msgstr "Novo pridané skripty (vylúčené z vydaných zostáv)" + + msgid "Asset Blend Path" msgstr "Cesta prelínania aktív" @@ -31374,6 +31531,14 @@ msgid "Cycle the images in the movie" msgstr "Cyklicky prechádza obrázky vo filme" +msgid "Index Switch Item" +msgstr "Prepínač indexu položiek" + + +msgid "Consistent identifier used for the item" +msgstr "Zjednocujúci identifikátor používaný pre položku" + + msgid "2D Integer Vector Attribute Value" msgstr "Hodnota atribútu 2D vektora celého čísla" @@ -34259,7 +34424,7 @@ msgstr "Upraví geometriu ťahu tak, aby zodpovedala jeho hlavnej línii smeru" msgid "Displacement that is applied to the main direction line along its normal" -msgstr "Posunutie, ktoré sa aplikuje na hlavný smer čiary pozdĺž jeho normálu" +msgstr "Posunutie, ktoré sa aplikuje na hlavný smer čiary pozdĺž jeho normály" msgid "Add one-dimensional Perlin noise to stroke backbone geometry" @@ -35876,6 +36041,10 @@ msgid "Index of this loop" msgstr "Index tejto slučky" +msgid "The normal direction of the face corner, taking into account sharp faces, sharp edges, and custom normal data" +msgstr "Smer normály rohu plôšky so zohľadnením ostrých plôšok, ostrých hrán a vlastných údajov normály" + + msgid "Local space unit length tangent vector of this vertex for this face (must be computed beforehand using calc_tangents)" msgstr "Vektor dotyčnice dĺžky lokálnej priestorovej jednotky tohto vrcholu pre túto plôšku (musí sa vypočítať vopred pomocou calc_tangents)" @@ -35949,11 +36118,11 @@ msgstr "Index zásobníka materiálu tohto trojuholníka" msgid "Triangle Normal" -msgstr "Normál trojuholníka" +msgstr "Normála trojuholníka" msgid "Local space unit length normal vector for this triangle" -msgstr "Jednotná dĺžky vektora normálu miestneho priestoru pre tento trojuholník" +msgstr "Jednotná dĺžky vektora normály miestneho priestoru pre tento trojuholník" msgid "Polygon" @@ -35968,6 +36137,10 @@ msgid "Split Normals" msgstr "Rozdeliť normály" +msgid "Local space unit length split normal vectors of the face corners of this triangle" +msgstr "Lokálne jednotkové dĺžkové vektory normál rohov plôšky tohto trojuholníka" + + msgid "Indices of triangle vertices" msgstr "Indexy vrcholov trojuholníka" @@ -35985,11 +36158,11 @@ msgstr "Kolekcia slučiek povrchovej siete" msgid "Mesh Normal Vector" -msgstr "Vektor normálu povrchovej siete" +msgstr "Vektor normály povrchovej siete" msgid "Vector in a mesh normal array" -msgstr "Vektor v poli normálov povrchovej siete" +msgstr "Vektor v poli normál povrchovej siete" msgid "Mesh Polygon" @@ -36041,11 +36214,11 @@ msgstr "Index zásuvky materiálu tejto plôšky" msgid "Polygon Normal" -msgstr "Normál polygónu" +msgstr "Normála polygónu" msgid "Local space unit length normal vector for this face" -msgstr "Vektor normálu lokálnej jednotkovej dĺžky priestoru pre túto plôšku" +msgstr "Vektor normály lokálnej jednotkovej dĺžky priestoru pre túto plôšku" msgid "Freestyle Face Mark" @@ -36273,7 +36446,7 @@ msgstr "Index tohto vrcholu" msgid "Vertex Normal" -msgstr "Normál vrcholu" +msgstr "Normála vrcholu" msgid "Undeformed Location" @@ -36417,11 +36590,11 @@ msgstr "Deformuje sieť alebo krivku pomocou externej vyrovnávacej pamäte povr msgid "Normal Edit" -msgstr "Úprava normálov" +msgstr "Úprava normál" msgid "Modify the direction of the surface normals" -msgstr "Upravuje smer normálov povrchu" +msgstr "Upravuje smer normály povrchu" msgid "Weighted Normal" @@ -36429,7 +36602,7 @@ msgstr "Vážené normály" msgid "Modify the direction of the surface normals using a weighting method" -msgstr "Upravuje smer normálov povrchu použitím metódy váženia" +msgstr "Upravuje smer normály povrchu použitím metódy vplyvu" msgid "UV Project" @@ -37557,7 +37730,7 @@ msgstr "Vlastné normály" msgid "Transfer custom normals" -msgstr "Prenos vlastných normálov" +msgstr "Prenos vlastných normál" msgid "Transfer color attributes" @@ -37645,7 +37818,7 @@ msgstr "Interpólovaná premietnutá hrana" msgid "Interpolate all source edges hit by the projection of destination one along its own normal (from vertices)" -msgstr "Interpoluje všetky zdrojové hrany dotknuté premietnutím prvej cieľovej vedľa svojho vlastného normálu (z vrcholov)" +msgstr "Interpoluje všetky zdrojové hrany dotknuté premietnutím prvej cieľovej vedľa svojho vlastnej normály (z vrcholov)" msgid "Islands Precision" @@ -37729,19 +37902,19 @@ msgstr "Metóda používaná na priradenie rohov zdrojových plôšok do nejakej msgid "Nearest Corner and Best Matching Normal" -msgstr "Najbližší roh a najvhodnejší normál" +msgstr "Najbližší roh a najvhodnejšia normála" msgid "Copy from nearest corner which has the best matching normal" -msgstr "Kopíruje z najbližšieho rohu s najvhodnejším normálom" +msgstr "Kopíruje z najbližšieho rohu s najvhodnejšou normálou" msgid "Nearest Corner and Best Matching Face Normal" -msgstr "Najbližší roh a najvhodnejší normál plôšky" +msgstr "Najbližší roh a najvhodnejšia normála plôšky" msgid "Copy from nearest corner which has the face with the best matching normal to destination corner's face one" -msgstr "Kopíruje z najbližšieho rohu plôšky s najvhodnejším normálom na jednu cieľovú rohovú plôšku" +msgstr "Kopíruje z najbližšieho rohu plôšky s najvhodnejšou normálou na jednu cieľovú rohovú plôšku" msgid "Nearest Corner of Nearest Face" @@ -37765,7 +37938,7 @@ msgstr "Premietaná interpólovaná plôška" msgid "Copy from interpolated corners of the source face hit by corner normal projection" -msgstr "Kopíruje z interpolovaných rohov zdrojovej plôšky zasiahnutej premietnutím rohovým normálom" +msgstr "Kopíruje z interpolovaných rohov zdrojovej plôšky zasiahnutej premietnutím rohovou normálou" msgid "Max Distance" @@ -37845,15 +38018,15 @@ msgstr "Kopíruje z najbližšej plôšky (pomocou stredových bodov)" msgid "Best Normal-Matching" -msgstr "Najvhodnejší normál" +msgstr "Najvhodnejšia normála" msgid "Copy from source face which normal is the closest to destination one" -msgstr "Kopíruje zo zdrojovej plôšky, ktorej normál je najbližšie k cieľovej" +msgstr "Kopíruje zo zdrojovej plôšky, ktorej normála je najbližšie k cieľovej" msgid "Interpolate all source polygons intersected by the projection of destination one along its own normal" -msgstr "Interpoluje všetky zdrojové polygóny pretínajúce premietanie jedného cieľa mimo jeho vlastného normálu" +msgstr "Interpoluje všetky zdrojové polygóny pretínajúce premietanie jedného cieľa mimo jeho vlastnej normály" msgid "Ray Radius" @@ -37949,7 +38122,7 @@ msgstr "Kopíruje interpólované hodnoty vrcholov z najbližšieho bodu na najb msgid "Copy from interpolated values of vertices from point on closest face hit by normal-projection" -msgstr "Kopíruje interpólované hodnoty vrcholov z bodu na najbližšiu plôšku v dosahu premietania normálu" +msgstr "Kopíruje interpólované hodnoty vrcholov z bodu na najbližšiu plôšku v dosahu premietania normály" msgid "Vertex group name for selecting the affected areas" @@ -38097,15 +38270,15 @@ msgstr "Použije hodnotu intenzity textúry na presun v smere Z" msgid "Use the texture's intensity value to displace along the vertex normal" -msgstr "Použije hodnotu intenzity textúry na presun pozdĺž normálu vrcholu" +msgstr "Použije hodnotu intenzity textúry na presun pozdĺž normály vrcholu" msgid "Custom Normal" -msgstr "Vlastný normál" +msgstr "Vlastná normála" msgid "Use the texture's intensity value to displace along the (averaged) custom normal (falls back to vertex)" -msgstr "Použije hodnotu intenzity textúry na presun pozdĺž (priemernej) vlastnej normálu (padá späť na vrchol)" +msgstr "Použije hodnotu intenzity textúry na presun pozdĺž (priemernej) vlastnej normály (padá späť na vrchol)" msgid "RGB to XYZ" @@ -38864,7 +39037,7 @@ msgstr "Umiestnenie na disku, kde sú uložené údaje o zapečení" msgid "Normal Edit Modifier" -msgstr "Modifikátor úpravy normálu" +msgstr "Modifikátor úpravy normály" msgid "Modifier affecting/generating custom normals" @@ -38872,15 +39045,15 @@ msgstr "Modifikátor ovplyvňujúci/vytvárajúci vlastné normály" msgid "How much of generated normals to mix with existing ones" -msgstr "Koľko z vygenerovaných normálov sa zmieša s existujúcimi" +msgstr "Koľko z vygenerovaných normál sa zmieša s existujúcimi" msgid "Maximum angle between old and new normals" -msgstr "Maximálny uhol medzi starými a novými normálmi" +msgstr "Maximálny uhol medzi starými a novými normálami" msgid "How to mix generated normals with existing ones" -msgstr "Spôsob zmiešania generovaných normálov s existujúcimi" +msgstr "Spôsob zmiešania generovaných normál s existujúcimi" msgid "Copy" @@ -38892,7 +39065,7 @@ msgstr "Kopíruje nové normály (prepíše existujúce)" msgid "Copy sum of new and old normals" -msgstr "Kopíruje súčet nových a starých normálov" +msgstr "Kopíruje súčet nových a starých normál" msgid "Copy new normals minus old normals" @@ -38900,7 +39073,7 @@ msgstr "Kopíruje nové normály mínus staré normály" msgid "Copy product of old and new normals (not cross product)" -msgstr "Kopíruje súčin starých a nových normálov (*nie* vektorový súčin)" +msgstr "Kopíruje súčin starých a nových normál (*nie* vektorový súčin)" msgid "How to affect (generate) normals" @@ -38916,7 +39089,7 @@ msgstr "Smerové" msgid "Normals 'track' (point to) the target object" -msgstr "'Stopa' normálov (ukazuje na) cieľový objekt" +msgstr "'Stopa' normál (ukazuje na) cieľový objekt" msgid "Lock Polygon Normals" @@ -38924,7 +39097,7 @@ msgstr "Normály uzamknutého polygónu" msgid "Do not flip polygons when their normals are not consistent with their newly computed custom vertex normals" -msgstr "Nepoužije preklopenie polygónov, keď ich normály nie sú v súlade s ich novo vypočítanými vlastnými vrcholmi normálov" +msgstr "Nepoužije preklopenie polygónov, keď ich normály nie sú v súlade s ich novo vypočítanými vlastnými normálami vrcholmi" msgid "Offset from object's center" @@ -38932,7 +39105,7 @@ msgstr "Posuv od stredu objektu" msgid "Target object used to affect normals" -msgstr "Cieľový objekt použitý na ovplyvnenie normálov" +msgstr "Cieľový objekt použitý na ovplyvnenie normál" msgid "Parallel Normals" @@ -39164,7 +39337,7 @@ msgstr "Vygenerovať normály" msgid "Output normals for bump mapping - disabling can speed up performance if it's not needed" -msgstr "Výstup normálov pre mapovanie nerovností - zakázanie môže urýchliť výkon, ak nie je potrebný" +msgstr "Výstup normál pre mapovanie nerovností - zakázanie môže urýchliť výkon, ak nie je potrebný" msgid "Generate Spray Map" @@ -39834,7 +40007,7 @@ msgstr "Obráti smerovanie plôšky" msgid "High Quality Normals" -msgstr "Vysoká kvalita normálov" +msgstr "Vysoká kvalita normál" msgid "Calculate normals which result in more even thickness (slow, disable when not needed)" @@ -40641,31 +40814,31 @@ msgstr "Cyklický efekt zvlnenia" msgid "Displace along normals" -msgstr "Premiestnenie pozdĺž normálov" +msgstr "Presun pozdĺž normál" msgid "X Normal" -msgstr "X normálu" +msgstr "X normály" msgid "Enable displacement along the X normal" -msgstr "Povolí presúvanie pozdĺž X normálu" +msgstr "Povolí presúvanie pozdĺž X normály" msgid "Y Normal" -msgstr "Y normálu" +msgstr "Y normály" msgid "Enable displacement along the Y normal" -msgstr "Povolí presúvanie pozdĺž Y normálu" +msgstr "Povolí presúvanie pozdĺž Y normály" msgid "Z Normal" -msgstr "Y normálu" +msgstr "Z normály" msgid "Enable displacement along the Z normal" -msgstr "Povolí presúvanie pozdĺž Z normálu" +msgstr "Povolí presúvanie pozdĺž Z normály" msgid "X axis motion" @@ -40685,7 +40858,7 @@ msgstr "Vzdialenosť medzi vlnami" msgid "WeightedNormal Modifier" -msgstr "Modifikátor Váženia normálov" +msgstr "Modifikátor Váženia normál" msgid "Keep Sharp" @@ -40693,7 +40866,7 @@ msgstr "Zachovať ostré" msgid "Keep sharp edges as computed for default split normals, instead of setting a single weighted normal for each vertex" -msgstr "Zachová ostré hrany vypočítané pre pôvodné rozdelenie normálov, namiesto stanovenia jedného váženého normálu pre každý vrchol" +msgstr "Zachová ostré hrany vypočítané pre pôvodné rozdelenie normál, namiesto stanovenia jedného váženej normály pre každý vrchol" msgid "Weighting Mode" @@ -40701,7 +40874,7 @@ msgstr "Režim váženia" msgid "Weighted vertex normal mode to use" -msgstr "Režim na použitie určenia váhy normálu vrcholu" +msgstr "Režim na použitie určenia váhy normály vrcholu" msgid "Face Area" @@ -40709,11 +40882,11 @@ msgstr "Oblasť plôšok" msgid "Generate face area weighted normals" -msgstr "Vygeneruje váhu normálov oblasti plôšok" +msgstr "Vygeneruje váhu normál oblasti plôšok" msgid "Generate corner angle weighted normals" -msgstr "Vygeneruje váhu normálov rohového uhla" +msgstr "Vygeneruje váhu normál rohového uhla" msgid "Face Area & Angle" @@ -40721,7 +40894,7 @@ msgstr "Oblasť plôšky a uhol" msgid "Generated normals weighted by both face area and angle" -msgstr "Vygeneruje váhu normálov oblasti plôšky a rohového uhla" +msgstr "Vygeneruje váhu normál oblasti plôšky a rohového uhla" msgid "Threshold value for different weights to be considered equal" @@ -45274,6 +45447,10 @@ msgid "Instances of objects or collections" msgstr "Inštancie objektov alebo kolekcií" +msgid "Grease Pencil component containing layers and curves data" +msgstr "Komponent Pastelky obsahujúci údaje o vrstvách a krivkách" + + msgid "Attribute Statistic" msgstr "Atribút Štatistika" @@ -45711,11 +45888,11 @@ msgstr "Body rozloží náhodne po povrchu, pričom zohľadní minimálnu vzdial msgid "Legacy Normal" -msgstr "Zdediť normál" +msgstr "Zdediť normálu" msgid "Output the normal and rotation values that have been output before the node started taking smooth normals into account" -msgstr "Vygeneruje hodnoty normálov a rotácie, ktoré boli výstupom predtým, ako uzol začal brať do úvahy vyhladené hodnoty normálov" +msgstr "Vygeneruje hodnoty normál a rotácie, ktoré boli výstupom predtým, ako uzol začal brať do úvahy vyhladené hodnoty normál" msgid "Dual Mesh" @@ -45742,10 +45919,18 @@ msgid "Edge Paths to Curves" msgstr "Cesty hrán na krivky" +msgid "Output curves following paths across mesh edges" +msgstr "Výstupné krivky sledujúce cesty cez hrany povrchovej siete" + + msgid "Edge Paths to Selection" msgstr "Cesty hrán na výber" +msgid "Output a selection of edges by following paths across mesh edges" +msgstr "Výstup výberu hrán sledovaním ciest cez hrany povrchovej siete" + + msgid "Edges of Corner" msgstr "Hrany rohu" @@ -45843,7 +46028,7 @@ msgstr "Preklopiť plôšky" msgid "Reverse the order of the vertices and edges of selected faces, flipping their normal direction" -msgstr "Obráti poradie vrcholov a hrán vybraných plôšok a prevráti smer ich normál" +msgstr "Obráti poradie vrcholov a hrán vybraných plôšok a prevráti smer ich normály" msgid "Geometry to Instance" @@ -45899,6 +46084,14 @@ msgid "Find the nearest element in a group. Similar to the \"Sample Nearest\" no msgstr "Nájde najbližší prvok v skupine. Podobne ako uzol \"Najbližšia snímka\"" +msgid "Index Switch" +msgstr "Prepínač indexov" + + +msgid "Choose between an arbitrary number of values with an index" +msgstr "Výber medzi ľubovoľným počtom hodnôt s indexom" + + msgid "Curve Handle Positions" msgstr "Pozície manipulátora krivky" @@ -45912,7 +46105,7 @@ msgstr "Náklon krivky" msgid "Retrieve the angle at each control point used to twist the curve's normal around its tangent" -msgstr "Získava uhol v každom riadiacom bode, ktorý sa používa na otočenie normálu krivky okolo jej dotyčnice" +msgstr "Získava uhol v každom riadiacom bode, ktorý sa používa na otočenie normály krivky okolo jej dotyčnice" msgid "Is Edge Smooth" @@ -45992,7 +46185,7 @@ msgstr "Je plôška rovinná" msgid "Retrieve whether all triangles in a face are on the same plane, i.e. whether they have the same normal" -msgstr "Zisťuje, či sú všetky trojuholníky na plôške v tej istej rovine, t. j. či majú rovnaký normál" +msgstr "Zisťuje, či sú všetky trojuholníky na plôške v tej istej rovine, t. j. či majú rovnakú normálu" msgid "Face Neighbors" @@ -46031,6 +46224,14 @@ msgid "The data type used to read the attribute values" msgstr "Typ údajov použitý na čítanie hodnôt atribútov" +msgid "Named Layer Selection" +msgstr "Výber pomenovanej vrstvy" + + +msgid "Output a selection of a grease pencil layer" +msgstr "Výstup výberu vrstvy Pastelky" + + msgid "Retrieve a unit length vector indicating the direction pointing away from the geometry at each element" msgstr "Získava vektor jednotkovej dĺžky udávajúceho smer smerujúci od geometrie pri každom prvku" @@ -46059,6 +46260,10 @@ msgid "Shortest Edge Paths" msgstr "Najkratšie cesty hrán" +msgid "Find the shortest paths along mesh edges to selected end vertices, with customizable cost per edge" +msgstr "Hľadá najkratšie cesty pozdĺž hrán povrchovej siete k vybraným koncovým vrcholom s prispôsobiteľnými nákladmi na hranu" + + msgid "Is Spline Cyclic" msgstr "Je drážka cyklická" @@ -46652,7 +46857,7 @@ msgstr "Nastaví pozície pre manipulátory Bézierových kriviek" msgid "Set Curve Normal" -msgstr "Nastaviť normál krivky" +msgstr "Nastaviť normálu krivky" msgid "Set the evaluation mode for curve normals" @@ -46660,7 +46865,7 @@ msgstr "Nastaví režim vyhodnotenia pre normály krivky" msgid "Mode for curve normal evaluation" -msgstr "Režim pre vyhodnocovania normálu krivky" +msgstr "Režim pre vyhodnocovania normály krivky" msgid "Minimum Twist" @@ -46740,7 +46945,7 @@ msgstr "Nastaviť vyhladenie tieňa" msgid "Control the smoothness of mesh normals around each face by changing the \"shade smooth\" attribute" -msgstr "Ovláda vyhladenie normálov povrchovej siete okolo každej plôšky zmenou atribútu \"vyhladený tieň\"" +msgstr "Ovláda vyhladenie normál povrchovej siete okolo každej plôšky zmenou atribútu \"vyhladený tieň\"" msgid "Set Spline Cyclic" @@ -46763,6 +46968,10 @@ msgid "Simulation Input" msgstr "Vstup simulácie" +msgid "Input data for the simulation zone" +msgstr "Vstupné údaje pre zónu simulácie" + + msgid "Simulation Output" msgstr "Výstup simulácie" @@ -46791,6 +47000,14 @@ msgid "Duplicate mesh edges and break connections with the surrounding faces" msgstr "Vytvára kópie hrán povrchovej siete a prerušuje spojenie s okolitými plôškami" +msgid "Split to Instances" +msgstr "Rozdeliť na inštancie" + + +msgid "Create separate geometries containing the elements from the same group" +msgstr "Vytvorí samostatné geometrie obsahujúce prvky z tej istej skupiny" + + msgid "Store Named Attribute" msgstr "Uložiť pomenovaný atribút" @@ -47457,7 +47674,7 @@ msgstr "Nerovnosti" msgid "Generate a perturbed normal from a height texture for bump mapping. Typically used for faking highly detailed surfaces" -msgstr "Vygeneruje narušený normál z textúry výšky na mapovanie hrboľov. Zvyčajne sa používa na falšovanie veľmi detailných povrchov" +msgstr "Vygeneruje narušenú normálu z textúry výšky na mapovanie hrboľov. Zvyčajne sa používa na falšovanie veľmi detailných povrchov" msgid "Invert the bump mapping direction to push into the surface instead of out" @@ -47549,7 +47766,7 @@ msgstr "BSDF Odraz" msgid "Similar to the Principled BSDF node but uses the specular workflow instead of metallic, which functions by specifying the facing (along normal) reflection color. Energy is not conserved, so the result may not be physically accurate" -msgstr "Podobne ako uzol Principiálne BSDF, ale namiesto kovového používa zrkadlový pracovný postup, ktorý funguje tak, že určuje farbu odrazu smerom k povrchu (pozdĺž normálu). Energia sa nezachováva, takže výsledok nemusí byť fyzikálne presný" +msgstr "Podobne ako uzol Principiálne BSDF, ale namiesto kovového používa zrkadlový pracovný postup, ktorý funguje tak, že určuje farbu odrazu smerom k povrchu (pozdĺž normály). Energia sa nezachováva, takže výsledok nemusí byť fyzikálne presný" msgid "Emission" @@ -47576,7 +47793,7 @@ msgid "" "Produce a blending factor depending on the angle between the surface normal and the view direction using Fresnel equations.\n" "Typically used for mixing reflections at grazing angles" msgstr "" -"Pomocou Fresnelových rovníc vytvára faktor prelínania v závislosti od uhla medzi normálom povrchu a smerom pohľadu.\n" +"Pomocou Fresnelových rovníc vytvára faktor prelínania v závislosti od uhla medzi normálou povrchu a smerom pohľadu.\n" "Typicky sa používa na miešanie odrazov pri uhloch odlesku" @@ -47616,7 +47833,7 @@ msgid "" "Produce a blending factor depending on the angle between the surface normal and the view direction.\n" "Typically used for layering shaders with the Mix Shader node" msgstr "" -"Vytvára faktor prelínania v závislosti od uhla medzi normálom povrchu a smerom pohľadu.\n" +"Vytvára faktor prelínania v závislosti od uhla medzi normálou povrchu a smerom pohľadu.\n" "Zvyčajne sa používa na vrstvenie tieňovačov s uzlom Zmiešať tieňovač" @@ -47701,7 +47918,7 @@ msgstr "Transformuje smerový vektor. Poloha je ignorovaná" msgid "Transform a unit normal vector. Location is ignored" -msgstr "Transformuje normálny vektor jednotky. Poloha je ignorovaná" +msgstr "Transformuje jednotný vektor normály. Poloha je ignorovaná" msgid "Perform math operations" @@ -47765,15 +47982,15 @@ msgstr "Získava geometrické informácie o aktuálnom bode tieňovania" msgid "Generate a normal vector and a dot product" -msgstr "Vygenerovať vektor normálu a bodového súčinu" +msgstr "Vygeneruje vektor normály a bodového súčinu" msgid "Generate a perturbed normal from an RGB normal map image. Typically used for faking highly detailed surfaces" -msgstr "Vygeneruje narušený normál z obrazu normálovej mapy RGB. Zvyčajne sa používa na falšovanie veľmi detailných povrchov" +msgstr "Vygeneruje narušenú normálu z obrazu normálovej mapy RGB. Zvyčajne sa používa na falšovanie veľmi detailných povrchov" msgid "Space of the input normal" -msgstr "Miesto vstupu normálu" +msgstr "Miesto vstupu normály" msgid "Tangent Space" @@ -47781,15 +47998,15 @@ msgstr "Priestor dotyku" msgid "Tangent space normal mapping" -msgstr "Priestor dotyku mapovania normálov" +msgstr "Priestor dotyku mapovania normál" msgid "Object space normal mapping" -msgstr "Priestor objektu mapovania normálov" +msgstr "Priestor objektu mapovania normál" msgid "World space normal mapping" -msgstr "Priestor sveta mapovania normálov" +msgstr "Priestor sveta mapovania normál" msgid "Blender Object Space" @@ -47797,7 +48014,7 @@ msgstr "Priestor objektu Blendera" msgid "Object space normal mapping, compatible with Blender render baking" -msgstr "Priestor objektu mapovania normálov, kompatibilné so zapečením Blendera" +msgstr "Priestor objektu mapovania normál, kompatibilné so zapečením Blendera" msgid "Blender World Space" @@ -47805,7 +48022,7 @@ msgstr "Priestor oblasti Blendera" msgid "World space normal mapping, compatible with Blender render baking" -msgstr "Priestor oblasti mapovania normálov, kompatibilný so zapečením Blendera" +msgstr "Priestor oblasti mapovania normál, kompatibilný so zapečením Blendera" msgid "UV Map for tangent space maps" @@ -48277,6 +48494,10 @@ msgid "Normalize outputs to 0.0 to 1.0 range" msgstr "Normalizácia výstupov na rozsah 0,0 až 1,0" +msgid "Type of the Noise texture" +msgstr "Typ textúry šumu" + + msgid "More uneven result (varies with location), more similar to a real terrain" msgstr "Nerovnomernejší výsledok (líši sa v závislosti od oblasti), viac sa podobá skutočnému terénu" @@ -48289,6 +48510,10 @@ msgid "Create peaks and valleys with different roughness values" msgstr "Vytvorí hroty a údolia s rôznymi hodnotami drsnosti" +msgid "The standard fractal Perlin noise" +msgstr "Štandardný fraktálny Perlinov šum" + + msgid "Similar to Hybrid Multifractal creates a heterogeneous terrain, but with the likeness of river channels" msgstr "Podobne ako hybridný multifraktál vytvára heterogénny terén, ale s podobou riečnych kanálov" @@ -48386,7 +48611,7 @@ msgstr "Váhy skupiny vrcholov" msgid "XYZ normal vector mapped to RGB colors" -msgstr "XYZ vektor normálu priradený na RGB farby" +msgstr "XYZ vektor normály priradený na RGB farby" msgid "Sky Texture" @@ -48790,7 +49015,7 @@ msgstr "Lom" msgid "For a given incident vector A, surface normal B and ratio of indices of refraction, Ior, refract returns the refraction vector, R" -msgstr "Pre danú udalosť vektor A, normálu povrchu B a podiel indexov lomu, Ior, vráti lom vektoru lomu, R" +msgstr "Pre danú udalosť vektor A, normála povrchu B a podiel indexov lomu, Ior, vráti lom vektoru lomu, R" msgctxt "NodeTree" @@ -48799,7 +49024,7 @@ msgstr "Predná plôška" msgid "Orients a vector A to point away from a surface B as defined by its normal C. Returns (dot(B, C) < 0) ? A : -A" -msgstr "Orientuje vektor A tak, aby smeroval preč od povrchu B definovaného jeho normálom C. Vráti (bod(B, C) < 0) ? A : -A" +msgstr "Orientuje vektor A tak, aby smeroval preč od povrchu B definovaného jeho normálou C. Vráti (bod(B, C) < 0) ? A : -A" msgctxt "NodeTree" @@ -48945,7 +49170,7 @@ msgstr "Transformácia vektora" msgid "Convert a vector, point, or normal between world, camera, and object coordinate space" -msgstr "Konvertuje vektor, bod alebo normál medzi súradnicovým priestorom sveta, kamerou a priestorom objektov" +msgstr "Konvertuje vektor, bod alebo normálu medzi súradnicovým priestorom sveta, kamerou a priestorom objektov" msgid "Convert From" @@ -48969,7 +49194,7 @@ msgstr "Transformácia vektora smeru" msgid "Transform a normal vector with unit length" -msgstr "Transformácia vektora normálu jednotkou dĺžky" +msgstr "Transformácia vektora normály jednotkou dĺžky" msgid "Color Attribute" @@ -49070,7 +49295,7 @@ msgstr "Zmiešať RGB" msgid "Value to Normal" -msgstr "Hodnota na normál" +msgstr "Hodnota na normálu" msgid "Collection of repeat items" @@ -49081,6 +49306,10 @@ msgid "Collection of simulation items" msgstr "Kolekcia položiek simulácie" +msgid "Collection of index_switch items" +msgstr "Kolekcia položiek index_switch (prepínača indexov)" + + msgid "Node Inputs" msgstr "Vstupy uzlov" @@ -49565,6 +49794,14 @@ msgid "The attribute name used by default when the node group is used by a geome msgstr "Názov atribútu, ktorý sa predvolene používa, keď je skupina uzlov použitá modifikátorom uzlov geometrie" +msgid "Default Input" +msgstr "Predvolený vstup" + + +msgid "Input to use when the socket is unconnected. Requires \"Hide Value\"" +msgstr "Vstup, ktorý sa použije, keď je zásuvka nepripojená. Vyžaduje \"Skryť hodnotu\"" + + msgid "Socket description" msgstr "Popis zásuvky" @@ -49609,6 +49846,10 @@ msgid "Layer Selection" msgstr "Výber vrstvy" +msgid "Take Grease Pencil Layer or Layer Group as selection field" +msgstr "Zoberie si ako pole výberu vrstvu alebo skupinu vrstiev Pastelky" + + msgid "Socket Type" msgstr "Typ zásuvky" @@ -50989,6 +51230,10 @@ msgid "Insert Keyframe" msgstr "Vložiť kľúčovú snímku" +msgid "Insert keyframes on the current frame using either the active keying set, or the user preferences if no keying set is active" +msgstr "Vloží kľúčové snímky na aktuálnu snímku použitím aktívnej súpravy kľúčovania alebo predvolieb užívateľa, ak nie je aktívna žiadna súprava kľúčovania" + + msgctxt "Operator" msgid "Insert Keyframe (Buttons)" msgstr "Vložiť kľúčovú snímku (tlačidlá)" @@ -51169,6 +51414,27 @@ msgstr "" "Varovanie: Použite to len raz" +msgctxt "Operator" +msgid "View In Graph Editor" +msgstr "Zobraziť v Editore grafov" + + +msgid "Frame the property under the cursor in the Graph Editor" +msgstr "Snímka vlastnosti pod kurzorom v editore grafu" + + +msgid "Show All" +msgstr "Zobraziť všetko" + + +msgid "Frame the whole array property instead of only the index under the cursor" +msgstr "Snímka celej vlastnosti poľa namiesto iba indexu pod kurzorom" + + +msgid "Isolate" +msgstr "Izolovať" + + msgctxt "Operator" msgid "Align Bones" msgstr "Zarovnať kosti" @@ -51412,11 +51678,6 @@ msgid "Name of the bone collection to unassign this bone from; empty to unassign msgstr "Názov kolekcie kostí, z ktorej sa má táto kosť odhlásiť; prázdne - odhlásenie z aktívnej kolekcie kostí" -msgctxt "Operator" -msgid "Remove Bone from Bone collections" -msgstr "Odstrániť kosť z kolekcie kostí" - - msgid "Unassign the bone from this bone collection" msgstr "Zruší priradenie kosti z tejto kolekcie kostí" @@ -52029,7 +52290,7 @@ msgstr "Zmazať jedinečné aktívum" msgid "Delete all asset metadata and turn the asset data-block back into a normal data-block" -msgstr "Odstráni všetky metaúdaje o aktívach a zmeniť blok údajov o aktívach späť na normálny blok údajov" +msgstr "Odstráni všetky metaúdaje o aktívach a zmení blok údajov o aktívach späť na normálny blok údajov" msgctxt "Operator" @@ -55393,7 +55654,7 @@ msgstr "Pred uložením použije modifikátory" msgid "Scene Unit" -msgstr "Jednotky scény" +msgstr "Jednotka scény" msgid "Apply current scene's unit (as defined by unit scale) to exported data" @@ -55622,7 +55883,7 @@ msgstr "Vyhladenie" msgid "Export smoothing information (prefer 'Normals Only' option if your target importer understand split normals)" -msgstr "Exportuje informácie vyhladzovania (preferuje voľbu 'Len normály', ak váš cieľový importér rozpoznáva rozdelenie normálov)" +msgstr "Exportuje informácie vyhladzovania (preferuje voľbu 'Len normály', ak váš cieľový importér rozpoznáva rozdelenie normál)" msgid "Normals Only" @@ -55814,7 +56075,7 @@ msgstr "Konvertuje všetky plôšky na trojuholníky" msgid "Add binormal and tangent vectors, together with normal they form the tangent space (will only work correctly with tris/quads only meshes!)" -msgstr "Pridá vektory dvoj-normálov a dotyčníc, spolu s normálom tvoria priestor dotyku (funguje správne len pre trojuholníkové/štvoruholníkové povrchové siete!)" +msgstr "Pridá vektory dvoj-normálov a dotyčníc, spolu s normálou tvoria priestor dotyku (funguje správne len pre trojuholníkové/štvoruholníkové povrchové siete!)" msgid "Visible Objects" @@ -55834,6 +56095,14 @@ msgid "Export scene as glTF 2.0 file" msgstr "Exportuje scénu ako glTF (GL Transmission Format) 2.0 súbor" +msgid "Filter Actions" +msgstr "Filter akcií" + + +msgid "Filter Actions to be exported" +msgstr "Akcie filtra pre export" + + msgid "Include All Bone Influences" msgstr "Zahrnúť vplyvy všetkých kostí" @@ -55902,6 +56171,14 @@ msgid "Apply modifiers (excluding Armatures) to mesh objects -WARNING: prevents msgstr "Použije modifikátory (okrem armatúr) na povrchové siete objektov - VAROVANIE: zabraňuje exportu kľúčových tvarov" +msgid "Remove Armature Object" +msgstr "Odstrániť objekt armatúry" + + +msgid "Remove Armature object if possible. If Armature has multiple root bones, object will not be removed" +msgstr "Ak je to možné, odstráni objekt Armatúra. Ak má Armatúra viacero koreňových kostí, objekt nebude odstránený" + + msgid "Export Attributes (when starting with underscore)" msgstr "Exportuje atribúty (ak začínajú podčiarknikom)" @@ -55918,6 +56195,10 @@ msgid "Export cameras" msgstr "Export kamier" +msgid "Keep for compatibility only" +msgstr "Zachovať len kvôli kompatibilite" + + msgid "Legal rights and conditions for the model" msgstr "Zákonné práva a podmienky pre model" @@ -55971,11 +56252,11 @@ msgstr "Úroveň kompresie (0 = vyššia rýchlosť, 6 = väčšia kompresia, vy msgid "Normal quantization bits" -msgstr "Kvantizácia bitov normálov" +msgstr "Kvantizácia bitov normál" msgid "Quantization bits for normal values (0 = no quantization)" -msgstr "Kvantizácia bitov pre hodnoty normálov (0 = bez kvantizácie)" +msgstr "Kvantizácia bitov pre hodnoty normál (0 = bez kvantizácie)" msgid "Position quantization bits" @@ -56034,6 +56315,14 @@ msgid "Clips animations to selected playback range" msgstr "Klipy animácie na vybraný rozsah prehrávania" +msgid "Geometry Nodes Instances (Experimental)" +msgstr "Inštancie uzlov geometrie (experimentálne)" + + +msgid "Export Geometry nodes instance meshes" +msgstr "Exportovať uzly geometrie inštančných povrchových sietí" + + msgid "GPU Instances" msgstr "Inštancie GPU" @@ -56050,6 +56339,22 @@ msgid "Flatten Bone Hierarchy. Useful in case of non decomposable transformation msgstr "Zarovná hierarchiu kostí. Užitočné v prípade nerozložiteľnej transformačnej matrice" +msgid "Flatten Object Hierarchy" +msgstr "Zarovnať hierarchiu objektu" + + +msgid "Flatten Object Hierarchy. Useful in case of non decomposable transformation matrix" +msgstr "Zarovná hierarchiu objektov. Užitočné v prípade nerozložiteľnej transformačnej matrice" + + +msgid "Full Collection Hierarchy" +msgstr "Úplná hierarchia kolekcií" + + +msgid "Export full hierarchy, including intermediate collections" +msgstr "Exportovať celú hierarchiu vrátane medziľahlých kolekcií" + + msgid "Create WebP" msgstr "Vytvoriť WebP" @@ -56306,6 +56611,14 @@ msgid "Export armatures using rest position as joints' rest pose. When off, curr msgstr "Exportuje armatúry s použitím kľudovej polohy ako kľudovej polohy kĺbov. Ak je vypnuté, ako kľudová poloha sa použije aktuálna poloha snímky" +msgid "Shared Accessors" +msgstr "Zdieľané prístupy" + + +msgid "Export Primitives using shared accessors for attributes" +msgstr "Exportuje prvotné tvary použitím zdieľaných prístupov pre atribúty" + + msgid "Skinning" msgstr "Vytvorenie pokožky" @@ -56342,6 +56655,22 @@ msgid "Try using Sparse Accessor if it saves space" msgstr "Pokúsi sa použiť Sparse Accessor, ak sa ušetrí miesto" +msgid "Unused images" +msgstr "Nepoužité obrázky" + + +msgid "Export images not assigned to any material" +msgstr "Exportuje obrázky nepriradené k žiadnemu materiálu" + + +msgid "Prepare Unused textures" +msgstr "Pripraviť nepoužité textúry" + + +msgid "Export image texture nodes not assigned to any material. This feature is not standard and needs an external extension to be included in the glTF file" +msgstr "Exportuje uzly textúry obrazu nepriradené k žiadnemu materiálu. Táto funkcia nie je štandardná a vyžaduje externé rozšírenie, ktoré sa má zahrnúť do súboru glTF" + + msgid "+Y Up" msgstr "+Y hore" @@ -60865,7 +61194,7 @@ msgstr "Akcia prijatá, keď je ťah vyfarbený" msgid "Apply brush normally" -msgstr "Použiť normálnu štetec" +msgstr "Použiť normálny štetec" msgid "Invert action of brush for duration of stroke" @@ -60876,10 +61205,35 @@ msgid "Switch brush to smooth mode for duration of stroke" msgstr "Prepnúť štetec na režim vyhladenia počas trvania ťahu" +msgctxt "Operator" +msgid "Set Curve Caps" +msgstr "Nastaviť uzáver krivky" + + +msgid "Change curve caps mode (rounded or flat)" +msgstr "Zmení režim uzáverov krivky (zaoblené alebo ploché)" + + +msgid "Rounded" +msgstr "Zaoblené" + + msgid "Flat" msgstr "Ploché" +msgid "Toggle Start" +msgstr "Prepnúť Štart" + + +msgid "Toggle End" +msgstr "Prepnúť Koniec" + + +msgid "Delete selected strokes or points" +msgstr "Odstráni vybrané ťahy alebo body" + + msgctxt "Operator" msgid "Delete Frame" msgstr "Odstrániť snímku" @@ -60976,6 +61330,23 @@ msgid "Name of the target layer" msgstr "Názov cieľovej vrstvy" +msgctxt "Operator" +msgid "Hide Materials" +msgstr "Skryť materiály" + + +msgid "Hide active/inactive Grease Pencil material(s)" +msgstr "Skryje aktívne/neaktívne materiály Pastelky" + + +msgid "Hide inactive materials instead of the active one" +msgstr "Skryť neaktívne materiály namiesto aktívnych" + + +msgid "Lock and hide any material not used" +msgstr "Uzamkne a skryje každý nepoužívaný materiál" + + msgid "(De)select all visible strokes" msgstr "Vyberie / Zruší výber všetkých viditeľných ťahov" @@ -61021,6 +61392,11 @@ msgid "Selects random points from the current strokes selection" msgstr "Vyberie náhodné body z aktuálneho výberu ťahov" +msgctxt "Operator" +msgid "Set Active Material" +msgstr "Nastaviť aktívny materiál" + + msgctxt "Operator" msgid "Select Mode" msgstr "Režim výberu" @@ -61042,6 +61418,29 @@ msgid "Select all stroke points between other strokes" msgstr "Vyberie všetky body ťahu medzi inými ťahmi" +msgctxt "Operator" +msgid "Set Uniform Opacity" +msgstr "Nastaviť rovnomernú nepriehľadnosť" + + +msgid "Set all stroke points to same opacity" +msgstr "Nastaví všetky body ťahu na rovnakú nepriehľadnosť" + + +msgctxt "Operator" +msgid "Set Uniform Thickness" +msgstr "Nastaviť rovnomernú hrúbku" + + +msgid "Set all stroke points to same thickness" +msgstr "Nastaví všetky body ťahu na rovnakú hrúbku" + + +msgctxt "Operator" +msgid "Assign Material" +msgstr "Priradiť materiál" + + msgid "Simplify selected strokes" msgstr "Zjednoduší vybrané ťahy" @@ -62129,7 +62528,7 @@ msgstr "Ako sa vypočítajú normály počas importu" msgid "Use Normal Data" -msgstr "Použiť údaje normálov" +msgstr "Použiť údaje normál" msgid "Flat Shading" @@ -62149,7 +62548,7 @@ msgstr "Úroveň záznamu" msgid "The glTF format requires discontinuous normals, UVs, and other vertex attributes to be stored as separate vertices, as required for rendering on typical graphics hardware. This option attempts to combine co-located vertices where possible. Currently cannot combine verts with different normals" -msgstr "Formát glTF vyžaduje, aby sa diskontinuálne normály, UV súradnice a ďalšie atribúty vrcholov uložili ako oddelené vrcholy, ako je vyžadované pri vykresľovaní na typickom grafickom hardvéri. Táto možnosť sa pokúša kombinovať vrcholy umiestnené spolu, kde je to možné. V súčasnosti nie je možné kombinovať vrcholy s rôznymi normálmi" +msgstr "Formát glTF vyžaduje, aby sa diskontinuálne normály, UV súradnice a ďalšie atribúty vrcholov uložili ako oddelené vrcholy, ako je vyžadované pri prekresľovaní na typickom grafickom hardvéri. Táto možnosť sa pokúša kombinovať vrcholy umiestnené spolu, kde je to možné. V súčasnosti nie je možné kombinovať vrcholy s rôznymi normálami" msgctxt "Operator" @@ -62821,11 +63220,11 @@ msgstr "Vyberie podobné meta gule podľa typov vlastností" msgctxt "Operator" msgid "Average Normals" -msgstr "Priemer normálov" +msgstr "Priemer normál" msgid "Average custom normals of selected vertices" -msgstr "Priemer vlastných normálov vybraných vrcholov" +msgstr "Priemer vlastných normál vybraných vrcholov" msgid "Averaging method" @@ -62833,7 +63232,7 @@ msgstr "Metóda spriemerňovania" msgid "Take average of vertex normals" -msgstr "Zoberie priemer normálov vrcholov" +msgstr "Zoberie priemer normál vrcholov" msgid "Set all vertex normals by face area" @@ -62952,7 +63351,7 @@ msgstr "Bod na rovine" msgid "Plane Normal" -msgstr "Normál roviny" +msgstr "Normála roviny" msgid "The direction the plane points" @@ -63071,19 +63470,11 @@ msgid "Reverse Colors" msgstr "Obrátiť farby" -msgid "Flip direction of vertex colors inside faces" -msgstr "Otočí smer farieb vrcholov vnútri plôšky" - - msgctxt "Operator" msgid "Rotate Colors" msgstr "Rotovať farby" -msgid "Rotate color attributes inside faces" -msgstr "Otáča atribútmi farieb vnútri plôšok" - - msgid "Counter Clockwise" msgstr "Proti smeru hodinových ručičiek" @@ -63167,20 +63558,20 @@ msgstr "Porovnať farby vrchlov" msgctxt "Operator" msgid "Add Custom Split Normals Data" -msgstr "Pridať vlastné údaje delenia normálov" +msgstr "Pridať vlastné údaje delenia normál" msgid "Add a custom split normals layer, if none exists yet" -msgstr "Pridá vlastnú vrstvu delenia normálov, ak ešte neexistuje" +msgstr "Pridá vlastnú vrstvu delenia normál, ak ešte neexistuje" msgctxt "Operator" msgid "Clear Custom Split Normals Data" -msgstr "Vymazať vlastné údaje delenia normálov" +msgstr "Vymazať vlastné údaje delenia normál" msgid "Remove the custom split normals layer, if it exists" -msgstr "Odstráni vlastnú vrstvu delenia normálov, ak existuje" +msgstr "Odstráni vlastnú vrstvu delenia normál, ak existuje" msgctxt "Operator" @@ -63479,7 +63870,7 @@ msgstr "Vysunúť oblasť a presúvať" msgid "Extrude region together along the average normal" -msgstr "Vysunie oblasť spolu pozdĺž priemerného normálu" +msgstr "Vysunie oblasť spolu pozdĺž priemernej normály" msgid "Extrude Context" @@ -63523,7 +63914,7 @@ msgstr "Vysunúť jednotlivé plôšky a presunúť" msgid "Extrude each individual face separately along local normals" -msgstr "Vysunie každú jednotlivú plôšku oddelene pozdĺž miestnych normálov" +msgstr "Vysunie každú jednotlivú plôšku oddelene pozdĺž lokálnych normál" msgid "Extrude Individual Faces" @@ -63531,7 +63922,7 @@ msgstr "Vysunúť jednotlivé plôšky" msgid "Shrink/fatten selected vertices along normals" -msgstr "Zmrští/nafúkne vybrané vrcholy pozdĺž normálov" +msgstr "Zmrští/nafúkne vybrané vrcholy pozdĺž normál" msgctxt "Operator" @@ -63566,7 +63957,7 @@ msgstr "Vysunúť oblasť a zmrštiť/nafúknuť" msgid "Extrude region together along local normals" -msgstr "Vysunie oblasť spolu pozdĺž miestnych normálov" +msgstr "Vysunie oblasť spolu pozdĺž miestnych normál" msgctxt "Operator" @@ -63690,7 +64081,7 @@ msgstr "Zobrazí ploché plôšky" msgid "Display faces smooth (using vertex normals)" -msgstr "Zobrazí vyhladené plôšky (použitím normálov vrcholov)" +msgstr "Zobrazí vyhladené plôšky (použitím normál vrcholov)" msgctxt "Operator" @@ -63758,7 +64149,7 @@ msgstr "Prehodiť normály" msgid "Flip the direction of selected faces' normals (and of their vertices)" -msgstr "Preklopí smer vybraných normálov plôšok (a ich vrcholov)" +msgstr "Preklopí smer vybraných normál plôšok (a ich vrcholov)" msgid "Custom Normals Only" @@ -64188,15 +64579,15 @@ msgstr "Zlúči vlastné normály vybraných vrcholov" msgctxt "Operator" msgid "Face Normals Strength" -msgstr "Vplyv normálov plôšok" +msgstr "Vplyv normál plôšok" msgid "Set/Get strength of face (used in Weighted Normal modifier)" -msgstr "Nastaví/získa vplyv plôšky (používa sa v modifikátore Vplyv normálu)" +msgstr "Nastaví/získa vplyv plôšky (používa sa v modifikátore Vplyv normály)" msgid "Strength to use for assigning or selecting face influence for weighted normal modifier" -msgstr "Vplyv použitý na priradenie alebo voľbu vplyvu plôšky pre modifikátor Vplyv normálu" +msgstr "Vplyv použitý na priradenie alebo voľbu vplyvu plôšky pre modifikátor Vplyv normály" msgid "Weak" @@ -64221,16 +64612,16 @@ msgstr "Prepočítať normály" msgid "Make face and vertex normals point either outside or inside the mesh" -msgstr "Vytvorí bod normálu plôšky a vrcholu buď zvonku alebo zvnútra povrchovej siete" +msgstr "Vytvorí bod normály plôšky a vrcholu buď zvonku alebo zvnútra povrchovej siete" msgctxt "Operator" msgid "Normals Vector Tools" -msgstr "Nástroje vektorov normálov" +msgstr "Nástroje vektorov normál" msgid "Custom normals tools using Normal Vector of UI" -msgstr "Vlastné nástroje normálov používajúce vektor normálov v užívateľskom rozhraní" +msgstr "Vlastné nástroje normál používajúce vektor normál v užívateľskom rozhraní" msgid "Absolute Coordinates" @@ -64238,7 +64629,7 @@ msgstr "Absolútne súradnice" msgid "Copy Absolute coordinates or Normal vector" -msgstr "Kopíruje absolútne súradnice alebo vektor normálu" +msgstr "Kopíruje absolútne súradnice alebo vektor normály" msgid "Mode of tools taking input from interface" @@ -64246,43 +64637,43 @@ msgstr "Režim nástrojov daných pri vstupe z rozhrania" msgid "Copy Normal" -msgstr "Kopírovať normál" +msgstr "Kopírovať normálu" msgid "Copy normal to the internal clipboard" -msgstr "Skopíruje normál z internej schránky" +msgstr "Skopíruje normálu z internej schránky" msgid "Paste Normal" -msgstr "Prilepiť normál" +msgstr "Prilepiť normálu" msgid "Paste normal from the internal clipboard" -msgstr "Prilepí normál z internej schránky" +msgstr "Prilepí normálu z internej schránky" msgid "Add Normal" -msgstr "Pridať normál" +msgstr "Pridať normálu" msgid "Add normal vector with selection" -msgstr "Pridá vektor normálu pri výbere" +msgstr "Pridá vektor normály pri výbere" msgid "Multiply Normal" -msgstr "Viacnásobný normál" +msgstr "Viacnásobná normála" msgid "Multiply normal vector with selection" -msgstr "Viacnásobný vektor normálu pri výbere" +msgstr "Viacnásobný vektor normály pri výbere" msgid "Reset Normal" -msgstr "Resetovať normál" +msgstr "Resetovať normálu" msgid "Reset the internal clipboard and/or normal of selected element" -msgstr "Resetuje internú schránku a/alebo normál vybraného prvku" +msgstr "Resetuje internú schránku a/alebo normálu vybraného prvku" msgctxt "Operator" @@ -64387,7 +64778,7 @@ msgstr "Sféricky" msgid "Interpolate between original and new normals" -msgstr "Interpolácia medzi pôvodnými a novými normálmi" +msgstr "Interpolácia medzi pôvodnými a novými normálami" msgid "Spherize Strength" @@ -64395,11 +64786,11 @@ msgstr "Sférická stálosť" msgid "Ratio of spherized normal to original normal" -msgstr "Pomer sférického normálu ku pôvodnému normálu" +msgstr "Pomer sférickej normály k pôvodnej normále" msgid "Target location to which normals will point" -msgstr "Poloha cieľa, na ktorú sa nasmeruje normál" +msgstr "Poloha cieľa, na ktorú sa nasmeruje normála" msgctxt "Operator" @@ -64815,7 +65206,7 @@ msgstr "Skontrolovať plné 3D tlačou" msgid "Check for geometry is solid (has valid inside/outside) and correct normals" -msgstr "Skontroluje celistvosť geometrie (platnosť vnútornej/vonkajšej) a korektnosť normálov" +msgstr "Skontroluje celistvosť geometrie (platnosť vnútornej/vonkajšej) a korektnosť normál" msgctxt "Operator" @@ -64938,7 +65329,7 @@ msgstr "Ostré hrany" msgid "Calculate sharp edges using custom normal data (when available)" -msgstr "Vypočíta ostré hrany použitím vlastných údajov normálov (ak sú k dispozícii)" +msgstr "Vypočíta ostré hrany použitím vlastných údajov normál (ak sú k dispozícii)" msgid "Merge selected to other unselected vertices" @@ -65039,7 +65430,7 @@ msgstr "Zarovná osi transformácie s miestnym priestorom vybraných objektov" msgid "Align the transformation axes to average normal of selected elements (bone Y axis for pose mode)" -msgstr "Zarovná osi transformácie na priemerný normál vybraných prvkov (kosť osi Y pre režim pózy)" +msgstr "Zarovná osi transformácie na priemernú normálu vybraných prvkov (kosť osi Y pre režim pózy)" msgid "Gimbal" @@ -65260,7 +65651,7 @@ msgstr "Typ" msgctxt "Mesh" msgid "Normal" -msgstr "Normál" +msgstr "Normála" msgctxt "Mesh" @@ -65473,15 +65864,15 @@ msgstr "Vyberie najkratšiu dráhu medzi dvomi vrcholmi/hranami/plôškami" msgctxt "Operator" msgid "Smooth Normals Vectors" -msgstr "Vyhladiť vektory normálov" +msgstr "Vyhladiť vektory normál" msgid "Smooth custom normals based on adjacent vertex normals" -msgstr "Vyhladí vlastné normály založené na priľahlých normáloch vrcholov" +msgstr "Vyhladí vlastné normály založené na priľahlých normálach vrcholov" msgid "Specifies weight of smooth vs original normal" -msgstr "Určiť váhu vyhladených proti originálnym normálom" +msgstr "Určiť váhu vyhladených proti originálnym normálam" msgctxt "Operator" @@ -65608,11 +65999,11 @@ msgstr "Faktor fraktálnej náhodnosti" msgid "Along Normal" -msgstr "Pozdĺž normálu" +msgstr "Pozdĺž normály" msgid "Apply fractal displacement along normal only" -msgstr "Použije fraktálny posun pozdĺž normálu" +msgstr "Použije fraktálny posun pozdĺž normály" msgid "Create N-Gons" @@ -65878,6 +66269,14 @@ msgid "Push action down onto the top of the NLA stack as a new strip" msgstr "Akcia vytláčania na vrchol zásobníka NLA ako nového pásu" +msgid "Track Index" +msgstr "Index stopy" + + +msgid "Index of NLA action track to perform pushdown operation on" +msgstr "Index stopy akcie NLA pre vykonanie operácie vytlačenia" + + msgctxt "Operator" msgid "Sync Action Length" msgstr "Synchronizácia dĺžky akcie" @@ -65934,6 +66333,22 @@ msgid "Bake object transformations" msgstr "Zapiecť objekt transformácie" +msgid "Which channels to bake" +msgstr "Určuje, ktoré kanály sa majú zapiecť" + + +msgid "Bake location channels" +msgstr "Zapiecť lokálne kanály" + + +msgid "Bake rotation channels" +msgstr "Zapiecť kanály rotácie" + + +msgid "Bake scale channels" +msgstr "Zapiecť kanály mierky" + + msgid "Clean Curves" msgstr "Vyčistiť krivky" @@ -65982,6 +66397,15 @@ msgid "Keyframe from the final transformations (with constraints applied)" msgstr "Kľúčová snímka z konečnej transformácie (s použitými vynúteniami)" +msgctxt "Operator" +msgid "Mouse Click on NLA Tracks" +msgstr "Kliknúť myšou na NLA stopy" + + +msgid "Handle clicks to select NLA tracks" +msgstr "Kliknutie na manipulátor pre výber NLA stôp" + + msgctxt "Operator" msgid "Clear Scale" msgstr "Zmazať mierku" @@ -66657,11 +67081,28 @@ msgid "Toggle hiding of selected nodes" msgstr "Prepne skrytie vybraných uzlov" +msgctxt "Operator" +msgid "Add Item" +msgstr "Pridať položku" + + +msgid "Add an item to the index switch" +msgstr "Pridá položku do prepínača indexov" + + msgctxt "Operator" msgid "Remove Item" msgstr "Odstrániť položku" +msgid "Remove an item from the index switch" +msgstr "Odstráni položku z prepínača indexov" + + +msgid "Index of item to remove" +msgstr "Index položky na odstránenie" + + msgctxt "Operator" msgid "Insert Offset" msgstr "Posuv vkladania" @@ -67504,14 +67945,26 @@ msgid "Curve from Mesh or Text objects" msgstr "Krivka podľa objektov povrchovej siete alebo textu" +msgid "Mesh from Curve, Surface, Metaball, Text, or Point Cloud objects" +msgstr "Povrchová sieť pre objekty krivky, povrchu, meta-gule, textu alebo mračna bodov" + + msgid "Grease Pencil from Curve or Mesh objects" msgstr "Pastelka z objektov krivky alebo povrchovej siete" +msgid "Point Cloud from Mesh objects" +msgstr "Mračno bodov z objektov povrchovej siete" + + msgid "Curves from evaluated curve data" msgstr "Krivky z vyhodnotených údajov krivky" +msgid "Grease Pencil v3 from Grease Pencil" +msgstr "Pastelka v3 z Pastelky" + + msgctxt "Operator" msgid "Copy Global Transform" msgstr "Kopírovať globálnu transformáciu" @@ -68284,10 +68737,26 @@ msgid "Subset of probes to update" msgstr "Podsústava snímačov na aktualizáciu" +msgid "All Volumes" +msgstr "Všetky objemy" + + +msgid "Bake all light probe volumes" +msgstr "Zapečie všetky objemy snímačov svetla" + + msgid "Selected Only" msgstr "Len vybrané" +msgid "Only bake selected light probe volumes" +msgstr "Zapečie iba vybrané objemy snímačov svetla" + + +msgid "Only bake the active light probe volume" +msgstr "Zapečie iba aktívny objem snímača svetla" + + msgctxt "Operator" msgid "Delete Light Cache" msgstr "Odstrániť zásobník svetla" @@ -68908,7 +69377,7 @@ msgstr "Počiatok na stred hmoty (objem)" msgid "Calculate the center of mass from the volume (must be manifold geometry with consistent normals)" -msgstr "Vypočíta stred hmoty z objemu (musí byť vyvinutá geometria so zhodnými normálmi)" +msgstr "Vypočíta stred hmoty z objemu (musí byť vyvinutá geometria so zhodnými normálami)" msgid "Clear the object's parenting" @@ -69195,6 +69664,10 @@ msgid "Input target number of faces in the new mesh" msgstr "Určí cieľový počet plôšok v novej povrchovej siete" +msgid "Reproject attributes onto the new mesh" +msgstr "Znovu premietne atribúty na novú povrchovú sieť" + + msgid "Random seed to use with the solver. Different seeds will cause the remesher to come up with different quad layouts on the mesh" msgstr "Náhodné rozosiatie na použitie s riešiteľom. Rôzne rozosiatie spôsobí, že pretvárač povrchovej siete príde s rozdielnym rozložením štvorcov na povrchovej sieti" @@ -69572,17 +70045,26 @@ msgstr "Názov kolekcie na výber" msgid "Render and display faces uniform, using Face Normals" -msgstr "Prekreslí a zobrazí jednotné plôšky, použitím normálov plôšok" +msgstr "Prekreslí a zobrazí jednotné plôšky, použitím normál plôšok" msgid "Render and display faces smooth, using interpolated Vertex Normals" -msgstr "Prekreslí a zobrazí vyhladené plôšky, použitím normálov vrcholov" +msgstr "Prekreslí a zobrazí vyhladené plôšky, použitím normál vrcholov" + + +msgctxt "Operator" +msgid "Shade Smooth by Angle" +msgstr "Vyhladiť tieň podľa uhla" msgid "Set the sharpness of mesh edges based on the angle between the neighboring faces" msgstr "Nastavenie ostrosti hrán povrchovej siete na základe uhla medzi susednými plôškami" +msgid "Maximum angle between face normals that will be considered as smooth" +msgstr "Maximálny uhol medzi normálami plôšok, ktorý sa bude považovať za hladký" + + msgctxt "Operator" msgid "Add Effect" msgstr "Pridať efekt" @@ -74142,6 +74624,15 @@ msgid "Add a line thickness modifier to the line style associated with the activ msgstr "Pridá modifikátor hrúbky čiary k štýlu čiary priradeného k aktívnej sústave čiar" +msgctxt "Operator" +msgid "Refresh action list" +msgstr "Obnoví zoznam akcií" + + +msgid "Refresh list of actions" +msgstr "Obnoviť zoznam akcií" + + msgctxt "Operator" msgid "Add Grease Pencil Brush Preset" msgstr "Pridať predvoľbu štetca pastelky" @@ -75263,19 +75754,6 @@ msgid "Modify Hidden" msgstr "Upraviť skryté" -msgid "Apply the edit operation to hidden Face Sets" -msgstr "Použije operáciu úprav na skryté sústavy plôšok" - - -msgctxt "Operator" -msgid "Invert Face Set Visibility" -msgstr "Viditeľnosť inverznej plôšky" - - -msgid "Invert the visibility of the Face Sets of the sculpt" -msgstr "Invertuje viditeľnosť sústav plôšok tvarovania" - - msgctxt "Operator" msgid "Face Set Lasso Gesture" msgstr "Sústava plôšok pohybom v lase" @@ -75352,7 +75830,7 @@ msgstr "Vytvorí sústavu plôšok pre každú zásuvku materiálu" msgid "Face Sets from Mesh Normals" -msgstr "Sústava plôšok podľa normálov povrchovej siete" +msgstr "Sústava plôšok podľa normál povrchovej siete" msgid "Create Face Sets for Faces that have similar normal" @@ -75539,10 +76017,6 @@ msgid "Use settings from here" msgstr "Použiť nastavenia odtiaľ" -msgid "Operator" -msgstr "Operátor" - - msgid "Use settings from operator properties" msgstr "Použiť nastavenia z vlastností operátora" @@ -75894,7 +76368,7 @@ msgstr "Použije zobrazenie na orientáciu tvaru orezania" msgid "Use the surface normal to orientate the trimming shape" -msgstr "Použije normálny povrch na orientáciu tvaru orezania" +msgstr "Použije normálu povrchu na orientáciu tvaru orezania" msgid "Use Cursor for Depth" @@ -78207,7 +78681,7 @@ msgstr "Otočiť normály" msgid "Rotate split normal of selected items" -msgstr "Otáča oddelenými normálmi vybraných položiek" +msgstr "Otáča oddelenými normálami vybraných položiek" msgctxt "Operator" @@ -78292,7 +78766,7 @@ msgstr "Transformovať" msgid "Align with Point Normal" -msgstr "Zarovnať s bodom normálu" +msgstr "Zarovnať s bodom normály" msgid "Auto Merge & Split" @@ -78344,7 +78818,7 @@ msgstr "Náhodné vrcholy" msgid "Align offset direction to normals" -msgstr "Zarovná smer posuvu podľa normálov" +msgstr "Zarovná smer posuvu podľa normál" msgid "Distance to offset" @@ -78845,6 +79319,11 @@ msgid "Update given add-on's translation data (found as a py tuple in the add-on msgstr "Aktualizuje údaje prekladu doplnku (nájdené ako zdrojový kód doplnku v pythone)" +msgctxt "Operator" +msgid "Clean up I18n Work Repository" +msgstr "Vyčistiť pracovné úložisko I18n" + + msgid "Clean up i18n working repository (po files)" msgstr "Vyčistí pracovné úložisko i18n (súbory .po)" @@ -78880,6 +79359,11 @@ msgid "Save translations' settings in a persistent JSon file" msgstr "Uloží nastavenia prekladov do trvalého .json súboru" +msgctxt "Operator" +msgid "Update I18n Blender Repository" +msgstr "Aktualizovať úložisko I18n Blendera" + + msgid "Update i18n data (po files) in Blender source code repository" msgstr "Aktualizuje údaje i18n (súbory .po) v úložisku zdrojového kódu Blendera" @@ -78927,6 +79411,11 @@ msgid "Create or extend a 'i18n_info.txt' Text datablock" msgstr "Vytvorí alebo rozšíri blok údajov textu \"i18n_info.txt\"" +msgctxt "Operator" +msgid "Update I18n Work Repository" +msgstr "Aktualizovať pracovné úložisko I18n" + + msgid "Update i18n working repository (po files)" msgstr "Aktualizuje pracovné úložisko i18n (súbory .po)" @@ -79332,6 +79821,30 @@ msgid "Export all UVs in this mesh (not just visible ones)" msgstr "Exportuje všetky UV v tejto povrchovej siete (nie len tie viditeľné)" +msgid "Export Tiles" +msgstr "Exportovať dlaždice" + + +msgid "Choose whether to export only the [0, 1] range, or all UV tiles" +msgstr "Vyberte, či chcete exportovať len rozsah [0, 1], alebo všetky dlaždice UV" + + +msgid "Export only UVs in the [0, 1] range" +msgstr "Exportovať iba UV v rozsahu [0, 1]" + + +msgid "Export tiles in the UDIM numbering scheme: 1001 + u_tile + 10*v_tile" +msgstr "Export dlaždíc v schéme číslovania UDIM: 1001 + u_dlaždica + 10*v_dlaždica" + + +msgid "UVTILE" +msgstr "UV dlaždica" + + +msgid "Export tiles in the UVTILE numbering scheme: u(u_tile + 1)_v(v_tile + 1)" +msgstr "Export dlaždíc v schéme číslovania UV dlaždice: u(u_dlaždica + 1)_v(v_dlaždica + 1)" + + msgid "File format to export the UV layout to" msgstr "Formát súboru pre export UV rozmiestnenia" @@ -80295,7 +80808,7 @@ msgstr "Orientácia na aktuálne nastavenie transformácie" msgid "Match the surface normal" -msgstr "Prispôsobiť normálnemu povrchu" +msgstr "Prispôsobiť normále povrchu" msgid "Surface Project" @@ -80348,16 +80861,16 @@ msgstr "Vysunúť jedotlivo a presunúť" msgctxt "Operator" msgid "Extrude Manifold Along Normals" -msgstr "Vysunúť vyvinuté pozdĺž normálov" +msgstr "Vysunúť vyvinuté pozdĺž normál" msgid "Extrude manifold region along normals" -msgstr "Vysunie vyvinutú oblasť pozdĺž normálov" +msgstr "Vysunie vyvinutú oblasť pozdĺž normál" msgctxt "Operator" msgid "Extrude and Move on Normals" -msgstr "Vysunúť a presúvať po normáloch" +msgstr "Vysunúť a presúvať po normálach" msgid "Dissolves adjacent faces and intersects new geometry" @@ -80366,7 +80879,7 @@ msgstr "Rozpúšťa susedné plochy a pretína novú geometriu" msgctxt "Operator" msgid "Extrude and Move on Individual Normals" -msgstr "Vysunúť a presúvať po samostatných normáloch" +msgstr "Vysunúť a presúvať po samostatných normálach" msgctxt "Operator" @@ -81786,7 +82299,7 @@ msgstr "Nastaví použitie pripojenia materských kostí, ktoré majú presne je msgid "Import custom normals, if available (otherwise Blender will compute them)" -msgstr "Import vlastných normálov, ak sú dostupné (inak ich Blender vypočíta)" +msgstr "Import vlastných normál, ak sú dostupné (inak ich Blender vypočíta)" msgid "Find Bone Chains" @@ -82631,6 +83144,14 @@ msgid "Export file in ASCII format, export as binary otherwise" msgstr "Exportuje súbor vo formáte ASCII, inak exportovaný ako binárny" +msgid "Export Vertex Attributes" +msgstr "Exportovať atribúty vrcholov" + + +msgid "Export custom vertex attributes" +msgstr "Exportovať vlastné atribúty vrcholov" + + msgid "Export Vertex Colors" msgstr "Exportuje farby vrcholov s povrchovými sieťami" @@ -82664,6 +83185,14 @@ msgid "Import an PLY file as an object" msgstr "Importuje súbor PLY ako objekt" +msgid "Vertex Attributes" +msgstr "Atribúty vrcholov" + + +msgid "Import custom vertex attributes" +msgstr "Importovať vlastné atribúty vrcholov" + + msgid "Merges vertices by distance" msgstr "Zlučuje vrcholy podľa vzdialenosti" @@ -83440,6 +83969,18 @@ msgid "Open a window with information about Blender" msgstr "Otvorí okno s informáciami o aplikácii Blender" +msgid "Save the scene to an STL file" +msgstr "Uloží scénu do STL súboru" + + +msgid "Batch Export" +msgstr "Dávka exportu" + + +msgid "Export each object to a separate file" +msgstr "Exportovať každý objekt do samostatného súboru" + + msgid "Import an STL file as an object" msgstr "Importuje súbor STL ako objekt" @@ -84762,18 +85303,6 @@ msgid "Panel containing UI elements" msgstr "Panel obsahujúci prvky užívateľského rozhrania" -msgid "Refraction" -msgstr "Lom" - - -msgid "Screen Tracing" -msgstr "Sledovanie obrazovky" - - -msgid "Denoising" -msgstr "Odstránenie šumu" - - msgid "Light Groups" msgstr "Skupiny svetla" @@ -85120,6 +85649,11 @@ msgid "Snapping" msgstr "Prichytenie" +msgctxt "ID" +msgid "Displacement" +msgstr "Posun" + + msgid "Bake Animation" msgstr "Zapiecť animáciu" @@ -85181,6 +85715,10 @@ msgid "Optimize Shape Keys" msgstr "Optimalizácia kľúčových tvarov" +msgid "Unused Textures & Images" +msgstr "Nepoužité textúry a obrázky" + + msgid "Exporter Extensions" msgstr "Prípony exportéra" @@ -85652,10 +86190,22 @@ msgid "Indirect Lighting" msgstr "Nepriame osvetlenie" +msgid "Denoising" +msgstr "Odstránenie šumu" + + +msgid "Horizon Scan" +msgstr "Horizontálne skenovanie" + + msgid "Raytracing" msgstr "Sledovanie lúča" +msgid "Screen Tracing" +msgstr "Sledovanie obrazovky" + + msgid "Shadows" msgstr "Tiene" @@ -85720,6 +86270,10 @@ msgid "Time Stretching" msgstr "Natiahnutie času" +msgid "Action Filter" +msgstr "Filter akcií" + + msgid "Keyframing Settings" msgstr "Nastavenie kľúčového snímkovania" @@ -86213,7 +86767,7 @@ msgstr "Voľné vysunutie alebo pozdĺž osi" msgctxt "Operator" msgid "Extrude Along Normals" -msgstr "Vysunúť pozdĺž normálov" +msgstr "Vysunúť pozdĺž normál" msgctxt "Operator" @@ -88046,6 +88600,14 @@ msgid "Pixels moved by mouse per axis when drawing stroke" msgstr "Pixely presúvané myšou na os pri kreslení ťahu" +msgid "Default Key Channels" +msgstr "Predvolené kľúčové kanály" + + +msgid "Which channels to insert keys at when no keying set is active" +msgstr "Určuje, ktoré kanály sa majú vkladať, keď nie je aktívna žiadna sústava kľúčov" + + msgid "New Handles Type" msgstr "Nový typ manipulátorov" @@ -90967,6 +91529,14 @@ msgid "When using volume rendering, assume volume has the same density everywher msgstr "Pri použití prekreslenia objemu sa predpokladá, že objem má všade rovnakú hustotu (bez použitia textúry), pre rýchlejšie prekreslenie" +msgid "Bump Map Correction" +msgstr "Oprava mapy hrboľov" + + +msgid "Apply corrections to solve shadow terminator artifacts caused by bump mapping" +msgstr "Použije korekcie na riešenie artefaktov terminátora tieňov spôsobených mapovaním hrboľov" + + msgid "Volume Interpolation" msgstr "Interpolácia objemu" @@ -91348,11 +91918,11 @@ msgstr "Pre odstránenie šumu použije prechod odrazivosti" msgid "Albedo and Normal" -msgstr "Odrazivosť a normál" +msgstr "Odrazivosť a normála" msgid "Use albedo and normal passes for denoising" -msgstr "Na odstránenie šumu použije prechod odrazivosti a normálov" +msgstr "Na odstránenie šumu použije prechod odrazivosti a normál" msgid "Denoising Prefilter" @@ -91360,7 +91930,7 @@ msgstr "Predbežný filter odstránenia šumu" msgid "Prefilter noisy guiding (albedo and normal) passes to improve denoising quality when using OpenImageDenoiser" -msgstr "Predbežné filtrovanie zašumených vodiacich prechodov (odrazivosť a normály) na zlepšenie kvality odstránenia šumu použitím OpenImageDenoiser" +msgstr "Predbežné filtrovanie zašumených vodiacich prechodov (odrazivosť a normála) na zlepšenie kvality odstránenia šumu použitím OpenImageDenoiser" msgid "Denoise color and guiding passes together. Improves quality when guiding passes are noisy using least amount of extra processing time" @@ -92192,7 +92762,7 @@ msgstr "Zobrazí prechod prekreslenia Pozície" msgid "Show the Normal render pass" -msgstr "Zobrazí prekreslenie prechodu Normálu" +msgstr "Zobrazí prekreslenie normálneho prechodu" msgid "Show the UV render pass" @@ -92212,11 +92782,11 @@ msgstr "Prechod odrazivosti použitý odstraňovačom šumu" msgid "Denoising Normal" -msgstr "Normál odstraňovača šumu" +msgstr "Normálne odstránenie šumu" msgid "Normal pass used by denoiser" -msgstr "Prechod normálu použitý odstraňovačom šumu" +msgstr "Normálny prechod použitý odstraňovačom šumu" msgid "Sample Count" @@ -92299,6 +92869,10 @@ msgid "Distance between volume shader samples when rendering the volume (lower v msgstr "Vzdialenosť medzi snímaniami objemu tieňovača pri prekreslení objemu (nižšie hodnoty dávajú presnejšie a detailnejšie výsledky, ale aj zvýšia čas prekreslenia)" +msgid "Keep Animation" +msgstr "Zachovať animáciu" + + msgid "Settings/info about a language" msgstr "Nastavenia/informácie o jazyku" @@ -92416,7 +92990,7 @@ msgstr "Počet objektov na jednotku na čiare" msgid "Normal Offset" -msgstr "Posuv normálu" +msgstr "Posuv normály" msgid "Distance from the surface" @@ -92448,11 +93022,11 @@ msgstr "Jeho zmenou získate iný vzor rozptylu" msgid "Use Normal Rotation" -msgstr "Použiť rotáciu normálov" +msgstr "Použiť rotáciu normál" msgid "Rotate the instances according to the surface normals" -msgstr "Inštancie otáča podľa normálov povrchu" +msgstr "Inštancie otáča podľa normály povrchu" msgid "Operator File List Element" @@ -92791,6 +93365,14 @@ msgid "Clamp ray intensity to reduce noise (0 to disable)" msgstr "Zarážka intenzity lúčov na zníženie šumu (0 pre zákaz)" +msgid "Screen-Trace Max Roughness" +msgstr "Maximálna drsnosť sledovania obrazovky" + + +msgid "Maximum roughness to use the tracing pipeline for. Higher roughness surfaces will use horizon scan. A value of 1 will disable horizon scan" +msgstr "Maximálna drsnosť, pre ktorú sa má použiť sledovacie potrubie. Povrchy s vyššou drsnosťou budú používať skenovanie horizontu. Hodnota 1 zakáže skenovanie horizontu" + + msgid "Screen-Trace Precision" msgstr "Presnosť sledovania obrazovky" @@ -92819,6 +93401,22 @@ msgid "Region in a subdivided screen area" msgstr "Oblasť v delenej oblasti obrazovky" +msgid "Active Panel Category" +msgstr "Kategória aktívnych panelov" + + +msgid "The current active panel category, may be Null if the region does not support this feature (NOTE: these categories are generated at runtime, so list may be empty at initialization, before any drawing took place)" +msgstr "Aktuálna aktívna kategória panela, môže byť Null (nulová), ak región túto funkciu nepodporuje (POZNÁMKA: tieto kategórie sa generujú za behu, takže zoznam môže byť pri inicializácii prázdny ešte pred kreslením)" + + +msgid "Not Supported" +msgstr "Nepodporované" + + +msgid "This region does not support panel categories" +msgstr "Táto oblasť nepodporuje kategórie panelov" + + msgid "Alignment of the region within the area" msgstr "Zarovnanie regiónu v oblasti" @@ -93064,7 +93662,7 @@ msgstr "Dodá prechod faktora hmly (0,0 - 1,0)" msgid "Deliver normal pass" -msgstr "Dodá prechod normálu" +msgstr "Prináša normálny prechod" msgctxt "Scene" @@ -93659,10 +94257,6 @@ msgid "Crop the rendered frame to the defined render region size" msgstr "Oreže snímku prekreslenia na definovanú veľkosť oblasti prekreslenia" -msgid "File Extensions" -msgstr "Prípony súborov" - - msgid "Add the file format extensions to the rendered file name (eg: filename + .jpg)" msgstr "Pridá prípony súborov do názvu prekreslenia súboru (napr.: filename +. jpg)" @@ -94831,14 +95425,6 @@ msgid "Brightness threshold for using sprite base depth of field" msgstr "Prah jasu pre použitie duchov základnej hĺbky ostrosti" -msgid "Diffuse Trace Options" -msgstr "Možnosti rozptýleného sledovania" - - -msgid "EEVEE settings for tracing diffuse reflections" -msgstr "Nastavenia EEVEE na sledovanie rozptylových odrazov" - - msgid "Auto Bake" msgstr "Automatické zapečenie" @@ -95015,6 +95601,18 @@ msgid "Precision of the horizon search" msgstr "Presnosť snímania horizontu" +msgid "Bias the horizon angles to reduce self intersection artifacts" +msgstr "Skreslenie uhlov horizontu na zníženie artefaktov vlastného pretínania" + + +msgid "Precision of the horizon scan" +msgstr "Presnosť skenovania horizontu" + + +msgid "Constant thickness of the surfaces considered when doing horizon scan and by extension ambient occlusion" +msgstr "Konštantná hrúbka povrchov, ktoré sa berú do úvahy pri skenovaní horizontu, a tým aj pohlcovanie okolím" + + msgid "Light Threshold" msgstr "Prah svetla" @@ -95051,26 +95649,6 @@ msgid "Percentage of render size to add as overscan to the internal render buffe msgstr "Percentuálna veľkosť prekreslenia na pridanie ako preskenovanie do interného zásobníka prekreslenia" -msgid "Options Split" -msgstr "Možnosti rozdelenia" - - -msgid "Split settings per ray type" -msgstr "Nastaví rozdelenie podľa typu lúča" - - -msgid "Unified" -msgstr "Zjednotený" - - -msgid "All ray types use the same settings" -msgstr "Všetky typy lúčov používajú rovnaké nastavenia" - - -msgid "Settings are individual to each ray type" -msgstr "Nastavenia sú individuálne pre každý typ lúča" - - msgid "Tracing Method" msgstr "Metóda sledovania" @@ -95099,14 +95677,6 @@ msgid "EEVEE settings for tracing reflections" msgstr "Nastavenia EEVEE pre sledovanie odrazov" -msgid "Refraction Trace Options" -msgstr "Možnosti sledovania lomu" - - -msgid "EEVEE settings for tracing refractions" -msgstr "Nastavenia EEVEE pre sledovanie lomov" - - msgid "Directional Shadows Resolution" msgstr "Rozlíšenie smerových tieňov" @@ -95124,7 +95694,7 @@ msgstr "Veľkosť bodu a oblasti svetla mapy tieňov" msgid "Shadow Normal Bias" -msgstr "Skreslenie tieňových normálov" +msgstr "Skreslenie tieňových normál" msgid "Shadow Pool Size" @@ -95224,7 +95794,7 @@ msgstr "Povolí pohlcovanie okolím simuláciou strednej miery nepriameho tieňo msgid "Bent Normals" -msgstr "Sklon normálov" +msgstr "Sklon normál" msgid "Compute main non occluded direction to sample the environment" @@ -95311,6 +95881,14 @@ msgid "Maximum light contribution, reducing noise" msgstr "Maximálny svetelný príspevok, zníženie šumu" +msgid "Volume Max Ray Depth" +msgstr "Maximálny objem hĺbky lúča" + + +msgid "Maximum surface intersection count used by the accurate volume intersection method. Will create artifact if it is exceeded" +msgstr "Maximálny počet prekrížení na povrchu, ktorý sa používa pri metóde presného objemového prekríženia. Ak sa prekročí, vytvorí sa artefakt" + + msgid "Exponential Sampling" msgstr "Exponenciálne snímkovanie" @@ -100776,7 +101354,7 @@ msgstr "Kocka" msgid "Map using the normal vector" -msgstr "Mapa použitím vektora normálu" +msgstr "Mapa použitím vektora normály" msgid "Map with Z as central axis" @@ -101663,6 +102241,14 @@ msgid "Theme settings for Font" msgstr "Nastavenie motívu písma" +msgid "Character Weight" +msgstr "Váha postavy" + + +msgid "Weight of the characters. 100-900, 400 is normal" +msgstr "Váha postáv. 100-900, 400 je normálna hodnota" + + msgid "Font size in points" msgstr "Veľkosť písma v bodoch" @@ -101819,10 +102405,18 @@ msgid "Face Orientation Front" msgstr "Predná orientácia plôšky" +msgid "Face Mode Selection" +msgstr "Výber režimu plôšky" + + msgid "Face Retopology" msgstr "Opätovná topológia plôšky" +msgid "Face Selection" +msgstr "Výber plôšky" + + msgid "Face Dot Size" msgstr "Veľkosť bodky plôšky" @@ -102780,6 +103374,10 @@ msgid "Edge UV Face Select" msgstr "Výber hrany UV plôšky" +msgid "Edge Mode Selection" +msgstr "Výber režimu hrán" + + msgid "Edge Seam" msgstr "Hrana švu" @@ -102821,7 +103419,7 @@ msgstr "Veľkosť vrcholu pastelky" msgid "Face Normal" -msgstr "Normál plôšky" +msgstr "Normála plôšky" msgid "NURBS Active U Lines" @@ -102861,7 +103459,7 @@ msgstr "Koreň kože" msgid "Split Normal" -msgstr "Oddelenie normálu" +msgstr "Oddeliť normálu" msgid "Grease Pencil Keyframe" @@ -103157,11 +103755,11 @@ msgstr "Ktoré prvky povrchovej siete sú vybrané na prácu" msgid "Normal Vector" -msgstr "Vektor normálu" +msgstr "Vektor normály" msgid "Normal Vector used to copy, add or multiply" -msgstr "Vektor normálu slúžiaci na kopírovanie, pridávanie alebo množenie" +msgstr "Vektor normály slúžiaci na kopírovanie, pridávanie alebo množenie" msgid "Plane Axis" @@ -103205,7 +103803,7 @@ msgstr "Umiestnenie začnite použitím bodu premietaného do roviny zobrazenia msgid "Use the surface normal (using the transform orientation as a fallback)" -msgstr "Použije normálny povrch (ako alternatívu použije orientáciu transformácie)" +msgstr "Použije normálu povrchu (ako alternatívu použije orientáciu transformácie)" msgid "Use the current transform orientation" @@ -103229,6 +103827,11 @@ msgid "Display only faces with the currently displayed image assigned" msgstr "Zobrazí iba plôšky aktuálne zobrazeného obrázku" +msgctxt "Unit" +msgid "Snap Anim Element" +msgstr "Prvok prichytenia animácie" + + msgid "Type of element to snap to" msgstr "Typ prvku na prichytenie" @@ -103241,6 +103844,11 @@ msgid "Snap to seconds" msgstr "Prichytiť na sekundu" +msgctxt "Unit" +msgid "Nearest Marker" +msgstr "Najbližšiu značku" + + msgid "Snap to nearest marker" msgstr "Prichytí k najbližšej značke" @@ -103433,6 +104041,14 @@ msgid "When creating new strokes, the weight data is added according to the curr msgstr "Pri vytváraní nových ťahov sa údaje o váhei pridávajú podľa aktuálnej skupiny vrcholov a váhy, ak nie je vybratá žiadna skupina vrcholov, váha sa nepridá" +msgid "Multi-frame Editing" +msgstr "Úprava viacnásobných snímok" + + +msgid "Enable multi-frame editing" +msgstr "Povolí úpravu viacnásobných snímok" + + msgid "Cycle-Aware Keying" msgstr "Vedome cyklovať kľúčovanie" @@ -104451,7 +105067,7 @@ msgstr "Zobrazí 3D kurzor prekrytia" msgid "Draw Normals" -msgstr "Vykresliť normály" +msgstr "Nakresliť normály" msgid "Display 3D curve normals in editmode" @@ -104687,7 +105303,7 @@ msgstr "Maska zobrazenia tvarovania" msgid "Display Split Normals" -msgstr "Zobraziť oddelenie normálov" +msgstr "Zobraziť oddelenie normál" msgid "Display vertex-per-face normals as lines" @@ -104698,8 +105314,8 @@ msgid "Display scene statistics overlay text" msgstr "Zobraziť prekrývajúci text štatistík scény" -msgid "Stat Vis" -msgstr "Zobraziť štatistiku" +msgid "Mesh Analysis" +msgstr "Analýza povrchovej siete" msgid "Display statistical information about the mesh" @@ -104843,11 +105459,11 @@ msgstr "Zobrazí názov materiálu priradený ku každému ťahu" msgid "Constant Screen Size Normals" -msgstr "Normály konštantnej veľkosti obrazovky" +msgstr "Konštantná veľkosť normál obrazovky" msgid "Keep size of normals constant in relation to 3D view" -msgstr "Zachová konštantnú veľkosť normálu vo vzťahu k 3D zobrazeniu" +msgstr "Zachová konštantnú veľkosť normál vo vzťahu k 3D zobrazeniu" msgid "Vertex Opacity" @@ -105346,7 +105962,7 @@ msgstr "Prah alfa" msgid "Z, Index, normal, UV and vector passes are only affected by surfaces with alpha transparency equal to or higher than this threshold" -msgstr "Z, index, normál, UV a vektorové prechody sú ovplyvnené iba povrchmi s priehľadnosťou alfa rovnou alebo vyššou ako táto prahová hodnota" +msgstr "Z, index, normála, UV a vektorové prechody sú ovplyvnené iba povrchami s priehľadnosťou alfa rovnou alebo vyššou ako táto prahová hodnota" msgid "Cryptomatte Levels" @@ -106166,10 +106782,6 @@ msgid "Vector2D" msgstr "Vector2D" -msgid "2D float vector action, representing a thumbstick or trackpad" -msgstr "2D vektorová akcia na pohyblivej čiarke, ktorá predstavuje stlačenie palca alebo trackpad" - - msgid "3D pose action, representing a controller's location and rotation" msgstr "3D akcia pózy, ktorá predstavuje polohu a rotáciu ovládača" @@ -107187,7 +107799,7 @@ msgstr "Uzamknutie osi Z" msgctxt "WindowManager" msgid "Custom Normals Modal Map" -msgstr "Typická mapa vlastných normálov" +msgstr "Typická mapa vlastných normál" msgctxt "WindowManager" @@ -107205,7 +107817,7 @@ msgstr "Invertovať" msgid "Toggle inversion of affected normals" -msgstr "Prepína inverziu dotknutých normálov" +msgstr "Prepína inverziu dotknutých normál" msgctxt "WindowManager" @@ -107214,7 +107826,7 @@ msgstr "Sféricky" msgid "Interpolate between new and original normals" -msgstr "Interpoluje medzi novými a pôvodnými normálmi" +msgstr "Interpoluje medzi novými a pôvodnými normálami" msgctxt "WindowManager" @@ -107358,7 +107970,7 @@ msgstr "Prepnúť tvrdé normály" msgid "Toggle harden normals flag" -msgstr "Prepína príznak tvrdosti normálov" +msgstr "Prepína príznak tvrdosti normál" msgctxt "WindowManager" @@ -107630,6 +108242,16 @@ msgid "Down" msgstr "Nadol" +msgctxt "WindowManager" +msgid "Local Up" +msgstr "Lokálne hore" + + +msgctxt "WindowManager" +msgid "Local Down" +msgstr "Lokálne dole" + + msgctxt "WindowManager" msgid "Stop Move Forward" msgstr "Zastaviť posun dopredu" @@ -107646,8 +108268,18 @@ msgstr "Zastaviť posun doľava" msgctxt "WindowManager" -msgid "Stop Mode Right" -msgstr "Zastaviť režim doprava" +msgid "Stop Move Global Up" +msgstr "Zastaviť globálny posun nahor" + + +msgctxt "WindowManager" +msgid "Stop Move Local Up" +msgstr "Zastaviť lokálny posun nahor" + + +msgctxt "WindowManager" +msgid "Stop Move Local Down" +msgstr "Zastaviť lokálny posun nadol" msgctxt "WindowManager" @@ -107878,6 +108510,11 @@ msgid "NLA Editor" msgstr "NLA Editor" +msgctxt "WindowManager" +msgid "NLA Tracks" +msgstr "NLA stopy" + + msgctxt "WindowManager" msgid "NLA Generic" msgstr "Všeobecné NLA" @@ -108543,6 +109180,11 @@ msgid "Precision Mode" msgstr "Režim presnosti" +msgctxt "WindowManager" +msgid "Navigate" +msgstr "Navigovať" + + msgctxt "WindowManager" msgid "Eyedropper Modal Map" msgstr "Typická mapa kvapkadla" @@ -109211,6 +109853,10 @@ msgid "No glTF Animation" msgstr "Bez glTF animácie" +msgid "No Actions in .blend file" +msgstr "Žiadne akcie v .blend súbore" + + msgid "Variant" msgstr "Variant" @@ -109675,6 +110321,21 @@ msgid "Deselect All" msgstr "Odznačiť všetko" +msgctxt "Operator" +msgid "Update Work Repository" +msgstr "Aktualizovať pracovné úložisko" + + +msgctxt "Operator" +msgid "Clean up Work Repository" +msgstr "Vyčistiť pracovné úložisko" + + +msgctxt "Operator" +msgid "Update Blender Repository" +msgstr "Aktualizovať úložisko Blenderu" + + msgctxt "Operator" msgid "Statistics" msgstr "Štatistiky" @@ -110659,6 +111320,14 @@ msgid "Edit Bone(s)" msgstr "Upraviť kosť(i)" +msgid "Scene(s)" +msgstr "Scéna(y)" + + +msgid "Brush(es)" +msgstr "Štetec(ce)" + + msgid "Unknown" msgstr "Neznámy" @@ -110796,7 +111465,7 @@ msgstr "Zdrojová os Z" msgid "Align to Normal" -msgstr "Zarovnať na normál" +msgstr "Zarovnať na normálu" msgid "Pivot Offset" @@ -111553,6 +112222,18 @@ msgid "Invert" msgstr "Invertovať" +msgid "Max Displacement" +msgstr "Maximálny posun" + + +msgid "Render Method" +msgstr "Metóda prekreslenia" + + +msgid "Light Probe Volume" +msgstr "Snímač svetla objemu" + + msgid "Intersection" msgstr "Priesečník" @@ -111565,6 +112246,18 @@ msgid "Custom Occlusion" msgstr "Vlastné pohlcovanie" +msgid "Unsupported displacement method" +msgstr "Metóda nepodporovaného posunu" + + +msgid "Transparency Overlap" +msgstr "Prekrývanie priehľadnosti" + + +msgid "Raytraced Refraction" +msgstr "Lom sledovania lúča" + + msgctxt "Operator" msgid "Lock Unselected" msgstr "Zamknúť nevybrané" @@ -111616,7 +112309,7 @@ msgstr "Všetky hrany" msgid "Align to Vertex Normal" -msgstr "Zarovnať normály vrcholov" +msgstr "Zarovnať na normálu vrcholu" msgid "Show Instancer" @@ -111977,7 +112670,7 @@ msgstr "Max. odchýlka vytvorenia" msgid "Check Surface Normals" -msgstr "Kontrola normálov povrchu" +msgstr "Kontrola normál povrchu" msgid "Max Tension" @@ -112480,6 +113173,14 @@ msgid "Light Clamping" msgstr "Pripnutie svetla" +msgid "Max Depth" +msgstr "Maximálna hĺbka" + + +msgid "Refraction" +msgstr "Lom" + + msgid "Cascade Size" msgstr "Veľkosť kaskády" @@ -112488,6 +113189,18 @@ msgid "Pool Size" msgstr "Veľkosť nádrže" +msgid "Tracing" +msgstr "Sledovanie" + + +msgid "Rays" +msgstr "Lúče" + + +msgid "Temporal Reprojection" +msgstr "Časová opätovná projekcia" + + msgctxt "Operator" msgid "Bake Indirect Lighting" msgstr "Zapiecť nepriame osvetlenie" @@ -112519,6 +113232,11 @@ msgid "Bake Cubemap Only" msgstr "Zapiecť iba kockové rozloženie" +msgctxt "Operator" +msgid "Bake Volumes" +msgstr "Zapiecť objem" + + msgid "Shadow Resolution" msgstr "Rozlíšenie tieňov" @@ -112633,6 +113351,10 @@ msgid "Use for Rendering" msgstr "Použiť na prekreslenie" +msgid "Occlusion Distance" +msgstr "Vzdialenosť pohlcovania" + + msgid "Conflicts with another render pass with the same name" msgstr "Konflikty s iným prekreslením prechodu s rovnakým názvom" @@ -113871,6 +114593,11 @@ msgid "Types" msgstr "Typy" +msgctxt "Operator" +msgid "Show Object Hierarchy" +msgstr "Zobraziť hierarchiu objektu" + + msgctxt "Operator" msgid "Show One Level" msgstr "Zobraziť jednu úroveň" @@ -114138,6 +114865,11 @@ msgid "Anchor X" msgstr "Kotva X" +msgctxt "Sound" +msgid "Strip Volume" +msgstr "Objem pásu" + + msgid "%14s" msgstr "%14s" @@ -115243,6 +115975,11 @@ msgid "View Align" msgstr "Zarovnať zobrazenie" +msgctxt "Text" +msgid "Weight" +msgstr "Váha" + + msgid "Shadow Offset X" msgstr "Posuv tieňov X" @@ -115395,6 +116132,11 @@ msgid "Fly/Walk" msgstr "Lietanie/Chôdza" +msgctxt "Operator" +msgid "Extension Add-on Repository" +msgstr "Úložisko rozšírení doplnkov" + + msgid "Multiple add-ons with the same name found!" msgstr "Nenájdených viac doplnkov s rovnakým názvom!" @@ -115830,6 +116572,11 @@ msgid "Make Local..." msgstr "Vytvoriť lokálne..." +msgctxt "Operator" +msgid "Insert Keyframe with Keying Set" +msgstr "Vloží kľúčovú snímku so sústavou kľúčov" + + msgctxt "Operator" msgid "Delete Keyframes..." msgstr "Odstrániť kľúčovú snímku..." @@ -116127,7 +116874,7 @@ msgstr "Rozšíriť masku podľa topológie" msgctxt "Operator" msgid "Expand Mask by Normals" -msgstr "Rozšíriť masku podľa normálov" +msgstr "Rozšíriť masku podľa normál" msgctxt "Operator" @@ -116184,16 +116931,6 @@ msgid "Extract Face Set" msgstr "Extrahovať sústavu plôšok" -msgctxt "Operator" -msgid "Invert Visible Face Sets" -msgstr "Invertovať viditeľné sústavy plôšok" - - -msgctxt "Operator" -msgid "Show All Face Sets" -msgstr "Zobraziť všetky sústavy plôšok" - - msgctxt "Operator" msgid "Randomize Colors" msgstr "Náhodné farby" @@ -116241,7 +116978,7 @@ msgstr "Podľa materiálov" msgctxt "Operator" msgid "By Normals" -msgstr "Podľa normálov" +msgstr "Podľa normál" msgctxt "Operator" @@ -116405,7 +117142,7 @@ msgstr "Vysunúť plôšky" msgctxt "Operator" msgid "Extrude Faces Along Normals" -msgstr "Vysunúť plôšky pozdĺž normálov" +msgstr "Vysunúť plôšky pozdĺž normál" msgctxt "Operator" @@ -116547,6 +117284,16 @@ msgid "Duplicate Active Keyframe (Active Layer)" msgstr "Vytvoriť kópiu aktívnej kľúčovej snímky (aktívna vrstva)" +msgctxt "Operator" +msgid "Set Caps" +msgstr "Nastaviť koncovku" + + +msgctxt "Operator" +msgid "Smooth Points" +msgstr "Body vyhladenia" + + msgctxt "Operator" msgid "View Selected" msgstr "Zobraziť vybrané" @@ -116618,10 +117365,6 @@ msgid "Vertex Group Weights" msgstr "Váhy skupiny vrcholov" -msgid "Mesh Analysis" -msgstr "Analýza povrchovej siete" - - msgid "Face Angle" msgstr "Uhol plôšky" @@ -116988,7 +117731,7 @@ msgstr "Označiť ostré podľa vrcholov" msgctxt "Operator" msgid "Custom Normal" -msgstr "Vlastný normál" +msgstr "Vlastná normála" msgctxt "Operator" @@ -117280,6 +118023,10 @@ msgid "Reproject" msgstr "Opätovne premietnuť" +msgid "Mirror Points" +msgstr "Zrkadlové body" + + msgid "Curve Shape" msgstr "Tvar krivky" @@ -117741,6 +118488,10 @@ msgid "Could not insert keyframe, as RNA path is invalid for the given ID (ID = msgstr "Nemožno vložiť kľúčovú snímku, pretože cesta RNA pre danú identifikáciu (ID = %s, cesta = %s) je neplatná" +msgid "Failed to insert keys on F-Curve with path '%s[%d]', ensure that it is not locked or sampled, and try removing F-Modifiers" +msgstr "Nepodarilo sa vložiť kľúče na F-krivku s cestou '%s[%d]', uistite sa, či nie je uzamknutá alebo snímaná a pokúste sa odstrániť F-modifikátory" + + msgid "No ID block to insert keyframe in (path = %s)" msgstr "Žiadny blok ID na vloženie kľúčovej snímky (cesta = %s)" @@ -117773,6 +118524,22 @@ msgid "Not clearing all keyframes from locked F-Curve '%s' for %s '%s'" msgstr "Nie sú vymazané všetky kľúčové snímky z uzamknutej krivky funkcií '%s' pre %s '%s'" +msgid "Could not insert keyframe, as this type does not support animation data (ID = %s)" +msgstr "Nepodarilo sa vložiť kľúčovú snímku, pretože tento typ nepodporuje animačné údaje (ID = %s)" + + +msgid "Could not insert keyframe, as this property does not exist (ID = %s, path = %s)" +msgstr "Nemožno vložiť kľúčovú snímku, pretože táto vlastnosť neexistuje (ID = %s, cesta = %s)" + + +msgid "Failed to insert any keys" +msgstr "Nepodarilo sa vložiť žiadne kľúče" + + +msgid "Named Layer node" +msgstr "Pomenovaný uzol vrstvy" + + msgid "User Library" msgstr "Užívateľská knižnica" @@ -118041,10 +118808,6 @@ msgid "Int" msgstr "Celé číslo" -msgid "PreviewCol" -msgstr "NahladFarby" - - msgid "TexturedCol" msgstr "TexturovanaFarba" @@ -118062,17 +118825,13 @@ msgstr "Vrchol plôšky mnohouholníka" msgid "ShapeKey" -msgstr "KLucovyTvar" +msgstr "KlucovyTvar" msgid "OS Loop" msgstr "Slučka OS" -msgid "PreviewLoopCol" -msgstr "NáhladFarbySlucky" - - msgid "Int8" msgstr "Celé číslo 8bit" @@ -118339,6 +119098,18 @@ msgid "Auto Smooth" msgstr "Automatické vyhladenie" +msgid "Socket_1" +msgstr "Zásuvka_1" + + +msgid "Input_1_use_attribute" +msgstr "Vstup_1_použitého_atribútu" + + +msgid "Input_1_attribute_name" +msgstr "Názov_atribútu_vstupu_1" + + msgid "Tangent space can only be computed for tris/quads, aborting" msgstr "Priestor dotyku možno vypočítať len pre trojice/štvorice. Prerušené" @@ -118640,10 +119411,6 @@ msgid "No valid formats found" msgstr "Nenašli sa žiadne platné formáty" -msgid "Can't allocate ffmpeg format context" -msgstr "Nemožno prideliť kontext formátu ffmpeg" - - msgid "Render width has to be 720 pixels for DV!" msgstr "Šírka prekreslenia musí byť 720 pixelov pre DV!" @@ -118656,10 +119423,6 @@ msgid "Render height has to be 576 pixels for DV-PAL!" msgstr "Výška prekreslenia musí byť 576 pixelov pre DV-PAL!" -msgid "FFmpeg only supports 48khz / stereo audio for DV!" -msgstr "FFmpeg podporuje iba 48khz / stereo zvuk pre DV!" - - msgid "Error initializing video stream" msgstr "Chyba pri inicializácii video prúdu" @@ -118861,7 +119624,7 @@ msgstr "Súbor %s sa nedá otvoriť na zápis: %s" msgid "Zero normal given" -msgstr "Daná nula normálov" +msgstr "Daná nulová normála" msgid "Select at least two edge loops" @@ -118948,6 +119711,10 @@ msgid "Optimizing Shaders (%d remaining)" msgstr "Optimalizácia tieňovačov (%d zostávajúce)" +msgid "EEVEE (Legacy)" +msgstr "EEVEE (zdedené)" + + msgid "Incompatible Light cache version, please bake again" msgstr "Nekompatibilná verzia zásobníka svetla, zapečte, prosím, znova" @@ -119080,6 +119847,18 @@ msgid "Nothing selected" msgstr "Nič vybraté" +msgid "No open Graph Editor window found" +msgstr "Nenašlo sa žiadne otvorené okno Editora grafu" + + +msgid "Cannot create the Animation Context" +msgstr "Nemožno vytvoriť kontext animácie" + + +msgid "F-Curves have no valid size" +msgstr "F-krivky nemajú platnú veľkosť" + + msgid "" msgstr "" @@ -119262,6 +120041,14 @@ msgid "Successfully added %d keyframes for keying set '%s'" msgstr "Úspešne pridané %d kľúčové snímky pre sústavu kľúčovania '%s'" +msgid "Unsupported context mode" +msgstr "Nepodporovaný režim kontextu" + + +msgid "'%s' is not editable" +msgstr "'%s' nemožno upravovať" + + msgid "Successfully removed %d keyframes for keying set '%s'" msgstr "Úspešne odstránené %d kľúčové snímky pre sústavu kľúčovania '%s'" @@ -120450,6 +121237,11 @@ msgid "Missing Menu: %s" msgstr "Chýbajúca ponuka: %s" +msgctxt "WindowManager" +msgid "Search" +msgstr "Vyhľadať" + + msgid "Non-Keyboard Shortcut" msgstr "Neklávesová skratka" @@ -120521,6 +121313,21 @@ msgid "Clear Single Keyframes" msgstr "Vymazať kľúčové snímky jednotlivo" +msgctxt "Operator" +msgid "View Single in Graph Editor" +msgstr "Zobraziť jednotlivo v Editore grafov" + + +msgctxt "Operator" +msgid "View All in Graph Editor" +msgstr "Zobraziť všetko v Editore grafov" + + +msgctxt "Operator" +msgid "View in Graph Editor" +msgstr "Zobraziť v Editore grafov" + + msgctxt "Operator" msgid "Delete Drivers" msgstr "Odstrániť ovládače" @@ -121572,6 +122379,14 @@ msgid "ASCII" msgstr "ASCII" +msgid "Batch" +msgstr "Dávka" + + +msgid "No filename given" +msgstr "Nie je zadaný žiadny názov súboru" + + msgid "File References" msgstr "Odkazy na súbory" @@ -121854,7 +122669,7 @@ msgstr "Nepodporuje individuálny počiatok ako otočný bod" msgid "Can only copy one custom normal, vertex normal or face normal" -msgstr "Mono kopírovať iba jednu vlastnú normál, normál vrcholu alebo normál plôšky" +msgstr "Možno kopírovať iba jednu vlastnú normálu, normálu vrcholu alebo normálu plôšky" msgid "Removed: %d vertices, %d edges, %d faces" @@ -121985,6 +122800,21 @@ msgid "SoundTrack" msgstr "ZvukovaStopa" +msgctxt "Light" +msgid "Volume" +msgstr "Objem" + + +msgctxt "Light" +msgid "Plane" +msgstr "Rovina" + + +msgctxt "Light" +msgid "Sphere" +msgstr "Sféra" + + msgctxt "Light" msgid "LightProbe" msgstr "SnímacSvetla" @@ -122596,6 +123426,10 @@ msgid "Unable to execute '%s', error changing modes" msgstr "Nepodarilo sa spustiť '%s', chyba zmeny režimov" +msgid "Unable to execute, %s object is linked" +msgstr "Nemožno vykonať, objekt %s je prepojený" + + msgid "Apply modifier as a new shapekey and keep it in the stack" msgstr "Použiť modifikátor ako nový kľúčový tvar a ponechať ho v zásobníku" @@ -122832,6 +123666,10 @@ msgid "Could not find an overridable root hierarchy for object '%s'" msgstr "Nepodarilo sa nájsť prepisovateľnú koreňovú hierarchiu pre objekt '%s'" +msgid "Too many potential root collections (%d) for the override hierarchy, please use the Outliner instead" +msgstr "Príliš veľa potenciálnych kolekcií koreňov (%d) pre hierarchiu prepisov, namiesto toho použite Líniový prehľad" + + msgid "Move the mouse to change the voxel size. CTRL: Relative Scale, SHIFT: Precision Mode, ENTER/LMB: Confirm Size, ESC/RMB: Cancel" msgstr "Pohybom myši zmeníte veľkosť voxelu. CTRL: Relatívna mierka, SHIFT: Presný režim, ENTER/ĽTM: Potvrdiť veľkosť, ESC/PTM: Zrušiť" @@ -123757,6 +124595,14 @@ msgid "UV map or surface attachment is invalid" msgstr "Pripojenie UV mapy alebo povrchu je neplatné" +msgid "No active Grease Pencil layer" +msgstr "Neaktívna vrstva Pastelky" + + +msgid "No Grease Pencil frame to draw on" +msgstr "Žiadna snímka na kreslenie Pastelkou" + + msgid "PaintCurve" msgstr "Maľovanie krivky" @@ -125058,6 +125904,14 @@ msgid "Select an existing NLA Track or an empty action line first" msgstr "Najprv vyberte existujúcu stopu NLA alebo prázdny riadok akcie" +msgid "No animation track found at index %d" +msgstr "V indexe %d sa nenašla žiadna stopa animácie" + + +msgid "Animation track at index %d is not a NLA 'Active Action' track" +msgstr "Stopa animácie na indexe %d nie je stopou 'Aktívnej akcie' NLA" + + msgid "" "Node group assets not assigned to a catalog.\n" "Catalogs can be assigned in the Asset Browser" @@ -125282,6 +126136,10 @@ msgid "no matrices" msgstr "bez matríc" +msgid "• Grease Pencil: %s layers" +msgstr "• Pastelka: %s vrstiev" + + msgid "Supported: All Types" msgstr "Podporované: Všetky typy" @@ -125938,6 +126796,14 @@ msgid "File '%s' could not be loaded" msgstr "Súbor '%s' sa nepodarilo načítať" +msgid "Please select all related strips" +msgstr "Prosím, vyberte všetky súvisiace prúžky" + + +msgid "No strips to paste" +msgstr "Žiadne pásy na prilepenie" + + msgid "Slip offset: %s" msgstr "Posuv pokĺznutím: %s" @@ -125978,14 +126844,6 @@ msgid "No valid inputs to swap" msgstr "Žiadne platné vstupy pre na výmenu" -msgid "Please select all related strips" -msgstr "Prosím, vyberte všetky súvisiace prúžky" - - -msgid "No strips to paste" -msgstr "Žiadne pásy na prilepenie" - - msgid "Please select two strips" msgstr "Vyberte, prosím, dva pásy" @@ -126038,6 +126896,10 @@ msgid "Can not create freeze frame" msgstr "Nemožno vytvoriť snímku zmrazenia" +msgid "Can not create transition from first or last key" +msgstr "Nemožno vytvoriť prechod z prvého alebo posledného kľúča" + + msgid "Can not create transition" msgstr "Nemožno vytvoriť prechod" @@ -126984,7 +127846,7 @@ msgstr "Nemožno použiť krivku s nulovou dĺžkou" msgid "Cannot use vertex with zero-length normal" -msgstr "Nemožno použiť vrchol s nulovou dĺžkou normálu" +msgstr "Nemožno použiť vrchol s nulovou dĺžkou normály" msgid "Cannot use zero-length edge" @@ -127826,6 +128688,10 @@ msgid "ID '%s' is linked, cannot edit its overrides" msgstr "ID '%s' je prepojené, nemožno upraviť jeho prepis" +msgid "Data-block '%s' is not a library override, or not part of a library override hierarchy" +msgstr "Blok údajov '%s' nie je prepisom knižnice alebo nie je súčasťou hierarchie prepisov knižnice" + + msgid "%s is not compatible with %s 'refresh' options" msgstr "%s nie je kompatibilný s možnosťami 'obnovenia' %s" @@ -127970,6 +128836,10 @@ msgid "Cannot move collection from index '%d' to '%d'" msgstr "Nemožno presunúť kolekciu z indexu '%d' do indexu '%d'" +msgid "`Collection.bones` is not available in armature edit mode" +msgstr "`Collection.bones` (kolekcia kostí) v režime editácie armatúry nie je dostupná" + + msgid "Invalid color palette index: %d" msgstr "Nesprávny index palety farieb: %d" @@ -128490,11 +129360,11 @@ msgstr "UV mapa '%s' sa nenašla" msgid "Number of custom normals is not number of loops (%f / %d)" -msgstr "Počet vlastných normálov nie je počtom slučiek (%f / %d)" +msgstr "Počet vlastných normál nie je počtom slučiek (%f / %d)" msgid "Number of custom normals is not number of vertices (%f / %d)" -msgstr "Počet vlastných normálov nie je počtom vrcholov (%f / %d)" +msgstr "Počet vlastných normál nie je počtom vrcholov (%f / %d)" msgid "Metaball '%s' does not contain spline given" @@ -128525,6 +129395,30 @@ msgid "Registering node socket class: '%s' is too long, maximum length is %d" msgstr "Registrácia triedy zásuvky uzla: %s je príliš dlhá, maximálna dĺžka je %d" +msgid "The node socket's default value" +msgstr "Predvolená hodnota zásuvky uzla" + + +msgid "The index from the context" +msgstr "Index z kontextu" + + +msgid "ID or Index" +msgstr "ID alebo index" + + +msgid "The \"id\" attribute if available, otherwise the index" +msgstr "Atribút \"id\", ak je k dispozícii, inak index" + + +msgid "The geometry's normal direction" +msgstr "Smer normály geometrie" + + +msgid "The position from the context" +msgstr "Pozícia z kontextu" + + msgid "Parent is not part of the interface" msgstr "Rodič nie je súčasťou rozhrania" @@ -128614,6 +129508,14 @@ msgid "Unable to move sockets in built-in node" msgstr "Nemožno presunúť zásuvky vo vstavanom uzle" +msgid "Unable to locate item in node" +msgstr "Nemožno nájsť položku v uzle" + + +msgid "Unable to create item with this socket type" +msgstr "Nemožno vytvoriť položku s týmto typom zásuvky" + + msgid "Registering node tree class: '%s' is too long, maximum length is %d" msgstr "Registrácia triedy stromu uzlov: dĺžka '%s' je príliš veľká, maximálna dĺžka je %d" @@ -129098,6 +130000,14 @@ msgid "%s area type does not support gizmos" msgstr "Typ oblasti %s nepodporuje manipulačné prvky" +msgid "Unknown operator" +msgstr "Neznámy operátor" + + +msgid "Operator missing srna" +msgstr "Chýbajúci operátor srna" + + msgid "Gizmo target property '%s.%s' not found" msgstr "Cieľová vlastnosť manipulačného prvku '%s.%s\" sa nenašla" @@ -129713,7 +130623,7 @@ msgstr "Pohyb" msgid "Along Normals" -msgstr "Pozdĺž normálov" +msgstr "Pozdĺž normál" msgid "Life" @@ -130071,6 +130981,10 @@ msgid "Instance Count" msgstr "Počet inštancií" +msgid "Layer Count" +msgstr "Počet vrstiev" + + msgid "How many times to blur the values for all elements" msgstr "Určuje, koľkokrát sa majú rozostriť hodnoty pre všetky prvky" @@ -130143,6 +131057,10 @@ msgid "Endpoint Selection node" msgstr "Uzol Výber koncového bodu" +msgid "An index used to group curves together. Filling is done separately for each group" +msgstr "Index používaný na zoskupovanie kriviek. Vypĺňanie sa vykonáva samostatne pre každú skupinu" + + msgid "Limit Radius" msgstr "Limit polomeru" @@ -130216,7 +131134,7 @@ msgstr "Stred kružnice opísanej tromi bodmi" msgid "The normal direction of the plane described by the three points, pointing towards the positive Z axis" -msgstr "Normál roviny opísanej tromi bodmi smerujúci ku kladnej osi Z" +msgstr "Normála roviny opísanej tromi bodmi smerujúci ku kladnej osi Z" msgid "The radius of the circle described by the three points" @@ -130906,7 +131824,7 @@ msgstr "Základné krivky, medzi ktorými sú interpolované nové krivky" msgid "Optional up vector that is typically a surface normal" -msgstr "Voliteľný vektor nahor, ktorý je zvyčajne normálny povrch" +msgstr "Voliteľný vektor nahor, ktorý je zvyčajne normálou povrchu" msgid "Splits guides into separate groups. New curves interpolate existing curves from a single group" @@ -131374,7 +132292,7 @@ msgstr "Pozícia zásahu" msgid "Hit Normal" -msgstr "Normál zásahu" +msgstr "Normála zásahu" msgid "Hit Distance" @@ -131489,6 +132407,14 @@ msgid "Forward the output of the simulation input node directly to the output no msgstr "Presmeruje výstup vstupného uzla simulácie priamo do výstupného uzla a ignoruje uzly v zóne simulácie" +msgid "All geometry groups as separate instances" +msgstr "Všetky skupiny geometrie ako samostatné inštancie" + + +msgid "The group ID of each group instance" +msgstr "ID skupiny každej inštancie skupiny" + + msgid "Failed to write to attribute \"{}\" with domain \"{}\" and type \"{}\"" msgstr "Nepodarilo sa zapísať do atribútu \"{}\" s doménou \"{}\" a typom \"{}\"" @@ -131818,7 +132744,7 @@ msgstr "Plášť IOR" msgid "Coat Normal" -msgstr "Normál plášťa" +msgstr "Normála plášťa" msgid "Sheen Weight" @@ -131942,11 +132868,11 @@ msgstr "Zdrsnenie bezfarebného laku" msgid "Clear Coat Normal" -msgstr "Normály bezfarebného laku" +msgstr "Normála bezfarebného laku" msgid "True Normal" -msgstr "Pravý normál" +msgstr "Pravá normála" msgid "Incoming" @@ -131978,7 +132904,7 @@ msgstr "Zachytiť" msgid "Tangent Normal" -msgstr "Normál dotyku" +msgstr "Normála dotyčnice" msgid "Facing" @@ -132117,10 +133043,6 @@ msgid "Incident" msgstr "Udalosť" -msgid "Ior" -msgstr "Index lomu" - - msgid "No mesh in active object" msgstr "Žiadna povrchová sieť v aktívnom objekte" @@ -133179,6 +134101,10 @@ msgid "4:3 in 16:9" msgstr "4:3 in 16:9" +msgid "Visual Studio Code" +msgstr "Kód Visual Studia" + + msgid "Blurry Footage" msgstr "Rozostrené zábery" @@ -133759,6 +134685,74 @@ msgid "Attaches hair curves to a surface mesh" msgstr "Pripevní krivky vlasov na povrch siete" +msgid "Surface UV Coordinate" +msgstr "UV súradnice povrchu" + + +msgid "Surface UV coordinate at the attachment point" +msgstr "UV súradnica povrchu v bode pripojenia" + + +msgid "Surface Normal" +msgstr "Normála povrchu" + + +msgid "Surface normal at the attachment point" +msgstr "Normála povrchu v bode pripojenia" + + +msgid "Surface Geometry to attach hair curves to" +msgstr "Geometria povrchu na pripojenie kriviek vlasov" + + +msgid "Surface Object to attach to (needs to have matching transforms)" +msgstr "Objekt povrchu, ku ktorému sa má pripojiť (musí mať zodpovedajúce transformácie)" + + +msgid "Surface UV map used for attachment " +msgstr "UV mapa povrchu použitá na pripevnenie " + + +msgid "Surface Rest Position" +msgstr "Pokojová poloha povrchu" + + +msgid "Set the surface mesh into its rest position before attachment" +msgstr "Nastavenie povrchovej siete do pokojovej polohy pred upevnením" + + +msgid "Sample Attachment UV" +msgstr "Snímka prílohy UV" + + +msgid "Sample the surface UV map at the attachment point" +msgstr "Snímka UV mapy povrchu v bode pripojenia" + + +msgid "Snap to Surface" +msgstr "Prichytiť na povrch" + + +msgid "Snap the root of each curve to the closest surface point" +msgstr "Prichytí koreň každej krivky k najbližšiemu bodu povrchu" + + +msgid "Align to Surface Normal" +msgstr "Zarovnať na normálu povrchu" + + +msgid "Align the curve to the surface normal (need guide as reference)" +msgstr "Zarovná krivku na normálu povrchu (potrebuje vodenie ako referenciu)" + + +msgid "Blend along Curve" +msgstr "Prelínať pozdĺž krivky" + + +msgid "Blend deformation along each curve from the root" +msgstr "Zmieša deformáciu pozdĺž každej krivky od koreňa" + + msgid "Blend Hair Curves" msgstr "Prelínať krivky vlasov" @@ -133767,6 +134761,34 @@ msgid "Blends shape between multiple hair curves in a certain radius" msgstr "Prelína tvar medzi viacerými krivkami vlasov v určitom okruhu" +msgid "Factor to blend overall effect" +msgstr "Faktor prelínania celkového efektu" + + +msgid "Blend Radius" +msgstr "Polomer prelínania" + + +msgid "Radius to select neighbors for blending" +msgstr "Polomer na výber susedov pre prelínanie" + + +msgid "Blend Neighbors" +msgstr "Prelínať susedné" + + +msgid "Amount of neighbors used for blending" +msgstr "Množstvo susedov použitých na prelínanie" + + +msgid "Preserve Length" +msgstr "Zachovať dĺžku" + + +msgid "Preserve each curve's length during deformation" +msgstr "Počas deformácie zachová dĺžku každej krivky" + + msgid "Braid Hair Curves" msgstr "Krivky vrkočov vlasov" @@ -133775,6 +134797,154 @@ msgid "Deforms existing hair curves into braids using guide curves" msgstr "Deformuje existujúce krivky vlasov na vrkoče použitím vodiacich kriviek" +msgid "Guide Index" +msgstr "Index vodenia" + + +msgid "Guide index map that was used for the operation" +msgstr "Indexová mapa vodenia použitého na operáciu" + + +msgid "Flare Parameter" +msgstr "Parameter plameňa" + + +msgid "Parameter from 0 to 1 along the flare" +msgstr "Parameter od 0 do 1 pozdĺž vzplanutia" + + +msgid "Strand Index" +msgstr "Index kadere" + + +msgid "Index of the strand within a braid that each curve belongs to" +msgstr "Index vlákna v rámci vrkoča, ku ktorému patrí každá krivka" + + +msgid "Guide index map to be used. This input has priority" +msgstr "Mapa indexov vodenia na použitie. Tento vstup má prioritu" + + +msgid "Guide Distance" +msgstr "Vzdialenosť vodenia" + + +msgid "Minimum distance between two guides for new guide map" +msgstr "Minimálna vzdialenosť medzi dvoma vodeniami pre novú mapu vodenia" + + +msgid "Guide Mask" +msgstr "Maska vodenia" + + +msgid "Mask for which curve are eligible to be selected as guides" +msgstr "Maska, pre ktorú je krivka vhodná na výber ako vodenie" + + +msgid "Existing Guide Map" +msgstr "Existujúca mapa vodenia" + + +msgid "Use the existing guide map attribute if available" +msgstr "Použije existujúci atribút mapy vodenia, ak je k dispozícii" + + +msgid "Subdivision level applied before deformation" +msgstr "Úroveň delenia použitá pred deformáciou" + + +msgid "Braid Start" +msgstr "Začiatok vrkoča" + + +msgid "Percentage along each curve to blend deformation from the root" +msgstr "Percento pozdĺž každej krivky pre deformáciu prelínania od koreňa" + + +msgid "Overall radius of the braids" +msgstr "Celkový polomer vrkočov" + + +msgid "Shape of the braid radius along each curve" +msgstr "Tvar polomeru vrkoča pozdĺž každej krivky" + + +msgid "Factor Min" +msgstr "Faktor Min" + + +msgid "Factor of the minimum radius of the braids" +msgstr "Faktor minimálneho polomeru vrkočov" + + +msgid "Factor Max" +msgstr "Faktor Max" + + +msgid "Factor of the maximum radius of the braids" +msgstr "Faktor maximálneho polomeru vrkočov" + + +msgid "Frequency factor of the braids" +msgstr "Faktor frekvencie vrkočov" + + +msgid "Thickness of each strand of hair" +msgstr "Hrúbka každého pramienka vlasov" + + +msgid "Thickness Shape" +msgstr "Hrúbka tvaru" + + +msgid "Shape adjustment of the strand thickness for the braids" +msgstr "Nastaví hrúbku tvaru pramienka pre vrkoče" + + +msgid "Shape Asymmetry" +msgstr "Asymetria tvaru" + + +msgid "Asymmetry of the shape adjustment of the strand thickness" +msgstr "Asymetria nastavenia hrúbky tvaru prameňa" + + +msgid "Flare Length" +msgstr "Dĺžka povievania" + + +msgid "Length of the flare at the end of the braid" +msgstr "Dĺžka povievania na konci vrkoča" + + +msgid "Flare Opening" +msgstr "Otvorenie povievania" + + +msgid "Opening radius of the flare at the tip of the braid" +msgstr "Polomer otvorenia povievania na špičke vrkoča" + + +msgid "Hair Tie" +msgstr "Zviazanie vlasov" + + +msgid "Geometry used for the hair tie instance (priority)" +msgstr "Geometria použitá pre inštanciu zviazania vlasov (priorita)" + + +msgid "Object used for the hair tie instance" +msgstr "Predmet použitý pre inštanciu zviazania vlasov" + + +msgid "Hair Tie Scale" +msgstr "Mierka zviazania vlasov" + + +msgid "Scale of the hair tie instance" +msgstr "Mierka inštancie zviazania vlasov" + + msgid "Clump Hair Curves" msgstr "Zhlukovať krivky vlasov" @@ -133783,6 +134953,46 @@ msgid "Clumps together existing hair curves using guide curves" msgstr "Zhlukuje existujúce krivky vlasov pomocou vodiacich kriviek" +msgid "Shape of the influence along curves (0=constant, 0.5=linear)" +msgstr "Tvar vplyvu pozdĺž kriviek (0=konštantné, 0,5=lineárne)" + + +msgid "Tip Spread" +msgstr "Rozprestrenie špičky" + + +msgid "Distance of random spread at the curve tips" +msgstr "Vzdialenosť náhodného rozprestrenia na špičkách krivky" + + +msgid "Clump Offset" +msgstr "Posuv zhlukov" + + +msgid "Offset of each clump in a random direction" +msgstr "Posuv každého zhluku v náhodnom smere" + + +msgid "Distance Falloff" +msgstr "Vzdialenosť dopadu" + + +msgid "Falloff distance for the clumping effect (0 means no falloff)" +msgstr "Vzdialenosť dopadu pre efekt zhlukov (0 znamená žiadny dopad)" + + +msgid "Distance Threshold" +msgstr "Prah vzdialenosti" + + +msgid "Distance threshold for the falloff around the guide" +msgstr "Prahová hodnota vzdialenosti pre dopad okolo vodenia" + + +msgid "Random seed for the operation" +msgstr "Náhodné rozosiatie pre operáciu" + + msgid "Create Guide Index Map" msgstr "Vytvoriť mapu indexu vodenia" @@ -133791,6 +135001,22 @@ msgid "Creates an attribute that maps each curve to its nearest guide via index" msgstr "Vytvorí atribút, ktorý mapuje každú krivku k jej najbližšiemu vodeniu prostredníctvom indexu" +msgid "Guide Selection" +msgstr "Výber vodenia" + + +msgid "Guide Curves or Points used for the selection of Guide Curves" +msgstr "Krivky vodenia alebo body používané na výber kriviek vodenia" + + +msgid "Minimum distance between two guides" +msgstr "Minimálna vzdialenosť medzi dvoma vodeniami" + + +msgid "ID to group together curves for guide map creation" +msgstr "ID na zoskupenie kriviek na vytvorenie mapy vodenia" + + msgid "Curl Hair Curves" msgstr "Krivky kučery vlasov" @@ -133799,6 +135025,38 @@ msgid "Deforms existing hair curves into curls using guide curves" msgstr "Deformuje existujúce krivky vlasov na kučery použitím kriviek vodenia" +msgid "Curl Start" +msgstr "Začiatok kučery" + + +msgid "Overall radius of the curls" +msgstr "Celkový polomer kučier" + + +msgid "Factor for the radius at the curl start" +msgstr "Faktor pre polomer na začiatku kučery" + + +msgid "Factor End" +msgstr "Faktor ukončenia" + + +msgid "Factor for the radius at the curl end" +msgstr "Faktor pre polomer na konci kučery" + + +msgid "Frequency factor of the curls" +msgstr "Faktor frekvencie kučier" + + +msgid "Amount of random offset per curve" +msgstr "Množstvo náhodného posuvu na krivku" + + +msgid "Random Seed for the operation" +msgstr "Náhodné rozosiatie pre operáciu" + + msgid "Curve Info" msgstr "Informácia krivky" @@ -133807,6 +135065,38 @@ msgid "Reads information about each curve" msgstr "Číta informácie o každej krivke" +msgid "Index of each Curve" +msgstr "Index každej krivky" + + +msgid "Curve ID" +msgstr "ID krivky" + + +msgid "ID of each Curve" +msgstr "ID každej krivky" + + +msgid "Length of each Curve" +msgstr "Dĺžka každej krivky" + + +msgid "Direction from root to tip of each Curve" +msgstr "Smer od koreňa po špičku každej krivky" + + +msgid "Random vector for each Curve" +msgstr "Náhodný vektor pre každú krivku" + + +msgid "Surface UV" +msgstr "UV povrchu" + + +msgid "Attachment surface UV coordinate of each Curve" +msgstr "Uchytenie UV súradnice povrchu každej krivky" + + msgid "Curve Root" msgstr "Koreň krivky" @@ -133815,6 +135105,38 @@ msgid "Reads information about each curve's root point" msgstr "Číta informácie o koreňovom bode každej krivky" +msgid "Root Selection" +msgstr "Výber koreňa" + + +msgid "Boolean selection of curve root points" +msgstr "Výber logickej hodnoty koreňových bodov krivky" + + +msgid "Root Position" +msgstr "Poloha koreňa" + + +msgid "Position of the root point of a Curve" +msgstr "Poloha koreňového bodu krivky" + + +msgid "Root Direction" +msgstr "Smer koreňa" + + +msgid "Direction of the root segment of a Curve" +msgstr "Smer koreňového segmentu krivky" + + +msgid "Root Index" +msgstr "Index koreňa" + + +msgid "Index of the root point of a Curve" +msgstr "Index koreňového bodu krivky" + + msgid "Curve Segment" msgstr "Segment krivky" @@ -133823,6 +135145,30 @@ msgid "Reads information each point's previous curve segment" msgstr "Číta informácie o predošlom segmente krivky každého bodu" +msgid "Segment Length" +msgstr "Dĺžka segmentu" + + +msgid "Distance to previous point on Curve" +msgstr "Vzdialenosť od predošlého bodu na krivke" + + +msgid "Segment Direction" +msgstr "Smer segmentu" + + +msgid "Direction from previous neighboring point on segment" +msgstr "Smer od predošlého susedného bodu na segmente" + + +msgid "Neighbor Index" +msgstr "Index susedov" + + +msgid "Index of previous neighboring point on segment" +msgstr "Index predošlého susedného bodu na segmente" + + msgid "Curve Tip" msgstr "Špička krivky" @@ -133831,6 +135177,38 @@ msgid "Reads information about each curve's tip point" msgstr "Číta informácie o bode špičky každej krivky" +msgid "Tip Selection" +msgstr "Výber špičky" + + +msgid "Boolean selection of curve tip points" +msgstr "Logická hodnota výberu bodov špičky krivky" + + +msgid "Tip Position" +msgstr "Poloha špičky" + + +msgid "Position of the tip point of a Curve" +msgstr "Poloha bodu špičky krivky" + + +msgid "Tip Direction" +msgstr "Smer špičky" + + +msgid "Direction of the tip segment of a Curve" +msgstr "Smer segmentu špičky krivky" + + +msgid "Tip Index" +msgstr "Index špičky" + + +msgid "Index of the tip point of a Curve" +msgstr "Index bodu špičky krivky" + + msgid "Displace Hair Curves" msgstr "Posunúť krivky vlasov" @@ -133839,6 +135217,42 @@ msgid "Displaces hair curves by a vector based on various options" msgstr "Posúva krivky vlasov vektorom na základe rôznych možností" +msgid "Factor to scale overall displacement" +msgstr "Faktor na zmenu mierky celkového posunu" + + +msgid "Object used to define the displacement space" +msgstr "Objekt použitý na definovanie priestoru posunu" + + +msgid "Displace Vector" +msgstr "Vektor posunu" + + +msgid "Vector for displacement" +msgstr "Vektor pre posun" + + +msgid "Surface geometry used to sample the normal for displacement" +msgstr "Geometria povrchu použitá na zosnímanie normály pre posun" + + +msgid "Surface object used to sample the normal for displacement" +msgstr "Povrchový objekt používaný na zosnímanie normály pre posun" + + +msgid "Surface UV map used to sample the normal for displacement" +msgstr "Povrchová UV mapa použitá na zosnímanie normály pre posun" + + +msgid "Surface Normal Displacement" +msgstr "Posun normály povrchu" + + +msgid "Amount of displacemement along the surface normal" +msgstr "Veľkosť posunu pozdĺž normály povrchu" + + msgid "Duplicate Hair Curves" msgstr "Vytvoriť kópiu krivky vlasov" @@ -133847,10 +135261,62 @@ msgid "Duplicates hair curves a certain number of times within a radius" msgstr "Vytvorí kópie krivky vlasov určitý počet krát v rámci polomeru" +msgid "Amount of duplicates per curve" +msgstr "Počet kópií na krivku" + + +msgid "Viewport Amount" +msgstr "Množstvo záberu" + + +msgid "Percentage of amount used for the viewport" +msgstr "Percento množstva použitého pre záber" + + +msgid "Radius in which the duplicate curves are offset from the guides" +msgstr "Polomer, v ktorom sú kópie kriviek posunuté od vodenia" + + +msgid "Distribution Shape" +msgstr "Tvar rozloženia" + + +msgid "Shape of distribution from center to the edge around the guide" +msgstr "Tvar rozloženia od stredu po okraj okolo vodenia" + + +msgid "Offset of the curves to round the tip" +msgstr "Posuv kriviek pre zaoblenie špičky" + + +msgid "Keep an even thickness of the distribution of duplicates" +msgstr "Zachová rovnomernú hrúbku rozloženia kópií" + + msgid "Deforms hair curves using a random vector per point to frizz them" msgstr "Deformuje krivky vlasov pomocou náhodného vektora na bod, čím ich rozstrapatí" +msgid "Offset Vector" +msgstr "Vektor posuvu" + + +msgid "Vector by which each point was offset during deformation" +msgstr "Vektor smeru, ktorým bol každý bod posunutý počas deformácie" + + +msgid "Cumulative Offset" +msgstr "Kumulatívny posuv" + + +msgid "Apply offset cumulatively (previous points affect points after)" +msgstr "Použije kumulatívny posuv (predošlé body ovplyvňujú body nasledujúce)" + + +msgid "Overall distance factor for the deformation" +msgstr "Celkový faktor vzdialenosti pre deformáciu" + + msgid "Generate Hair Curves" msgstr "Vygenerovať krivky vlasov" @@ -133859,6 +135325,62 @@ msgid "Generates new hair curves on a surface mesh" msgstr "Vygeneruje nové krivky vlasov na povrchovej sieti" +msgid "Normal direction of the surface mesh at the attachment point" +msgstr "Smer normály povrchovej siete v bode prichytenia" + + +msgid "Surface geometry for generation " +msgstr "Geometria povrchu na generovanie " + + +msgid "Surface object for generation (Needs matching transforms)" +msgstr "Povrchový objekt na vygenerovanie (potrebuje zodpovedajúce transformácie)" + + +msgid "Length of the generated hair curves" +msgstr "Dĺžka vygenerovaných kriviek vlasov" + + +msgid "Hair Material" +msgstr "Materiál vlasov" + + +msgid "Material of the generated hair curves" +msgstr "Materiál vygenerovaných kriviek vlasov" + + +msgid "Amount of control points of the generated hair curves" +msgstr "Množstvo riadiacich bodov vygenerovaných kriviek vlasov" + + +msgid "Poisson Disk Distribution" +msgstr "Poissonove rozloženie diskov" + + +msgid "Use poisson disk distribution method to keep a minimum distance" +msgstr "Na udržanie minimálnej vzdialenosti použije metódu poissonovho rozloženia diskov" + + +msgid "Surface density of generated hair curves" +msgstr "Povrchová hustota vygenerovaných kriviek vlasov" + + +msgid "Density Mask" +msgstr "Maska hustoty" + + +msgid "Factor applied on the density for curve distribution" +msgstr "Faktor aplikovaný pre hustotu na rozloženie kriviek" + + +msgid "Discard points based on an mask texture after distribution" +msgstr "Vyradenie bodov na základe textúry masky po distribúcii" + + +msgid "Factor applied on the density for the viewport" +msgstr "Faktor aplikovaný na hustotu pre záber" + + msgid "Hair Attachment Info" msgstr "Informácie o prichytení vlasov" @@ -133867,14 +135389,114 @@ msgid "Reads attachment information regarding a surface mesh" msgstr "Číta informácie o prichytení týkajúce sa povrchovej siete" +msgid "Attachment UV" +msgstr "Prichytenia UV" + + +msgid "Surface attachment UV coordinate stored on each curve" +msgstr "UV súradnice povrchu prichytenia uložené na každej krivke" + + +msgid "Attachment is Valid" +msgstr "Prichytenie je platné" + + +msgid "Whether the stored attachment UV coordinate is valid" +msgstr "Určuje, či je platná uložená UV súradnica prichytenia" + + +msgid "Surface Geometry" +msgstr "Geometria povrchu" + + +msgid "Surface geometry of the curve attachment" +msgstr "Povrchová geometria prichytenia krivky" + + +msgid "Surface UV map used for attachment" +msgstr "UV mapa povrchu použitá na prichytenie" + + msgid "Deforms hair curves using a noise texture" msgstr "Deformuje krivky vlasov použitím textúry šumu" +msgid "Overall factor for the deformation" +msgstr "Celkový faktor deformácie" + + +msgid "Shape of amount along each curve (0=constant, 0.5=linear)" +msgstr "Tvar množstva pozdĺž každej krivky (0=konštantný, 0,5=lineárny)" + + +msgid "Scale of the noise texture by root position" +msgstr "Mierka textúry šumu podľa polohy koreňa" + + +msgid "Scale along Curve" +msgstr "Mierka pozdĺž krivky" + + +msgid "Scale of noise texture along each Curve" +msgstr "Mierka textúry šumu pozdĺž každej krivky" + + +msgid "Offset per Curve" +msgstr "Posuv na krivku" + + +msgid "Random offset of noise texture for each Curve" +msgstr "Náhodný posuv textúry šumu pre každú krivku" + + +msgid "Seed value for randomization" +msgstr "Hodnota rozosiatia pre náhodnosť" + + +msgid "Preserve the length of the Curves on a segment basis" +msgstr "Zachová dĺžku kriviek na základe segmentov" + + msgid "Interpolates existing guide curves on a surface mesh" msgstr "Interpoluje existujúce vodiace krivky na povrchovej sieti" +msgid "Index of the main guide curve per curve" +msgstr "Index hlavnej vodiacej krivky na krivku" + + +msgid "Follow Surface Normal" +msgstr "Sledovať normálu povrchu" + + +msgid "Align the interpolated curves to the surface normal" +msgstr "Interpolované krivky sa zarovnajú s normálou povrchu" + + +msgid "Part by Mesh Islands" +msgstr "Časť podľa ostrovov povrchovej siete" + + +msgid "Use mesh islands of the surface geometry for parting" +msgstr "Na vytvorenie častí použije geometriu ostrovov povrchovej siete" + + +msgid "Interpolation Guides" +msgstr "Interpolácia vodenia" + + +msgid "Amount of guides to be used for interpolation per curve" +msgstr "Množstvo vodení na použitie pre interpoláciu na krivku" + + +msgid "Distance to Guides" +msgstr "Vzdialenosť od vodenia" + + +msgid "Distance around each guide to spawn interpolated curves" +msgstr "Vzdialenosť okolo každého vodenia na vytretie interpolovaných kriviek" + + msgid "Redistribute Curve Points" msgstr "Prerozdeliť body krivky" @@ -133883,6 +135505,14 @@ msgid "Redistributes existing control points evenly along each curve" msgstr "Prerozdelí existujúce riadiace body rovnomerne pozdĺž každej krivky" +msgid "Feature Awareness" +msgstr "Informovanosť o funkciách" + + +msgid "Use simeple feature awareness to keep feature definition" +msgstr "Na zachovanie definície funkcie použije jednoduché informovanie o funkcii" + + msgid "Restore Curve Segment Length" msgstr "Obnoviť dĺžku segmentu krivky" @@ -133891,6 +135521,26 @@ msgid "Restores the length of each curve segment using a previous state after de msgstr "Obnoví dĺžku každého segmentu krivky použitím predošlého stavu po deformácii" +msgid "Only affect selected elements" +msgstr "Ovplyvní iba vybrané prvky" + + +msgid "Reference Position" +msgstr "Referenčná poloha" + + +msgid "Reference position before deformation" +msgstr "Referenčná poloha pred deformáciou" + + +msgid "Pin at Parameter" +msgstr "Pripnúť na parameter" + + +msgid "Pin each curve at a certain point for the operation" +msgstr "Pripne každú krivku v určitom bode operácie" + + msgid "Roll Hair Curves" msgstr "Zvinúť krivky vlasov" @@ -133899,6 +135549,66 @@ msgid "Rolls up hair curves starting from their tips" msgstr "Zvinie krivky vlasov od ich špičiek" +msgid "Variation Level" +msgstr "Úroveň variácie" + + +msgid "Level of smoothing on the roll path to include shape variation" +msgstr "Úroveň vyhladenia na dráhe zvinutia vrátane variácie tvaru" + + +msgid "Roll Length" +msgstr "Dĺžka zvinutia" + + +msgid "Length of each curve to be rolled" +msgstr "Dĺžka každej krivky, ktorá sa má zvinúť" + + +msgid "Roll Radius" +msgstr "Polomer zvinutia" + + +msgid "Radius of the rolls" +msgstr "Polomer zvinutia" + + +msgid "Roll Depth" +msgstr "Hĺbka zvinutia" + + +msgid "Depth offset of the roll" +msgstr "Posun hĺbky zvinutia" + + +msgid "Roll Taper" +msgstr "Zúženie zvinutia" + + +msgid "Taper of the roll" +msgstr "Zúženie zvinutia" + + +msgid "Retain Overall Shape" +msgstr "Zachovať celkový tvar" + + +msgid "Offset the roll along the original curve to retain shape" +msgstr "Posúva zvinutie pozdĺž pôvodnej krivky, aby sa zachoval tvar" + + +msgid "Roll Direction" +msgstr "Smer zvinutia" + + +msgid "Axis around which each curve is rolled" +msgstr "Os, okolo ktorej sa každá krivka zvinie" + + +msgid "Amount of randomization of the direction of the roll" +msgstr "Náhodnosť množstva smeru zvinutia" + + msgid "Rotate Hair Curves" msgstr "Otočiť krivky vlasov" @@ -133907,10 +135617,54 @@ msgid "Rotates each hair curve around an axis" msgstr "Otáča každú krivku vlasov okolo osi" +msgid "Factor to influence the rotation angle" +msgstr "Faktor na ovplyvnenie uhla rotácie" + + +msgid "Rotation Axis (Default: Tangent at root)" +msgstr "Os rotácie (predvolené: dotyčnica pri koreni)" + + +msgid "Random offset to the rotation angle per Curve" +msgstr "Náhodný posuv k uhlu pootočenia podľa krivky" + + +msgid "Lock Ends" +msgstr "Zamknúť konce" + + +msgid "Lock rotation to the axis between the curve ends" +msgstr "Uzamkne rotáciu k osi medzi koncami krivky" + + msgid "Sets the radius attribute of hair curves according to a profile shape" msgstr "Nastaví atribút polomeru kriviek vlasov podľa tvaru profilu" +msgid "Replace Radius" +msgstr "Nahradiť polomer" + + +msgid "Replace the original radius" +msgstr "Nahradí pôvodný polomer" + + +msgid "Base radius to be set if 'Replace Radius' is enabled" +msgstr "Základný polomer, ktorý sa má nastaviť, ak je povolená funkcia 'Nahradiť polomer'" + + +msgid "Shape of the radius along the curve" +msgstr "Tvar polomeru pozdĺž krivky" + + +msgid "Factor of the radius at the minimum" +msgstr "Faktor minimálneho polomeru" + + +msgid "Factor of the radius at the maximum" +msgstr "Faktor maximálneho polomeru" + + msgid "Shrinkwrap Hair Curves" msgstr "Zmrštiť krivky vlasov" @@ -133919,6 +135673,42 @@ msgid "Shrinkwraps hair curves to a mesh surface from below and optionally from msgstr "Zmrští krivky vlasov na povrchovej sieti zdola a voliteľne zhora" +msgid "Surface geometry used for shrinkwrap" +msgstr "Geometria povrchu použitá na zmrštenie" + + +msgid "Surface object used for shrinkwrap" +msgstr "Povrchový objekt používaný na zmrštenie" + + +msgid "Offset Distance" +msgstr "Vzdialenosť posuvu" + + +msgid "Distance from the surface used for shrinkwrap" +msgstr "Vzdialenosť od povrchu použitého na zmrštenie" + + +msgid "Blend shrinkwrap for points above the surface" +msgstr "Prelína zmrštenie pre body nad povrchom" + + +msgid "Smoothing Steps" +msgstr "Kroky vyhladenia" + + +msgid "Amount of steps of smoothing applied after shwrinkwrap" +msgstr "Množstvo krokov vyhladenia aplikovaných po zmrštení" + + +msgid "Lock Roots" +msgstr "Uzamknúť korene" + + +msgid "Lock the position of root points" +msgstr "Uzamkne polohu koreňových bodov" + + msgid "Smooth Hair Curves" msgstr "Vyhladiť krivky vlasov" @@ -133927,6 +135717,26 @@ msgid "Smoothes the shape of hair curves" msgstr "Vyhladí tvar kriviek vlasov" +msgid "Amount of smoothing" +msgstr "Množstvo vyhladenia" + + +msgid "Amount of smoothing steps" +msgstr "Počet krokov vyhladenia" + + +msgid "Weight used for smoothing" +msgstr "Váha použitá pre vyhladenie" + + +msgid "Lock Tips" +msgstr "Zamknúť špičky" + + +msgid "Lock tip position when smoothing" +msgstr "Pri vyhladzovaní uzamkne polohu špičky" + + msgid "Straighten Hair Curves" msgstr "Narovnať krivky vlasov" @@ -133935,6 +135745,10 @@ msgid "Straightens hair curves between root and tip" msgstr "Narovná krivky vlasov medzi koreňom a špičkou" +msgid "Amount of straightening" +msgstr "Množstvo narovnania" + + msgid "Trim Hair Curves" msgstr "Zastrihnúť krivky vlasov" @@ -133943,6 +135757,42 @@ msgid "Trims or scales hair curves to a certain length" msgstr "Zastrihne alebo upraví krivky vlasov na určitú dĺžku" +msgid "Scale each curve uniformly to reach the target length" +msgstr "Každú krivku rovnomerne upraví tak, aby bola dosiahnutá cieľová dĺžka" + + +msgid "Multiply the original length by a factor" +msgstr "Vynásobí pôvodnú dĺžku faktorom" + + +msgid "Replace Length" +msgstr "Nahradiť dĺžku" + + +msgid "Use the length input to fully replace the original length" +msgstr "Použitím vstupu dĺžky úplne nahradí pôvodnú dĺžku" + + +msgid "Target length for the operation" +msgstr "Cieľová dĺžka operácie" + + +msgid "Mask to blend overall effect" +msgstr "Maska prelínania celkového efektu" + + +msgid "Trim hair curves randomly up to a certain amount" +msgstr "Zastrihne krivky vlasov náhodne do určitého množstva" + + msgid "Smooth by Angle" msgstr "Vyhladiť podľa uhla" + +msgid "Maximum face angle for smooth edges" +msgstr "Maximálny uhol plôšky pre hladké hrany" + + +msgid "Ignore Sharpness" +msgstr "Ignorovať ostrosť" + diff --git a/locale/po/sr.po b/locale/po/sr.po index 8e34711a104..ce419e85ce9 100644 --- a/locale/po/sr.po +++ b/locale/po/sr.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2012-09-07 22:32+0100\n" "Last-Translator: Nikola Radovanovic \n" "Language-Team: Nikola Radovanovic\n" @@ -4241,6 +4241,18 @@ msgid "Save" msgstr "Сачувај" +msgid "File Extensions" +msgstr "Наставци датотека" + + +msgid "Operator" +msgstr "Оператор" + + +msgid "Label" +msgstr "Назив" + + msgid "Relative Path" msgstr "Релативна путања" @@ -6694,10 +6706,6 @@ msgid "Node tree consisting of linked nodes used for shading, textures and compo msgstr "Дрво чворова које чине повезани чворови сенчења, текстура и слагања" -msgid "Label" -msgstr "Назив" - - msgid "Grease Pencil Data" msgstr "Подаци скицирања" @@ -18462,10 +18470,6 @@ msgid "Falloff Type" msgstr "Врста опадања" -msgid "Operator" -msgstr "Оператор" - - msgid "Sharpen" msgstr "Изоштрено" @@ -22129,10 +22133,6 @@ msgid "Process the render result through the compositing pipeline, if compositin msgstr "Обради резултат рендеровања кроз процес слагање, ако су омогућени чворови слагања" -msgid "File Extensions" -msgstr "Наставци датотека" - - msgid "Draw stylized strokes using Freestyle" msgstr "Цртај слободоручне стилизоване потезе" diff --git a/locale/po/sr@latin.po b/locale/po/sr@latin.po index 6a8a5b1846a..473788f7383 100644 --- a/locale/po/sr@latin.po +++ b/locale/po/sr@latin.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2012-09-07 22:32+0100\n" "Last-Translator: Nikola Radovanovic \n" "Language-Team: Nikola Radovanovic\n" @@ -4241,6 +4241,18 @@ msgid "Save" msgstr "Sačuvaj" +msgid "File Extensions" +msgstr "Nastavci datoteka" + + +msgid "Operator" +msgstr "Operator" + + +msgid "Label" +msgstr "Naziv" + + msgid "Relative Path" msgstr "Relativna putanja" @@ -6694,10 +6706,6 @@ msgid "Node tree consisting of linked nodes used for shading, textures and compo msgstr "Drvo čvorova koje čine povezani čvorovi senčenja, tekstura i slaganja" -msgid "Label" -msgstr "Naziv" - - msgid "Grease Pencil Data" msgstr "Podaci skiciranja" @@ -18462,10 +18470,6 @@ msgid "Falloff Type" msgstr "Vrsta opadanja" -msgid "Operator" -msgstr "Operator" - - msgid "Sharpen" msgstr "Izoštreno" @@ -22129,10 +22133,6 @@ msgid "Process the render result through the compositing pipeline, if compositin msgstr "Obradi rezultat renderovanja kroz proces slaganje, ako su omogućeni čvorovi slaganja" -msgid "File Extensions" -msgstr "Nastavci datoteka" - - msgid "Draw stylized strokes using Freestyle" msgstr "Crtaj slobodoručne stilizovane poteze" diff --git a/locale/po/sv.po b/locale/po/sv.po index ae226202b36..9dddff585d3 100644 --- a/locale/po/sv.po +++ b/locale/po/sv.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: \n" "Last-Translator: Arvid Rudling \n" "Language-Team: \n" @@ -689,6 +689,14 @@ msgid "Weights" msgstr "Viktningar" +msgid "File Extensions" +msgstr "Filändelse" + + +msgid "Operator" +msgstr "Operator" + + msgid "File Name" msgstr "Filnamn" @@ -1918,10 +1926,6 @@ msgid "ID name of the menu this was called from" msgstr "ID-namn på menyn som detta anropades från" -msgid "Operator" -msgstr "Operator" - - msgctxt "Operator" msgid "Deinterlace Movies" msgstr "Avläta filmer" @@ -2288,10 +2292,6 @@ msgid "Calculate heights against unsubdivided low resolution mesh" msgstr "Beräkna höjder mot icke-uppdelat lågupplöst mesh" -msgid "File Extensions" -msgstr "Filändelse" - - msgid "Stamp Filename" msgstr "Stämpla filnamn" diff --git a/locale/po/sw.po b/locale/po/sw.po index 4c5602903e2..a958fc08699 100644 --- a/locale/po/sw.po +++ b/locale/po/sw.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2023-11-16 03:55+0000\n" "Last-Translator: Isaac Gicheha \n" "Language-Team: Swahili \n" diff --git a/locale/po/ta.po b/locale/po/ta.po index 0a9ea146449..958760d34fa 100644 --- a/locale/po/ta.po +++ b/locale/po/ta.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2023-11-05 13:30+0000\n" "Last-Translator: saran \n" "Language-Team: Tamil \n" diff --git a/locale/po/th.po b/locale/po/th.po index dac88c88127..4f583fb88f1 100644 --- a/locale/po/th.po +++ b/locale/po/th.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2019-12-08 17:40+0700\n" "Last-Translator: gongpha \n" "Language-Team: Thai Translation Team \n" @@ -1100,6 +1100,14 @@ msgid "Save" msgstr "บันทึก" +msgid "File Extensions" +msgstr "ส่วนขยายไฟล์" + + +msgid "Label" +msgstr "ข้อความ" + + msgid "Miscellaneous" msgstr "เบ็ดเตล็ด" @@ -1641,10 +1649,6 @@ msgid "Movie File" msgstr "ไฟล์ภาพยนตร์" -msgid "Label" -msgstr "ข้อความ" - - msgid "Interface" msgstr "อินเตอร์เฟส" @@ -3672,10 +3676,6 @@ msgid "Render Region" msgstr "ขอบเขตการเรนเดอร์" -msgid "File Extensions" -msgstr "ส่วนขยายไฟล์" - - msgid "Stamp Render Time" msgstr "เวลาการเรนเดอร์" diff --git a/locale/po/tr.po b/locale/po/tr.po index 152c6ab2a5e..05c087ea05d 100644 --- a/locale/po/tr.po +++ b/locale/po/tr.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2023-11-15 02:54+0000\n" "Last-Translator: bitigchi \n" "Language-Team: Turkish \n" @@ -6254,6 +6254,10 @@ msgid "Save" msgstr "Kaydet" +msgid "Operator" +msgstr "Operatör" + + msgid "Environment" msgstr "Çevre" @@ -9356,10 +9360,6 @@ msgid "Reload scripts" msgstr "Betikleri yeniden yükle" -msgid "Operator" -msgstr "Operatör" - - msgid "Sharpen" msgstr "Keskinlik" @@ -10050,10 +10050,6 @@ msgid "UV Sculpting" msgstr "UV Yontması" -msgid "Refraction" -msgstr "Kırılma" - - msgid "Viewport Sampling Presets" msgstr "Görüş Alanı Örnekleme Önayarları" @@ -11538,6 +11534,10 @@ msgid "Caps Type" msgstr "Başlık Türü" +msgid "Refraction" +msgstr "Kırılma" + + msgid "Render Engine" msgstr "Sunum İşletkesi" diff --git a/locale/po/uk.po b/locale/po/uk.po index 9466a510dcd..f57feba535f 100644 --- a/locale/po/uk.po +++ b/locale/po/uk.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" "PO-Revision-Date: 2021-03-01 19:15+0000\n" "Last-Translator: lxlalexlxl \n" "Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/lxlalexlxl/blender/language/uk_UA/)\n" @@ -11294,6 +11294,18 @@ msgid "Whether this path is saved in bookmarks, or generated from OS" msgstr "Цей шлях збережено у закладках або згенеровано ОС" +msgid "File Extensions" +msgstr "Розширення Файлів" + + +msgid "Operator" +msgstr "Оператор" + + +msgid "Label" +msgstr "Позначка" + + msgid "File Select Entry" msgstr "Вхід Вибору Файлу" @@ -21593,10 +21605,6 @@ msgid "Node tree consisting of linked nodes used for shading, textures and compo msgstr "Дерево вузлів, що складається з пов'язаних вузлів, які використовуються для відтінення, текстур і компонування" -msgid "Label" -msgstr "Позначка" - - msgid "The node tree label" msgstr "Позначка дерева вузла" @@ -50276,10 +50284,6 @@ msgid "Reverse Colors" msgstr "Обернути кольори" -msgid "Flip direction of vertex colors inside faces" -msgstr "Змінити напрям кольорів вершин у межах граней" - - msgctxt "Operator" msgid "Rotate Colors" msgstr "Повернути кольори" @@ -60511,10 +60515,6 @@ msgid "Modify Hidden" msgstr "Модифікувати Сховане" -msgid "Apply the edit operation to hidden Face Sets" -msgstr "Застосувати операцію редагування до схованих Наборів Граней" - - msgctxt "Operator" msgid "Face Set Lasso Gesture" msgstr "Набір Граней Ласо Жестом" @@ -60745,10 +60745,6 @@ msgid "Number of times that the filter is going to be applied" msgstr "Кількість разів, яку цей фільтр буде застосовано" -msgid "Operator" -msgstr "Оператор" - - msgctxt "Operator" msgid "Filter Mesh" msgstr "Фільтрувати Сіть" @@ -67787,14 +67783,6 @@ msgid "Panel containing UI elements" msgstr "Панель, що містить елементи Інтерфейсу Користувача" -msgid "Refraction" -msgstr "Заломлення" - - -msgid "Denoising" -msgstr "Знешумлення" - - msgid "Integrator Presets" msgstr "Передустави Інтегратора" @@ -68545,6 +68533,10 @@ msgid "Indirect Lighting" msgstr "Відбите світло" +msgid "Denoising" +msgstr "Знешумлення" + + msgid "Shadows" msgstr "Тіні" @@ -74606,10 +74598,6 @@ msgid "Crop the rendered frame to the defined render region size" msgstr "Обрізати рендерений кадр до визначеного розміру регіону рендера" -msgid "File Extensions" -msgstr "Розширення Файлів" - - msgid "Add the file format extensions to the rendered file name (eg: filename + .jpg)" msgstr "Додати відповідне формату розширення до назви рендереного файлу (напр.: назвафайлу + .jpg)" @@ -83779,8 +83767,8 @@ msgid "Display scene statistics overlay text" msgstr "Показувати текст накладки статистики сцени" -msgid "Stat Vis" -msgstr "Показ статистики" +msgid "Mesh Analysis" +msgstr "Аналіз Сіті" msgid "Display statistical information about the mesh" @@ -87993,6 +87981,10 @@ msgid "Light Clamping" msgstr "Затискання Освітлення" +msgid "Refraction" +msgstr "Заломлення" + + msgid "Cascade Size" msgstr "Розмір Каскаду" @@ -90978,16 +90970,6 @@ msgid "Extract Face Set" msgstr "Витягти Набір Граней" -msgctxt "Operator" -msgid "Invert Visible Face Sets" -msgstr "Інвертувати Видимі Набори Граней" - - -msgctxt "Operator" -msgid "Show All Face Sets" -msgstr "Показ Всіх Наборів Граней" - - msgctxt "Operator" msgid "Randomize Colors" msgstr "Рандомізувати Кольори" @@ -91344,10 +91326,6 @@ msgid "Vertex Group Weights" msgstr "Вагомості Груп Вершин" -msgid "Mesh Analysis" -msgstr "Аналіз Сіті" - - msgid "Face Angle" msgstr "Кут Грані" @@ -92330,10 +92308,6 @@ msgid "Int" msgstr "Ціле" -msgid "PreviewCol" -msgstr "КолірПерегляду" - - msgid "TexturedCol" msgstr "КолірТекстури" @@ -92358,10 +92332,6 @@ msgid "OS Loop" msgstr "Петля вихідного простору" -msgid "PreviewLoopCol" -msgstr "Колір петлі при перегляді" - - msgid "Float3" msgstr "Дійсночислове3" @@ -97525,6 +97495,14 @@ msgid "File '%s' could not be loaded" msgstr "Файл '%s' неможливо завантажити" +msgid "Please select all related strips" +msgstr "Виберіть всі пов'язані смужки" + + +msgid "No strips to paste" +msgstr "Нема смужок для вставлення" + + msgid "Slip offset: %s" msgstr "Зсув ковзання: %s" @@ -97565,14 +97543,6 @@ msgid "No valid inputs to swap" msgstr "Немає правильних вводів для обміну" -msgid "Please select all related strips" -msgstr "Виберіть всі пов'язані смужки" - - -msgid "No strips to paste" -msgstr "Нема смужок для вставлення" - - msgid "Please select two strips" msgstr "Виберіть дві смужки" diff --git a/locale/po/vi.po b/locale/po/vi.po index ecb28fcde22..cf6be3cbaef 100644 --- a/locale/po/vi.po +++ b/locale/po/vi.po @@ -1,21 +1,22 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" -"PO-Revision-Date: 2022-08-19 12:33+0700\n" -"Last-Translator: HỒ NHỰT CHÂU \n" -"Language-Team: Tỉnh An Giang, Đình Bình Phú\n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" +"PO-Revision-Date: 2023-12-09 16:14+0000\n" +"Last-Translator: Hoang Duy Tran \n" +"Language-Team: Vietnamese \n" "Language: vi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.6.9" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.0.1" msgid "Shader AOV" -msgstr "AOV Bộ Tô Sắc" +msgstr "AOV của Bộ Tô Bóng" msgid "Valid" @@ -23,7 +24,7 @@ msgstr "Hợp Lệ" msgid "Is the name of the AOV conflicting" -msgstr "Tên của AOV có mâu thuẫn hay không" +msgstr "Tên biến số AOV có xung khắc hay không" msgid "Name" @@ -31,11 +32,11 @@ msgstr "Tên" msgid "Name of the AOV" -msgstr "Tên của AOV" +msgstr "Tên của biến số AOV" msgid "Type" -msgstr "Kiểu" +msgstr "Thể Loại" msgid "Data type of the AOV" @@ -43,7 +44,7 @@ msgstr "Kiểu dữ liệu của AOV" msgid "Color" -msgstr "Màu" +msgstr "Màu Sắc" msgid "Value" @@ -51,19 +52,19 @@ msgstr "Giá Trị" msgid "List of AOVs" -msgstr "Danh sách AOV" +msgstr "Danh Sách các Biến Số AOV" msgid "Collection of AOVs" -msgstr "Sưu tập AOV" +msgstr "Bộ Sưu Tập các Biến Số AOV" msgid "Action F-Curves" -msgstr "Cong-F Hành Động" +msgstr "Đường Cong-F của Hành Động" msgid "Collection of action F-Curves" -msgstr "Sưu tập Cong-F hành động" +msgstr "Bộ sưu tập các Đường Cong-F của hành động" msgid "Action Group" @@ -71,123 +72,123 @@ msgstr "Nhóm Hành Động" msgid "Groups of F-Curves" -msgstr "Các Nhóm Cong-F" +msgstr "Các Nhóm Đường Cong-F" msgid "Channels" -msgstr "Các Kênh" +msgstr "Kênh" msgid "F-Curves in this group" -msgstr "Các Cong F trong nhóm này" +msgstr "Các Đường Cong-F trong nhóm này" msgid "Color Set" -msgstr "Tập Màu Sắc" +msgstr "Bộ Màu Sắc" msgid "Custom color set to use" -msgstr "Tập màu sắc tùy chọn để sử dụng" +msgstr "Bộ màu tùy chỉnh để sử dụng" msgid "Default Colors" -msgstr "Màu Sắc Mặc Định" +msgstr "Màu Mặc Định" msgid "01 - Theme Color Set" -msgstr "01 - Tập Phong Cách Màu Sắc" +msgstr "01 - Bộ Màu Kiểu Mẫu" msgid "02 - Theme Color Set" -msgstr "02 - Tập Phong Cách Màu Sắc" +msgstr "02 - Bộ Màu Kiểu Mẫu" msgid "03 - Theme Color Set" -msgstr "03 - Tập Phong Cách Màu Sắc" +msgstr "03 - Bộ Màu Kiểu Mẫu" msgid "04 - Theme Color Set" -msgstr "04 - Tập Phong Cách Màu Sắc" +msgstr "04 - Bộ Màu Kiểu Mẫu" msgid "05 - Theme Color Set" -msgstr "05 - Tập Phong Cách Màu Sắc" +msgstr "05 - Bộ Màu Kiểu Mẫu" msgid "06 - Theme Color Set" -msgstr "06 - Tập Phong Cách Màu Sắc" +msgstr "06 - Bộ Màu Kiểu Mẫu" msgid "07 - Theme Color Set" -msgstr "07 - Tập Phong Cách Màu Sắc" +msgstr "07 - Bộ Màu Kiểu Mẫu" msgid "08 - Theme Color Set" -msgstr "08 - Tập Phong Cách Màu Sắc" +msgstr "08 - Bộ Màu Kiểu Mẫu" msgid "09 - Theme Color Set" -msgstr "09 - Tập Phong Cách Màu Sắc" +msgstr "09 - Bộ Màu Kiểu Mẫu" msgid "10 - Theme Color Set" -msgstr "10 - Tập Phong Cách Màu Sắc" +msgstr "10 - Bộ Màu Kiểu Mẫu" msgid "11 - Theme Color Set" -msgstr "11 - Tập Phong Cách Màu Sắc" +msgstr "11 - Bộ Màu Kiểu Mẫu" msgid "12 - Theme Color Set" -msgstr "12 - Tập Phong Cách Màu Sắc" +msgstr "12 - Bộ Màu Kiểu Mẫu" msgid "13 - Theme Color Set" -msgstr "13 - Tập Phong Cách Màu" +msgstr "13 - Bộ Màu Kiểu Mẫu" msgid "14 - Theme Color Set" -msgstr "14 - Tập Phong Cách Màu Sắc" +msgstr "14 - Bộ Màu Kiểu Mẫu" msgid "15 - Theme Color Set" -msgstr "15 - Tập Phong Cách Màu Sắc" +msgstr "15 - Bộ Màu Kiểu Mẫu" msgid "16 - Theme Color Set" -msgstr "16 - Tập Phong Cách Màu Sắc" +msgstr "16 - Bộ Màu Kiểu Mẫu" msgid "17 - Theme Color Set" -msgstr "17 - Tập Phong Cách Màu Sắc" +msgstr "17 - Bộ Màu Kiểu Mẫu" msgid "18 - Theme Color Set" -msgstr "18 - Tập Phong Cách Màu Sắc" +msgstr "18 - Bộ Màu Kiểu Mẫu" msgid "19 - Theme Color Set" -msgstr "19 - Tập Phong Cách Màu Sắc" +msgstr "19 - Bộ Màu Kiểu Mẫu" msgid "20 - Theme Color Set" -msgstr "20 - Tập Phong Cách Màu Sắc" +msgstr "20 - Bộ Màu Kiểu Mẫu" msgid "Custom Color Set" -msgstr "Tập Màu Sắc Tùy Chọn" +msgstr "Bộ Màu Tùy Chỉnh" msgid "Colors" -msgstr "Các Màu Sắc" +msgstr "Màu Sắc" msgid "Copy of the colors associated with the group's color set" -msgstr "Bản sao của tập màu sắc liên quan với màu sắc của nhóm" +msgstr "Bản sao các màu có liên quan đến bộ màu của nhóm" msgid "Color set is user-defined instead of a fixed theme color set" -msgstr "Tập màu sắc là người dùng được xác định thay thế một tập phong cách màu nhất định" +msgstr "Bộ màu là do người dùng định nghĩa, thay vì Bộ Màu Kiểu Mẫu sắp đặt sẵn" msgid "Lock" @@ -195,43 +196,43 @@ msgstr "Khóa" msgid "Action group is locked" -msgstr "Nhóm hành động bị khóa" +msgstr "Nhóm hành động đã bị khóa lại" msgid "Mute" -msgstr "Cắt Tiếng" +msgstr "Tắt/Chặn/Giải Hoạt" msgid "Action group is muted" -msgstr "Nhóm hành động bị tắt tiếng" +msgstr "Nhóm hành động đã giải hoạt (tắt)" msgid "Select" -msgstr "Chọn" +msgstr "Lựa Chọn" msgid "Action group is selected" -msgstr "Nhóm hành động được chọn" +msgstr "Nhóm hành động đã được chọn" msgid "Expanded" -msgstr "Được Mở Rộng" +msgstr "Mở Rộng" msgid "Action group is expanded except in graph editor" -msgstr "Nhóm hành động được mở rộng trừ trong trình biên soạn biểu đồ" +msgstr "Nhóm hành động được mở rộng, ngoại trừ trong trình biên soạn đồ thị" msgid "Expanded in Graph Editor" -msgstr "Được Mở Rộng Trong Trình Biên Soạn Biểu Đồ" +msgstr "Mở Rộng trong Trình Biên Soạn Đồ Thị" msgid "Action group is expanded in graph editor" -msgstr "Nhóm hành động được mở rộng trong bộ biện tập biểu đồ" +msgstr "Nhóm hành động được mở rộng trong trình biên soạn đồ thị" msgid "Pin in Graph Editor" -msgstr "Ghìm chặc trong Trình Biên Soạn Biểu Đồ" +msgstr "Ghim trong Trình Biên Soạn Đồ Thị" msgid "Action Groups" @@ -239,51 +240,51 @@ msgstr "Các Nhóm Hành Động" msgid "Collection of action groups" -msgstr "Sưu tập nhóm hành động" +msgstr "Bộ sưu tập các nhóm hành động" msgid "Action Pose Markers" -msgstr "Ký Hiệu Dạng Đứng Hành Động" +msgstr "Các Dấu Mốc Tư Thế của Hành Động" msgid "Collection of timeline markers" -msgstr "Sưu tập ký hiệu thời biểu" +msgstr "Bộ sưu tập các dấu mốc trên lịch trình thời gian" msgid "Active Pose Marker" -msgstr "Ký Hiệu Dạng Đứng Hoạt Động" +msgstr "Dấu Mốc Tư Thế đang Hoạt Động" msgid "Active pose marker for this action" -msgstr "Ký hiệu dạng đứng hoạt động cho hành động này" +msgstr "Dấu mốc tư thế đang hoạt động cho hành động này" msgid "Active Pose Marker Index" -msgstr "Chỉ Số Ký Hiệu Dạng Đứng Hoạt Động" +msgstr "Chỉ Số của Dấu Mốc Tư Thế đang Hoạt Động" msgid "Index of active pose marker" -msgstr "Chỉ số của ký hiệu dạng đứng hoạt động" +msgstr "Chỉ số của dấu mốc tư thế đang hoạt động" msgid "Add-on" -msgstr "Đồ Kèm" +msgstr "Trình Bổ Sung" msgid "Python add-ons to be loaded automatically" -msgstr "Các đồ kèm Python được nhập tự động" +msgstr "Chương trình bổ sung Python sẽ được nạp tự động" msgid "Module" -msgstr "Mô Đun" +msgstr "Mô-Đun" msgid "Module name" -msgstr "Tân mô đun" +msgstr "Tên mô-đun" msgid "Add-on Preferences" -msgstr "Tùy Chọn Đồ Kèm" +msgstr "Cài Đặt Sở Thích Trình Bổ Sung" msgid "Password" @@ -291,47 +292,103 @@ msgstr "Mật Khẩu" msgid "E-mail address" -msgstr "Địa chỉ thư điện thử" +msgstr "Địa chỉ thư điện tử" msgid "Error Message" -msgstr "Tin Nhắn Sai Lầm" +msgstr "Thông Điệp Báo Lỗi" msgid "Message" -msgstr "Tin Nhắn" +msgstr "Thông Điệp" msgid "Compute Device Type" -msgstr "Loại Thiết Bị Tính" +msgstr "Loại Thiết Bị Tính Toán" msgid "Device to use for computation (rendering with Cycles)" -msgstr "Thiết bị nào để sử dụng cho tính toán (khi dùng Cycles kết xuất ảnh)" +msgstr "Thiết bị dùng để tính toán (kết xuất với Cycles)" + + +msgid "Kernel Optimization" +msgstr "Tối Ưu Hóa Hạt Nhân" + + +msgid "Kernels can be optimized based on scene content. Optimized kernels are requested at the start of a render. If optimized kernels are not available, rendering will proceed using generic kernels until the optimized set is available in the cache. This can result in additional CPU usage for a brief time (tens of seconds)" +msgstr "Các hạt nhân có thể được tối ưu hóa dựa trên nội dung cảnh. Khi khởi đầu kết xuất thì các hạt nhân tối ưu hóa được đề nghị. Nếu không có hạt nhân tối ưu hóa nào để sử dụng thì quá trình kết xuất sẽ tiếp tục bằng cách sử dụng hạt nhân chung cho đến khi bộ tối ưu hóa có sẵn để sử dụng trong bộ nhớ đệm. Việc này có thể dẫn đến khả năng sử dụng nhiều thêm CPU trong một thời gian ngắn (hàng chục giây đồng hồ)" msgid "Off" msgstr "Tắt" +msgid "Disable kernel optimization. Slowest rendering, no extra background CPU usage" +msgstr "Tắt tối ưu hóa hạt nhân. Kết xuất chậm nhất, song không sử dụng thêm CPU ở đằng sau" + + +msgid "Intersection only" +msgstr "Duy giao cắt" + + +msgid "Optimize only intersection kernels. Faster rendering, negligible extra background CPU usage" +msgstr "Chỉ tối ưu hóa các hạt nhân giao cắt nhau. Kết xuất nhanh hơn, có sử dụng CPU ở đằng sau song rất ít, không đáng kể" + + msgid "Full" -msgstr "Đầy" +msgstr "Toàn Phần" + + +msgid "Optimize all kernels. Fastest rendering, may result in extra background CPU usage" +msgstr "Tối ưu hóa toàn bộ các hạt nhân. Kết xuất nhanh nhất, song có thể dẫn đến việc sử dụng CPU ở đằng sau nhiều hơn" + + +msgid "MetalRT for ray tracing uses less memory for scenes which use curves extensively, and can give better performance in specific cases" +msgstr "MetalRT cho dò tia. Sử dụng ít bộ nhớ hơn cho các cảnh dùng nhiều đường cong và có thể mang lại hiệu suất tốt hơn trong các trường hợp cụ thể" + + +msgid "Disable MetalRT (uses BVH2 layout for intersection queries)" +msgstr "Tắt MetalRT (sử dụng bố trí BVH2 cho các truy vấn giao cắt)" msgid "On" -msgstr "Mở" +msgstr "Bật" + + +msgid "Enable MetalRT for intersection queries" +msgstr "Bật MetalRT cho truy vấn giao cắt" msgid "Auto" msgstr "Tự Động" +msgid "Automatically pick the fastest intersection method" +msgstr "Tự động chọn phương pháp giao cắt nhanh nhất" + + msgid "Distribute memory across devices" -msgstr "Phân phối bộ nhớ giữa các thiết bị" +msgstr "Phân bổ bộ nhớ trên các thiết bị" msgid "Make more room for large scenes to fit by distributing memory across interconnected devices (e.g. via NVLink) rather than duplicating it" -msgstr "Cho chỗ chứa vừa đủ cho cảnh lớn bằng phân phối bộ nhớ giữa các thiết bị được liên kết với nhau (ví dụ bằng NVLink) thay thế sao chép nó" +msgstr "Tạo thêm không gian cho các cảnh lớn khít vừa vặn bằng cách phân phối bộ nhớ trên các thiết bị được kết nối với nhau (ví dụ: qua NVLink) thay vì sao chép nó" + + +msgid "HIP RT (Experimental)" +msgstr "HIP RT (Thử nghiệm)" + + +msgid "HIP RT enables AMD hardware ray tracing on RDNA2 and above, with shader fallback on older cards. This feature is experimental and some scenes may render incorrectly" +msgstr "HIP RT cho phép dò tia phần cứng AMD trên RDNA2 và từ đó trở lên, với tính năng tô bóng dự phòng trên các thẻ cũ hơn. Tính năng này đang được thử nghiệm và một số cảnh có thể sẽ hiển thị không chính xác" + + +msgid "Embree on GPU" +msgstr "Embree trên GPU" + + +msgid "Embree on GPU enables the use of hardware ray tracing on Intel GPUs, providing better overall performance" +msgstr "Embree trên GPU cho phép sử dụng phương pháp dò tia phần cứng trên GPU Intel, mang lại hiệu suất tổng thể tốt hơn" msgid "KHR_materials_variants_ui" @@ -339,19 +396,27 @@ msgstr "giaoDiện_biếnThể_vậtLiệu_KHR" msgid "Displays glTF UI to manage material variants" -msgstr "Hiển thị giao diện glTF để quản lý biến thể vật liệu" +msgstr "Hiển thị giao diện người dùng glTF để quản lý các biến thể của nguyên vật liệu" + + +msgid "Display glTF UI to manage animations" +msgstr "Hiển thị giao diện người dùng glTF để quản lý các hoạt họa" msgid "Displays glTF Material Output node in Shader Editor (Menu Add > Output)" -msgstr "Hiển thị giao điểm Ngõ Ra Vật Liệu glTF trong Bộ Biện Tâp Bộ Tô Sắc (Danh Bạ Thêm > Ngõ Ra)" +msgstr "Hiển thị nút Đầu Ra Nguyên Vật Liệu glTF trong trình đơn Trình Biên Soạn Bộ Tô Bóng (Trình đơn Thêm > Đầu Ra)" msgid "Fribidi Library" msgstr "Thư Viện Fribidi" +msgid "The FriBidi C compiled library (.so under Linux, .dll under windows...), you’ll likely have to edit it if you’re under Windows, e.g. using the one included in Blender libraries repository" +msgstr "Thư viện FriBidi được biên dịch trong ngôn ngữ C (.so trong Linux, .dll trong windows...), bạn có thể sẽ phải chỉnh sửa nó nếu bạn đang sử dụng Windows, ví dụ: dùng cái được kèm trong kho thư viện Blender" + + msgid "Translation Root" -msgstr "Rễ Phiên Dịch" +msgstr "Gốc Phiên Dịch" msgid "The bf-translation repository" @@ -359,59 +424,59 @@ msgstr "Kho bf-translation" msgid "Import Paths" -msgstr "Nhập Đường Dẫn" +msgstr "Đường Dẫn Nhập Khẩu" msgid "Additional paths to add to sys.path (';' separated)" -msgstr "Thêm đường dẫn têp để kèm với sys.path (dùng ';' để cách li)" +msgstr "Các đường dẫn khác để kèm vào sys.path (dùng dấu ';' để tách biệt chúng)" msgid "Source Root" -msgstr "Rẻ Mã Nguồn" +msgstr "Gốc Mã Nguồn" msgid "The Blender source root path" -msgstr "Đường dẫn rễ mã nguồn của Blender" +msgstr "Đường dẫn đến gốc mã nguồn của Blender" msgid "Spell Cache" -msgstr "Kho Đấng Vần" +msgstr "Bộ Nhớ Đệm Đánh Vần" msgid "A cache storing validated msgids, to avoid re-spellchecking them" -msgstr "Một đệm chứa cho giữ mã msgid được kiểm tra để tránh đánh vần chúng nó lại" +msgstr "Bộ nhớ đệm lưu trữ các msgid đã kiểm chứng về tính hợp lệ, để tránh phải đánh vần chúng lại" msgid "Warn Msgid Not Capitalized" -msgstr "Cảnh Cáo: Mã Tin Nhắn Không Có Chữ Hoa" +msgstr "Cảnh Báo Msgid Chưa được Viết Hoa" msgid "Warn about messages not starting by a capitalized letter (with a few allowed exceptions!)" -msgstr "Cảnh cáo về tin nhắn là ký tự đầu không phải là chữ hoa (chỉ có vài trường hợp ngoại lệ!)" +msgstr "Cảnh báo về những thông điệp không bắt đầu bằng chữ hoa (có vài trường hợp ngoại lệ là được phép!)" msgid "Persistent Data Path" -msgstr "Đườnd Dẫn Dữ Liệu Cố Chấp" +msgstr "Đường Dẫn của Dữ Liệu Ổn Định" msgid "The name of a json file storing those settings (unfortunately, Blender's system does not work here)" -msgstr "Tên của tập tin json lưu các cài đặt đó (nhưng hệ thống của Blender không hoạt động ở đây)" +msgstr "Tên của tập tin json lưu các giá trị sắp đặt ở trên (rất không may, hệ thống Blender không hoạt động ở đây)" msgid "User Add-ons" -msgstr "Đồ Kèm Người Dùng" +msgstr "Trình Bổ Sung của Người Dùng" msgid "Collection of add-ons" -msgstr "Sưu tập các đồ kèm" +msgstr "Bộ sưu tập các trình bổ sung" msgid "Animation Data" -msgstr "Dữ Liệu Hoạt Hình" +msgstr "Dữ Liệu Hoạt Họa" msgid "Animation data for data-block" -msgstr "Dữ liệu hoạt hình cho cục dữ liệu" +msgstr "Dữ liệu hoạt họa cho khối dữ liệu" msgid "Action" @@ -419,7 +484,7 @@ msgstr "Hành Động" msgid "Active Action for this data-block" -msgstr "Hành Động Hoạt Động cho cục dữ liệu này" +msgstr "Hành Động đang Hoạt Động cho khối dữ liệu này" msgid "Action Blending" @@ -427,7 +492,7 @@ msgstr "Pha Trộn Hành Động" msgid "Method used for combining Active Action's result with result of NLA stack" -msgstr "Phương pháp để pha trộn kết qủa Hành Động Hoạt Động với kết qủa của chồng NLA" +msgstr "Phương pháp kết hợp kết quả của các Hành Động đang Hoạt Động với kết quả của ngăn xếp NLA" msgid "Replace" @@ -435,31 +500,31 @@ msgstr "Thay Thế" msgid "The strip values replace the accumulated results by amount specified by influence" -msgstr "Giá trị của đoạn sẽ thay thế kết qủa được góp bằng mức được xác định bằng sự ảnh hưởng" +msgstr "Các giá trị của dải phim thay thế các kết quả tích lũy bằng lượng chỉ định bởi ảnh hưởng" msgid "Combine" -msgstr "Gồm" +msgstr "Kết Hợp" msgid "The strip values are combined with accumulated results by appropriately using addition, multiplication, or quaternion math, based on channel type" -msgstr "Giá trị đoạn được gồm với kết qủa tích trữ bằng sử dụng phép cộng, nhân, hay toán quaternion tùy loại kênh" +msgstr "Các giá trị của dải được kết hợp với những kết quả đã tích tụ thông qua cách sử dụng các phép tính cộng, nhân, hoặc Quatenion thích hợp, dựa trên thể loại của kênh" msgid "Add" -msgstr "Cộng" +msgstr "Thêm" msgid "Weighted result of strip is added to the accumulated results" -msgstr "Kết qủa có quyền lượng của đoạn ảnh được cộng với kết qủa được góp lại" +msgstr "Kết quả cân trọng của dải phim sẽ được cộng vào các kết quả đã tích tụ" msgid "Subtract" -msgstr "Trừ" +msgstr "Khấu Trừ" msgid "Weighted result of strip is removed from the accumulated results" -msgstr "Kết qủa có quyền lượng của dãy ảnh được trừ từ kết qủa được góp lại" +msgstr "Kết quả cân trọng của dải phim sẽ được khấu trừ khỏi kết quả đã tích tụ" msgid "Multiply" @@ -467,23 +532,23 @@ msgstr "Nhân" msgid "Weighted result of strip is multiplied with the accumulated results" -msgstr "Kết qủa có quyền lượng của dãy ảnh được nhân với kết qủa được góp lại" +msgstr "Kết quả cân trọng của dải phim sẽ được nhân với các kết quả đã tích tụ" msgid "Action Extrapolation" -msgstr "Suy Ngoại Hành Động" +msgstr "Ngoại Suy" msgid "Action to take for gaps past the Active Action's range (when evaluating with NLA)" -msgstr "Hành động để làm cho cách trống ra ngoài phạm vi của Hành Động Hoạt Động (khi tính toán với NLA)" +msgstr "Hành động để thi hành tại các khoảng trống bên ngoài phạm vi của Hành Động đang hoạt động (khi ước tính bằng NLA)" msgid "Nothing" -msgstr "Không có" +msgstr "Không" msgid "Strip has no influence past its extents" -msgstr "Dãy ảnh không ảnh hưởng gì ra ngoải phạm vi của nó" +msgstr "Dải phim sẽ không gây ảnh hưởng gì bên ngoài phạm vi của nó" msgid "Hold" @@ -491,23 +556,31 @@ msgstr "Giữ" msgid "Hold the first frame if no previous strips in track, and always hold last frame" -msgstr "Giữ bức ảnh đầu tiên nếu không có dãy ảnh trước ở trong rãnh, và luôn luôn giữ ảnh cuối" +msgstr "Giữ khung hình đầu tiên, nếu không có dải nào nằm trước trên rãnh, và luôn luôn giữ khung hình cuối" msgid "Hold Forward" -msgstr "Giữ Tới" +msgstr "Giữ Phía Trước" msgid "Only hold last frame" -msgstr "Chỉ giữ bức ảnh cuối cùng" +msgstr "Chỉ giữ khung hình cuối mà thôi" msgid "Action Influence" -msgstr "Sự Ảnh Hưởng Hành Động" +msgstr "Ảnh Hưởng của Hành Động" msgid "Amount the Active Action contributes to the result of the NLA stack" -msgstr "Mớc độ Hành Động Hoạt Động góp phần đến kết quả xếp đống của NLA" +msgstr "Mức đóng góp của Hành Động đang Hoạt Động vào kết quả của ngăn xếp NLA" + + +msgid "Tweak Mode Action Storage" +msgstr "Chế Độ Tinh Chỉnh: Kho Lưu Trữ Hành Động" + + +msgid "Slot to temporarily hold the main action while in tweak mode" +msgstr "Khe để tạm thời giữ hành động chính trong khi ở chế độ tinh chỉnh" msgid "Drivers" @@ -515,7 +588,7 @@ msgstr "Điều Vận" msgid "The Drivers/Expressions for this data-block" -msgstr "Điều Vận/Biểu Thức cho cục dữ liệu này" +msgstr "Điều Vận/Biểu Thức cho khối dữ liệu này" msgid "NLA Tracks" @@ -523,59 +596,59 @@ msgstr "Rãnh NLA" msgid "NLA Tracks (i.e. Animation Layers)" -msgstr "Các Rãnh NLA (ví dụ các Lớp Hoạt Hình)" +msgstr "Những rãnh NLA (ví dụ: các Tầng Lớp Hoạt Họa)" msgid "NLA Evaluation Enabled" -msgstr "Tính Toán NLA Được Bật" +msgstr "Sử Dụng Ước Tính NLA" msgid "NLA stack is evaluated when evaluating this block" -msgstr "Chồng NLA được tính toán khi đang tính toán cục này" +msgstr "Ngăn xếp NLA được ước tính khi đánh giá khối này" msgid "Use NLA Tweak Mode" -msgstr "Dùng Chế Độ Chỉnh NLA" +msgstr "Dùng Chế Độ Hiệu Chỉnh NLA" msgid "Whether to enable or disable tweak mode in NLA" -msgstr "Bật hay tắt chế độ chỉnh sửa trong NLA" +msgstr "Bật/Tắt chế độ hiệu chỉnh NLA" msgid "Collection of Driver F-Curves" -msgstr "Sưu Tập Cong-F Dắt" +msgstr "Bộ Sưu Tập các Đường Cong-F Điều Vận" msgid "Animation Visualization" -msgstr "Sự Hiển Thị Hoạt Hình" +msgstr "Hình Dung Hoạt Họa" msgid "Settings for the visualization of motion" -msgstr "Cài đặt cho sự hiển thị của chuyển động" +msgstr "Sắp đặt dành cho diễn họa chuyển động" msgid "Motion Paths" -msgstr "Đường Di Chuyển" +msgstr "Đường Chuyển Động" msgid "Motion Path settings for visualization" -msgstr "Cài đặt Đường Di Chuyển cho sự hiển thị" +msgstr "Sắp đặt của Đường Chuyển Động trong việc diễn họa" msgid "Motion Path Settings" -msgstr "Cài Đặt Đường Di Chuyển" +msgstr "Sắp Đặt Đường Chuyển Động" msgid "Motion Path settings for animation visualization" -msgstr "Cài đặt Đường Di Chuyển cho sự hiển thị hoạt hình" +msgstr "Sắp đặt Đường Chuyển Động cho quá trình diễn họa hoạt họa" msgid "Bake Location" -msgstr "Nướng Vị Trí" +msgstr "Vị Trí Nướng" msgid "When calculating Bone Paths, use Head or Tips" -msgstr "Khi tính Đương Dẫn Xương, sử dụng Đầu hay Đuôi" +msgstr "Khi tính toán Đường Chuyển Động của Xương, dùng Đầu hoặc các Đỉnh" msgid "Heads" @@ -583,7 +656,7 @@ msgstr "Đầu" msgid "Calculate bone paths from heads" -msgstr "Tính đường dẫn xương từ đầu" +msgstr "Tính các đường chuyển động của xương từ các đầu" msgid "Tails" @@ -591,135 +664,143 @@ msgstr "Đuôi" msgid "Calculate bone paths from tails" -msgstr "Tính đường dẫn xương từ đuôi" +msgstr "Tính đường chuyển động của xương từ các đuôi" msgid "After Current" -msgstr "Sau Hiện Tại" +msgstr "Sau Khung Hiện Tại" msgid "Number of frames to show after the current frame (only for 'Around Current Frame' Onion-skinning method)" -msgstr "Số lượng bức ảnh để hiện sau bức ảnh hiện tại (chỉ cho phương pháp bóng ma 'Quanh Bức Ảnh Hiện Tại')" +msgstr "Số khung hình sẽ hiển thị sau khung hiện tại (chỉ dành cho phương pháp Bóc Vỏ Hành 'Quanh Khung Hình Hiện Tại' mà thôi)" msgid "Before Current" -msgstr "Trước Hiện Tại" +msgstr "Trước Khung Hiện Tại" msgid "Number of frames to show before the current frame (only for 'Around Current Frame' Onion-skinning method)" -msgstr "Số lượng bức ảnh để hiện trước bức ảnh hiện tại (chỉ cho phương pháp bóng ma 'Quanh Bức Ảnh Hiện Tại')" +msgstr "Số khung phim sẽ hiển thị trước khung hiện tại (chỉ dành cho phương pháp Bóc Vỏ Hành 'Quanh Khung Hình Hiện Tại' mà thôi)" msgid "End Frame" -msgstr "Bức Ảnh Cuối" +msgstr "Khung Hình Cuối" msgid "End frame of range of paths to display/calculate (not for 'Around Current Frame' Onion-skinning method)" -msgstr "Số bức ảnh cuối trong phạm vi để hiển thị/tính toán (không phải cho phương pháp bóng ma 'Quanh Bức Ảnh Hiện Tại')" +msgstr "Phạm vi khung hình kết thúc của các đường dẫn để hiển thị/tính toán (không dành cho phương pháp Bóc Vỏ Hành 'Quanh Khung Hình Hiện Tại')" msgid "Start Frame" -msgstr "Bức Ảnh Đầu" +msgstr "Khung Hình Đầu" msgid "Starting frame of range of paths to display/calculate (not for 'Around Current Frame' Onion-skinning method)" -msgstr "Số bức ảnh đầu trong phạm vi để hiển thị/tính toán (không phải cho bóng ma 'Quanh Bức Ảnh Hiện Tại')" +msgstr "Phạm vi khung phim đầu tiên của các đường dẫn để hiển thị/tính toán (không dành cho phương pháp Bóc Vỏ Hành 'Quanh Khung Hình Hiện Tại')" msgid "Frame Step" -msgstr "Bước Bức Ảnh" +msgstr "Số Bước Khung Hình" msgid "Number of frames between paths shown (not for 'On Keyframes' Onion-skinning method)" -msgstr "Số lượng bức ảnh giữa các đường được hiện (không phải cho phương pháp bóng ma 'Tại Bức Ảnh Mẫu')" +msgstr "Số khung hình giữa các đường dẫn đang hiển thị (không dành cho phương pháp Bóc Vỏ Hành 'Tại Khung Khóa')" msgid "Has Motion Paths" -msgstr "Có Đường Di Chuyển" +msgstr "Có Đường Chuyển Động" msgid "Are there any bone paths that will need updating (read-only)" -msgstr "Có đường xương nào cần nên cấp (chỉ đọc được)" +msgstr "Có đường chuyển động của xương nào cần phải cập nhật không (chỉ đọc mà thôi)" msgid "Paths Range" -msgstr "Phạm Vi Đường Chuyển Động" +msgstr "Phạm Vi Đường Dẫn" msgid "Type of range to calculate for Motion Paths" -msgstr "Loại phạm vi để tính cho Đường Di Chuyển" +msgstr "Thể loại phạm vi để tính toán cho các Đường Chuyển Động" msgid "All Keys" -msgstr "Hết Bức Ảnh Mẫu" +msgstr "Toàn Bộ các Khung Khóa" msgid "From the first keyframe to the last" -msgstr "Từ bức ảnh mẫu đầu tiên đến bức ảnh mẫu cuối" +msgstr "Từ khung khóa đầu tiên đến khung khóa cuối cùng" msgid "Selected Keys" -msgstr "Bức Ảnh Mẫu Được Chọn" +msgstr "Các Khung Khóa được Chọn" msgid "From the first selected keyframe to the last" -msgstr "Từ bức ảnh mẫu đầu tiên được chọn đến bức ảnh mẫu cuối" +msgstr "Từ khung khóa được chọn đầu tiên đến khung khóa cuối cùng" msgid "Scene Frame Range" -msgstr "Phạm Vi Bức Ảnh Cảnh" +msgstr "Phạm Vi Khung Hình của Cảnh" msgid "The entire Scene / Preview range" -msgstr "Toàn bộ phạm vi Cảnh/Dự Khán" +msgstr "Toàn bộ phạm vi Cảnh / Xem Trước" + + +msgid "Manual Range" +msgstr "Đặt Phạm Vi Thủ Công" + + +msgid "Manually determined frame range" +msgstr "Xác định phạm vi khung hình một cách thủ công" msgid "Show Frame Numbers" -msgstr "Hiện Số Bức Ảnh" +msgstr "Hiện Số Khung Hình" msgid "Show frame numbers on Motion Paths" -msgstr "Hiện số bức ảnh trên Đường Di Chuyển" +msgstr "Hiện số khung hình trên các Đường Chuyển Động" msgid "All Action Keyframes" -msgstr "Hết Bức Ảnh Mẫu Hành Động" +msgstr "Toàn Bộ các Khung Khóa của Hành Động" msgid "For bone motion paths, search whole Action for keyframes instead of in group with matching name only (is slower)" -msgstr "Cho đường di chuyển của xương, tìm kiếm toàn bộ Hành Động cho bức ảnh mẫu thay thế chỉ trong nhóm cùng tên (chậm hơn)" +msgstr "Đối với các đường chuyển động của xương, lùng toàn bộ Hành Động để tìm các khung khóa, thay vì chỉ trong nhóm có tên xứng khớp mà thôi (chậm hơn)" msgid "Highlight Keyframes" -msgstr "Nổi Bật Bức Ảnh Mẫu" +msgstr "Nêu Bật các Khung Khóa" msgid "Emphasize position of keyframes on Motion Paths" -msgstr "Tô sáng vị trí của các bức ảnh mẫu trên Đường Di Chuyển" +msgstr "Nhấn mạnh vị trí của những khung khóa trên các Đường Chuyển Động" msgid "Show Keyframe Numbers" -msgstr "Hiện Số Bức Ảnh Mẫu" +msgstr "Hiển Thị Số Khung Khóa" msgid "Show frame numbers of Keyframes on Motion Paths" -msgstr "Hiện số bức ảnh của Bức Ảnh Mẫu trên Đường Di Chuyển" +msgstr "Hiển thị số khung hình của các Khung Khóa trên Đường Chuyển Động" msgid "Paths Type" -msgstr "Loại Đường" +msgstr "Loại Đường Chuyển Động" msgid "Type of range to show for Motion Paths" -msgstr "Loại phạm vi để hiện cho Đường Di Chuyển" +msgstr "Loại phạm vi để hiển thị các Đường Chuyển Động" msgid "Around Frame" -msgstr "Quanh Bức Ảnh" +msgstr "Quanh Khung Phim" msgid "Display Paths of poses within a fixed number of frames around the current frame" -msgstr "Hiển thị Đường của dạng đứng trong một số bức ảnh không đổi được xác định quanh bức ảnh hiện tại" +msgstr "Hiển thị những Đường Dẫn của các tư thế trong một số khung hình nhất định chung quanh khung hình hiện tại" msgid "In Range" @@ -727,51 +808,51 @@ msgstr "Trong Phạm Vi" msgid "Display Paths of poses within specified range" -msgstr "Hiển thị Đường của dạng đứng trong phạm vi được xác định" +msgstr "Hiển thị những Đường Chuyển Động của các tư thế trong phạm vi đã định" msgid "Any Type" -msgstr "Bất Cứ Loại Nào" +msgstr "Kiểu Bất Kỳ" msgid "RNA type used for pointers to any possible data" -msgstr "Loại RNA được sử dụng cho con chỉ đến bất cứ dữ liệu nào thì có thể có" +msgstr "Kiểu RNA sử dụng cho các con trỏ chỉ đến bất cứ dữ liệu nào" msgid "Area in a subdivided screen, containing an editor" -msgstr "Khu vực trong một màn được chia, có một trình biên soạn" +msgstr "Khu vực trong màn hình được chia nhỏ, có chứa một trình biên soạn" msgid "Height" -msgstr "Bề Cao" +msgstr "Chiều Cao" msgid "Area height" -msgstr "Bề cao khu vức" +msgstr "Chiều cao của khu vực" msgid "Regions" -msgstr "Vùng" +msgstr "Các Vùng" msgid "Regions this area is subdivided in" -msgstr "Các vùng thì khu vực này được chia" +msgstr "Những vùng mà diện tích này được phân chia ra" msgid "Show Menus" -msgstr "Hiện Danh Bạ" +msgstr "Hiển Thị Trình Đơn" msgid "Show menus in the header" -msgstr "Hiện các danh bạ trong thanh đầu" +msgstr "Hiển thị trình đơn trong thanh tiêu đề" msgid "Spaces" -msgstr "Không Gian" +msgstr "Không Gian/Dấu Cách Trống" msgid "Spaces contained in this area, the first being the active space (NOTE: Useful for example to restore a previously used 3D view space in a certain area to get the old view orientation)" -msgstr "Không gian ở trong khu vực này, thứ nhất là không gian hoạt động (LƯU Ý: Vị dụ sử dụng cho hoàn lại không gian màn 3D đã được dùng trước đây trong một khu vực nhất định để lấy lại định hướng cũ của màn đó)" +msgstr "Những không gian nằm trong khu vực này, trước tiên nhất là diện tích đang hoạt động (LƯU Ý: Có lợi trong việc phục hồi không gian góc nhìn 3D đã sử dụng trước đây, trong một khu vực nào đó, để lấy lại định hướng cũ của góc nhìn, chẳng hạn)" msgid "Editor Type" @@ -779,43 +860,43 @@ msgstr "Loại Trình Biên Soạn" msgid "Current editor type for this area" -msgstr "Loại trình biên soạn hiện tại cho khu vực này" +msgstr "Loại trình biên soạn hiện thời cho khu vực này" msgid "Empty" -msgstr "Vật Thể Rỗng" +msgstr "Đối Tượng Trống Rỗng" msgid "3D Viewport" -msgstr "Màn Chiếu 3D" +msgstr "Cổng Nhìn 3D" msgid "Manipulate objects in a 3D environment" -msgstr "Vận động vật thể trong một môi trường 3D" +msgstr "Điều khiển đối tượng trong môi trường 3D" msgid "UV/Image Editor" -msgstr "Trình Biên Soạn UV/Ảnh" +msgstr "Trình Biên Soạn UV/Hình Ảnh" msgid "View and edit images and UV Maps" -msgstr "Hiển thị và biên tập ảnh và bản đồ UV" +msgstr "Xem và biên soạn ảnh cùng Ánh Xạ UV" msgid "Node Editor" -msgstr "Trình Biên Soạn Giao Điểm" +msgstr "Trình Biên Soạn Nút" msgid "Editor for node-based shading and compositing tools" -msgstr "Trình biên soạn cho dụng cụ cơ sở giao điểm tô sắc và ghép ảnh" +msgstr "Bộ biên soạn cho các công cụ cơ sở nút về tô bóng và tổng hợp" msgid "Video Sequencer" -msgstr "Bộ Trình Tự Video" +msgstr "Trình Phối Hình" msgid "Video editing tools" -msgstr "Dụng cụ biên tập video" +msgstr "Công cụ biên soạn video" msgid "Movie Clip Editor" @@ -823,31 +904,31 @@ msgstr "Trình Biên Soạn Đoạn Phim" msgid "Motion tracking tools" -msgstr "Dụng cụ theo dõi chuyển động" +msgstr "Công cụ giám sát chuyển động" msgid "Dope Sheet" -msgstr "Bảng Hoạt Hình" +msgstr "Bảng Hành Động" msgid "Adjust timing of keyframes" -msgstr "Chỉnh nhịp của bức ảnh mẫu" +msgstr "Chỉnh thời gian của các khung khóa" msgid "Graph Editor" -msgstr "Trình Biên Soạn Biểu Đồ" +msgstr "Trình Biên Soạn Đồ Thị" msgid "Edit drivers and keyframe interpolation" -msgstr "Biên tập suy nội điều vận và bức ảnh mẫu" +msgstr "Biên soạn các điều vận và sự nội suy khung khóa" msgid "Nonlinear Animation" -msgstr "Hoạt Hình Không Bậc Một" +msgstr "Hoạt Họa Phi Tuyến Tính" msgid "Combine and layer Actions" -msgstr "Gồm và phát lớp cho Hành Động" +msgstr "Kết hợp và phân tầng các Hành Động" msgid "Text Editor" @@ -855,15 +936,15 @@ msgstr "Trình Biên Soạn Văn Bản" msgid "Edit scripts and in-file documentation" -msgstr "Biên tập văn thảo và tài liệu nội bộ tập tin" +msgstr "Soạn tập lệnh và dẫn chứng trong tập tin" msgid "Python Console" -msgstr "Diện Điều Khiển Python" +msgstr "Bàn Giao Tiếp Python" msgid "Interactive programmatic console for advanced editing and script development" -msgstr "Diện điều khiển lập trình tương tác cho biên tập và phát triển văn thảo cấp cao" +msgstr "Bàn giao tiếp lập trình tương tác để biên soạn thâm sâu và xây dựng tập lệnh" msgid "Info" @@ -871,15 +952,15 @@ msgstr "Thông Tin" msgid "Log of operations, warnings and error messages" -msgstr "Nhật ký của tương tác, cảnh báo và tin nhắn sai lầm" +msgstr "Nhật ký của các thao tác, cảnh báo và các thông điệp báo lỗi" msgid "Top Bar" -msgstr "Thanh Trên" +msgstr "Thanh Đỉnh" msgid "Global bar at the top of the screen for global per-window settings" -msgstr "Thanh toàn cầu ở phía trên màn cho cài đặt toàn cầu cho mỗi cửa sổ" +msgstr "Thanh trên đỉnh của màn hình trong sắp đặt toàn cầu của từng cửa sổ" msgid "Status Bar" @@ -887,7 +968,7 @@ msgstr "Thanh Trạng Thái" msgid "Global bar at the bottom of the screen for general status information" -msgstr "Thanh toàn cầu ở phía dưới màn cho thông tin trạng thái tổng quát" +msgstr "Thanh chứa thông tin thống kê chung nằm ở đáy của màn hình, hiện diện toàn cầu" msgid "Outliner" @@ -895,15 +976,15 @@ msgstr "Mục Lục" msgid "Overview of scene graph and all available data-blocks" -msgstr "Hiển thị toàn biểu đồ cảnh và hết cục dữ liệu có thể dùng" +msgstr "Khái quát cấu trúc dữ liệu và toàn bộ các khối dữ liệu có sẵn" msgid "Properties" -msgstr "Đặc Tính" +msgstr "Tính Chất" msgid "Edit properties of active object and related data-blocks" -msgstr "Biên tập đặc tính của vật thể hoạt động và cục dữ liệu liên hệ" +msgstr "Biên soạn tính chất của đối tượng hoạt động và các khối dữ liệu liên quan" msgid "File Browser" @@ -911,11 +992,11 @@ msgstr "Trình Duyệt Tập Tin" msgid "Browse for files and assets" -msgstr "Trình duyệt tập tin và tích sản" +msgstr "Duyệt các tập tin và tài sản" msgid "Spreadsheet" -msgstr "Bảnh Tính" +msgstr "Bảng Tính" msgid "Explore geometry data in a table" @@ -923,115 +1004,119 @@ msgstr "Tham khảo hình dạng trong một bảng" msgid "Preferences" -msgstr "Tùy Chọn" +msgstr "Cài Đặt Sở Thích" msgid "Edit persistent configuration settings" -msgstr "Biên tập cài đặc cấu hình cố chấp" +msgstr "Biên soạn các cài đặt cấu hình ổn định" msgid "Width" -msgstr "Bề Rộng" +msgstr "Chiều Rộng" msgid "Area width" -msgstr "Bề rộng khu vực" +msgstr "Chiều rộng diện tích" msgid "X Position" -msgstr "Vị Tri X" +msgstr "Vị Trí X" msgid "The window relative vertical location of the area" -msgstr "Vị trí dọc của khu vực tương đối với cửa sổ" +msgstr "Vị trí dựng đứng tương đối của cửa sổ với diện tích" msgid "Y Position" -msgstr "Vị Tri Y" +msgstr "Vị Trí Y" msgid "The window relative horizontal location of the area" -msgstr "Vị trí ngang của khu vực tương đối với cửa sổ" +msgstr "Vị trí ngang tương đối của cửa sổ với diện tích" msgid "Area Spaces" -msgstr "Không Gian Khu Vực" +msgstr "Các Không Gian của Diện Tích" msgid "Collection of spaces" -msgstr "Sưu tập không gian" +msgstr "Bộ sưu tập các không gian" msgid "Active Space" -msgstr "Không Gian Hoạt Động" +msgstr "Không Gian đang Hoạt Động" msgid "Space currently being displayed in this area" -msgstr "Không gian đang được hiển thị trong khu vực này" +msgstr "Không gian đang được hiển thị trong diện tích này" msgid "Armature Bones" -msgstr "Xương Cốt" +msgstr "Xương của Khung Cốt" msgid "Collection of armature bones" -msgstr "Sưu tập xương cốt" +msgstr "Bộ sưu tập các xương của khung cốt" msgid "Active Bone" -msgstr "Xương Hoạt Động" +msgstr "Xương đang Hoạt Động" msgid "Armature's active bone" -msgstr "Xương hoạt động của cốt" +msgstr "Xương đang hoạt động của khung cốt" msgid "Armature Deform Constraint Targets" -msgstr "Mục Tiêu Ràng Buộc Méo Hóa Cốt" +msgstr "Đích của Ràng Buộc Biến Dạng Khung Cốt" msgid "Collection of target bones and weights" -msgstr "Sưu tập của các xương và quyền lượng mục tiêu" +msgstr "Bộ sưu tập các xương và trọng lượng đích" msgid "Armature EditBones" -msgstr "Xương Biên Tập Cốt" +msgstr "Xương Soạn Khung Cốt" msgid "Collection of armature edit bones" -msgstr "Sưu tập các xương tập cốt" +msgstr "Bộ sưu tập các xương biên soạn của khung cốt" msgid "Active EditBone" -msgstr "Xương Biên Tập Hoạt Động" +msgstr "Xương Biên Soạn đang Hoạt Động" msgid "Armatures active edit bone" -msgstr "Xương biên tập hoạt động cua cốt" +msgstr "Xương biên soạn đang hoạt động của khung cốt" + + +msgid "Catalog Path" +msgstr "Đường Dẫn Danh Mục" msgid "Asset Library Reference" -msgstr "Tham Chiếu Thư Viện Tích Sản" +msgstr "Tham Chiếu Thư Viện Tài Sản" msgid "Identifier to refer to the asset library" -msgstr "Định danh cho tham chiếu đến thư viện tích sản" +msgstr "Định danh của thư viện tài sản" msgid "Asset Data" -msgstr "Dữ Liệu Tích Sản" +msgstr "Dữ Liệu Tài Sản" msgid "Additional data stored for an asset data-block" -msgstr "Dữ liệu thêm được chứa cho một cục dữ liệu tích sản" +msgstr "Dữ liệu bổ sung cho một khối dữ liệu-tài sản được lưu lại" msgid "Active Tag" -msgstr "Thẻ Hoạt Động" +msgstr "Dấu Nhãn đang Hoạt Động" msgid "Index of the tag set for editing" -msgstr "Chỉ số của thẻ để biên tập" +msgstr "Chỉ số của dấu nhãn sẽ biên soạn" msgid "Author" @@ -1039,43 +1124,88 @@ msgstr "Tác Giả" msgid "Name of the creator of the asset" -msgstr "Tn của người chế tạo tích sản" +msgstr "Tên của người kiến tạo tài sản" msgid "Catalog UUID" -msgstr "UUID Danh Mục" +msgstr "UUID của Danh mục" msgid "Identifier for the asset's catalog, used by Blender to look up the asset's catalog path. Must be a UUID according to RFC4122" -msgstr "Phải có một UUID theo quy định RFC4122" +msgstr "Định danh cho danh mục của tài sản, được Blender sử dụng để tra cứu đường dẫn danh mục của tài sản. Nhất định phải là UUID (Universally Unique IDentifiers: Định danh duy nhất toàn cầu), chiểu theo RFC4122" msgid "Catalog Simple Name" -msgstr "Tên Đơn Giản Của Danh Mục" +msgstr "Tên Đơn Giản của Danh Mục" msgid "Simple name of the asset's catalog, for debugging and data recovery purposes" -msgstr "Tên đơn giản cho danh mục của tích sản, cho sửa lỗi lầm và lý do hoàn lại dữ liệu" +msgstr "Tên đơn giản của danh mục tài sản, dành cho mục đích gỡ lỗi và phục hồi dữ liệu" msgid "Copyright" msgstr "Bản Quyền" +msgid "Copyright notice for this asset. An empty copyright notice does not necessarily indicate that this is copyright-free. Contact the author if any clarification is needed" +msgstr "Thông báo bản quyền cho nội dung này. Thông báo bản quyền trống không nhất thiết chỉ ra rằng cái này không có bản quyền. Liên hệ với tác giả nếu cần làm rõ vấn đề" + + msgid "Description" -msgstr "Chính Tả" +msgstr "Miêu Tả" msgid "A description of the asset to be displayed for the user" -msgstr "Mô tả của tích sản để hiện cho người dùng" +msgstr "Miêu tả của tài sản để cho người dùng đọc" + + +msgid "License" +msgstr "Giấy Phép" + + +msgid "The type of license this asset is distributed under. An empty license name does not necessarily indicate that this is free of licensing terms. Contact the author if any clarification is needed" +msgstr "Thể loại giấy phép mà tài sản này được phân phối theo. Tên giấy phép trống không nhất thiết chỉ ra rằng cái này không có điều khoản cấp phép. Liên hệ với tác giả nếu cần làm rõ vấn đề" msgid "Tags" -msgstr "Các Thẻ" +msgstr "Dấu nhãn" msgid "Custom tags (name tokens) for the asset, used for filtering and general asset management" -msgstr "Thẻ tùy chọn (mã danh) cho tích sản, được dùng cho bộ lọc và quản lý tích sản tổng quát" +msgstr "Dấu nhãn tùy chỉnh (danh hiệu) của tài sản, sử dụng để thanh lọc và quản lý tài sản nói chung" + + +msgid "Asset Representation" +msgstr "Đại Diện Tài Sản" + + +msgid "Information about an entity that makes it possible for the asset system to deal with the entity as asset" +msgstr "Thông tin về một thực thể giúp hệ thống tài sản có thể xử lý thực thể đó như một tài sản" + + +msgid "Full Library Path" +msgstr "Đường Dẫn Thư Viện Đầy Đủ" + + +msgid "Absolute path to the .blend file containing this asset" +msgstr "Đường dẫn tuyệt đối đến tập tin .blend chứa tài sản này" + + +msgid "Full Path" +msgstr "Đường Dẫn Đầy Đủ" + + +msgid "Absolute path to the .blend file containing this asset extended with the path of the asset inside the file" +msgstr "Đường dẫn tuyệt đối đến tập tin .blend chứa tài sản này mở rộng với đường dẫn của nội dung nội bên trong tập tin" + + +msgctxt "ID" +msgid "Data-block Type" +msgstr "Thể Loại Khối Dữ Liệu" + + +msgid "The type of the data-block, if the asset represents one ('NONE' otherwise)" +msgstr "Kiểu khối dữ liệu, nếu nội dung đại diện cho một kiểu nào đó (‘NONE' (KHÔNG CÓ) nếu ngược lại)" msgctxt "ID" @@ -1085,17 +1215,17 @@ msgstr "Hành Động" msgctxt "ID" msgid "Armature" -msgstr "Cốt" +msgstr "Khung Cốt" msgctxt "ID" msgid "Brush" -msgstr "Bút" +msgstr "Đầu Bút" msgctxt "ID" msgid "Cache File" -msgstr "Tập Tin Đệm Chứa" +msgstr "Tập Tin Bộ Nhớ Đệm" msgctxt "ID" @@ -1105,7 +1235,7 @@ msgstr "Máy Quay Phim" msgctxt "ID" msgid "Collection" -msgstr "Sưu Tập" +msgstr "Bộ Sưu Tập" msgctxt "ID" @@ -1125,17 +1255,17 @@ msgstr "Phông" msgctxt "ID" msgid "Grease Pencil" -msgstr "Bút Sáp" +msgstr "Bút Chì Dầu" msgctxt "ID" msgid "Image" -msgstr "Ảnh" +msgstr "Hình Ảnh" msgctxt "ID" msgid "Key" -msgstr "Phím" +msgstr "Khóa" msgctxt "ID" @@ -1150,32 +1280,32 @@ msgstr "Thư Viện" msgctxt "ID" msgid "Light" -msgstr "Đèn" +msgstr "Nguồn/Ánh Sáng/Đèn" msgctxt "ID" msgid "Light Probe" -msgstr "Quang Kế" +msgstr "Dò Ánh Sáng" msgctxt "ID" msgid "Line Style" -msgstr "Phong Cách Nét" +msgstr "Phong Cách Đường Nét" msgctxt "ID" msgid "Mask" -msgstr "Mặt Nạ" +msgstr "Màn Chắn Lọc" msgctxt "ID" msgid "Material" -msgstr "Vật Liệu" +msgstr "Nguyên Vật Liệu" msgctxt "ID" msgid "Mesh" -msgstr "Mạng Lưới" +msgstr "Khung Lưới" msgctxt "ID" @@ -1185,17 +1315,17 @@ msgstr "Siêu Cầu" msgctxt "ID" msgid "Movie Clip" -msgstr "Khúc Phim" +msgstr "Đoạn Phim" msgctxt "ID" msgid "Node Tree" -msgstr "Cây Giao Điểm" +msgstr "Cây Nút" msgctxt "ID" msgid "Object" -msgstr "Vật Thể" +msgstr "Đối Tượng" msgctxt "ID" @@ -1205,7 +1335,7 @@ msgstr "Đường Cong Sơn" msgctxt "ID" msgid "Palette" -msgstr "Bảng" +msgstr "Bảng Pha Màu" msgctxt "ID" @@ -1215,7 +1345,7 @@ msgstr "Hạt" msgctxt "ID" msgid "Point Cloud" -msgstr "Điểm Mây" +msgstr "Mây Điểm Chấm" msgctxt "ID" @@ -1250,12 +1380,12 @@ msgstr "Thể Tích" msgctxt "ID" msgid "Window Manager" -msgstr "Bộ Quản Lý Cửa Sổ" +msgstr "Trình Quản Lý Cửa Sổ" msgctxt "ID" msgid "Workspace" -msgstr "Công Trường" +msgstr "Không Gian Làm Việc" msgctxt "ID" @@ -1264,71 +1394,127 @@ msgstr "Thế Giới" msgid "The local data-block this asset represents; only valid if that is a data-block in this file" -msgstr "; chỉ hợp lệ cho nếu cái này là cục dữ liệu trong tập tin nà" +msgstr "Khối dữ liệu cục bộ mà tài sản này đại diện cho nó; chỉ hợp lệ nếu đó là khối dữ liệu trong tập tin này mà thôi" msgid "Asset Metadata" -msgstr "Dữ Liệu Tích Sản" +msgstr "Siêu Dữ Liệu của Tài Sản" + + +msgid "Additional information about the asset" +msgstr "Thông tin bổ sung về tài sản" + + +msgid "Asset Shelf" +msgstr "Kệ để Tài Sản" + + +msgid "Regions for quick access to assets" +msgstr "Các vùng để truy cập nhanh vào tài sản" msgid "Asset Library" -msgstr "Thư Viện Tích Sản" +msgstr "Thư Viện Tài Sản" + + +msgid "Choose the asset library to display assets from" +msgstr "Chọn thư viện tài sản để hiển thị các tài sản từ đó" msgid "All" -msgstr "Tất Cả" +msgstr "Toàn Bộ" msgid "Current File" -msgstr "Tập Tin Hiện Tại" +msgstr "Tập tin hiện tại" + + +msgid "Essentials" +msgstr "Cốt Yếu" msgid "Custom" -msgstr "Tùy Chọn" +msgstr "Tùy Chỉnh" msgid "ID Name" msgstr "Tên ID" +msgid "If this is set, the asset gets a custom ID, otherwise it takes the name of the class used to define the menu (for example, if the class name is \"OBJECT_AST_hello\", and bl_idname is not set by the script, then bl_idname = \"OBJECT_AST_hello\")" +msgstr "Nếu chức năng này được bật thì tài sản sẽ nhận được ID tùy chỉnh, nếu không, tài sản sẽ lấy tên của lớp (class) vốn sử dụng để xác định trình đơn (ví dụ: nếu tên lớp (class) là \"OBJECT_AST_hello\" và bl_idname không được tập lệnh đặt thì bl_idname sẽ là “OBJECT_AST_hello”)" + + msgid "Options" -msgstr "Tùy Chọn" +msgstr "Các Tùy Chọn" + + +msgid "Options for this asset shelf type" +msgstr "Tùy chọn cho thể loại giá kệ cho tài sản này" + + +msgid "No Asset Dragging" +msgstr "Không Kéo Rê Tài Sản" + + +msgid "Disable the default asset dragging on drag events. Useful for implementing custom dragging via custom key-map items" +msgstr "Tắt tính năng kéo rê tài sản mặc định trên các sự kiện kéo rê. Hữu ích cho việc triển khai thao tác kéo rê tùy chỉnh thông qua các bố trí bàn phím tự đặt" msgid "Space Type" -msgstr "Loại Dấu Cách" +msgstr "Thể Loại Không Gian" + + +msgid "The space where the asset shelf is going to be used in" +msgstr "Không gian mà giá kệ tài sản sẽ được sử dụng ở trong đó" + + +msgid "Preview Size" +msgstr "Kích Thước Xem Trước" + + +msgid "Size of the asset preview thumbnails in pixels" +msgstr "Kích thước của hình thu nhỏ xem trước tài sản tính bằng điểm ảnh" msgid "Display Filter" -msgstr "Hiển Thị Bộ Lọc" +msgstr "Thanh Lọc Hiển Thị" + + +msgid "Filter assets by name" +msgstr "Thanh lọc tài sản theo tên" msgid "Show Names" -msgstr "Hiện Tên" +msgstr "Hiển Thị Tên" + + +msgid "Show the asset name together with the preview. Otherwise only the preview will be visible" +msgstr "Hiển thị tên tài sản cùng với bản xem trước. Nếu không thì chỉ có bản xem trước là sẽ được hiển thị mà thôi" msgid "Asset Tag" -msgstr "Nhẵn Thẻ" +msgstr "Dấu Nhãn Tài Sản" msgid "User defined tag (name token)" -msgstr "Thẻ người dùng được chỉ định (mã danh)" +msgstr "Dấu nhãn do người dùng định nghĩa (danh hiệu)" msgid "The identifier that makes up this tag" -msgstr "Mã nhận danh để chế tạo thẻ này" +msgstr "Định danh được sử dụng để tạo nên dấu nhãn này" msgid "Asset Tags" -msgstr "Thẻ Tích Sản" +msgstr "Dấu Nhãn Tài Sản" msgid "Collection of custom asset tags" -msgstr "Sưu tập thẻ tích sản tùy chọn" +msgstr "Bộ sưu tập bộ dấu nhãn tài sản tùy chỉnh" msgid "Geometry attribute" -msgstr "Đặc điểm hình dạng" +msgstr "Thuộc tính hình học" msgid "Data Type" @@ -1336,7 +1522,7 @@ msgstr "Kiểu Dữ Liệu" msgid "Type of data stored in attribute" -msgstr "Loại dữ liệu trong đặc điểm" +msgstr "Kiểu dữ liệu lưu trữ trong thuộc tính" msgid "Float" @@ -1344,27 +1530,27 @@ msgstr "Số Thật" msgid "Floating-point value" -msgstr "Giá trị dấu phẩy động" +msgstr "Giá trị số thực" msgid "Integer" -msgstr "Số nguyên" +msgstr "Số Nguyên" msgid "32-bit integer" -msgstr "Số nguyên 32 bit" +msgstr "Số nguyên 32-bit" msgid "Vector" -msgstr "Vectơ" +msgstr "Véctơ" msgid "3D vector with floating-point values" -msgstr "Vectơ 3D dùng giá trị dấu phẩy động" +msgstr "Véctơ 3D trong các giá trị dấu phẩy động" msgid "RGBA color with 32-bit floating-point values" -msgstr "Màu RGBA giá trị số thật dấu phẩy động 32 bit" +msgstr "Màu RGBA với các giá trị số thực 32-bit" msgid "Byte Color" @@ -1372,15 +1558,15 @@ msgstr "Màu Byte" msgid "RGBA color with 8-bit positive integer values" -msgstr "Màu RGBA có giá trị số nguyên dương 8-bit" +msgstr "Màu RGBA với các giá trị nguyên dương 8 bit" msgid "String" -msgstr "Xâu" +msgstr "Chuỗi Ký Tự/String" msgid "Text string" -msgstr "Xâu Văn Bản" +msgstr "Chuỗi văn bản" msgid "Boolean" @@ -1388,27 +1574,39 @@ msgstr "Bool" msgid "True or false" -msgstr "Đúng hoặc sai" +msgstr "Đúng/Thật hoặc Sai/Giả" msgid "2D Vector" -msgstr "Vectơ 2D" +msgstr "Véctơ 2D" msgid "2D vector with floating-point values" -msgstr "Vectơ 2D dùng giá trị dấu phẩy động" +msgstr "Véctơ 2D với các giá trị số thực" msgid "8-Bit Integer" -msgstr "Số Nguyên 8 Bit" +msgstr "8-Bit Integer (Số Nguyên)" msgid "Smaller integer with a range from -128 to 127" -msgstr "Số nguyên nhỏ hơn có phạm vi giá trị từ -128 đến 127" +msgstr "Số nguyên với phạm vi nhỏ hơn từ -128 đến 127 mà thôi" + + +msgid "2D Integer Vector" +msgstr "Véctơ Số Nguyên 2D" + + +msgid "32-bit signed integer vector" +msgstr "Véctơ số nguyên có dấu 32 bit" msgid "Quaternion" -msgstr "Quaternion" +msgstr "Quatenion" + + +msgid "Floating point quaternion rotation" +msgstr "Phép xoay chiều quaternion dấu phẩy động" msgid "Domain" @@ -1416,15 +1614,15 @@ msgstr "Phạm Vi" msgid "Domain of the Attribute" -msgstr "Phạm vi của đặc điểm" +msgstr "Phạm Vi của Thuộc Tính" msgid "Point" -msgstr "Điểm" +msgstr "Điểm/Chấm" msgid "Attribute on point" -msgstr "Đặc điểm trên điểm" +msgstr "Thuộc tính về điểm" msgid "Edge" @@ -1432,7 +1630,7 @@ msgstr "Cạnh" msgid "Attribute on mesh edge" -msgstr "Đặc điểm trên cạnh mạng lưới" +msgstr "Thuộc tính về cạnh khung lưới" msgid "Face" @@ -1440,15 +1638,15 @@ msgstr "Mặt" msgid "Attribute on mesh faces" -msgstr "Đặc điểm trên mặt mạng lưới" +msgstr "Thuộc tính về các mặt khung lưới" msgid "Face Corner" -msgstr "Góc Giác Mặt" +msgstr "Góc Mặt" msgid "Attribute on mesh face corner" -msgstr "Đặc điểm trên góc giác của mặt mạng lưới" +msgstr "Thuộc tính về góc Mặt của khung lưới" msgid "Spline" @@ -1456,7 +1654,7 @@ msgstr "Mẫu Cong" msgid "Attribute on spline" -msgstr "Đặc điểm trên mẫu cong" +msgstr "Thuộc tính về chốt trục" msgid "Instance" @@ -1464,11 +1662,11 @@ msgstr "Thực Thể" msgid "Attribute on instance" -msgstr "Đặc điểm trên thực thể" +msgstr "Thuộc tính về thực thể" msgid "Layer" -msgstr "Lớp" +msgstr "Tầng Lớp" msgid "Is Internal" @@ -1476,135 +1674,171 @@ msgstr "Là Nội Bộ" msgid "The attribute is meant for internal use by Blender" -msgstr "Đặc điểm sử dụng cho nội bộ của Blender" +msgstr "Thuộc tính chỉ dành cho Blender sử dụng nội bộ mà thôi" + + +msgid "Is Required" +msgstr "Đòi Hỏi" + + +msgid "Whether the attribute can be removed or renamed" +msgstr "Liệu thuộc tính có thể xóa đi hoặc đổi tên được hay không" msgid "Name of the Attribute" -msgstr "Tên của đặc điểm" +msgstr "Tên của Thuộc Tính" msgid "Bool Attribute" -msgstr "Đặc Điểm Bool" +msgstr "Thuộc Tính Lôgic Bool" msgid "Geometry attribute that stores booleans" -msgstr "Đặc điểm hình dạng cho chứa giá trị bool" +msgstr "Thuộc tính hình học lưu trữ các boolean" msgid "Byte Color Attribute" -msgstr "Đặc Điểm Màu Byte" +msgstr "Thuộc Tính Màu của Byte" msgid "Geometry attribute that stores RGBA colors as positive integer values using 8-bits per channel" -msgstr "Đặc điểm hình dạng cho chứa màu sắc RGBA bằng giá trị dương số nguyên sử dụng 8 bit" +msgstr "Thuộc tính hình học lưu trữ màu RGBA dưới dạng giá trị nguyên dương sử dụng 8 bit trên mỗi kênh" msgid "8-bit Integer Attribute" -msgstr "Đặc Điểm Số Nguyên 8 bit" +msgstr "Thuộc Tính Số Nguyên 8 bit" msgid "Geometry attribute that stores 8-bit integers" -msgstr "Hình dạng đặc điểm chứa số nguyên 8 bit" +msgstr "Thuộc tính hình học lưu trữ các số nguyên 8-bit" msgid "Float2 Attribute" -msgstr "Đặc Điểm 2 Số Dấu Phẩy Động" +msgstr "Thuộc Tính Float2" msgid "Geometry attribute that stores floating-point 2D vectors" -msgstr "Đặc điểm hình dạng cho chứa vectơ 2D dấu phẩy động" +msgstr "Thuộc tính hình học lưu trữ các véctơ số thực 2D" msgid "Float Attribute" -msgstr "Đặc Điểm Dấu Phẩy Động" +msgstr "Thuộc Tính Float" msgid "Geometry attribute that stores floating-point values" -msgstr "Đặc điểm hình dạng cho chứa giá trị dấu phẩy động" +msgstr "Thuộc tính hình học lưu trữ các giá trị số thực" msgid "Float Color Attribute" -msgstr "Đặc Điểm Màu Dấu Phẩy Động" +msgstr "Thuộc Tính Màu Float" msgid "Geometry attribute that stores RGBA colors as floating-point values using 32-bits per channel" -msgstr "Đặc điểm hình dạng cho chứa màu sắc RGBA bằng dấu phẩy động sử dụng 32 bit từng kênh" +msgstr "Thuộc tính hình học lưu trữ màu RGBA dưới dạng giá trị dấu phẩy động sử dụng 32 bit trên mỗi kênh" msgid "Float Vector Attribute" -msgstr "Đặc Điểm Vectơ Dấu Phẩy" +msgstr "Thuộc Tính Véctơ Float" msgid "Geometry attribute that stores floating-point 3D vectors" -msgstr "Đặc điểm hình dạng cho chứa vectơ 3D dấu phẩy động" +msgstr "Thuộc tính hình học lưu trữ vectơ 3D số thực" + + +msgid "2D Integer Vector Attribute" +msgstr "Thuộc Tính Véctơ Số Nguyên 2D" + + +msgid "Geometry attribute that stores 2D integer vectors" +msgstr "Thuộc tính hình học lưu trữ các véctơ số nguyên 2D" msgid "Integer Attribute" -msgstr "Đặc Điểm Số Nguyên" +msgstr "Thuộc Tính Integer" msgid "Geometry attribute that stores integer values" -msgstr "Đặc điểm hình dạng cho chứa giá trị dấu phẩy động" +msgstr "Thuộc tính hình học lưu trữ các giá trị số nguyên" + + +msgid "Quaternion Attribute" +msgstr "Thuộc Tính Quaternion" + + +msgid "Geometry attribute that stores rotation" +msgstr "Thuộc tính hình học lưu trữ xoay chiều" msgid "String Attribute" -msgstr "Đặc Điểm Xâu" +msgstr "Thuộc Tính String" msgid "Geometry attribute that stores strings" -msgstr "Đặc điểm hình dạng cho chứa xâu" +msgstr "Thuộc tính hình học lưu trữ các chuỗi ký tự" msgid "Attribute Group" -msgstr "Nhóm Đặc Điểm" +msgstr "Nhóm Thuộc Tính" msgid "Group of geometry attributes" -msgstr "Nhóm đặc điểm hình dạng" +msgstr "Nhóm các thuộc tính hình học" msgid "Active Attribute" -msgstr "Đặc Điểm Hoạt Động" +msgstr "Thuộc Tính đang Hoạt Động" msgid "Active attribute" -msgstr "Đặc điểm hoạt động" +msgstr "Thuộc tính đang hoạt động" msgid "Active Color" -msgstr "Màu Sắc Hoạt Động" +msgstr "Màu đang Sử Dụng" msgid "Active color attribute for display and editing" -msgstr "Đặc điểm màu sắc hoạt động cho hiển thị và biên tập" +msgstr "Thuộc tính màu đang hoạt động hòng để hiển thị và chỉnh sửa" msgid "Active Color Index" -msgstr "Chỉ Số Màu Sắc Hoạt Động" +msgstr "Chỉ Số Màu đang Hoạt Động" msgid "Active color attribute index" -msgstr "Chỉ số đặc điểm màu sắc hoạt động" +msgstr "Chỉ số của thuộc tính màu đang hoạt động" msgid "Active Color Attribute" -msgstr "Đặc Điểm Màu Hoạt Động" +msgstr "Thuộc Tính Màu đang Hoạt Động" + + +msgid "The name of the active color attribute for display and editing" +msgstr "Tên của thuộc tính màu hoạt động để hiển thị và biên soạn" msgid "Active Attribute Index" -msgstr "Chỉ Số Đặc Điểm Hoạt Động" +msgstr "Chỉ Số của Thuộc Tính đang Hoạt Động" msgid "Active attribute index" -msgstr "Chỉ số đặc điểm hoạt động" +msgstr "Chỉ số của thuộc tính đang hoạt động" + + +msgid "Default Color Attribute" +msgstr "Thuộc Tính Màu Mặc Định" + + +msgid "The name of the default color attribute used as a fallback for rendering" +msgstr "Tên của thuộc tính màu mặc định sử dụng làm dự phòng cho kết xuất" msgid "Active Render Color Index" -msgstr "Chỉ Số Màu Kết Xuất Hoạt Động" +msgstr "Chỉ Số Màu Kết Xuất đang Hoạt Động" msgid "The index of the color attribute used as a fallback for rendering" -msgstr "Chỉ số của đặc điểm màu sắc sử dụng cho kết xuất dự phòng" +msgstr "Chỉ số của thuộc tính màu dự phòng cho kết xuất" msgid "Bake Data" @@ -1612,39 +1846,39 @@ msgstr "Nướng Dữ Liệu" msgid "Bake data for a Scene data-block" -msgstr "Nướng dữ liệu cho một cục dữ liệu Cảnh" +msgstr "Dữ liệu nướng cho một khối dữ liệu Cảnh" msgid "Cage Extrusion" -msgstr "Kéo Ra Lồng" +msgstr "Đẩy Trồi Khung Lồng" msgid "Inflate the active object by the specified distance for baking. This helps matching to points nearer to the outside of the selected object meshes" -msgstr "Phình to vật thể hoạt động bằng chỉ định khoảng cách cho nướng. Cái này giúp tìm điểm hợp gần hơn bề mặt ngoài của các mạng lưới được chọn" +msgstr "Thổi phồng đối tượng đang hoạt động lên bằng khoảng cách nướng đã chỉ định. Điều này giúp cho việc khớp với các điểm nằm gần bên ngoài các khung lưới đối tượng đã được chọn" msgid "Cage Object" -msgstr "Lồng Thể" +msgstr "Đối Tượng Khung Lồng" msgid "Object to use as cage instead of calculating the cage from the active object with cage extrusion" -msgstr "Vật thể để dùng làm lồng thay thế tính lồng từ vật thể hoạt động bằng sự kéo ra lồng" +msgstr "Đối tượng để dùng làm khung lồng, thay vì tính toán khung lồng từ đối tượng hoạt động với sự đẩy trồi" msgid "File Path" -msgstr "Đường Đẫn Tập Tin" +msgstr "Tập Tin" msgid "Image filepath to use when saving externally" -msgstr "Đường dẫn tập tin ảnh để dùng khi lưu ở ngoài" +msgstr "Đường dẫn cho tập tin hình ảnh khi lưu ra" msgid "Vertical dimension of the baking map" -msgstr "Cơ thước chiều dọc của bản đồ nướng" +msgstr "Cỡ chiều dọc của ánh xạ nướng" msgid "Image Format" -msgstr "Định Dạng Ảnh" +msgstr "Định Dạng Hình Ảnh" msgid "Margin" @@ -1652,39 +1886,39 @@ msgstr "Lề" msgid "Extends the baked result as a post process filter" -msgstr "Đem kết qủa nướng thành bộ lọc sau qúa trình" +msgstr "Thi hành nới lề kết quả nướng như một bộ thanh lọc trong quá trình hậu kỳ xử lý" msgid "Margin Type" -msgstr "Loại Lề" +msgstr "Thể Loại Lề" msgid "Algorithm to extend the baked result" -msgstr "Giải thuật cho mở rộng kết qủa nướng" +msgstr "Thuật toán mở rộng kết quả nướng" msgid "Adjacent Faces" -msgstr "Mặt Kề" +msgstr "Các Mặt Kề Cạnh" msgid "Use pixels from adjacent faces across UV seams" -msgstr "Dùng điểm ảnh từ các mặt kề qua vết sẹo UV" +msgstr "Sử dụng các điểm ảnh từ các mặt kề cạnh đường khâu UV" msgid "Extend" -msgstr "Kéo Ra" +msgstr "Nới/Mở Rộng" msgid "Extend border pixels outwards" -msgstr "Kéo điểm ảnh của biên giới ra ngoài" +msgstr "Mở rộng các điểm ảnh ở đường viền ra phía bên ngoài" msgid "Max Ray Distance" -msgstr "Khoảng Cách Tia Cực Đại" +msgstr "Khoảng Cách Tối Đa cho Tia Xạ" msgid "The maximum ray distance for matching points between the active and selected objects. If zero, there is no limit" -msgstr "Khoảng cách tia cực đại cho tìm điểm hợp nhau giữa vật thể hoạt động và được chọn. Nếu đặt không, nó không có giới hạn" +msgstr "Khoảng cách tia xạ tối đa cho quá trình so sánh các điểm giữa các đối tượng đang hoạt động và các đối tượng được chọn. Nếu là 0 thì có nghĩa là không có giới hạn" msgid "Normal Space" @@ -1692,7 +1926,7 @@ msgstr "Không Gian Pháp Tuyến" msgid "Axis to bake in blue channel" -msgstr "Trục để nướng trong kênh màu xanh" +msgstr "Trục để nướng trong kênh màu lam" msgid "+X" @@ -1732,11 +1966,11 @@ msgstr "Chọn không gian pháp tuyến để nướng" msgid "Object" -msgstr "Vật Thể" +msgstr "Đối Tượng" msgid "Bake the normals in object space" -msgstr "Nướng các pháp tuyến trong không gian vật thể" +msgstr "Nướng các pháp tuyến trong không gian đối tượng" msgid "Tangent" @@ -1748,11 +1982,11 @@ msgstr "Nướng các pháp tuyến trong không gian tiếp tuyến" msgid "Pass Filter" -msgstr "Bộ Lọc Vòng" +msgstr "Thanh Lọc Lượt" msgid "Passes to include in the active baking pass" -msgstr "Gồm vòng nào trong vòng nướng hoạt động" +msgstr "Các lượt sử dụng trong lượt nướng đang hoạt động" msgid "None" @@ -1760,11 +1994,11 @@ msgstr "Không Có" msgid "Emit" -msgstr "Phát" +msgstr "Phát Xạ" msgid "Direct" -msgstr "Thực Tiếp" +msgstr "Trực Tiếp" msgid "Indirect" @@ -1772,15 +2006,15 @@ msgstr "Gián Tiếp" msgid "Diffuse" -msgstr "Tán Xạ" +msgstr "Khuếch Tán" msgid "Glossy" -msgstr "Bóng Loáng" +msgstr "Bóng Bẩy" msgid "Transmission" -msgstr "Truyền" +msgstr "Truyền Xạ" msgid "Save Mode" @@ -1788,7 +2022,7 @@ msgstr "Chế Độ Lưu" msgid "Where to save baked image textures" -msgstr "Chỗ để lưu ảnh chất liệu được nướng " +msgstr "Nơi lưu các chất liệu hình ảnh đã nướng" msgid "Internal" @@ -1796,15 +2030,15 @@ msgstr "Nội Bộ" msgid "Save the baking map in an internal image data-block" -msgstr "Lưu bản đồ nướng ở trong một cục dữ liệu ảnh nội bộ" +msgstr "Lưu ánh xạ nướng ở trong khối dữ liệu của hình ảnh" msgid "External" -msgstr "Ngoài" +msgstr "Bên Ngoài" msgid "Save the baking map in an external file" -msgstr "Lưu bản đồ nướng ở trong một tập tin ở ngoài" +msgstr "Lưu ánh xạ nướng ở tập tin bên ngoài" msgid "Target" @@ -1812,111 +2046,131 @@ msgstr "Mục Tiêu" msgid "Where to output the baked map" -msgstr "Chỗ để xuất bản đồ được nướng" +msgstr "Nơi cho xuất kết quả ánh xạ đã nướng ra" msgid "Image Textures" -msgstr "Chất Liệu Ảnh" +msgstr "Chất Liệu Hình Ảnh" msgid "Bake to image data-blocks associated with active image texture nodes in materials" -msgstr "Nướng vào cục dữ liệu ảnh liên quan với giao điểm chất liệu ảnh đang hoạt động trong vật liệu" +msgstr "Nướng thành các khối dữ liệu liên quan tới các nút chất liệu hình ảnh đang hoạt động trong nguyên vật liệu" msgid "Bake to the active color attribute on meshes" -msgstr "Nướng vào đặc điểm màu hoạt động trên các mạng lưới" +msgstr "Nướng thuộc tính màu đang hoạt động trên các khung lưới" msgid "Automatic Name" -msgstr "Tên Tự Động" +msgstr "Đặt Tên Tự Động" msgid "Automatically name the output file with the pass type (external only)" -msgstr "Dùng loại vòng kết xuất để tự động tặng tên của tập tin xuất (chỉ cho ngoài)" +msgstr "Tự động đặt tên cho tập tin lưu bằng tên của thể loại lượt thi hành (chỉ bên ngoài thôi)" msgid "Cage" -msgstr "Lồng" +msgstr "Khung Lồng" msgid "Cast rays to active object from a cage" -msgstr "Phát tia từ một lồng đến vật thể hoạt ộng" +msgstr "Phóng tia xạ từ khung lồng đến đối tượng đang hoạt động" msgid "Clear" -msgstr "Xóa" +msgstr "Xóa/Dọn Sạch" msgid "Clear Images before baking (internal only)" -msgstr "Xóa Ảnh trước khi nướng (chỉ cho nội bộ)" +msgstr "Xóa các Hình Ảnh trước khi nướng (chỉ dùng cho chế độ nội bộ)" msgid "Color the pass" -msgstr "Tô màu vòng này" +msgstr "Tô màu hành trình" msgid "Add diffuse contribution" -msgstr "Góp thêm tán xạ" +msgstr "Thêm sự đóng góp của khuếch tán" msgid "Add direct lighting contribution" -msgstr "Góp thêm áng sáng trực tiếp" +msgstr "Thêm sự đóng góp của ánh sáng trực tiếp" msgid "Add emission contribution" -msgstr "Góp thêm phát xạ" +msgstr "Thêm sự đóng góp của phát xạ" msgid "Add glossy contribution" -msgstr "Góp thêm bóng loáng" +msgstr "Thêm sự đóng góp của độ bóng bẩy" msgid "Add indirect lighting contribution" -msgstr "Góp thêm ánh sáng gián tiếp" +msgstr "Thêm sự đóng góp của ánh sáng gián tiếp" msgid "Add transmission contribution" -msgstr "Góp thêm truyền" +msgstr "Thêm sự đóng góp của sự truyền sóng" msgid "Selected to Active" -msgstr "Được chọn đến hoạt động" +msgstr "Cái được Chọn Sang cái đang Hoạt Động" msgid "Bake shading on the surface of selected objects to the active object" -msgstr "Nướng tô sắc bề mặt của các các vật thể được chọn đến vật thể hoạt động" +msgstr "Nướng thông tin tô bóng trên bề mặt của những đối tượng được chọn sang đối tượng đang hoạt động" msgid "Split Materials" -msgstr "Chẻ Vật Liệu" +msgstr "Phân Tách Nguyên Vật Liệu" msgid "Split external images per material (external only)" -msgstr "Chẻ ảnh ngoài tùy vật liệu (chỉ cho ngoại bộ)" +msgstr "Tách phân các hình ảnh từ bên ngoài ra tùy theo nguyên vật liệu (chỉ ngoại biên thôi)" + + +msgid "View From" +msgstr "Quan Sát Từ" + + +msgid "Source of reflection ray directions" +msgstr "Nguồn định hướng tia phản xạ" msgid "Above Surface" msgstr "Trên Bề Mặt" +msgid "Cast rays from above the surface" +msgstr "Bắn các tia từ trên bề mặt" + + +msgid "Active Camera" +msgstr "Máy Quay đang Hoạt Động" + + +msgid "Use the active camera's position to cast rays" +msgstr "Sử dụng vị trí của máy quay phim đang hoạt động để bắn tia" + + msgid "Horizontal dimension of the baking map" -msgstr "Cơ thước bề ngang của bản đồ nướng" +msgstr "Kích thước chiều ngang của ánh xạ nướng" msgid "Bezier Curve Point" -msgstr "Điểm Cong Bezier" +msgstr "Điểm của Đường Cong Bezier" msgid "Bezier curve point with two handles" -msgstr "Điểm cong Bezier và hai tay cầm" +msgstr "Điểm của đường cong Bezier với 2 tay cầm" msgid "Control Point" -msgstr "Điểm Kiểm Soát" +msgstr "Điểm Điều Khiển" msgid "Coordinates of the control point" -msgstr "Tọa độ của điểm kiểm soát" +msgstr "Tọa độ của điểm điều khiển" msgid "Handle 1" @@ -1928,19 +2182,19 @@ msgstr "Tọa độ của tay cầm thứ nhất" msgid "Handle 1 Type" -msgstr "Loại Tay Cầm 1" +msgstr "Kiểu Tay Cầm 1" msgid "Handle types" -msgstr "Loại Tay Cầm" +msgstr "Kiểu tay cầm" msgid "Free" -msgstr "Tự Do" +msgstr "Phóng thích/Thả/Tự Do/Miễn Phí" msgid "Aligned" -msgstr "Sắp Xếp" +msgstr "Thẳng Hàng" msgid "Handle 2" @@ -1956,27 +2210,27 @@ msgstr "Loại Tay Cầm 2" msgid "Hide" -msgstr "Ẩn" +msgstr "Ẩn Giấu" msgid "Visibility status" -msgstr "Trạng thái hiện/ẩn" +msgstr "Trạng thái của tầm nhìn" msgid "Bevel Radius" -msgstr "Bán Kính Cạnh Tròn" +msgstr "Bán Kính Bo Tròn" msgid "Radius for beveling" -msgstr "Bán kính cho cạnh tròn" +msgstr "Bán kính để bo tròn" msgid "Control Point selected" -msgstr "Điểm Kiểm Soát được chọn" +msgstr "Điểm Điều Khiển đã được chọn" msgid "Control point selection status" -msgstr "Trạng thái sự lựa chọn của điểm kiểm soát" +msgstr "Trạng thái chọn điểm điều khiển" msgid "Handle 1 selected" @@ -1992,23 +2246,23 @@ msgstr "Tay cầm 2 được chọn" msgid "Handle 2 selection status" -msgstr "Trạng thái sự lựa chọn tay cầm 2" +msgstr "Trạng thái chọn tay cầm 2" msgid "Tilt" -msgstr "Nghiêng" +msgstr "Xoay Nghiêng" msgid "Tilt in 3D View" -msgstr "Nghiêng ở trong Màn 3D" +msgstr "Độ xoay nghiêng trong Khung Nhìn 3D" msgid "Weight" -msgstr "Quyền Lượng" +msgstr "Trọng Lượng" msgid "Softbody goal weight" -msgstr "Quyền lượng mục đích của thân mềm" +msgstr "Trọng lượng mục tiêu của thân mềm" msgid "Blend-File Data" @@ -2016,7 +2270,7 @@ msgstr "Dữ Liệu Tập Tin-Blend" msgid "Main data structure representing a .blend file and all its data-blocks" -msgstr "Cấu trúc dữ liệu chánh đang đại diện cho một tập tin .blend và tất cả cục dữ liệu của nó" +msgstr "Cấu trúc dữ liệu chính biểu tả một tập tin .blend và toàn bộ các khối dữ liệu của nó" msgid "Actions" @@ -2024,31 +2278,31 @@ msgstr "Hành Động" msgid "Action data-blocks" -msgstr "Các cục dữ liệu hành động" +msgstr "Khối dữ liệu hành động" msgid "Armatures" -msgstr "Cốt" +msgstr "Khung Cốt" msgid "Armature data-blocks" -msgstr "Các cục dữ liệu cốt" +msgstr "Khối dữ liệu của khung cốt" msgid "Brushes" -msgstr "Bút" +msgstr "Đầu Bút" msgid "Brush data-blocks" -msgstr "Các cục dữ liệu bút" +msgstr "Khối dữ liệu của đầu bút" msgid "Cache Files" -msgstr "Tập Tin Đệm Chứa" +msgstr "Tập Tin Bộ Nhớ Đệm" msgid "Cache Files data-blocks" -msgstr "Các cục dữ liệu Tập Tin Đệm Chứa" +msgstr "Khối dữ liệu của các Tập Tin Bộ Nhớ Đệm" msgid "Cameras" @@ -2056,7 +2310,7 @@ msgstr "Máy Quay Phim" msgid "Camera data-blocks" -msgstr "Các cục dữ liệu máy quay phim" +msgstr "Khối dữ liệu của máy quay phim" msgid "Collections" @@ -2064,7 +2318,7 @@ msgstr "Bộ Sưu Tập" msgid "Collection data-blocks" -msgstr "Các cục dữ liệu bộ sưu tập" +msgstr "Bộ sưu tập các khối dữ liệu" msgid "Curves" @@ -2072,7 +2326,7 @@ msgstr "Đường Cong" msgid "Curve data-blocks" -msgstr "Các cục dữ liệu đường cong" +msgstr "Khối dữ liệu của đường cong" msgid "Filename" @@ -2084,15 +2338,19 @@ msgstr "Đường dẫn đến tập tin .blend" msgid "Vector Fonts" -msgstr "Phông Vectơ" +msgstr "Phông Véctơ" msgid "Vector font data-blocks" -msgstr "Các cục dữ liệu phông vectơ" +msgstr "Khối dữ liệu của phông vectơ" msgid "Grease Pencil" -msgstr "Bút Sáp" +msgstr "Bút Chì Dầu" + + +msgid "Grease Pencil data-blocks" +msgstr "Khối dữ liệu của Bút Chì Dầu" msgid "Hair Curves" @@ -2100,31 +2358,31 @@ msgstr "Đường Cong Tóc" msgid "Hair curve data-blocks" -msgstr "Các cục dữ liệu đường cong tóc" +msgstr "Khối dữ liệu đường cong tóc" msgid "Images" -msgstr "Ảnh" +msgstr "Hình Ảnh" msgid "Image data-blocks" -msgstr "Các cục dữ liệu ảnh" +msgstr "Khối dữ liệu của hình ảnh" msgid "File Has Unsaved Changes" -msgstr "Tập Tin Đang Có Sự Thay Đổi Chưa Lưu" +msgstr "Tập Tin có Thay Đổi Nhưng Chưa được Lưu" msgid "Have recent edits been saved to disk" -msgstr "Có biên tập mới gân đây đã lưu vào đĩa rồi" +msgstr "Các thay đổi gần đây đã được lưu ra đĩa hay chưa" msgid "File is Saved" -msgstr "Tập tin được lưu rồi" +msgstr "Tập Tin đã được Lưu rồi" msgid "Has the current session been saved to disk as a .blend file" -msgstr "Phiên chay hiện tại được lưu bằng tập tin .blend vào đĩa" +msgstr "Phiên hiện tại đã được lưu thành tập tin .blend trên đĩa chưa" msgid "Lattices" @@ -2132,7 +2390,7 @@ msgstr "Lưới Rào" msgid "Lattice data-blocks" -msgstr "Các cục dữ liệu lưới rào" +msgstr "Khối dữ liệu của lưới rào" msgid "Libraries" @@ -2140,55 +2398,55 @@ msgstr "Thư Viện" msgid "Library data-blocks" -msgstr "Các cục dữ liệu thư viện" +msgstr "Khối dữ liệu của thư viện" msgid "Light Probes" -msgstr "Quang Kế" +msgstr "Bộ Thăm Dò Ánh Sáng" msgid "Light Probe data-blocks" -msgstr "Các cục dữ liệu Quang Kế" +msgstr "Khối dữ liệu Thăm Dò Ánh Sáng" msgid "Lights" -msgstr "Đèn" +msgstr "Nguồn Ánh Sáng" msgid "Light data-blocks" -msgstr "Các cục dữ liệu Ánh Sáng" +msgstr "Khối dữ liệu về nguồn/ánh sáng" msgid "Line Styles" -msgstr "Phong Cách Nét" +msgstr "Phong Cách Đường Nét" msgid "Line Style data-blocks" -msgstr "Các cục dữ liệu Phong Cách Nét" +msgstr "Khối dữ liệu về Phong Cách Đường Nét" msgid "Masks" -msgstr "Mặt Nạ" +msgstr "Màn Chắn Lọc" msgid "Masks data-blocks" -msgstr "Các cục dữ liệu mặt nạ" +msgstr "Khối dữ liệu Màn Chắn Lọc" msgid "Materials" -msgstr "Vật Liệu" +msgstr "Nguyên Vật Liệu" msgid "Material data-blocks" -msgstr "Các cục dữ liệu vật liệu" +msgstr "Khối dữ liệu của nguyên vật liệu" msgid "Meshes" -msgstr "Mạng Lưới" +msgstr "Khung Lưới" msgid "Mesh data-blocks" -msgstr "Các cục dữ liệu mạng lưới" +msgstr "Khối dữ liệu của khung lưới" msgid "Metaballs" @@ -2196,7 +2454,7 @@ msgstr "Siêu Cầu" msgid "Metaball data-blocks" -msgstr "Các cục dữ liệu siêu cầu" +msgstr "Khối dữ liệu của siêu cầu" msgid "Movie Clips" @@ -2204,23 +2462,23 @@ msgstr "Đoạn Phim" msgid "Movie Clip data-blocks" -msgstr "Các cục dữ liệu đoạn phim" +msgstr "Khối dữ liệu của Đoạn Phim" msgid "Node Groups" -msgstr "Nhóm Giao Điểm" +msgstr "Nhóm Nút" msgid "Node group data-blocks" -msgstr "Các cục dữ liệu nhóm giao điểm" +msgstr "Khối dữ liệu của nhóm nút" msgid "Objects" -msgstr "Vật Thể" +msgstr "Đối Tượng" msgid "Object data-blocks" -msgstr "Các cục dữ liệu vật thể" +msgstr "Khối dữ liệu của đối tượng" msgid "Paint Curves" @@ -2228,15 +2486,15 @@ msgstr "Đường Cong Sơn" msgid "Paint Curves data-blocks" -msgstr "Các cục dữ liệu Đường Cong Sơn" +msgstr "Khối dữ liệu của các Đường Cong Sơn" msgid "Palettes" -msgstr "Bảng" +msgstr "Bảng Pha Màu" msgid "Palette data-blocks" -msgstr "Các cục dữ liệu bảng" +msgstr "Khối dữ liệu bảng pha màu" msgid "Particles" @@ -2244,15 +2502,15 @@ msgstr "Hạt" msgid "Particle data-blocks" -msgstr "Các cục dữ liệu hạt" +msgstr "Khối dữ liệu của hạt" msgid "Point Clouds" -msgstr "Mây Điểm" +msgstr "Đám Mây Điểm" msgid "Point cloud data-blocks" -msgstr "Các cục dữ liệu mây điểm" +msgstr "Khối dữ liệu về đám mây điểm" msgid "Scenes" @@ -2260,23 +2518,23 @@ msgstr "Cảnh" msgid "Scene data-blocks" -msgstr "Các cục dữ liệu cảnh" +msgstr "Khối dữ liệu của cảnh" msgid "Screens" -msgstr "Màn" +msgstr "Màn Hình" msgid "Screen data-blocks" -msgstr "Cục dữ liệu màn" +msgstr "Khối dữ liệu màn hình" msgid "Shape Keys" -msgstr "Hình Dạng Mẫu" +msgstr "Hình Mẫu" msgid "Shape Key data-blocks" -msgstr "Các cục dữ liệu Hình Dạng Mẫu" +msgstr "Khối dữ liệu của Hình Mẫu" msgid "Sounds" @@ -2284,7 +2542,7 @@ msgstr "Âm Thanh" msgid "Sound data-blocks" -msgstr "Các cục dữ liệu ăm thanh" +msgstr "Khối dữ liệu của âm thanh" msgid "Speakers" @@ -2292,7 +2550,7 @@ msgstr "Loa" msgid "Speaker data-blocks" -msgstr "Các cục dữ liệu Loa" +msgstr "Khối dữ liệu của loa" msgid "Texts" @@ -2300,7 +2558,7 @@ msgstr "Văn Bản" msgid "Text data-blocks" -msgstr "Các cục dữ liệu Văn Bản" +msgstr "Khối dữ liệu của văn bản" msgid "Textures" @@ -2308,15 +2566,15 @@ msgstr "Chất Liệu" msgid "Texture data-blocks" -msgstr "Các cục dữ liệu chất liệu" +msgstr "Khối dữ liệu của chất liệu" msgid "Use Auto-Pack" -msgstr "Dùng Gói Lại Tự Động" +msgstr "Sử Dụng Tự Động Đóng Gói" msgid "Automatically pack all external data into .blend file" -msgstr "Tự động gói tất cả dử liệu ngoài vào tập tin .blend" +msgstr "Tự động gói toàn bộ các dữ liệu bên ngoài vào trong tập tin .blend" msgid "Version" @@ -2324,31 +2582,31 @@ msgstr "Phiên Bản" msgid "File format version the .blend file was saved with" -msgstr "Phiên bản định dạng của tập tin .blend" +msgstr "Phiên bản định dạng tập tin mà bản .blend đã được lưu" msgid "Volumes" -msgstr "Các Thể Tích" +msgstr "Thể Tích" msgid "Volume data-blocks" -msgstr "Các cục dữ liệu Thể Tích" +msgstr "Khối dữ liệu về thể tích" msgid "Window Managers" -msgstr "Bộ Quản Lý Cửa Sổ" +msgstr "Trình Quản Lý Cửa Sổ" msgid "Window manager data-blocks" -msgstr "Các cục dữ liệu bộ quản lý Cửa Sổ" +msgstr "Khối dữ liệu của trình quản lý cửa sổ" msgid "Workspaces" -msgstr "Công Trường" +msgstr "Không Gian Làm Việc" msgid "Workspace data-blocks" -msgstr "Các cục dữ liệu Công Trường" +msgstr "Khối dữ liệu về Không Gian Làm Việc" msgid "Worlds" @@ -2356,303 +2614,303 @@ msgstr "Thế Giới" msgid "World data-blocks" -msgstr "Các cục dữ liệu Thế Giới" +msgstr "Khối dữ liệu của thế giới" msgid "Main Actions" -msgstr "Hành Động Chánh" +msgstr "Hành Động Chính" msgid "Collection of actions" -msgstr "Sưu tập hành động" +msgstr "Bộ sưu tập của các hành động" msgid "Main Armatures" -msgstr "Cốt Chánh" +msgstr "Khung Cốt Chính" msgid "Collection of armatures" -msgstr "Sưu tập cốt" +msgstr "Bộ sưu tập của các khung cốt" msgid "Main Brushes" -msgstr "Các Bút Chánh" +msgstr "Các Đầu Bút Chính" msgid "Collection of brushes" -msgstr "Sưu tập bút" +msgstr "Bộ sưu tập của các đầu bút" msgid "Main Cache Files" -msgstr "Tập Tin Đệm Chứa Chánh" +msgstr "Bộ Nhớ Đệm Chính" msgid "Collection of cache files" -msgstr "Sưu tập của tập tin bộ đệm" +msgstr "Bộ sưu tập của các bộ nhớ đệm" msgid "Main Cameras" -msgstr "Máy Quay Phim Chánh" +msgstr "Máy Quay Phim Chính" msgid "Collection of cameras" -msgstr "Sưu tập máy quay phim" +msgstr "Bộ sưu tập các máy quay phim" msgid "Main Collections" -msgstr "Sưu Tập Chánh" +msgstr "Bộ Sưu Tập Chính" msgid "Collection of collections" -msgstr "Sưu tập của tất cả sưu tập" +msgstr "Bộ sưu tập của các tổ hợp" msgid "Main Curves" -msgstr "Đường Cong Chánh" +msgstr "Đường Cong Chính" msgid "Collection of curves" -msgstr "Sưu tập đường cong" +msgstr "Bộ sưu tập các đường cong" msgid "Main Fonts" -msgstr "Phông Chánh" +msgstr "Phông Chính" msgid "Collection of fonts" -msgstr "Sưu tập phông" +msgstr "Bộ sưu tập các phông" msgid "Main Grease Pencils" -msgstr "Bút Sáp Chánh" +msgstr "Bút Chì Dầu" msgid "Collection of grease pencils" -msgstr "Sưu tập bút sáp" +msgstr "Bộ sưu tập các Bút Chì Dầu" msgid "Main Hair Curves" -msgstr "Đường Cong Tóc Chánh" +msgstr "Đường Cong Tóc Chính" msgid "Collection of hair curves" -msgstr "Sưu tập đường cong tóc" +msgstr "Bộ sưu tập các đường cong tóc" msgid "Main Images" -msgstr "Ảnh Chánh" +msgstr "Hình Ảnh Chính" msgid "Collection of images" -msgstr "Sưu tập ảnh" +msgstr "Bộ sưu tập các hình ảnh" msgid "Main Lattices" -msgstr "Lưới Rào Chánh" +msgstr "Lưới Rào Chính" msgid "Collection of lattices" -msgstr "Sưu tập lưới rào" +msgstr "Bộ sưu tập các lưới rào" msgid "Main Libraries" -msgstr "Thư Viện Chánh" +msgstr "Thư Viện Chính" msgid "Collection of libraries" -msgstr "Sưu tập thư viện" +msgstr "Bộ sưu tập các thư viện" msgid "Main Lights" -msgstr "Đèn Chánh" +msgstr "Nguồn Sáng Chính" msgid "Collection of lights" -msgstr "Sưu Tập Đèn" +msgstr "Bộ Sưu Tập của các Nguồn Sáng" msgid "Main Line Styles" -msgstr "Phong Cách Nét Chánh" +msgstr "Phong Cách Đường Nét Chính" msgid "Collection of line styles" -msgstr "Sưu tập phong cách nét" +msgstr "Bộ sưu tập các phong cách nét" msgid "Main Masks" -msgstr "Mặt Nạ Chánh" +msgstr "Màn Chắn Lọc Chủ Yếu" msgid "Collection of masks" -msgstr "Sưu tập mặt nạ" +msgstr "Bộ sưu tập các màn chắn lọc" msgid "Main Materials" -msgstr "Vật Liệu Chánh" +msgstr "Nguyên Vật Liệu Chính" msgid "Collection of materials" -msgstr "Sưu tập vật liệu" +msgstr "Bộ sưu tập các nguyên vật liệu" msgid "Main Meshes" -msgstr "Mạng Lưới Chánh" +msgstr "Khung Lưới Chính" msgid "Collection of meshes" -msgstr "Sưu tập mạng lưới" +msgstr "Bộ sưu tập các khung lưới" msgid "Main Metaballs" -msgstr "Siêu Cầu Chánh" +msgstr "Siêu Cầu Chính" msgid "Collection of metaballs" -msgstr "Sưu tập siêu cầu" +msgstr "Bộ sưu tập các siêu cầu" msgid "Main Movie Clips" -msgstr "Đoạn Phim Chánh" +msgstr "Đoạn Phim Chính" msgid "Collection of movie clips" -msgstr "Sưu tập khúc phim" +msgstr "Bộ sưu tập các đoạn phim" msgid "Main Node Trees" -msgstr "Cây Giao Điểm Chánh" +msgstr "Cây Nút Chính" msgid "Collection of node trees" -msgstr "Sưu tập cây giao điểm" +msgstr "Bộ sưu tập các cây nút" msgid "Main Objects" -msgstr "Vật Thể Chánh" +msgstr "Đối Tượng Chính" msgid "Collection of objects" -msgstr "Sưu tập vật thể" +msgstr "Bộ sưu tập các đối tượng" msgid "Main Paint Curves" -msgstr "Đường Cong Sơn Chánh" +msgstr "Đường Cong Sơn Chính" msgid "Collection of paint curves" -msgstr "Sưu tập đường cong sơn" +msgstr "Bộ sưu tập các đường cong sơn" msgid "Main Palettes" -msgstr "Bảng Chánh" +msgstr "Bảng Pha Màu Chính" msgid "Collection of palettes" -msgstr "Sưu tập bảng" +msgstr "Bộ sưu tập các bảng pha màu" msgid "Main Particle Settings" -msgstr "Cài Đặt Hạt Chánh" +msgstr "Sắp Đặt Chính của Hạt" msgid "Collection of particle settings" -msgstr "Sưu tập cài đặt hạt" +msgstr "Bộ sưu tập các sắp đặt của hạt" msgid "Main Point Clouds" -msgstr "Mây Điểm Chánh" +msgstr "Đám Mây Điểm Chính" msgid "Collection of point clouds" -msgstr "Sưu tập mây điểm" +msgstr "Bộ sưu tập của các đám mây điểm" msgid "Main Light Probes" -msgstr "Quang Kế Chánh" +msgstr "Bộ Thăm Dò Ánh Sáng Chính" msgid "Collection of light probes" -msgstr "Sưu tập quang kế" +msgstr "Bộ sưu tập của phần tử thăm dò ánh sáng" msgid "Main Scenes" -msgstr "Cảnh Chánh" +msgstr "Cảnh Chính" msgid "Collection of scenes" -msgstr "Sưu tập cảnh" +msgstr "Bộ sưu tập các cảnh" msgid "Main Screens" -msgstr "Màn Chánh" +msgstr "Màn Hình Chính" msgid "Collection of screens" -msgstr "Sưu tập màn" +msgstr "Bộ sưu tập các màn hình" msgid "Main Sounds" -msgstr "Âm Thanh Chánh" +msgstr "Âm Thanh Chính" msgid "Collection of sounds" -msgstr "Sưu tập âm thanh" +msgstr "Bộ sưu tập các âm thanh" msgid "Main Speakers" -msgstr "Loa Chánh" +msgstr "Loa Chính" msgid "Collection of speakers" -msgstr "Sưu tập loa" +msgstr "Bộ sưu tập các loa" msgid "Main Texts" -msgstr "Văn Bản Chánh" +msgstr "Văn Bản Chính" msgid "Collection of texts" -msgstr "Sưu tập văn bản" +msgstr "Bộ sưu tập các văn bản" msgid "Main Textures" -msgstr "Chất Liệu Chánh" +msgstr "Chất Liệu Chính" msgid "Collection of textures" -msgstr "Sưu tập chất liệu" +msgstr "Bộ sưu tập chất liệu" msgid "Main Volumes" -msgstr "Các Thể Thích Chánh" +msgstr "Các Thể Tích Chính" msgid "Collection of volumes" -msgstr "Sưu tập thể tích" +msgstr "Bộ sưu tập các thể tích" msgid "Main Window Managers" -msgstr "Bộ Quản Lý Cửa Sổ Chánh" +msgstr "Quản Lý Cửa Sổ Chính" msgid "Collection of window managers" -msgstr "Sưu tập bộ quản lý cửa sổ" +msgstr "Bộ sưu tập các quản lý cửa sổ" msgid "Main Workspaces" -msgstr "Công Trường Chánh" +msgstr "Không Gian Làm Việc Chính" msgid "Collection of workspaces" -msgstr "Sưu tập công trường" +msgstr "Bộ sưu tập không gian làm việc" msgid "Main Worlds" -msgstr "Thế Giới Chánh" +msgstr "Thế Giới Chính" msgid "Collection of worlds" -msgstr "Sưu tập thế giới" +msgstr "Bộ sưu tập các thế giới" msgid "Blender RNA" @@ -2660,11 +2918,11 @@ msgstr "RNA Blender" msgid "Blender RNA structure definitions" -msgstr "Định nghĩa cấu tạo RNA của Blender" +msgstr "Định nghĩa cấu trúc RNA của Blender" msgid "Structs" -msgstr "Cấu Tạo" +msgstr "Cấu Trúc" msgid "Boid Rule" @@ -2672,15 +2930,15 @@ msgstr "Quy Tắc Quần Thể" msgid "Boid rule name" -msgstr "Tên quy tắc đành thể" +msgstr "Tên quy tắc quần thể" msgid "Goal" -msgstr "Mục Đích" +msgstr "Mục Tiêu" msgid "Go to assigned object or loudest assigned signal source" -msgstr "Đi đến vật thể chỉ định hay tín hiệu lớn tiếng nhất" +msgstr "Đi đến đối tượng đã ấn định hay nguồn tín hiệu ấn định inh ỏi nhất" msgid "Avoid" @@ -2688,39 +2946,39 @@ msgstr "Tránh" msgid "Get away from assigned object or loudest assigned signal source" -msgstr "Tránh xa vật thể chỉ định hay tín hiệu lớn tiếng nhất" +msgstr "Tránh xa đối tượng đã ấn định hoặc nguồn tín hiệu ấn định inh ỏi nhất" msgid "Avoid Collision" -msgstr "Tránh Va Chạm" +msgstr "Tránh Va Đập" msgid "Maneuver to avoid collisions with other boids and deflector objects in near future" -msgstr "Chuyển hướng để tránh va chạm với quần thể khác va vật thể chệch hướng trong tương lại gần đây" +msgstr "Chuyển hướng để tránh né va đập với quần thể khác và các đối tượng làm lệch hướng trong tương lai gần đây" msgid "Separate" -msgstr "Chia" +msgstr "Tách Rời" msgid "Keep from going through other boids" -msgstr "Đừng cho đi xuyên qua quần thể khác" +msgstr "Giữ không cho đi xuyên qua các quần thể khác" msgid "Flock" -msgstr "Bầy" +msgstr "Đàn/Bầy" msgid "Move to center of neighbors and match their velocity" -msgstr "Di chuyển đến trung tâm của hàng xóm và đi cùng vận tốc với họ" +msgstr "Di chuyển đến trung tâm các nhóm lân cận và khớp với vận tốc của chúng" msgid "Follow Leader" -msgstr "Theo Đõi Lãnh Đạo" +msgstr "Đi Theo Hướng Đạo Viên" msgid "Follow a boid or assigned object" -msgstr "Đuổi theo quần thể hay vật thể được chỉ định" +msgstr "Đi theo quần thể hay đối tượng ấn định" msgid "Average Speed" @@ -2728,7 +2986,7 @@ msgstr "Tốc Độ Trung Bình" msgid "Maintain speed, flight level or wander" -msgstr "Giữ tốc độ, bay ngang hay đi lang thang" +msgstr "Giữ vận tốc, tầm bay hay đi lang thang" msgid "Fight" @@ -2736,7 +2994,7 @@ msgstr "Chiến Đấu" msgid "Go to closest enemy and attack when in range" -msgstr "Đi tới kẻ thù gần nhất và chiến đấu khi ở trong tầm xa" +msgstr "Tiến tới kẻ thù gần nhất và tấn công khi ở trong phạm vi" msgid "In Air" @@ -2744,7 +3002,7 @@ msgstr "Trên Không" msgid "Use rule when boid is flying" -msgstr "Sử dụng quy tắc khi quần thể đang bay" +msgstr "Dùng quy tắc khi quần thể đang bay" msgid "On Land" @@ -2752,15 +3010,15 @@ msgstr "Trên Đất" msgid "Use rule when boid is on land" -msgstr "Sử dụng quy tắc khi quần thể ở trên đất" +msgstr "Dùng quy tắc khi quần thể ở trên mặt đất" msgid "Level" -msgstr "Nhang" +msgstr "Mức Độ" msgid "How much velocity's z-component is kept constant" -msgstr "Bao nhiêu thành phần Z được giữ đẩng" +msgstr "Thành phần-z của vận tốc cần phải giữ bất biến là bao nhiêu" msgid "Speed" @@ -2768,7 +3026,7 @@ msgstr "Tốc Độ" msgid "Percentage of maximum speed" -msgstr "Phần trăm của tốc độ cực đại" +msgstr "Phần trăm của tốc độ tối đa" msgid "Wander" @@ -2776,19 +3034,19 @@ msgstr "Lang Thang" msgid "How fast velocity's direction is randomized" -msgstr "Tốc độ hướng của vận tốc được ngẫu nhiên hóa" +msgstr "Tốc độ mà hướng của vận tốc thay đổi ngẫu nhiên nhanh là bao nhiêu" msgid "Fear Factor" -msgstr "Hệ Số Hoảng Sợ" +msgstr "Hệ số sợ hãi" msgid "Avoid object if danger from it is above this threshold" -msgstr "Tránh vật thể nếu sự huy hiểm cao hơn ngưỡng này" +msgstr "Né tránh đối tượng nếu sự nguy hiểm từ đó ra cao hơn giới hạn này" msgid "Object to avoid" -msgstr "Vật thể tránh xa" +msgstr "Đối tượng phải tránh né" msgid "Predict" @@ -2800,11 +3058,11 @@ msgstr "Dự đoán chuyển động của mục tiêu" msgid "Look Ahead" -msgstr "Xem Phía Trước" +msgstr "Nhìn xa trước" msgid "Time to look ahead in seconds" -msgstr "Thời gian cho xem phía trước (giây)" +msgstr "Thời gian nhìn xa trước trong đơn vị giây" msgid "Boids" @@ -2812,31 +3070,31 @@ msgstr "Quần Thể" msgid "Avoid collision with other boids" -msgstr "Tránh va chạm với quần thể khác" +msgstr "Tránh va đập với quần thể khác" msgid "Deflectors" -msgstr "Đồ Chệch Hướng" +msgstr "Vật Làm Lệch Hướng" msgid "Avoid collision with deflector objects" -msgstr "Tráng va chạm với vật thể chệch hướng" +msgstr "Tránh va đập với các đối tượng làm lệch hướng" msgid "Fight Distance" -msgstr "Tầm Xa Chiến Đấu" +msgstr "Khoảng Cách Chiến Đấu" msgid "Attack boids at max this distance" -msgstr "Tấn Công quần thể đến tầm xa này" +msgstr "Khoảng cách tối đa tấn công quần thể" msgid "Flee Distance" -msgstr "Tầm Xa Né" +msgstr "Khoảng Cách Chạy Trốn" msgid "Flee to this distance" -msgstr "Chạy né đến tầm xa này" +msgstr "Chạy trốn tới khoảng cách này" msgid "Distance" @@ -2844,15 +3102,15 @@ msgstr "Khoảng Cách" msgid "Distance behind leader to follow" -msgstr "Cách xa để đi theo dõi phía sau lãnh đạo" +msgstr "Khoảng cách theo sau hướng đạo viên" msgid "Follow this object instead of a boid" -msgstr "Đi theo vật thể này thai thế vật quần thể" +msgstr "Theo đuổi đối tượng này thay vì một quần thể" msgid "Queue Size" -msgstr "Số Lượng Một Hàng" +msgstr "Cỡ Hàng" msgid "How many boids in a line" @@ -2860,23 +3118,23 @@ msgstr "Số lượng quần thể trong một hàng" msgid "Line" -msgstr "Sắp Hàng" +msgstr "Đường Nét/Thẳng" msgid "Follow leader in a line" -msgstr "Sắp hàng khi theo dõi lãnh đạo" +msgstr "Sắp hàng đi theo hướng đạo viên" msgid "Goal object" -msgstr "Vật thể mục đích" +msgstr "Đối tượng mục tiêu" msgid "Boid Settings" -msgstr "Cài Đặt Quần Thể" +msgstr "Sắp Đặt của Quần Thể" msgid "Settings for boid physics" -msgstr "Cài đặt cho vật lý quần thể" +msgstr "Sắp đặt dành cho vật lý của quần thể" msgid "Accuracy" @@ -2888,67 +3146,67 @@ msgstr "Độ chính xác khi tấn công" msgid "Active Boid Rule" -msgstr "Quy Tắc Quần Thể Hoạt Động" +msgstr "Quy Tắc Quần Thể đang Hoạt Động" msgid "Active Boid State Index" -msgstr "Chỉ Số Trạng Thái Đán Thể Hoạt Động" +msgstr "Chỉ Số Trạng Thái Quần Thể đang Hoạt Động" msgid "Aggression" -msgstr "Sự Hùng Dữ" +msgstr "Tính Hung Dữ" msgid "Boid will fight this times stronger enemy" -msgstr "Quần thể sẽ chiến đấu với kẻ thù mạnh hơn gấp mấy lần này" +msgstr "Quần thể sẽ chiến đấu với kẻ thù mạnh hơn gấp số lần này" msgid "Max Air Acceleration" -msgstr "Gia Tốc Cực Trên Không" +msgstr "Tăng Tốc Tối Đa Trên Không Trung" msgid "Maximum acceleration in air (relative to maximum speed)" -msgstr "Gia tốc cực đại trên không (tương đối với tốc độ cực đại)" +msgstr "Tăng tốc tối đa trên không trung (tương đối với tốc độ tối đa)" msgid "Max Air Angular Velocity" -msgstr "Vận Tốc Xoay Cực Đại Trên Không" +msgstr "Vận Tốc Xoay Tối Đa Trên Không Trung" msgid "Maximum angular velocity in air (relative to 180 degrees)" -msgstr "Vận tốc xoay cực đặi trên không (tương đối với 180 độ)" +msgstr "Vận tốc xoay tối đa trên không trung (tương đối với 180 độ)" msgid "Air Personal Space" -msgstr "Không Gian Trên Không Cá Nhân" +msgstr "Không Gian Cá Nhân Trên Không Trung" msgid "Radius of boids personal space in air (% of particle size)" -msgstr "Bán kính không gian cá nhân của quần thể trên không (% kích kích cỡ)" +msgstr "Bán kính không gian cá nhân của quần thể trên không trung (% cỡ của hạt)" msgid "Max Air Speed" -msgstr "Tốc Độ Cực Đại Trên Không" +msgstr "Tốc Độ Tối Đa Trên Không Trung" msgid "Maximum speed in air" -msgstr "Tốc độ cực đại trên không" +msgstr "Tốc độ tối đa trên không trung" msgid "Min Air Speed" -msgstr "Tốc Độ Cực Tiểu Trên Không" +msgstr "Tốc Độ Tối Thiểu Trên Không Trung" msgid "Minimum speed in air (relative to maximum speed)" -msgstr "Tốc độ cực tiểu trên không (tương đối với tộc độ đại cực)" +msgstr "Tốc độ tối thiểu trên không trung (tương đối với tộc độ tối đa)" msgid "Banking" -msgstr "Rẻ" +msgstr "Góc Lượn" msgid "Amount of rotation around velocity vector on turns" -msgstr "Lượng xoay quanh vectơ vận tốc khi rẻ" +msgstr "Góc độ xoay quanh vectơ vận tốc khi rẽ" msgid "Health" @@ -2956,83 +3214,83 @@ msgstr "Sức Khỏe" msgid "Initial boid health when born" -msgstr "Sức khỏe khởi đầu khi sanh ra" +msgstr "Sức lực khởi đầu của quần thể khi được sinh tạo" msgid "Boid height relative to particle size" -msgstr "Bề cao tương đối với kích cỡ hạt" +msgstr "Chiều cao quần thể tương đối với cỡ của hạt" msgid "Max Land Acceleration" -msgstr "Gia Tốc Cực Đại Trên Đất" +msgstr "Tăng Tốc Tối Đa Trên Đất" msgid "Maximum acceleration on land (relative to maximum speed)" -msgstr "Gia tốc cực đại trên đất (tương đối với tốc độ cực đại)" +msgstr "Tăng tốc tối đa trên đất (tương đối với tốc độ tối đa)" msgid "Max Land Angular Velocity" -msgstr "Vận Tốc Xoay Cực Đại Trên Đất" +msgstr "Vận Tốc Xoay Tối Đa Trên Đất" msgid "Maximum angular velocity on land (relative to 180 degrees)" -msgstr "Vận tốc xoay cực đại trên đất (tương đối với 180 độ)" +msgstr "Vận tốc xoay tối đa trên đất (tương đối với 180 độ)" msgid "Jump Speed" -msgstr "Tốc độ Nhảy" +msgstr "Tốc Độ Nhảy" msgid "Maximum speed for jumping" -msgstr "Tốc độ cực đại cho nhảy" +msgstr "Tốc độ nhảy tối đa" msgid "Land Personal Space" -msgstr "Không Gian Đất Cá Nhân" +msgstr "Không Gian Cá Nhân Trên Mặt Đất" msgid "Radius of boids personal space on land (% of particle size)" -msgstr "Bạn kính không gian cá nhân của quần thể trên đất (% kích cỡ hạt)" +msgstr "Bán kính không gian cá nhân của quần thể trên mặt đất (% cỡ của hạt)" msgid "Landing Smoothness" -msgstr "Độ Nhiển Hạ Cánh" +msgstr "Độ Hạ Cánh Nhẹ Nhàng" msgid "How smoothly the boids land" -msgstr "Độ nhiển nhương quần thể hạ cánh" +msgstr "Độ hạ cánh nhẹ nhàng của quần thể" msgid "Max Land Speed" -msgstr "Tốc Độ Cực Trên Đật" +msgstr "Tốc Độ Tối Đa Trên Mặt Đất" msgid "Maximum speed on land" -msgstr "Tốc độ cực đại trên đất" +msgstr "Tốc độ tối đa trên mặt đất" msgid "Land Stick Force" -msgstr "Lực Dính Đất" +msgstr "Lực Dính Mặt Đất" msgid "How strong a force must be to start effecting a boid on land" -msgstr "Sức của lực để bắt đầu được ảnh hưởng một quần thể trên đến" +msgstr "Sức mạnh của lực cần có để khởi sự gây ảnh hưởng tới một đơn vị quần thể trên mặt đất" msgid "Pitch" -msgstr "Nghiêng" +msgstr "Độ Chúc Lên Xuống" msgid "Amount of rotation around side vector" -msgstr "Lượng xoay quanh vectơ phía bên hông" +msgstr "Lượng xoay quanh vectơ ngang lườn" msgid "Range" -msgstr "Tầm Xa" +msgstr "Phạm Vi" msgid "Maximum distance from which a boid can attack" -msgstr "Khoảng cách tối đa thì quần thể có thể tấn công" +msgstr "Khoảng cách tối đa khi quần thể có thể tấn công" msgid "Boid States" @@ -3040,51 +3298,51 @@ msgstr "Trạng Thái Quần Thể" msgid "Strength" -msgstr "Sức Lực" +msgstr "Độ Đậm/Sức Mạnh/Cường Độ" msgid "Maximum caused damage on attack per second" -msgstr "Tổn thương tối đa khi tấn công mỗi giây" +msgstr "Tổn thất tối đa khi tấn công mỗi giây" msgid "Allow Climbing" -msgstr "Cho Trèo" +msgstr "Cho Phép Trèo" msgid "Allow boids to climb goal objects" -msgstr "Cho quần thể trèo lên vật thể mục đích" +msgstr "Cho phép quần thể trèo lên đối tượng mục tiêu" msgid "Allow Flight" -msgstr "Cho Bay" +msgstr "Cho Phép Bay" msgid "Allow boids to move in air" -msgstr "Cho quần thể bay trên không" +msgstr "Cho phép quần thể bay ở trên không trung" msgid "Allow Land" -msgstr "Cho Đất" +msgstr "Cho Phép Trên Mặt Đất" msgid "Allow boids to move on land" -msgstr "Cho quần thể di chuyển trên đất" +msgstr "Cho phép quần thể di chuyển trên mặt đất" msgid "Boid State" -msgstr "Trạng Thái Quần Thề" +msgstr "Trạng Thái Quần Thể" msgid "Boid state for boid physics" -msgstr "Trạng Thái quần thể cho vật lý quần thể" +msgstr "Trạng thái các vật lý quần thể" msgid "Active Boid Rule Index" -msgstr "Chỉ Số Quay Tắc Quần Thể Hoạt Động" +msgstr "Chỉ Số Quy Tắc Quần Thể đang Hoạt Động" msgid "Falloff" -msgstr "Sự Giảm" +msgstr "Suy Giảm Dần" msgid "Boid state name" @@ -3092,11 +3350,11 @@ msgstr "Tên trạng thái quần thể" msgid "Rule Fuzziness" -msgstr "Độ Mờ Mịt Quy Tắc" +msgstr "Độ Mơ Hồ trong Quy Tắc" msgid "Boid Rules" -msgstr "Quy Tắa Quần Thể" +msgstr "Quy Tắc Quần Thể" msgid "Rule Evaluation" @@ -3104,15 +3362,15 @@ msgstr "Tính Toán Quy Tắc" msgid "How the rules in the list are evaluated" -msgstr "Làm sao được tính toán các quy tắc trong danh sách" +msgstr "Các quy tắc trong danh sách sẽ được đánh giá thế nào" msgid "Fuzzy" -msgstr "Mờ Mịt" +msgstr "Mờ Ám/Ảo" msgid "Rules are gone through top to bottom (only the first rule which effect is above fuzziness threshold is evaluated)" -msgstr "Áp dụng quy tắc từ trên đến dưới (chỉ tính toán quy tắc đầu tiên hơn ngưỡng mờ mịt được tính toán)" +msgstr "Các quy tắc được đánh giá từ trên xuống dưới (chỉ quy tắc đầu tiên với hiệu quả cao hơn giới hạn mơ hồ là được đánh giá)" msgid "Random" @@ -3120,15 +3378,15 @@ msgstr "Ngẫu Nhiên" msgid "A random rule is selected for each boid" -msgstr "Chọn một quy tắc ngẫu nhiên cho mỗi quần thể" +msgstr "Quy tắc sẽ được chọn ngẫu nhiên cho mỗi phần tử quần thể" msgid "Average" -msgstr "Trung Bình" +msgstr "Trung Bình/Hóa" msgid "All rules are averaged" -msgstr "Áp dụng trung bình của tất cả quy tắc" +msgstr "Toàn bộ các quy tắc đều trung bình" msgid "Volume" @@ -3136,7 +3394,7 @@ msgstr "Thể Tích" msgid "Bone in an Armature data-block" -msgstr "Xương ở trong một cục dữ liệu Cốt" +msgstr "Xương ở trong khối dữ liệu Khung Cốt" msgid "In X" @@ -3144,7 +3402,7 @@ msgstr "X Vào" msgid "X-axis handle offset for start of the B-Bone's curve, adjusts curvature" -msgstr "Nới tay cầm trục X cho điềm đầu của đường cong Xương-B, để chỉnh độ cuộn" +msgstr "Dịch chuyển của tay cầm trục X cho đầu của đường cong Xương-Dẻo, điều chỉnh độ cong" msgid "In Z" @@ -3152,7 +3410,7 @@ msgstr "Z Vào" msgid "Z-axis handle offset for start of the B-Bone's curve, adjusts curvature" -msgstr "Nới của tay cầm trục Z cho điềm đầu của đường cong Xương-B, để chỉnh độ cuộn" +msgstr "Dịch chuyển của tay cầm trục Z dành cho khởi đầu của đường cong Xương-Dẻo, nhằm điều chỉnh độ cong" msgid "Out X" @@ -3160,7 +3418,7 @@ msgstr "X Ra" msgid "X-axis handle offset for end of the B-Bone's curve, adjusts curvature" -msgstr "Nới tay cầm trục X cho điềm cuối của đường cong Xương-B, để chỉnh độ cuộn" +msgstr "Dịch chuyển của tay cầm trục X cho đầu cuối của đường cong Xương-Dẻo, điều chỉnh độ cong" msgid "Out Z" @@ -3168,39 +3426,49 @@ msgstr "Z Ra" msgid "Z-axis handle offset for end of the B-Bone's curve, adjusts curvature" -msgstr "Nới tay cầm trục Z cho điềm cuối của đường cong Xương-B, để chỉnh độ cuộn" +msgstr "Dịch chuyển của tay cầm trục Z, dành cho điểm kết đường cong của Xương-Dẻo, nhằm điều chỉnh độ cong" msgid "B-Bone End Handle" -msgstr "Tay Cầm Xương-B Cuối" +msgstr "Tay Cầm Kết Thúc của Xương-Dẻo" msgid "Bone that serves as the end handle for the B-Bone curve" -msgstr "Xương được làm tay cầm cuối cho đường cong Xương-B" +msgstr "Xương dùng để làm tay cầm kết thúc cho đường cong Xương-Dẻo" msgid "B-Bone Start Handle" -msgstr "Tay Cầm Xương-B Đầu" +msgstr "Tay Cầm Khởi Đầu của Xương-Dẻo" msgid "Bone that serves as the start handle for the B-Bone curve" -msgstr "Xương được làm tay cầm đầu cho đường cong Xương-B" +msgstr "Xương dùng để làm tay cầm khởi đầu cho đường cong Xương-Dẻo" + + +msgctxt "Armature" +msgid "Ease In" +msgstr "Chậm Rãi Vào" msgid "Length of first Bezier Handle (for B-Bones only)" -msgstr "Bề dài của Tay Cầm Bezier thứ nhất (chỉ cho Xương-B)" +msgstr "Độ dài của Tay Cầm Bezier thứ nhất (chỉ dành cho Xương-Dẻo)" + + +msgctxt "Armature" +msgid "Ease Out" +msgstr "Chậm Rãi Ra" msgid "Length of second Bezier Handle (for B-Bones only)" -msgstr "Độ dài của Tay Cầm Bezier thứ nhị (chỉ cho Xương-B)" +msgstr "Độ dài của Tay Cầm Bezier thứ nhì (chỉ dành cho Xương-Dẻo thôi)" msgid "B-Bone End Handle Type" -msgstr "Loại Tay Cầm Cuối Xương-B" +msgstr "Kiểu Tay Cầm Cuối của Xương-Dẻo" msgid "Selects how the end handle of the B-Bone is computed" -msgstr "Được chọn phương pháp nào để tính tay cầm cuối của Xương-B" +msgstr "Chọn phương pháp mà tay cầm cuối của Xương-Dẻo được tính toán" msgid "Automatic" @@ -3208,7 +3476,7 @@ msgstr "Tự Động" msgid "Use connected parent and children to compute the handle" -msgstr "Sừ dụng con cái và phụ huynh được kết nối nhau để tính tay cầm" +msgstr "Dùng phụ huynh và con cái để tính toán tay cầm" msgid "Absolute" @@ -3216,7 +3484,7 @@ msgstr "Tuyệt Đối" msgid "Use the position of the specified bone to compute the handle" -msgstr "Sử dụng vị trí của xương được xác định để tính tay cầm" +msgstr "Dùng vị trí của xương chỉ định để tính toán tay cầm" msgid "Relative" @@ -3224,115 +3492,131 @@ msgstr "Tương Đối" msgid "Use the offset of the specified bone from rest pose to compute the handle" -msgstr "Sử dụng dịch của xương được xác định từ dạng đứng nghỉ để tính tay cầm" +msgstr "Dùng dịch chuyển của xương chỉ định trong tư thế nghỉ để tính toán tay cầm" msgid "Use the orientation of the specified bone to compute the handle, ignoring the location" -msgstr "Sử dụng định hướng của xương được xác định để tính tay cầm, không quan tâm vị trí" +msgstr "Dùng định hướng của xương chỉ định để tính toán tay cầm, bỏ qua địa điểm" msgid "B-Bone Start Handle Type" -msgstr "Loại Tay Cầm Đầu Xương-B" +msgstr "Kiểu Tay Cầm cho Đầu của Xương-Dẻo" msgid "Selects how the start handle of the B-Bone is computed" -msgstr "Được chọn phương pháp nào để tính tay cầm đầu của Xương-B" +msgstr "Chọn phương pháp mà tay cầm cho đầu của Xương-Dẻo sẽ được tính toán" msgid "End Handle Ease" -msgstr "Xoa Dịu Tay Cầm Cuối" +msgstr "Chậm Rãi Tay Cầm Cuối" msgid "Multiply the B-Bone Ease Out channel by the local Y scale value of the end handle. This is done after the Scale Easing option and isn't affected by it" -msgstr "Nhân kênh Xoa Dịu Ra của Xương-B bằng giá trị phóng to của Y địa phương của tay cầm cuối. Cái này được làm sau tùy chọn Phóng To Xoa Dịu và không bị ảnh hưởng bởi nó" +msgstr "Nhân kênh Chậm Rãi Ra của Xương-Dẻo bằng giá trị phóng to của Y địa phương của tay cầm cuối. Cái này được làm sau tùy chọn Đổi Tỷ Lệ Chậm Rãi và không bị ảnh hưởng bởi nó" msgid "Start Handle Ease" -msgstr "Xoa Dịu Tay Cầm Đầu" +msgstr "Chậm Rãi Tay Cầm Đầu" msgid "Multiply the B-Bone Ease In channel by the local Y scale value of the start handle. This is done after the Scale Easing option and isn't affected by it" -msgstr "Nhân kênh Xoa Dịu Vào của Xương-B bằng giá trị phóng to của Y địa phương của tay cầm đầu. Cái này được làm sau tùy chọn Phóng To Xoa Dịu và không bị ảnh hưởng bởi nó" +msgstr "Nhân kênh Chậm Rãi Vào của Xương-Dẻo bằng giá trị phóng to của Y địa phương của tay cầm đầu. Cái này được làm sau tùy chọn Đổi Tỷ Lệ Chậm Rãi và không bị ảnh hưởng bởi nó" msgid "End Handle Scale" -msgstr "Phóng To Tay Cầm Cuối" +msgstr "Tỷ Lệ của Tay Cầm Kết Thúc" msgid "Multiply B-Bone Scale Out channels by the local scale values of the end handle. This is done after the Scale Easing option and isn't affected by it" -msgstr "Nhân kênh Xoa Dịu Ra của Xương-B bằng giá trị phóng to địa phương của tay cầm cuối. Cái này được làm sau tùy chọn Phóng To Xoa Dịu và không bị ảnh hưởng bởi nó" +msgstr "Nhân kênh Chậm Rãi Ra của Xương-Dẻo bằng giá trị phóng to địa phương của tay cầm cuối. Cái này được làm sau tùy chọn Đổi Tỷ Lệ Chậm Rãi và không bị ảnh hưởng bởi nó" msgid "Start Handle Scale" -msgstr "Phóng To Tay Cầm Đầu" +msgstr "Tỷ Lệ của Tay Cầm Khởi Đầu" msgid "Multiply B-Bone Scale In channels by the local scale values of the start handle. This is done after the Scale Easing option and isn't affected by it" -msgstr "Nhân kênh Xoa Dịu Vào của Xương-B bằng giá trị phóng to địa phương của tay cầm đầu. Cái này được làm sau tùy chọn Phóng To Xoa Dịu và không bị ảnh hưởng bởi nó" +msgstr "Nhân kênh Chậm Rãi Vào của Xương-Dẻo bằng giá trị phóng to địa phương của tay cầm đầu. Cái này được làm sau tùy chọn Đổi Tỷ Lệ Chậm Rãi và không bị ảnh hưởng bởi nó" + + +msgid "B-Bone Vertex Mapping Mode" +msgstr "Chế Độ Ánh Xạ Điểm Đỉnh Xương Dẻo (B-Bone)" + + +msgid "Selects how the vertices are mapped to B-Bone segments based on their position" +msgstr "Chọn phương pháp các điểm đỉnh sẽ ánh xạ tới các phân đoạn Xương Dẻo (B-Bone) dựa trên vị trí của chúng" msgid "Straight" msgstr "Thẳng" +msgid "Fast mapping that is good for most situations, but ignores the rest pose curvature of the B-Bone" +msgstr "Lập ánh xạ nhanh phù hợp với hầu hết các tình huống, song bỏ qua độ cong tư thế nghỉ của Xương Dẻo (B-Bone)" + + msgid "Curved" -msgstr "Bị Cong" +msgstr "Cong" + + +msgid "Slower mapping that gives better deformation for B-Bones that are sharply curved in rest pose" +msgstr "Ánh xạ chậm hơn cho biến dạng tốt hơn đối với Xương Dẻo (B-Bones) tức những xương đã được uốn cong ngoắt đi trong tư thế nghỉ" msgid "Roll In" -msgstr "Lăn Vào" +msgstr "Lăn Đầu Vào" msgid "Roll offset for the start of the B-Bone, adjusts twist" -msgstr "Dịch lăn cho đầu của Xương-B, để chỉnh xoắn" +msgstr "Dịch chuyển về độ lăn cho đầu Xương-Dẻo, chỉnh độ xoắn vặn" msgid "Roll Out" -msgstr "Lăn Ra" +msgstr "Lăn Đầu Ra" msgid "Roll offset for the end of the B-Bone, adjusts twist" -msgstr "Dịch lăn cho cuối của Xương-B, để chỉnh xoắn" +msgstr "Dịch chuyển về độ lăn cho đoạn cuối của Xương-Dẻo, chỉnh độ xoắn vặn" msgid "Scale In" -msgstr "Phóng Vào" +msgstr "Tỷ Lệ Đầu Vào" msgid "Scale factors for the start of the B-Bone, adjusts thickness (for tapering effects)" -msgstr "Hệ số phóng to cho đầu của Xương-B, để chỉnh bề dày (cho hiệu ứng nến)" +msgstr "Hệ số tỷ lệ cho đầu xương-mềm (B-Bone), nhằm điều khiển độ dày (để tạo hiệu ứng vuốt thon)" msgid "Scale Out" -msgstr "Phóng Ra" +msgstr "Tỷ Lệ Đầu Ra" msgid "Scale factors for the end of the B-Bone, adjusts thickness (for tapering effects)" -msgstr "Hệ số phóng to duôi của Xương-B, để chỉnh bề dày (cho hiệu ứng nến)" +msgstr "Hệ số tỷ lệ cho đuôi xương-mềm (B-Bone), nhằm điều khiển độ dày (để tạo hiệu ứng vuốt thon)" msgid "B-Bone Segments" -msgstr "Khúc Xương-B" +msgstr "Số Phân Đoạn Xương-Dẻo" msgid "Number of subdivisions of bone (for B-Bones only)" -msgstr "Số lượng chẻ khúc xương (chỉ cho Xương-B)" +msgstr "Số phân đoạn của xương (chỉ dành cho Xương-Dẻo mà thôi)" msgid "B-Bone Display X Width" -msgstr "Xương-B Bề Rộng Chiếu X" +msgstr "Chiều Rộng X trong Hiển Thị của Xương-Dẻo" msgid "B-Bone X size" -msgstr "Xương-B Kích Cỡ X" +msgstr "Cỡ X của Xương-Dẻo" msgid "B-Bone Display Z Width" -msgstr "Xương-B Bề Rộng Chiếu Z" +msgstr "Chiều Rộng Z trong Hiển Thị của Xương-Dẻo" msgid "B-Bone Z size" -msgstr "Xương-B Kích Cỡ Z" +msgstr "Cỡ Z của Xương-Dẻo" msgid "Children" @@ -3340,23 +3624,27 @@ msgstr "Con Cái" msgid "Bones which are children of this bone" -msgstr "Các xương là con cái của xương này" +msgstr "Các xương con cái của xương này" + + +msgid "Bone Collections that contain this bone" +msgstr "Bộ Sưu Tập Xương có chứa xương này trong đó" msgid "Envelope Deform Distance" -msgstr "Khoảng Cách Méo Bao Bì" +msgstr "Khoảng Cách Biến Dạng Phong Bao" msgid "Bone deformation distance (for Envelope deform only)" -msgstr "Khoảng cách méo hóa xương (chỉ cho méo hóa Bao Bì)" +msgstr "Khoảng cách biến dạng xương (chỉ dành cho biến dạng Phong Bao thôi)" msgid "Envelope Deform Weight" -msgstr "Quyền Lượng Méo Bao Bì" +msgstr "Trọng Lượng Biến Dạng Phong Bao" msgid "Bone deformation weight (for Envelope deform only)" -msgstr "Quyền lượng méo hóa xương (chỉ cho méo hóa Bao Bì)" +msgstr "Trọng lượng biến dạng xương (chỉ dành cho biến dạng Phong Bao thôi)" msgid "Head" @@ -3364,27 +3652,27 @@ msgstr "Đầu" msgid "Location of head end of the bone relative to its parent" -msgstr "Vị trí của đầu xương tương đối với phụ huynh của nó" +msgstr "Vị trí của điểm đỉnh xương tương đối với phụ huynh của nó" msgid "Armature-Relative Head" -msgstr "Đầu Tương Đối Cốt" +msgstr "Đầu Tương Đối của Khung Cốt" msgid "Location of head end of the bone relative to armature" -msgstr "Vị trí của đầu xương tương đối với cốt" +msgstr "Vị trí của điểm đỉnh đầu xương tương đối với khung cốt" msgid "Envelope Head Radius" -msgstr "Bán Kính Đầu Bao Bì" +msgstr "Bán Kính Đầu của Phong Bao" msgid "Radius of head of bone (for Envelope deform only)" -msgstr "Bán kính của đầu xương (chỉ cho méo hóa Bao Bì)" +msgstr "Bán kính của đầu xương (chỉ dành cho biến dạng Phong Bao mà thôi)" msgid "Bone is not visible when it is not in Edit Mode (i.e. in Object or Pose Modes)" -msgstr "Xương không hiện khi không ở trong Chế Độ Biên Tập (ví dụ trong Chế Độ Vật Thể hay Dạng Đứng)" +msgstr "Xương vô hình trong Chế Độ Biên Soạn (tức là trong Chế Độ Đối Tượng hay Chế Độ Tư Thế)" msgid "Selectable" @@ -3392,39 +3680,39 @@ msgstr "Có Thể Chọn" msgid "Bone is able to be selected" -msgstr "Có thể chọn xương" +msgstr "Xương có thể chọn được" msgid "Inherit Scale" -msgstr "Thừa Kế Phóng To" +msgstr "Thừa Kế Tỷ Lệ" msgid "Specifies how the bone inherits scaling from the parent bone" -msgstr "Được xác định làm sao xương được thừa hưởng phóng to từ xương phụ huynh" +msgstr "Xác định hình thức xương thừa kế sự thay đổi về tỷ lệ từ xương phụ huynh" msgid "Inherit all effects of parent scaling" -msgstr "Thừa hưởng tất cả hiệu ứng phóng to của phụ huynh" +msgstr "Thừa kế toàn bộ các ảnh hưởng do sự thay đổi về tỷ lệ của phụ huynh gây ra" msgid "Fix Shear" -msgstr "Sửa Méo Mó" +msgstr "Sửa Xô Lệch" msgid "Inherit scaling, but remove shearing of the child in the rest orientation" -msgstr "Thừa hưởng phóng to, nhưng xóa mẹm mó của con cái trong định hướng nghỉ ngơi" +msgstr "Thừa kế tỷ lệ, song xóa các xô lệch của con cái trong định hướng của trạng thái nghỉ" msgid "Rotate non-uniform parent scaling to align with the child, applying parent X scale to child X axis, and so forth" -msgstr "Xoay phóng to của phụ huynh không đều cho sắp xếp với con cái, áp dụng phóng to trục X với trục X của con cái, v.v." +msgstr "Xoay chiều phụ huynh bất đồng đều, đổi tỷ lệ để căn chỉnh với con cái, áp dụng tỷ lệ X của phụ huynh sang trục X của con cái, và những cái tương tự" msgid "Inherit uniform scaling representing the overall change in the volume of the parent" -msgstr "Thừa hưởng phóng to đều đang biển diễn cho sự thay đổi thể tích tông quát của phụ huynh" +msgstr "Thừa kế tỷ lệ đồng đều, đại diện sự thay đổi tổng thể trong thể tích của phụ huynh" msgid "Completely ignore parent scaling" -msgstr "Không quan tâm phóng to của phụ huynh" +msgstr "Hoàn toàn bỏ qua tỷ lệ của phụ huynh" msgid "None (Legacy)" @@ -3432,23 +3720,31 @@ msgstr "Không Có (Lỗi Thời)" msgid "Ignore parent scaling without compensating for parent shear. Replicates the effect of disabling the original Inherit Scale checkbox" -msgstr "Không quan tâm phóng to của phụ huynh và không bù cho méo mó của phụ huynh. Nó bắt trước hiệu ứng tắt hộp đắng ký Thừa Hưởng Phóng To ban đầu" +msgstr "Bỏ qua tỷ lệ của phụ huynh mà không bù trừ cho xô lệch của phụ huynh. Nhắc lại ảnh hưởng của việc giải hoạt (tắt) hộp kiểm Thừa Kế Tỷ Lệ gốc" msgid "Length" -msgstr "Bề Dài" +msgstr "Chiều Dài" msgid "Length of the bone" -msgstr "Bề dài của xương" +msgstr "Chiều dài của xương" msgid "Bone Matrix" msgstr "Ma Trận Xương" +msgid "3×3 bone matrix" +msgstr "ma trận xương 3 × 3" + + msgid "Bone Armature-Relative Matrix" -msgstr "Ma Trận Xương Cốt-Tương Đối" +msgstr "Ma Trận Tương Đối của Xương trong Khung Cốt" + + +msgid "4×4 bone matrix relative to armature" +msgstr "Ma trận xương 4×4 tương đối với khung cốt" msgid "Parent" @@ -3456,7 +3752,7 @@ msgstr "Phụ Huynh" msgid "Parent bone (in same Armature)" -msgstr "Xương Phụ Huynh (trong cùng Cốt)" +msgstr "Xương phụ huynh (trong cùng Khung Cốt)" msgid "Select Head" @@ -3468,11 +3764,11 @@ msgstr "Chọn Đuôi" msgid "Display Wire" -msgstr "Hiển Thị Sợi Dây" +msgstr "Hiển Thị Mạch Lưới" msgid "Bone is always displayed in wireframe regardless of viewport shading mode (useful for non-obstructive custom bone shapes)" -msgstr "Lần nào cũng hiển thị xương bằng chế độ khung sợi dây bất kể chế độ của màn chiếu (lợi ích cho xương hình dạng tùy chọn không che vật thể khác)" +msgstr "Luôn luôn hiển thị xương dưới dạng mạch lưới, bất kể chế độ chuyển sắc của cổng nhìn là gì (lợi ích những hình dạng xương tùy chỉnh không gây cản trở)" msgid "Tail" @@ -3480,75 +3776,75 @@ msgstr "Đuôi" msgid "Location of tail end of the bone relative to its parent" -msgstr "Vị trí của đuôi xương tương đối với phụ huynh của nó" +msgstr "Vị trí đầu cuối của đuôi xương tương đối với phụ huynh của nó" msgid "Armature-Relative Tail" -msgstr "Đuôi Tương Đối Cốt" +msgstr "Đuôi Tương Đối của Khung Cốt" msgid "Location of tail end of the bone relative to armature" -msgstr "Vị trí của đỉnh đuôi xương tương đối với cốt" +msgstr "Vị trí đầu cuối của đuôi xương tương đối với khung cốt" msgid "Envelope Tail Radius" -msgstr "Bán Kính Đuôi Bao Bì" +msgstr "Bán Kính Đuôi của Phong Bao" msgid "Radius of tail of bone (for Envelope deform only)" -msgstr "Bán kính của đuôi xương (chỉ cho méo hóa Bao Bì)" +msgstr "Bán kính đuôi của phong bao (chỉ dành cho biến dạng Phong Bao)" msgid "Connected" -msgstr "Được Kết Nối" +msgstr "Kết Nối" msgid "When bone has a parent, bone's head is stuck to the parent's tail" -msgstr "Khi xương có một phụ huynh, đầu của xương được dính với đuôi của xương phụ huynh" +msgstr "Khi xương có phụ huynh, đầu xương sẽ dính với đuôi của phụ huynh" msgid "Cyclic Offset" -msgstr "Dịch Chu Kỳ" +msgstr "Dịch Chuyển Tuần Hoàn" msgid "When bone doesn't have a parent, it receives cyclic offset effects (Deprecated)" -msgstr "Khi xương không có phụ huynh, nó được hiệu ứng dịch chu kỳ (Lỗi Thời)" +msgstr "Khi xương không có phụ huynh, nó sẽ chịu hiệu ứng dịch chuyển tuần hoàn tái lặp (Lỗi Thời)" msgid "Deform" -msgstr "Méo Hóa" +msgstr "Biến Dạng" msgid "Enable Bone to deform geometry" -msgstr "Cho xương méo hình dạng" +msgstr "Cho phép Xương được biến dạng hình học" msgid "Inherit End Roll" -msgstr "Thừa Kế Lăn Cuối" +msgstr "Thừa Kế Độ Lăn ở Đuôi" msgid "Add Roll Out of the Start Handle bone to the Roll In value" -msgstr "Cộng Lăn Ra của Tay Cầm Bắt Đầu với giá trị Lăn Vào" +msgstr "Thêm Độ Lăn Đầu Ra của xương Tay Cầm Khởi Đầu vào giá trị Độ Lăn ở Đầu Vào" msgid "Multiply Vertex Group with Envelope" -msgstr "Nhân Nhóm Đỉnh Với Bao Bì" +msgstr "Nhân Nhóm Điểm Đỉnh với Phong Bao" msgid "When deforming bone, multiply effects of Vertex Group weights with Envelope influence" -msgstr "Khi méo hóa xương, nhân hiệu ứng quyền lượng của Nhóm Đỉnh với ảnh hưởng của Bao Bì" +msgstr "Khi biến dạng xương, nhân hiệu ứng của trọng lượng Nhóm Điểm Đỉnh với ảnh hưởng của Phong Bao" msgid "Inherit Rotation" -msgstr "Thừa Kế Xoay" +msgstr "Thừa Kế Độ Xoay" msgid "Bone inherits rotation or scale from parent bone" -msgstr "Xương được thừa hưởng xoay từ xương phụ huynh" +msgstr "Xương thừa ukế độ xoay hoặc tỷ lệ từ xương phụ huynh" msgid "Local Location" -msgstr "Vị Trí Địa Phương" +msgstr "Vị Trí Cục Bộ" msgid "Bone location is set in local space" @@ -3556,51 +3852,135 @@ msgstr "Vị trí xương được đặt trong không gian địa phương" msgid "Relative Parenting" -msgstr "Phụ Huynh Tương Đối" +msgstr "Phụ Huynh Hóa Tương Đối" msgid "Object children will use relative transform, like deform" -msgstr "Vật thể con cái sẽ dùng biến hóa tương đối, như méo hóa" +msgstr "Đối tượng con cái sẽ dùng sự biến hóa tương đối, như biến dạng" msgid "Scale Easing" -msgstr "Phóng To Xoa Dịu" +msgstr "Đổi Tỷ Lệ Chậm Rãi" msgid "Multiply the final easing values by the Scale In/Out Y factors" -msgstr "Nhân giá trị xoa dịu cuối bằng hệ số Phóng To/Phóng Ra Y" +msgstr "Nhân các giá trị chậm rãi kết quả với hệ số Tỷ Lệ Vào/Ra Y" + + +msgid "Bone collection in an Armature data-block" +msgstr "Bộ sưu tập xương trong khối dữ liệu của Khung Cốt" msgid "Bones" msgstr "Xương" +msgid "Is Editable" +msgstr "Có Thể Biên Soạn" + + +msgid "This collection is owned by a local Armature, or was added via a library override in the current blend file" +msgstr "Bộ sưu tập này trực thuộc sở hữu của Khung Cốt cục bộ, hoặc được cho thêm vào thông qua một vượt quyền thư viện trong tập tin blend hiện tại" + + +msgid "Is Local Override" +msgstr "Là Vượt Quyền Cục Bộ" + + +msgid "This collection was added via a library override in the current blend file" +msgstr "Bộ sưu tập này đã được cho thêm vào thông qua vượt quyền thư viện trong tập tin blend hiện tại" + + msgid "Visible" -msgstr "Hiện" +msgstr "Hữu Hình" + + +msgid "Bones in this collection will be visible in pose/object mode" +msgstr "Các xương trong bộ sưu tập này sẽ hữu hình trong chế độ tư thế/đối tượng" + + +msgid "Unique within the Armature" +msgstr "Duy nhất trong Khung Cốt" + + +msgid "Bone Collection Memberships" +msgstr "Tư Cách Thành Viên Bộ Sưu Tập Xương" + + +msgid "The Bone Collections that contain this Bone" +msgstr "Bộ Sưu Tập Xương có chứa xương này trong đó" + + +msgid "Armature Bone Collections" +msgstr "Bộ Sưu Tập Xương của Khung Cốt" + + +msgid "The Bone Collections of this Armature" +msgstr "Bộ Sưu Tập Xương của Khung Cốt này" msgid "Active Collection" -msgstr "Sưu Tập Hoạt Động" +msgstr "Bộ Sưu Tập đang Hoạt Động" + + +msgid "Armature's active bone collection" +msgstr "Bộ sưu tập xương đang hoạt động của khung cốt" + + +msgid "Active Collection Index" +msgstr "Chỉ Số của Bộ Sưu Tập đang Hoạt Động" + + +msgid "The index of the Armature's active bone collection; -1 when there is no active collection" +msgstr "Chỉ số bộ sưu tập xương đang hoạt động của Khung Cốt; -1 khi không có bộ sưu tập nào đang hoạt động cả" + + +msgid "Active Collection Name" +msgstr "Tên của Bộ Sưu Tập đang Hoạt Động" + + +msgid "The name of the Armature's active bone collection; empty when there is no active collection" +msgstr "Tên bộ sưu tập xương đang hoạt động của Khung Cốt; sẽ là trống rỗng khi không có bộ sưu tập nào đang hoạt động cả" + + +msgid "Theme color or custom color of a bone" +msgstr "Màu kiểu mẫu hoặc màu tùy chỉnh của một xương" + + +msgid "The custom bone colors, used when palette is 'CUSTOM'" +msgstr "Màu xương tùy chỉnh, được sử dụng khi bảng màu là 'TÙY CHỈNH'" + + +msgid "Use Custom Color" +msgstr "Sử Dụng Màu Tùy Chỉnh" + + +msgid "A color palette is user-defined, instead of using a theme-defined one" +msgstr "Bảng màu do người dùng xác định, thay vì sử dụng bảng màu do kiểu mẫu xác định" + + +msgid "Color palette to use" +msgstr "Bảng màu để sử dụng" msgid "Bool Attribute Value" -msgstr "Giá Trị Đặc Điểm Bool" +msgstr "Giá Trị Thuộc Tính Bool" msgid "Bool value in geometry attribute" -msgstr "Giá trị bool trong đặc điểm hình dạng" +msgstr "Giá trị bool trong thuộc tính hình học" msgid "Brush Capabilities" -msgstr "Khả Năng Bút" +msgstr "Tiềm Năng của Đầu Bút" msgid "Read-only indications of supported operations" -msgstr "Sự biểu lộ chỉ được đọc của tương tác được hỗ trợ" +msgstr "Dấu biểu thị duy-đọc (Read-only) của các thao tác hỗ trợ" msgid "Has Overlay" -msgstr "Có Lớp Che Trên" +msgstr "Có Khả Năng Vẽ Lồng" msgid "Has Random Texture Angle" @@ -3608,23 +3988,23 @@ msgstr "Có Góc Chất Liệu Ngẫu Nhiên" msgid "Has Smooth Stroke" -msgstr "Có Nét Mịn" +msgstr "Có Nét Mượt" msgid "Has Spacing" -msgstr "Có Cách Trống" +msgstr "Có Tính Phân Khoảng" msgid "Image Paint Capabilities" -msgstr "Khả Năng Sơn Ảnh" +msgstr "Tiềm Năng Sơn Hình Ảnh" msgid "Has Accumulate" -msgstr "Có Tích Trữ" +msgstr "Có Tính Tích Lũy" msgid "Has Color" -msgstr "Có Màu" +msgstr "Có Màu Sắc" msgid "Has Radius" @@ -3632,59 +4012,59 @@ msgstr "Có Bán Kính" msgid "Has Space Attenuation" -msgstr "Có Suy Giảm Trong Không Gian" +msgstr "Có khả năng Suy Giảm Dần theo Khoảng Trống" msgid "Sculpt Capabilities" -msgstr "Khả Năng Khắc" +msgstr "Điêu Khắc: Tiềm Năng" msgid "Read-only indications of which brush operations are supported by the current sculpt tool" -msgstr "Chỉ thao tác nào của bút được dụng cụ khắc hiện tại được hỗ trợ " +msgstr "Dấu hiệu biểu thị những thao tác nào đầu bút điêu khắc hiện tại hỗ trợ" msgid "Has Auto Smooth" -msgstr "Có Mịn Tự Động" +msgstr "Tự Động Làm Mịn" msgid "Has Direction" -msgstr "Có Hướng" +msgstr "Hữu Hướng" msgid "Has Gravity" -msgstr "Có Hấp Dẫn" +msgstr "Có Trọng Lực" msgid "Has Height" -msgstr "Có Bề Cao" +msgstr "Có Chiều Cao" msgid "Has Jitter" -msgstr "Có Hốt Hoảng" +msgstr "Có Biến Động" msgid "Has Crease/Pinch Factor" -msgstr "Có Hệ Số Nhăn/Ngắc" +msgstr "Có Hệ Số Miết Nếp Gấp/Nhúm" msgid "Has Persistence" -msgstr "Có Cố Chấp" +msgstr "Có Tính Ổn Định" msgid "Has Pinch Factor" -msgstr "Có Hệ Số Ngắc Nhéo" +msgstr "Có Hệ Số Nhúm" msgid "Has Plane Offset" -msgstr "Có Dịch Mặt Phẳng" +msgstr "Có sự Dịch Chuyển Bình Diện" msgid "Has Rake Factor" -msgstr "Có Hệ Số Kéo" +msgstr "Có Hệ Số Nghiêng Góc" msgid "Has Sculpt Plane" -msgstr "Có Mặt Phẳng Khắc" +msgstr "Có Bình Diện Điêu Khắc" msgid "Has Secondary Color" @@ -3692,31 +4072,31 @@ msgstr "Có Màu Phụ" msgid "Has Strength Pressure" -msgstr "Có Áp Suất Sức" +msgstr "Có Áp Lực làm Cường Độ" msgid "Has Tilt" -msgstr "Bị Nghiêng" +msgstr "Có Xoay Nghiêng" msgid "Has Topology Rake" -msgstr "Có Cây Cào Hình Dạng Học" +msgstr "Có Cấu Trúc Liên Kết Nghiêng Góc" msgid "Vertex Paint Capabilities" -msgstr "Khả Năng Sơn Đỉnh" +msgstr "Những Công Năng về Sơn Điểm Đỉnh" msgid "Weight Paint Capabilities" -msgstr "Khả Năng Sơn Quyền Lượng" +msgstr "Những Công Năng về Sơn Trọng Lượng" msgid "Has Weight" -msgstr "Có Quyền Lượng" +msgstr "Có Trọng Lượng" msgid "Curves Sculpt Brush Settings" -msgstr "Cài Đặt Bút Khắc Đường Cong" +msgstr "Điêu Khắc Đường Cong: Cài Đặt Đầu Bút" msgid "Count" @@ -3724,7 +4104,7 @@ msgstr "Số Lượng" msgid "Number of curves added by the Add brush" -msgstr "Thêm số lượng đường cong khi sử dụng bút Thêm" +msgstr "Số lượng đường cong được thêm vào bởi đầu bút Thêm" msgid "Curve Length" @@ -3732,55 +4112,63 @@ msgstr "Chiều Dài Đường Cong" msgid "Length of newly added curves when it is not interpolated from other curves" -msgstr "Độ dài của đường cong mới được thêm khi không nội suy từ các đường khác" +msgstr "Chiều dài của các đường cong mới được thêm vào khi nó không được nội suy từ các đường cong khác" + + +msgid "Curve Parameter Falloff" +msgstr "Suy Giảm Dần Tham Số Đường Cong" + + +msgid "Falloff that is applied from the tip to the root of each curve" +msgstr "Suy giảm dần được áp dụng từ đỉnh đến gốc của mỗi đường cong" msgid "Density Add Attempts" -msgstr "Sự Thử Thêm Tỉ Trọng" +msgstr "Số Lần Cho Thêm Mật Độ" msgid "How many times the Density brush tries to add a new curve" -msgstr "Số lần bút Tiô Trọng thử thêm một đường cong" +msgstr "Số lần đầu bút Mật Độ sẽ thử cho thêm một đường cong mới" msgid "Density Mode" -msgstr "Chế Độ Tỉ Trọng" +msgstr "Chế Độ Mật Độ" msgid "Determines whether the brush adds or removes curves" -msgstr "Cho đổi bút sẽ thêm hay xóa bớt đường cong" +msgstr "Xác định chức năng đầu bút sẽ là thêm vào hoặc tẩy xóa đi các đường cong" msgid "Either add or remove curves depending on the minimum distance of the curves under the cursor" -msgstr "Thêm hay xóa đường cong tùy theo khoảng cách cực tiểu của các đường cong dưới con trỏ" +msgstr "Hoặc là thêm vào, hoặc tẩy xóa đi các đường cong, dựa trên khoảng cách tối thiểu của các đường cong nằm dưới con trỏ" msgid "Add new curves between existing curves, taking the minimum distance into account" -msgstr "Thêm đường cong mới giữa đường cong đang tồn tại, và áp dụng khoảng cách cực tiểu" +msgstr "Thêm các đường cong mới giữa các đường cong hiện có, suy xét đến khoảng cách tối thiểu" msgid "Remove" -msgstr "Xóa" +msgstr "Xóa/Loại Bỏ" msgid "Remove curves whose root points are too close" -msgstr "Xóa các đường cong có rễ" +msgstr "Loại bỏ các đường cong có điểm gốc quá gần" msgid "Interpolate Length" -msgstr "Độ Dài Nội Suy" +msgstr "Chiều Dài Nội Suy" msgid "Use length of the curves in close proximity" -msgstr "Dùng độ dài của những đường cong gần xung quanh" +msgstr "Sử dụng chiều dài của các đường cong nằm gần kề" msgid "Interpolate Point Count" -msgstr "Nội Suy Số Lượng Điểm" +msgstr "Số Điểm Nội Suy" msgid "Use the number of points from the curves in close proximity" -msgstr "Dùng số lượng điểm từ các đường cong gần xung quanh" +msgstr "Sử dụng số điểm từ các đường cong nằm gần kề" msgid "Interpolate Shape" @@ -3788,7 +4176,7 @@ msgstr "Nội Suy Hình Dạng" msgid "Use shape of the curves in close proximity" -msgstr "Dùng hình dạng của những đường cong gần xung quanh" +msgstr "Sử dụng hình dạng của các đường cong nằm gần kề" msgid "Minimum Distance" @@ -3796,55 +4184,55 @@ msgstr "Khoảng Cách Tối Thiểu" msgid "Goal distance between curve roots for the Density brush" -msgstr "Koảnh cách mục tiêu giữa rễ đường cong cho bút Tỉ Trọng" +msgstr "Khoảng cách mục tiêu giữa các gốc đường cong cho đầu bút Mật Độ" msgid "Minimum Length" -msgstr "Độ Dài Cực Tiểu" +msgstr "Chiều Dài Tối Thiểu" msgid "Avoid shrinking curves shorter than this length" -msgstr "Tránh rút nhỏ những đường cong ngắn hơn độ dài này" +msgstr "Tránh thu nhỏ các đường cong ngắn hơn chiều dài này" msgid "Points per Curve" -msgstr "Điểm Từng Đường Cong" +msgstr "Số Điểm mỗi Đường Cong" msgid "Number of control points in a newly added curve" -msgstr "Số lượng điểm kiểm soát trong một đường cong mới thêm" +msgstr "Số điểm điều khiển trong một đường cong mới được thêm vào" msgid "Scale Uniform" -msgstr "Phóng To Đều" +msgstr "Đổi Tỷ Lệ Đồng Đều" msgid "Grow or shrink curves by changing their size uniformly instead of using trimming or extrapolation" -msgstr "Phình ra hay rút nhỏ đường cong bằng chỉng cỡ thước đều thay thế cắt bớt hay ngoại suy" +msgstr "Tăng lên hoặc thu nhỏ các đường cong bằng cách thay đổi kích thước của chúng một cách đồng nhất, thay vì sử dụng phương pháp cắt tỉa đi hoặc ngoại suy" msgid "Grease Pencil Brush Settings" -msgstr "Cài Đặt Bút Sáp" +msgstr "Cài Đặt về Đầu Bút Chì Dầu" msgid "Settings for grease pencil brush" -msgstr "Cài đặt cho bút sáp" +msgstr "Cài đặt của đầu Bút Chì Dầu" msgid "Active Smooth" -msgstr "Mịn Hóa Hoạt Động" +msgstr "Năng Động Làm Mịn" msgid "Amount of smoothing while drawing" -msgstr "Mức mịn hóa khi vẽ" +msgstr "Lượng làm mịn trong khi đang vẽ" msgid "Angle" -msgstr "Góc" +msgstr "Góc Độ" msgid "Direction of the stroke at which brush gives maximal thickness (0° for horizontal)" -msgstr "Hướng của nét khi bút được vẽ rộng nhất (0 cho ngang)" +msgstr "Hướng của nét vẽ mà đầu bút sẽ cho độ dày lớn nhất (0° = chiều ngang)" msgid "Angle Factor" @@ -3852,11 +4240,11 @@ msgstr "Hệ Số Góc" msgid "Reduce brush thickness by this factor when stroke is perpendicular to 'Angle' direction" -msgstr "Giảm bề rộng bút bằng hệ số này khi vẽ nét vuông góc với hướng 'Góc'" +msgstr "Giảm độ dày của đầu bút bằng hệ số này khi nét vẽ nằm vuông góc với hướng của 'Góc'" msgid "Aspect" -msgstr "Tỉ Cạnh" +msgstr "Tỷ Lệ Tương Quan" msgid "Mode" @@ -3864,43 +4252,58 @@ msgstr "Chế Độ" msgid "Preselected mode when using this brush" -msgstr "Chế độ đã đặt sẵn khi dùng bút này" +msgstr "Chế độ đã chọn trước khi sử dụng đầu bút này" msgid "Active" -msgstr "Hoạt Động" +msgstr "Đang/Hoạt Động/Năng Động" msgid "Use current mode" -msgstr "Dùng Chế Độ Hiện Tại" +msgstr "Sử dụng chế độ hiện tại" msgid "Material" -msgstr "Vật Liệu" +msgstr "Nguyên Vật Liệu" msgid "Use always material mode" -msgstr "Lần nào cũng dùng chế độ vật liệu" +msgstr "Luôn luôn sử dụng chế độ nguyên vật liệu" msgid "Vertex Color" -msgstr "Màu Đỉnh" +msgstr "Màu Điểm Đỉnh" msgid "Use always Vertex Color mode" -msgstr "Lần nào cũng dùng chế độ Màu Đỉnh" +msgstr "Luôn luôn sử dụng chế độ Màu Điểm Đỉnh" + + +msgctxt "GPencil" +msgid "Caps Type" +msgstr "Kiểu Nắp Đầu" msgid "The shape of the start and end of the stroke" -msgstr "Hình dạng của đầu và cuối cùng của nét" +msgstr "Hình dạng của đầu khởi và đầu kết của nét" + + +msgctxt "GPencil" +msgid "Round" +msgstr "Tròn" + + +msgctxt "GPencil" +msgid "Flat" +msgstr "Phẳng" msgid "Curve Jitter" -msgstr "Đường Cong Hốt Hoảng" +msgstr "Đường Cong Biến Động" msgid "Curve used for the jitter effect" -msgstr "Đường cong được sử dụng cho hiệu ứng hốt hoảng" +msgstr "Đường Cong sử dụng cho hiệu ứng biến động" msgid "Random Curve" @@ -3908,59 +4311,59 @@ msgstr "Đường Cong Ngẫu Nhiên" msgid "Curve used for modulating effect" -msgstr "Đường cong được sử dụng cho biến dạng hiệu ứng" +msgstr "Đường cong sử dụng để điều chế hiệu ứng" msgid "Curve Sensitivity" -msgstr "Đường Cong Độ Nhạy Cảm" +msgstr "Đường Cong về Độ Nhạy Cảm" msgid "Curve used for the sensitivity" -msgstr "Đường cong được sử dụng cho độ nhạy cảm" +msgstr "Đường cong dùng cho độ nhạy cảm" msgid "Curve Strength" -msgstr "Đường Cong Sức" +msgstr "Đường Cong về Cường Độ" msgid "Curve used for the strength" -msgstr "Đường cong được sử dụng cho sức" +msgstr "Đường cong dùng cho cường độ" msgid "Dilate/Contract" -msgstr "Rút Nhỏ/Kéo Nhỏ" +msgstr "Nở Giãn Ra/Co Lại" msgid "Number of pixels to expand or contract fill area" -msgstr "Số lượng điểm ảnh cho nở ra hay rút nhỏ khu vực đầy lại" +msgstr "Số lượng điểm ảnh để nới rộng ra hoặc co rút lại diện tích tô phủ" msgid "Direction" -msgstr "Hướng" +msgstr "Chiều Hướng" msgid "Add effect of brush" -msgstr "Thêm hiệu ứng của bút" +msgstr "Thêm hiệu ứng của đầu bút" msgid "Subtract effect of brush" -msgstr "Trừ hiệu ứng của bút" +msgstr "Khấu Trừ hiệu ứng của đầu bút" msgid "Eraser Mode" -msgstr "Chế Độ Cục Gôm" +msgstr "Chế Độ Tẩy" msgid "Dissolve" -msgstr "Hòa Tan" +msgstr "Tiêu Hủy" msgid "Erase strokes, fading their points strength and thickness" -msgstr "Xóa nét, phai sức và bề rộng của các điểm của các nét" +msgstr "Xóa các nét vẽ, làm nhòe mờ đi độ đậm của các điểm và độ dày của chúng" msgid "Erase stroke points" -msgstr "Kéo ra điểm nét" +msgstr "Xóa các điểm của nét vẽ" msgid "Stroke" @@ -3968,39 +4371,43 @@ msgstr "Nét Vẽ" msgid "Erase entire strokes" -msgstr "Xóa nét toàn bộ" +msgstr "Xóa toàn bộ các nét vẽ" msgid "Affect Stroke Strength" -msgstr "Sức Ảnh Hưởng Nét" +msgstr "Tác Động Độ Đậm của Nét Vẽ" msgid "Amount of erasing for strength" -msgstr "Mức bôi cho sức" +msgstr "Lượng xóa cho độ đậm" msgid "Affect Stroke Thickness" -msgstr "Ảnh Hưởng Bề Dày" +msgstr "Tác Động Độ Dày của Nét Vẽ" msgid "Amount of erasing for thickness" -msgstr "Mức bôi cho bề dày" +msgstr "Lượng xóa cho chiều dày" + + +msgid "Closure Size" +msgstr "Kích Thước Đóng Kín" msgid "Strokes end extension for closing gaps, use zero to disable" -msgstr "Kéo ra kết thúc của nét để đầy lỗ hở, đặt = 0 cho tắt" +msgstr "Nới phần kết thúc của nét ra để lấp kín các khoảng trống, sử dụng giá trị 0 để tắt đi" msgid "Direction of the fill" -msgstr "Hướng cho tô đầy" +msgstr "Chiều hướng tô phủ" msgid "Normal" -msgstr "Bình Thường" +msgstr "Pháp Tuyến/B.Thg" msgid "Fill internal area" -msgstr "Tô đầy vùng nội bộ" +msgstr "Phủ kín khu vực bên trong" msgid "Inverted" @@ -4008,91 +4415,107 @@ msgstr "Đảo Nghịch" msgid "Fill inverted area" -msgstr "Tô đầy vùng nội bộ" +msgstr "Phủ kín vùng đảo ngược" msgid "Mode to draw boundary limits" -msgstr "Chế độ để vẽ giới hạn ranh giới" +msgstr "Chế độ vẽ vùng giới hạn của diện tích" msgid "Use both visible strokes and edit lines as fill boundary limits" -msgstr "Dùng các nét hiện và biên tập nét để tô đầy giới hạn ranh giới" +msgstr "Sử dụng cả hai, các nét vẽ nhìn thấy được và các đường biên soạn, làm biên giới khoanh vùng tô kín" msgid "Strokes" -msgstr "Nét" +msgstr "Nét Vẽ" msgid "Use visible strokes as fill boundary limits" -msgstr "Dùng các nét hiện để tô đầy giới hạn ranh giới" +msgstr "Dùng các nét vẽ nhìn thấy được làm giới hạn cho diện tích tô kín" msgid "Edit Lines" -msgstr "Nét Biên Tập" +msgstr "Nét Biên Soạn" msgid "Use edit lines as fill boundary limits" -msgstr "Dùng nét biên tập để tô đầy giới hạn ranh giới" +msgstr "Sử dụng các nét biên soạn làm giới hạn khoanh vùng tô kín" + + +msgid "Closure Mode" +msgstr "Chế Độ Khép Kín" + + +msgid "Types of stroke extensions used for closing gaps" +msgstr "Kiểu nới nét vẽ sử dụng để khép kín các khoảng trống" + + +msgid "Extend strokes in straight lines" +msgstr "Kéo dài các nét theo đường thẳng" msgid "Radius" msgstr "Bán Kính" +msgid "Connect endpoints that are close together" +msgstr "Kết nối các điểm cuối nằm gần nhau" + + msgid "Precision" -msgstr "Độ Chính Xác" +msgstr "Độ/Chính Xác" msgid "Factor for fill boundary accuracy, higher values are more accurate but slower" -msgstr "Hệ số cho tô ranh giới chích xác, giá trị càng cao càng chính xác nhưng chậm hơn" +msgstr "Hệ số dành cho độ chính xác về ranh giới của vùng tô phủ, giá trị cao hơn thì sẽ chính xác hơn, nhưng chậm hơn" msgid "Layer Mode" -msgstr "Chế Độ Lớp" +msgstr "Chế Độ Tầng Lớp" msgid "Layers used as boundaries" -msgstr "Dùng lớp làm ranh giới" +msgstr "Các tầng lớp được sử dụng như các đường ranh giới" msgid "Visible layers" -msgstr "Lớp hiện" +msgstr "Những tầng lớp nhìn thấy được" msgid "Only active layer" -msgstr "Chỉ lớp hoạt động" +msgstr "Duy tầng lớp đang hoạt động" msgid "Layer Above" -msgstr "Lớp Trên" +msgstr "Tầng Nằm Trên" msgid "Layer above active" -msgstr "Lớp trên lớp hoạt động" +msgstr "Tầng nằm trên cái đang hoạt động" msgid "Layer Below" -msgstr "Lớp Dưới" +msgstr "Tầng Nằm Dưới" msgid "Layer below active" -msgstr "Lớp dưới lớp hoạt động" +msgstr "Tầng nằm dưới cái đang hoạt động" msgid "All Above" -msgstr "Hết Phía Trên" +msgstr "Toàn Bộ Phía Trên" msgid "All layers above active" -msgstr "Hết lớp ở phía trên lớp hoạt động" +msgstr "Toàn bộ các tầng nằm trên cái đang hoạt động" msgid "All Below" -msgstr "Hết Phía Dưới" +msgstr "Toàn Bộ Phía Dưới" msgid "All layers below active" -msgstr "Hết lớp ở phía dưới lớp hoạt động" +msgstr "Toàn bộ các tầng nằm dưới cái đang hoạt động" msgid "Simplify" @@ -4100,7 +4523,7 @@ msgstr "Đơn Giản Hóa" msgid "Number of simplify steps (large values reduce fill accuracy)" -msgstr "Số lượng bước cho đơn giản hóa (giá trị lớn giảm độ chính xác tô đầy)" +msgstr "Số bước đơn giản hóa (giá trị lớn làm giảm độ chuẩn xác trong việc tô kín)" msgid "Threshold" @@ -4108,15 +4531,15 @@ msgstr "Ngưỡng" msgid "Threshold to consider color transparent for filling" -msgstr "Ngưỡng cho chấp nhận màu là trong suốt khi tô đầy màu" +msgstr "Ngưỡng dùng để tính độ trong suốt của màu khi tô kín" msgid "Grease Pencil Icon" -msgstr "Biểu Tượng Bút Sáp" +msgstr "Biểu Tượng Bút Chì Dầu" msgid "Pencil" -msgstr "Bút Sáp" +msgstr "Bút Chì" msgid "Pen" @@ -4124,43 +4547,93 @@ msgstr "Bút" msgid "Ink" -msgstr "Mực" +msgstr "Ngòi Mực" msgid "Ink Noise" -msgstr "Huyên Náo Mực" +msgstr "Nhiễu của Ngòi Mực" msgid "Block" -msgstr "Cục" +msgstr "Bút Dạ Ngòi Dày" msgid "Marker" -msgstr "Ký Hiệu" +msgstr "Dấu Mốc/Bút Dạ" msgid "Airbrush" -msgstr "Bút Xịt" +msgstr "Đầu Phun Sơn" msgid "Chisel" -msgstr "Cái Đục" +msgstr "Bút Dạ Ngòi Cứng/Vát" msgid "Fill" -msgstr "Tô Đầy" +msgstr "Vùng/Tô Phủ Kín/Lấp Đầy" msgid "Eraser Soft" -msgstr "Cục Gôm Mềm" +msgstr "Tẩy Mềm" msgid "Eraser Hard" -msgstr "Cục Gôm Cứng" +msgstr "Tẩy Cứng" msgid "Eraser Stroke" -msgstr "Nét Cục Gôm" +msgstr "Tẩy Nét" + + +msgctxt "GPencil" +msgid "Grease Pencil Icon" +msgstr "Biểu Tượng Bút Chì Dầu" + + +msgctxt "GPencil" +msgid "Smooth" +msgstr "Làm Mịn" + + +msgctxt "GPencil" +msgid "Thickness" +msgstr "Độ Dày" + + +msgctxt "GPencil" +msgid "Strength" +msgstr "Cường Độ" + + +msgctxt "GPencil" +msgid "Randomize" +msgstr "Ngẫu nhiên" + + +msgctxt "GPencil" +msgid "Grab" +msgstr "Túm Nắm" + + +msgctxt "GPencil" +msgid "Push" +msgstr "Đẩy" + + +msgctxt "GPencil" +msgid "Twist" +msgstr "Xoắn" + + +msgctxt "GPencil" +msgid "Pinch" +msgstr "Nhúm" + + +msgctxt "GPencil" +msgid "Clone" +msgstr "Rập Khuôn" msgid "Draw" @@ -4168,11 +4641,11 @@ msgstr "Vẽ" msgid "Blur" -msgstr "Mờ" +msgstr "Làm Nhòe Mờ" msgid "Smear" -msgstr "Nhẹp" +msgstr "Bôi Nhòe" msgid "Hardness" @@ -4180,267 +4653,313 @@ msgstr "Độ Cứng" msgid "Gradient from the center of Dot and Box strokes (set to 1 for a solid stroke)" -msgstr "Chuyển sắc từ trung tâm của nét Chấm và Hộp (đặt bằng 1 cho nét màu đều)" +msgstr "Dốc màu từ trung tâm của các nét vẽ kiểu Chấm Tròn hoặc Hình Hộp (Vuông) (đặt bằng 1 để nét vẽ hoàn toàn đặc)" msgid "Input Samples" -msgstr "Mẫu Vật Ngõ Vào" +msgstr "Mẫu Vật Cung Cấp" msgid "Generate intermediate points for very fast mouse movements. Set to 0 to disable" -msgstr "Chế tạo điểm giữa khi chuột di chuyển rất nhanh. Đặt bằng 0 để tắt" +msgstr "Sinh tạo các điểm trung gian để làm cho chuột di chuyển nhanh. Đặt thành 0 để tắt đi" msgid "Material used for strokes drawn using this brush" -msgstr "Vật Liệu được sử dụng cho vẽ nét với bút này" +msgstr "Nguyên vật liệu sử dụng cho các nét vẽ dùng đầu bút này" + + +msgid "Material used for secondary uses for this brush" +msgstr "Nguyên vật liệu sử dụng cho mục đích dùng làm nguồn bổ sung thứ cấp cho đầu bút này" msgid "Thickness" -msgstr "Bề Dày" +msgstr "Độ Dày" + + +msgid "Thickness of the outline stroke relative to current brush thickness" +msgstr "Độ dày của nét viền tương đối với độ dày của đầu bút hiện tại" + + +msgctxt "Brush" +msgid "Jitter" +msgstr "Biến Động" msgid "Jitter factor for new strokes" -msgstr "Hệ số hốt hoảng cho nét mới" +msgstr "Hệ số biến động cho những nét mới" + + +msgctxt "Amount" +msgid "Smooth" +msgstr "Làm Mịn" msgid "Amount of smoothing to apply after finish newly created strokes, to reduce jitter/noise" -msgstr "Mức mịn hóa để áp dụng với nét mới vẽ, cho giảm hốt hoảng/huyên náo" +msgstr "Lượng làm mịn/trơn tru áp dụng sau khi hoàn thành các nét vẽ mới kiến tạo, để thuyên giảm biến động/nhiễu" msgid "Iterations" -msgstr "Lặp Lại" +msgstr "Số Lần Lặp Lại" msgid "Number of times to smooth newly created strokes" -msgstr "Số lần làm mịn hóa cho nét mới vẽ" +msgstr "Số lần làm mịn/trơn tru những nét vẽ mới" msgid "Color strength for new strokes (affect alpha factor of color)" -msgstr "Sức màu cho nét mới (nó ảnh hưởng độ đục màu)" +msgstr "Sức đậm của màu cho những nét vẽ mới (tác động phần tử alpha của màu)" msgid "Subdivision Steps" -msgstr "Bước Phân Hóa" +msgstr "Số Phân Đoạn" msgid "Number of times to subdivide newly created strokes, for less jagged strokes" -msgstr "Số lần cho phân hóa nét mới chế tạo, cho giảm nét hốt hoảng" +msgstr "Số lần nét vẽ mới được chia nhỏ ra, hòng làm giảm độ lởm chởm trong những nét vẽ" msgid "Pin Mode" -msgstr "Chế Độ Ghìm" +msgstr "Ghim Chế Độ" msgid "Pin the mode to the brush" -msgstr "Ghìm chế đồ đến bút sáp" +msgstr "Ghim chế độ vào đầu bút" msgid "Hue" -msgstr "Màu Sắc" +msgstr "Sắc Màu" msgid "Random factor to modify original hue" -msgstr "Hệ số ngẫu nhiên để ảnh hưởng màu sắc ban đầu" +msgstr "Hệ số ngẫu nhiên để biến đổi sắc màu gốc" msgid "Pressure Randomness" -msgstr "Mức Ngẫu Nhiên Áp Suất" +msgstr "Áp Lực Ngẫu Nhiên" msgid "Randomness factor for pressure in new strokes" -msgstr "Hế số ngẫu nhiên của áp suất khi vẽ nét mới" +msgstr "Hệ số ngẫu nhiên cho áp lực trong các nét vẽ mới" msgid "Saturation" -msgstr "Độ Tươi" +msgstr "Độ Bão Hòa" msgid "Random factor to modify original saturation" -msgstr "Hệ số ngẫu nhiên để ảnh hưởng độ tươi ban đầu" +msgstr "Hệ số ngẫu nhiên để chỉnh sửa mức độ bão hòa (độ tươi/xỉn) gốc" msgid "Strength Randomness" -msgstr "Sức Ngẫu Nhiên" +msgstr "Sức Mạnh Ngẫu Nhiên" msgid "Randomness factor strength in new strokes" -msgstr "Hệ số ngẫu nhiên của sức khi vẽ nét mới" +msgstr "Hệ số ngẫu nhiên cho độ đậm của các nét vẽ mới" msgid "Random factor to modify original value" -msgstr "Hệ số ngẫu nhiên để ảnh hưởng giá trị ban đầu" +msgstr "Hệ số ngẫu nhiên để sửa đổi giá trị gốc" msgid "Show Fill" -msgstr "Hiện Tô Đầy" +msgstr "Hiển Thị Vùng Tô Kín" msgid "Show transparent lines to use as boundary for filling" -msgstr "Hiện nét trong suốt để làm ranh giới cho tô đầy" +msgstr "Hiển thị các nét trong mờ dùng làm ranh giới để tô kín" msgid "Show Lines" -msgstr "Hiện Nét" +msgstr "Hiển Thị Đường Viền" msgid "Show help lines for filling to see boundaries" -msgstr "Hiện nét giúp đỡ cho tô đầy để nhìn thấy các ranh giới" +msgstr "Hiển thị các đường viền trợ giúp để quá trình tô kín trông thấy ranh giới của mình" + + +msgid "Visual Aids" +msgstr "Hỗ Trợ Trực Quan" msgid "Show help lines for stroke extension" -msgstr "Hiện đường dẫn cho kéo dài đường nét" +msgstr "Hiện các đường trợ giúp nới nét vẽ ra" msgid "Show Lasso" -msgstr "Hiện Dây Trói" +msgstr "Hiển Thị Dây Thòng Lọng" msgid "Do not display fill color while drawing the stroke" -msgstr "Không hiển thị màu tô đầy khi vẽ nét" +msgstr "Không hiển thị màu tô kín trong khi đang vẽ nét" msgid "Factor of Simplify using adaptive algorithm" -msgstr "Hế số cho Đơn Giản Hóa đang dùng giải thuật ứng phó" +msgstr "Hệ số cho quá trình Đơn Giản Hóa dùng thuật toán tùy ứng/ứng đối/thích nghi (adaptive algorithm)" msgid "Active Layer" -msgstr "Lớp Hoạt Động" +msgstr "Tầng Lớp đang Hoạt Động" + + +msgid "Only edit the active layer of the object" +msgstr "Chỉ biên soạn tầng lớp đang hoạt động của đối tượng mà thôi" + + +msgid "Strokes Collision" +msgstr "Nét Vẽ Va Chạm Nhau" + + +msgid "Check if extend lines collide with strokes" +msgstr "Kiểm tra xem các đường nới dài có va chạm với các nét vẽ hay không" msgid "Default Eraser" -msgstr "Cục Gôm Mặc Định" +msgstr "Bút Tẩy Mặc Định" msgid "Use this brush when enable eraser with fast switch key" -msgstr "Sử dụng bút này khi bật cục gôm với phím trao đổi nhanh" +msgstr "Dùng đầu bút này khi cho phép (bật) tẩy/xóa với khóa chuyển đổi nhanh" msgid "Affect Position" -msgstr "Ảnh Hưởng Vị Trí" +msgstr "Tác Động Vị Trí" msgid "The brush affects the position of the point" -msgstr "Bút sẽ ảnh hướng vị trí của điểm" +msgstr "Đầu bút sẽ tác động tới vị trí của điểm" msgid "Affect Strength" -msgstr "Sức Ảnh Hưởng" +msgstr "Tác Động vào Độ Đậm/Sức Mạnh/Cường Độ" msgid "The brush affects the color strength of the point" -msgstr "Bút được ảnh hưởng sức màu của điểm" +msgstr "Bút sẽ tác động vào cường độ của màu của điểm" msgid "Affect Thickness" -msgstr "Ảnh Hưởng Bề Rộng" +msgstr "Tác Động Độ Dày" msgid "The brush affects the thickness of the point" -msgstr "Bút sẽ ảnh hượng bề rộng của điểm" +msgstr "Đầu bút sẽ tác động đến độ dày của điểm" msgid "Affect UV" -msgstr "Ảnh Hưởng UV" +msgstr "Tác Động UV" msgid "The brush affects the UV rotation of the point" -msgstr "Bút được ảnh hướng xoay UV của điểm" +msgstr "Đầu bút tác động sự xoay chiều UV của điểm" msgid "Limit to Viewport" -msgstr "Hạn Chế trong Màn Chiếu" +msgstr "Giới Hạn trong Cổng Nhìn" msgid "Fill only visible areas in viewport" -msgstr "Chỉ đầy các khu vực đang hiển thị trong màn chiếu" +msgstr "Chỉ cho phép tô kín các khu vực nhìn thấy được trong cổng nhìn mà thôi" msgid "Use Pressure Jitter" -msgstr "Sử Dụng Hốt Hoảng Áp Suất" +msgstr "Sử Dụng Biến Động Áp Lực" msgid "Use tablet pressure for jitter" -msgstr "Sử dụng áp suất bảng vẽ cho hốt hoảng" +msgstr "Dùng áp lực bảng vẽ làm biến động" + + +msgid "Keep caps" +msgstr "Giữ nắp đầu" + + +msgid "Keep the caps as they are and don't flatten them when erasing" +msgstr "Duy trì các nắp đầu nguyên xi và không dát phẳng chúng khi xóa đi" msgid "Pin Material" -msgstr "Vật Liệu Đinh" +msgstr "Ghim Nguyên Vật Liệu Lại" msgid "Keep material assigned to brush" -msgstr "Giữ vật liệu được chỉ định cho bút" +msgstr "Duy trì sự ấn định của nguyên vật liệu cho đầu bút" msgid "Occlude Eraser" -msgstr "Che Khuất Cục Gôm" +msgstr "Tẩy tránh Vùng Che Khuất" msgid "Erase only strokes visible and not occluded" -msgstr "Chỉ bôi nét được hiện và không bị che khuất" +msgstr "Chỉ tẩy xóa các nét vẽ nhìn thấy được và không làm đối với những cái bị che khuất" msgid "Use Pressure" -msgstr "Sử Dụng Áp Suất" +msgstr "Sử Dụng Áp Lực" msgid "Use tablet pressure" -msgstr "Sử dụng áp suất bảng vẽ" +msgstr "Dùng áp lực bảng vẽ" msgid "Use pressure to modulate randomness" -msgstr "Dùng áp suất để ảnh hưởng độ ngẫu nhiên" +msgstr "Sử dụng áp lực để điều chế mức ngẫu nhiên hóa" msgid "Outline" -msgstr "Nét Ngoài" +msgstr "Đường Viền" + + +msgid "Convert stroke to perimeter" +msgstr "Chuyển đổi nét vẽ thành đường viền chu vi" msgid "Use Post-Process Settings" -msgstr "Sử Dụng Cài Đặt Qúa Trình Sau" +msgstr "Dùng Sắp Đặt Xử Lý Hậu Kỳ" msgid "Additional post processing options for new strokes" -msgstr "Tùy chọn thêm cho qúa trình sau cho nét mới" +msgstr "Những tùy chọn xử lý hậu kỳ bổ sung cho các nét vẽ mới" msgid "Random Settings" -msgstr "Cài Đặt Ngẫu Nhiên" +msgstr "Sắp Đặt về Ngẫu nhiên" msgid "Random brush settings" -msgstr "Cài đặt bút ngẫu nhiên" +msgstr "Cài đặt về sự ngẫu nhiên hóa của đầu bút" msgid "Use Stabilizer" -msgstr "Sử Dụng Ổ Định Hóa" +msgstr "Sử Dụng Trình Ổn Định Hóa" msgid "Draw lines with a delay to allow smooth strokes. Press Shift key to override while drawing" -msgstr "Vẽ nét mà chờ đợi một lác để vẽ nét mịn hơn. Bấm phím Shift để tắt khi vẽ" +msgstr "Vẽ các đường với một chú trì chệ để cho phép các nét được nắn mượt. Bấm phím Shift trong khi vẽ để vượt quyền" msgid "Use Pressure Strength" -msgstr "Dùng Sức Áp Suất" +msgstr "Dùng Sức Mạnh của Áp Lực" msgid "Use tablet pressure for color strength" -msgstr "Dùng áp suất bảng vẽ cho sức màu" +msgstr "Dùng áp lực của bảng vẽ làm cường độ màu" msgid "Stroke Random" -msgstr "Nét Ngẫu Nhiên" +msgstr "Ngẫu Nhiên Hóa Nét" msgid "Use randomness at stroke level" -msgstr "Dùng độ ngấu nhiên tại mức nét" +msgstr "Sử dụng sự ngẫu nhiên hóa ở mức nét vẽ" msgid "Trim Stroke Ends" -msgstr "Cắt Kết Thúc Nét" +msgstr "Cắt Gọn Đầu của Nét Vẽ" msgid "Trim intersecting stroke ends" -msgstr "Cắt kết thúc nét đang giao cắt nhau" +msgstr "Cắt gọn các đầu của nét vẽ giao cắt" msgid "UV Random" @@ -4448,119 +4967,128 @@ msgstr "UV Ngẫu Nhiên" msgid "Random factor for auto-generated UV rotation" -msgstr "Hệ số ngẫu nhiên cho xoay UV tự động chế tạo" +msgstr "Hệ số ngẫu nhiên dành cho việc xoay chiều UV tự động" msgid "Vertex Color Factor" -msgstr "Hệ Số Màu Đỉnh" +msgstr "Hệ Số Màu Điểm Đỉnh" msgid "Factor used to mix vertex color to get final color" -msgstr "Hệ số sử dụng để pha trộn màu đỉnh cho được màu cuối" +msgstr "Hệ số sử dụng để hòa trộn màu điểm đỉnh, hòng đạt được màu sắc cuối cùng" msgid "Mode Type" -msgstr "Loại Chế Độ" +msgstr "Chế Độ" msgid "Defines how vertex color affect to the strokes" -msgstr "Chỉ định phương pháp màu được ảnh hưởng các nét" +msgstr "Xác định ảnh hưởng của màu điểm đỉnh đến nét vẽ thế nào" msgid "Vertex Color affects to Stroke only" -msgstr "Màu Đỉnh chỉ được ảnh hưởng Nét" +msgstr "Màu Điểm Đỉnh chỉ tác động đến Nét Vẽ mà thôi" msgid "Vertex Color affects to Fill only" -msgstr "Màu Đỉnh chỉ được ảnh hưởng Tô Đầy" +msgstr "Màu điểm đỉnh chỉ tác động đến vùng Tô Kín (Fill) mà thôi" msgid "Stroke & Fill" -msgstr "Nết & Tô" +msgstr "Nét Vẽ và Vùng Tô Kín" msgid "Vertex Color affects to Stroke and Fill" -msgstr "Màu Đỉh chỉ được ảnh hưởng Nét và Tô Đầy" +msgstr "Màu Điểm Đỉnh tác động đến cả Nét Vẽ và vùng Tô Kín" msgid "Byte Color Attribute Value" -msgstr "Giá Trị Đặc Điểm Màu Byte" +msgstr "Giá Trị Thuộc Tính của Màu Byte" msgid "Color value in geometry attribute" -msgstr "Giá trị của màu trong đặc điểm hình dạng" +msgstr "Giá trị màu trong thuộc tính hình học" msgid "RGBA color in scene linear color space" -msgstr "Màu RGBA trong không gian màu bậc một của cảnh" +msgstr "Màu đỏ, lục, lam, alpha (RGBA) trong không gian màu tuyến tính" + + +msgid "RGBA color in sRGB color space" +msgstr "Màu RGBA trong không gian màu sRGB" msgid "8-bit Integer Attribute Value" -msgstr "Giá Trị Đặc Điểm Số Nguyên 8 Bit" +msgstr "Giá Trị Thuộc Tính Số Nguyên 8 bit" msgid "8-bit value in geometry attribute" -msgstr "Giá trị 8 bit trong đặc điểm hình dạng" +msgstr "Giá trị 8 bit trong thuộc tính hình học" msgid "Cache Layer" -msgstr "Lớp Đệm Chứa" +msgstr "Tầng Lớp Bộ Nhớ Đệm" msgid "Layer of the cache, used to load or override data from the first the first layer" -msgstr "Lớp của đệm chứa, sử dụng cho nhập hay vượt quyền dữ liệu từ lớp thứ nhất" +msgstr "Tầng lớp của bộ nhớ đệm, sử dụng để nạp hoặc vượt quyền dữ liệu từ tầng lớp đầu tiên" msgid "Path to the archive" -msgstr "Đường dẫn đến kho chứa" +msgstr "Đường dẫn đến kho lưu trữ" msgid "Hide Layer" -msgstr "Ẩn Lớp" +msgstr "Ẩn Giấu Tầng Lớp" msgid "Do not load data from this layer" -msgstr "Không nhập lại dữ liệu từ lớp này" +msgstr "Không được nạp dữ liệu từ tầng lớp này" msgid "Cache Layers" -msgstr "Các Lớp Đệm Chứa" +msgstr "Các Tầng Lớp Bộ Nhớ Đệm" msgid "Collection of cache layers" -msgstr "Sưu tập lớp đệm chứa" +msgstr "Bộ sưu tập của các tầng lớp bộ nhớ đệm" msgid "Active layer of the CacheFile" -msgstr "Lớp hoạt động của TậpTinĐệmChứa" +msgstr "Tầng đang hoạt động của Tập Tin Bộ Nhớ Đệm" msgid "Object Path" -msgstr "Đường Dẫn Vật Thể" +msgstr "Đường Dẫn Đối Tượng" msgid "Path of an object inside of an Alembic archive" -msgstr "Đường dẫn của một vật thể ở trong một kho Alembic" +msgstr "Đường dẫn của đối tượng trong kho Alembic" + + +msgctxt "File browser" +msgid "Path" +msgstr "Đường Dẫn" msgid "Object path" -msgstr "Dường dẫn vật thể" +msgstr "Đường dẫn đến đối tượng" msgid "Object Paths" -msgstr "Đường Dẫn Vật Thể" +msgstr "Đường Dẫn đến Đối Tượng" msgid "Collection of object paths" -msgstr "Sưu tập đường dẫn vật thể" +msgstr "Bộ sưu tập các đường dẫn đến đối tượng" msgid "Background Image" -msgstr "Ảnh Nền" +msgstr "Hình Ảnh Nền" msgid "Image and settings for display in the 3D View background" -msgstr "Ảnh và cài đặt cho chiếu ảnh trong nền của Màn 3D" +msgstr "Hình Ảnh và các sắp đặt hiển thị trong nền của Cổng Nhìn 3D" msgid "Opacity" @@ -4568,131 +5096,150 @@ msgstr "Độ Đục" msgid "Image opacity to blend the image against the background color" -msgstr "Độ đục của ảnh để pha trộn với màu nền" +msgstr "Độ đục của hình ảnh để pha trộn với màu nền" msgid "MovieClip" -msgstr "Khúc Phim" +msgstr "Đoạn Phim" msgid "Movie clip displayed and edited in this space" -msgstr "Khúc phim được hiển thị và biên tập trong không gian này" +msgstr "Đoạn phim đã được hiển thị và biên soạn trong vùng này" msgid "Clip User" -msgstr "Đồ Dùng Khúc Phim" +msgstr "Người Dùng của Đoạn Phim" msgid "Parameters defining which frame of the movie clip is displayed" -msgstr "Tham số cho xác định bức ảnh nào của khúc phim được hiển thị" +msgstr "Tham số xác định khung hình nào của đoạn phim sẽ được hiển thị" + + +msgctxt "Camera" +msgid "Depth" +msgstr "Chiều Sâu" msgid "Display under or over everything" -msgstr "Hiển thị ở dưới hay trên tất cả" +msgstr "Hiển thị ở dưới hoặc ở trên toàn bộ mọi thứ" + + +msgctxt "Camera" +msgid "Back" +msgstr "Sau" + + +msgctxt "Camera" +msgid "Front" +msgstr "Trước" msgid "Frame Method" -msgstr "Phương Pháp Khung" +msgstr "Phương Pháp Khung Hình" msgid "How the image fits in the camera frame" -msgstr "Phương pháp vừa ảnh vào khung máy quay phim" +msgstr "Phương pháp đặt hình ảnh khít vào khung hình của máy quay phim" msgid "Stretch" -msgstr "Kéo" +msgstr "Kéo Giãn" msgid "Fit" -msgstr "Vừa" +msgstr "Khít Vừa" msgid "Crop" -msgstr "Cắt" +msgstr "Cắt Xén" msgid "Image" -msgstr "Ảnh" +msgstr "Hình Ảnh" msgid "Image displayed and edited in this space" -msgstr "Ảnh được hiển thị và biên tập trong không gian này" +msgstr "Hình ảnh được hiển thị và biên soạn trong không gian này" msgid "Image User" -msgstr "Đồ Dùng Ảnh" +msgstr "Người Sử Dụng Hình Ảnh" msgid "Parameters defining which layer, pass and frame of the image is displayed" -msgstr "Tham số cho xác định lớp, vòng, và số bức ảnh nào được hiển thị" +msgstr "Tham số định nghĩa tầng, lượt và khung hình nào của hình ảnh sẽ được hiển thị" msgid "Override Background Image" -msgstr "Ảnh Nền Vượt Quyền" +msgstr "Vượt Quyền Hình Ảnh Nền" msgid "In a local override camera, whether this background image comes from the linked reference camera, or is local to the override" -msgstr "Trong một dữ liệu địa phương được vượt quyền, rãnh ảnh nền này là từ máy quay phim tham chiếu được liên kết, hoặc là địa phương cho đồ vượt quyền" +msgstr "Trong máy quay phim vượt quyền cục bộ, cho dù hình nền này là từ máy quay phim tham chiếu kết nối, hay là cục bộ đối với cái vượt quyền" msgid "Offset" -msgstr "Dịch" +msgstr "Dịch Chuyển" msgid "Rotation" -msgstr "Xoay" +msgstr "Xoay Chiều" msgid "Rotation for the background image (ortho view only)" -msgstr "Xoay cho ảnh nền (chỉ cho màn trực giao)" +msgstr "Góc xoay hình ảnh nền (chỉ cho góc nhìn trực giao thôi)" msgid "Scale" -msgstr "Phóng To" +msgstr "Tỷ Lệ" msgid "Scale the background image" -msgstr "Phóng to ảnh nền" +msgstr "Tỷ lệ hóa hình ảnh nền" msgid "Show Background Image" -msgstr "Hiện Ảnh Nền" +msgstr "Hiển Thị Hình Ảnh Nền" msgid "Show this image as background" -msgstr "Hiện ảnh này làm nền" +msgstr "Hiển thị hình ảnh này làm nền" msgid "Show Expanded" -msgstr "Hiện Mở Rộng" +msgstr "Hiển Thị Mở Rộng" + + +msgid "Show the details in the user interface" +msgstr "Hiển thị chi tiết trong giao diện người dùng" msgid "Show On Foreground" -msgstr "Hiện Trên Ảnh Cảnh Trươc" +msgstr "Hiển Thị Ở Đằng Trước" msgid "Show this image in front of objects in viewport" -msgstr "Hiện ảnh này phía trước vật thể trong màn chiếu" +msgstr "Hiển thị hình ảnh này ở đằng trước các đối tượng trong cổng nhìn" msgid "Background Source" -msgstr "Nguồn Nền" +msgstr "Nguồn của Nền" msgid "Data source used for background" -msgstr "Nguồn dữ liệu sử dụng cho nền" +msgstr "Nguồn dữ liệu dùng cho nền" msgid "Movie Clip" -msgstr "Khúc Phim" +msgstr "Đoạn Phim" msgid "Camera Clip" -msgstr "Khúc Máy Quay Phim" +msgstr "Đoạn Phim của Máy Quay" msgid "Use movie clip from active scene camera" -msgstr "Dùng khúc phim từ máy quay phim hoạt động trong cảnh" +msgstr "Dùng đoạn phim từ máy quay cảnh hoạt động" msgid "Flip Horizontally" @@ -4700,7 +5247,7 @@ msgstr "Lật Ngang" msgid "Flip the background image horizontally" -msgstr "Lật ảnh nền ngang" +msgstr "Lật hình ảnh nền theo chiều ngang" msgid "Flip Vertically" @@ -4708,7 +5255,7 @@ msgstr "Lật Dọc" msgid "Flip the background image vertically" -msgstr "Lật ảnh nền dọc" +msgstr "Lật hình ảnh nền theo chiều dọc" msgid "Background Images" @@ -4716,87 +5263,87 @@ msgstr "Ảnh Nền" msgid "Collection of background images" -msgstr "Sưu tập ảnh nền" +msgstr "Bộ sưu tập của các hình ảnh nền" msgid "Depth of Field" -msgstr "Độ Sâu Trường" +msgstr "Độ Sâu Trường Ảnh" msgid "Depth of Field settings" -msgstr "Cài đặt Độ Sậu Trường" +msgstr "Sắp đặt về Độ Sâu Trường Ảnh" msgid "Blades" -msgstr "Lưới Dao" +msgstr "Số Lá của Khẩu" msgid "Number of blades in aperture for polygonal bokeh (at least 3)" -msgstr "Số lượng dao cho lỗ ống kính tản cảnh đa giác (3 cái trở lên)" +msgstr "Số lượng lá của khẩu để tạo hình đa giác nhòe (ít nhất là 3)" msgid "F-Stop" -msgstr "Bước-F" +msgstr "Khẩu Độ F" msgid "F-Stop ratio (lower numbers give more defocus, higher numbers give a sharper image)" -msgstr "Tỉ số bước-F (số càng nhỏ ảnh càng mờ, số càng lớn ảnh càng rõ)" +msgstr "Tỷ số Khẩu Độ (những số nhỏ sẽ làm nhòe mờ nhiều hơn, những số to sẽ làm cho hình ảnh rõ nét hơn)" msgid "Ratio" -msgstr "Tỉ Số" +msgstr "Tỷ Số" msgid "Distortion to simulate anamorphic lens bokeh" -msgstr "Méo hóa cho mô phỏng thấu kính tản cảnh dị hướng" +msgstr "Độ biến dạng để mô phỏng hiệu ứng nhòe (bokeh) của thấu kính tiệm biến" msgid "Rotation of blades in aperture" -msgstr "Xoay của lưới dao trong lỗ ống kính" +msgstr "Độ xoay chiều của lá khẩu" msgid "Focus Distance" -msgstr "Khoảng Cách Tiêu Điểm" +msgstr "Khoảng Cách Hội Tụ" msgid "Distance to the focus point for depth of field" -msgstr "Quãng đến tiêu điểm cho độ sâu trường" +msgstr "Khoảng cách tới điểm lấy nét của độ sâu trường ảnh" msgid "Focus Object" -msgstr "Vật Thể Tiêu Điểm" +msgstr "Đối Tượng Tiêu Điểm" msgid "Use this object to define the depth of field focal point" -msgstr "Dùng vật thể này cho chỉ định tiêu điểm của độ sâu trường" +msgstr "Dùng đối tượng này để xác định tiêu điểm (điểm lấy nét) của độ sâu trường ảnh" msgid "Focus Bone" -msgstr "Xương Tiêu Điểm" +msgstr "Xương Tập Trung Vào" msgid "Use this armature bone to define the depth of field focal point" -msgstr "Dùng xương cốt này cho chỉ định tiêu điểm cho độ sâu trường" +msgstr "Sử dụng xương của khung cốt này để xác định độ sâu của tiêu điểm trường ảnh" msgid "Use Depth of Field" -msgstr "Dùng Độ Sâu Trường" +msgstr "Sử dụng Độ Sâu Trường Ảnh" msgid "Stereo" -msgstr "Stereo (Nhị Kênh)" +msgstr "Lập Thể" msgid "Stereoscopy settings for a Camera data-block" -msgstr "Cài đặt nhị kênh cho một cục dữ liệu Máy Quay Phim" +msgstr "Các sắp đặt lập thể cho khối dữ liệu Máy Quay Phim" msgid "Convergence Plane Distance" -msgstr "Khoảng Cách Mặt Phẳng Hội Tụ" +msgstr "Khoảng Cách Tới Bình Diện Đồng Quy" msgid "The converge point for the stereo cameras (often the distance between a projector and the projection screen)" -msgstr "Điểm hội tụ cho máy quay phim nhị kênh (thường là khoảng cách giữa một máy chiếu và màn chiếu)" +msgstr "Điểm hội tụ cho máy quay phim lập thể (thường là khoảng cách giữa máy chiếu phim và màn chiếu phim)" msgid "Off-Axis" @@ -4804,7 +5351,7 @@ msgstr "Ngoài Trục" msgid "Off-axis frustums converging in a plane" -msgstr "Hình cụt ngoài trục hội tụ trong một mặt phẳng" +msgstr "Hình cụt ngoài trục hội tụ trong một bình diện" msgid "Parallel" @@ -4812,23 +5359,23 @@ msgstr "Song Song" msgid "Parallel cameras with no convergence" -msgstr "Máy quay phim song song không hội tụ" +msgstr "Các máy quay phim song song không hội tụ" msgid "Toe-in" -msgstr "Xoay Vào" +msgstr "Chụm Vào" msgid "Rotated cameras, looking at the convergence distance" -msgstr "Máy quay phim được xoay, nhìn đến khoảng cách hội tụ" +msgstr "Máy quay phim được xoay chiều, nhìn hướng vào trong khoảng cách hội tụ" msgid "Interocular Distance" -msgstr "Khoảng Cách Giữa Mắt" +msgstr "Khoảng Cách Đồng Tử" msgid "Set the distance between the eyes - the stereo plane distance / 30 should be fine" -msgstr "Đặt khoảng cách giữa con mắt - khoảng cách nhị kênh / 30 nên tốt" +msgstr "Đặt khoảng cách giữa hai con mắt - tỷ số (tầm nhìn nổi / 30) là được" msgid "Pivot" @@ -4848,43 +5395,43 @@ msgstr "Trung Tâm" msgid "Pole Merge Start Angle" -msgstr "Góc Bắt Đầu Gồm Cột" +msgstr "Góc Khởi Đầu Hợp Nhất Cực" msgid "Angle at which interocular distance starts to fade to 0" -msgstr "Góc thì khoảng cách giữa hai con mắt được bắt đầu giảm thành 0" +msgstr "Góc độ mà khoảng cách giữa hai mắt bắt đầu mờ dần về 0" msgid "Pole Merge End Angle" -msgstr "Góc Kết Thúc Gồm Cột" +msgstr "Góc Kết Thúc Hợp Nhất Cực" msgid "Angle at which interocular distance is 0" -msgstr "Góc thì khoảng cách giữa hai con mắt được bằng bằng 0" +msgstr "Góc nhìn khi khoảng cách giữa hai mắt bằng 0" msgid "Use Pole Merge" -msgstr "Dùng Gồm Cột" +msgstr "Hợp Nhất Cực" msgid "Fade interocular distance to 0 after the given cutoff angle" -msgstr "Giảm khoảng cách giữa hai con mắt đến 0 sau góc giới hạn được chỉ định" +msgstr "Phai mờ dần khoảng cách giữa hai mắt về 0 sau một giá trị góc giới hạn cho trước nào đó" msgid "Spherical Stereo" -msgstr "Nhị Kênh Hình Cầu" +msgstr "Lập Thể Hình Cầu" msgid "Render every pixel rotating the camera around the middle of the interocular distance" -msgstr "Kết xuất mỗi điểm ảnh mà xoáy máy quay phim quanh trung tâm của khoảng cách giữa hai con mắt" +msgstr "Kết xuất các điểm ảnh xoay quanh máy quay phim chừng tâm của khoảng cách giữa hai con mắt" msgid "ChannelDriver Variables" -msgstr "Biến Số Điều Vận Kênh" +msgstr "Các Biến Số Điều Vận Kênh" msgid "Collection of channel driver Variables" -msgstr "Sưu tập biến số của điều vận kênh" +msgstr "Bộ sưu tập các Biến Số điều vận kênh" msgid "Child Particle" @@ -4892,43 +5439,43 @@ msgstr "Hạt Con Cái" msgid "Child particle interpolated from simulated or edited particles" -msgstr "Hạt con cái được suy nội từ hạt mô phỏng hay được biên tập" +msgstr "Hạt con cái được nội suy từ các hạt đã được mô phỏng hoặc đã được chỉnh sửa" msgid "Cloth Collision Settings" -msgstr "Cài Đặt Va Chạm Vải" +msgstr "Sắp Đặt về Va Đập của Vải Vóc" msgid "Cloth simulation settings for self collision and collision with other objects" -msgstr "Cài đặt cho mô phỏng vải để tự va chạm và va chạm với vật thể khác" +msgstr "Các sắp đặt mô phỏng vải vóc về sự va đập vào bản thân và va đập với các đối tượng khác" msgid "Collision Collection" -msgstr "Sưu Tập Va Chạm" +msgstr "Bộ Sưu Tập Va Đập" msgid "Limit colliders to this Collection" -msgstr "Hạn chế va chạm chỉ ở trong Sưu Tập này" +msgstr "Hạn định các phần tử va đập chỉ hoạt động trong Bộ Sưu Tập này mà thôi" msgid "Collision Quality" -msgstr "Chất Lượng Va Chạm" +msgstr "Chất Lượng Va Đập" msgid "How many collision iterations should be done. (higher is better quality but slower)" -msgstr "Số lượng lặp lại va chạm nên tính toán (giá trị cao hơn có chất lượng hơn nhưng chậm hơn)" +msgstr "Số lần nhắc lại sự va đập đáng ra cần phải làm (giá trị cao hơn cho chất lượng tốt hơn, nhưng sẽ chậm hơn)" msgid "Restitution" -msgstr "Độ Nhồi" +msgstr "Hồi Phục" msgid "Amount of velocity lost on collision" -msgstr "Mức vận tốc được mất khi va chạm" +msgstr "Lượng vận tốc mất đi khi va đập" msgid "Minimum distance between collision objects before collision response takes effect" -msgstr "Khoảng cách tối thiểu giữa các vật thể được va chạm trước va chạm có tác dụng" +msgstr "Khoảng cách tối thiểu giữa các đối tượng va đập trước khi phản ứng đối với va đập xảy ra" msgid "Friction" @@ -4936,87 +5483,87 @@ msgstr "Ma Sát" msgid "Friction force if a collision happened (higher = less movement)" -msgstr "Lực ma sát nếu va chạm (càng cao = càng giảm chuyển động)" +msgstr "Lực ma sát nếu một sự va đập xảy ra (cao hơn = ít chuyển động hơn)" msgid "Impulse Clamping" -msgstr "Kẹp Lại Xung Lực" +msgstr "Hạn Định Xung Lực" msgid "Clamp collision impulses to avoid instability (0.0 to disable clamping)" -msgstr "Kẹp lại xung lực va chạm để tránh bất ổn định (0.0 để tắc kẹp lại)" +msgstr "Hạn định xung lực va đập để tránh sự bất ổn xảy ra (0.0 để tắt hạn định)" msgid "Self Minimum Distance" -msgstr "Khoảng Cách Tối Thiểu Tự Va Chạm" +msgstr "Khoảng Cách Tự Va Đập Tối Thiểu" msgid "Minimum distance between cloth faces before collision response takes effect" -msgstr "Khoảng cách tối thiểu giữa các mặt vải được va chạm nhau trước va chạm có tác dụng" +msgstr "Khoảng cách tối thiểu giữa các mặt vải trước khi phản ứng đối với sự va đập xảy ra" msgid "Self Friction" -msgstr "Tự Ma Sát" +msgstr "Ma Sát của Bản Thân" msgid "Friction with self contact" -msgstr "Ma sát với va chạm một mình" +msgstr "Lực ma sát khi tiếp xúc với bản thân" msgid "Enable Collision" -msgstr "Bật Va Chạm" +msgstr "Cho Phép Va Đập" msgid "Enable collisions with other objects" -msgstr "Bật va chạm với vật thể khác" +msgstr "Cho phép va đập với các đối tượng khác" msgid "Enable Self Collision" -msgstr "Bật Tự Va Chạm" +msgstr "Cho Phép Tự Va Đập" msgid "Enable self collisions" -msgstr "Bật tự va chạm" +msgstr "Cho phép tự va đập với bản thân" msgid "Collision Vertex Group" -msgstr "Nhóm Đỉnh Va Chạm" +msgstr "Nhóm Điểm Đỉnh Va Đập" msgid "Triangles with all vertices in this group are not used during object collisions" -msgstr "Các tam giác có tất cả đỉnh trong nhóm này không được sử dụng trong va chạm vật thể" +msgstr "Các tam giác, cùng toàn bộ các điểm đỉnh nằm trong nhóm này, sẽ không được sử dụng trong các va đập của đối tượng" msgid "Selfcollision Vertex Group" -msgstr "Nhóm Đỉnh Tự Va Chạm" +msgstr "Nhóm Điểm Đỉnh Va Đập Bản Thân" msgid "Triangles with all vertices in this group are not used during self collisions" -msgstr "Các tam giác có tất cả đỉnh trong nhóm này không được sử dụng trong va chạm với một mình" +msgstr "Các tam giác, cùng toàn bộ các điểm đỉnh nằm trong nhóm này, sẽ không được sử dụng trong các va đập vào bản thân" msgid "Cloth Settings" -msgstr "Cài Đặt Vải" +msgstr "Sắp Đặt về Vải Vóc" msgid "Cloth simulation settings for an object" -msgstr "Cài đặt của mô phỏng vải cho một vật thể" +msgstr "Các sắp đặt trong mô phỏng vải vóc cho một đối tượng" msgid "Air Damping" -msgstr "Tắt Dần Không Khí" +msgstr "Trở Lực Không Khí" msgid "Air has normally some thickness which slows falling things down" -msgstr "Bình thường không khí được cản trở vật thể đang rướt xuống" +msgstr "Không khi thường có một độ đặc nhất định và nó làm cho các vật rơi xuống bị chậm lại" msgid "Bending Spring Damping" -msgstr "Tắt Dần Lò Xo Uốn Cong" +msgstr "Kiềm Chế Lực Đàn Hồi khi Uốn Cong" msgid "Amount of damping in bending behavior" -msgstr "Mức tắt dần khi uốn cong" +msgstr "Lượng hạn định trong trạng thái uốn cong" msgid "Bending Model" @@ -5024,211 +5571,211 @@ msgstr "Mô Hình Uốn Cong" msgid "Physical model for simulating bending forces" -msgstr "Mô hình vật lý để làm mô phỏng cho lực uốn cong" +msgstr "Mô hình vật lý để mô phỏng lực uốn cong" msgid "Angular" -msgstr "Xoay" +msgstr "Góc" msgid "Cloth model with angular bending springs" -msgstr "Mô hình vải sử dụng với lò xo uốn cong xoay" +msgstr "Mô hình vải với lực góc đàn hồi khi uốn cong (angular bending springs)" msgid "Linear" -msgstr "Bậc Một" +msgstr "Tuyến Tính" msgid "Cloth model with linear bending springs (legacy)" -msgstr "Mô hình vải sử dụng lò xo uốn cong bật một (lỗi thời)" +msgstr "Mô hình vải với lực đàn hồi uốn cong tuyến tính (lỗi thời)" msgid "Bending Stiffness" -msgstr "Độ Cứng Uốn Cong" +msgstr "Độ Cứng khi Uốn Cong" msgid "How much the material resists bending" -msgstr "Mức vải được trốn lại uốn cong" +msgstr "Lượng chống cưỡng lực uốn cong của nguyên vật liệu" msgid "Bending Stiffness Maximum" -msgstr "Cực Đại Độ Cứng Uốn Cong" +msgstr "Độ Cứng Tối Đa khi Uốn Cong" msgid "Maximum bending stiffness value" -msgstr "Giá trị cực đại của độ cứng uốn cong" +msgstr "Giá trị tối đa cho độ cứng khi uốn cong" msgid "Collider Friction" -msgstr "Ma Sát Vật Thể Va Chạm" +msgstr "Ma Sát của Phần Tử Va Đập" msgid "Compression Spring Damping" -msgstr "Tắt Dần Nén Lò Xo" +msgstr "Hạn Định Lực Đàn Hồi Nén" msgid "Amount of damping in compression behavior" -msgstr "Mức tắt dần khi nén vải" +msgstr "Lượng hạn định trong trạng thái nén" msgid "Compression Stiffness" -msgstr "Độ Cứng Nén" +msgstr "Độ Cưỡng Chống Lực Nén" msgid "How much the material resists compression" -msgstr "Độ cứng khi nén vải" +msgstr "Lượng nguyên vật liệu cưỡng chống lực nén" msgid "Compression Stiffness Maximum" -msgstr "Cực Đại Độ Cứng Nén" +msgstr "Độ Cưỡng Chống Lực Nén Tối Đa" msgid "Maximum compression stiffness value" -msgstr "Giá trị cực đại của độ cứng nén" +msgstr "Giá trị tối đa của độ cưỡng lực nén" msgid "Target Density Strength" -msgstr "Sức Tỉ Trọng Mục Tiêu" +msgstr "Cường Độ Mật Độ Mục Tiêu" msgid "Influence of target density on the simulation" -msgstr "Sự ảnh hướng của tỉ trọng mục tiêu trong mô phỏng" +msgstr "Ảnh hưởng của mật độ mục tiêu trong mô phỏng" msgid "Target Density" -msgstr "Tỉ Trọng Mục Tiêu" +msgstr "Mật Độ Mục Tiêu" msgid "Maximum density of hair" -msgstr "Tỉ trọng cực đại cho tóc" +msgstr "Mật độ tối đa của tóc" msgid "Effector Weights" -msgstr "Quyền Lượng Đồ Hiệu Ứng" +msgstr "Trọng Lượng của Hiệu Ứng Viên" msgid "Fluid Density" -msgstr "Tỉ Trọng Chất Lỏng" +msgstr "Tỷ Trọng của Chất Lỏng" msgid "Density (kg/l) of the fluid contained inside the object, used to create a hydrostatic pressure gradient simulating the weight of the internal fluid, or buoyancy from the surrounding fluid if negative" -msgstr "Tỉ trọng (kg/l) của chất lỏng trong vật thể, dùng cho chế tạo một dốc áp suất thủy lực cho làm mô phỏng súc nặng của chất lỏng nội bộ, hay lực nổi từ chất lỏng xung quanh nếu nó có giá trị âm" +msgstr "Tỷ trọng (kg/l) (kilogram/lít) của chất lỏng nằm bên trong đối tượng, được sử dụng để kiến tạo một độ dốc áp suất thủy tĩnh, nhằm mô phỏng trọng lượng của chất lỏng nội bên trong, hoặc lực nổi từ chất lỏng xung quanh nếu là giá trị âm" msgid "Goal Default" -msgstr "Mặc Định Mục Đích" +msgstr "Mục Tiêu Mặc Định" msgid "Default Goal (vertex target position) value, when no Vertex Group used" -msgstr "Giá trị mục đích mặc định (vị trí đỉnh mục tiêu) khi không dùng Nhóm Đỉnh" +msgstr "Mục Tiêu Mặc Định (vị trí mục tiêu của điểm đỉnh), khi không sử dụng Nhóm Điểm Đỉnh nào cả" msgid "Goal Damping" -msgstr "Tắt Dần Mục Đích" +msgstr "Lực Hãm Mục Tiêu" msgid "Goal (vertex target position) friction" -msgstr "Ma sát của mục đích (vị trí đỉnh mục tiêu)" +msgstr "Độ ma sát của mục tiêu (vị trí mục tiêu của điểm đỉnh)" msgid "Goal Maximum" -msgstr "Cực Đại Mục Đích" +msgstr "Tối Đa của Mục Tiêu" msgid "Goal maximum, vertex group weights are scaled to match this range" -msgstr "Cực đại mục đích, quyền lượng của nhóm đỉnh được phóng to để ở trong phạm vi này" +msgstr "Tối đa của mục tiêu, trọng lượng của nhóm điểm đỉnh được đổi tỷ lệ để khớp với phạm vi này" msgid "Goal Minimum" -msgstr "Cực Tiểu Mục Đích" +msgstr "Tối Thiểu của Mục Tiêu" msgid "Goal minimum, vertex group weights are scaled to match this range" -msgstr "Cực tiểu mục đích, quyền lượng của nhóm đỉnh được phóng to để ở trong phạm vi này" +msgstr "Tối thiểu của mục tiêu, trọng lượng của nhóm điểm đỉnh được đổi tỷ lệ để khớp với phạm vi này" msgid "Goal Stiffness" -msgstr "Độ Cứng Mục Đích" +msgstr "Độ Cứng của Mục Tiêu" msgid "Goal (vertex target position) spring stiffness" -msgstr "Độ cứng lò xo của mục đích (vị trí đỉnh mục tiêu)" +msgstr "Độ cứng lực đàn hồi của mục tiêu (vị trí mục tiêu của điểm đỉnh)" msgid "Gravity" -msgstr "Hấp Dẫn" +msgstr "Trọng Lực" msgid "Gravity or external force vector" -msgstr "Hấp dẫn hay vectơ lực ngoài" +msgstr "Trọng lực hay vectơ lực bên ngoài" msgid "Internal Friction" -msgstr "Ma Sát Nội Bộ" +msgstr "Ma Sát Bên Trong" msgid "Internal Spring Max Diversion" -msgstr "Lò Xo Nội Bộ Trệch Đi Cực Đại" +msgstr "Mức Lệch Hướng Tối Đa của Lực Đàn Hồi Bên Trong" msgid "How much the rays used to connect the internal points can diverge from the vertex normal" -msgstr "Mức cho các tia được trệch đi từ đỉnh để kết nối các điểm nội bộ" +msgstr "Lượng tia xạ sử dụng để kết nối các điểm bên trong với nhau có thể đi lệnh hướng với pháp tuyến điểm đỉnh" msgid "Internal Spring Max Length" -msgstr "Lò Xo Nội Bộ Bề Dài Cực Đại" +msgstr "Chiều Dài Lực Đàn Hồi Bên Trong Tối Đa" msgid "The maximum length an internal spring can have during creation. If the distance between internal points is greater than this, no internal spring will be created between these points. A length of zero means that there is no length limit" -msgstr "Bề dài cực đại của lò xo nội bộ khi chế tạo nó. Nếu khoảng cách giữa điểm nội bộ xa hơn giá trị này, không chế tạo lò xo nội bộ giữa các điểm này. Bề dài bằng không nghĩa là bề dài không có giới hạn" +msgstr "Chiều dài tối đa, có thể có, của lực đàn hồi (lò xo) bên trong, trong khi kiến tạo. Nếu khoảng cách giữa các điểm bên trong lớn hơn giá trị này thì lực đàn hồi giữa các điểm này sẽ không được kiến tạo. Chiều dài bằng 0 có nghĩa là chiều dài vô tận" msgid "Check Internal Spring Normals" -msgstr "Kiểm Tra Pháp Tuyến Của Lò Xo Nội Bộ" +msgstr "Kiểm Tra Pháp Tuyến của Lực Đàn Hồi Bên Trong" msgid "Require the points the internal springs connect to have opposite normal directions" -msgstr "Bắt buộc điểm được kết nối bằng lò xo nội bộ ph ̉i có pháp tuyến nghịch hướng nhau" +msgstr "Đòi hỏi rằng các điểm kết nối của lực đàn hồi (lò xo) bên trong phải có hướng pháp tuyến đối lập" msgid "Tension Stiffness" -msgstr "Độ Cứng Áp Lực" +msgstr "Mức Ứng Suất Căng Thẳng" msgid "How much the material resists stretching" -msgstr "Mức vải được chống lại lực kéo" +msgstr "Mức ứng suất tình trạng kéo giãn của nguyên vật liệu" msgid "Tension Stiffness Maximum" -msgstr "Cực Đại Độ Cứng Áp Lực" +msgstr "Mức Ứng Suất Căng Thẳng Tối Đa" msgid "Maximum tension stiffness value" -msgstr "Giá trị cực đại của độ cứng áp lực" +msgstr "Giá trị ứng suất tình trạng căng thẳng tối đa" msgid "Vertex Mass" -msgstr "Khối Lượng Đỉnh" +msgstr "Khối Lượng của Điểm Đỉnh" msgid "The mass of each vertex on the cloth material" -msgstr "Khối lượng của mỗi đỉnh trên vật liệu vải" +msgstr "Khối lượng của mỗi điểm đỉnh trên chất liệu vải" msgid "Pin Stiffness" -msgstr "Độ Cứng Đóng Đinh" +msgstr "Độ Cứng của Ghim Đính" msgid "Pin (vertex target position) spring stiffness" -msgstr "Dộ cứng lò xo đóng đinh (vị trí đỉnh mục tiêu)" +msgstr "Độ cứng trong lực đàn hồi của ghim đính (vị trí mục tiêu của điểm đỉnh)" msgid "Pressure Scale" -msgstr "Hệ Số Áp Suất" +msgstr "Tỷ Lệ Áp Lực" msgid "Ambient pressure (kPa) that balances out between the inside and outside of the object when it has the target volume" -msgstr "Áp suất xung quanh (kPa) được tạo cân bằng giữa phía trong và ngoài của vật thể khi nó có thể tích mục đích" +msgstr "Áp suất môi trường (kPa) (kilopascals) được cân bằng lại giữa bên trong và bên ngoài của đối tượng khi nó có một thể tích mục tiêu" msgid "Quality" @@ -5236,63 +5783,63 @@ msgstr "Chất Lượng" msgid "Quality of the simulation in steps per frame (higher is better quality but slower)" -msgstr "Chất lượng của mô phỏng, số lượng bước cho mỗi bức ảnh (càng cao chất lượng càng tốt nhưng càng chậm hơn)" +msgstr "Chất lượng của mô phỏng: tỷ số giữa số bước mô phỏng trên mỗi khung hình (càng cao chất lượng càng tốt nhưng chậm hơn)" msgid "Rest Shape Key" -msgstr "Mẫu Hình Dạng Nghỉ" +msgstr "Hình Mẫu Tĩnh Tại" msgid "Shape key to use the rest spring lengths from" -msgstr "Dùng mẫu hình dạng nào cho biết bề dài nghỉ của lò xo" +msgstr "Hình mẫu để sử dụng cho những đoạn ở vị trí tĩnh tại của lực đàn hồi" msgid "Sewing Force Max" -msgstr "Lực Mai Cực Đại" +msgstr "Lực May Vá Tối Đa" msgid "Maximum sewing force" -msgstr "Lực mai cực đại" +msgstr "Lực may vá tối đa" msgid "Shear Spring Damping" -msgstr "Tắt Dần Méo Mó Lò Xo" +msgstr "Hạn Định Đàn Hồi khi Xô Nghiêng" msgid "Amount of damping in shearing behavior" -msgstr "Lượng tắt dần khi biến dạng vải" +msgstr "Lượng hạn định tình trạng trượt (cắt/xô lệch)" msgid "Shear Stiffness" -msgstr "Độ Cứng Méo Mó" +msgstr "Ứng Suất Trượt" msgid "How much the material resists shearing" -msgstr "Lượng vải được chống lại lực méo mó" +msgstr "Khả năng ứng suất tính trượt (cắt/xô nghiêng/xô ngang) của nguyên vật liệu" msgid "Shear Stiffness Maximum" -msgstr "Cực Đại Độ Cứng Méo Mó" +msgstr "Lượng Ứng Suất Trượt Tối đa" msgid "Maximum shear scaling value" -msgstr "Giá trị phóng to méo mó cực đại" +msgstr "Giá trị tỷ lệ hóa tính trượt (cắt/xô nghiêng/xô ngang) tối đa" msgid "Shrink Factor Max" -msgstr "Hệ Số Cực Đại Thu Nhỏ" +msgstr "Hệ Số Thu Nhỏ Tối Đa" msgid "Max amount to shrink cloth by" -msgstr "Mức cực đại cho thu nhỏ vải" +msgstr "Lượng co vải lại tối đa" msgid "Shrink Factor" -msgstr "Hệ Số Thu Nhỏ" +msgstr "Hệ Số Thu Nhỏ Lại" msgid "Factor by which to shrink cloth" -msgstr "Hế số để thu nhỏ vải" +msgstr "Hệ số co lại của vải" msgid "Target Volume" @@ -5300,179 +5847,183 @@ msgstr "Thể Tích Mục Tiêu" msgid "The mesh volume where the inner/outer pressure will be the same. If set to zero the change in volume will not affect pressure" -msgstr "Thể tích mạng lưới có áp suất ở ngaòi và ở trong bằng nhau. Nếu nó đã đặt bằng, thể tích này, thay đổi thể tích sẽ không ảnh hưởng áp suất" +msgstr "Thể tích khung lưới nơi mà áp lực bên trong/bên ngoài sẽ bằng nhau. Nếu đặt là 0 thì sự thay đổi trong thể tích sẽ không ảnh hưởng đến áp lực" msgid "Tension Spring Damping" -msgstr "Tắt Dần Lò Xo Áp Lực" +msgstr "Lượng Ứng Suất Độ Căng Thẳng trong Đàn Hồi" msgid "Amount of damping in stretching behavior" -msgstr "Mức tắt dần khi kéo vải" +msgstr "Lượng cưỡng chống trạng thái kéo giãn" msgid "Cloth speed is multiplied by this value" -msgstr "Tốc độ vải được nhân với giá trị này" +msgstr "Tốc độ vải vóc được nhân với giá trị này" msgid "Pressure" -msgstr "Áp Suất" +msgstr "Áp Lực" msgid "The uniform pressure that is constantly applied to the mesh, in units of Pressure Scale. Can be negative" -msgstr "Áp suất đều đặn được tác dụng trên mạng lưới hoài, đơn vị phóng to áp suất. Có thể có giá trị âm" +msgstr "Áp lực đồng đều được áp dụng liên tục vào khung lưới, trong đơn vị Thang Đo của Áp Lực. Giá trị có thể là âm" msgid "Dynamic Base Mesh" -msgstr "Mạng Lưới Cơ Sở Động Lý" +msgstr "Khung Lưới Cơ Sở Năng Động" msgid "Make simulation respect deformations in the base mesh" -msgstr "Mô phỏng tương đối với sự méo hóa của mạng lưới cơ sở" +msgstr "Bắt quá trình mô phỏng phải tôn trọng sự biến dạng trong khung lưới cơ sở" msgid "Create Internal Springs" -msgstr "Chế Tạo Lò Xo Nội Bộ" +msgstr "Kiến Tạo Lực Đàn Hồi Bên Trong" msgid "Simulate an internal volume structure by creating springs connecting the opposite sides of the mesh" -msgstr "Mô phỏng một cấu trúc thể tích nội bộ bằng chế tạo lò xo kêt nối các bên mạng lưới đối diện nhau" +msgstr "Mô phỏng cấu trúc thể tích bên trong bằng cách kiến tạo lực đàn hồi (lò xo) kết nối các bên đối lập của khung lưới với nhau" msgid "Simulate pressure inside a closed cloth mesh" -msgstr "Mô phỏng áp suất trên một mạng lưới vải được đóng lại" +msgstr "Mô phỏng áp lực bên trong một khung lưới kín của vải vóc" msgid "Use Custom Volume" -msgstr "Dùng Thể Tích Tùy Chọn" +msgstr "Sử Dụng Thể Tích Tùy Chỉnh" msgid "Use the Target Volume parameter as the initial volume, instead of calculating it from the mesh itself" -msgstr "Dùng tham số Thể Tích Mục Đích cho làm thể tích khởi động, thay thế tính nó lại từ mạng lưới trực tiếp" +msgstr "Sử dụng tham số Thể Tích Đích (Target Volume) làm thể tích khởi đầu, thay vì tính toán nó từ bản thân khung lưới" msgid "Sew Cloth" -msgstr "Mai Vải" +msgstr "May Vá Vải Vóc" msgid "Pulls loose edges together" -msgstr "Kéo cạnh lỏng lẻo đến nhau" +msgstr "Kéo các cạnh rời rạc vào nhau" msgid "Bending Stiffness Vertex Group" -msgstr "Nhóm Định Độ Cứng Uốn Cong" +msgstr "Nhóm Điểm Đỉnh Điều Chỉnh Độ Cứng Uốn Cong" msgid "Vertex group for fine control over bending stiffness" -msgstr "Đỉnh nhóm cho điều khiển chính xác độ cứng uốn cong" +msgstr "Nhóm điểm đỉnh để tinh chỉnh độ cứng trong quá trình uốn cong" msgid "Internal Springs Vertex Group" -msgstr "Nhóm Đỉnh Lò Xo Nội Bộ" +msgstr "Nhóm Điểm Đỉnh của Lực Đàn Hồi Bên Trong" msgid "Vertex group for fine control over the internal spring stiffness" -msgstr "Đỉnh nhóm cho điều khiển chính xác độ cứng lò xo nội bộ" +msgstr "Nhóp điểm đỉnh dành cho việc tinh chỉnh độ cứng của lực đàn hồi (lò xo) bên trong" + + +msgid "Pin Vertex Group" +msgstr "Nhóm Điểm Đỉnh Ghim" msgid "Vertex Group for pinning of vertices" -msgstr "Nhóm Đỉnh cho đóng đinh đỉnh" +msgstr "Nhóm Điểm Đỉnh dành cho việc đính ghim các điểm đỉnh" msgid "Pressure Vertex Group" -msgstr "Dùng Nhóm Đỉnh Áp Suất" +msgstr "Nhóm Điểm Đỉnh về Áp Lực" msgid "Vertex Group for where to apply pressure. Zero weight means no pressure while a weight of one means full pressure. Faces with a vertex that has zero weight will be excluded from the volume calculation" -msgstr "Nhóm cho áp suất tác dụng. Quyền lượng bằng không nghĩa là không có áp suất, quyền lượng bằng một nghĩa là áp suất toàn bộ. Mặt nào không có đỉnh không có quyền lượng sẽ bị trừ loại từ tính toán thể tích" +msgstr "Nhóm điểm đỉnh dành cho nơi nào có sự áp dụng của áp lực. Trọng lượng 0 có nghĩa là không có áp lực, và trọng lượng 1 có nghĩa là lượng áp lực toàn phần. Những các mặt với một điểm đỉnh có trọng lượng bằng 0 sẽ bị loại ra khỏi phép toán tính thể tích" msgid "Shear Stiffness Vertex Group" -msgstr "Nhóm Định Độ Cứng Méo Mó" +msgstr "Nhóm Điểm Đỉnh Ứng Suất Trượt" msgid "Vertex group for fine control over shear stiffness" -msgstr "Nhóm đỉnh cho điều khiển chính xác độ cứng méo mó" +msgstr "Nhóm điểm đỉnh để tinh chỉnh ứng suất trượt (cắt/xô nghiêng/xô ngang)" msgid "Shrink Vertex Group" -msgstr "Nhóm Đỉnh Thu Nhỏ" +msgstr "Thu Nhỏ Nhóm Điểm Đỉnh" msgid "Vertex Group for shrinking cloth" -msgstr "Nhóm Đỉnh cho thu nhỏ vải" +msgstr "Nhóm Điểm Đỉnh để thu/co vải vóc lại" msgid "Structural Stiffness Vertex Group" -msgstr "Nhóm Đỉnh Độ Cứng Cấu Trúc" +msgstr "Nhóm Điểm Đỉnh cho Độ Cứng Cấu Trúc" msgid "Vertex group for fine control over structural stiffness" -msgstr "Nhóm đỉnh cho điều khiển chính xác độ cứng cấu trúc" +msgstr "Nhóm điểm đỉnh để tinh chỉnh chi tiết độ cứng cấu trúc" msgid "Voxel Grid Cell Size" -msgstr "Kích Cỡ Tế Bào Đồ Thị Thể Tích Tử" +msgstr "Cỡ Ô trong Khung Lưới Đồ Thị Thể Tích Tử" msgid "Size of the voxel grid cells for interaction effects" -msgstr "Kích Cỡ của tế bào đồ thị thể tích tử cho hiệu ứng tương tác" +msgstr "Cỡ ô của khung lưới đồ thị thể tích tử đối với các hiệu ứng tương tác" msgid "Solver Result" -msgstr "Kết Qủa Trình Giải Nghiệm" +msgstr "Kết Quả Giải Nghiệm" msgid "Result of cloth solver iteration" -msgstr "Kết qủa của lặp lại trình giải nghiệm vải" +msgstr "Kết quả của các chu kỳ giải nghiệm vải vóc" msgid "Average Error" -msgstr "Sai Lầ Trung Bình" +msgstr "Sai Số Trung Bình" msgid "Average error during substeps" -msgstr "Sai lầm trung bình cho hạ bước" +msgstr "Sai số trung bình trong khi phân bước" msgid "Average Iterations" -msgstr "Số Lặp Lại Trung Bình" +msgstr "Số Chu Kỳ Trung Bình" msgid "Average iterations during substeps" -msgstr "Số lặp lại trung bình khi tính hạ bước" +msgstr "Số chu kỳ lặp lại trung bình trong khi phân bước" msgid "Maximum Error" -msgstr "Sai Lầm Cực Đại" +msgstr "Sai Số Tối Đa" msgid "Maximum error during substeps" -msgstr "Sai lầm cực đại cho hạ bước" +msgstr "Sai số tối đa trong khi phân bước" msgid "Maximum Iterations" -msgstr "Lặp Lại Tối Đa" +msgstr "Số Lần Nhắc Lại Tối Đa" msgid "Maximum iterations during substeps" -msgstr "Lặp lại tối đa cho hạ bước" +msgstr "Số lần nhắc lại tối đa trong khi phân bước" msgid "Minimum Error" -msgstr "Sai Lầm Cực Tiểu" +msgstr "Sai Số Tối Thiểu" msgid "Minimum error during substeps" -msgstr "Sai lầm cực tiểu cho hạ bước" +msgstr "Sai số tối thiểu trong khi phân bước" msgid "Minimum Iterations" -msgstr "Lặp Lại Tối Thiểu" +msgstr "Số Lần Nhắc Lại Tối Thiểu" msgid "Minimum iterations during substeps" -msgstr "Lặp lại tối thiểu cho hạ bước" +msgstr "Số lần nhắc lại tối thiểu trong khi phân bước" msgid "Status" @@ -5480,7 +6031,7 @@ msgstr "Trạng Thái" msgid "Status of the solver iteration" -msgstr "Trạng thái của lặp lại trình giải nghiệm" +msgstr "Trạng thái của các chu kỳ giải nghiệm" msgid "Success" @@ -5492,59 +6043,103 @@ msgstr "Tính toán đã thành công" msgid "Numerical Issue" -msgstr "Vấn Đề Kỷ Thuật Số" +msgstr "Vấn Đề về Số" msgid "The provided data did not satisfy the prerequisites" -msgstr "Dữ liệu được cung cấp không phù hợp với điều kiện yêu cầu" +msgstr "Dữ liệu cung cấp không phù hợp với điều kiện tiên quyết" msgid "No Convergence" -msgstr "Không Hội Tụ" +msgstr "Không Đồng Quy" msgid "Iterative procedure did not converge" -msgstr "Thủ tục lặp lặi không hội tụ" +msgstr "Thủ tục lặp lại không đồng quy" msgid "Invalid Input" -msgstr "Ngõ Vào Không Hợp Lệ" +msgstr "Nhập Liệu Không Hợp Lệ" msgid "The inputs are invalid, or the algorithm has been improperly called" -msgstr "Các ngõ vào không hợp lệ, hay sử dụng giải thuật không đúng đắn" +msgstr "Các dữ liệu được cung cấp không hợp lệ, hoặc sử dụng thuật toán không đúng đắn" + + +msgid "Collection Child" +msgstr "Bộ Sưu Tập Con Cái" + + +msgid "Child collection with its collection related settings" +msgstr "Bộ sưu tập con cái với các cài đặt liên quan đến bộ sưu tập của nó" + + +msgid "Light Linking" +msgstr "Liên Kết Ánh Sáng" + + +msgid "Light linking settings of the collection object" +msgstr "Cài đặt về liên kết ánh sáng của đối tượng bộ sưu tập" msgid "Collection Children" -msgstr "Sưu Tập Con Cái" +msgstr "Bộ Sưu Tập Con Cái" msgid "Collection of child collections" -msgstr "Sưu tập của sưu tập con cái" +msgstr "Bộ sưu tập của các bộ sưu tập con cái" + + +msgid "Collection Light Linking" +msgstr "Liên Kết Ánh Sáng của Bộ Sưu Tập" + + +msgid "Light linking settings of objects and children collections of a collection" +msgstr "Cài đặt liên kết ánh sáng của các đối tượng và các bộ sưu tập con cái của một bộ sưu tập" + + +msgid "Link State" +msgstr "Trạng Thái Liên Kết" + + +msgid "Light or shadow receiving state of the object or collection" +msgstr "Trạng thái tiếp nhận ánh sáng hoặc bóng tối của đối tượng hoặc bộ sưu tập" msgid "Include" -msgstr "Gồm" +msgstr "Include/Bao Gồm" msgid "Exclude" -msgstr "Trừ Loại" +msgstr "Loại Trừ" + + +msgid "Collection Object" +msgstr "Đối Tượng Bộ Sưu Tập" + + +msgid "Object of a collection with its collection related settings" +msgstr "Đối tượng của bộ sưu tập với các cài đặt liên quan đến bộ sưu tập của nó" + + +msgid "Light linking settings of the collection" +msgstr "Cài đặt liên kết ánh sáng của bộ sưu tập" msgid "Collection Objects" -msgstr "Sưu Tập Vật Thể" +msgstr "Đối Tượng Bộ Sưu Tập" msgid "Collection of collection objects" -msgstr "Sưu tập của sưu tập vật thể" +msgstr "Bộ sưu tập của các đối tượng bộ sưu tập" msgid "Collision Settings" -msgstr "Cài Đặt Va Chạm" +msgstr "Sắp Đặt về Va Đập" msgid "Collision settings for object in physics simulation" -msgstr "Cài đặt va chạm cho vật thể trong mô phỏng vật lý" +msgstr "Các sắp đặt về ảnh hưởng va đập đối với mô phỏng vật lý" msgid "Absorption" @@ -5552,35 +6147,35 @@ msgstr "Độ Hấp Thụ" msgid "How much of effector force gets lost during collision with this object (in percent)" -msgstr "Mức lực của đồ hiệu ứng được bị mất khi va chạm với vật thể này (phần trăm)" +msgstr "Lượng lực hiệu ứng viên sẽ bị mất đi khi va đập với đối tượng này (theo phần trăm)" msgid "Friction for cloth collisions" -msgstr "Ma sát cho va chạm vải" +msgstr "Lực ma sát trong va đập của vải vóc" msgid "Damping" -msgstr "Tắt Dần" +msgstr "Giảm Chấn" msgid "Amount of damping during collision" -msgstr "Mức tắt dần khi va chạm" +msgstr "Lượng lực hãm tác động trong khi va đập" msgid "Damping Factor" -msgstr "Hệ Số Tắt Dần" +msgstr "Hệ Số Giảm Chấn" msgid "Amount of damping during particle collision" -msgstr "Mức tắt dần để dùng khi hạt va chạm" +msgstr "Lượng lực hãm sử dụng khi hạt va đập" msgid "Random Damping" -msgstr "Tắt dần ngẫu nhiên" +msgstr "Giảm Chấn Ngẫu Nhiên" msgid "Random variation of damping" -msgstr "Đổi tắt dần kiểu ngẫu nhiên" +msgstr "Giảm chấn thay đổi ngẫu nhiên" msgid "Friction Factor" @@ -5588,59 +6183,63 @@ msgstr "Hệ Số Ma Sát" msgid "Amount of friction during particle collision" -msgstr "Mức ma sát khi hạt va chạm" +msgstr "Lượng ma sát trong khi hạt va đập" msgid "Random Friction" -msgstr "Ma Sát Ngẫu Nhiên" +msgstr "Lực Ma Sát Ngẫu Nhiên" msgid "Random variation of friction" -msgstr "Đổi ma sát kiểu ngẫu nhiên" +msgstr "Biến thiên ngẫu nhiên của lực ma sát" msgid "Permeability" -msgstr "Độ Thấm" +msgstr "Độ Thẩm Thấu" msgid "Chance that the particle will pass through the mesh" -msgstr "Sắc xuất hạt có thể xuyên qua mạng lưới" +msgstr "Cơ hội hạt có thể đi xuyên qua khung lưới" msgid "Stickiness" -msgstr "Độ Dính" +msgstr "Độ Dính Kết" msgid "Amount of stickiness to surface collision" -msgstr "Mức hạt dính nhau khi va chạm" +msgstr "Độ dính kết vào bề mặt va đập" msgid "Inner Thickness" -msgstr "Độ Dày Nội Bộ" +msgstr "Độ Dày Bên Trong" msgid "Inner face thickness (only used by softbodies)" -msgstr "Độ dày trong mặt (chỉ dùng cho thân mềm)" +msgstr "Độ dày mặt trong (chỉ dùng cho thân mềm)" msgid "Outer Thickness" -msgstr "Độ Dày Ngoại" +msgstr "Độ Dày Bên Ngoài" msgid "Outer face thickness" -msgstr "Độ dày của mặt ngoài" +msgstr "Độ dày mặt ngoài" msgid "Enabled" -msgstr "Đã Bật" +msgstr "Bật" + + +msgid "Enable this object as a collider for physics systems" +msgstr "Cho phép đối tượng này làm vật va đập trong các hệ thống vật lý" msgid "Single Sided" -msgstr "Mặt Đơn" +msgstr "Đơn Bên" msgid "Cloth collision acts with respect to the collider normals (improves penetration recovery)" -msgstr "Va chạm vải sẽ phản ứng với pháp tuyến của đồ va chạm (này giúp đỡ hồi phục sau sự xuyên qua)" +msgstr "Sự va đập của vải tôn trọng hướng pháp tuyến của những vật va đập (cải thiện tình trạng xuyên qua nhau)" msgid "Override Normals" @@ -5648,7 +6247,7 @@ msgstr "Vượt Quyền Pháp Tuyến" msgid "Cloth collision impulses act in the direction of the collider normals (more reliable in some cases)" -msgstr "Xung lực va chạm vải tác dụng theo hướng của pháp tuyến đồ va chạm (xác thực hơn trong vài trường hợp)" +msgstr "Xung lực va đập của vải vóc hoạt động theo hướng pháp tuyến của vật va đập (đáng tin cậy hơn trong một số trường hợp)" msgid "Kill Particles" @@ -5656,23 +6255,23 @@ msgstr "Hủy Diệt Hạt" msgid "Kill collided particles" -msgstr "Hủy diệt hạt đã va chạm nhau" +msgstr "Hủy diệt hạt sau khi các hạt va đập nhau" msgid "Color management specific to display device" -msgstr "Quản lý màu tùy thiết bị hiển thị" +msgstr "Quản lý màu sắc theo đặc thù của thiết bị hiển thị" msgid "Display Device" -msgstr "Thiết Bị Hiển Thị" +msgstr "Thiết bị Hiển Thị" msgid "Display device name" -msgstr "Tên thiết bị hiển thị" +msgstr "Tên của thiết bị hiển thị" msgid "Input color space settings" -msgstr "Cài đặt không gian màu ngõ vào" +msgstr "Sắp đặt của không gian màu sắc cung cấp" msgid "Is Data" @@ -5680,15 +6279,71 @@ msgstr "Là Dữ Liệu" msgid "Treat image as non-color data without color management, like normal or displacement maps" -msgstr "Dùng dữ liệu ảnh như dữ liệu không màu và không quản lỳ màu, ví dụ bản đồ pháp tuyến hay dịch bề mặt" +msgstr "Coi hình ảnh như dữ liệu phi sắc tính không có quản lý màu sắc, giống như ánh xạ pháp tuyến, hoặc ánh xạ dời hình" msgid "Input Color Space" -msgstr "Không Gian Màu Ngõ Vào" +msgstr "Không Gian Màu Sắc Cung Cấp" msgid "Color space in the image file, to convert to and from when saving and loading the image" -msgstr "Không gian màu trong tập tin ảnh, để biến đổi đến và từ khi lưu và nhập ảnh" +msgstr "Không gian màu sắc trong tập tin hình ảnh, để chuyển đổi sang đó, hoặc từ đó, khi lưu hoặc nạp hình ảnh" + + +msgid "Linear AP0 with ACES white point" +msgstr "AP0 tuyến tính với điểm trắng ACES" + + +msgid "Linear AP1 with ACES white point" +msgstr "AP1 tuyến tính với điểm trắng ACES" + + +msgid "AgX Base Display P3" +msgstr "Màn Hình Cơ Sở AgX P3" + + +msgid "AgX Base Image Encoding for Display P3 Display" +msgstr "Mã Hóa Hình Ảnh Cơ Sở AgX cho Màn Hình Hiển Thị P3" + + +msgid "AgX Base Rec.1886" +msgstr "Cơ Sở AgX Rec.1886" + + +msgid "AgX Base Image Encoding for Rec.1886 Display" +msgstr "Mã Hóa Hình Ảnh Cơ Sở AgX cho Màn Hình Rec.1886" + + +msgid "AgX Base Rec.2020" +msgstr "Cơ Sở AgX Rec.2020" + + +msgid "AgX Base Image Encoding for BT.2020 Display" +msgstr "Mã Hóa Hình Ảnh Cơ Sở AgX cho Màn Hình BT.2020" + + +msgid "AgX Base sRGB" +msgstr "Tiêu Chuẩn RGB Cơ Sở AgX" + + +msgid "AgX Base Image Encoding for sRGB Display" +msgstr "Mã Hóa Hình Ảnh Cơ Sở AgX cho Màn Hình sRGB" + + +msgid "AgX Log" +msgstr "Lôgarit AgX" + + +msgid "Log Encoding with Chroma inset and rotation, and with 25 Stops of Dynamic Range" +msgstr "Mã Hóa Lôgarit với cách chèn nội và xoay chiều Chroma, cùng với 25 Điểm Dừng của Dải Động" + + +msgid "Display P3" +msgstr "Hiển Thị P3" + + +msgid "Apple's Display P3 with sRGB compound (piece-wise) encoding transfer function, common on Mac devices" +msgstr "Hiển Thị P3 của Apple với hàm truyền mã hóa hỗn hợp sRGB (theo từng phần), phổ biến trên các thiết bị Mac" msgid "Filmic Log" @@ -5696,7 +6351,7 @@ msgstr "Log Filmic" msgid "Log based filmic shaper with 16.5 stops of latitude, and 25 stops of dynamic range" -msgstr "Hàm số filmic cơ sở log có phạm vi 16.5 bước, và phạm vi động lý 25 bước" +msgstr "Thuật toán nắn hình màu sắc cho giống phim cơ sở lôgarit với 16.5 stops của kinh tuyến, và 25 stops của dải động" msgid "Filmic sRGB" @@ -5704,27 +6359,91 @@ msgstr "sRGB Filmic" msgid "sRGB display space with Filmic view transform" -msgstr "Không gian hiển thị sRGB áp dụng biến hóa hiển thị Filmic" +msgstr "không gian hiển thị sRGB với biến hóa góc nhìn sang Filmic" + + +msgid "Linear CIE-XYZ D65" +msgstr "CIE-XYZ D65 tuyến tính" + + +msgid "1931 CIE XYZ with adapted illuminant D65 white point" +msgstr "1931 CIE XYZ với điểm trắng D65 chiếu sáng thích ứng" + + +msgid "Linear CIE-XYZ E" +msgstr "CIE-XYZ E tuyến tính" + + +msgid "1931 CIE XYZ standard with assumed illuminant E white point" +msgstr "Tiêu chuẩn CIE XYZ 1931 với điểm trắng E chiếu sáng giả định" + + +msgid "Linear DCI-P3 D65" +msgstr "DCI-P3 D65 Tuyến Tính" + + +msgid "Linear DCI-P3 with illuminant D65 white point" +msgstr "DCI-P3 tuyến tính với điểm trắng chiếu sáng D65" + + +msgid "Linear FilmLight E-Gamut" +msgstr "FilmLight E-Gamut Tuyến Tính" + + +msgid "Linear E-Gamut with illuminant D65 white point" +msgstr "E-Gamut tuyến tính với điểm trắng D65 chiếu sáng" + + +msgid "Linear Rec.2020" +msgstr "Rec.2020 Tuyến Tính" + + +msgid "Linear BT.2020 with illuminant D65 white point" +msgstr "Tuyến tính BT.2020 với điểm trắng chiếu sáng D65" + + +msgid "Linear Rec.709" +msgstr "Rec.709 Tuyến Tính" + + +msgid "Linear BT.709 with illuminant D65 white point" +msgstr "BT.709 tuyến tính với điểm trắng chiếu sáng D65" msgid "Non-Color" -msgstr "Vô Màu Sắc" +msgstr "Không Màu, Phi Sắc Tính" + + +msgid "Generic data that is not color, will not apply any color transform (e.g. normal maps)" +msgstr "Dữ liệu phổ thông mà không phải là dữ liệu màu, sẽ không áp dụng bất kỳ biến hóa màu nào cả (ví dụ, ánh xạ pháp tuyến)" + + +msgid "BT.1886 2.4 Exponent EOTF Display, commonly used for TVs" +msgstr "BT.1886 2.4 Hiển Thị EOTF Lũy Thừa, thường dùng cho TV" + + +msgid "BT.2020 2.4 Exponent EOTF Display" +msgstr "Hiển Thị EOTF Lũy Thừa BT.2020 2.4" + + +msgid "sRGB IEC 61966-2-1 compound (piece-wise) encoding" +msgstr "mã hóa hỗn hợp sRGB IEC 61966-2-1 (theo từng phần)" msgid "Do not perform any color transform on load, treat colors as in scene linear space already" -msgstr "Không biến hóa màu khi đọc tập tin, làm giống như màu trong không gian bậc một của cảnh" +msgstr "Không thi hành biến hóa màu sắc khi khởi nạp, coi màu sắc như nó đã nằm trong không gian tuyến tính của cảnh" msgid "Color Space" -msgstr "Không Gian Màu" +msgstr "Không Gian Màu Sắc" msgid "Color space that the sequencer operates in" -msgstr "Không gian màu thì bộ trình tự đang sử dụng" +msgstr "Không gian màu sắc mà trình phối hình video sử dụng" msgid "Color management settings used for displaying images on the display" -msgstr "Cài đặt quảng lý màu để hiển thị ảnh trên thiết bị hiển thị" +msgstr "Các sắp đặt về quản lý màu sắc được sử dụng trong việc hiển thị hình ảnh trên màn hình" msgid "Curve" @@ -5732,15 +6451,15 @@ msgstr "Đường Cong" msgid "Color curve mapping applied before display transform" -msgstr "Ánh xạ đường cong màu được áp dụng trước biến hóa thiết bị hiển thị" +msgstr "Ánh xạ đường cong màu sắc được áp dụng trước khi hiển thị biến hóa" msgid "Exposure" -msgstr "Hứng Ánh Sáng" +msgstr "Độ Phơi Sáng" msgid "Exposure (stops) applied before display transform" -msgstr "Hứng ánh sáng (bậc) được áp dụng trước biến hóa hiển thị" +msgstr "Độ phơi sáng (khẩu độ) được áp dụng trước khi hiển thị biến hóa" msgid "Gamma" @@ -5748,19 +6467,19 @@ msgstr "Gama" msgid "Amount of gamma modification applied after display transform" -msgstr "Mức biến đổi gama được áp dụng sau biến hóa thiết bị hiển thị" +msgstr "Lượng biến đổi gamma được áp dụng sau khi hiển thị biến hóa" msgid "Look" -msgstr "Hóa Trang" +msgstr "Dáng Vẻ/Look" msgid "Additional transform applied before view transform for artistic needs" -msgstr "Biến hóa thêm được áp dụng trước biến hóa màn chiếu cho yêu cầu nghệ thuật" +msgstr "Biến hóa bổ sung được áp dụng trước khi biểu hiện biến hóa theo nhu cầu mỹ thuật" msgid "Do not modify image in an artistic manner" -msgstr "Không đổi ảnh một kiểu nghệ thuật" +msgstr "Không sửa đổi hình ảnh theo phong cách mỹ thuật" msgid "Use Curves" @@ -5768,31 +6487,35 @@ msgstr "Dùng Đường Cong" msgid "Use RGB curved for pre-display transformation" -msgstr "Dùng đường cong RGB cho biến hóa trước hiển thị" +msgstr "Dùng đường cong RGB cho biến hóa trước khi hiển thị" + + +msgid "High Dynamic Range" +msgstr "Dải Động Cao" msgid "View Transform" -msgstr "Biến Hóa Màn" +msgstr "Góc Nhìn Biến Hóa" msgid "View used when converting image to a display space" -msgstr "Màn được dùng khi biến đổi ảnh đến một không gian thiết bị hiển thị" +msgstr "Góc nhìn sử dụng khi chuyển đổi hình ảnh sang một không gian hiển thị" msgid "Do not perform any color transform on display, use old non-color managed technique for display" -msgstr "Không áp dụng biến hóa khi hiển thị, dùng phương pháp hiển thị ảnh cũ thì không quảnh lý màu" +msgstr "Không thi hành bất cứ biến hóa màu sắc nào khi hiển thị, dùng kỹ thuật quản lý phi sắc tính (không màu) trước đây để hiển thị" msgid "Color Mapping" -msgstr "Ánh Xạ Màu" +msgstr "Ánh Xạ Màu Sắc" msgid "Color mapping settings" -msgstr "Cài đặt ánh xạ màu" +msgstr "Sắp đặt ánh xạ màu sắc" msgid "Blend color to mix with texture output color" -msgstr "Màu pha trộn với màu ngõ ra của chất liệu" +msgstr "Hòa trộn màu với màu xuất chất liệu" msgid "Blend Factor" @@ -5800,43 +6523,43 @@ msgstr "Hệ Số Pha Trộn" msgid "Blend Type" -msgstr "Loại Pha Trộn" +msgstr "Kiểu Pha Trộn" msgid "Mode used to mix with texture output color" -msgstr "Chế độ nào được sử dụng khi pha trộn với màu ngõ ra của chất liệu" +msgstr "Chế độ sử dụng để hòa trộn với màu xuất chất liệu" msgid "Mix" -msgstr "Trộn" +msgstr "Hòa Trộn" msgid "Darken" -msgstr "Tối Hóa" +msgstr "Làm Tối" msgid "Lighten" -msgstr "Sáng Hóa" +msgstr "Làm Sáng" msgid "Screen" -msgstr "Che" +msgstr "Màn Hình" msgid "Overlay" -msgstr "Nằm Trên" +msgstr "Hình/Lớp Vẽ/Lồng" msgid "Soft Light" -msgstr "Ánh Sáng Mềm" +msgstr "Ánh Sáng Mềm Mại" msgid "Linear Light" -msgstr "Ánh Sáng Bật Một" +msgstr "Ánh Sáng Tuyến Tính" msgid "Difference" -msgstr "Trừ" +msgstr "Hiệu" msgid "Divide" @@ -5856,35 +6579,35 @@ msgstr "Dốc Màu" msgid "Contrast" -msgstr "Chênh Lệch Sáng" +msgstr "Độ/Tương Phản" msgid "Adjust the contrast of the texture" -msgstr "Chỉnh chênh lệch sáng của chất liệu" +msgstr "Chỉnh độ tương phản của chất liệu" msgid "Adjust the saturation of colors in the texture" -msgstr "Chỉnh độ tươi màu của chất liệu" +msgstr "Chỉnh độ bão hòa màu của chất liệu" msgid "Use Color Ramp" -msgstr "Sử Dụng Dốc Màu" +msgstr "Dốc Màu" msgid "Toggle color ramp operations" -msgstr "Bật/tắt thao tác dốc màu" +msgstr "Bật/Tắt các thao tác dốc màu" msgid "Color ramp mapping a scalar value to a color" -msgstr "Dốc màu đang ánh xạ một giá trị số đến một màu" +msgstr "Dốc màu giúp ánh xạ giá trị thành màu sắc" msgid "Color Mode" -msgstr "Chế Đồ Màu" +msgstr "Chế Độ Màu" msgid "Set color mode to use for interpolation" -msgstr "Đặt chế độ màu cho suy nội" +msgstr "Đặt chế độ màu cho quá trình nội suy" msgid "RGB" @@ -5904,11 +6627,11 @@ msgstr "Phần Tử" msgid "Color Interpolation" -msgstr "Suy Nội Màu" +msgstr "Nội Suy Màu" msgid "Set color interpolation" -msgstr "Đặt suy nội màu" +msgstr "Đặt phương pháp nội suy màu sắc" msgid "Near" @@ -5920,35 +6643,35 @@ msgstr "Xa" msgid "Clockwise" -msgstr "Hướng Kim Đồng Hồ" +msgstr "Thuận Chiều Kim Đồng Hồ" msgid "Counter-Clockwise" -msgstr "Nghịch Hướng Kim Đồng Hồ" +msgstr "Ngược Chiều Kim Đồng Hồ" msgid "Interpolation" -msgstr "Suy Nội" +msgstr "Nội Suy" msgid "Set interpolation between color stops" -msgstr "Đặt suy nội giữa pha màu" +msgstr "Đặt phép nội suy giữa các điểm dừng màu sắc" msgid "Ease" -msgstr "Xoa Dịu" +msgstr "Chậm Rãi" msgid "Cardinal" -msgstr "Cốt Yếu" +msgstr "Chính/Chủ Yếu/Cardinal" msgid "B-Spline" -msgstr "Mẫu Cong-B" +msgstr "Chốt Trục Cơ Sở" msgid "Constant" -msgstr "Không Đổi" +msgstr "Hằng Số/Đồng Đều/Bất Biến" msgid "Color Ramp Element" @@ -5956,7 +6679,7 @@ msgstr "Phần Tử Dốc Màu" msgid "Element defining a color at a position in the color ramp" -msgstr "Phần tử đang chỉ định một màu tại một vị trí trong dốc màu" +msgstr "Phần tử chỉ định màu tại một vị trí trong dốc màu" msgid "Alpha" @@ -5964,11 +6687,11 @@ msgstr "Độ Đục" msgid "Set alpha of selected color stop" -msgstr "Đặt độ đục của pha màu được chọn" +msgstr "Đặt alpha cho mốc dừng màu đã chọn" msgid "Set color of selected color stop" -msgstr "Đặt màu của pha màu được chọn" +msgstr "Đặt màu cho mốc dừng màu đã chọn" msgid "Position" @@ -5976,31 +6699,31 @@ msgstr "Vị Trí" msgid "Set position of selected color stop" -msgstr "Đặt vị tri của pha màu được chọn" +msgstr "Đặt vị trí của mốc dừng màu" msgid "Color Ramp Elements" -msgstr "Phần Tử Dốc Màu" +msgstr "Phần Tử của Dốc Màu" msgid "Collection of Color Ramp Elements" -msgstr "Sưu tập Phần Tử Dốc Màu" +msgstr "Bộ Sưu Tập các Yếu Tố Dốc Màu" msgid "File Output Slots" -msgstr "Khe Ngõ Ra Tập Tin" +msgstr "Khe Xuất Tập Tin" msgid "Collection of File Output node slots" -msgstr "Sưu tập khe giao điểm Ngõ Ra Tập Tin" +msgstr "Bộ sưu tập các khe nút Xuất Tập Tin" msgid "Console Input" -msgstr "Ngõ Vào Lệnh Diện Điều Khiển" +msgstr "Nhập Liệu Bàn Giao Tiếp" msgid "Input line for the interactive console" -msgstr "Hàng ngõ vào cho diện điều khiển tương tác" +msgstr "Dòng nhập liệu cho bàn giao tiếp tương tác" msgctxt "Text" @@ -6009,71 +6732,71 @@ msgstr "Dòng" msgid "Text in the line" -msgstr "Văn Bãn trobg dòng" +msgstr "Văn bản trong dòng" msgid "Console line type when used in scrollback" -msgstr "Loại dòng điều khiển giao diện được dùng khi cuộn lại" +msgstr "Loại dòng của bàn giao tiếp sử dụng khi cuộn trở lại" msgid "Output" -msgstr "Ngõ Ra" +msgstr "Đầu Ra" msgid "Input" -msgstr "Ngõ Vào" +msgstr "Đầu Vào" msgid "Error" -msgstr "Sai Lầm" +msgstr "Lỗi/Sai Số" msgid "Constraint modifying the transformation of objects and bones" -msgstr "Ràng Buộc chỉnh biến hóa của vật thể và xương" +msgstr "Ràng buộc chỉnh sửa biến hóa của các đối tượng và xương" msgid "Constraint is the one being edited" -msgstr "Ràng buộc là ràng buộc đang biên tập" +msgstr "Ràng buộc là cái đang được biên soạn" msgid "Use the results of this constraint" -msgstr "Dùng kết qủa của ràng buộc này" +msgstr "Sử dụng kết quả của ràng buộc này" msgid "Lin error" -msgstr "Sai lầm vị trí" +msgstr "Sai số tuyến tính" msgid "Amount of residual error in Blender space unit for constraints that work on position" -msgstr "Mức sai lầm dư (đơn vị không gian Blender) cho ràng buộc được tác dụng vị trí" +msgstr "Lượng sai số tuyến tính thặng dư trong đơn vị không gian của Blender đối với những ràng buộc tác động đến vị trí" msgid "Rotation error" -msgstr "Sai lầm xoay" +msgstr "Sai số xoay chiều" msgid "Amount of residual error in radians for constraints that work on orientation" -msgstr "Mức sai lầm dư (rađian) cho ràng buộc tác dụng định hướng" +msgstr "Lượng sai số thặng dư, trong radian, cho các ràng buộc tác động đến định hướng" msgid "Influence" -msgstr "Sự Ảnh Hưởng" +msgstr "Tác Động/Ảnh Hưởng" msgid "Amount of influence constraint will have on the final solution" -msgstr "Mức sự ảnh hưởng của ràng buộc trong nghiệm cuối cùng" +msgstr "Lượng ảnh hưởng của ràng buộc trong giải nghiệm cuối cùng" msgid "Override Constraint" -msgstr "Ràng Buộc Vượt Quyền" +msgstr "Vượt Quyền Ràng Buộc" msgid "In a local override object, whether this constraint comes from the linked reference object, or is local to the override" -msgstr "Trong một vật thể địa phương được , ràng buộc này từ vật thể tham chiếu được liên kết, hay nó là địa phương cho đồ vượt quyền" +msgstr "Trong một đối tượng vượt quyền, hoặc là ràng buộc này đến từ đối tượng tham chiếu liên kết, hay là cục bộ đối với cái vượt quyền" msgid "Constraint has valid settings and can be evaluated" -msgstr "Ràng buộc có cài đặt hợp lệ và có thể được tính toán" +msgstr "Ràng buộc có sắp đặt hợp lệ và có thể tính toán nó" msgid "Disable" @@ -6081,19 +6804,19 @@ msgstr "Tắt" msgid "Enable/Disable Constraint" -msgstr "Bật/tắt Ràng Buộc" +msgstr "Bật/Tắt Ràng Buộc" msgid "Constraint name" -msgstr "Tên Rảnh Buộc" +msgstr "Tên ràng buộc" msgid "Owner Space" -msgstr "Không Gian Chủ" +msgstr "Không Gian của Chủ Nhân" msgid "Space that owner is evaluated in" -msgstr "Không gian cho tính toán chủ" +msgstr "Không gian để tính toán chủ nhân" msgid "World Space" @@ -6105,43 +6828,43 @@ msgstr "Áp dụng ràng buộc tương đối với hệ thống tọa độ th msgid "Custom Space" -msgstr "Không Gian Tùy Chọn" +msgstr "Không Gian Tùy Chỉnh" msgid "The constraint is applied in local space of a custom object/bone/vertex group" -msgstr "Ràng buộc được áp dụng trong không gian địa phương của một nhóm vật thể/xương/đỉnh tùy chọn" +msgstr "Ràng buộc được áp dụng trong không gian địa phương của một đối tượng/xương/nhóm điểm đỉnh tùy chỉnh" msgid "Pose Space" -msgstr "Không Gian Dạng Đứng" +msgstr "Không Gian Tư Thế" msgid "The constraint is applied in Pose Space, the object transformation is ignored" -msgstr "Áp dụng ranh buộc trong Không Gian Dạng Đứng, không quan tâm biến hóa vật thể" +msgstr "Áp dụng ràng buộc trong Không Gian Tư Thế, biến hóa của đối tượng sẽ bị bỏ qua" msgid "Local With Parent" -msgstr "Địa Phương Với Phụ Huynh" +msgstr "Cục Bộ Với Phụ Huynh" msgid "The constraint is applied relative to the rest pose local coordinate system of the bone, thus including the parent-induced transformation" -msgstr "Áp dụng ràng buộc tương đối với hệ thống tọa độ địa phương của dạng đứng nghỉ ngơi của xương, và được gồm biến hóa từ phụ huynh" +msgstr "Ràng buộc được áp dụng tương đối với hệ thống tọa độ địa phương cho tư thế nghỉ của xương, và do đó bao gồm cả biến hóa do phụ huynh gây ra nữa" msgid "Local Space" -msgstr "Không Gian Địa Phương" +msgstr "Không Gian Cục Bộ" msgid "The constraint is applied relative to the local coordinate system of the object" -msgstr "Áp dụng ràng buộc tương đối với hệ thống tọa độ địa phương của vật thể" +msgstr "Áp dụng ràng buộc tương đối với hệ thống tọa độ của đối tượng" msgid "Constraint's panel is expanded in UI" -msgstr "Mở rộng bảng ràng buộc trong giao diện" +msgstr "Bảng ràng buộc được mở rộng trong Giao Diện" msgid "Object for Custom Space" -msgstr "Vật Thể cho Không Gian Tùy Chọn" +msgstr "Đối Tượng cho Không Gian Tùy Chỉnh" msgid "Sub-Target" @@ -6149,127 +6872,127 @@ msgstr "Mục Tiêu Phụ" msgid "Armature bone, mesh or lattice vertex group, ..." -msgstr "Xương cốt, mạng lưới, hay nhóm định lưới rào, ..." +msgstr "Xương của khung cốt, nhóm điểm đỉnh của khung lưới hoặc lưới rào, ..." msgid "Target Space" -msgstr "Không Gian Mục Tiêu" +msgstr "Không Gian của Mục Tiêu" msgid "Space that target is evaluated in" -msgstr "Không gian để tính tóan mục tiêu" +msgstr "Không gian mà mục tiêu được tính toán trong đó" msgid "The transformation of the target is evaluated relative to the world coordinate system" -msgstr "Biến hóa của mục tiêu sẽ được tính toán tương đối với tọa độ thế giới" +msgstr "Biến hóa của mục tiêu sẽ được tính toán tương đối với hệ tọa độ thế giới" msgid "The transformation of the target is evaluated relative to a custom object/bone/vertex group" -msgstr "Tính toán biến hóa của mục tiểu tương đối với một nhóm vật thể/xương/đỉnh tùy chọn" +msgstr "Biến hóa của mục tiêu sẽ được tính toán tương đối với hệ tọa độ thế giới đối tượng/xương/nhóm điểm đỉnh" msgid "The transformation of the target is only evaluated in the Pose Space, the target armature object transformation is ignored" -msgstr "Biến hóa của mục tiêu chỉ tính toán trong không gian Dạng Đứng, nó không quan tâm biến hóa vật thể cốt của mục tiêu" +msgstr "Biến hóa của mục tiêu chỉ được tính toán trong Không Gian Tư Thế. biến hóa của đối tượng khung cốt của mục tiêu sẽ bị bỏ qua" msgid "The transformation of the target bone is evaluated relative to its rest pose local coordinate system, thus including the parent-induced transformation" -msgstr "Biến hóa của xương mục tiếu được tính toán tương đối với hệ thống tọa độ địa phương của dạng đứng nghỉ ngơi, và được gồm biến hóa từ phụ huynh" +msgstr "Biến hóa của xương mục tiêu được tính toán tương đối với hệ thống tọa độ địa phương cho tư thế nghỉ của nó, và do đó bao gồm cả biến hóa do phụ huynh gây ra nữa" msgid "The transformation of the target is evaluated relative to its local coordinate system" -msgstr "Tính toán biến hóa của mục tiếu tương đối với hệ tọa độ tương đối" +msgstr "Biến hóa của mục tiêu được tính toán tương đối với hệ tọa độ địa phương của nó" msgid "Local Space (Owner Orientation)" -msgstr "Không Gian Địa Phương (Định Hướng Chủ)" +msgstr "Không Gian Cục Bộ (Định Hướng của Chủ Nhân)" msgid "The transformation of the target bone is evaluated relative to its local coordinate system, followed by a correction for the difference in target and owner rest pose orientations. When applied as local transform to the owner produces the same global motion as the target if the parents are still in rest pose" -msgstr "Biến hóa của xương mục tiêu được tính toán tương đối với hệ thống tọa độ địa phương cửa nó, sau được điều chỉnh bởi sư chênh lệch giữa định hướng của dạng đứng nghỉ của mục tiêu và chủ. Khi áp dụng làm biến hóa địa phương cho chủ, nó có chuyển động toàn cầu giống như mục tiêu nếu phụ huynh vẫn đang sử dụng dạng đứng nghỉ" +msgstr "Biến hóa của xương mục tiêu được tính toán tương đối với hệ thống tọa độ địa phương của nó, rồi sau đó sự chênh lệch giữa định hướng của tư thế nghỉ mục tiêu và chủ nhân được điều chỉnh lại. Khi áp dụng cho chủ nhân làm biến hóa địa phương của nó, nó sẽ tạo ra chuyển động toàn cầu giống như mục tiêu, nếu các phụ huynh vẫn đang ở trong tư thế nghỉ" msgid "Camera Solver" -msgstr "Trình Giải Nghiệm Máy Quay Phim" +msgstr "Giải Nghiệm Máy Quay Phim" msgid "Follow Track" -msgstr "Theo Đường Vết" +msgstr "Đi Theo Giám Sát" msgid "Object Solver" -msgstr "Trình Giải Nghiệm Vật Thể" +msgstr "Giải Nghiệm Đối Tượng" msgid "Copy Location" -msgstr "Chép Vị Tri" +msgstr "Sao Chép Vị Trí" msgid "Copy the location of a target (with an optional offset), so that they move together" -msgstr "Chép vị trí của một mục tiêu (với một dịch tùy chọn) cho họ di chuyển cùng nhau" +msgstr "Sao chép vị trí của mục tiêu (với một dịch chuyển riêng nếu muốn) để chúng di chuyển cùng với nhau" msgid "Copy Rotation" -msgstr "Chép Xoay" +msgstr "Sao Chép Xoay Chiều" msgid "Copy the rotation of a target (with an optional offset), so that they rotate together" -msgstr "Chép lại xoay của một mục tiêu (với một dịch tùy chọn) cho họ xoay cùng nhau" +msgstr "Sao chép sự xoay chiều của mục tiêu (với dịch chuyển riêng nếu muốn) để chúng xoay cùng nhau" msgid "Copy Scale" -msgstr "Chép Phóng To" +msgstr "Sao Chép Tỷ Lệ" msgid "Copy the scale factors of a target (with an optional offset), so that they are scaled by the same amount" -msgstr "Chép lại phóng to của một mục tiêu (với một dịch tùy chọn) cho họ phóng to cùng nhau" +msgstr "Sao chép tỷ lệ của mục tiêu (với dịch chuyển riêng nếu muốn) để chúng có tỷ lệ tương đồng" msgid "Copy Transforms" -msgstr "Chép Biến Hóa" +msgstr "Sao Chép Biến Hóa" msgid "Copy all the transformations of a target, so that they move together" -msgstr "Chép lại hết biến hóa của một mục tiêu cho họ di chuyển cùng nhau" +msgstr "Sao chép các biến hóa của một mục tiêu, hầu cho chúng di chuyển cùng với nhau" msgid "Limit Distance" -msgstr "Hạn Chế Khoảng Cách" +msgstr "Khoảng Cách Giới Hạn" msgid "Restrict movements to within a certain distance of a target (at the time of constraint evaluation only)" -msgstr "Hạn chế chuyển động trong một khoảng cách nhật định từ một mục tiêu (tại thời gian khi tính ràng buộc)" +msgstr "Hạn chế chuyển động trong khoảng cách nhất định từ một mục tiêu (chỉ tại thời điểm tính toán của ràng buộc mà thôi)" msgid "Limit Location" -msgstr "Hạn Chế Vị Trị" +msgstr "Hạn Chế Vị Trí" msgid "Restrict movement along each axis within given ranges" -msgstr "Hạn chế chuyển động theo mỗi trục nằm trong phạm vi được chọn" +msgstr "Hạn chế chuyển động dọc theo mỗi trục trong phạm vi đã cho" msgid "Limit Rotation" -msgstr "Hạn Chế Xoay" +msgstr "Hạn Chế Xoay Chiều" msgid "Restrict rotation along each axis within given ranges" -msgstr "Hạn chế xoay quanh mỗi trục nằm trong phạm vi được chọn" +msgstr "Hạn chế độ xoay dọc theo mỗi trục trong phạm vi đã cho" msgid "Limit Scale" -msgstr "Hạn Chế Phóng To" +msgstr "Hạn Chế Tỷ Lệ" msgid "Restrict scaling along each axis with given ranges" -msgstr "Hạn chế phóng to theo mỗi trục nằm trong pham vị được chọn" +msgstr "Hạn chế sự biến đổi tỷ lệ dọc theo mỗi trục trong phạm vi đã cho" msgid "Maintain Volume" -msgstr "Giữ Thể Thích" +msgstr "Duy Trì Thể Tích" msgid "Compensate for scaling one axis by applying suitable scaling to the other two axes" -msgstr "Bù phóng to của một trục bằng áp dụng phóng to phù hợp cho hai trục kia" +msgstr "Đền bù cho sự biến đổi tỷ lệ của một trục bằng cách áp dụng biến đổi tỷ lệ phù hợp cho hai trục kia" msgid "Transformation" @@ -6277,119 +7000,119 @@ msgstr "Biến Hóa" msgid "Use one transform property from target to control another (or same) property on owner" -msgstr "Dùng một đặc tính biến hóa từ mục tiêu để điều khiển một đặc tính khác (hay giống) của chủ" +msgstr "Dùng một tính chất biến hóa từ mục tiêu để điều khiển một tính chất khác (hay cùng cái) của chủ nhân" msgid "Transform Cache" -msgstr "Đệm Chứa Biến Hóa" +msgstr "Bộ Nhớ Đệm Biến Hóa" msgid "Look up the transformation matrix from an external file" -msgstr "Tìm ma trận biến hóa từ một tập tin ngoài" +msgstr "Tra cứu ma trận biến hóa từ một tập tin ở bên ngoài" msgid "Clamp To" -msgstr "Kẹp Lại Đến" +msgstr "Siết Vào" msgid "Restrict movements to lie along a curve by remapping location along curve's longest axis" -msgstr "Hạn chế chuyển động cho đi trên một đường cong bằng ánh xạ lại vị trí theo trục dài nhất của đường cong" +msgstr "Hạn chế chuyển động trên một đường cong bằng cách ánh xạ lại vị trí dọc theo trục dài nhất của đường cong" msgid "Damped Track" -msgstr "Đuổi Theo Tắt Đần" +msgstr "Dõi Theo có Kiềm Chế" msgid "Point towards a target by performing the smallest rotation necessary" -msgstr "Chỉ đến một mục tiêu bằng xoay hướng cách nhỏ nhất thì cần thiết" +msgstr "Hướng về phía mục tiêu bằng cách xoay quanh với góc độ nhỏ nhất cần thiết" msgid "Inverse Kinematics" -msgstr "Nghịch Động Học (IK)" +msgstr "Động Học Ngược (IK)" msgid "Control a chain of bones by specifying the endpoint target (Bones only)" -msgstr "Điều khiển một chuỗi xương bằng xác định điểm cuối của mục tiêu (chỉ cho Xương)" +msgstr "Điều khiển một dây chuyền các xương bằng cách xác định điểm cuối của mục tiêu (chỉ dành cho các Xương mà thôi)" msgid "Locked Track" -msgstr "Đuổi Theo Khóa" +msgstr "Giám Sát Chốt Chặt" msgid "Rotate around the specified ('locked') axis to point towards a target" -msgstr "Xoay quanh trục được xác định ('bị khóa') cho chỉ đến một mục tiệu" +msgstr "Xoay quanh trục nhất định ('chốt lại') để hướng về phía một mục tiêu" msgid "Spline IK" -msgstr "IK Mẫu Cong" +msgstr "Hàm Nối Trục IK" msgid "Align chain of bones along a curve (Bones only)" -msgstr "Sắp hàng một chuỗi xương theo một đường cong (chỉ cho Xương)" +msgstr "Sắp hàng dây chuyền của các xương dọc theo một đường cong (chỉ dành cho Xương thôi)" msgid "Stretch To" -msgstr "Kéo Đến" +msgstr "Kéo Giãn Tới" msgid "Stretch along Y-Axis to point towards a target" -msgstr "Kéo hướng trục Y đến một mục tiêu" +msgstr "Kéo giãn dọc theo Trục Y để hướng về phía mục tiêu" msgid "Track To" -msgstr "Đuổi Theo Đến" +msgstr "Dõi Theo" msgid "Legacy tracking constraint prone to twisting artifacts" -msgstr "Ràng buộc đuổi theo lỗi thời ưa có vấn đề xoắn không hợp ý" +msgstr "Ràng buộc theo dõi lỗi thời trước đây rất hay bị giả tượng xoắn vặn" msgid "Use transform property of target to look up pose for owner from an Action" -msgstr "Dùng đặc tính biến hóa của mục tiêu để tìm đạng đứng của chủ từ một Hành Động" +msgstr "Dùng tính chất biến hóa của mục tiêu để tìm tư thế cho chủ nhân từ một Hành Động" msgid "Armature" -msgstr "Cốt" +msgstr "Khung Cốt" msgid "Apply weight-blended transformation from multiple bones like the Armature modifier" -msgstr "Áp dụng biến hóa pha trộn có quyền lượng từ nhiều xương giống như bộ điều chỉnh Cốt" +msgstr "Áp dụng sự biến hóa pha trộn bằng trọng lượng từ nhiều xương như bộ điều chỉnh Khung Cốt" msgid "Child Of" -msgstr "Con Cái Của" +msgstr "Làm Con Cái" msgid "Make target the 'detachable' parent of owner" -msgstr "Làm mục tiêu thành phụ huynh 'có thể gỡ ra' của chủ" +msgstr "Biến mục tiêu thành phụ huynh 'tháo lắp được' của chủ nhân" msgid "Floor" -msgstr "Sàn" +msgstr "Nền Sàn/Làm Tròn Xuống" msgid "Use position (and optionally rotation) of target to define a 'wall' or 'floor' that the owner can not cross" -msgstr "Dùng vị trí (và tùy chọn xoay nữa) của mục tiêu để chỉ định một 'tương' hoặc 'sàn' thì chủ không thể xuyên qua" +msgstr "Dùng vị trí (và xoay chiều nữa nếu muốn) của mục tiêu để xác định một 'bức tường' hoặc 'tấm sàn' mà chủ nhân không thể đi xuyên qua được" msgid "Follow Path" -msgstr "Theo Dõi Đường" +msgstr "Đi theo Đường Dẫn" msgid "Use to animate an object/bone following a path" -msgstr "Dùng cho chuyển động một vật thể/xương đi theo dõi một đường nào" +msgstr "Dùng để hoạt họa đối tượng/xương đi theo một đường di chuyển" msgid "Change pivot point for transforms (buggy)" -msgstr "Đổi điểm tựa cho biến hóa (có sai lầm)" +msgstr "Đổi điểm tựa cho biến hóa (có nhiều lỗi trong phần mềm)" msgid "Shrinkwrap" -msgstr "Gói Thu Xiết" +msgstr "Co-Bọc" msgid "Restrict movements to surface of target mesh" -msgstr "Hạn chế chuyển động đến bề mặt của mạng lưới mục tiêu" +msgstr "Hạn chế chỉ được chuyển động ở trên mặt của khung lưới mục tiêu" msgid "Action Constraint" @@ -6397,11 +7120,11 @@ msgstr "Ràng Buộc Hành Động" msgid "Map an action to the transform axes of a bone" -msgstr "Ánh xạ một hành động đến trục biến hóa của một xương" +msgstr "Ánh xạ một hành động sang biến hóa các trục của một xương" msgid "The constraining action" -msgstr "Hành động đang ràng buộc" +msgstr "Hành động bị ràng buộc" msgid "Evaluation Time" @@ -6409,91 +7132,91 @@ msgstr "Thời Gian Tính Toán" msgid "Interpolates between Action Start and End frames" -msgstr "Nội suy giữa bức ảnh Hành Động Đầu và Cuối" +msgstr "Các nội suy giữa các khung hình Khởi Đầu và Cuối của Hành Động" msgid "Last frame of the Action to use" -msgstr "Số bức ảnh cuối của Hành Động để dùng" +msgstr "Khung hình cuối của Hành Động để sử dụng" msgid "First frame of the Action to use" -msgstr "Số bức ảnh đầu của Hành Động để dùng" +msgstr "Khung hình đầu tiên của Hành Động để sử dụng" msgid "Maximum" -msgstr "Cực Đại" +msgstr "Tối Đa" msgid "Maximum value for target channel range" -msgstr "Giá trị cực đại cho phạm vi của kênh mục tiêu" +msgstr "Giá trị tối đa cho phạm vi của kênh mục tiêu" msgid "Minimum" -msgstr "Cực Tiểu" +msgstr "Tối Thiểu" msgid "Minimum value for target channel range" -msgstr "Giá trị cực tiểu cho phạm vi của kênh mục tiêu" +msgstr "Giá trị tối thiểu cho phạm vi của kênh mục tiêu" msgid "Mix Mode" -msgstr "Chế Độ Pha Trộn" +msgstr "Chế Độ Hòa Trộn" msgid "Specify how existing transformations and the action channels are combined" -msgstr "Xác định làm sao gồm các biến hóa với các kênh hành động đang tồn tại" +msgstr "Chỉ định phương pháp các biến hóa hiện tại kết hợp với các kênh hành động" msgid "Before Original (Full)" -msgstr "Trước Ban Đầu (Toàn Bộ)" +msgstr "Trước Bản Gốc (Toàn Phần)" msgid "Apply the action channels before the original transformation, as if applied to an imaginary parent in Full Inherit Scale mode. Will create shear when combining rotation and non-uniform scale" -msgstr "Áp dụng các kênh hành động trước biến hóa ban đầu, làm như được áp dụng cho một phụ huynh ảo trong chế độ Phóng To Thừa Hưởng Toàn Bộ. Sẽ méo mó khi gồm xoay và phóng to không điều đặn" +msgstr "Áp dụng các kênh hành động trước sự biến hóa gốc, tương tự như việc áp dụng vào một phụ huynh tưởng tượng với trong chế độ Tỷ Lệ Thừa Kế Toàn Phần (Full Inherit Scale). Sẽ gây ra sự xô nghiêng khi kết hợp xoay chiều và đổi tỷ lệ bất đồng đều" msgid "Before Original (Aligned)" -msgstr "Trước Ban Đầu (Được Sắp Xếp)" +msgstr "Trước Bản Gốc (Căn Chỉnh)" msgid "Apply the action channels before the original transformation, as if applied to an imaginary parent in Aligned Inherit Scale mode. This effectively uses Full for location and Split Channels for rotation and scale" -msgstr "Áp dụng các kênh hành động trước biến hóa ban đầu, làm như được áp dụng cho một phụ huynh ảo trong chế độ Phóng To Thừa Hưởng Sắp Xếp. Này tương đương như dùng Toàn Bộ cho vị trí và Kênh Chẻ cho xoay và phóng to" +msgstr "Áp dụng các kênh hành động trước sự biến hóa gốc, tương tự như việc áp dụng vào một phụ huynh tưởng tượng với Tỷ Lệ Thừa Kế Căn Chỉnh (Aligned Inherit Scale). Việc làm này không khác gì việc sử dụng Toàn Phần (Full) cho vị trí và sử dụng Tách Phân Kênh (Split Channels) cho xoay chiều và tỷ lệ" msgid "Before Original (Split Channels)" -msgstr "Trước Ban Đầu (Các Kênh Được Chẻ)" +msgstr "Trước Bản Gốc (Tách Phân Kênh)" msgid "Apply the action channels before the original transformation, handling location, rotation and scale separately" -msgstr "Áp dụng các kênh hành động trước biến hóa ban đầu, xử lý vị trí, xoay và phóng to riêng biệt" +msgstr "Áp dụng các kênh hành động trước biến hóa gốc, xử lý vị trí, xoay chiều và tỷ lệ riêng biệt từng cái một" msgid "After Original (Full)" -msgstr "Sau Ban Đầu (Toàn Bộ)" +msgstr "Sau Bản Gốc (Toàn Phần)" msgid "Apply the action channels after the original transformation, as if applied to an imaginary child in Full Inherit Scale mode. Will create shear when combining rotation and non-uniform scale" -msgstr "Áp dụng các kênh hành động sau biến hóa ban đầu, ý hệt nó được áp dụng với một con cái ảo được Phóng To Thừa Hưởng Toàn Bộ. Sẽ méo mó khi gồm xoay và phóng to không điều đặn" +msgstr "Áp dụng các kênh hành động sau biến hóa gốc, tương tự như việc áp dụng vào một con cái tưởng tượng trong chế độ Tỷ Lệ Thừa Kế Toàn Phần (Full Inherit Scale). Sẽ kiến tạo sự xô nghiêng khi kết hợp xoay chiều và đổi tỷ lệ bất đồng đều" msgid "After Original (Aligned)" -msgstr "Sau Ban Đầu (Được Sắp Xếp)" +msgstr "Sau Bản Gốc (Căn Chỉnh)" msgid "Apply the action channels after the original transformation, as if applied to an imaginary child in Aligned Inherit Scale mode. This effectively uses Full for location and Split Channels for rotation and scale" -msgstr "Áp dụng các kênh hành động sau biến hóa ban đầu, như nó được áp dụng với một con cái ảo trong chế độ Phóng To Thừa Hưởng Sắp Xếp. Này tương đương như dùng Toàn Bộ cho vị trí và Kênh Chẻ cho xoay và phóng to" +msgstr "Áp dụng các kênh hành động sau biến hóa gốc, tương tự như việc áp dụng vào một con cái tưởng tượng trong chế độ Tỷ Lệ Thừa Kế Toàn Phần (Full Inherit Scale). Việc làm này cũng giống như việc sử dụng Toàn Phần cho vị trí và sử dụng Tách Phân Kênh cho xoay chiều và đổi tỷ lệ" msgid "After Original (Split Channels)" -msgstr "Sau Ban Đầu (Các Kênh Được Chẻ)" +msgstr "Sau Bản Gốc (Tách Phân Kênh)" msgid "Apply the action channels after the original transformation, handling location, rotation and scale separately" -msgstr "Áp dụng các kênh hành động sau biến hóa ban đầu, xử lý vị trí, xoay và phóng to riêng biệt" +msgstr "Áp dụng các kênh hành động sau biến hóa gốc, xử lý vị trí, xoay chiều và tỷ lệ riêng biệt từng cái một" msgid "Target object" -msgstr "Vật thể mục tiêu" +msgstr "Đối tượng mục tiêu" msgid "Transform Channel" @@ -6501,67 +7224,67 @@ msgstr "Kênh Biến Hóa" msgid "Transformation channel from the target that is used to key the Action" -msgstr "Kênh biến hóa từ mục tiêu được dùng làm bức ảnh mẫu cho hành động" +msgstr "Kênh biến hóa từ mục tiêu được sử dụng để tạo khung khóa của Hành Động" msgid "X Location" -msgstr "Vit Trí X" +msgstr "Vị Trí X" msgid "Y Location" -msgstr "Vit Trí Y" +msgstr "Vị Trí Y" msgid "Z Location" -msgstr "Vit Trí Z" +msgstr "Vị Trí Z" msgid "X Rotation" -msgstr "Xoay X" +msgstr "Xoay chiều X" msgid "Y Rotation" -msgstr "Xoay Y" +msgstr "Xoay chiều Y" msgid "Z Rotation" -msgstr "Xoay Z" +msgstr "Xoay chiều Z" msgid "X Scale" -msgstr "Phóng To X" +msgstr "Tỷ Lệ X" msgid "Y Scale" -msgstr "Phóng To Y" +msgstr "Tỷ Lệ Y" msgid "Z Scale" -msgstr "Phóng To Z" +msgstr "Tỷ Lệ Z" msgid "Object Action" -msgstr "Hành Động Vật Thể" +msgstr "Hành Động của Đối Tượng" msgid "Bones only: apply the object's transformation channels of the action to the constrained bone, instead of bone's channels" -msgstr "Chi cho xương: áp dụng kênh biến hóa hành động của vật thể đến xương bị ràng buộc, thay thế các kênh của xương đó" +msgstr "Chỉ dành cho xương: áp dụng các kênh biến hóa hành động của đối tượng sang xương bị ràng buộc, thay vì các kênh của xương" msgid "Use Evaluation Time" -msgstr "Dun`g Thời Gian Tính Toán" +msgstr "Sử Dụng Thời Gian Tính Toán" msgid "Interpolate between Action Start and End frames, with the Evaluation Time slider instead of the Target object/bone" -msgstr "Suy nột giữa bức ảnh Hành Động Đầu và Cuối, với đồ kéo của Thời Gian Tính Tóan thay thế xương/vật thể Mục Tiêu" +msgstr "Nội suy giữa các khung hình khởi đầu và cuối của hành động, dùng thanh trượt Thời Gian Tính Toán, thay vì dùng xương/đối tượng Mục Tiêu" msgid "Armature Constraint" -msgstr "Ràng Buộc Cốt" +msgstr "Ràng Buộc Khung Cốt" msgid "Applies transformations done by the Armature modifier" -msgstr "Áp dụng các biến hóa từ bộ điều chỉnh Cốt" +msgstr "Áp dụng các biến hóa được thực hiện bởi bộ điều chỉnh Khung Cốt" msgid "Targets" @@ -6573,55 +7296,55 @@ msgstr "Xương Mục Tiêu" msgid "Use Envelopes" -msgstr "Sử Dụng Bao Bì" +msgstr "Dùng Phong Bao" msgid "Multiply weights by envelope for all bones, instead of acting like Vertex Group based blending. The specified weights are still used, and only the listed bones are considered" -msgstr "Nhân quyền lượng với bao bì cho tất cả xương, thay thế làm như uốn cong cơ sở Nhóm Đỉnh. Quyển lượng xác định vẫn được sử dụng, nhưng chỉ áp dụng cho xương trong danh sách" +msgstr "Nhân trọng lượng bằng phong bao cho toàn bộ các xương, thay vì hành xử như sự pha trộn dựa trên Nhóm Điểm Đỉnh. Các trọng lượng chỉ định vẫn được sử dụng và chỉ các xương được liệt kê mới được xem xét đến" msgid "Use Current Location" -msgstr "Sử Dụng Vị Trí Hiện Tại" +msgstr "Sử Dụng Địa Điểm Hiện Tại" msgid "Use the current bone location for envelopes and choosing B-Bone segments instead of rest position" -msgstr "Sử dụng vị trí xương hiện tại cho bao bì và chọn khúc Xương-B thay thế vị trí nghỉ ngơi" +msgstr "Dùng địa điểm xương hiện tại cho các phong bao và lựa chọn các phân đoạn của Xương-Dẻo thay vì vị trí nghỉ" msgid "Preserve Volume" -msgstr "Giữ Nguyên Thể Tích" +msgstr "Bảo Tồn Thể Tích" msgid "Deform rotation interpolation with quaternions" -msgstr "Méo suy nội xoay bằng quaternion" +msgstr "Nội suy xoay chiều biến dạng với Quatenion" msgid "Camera Solver Constraint" -msgstr "Ràng Buộc Trình Giải Nghiệm Máy Quay Phim" +msgstr "Ràng Buộc Giải Nghiệm Máy Quay Phim" msgid "Lock motion to the reconstructed camera movement" -msgstr "Khóa chuyển động đến chuyển động máy quay phim được xây dựng lại" +msgstr "Khóa chuyển động vào chuyển động được khôi phục lại của máy quay phim" msgid "Movie Clip to get tracking data from" -msgstr "Lấy dữ liệu đuổi theo từ Khúc Phim nào" +msgstr "Đoạn Phim để lấy dữ liệu giám sát từ đó ra" msgid "Active Clip" -msgstr "Khúc Hành Động" +msgstr "Đoạn Phim đang Hoạt Động" msgid "Use active clip defined in scene" -msgstr "Dùng khúc hoạt động được chỉ định trong cảnh" +msgstr "Dùng đoạn phim đang hoạt động định nghĩa trong cảnh" msgid "Child Of Constraint" -msgstr "Ràng Buộc Của Con Cái" +msgstr "Ràng Buộc Làm Con Cái" msgid "Create constraint-based parent-child relationship" -msgstr "Chế tạo quan hệ phụ huynh-con cái cơ sở ràng buộc" +msgstr "Kiến Tạo quan hệ phụ huynh cơ sở ràng buộc" msgid "Inverse Matrix" @@ -6629,15 +7352,15 @@ msgstr "Ma Trận Đảo Nghịch" msgid "Transformation matrix to apply before" -msgstr "Ma trận biến hóa để áp dụng trước" +msgstr "Ma trận biến hóa cho áp dụng trước" msgid "Set Inverse Pending" -msgstr "Đặt Tính Lại Đảo Nghịch" +msgstr "Đặt Chờ Đảo Ngược" msgid "Set to true to request recalculation of the inverse matrix" -msgstr "Đặt đúng để kêu tính lại ma trận đảo nghịch" +msgstr "Đặt là ĐÚNG để yêu cầu tái tính toán ma trận đảo ngược (phải chờ đợi để yêu cầu được thi hành)" msgid "Location X" @@ -6645,7 +7368,7 @@ msgstr "Vị Trí X" msgid "Use X Location of Parent" -msgstr "Dùng Vị Trí X Của Phụ Huynh" +msgstr "Dùng Vị Trí X của Phụ Huynh" msgid "Location Y" @@ -6653,7 +7376,7 @@ msgstr "Vị Trí Y" msgid "Use Y Location of Parent" -msgstr "Dùng Vị Trí Y Của Phụ Huynh" +msgstr "Dùng Vị Trí Y của Phụ Huynh" msgid "Location Z" @@ -6661,71 +7384,71 @@ msgstr "Vị Trí Z" msgid "Use Z Location of Parent" -msgstr "Dùng Vị Trí Z Của Phụ Huynh" +msgstr "Dùng Vị Trí Z của Phụ Huynh" msgid "Rotation X" -msgstr "Xoay X" +msgstr "Xoay Chiều X" msgid "Use X Rotation of Parent" -msgstr "Dùng Xoay X Của Phụ Huynh" +msgstr "Dùng Xoay Chiều X của Phụ Huynh" msgid "Rotation Y" -msgstr "Xoay Y" +msgstr "Xoay Chiều Y" msgid "Use Y Rotation of Parent" -msgstr "Dùng Xoay Y Của Phụ Huynh" +msgstr "Dùng Xoay Chiều Y của Phụ Huynh" msgid "Rotation Z" -msgstr "Xoay Z" +msgstr "Xoay Chiều Z" msgid "Use Z Rotation of Parent" -msgstr "Dùng Xoay Z Của Phụ Huynh" +msgstr "Dùng Xoay Chiều Z của Phụ Huynh" msgid "Scale X" -msgstr "Phóng To X" +msgstr "Tỷ Lệ X" msgid "Use X Scale of Parent" -msgstr "Dùng Phóng To X Của Phụ Huynh" +msgstr "Dùng Tỷ Lệ X của Phụ Huynh" msgid "Scale Y" -msgstr "Phóng To Y" +msgstr "Tỷ Lệ Y" msgid "Use Y Scale of Parent" -msgstr "Dùng Phóng To Y Của Phụ Huynh" +msgstr "Dùng Tỷ Lệ Y của Phụ Huynh" msgid "Scale Z" -msgstr "Phóng To Z" +msgstr "Tỷ Lệ Z" msgid "Use Z Scale of Parent" -msgstr "Dùng Phóng To Z Của Phụ Huynh" +msgstr "Dùng Tỷ Lệ Z của Phụ Huynh" msgid "Clamp To Constraint" -msgstr "Kẹp Lại Đến Ràng Buộc" +msgstr "Ràng Buộc Siết Vào" msgid "Constrain an object's location to the nearest point along the target path" -msgstr "Ràng buộc vị trí của một vật thể đến điểm gần nhất ở trên đường mục tiêu" +msgstr "Ràng buộc một vị trí đối tượng đến điểm gần nhất trên đường mục tiêu" msgid "Main Axis" -msgstr "Trục Chánh" +msgstr "Trục Chính" msgid "Main axis of movement" -msgstr "Trục chánh của chuyển động" +msgstr "Trục chính cho chuyển động" msgid "X" @@ -6741,23 +7464,23 @@ msgstr "Z" msgid "Target Object (Curves only)" -msgstr "Vật Thể Mục Tiêu (chỉ cho Đường Cong)" +msgstr "Đối Tượng Mục Tiêu (duy Đường Cong)" msgid "Cyclic" -msgstr "Chu Trình" +msgstr "Tuần Hoàn" msgid "Treat curve as cyclic curve (no clamping to curve bounding box)" -msgstr "Cử Sử với đường cong như đường cong chu trình (không kẹp lại trong hộp ranh giới của đường cong)" +msgstr "Coi đường cong là tuần hoàn (không hạn chế trong khung hộp viền của đường cong)" msgid "Copy Location Constraint" -msgstr "Chép Vị Trí Ràng Buộc" +msgstr "Sao Chép Vị Trí Ràng Buộc" msgid "Copy the location of the target" -msgstr "Chép lại vị trí của mục tiêu" +msgstr "Sao chép vị trí của mục tiêu" msgid "Head/Tail" @@ -6765,7 +7488,7 @@ msgstr "Đầu/Đuôi" msgid "Target along length of bone: Head is 0, Tail is 1" -msgstr "Mục tiêu trên bề dài của xương: Đầu là 0, Đuôi là 1" +msgstr "Mục tiêu dọc theo chiều dài của xương: Đầu = 0, Đuôi = 1" msgid "Invert X" @@ -6793,47 +7516,47 @@ msgstr "Đảo nghịch vị trí Z" msgid "Follow B-Bone" -msgstr "Đi Theo Xương-B" +msgstr "Đi theo Xương-Dẻo" msgid "Follow shape of B-Bone segments when calculating Head/Tail position" -msgstr "Đi theo hình dạng của khúc Xương-B khi tính vị trí Đầu/Đuôi" +msgstr "Đi theo hình dạng của các đoạn Xương-Dẻo khi tính vị trí Đầu/Đuôi" msgid "Add original location into copied location" -msgstr "Cộng vị trí bản chánh với vị trí được chép" +msgstr "Thêm vị trí gốc vào vị trí đã sao chép" msgid "Copy X" -msgstr "Chép X" +msgstr "Sao Chép X" msgid "Copy the target's X location" -msgstr "Chép lại vị trí X của mục tiêu" +msgstr "Sao chép vị trí X của mục tiêu" msgid "Copy Y" -msgstr "Chép Y" +msgstr "Sao Chép Y" msgid "Copy the target's Y location" -msgstr "Chép lại vị trí Y của mục tiêu" +msgstr "Sao chép vị trí Y của mục tiêu" msgid "Copy Z" -msgstr "Chép Z" +msgstr "Sao Chép Z" msgid "Copy the target's Z location" -msgstr "Chép lại vị trí Z của mục tiêu" +msgstr "Sao chép vị trí Z của mục tiêu" msgid "Copy Rotation Constraint" -msgstr "Chép Ràng Buộc Xoay" +msgstr "Ràng Buộc Sao Chép sự Xoay Chiều" msgid "Copy the rotation of the target" -msgstr "Chép lại xoay của mục tiêu" +msgstr "Sao chép sự xoay chiều của mục tiêu" msgid "Euler Order" @@ -6841,7 +7564,7 @@ msgstr "Thứ Tự Euler" msgid "Explicitly specify the euler rotation order" -msgstr "Trực tiếp chỉ định thứ tự xoay Euler" +msgstr "Xác định dứt khoát thứ tự xoay chiều euler" msgid "Default" @@ -6849,7 +7572,7 @@ msgstr "Mặc Định" msgid "Euler using the default rotation order" -msgstr "Dùng thứ tự xoay Euler mặc định" +msgstr "Euler sử dụng thứ tự xoay chiều mặc định" msgid "XYZ Euler" @@ -6857,7 +7580,7 @@ msgstr "Euler XYZ" msgid "Euler using the XYZ rotation order" -msgstr "Dùng thứ tự xoay Euler XYZ" +msgstr "Euler sử dụng thứ tự xoay chiều XYZ" msgid "XZY Euler" @@ -6865,7 +7588,7 @@ msgstr "Euler XZY" msgid "Euler using the XZY rotation order" -msgstr "Dùng thứ tự xoay Euler XZY" +msgstr "Euler sử dụng thứ tự xoay chiều XZY" msgid "YXZ Euler" @@ -6873,7 +7596,7 @@ msgstr "Euler YXZ" msgid "Euler using the YXZ rotation order" -msgstr "Dùng thứ tự xoay Euler YXZ" +msgstr "Euler sử dụng thứ tự xoay chiều YXZ" msgid "YZX Euler" @@ -6881,7 +7604,7 @@ msgstr "Euler YZX" msgid "Euler using the YZX rotation order" -msgstr "Dùng thứ tự xoay Euler YZX" +msgstr "Euler sử dụng thứ tự xoay chiều YZX" msgid "ZXY Euler" @@ -6889,267 +7612,267 @@ msgstr "Euler ZXY" msgid "Euler using the ZXY rotation order" -msgstr "Dùng thứ tự xoay Euler ZXY" +msgstr "Euler sử dụng thứ tự xoay chiều ZXY" msgid "ZYX Euler" -msgstr "Euler ZYX" +msgstr "Euler XYZ" msgid "Euler using the ZYX rotation order" -msgstr "Dùng thứ tự xoay Euler ZYX" +msgstr "Euler sử dụng thứ tự xoay chiều ZYX" msgid "Invert the X rotation" -msgstr "Đảo nghịch xoay X" +msgstr "Đảo nghịch sự xoay chiều X" msgid "Invert the Y rotation" -msgstr "Đảo nghịch xoay Y" +msgstr "Đảo nghịch sự xoay chiều Y" msgid "Invert the Z rotation" -msgstr "Đảo nghịch xoay Z" +msgstr "Đảo nghịch sự xoay chiều Z" msgid "Specify how the copied and existing rotations are combined" -msgstr "Chỉ định cách gồm xoay có sẳn và xoay được chép" +msgstr "Xác định phương pháp kết hợp sự xoay chiều sao chép với sự xoay chiều hiện tại với nhau" msgid "Replace the original rotation with copied" -msgstr "Thay xoay ban đầu với xoay được chép" +msgstr "Thay thế sự xoay chiều gốc với sự xoay chiều sao chép" msgid "Add euler component values together" -msgstr "Cộng giá trị của thành phần Euler với nhau" +msgstr "Cộng các giá trị phần tử của euler lại" msgid "Before Original" -msgstr "Trước Ban Đầu" +msgstr "Trước Bản Gốc" msgid "Apply copied rotation before original, as if the constraint target is a parent" -msgstr "Áp dụng xoay được chép trước xoay ban đầu, như mục đích ràng buộc là một phụ huynh" +msgstr "Áp dụng sự xoay chiều sao chép trước, trước sự xoay chiều gốc, tương tự như ràng buộc mục tiêu là phụ huynh vậy" msgid "After Original" -msgstr "Sau Bàn Đầu" +msgstr "Sau Bản Gốc" msgid "Apply copied rotation after original, as if the constraint target is a child" -msgstr "Áp dụng xoay được chép sau xoay ban đầu, như mục đích ràng buộc là một con cái" +msgstr "Áp dụng sự xoay chiều sao chép sau, sau sự xoay chiều gốc, tương tự như ràng buộc mục tiêu là con cái vậy" msgid "Offset (Legacy)" -msgstr "Dịch (Lỗi Thời)" +msgstr "Dịch chuyển (Lỗi Thời)" msgid "Combine rotations like the original Offset checkbox. Does not work well for multiple axis rotations" -msgstr "Gồm các xoay giống như hộp đắng ký ban đầu. Không tốt cho xoay quanh nhiều trục" +msgstr "Kết hợp các sự xoay chiều giống như hộp kiểm Dịch Chuyển (Offset checkbox) cũ. Không làm việc hiệu quả lắm đối với những xoay chiều đa trục" msgid "DEPRECATED: Add original rotation into copied rotation" -msgstr "LỖI THỜI: Cộng xoay ban đầu vào xoay được chép lại" +msgstr "ĐÃ Lỗi THỜI: thêm sự xoay chiều gốc vào sự xoay chiều sao chép" msgid "Copy the target's X rotation" -msgstr "Chép xoay X của mục tiêu" +msgstr "Sao chép độ xoay X của mục tiêu" msgid "Copy the target's Y rotation" -msgstr "Chép xoay Y của mục tiêu" +msgstr "Sao chép độ xoay Y của mục tiêu" msgid "Copy the target's Z rotation" -msgstr "Chép xoay Z của mục tiêu" +msgstr "Sao chép độ xoay Z của mục tiêu" msgid "Copy Scale Constraint" -msgstr "Chép Ràng Buộc Phóng To" +msgstr "Sao Chép Ràng Buộc về Tỷ Lệ" msgid "Copy the scale of the target" -msgstr "Chép lại phóng to của mục tiêu" +msgstr "Sao chép tỷ lệ của mục tiêu" msgid "Power" -msgstr "Lũy Thừa" +msgstr "Công Suất/Năng Lượng/Sức Mạnh/Lũy Thừa" msgid "Raise the target's scale to the specified power" -msgstr "Áp dụng lũy thừa được xác định với phóng to của mục tiêu" +msgstr "Nâng tỷ lệ đích lên một lũy thừa chỉ định" msgid "Additive" -msgstr "Cộng" +msgstr "Bổ Sung/Cộng/Gia Tăng" msgid "Use addition instead of multiplication to combine scale (2.7 compatibility)" -msgstr "Sử dụng phép tóan cộng thay thế nhân để góp phóng to (cho hợp với phiên bản 2.7)" +msgstr "Sử dụng phép cộng thay vì nhân để kết hợp tỷ lệ (tương thích với 2.7)" msgid "Make Uniform" -msgstr "Làm Đều" +msgstr "Đồng Đều Hóa" msgid "Redistribute the copied change in volume equally between the three axes of the owner" -msgstr "Phân phối lại đều sự thay đổi của thể tích được chép giữa ba trục của chủ" +msgstr "Phân bổ lại sự thay đổi sao chép trong thể tích đồng đều cho 3 trục của chủ sở hữu" msgid "Combine original scale with copied scale" -msgstr "Góp phóng to ban đầu với phóng to được chép lại" +msgstr "Kết hợp tỷ lệ gốc với tỷ lệ sao chép" msgid "Copy the target's X scale" -msgstr "Chép lại xoay X của mục tiêu" +msgstr "Sao chép tỷ lệ X của mục tiêu" msgid "Copy the target's Y scale" -msgstr "Chép lại xoay Y của mục tiêu" +msgstr "Sao chép tỷ lệ Y của mục tiêu" msgid "Copy the target's Z scale" -msgstr "Chép lại xoay Z của mục tiêu" +msgstr "Sao chép tỷ lệ Z của mục tiêu" msgid "Copy Transforms Constraint" -msgstr "Chép Ràng Buộc Biến Hóa" +msgstr "Sao Chép Ràng Buộc Biến Hóa" msgid "Copy all the transforms of the target" -msgstr "Chép lại hết biến hóa của mục tiêu" +msgstr "Sao chép lại toàn bộ các biến hóa của mục tiêu" msgid "Specify how the copied and existing transformations are combined" -msgstr "Chỉ định làm sao biến hóa chép và biến hóa có sẵn được gồm lại" +msgstr "Xác định phương pháp kết hợp các biến hóa sao chép với các biến hóa hiện tại" msgid "Replace the original transformation with copied" -msgstr "Thay biến hóa ban đầu bằng biến hóa được chép" +msgstr "Thay thế biến hóa gốc với biến hóa sao chép" msgid "Apply copied transformation before original, using simple matrix multiplication as if the constraint target is a parent in Full Inherit Scale mode. Will create shear when combining rotation and non-uniform scale" -msgstr "Áp dụng biến hóa được sao chép trước ban đầu, dùng nhân ma trận đơn giản giống như mục tiêu ràng buộc là con cái trong chế độ Phóng To Thừa Hưởng Toàn Bộ. Nó sẽ méo khi ghép xoay và phóng to không đều" +msgstr "Áp dụng biến hóa sao chép trước bản gốc, sử dụng phép nhân ma trận đơn giản tự như mục tiêu ràng buộc là phụ huynh trong chế độ Tỷ Lệ Thừa Kế Toàn Phần. Sẽ gây ra sự xô nghiêng khi kết hợp xoay chiều và đổi tỷ lệ bất đồng đều" msgid "Apply copied transformation before original, as if the constraint target is a parent in Aligned Inherit Scale mode. This effectively uses Full for location and Split Channels for rotation and scale" -msgstr "Áp dụng biến hóa được sao chép trước ban đầu, giống như mục tiêu ràng buộc là con cái trong chế độ Phóng To Thừa Hưởng Được Sắp Xếp. Cái này như sử dụng Toàn Bộ cho vị trí và Các Kênh Được Chẻ cho xoay và phóng to" +msgstr "Áp dụng biến hóa sao chép trước bản gốc, tương tự như mục tiêu ràng buộc là phụ huynh trong chế độ Tỷ Lệ Thừa Kế Căn Chỉnh. Việc làm này không khác gì việc sử dụng Toàn Phần (Full) cho vị trí và sử dụng Tách Phân Kênh (Split Channels) cho xoay chiều và tỷ lệ" msgid "Apply copied transformation before original, handling location, rotation and scale separately, similar to a sequence of three Copy constraints" -msgstr "Áp dụng biến hóa được sao chép trước ban đầu, xữ lý vị trí, xoay và phóng to riêng tự, giống như một trình tự có ba cái ràng buộc Sao Chép" +msgstr "Áp dụng biến hóa sao chép trước bản gốc, xử lý vị trí, xoay chiều và tỷ lệ riêng biệt từng cái một, tương tự như một chuỗi lần lượt ba ràng buộc Sao Chép vậy" msgid "Apply copied transformation after original, using simple matrix multiplication as if the constraint target is a child in Full Inherit Scale mode. Will create shear when combining rotation and non-uniform scale" -msgstr "Áp dụng biến hóa được sao chép sau ban đầu, dùng nhân ma trận đơn giản giống như mục tiêu ràng buộc là con cái trong chế độ Phóng To Thừa Hưởng Toàn Bộ. Nó sẽ méo khi ghép xoay và phóng to không đều" +msgstr "Áp dụng biến hóa sao chép sau bản gốc, sử dụng phép nhân ma trận đơn giản như thể mục tiêu ràng buộc là một con cái ở chế độ Tỷ Lệ Thừa Kế Toàn Phần. Sẽ gây ra sự xô nghiêng khi kết hợp xoay chiều và đổi tỷ lệ bất đồng đều" msgid "Apply copied transformation after original, as if the constraint target is a child in Aligned Inherit Scale mode. This effectively uses Full for location and Split Channels for rotation and scale" -msgstr "Áp dụng biến hóa được sao chép sau ban đầu, giống như mục tiêu ràng buộc là con cái trong chế độ Phóng To Thừa Hưởng Được Sắp Xếp. Cái này như sử dụng Toàn Bộ cho vị trí và Các Kênh Được Chẻ cho xoay và phóng to" +msgstr "Áp dụng biến hóa sao chép sau bản gốc, như thể mục tiêu ràng buộc là một con cái ở chế độ Tỷ Lệ Thừa Kế Căn Chỉnh (Aligned Inherit Scale). Việc làm này không khác gì việc sử dụng Toàn Phần (Full) cho vị trí và sử dụng Tách Phân Kênh (Split Channels) cho xoay chiều và tỷ lệ" msgid "Apply copied transformation after original, handling location, rotation and scale separately, similar to a sequence of three Copy constraints" -msgstr "Áp dụng biến hóa được sao chép sau ban đầu, xữ lý vị trí, xoay và phóng to riêng tự, giống như một trình tự có ba cái ràng buộc Sao Chép" +msgstr "Áp dụng biến hóa sao chép sau bản gốc, xử lý vị trí, xoay chiều và tỷ lệ riêng biệt từng cái một, tương tự như một chuỗi lần lượt ba ràng buộc Sao Chép (Copy) vậy" msgid "Remove Target Shear" -msgstr "Xóa Méo Mục Tiêu" +msgstr "Xóa Xô Nghiêng ở Mục Tiêu" msgid "Remove shear from the target transformation before combining" -msgstr "Xóa méo từ biến hóa của mục tiêu trước ghép" +msgstr "Loại bỏ sự xô nghiêng ra khỏi biến hóa của mục tiêu trước khi kết hợp" msgid "Damped Track Constraint" -msgstr "Ràng Buộc Đuổi Theo Tắt Dần" +msgstr "Ràng Buộc Giám Sát có Kiềm Chế" msgid "Point toward target by taking the shortest rotation path" -msgstr "Chỉ đến mục tiêu bằng đi đường xoay ngắn nhất" +msgstr "Hướng về phía mục tiêu bằng đường xoay ngắn nhất" msgid "Track Axis" -msgstr "Trục Đuổi Theo" +msgstr "Trục Giám Sát" msgid "Axis that points to the target object" -msgstr "Trục chỉ đến vật thể mục tiêu" +msgstr "Trục hướng vào đối tượng mục tiêu" msgid "Floor Constraint" -msgstr "Ràng Buộc Sàn" +msgstr "Ràng Buộc Nền Sàn" msgid "Use the target object for location limitation" -msgstr "Dùng vật thể mục tiêu cho hạn chế vị trí" +msgstr "Dùng đối tượng mục tiêu để hạn chế vị trí" msgid "Floor Location" -msgstr "Vị Trí Sàn" +msgstr "Vị Trí của Nền Sàn" msgid "Location of target that object will not pass through" -msgstr "Vị trí của mục tiêu thì vật thể sẽ không xuyên qua" +msgstr "Vị trí của mục tiêu mà đối tượng sẽ không thể xuyên qua được" msgid "Offset of floor from object origin" -msgstr "Dích của sàn từ gốc tọa độ vật thể" +msgstr "Dịch chuyển của đáy từ tọa độ gốc của đối tượng" msgid "Use Rotation" -msgstr "Dùng Xoay" +msgstr "Dùng Độ Xoay" msgid "Use the target's rotation to determine floor" -msgstr "Dùng xoay của mục tiêu cho xác định sàn" +msgstr "Dùng độ xoay của mục tiêu để xác định đáy" msgid "Follow Path Constraint" -msgstr "Theo Dõi Ràng Buộc Đường Đi" +msgstr "Ràng Buộc Đi theo Đường Dẫn" msgid "Lock motion to the target path" -msgstr "Khóa chuyển động ở trên đường đi của mục tiêu" +msgstr "Khóa chuyển động vào đường dẫn mục tiêu" msgid "Forward Axis" -msgstr "Trục Phía Trước" +msgstr "Trục Hướng Trước" msgid "Axis that points forward along the path" -msgstr "Trục chỉ đến phía trước trên đường đi" +msgstr "Trục hướng về phía trước, dọc theo đường đi" msgid "Offset from the position corresponding to the time frame" -msgstr "Dịch từ vị trí tùy theo bức ảnh thời gian" +msgstr "Dịch chuyển từ vị trí tương ứng với thời gian của khung hình" msgid "Offset Factor" -msgstr "Hệ Số Dịch" +msgstr "Hệ Số Dịch Chuyển" msgid "Percentage value defining target position along length of curve" -msgstr "Giá trị phần trăm cho chỉ định vị trí mục tiêu trên bề dài của đường cong" +msgstr "Giá trị phần trăm dùng để xác định vị trí mục tiêu dọc theo chiều dài của đường cong" msgid "Target Curve object" -msgstr "Vật Thể Đường Cong Mục Tiêu" +msgstr "Đường Cong Mục Tiêu" msgid "Up Axis" -msgstr "Trục Trên" +msgstr "Trục Đứng" msgid "Axis that points upward" -msgstr "Trục chỉ đến phía trên" +msgstr "Trục hướng dựng đứng" msgid "Follow Curve" -msgstr "Theo Đõi Đường Cong" +msgstr "Đi Theo Đường Cong" msgid "Object will follow the heading and banking of the curve" -msgstr "Vật the sẽ theo dõi hướng và ngiêng cửa đường cong" +msgstr "Đối tượng sẽ đi theo hướng và góc xoay nghiêng của đường cong" msgid "Curve Radius" @@ -7157,23 +7880,23 @@ msgstr "Bán Kính Đường Cong" msgid "Object is scaled by the curve radius" -msgstr "Vật thể được phóng to bằng bán kính đường cong" +msgstr "Đối tượng được tỷ lệ hóa bởi bán kính của đường cong" msgid "Fixed Position" -msgstr "Vị Trí Không Đổi" +msgstr "Vị Trí Cố Định" msgid "Object will stay locked to a single point somewhere along the length of the curve regardless of time" -msgstr "Vật thể sẽ bị dính tại một điểm nào trên đường cong, mãi mãi" +msgstr "Đối tượng sẽ đứng im tại một vị trí nào đó dọc theo chiều dài của đường cong, bất kể thời gian" msgid "Follow Track Constraint" -msgstr "Theo Dõi Ràng Buộc Đuổi Theo" +msgstr "Ràng Buộc Giám Sát Chuyển Động" msgid "Lock motion to the target motion track" -msgstr "Khóa chuyển động đến đường đuổi theo chuyển động của mục tiêu" +msgstr "Khóa chuyển động vào sự giám sát chuyển động của mục tiêu" msgid "Camera" @@ -7181,63 +7904,63 @@ msgstr "Máy Quay Phim" msgid "Camera to which motion is parented (if empty active scene camera is used)" -msgstr "Máy quay phim nào được làm phụ huynh của chuyển động (nếu trống, sẽ dùng máy quay phim hoạt động trong cảnh)" +msgstr "Máy quay phim với chuyển động đã được phụ huynh hóa (nếu bỏ trống thì sẽ sử dụng máy quay phim đang hoạt động trong cảnh)" msgid "Depth Object" -msgstr "Vật Thể Độ Sâu" +msgstr "Đối Tượng định Độ Sâu" msgid "Object used to define depth in camera space by projecting onto surface of this object" -msgstr "Dùng vật thể nào để xác định độ sâu trong không gian máy quay phim bằng phép chiếu trên bề mặt của vật thể này" +msgstr "Đối tượng dùng để xác định độ sâu trong không gian của máy quay phim bằng cách phóng chiếu lên mặt của đối tượng này" msgid "How the footage fits in the camera frame" -msgstr "Làm sao làm khúc phim vừa vào khung máy quay phim" +msgstr "Đoạn phim sẽ được đặt khít vừa vào khung hình của máy quay phim như thế nào" msgid "Movie tracking object to follow (if empty, camera object is used)" -msgstr "Vật thể duổi theo phim nào để đuối theo (nếu trống, sẽ dùng vật thể máy quay phim)" +msgstr "Đối tượng giám sát phim để giám sát (nếu bỏ trống thì sẽ dùng máy quay phim)" msgid "Track" -msgstr "Đuổi Theo" +msgstr "Giám Sát/Rãnh" msgid "Movie tracking track to follow" -msgstr "Theo đõi đường đuổi theo phim nào" +msgstr "Đường giám sát phim để đi theo" msgid "3D Position" -msgstr "Vị Trị 3 Chiều" +msgstr "Vị Trí 3D" msgid "Use 3D position of track to parent to" -msgstr "Phụ huynh với vị trí 3D của đường đuổi theo" +msgstr "Phụ huynh hóa vào vị trí 3D của giám sát" msgid "Undistort" -msgstr "Xóa Méo" +msgstr "Chưa Biến Dạng" msgid "Parent to undistorted position of 2D track" -msgstr "Phụ huynh với vị trí không méo của đường đuổi theo 2D" +msgstr "Phụ huynh hóa với vị trí chưa biến dạng của giám sát 2D" msgid "Kinematic Constraint" -msgstr "Ràng buộc Động Học" +msgstr "Ràng Buộc Động Học" msgid "Chain Length" -msgstr "Độ Dài Chuỗi" +msgstr "Chiều Dài của Dây Chuyền" msgid "How many bones are included in the IK effect - 0 uses all bones" -msgstr "Số lượng xương được gồm vào hiệu ứng IK - số 0 được dsử dụng hết xương" +msgstr "Số lượng xương bao gồm trong hiệu ứng IK - số 0 nghĩa là dùng toàn bộ các xương" msgid "Radius of limiting sphere" -msgstr "Bán kín của hình cầu hạn chế" +msgstr "Bán kính của khối cầu giới hạn" msgid "IK Type" @@ -7245,11 +7968,11 @@ msgstr "Loại IK" msgid "Copy Pose" -msgstr "Chép Dạng Đứng" +msgstr "Sao Chép Tư Thế" msgid "Maximum number of solving iterations" -msgstr "Số lượng lặp lại tối đa" +msgstr "Số lần tối đa lặp lại quá trình giải nghiệm" msgid "Limit Mode" @@ -7257,23 +7980,23 @@ msgstr "Chế Độ Giới Hạn" msgid "Distances in relation to sphere of influence to allow" -msgstr "Khoảng cách tương đối với hình cầu ảnh hưởng" +msgstr "Khoảng cách cho phép tương đối với khối cầu ảnh hưởng" msgid "Inside" -msgstr "Phía Trong" +msgstr "Bên Trong" msgid "The object is constrained inside a virtual sphere around the target object, with a radius defined by the limit distance" -msgstr "Vật thể bị ràng buộc trong một hình cầu ảo bao quanh vật thể mục tiêu, có bán kính được chỉ định bằng khoảng cách hạn chế" +msgstr "Đối tượng bị ràng buộc bên trong một khối cầu ảo bao quanh đối tượng mục tiêu, với bán kính được xác định bằng khoảng cách hạn chế" msgid "Outside" -msgstr "Phía Ngoài" +msgstr "Bên Ngoài" msgid "The object is constrained outside a virtual sphere around the target object, with a radius defined by the limit distance" -msgstr "Vật thể bị ràng buộc ngoài một hình cầu ảo quanh vật thể mục tiêu, có bán kính xác định bằng hạn chế khoảng cách" +msgstr "Đối tượng bị ràng buộc bên ngoài một khối cầu ảo bao quanh đối tượng mục tiêu, với bán kính được xác định bằng khoảng cách hạn chế" msgid "On Surface" @@ -7281,7 +8004,7 @@ msgstr "Trên Bề Mặt" msgid "The object is constrained on the surface of a virtual sphere around the target object, with a radius defined by the limit distance" -msgstr "Vật thể bị ràng buộc trên bề mặt của một hình cầu ảo bao quanh vật thể mục tiêu, có bán kính đợc chỉ định bằng khoảng cách hạn chế" +msgstr "Đối tượng bị ràng buộc trên mặt của một hình cầu ảo bao quanh đối tượng mục tiêu, với bán kính được xác định bằng khoảng cách hạn chế" msgid "Lock X Pos" @@ -7289,7 +8012,7 @@ msgstr "Khóa Vị Trí X" msgid "Constraint position along X axis" -msgstr "Vị trí ràng buộc hướng trục X" +msgstr "Vị trí ràng buộc dọc theo trục X" msgid "Lock Y Pos" @@ -7297,7 +8020,7 @@ msgstr "Khóa Vị Trí Y" msgid "Constraint position along Y axis" -msgstr "Vị trí ràng buộc hướng trục Y" +msgstr "Vị trí ràng buộc dọc theo trục Y" msgid "Lock Z Pos" @@ -7305,67 +8028,67 @@ msgstr "Khóa Vị Trí Z" msgid "Constraint position along Z axis" -msgstr "Vị trí ràng buộc hướng trục Z" +msgstr "Vị trí ràng buộc dọc theo trục Z" msgid "Lock X Rotation" -msgstr "Khóa Xoay X" +msgstr "Khóa Xoay Chiều X" msgid "Constraint rotation along X axis" -msgstr "Ràng buộc xoay hướng trục X" +msgstr "Ràng buộc sự xoay chiều dọc theo trục X" msgid "Lock Y Rotation" -msgstr "Khóa Xoay Y" +msgstr "Khóa Xoay Chiều Y" msgid "Constraint rotation along Y axis" -msgstr "Ràng buộc xoay hướng trục Y" +msgstr "Ràng buộc sự xoay chiều dọc theo trục Y" msgid "Lock Z Rotation" -msgstr "Khóa Xoay Z" +msgstr "Khóa Xoay Chiều Z" msgid "Constraint rotation along Z axis" -msgstr "Ràng buộc xoay hướng trục Z" +msgstr "Ràng buộc sự xoay chiều dọc theo trục Z" msgid "Orientation Weight" -msgstr "Quyền Lượng Định Hướng" +msgstr "Trọng Lượng Định Hướng" msgid "For Tree-IK: Weight of orientation control for this target" -msgstr "Cho Cây IK: Quyên lượng điều khiển định hướng cho mục tiêu này" +msgstr "Dành cho Cây-IK: Trọng Lượng của điều khiển định hướng đối với mục tiêu này" msgid "Pole Angle" -msgstr "Góc Cực" +msgstr "Góc Độ Cực" msgid "Pole rotation offset" -msgstr "Dịch xoay cực" +msgstr "Mức dịch chuyển xoay chiều của cực" msgid "Pole Sub-Target" -msgstr "Phụ Mục Tiêu Cực" +msgstr "Cực Mục Tiêu Phụ" msgid "Pole Target" -msgstr "Mục Tiêu Cực" +msgstr "Cực Mục Tiêu" msgid "Object for pole rotation" -msgstr "Vật thể cho xoay cực" +msgstr "Đối tượng cực xoay chiều" msgid "Axis Reference" -msgstr "Trục Tham Chiếu" +msgstr "Trục theo Tham Chiếu" msgid "Constraint axis Lock options relative to Bone or Target reference" -msgstr "Các tùy chọn Khóa trục của ràng buộc tương đối với Xương hay Mục Tiêu tham chiếu" +msgstr "Ràng buộc tùy chọn Khóa trục vào tham chiếu Xương hay Mục Tiêu" msgid "Bone" @@ -7373,15 +8096,15 @@ msgstr "Xương" msgid "Chain follows position of target" -msgstr "Chuỗi được theo đõi vị trí của mục tiêu" +msgstr "Dây chuyền đi theo vị trí của mục tiêu" msgid "Chain follows rotation of target" -msgstr "Chuổi được theo dõi xoay của mục tiêu" +msgstr "Dây chuyền đi theo sự xoay chiều của mục tiêu" msgid "Enable IK Stretching" -msgstr "Mở IK Dẻo" +msgstr "Cho Phép IK Kéo Giãn" msgid "Use Tail" @@ -7389,27 +8112,27 @@ msgstr "Dùng Đuôi" msgid "Include bone's tail as last element in chain" -msgstr "Kèm theo đuôi xương làm phần tử cuối trong chuỗi IK" +msgstr "Bao gồm phần đuôi của xương như yếu tố cuối cùng trong dây chuyền" msgid "For Tree-IK: Weight of position control for this target" -msgstr "Cho Cây IK: Quyền lượng cho điều khiển vị trí của mục tiêu này" +msgstr "Dành cho Cây IK: Trọng Lượng điều khiển vị trí đối với mục tiêu này" msgid "Limit Distance Constraint" -msgstr "Ràng Buộc Hạn Chế Khoảng Cách" +msgstr "Ràng Buộc Khoảng Cách Giới Hạn" msgid "Limit the distance from target object" -msgstr "Hạn chế cách xa từ vật thể mục tiêu" +msgstr "Khoảng cách giới hạn từ đối tượng mục tiêu" msgid "Affect Transform" -msgstr "Ảnh Hưởng Biến Hóa" +msgstr "Tác Động Biến Hóa" msgid "Transforms are affected by this constraint as well" -msgstr "Các bíên hóa được ảnh hưởng bởi ràng buộc này" +msgstr "Các biến hóa cũng sẽ bị ràng buộc này tác động nữa" msgid "Limit Location Constraint" @@ -7417,131 +8140,131 @@ msgstr "Ràng Buộc Hạn Chế Vị Trí" msgid "Limit the location of the constrained object" -msgstr "Hạn chế vị trí của vật thể bị ràng buộc" +msgstr "Hạn chế vị trí của đối tượng bị ràng buộc" msgid "Maximum X" -msgstr "X Cực Đại" +msgstr "X Tối Đa" msgid "Highest X value to allow" -msgstr "Giá trí X cực đại được dùng" +msgstr "Giá trị X cao nhất cho phép" msgid "Maximum Y" -msgstr "Y Cực Đại" +msgstr "Y Tối Đa" msgid "Highest Y value to allow" -msgstr "Giá trí Y cực đại được dùng" +msgstr "Giá trị Y cao nhất cho phép" msgid "Maximum Z" -msgstr "Z Cực Đại" +msgstr "Z Tối Đa" msgid "Highest Z value to allow" -msgstr "Giá trí X cực đại được dùng" +msgstr "Giá trị Z cao nhất cho phép" msgid "Minimum X" -msgstr "X Cực Tiểu" +msgstr "X Tối Thiểu" msgid "Lowest X value to allow" -msgstr "Giá trí X cực tiểu được dùng" +msgstr "Giá trị X thấp nhất cho phép" msgid "Minimum Y" -msgstr "Y Cực Tiểu" +msgstr "Y Tối Thiểu" msgid "Lowest Y value to allow" -msgstr "Giá trí Y cực tiểu được dùng" +msgstr "Giá trị Y thấp nhất cho phép" msgid "Minimum Z" -msgstr "Z Cực Tiểu" +msgstr "Z Tối Thiểu" msgid "Lowest Z value to allow" -msgstr "Giá trí Z cực tiểu được dùng" +msgstr "Giá trị Z thấp nhất cho phép" msgid "Use the maximum X value" -msgstr "Dùng giá trị cực đại" +msgstr "Dùng giá trị tối đa X" msgid "Use the maximum Y value" -msgstr "Xái trị số Y cực đại" +msgstr "Dùng giá trị tối đa Y" msgid "Use the maximum Z value" -msgstr "Dùng trị số Z cực đại" +msgstr "Dùng giá trị tối đa Z" msgid "Use the minimum X value" -msgstr "Dùng giá trị X cực tiểu" +msgstr "Dùng giá trị tối thiểu X" msgid "Use the minimum Y value" -msgstr "Dùng giá trị Y cực tiểu" +msgstr "Dùng giá trị tối thiểu Y" msgid "Use the minimum Z value" -msgstr "Dùng giá trị Y cực tiểu" +msgstr "Dùng giá trị tối thiểu Z" msgid "Transform tools are affected by this constraint as well" -msgstr "Các dụng cụ biến hóa được ảnh hưởng bởi ràng buộc này" +msgstr "Các công cụ biến hóa cũng sẽ bị ràng buộc này tác động đến nữa" msgid "Limit Rotation Constraint" -msgstr "Ràng Buộc Hạn Chế Xoay" +msgstr "Ràng Buộc Hạn Chế Độ Xoay" msgid "Limit the rotation of the constrained object" -msgstr "Hạn chế xoay của vật thể bị ràng buộc" +msgstr "Hạn chế độ xoay của đối tượng bị ràng buộc" msgid "Limit X" -msgstr "Hạn Chế X" +msgstr "Giới Hạn X" msgid "Limit Y" -msgstr "Hạn Chế Y" +msgstr "Giới Hạn Y" msgid "Limit Z" -msgstr "Hạn Chế Z" +msgstr "Giới Hạn Z" msgid "Limit Size Constraint" -msgstr "Ràng Buộc Hạn Chế Kích Cỡ" +msgstr "Ràng Buộc Giới Hạn Kích Thước" msgid "Limit the scaling of the constrained object" -msgstr "Hạn chế phóng to của vật thể ràng buộc" +msgstr "Hạn chế tỷ lệ của đối tượng bị ràng buộc" msgid "Locked Track Constraint" -msgstr "Ràng Buộc Đuổi Theo Bị Khóa" +msgstr "Ràng Buộc Giám Sát Chốt Chặt" msgid "Point toward the target along the track axis, while locking the other axis" -msgstr "Chỉ đến mục tiêu theo trục đuổi theo, vẫn còn khóa trục kia" +msgstr "Hướng về phía mục tiêu dọc theo trục giám sát, trong khi khóa trục khác lại" msgid "Locked Axis" -msgstr "Trục Bị Khóa" +msgstr "Trục bị Khóa" msgid "Maintain Volume Constraint" -msgstr "Ràng Buộc Giữ Thể Tích" +msgstr "Ràng Buộc Duy Trì Thể Tích" msgid "Maintain a constant volume along a single scaling axis" -msgstr "Giữ thể tích bằng một hằng số theo một trục phóng to" +msgstr "Duy trì thể tích bất biến dọc theo một trục tỷ lệ hóa" msgid "Free Axis" @@ -7549,51 +8272,51 @@ msgstr "Trục Tự Do" msgid "The free scaling axis of the object" -msgstr "Trục phóng to tự do của vật thể" +msgstr "Trục không đổi tỷ lệ của đối tượng" msgid "The way the constraint treats original non-free axis scaling" -msgstr "Cách ràng buộc được xử lý phóng to ban đầu không có trục tự do" +msgstr "Phương pháp mà ràng buộc đối xử với tỷ lệ gốc của trục bị ràng buộc (không tự do)" msgid "Strict" -msgstr "Chặt Chẽ" +msgstr "Nghiêm Ngặt" msgid "Volume is strictly preserved, overriding the scaling of non-free axes" -msgstr "Chặt chẽ giữ thể tích, vượt quyền phóng to của trục không tự do" +msgstr "Thể tích được bảo tồn bất suy suyển, vượt quyền cả sự tỷ lệ hóa của các trục bị ràng buộc (không tự do)" msgid "Uniform" -msgstr "Đều" +msgstr "Đồng Đều/Nhất" msgid "Volume is preserved when the object is scaled uniformly. Deviations from uniform scale on non-free axes are passed through" -msgstr "Thể tích được giữ nguyên khi vật thể được phóng to đều. Sự chênh lệch từ phóng to đều của trục không tứ do được đưa qua" +msgstr "Thể tích được bảo tồn khi đối tượng được tỷ lệ hóa đồng đều. Những lệch lạc từ sự tỷ lệ hóa đồng đều trên các trục ràng buộc (không tự do) sẽ được cho thoát qua" msgid "Single Axis" -msgstr "Trục Đơn" +msgstr "Đơn Trục" msgid "Volume is preserved when the object is scaled only on the free axis. Non-free axis scaling is passed through" -msgstr "Thể tích được giữ nguyên khi vật thể chỉ được phóng to hướng trục tự do. Phóng to trục không tứ do được đưa qua" +msgstr "Thể tích được bảo tồn khi đối tượng chỉ được tỷ lệ hóa trên trục tự do (không bị ràng buộc). Những tỷ lệ hóa của trục bị ràng buộc sẽ được cho thoát qua" msgid "Volume of the bone at rest" -msgstr "Thể tích xương khi nghỉ ngơi" +msgstr "Thể tích xương khi ở trạng thái nghỉ" msgid "Object Solver Constraint" -msgstr "Ràng Buộc Trình Giải Nghiệm Vật Thể" +msgstr "Ràng Buộc Giải Nghiệm Đối Tượng" msgid "Lock motion to the reconstructed object movement" -msgstr "Khóa chuyển động đến chuyển động của vật thể được xây dựng lại" +msgstr "Khóa chuyển động vào chuyển động đã tái dựng của đối tượng" msgid "Movie tracking object to follow" -msgstr "Vật thể trong phim để duổi theo" +msgstr "Đối tượng trong phim để theo đuổi" msgid "Pivot Constraint" @@ -7601,23 +8324,23 @@ msgstr "Ràng Buộc Điểm Tựa" msgid "Rotate around a different point" -msgstr "Quay quanh một điểm khác" +msgstr "Xoay quanh một điểm khác" msgid "Offset of pivot from target (when set), or from owner's location (when Fixed Position is off), or the absolute pivot point" -msgstr "Dịch của điểm tựa từ mục tiêu (khi đặt), hay từ vị trí vật thể chủ (khi Vị Trí Không Đổi được tắt), hay điểm tựa tuyệt đối" +msgstr "Dịch chuyển của điểm tựa từ mục tiêu (nếu có), hoặc từ vị trí của chủ nhân (khi không sử dụng Vị Trí Cố Định), hoặc điểm tựa tuyết đối" msgid "Enabled Rotation Range" -msgstr "Phạm Vi Quay Được Bật" +msgstr "Phạm Vi Xoay Chiều Sử Dụng" msgid "Rotation range on which pivoting should occur" -msgstr "Phạm vi cho quay quanh điểm tựa" +msgstr "Phạm vi cho xoay quanh điểm tựa" msgid "Always" -msgstr "Có hoài" +msgstr "Luôn Luôn" msgid "Use the pivot point in every rotation" @@ -7625,51 +8348,51 @@ msgstr "Dùng điểm tựa trong mỗi vòng quay" msgid "-X Rotation" -msgstr "Xoay -X" +msgstr "Xoay Chiều -X" msgid "Use the pivot point in the negative rotation range around the X-axis" -msgstr "Dùng phạm vi âm của trục X khi quay quanh điểm tựa" +msgstr "Dùng phạm vi âm của trục X khi xoay quanh điểm tựa" msgid "-Y Rotation" -msgstr "Xoay -Y" +msgstr "Xoay Chiều -Y" msgid "Use the pivot point in the negative rotation range around the Y-axis" -msgstr "Dùng phạm vi âm của trục Y khi quay quanh điểm tựa" +msgstr "Dùng phạm vi âm của trục Y khi xoay quanh điểm tựa" msgid "-Z Rotation" -msgstr "Xoay -Z" +msgstr "Xoay Chiều -Z" msgid "Use the pivot point in the negative rotation range around the Z-axis" -msgstr "Dùng phạm vi âm của trục Z khi quay quanh điểm tựa" +msgstr "Dùng phạm vi âm của trục Z khi xoay quanh điểm tựa" msgid "Use the pivot point in the positive rotation range around the X-axis" -msgstr "Dùng phạm vi dương của trục X khi quay quanh điểm tựa" +msgstr "Dùng phạm vi dương của trục X khi xoay quanh điểm tựa" msgid "Use the pivot point in the positive rotation range around the Y-axis" -msgstr "Dùng phạm vi dương của trục Y khi quay quanh điểm tựa" +msgstr "Dùng phạm vi dương của trục Y khi xoay quanh điểm tựa" msgid "Use the pivot point in the positive rotation range around the Z-axis" -msgstr "Dùng phạm vi dương của trục Z khi quay quanh điểm tựa" +msgstr "Dùng phạm vi dương của trục Z khi xoay quanh điểm tựa" msgid "Target Object, defining the position of the pivot when defined" -msgstr "Vật thể Mục Tiêu, đang chỉ định vị trí của điểm tựa khi được chỉ định" +msgstr "Đối Tượng Mục Tiêu sẽ làm điểm tựa sau khi đã định nghĩa" msgid "Use Relative Offset" -msgstr "Dùng Dịch Tương Đối" +msgstr "Dùng Dịch Chuyển Tương Đối" msgid "Offset will be an absolute point in space instead of relative to the target" -msgstr "Dịch là một điểm tuyệt đối trong không gian thay thế tướng đối với mục tiêu" +msgstr "Vị trí dịch chuyển sẽ là một điểm tuyệt đối trong không gian, thay vì tương đối với mục tiêu" msgid "Python Constraint" @@ -7677,15 +8400,15 @@ msgstr "Ràng Buộc Python" msgid "Use Python script for constraint evaluation" -msgstr "Dùng văn thảo Python cho tính tóan ràng buộc" +msgstr "Dùng tập lệnh Python để tính toán ràng buộc" msgid "Script Error" -msgstr "Sai Lầm Văn Thảo" +msgstr "Lỗi trong Tập Lệnh" msgid "The linked Python script has thrown an error" -msgstr "Văn thảo Python liên kết đã phát sai lầm" +msgstr "Tập lệnh Python được kết nối có báo một lỗi đã xảy ra" msgid "Number of Targets" @@ -7693,47 +8416,47 @@ msgstr "Số Lượng Mục Tiêu" msgid "Usually only 1 to 3 are needed" -msgstr "Thường chỉ cần 1 đến 3 cái" +msgstr "Thường là chỉ cần 1 đến 3 mà thôi" msgid "Target Objects" -msgstr "Vật Thể Mục Tiêu" +msgstr "Đối Tượng Mục Tiêu" msgid "Script" -msgstr "Văn Thảo" +msgstr "Tập Lệnh" msgid "The text object that contains the Python script" -msgstr "Vật thể văn bản có sở hữu văn thảo Python" +msgstr "Đối tượng văn bản có chứa tập lệnh Python" msgid "Use Targets" -msgstr "Dùng Mục Tiêu" +msgstr "Sử Dụng Mục Tiêu" msgid "Use the targets indicated in the constraint panel" -msgstr "Dùng mục tiêu được chọn trong bảng ràng buộc" +msgstr "Dùng các mục tiêu biểu lộ trong bảng ràng buộc" msgid "Shrinkwrap Constraint" -msgstr "Ràng Buộc Gói Thu Xiết" +msgstr "Ràng Buộc Co-Bọc" msgid "Create constraint-based shrinkwrap relationship" -msgstr "Chế tạo quan hệ gói thu xiết cơ sở ràng buộc" +msgstr "Kiến tạo quan hệ co-bọc trên cơ sở ràng buộc" msgid "Face Cull" -msgstr "Hủy Diệt Mặt" +msgstr "Loại Bỏ Mặt" msgid "Stop vertices from projecting to a face on the target when facing towards/away" -msgstr "Không cho đỉnh chiếu đến một mặt của mục tiêu khi chỉ đến/hướng từ" +msgstr "Ngăn ngừa việc phóng chiếu các điểm đỉnh vào một Mặt trên mục tiêu khi đối mặt hoặc quay đi" msgid "No culling" -msgstr "Không hủy diệt" +msgstr "Không loại trừ" msgid "Front" @@ -7741,27 +8464,27 @@ msgstr "Trước" msgid "No projection when in front of the face" -msgstr "Không chiếu khi ở phía trước mặt" +msgstr "Không dự phóng khi đứng trước Mặt" msgid "Back" -msgstr "Sau" +msgstr "Sau Lưng/Quay Trở Lại" msgid "No projection when behind the face" -msgstr "Không chiếu khi ớ phía sau mặt" +msgstr "Không dự phóng khi đứng sau Mặt" msgid "Distance to Target" -msgstr "Khoảng Cách Đến Mục Tiêu" +msgstr "Khoảng Cách đến Mục Tiêu" msgid "Project Axis" -msgstr "Chiếu Trục" +msgstr "Trục Phóng Chiếu" msgid "Axis constrain to" -msgstr "Ràng buộc trục với" +msgstr "Trục để ràng buộc vào" msgid "Axis Space" @@ -7769,39 +8492,39 @@ msgstr "Không Gian Trục" msgid "Space for the projection axis" -msgstr "Không gian cho trục chiếu" +msgstr "Không gian cho trục dự phóng" msgid "Project Distance" -msgstr "Khoảng Cách Chiếu" +msgstr "Khoảng Cách Phóng Chiếu" msgid "Limit the distance used for projection (zero disables)" -msgstr "Hạn chế khoảng cách được dùng cho phép chiếu (đặt = 0 để tắt)" +msgstr "Giới hạn khoảng cách sử dụng cho quá trình phóng chiếu (đặt = 0 để tắt)" msgid "Shrinkwrap Type" -msgstr "Loại Gói Thu Xiết" +msgstr "Kiểu Co-Bọc" msgid "Select type of shrinkwrap algorithm for target position" -msgstr "Chọn loại giải thuật gói thu xiết cho vị trí mục tiêu" +msgstr "Chọn thuật toán co-bọc cho vị trí mục tiêu" msgid "Nearest Surface Point" -msgstr "Điểm Bề Mặt Gần Nhất" +msgstr "Điểm Gần Nhất Trên Bề Mặt" msgid "Shrink the location to the nearest target surface" -msgstr "Thu xiết vị trí đến mặt mục tiêu gần nhất" +msgstr "Thu nhỏ vị trí về bề mặt mục tiêu gần nhất" msgid "Project" -msgstr "Chiếu" +msgstr "Phóng Chiếu" msgid "Shrink the location to the nearest target surface along a given axis" -msgstr "Thu xiết vị trí đến mặt mục tiêu gần nhất theo một trục xác định" +msgstr "Thu nhỏ vị trí về bề mặt mục tiêu gần nhất dọc theo trục đã cho" msgid "Nearest Vertex" @@ -7809,159 +8532,159 @@ msgstr "Đỉnh Gần Nhất" msgid "Shrink the location to the nearest target vertex" -msgstr "Thu xiết vị trí đến đỉnh mục tiêu gần nhất" +msgstr "Thu Nhỏ vị trí về điểm đỉnh mục tiêu gần nhất" msgid "Target Normal Project" -msgstr "Chiếu Pháp Tuyến Mục Tiêu" +msgstr "Phóng Chiếu theo Pháp Tuyến của Mục Tiêu" msgid "Shrink the location to the nearest target surface along the interpolated vertex normals of the target" -msgstr "Thu xiết vị trí đến bề mặt gần nhất cùng hướng với pháp tuyến đỉnh được suy nội của mục tiêu" +msgstr "Thu Nhỏ vị trí về bề mặt mục tiêu gần nhất, dọc theo các pháp tuyến điểm đỉnh được nội suy của mục tiêu" msgid "Target Mesh object" -msgstr "Vật thể Mạng Lưới Mục Tiêu" +msgstr "Khung Lưới Mục Tiêu" msgid "Axis that is aligned to the normal" -msgstr "Truóc cùng hướng với pháp tuyến" +msgstr "Trục đã căn chỉnh với pháp tuyến" msgid "Invert Cull" -msgstr "Lật Hủy" +msgstr "Đảo Ngược Loại Bỏ" msgid "When projecting in the opposite direction invert the face cull mode" -msgstr "Khi chiếu hướng nghịch chiều, lật chế độ hủy mặt" +msgstr "Khi phóng chiếu theo hướng ngược lại, đảo ngược chế độ loại bỏ Mặt" msgid "Project Opposite" -msgstr "Chiếu Ngịch Hướng" +msgstr "Phóng Chiếu Đối Diện" msgid "Project in both specified and opposite directions" -msgstr "Chiếu đến hướng được xác định và nghịch hướng" +msgstr "Phóng chiếu trong cả hai chiều hướng, chỉ định và đối diện" msgid "Align Axis To Normal" -msgstr "Trục Cùng Hướng Với Pháp Tuyến" +msgstr "Căn Chỉnh Trục theo Pháp Tuyến" msgid "Align the specified axis to the surface normal" -msgstr "Sắp xếp trục được xác định đến pháp tuyến bề mặt" +msgstr "Căn chỉnh trục chỉ định theo pháp tuyến của bề mặt" msgid "Snap Mode" -msgstr "Chế Độ Hút Dính" +msgstr "Chế Độ Bám Dính" msgid "Select how to constrain the object to the target surface" -msgstr "Chọn làm sao ràng buộc vật thể ở trên bề mặt của mục tiêu" +msgstr "Chọn phương pháp ràng buộc đối tượng vào bề mặt mục tiêu" msgid "The point is constrained to the surface of the target object, with distance offset towards the original point location" -msgstr "Điểm bị ràng buộc ở trên bề mặt vật thể mục tiêu, với khoảng cách dịch đến vị trí ban đầu của điểm" +msgstr "Điểm được ràng buộc vào bề mặt của đối tượng mục tiêu, với khoảng cách dịch chuyển về phía vị trí của điểm gốc" msgid "The point is constrained to be inside the target object" -msgstr "Điểm bị ràng buộc ở trong vật thể mục tiêu" +msgstr "Điểm được ràng buộc để nằm bên trong đối tượng mục tiêu" msgid "The point is constrained to be outside the target object" -msgstr "Điểm bị ràng buộc ở ngoài vật thể mục tiêu" +msgstr "Điểm được ràng buộc để nằm bên ngoài đối tượng mục tiêu" msgid "Outside Surface" -msgstr "Bề Mặt Phía Ngoài" +msgstr "Nằm Ngoài Bề Mặt" msgid "The point is constrained to the surface of the target object, with distance offset always to the outside, towards or away from the original location" -msgstr "Điểm bị ràng buộc ở trên bề mặt vật thể mục tiêu, với khoảng cách dịch được luôn luôn ở ngoài, đến hay từ vị trí ban đầu" +msgstr "Điểm được ràng buộc vào bề mặt của đối tượng mục tiêu, với khoảng cách dịch chuyển luôn luôn ra bên ngoài, về phía hoặc rời khỏi vị trí gốc" msgid "The point is constrained to the surface of the target object, with distance offset applied exactly along the target normal" -msgstr "Điểm bị ràng buộc ở trên bề mặt vật thể mục tiêu, với khoảng cách dịch được áp dụng chính xác theo hướng pháp tuyến mục tiêu" +msgstr "Điểm được ràng buộc với bề mặt của đối tượng, với khoảng cách dịch chuyển được áp dụng chính xác dọc theo pháp tuyến của mục tiêu" msgid "Spline IK Constraint" -msgstr "Ràng Buộc IK Mẫu Cong" +msgstr "Ràng Buộc IK Hàm Nối Trục" msgid "Align 'n' bones along a curve" -msgstr "Sắp xếp xương 'n' theo một đường cong" +msgstr "Sắp hàng một số 'n' các xương dọc theo một đường cong" msgid "Volume Variation" -msgstr "Biến Đổi Thể Tích" +msgstr "Dao Động Thể Tích" msgid "Factor between volume variation and stretching" -msgstr "Hệ số giữa lệch lạc thể tích và kéo dài" +msgstr "Hệ số giữa dao động của thể tích và độ kéo giãn" msgid "Volume Variation Maximum" -msgstr "Cực Đại Lệch Lạc Thể Tích" +msgstr "Dao Động Thể Tích Tối Đa" msgid "Maximum volume stretching factor" -msgstr "Hệ số cực đại cho kéo dài thể tích" +msgstr "Hệ số kéo giãn thể tích tối đa" msgid "Volume Variation Minimum" -msgstr "Cực Tiểu Lệch Lạc Thể Tích" +msgstr "Dao Động Thể Tích Tối Thiểu" msgid "Minimum volume stretching factor" -msgstr "Hệ số cực tiểu kéo ra thể tích" +msgstr "Hệ số kéo giãn thể tích tối thiểu" msgid "Volume Variation Smoothness" -msgstr "Độ Mịn Lệch Lạc Thể Tích" +msgstr "Độ Mềm Mại của Dao Động Thể Tích" msgid "Strength of volume stretching clamping" -msgstr "Sức cho kẹp lại kéo dài thể tích" +msgstr "Độ hãm mức kéo giãn thể tích" msgid "How many bones are included in the chain" -msgstr "Số lượng xương được gồm vào chuỗi" +msgstr "Số lượng xương kết nối trong dây chuyền" msgid "Joint Bindings" -msgstr "Trói Khớp" +msgstr "Kết Buộc Khớp Nối" msgid "(EXPERIENCED USERS ONLY) The relative positions of the joints along the chain, as percentages" -msgstr "(CHỈ CHO NGƯỜI DÙNG CÓ KINH NGHIỆM) Vị trí tương đối của khớp trong chuỗi" +msgstr "(CHỈ DÀNH CHO NGƯỜI DÙNG CÓ KINH NGHIỆM) Vị trí tương đối của các khớp nối trong dây chuyền được biểu thị là các phần trăm" msgid "Curve that controls this relationship" -msgstr "Đường cong được điều khiển quan hệ này" +msgstr "Đường cong điều khiển mối quan hệ này" msgid "Use Volume Variation Maximum" -msgstr "Dùng Cực Đại Lệch Lạc Thể Tích" +msgstr "Dao Động Thể Tích Tối Đa" msgid "Use upper limit for volume variation" -msgstr "Dùng giới hạn cao cho lệch lạc thể tích" +msgstr "Sử dụng giới hạn trên đối với dao động thể tích" msgid "Use Volume Variation Minimum" -msgstr "Dùng Cực Tiểu Lệch Lạc Thể Tích" +msgstr "Dao Động Thể Tích Tối Thiểu" msgid "Use lower limit for volume variation" -msgstr "Dùng giới hạn thấp cho lệch lạc thể tích" +msgstr "Dùng giới hạn dưới đối với dao động thể tích" msgid "Chain Offset" -msgstr "Dịch Chuỗi" +msgstr "Dịch Chuyển của Dây Chuyền" msgid "Offset the entire chain relative to the root joint" -msgstr "Dịch toàn bộ chuỗi tương đối với khớp góc" +msgstr "Dịch chuyển toàn bộ dây chuyền tương đối với khớp nối gốc" msgid "Use Curve Radius" @@ -7969,51 +8692,51 @@ msgstr "Dùng Bán Kính Đường Cong" msgid "Average radius of the endpoints is used to tweak the X and Z Scaling of the bones, on top of XZ Scale mode" -msgstr "Dùng bán kính trung bình cúa hai điểm kết thúc để chỉnh phóng to trục X và Z của xương, kèm với chế độ phóng to XZ" +msgstr "Ngoài việc sử dụng Tỷ Lệ XZ, dùng bán kính trung bình của các điểm đầu để hiệu chỉnh Tỷ Lệ trục X và Z của các xương" msgid "Even Divisions" -msgstr "Chia Bằng Nhau" +msgstr "Phân Chia Đều" msgid "Ignore the relative lengths of the bones when fitting to the curve" -msgstr "Không quan tâm độ dài của xương khi chỉnh đuổi theo đường cong" +msgstr "Khi sắp xếp theo đường cong, bỏ qua độ dài tương đối của xương" msgid "Use Original Scale" -msgstr "Dùng Phóng To Ban Đầu" +msgstr "Sử Dụng Tỷ Lệ Gốc" msgid "Apply volume preservation over the original scaling" -msgstr "Áp dụng thể tích ban đầu trên phóng to ban đầu" +msgstr "Áp dụng sự bảo tồn thể tích dùng tỷ lệ gốc" msgid "XZ Scale Mode" -msgstr "Chế độ Phóng To XZ" +msgstr "Chế Độ Đổi Tỷ Lệ XZ" msgid "Method used for determining the scaling of the X and Z axes of the bones" -msgstr "Phương pháp để xác định phóng to của trục X và Z của xương" +msgstr "Phương pháp để xác định tỷ lệ trục X và Z của các xương" msgid "Don't scale the X and Z axes" -msgstr "Không phóng to trục X và Z" +msgstr "Không đổi tỷ lệ trục X và Z" msgid "Bone Original" -msgstr "Xương Ban Đầu" +msgstr "Nguyên Gốc của Xương" msgid "Use the original scaling of the bones" -msgstr "Dùng phóng to ban đầu của xương" +msgstr "Dùng tỷ lệ gốc của các xương" msgid "Inverse Scale" -msgstr "Phóng To Nghịch" +msgstr "Đảo Nghịch Tỷ Lệ" msgid "Scale of the X and Z axes is the inverse of the Y-Scale" -msgstr "Phóng to của trục X và Z là thuận nghịch với phóng to trục Y" +msgstr "Tỷ lệ của trục X và Z là đảo nghịch của Tỷ Lệ-Y" msgid "Volume Preservation" @@ -8021,47 +8744,47 @@ msgstr "Giữ Nguyên Thể Tích" msgid "Scale of the X and Z axes are adjusted to preserve the volume of the bones" -msgstr "Phóng to của trục X và Z được chỉnh cho giữ nguyên thể tích của xương" +msgstr "Tỷ lệ của trục X và Z được điều chỉnh để duy trì thể tích của xương" msgid "Y Scale Mode" -msgstr "Chế Độ Phóng To Y" +msgstr "Chế Độ Tỷ Lệ Hóa Y" msgid "Method used for determining the scaling of the Y axis of the bones, on top of the shape and scaling of the curve itself" -msgstr "Phương pháp để xác định phóng to của trục Y của các xương, trên hình dạng và phóng to của đường cong một mình" +msgstr "Phương pháp sử dụng để xác định tỷ lệ trục Y của xương, tức cái được tính thêm trên hình dạng và tỷ lệ của bản thân đường cong" msgid "Don't scale in the Y axis" -msgstr "Không phóng to trục Y" +msgstr "Không được tỷ lệ hóa theo trục Y" msgid "Fit Curve" -msgstr "Vừa Hóa Đường Cong" +msgstr "Khít Vừa Đường Cong" msgid "Scale the bones to fit the entire length of the curve" -msgstr "Phóng to xương cho vừa toàn bộ bề dài của đường cong" +msgstr "Tỷ lệ hóa các xương cho khít với toàn bộ chiều dài của đường cong" msgid "Use the original Y scale of the bone" -msgstr "Dùng phóng to trục Y ban đầu của xương" +msgstr "Sử dụng tỷ lệ Y nguyên gốc của xương" msgid "Stretch To Constraint" -msgstr "Kéo Dài Đến Ràng Buộc" +msgstr "Ràng Buộc Kéo Giãn Tới" msgid "Stretch to meet the target object" -msgstr "Kéo dài tới gặp mục tiêu " +msgstr "Kéo giãn để tiếp cận đối tượng mục tiêu" msgid "Keep Axis" -msgstr "Giữ Nguyên Trục" +msgstr "Trục Giữ Nguyên" msgid "The rotation type and axis order to use" -msgstr "Loại xaoy và thứ tự trục xoay" +msgstr "Kiểu xoay chiều và thứ tự trục sử dụng" msgid "XZ" @@ -8069,7 +8792,7 @@ msgstr "XZ" msgid "Rotate around local X, then Z" -msgstr "Xoay quanh trục X địa phương, sau đó trục Z" +msgstr "Xoay quanh trục X địa phương, sau đó Z" msgid "ZX" @@ -8077,59 +8800,59 @@ msgstr "ZX" msgid "Rotate around local Z, then X" -msgstr "oay quanh trục Z địa phương, sau đó trục X" +msgstr "Xoay quanh trục Z địa phương, sau đó X" msgid "Swing" -msgstr "Đu Đưa" +msgstr "Đung Đưa" msgid "Use the smallest single axis rotation, similar to Damped Track" -msgstr "Dùng xoay quanh trục nhỏ nhật, tương đương Theo Dõi Tắt Dần" +msgstr "Sử dụng sự xoay chiều nhỏ nhất trên một đơn trục, tương tự như Dõi Theo có Kiềm Chế (Damped Track)" msgid "Original Length" -msgstr "Độ Dài Ban Đầu" +msgstr "Chiều Dài Gốc" msgid "Length at rest position" -msgstr "Độ dài khi nghỉ ngơi" +msgstr "Chiều dài (khoảng cách) đến vị trí của tư thế nghỉ" msgid "Maintain the object's volume as it stretches" -msgstr "Giữ nguyên thể tích của vật thể khi nó bị kéo dài" +msgstr "Duy trì thể tích trong khi đối tượng bị kéo giãn" msgid "Track To Constraint" -msgstr "Đuổi Theo Ràng Buộc" +msgstr "Ràng Buộc Giám Sát" msgid "Aim the constrained object toward the target" -msgstr "Chấm vật thể bị ràng buộc đi hướng đến mục tiêu" +msgstr "Nhắm đối tượng bị ràng buộc vào mục tiêu" msgid "Target Z" -msgstr "Mục Tiêu Z" +msgstr "Z của Mục Tiêu" msgid "Target's Z axis, not World Z axis, will constraint the Up direction" -msgstr "Trục Z của mục tiêu, ràng buộc hướng trên" +msgstr "Trục Z của mục tiêu, không phải trục Z Thế Giới, sẽ bị ràng buộc và hướng Dựng Đứng" msgid "Transform Cache Constraint" -msgstr "Ràng Buộc Đệm Chứa Biến Hóa" +msgstr "Ràng Buộc Bộ Nhớ Đệm Biến Hóa" msgid "Look up transformation from an external file" -msgstr "Tìm biến hóa từ một tập tin ngoài" +msgstr "Tra cứu biến hóa từ một tập tin bên ngoài" msgid "Cache File" -msgstr "Tập Tin Đệm Chứa" +msgstr "Tập Tin Bộ Nhớ Đệm" msgid "Path to the object in the Alembic archive used to lookup the transform matrix" -msgstr "Đường dẫn đến vật thể trong kho Alembic được dùng để tìm ma trận biến hóa" +msgstr "Đường dẫn đến đối tượng trong kho Alembic dùng để tra cứu ma trận biến hóa" msgid "Transformation Constraint" @@ -8137,55 +8860,55 @@ msgstr "Ràng Buộc Biến Hóa" msgid "Map transformations of the target to the object" -msgstr "Ánh xạ các biến hóa của mục tiêu đến mục tiêu" +msgstr "Ánh xạ các biến hóa của mục tiêu đến đối tượng" msgid "From Maximum X" -msgstr "Từ Đại Cực X" +msgstr "Từ Tối Đa X" msgid "Top range of X axis source motion" -msgstr "Định pham vị của nguồn chuyển động trục X" +msgstr "Phạm vi cao nhất của nguồn chuyển động trên trục X" msgid "From Maximum Y" -msgstr "Từ Đại Cực Y" +msgstr "Từ Tối Đa Y" msgid "Top range of Y axis source motion" -msgstr "Định pham vị của nguồn chuyển động trục Y" +msgstr "Phạm vi cao nhất của nguồn chuyển động trên trục Y" msgid "From Maximum Z" -msgstr "Từ Đại Cực Z" +msgstr "Từ Tối Đa Z" msgid "Top range of Z axis source motion" -msgstr "Định pham vị của nguồn chuyển động trục Z" +msgstr "Phạm vi cao nhất của nguồn chuyển động trên trục Z" msgid "From Minimum X" -msgstr "Từ Cực tiểu X" +msgstr "Từ Tối Thiểu X" msgid "Bottom range of X axis source motion" -msgstr "Đáy phạm vi của nguồn chuyển động trục X" +msgstr "Phạm vi thấp nhất của nguồn chuyển động trên trục X" msgid "From Minimum Y" -msgstr "Từ Cực Tiểu Y" +msgstr "Từ Tối Thiểu Y" msgid "Bottom range of Y axis source motion" -msgstr "Đáy phạm vi của nguồn chuyển động trục Y" +msgstr "Phạm vi thấp nhất của nguồn chuyển động trên trục Y" msgid "From Minimum Z" -msgstr "Từ Cực Tiểu Z" +msgstr "Từ Tối Thiểu Z" msgid "Bottom range of Z axis source motion" -msgstr "Đáy phạm vi của nguồn chuyển động trục Z" +msgstr "Phạm vi thấp nhất của nguồn chuyển động trên trục Z" msgid "From Mode" @@ -8193,7 +8916,7 @@ msgstr "Từ Chế Độ" msgid "Specify the type of rotation channels to use" -msgstr "Chỉ định loại kênh xoay để dùng" +msgstr "Xác định thể loại kênh xoay chiều sử dụng" msgid "Auto Euler" @@ -8201,35 +8924,35 @@ msgstr "Euler Tự Động" msgid "Euler using the rotation order of the target" -msgstr "Dùng thứ tự xoay Euler của mục đích" +msgstr "Euler sử dụng thứ tự xoay chiều của mục tiêu" msgid "Quaternion rotation" -msgstr "Xoay quaternion" +msgstr "Xoay Chiều Quatenion" msgid "Swing and X Twist" -msgstr "Khuấy và Xoắn X" +msgstr "Đung Đưa và Xoắn Vặn X" msgid "Decompose into a swing rotation to aim the X axis, followed by twist around it" -msgstr "Chẻ thành xoay khuấy có mục tiêu trục X, sau xoắn thao nó" +msgstr "Phân tích thành sự xoay chiều đung đưa nhắm vào trục X, tiếp theo bằng động tác xoắn vặn quanh nó" msgid "Swing and Y Twist" -msgstr "Khuấy và Xoắn Y" +msgstr "Đung Đưa và Xoắn Vặn Y" msgid "Decompose into a swing rotation to aim the Y axis, followed by twist around it" -msgstr "Chẻ thành xoay khuấy có mục tiêu trục Y, sau xoắn thao nó" +msgstr "Phân tích thành sự xoay chiều lắc (đong đưa) nhắm vào trục Y, tiếp theo bằng động tác xoắn vặn quanh nó" msgid "Swing and Z Twist" -msgstr "Khuấy và Xoắn Z" +msgstr "Đung Đưa và Xoắn Vặn Z" msgid "Decompose into a swing rotation to aim the Z axis, followed by twist around it" -msgstr "Chẻ thành xoay khuấy có mục tiêu trục Z, sau xoắn thao nó" +msgstr "Phân tích thành sự xoay chiều lắc (đong đưa) nhắm vào trục Z, tiếp theo bằng động tác xoắn vặn quanh nó" msgid "Map From" @@ -8237,83 +8960,87 @@ msgstr "Ánh Xạ Từ" msgid "The transformation type to use from the target" -msgstr "Loại biến hóa để dùng từ mục tiêu" +msgstr "Thể biến hóa từ mục tiêu sử dụng" msgid "Location" -msgstr "Vị Trí" +msgstr "Địa Điểm/Vị Trí" msgid "Map To" -msgstr "Ánh Xạ Đến" +msgstr "Ánh Xạ Tới" + + +msgid "The transformation type to affect on the constrained object" +msgstr "Kiểu biến hóa ảnh hưởng đến đối tượng ràng buộc" msgid "Map To X From" -msgstr "Ánh Xạ Đến X Từ" +msgstr "Ánh Xạ Tới X Từ" msgid "The source axis constrained object's X axis uses" -msgstr "Trục nguồn thì trục X của thể vật bị ràng buộc được dùng" +msgstr "Trục nguồn mà trục X của đối tượng bị ràng buộc sử dụng" msgid "Map To Y From" -msgstr "Ánh Xạ Y Từ" +msgstr "Ánh Xạ Tới Y Từ" msgid "The source axis constrained object's Y axis uses" -msgstr "Trục nguồn thì trục Y của thể vật bị ràng buộc được dùng" +msgstr "Trục nguồn mà trục Y của đối tượng bị ràng buộc sử dụng" msgid "Map To Z From" -msgstr "Ánh Xạ Đến Z Từ" +msgstr "Ánh Xạ Tới Z Từ" msgid "The source axis constrained object's Z axis uses" -msgstr "Trục nguồn thì trục Z của thể vật bị ràng buộc được dùng" +msgstr "Trục nguồn mà trục Z của đối tượng bị ràng buộc sử dụng" msgid "Location Mix Mode" -msgstr "Chế Độ Pha Trộn Vi Trí" +msgstr "Chế Độ Hòa Trộn Vị Trí" msgid "Specify how to combine the new location with original" -msgstr "Chỉ định làm sao gồm vị trí mới với vị trí ban đầu" +msgstr "Xác định phương pháp để kết hợp vị trí mới với giá trị gốc/nguyên bản" msgid "Replace component values" -msgstr "Thay thế các giá trị thành phần" +msgstr "Thay thế các giá trị phần tử" msgid "Add component values together" -msgstr "Cộng các giá trị thành phần" +msgstr "Cộng các giá trị phần tử lại với nhau" msgid "Rotation Mix Mode" -msgstr "Chế Độ ha Trộn Xoay" +msgstr "Chế Độ Hòa Trộn Độ Xoay Chiều" msgid "Specify how to combine the new rotation with original" -msgstr "Chỉ định làm sao gồm xoay mới với xoay ban đầu" +msgstr "Xác định phương pháp để kết hợp góc độ xoay chiều mới với giá trị gốc/nguyên bản" msgid "Apply new rotation before original, as if it was on a parent" -msgstr "Áp dụng xoay mới trước xoay bàn đầu, như nó là phụ huynh" +msgstr "Áp dụng độ xoay chiều mới trước, trước giá trị gốc, giống như làm trên một phụ huynh vậy" msgid "Apply new rotation after original, as if it was on a child" -msgstr "Áp dụng xoay mới sau xoay bàn đâu, như nó là phụ huynh" +msgstr "Áp dụng độ xoay chiều mới sau, sau giá trị gốc, giống như làm trên một phần tử con cái vậy" msgid "Scale Mix Mode" -msgstr "Chế Độ Pha Trộn Phóng To" +msgstr "Chế Độ Hòa Trộn Tỷ Lệ" msgid "Specify how to combine the new scale with original" -msgstr "Chỉ định làm sao gồm phóng to mới với phóng to ban đầu" +msgstr "Xác định phương pháp để kết hợp tỷ lệ mới với giá trị gốc/nguyên bản" msgid "Multiply component values together" -msgstr "Nhân các gia trị thành phần với nhau" +msgstr "Nhân các giá trị phần tử với nhau" msgid "To Order" @@ -8321,63 +9048,63 @@ msgstr "Đến Thứ Tự" msgid "Explicitly specify the output euler rotation order" -msgstr "Trực tiếp chỉ định thứ tự xoay Euler ngõ ra" +msgstr "Xác định dứt khoát thứ tự xoay chiều euler kết thúc (ở đầu ra)" msgid "To Maximum X" -msgstr "Đến Cực Đại X" +msgstr "Đến Tối Đa X" msgid "Top range of X axis destination motion" -msgstr "Định phạm vi của trục X cho chuyển động mục đích" +msgstr "Phạm vi cao nhất của chuyển động ở đích trên trục X" msgid "To Maximum Y" -msgstr "Đến Cực Đại Y" +msgstr "Đến Tối Đa Y" msgid "Top range of Y axis destination motion" -msgstr "Định phạm vi của trục Y cho chuyển động mục đích" +msgstr "Phạm vi cao nhất của chuyển động ở đích trên trục Y" msgid "To Maximum Z" -msgstr "Đến Cực Đại Z" +msgstr "Đến Tối Đa Z" msgid "Top range of Z axis destination motion" -msgstr "Định phạm vi của trục Z cho chuyển động mục đích" +msgstr "Phạm vi cao nhất của chuyển động ở đích trên trục Z" msgid "To Minimum X" -msgstr "Đến Cực Tiểu X" +msgstr "Đến Tối Thiểu X" msgid "Bottom range of X axis destination motion" -msgstr "Đáy phạm vi của trục X cho chuyển động mục đích" +msgstr "Phạm vi thấp nhất của chuyển động ở đích trên trục X" msgid "To Minimum Y" -msgstr "Đến Cực Tiểu Y" +msgstr "Đến Tối Thiểu Y" msgid "Bottom range of Y axis destination motion" -msgstr "Đáy phạm vi của trục Y cho chuyển động mục đích" +msgstr "Phạm vi thấp nhất của chuyển động ở đích trên trục Y" msgid "To Minimum Z" -msgstr "Đến Cực Tiểu Z" +msgstr "Đến Tối Thiểu Z" msgid "Bottom range of Z axis destination motion" -msgstr "Đáy phạm vi của trục Z cho chuyển động mục đích" +msgstr "Phạm vi thấp nhất của chuyển động ở đích trên trục Z" msgid "Extrapolate Motion" -msgstr "Suy Ngoại Chuyển Động" +msgstr "Chuyển Động Ngoại Suy" msgid "Extrapolate ranges" -msgstr "Suy ngoại pham vị" +msgstr "Phạm vi ngoại suy" msgid "Constraint Target" @@ -8385,35 +9112,35 @@ msgstr "Mục Tiêu Ràng Buộc" msgid "Target object for multi-target constraints" -msgstr "Vật thể mục tiêu cho ràng buộc có nhiều mục tiêu" +msgstr "Đối tượng mục tiêu cho những ràng buộc đa mục tiêu" msgid "Constraint Target Bone" -msgstr "Xương Mục Tiêu Ràng Buộc" +msgstr "Xương Mục Tiêu của Ràng Buộc" msgid "Target bone for multi-target constraints" -msgstr "Xương mục tiêu cho ràng buộc có nhiều mục tiêu" +msgstr "Xương mục tiêu dành cho các ràng buộc đa mục tiêu" msgid "Target armature bone" -msgstr "Xương cốt mục tiêu" +msgstr "Xương của khung cốt mục tiêu" msgid "Target armature" -msgstr "Cốt mục tiêu" +msgstr "Khung Cốt mục tiêu" msgid "Blend Weight" -msgstr "Quyền Lượng Pha Trộn" +msgstr "Trọng Lượng Pha Trộn" msgid "Blending weight of this bone" -msgstr "Quyền lượng pha trộn của xương này" +msgstr "Trọng lượng pha trộn của xương này" msgid "Curve in a curve mapping" -msgstr "Đường cong cho một ánh xạ đường cong" +msgstr "Đường cong trong ánh xạ đường cong" msgid "Points" @@ -8421,15 +9148,15 @@ msgstr "Điểm" msgid "Point of a curve used for a curve mapping" -msgstr "Điểm của một cong được dùng cho một ánh xạ đường cong" +msgstr "Điểm của đường cong sử dụng cho ánh xạ đường cong" msgid "Handle Type" -msgstr "Loại Tay Cầm" +msgstr "Kiểu tay cầm" msgid "Curve interpolation at this point: Bezier or vector" -msgstr "Suy nội đường cong tại điểm này: Bezier hay vectơ" +msgstr "Nội suy đường cong tại điểm này: Bezier hay vectơ" msgid "Auto Handle" @@ -8437,19 +9164,19 @@ msgstr "Tay Cầm Tự Động" msgid "Auto-Clamped Handle" -msgstr "Tay Cầm Tự Động Kẹp Lại" +msgstr "Tay Cầm Tự Động Hạn Định" msgid "Vector Handle" -msgstr "Tay Cầm Vectơ" +msgstr "Tay Cầm Véctơ" msgid "X/Y coordinates of the curve point" -msgstr "Tọa Độ X/Y của điểm đường cong" +msgstr "Tọa độ X/Y của điểm đường cong" msgid "Selection state of the curve point" -msgstr "Trạng thái sự lựa chọn của điểm đường cong" +msgstr "Trạng thái lựa chọn của điểm đường cong" msgid "Curve Map Point" @@ -8457,11 +9184,11 @@ msgstr "Điểm Ánh Xạ Đường Cong" msgid "Collection of Curve Map Points" -msgstr "Sưu tập Điểm Ánh Xạ Đường Cong" +msgstr "Bộ Sưu Tập các Điểm Ánh Xạ Đường Cong" msgid "Curve mapping to map color, vector and scalar values to other values using a user defined curve" -msgstr "Ánh xạ đường cong cho ánh xạ giá trị màu, vectơ và số đến giá trị khác bằng được đường cong người dùng được chỉ định" +msgstr "Ánh xạ đường cong để ánh xạ các giá trị màu sắc, vector và vô hướng sang các giá trị khác dùng một đường cong do người dùng định nghĩa" msgid "Black Level" @@ -8469,43 +9196,43 @@ msgstr "Mức Độ Đen" msgid "For RGB curves, the color that black is mapped to" -msgstr "Cho các đường cong RGB, màu đen được ánh xạ đến màu nào" +msgstr "Đối với các đường cong RGB, màu sắc mà màu đen sẽ được ánh xạ thành" msgid "Clip Max X" -msgstr "Cắt Cực Đại X" +msgstr "Cắt/Xén X Tối Đa" msgid "Clip Max Y" -msgstr "Cắt Cực Đại Y" +msgstr "Cắt/Xén Y Tối Đa" msgid "Clip Min X" -msgstr "Cắt Cực Tiểu X" +msgstr "Cắt/Xén X Tối Thiểu" msgid "Clip Min Y" -msgstr "Cắt Cực Tiểu Y" +msgstr "Cắt/Xén Y Tối Thiểu" msgid "Extrapolate the curve or extend it horizontally" -msgstr "Suy ngoại đường cong hay kéo dài nó ngang" +msgstr "Ngoại suy đường cong hoặc nới rộng nó theo chiều ngang" msgid "Horizontal" -msgstr "Ngang" +msgstr "Chiều Ngang" msgid "Extrapolated" -msgstr "Suy Ngoại" +msgstr "Ngoại Suy" msgid "Tone" -msgstr "Hòa Hợp" +msgstr "Sắc Thái" msgid "Tone of the curve" -msgstr "Hòa hợp của đường cong" +msgstr "Sắc thái của đường cong" msgid "Standard" @@ -8513,15 +9240,15 @@ msgstr "Tiêu Chuẩn" msgid "Filmlike" -msgstr "Giống Phim" +msgstr "Tựa Phim" msgid "Clip" -msgstr "Cắt" +msgstr "Cắt Xén/Đoạn Phim" msgid "Force the curve view to fit a defined boundary" -msgstr "Bắt buộc màn đường cong nằm vừa trong môt ranh giới đươợc chỉ định" +msgstr "Buộc góc nhìn của đường cong khít vừa vào một ranh giới đã định" msgid "White Level" @@ -8529,23 +9256,23 @@ msgstr "Mức Độ Trắng" msgid "For RGB curves, the color that white is mapped to" -msgstr "Cho các đường cong RGB, màu trắng được ánh xạ đến màu nào" +msgstr "Cho các đường cong RGB, màu sắc mà màu trắng được ánh xạ thành" msgid "Curve Paint Settings" -msgstr "Cài Đặt Sơn Đường Cong" +msgstr "Sắp Đặt Đường Cong của Bút Sơn" msgid "Corner Angle" -msgstr "Góc Giác" +msgstr "Góc Độ của Đỉnh" msgid "Angles above this are considered corners" -msgstr "Góc lớn hơn giá trị này được chấp nhận là góc giác" +msgstr "Những góc độ lớn hơn giá trị này được gọi là góc đỉnh" msgid "Type of curve to use for new strokes" -msgstr "Dùng loại đường cong nào cho vẽ nét mới" +msgstr "Loại đường cong sử dụng cho những nét vẽ mới" msgid "Poly" @@ -8557,11 +9284,11 @@ msgstr "Bezier" msgid "Depth" -msgstr "Độ Sâu" +msgstr "Chiều/Độ Sâu" msgid "Method of projecting depth" -msgstr "Phương pháp cho chiếu độ sâu" +msgstr "Phương pháp biểu thị độ sâu" msgid "Cursor" @@ -8573,11 +9300,11 @@ msgstr "Bề Mặt" msgid "Tolerance" -msgstr "Mức Chênh Lệch" +msgstr "Dung Sai" msgid "Allow deviation for a smoother, less precise line" -msgstr "Cho chênh lệch cho được một nét mịn hơn mà giảm độ chính xác" +msgstr "Cho phép độ lệch để đường nét được êm ái hơn, không quá chính xác" msgid "Method" @@ -8585,23 +9312,23 @@ msgstr "Phương Pháp" msgid "Curve fitting method" -msgstr "Phương pháp vừa hóa đường cong" +msgstr "Phương pháp phù hợp hóa đường cong" msgid "Refit" -msgstr "Vừa Hóa Lại" +msgstr "Tái Khớp/Chỉnh Lại" msgid "Incrementally refit the curve (high quality)" -msgstr "Vừa hóa lại đường cong từ bước (chất lượng cao)" +msgstr "Dần dần sửa lại đường cong theo phép gia tăng (chất lượng cao)" msgid "Split" -msgstr "Chẻ" +msgstr "Tách Phân" msgid "Split the curve until the tolerance is met (fast)" -msgstr "Chẻ đường cong đến tới mức chênh lệch (nhanh)" +msgstr "Tách phân đường cong cho đến khi thỏa mãn mức sai số thì thôi (nhanh)" msgid "Radius Max" @@ -8609,127 +9336,185 @@ msgstr "Bán Kính Tối Đa" msgid "Radius to use when the maximum pressure is applied (or when a tablet isn't used)" -msgstr "Sử dụng bán kính nào khi được áp dụng áp suất tối đa (hoặc khi không dùng bảng vẽ)" +msgstr "Bán kính sử dụng khi áp lực tối đa được áp dụng (hoặc khi không dùng bảng vẽ)" msgid "Radius Min" -msgstr "Bán kính Tối Thiểu" +msgstr "Bán Kính Tối Thiểu" msgid "Minimum radius when the minimum pressure is applied (also the minimum when tapering)" -msgstr "Bán kính tối thiểu khi được áp dụng áp suất tối thiểu (cũng dùng khi làm nến)" +msgstr "Bán kính tối thiểu khi áp lực tối thiểu được áp dụng (đồng thời là giá trị nhỏ nhất khi vuốt thon)" msgid "Taper factor for the radius of each point along the curve" -msgstr "Hệ số nến bán kính của mỗi điểm trên đường cong" +msgstr "Hệ số vuốt thon cho bán kính của mỗi điểm trên đường cong" msgid "Offset the stroke from the surface" -msgstr "Dịch nét từ bề mặt" +msgstr "Dịch chuyển nét vẽ khỏi bề mặt" msgid "Plane" -msgstr "Mặt Phẳng" +msgstr "Bình Diện" msgid "Plane for projected stroke" -msgstr "Mặt phẳng cho chiếu nét" +msgstr "Bình diện để dự phóng nét vẽ lên" + + +msgid "Normal to Surface" +msgstr "Trực Giao với Bề Mặt" + + +msgid "Draw in a plane perpendicular to the surface" +msgstr "Vẽ trong mặt phẳng vuông góc với bề mặt" + + +msgid "Tangent to Surface" +msgstr "Tiếp Tuyến với Bề Mặt" + + +msgid "Draw in the surface plane" +msgstr "Vẽ trên mặt phẳng bề mặt" msgid "View" -msgstr "Màn Chiếu" +msgstr "Góc Nhìn" + + +msgid "Draw in a plane aligned to the viewport" +msgstr "Vẽ trong một mặt phẳng thẳng hàng với cổng nhìn" msgid "Detect Corners" -msgstr "Tìm Kiếm Góc Giác" +msgstr "Phát Hiện Góc" msgid "Detect corners and use non-aligned handles" -msgstr "Tìm kiếm góc giác và sử dụng tay cầm không sắp xếp" +msgstr "Phát hiện các góc và sử dụng các tay cầm ngoài cái thẳng hàng" msgid "Absolute Offset" -msgstr "Dịch Tuyệt Đối" +msgstr "Dịch Chuyển Tuyệt Đối" msgid "Apply a fixed offset (don't scale by the radius)" -msgstr "Áp dụng một dịch dẳng (không phóng to bằng bán kính)" +msgstr "Áp dụng một dịch chuyển cố định (không dùng bán kính để đổi tỷ lệ)" msgid "Map tablet pressure to curve radius" -msgstr "Ánh xạ áp suất bảng vẽ đến bán kính đường cong" +msgstr "Ánh xạ áp lực của bảng vẽ đến bán kính đường cong" msgid "Only First" -msgstr "Chỉ Đầu" +msgstr "Duy Điểm Đầu" msgid "Use the start of the stroke for the depth" -msgstr "Sử dụng điểm đầu của nét cho độ sâu" +msgstr "Dùng điểm đầu của nét vẽ cho chiều sâu" msgid "Curve Point" -msgstr "Điểm Đường Cong" +msgstr "Điểm của Đường Cong" + + +msgid "Curve control point" +msgstr "Điểm điều khiển đường cong" msgid "Index" msgstr "Chỉ Số" +msgid "Index of this point" +msgstr "Chỉ số của điểm này" + + msgid "Profile Path editor used to build a profile path" -msgstr "Trình biên soạn Mặt Cắt được dùng để xây một đường mặt cắt" +msgstr "Trình biên soạn Đường Dẫn Mặt Cắt Ngang sử dụng để xây dựng một đường dẫn mặt cắt" msgid "Profile control points" -msgstr "Điểm kiểm soát mặt cắt" +msgstr "Điểm điều khiển mặt cắt ngang" + + +msgctxt "Mesh" +msgid "Preset" +msgstr "Sắp Đặt Sẵn" + + +msgctxt "Mesh" +msgid "Line" +msgstr "Đường Nét" + + +msgctxt "Mesh" +msgid "Support Loops" +msgstr "Hỗ Trợ Đường Vòng" msgid "Loops on each side of the profile" -msgstr "Lặp vòng cho mỗi bên của mặt cắt" +msgstr "Đường vòng ở mỗi bên của mặt cắt ngang" + + +msgctxt "Mesh" +msgid "Cornice Molding" +msgstr "Khuôn Gờ" + + +msgctxt "Mesh" +msgid "Crown Molding" +msgstr "Khuôn Chóp" + + +msgctxt "Mesh" +msgid "Steps" +msgstr "Số/Phân/Bước" msgid "A number of steps defined by the segments" -msgstr "Số lượng bước được xác định bằng các khúc" +msgstr "Số bậc thang được xác định bởi số phân đoạn" msgid "Segments" -msgstr "Các Khúc" +msgstr "Số/Phân Đoạn" msgid "Segments sampled from control points" -msgstr "Các khúc mẫu từ điểm kiểm soát" +msgstr "Số phân đoạn được lấy mẫu từ các điểm điều khiển" msgid "Force the path view to fit a defined boundary" -msgstr "Bắt buộc màn đường vừa trong môt ranh giới được chỉ định" +msgstr "Ép góc nhìn đường dẫn khít vào biên giới đã định" msgid "Sample Even Lengths" -msgstr "Mẫu Bề Dài Bằng Nhau" +msgstr "Lấy Mẫu Chiều Dài Đồng Đều" msgid "Sample edges with even lengths" -msgstr "Lấy mẫu vật tại cách bằng nhau" +msgstr "Lấy mẫu các cạnh với chiều dài đồng đều" msgid "Sample Straight Edges" -msgstr "Mẫu Cạnh Thẳng" +msgstr "Lấy Mẫu Cạnh Thẳng Hàng" msgid "Sample edges with vector handles" -msgstr "Lấy mẫu từ cạnh có tay cầm vectơ" +msgstr "Lấy mẫu các cạnh với tay cầm véctơ" msgid "Point of a path used to define a profile" -msgstr "Điểm của một đường được dùng cho định nghĩa một mặt cắt" +msgstr "Điểm của một đường dẫn sử dụng để định nghĩa một mặt cắt" msgid "First Handle Type" -msgstr "Loại Tay Cầm Thứ Nhất" +msgstr "Kiểu Tay Cầm Thứ Nhất" msgid "Path interpolation at this point" -msgstr "Suy nội đường tại điểm này" +msgstr "Nội suy đường dẫn tại điểm này" msgid "Free Handle" @@ -8737,19 +9522,19 @@ msgstr "Tay Cầm Tự Do" msgid "Aligned Free Handles" -msgstr "Sắp Xếp Tay Cầm Tự Do" +msgstr "Tay Cầm Tự Do Thẳng Hàng" msgid "Second Handle Type" -msgstr "Loại Tay Cầm Thứ Hai" +msgstr "Kiểu Tay Cầm Thứ Hai" msgid "X/Y coordinates of the path point" -msgstr "Tọa Độ X/Y của điểm đường" +msgstr "Tọa độ X/Y của điểm trên đường dẫn" msgid "Selection state of the path point" -msgstr "Trạng thái sự lựa chọn của điểm đường" +msgstr "Trạng thái lựa chọn của điểm trên đường dẫn" msgid "Profile Point" @@ -8757,23 +9542,23 @@ msgstr "Điểm Mặt Cắt" msgid "Collection of Profile Points" -msgstr "Sưu tập Điểm Mặt Cắt" +msgstr "Bộ Sưu Tập các Điểm của Mặt Cắt" msgid "Curve Slice" -msgstr "Miến Đường Cong" +msgstr "Cắt Lát bằng Đường Cong" msgid "A single curve from a curves data-block" -msgstr "Một đường cong từ một cục dữ liệu" +msgstr "Một đường cong từ khối dữ liệu đường cong" msgid "First Point Index" -msgstr "Chỉ Số Điểm Đầu" +msgstr "Chỉ Số của Điểm Đầu Tiên" msgid "The index of this curve's first control point" -msgstr "Chỉ số của điểm kiểm soát đầu của đường cong" +msgstr "Chỉ số của điểm điều khiển đầu tiên của đường cong này" msgid "Index of this curve" @@ -8781,39 +9566,39 @@ msgstr "Chỉ số của đường cong này" msgid "Control points of the curve" -msgstr "Các điểm kiểm soát của đường cong" +msgstr "Số điểm điều khiển của đường cong" msgid "Number of Points" -msgstr "Số Lượng Điểm" +msgstr "Số Điểm" msgid "Number of control points in the curve" -msgstr "Số lượng điểm kiểm soát của trong đường cong" +msgstr "Số điểm điều khiển của đường cong" msgid "Curve Splines" -msgstr "Mẫu Cong" +msgstr "Các Chốt Trục" msgid "Collection of curve splines" -msgstr "Sưu tập mẫu cong" +msgstr "Bộ sưu tập các chốt trục" msgid "Active Spline" -msgstr "Mẫu Cong Hoạt Động" +msgstr "Chốt Trục đang Hoạt Động" msgid "Active curve spline" -msgstr "Mẫu cong hoạt động" +msgstr "Chốt trục đang hoạt động" msgid "Dash Modifier Segment" -msgstr "Khúc Bộ Điều Chỉnh Gạch Ngang" +msgstr "Phân Khúc của Bộ Điều Chỉnh Gạch Ngang" msgid "Configuration for a single dash segment" -msgstr "Hình thể cho một khúc gạch ngang một mình" +msgstr "Cấu hình cho một phân khúc gạch ngang đơn nhất" msgid "Dash" @@ -8821,51 +9606,51 @@ msgstr "Gạch Ngang" msgid "The number of consecutive points from the original stroke to include in this segment" -msgstr "Gồm bao nhiêu điểm liên tiếp từ nét ban đầu vào khúc này" +msgstr "Số điểm liên tiếp từ nét vẽ ban đầu nhằm bao gồm trong phân khúc này" msgid "Gap" -msgstr "Cách Hơ" +msgstr "Khoảng Trống" msgid "The number of points skipped after this segment" -msgstr "Số lượng điểm được bỏ qua sau khúc này" +msgstr "Số điểm bị bỏ qua sau phân khúc này" msgid "Material Index" -msgstr "Chỉ Số Vật Liệu" +msgstr "Chỉ Số Nguyên Vật Liệu" msgid "Use this index on generated segment. -1 means using the existing material" -msgstr "Dùng chỉ số này vào khúc chế tạo. -1 nghĩa là đang sử dụng vật liệu tồn tại" +msgstr "Sử dụng chỉ số này trên phân đoạn sinh tạo. -1 có nghĩa là sử dụng nguyên vật liệu hiện có" msgid "Name of the dash segment" -msgstr "Tên của khúc gạch ngang" +msgstr "Tên của phân khúc gạch ngang" msgid "The factor to apply to the original point's opacity for the new points" -msgstr "Hệ số cho áp dụng với độ đục của điểm ban đầu cho các điểm mới" +msgstr "Hệ số độ đục của điểm ban đầu. Dành cho các điểm mới" msgid "The factor to apply to the original point's radius for the new points" -msgstr "Hệ số cho áp dụng với bán kính của điểm ban đầu cho các điểm mới" +msgstr "Hệ số bán kính của điểm ban đầu. Dành cho các điểm mới" msgid "Enable cyclic on individual stroke dashes" -msgstr "Bật chu trình cho dấu gạch nết riêng biệt" +msgstr "Bật tính tuần hoàn trên mỗi cá nhân dấu gạch ngang của nét" msgid "Dependency Graph" -msgstr "Biểu Đồ Tầng Bậc Ngờ" +msgstr "Đồ Thị Phụ Thuộc" msgid "IDs" -msgstr "Các ID" +msgstr "Các Chỉ Danh/ID" msgid "All evaluated data-blocks" -msgstr "Tất cả cục dữ liệu được tính toán" +msgstr "Toàn bộ các khối dữ liệu đã được tính toán" msgid "Evaluation mode" @@ -8873,11 +9658,11 @@ msgstr "Chế Độ Tính Toán" msgid "Viewport" -msgstr "Màn Chiếu" +msgstr "Cổng Nhìn" msgid "Viewport non-rendered mode" -msgstr "Chế độ không kết xuất màn chiếu" +msgstr "Chế độ phi kết xuất của cổng nhìn" msgid "Render" @@ -8885,15 +9670,15 @@ msgstr "Kết Xuất" msgid "Object Instances" -msgstr "Thực Thể Vật Thể" +msgstr "Các Thực Thể" msgid "All object instances to display or render (Warning: Only use this as an iterator, never as a sequence, and do not keep any references to its items)" -msgstr "Hết thực thể của vật thể để hiển thị hay kết xuất (Cảnh Báo: Chỉ dùng này để làm bộ lặp lại, đừng dùng làm một trình tự, và đừng giữ lại tham chiếu đến mặt hàng của nó)" +msgstr "Toàn bộ các thực thể sẽ hiển thị hoặc kết xuất (CẢNH BÁO: Chỉ sử dụng cái này làm tuần hoàn viên (iterator) mà thôi, không bao giờ sử dụng nó là một chuỗi tuần tự cả, và chớ giữ bất kỳ một tham chiếu nào đến các phần tử của nó)" msgid "Evaluated objects in the dependency graph" -msgstr "Vật thể được tính toán trong biểu đồ nhờ" +msgstr "Các đối tượng được tính toán trong đồ thị phụ thuộc" msgid "Scene" @@ -8901,71 +9686,79 @@ msgstr "Cảnh" msgid "Original scene dependency graph is built for" -msgstr "Cảnh ban đầu được xây dựng biểu đồ tầng bậc nhờ giùm" +msgstr "Cảnh gốc mà đồ thị phụ thuộc được xây dựng cho" + + +msgid "Scene at its evaluated state" +msgstr "Cảnh ở trạng thái đã được tính toán" msgid "Updates" -msgstr "Nâng Cấp" +msgstr "Những Cập Nhật" msgid "Updates to data-blocks" -msgstr "Nâng cấp cho các cục dữ liệu" +msgstr "Những cập nhật đến các khối dữ liệu" msgid "View Layer" -msgstr "Lớp Hiện" +msgstr "Tầng Góc Nhìn" msgid "Original view layer dependency graph is built for" -msgstr "Lớp hiện ban đầu được xây dựng biểu đồ tầng bậc nhờ giùm" +msgstr "Tầng Góc Nhìn gốc mà đồ thị phụ thuộc được xây dựng cho" + + +msgid "View layer at its evaluated state" +msgstr "Tầng góc nhìn ở trạng thái đã được tính toán" msgid "Dependency Graph Object Instance" -msgstr "Thực Thể Vật Thể Biểu Đồ Tầng Bậc Nhờ" +msgstr "Thực Thể trong Đồ Thị Phụ Thuộc" msgid "Extended information about dependency graph object iterator (Warning: All data here is 'evaluated' one, not original .blend IDs)" -msgstr "Thông tin thêm về đồ lặp lại của vật thể biểu đồ nhờ (Cảnh Báo: Tất cả dữ liệu ở đây là được 'tính toán', không phải ID .blend ban đầu...)" +msgstr "Thông tin mở rộng về tuần hoàn viên đối tượng của đồ thị phụ thuộc (Cảnh báo: Toàn bộ các dữ liệu ở đây chỉ là những cái được 'đánh giá' mà thôi, không phải là các chỉ danh ID gốc của .blend)" msgid "Instance Object" -msgstr "Vật Thể Thực Thể" +msgstr "Thực Thể" msgid "Evaluated object which is being instanced by this iterator" -msgstr "Vật thể được tính tóan đang được thực thể bởi đồ lặp lại này" +msgstr "Đối tượng được tuần hoàn viên này thực thể hóa thành sau khi đã ước tính" msgid "Is Instance" -msgstr "Là Thực Thể" +msgstr "Là Bản Sao" msgid "Denotes if the object is generated by another object" -msgstr "Cho biết nếu vật thể được vật thể khác chế tạo" +msgstr "Biểu thị rằng đối tượng có phải đã được sinh tạo bởi một đối tượng khác hay không" msgid "Generated Matrix" -msgstr "Ma Trận Được Chế Tạo" +msgstr "Ma Trận Sinh Tạo" msgid "Generated transform matrix in world space" -msgstr "Ma trận biến hóa được chế tạo trong không gian thế giới" +msgstr "Ma Trận biến hóa sinh tạo trong không gian thế giới" msgid "Evaluated object the iterator points to" -msgstr "Vật thể được tính toán thì đồ lặp lại đang chỉ đến" +msgstr "Đối tượng đã được tính toán mà tuần hoàn viên đang chỉ vào" msgid "Generated Coordinates" -msgstr "Tọa Độ Được Chế Tạo" +msgstr "Tọa Độ được Phát Sinh" msgid "Generated coordinates in parent object space" -msgstr "Tọa độ được chế tạo trong không gian vật thể phụ huynh" +msgstr "Những tọa độ được phát sinh trong không gian của đối tượng phụ huynh" msgid "If the object is an instance, the parent object that generated it" -msgstr "Nếu vật thể là thực thể, đây là vật thể phụ huynh đã chế tạo nó" +msgstr "Nếu đối tượng là một thực thể thì là đối tượng phụ huynh đã sinh tạo ra nó" msgid "Particle System" @@ -8973,39 +9766,39 @@ msgstr "Hệ Thống Hạt" msgid "Evaluated particle system that this object was instanced from" -msgstr "Hệ thống hạt được tính toán đã được thực thể vật thể này" +msgstr "Hệ thống hạt mà đối tượng này đã được thực thể hóa thành sau khi đã được tính toán" msgid "Persistent ID" -msgstr "ID Cô Chấp" +msgstr "ID Bất Biến" msgid "Persistent identifier for inter-frame matching of objects with motion blur" -msgstr "ID cố chấp cho phát hiện cùng vật thể giữa bức ảnh khi dùng mờ hóa chuyển động" +msgstr "Định danh bất biến để so sánh các đối tượng có chuyển động mờ nhòe ở khoảng giữa các khung hình" msgid "Instance Random ID" -msgstr "ID Thực Thể Ngẫu Nhiên" +msgstr "ID Ngẫu Nhiên của Thực thể" msgid "Random id for this instance, typically for randomized shading" -msgstr "ID ngẫu nhiên cho thực thể này, thường sử dụng cho tô sắc ngẫu nhiên" +msgstr "Chỉ danh (id) ngẫu nhiên cho thực thể này, điển hình là sử dụng trong việc tô bóng ngẫu nhiên" msgid "Show Particles" -msgstr "Hiện Hạt" +msgstr "Hiển Thị Hạt" msgid "Particles part of the object should be visible in the render" -msgstr "Hiện bộ phận hạt của vật thể nên hiển thị khi kết xuất" +msgstr "Phần hạt của đối tượng phải nhìn thấy được trong kết xuất" msgid "Show Self" -msgstr "Hiện Một Mình" +msgstr "Hiển Thị Bản Thân" msgid "The object geometry itself should be visible in the render" -msgstr "Hiển thị hình dạng vật thể một mình khi kết xuất" +msgstr "Bản thân hình học của đối tượng phải nhìn thấy được trong kết xuất" msgid "UV Coordinates" @@ -9017,11 +9810,11 @@ msgstr "Tọa độ UV trong không gian của phụ huynh" msgid "Dependency Graph Update" -msgstr "Nâng Cấp Của Biểu Đồ Tầng Bậc Nhờ" +msgstr "Cập Nhật của Đồ Thị Trực Thuộc" msgid "Information about ID that was updated" -msgstr "Thông tin về ID đã được nâng cấp" +msgstr "Thông tin về chỉ danh (ID) đã được cập nhật" msgid "ID" @@ -9029,23 +9822,23 @@ msgstr "ID" msgid "Updated data-block" -msgstr "Cục dữ liệu được nâng cấp" +msgstr "Khối dữ liệu đã cập nhật" msgid "Geometry" -msgstr "Hình Dạng" +msgstr "Hình Học" msgid "Object geometry is updated" -msgstr "Hình dạng vật thể được nâng cấp" +msgstr "Hình học của đối tượng đã được cập nhật" msgid "Shading" -msgstr "Tô Sắc" +msgstr "Tô Bóng" msgid "Object shading is updated" -msgstr "Đã nâng cấp tô sắc vật thể" +msgstr "Tô bóng của đối tượng đã được cập nhật" msgid "Transform" @@ -9053,99 +9846,99 @@ msgstr "Biến Hóa" msgid "Object transformation is updated" -msgstr "Biến hóa vật thể được nâng cấp" +msgstr "Biến hóa của đối tượng đã được cập nhật" msgid "Safe Areas" -msgstr "Khu Vực An Toàn" +msgstr "Vùng An Toàn" msgid "Safe areas used in 3D view and the sequencer" -msgstr "Khu vực an toàn trong màn 3D và bộ trình tự " +msgstr "Vùng an toàn trong góc nhìn 3D và trong Trình Phối Hình" msgid "Action Safe Margins" -msgstr "Lề An Toàn Cho Hành Động" +msgstr "Lề An Toàn cho Hành Động" msgid "Safe area for general elements" -msgstr "Khu vực an toàn cho phần tử tổng quát" +msgstr "Vùng an toàn cho các thành phần phổ thông" msgid "Center Action Safe Margins" -msgstr "Lề An Toàn Cho Trung Tâm Hành Động" +msgstr "Lề An Toàn cho vùng Hành Động Trung Tâm" msgid "Safe area for general elements in a different aspect ratio" -msgstr "Khu vực an toàn cho phần tử tổng quát cho một tỉ số cạnh khác" +msgstr "Vùng an toàn cho các phần tử nói chung trong một tỷ lệ khung hình khác" msgid "Title Safe Margins" -msgstr "Lề An Toàn Cho Tựa" +msgstr "Mép Lề An Toàn của Tựa Đề" msgid "Safe area for text and graphics" -msgstr "Khu vực an toàn cho văn bản và đồ họa" +msgstr "Vùng an toàn cho văn bản và đồ họa" msgid "Center Title Safe Margins" -msgstr "Lề An Toàn Cho Trung Tâm Tựa" +msgstr "Lề An Toàn cho Tiêu Đề Trung Tâm" msgid "Safe area for text and graphics in a different aspect ratio" -msgstr "Khu vực an toàn cho văn bản và đồ họa cho một tỉ số cạnh khác" +msgstr "Vùng an toàn cho văn bản và đồ họa trong một tỷ lệ khung hình khác" msgid "Settings for filtering the channels shown in animation editors" -msgstr "Cài đặt cho lọc các kênh được hiện trong các trình biên soạn hoạt hình" +msgstr "Những sắp đặt để thanh lọc các kênh được hiển thị trong các trình biên soạn hoạt họa" msgid "Filtering Collection" -msgstr "Đang Lọc Sưu Tập" +msgstr "Thanh Lọc Bộ Sưu Tập" msgid "Collection that included object should be a member of" -msgstr "Sưu tập được gồm vật thể thì vật thể nên là nhân viên của sưu tập này" +msgstr "Bộ sưu tập chứa đối tượng đáng phải là một thành viên của nó" msgid "F-Curve Name Filter" -msgstr "Bộ Lọc Tên Cong-F" +msgstr "Thanh Lọc Tên Đường Cong-F" msgid "F-Curve live filtering string" -msgstr "Xâu lọc Cong-F trực tiếp" +msgstr "Đường Cong-F trực tuyến thanh lọc văn bản" msgid "Name Filter" -msgstr "Bộ Lọc Tên" +msgstr "Thanh Lọc Tên" msgid "Live filtering string" -msgstr "Xâu lọc trực tiếp" +msgstr "Trực tuyến thanh lọc văn bản" msgid "Display Armature" -msgstr "Hiển Thị Cốt" +msgstr "Hiển Thị Khung Cốt" msgid "Include visualization of armature related animation data" -msgstr "Gồm sự hiển thị của dữ liệu hoạt hình liên quan với cốt" +msgstr "Bao gồm sự diễn họa dữ liệu hoạt họa liên quan đến khung cốt" msgid "Display Cache Files" -msgstr "Hiển Thị Tập Tin Đệm Chứa" +msgstr "Hiển Thị Tập Tin Bộ Đệm Nhớ" msgid "Include visualization of cache file related animation data" -msgstr "Gồm sự hiển thị của dữ liệu hoạt hình liên quan tập tin đệm chứa" +msgstr "Bao gồm sự diễn họa trực quan dữ liệu hoạt họa liên quan trong tập tin bộ đệm nhớ" msgid "Display Camera" -msgstr "Máy Quay Phim Hiển Thị" +msgstr "Hiển Thị Máy Quay Phim" msgid "Include visualization of camera related animation data" -msgstr "Gồm sự hiển thị của dữ liệu hoạt hình liên quan với máy quay phim" +msgstr "Bao gồm sự diễn họa dữ liệu hoạt họa liên quan đến máy quay phim" msgid "Display Curve" @@ -9153,31 +9946,31 @@ msgstr "Hiển Thị Đường Cong" msgid "Include visualization of curve related animation data" -msgstr "Gồm sự hiển thị của dữ liệu hoạt hình liên quan đến đường cong" +msgstr "Bao gồm sự diễn họa dữ liệu hoạt họa liên quan đến đường cong" msgid "Show Data-Block Filters" -msgstr "Hiện Bộ Lọc Cục Dữ Liệu" +msgstr "Hiển Thị Thanh Lọc Khối Dữ Liệu" msgid "Show options for whether channels related to certain types of data are included" -msgstr "Hiện tùy chọn cho biết nếu các kênh có liên quan đến vài loại dữ liệu được gồm theo" +msgstr "Hiển thị các tùy chọn để giúp quyết định xem những kênh liên quan đến các dữ liệu nhất định nào đó có được bao gồm hay không" msgid "Collapse Summary" -msgstr "Tóp Tóm Lại" +msgstr "Thu Tóm Tắt Lại" msgid "Collapse summary when shown, so all other channels get hidden (Dope Sheet editors only)" -msgstr "Tóp tóm lại khi hiện, cho tất cả kênh khác được ẩn (chỉ cho trình biên soạn Bảng Hoạt Hình)" +msgstr "Thu tóm tắt lại khi hiển thị, hầu cho toàn bộ các kênh khác đều được ẩn giấu đi (chỉ dành cho Bảng Hành Động)" msgid "Display Grease Pencil" -msgstr "Hiển Thị Bút Sáp" +msgstr "Hiển Thị Bút Chì Dầu" msgid "Include visualization of Grease Pencil related animation data and frames" -msgstr "Gồm sự hiện thị cho dữ liệu và bức ảnh hoạt hình liên quan với Bút Sáp" +msgstr "Bao gồm sự hình dung dữ liệu và các khung hình hoạt họa liên quan đến Bút Chì Dầu" msgid "Display Hair" @@ -9185,55 +9978,55 @@ msgstr "Hiển Thị Tóc" msgid "Include visualization of hair related animation data" -msgstr "Gồm sự hiển thị của dữ liệu hoạt hình liên quan với tóc" +msgstr "Bao gồm sự diễn họa dữ liệu hoạt họa liên quan đến tóc" msgid "Show Hidden" -msgstr "Hiện Ẩn" +msgstr "Hiển Thị cái Ẩn Khuất" msgid "Include channels from objects/bone that are not visible" -msgstr "Gồm các kênh từ vật thể/xương không thể được ẩn)" +msgstr "Bao gồm các kênh từ những đối tượng/xương không thấy được" msgid "Display Lattices" -msgstr "Hiển Thị Rào Lưới" +msgstr "Hiển Thị Lưới Rào" msgid "Include visualization of lattice related animation data" -msgstr "Gồm sự hiển thị của dữ liệu hoạt hình liên quan với rào lưới" +msgstr "Bao gồm sự hình dung dữ liệu hoạt họa liên quan đến lưới rào" msgid "Display Light" -msgstr "Hiển Thị Đèn" +msgstr "Hiển Thị Nguồn Sáng" msgid "Include visualization of light related animation data" -msgstr "Gồm sự hiển thị của dữ liệu hoạt hình liên quan với đèn" +msgstr "Bao gồm sự diễn họa dữ liệu hoạt họa liên quan đến nguồn sáng" msgid "Display Line Style" -msgstr "Hiển Thị Phong Cách Nét" +msgstr "Hiển Thị Phong Cách Đường Nét" msgid "Include visualization of Line Style related Animation data" -msgstr "Gồm sự hiển thị của dữ liệu hoạt hình liên quan với phong cách nét" +msgstr "Bao gồm sự diễn họa của dữ liệu hoạt họa liên quan đến Phong Cách Đường Nét" msgid "Display Material" -msgstr "Hiển Thị Vật Liệu" +msgstr "Hiển Thị Nguyên Vật Liệu" msgid "Include visualization of material related animation data" -msgstr "Gồm sự hiển thị của dữ liệu hoạt hình liên quan với vật liệu" +msgstr "Bao gồm sự diễn họa dữ liệu hoạt họa liên quan đến nguyên vật liệu" msgid "Display Meshes" -msgstr "Hiển Thị Mạng Lưới" +msgstr "Hiển Thị Khung Lưới" msgid "Include visualization of mesh related animation data" -msgstr "Gồm sự hiển thị của dữ liệu hoạt hình liên quan với mạng lưới" +msgstr "Bao gồm sự diễn họa dữ liệu hoạt họa liên quan đến khung lưới" msgid "Display Metaball" @@ -9241,15 +10034,15 @@ msgstr "Hiển Thị Siêu Cầu" msgid "Include visualization of metaball related animation data" -msgstr "Gồm sự hiển thị của dữ liệu hoạt hình liên quan với siêu cầu" +msgstr "Bao gồm sự diễn họa dữ liệu hoạt họa liên quan đến siêu cầu" msgid "Include Missing NLA" -msgstr "Gồm NLA Bị Mất" +msgstr "Bao Gồm cả NLA bị Thất Lạc" msgid "Include animation data-blocks with no NLA data (NLA editor only)" -msgstr "Gồm cục dữ liệu hoạt hình không có dữ liệu NLA (chỉ cho trình biên soạn NLA)" +msgstr "Hiển thị khối dữ liệu hoạt họa không có (mất/thất lạc) dữ liệu NLA nữa (duy trình biên soạn NLA mà thôi)" msgid "Display Modifier Data" @@ -9257,39 +10050,39 @@ msgstr "Hiển Thị Dữ Liệu Bộ Điều Chỉnh" msgid "Include visualization of animation data related to data-blocks linked to modifiers" -msgstr "Gồm sự hiển thị của cục dữ liệu hoạt hình liên quan với cục dữ liệu nối với bộ điều chỉnh" +msgstr "Bao gồm sự diễn họa dữ liệu hoạt họa liên quan đến khối dữ liệu kết nối với bộ điều chỉnh" msgid "Display Movie Clips" -msgstr "Hiển Thị Đoạn Phim" +msgstr "Hiển Thị các Đoạn Phim" msgid "Include visualization of movie clip related animation data" -msgstr "Gồm sự hiển thị của dữ liệu hoạt hình liên quan với đoạn phim" +msgstr "Bao gồm sự diễn họa trực quan dữ liệu hoạt họa liên quan đến đoạn phim" msgid "Display Node" -msgstr "Hiển Thị Giao Điểm" +msgstr "Hiển Thị Nút" msgid "Include visualization of node related animation data" -msgstr "Gồm sự hiển thị của dữ liệu hoạt hình liên quan với giao điểm" +msgstr "Bao gồm sự diễn họa dữ liệu hoạt họa liên quan đến nút" msgid "Only Show Errors" -msgstr "Chỉ Hiện Sai Lầm" +msgstr "Duy Hiển Thị các Lỗi Lầm" msgid "Only include F-Curves and drivers that are disabled or have errors" -msgstr "Chỉ gồm Cong-F và điều vận đã tắt hay có sai lầm" +msgstr "Chỉ bao gồm các Đường Cong-F và các điều vận đã bị tắt hoặc có lỗi" msgid "Only Show Selected" -msgstr "Chỉ Hiện Được Chọn" +msgstr "Duy Hiển Thị cái đã Được Chọn" msgid "Only include channels relating to selected objects and data" -msgstr "Chỉ gồm các kênh liên quan với vật thể và dữ liệu được chọn" +msgstr "Chỉ bao gồm các kênh liên quan đến đối tượng và dữ liệu đã được chọn mà thôi" msgid "Display Particle" @@ -9297,15 +10090,15 @@ msgstr "Hiển Thị Hạt" msgid "Include visualization of particle related animation data" -msgstr "Gồm sự hiển thị của dữ liệu hoạt hình liên quan với hạt" +msgstr "Bao gồm sự diễn họa dữ liệu hoạt họa liên quan đến hạt" msgid "Display Point Cloud" -msgstr "Hiển Thị Mây Điểm" +msgstr "Hiển Thị Đám Mây Điểm" msgid "Include visualization of point cloud related animation data" -msgstr "Gồm sự hiển thị của dữ liệu hoạt hình liên quan với mây điểm" +msgstr "Bao gồm sự diễn họa dữ liệu hoạt họa liên quan đến đám mây điểm" msgid "Display Scene" @@ -9313,15 +10106,15 @@ msgstr "Hiển Thị Cảnh" msgid "Include visualization of scene related animation data" -msgstr "Gồm sự hiển thị của dữ liệu hoạt hình liên quan với cảnh" +msgstr "Bao gồm sự diễn họa dữ liệu hoạt họa liên quan đến cảnh" msgid "Display Shape Keys" -msgstr "Hiển Thị Mẫu Dạng" +msgstr "Hiển Thị các Hình Mẫu" msgid "Include visualization of shape key related animation data" -msgstr "Gồm sự hiển thị của dữ liệu liên quan với dạng mẫu" +msgstr "Bao gồm sự diễn họa dữ liệu hoạt họa liên quan đến hình mẫu" msgid "Display Speaker" @@ -9329,15 +10122,15 @@ msgstr "Hiển Thị Loa" msgid "Include visualization of speaker related animation data" -msgstr "Gồm sự hiển thị của dữ liệu hoạt hình liên quân với loa" +msgstr "Bao gồm sự diễn họa dữ liệu hoạt họa liên quan đến loa" msgid "Display Summary" -msgstr "Hiển Thị Tóm Lại" +msgstr "Hiển Thị Dòng Tóm Tắt" msgid "Display an additional 'summary' line (Dope Sheet editors only)" -msgstr "Hiển thị một 'tóm lại' thêm (chỉ cho biên tập Bảng Hoạt Hình)" +msgstr "Hiển thị thêm một dòng 'tóm tắt' (chỉ trong Trình Biên Soạn Bảng Hành Động mà thôi)" msgid "Display Texture" @@ -9345,23 +10138,23 @@ msgstr "Hiển Thị Chất Liệu" msgid "Include visualization of texture related animation data" -msgstr "Gồm sự hiển thị của dữ liệu hoạt hình liên quan với chất liệu" +msgstr "Bao gồm sự diễn họa dữ liệu hoạt họa liên quan đến chất liệu" msgid "Display Transforms" -msgstr "Hiển Thị Biến Hóa" +msgstr "Hiển Thị các Biến Hóa" msgid "Include visualization of object-level animation data (mostly transforms)" -msgstr "Gồm sự hiển thị của dữ liệu hoạt hình vật thể (đa số là biến hóa)" +msgstr "Bao gồm sự diễn họa dữ liệu hoạt họa ở mức đối tượng (hầu hết các biến hóa)" msgid "Display Volume" -msgstr "Hiển Thị Thể Tích" +msgstr "Hiển Thị Âm Lượng" msgid "Include visualization of volume related animation data" -msgstr "Gồm sự hiển thị của dữ liệu hoạt hình liên quan với thể tích" +msgstr "Bao gồm sự diễn hoạ dữ liệu hoạt họa liên quan tới âm lượng" msgid "Display World" @@ -9369,7 +10162,7 @@ msgstr "Hiển Thị Thế Giới" msgid "Include visualization of world related animation data" -msgstr "Gồm sự hiển thị của dữ liệu hoạt hình liên quan với thế giới" +msgstr "Bao gồm sự diễn họa dữ liệu hoạt họa liên quan đến thế giới" msgid "Source" @@ -9377,15 +10170,15 @@ msgstr "Nguồn" msgid "ID-Block representing source data, usually ID_SCE (i.e. Scene)" -msgstr "Cục ID đại diện dữ liệu nguồn, thường ID_SCE (ví dụ là Cảnh)" +msgstr "Khối-ID đại diện cho dữ liệu nguồn, thường là ID_SCE (chẳng hạn Cảnh)" msgid "Sort Data-Blocks" -msgstr "Sắp Xếp Cục Dữ Liệu" +msgstr "Sắp Tuần Tự các Khối Dữ Liệu" msgid "Alphabetically sorts data-blocks - mainly objects in the scene (disable to increase viewport speed)" -msgstr "Sắp xếp cục dữ liệu theo thứ từ chữ cái - thường là vật thể trong cảnh (tắt để tăng tốc độ vẽ màn chiếu)" +msgstr "Sắp xếp các khối dữ liệu theo thứ tự chữ cái - thường là các đối tượng trong cảnh (tắt đi để tăng tốc độ vẽ của cổng nhìn)" msgid "Invert" @@ -9393,23 +10186,23 @@ msgstr "Đảo Nghịch" msgid "Invert filter search" -msgstr "Đảo nghịch tìm kiếm bộ lọc" +msgstr "Đảo nghịch thanh lọc tìm kiếm" msgid "Multi-Word Fuzzy Filter" -msgstr "Bộ Lọc Đa Chữ Mở" +msgstr "Thanh Lọc Đa-Từ Mờ Ảo" msgid "" "Perform fuzzy/multi-word matching.\n" "Warning: May be slow" msgstr "" -"Thực hành tìm kiếm chữ giống kiểu mờ/đa chữ.\n" -"Cảnh Báo: Có lẽ chậm chạp" +"Thi hành sự so sánh đa-từ/mờ ảo\n" +"(Cảnh báo: Có thể chậm)" msgid "Driver for the value of a setting based on an external value" -msgstr "Điều vận cho giá trị của cài đặt từ một giá trị ở ngoài" +msgstr "Điều vận điều chế giá trị của một sắp đặt dựa vào một giá trị ở bên ngoài" msgid "Expression" @@ -9417,23 +10210,27 @@ msgstr "Biểu Thức" msgid "Expression to use for Scripted Expression" -msgstr "Biểu thức để dùng cho Biểu Thức Văn Thảo" +msgstr "Biểu thức để sử dụng làm Biểu Thức Tập Lệnh" msgid "Simple Expression" msgstr "Biểu Thức Đơn Giản" +msgid "The scripted expression can be evaluated without using the full Python interpreter" +msgstr "Có thể đánh giá biểu thức lệnh đã viết mà không cần sử dụng trình thông dịch Python đầy đủ" + + msgid "Invalid" msgstr "Không Hợp Lệ" msgid "Driver could not be evaluated in past, so should be skipped" -msgstr "Không thể đánh giá điều vận trong qua khư, cho nên bỏ qua nó" +msgstr "Trong quá khứ việc đánh giá điều vận đã không thành công, vậy nên bỏ qua nó" msgid "Driver type" -msgstr "Loại Điều Vận" +msgstr "Thể loại truyền vận" msgid "Averaged Value" @@ -9441,35 +10238,35 @@ msgstr "Giá Trị Trung Bình" msgid "Sum Values" -msgstr "Cộng Giá Trị" +msgstr "Giá Trị Tổng" msgid "Scripted Expression" -msgstr "Biểu Thức Văn Thảo" +msgstr "Biểu Thức Tập Lệnh" msgid "Minimum Value" -msgstr "Giá Trị Cực Tiểu" +msgstr "Giá Trị Tối Thiểu" msgid "Maximum Value" -msgstr "Giá Trị Cực Đại" +msgstr "Giá Trị Tối Đa" msgid "Use Self" -msgstr "Dùng Một Mình" +msgstr "Sử Dụng Self" msgid "Include a 'self' variable in the name-space, so drivers can easily reference the data being modified (object, bone, etc...)" -msgstr "Gồm một biến 'một mình' trong không gian tên, cho điều vận có thể tham chiếu dễ dữ liệu đang bị đổi (vật thể, xương, v.v.)" +msgstr "Bao gồm biến số 'self' (bản thân) trong không gian tên, hầu cho các điều vận có thể tham chiếu các dữ liệu đang thay đổi một cách dễ dàng (đối tượng, xương, v.v.)" msgid "Variables" -msgstr "Biến" +msgstr "Biến Số" msgid "Properties acting as inputs for this driver" -msgstr "Đặc tính làm dữ liệu ngõ vào cho điều vận này" +msgstr "Những tính chất dùng làm các nguồn cấp liệu cho điều vận này" msgid "Driver Target" @@ -9477,7 +10274,7 @@ msgstr "Mục Tiêu Điều Vận" msgid "Source of input values for driver variables" -msgstr "Nguồn giá trị ngõ vào cho các biến của điều vận" +msgstr "Nguồn giá trị cung cấp cho các biến điều vận" msgid "Bone Name" @@ -9485,15 +10282,31 @@ msgstr "Tên Xương" msgid "Name of PoseBone to use as target" -msgstr "Tên cửa XươngDạngĐứng cho dùng để làm mục tiêu" +msgstr "Tên của Xương Tư Thế (PoseBone) để dùng làm mục tiêu" + + +msgid "Context Property" +msgstr "Tính Chất Ngữ Cảnh" + + +msgid "Type of a context-dependent data-block to access property from" +msgstr "Thể loại khối dữ liệu phụ thuộc vào ngữ cảnh để truy cập tính chất" msgid "Active Scene" -msgstr "Cảnh Hoạt Động" +msgstr "Cảnh đang Hoạt Động" + + +msgid "Currently evaluating scene" +msgstr "Hiện đang tính toán cảnh" msgid "Active View Layer" -msgstr "Lớp Màn Hoạt Động" +msgstr "Tầng Góc Nhìn đang Hoạt Động" + + +msgid "Currently evaluating view layer" +msgstr "Tầng góc nhìn hiện đang tính toán" msgid "Data Path" @@ -9501,11 +10314,11 @@ msgstr "Đường Dẫn Dữ Liệu" msgid "RNA Path (from ID-block) to property used" -msgstr "Đường Dẫn RNA (từ cục ID) đến đặc tính được sử dụng" +msgstr "Đường dẫn RNA (từ khối-ID) đến tính chất được sử dụng" msgid "ID-block that the specific property used can be found from (id_type property must be set first)" -msgstr "Cục ID có đặc tính được xác định (phải đặt đặc tính id_type trước)" +msgstr "Khối-ID sở hữu tính chất cụ thể cần sử dụng (phải đặc tính chất id_type (loại ID) trước)" msgctxt "ID" @@ -9514,15 +10327,15 @@ msgstr "Loại ID" msgid "Type of ID-block that can be used" -msgstr "Loại cục ID có thể dùng" +msgstr "Loại khối-ID có thể sử dụng" msgid "Rotation Mode" -msgstr "Chế Độ Xoay" +msgstr "Chế Độ Xoay Chiều" msgid "Mode for calculating rotation channel values" -msgstr "Chế độ tính giá trị cho kênh xoay" +msgstr "Chế độ tính toán các giá trị của kênh xoay chiều" msgid "Transform Space" @@ -9530,127 +10343,131 @@ msgstr "Không Gian Biến Hóa" msgid "Space in which transforms are used" -msgstr "Không gian để sử dụng biến hóa" +msgstr "Không gian dùng cho các biến hóa" msgid "Transforms include effects of parenting/restpose and constraints" -msgstr "Biến hóa gồm hiệu ứng như đặt phụ huynh/dạng đứng nghỉ ngơi và ràng buộc" +msgstr "Biến hóa bao gồm những hiệu ứng của phụ huynh hóa/tư thế nghỉ và các ràng buộc" msgid "Transforms don't include parenting/restpose or constraints" -msgstr "Biến hóa không gồm hiệu ứng như đặt phụ huynh/dạng đứng nghỉ ngơi và ràng buộc" +msgstr "Biến hóa không bao gồm phụ huynh hóa/tư thế nghỉ và các ràng buộc" msgid "Transforms include effects of constraints but not parenting/restpose" -msgstr "Biến hóa gồm hiệu ứng của ràng buộc mà không gồm đặt phụ huynh/dạng đứng nghỉ ngơi" +msgstr "Biến hóa bao gồm những hiệu ứng của các ràng buộc, song không có phụ huynh/tư thế nghỉ" msgid "Driver variable type" -msgstr "Loại biến điều vận" +msgstr "Thể biến số của điều vận" msgid "W Rotation" -msgstr "Xoay W" +msgstr "Xoay Chiều W" msgid "Average Scale" -msgstr "Phóng To Trung Bình" +msgstr "Tỷ Lệ Trung Bình" msgid "Driver Variable" -msgstr "Biến Điều Vận" +msgstr "Biến Số Điều Vận" msgid "Variable from some source/target for driver relationship" -msgstr "Biến từ vài nguồn/mục tiêu nào cho quan hệ dắt" +msgstr "Biến số từ một nguồn/mục tiêu nào đó dành cho quan hệ của điều vận" msgid "Is Name Valid" -msgstr "Tên Hợp Lệ" +msgstr "Tên có Hợp Lệ Không" msgid "Is this a valid name for a driver variable" -msgstr "Tên này hợp lệ cho một biến điều vận" +msgstr "Tên này có hợp lệ để làm ẩn số của điều vận không" msgid "Name to use in scripted expressions/functions (no spaces or dots are allowed, and must start with a letter)" -msgstr "Tên để dùng trong biểu thức văn thảo/hàm số (không cho dùng dấu chấm hay dấu cách, và phải bắt đầu với một chữ cái)" +msgstr "Tên để dùng trong các biểu thức của tập lệnh/hàm số (không được dùng dấu chấm hay dấu cách, và phải bắt đầu bằng một chữ cái)" msgid "Sources of input data for evaluating this variable" -msgstr "Các nguồn dữ liệu ngõ vào cho tính toán biến này" +msgstr "Các nguồn dữ liệu cung cấp cho tính toán biến số này" msgid "Single Property" -msgstr "Đặc Tính Đơn" +msgstr "Đơn Tính Chất" msgid "Use the value from some RNA property" -msgstr "Dùng giá trị từ một đặc tính RNA nào" +msgstr "Sử dụng giá trị từ một số tính chất RNA" msgid "Final transformation value of object or bone" -msgstr "Giá trị biến hóa cuối của vật thể hay xương" +msgstr "Giá trị biến hóa cuối cùng của đối tượng hay xương" msgid "Rotational Difference" -msgstr "Chênh Lệch Xoay" +msgstr "Dịch Chuyển của Độ Xoay" msgid "Use the angle between two bones" -msgstr "Sử dụng góc giữa hai xương" +msgstr "Dùng góc giữa hai xương" msgid "Distance between two bones or objects" -msgstr "Khoảng cách giữa hai xương hay vật thể" +msgstr "Khoảng cách giữa hai xương hay đối tượng" + + +msgid "Use the value from some RNA property within the current evaluation context" +msgstr "Sử dụng giá trị từ một số tính chất RNA trong bối cảnh tính toán hiện tại" msgid "Brush Settings" -msgstr "Cài Đặt Bút" +msgstr "Các Cài Đặt của Đầu Bút" msgid "Brush settings" -msgstr "Cài đặt bút" +msgstr "Các Cài Đặt của đầu bút" msgid "Inner Proximity" -msgstr "Khoảng Cách Nội Bộ" +msgstr "Vùng Lân Cận Nội Tại" msgid "Proximity falloff is applied inside the volume" -msgstr "Áp dụng sự giảm của cách xa ở trong thể tích" +msgstr "Độ nhòe mờ lân cận được áp dụng bên trong khối thể tích" msgid "Paint Alpha" -msgstr "Độ Đục Nước Sơn" +msgstr "Kênh Alpha của Sơn" msgid "Paint alpha" -msgstr "Độ đục của nước sơn" +msgstr "Kênh alpha của sơn" msgid "Paint Color" -msgstr "Màu Nước Sơn" +msgstr "Màu Sơn" msgid "Color of the paint" -msgstr "Màu của nước sơn" +msgstr "Màu sắc của nước sơn" msgid "Proximity Distance" -msgstr "Khoảng Cách Xa" +msgstr "Khoảng Cách Vùng Lân Cận" msgid "Maximum distance from brush to mesh surface to affect paint" -msgstr "Cách xa cực đại từ bút đến bề mặt mạng lưới để ảnh hưởng sơn" +msgstr "Khoảng cách tối đa từ đầu bút tới mặt khung lưới để tác động sơn" msgid "Paint Color Ramp" -msgstr "Dốc Màu Sơn" +msgstr "Dốc Màu của Sơn" msgid "Color ramp used to define proximity falloff" -msgstr "Dốc màu dùng cho xác định sự giảm cách xa" +msgstr "Dốc màu dùng để xác định độ nhòe mờ lân cận" msgid "Paint Source" @@ -9658,27 +10475,27 @@ msgstr "Nguồn Sơn" msgid "Object Center" -msgstr "Trung Tâm Vật Thể" +msgstr "Tâm Đối Tượng" msgid "Proximity" -msgstr "Cách Xa" +msgstr "Vùng Lân Cận" msgid "Mesh Volume + Proximity" -msgstr "Thể Tích + Cách Xa" +msgstr "Thể Tích Khung Lưới + Vùng Lân Cận" msgid "Mesh Volume" -msgstr "Thể Tích Mạng Lưới" +msgstr "Thể Tích Khung Lưới" msgid "Paint Wetness" -msgstr "Độ Ướt Nước Sơn" +msgstr "Độ Ướt của Nước Sơn" msgid "Paint wetness, visible in wetmap (some effects only affect wet paint)" -msgstr "Độ ướt nước sơn, được hiện trong bản đồ ướt (vài hiệu ứng chỉ ảnh hưởng nước sơn ướt)" +msgstr "Độ ướt của nước sơn, hữu hình trong biểu đồ độ ướt (một số hiệu ứng chỉ có tác động với sơn ướt mà thôi)" msgid "Particle Systems" @@ -9686,27 +10503,47 @@ msgstr "Hệ Thống Hạt" msgid "The particle system to paint with" -msgstr "Dùng hệ thống hạt nào để sơn" +msgstr "Hệ thống hạt dùng để sơn" + + +msgctxt "Brush" +msgid "Falloff" +msgstr "Suy Giảm Dần" msgid "Proximity falloff type" -msgstr "Loại sự giảm cách xa" +msgstr "Thể suy giảm dần độ tiếp cận" + + +msgctxt "Brush" +msgid "Smooth" +msgstr "Làm Mịn" + + +msgctxt "Brush" +msgid "Constant" +msgstr "Bất Biến" + + +msgctxt "Brush" +msgid "Color Ramp" +msgstr "Dốc Màu" msgid "Ray Direction" -msgstr "Hướng Tia" +msgstr "Hướng Tia Xạ" msgid "Ray direction to use for projection (if brush object is located in that direction it's painted)" -msgstr "Dùng hướng tia cho phép chiếu (nếu vật thể bút ở hướng đó, nó được sơn)" +msgstr "Hướng tia xạ sử dụng để dự phóng (nếu đối tượng đầu bút nằm trong hướng này thì nó sẽ bị sơn lên)" msgid "Canvas Normal" -msgstr "Pháp Tuyến Mặt Sơn" +msgstr "Pháp Tuyến Mặt Khung Vẽ" msgid "Brush Normal" -msgstr "Pháp Tuyến Bút" +msgstr "Pháp Tuyến Đầu Bút" msgid "Z-Axis" @@ -9714,43 +10551,43 @@ msgstr "Trục Z" msgid "Smooth Radius" -msgstr "Bán Kín Mịn" +msgstr "Bán Kính Làm Mịn" msgid "Smooth falloff added after solid radius" -msgstr "Sự giảm mịn được thêm sau bán kính rắn" +msgstr "Độ nhòe mờ mịn màng dần dần được thêm vào sau bán kính đặc" msgid "Smudge Strength" -msgstr "Sức Mở" +msgstr "Cường Độ Bôi Nhòe" msgid "Smudge effect strength" -msgstr "Sức của hiệu ứng mờ" +msgstr "Cường độ hiệu ứng bôi nhòe" msgid "Solid Radius" -msgstr "Bán Kính Rắn" +msgstr "Bán Kính Đặc" msgid "Radius that will be painted solid" -msgstr "Bán kính sẽ được sơn rắn" +msgstr "Bán kính sẽ được sơn đặc kín" msgid "Absolute Alpha" -msgstr "Độ Đục Tuyệt Đối" +msgstr "Alpha Tuyệt Đối" msgid "Only increase alpha value if paint alpha is higher than existing" -msgstr "Chỉ tăng giá trị độ đục nếu độ đục cao hơn độ đục có sẵn" +msgstr "Chỉ tăng giá trị alpha nếu độ đục của sơn cao hơn độ đục hiện có" msgid "Negate Volume" -msgstr "Trừ Thể Thích" +msgstr "Đảo Ngược Thể Tích" msgid "Negate influence inside the volume" -msgstr "Trừ sự ảnh hưởng trong thể tích" +msgstr "Làm giảm ảnh hưởng bên trong khối thể tích" msgid "Erase Paint" @@ -9758,43 +10595,43 @@ msgstr "Xóa Sơn" msgid "Erase / remove paint instead of adding it" -msgstr "Xóa/bất nước sơn thay thế vẽ sơn thêm" +msgstr "Xóa / tẩy sơn đi thay vì thêm vào" msgid "Use Particle Radius" -msgstr "Dùng Bán Kính Hạt" +msgstr "Sử Dụng Bán Kính Hạt" msgid "Use radius from particle settings" -msgstr "Dùng bán kính từ cài đặt hạt" +msgstr "Sử dụng bán kính từ những sắp đặt của hạt" msgid "Brush is projected to canvas from defined direction within brush proximity" -msgstr "Chiếu bút trên mặt sơn tử hướng được chỉ định trong cách xa bút" +msgstr "Đầu bút được phóng chiếu tới khung vẽ với hướng đã định nội trong khoảng lân cận của đầu bút" msgid "Only Use Alpha" -msgstr "Chỉ dùng độ đục" +msgstr "Duy Sử Dụng Alpha" msgid "Only read color ramp alpha" -msgstr "Chỉ đọc độ đục của dốc màu" +msgstr "Chỉ đọc alpha của dốc màu" msgid "Do Smudge" -msgstr "Mờ Hóa" +msgstr "Bôi Nhòe" msgid "Make this brush to smudge existing paint as it moves" -msgstr "Làm cho bút này mờ hóa nước sơn sẵn khi nó di chuyển" +msgstr "Khiến đầu bút này bôi nhòe nước sơn hiện tại trong khi nó di chuyển" msgid "Multiply Alpha" -msgstr "Nhân Độ Đục" +msgstr "Nhân Alpha" msgid "Multiply brush influence by velocity color ramp alpha" -msgstr "Nhân sự ảnh hưởng bút với độ đục dốc màu văn tốc" +msgstr "Nhân tác động của đầu bút với alpha của dốc màu vận tốc" msgid "Replace Color" @@ -9802,7 +10639,7 @@ msgstr "Thay Thế Màu" msgid "Replace brush color by velocity color ramp" -msgstr "Thay thế màu bút bằng dốc màu vận tốc" +msgstr "Thay màu đầu bút bằng dốc màu vận tốc" msgid "Multiply Depth" @@ -9810,15 +10647,15 @@ msgstr "Nhân Độ Sâu" msgid "Multiply brush intersection depth (displace, waves) by velocity ramp alpha" -msgstr "Nhân độ sâu giao cắt của bút (dịch, sóng) với độ đục của dốc vận tốc" +msgstr "Nhân chiều sâu nút của đầu bút (phép dời hình, làn sóng) với alpha của dốc màu vận tốc" msgid "Max Velocity" -msgstr "Vận Tốc Cực Đại" +msgstr "Vận Tốc Tối Đa" msgid "Velocity considered as maximum influence (Blender units per frame)" -msgstr "Vận tốc cho sự ản hưởng cực đại (đơn vị Blender mỗi bức ảnh)" +msgstr "Vận tốc gây ra ảnh hưởng tối đa (đơn vị Blender / khung hình)" msgid "Velocity Color Ramp" @@ -9826,15 +10663,15 @@ msgstr "Dốc Màu Vận Tốc" msgid "Color ramp used to define brush velocity effect" -msgstr "Dốc màu dùng cho chỉ định hiện ứng vận tốc bút" +msgstr "Dốc màu dùng để xác định hiệu ứng vận tốc của bút sơn" msgid "Clamp Waves" -msgstr "Kẹp Lại Sóng" +msgstr "Hạn Định Sóng" msgid "Maximum level of surface intersection used to influence waves (use 0.0 to disable)" -msgstr "Mức cực đại cho giao cắt bề mặt để ảnh hưởng sóng (đặt = 0.0 để tắt)" +msgstr "Mức tối đa sự giao cắt bề mặt sử dụng để tác động các con sóng (đặt = 0.0 để tắt)" msgid "Factor" @@ -9842,19 +10679,44 @@ msgstr "Hệ Số" msgid "Multiplier for wave influence of this brush" -msgstr "Giá trị nhân với sự ảnh hưởng của sóng cho bút này" +msgstr "Số nhân cho ảnh hưởng sóng của đầu bút này" + + +msgctxt "Simulation" +msgid "Wave Type" +msgstr "Loại Sóng" + + +msgctxt "Simulation" +msgid "Depth Change" +msgstr "Thay Đổi Độ Sâu" + + +msgctxt "Simulation" +msgid "Obstacle" +msgstr "Trở Ngại Vật" + + +msgctxt "Simulation" +msgid "Force" +msgstr "Lực" + + +msgctxt "Simulation" +msgid "Reflect Only" +msgstr "Duy Phản Hồi" msgid "Canvas Settings" -msgstr "Cài Đặt Mặt Sơn" +msgstr "Sắp Đặt của Toan" msgid "Dynamic Paint canvas settings" -msgstr "Cài đặt mặt sơn cho Sơn Động Lý" +msgstr "Sắp đặt của mặt khung vẽ Sơn Động Lực" msgid "Paint Surface List" -msgstr "Danh Sách Bề Mặt Sơn" +msgstr "Danh Sách Mặt Sơn" msgid "Paint surface list" @@ -9866,99 +10728,99 @@ msgstr "Bề Mặt Sơn" msgid "A canvas surface layer" -msgstr "Một lớp mặt sơn" +msgstr "Một tầng bề mặt khung vẽ" msgid "Brush Collection" -msgstr "Sưu Tập Bút" +msgstr "Bộ Sưu Tập Đầu Bút" msgid "Only use brush objects from this collection" -msgstr "Chỉ sử dụng vật thể bút từ sưu tập này" +msgstr "Chỉ sử dụng những đối tượng đầu bút từ bộ sưu tập này mà thôi" msgid "Influence Scale" -msgstr "Phóng To Sự Ảnh Hưởng" +msgstr "Tỷ Lệ Ảnh Hưởng" msgid "Adjust influence brush objects have on this surface" -msgstr "Chỉnh sự ảnh hướng của vật thể bút với bề mặt này" +msgstr "Điều chỉnh ảnh hưởng của các đối tượng đầu bút trên mặt này" msgid "Radius Scale" -msgstr "Phóng To Bán Kính" +msgstr "Tỷ Lệ Bán Kính" msgid "Adjust radius of proximity brushes or particles for this surface" -msgstr "Chỉnh bán kính cách xa của bút hay hạt cho bề mặt này" +msgstr "Điều chỉnh bán kính của các hạt hoặc các đầu bút lân cận đối với mặt này" msgid "Color Dry" -msgstr "Phơi Khô Màu" +msgstr "Độ Khô của Màu" msgid "The wetness level when colors start to shift to the background" -msgstr "Mức độ ướt khi màu bắt đầu phai đến màu nền" +msgstr "Mức độ ướt khi các màu bắt đầu chuyển sang màu nền" msgid "Color Spread" -msgstr "Lan Màu" +msgstr "Mức Lan Tỏa Màu" msgid "How fast colors get mixed within wet paint" -msgstr "Tốc độ màu được pha trộn với nước sơn ướt" +msgstr "Tốc độ các màu được pha trộn trong sơn ướt" msgid "Max Displace" -msgstr "Dịch Cực Đại" +msgstr "Độ Dời Hình Tối Đa" msgid "Maximum level of depth intersection in object space (use 0.0 to disable)" -msgstr "Độ sâu giao cắt cực đại trong không gian vật thể (tắt nếu đặt = 0.0)" +msgstr "Chiều sâu giao cắt tối đa trong không gian đối tượng (tắt nếu đặt = 0.0)" msgid "Displace Factor" -msgstr "Hệ Số Dịch" +msgstr "Hệ Số Dời Hình" msgid "Strength of displace when applied to the mesh" -msgstr "Sức dịch khi áp dụng với mạng lưới" +msgstr "Mức độ dời hình khi áp dụng vào khung lưới" msgid "Displacement" -msgstr "Dịch" +msgstr "Dời Hình" msgid "Dissolve Time" -msgstr "Thời Gian Hòa Tan" +msgstr "Thời Gian Tiêu Hủy" msgid "Approximately in how many frames should dissolve happen" -msgstr "Khoảng bao nhiêu bức ảnh cho hoàn thành hòa tan" +msgstr "Ước chừng ảnh hưởng tiêu hủy sẽ xảy ra trong bao nhiêu khung hình" msgid "Acceleration" -msgstr "Gia Tốc" +msgstr "Tăng Tốc" msgid "How much surface acceleration affects dripping" -msgstr "Mức gia tốc bề mặt được ảnh hưởng nhiểu" +msgstr "Lượng tăng tốc bề mặt ảnh hưởng tới sự nhỏ giọt" msgid "Velocity" -msgstr "Vận Tốc" +msgstr "Tốc Lực" msgid "How much surface velocity affects dripping" -msgstr "Mức vận tốc bề mặt được ảnh hưởng nhiểu" +msgstr "Lượng vận tốc bề mặt ảnh hưởng tới sự nhỏ giọt" msgid "Dry Time" -msgstr "Thời Gian Phơi Khô" +msgstr "Thời Gian Khô" msgid "Approximately in how many frames should drying happen" -msgstr "Khoảng bao nhiêu bức ảnh cho hoàn thành phơi khô" +msgstr "Ước chừng trong bao nhiêu khung hình hiệu ứng sơn bị khô sẽ xảy ra" msgid "Effect Type" @@ -9966,31 +10828,31 @@ msgstr "Loại Hiệu Ứng" msgid "Spread" -msgstr "Lan" +msgstr "Mức Lan Tỏa" msgid "Drip" -msgstr "Nhiểu" +msgstr "Nhỏ Giọt" msgid "Shrink" -msgstr "Thu Nhỏ" +msgstr "Thu Nhỏ/Co Lại" msgid "Simulation end frame" -msgstr "Bức ảnh cuối cho mô phỏng" +msgstr "Khung hình mô phỏng chấm dứt" msgid "Simulation start frame" -msgstr "Bức ảnh đầu cho mô phỏng" +msgstr "Khung hình mô phỏng bắt đầu" msgid "Sub-Steps" -msgstr "Hạ Bước" +msgstr "Số Phân Bước" msgid "Do extra frames between scene frames to ensure smooth motion" -msgstr "Dùng bức ảnh thêm giữa bức ảnh cảnh cho chắc được chuyển động nhiển" +msgstr "Tạo các khung hình bổ sung giữa các khung hình của cảnh để đảm bảo sự uyển chuyển của chuyển động" msgid "File Format" @@ -10006,11 +10868,11 @@ msgstr "OpenEXR" msgid "Output Path" -msgstr "Đường Dẫn Xuất" +msgstr "Đường Dẫn Đầu Ra" msgid "Directory to save the textures" -msgstr "Thư mục cho lưu chất liệu" +msgstr "Thư mục để lưu các chất liệu" msgid "Resolution" @@ -10018,15 +10880,15 @@ msgstr "Độ Phân Giải" msgid "Output image resolution" -msgstr "Độ Phân giải ảnh xuất" +msgstr "Độ phân giải của hình ảnh cho xuất" msgid "Initial color of the surface" -msgstr "Màu khởi động của bề mặt" +msgstr "Màu khởi đầu của bề mặt" msgid "Initial Color" -msgstr "Màu Khởi Động" +msgstr "Màu Khởi Đầu" msgid "UV Texture" @@ -10034,7 +10896,7 @@ msgstr "Chất Liệu UV" msgid "Data Layer" -msgstr "Lớp Dữ Liệu" +msgstr "Tầng Dữ Liệu" msgid "Texture" @@ -10042,15 +10904,15 @@ msgstr "Chất Liệu" msgid "Is Active" -msgstr "Là Hoạt Động" +msgstr "Đang Hoạt Động" msgid "Toggle whether surface is processed or ignored" -msgstr "Bật/tắt bề mặt được xử lý hay không" +msgstr "Bật/Tắt giữa việc xử lý bề mặt hay bỏ qua" msgid "Use Cache" -msgstr "Dùng Đệm Chứa" +msgstr "Dùng Bộ Nhớ Đệm" msgid "Surface name" @@ -10058,15 +10920,15 @@ msgstr "Tên bề mặt" msgid "Output Name" -msgstr "Tên Ngõ Ra" +msgstr "Tên Xuất" msgid "Name used to save output from this surface" -msgstr "Tên cho lưu ngõ ra từ bề mặt này" +msgstr "Tên sử dụng để lưu kết quả xuất của bề mặt này" msgid "Point Cache" -msgstr "Đệm Chứa Điểm" +msgstr "Bộ Nhớ Đệm Điểm" msgid "Shrink Speed" @@ -10074,19 +10936,19 @@ msgstr "Tốc Độ Thu Nhỏ" msgid "How fast shrink effect moves on the canvas surface" -msgstr "Tốc độ hiệu ứng thu nhỏ được di chuyển trên bề mặt mặt sơn" +msgstr "Tốc độ hiệu ứng co lại di chuyển trên mặt khung vẽ" msgid "Spread Speed" -msgstr "Tốc Độ Lan" +msgstr "Tốc Độ Lan Tỏa" msgid "How fast spread effect moves on the canvas surface" -msgstr "Tốc độ di chuyển của hiệu ứng lan rộng trên bề mặt mặt sơn" +msgstr "Tốc độ di chuyển của hiệu ứng lan tỏa trên mặt khung vẽ" msgid "Format" -msgstr "Định Dạng" +msgstr "Định Dạng/Hình Thức" msgid "Surface Format" @@ -10094,11 +10956,11 @@ msgstr "Định Dạng Bề Mặt" msgid "Vertex" -msgstr "Đỉnh" +msgstr "Điểm Đỉnh" msgid "Image Sequence" -msgstr "Trình Tự Ảnh" +msgstr "Trình Tự Hình Ảnh" msgid "Surface Type" @@ -10113,8 +10975,12 @@ msgid "Anti-Aliasing" msgstr "Khử Răng Cưa" +msgid "Use 5× multisampling to smooth paint edges" +msgstr "Sử dụng tính năng lấy mẫu đa điểm 5× để làm mịn các cạnh sơn vẽ" + + msgid "Enable to make surface changes disappear over time" -msgstr "Bật để làm biến đổi của bề mặt biến mất qua thời gian" +msgstr "Cho phép sự thay đổi bề mặt biến mất sau một khoảng thời gian" msgid "Slow" @@ -10122,135 +10988,135 @@ msgstr "Chậm" msgid "Use logarithmic dissolve (makes high values to fade faster than low values)" -msgstr "Dùng hòa tan hàn hàm số log (cho làm giá trị cao phai lẹ hơn giá trị thấp)" +msgstr "Sử dụng lôgarit tiêu hủy (khiến các giá trị cao phai nhạt nhanh hơn các giá trị thấp)" msgid "Use Drip" -msgstr "Dùng Nhiểu" +msgstr "Chảy Nhỏ Giọt" msgid "Process drip effect (drip wet paint to gravity direction)" -msgstr "Áp dụng hiệu ứng nhiểu (cho nước sơn ướt nhiểu theo hướng hấp dẫn)" +msgstr "Xử lý hiệu ứng chảy nhỏ giọt (nhỏ giọt sơn ướt theo chiều hướng của trọng lực)" msgid "Use logarithmic drying (makes high values to dry faster than low values)" -msgstr "Dùng phơi khô hàm số log (cho giá trị cao phơi khô lẹ hơn giá trị thấp)" +msgstr "Sử dụng lôgarit làm khô (khiến các giá trị cao khô nhanh hơn các giá trị thấp)" msgid "Dry" -msgstr "Phơi Khô" +msgstr "Khô" msgid "Enable to make surface wetness dry over time" -msgstr "Bật làm bề mặt phơi khô qua thời gian" +msgstr "Cho bật lên để khiến bề mặt ướt khô đi sau một khoảng thời gian" msgid "Incremental" -msgstr "Từ Bước" +msgstr "Tăng Dần" msgid "New displace is added cumulatively on top of existing" -msgstr "Cộng dịch mới với dịch có sẵn" +msgstr "Độ dời hình mới được thêm vào ảnh hưởng đã có" msgid "Use Output" -msgstr "Dùng Ngõ Ra" +msgstr "Sử Dụng Đầu Ra" msgid "Save this output layer" -msgstr "Lưu lớp ngõ ra này" +msgstr "Lưu tầng đầu ra này" msgid "Premultiply Alpha" -msgstr "Nhân Trược Độ Đục" +msgstr "Nhân Trước Alpha" msgid "Multiply color by alpha (recommended for Blender input)" -msgstr "Nhân màu với độ đục (nên làm cho ngõ vào Blender)" +msgstr "Nhân màu với alpha (khuyến nghị cho đầu vào Blender)" msgid "Use Shrink" -msgstr "Dùng Thu Nhỏ" +msgstr "Sử Dụng Thu Nhỏ" msgid "Process shrink effect (shrink paint areas)" -msgstr "Quá trình hiệu ứng thu nhỏ (rút nhỏ khu vực được sơn)" +msgstr "Xử lý hiệu ứng thu nhỏ (co các vùng nước sơn lại)" msgid "Use Spread" -msgstr "Dùng Lan" +msgstr "Lan Tỏa" msgid "Process spread effect (spread wet paint around surface)" -msgstr "Quá trình hiệu ứng lan (tốc độ lan sơn ướt trên bề mặt)" +msgstr "Xử lý hiệu ứng lan tỏa (lan tỏa sơn ướt trên bề mặt)" msgid "Open Borders" -msgstr "Ranh Giới Mở" +msgstr "Mở Ranh Giới" msgid "Pass waves through mesh edges" -msgstr "Sóng có thể xuyên qua cạnh mạng lưới" +msgstr "Trào sóng qua các cạnh của khung lưới" msgid "UV Map" -msgstr "Bản Đồ UV" +msgstr "Ánh Xạ UV" msgid "UV map name" -msgstr "Tên bản đồ UV" +msgstr "Tên ánh xạ UV" msgid "Wave damping factor" -msgstr "Hệ số tắt dần sóng" +msgstr "Hệ số giảm chấn sóng" msgid "Smoothness" -msgstr "Độ Mịn" +msgstr "Độ Mịn Màng/Mềm Mại" msgid "Limit maximum steepness of wave slope between simulation points (use higher values for smoother waves at expense of reduced detail)" -msgstr "Hạn chế dốc cực đại của sóng giữa điểm mô phỏng (giá trị càng cao càng mịn nhưng càng mất chi tiết)" +msgstr "Hạn chế độ dốc dựng đứng của thân sóng giữa các điểm mô phỏng (dùng những giá trị cao hơn để sóng được mịn hơn, song chi tiết sẽ bị thuyên giảm)" msgid "Wave propagation speed" -msgstr "Tốc độ di chuyển của sóng" +msgstr "Tốc độ lan truyền của sóng" msgid "Spring" -msgstr "Lò Xo" +msgstr "Đàn Hồi" msgid "Spring force that pulls water level back to zero" -msgstr "Lực lò xo được kéo mức nước trở lại số không" +msgstr "Lực đàn hồi kéo mức nước quay trở lại số không" msgid "Timescale" -msgstr "Quy Mô Thời Gian" +msgstr "Thời Gian" msgid "Wave time scaling factor" -msgstr "Hệ số quy mô thời gian sóng" +msgstr "Hệ số thời gian mô phỏng làn sóng" msgid "Canvas Surfaces" -msgstr "Bề Mặt Mặt Sơn" +msgstr "Bề Khung Vẽ" msgid "Collection of Dynamic Paint Canvas surfaces" -msgstr "Sưu tập bề mặt Mặt Sơn Động Lý" +msgstr "Bộ sưu tập các bề mặt Khung Vẽ Sơn Động Lực" msgid "Active Surface" -msgstr "Bề Mặt Hoạt Động" +msgstr "Bề Mặt đang Hoạt Động" msgid "Active Dynamic Paint surface being displayed" -msgstr "Bề Mặt Sơn Động Lý Hoạt Động đang hiển thị" +msgstr "Bề mặt Sơn Động Lực đang Hoạt Động hiện được hiển thị" msgid "Active Point Cache Index" -msgstr "Chỉ Số Đệm Chứa Điểm Hoạt Động" +msgstr "Chỉ Số Bộ Nhớ Đệm Điểm đang Hoạt Động" msgid "Curve Mapping" @@ -10258,11 +11124,11 @@ msgstr "Ánh Xạ Đường Cong" msgid "Edit Bone" -msgstr "Biên Tập Xương" +msgstr "Xương Biên Soạn" msgid "Edit mode bone in an armature data-block" -msgstr "Chế độ biên tập xương trong một cục dữ liệu cốt" +msgstr "Xương ở chế độ biên soạn trong một khối dữ liệu khung cốt" msgid "Location of head end of the bone" @@ -10270,27 +11136,27 @@ msgstr "Vị trí của đầu xương" msgid "Bone is not visible when in Edit Mode" -msgstr "Xương không hiện trong Chế Độ Biên Tập" +msgstr "Xương sẽ vô hình trong Chế Độ Biên Soạn" msgid "Length of the bone. Changing moves the tail end" -msgstr "Bề dài của xương. Đổi giá trị này sẽ di chuyển đuôi của nó" +msgstr "Chiều dài của xương. Thay đổi để di chuyển đầu cuối của đuôi" msgid "Bone is not able to be transformed when in Edit Mode" -msgstr "Không thể biến hóa xương trong chế độ Biên Tập" +msgstr "Xương sẽ không thể biến hóa trong Chế Độ Biên Soạn" msgid "Edit Bone Matrix" -msgstr "Biên Tập Xương Ma Trận" +msgstr "Ma Trận Xương Biên Soạn" msgid "Matrix combining location and rotation of the bone (head position, direction and roll), in armature space (does not include/support bone's length/size)" -msgstr "Ma trận gồm vị trí/xoay của xương (vị trí đầu, hướng và lăn), trong không gian cốt (không gồm/hỗ trợ bề dài/cỡ xương)" +msgstr "Ma trận kết hợp cả hai thông tin: vị trí và xoay chiều của xương (vị trí của đầu, chiều hướng, và độ lăn), trong không gian khung cốt (không bao gồm/hỗ trợ chiều dài/kích cỡ của xương)" msgid "Parent edit bone (in same Armature)" -msgstr "Xương phụ huynh biên tập (trong cùng Cốt)" +msgstr "Xương phụ huynh biên soạn (trong cùng một Khung Cốt)" msgid "Roll" @@ -10298,35 +11164,35 @@ msgstr "Lăn" msgid "Bone rotation around head-tail axis" -msgstr "Xoay xương quanh trục đầu-đuôi" +msgstr "Sự xoay chiều của xương quanh trục đầu-đuôi" msgid "Head Select" -msgstr "Chọn Đầu" +msgstr "Đầu được Chọn" msgid "Tail Select" -msgstr "Chọn Đuôi" +msgstr "Đuôi được Chọn" msgid "Location of tail end of the bone" -msgstr "Vị trí của đỉnh đuôi xương" +msgstr "Vị trí đỉnh đuôi của xương" msgid "Effector weights for physics simulation" -msgstr "Quyền lượng đồ hiệu ứng cho mô phỏng vật lý" +msgstr "Trọng lượng của hiệu ứng viên trong mô phỏng vật lý" msgid "All effector's weight" -msgstr "Tất cả quyền lượng của đồ hiệu ứng" +msgstr "Trọng lượng của toàn bộ hiệu ứng viên" msgid "Use For Growing Hair" -msgstr "Sử dụng cho mọc tốc" +msgstr "Dùng để Mọc Tóc" msgid "Use force fields when growing hair" -msgstr "Dùng lực trường khi móc tóc" +msgstr "Sử dụng trường lực khi làm tóc mọc ra" msgid "Boid" @@ -10334,7 +11200,7 @@ msgstr "Quần Thể" msgid "Boid effector weight" -msgstr "Quyền lượng đồ hiệu ứng quần thể" +msgstr "Trọng lượng của hiệu ứng viên quần thể" msgid "Charge" @@ -10342,31 +11208,31 @@ msgstr "Điện Tích" msgid "Charge effector weight" -msgstr "Quyền lượng đồ hiệu ứng điện tích" +msgstr "Trọng lượng của hiệu ứng viên điện tích" msgid "Effector Collection" -msgstr "Sưu Tập Đồ Hiệu Ứng" +msgstr "Bộ Sưu Tập Hiệu Ứng Viên" msgid "Limit effectors to this collection" -msgstr "Hạn chế đồ hiệu ứng chỉ được tác dụng trong sưu tập này" +msgstr "Giới hạn hoạt động của các hiệu ứng viên trong bộ sưu tập này mà thôi" msgid "Curve Guide" -msgstr "Đường Cong Dẫn" +msgstr "Hướng Đạo theo Đường Cong" msgid "Curve guide effector weight" -msgstr "Quyền lượng đồ hiệu ứng đường cong dẫn" +msgstr "Trọng lượng của hiệu ứng viên hướng đạo theo đường cong" msgid "Drag" -msgstr "Lực Cản" +msgstr "Lực Cản/Kéo Rê" msgid "Drag effector weight" -msgstr "Quyền lượng đồ hiệu ứng lực cản" +msgstr "Trọng lượng của hiệu ứng viên lực cản" msgid "Force" @@ -10374,19 +11240,19 @@ msgstr "Lực" msgid "Force effector weight" -msgstr "Quyền lượng đồ hiệu ứng lực" +msgstr "Trọng lượng của hiệu ứng viên lực đẩy" msgid "Global gravity weight" -msgstr "Nặng lượng hấp dẫn toàn cầu" +msgstr "Trọng lượng của trọng lực toàn cầu" msgid "Harmonic" -msgstr "Điều Hòa" +msgstr "Giao Động Điều Hòa" msgid "Harmonic effector weight" -msgstr "Quyền lượng đồ hiệu ứng điều hòa" +msgstr "Trọng lượng của hiệu ứng viên điều hòa" msgid "Lennard-Jones" @@ -10394,43 +11260,43 @@ msgstr "Lennard-Jones" msgid "Lennard-Jones effector weight" -msgstr "Quyền lượng hiệu ứng Lennard-Jones" +msgstr "Trọng lượng của hiệu ứng viên Lennard-Jones" msgid "Magnetic" -msgstr "Từ Trường" +msgstr "Nam Châm" msgid "Magnetic effector weight" -msgstr "Quyền lượng đồ hiệu ứng từ trường" +msgstr "Trọng lượng của hiệu ứng viên nam châm" msgid "Fluid Flow" -msgstr "Luồng Chất Lỏng" +msgstr "Dòng Chảy Chất Lỏng" msgid "Fluid Flow effector weight" -msgstr "Quyền lượng cho đồ hiệu ứng Luồng Chất Lỏng" +msgstr "Trọng lượng của hiệu ứng viên Dòng Chảy Chất Lỏng" msgid "Texture effector weight" -msgstr "Quyền lượng đồ hiệu ứng chất liệu" +msgstr "Trọng lượng của hiệu ứng viên chất liệu" msgid "Turbulence" -msgstr "Nhiễu Loạn" +msgstr "Hỗn Loạn" msgid "Turbulence effector weight" -msgstr "Quyền lượng đồ hiệu ứng nhiễu loạn" +msgstr "Trọng lượng của hiệu ứng viên hỗn loạn" msgid "Vortex" -msgstr "Cơn Lốc" +msgstr "Lốc Xoáy" msgid "Vortex effector weight" -msgstr "Quyền lượng đồ hiệu ứng cơn lốc" +msgstr "Trọng lượng của hiệu ứng viên lốc xoáy" msgid "Wind" @@ -10438,43 +11304,43 @@ msgstr "Gió" msgid "Wind effector weight" -msgstr "Quyền lượng đồ hiệu ứng gió" +msgstr "Trọng lượng của hiệu ứng viên gió thổi" msgid "Enum Item Definition" -msgstr "Định Nghĩa Mặt Hàng Liệt Kê" +msgstr "Định Nghĩa Phần Tử Liệt Kê" msgid "Definition of a choice in an RNA enum property" -msgstr "Định nghĩa của một sự lựa chọn trong đặc tính liệt kê RNA" +msgstr "Định nghĩa lựa chọn trong tính chất của liệt kê RNA" msgid "Description of the item's purpose" -msgstr "Chính tả cho sử dụng của mặt hàng" +msgstr "Miêu tả mục đích của phần tử" msgid "Identifier" -msgstr "Tên Đặc Biệt" +msgstr "Định Danh" msgid "Unique name used in the code and scripting" -msgstr "Tên độc đáo được dùng trong mã nguồn và văn thảo" +msgstr "Danh hiệu đặc trưng sử dụng trong việc biên soạn mã và viết tập lệnh" msgid "Human readable name" -msgstr "Tên cho con người đọc" +msgstr "Danh hiệu mà người thường có thể đọc được" msgid "Value of the item" -msgstr "Giá trị của mặt hàng" +msgstr "Giá trị của phần tử" msgid "F-Curve" -msgstr "Cong F" +msgstr "Đường Cong-F" msgid "F-Curve defining values of a period of time" -msgstr "Cong F cho chỉ định một đoạn thời gian" +msgstr "Đường Cong-F để xác định các giá trị của một khoảng thời gian" msgid "RNA Array Index" @@ -10482,71 +11348,71 @@ msgstr "Chỉ Số Mảng RNA" msgid "Index to the specific property affected by F-Curve if applicable" -msgstr "Chỉ số đến đặc tính xác định được bị ảnh hưởng bởi Cong F, nếu có áp dụng" +msgstr "Chỉ số dành cho tính chất nào đó bị ảnh hưởng bởi Đường Cong-F, nếu có" msgid "Auto Handle Smoothing" -msgstr "Mịn Hóa Tay Cầm Tự Động" +msgstr "Tự Động Làm Mịn Tay Cầm" msgid "Algorithm used to compute automatic handles" -msgstr "Giải thuật để tính tay cầm tự động" +msgstr "Thuật toán sử dụng để tính toán các tay cầm tự động" msgid "Automatic handles only take immediately adjacent keys into account" -msgstr "Tay cầm tự động chỉ quan tâm các bức ảnh mẫu kề" +msgstr "Các tay cầm tự động chỉ quan tâm đến các khung khóa nằm sát bên cạnh mà thôi" msgid "Continuous Acceleration" -msgstr "Giá Tốc Liên Tiếp" +msgstr "Tăng Tốc Liên Tục" msgid "Automatic handles are adjusted to avoid jumps in acceleration, resulting in smoother curves. However, key changes may affect interpolation over a larger stretch of the curve" -msgstr "Tay cầm tự động được chỉnh để tránh làm gia tốc nhảy, kết qủa là đường cong mịn hơn. Nhưng, đổi bức ảnh mẫu có thể mở rộng sự ảnh hưởng của suy nội trên một khúc đường cong" +msgstr "Các tay cầm tự động sẽ được điều chỉnh để tránh tình trạng nẩy lên trong khi tăng tốc, tạo nên đường cong mịn màng hơn. Tuy nhiên, những thay đổi về khung khóa có thể ảnh hưởng đến sự nội suy trên khoảng cách lớn của đường cong" msgid "Color of the F-Curve in the Graph Editor" -msgstr "Màu của Cong-F trong Biên Tập Biều Đồ" +msgstr "Màu của Đường Cong-F trong Trình Biên Soạn Đồ Thị" msgid "Method used to determine color of F-Curve in Graph Editor" -msgstr "Phương pháp sử dụng để xác định màu của Cong F trong Biên Tập Biểu Đồ" +msgstr "Phương pháp cho xác định màu của Đường Cong-F trong Trình Biên Soạn Đồ Thị" msgid "Auto Rainbow" -msgstr "Cầu Vòng Tự Động" +msgstr "Tự Động Cầu Vồng Hóa" msgid "Cycle through the rainbow, trying to give each curve a unique color" -msgstr "Vòng quanh màu cầu vòng, thử cho mỗi đường cong một màu độc đáo" +msgstr "Tuần hoàn qua các màu của cầu vồng và thử gán một màu riêng biệt cho mỗi đường cong" msgid "Auto XYZ to RGB" -msgstr "Tự động XYZ đến RGB" +msgstr "Tự Động XYZ Sang RGB" msgid "Use axis colors for transform and color properties, and auto-rainbow for the rest" -msgstr "Dùng màu trục cho biến hóa và đặc tính màu, còn màu cầu vòng tự động cho các đường cong còn lại" +msgstr "Dùng những màu sắc của trục cho biến hóa và các tính chất màu sắc, rồi tự động cầu vồng hóa đối với những cái còn lại" msgid "Auto WXYZ to YRGB" -msgstr "Tự động WXYZ sang YRGB" +msgstr "Tự Động WXYZ Sang YRGB" msgid "Use axis colors for XYZ parts of transform, and yellow for the 'W' channel" -msgstr "Dùng màu trục cho thành phần XYZ của biến hóa, và màu vàng cho kênh 'W'" +msgstr "Dùng những màu sắc của trục cho các phần XYZ trong biến hóa, và màu vàng cho kênh 'W'" msgid "User Defined" -msgstr "Người Dùng Được Chỉ Định" +msgstr "Người Dùng Định Nghĩa" msgid "Use custom hand-picked color for F-Curve" -msgstr "Dùng màu tùy chọn cho Cong-F" +msgstr "Dùng màu tùy chọn cho Đường Cong-F" msgid "RNA Path to property affected by F-Curve" -msgstr "Đặc tính RNA bị ảnh hưởng bởi Cong-F" +msgstr "Đường dẫn RNA tới tính chất bị ảnh hưởng bởi Đường Cong-F" msgid "Driver" @@ -10554,23 +11420,23 @@ msgstr "Điều Vận" msgid "Channel Driver (only set for Driver F-Curves)" -msgstr "Điều Vận Kênh (chỉ đặt cho Điều Vận Cong-F)" +msgstr "Điều Vận Kênh (chỉ đặt cho các Đường Cong-F Điều Vận mà thôi)" msgid "Extrapolation" -msgstr "Suy Ngoại" +msgstr "Ngoại Suy" msgid "Method used for evaluating value of F-Curve outside first and last keyframes" -msgstr "Phương pháp cho tính toán giá trị Cong F ở ngoài bức ảnh mẫu đầu và cuối" +msgstr "Phương pháp sử dụng để ước tính giá trị của Đường Cong-F ở khoảng ngoài các khung khóa đầu tiên và cuối cùng" msgid "Hold values of endpoint keyframes" -msgstr "Giữ giá trị của bức ảnh mẫu cuối cùng" +msgstr "Giữ nguyên các giá trị của khung khóa tại điểm đầu/cuối" msgid "Use slope of curve leading in/out of endpoint keyframes" -msgstr "Dùng dốc của đường cong dẫn vào/ra bức mỗu điểm kết thúc" +msgstr "Dùng độ dốc của đường cong dẫn dắt vào/ra khung khóa ở điểm đầu/cuối" msgid "Group" @@ -10578,31 +11444,31 @@ msgstr "Nhóm" msgid "Action Group that this F-Curve belongs to" -msgstr "Nhóm Hành Động Nào được sở hữu Cong-F này" +msgstr "Nhóm hành động mà Đường Cong-F này trực thuộc" msgid "F-Curve and its keyframes are hidden in the Graph Editor graphs" -msgstr "Ẳn Cong-F và bức ảnh mẫu của nó được ẩn trong biểu đồ của Trình Biên Soạn Biển Đồ" +msgstr "Đường Cong-F và những khung khóa của nó được ẩn giấu trong các đồ thị của Trình Biên Soạn Đồ Thị" msgid "True if the curve contributes no animation due to lack of keyframes or useful modifiers, and should be deleted" -msgstr "Đúng nếu đường cong không góp phần hoạt hình nào vì thiếu bức ảnh mẫu hay bộ điều chỉnh được áp dụng, và nên bị xóa" +msgstr "Đúng nếu đường cong không đóng góp gì về hoạt họa cả, do thiếu các khung khóa, hoặc các bộ điều chỉnh có ích, và đáng phải được xóa đi" msgid "False when F-Curve could not be evaluated in past, so should be skipped when evaluating" -msgstr "Sai khi không thể tính toán Cong-F trong qua khư, và nên bỏ qua nó khi tính toán" +msgstr "Sai khi không thể đánh giá Đường Cong-F trong qua khứ và nên bỏ qua khi đánh giá" msgid "Keyframes" -msgstr "Bức Ảnh Mẫu" +msgstr "Số/Khung Khóa" msgid "User-editable keyframes" -msgstr "Bức ảnh mẫu người dùng có thể biên tập" +msgstr "Khung khóa người dùng có thể biên soạn" msgid "F-Curve's settings cannot be edited" -msgstr "Không thể biên tập cài đật của Cong-F" +msgstr "Sắp đặt của Đường Cong-F không thể biên soạn được" msgid "Modifiers" @@ -10610,55 +11476,55 @@ msgstr "Bộ Điều Chỉnh" msgid "Modifiers affecting the shape of the F-Curve" -msgstr "Bộ điều chỉnh được ảnh hưởng hình dạng của Cong-F" +msgstr "Bộ điều chỉnh ảnh hưởng hình dạng của Đường Cong-F" msgid "Muted" -msgstr "Không Tính Tóan" +msgstr "Đã Chặn Âm Thanh" msgid "Disable F-Curve evaluation" -msgstr "Tắt tính toán Bộ Điều Chỉnh Cong-F" +msgstr "Tắt sự đánh giá Đường Cong-F" msgid "Sampled Points" -msgstr "Điểm Mẫu Vật" +msgstr "Điểm Đã Lấy Mẫu" msgid "Sampled animation data" -msgstr "Mẫu vật dữ liệu hoạt hình" +msgstr "Dữ liệu hoạt họa đã lấy mẫu" msgid "F-Curve is selected for editing" -msgstr "Cong-F được chọn cho biên tập" +msgstr "Đường Cong-F đã được chọn để biên soạn" msgid "Keyframe Points" -msgstr "Điểm Bức Ảnh Mẫu" +msgstr "Điểm của Khung Khóa" msgid "Collection of keyframe points" -msgstr "Sưu tập điểm bức ảnh mẫu" +msgstr "Bộ sưu tập các điểm của khung khóa" msgid "F-Curve Modifiers" -msgstr "Cụ Sửu Đổi Cong-F" +msgstr "Bộ Điều Chỉnh Đường Cong-F" msgid "Collection of F-Curve Modifiers" -msgstr "Sưu Tập Bộ Điều Chỉnh Cong-F" +msgstr "Bộ Sưu Tập Bộ Điều Chỉnh Đường Cong-F" msgid "Active F-Curve Modifier" -msgstr "Bộ Điều Chỉnh Cong-F Hoạt Động" +msgstr "Bộ Điều Chỉnh Đường Cong-F đang Hoạt Động" msgid "F-Curve Sample" -msgstr "Mẫu Vật Cong-F" +msgstr "Mẫu Vật Đường Cong-F" msgid "Sample point for F-Curve" -msgstr "Điểm mẫu vật cho đường Cong-F" +msgstr "Điểm mẫu vật cho Đường Cong-F" msgid "Point coordinates" @@ -10666,23 +11532,23 @@ msgstr "Tọa độ điểm" msgid "Selection status" -msgstr "Trạng Thái Sự Lựa Chọn" +msgstr "Trạng thái lựa chọn" msgid "FFmpeg Settings" -msgstr "Cài Đặt FFmpeg" +msgstr "Sắp Đặt FFmpeg" msgid "FFmpeg related settings for the scene" -msgstr "Cài đặt cho FFmpeg của cảnh" +msgstr "Sắp đặt liên quan đến FFmpeg dành cho cảnh" msgid "Bitrate" -msgstr "Tốc Độ Bit" +msgstr "Tần Số Bit" msgid "Audio bitrate (kb/s)" -msgstr "Tốc độ âm thanh (kb/giây)" +msgstr "Tần số bit âm thanh (kb/giây)" msgid "Audio Channels" @@ -10690,23 +11556,23 @@ msgstr "Kênh Âm Thanh" msgid "Audio channel count" -msgstr "Sô lượng kênh âm thanh" +msgstr "Số kênh âm thanh" msgid "Mono" -msgstr "Độc Kênh" +msgstr "Đơn Kênh" msgid "Set audio channels to mono" -msgstr "Đổi các kênh âm thanh thành đọc kênh" +msgstr "Đổi các kênh âm thanh thành đơn kênh (mono)" msgid "Set audio channels to stereo" -msgstr "Đổi kênh âm thanh thành stereo (nhị kênh)" +msgstr "Đổi các kênh âm thanh thành lập thể (stereo)" msgid "4 Channels" -msgstr "4 kênh" +msgstr "4 Kênh" msgid "Set audio channels to 4 channels" @@ -10714,19 +11580,19 @@ msgstr "Đổi các kênh âm thanh thành 4 kênh" msgid "5.1 Surround" -msgstr "5.1 Xung Quanh" +msgstr "Vòm 5.1" msgid "Set audio channels to 5.1 surround sound" -msgstr "Đổi kênh âm thanh thành âm thanh 5.1 xung quanh" +msgstr "Đổi các kênh âm thanh thành 5.1 âm thanh vòm" msgid "7.1 Surround" -msgstr "7.1 Xung Quanh" +msgstr "Vòm 7.1" msgid "Set audio channels to 7.1 surround sound" -msgstr "Đổi kênh âm thanh thành âm thanh 7.1 xung quanh" +msgstr "Đổi các kênh âm thanh thành 7.1 âm thanh vòm" msgid "Audio Codec" @@ -10734,7 +11600,7 @@ msgstr "Bộ Hóa Giải Mã Âm Thanh" msgid "FFmpeg audio codec to use" -msgstr "Dùng bộ hóa giải mã FFmpeg nào" +msgstr "Bộ hóa giải mã âm thanh FFmpeg để sử dụng" msgid "No Audio" @@ -10742,7 +11608,7 @@ msgstr "Không Có Âm Thanh" msgid "Disables audio output, for video-only renders" -msgstr "Tắt ngõ ra âm thanh, chỉ sử dụng khi chỉ kết xuất video" +msgstr "Tắt luồng âm thanh, để chỉ kết xuất phim video mà thôi" msgid "AAC" @@ -10778,7 +11644,11 @@ msgstr "Vorbis" msgid "Sample Rate" -msgstr "Tốc Độ Mẫu Vật" +msgstr "Tấn Số Mẫu" + + +msgid "Audio sample rate (samples/s)" +msgstr "Tốc độ lấy mẫu âm thanh (số mẫu vật/giây)" msgctxt "Sound" @@ -10787,23 +11657,23 @@ msgstr "Âm Lượng" msgid "Audio volume" -msgstr "Âm lượng Âm Thanh" +msgstr "Âm lượng" msgid "Buffersize" -msgstr "Cỡ Kich Đệm" +msgstr "Cỡ Bộ Đệm" msgid "Rate control: buffer size (kb)" -msgstr "Điều khiểu tốc độ: kích cỡ đệm (kb)" +msgstr "Khống chế tần số: cỡ bộ đệm (kb)" msgid "Video Codec" -msgstr "Mã Hóa Giải Video" +msgstr "Bộ Mã/Giải Hóa Video" msgid "FFmpeg codec to use for video output" -msgstr "Mã hóa giải FFmpeg để sử dụng cho ngõ ra video" +msgstr "Bộ mã/giải hóa FFmpeg để sản xuất video" msgid "No Video" @@ -10811,7 +11681,7 @@ msgstr "Không Có Video" msgid "Disables video output, for audio-only renders" -msgstr "Cho tắt ngõ ra video, cho chỉ kết xuất âm thanh" +msgstr "Tắt đầu ra của video, để chỉ kết xuất âm thanh mà thôi" msgid "DNxHD" @@ -10851,7 +11721,7 @@ msgstr "MPEG-4 (divx)" msgid "QT rle / QT Animation" -msgstr "QT rle / Hoạt Hình QT" +msgstr "QT rle / Hoạt Họa QT" msgid "Theora" @@ -10859,27 +11729,27 @@ msgstr "Theora" msgid "Output Quality" -msgstr "Chất Lượng nNgõ Ra" +msgstr "Chất Lượng Đầu Ra" msgid "Constant Rate Factor (CRF); tradeoff between video quality and file size" -msgstr "Hế Số Tốc Hằng Số; mặu dịch giữa chất lượng video và kích thước tập tin" +msgstr "Hệ Tần Bất Biến (CRF); thỏa hiệp giữa chất lượng video và cỡ tập tin" msgid "Constant Bitrate" -msgstr "Tốc Độ Bit Không Đổi" +msgstr "Tần Số Bit Bất Biến" msgid "Configure constant bit rate, rather than constant output quality" -msgstr "Dùng tốc độ bit không đổi, thay thế ngõ ra chất lượng không đổi" +msgstr "Dùng tần số bit bất biến, thay vì chất lượng đầu ra đồng đều" msgid "Lossless" -msgstr "Không mất dữ liệu nguồn" +msgstr "Hoàn Toàn Bảo Tồn Chất Lượng" msgid "Perceptually Lossless" -msgstr "Không Mất Chất Lượng Thị Giác" +msgstr "Dường Như Bảo Tồn Chất Lượng" msgid "High Quality" @@ -10903,19 +11773,19 @@ msgstr "Chất Lượng Thấp Nhất" msgid "Encoding Speed" -msgstr "Tốc Độ mMã Hóa" +msgstr "Tốc Độ Mã Hóa" msgid "Tradeoff between encoding speed and compression ratio" -msgstr "Mậu dịch giữa tốc độ mã hóa và tỉ số nén" +msgstr "Thỏa hiệp giữa tốc độ mã hóa và tỷ số nén" msgid "Slowest" -msgstr "Chậm Nhất" +msgstr "Tốc Độ Chậm Nhất" msgid "Recommended if you have lots of time and want the best compression efficiency" -msgstr "Khuyến sử dụng nếu có thời gian nhiều và muốn có hiệu qủa nén tốt nhất" +msgstr "(Tốt Nhất) Đây là phương án khuyến nghị nếu bạn có nhiều thời gian thư thả, và muốn đạt được hiệu suất nén tốt nhất" msgid "Good" @@ -10923,7 +11793,7 @@ msgstr "Tốt" msgid "The default and recommended for most applications" -msgstr "Mặc định được khuyến sử dụng cho ứng dụng tổng quát" +msgstr "Phương thức mặc định và khuyến nghị cho đại đa số các ứng dụng" msgid "Realtime" @@ -10931,15 +11801,15 @@ msgstr "Thời Gian Thực" msgid "Recommended for fast encoding" -msgstr "Khuyến sử dụng cho mã hoá nhanh" +msgstr "Phương thức khuyến nghị để đạt được tốc độ mã hóa nhanh tróng" msgid "Container" -msgstr "Hộp Chứa" +msgstr "Định Dạng" msgid "Output file container" -msgstr "Hộp chứa tập tin ngõ ra" +msgstr "Định dạng tập tin đầu ra" msgid "MPEG-4" @@ -10971,79 +11841,79 @@ msgstr "WebM" msgid "Keyframe Interval" -msgstr "Đoạn Bức Ảnh Mẫu" +msgstr "Phân khoảng của khung khóa" msgid "Distance between key frames, also known as GOP size; influences file size and seekability" -msgstr "Khoảng cách giữa bức ảnh mẫu, cũng gọi kích thước GOP; được ảnh hưởng cớ thước tập tin vả khả năng di chuyển trong nó" +msgstr "Khoảng cách giữa các khung khóa, còn gọi là cỡ GOP (Group Of Pictures : Nhóm Hình Ảnh); tác động tới cỡ tập tin và khả năng lùng tìm" msgid "Max B-Frames" -msgstr "Bức Ảnh-B Tối Đa" +msgstr "Khung-B Tối Đa" msgid "Maximum number of B-frames between non-B-frames; influences file size and seekability" -msgstr "Số lượng bức ảnh mẫu B tối đa giữa bức ảnh thường; được ảnh hưởng cớ thước tập tin vả khả năng đọc nó" +msgstr "Số lượng khung-B tối đa giữa các khung hình không phải là khung-B; tác động tới cỡ tập tin và khả năng rà lướt" msgid "Max Rate" -msgstr "Tốc Độ Cực Đại" +msgstr "Tần Số Tối Đa" msgid "Rate control: max rate (kbit/s)" -msgstr "Hạn chế tốc độ: tốc độ cực đại (kb/giây)" +msgstr "Điều chế tần số: tần số tối đa (kb/giây)" msgid "Min Rate" -msgstr "Tộc Độ Cực Tiểu" +msgstr "Tần Số Tối Thiểu" msgid "Rate control: min rate (kbit/s)" -msgstr "Hạn chế tốc độ: tốc độ cực tiểu (kb/giây)" +msgstr "Điều chế tần số: tần số tối thiểu (kb/giây)" msgid "Mux Rate" -msgstr "Tốc Độ Xen" +msgstr "Tần Số Dồn Kênh" msgid "Mux rate (bits/second)" -msgstr "Tốc độ xen (bit/giây)" +msgstr "Tần Số Dồn Kênh (số bit/giây)" msgid "Mux Packet Size" -msgstr "Kích Cỡ Gói" +msgstr "Cỡ Gói Tin Dồn Kênh" msgid "Mux packet size (byte)" -msgstr "Cớ kích gói (byte)" +msgstr "Cỡ gói tin dồn kênh (byte)" msgid "Autosplit Output" -msgstr "Từ Chẻ Tập Tintập tin Ngõ Ra" +msgstr "Tự Động Phân Chia Đầu Ra" msgid "Autosplit output at 2GB boundary" -msgstr "Tự động chẻ tập tin thành phần kích cỡ 2 GB" +msgstr "Tự động phân chia đầu ra thành các phần 2 GB" msgid "Lossless Output" -msgstr "Xuất Không Mất Nguồn" +msgstr "Xuất Bảo Toàn" msgid "Use lossless output for video streams" -msgstr "Xuất không mất dữ liệu nguồn cho lưu dòng video" +msgstr "Xuất các dòng video không mất chất lượng" msgid "Use Max B-Frames" -msgstr "Dùng Bức Ảnh-B Tối Đa" +msgstr "Dùng Bước Ảnh-B Tối Đa" msgid "Set a maximum number of B-frames" -msgstr "Đặt một số lượng bức ảnh-B tối đa" +msgstr "Đặt số lượng bước ảnh B tối đa" msgid "Video bitrate (kbit/s)" -msgstr "Tốc độ bit video (kb/s)" +msgstr "Tần số bit video (kilo-bit/giây)" msgid "F-Modifier" @@ -11051,64 +11921,68 @@ msgstr "Bộ Điều Chỉnh-F" msgid "Modifier for values of F-Curve" -msgstr "Bộ điều chỉnh cho giá trị của Cong-F" +msgstr "Bộ điều chỉnh cho những giá trị của Đường Cong-F" msgid "F-Curve modifier will show settings in the editor" -msgstr "Cuư sửa đổi Cong-F sẽ hiện cài đặt trong trình biên soạn" +msgstr "Bộ điều chỉnh Đường Cong-F sẽ hiển thị các cài đặt trong trình biên soạn" msgid "Blend In" -msgstr "Pha Trộn Vào" +msgstr "Khởi Đầu Pha Trộn" msgid "Number of frames from start frame for influence to take effect" -msgstr "Số lượng bức ảnh từ bức ảnh đầu cho thực hành sự ảnh hưởng" +msgstr "Số lượng khung hình từ khung hình đầu để hiệu ứng có tác động" msgid "Blend Out" -msgstr "Pha Trộn Ra" +msgstr "Kết Thúc Pha Trộn" msgid "Number of frames from end frame for influence to fade out" -msgstr "Số lượng bức ảnh từ bức ảnh cuối cho kết thúc sự ảnh hưởng" +msgstr "Số lượng khung hình từ khung hình cuối để ảnh hưởng mờ dần đi" msgid "Frame that modifier's influence ends (if Restrict Frame Range is in use)" -msgstr "Bức ảnh thì sự ảnh hưởng của bộ điều chỉnh được kết thúc (nếu đang dùng Hạn Chế Phạm Vi Bức Ảnh)" +msgstr "Khung hình mà ảnh hưởng của bộ điều chỉnh kết thúc (nếu sử dụng Hạn Chế Phạm Vi Khung Hình)" msgid "Frame that modifier's influence starts (if Restrict Frame Range is in use)" -msgstr "Số bức ảnh thì sự ảnh hưởng của bộ điều chỉnh được bắt đầu (nếu đang dùng Hạn Chế Phạm Vi Bức Ảnh)" +msgstr "Khung hình mà ảnh hưởng của bộ điều chỉnh khởi đầu (nếu sử dụng Hạn Chế Phạm Vi Khung Hình)" msgid "Amount of influence F-Curve Modifier will have when not fading in/out" -msgstr "Mức sự ảnh hưởng của Bộ Điều Chỉnh Cong-F khi không giảm vào/ra" +msgstr "Lượng ảnh hưởng của bộ điều chỉnh Đường Cong-F sẽ có khi không mờ dần vào/ra" msgid "Disabled" -msgstr "Được Tắt" +msgstr "Tắt" msgid "F-Curve Modifier has invalid settings and will not be evaluated" -msgstr "Bộ Điều Chỉnh Cong-F có cài đặt không hợp lệ và sẽ không được tính toán" +msgstr "Bộ điều chỉnh Đường Cong-F có một số sắp đặt không hợp lý, do đó sẽ không được tính toán" msgid "Enable F-Curve modifier evaluation" -msgstr "Bật tính toán Bộ Điều Chỉnh Cong-F" +msgstr "Bật tính năng tính toán của bộ điều chỉnh Đường Cong-F" + + +msgid "F-Curve Modifier name" +msgstr "Tên Bộ Điều Chỉnh Đường Cong-F" msgid "F-Curve Modifier's panel is expanded in UI" -msgstr "Bảng Bộ Điều Chỉnh Cong-F đang mở rộng trong giao diện" +msgstr "Bảng bộ điều chỉnh Đường Cong-F đã được mở rộng trong Giao Diện" msgctxt "Action" msgid "Type" -msgstr "Loại" +msgstr "Thể Loại" msgid "F-Curve Modifier Type" -msgstr "Loại Bộ Điều Chỉnh Cong-F" +msgstr "Thể Loại Bộ Điều Chỉnh Đường Cong-F" msgctxt "Action" @@ -11118,47 +11992,47 @@ msgstr "Không Hợp Lệ" msgctxt "Action" msgid "Generator" -msgstr "Đồ Chế Tạo" +msgstr "Hàm Sinh" msgid "Generate a curve using a factorized or expanded polynomial" -msgstr "Chế tạo một đường cong bởi một đa thức bị phân thức hay nhân nhau" +msgstr "Sinh tạo một đường cong dùng đa thức đã được phân thức hoặc đã được mở rộng" msgctxt "Action" msgid "Built-In Function" -msgstr "Hàm Số Có Sẵn" +msgstr "Hàm Tích Hợp" msgid "Generate a curve using standard math functions such as sin and cos" -msgstr "Chế tạo một đường cong bằng sử dụng hàm số toán chuẩn như sin và cos" +msgstr "Phát sinh một đường cong dùng các hàm chuẩn như sin và cos" msgctxt "Action" msgid "Envelope" -msgstr "Bao Bì" +msgstr "Phong Bao" msgid "Reshape F-Curve values, e.g. change amplitude of movements" -msgstr "Giá trị đổi hình dạng Cong-F, ví dụ đổi biên độ của chuyển động" +msgstr "Đổi hình các giá trị của Đường Cong-F, ví dụ: đổi biên độ của các dao động" msgctxt "Action" msgid "Cycles" -msgstr "Chu Trình" +msgstr "Chu Trình/Cycles" msgid "Cyclic extend/repeat keyframe sequence" -msgstr "Kéo dài/lặp lại trình tự bức ảnh chu trình" +msgstr "Kéo dài/nhắc lại trình tự khung khóa một cách tuần hoàn" msgctxt "Action" msgid "Noise" -msgstr "Huyên Náo" +msgstr "Nhiễu" msgid "Add pseudo-random noise on top of F-Curves" -msgstr "Thêm huyên náo xấp xỉ ngẫu nhiên tren các Cong-F" +msgstr "Thêm nhiễu nhân tạo trên các Đường Cong-F" msgctxt "Action" @@ -11167,68 +12041,68 @@ msgstr "Giới Hạn" msgid "Restrict maximum and minimum values of F-Curve" -msgstr "Hạn chế giá trị cực đại và cực tiểu của Cong-F" +msgstr "Hạn chế giá trị tối đa và tối thiểu của Đường Cong-F" msgctxt "Action" msgid "Stepped Interpolation" -msgstr "Suy Nội Kiểu Bước" +msgstr "Nội Suy Bậc Thang" msgid "Snap values to nearest grid step, e.g. for a stop-motion look" -msgstr "Hút dính giá trị đến bước đồ thị gần nhất, ví dụ cho coi như tĩnh hình" +msgstr "Bám vào các giá trị xấp xỉ với bậc phân chia của khung lưới đồ thị, ví dụ như tạo hiệu ứng chuyển động giật" msgid "Use Influence" -msgstr "Dùng Sự Ảnh Hướng" +msgstr "Sử Dụng Ảnh Hưởng" msgid "F-Curve Modifier's effects will be tempered by a default factor" -msgstr "Hiệu ứng của Bộ Điều Chỉnh Cong-F sẽ bị giảm bằng một hệ số mặc định" +msgstr "Hiệu ứng của Bộ Điều Chỉnh Đường Cong-F sẽ bị kiềm chế bởi một thừa số mặc định" msgid "Restrict Frame Range" -msgstr "Hạn Chế Phạm Vi Bức Ảnh" +msgstr "Hạn Chế Phạm Vi Khung Hình" msgid "F-Curve Modifier is only applied for the specified frame range to help mask off effects in order to chain them" -msgstr "Chỉ áp dụng Bộ Điều Chỉnh Cong-F cho phạm vi được xác định, để giúp che hiệu ứng cho có thể làm chuỗi với chúng nó)" +msgstr "Chì áp dụng Bộ Điều Chỉnh Cong-F cho phạm vi xác định, để giúp thuyên giảm hiệu ứng, hầu cho có thể móc nối chúng)" msgid "Cycles F-Modifier" -msgstr "Bộ Điều Chỉnh Cong-F Chu Trình" +msgstr "Tuần Hoàn Hóa Bộ Điều Chỉnh-F" msgid "Repeat the values of the modified F-Curve" -msgstr "Lặp lại giá trị của Cong-F được sửa đổi" +msgstr "Nhắc lại các giá trị sửa đổi của Đường Cong-F" msgid "After Cycles" -msgstr "Sau Chu Trình" +msgstr "Chu Trình Sau" msgid "Maximum number of cycles to allow after last keyframe (0 = infinite)" -msgstr "Số lượng chu trình tối đa sau bức ảnh mẫu cuối (0 = vô hạn)" +msgstr "Số lượng chu trình tối đa cho phép sau khung khóa cuối cùng (0 = vô cực)" msgid "Before Cycles" -msgstr "Trước Chu Trình" +msgstr "Chu Trình Trước" msgid "Maximum number of cycles to allow before first keyframe (0 = infinite)" -msgstr "Số lượng chu trình tối đa trước bức ảnh mẫu đầu (0 = vô hạn)" +msgstr "Số lượng chu trình tối đa cho phép trước khung khóa đầu tiên (0 = vô cực)" msgid "After Mode" -msgstr "Chế Độ Sau" +msgstr "Chế Độ Hậu Kỳ" msgid "Cycling mode to use after last keyframe" -msgstr "Chế độ chu trình sau bức ảnh mẫu cuối" +msgstr "Chế độ tuần hoàn sử dụng sau khung khóa cuối cùng" msgid "No Cycles" -msgstr "Không Chu Trình" +msgstr "Không Tuần Hoàn" msgid "Don't do anything" @@ -11236,67 +12110,67 @@ msgstr "Không làm gì hết" msgid "Repeat Motion" -msgstr "Lặp Lại Chuyển Động" +msgstr "Nhắc Lại Chuyển Động" msgid "Repeat keyframe range as-is" -msgstr "Lặp lại phạm vì bức ảnh mẫu có sẵn" +msgstr "Nhắc lại phạm vi khung khóa vốn có" msgid "Repeat with Offset" -msgstr "Lặp Lại với Dịch" +msgstr "Nhắc Lại với Dịch Chuyển" msgid "Repeat keyframe range, but with offset based on gradient between start and end values" -msgstr "Lặp lại phạm vi bức ảnh mẫu nhưng dùng dịch tùy dốc giá trị giữa đầu và cuối" +msgstr "Nhắc lại phạm vi khung khóa, song với sự dịch chuyển dựa trên độ dốc giữa các giá trị đầu và cuối" msgid "Repeat Mirrored" -msgstr "Lặp Lại Gương" +msgstr "Nhắc Lại Phản Chiếu Đối Xứng" msgid "Alternate between forward and reverse playback of keyframe range" -msgstr "Thay phiên giữa hát lại tới và hát lui phạm vi bức ảnh mẫu" +msgstr "Lật đổi chế độ chơi lại phạm vi các khung khóa hóa giữa thuận chiều và nghịch chiều" msgid "Before Mode" -msgstr "Chế Độ Trước" +msgstr "Chế Độ Tiền Kỳ" msgid "Cycling mode to use before first keyframe" -msgstr "Chế độ chu trình để dùng trước bức ảnh mẫu đầu" +msgstr "Chế độ tuần hoàn sử dụng trước khung khóa đầu tiên" msgid "Envelope F-Modifier" -msgstr "Bộ Điều Chỉnh-F Bao Bì" +msgstr "Bộ Điều Chỉnh-F Phong Bao" msgid "Scale the values of the modified F-Curve" -msgstr "Phóng to giá trị của cong-F được sửa đổi" +msgstr "Đổi tỷ lệ giá trị của Đường Cong-F đã chỉnh sửa" msgid "Control Points" -msgstr "Điểm Kiểm Soát" +msgstr "Điểm Điều Khiển" msgid "Control points defining the shape of the envelope" -msgstr "Điểm kiểm soát cho chỉ định hình dạng của bao bì" +msgstr "Các điểm điều khiển xác định hình dạng của phong bao" msgid "Default Maximum" -msgstr "Mặc Định Cực Đại" +msgstr "Mặc Định Tối Đa" msgid "Upper distance from Reference Value for 1:1 default influence" -msgstr "Khoảng cách cao từ Giá Trị Tham Chiếu cho được sự ảnh hưởng mặc định 1:1" +msgstr "Khoảng cách trên từ Giá Trị Tham Chiếu để ảnh hưởng với tỷ lệ 1:1 mặc định" msgid "Default Minimum" -msgstr "Mặc Định Cực Tiểu" +msgstr "Mặc Định Tối Thiểu" msgid "Lower distance from Reference Value for 1:1 default influence" -msgstr "Khoảng cách dưới từ Giá Trị Tham Chiếu cho được sự ảnh hưởng mặc định 1:1" +msgstr "Khoảng cách dưới từ Giá Trị Tham Chiếu để ảnh hưởng với tỷ lệ 1:1 mặc định" msgid "Reference Value" @@ -11304,15 +12178,15 @@ msgstr "Giá Trị Tham Chiếu" msgid "Value that envelope's influence is centered around / based on" -msgstr "Giá trị làm trung tâm cho sự ảnh hưởng của bao bì" +msgstr "Giá trị làm trung tâm cho sự ảnh hưởng của phong bao" msgid "Built-In Function F-Modifier" -msgstr "Bộ Điều Chỉnh Hàm Số Có Sẵn" +msgstr "Bộ Điều Chỉnh Hàm Tích Hợp" msgid "Generate values using a built-in function" -msgstr "Chế tạo giá trị bằng dùng một hàm số có sẵn" +msgstr "Phát sinh các giá trị dùng một hàm tích hợp sẵn trong nội bộ" msgid "Amplitude" @@ -11320,11 +12194,11 @@ msgstr "Biên Độ" msgid "Scale factor determining the maximum/minimum values" -msgstr "Hệ số phóng to để xác định giá trị cực đại/cực tiểu" +msgstr "Hệ số tỷ lệ để xác định các giá trị tối đa/tối thiểu" msgid "Type of built-in function to use" -msgstr "Sử dụng loại hàm số nào có sẵn sàng" +msgstr "Thể loại hàm tích hợp để sử dụng" msgid "Sine" @@ -11336,15 +12210,15 @@ msgstr "Cos" msgid "Square Root" -msgstr "Căn" +msgstr "Căn Bậc Hai" msgid "Natural Logarithm" -msgstr "Log Thiên Nhiên" +msgstr "Lôgarit Tự Nhiên" msgid "Normalized Sine" -msgstr "Sin Đơn Vị Hóa" +msgstr "Hàm Sin Đã Bình Thường Hóa" msgid "sin(x) / x" @@ -11352,39 +12226,39 @@ msgstr "sin(x) / x" msgid "Phase Multiple" -msgstr "Đa Pha" +msgstr "Số Lần Khuếch Đại Pha" msgid "Scale factor determining the 'speed' of the function" -msgstr "Hệ số xác định 'tốc độ' của hàm số" +msgstr "Hệ số tỷ lệ xác định 'tốc độ' của hàm" msgid "Phase Offset" -msgstr "Dịch Pha" +msgstr "Dịch Chuyển Pha Sóng" msgid "Constant factor to offset time by for function" -msgstr "Hằng số để dịch thời gian của hàm số" +msgstr "Hệ số bất biến dùng để dịch chuyển thời gian của hàm số" msgid "Values generated by this modifier are applied on top of the existing values instead of overwriting them" -msgstr "Các giá trị được phát từ bộ điều chỉnh này đượa kèm theo các giá trị có sẵn và không ghi lên nó" +msgstr "Các giá trị được phát sinh bởi bộ điều chỉnh này sẽ được kèm thêm vào các giá trị hiện có thay vì thay thế chúng" msgid "Value Offset" -msgstr "Dích Giá Trị" +msgstr "Giá Trị Dịch Chuyển" msgid "Constant factor to offset values by" -msgstr "Hằng số để dịch giá trị của hàm số" +msgstr "Hệ số bất biến dùng để dịch chuyển các giá trị" msgid "Generator F-Modifier" -msgstr "Bộ Điều Chỉnh-F Sáng Tạo" +msgstr "Bộ Điều Chỉnh-F Phát Sinh" msgid "Deterministically generate values for the modified F-Curve" -msgstr "Dùng biểu thức để phát giá trị cho Cong-F được sửa đổi" +msgstr "Tất định phát sinh các giá trị cho bộ điều chỉnh Đường Cong-F" msgid "Coefficients" @@ -11392,27 +12266,27 @@ msgstr "Hệ Số" msgid "Coefficients for 'x' (starting from lowest power of x^0)" -msgstr "Các hệ số cho 'x' (bắt đầu từ mũ thấp nhất x^0)" +msgstr "Các hệ số cho 'X' (bắt đầu từ mũ thấp nhất X^0)" msgid "Type of generator to use" -msgstr "Loại chế tạo để dùng" +msgstr "Loại hàm phát sinh để dùng" msgid "Expanded Polynomial" -msgstr "Đa Thức Nhân Ra" +msgstr "Đa Thức được Mở Rộng" msgid "Factorized Polynomial" -msgstr "Đa Thức Bị Phân Thức" +msgstr "Đa Thức được Phân Thức" msgid "Polynomial Order" -msgstr "Bậc Đa Thức" +msgstr "Bậc Phương Trình" msgid "The highest power of 'x' for this polynomial (number of coefficients - 1)" -msgstr "Mũ cao nhất của 'x' của đa thức này (số lượng hệ số - 1)" +msgstr "Mũ cao nhất của 'X' cho đa thức này (số lượng hệ số - 1)" msgid "Limit F-Modifier" @@ -11420,43 +12294,43 @@ msgstr "Bộ Điều Chỉnh-F Hạn Chế" msgid "Limit the time/value ranges of the modified F-Curve" -msgstr "Hạn chế phạm vi thời gian/giá trị của Cong-F được sửa đổi" +msgstr "Hạn chế phạm vi thời gian/giá trị sửa đổi của Đường Cong-F" msgid "Noise F-Modifier" -msgstr "Bộ Điều Chỉnh-F Huyên Náo" +msgstr "Bộ Điều Chỉnh-F Gây Nhiễu Loạn" msgid "Give randomness to the modified F-Curve" -msgstr "Làm Cong-F được sửa đổi ngẫu nhiên hóa" +msgstr "Gây cho Đường Cong-F bị thay đổi một cách ngẫu nhiên" msgid "Method of modifying the existing F-Curve" -msgstr "Phương pháp sửa đổi Cong-F có sẵn" +msgstr "Phương pháp sửa đổi Đường Cong-F hiện có" msgid "Amount of fine level detail present in the noise" -msgstr "Mức chi tiết nhỏ đang tồn tại trong huyên náo" +msgstr "Lượng chi tiết tinh tế hiện hữu trong nhiễu" msgid "Time offset for the noise effect" -msgstr "Dích thời gian cho hiệu ứng huyen náo" +msgstr "Dịch chuyển thời gian cho hiệu ứng nhiễu" msgid "Phase" -msgstr "Pha" +msgstr "Pha (Sóng)" msgid "A random seed for the noise effect" -msgstr "Số hạt cho hiệu ứng huyen náo" +msgstr "Mầm của hàm số ngẫu nhiên cho hiệu ứng nhiễu" msgid "Scaling (in time) of the noise" -msgstr "Phóng to (trong thời gian) của huyên náo" +msgstr "Đổi tỷ lệ nhiễu (trong thời gian)" msgid "Amplitude of the noise - the amount that it modifies the underlying curve" -msgstr "Biên độ của huyên náo - lượng được sửa đổi đường cong bản chánh" +msgstr "Biên độ của nhiễu - lượng sửa đổi đường cong nền tảng" msgid "Python F-Modifier" @@ -11464,91 +12338,91 @@ msgstr "Bộ Điều Chỉnh-F Python" msgid "Perform user-defined operation on the modified F-Curve" -msgstr "Thực hành thao tác người dùng tùy chọn với Cong-F được sửa đổi" +msgstr "Thi hành phép toán người dùng định nghĩa trên những biến đổi của Đường Cong-F" msgid "Stepped Interpolation F-Modifier" -msgstr "Bộ Điều Chỉnh-F Nội Suy Bước" +msgstr "Bộ Điều Chỉnh-F Nội Suy Bậc Thang" msgid "Hold each interpolated value from the F-Curve for several frames without changing the timing" -msgstr "Giữ nguyên các giá trị suy nội từ Cong-F cho vài bức ảnh nhưng không đổi thời tự" +msgstr "Giữ nguyên các giá trị nội suy từ Đường Cong-F cho vài khung hình song không thay đổi nhịp điệu" msgid "Frame that modifier's influence ends (if applicable)" -msgstr "Số bức ảnh bộ điều chỉnh được kết thúc ảnh hưởng (nếu có sử dụng)" +msgstr "Khung hình mà sự chi phối của bộ điều chỉnh chấm dứt (nếu sử dụng)" msgid "Reference number of frames before frames get held (use to get hold for '1-3' vs '5-7' holding patterns)" -msgstr "Số lượng bức ảnh tham chiếu trước được giữ (dùng gương mẫu giữ cho '1-3' đối phó với '5-7')" +msgstr "Số khung hình tham chiếu trước khi các khung hình ngưng lại (dùng để đạt được nhịp điệu ngưng lại '1-3' thay vì '5-7')" msgid "Frame that modifier's influence starts (if applicable)" -msgstr "Số bức ảnh thì bộ điều chỉnh được bắt đầu ảnh hưởng (nếu có sử dụng)" +msgstr "Khung hình nơi sẽ khởi đầu tác động của bộ điều chỉnh (nếu sử dụng)" msgid "Step Size" -msgstr "Kích Cỡ Bước" +msgstr "Kích Thước Bước" msgid "Number of frames to hold each value" -msgstr "Số lượng bức ảnh để giữ mỗi giá trị" +msgstr "Số khung hình để giữ từng giá trị" msgid "Use End Frame" -msgstr "Dùng Bức Ảnh Cuối" +msgstr "Dùng Khung Hình Cuối Cùng" msgid "Restrict modifier to only act before its 'end' frame" -msgstr "Hạn chế bộ điều chỉnh chỉ được hoạt động trước bức ảnh 'kết thúc' của nó" +msgstr "Hạn chế bộ điều chỉnh, chỉ cho phép thi hành trước khung hình 'cuối' của nó" msgid "Use Start Frame" -msgstr "Dùng Bức Ảnh Đầu" +msgstr "Dùng Khung Hình Đầu Tiên" msgid "Restrict modifier to only act after its 'start' frame" -msgstr "Hạn chế bộ điều chỉnh chỉ được hoạt động sau bức ảnh 'bắt đầu'" +msgstr "Hạn chế bộ điều chỉnh, chỉ cho phép thi hành sau khung hình 'đầu' của nó" msgid "Envelope Control Point" -msgstr "Điểm Kiểm Soát Bao Bì" +msgstr "Điểm Điều Khiển Phong Bao" msgid "Control point for envelope F-Modifier" -msgstr "Điểm kiểm soát cho Bộ Điều Chỉnh-F bao bì" +msgstr "Điểm điều khiển cho Bộ Điều Chỉnh-F phong bao" msgid "Frame" -msgstr "Bức Ảnh" +msgstr "Khung Hình" msgid "Frame this control-point occurs on" -msgstr "Số bức ảnh có điểm kiểm soát này" +msgstr "Khung hình mà điểm điều khiển này xảy ra trong đó" msgid "Upper bound of envelope at this control-point" -msgstr "Giới hạn cao cho bao bì tại điểm kiểm soát này" +msgstr "Giới hạn trên cho phong bao tại điểm điều khiển này" msgid "Lower bound of envelope at this control-point" -msgstr "Giới hạn thấp cho bao bì tại điểm kiểm soát này" +msgstr "Giới hạn dưới cho phong bao tại điểm điều khiển này" msgid "Field Settings" -msgstr "Cài Đặt Trường" +msgstr "Sắp Đặt Trường" msgid "Field settings for an object in physics simulation" -msgstr "Cài đặt của trường cho một vật thể trong mô phỏng vật lý" +msgstr "Những sắp đặt của trường cho một đối tượng trong mô phỏng vật lý" msgid "Affect particle's location" -msgstr "Ảnh hưởng vị trí của hạt" +msgstr "Tác động đến vị trí của hạt" msgid "Affect particle's dynamic rotation" -msgstr "Ảnh hưởng động lý xoay của hạt" +msgstr "Tác động đến sự xoay chiều năng động của hạt" msgid "Maximum Distance" @@ -11556,15 +12430,19 @@ msgstr "Khoảng Cách Tối Đa" msgid "Maximum distance for the field to work" -msgstr "Khoảng cách cực đại cho tác dụng của lực trường" +msgstr "Khoảng cách tối đa để trường lực có hiệu lực" + + +msgid "Minimum distance for the field's falloff" +msgstr "Khoảng cách tối thiểu cho suy giảm dần của trường" msgid "Falloff Power" -msgstr "Lũy Thừa Sự Giảm" +msgstr "Lũy Thừa Suy Giảm" msgid "How quickly strength falls off with distance from the force field" -msgstr "Tốc độ sự giảm sức tùy khoảng cách từ lực trường" +msgstr "Tốc độ trường lực suy giảm theo khoảng cách" msgid "Cone" @@ -11580,19 +12458,19 @@ msgstr "Hình Ống" msgid "Flow" -msgstr "Lưu" +msgstr "Lưu Luồng/Lượng" msgid "Convert effector force into air flow velocity" -msgstr "Đổi lực hiệu ứng thành vận tốc lưu không khí" +msgstr "Chuyển đổi hiệu ứng viên lực đẩy thành vận tốc gió thổi" msgid "Amount" -msgstr "Mức" +msgstr "Số Lượng" msgid "Amount of clumping" -msgstr "Mức dính bó" +msgstr "Lượng khóm lại" msgid "Shape" @@ -11600,15 +12478,15 @@ msgstr "Hình Dạng" msgid "Shape of clumping" -msgstr "Hình dạng dính bó" +msgstr "Hình dạng khóm" msgid "Guide-free time from particle life's end" -msgstr "Thời gian dẫn tự do từ kết thúc đời sống của hạt" +msgstr "Thời điểm không phụ thuộc vào sự dẫn dắt của đường cong tại điểm kết của hạt" msgid "The amplitude of the offset" -msgstr "Biên độ của dịch" +msgstr "Biên độ của dịch chuyển" msgid "Axis" @@ -11616,7 +12494,7 @@ msgstr "Trục" msgid "Which axis to use for offset" -msgstr "Dùng trục nào cho dịch" +msgstr "Dùng trục nào cho dịch chuyển" msgid "Frequency" @@ -11624,147 +12502,191 @@ msgstr "Tần Số" msgid "The frequency of the offset (1/total length)" -msgstr "Tần số của dịch (1/tổng độ dài)" +msgstr "Tần số của dịch chuyển (1/tổng chiều dài)" msgid "Adjust the offset to the beginning/end" -msgstr "Chỉnh dịch đến đầu/cuối" +msgstr "Chỉnh dịch chuyển về đầu/cuối" + + +msgctxt "ParticleSettings" +msgid "Kink" +msgstr "Xoắn Vặn" msgid "Type of periodic offset on the curve" -msgstr "Loại dịch chu trình trên đường cong" +msgstr "Thể loại dịch chuyển chu kỳ trên đường cong" + + +msgctxt "ParticleSettings" +msgid "None" +msgstr "Không" + + +msgctxt "ParticleSettings" +msgid "Braid" +msgstr "Tết Bện" + + +msgctxt "ParticleSettings" +msgid "Curl" +msgstr "Uốn Cong" + + +msgctxt "ParticleSettings" +msgid "Radial" +msgstr "Tỏa Tròn" + + +msgctxt "ParticleSettings" +msgid "Roll" +msgstr "Cuộn" + + +msgctxt "ParticleSettings" +msgid "Rotation" +msgstr "Xoay Chiều" + + +msgctxt "ParticleSettings" +msgid "Wave" +msgstr "Sóng" msgid "The distance from which particles are affected fully" -msgstr "Khoảng cách hạt được ảnh hưởng toàn bộ" +msgstr "Khoảng cách các hạt bị ảnh hưởng toàn phần" msgid "Harmonic Damping" -msgstr "Tắt Dần Điều Hòa" +msgstr "Giảm Chấn Điều Hòa" msgid "Damping of the harmonic force" -msgstr "Tắt dần của lực điều hòa" +msgstr "Sự giảm chấn của lực điều hòa" msgid "Inflow" -msgstr "Lưu Nhập" +msgstr "Luồng Chảy Vào" msgid "Inwards component of the vortex force" -msgstr "Thành phân hút vào của lực cơn lốc" +msgstr "Thành phần hướng nội của lực xoáy lốc" msgid "Linear Drag" -msgstr "Lực Cản Bậc Một" +msgstr "Lực Cản Tuyến Tính" msgid "Drag component proportional to velocity" -msgstr "Lực cản trở đồng biến với vận tốc" +msgstr "Lực cản tương ứng với vận tốc" msgid "Noise" -msgstr "Huyên Náo" +msgstr "Nhiễu" msgid "Amount of noise for the force strength" -msgstr "Mức huyên náo cho sức lực" +msgstr "Lượng nhiễu cho sức mạnh của lực" msgid "Quadratic Drag" -msgstr "Lực Cản Bậc Hai" +msgstr "Trở Lực Bình Phương" msgid "Drag component proportional to the square of velocity" -msgstr "Lực cản trở đồng biến với vận tốc bình phương" +msgstr "Trở lực tương ứng với bình phương của vận tốc" msgid "Radial Falloff Power" -msgstr "Lũy Thừa Sự Giảm Tỏa Tròh" +msgstr "Lũy Thừa Suy Giảm Tỏa Tròn" msgid "Radial falloff power (real gravitational falloff = 2)" -msgstr "Lũy thừa sự giảm tỏa tròn (sự giảm hấp dẫn thật = 2)" +msgstr "Lũy thừa suy giảm tỏa tròn (suy giảm do trọng lực thực = 2)" msgid "Maximum Radial Distance" -msgstr "Khỏang Cách Tỏa Tròn Cực Đại" +msgstr "Khoảng Cách Tỏa Tròn Tối Đa" msgid "Maximum radial distance for the field to work" -msgstr "Khỏang cách cực đại tỏa tròn cho sự giảm của lực trường" +msgstr "Khoảng cách tỏa tròn tối đa để trường lực có hiệu lực" msgid "Minimum Radial Distance" -msgstr "Khỏang Cách Tỏa Tròn Cực Tiểu" +msgstr "Khoảng Cách Tỏa Tròn Tối Thiểu" + + +msgid "Minimum radial distance for the field's falloff" +msgstr "Khoảng cách tỏa tròn tối thiểu cho suy giảm dần của trường" msgid "Rest Length" -msgstr "Bề Dài Nghỉ" +msgstr "Chiều Dài Nghỉ" msgid "Rest length of the harmonic force" -msgstr "Bề dài nghỉ ngơi của lực điều hòa" +msgstr "Khoảng tĩnh tại của lực điều hòa" msgid "Seed" -msgstr "Số Hạt" +msgstr "Mầm" msgid "Seed of the noise" -msgstr "Số hạt của huyên náo" +msgstr "Mầm của nhiễu" msgid "Which direction is used to calculate the effector force" -msgstr "Dùng hướng nào để tính lực của đồ hiệu ứng" +msgstr "Dùng chiều hướng nào để tính lực của hiệu ứng viên" msgid "Field originates from the object center" -msgstr "Trường được phát sinh từ trung tâm vật thể" +msgstr "Trường bắt nguồn từ trung tâm đối tượng" msgid "Field originates from the local Z axis of the object" -msgstr "Trường được phát sinh từ trục Z dịa phương của vật thể" +msgstr "Trường bắt nguồn từ trục Z địa phương của đối tượng" msgid "Field originates from the local XY plane of the object" -msgstr "Trường được phát sinh từ mặt phẳng XY địa phương của vật thể" +msgstr "Trường bắt nguồn từ bình diện XY địa phương của đối tượng" msgid "Field originates from the surface of the object" -msgstr "Trường được phát sinh từ bề mặt của vật thể" +msgstr "Trường bắt nguồn từ bề mặt của đối tượng" msgid "Every Point" -msgstr "Mỗi Đỉnh" +msgstr "Mọi Điểm" msgid "Field originates from all of the vertices of the object" -msgstr "Trường được phát sinh từ tất cả đỉnh của vật thể" +msgstr "Trường bắt nguồn từ toàn bộ các điểm đỉnh của đối tượng" msgid "Size" -msgstr "Kích Cỡ" +msgstr "Kích Thước" msgid "Size of the turbulence" -msgstr "Kích cỡ của nhiễu loạn" +msgstr "Kích thước của hỗn loạn" msgid "Domain Object" -msgstr "Vật Thể Phạm Vi" +msgstr "Đối Tượng Định Phạm Vi" msgid "Select domain object of the smoke simulation" -msgstr "Chọn vật thể phạm vi cho mô phỏng khói" +msgstr "Chọn đối tượng làm phạm vi mô phỏng luồng khói" msgid "Strength of force field" -msgstr "Sức của lực trường" +msgstr "Cường độ của trường lực" msgid "Texture to use as force" -msgstr "Dùng chất liệu nào để làm lực" +msgstr "Chất liệu để sử dụng cho lực" msgid "Texture Mode" @@ -11772,15 +12694,15 @@ msgstr "Chế Độ Chất Liệu" msgid "How the texture effect is calculated (RGB and Curl need a RGB texture, else Gradient will be used instead)" -msgstr "Làm sao tính sự ảnh hưởng của chất liệu (RGB & Xoắn cần một chất liệu RGB, nếu không sẽ dùng Dốc thay thế)" +msgstr "Cách tính ảnh hưởng của chất liệu (RGB & sự uốn quăn (Curl) cần có một chất liệu RGB, nếu không, Dốc Màu sẽ được sử dụng thay vì)'" msgid "Curl" -msgstr "Xoắn" +msgstr "Uốn Quăn" msgid "Gradient" -msgstr "Nabl" +msgstr "Dốc Màu" msgid "Nabla" @@ -11788,63 +12710,63 @@ msgstr "Nabla" msgid "Defines size of derivative offset used for calculating gradient and curl" -msgstr "Kích cỡ dịch đạo hàm cho nabla và xoắn" +msgstr "Xác định kích thước của dịch chuyển dẫn xuất được dùng để tính toán dốc màu và độ uốn quăn" msgid "Type of field" -msgstr "Loại trường" +msgstr "Thể loại trường" msgid "Create a force that acts as a boid's predators or target" -msgstr "Chế tạo một lực tác dụng như kẻ san mồi hay mục tiêu của quần thể" +msgstr "Kiến Tạo một lực hành xử giống như những kẻ tấn công (thú ăn thịt) một quần thể, hoặc một mục tiêu" msgid "Spherical forcefield based on the charge of particles, only influences other charge force fields" -msgstr "Lực trường hình cầu tùy điện tích của hạt, chỉ được ảnh hưởng lực trường điện tích khác" +msgstr "Trường lực hình cầu dựa trên điện tích của các hạt, chỉ tác động đến các trường lực điện tích khác mà thôi" msgid "Create a force along a curve object" -msgstr "Chế tạo lực theo hướng của một vật thể đường cong" +msgstr "Kiến Tạo lực theo hướng của đối tượng đường cong" msgid "Create a force that dampens motion" -msgstr "Chế tạo một lực tắt dần chuyển động" +msgstr "Kiến Tạo một lực để hãm chuyển động" msgid "Create a force based on fluid simulation velocities" -msgstr "Chế tạo một lực cơ sở vận tốc mô phỏng chất lỏng" +msgstr "Kiến Tạo một lực dựa trên các vận tốc mô phỏng của chất lỏng" msgid "Radial field toward the center of object" -msgstr "Trường bán kính tuyến từ trung tâm vật thể" +msgstr "Trường tỏa tròn về phía trung tâm của đối tượng" msgid "The source of this force field is the zero point of a harmonic oscillator" -msgstr "Nguồn của lực trường này là điểm số không của giao động điều hòa" +msgstr "Nguồn của trường lực này là điểm số không của dao động điều hòa" msgid "Forcefield based on the Lennard-Jones potential" -msgstr "Lực trường cơ sở thế Lennard-Jones" +msgstr "Trường lực dựa trên cơ sở lý thuyết tiềm năng của Lennard-Jones" msgid "Forcefield depends on the speed of the particles" -msgstr "Lực trường tùy tốc độ của hạt" +msgstr "Trường lực phụ thuộc vào tốc độ của các hạt" msgid "Force field based on a texture" -msgstr "Lực trường cơ sở một chất liệu" +msgstr "Trường lực dựa trên một chất liệu" msgid "Create turbulence with a noise field" -msgstr "Chế tạo nhiễu loạn bằng một huyên náo trường" +msgstr "Kiến Tạo hỗn loạn bằng trường nhiễu" msgid "Spiraling force that twists the force object's local Z axis" -msgstr "Lực xoáy xoắn quanh trục Z địa phương của vật thể lực" +msgstr "Lực xoáy ốc quanh trục Z địa phương của đối tượng lực" msgid "Constant force along the force object's local Z axis" -msgstr "Lực hằng số hướng trục Z địa phương của vật thể lực" +msgstr "Lực bất biến dọc theo trục Z địa phương của đối tượng lực" msgid "2D" @@ -11852,23 +12774,23 @@ msgstr "2D" msgid "Apply force only in 2D" -msgstr "Chỉ áp dụng lực hướng 2D" +msgstr "Chỉ áp dụng lực trong 2D" msgid "Force gets absorbed by collision objects" -msgstr "Lực bị hấp thu bới vật thể va chạm" +msgstr "Lực bị hấp thụ bởi đối tượng va đập" msgid "Use Global Coordinates" -msgstr "Dùng Tọa Độ Toàn Cầu" +msgstr "Sử Dụng Tọa Độ Toàn Cầu" msgid "Use effector/global coordinates for turbulence" -msgstr "Dùng tọa độ đồ hiệu ứng/toàn cầu cho nhiễu loạn" +msgstr "Dùng các tọa độ của hiệu ứng viên/toàn cầu cho sự hỗn loạn" msgid "Gravity Falloff" -msgstr "Sự Giảm Hấp Dẫn" +msgstr "Suy Giảm của Trọng Lực" msgid "Multiply force by 1/distance²" @@ -11876,59 +12798,71 @@ msgstr "Nhân lực với 1/khoảng cách²" msgid "Based on distance/falloff it adds a portion of the entire path" -msgstr "Tùy khoảng cách/sự giảm, nó cộng thêm một khúc của toàn đường đi" +msgstr "Tùy khoảng cách/sự suy giảm mà nó thêm một đoạn của toàn bộ đường dẫn vào" msgid "Weights" -msgstr "Quyền Lượng" +msgstr "Trọng Lượng" msgid "Use curve weights to influence the particle influence along the curve" -msgstr "Dùng quyền lượng đường cong để ảnh hưởng sự ảnh hưởng của hạt trên đường cong" +msgstr "Dùng trọng lượng của đường cong để tác động ảnh hưởng của hạt trên đường cong" msgid "Use Max" -msgstr "Dùng Cực Đại" +msgstr "Sử Dụng Tối Đa" msgid "Use a maximum distance for the field to work" -msgstr "Dùng một khoảng cách cực đại cho sự tác dụng của trường" +msgstr "Dùng khoảng cách tối đa để trường hoạt động" msgid "Use Min" -msgstr "Dùng Cực Tiểu" +msgstr "Sử Dụng Tối Thiểu" + + +msgid "Use a minimum distance for the field's falloff" +msgstr "Sử dụng khoảng cách tối thiểu cho suy giảm dần của trường" msgid "Multiple Springs" -msgstr "Nhiều Lò Xo" +msgstr "Bội Số Lò Xo" + + +msgid "Every point is affected by multiple springs" +msgstr "Mỗi điểm chịu tác động của nhiều lò xo" msgid "Use Coordinates" -msgstr "Dùng Tọa Độ" +msgstr "Sử Dụng Tọa Độ" msgid "Use object/global coordinates for texture" -msgstr "Dùng tọa độ vật thể/toàn cầu cho chất liệu" +msgstr "Dùng tọa độ đối tượng/toàn cầu cho chất liệu" msgid "Use a maximum radial distance for the field to work" -msgstr "Dùng một khoảng cách tỏa tròn cực đại cho sự tác dụng của trường" +msgstr "Sử dụng khoảng cách tỏa tròn tối đa để trường hoạt động" + + +msgid "Use a minimum radial distance for the field's falloff" +msgstr "Sử dụng khoảng cách tỏa tròn tối thiểu cho suy giảm dần của trường" msgid "Root Texture Coordinates" -msgstr "Tọa Độ Họa Tết Rễ" +msgstr "Tọa Độ của Chất Liệu Gốc" msgid "Texture coordinates from root particle locations" -msgstr "Tọa độ chất liệu từ vị trí hạt rễ" +msgstr "Tọa độ chất liệu từ các vị trí hạt gốc" msgid "Apply Density" -msgstr "Áp Dụng Tỉ Trọng" +msgstr "Áp Dụng Độ Dày Đặc" msgid "Adjust force strength based on smoke density" -msgstr "Chỉnh sức lực tùy tỉ trọng khói" +msgstr "Điều chỉnh sức mạnh của lực dựa trên độ dày đặc của khói" msgid "Wind Factor" @@ -11936,7 +12870,7 @@ msgstr "Hệ Số Gió" msgid "How much the force is reduced when acting parallel to a surface, e.g. cloth" -msgstr "Mức lực được giảm khi đang tác động song song một bề mặt, ví dụ vải" +msgstr "Lượng lực giảm đi là bao nhiêu khi hành động song song với một bề mặt, ví dụ: vải vóc" msgid "Z Direction" @@ -11944,43 +12878,43 @@ msgstr "Hướng Z" msgid "Effect in full or only positive/negative Z direction" -msgstr "Hiệu ứng toàn phần hay chỉ hướng Z dương/âm" +msgstr "Hiệu ứng toàn phần hoặc chỉ trong chiều hướng Z dương/âm thôi" msgid "Both Z" -msgstr "Cả Z" +msgstr "Cả Hai Chiều Z" msgid "File Select Asset Filter" -msgstr "Bộ Lọc Tích Sản Cho Chọn Tập Tin" +msgstr "Thanh Lọc Tài sản Lựa Chọn Tập Tin" msgid "Which asset types to show/hide, when browsing an asset library" -msgstr "Hiện/ẩn loại tích sản nào, khi trình duyệt một thư viện tích sản" +msgstr "Thể loại tài sản nào để hiện/ẩn khi duyệt một thư viện tài sản" msgid "Show Armature data-blocks" -msgstr "Hiện các cục dữ liệu Cốt" +msgstr "Hiển thị các khối dữ liệu về Khung Cốt" msgid "Show Brushes data-blocks" -msgstr "Hiện các cục dữ liệu Bút" +msgstr "Hiển thị các khối dữ liệu về Đầu Bút" msgid "Show Cache File data-blocks" -msgstr "Hiện các cục dữ liệu Tập Tintập tin Đệm Chứa" +msgstr "Hiển thị các khối dữ liệu về Tập Tin Bộ Đệm Nhớ" msgid "Show Camera data-blocks" -msgstr "Hiện các cục dữ liệu Máy Quay Phim" +msgstr "Hiển thị các khối dữ liệu về Máy Quay Phim" msgid "Show Curve data-blocks" -msgstr "Hiện các cục dữ liệu Đường Cong" +msgstr "Hiển thị các khối dữ liệu về Đường Cong" msgid "Show/hide Curves data-blocks" -msgstr "Hiện/ẩn các cục dữ liệu Đường Cong" +msgstr "Hiển thị / ẩn giấu khối dữ liệu Đường Cong" msgid "Fonts" @@ -11988,127 +12922,127 @@ msgstr "Phông" msgid "Show Font data-blocks" -msgstr "Hiện các cục dữ liệu Phông" +msgstr "Hiển thị các khối dữ liệu về Phông Chữ" msgid "Show Grease pencil data-blocks" -msgstr "Hiện các cục dữ liệu Bút Sáp" +msgstr "Hiển thị các khối dữ liệu về Bút Chì Dầu" msgid "Show Image data-blocks" -msgstr "Hiện các cục dữ liệu Ảnh" +msgstr "Hiển thị các khối dữ liệu về Hình Ảnh" msgid "Show Lattice data-blocks" -msgstr "Hiện các cục dữ liệu Lưới Rào" +msgstr "Hiển thị các khối dữ liệu về Lưới Rào" msgid "Show Light data-blocks" -msgstr "Hiện các cục dữ liệu Đèn" +msgstr "Hiển thị các khối dữ liệu về Ánh Sáng" msgid "Show Light Probe data-blocks" -msgstr "Hiện các cục dữ liệu Quang Kế" +msgstr "Hiển thị các khối dữ liệu về Bộ Thăm Dò Ánh Sáng" msgid "Freestyle Linestyles" -msgstr "Phong Cách Nét Của Phong Cách Tự Do" +msgstr "Phong Cách Đường Nét Tự Do" msgid "Show Freestyle's Line Style data-blocks" -msgstr "Hiện/ẩn cục dữ liệu Phong Cách Nét Tự Do" +msgstr "Hiển thị các khối dữ liệu về Phong Cách Nét Vẽ PCTD" msgid "Show Mask data-blocks" -msgstr "Hiện các cục dữ liệu Mặt Nạ" +msgstr "Hiển thị các khối dữ liệu về Màn Chắn Lọc" msgid "Show Mesh data-blocks" -msgstr "Hiện các cục dữ liệu Mạng Lưới" +msgstr "Hiển thị các khối dữ liệu về Khung Lưới" msgid "Show Metaball data-blocks" -msgstr "Hiện các cục dữ liệu Siêu Cầu" +msgstr "Hiển thị các khối dữ liệu về Siêu Cầu" msgid "Show Movie Clip data-blocks" -msgstr "Hiện các cục dữ liệu Đoạn Phim" +msgstr "Hiển thị các khối dữ liệu về Đoạn Phim" msgid "Show Paint Curve data-blocks" -msgstr "Hiện các cục dữ liệu Đường Cong Sơn" +msgstr "Hiển thị các khối dữ liệu về Đường Cong Sơn" msgid "Show Palette data-blocks" -msgstr "Hiện các cục dữ liệu Bảng Màu" +msgstr "Hiển thị các khối dữ liệu về Bảng Pha Màu" msgid "Particles Settings" -msgstr "Cài Đặt Hạt" +msgstr "Sắp Đặt Hạt" msgid "Show Particle Settings data-blocks" -msgstr "Hiện các cục dữ liệu Cài Đặt Hạt" +msgstr "Hiển thị các khối dữ liệu về Sắp Đặt Hạt" msgid "Show/hide Point Cloud data-blocks" -msgstr "Hiện/ẳn các cục dữ liệu Mây Điểm" +msgstr "Ẩn/Hiện khối dữ liệu Đám Mây Điểm" msgid "Show Scene data-blocks" -msgstr "Hiện các cục dữ liệu Cảnh" +msgstr "Hiển thị các khối dữ liệu về Cảnh" msgid "Show Sound data-blocks" -msgstr "Hiện các cục dữ liệu Âm Thanh" +msgstr "Hiển thị các khối dữ liệu về Âm Thanh" msgid "Show Speaker data-blocks" -msgstr "Hiện cácn cục dữ liệu Loa" +msgstr "Hiển thị các khối dữ liệu về Loa Âm Thanh" msgid "Show Text data-blocks" -msgstr "Hiện các cục dữ liệu Văn Bản" +msgstr "Hiển thị các khối dữ liệu về Văn Bản" msgid "Show Texture data-blocks" -msgstr "Hiện các cục dữ liệu Chất Liệu" +msgstr "Hiển thị các khối dữ liệu về Chất Liệu" msgid "Show/hide Volume data-blocks" -msgstr "Hiện/ẳn các cục dữ liệu Thể Tích" +msgstr "Ẩn/Hiện khối dữ liệu Thể Tích" msgid "Show workspace data-blocks" -msgstr "Hiện các cục dữ liệu công trường" +msgstr "Hiển thị các khối dữ liệu về không gian làm việc" msgid "Show Action data-blocks" -msgstr "Hiện các cục dữ liệu Hành Động" +msgstr "Hiển thị các khối dữ liệu về Hành Động" msgid "Show Collection data-blocks" -msgstr "Hiện các cục dữ liệu Sưu Tập" +msgstr "Hiển Thị Bộ Sưu Tập của các khối dữ liệu" msgid "Show Material data-blocks" -msgstr "Hiện các cục dữ liệu vật Liệu" +msgstr "Hiển thị các khối dữ liệu về Nguyên Vật Liệu" msgid "Node Trees" -msgstr "Cây Giao Điểm" +msgstr "Cây Nút" msgid "Show Node Tree data-blocks" -msgstr "Hiện các cục dữ liệu Cây Giao Điểm" +msgstr "Hiển thị các khối dữ liệu về Cây Nút" msgid "Show Object data-blocks" -msgstr "Hiện các cục dữ liệu Vật Thể" +msgstr "Hiển thị các khối dữ liệu về Đối Tượng" msgid "Show World data-blocks" -msgstr "Hiện các cục dữ liệu Thế Giới" +msgstr "Hiển thị các khối dữ liệu về Thế Giới" msgid "File Select Parameters" @@ -12116,7 +13050,7 @@ msgstr "Tham Số Lựa Chọn Tập Tin" msgid "Whether this path is currently reachable" -msgstr "Hiện tại có thể đến đường dẫn này hay không" +msgstr "Hiện tại có thể đến được đường dẫn này hay không" msgid "Save" @@ -12124,31 +13058,43 @@ msgstr "Lưu" msgid "Whether this path is saved in bookmarks, or generated from OS" -msgstr "Đường dẫn này được lưu trong dấu sách, hay được chế tạo từ hệ điều hành" +msgstr "Hoặc là đường dẫn này được lưu trong các dấu trang, hay được phát sinh từ Hệ Điều Hành mà ra" + + +msgid "File Extensions" +msgstr "Đuôi Tập Tin" + + +msgid "Operator" +msgstr "Thao Tác" + + +msgid "Label" +msgstr "Nhãn Hiệu" msgid "File Select Entry" -msgstr "Chọn Nhập Tập Tin" +msgstr "Mục Tập Tin Chọn" msgid "A file viewable in the File Browser" -msgstr "Một tập tin có thể xem trong trong Trình Duyệt Tập Tin" +msgstr "Một tập tin có thể duyệt thảo trong Trình Duyệt Tập Tin" msgid "Asset data, valid if the file represents an asset" -msgstr "Dữ liệu tích sản, hợp lệ nếu tập tin là một tích sản" +msgstr "Dữ liệu tài sản. Hợp lệ nếu tập tin đại diện một tài sản nào đó" msgid "Icon ID" -msgstr "Số Biểu Tượng" +msgstr "ID của Biểu Tượng" msgid "Unique integer identifying the preview of this file as an icon (zero means invalid)" -msgstr "Số nguyên độc đáo cho phát hiện dự khán của tập tin này bằng một biểu tượng (số không nghĩa là không hợp lệ)" +msgstr "Số nguyên độc nhất vô nhị, dùng để nhận dạng bản xem trước của tập tin này trong hình biểu tượng (zero (0) có nghĩa là không hợp lệ)" msgid "Relative Path" -msgstr "Đường Dần Tương Đối" +msgstr "Đường Dẫn Tương Đối" msgid "Path relative to the directory currently displayed in the File Browser (includes the file name)" @@ -12156,19 +13102,19 @@ msgstr "Đường dẫn tương đối với thư mục đang hiển thị trong msgid "File Select ID Filter" -msgstr "Bộ Lọc ID Để Chọn Tập Tin" +msgstr "Thanh Lọc ID trong Lựa Chọn Tập Tin" msgid "Which ID types to show/hide, when browsing a library" -msgstr "Hiện/ẩn loại ID nào khi trình duyệt một thư viện" +msgstr "Loại ID nào để hiện/ẩn khi duyệt trình một thư viện" msgid "Animations" -msgstr "Hoạt Hình" +msgstr "Hoạt Họa" msgid "Show animation data" -msgstr "Hiện dữ liệu hoạt hình" +msgstr "Hiển thị dữ liệu hoạt họa" msgid "Environment" @@ -12176,39 +13122,43 @@ msgstr "Môi Trường" msgid "Show worlds, lights, cameras and speakers" -msgstr "Hiện các thế giơi, đèn, máy quay phim và loa" +msgstr "Hiển thị thế giới, các nguồn sáng, máy quay phim và các loa âm thanh" msgid "Show meshes, curves, lattice, armatures and metaballs data" -msgstr "Hiện dữ liệu của các mạng lưới, đường cong, lưới rào, cốt, và siêu cầu" +msgstr "Hiển thị dữ liệu về khung lưới, đường cong, lưới rào, khung cốt và siêu cầu" msgid "Images & Sounds" -msgstr "Ảnh & Âm Thanh" +msgstr "Hình Ảnh & Âm Thanh" msgid "Show images, movie clips, sounds and masks" -msgstr "Hiện các ảnh, đoạn phim, âm thanh và mặt nạ " +msgstr "Hiển thị các hình ảnh, đoạn phim, âm thanh và màn chắn lọc" msgid "Miscellaneous" -msgstr "Lạt Vạt" +msgstr "Linh Tinh" msgid "Show other data types" -msgstr "Hiện các loại dữ liệu khác" +msgstr "Hiển thị các thể loại dữ liệu khác" msgid "Objects & Collections" -msgstr "Các Vật Thể & Sưu Tập" +msgstr "Đối Tượng và Bộ Sưu Tập" msgid "Show objects and collections" -msgstr "Hiện các vật thể và sưu tập" +msgstr "Hiển thị các đối tượng và các bộ sưu tập" msgid "Show scenes" -msgstr "Hiện các cảnh" +msgstr "Hiển thị các cảnh" + + +msgid "Show materials, node-trees, textures and Freestyle's line-styles" +msgstr "Hiển thị các nguyên vật liệu, cây nút, chất liệu và kiểu đường nét Phong Cách Tự Do" msgid "Directory" @@ -12216,15 +13166,39 @@ msgstr "Thư Mục" msgid "Directory displayed in the file browser" -msgstr "Thư mục được hiển thị trong trình duyệt" +msgstr "Thư mục được hiển thị trong trình duyệt tập tin" msgid "Display Size" -msgstr "Khổ Màn" +msgstr "Kích Thước Hiển Thị" + + +msgid "Change the size of thumbnails" +msgstr "Thay đổi kích thước hình thu nhỏ" + + +msgid "Change the size of thumbnails in discrete steps" +msgstr "Thay đổi kích thước hình thu nhỏ theo từng bước riêng biệt" + + +msgid "Tiny" +msgstr "Tí Tẹo" + + +msgid "Small" +msgstr "Nhỏ" msgid "Medium" -msgstr "Trung bình" +msgstr "Trung Bình" + + +msgid "Big" +msgstr "Lớn" + + +msgid "Large" +msgstr "To" msgid "Display Mode" @@ -12232,51 +13206,59 @@ msgstr "Chế Độ Hiển Thị" msgid "Display mode for the file list" -msgstr "Chế độ hiển thị của danh sách tập tin" +msgstr "Chế độ hiển thị danh sách tập tin" msgid "Vertical List" -msgstr "Danh Sách Dọc" +msgstr "Bảng Liệt Kê theo Chiều Dọc" msgid "Display files as a vertical list" -msgstr "Hiển thị các tập tin bằng một danh sách dọc" +msgstr "Hiển thị các tập tin như một bảng liệt kê theo chiều dựng đứng" msgid "Horizontal List" -msgstr "Danh Sách Ngang" +msgstr "Bảng Liệt Kê theo Chiều Ngang" msgid "Display files as a horizontal list" -msgstr "Hiển thị các tập tin bằng một danh sách ngang" +msgstr "Hiển thị các tập tin như một bảng liệt kê theo chiều ngang" msgid "Thumbnails" -msgstr "Ảnh Tem" +msgstr "Hình Thu Nhỏ" msgid "Display files as thumbnails" -msgstr "Hiển thị tập tin bằng ảnh tem" +msgstr "Hiển thị tập tin như hình thu nhỏ" msgid "File Name" -msgstr "Tên Tập Tintập tin" +msgstr "Tên Tập Tin" msgid "Active file in the file browser" -msgstr "Tập tin hoạt động trong trình duyệt tập tin" +msgstr "Tập tin đang hoạt động trong trình duyệt" msgid "Extension Filter" -msgstr "Lọc Đuôi Tập Tin" +msgstr "Thanh Lọc Đuôi Tập Tin" msgid "UNIX shell-like filename patterns matching, supports wildcards ('*') and list of patterns separated by ';'" -msgstr "Tìm kiếm gương mẫu kiểu giống trình bao UINX, được hỗ trợ ký tự đại diện ('*') và danh sách gương mẫu được chẻ bằng ';'" +msgstr "Phương pháp so trùng mẫu tên tập tin giống với trình giao diện dòng lệnh của UNIX, hỗ trợ các ký tự đại điện dấu sao ('*') và danh sách của các kiểu mẫu, phân cách bởi dấu chấn phẩy ';'" msgid "Filter ID Types" -msgstr "Lọc Loại ID" +msgstr "Thanh Lọc Thể Loại ID" + + +msgid "Name or Tag Filter" +msgstr "Thanh Lọc theo Tên hoặc Thẻ" + + +msgid "Filter by name or tag, supports '*' wildcard" +msgstr "Thanh lọc theo tên hoặc thẻ, hỗ trợ ký tự đại diện '*'" msgid "Recursion" @@ -12284,11 +13266,11 @@ msgstr "Đệ Quy" msgid "Numbers of dirtree levels to show simultaneously" -msgstr "Số lượng thần cây thư mục để hiện cùng một lúc" +msgstr "Số lượng tầng cây thư mục hiển thị cùng một lúc" msgid "Only list current directory's content, with no recursion" -msgstr "Chỉ làm danh sách cho nội dung thư mục hiện tại, không có đệ quy" +msgstr "Chỉ liệt kê nội dung thư mục hiện tại mà thôi, không tiến hành đệ quy xuống tầng dưới" msgid "Blend File" @@ -12296,51 +13278,51 @@ msgstr "Tập Tin Blend" msgid "List .blend files' content" -msgstr "Làm danh sách cho nội dung các tập tin .blend" +msgstr "Liệt kê nội dung tập tin .blend" msgid "One Level" -msgstr "Một Thần" +msgstr "Một Tầng Cấp" msgid "List all sub-directories' content, one level of recursion" -msgstr "Làm danh sách cho nội dung của hết hạ thư mục, một thần đệ quy" +msgstr "Liệt kê nội dung của toàn bộ các thư mục nhánh, một tầng đệ quy" msgid "Two Levels" -msgstr "Hai Tầng" +msgstr "Hai Tầng Cấp" msgid "List all sub-directories' content, two levels of recursion" -msgstr "Làm danh sách cho nội dung của hết hạ thư mục, hai thần đệ quy" +msgstr "Liệt kê nội dung của toàn bộ các thư mục nhánh, hai tầng đệ quy" msgid "Three Levels" -msgstr "Ba Tầng" +msgstr "Ba Tầng Cấp" msgid "List all sub-directories' content, three levels of recursion" -msgstr "Làm danh sách cho nội dung của hết hạ thư mục, ba thần đệ quy" +msgstr "Liệt kê nội dung của toàn bộ các thư mục nhánh, ba tầng đệ quy" msgid "File Modification Date" -msgstr "Ngày Tháng Chỉnh Sửa Tập Tin" +msgstr "Ngày Tập Tin Thay Đổi" msgid "Show a column listing the date and time of modification for each file" -msgstr "Hiện một cột để chiếu ngày tháng và thời gian của chỉnh sửa từng tập tin" +msgstr "Hiển thị cột liệt kê ngày và giờ sửa đổi của mỗi tập tin" msgid "File Size" -msgstr "Kích Cỡ Tập Tin" +msgstr "Cỡ Tập Tin" msgid "Show a column listing the size of each file" -msgstr "Hiện một cột để chiếu kích cữ của mỗi tập tin" +msgstr "Hiển thị cột liệt kê kích cỡ của mỗi tập tin" msgid "Show hidden dot files" -msgstr "Hiện tập tin ẩn bắt đầu với dấu chấm (.*)" +msgstr "Hiển thị tập tin ẩn bắt đầu với dấu chấm (.*)" msgid "Sort" @@ -12348,263 +13330,283 @@ msgstr "Sắp Thứ Tự" msgid "Sort the file list alphabetically" -msgstr "Sắp thứ tự danh sách tập tin bằng thứ tự chữ cái" +msgstr "Sắp xếp bảng danh sách tập tin theo thứ tự chữ cái" msgid "Extension" -msgstr "Mở Rộng" +msgstr "Mở/Nới Rộng/Đuôi Định Dạng" msgid "Sort the file list by extension/type" -msgstr "Sắp thứ tự danh sách tập tin bằng đuôi/loại" +msgstr "Sắp xếp bảng liệt kê tập tin theo thứ tự alphabet của đuôi tập tin/thể loại" msgid "Modified Date" -msgstr "Ngày Tháng Sửa Đổi" +msgstr "Ngày Thay Đổi" msgid "Sort files by modification time" -msgstr "Sắp thứ tự bằng thời gian được đổi" +msgstr "Sắp xếp các tập tin theo thứ tự thời gian sửa đổi" msgid "Sort files by size" -msgstr "Sắp thứ từ bằng kích cỡ" +msgstr "Sắp xếp các tập tin theo thứ tự kích thước của tập tin" msgid "Title" -msgstr "Tựa" +msgstr "Đầu Đề" msgid "Title for the file browser" -msgstr "Tựa cho trình duyệt tập tin" +msgstr "Đầu đề cho trình duyệt tập tin" msgid "Filter Files" -msgstr "Lọc Tập Tin" +msgstr "Thanh Lọc Tập Tin" msgid "Enable filtering of files" -msgstr "Bật lọc tập tin" +msgstr "Cho phép thanh lọc các tập tin" msgid "Only Assets" -msgstr "Chỉ Tích Sản" +msgstr "Duy Tài Sản" msgid "Hide .blend files items that are not data-blocks with asset metadata" -msgstr "Ẩn mặt hàng tập tin .blend thì không phải là cục dữ liệu có siêu dữ liệu tích sản" +msgstr "Ẩn Giấu các mục tập tin .blend không phải là khối dữ liệu có siêu dữ liệu chỉ định nó là tài sản" msgid "Filter Blender Backup Files" -msgstr "Lọc Tập Tin Dự Phòng Blender" +msgstr "Thanh Lọc các Tập Tin Dự Phòng của Blender" msgid "Show .blend1, .blend2, etc. files" -msgstr "Hiện tập tin .blend1, .blend2, v.v." +msgstr "Hiển thị các tập tin .blend1, .blend2, vân vân" msgid "Filter Blender" -msgstr "Lọc Blender" +msgstr "Thanh Lọc Blender" msgid "Show .blend files" -msgstr "Hiện tập tin .blend" +msgstr "Hiển thị các tập tin .blend" msgid "Filter Blender IDs" -msgstr "Lọc Các ID Blender" +msgstr "Thanh Lọc các ID của Blender" msgid "Show .blend files items (objects, materials, etc.)" -msgstr "Hiện mặt hàng của tập tin .blend (vật thể, vật liệu, v.v.)" +msgstr "Hiển thị các phần tử của tập tin .blend (đối tượng, nguyên vật liệu, v.v.)" msgid "Filter Folder" -msgstr "Lọc Hồ Sơ" +msgstr "Thanh Lọc Danh Mục" msgid "Show folders" -msgstr "Hiện hồ sơ" +msgstr "Hiển thị các danh mục" msgid "Filter Fonts" -msgstr "Lọc Tập Tin Phông" +msgstr "Thanh Lọc Phông" msgid "Show font files" -msgstr "Hiện tập tin phông" +msgstr "Hiển thị các tập tin phông" msgid "Filter Images" -msgstr "Lọc Ảnh" +msgstr "Thanh Lọc Hình Ảnh" msgid "Show image files" -msgstr "Hiện tập tin ảnh" +msgstr "Hiển thị các tập tin hình ảnh" msgid "Filter Movies" -msgstr "Lọc Phim" +msgstr "Thanh Lọc Phim" msgid "Show movie files" -msgstr "Hiện tập tin phim" +msgstr "Hiển thị tập tin phim" msgid "Filter Script" -msgstr "Lọc Văn Thảo" +msgstr "Thanh Lọc Tập Lệnh" msgid "Show script files" -msgstr "Hiện tập tin văn thảo" +msgstr "Hiển thị tập tin tập lệnh" msgid "Filter Sound" -msgstr "Lọc Âm Thanh" +msgstr "Thanh Lọc Âm Thanh" msgid "Show sound files" -msgstr "Hiện tập tin âm thanh" +msgstr "Hiển thị tập tin âm thanh" msgid "Filter Text" -msgstr "Lọc Văn Bản" +msgstr "Thanh Lọc Văn Bản" msgid "Show text files" -msgstr "Hiện tập tin văn bản" +msgstr "Hiển thị tập tin văn bản" msgid "Filter Volume" -msgstr "Lọc Thể Tích" +msgstr "Thanh Lọc Thể Tích" msgid "Show 3D volume files" -msgstr "Hiện tập tin thể tích 3D" +msgstr "Hiển thị các tập tin thể tích 3D" msgid "Library Browser" msgstr "Trình Duyệt Thư Viện" +msgid "Whether we may browse Blender files' content or not" +msgstr "Chúng ta có thể duyệt thảo nội dung của tập tin .blend hay không" + + msgid "Reverse Sorting" -msgstr "Sắp Xếp Ngược" +msgstr "Đảo Ngược Thứ Tự Sắp Xếp" msgid "Sort items descending, from highest value to lowest" -msgstr "Sắp xếp mặt hàng từ giá trị lớn đến nhỏ" +msgstr "Sắp xếp các phần tử theo thứ tự đi xuống (descending), từ các giá trị cao nhất đến thấp nhất" msgid "Asset Select Parameters" -msgstr "Tham Số Lựa Chọn Tích Sản" +msgstr "Tham Số Lựa Chọn Tài Sản" msgid "Settings for the file selection in Asset Browser mode" -msgstr "Cài đặt cho lụa chọn tập tin trong chế độ Trình Duyệt Tích Sản" +msgstr "Các sắp đặt đối với việc lựa chọn tập tin trong chế độ Duyệt Thảo Tài Sản" msgid "The UUID of the catalog shown in the browser" -msgstr "UUID của danh mục được hiện trong trình duyệt" +msgstr "UUID (Universally Unique IDentifiers: Định danh duy nhất toàn cầu) của danh mục hiển thị trong trình duyệt" msgid "Filter Asset Types" -msgstr "Lọc Loại Tích Sản" +msgstr "Thể Loại Tài Sản Thanh Lọc" + + +msgid "Import Method" +msgstr "Phương Pháp Nhập Khẩu" msgid "Determine how the asset will be imported" -msgstr "Quyết định phương pháp nhập tích sản" +msgstr "Xác định phương pháp nhập khẩu tài sản" + + +msgid "Follow Preferences" +msgstr "Theo Cài Đặt Sở Thích" + + +msgid "Use the import method set in the Preferences for this asset library, don't override it for this Asset Browser" +msgstr "Sử dụng phương thức nhập khẩu cài đặt trong Cài Đặt Sở Thích cho thư viện tài sản này, không vượt quyền phương thức nhập khẩu cho Trình Duyệt Thảo Tài Sản này" msgid "Link" -msgstr "Liên Kết" +msgstr "Kết Nối" msgid "Import the assets as linked data-block" -msgstr "Nhập tích sản bằng cục dữ liệu được liên kết" +msgstr "Nhập khẩu tài sản dưới dạng khối dữ liệu kết nối" msgid "Append" -msgstr "Kèm" +msgstr "Bổ Sung" msgid "Import the assets as copied data-block, with no link to the original asset data-block" -msgstr "Nhập tích sản bằng cục dữ liệu được sao chép, không liên kết với cục dữ liệu tích sản ban đầu" +msgstr "Nhập khẩu tài sản tựa khối dữ liệu sao chép, không có liên kết gì với khối dữ liệu tài sản ban đầu cả" msgid "Append (Reuse Data)" -msgstr "Kèm (Sử Dụng Lại Dữ Liệu)" +msgstr "Bổ Sung (Tái Dụng Dữ Liệu)" msgid "Import the assets as copied data-block while avoiding multiple copies of nested, typically heavy data. For example the textures of a material asset, or the mesh of an object asset, don't have to be copied every time this asset is imported. The instances of the asset share the data instead" -msgstr "Khi nhập tích sản dùng cục dữ liệu được chép để tránh có nhiều bản sao của dữ liệu đệ quy, thường xuyên nặng nề. Ví dụ không cần chép các chất liệu của một tích sản vật liệu hay mạng lưới của một tích sản vật thể mỗi khi nhập tích sản này. Cho các thực thể của tích sản được chia sẻ dữ liệu" +msgstr "Nhập khẩu tài sản dưới dạng khối dữ liệu sao chép, trong khi tránh né tình trạng nhiều bản sao dữ liệu lồng nhau, thường là các dữ liệu nặng nề. Ví dụ: chất liệu của một tài sản vật liệu, hoặc khung lưới của một tài sản đối tượng, không cần phải sao chép mỗi khi tài sản này được nhập khẩu. Thay vào đó, các thực thể của tài sản chia sẻ (dùng chung) một dữ liệu" msgid "Float2 Attribute Value" -msgstr "Giá Trị Đặc Điểm 2 Số Dấu Phẩy Động" +msgstr "Giá Trị Thuộc Tính Float2" msgid "2D Vector value in geometry attribute" -msgstr "Giá trị vectơ 2D trong đặc điểm hình dạng" +msgstr "Giá trị véctơ 2D trong thuộc tính hình học" msgid "2D vector" -msgstr "Vectơ 2D" +msgstr "Véctơ 2D" msgid "Float Attribute Value" -msgstr "Giá Trị Đặc Điểm Dấu Phẩy Động" +msgstr "Tên Thuộc Tính STDPD" msgid "Floating-point value in geometry attribute" -msgstr "Giá trị dấu phẩy động trong đặc điểm hình dạng" +msgstr "Giá trị số thực trong thuộc tính hình học" msgid "Float Color Attribute Value" -msgstr "Giá Trị Đặc Điểm Màu Dấu Phẩy Động" +msgstr "Giá Trị Thuộc Tính Màu STDPD" msgid "Float Vector Attribute Value" -msgstr "Giá Trị Đặc Điểm Vectơ Dấu Phẩy Động" +msgstr "Giá Trị Thuộc Tính Véctơ STDPD" msgid "Vector value in geometry attribute" -msgstr "Giá trị vectơ trong đặc điểm hình dạng" +msgstr "Giá trị véctơ trong thuộc tính hình học" msgid "3D vector" -msgstr "Vectơ 3D" +msgstr "Véctơ 3D" + + +msgid "Read-Only Vector" +msgstr "Véctơ Duy Đọc" msgid "Domain Settings" -msgstr "Cài Đặt Phạm Vi" +msgstr "Sắp Đặt Phạm Vi" msgid "Fluid domain settings" -msgstr "Cài đặt phạm vi chất lỏng" +msgstr "Sắp Đặt của Phạm Vi Chất Lỏng" msgid "Margin added around fluid to minimize boundary interference" -msgstr "Thêm lề quanh chất lỏng để giảm sự ảnh hưởng của ranh giới" +msgstr "Mép lề bao quanh chất lưu chảy để tối giảm sự giao thoa của ranh giới" msgid "Minimum amount of fluid a cell can contain before it is considered empty" -msgstr "Mức chât lỏng cực tiểu một tế bào được chứa trước nó được chấp nhận là trống rỗng" +msgstr "Lượng chất lỏng tối thiểu cần có, còn không thì tế bào sẽ được coi là trống rỗng" msgid "Additional" -msgstr "Thêm" +msgstr "Gia Lượng" msgid "Maximum number of additional cells" -msgstr "Số lượng tế bào thêm tối đa" +msgstr "Số lượng ô (tế bào) thêm tối đa" msgid "Buoyancy Density" -msgstr "Tỉ Trọng Lực Nổi" +msgstr "Tỷ Trọng Lực Nổi" msgid "Buoyant force based on smoke density (higher value results in faster rising smoke)" -msgstr "Lực nổi tùy tỉ trọng khói (giá trị càng cao khói nổi lôn càng nhanh)" +msgstr "Lực nổi dựa trên độ dày đặc của khói (giá trị cao hơn sẽ làm cho khói bay lên nhanh hơn)" msgid "Buoyancy Heat" @@ -12612,91 +13614,91 @@ msgstr "Nhiệt Lực Nổi" msgid "Buoyant force based on smoke heat (higher value results in faster rising smoke)" -msgstr "Lực nổi tùy nhiệt của khói (giá trị càng cao khói bay lên càng lẹ) " +msgstr "Lực nổi dựa trên nhiệt của khói (giá trị cao hơn sẽ làm cho khói bay lên nhanh hơn)" msgid "Speed of the burning reaction (higher value results in smaller flames)" -msgstr "Tốc độ của phản ứng cháy (giá trị càng lớn ngón lửa càng nhỏ)" +msgstr "Tốc độ của phản ứng đốt cháy (giá trị cao hơn làm cho lửa yếu đi" msgid "Select the file format to be used for caching volumetric data" -msgstr "Chọn định dạng tập tin để dùng cho chứa dữ liệu thể tích" +msgstr "Chọn định dạng tập tin để lưu dữ liệu thể tích trong bộ nhớ đệm" msgid "Cache directory" -msgstr "Mục lục đệm chứa" +msgstr "Thư Mục Bộ Nhớ Đệm" msgid "Directory that contains fluid cache files" -msgstr "Mục lục có các tập tin đệm chứa chất lỏng" +msgstr "Thư mục chứa các tập tin bộ nhớ đệm về chất lỏng" msgid "End" -msgstr "Kết Thúc" +msgstr "Cuối/Kết Thúc" msgid "Frame on which the simulation stops. This is the last frame that will be baked" -msgstr "Bức ảnh cho nghỉ mô phỏng. Cái này là bức ảnh cuối được nướng" +msgstr "Khung hình nơi mô phỏng kết thúc. Đây là khung hình cuối cùng sẽ được nướng" msgid "Frame offset that is used when loading the simulation from the cache. It is not considered when baking the simulation, only when loading it" -msgstr "Dịch bức ảnh được dùng khi nhập mô phỏng từ đệm chứa. Không được sử dụng khi đang nướng mô phỏng, chỉ khi nhập nó" +msgstr "Độ dịch chuyển khung hình được sử dụng khi nạp mô phỏng vào từ bộ đệm nhớ. Nó sẽ không được xem xét đến khi nướng mô phỏng, song chỉ khi nạp vào thôi" msgid "Start" -msgstr "Bắt Đầu" +msgstr "Khởi/Đầu" msgid "Frame on which the simulation starts. This is the first frame that will be baked" -msgstr "Bức ảnh cho khởi động mô phỏng. Cái này là bức ảnh đầu được nướng" +msgstr "Khung hình nơi mô phỏng bắt đầu. Đây là khung đầu tiên sẽ được nướng" msgid "Select the file format to be used for caching surface data" -msgstr "Chọn định dạng tập tin để dùng cho chứa dữ liệu bề mặt" +msgstr "Chọn định dạng tập tin để lưu dữ liệu bề mặt trong bộ nhớ đệm" msgid "Select the file format to be used for caching noise data" -msgstr "Chọn định dạng tập tin để dùng cho chứa dữ liệu huyên náo" +msgstr "Chọn định dạng tập tin để lưu dữ liệu nhiễu trong bộ nhớ đệm" msgid "Select the file format to be used for caching particle data" -msgstr "Chọn định dạng tập tin để dùng cho chứa dữ liệu hạt" +msgstr "Chọn định dạng tập tin để lưu dữ liệu hạt trong bộ nhớ đệm" msgid "Resumable" -msgstr "Có Thể Khởi Động Lại" +msgstr "Có Thể Tái Phục Hồi và Tiếp Tục" msgid "Additional data will be saved so that the bake jobs can be resumed after pausing. Because more data will be written to disk it is recommended to avoid enabling this option when baking at high resolutions" -msgstr "Chứa dữ liệu thêm cho có thể khởi động lại công việc nướng sau dừng lại. Bởi vì cái này lưu dữ liệu nhiều hơn vào đĩa, khuyến kích nên không bậc cái này nếu nướng đồ có độ phân giải cao" +msgstr "Dữ liệu bổ sung sẽ được lưu lại để có thể tiếp tục các công việc nướng sau khi tạm dừng. Vì sẽ có nhiều dữ liệu hơn được ghi vào đĩa, cho nên khuyên hãy tránh bật tùy chọn này lên khi nướng ở độ phân giải cao" msgid "Change the cache type of the simulation" -msgstr "Đổi loại đệm chứa của mô phỏng" +msgstr "Đổi thể loại bộ nhớ đệm của mô phỏng" msgid "Replay" -msgstr "Hát Lại" +msgstr "Chơi Lại" msgid "Use the timeline to bake the scene" -msgstr "Dùng thời lịch để nướng cảnh" +msgstr "Sử dụng dòng thời gian để nướng cảnh" msgid "Modular" -msgstr "Kiểu Mô Đun" +msgstr "Mô-Đun-Hóa" msgid "Bake every stage of the simulation separately" -msgstr "Nướng riêng mỗi bước của mô phỏng" +msgstr "Nướng mỗi giai đoạn của mô phỏng riêng biệt" msgid "Bake all simulation settings at once" -msgstr "Nướng tất cả cài đặt của mô phỏng một lượt" +msgstr "Nướng toàn bộ các sắp đặt của mô phỏng cùng một lúc" msgid "Cell Size" -msgstr "Kích Cỡ Tế Bào" +msgstr "Kích Thước Ô" msgid "CFL" @@ -12704,23 +13706,23 @@ msgstr "CFL" msgid "Maximal velocity per cell (greater CFL numbers will minimize the number of simulation steps and the computation time.)" -msgstr "Vật tốc cực đại từng tế bào (số CFL lớn hơn sẽ giảm số lượng bước và thời gian tính toán)" +msgstr "Tốc độ tối đa trên mỗi tế bào (số CFL lớn hơn sẽ giảm thiểu số bước mô phỏng và thời gian tính toán.)" msgid "Clipping" -msgstr "Cắt" +msgstr "Cắt Xén" msgid "Value under which voxels are considered empty space to optimize rendering" -msgstr "Nếu thể thích tử nhỏ hơn giá trị này, nó được chấp nhận là không gian trống rỗng cho tăng hiệu suất kết xuất" +msgstr "Các thể tích tử có giá trị thấp hơn giá trị này sẽ được coi là khoảng không trống rỗng. Sử dụng giá trị này để tối ưu hóa quá trình kết xuất" msgid "Color Grid" -msgstr "Đồ Thị Màu" +msgstr "Khung Lưới Đồ Thị Màu" msgid "Smoke color grid" -msgstr "Đồ thị màu của khói" +msgstr "Khung lưới đồ thị màu của khói" msgid "Field" @@ -12728,43 +13730,43 @@ msgstr "Trường" msgid "Simulation field to color map" -msgstr "Trường mô phỏng đến ánh xạ màu" +msgstr "Trường mô phỏng thành ánh xạ màu sắc" msgid "Multiplier for scaling the selected field to color map" -msgstr "Hệ số nhân cho phóng to trường được chọn đến ánh xạ màu" +msgstr "Hệ số nhân để đổi tỷ lệ ô được chọn sang ánh xạ màu sắc" msgid "Clear In Obstacle" -msgstr "Xóa Trong Trở Ngại" +msgstr "Xóa Bên Trong Trướng Ngại Vật" msgid "Delete fluid inside obstacles" -msgstr "Xóa chất lỏng trong các trở ngại" +msgstr "Xóa chất lỏng bên trong trướng ngại vật" msgid "Density Grid" -msgstr "Đồ Thị Tỉ Trọng" +msgstr "Khung Lưới Đồ Thị Mật Độ" msgid "Smoke density grid" -msgstr "Đồ thị tỉ trọng của khói" +msgstr "Khung lưới đồ thị mật độ của khói" msgid "Interpolation method to use for smoke/fire volumes in solid mode" -msgstr "Phương pháp suy nội để sùng cho thể tích khói/lửa trong chế độ rắn" +msgstr "Phương pháp nội suy sử dụng cho thể tích khói/lửa trong chế độ lập thể" msgid "Good smoothness and speed" -msgstr "Mịn và tốc độ nhiều" +msgstr "Độ mịn khá tốt và tốc độ cũng nhanh" msgid "Cubic" -msgstr "Lập Phương" +msgstr "Lập Phương/Bậc Ba" msgid "Smoothed high quality interpolation, but slower" -msgstr "Suy nội mịn chất lượng cao, mà chậm hơn" +msgstr "Nội suy mịn màng với chất lượng cao, nhưng chậm hơn" msgid "Closest" @@ -12772,43 +13774,43 @@ msgstr "Gần Nhất" msgid "No interpolation" -msgstr "Không suy nội" +msgstr "Không nội suy" msgid "Thickness of smoke display in the viewport" -msgstr "Độ đục của khói được hiển thị trong màn chiếu" +msgstr "Độ dày đặc của khói hiển thị trong cổng nhìn" msgid "Dissolve Speed" -msgstr "Tốc Độ Hòa Tan" +msgstr "Tốc Độ Tiêu Hủy" msgid "Determine how quickly the smoke dissolves (lower value makes smoke disappear faster)" -msgstr "Xác định tốc độ sự hòa tan của khói (gí trị càng thấp làm khói biến mất càng nhanh)" +msgstr "Xác định tốc độ khói tiêu tan (giá trị thấp sẽ làm cho khói biến mất nhanh hơn)" msgid "res" -msgstr "Độ phân giải" +msgstr "độ phân giải" msgid "Smoke Grid Resolution" -msgstr "Độ Phân Giải Đồ Thị Khói" +msgstr "Độ Phân Giải của Khung Lưới Đồ Thị Khói" msgid "Domain Type" -msgstr "Loại Phạm Vi" +msgstr "Thể Loại Phạm Vi" msgid "Change domain type of the simulation" -msgstr "Đổi loại phạm vi của mô phỏng" +msgstr "Đổi thể loại phạm vi của mô phỏng" msgid "Gas" -msgstr "Chất Khí" +msgstr "Thể Khí" msgid "Create domain for gases" -msgstr "Chế tạo phạm vi cho chất khí" +msgstr "Kiến tạo phạm vi cho các thể khí" msgid "Liquid" @@ -12816,31 +13818,31 @@ msgstr "Chất Lỏng" msgid "Create domain for liquids" -msgstr "Chế tạo phạm vi cho chất lỏng" +msgstr "Kiến tạo phạm vi cho các loại chất lỏng" msgid "Export Mantaflow Script" -msgstr "Xuất Văn Thảo Mantaflow" +msgstr "Xuất Khẩu Tập Lệnh Mantaflow" msgid "Generate and export Mantaflow script from current domain settings during bake. This is only needed if you plan to analyze the cache (e.g. view grids, velocity vectors, particles) in Mantaflow directly (outside of Blender) after baking the simulation" -msgstr "Chế tạo và xuất văn thảo Mantaflow từ cài đặt của phạm vi hiện tại khi đang nướng. Cái này chỉ cần khi bạn nghĩ phân tích đệm chứa (ví dụ xem đồ thị, vectơ vận tốc, hạt) trong Mantaflow trực tiếp (ngoài Blender) sau được nướng mô phỏng" +msgstr "Sinh tạo và xuất khẩu tập lệnh Mantaflow từ các sắp đặt của phạm vi (*domain*) hiện tại, trong khi đang nướng. Cái này chỉ cần thiết nếu bạn dự định phân tích bộ đệm nhớ (chẳng hạn, xem khung lưới đồ thị, xem các véctơ vận tốc, hoặc xem các hạt) trực tiếp, nội trong Mantaflow, (bên ngoài Blender) sau khi nướng mô phỏng" msgid "Flame Grid" -msgstr "Đồ Thị Ngón Lửa" +msgstr "Khung Lưới Đồ Thị Lửa" msgid "Smoke flame grid" -msgstr "Đồ thị lửa khói" +msgstr "Khung Lưới Đồ Thị lửa của khói" msgid "Minimum temperature of the flames (higher value results in faster rising flames)" -msgstr "Nhiệt độ cực tiểu của ngón lửa (giá trị càng cao ngón lửa sẽ bay lên càng nhanh)" +msgstr "Nhiệt độ tối thiểu của lửa (giá trị cao sẽ làm cho lưỡi lửa bùng lên nhanh hơn" msgid "Maximum temperature of the flames (higher value results in faster rising flames)" -msgstr "Nhiệt độ cực đại của ngón lửa (giá trị càng cao ngón lửa sẽ bay lên càng nhanh)" +msgstr "Nhiệt độ tối đa của lửa (giá trị cao sẽ làm cho lưỡi lửa bùng lên nhanhh)" msgid "Smoke" @@ -12848,7 +13850,7 @@ msgstr "Khói" msgid "Amount of smoke created by burning fuel" -msgstr "Mức khói nhiên liệu cháy được chế tạo bằng đốt nhiên liệu" +msgstr "Lượng khói mà nhiên liệu cháy sẽ sản xuất" msgid "Smoke Color" @@ -12856,71 +13858,71 @@ msgstr "Màu Khói" msgid "Color of smoke emitted from burning fuel" -msgstr "Màu khói phát từ nhiên liệu cháy" +msgstr "Màu khói phát ra từ nhiên liệu cháy" msgid "Vorticity" -msgstr "Độ Xoáy" +msgstr "Lốc Xoáy" msgid "Additional vorticity for the flames" -msgstr "Thêm độ xoáy cho ngón lửa" +msgstr "Thêm lốc xoáy cho lửa" msgid "FLIP Ratio" -msgstr "Tỉ Số FLIP" +msgstr "Tỷ Số FLIP" msgid "PIC/FLIP Ratio. A value of 1.0 will result in a completely FLIP based simulation. Use a lower value for simulations which should produce smaller splashes" -msgstr "Tỉ Số PIC/FLIP. Dùng giá trị bằng 1.0 để được mô phỏng cơ sở FLIP. Dùng một gía trị nhỏ hơn cho mô phỏng nên dăn nước ít hơn" +msgstr "Tỷ số PIC/FLIP. Giá trị 1 sẽ làm cho sự mô phỏng hoàn toàn dựa trên FLIP. Dùng giá trị thấp hơn để mô phỏng tạo lượng bắn tóe ít hơn" msgid "Fluid Collection" -msgstr "Sưu Tập Chất Lỏng" +msgstr "Bộ Sưu Tập Chất Lỏng" msgid "Limit fluid objects to this collection" -msgstr "Hạn chế vật thể chất lỏng đến nhóm này" +msgstr "Chỉ cho phép các đối tượng chất lỏng hoạt động trong nhóm này mà thôi" msgid "Force Collection" -msgstr "Sưu Tập Lực" +msgstr "Bộ Sưu Tập Lực" msgid "Limit forces to this collection" -msgstr "Hạn chế lực chỉ được tác dụng trong sưu tập này" +msgstr "Giới hạn các lực hoạt động trong bộ sưu tập này mà thôi" msgid "Obstacle Distance" -msgstr "Khoảng Cách Trở Ngại" +msgstr "Khoảng Cách Trướng Ngại Vật" msgid "Determines how far apart fluid and obstacle are (higher values will result in fluid being further away from obstacles, smaller values will let fluid move towards the inside of obstacles)" -msgstr "Cho xác định khoảng cách giữa chất lỏng và trở ngại (giá trị cao giữ chất lỏng xa từ trở ngại, giá trị thấp cho chất lỏng vào trở ngại)" +msgstr "Xác định khoảng cách giữa chất lỏng và trướng ngại vật là xa bao nhiêu (giá trị cao hơn sẽ cho kết quả là chất lỏng sẽ nằm xa khỏi trướng ngại vật hơn, giá trị nhỏ hơn sẽ làm cho chất lỏng di chuyển vào bên trong các trướng ngại vật)" msgid "Obstacle Threshold" -msgstr "Ngưỡng Trở Ngại" +msgstr "Ngưỡng của Trướng Ngại Vật" msgid "Determines how much fluid is allowed in an obstacle cell (higher values will tag a boundary cell as an obstacle easier and reduce the boundary smoothening effect)" -msgstr "Quyết định số lượng chất lỏng được vào một tế bào trở ngại (giá trị càng cao ký dấu một tế bào ranh giới là một tế bào dễ hơn và giảm hiệu ứng mịn hóa ranh giới)" +msgstr "Xác định lượng chất lỏng cho phép trong một tế bào chướng ngại vật (giá trị cao sẽ đánh dấu một tế bào ranh giới là một chướng ngại vật dễ hơn và thuyên giảm hiệu ứng làm mịn ở đường biên)" msgid "Gravity in X, Y and Z direction" -msgstr "Hấp dẫn cho hướng X, Y, Z" +msgstr "Trọng lực trong các hướng X, Y, Z" msgid "Cell Type" -msgstr "Loại Tế Bào" +msgstr "Kiểu Tế Bào" msgid "Cell type to be highlighted" -msgstr "Loại tế bào để tô sáng" +msgstr "Kiểu tế bào sử dụng để nêu bật" msgid "Highlight the cells regardless of their type" -msgstr "Tô sáng các thế bào mặc kệ loại của thế bào" +msgstr "Nêu bật tế bào, bất kể kiểu của chúng là gì" msgid "Fluid" @@ -12928,55 +13930,55 @@ msgstr "Chất Lỏng" msgid "Highlight only the cells of type Fluid" -msgstr "Chỉ tô sáng tế bào loại Chất Lỏng" +msgstr "Duy nêu bật các tế bào thuộc thể loại Chất Lỏng mà thôi" msgid "Obstacle" -msgstr "Trở Ngại" +msgstr "Trướng Ngại Vật" msgid "Highlight only the cells of type Obstacle" -msgstr "Chỉ tô sáng tế bào loại Trở Ngại" +msgstr "Duy nêu bật các tế bào thuộc thể loại Chướng Ngại Vật mà thôi" msgid "Highlight only the cells of type Empty" -msgstr "Chỉ tô sáng tế bào loại Trống Rỗng" +msgstr "Duy nêu bật các tế bào thuộc thể loại Đối Tượng Rỗng mà thôi" msgid "Highlight only the cells of type Inflow" -msgstr "Chỉ tô sáng tế bào loại Luồng Nhập" +msgstr "Duy nêu bật các tế bào thuộc thể loại Luồng Chảy Vào mà thôi" msgid "Outflow" -msgstr "Luồng Xuất" +msgstr "Luồng Thoát Ra" msgid "Highlight only the cells of type Outflow" -msgstr "Chỉ tô sáng tế bào loại Luồng xuất" +msgstr "Duy nêu bật các tế bào thuộc thể loại Luồng Thoát Ra mà thôi" msgid "Color Gridlines" -msgstr "Màu Đường Đồ Thị" +msgstr "Đường Khung Lưới Đồ Thị Màu" msgid "Simulation field to color map onto gridlines" -msgstr "Trường mô phỏng đến ánh xạ màu vào màu đường đồ thị" +msgstr "Trường mô phỏng, tô màu sơ đồ thành các đường khung lưới đồ thị" msgid "Flags" -msgstr "Lá Cờ" +msgstr "Cờ Hiệu" msgid "Flag grid of the fluid domain" -msgstr "Đồ thị lá cờ của phám vi chất lỏng" +msgstr "Khung lưới đồ thị đánh dấu của phạm vi chất lỏng" msgid "Highlight Range" -msgstr "Phạm Vi Tô Sáng" +msgstr "Nêu Bật Khoảng" msgid "Highlight the voxels with values of the color mapped field within the range" -msgstr "Tô sáng thể tích tử bằng giá trị của trường được ánh xạ màu trong phạm vi" +msgstr "Nêu bật các thể tích tử với các giá trị của trường ánh xạ có màu nội trong khoảng phạm vi" msgid "Lower Bound" @@ -12984,11 +13986,11 @@ msgstr "Giới Hạn Dưới" msgid "Lower bound of the highlighting range" -msgstr "Giới hạn dưới của phạm vi tô sáng" +msgstr "Giới hạn dưới của khoảng phạm vi nêu bật" msgid "Color used to highlight the range" -msgstr "Màu để tô sáng phạm vi" +msgstr "Màu sử dụng để nêu bật khoảng phạm vi" msgid "Upper Bound" @@ -12996,39 +13998,39 @@ msgstr "Giới Hạn Trên" msgid "Upper bound of the highlighting range" -msgstr "Giới hạn trên của phạm vi tô sáng" +msgstr "Giới hạn trên của khoảng phạm vi nêu bật" msgid "Guiding weight (higher value results in greater lag)" -msgstr "Quyền lượng dẫn (giá trị càng cao càng trễ)" +msgstr "Trọng lực hướng dẫn (giá trị cao làm cho chậm lại)" msgid "Guiding size (higher value results in larger vortices)" -msgstr "Kích cỡ dẫn (giá trị càng cao, cuộn càng lớn)" +msgstr "Lốc xoáy" msgid "Use velocities from this object for the guiding effect (object needs to have fluid modifier and be of type domain))" -msgstr "Dùng vận tốc từ vật thể này cho hiệu ứng dẫn (vật thể cần có bộ điều chỉnh chất lỏng và loại phám vi)" +msgstr "Sử dụng vận tốc từ đối tượng này để tạo hiệu ứng hướng dẫn (đối tượng cần phải có bộ điều chỉnh chất lỏng và phải là thể loại phạm vi)" msgid "Guiding source" -msgstr "Nguồn Dẫn" +msgstr "Nguồn Hướng Dẫn" msgid "Choose where to get guiding velocities from" -msgstr "Chọn chỗ nào để lấy vận tốc dẫn" +msgstr "Chọn nguồn để lấy vận tốc hướng dẫn từ đó" msgid "Use a fluid domain for guiding (domain needs to be baked already so that velocities can be extracted). Guiding domain can be of any type (i.e. gas or liquid)" -msgstr "Dùng một phạm vi chất lỏng cho dẫn (cần nướng phạm vi trước để được rút các vận tốc). Phạm vi dẫn có thể là bất cứ loại nào (ví dụ: chất khí hay chất lỏng)" +msgstr "Sử dụng phạm vi chất lỏng (*fluid domain*) để hướng dẫn (phạm vi (*domain*) cần phải được nướng trước đi đã, hầu cho chúng ta có thể trích xuất vận tốc ra được từ đó)." msgid "Effector" -msgstr "Đồ Hiệu Ứng" +msgstr "Hiệu Ứng Viên" msgid "Use guiding (effector) objects to create fluid guiding (guiding objects should be animated and baked once set up completely)" -msgstr "Dùng vật thể (đồ hiệu ứng) để chế tạo dẫn chất lỏng (vật thể dẫn nên được hoạt hình và nướng khi cài đặt sẵn hoàn toàn)" +msgstr "Sử dụng các đối tượng hướng dẫn (hiệu ứng viên) để kiến tạo sự hướng dẫn cho chất lỏng (các đối tượng hướng dẫn cần phải được hoạt họa và nướng sau khi đã sắp đặt xong)" msgid "Velocity Factor" @@ -13036,27 +14038,27 @@ msgstr "Hệ Số Vận Tốc" msgid "Guiding velocity factor (higher value results in greater guiding velocities)" -msgstr "Hệ số dẫn vận tốc (giá trị càng cao, vận tốc dẫn càng cao)" +msgstr "Hệ số vận tốc hướng dẫn (giá trị cao sẽ làm tăng tốc độ hướng dẫn)" msgid "Heat Grid" -msgstr "Đồ Thị Nhiệt" +msgstr "Khung Lưới Đồ Thị Nhiệt" msgid "Smoke heat grid" -msgstr "Đồ thị nhiệt khói" +msgstr "Khung lưới đồ thị nhiệt của khói" msgid "Emitter" -msgstr "Đồ Phát" +msgstr "Vật Phát Sinh" msgid "Method for sampling the high resolution flow" -msgstr "Phương pháp lấy mẫu vật từ đổi lưu độ phân giải cao" +msgstr "Phương pháp lấy mẫu vật cho dòng lưu có độ phân giải cao" msgid "Full Sample" -msgstr "Mẫu Vật Toàn Bộ" +msgstr "Lấy Mẫu Vật Toàn Phần" msgid "Nearest" @@ -13064,87 +14066,87 @@ msgstr "Gần Nhất" msgid "Lower Concavity" -msgstr "Độ Lõm Thấp" +msgstr "Giới Hạn Dưới về Độ Lõm" msgid "Lower mesh concavity bound (high values tend to smoothen and fill out concave regions)" -msgstr "Giới hạn thấp độ lõm mạng lưới (giá trị cao thường mịn hóa và làm đầy vùng lõm)" +msgstr "Giới hạn dưới về độ lõm của khung lưới (các giá trị cao hơn thường có xu hướng làm mịn và làm đầy lên các vùng lõm)" msgid "Upper Concavity" -msgstr "Độ Lõm Cao" +msgstr "Giới Hạn Trên về Độ Lõm" msgid "Upper mesh concavity bound (high values tend to smoothen and fill out concave regions)" -msgstr "Giới hạn cao của độ lõm mạng lưới (giá trị cao thường mịn hóa và làm đầy vùng lõm)" +msgstr "Giới hạn trên về độ lõm của khung lưới (các giá trị cao hơn thường có xu hướng làm mịn và làm đầy lên các vùng lõm)" msgid "Mesh generator" -msgstr "Bộ chế tạo mạng lưới" +msgstr "Máy Sinh Tạo Khung Lưới" msgid "Which particle level set generator to use" -msgstr "Dùng bộ chế tạo đặt mức hạt nào" +msgstr "Sử dụng máy sinh tạo bộ tầng hạt nào" msgid "Final" -msgstr "Cuối" +msgstr "Kết Thúc" msgid "Use improved particle level set (slower but more precise and with mesh smoothening options)" -msgstr "Dùng bộ chế tạo đặt mức hạt được cải tiến (chậm hơn nhưng chính xác hơn và có tùy chọn cho mịn hóa mạng lưới)" +msgstr "Sử dụng bộ tầng hạt cải tiến (chậm hơn, song chính xác hơn, và cho phép một số lựa chọn để làm mịn khung lưới)" msgid "Preview" -msgstr "Dự Khán" +msgstr "Xem Trước" msgid "Use union particle level set (faster but lower quality)" -msgstr "Dùng bộ chế tạo đặt mức hạt liên đoạn (nhanh hơn nhưng chật lượng thấp hơn)" +msgstr "Sử dụng bộ tầng hạt hợp nhất (nhanh hơn song chất lượng kém hơn)" msgid "Particle radius factor (higher value results in larger (meshed) particles). Needs to be adjusted after changing the mesh scale" -msgstr "Hệ số bán kính hạt (giá trị càng cao có hạt (mạng lưới) càng lớn). Vẫn cần chỉnh sửa sau đổi phóng to của mạng lưới" +msgstr "Hệ số bán kính hạt (giá trị cao hơn sẽ làm tăng kích thước hạt (đã được tạo thành khung lưới). Cần phải được điều chỉnh sau mỗi lần thay đổi tỷ lệ của khung lưới" msgid "Mesh scale" -msgstr "Phóng to mạng lưới" +msgstr "Tỷ Lệ Khung Lưới" msgid "The mesh simulation is scaled up by this factor (compared to the base resolution of the domain). For best meshing, it is recommended to adjust the mesh particle radius alongside this value" -msgstr "Mô phỏng mạng lưới được phóng to bằng hệ số này (so với độ phân giải của phạm vi). Cho được chế tạo mạng lưới tốt nhất, khuyến khích nên chỉnh bán kính của hạt mạng lưới với giá trị này" +msgstr "Sự mô phỏng khung lưới sẽ được tỷ lệ hóa theo hệ số này (so sánh với độ phân giải cơ sở của phạm vi). Để đạt được sự thiết lập khung lưới tốt nhất, chúng ta nên điều chỉnh bán kính hạt của khung lưới đồng bộ với giá trị này" msgid "Smoothen Neg" -msgstr "Mịn Hóa Ăm" +msgstr "Làm Mịn Âm" msgid "Negative mesh smoothening" -msgstr "Mịn hóa âm" +msgstr "Đảo ngược quá trình làm mịn khung lưới (làm mịn âm/tiêu cực)" msgid "Smoothen Pos" -msgstr "Mịn Hóa Dương" +msgstr "Làm Mịn Dương" msgid "Positive mesh smoothening" -msgstr "Mịn hóa dương" +msgstr "Tăng mức làm mịn khung lưới (dương/tích cực)" msgid "Scale of noise (higher value results in larger vortices)" -msgstr "Phóng to của huyên náo (giá trị can có xoắn lớn hơn)" +msgstr "Tỷ lệ của nhiễu (giá trị cao hơn sẽ cho kết quả là các lốc xoáy lớn hơn)" msgid "Noise Scale" -msgstr "Phóng To Huyên Náo" +msgstr "Tỷ Lệ của Nhiễu" msgid "The noise simulation is scaled up by this factor (compared to the base resolution of the domain)" -msgstr "Mô phỏng huyên náo được phóng to bằng giá trị này (so với độ phân giải của phạm vi)" +msgstr "Sự mô phỏng nhiễu sẽ được tỷ lệ hóa lên theo hệ số này (so sánh với độ phân giải cơ sở của phạm vi)" msgid "Strength of noise" -msgstr "Sức của huyên náo" +msgstr "Cường độ nhiễu" msgid "Time" @@ -13152,7 +14154,7 @@ msgstr "Thời Gian" msgid "Animation time of noise" -msgstr "Thời gian hoạt hình của huyên náo" +msgstr "Thời gian hoạt họa nhiễu" msgid "Compression" @@ -13160,7 +14162,7 @@ msgstr "Nén" msgid "Compression method to be used" -msgstr "Phương pháp được dùng cho nén đệm chứa" +msgstr "Phương pháp nén sử dụng" msgid "Zip" @@ -13168,7 +14170,7 @@ msgstr "Zip" msgid "Effective but slow compression" -msgstr "Hiệu qủa nén cao nhưng chậm" +msgstr "Hiệu quả nén cao nhưng chậm" msgid "Blosc" @@ -13176,39 +14178,44 @@ msgstr "Blosc" msgid "Multithreaded compression, similar in size and quality as 'Zip'" -msgstr "Nén đa tuyến, kích cỡ và chất lượng giống 'Zip'" +msgstr "Phương pháp nén đa luồng, kích cỡ và chất lượng tương đồng với 'Zip'" msgid "Do not use any compression" -msgstr "Không nén" +msgstr "Không sử dụng phương pháp nén nào cả" msgid "Data Depth" -msgstr "Độ Sâu Dữ Liệu" +msgstr "Độ Lớn của Dữ Liệu" msgid "Bit depth for fluid particles and grids (lower bit values reduce file size)" -msgstr "Độ sậu bit của hạt chất lỏng và đồ thị (giá trị bit thấp giảm kích cỡ tập tin)" +msgstr "Độ sâu bit sử dụng cho các hạt chất lỏng và khung lưới đồ thị (giá trị thấp sẽ làm giảm cỡ tập tin)" msgid "Particle (narrow) band width (higher value results in thicker band and more particles)" -msgstr "Bề rộng (hẹp) của vành đai hạt (giá trị cao hơn có vành rộng hơn và hạt nhiều hơn)" +msgstr "Băng tần (hẹp) của hạt (giá trị cao hơn sẽ cho kết quả là bằng dày hơn và nhiều hạt hơn)" msgid "Maximum number of particles per cell (ensures that each cell has at most this amount of particles)" -msgstr "Số lượng cực đại của hạt từng tế bào (làm chắc mỗi tế bào có ít nhất số lượng hạt này)" +msgstr "Số lượng hạt tối đa cho mỗi tế bào (đảm bảo rằng mỗi tế bào có tối thiểu số lượng hạt này)" msgid "Minimum number of particles per cell (ensures that each cell has at least this amount of particles)" -msgstr "Số lượng cực tiểu của hạt từng tế bào (làm chắc mỗi tế bào có ít nhất số lượng hạt này)" +msgstr "Số lượng hạt tối thiểu cho mỗi tế bào (đảm bảo rằng mỗi tế bào có tối thiểu số lượng hạt này)" + + +msgctxt "Amount" +msgid "Number" +msgstr "Số/Lượng" msgid "Particle number factor (higher value results in more particles)" -msgstr "Hệ số số lượng hạt (giá trị cao hơn có hạt nhiều hơn)" +msgstr "Hệ số chỉ số lượng hạt (giá trị cao sẽ làm tăng số lượng hạt)" msgid "Particle radius factor. Increase this value if the simulation appears to leak volume, decrease it if the simulation seems to gain volume" -msgstr "Hệ số bán kính hạt. Tăng giá trị này nếu mô phỏng coi như mất thể tích, giảm nếu mô phỏng thu thể tích" +msgstr "Hệ số bán kính của hạt. Bạn có thể tăng cao giá trị này nếu thể tích có vẻ bị rò rỉ trong mô phỏng. Giảm giá trị này đi nếu mô phỏng dường như khuếch đại thể tích lên" msgid "Randomness" @@ -13216,39 +14223,39 @@ msgstr "Độ Ngẫu Nhiên" msgid "Randomness factor for particle sampling" -msgstr "Hệ số ngẫu nhiên cho mẫu hạt" +msgstr "Ngẫu số dành cho việc lấy mẫu vật hạt" msgid "Particle scale" -msgstr "Phóng to hạt" +msgstr "Tỷ Lệ của Hạt" msgid "The particle simulation is scaled up by this factor (compared to the base resolution of the domain)" -msgstr "Mô phỏng hạt được phóng to bằng hệ số này (so với độ phân giải của phạm vi)" +msgstr "Sự mô phỏng hạt sẽ được tỷ lệ hóa lên theo hệ số này (so sánh với độ phân giải cơ sở của phạm vi)" msgid "Maximum Resolution" -msgstr "Độ Phân Giải Cực Đại" +msgstr "Độ Phân Giải Tối Đa" msgid "Resolution used for the fluid domain. Value corresponds to the longest domain side (resolution for other domain sides is calculated automatically)" -msgstr "Độ phân giải của phạm vi chất lỏng. Giá trị tùy cạnh bề dài nhất của của phạm vi (độ phân giải cho các cạnh khác của phạm vi được tính tự động)" +msgstr "Độ phân giải sử dụng trong phạm vi của chất lỏng. Giá trị này tương ứng với cạnh dài nhất của phạm vi (độ phân giải cho các cạnh khác của phạm vi sẽ được tính toán tự động)" msgid "Gridlines" -msgstr "Đường Đồ Thị" +msgstr "Đường Khung Lưới Đồ Thị" msgid "Show gridlines" -msgstr "Hiện độ thị" +msgstr "Hiển thị đường khung lưới đồ thị" msgid "Vector Display" -msgstr "hiển Thị Vectơ" +msgstr "Hiển Thị Véctơ" msgid "Visualize vector fields" -msgstr "Hiển thị trường vectơ" +msgstr "Trực quan hóa các trường véctơ" msgid "Simulation Method" @@ -13256,15 +14263,15 @@ msgstr "Phương Pháp Mô Phỏng" msgid "Change the underlying simulation method" -msgstr "Đổi phương pháp mô phỏng" +msgstr "Đổi phương pháp mô phỏng cơ sở" msgid "FLIP" -msgstr "FLIP" +msgstr "Hệ Thống Hạt Mô Phỏng Chất Lỏng" msgid "Use FLIP as the simulation method (more splashy behavior)" -msgstr "Dùng mô phỏng FLIP (hành vi dăn hơn)" +msgstr "Sử dụng phương pháp mô phỏng FLIP (nước bắn giọt lung tung nhiều hơn)" msgid "APIC" @@ -13272,43 +14279,43 @@ msgstr "APIC" msgid "Use APIC as the simulation method (more energetic and stable behavior)" -msgstr "Dùng mô phỏng APIC (hành vi quậy và ổ định hơn)" +msgstr "Dùng phương pháp mô phỏng APIC (hoạt tính cao hơn song tính cách hoạt động ổn định hơn)" msgid "Adjust slice direction according to the view direction" -msgstr "Chỉnh hướng cắt tùy hướng nhìn của màn" +msgstr "Chỉnh hướng cắt lát tùy theo hướng của góc nhìn" msgid "Slice along the X axis" -msgstr "Cắt hướng trục X" +msgstr "Cắt lát theo trục X" msgid "Slice along the Y axis" -msgstr "Cắt hướng trục Y" +msgstr "Cắt lát theo trục Y" msgid "Slice along the Z axis" -msgstr "Cắt hướng trục Z" +msgstr "Cắt lát theo trục Z" msgid "Position of the slice" -msgstr "Vị trí cắt" +msgstr "Vị trí của lát cắt" msgid "Slice Per Voxel" -msgstr "Lần Cắt Mỗi Thể Tích Tử" +msgstr "Số Lần Cắt Lát Thể Tích Tử" msgid "How many slices per voxel should be generated" -msgstr "Bao nhiêu lần nên chế tạo miến cắt cho mỗi thể tich tử" +msgstr "Mỗi thể tích tử cần phải cắt lát ra bao nhiêu lần" msgid "Particles in Boundary" -msgstr "Hạt còn trong Ranh Giới" +msgstr "Hạt Nằm ở Vùng Biên Giới" msgid "How particles that left the domain are treated" -msgstr "Làm sao xử lý các hạt vẫn còn trong phạm vi" +msgstr "Phương pháp xử lý các hạt đã rời khỏi phạm vi" msgid "Delete" @@ -13316,75 +14323,75 @@ msgstr "Xóa" msgid "Delete secondary particles that are inside obstacles or left the domain" -msgstr "Xóa các hạt thứ hai vẫn còn ở trong trở ngại và phạm vi" +msgstr "Xóa các hạt thứ yếu nằm trong chướng ngại vật hoặc đã rời khỏi phạm vi" msgid "Push Out" -msgstr "Đẩy Ra" +msgstr "Đẩn cái Thoát Ra" msgid "Push secondary particles that left the domain back into the domain" -msgstr "Đẩy các hạt thứ hai vẫn còn ở trong phạm vi trở lại vào phạm vi" +msgstr "Đẩy các hạt thứ yếu đã rời khỏi phạm vi quay trở lại vào trong phạm vi một lần nữa" msgid "Bubble Buoyancy" -msgstr "Lực Nổi Bong Bóng" +msgstr "Độ Nổi của Bong Bóng" msgid "Amount of buoyancy force that rises bubbles (high value results in bubble movement mainly upwards)" -msgstr "Mức lực nỗi để đẩy lên bong bóng (giá trị cao làm bong bóng chủ yếu đi lên)" +msgstr "Lượng lực đẩy làm nổi bong bóng lên (giá trị cao sẽ làm cho đường chuyển động lên trên của bong bóng đi thẳng hơn" msgid "Bubble Drag" -msgstr "Kéo Lê Bong Bóng" +msgstr "Lực Cản của Bong Bóng" msgid "Amount of drag force that moves bubbles along with the fluid (high value results in bubble movement mainly along with the fluid)" -msgstr "Mức lực kéo lê được kéo bong bóng theo chất lỏng (giá trị cao hơn làm bong bóng chủ yếu đi theo chuyển động của chất lỏng)" +msgstr "Lượng lực kéo di chuyển bong bóng đi cùng với hướng của chất lỏng (giá trị cao dẫn đến chuyển động của bong bóng sẽ chủ yếu đi cùng hướng với chất lỏng)" msgid "Combined Export" -msgstr "Xuất Gồm" +msgstr "Xuất Khẩu Kết Hợp" msgid "Determines which particle systems are created from secondary particles" -msgstr "Chỉ định các hệ thống hạt nào được chế tạo thừ các hạt thứ hai" +msgstr "Xác định xem hệ thống hạt nào sẽ được kiến tạo từ các hạt thứ yếu" msgid "Create a separate particle system for every secondary particle type" -msgstr "Chế tạo một hệ thống hạt riêng cho mỗi loại hạt thứ hai" +msgstr "Kiến Tạo một hệ thống hạt riêng biệt cho mọi loại hạt thứ cấp (* secondary particle type*)" msgid "Spray + Foam" -msgstr "Xịt + Bọt" +msgstr "Bụi Nước + Bọt Nước" msgid "Spray and foam particles are saved in the same particle system" -msgstr "Các hạt xịt và bọt được lưu trong cùng hệ thống hạt" +msgstr "Các hạt về bụi nước và bọt nước sẽ được lưu trong cùng một hệ thống hạt" msgid "Spray + Bubbles" -msgstr "Xịt + Bong Bóng" +msgstr "Bụi Nước + Bong Bóng" msgid "Spray and bubble particles are saved in the same particle system" -msgstr "Các hạt xịt và bong bóng được lưu trong cùng hệ thống hạt" +msgstr "Các hạt về bụi nước và bong bóng sẽ được lưu trong cùng một hệ thống hạt" msgid "Foam + Bubbles" -msgstr "Bọt + Bong Bóng" +msgstr "Bọt Nước + Bong Bóng" msgid "Foam and bubbles particles are saved in the same particle system" -msgstr "Các hạt bọat và bong bóng được lưu trong cùng hệ thống hạt" +msgstr "Các hạt cho bọt nước và bong bóng sẽ được lưu trong cùng một hệ thống hạt" msgid "Spray + Foam + Bubbles" -msgstr "Xịt + Bọt + Bong Bóng" +msgstr "Bụi Nước + Bọt Nước + Bong Bóng" msgid "Create one particle system that contains all three secondary particle types" -msgstr "Chế tạo một hệ thống hạt chứa tất cả ba loại hạt thứ hai" +msgstr "Kiến tạo một hệ thống hạt có chứa cả 3 thể loại hạt thứ yếu" msgid "Maximum Lifetime" @@ -13392,7 +14399,7 @@ msgstr "Tuổi Thọ Tối Đa" msgid "Highest possible particle lifetime" -msgstr "Tuổi thọ lâu nhất" +msgstr "Tuổi thọ cao nhất có thể của hạt" msgid "Minimum Lifetime" @@ -13400,87 +14407,87 @@ msgstr "Tuổi Thọ Tối Thiểu" msgid "Lowest possible particle lifetime" -msgstr "Tuổi thọ nhắn nhất" +msgstr "Tuổi thọ thấp nhất có thể của hạt" msgid "Maximum Kinetic Energy Potential" -msgstr "Dộng Nặng Thế Cực Đại" +msgstr "Tiềm Năng Năng Lượng Động Năng Tối Đa" msgid "Upper clamping threshold that indicates the fluid speed where cells no longer emit more particles (higher value results in generally less particles)" -msgstr "Ngưỡng kép lại cực đại cho biểu lộ tốc độ chất của lỏng làm tế bào không còn phát hạt thêm (giá trị cao hơn giảm bất số lượng hạt)" +msgstr "Ngưỡng hạn định trên, biểu thị tốc độ chất lỏng, mà tại đó các tế bào sẽ không phát ra hạt nữa (giá trị cao hơn thì thường dẫn đến lượng hạt ít hơn)" msgid "Maximum Trapped Air Potential" -msgstr "Năng Thế Cực Đại Của Không Khí Bị Nhốt" +msgstr "Tiềm Năng Không Khí Bị Lưu Giữ Lại Tối Đa" msgid "Upper clamping threshold for marking fluid cells where air is trapped (higher value results in less marked cells)" -msgstr "Ngưỡng kẹp lại cực đại để ký dấu cho các tế bào đang nhốt không khí (giá trị cao hơn giảm số lượng tế bào được ký dấu)" +msgstr "Ngưỡng hạn định trên để đánh dấu các tế bào chất lỏng nơi không khí bị lưu giữ lại (giá trị cao hơn dẫn đến lượng các ô được đánh dấu ít hơn)" msgid "Maximum Wave Crest Potential" -msgstr "ăng Thế Cực Đại Của Đầu Ngọn Sóng" +msgstr "Tiềm Năng Đỉnh Sóng Tối Đa" msgid "Upper clamping threshold for marking fluid cells as wave crests (higher value results in less marked cells)" -msgstr "Ngưỡng kẹp lại cực đại để ký dấu cho tế bào là đầu ngọn sóng (giá trị cao hơn giảm số lượng tế bào được ký dấu)" +msgstr "Ngưỡng hạn định trên để đánh dấu các tế bào chất lỏng là các đỉnh ngọn sóng (giá trị cao hơn dẫn đến lượng các tế bào được đánh dấu ít hơn)" msgid "Minimum Kinetic Energy Potential" -msgstr "Dộng Nặng Thế Cực Tiểu" +msgstr "Tiềm Năng Năng Lượng Động Năng Tối Thiểu" msgid "Lower clamping threshold that indicates the fluid speed where cells start to emit particles (lower values result in generally more particles)" -msgstr "Ngưỡng kẹp lại thấp cho biểu lộ tốc độ chất lỏng khi tế bào bắt đầu phát hạt (giá trị thấp hơn tăng số lượng hạt)" +msgstr "Ngưỡng hạn định dưới để ám chỉ tốc độ của chất lỏng mà tại đó các tế bào khởi công phát ra hạt (giá trị thấp hơn sẽ làm cho số lượng hạt, nói chung, nhiều hơn)" msgid "Minimum Trapped Air Potential" -msgstr "Năng Thế Cực Tiểu Của Không Khí Bị Nhốt" +msgstr "Tiềm Năng Không Khí Bị Lưu Giữ Lại Tối Thiểu" msgid "Lower clamping threshold for marking fluid cells where air is trapped (lower value results in more marked cells)" -msgstr "Ngưỡng kẹp lại cực tiểu để ký dấu cho tế bào chất lỏng khi nhốt không khi (giá trị thấp tăng số lượng tế bào được ký dấu)" +msgstr "Ngưỡng hạn định dưới để đánh dấu các tế bào chất lỏng nơi không khí bị lưu giữ lại (giá trị thấp hơn dẫn đến lượng các ô được đánh dấu nhiều hơn)" msgid "Minimum Wave Crest Potential" -msgstr "Năng Thế Cực Tiểu Của Đầu Ngọn Sóng" +msgstr "Tiềm Năng Đỉnh Sóng Tối Thiểu" msgid "Lower clamping threshold for marking fluid cells as wave crests (lower value results in more marked cells)" -msgstr "Ngưỡng kẹp lại cực tiểu cho ký dấu tế bào chất lỏng là đầu ngọn sóng (giá trị thấp tăng số lượng tế bào được ký dấu)" +msgstr "Ngưỡng hạn định dưới để đánh dấu các tế bào chất lỏng là các đỉnh ngọn sóng (giá trị thấp hơn dẫn đến lượng các tế bào được đánh dấu nhiều hơn)" msgid "Potential Radius" -msgstr "Bán Kính Nặng Thế" +msgstr "Bán Kính Khả Dĩ" msgid "Radius to compute potential for each cell (higher values are slower but create smoother potential grids)" -msgstr "Bán kính để tính nặng thế cho mỗi tế bào (giá trị cao hơn là chậm hơn nhưng chế tạo đồ thị năng thế mịn hơn)" +msgstr "Bán kính để tính toán tiềm năng cho mỗi tế bào (giá trị cao hơn sẽ làm chậm hơn, song sẽ kiến tạo khung lưới đồ thị khả dĩ mịn màng hơn)" msgid "Trapped Air Sampling" -msgstr "Mẫu Không Khí Bị Nhốt" +msgstr "Mẫu Vật cho Bọt Nước" msgid "Maximum number of particles generated per trapped air cell per frame" -msgstr "Số lượng hạt tối đa được chế tạo từng tế bào nhốt không khi mỗi bức ảnh" +msgstr "Số lượng hạt tối đa sinh tạo cho mỗi tế bào bọt nước trên mỗi khung hình" msgid "Wave Crest Sampling" -msgstr "Mẫu Đầu Ngọn Sóng" +msgstr "Mẫu Vật cho Ngọn Sóng" msgid "Maximum number of particles generated per wave crest cell per frame" -msgstr "Số lượng hạt cực đại được chế tạo từng tế bào đầu ngọn sóng mỗi bức ảnh" +msgstr "Số lượng hạt tối đa cho mỗi ngọn sóng trên mỗi khung hình" msgid "Update Radius" -msgstr "Nâng Cấp Bán Kính" +msgstr "Bán Kính Cập Nhật" msgid "Radius to compute position update for each particle (higher values are slower but particles move less chaotic)" -msgstr "Bán kính để nâng cấp vị trí của mỗi hạt (giá trị lớn hơn thì chậm hơn nhưng tế bào nhưng giảm chuyển động hỗn lọan)" +msgstr "Bán kính để tính toán cập nhật vị trí cho mỗi hạt (Giá trị cao sẽ làm cho hoạt động chậm hơn, song các hát sẽ di chuyển ổn định hơn, ít hỗn loạn hơn)" msgid "p0" @@ -13492,55 +14499,55 @@ msgstr "Điểm bắt đầu" msgid "Tension" -msgstr "Lực Căng" +msgstr "Áp Lực Bề Mặt" msgid "Surface tension of liquid (higher value results in greater hydrophobic behavior)" -msgstr "Lực căng bề mặt cùa chất lỏng (giá trị cao hơn có hành vi chống ướt hơn)" +msgstr "Sức căng bề mặt của chất lỏng (Giá trị cao hơn sẽ cho kết quả khó lan tỏa (vón hòn bi) hơn)" msgid "System Maximum" -msgstr "Cực Đại Hệ Thống" +msgstr "Tối Đa của Hệ Thống" msgid "Maximum number of fluid particles that are allowed in this simulation" -msgstr "Số lượng hạt chất lỏng tối đa được dùng trong mô phỏng này" +msgstr "Số lượng hạt chất lỏng tối đa cho phép trong mô phỏng này" msgid "Temperature Grid" -msgstr "Đồ Thị Nhiệt Độ" +msgstr "Khung Lưới Đồ Thị Nhiệt Độ" msgid "Smoke temperature grid, range 0 to 1 represents 0 to 1000K" -msgstr "Đồ thị nhiệt độ khói, pham vị 0 đến 1 được biểu diễn 0 đến 1000K" +msgstr "Khung lưới đồ thị nhiệt độ của khói, phạm vi 0 đến 1 đại biểu là 0°K đến 1000°K (độ Kevin)" msgid "Time Scale" -msgstr "Giai Điệu Thời Gian" +msgstr "Tỷ Lệ Thời Gian" msgid "Adjust simulation speed" -msgstr "Chỉnh tốc độ mô phỏng" +msgstr "Điều chỉnh tốc độ mô phỏng" msgid "Maximum number of simulation steps to perform for one frame" -msgstr "Số lượng bước cực đại của mô phỏng để làm từng một bức ảnh" +msgstr "Số bước mô phỏng tối đa thi hành đối với một khung hình" msgid "Minimum number of simulation steps to perform for one frame" -msgstr "Số lượng bước cực tiểu của mô phỏng để làm từng một bức ảnh" +msgstr "Số bước mô phỏng tối thiểu thi hành đối với một khung hình" msgid "Adaptive Domain" -msgstr "Phạm Vi Ứng Phó" +msgstr "Phạm Vi Tùy Ứng" msgid "Adapt simulation resolution and size to fluid" -msgstr "Ứng phó độ phân giải mô phỏng và kích cỡ tùy chất lỏng" +msgstr "Tùy ứng độ phân giải và kích thước mô phỏng với lượng dòng lưu" msgid "Use Adaptive Time Steps" -msgstr "Dùng Bước Thời Gian Ứng Dụng" +msgstr "Sử Dụng Bước Thời Gian Tùy Ứng" msgid "Bubble" @@ -13548,75 +14555,75 @@ msgstr "Bong Bóng" msgid "Create bubble particle system" -msgstr "Chế tạo hệ thống hạt bong bóng" +msgstr "Kiến tạo hệ thống hạt làm bong bóng" msgid "Enable collisions with back domain border" -msgstr "Bật va chạm với ranh giới phạm vi phía sau" +msgstr "Cho phép va đập với ranh giới đằng sau của phạm vi" msgid "Bottom" -msgstr "Dưới" +msgstr "Đáy" msgid "Enable collisions with bottom domain border" -msgstr "Bật va chạm với ranh giới phạm vi phía dưới" +msgstr "Cho phép va đập với ranh giới dưới đáy của phạm vi" msgid "Enable collisions with front domain border" -msgstr "Bật va chạm với ranh giới phạm vi phía trước" +msgstr "Cho phép va đập với ranh giới đằng trước của phạm vi" msgid "Enable collisions with left domain border" -msgstr "Bật va chạm với ranh giới phạm vi trái trái" +msgstr "Cho phép va đập với ranh giới bên trái của phạm vi" msgid "Enable collisions with right domain border" -msgstr "Bật va chạm với ranh giới phạm vi phía phải" +msgstr "Cho phép va đập với ranh giới bên phải của phạm vi" msgid "Top" -msgstr "Trên" +msgstr "Đỉnh" msgid "Enable collisions with top domain border" -msgstr "Bật cho va chạm với ranh giới phạm vi phía trên" +msgstr "Cho phép va đập với ranh giới đỉnh của phạm vi" msgid "Grid Display" -msgstr "Hiển Thị Đồ Thị" +msgstr "Hiển Thị Khung Lưới Đồ Thị" msgid "Render a simulation field while mapping its voxels values to the colors of a ramp or using a predefined color code" -msgstr "Kết xuất một trường mô phỏng khi ánh xạ giá trị từ thể tích tử của nó đến màu của một dốc màu hoặc dùng một mã số màu được xác định" +msgstr "Kết xuất trường mô phỏng trong khi ánh xạ các giá trị thể tích tử của nó thành các màu của dốc màu hoặc dùng một mã màu sắc đã định trước" msgid "Use Diffusion" -msgstr "Dùng Tán Xạ" +msgstr "Sử Dụng Khuếch Tán" msgid "Enable fluid diffusion settings (e.g. viscosity, surface tension)" -msgstr "Bật cài đặt của tán xạ chất lỏng (ví dụ độ nhớt, sức căng bề mặt)" +msgstr "Bật các sắp đặt về khuếch tán trong chất lỏng (ví dụ: đột nhớt, mức kéo giãn của bề mặt)" msgid "Dissolve Smoke" -msgstr "Tan Khói" +msgstr "Tiêu Tan Khói" msgid "Let smoke disappear over time" -msgstr "Cho khói hòa tan qua thời gian" +msgstr "Để cho khói tan biến mất theo thời gian" msgid "Logarithmic Dissolve" -msgstr "Hòa Tan Kiểu Log" +msgstr "Tiêu tan dùng thuật toán Loga" msgid "Dissolve smoke in a logarithmic fashion. Dissolves quickly at first, but lingers longer" -msgstr "Hóa tan khói kiểu log. Bắt đầu hòa tan nhanh, nhưng sau ở lại lâu hơn" +msgstr "Làm cho khói tiêu tan theo phương pháp của phép toán lôgarit. Mới đầu tan biến nhanh, song kéo dài lâu hơn" msgid "Create liquid particle system" -msgstr "Chế tạo hệ thống hạt chất lỏng" +msgstr "Kiến Tạo hệ thống hạt cho chất lỏng" msgid "Foam" @@ -13624,111 +14631,111 @@ msgstr "Bọt" msgid "Create foam particle system" -msgstr "Chế tạo hệ thống hạt bọt" +msgstr "Kiến tạo hệ thống hạt mô phỏng bọt" msgid "Fractional Obstacles" -msgstr "Trở Ngại Phân Số" +msgstr "Phân Số Chướng Ngại Vật" msgid "Fractional obstacles improve and smoothen the fluid-obstacle boundary" -msgstr "Trở ngại phân số cải tiến và mịn hóa ranh giới chất lỏng-trở ngại" +msgstr "Phân số chướng ngại vật (không đầy đủ, phân tán, từng phần nhỏ mà thôi) nhằm cải thiện và làm mịn ranh giới chướng ngại vật của chất lỏng" msgid "Use Guiding" -msgstr "Dùng Hướng Dẫn" +msgstr "Sử Dụng Hướng Dẫn" msgid "Enable fluid guiding" -msgstr "Bật dùng hướng dẫn chất lỏng" +msgstr "Bật hướng dẫn chất lỏng" msgid "Use Mesh" -msgstr "Dùng Mạng Lưới" +msgstr "Sử Dụng Khung Lưới" msgid "Enable fluid mesh (using amplification)" -msgstr "Bật mạng lưới chất lỏng (dùng tăng cường)" +msgstr "Bật khung lưới chất lỏng (dùng sự khuếch đại)" msgid "Use Noise" -msgstr "Dùng Huyên Náo" +msgstr "Sử Dụng Nhiễu" msgid "Enable fluid noise (using amplification)" -msgstr "Bật huyên náo chất lỏng (dùng tăng cường)" +msgstr "Bật nhiễu trong chất lỏng (dùng sự khuếch đại)" msgid "Slice" -msgstr "Lát" +msgstr "Cắt Lát" msgid "Perform a single slice of the domain object" -msgstr "Thực hành cắt ngang vật thể phạm vi một lần" +msgstr "Tiến hành cắt lát đối tượng định phạm vi một lần" msgid "Speed Vectors" -msgstr "Vectơ Tốc Độ" +msgstr "Véctơ Tốc Độ" msgid "Caches velocities of mesh vertices. These will be used (automatically) when rendering with motion blur enabled" -msgstr "Chứa các vận tốc của đỉnh mạng lưới. Các vận tốc sẽ được sử dụng (tự động) khi bật kết xuất mờ hóa chuyển động" +msgstr "Lưu vận tốc của các điểm đỉnh khung lưới vào bộ đệm nhớ. Chúng sẽ được sử dụng (tự động) khi kết xuất với chế độ làm nhòe mờ chuyển động" msgid "Spray" -msgstr "Xịt" +msgstr "Bụi Nước" msgid "Create spray particle system" -msgstr "Chế tạo hệ thống hạt xịt" +msgstr "Kiến tạo hệ thống hạt bụi nước (spray)" msgid "Tracer" -msgstr "Đồ Vệt" +msgstr "Vật Truy Vết" msgid "Create tracer particle system" -msgstr "Chế tạo hệ thống hạt đồ vệt" +msgstr "Kiến tạo hệ thống hạt có vật Truy Vết (tracer)" msgid "Use Viscosity" -msgstr "Dùng Độ Nhớt" +msgstr "Sử Dụng Độ Nhớt" msgid "Enable fluid viscosity settings" -msgstr "Bật cài đặt đồ nhớt của chất lỏng" +msgstr "Bật sắp đặt về độ nhớt của chất lỏng lên" msgid "Display Type" -msgstr "Cách Hiển Thị" +msgstr "Kiểu Hiển Thị" msgid "Needle" -msgstr "Cây Kim" +msgstr "Hình Tháp Nhọn" msgid "Display vectors as needles" -msgstr "Hiện vectơ bằng cây kim" +msgstr "Hiển thị các véctơ như hình các cây kim" msgid "Streamlines" -msgstr "Nét Dòng Luồng" +msgstr "Nét Luồng Chảy" msgid "Display vectors as streamlines" -msgstr "Hiện vectơ bằng nét dòng luồng" +msgstr "Hiển thị các véctơ như những nét luồng chảy" msgid "MAC Grid" -msgstr "Đồ Thị MAC" +msgstr "Khung Lưới Đồ Thị MAC" msgid "Display vector field as MAC grid" -msgstr "Hiển thị trường vectơ bằng độ thị MAC" +msgstr "Hiển thị trường véctơ như khung lưới đồ thị MAC" msgid "Vector field to be represented by the display vectors" -msgstr "Chiếu trường vectơ bằng nét vectơ hiển thị" +msgstr "Trường véctơ được đại diện bởi các véctơ hiển thị" msgid "Fluid Velocity" @@ -13736,23 +14743,23 @@ msgstr "Vận Tốc Chất Lỏng" msgid "Velocity field of the fluid domain" -msgstr "Trường vận tốc của phạm vi chất lỏng" +msgstr "Vận tốc trường của phạm vi chất lỏng" msgid "Guide Velocity" -msgstr "Vận Tốc Dẫn Đầu" +msgstr "Vận Tốc của Hướng Đạo" msgid "Guide velocity field of the fluid domain" -msgstr "Trường vận tốc dẫn đầu của phạm vi chất lỏng" +msgstr "Trường vận tốc hướng đạo của phạm vi chất lỏng" msgid "Force field of the fluid domain" -msgstr "Lực trường của phạm vi chất lỏng" +msgstr "Trường lực của phạm vi chất lỏng" msgid "Multiplier for scaling the vectors" -msgstr "Hệ số nhân để phóng to vectơ" +msgstr "Hệ số nhân để đổi tỷ lệ các vectơ" msgid "Magnitude" @@ -13760,35 +14767,35 @@ msgstr "Độ Lớn" msgid "Scale vectors with their magnitudes" -msgstr "Phóng to vectơ bằng độ lớn của chúng nó" +msgstr "Đổi tỷ lệ các véctơ với độ lớn của chúng" msgid "Show X-component of MAC Grid" -msgstr "Hiện thành phần X của Đồ Thị MAC" +msgstr "Hiển thị phần tử X của khung lưới đồ thị MAC" msgid "Show Y-component of MAC Grid" -msgstr "Hiện thành phần Y của Đồ Thị MAC" +msgstr "Hiển thị phần tử Y của khung lưới đồ thị MAC" msgid "Show Z-component of MAC Grid" -msgstr "Hiện thành phần Z của Đồ Thị MAC" +msgstr "Hiển thị phần tử Z của khung lưới đồ thị MAC" msgid "Velocity Grid" -msgstr "Đồ Thị Vận Tốc" +msgstr "Khung Lưới Đồ Thị Vận Tốc" msgid "Smoke velocity grid" -msgstr "Đồ thị vận tốc khói" +msgstr "Khung lưới đồ thị vận tốc khói" msgid "Velocity Scale" -msgstr "Phóng To Vận Tốc" +msgstr "Tỷ Lệ Vận Tốc" msgid "Factor to control the amount of motion blur" -msgstr "Hệ số cho điều khiển mức độ mờ hóa chuyển động" +msgstr "Hệ số để điều khiển lượng nhòe mờ chuyển động" msgid "Viscosity Base" @@ -13796,7 +14803,7 @@ msgstr "Cơ Sở Độ Nhớt" msgid "Viscosity setting: value that is multiplied by 10 to the power of (exponent*-1)" -msgstr "Cài đặt độ nhớt: giá trị được nhân 10^(lũy thừa - 1)" +msgstr "Sắp đặt độ nhớt: giá trị được nhân với 10^(lũy thừa - 1)" msgid "Viscosity Exponent" @@ -13804,39 +14811,39 @@ msgstr "Lũy Thừa Độ Nhớt" msgid "Negative exponent for the viscosity value (to simplify entering small values e.g. 5*10^-6)" -msgstr "Lũy thừa âm cho giá trị độ nhớt (cho đơn giản hóa nhập trị nhỏ, ví dụ 5*10^-6)" +msgstr "Lũy thừa âm cho giá trị độ nhớt (để đơn giản hóa quá trình nhập những giá trị nhỏ, ví dụ 5*10^-6)" msgid "Viscosity of liquid (higher values result in more viscous fluids, a value of 0 will still apply some viscosity)" -msgstr "Đồ nhớt của chất lỏng (giá trị càng cao tăng đồ nhớt chất lỏng càng, giá trị = 0 vẫn còn một chút đồ nhớt)" +msgstr "Độ nhớt của chất lỏng (Giá trị cao hơn cho kết quả là chất lỏng có độ nhớt/đặc nhiều hơn. Dù giá trị bằng 0 đi chăng nữa thì phần mềm cũng vẫn áp dụng một chút độ nhớt/đặc vào chất lỏng)" msgid "Amount of turbulence and rotation in smoke" -msgstr "Mức nhiễu loạn và xoáy trong khói" +msgstr "Lượng nhiễu hỗn loạn và xoay chiều trong khói" msgid "Effector Settings" -msgstr "Cằi Đặt Đồ Hiệu Ứng" +msgstr "Sắp Đặt của Hiệu Ứng Viên" msgid "Smoke collision settings" -msgstr "Cài đặt va chạm khói" +msgstr "Sắp đặt về sự va đập của khói" msgid "Effector Type" -msgstr "Loại Hiệu Ứng" +msgstr "Thể Loại Hiệu Ứng Viên" msgid "Change type of effector in the simulation" -msgstr "Đổi loại hiệu ứng trong mô phỏng" +msgstr "Đổi thể loại hiệu ứng viên trong mô phỏng" msgid "Collision" -msgstr "Va Chạm" +msgstr "Va Đập" msgid "Create collision object" -msgstr "Chế tạo vật thể va chạm" +msgstr "Kiến tạo đối tượng va đập" msgid "Guide" @@ -13844,7 +14851,7 @@ msgstr "Hướng Dẫn" msgid "Create guide object" -msgstr "Chế tạo vật thể hướng dẫn" +msgstr "Kiến tạo đối tượng hướng dẫn" msgid "Guiding mode" @@ -13852,23 +14859,23 @@ msgstr "Chế độ hướng dẫn" msgid "How to create guiding velocities" -msgstr "Làm sao chế tạo vận tốc hướng dẫn" +msgstr "Phương pháp kiến tạo vận tốc hướng dẫn" msgid "Maximize" -msgstr "Lớn Nhất" +msgstr "Tối Đa Hóa" msgid "Compare velocities from previous frame with new velocities from current frame and keep the maximum" -msgstr "So sánh vật tốc từ bức ảnh trước với vật tốc mới từ bức ảnh hiện tại và giữ vận tốc nào lớn nhất" +msgstr "So sánh các vận tốc từ khung hình trước với các vận tốc mới ở khung hình hiện tại và giữ cái tối đa" msgid "Minimize" -msgstr "Nhỏ Nhất" +msgstr "Tối Thiểu Hóa" msgid "Compare velocities from previous frame with new velocities from current frame and keep the minimum" -msgstr "So sánh vật tốc từ bức ảnh trước với vật tốc mới từ bức ảnh hiện tại và giữ vận tốc nào nhỏ nhất" +msgstr "So sánh các vận tốc từ khung hình trước với các vận tốc mới ở khung hình hiện tại và giữ cái tối thiểu" msgid "Override" @@ -13876,95 +14883,95 @@ msgstr "Vượt Quyền" msgid "Always write new guide velocities for every frame (each frame only contains current velocities from guiding objects)" -msgstr "Lần nào cũngghi vận tốc hướng dẫn mới mỗi bức ảnh (mỗi bức ảnh chỉ chứa vật tốc hiện tại từ vật thể hướng dẫn)" +msgstr "Luôn luôn ghi lại các vận tốc hướng dẫn (guide velocities) mới đối với mỗi một khung hình (mỗi khung hình chỉ chứa vận tốc hiện tại của các vật hướng dẫn (guiding objects)'" msgid "Averaged" -msgstr "Trung Bình" +msgstr "Trung Bình Hóa" msgid "Take average of velocities from previous frame and new velocities from current frame" -msgstr "Tính vận tốc trung bình từ bức ảnh trước và vận tốc từ bức ảnh hiện tại" +msgstr "Lấy giá trị trung bình của các vận tốc từ khung hình trước và các vận tốc mới từ khung hình hiện tại" msgid "Subframes" -msgstr "Hạ Bức Ảnh" +msgstr "Phân-Khung-Hình" msgid "Number of additional samples to take between frames to improve quality of fast moving effector objects" -msgstr "Số lượng mẫu vật thêm được tính giữa bức ảnh để tăng chất lượng của vật thể bộ hiệu ứng có tốc độ cao" +msgstr "Số mẫu vật lấy bổ sung giữa các khung hình để cải thiện chất lượng hình ảnh của các đối tượng hiệu ứng viên di chuyển nhanh" msgid "Additional distance around mesh surface to consider as effector" -msgstr "Khoảng cách thêm quanh bề mặt mạng lưới để chấp nhận nó là đồ hiệu ứng" +msgstr "Khoảng cách thêm quanh bề mặt khung lưới được cân nhắc là trực thuộc khoảng cách của hiệu ứng viên" msgid "Control when to apply the effector" -msgstr "Kiểm soát khi áp dụng bộ hiệu ứng" +msgstr "Khống chế thời điểm áp dụng hiệu ứng viên" msgid "Is Planar" -msgstr "Là Mặt Phẳng" +msgstr "Là Bề Diện" msgid "Treat this object as a planar, unclosed mesh" -msgstr "Cử xử như vật thể này là mạng lưới mặt phẳng, không đóng" +msgstr "Coi đối tượng này như một bề diện, khung lưới mở (không đóng kín)" msgid "Multiplier of obstacle velocity" -msgstr "Số để nhân với vận tốc của trở ngại" +msgstr "Số nhân cho tốc độ của chướng ngại vật" msgid "Flow Settings" -msgstr "Cài Đặt Lưu" +msgstr "Sắp Đặt Luồng Chảy" msgid "Fluid flow settings" -msgstr "Cài Đặt Lưu" +msgstr "Sắp đặt về sự lưu chảy của chất lỏng" msgid "Density" -msgstr "Tỉ Trọng" +msgstr "Tỷ Trọng/Mật Độ" msgid "Vertex Group" -msgstr "Nhóm Đỉnh" +msgstr "Nhóm Điểm Đỉnh" msgid "Name of vertex group which determines surface emission rate" -msgstr "Tên của nhóm đỉnh được xác định lượng khói phát từ bề mặt" +msgstr "Tên của nhóm điểm đỉnh xác định lượng tần số phát khói trên bề mặt" msgid "Flow Behavior" -msgstr "Hành Vi Lưu" +msgstr "Hành Xử của Luồng Chảy" msgid "Change flow behavior in the simulation" -msgstr "Đổi hành vi lưu trong mô phỏng" +msgstr "Đổi hành xử của luồng chảy trong mô phỏng" msgid "Add fluid to simulation" -msgstr "Thêm chất lỏng vào mô phỏng" +msgstr "Tuôn chất lỏng vào mô phỏng" msgid "Delete fluid from simulation" -msgstr "Xoá chất lỏng từ mô phỏng" +msgstr "Xóa chất lỏng khỏi mô phỏng" msgid "Only use given geometry for fluid" -msgstr "Chỉ sử dụng hình dạng được cung cấp cho chất lỏng" +msgstr "Duy sử dụng hình học đã cho làm chất lỏng" msgid "Change how fluid is emitted" -msgstr "Đổi làm sao phát chất lỏng" +msgstr "Đổi phương pháp sinh tạo chất lỏng" msgid "Flow Type" -msgstr "Loại Lưu" +msgstr "Loại Luồng" msgid "Change type of fluid in the simulation" -msgstr "Đổi loại chất lỏng của mô phỏng" +msgstr "Đổi thể loại của chất lỏng trong mô phỏng" msgid "Add smoke" @@ -13988,43 +14995,47 @@ msgstr "Thêm lửa" msgid "Add liquid" -msgstr "Thêm chất lỏng" +msgstr "Thêm Chất Lỏng" msgid "Flame Rate" -msgstr "Tốc Độ Ngón Lửa" +msgstr "Tốc Độ Lửa" msgid "Texture that controls emission strength" -msgstr "Chất liệu để điều khiển sức phát khói" +msgstr "Chất liệu để điều khiển cường độ phát khói" msgid "Particle size in simulation cells" -msgstr "Kích cỡ hạt trong tế bào của mô phỏng" +msgstr "Kích thước hạt trong các ô của mô phỏng" msgid "Particle systems emitted from the object" -msgstr "Hệ thống hạt được phát từ vật thể này" +msgstr "Hệ thống hạt được phát sinh ra từ đối tượng" msgid "Color of smoke" -msgstr "Màu Khói" +msgstr "Màu khói" msgid "Number of additional samples to take between frames to improve quality of fast moving flows" -msgstr "Số lượng của mẫu vật thêm được tính giữa bức ảnh để tăng chất lượng của lưu tốc độ cao" +msgstr "Lượng mẫu vật gia tăng phải lấy thêm giữa các khung hình để cải tiến chất lượng của luồng khói đang di chuyển nhanh" msgid "Surface Emission" -msgstr "Phát Xạ Bề Mặt" +msgstr "Phát Trên Bề Mặt" msgid "Controls fluid emission from the mesh surface (higher value results in emission further away from the mesh surface" -msgstr "Cho điều khiển phát chất lỏng từ bề mặt mạng lưới (giá trị càng cao được phát xạ càng xa từ bề mặt của mạng lưới" +msgstr "Điều khiển sự phát chất lỏng ra từ bề mặt khung lưới (giá trị cao hơn dẫn đến khoảng cách phát ra khỏi bề mặt lưới xa hơn" + + +msgid "Temperature Difference" +msgstr "Chênh Lệch Nhiệt Độ" msgid "Temperature difference to ambient temperature" -msgstr "Chênh lệch nhiệt độ so với nhiệt độ bao quanh" +msgstr "Nhiệt độ chênh lệch với môi trường" msgid "Mapping" @@ -14032,15 +15043,15 @@ msgstr "Ánh Xạ" msgid "Texture mapping type" -msgstr "Loại ánh xạ chất liệu" +msgstr "Kiểu ánh xạ chất liệu" msgid "Generated" -msgstr "Được Chế Tạo" +msgstr "Do Máy Sinh Tạo" msgid "Generated coordinates centered to flow object" -msgstr "Tọa độ được chế tạo có trung tâm tại vật thể lưu" +msgstr "Các tọa độ tạo ra sẽ được đặt quanh trung tâm của đối tượng phát luồng" msgid "UV" @@ -14048,247 +15059,247 @@ msgstr "UV" msgid "Use UV layer for texture coordinates" -msgstr "Dùng lớp UV cho tọa độ chất liệu" +msgstr "Dùng tầng UV cho tọa độ chất liệu" msgid "Z-offset of texture mapping" -msgstr "Địch-Z của bản đồ chất liệu" +msgstr "Dịch chuyển-Z của ánh xạ chất liệu" msgid "Size of texture mapping" -msgstr "Kích cỡ của bản đồ chất liệu" +msgstr "Kích thước của ánh xạ chất liệu" msgid "Absolute Density" -msgstr "Tỉ Trọng Tuyệt Đối" +msgstr "Tỷ Trọng Tuyệt Đối" msgid "Only allow given density value in emitter area and will not add up" -msgstr "Chỉ cho giá trị tỉ trọng được xác định trong khu vực phát và sẽ không cộng lên" +msgstr "Chỉ cho phép giá trị tỉ trọng đã cho trong khu vực phát xạ mà thôi, và sẽ không làm gia tăng bằng phương pháp thêm vào" msgid "Use Flow" -msgstr "Dùng Luồng" +msgstr "Sử Dụng Dòng Chảy" msgid "Control when to apply fluid flow" -msgstr "Kiểm soát khi áp dụng cho luồng chất lỏng" +msgstr "Khống chế thời điểm áp dụng dòng chảy" msgid "Initial Velocity" -msgstr "Vận Tốc Khởi Động" +msgstr "Vận Tốc Khởi Đầu" msgid "Fluid has some initial velocity when it is emitted" -msgstr "Chất lỏng có một chút vận tốc khởi đầu khi được phát" +msgstr "Chất lỏng sẽ có một vận tốc khởi đầu nào đó khi chảy ra" msgid "Set Size" -msgstr "Đặt Kích Cỡ" +msgstr "Đặt Kích Thước" msgid "Set particle size in simulation cells or use nearest cell" -msgstr "Đặt kích cỡ hạt trong tế bào của mô phỏng hay dùng tế bào gần nhất" +msgstr "Đặt kích thước hạt trong các ô mô phỏng hoặc dùng ô gần nhất" msgid "Treat this object as a planar and unclosed mesh. Fluid will only be emitted from the mesh surface and based on the surface emission value" -msgstr "Cở xở với vật thể này như nó là một mạng lưới không đóng và mặt phẳng. Chỉ phát chất lỏng từ bề mặt mạng lưới tùy giá trị phát xạ của bề mặt" +msgstr "Coi đối tượng này như một bề diện và khung lưới mở (*không đóng kín*). Chất lỏng sẽ chỉ được phát ra từ bề mặt khung lưới mà thôi và dựa trên giá trị phát xạ của bề mặt" msgid "Use Texture" -msgstr "Sử Dụng Chất Liệu" +msgstr "Chất Liệu" msgid "Use a texture to control emission strength" -msgstr "Dùng một chất liệu để điều khiển sức phát khói" +msgstr "Dùng chất liệu để điều khiển cường độ phát" msgid "Initial" -msgstr "Khởi Động" +msgstr "Khởi Đầu" msgid "Additional initial velocity in X, Y and Z direction (added to source velocity)" -msgstr "Cộng thêm vận tốc khởi động cho hướng X, Y, và Z (cộng với vận tốc nguồn gốc)" +msgstr "Tốc độ bổ sung cho thời điểm khởi đầu, trong hướng X, Y và Z (được cộng vào vận tốc nguồn)" msgid "Multiplier of source velocity passed to fluid (source velocity is non-zero only if object is moving)" -msgstr "Số nhận của vận tốc nguồn được đưa đến chất lỏng (vận tốc nguồn chỉ khác không nếu vật thể đang đang chuyển động)" +msgstr "Số nhân của tốc độ nguồn được đưa sang cho chất lỏng (tốc độ nguồn sẽ khác 0 nếu đối tượng chuyển động)" msgid "Amount of normal directional velocity" -msgstr "Mức vận tốc theo hướng pháp tuyến" +msgstr "Lượng vận tốc theo hướng pháp tuyến" msgid "Amount of random velocity" -msgstr "Mức vận tốc ngẫu nhiên" +msgstr "Lượng vận tốc ngẫu nhiên" msgid "Volume Emission" -msgstr "Phát Xạ Thể Tích" +msgstr "Thể Tích Phát Sinh" msgid "Controls fluid emission from within the mesh (higher value results in greater emissions from inside the mesh)" -msgstr "Điều khiển phát chất lỏng trong mạng lưới (giá trị càng cao cho phát chất lỏng càng nhiều từ phía trong của mạng lưới)" +msgstr "Điều khiển sự phát sinh chất lỏng từ bên trong khung lưới ra (giá trị cao hơn dẫn đến phát sinh từ bên trong khung lưới ra nhiều hơn)" msgid "Freestyle Line Set" -msgstr "Tập Nét Vẽ Phong Cách Tự Do" +msgstr "Bộ Đường Nét PCTD" msgid "Line set for associating lines and style parameters" -msgstr "Tập đường cho liên kết tham số đường và phong cách" +msgstr "Bộ đường nét liên quan đến các tham số về đường nét và phong cách" msgid "Collection" -msgstr "Sưu Tập" +msgstr "Bộ Sưu Tập" msgid "A collection of objects based on which feature edges are selected" -msgstr "Một sưu tập vật thể cơ sở cạnh đặc trưng nào được chọn" +msgstr "Một bộ sưu tập các đối tượng chiểu theo hiện trạng những nét viền hình thể nào đã được chọn" msgid "Collection Negation" -msgstr "Sưu Tập Trừ Loại" +msgstr "Đảo Bộ Sưu Tập" msgid "Specify either inclusion or exclusion of feature edges belonging to a collection of objects" -msgstr "Xác định gồm loại hay trừ loại cạnh đặc trưng của một sưu tập vật thể" +msgstr "Xác định hoặc là bao gồm, hoặc là ngoại trừ, các nét viền hình thể trực thuộc một bộ sưu tập các đối tượng" msgid "Inclusive" -msgstr "Gồm Loại" +msgstr "Bao Gồm" msgid "Select feature edges belonging to some object in the group" -msgstr "Chọn cạnh đặc trưng tùy có vật thể chủ nào trong nhóm" +msgstr "Chọn các nét viền hình thể trực thuộc một nhóm đối tượng nào đó" msgid "Exclusive" -msgstr "Trừ Loại" +msgstr "Ngoại Trừ" msgid "Select feature edges not belonging to any object in the group" -msgstr "Chọn cạnh đặc trưng không có vật thể chủ nào trong nhóm" +msgstr "Chọn các nét viền hình thể không trực thuộc bất cứ đối tượng nào trong nhóm" msgid "Edge Type Combination" -msgstr "Loại Cạnh Kết Hợp" +msgstr "Tập Hợp Kiểu Cạnh" msgid "Specify a logical combination of selection conditions on feature edge types" -msgstr "Xác định một kết hợp lý luận cho điều kiện sự lựa chọn của loại cạnh đặc trưng" +msgstr "Xác định một tập hợp lôgic của những điều kiện lựa chọn đối với các kiểu nét viền cạnh hình thể" msgid "Logical OR" -msgstr "HOẶC Lý Luận" +msgstr "OR Lôgic" msgid "Select feature edges satisfying at least one of edge type conditions" -msgstr "Chọn cạnh đặc tính phù hợp ít nhất một điều kiện loại cạnh" +msgstr "Chọn nét viền hình thể thỏa mãn ít nhất một trong các điều kiện của kiểu nét cạnh" msgid "Logical AND" -msgstr "VÀ Lý Luận" +msgstr "AND Lôgic" msgid "Select feature edges satisfying all edge type conditions" -msgstr "Chọn cạnh đặc tính phù hợp hết điều kiện loại cạnh" +msgstr "Chọn các nét cạnh viền hình thể thỏa mãn toàn bộ các điều kiện của kiểu nét cạnh" msgid "Edge Type Negation" -msgstr "Trừ Loại Cạnh" +msgstr "Phủ Định Kiểu Nét Cạnh" msgid "Specify either inclusion or exclusion of feature edges selected by edge types" -msgstr "Chọn gồm loại hay trừ loại cạnh đặc tính tùy loại cạnh" +msgstr "Xác định cho bao gồm hoặc loại trừ các nét viền hình thể dựa trên các kiểu nét cạnh" msgid "Select feature edges satisfying the given edge type conditions" -msgstr "Chọn cạnh đặc tính phù hợp đặc trưng loại cạnh" +msgstr "Chọn nét viền hình thể thỏa mãn những điều kiện kiểu nét cạnh đã cho" msgid "Select feature edges not satisfying the given edge type conditions" -msgstr "Chọn cạnh đặc tính không phù hợp điều kiện loại cạnh" +msgstr "Chọn nét viền hình thể không thỏa mãn tính chất loại nét cạnh đã cho" msgid "Border" -msgstr "Ranh Giới" +msgstr "Đường Ranh Giới" msgid "Exclude border edges" -msgstr "Trừ loại cạnh ranh giới" +msgstr "Loại trừ các nét viền đường ranh giới" msgid "Contour" -msgstr "Đường Đồng Mức" +msgstr "Đường Công-Tua" msgid "Exclude contours" -msgstr "Trừ loại đường đồng mức" +msgstr "Loại trừ các đường công-tua" msgid "Crease" -msgstr "Nhăn" +msgstr "Nếp Gấp" msgid "Exclude crease edges" -msgstr "Trừ loại cạnh nhăn" +msgstr "Loại trừ các nếp gấp" msgid "Edge Mark" -msgstr "Ký Hiệu Cạnh" +msgstr "Chỉ Dấu Cạnh" msgid "Exclude edge marks" -msgstr "Trừ loại ký hiệu cạnh" +msgstr "Loại trừ các chỉ dấu cạnh" msgid "External Contour" -msgstr "Đường Đồng Mức Ngoai" +msgstr "Đường Viền Ngoài" msgid "Exclude external contours" -msgstr "Trừ loại đường đồng mức ngoài" +msgstr "Loại trừ đường viền ngoài" msgid "Material Boundary" -msgstr "Ranh Giới Vật Liệu" +msgstr "Ranh Giới Nguyên Vật Liệu" msgid "Exclude edges at material boundaries" -msgstr "Trừ loại cạnh tại ranh giới vật liệu" +msgstr "Loại trừ các cạnh ở ranh giới chất liệu" msgid "Ridge & Valley" -msgstr "Đỉnh Cao Và Thung Lũng" +msgstr "Lằn Gợn & Thung Lũng" msgid "Exclude ridges and valleys" -msgstr "Không gồm đỉnh cao và thung lũng" +msgstr "Loại trừ các Lằn Gợn và Thung Lũng" msgid "Silhouette" -msgstr "Cắt Băng" +msgstr "Hình Bóng" msgid "Exclude silhouette edges" -msgstr "Trừ loại cạnh cắt băng" +msgstr "Loại trừ đường viền hình bóng" msgid "Suggestive Contour" -msgstr "Đường Đồng Mức Dẫn" +msgstr "Đường Công-Tua Gợi Ý" msgid "Exclude suggestive contours" -msgstr "Trừ loại đường đồng mức dẫn" +msgstr "Loại trừ các đường công-tua gợi ý" msgid "Face Mark Condition" -msgstr "Điều Kiện Ký Hiệu Mặt" +msgstr "Điều Kiện về Dấu Chỉ Mặt" msgid "Specify a feature edge selection condition based on face marks" -msgstr "Xác định một điều kiện chọn cạnh đặc trưng tùy ký hiệu mặt" +msgstr "Xác định điều kiện chọn nét viền hình thể tùy theo các chỉ dấu Mặt" msgid "One Face" @@ -14296,7 +15307,7 @@ msgstr "Một Mặt" msgid "Select a feature edge if either of its adjacent faces is marked" -msgstr "Chọn cạnh đặc tính nếu một mặt kề được ký hiệu" +msgstr "Chọn cạnh viền hình thể nếu một trong hai mặt kề nhau đã được đánh dấu" msgid "Both Faces" @@ -14304,223 +15315,223 @@ msgstr "Cả Hai Mặt" msgid "Select a feature edge if both of its adjacent faces are marked" -msgstr "Chọn một cạnh đặc trưng nếu cả hai mặt kề được ký hiệu" +msgstr "Chọn cạnh viền hình thể nếu cả hai các mặt kề nhau đã được đánh dấu" msgid "Face Mark Negation" -msgstr "Trừ Ký Hiệu Mặt" +msgstr "Phủ Định Dấu Chỉ Mặt" msgid "Specify either inclusion or exclusion of feature edges selected by face marks" -msgstr "Xác định gồm loại hay trừ loại cạnh đặc trưng được chọn bằng ký hiệu mặt" +msgstr "Xác định hoặc là bao gồm hay loại trừ các nét viền hình thể dựa trên các chỉ dấu Mặt" msgid "Select feature edges satisfying the given face mark conditions" -msgstr "Chọn đặc trưng phủ hộp với điều kiện ký hiệu mặt" +msgstr "Chọn các nét viền hình thể thỏa mãn các điều kiện chỉ dấu Mặt đã cho" msgid "Select feature edges not satisfying the given face mark conditions" -msgstr "Chọn đặc trưng không phủ hộp với điều kiện ký hiệu mặt" +msgstr "Chọn các nét viền hình thể không thỏa mãn các điều kiện chỉ dấu Mặt đã cho" msgid "Line Style" -msgstr "Phong Cách Đường" +msgstr "Phong Cách Đường Nét" msgid "Line style settings" -msgstr "Cài đặt phong cách đường" +msgstr "Sắp đặt phong cách đường nét" msgid "Line Set Name" -msgstr "Tên Tập Đường" +msgstr "Tên Bộ Đường Nét" msgid "Line set name" -msgstr "Tên tập đường" +msgstr "Tên bộ đường nét" msgid "Last QI value of the QI range" -msgstr "Giá trị cuối cùng của phạm vi ĐLH" +msgstr "Giá trị cuối cùng của phạm vi ĐLVH" msgid "First QI value of the QI range" -msgstr "Giá trị bắt đầu của phạm vi ĐLH" +msgstr "Giá trị bắt đầu của phạm vi Định Lượng Vô Hình (ĐLVH)" msgid "Select border edges (open mesh edges)" -msgstr "Chọn cạnh ranh giới (cạnh của lưới không đóng)" +msgstr "Chọn nét cạnh đường ranh giới (các cạnh của khung lưới không kín)" msgid "Selection by Collection" -msgstr "Lựa Chọn bằng Sưu Tập" +msgstr "Lựa Chọn theo Bộ Sưu Tập" msgid "Select feature edges based on a collection of objects" -msgstr "Chọn cạnh đặc trưng tùy một sưu tập vật thể" +msgstr "Chọn các cạnh viền hình thể dựa trên bộ sưu tập của đối tượng" msgid "Selection by Edge Types" -msgstr "Chọn Tùy Loại Cạnh" +msgstr "Lựa Chọn theo Thể Loại Cạnh" msgid "Select feature edges based on edge types" -msgstr "Chọn cạnh đặc trưng tùy loại cạnh" +msgstr "Chọn cạnh viền hình thể dựa trên thể loại cạnh" msgid "Selection by Face Marks" -msgstr "Chọn Tùy Ký Hiệu Mặt" +msgstr "Lựa Chọn theo Dấu Chỉ Mặt" msgid "Select feature edges by face marks" -msgstr "Chọn cạnh đặc trưng tùy ký hiệu mặt" +msgstr "Chọn cạnh viền hình thể dựa trên các chỉ dấu cho Mặt" msgid "Selection by Image Border" -msgstr "Chọn Tùy Ranh Giới Ảnh" +msgstr "Chọn theo Ranh Giới Hình Ảnh" msgid "Select feature edges by image border (less memory consumption)" -msgstr "Chọn cạnh đặc trưng tùy ranh giới ảnh (dùng ít bộ nhớ)" +msgstr "Chọn cạnh viền hình thể dựa vào ranh giới hình ảnh (dùng ít bộ nhớ)" msgid "Selection by Visibility" -msgstr "Chọn Tùy Sự Hiển Thị" +msgstr "Chọn theo Tầm Nhìn" msgid "Select feature edges based on visibility" -msgstr "Chọn cạnh đặc trưng tùy sự hiển thị" +msgstr "Chọn cạnh viền hình thể dựa vào tầm nhìn" msgid "Select contours (outer silhouettes of each object)" -msgstr "Chọn đường đồng mức (cắt băng ngoài của mỗi vật thể)" +msgstr "Chọn đường công-tua (đường viền bóng hình của mỗi đối tượng)" msgid "Select crease edges (those between two faces making an angle smaller than the Crease Angle)" -msgstr "Chọn cạnh nhăn (cạnh giữa hai mặt mà có góc nhỏ hơn Góc Nhăn)" +msgstr "Chọn cạnh đã miết (những cái nằm giữa hai các mặt, tạo nên một góc độ nhỏ hơn Góc Độ Nếp Gấp)" msgid "Select edge marks (edges annotated by Freestyle edge marks)" -msgstr "Chọn ký hiện cạnh (cạnh được ký bởi ký hiệu Phong Cách Tự Do)" +msgstr "Chọn các dấu mốc cạnh (các cạnh đã được chú thích bởi các chỉ dấu cạnh Phong Cách Tự Do (PCTD)" msgid "Select external contours (outer silhouettes of occluding and occluded objects)" -msgstr "Chọn đường đồng mức ngoài (cắt băng ngoài của vật thể hấp thụ và vật thể bị hấp thụ)" +msgstr "Chọn đường viền ngoài (đường viền bóng hình của đối tượng che khuất và đối tượng bị che khuất)" msgid "Select edges at material boundaries" -msgstr "Chọn cạnh tại ranh giới vật liệu" +msgstr "Chọn các cạnh viền tại các ranh giới chất liệu" msgid "Select ridges and valleys (boundary lines between convex and concave areas of surface)" -msgstr "Chọn dãy đỉnh và thung lũng (đường ranh giới giữa khu vực lồi và lõm của mặt)" +msgstr "Chọn các lằn gợn và thung lũng (đường ranh giới giữa các khu vực lồi và lõm của bề mặt)" msgid "Select silhouettes (edges at the boundary of visible and hidden faces)" -msgstr "Chọn hình bống (các cạnh tại ràng giới của mặt hiện và ẩn)" +msgstr "Chọn bóng hình (các cạnh nằm ở ranh giới của các mặt ẩn hình và hữu hình)" msgid "Select suggestive contours (almost silhouette/contour edges)" -msgstr "Chọn đường đồng mức dẫn (gần như hình bóng/đường đồng mức)" +msgstr "Chọn đường dẫn công-tua (gần như đường viền bóng hình/đường công-tua)" msgid "Enable or disable this line set during stroke rendering" -msgstr "Bật hay tắt tập đường này khi kết xuất đường nét" +msgstr "Bật hoặc tắt bộ đường nét này trong khi kết xuất nét vẽ" msgid "Visibility" -msgstr "Sự Hiển Thị" +msgstr "Ẩn-Hiện/Tầm Nhìn" msgid "Determine how to use visibility for feature edge selection" -msgstr "Xác định làm sao được sử dụng sự hiển thị hay ẩ cho chọn cạnh đắc trưng" +msgstr "Xác định cách sử dụng tầm nhìn trong việc lựa chọn cạnh viền hình thể" msgid "Select visible feature edges" -msgstr "Chọn cạnh đặc trưng được hiện" +msgstr "Chọn các cạnh viền hình thể thấy được" msgid "Hidden" -msgstr "Ẩn" +msgstr "Ẩn Khuất" msgid "Select hidden feature edges" -msgstr "Chọn cạnh đặc tính được ẩn" +msgstr "Chọn các cạnh viền hình thể ẩn khuất" msgid "Quantitative Invisibility" -msgstr "Giá Trị Độ Ẩn" +msgstr "Định Lượng Tính Vô Hình" msgid "Select feature edges within a range of quantitative invisibility (QI) values" -msgstr "Chọn cạnh đặc tính trong một phạm vi của giá trị định lượng không hiện" +msgstr "Chọn các cạnh viền hình thể nằm trong phạm vi các giá trị định lượng vô hình (ĐLVH)" msgid "Freestyle Module" -msgstr "Mô Đun Vẽ Tụ Do" +msgstr "Mô-Đun PCTD" msgid "Style module configuration for specifying a style module" -msgstr "Cấu hình mô đun phong cách cho xác định mô đun phong cách" +msgstr "Cấu hình mô-đun Phong Cách Tự Do (PCTD) để xác định một mô-đun phong cách" msgid "Style Module" -msgstr "Mô Đun Phong Cách" +msgstr "Mô-Đun Phong Cách" msgid "Python script to define a style module" -msgstr "Văn thảo Python cho đặt nghĩa mô đun phong cách" +msgstr "Tập lệnh Python để định nghĩa mô-đun phong cách" msgid "Use" -msgstr "Dùng" +msgstr "Sử Dụng" msgid "Enable or disable this style module during stroke rendering" -msgstr "Bật hay tắt mô đun phong cách này khi kết xuất đường nét" +msgstr "Mở hay tắt mô-đun phong cách này trong khi kết xuất nét vẽ" msgid "Style Modules" -msgstr "Mô Đun Phong Cách" +msgstr "Các Mô-Đun Phong Cách" msgid "A list of style modules (to be applied from top to bottom)" -msgstr "Một danh sách mô đun phong cách (áp dụng từ trên đến dưới)" +msgstr "Một danh sách các mô-đun phong cách (để áp dụng từ trên xuống dưới)" msgid "Freestyle Settings" -msgstr "Cài Đặt Phong Cách Tự Do" +msgstr "Sắp Đặt PCTD" msgid "Freestyle settings for a ViewLayer data-block" -msgstr "Cài đặt phong cách tự do cho một cục dữ liệu LớpHiểnThị" +msgstr "Các sắp đặt về phong cách tự do cho một khối dữ liệu Tầng Lớp Góc Nhìn" msgid "As Render Pass" -msgstr "Là Vòng Kết Xuất" +msgstr "Thành Lượt Kết Xuất" msgid "Renders Freestyle output to a separate pass instead of overlaying it on the Combined pass" -msgstr "Kết xuất ngõ ra Phong Cách Tự Do đến một vòng riêng thay thế che trên vòng Gồm" +msgstr "Kết xuất kết quả Phong Cách Tự Do (Freestyle) ra thành một lượt riêng biệt, thay vì lồng nó trên kết quả của lượt Kết Hợp (Combined pass)" msgid "Crease Angle" -msgstr "Góc Nhăn" +msgstr "Góc Độ Nếp Gấp" msgid "Angular threshold for detecting crease edges" -msgstr "Ngưỡng góc cho phát hiện cạnh nhăn" +msgstr "Giới hạn góc độ để phát hiện các cạnh được miết" msgid "Kr Derivative Epsilon" -msgstr "Đạo Hàm Kr Epxilon" +msgstr "Đạo Hàm Kr Epsilon" msgid "Kr derivative epsilon for computing suggestive contours" -msgstr "Đạo Hàm epxilon của Kr cho tính đường đồng mức hình bóng" +msgstr "Đạo hàm epsilon của Kr để tính toán các đường công-tua gợi ý" msgid "Line Sets" -msgstr "Tập Đường" +msgstr "Bộ Đường Nét" msgid "Control Mode" @@ -14528,15 +15539,15 @@ msgstr "Chế Độ Điều Khiển" msgid "Select the Freestyle control mode" -msgstr "Chọn chế độ điều khiển Phong Cách Vẽ Tự Do" +msgstr "Chọn chế độ điều khiển PCTD" msgid "Python Scripting" -msgstr "Văn Thảo Python" +msgstr "Viết Tập Lệnh Python" msgid "Advanced mode for using style modules written in Python" -msgstr "Chế độ cao cấp cho dùng mô đun phong cách được viết bằng Python" +msgstr "Chế độ cao cấp dành cho việc sử dụng các mô-đun phong cách viết bằng Python" msgid "Parameter Editor" @@ -14544,7 +15555,7 @@ msgstr "Trình Biên Soạn Tham Số" msgid "Basic mode for interactive style parameter editing" -msgstr "Chế độ cơ bản cho biên tập tham số kiểu tương tác" +msgstr "Chế độ cơ bản dành cho quá trình biên soạn tương tác tham số về phong cách" msgid "Sphere Radius" @@ -14552,31 +15563,31 @@ msgstr "Bán Kính Hình Cầu" msgid "Sphere radius for computing curvatures" -msgstr "Bán kính hình cầu cho tính độ cong" +msgstr "Bán kính hình cầu để tính toán độ cong" msgid "Culling" -msgstr "Hủy Diệt" +msgstr "Loại Trừ" msgid "If enabled, out-of-view edges are ignored" -msgstr "Nếu bật, sẽ không quan tâm cạnh ở ngaòi màn" +msgstr "Nếu bật thì các cạnh không nhìn thấy sẽ bị loại trừ/bỏ qua" msgid "Material Boundaries" -msgstr "Biên giới vật liệu" +msgstr "Ranh Giới Nguyên Vật Liệu" msgid "Enable material boundaries" -msgstr "Bật ranh giới vật liệu" +msgstr "Cho phép ranh giới chất liệu" msgid "Ridges and Valleys" -msgstr "Dãy Đỉnh Và Thung Lũng" +msgstr "Lằn Gợn và Thung Lũng" msgid "Enable ridges and valleys" -msgstr "Bật đỉnh cao và thung lũng" +msgstr "Cho phép các lằn gợn và thung lũng" msgid "Face Smoothness" @@ -14584,63 +15595,63 @@ msgstr "Độ Mịn Mặt" msgid "Take face smoothness into account in view map calculation" -msgstr "Dùng độ mịn mặt khi tính bán đồ màn" +msgstr "Xem xét đến độ mịn Mặt khi tính toán ánh xạ khung nhìn" msgid "Suggestive Contours" -msgstr "Đường Đồng Mức" +msgstr "Đường Công-Tua Gợi Ý" msgid "Enable suggestive contours" -msgstr "Bật vẽ đường đồng mức" +msgstr "Cho phép vẽ đường công-tua gợi ý" msgid "View Map Cache" -msgstr "Đệm Chứa Bản Đồ Màn" +msgstr "Bộ Đệm Nhớ Ánh Xạ Khung Nhìn" msgid "Keep the computed view map and avoid recalculating it if mesh geometry is unchanged" -msgstr "Giữ bản đồ màn và tránh tính lại nó nếu hình dạng mạng lưới không thay đổi" +msgstr "Duy trì bản đồ góc nhìn đã tính toán để tránh phải tính lại nếu hình học khung lưới không thay đổi" msgid "Edit Curve" -msgstr "Biên Tập Đường Cong" +msgstr "Biên Soạn Đường Cong" msgid "Edition Curve" -msgstr "Biên Tập Đường Cong" +msgstr "Đường cong biên soạn" msgid "Curve Points" -msgstr "Điểm Đường Cong" +msgstr "Điểm của Đường Cong" msgid "Curve data points" -msgstr "Điểm dữ liệu đường cong" +msgstr "Dữ Liệu về các điểm của đường cong" msgid "Curve is selected for viewport editing" -msgstr "Đường cong được chọn cho biên tập trong màn chiếu" +msgstr "Đường cong được chọn để biên soạn trong cổng nhìn" msgid "Point Index" -msgstr "Chỉ Số Điểm" +msgstr "Chỉ Số của Điểm" msgid "Index of the corresponding grease pencil stroke point" -msgstr "Chỉ số của điểm nét bút sáp tương tự" +msgstr "Chỉ số của điểm nét bút chì dầu tương ứng" msgid "Pressure of the grease pencil stroke point" -msgstr "Áp suất của điểm nét bút sáp" +msgstr "Áp Lực của điểm nét bút chì dầu" msgid "Color intensity (alpha factor) of the grease pencil stroke point" -msgstr "Cường độ màu sấc (hệ số độ đục) của điểm nét bút sáp" +msgstr "Cường độ màu (hệ số alpha/độ trong) của điểm nét bút chì dầu" msgid "UV Factor" -msgstr "Hệ Số UV" +msgstr "Hệ Số" msgid "Internal UV factor" @@ -14648,31 +15659,31 @@ msgstr "Hệ số UV nội bộ" msgid "UV Rotation" -msgstr "Xoay UV" +msgstr "Chiều Xoay" msgid "Internal UV factor for dot mode" -msgstr "Hệ số UV nội bộ cho chế độ chấm" +msgstr "Hệ số UV nội bộ dành cho chế độ điểm (dot mode)" msgid "Vertex color of the grease pencil stroke point" -msgstr "Màu đỉnh của điểm nét bút sáp" +msgstr "Màu điểm đỉnh điểm của nét bút chì dầu" msgid "Grease Pencil Frame" -msgstr "Bức Ảnh Bút Sáp" +msgstr "Khung Hình Bút Chì Dầu" msgid "Collection of related sketches on a particular frame" -msgstr "Sưu tập phác họa liên quan của một bức ảnh nhất định" +msgstr "Bộ sưu tập các bản phác họa liên quan trên một khung hình nhất định" msgid "Frame Number" -msgstr "Số Bức Ảnh" +msgstr "Số Khung Hình" msgid "The frame on which this sketch appears" -msgstr "Số bức ảnh của phác họa này" +msgstr "Khung hình mà bản phác họa này sẽ xuất hiện" msgid "Paint Lock" @@ -14680,107 +15691,107 @@ msgstr "Khóa Sơn" msgid "Frame is being edited (painted on)" -msgstr "Bức ảnh đang biên tập (đang sơn)" +msgstr "Khung hình đang bị biên soạn (được sơn lên)" msgid "Keyframe Type" -msgstr "Loại Bức Ảnh Mẫu" +msgstr "Loại Khung Khóa" msgid "Type of keyframe" -msgstr "Loại bức ảnh mẫu" +msgstr "Kiểu khung khóa" msgid "Keyframe" -msgstr "Bức Ảnh Mẫu" +msgstr "Khung Khóa" msgid "Normal keyframe, e.g. for key poses" -msgstr "Bức ảnh mẫu bình thường, ví dụ cho dạng đứng mẫu" +msgstr "Khung khóa bình thường, tức các tư thế chủ chốt" msgid "Breakdown" -msgstr "Bức Ảnh Mẫu Phụ" +msgstr "Phân Tích" msgid "A breakdown pose, e.g. for transitions between key poses" -msgstr "Một dạng đứng phụ, ví dụ cho chuyển tiếp giữa hai đạng đứng mẫu" +msgstr "Tư thế phân tích, tức các tư thế trung gian giữa hai dáng chủ chốt" msgid "Moving Hold" -msgstr "Di Chuyển Giữ Nguyên" +msgstr "Duy Trì Chuyển Động" msgid "A keyframe that is part of a moving hold" -msgstr "Một bức ảnh mẫu là một phần di chuyển giữ nguyên" +msgstr "Khung khóa là một phần trong đoạn duy trì chuyển động" msgid "Extreme" -msgstr "Cực Kỳ" +msgstr "Cường Điệu" msgid "An 'extreme' pose, or some other purpose as needed" -msgstr "Dạng đứng 'cực kỳ', hay cho cộng việc khác theo sự cần thiết" +msgstr "Tư thế 'cường điệu', hoặc vì mục đích khác - tùy theo nhu cầu" msgid "Jitter" -msgstr "Hốt Hoảng" +msgstr "Biến Động" msgid "A filler or baked keyframe for keying on ones, or some other purpose as needed" -msgstr "Cho làm bức ảnh biểu viên hay nướng cho làm bức ảnh mẫu mỗi bức ảnh, hay cho lý do khác tùy theo sự cần thiết" +msgstr "Một tư thế chèn thêm, hoặc đã được nướng, cho những cái đang được khóa hóa, hoặc vì mục đích khác nào đó - tùy theo nhu cầu" msgid "Frame is selected for editing in the Dope Sheet" -msgstr "Bức ảnh được chọn cho biên tập trong Bảng Hoạt Hình" +msgstr "Khung hình đã được chọn để biên soạn trong Bảng Hành Động" msgid "Freehand curves defining the sketch on this frame" -msgstr "Đường cong vẽ tự do được chỉ định phác họa của bức ảnh này" +msgstr "Đồ thị nét vẽ tự do xác định bản phác họa trên khung hình này" msgid "Grease Pencil Frames" -msgstr "Bức Ảnh Bút Sáp" +msgstr "Khung Hình Bút Chì Dầu" msgid "Collection of grease pencil frames" -msgstr "Sưu tập bức ảnh Bút Sáp" +msgstr "Bộ sưu tập các khung hình Bút Chì Dầu" msgid "Grease Pencil Interpolate Settings" -msgstr "Cài đặt Suy Nội Bút Sáp" +msgstr "Cấu Hình Nội Suy Bút Chì Dầu" msgid "Settings for Grease Pencil interpolation tools" -msgstr "Cài đặt cho dụng cụ suy nội Bút Sáp" +msgstr "Cấu hình cho các công cụ nội suy Bút Chì Dầu" msgid "Interpolation Curve" -msgstr "Cong Suy Nội" +msgstr "Đường Cong Nội Suy" msgid "Custom curve to control 'sequence' interpolation between Grease Pencil frames" -msgstr "Đường cong tùy chọn để điều khiển suy nội 'trình tự' giữa bức ảnh Bút Sáp" +msgstr "Đường cong tùy chỉnh để điều khiển nội suy 'trình tự' giữa các khung hình vẽ bằng Bút Chì Dầu" msgid "Grease Pencil Layer" -msgstr "Lớp Bút Sáp" +msgstr "Tầng Bút Chì Dầu" msgid "Collection of related sketches" -msgstr "Sưu tập phác họa liên quan" +msgstr "Bộ sưu tập các bản phác họa liên quan" msgid "Active Frame" -msgstr "Bức Ảnh Hoạt Động" +msgstr "Khung Hình đang Hoạt Động" msgid "Frame currently being displayed for this layer" -msgstr "Bức ảnh đang hiển thị cho lớp này" +msgstr "Khung hình đang được hiển thị cho tầng này" msgid "Set annotation Visibility" -msgstr "Đặt Sự Hiển Thị lời ghi chú" +msgstr "Đặt Tầm Nhìn của chú thích (hiển thị chú thích hay không)" msgid "After Color" @@ -14788,15 +15799,15 @@ msgstr "Màu Sau" msgid "Base color for ghosts after the active frame" -msgstr "Màu cơ sở cho bóng ma sau bức ảnh hoạt động" +msgstr "Màu chủ đạo cho các hình ảo ảnh sau khung hình hiện tại" msgid "Frames After" -msgstr "Bức Ảnh Sau" +msgstr "Khung Hình Sau" msgid "Maximum number of frames to show after current frame" -msgstr "Số lượng bức ảnh tối đa để hiện sau bức ảnh hiện tại" +msgstr "Số khung hình tối đa để hiển thị sau khung hình hiện tại" msgid "Before Color" @@ -14804,19 +15815,19 @@ msgstr "Màu Trước" msgid "Base color for ghosts before the active frame" -msgstr "Màu cơ sở cho bóng ma trước bức ảnh hoạt động" +msgstr "Màu chủ đạo cho các hình ảo ảnh trước khung hình hiện tại" msgid "Frames Before" -msgstr "Bức Ảnh Trước" +msgstr "Khung Hình Trước" msgid "Maximum number of frames to show before current frame" -msgstr "Số lượng bức ảnh tối đa để hiện trước bức ảnh hiện tại" +msgstr "Số khung hình tối đa hiển thị trước khung hình hiện tại" msgid "Annotation Layer Opacity" -msgstr "Độ Đục Lớp Ghi Chú" +msgstr "Độ Đục của Tầng Chú Thích" msgid "Blend Mode" @@ -14828,123 +15839,123 @@ msgstr "Chế độ pha trộn" msgid "Regular" -msgstr "Bình Thường" +msgstr "Thông Thường" msgid "Hard Light" -msgstr "Ánh Sáng Cứng" +msgstr "Ánh Sáng Mạnh" msgid "Custom Channel Color" -msgstr "Kênh Màu Tùy Chọn" +msgstr "Màu Kênh Tùy Chọn" msgid "Custom color for animation channel in Dopesheet" -msgstr "Màu tùy chọn cho kênh hoạt hình trong bảng hoạt hình" +msgstr "Màu tùy chọn dành cho kênh hoạt họa trong Bảng Hành Động" msgid "Color for all strokes in this layer" -msgstr "Tô màu cho tất cả nét ở trong lớp này" +msgstr "Màu sắc cho toàn bộ các đường nét trong tầng lớp này" msgid "Frames" -msgstr "Bức Ảnh" +msgstr "Số/Khung Hình" msgid "Sketches for this layer on different frames" -msgstr "Phác họa cho lớp này trên bức ảnh khác nhau" +msgstr "Phác họa cho tầng này trên các khung hình khác" msgid "Set layer Visibility" -msgstr "Đặt Sự Hiển Thị lớp" +msgstr "Đặt Tầm Nhìn của tầng" msgid "Layer name" -msgstr "Tên lớp" +msgstr "Tên của tầng" msgid "Is Parented" -msgstr "Có Phụ Huynh" +msgstr "Có Phụ Huynh Không" msgid "True when the layer parent object is set" -msgstr "Đúng khi vật thể phụ huynh lớp được đặt" +msgstr "Giá trị 'Đúng' khi đối tượng phụ huynh của tầng đã được sắp đặt" msgid "Ruler" -msgstr "Cây Thước" +msgstr "Thước Đo" msgid "This is a special ruler layer" -msgstr "Cái này là một lớp cây thước đặc biệt" +msgstr "Đây là một tầng thước đo đặc biệt" msgid "Thickness Change" -msgstr "Đổi Bề Rộng" +msgstr "Đổi Độ Dày" msgid "Thickness change to apply to current strokes (in pixels)" -msgstr "Sự thay đổi bề dày để áp dụng cho các nét hiện tại (điểm ảnh)" +msgstr "Sự thay đổi chiều rộng để áp dụng cho nét hiện tại (điểm ảnh)" msgid "Values for change location" -msgstr "Các giá trị cho sự thay đổi vị trí" +msgstr "Các giá trị dành cho sự thay đổi địa điểm" msgid "Locked" -msgstr "Khóa Lại" +msgstr "Bị Khóa" msgid "Protect layer from further editing and/or frame changes" -msgstr "Bảo vệ lớp từ chỉnh sửa thêm và/hay chỉnh đổi bức ảnh" +msgstr "Bảo vệ tầng/khung hình khỏi bị chỉnh sửa hay thay đổi" msgid "Frame Locked" -msgstr "Bức Ảnh Bị Khóa" +msgstr "Khung Hình bị Khóa" msgid "Lock current frame displayed by layer" -msgstr "Khóa bức ảnh đang hiển thị trong lớp" +msgstr "Khóa khung hình hiện tại được hiển thị bởi tầng" msgid "Disallow Locked Materials Editing" -msgstr "Tắt Biên Tập Vật Liệu Được Khóa" +msgstr "Cấm Biên Soạn các Nguyên Vật Liệu đã Khóa" msgid "Avoids editing locked materials in the layer" -msgstr "Tránh biên tập các vật liệu được khóa trong lớp này" +msgstr "Ngăn ngừa biên soạn các nguyên vật liệu đã bị khóa trong tầng lớp" msgid "List of Masking Layers" -msgstr "Danh Sách Lớp Mặt Nạ" +msgstr "Danh sách các Tầng Lớp Chắn Lọc" msgid "Parent inverse transformation matrix" -msgstr "Đặt ma trận biến hóa đảo nghịch phụ huynh" +msgstr "Phụ huynh hóa ma trận biến hóa đảo nghịch" msgid "Matrix Layer Inverse" -msgstr "Lớp Ma Trận Đảo Nghịch" +msgstr "Đảo Nghịch Tầng Lớp Ma Trận" msgid "Local Layer transformation inverse matrix" -msgstr "Ma trận đảo nghịch biến Hóa Lớp Địa Phương " +msgstr "Ma trận đảo nghịch biến hóa của Tầng Lớp Cục Bộ" msgid "Matrix Layer" -msgstr "Lớp Ma Trận" +msgstr "Tầng Lớp Ma Trận" msgid "Local Layer transformation matrix" -msgstr "Ma trận biến hóa Lớp Địa Phương" +msgstr "Ma trận biến hóa của Tầng Lớp Cục Bộ" msgid "Layer Opacity" -msgstr "Độ Đục Lớp" +msgstr "Độ Đục của Tầng" msgid "Parent object" -msgstr "Vật thể phụ huynh" +msgstr "Đối tượng phụ huynh" msgid "Parent Bone" @@ -14952,7 +15963,7 @@ msgstr "Xương Phụ Huynh" msgid "Name of parent bone in case of a bone parenting relation" -msgstr "Tên của xương cho trường hợp có liên hệ phụ huynh xương" +msgstr "Tên của xương phụ huynh trong trường hợp có quan hệ cha con" msgid "Parent Type" @@ -14960,275 +15971,275 @@ msgstr "Loại Phụ Huynh" msgid "Type of parent relation" -msgstr "Loại liên hệ của phụ huynh" +msgstr "Loại quan hệ phụ huynh" msgid "The layer is parented to an object" -msgstr "Lớp đang có một vật thể làm phụ huynh" +msgstr "Tầng có một đối tượng làm phụ huynh" msgid "The layer is parented to a bone" -msgstr "Lớp đang có một xương làm phụ huynh" +msgstr "Tầng có một xương làm phụ huynh" msgid "Pass Index" -msgstr "Chỉ Số Vòng" +msgstr "Chỉ Số Lượt" msgid "Index number for the \"Layer Index\" pass" -msgstr "Chỉ số cho vòng kết xuất \"Chỉ Số Lớp\"" +msgstr "Chỉ số cho lượt \"Chỉ Số Tầng Lớp\"" msgid "Values for changes in rotation" -msgstr "Các giá trị cho sự thay đổi xoay" +msgstr "Các giá trị dành cho sự thay đổi trong xoay chiều" msgid "Values for changes in scale" -msgstr "Các giá trị cho sự thay đổi phóng to" +msgstr "Các giá trị dành cho sự thay đổi trong tỷ lệ" msgid "Layer is selected for editing in the Dope Sheet" -msgstr "Lớp được chọn để biên tập trong Bảng Hoạt Hình" +msgstr "Tầng được chọn để biên soạn trong Bảng Hành Động" msgid "In Front" -msgstr "Phía Trước" +msgstr "Ở Đằng Trước" msgid "Make the layer display in front of objects" -msgstr "Hiển thị lớp phía trước các vật thể" +msgstr "Khiến tầng lớp hiển thị đứng trước các đối tượng" msgid "Show Points" -msgstr "Hiện Điểm" +msgstr "Hiển Thị các Điểm" msgid "Show the points which make up the strokes (for debugging purposes)" -msgstr "Hiện các điểm lắp ráp các nét (cho chỉnh sửa sai lầm)" +msgstr "Hiển thị các điểm tạo nên các nét vẽ (dành cho mục đích điều tra và gỡ lỗi)" msgid "Thickness of annotation strokes" -msgstr "Bề dày của nét lời ghi chú" +msgstr "Độ dày của các đường nét vẽ chú thích" msgid "Tint Color" -msgstr "Màu Nhiễm" +msgstr "Màu Nhuốm" msgid "Color for tinting stroke colors" -msgstr "Màu cho nhiễm màu nét" +msgstr "Màu cho sắc thái của các màu trong nét vẽ" msgid "Tint Factor" -msgstr "Hệ Số Nhiễm" +msgstr "Hệ Số Nhuốm Màu" msgid "Factor of tinting color" -msgstr "Hệ số cho nhiễm màu" +msgstr "Hệ số của màu nhuốm" msgid "Onion Skinning" -msgstr "Bóng Ma" +msgstr "Bóc Vỏ Hành" msgid "Display annotation onion skins before and after the current frame" -msgstr "Hiển thị lời ghi chú trên bóng ma trước và sau bức ảnh hiện tại" +msgstr "Hiển thị các ảo ảnh vỏ hành chú thích trước và sau khung hình hiện tại" msgid "Use Lights" -msgstr "Dùng Đèn" +msgstr "Sử Dụng Ánh Sáng" msgid "Enable the use of lights on stroke and fill materials" -msgstr "Bật sùng đèn trên vật liệu nét và tô đầy" +msgstr "Cho phép sử dụng tác động của ánh sáng trên nguyên vật liệu của nét vẽ và vùng tô kín" msgid "Use Mask" -msgstr "Dùng Mặt Nạ" +msgstr "Dùng Màn Chắn Lọc" msgid "The visibility of drawings on this layer is affected by the layers in its masks list" -msgstr "Sự hiển thị của đồ vẽ trong lớp này được ảnh hưởng bởi các lớp trong danh sách mặt nạ của nó" +msgstr "Tầm nhìn thấy các đường vẽ trong tầng lớp này sẽ bị ảnh hưởng bởi các lớp trong danh sách các màn chắn lọc của nó" msgid "Display onion skins before and after the current frame" -msgstr "Hiển thị bóng ma trươc và sau bức ảnh hiện tại" +msgstr "Hiển thị các ảo ảnh vỏ hành trước và sau khung hình hiện tại" msgid "Solo Mode" -msgstr "Chế Đồ Cô Đơn" +msgstr "Chế Độ Độc Tấu" msgid "In Draw Mode only display layers with keyframe in current frame" -msgstr "Trong Chế Độ Vẽ, chỉ hiển thị những lớp có bức ảnh mẫu trong bức ảnh hiện tại" +msgstr "Trong Chế Độ Vẽ, chỉ hiển thị các tầng lớp với khung khóa trong khung hình hiện tại mà thôi" msgid "Use Masks in Render" -msgstr "Sử dụng Mặt Nạ khi Kết Xuất" +msgstr "Sử Dụng Màn Chắn Lọc trong Kết Xuất" msgid "Include the mask layers when rendering the view-layer" -msgstr "Gồm các lớp mặt nạ khi kết xuất lớp hiển thị" +msgstr "Bao gồm các tầng lớp màn chắn lọc khi kết xuất tầng lớp góc nhìn" msgid "Vertex Paint Opacity" -msgstr "Độ Đục Sơn Đỉnh" +msgstr "Độ đục của Sơn Điểm Đỉnh" msgid "Vertex Paint mix factor" -msgstr "Hệ số pha trộn Sơn Đỉnh" +msgstr "Hệ số hòa trộn của Sơn Điểm Đỉnh" msgid "ViewLayer" -msgstr "LớpMànChiếu" +msgstr "TầngGócNhìn" msgid "Only include Layer in this View Layer render output (leave blank to include always)" -msgstr "Chỉ gồm Lớp trong ngõ ra kết xuất của Lớp Màn Chiếu này (bỏ trống rỗng để luôn luôn gồm nó)" +msgstr "Chỉ bao gồm Tầng Lớp này trong đầu ra kết xuất của Tầng Góc Nhìn này mà thôi (để trống để luôn luôn bao gồm)" msgid "Grease Pencil Masking Layers" -msgstr "Các Lớp Mặt Nạ Bút Sáp" +msgstr "Các Tầng Chọn Lọc của Bút Chì Dầu" msgid "List of Mask Layers" -msgstr "Danh Sách Lớp Mặt Nạ" +msgstr "Danh sách các Tầng Chọn Lọc" msgid "Set mask Visibility" -msgstr "Đặt Sự Hiển Thị mặt nạ" +msgstr "Đặt Tầm Nhìn của màn chắn lọc" msgid "Invert mask" -msgstr "Đảo nghịch mặt nạ" +msgstr "Đảo Nghịch màn chắn lọc" msgid "Mask layer name" -msgstr "Tên lớp mặt nạ" +msgstr "Tên của tầng Màn Chắn Lọc" msgid "GPencil Sculpt Guide" -msgstr "Sáp Bút - Đường Dẵn Khắc" +msgstr "Hướng Dẫn cho Điêu Khắc Nét Bút Chì Dầu" msgid "Guides for drawing" -msgstr "Đường dẫn cho vẽ" +msgstr "Điều hướng cho quá trình vẽ" msgid "Direction of lines" -msgstr "Hướng của đường" +msgstr "Phương hướng của các đường" msgid "Angle Snap" -msgstr "Hút Dính Góc" +msgstr "Bám Dính vào Góc Độ" msgid "Angle snapping" -msgstr "Hút dính góc" +msgstr "Bám dính vào góc độ" msgid "Custom reference point for guides" -msgstr "Điểm tham chiếu tùy chọn để làm đường dẫn" +msgstr "Điểm tham chiếu tùy chỉnh cho các hướng dẫn" msgid "Object used for reference point" -msgstr "Vật thể được dùng cho điểm tham chiếu" +msgstr "Đối tượng sử dụng làm điểm tham chiếu" msgid "Type of speed guide" -msgstr "Loại đường dẫn tốc hành" +msgstr "Thể loại hướng dẫn tốc độ" msgid "Use cursor as reference point" -msgstr "Dùng con trỏ làm điểm tham chiếu" +msgstr "Sử dụng con trỏ làm điểm tham chiếu" msgid "Use custom reference point" -msgstr "Dùng điểm tham chiếu tùy chọn" +msgstr "Sử dụng điểm tham chiếu" msgid "Use object as reference point" -msgstr "Dùng vật thể làm điểm tham chiếu" +msgstr "Sử dụng đối tượng làm điểm tham chiếu" msgid "Spacing" -msgstr "Cách Giữa" +msgstr "Phân Khoảng" msgid "Guide spacing" -msgstr "Cách giứa đường dẫn" +msgstr "Phân khoảng của hướng dẫn" msgid "Circular" -msgstr "Vòng Tròn" +msgstr "Tròn" msgid "Use single point to create rings" -msgstr "Dùng một điểm để chế tạo vành" +msgstr "Sử dụng một điểm để kiến tạo những đường vành hình nhẫn (tròn)" msgid "Radial" -msgstr "Bán Kính Tuyến" +msgstr "Tỏa Tròn" msgid "Use single point as direction" -msgstr "Dùng một điểm làm hướng" +msgstr "Sử dụng một điểm làm định hướng" msgid "Parallel lines" -msgstr "Đường song song" +msgstr "Các đường song song" msgid "Grid" -msgstr "Đồ Thị" +msgstr "Khung Lưới Đồ Thị" msgid "Grid allows horizontal and vertical lines" -msgstr "Đồ thị cho đường ngang và dọc" +msgstr "Khung lưới đồ thị cho phép các đường dọc và ngang" msgid "Isometric" -msgstr "Cùng Cự" +msgstr "Đẳng Cự" msgid "Grid allows isometric and vertical lines" -msgstr "Đồ thị cho đường cùng cự và đường dọc" +msgstr "Khung lưới đồ thị đẳng cự (đồng kích thước) với các đường dọc" msgid "Use Guides" -msgstr "Dùng Đường Dẫn" +msgstr "Sử Dụng Hướng Dẫn" msgid "Enable speed guides" -msgstr "Bật đường dẫn tốc hành" +msgstr "Bật hướng dẫn nhanh" msgid "Use Snapping" -msgstr "Dùng Hút Dính" +msgstr "Sử Dụng Bám Dính" msgid "Enable snapping to guides angle or spacing options" -msgstr "Bật hút dính đến đường dẫn góc và khoảng cách theo tùy chọn" +msgstr "Cho phép bám dính vào tùy chỉnh về góc độ hoặc khoảng cách hướng dẫn" msgid "GPencil Sculpt Settings" -msgstr "Bút Sáp - Cài Đặt Khắc" +msgstr "Sắp Đặt của Bút Chì Dầu Dùng làm Bút Điêu Khắc" msgid "General properties for Grease Pencil stroke sculpting tools" -msgstr "Đặc tính tổng hoát cho dụng cụ khắc nét của Bút Sáp" +msgstr "Những tính chất chung dành cho các công cụ uốn nắn (điêu khắc) nét vẽ Bút Chì Dầu" msgid "Threshold for stroke intersections" -msgstr "Ngưỡng cho nét giao cắt nhau" +msgstr "Giới hạn nét vẽ giao cắt" msgid "Lock Axis" -msgstr "Khóa Trục" +msgstr "Khóa Theo Trục" msgid "Align strokes to current view plane" -msgstr "Sắp xếp nét đến mặt phẳng màn chiếu hiện tái" +msgstr "Căn chỉnh các nét vẽ vào Bbề diện của góc nhìn hiện tại" msgid "Front (X-Z)" @@ -15236,63 +16247,75 @@ msgstr "Trước (X-Z)" msgid "Project strokes to plane locked to Y" -msgstr "Chiếu nét đến mặt phẳng bị khóa với trục Y" +msgstr "Phóng chiếu các nét vẽ vào bề diện được khóa trong trục Y" msgid "Side (Y-Z)" -msgstr "Bên (Y_Z)" +msgstr "Bên (Y-Z)" msgid "Project strokes to plane locked to X" -msgstr "Chiếu nét đến mặt phẳng bị khóa với trục X" +msgstr "Phóng chiếu các nét vẽ vào bề diện được khóa trong trục X" msgid "Top (X-Y)" -msgstr "Trên (X_Y)" +msgstr "Đỉnh (X-Y)" msgid "Project strokes to plane locked to Z" -msgstr "Chiếu nét đến mặt phẳng bị khóa với trục Z" +msgstr "Phóng chiếu các nét vẽ vào bề diện được khóa trong trục Z" msgid "Align strokes to current 3D cursor orientation" -msgstr "Sắp xếp nét đến định hướng con trỏ 3D" +msgstr "Căn chỉnh các nét vẽ vào định hướng của con trỏ 3D hiện tại" msgid "Custom curve to control falloff of brush effect by Grease Pencil frames" -msgstr "Đường cong tùy chọn để kiểm soát sự giảm của hiệu ứng bút bằng bức ảnh Bút Sáp" +msgstr "Đường cong tự chỉnh để điều chỉnh dốc suy giảm của đầu bút bằng các khung hình của Bút Chì Dầu" msgid "Custom curve to control primitive thickness" -msgstr "Đường cong tùy chọn để kiểm soát bề dày của đồ cơ bản" +msgstr "Đường cong tùy chỉnh để điều khiển độ dày của các hình cơ bản" msgid "Auto-Masking Layer" -msgstr "Lớp Tự Động-Che" +msgstr "Tự Động Chắn Lọc bằng Tầng Lớp" + + +msgid "Affect only the Active Layer" +msgstr "Chỉ tác động đến Tầng Lớp đang Hoạt Động mà thôi" + + +msgid "Affect only strokes below the cursor" +msgstr "Chỉ tác động đến các nét bên dưới con trỏ" msgid "Auto-Masking Material" -msgstr "Vật Liệu Tự Động-Che" +msgstr "Tự Động Chắn Lọc bằng Nguyên Vật Liệu" + + +msgid "Affect only the Active Material" +msgstr "Chỉ tác động đến Nguyên Vật Liệu đang Hoạt Động mà thôi" msgid "Auto-Masking Strokes" -msgstr "Nét Tự Động-Che" +msgstr "Tự Động Chắn Lọc bằng Nét Vẽ" msgid "Use Falloff" -msgstr "Dùng Sự Giảm" +msgstr "Dùng Sự Suy Giảm" msgid "Use falloff effect when edit in multiframe mode to compute brush effect by frame" -msgstr "Sử dụng hiệu ứng giảm khi biên tập trong chế độ đa bức ảnh để tính hiệu ứng bằng bức ảnh" +msgstr "Dùng ảnh hưởng suy giảm khi biên soạn trong chế độ đa khung hình để tính toán tác động của đầu bút theo khung hình" msgid "Scale Stroke Thickness" -msgstr "Phóng To Bề Dày Nét" +msgstr "Tỷ Lệ Hóa Độ Dày của Nét Vẽ" msgid "Scale the stroke thickness when transforming strokes" -msgstr "Phóng to bề dày nét khi biến hóa nét" +msgstr "Đổi tỷ lệ về độ dày của nét vẽ khi đang biến hóa chúng" msgid "Use Curve" @@ -15300,31 +16323,31 @@ msgstr "Sử Dụng Đường Cong" msgid "Use curve to define primitive stroke thickness" -msgstr "Sử dụng đường cong cho chỉ định bề rộng nét cơ bản" +msgstr "Dùng đường cong để xác định độ dày nét vẽ hình cơ bản" msgid "Grease Pencil Stroke" -msgstr "Nét Bút Sáp" +msgstr "Nét Bút Chì Dầu" msgid "Freehand curve defining part of a sketch" -msgstr "Đường cong vẽ tự do cho chỉ định một phần của ảnh phác họa" +msgstr "Đường cong vẽ bằng tay tự do xác định bộ phận của một bức phác họa" msgid "Boundbox Max" -msgstr "Hộp Bao Quanh Cực Đại" +msgstr "Tối Đa của Hộp Viền" msgid "Boundbox Min" -msgstr "Hộp Bao Quanh Cực Tiểu" +msgstr "Tối Thiểu của Hộp Viền" msgid "Coordinate space that stroke is in" -msgstr "Tọa độ không gian nét đang ở trong" +msgstr "Không gian tọa độ mà nét vẽ nằm trong đó" msgid "Stroke is in screen-space" -msgstr "Vẽ nét trong không gian màn" +msgstr "Nét vẽ nằm trong không gian màn hình" msgid "3D Space" @@ -15332,7 +16355,7 @@ msgstr "Không Gian 3D" msgid "Stroke is in 3D-space" -msgstr "Vẽ nét trong không gian 3D" +msgstr "Nét vẽ nằm trong không gian 3D" msgid "2D Space" @@ -15340,27 +16363,37 @@ msgstr "Không Gian 2D" msgid "Stroke is in 2D-space" -msgstr "Vẽ nét trong không gian 2D" +msgstr "Nét vẽ nằm trong không gian 2D" msgid "2D Image" -msgstr "Ảnh 2D" +msgstr "Hình Ảnh 2D" msgid "Stroke is in 2D-space (but with special 'image' scaling)" -msgstr "Vẽ nét trong không gian 2D (nhưng dùng phóng to 'ảnh' đặc biệt)" +msgstr "Nét vẽ nằm trong không gian 2D (song với tỷ lệ 'hình ảnh' đặc biệt)" msgid "Temporary data for Edit Curve" -msgstr "Dữ liệu tạm thời cho Biên Tập Đường Cong" +msgstr "Dữ liệu tạm thời cho quá trình Biên Soạn Đường Cong" + + +msgctxt "GPencil" +msgid "End Cap" +msgstr "Nắp Cuối" msgid "Stroke end extreme cap style" -msgstr "Phong cách cho nắp cuối cùng cực đoan của nét" +msgstr "Kiểu nắp ở cuối nét vẽ" + + +msgctxt "GPencil" +msgid "Rounded" +msgstr "Bo Tròn" msgid "Amount of gradient along section of stroke" -msgstr "Mức chuyển sắc trong khúc nét" +msgstr "Lượng dốc màu dọc theo phân đoạn của nét vẽ" msgid "Has Curve Data" @@ -15368,47 +16401,60 @@ msgstr "Có Dữ Liệu Đường Cong" msgid "Stroke has Curve data to edit shape" -msgstr "Nét có dữ liệu Dường cong để biên tập" +msgstr "Nét vẽ có dữ liệu Đường Cong để biên soạn hình dạng" msgid "No Fill" -msgstr "Không Tô Đầy" +msgstr "Không Tô Kín" msgid "Special stroke to use as boundary for filling areas" -msgstr "Nét đặc biệt để sử dụng làm ranh giới cho tô đầy khu vực" +msgstr "Nét vẽ đặc biệt để sử dụng làm ranh giới cho các khu vực tô kín" msgid "Thickness of stroke (in pixels)" -msgstr "Bề rồng nét (đơn vị điểm ảnh)" +msgstr "Độ dày của nét vẽ (trong số điểm ảnh)" msgid "Material slot index of this stroke" -msgstr "Chỉ số khe vật liệu của nét này" +msgstr "Chỉ số khe nguyên vật liệu của nét vẽ này" msgid "Stroke Points" -msgstr "Điểm Nét" +msgstr "Điểm của Nét Vẽ" msgid "Stroke data points" -msgstr "Các điểm dữ liệu của nét" +msgstr "Các điểm dữ liệu của nét vẽ" msgid "Stroke is selected for viewport editing" -msgstr "Nét được chọn cho biên tập trong màn chiếu" +msgstr "Nét vẽ được chọn để biên soạn trong cổng nhìn" msgid "Select Index" -msgstr "Chọn Chỉ Số" +msgstr "Chỉ Số của Lựa Chọn" msgid "Index of selection used for interpolation" -msgstr "Chỉ số của sự lựa chọn được dùng cho suy nội" +msgstr "Chỉ số của lựa chọn sử dụng cho quá trình nội suy" + + +msgctxt "GPencil" +msgid "Start Cap" +msgstr "Nắp Khởi Đầu" msgid "Stroke start extreme cap style" -msgstr "Phong cách cho nắp bắt đầu cực đoan của nét" +msgstr "Kiểu nắp ở đầu nét vẽ" + + +msgid "Init Time" +msgstr "Thời Điểm Bắt Đầu" + + +msgid "Initial time of the stroke" +msgstr "Thời điểm bắt đầu của nét vẽ" msgid "Triangles" @@ -15416,47 +16462,47 @@ msgstr "Tam Giác" msgid "Triangulation data for HQ fill" -msgstr "Dữ liệu tam giác hóa cho tô đầy chất lượng cao" +msgstr "Dữ liệu của phép phân tam giác cho sự tô kín Chất Lượng Cao" msgid "Enable cyclic drawing, closing the stroke" -msgstr "Bật vẽ kiểu chu trình, kết vòng nét" +msgstr "Cho phép cách vẽ tuần hoàn, vòng kín nét vẽ" msgid "Rotation of the UV" -msgstr "Xoay của UV" +msgstr "Xoay Chiều của UV" msgid "UV Scale" -msgstr "Phóng To UV" +msgstr "Tỷ Lệ của UV" msgid "Scale of the UV" -msgstr "Phóng to của UV" +msgstr "Tỷ lệ của UV" msgid "UV Translation" -msgstr "Dịch UV" +msgstr "Dịch Chuyển của UV" msgid "Translation of default UV position" -msgstr "Các dịch của vị trí mặc định của UV" +msgstr "Sự dịch chuyển của vị trí UV mặc định" msgid "Vertex Fill Color" -msgstr "Màu Đỉnh Tô Đầy" +msgstr "Màu Tô Kín của Điểm Đỉnh" msgid "Color used to mix with fill color to get final color" -msgstr "Màu để pha trộn với màu tô đầy cho được màu cuối cùng" +msgstr "Màu dùng để hòa trộn với màu tô kín, nhằm đạt được màu cuối cùng" msgid "Grease Pencil Stroke Point" -msgstr "Điểm Nét Bút Sáp" +msgstr "Điểm của Nét Bút Chì Dầu" msgid "Data point for freehand stroke curve" -msgstr "Điểm dữ liệu cho cong nét tự do" +msgstr "Dữ liệu điểm cho đường cong vẽ bằng tay tự do" msgid "Coordinates" @@ -15464,59 +16510,63 @@ msgstr "Tọa Độ" msgid "Pressure of tablet at point when drawing it" -msgstr "Áp suất trên bảng vẽ tại điểm khi đang vẽ nó" +msgstr "Áp lực trên bàn vẽ tại điểm vẽ" msgid "Point is selected for viewport editing" -msgstr "Điểm được chọn cho biên tập trong màn chiếu" +msgstr "Điểm đã được chọn để biên soạn trong cổng nhìn" msgid "Color intensity (alpha factor)" -msgstr "Độ Rực Rỡ Màu (hệ số độ đục)" +msgstr "Cường độ của màu (hệ số alpha)" + + +msgid "Time relative to stroke start" +msgstr "Thời gian tương đối với điểm khởi đầu của nét vẽ" msgid "UV Fill" -msgstr "Tô Đầy UV" +msgstr "Tô Phủ Kín UV" msgid "Internal UV factor for filling" -msgstr "Hệ số UV nội bộ cho tô đầy" +msgstr "Hệ số UV nội bộ dành cho quá trình tô phủ kín" msgid "Color used to mix with point color to get final color" -msgstr "Màu để pha trộn với màu điểm để được màu cuối cùng" +msgstr "Màu sử dụng để hòa trộn với màu của điểm, hòng đạt được màu cuối cùng" msgid "Grease Pencil Stroke Points" -msgstr "Điểm Nét Bút Sáp" +msgstr "Các Điểm của Nét Bút Chì Dầu" msgid "Collection of grease pencil stroke points" -msgstr "Sưu tập điểm nét bút sáp" +msgstr "Bộ sưu tập các điểm nét Bút Chì Dầu" msgid "Collection of grease pencil stroke" -msgstr "Sưu tập nét bút sáp" +msgstr "Bộ sưu tập các nét Bút Chì Dầu" msgid "Triangle" -msgstr "Tam Giác" +msgstr "Hình Tam Giác" msgid "Triangulation data for Grease Pencil fills" -msgstr "Dữ liệu tam giác hóa cho tô đầy Bút Sáp" +msgstr "Dữ liệu của phép đạc tam giác cho quá trình phủ/tô kín nét Bút Chì Dầu" msgid "First triangle vertex index" -msgstr "Chỉ số của đỉnh thứ nhất của tam giác" +msgstr "Chỉ số điểm đỉnh tam giác thứ nhất" msgid "Second triangle vertex index" -msgstr "Chỉ số của đỉnh thứ hai của tam giác" +msgstr "Chỉ số điểm đỉnh tam giác thứ hai" msgid "Third triangle vertex index" -msgstr "Chỉ số của đỉnh thứ ba của tam giác" +msgstr "Chỉ số điểm đỉnh tam giác thứ ba" msgctxt "Operator" @@ -15525,31 +16575,31 @@ msgstr "Đồ Đạc" msgid "Collection of gizmos" -msgstr "Sưu tập đồ đạc" +msgstr "Bộ sưu tập các đồ dùng gizmos" msgid "Gizmo group this gizmo is a member of" -msgstr "Nhóm đồ đạc thì đồ đạc này được làm nhân viên" +msgstr "Nhóm đồ dùng mà gizmo này là một thành viên trong đó" msgid "Hide Keymap" -msgstr "Ần Ánh Xạ Phím" +msgstr "Ẩn Giấu Bố Trí Phím" msgid "Ignore the key-map for this gizmo" -msgstr "Không áp dụng ánh xạ phím cho đồ đạc này" +msgstr "Bỏ qua bố trí bàn phím cho gizmo này" msgid "Hide Select" -msgstr "Ẩn Được Chọn" +msgstr "Tắt Khả Năng Lựa Chọn" msgid "Highlight" -msgstr "Nổi Bật" +msgstr "Nêu Bật/Điểm Nhấn" msgid "Line Width" -msgstr "Bề Dày Nét" +msgstr "Chiều Rộng Nét" msgid "Basis Matrix" @@ -15557,7 +16607,7 @@ msgstr "Ma Trận Cơ Sở" msgid "Offset Matrix" -msgstr "Ma Trận Dịch" +msgstr "Ma Trận Dịch Chuyển" msgid "Space Matrix" @@ -15565,164 +16615,164 @@ msgstr "Ma Trận Không Gian" msgid "Final World Matrix" -msgstr "Ma Trận Thế Giới Cuối" +msgstr "Ma Trận Final World" msgid "Scale Basis" -msgstr "Cơ Sở Phóng To" +msgstr "Tỷ Lệ Dựa Vào" msgid "Select Bias" -msgstr "Chọn Thành Kiến" +msgstr "Chênh Lệch Cho Phép Khi Chọn" msgid "Depth bias used for selection" -msgstr "Thành kiến độ sâu được dùng cho sự lựa chọn" +msgstr "Khoảng chênh lệch cho phép về chiều sâu sử dụng trong khi lựa chọn" msgid "Show Hover" -msgstr "Hiện Bay Lượn" +msgstr "Hiển Thị khi Lơ Lửng Ở Trên" msgid "Show Active" -msgstr "Hiện Hoạt Động" +msgstr "Hiển Thị khi Hoạt Động" msgid "Show while dragging" -msgstr "Hiện khi đang kéo" +msgstr "Hiển thị trong khi đang kéo rê" msgid "Scale Offset" -msgstr "Dịch Phóng To" +msgstr "Tỷ Lệ Hóa Dịch Chuyển" msgid "Scale the offset matrix (use to apply screen-space offset)" -msgstr "Phóng to ma trận dịch (chỉ áp dụng cho dịch không gian màn)" +msgstr "Tỷ lệ hóa ma trận dịch chuyển (dùng để áp dụng dịch chuyển của không gian màn hình)" msgid "Use scale when calculating the matrix" -msgstr "Sử dụng phóng to khi tính ma trận" +msgstr "Dùng tỷ lệ khi tính toán ma trận" msgid "Show Value" -msgstr "Hiện Giá Trị" +msgstr "Hiển Thị Giá Trị" msgid "Show an indicator for the current value while dragging" -msgstr "Hiện một cái chỉ cho giá trị hiện tại khi đang kéo" +msgstr "Hiển thị một chỉ dấu cho giá trị hiện tại trong khi đang kéo rê" msgid "Handle All Events" -msgstr "Xử Lý Hết Sự Kiện" +msgstr "Xử Lý Toàn Bộ các Sự Kiện" msgid "When highlighted, do not pass events through to be handled by other keymaps" -msgstr "Khi được tô sáng, không truyền sự kiện qua cho bản đồ phím được xử lý" +msgstr "Khi được nêu bật thì đừng đưa các sự kiện qua để các bố trí phím khác xử lý" msgid "Grab Cursor" -msgstr "Bắt Con Trỏ" +msgstr "Nắm Bắt Con Trỏ" msgid "Tool Property Init" -msgstr "Khởi Động Đặc Tính Dụng Cụ" +msgstr "Khởi Động Tính Chất của Công Cụ" msgid "Merge active tool properties on activation (does not overwrite existing)" -msgstr "Gồm đặc tính dụng cụ khi khởi động (mà không ghi lại trên có sẵn)" +msgstr "Hội nhập các tính chất công cụ đang hoạt động khi kích hoạt (không viết đè lên cái tồn tại)" msgid "Select Background" -msgstr "Chọn Cảnh Hậu" +msgstr "Nền của Lựa Chọn" msgid "Don't write into the depth buffer" -msgstr "Đừng ghi vào đệm độ sâu" +msgstr "Không được viết vào bộ đệm về chiều sâu" msgid "Use Tooltip" -msgstr "Dùng Đề Thị Dụng Cụ" +msgstr "Dùng Chú Thích Công Cụ" msgid "Use tooltips when hovering over this gizmo" -msgstr "Dùng đề thị dụng cụ khi đang đừng lại trên đồ đạc này" +msgstr "Sử dụng chú thích công cụ khi để đầu chuột lơ lửng trên gizmo này" msgctxt "Operator" msgid "GizmoGroup" -msgstr "NhómĐồĐạc" +msgstr "Nhóm Gizmo" msgid "Storage of an operator being executed, or registered after execution" -msgstr "Sự chứa của thao tác đang thực hành, hay được đăng ký sau thực hành" +msgstr "Kho lưu trữ của một thao tác đang được thi hành, hoặc được đăng ký sau khi thi hành" msgid "Options for this operator type" -msgstr "Tùy chọn cho thao tác loại này" +msgstr "Các tùy chọn cho thể loại thao tác này" msgid "Use in 3D viewport" -msgstr "Sử dụng trong màn chiếu 3D" +msgstr "Sử dụng trong cổng nhìn 3D" msgid "Scale to respect zoom (otherwise zoom independent display size)" -msgstr "Phóng to đến tỉ số phóng vào (nếu không, phóng to độc lập khổ màn hình)" +msgstr "Tỷ lệ tôn trọng thu phóng (nếu không, thu phóng sẽ hoàn toàn độc lập với kích thước hiển thị)" msgid "Depth 3D" -msgstr "Độ Sâu 3D" +msgstr "Chiều Sâu 3D" msgid "Supports culled depth by other objects in the view" -msgstr "Hỗ trợ hủy diệt độ sâu bằng vật thể khác trong màn chiếu" +msgstr "Hỗ trợ loại bỏ theo chiều sâu bởi có các đối tượng khác nằm trong khung nhìn (bị che chắn)" msgid "Supports selection" -msgstr "Hỗ trợ sự lựa chọn" +msgstr "Hỗ trợ lựa chọn" msgid "Persistent" -msgstr "Cố Chấp" +msgstr "Ổn Định" msgid "Show Modal All" -msgstr "Hiện Hết Cách Thức" +msgstr "Hiển Thị Mô Thái Toàn Phần" msgid "Show all while interacting, as well as this group when another is being interacted with" -msgstr "Hiện hết khi đang tương tác, và nhóm này khi đang tương tác với một nhóm khác" +msgstr "Hiển thị toàn bộ khi đang tương tác. Cũng như nhóm này, khi một nhóm khác đang được tương tác với nó" msgid "Exclude Modal" -msgstr "Trừ Lọai Cách Thức" +msgstr "Loại Trừ Mô Thái" msgid "Show all except this group while interacting" -msgstr "Hiện hết trừ nhóm này khi đang tương tác" +msgstr "Hiển thị toàn bộ ngoại trừ nhóm này trong khi đang tương tác" msgid "Tool Init" -msgstr "Khởi Động Dụng Cụ" +msgstr "Khởi Thủy Công Cụ" msgid "Postpone running until tool operator run (when used with a tool)" -msgstr "Trì hoãn chạy đến thao tác dụng cụ được chạy (khi sử dụng với một dụng cụ)" +msgstr "Đình chỉ thi hành cho đến khi thao tác công cụ chạy (khi được sử dụng với một công cụ)" msgid "Use fallback tools keymap" -msgstr "Dùng ánh xạ phím dụng cụ dự phòng" +msgstr "Sử dụng bố trí phím công cụ dự bị" msgid "Add fallback tools keymap to this gizmo type" -msgstr "Thêm ánh xạ phím dụng cụ dự phòng cho loại đồ đạc này" +msgstr "Thêm bố trí phím công cụ dự bị vào thể loại gizmo này" msgid "VR Redraws" -msgstr "Vẽ Lại Sự Thật Ảo" +msgstr "Vẽ Lại VR" msgid "The gizmos are made for use with virtual reality sessions and require special redraw management" -msgstr "Đồ đạc cho sử dụng với phiên chạy sự thật ảo và yêu cầu phương pháp vẽ lại đặt biệt" +msgstr "Các công cụ gizmo được tạo ra để sử dụng với những phiên thực tế ảo, và chúng đòi hỏi sự quản lý vẽ lại khá đặc biệt" msgid "Region Type" @@ -15730,7 +16780,7 @@ msgstr "Loại Vùng" msgid "The region where the panel is going to be used in" -msgstr "Vùng thì bảng sẽ được sử dụng" +msgstr "Vùng nơi mà bảng sẽ được sử dụng trong đó" msgid "Window" @@ -15738,7 +16788,7 @@ msgstr "Cửa Sổ" msgid "Header" -msgstr "Phần Đầu" +msgstr "Tiêu Đề" msgid "Temporary" @@ -15746,35 +16796,39 @@ msgstr "Tạm Thời" msgid "Sidebar" -msgstr "Thanh Bên Hông" +msgstr "Thanh Bên" msgid "Tools" -msgstr "Dụng Cụ" +msgstr "Công Cụ" msgid "Tool Properties" -msgstr "Đặc Tính Dụng Cụ" +msgstr "Tính Chất Công Cụ" + + +msgid "Asset Shelf Header" +msgstr "Tiêu Đề của Kệ Tài Sản" msgid "Floating Region" -msgstr "Vùng Nổi" +msgstr "Vùng Trôi Nổi" msgid "Navigation Bar" -msgstr "Thanh Chuyển Hướng" +msgstr "Thanh Điều Hướng" msgid "Execute Buttons" -msgstr "Nút Thức Hành" +msgstr "Nút Thi Hành" msgid "Footer" -msgstr "Chân Màn" +msgstr "Chân Trang" msgid "Tool Header" -msgstr "Phần Đằu Dụng Cụ" +msgstr "Tiêu Đề của Công Cụ" msgid "XR" @@ -15782,7 +16836,7 @@ msgstr "XR" msgid "The space where the panel is going to be used in" -msgstr "Không gian thì bảng sẽ được sử dụng" +msgstr "Không gian mà bảng sẽ được sử dụng trong đó" msgid "Gizmos" @@ -15790,51 +16844,55 @@ msgstr "Đô Đạc" msgid "List of gizmos in the Gizmo Map" -msgstr "Danh sách của đồ đạc trong Bản Đồ Đồ Đạc" +msgstr "Liệt kê các đồ dùng trong Ánh Xạ Gizmo" msgid "Has Reports" -msgstr "Có Biên Báo" +msgstr "Có Thông Báo" msgid "GizmoGroup has a set of reports (warnings and errors) from last execution" -msgstr "Nhóm Đồ Đạc có một tập bien báo (cảnh báo và sai lầm) từ lần trước được thực hành" +msgstr "Nhóm Gizmo có một tập các thông báo (cảnh báo và lỗi) từ lần thi hành sau cùng" msgid "VR Controller Poses Indicator" -msgstr "Đồ Biểu Lộ Dạng Đứng Của Đồ Điều Khiển VR" +msgstr "Dấu Chỉ Tư Thế của Bộ Điều Khiển VR" msgid "VR Landmark Indicators" -msgstr "Đồ Biểu Lộ Mốc Bờ Của Sự Thật Ảo" +msgstr "Dấu Chỉ Địa Ranh VR" msgid "VR Viewer Pose Indicator" -msgstr "Đồ Biểu Lộ Dạng Đứng Của Hiển Thị Sự Thật Ảo" +msgstr "Dấu Chỉ Tư Thế Quan Sát VR" msgid "Gizmo Group Properties" -msgstr "Đặc Tính Nhóm Đồ Đạc" +msgstr "Tính Chất của Nhóm Gizmo" msgid "Input properties of a Gizmo Group" -msgstr "Đặc tính ngõ vào của một Nhóm Đồ Đạc" +msgstr "Các tính chất đầu vào của một Nhóm Gizmo" msgid "Gizmo Properties" -msgstr "Đặc Tính Đồ Đạc" +msgstr "Tính Chất của Gizmo" + + +msgid "Input properties of a Gizmo" +msgstr "Tính chất đầu vào của một Gizmo" msgid "Modifier affecting the Grease Pencil object" -msgstr "Bộ điều chỉnh đang ảnh hướng vật thể Bút Sáp" +msgstr "Bộ điều chỉnh tác động đối tượng Bút Chì Dầu" msgid "Override Modifier" -msgstr "Bộ Điều Chỉnh Vượt Quyền" +msgstr "Bộ Điều Chỉnh của Vượt Quyền" msgid "In a local override object, whether this modifier comes from the linked reference object, or is local to the override" -msgstr "Trong một vật thể ràng buộc, bộ điều chỉnh này từ vật thể tham chiếu được liên kết, hay nó là địa phương cho đồ vượt quyền" +msgstr "Trong một đối tượng vượt quyền cục bộ, liệu bộ điều chỉnh này đến từ đối tượng tham chiếu liên kết hoặc là cục bộ với trường hợp vượt quyền" msgid "Modifier name" @@ -15842,51 +16900,55 @@ msgstr "Tên bộ điều chỉnh" msgid "Set modifier expanded in the user interface" -msgstr "Đặt mở rộng bộ điều chỉnh trong giao điện người dùng" +msgstr "Mở rộng bộ điều chỉnh trong giao điện người dùng" msgid "Edit Mode" -msgstr "Chế Độ Biên Tập" +msgstr "Chế Độ Biên Soạn" msgid "Display modifier in Edit mode" -msgstr "Hiển thị bộ điều chỉnh trong chế độ Biên Tập" +msgstr "Hiển thị bộ điều chỉnh trong Chế Độ Biên Soạn" msgid "Use modifier during render" -msgstr "Sử dụng bộ điều chỉnh khi kết xuất" +msgstr "Sử dụng bộ điều chỉnh trong khi kết xuất" msgid "Display modifier in viewport" -msgstr "Hiển thị bộ điều chỉnh trong màn chiếu" +msgstr "Hiển thị bộ điều chỉnh trong cổng nhìn" msgid "Texture Mapping" msgstr "Ánh Xạ Chất Liệu" +msgid "Change stroke UV texture values" +msgstr "Đổi các giá trị chất liệu UV của nét vẽ" + + msgid "Time Offset" -msgstr "Dịch thời gian" +msgstr "Dịch Chuyển Thời Gian" msgid "Offset keyframes" -msgstr "Dịch bức ảnh mẫu" +msgstr "Dịch chuyển các khung khóa" msgid "Vertex Weight Angle" -msgstr "Góc Quyền Lượng Đỉnh" +msgstr "Góc Độ do Trọng Lượng Điểm Đỉnh" msgid "Generate Vertex Weights base on stroke angle" -msgstr "Chế tạo Quyền Lượng Đỉnh tùy góc nét" +msgstr "Sinh tạo Trọng Lượng Điểm Đỉnh dựa trên góc độ của nét vẽ" msgid "Vertex Weight Proximity" -msgstr "Cách Gần Quyền Lượng Đỉnh" +msgstr "Độ Tiếp Cận Thay Đổi Trọng Lượng Điểm Đỉnh" msgid "Generate Vertex Weights base on distance to object" -msgstr "Chế tạo Quyền Lượng Đỉnh tùy khoảng cách đến vật thể" +msgstr "Sinh tạo Trọng Lượng Điểm Đỉnh dựa trên khoảng cách tới đối tượng" msgid "Array" @@ -15894,75 +16956,75 @@ msgstr "Mảng" msgid "Create array of duplicate instances" -msgstr "Chế tạo mảng của các thực thể sao chép" +msgstr "Kiến tạo mảng cho các thực thể sao chép" msgid "Build" -msgstr "Xây" +msgstr "Xây Dựng" msgid "Create duplication of strokes" -msgstr "Chế tạo bản sao của các nét" +msgstr "Kiến Tạo bản sao của các nét vẽ" msgid "Dot Dash" -msgstr "Gạch Ngang Chấm" +msgstr "Chấm Gạch" msgid "Generate dot-dash styled strokes" -msgstr "Chế tạo nét kiểu gạnh ngang chấm" +msgstr "Sinh tạo các nét vẽ dưới dạng chấm vạch" msgid "Envelope" -msgstr "Bao Bì" +msgstr "Phong Bao" msgid "Create an envelope shape" -msgstr "Chố tạo một hình dạng bao bì" +msgstr "Kiến Tạo một hình dạng phong bao" msgid "Extend or shrink strokes" -msgstr "Kéo dài hay rút ngắn các nét" +msgstr "Kéo dài hoặc thu ngắn nét vẽ" msgid "Line Art" -msgstr "Nghệ Thuật Đường Nét" +msgstr "Mỹ Thuật Đường Nét" msgid "Generate line art strokes from selected source" -msgstr "Chế tạo nghệ thuất đường nét từ nguồn được chọn" +msgstr "Sinh tạo mỹ thuật đường nét từ nguồn đã chọn" msgid "Mirror" -msgstr "Gương" +msgstr "Phản Chiếu Đối Xứng" msgid "Duplicate strokes like a mirror" -msgstr "Bản sao các nét như một cái gương" +msgstr "Nhân đôi nét vẽ một cách phản chiếu đối xứng" msgid "Multiple Strokes" -msgstr "Nhiều Nét" +msgstr "Nhiều Nét Vẽ" msgid "Produce multiple strokes along one stroke" -msgstr "Chế tạo nhiều nét cùng theo một nét" +msgstr "Tạo ra nhiều nét vẽ dọc theo một nét" msgid "Simplify stroke reducing number of points" -msgstr "Đơn giản hóa nét bằng giảm số lượng điểm" +msgstr "Đơn giản hóa nét vẽ để thuyên giảm số điểm" msgid "Subdivide" -msgstr "Phân Hóa" +msgstr "Phân Chia" msgid "Subdivide stroke adding more control points" -msgstr "Phân hóa nét bằng tăng số lượng điểm kiểm soát" +msgstr "Phân chia nét vẽ để cho thêm các điểm điều khiển" msgid "Deform stroke points using armature object" -msgstr "Méo hóa điểm nét bằng sử dụng vật thể cốt" +msgstr "Dùng đối tượng khung cốt biến dạng các điểm của nét vẽ" msgid "Hook" @@ -15970,7 +17032,7 @@ msgstr "Móc" msgid "Deform stroke points using objects" -msgstr "Méo hóa điểm nét bằng sử dụng vật thể" +msgstr "Dùng đối tượng để biến dạng các điểm của nét vẽ" msgid "Lattice" @@ -15978,335 +17040,391 @@ msgstr "Lưới Rào" msgid "Deform strokes using lattice" -msgstr "Méo hóa điểm nét bằng dùng lưới rào" +msgstr "Biến dạng các nét vẽ dùng lưới rào" msgid "Add noise to strokes" -msgstr "Tăng huyên náo trong nét" +msgstr "Thêm nhiễu (sự hỗn loạn) vào các nét vẽ" msgid "Change stroke location, rotation or scale" -msgstr "Đổi vị trí, xoay, hay phóng to nét" +msgstr "Đổi vị trí, độ xoay hoặc tỷ lệ của nét vẽ" msgid "Project the shape onto another object" -msgstr "Chiếu hình dạng trên một vật thể khác" +msgstr "Phóng chiếu hình dạng lên một đối tượng khác" msgid "Smooth" -msgstr "Mịn Hóa" +msgstr "Làm/Mịn Màng" msgid "Smooth stroke" -msgstr "Mịn hóa nét" +msgstr "Nắn mượt nét vẽ" msgid "Change stroke thickness" -msgstr "Đổi bề dày nét" +msgstr "Đổi độ dày của nét vẽ" msgid "Hue/Saturation" -msgstr "Màu Sắc/Độ Tươi" +msgstr "Sắc Màu/Độ Bão Hòa" msgid "Apply changes to stroke colors" -msgstr "Áp dụng sự biến đổi màu nét" +msgstr "Áp dụng các thay đổi về màu sắc của nét vẽ" msgid "Opacity of the strokes" -msgstr "Độ đục của nét" +msgstr "Độ đục của các nét vẽ" msgid "Tint" -msgstr "Nhiễm Sắc" +msgstr "Nhuốm Màu" msgid "Tint strokes with new color" -msgstr "Nhiểm nét bằng màu mới" +msgstr "Nhốm màu nét vẽ dùng một màu sắc khác" msgid "Armature Modifier" -msgstr "Bộ Điều Chỉnh Cốt" +msgstr "Bộ Điều Chỉnh Khung Cốt" msgid "Change stroke using armature to deform modifier" -msgstr "Đổi nét bằng sử dụng cốt để méo hóa bộ điều chỉnh" +msgstr "Bộ điều chỉnh biến đổi nét vẽ dùng khung cốt để biến dạng" msgid "Invert vertex group influence" -msgstr "Đảo ngược sự ảnh hưởng của nhóm đỉnh" +msgstr "Đảo ngược ảnh hưởng của nhóm điểm đỉnh" msgid "Armature object to deform with" -msgstr "Vật thể cốt dùng làm méo hóa" +msgstr "Đối tượng khung cốt để biến dạng hình" msgid "Use Bone Envelopes" -msgstr "Dùng Bao Bì Xương" +msgstr "Dùng Phong Bao của Xương" msgid "Bind Bone envelopes to armature modifier" -msgstr "Trói bao bì xương với bộ điều chỉnh cốt" +msgstr "Kết Buộc Phong Bao của Xương với bộ điều chỉnh khung cốt" msgid "Use Vertex Groups" -msgstr "Dùng Nhóm Đỉnh" +msgstr "Dùng các Nhóm Điểm Đỉnh" msgid "Bind vertex groups to armature modifier" -msgstr "Trói nhóm đỉnh với bộ điều chỉnh cốt" +msgstr "Kết buộc nhóm điểm đỉnh với bộ điều chỉnh khung cốt" msgid "Name of Vertex Group which determines influence of modifier per point" -msgstr "Tên của Nhóm Đỉnh thì được xác định sự ảnh hưởng của bộ điều chỉnh tại mỗi điểm" +msgstr "Tên của Nhóm Điểm Đỉnh, cái quyết định ảnh hưởng của bộ điều chỉnh trên mỗi điểm" msgid "Instance Modifier" -msgstr "Bộ Điều Chỉnh Thực Thể" +msgstr "Bộ Điều Chỉnh Thực Thể Hóa" msgid "Create grid of duplicate instances" -msgstr "Chế tạo đồ thị của thực thể bản sao" +msgstr "Kiến tạo khung lưới đồ thị các thực thể sao chép" msgid "Constant Offset" -msgstr "Dịch Hằng Số" +msgstr "Dịch Chuyển Bất Biến" msgid "Value for the distance between items" -msgstr "Giá trị cho khoảng cách giữa mặt hàng" +msgstr "Giá trị về khoảng cách giữa các phần tử" msgid "Number of items" -msgstr "Số lượng mặt hàng" +msgstr "Số phần tử" msgid "Inverse Pass" -msgstr "Đảo Nghịch Vòng" +msgstr "Đảo Nghịch Lượt" msgid "Inverse filter" -msgstr "Đảo nghịch bộ lọc" +msgstr "Thanh Lọc Đảo nghịch" msgid "Inverse Layers" -msgstr "Đảo Nghịch Lớp" +msgstr "Đảo Nghịch Tầng Lớp" msgid "Inverse Materials" -msgstr "Vật Liệu Đảo Nghịch" +msgstr "Đảo Nghịch Nguyên Vật Liệu" msgid "Pass" -msgstr "Vòng" +msgstr "Lượt" msgid "Layer pass index" -msgstr "Chỉ số vòng lớp" +msgstr "Chỉ số lượt của tầng lớp" msgid "Material used for filtering effect" -msgstr "Vật thể được dùng cho hiệu ứng bộ lọc" +msgstr "Nguyên vật liệu sử dụng cho hiệu ứng thanh lọc" + + +msgid "Offset Object" +msgstr "Đối Tượng Dịch Chuyển" msgid "Use the location and rotation of another object to determine the distance and rotational change between arrayed items" -msgstr "Dùng vị trí và xoay của một vật thể khác để xắc định chênh lệch khoảng cách và xoay giữa mặt hàng trong mảng " +msgstr "Dùng vị trí và độ xoay của một đối tượng khác để xác định sự thay đổi về khoảng cách và độ xoay giữa các phần tử trong mảng" msgid "Pass index" -msgstr "Chỉ số vòng" +msgstr "Chỉ số của lượt" msgid "Random Offset" -msgstr "Dịch Ngẫu Nhiên" +msgstr "Dịch Chuyển Ngẫu Nhiên" msgid "Value for changes in location" -msgstr "Giá trị cho sự biến đổi của vị trí" +msgstr "Giá trị về nhưng thay đổi của vị trí" msgid "Random Rotation" -msgstr "Xoay Ngẫu Nhiên" +msgstr "Đổi Chiều Xoay Ngẫu Nhiên" msgid "Value for changes in rotation" -msgstr "Giá trị cho sự biến đổi của xoay" +msgstr "Giá trị dành cho các thay đổi trong sự xoay chiều" msgid "Value for changes in scale" -msgstr "Giá trị cho sự biến đổi của phóng to" +msgstr "Giá trị dành cho các thay đổi trong tỷ lệ" msgid "Relative Offset" -msgstr "Dịch Tương Đối" +msgstr "Dịch Chuyển Tương Đối" msgid "The size of the geometry will determine the distance between arrayed items" -msgstr "Kích cỡ của hình dạng sẽ xác định khoảng cách giữa mặt hàng trong mảng" +msgstr "Kích thước hình thể sẽ xác định khoảng cách giữa đối tượng trong mảng" msgid "Index of the material used for generated strokes (0 keep original material)" -msgstr "Chỉ số của vật liệu sử dụng cho nét được chế tạo (số 0 cho giữ vật liệu ban đầu)" +msgstr "Chỉ số của chất liệu sử dụng cho các nét vẽ sinh tạo (0 = duy trì nguyên vật liệu gốc)" msgid "Random seed" -msgstr "Số hạt ngẫu nhiên" +msgstr "Mầm ngẫu nhiên" msgid "Enable offset" -msgstr "Bật địch" +msgstr "Bật Dịch Chuyển" + + +msgid "Use Object Offset" +msgstr "Sử Dụng Đối Tượng Dịch Chuyển" msgid "Enable object offset" -msgstr "Bật dịch nới vật thể" +msgstr "Bật dùng đối tượng dịch chuyển" msgid "Shift" -msgstr "Dịch" +msgstr "Shift/Xê Dịch" msgid "Enable shift" -msgstr "Bật dịch" +msgstr "Cho phép xê dịch" msgid "Uniform Scale" -msgstr "Phóng To Đều" +msgstr "Tỷ Lệ Đồng Đều" msgid "Use the same random seed for each scale axis for a uniform scale" -msgstr "Dùng cùng một số hạt ngẫu nhiên cho phóng to mỗi trục đều đặn" +msgstr "Sử dụng cùng một mầm ngẫu nhiên với mỗi trục đổi tỷ lệ hầu cho chúng có tỷ lệ đồng đều" msgid "Build Modifier" -msgstr "Xây Dựng Bộ Điều Chỉnh" +msgstr "Bộ Điều Chỉnh Xây Dựng" msgid "Animate strokes appearing and disappearing" -msgstr "Hoạt hình nét xuất hiện và biến mất" +msgstr "Hoạt Họa sự xuất hiện và biến mất của các nét vẽ" msgid "Time Alignment" -msgstr "Sắp Xếp Thời Gian" +msgstr "Đồng Bộ Thời Gian" + + +msgid "How should strokes start to appear/disappear" +msgstr "Các nét vẽ sẽ bắt đầu xuất hiện/biến mất như thế nào" msgid "Align Start" -msgstr "Sắp Xếp Bắt Đầu" +msgstr "Căn Chỉnh Khởi Đầu" msgid "All strokes start at same time (i.e. short strokes finish earlier)" -msgstr "Tất cả nét được bắt đầu cùng một lượt (ví dụ nét ngắn xong sớm hơn)" +msgstr "Toàn bộ các nét vẽ khởi đầu cùng một lúc (chẳng hạn các nét vẽ ngắn sẽ kết thúc sớm hơn)" msgid "Align End" -msgstr "Kết Thúc Cùng Lượt" +msgstr "Căn Chỉnh Kết Thúc" msgid "All strokes end at same time (i.e. short strokes start later)" -msgstr "Tất cả nét được kết thúc cùng một lượt (ví dụ nét ngắn bắt đầu trễ hơn)" +msgstr "Toàn bộ các nét vẽ kết thúc cùng một lúc (chẳng hạn các nét vẽ ngắn sẽ khởi đầu muộn hơn)" msgid "Fade Factor" -msgstr "Hệ Số Phai" +msgstr "Hệ Số Phai Mờ Dần" msgid "Defines how much of the stroke is fading in/out" -msgstr "Chỉ định bao nhiêu của nét được phai đục/trong" +msgstr "Định nghĩa lượng làm nhòe mờ dần nét vẽ vào/ra là bao nhiêu" msgid "Opacity Strength" -msgstr "Sức Độ Đục" +msgstr "Cường Độ đối với Độ Đục" msgid "How much strength fading applies on top of stroke opacity" -msgstr "Sức phai được áp dụng trên độ đục nét" +msgstr "Cường độ làm nhòe mờ dần áp dụng trên độ đục của nét vẽ" msgid "Thickness Strength" -msgstr "Sức Độ Dày" +msgstr "Cường Độ đối với Độ Dày" msgid "How much strength fading applies on top of stroke thickness" -msgstr "Sức phai được áp dụng trên độ dày của nét" +msgstr "Cường độ làm nhòe mờ dần áp dụng trên độ dày của nét vẽ" msgid "End Frame (when Restrict Frame Range is enabled)" -msgstr "Bức Ảnh Kết Thúc (khi được bật Hạn Chế Phạm Vi Bức Ảnh)" +msgstr "Khung Hình Cuối (khi Hạn Chế Phạm Vi Khung Hình được bật lên)" msgid "Start Frame (when Restrict Frame Range is enabled)" -msgstr "Bức Ảnh Bắt Đầu (khi được bật Hạn Chế Phạm Vi Bức Ảnh)" +msgstr "Khung Hình Đầu (khi Hạn Chế Phạm Vi Khung Hình được bật lên)" msgid "Maximum number of frames that the build effect can run for (unless another GP keyframe occurs before this time has elapsed)" -msgstr "Số lượng bức ảnh tối đa thì hiệu ứng xây lên được chạy (trừ gặp một bức ảnh mẫu trước thời gian này đã hết)" +msgstr "Số khung hình tối đa mà quá trình kiến dựng ảnh hưởng (build effect) có thể hoạt động (trừ phi một khung khóa Bút Chì Dầu nào đó xảy ra trước khi thời gian này kết thúc)" + + +msgid "How strokes are being built" +msgstr "Các nét vẽ được xây dựng như thế nào" msgid "Sequential" -msgstr "Trình Tự" +msgstr "Tuần Tự" msgid "Strokes appear/disappear one after the other, but only a single one changes at a time" -msgstr "Nét xuất hiện/biến mất từ cái sau nhau, nhưng chỉ một nét được đổi một lượt" +msgstr "Các nét vẽ xuất hiện/biến mất, cái nó sau cái kia, song chỉ mỗi cái thay đổi một lần mà thôi" msgid "Concurrent" -msgstr "Cùng Lượt" +msgstr "Đồng Thời" msgid "Multiple strokes appear/disappear at once" -msgstr "Nhiều nét xuất hiện/biến mất cùng một lượt" +msgstr "Nhiều nét vẽ xuất hiện/biến mất cùng một lúc" msgid "Builds only new strokes (assuming 'additive' drawing)" -msgstr "Chỉ xây nét mới (kiểu vẽ cộng lên)" +msgstr "Chỉ xây dựng các nét mới mà thôi (giả định phương pháp vẽ 'gia tăng')" msgid "Object used as build starting position" -msgstr "Vật thể được sử dụng làm vị trí bắt đầu" +msgstr "Đối tượng sử dụng làm vị trí khởi đầu xây dựng" msgid "Defines how much of the stroke is visible" -msgstr "Chỉ định bao nhiêu của nét được hiện" +msgstr "Định nghĩa lượng nhìn thấy được của nét vẽ là bao nhiêu" msgid "Speed Factor" msgstr "Hệ Số Tốc Độ" +msgid "Multiply recorded drawing speed by a factor" +msgstr "Nhân tốc độ vẽ đã ghi lại với một hệ số" + + +msgid "Maximum Gap" +msgstr "Khoảng Cách Tối Đa" + + +msgid "The maximum gap between strokes in seconds" +msgstr "Khoảng cách tối đa giữa các nét vẽ trong số giây" + + msgid "Delay" msgstr "Trì Hoãn" msgid "Number of frames after each GP keyframe before the modifier has any effect" -msgstr "Số lượng bức ảnh sau mỗi bức ảnh bút sáp trước bộ điều chỉnh được ảnh hưởng" +msgstr "Lượng khung hình sau mỗi khung khóa Bút Chì Dầu trước khi bộ điều chỉnh có tác động" msgid "Output Vertex group" -msgstr "Nhóm Đỉnh Ngõ Ra" +msgstr "Nhóm Điểm Đỉnh Kết Quả" msgid "Timing" -msgstr "Thời Tự" +msgstr "Thời Định" + + +msgid "Use drawing speed, a number of frames, or a manual factor to build strokes" +msgstr "Sử dụng tốc độ vẽ, hoặc là một số khung hình, hoặc một hệ số thủ công xây dựng các nét vẽ lên" + + +msgid "Natural Drawing Speed" +msgstr "Tốc Độ Vẽ Tự Nhiên" + + +msgid "Use recorded speed multiplied by a factor" +msgstr "Sử dụng tốc độ đã ghi lại được nhân với một hệ số" + + +msgid "Number of Frames" +msgstr "Số Khung Hình" + + +msgid "Set a fixed number of frames for all build animations" +msgstr "Đặt số lượng khung hình cố định cho toàn bộ hoạt họa xây dựng" + + +msgid "Percentage Factor" +msgstr "Hệ Số Phần Trăm" + + +msgid "Set a manual percentage to build" +msgstr "Đặt tỷ lệ phần trăm xây dựng thủ công" msgid "Transition" -msgstr "Chuyển Tiếp" +msgstr "Chuyển Cảnh/Tiếp" msgid "How are strokes animated (i.e. are they appearing or disappearing)" -msgstr "Phướng pháp làm hoạt hình nét (ví dụ chúng nó đang xuất hiện hoặc biến mất)" +msgstr "Phương pháp các nét vẽ được hoạt họa (chẳng hạn chúng có xuất hiện/biến mất hay không?)" msgid "Grow" -msgstr "Móc" +msgstr "Phát Triển/Mọc Dài" msgid "Show points in the order they occur in each stroke (e.g. for animating lines being drawn)" -msgstr "Hiện điểm theo thứ tự của chúng nó trong mỗi nét (ví dụ cho làm hoạt hình nét đang vẽ)" +msgstr "Hiển thị các điểm theo trật tự chúng xuất hiện trong mỗi nét vẽ (chẳng hạn để hoạt họa các nét như chúng đang được vẽ)" msgid "Hide points from the end of each stroke to the start (e.g. for animating lines being erased)" -msgstr "Ẩn điểm từ điểm cuối của mỗi nét đến điểm đầu (ví dụ cho làm hoạt hình nét đang xóa)" +msgstr "Ẩn giấu các điểm từ cuối về đầu của mối nét (chẳng hạn để hoạt họa các nét như chúng đang bị xóa đi)" msgid "Vanish" @@ -16314,75 +17432,75 @@ msgstr "Biến Mất" msgid "Hide points in the order they occur in each stroke (e.g. for animating ink fading or vanishing after getting drawn)" -msgstr "Ẩn điểm theo thứ tự của chúng nó trong mỗi nét (ví dụ cho làm hoạt hình mực phai sau được vẽ)" +msgstr "Ẩn giấu các điểm theo trật tự chúng xuất hiện trong mỗi nét vẽ (chẳng hạn để hoạt họa các nét như chúng mờ dần và biến mất đi sau khi đã được vẽ ra)" msgid "Use Fading" -msgstr "Dùng Phai" +msgstr "Sử Dụng Mờ Dần" msgid "Fade out strokes instead of directly cutting off" -msgstr "Phai nét thay thế cắt ngang" +msgstr "Phai mờ dần các nét thay vì cắt bỏ trực tiếp" msgid "Restrict Visible Points" -msgstr "Hạn Chế Điểm Hiện" +msgstr "Hạn Chế các Điểm Nhìn Thấy Được" msgid "Use a percentage factor to determine the visible points" -msgstr "Dùng một hệ số phân trăm để chỉ định điểm hiện" +msgstr "Dùng hệ số phần trăm để xác định các điểm nhìn thấy được" msgid "Only modify strokes during the specified frame range" -msgstr "Chỉ sửa đổi nét trong phạm vị được xác định" +msgstr "Duy thay đổi các nét vẽ trong khoảng khung hình chỉ định" msgid "Hue/Saturation Modifier" -msgstr "Bộ Điều Chỉnh Màu Sắc/Độ Tươi" +msgstr "Bộ Điều Chỉnh Sắc Màu/Độ Bão Hòa" msgid "Change Hue/Saturation modifier" -msgstr "Bộ điều chỉnh cho đổi Màu Sắc/Độ Tươi" +msgstr "Bộ điều chỉnh thay đổi Sắc Màu/Độ Bão Hòa" msgid "Custom curve to apply effect" -msgstr "Đường cong tùy chọn để áp dụng hiệu ứng" +msgstr "Đường cong tùy chỉnh để áp dụng hiệu ứng" msgid "Color Hue" -msgstr "Màu Sắc Màu" +msgstr "Sắc Màu của Màu" msgid "Set what colors of the stroke are affected" -msgstr "Xác định màu nào của nét được ảnh hưởng" +msgstr "Đặt những màu nào của nét vẽ sẽ bị tác động" msgid "Modify fill and stroke colors" -msgstr "Sửa đổi tô đầy và nét màu" +msgstr "Sửa đổi màu tô kín và màu của nét vẽ" msgid "Modify stroke color only" -msgstr "Chỉ sửa đổi nét màu" +msgstr "Duy sửa đổi màu của nét vẽ" msgid "Modify fill color only" -msgstr "Chỉ sửa đổi màu tô đầy" +msgstr "Duy sửa đổi màu tô kín" msgid "Color Saturation" -msgstr "Độ Tươi Màu" +msgstr "Độ Bão Hòa của Màu" msgid "Custom Curve" -msgstr "Đường Cong Tùy Chọn" +msgstr "Đường Cong Tùy Chỉnh" msgid "Use a custom curve to define color effect along the strokes" -msgstr "Dùng một đường cong tù chọn để xác định hiệu ứng màu theo hướng các nét" +msgstr "Sử dụng một đường cong tùy chỉnh để định nghĩa hiệu ứng màu sắc dọc theo nét vẽ" msgid "Color Value" -msgstr "Độ Sáng Màu" +msgstr "Giá Trị của Màu" msgid "Dash Modifier" @@ -16390,79 +17508,83 @@ msgstr "Bộ Điều Chỉnh Gạch Ngang" msgid "Create dot-dash effect for strokes" -msgstr "Chế tạo hiệu ứng gạch ngang chấm cho nét" +msgstr "Kiến Tạo hiệu ứng chấm vạch cho các nét vẽ" + + +msgid "Offset into each stroke before the beginning of the dashed segment generation" +msgstr "Dịch chuyển vào từng nét vẽ trước khi bắt đầu sinh tạo phân đoạn nét gạch ngang" msgid "Active Dash Segment Index" -msgstr "Chỉ Số Của Khúc Gạch Ngang Hoạt Động" +msgstr "Chỉ Số của Phân Khúc Gạch Ngang đang Hoạt Động" msgid "Active index in the segment list" -msgstr "Chỉ số hoạt động trong danh sách khúc" +msgstr "Chỉ số đang hoạt động trong danh sách phân khúc" msgid "Envelope Modifier" -msgstr "Bộ Điều Chỉnh Bao Bì" +msgstr "Bộ Điều Chỉnh Phong Bao" msgid "Envelope stroke effect modifier" -msgstr "Bộ điều chỉnh hiệu ứng nét bao bì" +msgstr "Bộ điều chỉnh tạo hiệu ứng điều chỉnh bằng phương pháp bọc vỏ nét nét" msgid "Inverse VertexGroup" -msgstr "Đảo Nghịch Nhóm Đỉnh" +msgstr "Đảo Nghịch NhómĐiểmĐỉnh" msgid "The material to use for the new strokes" -msgstr "Vật liệu để dùng cho nét mới" +msgstr "Nguyên vật liệu sử dụng cho các nét vẽ mới" msgid "Algorithm to use for generating the envelope" -msgstr "Giải thuật để dùng cho chế tạo bao bì" +msgstr "Thuật toán sử dụng để sinh tạo phong bao" msgid "Deform the stroke to best match the envelope shape" -msgstr "Méo nét cho giống hình dạng bao bì nhất có thể" +msgstr "Biến dạng nét vẽ để khít vừa nhất với hình dạng phong bao" msgid "Add segments to create the envelope. Keep the original stroke" -msgstr "Thêm khúc cho chế tạo bao bì. Giữ nét ban đầu" +msgstr "Thêm các phân đoạn để kiến tạo phong bì. Giữ nét ban đầu" msgid "Fills" -msgstr "Khúc Tô Đầy" +msgstr "Phủ Đầy/Tô Kín/Đổ Sơn" msgid "Add fill segments to create the envelope. Don't keep the original stroke" -msgstr "Thêm khúc cho chế tạo bao bì. Không giữ nét ban đầu" +msgstr "Thêm các phân đoạn tô phủ kín để kiến tạo phong bao. Không duy trì nét vẽ gốc" msgid "Skip Segments" -msgstr "Bỏ Bớt Khúc" +msgstr "Số Phân Đoạn Nhảy Cách" msgid "The number of generated segments to skip to reduce complexity" -msgstr "Bớt số lượng khúc đươc chế tạo để giảm sự phức tạp" +msgstr "Số lượng phân đoạn sinh tạo nhảy cách để giảm độ phức tạp" msgid "Spread Length" -msgstr "Chiều Dài Mở Rộng" +msgstr "Chiều Dài Lan Tỏa" msgid "The number of points to skip to create straight segments" -msgstr "Số lượng điểm để bỏ qua cho chế tạo khức thẳng" +msgstr "Số điểm cần nhảy cách để kiến tạo các phân đoạn thẳng" msgid "Multiplier for the strength of the new strokes" -msgstr "Hệ số nhân cho sức của nét mới" +msgstr "Hệ số nhân cho độ đậm của các nét vẽ mới" msgid "Multiplier for the thickness of the new strokes" -msgstr "Hệ số nhân cho chiều rộng của nét mới" +msgstr "Hệ số nhân cho độ dày của các nét vẽ mới" msgid "Vertex group name for modulating the deform" -msgstr "Tên nhóm đỉnh cho biến đổi dạng sóng" +msgstr "Tên nhóm điểm đỉnh để điều chế sự biến dạng" msgid "Hook Modifier" @@ -16470,33 +17592,33 @@ msgstr "Bộ Điều Chỉnh Móc" msgid "Hook modifier to modify the location of stroke points" -msgstr "Bộ điều chỉnh móc để sửa đổi vị trí của điểm nét" +msgstr "Bộ điều chỉnh móc để biến đổi vị trí các điểm của nét vẽ" msgid "Hook Center" -msgstr "Trung Tâm Móc" +msgstr "Tâm của Móc" msgid "Falloff Curve" -msgstr "Đường Cong Sự Giảm" +msgstr "Đường Cong Suy Giảm Dần" msgid "Custom falloff curve" -msgstr "Đường cong sự giảm tùy chọn" +msgstr "Đường cong tùy chỉnh về dốc suy giảm" msgid "If not zero, the distance from the hook where influence ends" -msgstr "Nếu không = 0, là khoảng cách kết thúc sự ảnh hưởng của móc" +msgstr "Nếu khác 0 thì là khoảng cách từ cái móc, nơi ảnh hưởng chấm dứt" msgctxt "Curve" msgid "Falloff Type" -msgstr "Loại Sự Giảm" +msgstr "Loại Suy Giảm Dần" msgctxt "Curve" msgid "No Falloff" -msgstr "Không Có Sự Giảm" +msgstr "Không Suy Giảm" msgctxt "Curve" @@ -16506,7 +17628,7 @@ msgstr "Đường Cong" msgctxt "Curve" msgid "Smooth" -msgstr "Mịn" +msgstr "Làm/Mịn Màng" msgctxt "Curve" @@ -16516,31 +17638,31 @@ msgstr "Hình Cầu" msgctxt "Curve" msgid "Root" -msgstr "Căn" +msgstr "Phép Căn" msgctxt "Curve" msgid "Inverse Square" -msgstr "Nghịch Biến Bậc Hai" +msgstr "Đảo Nghịch Bình Phương" msgctxt "Curve" msgid "Sharp" -msgstr "Bén" +msgstr "Sắc Cạnh/Nhọn/Đột Ngột" msgctxt "Curve" msgid "Linear" -msgstr "Bậc Một" +msgstr "Tuyến Tính" msgctxt "Curve" msgid "Constant" -msgstr "Hằng Số" +msgstr "Hằng Số/Đồng Đều/Bất Biến" msgid "Inverse Vertex Group" -msgstr "Đảo Nghịch Nhóm Đỉnh" +msgstr "Đảo Nghịch Nhóm Điểm Đỉnh" msgid "Matrix" @@ -16548,51 +17670,51 @@ msgstr "Ma Trận" msgid "Reverse the transformation between this object and its target" -msgstr "Đảo nhgích biến hóa giữa vật thể này và mục tiêu của nó" +msgstr "Đảo nghịch biến hóa giữa đối tượng này và mục tiêu của nó" msgid "Parent Object for hook, also recalculates and clears offset" -msgstr "Vật Thể Phụ Huynh cho móc, nó cũng tính lại và xóa dịch" +msgstr "Đối Tượng Phụ Huynh để gài móc, đồng thời cũng tính toán lại và xóa dịch chuyển đi" msgid "Relative force of the hook" -msgstr "Lực tương đối của móc" +msgstr "Lực tương đối của cái móc" msgid "Name of Parent Bone for hook (if applicable), also recalculates and clears offset" -msgstr "Tên của Xương Phụ Huynh cho móc (nếu có), nó cũng tính lại và xóa dịch" +msgstr "Tên của Xương Phụ Huynh cho cái móc (nếu có), đồng thời cũng tính toán lại và xóa dịch chuyển đi" msgid "Uniform Falloff" -msgstr "Sự Giảm Đều" +msgstr "Suy Giảm Đồng Đều" msgid "Compensate for non-uniform object scale" -msgstr "Bù cho phóng to vật thể rỗng đều" +msgstr "Đền bù cho tỷ lệ bất đồng của đối tượng" msgid "Lattice Modifier" -msgstr "Bộ Điều Chỉnh Rào Lưới" +msgstr "Bộ Điều Chỉnh Lưới Rào" msgid "Change stroke using lattice to deform modifier" -msgstr "Đổi nét bằng dùng rào lưới để méo hóa bộ điều chỉnh " +msgstr "Bộ điều chỉnh biến đổi nét vẽ dùng lưới rào để biến dạng" msgid "Lattice object to deform with" -msgstr "Vật thể rào lưới để dùng làm méo hóa" +msgstr "Đối tượng lưới rào sử dụng để biến dạng" msgid "Strength of modifier effect" -msgstr "Sức của hiệu ứng bộ điều chỉnh" +msgstr "Cường độ hiệu ứng của bộ điều chỉnh" msgid "Length Modifier" -msgstr "Chế Độ Chiều Dài" +msgstr "Bộ Điều Chỉnh Chiều Dài" msgid "Stretch or shrink strokes" -msgstr "Kéo dài hay rút ngắn các nét" +msgstr "Kéo dài hoặc thu ngắn các nét vẽ" msgid "End Factor" @@ -16600,11 +17722,11 @@ msgstr "Hệ Số Kết Thúc" msgid "Added length to the end of each stroke relative to its length" -msgstr "Chiều dài được cộng thêm tại cuối mỗi nét tương đối chiều dài của nó" +msgstr "Chiều dài thêm vào phần cuối của mỗi nét vẽ tương đối với chiều dài của nó" msgid "Absolute added length to the end of each stroke" -msgstr "Chiều dài tuyệt đối được cộng thêm tại cuối mỗi nét" +msgstr "Chiều dài tuyệt đối thêm vào phần cuối của mỗi nét vẽ" msgid "Invert Curvature" @@ -16612,23 +17734,23 @@ msgstr "Đảo Ngược Độ Cong" msgid "Invert the curvature of the stroke's extension" -msgstr "Đảo ngược độ cong của phần kéo dài của nét" +msgstr "Đảo ngược độ cong phần nới dài của nét vẽ" msgid "Filter Angle" -msgstr "Lọc Góc" +msgstr "Góc Độ Thanh Lọc" msgid "Ignore points on the stroke that deviate from their neighbors by more than this angle when determining the extrapolation shape" -msgstr "Không quan tâm các điểm trên nét chênh lệch từ điểm kề hơn góc này khi quyết định hình dạng suy ngoại" +msgstr "Bỏ qua các điểm trên nét vẽ đi chệch khỏi các nét lân cận của chúng, với góc độ đi lệch nhiều hơn giá trị góc độ này, khi xác định hình dạng ngoại suy" msgid "Mode to define length" -msgstr "Chế độ cho chỉ định chiều dài" +msgstr "Chế độ xác định độ dài" msgid "Length in ratio to the stroke's length" -msgstr "Tỉ số chiều dài so với chiều dài nét của nét" +msgstr "Chiều dài theo tỷ lệ chiều dài của nét vẽ" msgid "Length in geometry space" @@ -16636,35 +17758,35 @@ msgstr "Chiều dài trong không gian hình học" msgid "Used Length" -msgstr "Được Dùng Chiều Dài" +msgstr "Chiều dài sử dụng" msgid "Defines what portion of the stroke is used for the calculation of the extension" -msgstr "Cho định nghĩa phần nào của nét được dùng để tính kéo dài" +msgstr "Xác định phần nào của nét vẽ là được sử dụng để tính toán chỗ nới ra" msgid "Point Density" -msgstr "Tỉ Trọng Điểm" +msgstr "Mật Độ Điểm" msgid "Multiplied by Start/End for the total added point count" -msgstr "Nhân bằng Đầu/Cuối cho tổng số lượng điểm" +msgstr "Nhân với Khởi Đầu/Kết Thúc để tạo nên tổng số điểm đếm" msgid "Random End Factor" -msgstr "Hệ Số Kết Thúc Ngẫu Nhiên" +msgstr "Hệ Số Cuối Ngẫu Nhiên" msgid "Size of random length added to the end of each stroke" -msgstr "Cỡ thước của chiều dài được cộng thêm tại kết thúc của mỗi nét" +msgstr "Kích thước chiều dài ngẫu nhiên thêm vào cuối mỗi nét vẽ" msgid "Random Noise Offset" -msgstr "Nới Huyên Náo Ngẫu Nhiên" +msgstr "Dịch Chuyển Nhiễu Ngẫu Nhiên" msgid "Smoothly offset each stroke's random value" -msgstr "Nới kiểu mịn các giá trị ngẫu nhiên của mỗi nét" +msgstr "Dịch chuyển giá trị ngẫu nhiên của mỗi nét vẽ một cách mịn màng" msgid "Random Start Factor" @@ -16672,27 +17794,27 @@ msgstr "Hệ Số Đầu Ngẫu Nhiên" msgid "Size of random length added to the start of each stroke" -msgstr "Cỡ thước của chiều dài ngẫu nhiên được cộng thêm tại đầu của mỗi nét" +msgstr "Kích thước chiều dài ngẫu nhiên thêm vào đầu mỗi nét vẽ" msgid "Segment Influence" -msgstr "Sự Ảnh Hưởng Khúc" +msgstr "Ảnh hưởng của phân đoạn" msgid "Factor to determine how much the length of the individual segments should influence the final computed curvature. Higher factors makes small segments influence the overall curvature less" -msgstr "Hệ số cho quyết định bao nhiêu của chiều dài của các khúc nên ảnh hưởng tông độ cong được tính. Hệ số càng lớn càng giảm sự ảnh hưởng của các khúc nhỏ trong tổng độ cong" +msgstr "Hệ số nhằm xác định độ dài của mỗi một phân đoạn, tức cái sẽ ảnh hưởng đến độ cong tính toán cuối cùng. Các hệ số cao hơn sẽ làm cho các phân đoạn nhỏ gây tác động ít hơn đến độ cong tổng thể" msgid "Start Factor" -msgstr "Hệ Số Đầu" +msgstr "Hệ Số Khởi Đầu" msgid "Added length to the start of each stroke relative to its length" -msgstr "Chiều dài được cộng thêm tại đầu của mỗi nét tương đối chiều dài của nó" +msgstr "Chiều dài thêm vào đầu mỗi nét vẽ, tương đối với chiều dài của nó" msgid "Absolute added length to the start of each stroke" -msgstr "Chiều dài tuyệt đối được cộng thêm tại đầu của mỗi nét" +msgstr "Chiều dài tuyệt đối được thêm vào đầu của mỗi nét vẽ" msgid "Step" @@ -16700,7 +17822,7 @@ msgstr "Bước" msgid "Number of frames between randomization steps" -msgstr "Số lượng bức ảnh giữa các bước được ngẫu nhiên hóa" +msgstr "Số khung hình giữa các bước ngẫu nhiên hóa" msgid "Use Curvature" @@ -16708,307 +17830,315 @@ msgstr "Sử Dụng Độ Cong" msgid "Follow the curvature of the stroke" -msgstr "Theo độ công của nét" +msgstr "Đi theo độ cong của nét vẽ" msgid "Use random values over time" -msgstr "Dùng giá trị ngẫu nhiên qua thời gian" +msgstr "Sử dụng các giá trị ngẫu nhiên theo thời gian" msgid "Line Art Modifier" -msgstr "Bộ Điều Chỉnh Nghệ Thuật Đường Nét" +msgstr "Bộ Điều Chỉnh Mỹ Thuật Đường Nét" msgid "Image Threshold" -msgstr "Ngưỡng Ảnh" +msgstr "Ngưỡng Hình Ảnh" msgid "Segments with an image distance smaller than this will be chained together" -msgstr "Các khúc có khoảng cách ảnh nhỏ hơn giá trị này sẽ được làm đoạn chuỗi với nhau" +msgstr "Các phân đoạn có khoảng cách hình ảnh nhỏ hơn giá trị này sẽ được nối dây chuyền lại với nhau" msgid "Crease Threshold" -msgstr "Ngưỡng Nhăn" +msgstr "Ngưỡng Nếp Gấp" msgid "Angles smaller than this will be treated as creases. Crease angle priority: object line art crease override > mesh auto smooth angle > line art default crease" -msgstr "Xem góc nhỏ hơn số này là nhăn. Độ ưu tiên góc nhăn: vượt quyền nghệ thuật của vật thể > góc tự động mịn hóa mạng lưới > nhăn mặc định của nghệ thuật" +msgstr "Các góc nhỏ hơn góc này sẽ được coi là các nếp gấp. Tính ưu tiên của góc nếp gấp: mức vượt quyền nếp gấp của đối tượng mỹ thuật đường nét > góc tự động làm mịn của khung lưới > nếp gấp mặc định của mỹ thuật đường nét" msgid "Invert Vertex Group" -msgstr "Đảo Nghịch Nhóm Đỉnh" +msgstr "Đảo Nghịch Nhóm Điểm Đỉnh" msgid "Invert source vertex group values" -msgstr "Đảo nghịch giá trị của nhóm đỉnh nguồn" +msgstr "Đảo ngược các giá trị nhóm điểm đỉnh nguồn" msgid "Is Baked" -msgstr "Đã Nướng" +msgstr "Đã Nướng Xong" msgid "This modifier has baked data" -msgstr "Bộ điều chỉnh này có dữ liệu đã nướng" +msgstr "Bộ điều chỉnh này đã nướng xong dữ liệu" msgid "Level End" -msgstr "Tầng Kết Thúc" +msgstr "Tầng Lớp/Mức Kết Thúc" msgid "Maximum number of occlusions for the generated strokes" -msgstr "Số tối đa cho che khuất của các nét được chế tạo" +msgstr "Số tầng lớp che khuất tối đa cho các nét sinh tạo ra" msgid "Level Start" -msgstr "Tầng Bắt Đầu" +msgstr "Tầng Lớp/Mức Khởi Đầu" msgid "Minimum number of occlusions for the generated strokes" -msgstr "Số tối thiểu cho che khuất của các nét được chế tạo" +msgstr "Số tầng lớp che khuất tối thiểu cho các nét sinh tạo ra" msgid "Light Object" -msgstr "Vật Thể Đèn" +msgstr "Đối Tượng Ánh Sáng" msgid "Use this light object to generate light contour" -msgstr "Dùng vật thể đèn này cho chế tạo nét đồng mức đèn" +msgstr "Sử dụng đối tượng ánh sáng này để tạo đường viền ánh sáng" msgid "The strength value for the generate strokes" -msgstr "Giá trị sức cho các nét được chế tạo" +msgstr "Giá trị độ đậm của các nét vẽ tạo ra" msgid "Overscan" -msgstr "Quét Ra Ngoài" +msgstr "Quét Dư" msgid "A margin to prevent strokes from ending abruptly at the edge of the image" -msgstr "Một lề cho tránh nét kết thúc ngay lập tức tại cạnh của ảnh" +msgstr "Một giá trị gia giảm để ngăn ngừa các nét vẽ kết thúc một cách đột ngột ở rìa của hình ảnh" msgid "Shadow Camera Far" -msgstr "Bóng Tối Máy Quay Phim Xa" +msgstr "Cắt Xa của Máy Quay Phim Bóng Tối" msgid "Far clipping distance of shadow camera" -msgstr "Khoảng cách cắt xa cho máy quay phim bóng tối" +msgstr "Khoảng cách cắt xa của máy quay phim bóng tối" msgid "Shadow Camera Near" -msgstr "HBóng Tối Máy Quay Phim Gần" +msgstr "Cắt Gần của Máy Quay Phim Bóng Tối" msgid "Near clipping distance of shadow camera" -msgstr "Khoảng cách cắt gần cho máy quay phim bóng tối" +msgstr "Khoảng cách cắt gần của máy quay phim bóng tối" msgid "Shadow Camera Size" -msgstr "Kích Cỡ Máy Quay Phim Bóng Tối" +msgstr "Kích Thước Máy Quay Phim Bóng Tối" + + +msgid "Represents the \"Orthographic Scale\" of an orthographic camera. If the camera is positioned at the light's location with this scale, it will represent the coverage of the shadow \"camera\"" +msgstr "Đại diện cho \"Tỷ Lệ Trực Giao\" của máy quay phim trực giao. Nếu máy quay phim được đặt ở vị trí của nguồn sáng với tỷ lệ này thì nó sẽ đại diện cho phạm vi bao trùm của \"máy quay phim\" bóng tối" msgid "Shadow Region Filtering" -msgstr "Vùng Bộ lọc Bóng Tối" +msgstr "Thanh Lọc Vùng Bóng Tối" msgid "Select feature lines that comes from lit or shaded regions. Will not affect cast shadow and light contour since they are at the border" -msgstr "Chọn các đướng đặc trưng " +msgstr "Chọn các đường nét hình thể xuất phát từ các vùng được chiếu sáng hoặc có bóng tối che phủ. Sẽ không ảnh hưởng đến bóng đổ và đường viền ánh sáng vì chúng nằm ở ranh giới" msgid "Not filtering any lines based on illumination region" -msgstr "Không bộ lọc các bất cứ đường nào cơ sở vùng sự rọi sáng" +msgstr "Không thanh lọc bất cứ đường nào dựa trên vùng chiếu sáng" msgid "Illuminated" -msgstr "Được Rọi Sáng" +msgstr "Được Chiếu Sáng" msgid "Only selecting lines from illuminated regions" -msgstr "Chỉ chọn các đường từ vùng được rọi sáng" +msgstr "Duy lựa chọn các đường từ các vùng chiếu sáng mà thôi" msgid "Shaded" -msgstr "Được Tô Sắc" +msgstr "Chuyển Sắc/Ghi/Ngả/Trong/Bóng Tối" msgid "Only selecting lines from shaded regions" -msgstr "Chỉ chọn các đường từ vùng được tô bóng" +msgstr "Chỉ chọn các đường nét từ các vùng được tô bóng mà thôi" msgid "Illuminated (Enclosed Shapes)" -msgstr "Được Rọi Sáng (Hình Dạng Được Bao Quanh)" +msgstr "Được Chiếu Sáng (Các Hình Khép Kín)" msgid "Selecting lines from lit regions, and make the combination of contour, light contour and shadow lines into enclosed shapes" -msgstr "Chọn các đường từ vùng được rọi sáng, và tạo hình vây quanh từ gồm đường đồng mức, đường đồng mức ánh sáng, và đường bóng tối" +msgstr "Chọn các đường nét từ các vùng được chiếu sáng và tạo sự kết hợp của đường viền, đường công tua sáng và đường viền bóng thành các hình khép kín" msgid "Silhouette Filtering" -msgstr "Bộ Lọc Bằng Hình Bóng" +msgstr "Thanh Lọc Đường Viền Hình Bóng" msgid "Select contour or silhouette" -msgstr "Chọn đường đồng mức hay hình bóng" +msgstr "Chọn đường công-tua hoặc đường viền bóng hình" msgid "Individual Silhouette" -msgstr "Hình Bóng Riêng" +msgstr "Đường Viền Hình Bóng Cá Nhân" msgid "Smooth Tolerance" -msgstr "Mức Chênh Lệch Mịn" +msgstr "Dung Sai Làm Nét Trơn Tru" msgid "Strength of smoothing applied on jagged chains" -msgstr "Sức của mịn hóa được áp dụng cho chuỗi răng cưa" +msgstr "Cường độ mức làm trơn tru được áp dụng trên các chuỗi lởm chởm" msgid "Camera Object" -msgstr "Vật Thể Máy Quay Phim" +msgstr "Đối Tượng Máy Quay Phim" msgid "Use specified camera object for generating line art" -msgstr "Dùng vật thể máy quay phim cho chế tạo đồ họa đường nét" +msgstr "Sử dụng đối tượng máy quay phim chỉ định để sinh tạo mỹ thuật đường nét" msgid "Generate strokes from the objects in this collection" -msgstr "Chế tạo nét từ vật thể này trong sưu tập này" +msgstr "Sinh tạo nét vẽ từ các đối tượng trong bộ sưu tập này" msgid "Generate strokes from this object" -msgstr "Chế tạo nét từ vật thể nào" +msgstr "Sinh tạo nét vẽ từ đối tượng này" msgid "Source Type" -msgstr "Loại Nguồn" +msgstr "Thể Loại Nguồn" msgid "Line art stroke source type" -msgstr "Loại nguồn của nghệ thuất đường nét" +msgstr "Thể loại nguồn nét vẽ mỹ thuật đường nét" msgid "Source Vertex Group" -msgstr "Nhóm Đỉnh Nguồn" +msgstr "Nhóm Điểm Đỉnh Nguồn" msgid "Match the beginning of vertex group names from mesh objects, match all when left empty" -msgstr "Tìm kiếm tên giống của nhóm đỉnh từ vật thể mạng lưới, giống hết khi bỏ trống rỗng" +msgstr "Khớp phần đầu các tên của nhóm điểm đỉnh từ đối tượng khung lưới. Khớp toàn bộ khi bỏ trống" msgid "Angle Splitting" -msgstr "Chẻ Góc" +msgstr "Góc Độ Tách Phân" msgid "Angle in screen space below which a stroke is split in two" -msgstr "Góc trong không gian màn cho chẻ một nét thành hai nét" +msgstr "Góc độ trong không gian màn hình mà những nét vẽ có giá trị thấp hơn giá trị này sẽ được tách chia ra làm hai" msgid "Stroke Depth Offset" -msgstr "Nới Độ Sâu Nét" +msgstr "Dịch Chuyển về Chiều Sâu của Nét Vẽ" msgid "Move strokes slightly towards the camera to avoid clipping while preserve depth for the viewport" -msgstr "Nới gần máy quay phim một chút cho tránh bị cắt khi còn giữ độ sâu cho màn chiếu" +msgstr "Hơi di chuyển nét vẽ về phía máy ảnh một tí, để tránh bị cắt xén đi, trong khi vẫn bảo tồn chiều sâu cho cổng nhìn" + + +msgid "Grease Pencil layer to which assign the generated strokes" +msgstr "Tầng Lớp Bút Chì Dầu để ấn định các nét sinh tạo" msgid "Grease Pencil material assigned to the generated strokes" -msgstr "Vật liệu Bút Sáp được chỉ định đến các nét được chế tạo" +msgstr "Nguyên vật liệu Bút Chì Dầu ấn định cho các nét vẽ sinh tạo ra" msgid "The thickness for the generated strokes" -msgstr "Bề dầy nét cho các nét được chế tạo" +msgstr "Độ dày cho các nét vẽ được sinh tạo ra" msgid "Back Face Culling" -msgstr "Hủy Diệt Mặt Phía Sau" +msgstr "Loại Bỏ Mặt Trái" msgid "Remove all back faces to speed up calculation, this will create edges in different occlusion levels than when disabled" -msgstr "Xóa hết mặt phía sau để tăng tốc tính toán, này giúp tạo cảnh trong các tầng che khuất khác khi được tắt" +msgstr "Loại bỏ toàn bộ các mặt sau để tăng tốc độ tính toán, việc làm này sẽ kiến tạo các cạnh ở các mức độ che khuất khác nhau so với khi bị tắt đi" msgid "Use cached scene data from the first line art modifier in the stack. Certain settings will be unavailable" -msgstr "Dùng dữ liệu cảnh được chứa lại từ bộ điều chỉnh nghệ thuật nét đầu trong xếp đống. Vài cài đặt không thể sử dụng" +msgstr "Dùng dữ liệu cảnh lưu trong bộ nhớ đệm, từ bộ điều chỉnh mỹ thuật đường nét đầu tiên trong ngăn xếp. Một số cài đặt nào đó sẽ không thể sử dụng được" msgid "Clipping Boundaries" -msgstr "Ranh Giới Cắt" +msgstr "Đường Biên Cắt Xén" msgid "Allow lines generated by the near/far clipping plane to be shown" -msgstr "Hiện các đường được chế tạo bởi mặt phẳng cắt gần/xa" +msgstr "Cho phép hiển thị các đường sinh tạo ra bởi bình diện cắt xén gần/xa" msgid "Use Contour" -msgstr "Sử Dụng Đường Đồng Mức" +msgstr "Sử Dụng Đường Viền Công-Tua" msgid "Generate strokes from contours lines" -msgstr "Chế tạo nét từ đường đồng mức" +msgstr "Sinh tạo nét vẽ từ các đường viền công tua" msgid "Use Crease" -msgstr "Dùng Nhăn" +msgstr "Sử Dụng Nếp Gấp" msgid "Generate strokes from creased edges" -msgstr "Chế tạo nét từ cạnh nhăn" +msgstr "Sinh tạo nét vẽ từ các cạnh nếp nhăn" msgid "Crease On Sharp Edges" -msgstr "Ngăn Trên Cạnh Bén" +msgstr "Nếp Gấp trên các Cạnh Sắc Nét" msgid "Allow crease to show on sharp edges" -msgstr "Cho nhăn hiện trên cạnh bén" +msgstr "Cho phép nếp nhăn hiển thị trên các cạnh sắc nét" msgid "Crease On Smooth Surfaces" -msgstr "Ngăn Trên Bề Mặt Mịn" +msgstr "Nếp Gấp trên các Bề Mặt Nhẵn" msgid "Allow crease edges to show inside smooth surfaces" -msgstr "Cho cạnh nhăn hiện trong bề mặt mịn" +msgstr "Cho phép các cạnh nếp nhăn hiển thị bên trong các bề mặt nhẵn" msgid "Use Custom Camera" -msgstr "Dùng Máy Quay Phim Tùy Chọn" +msgstr "Sử Dụng Máy Quay Phim Tùy Chỉnh" msgid "Use custom camera instead of the active camera" -msgstr "Cho máy quay phim tùy chọn that thế máy quay phim hoạt động" +msgstr "Sử dụng máy quay phim tùy chỉnh thay vì máy quay phim đang hoạt động" msgid "Preserve Details" -msgstr "Giữ Nguyên Chi Tiết" +msgstr "Bảo Tồn Chi Tiết" msgid "Keep the zig-zag \"noise\" in initial chaining" -msgstr "Giữ \"huyên náo\" chữ chi trong chuỗi khởi động" +msgstr "Giữ \"nhiễu\" zig-zag trong kết chuỗi ban đầu" msgid "Use Edge Mark" -msgstr "Dùng Ký Hiệu Cạnh" +msgstr "Sử Dụng Dấu Cạnh" msgid "Generate strokes from freestyle marked edges" -msgstr "Chế tạo nét từ cạng được ký dấu phong cách từ do" +msgstr "Sinh tạo các nét vẽ từ các cạnh được đánh dấu phong cách tự do" msgid "Handle Overlapping Edges" -msgstr "Xử Lý Cạnh Che Lấn Trên Nhau" +msgstr "Xử Lý các cạnh Chồng Đè Lên Nhau" msgid "Allow edges in the same location (i.e. from edge split) to show properly. May run slower" -msgstr "Hiện các cạnh đồng vị trú được hiện đúng kiểu (ví dụ từ chẻ cạnh). Có thể chạy chậm hơn" +msgstr "Cho phép các cạnh ở cùng một vị trí (tức là từ quá trình tách phân cạnh ra) hiển thị đúng đắn. Có thể chạy chậm hơn" msgid "Filter Face Marks" -msgstr "Lọc Dấu Mặt" +msgstr "Thanh Lọc Dấu Chỉ Mặt" msgid "Filter feature lines using freestyle face marks" -msgstr "Lọc đường của đặc trưng bằng dấu mặt phong cách tự do" +msgstr "Thanh lọc các đường viền hình thể dùng các chỉ dấu Mặt phong cách tự do" msgid "Boundaries" @@ -17016,283 +18146,291 @@ msgstr "Ranh Giới" msgid "Filter feature lines based on face mark boundaries" -msgstr "Lọc đường của đặc trưng tùy ranh giới của dấu mặt" +msgstr "Thanh lọc các nét viền hình thể dựa trên các đường ranh giới chỉ dấu Mặt" msgid "Invert face mark filtering" -msgstr "Đảo nghịch lọc dấu mặt" +msgstr "Đảo nghịch quá trình thanh lọc dấu chỉ Mặt" msgid "Keep Contour" -msgstr "Giữ Đường Đồng Mức" +msgstr "Duy Trì Đường Công-Tua" msgid "Preserve contour lines while filtering" -msgstr "Giữ đường đồng mức khi bộ lọc" +msgstr "Giữ nguyên các đường viền công-tua trong khi thanh lọc" msgid "All Lines" -msgstr "Hết Đường" +msgstr "Toàn Bộ các Đường" msgid "Treat all lines as the same line type so they can be chained together" -msgstr "Cử xử với hết đường giống đồng loại đường để được chuỗi chúng nó với nhau" +msgstr "Coi toàn bộ các đường là cùng một thể loại, hầu cho, chúng có thể đều cùng được móc nối lại với nhau" msgid "Intersection With Contour" -msgstr "Giao Cắt Với Đường Đồng Mức" +msgstr "Giao Cắt với Đường Viền Công Tua" msgid "Treat intersection and contour lines as if they were the same type so they can be chained together" -msgstr "Cử xử giao cắt và đường đồng mức như đồng loại để được kết chuỗi chúng nó với nhau" +msgstr "Coi các điểm giao cắt và các đường viền công tua là cùng một thể loại, hầu cho, chúng có thể đều cùng được móc nối lại với nhau" msgid "Use Geometry Space" -msgstr "Dùng Không gian Hình Dạng" +msgstr "Sử Dụng Không Gian Hình Học" msgid "Use geometry distance for chaining instead of image space" -msgstr "Dùng khoảng cách hình dạng cho kết chuỗi thay thế không gian ảnh" +msgstr "Sử dụng khoảng cách hình học để móc nối lại với nhau, thay vì không gian hình ảnh" msgid "Image Boundary Trimming" -msgstr "Cắt Bớt Ranh Giới Ảnh" +msgstr "Cắt Tỉa Ranh Giới Hình Ảnh" + + +msgid "Trim all edges right at the boundary of image (including overscan region)" +msgstr "Cắt gọn toàn bộ các cạnh ngay tại ranh giới của hình ảnh (bao gồm cả vùng quét dư nữa)" msgid "Use Intersection" -msgstr "Dùng Giao Cắt" +msgstr "Sử Dụng Chỗ Giao Cắt" msgid "Generate strokes from intersections" -msgstr "Chế tạo nét từ giao cắt" +msgstr "Sinh tạo các nét vẽ tại những điểm giao cắt" msgid "Mask bits to match from Collection Line Art settings" -msgstr "Tìm bit mặt nạ giống từ cài đặt Nghệ Thuật Đường Sưu Tập" +msgstr "Các bit chắn lọc để xứng khớp từ cài đặt của Bộ Sưu Tập Mỹ Thuật Đường Nét" msgid "Match Intersection" -msgstr "Tìm Giao Cắt Giống" +msgstr "Khớp Giao Cắt" msgid "Require matching all intersection masks instead of just one" -msgstr "Yêu cầu tìm hết mặt nạ giao cắt nhau thay thế chỉ một cái" +msgstr "Đòi hỏi phải khớp với toàn bộ các màn chắn lọc giao cắt, thay vì chỉ một cái mà thôi" msgid "Invert Collection Filtering" -msgstr "Đảo Nghích Bộ Lọc Sưu Tập" +msgstr "Đảo Ngược Thanh Lọc Bộ Sưu Tập" msgid "Select everything except lines from specified collection" -msgstr "Chọn mỗi thứ trừ đường từ một sưu tập được xác định" +msgstr "Chọn mọi thứ ngoại trừ các đường từ bộ sưu tập chỉ định" msgid "Invert Silhouette Filtering" -msgstr "ảo Nghích Bộ Lọc Hình Bóng" +msgstr "Đảo Ngược Thanh Lọc Đường Viền Hình Bóng" msgid "Select anti-silhouette lines" -msgstr "Chọn các đường chống hình bóng" +msgstr "Chọn các đường không phải là đường viền hình bóng" msgid "Use Light Contour" -msgstr "Sử Dụng Đường Đồng Mức Ánh Sáng" +msgstr "Sử Dụng Đường Công-Tua Ánh Sáng" msgid "Generate light/shadow separation lines from a reference light object" -msgstr "Chế tạo đường chẻ ánh sáng/bóng tối từ một vật thể đèn tham chiếu" +msgstr "Tạo các đường phân ánh sáng / bóng tối từ một đối tượng ánh sáng tham chiếu" msgid "Use Loose" -msgstr "Dùng Rời Ra" +msgstr "Sử Dụng Rời Rạc" msgid "Generate strokes from loose edges" -msgstr "Chế tạo nét từ cạnh rời ra" +msgstr "Sinh tạo nét vẽ từ các cạnh rời rạc" msgid "Loose As Contour" -msgstr "Rời Ra Làm Nét Đồng Mức" +msgstr "Rời Rạc là Đường Công-Tua" msgid "Loose edges will have contour type" -msgstr "Các cạnh rời ra sẽ có cùng loại nét đồng mức" +msgstr "Các cạnh rời rạc sẽ có thể loại là đường công tua" msgid "Chain Loose Edges" -msgstr "Kết Chuỗi Các Cạnh Rời Ra" +msgstr "Mắc Nối Dây Chuyền các Cạnh Rời Rạc" msgid "Allow loose edges to be chained together" -msgstr "Cho cạnh rời ra được kết chuỗi với nhau" +msgstr "Cho phép các cạnh rời rạc mắc nối lại với nhau" msgid "Use Material" -msgstr "Dùng Vật Liệu" +msgstr "Sử Dụng Nguyên Vật Liệu" msgid "Generate strokes from borders between materials" -msgstr "Chế tạo nét từ ranh giới giữa các vật liệu" +msgstr "Sinh tạo nét vẽ ở các đường biên giới giữa các nguyên vật liệu" msgid "Use Material Mask" -msgstr "Dùng Mặt Nạ Vật Liệu" +msgstr "Sử Dụng Chắn Lọc Nguyên Vật Liệu" msgid "Use material masks to filter out occluded strokes" -msgstr "Dùng mặc nạ vật liệu cho lọc nét bị che khuất" +msgstr "Sử dụng chắn lọc nguyên vật liệu để thanh lọc các nét bị che khuất đi" msgid "Mask bits to match from Material Line Art settings" -msgstr "Bit mặt nạ giống từ cài đặt Nghệ Thuật Đường Vật Liệu " +msgstr "Các bit Màn Chắn Lọc để xứng khớp với các cài đặt Mỹ Thuật Đường Nét Nguyên Vật Liệu" msgid "Match Masks" -msgstr "Tìm Mặt Nạ Giống" +msgstr "Khớp Chắn Lọc" msgid "Require matching all material masks instead of just one" -msgstr "Yêu cầu tìm kiếm hết mặt nạ vật thể thay thế chỉ một cái" +msgstr "Đòi hỏi phải khớp với toàn bộ các chắn lọc nguyên vật liệu, thay vì chỉ một cái mà thôi" msgid "Use Occlusion Range" -msgstr "Dùng Phạm Vi Che Khuất" +msgstr "Sử Dụng Phạm Vi Hấp Thụ Quang Xạ" msgid "Generate strokes from a range of occlusion levels" -msgstr "Chế tạo nét từ một phạm vi mức che khuất" +msgstr "Sinh tạo nét vẽ ra từ một khoảng các mức Hấp Thụ Quang Xạ" msgid "Instanced Objects" -msgstr "Vật Thể Được Thực Thể Hóa" +msgstr "Đối Tượng đã được Thực Thể Hóa" + + +msgid "Allow particle objects and face/vertex instances to show in line art" +msgstr "Cho phép các đối tượng hạt và các thực thể Mặt/điểm đỉnh hiển thị trong mỹ thuật đường nét" msgid "Offset Towards Custom Camera" -msgstr "Nới Đến Máy Quay Phim Được Chọn" +msgstr "Dịch Chuyển Về Phía Máy Quay Phim Tùy Chỉnh" msgid "Offset strokes towards selected camera instead of the active camera" -msgstr "Nới các nét đến máy quay phijm được chọn thay thế máy quay phim hoạt động" +msgstr "Dịch chuyển các nét vẽ về phía máy quay phim được chọn, thay vì máy quay phim đang hoạt động" msgid "Match Output" -msgstr "Giống Ngõ Ra" +msgstr "Khớp Đầu Ra" msgid "Match output vertex group based on name" -msgstr "Tìm kiếm nhóm đỉnh ngõ ra tùy tên" +msgstr "Khớp nhóm điểm đỉnh đầu ra dựa vào tên" msgid "Overlapping Edge Types" -msgstr "Loại Cạnh Lấn Trên" +msgstr "Các Kiểu Cạnh Chồng Đè Lên Nhau" msgid "Allow an edge to have multiple overlapping types. This will create a separate stroke for each overlapping type" -msgstr "Cho một cạnh được có nhiều loại lấn trên nhau. Cái này sẽ tạo một nét riêng tự cho mỗi loại lấn trên" +msgstr "Cho phép một cạnh có nhiều thể loại chồng chéo lên nhau. Đối với mỗi thể loại chồng chéo riêng, cái này sẽ kiến tạo một nét vẽ biệt lập cho nó" msgid "Use Shadow" -msgstr "Dùng Bóng Tối" +msgstr "Sử Dụng Bóng Tối" msgid "Project contour lines using a light source object" -msgstr "Chiếu nét đồng mức bằng một vật thể nguồn ánh sáng" +msgstr "Phóng chiếu các đường viền công tua bằng cách sử dụng một đối tượng nguồn sáng" msgid "Vertex group name for selected strokes" -msgstr "Tên nhóm đỉnh của các nét được chọn" +msgstr "Tên nhóm điểm đỉnh cho các nét vẽ đã chọn" msgid "Mirror Modifier" -msgstr "Bộ Điều Chỉnh Gương" +msgstr "Bộ Điều Chỉnh Phản Chiếu Đối Xứng" msgid "Create mirroring strokes" -msgstr "Chế tạo nét gương" +msgstr "Kiến Tạo các nét vẽ phản chiếu đối xứng" msgid "Object used as center" -msgstr "Vật thể được sử dụng làm trung tâm" +msgstr "Đối tượng dùng làm trung tâm" msgid "Mirror the X axis" -msgstr "Gương quanh trục X" +msgstr "Phản chiếu đối xứng trục X" msgid "Mirror the Y axis" -msgstr "Gương quanh trục Y" +msgstr "Phản chiếu đối xứng trục Y" msgid "Mirror the Z axis" -msgstr "Gương quanh trục Z" +msgstr "Phản chiếu đối xứng trục Z" msgid "Clip points" -msgstr "Cắt Điểm" +msgstr "Điểm bị cắt bỏ" msgid "Multiply Modifier" -msgstr "Bộ Điều Chỉnh Nhân" +msgstr "Bộ Điều Chỉnh Nhân Bội" msgid "Generate multiple strokes from one stroke" -msgstr "Chế tạo nhiều nét từ một nét" +msgstr "Sinh tạo nhiều nét vẽ từ một nét" msgid "Distance of duplications" -msgstr "Quãng của bản sao" +msgstr "Khoảng cách của các bản sao" msgid "Duplicates" -msgstr "Sao Chép" +msgstr "Số Bản Sao" msgid "How many copies of strokes be displayed" -msgstr "Số lượng bản sao của nét để hiển thị" +msgstr "Lượng bản sao nét vẽ sẽ được hiển thị" msgid "Fade center" -msgstr "Trung tâm phai" +msgstr "Trung tâm mờ dần" msgid "Fade influence of stroke's opacity" -msgstr "Giảm sự ảnh hưởng của độ đục của nét" +msgstr "Sự mờ dần tác động đến tính trong/đục của nét vẽ" msgid "Fade influence of stroke's thickness" -msgstr "Giảm sự ảnh hưởng của bề dày của nét" +msgstr "Sự mờ dần tác động đến độ dày của nét vẽ" msgid "Offset of duplicates. -1 to 1: inner to outer" -msgstr "Dịch của các bản sao. -1 đến 1: nội đến ngoại" +msgstr "Dịch chuyển của các bản sao. Từ -1 đến 1: bên trong ra bên ngoài" msgid "Fade" -msgstr "Phai" +msgstr "Phai Mờ Dần" msgid "Fade the stroke thickness for each generated stroke" -msgstr "Phai bề dầy nét cho mỗi nét được chế tạo" +msgstr "Phai mờ dần độ dày của nét vẽ đối với mỗi nét được sinh tạo" msgid "Noise Modifier" -msgstr "Bộ Điều Chỉnh Huyên Náo" +msgstr "Bộ Điều Chỉnh Tạo Sóng Nhiễu" msgid "Noise effect modifier" -msgstr "Bộ điều chỉnh hiệu ứng huyên náo" +msgstr "Bộ điều chỉnh tạo hiệu ứng sóng nhiễu" msgid "Amount of noise to apply" -msgstr "Lượng huyên náo để áp dụng" +msgstr "Lượng sóng nhiễu áp dụng" msgid "Strength Factor" -msgstr "Hệ Số Sức" +msgstr "Hệ Số về Cường Độ/Sức Mạnh" msgid "Amount of noise to apply to opacity" -msgstr "Mức độ huyên náo để áp dụng cho độ đục" +msgstr "Lượng nhiễu áp dụng vào tính trong đục" msgid "Thickness Factor" @@ -17300,55 +18438,83 @@ msgstr "Hệ Số Độ Dày" msgid "Amount of noise to apply to thickness" -msgstr "Mức huyên náo để áp dụng cho bề dầy" +msgstr "Lượng nhiễu áp dụng vào độ dày" + + +msgid "Amount of noise to apply to UV rotation" +msgstr "Lượng nhiễu áp dụng cho xoay chiều UV" msgid "Noise Offset" -msgstr "Dịch Huyên Náo" +msgstr "Dịch Chuyển Nhiễu" msgid "Offset the noise along the strokes" -msgstr "Dịch huyên náo trên nét" +msgstr "Dịch chuyển nhiễu dọc theo các nét vẽ" msgid "Scale the noise frequency" -msgstr "Phóng to tần số huyên náo" +msgstr "Tỷ lệ hóa tần số nhiễu" msgid "Where to perform randomization" -msgstr "Chỗ cho thực hành ngẫu nhiên hóa" +msgstr "Nơi thực hiện sự ngẫu nhiên hóa" msgid "Steps" -msgstr "Bước" +msgstr "Số Phân/Bước" msgid "Randomize every number of frames" -msgstr "Ngẫu nhiên hóa từng mỗi số bức ảnh" +msgstr "Ngẫu nhiên hóa mọi số khung hình" msgid "Randomize on keyframes only" -msgstr "Chỉ ngẫu nhiên hóa bức ảnh mẫu" +msgstr "Duy ngẫu nhiên hóa trên các khung khóa mà thôi" msgid "Noise Seed" -msgstr "Hạt Huyên Náo" +msgstr "Mầm Nhiễu" msgid "Use a custom curve to define noise effect along the strokes" -msgstr "Dùng một đường cong tùy chọn để xác định một hiệu ứng huyên náo trên các nét" +msgstr "Sử dụng đường cong tùy chỉnh để định nghĩa hiệu ứng nhiễu dọc theo nét vẽ" msgid "Offset Modifier" -msgstr "Bộ Điều Chỉnh Dịch" +msgstr "Bộ Điều Chỉnh Gây Dịch Chuyển" msgid "Offset Stroke modifier" -msgstr "Bộ điều chỉnh Dịch Nét" +msgstr "Bộ Điều Chỉnh Dịch Chuyển Nét Vẽ" + + +msgid "Randomize stroke offset" +msgstr "Ngẫu nhiên hóa dịch chuyển của nét vẽ" + + +msgid "Offset layers by the same factor" +msgstr "Dịch chuyển các tầng lớp với cùng một hệ số" + + +msgid "Offset strokes by the same factor based on stroke draw order" +msgstr "Dịch chuyển các nét vẽ theo cùng một hệ số dựa trên thứ tự vẽ nét" + + +msgid "Offset materials by the same factor" +msgstr "Dịch chuyển các nguyên vật liệu với cùng một hệ số" msgid "Start Offset" -msgstr "Dịch Đầu" +msgstr "Dịch Chuyển Đầu" + + +msgid "Offset starting point" +msgstr "Dịch chuyển điểm khởi đầu" + + +msgid "Number of elements that will be grouped" +msgstr "Số phần tử sẽ được nhóm lại" msgid "Opacity Modifier" @@ -17356,67 +18522,99 @@ msgstr "Bộ Điều Chỉnh Độ Đục" msgid "Opacity of Strokes modifier" -msgstr "Độ đục của bộ điều chỉnh Nét" +msgstr "Bộ điều chỉnh Độ Đục của Nét Vẽ" msgid "Opacity Factor" -msgstr "Hệ Số Độ Đục" +msgstr "Hệ Số về Độ Đục" msgid "Factor of Opacity" -msgstr "Hệ số của Độ Đục" +msgstr "Hệ Số về Độ Đục" msgid "Factor of stroke hardness" -msgstr "Hệ số độ cứng của nét" +msgstr "Hệ số độ đậm của nét vẽ" msgid "Modify stroke hardness" -msgstr "Chỉnh sửa độ cứng của nét" +msgstr "Điều chỉnh độ đậm của nét vẽ" msgid "Use a custom curve to define opacity effect along the strokes" -msgstr "Dùng một đường cong tùy chọn để xác định hiệu ứng độ đục trên các nét" +msgstr "Sử dụng một đường cong tùy chỉnh để xác định hiệu ứng trong đục dọc theo nét vẽ" msgid "Uniform Opacity" -msgstr "Độ Đục Đều Đặn" +msgstr "Độ Đục Đồng Nhất" msgid "Replace the stroke opacity" -msgstr "Thay thế cho độ đục nét" +msgstr "Thay thế độ đục của nét vẽ" msgid "Weighted" -msgstr "Có Quyền Lượng" +msgstr "Cân Trọng" msgid "Use weight to modulate effect" -msgstr "Dùng quyền lượng cho điều chỉnh hiệu ứng" +msgstr "Sử dụng trọng lượng để điều chỉnh hiệu ứng" + + +msgid "Outline Modifier" +msgstr "Bộ Điều Chỉnh Đường Viền" + + +msgid "Outline of Strokes modifier from camera view" +msgstr "Bộ Điều Chỉnh tạo Đường Viền từ góc nhìn của máy quay phim" msgid "Target Object" -msgstr "Vật Thể Mục Tiêu" +msgstr "Đối Tượng Mục Tiêu" + + +msgid "Target object to define stroke start" +msgstr "Đối tượng mục tiêu để xác định điểm khởi đầu của nét vẽ" + + +msgid "Outline Material" +msgstr "Nguyên Vật Liệu cho Đường Viền" + + +msgid "Material used for outline strokes" +msgstr "Nguyên vật liệu sử dụng để viền các nét vẽ" + + +msgid "Sample Length" +msgstr "Chiều Dài Lấy Mẫu" msgid "Subdivisions" -msgstr "Phân Hóa" +msgstr "Mức Phân Chia" msgid "Number of subdivisions" -msgstr "Số lượng phân hóa" +msgstr "Số phân đoạn" + + +msgid "Thickness of the perimeter stroke" +msgstr "Độ dày của nét viền chu vi" msgid "Keep Shape" -msgstr "Giữ Hình Dạng" +msgstr "Duy Trì Hình Thể" + + +msgid "Try to keep global shape" +msgstr "Cố gắng duy trì hình dạng tổng thể" msgid "Shrinkwrap Modifier" -msgstr "Cụ Sửa Đối Gói Thu Xiết" +msgstr "Bộ Điều Chỉnh Co Bọc" msgid "Shrink wrapping modifier to shrink wrap and object to a target" -msgstr "Bộ điều chỉnh cho thu xiết vật thể đến một mục tiêu" +msgstr "Bộ điều chỉnh để thu/co một đối tượng lại và bao bọc một mục tiêu" msgid "Auxiliary Target" @@ -17424,43 +18622,43 @@ msgstr "Mục Tiêu Phụ" msgid "Additional mesh target to shrink to" -msgstr "Thu xiết đến mạng lưới mục tiêu phụ nào" +msgstr "Mục tiêu khung lưới phụ để co vào đó" msgid "Distance to keep from the target" -msgstr "Khoảng cách giữ từ mục tiêu" +msgstr "Khoảng cách phân ly khỏi (bề mặt) mục tiêu" msgid "Project Limit" -msgstr "Giới Hạn Phép Chiếu" +msgstr "Giới Hạn Phóng Chiếu" msgid "Smooth Factor" -msgstr "Hệ Số Mịn Hóa" +msgstr "Hệ Số Làm Mịn" msgid "Amount of smoothing to apply" -msgstr "Mức độ mịn hóa để áp dụng" +msgstr "Lượng làm mịn áp dụng" msgid "Number of times to apply smooth (high numbers can reduce FPS)" -msgstr "Số lần để áp dụng mịn hóa (số lớn có thể giảm bức ảnh/giây)" +msgstr "Số lần áp dụng quá trình làm mịn (những số lớn có thể làm giảm tần số khung hình/giây (FPS))" msgid "Subdivision Levels" -msgstr "Tầng Phân Hóa" +msgstr "Mức Phân Hóa" msgid "Number of subdivisions that must be performed before extracting vertices' positions and normals" -msgstr "Số lần phân hóa cần làm trước được rút vị trí và pháp tuyến của đỉnh" +msgstr "Số lần phân chia cần làm trước khi chiết suất các vị trí và pháp tuyến của những điểm đỉnh" msgid "Mesh target to shrink to" -msgstr "Thu xiết đến mạng lưới mục tiêu nào" +msgstr "Khung lưới mục tiêu để co vào đó" msgid "When projecting in the negative direction invert the face cull mode" -msgstr "Đảo nghịch hủy diệt mặt khi chiếu độ theo hượng âm" +msgstr "Khi phóng chiếu trong hướng âm, đảo ngược chế độ loại bỏ Mặt" msgid "Negative" @@ -17468,7 +18666,7 @@ msgstr "Âm" msgid "Allow vertices to move in the negative direction of axis" -msgstr "Cho đỉnh di chuyển hướng âm của trục" +msgstr "Cho phép các điểm đỉnh di chuyển theo hướng âm của trục" msgid "Positive" @@ -17476,31 +18674,31 @@ msgstr "Dương" msgid "Allow vertices to move in the positive direction of axis" -msgstr "Cho đỉnh di chuyển hướng dương của trục" +msgstr "Cho phép các điểm đỉnh di chuyển theo hướng dương của trục" msgid "Wrap Method" -msgstr "Phương Pháp Gói Lại" +msgstr "Phương Pháp Bao Bọc" msgid "Shrink the mesh to the nearest target surface" -msgstr "Thu nhỏ lưới đến mặt mục tiêu gần nhất" +msgstr "Thu nhỏ khung lưới về bề mặt gần nhất trên mục tiêu" msgid "Shrink the mesh to the nearest target surface along a given axis" -msgstr "Thu nhỏ lưới đến mục tiêu mặt gần nhất theo hướng một trục được xác định" +msgstr "Thu nhỏ khung lưới về bề mặt gần nhất trên mục tiêu, dọc theo trục đã cho" msgid "Shrink the mesh to the nearest target vertex" -msgstr "Thu nhỏ mạng lưới đến đỉnh gần nhất" +msgstr "Thu nhỏ khung lưới về điểm đỉnh gần nhất trên mục tiêu" msgid "Shrink the mesh to the nearest target surface along the interpolated vertex normals of the target" -msgstr "Thu nhỏ mạng lưới đến bề mặt mục tiêu gần nhất theo pháp tuyến đỉnh được suy nội của mục tiêu" +msgstr "Thu nhỏ khung lưới tới bề mặt mục tiêu gần nhất dọc theo các pháp tuyến điểm đỉnh được nội suy của mục tiêu" msgid "Select how vertices are constrained to the target surface" -msgstr "Chọn phương pháp đỉnh được ràng buộc đến bề mặt của mục tiêu" +msgstr "Chọn phương pháp sử dụng để ràng buộc các điểm đỉnh vào bề mặt mục tiêu" msgid "Simplify Modifier" @@ -17508,107 +18706,107 @@ msgstr "Bộ Điều Chỉnh Đơn Giản Hóa" msgid "Simplify Stroke modifier" -msgstr "Bộ điều chỉnh Đơn Giản Hóa Nét" +msgstr "Bộ điều chỉnh Đơn Giản Hóa Nét Vẽ" msgid "Distance between points" -msgstr "Quãng giữa điểm" +msgstr "Khoảng cách giữa các điểm" msgid "Factor of Simplify" -msgstr "Hệ Số Đơn Giản Hóa" +msgstr "Hệ số Đơn Giản Hóa" msgid "Length of each segment" -msgstr "Bề dài của mỗi khúc" +msgstr "Chiều dài của mỗi phân đoạn" msgid "How to simplify the stroke" -msgstr "Phương pháp cho đơn giản hóa nét" +msgstr "Phương pháp đơn giản hóa nét vẽ" msgid "Fixed" -msgstr "Không Đổi" +msgstr "Cố Định/Bất Biến/Định Trước" msgid "Delete alternating vertices in the stroke, except extremes" -msgstr "Xóa đỉnh lẹ trong nét, trừ đỉnh cực đoan" +msgstr "Xóa các điểm đỉnh nhảy cách trong nét vẽ, ngoại trừ các điểm cao độ" msgid "Adaptive" -msgstr "Ứng Phó" +msgstr "Tùy Ứng" msgid "Use a Ramer-Douglas-Peucker algorithm to simplify the stroke preserving main shape" -msgstr "Dùng một giải Thuật Ramer-Douglas-Peucker để đơn giản hóa nét nhưng vẫn giữ hình dạng chánh" +msgstr "Sử dụng thuật toán của Ramer-Douglas-Peucker để đơn giản hóa nét vẽ, bảo tồn hình dạng chính" msgid "Sample" -msgstr "Lấy Mẫu" +msgstr "Lấy Mẫu Vật" msgid "Re-sample the stroke with segments of the specified length" -msgstr "Lấy mẫu mới từ nét có khúc có bề dài được xác định" +msgstr "Lấy mẫu vật lại nét vẽ, hầu cho các phân đoạn có chiều dài như đã định" msgid "Merge" -msgstr "Gồm" +msgstr "Hợp Nhất" msgid "Simplify the stroke by merging vertices closer than a given distance" -msgstr "Đơn gỉa hóa nét bằng gồm đỉnh gần hơn một quãng được chỉ định" +msgstr "Đơn giản hóa nét vẽ bằng cách hợp nhất các điểm đỉnh nằm trong khoảng cách đã cho" msgid "Sharp Threshold" -msgstr "Mực Độ Bén" +msgstr "Giới Hạn Tăng Độ Sắc Nét" msgid "Preserve corners that have sharper angle than this threshold" -msgstr "Giữ nguyên những góc giác có góc bén hơn mức độ này" +msgstr "Bảo tồn các góc có góc sắc nét hơn ngưỡng này" msgid "Number of times to apply simplify" -msgstr "Số lần để áp dụng đơn giản hóa" +msgstr "Số lần áp dụng sự đơn giản hóa" msgid "Smooth Modifier" -msgstr "Bộ Điều Chỉnh Mịn" +msgstr "Bộ Điều Chỉnh Làm Mịn" msgid "Smooth effect modifier" -msgstr "Bộ điều chỉnh hiệu ứng mịn hóa" +msgstr "Bộ điều chỉnh tạo hiệu ứng làm mịn" msgid "Amount of smooth to apply" -msgstr "Mức mịn hóa để áp dụng" +msgstr "Lượng làm mịn áp dụng" msgid "Number of times to apply smooth (high numbers can reduce fps)" -msgstr "Số lần để áp dụng mịn hóa (số lớn có thể giảm bức ảnh/giây)" +msgstr "Số lần áp dụng quá trình làm mịn (những số lớn có thể làm giảm tần số khung hình/giây (FPS))" msgid "Use a custom curve to define smooth effect along the strokes" -msgstr "Dùng một đường cong để xác định hiệu ứng mịn trên các nét" +msgstr "Sử dụng một đường cong tùy chỉnh để xác định hiệu ứng mịn màng dọc theo nét vẽ" msgid "The modifier affects the position of the point" -msgstr "Bộ điều chỉnh được ảnh hướng vị trí của điểm" +msgstr "Bộ điều chỉnh tác động đến vị trí của chấm (trên nét vẽ)" msgid "The modifier affects the color strength of the point" -msgstr "Bộ điều chỉnh được ảnh hưởng sức màu của điểm" +msgstr "Bộ điều chỉnh tác động cường độ màu của chấm (trên nét vẽ)" msgid "The modifier affects the thickness of the point" -msgstr "Bộ điều chỉnh được ảnh hượng bề dày của điểm" +msgstr "Bộ điều chỉnh tác động đến độ dày của chấm (trên nét vẽ)" msgid "The modifier affects the UV rotation factor of the point" -msgstr "Bộ điều chỉnh được ảnh hượng hệ số xoay UV của điểm" +msgstr "Bộ điều chỉnh tác động hệ số xoay chiều UV của điểm" msgid "Smooth the details, but keep the overall shape" -msgstr "Mịn hóa chi tiết, nhưng giữ hình dạng tổng quát" +msgstr "Làm mịn các chi tiết, song giữ nguyên hình dạng tổng thể" msgid "Subdivision Modifier" @@ -17616,15 +18814,15 @@ msgstr "Bộ Điều Chỉnh Phân Hóa" msgid "Subdivide Stroke modifier" -msgstr "Bộ điều chỉnh Phân Hóa Nét" +msgstr "Bộ điều chỉnh Phân Chia Nét Vẽ" msgid "Subdivision Type" -msgstr "Loại Phân Hóa" +msgstr "Thể Loại Phân Hóa" msgid "Select type of subdivision algorithm" -msgstr "Chọn giải thuật phân hóa" +msgstr "Chọn thể loại của thuật toán phân hóa" msgid "Catmull-Clark" @@ -17640,239 +18838,247 @@ msgstr "Bộ Điều Chỉnh Chất Liệu" msgid "Transform stroke texture coordinates Modifier" -msgstr "Bộ điều chỉnh biến hóa tọa độ chất liệu của nét" +msgstr "Bộ Điều Chỉnh biến hóa tọa độ chất liệu của nét vẽ" msgid "Additional rotation applied to dots and square strokes" -msgstr "Xpay thêm được áp dụng cho nét dấu chấm tròn và vuông" +msgstr "Mức xoay chiều bổ sung áp dụng vào các nét vẽ chấm tròn và hình vuông" msgid "Fill Offset" -msgstr "Dịch Tô Đầy" +msgstr "Dịch Chuyển của Vùng Tô Kín" msgid "Additional offset of the fill UV" -msgstr "Dịch thêm cho tô đầy của UV" +msgstr "Cho thêm dịch chuyển của UV vùng tô kín" msgid "Fill Rotation" -msgstr "Tô Đầy Xoay" +msgstr "Xoay Chiều Vùng Tô Kín" msgid "Additional rotation of the fill UV" -msgstr "Xoay thêm cho tô đầy của UV" +msgstr "Xoay chiều gia tăng cho UV vùng tô kín" msgid "Fill Scale" -msgstr "Phong Cách Tô Đầy" +msgstr "Tỷ Lệ của vùng Tô Kín" msgid "Additional scale of the fill UV" -msgstr "Phóng to thêm cho tô đầy của UV" +msgstr "Tỷ lệ gia tăng cho UV vùng tô kín" msgid "Fit Method" -msgstr "Phương Pháp Vừa Hóa" +msgstr "Phương Pháp Khít" msgid "Constant Length" -msgstr "Chiều Dài Hằng Số" +msgstr "Chiều Dài Bất Biến" msgid "Keep the texture at a constant length regardless of the length of each stroke" -msgstr "Giữ chiều dài của chất liệu là một hằng số, không kể chiều dài của mỗi nét " +msgstr "Giữ chất liệu ở độ dài bất biến, bất kể chiều dài của mỗi nét vẽ là bao nhiêu" msgid "Stroke Length" -msgstr "Chiều Dài Nét" +msgstr "Chiều Dài của Nét Vẽ" msgid "Scale the texture to fit the length of each stroke" -msgstr "Phóng to chất liệu cho vừa bề dài của mỗi nét" +msgstr "Đồi tỷ lệ chất liệu cho khít với toàn bộ chiều dài của mỗi nét vẽ" msgid "Manipulate only stroke texture coordinates" -msgstr "Chỉ vận dụng tọa độ chất liệu của nét" +msgstr "Chỉ điều chỉnh tọa độ chất liệu của nét vẽ mà thôi" msgid "Manipulate only fill texture coordinates" -msgstr "Chỉ vận dụng tọa độ chất liệu của tô đầy" +msgstr "Chỉ điều chỉnh tọa độ chất liệu tô kín mà thôi" msgid "Manipulate both stroke and fill texture coordinates" -msgstr "Vận dụng cả hai tọa độ chất liệu của nét và tô đầy" +msgstr "Điều chỉnh tọa độ chất liệu của cả hai, nét vẽ và vùng tô kín" msgid "UV Offset" -msgstr "Dịch UV" +msgstr "Dịch Chuyển UV" msgid "Offset value to add to stroke UVs" -msgstr "Giá trị dịch thêm cho UV của nét " +msgstr "Giá trị dịch chuyển để thêm vào các UV của nét vẽ" msgid "Factor to scale the UVs" -msgstr "Hệ số cho phóng to UV" +msgstr "Hệ số để đổi tỷ lệ các UV" msgid "Thick Modifier" -msgstr "Bộ Điều Chỉnh Bề Dày" +msgstr "Bộ Điều Chỉnh Độ Dày" msgid "Subdivide and Smooth Stroke modifier" -msgstr "Bộ điều chỉnh Phân và Mịn Hóa" +msgstr "Bộ điều chỉnh Phân Chia và Nắn Mượt Nét Vẽ" msgid "Absolute thickness to apply everywhere" -msgstr "Bề dày thuyệt đối để áp dụng mỗi nơi" +msgstr "Độ dày tuyệt đối để áp dụng ở mọi nơi" msgid "Factor to multiply the thickness with" -msgstr "Hệ số cho nhân bề dày" +msgstr "Hệ số dùng để nhân với độ dày" msgid "Use a custom curve to define thickness change along the strokes" -msgstr "Dùng một đường cong tùy chọn để chỉ định sử thay đổi bề dày trên các nét" +msgstr "Sử dụng một đường cong tùy chỉnh để xác định sự thay đổi về độ dày dọc theo nét vẽ" msgid "Uniform Thickness" -msgstr "Bề Dày Đều Đặn" +msgstr "Độ Dày Đồng Đều" msgid "Replace the stroke thickness" -msgstr "Thay thế cho độ dày nét" +msgstr "Thay thế độ dày của nét vẽ" msgid "Time Offset Modifier" -msgstr "Bộ Điều Chỉnh Dịch Thời Gian" +msgstr "Bộ Điều Chỉnh Dịch Chuyển Thời Gian" msgid "Time offset modifier" -msgstr "Bộ điều chỉnh dịch thời gian" +msgstr "Bộ điều chỉnh dịch chuyển thời gian" msgid "Final frame of the range" -msgstr "Số bức ảnh cuối của phạm vi" +msgstr "Khung hình cuối cùng của phạm vi" msgid "Frame Scale" -msgstr "Phóng To Bức Ảnh" +msgstr "Tỷ Lệ Khung Hình" msgid "Evaluation time in seconds" -msgstr "Thời gian tính toán (đơn vị giây)" +msgstr "Thời gian tính toán trong đơn vị giây" msgid "First frame of the range" -msgstr "Số bức ảnh đầu của phạm viH" +msgstr "Khung hình đầu tiên của phạm vi" msgid "Apply offset in usual animation direction" -msgstr "Áp dụng dịch đi hướng bình thường của hoạt hình" +msgstr "Áp dụng dịch chuyển trong chiều hướng hoạt họa bình thường" msgid "Reverse" -msgstr "Ngược" +msgstr "Đảo Ngược" msgid "Apply offset in reverse animation direction" -msgstr "Áp dụng dịch cho hướng ngược của hoạt hình" +msgstr "Áp dụng dịch chuyển trong hướng hoạt họa ngược chiều" msgid "Fixed Frame" -msgstr "Số Bức Ảnh Không Đổi" +msgstr "Khung Hình Bất Động" msgid "Keep frame and do not change with time" -msgstr "Giữ nguyên số bức ảnh và không đổi với thời gian" +msgstr "Duy trì khung hình và không thay đổi với thời gian" msgid "Ping Pong" msgstr "Nhảy Tới Lùi" +msgid "Loop back and forth starting in reverse" +msgstr "Xoay vòng ngược chiều và thuận chiều, khởi đầu ngược chiều" + + msgid "Chain" -msgstr "Chuỗi" +msgstr "Móc Nối Dây Chuyền" + + +msgid "List of chained animation segments" +msgstr "Danh sách các phân đoạn hoạt họa móc nối" msgid "Frame Offset" -msgstr "Nới Số Bức Ảnh" +msgstr "Dịch Chuyển Khung Hình" msgid "Number of frames to offset original keyframe number or frame to fix" -msgstr "Số lượng bức ảnh để nới từ bức ảnh mẫu ban đầu để chỉnh sửa" +msgstr "Số khung hình để dịch chuyển số khung khóa hoặc khung hình gốc để sửa" msgid "Custom Range" -msgstr "Phạm Vị Tùy Chọn" +msgstr "Phạm Vi Tùy Chỉnh" msgid "Define a custom range of frames to use in modifier" -msgstr "Chỉ định một phạm vi bức ảnh để sử dụng trong bộ điều chỉnh" +msgstr "Định nghĩa khoảng các khung hình một cách tùy tiện để sử dụng trong bộ điều chỉnh" msgid "Keep Loop" -msgstr "Giữ Lặp Lại" +msgstr "Tuần Hoàn" msgid "Retiming end frames and move to start of animation to keep loop" -msgstr "Chỉnh thời tự của các bức ảnh cuối để di chuyển đến đầu hoạt hình cho giữ lặp lặi" +msgstr "Tính lại thời gian của các khung hình cuối và di chuyển về đoạn đầu của hoạt họa để tuần hoàn" msgid "Tint Modifier" -msgstr "Bộ Điều Chỉnh Nhiễm Màu" +msgstr "Bộ Điều Chỉnh Làm Nhuốm Màu" msgid "Tint modifier" -msgstr "Bộ điều chỉnh nhiễm màu" +msgstr "Bộ điều chỉnh làm nhuốm màu" msgid "Color used for tinting" -msgstr "Màu sử dụng cho nhiễm màu" +msgstr "Màu sử dụng để đổi sắc thái/nhuốm" msgid "Color ramp used to define tinting colors" -msgstr "Dốc màu cho chỉ định nhiễm màu" +msgstr "Dốc màu sử dụng để xác định màu nhuốm" msgid "Factor for tinting" -msgstr "Hệ số cho nhiễm màu" +msgstr "Hệ số nhuốm màu" msgid "Parent object to define the center of the effect" -msgstr "Vật thể phụ huynh cho chỉ định trung tâm của hiệu ứng" +msgstr "Đối tượng phụ huynh xác định tâm điểm của hiệu ứng" msgid "Defines the maximum distance of the effect" -msgstr "Chỉ định khoảng cách cực đại của hiệu ứng" +msgstr "Xác định khoảng cách tối đa của hiệu ứng" msgid "Tint Type" -msgstr "Kiểu Nhiễm Màu" +msgstr "Kiểu Nhuốm Màu" msgid "Select type of tinting algorithm" -msgstr "Chọn giải thuật nhiễm màu" +msgstr "Chọn thuật toán làm nhuốm màu" msgid "Use a custom curve to define vertex color effect along the strokes" -msgstr "Dùng một đường cong tùy chọn cho chỉ định hiệu ứng màu đỉnh trên các nét" +msgstr "Sử dụng một đường cong để xác định hiệu ứng màu điểm đỉnh dọc theo nét vẽ" msgid "Weight Modifier Angle" -msgstr "Góc Bộ Điều Chỉnh Quyền Lượng" +msgstr "Góc của Bộ Điều Chỉnh Trọng Lượng" msgid "Calculate Vertex Weight dynamically" -msgstr "Tính Quyền Lượng kiểu động lý" +msgstr "Tính Trọng Lượng Điểm Đỉnh một cách linh hoạt" msgid "Minimum value for vertex weight" -msgstr "Giá trị cực tiểu cho quyền lượng đỉnh" +msgstr "Giá trị tối thiểu cho trọng lượng điểm đỉnh" msgid "Space" -msgstr "Không Gian" +msgstr "Phân Khoảng Cách/Trống/Không Gian" msgid "Coordinates space" @@ -17880,19 +19086,19 @@ msgstr "Không gian tọa độ" msgid "Invert output weight values" -msgstr "Đảo nghịch giá trị ngõ ra của quyền lượng" +msgstr "Đảo ngược giá trị trọng lượng đầu ra" msgid "Multiply Weights" -msgstr "Nhân Quyền Lượng" +msgstr "Nhân Trọng Lượng" msgid "Multiply the calculated weights with the existing values in the vertex group" -msgstr "Nhân các quyền lượng được tính với các giá trị đang tồn tại trong nhóm đỉnh" +msgstr "Nhân trọng lượng đã tính toán với các giá trị hiện có trong nhóm điểm đỉnh" msgid "Weight Modifier Proximity" -msgstr "Bộ Điều Chỉnh Quyền Lượng Khoảng Cách" +msgstr "Độ Tiếp Cận Bộ Điều Chỉnh Trọng Lượng" msgid "Highest" @@ -17900,7 +19106,7 @@ msgstr "Cao Nhất" msgid "Distance mapping to 1.0 weight" -msgstr "Ánh xạ khoảng cách đến quyền lượng 1.0" +msgstr "Khoảng cách được ánh xạ thành trọng lượng 1.0" msgid "Lowest" @@ -17908,19 +19114,19 @@ msgstr "Thấp Nhất" msgid "Distance mapping to 0.0 weight" -msgstr "Ánh xạ khoảng cách đến quyền lượng 0.0" +msgstr "Khoảng cách được ánh xạ thành trọng lượng 0.0" msgid "Object used as distance reference" -msgstr "Vật thể được dùng cho đo khoảng cách" +msgstr "Đối tượng được sử dụng làm tham chiếu khoảng cách" msgid "Vertex Group Element" -msgstr "Phần Tử Nhó Đỉnh" +msgstr "Phần Tử của Nhóm Điểm Đỉnh" msgid "Weight value of a vertex in a vertex group" -msgstr "Quyền lượng của một đỉnh trong một nhóm đỉnh" +msgstr "Trọng lượng của một điểm đỉnh trong nhóm điểm đỉnh" msgid "Group Index" @@ -17928,103 +19134,103 @@ msgstr "Chỉ Số Nhóm" msgid "Vertex Weight" -msgstr "Quyền Lượng Đỉnh" +msgstr "Trọng Lượng Điểm Đỉnh" msgid "Grid and Canvas Settings" -msgstr "Cài Đặt Đồ Thị và Mặt Sơn" +msgstr "Sắp Đặt của Khung Vẽ và Khung Lưới Đồ Thị" msgid "Settings for grid and canvas in 3D viewport" -msgstr "Cài đặt cho đồ thị và mặt sơn trong màn chiếu 3D" +msgstr "Những sắp đặt của khung lưới đồ thị và khung vẽ trong cổng nhìn 3D" msgid "Grid Color" -msgstr "Màu Đồ Thị" +msgstr "Màu Khung Lưới Đồ Thị" msgid "Color for grid lines" -msgstr "Màu của đường đồ thị" +msgstr "Màu cho các đường khung lưới đồ thị" msgid "Grid Subdivisions" -msgstr "Phân Hóa Đồ Thị" +msgstr "Lượng Phân Chia của Khung Lưới Đồ Thị" msgid "Number of subdivisions in each side of symmetry line" -msgstr "Số lượng phân hóa hai bên đường đối xứng" +msgstr "Lượng phân chia mỗi bên của đường đối xứng" msgid "Offset of the canvas" -msgstr "Dịch của mặt sơn" +msgstr "Dịch chuyển của khung vẽ" msgid "Grid Scale" -msgstr "Phóng To Đồ Thị" +msgstr "Tỷ Lệ Khung Lưới Đồ Thị" msgid "Grid scale" -msgstr "Phóng to đồ thị" +msgstr "Tỷ lệ khung lưới đồ thị" msgid "Grease Pencil Layers" -msgstr "Lớp Bút Sáp" +msgstr "Các Tầng Lớp Bút Chì Dầu" msgid "Collection of grease pencil layers" -msgstr "Sưu tập lớp bút sáp" +msgstr "Bộ sưu tập các tầng lớp Bút Chì Dầu" msgid "Active grease pencil layer" -msgstr "Lớp Bút Sáp hoạt động" +msgstr "Tầng Bút Chì Dầu đang hoạt động" msgid "Active Layer Index" -msgstr "Chi Số Lớp Hoạt Động" +msgstr "Chỉ Số của Tầng đang Hoạt Động" msgid "Index of active grease pencil layer" -msgstr "Chỉ số của lớp Bút Sáp hoạt động" +msgstr "Chỉ số của tầng Bút Chì Dầu đang hoạt động" msgid "Active Note" -msgstr "Lời Ghi Chú Hoạt Động" +msgstr "Chú Giải đang Hoạt Động" msgid "Note/Layer to add annotation strokes to" -msgstr "Lớp để thêm nét lời ghi chú" +msgstr "Chú Giải/Tầng Lớp để cho thêm các nét vẽ chú thích vào" msgid "Grease Pencil Mask Layers" -msgstr "Lớp Mặt Nạ Bút Sáp" +msgstr "Các Tầng Chắn Lọc của Bút Chì Dầu" msgid "Collection of grease pencil masking layers" -msgstr "Sưu tập lớp mặt nạ bút sáp" +msgstr "Bộ sưu tập các tầng chắn lọc của bút chì dầu" msgid "Active Layer Mask Index" -msgstr "Chi Số Mặt Nạ Lớp Hoạt Động" +msgstr "Chỉ Số của Tầng Chắn Lọc đang Hoạt Động" msgid "Active index in layer mask array" -msgstr "Chỉ số hoạt động trong mảng mặt nạ lớp" +msgstr "Chỉ số đang hoạt động trong mảng về tầng chắn lọc" msgid "Active Grease Pencil layer" -msgstr "Lớp Bút Sáp hoạt động" +msgstr "Tầng Bút Chì Dầu đang hoạt động" msgid "Editor header containing UI elements" -msgstr "Đầu trình biên soạn chứa phần tử Giao Diện" +msgstr "Tiêu đề của trình biên soạn có chứa các phần tử giao diện người dùng" msgid "Statistical view of the levels of color in an image" -msgstr "Sự hiển thị thống kê của mức độ màu trong một ảnh" +msgstr "Hiển thị thống kê của mức độ màu sắc trong một hình ảnh" msgid "Channels to display in the histogram" -msgstr "Chiếu các kênh nào trong biểu đồ" +msgstr "Các kênh để hiển thị trong biểu đồ tần suất" msgid "Luma" @@ -18032,7 +19238,7 @@ msgstr "Độ Sáng" msgid "Red Green Blue" -msgstr "Đỏ Lục Xanh" +msgstr "Đỏ Lục Lam" msgid "R" @@ -18056,7 +19262,7 @@ msgstr "B" msgid "Blue" -msgstr "Xanh" +msgstr "Lam" msgid "A" @@ -18064,23 +19270,23 @@ msgstr "A" msgid "Show Line" -msgstr "Hiện Nét" +msgstr "Hiển Thị Nét" msgid "Display lines rather than filled shapes" -msgstr "Hiển thị nét thay thế hình dạng được tô màu" +msgstr "Hiển thị các nét thay vì các hình dạng được phủ đầy" msgid "Base type for data-blocks, defining a unique name, linking from other libraries and garbage collection" -msgstr "Loại cơ sở cho cục dữ liệu, chỉ định tên độc đáo, nối với thư viện khác và gồm rác" +msgstr "Loại cơ sở cho khối dữ liệu, định nghĩa một tên duy nhất, kết nối với các thư viện khác và thu dọn rác rưởi" msgid "Additional data for an asset data-block" -msgstr "Dữ liệu thêm cho một cục dữ liệu tích sản" +msgstr "Dữ liệu bổ sung cho một khối dữ liệu tài sản" msgid "Brush" -msgstr "Bút" +msgstr "Đầu Bút" msgid "Font" @@ -18088,7 +19294,7 @@ msgstr "Phông" msgid "Key" -msgstr "Bức Ảnh Mẫu" +msgstr "Khóa" msgid "Library" @@ -18096,19 +19302,19 @@ msgstr "Thư Viện" msgid "Light" -msgstr "Nhẹ" +msgstr "Nguồn/Ánh Sáng" msgid "Light Probe" -msgstr "Quang Kế" +msgstr "Dò Ánh Sáng" msgid "Mask" -msgstr "Mặt Nạ" +msgstr "Màn Chắn Lọc" msgid "Mesh" -msgstr "Mạng Lưới" +msgstr "Khung Lưới" msgid "Metaball" @@ -18116,15 +19322,15 @@ msgstr "Siêu Cầu" msgid "Node Tree" -msgstr "Cây Giao Điểm" +msgstr "Cây Nút" msgid "Paint Curve" -msgstr "Đường Cong Nước Sơn" +msgstr "Đường Cong Sơn" msgid "Palette" -msgstr "Bảng Màu" +msgstr "Bảng Pha Màu" msgid "Particle" @@ -18132,7 +19338,7 @@ msgstr "Hạt" msgid "Point Cloud" -msgstr "Điểm Mây" +msgstr "Mây Điểm Chấm" msgid "Sound" @@ -18148,11 +19354,11 @@ msgstr "Văn Bản" msgid "Window Manager" -msgstr "Bộ Quản Lý Cửa Sổ" +msgstr "Trình Quản Lý Cửa Sổ" msgid "Workspace" -msgstr "Công Trường" +msgstr "Không Gian Làm Việc" msgid "World" @@ -18160,19 +19366,19 @@ msgstr "Thế Giới" msgid "Embedded Data" -msgstr "Dữ Liệu Đã Nhét" +msgstr "Dữ Liệu Nhúng Sẵn" msgid "This data-block is not an independent one, but is actually a sub-data of another ID (typical example: root node trees or master collections)" -msgstr "Cục dữ liệu này không phải là cục độc lập, mà thật là hạ dữ liệu của một ID khác (ví dụ thường xuyên: các cây giao điểm rễ hay sưu tập chủ)" +msgstr "Khối dữ liệu này không phải là một khối độc lập, song thực ra, nó là một dữ liệu phụ của một chỉ danh ID khác (ví dụ tiêu biểu: các cây nút gốc hoặc các bộ sưu tập chính)" msgid "Is Evaluated" -msgstr "Được Tính Toán" +msgstr "Tính Toán" msgid "Whether this ID is runtime-only, evaluated data-block, or actual data from .blend file" -msgstr "ID này là chỉ thời gian chạy, cục dữ liệu được tính toán, hoặc dữ liệu thật từ tập tin .blend" +msgstr "Chỉ danh ID này có phải là chỉ tồn tại trong thời gian phần mềm hoạt động hay không (runtime-only), hay là khối dữ liệu được được ước tính, hoặc là dữ liệu thực từ tập tin .blend" msgid "Is Indirect" @@ -18180,35 +19386,51 @@ msgstr "Là Gián Tiếp" msgid "Is this ID block linked indirectly" -msgstr "Cục ID này được liên kết gián tiếp" +msgstr "Khối ID này có được kết nối gián tiếp hay không" + + +msgid "Missing Data" +msgstr "Dữ Liệu bị Thiếu Vắng" + + +msgid "This data-block is a place-holder for missing linked data (i.e. it is [an override of] a linked data that could not be found anymore)" +msgstr "Khối dữ liệu này là phần giữ chỗ cho dữ liệu liên kết bị thiếu vắng (tức nó là [một vượt quyền của] một dữ liệu vốn được liên kết song không tìm thấy nữa)" + + +msgid "Runtime Data" +msgstr "Dữ Liệu Thời Gian Chạy" + + +msgid "This data-block is runtime data, i.e. it won't be saved in .blend file. Note that e.g. evaluated IDs are always runtime, so this value is only editable for data-blocks in Main data-base" +msgstr "Khối dữ liệu này là dữ liệu thời gian chạy, tức là nó sẽ không được lưu trong tập tin .blend. Lưu ý rằng: các ID được tính toán luôn luôn nằm trong thời gian chạy, vì vậy giá trị này chỉ có thể chỉnh sửa được đối với các khối dữ liệu trong cơ sở dữ liệu Chính mà thôi" msgid "Library file the data-block is linked from" -msgstr "Tập tin thư viện được nối với cục dữ liệu nào" +msgstr "Tập tin thư viện được kết nối với khối dữ liệu" msgid "Library Weak Reference" -msgstr "Tham Chiếu Thư Viện Yếu" +msgstr "Tham Chiếu Yếu của Thư viện" msgid "Weak reference to a data-block in another library .blend file (used to re-use already appended data instead of appending new copies)" -msgstr "Tham chiếu yếu đến một cục dữ liệu trong một tập tin .blend thư viện khác (dùng cho sử dụng lại dữ liệu kèm rồi thay thế kèm bản sao mới)" +msgstr "Tham chiếu yếu đến khối dữ liệu trong một tập tin .blend ở một thư viện khác (dùng để tái dụng dữ liệu đã được chèn thêm vào, thay vì việc chồng chất thêm bằng các bản sao mới)" msgid "Full Name" -msgstr "Toàn Tên" +msgstr "Tên Đầy Đủ" msgid "Unique data-block ID name, including library one is any" -msgstr "Tên cục dữ liệu độc đáo, gồm thư viện làm một cái" +msgstr "Tên chỉ danh ID duy nhất cho khối dữ liệu, và thư viện, nếu có" msgid "Original ID" -msgstr "ID Ban Đầu" +msgstr "ID Gốc" msgid "Actual data-block from .blend file (Main database) that generated that evaluated one" -msgstr "Cục dữ liệu thật từ tập tin .blend (cơ sở dữ liệu Chánh) được chế tạo một cục được tính toán" +msgstr "Khối dữ liệu thực từ tập tin .blend (Cơ Sở Dữ Liệu Chính) đã sinh tạo ra cái được ước tính ấy" msgid "Library Override" @@ -18216,11 +19438,11 @@ msgstr "Vượt Quyền Thư Viện" msgid "Library override data" -msgstr "Dứ liệu vượt quyền thư viện" +msgstr "Dữ liệu vượt quyền thư viện" msgid "Preview image and icon of this data-block (always None if not supported for this type of data)" -msgstr "Ảnh dự khán và biểu tượng của cục dữ liệu này (lần nào Không nếu không hỗ trợ cho kiểu dữ liệu này)" +msgstr "Xem trước hình ảnh và biểu tượng của khối dữ liệu này (luôn luôn là Không (None) nếu không được hỗ trợ cho loại dữ liệu này)" msgid "Tag" @@ -18228,15 +19450,15 @@ msgstr "Nhãn" msgid "Tools can use this to tag data for their own purposes (initial state is undefined)" -msgstr "Dụng cụ có thể dùng này dán nhãn cho địch vụ của chúng nó (trạng thái khởi động chưa định nghĩa)" +msgstr "Các công cụ có thể sử dụng cái này để ký nhãn dữ liệu cho các mục đích riêng của chúng (trạng thái khởi đầu là không xác định)" msgid "Extra User" -msgstr "Người Dùng Thêm" +msgstr "Người Dùng Bổ Sung" msgid "Indicates whether an extra user is set or not (mainly for internal/debug usages)" -msgstr "Chỉ cho biết có một người dùng thêm được đặt hay không (phần lớn cho sủ dụng nội bộ/sửa sai lầm)" +msgstr "Ám chỉ rằng người dùng bổ sung có được đặt hay không (chủ yếu dành cho các tác vụ nội bộ / điều tra gỡ lỗi)" msgid "Fake User" @@ -18244,108 +19466,112 @@ msgstr "Người Dùng Giả" msgid "Save this data-block even if it has no users" -msgstr "Lưu cục dữ liệu này cùng nếu không có ai dùng" +msgstr "Lưu khối dữ liệu này ngay cả khi nó không có người dùng nào cả" msgid "Users" -msgstr "Người Dùng" +msgstr "Số Người Dùng" msgid "Number of times this data-block is referenced" -msgstr "Số lượng lần cục dữ liệu này được tham chiếu" +msgstr "Số lần khối dữ liệu này được nhắc đến / tham chiếu" msgid "A collection of F-Curves for animation" -msgstr "Một sưu tập Cong-F cho hoạt hình" +msgstr "Nhóm các Đường Cong-F dành cho hoạt họa" msgid "Curve Frame Range" -msgstr "Phạm Vi Bức Ảnh Đường Cong" +msgstr "Phạm Vi Khung Hình Đường Cong" msgid "The combined frame range of all F-Curves within this action" -msgstr "Phạm vi gồm góp từ hết Cong-F trong hành động này" +msgstr "Phạm vi khung hình kết hợp của toàn bộ các Đường Cong-F trong hành động này" msgid "F-Curves" -msgstr "Cong-F" +msgstr "Đường Cong-F" msgid "The individual F-Curves that make up the action" -msgstr "Các Cong-F riêng được thành lập một hành động" +msgstr "Các đơn vị Đường Cong-F tạo nên hành động" msgid "The end frame of the manually set intended playback range" -msgstr "Bức ảnh cuối của phạm vi của tập hợp được chọn bằng tay cho hát lại" +msgstr "Khung hình kết thúc của phạm vi chơi lại dự kiến do mình đặt ra" msgid "Frame Range" -msgstr "Phạm Vi Bứa Ảnh" +msgstr "Phạm Vi Khung Hình" msgid "The intended playback frame range of this action, using the manually set range if available, or the combined frame range of all F-Curves within this action if not (assigning sets the manual frame range)" -msgstr "Phạm vi hát lại ý định của hành động này, đang dùng phạm đặt bằng tay nếu có, hoặc gồm phạm vi của tất cả Cong-F trong hành động này nếu không đặt (chỉ định sẽ đặt phạm vi được đặt bằng tay)" +msgstr "Phạm vi khung hình chơi lại dự định cho hành động này, sử dụng phạm vi tự đặt một cách thủ công nếu có, hoặc phạm vi khung hình kết hợp của toàn bộ các Đường Cong-F trong hành động này nếu không (ấn định phạm vi khung hình thủ công)" msgid "The start frame of the manually set intended playback range" -msgstr "Bức ảnh đầu của phạm vi của tập hợp được chọn bằng tay cho hát lại" +msgstr "Khung hình khởi đầu của phạm vi chơi lại dự định" msgid "Groups" -msgstr "Các Nhóm" +msgstr "Nhóm" msgid "Convenient groupings of F-Curves" -msgstr "Nhóm tiện lợi của các Cong-F" +msgstr "Các nhóm Đường Cong-F được nhóm lại cho thuận lợi" msgctxt "ID" msgid "ID Root Type" -msgstr "Loại Rễ Mã Số" +msgstr "Loại Gốc ID" msgid "Type of ID block that action can be used on - DO NOT CHANGE UNLESS YOU KNOW WHAT YOU ARE DOING" -msgstr "Loại cục ID hành động có thể dùng - ĐỪNG ĐỔI TRỪ KHI BẠN ĐANG BIẾT LÀM CÁI GÌ" +msgstr "Loại khối ID mà hành động có thể sử dụng - ĐỪNG NÊN SỬA ĐỔI TRỪ KHI MÌNH BIẾT RÕ TÁC ĐỘNG CỦA NÓ SẼ LÀ THẾ NÀO" msgid "Pose Markers" -msgstr "Ký Hiệu Dạng Đứng" +msgstr "Dấu Mốc Tư Thế" msgid "Markers specific to this action, for labeling poses" -msgstr "Ký hiệu riêng biệt cho hành động này, cho nhãn dạng đứng" +msgstr "Những dấu đánh riêng cho hành động này; Dùng để gắn nhãn hiệu cho các tư thế" msgid "Cyclic Animation" -msgstr "Hoạt Hình Chu Trình" +msgstr "Hoạt Họa Tuần Hoàn" msgid "The action is intended to be used as a cycle looping over its manually set playback frame range (enabling this doesn't automatically make it loop)" -msgstr "Ý định cho hành động là được làm một chu trình qua phạm vi hát lại được đặt bằng tay (bật này sẽ không tự động làm nó thành một chu trình)" +msgstr "Hành động này nhằm mục đích được sử dụng như một chu kỳ lặp lại trên phạm vi khung hình chơi lại tự đặt (bật chức năng này lên không làm cho nó lặp lại một cách tự động đâu nhé)" msgid "Manual Frame Range" -msgstr "Phạm Vi Bức Ảnh Bằng Tay" +msgstr "Phạm Vi Khung Hình Tự Đặt" msgid "Manually specify the intended playback frame range for the action (this range is used by some tools, but does not affect animation evaluation)" -msgstr "Bằng tay chỉ định phạm vi của bức ảnh tin hát lại cho hành động (vài công cụ sử dụng phạm vi này, nhưng ảnh hưởng sự tính toán hoạt hình)" +msgstr "Chỉ định phạm vi khung hình chơi lại cho hành động (phạm vi này sẽ được một số công cụ sử dụng, nhưng sẽ không ảnh hưởng gì đến quá trình tính toán hoạt họa)" msgid "Armature data-block containing a hierarchy of bones, usually used for rigging characters" -msgstr "Cục dữ liệu có tầng bậc xương, thường dùng làm giàn cho nhân vật" +msgstr "Khối dữ liệu khung cốt có chứa một phân cấp các xương, thường dùng cho quá trình dàn dựng các nhân vật" msgid "Animation data for this data-block" -msgstr "Dữ liệu hoạt hình cho cục dữ liệu này" +msgstr "Dữ liệu hoạt họa cho khối dữ liệu này" msgid "Axes Position" -msgstr "Vị Trí Trục" +msgstr "Vị Trí của Trục" msgid "The position for the axes on the bone. Increasing the value moves it closer to the tip; decreasing moves it closer to the root" -msgstr "Vị trí cho chiếu trục trên xương. Giá trị càng cao càng gần đến đỉnh; càng nhó càng gần rễ" +msgstr "Vị trí cho các trục trên xương. Tăng giá trị cao lên sẽ di chuyển gần đến đỉnh; giảm giá trị nhỏ đi sẽ di chuyển gần về gốc" + + +msgid "Bone Collections" +msgstr "Bộ Sưu Tập Xương" msgid "Octahedral" @@ -18353,67 +19579,83 @@ msgstr "Bát Diện" msgid "Display bones as octahedral shape (default)" -msgstr "Chiếu xương kiểu hình dạng bát diện (mặc định)" +msgstr "Hiển thị xương là hình bát diện (mặc định)" msgid "Stick" -msgstr "Cây" +msgstr "Gậy" msgid "Display bones as simple 2D lines with dots" -msgstr "Hiển thị xương như đường đơn giản 2 chiều và dấu chấm" +msgstr "Hiển thị xương như các đường 2D đơn giản với các dấu chấm" msgid "B-Bone" -msgstr "Xương-B" +msgstr "Xương-Dẻo" msgid "Display bones as boxes, showing subdivision and B-Splines" -msgstr "Hiển thị xương như hợp, đang hiện phân hóa và Mẫu Cong-B" +msgstr "Hiển thị xương là hình hộp, biểu hiện các phân đoạn và Chốt Trục Cơ Sở (đường cong B-Spline)" msgid "Display bones as extruded spheres, showing deformation influence volume" -msgstr "Hiển thị xương như hình cầu được kéo dài, đang hiện từ thể tích sự ảnh hưởng của méo hóa" +msgstr "Hiển thị xương là các hình cầu kéo dài, biểu hiện thể tích ảnh hưởng bởi sự biến dạng" msgid "Wire" -msgstr "Sợi Dây" +msgstr "Mạch Lưới" msgid "Display bones as thin wires, showing subdivision and B-Splines" -msgstr "Hiển thị xương như dăy mỏng, đang hiện phân hóa và Mẫu Cong-B" +msgstr "Hiển thị xương như các mạch lưới mỏng, biểu hiện các phân đoạn và Chốt Trục Cơ Sở (đường cong B-Spline)" msgid "Edit Bones" -msgstr "Biên Tập Xương" +msgstr "Biên Soạn Xương" msgid "Is Editmode" -msgstr "Là Chế Độ Biên Tập" +msgstr "Là Chế Độ Biên Soạn" msgid "True when used in editmode" -msgstr "Đúng khi dùng trong chế độ biên tập" +msgstr "Giá trị 'Đúng' khi sử dụng trong Chế Độ Biên Soạn" msgid "Pose Position" -msgstr "Vị Trí Dạng Đứng" +msgstr "Vị Trí Tư Thế" msgid "Show armature in binding pose or final posed state" -msgstr "Hiện cốt trong dạng đứng trói hay dạng đứng cuối cùng" +msgstr "Hiển thị khung cốt trong tư thế được kết buộc cho hoặc trong trạng thái tư thế cuối cùng" msgid "Show armature in posed state" -msgstr "Hiện cốt trạng thái dạng đứng" +msgstr "Hiển thị khung cốt trong trạng thái của tư thế" msgid "Rest Position" -msgstr "Dạng Đứng Nghỉ Ngơi" +msgstr "Tư Thế Nghỉ" msgid "Show Armature in binding pose state (no posing possible)" -msgstr "Hiện Cối trong dạng đứng trói (không thể đặt được dạng đứng)" +msgstr "Hiển Thị Khung Cốt trong trạng thái tư thế kết buộc (không thể đổi tư thế được)" + + +msgid "Relation Line Position" +msgstr "Vị Trí Đường Quan Hệ" + + +msgid "The start position of the relation lines from parent to child bones" +msgstr "Vị trí khởi đầu của các đường quan hệ từ xương phụ huynh đến các xương con cái" + + +msgid "Draw the relationship line from the parent tail to the child head" +msgstr "Vẽ đường quan hệ từ đuôi phụ huynh đến đầu con cái" + + +msgid "Draw the relationship line from the parent head to the child head" +msgstr "Vẽ đường quan hệ từ đầu phụ huynh đến đầu con cái" msgid "Display Axes" @@ -18421,15 +19663,23 @@ msgstr "Hiển Thị Trục" msgid "Display bone axes" -msgstr "Hiển thị trục xương" +msgstr "Hiển thị các trục của xương" + + +msgid "Display Bone Colors" +msgstr "Hiển Thị Màu Xương" + + +msgid "Display bone colors" +msgstr "Hiển thị các màu của xương" msgid "Display Custom Bone Shapes" -msgstr "Hiển Thị Hình Dạng Xương Tùy Chọn" +msgstr "Hiển Thị các Hình Mẫu Xương Tùy Chỉnh" msgid "Display bones with their custom shapes" -msgstr "Hiển thị xương mà bằng hình dạng tùy chọn" +msgstr "Hiển thị các xương với các hình mẫu tùy chỉnh của chúng" msgid "Display Names" @@ -18437,111 +19687,131 @@ msgstr "Hiển Thị Tên" msgid "Display bone names" -msgstr "Hiển thị tên xương " +msgstr "Hiển thị tên xương" msgid "X-Axis Mirror" -msgstr "Gương Trục X" +msgstr "Phản Chiếu Đối Xứng Trục X" msgid "Apply changes to matching bone on opposite side of X-Axis" -msgstr "Áp dụng sự thay đổi với xương đối xứng ở bên nghịch của Trục X" +msgstr "Áp dụng các thay đổi cho cả xương tương ứng ở bên đối diện của Trục-X" msgid "Brush data-block for storing brush settings for painting and sculpting" -msgstr "Cục dữ liệu bút chứa đặc trưng sơn và khắc" +msgstr "Khối dữ liệu lưu trữ cài đặt đầu bút cho quá trình sơn và điêu khắc" msgid "Area Radius" -msgstr "Bán Kính Diện Tích" +msgstr "Bán Kính Khu Vực" msgid "Ratio between the brush radius and the radius that is going to be used to sample the area center" -msgstr "Tỉ số giữa bán kính bút và bán kính sẽ dùng cho lấy mẫu trung tâm diện tích" +msgstr "Tỷ lệ giữa bán kính đầu bút và bán kính sẽ sử dụng để lấy mẫu vật vùng trung tâm khu vực" msgid "Auto-Smooth" -msgstr "Tự Động Mịn Hóa" +msgstr "Tự Động Làm Mịn" msgid "Amount of smoothing to automatically apply to each stroke" -msgstr "Mức mịn hóa tự động để áp dụng cho mỗi nét" +msgstr "Lượng làm mịn áp dụng tự động cho mỗi nét vẽ" msgid "Propagation Steps" -msgstr "Bước Truyền Dẵn" +msgstr "Số Bước Lan Truyền" msgid "Distance where boundary edge automasking is going to protect vertices from the fully masked edge" -msgstr "Khoảng cách thì tự động mặt nạ cạnh ranh giới sẽ bảo vệ đỉnh từ cạnh được mặt nạ che toàn phần" +msgstr "Khoảng cách mà quá trình tự động chắn lọc cạnh viền sẽ bảo vệ (ngăn ngừa) các điểm đỉnh khỏi cạnh đã hoàn toàn được chắn lọc" + + +msgid "Blur Steps" +msgstr "Số Bước Làm Nhòe Mờ" + + +msgid "The number of times the cavity mask is blurred" +msgstr "Số lần màn chắn lọc khe hốc được làm nhòe mờ" + + +msgid "Cavity Curve" +msgstr "Đường Cong cho Khe Hốc" + + +msgid "Cavity Factor" +msgstr "Hệ Số cho Khe Hốc" + + +msgid "The contrast of the cavity mask" +msgstr "Độ tương phản của màn chắn lọc khe hốc" msgid "Blending Mode" -msgstr "Chế Độ Pha Trộn" +msgstr "Chế độ pha trộn" msgid "Brush blending mode" -msgstr "Chế độ pha trộn bút" +msgstr "Chế độ pha trộn đầu bút" msgid "Use Mix blending mode while painting" -msgstr "Dùng chế độ Pha Trộn khi sơn" +msgstr "Dùng chế độ hòa trộn (Mix) trong khi sơn" msgid "Use Darken blending mode while painting" -msgstr "Dùng chế độ pha trộn Tối Hóa khi sơn" +msgstr "Dùng chế độ pha trộn Làm Đậm Màu đi (Darken) trong khi sơn" msgid "Use Multiply blending mode while painting" -msgstr "Dùng chế độ pha trộn Nhân khi sơn" +msgstr "Dùng chế độ pha trộn nhân gấp lên (Multiply) trong khi sơn" msgid "Color Burn" -msgstr "Cháy Màu" +msgstr "Đốt Cháy Màu" msgid "Use Color Burn blending mode while painting" -msgstr "Dùng chế độ pha trộn Cháy màu khi sơn" +msgstr "Dùng chế độ pha trộn Đốt Cháy Màu (Color Burn) trong khi sơn" msgid "Linear Burn" -msgstr "Cháy Bậc Một" +msgstr "Đốt Cháy Tuyến Tính" msgid "Use Linear Burn blending mode while painting" -msgstr "Dùng chế độ pha trộn Cháy Bậc Một khi sơn" +msgstr "Dùng chế độ pha trộn Đốt Cháy Tuyến Tính (Linear Burn) trong khi sơn" msgid "Use Lighten blending mode while painting" -msgstr "Dùng chế độ pha trộn Sáng Hóa khi sơn" +msgstr "Dùng chế độ pha trộn Làm Nhạt Màu đi (Lighten) trong khi sơn" msgid "Use Screen blending mode while painting" -msgstr "Dùng chế độ pha trộn Che khi sơn" +msgstr "Dùng chế độ pha trộn Màn Hình (Screen) trong khi sơn" msgid "Color Dodge" -msgstr "Né Màu" +msgstr "Tránh Né Màu" msgid "Use Color Dodge blending mode while painting" -msgstr "Dùng chế độ pha trộn Né Màu khi sơn" +msgstr "Dùng chế độ pha trộn Tránh Né Màu (Color Dodge) trong khi sơn" msgid "Use Add blending mode while painting" -msgstr "Dùng chế độ pha trộn Cộng khi sơn" +msgstr "Dùng chế độ pha trộn Thêm (Add) trong khi sơn" msgid "Use Overlay blending mode while painting" -msgstr "Dùng chế độ pha trộn Lớp Che khi sơn" +msgstr "Dùng chế độ pha trộn Lồng Ảnh (Overlay) trong khi sơn" msgid "Use Soft Light blending mode while painting" -msgstr "Dùng chế độ pha trộn Ánh Sáng Mềm khi sơn" +msgstr "Sử dụng chế độ pha trộn Ánh Sáng Mềm Mại (Soft Light) trong khi sơn" msgid "Use Hard Light blending mode while painting" -msgstr "Dùng chế độ pha trộn Ánh Sáng Cứng khi sơn" +msgstr "Dùng chế độ pha trộn Ánh Sáng Đường Đột/Cứng/Mạnh (Hard Light) trong khi sơn" msgid "Vivid Light" @@ -18549,67 +19819,67 @@ msgstr "Ánh Sáng Rực Rỡ" msgid "Use Vivid Light blending mode while painting" -msgstr "Dùng chế độ pha trộn Ánh Sáng Rực Rỡ khi sơn" +msgstr "Sử dụng chế độ pha trộn Ánh Sáng Rực Rỡ (Vivid Light) trong khi sơn" msgid "Use Linear Light blending mode while painting" -msgstr "Dùng chế độ pha trộn Ánh Sáng Bậc Một khi sơn" +msgstr "Sử dụng chế độ pha trộn Ánh Sáng Tiếp Tuyến (Linear Light) trong khi sơn" msgid "Pin Light" -msgstr "Ánh Sáng Tiêu Điểm" +msgstr "Ánh Sáng Hội Tụ" msgid "Use Pin Light blending mode while painting" -msgstr "Dùng chế độ pha trộn Ánh Sáng Tiêu Điểm khi sơn" +msgstr "Sử dụng chế độ pha trộn Ánh Sáng Hội Tụ (Pin Light) trong khi sơn" msgid "Use Difference blending mode while painting" -msgstr "Dùng chế độ pha trộn Sự Khác khi sơn" +msgstr "Dùng chế độ pha trộn Hiệu Số (Difference) trong khi sơn" msgid "Exclusion" -msgstr "Trừ Loại" +msgstr "Loại Trừ" msgid "Use Exclusion blending mode while painting" -msgstr "Dùng chế độ pha trộn Trừ Loại khi sơn" +msgstr "Dùng chế độ pha trộn Loại Trừ (Exclusion) trong khi sơn" msgid "Use Subtract blending mode while painting" -msgstr "Dùng chế độ pha trộn Trừ khi sơn" +msgstr "Dùng chế độ pha trộn Khấu Trừ (Subtract) trong khi sơn" msgid "Use Hue blending mode while painting" -msgstr "Dùng chế độ pha trộn Màu Sắc khi sơn" +msgstr "Dùng chế độ pha trộn Sắc Màu (Hue) trong khi sơn" msgid "Use Saturation blending mode while painting" -msgstr "Dùng chế độ pha trộn Độ Tươi khi sơn" +msgstr "Dùng chế độ pha trộn Độ Bão Hòa (Saturation) trong khi sơn" msgid "Use Color blending mode while painting" -msgstr "Dùng chế độ pha trộn Màu khi sơn" +msgstr "Dùng chế độ pha trộn Màu (Color) trong khi sơn" msgid "Use Value blending mode while painting" -msgstr "Dùng chế độ pha trộn Độ Xám khi sơn" +msgstr "Sử dụng chế độ pha trộn Giá Trị (Value) trong khi sơn" msgid "Erase Alpha" -msgstr "Xóa Độ Đục" +msgstr "Xóa Alpha" msgid "Erase alpha while painting" -msgstr "Xóa độ đục khi sơn" +msgstr "Xóa alpha trong khi sơn" msgid "Add Alpha" -msgstr "Thêm Độ Đục" +msgstr "Thêm Alpha" msgid "Add alpha while painting" -msgstr "Thêm đồ đục khi sơn" +msgstr "Thêm alpha trong khi sơn" msgid "Kernel Radius" @@ -18617,131 +19887,161 @@ msgstr "Bán Kính Hạt Nhân" msgid "Radius of kernel used for soften and sharpen in pixels" -msgstr "Bán kính hạt nhân được dùng cho mịn hóa và bén hóa (điểm ảnh)" +msgstr "Bán kính hạt nhân sử dụng để làm mịn hoặc sắc nét hóa trong số điểm ảnh" msgid "Blur Mode" -msgstr "Chế Độ Mờ Hóa" +msgstr "Chế Độ Nhòe Mờ" msgid "Box" -msgstr "Hộp" +msgstr "Hình Hộp" msgid "Gaussian" msgstr "Gauss" +msgctxt "Brush" +msgid "Deformation" +msgstr "Biến Dạng" + + msgid "Deformation type that is used in the brush" -msgstr "Loại méo hóa được dùng trong bút" +msgstr "Kiểu biến dạng sử dụng cho đầu bút" + + +msgctxt "Brush" +msgid "Bend" +msgstr "Uốn Cong" + + +msgctxt "Brush" +msgid "Expand" +msgstr "Mở rộng" + + +msgctxt "Brush" +msgid "Inflate" +msgstr "Thổi phồng lên" + + +msgctxt "Brush" +msgid "Grab" +msgstr "Nắm" + + +msgctxt "Brush" +msgid "Twist" +msgstr "Xoắn" msgid "Boundary Falloff" -msgstr "Sự Phai Ranh Giới" +msgstr "Suy Giảm Dần của Vùng Ranh Giới" msgid "How the brush falloff is applied across the boundary" -msgstr "Làm sao áp dụng sự phai của bút qua ranh giới" +msgstr "Phương pháp suy giảm dần áp dụng cho toàn vùng ranh giới" msgid "Applies the same deformation in the entire boundary" -msgstr "Áp dụng cùng méo hóa trên toàn bộ ranh giới" +msgstr "Đồng áp dụng cùng sự biến dạng trong toàn thể vùng biên" msgid "Brush Radius" -msgstr "Bán Kính Bút" +msgstr "Bán Kính Đầu Bút" msgid "Applies the deformation in a localized area limited by the brush radius" -msgstr "Áp dụng sự méo hóa trên một khu vực địa phương được hạn chế bởi bán kính của bút" +msgstr "Áp dụng biến dạng trong một khu vực cục bộ, giới hạn bởi bán kính của đầu bút vẽ" msgid "Loop" -msgstr "Lặp Lại" +msgstr "Tuần Hoàn" msgid "Applies the brush falloff in a loop pattern" -msgstr "Áp dụng sự phai của bút bởi một gương mẫu" +msgstr "Áp dụng sự suy giảm dần của đầu bút theo một kiểu mẫu tuần hoàn nhắc lại" msgid "Loop and Invert" -msgstr "Lặp Vọng và Đảo Nghịch" +msgstr "Tuần Hoàn và Đảo Ngược" msgid "Applies the falloff radius in a loop pattern, inverting the displacement direction in each pattern repetition" -msgstr "Áp dụng sự phai của bán kính bằng một gương mẫu lăp vòng, nhưng đảo nghịch hướng dịch từng mẫu lặp lại" +msgstr "Áp dụng bán kính suy giảm dần một cách tuần hoàn, đảo ngược chiều hướng dời hình trong mỗi vòng lặp lại" msgid "Boundary Origin Offset" -msgstr "Dịch Gốc Tọa Độ Ranh Giới" +msgstr "Dịch Chuyển của Tọa Độ Gốc Vùng Ranh Giới" msgid "Offset of the boundary origin in relation to the brush radius" -msgstr "Dịch của góc tọa độ ranh giới tương đối với bán kính bút" +msgstr "Dịch chuyển của tọa độ gốc vùng ranh giới tương đối với bán kính của đầu bút" msgid "Brush's capabilities" -msgstr "Khả Năng Bút" +msgstr "Tiềm năng của đầu bút" msgid "Clone Alpha" -msgstr "Bản Sao Độ Đục" +msgstr "Rập Khuôn Alpha" msgid "Opacity of clone image display" -msgstr "Độ đục khi chiển thị bản sao ảnh" +msgstr "Độ đục khi hiển thị bản rập khuôn của hình ảnh" msgid "Clone Image" -msgstr "Bản Sao Ảnh" +msgstr "Hình Ảnh để Rập Khuôn" msgid "Image for clone tool" -msgstr "Ảnh cho dụng cụ bản sao" +msgstr "Hình ảnh dùng cho công cụ rập khuôn" msgid "Clone Offset" -msgstr "Dịch Bản Sao" +msgstr "Dịch Chuyển của Hình Rập Khuôn" msgid "Soft Body Plasticity" -msgstr "Độ Dẻo Của Thân Mềm" +msgstr "Tính Mềm Dẻo của Thân Mềm" msgid "How much the cloth preserves the original shape, acting as a soft body" -msgstr "Mức vải được giữ nguyên hình dạng ban đầu, vi hành như một thân mềm" +msgstr "Mức duy trì hình thể cũ của vải vóc, hành xử như một đối tượng thân mềm" msgid "Cloth Damping" -msgstr "Tắt Dần Vải" +msgstr "Hạn Định Vải Vóc" msgid "How much the applied forces are propagated through the cloth" -msgstr "Mức các lực tác dụng được truyền dẫn trong vải" +msgstr "Lượng lực áp dụng sẽ lan truyền xuyên qua vải vóc" msgid "Deformation" -msgstr "Sự Méo Hóa" +msgstr "Biến Dạng" msgid "Push" -msgstr "Đẩy" +msgstr "Đẩn" msgid "Pinch Point" -msgstr "Điểm Ngắt" +msgstr "Nhúm Điểm" msgid "Pinch Perpendicular" -msgstr "Ngắt Vuông Góc" +msgstr "Nhúm Vuông Góc" msgid "Inflate" -msgstr "Phình Lên" +msgstr "Bơm Phồng" msgid "Grab" -msgstr "Cầm" +msgstr "Túm Nắm" msgid "Expand" @@ -18749,31 +20049,31 @@ msgstr "Mở Rộng" msgid "Snake Hook" -msgstr "Móc" +msgstr "Móc Hình Rắn" msgid "Force Falloff" -msgstr "Sự Giảm Lực" +msgstr "Suy Giảm Dần của Lực" msgid "Shape used in the brush to apply force to the cloth" -msgstr "Hình dạng được dùng trong bút cho tác dụng trên vải " +msgstr "Hình dạng sử dụng ở đầu bút để áp dụng lực vào vải vóc" msgid "Cloth Mass" -msgstr "Khối Lượng Vải" +msgstr "Khối Lượng của Vải Vóc" msgid "Mass of each simulation particle" -msgstr "Khối lượng của mỗi hạt mô phỏng" +msgstr "Khối lượng của mỗi một hạt mô phỏng" msgid "Simulation Falloff" -msgstr "Sự Giảm Mô Phỏng" +msgstr "Suy Giảm Dần của Mô Phỏng" msgid "Area to apply deformation falloff to the effects of the simulation" -msgstr "Diện tích để áp dụng sự giảm méo hóa cho các hiệu ứng của mô phỏng" +msgstr "Khu vực áp dụng sự suy giảm biến dạng dần dần của hiệu ứng đang mô phỏng" msgid "Simulation Limit" @@ -18781,7 +20081,7 @@ msgstr "Giới Hạn Mô Phỏng" msgid "Factor added relative to the size of the radius to limit the cloth simulation effects" -msgstr "Hệ số được cộng tương đối với kích thước bán kính cho hạn chế hiệu ứng của mô phỏng vải" +msgstr "Hệ số, để thêm vào, tương đối với kích thước bán kính, hòng nhằm giới hạn tác động của hiệu ứng mô phỏng vải vóc" msgid "Simulation Area" @@ -18789,15 +20089,15 @@ msgstr "Khu Vực Mô Phỏng" msgid "Part of the mesh that is going to be simulated when the stroke is active" -msgstr "Bộ Phận của mạng lưới được làm mô phỏng khi nét đang hoạt động" +msgstr "Phần của khung lưới sẽ được mô phỏng khi nét vẽ hoạt động" msgid "Local" -msgstr "Địa Phương" +msgstr "Cục Bộ" msgid "Simulates only a specific area around the brush limited by a fixed radius" -msgstr "Chỉ làm mô phỏng cho một khu vực nhất định xung quanh bút mà bị hạn chế bởi một bán kính hằng số" +msgstr "Duy mô phỏng một khu vực cụ thể chung quanh đầu bút, giới hạn bởi một bán kính cố định, mà thôi" msgid "Global" @@ -18805,43 +20105,43 @@ msgstr "Toàn Cầu" msgid "Simulates the entire mesh" -msgstr "Làm mô phỏng cho toàn bộ mạng lưới" +msgstr "Mô phỏng toàn bộ khung lưới" msgid "Dynamic" -msgstr "Động Lý" +msgstr "Năng Động" msgid "The active simulation area moves with the brush" -msgstr "Khu vực mô phỏng được di chuyển với bút" +msgstr "Khu vực mô phỏng sẽ di chuyển với đầu bút" msgid "Color Type" -msgstr "Loại Màu" +msgstr "Kiểu Màu Sắc" msgid "Use single color or gradient when painting" -msgstr "Dùng một màu hay chuyển sắc khi sơn" +msgstr "Sử dụng duy nhất một màu, hoặc một dốc màu khi sơn" msgid "Paint with a single color" -msgstr "Sơn dùng một màu" +msgstr "Sơn vẽ với một màu duy nhất" msgid "Paint with a gradient" -msgstr "Sơn dùng một chuyển sắc" +msgstr "Sơn vẽ với một dốc màu" msgid "Crease Brush Pinch Factor" -msgstr "Hệ Số Ngắc Nhăn Bút" +msgstr "Hệ Số Nhúm của Đầu Bút Nếp Gấp" msgid "How much the crease brush pinches" -msgstr "Mức bút được ngắc nhăn bút" +msgstr "Lượng nhúm của đầu bút nếp gấp" msgid "Add Color" -msgstr "Cộng Màu" +msgstr "Màu Cộng" msgid "Color of cursor when adding" @@ -18849,7 +20149,7 @@ msgstr "Màu của con trỏ khi cộng" msgid "Subtract Color" -msgstr "Trừ Màu" +msgstr "Màu Khi Khấu Trừ" msgid "Color of cursor when subtracting" @@ -18857,183 +20157,378 @@ msgstr "Màu của con trỏ khi trừ" msgid "Mask Texture Overlay Alpha" -msgstr "Độ Đục Lớp Che Chất Liệu Mặt Nạ" +msgstr "Alpha của Chất Liệu Chắn Lồng" msgid "Editable falloff curve" -msgstr "Đường cong sự giảm có thể biên tập" +msgstr "Đường cong suy giảm có thể biên soạn" + + +msgctxt "Curves" +msgid "Curve Preset" +msgstr "Sắp Đặt Sẵn của Đường Cong" + + +msgctxt "Curves" +msgid "Custom" +msgstr "Tùy Chỉnh" + + +msgctxt "Curves" +msgid "Smooth" +msgstr "Làm/Mịn Màng" + + +msgctxt "Curves" +msgid "Smoother" +msgstr "Mịn Hơn" + + +msgctxt "Curves" +msgid "Sphere" +msgstr "Hình Cầu" + + +msgctxt "Curves" +msgid "Root" +msgstr "Phép Căn" + + +msgctxt "Curves" +msgid "Sharp" +msgstr "Sắc Cạnh/Nhọn/Đột Ngột" + + +msgctxt "Curves" +msgid "Linear" +msgstr "Tuyến Tính" + + +msgctxt "Curves" +msgid "Sharper" +msgstr "Sắc Nhọn Hơn" + + +msgctxt "Curves" +msgid "Inverse Square" +msgstr "Đảo Nghịch Bình Phương" + + +msgctxt "Curves" +msgid "Constant" +msgstr "Hằng Số/Đồng Đều/Bất Biến" msgid "Curves Sculpt Settings" -msgstr "Cài Đặt Khắc Đường Cong" +msgstr "Điêu Khắc Đường Cong: Sắp Đặt" + + +msgctxt "Curves" +msgid "Curves Sculpt Tool" +msgstr "Công Cụ Điêu Khắc Đường Cong" + + +msgctxt "Curves" +msgid "Paint Selection" +msgstr "Lựa Chọn Sơn" + + +msgctxt "Curves" +msgid "Add" +msgstr "Cộng" + + +msgctxt "Curves" +msgid "Delete" +msgstr "Xóa" + + +msgctxt "Curves" +msgid "Density" +msgstr "Mật Độ" + + +msgctxt "Curves" +msgid "Comb" +msgstr "Chải Lược" + + +msgctxt "Curves" +msgid "Snake Hook" +msgstr "Móc Uốn Lượn Hình Rắn (Snake Hook)" + + +msgctxt "Curves" +msgid "Grow / Shrink" +msgstr "Tăng Trưởng / Thu Nhỏ" + + +msgctxt "Curves" +msgid "Pinch" +msgstr "Nhúm" + + +msgctxt "Curves" +msgid "Puff" +msgstr "Thổi Bồng" + + +msgctxt "Curves" +msgid "Slide" +msgstr "Trượt Đẩy" msgid "Dash Ratio" -msgstr "Tỉ Số Gạch Ngang" +msgstr "Tần Số Gạch Ngang" msgid "Ratio of samples in a cycle that the brush is enabled" -msgstr "Tỉ số của mẫu trong một chu trình được bật bút" +msgstr "Tỷ số lấy mẫu trong chu trình mà đầu bút được bật" msgid "Dash Length" -msgstr "Bề Dài Gạch Ngang" +msgstr "Chiều Dài Phần Gián Đoạn" msgid "Length of a dash cycle measured in stroke samples" -msgstr "Bề dài của chu trình a" +msgstr "Chiều dài chu trình đường gạch ngang được đo theo số mẫu vật của nét vẽ" msgid "Deformation Target" -msgstr "Mục Tiêu Méo Hóa" +msgstr "Mục Tiêu Biến Dạng" msgid "How the deformation of the brush will affect the object" -msgstr "Làm sao sự méo hóa của bút được ảnh hưởng vật thể" +msgstr "Sự biến dạng của đầu bút sẽ tác động đến đối tượng thế nào" msgid "Brush deformation displaces the vertices of the mesh" -msgstr "Sự méo hóa của bút được dịch đỉnh của mạng lưới" +msgstr "Sự biến dạng của đầu bút sẽ dời hình các điểm đỉnh của khung lưới" msgid "Cloth Simulation" -msgstr "Mô Phỏng Vải" +msgstr "Mô Phỏng Vải Vóc" msgid "Brush deforms the mesh by deforming the constraints of a cloth simulation" -msgstr "Bút được méo hóa mạng lưới bởi méo hóa ràng buộc của một mô phỏng vải" +msgstr "Đầu bút sẽ biến dạng khung lưới bằng cách bóp méo các ràng buộc mô phỏng vải vóc" msgid "Amount of random elements that are going to be affected by the brush" -msgstr "Số lượng phần tử ngẫu nhiên được ảnh hưởng bởi bút" +msgstr "Số lượng phần tử ngẫu nhiên sẽ được đầu bút tác động" msgid "Max Element Distance" -msgstr "Khoảng Cách Phần Tử Cực Đại" +msgstr "Khoảng Cách Phần Tử Tối Đa" msgid "Maximum distance to search for disconnected loose parts in the mesh" -msgstr "Khoảng các cực đại để tìm kiếm cho bộ phận rời ra trong mạng lưới" +msgstr "Khoảng cách tối đa để lùng tìm các phần rời rạc không kết nối trong khung lưới" + + +msgctxt "Brush" +msgid "Bi-Scale Grab" +msgstr "Túm Nắm Nhị Tỷ Lệ" + + +msgctxt "Brush" +msgid "Tri-Scale Grab" +msgstr "Túm Nắm Tam Tỷ Lệ" + + +msgctxt "Brush" +msgid "Scale" +msgstr "Đổi Tỷ Lệ" msgid "Poisson ratio for elastic deformation. Higher values preserve volume more, but also lead to more bulging" -msgstr "Tỉ số poisson cho méo hóa dẻo. Giá trị càng cao càng giữ ngyuyên thể tích, nhưng làm càng phính ra" +msgstr "Tỷ lệ Poisson trong biến dạng kéo giãn đàn hồi (như dây chun). Giá trị cao sẽ bảo tồn thể tích tốt hơn, song cũng đồng thời làm cho phồng lên nhiều hơn" msgid "Falloff Angle" -msgstr "Góc Sự Giảm" +msgstr "Góc Độ Suy Giảm" msgid "Paint most on faces pointing towards the view according to this angle" -msgstr "Sơn đa số mặt chỉ đến màn tùy góc này" +msgstr "Sơn hầu hết trên các mặt hướng về phía góc nhìn chiểu theo góc độ này" msgid "Falloff Shape" -msgstr "Sự Giảm Hình Dạng" +msgstr "Hình Dạng của Suy Giảm Dần" msgid "Use projected or spherical falloff" -msgstr "Dùng được chiếu hoặc sự giảm hình cầu" +msgstr "Sử dụng sự suy giảm dần dự phóng hoặc trong hình cầu" msgid "Apply brush influence in a Sphere, outwards from the center" -msgstr "Áp dụng sự ãnh hưởng bút trong một Hình Cầu, ra ngoài từ trung tâm" +msgstr "Áp dụng ảnh hưởng của đầu bút trong một Hình Cầu, từ tâm ra ngoài" msgid "Projected" -msgstr "Được Chiếu" +msgstr "Dự Phóng" msgid "Apply brush influence in a 2D circle, projected from the view" -msgstr "Áp dụng sự ảnh hưởng bút trong một vòng tròn 2D, được chiếu từ màn" +msgstr "Áp dụng ảnh hưởng của đầu bút trong một hình tròn 2D, dự phóng từ góc nhìn" msgid "Fill Threshold" -msgstr "Ngưỡng Tô Đầy" +msgstr "Ngưỡng Tô Phủ" msgid "Threshold above which filling is not propagated" -msgstr "Ngưỡng cho tô đầy, hơn giá trị này không truyền tô" +msgstr "Nếu trên ngưỡng này thì việc tô phủ sẽ không có tác động" msgid "Amount of paint that is applied per stroke sample" -msgstr "Mức nước sơn được áp dụng từng mẫu nét" +msgstr "Lượng sơn áp dụng trên bản mẫu của mỗi nét vẽ" + + +msgctxt "GPencil" +msgid "Grease Pencil Sculpt Paint Tool" +msgstr "Công Cụ Sơn Điêu Khắc Bút Chì Dầu" msgid "Smooth stroke points" -msgstr "Mịn hóa điểm nét" +msgstr "Nắn mượt/làm trơn tru các điểm của nét vẽ" msgid "Adjust thickness of strokes" -msgstr "Chỉnh bề dày của nét" +msgstr "Chỉnh độ dày của các nét vẽ" msgid "Adjust color strength of strokes" -msgstr "Chỉnh sức màu của nét" +msgstr "Chỉnh độ đậm của màu trong các nét vẽ" msgid "Introduce jitter/randomness into strokes" -msgstr "Làm nét bị hốt hoảng/ngẫu nhiên" +msgstr "Gây biến động/sự ngẫu nhiên trong các nét vẽ" msgid "Translate the set of points initially within the brush circle" -msgstr "Địch sưu tập điểm ban đầu được khởi động trong vòng tròn bút" +msgstr "Dịch chuyển tập hợp các điểm, khởi đầu trong vòng chu vi của đầu bút" msgid "Move points out of the way, as if combing them" -msgstr "Di chuyển điểm cho tránh đường đi như đang chai lược" +msgstr "Di chuyển các điểm ra khỏi đường đi, giống như chải lược trên chúng vậy" msgid "Rotate points around the midpoint of the brush" -msgstr "Xoay điểm quanh trung điểm của bút" +msgstr "Xoay các điểm quanh trung điểm của đầu bút" msgid "Pull points towards the midpoint of the brush" -msgstr "Kéo điểm đến trung điểm của bút" +msgstr "Kéo các điểm về phía trung điểm của đầu bút" + + +msgid "Paste copies of the strokes stored on the internal clipboard" +msgstr "Dán các bản sao của các nét đã được lưu trữ vào bảng nhớ tạm nội bộ" msgid "Gpencil Settings" -msgstr "Cài Đặt Bút Sáp" +msgstr "Sắp Đặt về Bút Chì Dầu" + + +msgctxt "Brush" +msgid "Grease Pencil Draw Tool" +msgstr "Công Cụ Vẽ Bút Chì Dầu" + + +msgctxt "Brush" +msgid "Draw" +msgstr "Vẽ" msgid "The brush is of type used for drawing strokes" -msgstr "Bút là loại sử dụng cho vẽ nét" +msgstr "Đầu bút là thể loại sử dụng để vẽ các nét" + + +msgctxt "Brush" +msgid "Fill" +msgstr "Tô Phủ Kín" msgid "The brush is of type used for filling areas" -msgstr "Bút là loại sử dụng cho tô đầy khu vực" +msgstr "Đầu bút là thể loại sử dụng để tô kín các khu vực" + + +msgctxt "Brush" +msgid "Erase" +msgstr "Xóa" msgid "The brush is used for erasing strokes" -msgstr "Bút là loại sử dụng cho bôi nét" +msgstr "Đầu bút được sử dụng để tẩy xoá các nét vẽ" + + +msgctxt "Brush" +msgid "Tint" +msgstr "Nhuốm Màu" msgid "The brush is of type used for tinting strokes" -msgstr "Bút là loại sử dụng cho nhiễm màu nét" +msgstr "Đầu bút là thể loại sử dụng để nhuốm màu nét vẽ" msgid "Grease Pencil Vertex Paint Tool" -msgstr "Dụng Cụ Sơn Đỉnh Bút Sáp" +msgstr "Công Cụ Sơn Điểm Đỉnh Bút Chì Dầu" + + +msgid "Paint a color on stroke points" +msgstr "Sơn một màu lên các điểm của nét vẽ" + + +msgid "Smooth out the colors of adjacent stroke points" +msgstr "Làm mịn màu của các điểm nét vẽ kề bên" + + +msgid "Smooth out colors with the average color under the brush" +msgstr "Làm mịn màu với màu trung bình nằm dưới đầu bút" + + +msgid "Smudge colors by grabbing and dragging them" +msgstr "Làm nhòe màu bằng cách túm nắm và kéo rê chúng" + + +msgid "Replace the color of stroke points that already have a color applied" +msgstr "Thay thế màu của các điểm nét vẽ đã được áp dụng màu" msgid "Grease Pencil Weight Paint Tool" -msgstr "Dụng Cụ Sơn Quyền Lượng Bút Sáp" +msgstr "Công Cụ Cân Trọng Bút Chì Dầu" + + +msgid "Paint weight in active vertex group" +msgstr "Trọng lượng sơn trong nhóm điểm đỉnh đang hoạt động" + + +msgid "Blur weight in active vertex group" +msgstr "Làm nhòe mờ trọng lượng trong nhóm điểm đỉnh đang hoạt động" + + +msgid "Average weight in active vertex group" +msgstr "Tính trung bình trọng lượng trong nhóm điểm đỉnh đang hoạt động" + + +msgid "Smear weight in active vertex group" +msgstr "Bôi nhọ trọng lượng trong nhóm điểm đỉnh đang hoạt động" msgid "Gradient Spacing" -msgstr "Khoảng Cách Chuyển Sắc" +msgstr "Khoảng Cách Dốc Màu" msgid "Spacing before brush gradient goes full circle" -msgstr "Khoảng cách trước chuyển sắc bút sẽ lặp lại" +msgstr "Khoảng cách trước khi dốc màu của đầu bút tuần hoàn lại từ đầu" msgid "Gradient Fill Mode" -msgstr "Chế Độ Tô Chuyển Sắc" +msgstr "Chế Độ Tô Dốc Màu" msgid "Gradient Stroke Mode" -msgstr "Chế độ Nét Chuyển Sắc" +msgstr "Chế Độ Nét Dốc Màu" msgid "Repeat" @@ -19041,131 +20536,171 @@ msgstr "Lặp Lại" msgid "Clamp" -msgstr "Kẹp Lại" +msgstr "Hạn Định" msgid "How close the brush falloff starts from the edge of the brush" -msgstr "Cách xa từ ranh giới của bút được bắt đầu sự giảm" +msgstr "Khoảng cách suy giảm dần của đầu bút, kể từ cạnh vào" msgid "Brush Height" -msgstr "Độ Cao Bút" +msgstr "Chiều Cao Đầu Bút" msgid "Affectable height of brush (layer height for layer tool, i.e.)" -msgstr "Độ cao được ảnh hưởng của bút (ví dụ: độ cao lớp cho dụng cụ lớp)" +msgstr "Chiều cao cho phép đầu bút gây tác động (chẳng hạn chiều cao của tầng cho công cụ về tầng lớp)" msgid "Brush Icon Filepath" -msgstr "Đường Dẫn Biểu Tượng Bút" +msgstr "Đường Dẫn cho Tập Tin Biểu Tượng Đầu Bút" msgid "File path to brush icon" -msgstr "Đường dẫn tập tin đến biểu tượng bút" +msgstr "Đường dẫn tập tin đến biểu tượng đầu bút" + + +msgctxt "Brush" +msgid "Image Paint Tool" +msgstr "Công Cụ Sơn Hình Ảnh" + + +msgctxt "Brush" +msgid "Soften" +msgstr "Làm Mềm" + + +msgctxt "Brush" +msgid "Smear" +msgstr "Bôi Nhọ" + + +msgctxt "Brush" +msgid "Clone" +msgstr "Rập Khuôn" + + +msgctxt "Brush" +msgid "Mask" +msgstr "Chắn Lọc" msgid "Invert Pressure for Density" -msgstr "Đảo Nghịch Áp Suất Cho Tỉ Trọng" +msgstr "Đảo Ngược Áp Lực cho Độ Dày Đặc" msgid "Invert the modulation of pressure in density" -msgstr "Đảo nghịch biến dạng của áp suất trong tỉ trọng" +msgstr "Đảo Ngược sự điều chế về áp lực cho độ dày đặc" msgid "Invert Pressure for Flow" -msgstr "Đảo Nghịch Áp Suất Cho Luồng" +msgstr "Đảo Ngược Áp Lực cho Dòng Lưu" msgid "Invert the modulation of pressure in flow" -msgstr "Đảo nghịch biến dạng của áp suất trong luồng" +msgstr "Đảo ngược sự điều chế về áp lực cho dòng lưu" msgid "Invert Pressure for Hardness" -msgstr "Đảo Nghịch Áp Suất Cho Độ Cứng" +msgstr "Đảo Ngược Áp Lực cho Độ Đậm" msgid "Invert the modulation of pressure in hardness" -msgstr "Đảo nghịch biến dạng của áp suất trong độ cứng" +msgstr "Đảo ngược sự điều chế áp lực về độ đậm" msgid "Invert to Scrape or Fill" -msgstr "Đảo nghịch đến Cào hay Làm Đầy" +msgstr "Đảo ngược về Cạo hoặc Phủ Đầy" msgid "Use Scrape or Fill tool when inverting this brush instead of inverting its displacement direction" -msgstr "Dùng dụng cụ Cào hay Làm Đầy khi đảo nghịch bút này thay thế lật nghịch hướng dịch" +msgstr "Dùng công cụ Cạo hoặc Phủ Đầy khi đảo ngược đầu bút này, thay vì đảo ngược chiều hướng dời hình của nó" msgid "Invert Pressure for Wet Mix" -msgstr "Đảo Nghịch Áp Suất Cho Pha Trộn Ướt" +msgstr "Đảo Ngược Áp Lực đối với Hòa Trộn Ướt" msgid "Invert the modulation of pressure in wet mix" -msgstr "Đảo nghịch biến dạng của áp suất trong pha trộn ướt" +msgstr "Đảo ngược sự điều chế áp lực trong hòa trộn ướt" msgid "Invert Pressure for Wet Persistence" -msgstr "Đảo Nghịch Áp Suất Cho Cố Chấp Ướt" +msgstr "Đảo Ngược Áp Lực đối với Duy Trì Độ Ướt" msgid "Invert the modulation of pressure in wet persistence" -msgstr "Đảo nghịch biến dạng của áp suất trong cố chấp ướt" +msgstr "Đảo ngược sự điều chế áp lực trong sự duy trì độ ướt" msgid "Jitter the position of the brush while painting" -msgstr "Hốt hoảng vị trí của bút khi sơn" +msgstr "Biến động vị trí của đầu bút trong khi sơn" msgid "Jitter the position of the brush in pixels while painting" -msgstr "Hốt hoảng vị trí của bút khi sơn (đơn vị điểm ảnh)" +msgstr "Biến động vị trí của đầu bút, trong đơn vị điểm ảnh, trong khi sơn" msgid "Jitter Unit" -msgstr "Đơn Vị Hốt Hoảng" +msgstr "Đơn Vị Biến Động" msgid "Jitter in screen space or relative to brush size" -msgstr "Hốt hoảng trong không gian màn hoặc tương đối với khổ bút" +msgstr "Biến động trong không gian màn hình hoặc tương đối với kích thước đầu bút" msgid "Jittering happens in screen space, in pixels" -msgstr "Hốt hoảng được xảy ra trong không gian màn (đơn vị điểm ảnh)" +msgstr "Biến động xảy ra trong không gian màn hình, trong đơn vị điểm ảnh" msgid "Jittering happens relative to the brush size" -msgstr "Hốt hoảng được xảy ra tương đối với kích thước bút" +msgstr "Biến động xảy ra tương đối với kích thước của đầu bút" msgid "Mask Stencil Dimensions" -msgstr "Kích Thước Khuôn Tô Mặt Nạ" +msgstr "Kích Thước Khuôn In" msgid "Dimensions of mask stencil in viewport" -msgstr "Kích cỡ của khuôn mặt nạ trong màn chiếu" +msgstr "Kích thước của khuôn in trong cổng nhìn" msgid "Mask Stencil Position" -msgstr "Vị trí Khuôn Tô Mạt Nạ " +msgstr "Vị Trí của Khuôn In" msgid "Position of mask stencil in viewport" -msgstr "Vị trí khuôn tô mặt nạ trong màn chiếu" +msgstr "Vị trí của khuôn in trong cổng nhìn" msgid "Mask Texture" -msgstr "Chất Liệu Mặt Nạ" +msgstr "Chất Liệu Chắn Lọc" msgid "Mask Texture Slot" -msgstr "Khe Chất Liệu Mặt Nạ" +msgstr "Khe Chất Liệu Chắn Lọc" + + +msgctxt "Mask" +msgid "Mask Tool" +msgstr "Công Cụ Chắn Lọc" + + +msgctxt "Mask" +msgid "Draw" +msgstr "Vẽ" + + +msgctxt "Mask" +msgid "Smooth" +msgstr "Làm Mịn" msgid "Plane Angle" -msgstr "Góc Mặt Phẳng" +msgstr "Góc Độ Bình Diện" msgid "Angle between the planes of the crease" -msgstr "Góc giữa các mặt phẳng của nhăn" +msgstr "Góc độ giữa các bề diện của nếp gấp" msgid "Normal Radius" @@ -19173,143 +20708,273 @@ msgstr "Bán Kính Pháp Tuyến" msgid "Ratio between the brush radius and the radius that is going to be used to sample the normal" -msgstr "Tỉ số giữa bán kính bút và bán kính sẽ dùng cho lấy mẫu vật pháp tuyến" +msgstr "Tỷ lệ giữa bán kính đầu bút và bán kính sẽ được sử dụng để lấy mẫu pháp tuyến" msgid "Normal Weight" -msgstr "Quyền Lượng Bình Thường" +msgstr "Trọng Lượng Pháp Tuyến" msgid "How much grab will pull vertices out of surface during a grab" -msgstr "Mức độ cầm sẽ kéo đỉnh ra khỏi bề mật khi cầm" +msgstr "Mức túm nắm để kéo các điểm đỉnh ra khỏi bề mặt trong khi túm nắm" msgid "Active paint curve" -msgstr "Đường cong nước sơn hoạt động" +msgstr "Đường cong sơn đang sử dụng" msgid "Plane Offset" -msgstr "Dịch Mặt Phẳng" +msgstr "Dịch Chuyển của Bình Diện" msgid "Adjust plane on which the brush acts towards or away from the object surface" -msgstr "Chỉnh mẳt phẳng thì bút tác động đến hay lui với bề mặt của vật thể" +msgstr "Điều chỉnh bề mặt mà đầu bút tác động tới/lui trên bề mặt của đối tượng" msgid "Plane Trim" -msgstr "Cắt Mặt Phẳng" +msgstr "Xén Bình Diện" msgid "If a vertex is further away from offset plane than this, then it is not affected" -msgstr "Các một đỉnh xa hơn dịch mặt phẳng này, nó không được ảnh hưởng" +msgstr "Nếu một điểm đỉnh nằm xa hơn khoảng cách này với bề mặt cách biệt thì nó sẽ không bị ảnh hưởng" msgid "Rotate/Twist" -msgstr "Xoay/Xoắn" +msgstr "Xoay Chiều/Xoắn Vặn" msgid "Scale/Translate" -msgstr "Phóng To/Dịch" +msgstr "Đổi Tỷ Lệ/Dịch Chuyển" msgid "Squash & Stretch" -msgstr "Nhẹp & Kéo Dài" +msgstr "Nén Ép & Kéo Giãn" msgid "Pose IK Segments" -msgstr "Khúc IK Dạng Đứng" +msgstr "Số Phân Đoạn IK của Tư Thế" msgid "Number of segments of the inverse kinematics chain that will deform the mesh" -msgstr "Số lượng khúc của chuỗi động lý đảo nghịch sẽ méo hóa mạng lưới" +msgstr "Số phân đoạn của dây chuyền động học ngược sẽ biến dạng khung lưới" msgid "Pose Origin Offset" -msgstr "Dịch Gốc Tọa Độ Dạng Đứng" +msgstr "Dịch Chuyển Tọa Độ Gốc của Tư Thế" msgid "Offset of the pose origin in relation to the brush radius" -msgstr "Dịch của góc tọa độ dạng đứng tương đối với bán kính bút" +msgstr "Dịch chuyển của tọa độ gốc tư thế trong tương quan với bán kính của đầu bút" msgid "Rotation Origins" -msgstr "Xoay Gốc Tọa Độ" +msgstr "Tọa Độ Xoay Chiều" msgid "Method to set the rotation origins for the segments of the brush" -msgstr "Phươgn pháp xoay góc " +msgstr "Phương pháp đặt tọa độ gốc xoay chiều cho các phân đoạn của đầu bút" msgid "Topology" -msgstr "Hình Dạng Học" +msgstr "Cấu Trúc Liên Kết" msgid "Sets the rotation origin automatically using the topology and shape of the mesh as a guide" -msgstr "Tự động đặt gốc tọa độ cho xoay bằng hình dạng học và hình dạng của mạng lưới được làm một đường dẫn" +msgstr "Tự động đặt tọa độ gốc xoay chiều bằng cách sử dụng cấu trúc liên kết và hình dạng của khung lưới làm hướng dẫn" msgid "Face Sets" -msgstr "Tập Mặt" +msgstr "Mặt Ấn Định" msgid "Creates a pose segment per face sets, starting from the active face set" -msgstr "Chế tạo một khúc dạng đứng từng tập hợp mặt, bắt đầu từ tập hợp mặt hoạt động" +msgstr "Đối với mỗi Mặt Ấn Định, kiến tạo một phân đoạn tư thế cho nó, bắt đầu từ Mặt Ấn Định đang hoạt động" msgid "Face Sets FK" -msgstr "Tập Mặt FK" +msgstr "FK Mặt Ấn Định" msgid "Simulates an FK deformation using the Face Set under the cursor as control" -msgstr "Mô phỏng cho méo hóa FK dùng Tập Mặt ở dưới con trỏ cho làm điều khiển" +msgstr "Mô phỏng sự biến dạng FK dùng Mặt Ấn Định nằm dưới vị trí con trỏ làm điều khiển" msgid "Smooth Iterations" -msgstr "Lặp Lại Mịn Hóa" +msgstr "Số Lần Lặp Lại Quá Trình làm Mềm Mại" msgid "Smooth iterations applied after calculating the pose factor of each vertex" -msgstr "Lặp lại mịn hóa được áp dụng sau tính hệ số dạng đứng của mỗi đỉnh" +msgstr "Số lần lặp lại được áp dụng sau khi tính toán hệ số tư thế của mỗi điểm đỉnh" msgid "Rake" -msgstr "Càu" +msgstr "Nghiêng Góc" msgid "How much grab will follow cursor rotation" -msgstr "Mức cầm sẽ theo xoay của con trỏ" +msgstr "Lượng túm nắm sẽ đi theo chiều xoay của con trỏ" msgid "Rate" -msgstr "Tốc Độ" +msgstr "Tần Số" msgid "Interval between paints for Airbrush" -msgstr "Thời gian giữa nước sơn cho bút xịt" +msgstr "Khoảng thời gian giữa các vết sơn của Bút Phun Sơn" msgid "Sculpt Plane" -msgstr "Mặt Phẳng Khắc" +msgstr "Bình Diện Điêu Khắc" msgid "Area Plane" -msgstr "Mặt Phẳng Khu Vực" +msgstr "Bình Diện" msgid "View Plane" -msgstr "Mặt Phẳng Màn" +msgstr "Bình Diện của Góc Nhìn" msgid "X Plane" -msgstr "Mặt Phẳng X" +msgstr "Bình Diện X" msgid "Y Plane" -msgstr "Mặt Phẳng Y" +msgstr "Bình Diện Y" msgid "Z Plane" -msgstr "Mặt Phẳng Z" +msgstr "Bình Diện Z" + + +msgctxt "Brush" +msgid "Sculpt Tool" +msgstr "Công Cụ Điêu Khắc" + + +msgctxt "Brush" +msgid "Draw Sharp" +msgstr "Vẽ Sắc Nét" + + +msgctxt "Brush" +msgid "Clay" +msgstr "Đất Sét" + + +msgctxt "Brush" +msgid "Clay Strips" +msgstr "Dải Đất Sét" + + +msgctxt "Brush" +msgid "Clay Thumb" +msgstr "Dí Ngón Cái trên Đất Sét" + + +msgctxt "Brush" +msgid "Layer" +msgstr "Tần Lớp" + + +msgctxt "Brush" +msgid "Blob" +msgstr "Bong Bóng" + + +msgctxt "Brush" +msgid "Crease" +msgstr "Tạo Nếp Nhăn" + + +msgctxt "Brush" +msgid "Flatten" +msgstr "Dát Phẳng" + + +msgctxt "Brush" +msgid "Scrape" +msgstr "Cạo" + + +msgctxt "Brush" +msgid "Multi-plane Scrape" +msgstr "Cạo Đa Mặt Phẳng" + + +msgctxt "Brush" +msgid "Pinch" +msgstr "Nhúm" + + +msgctxt "Brush" +msgid "Elastic Deform" +msgstr "Biến Dạng Đàn Hồi" + + +msgctxt "Brush" +msgid "Snake Hook" +msgstr "Móc Uốn Lượn Hình Rắn" + + +msgctxt "Brush" +msgid "Thumb" +msgstr "Dí Ngón Cái trên Đất Sét" + + +msgctxt "Brush" +msgid "Pose" +msgstr "Tư Thế" + + +msgctxt "Brush" +msgid "Nudge" +msgstr "Nhích" + + +msgctxt "Brush" +msgid "Rotate" +msgstr "Xoay Chiều" + + +msgctxt "Brush" +msgid "Slide Relax" +msgstr "Trượt Đẩy Nới Lỏng" + + +msgctxt "Brush" +msgid "Boundary" +msgstr "Ranh Giới" + + +msgctxt "Brush" +msgid "Cloth" +msgstr "Vải Vóc" + + +msgctxt "Brush" +msgid "Simplify" +msgstr "Đơn Giản Hoá" + + +msgctxt "Brush" +msgid "Draw Face Sets" +msgstr "Vẽ Mặt Ấn Định" + + +msgctxt "Brush" +msgid "Multires Displacement Eraser" +msgstr "Công Cụ Xóa Dịch Hình Đa Phân Giải" + + +msgctxt "Brush" +msgid "Multires Displacement Smear" +msgstr "Công Cụ Bôi Nhọ Dịch Hình Đa Phân Giải" + + +msgctxt "Brush" +msgid "Paint" +msgstr "Sơn" msgid "Secondary Color" @@ -19317,23 +20982,23 @@ msgstr "Màu Phụ" msgid "Threshold below which, no sharpening is done" -msgstr "Ngưỡng bén hóa, dưới giá trị này không bén hóa" +msgstr "Không xử lý tăng độ sắc nét với những giá trị dưới giới hạn này" msgid "Show Cursor Preview" -msgstr "Hiện Dự Khán Con Trỏ" +msgstr "Hiển Thị Duyệt Con Trỏ" msgid "Preview the scrape planes in the cursor during the stroke" -msgstr "Dự khán của mặt phẳng cào trong con trỏ khi đang làm nét" +msgstr "Xem trước các bề diện cạo trong con trỏ trong khi đang thi hành nét vẽ" msgid "Radius of the brush in pixels" -msgstr "Bán kính của bút (đơn vị điểm ảnh)" +msgstr "Bán kính của đầu bút trong số điểm ảnh" msgid "Pinch" -msgstr "Ngắc" +msgstr "Nhúm" msgid "Laplacian" @@ -19341,71 +21006,71 @@ msgstr "Laplace" msgid "Smooths the surface and the volume" -msgstr "Mịn hóa bề mặt và thể tích" +msgstr "Làm mịn bề mặt và thể tích" msgid "Smooths the surface of the mesh, preserving the volume" -msgstr "Mịn hóa bề mặt của mạng lưới, giữ nguyên thể tích" +msgstr "Làm mịn bề mặt của khung lưới, đồng thời bảo tồn thể tích" msgid "Smooth Stroke Factor" -msgstr "Hệ Số Mịn Hóa Nét" +msgstr "Hệ Số Nắn Mượt Nét Vẽ" msgid "Higher values give a smoother stroke" -msgstr "Hệ số càng cao mịm hóa nét càng nhiều" +msgstr "Hệ số càng cao thì nét vẽ càng mượt" msgid "Smooth Stroke Radius" -msgstr "Bạn Kính Mịn Hóa" +msgstr "Bán Kính Nắn Mượt" msgid "Minimum distance from last point before stroke continues" -msgstr "Khoảng chác tối thiểu trước được bắt đầu tiếp nét" +msgstr "Khoảng cách tối thiểu từ điểm cuối trước đó đến điểm nét vẽ tiếp tục" msgid "Radius Falloff" -msgstr "Sự Giảm Bán Kính" +msgstr "Bán Kính Suy Giảm Dần" msgid "Applies the brush falloff in the tip of the brush" -msgstr "Áp dụng sự phai của bút trong đầu của bút" +msgstr "Áp Dụng suy giảm dần của ở đầu của bút" msgid "Elastic" -msgstr "Dẻo Giãn" +msgstr "Đàn Hồi" msgid "Modifies the entire mesh using elastic deform" -msgstr "Sửa đổi toàn bộ mạng lưới bằng méo hóa dẻo" +msgstr "Điều chỉnh toàn bộ khung lưới dùng sự biến dạng co kéo như cao-su" msgid "Spacing between brush daubs as a percentage of brush diameter" -msgstr "Cách giữa chấm của bút (% của đường kính bút)" +msgstr "Dùng khoảng cách trống giữa các chấm làm phần trăm của đường kính đầu bút" msgid "Stencil Dimensions" -msgstr "Kích Cỡ Khuôn Tô" +msgstr "Kích Thước Khuôn In" msgid "Dimensions of stencil in viewport" -msgstr "Kích cỡ khuôn tô trong màn chiếu" +msgstr "Kích thước khuôn in trong cổng nhìn" msgid "Stencil Position" -msgstr "Vị Trí Khuôn Tô" +msgstr "Vị Trí của Khuôn In" msgid "Position of stencil in viewport" -msgstr "Vị trí của khuôn tô trong màn chiếu" +msgstr "Vị trí của khuôn in trong cổng nhìn" msgid "How powerful the effect of the brush is when applied" -msgstr "Sức của hiệu ứng bút khi được áp dụng" +msgstr "Mức công hiệu của đầu bút khi được áp dụng" msgid "Stroke Method" -msgstr "Phương Pháp Nét" +msgstr "Phương Pháp Tạo Nét Vẽ" msgid "Dots" @@ -19413,7 +21078,7 @@ msgstr "Dấu Chấm" msgid "Apply paint on each mouse move step" -msgstr "Dán nước sơn mỗi bước của chuột" +msgstr "Tô sơn trên mỗi bước di chuyển của chuột" msgid "Drag Dot" @@ -19421,63 +21086,63 @@ msgstr "Kéo Dấu Chấm" msgid "Allows a single dot to be carefully positioned" -msgstr "Cho chỉnh cẩn thận vị trí của một dấu chấm" +msgstr "Cho phép cẩn thận chỉnh vị trí của mỗi dấu chấm" msgid "Limit brush application to the distance specified by spacing" -msgstr "Hạn chế ứng dụng bút ở trong khoảng cách được xác định bằng khoảng cáchẻ" +msgstr "Sử dụng Khoảng Cách Để Trống đã định để hạn chế tác động của đầu bút" msgid "Keep applying paint effect while holding mouse (spray)" -msgstr "Xức nước sơn liên tiếp khi bấm chuột (xịt)" +msgstr "Liên tiếp áp dụng ảnh hưởng tô sơn trong khi chuột được bấm giữ (phun)" msgid "Anchored" -msgstr "Bị Dính" +msgstr "Neo Chốt" msgid "Keep the brush anchored to the initial location" -msgstr "Giữ bút dính tại vị trí khửi động" +msgstr "Giữ cho đầu bút neo chốt vào vị trí đầu tiên" msgid "Draw a line with dabs separated according to spacing" -msgstr "Vẽ một đường có chấm nước sơn cách nhau tùy khoảng cách" +msgstr "Vẽ một nét dùng các chấm sơn cách nhau bằng phân khoảng đã định" msgid "Define the stroke curve with a bezier curve (dabs are separated according to spacing)" -msgstr "Chỉ định nét bằng một cong Bezier (chấm nước sơn cách nhau tùy khoảng cách)" +msgstr "Định nghĩa đường cong nét vẽ dùng đường cong bezier (các chấm được phân cách theo phân khoảng đã định)" msgid "Per Vertex Displacement" -msgstr "Dịch Từng Đỉnh" +msgstr "Mức Dời Hình của Mỗi Điểm Đỉnh" msgid "How much the position of each individual vertex influences the final result" -msgstr "Mức vị trí của mỗi đỉnh được ảnh hưởng kết qủa kết qủa cuối" +msgstr "Lượng ảnh hưởng của vị trí mỗi cá nhân điểm đỉnh tác động đến kết quả" msgid "Number of smoothing iterations per brush step" -msgstr "Số lần lặp lại mịn hóa từng bước bút" +msgstr "Số lần lặp lại quá trình làm mịn cho mỗi bước của đầu bút" msgid "Shape Preservation" -msgstr "Giữ Nguyên Hình Dạng" +msgstr "Bảo Tồn Hình Dạng" msgid "How much of the original shape is preserved when smoothing" -msgstr "Bao nhiêu của hình dạng ban đầu được giữ nguyên khi đang mịn hóa" +msgstr "Mức bảo tồn hình dạng nguyên thủy khi làm mịn" msgid "Texture Overlay Alpha" -msgstr "Độ Đục Lớp Che Chất Liệu" +msgstr "Lồng Chất Liệu dùng Alpha" msgid "Texture Sample Bias" -msgstr "Thành Kiến Mẫu Vật Chất Liệu" +msgstr "Thiên Lệnh của Mẫu Chất Liệu" msgid "Value added to texture samples" -msgstr "Giá trị được cộng với mẫu vật chất liệu" +msgstr "Giá trị thêm vào các mẫu chất liệu" msgid "Texture Slot" @@ -19485,143 +21150,187 @@ msgstr "Khe Chất Liệu" msgid "Tilt Strength" -msgstr "Sức Nghiêng" +msgstr "Cường Độ Xoay Nghiêng" msgid "How much the tilt of the pen will affect the brush" -msgstr "Mức nghiêng của bút được ảnh hưởng nét của bút" +msgstr "Lượng xoay nghiêng của bút điện sẽ tác động đầu bút" msgid "Tip Roundness" -msgstr "Độ Tròn Thượng Đỉnh" +msgstr "Độ Tròn của Đầu Ngòi" msgid "Roundness of the brush tip" -msgstr "Độ tròn của thượng đỉnh bút" +msgstr "Độ tròn đầu ngòi của bút" msgid "Tip Scale X" -msgstr "Phóng To Chót X" +msgstr "Đổi Tỷ Lệ X của Đầu Bút" msgid "Scale of the brush tip in the X axis" -msgstr "Phóng to của chót bút cho trục X" +msgstr "Đổi tỷ lệ đầu bút trên trục X" msgid "Topology Rake" -msgstr "Cây Cào Hình Dạng Học" +msgstr "Nghiêng Góc Cấu Trúc Liên Kết" msgid "Automatically align edges to the brush direction to generate cleaner topology and define sharp features. Best used on low-poly meshes as it has a performance impact" -msgstr "Tự động sắp xếp các cạnh đến hướng của bút để chế tạo hình dạng học sạch sẽ hơn và chỉ định đặc trưng bén. Tốt nhất cho mạng lưới ít đa giác vì sẽ giảm hiệu suất" +msgstr "Tự động căn chỉnh các cạnh theo hướng của đầu bút để sinh tạo cấu trúc liên kết sạch sẽ hơn và làm các hình thể sắc nét. Tốt nhất là sử dụng trên các khung lưới có ít đa giác vì nó tác động đến hiệu suất hoạt động của máy" msgid "Unprojected Radius" -msgstr "Bán Kinh Không Chiếu" +msgstr "Bán Kính Chưa Phóng Chiếu" msgid "Radius of brush in Blender units" -msgstr "Bán kính của bút (đơn vị Blender)" +msgstr "Bán kính đầu bút trong đơn vị của Blender" msgid "Accumulate" -msgstr "Tích Trữ" +msgstr "Chồng Chất/Tích Tụ" msgid "Accumulate stroke daubs on top of each other" -msgstr "Tích trữ chấm nét lên trên nhau" +msgstr "Chồng chất các vết của nét vẽ lên nhau" msgid "Adaptive Spacing" -msgstr "Khoàng Cách Ứng Phó" +msgstr "Phân Khoảng Tùy Ứng" msgid "Space daubs according to surface orientation instead of screen space" -msgstr "Chấm sơn cách nhau tùy định hướng của bề mặt thay thế không gian màn" +msgstr "Phân khoảng các vết bút tùy theo định hướng của bề mặt thay vì không gian màn hình" msgid "Affect Alpha" -msgstr "Ảnh Hưởng Độ Đục" +msgstr "Tác Động Alpha" msgid "When this is disabled, lock alpha while painting" -msgstr "Khi này bị tắt, khóa lại độ đục khi sơn" +msgstr "Khi cái này bị tắt đi thì khóa alpha lại trong khi sơn" msgid "Mesh Boundary Auto-Masking" -msgstr "Tự Động Đăt Mặt Nạ Ranh Giới Mạng Lưới" +msgstr "Tự Động Chắn Lọc dùng Ranh Giới của Khung Lưới" msgid "Do not affect non manifold boundary edges" -msgstr "Không ảnh hưởng cạnh của ranh giới vô đa tập" +msgstr "Không tác động đến các cạnh ranh giới phi đa tạp" msgid "Face Sets Boundary Automasking" -msgstr "Tự Động Đặt Mặt Nạ Cho Ranh Giới Tập Hợp Mặt" +msgstr "Tự Động Chắn Lọc Ranh Giới Mặt Ấn Định" msgid "Do not affect vertices that belong to a Face Set boundary" -msgstr "Không ảnh hưởng đỉnh của một ranh giới Tập Hợp Mặt" +msgstr "Không tác động đến các điểm đỉnh trực thuộc ranh giới của một Mặt Ấn Định" msgid "Cavity Mask" -msgstr "Mặt Nạ Lỗ" +msgstr "Màn Chắn Lọc Khe Hốc" + + +msgid "Do not affect vertices on peaks, based on the surface curvature" +msgstr "Không tác động đến các điểm đỉnh trên chóp, dựa trên độ cong bề mặt" + + +msgid "Inverted Cavity Mask" +msgstr "Chắn Lọc Khe Hốc Đảo Ngược" + + +msgid "Do not affect vertices within crevices, based on the surface curvature" +msgstr "Không tác động đến các điểm đỉnh trên các chóp đỉnh, dựa trên độ cong bề mặt" + + +msgid "Custom Cavity Curve" +msgstr "Đường Cong Khe Hốc Tùy Chỉnh" + + +msgid "Use custom curve" +msgstr "Sử dụng đường cong tùy chỉnh" msgid "Affect only vertices that share Face Sets with the active vertex" -msgstr "Chỉ ảnh hưởng các đỉnh được chia sẻ Tập Hợp Mặt với đỉnh hoạt động" +msgstr "Duy tác động các điểm đỉnh dùng chung các Mặt Ấn Định với điểm đỉnh đang hoạt động mà thôi" + + +msgid "Area Normal" +msgstr "Pháp Tuyến Khu Vực" + + +msgid "Affect only vertices with a similar normal to where the stroke starts" +msgstr "Duy tác động các điểm đỉnh có pháp tuyến tương tự với nơi bắt đầu nét vẽ" msgid "Affect only vertices connected to the active vertex under the brush" -msgstr "Chỉ ảnh hưởng các đỉnh được kết nối với đỉnh hoạt động ở dưới bút" +msgstr "Duy tác động các điểm đỉnh kết nối với điểm đỉnh đang hoạt động nằm dưới đầu bút" + + +msgid "View Normal" +msgstr "Pháp Tuyến của Góc Nhìn" + + +msgid "Affect only vertices with a normal that faces the viewer" +msgstr "Duy tác động các điểm đỉnh có pháp tuyến đối mặt với người xem" msgid "Occlusion" msgstr "Che Khuất" +msgid "Only affect vertices that are not occluded by other faces. (Slower performance)" +msgstr "Duy tác động các điểm đỉnh không bị che khuất bởi các mặt khác. (Hiệu suất hoạt động chậm hơn)" + + msgid "Collide with objects during the simulation" -msgstr "Va chạm với vật thể trong mô phỏng" +msgstr "Va đập với các đối tượng trong quá trình mô phỏng" msgid "Pin Simulation Boundary" -msgstr "Ghim Ranh Giới Mô Phỏng" +msgstr "Ghim Ranh Giới Mô Phỏng Xuống" msgid "Lock the position of the vertices in the simulation falloff area to avoid artifacts and create a softer transition with unaffected areas" -msgstr "Khóa vị trí của các đỉnh trong khu vực sự giảm của mô phỏng để tránh lỗi lầm và chế tạo một tiến triển mềm hơn với những khu vực không bị ảnh hưởng" +msgstr "Khóa vị trí của các điểm đỉnh trong khu vực suy giảm dần của mô phỏng, nhằm tránh né các giả tượng và kiến tạo sự chuyển đổi êm ái với các khu vực không bị ảnh hưởng" msgid "Vector Displacement" -msgstr "Dịch Vectơ" +msgstr "Dời Hình Véctơ" + + +msgid "Handles each pixel color as individual vector for displacement. Works only with area plane mapping" +msgstr "Xử lý từng màu điểm ảnh như đơn vectơ riêng lẻ cho quá trình dời hình. Chỉ hoạt động với ánh xạ bình diện" msgid "Connected Only" -msgstr "Chỉ Được Kết Nối" +msgstr "Duy Kết Nối" msgid "Affect only topologically connected elements" -msgstr "Chỉ ảnh hưởng phần tử được kết nối dạng hình lý học" +msgstr "Chỉ tác động các phần tử cấu trúc liên kết đã kết nối mà thôi" msgid "Use Cursor Overlay" -msgstr "Dùng Lớp Che Con Trỏ" +msgstr "Vẽ Lồng Hình Con Trỏ" msgid "Show cursor in viewport" -msgstr "Hiện con trỏ trong màn chiếu" +msgstr "Hiển thị con trỏ trong cổng nhìn" msgid "Override Overlay" -msgstr "Vượt Quyền Lớp Che" +msgstr "Vượt Quyền Vẽ Lồng" msgid "Don't show overlay during a stroke" -msgstr "Không hiện lớp che khi vẽ một nét" +msgstr "Không hiển thị lớp lồng trong khi đang vẽ nét" msgid "Define the stroke curve with a bezier curve. Dabs are separated according to spacing" -msgstr "Chỉ định cong nét bằng một cong Bezier. Chấm được cách nhau tùy khoảng cách" +msgstr "Định nghĩa đường cong nét vẽ bằng một đường cong Bezier. Các chấm được phân cách bằng phân khoảng đã định" msgid "Custom Icon" @@ -19629,31 +21338,31 @@ msgstr "Biểu Tượng Tùy Chọn" msgid "Set the brush icon from an image file" -msgstr "Đặt biểu tượng bút bằng từ một tập tin ảnh" +msgstr "Đặt biểu tượng cho đầu bút bằng một tập tin hình ảnh" msgid "Use Pressure for Density" -msgstr "Dùng Sức Áp Suất Cho Tỉ Trọng" +msgstr "Dùng Áp Lực Làm Độ Dày Đặc" msgid "Use pressure to modulate density" -msgstr "Dùng áp suất để biến dạng tỉ trọng" +msgstr "Dùng áp lực để điều chế tỷ trọng" msgid "Edge-to-Edge" -msgstr "Cạnh đến Cạnh" +msgstr "Cạnh-tới-Cạnh" msgid "Drag anchor brush from edge-to-edge" -msgstr "Kéo bút neo từ cạnh đến cạnh" +msgstr "Kéo đầu bút neo chốt từ cạnh đến cạnh" msgid "Use Pressure for Flow" -msgstr "Dùng Áp Suất Cho Luồng" +msgstr "Sử Dụng Áp Lực đối với Dòng Chảy" msgid "Use pressure to modulate flow" -msgstr "Dùng áp suất để biến dạng luồng" +msgstr "Sử dụng áp lực để điều chế dòng chảy" msgid "Use Front-Face" @@ -19661,47 +21370,47 @@ msgstr "Dùng Mặt Trước" msgid "Brush only affects vertices that face the viewer" -msgstr "Bút chỉ được ảnh hưởng những đỉnh chỉ hướng đến màn chiếu" +msgstr "Đầu bút chỉ tác động các điểm đỉnh đối mặt với người quan sát" msgid "Use Front-Face Falloff" -msgstr "Dùng Sự Giảm Mặt Trước" +msgstr "Dùng Sự Suy Giảm Mặt Trước" msgid "Blend brush influence by how much they face the front" -msgstr "Pha trộn sự ảnh hưởng của bút tùy góc mặt chỉ đến phía trước" +msgstr "Hòa trộn tác động của đầu bút bởi mức đối mặt với đằng trước của chúng là bao nhiêu" msgid "Grab Active Vertex" -msgstr "Bắt Đỉnh Hoạt Động" +msgstr "Túm Nắm Điểm Đỉnh đang Hoạt Động" msgid "Apply the maximum grab strength to the active vertex instead of the cursor location" -msgstr "Áp dụng sức bắt cực đại với đỉnh hoạt động thay thế con trỏ" +msgstr "Áp dụng sức túm nắm tối đa vào điểm đỉnh đang hoạt động, thay vì vị trí của con trỏ" msgid "Grab Silhouette" -msgstr "Bắt Hình Bóng" +msgstr "Túm Nắm Hình Bóng" msgid "Grabs trying to automask the silhouette of the object" -msgstr "Thử bắt bóng hình dạng vật thể bằng mặt nạ tự động" +msgstr "Túm nắm lấy và cố gắng tự động chắn lọc đường viền hình bóng của đối tượng" msgid "Use Pressure for Hardness" -msgstr "Dùng Áp Suật Cho Độ Cứng" +msgstr "Sử Dụng Áp Lực cho Độ Đậm Nét" msgid "Use pressure to modulate hardness" -msgstr "Dùng áp suất để biến dạng độ cứng" +msgstr "Sử Dụng Áp Lực để điều chế độ đậm nét" msgid "Inverse Smooth Pressure" -msgstr "Áp Suất mịn Hóa Đảo Nghịch" +msgstr "Đảo Nghịch Áp Lực Làm Mịn" msgid "Lighter pressure causes more smoothing to be applied" -msgstr "Áp suất càng nhẹ làm mịn hóa càng nhiều" +msgstr "Áp lực càng nhẹ càng gây làm mịn nhiều" msgid "Radius Unit" @@ -19709,315 +21418,323 @@ msgstr "Đơn Vị Bán Kính" msgid "Measure brush size relative to the view or the scene" -msgstr "o kích cỡ bút tương đối với màn hay cảnh" +msgstr "Đo kích thước đầu bút tương đối với góc nhìn hoặc cảnh" msgid "Measure brush size relative to the view" -msgstr "Đo kích cỡ bút tương đối với màn" +msgstr "Đo kích thước đầu bút tương đối với Góc Nhìn" msgid "Measure brush size relative to the scene" -msgstr "Đo kích cỡ bút tương đối với cảnh" +msgstr "Đo kích thước đầu bút tương đối với Cảnh" msgid "Dynamic Mode" -msgstr "Chế Độ Động Lý" +msgstr "Chế Độ Năng Động" msgid "The angle between the planes changes during the stroke to fit the surface under the cursor" -msgstr "Góc giữa hai mặt phẳng sẽ đổi khi làm nét cho nó vừa bề mặt ở dưới con trỏ" +msgstr "Góc độ giữa các bề diện thay đổi trong khi nét vẽ đang được thi hành để khít với bề mặt nằm dưới con trỏ" msgid "Plane Offset Pressure" -msgstr "Áp Suất Dịch Mặt Phẳng" +msgstr "Dịch Chuyển Bình Diện Bằng Áp Lực" msgid "Enable tablet pressure sensitivity for offset" -msgstr "Bật nhảy cảm áp suất của bảng vẽ cho dịch" +msgstr "Cho bật khả năng cảm nhận áp lực của bàn vẽ đối với dịch chuyển" msgid "Original Normal" -msgstr "Pháp Tuyến Ban Đầu" +msgstr "Pháp Tuyến Gốc" msgid "When locked keep using normal of surface where stroke was initiated" -msgstr "Khi khóa lại giữ nguyên pháp tuyến của bề mặt tại chỗ nét được khởi động" +msgstr "Khi đã khóa lại thì tiếp tục sử dụng pháp tuyến của bề mặt, nơi nét vẽ vốn được khởi thủy" msgid "Original Plane" -msgstr "Góc Tọa Độ Mặt Phẳng" +msgstr "Bình Diện Gốc" msgid "When locked keep using the plane origin of surface where stroke was initiated" -msgstr "Khi bị khóa lại vẫn dùng góc tọa độ mặt phẳng của bề mặt tại chỗ nét được khởi động" +msgstr "Khi đã bị khóa lại, tiếp tục sử dụng bề diện gốc của bề mặt, nơi các nét vẽ được khởi thủy" msgid "Smooths the edges of the strokes" -msgstr "Mịn hóa ranh của các nét" +msgstr "Làm mịn các cạnh và các nét vẽ" msgid "Use Paint" -msgstr "Dùng Sơn" +msgstr "Sử Dụng Sơn" msgid "Use this brush in grease pencil drawing mode" -msgstr "Sử dụng bút này trong chế độ vẽ bút sáp" +msgstr "Dùng bút này trong chế độ vẽ Bút Chì Dầu" msgid "Use this brush in texture paint mode" -msgstr "Sử dụng bút này trong chế độ sơn chất liệu" +msgstr "Dùng đầu bút này trong chế độ sơn chất liệu" msgid "Use Sculpt" -msgstr "Sử Dụng Khắc" +msgstr "Điêu Khắc" msgid "Use this brush in sculpt mode" -msgstr "Sử dụng bút này trong chế độ khắc" +msgstr "Dùng đầu bút này trong chế độ điêu khắc" + + +msgid "Use this brush in sculpt curves mode" +msgstr "Sử dụng đầu bút này trong chế độ điêu khắc đường cong" msgid "Use UV Sculpt" -msgstr "Dùng Khắc UV" +msgstr "Sử Dụng Điêu Khắc UV" msgid "Use this brush in UV sculpt mode" -msgstr "Dùng bút này trong chế độ khắc UV" +msgstr "Sử dụng đầu bút này trong chế độ điêu khắc UV" msgid "Use Vertex" -msgstr "Sử Dụng Đỉnh" +msgstr "Điểm Đỉnh" msgid "Use this brush in vertex paint mode" -msgstr "Sử dụng bút lông này trong chế độ sơn đỉnh" +msgstr "Dùng đầu bút này trong chế độ sơn điểm đỉnh" msgid "Use Weight" -msgstr "Sử Dụng Quyền Lượng" +msgstr "Trọng Lượng" msgid "Use this brush in weight paint mode" -msgstr "Sử dụng bút này trong chế độ sơn quyền lượng" +msgstr "Dùng đầu bút này trong chế độ sơn trọng lượng" msgid "Sculpt on a persistent layer of the mesh" -msgstr "Khắc trên một lớp cố chấp của mạng lưới" +msgstr "Điêu khắc trên một tầng ổn định của khung lưới" msgid "Use Plane Trim" -msgstr "Sử Dụng Cắt Mặt Phẳng" +msgstr "Dùng Xén Bình Diện" + + +msgid "Limit the distance from the offset plane that a vertex can be affected" +msgstr "Giới hạn khoảng cách từ bề diện dịch chuyển mà một điểm đỉnh có thể bị ảnh hưởng" msgid "Keep Anchor Point" -msgstr "Giữ Điểm Neo" +msgstr "Duy Trì Điểm Neo Chốt" msgid "Keep the position of the last segment in the IK chain fixed" -msgstr "Giữ nguyên vị trí của khúc cuối cùng trong chuỗi IK" +msgstr "Giữ cho vị trí của phân đoạn cuối trong chuỗi IK cố định" msgid "Lock Rotation When Scaling" -msgstr "Khóa Xoay Khi Phóng To" +msgstr "Khóa Xoay Chiều khi Đổi Tỷ Lệ" msgid "Do not rotate the segment when using the scale deform mode" -msgstr "Không cho xoay khúc khi đang dùng chế độ méo hóa phóng to" +msgstr "Không được xoay chiều phân đoạn khi sử dụng chế độ biến dạng tỷ lệ" msgid "Area Radius Pressure" -msgstr "Áp Suất Bán Kính Diện Tích" +msgstr "Áp Lực tác động Bán Kính Khu Vực" msgid "Enable tablet pressure sensitivity for area radius" -msgstr "Bật nhảy cảm áp suất cho bán kính diện tích" +msgstr "Cho phép sự mẫn cảm với áp lực của bàn vẽ gây tác động đến bán kính khu vực" msgid "Jitter Pressure" -msgstr "Áp Suất Hốt Hoảng" +msgstr "Áp Lực Biến Động" msgid "Enable tablet pressure sensitivity for jitter" -msgstr "Bật nhảy cảm áp suất của bảng vẽ cho hốt hoảng" +msgstr "Cho phép cảm ứng áp lực của bàn vẽ để gây biến động" msgid "Mask Pressure Mode" -msgstr "Chế Độ Áp Suất Mặt Nạ" +msgstr "Chế Độ về Áp Lực Chắn Lọc" msgid "Pen pressure makes texture influence smaller" -msgstr "Áp suất bút làm giảm sự ảnh hướng của chất liệu" +msgstr "Áp lực của bút làm giảm ảnh hưởng của chất liệu" msgid "Ramp" -msgstr "Dốc" +msgstr "Nâng/Dốc Màu" msgid "Cutoff" -msgstr "Giới Hạn" +msgstr "Ngắt/Cắt Lửng" msgid "Size Pressure" -msgstr "Áp Suất Kích Cỡ" +msgstr "Áp Lực Đổi Kích Thước" msgid "Enable tablet pressure sensitivity for size" -msgstr "Bật nhảy cảm áp suất của bảng vẽ cho kích cỡ" +msgstr "Cho phép độ nhảy cảm áp lực của bàn vẽ thay đổi kích thước" msgid "Spacing Pressure" -msgstr "Áp Suất Khoảng Cách" +msgstr "Áp Lực Phân Khoảng" msgid "Enable tablet pressure sensitivity for spacing" -msgstr "Bật nhảy cảm áp suất của bảng vẽ cho khoảng cách" +msgstr "Cho phép độ nhảy cảm áp lực của bàn vẽ thay đổi phân khoảng" msgid "Strength Pressure" -msgstr "Áp Suất Sức" +msgstr "Áp Lực làm Cường Độ/Sức Mạnh" msgid "Enable tablet pressure sensitivity for strength" -msgstr "Bật dùng độ nhảy cảm áp suất của bảng vẽ cho sức" +msgstr "Cho phép sử dụng độ nhảy cảm với áp lực của bàn vẽ làm sức mạnh" msgid "Use Texture Overlay" -msgstr "Dùng Lớp Che Chất Liệu" +msgstr "Vẽ Lồng Chất Liệu" msgid "Show texture in viewport" -msgstr "Hiện chất liệu trong màn chiếu" +msgstr "Hiển thị chất liệu trong cổng nhìn" msgid "Restore Mesh" -msgstr "Hoàn Lại Lưới" +msgstr "Khôi Phục Khung Lưới" msgid "Allow a single dot to be carefully positioned" -msgstr "Cho chỉnh sửa cẩn thận vị trí của một điểm" +msgstr "Cho phép chỉnh sửa cẩn thận vị trí của một điểm" msgid "Spacing Distance" -msgstr "Khoảng Cách Trống" +msgstr "Kích Thước Phân Khoảng" msgid "Calculate the brush spacing using view or scene distance" -msgstr "Tính cách trống cho bút bằng màn chiếu hay quãng cảnh" +msgstr "Tính toán phân khoảng của đầu bút dùng khoảng cách của góc nhìn hoặc của cảnh" msgid "Calculate brush spacing relative to the view" -msgstr "Tính cách trống bút tương đối với màn" +msgstr "Tính toán phân khoảng của đầu bút tương đối với cảnh" msgid "Calculate brush spacing relative to the scene using the stroke location" -msgstr "Tính cách trống bút tương đối với cảnh bằng vị trí nét" +msgstr "Tính toán phân khoảng của đầu bút tương đối với cảnh dùng vị trí của nét vẽ" msgid "Smooth Stroke" -msgstr "Mịn Hóa Nét" +msgstr "Nắn Mượt Nét Vẽ" msgid "Brush lags behind mouse and follows a smoother path" -msgstr "Bút sẽ chạy phía sau chuột và theo một đường mịn hơn" +msgstr "Đầu bút tụt hậu đằng sau chuột và đi theo một đường dẫn trơn tru hơn" msgid "Adjust Strength for Spacing" -msgstr "Chỉnh Sức Cho Khoảng Cách" +msgstr "Điều Chỉnh Cường Độ cho Phân Khoảng" msgid "Automatically adjust strength to give consistent results for different spacings" -msgstr "Tự động chỉnh sức cho được kết qủa đều giống cho khoảng cách khác nhau" +msgstr "Tự động điều chỉnh cường độ để đạt được kết quả nhất quán đối với các phân khoảng bất đồng" msgid "Use this brush in grease pencil vertex color mode" -msgstr "Dùng bút này trong chế độ sơn đỉnh bút sáp" +msgstr "Sử dụng đầu bút này trong chế độ màu điểm đỉnh của bút chì dầu" msgid "Use Pressure for Wet Mix" -msgstr "Dùng Áp Suất Cho Pha Trọng Ướt" +msgstr "Sử Dụng Áp Lực trong Hòa Trộn Ướt" msgid "Use pressure to modulate wet mix" -msgstr "Dùng áp suất để biến dạng pha trọng ướt" +msgstr "Sử dụng áp lực để điều chế hòa trộn ướt" msgid "Use Pressure for Wet Persistence" -msgstr "Dùng Áp Suất Cho Cố Chấp Ướt" +msgstr "Sử Dụng Áp Lực trong Duy Trì Độ Ướt" msgid "Use pressure to modulate wet persistence" -msgstr "Dùng áp suất để biến dạng cố chấp ướt" +msgstr "Sử dụng áp lực để điều chế sự duy trì độ ướt" msgid "Sculpt Tool" -msgstr "Dụng Cụ Khắc" +msgstr "Công Cụ Điêu Khắc" msgid "Grab UVs" -msgstr "Bắt UV" +msgstr "Tóm Nắm UV" msgid "Relax" -msgstr "Giãn" +msgstr "Nới Lỏng" msgid "Relax UVs" -msgstr "Giãn UV" +msgstr "Nới Lỏng UV" msgid "Pinch UVs" -msgstr "Ngắc UV" +msgstr "Nhúm UV" msgid "Vertex Paint Tool" -msgstr "Dụng Cụ Sơn Đỉnh" +msgstr "Công Cụ Sơn Điểm Đỉnh" msgid "Vertex weight when brush is applied" -msgstr "Quyền lượng đỉnh khi áp dụng bút" +msgstr "Trọng lượng của điểm đỉnh khi đầu bút được áp dụng" msgid "Weight Paint Tool" -msgstr "Dụng Cụ Sơn Quyền Lượng" +msgstr "Công Cụ Sơn Trọng Lượng" msgid "Wet Mix" -msgstr "Pha Trộn Ướt" +msgstr "Hòa Trộn Ướt" msgid "Amount of paint that is picked from the surface into the brush color" -msgstr "Mức nước sơn được nhiễm màu từ bề mặt vào màu của bút" +msgstr "Lượng sơn sẽ nhuốm từ bề mặt vào màu của đầu bút" msgid "Wet Paint Radius" -msgstr "Bán Kính Nước Sơn Ướt" +msgstr "Bán Kính Sơn Ướt" msgid "Ratio between the brush radius and the radius that is going to be used to sample the color to blend in wet paint" -msgstr "Tỉ số giữa bán kính bút và bán kính được dùng cho lấy mẫu vật để pha trộn nước sơn ướt" +msgstr "Tỷ lệ giữa bán kính đầu bút và bán kính sẽ sử dụng để lấy mẫu vật màu hòng hòa trộn sơn ướt vào" msgid "Wet Persistence" -msgstr "Sự Cố Chấp Ướt" +msgstr "Duy Trì Độ Ướt" msgid "Amount of wet paint that stays in the brush after applying paint to the surface" -msgstr "Mức nước sơn ướt được dính trên bút sau tha nước sơn trên bề mặt" +msgstr "Lượng sơn ướt sẽ tồn lại trong đầu bút sau khi áp dụng sơn vào bề mặt" msgid "Path to external displacements file" -msgstr "Đường đến tập tin tập dịch ở ngoài" +msgstr "Đường dẫn đến tập tin bên ngoài dùng cho phép dời hình" msgid "Forward" -msgstr "Tới" +msgstr "Hướng Trước" msgid "The time to use for looking up the data in the cache file, or to determine which file to use in a file sequence" -msgstr "Thời gian bao lâu để tìm dữ liệu trong tập tin đệm chứa, hoặc xác định dùng tập tin nào trong một trình tự tập tin" +msgstr "Thời gian sử dụng để lùng tìm dữ liệu trong tập nhớ đệm, hoặc để xác định tập tin tập nào để dùng trong trình tự tập tin" msgid "Subtracted from the current frame to use for looking up the data in the cache file, or to determine which file to use in a file sequence" -msgstr "Được trừ từ bức ảnh hiện tại để dùng cho tìm dữ liệu trong tập tin đệm chứa, hay cho được biết dùng tập tin nào trong một trình tự tập tin" +msgstr "Khấu Trừ khỏi khung hình hiện tại để sử dụng cho việc lùng tìm dữ liệu trong tập tin bộ nhớ đệm, hoặc để xác định tập tin nào sẽ sử dụng trong một trình tự tập tin" msgid "Sequence" @@ -20025,27 +21742,27 @@ msgstr "Trình Tự" msgid "Whether the cache is separated in a series of files" -msgstr "Chẻ hay không chẻ đệm chứa thành một trình tự tập tin" +msgstr "Phân bộ nhớ đệm ra thành một trình tự tập tin hay không" msgid "Layers of the cache" -msgstr "Các lớp trên đệm chứa" +msgstr "Các tầng lớp của bộ nhớ đệm" msgid "Paths of the objects inside the Alembic archive" -msgstr "Đường dẫn của vật thể trong kho Alembic" +msgstr "Những đường dẫn của các đối tượng trong kho Alembic" msgid "Override Frame" -msgstr "Vượt Quyền Bức Ảnh" +msgstr "Vượt Quyền Khung Hình" msgid "Whether to use a custom frame for looking up data in the cache file, instead of using the current scene frame" -msgstr "Dùng hay không dùng bức ảnh tùy chọn để tìm dữ liệu trong tập tin đệm chứa, thay thế dùng bức ảnh hiện tại" +msgstr "Dùng khung hình tùy chọn để tìm kiếm dữ liệu trong tập tin bộ nhớ đệm, thay vì dùng khung hình cảnh hiện tại, hay không" msgid "Prefetch Cache Size" -msgstr "Kích Cỡ Dệm Chứa Lấy trước" +msgstr "Kích Thước Bộ Nhớ Đệm Nạp Sẵn" msgid "Memory usage limit in megabytes for the Cycles Procedural cache, if the data does not fit within the limit, rendering is aborted" @@ -20053,7 +21770,7 @@ msgstr "Giới hạn sử dụng bộ nhớ (MB) cho đệm chứa Qúa Trình C msgid "Value by which to enlarge or shrink the object with respect to the world's origin (only applicable through a Transform Cache constraint)" -msgstr "Giá trị để phóng to hay rút nhỏ vật thể tương đối với gốc tọa độ (chỉ được dùng bằng ràng buộc Đệm Chứa Biến Hóa)" +msgstr "Giá trị để tỷ lệ hay thu nhỏ đối tượng đối với tọa độ thế giới (chỉ có tác dụng với ràng buộc Bộ Nhớ Đệm Biến Hóa thôi)" msgid "Up" @@ -20061,91 +21778,106 @@ msgstr "Lên" msgid "Use Prefetch" -msgstr "Sử Dụng Lấy Trước" +msgstr "Sử Dụng Nạp Sẵn" msgid "When enabled, the Cycles Procedural will preload animation data for faster updates" -msgstr "Khi bật, Qúa Trình Cycles sẽ nạp trước dữ liệu hoạt hình để nâng cấp nhanh hơn" +msgstr "Khi bật, Qúa Trình Cycles sẽ nạp trước dữ liệu hoạt họa để nâng cấp nhanh hơn" msgid "Use Render Engine Procedural" -msgstr "Sử Dụng Qúa Trình Động Cơ Kết Xuất" +msgstr "Sử Dụng Thủ Tục Động Cơ Kết Xuất" msgid "Display boxes in the viewport as placeholders for the objects, Cycles will use a procedural to load the objects during viewport rendering in experimental mode, other render engines will also receive a placeholder and should take care of loading the Alembic data themselves if possible" -msgstr "Hiển thị hộp trong màn chiếu cho chứa chổ cho các vật thể. Cycles sẽ dùng một qúa trình cho nạp vật thể khi kết xuất màn chiếu trong chế độ thử nghiệm, những động cơ kết xuất khác sẽ cũng nhận một hộp chứa chổ và nên tự lo về nạp dữ liệu Alembic nếu có thể" +msgstr "Hiển thị hình hộp trong cổng nhìn với tư cách là chỗ dành sẵn cho các đối tượng. Cycles sẽ sử dụng một thủ tục để nạp các đối tượng trong quá trình kết xuất cổng nhìn, ở chế độ thử nghiệm, các động cơ kết xuất khác cũng sẽ được nhận một chỗ dành sẵn cho chúng, và nên tự bản thân lo việc nạp dữ liệu Alembic, nếu có thể" msgid "Velocity Attribute" -msgstr "Đặc Điểm Vận Tốc" +msgstr "Thuộc Tính Tốc Độ" msgid "Name of the Alembic attribute used for generating motion blur data" -msgstr "Tên của đặc điểm Alembic được dùng cho chế tạo dữ liệu mờ hóa chuyển động" +msgstr "Tên của thuộc tính Alembic được sử dụng trong việc sinh tạo dữ liệu về nhòe mờ chuyển động" + + +msgctxt "Unit" +msgid "Velocity Unit" +msgstr "Đơn Vị Vận Tốc" msgid "Define how the velocity vectors are interpreted with regard to time, 'frame' means the delta time is 1 frame, 'second' means the delta time is 1 / FPS" -msgstr "Định nghĩa làm sao vectơ vận tốc được xử lú tùy thừi gian, 'bức ảnh' nghĩa ∆t là 1 bức, 'giây' nghĩa ∆t là 1/(bức ảnh giây)" +msgstr "Định nghĩa phương pháp các véctơ vận tốc sẽ được phiên dịch theo thời gian. 'Khung Hình' có nghĩa là thời gian delta là 1 khung hình, 'giây' có nghĩa là thời gian delta là 1/ khung hình/giây (FPS)" + + +msgctxt "Unit" +msgid "Second" +msgstr "Giây" + + +msgctxt "Unit" +msgid "Frame" +msgstr "Khung Hình" msgid "Camera data-block for storing camera settings" -msgstr "Cục dữ liệu máy quay phim cho chứa cài đặt máy quay phim" +msgstr "Khối dữ liệu lưu các sắp đặt về máy quay phim" msgid "Field of View" -msgstr "Trường Hiển Thị" +msgstr "Trường Ảnh" msgid "Camera lens field of view" -msgstr "Trường hiển thị của thấu kính máy quay phim" +msgstr "Trường ảnh của thấu kính máy quay phim" msgid "Horizontal FOV" -msgstr "Trường Hiển Thị Ngang" +msgstr "Chiều Rộng Trường Ảnh" msgid "Camera lens horizontal field of view" -msgstr "Bề rộng trường hiển thị của thấu kính máy quay phim" +msgstr "Chiều rộng trường ảnh (FOV) của thấu kính máy quay phim" msgid "Vertical FOV" -msgstr "Trường Hiển Thị Dọc" +msgstr "Chiều Cao Trường Ảnh" msgid "Camera lens vertical field of view" -msgstr "Bề cao trường hiển thị của thấu kính máy quay phim" +msgstr "Chiều cao trường ảnh (FOV) của thấu kính máy quay phim" msgid "List of background images" -msgstr "Danh sách ảnh nền" +msgstr "Danh sách các hình ảnh nền" msgid "Clip End" -msgstr "Cách Xa" +msgstr "Điểm Cắt Kết Thúc" msgid "Camera far clipping distance" -msgstr "Khoảng cách xa nhất cho hiển thị đồ trong máy quay phim" +msgstr "Khoảng cách cắt xén xa (kết thúc tầm nhìn) của máy quay phim" msgid "Clip Start" -msgstr "Cách Gần" +msgstr "Điểm Cắt Xén Khởi Đầu" msgid "Camera near clipping distance" -msgstr "Khoảng cách gần nhất cho hiển thị đồ trong máy quay phim" +msgstr "Khoảng cách cắt xén gần (khởi đầu tầm nhìn) của máy quay phim" msgid "Apparent size of the Camera object in the 3D View" -msgstr "Kích cỡ của vật thể Máy Quay Phim trong màn 3D" +msgstr "Kích thước của đối tượng máy quay phim trong Khung Nhìn 3D" msgid "Depth Of Field" -msgstr "Độ Sâu Trường" +msgstr "Độ Sâu Trường Ảnh" msgid "Field of view for the fisheye lens" -msgstr "Trường nhìn cho thấu kính mắt cá" +msgstr "Kích thước trường ảnh cho thấu kính mắt cá" msgid "Fisheye Lens" @@ -20153,11 +21885,11 @@ msgstr "Thấu Kính Mắt Cá" msgid "Lens focal length (mm)" -msgstr "Tiêu điểm thấu kính (mm)" +msgstr "Tiêu cự của thấu kính (mm)" msgid "Fisheye Polynomial K0" -msgstr "Đa Thức Mắt Cá K0" +msgstr "Đa Thức Mắt Cá KHÔNG" msgid "Coefficient K0 of the lens polynomial" @@ -20197,27 +21929,27 @@ msgstr "Hệ số K4 của đa thức thấu kính" msgid "Max Latitude" -msgstr "Vĩ Độ Cực Đại" +msgstr "Vĩ Độ Tối Đa" msgid "Maximum latitude (vertical angle) for the equirectangular lens" -msgstr "Vĩ độ cực đại (góc dọc) cho thấu kính tuyến vuông" +msgstr "Vĩ độ tối đa (góc dọc) cho thấu kính Vuông Góc Đều" msgid "Min Latitude" -msgstr "Vĩ Độ Cực Tiểu" +msgstr "Vĩ Độ Tối Thiểu" msgid "Minimum latitude (vertical angle) for the equirectangular lens" -msgstr "Vĩ độ cực tiểu (góc dọc) cho thấu kính tuyến vuông" +msgstr "Vĩ độ tối thiểu (góc dọc) cho thấu kính Vuông Góc Đều" msgid "Focal Length" -msgstr "Quãng Tiêu Điểm" +msgstr "Tiêu Cự" msgid "Perspective Camera focal length value in millimeters" -msgstr "Giá trị thấu kính cho Máy Quay Phim chiếu phối cảnh (mm)" +msgstr "Giá trị độ dài tiêu cự của Máy Quay Phim Phối Cảnh tính bằng milimét" msgid "Lens Unit" @@ -20225,75 +21957,91 @@ msgstr "Đơn Vị Thấu Kính" msgid "Unit to edit lens in for the user interface" -msgstr "Đơn vị của thấu kinh trong giao diện" +msgstr "Đơn vị để điều chỉnh thấu kính trong giao diện người dùng" msgid "Millimeters" -msgstr "Mili Mét" +msgstr "Milimét" msgid "Specify focal length of the lens in millimeters" -msgstr "Xác định quãng tiêu điểm của thấu kinh bằng mili mét" +msgstr "Chỉ định độ dài tiêu cự của ống kính bằng milimét" msgid "Specify the lens as the field of view's angle" -msgstr "Xác định thấu kính cho đặt góc của trường màn" +msgstr "Xác định thấu kính bằng góc của tầm nhìn" msgid "Max Longitude" -msgstr "Kinh Độ Cực Đại" +msgstr "Kinh Độ Tối Đa" msgid "Maximum longitude (horizontal angle) for the equirectangular lens" -msgstr "Kinh độ cực đại (góc ngang) cho thấu kính tuyến vuông" +msgstr "Kinh độ tối đa (góc ngang) cho thấu kính Vuông Góc Đều" msgid "Min Longitude" -msgstr "Kinh Độ Cực Tiểu" +msgstr "Kinh Độ Tối Thiểu" msgid "Minimum longitude (horizontal angle) for the equirectangular lens" -msgstr "Kinh độ cực tiểu (góc ngang) cho thấu kính tuyến vuông" +msgstr "Kinh độ tối thiểu (góc ngang) cho thấu kính Vuông Góc Đều" msgid "Orthographic Scale" -msgstr "Phóng To Trực Giao" +msgstr "Tỷ Lệ của Phép Chiếu Trực Giao" msgid "Orthographic Camera scale (similar to zoom)" -msgstr "Phong to cho Máy Quay Phim trực giao (như phóng vào)" +msgstr "Độ tỷ lệ Máy Quay Phim trong phép chiếu trực giao (tương tự như thu-phóng)" msgid "Panorama Type" -msgstr "Loại Toàn Cảnh" +msgstr "Thể Loại Cảnh Tầm Rộng" msgid "Distortion to use for the calculation" -msgstr "Dùng méo hóa cho tính toán" +msgstr "Độ biến dạng sử dụng trong tính toán" msgid "Equirectangular" -msgstr "Kinh Vĩ Tuyến Vuông" +msgstr "Vuông Góc Đều" + + +msgid "Spherical camera for environment maps, also known as Lat Long panorama" +msgstr "Máy quay phim toàn cảnh cho các bản đồ môi trường, hay còn gọi là cảnh rộng Kinh Vĩ (Lat Long panorama)" + + +msgid "Equiangular Cubemap Face" +msgstr "Mặt Bản Đồ Lập Phương Đẳng Giác" + + +msgid "Single face of an equiangular cubemap" +msgstr "Đơn Mặt của bản đồ lập phương đẳng giác" msgid "Mirror Ball" -msgstr "Trái Banh Gương" +msgstr "Địa Cầu Gương" + + +msgid "Mirror ball mapping for environment maps" +msgstr "Ánh xạ địa cầu gương cho bản đồ môi trường" msgid "Fisheye Equidistant" -msgstr "Mắt Cá Đều Khoảng Cách" +msgstr "Mắt Cá Khoảng Cách Đều" msgid "Ideal for fulldomes, ignore the sensor dimensions" -msgstr "Tốt cho toàn vòm, không quan tâm kích thước cảm biến" +msgstr "Rất tốt cho vòm bán cầu, không quan tâm đến kích thước của bộ cảm biến" msgid "Fisheye Equisolid" -msgstr "Mắt Cá Đều Rắn" +msgstr "Mắt Cá Thể Tích Đều" msgid "Similar to most fisheye modern lens, takes sensor dimensions into consideration" -msgstr "Tương tự thấu kính mắt cá hiện đại, mà dùng kích thước cảm biến" +msgstr "Tương tự với hầu hết các thấu kính mắt cá hiện đại, có cân nhắc đến kích thước của bộ cảm biến" msgid "Fisheye Lens Polynomial" @@ -20301,71 +22049,71 @@ msgstr "Đa Thức Thấu Kính Mắt Cá" msgid "Defines the lens projection as polynomial to allow real world camera lenses to be mimicked" -msgstr "Chỉ định phép chiếu của thấu kính bằng một đa thức cho xấp xỉ thấu kính máy quay phim thế giới thật" +msgstr "Xác định phép chiếu thấu kính dưới dạng đa thức để cho phép bắt chước các ống kính máy ảnh trong thế giới thực" msgid "Passepartout Alpha" -msgstr "Độ Đục Lớp Che Tối" +msgstr "Alpha của Khung Cắt Cảnh" msgid "Opacity (alpha) of the darkened overlay in Camera view" -msgstr "Độ đục của lớp che tối trong màn Máy Quay Phim" +msgstr "Độ đục (alpha) của khung cắt cảnh trong khung nhìn của Máy Quay Phim" msgid "Sensor Fit" -msgstr "Vừa Cảm Biến" +msgstr "Khít với Bộ Cảm Biến" msgid "Method to fit image and field of view angle inside the sensor" -msgstr "Phương pháp làm vừa ảnh vào góc trường hiển thị trong cảm biến" +msgstr "Phương pháp đặt ảnh và góc độ tầm nhìn khít vào bộ cảm biến" msgid "Fit to the sensor width or height depending on image resolution" -msgstr "Làm vừa bề rộng hay bề cao cảm biến tùy độ phân giải ảnh" +msgstr "Khít chiều rộng hoặc chiều cao của bộ cảm biến tùy theo độ phân giải của hình ảnh" msgid "Fit to the sensor width" -msgstr "Làm vừa bề rộng của cảm biến" +msgstr "Khít với chiều rộng của bộ cảm biến" msgid "Vertical" -msgstr "Dọc" +msgstr "Chiều Dọc" msgid "Fit to the sensor height" -msgstr "Làm vừa bề cao của cảm biến" +msgstr "Khít với chiều cao của bộ cảm biến" msgid "Sensor Height" -msgstr "Bề Cao Cảm Biến" +msgstr "Chiều Cao Bộ Cảm Biến" msgid "Vertical size of the image sensor area in millimeters" -msgstr "Kích cỡ dọc của diện tích cảm biến ảnh (mili mét)" +msgstr "Kích thước chiều cao của diện tích bộ cảm biến ảnh trong milimét" msgid "Sensor Width" -msgstr "Bề Rộng Cảm Biến" +msgstr "Chiều Rộng Bộ Cảm Biến" msgid "Horizontal size of the image sensor area in millimeters" -msgstr "Kích cỡ ngang của diện tích cảm biến ảnh (mili mét)" +msgstr "Kích thước chiều ngang của diện tích bộ cảm biến ảnh trong milimét" msgid "Shift X" -msgstr "Dịch X" +msgstr "Dịch Chuyển Chiều X" msgid "Camera horizontal shift" -msgstr "Dịch ngang Máy Quay Phim" +msgstr "Dịch chuyển máy quay phim theo chiều ngang" msgid "Shift Y" -msgstr "Dịch Y" +msgstr "Dịch Chuyển Chiều Y" msgid "Camera vertical shift" -msgstr "Dịch dọc máy quay phim" +msgstr "Dịch chuyển máy quay phim theo chiều cao" msgid "Display Background Images" @@ -20373,27 +22121,27 @@ msgstr "Hiển Thị Ảnh Nền" msgid "Display reference images behind objects in the 3D View" -msgstr "Hiển thị ảnh mẫu phía sau vật thể trong màn 3D" +msgstr "Hiển thị hình ảnh tham chiếu ở đằng sau đối tượng trong Góc Nhìn 3D" msgid "Display center composition guide inside the camera view" -msgstr "Hiển thị đường dẫn ghép của trung tâm trong màn máy quay phim" +msgstr "Hiển thị hướng dẫn bố cục ở trung tâm trong góc nhìn của máy quay phim" msgid "Center Diagonal" -msgstr "Đường Chéo Trung Giữa" +msgstr "Đường Chéo Qua Tâm" msgid "Display diagonal center composition guide inside the camera view" -msgstr "Hiển thị đường dẫn chéo của trung tâm trong màn máy quay phim" +msgstr "Hiển thị hướng dẫn bố cục đường chéo ở trung tâm trong góc nhìn của máy quay phim" msgid "Golden Ratio" -msgstr "Tỉ Lệ Vàng" +msgstr "Tỷ Lệ Vàng" msgid "Display golden ratio composition guide inside the camera view" -msgstr "Hiển thị đường dẫn ghép tỉ lệ vàng trong màn máy quay phim" +msgstr "Hiển thị hướng dẫn bố cục Tỷ Lệ Vàng nội trong góc nhìn của máy quay phim" msgid "Golden Triangle A" @@ -20401,7 +22149,7 @@ msgstr "Tam Giác Vàng A" msgid "Display golden triangle A composition guide inside the camera view" -msgstr "Hiển thị đường dẫn ghép tam giác A vàng trong màn máy quay phim" +msgstr "Hiển thị hướng dẫn bố cục Tam Giác Vàng A trong góc nhìn của máy quay phim" msgid "Golden Triangle B" @@ -20409,131 +22157,139 @@ msgstr "Tam Giác Vàng B" msgid "Display golden triangle B composition guide inside the camera view" -msgstr "Hiển thị đường dẫn ghép tam giác B vàng trong màn máy quay phim" +msgstr "Hiển thị hướng dẫn bố cục Tam Giác Vàng B trong góc nhìn của máy quay phim" msgid "Harmonious Triangle A" -msgstr "Tam Giác A Hợp Lý" +msgstr "Tam Giác Hài Hòa A" msgid "Display harmony A composition guide inside the camera view" -msgstr "Hiển thị đường dẫn ghép hợp lý A vàng trong màn máy quay phim" +msgstr "Hiển thị hướng dẫn bố cục Tam Giác Hài Hòa A nội trong góc nhìn của máy quay phim" msgid "Harmonious Triangle B" -msgstr "Tam Giác B Hợp Lý" +msgstr "Tam Giác Hài Hòa B" msgid "Display harmony B composition guide inside the camera view" -msgstr "Hiển thị đường dẫn ghép hợp lý B vàng trong màn máy quay phim" +msgstr "Hiển thị hướng dẫn bố cục Tam Giác Hài Hòa B nội trong góc nhìn của máy quay phim" msgid "Thirds" -msgstr "Một Phần Ba" +msgstr "Luật Một Phần Ba" msgid "Display rule of thirds composition guide inside the camera view" -msgstr "Hiển thị đường dẫn ghép guy tắc một phần ba trong màn máy quay phim" +msgstr "Hiển thị hướng dẫn bố cục Luật Một Phần Ba nội trong góc nhìn của máy quay phim" msgid "Show Limits" -msgstr "Hiện Giới Hạn" +msgstr "Hiển Thị Giới Hạn" msgid "Display the clipping range and focus point on the camera" -msgstr "Hiển thị phạm vi cắt và tiêu điểm cự trên máy quay phim" +msgstr "Hiển thị phạm vi tầm nhìn và điểm hội tụ trên máy quay phim" msgid "Show Mist" -msgstr "Hiện Sương Mù" +msgstr "Hiển Thị Sương Mù" msgid "Display a line from the Camera to indicate the mist area" -msgstr "Hiển thị một đường từ Máy Quay Phim cho chỉ khu vực sương mù" +msgstr "Hiển thị một đường thẳng từ Máy Quay Phim ra biểu thị khu vực sương mù" msgid "Show Name" -msgstr "Hiện Tên" +msgstr "Hiển Thị Tên" msgid "Show the active Camera's name in Camera view" -msgstr "Hiện tên Máy Quay Phim hoạt động trong màn Máy Quay Phim" +msgstr "Hiển thị tên Máy Quay Phim đang hoạt động trong góc nhìn máy quay" msgid "Show Passepartout" -msgstr "Hiện Lớp Che Tối" +msgstr "Hiển Thị Khung Cắt Cảnh" msgid "Show a darkened overlay outside the image area in Camera view" -msgstr "Hiện một lớp che tối chỗ ở ngoài khu vực ảnh trong màn Máy Quay Phim" +msgstr "Hiển thị tầng kính lồng thẫm màu ở khu vực ngoài hình ảnh của góc nhìn Máy Quay" msgid "Show Safe Areas" -msgstr "Hiện Khu Vực An Toàn" +msgstr "Hiển Thị Khu Vực An Toàn" msgid "Show TV title safe and action safe areas in Camera view" -msgstr "Hiện khu vực an toàn cho tựa truyền hình và khu vực an toàn cho hành động trong màn Máy Quay Phim" +msgstr "Hiển thị vùng an toàn cho tựa đề truyền hình và vùng an toàn cho hành động trong góc nhìn Máy Quay" msgid "Show Center-Cut Safe Areas" -msgstr "Hiện Vùng An Toàn Cắt Quanh Tâm" +msgstr "Hiển Thị Vùng An Toàn Trung Tâm" msgid "Show safe areas to fit content in a different aspect ratio" -msgstr "Hiện khu vực an toàn vừa nội dung cho một tỉ số cạnh khác" +msgstr "Hiển thị vùng an toàn để khít vừa nội dung trong một tỷ lệ kích thước khung hình khác" msgid "Show Sensor Size" -msgstr "Hiện Kích Cỡ Cảm Biến" +msgstr "Hiển Thị Kích Thước Bộ Cảm Biến" msgid "Show sensor size (film gate) in Camera view" -msgstr "Hiện kích cỡ cảm biến (cửa phim) in màn Máy Quay Phim" +msgstr "Hiển thị kích thước bộ cảm biến (cổng phim) trong góc nhìn Máy Quay" msgid "Camera types" -msgstr "Loại Máy Quay Phim" +msgstr "Loại máy quay" msgid "Perspective" -msgstr "Chiếu Phối Cảnh" +msgstr "Phối Cảnh Xa Gần" msgid "Orthographic" -msgstr "Trực Giao Cảnh" +msgstr "Trực Giao" msgid "Panoramic" -msgstr "Toàn Cảnh" +msgstr "Màn Ảnh Rộng" msgid "Collection of Object data-blocks" -msgstr "Sưu tập cục dữ liệu Vật Thể" +msgstr "Bộ sưu tập của các khối dữ liệu về Đối Tượng" msgid "All Objects" -msgstr "Tất Cả Vật Thể" +msgstr "Toàn Bộ các Đối Tượng" msgid "Objects that are in this collection and its child collections" -msgstr "Vật thể ở trong sưu tập này và sưu tập con cái của nó" +msgstr "Những đối tượng trong bộ sưu tập này và các bộ sưu tập con cái của nó" msgid "Collections that are immediate children of this collection" -msgstr "Các sưu tập là con cái trực tiếp của sưu tập này" +msgstr "Những bộ sưu tập là con cái trực tiếp (kề sát) của bộ sưu tập này" + + +msgid "Children collections their parent-collection-specific settings" +msgstr "Bộ sưu tập con cái: cài đặt dành riêng cho bộ sưu tập phụ huynh của chúng" + + +msgid "Objects of the collection with their parent-collection-specific settings" +msgstr "Các đối tượng của bộ sưu tập với các cài đặt dành riêng cho bộ sưu tập phụ huynh của chúng" msgid "Collection Color" -msgstr "Màu Sưu Tập" +msgstr "Màu của Bộ Sưu Tập" msgid "Color tag for a collection" -msgstr "Nhẵn màu cho một sưu tập" +msgstr "Nhãn màu đánh dấu bộ sưu tập" msgid "Assign no color tag to the collection" -msgstr "Không chỉ định nhẵn màu cho sưu tập" +msgstr "Không ấn định nhãn màu cho bộ sưu tập" msgid "Color 01" @@ -20569,183 +22325,191 @@ msgstr "Màu 08" msgid "Disable in Renders" -msgstr "Tắt trong Kết Xuất" +msgstr "Tắt Kết Xuất" msgid "Globally disable in renders" -msgstr "Tắt trong hết kết xuất" +msgstr "Tắt Kết Xuất Toàn Cầu" msgid "Disable Selection" -msgstr "Tắt Sự Lựa Chọn" +msgstr "Tắt Lựa Chọn" msgid "Disable selection in viewport" -msgstr "Tắt sự lựa chọn trong màn chiếu" +msgstr "Không cho phép lựa chọn trong cổng nhìn" msgid "Disable in Viewports" -msgstr "Tắt trong Các Màn Chiếu" +msgstr "Tắt trong Cổng Nhìn" msgid "Globally disable in viewports" -msgstr "Tắt trong hết màn chiếu" +msgstr "Không cho phép (tắt/vô hiệu hóa) trong cổng nhìn toàn cầu" msgid "Instance Offset" -msgstr "Dịch Thực Thể" +msgstr "Dịch Chuyển Thực Thể" msgid "Offset from the origin to use when instancing" -msgstr "Sử dụng dịch từ gốc tọa độ khi đang làm thực thể" +msgstr "Khoảng dịch chuyển khỏi tọa độ nguyên thủy để sử dụng khi thực thể hóa" msgid "Intersection generated by this collection will have this mask value" -msgstr "Giao cắt được chế tạo bởi sưu tập này sẽ có giá trị mặt nạ này" +msgstr "Sự giao cắt do bộ sưu tập này tạo ra sẽ có giá trị màn chắn lọc này" msgid "Intersection Priority" -msgstr "Độ Ưu Tiên Giao Cắt" +msgstr "Mức Độ Ưu Tiên Giao Cắt" msgid "The intersection line will be included into the object with the higher intersection priority value" -msgstr "Gồm đường giao cắt vào vật thể với giá trị độ ưu tiên giao cắt cao hơn" +msgstr "Đường giao cắt sẽ được đưa vào đối tượng có giá trị ưu tiên giao cắt cao hơn" msgid "Usage" -msgstr "Sử Dụng" +msgstr "Cách Dùng" msgid "How to use this collection in line art" -msgstr "Làm sao sử dụng sưu tập này trong nghệ thuật đường nét" +msgstr "Phương pháp sử dụng bộ sưu tập này trong mỹ thuật đường nét" msgid "Generate feature lines for this collection" -msgstr "Chế tạo đường đạc trưng cho sưu tập này" +msgstr "Sinh tạo các đường viền hình thể cho bộ sưu tập này" msgid "Occlusion Only" -msgstr "Chỉ Che Khuất" +msgstr "Duy Che Khuất" msgid "Only use the collection to produce occlusion" -msgstr "Chỉ dùng sưu tập này để tạo che khuất" +msgstr "Chỉ sử dụng bộ sưu tập để tạo ra vùng Hấp Thụ Quang Xạ" msgid "Don't use this collection in line art" -msgstr "Không dùng sưu tập này trong nghệ thuật đường nét" +msgstr "Không sử dụng bộ sưu tập này trong mỹ thuật đường nét" msgid "Intersection Only" -msgstr "Chỉ Giao Cắt" +msgstr "Duy Giao Cắt" msgid "Only generate intersection lines for this collection" -msgstr "Chỉ chế tạo đường giao cắt cho sưu tập này" +msgstr "Chỉ sinh tạo các đường giao nhau cho bộ sưu tập này mà thôi" msgid "No Intersection" -msgstr "Không Có Giao Cắt" +msgstr "Không Có Đường Giao Cắt" msgid "Include this collection but do not generate intersection lines" -msgstr "Gồm sưu tập này nhưng không chế tạo đường giao cắt" +msgstr "Bao gồm bộ sưu tập này nhưng không tạo ra các đường giao cắt" + + +msgid "Force Intersection" +msgstr "Ép Buộc Giao Cắt Nhau" + + +msgid "Generate intersection lines even with objects that disabled intersection" +msgstr "Sinh tạo các đường giao cắt nhau, ngay cả đối với các đối tượng đã tắt tùy chọn giao cắt nhau nữa" msgid "Use Intersection Masks" -msgstr "Dừng Mặt Nạ Giao Cắt" +msgstr "Sử Dụng Màn Chắn Lọc Giao Cắt" msgid "Use custom intersection mask for faces in this collection" -msgstr "Dùng mặt nạ tùy chọn giao cắt cho các mặt trong sưu tập này" +msgstr "Sử dụng màn chắn lọc giao cắt tùy chỉnh cho các mặt trong bộ sưu tập này" msgid "Objects that are directly in this collection" -msgstr "Vật thể trực tiếp ở trong sưu tập này" +msgstr "Những đối tượng nằm trong bộ sưu tập này" msgid "Use Intersection Priority" -msgstr "Dùng Độ Ưu Tiên Giao Cắt" +msgstr "Sử Dụng Mức Độ Ưu Tiên Giao Cắt" msgid "Assign intersection priority value for this collection" -msgstr "Chỉ định giá trị cho độ ưu tiên của giao cắt cho sưu tập này" +msgstr "Ấn định giá trị ưu tiên giao cắt cho bộ sưu tập này" msgid "Curve data-block storing curves, splines and NURBS" -msgstr "Cục dữ liệu chứa đường cong, mẫu cong, và NURBS" +msgstr "Khối dữ liệu lưu trữ các đường cong, chốt trục, và NURBS (Non-uniform rational basis spline)" msgid "Bevel Depth" -msgstr "Độ Sâu Tròn" +msgstr "Độ Sâu Bo Tròn" msgid "Radius of the bevel geometry, not including extrusion" -msgstr "Bán kính của hình dạng cạnh tròn, không kệ kéo ra" +msgstr "Bán kính hình học bo tròn, không bao gồm đẩy trồi" msgid "Geometry End Factor" -msgstr "Hệ Số Kết Thúc Hình Dạng" +msgstr "Hệ Số Kết Thúc Hình Học" msgid "Define where along the spline the curve geometry ends (0 for the beginning, 1 for the end)" -msgstr "Chỉ định chỗ kết thúc trên hình dạng mẫu cong (0 cho đầu, 1 cho cuối)" +msgstr "Xác định điểm kết hình học của đường cong dọc theo chốt trục sẽ nằm ở đâu (0 = ở đầu cùng, 1 = ở cuối cùng)" msgid "End Mapping Type" -msgstr "Loại Ánh Xạ Kết Thúc" +msgstr "Kiểu Ánh Xạ Kết Thúc" msgid "Determine how the geometry end factor is mapped to a spline" -msgstr "Quyết định làm sao hệ số kết thúc hình dạng được ánh xạ đến một mẫu cong" +msgstr "Xác định phương pháp ánh xạ hệ số kết thúc hình học sang chốt trục" msgid "Map the geometry factor to the number of subdivisions of a spline (U resolution)" -msgstr "Ánh xạ hệ số hình dạng đến số lượng phân hóa của một mẫu cong (độ phân giải U)" +msgstr "Ánh xạ hệ số hình học sang số phân đoạn của chốt trục (độ phân giải U)" msgid "Map the geometry factor to the length of a segment and to the number of subdivisions of a segment" -msgstr "Ánh xạ hệ số hình dạng đến bề dài của một khúc cong và số lượng phân hóa của một khúc cong" +msgstr "Ánh xạ hệ số hình học thành chiều dài của một phân đoạn và lượng phân hóa của phân đoạn" msgid "Map the geometry factor to the length of a spline" -msgstr "Ánh xạ hệ số hình dạng đến bề dài của một mẫu cong" +msgstr "Ánh xạ hệ số hình học sang thành chiều dài của một chốt trục" msgid "Start Mapping Type" -msgstr "Loại Ánh Xạ Bắt Đầu" +msgstr "Kiểu Ánh Xạ Khởi Đầu" msgid "Determine how the geometry start factor is mapped to a spline" -msgstr "Quyết định làm sao hệ số hình dạng bắt đầu được ánh xạ đến một mẫu cong" +msgstr "Xác định phương pháp ánh xạ hệ số hình học khởi đầu sang chốt trục" msgid "Geometry Start Factor" -msgstr "Hệ Số Bắt Đầu Hình Dạng" +msgstr "Hệ Số Hình Học Khởi Đầu" msgid "Define where along the spline the curve geometry starts (0 for the beginning, 1 for the end)" -msgstr "Chỉ định chỗ bắt đầu trên hình dạng mẫu cong (0 cho đầu, 1 cho cuối)" +msgstr "Xác định điểm hình học đường cong bắt đầu từ đâu (0 = ở đầu, 1 = ở cuối)" msgid "Bevel Mode" -msgstr "Chế Độ Cạnh Tròn" +msgstr "Chế Độ Bo Tròn" msgid "Determine how to build the curve's bevel geometry" -msgstr "Quyết định làm sao xây dựng hình dạng cạnh tròn của đường cong" +msgstr "Xác định phương pháp tạo dựng hình học bo tròn của đường cong" msgid "Round" -msgstr "Tròn" +msgstr "Làm/Tròn" msgid "Use circle for the section of the curve's bevel geometry" -msgstr "Dùng vòng tròn cho hình dạng cạnh tròn của đường cong" +msgstr "Sử dụng hình tròn để lựa chọn hình học bo tròn của đường cong" msgid "Use an object for the section of the curve's bevel geometry segment" -msgstr "Dùng một vật thể cho khúc của hình dạng cạnh tròn của đường cong" +msgstr "Sử dụng một đối tượng để lựa chọn phân đoạn hình học bo tròn của đường cong" msgid "Profile" @@ -20753,43 +22517,43 @@ msgstr "Mặt Cắt" msgid "Use a custom profile for each quarter of curve's bevel geometry" -msgstr "Dùng một mặt cắt tùy chọn cho mỗi phân tư của hình dạng cạnh tròn của đường cong" +msgstr "Sử dụng một mặt cắt cho mỗi phần tư hình học bo tròn của đường cong" msgid "Bevel Object" -msgstr "Vật Thể Cạnh Tròn" +msgstr "Đối Tượng Bo Tròn" msgid "The name of the Curve object that defines the bevel shape" -msgstr "Tên của vật thể Đường Cong được xác định hình dạng của cạnh tròn" +msgstr "Tên đối tượng Đường Cong xác định hình dạng bo tròn" msgid "Custom Profile Path" -msgstr "Đường Mặt Cắt Tùy Chọn" +msgstr "Đường Dẫn Mặt Cắt Tùy Chọn" msgid "The path for the curve's custom profile" -msgstr "Đường làm mặt cắt tùy chọn của đường cong " +msgstr "Đường dẫn cho mặt cắt tùy chọn" msgid "Bevel Resolution" -msgstr "Độ Phân Giải Cạnh Tròn" +msgstr "Độ Phân Giải Bo Tròn" msgid "The number of segments in each quarter-circle of the bevel" -msgstr "Số lượng khúc trong mỗi một phần tư tròn của cạnh tròn" +msgstr "Số phân đoạn trong mỗi phần tư hình tròn của hình bo tròn" msgid "Cycles Mesh Settings" -msgstr "Cài Đặt Mạng Lưới Cycles" +msgstr "Sắp Đặt của Khung Lưới trong Cycles" msgid "Cycles mesh settings" -msgstr "Cài đặt mạng lưới Cycles" +msgstr "Sắp đặt của khung lưới trong Cycles" msgid "Dimensions" -msgstr "Kích Thước" +msgstr "Kích Thước/Chiều" msgid "Select 2D or 3D curve type" @@ -20797,43 +22561,47 @@ msgstr "Chọn loại đường cong 2D hay 3D" msgid "Clamp the Z axis of the curve" -msgstr "Kẹp lại trục Z của đường cong" +msgstr "Hạn định trục Z của đường cong lại" msgid "Allow editing on the Z axis of this curve, also allows tilt and curve radius to be used" -msgstr "Cho biên tập trên trục Z của đường cong này, cũng cho dùng nghiêng và bán kính cong" +msgstr "Cho phép biên soạn trục Z của đường cong này, đồng thời cho phép sử dụng độ nghiêng và bán kính đường cong" msgid "Parametric position along the length of the curve that Objects 'following' it should be at (position is evaluated by dividing by the 'Path Length' value)" -msgstr "Vị trí tham số trên đường cong cho Vật Thể 'đi theo' nó nên đang ở (vị trí được tính bằng chia giá trị 'Bề Dài Đường Dẫn')" +msgstr "Tham số về vị trí trên đường cong mà Đối Tượng 'đi theo' sẽ phải nằm tại đó (vị trí được tính bằng cách chia với giá trị 'Chiều Dài Đường Dẫn')" msgid "Extrude" -msgstr "Kéo Ra" +msgstr "Đẩy Trồi" msgid "Length of the depth added in the local Z direction along the curve, perpendicular to its normals" -msgstr "Bề dài của độ sâu thêm cho hướng Z địa phương của đường cong, vuông góc với pháp tuyến" +msgstr "Chiều dài của độ sâu được thêm vào hướng Z địa phương, dọc theo đường cong, vuông góc với pháp tuyến của nó" msgid "Fill Mode" -msgstr "Chế Đồ Tô Đầy" +msgstr "Chế Độ Tô Phủ Kín" msgid "Mode of filling curve" -msgstr "Chế độ tô đầy đường cong" +msgstr "Chế độ tô phủ kín đường cong" msgid "Half" -msgstr "Nửa" +msgstr "Một Nửa" msgid "Distance to move the curve parallel to its normals" msgstr "Khoảng cách để di chuyển đường cong song song với pháp tuyến của nó" +msgid "Path Duration" +msgstr "Thời Lượng Đường Dẫn" + + msgid "The number of frames that are needed to traverse the path, defining the maximum value for the 'Evaluation Time' setting" -msgstr "Số lượng bức ảnh cần để đi xuyên hết đường đi, được chỉ định giá trị tối đa cho cài đặt 'Thời Gian Tính Toán'" +msgstr "Số lượng khung hình cần có để duyệt đường dẫn, xác định giá trị tối đa cho sắp đặt 'Thời Gian Tính Toán'" msgid "Render Resolution U" @@ -20841,7 +22609,7 @@ msgstr "Độ Phân Giải Kết Xuất U" msgid "Surface resolution in U direction used while rendering (zero uses preview resolution)" -msgstr "Độ phân giải bề mặt cho hướng U được dùng khi kết xuất (đặt = 0 cho dùng độ phân giải dự khán)" +msgstr "Độ phân giải bề mặt, trong hướng U, sử dụng trong khi kết xuất (0 = dùng độ phân giải xem trước)" msgid "Render Resolution V" @@ -20849,7 +22617,7 @@ msgstr "Độ Phân Giải Kết Xuất V" msgid "Surface resolution in V direction used while rendering (zero uses preview resolution)" -msgstr "Độ phân giải bề mặt cho hướng V được dùng khi kết xuất (đặt = 0 cho dùng độ phân giải dự khán)" +msgstr "Độ phân giải bề mặt, trong hướng V, sử dụng trong khi kết xuất (0 = dùng độ phân giải xem trước)" msgid "Resolution U" @@ -20857,7 +22625,7 @@ msgstr "Độ Phân Giải U" msgid "Number of computed points in the U direction between every pair of control points" -msgstr "Số lượng điểm được tính trong hướng U giữa mỗi gặp đôi điểm kiểm soát" +msgstr "Số điểm được tính theo hướng U giữa mọi cặp đôi của các điểm điều khiển" msgid "Resolution V" @@ -20865,43 +22633,43 @@ msgstr "Độ Phân Giải V" msgid "The number of computed points in the V direction between every pair of control points" -msgstr "Số lượng điểm được tính trong hướng V giữa mỗi gặp đôi điểm kiểm soát" +msgstr "Số điểm được tính theo hướng V giữa mọi cặp đôi của các điểm điều khiển" msgid "Splines" -msgstr "Các Mẫu Cong" +msgstr "Chốt Trục" msgid "Collection of splines in this curve data object" -msgstr "Sưu tập mẫu cong trong vật thể dữ liệu đường cong này" +msgstr "Bộ các chốt trục trong đối tượng dữ liệu đường cong này" msgid "Taper Object" -msgstr "Vật Thể Nến" +msgstr "Đối Tượng Vuốt Thon" msgid "Curve object name that defines the taper (width)" -msgstr "Tên vật thể đường cong được chỉ định nến (bề rộng)" +msgstr "Tên đường cong dùng làm đối tượng vuốt thon (chiều rộng)" msgid "Taper Radius" -msgstr "Bán Kính Cục Nến" +msgstr "Bán Kính Vuốt Thon" msgid "Determine how the effective radius of the spline point is computed when a taper object is specified" -msgstr "Quyết định làm sao bán kính áp dụng của điểm mẫu cong được tính khi đã chỉ định một vật thể nến" +msgstr "Xác định phương pháp tính toán bán kính hiệu quả của điểm chốt trục khi một đối tượng vuốt thon được chỉ định" msgid "Override the radius of the spline point with the taper radius" -msgstr "Vượt quyền bán kính của điểm mẫu cong bằng bán kính nến" +msgstr "Vượt quyền bán kính của điểm chốt trục với bán kính vuốt thon" msgid "Multiply the radius of the spline point by the taper radius" -msgstr "Nhân bán kính của điểm mẫu cong với bán kính nến" +msgstr "Nhân bán kính của điểm chốt trục với bán kính vuốt thon" msgid "Add the radius of the bevel point to the taper radius" -msgstr "Cộng bán kính của điểm cạnh tròn với bán kính nến" +msgstr "Thêm bán kính của điểm bo tròn vào bán kính vuốt thon" msgid "Texture Space Location" @@ -20909,11 +22677,11 @@ msgstr "Vị Trí Không Gian Chất Liệu" msgid "Texture Space Size" -msgstr "Kích Cỡ Không Gian Chất Liệu" +msgstr "Kích Thước Không Gian Chất Liệu" msgid "Twist Method" -msgstr "Phương Pháp Xoắn" +msgstr "Phương Pháp Xoắn Vặn" msgid "The type of tilt calculation for 3D Curves" @@ -20921,75 +22689,87 @@ msgstr "Phương pháp tính độ nghiêng của Đường Cong 3D" msgid "Z-Up" -msgstr "Z-Trên" +msgstr "Z-Hướng Lên" msgid "Use Z-Up axis to calculate the curve twist at each point" -msgstr "Dùng trục Z-Trên để tính độ xoắn đường cong tại mỗi điểm" +msgstr "Dùng trục Z-Hướng Lên để tính độ xoắn vặn của đường cong tại mỗi điểm" msgid "Use the least twist over the entire curve" -msgstr "Dùng độ xoắn ít nhắt của toàn đường cong" +msgstr "Dùng độ xoắn vặn ít nhất cho toàn thể đường cong" msgid "Use the tangent to calculate twist" -msgstr "Dùng tiếp tuyến cho tính xoắn" +msgstr "Dùng tiếp tuyến để tính độ xoắn vặn" msgid "Twist Smooth" -msgstr "Xoắn Mịn" +msgstr "Xoắn Vặn Mịn Màng" msgid "Smoothing iteration for tangents" -msgstr "Lặp lại mịn hóa cho tiếp tuyến" +msgstr "Số lần tuần hoàn quá trình làm mịn cho các tiếp tuyến" msgid "Auto Texture Space" -msgstr "Không Gian Chất Liệu Tự Động" +msgstr "Tự Động Không Gian Chất Liệu" msgid "Adjust active object's texture space automatically when transforming object" -msgstr "Tự động chỉnh không gian chất liệu của vật thể hoạt động khi đang biến hóa vật thể" +msgstr "Tự động điều chỉnh không gian chất liệu của đối tượng khi biến hóa" msgid "Bounds Clamp" -msgstr "Kẹp Lại Ranh Giới" +msgstr "Hạn Định Ranh Giới" msgid "Option for curve-deform: Use the mesh bounds to clamp the deformation" -msgstr "Sự lựa chọn cho méo hóa đường cong: Sử dụng ranh giới mạng lưới cho kẹp lại quá trình méo hóa" +msgstr "Tùy chọn dành cho quá trình biến dạng đường cong: Siết sự biến dạng vào ranh giới khung lưới" msgid "Fill Caps" -msgstr "Tô Đầu" +msgstr "Bịt Kín Đầu" msgid "Fill caps for beveled curves" -msgstr "Đầy đầu cho đường cong cạnh tròn" +msgstr "Bịt kín đầu các đường cong bo tròn" msgid "Map Taper" -msgstr "Ánh Xạ Nến" +msgstr "Ánh Xạ Vuốt Thon" msgid "Map effect of the taper object to the beveled part of the curve" -msgstr "Ánh xạ hiệu ứng của vật thể nến trên khúc đường cong được cạnh tròn" +msgstr "Ánh xạ ảnh hưởng của đối tượng vuốt thon vào phần bo tròn của đường cong" msgid "Path" -msgstr "Đường Dẫn" +msgstr "Đường Đi/Dẫn" msgid "Enable the curve to become a translation path" -msgstr "Bật đường cong được thành một đường đi dịch" +msgstr "Cho phép đường cong trở thành đường dẫn của dịch chuyển tịnh tiến" msgid "Clamp the curve path children so they can't travel past the start/end point of the curve" -msgstr "Kẹp lại con cái của đường cong cho chúng nó không thể đi ra ngoài điểm bắt đầu/kết thúc của đường cong" +msgstr "Kẹp lại con cái của đường cong cho chúnh nó không thể đi ra ngoài điểm bắt đầu/kết thúc của đường cong" msgid "Follow" -msgstr "Đuối Theo" +msgstr "Đi Theo" + + +msgid "Make curve path children rotate along the path" +msgstr "Bắt đường cong con cái phải xoay chiều dọc theo đường đi" + + +msgid "Option for paths and curve-deform: apply the curve radius to objects following it and to deformed objects" +msgstr "Tùy chọn về các đường dẫn và biến dạng đường cong: áp dụng bán kính đường cong vào các đối tượng đi theo nó và vào các đối tượng biến dạng" + + +msgid "Option for curve-deform: make deformed child stretch along entire path" +msgstr "Tùy chọn biến dạng đường cong: làm cho đứa con biến dạng kéo giãn dọc theo toàn bộ đường dẫn" msgid "Surface Curve" @@ -20997,7 +22777,7 @@ msgstr "Đường Cong Bề Mặt" msgid "Curve data-block used for storing surfaces" -msgstr "Cục dữ liệu cho chứa bề mặt" +msgstr "Khối dữ liệu về đường cong được sử dụng để lưu giữ các bề mặt" msgid "Text Curve" @@ -21005,47 +22785,67 @@ msgstr "Đường Cong Văn Bản" msgid "Curve data-block used for storing text" -msgstr "Cục dữ liệu đường cong cho chứa văn bản" +msgstr "Khối dữ liệu về đường cong được sử dụng để lưu giữ văn bản" msgid "Active Text Box" -msgstr "Hộp Văn Bản Hoạt Động" +msgstr "Hộp Văn Bản đang Hoạt Động" + + +msgid "Horizontal Alignment" +msgstr "Căn Chỉnh Chiều Ngang" + + +msgid "Text horizontal alignment from the object center" +msgstr "Căn chỉnh chiều ngang văn bản từ trung tâm của đối tượng" msgid "Align text to the left" -msgstr "Canh lề bên trái" +msgstr "Căn chỉnh về trái" msgid "Center text" -msgstr "Canh lề giữa" +msgstr "Căn chỉnh về trung tâm" msgid "Align text to the right" -msgstr "Cang lề bên phải" +msgstr "Căn chỉnh về phải" msgid "Justify" -msgstr "Canh Lề Đều Hai Bên" - - -msgid "Align to the left and the right" -msgstr "Kéo chữ đến lề phía trái và phải" - - -msgid "Flush" msgstr "Canh Đều" +msgid "Align to the left and the right" +msgstr "Căn chỉnh về cả hai bên, trái và phải" + + +msgid "Flush" +msgstr "Ngang Bằng" + + msgid "Align to the left and the right, with equal character spacing" -msgstr "Canh lề phía trái và phải, và có cách đều giữa ký tự" +msgstr "Căn chỉnh về cả bên trái và phải, với phân khoảng các ký tự bằng nhau" + + +msgid "Vertical Alignment" +msgstr "Căn Chỉnh Chiều Dọc" + + +msgid "Text vertical alignment from the object center" +msgstr "Căn chỉnh chiều dọc văn bản từ trung tâm của đối tượng" msgid "Align text to the top" -msgstr "Canh lề văn bản đến phía tren" +msgstr "Căn chỉnh văn bản về đỉnh" msgid "Top Baseline" -msgstr "Đường Cơ Sở Trên" +msgstr "Đường Cơ Sở Đỉnh" + + +msgid "Align text to the top line's baseline" +msgstr "Căn chỉnh văn bản với đường cơ sở đỉnh" msgid "Middle" @@ -21053,55 +22853,59 @@ msgstr "Giữa" msgid "Align text to the middle" -msgstr "Canh lề văn bản ở giữa" +msgstr "Căn chỉnh văn bản về trung tâm" msgid "Bottom Baseline" -msgstr "Đường Cơ Sở Dưới" +msgstr "Đường Cơ Sở Đáy" + + +msgid "Align text to the bottom line's baseline" +msgstr "Căn chỉnh văn bản với đường cơ sở đáy" msgid "Align text to the bottom" -msgstr "Canh lề văn bản đến phía dưới" +msgstr "Căn chỉnh văn bản về đáy" msgid "Body Text" -msgstr "Đoạn Văn Bản" +msgstr "Văn Bản Nội Dung" msgid "Content of this text object" -msgstr "Nội dung của vặt thể văn bản này" +msgstr "Nội dung của đối tượng văn bản" msgid "Character Info" -msgstr "Thông Tin Ký Tự" +msgstr "Thông Tin về Ký Tự" msgid "Stores the style of each character" -msgstr "Chứa phong cách của mỗi ký tự" +msgstr "Lưu giữ phong cách cho mỗi ký tự" msgid "Edit Format" -msgstr "Biên Tập Định Dạng" +msgstr "Biên Soạn Định Dạng" msgid "Editing settings character formatting" -msgstr "Đang biên tập cài đặt của định dạng ký tự" +msgstr "Biên soạn những sắp đặt về định dạng của ký tự" msgid "Object Font" -msgstr "Phông Vật Thể" +msgstr "Đối Tượng Phông" msgid "Use objects as font characters (give font objects a common name followed by the character they represent, eg. 'family-a', 'family-b', etc, set this setting to 'family-', and turn on Vertex Instancing)" -msgstr "Dùng vật thể làm vật thể ký tự phông (cho các vật thể phông một tên chung được kèm đuôi ký tự cho làm biểu diển cho họ, ví dụ 'tên-a' 'tên-b', v.v., đặt cài đặt này bằng 'tên_' và bật Thực Thể Hóa Đỉnh)" +msgstr "Sử dụng các đối tượng làm ký tự của phông (đặt một cái tên chung cho các đối tượng phông với ký tự đại diện ở đuôi, ví dụ 'họ-a' 'họ-b', v.v., cài sắp đặt này cho 'họ-' và bật Thực Thể Hóa Điểm Đỉnh lên)" msgid "Text on Curve" -msgstr "Văn Bản Trên Đường Cong" +msgstr "Văn Bản trên Đường Cong" msgid "Curve deforming text object" -msgstr "Đường cong đang méo hóa vật thể văn bản" +msgstr "Đường cong biến dạng đối tượng văn bản" msgid "Font Bold" @@ -21117,67 +22921,103 @@ msgstr "Phông Nghiêng" msgid "Text Selected" -msgstr "Văn Bản Được Chọn" +msgstr "Văn Bản được Chọn" + + +msgid "Whether there is any text selected" +msgstr "Có văn bản nào được chọn hay không" + + +msgid "Selected Bold" +msgstr "Chọn In Đậm" + + +msgid "Whether the selected text is bold" +msgstr "Liệu văn bản đã chọn có in đậm hay không" + + +msgid "Selected Italic" +msgstr "Chọn In Nghiêng" + + +msgid "Whether the selected text is italics" +msgstr "Liệu văn bản đã chọn có in nghiêng hay không" + + +msgid "Selected Small Caps" +msgstr "Chọn In Hoa Nhỏ" + + +msgid "Whether the selected text is small caps" +msgstr "Liệu văn bản đã chọn có phải là chữ in hoa nhỏ hay không" + + +msgid "Selected Underline" +msgstr "Chọn Gạch Chân" + + +msgid "Whether the selected text is underlined" +msgstr "Liệu văn bản đã chọn có được gạch chân hay không" msgid "X Offset" -msgstr "Dịch X" +msgstr "Dịch Chuyển X" msgid "Horizontal offset from the object origin" -msgstr "Dịch ngang từ gốc tọa độ vật thể" +msgstr "Dịch chuyển chiều ngang từ tọa độ gốc của đối tượng" msgid "Y Offset" -msgstr "Dịch Y" +msgstr "Dịch Chuyển Y" msgid "Vertical offset from the object origin" -msgstr "Dịch dọc từ gốc tọa độ vật thể" +msgstr "Dịch chuyển chiều dọc từ tọa độ gốc của đối tượng" msgid "Textbox Overflow" -msgstr "Tràn Ngoài Hộp Văn Bản" +msgstr "Hộp Văn Bản Quá Đầy" msgid "Handle the text behavior when it doesn't fit in the text boxes" -msgstr "Xử lý hành vi văn bản khi nó không vừa hộp văn bản" +msgstr "Xử lý hành xử của văn bản khi nó không còn khít vừa nội bên trong hộp nữa" msgid "Overflow" -msgstr "Tràn Ra Ngoài" +msgstr "Tràn Ra" msgid "Let the text overflow outside the text boxes" -msgstr "Cho văn bản tràn ra ngoài hộp văn bản" +msgstr "Cho phép văn bản tràn ra ngoài hộp" msgid "Scale to Fit" -msgstr "Phóng To cho Vừa" +msgstr "Đổi Tỷ Lệ để Khít Vừa" msgid "Scale down the text to fit inside the text boxes" -msgstr "Phóng to văn bản cho vừa hộp văn bản" +msgstr "Thu nhỏ văn bản lại để khít vừa nội bên trong các hộp" msgid "Truncate" -msgstr "Cắt" +msgstr "Cắt Xén" msgid "Truncate the text that would go outside the text boxes" -msgstr "Cắt văn bản muốn tràn ra ngoài hộp văn bản" +msgstr "Cắt đi những văn bản sẽ vượt ra ngoài hộp" msgid "Shear" -msgstr "Méo Mó" +msgstr "Ứng Suất Cắt/Xô Nghiêng" msgid "Italic angle of the characters" -msgstr "Góc nhgiêng của ký tự" +msgstr "Góc nghiêng của ký tự" msgid "Font Size" -msgstr "Kích Cỡ Phông" +msgstr "Kích Thước Phông" msgid "Small Caps" @@ -21185,19 +23025,19 @@ msgstr "Chữ Hoa Nhỏ" msgid "Scale of small capitals" -msgstr "Kích cỡ của chữ hoa nhỏ" +msgstr "Cỡ phóng/thu của chữ hoa nhỏ" msgid "Global spacing between characters" -msgstr "Khoảng cách toàn cầu giữa ký tự" +msgstr "Khoảng cách toàn cầu giữa các ký tự" msgid "Distance between lines of text" -msgstr "Khoảng cách giữa dòng văn bản" +msgstr "Khoảng cách giữa các dòng văn bản" msgid "Spacing between words" -msgstr "Khoảng cách giữa từ" +msgstr "Khoảng cách giữa các từ" msgid "Textboxes" @@ -21205,191 +23045,203 @@ msgstr "Hộp Văn Bản" msgid "Underline Thickness" -msgstr "Bề Rộng Gạch Dưới" +msgstr "Chiều Dày Nét Gạch Dưới" msgid "Underline Position" -msgstr "Vị Trí Gạch Dưới" +msgstr "Vị Trí Nét Gạch Dưới" msgid "Vertical position of underline" -msgstr "Vị trí lên/xuống của gạch dưới" +msgstr "Vị trí theo chiều dọc của nét gạch dưới" msgid "Fast Editing" -msgstr "Biên Tập Lẹ" +msgstr "Biên Soạn Nhanh" msgid "Don't fill polygons while editing" -msgstr "Không tô đầy đa giác khi đang biên tập" +msgstr "Không vẽ mặt các đa giác khi biên soạn" msgid "Hair data-block for hair curves" -msgstr "Cục dữ liệu tóc cho đường cong tóc" +msgstr "Khối dữ liệu tóc cho các đường cong của tóc" msgid "Attributes" -msgstr "Các Đặc Điểm" +msgstr "Thuộc Tính" msgid "Geometry attributes" -msgstr "Các đặc điểm của hình dạng" +msgstr "Thuộc Tính Hình Học" msgid "Color Attributes" -msgstr "Đặc Điểm Màu" +msgstr "Thuộc Tính Màu" msgid "Geometry color attributes" -msgstr "Các đặc điểm màu sắc của hình dạng" +msgstr "Thuộc tính màu hình học" msgid "All curves in the data-block" -msgstr "Hết đường cong trong cục dữ liệu" +msgstr "Toàn bộ các đường cong trong khối dữ liệu" msgid "Normals" msgstr "Pháp Tuyến" +msgid "The curve normal value at each of the curve's control points" +msgstr "Giá trị pháp tuyến của đường cong tại mỗi điểm điều khiển của đường cong" + + msgid "Control points of all curves" -msgstr "Điểm kiểm soát của hết đường cong" +msgstr "Điểm điều khiển của toàn bộ các đường cong" msgid "Selection Domain" -msgstr "Phạm Vi Sự Lựa Chọn" +msgstr "Phạm Vi Lựa Chọn" msgid "Mesh object that the curves can be attached to" -msgstr "Vật thể mạng lưới có thể gắn các đường cong trên nó" +msgstr "Đối tượng khung lưới mà đường cong có thể dính vào" msgid "Surface UV Map" -msgstr "Bản Đồ UV Bề Mặt" +msgstr "Ánh Xạ UV của Bề Mặt" msgid "The name of the attribute on the surface mesh used to define the attachment of each curve" -msgstr "Tên của đặc điểm trên bề mặt được sử dụng cho định nghĩa sự gắn của mỗi đường cong" +msgstr "Tên của thuộc tính trên khung lưới bề mặt, được sử dụng để xác định phần dính vào của mỗi đường cong" msgid "Enable symmetry in the X axis" -msgstr "Bật đối xứng trục X" +msgstr "Cho phép phản chiếu đối xứng trên trục X" msgid "Enable symmetry in the Y axis" -msgstr "Bật đối xứng trục Y" +msgstr "Cho phép phản chiếu đối xứng trên trục Y" msgid "Enable symmetry in the Z axis" -msgstr "Bật đối xứng trục Z" +msgstr "Cho phép phản chiếu đối xứng trên trục Z" + + +msgid "Use Sculpt Collision" +msgstr "Sử Dụng Va Chạm Điêu Khắc" + + +msgid "Enable collision with the surface while sculpting" +msgstr "Cho phép va chạm với bề mặt trong khi điêu khắc" msgid "Freestyle Line Style" -msgstr "Phong Cách Nét Vẽ Tự Do" +msgstr "Phong Cách Đường Nét Tự Do" msgid "Freestyle line style, reusable by multiple line sets" -msgstr "Phong cách nét vẽ tự do, nhiều tập nét có thể dùng chung" +msgstr "Phong cách đường nét tự do. Các bộ đường nét đều có thể sử dụng được" msgid "Active Texture" -msgstr "Chất Liệu Hoạt Động" +msgstr "Chất Liệu đang Hoạt Động" msgid "Active texture slot being displayed" -msgstr "Khe tọa tiết hoạt động đang hiển thị" +msgstr "Khe chất liệu hoạt động đang được hiển thị" msgid "Active Texture Index" -msgstr "Chỉ Chất Liệu Hoạt Động" +msgstr "Chỉ Số Chất Liệu đang Hoạt Động" msgid "Index of active texture slot" -msgstr "Chỉ số của khe chất liệu hoạt động" +msgstr "Chỉ số của khe chất liệu đang hoạt động" msgid "Alpha Transparency" -msgstr "Độ Đục" +msgstr "Độ Trong Suốt của Alpha" msgid "Base alpha transparency, possibly modified by alpha transparency modifiers" -msgstr "Cơ sở độ đục, bộ điều chỉnh độ đục có thể ảnh hướng nó" +msgstr "Độ trong suốt trên cơ sở alpha, có thể bị thay đổi bởi các bộ điều chỉnh alpha" msgid "Alpha Modifiers" -msgstr "Bộ Điều Chỉnh Độ Đục" +msgstr "Bộ Điều Chỉnh Alpha" msgid "List of alpha transparency modifiers" -msgstr "Danh sách có các bộ điều chỉnh độ đục" +msgstr "Danh sách có các bộ điều chỉnh độ trong suốt của alpha" msgid "Max 2D Angle" -msgstr "Góc 2D Cực Đại" +msgstr "Góc 2D Tối Đa" msgid "Maximum 2D angle for splitting chains" -msgstr "Góc cực đại 2D cho chẻ chuỗi" +msgstr "Góc 2D tối đa để tách phân các dây chuyền" msgid "Min 2D Angle" -msgstr "Góc 2Du Cực Tiểu" +msgstr "Góc 2D Tối Thiểu" msgid "Minimum 2D angle for splitting chains" -msgstr "Góc 2D cực tiểu cho chẻ chuỗi" +msgstr "Góc 2D tối thiểu để tách phân các dây chuyền" msgid "Caps" -msgstr "Nắp" +msgstr "Nắp Đậy" msgid "Select the shape of both ends of strokes" -msgstr "Chọn hinh dạng cho cả hai điểm kết thúc đường nét" +msgstr "Chọn hình dạng cho cả hai đầu của các đường nét" msgid "Butt" -msgstr "Không có nắp" +msgstr "Bẹt" msgid "Butt cap (flat)" -msgstr "Không có nắp (cắt ngang)" +msgstr "Đầu bẹt (phẳng)" msgid "Round cap (half-circle)" -msgstr "Nắp tròn (nửa tròn)" +msgstr "Đầu tròn (bán cầu)" msgid "Square" -msgstr "Vuông" +msgstr "Vuông/Hình Vuông" msgid "Square cap (flat and extended)" -msgstr "Nắp vuông (bằng phẳng và kéo ra)" +msgstr "Đầu vuông (phẳng và kéo dài)" msgid "Chain Count" -msgstr "Số Lượng Chuỗi" +msgstr "Lượng Mắt Xích" msgid "Chain count for the selection of first N chains" -msgstr "Số lượng chuổi cho sự lựa chọn N chuỗi đầu" +msgstr "Số lượng mắt xích để chọn N dây chuyền đầu tiên" msgid "Chaining Method" -msgstr "Phương Pháp Nối Chuỗi" +msgstr "Phương Pháp Kết Nối Thành Dây Chuyền" msgid "Select the way how feature edges are jointed to form chains" -msgstr "Chọn phương pháp nối cạnh đặc trưng để tạo chuỗi" +msgstr "Chọn phương pháp kết nối các nét viền hình thể để tạo thành các dây chuyền" msgid "Plain" -msgstr "Đơn Giản" +msgstr "Đơn Thuần" msgid "Plain chaining" -msgstr "Chuỗi Đơn Giản" +msgstr "Dây chuyền đơn thuần" msgid "Sketchy" @@ -21397,11 +23249,11 @@ msgstr "Phác Họa" msgid "Sketchy chaining with a multiple touch" -msgstr "Phác họa liên tục với nhiều lần mò" +msgstr "Kết nối dây chuyền theo kiểu phác họa được vẽ nhiều lần" msgid "Base line color, possibly modified by line color modifiers" -msgstr "Cơ sở màu nét, bộ điều chỉnh màu có thể ảnh hướng nó" +msgstr "Màu cơ bản, có thể bị biến đổi bởi các bộ điều chỉnh màu" msgid "Color Modifiers" @@ -21409,135 +23261,135 @@ msgstr "Bộ Điều Chỉnh Màu" msgid "List of line color modifiers" -msgstr "Danh sách có các bộ điều chỉnh màu" +msgstr "Danh sách các bộ điều chỉnh màu nét" msgid "Dash 1" -msgstr "Gạch 1" +msgstr "Gạch Ngang 1" msgid "Length of the 1st dash for dashed lines" -msgstr "Bề dài gạch thứ 1 cho đường gạch" +msgstr "Chiều dài gạch ngang thứ 1 của đường gạch ngang" msgid "Dash 2" -msgstr "Gạch 2" +msgstr "Gạch Ngang 2" msgid "Length of the 2nd dash for dashed lines" -msgstr "Bề dài gạch thứ 2 cho đường gạch" +msgstr "Chiều dài gạch ngang thứ 2 của đường gạch ngang" msgid "Dash 3" -msgstr "Gạch 3" +msgstr "Gạch Ngang 3" msgid "Length of the 3rd dash for dashed lines" -msgstr "Bề dài gạch thứ 3 cho đường gạch" +msgstr "Chiều dài gạch ngang thứ 3 của đường gạch ngang" msgid "Gap 1" -msgstr "Cách Trống 1" +msgstr "Khoảng Trống 1" msgid "Length of the 1st gap for dashed lines" -msgstr "Khoảng cách của cách trống thứ 1 cho đường gạch" +msgstr "Chiều dài kẽ hở thứ nhất của đường gạch ngang" msgid "Gap 2" -msgstr "Cách Trống 2" +msgstr "Khoảng Trống 2" msgid "Length of the 2nd gap for dashed lines" -msgstr "Khoảng cách của cách trống thứ 2 cho đường gạch" +msgstr "Chiều dài kẽ hở thứ 2 của đường gạch ngang" msgid "Gap 3" -msgstr "Cách Trống 3" +msgstr "Khoảng Trống 3" msgid "Length of the 3rd gap for dashed lines" -msgstr "Khoảng cách của cách trống thứ 3 cho đường gạch" +msgstr "Chiều dài kẽ hở thứ 3 của đường gạch ngang" msgid "Geometry Modifiers" -msgstr "Bộ Điều Chỉnh Hình Dạng" +msgstr "Bộ Điều Chỉnh Hình Học" msgid "List of stroke geometry modifiers" -msgstr "Danh sách có các bộ điều chỉnh hình dạng" +msgstr "Danh sách các bộ điều chỉnh hình học của nét vẽ" msgid "Integration Type" -msgstr "Loại Tích Phần" +msgstr "Loại Tích Phân" msgid "Select the way how the sort key is computed for each chain" -msgstr "Chọn phương pháp được tính mẫu sắp thứ tự cho mỗi chuỗi" +msgstr "Chọn phương pháp tính khóa để sắp thứ tự cho mỗi trình tự" msgid "Mean" -msgstr "Trung Vị" +msgstr "Trung Bình" msgid "The value computed for the chain is the mean of the values obtained for chain vertices" -msgstr "Giá trị được tính cho chuỗi là giá trị trung vị của các giá trị từ đỉnh chuỗi" +msgstr "Giá trị tính cho trình tự là giá trị trung bình các điểm đỉnh của trình tự" msgid "Min" -msgstr "Cực Tiểu" +msgstr "Tối Thiểu" msgid "The value computed for the chain is the minimum of the values obtained for chain vertices" -msgstr "Giá trị được tính cho chuỗi là giá trị cực tiểu của các giá trị từ đỉnh chuỗi" +msgstr "Giá trị tính cho trình tự là giá trị tối thiểu các điểm đỉnh của trình tự" msgid "Max" -msgstr "Cực Đại" +msgstr "Tối Đa" msgid "The value computed for the chain is the maximum of the values obtained for chain vertices" -msgstr "Giá trị được tính cho chuỗi là giá trị cực đại của các giá trị từ đỉnh chuỗi" +msgstr "Giá trị tính cho trình tự là giá trị tối đa các điểm đỉnh của trình tự" msgid "First" -msgstr "Đầu" +msgstr "Đầu Tiên/Thứ Nhất" msgid "The value computed for the chain is the value obtained for the first chain vertex" -msgstr "Giá trị được tính cho chuỗi là giá trị của từ đỉnh đầu chuỗi" +msgstr "Giá trị tính cho trình tự là giá trị được tính từ điểm đỉnh của trình tự đầu tiên" msgid "Last" -msgstr "Cuối Cùng" +msgstr "Cuối" msgid "The value computed for the chain is the value obtained for the last chain vertex" -msgstr "Giá trị được tính cho chuỗi là giá trị từ đỉnh cuối chuỗi" +msgstr "Giá trị tính cho trình tự là giá trị được tính từ điểm đỉnh của trình tự cuối cùng" msgid "Max 2D Length" -msgstr "Bề Dài 2D Cực Đại" +msgstr "Chiều Dài 2D Tối Đa" msgid "Maximum curvilinear 2D length for the selection of chains" -msgstr "Bề dài cong 2D cực đại cho sự lựa chọn chuỗi" +msgstr "Chiều dài 2D tối đa của đường cong phi tuyến cho các dây chuyền đã chọn" msgid "Min 2D Length" -msgstr "Dùng Bề Dài 2D Cực Tiểu" +msgstr "Chiều Dài 2D Tối Thiểu" msgid "Minimum curvilinear 2D length for the selection of chains" -msgstr "Bề dài cong 2 cực tiểu cho lực chọn chuỗi" +msgstr "Chiều dài 2D tối thiểu của đường cong cho các dây chuyền đã chọn" msgid "If true, chains of feature edges are split at material boundaries" -msgstr "Nếu đúng, chuỗi của cạnh đặc trưng được chẻ tại ranh giới vật liệu" +msgstr "Nếu 'đúng' thì các dây chuyền đường viền hình thể sẽ được tách phân tại ranh giới của chất liệu" msgid "Node tree for node-based shaders" -msgstr "Cây giao điểm cho tô bóng cơ sở giao điểm" +msgstr "Cây nút của các nút tô bóng" msgid "Panel" @@ -21545,47 +23397,47 @@ msgstr "Bảng" msgid "Select the property panel to be shown" -msgstr "Chọn hiện bảng đặc tính nào" +msgstr "Chọn bảng tính chất để hiển thị" msgid "Show the panel for stroke construction" -msgstr "Hiện bảng cho xây dựng đường nét" +msgstr "Hiển thị bảng về kiến tạo đường nét" msgid "Show the panel for line color options" -msgstr "Hiện bảng cho tùy chọn màu đường nét" +msgstr "Hiển thị bảng các tùy chọn về màu nét" msgid "Show the panel for alpha transparency options" -msgstr "Hiện bảng cho tùy chọn độ đục đường nét" +msgstr "Hiển thị bảng các tùy chọn về độ trong của alpha" msgid "Show the panel for line thickness options" -msgstr "Hiện bảng cho tùy chọn bề rộng đường nét" +msgstr "Hiển thị bảng các tùy chọn về độ dày đường nét" msgid "Show the panel for stroke geometry options" -msgstr "Hiện bảng cho tùy chọn hình dạng đường nét" +msgstr "Hiển thị bảng các tùy chọn về hình học của nét vẽ" msgid "Show the panel for stroke texture options" -msgstr "Hiện bảng cho tùy chọn chất liệu đường nét" +msgstr "Hiển thị bảng các tùy chọn về nét vẽ có chất liệu" msgid "Rounds" -msgstr "Vòng" +msgstr "Số Lượt" msgid "Number of rounds in a sketchy multiple touch" -msgstr "Số lượng vòng trong một đa mò phác họa" +msgstr "Số lượt sử dụng trong kiểu nét phác họa nhiều nét" msgid "Sort Key" -msgstr "Mẫu Sắp Thứ Tự" +msgstr "Khóa để Sắp Thứ Tự" msgid "Select the sort key to determine the stacking order of chains" -msgstr "Chọn mẫu sắp thứ tự để xác định thự tự sắp đống của chuỗi" +msgstr "Chọn khóa sắp thứ tự để biết thứ tự sắp xếp của các dây chuyền" msgid "Distance from Camera" @@ -21597,103 +23449,103 @@ msgstr "Sắp thứ tự bằng khoảng cách từ máy quay phim (đường n msgid "2D Length" -msgstr "Bề Dài 2D" +msgstr "Độ Dài 2D" msgid "Sort by curvilinear 2D length (longer lines lie on top of shorter lines)" -msgstr "Sắp thứ tự bàng bề dài cong 2D (đường nét dài hơn nằm ở trên đường nét ngắn hơn)" +msgstr "Sắp thứ tự bằng độ dài 2D của đường cong (đường nét dài hơn nằm ở trên đường ngắn hơn)" msgid "Projected X" -msgstr "Chiếu Đồ X" +msgstr "Phóng Chiếu X" msgid "Sort by the projected X value in the image coordinate system" -msgstr "Sắp xếp bằng thứ tự của giá trị X được chiếu trong hệ tọa độ ảnh" +msgstr "Sắp xếp thứ tự theo giá trị X phóng chiếu trong hệ tọa độ hình ảnh" msgid "Projected Y" -msgstr "Chiếu Đồ Y" +msgstr "Phóng Chiếu Y" msgid "Sort by the projected Y value in the image coordinate system" -msgstr "Sắp xếp bằng thứ tự của giá trị Y được chiếu trong hệ tọa độ ảnh" +msgstr "Sắp xếp thứ tự theo giá trị Y phóng chiếu trong hệ tọa độ hình ảnh" msgid "Sort Order" -msgstr "Sắp Xếp Thứ Tự" +msgstr "Trật Tự Sắp Xếp" msgid "Select the sort order" -msgstr "Chọn sắp xếp thứ tự" +msgstr "Chọn thể loại trật tự sắp xếp" msgid "Default order of the sort key" -msgstr "Thứ tự mặc định cho mẫu sắp thứ tự" +msgstr "Thứ tự mặc định của khóa lọc" msgid "Reverse order" -msgstr "Sắp xếp ngược" +msgstr "Lật ngược trật tự" msgid "Split Dash 1" -msgstr "Gạch Chẻ 1" +msgstr "Phân Gạch 1" msgid "Length of the 1st dash for splitting" -msgstr "Bề dài gạch thứ 1 cho chẻ" +msgstr "Chiều dài gạch ngang thứ 1 để tách phân" msgid "Split Dash 2" -msgstr "Gạch Chẻ 2" +msgstr "Phân Gạch 2" msgid "Length of the 2nd dash for splitting" -msgstr "Bề dài gạch thư 2 cho chẻ" +msgstr "Chiều dài gạch ngang thứ 2 để tách phân" msgid "Split Dash 3" -msgstr "Gạch Chẻ 3" +msgstr "Phân Gạch 3" msgid "Length of the 3rd dash for splitting" -msgstr "Bề dài gạch thư 3 cho chẻ" +msgstr "Chiều dài gạch ngang thứ 3 để tách phân" msgid "Split Gap 1" -msgstr "Cách Trống Chẻ 1" +msgstr "Phân Khoảng 1" msgid "Length of the 1st gap for splitting" -msgstr "Khoảng cách của cách trống thứ 1 cho chẻ" +msgstr "Chiều dài khoảng cách trống thứ 1 để tách phân" msgid "Split Gap 2" -msgstr "Cách Trống Chẻ 2" +msgstr "Phân Khoảng 2" msgid "Length of the 2nd gap for splitting" -msgstr "Khoảng cách của cách trống thứ 2 cho chẻ" +msgstr "Chiều dài khoảng cách trống thứ 2 để tách phân" msgid "Split Gap 3" -msgstr "Cách Trống Chẻ 3" +msgstr "Phân Khoảng 3" msgid "Length of the 3rd gap for splitting" -msgstr "Khoảng cách của cách trống thứ 3 cho chẻ" +msgstr "Chiều dài khoảng cách trống thứ 3 của đường gạch nối" msgid "Split Length" -msgstr "Chẻ Bề Dài" +msgstr "Chiều Dài Tách Đoạn" msgid "Curvilinear 2D length for chain splitting" -msgstr "Bề dài cong 2D cho chẻ chuỗi" +msgstr "Chiều dài đường cong 2D phi tuyến để tách phân dây chuyền" msgid "Stroke Color Mode" -msgstr "Chế Độ Màu Nét" +msgstr "Chế Độ Màu của Nét Vẽ" msgid "Base Color" @@ -21701,191 +23553,191 @@ msgstr "Màu Cơ Sở" msgid "Use the linestyle's base color" -msgstr "Dùng màu cơ sở của phong cách nét" +msgstr "Sử dụng màu cơ sở của phong cách nét vẽ" msgid "First Vertex" -msgstr "Đỉnh Đầu Tiên" +msgstr "Điểm Đỉnh Đầu Tiên" msgid "Use the color of a stroke's first vertex" -msgstr "Dùng màu của đỉnh đầu tiên của một nét" +msgstr "Sử dụng màu trên điểm đỉnh đầu tiên của nét vẽ" msgid "Final Vertex" -msgstr "Đỉnh Cuối Cùng" +msgstr "Điểm Đỉnh Cuối Cùng" msgid "Use the color of a stroke's final vertex" -msgstr "Dùng màu của đỉnh cuối cùng của một nét" +msgstr "Sử dụng màu trên điểm đỉnh cuối cùng của nét vẽ" msgid "Texture slots defining the mapping and influence of textures" -msgstr "Khe chất liệu đang chỉ định ánh xạ và sự ảnh hưởng của chất liệu " +msgstr "Khe chất liệu định nghĩa ánh xạ và sự ảnh hưởng của chất liệu" msgid "Texture Spacing" -msgstr "Khoảng Cách Chất Liệu" +msgstr "Phân khoảng của chất liệu" msgid "Spacing for textures along stroke length" -msgstr "Khoảng cách cho chất liệu trên đường nét" +msgstr "Khoảng cách giữa các chất liệu dọc theo chiều dài của nét vẽ" msgid "Base line thickness, possibly modified by line thickness modifiers" -msgstr "Bề rộng đường cơ sở, bộ điều chỉnh bề rộng đường có thể sửa đổi nó" +msgstr "Độ dày cơ bản, có thể bị sửa đổi bởi bộ điều chỉnh độ dày của đường nét" msgid "Thickness Modifiers" -msgstr "Bộ Điều Chỉnh Bề Rộng" +msgstr "Bộ Điều Chỉnh Độ Dày" msgid "List of line thickness modifiers" -msgstr "Danh sách có các bộ điều chỉnh bề rộng nét" +msgstr "Danh sách có các bộ điều chỉnh độ dày của nét" msgid "Thickness Position" -msgstr "Vị Trí Bề Rộng" +msgstr "Vị Trí Độ Dày" msgid "Thickness position of silhouettes and border edges (applicable when plain chaining is used with the Same Object option)" -msgstr "Vị trí bề rộng của hình bóng và cạnh ranh giới (được áp dụng khi sử dụng nối chuỗi bình thường với tùy chọn Vật Thể Chung)" +msgstr "Vị trí độ dày của các đường viền hình bóng và đường viền ranh giới (chỉ áp dụng khi sử dụng kết trình tự đơn thuần với tùy chọn 'Cùng Một Đối Tượng')" msgid "Silhouettes and border edges are centered along stroke geometry" -msgstr "Cạnh hình bóng và ranh giới được sắp tại trung tâm hình dạng đường nét vẽ" +msgstr "Các đường viền hình bóng và đường viền ranh giới được đặt tại tâm hình học của nét vẽ" msgid "Silhouettes and border edges are drawn inside of stroke geometry" -msgstr "Vẽ cạnh hình bóng và ranh giới được vẽ ở trong hình dạng đường nét vẽ" +msgstr "Vẽ các đường viền hình bóng và đường viền ranh giới bên trong hình học của nét vẽ" msgid "Silhouettes and border edges are drawn outside of stroke geometry" -msgstr "Vẽ cạnh hình bóng và ranh giới được vẽ ở ngoài hình dạng đường nét vẽ" +msgstr "Vẽ các đường viền hình bóng và đường viền ranh giới bên ngoài hình học của nét vẽ" msgid "Silhouettes and border edges are shifted by a user-defined ratio" -msgstr "Cạnh hình bóng và ranh giới được dịch bằng tỉ số người dùng được đặt" +msgstr "Các đường viền hình bóng và đường viền ranh giới bị dịch chuyển với tỉ số do người dùng đặt ra" msgid "Thickness Ratio" -msgstr "Tỉ Số Bề Rộng" +msgstr "Tỷ Số Độ Dày" msgid "A number between 0 (inside) and 1 (outside) specifying the relative position of stroke thickness" -msgstr "Một tỉ số giữa 0 (phía trong) và 1 (phía ngoài) được xác định vị trí tương đối của bề rộng nét" +msgstr "Một giá trị nằm giữa 0 (bên trong) và 1 (bên ngoài) để xác định vị trí tương đối độ dày của nét vẽ" msgid "Use Max 2D Angle" -msgstr "Dùng Góc Cực Đại 2D" +msgstr "Dùng Góc 2D Tối Đa" msgid "Split chains at points with angles larger than the maximum 2D angle" -msgstr "Chẻ các chuỗi tại điểm có góc lớn hơn góc 2D cực đại" +msgstr "Tách các dây chuyền tại những điểm có góc lớn hơn góc 2D tối đa" msgid "Use Min 2D Angle" -msgstr "Dùng Góc 2D Cực Tiểu" +msgstr "Dùng Góc 2D Tối Thiểu" msgid "Split chains at points with angles smaller than the minimum 2D angle" -msgstr "Chẻ chuỗi tại điểm có góc nhỏ hơn góc 2D cực tiểu" +msgstr "Tách các dây chuyền tại những điểm có góc nhỏ hơn góc 2D tối thiểu" msgid "Use Chain Count" -msgstr "Dùng Số Đém Chuỗi" +msgstr "Dùng Số Trình tự" msgid "Enable the selection of first N chains" -msgstr "Bật sự lựa chọn của N chuỗi đầu" +msgstr "Cho phép chọn N dây chuyền đầu tiên" msgid "Chaining" -msgstr "Nối Chuỗi" +msgstr "Móc Nối" msgid "Enable chaining of feature edges" -msgstr "Bật nối chuỗi của cạnh đặc trưng" +msgstr "Cho phép móc nối các nét viền hình thể thành một dây chuyền" msgid "Dashed Line" -msgstr "Nét Gạch" +msgstr "Đường Gạch Ngang" msgid "Enable or disable dashed line" -msgstr "Bật/tắt nét gạch" +msgstr "Bật/Tắt đường gạch ngang" msgid "Export Fills" -msgstr "Xuất Các Tô Đầy" +msgstr "Xuất Khẩu Vùng Tô Kín" msgid "Export fills for this Line Style" -msgstr "Xuất các tô đầy cho Phong Cách Nét này" +msgstr "Xuất Khẩu các vùng tô kín cho Phong Cách Đường Nét này" msgid "Export Strokes" -msgstr "Xuất Các Nét" +msgstr "Xuất Khẩu Nét Viền" msgid "Export strokes for this Line Style" -msgstr "Xuất các nét cho Phong Cách Nét này" +msgstr "Xuất Khẩu các nét viền cho Phong Cách Đường Nét này" msgid "Use Max 2D Length" -msgstr "Dùng Bề Dài 2D Cực Đại" +msgstr "Dùng Chiều Dài 2D Tối Đa" msgid "Enable the selection of chains by a maximum 2D length" -msgstr "Bật sự lựa chọn chuỗi bằng một bề dài 2D cực đại" +msgstr "Cho phép lựa chọn các dây chuyền bằng một chiều dài 2D tối đa" msgid "Use Min 2D Length" -msgstr "Dùng Bề Dài 2D Cực Tiểu" +msgstr "Dùng Chiều Dài 2D Tối Thiểu" msgid "Enable the selection of chains by a minimum 2D length" -msgstr "Bật sự lựa chọn chuỗi bằng một bề dài 2D cực tiểu" +msgstr "Cho phép lựa chọn các dây chuyền bằng một chiều dài 2D tối thiểu" msgid "Use Nodes" -msgstr "Dùng Giao Điểm" +msgstr "Sử Dụng Nút" msgid "Use shader nodes for the line style" -msgstr "Dùng giao điểm tô bóng cho phong cách nét" +msgstr "Dùng các nút tô bóng cho phong cách đường nét" msgid "Same Object" -msgstr "Vật Thể Chung" +msgstr "Cùng Một Đối Tượng" msgid "If true, only feature edges of the same object are joined" -msgstr "Nét đúng, chỉ nối cạnh đặc trưng của vật thể chung" +msgstr "Nếu 'đúng' thì chỉ nối các nét viền hình thể của cùng đối tượng mà thôi" msgid "Sorting" -msgstr "Sắp Xếp Thứ Tự" +msgstr "Sắp Thứ Tự" msgid "Arrange the stacking order of strokes" -msgstr "Chọn phương pháp sắp xếp đống của nét" +msgstr "Sắp thứ tự ngăn xếp của các nét vẽ" msgid "Use Split Length" -msgstr "Dùng Bề Dài Chẻ" +msgstr "Dùng Chiều Dài Tách Đoạn" msgid "Enable chain splitting by curvilinear 2D length" -msgstr "Bật được chẻ xích bằng bề dài cong 2 chiều" +msgstr "Cho phép tách phân dây chuyền dùng chiều dài 2D của đường cong" msgid "Use Split Pattern" -msgstr "Dùng Gương Mẫu Chẻ" +msgstr "Dùng Mô Hình Tách Phân" msgid "Enable chain splitting by dashed line patterns" -msgstr "Bật được chẻ chuỗi bằng gương mẫu gạch nét" +msgstr "Cho phép tách phân dây chuyền bằng các mô hình nét gạch nối" msgid "Use Textures" @@ -21893,151 +23745,151 @@ msgstr "Dùng Chất Liệu" msgid "Enable or disable textured strokes" -msgstr "Bật/tắt vẽ nét có chất liệu" +msgstr "Bật/Tắt nét vẽ bằng chất liệu" msgid "Freehand annotation sketchbook" -msgstr "Sách ghi chú phác họa tự do" +msgstr "Sổ tay chú thích" msgid "Curve conversion error threshold" -msgstr "Ngưỡng sai lầm cho biến hóa đường cong" +msgstr "Mức lỗi tối đa trong quá trình chuyển đổi đường cong" msgid "Curve Resolution" -msgstr "Độ Phân Đường Cong" +msgstr "Độ Phân Giải của Đường Cong" msgid "Number of segments generated between control points when editing strokes in curve mode" -msgstr "Số lượng khúc được chế tạo giữa điểm kiểm soát khi đang biên tập nét trong chế độ đường cong" +msgstr "Số phân đoạn sinh tạo, giữa các điểm điều khiển, khi biên soạn các nét vẽ trong chế độ đường cong" msgid "Edit Line Color" -msgstr "Biên Tập Màu Nét" +msgstr "Màu Nét Biên Soạn" msgid "Color for editing line" -msgstr "Màu cho biên tập nét" +msgstr "Màu sắc dành cho đường nét đang được biên soạn" msgid "Maximum number of frames to show after current frame (0 = don't show any frames after current)" -msgstr "Số lượng bức ảnh tối đa để hiện sau bức ảnh hiện tại (0 = đừng hiện bức ảnh nào sau bức ảnh hiện tại)" +msgstr "Lượng khung hình tối đa hiển thị sau khung hình hiện tại (0 = không hiển thị bất cứ khung hình nào sau cái hiện tại)" msgid "Maximum number of frames to show before current frame (0 = don't show any frames before current)" -msgstr "Số lượng bức ảnh tối đa để hiện trước bức ảnh hiện tại (0 = đừng hiện bức ảnh nào trước bức ảnh hiện tại)" +msgstr "Lượng khung hình tối đa hiển thị trước khung hình hiện tại (0 = không hiển thị bất cứ khung hình nào trước cái hiện tại)" msgid "Grid Settings" -msgstr "Cài Đặt Tọa Độ" +msgstr "Sắp Đặt của Khung Lưới Đồ Thị" msgid "Settings for grid and canvas in the 3D viewport" -msgstr "Cài đặt cho tọa độ và mặt sơn trong màn chiếu 3D" +msgstr "Những sắp đặt cho đồ thị và khung vẽ trong cổng nhìn 3D" msgid "Annotation" -msgstr "Lời Ghi Chú" +msgstr "Chú Thích" msgid "Current data-block is an annotation" -msgstr "Cục dữ liệu hiện tại là lời ghi chú" +msgstr "Khối dữ liệu hiện tại là một chú thích" msgid "Stroke Paint Mode" -msgstr "Chế Đồ Sơn Nét" +msgstr "Chế Độ Vẽ Nét" msgid "Draw Grease Pencil strokes on click/drag" -msgstr "Vẽ nét Bút Sáp khi bấm/kéo" +msgstr "Vẽ các nét của Bút Chì Dầu khi bấm/kéo" msgid "Stroke Sculpt Mode" -msgstr "Chế Độ Khắc Nét" +msgstr "Chế Độ Nắn Nét Vẽ" msgid "Sculpt Grease Pencil strokes instead of viewport data" -msgstr "Khắc nét Bút Sáp thay thế dữ liệu màn chiếu" +msgstr "Điêu Khắc: Nét vẽ Bút Chì Dầu, thay vì dữ liệu cổng nhìn" msgid "Stroke Vertex Paint Mode" -msgstr "Chế Độ Sơn Đỉnh Nét" +msgstr "Chế Độ Sơn Điểm Đỉnh Nét Vẽ" msgid "Grease Pencil vertex paint" -msgstr "Sơn đỉnh Bút Sáp" +msgstr "Sơn điểm đỉnh Bút Chì Dầu" msgid "Stroke Weight Paint Mode" -msgstr "Chế Độ Sơn Nét Quyền Lượng" +msgstr "Chế Độ Sơn Trọng Lượng Nét Vẽ" msgid "Grease Pencil weight paint" -msgstr "Cài Đặt sơn quyền lượng Bút Sáp" +msgstr "Sơn trọng lượng Bút Chì Dầu" msgid "Layers" -msgstr "Lớp" +msgstr "Tầng Lớp" msgid "Onion Opacity" -msgstr "Độ Đục Bóng Ma" +msgstr "Độ Đục của Ảo Ảnh" msgid "Change fade opacity of displayed onion frames" -msgstr "Đổi phai độ đục của bức ảnh bóng ma được hiển thị" +msgstr "Đổi độ đục mờ của các khung hình ảo ảnh vỏ hành được hiển thị" msgid "Filter by Type" -msgstr "Lọc Bằng Loại" +msgstr "Thanh Lọc theo Thể Loại" msgid "Type of keyframe (for filtering)" -msgstr "Loại bức ảnh mẫu (cho bộ lọc)" +msgstr "Thể loại khung khóa (dành cho việc thanh lọc)" msgid "Include all Keyframe types" -msgstr "Gồm hết loại bức ảnh mẫu" +msgstr "Bao gồm toàn bộ các thể loại Khung Khóa" msgid "Mode to display frames" -msgstr "Chế độ đễ hiển thị bức ảnh" +msgstr "Chế độ hiển thị các khung hình" msgid "Frames in absolute range of the scene frame" -msgstr "Các bức ảnh trong phạm vi thuyệt đối của bức ảnh cảnh" +msgstr "Các khung hình trong khoảng tuyệt đối của khung hình cảnh" msgid "Frames in relative range of the Grease Pencil keyframes" -msgstr "Các bức ảnh trong phạm vi tương đối của bức ảnh Bút Sáp" +msgstr "Các khung hình trong khoảng tương đối của các khung khóa Bút Chì Dầu" msgid "Selected" -msgstr "Được Chọn" +msgstr "Đã Chọn" msgid "Only selected keyframes" -msgstr "Chỉ bức ảnh mẫu được chọn" +msgstr "Duy các khung khóa được chọn" msgid "Scale conversion factor for pixel size (use larger values for thicker lines)" -msgstr "Hệ số biến đổi cho kích cỡ của điểm ảnh (sử dụng giá trị lớn hơn cho nét dày hơn)" +msgstr "Hệ số biến đổi tỷ lệ cho kích thước điểm ảnh (dùng những giá trị lớn hơn để được những đường dày hơn)" msgid "Stroke Depth Order" -msgstr "Thứ Tự Độ Sâu Nét" +msgstr "Trật Tự Chiều Sâu của Nét Vẽ" msgid "Defines how the strokes are ordered in 3D space (for objects not displayed 'In Front')" -msgstr "Chỉ định phương pháp cho sắp xếp thứ tự trong không gian 3D (cho các vật thể hiển thị tại 'Phía Trước')" +msgstr "Xác định trật tự mà các nét vẽ được sắp xếp trong không gian 3D (dành cho các đối tượng không hiển thị 'Ở Đằng Trước')" msgid "2D Layers" -msgstr "Lớp 2D" +msgstr "Tầng Lớp 2D" msgid "Display strokes using grease pencil layers to define order" -msgstr "Hiển thị nét dùng lớp bút sáp để chỉ định thứ tự" +msgstr "Hiển thị nét vẽ dùng các tầng lớp của Bút Chì Dầu để xác định trật tự" msgid "3D Location" @@ -22045,131 +23897,131 @@ msgstr "Vị Trí 3D" msgid "Display strokes using real 3D position in 3D space" -msgstr "Hiển thị nét bằng vị trí 3D thật trong không gian 3D" +msgstr "Hiển thị nét vẽ dùng vị trí 3D thực trong không gian 3D" msgid "Stroke Thickness" -msgstr "Bề Dày Nét" +msgstr "Độ Dày của Nét Vẽ" msgid "Set stroke thickness in screen space or world space" -msgstr "Đặt bề dày nét trong không gian màn hay không gian thế giới" +msgstr "Đặt độ dày của nét vẽ trong không gian màn hình hoặc trong không gian thế giới" msgid "Set stroke thickness relative to the world space" -msgstr "Đặt bề dày nét tương đối với không gian thế giới" +msgstr "Đặt độ dày của nét vẽ tương đối với không gian thế giới" msgid "Screen Space" -msgstr "Không Gian Màn" +msgstr "Không Gian Màn Hình" msgid "Set stroke thickness relative to the screen space" -msgstr "Đặt bề dày nét tương đối với không gian màn" +msgstr "Đặt chiều rộng nét vẽ tương đối với không gian màn hình" msgid "Adaptive Resolution" -msgstr "Độ Phân Giải Ứng Phó" +msgstr "Độ Phân Giải Tùy Ứng" msgid "Set the resolution of each editcurve segment dynamically depending on the length of the segment. The resolution is the number of points generated per unit distance" -msgstr "Đặt độ phân giải của từng khúc đường cong biên tập kiểu động lý tùy bề dài của khúc. Độ phân giải là số lượng điểm được chế tạo từng đơn vị khoảng cách" +msgstr "Đặt độ phân giải của mỗi phân đoạn đường con biên soạn (editcurve) một cách năng động, tùy thuộc vào chiều dài của phân đoạn. Độ phân giải là số điểm sinh tạo trên mỗi đơn vị khoảng cách" msgid "Auto-Lock Layers" -msgstr "Tự Động Khóa Lớp" +msgstr "Tự Động Khóa các Tầng Lớp" msgid "Automatically lock all layers except the active one to avoid accidental changes" -msgstr "Khóa tự động hết lớp trừ lớp hoạt động để tránh sờ ý thay đôi đồ" +msgstr "Tự động khóa toàn bộ các tầng lớp, ngoại trừ tầng lớp đang hoạt động, để tránh những thay đổi bất ngờ" msgid "Curve Editing" -msgstr "Biên tập Đường Cong" +msgstr "Biên Soạn Đường Cong" msgid "Edit strokes using curve handles" -msgstr "Biên tập các nét bằng tay cầm đường cong" +msgstr "Biên soạn nét vẽ dùng các tay cầm của đường cong" msgid "Use Custom Ghost Colors" -msgstr "Sử Dụng Màu Bóng Ma Tùy Chọn" +msgstr "Dùng các Màu Ảo Ảnh Tùy Chọn" msgid "Use custom colors for ghost frames" -msgstr "Sử dụng màu tùy chọn cho bức ảnh bóng ma" +msgstr "Dùng những màu tùy chọn cho các khung hình ảo ảnh" msgid "Always Show Ghosts" -msgstr "Lần Nào Cũng Hiện Bóng Ma" +msgstr "Luôn Luôn Hiển Thị Ảo Ảnh" msgid "Ghosts are shown in renders and animation playback. Useful for special effects (e.g. motion blur)" -msgstr "Hiển bóng ma trong kết xuất và trong hát lại hoạt hình. Có lợi ích cho hiệu ứng đặc biệt (ví dụ làm mờ di chuyển)" +msgstr "Ảo ảnh sẽ thấy được trong kết xuất và trong khi chơi lại hoạt họa. Có Lợi cho các hiệu ứng đặc biệt (ví dụ như khi làm nhòe mờ chuyển động)" msgid "Multiframe" -msgstr "Đa Màh" +msgstr "Đa Khung Hình" msgid "Edit strokes from multiple grease pencil keyframes at the same time (keyframes must be selected to be included)" -msgstr "Biên tập nét tử nhiều bức ảnh mẫu bút sáp cùng một lượt (phải chọn các bức ảnh mẫu cho chúng nó được gồm vào) " +msgstr "Biên soạn các nét vẽ từ nhiều khung hình Bút Chì Dầu cùng một lúc (các khung khóa cần phải được lựa chọn để bao gồm trong tính toán)" msgid "Display onion keyframes with a fade in color transparency" -msgstr "Hiển thị bức ảnh mẫu bóng ma bằng một phai độ đục màu" +msgstr "Hiển thị các khung khóa ảo ảnh (vỏ hành) với một độ trong mờ rõ dần của màu sắc" msgid "Show Start Frame" -msgstr "Hiện Bức Ảnh Bắu Đầu" +msgstr "Hiển Thị Khung Hình Khởi Đầu" msgid "Display onion keyframes for looping animations" -msgstr "Hiển thị các bức ảnh bóng ma cho hoạt hình lặp lại" +msgstr "Hiển thị các khung hình vỏ hành cho những đoạn hoạt họa tuần hoàn" msgid "Onion Skins" -msgstr "Bóng Ma" +msgstr "Bóc Vỏ Hành" msgid "Show ghosts of the keyframes before and after the current frame" -msgstr "Hiện bóng ma của bức ảnh mẫu trước và sau bức ảnh hiển tại" +msgstr "Hiển thị ảo ảnh của các khung hình trước và sau khung hình hiện tại" msgid "Stroke Edit Mode" -msgstr "Chế Đồ Biên Tập Nét" +msgstr "Chế Độ Biên Soạn Nét" msgid "Edit Grease Pencil strokes instead of viewport data" -msgstr "Biên tập nét Bút Sáp thay thế dữ liệu màn chiếu" +msgstr "Biên Soạn các nét Bút Chì Dầu thay vì dữ liệu của cổng nhìn" msgid "Surface Offset" -msgstr "Dịch Bề Mặt" +msgstr "Dịch Chuyển trong chế độ Bề Mặt" msgid "Offset amount when drawing in surface mode" -msgstr "Mức dịch khi vẽ trong chế độ bề mặt" +msgstr "Lượng dịch chuyển khi vẽ trong chế độ bề mặt" msgid "Grease Pencil data-block" -msgstr "Cục dữ liệu Bút Sáp" +msgstr "Khối dữ liệu Bút Chì Dầu" msgid "Image data-block referencing an external or packed image" -msgstr "Cục dữ liệu ảnh đang tham chiếu một ảnh ngoài hay ảnh được gói lại" +msgstr "Khối dữ liệu hình ảnh tham chiếu một hình ảnh bên ngoài hay hình ảnh đóng gói" msgid "Alpha Mode" -msgstr "Chế Độ Độ Đục" +msgstr "Chế Độ Alpha" msgid "Representation of alpha in the image file, to convert to and from when saving and loading the image" -msgstr "Đại diện của độ đục trong ảnh, để biến đổi từ và đến khi lưu và nhập ảnh" +msgstr "Đại diện alpha trong tập tin hình ảnh, để chuyển đổi sang đó, hoặc từ đó, khi lưu hoặc nạp hình ảnh" msgid "Store RGB and alpha channels separately with alpha acting as a mask, also known as unassociated alpha. Commonly used by image editing applications and file formats like PNG" -msgstr "Chứa các kênh RGB và độ đục riêng nhau và dùng kênh độ đục làm mặt nạ, cũng được kêu là độ đục không liên quan. Thường thường được dùng bằng các ứng dụng biên tập ảnh và định dạng ảnh như PNG." +msgstr "Lưu các kênh Đỏ, Lục, Lam (RGB) riêng biệt với kênh alpha hành xử như một màn chắn lọc, còn được biết là alpha bất liên kết" msgid "Premultiplied" @@ -22177,19 +24029,19 @@ msgstr "Nhân Trước" msgid "Store RGB channels with alpha multiplied in, also known as associated alpha. The natural format for renders and used by file formats like OpenEXR" -msgstr "Chứa các kênh RGB được nhân với kênh độ đục, được kêu là độ đục liên quan. Đầy là định dạng tự nhiên cho các bộ kết xuất và đươđc dùng trong định dạng ảnh như OpenEXR" +msgstr "Lưu các kênh Đỏ, Lục, Lam (RGB) với kênh alpha được nhân trước vào, còn được biết là alpha liên kết. Đây là định dạng tự nhiên mà các máy kết xuất chấp nhận và được sử dụng trong các định dạng tập tin như OpenEXR" msgid "Channel Packed" -msgstr "Gói Lại Kênh" +msgstr "Đóng Gói Kênh" msgid "Different images are packed in the RGB and alpha channels, and they should not affect each other. Channel packing is commonly used by game engines to save memory" -msgstr "Những ảnh được gói lại với nhau trong các kênh RGB và độ đục, và nên không ảnh hưởng nhau. Động cơ trò chơi thường thường dùng gól lại kênh để tiết kiệm bộ nhớ" +msgstr "Có nhiều hình ảnh được đóng gói trong các kênh Đỏ, Lục, Lam (RGB) và alpha, và thường thì chúng không gây ảnh hưởng gì cho nhau. Việc đóng gói kênh thường được sử dụng trong các động cơ trò chơi để tiết kiệm bộ nhớ" msgid "Ignore alpha channel from the file and make image fully opaque" -msgstr "Không quan tâm kênh độ đục từ tập tin và làm ảnh đục toàn bộ" +msgstr "Bỏ qua kênh alpha trong tập tin và làm cho hình ảnh trở nên hoàn toàn đục" msgid "Bindcode" @@ -22197,31 +24049,31 @@ msgstr "Mã Số Trói" msgid "OpenGL bindcode" -msgstr "Mã số trói OpenGL" +msgstr "Bindcode của OpenGL" msgid "Number of channels in pixels buffer" -msgstr "Số lượng kênh của đệm điểm ảnh" +msgstr "Số lượng kênh trong bộ nhớ đệm điểm ảnh" msgid "Color Space Settings" -msgstr "Cài Đặt Không Gian Màu" +msgstr "Sắp Đặt của Không Gian Màu Sắc" msgid "Image bit depth" -msgstr "Độ sâu bit cua ảnh" +msgstr "Độ sâu màu của hình ảnh" msgid "Display Aspect" -msgstr "Hiển Thị Tỉ Số Bề Rộng/Bề Cao" +msgstr "Tỷ Lệ Tương Quan Hiển Thị" msgid "Display Aspect for this image, does not affect rendering" -msgstr "Hiển thị tỉ số Bề Rộng/Bề Cao của ảnh này, không ảnh hưởng kết xuất" +msgstr "Tỷ Lệ Tương Quan Hiển Thị cho hình ảnh này, không ảnh hưởng đến quá trình kết xuất" msgid "Format used for re-saving this file" -msgstr "Định dạng sử dụng cho lưu lại tập tin này" +msgstr "Định dạng dùng để tái lưu tập tin này lại" msgid "BMP" @@ -22229,19 +24081,19 @@ msgstr "BMP" msgid "Output image in bitmap format" -msgstr "Tên ảnh xuất bằng định dạng mảng ảnh" +msgstr "Xuất ảnh ra định dạng bitmap" msgid "Iris" -msgstr "IRIS" +msgstr "Iris/Tròng Mắt" msgid "Output image in SGI IRIS format" -msgstr "Xuất ảnh bằng định dạng SGI IRIS" +msgstr "Xuất hình ảnh ra định dạng SGI IRIS" msgid "Output image in PNG format" -msgstr "Xuất ảnh bằng định dạng PNG" +msgstr "Xuất ảnh ra định dạng PNG" msgid "JPEG" @@ -22249,7 +24101,7 @@ msgstr "JPEG" msgid "Output image in JPEG format" -msgstr "Xuất ảnh định dạng JPEG" +msgstr "Xuất ảnh ra định dạng JPEG" msgid "JPEG 2000" @@ -22257,7 +24109,7 @@ msgstr "JPEG 2000" msgid "Output image in JPEG 2000 format" -msgstr "Xuất ảnh sử dụng định dạng JPEG" +msgstr "Hình ảnh đầu ra trong định dạnh JPEG 2000" msgid "Targa" @@ -22265,7 +24117,7 @@ msgstr "Targa" msgid "Output image in Targa format" -msgstr "Xuất ảnh định dạng Targa" +msgstr "Xuất hình ảnh ra định dạng Targa" msgid "Targa Raw" @@ -22273,7 +24125,7 @@ msgstr "Targa Không Nén" msgid "Output image in uncompressed Targa format" -msgstr "Xuất ảnh định dạng Targa không nén" +msgstr "Xuất hình ảnh ra định dạng Targa không nén" msgid "Cineon" @@ -22281,7 +24133,7 @@ msgstr "Cineon" msgid "Output image in Cineon format" -msgstr "Xuất ảnh định dạng Cineon" +msgstr "Xuất ảnh ra định dạng Cineon" msgid "DPX" @@ -22289,19 +24141,19 @@ msgstr "DPX" msgid "Output image in DPX format" -msgstr "Xuất ảnh định dạng DPX" +msgstr "Xuất ảnh ra định dạng DPX" msgid "OpenEXR MultiLayer" -msgstr "OpenEXR Đa Lớp" +msgstr "OpenEXR Đa Tầng" msgid "Output image in multilayer OpenEXR format" -msgstr "Xuất ảnh định dạng OpenEXR đa lớp" +msgstr "Xuất ảnh ra định dạng OpenEXR đa tầng" msgid "Output image in OpenEXR format" -msgstr "Xuất ảnh định dạng OpenEXR" +msgstr "Xuất ảnh ra định dạng OpenEXR" msgid "Radiance HDR" @@ -22309,7 +24161,7 @@ msgstr "HDR Bức Xạ" msgid "Output image in Radiance HDR format" -msgstr "Xuất ảnh định dạng HDR Bức Xạ" +msgstr "Xuất ảnh ra định dạng Radiance HDR (HDR Bức Xạ)" msgid "TIFF" @@ -22317,7 +24169,7 @@ msgstr "TIFF" msgid "Output image in TIFF format" -msgstr "Xuất ảnh định dạng TIFF" +msgstr "Xuất ảnh ra định dạng TIFF" msgid "WebP" @@ -22325,7 +24177,7 @@ msgstr "WebP" msgid "Output image in WebP format" -msgstr "Xuất ảnh định dạng WebP" +msgstr "Xuất hình ảnh ra định dạng WebP" msgid "AVI JPEG" @@ -22337,83 +24189,83 @@ msgstr "Xuất video định dạng AVI JPEG" msgid "AVI Raw" -msgstr "AVI Không Nén" +msgstr "AVI Thô" msgid "Output video in AVI Raw format" -msgstr "Xuất ảnh định dạng AVI Không Nén" +msgstr "Xuất ảnh định dạng AVI Thô" msgid "FFmpeg Video" -msgstr "Video FFmpeg" +msgstr "Phim FFmpeg" msgid "The most versatile way to output video files" -msgstr "Cách lợi ích nhất để xuất tập tin video" +msgstr "Cách linh hoạt nhất để xuất các tập tin video" msgid "Image/Movie file name" -msgstr "Tên tập tin Ảnh/Phim" +msgstr "Tên tập tin Hình Ảnh/Phim" msgid "Image/Movie file name (without data refreshing)" -msgstr "Tên tập tin Ảnh/Phim (không nhập lại dữ liệu)" +msgstr "Tên tập tin Hình Ảnh/Phim (không đọc lại dữ liệu)" msgid "Duration" -msgstr "Đoạn Thời Gian" +msgstr "Độ Dài" msgid "Duration (in frames) of the image (1 when not a video/sequence)" -msgstr "Đoạn thời gian (số lượng bức ảnh) của ảnh (= 1 khi không phải là video/dãy ảnh)" +msgstr "Độ dài thời lượng (đơn vị khung hình) của hình ảnh (= 1 khi không phải là một video/trình tự)" msgid "Fill color for the generated image" -msgstr "Màu tô đầy cho ảnh được chế tạo" +msgstr "Màu tô phủ cho hình ảnh do máy sinh tạo" msgid "Generated Height" -msgstr "Bề Cao Ảnh Chế Tạo" +msgstr "Chiều Cao Sinh Tạo" msgid "Generated image height" -msgstr "Bề cao ảnh được chế tạo" +msgstr "Chiều cao của hình ảnh do máy sinh tạo" msgid "Generated Type" -msgstr "Loại Được Chế Tạo" +msgstr "Loại Sinh Tạo" msgid "Generated image type" -msgstr "Loại ảnh được chế tạo" +msgstr "Loại hình ảnh do máy sinh tạo" msgid "Blank" -msgstr "Trống" +msgstr "Trống/Không" msgid "Generate a blank image" -msgstr "Chế tạo một ảnh trống" +msgstr "Sinh tạo một hình ảnh trống" msgid "UV Grid" -msgstr "Đồ Thị UV" +msgstr "Khung Lưới Đồ Thị UV" msgid "Generated grid to test UV mappings" -msgstr "Chế tạo đồ thị để thử ánh xạ UV" +msgstr "Khung lưới đồ thị do máy tạo ra để thử ánh xạ UV" msgid "Generated improved UV grid to test UV mappings" -msgstr "Chế tạo đồ thị tốt hơn cho thử ánh xạ UV" +msgstr "Khung lưới đồ thị UV cải tiến do máy sinh tạo ra, dùng để thử các ánh xạ UV" msgid "Generated Width" -msgstr "Bề Rộng Ảnh Chế Tạo" +msgstr "Chiều Rộng Sinh Tạo" msgid "Generated image width" -msgstr "Bề rộng ảnh được chế tạo" +msgstr "Chiều rộng ảnh do máy tạo" msgid "Has Data" @@ -22421,55 +24273,55 @@ msgstr "Có Dữ Liệu" msgid "True if the image data is loaded into memory" -msgstr "Đúng nếu ảnh được nhập vào bộ nhớ" +msgstr "Giá trị 'Đúng' nếu dữ liệu hình ảnh được tải nhập vào bộ nhớ" msgid "Dirty" -msgstr "Dư" +msgstr "Bẩn" msgid "Image has changed and is not saved" -msgstr "Ảnh được đổi và chưa được lưu" +msgstr "Hình ảnh đã thay đổi và chưa được lưu" msgid "Is Float" -msgstr "Là Số Thật" +msgstr "Là Float" msgid "True if this image is stored in floating-point buffer" -msgstr "Đúng nếu ảnh này được chứa trong đệm số thật dấu phẩy động" +msgstr "Giá trị là Đúng (True) nếu hình ảnh này sử dụng đệm float (số thực)" msgid "Multiple Views" -msgstr "Đa Màn Chiếu" +msgstr "Đa Góc Nhìn" msgid "Image has more than one view" -msgstr "Ảnh có hơn một màn chếu" +msgstr "Hình ảnh có nhiều góc nhìn" msgid "Stereo 3D" -msgstr "Nhị Kênh 3D" +msgstr "Lập Thể 3D" msgid "Image has left and right views" -msgstr "Ảnh có màn chiếu trái và phải" +msgstr "Hình ảnh có góc nhìn trái và phải" msgid "Packed File" -msgstr "Tập Tin Bị Gói" +msgstr "Tập Tin Đã Đóng Gói" msgid "First packed file of the image" -msgstr "Tập tin đầu gói lại của ảnh" +msgstr "Tập tin đã đóng gói đầu tiên của hình ảnh" msgid "Packed Files" -msgstr "Tập Tin Gói" +msgstr "Tập Tin Đã Đóng Gói" msgid "Collection of packed images" -msgstr "Sưu tập ảnh gói" +msgstr "Bộ sưu tập các hình ảnh đã đóng gói" msgid "Pixels" @@ -22477,7 +24329,7 @@ msgstr "Điểm Ảnh" msgid "Image buffer pixels in floating-point values" -msgstr "Điểm ảnh trong đệm ảnh bằng giá trị số thật dấu phẩy động" +msgstr "Bộ đệm điểm ảnh của hình ảnh trong các giá trị dấu phẩy động" msgid "Render Slots" @@ -22485,31 +24337,39 @@ msgstr "Khe Kết Xuất" msgid "Render slots of the image" -msgstr "Các khe kết xuất của ảnh" +msgstr "Khe kết xuất của hình ảnh" msgid "X/Y pixels per meter, for the image buffer" -msgstr "X/Y điểm ảnh từng mét, cho đệm ảnh" +msgstr "Số điểm ảnh X/Y mỗi mét, cho bộ đệm hình ảnh" + + +msgid "Seam Margin" +msgstr "Mép Lề Đường Khâu" + + +msgid "Margin to take into account when fixing UV seams during painting. Higher number would improve seam-fixes for mipmaps, but decreases performance" +msgstr "Mép lề cần tính đến khi sửa chữa các đường khâu UV trong quá trình sơn. Số cao hơn sẽ cải thiện các sửa lỗi đường khâu cho mipmap, song sẽ giảm hiệu suất hoạt động" msgid "Width and height of the image buffer in pixels, zero when image data can't be loaded" -msgstr "Chiều rộng và cao của đếm ảnh (đơn vị điểm ảnh), = 0 khi không thể nhập dữ liệu ảnh" +msgstr "Chiều rộng và chiều cao của bộ đệm hình ảnh, trong đơn vị điểm ảnh. Bằng 0 khi không thể nạp dữ liệu hình ảnh được" msgid "Where the image comes from" -msgstr "Nguồn của ảnh" +msgstr "Hình ảnh từ đâu mà đến" msgid "Single Image" -msgstr "Ảnh Đơn" +msgstr "Đơn Hình Ảnh" msgid "Single image file" -msgstr "Một tập tin ảnh" +msgstr "Đơn tập tin hình ảnh" msgid "Multiple image files, as a sequence" -msgstr "Nhiều tập tin ảnh, như một trình tự ảnh" +msgstr "Bội số các tập tin hình ảnh, như một trình tự" msgid "Movie" @@ -22521,143 +24381,143 @@ msgstr "Tập tin phim" msgid "Generated image" -msgstr "Ảnh được chế tạo" +msgstr "Hình ảnh do máy sinh tạo" msgid "Viewer" -msgstr "Màn Chiếu" +msgstr "Quan Sát" msgid "Compositing node viewer" -msgstr "Giao điểm màu chiếu ghép ảnh" +msgstr "Quan sát cho các nút trong trình phối hợp" msgid "UDIM Tiles" -msgstr "Ô UDIM" +msgstr "Các Ô UDIM" msgid "Tiled UDIM image texture" -msgstr "Chất Liệu ảnh ô UDIM" +msgstr "Hình ảnh chất liệu được sắp xếp theo bố trí ô cờ (UDIM)" msgid "Stereo 3D Format" -msgstr "Định Dạng Nhị Kênh 3D" +msgstr "Định Dạng Lập Thể 3D" msgid "Settings for stereo 3d" -msgstr "Cài đặt cho nhị kênh 3D" +msgstr "Sắp đặt cho âm lập thể 3D" msgid "Image Tiles" -msgstr "Ô Ảnh" +msgstr "Ô Hình Ảnh" msgid "Tiles of the image" -msgstr "Các ô của ảnh" +msgstr "Các ô của hình ảnh" msgid "How to generate the image" -msgstr "Làm sao chế tạo ảnh" +msgstr "Phương pháp sinh tạo ảnh" msgid "Multilayer" -msgstr "Đa Lớp" +msgstr "Đa Tầng" msgid "UV Test" -msgstr "Kiểm Tra UV" +msgstr "Thử UV" msgid "Render Result" -msgstr "Kết Qủa Kết Xuất" +msgstr "Kết Quả Kết Xuất" msgid "Compositing" -msgstr "Ghép Ảnh" +msgstr "Tổng Hợp" msgid "Deinterlace" -msgstr "Xóa Xen Kẽ" +msgstr "Gộp Trường" msgid "Deinterlace movie file on load" -msgstr "Đổi tập tin phim từ xen kẽ sang tuần tự khi nhập nó" +msgstr "Gộp trường tập tin phim trong khi nạp" msgid "Float Buffer" -msgstr "Đệm Số Thật" +msgstr "Bộ Đệm Float" msgid "Generate floating-point buffer" -msgstr "Chế tạo đệm số thật dấu phẩy động" +msgstr "Sinh tạo bộ đệm số thực" msgid "Half Float Precision" -msgstr "Độ Chính Xác Dấu Phẩy Động Nửa" +msgstr "Số Thực với Độ Chính Xác Một Nửa" msgid "Use 16 bits per channel to lower the memory usage during rendering" -msgstr "Dùng 16 bit mỗi kênh cho giảm sử dụng bộ nhớ khi kết xuất" +msgstr "Sử dụng 16bits một kênh để hạ thấp lượng bộ nhớ sử dụng trong khi kết xuất" msgid "Use Multi-View" -msgstr "Dùng Đa Màn" +msgstr "Dùng Đa Góc Nhìn" msgid "Use Multiple Views (when available)" -msgstr "Dùng Đa Màn (khi có)" +msgstr "Dùng Đa Góc Nhìn (nếu khả dĩ)" msgid "View as Render" -msgstr "Hiện như Kết Xuất" +msgstr "Hiển Thị như Bản Kết Xuất" msgid "Apply render part of display transformation when displaying this image on the screen" -msgstr "Áp dụng biến hóa kết xuát khi hiển thị ảnh trên màn" +msgstr "Áp dụng phần kết xuất của biến hóa hiển thị khi hiển thị hình ảnh này trên màn hình" msgid "Views Format" -msgstr "Định Dạng Màn" +msgstr "Định Dạng các Góc Nhìn" msgid "Mode to load image views" -msgstr "Chế độ cho đọc màn ảnh" +msgstr "Chế độ nạp các góc nhìn của hình ảnh" msgid "Individual" -msgstr "Riêng" +msgstr "Cá Nhân" msgid "Individual files for each view with the prefix as defined by the scene views" -msgstr "Tập tin riêng cho mỗi màn mà có đầu được xác định bởi màn cảnh" +msgstr "Cá nhân các tập tin cho từng góc nhìn một với tiền tố được xác định bởi các góc nhìn của cảnh" msgid "Single file with an encoded stereo pair" -msgstr "Một tập tin có một đôi nhị kênh được mã hóa" +msgstr "Một tập tin có hai hình lập thể được mã hóa" msgid "Shape keys data-block containing different shapes of geometric data-blocks" -msgstr "Cục dữ liệu dạng mẫu chứa nhiều hình dạng của cục dữ liệu hình dạng" +msgstr "Khối dữ liệu hình mẫu có chứa nhiều hình thể của khối dữ liệu hình học khác nhau" msgid "Evaluation time for absolute shape keys" -msgstr "Thời gian tính toán cho mẫu dạng tuyệt đối" +msgstr "Thời gian tính toán cho các hình mẫu tuyệt đối" msgid "Key Blocks" -msgstr "Cục Dạng Mẫu" +msgstr "Khối Hình Mẫu" msgid "Shape keys" -msgstr "Dạng Mẫu" +msgstr "Hình mẫu" msgid "Reference Key" -msgstr "Dạng Mẫu Tham Chiếu" +msgstr "Hình Mẫu Tham Chiếu" msgid "Make shape keys relative, otherwise play through shapes as a sequence using the evaluation time" -msgstr "Làm dạng mẫu tương đối, nếu không hát qua hết hình dạng như một trình tự bằng sử dụng thời gian tính tóan" +msgstr "Tương đối hóa các hình mẫu, nếu không, chơi các tư thế như một trình tự, dùng thời gian tính toán" msgid "User" @@ -22665,15 +24525,15 @@ msgstr "Người Dùng" msgid "Data-block using these shape keys" -msgstr "Cục dữ liệu đang dùng các dạng mẫu này" +msgstr "Những khối dữ liệu đang sử dụng các hình mẫu này" msgid "Lattice data-block defining a grid for deforming other objects" -msgstr "Cục dữ liệu rào lưới chỉ định một đồ thị cho mèo hóa vật thể khác" +msgstr "Khối dữ liệu giàn lưới xác định một khung lưới đồ thị dùng để biến dạng những đối tượng khác" msgid "Interpolation Type U" -msgstr "Loại Suy Nội U" +msgstr "Nội Suy Loại U" msgid "Catmull-Rom" @@ -22681,109 +24541,129 @@ msgstr "Catmull-Rom" msgid "BSpline" -msgstr "Mẫu Cong B" +msgstr "Chốt Trục Cơ Sở" msgid "Interpolation Type V" -msgstr "Loại Suy Nội V" +msgstr "Nội Suy Loại V" msgid "Interpolation Type W" -msgstr "Loại Suy Nội W" +msgstr "Nội Suy Loại W" msgid "Points of the lattice" -msgstr "Các điểm của rào lưới" +msgstr "Các điểm của lưới rào" msgid "U" msgstr "U" +msgid "Points in U direction (cannot be changed when there are shape keys)" +msgstr "Điểm chỉ vào chiều hướng U (không thể thay đổi được khi có các hình mẫu)" + + msgid "V" msgstr "V" +msgid "Points in V direction (cannot be changed when there are shape keys)" +msgstr "Điểm chỉ vào chiều hướng V (không thể thay đổi được khi có các hình mẫu)" + + msgid "W" msgstr "W" +msgid "Points in W direction (cannot be changed when there are shape keys)" +msgstr "Điểm chỉ vào chiều hướng W (không thể thay đổi được khi có các hình mẫu)" + + msgid "Only display and take into account the outer vertices" -msgstr "Chỉ hiển thị và quan âm đến các đỉnh ngoài" +msgstr "Chỉ hiển thị và tính đến các điểm đỉnh bên ngoài mà thôi" msgid "Vertex group to apply the influence of the lattice" -msgstr "Áp dụng sự ảnh hưởng của rào lưới với nhóm đỉnh nào" +msgstr "Nhóm điểm đỉnh để áp dụng tác động của lưới rào" msgid "External .blend file from which data is linked" -msgstr "Tập tin .blend ngoài thì có dữ liệu được kết nối" +msgstr "Tập tin .blend ở ngoài mà dữ liệu được liên kết" msgid "Path to the library .blend file" msgstr "Đường dẫn đến tập tin thư viện .blend" +msgid "Library Overrides Need resync" +msgstr "Vượt Quyền Thư Viện Cần đồng bộ hóa lại" + + +msgid "True if this library contains library overrides that are linked in current blendfile, and that had to be recursively resynced on load (it is recommended to open and re-save that library blendfile then)" +msgstr "Đúng (True) nếu thư viện này chứa các vượt quyền thư viện đã liên kết trong tập tin blend hiện tại và phải được đồng bộ hóa một cách đệ quy khi tải nạp (sau đó nên mở và tái lưu tập tin blend thư viện ấy)" + + msgid "Version of Blender the library .blend was saved with" -msgstr "Phiên bản Blender đã dùng để lưu thư viện .blender" +msgstr "Phiên bản của Blender mà thư viện .blend đã sử dụng khi lưu" msgctxt "Light" msgid "Light" -msgstr "Đèn" +msgstr "Nguồn/Ánh Sáng" msgid "Light data-block for lighting a scene" -msgstr "Cục dữ liệu bóng đèn cho trang trí ánh sáng một cảnh" +msgstr "Khối dữ liệu bố trí ánh sáng cho một cảnh" msgid "Light color" -msgstr "Màu đèn" +msgstr "Màu của ánh sáng" msgid "Cutoff Distance" -msgstr "Khoảng Cách Cắt" +msgstr "Khoảng Giới Hạn" msgid "Distance at which the light influence will be set to 0" -msgstr "Khoảng cách sự ảnh hưởng của đèn được đặt bằng 0" +msgstr "Khoảng cách mà tại đó sự ảnh hưởng của nguồn sáng sẽ được đặt là 0 (Tắt)" msgid "Cycles Light Settings" -msgstr "Cài Đặt Cycles" +msgstr "Sắp Đặt Ánh Sáng của Cycles" msgid "Cycles light settings" -msgstr "Cài đặt đèn Cycles" +msgstr "Sắp đặt về ánh sáng của Cycles" msgid "Diffuse Factor" -msgstr "Hệ Số Tán Xạ" +msgstr "Hệ Số Khuếch Tán" msgid "Diffuse reflection multiplier" -msgstr "Hệ số để nhân tán xạ phản xạ" +msgstr "Số nhân cho ánh phản quang khuếch tán" msgid "Node tree for node based lights" -msgstr "Cây giao điểm cho đèn cơ sở giao điểm" +msgstr "Cây nút dành cho việc bố trí ánh sáng trên cơ sở nút" msgid "Specular Factor" -msgstr "Hệ Số Cao Quang" +msgstr "Hệ Số Lóng Lánh" msgid "Specular reflection multiplier" -msgstr "Hệ số để nhân ánh sáng phản xạ" +msgstr "Số nhân cho độ phản quang của ánh lóng lánh" msgctxt "Light" msgid "Type" -msgstr "Loại" +msgstr "Thể Loại" msgid "Type of light" -msgstr "Loại đèn" +msgstr "Thể loại nguồn sáng" msgctxt "Light" @@ -22792,7 +24672,7 @@ msgstr "Điểm" msgid "Omnidirectional point light source" -msgstr "Nguồn ánh sáng điểm phát tia sáng toàn hướng " +msgstr "Nguồn ánh sáng phát tia đẳng hướng" msgctxt "Light" @@ -22801,37 +24681,37 @@ msgstr "Mặt Trời" msgid "Constant direction parallel ray light source" -msgstr "Nguồn ánh sáng phát tia hướng không đổi song song" +msgstr "Nguồn ánh sáng phát tia song song theo chiều hướng bất biến" msgctxt "Light" msgid "Spot" -msgstr "Nón" +msgstr "Đèn Rọi" msgid "Directional cone light source" -msgstr "Nguồn ánh sáng định hướng hình nón" +msgstr "Nguồn ánh sáng phát tia hữu hướng hình nón" msgctxt "Light" msgid "Area" -msgstr "Điện Tích" +msgstr "Diện Tích/Khu Vực" msgid "Directional area light source" -msgstr "Nguồn ánh sáng điện tích định hướng" +msgstr "Nguồn ánh sáng phát tia hữu hướng trên diện rộng" msgid "Custom Attenuation" -msgstr "Sự Giảm Tùy Chọn" +msgstr "Độ Tắt Dần Tùy Chỉnh" msgid "Use custom attenuation distance instead of global light threshold" -msgstr "Sử dụng khoảng cách sự giảm tùy chọn thay thế ngưỡng độ sáng toàn cầu" +msgstr "Dùng khoảng cách tắt dần tùy chỉnh thay vì giới hạn ánh sáng toàn cầu" msgid "Use shader nodes to render the light" -msgstr "Sử dụng giao điểm bộ tô sắc để kết xuất đèn" +msgstr "Sử dụng các nút tô bóng (shader nodes) để kết xuất ánh sáng" msgid "Volume Factor" @@ -22839,64 +24719,64 @@ msgstr "Hệ Số Thể Tích" msgid "Volume light multiplier" -msgstr "Hệ số nhân cho đèn thể tích" +msgstr "Số nhân ánh sáng thể tích" msgid "Area Light" -msgstr "Đèn Diện Tích" +msgstr "Đèn Pha" msgid "Directional area Light" -msgstr "Đèn điện tích định hướng" +msgstr "Nguồn Ánh Sáng diện rộng hữu hướng" msgid "Contact Shadow Bias" -msgstr "Thành Kiến Bóng Tối Đụng" +msgstr "Độ Dịch Bóng Tối Tiếp Xúc" msgid "Bias to avoid self shadowing" -msgstr "Thành kiến để tránh tự bóng tối" +msgstr "Độ thiên lệch để tránh bản thân ngả bóng tối" msgid "Contact Shadow Distance" -msgstr "Khoảng Cách Bóng Tối Đụng" +msgstr "Khoảng Cách Bóng Tối Tiếp Xúc" msgid "World space distance in which to search for screen space occluder" -msgstr "Khoảng cách trong không gian thế giới để tìm kiếm đố hập thu không gian màn chiếu" +msgstr "Khoảng cách trong không gian thế giới để lùng tìm vật che khuất không gian màn hình" msgid "Contact Shadow Thickness" -msgstr "Độ Đặt Bóng Tối Đụng" +msgstr "Độ Dày Bóng Tối Tiếp Xúc" msgid "Pixel thickness used to detect occlusion" -msgstr "Độ dày điểm ảnh để phát hiện hấp thụ" +msgstr "Độ dày của điểm ảnh sử dụng để phát hiện vùng Hấp Thụ Quang Xạ" msgctxt "Light" msgid "Power" -msgstr "Lũy Thừa" +msgstr "Năng Lượng" msgid "Light energy emitted over the entire area of the light in all directions" -msgstr "Năng lượng ánh sáng được trên toàn diện tích của đèn cho mỗi hướng" +msgstr "Năng lượng ánh sáng phát ra trên toàn thể diện tích của ánh sáng trong mọi phía" msgid "Shadow Buffer Bias" -msgstr "Thành Kiến Đệm Bóng Tối" +msgstr "Thiên Lệch của Đệm Bóng Tối" msgid "Bias for reducing self shadowing" -msgstr "Thành kiến cho giảm bất tự bóng tối" +msgstr "Mức thiên lệch để thuyên giảm hiện tượng tự ngả bóng bản thân" msgid "Shadow Buffer Clip Start" -msgstr "Đệm Bóng Tối Cắt Gần" +msgstr "Điểm Xén Bộ Đệm Bóng Tối Đằng Trước" msgid "Shadow map clip start, below which objects will not generate shadows" -msgstr "Bản đồ bóng tối không thể thấy vật thể gần hơn này và không chế tạo bóng tối" +msgstr "Điểm xén ánh xạ bóng tối ở đằng trước. Trước điểm này, các đối tượng sẽ không có bóng tối" msgid "Shadow Color" @@ -22904,123 +24784,135 @@ msgstr "Màu Bóng Tối" msgid "Color of shadows cast by the light" -msgstr "Màu của bóng tối phát từ đèn" +msgstr "Màu của bóng tối ngả xuống do ánh sáng chiếu vào" msgid "Shadow Soft Size" -msgstr "Kích Cỡ Mềm Bóng Tối" +msgstr "Kích Thước Bóng Tối Mịn" msgid "Light size for ray shadow sampling (Raytraced shadows)" -msgstr "Kích cỡ đèn cho lấy mẫu vật tia bóng tối (bóng tối được Dò Tia)" +msgstr "Kích thước ánh sáng dùng cho quá trình lấy mẫu tia bóng tối (bóng tối Dò Tia)" + + +msgid "Shadow Softness Factor" +msgstr "Hiệu Số Độ Mềm của Bóng Ngả" + + +msgid "Scale light shape for smaller penumbra" +msgstr "Đổi tỷ lệ hình dạng ánh sáng để cho vùng nửa tối nhỏ hơn" msgid "Shape of the area Light" -msgstr "Hình dạng của Đèn diện tích" +msgstr "Hình dạng của Ánh Sáng đèn pha" msgid "Rectangle" -msgstr "Chữ Nhật" +msgstr "Hình Chữ Nhật" msgid "Disk" -msgstr "Vòng Tròn" +msgstr "Hình Đĩa" msgid "Ellipse" -msgstr "Elip" +msgstr "Hình Elip" msgid "Size of the area of the area light, X direction size for rectangle shapes" -msgstr "Diện tích của đèn diện tích, kích cỡ X cho hình chữ nhật" +msgstr "Kích thước diện tích của nguồn sáng diện tích, kích thước hướng X cho các hình dạng hình chữ nhật" msgid "Size Y" -msgstr "Kích Cỡ Y" +msgstr "Kích Thước Y" msgid "Size of the area of the area light in the Y direction for rectangle shapes" -msgstr "Diện tích của đèn diện tích, kích cỡ Y cho hình dạng chữ nhật" +msgstr "Kích thước diện tích của nguồn sáng diện tích, kích thước chiều Y cho các hình dạng là hình chữ nhật" msgid "How widely the emitted light fans out, as in the case of a gridded softbox" -msgstr "Bề rộng cho phân phối ánh sáng được phát ra, như trường hợp hộp mềm có độ thị" +msgstr "Chiều rộng lan tỏa của ánh sáng phát ra là bao nhiêu, như trong trường hợp hộp lưới mềm tản sáng" msgid "Contact Shadow" -msgstr "Bóng Tối Đụng" +msgstr "Bóng Tối do Tiếp Xúc" msgid "Use screen space ray-tracing to have correct shadowing near occluder, or for small features that does not appear in shadow maps" -msgstr "Sử dụng dò tia trong không gian màn chiếu để có bóng tối đúng gần đồ hấp thụ, hoặc cho chi tiết nhỏ không xuất hiện trong bản đồ bóng tối" +msgstr "Sử dụng tính năng dò tia không gian màn hình để tạo bóng ngả chính xác gần vị trí đối tượng che khuất, hoặc đối với các chi tiết địa hình nhỏ không xuất hiện trong bản đồ bóng tối" msgid "Point Light" -msgstr "Đèn Điểm" +msgstr "Bóng Đèn" msgid "Omnidirectional point Light" -msgstr "Đèn điểm phát ánh sang toàn cầu" +msgstr "Nguồn Ánh Sáng đẳng hướng" msgid "Spot Light" -msgstr "Đèn Hình Nón" +msgstr "Đèn Rọi" msgid "Directional cone Light" -msgstr "Đèn định hướng hình nón" +msgstr "Nguồn Ánh Sáng hữu hướng theo hình nón" msgid "The energy this light would emit over its entire area if it wasn't limited by the spot angle" -msgstr "Năng lượng được phát từ toàn diện tích của đèn này nếu không bị hạn chế bởi một hình nón" +msgstr "Năng lượng mà ánh sáng này sẽ phát ra trên toàn thể diện tích của nó nếu không bị hạn chế bởi góc độ của pha" msgid "Show Cone" -msgstr "Hiện Hình Nón" +msgstr "Hiển Thị Hình Nón" msgid "Display transparent cone in 3D view to visualize which objects are contained in it" -msgstr "Hiển thị nón trong suốt trong màn chiếu 3D để được nhìn thấy các vật thể nào ở trong nó" +msgstr "Hiển thị hình nón trong suốt trong góc nhìn 3D để hình dung đối tượng nào đang nằm trong đó" msgid "Spot Blend" -msgstr "Pha Trộn Hình Nón" +msgstr "Pha Trộn Pha Đèn" msgid "The softness of the spotlight edge" -msgstr "Độ mềm của cạnh đèn hình nón" +msgstr "Độ mịn mép ánh sáng của đèn pha" msgid "Spot Size" -msgstr "Kích Cỡ Hình Nón" +msgstr "Kích Thước Pha Đèn" msgid "Angle of the spotlight beam" -msgstr "Góc phát tia sáng của đèn hình nón" +msgstr "Góc xề của tia đèn pha" msgid "Cast a square spot light shape" -msgstr "Phát hính nón vuông" +msgstr "Phát tia đèn pha dùng hình vuông" msgid "Sun Light" -msgstr "Đèn Mặt Trời" +msgstr "Ánh Sáng Mặt Trời" msgid "Constant direction parallel ray Light" -msgstr "Đèn định hướng song song" +msgstr "Nguồn Ánh Sáng phát tia song song theo chiều hướng bất biến" msgid "Angular diameter of the Sun as seen from the Earth" -msgstr "Đường kinh góc của Mặt Trời khi nhìn từ Trái Đất" +msgstr "Đường kính góc của Mặt Trời như nhìn thấy từ Trái Đất" + + +msgid "Sunlight strength in watts per meter squared (W/m²)" +msgstr "Cường độ ánh sáng mặt trời tính bằng watt trên mét vuông (W/m2)" msgid "Cascade Count" -msgstr "Số Lượng Tầng" +msgstr "Số Tầng Chồng" msgid "Number of texture used by the cascaded shadow map" -msgstr "Số lượng chất liệu được bản đồ bóng tối tầng được sử dụng" +msgstr "Số lượng chất liệu sử dụng bởi bản đồ bóng tối đổ về phía xa dần" msgid "Exponential Distribution" @@ -23028,75 +24920,195 @@ msgstr "Phân Phối Lũy Thừa" msgid "Higher value increase resolution towards the viewpoint" -msgstr "Giá trí càng cao tăng độ phân giải càng cao gần điểm nhìn" +msgstr "Giá trị cao hơn làm tăng độ phân giải về phía điểm nhìn" msgid "Cascade Fade" -msgstr "Phai Tầng" +msgstr "Lượng Hòa Nhòe giữa các Tầng Chồng" msgid "How smooth is the transition between each cascade" -msgstr "Độ mịn chuyển tiếp giữa mỗi tầng" +msgstr "Sự chuyển tiếp giữa các tầng chồng mịn màng là bao nhiêu" msgid "Cascade Max Distance" -msgstr "Khoảng Cách Cực Đại Tầng" +msgstr "Khoảng Cách Chồng Tầng Tối Đa" msgid "End distance of the cascaded shadow map (only in perspective view)" -msgstr "Khoảng cách cuối của bản đồ bóng tối tầng (chỉ có trong màn chiếu phổi cảnh)" +msgstr "Khoảng cách kết thúc của ánh xạ bóng tối đổ về phía xa dần (duy trong góc nhìn phối cảnh (xa gần))" + + +msgid "Shadow Tracing Max Distance" +msgstr "Khoảng Cách Dò Bóng Tối Tối Đa" + + +msgid "Maximum distance a shadow map tracing ray can travel" +msgstr "Khoảng cách tối đa mà một bản đồ bóng tối dò tia có thể di chuyển" msgid "Light Probe data-block for lighting capture objects" -msgstr "Cục dữ liệu Quang Kế cho vật thể bắt ánh sáng" +msgstr "Khối dữ liệu Bộ Thăm Dò Ánh Sáng dành cho những đối tượng tóm bắt ánh sáng" msgid "Probe clip end, beyond which objects will not appear in reflections" -msgstr "Giới hạn kết thúc, vật thể xa hơn sẽ không xuất trong phản xạ" +msgstr "Điểm kết thúc sự thăm dò ánh sáng. Những đối tượng nằm ngoài điểm này sẽ không xuất hiện trong ánh phản quang" msgid "Probe clip start, below which objects will not appear in reflections" -msgstr "Giới hạn bắt đầu, vật thể gần hơn sẽ không xuất hiện trong phản xạ" +msgstr "Điểm khởi đầu sự thăm dò ánh sáng. Những đối tượng nằm dưới điểm này sẽ không xuất hiện trong ánh phản quang" msgid "Control how fast the probe influence decreases" -msgstr "Điều khiển tốc độ giảm sự ảnh hưởng của ánh sáng kế" +msgstr "Điều chế tốc độ suy giảm của sự thăm dò ánh sáng" + + +msgid "Bake Samples" +msgstr "Nướng Mẫu Vật" + + +msgid "Number of ray directions to evaluate when baking" +msgstr "Số lượng chiều hướng tia xạ để đánh giá khi nướng" + + +msgid "Capture Emission" +msgstr "Nắm Bắt Sự Phát Xạ" + + +msgid "Bake emissive surfaces for more accurate lighting" +msgstr "Nướng các bề mặt phát xạ để có ánh sáng chính xác hơn" + + +msgid "Capture Indirect" +msgstr "Nắm Bắt Ánh Sáng Gián Tiếp" + + +msgid "Bake light bounces from light sources for more accurate lighting" +msgstr "Nướng ánh sáng dội lại từ các nguồn sáng để có ánh sáng chính xác hơn" + + +msgid "Capture World" +msgstr "Nắm Bắt Thế Giới" + + +msgid "Bake incoming light from the world, instead of just the visibility, for more accurate lighting, but lose correct blending to surrounding irradiance volumes" +msgstr "Nướng ánh sáng tới từ thế giới, thay vì chỉ có mức hữu hình, để có ánh sáng chính xác hơn, song sẽ làm mất khả năng pha trộn chính xác với các khối lượng bức xạ xung quanh" msgid "Clamp Direct" -msgstr "Kẹp Lại Trực Tiếp" +msgstr "Hạn Định Trực Tiếp" + + +msgid "Clamp the direct lighting intensity to reduce noise (0 to disable)" +msgstr "Hạn định cường độ chiếu sáng trực tiếp để giảm nhiễu (0 để tắt đi)" msgid "Clamp Indirect" -msgstr "Kẹp Lại Gián Tiếp" +msgstr "Hạn Định Gián Tiếp" + + +msgid "Clamp the indirect lighting intensity to reduce noise (0 to disable)" +msgstr "Hạn định cường độ chiếu sáng gián tiếp để giảm nhiễu (0 để tắt đi)" + + +msgid "Dilation Radius" +msgstr "Bán Kính Giãn Nở" + + +msgid "Radius in grid sample to search valid grid samples to copy into invalid grid samples" +msgstr "Bán kính trong mẫu vật khung lưới đồ thị để tìm kiếm các mẫu vật khung lưới hợp lệ hòng sao chép vào các mẫu vật khung lưới đồ thị bất hợp lệ" + + +msgid "Dilation Threshold" +msgstr "Ngưỡng Giãn Nở" + + +msgid "Ratio of front-facing surface hits under which a grid sample will reuse neighbors grid sample lighting" +msgstr "Tỷ lệ va đập vào bề mặt phía trước mà theo đó mẫu vật khung lưới đồ thị sẽ tái dụng ánh sáng của mẫu vật khung lưới kề cận" + + +msgid "Capture Escape Bias" +msgstr "Nắm Bắt sự Thiên Lệch Trốn Thoát" + + +msgid "Moves capture points outside objects" +msgstr "Di chuyển các điểm nắm bắt ra ngoài đối tượng" + + +msgid "Facing Bias" +msgstr "Thiên Lệch Đối Mặt" msgid "Smoother irradiance interpolation but introduce light bleeding" -msgstr "Suy nội sự rọi mịn hơn nhưng nó có tràn ánh sáng" +msgstr "Nội suy ánh tỏa sáng mịn màng hơn song sẽ tạo ra sự rò rỉ ánh sáng" + + +msgid "Normal Bias" +msgstr "Thiên Lệnh Pháp Tuyến" + + +msgid "Offset sampling of the irradiance grid in the surface normal direction to reduce light bleeding" +msgstr "Sự lấy mẫu dịch chuyển của khung lưới đồ thị bức xạ theo chiều hướng pháp tuyến bề mặt để thuyên giảm hiện tượng rò rỉ ánh sáng" msgid "Resolution X" -msgstr "Độ Phôn Giải X" +msgstr "Độ Phân Giải X" + + +msgid "Number of samples along the x axis of the volume" +msgstr "Số mẫu vật dọc theo trục x của thể tích" msgid "Resolution Y" msgstr "Độ Phân Giải Y" +msgid "Number of samples along the y axis of the volume" +msgstr "Số mẫu vật dọc theo trục y của thể tích" + + msgid "Resolution Z" msgstr "Độ Phân Giải Z" +msgid "Number of samples along the z axis of the volume" +msgstr "Số mẫu vật dọc theo trục z của thể tích" + + +msgid "Capture Surface Bias" +msgstr "Nắm Bắt Thiên Lệch Bề Mặt" + + +msgid "Moves capture points position away from surfaces to avoid artifacts" +msgstr "Di chuyển vị trí các điểm nắm bắt khỏi bề mặt để tránh tạo các giả tượng" + + +msgid "Validity Threshold" +msgstr "Ngưỡng của Tính Hợp Lệ" + + +msgid "Ratio of front-facing surface hits under which a grid sample will not be considered for lighting" +msgstr "Tỷ lệ bề mặt đối diện trước va đập trúng mà mẫu vật khung lưới đồ thị sẽ không cân nhắc cho sự chiếu sáng" + + +msgid "View Bias" +msgstr "Thiên Lệch Góc Nhìn" + + +msgid "Offset sampling of the irradiance grid in the viewing direction to reduce light bleeding" +msgstr "Sự lấy mẫu dịch chuyển của khung lưới đồ thị bức xạ theo hướng quan sát để giảm hiện tượng rò rỉ ánh sáng" + + msgid "Influence Distance" -msgstr "Khoảng Cách Sự Ảnh Hưởng" +msgstr "Khoảng Tác Động" msgid "Influence distance of the probe" -msgstr "Khoảng cách sự ảnh hưởng của ánh sáng kế" +msgstr "Khoảng tác động của bộ thăm dò tia xạ" msgid "Type of influence volume" -msgstr "Loại thể tích sự ảnh hướng" +msgstr "Loại thể tích ảnh hưởng" msgid "Intensity" @@ -23104,15 +25116,15 @@ msgstr "Cường Độ" msgid "Modify the intensity of the lighting captured by this probe" -msgstr "Chỉnh sửa cường độ của ánh sáng thì ánh sáng kế được bắt" +msgstr "Sửa đổi cường độ của ánh sáng mà điểm thăm dò này nắm bắt" msgid "Invert Collection" -msgstr "Đảo Nghịch Sưu Tập" +msgstr "Đảo Bộ Sưu Tập" msgid "Invert visibility collection" -msgstr "Đảo nghịch hiển thị của sưu tập" +msgstr "Đảo nghịch tầm nhìn của bộ sưu tập" msgid "Parallax Radius" @@ -23120,19 +25132,19 @@ msgstr "Bán Kính Thị Sai" msgid "Lowest corner of the parallax bounding box" -msgstr "Góc thấp nhất của hộp bao quanh thị sai" +msgstr "Góc thấp nhất của hộp viền thị sai" msgid "Type of parallax volume" -msgstr "Loại thể tích thị sai" +msgstr "Thể loại thể tích thị sai" msgid "Show the clipping distances in the 3D view" -msgstr "Hiện khoảng cách cắt trong màn chiếu 3D" +msgstr "Hiển thị các khoảng cách tầm nhìn trong khung nhìn 3D" msgid "Show the influence volume in the 3D view" -msgstr "Hiện thể tích sự ảnh hưởng trong màn chiều 3D" +msgstr "Hiển thị thể tích ảnh hưởng trong khung nhìn 3D" msgid "Parallax" @@ -23140,75 +25152,83 @@ msgstr "Thị Sai" msgid "Show the parallax correction volume in the 3D view" -msgstr "Hiện thể tích chỉnh sửa thị sai trong màn chiếu 3D" +msgstr "Hiển thị thể tích sửa thị sai trong khung nhìn 3D" + + +msgid "Surfel Density" +msgstr "Mật Độ Phần Tử Bề Mặt" + + +msgid "Number of surfels per unit distance (higher values improve quality)" +msgstr "Số lượng phần tử bề mặt trên mỗi đơn vị khoảng cách (giá trị cao hơn sẽ cải thiện chất lượng tốt hơn)" msgid "Type of light probe" -msgstr "Loại quang kế" +msgstr "Thể loại bộ thăm dò ánh sáng" msgid "Use Custom Parallax" -msgstr "Sử Dụng Thị Sai Tùy Chọn" +msgstr "Sử Dụng Thị Sai Tùy Chỉnh" msgid "Enable custom settings for the parallax correction volume" -msgstr "Bật cài đặt tùy chọn cho thể tích chỉnh sửa thị sai" +msgstr "Cho phép những sắp đặt tùy chỉnh đối với thể tích sửa thị sai" msgid "Visibility Bleed Bias" -msgstr "Thành Kiến Tràn Sự Hiển Thị" +msgstr "Thiên Lệch về Rò Rỉ trong Tầm Nhìn" msgid "Bias for reducing light-bleed on variance shadow maps" -msgstr "Thành kiến cho giảm tràn ánh sáng cho bản đồ bõng tối phương sai" +msgstr "Mức thiên lệch nhằm làm giảm độ rò rỉ ánh sáng trong các ánh xạ bóng tối khác nhau" msgid "Visibility Blur" -msgstr "Mờ Sự Hiển Thị" +msgstr "Độ Nhòe của Tầm Nhìn" msgid "Filter size of the visibility blur" -msgstr "Kích cỡ bộ lọc của mờ hóa sự hiển thị" +msgstr "Cỡ thanh lọc độ nhòe mờ trong tầm nhìn" msgid "Visibility Bias" -msgstr "Thành Kiến Sự Hiển Thị" +msgstr "Thiên Lệch trong Tầm Nhìn" msgid "Visibility Collection" -msgstr "Sưu Tập Sự Hiển Thị" +msgstr "Bộ Sưu Tập trong Tầm Nhìn" msgid "Restrict objects visible for this probe" -msgstr "Hạn chế vật thể hiển thị cho ánh sáng kế này" +msgstr "Hạn chế các đối tượng nhìn thấy được cho bộ thăm dò ánh sáng này" msgid "Mask data-block defining mask for compositing" -msgstr "Cục dữ liệu mặt nạ đang chỉ định mặt nạ cho ghép" +msgstr "Khối dữ liệu Màn Chắn Lọc định nghĩa màn chắn lọc cho quá trình tổng hợp" msgid "Active Shape Index" -msgstr "Chi Số Hình Dạng Hoạt Động" +msgstr "Chỉ Số Hình Dạng đang Hoạt Động" msgid "Index of active layer in list of all mask's layers" -msgstr "Chỉ số của lớp hoạt động trong danh sách của tất cả lớp của mặt nạ" +msgstr "Chỉ số của tầng đang hoạt động trong danh sách toàn bộ các tầng màn chắn lọc" msgid "Final frame of the mask (used for sequencer)" -msgstr "Bức ảnh cuối của mặt nạ (dùng cho bộ trình tự)" +msgstr "Khung hình cuối của màn chắn lọc (dùng cho trình phối hình)" msgid "First frame of the mask (used for sequencer)" -msgstr "Bức ảnh đầu của mặt nạ (dùng cho bộ trình tự)" +msgstr "Khung hình đầu của màn chắn lọc (dùng cho trình phối hình)" msgid "Collection of layers which defines this mask" -msgstr "Sưu tập lớp được chỉ định mặt nạ này" +msgstr "Bộ sưu tập các tầng định nghĩa màn chắn lọc này" msgid "Material data-block to define the appearance of geometric objects for rendering" -msgstr "Cục dữ liệu vật liệu cho chỉ định sự hiển thị của vật thể hình dạng cho kết xuất" +msgstr "Khối dữ liệu về nguyên vật liệu xác định hình dạng của các đối tượng hình học khi kết xuất" msgid "Clip Threshold" @@ -23216,187 +25236,252 @@ msgstr "Ngưỡng Cắt" msgid "A pixel is rendered only if its alpha value is above this threshold" -msgstr "Một điểm ảnh được kết xuất nếu giá trị độ đục cao hơn ngưỡng này" +msgstr "Một điểm ảnh chỉ được kết xuất khi nào giá trị alpha của nó cao hơn giới hạn này" + + +msgctxt "Material" +msgid "Blend Mode" +msgstr "Chế Độ Pha Trộn" msgid "Blend Mode for Transparent Faces" -msgstr "Chế Độ Pha Trộn Cho Mặt Trong Suốt" +msgstr "Chế Độ Pha Trộn đối với các Mặt Trong Suốt" + + +msgctxt "Material" +msgid "Opaque" +msgstr "Đục" msgid "Render surface without transparency" -msgstr "Kết xuất bề mặt không có trong suốt" +msgstr "Kết xuất bề mặt như không có độ trong suốt" + + +msgctxt "Material" +msgid "Alpha Clip" +msgstr "Cắt Alpha" msgid "Use the alpha threshold to clip the visibility (binary visibility)" -msgstr "Sử dụng ngưỡng độ đục để cắt sự hiển thị (sự hiển thị nhị phận)" +msgstr "Dùng giới hạn alpha để loại bỏ tầm nhìn (tầm nhìn nhị phân)" + + +msgctxt "Material" +msgid "Alpha Hashed" +msgstr "Alpha Băm" msgid "Use noise to dither the binary visibility (works well with multi-samples)" -msgstr "Sử dụng huyên náo để đẩu động sự hiển thị nhị phận (hoạt động tốt với nhiều mẫu vật)" +msgstr "Dùng nhiễu để phối màu tầm nhìn nhị phân (hoạt động tốt với đa mẫu vật)" + + +msgctxt "Material" +msgid "Alpha Blend" +msgstr "Pha Trộn Alpha" msgid "Render polygon transparent, depending on alpha channel of the texture" -msgstr "Kết xuất đa giác trong suốt, tùy kênh độ đục của chất liệu" +msgstr "Kết xuất đa giác trong suốt, tùy theo kênh alpha của chất liệu" msgid "Cycles Material Settings" -msgstr "Cài Đặt Vật Liệu Cycles" +msgstr "Sắp Đặt về Nguyên Vật Liệu của Cycles" msgid "Cycles material settings" -msgstr "Cài đặt vật liệu Cycles" +msgstr "Sắp đặt về nguyên vật liệu của Cycles" msgid "Diffuse Color" -msgstr "Màu Tán Xạ" +msgstr "Màu Khuếch Tán" msgid "Diffuse color of the material" -msgstr "Màu tán xạ của vật liệu" +msgstr "Màu khuếch tán của chất liệu" msgid "Displacement Method" -msgstr "Phương Pháp Dịch Bề Mặt" +msgstr "Phương Pháp Dời Hình" msgid "Method to use for the displacement" -msgstr "Dùng phương pháp nào cho dịch" +msgstr "Phương pháp sử dụng cho phép dời hình" msgid "Bump Only" -msgstr "Chỉ Nhám" +msgstr "Duy Gồ Ghề" msgid "Bump mapping to simulate the appearance of displacement" -msgstr "Bản đồ nhám để mô phỏng hiện tượng dịch bề mặt" +msgstr "Ánh xạ độ gồ ghề để mô phỏng diện mạo của phép dời hình" msgid "Displacement Only" -msgstr "Chỉ Dịch" +msgstr "Duy Dời Hình" msgid "Use true displacement of surface only, requires fine subdivision" -msgstr "Chỉ sử dụng sự nới thật của bề mặt, yêu cầu có độ phân hóa nhiễn" +msgstr "Sử dụng sự dời hình bề mặt thực mà thôi. Đòi hỏi phải có độ phân hóa cao" msgid "Displacement and Bump" -msgstr "Dịch và Nhám" +msgstr "Dời Hình và Gồ Ghề" msgid "Combination of true displacement and bump mapping for finer detail" -msgstr "Gồm cả hai, bản đồ dịch và nhám cho có chi tiếi rõ hơn" +msgstr "Sự kết hợp của dời hình thực và ánh xạ độ gồ ghề để đạt được chi tiết tinh tế hơn" msgid "Grease Pencil Settings" -msgstr "Cài Đặt Bút Sáp" +msgstr "Sắp Đặt Bút Chì Dầu" msgid "Grease pencil color settings for material" -msgstr "Cài đặt màu bút sáp cho vật liệu" +msgstr "Sắp đặt màu sắc của Bút Chì Dầu cho nguyên vật liệu" msgid "Is Grease Pencil" -msgstr "Là Bút Sáp" +msgstr "Là Bút Chì Dầu" msgid "True if this material has grease pencil data" -msgstr "Đúng nếu vật liệu có dữ liệu bút sáp" +msgstr "Đúng (True) nếu nguyên vật liệu này có dữ liệu Bút Chì Dầu" msgid "Line Color" -msgstr "Màu Nét" +msgstr "Màu của Đường Nét" msgid "Line color used for Freestyle line rendering" -msgstr "Màu nét khi xuất kết phong cách vẽ nét Tự Do" +msgstr "Màu của đường nét khi kết xuất Phong Cách Đường Nét Tự Do (PCDNTD)" msgid "Line Priority" -msgstr "Thứ Tự Nét" +msgstr "Sự Ưu Tiên của Nét" msgid "The line color of a higher priority is used at material boundaries" -msgstr "Sử dụng màu nét có ưu tiên cao hơn tại ranh giới vật liệu" +msgstr "Màu của nét được ưu tiên cao hơn sẽ được sử dụng tại ranh giới của chất liệu" msgid "Line Art Settings" -msgstr "Cài Đặt Nghệ Thuật Đường Nét" +msgstr "Cài Đặt về Mỹ Thuật Đường Nét" msgid "Line art settings for material" -msgstr "Cài đạt nghệ thuật đường nét cho vật liệu" +msgstr "Cài đặt về Mỹ Thuật Đường Nét cho nguyên vật liệu" msgid "Metallic" -msgstr "Kiểu Kim Loại" +msgstr "Kim Loại" msgid "Amount of mirror reflection for raytrace" -msgstr "Mức phản xạ gương cho dò tia" +msgstr "Lượng phản quang trong dò tia" msgid "Node tree for node based materials" -msgstr "Cây giao điểm cho vật liệu cơ sở giao điểm" +msgstr "Cây nút cho những chất liệu cơ sở nút" msgid "Active Paint Texture Index" -msgstr "Chỉ Số Chất Liệu Sơn Hoạt Động" +msgstr "Chỉ Số Chất Liệu Sơn đang Hoạt Động" msgid "Index of active texture paint slot" -msgstr "Chỉ số của khe chất liệu sơn hoạt động" +msgstr "Chỉ số khe chất liệu sơn đang hoạt động" msgid "Clone Paint Texture Index" -msgstr "Sao Chép Chỉ Số Chất Liệu" +msgstr "Sao Chỉ Số Chất Liệu Sơn" msgid "Index of clone texture paint slot" -msgstr "Chỉ số của khe chất liệu sơn sao chép" +msgstr "Chỉ số bản rập khe sơn chất liệu" msgid "Index number for the \"Material Index\" render pass" -msgstr "Chỉ số cho vòng kết xuất \"Chỉ Số Vật Liệu\"" +msgstr "Chỉ số lượt kết xuất cho \"Chỉ Số Nguyên Vật Liệu\"" + + +msgctxt "Material" +msgid "Preview Render Type" +msgstr "Kiểu Xem Trước Kết Xuất" msgid "Type of preview render" -msgstr "Loại kết xuất cho dự khán" +msgstr "Loại xem trước (xem trước) kết xuất" + + +msgctxt "Material" +msgid "Flat" +msgstr "Phẳng" msgid "Flat XY plane" -msgstr "Mặt phẳng XY bằng phẳng" +msgstr "Mặt phẳng bẹt XY" + + +msgctxt "Material" +msgid "Sphere" +msgstr "Hình Cầu" + + +msgctxt "Material" +msgid "Cube" +msgstr "Khối Lập Phương" msgid "Cube" -msgstr "Lập Phương" +msgstr "Khối Lập Phương" + + +msgctxt "Material" +msgid "Hair" +msgstr "Tóc" msgid "Hair strands" -msgstr "Sợi Tóc" +msgstr "Sợi tóc" + + +msgctxt "Material" +msgid "Shader Ball" +msgstr "Quả Bóng Chuyển Sắc" msgid "Shader ball" -msgstr "Cầu bộ tô sắc" +msgstr "Quả bóng chuyển sắc" + + +msgctxt "Material" +msgid "Cloth" +msgstr "Vải Vóc" msgid "Cloth" -msgstr "Vải" +msgstr "Vải Vóc" + + +msgctxt "Material" +msgid "Fluid" +msgstr "Chất Lỏng" msgid "Refraction Depth" -msgstr "Độ Sâu Khúc Xạ" +msgstr "Chiều Sâu Khúc Xạ" msgid "Approximate the thickness of the object to compute two refraction events (0 is disabled)" -msgstr "Xấp xỉ chiều dày của vật thể để tính hai sự kiện khúc xạ (0 = tắt)" +msgstr "Ước tính xấp xỉ độ dày của đối tượng để tính toán hai sự kiện khúc xạ (0 là tắt) (hai sự kiện gây ra góc khúc xạ lớn hơn, nhỏ hơn)" msgid "Roughness" -msgstr "Độ Nhám" +msgstr "Độ Nhám/Ráp/Rối" msgid "Roughness of the material" -msgstr "Độ nhám của vật liệu " +msgstr "Độ nhám/ráp/rối của nguyên vật liệu" msgid "Shadow Mode" @@ -23404,11 +25489,11 @@ msgstr "Chế Độ Bóng Tối" msgid "Shadow mapping method" -msgstr "Phương pháp ánh xạ bóng tối" +msgstr "Chế độ ánh xạ bóng tối" msgid "Material will cast no shadow" -msgstr "Vật Liệu sẽ không phát bóng tối" +msgstr "Nguyên vật liệu không ngả bóng tối" msgid "Opaque" @@ -23416,51 +25501,51 @@ msgstr "Đục" msgid "Material will cast shadows without transparency" -msgstr "Vật Liệu sẽ phát bóng tối không trong suốt" +msgstr "Nguyên vật liệu sẽ ngả bóng tối song không có tính trong suốt" msgid "Alpha Clip" -msgstr "Cắt Độ Đục" +msgstr "Alpha Cắt" msgid "Alpha Hashed" -msgstr "Độ Đục Đẩu Động" +msgstr "Alpha Băm" msgid "Use noise to dither the binary visibility and use filtering to reduce the noise" -msgstr "Sử dụng huyên náo cho đẩu động sự hiển thị nhị phận và sử dụng bộ lọc để giảm huyên náo" +msgstr "Dùng nhiễu để phối màu tầm nhìn nhị phân và dùng sự thanh lọc để giảm bớt nhiễu" msgid "Show Backface" -msgstr "Hiện mặt đàng sau" +msgstr "Hiển Thị Mặt Trái" msgid "Render multiple transparent layers (may introduce transparency sorting problems)" -msgstr "Kết xuất đa lớp trong suốt (để tránh vấn đề sắp xếp thứ tự trong suốt)" +msgstr "Kết xuất nhiều tầng lớp trong suốt (có thể gây ra một số vấn đề về sắp xếp thứ tự độ trong suốt)" msgid "Specular Color" -msgstr "Màu Cao Quang" +msgstr "Màu Lóng Lánh" msgid "Specular color of the material" -msgstr "Màu cao quang của vật liệu" +msgstr "Màu lóng lánh của chất liệu" msgid "Specular" -msgstr "Cao Quang" +msgstr "Lóng Lánh" msgid "How intense (bright) the specular reflection is" -msgstr "Cường độ (độ sáng) của phản xạ cao quang" +msgstr "Cường độ (độ sáng) của phản xạ lóng lánh" msgid "Texture Slot Images" -msgstr "Khe Ảnh Chất Liệu" +msgstr "Hình Ảnh trong Khe Chất Liệu" msgid "Texture images used for texture painting" -msgstr "Ảnh chất liệu để sơn chất liệu" +msgstr "Những hình ảnh chất liệu dùng để sơn chất liệu" msgid "Texture Slots" @@ -23468,31 +25553,31 @@ msgstr "Khe Chất Liệu" msgid "Backface Culling" -msgstr "Hủy Diệt Mặt Sau" +msgstr "Loại Bỏ Mặt Trái" msgid "Use back face culling to hide the back side of faces" -msgstr "Dùng hủy diệt mặt phía sau để ẩn mặt phía sau của mặt" +msgstr "Dùng phương pháp loại trừ mặt trái để giấu các mặt trái của các Mặt" msgid "Use shader nodes to render the material" -msgstr "Sử dụng giao điểm bộ tô sắc để kết xuất vật liệu" +msgstr "Dùng các nút tô bóng để kết xuất chất liệu" msgid "Preview World" -msgstr "Dự Khán Thế Giới" +msgstr "Xem Trước Thế Giới" msgid "Use the current world background to light the preview render" -msgstr "Dùng nền thế giới hiện tại để phát ánh sáng cho kết xuất dự khán" +msgstr "Dùng nền thế giới hiện tại để chiếu sáng bản xem trước kết xuất" msgid "Subsurface Translucency" -msgstr "Trong Suốt Hạ Bề Mặt" +msgstr "Tính Trong Mờ Dưới Bề Mặt" msgid "Add translucency effect to subsurface" -msgstr "Thêm hiệu ứng trong suốt cho hạ bề mặt" +msgstr "Thêm hiệu ứng trong mờ cho lớp dưới bề mặt" msgid "Transparent Shadows" @@ -23500,7 +25585,7 @@ msgstr "Bóng Tối Trong Suốt" msgid "Use transparent shadows for this material if it contains a Transparent BSDF, disabling will render faster but not give accurate shadows" -msgstr "Dùng bóng tối trong suốt cho vật liệu này nếu nó có BSDF Trong Suốt. Nếu bạn tắt này sẽ kết xuất lẹ hơn nhưng có lẽ bóng tối sẽ không chính xác" +msgstr "Dùng bóng tối trong suốt cho nguyên vật liệu này nếu nó có chứa một BSDF Trong Suốt. Nếu tắt đi thì sẽ kết xuất nhanh hơn nhưng bóng tối sẽ không chính xác" msgid "Fast" @@ -23512,7 +25597,15 @@ msgstr "Chính Xác" msgid "Mesh data-block defining geometric surfaces" -msgstr "Cục dữ liệu cho chỉ định bề mặt hình dạng" +msgstr "Khối dữ liệu xác định các bề mặt hình học" + + +msgid "Corner Normals" +msgstr "Pháp Tuyến Góc" + + +msgid "The \"slit\" normal direction of each face corner, influenced by vertex normals, sharp faces, sharp edges, and custom normals. May be empty" +msgstr "Chiều hướng pháp tuyến “tách phân” của mỗi góc Mặt, chịu ảnh hưởng của các pháp tuyến điểm đỉnh, các Mặt sắc nhọn, các cạnh sắc nét và các pháp tuyến tùy chỉnh. Có thể là trống rỗng" msgid "Edges" @@ -23520,35 +25613,51 @@ msgstr "Cạnh" msgid "Edges of the mesh" -msgstr "Các cạnh của mạng lưới" +msgstr "Các cạnh của khung lưới" msgid "Has Custom Normals" -msgstr "Có Pháp Tuyến Tùy Chọn" +msgstr "Có Pháp Tuyến Tùy Chỉnh" msgid "True if there are custom split normals data in this mesh" -msgstr "Đúng nếu có dữ liệu pháp tuyến tùy chọn bị chẻ trong mạng lưới này" +msgstr "Giá trị 'Đúng' nếu có dữ liệu pháp tuyến tách phân tùy chỉnh trong khung lưới này" + + +msgid "Triangle Faces" +msgstr "Các Mặt Tam Giác" + + +msgid "The face index for each loop triangle" +msgstr "Chỉ số Mặt cho mỗi tam giác của vòng mạch" msgid "Loop Triangles" -msgstr "Tam Giác Vòng Lặp" +msgstr "Tam Giác Hóa Vòng Mạch" msgid "Tessellation of mesh polygons into triangles" -msgstr "Phân hóa đa giác của mạng lưới thành tam giác" +msgstr "Phân hóa các đa giác của khung lưới thành những hình tam giác" msgid "Loops" -msgstr "Vòng Lặp" +msgstr "Vòng Mạch" + + +msgid "Loops of the mesh (face corners)" +msgstr "Các vòng mạch của khung lưới (các góc của Mặt)" msgid "Corner" -msgstr "Góc Giác" +msgstr "Góc Cạnh" msgid "Polygon Normals" -msgstr "Pháp Tuyến Đa Giác" +msgstr "Pháp Tuyến của Đa Giác" + + +msgid "The normal direction of each face, defined by the winding order and position of its vertices" +msgstr "Chiều hướng pháp tuyến của mỗi Mặt, được xác định bởi thứ tự xoay chiều của pháp tuyến và vị trí các điểm đỉnh của nó" msgid "Polygons" @@ -23556,11 +25665,11 @@ msgstr "Đa Giác" msgid "Polygons of the mesh" -msgstr "Đa giác của mạng lưới" +msgstr "Đa giác của khung lưới" msgid "Remesh Mode" -msgstr "Chế Độ Làm Lại Mạng Lưới" +msgstr "Chế Độ Kiến Tạo Lại Khung Lưới" msgid "Voxel" @@ -23568,47 +25677,47 @@ msgstr "Thể Tích Tử" msgid "Use the voxel remesher" -msgstr "Dùng làm mạng lưới lại thể tích tử" +msgstr "Sử dụng trình kiến tạo lại thể tích tử" msgid "Quad" -msgstr "Tư Giác" +msgstr "Tứ Giác" msgid "Use the quad remesher" -msgstr "Dùng làm mạng lưới tư giác" +msgstr "Sử dụng trình kiến tạo lại khung lưới tứ giác" msgid "Adaptivity" -msgstr "Sự Ứng Phó" +msgstr "Tính Tùy Ứng" msgid "Reduces the final face count by simplifying geometry where detail is not needed, generating triangles. A value greater than 0 disables Fix Poles" -msgstr "Giảm số lượng mặt bằng đơn giản hóa hình dạng tại chỗ không cần nhiều chi tiết, chế tạo tam giác. Một giá trị lớn hơn 0 sẽ Sửa Cực" +msgstr "Giảm thiểu số lượng Mặt cuối cùng bằng cách đơn giản hóa hình học, loại bỏ những chi tiết không cần thiết, sinh tạo các tam giác. Giá trị lớn hơn 0 sẽ tắt chức năng Sửa Điểm Hội Tụ (Fix Poles)" msgid "Voxel Size" -msgstr "Kích Cỡ Thể Tích Tử" +msgstr "Kích Thước Thể Tích Tử" msgid "Size of the voxel in object space used for volume evaluation. Lower values preserve finer details" -msgstr "Kích cỡ của thể tích tử trong không gian vật thể được sử dụng cho tính toán thể tích. Giá trị thấp giữ lại chi tiết nhỏ nhiều hơn" +msgstr "Kích thước thể tích tử trong không gian đối tượng sử dụng trong quá trình tính toán thể tích. Những giá trị thấp sẽ duy trì các chi tiết tinh tế" msgid "Skin Vertices" -msgstr "Đỉnh Da" +msgstr "Điểm Đỉnh của Da" msgid "All skin vertices" -msgstr "Hết đỉnh da" +msgstr "Toàn bộ các điểm đỉnh của da" msgid "Texture Space Mesh" -msgstr "Lưới Không Gian Chất Liệu" +msgstr "Khung Lưới Không Gian Chất Liệu" msgid "Derive texture coordinates from another mesh" -msgstr "Tính tọa độ chất liệu từ mạng lưới khác" +msgstr "Suy tọa độ chất liệu ra từ khung lưới khác" msgid "Texture space location" @@ -23616,231 +25725,239 @@ msgstr "Vị trí không gian chất liệu" msgid "Texture space size" -msgstr "Kích cỡ không gian chất liệu" +msgstr "Kích thước không gian chất liệu" msgid "Texture Mesh" -msgstr "Chất Liệu Mạng Lưới" +msgstr "Khung Lưới của Chất Liệu" msgid "Use another mesh for texture indices (vertex indices must be aligned)" -msgstr "Dùng mạng lưới khác để cung cấp chỉ số chất liệu (đỉnh cần có cùng hướng và vị trí)" +msgstr "Dùng khung lưới khác để cung cấp chỉ số chất liệu (các chỉ số điểm đỉnh cần có cùng hướng và vị trí)" msgid "Selected Edge Total" -msgstr "Tổng Số Cạnh Được Chọn" +msgstr "Tổng Số Cạnh được Chọn" msgid "Selected edge count in editmode" -msgstr "Tổng số lượng cạnh được chọn trong chế độ biên tập" +msgstr "Số lượng cạnh được chọn trong Chế Độ Biên Soạn" msgid "Selected Face Total" -msgstr "Tổng Số Mặt Được Chọn" +msgstr "Tổng Số Mặt được Chọn" msgid "Selected face count in editmode" -msgstr "Tổng số lượng mặt được chọn trong chế độ biên tập" +msgstr "Số lượng mặt được chọn trong Chế Độ Biên Soạn" msgid "Selected Vertex Total" -msgstr "Tổng Số Đỉnh Được Chọn" +msgstr "Tổng Số Điểm Đỉnh đã Chọn" msgid "Selected vertex count in editmode" -msgstr "Tổng số lượng đỉnh được chọn trong chế độ biên tập" +msgstr "Số lượng điểm đỉnh được chọn trong Chế Độ Biên Soạn" msgid "Topology Mirror" -msgstr "Gương Hình Dạng Học" +msgstr "Phản Chiếu Đối Xứng Cấu Trúc Liên Kết" msgid "Use topology based mirroring (for when both sides of mesh have matching, unique topology)" -msgstr "Dùng gương cơ sở hình dạng học (cho khi cả hai mặt của mạng lưới có hình dạng giống, độc đáo)" +msgstr "Sử dụng phản chiếu đối xứng nền tảng cấu trúc liên kết (để cả hai bên của khung lưới có hình dạng giống nhau, với tôpô duy nhất)" msgid "Mirror Vertex Groups" -msgstr "Nhóm Đỉnh Gương" +msgstr "Phản Chiếu Đối Xứng Nhóm Điểm Đỉnh" msgid "Mirror the left/right vertex groups when painting. The symmetry axis is determined by the symmetry settings" -msgstr "Gương hóa các nhóm đỉnh trái/phải khi đang sơn. Trục đối xứng được quyết định bởi cài đặt đối xứng" +msgstr "Phản chiếu đối xứng các nhóm điểm đỉnh trái/phải khi sơn. Trục đối xứng là do các cài đặt về đối xứng xác định" msgid "Paint Mask" -msgstr "Mặt Nạ Sơn" +msgstr "Màn Chắn Lọc Sơn" msgid "Face selection masking for painting" -msgstr "Mặt nạ sự lựa chọn mặt cho sơn" +msgstr "Biệt riêng Mặt đã chọn ra để sơn (chắn lọc chúng riêng ra khỏi những cái khác)" msgid "Vertex Selection" -msgstr "Sự Lựa Chọn Đỉnh" +msgstr "Lựa Chọn Điểm Đỉnh" msgid "Vertex selection masking for painting" -msgstr "Mặt nạ để lựa chọn đỉnh cho sơn" +msgstr "Biệt riêng các điểm đỉnh đã chọn ra để sơn (chắn lọc chúng riêng ra khỏi những cái khác)" msgid "Fix Poles" -msgstr "Sửa Cực" +msgstr "Sửa Điểm Hội Tụ" msgid "Projects the mesh to preserve the volume and details of the original mesh" -msgstr "Chiếu mạng lưới để giữ nguyên thể tích và chi tiết của mạng lưới ban đầu" +msgstr "Phóng chiếu khung lưới để bảo tồn thể tích và các chi tiết của khung lưới gốc" msgid "Clone UV Loop Layer" -msgstr "Sao Chép Lớp Vòng Lặp UV" +msgstr "Rập khuôn tầng mạch lưới UV" msgid "UV loop layer to be used as cloning source" -msgstr "Lớp vòng lặp UV nào để làm nguồn gốc sao chép" +msgstr "Tầng mạch lưới UV dùng làm khuôn để rập" msgid "Clone UV Loop Layer Index" -msgstr "Sao Chép Chỉ Số Của Lớp Vòng Lặp UV" +msgstr "Chỉ số của tầng mạch lưới UV rập khuôn" msgid "Clone UV loop layer index" -msgstr "Sao chép chỉ số của lớp vòng lặp UV " +msgstr "Chỉ số của tầng chứa mạch lưới UV để rập khuôn" msgid "Mask UV Loop Layer" -msgstr "Lớp Vòng Lặp UV Mặt Nạ" +msgstr "Tầng mạch lưới UV chắn lọc" msgid "UV loop layer to mask the painted area" -msgstr "Lớp vòng UV để làm mặt nạ khu vực sơn" +msgstr "Tầng mạch lưới UV để chắn lọc vùng được sơn" msgid "Mask UV Loop Layer Index" -msgstr "Chỉ Số Vòng Lặp UV Của Mặt Nạ" +msgstr "Chỉ số tầng mạch lưới UV chắn lọc" msgid "Mask UV loop layer index" -msgstr "Chỉ số lớp vòng UV của mặt nạ" +msgstr "Chỉ số tầng mạch lưới UV chắn lọc" msgid "UV Loop Layers" -msgstr "Lớp Vòng Lặp UV" +msgstr "Tầng Mạch Lưới UV" msgid "All UV loop layers" -msgstr "Hết Lớp Vòng Lặp UV" +msgstr "Toàn bộ các tầng chứa mạch lưới UV" msgid "Vertex Colors" -msgstr "Màu Đỉnh" +msgstr "Màu Điểm Đỉnh" msgid "Legacy vertex color layers. Deprecated, use color attributes instead" -msgstr "Lớp màu đỉnh là lỗi thời. Dùng đặc điểm màu thay thế" +msgstr "Các tầng lớp màu điểm đỉnh lỗi thời. Không được dùng nữa. Xin hãy sử dụng các thuộc tính màu sắc thay vì" msgid "Vertex Normals" -msgstr "Pháp Tuyến Đỉnh" +msgstr "Các Pháp Tuyến của Điểm Đỉnh" msgid "The normal direction of each vertex, defined as the average of the surrounding face normals" -msgstr "Hướng pháp tuyến từng đỉnh, được chỉ định bởi giá trị trung bình của pháp tuyến của các mặt xung quanh" +msgstr "Hướng pháp tuyến của mỗi điểm đỉnh, được xác định là giá trị trung bình của các pháp tuyến Mặt xung quanh" msgid "Vertices" -msgstr "Đỉnh" +msgstr "Điểm Đỉnh" msgid "Vertices of the mesh" -msgstr "Các đỉnh của lưới" +msgstr "Các điểm đỉnh của khung lưới" + + +msgid "Metaball data-block to define blobby surfaces" +msgstr "Khối dữ liệu siêu cầu để xác định các bề mặt của bong bóng" msgid "Metaball elements" -msgstr "Phần Tử Siêu Cầu" +msgstr "Phần tử siêu cầu" msgid "Render Size" -msgstr "Kích Cỡ Kết Xuất" +msgstr "Kích Thước Kết Xuất" msgid "Polygonization resolution in rendering" -msgstr "Độ phân giải đa giác hóa khi kết xuất" +msgstr "Độ phân giải khi đa giác hóa trong kết xuất" + + +msgid "Viewport Size" +msgstr "Kích Thước Cổng Chiếu" msgid "Polygonization resolution in the 3D viewport" -msgstr "Độ phân giải đa giác hóa trong màn 3D" +msgstr "Độ phân giải khi đa giác hóa trong cổng nhìn 3D" msgid "Influence of metaball elements" -msgstr "Sự ảnh hưởng của phần tử siêu cầu" +msgstr "Tác động của các siêu phần tử" msgid "Update" -msgstr "Nâng Cấp" +msgstr "Cập Nhật" msgid "Metaball edit update behavior" -msgstr "Hành vi siêu cầu khi nâng cấp biên tập" +msgstr "Phản ảnh thay đổi khi biên soạn Siêu Cầu" msgid "While editing, update metaball always" -msgstr "Khi biên tập, lần nào nâng cấp siêu cầu" +msgstr "Khi biên soạn, luôn luôn phản ảnh các thay đổi của Siêu Cầu" msgid "While editing, update metaball in half resolution" -msgstr "Khi biên tập, nâng cấp siêu cầu bằng nửa độ phân giải" +msgstr "Khi biên soạn, phản ảnh các thay đổi của Siêu Cầu với độ phân giải bằng một nửa" msgid "While editing, update metaball without polygonization" -msgstr "Khi biên tập, nâng cấp siêu cầu không dùng đa giác hóa" +msgstr "Khi biên soạn, phản ảnh các thay đổi của Siêu Cầu song không thi hành đa giác hóa" msgid "Never" -msgstr "Không bao giờ" +msgstr "Không Bao Giờ" msgid "While editing, don't update metaball at all" -msgstr "Khi biên tập, không nâng cấp siêu cầu" +msgstr "Khi biên soạn, không phản ảnh các thay đổi của siêu cầu" msgid "MovieClip data-block referencing an external movie file" -msgstr "Cục Đoạn Phim đang tham chiếu một tập tin phim ngoài" +msgstr "Khối dữ liệu của Đoạn Phim tham chiếu một tập tin phim ở ngoài" msgid "Display Aspect for this clip, does not affect rendering" -msgstr "Hiển thị tỉ số cạnh cho đoạn phim này, không ảnh hướng kết xuát" +msgstr "Hiển thị Tỷ Lệ Khung Hình cho đoạn phim này, không gây ảnh hưởng đến kết xuất" msgid "Filename of the movie or sequence file" -msgstr "Tên tập tin đoạn phim hay trình tự" +msgstr "Tên tập tin của đoạn phim hay tập tin trình tự" msgid "Frame Rate" -msgstr "Tốc Độ Bức Ảnh" +msgstr "Tốc Độ Khung Hình" msgid "Detected frame rate of the movie clip in frames per second" -msgstr "Được phát hiện tốc độ bức ảnh của đoạn phim (đơn vị bức ảnh/giây)" +msgstr "Phát hiện tần số khung hình của đoạn phim trong đơn vị số khung hình/giây" msgid "Detected duration of movie clip in frames" -msgstr "Được phát hiện giai đoạn phim bằng bức ảnh" +msgstr "Phát hiện thời lượng của đoạn phim trong các khung hình" msgid "Offset of footage first frame relative to its file name (affects only how footage is loading, does not change data associated with a clip)" -msgstr "Dịch của bức ảnh đầu tiên tương đối với tên tập tin của nó (chỉ ảnh hưởng làm sao được nhập đoạn phim, không thay đổi dữ liệu liên quan đến một đoạn phim)" +msgstr "Dịch chuyển của khung hình đầu tiên trong đoạn phim tương ứng với tên tập tin của nó (chỉ ảnh hưởng đến phương cách nạp đoạn phim, ngoài ra, dữ liệu liên quan đến đoạn phim sẽ không bị thay đổi)" msgid "Global scene frame number at which this movie starts playing (affects all data associated with a clip)" -msgstr "Số bức ảnh cảnh toàn cầu thì phim này sẽ bắt đầu hát (nó ảnh hướng hết dữ liệu liên quan đến một đoạn phim)" +msgstr "Số khung hình nơi phim này sẽ bắt đầu chơi (ảnh hưởng toàn bộ các dữ liệu liên quan đến đoạn phim)" msgid "Grease pencil data for this movie clip" -msgstr "Dữ liệu bút sáp cho đoạn phim này" +msgstr "Dữ liệu Bút Chì Dầu cho đoạn phim này" msgid "Width and height in pixels, zero when image data can't be loaded" -msgstr "Chiều rộng và cao (điểm ảnh), nó bằng không khi không thể nhập dữ liệu ảnh" +msgstr "Chiều rộng và chiều cao trong đơn vị điểm ảnh, bằng 0 khi không thể nạp dữ liệu hình ảnh được" msgid "Where the clip comes from" @@ -23852,107 +25969,135 @@ msgstr "Tập Tin Phim" msgid "Use Proxy / Timecode" -msgstr "Dùng Đại Lý/Mã Thời Gian" +msgstr "Dùng Đại Diện/Mã Thời Gian" msgid "Use a preview proxy and/or timecode index for this clip" -msgstr "Dùng một đại lý dự khán và/hay chỉ số mã thời gian cho đoạn phim này" +msgstr "Sử dụng một xem trước đại diện và/hoặc chỉ số mã thời gian cho đoạn phim này" msgid "Proxy Custom Directory" -msgstr "Thư Mục Đại Lý Tùy Chọn" +msgstr "Thư Mục Đại Diện Tùy Chọn" msgid "Create proxy images in a custom directory (default is movie location)" -msgstr "Chế tạo ảnh đại lý trong một thơ mục tùy chọn (mặc định là vị trí phim)" +msgstr "Kiến Tạo các hình ảnh đại diện trong thư mục tự chọn (sắp đặt mặc định là vị trí của bản phim)" msgid "Node tree consisting of linked nodes used for shading, textures and compositing" -msgstr "Cây giao điểm xây dựng bằng giao điểm được liên kết cho tô sắc, chất liệu, và ghép ảnh" - - -msgid "Label" -msgstr "Nhãn" +msgstr "Cây nút bao gồm các nút được kết nối, sử dụng khi tô bóng, làm chất liệu, và cho quá trình tổng hợp" msgid "The node tree label" -msgstr "Nhãn của cây giao điểm" +msgstr "Nhãn hiệu của cây nút" msgid "Grease Pencil Data" -msgstr "Dữ Liệu Bút Sáp" +msgstr "Dữ Liệu Bút Chì Dầu" msgid "Interface" msgstr "Giao Diện" +msgid "Interface declaration for this node tree" +msgstr "Khai báo giao diện cho cấu trúc cây nút này" + + msgid "Links" -msgstr "Liên Kết" +msgstr "Kết Nối" msgid "Nodes" -msgstr "Giao Điểm" +msgstr "Nút" msgid "Node Tree type (deprecated, bl_idname is the actual node tree type identifier)" -msgstr "Loại cây giao điểm (lỗi thời, bl_idname là tên thật của loại cây giao điểm)" +msgstr "Loại Cây Nút (đã lỗi thời, bl_idname mới là định danh thực của loại cây nút)" msgid "Undefined" -msgstr "Chưa Xác Định" +msgstr "Chưa Xác Định Rõ Ràng" msgid "Undefined type of nodes (can happen e.g. when a linked node tree goes missing)" -msgstr "Loại giao điểm chưa được định nghĩa (ví dụ có thể xảy ra khi một cây giao điểm được liên kết bị mất)" +msgstr "Thể loại nút chưa xác định (có thể xảy ra khi cây nút liên kết bị thất lạc, chẳng hạn)" + + +msgid "Custom nodes" +msgstr "Nút Tùy Chỉnh" msgid "Shader" -msgstr "Bộ Tô Sắc" +msgstr "Bộ Tô Bóng" msgid "Shader nodes" -msgstr "Giao điểm bộ tô sắc" +msgstr "Nút tô bóng" msgid "Texture nodes" -msgstr "Giao điểm chất liệu" +msgstr "Nút chất liệu" msgid "Compositing nodes" -msgstr "Giao điểm ghép" +msgstr "Các nút tổng hợp" msgid "Geometry nodes" -msgstr "Giao điểm hình dạng" +msgstr "Các nút hình học" msgid "The current location (offset) of the view for this Node Tree" -msgstr "Vị trí hiện tại (nới) của màn cho cây giao điểm này" +msgstr "Vị trí hiện tại (dịch chuyển) của góc nhìn cho Cây Nút (Node Tree) này" msgid "Compositor Node Tree" -msgstr "Cây Giao Điểm Bộ Ghép" +msgstr "Cây Nút Tổng Hợp" msgid "Node tree consisting of linked nodes used for compositing" -msgstr "Cây giao điểm xăy bằng giao điểm liên kết dùng cho ghép ảnh" +msgstr "Cây nút bao gồm các nút đã kết nối, dùng cho quá trình tổng hợp" msgid "Chunksize" -msgstr "Kích Cỡ Ô" +msgstr "Kích Thước Ô" msgid "Max size of a tile (smaller values gives better distribution of multiple threads, but more overhead)" -msgstr "Cớ kích ô ảnh tối đa (giá trị càng nhỏ phân phối sợi đây càng tốt, nhưng càng sử dụng bộ nhớ hơn)" +msgstr "Kích thước tối đa của ô (giá trị nhỏ cho phép sự phân phối các luồng xử lý tốt hơn, song phí tổn cao hơn)" + + +msgid "Chunksize of 32×32" +msgstr "Kích thước phân khúc 32×32" + + +msgid "Chunksize of 64×64" +msgstr "Kích thước phân khúc 64×64" + + +msgid "Chunksize of 128×128" +msgstr "Kích thước phân khúc 128×128" + + +msgid "Chunksize of 256×256" +msgstr "Kích thước phân khúc 256×256" + + +msgid "Chunksize of 512×512" +msgstr "Kích thước phân khúc 512×512" + + +msgid "Chunksize of 1024×1024" +msgstr "Kích thước phân khúc 1024×1024" msgid "Edit Quality" -msgstr "Chất Lương Biên Tập" +msgstr "Chất Lượng Biên Soạn" msgid "Quality when editing" -msgstr "Chất lượng khi đang biên tập" +msgstr "Chất lượng khi biên soạn" msgid "High" @@ -23976,27 +26121,35 @@ msgstr "Chất lượng thấp" msgid "Execution Mode" -msgstr "Chế Độ Thực Hành" +msgstr "Chế Độ Thi Hành" msgid "Set how compositing is executed" -msgstr "Đặt phương pháp ghép được thực hành" +msgstr "Phương pháp thi hành tổng hợp" msgid "Tiled" -msgstr "Ô" +msgstr "Xếp Ô Cờ" msgid "Compositing is tiled, having as priority to display first tiles as fast as possible" -msgstr "Ghép bằng ô, hiển thị các ô đầu ưu tiên nhanh nhất có thể" +msgstr "Bố trí xếp ô, hiển thị các ô đầu ưu tiên nhanh nhất có thể" msgid "Full Frame" -msgstr "Toàn Khung" +msgstr "Toàn Khung Hình" msgid "Composites full image result as fast as possible" -msgstr "Ghép kết qủa toàn ảnh nhanh nhất có thể" +msgstr "Tổng hợp hình ảnh kết quả toàn phần càng nhanh càng tốt" + + +msgid "GPU" +msgstr "Graphics Processing Unit: Đơn Vị Xử Lý Đồ Họa" + + +msgid "Use GPU accelerated compositing with more limited functionality" +msgstr "Sử dụng tính năng tổng hợp tăng tốc GPU với chức năng hạn chế hơn" msgid "Render Quality" @@ -24008,11 +26161,11 @@ msgstr "Chất lượng khi kết xuất" msgid "Buffer Groups" -msgstr "Nhóm Đệm" +msgstr "Ghi các Nhóm Vào Bộ Đệm" msgid "Enable buffering of group nodes" -msgstr "Bật làm đệm cho nhóm giao điểm" +msgstr "Cho phép ghi nhóm các nút vào bộ đệm" msgid "OpenCL" @@ -24020,119 +26173,151 @@ msgstr "OpenCL" msgid "Enable GPU calculations" -msgstr "Bật tính bằng GPU (bộ xử lý đồ họa)" +msgstr "Cho phép các tính toán bằng GPU (bộ xử lý đồ họa)" msgid "Two Pass" -msgstr "Hai vòng" +msgstr "Hai Lượt" msgid "Use two pass execution during editing: first calculate fast nodes, second pass calculate all nodes" -msgstr "Dùng thực hành hai vòng khi biên tập: trước tính giao điểm nhanh, vòng hai tính hết giao điểm" +msgstr "Sử dụng phương pháp thi hành lệnh hai lượt trong khi biên soạn: trước tiên tính các nút nhanh, lượt thứ hai tính toàn bộ các nút" msgid "Viewer Region" -msgstr "Vùng Bộ Chiếu" +msgstr "Quan Sát Khu Vực" msgid "Use boundaries for viewer nodes and composite backdrop" -msgstr "Dùng ranh giới cho giao điểm bộ chiếu và nền ghép ảnh nền" +msgstr "Khoanh ranh giới khu vực cho các nút quan sát và làm phông nền cho quá trình tổng hợp" msgid "Geometry Node Tree" -msgstr "Cây Giao Điểm Hình Dạng" +msgstr "Cây Nút Hình Học" msgid "Node tree consisting of linked nodes used for geometries" -msgstr "Cây giao điểm xây lên từ giao điểm liên kết được dùng cho hình dạng" +msgstr "Cây nút bao gồm các nút kết nối sử dụng cho các hình học" msgid "Edit" -msgstr "Biên Tập" +msgstr "Biên Soạn" + + +msgid "The node group is used in edit mode" +msgstr "Nhóm nút được sử dụng trong chế độ biên soạn" msgid "Sculpt" -msgstr "Khắc" +msgstr "Điêu Khắc" + + +msgid "The node group is used in sculpt mode" +msgstr "Nhóm nút được sử dụng trong chế độ điêu khắc" msgid "Modifier" msgstr "Bộ Điều Chỉnh" +msgid "The node group is used as a geometry modifier" +msgstr "Nhóm nút được sử dụng làm bộ điều chỉnh hình học" + + msgid "Tool" -msgstr "Dụng Cụ" +msgstr "Công Cụ" + + +msgid "The node group is used as a tool" +msgstr "Nhóm nút được sử dụng như một công cụ" + + +msgid "The node group is used for curves" +msgstr "Nhóm nút được sử dụng cho các đường cong" + + +msgid "The node group is used for meshes" +msgstr "Nhóm nút được sử dụng cho các khung lưới" + + +msgid "The node group is used for point clouds" +msgstr "Nhóm nút được sử dụng cho các đám mây điểm" msgid "Shader Node Tree" -msgstr "Cây Giao Điểm Bộ Tô Sắc" +msgstr "Cây Nút Tô Bóng" msgid "Node tree consisting of linked nodes used for materials (and other shading data-blocks)" -msgstr "Cây giao điểm xây lên từ giao điểm liên kết được dùng cho vật liệu (và cục dữ liệu tô sắc khác)" +msgstr "Cây nút bao gồm các nút chất liệu kết nối (và các khối dữ liệu về tô bóng khác)" msgid "Texture Node Tree" -msgstr "Cây Giao Điểm Chất Liệu" +msgstr "Cây Nút Chất Liệu" msgid "Node tree consisting of linked nodes used for textures" -msgstr "Cây giao điểm xây lên từ giao điểm liên kết được dùng cho chất liệu" +msgstr "Cây nút bao gồm các nút chất liệu kết nối" msgid "Object data-block defining an object in a scene" -msgstr "Vật thể cục dữ liệu cho chỉ định một vật thể trong một cảnh" +msgstr "Khối dữ liệu đối tượng định nghĩa một đối tượng trong cảnh" msgid "Active Material" -msgstr "Vật Liệu Hoạt Động" +msgstr "Nguyên Vật Liệu đang Hoạt Động" msgid "Active material being displayed" -msgstr "Vật liệu hoạt động đang chiếu" +msgstr "Chất liệu hiện sử dụng đang được hiển thị" msgid "Active Material Index" -msgstr "Chỉ Số Vật Liệu Hoạt Động" +msgstr "Chỉ Số Nguyên Vật Liệu đang Hoạt Động" msgid "Index of active material slot" -msgstr "Chỉ số của khe vật liệu hoạt động" +msgstr "Chỉ số của khe chất liệu đang hoạt động" msgid "Active Shape Key" -msgstr "Mẫu Dạng Hoạt Động" +msgstr "Hình Mẫu đang Hoạt Động" msgid "Current shape key" -msgstr "Mẫu dạng hiện tại" +msgstr "Hình mẫu hiện tại" msgid "Active Shape Key Index" -msgstr "Chỉ Số Mẫu Dạng Hoạt Động" +msgstr "Chỉ Số Hình Mẫu đang Hoạt Động" msgid "Current shape key index" -msgstr "Chỉ số mẫu dạng hiện tại" +msgstr "Chỉ số hình mẫu hiện tại" msgid "Add Rest Position" -msgstr "Thêm Vị Trí Nghỉ Ngơi" +msgstr "Thêm Vị Trí Nghỉ" msgid "Add a \"rest_position\" attribute that is a copy of the position attribute before shape keys and modifiers are evaluated" -msgstr "Thêm một đặc điểm \"viTrị_nghỉNgơi\" là sao chép của đặt điểm vị trí trước mẫu dạng và bộ điều chỉnh được tính toán" +msgstr "Thêm thuộc tính \"rest_position\" (vị trí nghỉ), tức bản sao của thuộc tính vị trí trước khi các hình mẫu và bộ điều chỉnh được đánh giá" msgid "Bounding Box" -msgstr "Hộp Bao Quanh" +msgstr "Khung Hộp Viền" msgid "Object's bounding box in object-space coordinates, all values are -1.0 when not available" -msgstr "Hộp bao quanh của vật thể trong tạo độ không gian vật thể, tất cả giá trị = -1.0 khi không thể dùng" +msgstr "Khung hộp viền của đối tượng trong tạo độ không gian đối tượng, toàn bộ các giá trị đều là -1.0 khi không sử dụng" msgid "Settings for using the object as a collider in physics simulation" -msgstr "Cài đặt cho dùng vật thể này làm vật thể va chạm trong mô phỏng vật lý" +msgstr "Các sắp đặt dành cho việc sử dụng đối tượng làm vật va đập trong mô phỏng vật lý" + + +msgid "Object color and alpha, used when the Object Color mode is enabled" +msgstr "Màu của đối tượng và alpha, được sử dụng khi bật chế độ Màu Đối Tượng" msgid "Constraints" @@ -24140,15 +26325,15 @@ msgstr "Ràng Buộc" msgid "Constraints affecting the transformation of the object" -msgstr "Các ràng buộc đang ảnh hướng biến hoá của vật thể" +msgstr "Những ràng buộc tác động đến biến hóa của đối tượng" msgid "Cycles Object Settings" -msgstr "Cài Đặt Vật Thể Cycles" +msgstr "Sắp Đặt Đối Tượng trong Cycles" msgid "Cycles object settings" -msgstr "Cài đặt vật thể Cycles" +msgstr "Sắp đặt đối tượng trong Cycles" msgid "Data" @@ -24156,71 +26341,71 @@ msgstr "Dữ Liệu" msgid "Object data" -msgstr "Dữ liệu vật thể" +msgstr "Dữ liệu đối tượng" msgid "Delta Location" -msgstr "Lệch Lạc Vị Trí" +msgstr "Vị Trí Delta" msgid "Extra translation added to the location of the object" -msgstr "Dịch được cộng thêm với vị trí của vật thể" +msgstr "Lượng dịch chuyển bổ sung vào vị trí của đối tượng" msgid "Delta Rotation (Euler)" -msgstr "Lệch Lạc Xoay (Euler)" +msgstr "Độ Xoay Delta (Euler)" msgid "Extra rotation added to the rotation of the object (when using Euler rotations)" -msgstr "Xoay được cộng thêm với xoay của vật thể (khi dùng xoay Euler)" +msgstr "Độ xoay bổ sung vào sự xoay chiều của đối tượng (khi dùng các kiểu xoay Euler)" msgid "Delta Rotation (Quaternion)" -msgstr "Lệch Lạc Xoay (Quaternion)" +msgstr "Độ Xoay Delta (Quatenion)" msgid "Extra rotation added to the rotation of the object (when using Quaternion rotations)" -msgstr "Xoay được cộng thêm với xoay của vật thể (khi dùng xoay Quaternion)" +msgstr "Độ xoay bổ sung vào sự xoay chiều của đối tượng (khi dùng cách xoay Quatenion)" msgid "Delta Scale" -msgstr "Lệch Lạc Phóng To" +msgstr "Tỷ Lệ Delta" msgid "Extra scaling added to the scale of the object" -msgstr "Phóng to được cộng thêm với phóng to của vật thể" +msgstr "Tỷ lệ bổ sung để thêm vào tỷ lệ của đối tượng" msgid "" "Absolute bounding box dimensions of the object.\n" "Warning: Assigning to it or its members multiple consecutive times will not work correctly, as this needs up-to-date evaluated data" msgstr "" -"Kích thước tuyệt đối của hộp bao quanh của vật thể.\n" -"Cảnh Báo: Chỉ định nó hay thành viên của nó vài lần liên tiếp sẽ không hoạt động đứng, vì nó cần dữ liệu cập nhật được tính toán" +"Kích thước khung viền hình hộp tuyệt đối của đối tượng.\n" +"(Cảnh báo: Việc tái ấn định cho nó, hoặc các thành viên của nó, nhiều lần, liên tiếp, sẽ không làm cho nó hoạt động đúng đắn đâu, vì cái này cần có dữ liệu tính toán cập nhật mới được)" msgid "Object Display" -msgstr "Hiển Thị Vật Thể" +msgstr "Hiển Thị Đối Tượng" msgid "Object display settings for 3D viewport" -msgstr "Cài đặt hiển thị của vật thể cho màn chiếu 3D" +msgstr "Các sắp đặt về hiển thị đối tượng cho cổng nhìn 3D" msgid "Display Bounds Type" -msgstr "Loại Hiển Thị Ranh Giới" +msgstr "Loại Khung Viền Hiển Thị" msgid "Object boundary display type" -msgstr "Cách hiển thị ranh giới vật thể" +msgstr "Loại khung viền biểu hiện ranh giới của đối tượng" msgid "Display bounds as box" -msgstr "Hiển thị ranh giới bằng hộp" +msgstr "Biểu hiện khung viền hình hộp" msgid "Display bounds as sphere" -msgstr "Hiển thị rảnh giới bằng hình cầu" +msgstr "Biểu hiện khung viền hình cầu" msgid "Cylinder" @@ -24228,27 +26413,27 @@ msgstr "Hình Trụ" msgid "Display bounds as cylinder" -msgstr "Hiển thị ranh giới bằng hình trụ" +msgstr "Biểu hiện khung viền hình trụ" msgid "Display bounds as cone" -msgstr "Hiển thị ranh giới bằng hình nón" +msgstr "Biểu hiện khung viền hình nón" msgid "Capsule" -msgstr "Qủa Nang" +msgstr "Vỏ Nhộng" msgid "Display bounds as capsule" -msgstr "Hiển thị ranh giới bằng qủa nang" +msgstr "Biểu hiện khung viền hình vỏ nhộng" msgid "Display As" -msgstr "Hiển Thị Bằng" +msgstr "Hiển Thị là" msgid "How to display object in viewport" -msgstr "Làm sao hiển thi vật thể trong màn chiếu" +msgstr "Hình thức biểu hiện đối tượng trong cổng nhìn" msgid "Bounds" @@ -24256,19 +26441,19 @@ msgstr "Ranh Giới" msgid "Display the bounds of the object" -msgstr "Hiển thị ranh giới của vật thể" +msgstr "Biểu hiện khung viền của đối tượng" msgid "Display the object as a wireframe" -msgstr "Hiển thị vật thể như sợi dây" +msgstr "Biểu hiện đối tượng trong một mạch lưới" msgid "Solid" -msgstr "Chất Rắn" +msgstr "Lập Thể" msgid "Display the object as a solid (if solid drawing is enabled in the viewport)" -msgstr "Hiển thị vật thể như chất rắn (nếu vẽ chất rắn được bật trong màn chiếu)" +msgstr "Biểu hiện đối tượng như một khối đặc (nếu chức năng vẽ khối đặc trong cổng nhìn được kích hoạt)" msgid "Textured" @@ -24276,159 +26461,191 @@ msgstr "Có Chất Liệu" msgid "Display the object with textures (if textures are enabled in the viewport)" -msgstr "Hiển thị vật thể với chất liệu (nếu chất liệu được bật trong màn chiếu)" +msgstr "Biểu hiện đối tượng với chất liệu (nếu chất liệu được kích hoạt trong cổng nhìn)" msgid "Empty Display Size" -msgstr "Kích Cỡ Hiển Thị Vật Thể Rỗng" +msgstr "Kích Thước Hiển Thị Đối Tượng Rỗng" msgid "Size of display for empties in the viewport" -msgstr "Kích cỡ hiển thị vật thể rỗng trong màn chiếu" +msgstr "Kích thước dùng để hiển thị đối tượng trống rỗng trong cổng nhìn" msgid "Empty Display Type" -msgstr "Loại Hiển Thị Vật Thể Rỗng" +msgstr "Loại Hình Tượng của Đối Tượng Rỗng" msgid "Viewport display style for empties" -msgstr "Phong cách hiển thị vật thể rỗng trong màn chiếu " +msgstr "Phong cách hiển thị đối tượng trống rỗng trong cổng nhìn" msgid "Plain Axes" -msgstr "Trục Đơn" +msgstr "Trục Tọa Độ" msgid "Arrows" -msgstr "Mũi Tên" +msgstr "Đa Mũi Tên" msgid "Single Arrow" -msgstr "Một Mũi Tên" +msgstr "Đơn Mũi Tên" msgid "Circle" -msgstr "Vòng Tròn" +msgstr "Hình/Vòng/Tròn" msgid "Empty Image Depth" -msgstr "Độ Sâu Ảnh Rỗng" +msgstr "Chiều Sâu của Hình Ảnh Trống" msgid "Determine which other objects will occlude the image" -msgstr "Xác định vật thể nào khác sẽ che khuất ảnh" +msgstr "Xác định những đối tượng nào sẽ che khuất hình ảnh" msgid "Origin Offset" -msgstr "Dịch Gốc Tọa Độ" +msgstr "Dịch Chuyển của Tọa Độ Gốc" msgid "Origin offset distance" -msgstr "Khoảng cách dịch gốc tọa độ" +msgstr "Khoảng cách xê dịch tọa độ gốc" + + +msgctxt "Image" +msgid "Empty Image Side" +msgstr "Bên Hình Ảnh Trống" msgid "Show front/back side" -msgstr "Hiện phía trước/sau" +msgstr "Hiển thị mặt trước/sau" + + +msgctxt "Image" +msgid "Both" +msgstr "Cả Hai" + + +msgctxt "Image" +msgid "Front" +msgstr "Trước" + + +msgctxt "Image" +msgid "Back" +msgstr "Sau" msgid "Settings for using the object as a field in physics simulation" -msgstr "Cài đặt cho sử dụng vật thể này như một trường trong mô phỏng vật lý" +msgstr "Sắp đặt cho đối tượng được sử dụng làm trường lực trong mô phỏng vật lý" msgid "Grease Pencil Modifiers" -msgstr "Bộ Điều Chỉnh Bút Sáp" +msgstr "Bộ Điều Chỉnh Bút Chì Dầu" msgid "Modifiers affecting the data of the grease pencil object" -msgstr "Bộ điều chỉnh đang ảnh hưởng dữ liệu của vật thể bút sáp" +msgstr "Những bộ điều chỉnh gây tác động đến dữ liệu của đối tượng Bút Chì Dầu" + + +msgid "Disable in Volume Probes" +msgstr "Tắt trong Thăm Dò Thể Tích" + + +msgid "Globally disable in volume probes" +msgstr "Tắt toàn cầu trong các thăm dò thể tích" msgid "Instance Collection" -msgstr "Sưu Tập Thực Thể" +msgstr "Tạo Thực Thể Bộ Sưu Tập" msgid "Instance an existing collection" -msgstr "Thực thể một sưu tập tồn tại" +msgstr "Tạo bản sao một bộ sưu tập hiện đang tồn tại" msgid "Instance Faces Scale" -msgstr "Phóng To Mặt Thực Thể" +msgstr "Đổi Tỷ Lệ Thực Thể Hóa Các Mặt" msgid "Scale the face instance objects" -msgstr "Phóng to vật thể thực thể mặt" +msgstr "Đổ tỷ lệ các đối tượng được thực thể hóa theo Mặt" msgid "Instance Type" -msgstr "Loại Thực Thể" +msgstr "Kiểu Thực Thể Hóa" msgid "If not None, object instancing method to use" -msgstr "Nếu khác Không, nó chỉ định phương pháp để thực thể vật thể" +msgstr "Ngoài 'Không Có/Làm' ra thì (cái được chọn) sẽ là phương pháp thực thể hóa sử dụng" msgid "Instantiate child objects on all vertices" -msgstr "Thực thể vật thể con cái trên tất cả đỉnh" +msgstr "Sinh tạo các đối tượng con cái (bản sao) trên toàn bộ các điểm đỉnh" msgid "Faces" -msgstr "Mặt" +msgstr "Các Mặt" msgid "Instantiate child objects on all faces" -msgstr "Thực thể vật thể con cái trên tất cả mặt" +msgstr "Sinh tạo các đối tượng con cái (bản sao) trên toàn bộ các mặt" msgid "Enable collection instancing" -msgstr "Bật thực thể sưu tập" +msgstr "Cho phép thực thể hóa bộ sưu tập" msgid "Base from Instancer" -msgstr "Cơ sở từ Đồ Thực Thể" +msgstr "Dựa vào Thực Thể Hóa Viên" msgid "Object comes from a instancer" -msgstr "Vật thể từ một Đồ Thực Thẻ" +msgstr "Đối tượng đến từ một thực thể hóa viên (đối tượng/cái sử dụng để tạo bản sao)" msgid "Base from Set" -msgstr "Cơ sử từ Sưu Tập" +msgstr "Dựa vào Bộ" msgid "Object comes from a background set" -msgstr "Vật thể từ một sưu tập cảnh hậu" +msgstr "Đối tượng đến từ một bộ nền" msgid "Holdout" -msgstr "Giữ Lại" +msgstr "Giữ Chỗ" msgid "Render objects as a holdout or matte, creating a hole in the image with zero alpha, to fill out in compositing with real footage or another render" -msgstr "Kết xuất vật thể để làm lớp che lấn, tạo một lỗ trong ảnh có độ đục bằng không, cho chèn đoạn phim quay đồ thật hay đoạn phim kết xuất khác" +msgstr "Kết xuất các đối tượng như một phần tử được 'giữ chỗ' (holdout), hoặc như một lớp vẽ lồng, hòng tạo ra một lỗ hổng trong hình ảnh với giá trị alpha bằng không (zero), để được lấp kín trong quá trình tổng hợp, bằng đoạn phim thật, hoặc bằng một bản kết xuất khác" msgid "Shadow Catcher" -msgstr "Bắt Bóng Tối" +msgstr "Vật Bắt Bóng Tối" msgid "Only render shadows and reflections on this object, for compositing renders into real footage. Objects with this setting are considered to already exist in the footage, objects without it are synthetic objects being composited into it" -msgstr "Chỉ kết xuất bóng tối và phản xạ trên vật thể này, cho ghép kết xuất vào phim quay thật. Những vật thể có cài đặt này được chấp nhận là đang tồn tại trong phim quay thật, những vật thể thiếu nó là vật thể nhận tạo đang ghép vào phim." +msgstr "Chỉ kết xuất bóng tối và ánh phản xạ trên đối tượng này mà thôi, để phục vụ cho việc tổng hợp các bản kết xuất thành một đoạn phim thật. Các đối tượng có cài đặt này sẽ được coi như là đã tồn tại trong đoạn phim rồi. Các đối tượng không có nó là các đối tượng nhân tạo, đang được tổng hợp vào phim" + + +msgid "Light linking settings" +msgstr "Cài đặt liên kết ánh sáng" msgid "Lightgroup" -msgstr "NhómĐèn" +msgstr "Nhóm Ánh Sáng" msgid "Lightgroup that the object belongs to" -msgstr "NhómĐèn đang sở hữu vật thể" +msgstr "Nhóm ánh sáng mà đối tượng trực thuộc" msgid "Line art settings for the object" -msgstr "Cài đạt nghệ thuật đường nét cho vật thể" +msgstr "Cài đặt mỹ thuật đường nét cho đối tượng" msgid "Location of the object" -msgstr "Vị trị của vật thể" +msgstr "Vị trí của đối tượng" msgid "Lock Location" @@ -24436,75 +26653,75 @@ msgstr "Khóa Vị Trí" msgid "Lock editing of location when transforming" -msgstr "Khóa biên tập của vị trí khi đang biến hóa" +msgstr "Khóa, không cho biên soạn vị trí khi biến hóa" msgid "Lock Rotation" -msgstr "Khóa Xoay" +msgstr "Khóa Xoay Chiều" msgid "Lock editing of rotation when transforming" -msgstr "Khóa biên tập của xoay khi đang biến hóa" +msgstr "Khóa, không cho biên soạn xoay chiều khi biến hóa" msgid "Lock Rotation (4D Angle)" -msgstr "Khóa Xoay (Góc 4 Chiều)" +msgstr "Khóa Xoay Chiều (Góc 4D)" msgid "Lock editing of 'angle' component of four-component rotations when transforming" -msgstr "Khóa biên tập của thành phần 'góc' của xoay 4 thành phần khi biến hóa" +msgstr "Khóa, không cho biên soạn thành phần 'góc độ' của sự xoay chiều bằng 4 thành phần khi biến hóa" msgid "Lock Rotations (4D)" -msgstr "Khóa Xoay (4D)" +msgstr "Khóa Xoay Chiều (4D)" msgid "Lock editing of four component rotations by components (instead of as Eulers)" -msgstr "Khóa biên tập xoay 4 thành phần bằng thành phần (thay thế góc Euler)" +msgstr "Khóa, không cho biên soạn sự xoay chiều bằng 4 thành phần bởi các thành phần (thay vì Euler)" msgid "Lock Scale" -msgstr "Khóa Phóng To" +msgstr "Khóa Tỷ Lệ" msgid "Lock editing of scale when transforming" -msgstr "Khóa biên tập của phóng to khi biến hóa" +msgstr "Khóa, không cho biên soạn tỷ lệ khi biến hóa" msgid "Material Slots" -msgstr "Khe Vật Liệu" +msgstr "Khe Nguyên Vật Liệu" msgid "Material slots in the object" -msgstr "Khe vật liệu cho vật thể" +msgstr "Khe nguyên vật liệu trong đối tượng" msgid "Input Matrix" -msgstr "Ma Trận Ngõ Vào" +msgstr "Ma Trận Cung Cấp" msgid "Matrix access to location, rotation and scale (including deltas), before constraints and parenting are applied" -msgstr "Ma trận liên quan đến vị trí, xoay, và phóng (gồm lệch lạc), trước được áp dụng ràng buộc và phụ huynh" +msgstr "Ma trận liên quan đến vị trí, độ xoay, và tỷ lệ (bao gồm cả các delta), trước khi các ràng buộc và sự phụ huynh hóa được áp dụng" msgid "Local Matrix" -msgstr "Ma Trận Địa Phương" +msgstr "Ma Trận Cục Bộ" msgid "" "Parent relative transformation matrix.\n" "Warning: Only takes into account object parenting, so e.g. in case of bone parenting you get a matrix relative to the Armature object, not to the actual parent bone" msgstr "" -"Ma trạn biến hóa tương đối với phụ huynh.\n" -"Cảnh báo: Nó chỉ quan tâm phụ huynh của vật thể, ví dụ trong trường hợp xương có phụ huynh, nó cho một ma trận tương đối với vật thể Cốt, không phải xương phụ huynh thật" +"Ma trận biến hóa tương đối với phụ huynh\n" +"Cảnh báo: Chỉ xem xét đến quan hệ phụ huynh với 'Đối Tượng' mà thôi, ví dụ: trong trường hợp phụ huynh hóa xương, chúng ta được một ma trận tương đối với đối tượng Khung Cốt, chứ không phải là xương phụ huynh thật" msgid "Parent Inverse Matrix" -msgstr "Ma Trận Đảo Nghịch" +msgstr "Ma Trận Đảo Nghịch của Phụ Huynh" msgid "Inverse of object's parent matrix at time of parenting" -msgstr "Đảo nghịch của ma trận phụ huynh của vật thể tại thời điểm được làm phụ huynh" +msgstr "Đảo nghịch ma trận phụ huynh của đối tượng tại thời điểm được phụ huynh hóa" msgid "Matrix World" @@ -24516,27 +26733,27 @@ msgstr "Ma trận biến hóa không gian thế giới" msgid "Object interaction mode" -msgstr "Chế độ tương tác với vật thể" +msgstr "Chế độ tương tác với đối tượng" msgid "Object Mode" -msgstr "Chế Độ Vật Thể" +msgstr "Chế Độ Đối Tượng" msgid "Pose Mode" -msgstr "Chế Độ Dạng Đứng" +msgstr "Chế Độ Tư Thế" msgid "Sculpt Mode" -msgstr "Chế Độ Khắc" +msgstr "Chế Độ Điêu Khắc" msgid "Vertex Paint" -msgstr "Sơn Đỉnh" +msgstr "Sơn Điểm Đỉnh" msgid "Weight Paint" -msgstr "Sơn Quyền Lượng" +msgstr "Sơn Trọng Lượng" msgid "Texture Paint" @@ -24544,15 +26761,15 @@ msgstr "Sơn Chất Liệu" msgid "Particle Edit" -msgstr "Biên Tập Hạt" +msgstr "Biên Soạn Hạt" msgid "Edit Grease Pencil Strokes" -msgstr "Biên Tập Nét Bút Sáp" +msgstr "Biên Soạn Nét Bút Chì Dầu" msgid "Sculpt Grease Pencil Strokes" -msgstr "Khắc Nét Bút Sáp" +msgstr "Điêu Khắc: Nét Bút Chì Dầu" msgid "Draw Mode" @@ -24560,19 +26777,19 @@ msgstr "Chế Độ Vẽ" msgid "Paint Grease Pencil Strokes" -msgstr "Sơn Nét Bút Sáp" +msgstr "Vẽ Nét Bút Chì Dầu" msgid "Grease Pencil Weight Paint Strokes" -msgstr "Nét Sơn Quyền Lượng Bút Sáp" +msgstr "Sơn Trọng Lượng Nét Bút Chì Dầu" msgid "Grease Pencil Vertex Paint Strokes" -msgstr "Nét Sơn Đỉnh Bút Sáp" +msgstr "Các Nét Vẽ Sơn Điểm Đỉnh của Bút Chì Dầu" msgid "Modifiers affecting the geometric data of the object" -msgstr "Bộ điều chỉnh được ảnh hưởng dữ liệu hình dạng của vật thể" +msgstr "Bộ điều chỉnh tác động dữ liệu hình học của đối tượng" msgid "Motion Path" @@ -24580,71 +26797,71 @@ msgstr "Đường Chuyển Động" msgid "Motion Path for this element" -msgstr "Đường chuyển cho phần từ này" +msgstr "Đường Chuyển Động cho phần từ này" msgid "The object is parented to an object" -msgstr "Phụ huynh của vật thể là vật thể" +msgstr "Phụ huynh của đối tượng là một đối tượng khác" msgid "The object is parented to a lattice" -msgstr "Phụ huynh của vật thể là lưới rào" +msgstr "Phụ huynh của đối tượng là một lưới rào" msgid "The object is parented to a vertex" -msgstr "Phụ huynh của vật thể là đỉnh" +msgstr "Phụ huynh của đối tượng là một điểm đỉnh" msgid "3 Vertices" -msgstr "3 Đỉnh" +msgstr "3 Điểm Đỉnh" msgid "The object is parented to a bone" -msgstr "Phụ huynh của vật thể là xương" +msgstr "Phụ huynh của đối tượng là xương" msgid "Parent Vertices" -msgstr "Đỉnh Phụ Huynh" +msgstr "Điểm Đỉnh Phụ Huynh" msgid "Indices of vertices in case of a vertex parenting relation" -msgstr "Chỉ số của các đỉnh cho trường hợp có liên hệ phụ huynh" +msgstr "Chỉ số của các điểm đỉnh cho trường hợp có quan hệ phụ huynh với điểm đỉnh" msgid "Index number for the \"Object Index\" render pass" -msgstr "Chỉ số cho vòng kết xuất \"Chỉ Số Vật Liệu\"" +msgstr "Chỉ số cho lượt kết xuất \"Chỉ Số Đối Tượng\"" msgid "Pose" -msgstr "Dạng Đứng" +msgstr "Tư Thế" msgid "Current pose for armatures" -msgstr "Dạng đứng hiện tại cho cốt" +msgstr "Tư thế hiện tại cho khung cốt" msgid "Rigid Body Settings" -msgstr "Cài Đặt Thân Rắn" +msgstr "Sắp Đặt Thân Cứng" msgid "Settings for rigid body simulation" -msgstr "Cài đặt cho mô phỏng thân rắn" +msgstr "Sắp đặt cho mô phỏng thân cứng" msgid "Rigid Body Constraint" -msgstr "Ràng Buộc Thân Rắn" +msgstr "Ràng Buộc Thân Cứng" msgid "Constraint constraining rigid bodies" -msgstr "Ràng buộc hạn chế thân rắn" +msgstr "Ràng buộc khống chế các thân cứng" msgid "Axis-Angle Rotation" -msgstr "Trục-Góc Xoay" +msgstr "Độ Xoay của Góc-Trục" msgid "Angle of Rotation for Axis-Angle rotation representation" -msgstr "Góc Xoay cho biểu diễn Trục-Góc" +msgstr "Góc xoay đại biểu độ Xoay Chiều của Góc-Trục" msgid "Euler Rotation" @@ -24652,39 +26869,39 @@ msgstr "Xoay Euler" msgid "Rotation in Eulers" -msgstr "Xoay dùng góc Euler" +msgstr "Xoay chiều theo lý thuyết của Euler" msgid "Quaternion (WXYZ)" -msgstr "Quaternion (WXYZ)" +msgstr "Quatenion (WXYZ)" msgid "No Gimbal Lock" -msgstr "Không Bị Lắc Quanh Trục Các Đăng" +msgstr "Không Bị Vấn Đề Nghẽn Tắc trong Trục Vạn Năng" msgid "XYZ Rotation Order - prone to Gimbal Lock (default)" -msgstr "Thứ Tự Xoay XYZ - có thể bị Lắc Quanh Trục Các Đăng (mặc định)" +msgstr "Thứ Tự Xoay XYZ - dễ bị Tắc Nghẽn trong Trục Vạn Năng (mặc định)" msgid "XZY Rotation Order - prone to Gimbal Lock" -msgstr "Thứ Tự Xoay XZY - có thể bị Lắc Quanh Trục Các Đăng" +msgstr "Thứ Tự Xoay XYZ - dễ bị Tắc Nghẽn trong Trục Vạn Năng" msgid "YXZ Rotation Order - prone to Gimbal Lock" -msgstr "Thứ Tự Xoay YXZ - có thể bị Lắc Quanh Trục Các Đăng" +msgstr "Thứ Tự Xoay YXZ - dễ bị Tắc Nghẽn trong Trục Vạn Năng" msgid "YZX Rotation Order - prone to Gimbal Lock" -msgstr "Thứ Tự Xoay YZX - có thể bị Lắc Quanh Trục Các Đăng" +msgstr "Thứ Tự Xoay YZX - dễ bị Tắc Nghẽn trong Trục Vạn Năng" msgid "ZXY Rotation Order - prone to Gimbal Lock" -msgstr "Thứ Tự Xoay ZXY - có thể bị Lắc Quanh Trục Các Đăng" +msgstr "Thứ Tự Xoay ZXY - dễ bị Tắc Nghẽn trong Trục Vạn Năng" msgid "ZYX Rotation Order - prone to Gimbal Lock" -msgstr "Thứ Tự Xoay ZYX - có thể bị Lắc Quanh Trục Các Đăng" +msgstr "Thứ tự XYZ - dễ bị Tắc Nghẽn trong Trục Vạn Năng" msgid "Axis Angle" @@ -24692,91 +26909,91 @@ msgstr "Góc Trục" msgid "Axis Angle (W+XYZ), defines a rotation around some axis defined by 3D-Vector" -msgstr "Góc trục (W+XYZ), đặt một xoay quanh một trục nào được chỉ định bằng vectơ 3D" +msgstr "Góc Trục (W+XYZ), định nghĩa độ xoay chiều quanh một trục nào đó đã được định nghĩa bởi Véctơ-3D" msgid "Quaternion Rotation" -msgstr "Xoay Quaternion" +msgstr "Xoay Quatenion" msgid "Rotation in Quaternions" -msgstr "Xoay dùng Quaternion" +msgstr "Xoay chiều dùng Quatenion" msgid "Scaling of the object" -msgstr "Phóng to của vật thể" +msgstr "Đổi tỷ lệ của đối tượng" msgid "Shader Effects" -msgstr "Hiệu Ứng Bộ Tô Sắc" +msgstr "Hiệu Ứng Tô Bóng" msgid "Effects affecting display of object" -msgstr "Hiệu Ứng được ảnh hưởng sự hiển thị của vật thể" +msgstr "Hiệu ứng tác động sự hiển thị của đối tượng" msgid "Display All Edges" -msgstr "Hiển Thị Hết Cạnh" +msgstr "Hiển Thị Toàn Bộ các Cạnh" msgid "Display all edges for mesh objects" -msgstr "Hiển thị tất cả cạnh cho vật thể mạng lưới" +msgstr "Hiển thị toàn bộ các cạnh của những đối tượng khung lưới" msgid "Display the object's origin and axes" -msgstr "Hiển th ̣góc tọa độ và trục của vật thể" +msgstr "Hiển thị tọa độ gốc và trục của đối tượng" msgid "Display Bounds" -msgstr "Hiển Thị Ranh Giới" +msgstr "Hiển Thị Khung Viền" msgid "Display the object's bounds" -msgstr "Hiển thị ranh giới của vật thể" +msgstr "Hiển thị khung viền (Ranh Giới của) đối tượng" msgid "Display Only Axis Aligned" -msgstr "Chỉ Hiển Thị Sắp Xếp Với Trục" +msgstr "Duy Hiển Thị nếu Căn Chỉnh với Trục" msgid "Only display the image when it is aligned with the view axis" -msgstr "Chỉ hiển thị ảnh khi nó được sắp xếp với trục màn" +msgstr "Duy hiển thị hình ảnh khi nó đã được căn chỉnh với trục của góc nhìn" msgid "Display in Orthographic Mode" -msgstr "Hiển thị bằng Chế Độ Chiếu Trực Giao " +msgstr "Hiển Thị trong Chế Độ Trực Giao" msgid "Display image in orthographic mode" -msgstr "Hiển thị ảnh trong chế độ chiếu trực giao" +msgstr "Hiển thị hình ảnh trong chế độ trực giao" msgid "Display in Perspective Mode" -msgstr "Hiển thị bằng Chế Độ Chiếu Phối Cảnh" +msgstr "Hiển Thị trong Chế Độ Phối Cảnh" msgid "Display image in perspective mode" -msgstr "Hiển thị ảnh bằng chế độ chiếu phối cảnh" +msgstr "Hiển thị hình ảnh trong chế độ phối cảnh" msgid "Make the object display in front of others" -msgstr "Hiện vật thể phía trước vật thể khác" +msgstr "Làm cho đối tượng hiển thị ở đằng trước những cái khác" msgid "Render Instancer" -msgstr "Đồ Thực Thể Kết Xuất" +msgstr "Kết Xuất Thực Thể Viên" msgid "Make instancer visible when rendering" -msgstr "Hiển thị đồ thực thể khi kết xuất" +msgstr "Khiến thực thể viên (đối tượng sử dụng để tạo bản sao) nhìn thấy được khi kết xuất" msgid "Display Instancer" -msgstr "Hiển Thị Đồ Thực Thể" +msgstr "Hiển Thị Thực Thể Viên" msgid "Make instancer visible in the viewport" -msgstr "Hiển thị đồ thực thể trong màn chiếu" +msgstr "Khiến thực thể viên (đối tượng sử dụng để tạo bản sao) nhìn thấy được trong cổng nhìn" msgid "Display Name" @@ -24784,11 +27001,15 @@ msgstr "Hiển Thị Tên" msgid "Display the object's name" -msgstr "Hiển thị tên của vật thể" +msgstr "Hiển thị tên của đối tượng" msgid "Shape Key Lock" -msgstr "Khóa Mẫu Dạng" +msgstr "Khóa Hình Mẫu" + + +msgid "Only show the active shape key at full value" +msgstr "Duy hiển thị hình mẫu đang hoạt động ở giá trị toàn phần" msgid "Display Texture Space" @@ -24796,7 +27017,7 @@ msgstr "Hiển Thị Không Gian Chất Liệu" msgid "Display the object's texture space" -msgstr "Hiển thị không gian chất liệu của vật thể" +msgstr "Hiển thị không gian chất liệu của đối tượng" msgid "Display Transparent" @@ -24804,32 +27025,32 @@ msgstr "Hiển Thị Trong Suốt" msgid "Display material transparency in the object" -msgstr "Hiển thị vật liệu trong suốt trong vật thể" +msgstr "Hiển thị tính trong suốt của nguyên vật liệu trong đối tượng" msgid "Display the object's wireframe over solid shading" -msgstr "Hiển thị thêm khung sợi dây trên tô sắc rắn" +msgstr "Hiển thị khung dây của đối tượng trên mặt chuyển sắc một màu trơn của chất rắn" msgid "Soft Body Settings" -msgstr "Cài Đặt Thân Mềm" +msgstr "Sắp Đặt Thân Mềm" msgid "Settings for soft body simulation" -msgstr "Cài đặt cho mô phỏng thân mềm" +msgstr "Sắp đặt cho mô phỏng thân mềm" msgid "Axis that points in the 'forward' direction (applies to Instance Vertices when Align to Vertex Normal is enabled)" -msgstr "Trục cho chỉ hướng 'phía trước' (áp dụng cho Đỉnh Thực Thể khi bật Sắp Xếp đến Pháp Tuyến Đỉnh)" +msgstr "Trục hướng về 'đằng trước' (forward) (áp dụng vào Thực Thể Hóa theo Điểm Đỉnh khi Căn Chỉnh theo Pháp Tuyến Điểm Đỉnh đang được bật lên)" msgctxt "ID" msgid "Type" -msgstr "Loại" +msgstr "Thể Loại" msgid "Type of object" -msgstr "Loại vật thể" +msgstr "Thể loại đối tượng" msgctxt "ID" @@ -24844,11 +27065,11 @@ msgstr "Đường Cong Tóc" msgctxt "ID" msgid "Empty" -msgstr "Vật Thể Rỗng" +msgstr "Đối Tượng Trống Rỗng" msgid "Axis that points in the upward direction (applies to Instance Vertices when Align to Vertex Normal is enabled)" -msgstr "Trục cho chỉ hướng phía trên (áp dụng cho Đỉnh Thực Thể khi bật Sắp Xếp đến Pháp Tuyến Đỉnh)" +msgstr "Trục hướng lên trên (áp dụng cho Thực Thể Hóa Theo Điểm Đỉnh khi Căn Chỉnh theo Pháp Tuyến Điểm Đỉnh được bật lên)" msgid "Camera Parent Lock" @@ -24856,135 +27077,147 @@ msgstr "Khóa Phụ Huynh Máy Quay Phim" msgid "View Lock 3D viewport camera transformation affects the object's parent instead" -msgstr "Biến hóa của máy quay phim của màn chiếu 3D đã khóa được ảnh hưởng phụ huyh của vật thể thay thế" +msgstr "Sự biến hóa của máy quay phim trong khi Khóa Góc Nhìn trong Cổng Nhìn 3D sẽ tác động đối tượng phụ huynh thay vì" msgid "Dynamic Topology Sculpting" -msgstr "Khắc Hình Dạng Học Động Lý" +msgstr "Điêu Khắc Cấu Trúc Động" msgid "Use Alpha" -msgstr "Sử Dụng Độ Đục" +msgstr "Sử Dụng Alpha" msgid "Use alpha blending instead of alpha test (can produce sorting artifacts)" -msgstr "Dùng pha trộn độ đục thay thế kiểm tra độ đục (có thể chế tạo sai lầm sắp thứ tự)" +msgstr "Sử dụng pha trộn alpha thay vì thử nghiệm alpha (alpha test) (có thể gây ra giả tượng sắp xếp)" msgid "Lights affect grease pencil object" -msgstr "Các đèn được ảnh hưởng vật thể bút sáp" +msgstr "Nguồn sáng tác động đối tượng bút chì dầu" msgid "Scale to Face Sizes" -msgstr "Phóng to đến Kích Cỡ Mặt" +msgstr "Tỷ Lệ Hóa tới Kích Thước Mặt" msgid "Scale instance based on face size" -msgstr "Phóng to thực thể cơ sở kích cỡ mặt" +msgstr "Đổi tỷ lệ của thực thể theo kích thước Mặt" msgid "Orient with Normals" -msgstr "Định ướng vơi Pháp Tuyến" +msgstr "Định Hướng theo Pháp Tuyến" msgid "Rotate instance according to vertex normal" -msgstr "Xoay thực thể tùy pháp tuyến của đỉnh" +msgstr "Xoay chiều thực thể chiểu theo chiều của pháp tuyến điểm đỉnh" msgid "Enable mesh symmetry in the X axis" -msgstr "Bật đối xứng mạng lưới cho trục X" +msgstr "Cho phép phản chiếu đối xứng khung lưới trên trục X" msgid "Enable mesh symmetry in the Y axis" -msgstr "Bật đối xứng mạng lưới cho trục Y" +msgstr "Cho phép phản chiếu đối xứng khung lưới trên trục Y" msgid "Enable mesh symmetry in the Z axis" -msgstr "Bật đối xứng mạng lưới cho trục Z" +msgstr "Cho phép phản chiếu đối xứng khung lưới trên trục Z" msgid "Shape Key Edit Mode" -msgstr "Chế Độ Biên Tập Mẫu Dạng" +msgstr "Chế Độ Biên Soạn Hình Mẫu" + + +msgid "Display shape keys in edit mode (for meshes only)" +msgstr "Hiển thị các hình mẫu trong chế độ biên soạn (duy dành cho các khung lưới mà thôi)" + + +msgid "Use Simulation Cache" +msgstr "Sử Dụng Bộ Đệm Mô Phỏng" + + +msgid "Cache frames during simulation nodes playback" +msgstr "Ghi bộ nhớ đệm các khung hình trong quá trình chơi lại các nút mô phỏng" msgid "Vertex Groups" -msgstr "Nhóm Đỉnh" +msgstr "Nhóm Điểm Đỉnh" msgid "Vertex groups of the object" -msgstr "Các nhóm đỉnh của vật thể" +msgstr "Nhóm điểm đỉnh của đối tượng" msgid "Camera Visibility" -msgstr "Sự Hiển Thị Máy Quay Phim" +msgstr "Mức Máy Quay Phim Hữu Hình" msgid "Object visibility to camera rays" -msgstr "Sự hiển thị của vật thể cho tia máy quay phim" +msgstr "Mức hữu hình của đối tượng với các tia xạ của máy quay phim" msgid "Diffuse Visibility" -msgstr "Sự Hiển Thị Tán Xạ" +msgstr "Mức Khuếch Tán Hữu Hình" msgid "Object visibility to diffuse rays" -msgstr "Sự hiển thị của vật thể cho tia tán xạ" +msgstr "Mức hữu hình của đối tượng với các tia khuếch tán" msgid "Glossy Visibility" -msgstr "Sự Hiển Thị Bóng Loáng" +msgstr "Mức Bóng Bẩy Hữu Hình" msgid "Object visibility to glossy rays" -msgstr "Sự hiển thị của vật thể cho tia bóng loáng" +msgstr "Mức hữu hình của đối tượng với các tia phản quang ánh bóng bẩy" msgid "Shadow Visibility" -msgstr "Sự Hiển Thị Bóng Tối" +msgstr "Mức Bóng Tối Hữu Hình" msgid "Object visibility to shadow rays" -msgstr "Sự hiển thị của vật thể cho tia bóng tối" +msgstr "Mức hữu hình của đối tượng với các tia bóng tối" msgid "Transmission Visibility" -msgstr "Sự Hiển Thị Truyền" +msgstr "Mức Truyền Xạ Hữu Hình" msgid "Object visibility to transmission rays" -msgstr "Sự hiển thị của vật thể cho tia truyền" +msgstr "Mức hữu hình của đối tượng với các tia truyền xạ" msgid "Volume Scatter Visibility" -msgstr "Sự Hiển Thị Tán Xạ Thể Tích" +msgstr "Mức Tán Xạ Thể Tích Hữu Hình" msgid "Object visibility to volume scattering rays" -msgstr "Sự hiển thị của vật thể cho tia tán xạ thể tích" +msgstr "Mức hữu hình của đối tượng với các tia tán xạ thể tích" msgid "Particle Settings" -msgstr "Cài Đặt Hạt" +msgstr "Sắp Đặt Hạt" msgid "Particle settings, reusable by multiple particle systems" -msgstr "Cài đặt hạt, nhiều hệ thống hạt có thể sử dụng lại nữa" +msgstr "Sắp đặt cho hệ thống hạt. Mọi hệ thống hạt đều có thể sử dụng" msgid "Active Instance Object" -msgstr "Vật Thể Thực Thể Hoạt Động" +msgstr "Đối Tượng của Thực Thể đang Hoạt Động" msgid "Active Instance Object Index" -msgstr "Chỉ Số Vật Thể Thực Thể Hoạt Động" +msgstr "Chỉ Số Đối Tượng của Thực Thể đang Hoạt Động" msgid "Degrees" -msgstr "Độ" +msgstr "Góc Độ" msgid "How many degrees path has to curve to make another render segment" -msgstr "Bao nhiêu độ đường đi cần cong lại để kết xuất một đoạn nữa" +msgstr "Đường dẫn phải cong bao nhiêu độ để tạo thêm một đoạn kết xuất nữa" msgid "Pixel" @@ -24992,23 +27225,23 @@ msgstr "Điểm Ảnh" msgid "How many pixels path has to cover to make another render segment" -msgstr "Số lươđng điểm ảnh đường đi cần xuyên để kết xuất một khúc nữa" +msgstr "Số lượng điểm ảnh của đường đi cần có để có thể tạo thêm được một đoạn kết xuất nữa" msgid "Angular Velocity" -msgstr "Vận Tốc Xoay" +msgstr "Vận Tốc Góc" msgid "Angular velocity amount (in radians per second)" -msgstr "Mức vận tốc xoay (rađian/giây)" +msgstr "Vận tốc góc (rad/giây)" msgid "Angular Velocity Axis" -msgstr "Trục Vận Tốc Xoay" +msgstr "Trục của Vận Tốc Góc" msgid "What axis is used to change particle rotation with time" -msgstr "Trục nào được sử dụng cho đổi xoay hạt qua thời gian" +msgstr "Dùng trục nào để đổi sự xoay chiều của hạt theo thời gian" msgid "Global X" @@ -25023,12 +27256,16 @@ msgid "Global Z" msgstr "Z Toàn Cầu" +msgid "Affect Children" +msgstr "Ảnh Hưởng Con Cái" + + msgid "Apply effectors to children" -msgstr "Áp dụng hiệu ứng với con cái" +msgstr "Áp dụng các hiệu ứng viên vào các con cái" msgid "Random Bending Stiffness" -msgstr "Độ Cứng Bể Cong Ngẫu Nhiên" +msgstr "Độ Cứng Ngẫu Nhiên cho Quá Trình Uốn Cong" msgid "Random stiffness of hairs" @@ -25036,87 +27273,87 @@ msgstr "Độ cứng ngẫu nhiên của tóc" msgid "Threshold of branching" -msgstr "Ngưỡng tạo nhắn" +msgstr "Giới hạn phân nhánh" msgid "Brownian" -msgstr "Kiểu Brown" +msgstr "Chuyển Động Brown" msgid "Amount of random, erratic particle movement" -msgstr "Mức chuyển động ngẫu nhiên, lộn xộn" +msgstr "Lượng chuyển động ngẫu nhiên, thất thường của hạt" msgid "Length of child paths" -msgstr "Bề dài đường đi của con cái" +msgstr "Chiều dài của các đường dẫn con cái" msgid "Amount of particles left untouched by child path length" -msgstr "Số lượng hạt không được ảnh hưởng bởi bề dài đường đi của con cái" +msgstr "Số lượng hạt sẽ không bị ảnh hưởng bởi chiều dài của đường dẫn con cái" msgid "Parting Factor" -msgstr "Hệ Số Vét" +msgstr "Hệ Số Phân Chia" msgid "Create parting in the children based on parent strands" -msgstr "Vét con cái tùy sợi dây của phụ huynh" +msgstr "Chia khu vực cho các con cái, phỏng theo các sợi phụ huynh" msgid "Parting Maximum" -msgstr "Vét Cực Đại" +msgstr "Độ Phân Chia Tối Đa" msgid "Maximum root to tip angle (tip distance/root distance for long hair)" -msgstr "Góc cực đại từ rễ đến đỉnh (khoảng cách đỉnh/khoảng cách rễ cho tóc dài)" +msgstr "Góc tối đa từ chân đến đỉnh (khoảng cách đỉnh/khoảng cách chân dành cho tóc dài)" msgid "Parting Minimum" -msgstr "Vét Cực Tiểu" +msgstr "Độ Phân Chia Tối Thiểu" msgid "Minimum root to tip angle (tip distance/root distance for long hair)" -msgstr "Góc cực tiểu từ rễ đến đỉnh (khoảng cách đỉnh/khoảng cách rễ cho tóc dài)" +msgstr "Góc tối thiểu từ chân đến đỉnh (khoảng cách đỉnh/khoảng cách chân dành cho tóc dài)" msgid "Children Per Parent" -msgstr "Con Cái Mỗi Phụ Huynh" +msgstr "Số Con Cái Mỗi Phụ Huynh" msgid "Number of children per parent" -msgstr "Số lượng con cái từng phụ huynh" +msgstr "Số lượng con cái cho mỗi phụ huynh" msgid "Child Radius" -msgstr "Bán Kính Con Cái" +msgstr "Bán Kính của Con Cái" msgid "Radius of children around parent" -msgstr "Bán kính của con cái quanh phụ huynh" +msgstr "Bán kính của con cái chung quanh phụ huynh" msgid "Child Roundness" -msgstr "Độ Tròn Con Cái" +msgstr "Độ Tròn của Con Cái" msgid "Roundness of children around parent" -msgstr "Độ tròn của con cái quanh phụ huynh" +msgstr "Độ tròn của con cái chung quanh phụ huynh" msgid "Child Size" -msgstr "Kích Cỡ Con Cái" +msgstr "Kích Thước của Con Cái" msgid "A multiplier for the child particle size" -msgstr "Tỉ số phóng to cho kích cỡ hạt con cái" +msgstr "Hệ số tỷ lệ kích thước các hạt con cái" msgid "Random Child Size" -msgstr "Con Cái Kich Cỡ Ngẫu Nhiên" +msgstr "Đổi Kích Thước Con Cái Ngẫu Nhiên" msgid "Random variation to the size of the child particles" -msgstr "Ngẫu nhiên đổi kích cỡ của hạt con cái" +msgstr "Đổi kích thước hạt con cái một cách ngẫu nhiên" msgid "Children From" @@ -25124,7 +27361,7 @@ msgstr "Con Cái Từ" msgid "Create child particles" -msgstr "Chế tạo hạt con cái" +msgstr "Kiến Tạo các hạt con cái" msgid "Interpolated" @@ -25132,35 +27369,35 @@ msgstr "Nội Suy" msgid "Clump Curve" -msgstr "Đường Cong Kết Lại" +msgstr "Đường Cong Tạo Khóm" msgid "Curve defining clump tapering" -msgstr "Đường cong chỉ định nến kết" +msgstr "Đường cong định nghĩa vuốt thon thành khóm" msgid "Clump" -msgstr "Kết Lại" +msgstr "Khóm Lại" msgid "Clump Noise Size" -msgstr "Kích Cỡ Huyên Náo Kết Lại" +msgstr "Kích Thước Độ Nhiễu Khóm" msgid "Size of clump noise" -msgstr "Kích cỡ huyên náo kết lại" +msgstr "Kích thước độ nhiễu của khóm" msgid "Limit colliders to this collection" -msgstr "Hạn chế đồ va chạm ở trong sưu tập này" +msgstr "Giới hạn hoạt động của các vật va đập trong bộ sưu tập này mà thôi" msgid "Color Maximum" -msgstr "Màu Cực Đại" +msgstr "Màu Tối Đa" msgid "Maximum length of the particle color vector" -msgstr "Bề dài cực đại của vectơ màu của hạt" +msgstr "Độ dài tối đa vectơ màu của hạt" msgid "Total number of particles" @@ -25168,11 +27405,11 @@ msgstr "Tổng số hạt" msgid "Adaptive Subframe Threshold" -msgstr "Ngưỡng Hạ Bức Ảnh Ứng Phó" +msgstr "Giới Hạn Tạo Phân-Khung-Hình Tùy Ứng" msgid "The relative distance a particle can move before requiring more subframes (target Courant number); 0.01 to 0.3 is the recommended range" -msgstr "Khoảng cách tương đối một hạt có thể di chuyển trước cần thêm hạ bức ảnh (số Courant mục tiêu); 0.01 đến 0.3 là phạm vi khuyến khích dùng" +msgstr "Khoảng cách tương đối mà một hạt có thể di chuyển trước khi phải đòi hỏi phải tạo các phân-khung-hình (số Courant); 0.01-0.3 là phạm vi khuyến nghị" msgid "Long Hair" @@ -25180,23 +27417,23 @@ msgstr "Tóc Dài" msgid "Calculate children that suit long hair well" -msgstr "Tính con cái thì phù hợp tốt cho tóc dài" +msgstr "Tính các con cái phù hòa nhập với tóc dài" msgid "Damp" -msgstr "Tắt Đần" +msgstr "Giảm Chấn" msgid "Amount of damping" -msgstr "Lượng tắt dần" +msgstr "Cường độ lực giảm chấn" msgid "Display Color" -msgstr "Màu Hiển Thị:" +msgstr "Màu Hiển Thị" msgid "Display additional particle data as a color" -msgstr "Hiển thị thêm dữ liệu hạt bằng một màu" +msgstr "Hiển thị dữ liệu hạt bổ sung dưới dạng màu sắc" msgid "Particle Display" @@ -25204,7 +27441,7 @@ msgstr "Hiển Thị Hạt" msgid "How particles are displayed in viewport" -msgstr "Phương pháp hiển thị hạt trong màn chiếu" +msgstr "Phương pháp các hạt được hiển thị trong cổng nhìn" msgid "Rendered" @@ -25212,7 +27449,7 @@ msgstr "Kết Xuất" msgid "Cross" -msgstr "Chữ Thập" +msgstr "Giao Hòa/Hình Thập Tự" msgid "Display" @@ -25220,31 +27457,31 @@ msgstr "Hiển Thị" msgid "Percentage of particles to display in 3D view" -msgstr "Phần trăm hạt để hiển thị trong màn 3D" +msgstr "Lượng phần trăm của các hạt cho hiển thị trong khung nhìn 3D" msgid "Size of particles on viewport" -msgstr "Kích cỡ của hạt trong màn chiếu" +msgstr "Kích thước của các hạt trong cổng nhìn" msgid "How many steps paths are displayed with (power of 2)" -msgstr "Số lượng bước đường đi được hiển thị (mũ 2)" +msgstr "Số lượng bước mà các đường dẫn sẽ được hiển thị (mũ 2)" msgid "Distribution" -msgstr "Phân Phối" +msgstr "Phân Bổ" msgid "How to distribute particles on selected element" -msgstr "Làm sao phân phối các hạt trên một phần tử" +msgstr "Phương pháp phân bổ các hạt trên yếu tố đã chọn" msgid "Jittered" -msgstr "Hốt Hoảng" +msgstr "Biến Động" msgid "Amount of air drag" -msgstr "Mức độ cản trở của không khí" +msgstr "Lượng lực cản không khí" msgid "Stiffness" @@ -25252,95 +27489,95 @@ msgstr "Độ Cứng" msgid "Hair stiffness for effectors" -msgstr "Độ cứng tóc cho đồ hiệu ứng" +msgstr "Độ cứng của tóc cho các hiệu ứng viên" msgid "Effector Number" -msgstr "Số Đồ Hiệu Ứng" +msgstr "Số Hiệu Ứng Viên" msgid "How many particles are effectors (0 is all particles)" -msgstr "Số lượng là hạt là đồ hiệu ứng (0 là tất cả hạt)" +msgstr "Số lượng hạt làm hiệu ứng viên (0 thì toàn bộ các đều là hạt)" msgid "Emit From" -msgstr "Phát Từ" +msgstr "Phát Ra Từ" msgid "Where to emit particles from" -msgstr "Chỗ để phát hạt" +msgstr "Chỗ để phát ra các hạt" msgid "Give the starting velocity a random variation" -msgstr "Cho tốc độ bắt đầu một chênh lệch ngẫu nhiên" +msgstr "Cho một dịch chuyển ngẫu nhiên vào vận tốc khởi đầu" msgid "SPH Fluid Settings" -msgstr "Cài đặt Chất Lỏng SPH" +msgstr "Sắp Đặt cho Chất Lỏng SPH" msgid "Force Field 1" -msgstr "Lực Trường 1" +msgstr "Trường Lực 1" msgid "Force Field 2" -msgstr "Lực Trường 2" +msgstr "Trường Lực 2" msgid "Frame number to stop emitting particles" -msgstr "Số bức ảnh để dừng phát hạt" +msgstr "Ngừng phát sinh hạt ở khung hình số này" msgid "Frame number to start emitting particles" -msgstr "Số bức ảnh để bắt đầu phát hạt" +msgstr "Khởi công phát sinh hạt ở khung hình số này" msgid "Grid Randomness" -msgstr "Ngẫu Nhiên Đồ Thị" +msgstr "Sự Ngẫu Nhiên của Khung Lưới Đồ Thị" msgid "Add random offset to the grid locations" -msgstr "Cộng dịch ngẫu nhiên tại các vị trí của đồ thị" +msgstr "Thêm dịch chuyển ngẫu nhiên vào các vị trí của khung lưới đồ thị" msgid "The resolution of the particle grid" -msgstr "Độ phân giải của đồ thị hạt" +msgstr "Độ phân giải của khung lưới đồ thị hạt" msgid "Hair Length" -msgstr "Bề Dài Tóc" +msgstr "Chiều Dài của Tóc" msgid "Length of the hair" -msgstr "Bề dài của tóc" +msgstr "Chiều dài của tóc" msgid "Number of hair segments" -msgstr "Số lượng khúc tóc" +msgstr "Số phân đoạn của tóc" msgid "Hexagonal Grid" -msgstr "Đồ Thị Lục Giác" +msgstr "Khung Lưới Đồ Thị Lục Giác" msgid "Create the grid in a hexagonal pattern" -msgstr "Chế tạo đồ thị có hình dạng lục giác" +msgstr "Kiến Tạo khung lưới đồ thị có hình dạng lục giác" msgid "Show objects in this collection in place of particles" -msgstr "Hiện các vật thể trong sưu tập này thay thế hạt" +msgstr "Hiển thị các đối tượng trong bộ sưu tập này, thay vì các hạt" msgid "Show this object in place of particles" -msgstr "Hiện vật thể này thay thế hạt" +msgstr "Hiển thị đối tượng này, thay vì các hạt" msgid "Instance Collection Weights" -msgstr "Quyền Lượng Sưu Tập Thực Thể" +msgstr "Trọng Lượng Bộ Sưu Tập Thực Thể" msgid "Weights for all of the objects in the instance collection" -msgstr "Quyền lượng của tất cả vật thể trong sưu tập thực thể" +msgstr "Trọng lượng của toàn bộ các đối tượng trong bộ sưu tập thực thể" msgid "Integration" @@ -25348,7 +27585,7 @@ msgstr "Tích Phân" msgid "Algorithm used to calculate physics, from the fastest to the most stable and accurate: Midpoint, Euler, Verlet, RK4" -msgstr "Giải thuật để tính toán vật lý, từ lẹ nhất đến ổn định nhất và chính xác: Điểm Trung, Euler, Verlet, RK4" +msgstr "Thuật toán sử dụng để tính toán vật lý, từ nhanh nhất đến ổn định/chính xác nhất: Trung Điểm, Euler, Verlet, RK4" msgid "Euler" @@ -25360,7 +27597,7 @@ msgstr "Verlet" msgid "Midpoint" -msgstr "Điểm Trung" +msgstr "Trung Điểm" msgid "RK4" @@ -25368,43 +27605,53 @@ msgstr "RK4" msgid "Invert Grid" -msgstr "Đảo Nghịch Đồ Thị" +msgstr "Đảo Nghịch Khung Lưới Đồ Thị" msgid "Invert what is considered object and what is not" -msgstr "Đảo nghịch được cái gì là vật thể và không phải là vật thể" +msgstr "Đảo nghịch những gì được coi là đối tượng và những gì không phải" msgid "Particles were created by a fluid simulation" -msgstr "Hạt được chế tạo bởi mô phỏng chất lỏng" +msgstr "Hạt được kiến tạo bởi mô phỏng chất lỏng" msgid "Amount of jitter applied to the sampling" -msgstr "Lượng hốt hoảng được áp dụng khi lấy mẫu vật" +msgstr "Lượng biến động áp dụng khi lấy mẫu" msgid "Loop Count" -msgstr "Số lần Vòng Lặp" +msgstr "Số lần nhắc lại" msgid "Number of times the keys are looped" -msgstr "Số lần bức ảnh mẫu được lặp vòng" +msgstr "Số lần hình mẫu được nhắc lại" msgid "Keys Step" -msgstr "Bước Mẫu" +msgstr "Bước Hình Mẫu" msgid "Type of periodic offset on the path" -msgstr "Loại dịch chu kỳ trên đường đi" +msgstr "Kiểu dịch chuyển theo chu kỳ trên đường dẫn" + + +msgctxt "ParticleSettings" +msgid "Nothing" +msgstr "Không Có Gì" + + +msgctxt "ParticleSettings" +msgid "Spiral" +msgstr "Xoắn Ốc" msgid "Amplitude Clump" -msgstr "Biên Độ Kết Lại" +msgstr "Biên Độ Tạo Khóm" msgid "How much clump affects kink amplitude" -msgstr "Mức kết lại được ảnh hưởng biên độ thắt nút" +msgstr "Quá trình tạo khóm tác động độ xoắn vặn bao nhiêu" msgid "Amplitude Random" @@ -25412,7 +27659,7 @@ msgstr "Biên Độ Ngẫu Nhiên" msgid "Random variation of the amplitude" -msgstr "Lệch lạc ngẫu nhiên của biên độ" +msgstr "Biến đổi ngẫu nhiên của biên độ" msgid "Axis Random" @@ -25420,23 +27667,23 @@ msgstr "Trục Ngẫu Nhiên" msgid "Random variation of the orientation" -msgstr "Lệch lạc định hướng ngẫu nhiên" +msgstr "Biến đổi ngẫu nhiên của định hướng" msgid "Extra Steps" -msgstr "Bước Thêm" +msgstr "Số Bước Bổ Sung" msgid "Extra steps for resolution of special kink features" -msgstr "Bước thêm cho độ phân giải của đặc trưng thắt nút đặc biệt" +msgstr "Số bước bổ sung dành cho độ phân giải của các tính năng xoắn vặn đặc biệt" msgid "Flatness" -msgstr "Độ Bằng Phẳng" +msgstr "Độ Phẳng" msgid "How flat the hairs are" -msgstr "Độ bằng phẳng của tóc" +msgstr "Độ phẳng của tóc" msgid "Random Length" @@ -25444,7 +27691,7 @@ msgstr "Độ Dài Ngẫu Nhiên" msgid "Give path length a random variation" -msgstr "Cho bề dài đường đi một lệch lạc ngẫu nhiên" +msgstr "Làm cho chiều dài đường đi thay đổi ngẫu nhiên" msgid "Lifetime" @@ -25452,19 +27699,19 @@ msgstr "Tuổi Thọ" msgid "Life span of the particles" -msgstr "Tuổi thọ của hạt" +msgstr "Tuổi thọ của hệ thống hạt" msgid "Give the particle life a random variation" -msgstr "Cho tuổi thọ một lệch lạc ngẫu nhiên" +msgstr "Làm cho tuổi thọ thay đổi ngẫu nhiên" msgid "Length of the line's head" -msgstr "Bề dài của đầu đường" +msgstr "Chiều dài phần đầu của đường thẳng" msgid "Length of the line's tail" -msgstr "Bề dài của đuôi đường" +msgstr "Chiều dài phần đuôi của đường thẳng" msgid "Boids 2D" @@ -25472,7 +27719,7 @@ msgstr "Quần Thể 2D" msgid "Constrain boids to a surface" -msgstr "Ràng buộc đản thể ở trên mặt" +msgstr "Ràng buộc quần thể vào bề mặt" msgid "Mass" @@ -25484,15 +27731,15 @@ msgstr "Khối lượng của các hạt" msgid "Index of material slot used for rendering particles" -msgstr "Chỉ số của khe vật liệu dùng cho kết xuất hạt" +msgstr "Chỉ số của khe nguyên vật liệu dùng cho quá trình kết xuất hạt" msgid "Material Slot" -msgstr "Khe Vật Liệu" +msgstr "Khe Nguyên Vật Liệu" msgid "Material slot used for rendering particles" -msgstr "Khe vật liệu dùng cho kết xuất hạt" +msgstr "Khe nguyên vật liệu dùng cho quá trình kết xuất hạt" msgid "Dummy" @@ -25500,59 +27747,59 @@ msgstr "Giả" msgid "Let the surface normal give the particle a starting velocity" -msgstr "Cho pháp tuyến mặt đặt tốc độ bắt đầu của hạt" +msgstr "Cho pháp tuyến bề mặt định vận tốc khởi đầu của hạt" msgid "Object Aligned" -msgstr "Vật Thể Được Sắp Xếp" +msgstr "Canh theo Đối Tượng" msgid "Let the emitter object orientation give the particle a starting velocity" -msgstr "Cho định hướng của vật thể phát hạt được đặt tốc độ bắt đầu của hạt" +msgstr "Để định hướng của đối tượng phát sinh định vận tốc khởi đầu của hạt" msgid "Object Velocity" -msgstr "Vận Tốc Vật Thể" +msgstr "Vận Tốc của Đối Tượng" msgid "Let the object give the particle a starting velocity" -msgstr "Cho vật thể được đặt tốc độ bắt đầu của hạt" +msgstr "Để đối tượng đặt vận tốc khởi đầu của hệ thống hạt" msgid "Let the target particle give the particle a starting velocity" -msgstr "Cho hạt mục tiêu được đặt tốc độ bắt đầu của hạt" +msgstr "Để hệ thống hạt mục tiêu đặt vận tốc khởi đầu của hạt" msgid "The size of the particles" -msgstr "Kích cỡ của các hạt" +msgstr "Kích thước của hệ thống hạt" msgid "Path End" -msgstr "Kết Thúc Đường Đi" +msgstr "Kết Thúc Đường Dẫn" msgid "End time of path" -msgstr "Thời gian kết thúc của đường đi" +msgstr "Thời gian kết thúc của đường dẫn" msgid "Path Start" -msgstr "Bắt Đầu Đường Đi" +msgstr "Khởi Đầu Đường Dẫn" msgid "Starting time of path" -msgstr "Thời gian bắt đầu của đường đi" +msgstr "Thời gian khởi đầu của đường dẫn" msgid "Rotation around the chosen orientation axis" -msgstr "Xoay quanh trục định hướng được chọn" +msgstr "Sự xoay chiều quanh trục định hướng đã chọn" msgid "Random Phase" -msgstr "Pha Ngẫu Nhiên" +msgstr "Ngẫu Nhiên Hóa Pha" msgid "Randomize rotation around the chosen orientation axis" -msgstr "Xoay ngẫu nhiên quanh trục định hướng được chọn" +msgstr "Sự xoay chiều ngẫu nhiên quanh trục định hướng đã chọn" msgid "Physics Type" @@ -25560,7 +27807,7 @@ msgstr "Loại Vật Lý" msgid "Particle physics type" -msgstr "Loại vật lý hạt" +msgstr "Thể loại vật lý hạt" msgid "Newtonian" @@ -25568,39 +27815,39 @@ msgstr "Newton" msgid "Keyed" -msgstr "Bức Ảnh Mẫu" +msgstr "Khóa Hóa" msgid "Diameter Scale" -msgstr "Phóng To Đường Kính" +msgstr "Tỷ Lệ Đường Kính" msgid "Multiplier of diameter properties" -msgstr "Hệ số nhân đặc tính đường kính" +msgstr "Số nhân của các tính chất đường kính" msgid "React On" -msgstr "Phản Ứng Với" +msgstr "Phản Ứng Tại Thời Điểm" msgid "The event of target particles to react on" -msgstr "Sự Kiện nào của hạt mục tiêu để phản ứng" +msgstr "Sự kiện mà các hệ thống hạt mục tiêu sẽ phản ứng" msgid "Death" -msgstr "Hủy Diệt" +msgstr "Chết" msgid "Reactor" -msgstr "Đồ Phản Ứng" +msgstr "Phản Ứng Viên" msgid "Let the vector away from the target particle's location give the particle a starting velocity" -msgstr "Dùng vectơ chỉ hướng xa từ vị trí hạt mục tiêu đặt tốc độ bắt đầu cho hạt" +msgstr "Cho phép vectơ nằm cách xa vị trí của hệ thống hạt mục tiêu đặt vận tốc khởi đầu cho hạt" msgid "How many steps paths are rendered with (power of 2)" -msgstr "Số lượng bước đường đi được kết xuât (mũ 2)" +msgstr "Số lượng bước mà đường dẫn được kết xuất (mũ 2)" msgid "Particle Rendering" @@ -25616,19 +27863,19 @@ msgstr "Hào Quang" msgid "Rendered Children" -msgstr "Con Cái Được Kết Xuất" +msgstr "Số Con Cái được Kết Xuất" msgid "Number of children per parent for rendering" -msgstr "Số lượng con cái từng phụ huynh để kết xuất" +msgstr "Số lượng con cái để kết xuất cho mỗi phụ huynh" msgid "Root Diameter" -msgstr "Đường Kính Rễ" +msgstr "Đường Kính Gốc" msgid "Strand diameter width at the root" -msgstr "Đường kính của sợi tại rễ" +msgstr "Đường kính cho chiều rộng ở gốc" msgid "Random Orientation" @@ -25636,7 +27883,7 @@ msgstr "Định Hướng Ngẫu Nhiên" msgid "Randomize particle orientation" -msgstr "Cho các hạt định hướng ngẫu nhiên" +msgstr "Ngẫu nhiên hóa định hướng của hạt" msgid "Orientation Axis" @@ -25644,11 +27891,11 @@ msgstr "Trục Định Hướng" msgid "Particle orientation axis (does not affect Explode modifier's results)" -msgstr "Trục định hướng của hạt (sẽ không ảnh hưởng kết qủa bộ điều chỉnh Nổ)" +msgstr "Trục định hướng của hạt (sẽ không ảnh hưởng đến kết quả của Bộ Điều Chỉnh Nổ Tung)" msgid "Normal-Tangent" -msgstr "Pháp Tuyến-Tiếp Tuyến" +msgstr "Pháp Tiếp Tuyến" msgid "Velocity / Hair" @@ -25656,75 +27903,75 @@ msgstr "Vận Tốc / Tóc" msgid "Object X" -msgstr "X Vật Thể" +msgstr "X của Đối Tượng" msgid "Object Y" -msgstr "Y Vật Thể" +msgstr "Y của Đối Tượng" msgid "Object Z" -msgstr "Z Vật Thể" +msgstr "Z của Đối Tượng" msgid "Roughness 1" -msgstr "Độ Nhám 1" +msgstr "Độ Rối 1" msgid "Amount of location dependent roughness" -msgstr "Mức độ của độ nhám tùy vị trí" +msgstr "Lượng rối phụ thuộc vào vị trí" msgid "Size 1" -msgstr "Kích Cỡ 1" +msgstr "Cỡ 1" msgid "Size of location dependent roughness" -msgstr "Kích cỡ của độ nhám tùy vị trí" +msgstr "Cỡ rối phụ thuộc vào vị trí" msgid "Roughness 2" -msgstr "Độ Nhám 2" +msgstr "Độ Rối 2" msgid "Amount of random roughness" -msgstr "Mức độ của độ nhám ngẫu nhiên" +msgstr "Lượng rối ngẫu nhiên" msgid "Size 2" -msgstr "Kích Cỡ 2" +msgstr "Cỡ 2" msgid "Size of random roughness" -msgstr "Kích cỡ của độ nhám ngẫu nhiên" +msgstr "Cỡ rối ngẫu nhiên" msgid "Amount of particles left untouched by random roughness" -msgstr "Mức độ hạt không bị ảnh hưởng bởi độ nhám ngẫu nhiên" +msgstr "Lượng hạt không bị ảnh hưởng bởi độ rối ngẫu nhiên" msgid "Roughness Curve" -msgstr "Đường Cong Độ Nhám" +msgstr "Đường Cong của Độ Rối" msgid "Curve defining roughness" -msgstr "Đường cong được chỉ định độ nhám" +msgstr "Đường cong định nghĩa độ rối" msgid "Shape of endpoint roughness" -msgstr "Hình dạng của độ nhám của điểm cuối" +msgstr "Hình dạng rối của đầu cuối" msgid "Roughness Endpoint" -msgstr "Điểm Cuối Độ Nhám" +msgstr "Lượng Rối Đầu Cuối" msgid "Amount of endpoint roughness" -msgstr "Mức độ của độ nhám của điểm cuối" +msgstr "Lượng rối của đầu cuối" msgid "Strand shape parameter" -msgstr "Tham số hình dạng sợi tóc" +msgstr "Tham số hình dạng của sợi" msgid "Guide Hairs" @@ -25732,67 +27979,67 @@ msgstr "Tóc Hướng Dẫn" msgid "Show guide hairs" -msgstr "Hiện tóc hướng dẫn" +msgstr "Hiển thị các sợi tóc hướng dẫn" msgid "Show hair simulation grid" -msgstr "Hiện đồ thị mô phỏng tóc" +msgstr "Hiển thị khung lưới đồ thị mô phỏng tóc" msgid "Display boid health" -msgstr "Hiện thỉ sức khỏe quần thể" +msgstr "Hiển thị sức khỏe của quần thể" msgid "Number" -msgstr "Số" +msgstr "Số/Lượng" msgid "Show particle number" -msgstr "Hiện số hạt" +msgstr "Hiển thị số của hạt" msgid "Show particle size" -msgstr "Hiện kích cỡ hạt" +msgstr "Hiển thị kích thước hạt" msgid "Unborn" -msgstr "Chưa Sanh" +msgstr "Chưa Sinh Ra" msgid "Show particles before they are emitted" -msgstr "Hiện hạt trước được phát hành" +msgstr "Hiển thị hạt trước khi chúng được phát hành" msgid "Show particle velocity" -msgstr "Hiện vận tốc hạt" +msgstr "Hiển thị vận tốc hạt" msgid "Random Size" -msgstr "Kích cỡ ngẫu nhiên" +msgstr "Kích Thước Ngẫu Nhiên" msgid "Give the particle size a random variation" -msgstr "Cho các hạt kích cỡ một lệch lạc ngẫu nhiên" +msgstr "Ngẫu nhiên hóa kích thước của hạt" msgid "Subframes to simulate for improved stability and finer granularity simulations (dt = timestep / (subframes + 1))" -msgstr "Hạ bức ảnh để giúp làm mô phỏng ổn định hơn và mô phòng mịn hơn (dt = bức ảnh / (hạ bức ảnh + 1))" +msgstr "Phân-khung-hình để giúp việc mô phỏng, cải thiện độ ổn định và mô phỏng chi tiết mịn màng hơn (dt = timestep / (subframes + 1))" msgid "Let the surface tangent give the particle a starting velocity" -msgstr "Cho tiếp tuyến mặt đặt tốc độ bắt đầu của hạt" +msgstr "Cho tiếp tuyến bề mặt đặt tốc độ bắt đầu của hạt" msgid "Rotate the surface tangent" -msgstr "Xoay tiếp tuyến của mặt" +msgstr "Xoay tiếp tuyến của bề mặt" msgid "Tweak" -msgstr "Chỉnh" +msgstr "Hiệu Chỉnh" msgid "A multiplier for physics timestep (1.0 means one frame = 1/25 seconds)" -msgstr "Hệ số nhân cho bước thời gian vật lý (1.0 nghĩa một bức ảnh = 1/25 giây)" +msgstr "Một số nhân cho bước thời gian trong vật lý (1.0 nghĩa là một khung hình = 1/25 giây)" msgid "Timestep" @@ -25800,39 +28047,39 @@ msgstr "Bước Thời Gian" msgid "The simulation timestep per frame (seconds per frame)" -msgstr "Bước thời gian mỗi bức ảnh của mô phỏng (giây/bức ảnh)" +msgstr "Bước thời gian mỗi khung hình của mô phỏng (giây/khung hình)" msgid "Tip Diameter" -msgstr "Đường Kính Đỉnh" +msgstr "Đường Kính ở Đỉnh Đầu" msgid "Strand diameter width at the tip" -msgstr "Đường kính của sợi tại đỉnh" +msgstr "Đường kính cho chiều rộng của sợi ở đỉnh đầu" msgid "Trail Count" -msgstr "Số Lượng Vệt" +msgstr "Số Vệt Đuôi" msgid "Number of trail particles" -msgstr "Số lượng của hạt vệt" +msgstr "Số lượng hạt làm vệt đuôi" msgid "Twist" -msgstr "Xoắn" +msgstr "Xoắn Vặn" msgid "Number of turns around parent along the strand" -msgstr "Sô lượng xoắn quanh phụ huynh theo hướng sợi" +msgstr "Số vòng xoay quay phụ huynh dọc theo sợi" msgid "Twist Curve" -msgstr "Đường Cong Xoắn" +msgstr "Đường Cong Xoắn Vặn" msgid "Curve defining twist" -msgstr "Đường cong chỉ định xoắn" +msgstr "Đường cong định nghĩa đường xoắn vặn" msgid "Particle type" @@ -25840,23 +28087,23 @@ msgstr "Loại hạt" msgid "Hair" -msgstr "Tóc" +msgstr "Tóc/Lông" msgid "Absolute Path Time" -msgstr "Thời Gian Đường Tuyệt Đối" +msgstr "Thời Gian Đường Đi Tuyệt Đối" msgid "Path timing is in absolute frames" -msgstr "Thời tự đường đi bằng đơn vị bức ảnh tuyệt đối" +msgstr "Thời gian của đường đi được tính bằng số khung hình tuyệt đối" msgid "Automatic Subframes" -msgstr "Hạ Bức Ảnh Tự Động" +msgstr "Khung Hình Phủ Tự Động" msgid "Automatically set the number of subframes" -msgstr "Tự động đặt số lượng hạ bực ảnh" +msgstr "Tự động đặc số lượng bực ảnh phủ" msgid "Advanced" @@ -25864,39 +28111,39 @@ msgstr "Cao Cấp" msgid "Use full physics calculations for growing hair" -msgstr "Sử dụng tính vật lý toàn bộ cho móc tóc" +msgstr "Dùng tính vật lý toàn bộ cho móc tóc" msgid "Close Tip" -msgstr "Đóng Đỉnh" +msgstr "Đỉnh Kín" msgid "Set tip radius to zero" -msgstr "Đặt bán kính đỉnh tóc = 0" +msgstr "Đặt bán kính đỉnh = 0 (đóng kín lại, không để hở)" msgid "Use Clump Curve" -msgstr "Sử Dụng Cong Kết Lại" +msgstr "Dùng Đường Cong cho Khóm" msgid "Use a curve to define clump tapering" -msgstr "Sử dụng một đường cong để chỉ định nến kết lại" +msgstr "Dùng một đường cong để xác định độ vuốt thon của khóm" msgid "Use Clump Noise" -msgstr "Sử dụng Huyên Náo Kết Lại" +msgstr "Dùng Nhiễu Loạn cho Khóm" msgid "Create random clumps around the parent" -msgstr "Tạo nên kết lại ngẫu nhiên quanh phụ huynh" +msgstr "Kiến Tạo các khóm ngẫu nhiên quanh phụ huynh" msgid "Use Count" -msgstr "Sử Dụng Số Lượng" +msgstr "Dùng Số Lượng" msgid "Use object multiple times in the same collection" -msgstr "Sử dụng vật thể nhiều lần trong cùng sưu tập" +msgstr "Sử dụng đối tượng trong cùng bộ sưu tập nhều lần (nhắc đi nhắc lại)" msgid "Pick Random" @@ -25904,63 +28151,63 @@ msgstr "Chọn Ngẫu Nhiên" msgid "Pick objects from collection randomly" -msgstr "Ngẫu nhiên Chọn vật thể từ sưu tập kiểu" +msgstr "Chọn các đối tượng từ bộ sưu tập một cách ngẫu nhiên" msgid "Died" -msgstr "Đã Diệt" +msgstr "Đã Chết" msgid "Show particles after they have died" -msgstr "Hiện hạt sau bị hủy diệt" +msgstr "Hiển thị các hạt sau khi chúng đã chết" msgid "Die on Hit" -msgstr "Hủy Diệt khi Va Chạm" +msgstr "Chết khi Bị Đập Trúng" msgid "Particles die when they collide with a deflector object" -msgstr "Hạt được hủy diệt khi va chạm với vật thể trẹo" +msgstr "Hạt chết khi bị va đập với một đối tượng làm lệch hướng" msgid "Particle rotations are affected by collisions and effectors" -msgstr "Xoay của hạt bị ảnh hưởng bởi va chạm và đồ hiệu ứng" +msgstr "Sự xoay chiều của hạt bị các va đập và các hiệu ứng viên tác động tới" msgid "Emit in random order of elements" -msgstr "Phát hành kiểu thứ tự ngẫu nhiên" +msgstr "Phát sinh theo thứ tự ngẫu nhiên của các yếu tố" msgid "Even Distribution" -msgstr "Phân Phối Đều" +msgstr "Phân Bổ Đều" msgid "Use even distribution from faces based on face areas or edge lengths" -msgstr "Phát hạt từ mật dùng phôn phối đều tùy diện tích mặt hay bề dài các cạnh" +msgstr "Dùng sự phân bổ đồng đều trên các Mặt dựa trên diện tích của Mặt hoặc chiều dài của cạnh" msgid "Use object's global coordinates for duplication" -msgstr "Dùng tọa độ toàn cầu của vật thể khi sao chép" +msgstr "Dùng tọa độ toàn cầu của đối tượng để sao chép" msgid "Interpolate hair using B-Splines" -msgstr "Suy nội tóc bằng Mâu Cong-B" +msgstr "Nội suy tóc bằng các đường cong Chốt Trục Cơ Sở" msgid "Use Modifier Stack" -msgstr "Dùng Xếp Đống Bộ Điều Chỉnh" +msgstr "Dùng Ngăn Xếp của Bộ Điều Chỉnh" msgid "Emit particles from mesh with modifiers applied (must use same subdivision surface level for viewport and render for correct results)" -msgstr "Phát hạt từ mạng lưới có áp dụng bộ điều chỉnh (phải dùng mức phân hóa bề mặt giống cho màn chiếu và kết xuất để được kết quả đúng)" +msgstr "Phát sinh các hạt từ khung lưới có các bộ điều chỉnh đã được áp dụng (nhất định phải sử dụng mức bề mặt phân hóa tương đồng, trong cổng nhìn và trong kết xuất, để đạt được kết quả đúng đắn)" msgid "Mass from Size" -msgstr "Khối Lượng Từ Kích Cỡ" +msgstr "Khối Lượng Từ Kích Thước" msgid "Multiply mass by particle size" -msgstr "Nhân khối lượng với kich cỡ" +msgstr "Nhân khối lượng với kích thước" msgctxt "ParticleSettings" @@ -25969,11 +28216,11 @@ msgstr "Phụ Huynh" msgid "Render parent particles" -msgstr "Kết xuất hạt phụ huyh" +msgstr "Kết xuất các hạt phụ huynh" msgid "Multi React" -msgstr "Phản Ứng Nhiều" +msgstr "Đa Phản Ứng" msgid "React multiple times" @@ -25985,99 +28232,99 @@ msgstr "Đầu/Cuối" msgid "Give birth to unreacted particles eventually" -msgstr "Từ từ sanh hạt chưa được phản ứng" +msgstr "Cuối cùng sinh nở các hạt không phản ứng" msgid "Regrow" -msgstr "Móc Lại" +msgstr "Làm Mọc Lại" msgid "Regrow hair for each frame" -msgstr "Móc tóc lại cho mỗi bức ảnh" +msgstr "Ở khung hình nào cũng làm cho tóc mọc lại" msgid "Adaptive Render" -msgstr "Kết Xuất Ứng Phó" +msgstr "Kết Xuất Tùy Ứng" msgid "Display steps of the particle path" -msgstr "Hiển thị bước của đường đi của hạt" +msgstr "Hiển thị số bước đường dẫn của hạt" msgid "Use object's rotation for duplication (global x-axis is aligned particle rotation axis)" -msgstr "Dùng xoay của vật thể để sao chép (trục-x toàn cầu là trục xoay sắp xếp)" +msgstr "Dùng sự xoay chiều của đối tượng để sao chép (trục-x toàn cầu là trục xoay hệ thống hạt)" msgid "Rotations" -msgstr "Xoay" +msgstr "Sự Xoay Chiều" msgid "Calculate particle rotations" -msgstr "Tính xoay cho hạt" +msgstr "Tính toán sự xoay chiều của hạt" msgid "Use Roughness Curve" -msgstr "Dùng Đường Cong Độ Nhám" +msgstr "Dùng Đường Cong cho Độ Rối" msgid "Use a curve to define roughness" -msgstr "Dùng một đường cong cho chỉ định độ nhám" +msgstr "Dùng một đường cong để định nghĩa độ rối" msgid "Use object's scale for duplication" -msgstr "Dùng phóng to của vật thể khi sao chép" +msgstr "Dùng tỷ lệ của đối tượng để sao chép" msgid "Self Effect" -msgstr "Tự Hiệu Ứng" +msgstr "Tự Tác Động" msgid "Particle effectors affect themselves" -msgstr "Đồ hhiệu ứng hạt được tự ảnh hưởng mình" +msgstr "Các hiệu ứng viên của hạt tự tác động tới bản thân" msgid "Size Deflect" -msgstr "Kích Cỡ Trẹo" +msgstr "Đi Lệch Do Kích Thước" msgid "Use particle's size in deflection" -msgstr "Dùng kích cỡ hạt khi chệch hướng" +msgstr "Dùng kích thước của hạt trong sự di chuyển lệch hướng" msgid "Strand Render" -msgstr "Kết Xuất Sợi Dây" +msgstr "Kết Xuất Sợi" msgid "Use the strand primitive for rendering" -msgstr "Dùng sợi đơn giản để kết xuất" +msgstr "Dùng hình cơ bản của sợi để kết xuất" msgid "Use Twist Curve" -msgstr "Sử Dụng Đươờng Cong Xoắn" +msgstr "Sử Dụng Đường Cong Xoắn Vặn" msgid "Use a curve to define twist" -msgstr "Sử dụng một đường cong cho chỉ định xoắn" +msgstr "Dùng một đường cong để xác định xoắn vặn" msgid "Multiply line length by particle speed" -msgstr "Nhân bề dài đường với tốc độ hạt" +msgstr "Nhân chiều dài của đường với tốc độ hạt" msgid "Whole Collection" -msgstr "Toàn Sưu Tập" +msgstr "Toàn Bộ Bộ Sưu Tập" msgid "Use whole collection at once" -msgstr "Sử dụng toàn sưu tập một lượt" +msgstr "Sử dụng toàn bộ bộ sưu tập cùng một lúc" msgid "Particles/Face" -msgstr "Hạt/Mặt" +msgstr "Số Hạt/Mặt" msgid "Emission locations per face (0 = automatic)" -msgstr "Vị trí phát xạ từng mặt (0 = tự động)" +msgstr "Số vị trí phát trên mỗi Mặt (0 = tự động)" msgid "Virtual Parents" @@ -26089,23 +28336,35 @@ msgstr "Số lượng tương đối của phụ huynh ảo" msgid "Point cloud data-block" -msgstr "Cục dữ liệu mây điểm" +msgstr "Khối dữ liệu đám mây điểm" msgid "Scene data-block, consisting in objects and defining time and render related settings" -msgstr "Cục dữ liệu cảnh, gồm vật thể và chỉ định thời gian và cài đặt kết xuất liên được quan" +msgstr "Khối dữ liệu của cảnh, bao gồm các đối tượng nằm trong cảnh, thời gian đã định và các sắp đặt liên quan đến kết xuất" msgid "Active Movie Clip" -msgstr "Đoạn Phim Hoạt Động" +msgstr "Đoạn Phim đang Hoạt Động" msgid "Active Movie Clip that can be used by motion tracking constraints or as a camera's background image" -msgstr "Đoạn Phim Hoạt Động cho các ràng buộc theo dõi chuyển động hay là một ảnh cảnh sau của máy quay phim được sử dụng" +msgstr "\"Đoạn Phim đang Hoạt Động có thể được sử dụng bởi các ràng buộc giám sát chuyển động hoặc làm hình nền của máy quay phim" + + +msgid "Mirror Bone" +msgstr "Xương Phản Chiếu Đối Xứng" + + +msgid "Bone to use for the mirroring" +msgstr "Xương sử dụng để phản chiếu đối xứng" msgid "Mirror Object" -msgstr "Vật Thể Gương" +msgstr "Đối Tượng Phản Chiếu Đối Xứng" + + +msgid "Object to mirror over. Leave empty and name a bone to always mirror over that bone of the active armature" +msgstr "Đối tượng để phản chiếu đối xứng sang bên kia. Để trống và đặt tên cho một xương để luôn luôn phản chiếu đối xứng qua xương của khung cốt đang hoạt động ấy" msgid "Distance Model" @@ -26113,11 +28372,11 @@ msgstr "Mô Hình Khoảng Cách" msgid "Distance model for distance attenuation calculation" -msgstr "Mô hình để tịnh giảm âm lượng tùy khoảng cách" +msgstr "Mô hình khoảng cách để tính toán sự suy giảm do khoảng cách gây ra" msgid "No distance attenuation" -msgstr "Không giảm âm lượng tùy khoảng cách" +msgstr "Không có sự suy giảm gây ra do khoảng cách" msgid "Inverse" @@ -26125,27 +28384,43 @@ msgstr "Đảo Nghịch" msgid "Inverse distance model" -msgstr "Mô hình đảo nghịch" +msgstr "Đảo nghịch mô hình khoảng cách" msgid "Inverse Clamped" -msgstr "Nghịch Kẹp Lại" +msgstr "Đảo Nghịch Hạn Định" msgid "Inverse distance model with clamping" -msgstr "Mô hình khoảng cách đảo nghịch và kẹp lại" +msgstr "Mô hình khoảng cách đảo nghịch với hạn định" msgid "Linear distance model" -msgstr "Mô hình bậc một" +msgstr "Mô hình tuyến tính" msgid "Linear Clamped" -msgstr "Bậc Một Kẹp Lại" +msgstr "Tuyến Tính Hạn Định" msgid "Linear distance model with clamping" -msgstr "Mô hình khoảng cách bậc một và kẹp lại" +msgstr "Mô hình khoảng cách tuyến tính có hạn định" + + +msgid "Exponential" +msgstr "Lũy Thừa" + + +msgid "Exponential distance model" +msgstr "Mô hình khoảng cách cấp số mũ" + + +msgid "Exponential Clamped" +msgstr "Lũy Thừa Hạn Định" + + +msgid "Exponential distance model with clamping" +msgstr "Mô hình khoảng cách cấp số mũ có hạn định" msgid "Doppler Factor" @@ -26153,7 +28428,7 @@ msgstr "Hệ Số Doppler" msgid "Pitch factor for Doppler effect calculation" -msgstr "Hệ số để chỉnh tần số khi tính hiệu ứng Doppler" +msgstr "Hệ số độ cao để tính toán hiệu ứng Doppler" msgid "Speed of Sound" @@ -26169,15 +28444,15 @@ msgstr "Cảnh Nền" msgid "Background set scene" -msgstr "Tập cảnh nền" +msgstr "Nền của cảnh" msgid "Active camera, used for rendering the scene" -msgstr "Máy quay phim hoạt động được dùng cho kết xuất cảnh" +msgstr "Máy quay phim đang hoạt động, dùng để kết xuất cảnh" msgid "Scene root collection that owns all the objects and other collections instantiated in the scene" -msgstr "Sưu tập cảnh rễ được sở hữu hết vật thể và các sưu tập khác được thực thể trong cảnh" +msgstr "Bộ sưu tập gốc của cảnh, chứa các đối tượng và các bộ sưu tập khác đã được thực thể hóa thành trong cảnh" msgid "3D Cursor" @@ -26185,131 +28460,147 @@ msgstr "Con Trỏ 3D" msgid "Cycles Render Settings" -msgstr "Cài Đặt Kết Xuất Cycles" +msgstr "Sắp Đặt cho Kết Xuất Cycles" msgid "Cycles render settings" -msgstr "Cài đặt kết xuất Cycles" +msgstr "Sắp đặt cho kết xuất Cycles" msgid "Cycles Curves Rendering Settings" -msgstr "Cài Đặc Kết Xuất Đường Cong Cycles" +msgstr "Sắp Đặt Kết Xuất Đường Cong của Cycles" msgid "Cycles curves rendering settings" -msgstr "Cài đặt kết xuất cho đường cong trong Cycles" +msgstr "Sắp đặt kết xuất đường cong của Cycles" msgid "Scene Display" -msgstr "Hiển Thị Cảnh" +msgstr "Hiển Thị của Cảnh" msgid "Scene display settings for 3D viewport" -msgstr "Cài đặt cho hiển thị của màn chiếu 3D" +msgstr "Các sắp đặt về hiển thị cảnh trong cổng nhìn 3D" msgid "Display Settings" -msgstr "Cài Đặt Hiển Th" +msgstr "Sắp Đặt về Hiển Thị" msgid "Settings of device saved image would be displayed on" -msgstr "Cài đặt của thiết bị được hiển thị ảnh" +msgstr "Sắp đặt của thiết bị sẽ sử dụng để hiển thị hình ảnh đã lưu" + + +msgid "EEVEE settings for the scene" +msgstr "Các cài đặt về cảnh trong EEVEE" msgid "Current Frame" -msgstr "Bức Ảnh Hiện Tại" +msgstr "Khung Hình Hiện Tại" + + +msgid "Current frame, to update animation data from Python frame_set() instead" +msgstr "Khung hình hiện tại, để cập nhật dữ liệu hoạt họa từ Python frame_set() thay vì" msgid "Current Frame Final" -msgstr "Bức Ảnh Hiện Cuối" +msgstr "Kết Cục của Khung Hình Hiện Tại" msgid "Current frame with subframe and time remapping applied" -msgstr "Bức ảnh hiện tại được áp dụng hạ bức ảnh và ánh xạ lại thời gian" +msgstr "Khung hình hiện tại đã được áp dụng phân-khung-hình và bố trí lại thời gian" msgid "Final frame of the playback/rendering range" -msgstr "Bức ảnh cuối của phạm vi hát/kết xuất" +msgstr "Khung hình cuối của phạm vi chơi lại/kết xuất" msgid "Current Subframe" -msgstr "Hạ Bức Ảnh Hiện Tại" +msgstr "Số Phân Khung Hình Hiện Tại" msgid "Preview Range End Frame" -msgstr "Bức Ảnh Cuối Của Phạm Vi Dự Khán" +msgstr "Khung Hình Cuối Phạm Vi Xem Trước" msgid "Alternative end frame for UI playback" -msgstr "Bức ảnh cuối thay phiên cho hát lại trong giao diện" +msgstr "Khung hình cuối khác cho quá trình chơi lại trong giao diện người dùng (UI)" msgid "Preview Range Start Frame" -msgstr "Bức Ảnh Đầu Của Phạm Vi Dự Khán" +msgstr "Khung Hình Đầu Phạm Vi Xem Trước" msgid "Alternative start frame for UI playback" -msgstr "Bức ảnh bắt đầu thay phiên cho hát lại trong giao diện" +msgstr "Khung hình đầu khác cho quá trình chơi lại trong giao diện người dùng (UI)" msgid "First frame of the playback/rendering range" -msgstr "Bức ảnh đầu của phạm vi hát lại/kết xuất" +msgstr "Khung hình đầu của phạm vi chơi lại/kết xuất" msgid "Number of frames to skip forward while rendering/playing back each frame" -msgstr "Số lượng bức ảnh cho nhảy tới khi hát lại/kết xuất mỗi bức ảnh" +msgstr "Số lượng khung hình cho nhảy cách khi chơi lại/kết xuất mỗi cái" msgid "Constant acceleration in a given direction" -msgstr "Gia tốc hằng số cho một hướng được xác định" +msgstr "Tăng tốc bất biến trong hướng đã cho" msgid "Annotations" -msgstr "Lời Ghi Chú" +msgstr "Chú Thích" msgid "Grease Pencil data-block used for annotations in the 3D view" -msgstr "Cục dữ liệu Bút Sáp được sử dụng cho lời ghi chú trong màn chiếu 3D" +msgstr "Khối dữ liệu Bút Chì Dầu sử dụng cho các chú thích trong khung nhìn 3D" msgid "Grease Pencil settings for the scene" -msgstr "Cài đặt Bút Sắp cho cảnh" +msgstr "Các sắp đặt của Bút Chì Dầu cho cảnh" + + +msgid "Hydra settings for the scene" +msgstr "Cài đặt Hydra cho cảnh" + + +msgid "Hydra Storm properties" +msgstr "Tính chất của Hydra Storm" msgid "NLA Tweak Mode" -msgstr "Chế Độ Chỉnh NLA" +msgstr "Chế Độ Hiệu Chỉnhh NLA" msgid "Whether there is any action referenced by NLA being edited (strictly read-only)" -msgstr "NLA đang bị biên tập có hành động nào được tham chiếu hay không (chỉ được đọc thôi)" +msgstr "Có hành động nào được tham chiếu bởi NLA đang biên soạn hay không (chỉ cho phép đọc thôi)" msgid "Absolute Keying Sets" -msgstr "Tập Bức Ảnh Mẫu Tuyệt Đối" +msgstr "Bộ Khóa Tuyệt Đối" msgid "Absolute Keying Sets for this Scene" -msgstr "Tập bức ảnh mẫu tuyệt đối cho Cảnh này" +msgstr "Bộ Khóa Tuyệt Đối cho cảnh này" msgid "All Keying Sets" -msgstr "Hết Tập Bức Ảnh Mẫu" +msgstr "Toàn Bộ các Bộ Khóa" msgid "All Keying Sets available for use (Builtins and Absolute Keying Sets for this Scene)" -msgstr "Tất cả Tập Bức Ảnh Mẫu có thể sử dụng (Tập Nội Bộ và Tuyệt Đối cho Cảnh này)" +msgstr "Toàn bộ các Bộ Khóa có thể sử dụng (Những Bộ Cài Sẵn và những Bộ Khóa Tuyệt Đối dành cho Cảnh này)" msgid "Lock Frame Selection" -msgstr "Khóa Bức Ảnh Được Chọn" +msgstr "Khóa Lựa Chọn Khung Hình" msgid "Don't allow frame to be selected with mouse outside of frame range" -msgstr "Không cho chọn bức ảnh với chuột ở ngoài phạm vi bực ảnh" +msgstr "Không cho dùng chuột chọn khung hình ngoài phạm vi" msgid "Compositing node tree" -msgstr "Cây giao điểm ghép" +msgstr "Cây nút tổng hợp" msgid "Render Data" @@ -26317,231 +28608,260 @@ msgstr "Dữ Liệu Kết Xuất" msgid "Rigid Body World" -msgstr "Thế Giới Thân Rắn" +msgstr "Thế Giới Thân Cứng" msgid "Sequence Editor" -msgstr "Trình Biên Soạn Phối Hình" +msgstr "Trình Phối Hình" msgid "Sequencer Color Space Settings" -msgstr "Cài Đặt Không Gian Màu Của Bộ Trình Tự" +msgstr "Sắp Đặt Không Gian Màu Sắc của Trình Phối Hình" msgid "Settings of color space sequencer is working in" -msgstr "Cài đặt không gian màu thì bộ trình tự đang sử dụng" +msgstr "Sắp đặt không gian màu mà trình phối hình đang sử dụng" msgid "Show Subframe" -msgstr "Hiện Hạ Bức Ảnh" +msgstr "Hiển Thị Phân Khung Hình" msgid "Show current scene subframe and allow set it using interface tools" -msgstr "Hiện hạ bức ảnh hiện tại của cảnh và cho đặt nó bằng dụng cụ giao diện" +msgstr "Hiển thị phân-khung-hình của cảnh hiện tại và cho phép sắp đặt nó bằng các công cụ giao diện" + + +msgid "Simulation Frame End" +msgstr "Khung Hình Kết Thúc Mô Phỏng" + + +msgid "Frame at which simulations end" +msgstr "Khung hình mà tại đó mô phỏng kết thúc" + + +msgid "Simulation Frame Start" +msgstr "Khung Hình Khởi Đầu Mô Phỏng" + + +msgid "Frame at which simulations start" +msgstr "Khung hình mà tại đó mô phỏng khởi đầu" msgid "Sync Mode" -msgstr "Chế Độ Đồng Bộ" +msgstr "Chế Độ Đồng Bộ Hóa" msgid "How to sync playback" -msgstr "Làm sao hát lại đồng bộ" +msgstr "Phương pháp đồng bộ hóa việc chơi lại" msgid "Play Every Frame" -msgstr "Hát Mỗi Bức Ảnh" +msgstr "Chơi Mọi Khung Hình" msgid "Do not sync, play every frame" -msgstr "Không đồng bộ, hát lại mỗi bức ảnh" +msgstr "Không đồng bộ hóa, chơi mọi khung hình" msgid "Frame Dropping" -msgstr "Bất Bức Ảnh" +msgstr "Nhảy Cách Khung Hình" msgid "Drop frames if playback is too slow" -msgstr "Bất bức ảnh nếu tốc độ hát lại qúa thấp" +msgstr "Nhảy cách khung hình nếu tốc độ chơi lại quá thấp" msgid "Sync to Audio" -msgstr "Đồng Bộ với Âm Thanh" +msgstr "Đồng Bộ Hóa với Âm Thanh" msgid "Sync to audio playback, dropping frames" -msgstr "Đồng bộ với nhịp hát âm thanh, bỏ qua bức ảnh" +msgstr "Đồng bộ hóa với âm thanh chơi lại, nhảy cách khung hình" msgid "Timeline Markers" -msgstr "Dấu Hiệu Thời Biểu" +msgstr "Dấu Mốc Trên Lịch Trình Thời Gian" msgid "Markers used in all timelines for the current scene" -msgstr "Dấu hiệu dang dùng trong tất cả thời biểu trong cảnh hiện tại" +msgstr "Dấu đánh dùng trong toàn bộ các lịch trình thời gian cho cảnh hiện tại" msgid "Tool Settings" -msgstr "Cài Đặt Dụng Cụ" +msgstr "Các Cài Đặt của Công Cụ" msgid "Transform Orientation Slots" -msgstr "Khe Định Hướng Biến Hóa" +msgstr "Các Khe Định Hướng Biến Hóa" msgid "Unit Settings" -msgstr "Cài Đặt Đơn Vị" +msgstr "Sắp Đặt Đơn Vị" msgid "Unit editing settings" -msgstr "Cài đặt đơn vị cho biên tập" +msgstr "Sắp đặt đơn vị biên soạn" msgid "Audio Muted" -msgstr "Cắt Tiếng Âm Thanh" +msgstr "Âm Thanh Bị Chặn" msgid "Play back of audio from Sequence Editor will be muted" -msgstr "Cắt tiếng âm thanh từ Bộ Trình Tự" +msgstr "Không cho phát âm thanh từ Trình Phối Hình" msgid "Audio Scrubbing" -msgstr "Hát Âm Khi Di Chuyển" +msgstr "Rà Quét Âm Thanh" msgid "Play audio from Sequence Editor while scrubbing" -msgstr "Hát âm thanh khi di chuyển trong Trình Biên Soạn Phối Hình" +msgstr "Chơi âm thanh trong khi rà quét (tua) trong trình phối hình" + + +msgid "Custom Simulation Range" +msgstr "Phạm Vi Mô Phỏng Tùy Chỉnh" + + +msgid "Use a simulation range that is different from the scene range for simulation nodes that don't override the frame range themselves" +msgstr "Sử dụng phạm vi mô phỏng, khác với phạm vi cảnh, cho các nút mô phỏng không tự bản thân vượt quyền phạm vi khung hình" msgid "Global Gravity" -msgstr "Hấp Dẫn Toàn Cầu" +msgstr "Lực Hấp Dẫn Toàn Cầu" msgid "Use global gravity for all dynamics" -msgstr "Sử dụng hấp dẫn toàn cầu cho tất cả động lý" +msgstr "Dùng lực hấp dẫn toàn cầu cho toàn bộ các động lực học" msgid "Enable the compositing node tree" -msgstr "Bật cây giao điểm ghép" +msgstr "Cho phép sử dụng cây nút tổng hợp" msgid "Use Preview Range" -msgstr "Sử dụng Phạm Vi Dự Khán" +msgstr "Sử Dụng Phạm Vi Xem Trước" msgid "Use an alternative start/end frame range for animation playback and view renders" -msgstr "Dùng một phạm vi bắt đầu/kết thúc thay phiên để hát lại hoạt hình và kết xuất trong màn" +msgstr "Sử dụng phân khoảng khung hình đầu/cuối khác để chơi lại hoạt họa và xem các kết xuất" msgid "Stamp Note" -msgstr "Tin Nhắn Đóng Dấu" +msgstr "Lời Văn để Rập In" msgid "User defined note for the render stamping" -msgstr "Tin nhắn người dùng được chỉ định cho đóng dấu ảnh kết xuất" +msgstr "Lời viết của người dùng, sử dụng để in trên hình ảnh kết xuất" msgid "View Layers" -msgstr "Hiển Thị Lớp" +msgstr "Các Tầng Góc Nhìn" msgid "View Settings" -msgstr "Cài Đặt Màn Chiếu" +msgstr "Sắp Đặt Khung Nhìn" msgid "Color management settings applied on image before saving" -msgstr "Cài đặt quản lý màu thì áp dụng trước lưu ảnh" +msgstr "Sắp đặt quản lý màu sắc áp dụng vào hình ảnh trước khi cho lưu" msgid "Use Controller Actions" -msgstr "Dùng Hành Động Đồ Điều Khiển" +msgstr "Sử Dụng các Hành Động của Bộ Điều khiển" msgid "Enable default VR controller actions, including controller poses and haptics" -msgstr "Bật hành động đồ điều khiển VR mặc định, gồm dạng đứng va tương tác chạm của đồ điều khiển" +msgstr "Bật các hành động điều khiển VR mặc định, bao gồm các tư thế và các tương tác xúc giác của bộ điều khiển" msgid "Enable bindings for the Huawei controllers. Note that this may not be supported by all OpenXR runtimes" -msgstr "Bật gắn lại đồ điều khiển Huawei. Lưu ý rằng có lẽ cái này không được hỗ trợ bởi hết bộ thời chạy OpenXR" +msgstr "Cho phép kết buộc trong các bộ điều khiển Huawei. Lưu ý rằng điều này có thể không được toàn bộ các phần OpenXR thời gian chạy hỗ trợ đâu nhé" msgid "Enable bindings for the HP Reverb G2 controllers. Note that this may not be supported by all OpenXR runtimes" -msgstr "Bật gắn lại đồ điều khiển HP Reverb G2. Lưu ý rằng có lẽ cái này không được hỗ trợ bởi hết bộ thời chạy OpenXR" +msgstr "Cho phép kết buộc trong các bộ điều khiển HP Reverb G2. Lưu ý rằng điều này có thể không được toàn bộ các phần OpenXR thời gian chạy hỗ trợ đâu nhé" msgid "Enable bindings for the HTC Vive Cosmos controllers. Note that this may not be supported by all OpenXR runtimes" -msgstr "Bật gắn lại đồ điều khiển HTC Vive Cosmos. Lưu ý rằng có lẽ cái này không được hỗ trợ bởi hết bộ thời chạy OpenXR" +msgstr "Cho phép kết buộc trong các bộ điều khiển HTC Vive Cosmos. Lưu ý rằng điều này có thể không được toàn bộ các phần OpenXR thời gian chạy hỗ trợ đâu đấy nhé" msgid "Enable bindings for the HTC Vive Focus 3 controllers. Note that this may not be supported by all OpenXR runtimes" -msgstr "Bật gắn lại đồ điều khiển HTC Vive Focus 3. Lưu ý rằng có lẽ cái này không được hỗ trợ bởi hết bộ thời chạy OpenXR" +msgstr "Cho phép kết buộc trong các bộ điều khiển HTC Vive Focus 3. Lưu ý rằng điều này có thể không được toàn bộ các phần OpenXR thời gian chạy hỗ trợ đâu đấy nhé" msgid "Use input from gamepad (Microsoft Xbox Controller) instead of motion controllers" -msgstr "Dùng ngõ vào từ đồ bấm trò chơi (Đồ Điều Khiển Xbox Microsoft) thay thế đồ kiểm soát chuyển động" +msgstr "Sử dụng đầu vào cung cấp từ gamepad (Bộ điều khiển Microsoft Xbox) thay vì các bộ điều khiển chuyển động" msgid "Landmark" -msgstr "Mốc Bờ" +msgstr "Địa Ranh" msgid "Selected Landmark" -msgstr "Mốc Bờ Được Chọn" +msgstr "Địa Ranh được Chọn" + + +msgctxt "World" +msgid "World" +msgstr "Thế Giới" msgid "World used for rendering the scene" -msgstr "Thế giới để kết xuất cảnh" +msgstr "Thế giới dùng để kết xuất cảnh" msgid "Screen data-block, defining the layout of areas in a window" -msgstr "Cục dữ liệu màn, chỉ định bố trí của khu vực trong một cửa sổ" +msgstr "Khối dữ liệu màn hình, định nghĩa sự bố trí các vùng miền trong cửa sổ" msgid "Areas" -msgstr "Các Khu Vực" +msgstr "Vùng" msgid "Areas the screen is subdivided into" -msgstr "Các khu vực cho chẻ màn chiếu" +msgstr "Các vùng của màn hình được chia nhỏ ra" msgid "Animation Playing" -msgstr "Hoạt Hình Đang Hát" +msgstr "Đang Chơi Hoạt Họa" msgid "Animation playback is active" -msgstr "Hát lại hoạt hình đang hoạt động" +msgstr "Hoạt họa đang được chơi lại" msgid "User is Scrubbing" -msgstr "Người dùng đang Kéo Qua" +msgstr "Người Dùng đang Rà Quét" msgid "True when the user is scrubbing through time" -msgstr "Đúng khi người dùng đang kéo qua thời gian" +msgstr "Giá trị sẽ là 'Đúng' khi người dùng đang rà quét trên dòng thời gian" msgid "An area is maximized, filling this screen" -msgstr "Một khu vực được đầy màn, giành toàn bộ màn này" +msgstr "Tối đa hóa một khu vực, tô kín màn hình" msgid "Show Status Bar" -msgstr "Hiện Thanh Trạng Thái" +msgstr "Hiển Thị Thanh Trạng Thái" msgid "Show status bar" -msgstr "Hiện thanh trạng thái" +msgstr "Hiển thị thanh trạng thái" msgid "Follow current frame in editors" -msgstr "Đi theo bức ảnh hiện tại trong các trình biên soạn" +msgstr "Các trình biên soạn đều bám theo khung hình hiện tại" msgid "All 3D Viewports" -msgstr "Hết Màn Chiếu 3D" +msgstr "Toàn Bộ các Cổng Nhìn 3D" msgid "Animation Editors" -msgstr "Trình Biên Soạn Hoạt Hình" +msgstr "Trình Biên Soạn Hoạt Họa" msgid "Clip Editors" @@ -26549,107 +28869,115 @@ msgstr "Trình Biên Soạn Đoạn Phim" msgid "Image Editors" -msgstr "Trình Biên Soạn Ảnh" +msgstr "Trình Biên Soạn Hình Ảnh" msgid "Node Editors" -msgstr "Trình Biên Soạn Giao Điểm" +msgstr "Trình Biên Soạn Nút" msgid "Property Editors" -msgstr "Trình Biên Soạn Đặc Tính" +msgstr "Trình Biên Soạn Tính Chất" msgid "Sequencer Editors" -msgstr "Trình Biên Soạn Trình Tự" +msgstr "Trình Phối Hình" + + +msgid "Spreadsheet Editors" +msgstr "Trình Biên Soạn Bảng Tính" msgid "Top-Left 3D Editor" -msgstr "Trình Biên Soạn Thảo 3D Trên-Trái" +msgstr "Trình Biên Soạn 3D Phía Trên-Bên Trái" msgid "Sound data-block referencing an external or packed sound file" -msgstr "Cục dữ liệu âm thanh tham chiếu một tập tin âm thanh ngoài hay được gói lại" +msgstr "Khối dữ liệu âm thanh tham chiếu một tập tin âm thanh ở bên ngoài hoặc đã được đóng gói" msgid "Audio channels" -msgstr "Kênh Âm Thanh" +msgstr "Các kênh âm thanh" msgid "Definition of audio channels" -msgstr "Cài Đặt cho các kênh âm thanh" +msgstr "Định nghĩa các kênh âm thanh" msgid "Stereo LFE" -msgstr "Nhị Kênh LFE" +msgstr "Lập Thể LFE" msgid "Stereo FX" -msgstr "Nhị Kênh FX" +msgstr "Lập Thể FX" msgid "5 Channels" -msgstr "5 kênh" +msgstr "5 Kênh" msgid "6.1 Surround" -msgstr "6.1 Xung Quanh" +msgstr "Vòm 6.1" msgid "Sound sample file used by this Sound data-block" -msgstr "Mẫu vật âm thanh của Cục Dữ Liệu Ăm Thanh này đang dùng" +msgstr "Tập tin mẫu âm thanh mà khối dữ liệu Âm Thanh này sử dụng" + + +msgid "Sample rate of the audio in Hz" +msgstr "Tốc độ lấy mẫu âm thanh tính bằng Hz" msgid "Caching" -msgstr "Đệm Chứa" +msgstr "Giữ trong Bộ Nhớ Đệm" msgid "The sound file is decoded and loaded into RAM" -msgstr "Giải mã và nhập tập tin âm thanh trong bộ nhớ" +msgstr "Tập tin âm thanh được giải mã và lưu giữ trong Bộ Nhớ" msgid "If the file contains multiple audio channels they are rendered to a single one" -msgstr "Nếu tập tin này có nhiều kênh âm thanh, họ được kết xuất vào một kênh" +msgstr "Nếu tập tin này có nhiều kênh âm thanh, chúng sẽ bị kết xuất thành một kênh" msgid "Speaker data-block for 3D audio speaker objects" -msgstr "Cục dữ liệu loa cho vật thể loa 3D" +msgstr "Khối dữ liệu loa cho đối tượng loa 3D" msgid "Attenuation" -msgstr "Độ Giảm" +msgstr "Độ Suy Yếu" msgid "How strong the distance affects volume, depending on distance model" -msgstr "Sự ảnh hưởng của cách xa với âm lượng, tùy mô hình khoảng cách" +msgstr "Sự ảnh hưởng của khoảng cách đến âm lượng là bao nhiêu, tùy thuộc vào mô hình khoảng cách" msgid "Inner Cone Angle" -msgstr "Góc Hình Nón Nội" +msgstr "Góc của Hình Nón Nội" msgid "Angle of the inner cone, in degrees, inside the cone the volume is 100%" -msgstr "Góc của hình nón nội (đơn vị độ), ở trong hình nón này âm lượng là 100%" +msgstr "Góc độ của hình nón nội, bên trong hình nón, âm lượng là 100%" msgid "Outer Cone Angle" -msgstr "Góc Hình Nón Ngoại" +msgstr "Góc của Hình Nón Ngoại" msgid "Angle of the outer cone, in degrees, outside this cone the volume is the outer cone volume, between inner and outer cone the volume is interpolated" -msgstr "Góc của hình nón ngoại (độ), ở ngoài hình nón này âm lượng là âm lượng của hình nón ngoại, còn giữa hình nón nội và ngoại sẽ suy nột âm lượng" +msgstr "Góc độ hình nón ngoại, bên ngoài hình nón này, âm lượng là âm lượng của hình nón ngoại. Giữa hình nón nội và ngoại âm lượng sẽ được nội suy" msgid "Outer Cone Volume" -msgstr "Âm Lượng Hình Nón Ngoại" +msgstr "Âm Lượng của Hình Nón Ngoại" msgid "Volume outside the outer cone" -msgstr "Âm lượng ở ngoài hình nón ngoại" +msgstr "Âm lượng bên ngoài hình nón ngoại" msgid "Maximum distance for volume calculation, no matter how far away the object is" -msgstr "Khoảng cách cực đại để tính âm lượng, không quan tâm cách xa của vật thể" +msgstr "Khoảng cách tối đa để tính âm lượng, không kể khoảng cách của đối tượng" msgid "Reference Distance" @@ -26657,29 +28985,29 @@ msgstr "Khoảng Cách Tham Chiếu" msgid "Reference distance at which volume is 100%" -msgstr "Khoảng cách tham chiếu thì âm lượng là 100%" +msgstr "Khoảng cách tham chiếu, mà tại đó, âm lượng là 100%" msgctxt "Sound" msgid "Mute" -msgstr "Cắt Tiếng" +msgstr "Chặn Âm Thanh" msgid "Mute the speaker" -msgstr "Cắt tiếng Loa" +msgstr "Chặn âm thanh loa" msgctxt "Sound" msgid "Pitch" -msgstr "Tần Số" +msgstr "Cao Độ" msgid "Playback pitch of the sound" -msgstr "Tần số khi hát lại âm thanh" +msgstr "Tần số cao độ khi chơi âm thanh" msgid "Sound data-block used by this speaker" -msgstr "Cục dữ liệu ăm thanh của loa này" +msgstr "Khối dữ liệu âm thanh của loa này" msgid "How loud the sound is" @@ -26687,23 +29015,23 @@ msgstr "Âm lượng âm thanh" msgid "Maximum Volume" -msgstr "Âm Lượng Cực Đại" +msgstr "Âm Lượng Tối Đa" msgid "Maximum volume, no matter how near the object is" -msgstr "Âm lượng cực đại, không quan tâm cách gần của vật thể" +msgstr "Âm lượng tối đa, bất kể đối tượng gần bao nhiêu" msgid "Minimum Volume" -msgstr "Âm Lượng Cực Tiểu" +msgstr "Âm Lượng Tối Thiểu" msgid "Minimum volume, no matter how far away the object is" -msgstr "Âm lượng cực tiểu, không quan tâm cách xa của vật thể" +msgstr "Âm lượng tối thiểu, bất kể đối tượng cách xa bao nhiêu" msgid "Text data-block referencing an external or packed text file" -msgstr "Cục dữ liệu văn bản tham chiếu một tập tin ngoài hay văn bản được gói lại" +msgstr "Khối dữ liệu văn bản của tập tin bên ngoài hay tập tin văn bản đã đóng gói" msgid "Current Character" @@ -26711,7 +29039,7 @@ msgstr "Ký Tự Hiện Tại" msgid "Index of current character in current line, and also start index of character in selection if one exists" -msgstr "Chỉ số của ký tự hiện tại trong dòng hiện tại, và chỉ số của ký tự đầu của đoạn được chọn, nếu có" +msgstr "Chỉ số của ký tự hiện tại trong dòng hiện thời, cũng là chỉ số khởi đầu của ký tự trong đoạn được chọn, nếu có" msgid "Current Line" @@ -26719,7 +29047,7 @@ msgstr "Dòng Hiện Tại" msgid "Current line, and start line of selection if one exists" -msgstr "Dòng hiện tại và số dòng bắt đầu của sự lựa chọn, nếu có" +msgstr "Dòng hiện tại, và là khởi đầu của hàng trong đoạn được chọn, nếu có" msgid "Current Line Index" @@ -26727,27 +29055,42 @@ msgstr "Chỉ Số Dòng Hiện Tại" msgid "Index of current TextLine in TextLine collection" -msgstr "Chỉ số của DòngVănBản hiện tại trong sưu tập HàngVănBản" +msgstr "Chỉ số của dòng văn bản hiện tại trong bộ sưu tập các dòng văn bản" msgid "Filename of the text file" -msgstr "Tên của tập tin văn bản" +msgstr "Tên tập tin văn bản" + + +msgctxt "Text" +msgid "Indentation" +msgstr "Thụt Dòng" msgid "Use tabs or spaces for indentation" -msgstr "Dùng tab hay dấu cách cho sự lõm" +msgstr "Dùng các ký tự Tab hoặc các dấu cách trống để thụt dòng" + + +msgctxt "Text" +msgid "Tabs" +msgstr "Tab" msgid "Indent using tabs" -msgstr "Lõm bằng tab" +msgstr "Thụt dòng dùng ký tự Tab" + + +msgctxt "Text" +msgid "Spaces" +msgstr "Dấu Cách" msgid "Indent using spaces" -msgstr "Lõm bằng dấu cách" +msgstr "Thụt dòng dùng dấu cách trống" msgid "Text file has been edited since last save" -msgstr "Đã biên tập tập tin văn bản sau lưu lần cuối" +msgstr "Văn bản đã bị sửa đổi sau lần lưu cuối cùng" msgid "Memory" @@ -26755,39 +29098,49 @@ msgstr "Bộ Nhớ" msgid "Text file is in memory, without a corresponding file on disk" -msgstr "Tập tin văn bản trong bộ nhớ, mà không có một tập tin trong đĩa" +msgstr "Tập tin văn bản nằm trong bộ nhớ, song không có tập tin tương ứng trên đĩa" + + +msgctxt "Text" +msgid "Modified" +msgstr "Đã bị Sửa Đổi" msgid "Text file on disk is different than the one in memory" -msgstr "Tập tin văn bản trên đĩa không giống tập tin trong bộ nhớ" +msgstr "Tập tin văn bản trên đĩa không còn giống với cái trong bộ nhớ" + + +msgctxt "Text" +msgid "Lines" +msgstr "Số/Các Dòng" msgid "Lines of text" -msgstr "Dòng Văn Bản" +msgstr "Các dòng văn bản" msgid "Selection End Character" -msgstr "Ký Tự Kết Thúc Sự Lựa Chọn" +msgstr "Ký Tự Cuối Cùng của Vùng Lựa Chọn" msgid "Index of character after end of selection in the selection end line" -msgstr "Chỉ số của ký tự sau sự lựa chọn trong dòng cuối của sự lựa chọn" +msgstr "Chỉ số của ký tự nằm ngay sau đoạn được chọn trong dòng cuối của vùng chọn" msgid "Selection End Line" -msgstr "Dòng Cuối Sự Lựa Chọn" +msgstr "Dòng Cuối của Lựa Chọn" msgid "End line of selection" -msgstr "Dòng cuối của sự lựa chọn" +msgstr "Dòng cuối của (vùng) lựa chọn" msgid "Select End Line Index" -msgstr "Chọn Chỉ Số Dòng Cuối" +msgstr "Chỉ Số của Dòng Cuối Lựa Chọn" msgid "Index of last TextLine in selection" -msgstr "Chỉ số của DòngVănBản cuối trong sự lựa chọn" +msgstr "Chỉ số của Dòng Văn Bản cuối cùng trong (vùng) lựa chọn" msgid "Register" @@ -26795,35 +29148,35 @@ msgstr "Đăng Ký" msgid "Run this text as a Python script on loading" -msgstr "Chạy văn bản này như một văn thảo Python khi nhập" +msgstr "Thi hành văn bản này, như một tập lệnh Python, trong khi nạp" msgid "Texture data-block used by materials, lights, worlds and brushes" -msgstr "Cục dữ liệu chất liệu thì vật liệu, bóng đèn, thế giới, và bút lông được dùng" +msgstr "Khối dữ liệu sử dụng bởi các nguyên vật liệu, các nguồn sáng, và các không gian thế giới, cùng các đầu bút" msgid "Factor Blue" -msgstr "Hệ Số Xanh" +msgstr "Hệ Số Màu Lam" msgid "Factor Green" -msgstr "Hệ Số Lục" +msgstr "Hệ Số Màu Lục" msgid "Factor Red" -msgstr "Hệ Số Đỏ" +msgstr "Hệ Số Màu Đỏ" msgid "Node tree for node-based textures" -msgstr "Cây giao điểm cho chất liệu giao điểm" +msgstr "Cây nút cho chất liệu cơ sở nút" msgid "Blend" -msgstr "Pha Trộn" +msgstr "Pha Trộn/Chuyển Đổi" msgid "Procedural - create a ramp texture" -msgstr "Kiểu Thủc tục - chế tạo một chất liệu dốc" +msgstr "Thủ tục - kiến tạo chất liệu dốc" msgid "Clouds" @@ -26831,23 +29184,23 @@ msgstr "Mây" msgid "Procedural - create a cloud-like fractal noise texture" -msgstr "Kiểu Thủ Tục - chế tạo một chất liệu huyên náo phân dạng kiểu mây" +msgstr "Thủ tục - kiến tạo chất liệu nhiễu phân dạng giống mây" msgid "Distorted Noise" -msgstr "Huyên Náo Được Méo Hóa" +msgstr "Nhiễu Loạn Biến Dạng" msgid "Procedural - noise texture distorted by two noise algorithms" -msgstr "Kiểu Thủc Tục - chất liệu huyên náo được méo hóa bằng hai giải thuật huyên náo" +msgstr "Thủ tục - chất liệu nhiễu bị biến dạng bằng hai toán thuật biến nhiễu" msgid "Image or Movie" -msgstr "Ảnh Hay Phim" +msgstr "Hình Ảnh hay Đoạn Phim" msgid "Allow for images or movies to be used as textures" -msgstr "Cho ảnh hay phim được làm chất liệu" +msgstr "Cho phép các hình ảnh hay các đoạn phim được sử dụng để làm chất liệu" msgid "Magic" @@ -26855,7 +29208,7 @@ msgstr "Ảo Thuật" msgid "Procedural - color texture based on trigonometric functions" -msgstr "Kiểu Thủ tục - chất liệu màu cơ sở hàm số lượng giác học" +msgstr "Thủ tục - chất liệu màu trên cơ sở các hàm số lượng giác" msgid "Marble" @@ -26863,7 +29216,7 @@ msgstr "Đá Hoa" msgid "Procedural - marble-like noise texture with wave generated bands" -msgstr "Kiểu Thủ Tục - chất liệu huyên náo kiểu đá hoa với quằn được chế tạo bởi sóng" +msgstr "Thủ tục - chất liệu nhiễu giống đá hoa với các đường vằn do sóng tạo ra" msgid "Musgrave" @@ -26871,11 +29224,11 @@ msgstr "Musgrave" msgid "Procedural - highly flexible fractal noise texture" -msgstr "Kiểu Thủ tục - chất liệu huyên náo phân dạng rất dẻo" +msgstr "Thủ tục - chất liệu nhiễu phân dạng rất linh động" msgid "Procedural - random noise, gives a different result every time, for every frame, for every pixel" -msgstr "Kiểu Thủ tục - huyên náo ngẫu nhiên, kết qủa khác mỗi lần, cho mỗi bức ảnh, mỗi điểm ảnh" +msgstr "Thủ tục - nhiễu ngẫu nhiên, luôn luôn cho kết quả khác nhau, cho mỗi khung hình, mỗi điểm ảnh" msgid "Stucci" @@ -26883,7 +29236,7 @@ msgstr "Stucci" msgid "Procedural - create a fractal noise texture" -msgstr "Kiểu Thủ tục - chế tạo một chất liệu huyên náo phân dạng" +msgstr "Thủ tục - kiến tạo chất liệu nhiễu phân dạng" msgid "Voronoi" @@ -26891,7 +29244,7 @@ msgstr "Voronoi" msgid "Procedural - create cell-like patterns based on Worley noise" -msgstr "Kiểu Thủ tục - chế tạo trang hoàng kiểu tế bào cơ sở huyên náo Worley" +msgstr "Thủ tục - kiến tạo hoa văn giống hình tế bào dùng nhiễu Worley" msgid "Wood" @@ -26899,39 +29252,39 @@ msgstr "Gỗ" msgid "Procedural - wave generated bands or rings, with optional noise" -msgstr "Kiểu Thủ tục - quằn hay vành được chê tạo bởi sóng, với huyên náo tùy chọn" +msgstr "Thủ tục - dải hoặc vành nhẫn do sóng tạo ra, với nhiễu nếu cần" msgid "Set negative texture RGB and intensity values to zero, for some uses like displacement this option can be disabled to get the full range" -msgstr "Đặt giá rị RGB và cường độ âm bằng 0, cho vài sử dụng như dịch, có thể tắt tùy chọn này cho được toàn phạm vi" +msgstr "Đặt các giá trị RGB chất liệu và cường độ màu âm về 0. Đối với một số trường hợp, như phép dời hình, lựa chọn này có thể được tắt đi để đạt được giới hạn tối đa" msgid "Map the texture intensity to the color ramp. Note that the alpha value is used for image textures, enable \"Calculate Alpha\" for images without an alpha channel" -msgstr "Ánh xạ cường độ chất liệu đến dốc màu sắc. Chu ý giá trị độ đục được sử dụng cho chất liệu ảnh, bật \"Tính Độ Đục\" cho ảnh không có kênh độ đục" +msgstr "Ánh xạ cường độ chất liệu vào dốc màu. Lưu ý: giá trị alpha được sử dụng cho các hình ảnh chất liệu. Đối với các hình ảnh không có kênh alpha thì bật \"Tính Toán Alpha\" lên" msgid "Make this a node-based texture" -msgstr "Làm này thành một chất liệu giao điểm" +msgstr "Biến cái này thành một chất liệu cơ sở nút" msgid "Show Alpha" -msgstr "Hiện Độ Đục" +msgstr "Hiển Thị Alpha" msgid "Show Alpha in Preview Render" -msgstr "Hiện độ đục trong Kết Xuất Đự Khán" +msgstr "Hiển Thị Alpha trong Kết Xuất Xem Trước" msgid "Blend Texture" -msgstr "Chất Liệu Pha Trộn" +msgstr "Pha Trộn Chất Liệu" msgid "Procedural color blending texture" -msgstr "Chất liệu pha trộn màu thủ tục" +msgstr "Chất liệu pha trộn màu bằng thủ tục" msgid "Progression" -msgstr "Tiến Triển" +msgstr "Tiến Trình" msgid "Style of the color blending" @@ -26939,31 +29292,31 @@ msgstr "Phong cách pha trộn màu" msgid "Create a linear progression" -msgstr "Chế tạo một tiến triển bậc một" +msgstr "Kiến Tạo tiến trình tuyến tính" msgid "Quadratic" -msgstr "Bậc Hai" +msgstr "Bình Phương" msgid "Create a quadratic progression" -msgstr "Chế tạo một tiến triển bậc hai" +msgstr "Kiến Tạo tiến trình bình phương" msgid "Easing" -msgstr "Xoa Dịu" +msgstr "Chậm Rãi" msgid "Create a progression easing from one step to the next" -msgstr "Chế tạo một tiến triển xoa dịu từ một bước đến bước tiếp" +msgstr "Kiến Tạo một tiến trình chậm rãi từ bước nọ sang bước kia" msgid "Diagonal" -msgstr "Đường Chéo" +msgstr "Chéo Góc" msgid "Create a diagonal progression" -msgstr "Chế tạo một tiến triển đường chéo" +msgstr "Kiến Tạo tiến trình chéo góc" msgid "Spherical" @@ -26971,19 +29324,19 @@ msgstr "Hình Cầu" msgid "Create a spherical progression" -msgstr "Chế tạo một tiến triển hình cầu" +msgstr "Kiến Tạo tiến trình hình cầu" msgid "Quadratic Sphere" -msgstr "Hình Cầu Bật Hai" +msgstr "Hình Cầu Bậc Hai" msgid "Create a quadratic progression in the shape of a sphere" -msgstr "Chế tạo một tiến triển bậc hai có hình dạng hình cầu" +msgstr "Kiến Tạo tiến trình bình phương trong hình dạng một hình cầu" msgid "Create a radial progression" -msgstr "Chế tạo một tiến triển tỏa tròn" +msgstr "Kiến Tạo tiến trình tỏa tròn" msgid "Flip Axis" @@ -26995,7 +29348,7 @@ msgstr "Lật trục X và Y của chất liệu" msgid "No flipping" -msgstr "Không Lật" +msgstr "Không lật" msgid "Clouds Texture" @@ -27003,51 +29356,51 @@ msgstr "Chất Liệu Mây" msgid "Procedural noise texture" -msgstr "Thủ tục huyên náo chất liệu" +msgstr "Chất liệu nhiễu hóa bằng thủ tục" msgid "Determine whether Noise returns grayscale or RGB values" -msgstr "Xác định nếu Huyên Náo ̣ược trả lại giá trị độ xám hay RGB" +msgstr "Xác định xem nếu Nhiễu cho kết quả các giá trị là gam màu xám hay RGB" msgid "Grayscale" -msgstr "Độ Xám" +msgstr "Gam Xám" msgid "Size of derivative offset used for calculating normal" -msgstr "Kích cỡ của dịch đạo hàm được dùng để tính pháp tuyến" +msgstr "Cỡ của dịch chuyển dẫn xuất, dùng để tính pháp tuyến" msgid "Noise Basis" -msgstr "Cơ Sở Huyên Náo" +msgstr "Cơ Sở Nhiễu" msgid "Noise basis used for turbulence" -msgstr "Cơ sở huyên náo cho ngỗ nghịch" +msgstr "Cơ sở nhiễu để dùng cho sự hỗn loạn" msgid "Blender Original" -msgstr "Chính Gốc Blender" +msgstr "Blender Gốc" msgid "Noise algorithm - Blender original: Smooth interpolated noise" -msgstr "Giải thuật huyên náo - Chính gốc Blender: Huyên náo suy nội mịn" +msgstr "Thuật toán tạo nhiễu - Blender gốc: Làm Mịn nhiễu nội suy" msgid "Original Perlin" -msgstr "Perlin Chính Gốc" +msgstr "Perlin Gốc" msgid "Noise algorithm - Original Perlin: Smooth interpolated noise" -msgstr "Giải thuật huyên náo - Chính gốc Perlin: Huyên náo suy nội mịn" +msgstr "Thuật toán tạo nhiễu - Perlin gốc: Làm Mịn nhiễu nội suy" msgid "Improved Perlin" -msgstr "Perlin Phát Triển" +msgstr "Perlin Cải Tiến" msgid "Noise algorithm - Improved Perlin: Smooth interpolated noise" -msgstr "Giải thuật huyên náo - Perlin Phát Triển: Huyên náo suy nội mịn" +msgstr "Thuật toán tạo nhiễu - Perlin cải tiến: Làm Mịn nhiễu nội suy" msgid "Voronoi F1" @@ -27055,7 +29408,7 @@ msgstr "Voronoi F1" msgid "Noise algorithm - Voronoi F1: Returns distance to the closest feature point" -msgstr "Giải thuật huyên Náo - Voronoi F1: Nó trả khoảng cách đến điểm đặc trưng gần nhất" +msgstr "Thuật toán tạo nhiễu - Voronoi F1: Cho khoảng cách gần nhất tới điểm hình dạng" msgid "Voronoi F2" @@ -27063,7 +29416,7 @@ msgstr "Voronoi F2" msgid "Noise algorithm - Voronoi F2: Returns distance to the 2nd closest feature point" -msgstr "Giải thuật huyên Náo - Voronoi F2: Nó trả khoảng cách đến điểm đặc trưng gần thứ 2" +msgstr "Thuật toán tạo nhiễu - Voronoi F2: Cho khoảng cách tới điểm hình dạng gần nhất thứ 2" msgid "Voronoi F3" @@ -27071,7 +29424,7 @@ msgstr "Voronoi F3" msgid "Noise algorithm - Voronoi F3: Returns distance to the 3rd closest feature point" -msgstr "Giải thuật huyên náo - Voronoi F3: Trả lại khoảng cách đến đặc trưng gần nhật thứ 3" +msgstr "Thuật toán tạo nhiễu - Voronoi F3: Cho khoảng cách tới điểm hình dạng gần nhất thứ 3" msgid "Voronoi F4" @@ -27079,7 +29432,7 @@ msgstr "Voronoi F4" msgid "Noise algorithm - Voronoi F4: Returns distance to the 4th closest feature point" -msgstr "Giải thuật huyên náo - Voronoi F4: Trả lại khoảng cách đến đặc trưng gần nhật thứ 4" +msgstr "Thuật toán tạo nhiễu - Voronoi F4: Cho khoảng cách tới điểm hình dạng gần nhất thứ 4" msgid "Voronoi F2-F1" @@ -27087,43 +29440,43 @@ msgstr "Voronoi F2-F1" msgid "Noise algorithm - Voronoi F1-F2" -msgstr "Giải thuật huyên náo - Voronoi F1-F2" +msgstr "Thuật toán tạo nhiễu - Voronoi F1-F2" msgid "Voronoi Crackle" -msgstr "Voronoi Nớt" +msgstr "Voronoi Rạn Nứt" msgid "Noise algorithm - Voronoi Crackle: Voronoi tessellation with sharp edges" -msgstr "Giải thuật huyên náo - Voronoi Nớt: phân hóa Voronoi có cạnh bén" +msgstr "Thuật toán tạo nhiễu - Voronoi Rạn Nứt: Voronoi phân hóa có các cạnh sắc nhọn" msgid "Cell Noise" -msgstr "Huyên Náo Tế Bào" +msgstr "Nhiễu Hình Tế Bào" msgid "Noise algorithm - Cell Noise: Square cell tessellation" -msgstr "Giải thuật huyên náo - Huyên Náo Tế Bào: Tế bào vuông phân hóa" +msgstr "Thuật toán tạo nhiễu - Nhiễu Hình Tế Bào: Sự phân hóa tế bào hình vuông" msgid "Noise Depth" -msgstr "Độ Sâu Huyên Náo" +msgstr "Độ Sâu của Nhiễu" msgid "Depth of the cloud calculation" -msgstr "Độ sau của sự tính toán mây" +msgstr "Độ sâu của tính toán hình mây" msgid "Noise Size" -msgstr "Kích Cỡ Huyên Náo" +msgstr "Kích Thước Nhiễu" msgid "Scaling for noise input" -msgstr "Phóng to huyên nào ngõ vào" +msgstr "Tỷ lệ của nhiễu đầu vào" msgid "Noise Type" -msgstr "Loại Huyên Náo" +msgstr "Loại Nhiễu" msgid "Soft" @@ -27131,7 +29484,7 @@ msgstr "Mềm" msgid "Generate soft noise (smooth transitions)" -msgstr "Chế tạo huyên náo mềm (chuyển tiếp mịn)" +msgstr "Tạo nhiễu mềm mại (chuyển đổi mịn màng)" msgid "Hard" @@ -27139,127 +29492,157 @@ msgstr "Cứng" msgid "Generate hard noise (sharp transitions)" -msgstr "Chế tạo huyên náo bén (chuyển tiếp bén)" +msgstr "Tạo nhiễu dịch chuyển lớn (chuyển đổi đột ngột)" msgid "Procedural distorted noise texture" -msgstr "Chất liệu thủ tục huyên náo méo" +msgstr "Chất liệu nhiễu biến dạng bằng thủ tục" msgid "Distortion Amount" -msgstr "Mức Méo Hóa" +msgstr "Lượng Biến Dạng" msgid "Amount of distortion" -msgstr "Mức méo hóa" +msgstr "Lượng biến dạng" msgid "Noise Distortion" -msgstr "Méo Hóa Huyên Náo" +msgstr "Biến Dạng Nhiễu" msgid "Noise basis for the distortion" -msgstr "Cơ sở cho méo hóa huyên náo" +msgstr "Cơ sở nhiễu để biến dạng" msgid "Image Texture" -msgstr "Chất Liệu Ảnh" +msgstr "Chất Liệu bằng Hình Ảnh" msgid "Checker Distance" -msgstr "Khoảng Cách Ca Rô" +msgstr "Khoảng Cách Ô Cờ" msgid "Distance between checker tiles" -msgstr "Khoảng cách giữa ô ca rô" +msgstr "Khoảng cách giữa ô cờ" msgid "Crop Maximum X" -msgstr "Cắt X Cực Đại" +msgstr "Cắt X Tối Đa" msgid "Maximum X value to crop the image" -msgstr "Giá trị cực đại X cho cắt ảnh" +msgstr "Giá trị tối đa X để cắt hình ảnh" msgid "Crop Maximum Y" -msgstr "Cắt Y Cực Đại" +msgstr "Cắt Y Tối Đa" msgid "Maximum Y value to crop the image" -msgstr "Giá trị cực đại Y cho cắt ảnh" +msgstr "Giá trị tối đa Y để cắt hình ảnh" msgid "Crop Minimum X" -msgstr "Cắt X Cực tiểu" +msgstr "Cắt X Tối Thiểu" msgid "Minimum X value to crop the image" -msgstr "Giá trị cực tiểu X cho cắt ảnh" +msgstr "Giá trị tối thiểu X để cắt hình ảnh" msgid "Crop Minimum Y" -msgstr "Cắt Y Cực tiểu" +msgstr "Cắt Y Tối Thiểu" msgid "Minimum Y value to crop the image" -msgstr "Giá trị cực tiểu Y cho cắt ảnh" +msgstr "Giá trị tối thiểu Y để cắt hình ảnh" + + +msgctxt "Image" +msgid "Extension" +msgstr "Mở/Nới Rộng" msgid "How the image is extrapolated past its original bounds" -msgstr "Phương pháp ngoại suy ngoài ranh giới ảnh" +msgstr "Phương pháp ngoại suy hình ảnh ngoài ranh giới của nó" + + +msgctxt "Image" +msgid "Extend" +msgstr "Mở Rộng" msgid "Extend by repeating edge pixels of the image" -msgstr "Ngoại suy bằng chép điểm ảnh cạnh" +msgstr "Ngoại suy bằng cách nhắc lại các điểm ảnh ở cạnh của hình ảnh" + + +msgctxt "Image" +msgid "Clip" +msgstr "Cắt Xén" msgid "Clip to image size and set exterior pixels as transparent" -msgstr "Cắt tùy theo khổ ảnh và đặt các điểm ảnh ở nằm ngoài trong suốt" +msgstr "Cắt tới kích thước hình ảnh và đặt các điểm ảnh ngoại biên trở thành trong vắt" + + +msgctxt "Image" +msgid "Clip Cube" +msgstr "Cắt Hình Lập Phương" msgid "Clip to cubic-shaped area around the image and set exterior pixels as transparent" -msgstr "Cắt đến khu vực lập phương bao quanh ảnh và đặt các điểm ảnh nằm ở ngoài trong suốt" +msgstr "Cắt tới diện tích hình lập phương quanh hình ảnh và đặt các điểm ảnh ngoại biên trở thành trong vắt" + + +msgctxt "Image" +msgid "Repeat" +msgstr "Lặp Lại" msgid "Cause the image to repeat horizontally and vertically" -msgstr "Lặp vòng ảnh ở ngoài hướng ngang và dọc" +msgstr "Nhắc lại hình ảnh theo chiều ngang và dọc" + + +msgctxt "Image" +msgid "Checker" +msgstr "Bàn Cờ" msgid "Cause the image to repeat in checker board pattern" -msgstr "Làm ảnh lặp vòng kiểu ca rô" +msgstr "Nhắc lại hình ảnh theo mô hình bàn cờ" msgid "Filter Eccentricity" -msgstr "Ly Tâm Bộ Lọc" +msgstr "Độ Lệch Tâm cho Bộ Lọc" msgid "Maximum eccentricity (higher gives less blur at distant/oblique angles, but is also slower)" -msgstr "Ly tôm cực đại (giá trị càng cao càng ít mờ tại góc xa/bẹt, nhưng chậm hơn)" +msgstr "Độ lệch tâm tối đa (giá trị càng cao càng ít nhòe mờ tại các góc xa/nghiêng, nhưng chậm hơn)" msgid "Filter Probes" -msgstr "Máy Dò Bộ Lọc" +msgstr "Lượng Thăm Dò cho Bộ Lọc" msgid "Maximum number of samples (higher gives less blur at distant/oblique angles, but is also slower)" -msgstr "Sô lượng mẫu vật tối đa (giá trị càng cao càng rõ tại khoảng cách xa/góc tụ nhưng chậm hơn)" +msgstr "Số lượng mẫu tối đa (giá trị càng cao thì càng đỡ bị nhòe tại góc xa/nghiêng, nhưng chậm hơn)" msgid "Filter Size" -msgstr "Kích Cỡ Bộ Lọc" +msgstr "Cỡ Lọc" msgid "Multiply the filter size used by MIP Map and Interpolation" -msgstr "Nhân kích cỡ thì Bản Đồ Đa Bậc Tầng (MIP) và Suy Nội được dùng" +msgstr "Nhân với cỡ lọc, sử dụng trong Ánh Xạ MIP (Multum In Parvo : Nhiều Trong Ít) và Nội Suy" msgid "Filter" -msgstr "Bộ Lọc" +msgstr "Thanh Lọc" msgid "Texture filter to use for sampling image" -msgstr "Bộ lọc chất liệu để dùng làm ảnh mẫu vật" +msgstr "Thanh lọc chất liệu để sử dụng cho quá trình lấy mẫu hình ảnh" msgid "EWA" @@ -27271,103 +29654,103 @@ msgstr "FELINE" msgid "Area" -msgstr "Diện Tích" +msgstr "Khu Vực/Diện Tích" msgid "Invert Alpha" -msgstr "Đảo Ngịch Độ Đục" +msgstr "Đảo Ngịch Alpha" msgid "Invert all the alpha values in the image" -msgstr "Đảo nghịch giá trị độ đục trong ảnh" +msgstr "Đảo nghịch toàn bộ các giá trị alpha trong hình ảnh" msgid "Repeat X" -msgstr "Lặp Vòng X" +msgstr "Nhắc Lại X" msgid "Repetition multiplier in the X direction" -msgstr "Hệ số lặp vòng cho hướng X" +msgstr "Số nhân nhắc lại cho hướng X" msgid "Repeat Y" -msgstr "Lặp vòng Y" +msgstr "Nhắc Lại Y" msgid "Repetition multiplier in the Y direction" -msgstr "Hệ số lặp vòng cho hướng X" +msgstr "Số nhân nhắc lại cho hướng Y" msgid "Use the alpha channel information in the image" -msgstr "Dùng dữ liệu độ đục trong ảnh" +msgstr "Dùng thông tin kênh alpha trong hình ảnh" msgid "Calculate Alpha" -msgstr "Tính Độ Đục" +msgstr "Tính Alpha" msgid "Calculate an alpha channel based on RGB values in the image" -msgstr "Tính một kênh độ đục cơ sở giá trị RGB trong ảnh" +msgstr "Dùng giá trị RGB trong ảnh để tính kênh alpha" msgid "Checker Even" -msgstr "Ca Rô Chẳng" +msgstr "Ô Cờ Chẵn" msgid "Even checker tiles" -msgstr "Ô ca rô chẳng" +msgstr "Ô Cờ chẵn" msgid "Checker Odd" -msgstr "Ca Rô Lẻ" +msgstr "Ô Cờ Lẻ" msgid "Odd checker tiles" -msgstr "Ô ca rô lẻ" +msgstr "Ô cờ lẻ" msgid "Minimum Filter Size" -msgstr "Kích Cỡ Bộ Lọc Cực Tiểu" +msgstr "Cỡ Lọc Tối Thiểu" msgid "Use Filter Size as a minimal filter value in pixels" -msgstr "Dùng Kích Cỡ Bộ Lọc làm giá trị bộ lọc cực tiểu (đơn vị điểm ảnh)" +msgstr "Dùng Cỡ Lọc làm giá trị lọc tối thiểu trong đơn vị điểm ảnh" msgid "Interpolate pixels using selected filter" -msgstr "Nội suy điểm ảnh bằng bộ lọc được chọn" +msgstr "Nội suy các điểm ảnh bằng bộ lọc được chọn" msgid "MIP Map" -msgstr "Bản Đồ Đa Bậc Tầng" +msgstr "Ánh Xạ MIP" msgid "Use auto-generated MIP maps for the image" -msgstr "Dùng bản đồ đa bận tầng được tự động chế tạo cho ảnh" +msgstr "Dùng ánh xạ MIP (Multum In Parvo : Nhiều Trong Ít) tạo tự động cho hình ảnh" msgid "MIP Map Gaussian filter" -msgstr "Bộ Lọc Gauss Bản Đồ Đa Bậc" +msgstr "Bộ lọc Gaus trong Ánh Xạ MIP" msgid "Use Gauss filter to sample down MIP maps" -msgstr "Dùng bộ lọc Guass để giảm mẫu vật của bản đồ đa bậc tầng" +msgstr "Dùng bộ lọc Gaus (Carl Friedrich Gauss) để đơn giản hóa các ánh xạ MIP (Multum In Parvo : Nhiều Trong Ít)" msgid "Mirror X" -msgstr "Gương X" +msgstr "Phản Chiếu Đối Xứng X" msgid "Mirror the image repetition on the X direction" -msgstr "Gương (lật) ảnh khi lặp vòng cho hướng X" +msgstr "Phản chiếu đối xứng sự nhắc lại hình ảnh theo chiều X" msgid "Mirror Y" -msgstr "Gương Y" +msgstr "Phản Chiếu Đối Xứng Y" msgid "Mirror the image repetition on the Y direction" -msgstr "Gương (lật) ảnh khi lặp vòng cho hướng Y" +msgstr "Phản chiếu đối xứng sự nhắc lại hình ảnh theo chiều Y" msgid "Normal Map" @@ -27375,19 +29758,19 @@ msgstr "Ánh Xạ Pháp Tuyến" msgid "Use image RGB values for normal mapping" -msgstr "Dùng giá trị RGB cho ánh xạ pháp tuyến" +msgstr "Dùng giá trị RGB để ánh xạ pháp tuyến" msgid "Magic Texture" -msgstr "Chất Liệu Phép Thuật" +msgstr "Chất Liệu Ảo Thuật" msgid "Depth of the noise" -msgstr "Độ sâu của huyên náo" +msgstr "Độ sâu của nhiễu" msgid "Turbulence of the noise" -msgstr "Nhiễu loạn của huyên náo" +msgstr "Sự hỗn loạn của nhiễu" msgid "Marble Texture" @@ -27395,7 +29778,7 @@ msgstr "Chất Liệu Đá Hoa" msgid "Pattern" -msgstr "Gương Mẫu" +msgstr "Hoa Văn/Mẫu" msgid "Use soft marble" @@ -27403,23 +29786,23 @@ msgstr "Dùng đá hoa mềm" msgid "Sharp" -msgstr "Bén" +msgstr "Sắc Cạnh/Đột Ngột" msgid "Use more clearly defined marble" -msgstr "Dùng đá hoa được chỉ định rõ hơn" +msgstr "Dùng đá hoa với định hình rõ rệt hơn" msgid "Sharper" -msgstr "Bén Hơn" +msgstr "Sắc Nhọn/Đột Ngột Hơn" msgid "Use very clearly defined marble" -msgstr "Dùng đá hoa được chỉ định rất rõ" +msgstr "Dùng đá hoa với định hình rất rõ rệt" msgid "Noise Basis 2" -msgstr "Cơ Sở Huyên Náo 2" +msgstr "Cơ Sở Nhiễu 2" msgid "Sin" @@ -27427,59 +29810,59 @@ msgstr "Sin" msgid "Use a sine wave to produce bands" -msgstr "Dùng một sóng sin để chế tạo quằn" +msgstr "Dùng sóng sin để tạo đường vằn" msgid "Saw" -msgstr "Cưa" +msgstr "Hình Răng Cưa" msgid "Use a saw wave to produce bands" -msgstr "Dùng mốt sóng cưa để chế tạo quằn" +msgstr "Dùng sóng hình răng cưa để tạo đường vằn" msgid "Tri" -msgstr "Tam Giác" +msgstr "Hình Tam Giác" msgid "Use a triangle wave to produce bands" -msgstr "Dùng một sóng tam giác để chế tạo quằn" +msgstr "Dùng sóng hình tam giác để tạo đường vằn" msgid "Turbulence of the bandnoise and ringnoise types" -msgstr "Nhiễu loạn của huyên náo loại quằn và vành" +msgstr "Hỗn loạn của các loại nhiễu hình đường vằn và hình vành nhẫn" msgid "Procedural musgrave texture" -msgstr "Chất liệu musgrae thủ tục" +msgstr "Chất liệu musgrave bằng thủ tục" msgid "Highest Dimension" -msgstr "Chiều Cao Nhất" +msgstr "Kích Thước Cao Nhất" msgid "Highest fractal dimension" -msgstr "Chiều phân dạng cao nhất" +msgstr "Kích thước phân dạng cao nhất" msgid "Gain" -msgstr "Tăng Lượng" +msgstr "Khuếch Đại" msgid "The gain multiplier" -msgstr "Hệ số nhân tăng lượng" +msgstr "Số nhân khuếch đại" msgid "Lacunarity" -msgstr "Húc Hỏng" +msgstr "Độ Khuyết Rỗng" msgid "Gap between successive frequencies" -msgstr "Cách giữa tần số tiếp theo" +msgstr "Khoảng trống giữa các tần số" msgid "Fractal noise algorithm" -msgstr "Giải thuật huyên náo phân dạng" +msgstr "Thuật toán tạo nhiễu phân dạng" msgid "Multifractal" @@ -27487,23 +29870,23 @@ msgstr "Đa Phân Dạng" msgid "Use Perlin noise as a basis" -msgstr "Dùng huyên náo Perlin làm cơ sở" +msgstr "Dùng nhiễu Perlin làm cơ sở" msgid "Ridged Multifractal" -msgstr "Đa Phân Dạng Có Dãy Đỉnh" +msgstr "Đa Phân Dạng Nhấp Nhô" msgid "Use Perlin noise with inflection as a basis" -msgstr "Dùng huyên náo Perlin với cơ sở sự uốn" +msgstr "Dùng nhiễu Perlin với độ võng làm cơ sở" msgid "Hybrid Multifractal" -msgstr "Đa Phân Dạng Kép" +msgstr "Đa Phân Dạng Lai Ghép" msgid "Use Perlin noise as a basis, with extended controls" -msgstr "Dùng huyên náo Perlin làm cơ sở, và có điều khiển thêm" +msgstr "Dùng nhiễu Perlin làm cơ sở, song với gia tăng khả năng điều khiển" msgid "fBM" @@ -27511,23 +29894,23 @@ msgstr "fBM" msgid "Fractal Brownian Motion, use Brownian noise as a basis" -msgstr "Phân dạng Chuyển Động Brown, dùng cơ sở huyên náo Brown" +msgstr "Chuyển Động Brown Phân Dạng, dùng cơ sở nhiễu Brown" msgid "Hetero Terrain" -msgstr "Địa Dạng Dị Loại" +msgstr "Địa Hình Dị Dạng" msgid "Similar to multifractal" -msgstr "Hơi giống đa phân dạng" +msgstr "Tương tự như đa phân dạng" msgid "Noise Intensity" -msgstr "Cường Độ Huyên Náo" +msgstr "Cường Độ Nhiễu" msgid "Intensity of the noise" -msgstr "Cường độ huyên náo" +msgstr "Cường độ nhiễu" msgid "Octaves" @@ -27535,15 +29918,15 @@ msgstr "Quãng Tám" msgid "Number of frequencies used" -msgstr "Sô lượng tần số dùng" +msgstr "Số lượng tần số sử dụng" msgid "The fractal offset" -msgstr "Dịch phân dạng" +msgstr "Dịch chuyển của phân dạng" msgid "Noise Texture" -msgstr "Chất Liệu Huyên Náo" +msgstr "Chất Liệu Nhiễu" msgid "Stucci Texture" @@ -27555,27 +29938,27 @@ msgstr "Nhựa" msgid "Use standard stucci" -msgstr "Dùng stucci chuẩn" +msgstr "Dùng stucci tiêu chuẩn" msgid "Wall In" -msgstr "Tường Vào" +msgstr "Tường Vây Quanh" msgid "Create Dimples" -msgstr "Tạo Lõm" +msgstr "Kiến Tạo các Lúm" msgid "Wall Out" -msgstr "Tường Ra" +msgstr "Nằm Ngoài Tường" msgid "Create Ridges" -msgstr "Tạo Dãy Đỉnh" +msgstr "Kiến Tạo các Lằn Gợn" msgid "Procedural voronoi texture" -msgstr "Chất liệu voronoi thủ tục" +msgstr "Thủ tục chất liệu Voronoi" msgid "Coloring" @@ -27587,31 +29970,31 @@ msgstr "Chỉ tính cường độ" msgid "Color cells by position" -msgstr "Tô tế bào tùy vị trí" +msgstr "Tô màu các tế bào tùy vị trí" msgid "Position and Outline" -msgstr "Vị Trí Và Nét Bao Quanh" +msgstr "Vị Trí và Đường Viền" msgid "Use position plus an outline based on F2-F1" -msgstr "Dùng vị trí và một nét bao quanh cơ sở F2-F1" +msgstr "Dùng vị trí kèm đường viền dựa trên F2-F1" msgid "Position, Outline, and Intensity" -msgstr "Vi Trí, Nét Bao Quanh, Và Cường Độ" +msgstr "Vị Trí, Đường Viền, và Cường Độ" msgid "Multiply position and outline by intensity" -msgstr "Nhân vị trí và nét bao quang với cường độ" +msgstr "Nhân vị trí và đường viền với cường độ" msgid "Distance Metric" -msgstr "Thước Đo Khoảng Cách" +msgstr "Thang Đo Khoảng Cách" msgid "Algorithm used to calculate distance of sample points to feature points" -msgstr "Giải thuật cho tính khoảng cách của điểm mẫu vật đến điểm đặt trưng" +msgstr "Thuật toán dùng để tính khoảng cách của các mẫu vật đến các điểm hình dạng" msgid "Actual Distance" @@ -27635,7 +30018,7 @@ msgstr "Manhattan" msgid "The length of the distance in axial directions" -msgstr "Khoảng cách theo hướng của trục" +msgstr "Chiều dài khoảng cách theo các hướng của trục" msgid "Chebychev" @@ -27643,7 +30026,7 @@ msgstr "Chebychev" msgid "The length of the longest Axial journey" -msgstr "Khoảng cách trục xa nhất" +msgstr "Khoảng cách đoạn đường xa nhất trên trục" msgid "Minkowski 1/2" @@ -27651,7 +30034,7 @@ msgstr "Minkowski 1/" msgid "Set Minkowski variable to 0.5" -msgstr "Đặt biên số Minkowski = 0.5" +msgstr "Đặt biến số Minkowski = 0.5" msgid "Minkowski 4" @@ -27659,7 +30042,7 @@ msgstr "Minkowski 4" msgid "Set Minkowski variable to 4" -msgstr "Đặt biên số Minkowski = 4" +msgstr "Đặt biến số Minkowski = 4" msgid "Minkowski" @@ -27667,7 +30050,7 @@ msgstr "Minkowski" msgid "Use the Minkowski function to calculate distance (exponent value determines the shape of the boundaries)" -msgstr "Dùng hàm số Minkowski để tính khoảng cách (hệ số lũy thừa được xác định hình dạng của ranh giới)" +msgstr "Dùng hàm số Minkowski để tính khoảng cách (hệ số lũy thừa xác định hình dạng của các ranh giới)" msgid "Minkowski Exponent" @@ -27675,123 +30058,123 @@ msgstr "Lũy Thừa Minkowski" msgid "Minkowski exponent" -msgstr "Lũy Thừa Minkowski" +msgstr "Lũy thừa Minkowski" msgid "Scales the intensity of the noise" -msgstr "Phóng to cường độ của huyên náo" +msgstr "Phóng đại cường độ nhiễu" msgid "Weight 1" -msgstr "Quyền Lượng 1" +msgstr "Trọng Lượng 1" msgid "Voronoi feature weight 1" -msgstr "Quyền lượng 1 của đặt trưng Voronoi" +msgstr "Trọng lượng hình dạng Voronoi 1" msgid "Weight 2" -msgstr "Quyền Lượng 2" +msgstr "Trọng Lượng 2" msgid "Voronoi feature weight 2" -msgstr "Quyền lượng 2 của đặt trưng Voronoi" +msgstr "Trọng lượng hình dạng Voronoi 2" msgid "Weight 3" -msgstr "Quyền Lượng 3" +msgstr "Trọng Lượng 3" msgid "Voronoi feature weight 3" -msgstr "Quyền lượng 3 của đặt trưng Voronoi" +msgstr "Trọng lượng hình dạng Voronoi 3" msgid "Weight 4" -msgstr "Quyền Lượng 4" +msgstr "Trọng Lượng 4" msgid "Voronoi feature weight 4" -msgstr "Quyền lượng 4 của đặt trưng Voronoi" +msgstr "Trọng lượng hình dạng Voronoi 4" msgid "Wood Texture" -msgstr "Chất Liệu Gổ" +msgstr "Chất Liệu Gỗ" msgid "Bands" -msgstr "Quằn" +msgstr "Đường Vằn" msgid "Use standard wood texture in bands" -msgstr "Dùng chất liệu gổ chuẩn trong quằn" +msgstr "Dùng chất liệu gỗ tiêu chuẩn với hình các đường vằn" msgid "Rings" -msgstr "Vành" +msgstr "Vành Nhẫn" msgid "Use wood texture in rings" -msgstr "Dùng chất liệu gỗ trong vành" +msgstr "Dùng chất liệu gỗ với hình các đường vành nhẫn" msgid "Band Noise" -msgstr "Huyên Náo Quằn" +msgstr "Đường Vằn bị Nhiễu" msgid "Add noise to standard wood" -msgstr "Thêm huyên náo vào gỗ tiêu chuẩn" +msgstr "Thêm nhiễu vào chất liệu gỗ tiêu chuẩn" msgid "Ring Noise" -msgstr "Huyên Náo Vành" +msgstr "Vành Nhẫn bị Nhiễu" msgid "Add noise to rings" -msgstr "Thêm huyên náo vào vành" +msgstr "Thêm nhiễu vào vành nhẫn" msgid "Vector Font" -msgstr "Phông Vectơ" +msgstr "Phông Véctơ" msgid "Vector font for Text objects" -msgstr "Phông vectơ cho Vật Thể Văn Bản" +msgstr "Phông vectơ cho đối tượng Văn Bản" msgid "Volume data-block for 3D volume grids" -msgstr "Cục dữ liệu thể tích cho đồ thị thể tích 3D" +msgstr "Khối dữ liệu thể tích dành cho khung lưới đồ thị thể tích 3D" msgid "Volume display settings for 3D viewport" -msgstr "Cài đặt hiển thị thể tích cho màn chiếu 3D" +msgstr "Những sắp đặt hiển thị thể tích cho cổng nhìn 3D" msgid "Volume file used by this Volume data-block" -msgstr "Tập tin thể tịch thì Cục Dữ Liệu Thể Tích này đang dùng" +msgstr "Tập tin thể tích sử dụng bởi khối dữ liệu Thể Tích này" msgid "Number of frames of the sequence to use" -msgstr "Số lượng bức ảnh của trình tự để dùng" +msgstr "Số khung hình trong trình tự sẽ sử dụng" msgid "Offset the number of the frame to use in the animation" -msgstr "Dịch số bức ảnh để dùng cho hoạt hình" +msgstr "Dịch chuyển số khung hình sử dụng trong hoạt họa" msgid "Global starting frame of the sequence, assuming first has a #1" -msgstr "Bức ảnh bắt đầu toàn cầu của trình tự, giả sự bức ảnh đầu là bức ảnh số 1" +msgstr "Khung hình khởi đầu toàn cầu của trình tự, giả định là khung hình đầu có một dấu #1" msgid "Grids" -msgstr "Đồ Thị" +msgstr "Khung Lưới Đồ Thị" msgid "3D volume grids" -msgstr "Các đồ thị 3D thể tích" +msgstr "Khung lưới đồ thị thể tích 3D" msgid "Volume render settings for 3D viewport" -msgstr "Cài đặt kết xuất thể tích cho màn chiếu 3D" +msgstr "Những sắp đặt kết xuất thể tích trong cổng nhìn 3D" msgid "Sequence Mode" @@ -27799,47 +30182,47 @@ msgstr "Chế Độ Trình Tự" msgid "Sequence playback mode" -msgstr "Chế độ hát lại của trình tự" +msgstr "Chế độ chơi lại trình tự" msgid "Hide frames outside the specified frame range" -msgstr "Ẩn các bức ảnh ở ngoài phạm vi được chỉ định" +msgstr "Ẩn giấu các khung hình nằm ngoài phạm vi khung hình chỉ định" msgid "Repeat the start frame before, and the end frame after the frame range" -msgstr "Sao chép bức ảnh đầu tiên trước phạm vi bức ảnh, và sao chép bức ảnh cuối cuồi sau phạm vi bức ảnh" +msgstr "Nhắc lại khung hình đầu nằm trước, và khung hình cuối nằm sau phạm vi khung hình" msgid "Cycle the frames in the sequence" -msgstr "Lặp lại các bức ảnh trong trình tự" +msgstr "Nhắc lại các khung hình trong trình tự" msgid "Ping-Pong" -msgstr "Tới Lùi" +msgstr "Bóng Bàn" msgid "Repeat the frames, reversing the playback direction every other cycle" -msgstr "Lập lại các bức ảnh, trở ngược thứ tự bức ảnh mỗi chu trình lẻ" +msgstr "Nhắc lại các khung hình, đảo chiều hướng chơi lại sau mỗi chu kỳ cách bước" msgid "Name of the velocity field, or the base name if the velocity is split into multiple grids" -msgstr "Tên của trường vận tốc, hoặc tên cơ sở nếu vận tốc được chẻ thành nhiêu đồ thị" +msgstr "Tên của trường vận tốc, hoặc tên cơ sở nếu vận tốc được chia thành nhiều khung lưới đồ thị" msgid "Velocity X Grid" -msgstr "Đồ Thị Vận Tốc X" +msgstr "Khung Lưới Đồ Thị Vận Tốc X" msgid "Name of the grid for the X axis component of the velocity field if it was split into multiple grids" -msgstr "Tên của đồ thị cho thành phần X của vận tốc trường, nếu vận tốc được chẻ thành nhiêu đồ thị" +msgstr "Tên của khung lưới đồ thị cho thành phần trục X của trường vận tốc nếu nó được chia thành nhiều khung lưới đồ thị" msgid "Velocity Y Grid" -msgstr "Đồ Thị Vận Tốc Y" +msgstr "Khung Lưới Đồ Thị Vận Tốc Y" msgid "Name of the grid for the Y axis component of the velocity field if it was split into multiple grids" -msgstr "Tên của đồ thị cho thành phần Y của vận tốc trường, nếu vận tốc được chẻ thành nhiêu đồ thị" +msgstr "Tên của khung lưới đồ thị cho thành phần trục Y của trường vận tốc nếu nó được chia thành nhiều khung lưới đồ thị" msgid "Velocity Z Grid" @@ -27847,11 +30230,11 @@ msgstr "Đồ Thị Vận Tốc Z" msgid "Name of the grid for the Z axis component of the velocity field if it was split into multiple grids" -msgstr "Tên của đồ thị cho thành phần Z của vận tốc trường, nếu vận tốc được chẻ thành nhiêu đồ thị" +msgstr "Tên của khung lưới đồ thị cho thành phần trục Z của trường vận tốc nếu nó được chia thành nhiều khung lưới đồ thị" msgid "Window manager data-block defining open windows and other user interface data" -msgstr "Cục dữ liệu quản lý cửa sổ được định nghĩa các cửa sổ mở và dữ liệu giao diện khác" +msgstr "Khối dữ liệu trình quản lý cửa sổ xác định các cửa sổ được mở và các dữ liệu giao diện người dùng khác" msgid "MathVisProp" @@ -27863,23 +30246,23 @@ msgstr "DanhSáchĐặcĐiểmTrạngTháiHiệnToán" msgid "Category" -msgstr "Thể Loại" +msgstr "Hạng Mục" msgid "Filter add-ons by category" -msgstr "Lọc đồ kèm bằng thể loại" +msgstr "Thanh lọc trình bổ sung theo hạng mục" msgid "Filter by add-on name, author & category" -msgstr "Bộ lọc bằng tên đồ kèm, tác giả, và loại thứ" +msgstr "Thanh lọc theo tên trình bổ sung, tác giả và hạng mục" msgid "Support" -msgstr "Sự Hỗ Trợ" +msgstr "Hỗ Trợ" msgid "Display support level" -msgstr "Hiển thị mức độ sự hỗ trợ" +msgstr "Hiển thị mức độ hỗ trợ" msgid "Official" @@ -27887,7 +30270,7 @@ msgstr "Chính Thức" msgid "Officially supported" -msgstr "Hỗ Trợ Chính Thức" +msgstr "Chính thức được hỗ trợ" msgid "Community" @@ -27895,23 +30278,23 @@ msgstr "Cộng Đồng" msgid "Maintained by community developers" -msgstr "Duy trì bằng cộng đồng phát triển" +msgstr "Được bảo hành bởi các lập trình viên của cộng đồng" msgid "Asset Blend Path" -msgstr "Đường Mục Tập Tin Của Tích Sản" +msgstr "Đường Dẫn Tài Sản Blend" msgid "Full path to the Blender file containing the active asset" -msgstr "Toàn đường mục đến tập tin Blender chứa tích sản hoạt động" +msgstr "Đường dẫn đầy đủ đến tập tin Blender có chứa tài sản hiện đang hoạt động" msgid "Is Interface Locked" -msgstr "Giao Diện Bị Khóa Không" +msgstr "Giao Diện Bị Khóa Lại Hay Không" msgid "If true, the interface is currently locked by a running job and data shouldn't be modified from application timers. Otherwise, the running job might conflict with the handler causing unexpected results or even crashes" -msgstr "Nếu đúng, giao diện đang bị khóa bởi một cộng việc đang chạy và không nên đổi dữ liệu từ đồng hồ ứng dụng. Ngoài ra, cộng việc đang chạy có thể có mẫu thuận với bộ xử lý và tạo kết qủa bất ngờ hay sạp phần mền" +msgstr "Nếu 'ĐÚNG' thì giao diện hiện tại đã bị một công việc đang trong quá trình hoạt động khóa lại, hầu cho, dữ liệu được giữ nguyên, không bị các đồng hồ bấm giờ thay đổi chúng. Nếu không, công việc đang hoạt động có thể xung khắc với trình xử lý (handler), gây ra những kết quả bất ngờ, hoặc gây ra hỏng hóc, ngừng hoạt động (crashes)" msgid "Key Configurations" @@ -27919,143 +30302,143 @@ msgstr "Cấu Hình Phím" msgid "Registered key configurations" -msgstr "Cấu hình phím được đăng ký" +msgstr "Cấu hình phím đã đăng ký" msgid "Operators" -msgstr "Thao Tác" +msgstr "Thao tác" msgid "Operator registry" -msgstr "Sổ Hộ Khẩu Thao Tác" +msgstr "Bảng đăng ký của thao tác" msgid "Preset Name" -msgstr "Tên Đặt Sẵn" +msgstr "Tên của Sắp Đặt Trước" msgid "Name for new preset" -msgstr "Tên cho đặt sẵn mới" +msgstr "Tên cho sắp đặt sẵn trước" msgid "Windows" -msgstr "Cửa Sổ" +msgstr "Các Cửa Sổ" msgid "Open windows" -msgstr "Cửa sổ mở" +msgstr "Các cửa sổ mở" msgid "XR Session Settings" -msgstr "Cài Đặt Phiên Chạy XR" +msgstr "Sắp Đặt của Phiên Hoạt Động XR" msgid "XR Session State" -msgstr "Trạng Thái Phiên Chạy XR" +msgstr "Trạng Thái của Phiên Hoạt Động XR" msgid "Runtime state information about the VR session" -msgstr "Thông tin trạng thái của thời gian chạy của phiên chạy VR" +msgstr "Thông tin về trạng thái phiên VR trong thời gian hoạt động" msgid "Workspace data-block, defining the working environment for the user" -msgstr "Cục dữ liệu công trường, chỉ định môi trường công trường cho người dùng" +msgstr "Khối dữ liệu không gian làm việc, định nghĩa môi trường làm việc cho người dùng" msgid "Active Pose Asset" -msgstr "Tích Sản Dạng Đứng Hoạt Động" +msgstr "Tài Sản Tư Thế đang Hoạt Động" msgid "Per workspace index of the active pose asset" -msgstr "Chỉ số từng công trình không gian của tích sản dạng đứng hoạt động" +msgstr "Chỉ số tài sản tư thế đang hoạt động trong mỗi không gian làm việc" msgid "Active asset library to show in the UI, not used by the Asset Browser (which has its own active asset library)" -msgstr "Thư viện tích sản hoạt động cho hiạn trong Gia Diện, nhưng Trình Duyệt Tích Sản không dùng (nó có thư viện tích sản riêng)" +msgstr "Thư viện tài sản đang hoạt động để hiển thị trong Giao Diện Người Dùng. Cái này sẽ không được sử dụng trong Trình Duyệt Tài Sản (tức cái có thư viện tài sản riêng của nó) đâu nhé" msgid "Switch to this object mode when activating the workspace" -msgstr "Trao đổi đến vật thể này khi hoạt động lại công trường" +msgstr "Đổi sang chế độ đối tượng này khi kích hoạt không gian làm việc" msgid "Grease Pencil Edit Mode" -msgstr "Chế Độ Biên Tập Bút Sáp" +msgstr "Chế Độ Biên Soạn Bút Chì Dầu" msgid "Grease Pencil Sculpt Mode" -msgstr "Chế Độ Khắc Bút Sáp" +msgstr "Chế Độ Điêu Khắc Bút Chì Dầu" msgid "Grease Pencil Draw" -msgstr "Vẽ Bút Sáp" +msgstr "Vẽ Nét Bút Chì Dầu" msgid "Grease Pencil Vertex Paint" -msgstr "Sơn Đỉnh Bút Sáp" +msgstr "Sơn Điểm Đỉnh Bút Chì Dầu" msgid "Grease Pencil Weight Paint" -msgstr "Quyền Lượng Bút Sáp" +msgstr "Sơn Trọng Lượng Bút Chì Dầu" msgid "UI Tags" -msgstr "Nhãn Giao Diện" +msgstr "Nhãn UI" msgid "Screen layouts of a workspace" -msgstr "Bố trí màn của một công trường" +msgstr "Bố trí màn hình của một không gian làm việc" msgid "Use UI Tags" -msgstr "Sử Dụng Nhãn Giao Diện" +msgstr "Dùng Nhãn UI" msgid "Filter the UI by tags" -msgstr "Lọc giao diện bằng nhãn " +msgstr "Thanh lọc UI theo nhãn" msgid "Pin Scene" -msgstr "Ghim Cảnh" +msgstr "Đính Ghim Cảnh" msgid "Remember the last used scene for the workspace and switch to it whenever this workspace is activated again" -msgstr "Nhớ cảnh cuối đã được sử dụng cho công trường và đổi đến nó khi công trường này được khởi động lại" +msgstr "Ghi nhớ cảnh được sử dụng gần đây nhất cho không gian làm việc và chuyển sang cảnh đó bất cứ khi nào không gian làm việc này được kích hoạt trở lại" msgid "World data-block describing the environment and ambient lighting of a scene" -msgstr "Cục dữ liệu thế giới đang mô tả môi trường và ánh sáng bao quanh của một cảnh" +msgstr "Khối dữ liệu thế giới miêu tả môi trường và bố trí ánh sáng tự nhiên của cảnh" msgid "Color of the background" -msgstr "Màu nền" +msgstr "Màu Nền" msgid "Cycles World Settings" -msgstr "Cài Đặt Thế Giới Cycles" +msgstr "Cấu Hình Thế Giới Cycles" msgid "Cycles world settings" -msgstr "Cài đặt thế giới Cycles" +msgstr "Cấu hình thế giới cho Cycles" msgid "Cycles Visibility Settings" -msgstr "Cài Đặt Sự Hiển Thị Cycles" +msgstr "Sắp Đặt Hiển Thị trong Cycles" msgid "Cycles visibility settings" -msgstr "Cài đặt sự hiển thị Cycles" +msgstr "Sắp đặt hiển thị trong Cycles" msgid "Lighting" -msgstr "Ánh Sáng" +msgstr "Bố Trí Ánh Sáng" msgid "World lighting settings" -msgstr "Cài đặt ánh sáng thế giới" +msgstr "Cấu hình ánh sáng thế giới" msgid "Lightgroup that the world belongs to" -msgstr "NhómĐèn đang sở hữu thế giới" +msgstr "Nhóm ánh sáng mà thế giới thuộc về nó" msgid "Mist" @@ -28063,55 +30446,59 @@ msgstr "Sương Mù" msgid "World mist settings" -msgstr "Cài đặt sương mù thế giới" +msgstr "Cấu hình sương mù thế giới" msgid "Node tree for node based worlds" -msgstr "Cây giao điểm cho thế giới cơ sở giao điểm" +msgstr "Cây nút cho những thế giới cơ sở nút" + + +msgid "Resolution when baked to a texture" +msgstr "Độ phân giải khi nướng thành chất liệu" msgid "Use shader nodes to render the world" -msgstr "Sử dụng giao điểm tô sắc để kết xuất thế giới" +msgstr "Dùng nút tô bóng để kết xuất thế giới" msgid "ID Materials" -msgstr "Tên Vật Liệu" +msgstr "ID của các Nguyên Vật Liệu" msgid "ID Library Override" -msgstr "Tên Vượt Quyền Cho Thư Viện" +msgstr "ID Vượt Quyền Thư Viện" msgid "Struct gathering all data needed by overridden linked IDs" -msgstr "Cấu trúc đang gồm tất cả dữ liệu cần dùng cho các ID liên kết được vượt quyền" +msgstr "Cấu trúc (struct) dùng để triệu tập toàn bộ dữ liệu mà các chỉ danh (IDs) kết nối vượt quyền cần đến" msgid "Hierarchy Root ID" -msgstr "ID Rễ Tầng Bậc" +msgstr "ID Gốc của Hệ Thống Thứ Bậc" msgid "Library override ID used as root of the override hierarchy this ID is a member of" -msgstr "ID của đồ vượt quyền được dùng làm rễ của tầng bậc vượt quyền đang làm thành viên" +msgstr "ID vượt quyền thư viện được sử dụng làm gốc của hệ thống thứ bậc vượt quyền mà ID này là thành viên của nó" msgid "Is In Hierarchy" -msgstr "Đang Trong Tầng Bậc" +msgstr "Nằm Trong Thứ Bậc" msgid "Whether this library override is defined as part of a library hierarchy, or as a single, isolated and autonomous override" -msgstr "Đồ vượt quyền thư viện này được định nghĩa là một phần của một tầng bậc thư viện, hay là đồ vượt quyền độc lập riênt tư" +msgstr "Việc viết đè thư viện này được xác định là một phần của hệ thống thứ bậc thư viện, hay là một trường hợp vượt quyền đơn lẻ, biệt lập và tự trị" msgid "Is System Override" -msgstr "Là Đồ Vượt Quyền Hệ Thống" +msgstr "Là Vượt Quyền Hệ Thống" msgid "Whether this library override exists only for the override hierarchy, or if it is actually editable by the user" -msgstr "Đồ vượt quyền thư viện này chỉ tồn tại cho tầng bậc vượt quyền, hoặc chỉ người dùng có thể biên tập nó hoặc không" +msgstr "Việc vượt quyền thư viện này chỉ tồn tại cho hệ thống thứ bậc vượt quyền, hoặc nếu người dùng thực sự có thể chỉnh sửa được mà thôi" msgid "List of overridden properties" -msgstr "Danh Sách của đặc tính được vượt quyền" +msgstr "Liệt kê các tính chất vượt quyền" msgid "Reference ID" @@ -28119,31 +30506,31 @@ msgstr "ID Tham Chiếu" msgid "Linked ID used as reference by this override" -msgstr "ID liên kết được sử dụng làm tham chiếu của vượt quyền này" +msgstr "Chỉ Danh ID kết nối sử dụng làm tham chiếu bởi sự vượt quyền này" msgid "Override Properties" -msgstr "Đặc Tính Đồ Vượt Quyền" +msgstr "Tính Chất Vượt Quyền" msgid "Collection of override properties" -msgstr "Sưu tập đặc tính đồ vượt quyền" +msgstr "Bộ sưu tập các tính chất vượt quyền" msgid "ID Library Override Property" -msgstr "Đặc Tính Vượt Quyền Thư Viện ID" +msgstr "ID: Tính Chất Vượt Quyền Thư Viện" msgid "Description of an overridden property" -msgstr "Mô tả của một đặc tính được vượt quyền" +msgstr "Phần miêu tả một tính chất vượt quyền" msgid "Operations" -msgstr "Thao Tác" +msgstr "Các Thao Tác" msgid "List of overriding operations for a property" -msgstr "Danh sách tao tác vượt quyền cho một đặc tính" +msgstr "Danh sách các thao tác vượt quyền cho một tính chất" msgid "RNA Path" @@ -28151,15 +30538,19 @@ msgstr "Đường Dẫn RNA" msgid "RNA path leading to that property, from owning ID" -msgstr "Đường dẫn RNA hướng dẫn đến đặc tính đó, từ ID chủ" +msgstr "Đường dẫn RNA đưa đến tính chất đó (địa chỉ), từ ID sở hữu" msgid "ID Library Override Property Operation" -msgstr "Thao Tác Vượt Quyền Đặc Tính Thư Viện ID" +msgstr "ID: Thao Tác của Tính Chất Vượt Quyền Thư Viện" msgid "Description of an override operation over an overridden property" -msgstr "Mô tả của một thao tác vượt quyền cho một đặc tính được vượt quyền" +msgstr "Miêu tả của một thao tác vượt quyền đối với một tính chất vượt quyền" + + +msgid "Status flags" +msgstr "Các cờ trạng thái" msgid "Mandatory" @@ -28167,31 +30558,47 @@ msgstr "Bắt Buộc" msgid "For templates, prevents the user from removing predefined operation (NOT USED)" -msgstr "Cho bố cục mẫu, ngăn ngừa người dùng xóa thao tác được đặt sẵn (KHÔNG SỬ DỤNG)" +msgstr "Dành cho các bản mẫu: ngăn ngừa người dùng xóa bỏ thao tác đã định sẵn (KHÔNG SỬ DỤNG)'" msgid "Prevents the user from modifying that override operation (NOT USED)" -msgstr "Không cho người dùng đổi thao tác vượt quyền đó (KHÔNG SỬ DỤNG)" +msgstr "Ngăn ngừa người dùng sửa đổi thao tác vượt quyền (KHÔNG SỬ DỤNG)" + + +msgid "Match Reference" +msgstr "Khớp Tham Chiếu" + + +msgid "The ID pointer overridden by this operation is expected to match the reference hierarchy" +msgstr "Dự kiến là con trỏ ID, bị vượt quyền bởi thao tác này, sẽ khớp với hệ thống cấp bậc tham chiếu" + + +msgid "ID Item Use ID Pointer" +msgstr "Mục ID Sử Dụng Con Trỏ ID" + + +msgid "RNA collections of IDs only, the reference to the item also uses the ID pointer itself, not only its name" +msgstr "Duy các bộ sưu tập RNA của ID, tham chiếu đến mục này, cũng sử dụng chính bản thân con trỏ ID, chứ không chỉ tên của nó, mà thôi" msgid "Operation" -msgstr "Phép Thuật" +msgstr "Thao Tác" msgid "What override operation is performed" -msgstr "Thực hành thao tác vượt quyền nào" +msgstr "Thao tác vượt quyền nào được thi hành" msgid "No-Op" -msgstr "Vô Hành" +msgstr "Không Có Thao Tác Nào" msgid "Does nothing, prevents adding actual overrides (NOT USED)" -msgstr "Không làm gì hết, ngăn ngừa chế tạo thêm đồ vượt quyền (KHÔNG SỬ DỤNG)" +msgstr "Không làm gì, (dùng để) tránh việc cho thêm những sự vượt quyền thực thụ (KHÔNG SỬ DỤNG)" msgid "Replace value of reference by overriding one" -msgstr "Thay giá trị của tham chiếu bằng vượt quyền giá trị của nó" +msgstr "Thay giá trị của tham chiếu bằng cái đang vượt quyền" msgid "Differential" @@ -28199,47 +30606,71 @@ msgstr "Sự Khác Biệt" msgid "Stores and apply difference between reference and local value (NOT USED)" -msgstr "Chỉ chứa và áp dụng sự khác biệt giữa giá trị tham chiếu và địa phương (KHÔNG SỬ DỤNG)" +msgstr "Lưu và áp dụng sự khác biệt giữa nguồn tham chiếu và giá trị địa phương (KHÔNG SỬ DỤNG)" msgid "Stores and apply multiplication factor between reference and local value (NOT USED)" -msgstr "Chứa và áp dụng hệ số nhân giữa giá trị tham chiếu và địa phương (KHÔNG SỬ DỤNG)" +msgstr "Lưu và áp dụng hệ số nhân giữa nguồn tham chiếu và giá trị địa phương (KHÔNG SỬ DỤNG)" msgid "Insert After" -msgstr "Chèn Phía Sau" +msgstr "Chèn Thêm vào Sau" + + +msgid "Insert a new item into collection after the one referenced in subitem_reference_name/_id or _index" +msgstr "Chèn một mục mới vào bộ sưu tập sau mục được tham chiếu, trong subitem_reference_name/_id hoặc _index" msgid "Insert Before" -msgstr "Chèn Phía Trước" +msgstr "Chèn Thêm vào Trước" + + +msgid "Insert a new item into collection before the one referenced in subitem_reference_name/_id or _index (NOT USED)" +msgstr "Chèn một mục mới vào bộ sưu tập, trước mục được tham chiếu, trong subitem_reference_name/_id hoặc _index (KHÔNG SỬ DỤNG)" + + +msgid "Subitem Local ID" +msgstr "ID Cục Bộ của Mục Phụ" + + +msgid "Collection of IDs only, used to disambiguate between potential IDs with same name from different libraries" +msgstr "Duy bộ sưu tập của các ID, được sử dụng để phân biệt giữa các ID tiềm năng có cùng tên từ các thư viện khác nhau" msgid "Subitem Local Index" -msgstr "Chỉ Số địa Phương Hạ Mặt Hàng" +msgstr "Chỉ Số Cục Bộ của Mục-Thứ" + + +msgid "Used to handle changes into collection" +msgstr "Sử dụng để xử lý các thay đổi trong bộ sưu tập" msgid "Subitem Local Name" -msgstr "Tên Địa Phương Hạ Mặt Hàng" +msgstr "Tên Cục Bộ của Mục-Thứ" + + +msgid "Subitem Reference ID" +msgstr "ID Tham Chiếu của Mục Thứ" msgid "Subitem Reference Index" -msgstr "Chỉ Số Tham Chiếu Hạ Mặt Hàng" +msgstr "Chỉ Số Tham Chiếu của Mục-Thứ" msgid "Subitem Reference Name" -msgstr "Tên Tham Chiếu Hạ Mặt Hàng" +msgstr "Tên Tham Chiếu của Mục-Thứ" msgid "Override Operations" -msgstr "Thao Tác Đồ Vượt Quyền" +msgstr "Thao Tác Vượt Quyền" msgid "Collection of override operations" -msgstr "Sưu tập thao tác đồ vượt quyền" +msgstr "Bộ sưu tập của các thao tác vượt quyền" msgid "Base type for IK solver parameters" -msgstr "Loại cơ sở cho tham số bộ giải ngiệm IK" +msgstr "Kiểu cơ sở cho các tham số của trình giải nghiệm IK" msgid "IK Solver" @@ -28247,11 +30678,11 @@ msgstr "Trình Giải Nghiệm IK" msgid "IK solver for which these parameters are defined" -msgstr "Trình Giải nghiệm IK thì tham số này được chỉ định" +msgstr "Trình giải nghiệm IK thì tham số này được định nghĩa" msgid "Original IK solver" -msgstr "Trình Giải nghiệm IK ban đầu" +msgstr "Trình giải nghiệm IK gốc" msgid "iTaSC" @@ -28259,7 +30690,7 @@ msgstr "iTaSC" msgid "Multi constraint, stateful IK solver" -msgstr "Trình giải nghiệm IK trạng thái có đa ràng buộc." +msgstr "Trình giải nghiệm IK đa ràng buộc, lưu trạng thái đầy đủ (stateful)" msgid "bItasc" @@ -28267,7 +30698,7 @@ msgstr "bItasc" msgid "Parameters for the iTaSC IK solver" -msgstr "Tham số cho trình giải nghiệm IK iTaSC " +msgstr "Các tham số cho trình giải nghiệm IK iTaSC" msgid "Epsilon" @@ -28275,11 +30706,11 @@ msgstr "Epxilon" msgid "Singular value under which damping is progressively applied (higher values produce results with more stability, less reactivity)" -msgstr "Giá trị kỳ dị này được tiến triển áp dụng cho tắt dần (kết qủa của giá trị càng lớn càng ổn, bớt phản ứng)" +msgstr "Giá trị tới hạn (trong tình trạng tắc nghẽn) phần mềm sử dụng để áp dụng sự giảm chấn cấp lũy tiến (giá trị cao hơn làm cho kết quả ổn định hơn, ít tính phản ứng hơn)" msgid "Maximum damping coefficient when singular value is nearly 0 (higher values produce results with more stability, less reactivity)" -msgstr "Hệ số tắt dần cực đại khi giá trị kỳ dị gần bằng 0 (kết qủa của giá trị càng lớn càng ổn, bớt phản ứng)" +msgstr "Hệ số giảm chấn tối đa khi giá trị tới hạn (trong tình trạng tắc nghẽn) xấp xỉ 0 (giá trị cao hơn làm cho kết quả ổn định hơn, ít tính phản ứng hơn)" msgid "Feedback" @@ -28287,51 +30718,51 @@ msgstr "Phản Hồi" msgid "Feedback coefficient for error correction, average response time is 1/feedback" -msgstr "Hệ số phản hồi cho sửa lỗi lầm, thời gian trả lợi trung bình là 1/phản hồi" +msgstr "Hệ số phản hồi để chỉnh sửa sai số, thời gian phản ứng trung bình là 1/hệ số phản hồi" msgid "Maximum number of iterations for convergence in case of reiteration" -msgstr "Số lượng lặp vòng tối đa cho hội tụ cho trường hợp lặp vòng lại" +msgstr "Số lần lặp lại tối đa để đồng quy trong trường hợp tái lặp" msgid "Animation" -msgstr "Hoạt Hình" +msgstr "Hoạt Họa" msgid "Stateless solver computing pose starting from current action and non-IK constraints" -msgstr "Trình giải nghiệm không có trạng thái thì đang tính dạng đứng bắt đầu từ hành động hiện tại và ràng buộc vô IK" +msgstr "Trình giải nghiệm phi trạng thái tính toán tư thế bắt đầu từ hành động hiện tại và các ràng buộc phi-IK" msgid "Simulation" -msgstr "Mô phỏng" +msgstr "Mô Phỏng" msgid "State-full solver running in real-time context and ignoring actions and non-IK constraints" -msgstr "Trình giải nghiệm toàn trạng thái chạy trong bối cảnh thời gian thực và không quan tâm hành động và ràng buộc vô IK" +msgstr "Giải nghiệm toàn-trạng-thái được thi hành trong ngữ cảnh thời gian thực, không quan tâm đến các hành động và các ràng buộc phi-IK" msgid "Precision of convergence in case of reiteration" -msgstr "Độ chính xác cho hội tụ cho trường hợp lặp vòng lại" +msgstr "Độ chuẩn xác của hội tụ (ổn định) trong trường hợp tái lặp" msgid "Reiteration" -msgstr "Lặp Vòng Lại" +msgstr "Tái Lặp" msgid "Defines if the solver is allowed to reiterate (converge until precision is met) on none, first or all frames" -msgstr "Xác địh nếu cho ttrình giải nghiệm lặp lại (tính hội tụ đến chuẩn chính xác đã đạt) cho không bức ảnh nào, bức ảnh đầu tiên hay tất cả bưc ảnh" +msgstr "Xác định nếu giải nghiệm có được phép lặp lại hay không (tính toán đồng quy đến khi đạt được độ chuẩn xác đòi hỏi) cho các trường hợp: không khung hình nào, khung hình đầu tiên, hoặc toàn bộ các khung hình" msgid "The solver does not reiterate, not even on first frame (starts from rest pose)" -msgstr "Trình giải nghiệm không lặp lại, cũng một lặp lại bức ảnh đầu (bắt đầu từ dạng đứng nghỉ ngơi)" +msgstr "Giải nghiệm không tái lặp, ngay cả đối với khung hình đầu tiên (bắt đầu từ tư thế nghỉ)" msgid "The solver reiterates (converges) on the first frame but not on subsequent frame" -msgstr "Trình giải nghiệm lặp lại (tính hội tụ) cho bức ảnh đầu tiên nhưng không lặp lại cho bức ảnh tiếp" +msgstr "Giải nghiệm lặp lại (đồng quy) cho khung hình đầu tiên nhưng không cho khung hình tiếp theo" msgid "The solver reiterates (converges) on all frames" -msgstr "Trình giải nghiệm sẽ lặp lại (tính hội tụ) cho tắt cả bức ảnh" +msgstr "Giải nghiệm sẽ lặp lại (đồng quy) cho toàn bộ các khung hình" msgid "Solver" @@ -28339,23 +30770,23 @@ msgstr "Trình Giải Nghiệm" msgid "Solving method selection: automatic damping or manual damping" -msgstr "Sự lựa chọn phương pháp để giải nghiệm: tắt dần tự động hay tùy chọn" +msgstr "Chọn phương pháp giải nghiệm: giảm chấn tự động hay giảm chấn thủ công" msgid "SDLS" -msgstr "SDLS" +msgstr "Selective Damped Least Square: Giảm Chấn Bình Phương Tối Thiểu có Tuyển Chọn" msgid "Selective Damped Least Square" -msgstr "Bình Phương Tối Thiểu Tắt Dần Tùy Chọn" +msgstr "Giảm Chấn Bình Phương Tối Thiểu có Tuyển Chọn" msgid "DLS" -msgstr "DLS" +msgstr "Damped Least Square: Giảm Chấn Bình Phương Tối Thiểu" msgid "Damped Least Square with Numerical Filtering" -msgstr "Bình Phương Tối Thiểu Tắt Dần Có Bộ Lọc Số Thuật" +msgstr "Giảm Chấn Bình Phương Tối Thiểu có Thanh Lọc Số" msgid "Num Steps" @@ -28363,67 +30794,75 @@ msgstr "Số Lượng Bước" msgid "Divide the frame interval into this many steps" -msgstr "Số lượng bước để phân hóa đoạn bức ảnh" +msgstr "Chia khoảng cách khung hình ra thành nhiều bước" msgid "Max Step" -msgstr "Bước Tối Đa" +msgstr "Số Bước Tối Đa" msgid "Higher bound for timestep in second in case of automatic substeps" -msgstr "Bước thời gian dài trong trường hợp thứ hai dùng hạ bước tự động" +msgstr "Hạn trên của bước thời gian (trong đơn vị giây), đề phòng trường hợp phải tự động tạo các bước phụ" msgid "Min Step" -msgstr "Bước Tối Thiểu" +msgstr "Số Bước Tối Thiểu" msgid "Lower bound for timestep in second in case of automatic substeps" -msgstr "Bước thời gian ngắn nhất trong trường hợp thứ hai dùng hạ bước tự động" +msgstr "Hạn dưới của bước thời gian (trong đơn vị giây), đề phòng trường hợp phải tự động tạo các bước phụ" + + +msgid "Translate Roots" +msgstr "Dịch Chuyển Gốc" + + +msgid "Translate root (i.e. parentless) bones to the armature origin" +msgstr "Dịch chuyển xương gốc (tức cái không có phụ huynh) sang tọa độ gốc của khung cốt" msgid "Auto Step" -msgstr "Tự Động Bước" +msgstr "Tự Động Phân Số Bước" msgid "Automatically determine the optimal number of steps for best performance/accuracy trade off" -msgstr "Tự động xác định số lượng bước tối ưu cho mặu dịch giữa hiệu suất/độ chính xác" +msgstr "Tự động xác định số lượng bước tối ưu để cân bằng giữa tốc độ nhanh nhất và độ chính xác cao nhất" msgid "Maximum joint velocity in radians/second" -msgstr "Vận tốc khớp cực đại đơn vị rad/giây" +msgstr "Tốc lực tối đa của khớp nối trong đơn vị rad/giây đồng hồ" msgid "Settings for image formats" -msgstr "Cài đặt cho định dạng ảnh" +msgstr "Sắp đặt các định dạng cho hình ảnh" msgid "Black" -msgstr "Đèn" +msgstr "Màu Đen" msgid "Log conversion reference blackpoint" -msgstr "Điểm đen tham chiếu khi biến đổi log" +msgstr "Điểm đen chuẩn khi chuyển đổi không gian màu loga" msgid "Log conversion gamma" -msgstr "Gama khi biến đổi log" +msgstr "Gamma khi chuyển đổi không gian loga" msgid "White" -msgstr "Trắng" +msgstr "Màu Trắng" msgid "Log conversion reference whitepoint" -msgstr "Điểm trấng tham chiếu khi biến đổi log" +msgstr "Điểm trắng chuẩn khi đổi không gian màu loga" msgid "Color Depth" -msgstr "Độ Sâu Màu" +msgstr "Độ Sâu của Màu" msgid "Bit depth per channel" -msgstr "Bit mỗi kênh màu" +msgstr "Số bit mỗi kênh màu" msgid "8-bit color channels" @@ -28451,15 +30890,15 @@ msgstr "Quản Lý Màu Sắc" msgid "Which color management settings to use for file saving" -msgstr "Dùng cài đặc quản lý màu sắc nào khi lưu tập tin" +msgstr "Cài đặt quản lý màu nào sẽ sử dụng để lưu tập tin" msgid "Follow Scene" -msgstr "Theo Cảnh" +msgstr "Đi Theo Cảnh" msgid "Choose BW for saving grayscale images, RGB for saving red, green and blue channels, and RGBA for saving red, green, blue and alpha channels" -msgstr "Chọn Trắng Đen cho lưư ảnh độ xám, RGB cho lưu kênh đỏ, lục, xanh, và RGBA cho lưu kênh đỏ, lục, xanh, và đục" +msgstr "Chọn Đen Trắng để lưu những hình ảnh ở gam màu xám, RGB để lưu các kênh đỏ, lục, lam, và RGBA cho lưu các kênh đỏ, lục, lam với kênh alpha (độ trong/đục)" msgid "BW" @@ -28467,11 +30906,11 @@ msgstr "Trắng/Đen" msgid "Images get saved in 8-bit grayscale (only PNG, JPEG, TGA, TIF)" -msgstr "Lưu ảnh độ xám 8 bit (chỉ PNG, JPEG, TGA, TIF)" +msgstr "Hình ảnh được lưu trong thang độ xám 8-bit (duy PNG, JPEG, TGA, TIF mà thôi)" msgid "Images are saved with RGB (color) data" -msgstr "Lưu ảnh có dữ liệu RGB (màu)" +msgstr "Hình ảnh được lưu với dữ liệu RGB (màu)" msgid "RGBA" @@ -28479,11 +30918,11 @@ msgstr "RGBA" msgid "Images are saved with RGB and Alpha data (if supported)" -msgstr "Lưu ảnh có dữ liệu RGB và độ đục (nếu được hỗ trợ)" +msgstr "Hình ảnh được lưu với dữ liệu RGB và Alpha (nếu hỗ trợ)" msgid "Amount of time to determine best compression: 0 = no compression with fast file output, 100 = maximum lossless compression with slow file output" -msgstr "Thời cần để xác định nén hiệu qủa cao nhất: 0 = không nén và xuất ảnh lẹ, 100 = nén cực đại kiểu không mất dữ liệu gốc và xuất ảnh chậm" +msgstr "Lượng thời gian để xác định hiệu quả nén cao nhất: 0 = không nén và xuất ảnh nhanh, 100 = nén tối đa bảo toàn chất lượng nhưng xuất ảnh chậm" msgid "Codec" @@ -28491,55 +30930,59 @@ msgstr "Bộ Hóa Giải Mã" msgid "Codec settings for OpenEXR" -msgstr "Cài đặt bộ hóa giải mã cho OpenEXR" +msgstr "Sắp đặt bộ hóa giải mã cho OpenEXR" msgid "Pxr24 (lossy)" -msgstr "Pxr24 (mất dữ liệu gốc)" +msgstr "Pxr24 (mất mát)" msgid "ZIP (lossless)" -msgstr "ZIP (không mất dữ liệu gốc)" +msgstr "ZIP (không mất mát)" msgid "PIZ (lossless)" -msgstr "PIZ (không mất dữ liệu gốc)" +msgstr "PIZ (không mất mát)" msgid "RLE (lossless)" -msgstr "RLE (không mất dữ liệu gốc)" +msgstr "RLE (không mất mát)" msgid "ZIPS (lossless)" -msgstr "ZIPS (không mất dữ liệu gốc)" +msgstr "ZIPS (không mất mát)" msgid "B44 (lossy)" -msgstr "B44 (mất dữ liệu gốc)" +msgstr "B44 (mất mát)" msgid "B44A (lossy)" -msgstr "B44A (mất dữ liệu gốc)" +msgstr "B44A (mất mát)" msgid "DWAA (lossy)" -msgstr "DWAA (mất dữ liệu gốc)" +msgstr "DWAA (mất mát)" msgid "DWAB (lossy)" -msgstr "DWAB (mất dữ liệu gốc)" +msgstr "DWAB (mất mát)" msgid "File format to save the rendered images as" -msgstr "Đặc trưng cho định dạng ảnh" +msgstr "Định dạng tập tin để lưu hình ảnh đã kết xuất" msgid "Has Linear Color Space" -msgstr "Có Không Gian Tuyến Tính" +msgstr "Có Không Gian Màu Tuyến Tính" msgid "File format expects linear color space" -msgstr "Dạng định tập tin định có không gian tuyến tính" +msgstr "Định dạng tập tin mong đợi không gian màu tuyến tính" + + +msgid "Codec settings for JPEG 2000" +msgstr "Cài đặt mã hóa/giải cho JPEG 2000" msgid "JP2" @@ -28551,19 +30994,19 @@ msgstr "J2K" msgid "Output color space settings" -msgstr "Cài đặt không gian màu sắc ngõ ra" +msgstr "Cung cấp các cài đặt không gian màu" msgid "Quality for image formats that support lossy compression" -msgstr "Chất lượng cho định dạng ảnh thì hỗ trợ nén không giữ dữ liệu gốc" +msgstr "Chất lượng sử dụng cho định dạng của hình ảnh hỗ trợ nén không mất dữ liệu gốc" msgid "Settings for stereo 3D" -msgstr "Cài đặt cho nhị kênh 3D" +msgstr "Sắp đặt cho lập thể 3D" msgid "Compression mode for TIFF" -msgstr "Chế độ nén TIFF" +msgstr "Chế độ nén cho TIFF" msgid "Deflate" @@ -28583,35 +31026,47 @@ msgstr "Log" msgid "Convert to logarithmic color space" -msgstr "Biến đổi thành không gian màu log" +msgstr "Chuyển hóa sang không gian màu loga" msgid "Cinema (48)" msgstr "Cinema (48)" +msgid "Use OpenJPEG Cinema Preset (48fps)" +msgstr "Sử Dụng Cài Đặt Trước của OpenJPEG Cinema (48 khung hình/giây)" + + msgid "Cinema" msgstr "Cinema" +msgid "Use OpenJPEG Cinema Preset" +msgstr "Sử dụng Cài Đặt Trước của OpenJPEG Cinema" + + msgid "YCC" msgstr "YCC" msgid "Save luminance-chrominance-chrominance channels instead of RGB colors" -msgstr "Lưu kênh quang độ-chênh lệch sắc-chênh lệch sắc thay thế màu RGB" +msgstr "Lưu các kênh YCC (luminance-chrominance-chrominance: độ sáng/màu sắc/màu sắc) thay vì các màu RGB (đỏ/lục/lam)" msgid "When rendering animations, save JPG preview images in same directory" -msgstr "Khi kết xuất họa hình, lưu ảnh dự khán JPG trong cùng thư mục tập tin" +msgstr "Khi kết xuất các hoạt họa, lưu các ảnh xem trước JPG vào cùng một thư mục" msgid "Format of multiview media" -msgstr "Định dạng của phương tiện đa màn" +msgstr "Định dạng của phương tiện đa góc nhìn" msgid "Multi-View" -msgstr "Đa-Màn" +msgstr "Đa Góc Nhìn" + + +msgid "Single file with all the views" +msgstr "Đơn tập tin với toàn bộ các góc nhìn" msgid "Tile Number" @@ -28619,243 +31074,259 @@ msgstr "Số Ô" msgid "View Index" -msgstr "Chỉ Số Màn" +msgstr "Chỉ Số Góc Nhìn" msgid "Image Preview" -msgstr "Dự Khán Ảnh" +msgstr "Xem Trước Hình Ảnh" msgid "Preview image and icon" -msgstr "Ảnh và biểu tượng dự khán" +msgstr "Xem trước hình ảnh và biểu tượng" msgid "Unique integer identifying this preview as an icon (zero means invalid)" -msgstr "Số nguyên độc đáo cho phát hiện dự khán này như một biểu tượng (số không nghĩa là không hợp lệ)" +msgstr "Số nguyên duy nhất dùng để nhận dạng bản xem trước này là một biểu tượng (số 0 nghĩa là không hợp lệ)" msgid "Icon Pixels" -msgstr "Điểm Ảnh Biểu Tượng" +msgstr "Số Điểm Ảnh cho Biểu Tượng" msgid "Icon pixels, as bytes (always 32-bit RGBA)" -msgstr "Điểm ảnh biểu tượng, dạng byte (lần nào là RGBA 32 bit)" +msgstr "Số điểm ảnh của biểu tượng, đơn vị byte (luôn luôn là 32 bit RGBA)'" msgid "Float Icon Pixels" -msgstr "Điểm Ảnh Biểu Tượng Số Thật" +msgstr "Số Điểm Ảnh cho Biểu Tượng, Dạng Số Thực" msgid "Icon pixels components, as floats (RGBA concatenated values)" -msgstr "Thành phần điểm ảnh của biểu tượng, số thật (giá trị RGBA kèm nhau)" +msgstr "Các thành phần điểm ảnh của biểu tượng, ở dạng số thực (là các giá trị RGBA nhập lại)" msgid "Icon Size" -msgstr "Kích Cỡ Biểu Tượng" +msgstr "Kích Thước Biểu Tượng" msgid "Width and height in pixels" -msgstr "Bề rộng và bề cao (điểm ảnh)" +msgstr "Chiều rộng và chiều cao (điểm ảnh)" msgid "Image Pixels" -msgstr "Điểm Ảnh Ảnh" +msgstr "Điểm Ảnh" msgid "Image pixels, as bytes (always 32-bit RGBA)" -msgstr "Điểm ảnh của ảnh, dạng byte (lần nào là RGBA 32 bit)" +msgstr "Số điểm ảnh, trong đơn vị byte (luôn luôn là 32 bit RGBA)'" msgid "Float Image Pixels" -msgstr "Điểm Ảnh Ảnh Số Thật" +msgstr "Điểm Hình Ảnh Số Thực" msgid "Image pixels components, as floats (RGBA concatenated values)" -msgstr "Thành phần điểm ảnh của ảnh, số thật (giá trị RGBA kèm nhau)" +msgstr "Các thành phần điểm hình ảnh, ở dạng số thực (các giá trị RGBA nhập lại)" msgid "Image Size" msgstr "Khổ Ảnh" +msgid "True if this preview icon has been modified by py script, and is no more auto-generated by Blender" +msgstr "Đúng nếu biểu tượng xem trước này đã được sửa đổi bởi tập lệnh py và không còn được Blender sinh tạo tự động nữa" + + msgid "Custom Image" -msgstr "Ảnh Tùy Chọn" +msgstr "Hình Ảnh Tùy Chọn" + + +msgid "True if this preview image has been modified by py script, and is no more auto-generated by Blender" +msgstr "Đúng nếu biểu tượng xem trước này đã được sửa đổi bởi tập lệnh py và không còn được Blender tự động sinh tạo nữa" msgid "Parameters defining how an Image data-block is used by another data-block" -msgstr "Các tham số chỉ dịnh làm sao một cục dữ ảnh được một cục dữ liệu khác được sử dụng" +msgstr "Tham số định nghĩa phương pháp một khối dữ liệu khác sẽ sử dụng khối dữ liệu Hình Ảnh như thế nào" msgid "Current frame number in image sequence or movie" -msgstr "Số bức ảnh trong trình tự hay phim" +msgstr "Số khung hình trong trình tự hình ảnh hay phim hiện tại" msgid "Number of images of a movie to use" -msgstr "Số lượng ảnh cúa một phim để dùng" +msgstr "Số lượng hình ảnh của phim để sử dụng" msgid "Global starting frame of the movie/sequence, assuming first picture has a #1" -msgstr "Bức ảnh bắt đầu toàn cầu của phim/trình tự, giả sự bức ảnh đầu là số 1" +msgstr "Khung hình bắt đầu toàn cầu của bộ phim/trình tự hình ảnh, giả định là khung hình đầu có dấu #1" msgid "Layer in multilayer image" -msgstr "Lớp trong ảnh có đa lớp" +msgstr "Tầng trong hình ảnh đa tầng" msgid "Pass in multilayer image" -msgstr "Vòng trong ảnh đa lớp" +msgstr "Lượt trong hình ảnh đa tầng" msgid "View in multilayer image" -msgstr "Chiếu trong ảnh đa lớp" +msgstr "Góc nhìn trong ảnh đa tầng" msgid "Tile" -msgstr "Ô" +msgstr "Bố Trí Ô Cờ" msgid "Tile in tiled image" -msgstr "Ô trong ảnh ô" +msgstr "Ô trong hình ảnh xếp ô" msgid "Auto Refresh" -msgstr "Tự Động Vẽ Lại" +msgstr "Tự Động Làm Tươi Mới Lại" msgid "Always refresh image on frame changes" -msgstr "Lần nào vẽ lại ảnh khi bức ảnh được đổi" +msgstr "Luôn luôn làm tươi mới hình ảnh lại khi khung hình thay đổi" msgid "Cycle the images in the movie" -msgstr "Chu trình ảnh trong phim" +msgstr "Lặp lại các hình ảnh trong phim một cách tuần hoàn" + + +msgid "2D Integer Vector Attribute Value" +msgstr "Giá Trị Thuộc Tính Véctơ Số Nguyên 2D" + + +msgid "2D value in geometry attribute" +msgstr "Giá trị 2D trong thuộc tính hình học" msgid "Integer Attribute Value" -msgstr "Giá Trị Đặc Điểm Số Nguyên" +msgstr "Giá Trị Thuộc Tính Integer" msgid "Integer value in geometry attribute" -msgstr "Giá trị số nguyên trong đặc điểm hình dạng" +msgstr "Giá trị số nguyên (integer) trong thuộc tính hình học" msgid "Key Configuration" -msgstr "Hình Thể Phim" +msgstr "Cấu Hình Phím Bấm" msgid "Input configuration, including keymaps" -msgstr "Hình thể ngõ vào, gồm ánh xạ phím" +msgstr "Cấu hình nhập liệu, cùng các ấn định phím bấm" msgid "Indicates that a keyconfig was defined by the user" -msgstr "Cho biết là một hình thể phím được người dùng chỉ định rồi" +msgstr "Biểu thị rằng một cấu hình phím đã được người dùng định nghĩa" msgid "Key Maps" -msgstr "Các Ánh Xạ Phím" +msgstr "Các Ấn Định Phím Bấm" msgid "Key maps configured as part of this configuration" -msgstr "Các ánh xạ phím được chỉ định là thành phần của hình thể này" +msgstr "Các ấn định phím bấm được sắp đặt làm một bộ phận của cấu hình này" msgid "Name of the key configuration" -msgstr "Tên cúa hình thể phím" +msgstr "Tên của cấu hình phím" msgid "Key-Config Preferences" -msgstr "Tùy Chọn Hình Thể Phím" +msgstr "Cài Đặt Sở Thích về Bố Trí Phím" msgid "KeyConfigs" -msgstr "Hình Thể Phím" +msgstr "Cấu Hình Phím" msgid "Collection of KeyConfigs" -msgstr "Sưu tập hình thể phím" +msgstr "Bộ Sưu Tập các Cấu Hình Phím" msgid "Active KeyConfig" -msgstr "Hình Thể Phím Hoạt Động" +msgstr "Cấu Hình Phím đang Hoạt Động" msgid "Active key configuration (preset)" -msgstr "Hình thể phím hoạt động (đặt sẵn)" +msgstr "Cấu hình phím đang hoạt động (sắp đặt trước)" msgid "Add-on Key Configuration" -msgstr "Hình Thể Phim Đồ Kèm" +msgstr "Cấu Hình Phím Bổ Sung" msgid "Key configuration that can be extended by add-ons, and is added to the active configuration when handling events" -msgstr "Hình thể phím đồ kèm có thể phát triển, và được kèm vào hình thể hoạt động khi xử lý sự kiện" +msgstr "Cấu hình phím có thể được mở rộng bằng các bổ sung, và được thêm vào cấu hình đang hoạt động khi xử lý các sự kiện" msgid "Default Key Configuration" -msgstr "Hình Thể Phim Mặc Định" +msgstr "Cấu Hình Phím Mặc Định" msgid "Default builtin key configuration" -msgstr "Hình thể phím mặc định đặt sẵn" +msgstr "Cấu hình phím mặc định gắn sẵn" msgid "User Key Configuration" -msgstr "Hình Thể Phim Người Dùng" +msgstr "Cấu Hình Phím của Người Dùng" msgid "Final key configuration that combines keymaps from the active and add-on configurations, and can be edited by the user" -msgstr "Hình thể phím cuối được gồm ánh xạ phím từ hình thể hoạt động và đồ kèm, và người dùng được biên tập" +msgstr "Cấu hình phím cuối cùng kết hợp các ấn định phím bấm từ cấu hình đang hoạt động và các cấu hình bổ sung, song người dùng có thể chỉnh sửa" msgid "Key Map" -msgstr "Ánh Xạ Phím" +msgstr "Ấn Định Phím" msgid "Owner" -msgstr "Chủ" +msgstr "Chủ Sở Hữu" msgid "Internal owner" -msgstr "Chủ nội bộ" +msgstr "Chủ sở hữu nội bộ" msgid "Modal Keymap" -msgstr "Ánh Xạ Phím Cách Thức" +msgstr "Ấn Định Mô Thái" msgid "Indicates that a keymap is used for translate modal events for an operator" -msgstr "Nó báo cáo rằng một ánh xạ phím được dùng để phiên dịch sự kiện cách thức cho một thao tác" +msgstr "Biểu thị rằng một ấn định phím được sử dụng để phiên dịch các sự kiện mô thái cho một operator" msgid "Keymap is defined by the user" -msgstr "Ánh xạ phím được người dùng chỉ định" +msgstr "Ấn định phím do người dùng đặt" msgid "Items" -msgstr "Mặt Hàng" +msgstr "Mục/Phần Tử" msgid "Items in the keymap, linking an operator to an input event" -msgstr "Mặt hàng trong ánh xạ phím, liên kết một thao tác với một sự kiện ngõ vào" +msgstr "Những phần tử trong bản ấn định phím, kết nối một thao tác với một sự kiện đầu vào" msgid "Modal Events" -msgstr "Sự Kiện Cách Thức" +msgstr "Các Sự Kiện Modal" msgid "Give access to the possible event values of this modal keymap's items (#KeyMapItem.propvalue), for API introspection" -msgstr "Cho tiếp xúc với tất các giá trị sự kiện có thể có cho những mặt hàng của ánh xạ phím cách thức này " +msgstr "Cấp quyền truy cập cho các giá trị sự kiện có thể có của các phần tử của bố trí bàn phím mô thái (# KeyMapItem.propvalue), để xem xét nội dung API" msgid "Name of the key map" -msgstr "Tên ánh xạ phím" +msgstr "Tên của bảng ấn định phím" msgid "Optional region type keymap is associated with" -msgstr "Loại vùng tùy chọn liên quan với ánh xạ phím" +msgstr "Loại vùng tùy chọn của bảng ấn định phím" msgid "Children Expanded" -msgstr "Con Cái Được Mở Rộng" +msgstr "Mở Rộng Con Cái" msgid "Children expanded in the user interface" @@ -28863,27 +31334,27 @@ msgstr "Con cái được mở rộng trong giao diện người dùng" msgid "Items Expanded" -msgstr "Mặt Hàng Mở Rộng" +msgstr "Mở Rộng Phần Tử" msgid "Expanded in the user interface" -msgstr "Mở rộng trong giao diện" +msgstr "Được mở rộng trong giao diện người dùng" msgid "Optional space type keymap is associated with" -msgstr "Loại dấu cách tùy chọn liên quan với ánh xạ phím" +msgstr "Loại dấu cách trống tùy chọn cho ấn định phím" msgid "Key Map Item" -msgstr "Mặt Hàng Ánh Xạ Phím" +msgstr "Phần Tử trong Ấn Định Phím" msgid "Item in a Key Map" -msgstr "Một hàng trong một Ánh Xạ Phím" +msgstr "Phần tử trong một Ấn Định Phím" msgid "Activate or deactivate item" -msgstr "Hoạt động hay tắt mặt hàng" +msgstr "Bật/tắt tính hoạt động của phần tử" msgid "Alt" @@ -28891,11 +31362,11 @@ msgstr "Alt" msgid "Alt key pressed, -1 for any state" -msgstr "Được bấm phím Alt, -1 cho bất cứ trạng thái" +msgstr "Phím Alt đã được bấm, sẽ là -1 đối với bất cứ trạng thái nào khác" msgid "Alt key pressed" -msgstr "Được bấm phím Alt" +msgstr "Phím Alt đã được bấm" msgid "Any" @@ -28903,7 +31374,7 @@ msgstr "Bất Cứ" msgid "Any modifier keys pressed" -msgstr "Bất cứ phím sửa đổi nào được bấm" +msgstr "Bất cứ phím bổ trợ nào đã được bấm" msgid "Ctrl" @@ -28911,15 +31382,15 @@ msgstr "Ctrl" msgid "Control key pressed, -1 for any state" -msgstr "Được bấm phím Control, -1 cho bất cứ trạng thái" +msgstr "Phím Ctrl đã được bấm, sẽ là -1 đối với bất cứ trạng thái nào khác" msgid "Control key pressed" -msgstr "Phím Ctrl được bấm" +msgstr "Phím Ctrl đã được bấm" msgid "The direction (only applies to drag events)" -msgstr "Hướng (chỉ áp dụng cho sự kiện kéo)" +msgstr "Chiều hướng (chỉ áp dụng đối với các sự kiện kéo rê)" msgid "North" @@ -28927,7 +31398,7 @@ msgstr "Bắc" msgid "North-East" -msgstr "Động Bắc" +msgstr "Đông Bắc" msgid "East" @@ -28943,7 +31414,7 @@ msgstr "Nam" msgid "South-West" -msgstr "Nam Tây" +msgstr "Tây Nam" msgid "West" @@ -28955,59 +31426,59 @@ msgstr "Tây Bắc" msgid "ID of the item" -msgstr "ID (tên) của mặt hàng" +msgstr "ID (tên) của phần tử" msgid "Identifier of operator to call on input event" -msgstr "Tên của thao tác để kêu khi có sự kiện ngõ vào" +msgstr "Định danh của operator để thi hành khi có sự kiện đầu vào" msgid "Is this keymap item user defined (doesn't just replace a builtin item)" -msgstr "Mặt hàng ánh xạ phím này được có người dùng chỉ định (không chỉ thay thế cho một mặt hàng nội bộ)" +msgstr "Có phải phần tử ấn định phím này do người dùng xác định hay không (không chỉ thay thế một phần tử gắn sẵn)" msgid "User Modified" -msgstr "Người Dùng Được Sửa Đổi" +msgstr "Người Dùng Sửa Đổi" msgid "Is this keymap item modified by the user" -msgstr "Mặt hàng ánh xạ phím này được người dùng sửa đổi không" +msgstr "Có phải phần tử ấn định phím này đã được người dùng sửa đổi hay không" msgctxt "UI_Events_KeyMaps" msgid "Key Modifier" -msgstr "Bộ Điều Chỉnh Phím" +msgstr "Phím Bổ Trợ" msgid "Regular key pressed as a modifier" -msgstr "Phím bình thường được dùng làm một bộ điều chỉnh" +msgstr "Phím bình thường được sử dụng như một phím bổ trợ" msgctxt "UI_Events_KeyMaps" msgid "Left Mouse" -msgstr "Chuột Nút Trái" +msgstr "Chuột Trái" msgid "LMB" -msgstr "NCT" +msgstr "Nút Chuột Trái" msgctxt "UI_Events_KeyMaps" msgid "Middle Mouse" -msgstr "Chuột Nút Giữa" +msgstr "Chuột Giữa" msgid "MMB" -msgstr "CNG" +msgstr "Nút Chuột Giữa" msgctxt "UI_Events_KeyMaps" msgid "Right Mouse" -msgstr "Chuột Nút Phải" +msgstr "Chuột Phải" msgid "RMB" -msgstr "NCP" +msgstr "Nút Chuột Phải" msgctxt "UI_Events_KeyMaps" @@ -29053,7 +31524,7 @@ msgstr "Bút" msgctxt "UI_Events_KeyMaps" msgid "Eraser" -msgstr "Cục Gôm" +msgstr "Tẩy" msgctxt "UI_Events_KeyMaps" @@ -29067,7 +31538,7 @@ msgstr "DiChuyểnChuột" msgctxt "UI_Events_KeyMaps" msgid "In-between Move" -msgstr "Di Chuyển Giữa" +msgstr "Di Chuyển Trung Gian" msgid "MsSubMov" @@ -29076,7 +31547,7 @@ msgstr "Hạ DiCuyểnChuột" msgctxt "UI_Events_KeyMaps" msgid "Mouse/Trackpad Pan" -msgstr "Dời Chuột/Bảng Vẽ" +msgstr "Lia bằng Chuột/Bàn Rê" msgid "MsPan" @@ -29085,7 +31556,7 @@ msgstr "DờiChuột" msgctxt "UI_Events_KeyMaps" msgid "Mouse/Trackpad Zoom" -msgstr "Phóng To Chuột/Bảng Vẽ" +msgstr "Thu Phóng Chuột/Bàn Rê" msgid "MsZoom" @@ -29094,7 +31565,7 @@ msgstr "PhóngChuột" msgctxt "UI_Events_KeyMaps" msgid "Mouse/Trackpad Rotate" -msgstr "Chuột/Bảng Vẽ Xoay" +msgstr "Xoay Chuột/Bàn Rê" msgid "MsRot" @@ -29103,7 +31574,7 @@ msgstr "XoayChuột" msgctxt "UI_Events_KeyMaps" msgid "Mouse/Trackpad Smart Zoom" -msgstr "Phóng To Thông Minh Chuột/Bảng Vẽ" +msgstr "Thu-Phóng Thông Minh của Chuột/Bàn Di Chuột" msgid "MsSmartZoom" @@ -29112,38 +31583,38 @@ msgstr "PhóngToChuộtThôngMinh" msgctxt "UI_Events_KeyMaps" msgid "Wheel Up" -msgstr "Nút Cuộn Lên" +msgstr "Bánh Xe Lên" msgid "WhUp" -msgstr "NútCuộnLên" +msgstr "Bánh Xe Lên" msgctxt "UI_Events_KeyMaps" msgid "Wheel Down" -msgstr "Nút Cuộn Xuống" +msgstr "Bánh Xe Xuống" msgid "WhDown" -msgstr "NútCuộnXuống" +msgstr "Bánh Xe Xuống" msgctxt "UI_Events_KeyMaps" msgid "Wheel In" -msgstr "Nút Cuộn Vào" +msgstr "Lăn Bánh Xe Vào" msgid "WhIn" -msgstr "NútCuộnVào" +msgstr "Bánh Xe Vào" msgctxt "UI_Events_KeyMaps" msgid "Wheel Out" -msgstr "Nút Cuộn Ra" +msgstr "Lăn Bánh Xe Ra" msgid "WhOut" -msgstr "NútCuộnRa" +msgstr "Bánh Xe Ra" msgctxt "UI_Events_KeyMaps" @@ -29341,7 +31812,7 @@ msgstr "Lệnh" msgctxt "UI_Events_KeyMaps" msgid "Application" -msgstr "Ứng Dụng" +msgstr "Trình Ứng Dụng" msgid "App" @@ -29779,27 +32250,27 @@ msgstr "Hết" msgctxt "UI_Events_KeyMaps" msgid "Media Play/Pause" -msgstr "Hát/Tạm Dừng Phương Tiện" +msgstr "Chơi/Tạm Ngưng" msgctxt "UI_Events_KeyMaps" msgid "Media Stop" -msgstr "Phương Tiện Nghỉ" +msgstr "Ngừng Chơi" msgctxt "UI_Events_KeyMaps" msgid "Media First" -msgstr "Phương Tiện Đầu" +msgstr "Tua về Đầu" msgctxt "UI_Events_KeyMaps" msgid "Media Last" -msgstr "Phương Tiện Cuối" +msgstr "Tua về Cuối" msgctxt "UI_Events_KeyMaps" msgid "Text Input" -msgstr "Ngõ Vào Văn Bản" +msgstr "Nhập Văn Bản" msgid "TxtIn" @@ -29813,7 +32284,7 @@ msgstr "Tắt Cửa Sổ" msgctxt "UI_Events_KeyMaps" msgid "Timer" -msgstr "Đồng Hồ" +msgstr "Đồng Hồ Bấm Giờ" msgid "Tmr" @@ -29822,7 +32293,7 @@ msgstr "ĐồngHồ" msgctxt "UI_Events_KeyMaps" msgid "Timer 0" -msgstr "Đồng Hồ 0" +msgstr "Đồng Hồ Bấm Giờ 0" msgid "Tmr0" @@ -29831,7 +32302,7 @@ msgstr "ĐH0" msgctxt "UI_Events_KeyMaps" msgid "Timer 1" -msgstr "Đồng Hồ 1" +msgstr "Đồng Hồ Bấm Giờ 1" msgid "Tmr1" @@ -29840,7 +32311,7 @@ msgstr "ĐH1" msgctxt "UI_Events_KeyMaps" msgid "Timer 2" -msgstr "Đồng Hồ 2" +msgstr "Đồng Hồ Bấm Giờ 2" msgid "Tmr2" @@ -29849,7 +32320,7 @@ msgstr "ĐH2" msgctxt "UI_Events_KeyMaps" msgid "Timer Jobs" -msgstr "Đồng Hồ Cộng Việc" +msgstr "Công Việc của Đồng Hồ Bấm Giờ" msgid "TmrJob" @@ -29858,7 +32329,7 @@ msgstr "ĐồngHồCôngViệc" msgctxt "UI_Events_KeyMaps" msgid "Timer Autosave" -msgstr "Đồng Hồ Tự Lưu" +msgstr "Đồng Hồ Bấm Giờ Tự Động Lưu" msgid "TmrSave" @@ -29867,7 +32338,7 @@ msgstr "ĐồngHồLưu" msgctxt "UI_Events_KeyMaps" msgid "Timer Report" -msgstr "Biên Bản Đồng Hồ" +msgstr "Thông Báo của Đồng Hồ Bấm Giờ" msgid "TmrReport" @@ -29876,7 +32347,7 @@ msgstr "ĐồngHồBiênBản" msgctxt "UI_Events_KeyMaps" msgid "Timer Region" -msgstr "Đồng Hồ Khu Vực" +msgstr "Vùng Đồng Hồ Bấm Giờ" msgid "TmrReg" @@ -29889,30 +32360,30 @@ msgstr "NDOF Chuyển Động" msgid "NdofMov" -msgstr "NdofDiChuyển" +msgstr "NdofChĐộng" msgctxt "UI_Events_KeyMaps" msgid "NDOF Menu" -msgstr "NDOF Danh Bạ " +msgstr "NDOF Trình Đơn" msgid "NdofMenu" -msgstr "NdofDanhBạ" +msgstr "NDOFTrĐơn" msgctxt "UI_Events_KeyMaps" msgid "NDOF Fit" -msgstr "NDOF Vừa" +msgstr "NDOF Khít" msgid "NdofFit" -msgstr "NdofVừa" +msgstr "NdofKhít" msgctxt "UI_Events_KeyMaps" msgid "NDOF Top" -msgstr "NDOF Trên" +msgstr "NDOF Đỉnh" msgid "Ndof↑" @@ -29921,7 +32392,7 @@ msgstr "Ndof↑" msgctxt "UI_Events_KeyMaps" msgid "NDOF Bottom" -msgstr "NDOF Dưới" +msgstr "NDOF Đáy" msgid "Ndof↓" @@ -29966,101 +32437,101 @@ msgstr "NdofSau" msgctxt "UI_Events_KeyMaps" msgid "NDOF Isometric 1" -msgstr "NDOF Cùng Cự Tuyến 1" +msgstr "NDOF Đẳng Cự Tuyến 1" msgid "NdofIso1" -msgstr "NdofCùngCựTuyến1" +msgstr "NDOFĐct1" msgctxt "UI_Events_KeyMaps" msgid "NDOF Isometric 2" -msgstr "NDOF Cùng Cự Tuyến 2" +msgstr "NDOF Đẳng Cự Tuyến 2" msgid "NdofIso2" -msgstr "NdofCùngCựTuyến2" +msgstr "NDOFĐct2" msgctxt "UI_Events_KeyMaps" msgid "NDOF Roll CW" -msgstr "NDOF Lăn Hướng Kim Đồng Hồ" +msgstr "NDOF Lăn Thuận Kim Đồng Hồ" msgid "NdofRCW" -msgstr "NdofLănHướngĐồngHồ" +msgstr "NDOFLThuậnKĐH" msgctxt "UI_Events_KeyMaps" msgid "NDOF Roll CCW" -msgstr "NDOF Lăn Nghịch Hướng Đồng Hồ" +msgstr "NDOF Lăn Nghịch Kim Đồng Hồ" msgid "NdofRCCW" -msgstr "NdofLănNghịchHướngĐồngHồ" +msgstr "NDOFLNghịchKĐH" msgctxt "UI_Events_KeyMaps" msgid "NDOF Spin CW" -msgstr "NDOF Quay Hướng Kim Đồng Hồ" +msgstr "NDOF Xoáy Thuận Kim Đồng Hồ" msgid "NdofSCW" -msgstr "NdofQuayHướngĐồngHồ" +msgstr "NDOFXoáyThuậnKĐH" msgctxt "UI_Events_KeyMaps" msgid "NDOF Spin CCW" -msgstr "NDOF Quay Nghịch Hướng Đồng" +msgstr "NDOF Xoáy Nghịch Kim Đồng Hồ" msgid "NdofSCCW" -msgstr "NdofQuayNghịchHướngĐồngHồ" +msgstr "NDOFXoáyNghịchKĐH" msgctxt "UI_Events_KeyMaps" msgid "NDOF Tilt CW" -msgstr "NDOF Ngiêng Hướng Đồng Hồ" +msgstr "NDOF Xoay Nghiêng Thuận Kim Đồng Hồ" msgid "NdofTCW" -msgstr "NdofNghiêngHướngĐồngHồ" +msgstr "NDOFXoayNghiêngThuậnKĐH" msgctxt "UI_Events_KeyMaps" msgid "NDOF Tilt CCW" -msgstr "NDOF Nghiêng Nghịch Hướng Đồng Hồ" +msgstr "NDOF Xoay Nghiêng Nghịch Kim Đồng Hồ" msgid "NdofTCCW" -msgstr "NdofNghiêngNghịchHướngĐồngHồ" +msgstr "NDOFXoayNghiêngNghịchKĐH" msgctxt "UI_Events_KeyMaps" msgid "NDOF Rotate" -msgstr "NDOF Xoay" +msgstr "NDOF Xoay Chiều" msgid "NdofRot" -msgstr "NdofXoay" +msgstr "NdofXoayChiều" msgctxt "UI_Events_KeyMaps" msgid "NDOF Pan/Zoom" -msgstr "NDOF Dời/Phóng" +msgstr "NDOF Lia/Thu-Phóng" msgid "NdofPanZoom" -msgstr "NdofĐờiPhóng" +msgstr "NdofLiaThuPhóng" msgctxt "UI_Events_KeyMaps" msgid "NDOF Dominant" -msgstr "NDOF Chánh" +msgstr "NDOF Trội Vượt" msgid "NdofDom" -msgstr "NdofChánh" +msgstr "NdofTrộiVượt" msgctxt "UI_Events_KeyMaps" @@ -30081,13 +32552,28 @@ msgid "Ndof-" msgstr "Ndof-" +msgctxt "UI_Events_KeyMaps" +msgid "NDOF View 1" +msgstr "NDOF Góc Nhìn 1" + + +msgctxt "UI_Events_KeyMaps" +msgid "NDOF View 2" +msgstr "NDOF Góc Nhìn 2" + + +msgctxt "UI_Events_KeyMaps" +msgid "NDOF View 3" +msgstr "NDOF Góc Nhìn 3" + + msgctxt "UI_Events_KeyMaps" msgid "NDOF Button 1" msgstr "NDOF Nút 1" msgid "NdofB1" -msgstr "NdofNút1" +msgstr "NDOF1" msgctxt "UI_Events_KeyMaps" @@ -30096,7 +32582,7 @@ msgstr "NDOF Nút 2" msgid "NdofB2" -msgstr "NdofNút2" +msgstr "NDOF2" msgctxt "UI_Events_KeyMaps" @@ -30105,7 +32591,7 @@ msgstr "NDOF Nút 3" msgid "NdofB3" -msgstr "NdofNút3" +msgstr "NDOF3" msgctxt "UI_Events_KeyMaps" @@ -30114,7 +32600,7 @@ msgstr "NDOF Nút 4" msgid "NdofB4" -msgstr "NdofNú4" +msgstr "NDOF4" msgctxt "UI_Events_KeyMaps" @@ -30123,7 +32609,7 @@ msgstr "NDOF Nút 5" msgid "NdofB5" -msgstr "NdofNút5" +msgstr "NDOF5" msgctxt "UI_Events_KeyMaps" @@ -30132,7 +32618,7 @@ msgstr "NDOF Nút 6" msgid "NdofB6" -msgstr "NdofNút6" +msgstr "NDOF6" msgctxt "UI_Events_KeyMaps" @@ -30141,7 +32627,7 @@ msgstr "NDOF Nút 7" msgid "NdofB7" -msgstr "NdofNút7" +msgstr "NDOF7" msgctxt "UI_Events_KeyMaps" @@ -30150,7 +32636,7 @@ msgstr "NDOF Nút 8" msgid "NdofB8" -msgstr "NdofNút8" +msgstr "NDOF8" msgctxt "UI_Events_KeyMaps" @@ -30159,7 +32645,7 @@ msgstr "NDOF Nút 9" msgid "NdofB9" -msgstr "NdofNút9" +msgstr "NDOF9" msgctxt "UI_Events_KeyMaps" @@ -30168,7 +32654,7 @@ msgstr "NDOF Nút 10" msgid "NdofB10" -msgstr "NdofÑút10" +msgstr "NDOF10" msgctxt "UI_Events_KeyMaps" @@ -30177,7 +32663,7 @@ msgstr "NDOF Nút A" msgid "NdofBA" -msgstr "NdofNútA" +msgstr "NDOFA" msgctxt "UI_Events_KeyMaps" @@ -30186,7 +32672,7 @@ msgstr "NDOF Nút B" msgid "NdofBB" -msgstr "NdofNútB" +msgstr "NDOFB" msgctxt "UI_Events_KeyMaps" @@ -30195,34 +32681,34 @@ msgstr "NDOF Nút C" msgid "NdofBC" -msgstr "NdofNútC" +msgstr "NDOFC" msgctxt "UI_Events_KeyMaps" msgid "ActionZone Area" -msgstr "Vùng Khu Vực Hành Động" +msgstr "ActionZone Khu Vực" msgid "AZone Area" -msgstr "KV Hành Động" +msgstr "Khu Vực AZone" msgctxt "UI_Events_KeyMaps" msgid "ActionZone Region" -msgstr "Vùng Khu Vực Hành Động" +msgstr "Vùng ActionZone" msgid "AZone Region" -msgstr "Vùng KV Hành Động" +msgstr "Vùng AZone" msgctxt "UI_Events_KeyMaps" msgid "ActionZone Fullscreen" -msgstr "Khu Vực Hành Động Toàn Màn" +msgstr "ActionZone Toàn Màn Hình" msgid "AZone FullScr" -msgstr "KV Hành Động Toàn Màn" +msgstr "AZone ToànMàn" msgctxt "UI_Events_KeyMaps" @@ -30231,11 +32717,11 @@ msgstr "Hành Động XR" msgid "Map Type" -msgstr "Loại Ánh Xạ" +msgstr "Kiểu Ấn Định" msgid "Type of event mapping" -msgstr "Loại ánh xạ sự kiện" +msgstr "Loại ấn định cho sự kiện" msgid "Keyboard" @@ -30247,43 +32733,48 @@ msgstr "Chuột" msgid "NDOF" -msgstr "NDOF" +msgstr "N-Degrees of Freedom: N-Góc Độ Tự Do" msgid "Text Input" -msgstr "Ngõ Vào Văn Bản" +msgstr "Nhập Văn Bản" msgid "Timer" -msgstr "Đồng Hồ" +msgstr "Đồng Hồ Bấm Giờ" msgid "Name of operator (translated) to call on input event" -msgstr "Tên của thao tác (được phiên dịch) để kêu khi có sự kiện ngõ vào" +msgstr "Tên của thao tác (đã phiên dịch) để thi hành đối với sự kiện đầu vào" msgid "OS Key" -msgstr "Phím Hệ Điều Hành" +msgstr "Phím OS" msgid "Operating system key pressed, -1 for any state" -msgstr "Đã Bấm Phím Hệ Điều Hành, -1 cho bất cứ trạng thái" +msgstr "Phím hệ điều hành đã được bấm, sẽ là -1 nếu ở bất cứ trạng thái nào khác" msgid "Operating system key pressed" -msgstr "Bấm Phím Hệ Điều Hành" +msgstr "Phím hệ điều hành đã được bấm" msgid "Properties to set when the operator is called" -msgstr "Đặt đặc tính nào khi kêu thao tác" +msgstr "Những tính chất sẽ áp dụng khi thao tác được thi hành" + + +msgctxt "WindowManager" +msgid "Property Value" +msgstr "Giá Trị Tính Chất" msgid "The value this event translates to in a modal keymap" -msgstr "Sự kiện này được phiên dịch giá trị nào trong một ánh xạ phím cách thức" +msgstr "Giá trị mà sự kiện này sẽ chuyển thành trong một ấn định phím mô thái" msgid "Active on key-repeat events (when a key is held)" -msgstr "Hoạt động cho sự kiện phím-lặp lại (khi bấm giữ một phịm)" +msgstr "Hoạt động trong các sự kiện nhắc lại cái bấm của phím (key-repeat) (khi một phím được giữ xuống)" msgctxt "WindowManager" @@ -30292,20 +32783,20 @@ msgstr "Shift" msgid "Shift key pressed, -1 for any state" -msgstr "Được bấm phím Shift, -1 cho bất cứ trạng thái" +msgstr "Phím Shift đã được bấm xuống, -1 cho các trạng thái khác" msgid "Shift key pressed" -msgstr "Đượv Bấm Phím Shift" +msgstr "Phím Shift được bấm xuống" msgid "Show key map event and property details in the user interface" -msgstr "Hiện sự kiện ánh xạ phím và chi tiết đặc tính trong giao diện người dùng" +msgstr "Hiển thị sự kiện của ấn định phím và các chi tiết tính chất trong giao diện người dùng" msgctxt "UI_Events_KeyMaps" msgid "Type" -msgstr "Loại" +msgstr "Thể Loại" msgid "Type of event" @@ -30317,136 +32808,136 @@ msgstr "Bấm" msgid "Release" -msgstr "Buồng" +msgstr "Thả" msgid "Click" -msgstr "Bấm" +msgstr "Bấm Chuột" msgid "Double Click" -msgstr "Bấm Hai Lần" +msgstr "Nháy Đúp" msgid "Click Drag" -msgstr "Bấm Kéo" +msgstr "Bấm Kéo Rê" msgid "KeyMap Items" -msgstr "Mặt Hàng Ánh Xạ Phím" +msgstr "Các Phần Tử Ấn Định Phím" msgid "Collection of keymap items" -msgstr "Sưu tập mặt hàng ánh xạ phím" +msgstr "Bộ sưu tập các phần tử ấn định phím" msgid "Collection of keymaps" -msgstr "Sưu tập ánh xạ phím" +msgstr "Bộ sưu tập các ấn định phím" msgid "Bezier curve point with two handles defining a Keyframe on an F-Curve" -msgstr "Điểm cong Bezier có hai tay cầm được chỉ định một bức ảnh mẫu trên một Cong-F" +msgstr "Điểm trên đường cong Bezier có hai tay cầm xác định một khung khóa trên Đường Cong-F" msgid "Amount to boost elastic bounces for 'elastic' easing" -msgstr "Mức độ tăng nhồi dẻo cho xoa dịu 'dẻo'" +msgstr "Lượng tăng độ kéo giãn đàn hồi cho quá trình làm chậm rãi 'đàn hồi' lại" msgctxt "Action" msgid "Back" -msgstr "Lùi" +msgstr "Quay Lại" msgid "Amount of overshoot for 'back' easing" -msgstr "Mức vượt qua cho xoa dịu 'phía sau'" +msgstr "Lượng cường điệu hóa để làm chậm rãi khi 'quay lại'" msgid "Coordinates of the control point. Note: Changing this value also updates the handles similar to using the graph editor transform operator" -msgstr "Tọa độ của điểm kiểm soát. Lưu ý: Đổi giá trị này sẽ nâng cấp tay cầm giống như khi dùng thao tác biến hóa của trình biên soạn biểu đồ" +msgstr "Tọa độ của điểm điều khiển. Ghi Chú: Thay đổi giá trị này thì chúng ta cũng đồng thời cập nhật các tay cầm nữa, tương tự như việc sử dụng thao tác biến hóa (transform operator) trong trình biên soạn đồ thị" msgid "Which ends of the segment between this and the next keyframe easing interpolation is applied to" -msgstr "Áp dụng suy nội xoa dịu cho bên nào của đoạn giữa bức ảnh mẫu này và bức ảnh mẫu tiếp" +msgstr "Đầu nào của phân đoạn giữa khung khóa này và cái tiếp tới nội suy chậm rãi sẽ được áp dụng" msgid "Automatic Easing" -msgstr "Tự Động Xoa Dịu" +msgstr "Tự Động Chậm Rãi" msgid "Easing type is chosen automatically based on what the type of interpolation used (e.g. Ease In for transitional types, and Ease Out for dynamic effects)" -msgstr "Loại xoa dịu được tư ̣động chọn tùy loại suy nội đang dùng (ví dụ 'Xoa Dịu Vào' cho loại tiến triển và 'Xoa Dịu Ra' cho hiệu ứng động lý)" +msgstr "Tự ̣động chọn kiểu Chậm Rãi dựa trên kiểu nội suy đang sử dụng (ví dụ: Chậm Rãi Vào đối với các kiểu chuyển tiếp và Chậm Rãi Ra cho các hiệu ứng năng động)" msgid "Ease In" -msgstr "Xoa Dịu Vào" +msgstr "Chậm Rãi Vào" msgid "Only on the end closest to the next keyframe" -msgstr "Chỉ ở bên gần nhất với bức ảnh mẫu tiếp" +msgstr "Chỉ ở đầu gần nhất với khung khóa tiếp tới" msgid "Ease Out" -msgstr "Xoa Dịu Ra" +msgstr "Chậm Rãi Ra" msgid "Only on the end closest to the first keyframe" -msgstr "Chỉ ở bên gần nhất với bức ảnh mẫu đầu tiên" +msgstr "Chỉ ở đầu gần nhất với khung khóa trước nhất" msgid "Ease In and Out" -msgstr "Xoa Dịu Vào Và Ra" +msgstr "Chậm Rãi Vào và Ra" msgid "Segment between both keyframes" -msgstr "Khúc giữa cả hai bức ảnh mẫu" +msgstr "Phân đoạn giữa hai khung khóa" msgid "Left Handle" -msgstr "Tay Cầm Phải" +msgstr "Tay Cầm Bên Trái" msgid "Coordinates of the left handle (before the control point)" -msgstr "Tọa độ của tay cầm trái (trước điểm kiểm soát)" +msgstr "Tọa độ của tay cầm bên trái (trước điểm điều khiển)" msgid "Left Handle Type" -msgstr "Loại Tay Cầm Trái" +msgstr "Kiểu Tay Cầm Bên Trái" msgid "Completely independent manually set handle" -msgstr "Đặt tay cầm bằng tay mà hoàn toàn độc lập" +msgstr "Đặt tay cầm thủ công hoàn toàn độc lập" msgid "Manually set handle with rotation locked together with its pair" -msgstr "Đặt tay cầm bằng tay và khóa với xoay với gắp đôi của nó" +msgstr "Đặt tay cầm thủ công với sự xoay chiều của cả hai được đồng bộ hóa như một" msgid "Automatic handles that create straight lines" -msgstr "Tay cầm tự động cho chế tạo đường thẳng" +msgstr "Các tay cầm tự động kiến tạo thành những đường thẳng" msgid "Automatic handles that create smooth curves" -msgstr "Tay cầm tự động cho chế tạo đường cong mịn" +msgstr "Các tay cầm tự động kiến tạo thành đường cong mượt mà" msgid "Auto Clamped" -msgstr "Tự Động Kẹp Lại" +msgstr "Tự Động Hạn Định" msgid "Automatic handles that create smooth curves which only change direction at keyframes" -msgstr "Tay cầm tự động cho chế tạo đường cong mịn mà chỉ đổi hướng tại bức ảnh mẫu" +msgstr "Các tay cầm tự động kiến tạo đường cong mượt mà, tức cái chỉ đổi chiều tại các khung khóa" msgid "Right Handle" -msgstr "Tay Cẩm Phải" +msgstr "Tay Cầm Bên Phải" msgid "Coordinates of the right handle (after the control point)" -msgstr "Tọa độ của tay cầm phải (sau điểm kiểm soát)" +msgstr "Tọa độ của tay cầm bên phải (sau điểm điều khiển)" msgid "Right Handle Type" -msgstr "Loại Tay Cầm Phải" +msgstr "Kiểu Tay Cầm Bên Phải" msgctxt "Action" @@ -30455,16 +32946,16 @@ msgstr "Nội Suy" msgid "Interpolation method to use for segment of the F-Curve from this Keyframe until the next Keyframe" -msgstr "Dùng phương pháp suy nội cho khúc của Cong-F từ Bức Ảnh Mẫu này đến Bức Ảnh Mẫu tiếp" +msgstr "Phương pháp nội suy sử dụng cho phân đoạn của Đường Cong-F từ Khung Khóa này đến cái tiếp tới" msgctxt "Action" msgid "Constant" -msgstr "Bất Biến" +msgstr "Hằng Số/Đồng Đều/Bất Biến" msgid "No interpolation, value of A gets held until B is encountered" -msgstr "Không suy nội, giữ giá trị của A đến gặp B" +msgstr "Không nội suy, giữ nguyên giá trị của A cho đến khi gặp B" msgctxt "Action" @@ -30473,7 +32964,7 @@ msgstr "Tuyến Tính" msgid "Straight-line interpolation between A and B (i.e. no ease in/out)" -msgstr "Suy nội bậc một giữa A đến B (ví dụ không xoa dịu vào/ra)" +msgstr "Nội suy theo đường thẳng giữa A đến B (tức là không chậm rãi vào/ra)" msgctxt "Action" @@ -30482,7 +32973,7 @@ msgstr "Bezier" msgid "Smooth interpolation between A and B, with some control over curve shape" -msgstr "Suy nội mịn giữa A và B, cho được kiển sóat hình dạng đường cong một chút" +msgstr "Nội suy mịn màng giữa A và B, với đôi chút chủ động về hình dạng của đường cong" msgctxt "Action" @@ -30491,25 +32982,25 @@ msgstr "Sin" msgid "Sinusoidal easing (weakest, almost linear but with a slight curvature)" -msgstr "Xoa dịu sin (yếu nhất, gần bằng bậc một mà có một chút độ cong)" +msgstr "Chậm rãi theo hình Sin (yếu nhất, gần như tuyến tính song cong một chút)" msgctxt "Action" msgid "Quadratic" -msgstr "Bậc Hai" +msgstr "Bình Phương" msgid "Quadratic easing" -msgstr "Xoa dịu bậc hai" +msgstr "Chậm rãi bậc hai" msgctxt "Action" msgid "Cubic" -msgstr "Bậc Ba" +msgstr "Lập Phương/Bậc Ba" msgid "Cubic easing" -msgstr "Xoa dịu bậc ba" +msgstr "Chậm rãi lập phương" msgctxt "Action" @@ -30518,7 +33009,7 @@ msgstr "Bậc Bốn" msgid "Quartic easing" -msgstr "Xoa dịu bậc bốn" +msgstr "Chậm rãi bậc bốn" msgctxt "Action" @@ -30527,7 +33018,7 @@ msgstr "Bậc Năm" msgid "Quintic easing" -msgstr "Xoa dịu bậc năm" +msgstr "Chậm rãi bậc năm" msgctxt "Action" @@ -30536,38 +33027,38 @@ msgstr "Lũy Thừa" msgid "Exponential easing (dramatic)" -msgstr "Xoa dịu lũy thừa (lẹ lắm)" +msgstr "Chậm rãi mức lũy thừa (đột ngột)" msgctxt "Action" msgid "Circular" -msgstr "Vòng Tròn" +msgstr "Vòng Tròn/Tuần Hoàn" msgid "Circular easing (strongest and most dynamic)" -msgstr "Xoa dịu vòng tròn (mạnh nhất và lẹ nhất)" +msgstr "Chậm rãi vòng tròn (mạnh nhất và năng động nhất)" msgid "Cubic easing with overshoot and settle" -msgstr "Xoa dịu lập phương mà chạy huốt và trở lại" +msgstr "Chậm rãi lập phương với sự cường điệu hóa và ổn định lại" msgctxt "Action" msgid "Bounce" -msgstr "Nhồi" +msgstr "Bật Nẩy" msgid "Exponentially decaying parabolic bounce, like when objects collide" -msgstr "Nhồi kiẻu bậc hai giảm kiểu lũy thừa, giống như hai vật thể va chạm" +msgstr "Suy giảm bật nẩy hình pa-ra-bôn mức lũy thừa, giống như khi các đối tượng va đập nhau" msgctxt "Action" msgid "Elastic" -msgstr "Dẻo Giãn" +msgstr "Đàn Hồi" msgid "Exponentially decaying sine wave, like an elastic band" -msgstr "Sóng sin giảm kiểu lũy thừa, như cong dây cau su dẻo giãn" +msgstr "Suy giảm hình sóng sin mức lũy thừa, như một dây cao xu" msgid "Period" @@ -30575,47 +33066,47 @@ msgstr "Chu Kỳ" msgid "Time between bounces for elastic easing" -msgstr "Thời gian giữa lần nhồi cho xoa dịu dẻo" +msgstr "Thời gian giữa các lần bật nẩy để làm chậm rãi sự đàn hồi lại" msgid "Left handle selection status" -msgstr "Trạng thái lựa chọn của tay cầm trái" +msgstr "Trạng thái lựa chọn của tay cầm bên trái" msgid "Right handle selection status" -msgstr "Trạng thái lựa chọn của tay cầm phải" +msgstr "Trạng thái lựa chọn của tay cầm bên phải" msgid "Type of keyframe (for visual purposes only)" -msgstr "Loại bức ảnh mẫu (chỉ cho nhìn xem)" +msgstr "Loại khung khóa (chỉ để thể hiện mà thôi)" msgid "An \"extreme\" pose, or some other purpose as needed" -msgstr "Một dạng đứng \"cực kỳ\", hay cho cộng việc khác theo sự cần thiết" +msgstr "Một tư thế \"cường điệu\" (extreme), hoặc vì mục đích nào đó, tùy theo nhu cầu" msgid "Keying Set" -msgstr "Tập Bức Ảnh Mẫu" +msgstr "Bộ Khóa" msgid "Settings that should be keyframed together" -msgstr "Các cài đặt nên làm bức ảnh mẫu cùng nhau" +msgstr "Các sắp đặt cần được khung khóa hóa cùng với nhau" msgid "A short description of the keying set" -msgstr "Một mô tả ngắn cho tập bức ảnh mẫu" +msgstr "Lược tả của Bộ Khóa" msgid "If this is set, the Keying Set gets a custom ID, otherwise it takes the name of the class used to define the Keying Set (for example, if the class name is \"BUILTIN_KSI_location\", and bl_idname is not set by the script, then bl_idname = \"BUILTIN_KSI_location\")" -msgstr "Nếu này được đặt, Tập Bức Ảnh Mẫu sẽ được một tên tùy chọn, nếu không nó sẽ được đặt tên của lớp được dùng để xác định Tập Hợp Bức Ảnh Mẫu (ví dụ, nếu tên của lớp là \"BUILTIN_KSI_vịTrí\", và bl_idname chưa được đặt bằng văn thảo, tên được đặt bl_idname = \"BUILTIN_KSI_vịTrí\"))" +msgstr "Nếu đặt cái này, Bộ Khóa sẽ được gắn một ID tùy chỉnh, nếu không, nó sẽ lấy tên của lớp vốn dùng để xác định bộ Khóa (chẳng hạn, nếu tên lớp là \"BUILTIN_KSI_location\", và bl_idname chưa được xác định trong tập lệnh, thì bl_idname = \"BUILTIN_KSI_location\")" msgid "UI Name" -msgstr "Tên Giao Viện" +msgstr "Tên UI" msgid "Keying Set defines specific paths/settings to be keyframed (i.e. is not reliant on context info)" -msgstr "Tập Hợp Bức Ảnh Mẫu được chỉ định đường dẫn/cài đặt nhất định để làm bức ảnh mẫu (tức là không nhờ thông tin bối cảnh)" +msgstr "Bộ Khóa xác định đường dẫn/sắp đặt sẽ được khóa hóa (tức là không nhờ vào thông tin ngữ cảnh)" msgid "Paths" @@ -30623,7 +33114,7 @@ msgstr "Đường Dẫn" msgid "Keying Set Paths to define settings that get keyframed together" -msgstr "Đường Dẫn Tập Hợp Bức Ảnh Mẫu cho chỉ định cài đặt được làm bức ảnh cùng hhau" +msgstr "Các Đường Dẫn Bộ Khóa nhằm xác định các sắp đặt sẽ được khóa hóa cùng với nhau" msgid "Type Info" @@ -30631,211 +33122,211 @@ msgstr "Thông Tin Loại" msgid "Callback function defines for built-in Keying Sets" -msgstr "Hàm số gọi lại được chỉ định cho Tập Hợp Bức Ảnh Mẫu nội bộ" +msgstr "Hàm Callback được xác định cho những Bộ Khóa tích hợp" msgid "Insert Keyframes - Only Needed" -msgstr "Chèn Bức Ảnh Mẫu - Chĩ Khi Cần" +msgstr "Chèn Thêm Khung Khóa - Chỉ Khi Cần Thiết" msgid "Only insert keyframes where they're needed in the relevant F-Curves" -msgstr "Chỉ chèn bức ảnh mẫu tại chỗ cần trong Cong-F thích đáng" +msgstr "Chỉ cộng thêm khung khóa tại những chỗ cần trong những Đường Cong-F thích hợp" msgid "Override Insert Keyframes Default- Only Needed" -msgstr "Vượt Quyền Mặc Định Chèn Bức Ảnh Mẫu- Chỉ Khi Cần" +msgstr "Bỏ Qua Mặc Định Chèn Thêm Khung Khóa - Chỉ Làm Khi Cần Thiết" msgid "Override default setting to only insert keyframes where they're needed in the relevant F-Curves" -msgstr "Vượt quyền cài đặt mặc định cho chỉ chèn bức ảnh mẫu tại chỗ cần trong Cong-F thích đáng" +msgstr "Bỏ qua sắp đặt mặc định để chỉ chèn khung khóa ở những chỗ cần thiết trong các Đường Cong-F thích hợp mà thôi" msgid "Override Insert Keyframes Default - Visual" -msgstr "Thay Mặc Định Chèn Bức Ảnh Mẫu - Thị Giác" +msgstr "Bỏ Qua Mặc Định Chèn Thêm Khung Khóa - Trực Quan" msgid "Override default setting to insert keyframes based on 'visual transforms'" -msgstr "Vượt quyền cài đặt mặc định cho chèn bức ảnh mẫu tùy 'biến hóa thị giác'" +msgstr "Bỏ qua sắp đặt mặc định để chỉ chèn thêm khung khóa dựa vào 'biến hóa trực quan'" msgid "Insert Keyframes - Visual" -msgstr "Chèn Bức Ảnh Mẫu - Thị Giác" +msgstr "Chèn Thêm Khung Khóa - Trực Quan" msgid "Insert keyframes based on 'visual transforms'" -msgstr "Chèn bức ảnh mẫu tùy 'biến hóa hiển thị'" +msgstr "Chèn thêm các khung khóa dựa trên 'biến hóa trực quan'" msgid "Insert a keyframe on each of the already existing F-Curves" -msgstr "Chèn một bức ảnh mẫu vào mỗi Cong-F đang tồn tại" +msgstr "Chèn thêm một khung khóa vào mỗi Đường Cong-F đang tồn tại" msgid "Available" -msgstr "Có" +msgstr "Khả Dụng" msgid "Insert a keyframe for each of the BBone shape properties" -msgstr "Chèn một bức ảnh mẫu cho mỗi đặc tính hình dạng của Xương-B" +msgstr "Chèn thêm một khung khóa cho mỗi tính chất của hình dạng Xương-Dẻo" msgid "BBone Shape" -msgstr "Hình Dạng Xương-B" +msgstr "Hình Dạng Xương-Dẻo" msgid "Insert keyframes for additional location offset" -msgstr "Chèn bức ảnh mẫu cho dịch vị trí thêm" +msgstr "Chèn thêm khung khóa cho những dịch chuyển thêm về vị trí" msgid "Insert keyframes for additional rotation offset" -msgstr "Chèn bức ảnh mẫu cho dịch xoay thêm" +msgstr "Chèn thêm khung khóa cho những biến đổi về xoay chiều" msgid "Delta Rotation" -msgstr "Xoay Lệch Lạc" +msgstr "Xoay Chiều Delta" msgid "Insert keyframes for additional scale factor" -msgstr "Chèn bức ảnh mẫu cho hệ số phóng to thêm" +msgstr "Chèn thêm khung khóa cho hệ số tỷ lệ thêm" msgid "Insert a keyframe on each of the location and rotation channels" -msgstr "Chèn một bức ảnh mẫu trong mỗi kênh vị trí va xoay" +msgstr "Chèn thêm một khung khóa vào các kênh vị trí và các kênh xoay chiều" msgid "Location & Rotation" -msgstr "Vị Trí & Xoay" +msgstr "Vị Trí & Xoay Chiều" msgid "Insert a keyframe on each of the location and scale channels" -msgstr "Chèn một bức ảnh mẫu trong mỗi kênh vị trí và phóng to" +msgstr "Chèn thêm một khung khóa vào các kênh vị trí và kênh tỷ lệ" msgid "Location & Scale" -msgstr "Vị Trí & Phóng To" +msgstr "Vị Trí & Tỷ Lệ" msgid "Insert a keyframe on each of the rotation and scale channels" -msgstr "Chèn một bức ảnh mẫu trong mỗi kênh xoay và phóng to" +msgstr "Cộng thêm một khung khóa vào các kênh xoay chiều và kênh tỷ lệ" msgid "Rotation & Scale" -msgstr "Xoay & Phóng To" +msgstr "Xoay Chiều & Tỷ Lệ" msgid "Insert a keyframe on each of the location channels, taking into account effects of constraints and relationships" -msgstr "Chèn một bức ảnh mẫu trong mỗi kênh vị trí, gồm hiệu ứng của các ràng buộc và liên hệ" +msgstr "Chèn thêm một khung khóa vào mỗi kênh vị trí, tính toán đến cả các hiệu ứng của các ràng buộc và các mối quan hệ nữa" msgid "Visual Location" -msgstr "Vị Trí Thị Giác" +msgstr "Vị Trí Trực Quan" msgid "Insert a keyframe on each of the location and rotation channels, taking into account effects of constraints and relationships" -msgstr "Chèn một bức ảnh mẫu trong mỗi kênh vị trí và xoay, gồm hiệu ứng của các ràng buộc và liên hệ" +msgstr "Chèn thêm một khung khóa vào mỗi kênh vị trí và xoay chiều, tính toán đến cả các hiệu ứng của các ràng buộc và các mối quan hệ nữa" msgid "Visual Location & Rotation" -msgstr "Hiển Thị Vị Trí & Xoay" +msgstr "Vị Trí & Xoay Chiều Trực Quan" msgid "Insert a keyframe on each of the location, rotation and scale channels, taking into account effects of constraints and relationships" -msgstr "Chèn một bức ảnh mẫu trong mỗi kênh vị trí, xoay và phóng to, gồm những hiệu ứng của các ràng buộc và liên hệ" +msgstr "Chèn thêm một khung khóa vào mỗi kênh vị trí, xoay chiều, và tỷ lệ, lưu tâm đến các hiệu ứng của các ràng buộc và các mối quan hệ nữa" msgid "Visual Location, Rotation & Scale" -msgstr "Hiển Thị Vị Trí, Xoay & Phóng To" +msgstr "Vị Trí, Xoay Chiều & Tỷ Lệ Trực Quan" msgid "Insert a keyframe on each of the location and scale channels, taking into account effects of constraints and relationships" -msgstr "Chèn một bức ảnh mẫu trong mỗi kênh vị trí và phóng to, gồm những hiệu ứng của các ràng buộc và liên hệ" +msgstr "Chèn thêm một khung khóa vào mỗi kênh vị trí và tỷ lệ, lưu tâm đến hiệu ứng của các ràng buộc và các mối quan hệ nữa" msgid "Visual Location & Scale" -msgstr "Hiển Thị Vị Trí & Phóng To" +msgstr "Vị Trí & Tỷ Lệ Trực Quan" msgid "Insert a keyframe on each of the rotation channels, taking into account effects of constraints and relationships" -msgstr "Chèn một bức ảnh mẫu trong mỗi kênh xoay, gồm hiệu ứng của các ràng buộc và liên hệ" +msgstr "Chèn thêm một khung khóa vào mỗi kênh xoay chiều, tính toán đến cả hiệu ứng của các ràng buộc và các mối quan hệ nữa" msgid "Visual Rotation" -msgstr "Xoay Thị Giác" +msgstr "Xoay Chiều Trực Quan" msgid "Insert a keyframe on each of the rotation and scale channels, taking into account effects of constraints and relationships" -msgstr "Chèn một bức ảnh mẫu trong mỗi kênh xoay và phóng to, gồm hiệu ứng của các ràng buộc và liên hệ" +msgstr "Chèn thêm một khung khóa vào mỗi kênh xoay chiều và tỷ lệ, lưu tâm đến các hiệu ứng của các ràng buộc và các mối quan hệ nữa" msgid "Visual Rotation & Scale" -msgstr "Hiển Thị Xoay & Phóng To" +msgstr "Xoay Chiều & Tỷ Lệ Trực Quan" msgid "Insert a keyframe on each of the scale channels, taking into account effects of constraints and relationships" -msgstr "Chèn một bức ảnh mẫu trong mỗi kênh phóng to, gồm hiệu ứng của các ràng buộc và liên hệ" +msgstr "Chèn thêm một khung khóa vào mỗi kênh tỷ lệ, lưu tâm đến hiệu ứng của các ràng buộc và các mối quan hệ nữa" msgid "Visual Scale" -msgstr "Hiển Thị Phóng To" +msgstr "Tỷ Lệ Trực Quan" msgid "Insert a keyframe on each of the location, rotation, and scale channels" -msgstr "Chèn một bức ảnh mẫu trong mỗi kênh vị trí, xoay, và phóng to" +msgstr "Chèn thêm một khung khóa vào mỗi kênh vị trí, xoay chiều và tỷ lệ" msgid "Location, Rotation & Scale" -msgstr "Vị Trí, Xoay & Phóng To" +msgstr "Vị Trí, Xoay Chiều & Tỷ Lệ" msgid "Key location/rotation/scale as well as custom properties" -msgstr "Bức ảnh đặc tính vị trí, xoay, phóng to và tùy chọn" +msgstr "Bức đặc tính vị trí, xoay, phóng to và tùy chọn" msgid "Location, Rotation, Scale & Custom Properties" -msgstr "Đặc Tính Vị Trí, Xoay, Phóng To & Tùy Chọn" +msgstr "Vị Trí, Xoay Chiều, Tỷ Lệ & các Tính Chất Tùy Chọn" msgid "Insert a keyframe on each of the location channels" -msgstr "Chèn một bức ảnh mẫu trong mỗi kênh vị trí" +msgstr "Chèn thêm một khung khóa vào các kênh vị trí" msgid "Insert a keyframe on each of the rotation channels" -msgstr "Chèn một bức ảnh mẫu trong mỗi kênh xoay" +msgstr "Chèn thêm một khung khóa vào các kênh xoay chiều" msgid "Insert a keyframe on each of the scale channels" -msgstr "Chèn một bức ảnh mẫu trong mỗi kênh phóng to" +msgstr "Chèn thêm một khung khóa vào các kênh tỷ lệ" msgid "Insert a keyframe for all properties that are likely to get animated in a character rig (useful when blocking out a shot)" -msgstr "Chèn một bức ảnh mẫu cho hết đặc tính ưa được dụng khi làm hoạt hình trong cho một giàn nhân vật (tốt cho khilàm mô hình quay phim)" +msgstr "Chèn thêm một khung khóa cho toàn bộ toàn bộ các tính chất có thể được hoạt họa trong bộ giàn xây dựng nhân vật (có lợi khi dàn dựng một cú máy)" msgid "Whole Character" -msgstr "Toàn Nhân Vật" +msgstr "Toàn Bộ Nhân Vật" msgid "Insert a keyframe for all properties that are likely to get animated in a character rig (only selected bones)" -msgstr "Chèn một bức ảnh mẫu cho hết đặc tính ưa được dùng khi làm hoạt hình cho một giàn nhân vật (chỉ cho xương được chọn)" +msgstr "Chèn thêm một khung khóa cho toàn bộ toàn bộ các tính chất có thể được hoạt họa trong bộ giàn xây dựng nhân vật (duy cho các xương đã chọn)" msgid "Whole Character (Selected Bones Only)" -msgstr "Toàn Nhân Vật (Chỉ Xương Được Chọn) " +msgstr "Toàn Bộ Nhân Vật (Duy Xương đã Chọn)" msgid "Keying Set Path" -msgstr "Đường Dẫn Tập Bức Ảnh Mẫu" +msgstr "Đường Dẫn của Bộ Khóa" msgid "Path to a setting for use in a Keying Set" -msgstr "Đường dẫn cho một cài đặt để dùng làm một Tập Bức Ảnh Mẫu" +msgstr "Đường dẫn tới một sắp đặt dùng trong một Bộ Khóa" msgid "Index to the specific setting if applicable" -msgstr "Chỉ số đến cài đặt xác định nếu có" +msgstr "Chỉ số cho sắp đặt cụ thể, nếu có" msgid "Path to property setting" -msgstr "Đường dẫn đến giá trị cài đặt" +msgstr "Đường dẫn đến sắp đặt của tính chất" msgid "Group Name" @@ -30843,103 +33334,103 @@ msgstr "Tên Nhóm" msgid "Name of Action Group to assign setting(s) for this path to" -msgstr "Tên nhóm hành động để chỉ định cài đặt cho đường dẫn này" +msgstr "Tên của Nhóm Hành Động mà (các) sắp đặt cho đường dẫn này sẽ được ấn định vào" msgid "Grouping Method" -msgstr "Phương Phám Nhóm Lại" +msgstr "Phương Pháp Nhóm Lại" msgid "Method used to define which Group-name to use" -msgstr "Phương pháp để chỉ định dùng tên Nhóm nào" +msgstr "Phương pháp dùng để xác định Tên Nhóm nào sẽ sử dụng" msgid "Named Group" -msgstr "Nhóm Có Tên" +msgstr "Nhóm có Tên" msgid "Keying Set Name" -msgstr "Tên Tập Bức Ảnh Mẫu" +msgstr "Tên Bộ Khóa" msgid "ID-Block" -msgstr "Tên Cục" +msgstr "Khối-ID" msgid "ID-Block that keyframes for Keying Set should be added to (for Absolute Keying Sets only)" -msgstr "Tên của cục nào nên kèm một Tập Bức Ảnh Mẫu (chỉ cho Tập Bức Ảnh Mẫu Tuyệt Đối)" +msgstr "Khối ID mà các khung khóa của bộ hình mẫu cần phải kèm vào (duy cho các Bộ Khóa Tuyệt Đối mà thôi)" msgid "Entire Array" -msgstr "Toàn Mảng" +msgstr "Toàn Bộ Mảng" msgid "When an 'array/vector' type is chosen (Location, Rotation, Color, etc.), entire array is to be used" -msgstr "Khi chọn loại 'mảng/vectơ (Vị Trí, Xoay, Màu, v.v.), được dùng toàn bộ mảng" +msgstr "Khi một thể loại 'mảng/vectơ' được chọn (Vị Trí, Xoay Chiều, Màu Sắc, v.v.), thì toàn bộ mảng sẽ được sử dụng" msgid "Keying set paths" -msgstr "Đường dẫn tập bức ảnh mẫu" +msgstr "Đường dẫn của Bộ Khóa" msgid "Collection of keying set paths" -msgstr "Sưu tập của tập đường dẫn bức ảnh mẫu" +msgstr "Bộ sưu tập những đường dẫn của Bộ Khóa" msgid "Active Keying Set" -msgstr "Sưu Tập Mẫu Dạng Hoạt Động" +msgstr "Bộ Khóa đang Hoạt Động" msgid "Active Keying Set used to insert/delete keyframes" -msgstr "Tập Hợp Bức Ảnh Mẫu Hoạt Động dùng để chèn/xóa bức ảnh mẫu" +msgstr "Bộ Khóa đang Hoạt Động dùng để cộng thêm/xóa các khung khóa" msgid "Active Path Index" -msgstr "Chỉ Số Đường Dẫn Hoạt Động" +msgstr "Chỉ Số Đường Dẫn đang Hoạt Động" msgid "Current Keying Set index" -msgstr "Chỉ số Tập Hợp Bức Ảnh Mẫu Hiện Tại" +msgstr "Chỉ số của Bộ Khóa hiện tại" msgid "Keying Sets" -msgstr "Tập Hợp Bức Ảnh Mẫu" +msgstr "Bộ Khóa" msgid "Scene keying sets" -msgstr "Tập hợp bức ảnh mẫu cảnh" +msgstr "Tập hợp các Bộ Khóa trong cảnh" msgid "Active Keying Set Index" -msgstr "Chỉ Số Sưu Tập Hợp Bức Ảnh Mẫu Hoạt Động" +msgstr "Chỉ Số của Bộ Khóa đang Hoạt Động" msgid "Current Keying Set index (negative for 'builtin' and positive for 'absolute')" -msgstr "Chỉ số Sưu Tập Bức Ảnh Mẫu hiện tại (số âm cho 'đặt sẵn' và số dương cho 'tuyệt đối')" +msgstr "Chỉ số của Bộ Khóa hiện tại (số âm là 'gắn sẵn' và số dương là 'tuyệt đối')" msgid "Keying Sets All" -msgstr "Hết Sưu Tập Bức Ảnh Mẫu" +msgstr "Toàn Bộ các Bộ Khóa" msgid "All available keying sets" -msgstr "Tất cả tập hợp bức ảnh mẫu có thể dùng" +msgstr "Toàn bộ các Bộ Khóa có thể sử dụng" msgid "Point in the lattice grid" -msgstr "Điểm trong đồ thị lưới rào" +msgstr "Điểm tọa độ trên giàn lưới rào" msgid "Original undeformed location used to calculate the strength of the deform effect (edit/animate the Deformed Location instead)" -msgstr "Sử dụng vị trí không được méo hóa ban đầu để tính sức lực của hiệu ứng méo hóa (biên tập/hoạt hình Vị Trí Méo Hóa thay thế)" +msgstr "Vị trí ban đầu, chưa bị biến dạng, dùng để tính toán cường độ của hiệu ứng (biên soạn/hoạt họa Vị Trí Bóp Mép thay vì)" msgid "Deformed Location" -msgstr "Vị Trí Được Méo Hóa" +msgstr "Vị Trí Biến Dạng" msgid "Weights for the vertex groups this point is member of" -msgstr "Quyền lượng của nhóm đỉnh thì điểm này là nhân viên" +msgstr "Trọng lượng của các nhóm điểm đỉnh mà điểm này là một thành viên trong đó" msgid "Point selected" @@ -30947,75 +33438,83 @@ msgstr "Điểm được chọn" msgid "Layer Collection" -msgstr "Sưu Tập Lớp" +msgstr "Bộ Sưu Tập Tầng Lớp" msgid "Layer collection" -msgstr "Sưu tập lớp" +msgstr "Bộ sưu tập tầng lớp" + + +msgid "Layer collection children" +msgstr "Con cái của bộ sưu tập tầng lớp" msgid "Collection this layer collection is wrapping" -msgstr "Sưu tập lớp sưu tập này đang gói" +msgstr "Bộ sưu tập bao bọc bộ sưu tập tầng lớp này" msgid "Exclude from View Layer" -msgstr "Trừ loại từ Lớp Hiển Thị" +msgstr "Ngoại Trừ khỏi Tầng Góc Nhìn" msgid "Exclude from view layer" -msgstr "Trừ loại từ lớp hiển thị" +msgstr "Ngoại trừ khỏi Tầng Góc Nhìn" msgid "Hide in Viewport" -msgstr "Ẩn trong Màn Chiếu" +msgstr "Ẩn Giấu trong Cổng Nhìn" msgid "Temporarily hide in viewport" -msgstr "Tạm thời ẩn trong màn chiếu" +msgstr "Tạm thời ẩn giấu trong cổng nhìn" msgid "Mask out objects in collection from view layer" -msgstr "Lọc ra các vật thể trong sưu tập từ lớp hiển thị" +msgstr "Chắn lọc các đối tượng trong bộ sưu tập ra khỏi Tầng Góc Nhìn" msgid "Indirect Only" -msgstr "Chỉ Gián Tiếp" +msgstr "Duy Gián Tiếp" msgid "Objects in collection only contribute indirectly (through shadows and reflections) in the view layer" -msgstr "Vật thể trong sưu tập chỉ góp gián tiếp (bằng bóng tối và phản xạ ánh sáng)" +msgstr "Các đối tượng trong bộ sưu tập chỉ đóng góp gián tiếp (thông qua bóng tối và sự phản quang) trong Tầng Góc Nhìn" msgid "Whether this collection is visible for the view layer, take into account the collection parent" -msgstr "Sưu tập này đang hiển thị hay không cho lớp màn này, quan tâm đến phụ huynh của sưu tập" +msgstr "Bộ sưu tập này có nhìn thấy được trong tầng góc nhìn hay không, có cân nhắc đến phụ huynh của bộ sưu tập nữa" + + +msgid "Name of this layer collection (same as its collection one)" +msgstr "Tên của bộ sưu tập tầng lớp này (giống cái dùng cho bộ sưu tập của nó)" msgid "Layer Objects" -msgstr "Vật Thể Lớp" +msgstr "Các Đối Tượng của Tầng Lớp" msgid "Collections of objects" -msgstr "Các sưu tập vật thể" +msgstr "Bộ sưu tập của các đối tượng" msgid "Active Object" -msgstr "Vật Thể Hoạt Động" +msgstr "Đối Tượng đang Hoạt Động" msgid "Active object for this layer" -msgstr "Vật thể hoạt động cho lớp này" +msgstr "Đối tượng đang hoạt động của tầng lớp này" msgid "Selected Objects" -msgstr "Vật Thể Được Chọn" +msgstr "Đối Tượng được Chọn" msgid "All the selected objects of this layer" -msgstr "Tất cả vật thể được chọn trong lớp này" +msgstr "Toàn bộ các đối tượng được chọn của tầng lớp này" msgid "Read-only external reference to a linked data-block and its library file" -msgstr "Tham chiếu ngoài chỉ được nhập có liên kết với một cục dữ liệu và tập tin thư viện của nó" +msgstr "Tham chiếu duy đọc (read-only) bên ngoài tới một khối dữ liệu liên kết và tập tin thư viện của nó" msgid "ID name" @@ -31023,51 +33522,51 @@ msgstr "Tên ID" msgid "Full ID name in the library .blend file (including the two leading 'id type' chars)" -msgstr "Toàn tên ID trong tập tin .blend thư viện (gồm hai ký tự 'loại id' đầu)" +msgstr "Tên ID đầy đủ trong tập tin thư viện .blend (bao gồm cả hai ký tự 'kiểu ID' dẫn đầu)" msgid "Light Group" -msgstr "Nhóm Đèn" +msgstr "Nhóm Ánh Sáng" msgid "Name of the Lightgroup" -msgstr "Tên của NhómĐen" +msgstr "Tên của Nhóm Ánh Sáng" msgid "List of Lightgroups" -msgstr "Danh sách NhómĐen" +msgstr "Danh sách của các Nhóm Ánh Sáng" msgid "Collection of Lightgroups" -msgstr "Sưu Tập NhómĐen" +msgstr "Bộ Sưu Tập của các Nhóm Ánh Sáng" msgid "Alpha modifiers for changing line alphas" -msgstr "Bộ điều chỉnh độ đục cho đổi độ đục nét" +msgstr "Bộ điều chỉnh alpha để thay đổi alpha của đường nét" msgid "Color modifiers for changing line colors" -msgstr "Bộ điều chỉnh màu cho đổi màu nét" +msgstr "Bộ điều chỉnh màu để thay đổi màu nét" msgid "Geometry modifiers for changing line geometries" -msgstr "Bộ điều chỉnh hình dạng cho đổi hình dạng nét" +msgstr "Bộ điều chỉnh hình dạng để thay đổi hình dạng của đường nét" msgid "Line Style Modifier" -msgstr "Bộ điều chỉnh Phong Cách Nét" +msgstr "Bộ Điều Chỉnh Phong Cách Nét" msgid "Base type to define modifiers" -msgstr "Loại cơ sở cho chỉ định bộ điều chỉnh" +msgstr "Loại cơ sở để xác định các bộ điều chỉnh" msgid "Line Style Alpha Modifier" -msgstr "Bộ Điều Chỉnh Độ Đục Phong Cách Nét" +msgstr "Bộ Điều Chỉnh Alpha Phong Cách Nét" msgid "Base type to define alpha transparency modifiers" -msgstr "Loại cơ sở cho chỉ định bộ điều chỉnh độ đục" +msgstr "Loại cơ sở để xác định các bộ điều chỉnh độ trong suốt của alpha" msgid "Modifier Name" @@ -31079,31 +33578,31 @@ msgstr "Tên của bộ điều chỉnh" msgid "Along Stroke" -msgstr "Theo Nét" +msgstr "Dọc theo Nét Vẽ" msgid "Change alpha transparency along stroke" -msgstr "Đổi độ đục theo nét" +msgstr "Đổi độ trong suốt của alpha dọc theo nét vẽ" msgid "Specify how the modifier value is blended into the base value" -msgstr "Xác định làm sao pha trộn giá trị bộ điều chỉnh với giá trị cơ sở" +msgstr "Xác định phương pháp pha trộn giá trị của bộ điều chỉnh với giá trị cơ sở" msgid "Curve used for the curve mapping" -msgstr "Đường cong được dùng cho ánh xạ đường cong" +msgstr "Đường cong dùng để ánh xạ đường cong" msgid "True if the modifier tab is expanded" -msgstr "Đúng nếu nhãn hiệu của bộ điều chỉnh được mở rộng" +msgstr "Giá trị 'Đúng' nếu thẻ bộ điều chỉnh được mở rộng" msgid "Influence factor by which the modifier changes the property" -msgstr "Hệ số ảnh hưởng cho bộ điều chỉnh được đổi giá trị của đặc tính" +msgstr "Hệ số ảnh hưởng làm thay đổi tính chất của bộ điều chỉnh" msgid "Invert the fade-out direction of the linear mapping" -msgstr "Đảo nghịch hướng phai của ánh xạ bậc một" +msgstr "Đảo nghịch hướng mờ dần của ánh xạ tuyến tính" msgid "Select the mapping type" @@ -31111,7 +33610,7 @@ msgstr "Chọn loại ánh xạ" msgid "Use linear mapping" -msgstr "Dùng ánh xạ bậc một" +msgstr "Dùng ánh xạ tuyến tính" msgid "Use curve mapping" @@ -31119,11 +33618,11 @@ msgstr "Dùng ánh xạ đường cong" msgid "Modifier Type" -msgstr "Loại Bộ Điều Chỉnh" +msgstr "Thể Loại Bộ Điều Chỉnh" msgid "Type of the modifier" -msgstr "Loại của bộ điều chỉnh" +msgstr "Thể loại của bộ điều chỉnh" msgid "Curvature 3D" @@ -31131,227 +33630,227 @@ msgstr "Độ Cong 3D" msgid "Distance from Object" -msgstr "Khoảng cách từ Vật Thể" +msgstr "Khoảng Cách Từ Đối Tượng" msgid "Enable or disable this modifier during stroke rendering" -msgstr "Bật hay tắt bộ điều chỉnh này khi kết xuất nét" +msgstr "Bật hay tắt bộ điều chỉnh này khi kết xuất đường nét" msgid "Alpha transparency based on the angle between two adjacent faces" -msgstr "Độ đục tùy góc giữa hai mặt kề nhau" +msgstr "Độ trong suốt của alpha dựa vào góc giữa hai mặt kề nhau" msgid "Max Angle" -msgstr "Góc Cực Đại" +msgstr "Góc Lớn Nhất" msgid "Maximum angle to modify thickness" -msgstr "Góc cực đại cho sửa đổi bề dài" +msgstr "Góc tối đa để sửa đổi độ dày" msgid "Min Angle" -msgstr "Góc Cực Tiểu" +msgstr "Góc Nhỏ Nhất" msgid "Minimum angle to modify thickness" -msgstr "Góc cực tiểu cho sửa đổi bề dài" +msgstr "Góc tối thiểu để sửa đổi độ dày" msgid "Alpha transparency based on the radial curvature of 3D mesh surfaces" -msgstr "Đặt độ đục tùy bán kính độ cong của bề mặt mạng lưới 3D" +msgstr "Độ trong Alpha dựa trên độ cong tỏa tròn của bề mặt khung lưới 3D" msgid "Max Curvature" -msgstr "Độ Cong Cực Đại" +msgstr "Độ Cong Tối Đa" msgid "Maximum Curvature" -msgstr "Độ Cong Cực Đại" +msgstr "Độ Cong Tối Đa" msgid "Min Curvature" -msgstr "Độ Cong Cực Tiểu" +msgstr "Độ Cong Tối Thiểu" msgid "Minimum Curvature" -msgstr "Độ Cong Cực Tiểu" +msgstr "Độ Cong Tối Thiểu" msgid "Change alpha transparency based on the distance from the camera" -msgstr "Đổi độ đục tùy khoảng cách từ máy quay phim" +msgstr "Đổi độ trong suốt của alpha tùy theo khoảng cách từ máy quay phim" msgid "Range Max" -msgstr "Cực Đại Phạm Vi" +msgstr "Tối Đa của Phạm Vi" msgid "Upper bound of the input range the mapping is applied" -msgstr "Giới hạn cao của phạm vi ngõ vào khi áp dụng ánh xạ" +msgstr "Giới hạn trên của phạm vi đầu vào khi áp dụng ánh xạ" msgid "Range Min" -msgstr "Cực Tiểu Phạm Vi" +msgstr "Tối Thiểu của Phạm Vi" msgid "Lower bound of the input range the mapping is applied" -msgstr "Giới hạn thấp của phạm vi ngõ vào khi áp dụng ánh xạ" +msgstr "Giới hạn dưới của phạm vi đầu vào khi áp dụng ánh xạ" msgid "Change alpha transparency based on the distance from an object" -msgstr "Đổi độ đục tùy khoảng cách từ một vật thể" +msgstr "Đối độ trong suốt của alpha tùy theo khoảng cách từ đối tượng" msgid "Target object from which the distance is measured" -msgstr "Đo khoảng cách từ vật thể mục tiêu nào" +msgstr "Đối tượng mục tiêu dùng để đo khoảng cách" msgid "Change alpha transparency based on a material attribute" -msgstr "Đổi độ đục tùy một đặc trưng vật liệu" +msgstr "Đổi độ trong suốt của alpha dựa vào một thuộc tính của nguyên vật liệu" msgid "Material Attribute" -msgstr "Đặc Trưng Vật Liệu" +msgstr "Thuộc Tính của Nguyên Vật Liệu" msgid "Specify which material attribute is used" -msgstr "Xác định dùng đặc trưng vật liệu nào" +msgstr "Xác định thuộc tính nào của nguyên vật liệu để sử dụng" msgid "Line Color Red" -msgstr "Màu Đỏ Nét" +msgstr "Kênh Đỏ của Đường Nét" msgid "Line Color Green" -msgstr "Màu Lục Nét" +msgstr "Kênh Lục của Đường Nét" msgid "Line Color Blue" -msgstr "Màu Xanh Nét" +msgstr "Kênh Lam của Đường Nét" msgid "Line Color Alpha" -msgstr "Độ Đục Màu Nét" +msgstr "Alpha của Màu Đường Nét" msgid "Diffuse Color Red" -msgstr "Màu Đỏ Tán Xạ" +msgstr "Kênh Đỏ của Màu Khuếch Tán" msgid "Diffuse Color Green" -msgstr "Màu Lục Tán Xạ" +msgstr "Kênh Lục của Màu Khuếch Tán" msgid "Diffuse Color Blue" -msgstr "Màu Xanh Tán Xạ" +msgstr "Kênh Lam của Màu Khuếch Tán" msgid "Specular Color Red" -msgstr "Màu Cao Quang Đỏ" +msgstr "Kênh Đỏ của Màu Lóng Lánh" msgid "Specular Color Green" -msgstr "Màu Lục Cao Quang" +msgstr "Kênh Lục của Màu Lóng Lánh" msgid "Specular Color Blue" -msgstr "Màu Xanh Cao Quang" +msgstr "Kênh Lam của Màu Lóng Lánh" msgid "Specular Hardness" -msgstr "Độ Rõ Cao Quang" +msgstr "Độ Sắc Nét của Lóng Lánh" msgid "Alpha transparency based on random noise" -msgstr "Độ đục tùy huyên náo ngẫu nhiên" +msgstr "Độ trong của alpha dựa vào nhiễu ngẫu nhiên" msgid "Amplitude of the noise" -msgstr "Biên độ của huyên náo" +msgstr "Biên độ nhiễu" msgid "Period of the noise" -msgstr "Chu kỳ của huyên náo" +msgstr "Chu kỳ nhiễu" msgid "Seed for the noise generation" -msgstr "Số hạt cho chế tạo huyên náo" +msgstr "Mầm để tạo nhiễu" msgid "Alpha transparency based on the direction of the stroke" -msgstr "Độ đục tùy hướng của nét" +msgstr "Độ trong suốt của alpha dựa vào định hướng của nét" msgid "Line Style Color Modifier" -msgstr "Bộ Điều Chỉnh Màu Phong Cách Nét" +msgstr "Bộ Điều Chỉnh Màu Sắc của Phong Cách Nét" msgid "Base type to define line color modifiers" -msgstr "Loại cơ sở cho xác định bộ điều chỉnh màu nét" +msgstr "Loại cơ sở để xác định bộ điều chỉnh màu nét" msgid "Change line color along stroke" -msgstr "Đổi màu net theo nét" +msgstr "Đổi màu dọc theo nét vẽ" msgid "Color ramp used to change line color" -msgstr "Dốc màu cho đổi màu nét" +msgstr "Dốc màu dùng để đổi màu nét" msgid "Change line color based on the underlying crease angle" -msgstr "Đổi màu nét tùy góc nhăn" +msgstr "Đổi màu nét dựa vào góc độ của nếp gấp cơ sở" msgid "Change line color based on the radial curvature of 3D mesh surfaces" -msgstr "Đổi màu nét tùy độ cong bán kính tuyến của mặt mạng lưới 3D" +msgstr "Đổi màu nét dựa vào độ cong tỏa tròn của các bề mặt khung lưới 3D" msgid "Change line color based on the distance from the camera" -msgstr "Đổi màu nét tùy khoảng cách từ máy quay phim" +msgstr "Đổi màu nét dựa vào khoảng cách từ máy quay phim" msgid "Change line color based on the distance from an object" -msgstr "Đổi màu nét tùy khoảg cách từ một vật thể" +msgstr "Đổi màu nét dựa vào khoảng cách từ một đối tượng" msgid "Change line color based on a material attribute" -msgstr "Đổi màu đường tùy đặc trưng của một vật liệu" +msgstr "Đổi màu nét dựa vào một thuộc tính của nguyên vật liệu" msgid "Use color ramp to map the BW average into an RGB color" -msgstr "Dùng dốc màu cho ánh xạ độ xám trung bình đến một màu RGB" +msgstr "Dùng dốc màu để ánh xạ gam Trắng Đen trung bình sang màu RGB" msgid "Change line color based on random noise" -msgstr "Đổi màu nét tùy huyên náo ngẫu nhiên" +msgstr "Đổi màu nét dựa vào nhiễu ngẫu nhiên" msgid "Change line color based on the direction of a stroke" -msgstr "Đổi màu nét tùy hướng của một nét" +msgstr "Đổi màu nét dựa vào định hướng của nét" msgid "Line Style Geometry Modifier" -msgstr "Bộ Điều Chỉnh Hình Dạng Phong Cách Nét" +msgstr "Bộ Điều Chỉnh Hình Dạng của Phong Cách Nét" msgid "Base type to define stroke geometry modifiers" -msgstr "Loại cơ sở cho xác định bộ điều chỉnh hình dạng nét" +msgstr "Loại cơ sở để xác định bộ điều chỉnh hình học của nét vẽ" msgid "2D Offset" -msgstr "Dịch 2D" +msgstr "Dịch Chuyển 2D" msgid "Add two-dimensional offsets to stroke backbone geometry" -msgstr "Cộng dịch 2D với hình dạng xương sống của nét" +msgstr "Thêm dịch chuyển 2D vào hình dạng xương sống của nét" msgid "Displacement that is applied from the end of the stroke" -msgstr "Dịch được áp dụng tại kết thúc của nét vẽ" +msgstr "Dịch chuyển được áp dụng tại đầu cuối của nét vẽ" msgid "Displacement that is applied from the beginning of the stroke" -msgstr "Dịch thì áp dụng tại bắt đầu của nét vẽ" +msgstr "Dịch chuyển được áp dụng tại đỉnh đầu của nét vẽ" msgid "2D Transform" @@ -31359,27 +33858,27 @@ msgstr "Biến Hóa 2D" msgid "Backbone Stretcher" -msgstr "Kéo Dài Xương Sống" +msgstr "Kéo Giãn Xương Lưng" msgid "Bezier Curve" -msgstr "Cong Bezier" +msgstr "Đường Cong Bezier" msgid "Blueprint" -msgstr "Sơ Đồ Xanh" +msgstr "Bản In Lam" msgid "Guiding Lines" -msgstr "Nét Hướng Dẫn" +msgstr "Nét Đánh Dấu" msgid "Perlin Noise 1D" -msgstr "Huyên Náo Perlin 1D" +msgstr "Nhiễu Perlin 1D" msgid "Perlin Noise 2D" -msgstr "Huyên Náo Perlin 2D" +msgstr "Nhiễu Perlin 2D" msgid "Polygonization" @@ -31387,7 +33886,7 @@ msgstr "Đa Giác Hóa" msgid "Sampling" -msgstr "Mẫu Vật" +msgstr "Lấy Mẫu Vật" msgid "Simplification" @@ -31395,27 +33894,27 @@ msgstr "Đơn Giản Hóa" msgid "Sinus Displacement" -msgstr "Dịch Sin" +msgstr "Thuyên Chuyển Hình Sin" msgid "Spatial Noise" -msgstr "Huyên Náo Không Gian" +msgstr "Nhiễu Không Gian" msgid "Tip Remover" -msgstr "Cắt Đỉnh" +msgstr "Bỏ Đầu Nét" msgid "Displacement that is applied to the X coordinates of stroke vertices" -msgstr "Dịch được áp dụng với tọa độ X của đỉnh nét" +msgstr "Dịch chuyển áp dụng tại tọa độ X các điểm đỉnh của nét vẽ" msgid "Displacement that is applied to the Y coordinates of stroke vertices" -msgstr "Dịch được áp dụng với tọa độ Y của đỉnh nét" +msgstr "Dịch chuyển áp dụng tại tọa độ Y các điểm đỉnh của nét vẽ" msgid "Apply two-dimensional scaling and rotation to stroke backbone geometry" -msgstr "Áp dụng phóng to và xoay 2D với hình dạng xương sống của nét" +msgstr "Áp dụng tỷ lệ và xoay chiều 2D vào hình thể của các nét viền khung" msgid "Rotation Angle" @@ -31427,7 +33926,7 @@ msgstr "Góc xoay" msgid "Pivot of scaling and rotation operations" -msgstr "Điểm tựa cúa thao tác phóng ta và xoay" +msgstr "Điểm tựa của các biến hóa tỷ lệ và xoay chiều" msgid "Stroke Center" @@ -31443,7 +33942,7 @@ msgstr "Cuối Nét" msgid "Stroke Point Parameter" -msgstr "Tham Số Điểm Nét" +msgstr "Điểm Tham Số cho Nét Vẽ" msgid "Absolute 2D Point" @@ -31451,7 +33950,7 @@ msgstr "Điểm 2D Tuyệt Đối" msgid "Pivot in terms of the stroke point parameter u (0 <= u <= 1)" -msgstr "Điểm tựa trong tựa độ u của nét vẽ (0 ≤ u ≤ 1)" +msgstr "Điểm tham số cho nét vẽ dùng làm điểm tựa u (0 ≤ u ≤ 1)" msgid "Pivot X" @@ -31471,43 +33970,43 @@ msgstr "Tọa độ Y 2D của điểm tựa tuyệt đối" msgid "Scaling factor that is applied along the X axis" -msgstr "Hệ số phóng to được áp dụng theo trục X" +msgstr "Hệ số tỷ lệ áp dụng dọc theo trục X" msgid "Scaling factor that is applied along the Y axis" -msgstr "Hế số phóng to được áp dụng theo trục Y" +msgstr "Hệ số tỷ lệ áp dụng dọc theo trục Y" msgid "Stretch the beginning and the end of stroke backbone" -msgstr "Kéo dài đầu và cuối của xương sống nét" +msgstr "Kéo giãn đầu và đuôi của nét khung cốt" msgid "Backbone Length" -msgstr "Độ Dài Xương Sống" +msgstr "Độ Dài Xương Lưng" msgid "Amount of backbone stretching" -msgstr "Mức kéo dài xương sống" +msgstr "Độ dài để kéo các nét khung cốt ra" msgid "Replace stroke backbone geometry by a Bezier curve approximation of the original backbone geometry" -msgstr "Thay thế hình dạng xương sống bằng một cong Bezier xấp xỉ hình dạng xương sống ban đầu" +msgstr "Thay thế hình dạng các nét khung cốt bằng một đường cong Bezier với hình dạng ước chừng hình thể của khung cốt gốc" msgid "Maximum distance allowed between the new Bezier curve and the original backbone geometry" -msgstr "Cho khoảng cách xa nhất giữa cong Bezier mới và hình dạng xương sộng ban đầu" +msgstr "Khoảng cách tối đa cho phép giữa đường cong Bezier mới và hình dạng khung cốt gốc" msgid "Produce a blueprint using circular, elliptic, and square contour strokes" -msgstr "Sản Xuất một sơ đồ bằng dùng nét đường đồng mức vòng tròn, elip, và vuông" +msgstr "Kiến tạo một bản in lam dùng các đường nét công-tua hình tròn, hình elíp, và hình vuông" msgid "Random Backbone" -msgstr "Xương Sống Ngẫu Nhiên" +msgstr "Khung Cốt Ngẫu Nhiên" msgid "Randomness of the backbone stretching" -msgstr "Độ ngẫu nhiên cho kéo dài xương sống" +msgstr "Mức ngẫu nhiên khi kéo dài khung cốt" msgid "Random Center" @@ -31515,23 +34014,23 @@ msgstr "Trung Tâm Ngẫu Nhiên" msgid "Randomness of the center" -msgstr "Độ ngẫu nhiên của trung tâm" +msgstr "Mức ngẫu nhiên của trung tâm" msgid "Random Radius" -msgstr "Bạn Kính Ngẫu Nhiên" +msgstr "Bán Kính Ngẫu Nhiên" msgid "Randomness of the radius" -msgstr "Độ ngẫu nhiên của bán kính" +msgstr "Mức ngẫu nhiên của bán kính" msgid "Number of rounds in contour strokes" -msgstr "Số lượng vòng trong nét đường đồng mức" +msgstr "Số lần lặp lại các nét công-tua" msgid "Select the shape of blueprint contour strokes" -msgstr "Chọn hình dạng của nét đường đồng mức cho vẽ sơ đồ" +msgstr "Chọn hình dạng của các nét công-tua cho bản in lam" msgid "Circles" @@ -31539,59 +34038,59 @@ msgstr "Vòng Tròn" msgid "Draw a blueprint using circular contour strokes" -msgstr "Vẽ sơ đồ bằng nét đường đồng mức tròn" +msgstr "Vẽ bản in lam dùng các nét công-tua hình tròn" msgid "Ellipses" -msgstr "Elip" +msgstr "Elíp" msgid "Draw a blueprint using elliptic contour strokes" -msgstr "Vẽ sơ đồ bằng nét đường đồng mức elip" +msgstr "Vẽ bản in lam dùng các nét công-tua hình elíp" msgid "Squares" -msgstr "Vuông" +msgstr "Vuông/Hình Vuông" msgid "Draw a blueprint using square contour strokes" -msgstr "Vẽ sơ đồ bằng nét đồng đồng mức vuông" +msgstr "Vẽ bản in lam dùng các nét công-tua hình vuông" msgid "Modify the stroke geometry so that it corresponds to its main direction line" -msgstr "Sửa đổi hình dạng nét vẽ cho nó theo đường hướng chánh" +msgstr "Sửa đổi hình học của nét vẽ để nó tương ứng với đường hướng chính" msgid "Displacement that is applied to the main direction line along its normal" -msgstr "Dịch được áp dụng với đường hướng chánh theo pháp tuyến của nó" +msgstr "Dịch chuyển áp dụng vào đường hướng chính dọc theo pháp tuyến của nó" msgid "Add one-dimensional Perlin noise to stroke backbone geometry" -msgstr "Thêm huyên náo Perlin vào hình dạng xương sống của nét" +msgstr "Thêm nhiễu Perlin 1D vào hình dạng nét vẽ khung cốt" msgid "Amplitude of the Perlin noise" -msgstr "Biên độ của huyên náo Perlin" +msgstr "Biên độ của nhiễu Perlin" msgid "Displacement direction" -msgstr "Hướng dịch" +msgstr "Hướng Dời Hình" msgid "Frequency of the Perlin noise" -msgstr "Tần số của huyên náo Perlin" +msgstr "Tần số của nhiễu Perlin" msgid "Number of octaves (i.e., the amount of detail of the Perlin noise)" -msgstr "Số lượng quãng tám (ví dụ điều khiển mức chi tiết trong huyên náo Perlin)" +msgstr "Số lượng quãng tám (tức là lượng chi tiết của nhiễu Perlin)" msgid "Seed for random number generation (if negative, time is used as a seed instead)" -msgstr "Số hạt cho chế tạo số ngẫu nhiên (nếu âm, nó sẽ dùng thời gian máy cho một số hạt thay thế)" +msgstr "Mầm để tạo số ngẫu nhiên (nếu âm, nó sẽ dùng thời gian của máy để làm mầm thay thế)" msgid "Add two-dimensional Perlin noise to stroke backbone geometry" -msgstr "Thêm huyên náo Perlin 2 chiều vào hình dạng xương sống nét vẽ" +msgstr "Thêm nhiễu Perlin 2D vào nét vẽ hình dạng khung cốt" msgid "Polygonalization" @@ -31599,39 +34098,39 @@ msgstr "Đa Giác Hóa" msgid "Modify the stroke geometry so that it looks more 'polygonal'" -msgstr "Sửa đổi hình dạng nét cho nó xem như kiểu đa giác hơn" +msgstr "Sửa đổi hình học của nét vẽ để nó trông giống hình đa giác hơn" msgid "Maximum distance between the original stroke and its polygonal approximation" -msgstr "Khoảng cách xa nhất giữa nét bản chánh và hình dạng đa giác hóa" +msgstr "Khoảng cách tối đa giữa nét vẽ gốc và hình dạng đa giác hóa ước tính" msgid "Specify a new sampling value that determines the resolution of stroke polylines" -msgstr "Chỉ định một giá trị mẫu vật mới để xác định độ phân giải của đường đa nét" +msgstr "Xác định giá trị mẫu vật mới để quyết định độ phân giải của các đường đa giác" msgid "New sampling value to be used for subsequent modifiers" -msgstr "Giá trị mẫu vật mới để sử dụng cho bộ điều chỉnh kế tiếp" +msgstr "Giá trị mẫu vật mới cho các bộ điều chỉnh tiếp tới" msgid "Simplify the stroke set" -msgstr "Đơn giản hóa tập nét" +msgstr "Đơn giản hóa bộ đường nét" msgid "Distance below which segments will be merged" -msgstr "Gồm đoạn có khoảng cách nhỏ hơn này" +msgstr "Khoảng cách mà các đoạn ngắn hơn sẽ phải hợp nhất lại" msgid "Add sinus displacement to stroke backbone geometry" -msgstr "Thêm dịch sin vào hình dạng xương sống nét" +msgstr "Thêm dịch chuyển hình sin vào nét vẽ hình dạng khung cốt" msgid "Amplitude of the sinus displacement" -msgstr "Biên độ của dịch sin" +msgstr "Biện độ của dịch chuyển hình sin" msgid "Phase of the sinus displacement" -msgstr "Pha của dịch sin" +msgstr "Pha dịch chuyển hình sin" msgid "Wavelength" @@ -31639,83 +34138,88 @@ msgstr "Bước Sóng" msgid "Wavelength of the sinus displacement" -msgstr "Bước sóng của dịch sin" +msgstr "Bước sóng của dịch chuyển hình sin" msgid "Add spatial noise to stroke backbone geometry" -msgstr "Thêm huyên náo không gian vào hình dạng xương sống nét" +msgstr "Thêm nhiễu không gian vào nét vẽ hình dạng khung cốt" msgid "Amplitude of the spatial noise" -msgstr "Biên độ của huyên náo không gian" +msgstr "Biên độ của nhiễu không gian" msgid "Number of octaves (i.e., the amount of detail of the spatial noise)" -msgstr "Số lượng quảng tám (cho điều khiển mức chi tiết huyên náo không gian)" +msgstr "Số lượng quảng tám (tức là lượng chi tiết của nhiễu không gian)" msgid "Scale of the spatial noise" -msgstr "Phóng to của huyên náo không gian" +msgstr "Độ tỷ lệ của nhiễu không gian" + + +msgctxt "FreestyleLineStyle" +msgid "Smooth" +msgstr "Mịn" msgid "If true, the spatial noise is smooth" -msgstr "Nếu đúng, huyên náo không gian sẽ mịn" +msgstr "Nếu 'đúng' thì nhiễu không gian sẽ mịn màng" msgid "Pure Random" -msgstr "Toàn Bộ Ngẫu Nhiên" +msgstr "Hoàn Toàn Ngẫu Nhiên" msgid "If true, the spatial noise does not show any coherence" -msgstr "Nếu đúng, huyên náo không gian sẽ không phát hiện mạch lạc" +msgstr "Nếu 'đúng' thì không có sự mạch lạc nào biểu hiện trong nhiễu không gian" msgid "Remove a piece of stroke at the beginning and the end of stroke backbone" -msgstr "Xoá một miến nét tại đầu và cuối của xương sống nét" +msgstr "Xóa một phần tại đầu và cuối của nét vẽ hình dạng khung cốt" msgid "Tip Length" -msgstr "Bề Dài Miến" +msgstr "Chiều Dài Đỉnh Đầu" msgid "Length of tips to be removed" -msgstr "Bề dài miến để xóa" +msgstr "Chiều dài đỉnh đầu để xóa" msgid "Line Style Thickness Modifier" -msgstr "Bộ Điều Chỉnh Bề Dài Phong Cách Nét" +msgstr "Bộ Điều Chỉnh Độ Dày Phong Cách Đường Nét" msgid "Base type to define line thickness modifiers" -msgstr "Loại cơ sở để xác định bộ điều chỉnh bề rộng nét" +msgstr "Loại cơ sở để xác định bộ điều chỉnh độ dày đường nét" msgid "Change line thickness along stroke" -msgstr "Đổi bề rộng đường theo nét vẽ" +msgstr "Đổi độ dày đường nét dọc theo nét vẽ" msgid "Calligraphy" -msgstr "Bút Tây Xưa" +msgstr "Thư Pháp" msgid "Value Max" -msgstr "Giá Trị Cực Đại" +msgstr "Giá Trị Tối Đa" msgid "Maximum output value of the mapping" -msgstr "Giá trị cực đại của ánh xạ" +msgstr "Giá trị tối đa của ánh xạ" msgid "Value Min" -msgstr "Giá Trị Cực Tiểu" +msgstr "Giá Trị Tối Thiểu" msgid "Minimum output value of the mapping" -msgstr "Giá trị cực đại của ánh xạ" +msgstr "Giá trị tối thiểu của ánh xạ" msgid "Change line thickness so that stroke looks like made with a calligraphic pen" -msgstr "Đổi bề rộng cho nét vẽ xem như được vẽ bằng một bút kiểu Tây Phương xưa" +msgstr "Đổi độ dày hầu cho nét vẽ trông giống nét bút thư pháp" msgid "Orientation" @@ -31723,256 +34227,256 @@ msgstr "Định Hướng" msgid "Angle of the main direction" -msgstr "Góc của hướng chánh" +msgstr "Góc độ của hướng chủ yếu" msgid "Max Thickness" -msgstr "Bề Rộng Cực Đại" +msgstr "Độ Dày Tối Đa" msgid "Maximum thickness in the main direction" -msgstr "Bề rộng cực đại theo hướng chánh" +msgstr "Độ dày tối đa theo hướng chủ yếu" msgid "Min Thickness" -msgstr "Độ Dày Cực Tiểu" +msgstr "Độ Dày Tối Thiểu" msgid "Minimum thickness in the direction perpendicular to the main direction" -msgstr "Bề rộng cực tiểu hướng vuông góc với hướng chánh" +msgstr "Độ dày tối thiểu trong hướng nằm vuông góc với hướng chủ yếu" msgid "Line thickness based on the angle between two adjacent faces" -msgstr "Bề rộng nét tùy góc giữa hai mặt kề nhau" +msgstr "Độ dày nét dựa vào góc giữa hai mặt kề nhau" msgid "Maximum thickness" -msgstr "Bề rộng cực đại" +msgstr "Độ dày tối đa" msgid "Minimum thickness" -msgstr "Bề rộng cực tiểu" +msgstr "Độ dày tối thiểu" msgid "Line thickness based on the radial curvature of 3D mesh surfaces" -msgstr "Bề rộng nét tùy độ cong bán kính tuyến của bề mặt mạng lưới 3D" +msgstr "Độ dày nét vẽ dựa vào độ cong tỏa tròn của các bề mặt khung lưới 3D" msgid "Change line thickness based on the distance from the camera" -msgstr "Đổi bề dày nét tùy cách xa từ máy quay phim" +msgstr "Đổi độ dày nét vẽ dựa vào khoảng cách từ máy quay phim" msgid "Change line thickness based on the distance from an object" -msgstr "Đổi bề dày nét tùy cách xa từ một vật thể" +msgstr "Đổi độ dày nét vẽ dựa vào khoảng cách từ một đối tượng" msgid "Change line thickness based on a material attribute" -msgstr "Đổi bề dày nét tùy một đặc trưng vật liệu" +msgstr "Đổi độ dày nét vẽ dựa vào một thuộc tính của nguyên vật liệu" msgid "Line thickness based on random noise" -msgstr "Bề rộng nét tùy huyên náu ngẫu nhiên" +msgstr "Độ dày nét dựa vào nhiễu ngẫu nhiên" msgid "Asymmetric" -msgstr "Dị Đối Xứng" +msgstr "Phi Đối Xứng" msgid "Allow thickness to be assigned asymmetrically" -msgstr "Cho chỉ định bề rộng dị đối xứng" +msgstr "Cho phép độ dày được ấn định bất đối xứng" msgid "Thickness based on the direction of the stroke" -msgstr "Bề rộng nét tùy hướng của nét" +msgstr "Độ dày nét dựa vào định hướng của nét vẽ" msgid "Collection of texture slots" -msgstr "Sưu Tập Khe Chất Liệu" +msgstr "Bộ các khe chất liệu" msgid "Thickness modifiers for changing line thickness" -msgstr "Bộ điều chỉnh bề rộng cho đổi bề rộng nét" +msgstr "Bộ điều chỉnh độ dày để thay đổi độ dày nét vẽ" msgid "Line sets for associating lines and style parameters" -msgstr "Sưu tập nét cho liên kết tham số nét và phong cách" +msgstr "Bộ đường nét của các đường nét liên quan và các tham số về phong cách" msgid "Active Line Set" -msgstr "Tập Nét Hoạt Động" +msgstr "Bộ Đường Nét đang Hoạt Động" msgid "Active line set being displayed" -msgstr "Tập nét hoạt động đang hiển thị" +msgstr "Bộ đường nét đang được hiển thị" msgid "Active Line Set Index" -msgstr "Chỉ Số Tập Nét Hoạt Động" +msgstr "Chỉ Số của Bộ Đường Nét đang Hoạt Động" msgid "Index of active line set slot" -msgstr "Chỉ số của khe sưu tập nét hoạt động" +msgstr "Chỉ số khe của bộ đường nét đang hoạt động" msgid "Loop Colors" -msgstr "Lặp Vòng Màu" +msgstr "Màu của Mạnh Lưới" msgid "Collection of vertex colors" -msgstr "Sưu tập màu đỉnh" +msgstr "Bộ sưu tập các màu điểm đỉnh" msgid "Active Vertex Color Layer" -msgstr "Lớp Màu Đỉnh Hoạt Động" +msgstr "Tầng Màu Điểm Đỉnh đang Hoạt Động" msgid "Active vertex color layer" -msgstr "Lớp màu đỉnh hoạt động" +msgstr "Tầng màu điểm đỉnh đang hoạt động" msgid "Active Vertex Color Index" -msgstr "Chỉ Số Màu Đỉnh Hoạt Động" +msgstr "Chỉ Số Màu Điểm Đỉnh đang Hoạt Động" msgid "Active vertex color index" -msgstr "Chỉ số màu đỉnh hoạt động" +msgstr "Chỉ số màu điểm đỉnh đang hoạt động" msgid "Mask Layer" -msgstr "Lớp Mặt Nạ" +msgstr "Tầng Màn Chắn Lọc" msgid "Single layer used for masking pixels" -msgstr "Một lớp để làm mặt nạ điểm ảnh" +msgstr "Một đơn tầng dùng chắn lọc các điểm ảnh" msgid "Render Opacity" -msgstr "Độ Đục Kêt Xuất" +msgstr "Độ Đục của Kết Xuất" msgid "Method of blending mask layers" -msgstr "Phương pháp để pha trộn lớp mặt nạ" +msgstr "Phương pháp để pha trộn các tầng màn chắn lọc" msgid "Merge Add" -msgstr "Gồm Cộng" +msgstr "Hợp Nhất Cộng" msgid "Merge Subtract" -msgstr "Gồm Trừ" +msgstr "Hợp Nhất Khấu Trừ" msgctxt "Curve" msgid "Falloff" -msgstr "Sự Giảm" +msgstr "Suy Giảm Dần" msgid "Falloff type the feather" -msgstr "Sự giảm của phe phẩy" +msgstr "Loại nhòe mờ của viền" msgid "Smooth falloff" -msgstr "Sự Giảm Mịn" +msgstr "Nhòe mờ mịn màng" msgid "Spherical falloff" -msgstr "Sự Giảm Hình Cầu" +msgstr "Nhòe mờ hình cầu" msgid "Root falloff" -msgstr "Sự Giảm Căn" +msgstr "Dốc suy giảm mức căn" msgid "Inverse Square falloff" -msgstr "Sự Giảm Bậc Hai Đảo Nghịch" +msgstr "Dốc suy giảm Canh Bậc Hai Nghịch Đảo" msgid "Sharp falloff" -msgstr "Sự Giảm Nhọn" +msgstr "Dốc suy giảm đột ngột" msgid "Linear falloff" -msgstr "Sự Giảm Bậc Một" +msgstr "Dốc suy giảm tuyến tính" msgid "Restrict View" -msgstr "Hạn Chế Màn" +msgstr "Tắt Hiển Thị" msgid "Restrict visibility in the viewport" -msgstr "Hạn sự hiển thị trong màn chiếu" +msgstr "Tắt hiển thị trong cổng nhìn" msgid "Restrict Render" -msgstr "Hạn Chế Kết Xuất" +msgstr "Tắt Kết Xuất" msgid "Restrict renderability" -msgstr "Hạn chế được kết xuất" +msgstr "Tắt khả năng kết xuất" msgid "Restrict Select" -msgstr "Hạn Chế Lựa Chọn" +msgstr "Tắt Lựa Chọn" msgid "Restrict selection in the viewport" -msgstr "Hạn chế sự lựa chọn trong màn chiếu" +msgstr "Không cho lựa chọn trong cổng nhìn" msgid "Invert the mask black/white" -msgstr "Đảo nghịch mặt nạ đen/trắng" +msgstr "Đảo nghịch màu màn chắn lọc đen/trắng" msgid "Unique name of layer" -msgstr "Tên độc đáo cho lớp" +msgstr "Tên đơn nhất của tầng" msgid "Collection of splines which defines this layer" -msgstr "Sưu tập mẫu cong để xác định lớp này" +msgstr "Bộ chốt trục định nghĩa tầng này" msgid "Calculate Holes" -msgstr "Tính Hố" +msgstr "Tính Toán các Lỗ Hổng" msgid "Calculate holes when filling overlapping curves" -msgstr "Tính lỗ khi đầy đường cong lấn lên nhau" +msgstr "Tính toán các lỗ hổng khi tô kín các đường cong đè gối lên nhau" msgid "Calculate Overlap" -msgstr "Tính Độ Lấn Lên Nhau" +msgstr "Tính Toán Mức Đè Gối Lên Nhau" msgid "Calculate self intersections and overlap before filling" -msgstr "Tính tự giao cắt và lấn lên nhau trước trình đầy" +msgstr "Tính toán những chỗ tự bản thân giao cắt và đè gối lên nhau trước khi tô kín" msgid "Mask Layers" -msgstr "Lớp Mặt Nạ" +msgstr "Tầng Màn Chắn Lọc" msgid "Collection of layers used by mask" -msgstr "Sưu tập lớp mặt nạ đang dùng" +msgstr "Bộ sưu tập các tầng để màn chắn lọc sử dụng" msgid "Active Shape" -msgstr "Mẫu Dạng Hoạt Động" +msgstr "Hình Mẫu đang Hoạt Động" msgid "Active layer in this mask" -msgstr "Lớp hoạt động trong mặt nạ này" +msgstr "Tầng đang hoạt động trong màn chắn lọc này" msgid "Mask Parent" -msgstr "Phụ Huynh Mặt Nạ" +msgstr "Phụ Huynh Chắn Lọc" msgid "Parenting settings for masking element" -msgstr "Cài đặt phụ huynh cho phần tử mặt nạ" +msgstr "Những sắp đặt về phụ huynh hóa cho yếu tố chắn lọc" msgid "ID-block to which masking element would be parented to or to its property" -msgstr "Cục ID nào nên làm phụ huynh của phần tử mặt nạ hay đặc tính của nó" +msgstr "Khối-ID mà yếu tố chắn lọc sẽ phụ huynh hóa với hoặc với tính chất của nó" msgid "ID Type" @@ -31980,383 +34484,440 @@ msgstr "Loại ID" msgid "Name of parent object in specified data-block to which parenting happens" -msgstr "Tên của vật thể phụ huynh được xác định trong cục dữ liệu được làm phụ huynh" +msgstr "Tên của đối tượng phụ huynh trong khối dữ liệu chỉ định, nơi sự phụ huynh hóa xảy ra" msgid "Sub Parent" -msgstr "Hạ Phụ Huynh" +msgstr "Phụ Huynh Thứ" msgid "Name of parent sub-object in specified data-block to which parenting happens" -msgstr "Tên của vật thể hạ phụ huynh được xác định trong cục dữ liệu được làm phụ huynh" +msgstr "Tên của đối tượng phụ huynh thứ trong khối dữ liệu chỉ định, nơi sự phụ huynh hóa xảy ra" msgid "Point Track" -msgstr "Đuổi Theo Điểm" +msgstr "Giám Sát Điểm" msgid "Plane Track" -msgstr "Đuổi Theo Mặt Phẳng" +msgstr "Giám Sát Bình Diện" msgid "Mask spline" -msgstr "Mặt nạ mẫu cong" +msgstr "Chốt Trục của Màn Chắn Lọc" msgid "Single spline used for defining mask shape" -msgstr "Một mẫu cong dùng để chỉ định hình dạng mặt nạ" +msgstr "Chốt Trục dùng để định nghĩa hình dạng của màn chắn lọc" + + +msgctxt "Mask" +msgid "Feather Offset" +msgstr "Dịch Chuyển của Mép Nhòe" msgid "The method used for calculating the feather offset" -msgstr "Dùng phương pháp nào để tính dịch phe phẩy" +msgstr "Phương pháp để tính dịch chuyển của mép nhòe" + + +msgctxt "Mask" +msgid "Even" +msgstr "Đều Đặn" msgid "Calculate even feather offset" -msgstr "Tính phe phẩy dịch chẳn" +msgstr "Tính dịch chuyển của mép nhòe đều đặn" msgid "Calculate feather offset as a second curve" -msgstr "Tính phe phẩy dịch bằng một đường cong thứ hai" +msgstr "Tính dich chuyển của mép nhòe như một đường cong thứ hai" msgid "Collection of points" -msgstr "Sưu tập điểm" +msgstr "Bộ sưu tập của các điểm" msgid "Make this spline a closed loop" -msgstr "Đống và lặp lại mẫu cong này" +msgstr "Biến chốt trục này thành một vòng tuần hoàn kín" + + +msgctxt "Mask" +msgid "Fill" +msgstr "Tô Phủ Kín" msgid "Make this spline filled" -msgstr "Tô đầy mẫu cong này" +msgstr "Làm kín chốt trục này" msgid "Self Intersection Check" -msgstr "Kiểm Tra Tự Giao Cắt" +msgstr "Kiểm Tra Sự Giao Cắt Bản Thân" msgid "Prevent feather from self-intersections" -msgstr "Không cho phe phẩy tại chỗ tự giao cắt" +msgstr "Tránh vấn đề mép nhòe tự giao cắt" msgid "Weight Interpolation" -msgstr "Suy Nội Quyền Lượng" +msgstr "Nội Suy Trọng Lượng" msgid "The type of weight interpolation for spline" -msgstr "Loại suy nội quyền lượng cho mẫu cong" +msgstr "Kiểu nội suy trọng lượng cho chốt trục" msgid "Mask Spline Point" -msgstr "Mặt Nạ Điểm Mẫu Cong" +msgstr "Điểm Trên Chốt Trục Chắn Lọc" msgid "Single point in spline used for defining mask" -msgstr "Một điểm trong mẫu cong cho xác định mặt nạ" +msgstr "Một điểm trong chốt trục dùng để xác định màn chắn lọc" msgid "Feather Points" -msgstr "Điểm Phe Phẩy" +msgstr "Điểm Mép Nhòe" msgid "Points defining feather" -msgstr "Điểm cho xác định phe phẩy" +msgstr "Các điểm để xác định mép nhòe" msgid "Handle type" -msgstr "Loại tay cầm" +msgstr "Kiểu tay cầm" msgid "Aligned Single" -msgstr "Sắp Hàng Một" +msgstr "Đơn Cánh Thẳng Hàng" msgid "Weight of the point" -msgstr "Quyền lượng của điểm" +msgstr "Trọng lượng của điểm" msgid "Mask Spline UW Point" -msgstr "Mặt Nạ Điểm UV Mẫu Cong" +msgstr "Điểm UW Trên Chốt Trục Màn Chắn Lọc" msgid "Single point in spline segment defining feather" -msgstr "Một điểm trong đoạn mẫu cong cho xác định phe phẩy" +msgstr "Một điểm trên phân đoạn chốt trục xác định mép nhòe" msgid "U coordinate of point along spline segment" -msgstr "Tọa độ U của điểm theo hướng khúc mẫu cong" +msgstr "Tọa độ U của điểm dọc theo phân đoạn chốt trục" msgid "Weight of feather point" -msgstr "Quyền lượng của điểm phe phẩy" +msgstr "Trọng lượng của điểm mép nhòe" msgid "Mask Spline Points" -msgstr " Điểm Mẫu Cong Mặt Nạ" +msgstr "Các Điểm Trên Chốt Trục Chắn Lọc" msgid "Collection of masking spline points" -msgstr "Sưu tập điểm của mẫu cong mặt nạ" +msgstr "Bộ sưu tập các điểm của chốt trục chắn lọc" msgid "Mask Splines" -msgstr "Mẫu Cong Mặt Nạ" +msgstr "Chốt Trục Chắn Lọc" msgid "Collection of masking splines" -msgstr "Sưu tập mẫu cong của mặt nạ" +msgstr "Bộ sưu tập các chốt trục chắn lọc" msgid "Active spline of masking layer" -msgstr "Mẫu cong hoạt động của lớp mặt nạ" +msgstr "Chốt trục đang hoạt động của tầng màn chắn" msgid "Active Point" -msgstr "Điểm Hoạt Động" +msgstr "Điểm đang Hoạt Động" + + +msgid "Active point of masking layer" +msgstr "Điểm đang hoạt động của tầng chắn lọc" msgid "Grease Pencil Color" -msgstr "Màu Bút Sáp" +msgstr "Màu của Nét Bút Chì Dầu" msgid "Alignment" -msgstr "Sắp Xếp" +msgstr "Căn Chỉnh" msgid "Defines how align Dots and Boxes with drawing path and object rotation" -msgstr "Được chỉ định làm sao sắp xếp Dấu Chấm và Xương với đường vẽ và xoay của vật thể" +msgstr "Xác định phương pháp mà các Chấm và các Hình Hộp căn chỉnh với đường dẫn và sự xoay chiều của đối tượng" msgid "Follow stroke drawing path and object rotation" -msgstr "Theo đường vẽ và xoay của vật thể" +msgstr "Đi theo đường đi của nét vẽ và sự xoay chiều của đối tượng" msgid "Follow object rotation only" -msgstr "Chi theo xoay của vật thể" +msgstr "Chỉ đi theo sự xoay chiều của đối tượng mà thôi" msgid "Do not follow drawing path or object rotation and keeps aligned with viewport" -msgstr "Không theo đường vẽ hay xoay vật thể và giữ sắp xếp với màn chiếu" +msgstr "Không đi theo đường vẽ hoặc sự xoay chiều của đối tượng, song giữ căn chỉnh với cổng nhìn" msgid "Additional rotation applied to dots and square texture of strokes. Only applies in texture shading mode" -msgstr "Xoay thêm được áp dụng cho dấu chấm và chất liệu vuông của các nét. Chỉ áp dụng trong chế độ tô bóng chất liệu" +msgstr "Mức xoay chiều bổ sung áp dụng vào các chấm và chất liệu hình vuông của nét vẽ. Chỉ áp dụng trong chế độ tô bóng chất liệu" msgid "Fill Color" -msgstr "Màu Tô Đầy" +msgstr "Màu Tô Kín" msgid "Color for filling region bounded by each stroke" -msgstr "Màu cho tô đầy vùng được mỗi nét bao quanh" +msgstr "Màu cho vùng tô kín được khoanh vùng bằng mỗi nét vẽ" + + +msgctxt "GPencil" +msgid "Fill Style" +msgstr "Kiểu Tô Phủ Kín" msgid "Select style used to fill strokes" -msgstr "Chọn phong cách để sử dụng tô đầy nét" +msgstr "Chọn kiểu sử dụng để tô kín các nét vẽ" + + +msgctxt "GPencil" +msgid "Solid" +msgstr "Đặc" msgid "Fill area with solid color" -msgstr "Tô đầy khu vực bằng một màu đều" +msgstr "Tô kín khu vực với màu đặc" + + +msgctxt "GPencil" +msgid "Gradient" +msgstr "Dốc Màu" msgid "Fill area with gradient color" -msgstr "Tô đầy khu vực bằng màu chuyển sắc" +msgstr "Tô kín khu vực với dốc màu" + + +msgctxt "GPencil" +msgid "Texture" +msgstr "Chất Liệu" msgid "Fill area with image texture" -msgstr "Tô đầy bằng chất liệu ảnh" +msgstr "Phủ kín diện tích với hình ảnh chất liệu" msgid "Flip" -msgstr "Lật" +msgstr "Đảo Lật" msgid "Flip filling colors" -msgstr "Lật màu tô đầy" +msgstr "Đảo lật các màu phủ" msgid "Show in Ghosts" -msgstr "Hiện trong Bóng Ma" +msgstr "Hiển Thị trong Ảo Ảnh" msgid "Display strokes using this color when showing onion skins" -msgstr "Hiển thị nét bằng màu này khi hiện bóng ma" +msgstr "Hiển thị các nét vẽ bằng màu này khi biểu thị các ảo ảnh vỏ hành" msgid "Gradient Type" -msgstr "Loại Chuyển Sắc" +msgstr "Thể Loại Dốc Màu" msgid "Select type of gradient used to fill strokes" -msgstr "Chọn loại chuyển sắc để tô đầy nét" +msgstr "Chọn kiểu dốc màu sử dụng để tô kín các nét vẽ" msgid "Fill area with radial gradient" -msgstr "Tô đầy khu vực bằng chuyền sắc tròn" +msgstr "Tô kín khu vực với dốc màu" msgid "Set color Visibility" -msgstr "Đặt sự hiển thị màu" +msgstr "Đặt Tầm Nhìn của màu" msgid "Is Fill Visible" -msgstr "Có Thể Thấy Tô Đầy" +msgstr "Màu Tô Phủ có Hữu Hình Không" msgid "True when opacity of fill is set high enough to be visible" -msgstr "Đúng khi độ đục của tô đầy được đặt cao đủ cho được nhìn thấy" +msgstr "Giá trị 'Đúng' khi độ đục của màu phủ được đặt cao vừa đủ, có thể nhìn thấy được" msgid "Is Stroke Visible" -msgstr "Có Thể Thấy Nét" +msgstr "Nét Vẽ có Hữu Hình Không" msgid "True when opacity of stroke is set high enough to be visible" -msgstr "Đúng khi độ đục của nét là cao đủ cho được nhìn thấy" +msgstr "Giá trị 'Đúng' khi độ đục của nét đặt vừa đủ cao, có thể nhìn thấy được" msgid "Protect color from further editing and/or frame changes" -msgstr "Bảo vệ màu từ biên tập tiếp và/hay đổi bức ảnh" +msgstr "Bảo vệ màu khỏi những chỉnh sửa và/hoặc đổi khung hình" msgid "Mix Color" -msgstr "Pha Trộn Maù" +msgstr "Hòa Trộn Màu" msgid "Color for mixing with primary filling color" -msgstr "Màu cho pha trộn với màu tô đầy chánh" +msgstr "Màu để hòa trộn với màu tô phủ kín chính" + + +msgctxt "GPencil" +msgid "Mix" +msgstr "Hòa Trộn" msgid "Mix Factor" -msgstr "Hệ Số Pha Trộn" +msgstr "Hệ Số Hòa Trộn" msgid "Mix Stroke Factor" -msgstr "Hệ Số Pha Trộn Nét" +msgstr "Hệ Số Hòa Trộn Nét Vẽ" msgid "Line Type" -msgstr "Loại Đường" +msgstr "Kiểu Đường Nét" msgid "Select line type for strokes" -msgstr "Chọn loại đường cho nét" +msgstr "Chọn kiểu đường cho nét vẽ" msgid "Draw strokes using a continuous line" -msgstr "Vẽ nét bằng một đường liên tiếp" +msgstr "Vẽ các nét dùng một đường nối liên tục" msgid "Draw strokes using separated dots" -msgstr "Vẽ nét bằng dấu chấm không kết nối" +msgstr "Vẽ các nét dùng các chấm tròn riêng biệt" msgid "Draw strokes using separated squares" -msgstr "Vẽ nét bằng dấu chấm vuông không kết nối" +msgstr "Vẽ nét dùng các hình vuông riêng biệt" msgid "Index number for the \"Color Index\" pass" -msgstr "Chỉ số cho vòng \"Chỉ Số Chất Màu\"" +msgstr "Chỉ số dùng cho lượt \"Chỉ Số Màu\"" msgid "Texture Pixel Size factor along the stroke" -msgstr "Hệ số Kích Cỡ Điểm Ảnh Chất Liệu trên nét" +msgstr "Hệ số Kích Thước Điểm Ảnh của Chất Liệu dọc theo nét vẽ" msgid "Show stroke fills of this material" -msgstr "Hiện nét tô đầy của vật liệu này" +msgstr "Hiển thị các vùng tô kín nét vẽ của chất liệu này" msgid "Show Stroke" -msgstr "Hiện Nét" +msgstr "Hiển Thị Nét Vẽ" msgid "Show stroke lines of this material" -msgstr "Hiện đường nét của vật liệu này" +msgstr "Hiển thị các đường của nét vẽ trong chất liệu này" + + +msgctxt "GPencil" +msgid "Stroke Style" +msgstr "Kiểu Nét Vẽ" msgid "Select style used to draw strokes" -msgstr "Chọn phong cách để vẽ nét" +msgstr "Chọn phong cách sử dụng để vẽ các nét" msgid "Draw strokes with solid color" -msgstr "Vẽ nét bằng màu đều" +msgstr "Vẽ các nét với một màu trơn" msgid "Draw strokes using texture" -msgstr "Vẽ nét sử dụng chất liệu" +msgstr "Vẽ các nét dùng chất liệu" msgid "Texture Orientation Angle" -msgstr "Góc Định Hướng Chất Liệu" +msgstr "Góc Định Hướng của Chất Liệu" msgid "Do not repeat texture and clamp to one instance only" -msgstr "Đừng lặp lại chất liệu và kẹp lại đến chỉ một thực thể" +msgstr "Không nhắc lại chất liệu và hạn chế lại, chỉ sử dụng một thực thể mà thôi" msgid "Shift Texture in 2d Space" -msgstr "Dịch Chất Liệu trong Không Gian 2D" +msgstr "Dịch chuyển Chất Liệu trong không gian 2D" msgid "Scale Factor for Texture" -msgstr "Hệ Số Phóng To cho Chất Liệu" +msgstr "Hệ Số Đổi Tỷ Lệ cho Chất Liệu" msgid "Remove the color from underneath this stroke by using it as a mask" -msgstr "Xóa màu từ phía dưới nết này bằng dùng nó như một mặt nạ" +msgstr "Xóa màu bên dưới nét vẽ này bằng cách sử dụng nó như một màn chắn lọc" msgid "Self Overlap" -msgstr "Tứ Lấn Lên" +msgstr "Tự Đè Gối Bản Thân" msgid "Disable stencil and overlap self intersections with alpha materials" -msgstr "Tắt khuôn tô và lấn lên các tự giao cắt với vật liệu có độ đục" +msgstr "Tắt khuôn in và những sự giao cắt chồng chéo bản thân với các chất liệu alpha" msgid "Material Line Art" -msgstr "Vật Liệu Nghệ Thuật Đường Nét" +msgstr "Mỹ Thuật Đường Nét Nguyên Vật Liệu" msgid "Effectiveness" -msgstr "Hiệu Qủa" +msgstr "Mức Ảnh Hưởng" msgid "Faces with this material will behave as if it has set number of layers in occlusion" -msgstr "Các mặt trong vật liệu này sẽ hành vi như nó có một số lớp đang che khuất" +msgstr "Các mặt trong vật liệu này sẽ hành vi như nó có một số lớp trong vùng Hấp Thụ Quang Xạ" msgid "Override object and collection intersection priority value" -msgstr "Vượt quyền giá trị ưu tiên của vật thể và giao cắt sưu tập" +msgstr "Vượt quyền giá trị ưu tiên của đối tượng và giao cắt bộ sưu tập" msgid "Material slot in an object" -msgstr "Khe vật liệu trong một vật thể" +msgstr "Khe nguyên vật liệu trong một đối tượng" msgid "Link material to object or the object's data" -msgstr "Liên kết vật liệu đến vật thể hay dữ liệu của vật thể" +msgstr "Kết nối nguyên vật liệu với đối tượng hoặc với dữ liệu của đối tượng" msgid "Material data-block used by this material slot" -msgstr "Cục dữ liệu vật liệu được khe vật liệu này sử dụng" +msgstr "Khối dữ liệu về nguyên vật liệu của khe nguyên vật liệu này" msgid "Material slot name" -msgstr "Tên khe vật liệu" +msgstr "Tên khe nguyên vật liệu" msgid "Editor menu containing buttons" -msgstr "Danh bạ biên tập đang chứa nút" +msgstr "Trình đơn của trình biên soạn có chứa các nút" + + +msgid "Bone Collection Specials" +msgstr "Bộ Sưu Tập Xương Đặc Biệt" msgid "Asset" -msgstr "Tích Sản" +msgstr "Tài Sản" + + +msgid "Catalog" +msgstr "Hạng Mục" msgid "Assets" -msgstr "Tích Sản" +msgstr "Tài sản" msgctxt "MovieClip" @@ -32365,7 +34926,7 @@ msgstr "Đoạn Phim" msgid "Marker Settings" -msgstr "Cài Đặt Ký Hiệu" +msgstr "Sắp Đặt về Dấu Mốc" msgid "Pivot Point" @@ -32373,63 +34934,68 @@ msgstr "Điểm Tựa" msgid "Plane Track Image Specials" -msgstr "Đồ Đặc Biệt Cho Theo Dõi Mặt Phẳng Ảnh" +msgstr "Chức Năng Đặc Biệt của Hình Ảnh Giám Sát Bình Diện" msgid "Proxy" -msgstr "Đại Lý" +msgstr "Đại Diện" msgid "Reconstruction" -msgstr "Xây Dựng Lại" +msgstr "Khôi Phục Lại" msgid "Select Grouped" -msgstr "Chọn Là Nhóm " +msgstr "Chọn theo Nhóm" msgid "Solving" -msgstr "Đang Giải Nghiệm" +msgstr "Giải Nghiệm" msgid "Translation Track Specials" -msgstr "Riêng Biệt Đuổi Theo Dịch" +msgstr "Những Đặc Biệt của Giám Sát Dịch Chuyển" msgid "Rotation Track Specials" -msgstr "Riêng Biệt Đuổi Theo Xoay" +msgstr "Những Đặc Biệt của Giám Sát Xoay Chiều" msgid "Clean Up" -msgstr "Làm Sạch" +msgstr "Dọn Dẹp" msgid "Track Motion" -msgstr "Theo Dõi Chuyển Động" +msgstr "Giám Sát Chuyển Động" msgid "Refine" -msgstr "Chỉnh Lại" +msgstr "Tinh Chỉnh" msgid "Show/Hide" -msgstr "Hiện/Ẩn" +msgstr "Hiện/Ẩn Giấu" msgid "Context Menu" -msgstr "Danh Bạ Bối Cảnh" +msgstr "Trình Đơn Ngữ Cảnh" + + +msgctxt "MovieClip" +msgid "Tracking" +msgstr "Giám Sát" msgid "Fractional Zoom" -msgstr "Phóng To Số Phân" +msgstr "Thu-Phóng Bộ Phận" msgid "Collection Specials" -msgstr "Sưu Tập Đặc Biệt" +msgstr "Thao Tác Đặc Biệt về Bộ Sưu Tập" msgid "Console" -msgstr "Diện Điều Khiển" +msgstr "Bàn Giao Tiếp" msgid "Languages..." @@ -32437,7 +35003,15 @@ msgstr "Ngôn Ngữ..." msgid "Add Attribute" -msgstr "Thêm Đặc Điểm" +msgstr "Thêm Thuộc Tính" + + +msgid "Light Linking Specials" +msgstr "Những Đặc Biệt về Liên Kết Ánh Sáng" + + +msgid "Shadow Linking Specials" +msgstr "Những Đặc Biệt về Liên Kết Bóng Tối" msgid "Channel" @@ -32445,15 +35019,19 @@ msgstr "Kênh" msgid "Dope Sheet Channel" -msgstr "Kênh Bảng Hoạt Hình" +msgstr "Kênh của Bảng Hành Động" msgid "Snap" -msgstr "Hút Dính" +msgstr "Bám Dính" msgid "Bookmarks Specials" -msgstr "Đặc Biệt Dấu Sách" +msgstr "Những Đặc Biệt về Dấu Trang" + + +msgid "Recent Items Specials" +msgstr "Những Đặc Biệt về các Mục Gần Đây" msgid "Files" @@ -32461,35 +35039,39 @@ msgstr "Tập Tin" msgid "Grease Pencil Vertex Groups" -msgstr "Nhóm Đỉnh Bút Sáp" +msgstr "Nhóm Điểm Đỉnh Bút Chì Dầu" msgid "Change Active Layer" -msgstr "Đổi Lớp Hoạt Động" +msgstr "Thay Đổi Tầng đang Hoạt Động" msgid "Layer Specials" -msgstr "Đồ Đặc Biệt Lớp" +msgstr "Những Đặc Biệt về Tầng Lớp" msgid "Change Active Material" -msgstr "Đổi Vật Liệu Hoạt Động" +msgstr "Đổi Nguyên Vật Liệu đang Hoạt Động" msgid "Material Specials" -msgstr "Đồ Đặc Biệt Vật Liệu" +msgstr "Những Đặc Biệt về Nguyên Vật Liệu" msgid "Move to Layer" -msgstr "Di Chuyển Đến Lớp" +msgstr "Di Chuyển đến Tầng Lớp" + + +msgid "Add Extra" +msgstr "Bổ Sung về Thêm" msgid "Select Linked" -msgstr "Chọn Được Nối" +msgstr "Chọn cái Kết Nối" msgid "Align" -msgstr "Sắp Xếp" +msgstr "Canh/Thẳng Hàng" msgid "UV Select Mode" @@ -32497,40 +35079,45 @@ msgstr "Chế Độ Chọn UV" msgid "Show/Hide Faces" -msgstr "Hiện/Ẳn Mặt" +msgstr "Hiện/Ẩn Giấu các Mặt" msgid "Unwrap" msgstr "Mở Gói" +msgctxt "WindowManager" +msgid "Area" +msgstr "Khu Vực" + + msgctxt "Operator" msgid "Add" -msgstr "Cộng" +msgstr "Thêm" msgid "Attribute Specials" -msgstr "Đặc Điểm Đặc Biệt" +msgstr "Chức Năng Đặc Biệt về Thuộc Tính" msgid "Color Attribute Specials" -msgstr "Đặc Điểm Màu Đặc Biệt" +msgstr "Chức Năng Đặc Biệt về Thuộc Tính Màu" msgid "Shape Key Specials" -msgstr "Đồ Đặc Biệt Mẫu Dạng" +msgstr "Những Đặc Biệt của Hình Mẫu" msgid "Vertex Group Specials" -msgstr "Đồ Đặc Biệt Nhóm Đỉnh" +msgstr "Những Đặc Biệt của Nhóm Điểm Đỉnh" msgid "Strip" -msgstr "Đoạn" +msgstr "Dải" msgid "Utilities" -msgstr "Các Dịch Vụ" +msgstr "Thường Trình" msgid "Math" @@ -32538,15 +35125,19 @@ msgstr "Toán" msgid "Primitives" -msgstr "Đồ Cơ Bản" +msgstr "Hình Cơ Bản" + + +msgid "Adjust" +msgstr "Điều Chỉnh" msgid "Keying" -msgstr "Màu Trong Suốt" +msgstr "Khóa Hóa" msgid "Tracking" -msgstr "Theo Đõi" +msgstr "Giám Sát" msgid "Layout" @@ -32554,19 +35145,19 @@ msgstr "Bố Trí" msgid "Converter" -msgstr "Đồ Biến Đổi" +msgstr "Bộ Biến Đổi" msgid "Distort" -msgstr "Méo Hóa" +msgstr "Biến Dạng" msgid "Node" -msgstr "Giao Điểm" +msgstr "Nút" msgid "Attribute" -msgstr "Đặc Điểm" +msgstr "Thuộc Tính" msgid "Read" @@ -32574,15 +35165,24 @@ msgstr "Đọc" msgid "Write" -msgstr "Ghi" +msgstr "Viết" + + +msgctxt "NodeTree" +msgid "Constant" +msgstr "Hằng Số/Đồng Đều/Bất Biến" msgid "Instances" -msgstr "Các Thực Thể" +msgstr "Thực Thể" msgid "Node Color Specials" -msgstr "Đặc Biệt Màu Giao Điểm" +msgstr "Những Đặc Biệt về Màu Nút" + + +msgid "Node Tree Interface Specials" +msgstr "Những Đặc Biệt về Giao Diện Cây Nút" msgid "Add Modifier" @@ -32590,7 +35190,7 @@ msgstr "Thêm Bộ Điều Chỉnh" msgid "Generate" -msgstr "Chế Tạo" +msgstr "Sinh Tạo" msgid "Physics" @@ -32598,19 +35198,19 @@ msgstr "Vật Lý" msgid "Particle Specials" -msgstr "Đặc Biệt Hạt" +msgstr "Những Đặc Biệt của Hệ Thống Hạt" msgid "Frame Rate Presets" -msgstr "Tôc Độ Bức Ảnh Đặt Sẵn" +msgstr "Cấu Hình về Tần Số Khung Hình" msgid "Lineset Specials" -msgstr "Tập Đường Đặc Biệt" +msgstr "Những Đặc Biệt của Bộ Đường Nét" msgid "Effect Strip" -msgstr "Đoạn Hiệu Ứng" +msgstr "Dải Hiệu Ứng" msgctxt "Operator" @@ -32627,7 +35227,7 @@ msgstr "Đặt Thẻ Màu" msgid "Sequencer" -msgstr "Bộ Trình Tự" +msgstr "Trình Phối Hình" msgid "Apply" @@ -32635,7 +35235,16 @@ msgstr "Áp Dụng" msgid "Navigation" -msgstr "Chuyển Hướng" +msgstr "Điều Hướng" + + +msgid "Sequencer Preview" +msgstr "Xem Trước Trình Phối Hình" + + +msgctxt "Operator" +msgid "Retiming" +msgstr "Tính Lại Thời Gian" msgid "Select Channel" @@ -32647,31 +35256,35 @@ msgstr "Chọn Tay Cầm" msgid "Inputs" -msgstr "Ngõ Vào" +msgstr "Đầu Vào" msgid "Lock/Mute" -msgstr "Khóa/Cắt Tiếng" +msgstr "Khóa/Giải Hoạt/Chặn Âm Thanh" msgid "Movie Strip" -msgstr "Đoạn Phim" +msgstr "Dải Phim" + + +msgid "Retiming" +msgstr "Tính Lại Thời Gian" msgid "Cache" -msgstr "Đệm Chứa" +msgstr "Bộ Nhớ Đệm" msgid "Texture Specials" -msgstr "Đặc Biệt Chất Liệu" +msgstr "Những Đặc Biệt của Chất Liệu" msgid "Text to 3D Object" -msgstr "Văn Bản Sang Vật Thể 3D" +msgstr "Văn Bản thành Đối Tượng 3D" msgid "Templates" -msgstr "Bố Cục Mẫu" +msgstr "Khuôn Mẫu" msgid "Open Shading Language" @@ -32699,15 +35312,15 @@ msgstr "Mặc Định" msgid "Export" -msgstr "Xuất" +msgstr "Xuất Khẩu" msgid "External Data" -msgstr "Dữ Liện Ngoài" +msgstr "Dữ Liệu Bên Ngoài" msgid "Import" -msgstr "Nhập" +msgstr "Nhập Khẩu" msgid "New File" @@ -32715,7 +35328,7 @@ msgstr "Tập Tin Mới" msgid "Data Previews" -msgstr "Dự Khán Dữ Liệu" +msgstr "Xem Trước Dữ Liệu" msgid "Recover" @@ -32723,7 +35336,7 @@ msgstr "Hồi Phục" msgid "Help" -msgstr "Giúp" +msgstr "Giúp Đỡ" msgid "" @@ -32734,14 +35347,14 @@ msgid "" " " msgstr "" "\n" -" Định nghĩa của nút bối cảnh Danh Sách Giao Diện. Văn thảo có thể kèm phía trước/kèm phía sau cái này để\n" -" thêm những thao tác của chúng nó vào dang bạ bối cảnh. Nhưng chúng nó phải kiểm tra bối cảnh,\n" -" cho mặt hàng của chúng nó, chỉ vẽ trong một bối cảnh hợp lệ và nút Giao Diện đúng.\n" +" Định nghĩa trình đơn ngữ cảnh nút UI. Tập lệnh có thể bổ sung / chèn trước cái này vào\n" +" để cho thêm thao tác của riêng mình vào trình đơn ngữ cảnh. Song, chúng phải kiểm tra ngữ cảnh, vì vậy\n" +" các trình mục của chúng chỉ vẽ trong một ngữ cảnh hợp lệ và cho các nút đúng mà thôi.\n" " " msgid "List Item" -msgstr "Mặt Hàng Danh Sách" +msgstr "Thành Phần Danh Sách" msgid "" @@ -32759,43 +35372,43 @@ msgstr "" msgid "Presets" -msgstr "Đặt Sẵn" +msgstr "Sắp Đặt Sẵn" msgid "KeyPresets" -msgstr "Phím Đặt Sẵn" +msgstr "Sắp Đặt Sẵn của Bàn Phím" msgid "Save & Load" -msgstr "Lưu & Nhập" +msgstr "Lưu & Nạp" msgid "Assign Material" -msgstr "Chỉ Định Vật Liệu" +msgstr "Ấn Định Nguyên Vật Liệu" msgid "Disable Bone Options" -msgstr "Tắt Tùy Chọn Xương" +msgstr "Tắt các Tùy Chọn về Xương" msgid "Enable Bone Options" -msgstr "Bật Tùy Chọn Xương" +msgstr "Bật các Tùy Chọn về Xương" msgid "Toggle Bone Options" -msgstr "Bật/Tắt Tùy Chọn Xương" +msgstr "Bật/Tắt Tùy Chọn về Xương" msgid "Brush Specials" -msgstr "Đồ Đặc Biệt Bút" +msgstr "Những Đặc Biệt về Đầu Bút" msgid "Enabled Modes" -msgstr "Chế Độ Được Bật" +msgstr "Chế Độ Sử Dụng" msgid "Names" -msgstr "Các Tên" +msgstr "Tên" msgid "Bone Roll" @@ -32803,15 +35416,15 @@ msgstr "Lăn Xương" msgid "Select More/Less" -msgstr "Chọn Nhiều Hơn/Ít Hơn" +msgstr "Tăng/Giảm Lựa Chọn" msgid "Special Characters" -msgstr "Ký Tự Đặc Biệt" +msgstr "Các Ký Tự Đặc Biệt" msgid "Kerning" -msgstr "Cách Giữa Ký Tự" +msgstr "Tinh Chỉnh Khoảng Cách Ký Tự" msgid "Face Data" @@ -32819,35 +35432,35 @@ msgstr "Dữ Liệu Mặt" msgid "Select by Face Strength" -msgstr "Chọn Mặt Bằng Sức Mặt" +msgstr "Chọn theo Cường Độ Mặt" msgid "Set Face Strength" -msgstr "Đặt Sức Mặt" +msgstr "Đặt Cường Độ Mặt" msgid "Select All by Trait" -msgstr "Chọn Hết bằng Đặc Điểm" +msgstr "Chọn Toàn Bộ theo Đặc Điểm" msgid "Select Loops" -msgstr "Chọn Vòng" +msgstr "Chọn Vòng Mạch" msgid "Mesh Select Mode" -msgstr "Chế Độ Chọn Lưới" +msgstr "Chế Độ Chọn Khung Lưới" msgid "Select Similar" -msgstr "Chọn Giống" +msgstr "Chọn Tương Tự" msgid "Face Sets Init" -msgstr "Khởi Động Tập Hợp Mặt" +msgstr "Khởi Thủy các Mặt Ấn Định" msgid "Generate Weights" -msgstr "Chế Tạo Quyền Lượng" +msgstr "Sinh Tạo Trọng lượng" msgid "Hooks" @@ -32855,43 +35468,43 @@ msgstr "Móc" msgid "Add Image" -msgstr "Thêm Ảnh" +msgstr "Thêm Hình Ảnh" msgid "Link/Transfer Data" -msgstr "Liên Kết/Truyền Dữ Liệu" +msgstr "Kết Nối/Thuyên Chuyển Dữ Liệu" msgid "Make Single User" -msgstr "Thành Một Người Dùng" +msgstr "Biến Thành Đơn Người Dùng" msgid "Convert" -msgstr "Biến Đổi" +msgstr "Chuyển Đổi" msgid "Quick Effects" -msgstr "Hiệu Ứng Lẹ" +msgstr "Hiệu Ứng Nhanh" msgid "Relations" -msgstr "Các Quan Hệ" +msgstr "Mối Quan Hệ" msgid "Rigid Body" -msgstr "Thân Rắn" +msgstr "Thân Cứng" msgid "Vertex Group Locks" -msgstr "Ổ Khóa Nhóm Đỉnh" +msgstr "Khóa của Nhóm Điểm Đỉnh" msgid "Propagate" -msgstr "Truyền Dẫn" +msgstr "Lan Truyền" msgid "In-Betweens" -msgstr "Trung Giữa" +msgstr "Bước Trung Gian" msgid "Clear Transform" @@ -32899,51 +35512,51 @@ msgstr "Xóa Biến Hóa" msgid "Proportional Editing Falloff" -msgstr "Sự Giảm Biên Tập Đồng Biến" +msgstr "Dốc Suy Giảm trong Biên Soạn Cân Đối" msgid "Random Mask" -msgstr "Mặt Nạ Ngẫu Nhiên" +msgstr "Màn Chắn Lọc Ngẫu Nhiên" msgid "Automasking" -msgstr "Tự Động Mặt Nạ" +msgstr "Tự Động Chắn Lọc" msgid "Face Sets Edit" -msgstr "Biên Tập Tập Hợp Mặt" +msgstr "Biên Soạn các Mặt Ấn Định" msgid "Mask Edit" -msgstr "Biên Tập Mặt Nạ" +msgstr "Biên Soạn Màn Chắn Lọc" msgid "Sculpt Set Pivot" -msgstr "Khắc: Đặt Điểm Tựa" +msgstr "Điêu Khắc: Đặt Điểm Tựa" msgid "Clone Layer" -msgstr "Bản Sao Lớp" +msgstr "Rập Khuôn Tầng" msgid "UV Mapping" -msgstr "Bản Đồ UV" +msgstr "Ánh Xạ UV" msgid "Align View" -msgstr "Sắp Xếp Màn" +msgstr "Căn Chỉnh Góc Nhìn" msgid "Align View to Active" -msgstr "Sắp Xếp Màn với Hoạt Động" +msgstr "Căn Chỉnh Góc Nhìn vào cái đang Hoạt Động" msgid "Local View" -msgstr "Màn Địa Phương" +msgstr "Góc Nhìn Cục Bộ" msgid "View Regions" -msgstr "Vùng Hiển Thị" +msgstr "Vùng Góc Nhìn" msgid "Viewpoint" @@ -32951,15 +35564,19 @@ msgstr "Điểm Nhìn" msgid "Landmark Controls" -msgstr "Điều Khiển Mốc Bờ" +msgstr "Các Điều Khiển cho Địa Danh" msgid "Lightgroup Sync" -msgstr "Đồng Bộ NhómĐen" +msgstr "Đồng Bộ Hóa Nhóm Ánh Sáng" msgid "Operator Presets" -msgstr "Đặt Sẵn Thao Tác" +msgstr "Sắp Đặt Sẵn của Thao Tác" + + +msgid "Region Toggle" +msgstr "Chuyển Đổi Khu Vực" msgid "Splash" @@ -32967,19 +35584,19 @@ msgstr "Quảng Cáo" msgid "About" -msgstr "Về Blender" +msgstr "Giới Thiệu" msgid "Quick Setup" -msgstr "Cài Đặt Nhanh" +msgstr "Sắp Đặt Nhanh Tróng" msgid "Mesh Edge" -msgstr "Cạnh Lưới" +msgstr "Cạnh của Khung Lưới" msgid "Edge in a Mesh data-block" -msgstr "Cạnh trong một cục dữ liệu Mạng Lưới" +msgstr "Cạnh trong khối dữ liệu của Khung Lưới" msgid "Index of this edge" @@ -32987,51 +35604,67 @@ msgstr "Chỉ số của cạnh này" msgid "Loose" -msgstr "Rời Ra" +msgstr "Rời Rạc" + + +msgid "Edge is not connected to any faces" +msgstr "Cạnh không kết nối với bất kỳ các mặt nào" + + +msgid "Sharp edge for shading" +msgstr "Cạnh sắc nét để tạo bóng" msgid "Freestyle Edge Mark" -msgstr "Ký Hiệu Cạnh Phong Cách Tự Do" +msgstr "Chỉ Dấu Cạnh PCTD" msgid "Edge mark for Freestyle line rendering" -msgstr "Ký hiệu của cảnh cho kết xuất nét Phong Cách Tự Do" +msgstr "Dấu chỉ cạnh để kết xuất nét vẽ Phong Cách Tự Do (PCTD)" msgid "Seam" -msgstr "Vết Sẹo" +msgstr "Đường Khâu" msgid "Seam edge for UV unwrapping" -msgstr "Cạnh vết sẹo cho mở gói UV" +msgstr "Đường khâu dùng để mở gói UV" msgid "Vertex indices" -msgstr "Chỉ số đỉnh" +msgstr "Chỉ số điểm đỉnh" msgid "Mesh Edges" -msgstr "Cạnh Mạng Lưới" +msgstr "Cạnh của Khung Lưới" msgid "Collection of mesh edges" -msgstr "Sưu tập cạnh mạng lưới" +msgstr "Bộ sưu tập các cạnh của khung lưới" msgid "Mesh Loop" -msgstr "Vòng Mạng Lưới" +msgstr "Mạch Lưới" msgid "Loop in a Mesh data-block" -msgstr "Vòng trong cục dữ liệu Mạng Lưới" +msgstr "Vòng mạch trong khối dữ liệu của Khung Lưới" msgid "Bitangent" -msgstr "Nhị Tiếp Tuyến" +msgstr "Song Tiếp Tuyến" + + +msgid "Bitangent vector of this vertex for this face (must be computed beforehand using calc_tangents, use it only if really needed, slower access than bitangent_sign)" +msgstr "Véctơ song tiếp tuyến của điểm đỉnh này cho Mặt này (phải được tính toán trước bằng cách sử dụng hàm calc_tangents, chỉ sử dụng nó nếu thực sự cần thiết mà thôi, truy cập chậm hơn hàm bitangent_sign)" msgid "Bitangent Sign" -msgstr "Dấu Nhị Tiếp Tuyến" +msgstr "Dấu Song Tiếp Tuyến" + + +msgid "Sign of the bitangent vector of this vertex for this face (must be computed beforehand using calc_tangents, bitangent = bitangent_sign * cross(normal, tangent))" +msgstr "Dấu của véctơ song tiếp tuyến (bitangent) cho điểm đỉnh này đối với Mặt này (phải được tính toán trước bằng cách sử dụng hàm calc_tangents, bitangent = bitangent_sign * cross(pháp tuyến, tiếp tuyến))" msgid "Edge index" @@ -33039,55 +35672,59 @@ msgstr "Chỉ số cạnh" msgid "Index of this loop" -msgstr "Chỉ số của vòng này" +msgstr "Chỉ số của vòng mạch này" + + +msgid "Local space unit length tangent vector of this vertex for this face (must be computed beforehand using calc_tangents)" +msgstr "Vectơ tiếp tuyến, đơn vị chiều dài trong không gian cục bộ, của điểm đỉnh này, cho mặt này (phải được tính toán trước bằng cách sử dụng hàm calc_tangents)" msgid "Vertex index" -msgstr "Chỉ số đỉnh" +msgstr "Chỉ số điểm đỉnh" msgid "Mesh Vertex Color" -msgstr "Màu Đỉnh Lưới" +msgstr "Màu Điểm Đỉnh của Khung Lưới" msgid "Vertex loop colors in a Mesh" -msgstr "Màu vòng đỉnh trong một Mạng Lưới" +msgstr "Màu của vòng mạch điểm đỉnh trong Khung Lưới" msgid "Color in sRGB color space" -msgstr "Màu trong không gian sRGB" +msgstr "Màu trong không gian màu sRGB" msgid "Mesh Vertex Color Layer" -msgstr "Lớp Màu Đỉnh Lưới" +msgstr "Tầng Màu cho Điểm Đỉnh của Khung Lưới" msgid "Layer of vertex colors in a Mesh data-block" -msgstr "Lớp của màu đỉnh trong một cục dữ liệu Mạng Lưới" +msgstr "Tầng màu cho điểm đỉnh trong khối dữ liệu của Khung Lưới" msgid "Sets the layer as active for display and editing" -msgstr "Đặt lớp là hoạt động cho hiển thị và biên tập" +msgstr "Đặt tầng là đang hoạt động để có thể hiển thị và biên soạn" msgid "Active Render" -msgstr "Kết Xuất Hoạt Động" +msgstr "Năng Động Kết Xuất" msgid "Sets the layer as active for rendering" -msgstr "Đặt lớp là hoạt động cho kết xuất" +msgstr "Đặt tầng là đang hoạt động để có thể kết xuất" msgid "Name of Vertex color layer" -msgstr "Tên của lớp màu Đỉnh" +msgstr "Tên của tầng màu sắc Điểm Đỉnh" msgid "Mesh Loop Triangle" -msgstr "Tam Giác Vòng Mạng Lưới" +msgstr "Tam Giác của Mạch Lưới" msgid "Tessellated triangle in a Mesh data-block" -msgstr "Tam Giác được tam giác hóa trong một cục dữ liệu Mạng Lưới" +msgstr "Tam giác phân lưới tổ ong trong khối dữ liệu của Khung Lưới" msgid "Triangle Area" @@ -33099,111 +35736,147 @@ msgstr "Diện tích của tam giác này" msgid "Index of this loop triangle" -msgstr "Chỉ số của vòng tam giác này" +msgstr "Chỉ số của mạch lưới tam giác này" msgid "Indices of mesh loops that make up the triangle" -msgstr "Các chỉ số của các vòng mạng lưới được xây đưng tam giác" +msgstr "Chỉ số của những mạch lưới tạo nên tam giác" msgid "Material slot index of this triangle" -msgstr "Chỉ số khe vật liệu của tam giác này" +msgstr "Chỉ số khe nguyên vật liệu của tam giác này" msgid "Triangle Normal" -msgstr "Pháp Tuyến Tam Giác" +msgstr "Pháp Tuyến của Tam Giác" msgid "Local space unit length normal vector for this triangle" -msgstr "Vectơ pháp tuyến không gian địa phương đơn vị hóa cho tam giác này" +msgstr "Véctơ pháp tuyến, đơn vị chiều dài trong không gian cục bộ, cho tam giác này" msgid "Polygon" msgstr "Đa Giác" +msgid "Index of mesh face that the triangle is a part of" +msgstr "Chỉ số của Mặt khung lưới mà hình tam giác là một phần của nó" + + msgid "Split Normals" -msgstr "Chẻ Pháp Tuyến" +msgstr "Pháp Tuyến Tách Phân" msgid "Indices of triangle vertices" -msgstr "Chỉ số của các đỉnh tam giác" +msgstr "Chỉ số của các điểm đỉnh tam giác" msgid "Mesh Loop Triangles" -msgstr "Tam Giác Vòng Mạng Lưới" +msgstr "Tam Giác của Mạch Lưới" msgid "Mesh Loops" -msgstr "Vòng Mạng Lưới" +msgstr "Vòng Mạnh của Khung Lưới" msgid "Collection of mesh loops" -msgstr "Sưu tập vòng mạng lưới" +msgstr "Bộ sưu tập các vòng khung lưới" msgid "Mesh Normal Vector" -msgstr "Vectơ Pháp Tuyến Mạng Lưới" +msgstr "Lưới Vector Pháp Tuyến" msgid "Vector in a mesh normal array" -msgstr "Vectơ trong một mảng pháp tuyến mạng lưới" +msgstr "Vectơ trong một mảng pháp tuyến khung lưới" msgid "Mesh Polygon" -msgstr "Đa Giác Mạng Lưới" +msgstr "Đa Giác của Khung Lưới" msgid "Polygon in a Mesh data-block" -msgstr "Đa giác trong một cục dữ liệu Lưới" +msgstr "Đa giác trong khối dữ liệu của khung lưới" msgid "Polygon Area" -msgstr "Điện Tích Đa Giác" +msgstr "Diện Tích của Đa Giác" + + +msgid "Read only area of this face" +msgstr "Vùng duy đọc của Mặt này" msgid "Polygon Center" msgstr "Trung Tâm Đa Giác" +msgid "Center of this face" +msgstr "Trung tâm của mặt này" + + +msgid "Index of this face" +msgstr "Chỉ số của mặt này" + + msgid "Loop Start" -msgstr "Đầu Vòng" +msgstr "Khởi Đầu Vòng Mạch" + + +msgid "Index of the first loop of this face" +msgstr "Chỉ số vòng mạch đầu tiên của mặt này" msgid "Loop Total" -msgstr "Tổng Vòng" +msgstr "Tổng Số Vòng Mạch" + + +msgid "Number of loops used by this face" +msgstr "Số vòng mạch được mặt này sử dụng" + + +msgid "Material slot index of this face" +msgstr "Chỉ số khe vật liệu của mặt này" msgid "Polygon Normal" msgstr "Pháp Tuyến Đa Giác" +msgid "Local space unit length normal vector for this face" +msgstr "Véctơ pháp tuyến, đơn vị chiều dài trong không gian cục bộ, của mặt này" + + msgid "Freestyle Face Mark" -msgstr "Ký Hiệu Mặt Phong Cách Tự Do" +msgstr "Dấu Chỉ Mặt PCTD" msgid "Face mark for Freestyle line rendering" -msgstr "Ký hiệu mặt cho kết xuất đường phong cách tự do" +msgstr "Dấu chỉ Mặt dành cho kết xuất đường nét Phong Cách Tự Do (PCTD)" msgid "Mesh Polygons" -msgstr "Đa Giác Mạng Mạng Lưới" +msgstr "Đa Giác của Khung Lưới" msgid "Collection of mesh polygons" -msgstr "Sưu tập đa giác mạng lưới" +msgstr "Bộ sưu tập các đa giác của khung lưới" msgid "Active Polygon" -msgstr "Đa Giác Hoạt Động" +msgstr "Đa Giác đang Hoạt Động" + + +msgid "The active face for this mesh" +msgstr "Mặt đang hoạt động của khung lưới này" msgid "Skin Vertex" -msgstr "Đỉnh Da" +msgstr "Điểm Đỉnh của Da" msgid "Per-vertex skin data for use with the Skin modifier" -msgstr "Dữ liệu da từng đỉnh cho dùng với bộ điều chỉnh Da" +msgstr "Dữ liệu về da của mối điểm đỉnh để sử dụng với bộ điều chỉnh da" msgid "Radius of the skin" @@ -33211,83 +35884,91 @@ msgstr "Bán kính của da" msgid "If vertex has multiple adjacent edges, it is hulled to them directly" -msgstr "Nếu đỉnh có nhiều cạnh kề, nó được vỏ hóa với chúng nó trực tiếp" +msgstr "Nếu điểm đỉnh có nhiều cạnh nằm kề, nó sẽ bị vỏ hóa với chúng nó trực tiếp" msgid "Root" -msgstr "Rễ" +msgstr "Gốc/Phép Căn" msgid "Vertex is a root for rotation calculations and armature generation, setting this flag does not clear other roots in the same mesh island" -msgstr "Đỉnh là rễ cho tính toán xoay và chế tạo cốt, đặt cờ này không xóa rễ khác trong cùng đảo mạng lưới" +msgstr "Điểm đỉnh là gốc cho các tính toán về sự xoay chiều và sự sinh tạo khung cốt. Việc bật cờ hiệu này không xóa các gốc khác trong cùng hải đảo của khung lưới" msgid "Mesh Skin Vertex Layer" -msgstr "Lớp Đỉnh Da Mạn Lưới" +msgstr "Tầng Điểm Đỉnh Da của Khung Lưới" msgid "Name of skin layer" -msgstr "Tên của lớp da" +msgstr "Tên của tầng da" msgid "Mesh Visualize Statistics" -msgstr "Thống Kê Hiển hị Mạng Lưới" +msgstr "Thống Kê về sự Hình Dung Khung Lưới" msgid "Distort Max" -msgstr "Cực Đại Méo Hóa" +msgstr "Độ Biến Dạng Tối Đa" msgid "Maximum angle to display" -msgstr "Góc cực đại cho hiển thị" +msgstr "Góc độ tối đa để hiển thị" msgid "Distort Min" -msgstr "Cực Tiểu Méo Hóa" +msgstr "Độ Biến Dạng Tối Thiểu" msgid "Minimum angle to display" -msgstr "Góc cực tiểu cho hiển thị" +msgstr "Góc độ tối thiểu để hiển thị" msgid "Overhang Max" -msgstr "Cực Đại Nhô Ra" +msgstr "Độ Nhô Ra Tối Đa" msgid "Overhang Min" -msgstr "Cực Tiểu Nhô Ra" +msgstr "Độ Nhô Ra Tối Thiểu" + + +msgid "Sharpness Max" +msgstr "Tối Đa của Độ Sắc Nét" + + +msgid "Sharpness Min" +msgstr "Tối Thiểu của Độ Sắc Nét" msgid "Thickness Max" -msgstr "Cực Đại Bề Dày" +msgstr "Độ Dày Tối Đa" msgid "Maximum for measuring thickness" -msgstr "Cực đại cho đo bề dày" +msgstr "Độ đo chiều dày tối đa" msgid "Thickness Min" -msgstr "Cực Tiểu Bề Dày" +msgstr "Độ Dày Tối Thiểu" msgid "Minimum for measuring thickness" -msgstr "Cực tiểu cho đo bề dày" +msgstr "Độ đo chiều dày tối thiểu" msgid "Samples" -msgstr "Mẫu Vật" +msgstr "Lượng Mẫu Vật" msgid "Number of samples to test per face" -msgstr "Số lượng mẫu vật để kiểm tra cho mỗi mặt" +msgstr "Số lượng mẫu vật để thẩm tra đối với mỗi Mặt" msgid "Type of data to visualize/check" -msgstr "Loại dữ liệu cho hiển thị/kiểm tra" +msgstr "Thể loại dữ liệu để hình dung/kiểm tra" msgid "Overhang" -msgstr "Nhô Ra" +msgstr "Nhô Ra Lơ Lửng" msgid "Intersect" @@ -33295,11 +35976,19 @@ msgstr "Giao Cắt" msgid "Distortion" -msgstr "Sự Méo Hóa" +msgstr "Biến Dạng" + + +msgid "Mesh UV Layer" +msgstr "Tầng Lớp UV của Khung Lưới" + + +msgid "(Deprecated) Layer of UV coordinates in a Mesh data-block" +msgstr "(Lỗi Thời) Tầng lớp tọa độ UV trong khối dữ liệu Khung Lưới" msgid "UV Pinned" -msgstr "Đóng Đinh UV" +msgstr "UV được Ghim Xuống" msgid "UV Select" @@ -33307,79 +35996,115 @@ msgstr "Chọn UV" msgid "UV Edge Select" -msgstr "Chọn Cạnh UV" +msgstr "Lựa Chọn Cạnh UV" msgid "Set the map as active for display and editing" -msgstr "Đặt bản đồ là hoạt động cho hiển thị và biên tập" +msgstr "Đặt ánh xạ là đang hoạt động để có thể hiển thị và biên soạn" msgid "Active Clone" -msgstr "Bản Sao Hoạt Động" +msgstr "Rập Khuôn Hoạt Động" msgid "Set the map as active for cloning" -msgstr "Đặt bản đồ hoạt động cho bản sao" +msgstr "Đặt ánh xạ ở tình trạng hoạt động để có thể rập khuôn" msgid "Set the UV map as active for rendering" -msgstr "Đặt bản đồ UV là hoạt động cho kết xuất" +msgstr "Đặt ánh xạ UV là đang hoạt động để kết xuất" + + +msgid "MeshUVLoop (Deprecated)" +msgstr "MeshUVLoop (lỗi thời)" + + +msgid "Deprecated, use 'uv', 'vertex_select', 'edge_select' or 'pin' properties instead" +msgstr "Đã lỗi thời rồi, xin hãy sử dụng các tính chất 'uv', 'vertex_select', 'edge_select' hoặc 'pin' thay vì nhé" + + +msgid "UV Edge Selection" +msgstr "Lựa Chọn Cạnh UV" + + +msgid "Selection state of the edge in the UV editor" +msgstr "Trạng thái lựa chọn của cạnh trong trình biên soạn UV" msgid "Name of UV map" -msgstr "Tên của bản đồ UV" +msgstr "Tên của ánh xạ UV" + + +msgid "UV Pin" +msgstr "Ghim UV" + + +msgid "UV pinned state in the UV editor" +msgstr "Trạng thái ghim UV trong trình biên soạn UV" + + +msgid "UV coordinates on face corners" +msgstr "Tọa độ UV trên các góc Mặt" + + +msgid "UV Vertex Selection" +msgstr "Lựa Chọn Điểm Đỉnh UV" + + +msgid "Selection state of the face corner the UV editor" +msgstr "Trạng thái lựa chọn của góc Mặt trình biên soạn UV" msgid "Mesh Vertex" -msgstr "Đỉnh Mạng Lưới" +msgstr "Điểm Đỉnh của Khung Lưới" msgid "Vertex in a Mesh data-block" -msgstr "Đỉnh trong một cục dữ liệu mạng Lưới" +msgstr "Điểm đỉnh trong khối dữ liệu của Khung Lưới" msgid "Weights for the vertex groups this vertex is member of" -msgstr "Quyền lượng của các nhóm đỉnh thì đỉnh này được làm nhân viên" +msgstr "Trọng lượng dành cho các nhóm điểm đỉnh mà điểm đỉnh này là một thành viên của nó" msgid "Index of this vertex" -msgstr "Chỉ số của đỉnh này" +msgstr "Chỉ số của điểm đỉnh này" msgid "Vertex Normal" -msgstr "Pháp Tuyến Đỉnh" +msgstr "Pháp Tuyến Điểm Đỉnh" msgid "Undeformed Location" -msgstr "Vị Trí Không Bị Méo Hóa" +msgstr "Vị Trí Không bị Biến Dạng" msgid "For meshes with modifiers applied, the coordinate of the vertex with no deforming modifiers applied, as used for generated texture coordinates" -msgstr "Cho mạng lưới có bộ điều chỉnh được áp dụng, tọa độ của đỉnh chưa áp dụng bộ điều chỉnh méo hóa nào, được dùng cho chế táo tọa độ chất liệu" +msgstr "Dành cho những khung lưới có các bộ điều chỉnh đã được áp dụng, đây là tọa độ của những điểm đỉnh không có bộ điều chỉnh biến dạng nào áp dụng vào cả, như được sử dụng cho các tọa độ chất liệu do máy sinh tạo" msgid "Mesh Vertices" -msgstr "Đỉnh Mạng Lưới" +msgstr "Điểm Đỉnh Khung Lưới" msgid "Collection of mesh vertices" -msgstr "Sưu tập đỉnh mạng lưới" +msgstr "Bộ sưu tập các điểm đỉnh khung lưới" msgid "Metaball Elements" -msgstr "Phần Tử Siêu Cầu" +msgstr "Các Phần Tử Siêu Cầu" msgid "Collection of metaball elements" -msgstr "Sưu tập phần tử siêu cầu" +msgstr "Bộ sưu tập các phần tử siêu cầu" msgid "Active Element" -msgstr "Phần Tử Hoạt Động" +msgstr "Phần Tử đang Hoạt Động" msgid "Last selected element" -msgstr "Phần tử cuối được chọn" +msgstr "Phần tử được chọn cuối cùng" msgid "Metaball Element" @@ -33387,35 +36112,39 @@ msgstr "Phần Tử Siêu Cầu" msgid "Blobby element in a metaball data-block" -msgstr "Phần tử cộm trong một cục dữ liệu siêu cầu" +msgstr "Phần tử viên tròn trong khối dữ liệu Siêu Cầu" msgid "Hide element" -msgstr "Ẩn phần tử" +msgstr "Ẩn giấu thành phần" msgid "Normalized quaternion rotation" -msgstr "Xoay quaternion đơn vị hóa" +msgstr "Bình thường hóa sự xoay chiều Quatenion" msgid "Select element" -msgstr "Chọn phần tử" +msgstr "Lựa chọn phần tử" msgid "Size X" -msgstr "Kích Cỡ X" +msgstr "Kích Thước X" msgid "Size of element, use of components depends on element type" -msgstr "Kích cỡ phần tử, dùng thành phần tử tùy loại phần tử" +msgstr "Kích thước phần tử, sự sử dụng các thành phần tùy thuộc vào thể loại của yếu tố" msgid "Size Z" -msgstr "Kích Cỡ Z" +msgstr "Kích Thước Z" msgid "Stiffness defines how much of the element to fill" -msgstr "Dùng độ cứng để xác định tô đầy bao nhiêu của phần tử" +msgstr "Dùng độ cứng để xác định lượng bao phủ thành phần là bao nhiêu" + + +msgid "Metaball type" +msgstr "Kiểu siêu cầu" msgid "Ball" @@ -33423,187 +36152,195 @@ msgstr "Hình Cầu" msgid "Ellipsoid" -msgstr "Hình Cầu Elip" +msgstr "Hình Ellipsoid" msgid "Set metaball as negative one" -msgstr "Đặt siêu cầu làm âm" +msgstr "Đặt siêu cầu làm âm hình" msgid "Scale Stiffness" -msgstr "Phóng To Độ Cứng" +msgstr "Tỷ Lệ Hóa Độ Cứng" msgid "Scale stiffness instead of radius" -msgstr "Phóng to độ cứng thay thế bán kính" +msgstr "Đổi tỷ lệ độ cứng thay vì bán kính" msgid "Modifier affecting the geometry data of an object" -msgstr "Bộ điều chỉnh ảnh hướng dữ liệu hình dạng của một vật thể" +msgstr "Bộ điều chỉnh ảnh hưởng dữ liệu hình dạng của một đối tượng" + + +msgid "Execution Time" +msgstr "Thời Gian Thi Hành" + + +msgid "Time in seconds that the modifier took to evaluate. This is only set on evaluated objects. If multiple modifiers run in parallel, execution time is not a reliable metric" +msgstr "Thời gian tính bằng giây mà bộ điều chỉnh sử dụng để tính toán. Cái này chỉ được đặt trên các đối tượng được tính toán mà thôi. Nếu nhiều bộ điều chỉnh cùng chạy song song một lúc thì thời gian thi hành không phải là thước đo đáng tin cậy" msgid "The active modifier in the list" -msgstr "Bộ điều chỉnh hoạt động trong danh sách" +msgstr "Bộ điều chỉnh đang hoạt động trong bảng danh sách" msgid "On Cage" -msgstr "Trên Lồng" +msgstr "Trên Khung Lồng" msgid "Adjust edit cage to modifier result" -msgstr "Chỉnh lồng biên tập thành giống kết qủa của bộ điều chỉnh" +msgstr "Điều chỉnh khung biên soạn thành kết quả của bộ điều chỉnh" msgid "Data Transfer" -msgstr "Truyền Dữ Liệu" +msgstr "Thuyên Chuyển Dữ Liệu" msgid "Transfer several types of data (vertex groups, UV maps, vertex colors, custom normals) from one mesh to another" -msgstr "Truyền vài loại dư liệu (nhóm đỉnh, bản đồ UV, màu đỉnh, pháp tuyến tùy chọn) từ một mạng lưới đến một mạng lưới khác" +msgstr "Thuyên chuyển một số kiểu dữ liệu (nhóm điểm đỉnh, ánh xạ UV, màu điểm đỉnh, pháp tuyến tùy chỉnh) từ một khung lưới sang một cái khác" msgid "Mesh Cache" -msgstr "Đệm Chứa Mạng Lưới" +msgstr "Bộ Nhớ Đệm Khung Lưới" msgid "Deform the mesh using an external frame-by-frame vertex transform cache" -msgstr "Méo hóa mạng lưới bằng dùng một dệm chứa ở ngoài, biến hóa đỉnh từng bức ảnh" +msgstr "Biến dạng khung lưới dùng một một bộ nhớ đệm biến hóa điểm đỉnh theo từng khung hình một (frame-by-frame) bên ngoài" msgid "Mesh Sequence Cache" -msgstr "Đệm Chứa Trình Tự Mạng Lưới" +msgstr "Bộ Nhớ Đệm Trình Tự Khung Lưới" msgid "Deform the mesh or curve using an external mesh cache in Alembic format" -msgstr "Méo hóa mạng lưới hay đường cong bằng dùng một dệm chứa ở ngoài, dạng Alembic" +msgstr "Biến dạng khung lưới hoặc đường cong dùng một bộ nhớ đệm trong định dạng Alembic bên ngoài" msgid "Normal Edit" -msgstr "Biên Tập Pháp Tuyến" +msgstr "Biên Soạn Pháp Tuyến" msgid "Modify the direction of the surface normals" -msgstr "Sửa đổi hướng của pháp tuyến bề mặt" +msgstr "Sửa đổi chiều hướng của pháp tuyến bề mặt" msgid "Weighted Normal" -msgstr "Pháp Tuyến Được Quyền Lượng" +msgstr "Pháp Tuyến Cân Trọng" msgid "Modify the direction of the surface normals using a weighting method" -msgstr "Sửa đổi hướng của pháp tuyến bề mặt bằng một phương pháp quyền lượng" +msgstr "Sửa đổi chiều hướng của các pháp tuyến bề mặt dùng phương pháp cân trọng" msgid "UV Project" -msgstr "Chiếu UV" +msgstr "Phóng Chiếu UV" msgid "Project the UV map coordinates from the negative Z axis of another object" -msgstr "Chiếu tọa độ bản đồ UV từ trục Z âm của một vật thể khác" +msgstr "Phóng chiếu các tọa độ ánh xạ UV từ trục Z âm của một đối tượng khác" msgid "UV Warp" -msgstr "Méo Hóa UV" +msgstr "Kéo UV" msgid "Transform the UV map using the difference between two objects" -msgstr "Biến hóa bản đồ UV bằng dùng sự khác biệt giữa hai vật thể" +msgstr "Biến hóa bản đồ UV dùng khoảng chênh lệch giữa hai đối tượng" msgid "Vertex Weight Edit" -msgstr "Biên Tập Quyền Lượnng Đỉnh" +msgstr "Biên Soạn Trọng Lượng Điểm Đỉnh" msgid "Modify of the weights of a vertex group" -msgstr "Biến đổi quyền lượng của một nhóm đỉnh" +msgstr "Sửa đổi trọng lượng của một nhóm điểm đỉnh" msgid "Vertex Weight Mix" -msgstr "Pha Trộn Quyền Lượng Đỉnh" +msgstr "Hòa Trộn Trọng Lượng Điểm Đỉnh" msgid "Mix the weights of two vertex groups" -msgstr "Pha trộn quyền lượng của hai nhóm đỉnh" +msgstr "Hòa trộn trọng lượng của hai nhóm điểm đỉnh" msgid "Set the vertex group weights based on the distance to another target object" -msgstr "Đặt quyền lượng của nhóm đỉnh tùy khoảng cách đến một vật thể mục tiêu khác" +msgstr "Đặt trọng lượng nhóm điểm đỉnh dựa trên khoảng cách tới một đối tượng đích khác" msgid "Create copies of the shape with offsets" -msgstr "Chế tạo bàn sao của hình dạng mà có dịch" +msgstr "Kiến Tạo các bản sao của hình dạng với dịch chuyển" msgid "Bevel" -msgstr "Cạnh Tròn" +msgstr "Bo Tròn" msgid "Generate sloped corners by adding geometry to the mesh's edges or vertices" -msgstr "Chế tạo góc gíac có dốc bằng thêm hình dạng vào cạnh hay đỉnh của mạng lưới" +msgstr "Sinh tạo góc vát (dốc nghiêng) bằng cách cho thêm hình học vào các cạnh hoặc điểm đỉnh của khung lưới" msgid "Use another shape to cut, combine or perform a difference operation" -msgstr "Dùng một hình dạng khác để cắt, gồm hay thực hành một thao tác sự khác biệt khác" +msgstr "Sử dụng một hình dạng khác để cắt ra, kết hợp lại hoặc thi hành thao tác tính sự chênh lệch (hiệu) (difference)" msgid "Cause the faces of the mesh object to appear or disappear one after the other over time" -msgstr "Làm các mặt của vật thể mạng lưới xuất hiện hay biến mất từng cái qua thời gian" +msgstr "Gây cho các mặt của đối tượng khung lưới ẩn hoặc hiện, cái nọ tiếp cái kia, theo thời gian" msgid "Decimate" -msgstr "Chẻ Cắt" +msgstr "Tiêu Hao" msgid "Reduce the geometry density" -msgstr "Giảm tỉ trọng hình dạng" +msgstr "Thuyên giảm độ trù mật (đông đúc/dày đặc) của hình học" msgid "Edge Split" -msgstr "Chia Cạnh" +msgstr "Phân Tách Cạnh" msgid "Split away joined faces at the edges" -msgstr "Chẻ các mặt được kết nối tại cạnh" +msgstr "Phân tách các mặt đã hội nhập tại các cạnh" msgid "Geometry Nodes" -msgstr "Giao Điểm Hình Dạng" +msgstr "Các Nút Hình Học" msgid "Dynamically hide vertices based on a vertex group or armature" -msgstr "Ản đỉnh kiểu động lý tùy một nhóm đỉnh hay cốt" +msgstr "Ẩn giấu điểm đỉnh một cách năng động dựa trên một nhóm điểm đỉnh hoặc khung cốt" msgid "Mirror along the local X, Y and/or Z axes, over the object origin" -msgstr "Gương qua trục X, Y, và/hay Z địa phương, trên góc tọa độ của vật thể" +msgstr "Phản chiếu đối xứng dọc theo các trục X, Y và/hoặc Z địa phương, đảo chiều tại tọa độ gốc của đối tượng" msgid "Mesh to Volume" -msgstr "Mạng Lưới Sang Thể Tích" +msgstr "Khung Lưới thành Thể Tích" msgid "Multiresolution" -msgstr "Đa Độ Phân Giải" +msgstr "Đa Phân Giải" msgid "Subdivide the mesh in a way that allows editing the higher subdivision levels" -msgstr "Phân hóa mạng lưới bằng một phương pháp sẽ cho biên tập các mức phân hóa cao hơn" +msgstr "Phân hóa khung lưới theo phương pháp cho phép biên soạn mức phân hóa cao hơn" msgid "Remesh" -msgstr "Làm Lại Mạng Lưới" +msgstr "Kiến Tạo Lại Khung Lưới" msgid "Generate new mesh topology based on the current shape" -msgstr "Chế tạo mạng lưới có hình dạng học mới bằng cơ sở hình dạng hiện tại" +msgstr "Sinh tạo cấu trúc liên kết khung lưới mới dựa trên hình dạng hiện tại" msgid "Screw" -msgstr "Đinh Ốc" +msgstr "Đinh Vít" msgid "Lathe around an axis, treating the input mesh as a profile" -msgstr "Quay quanh một trục, áp dụng mạng lưới ngõ vào làm một mặt cắt" +msgstr "Tiện quanh một trục, coi khung lưới cung cấp như một hình khuôn/mặt cắt" msgid "Skin" @@ -33611,23 +36348,23 @@ msgstr "Da" msgid "Create a solid shape from vertices and edges, using the vertex radius to define the thickness" -msgstr "Chế tạo một hình dạng rắn từ đỉnh và cạnh, dùng bán kính đỉnh để chỉ định bề dày" +msgstr "Kiến Tạo hình dạng lập thể (khối đặc) từ các điểm đỉnh và các cạnh, dùng bán kính điểm đỉnh để xác định độ dày" msgid "Solidify" -msgstr "Rắn Hóa" +msgstr "Đắp Dày" msgid "Make the surface thick" -msgstr "Làm bề mặt có bề dày" +msgstr "Làm cho bề mặt dày lên" msgid "Subdivision Surface" -msgstr "Phân Hóa Bề Mặt" +msgstr "Bề Mặt Phân Hóa" msgid "Split the faces into smaller parts, giving it a smoother appearance" -msgstr "Chẻ các mặt thành miến nhỏ hơn, cho nó xem mịn hình" +msgstr "Tách phân các mặt thành nhiều phần nhỏ hơn, làm cho diện mạo trở nên mịn màng hơn" msgid "Triangulate" @@ -33635,119 +36372,119 @@ msgstr "Tam Giác Hóa" msgid "Convert all polygons to triangles" -msgstr "Biến đổi tất cả đa giác sang tam giác" +msgstr "Chuyển đổi toàn bộ các đa giác thành tam giác" msgid "Volume to Mesh" -msgstr "Thể Tích Sang Mạng Lưới" +msgstr "Thể Tích sang Khung Lưới" msgid "Weld" -msgstr "Hàn" +msgstr "Hàn Gắn" msgid "Find groups of vertices closer than dist and merge them together" -msgstr "Tìm các nhóm đỉnh gần hơn khoảng cách và gồm với nhau" +msgstr "Tìm các nhóm điểm đỉnh nằm gần hơn so với khoảng cách và hợp nhất chúng lại với nhau" msgid "Wireframe" -msgstr "Khung Sợi Dây" +msgstr "Khung Dây" msgid "Convert faces into thickened edges" -msgstr "Biến đổi các mặt sang cạnh dày" +msgstr "Chuyển đổi các mặt thành các cạnh có độ dày" msgid "Deform the shape using an armature object" -msgstr "Méo hóa hình dạng bằng sử dụng vật thể cốt" +msgstr "Bóp méo hình dạng dùng một đối tượng khung cốt" msgid "Cast" -msgstr "Đúc" +msgstr "Đúc Khuôn/Ngả Bóng" msgid "Shift the shape towards a predefined primitive" -msgstr "Dời hình dạng đến một hình dạng cơ bản đã có xạc định" +msgstr "Dịch hình dạng về phía một hình cơ bản định trước" msgid "Bend the mesh using a curve object" -msgstr "Bể cong mạng lưới bằng sử dụng một vật thể đường cong" +msgstr "Uốn cong khung lưới dùng một đối tượng đường cong" msgid "Displace" -msgstr "Dịch" +msgstr "Dời Hình" msgid "Offset vertices based on a texture" -msgstr "Dịch đỉnh tùy một chất liệu" +msgstr "Dịch chuyển các điểm đỉnh dựa trên một chất liệu" msgid "Deform specific points using another object" -msgstr "Méo hóa điểm được xác định bằng dùng một vật thể khác" +msgstr "Biến dạng các điểm chỉ định dùng một đối tượng khác" msgid "Laplacian Deform" -msgstr "Méo Hóa Laplace" +msgstr "Biến Dạng Kiểu Laplace" msgid "Deform based a series of anchor points" -msgstr "Méo hóa tùy một dãy điểm neo" +msgstr "Bóp méo dựa trên một loạt các điểm neo chốt" msgid "Deform using the shape of a lattice object" -msgstr "Méo hóa bằng dùng hình dạng của một vật thể lưới rào" +msgstr "Bóp méo dùng hình dạng của một đối tượng lưới rào" msgid "Mesh Deform" -msgstr "Méo Hóa Mạng Lưới" +msgstr "Biến Dạng Khung Lưới" msgid "Deform using a different mesh, which acts as a deformation cage" -msgstr "Méo hóa bằng dùng một mạng lưới khác, thì được làm một lồng méo hóa" +msgstr "Bóp méo dùng một khung lưới khác, tức cái hành xử như một khung lồng để biến dạng" msgid "Simple Deform" -msgstr "Méo Hóa Đơn Giản" +msgstr "Biến Dạng Đơn Giản" msgid "Deform the shape by twisting, bending, tapering or stretching" -msgstr "Méo hóa hình dạng bằng xoắn, bể cong, nến hay kéo dài." +msgstr "Bóp méo hình dạng bằng cách xoắn vặn, uốn cong, vuốt thon hoặc kéo giãn" msgid "Smooth the mesh by flattening the angles between adjacent faces" -msgstr "Mịn hóa mạng lưới bằng bằng phẳng hóa góc giữa các mặt kề" +msgstr "Làm mịn khung lưới bằng cách làm bẹp những góc nằm giữa các mặt kề cạnh" msgid "Smooth Corrective" -msgstr "Chỉnh Sửa Mịn" +msgstr "Làm Mịn để Sửa Sai" msgid "Smooth the mesh while still preserving the volume" -msgstr "Mịn hóa mạng lưới nhưng giữ nguyên thể tích" +msgstr "Làm mịn khung lưới trong khi vẫn duy trì thể tích" msgid "Smooth Laplacian" -msgstr "LaPlace Mịn" +msgstr "Làm Mịn Laplacian" msgid "Reduce the noise on a mesh surface with minimal changes to its shape" -msgstr "Giảm huyên náo trên một mạng lưới nhưng đổi hình dạng của nó ít nhất có thể" +msgstr "Thuyên giảm nhiễu trên bề mặt khung lưới với sự thay đổi tối thiểu trong hình dạng của nó" msgid "Surface Deform" -msgstr "Méo Hóa Bề Mặt" +msgstr "Biến Dạng Bề Mặt" msgid "Transfer motion from another mesh" -msgstr "Truyền chuyển động từ một mạn lưới khác" +msgstr "Thuyên chuyển sự chuyển động từ một khung lưới khác" msgid "Warp" -msgstr "Bể Cong" +msgstr "Uốn Oằn/Kéo" msgid "Warp parts of a mesh to a new location in a very flexible way thanks to 2 specified objects" -msgstr "Bể cong bộ phận của một mạng lưới đến một vị trí mới bằng một phương pháp rất dẻo bởi vì hai vật thể được xác định" +msgstr "Uốn oằn các phần của khung lưới tới một vị trí mới một cách linh động, nhờ hai đối tượng chỉ định" msgid "Wave" @@ -33755,27 +36492,27 @@ msgstr "Sóng" msgid "Adds a ripple-like motion to an object's geometry" -msgstr "Thêm một chuyển động sóng đến hình dạng của một vật thể" +msgstr "Cho thêm chuyển động giống sự gợn sóng lăn tăn vào một hình học đối tượng" msgid "Volume Displace" -msgstr "Dịch Thể Tích" +msgstr "Dời Hình Thể Tích" msgid "Deform volume based on noise or other vector fields" -msgstr "Méo hóa thể tích tùy huyên náo hoặc những trường vectơ khác" +msgstr "Biến dạng thể tích dựa trên nhiễu hoặc các trường véctơ khác" msgid "Dynamic Paint" -msgstr "Sơn Động Lý" +msgstr "Sơn Động Lực" msgid "Explode" -msgstr "Nổ" +msgstr "Nổ Tung" msgid "Break apart the mesh faces and let them follow particles" -msgstr "Chẻ các mặt mạng lưới và cho chúng nó đi theo những hạt" +msgstr "Tách phân các mặt của khung lưới ra nhiều mảnh và cho phép chúng đi theo các hạt" msgid "Ocean" @@ -33783,15 +36520,15 @@ msgstr "Đại Dương" msgid "Generate a moving ocean surface" -msgstr "Chế tạo một bề mặt điạ dương chuyển động" +msgstr "Sinh tạo một bề mặt đại dương chuyển động" msgid "Particle Instance" -msgstr "Thực Thể Hạt" +msgstr "Thực Thể Hóa Hạt" msgid "Spawn particles from the shape" -msgstr "Sanh hạt từ hình dạng" +msgstr "Sinh tạo hạt từ hình dạng" msgid "Soft Body" @@ -33799,23 +36536,23 @@ msgstr "Thân Mềm" msgid "Apply on Spline" -msgstr "Áp Dụng trên Mẫu Cong" +msgstr "Áp dụng trên chốt trục" msgid "Apply this and all preceding deformation modifiers on splines' points rather than on filled curve/surface" -msgstr "Áp dụng bộ điều chỉnh này và hết bộ điều chỉnh méo hóa phía trước với những điểm của các mẫu công thay thế đường cong/bề mặt làm đầy" +msgstr "Áp dụng bộ điều chỉnh này và toàn bộ các bộ điều chỉnh biến dạng trên các điểm của đường cong hơn là trên các đường cong/bề mặt đã được tô kín" msgid "Armature deformation modifier" -msgstr "Bộ điều chỉnh méo hóa cốt" +msgstr "Bộ điều chỉnh biến dạng khung cốt" msgid "Multi Modifier" -msgstr "Đa Bộ Điều Chỉnh" +msgstr "Nhiều Bộ Điều Chỉnh" msgid "Use same input as previous modifier, and mix results using overall vgroup" -msgstr "Dùng ngõ vào giống như bộ điều chỉnh phía trước, và pha trộn kết qủa bằng hết nhóm đỉnh" +msgstr "Dùng cùng một đầu vào như bộ điều chỉnh trước, và hòa trộn các kết quả dùng nhóm điểm đỉnh tổng quan" msgid "Array Modifier" @@ -33823,175 +36560,175 @@ msgstr "Bộ Điều Chỉnh Mảng" msgid "Array duplication modifier" -msgstr "Bộ điều chỉnh cho sao chép vật thể thành mảng" +msgstr "Bộ điều chỉnh sao chép mảng" msgid "Constant Offset Displacement" -msgstr "Nới Hằng Số" +msgstr "Dịch Chuyển Dời Hình Bất Biến" msgid "Value for the distance between arrayed items" -msgstr "Giá trị co khoảng cách giữa mặt hàng trong mảng" +msgstr "Khoảng cách giữa các phần tử trong mảng" msgid "Number of duplicates to make" -msgstr "Số lần chép vật thể" +msgstr "Số bản sao cần làm" msgid "Curve object to fit array length to" -msgstr "Vật thể đường cong cho làm vừa bề dài mảng" +msgstr "Đối tượng đường cong dùng làm chiều dài của mảng" msgid "End Cap" -msgstr "Nắp Cuối Cùng" +msgstr "Nắp Ở Cuối" msgid "Mesh object to use as an end cap" -msgstr "Vật thể mạng lưới cho dùng lằm nắp kết thúc" +msgstr "Đối tượng khung lưới dùng để làm nắp ở cuối" msgid "Length to fit array within" -msgstr "Bề dài cho vừa mảng ở trong" +msgstr "Chiều dài để khít vừa mảng vào" msgid "Fit Type" -msgstr "Phương Pháp Vừa Hóa" +msgstr "Phương Phát Khít Vừa" msgid "Array length calculation method" -msgstr "Phương pháp tính độ dài mảng" +msgstr "Phương pháp tính độ dài của mảng" msgid "Fixed Count" -msgstr "Lần Hằng Số" +msgstr "Số Lượng Cố Định" msgid "Duplicate the object a certain number of times" -msgstr "Sao chép vật thể mốt số lần được xác định" +msgstr "Nhân đôi đối tượng theo một số lần đã định nào đó" msgid "Fit Length" -msgstr "Đầy Bề Dài" +msgstr "Khít Vừa Chiều Dài" msgid "Duplicate the object as many times as fits in a certain length" -msgstr "Sao chép vật thể một số lần đủ cho làm đầy bề dài được xác định" +msgstr "Tiếp tục nhân đôi đối tượng cho đến khi vừa đủ khít chiều dài đã định nào đó" msgid "Fit the duplicated objects to a curve" -msgstr "Vửa hóa các vật thể được sao chép vửa một đường cong" +msgstr "Khít các đối tượng sao chép vào một đường cong" msgid "Merge Distance" -msgstr "Khoảng Cách Gồm Thành Một" +msgstr "Khoảng Cách Hợp Nhất" msgid "Limit below which to merge vertices" -msgstr "Giới hạn cách xa cho gồm đỉnh" +msgstr "Chỉ hợp nhất điểm đỉnh khi khoảng cách thấp hơn giá trị này" msgid "Object Offset" -msgstr "Dịch Vật Thể" +msgstr "Dịch Chuyển của Đối Tượng" msgid "U Offset" -msgstr "Dịch U" +msgstr "Dịch Chuyển U" msgid "Amount to offset array UVs on the U axis" -msgstr "Mức để dịch mảng UV trên trục U" +msgstr "Lượng xê dịch mảng UV trên trục U" msgid "V Offset" -msgstr "Dịch V" +msgstr "Dịch Chuyển V" msgid "Amount to offset array UVs on the V axis" -msgstr "Mức để địch mảng UV trên trục V" +msgstr "Lượng xê dịch mảng UV trên trục X" msgid "Relative Offset Displacement" -msgstr "Dịch Tương Đối" +msgstr "Dịch Chuyển Dời Hình Tương Đối" msgid "Start Cap" -msgstr "Nắp Bắt Đầu" +msgstr "Nắp Ở Đầu" msgid "Mesh object to use as a start cap" -msgstr "Vật thể mạng lưới để làm một nắp đầu" +msgstr "Đối tượng khung lưới để dùng làm nắp ở đầu" msgid "Add a constant offset" -msgstr "Kèm dịch hằng số" +msgstr "Thêm một dịch chuyển bất biến" msgid "Merge Vertices" -msgstr "Gồm Đỉnh" +msgstr "Hợp Nhất Điểm Đỉnh" msgid "Merge vertices in adjacent duplicates" -msgstr "Gồm các đỉnh là sao chép kề nhau" +msgstr "Hội nhập các điểm đỉnh trong các bản sao kề cạnh" msgid "Merge End Vertices" -msgstr "Gồm Đỉnh Đầu & Cuối" +msgstr "Hợp Nhất các Điểm Đỉnh ở Đầu Cùng" msgid "Merge vertices in first and last duplicates" -msgstr "Gồm đỉnh là sao chép đầu và cuối" +msgstr "Hội nhập các điểm đỉnh là bản sao đầu tiên và bản sao cuối cùng" msgid "Add another object's transformation to the total offset" -msgstr "Cộng biến hóa của một vật thể khác với dịch tổng cộng" +msgstr "Cộng biến hóa của một đối tượng khác vào tổng lượng dịch chuyển" msgid "Add an offset relative to the object's bounding box" -msgstr "Cộng dịch tương đối với hộp bao quanh của vật thể" +msgstr "Thêm một dịch chuyển tương đối vào khung hộp viền của đối tượng" msgid "Bevel Modifier" -msgstr "Bộ Điều Chỉnh Cạnh Tròn" +msgstr "Bộ Điều Chỉnh Bo Tròn" msgid "Bevel modifier to make edges and vertices more rounded" -msgstr "Bộ điều chỉnh cạnh tròn cho làm cạnh và đỉnh tròn hơn" +msgstr "Bộ điều chỉnh bo tròn để làm cho các cạnh và các điểm đỉnh được tròn hơn" msgid "Affect" -msgstr "Ảnh Hưởng" +msgstr "Tác Động" msgid "Affect edges or vertices" -msgstr "Ảnh hưởng cạnh hay điểm" +msgstr "Tác động các cạnh và các điểm đỉnh" msgid "Affect only vertices" -msgstr "Chỉ ảnh hưởng đỉnh" +msgstr "Duy tác động các điểm đỉnh mà thôi" msgid "Affect only edges" -msgstr "Chỉ ảnh hưởng cạnh" +msgstr "Duy tác động các cạnh mà thôi" msgid "Angle above which to bevel edges" -msgstr "Cạnh tròn cạnh có góc hơn góc này" +msgstr "Bo tròn các cạnh có góc độ cao hơn giá trị góc độ này" msgid "The path for the custom profile" -msgstr "Đường cho mặt cắt tùy chọn" +msgstr "Đường dẫn cho mặt cắt tùy chọn" msgid "Face Strength" -msgstr "Sức Mặt" +msgstr "Cường Độ Mặt" msgid "Whether to set face strength, and which faces to set it on" -msgstr "Đặt sức mặt hay không, và đặt nó cho mặt nào" +msgstr "Đặt cường độ Mặt hay không, và nếu có thì những Mặt nào là Mặt để đặt sức mạnh trên nó" msgid "Do not set face strength" -msgstr "Không đặt sức mặt" +msgstr "Không đặt cường độ Mặt" msgid "New" @@ -33999,27 +36736,27 @@ msgstr "Mới" msgid "Set face strength on new faces only" -msgstr "Chỉ đặt sức mặt cho mặt mới" +msgstr "Chỉ đặt cường độ Mặt trên những Mặt mới mà thôi" msgid "Affected" -msgstr "Được Ảnh Hưởng" +msgstr "Bị Ảnh Hưởng" msgid "Set face strength on new and affected faces only" -msgstr "Chỉ đặt sức mặt cho mặt mới và mặt được ảnh hưởng" +msgstr "Đặt cường độ Mặt trên những Mặt mới, hoặc những cái bị ảnh hưởng mà thôi" msgid "Set face strength on all faces" -msgstr "Đặt sức mặt cho tất cả mặt" +msgstr "Đặt cường độ Mặt trên toàn bộ các Mặt" msgid "Harden Normals" -msgstr "Cứng Hóa Pháp Tuyến" +msgstr "Cương Pháp Tuyến" msgid "Match normals of new faces to adjacent faces" -msgstr "Làm pháp tuyến của các mặt mới giống hệt pháp tuyến của các mặt kề" +msgstr "Khớp các pháp tuyến của những các mặt mới với những các mặt kề cạnh" msgid "Limit Method" @@ -34027,111 +36764,111 @@ msgstr "Phương Pháp Hạn Chế" msgid "Bevel the entire mesh by a constant amount" -msgstr "Cạnh tròn toàn mạng lưới bằng một mức độ hằng số" +msgstr "Bo tròn toàn bộ khung lưới với một lượng bất biến" msgid "Only bevel edges with sharp enough angles between faces" -msgstr "Chỉ cạnh tròn cạnh có góc đủ bén giữa các mặt" +msgstr "Chỉ bo tròn các cạnh với góc gập giữa các mặt đủ nhọn mà thôi" msgid "Use bevel weights to determine how much bevel is applied in edge mode" -msgstr "Dùng quyền lượng cạnh tròn để tính nên áp dụng mức cạnh tròn trong chế độ cạnh" +msgstr "Dùng trọng lượng bo tròn để xác định lượng bo tròn được áp dụng trong chế độ cạnh là bao nhiêu" msgid "Use vertex group weights to select whether vertex or edge is beveled" -msgstr "Dùng quyền lượng nhóm đỉnh cho quyết định cạnh tròn đỉnh hay cạnh" +msgstr "Dùng trọng lượng nhóm điểm đỉnh để quyết định bo tròn điểm đỉnh hay cạnh" msgid "Loop Slide" -msgstr "Trượt Lặp Vòng" +msgstr "Trượt Đẩy theo Mạch Lưới" msgid "Prefer sliding along edges to having even widths" -msgstr "Thường trượt theo cảnh cho có bề rộng đều" +msgstr "Cần trượt đẩy dọc theo các cạnh để đạt được chiều rộng đều đặn hơn" msgid "Mark Seams" -msgstr "Ký Dấu Vết Sẹo" +msgstr "Đánh Dấu Đường Khâu" msgid "Mark Seams along beveled edges" -msgstr "Ký Dấu Vết Sẹo trên cạnh được cạnh tròn" +msgstr "Đánh dấu các Đường Khâu dọc theo các cạnh bo tròn" msgid "Mark Sharp" -msgstr "Ký Dấu Bén" +msgstr "Đánh Dấu là Sắc Nhọn" msgid "Mark beveled edges as sharp" -msgstr "Ký dấu cạnh cạnh tròn là bén" +msgstr "Đánh dấu các cạnh bo tròn là sắc nhọn" msgid "Material index of generated faces, -1 for automatic" -msgstr "Chỉ số vật liệu của mặt được chế tạo, -1 cho tự động" +msgstr "Chỉ số nguyên vật liệu của các mặt được sinh tạo, -1 để tự động làm" msgid "Inner Miter" -msgstr "Mũ Tế Nội" +msgstr "Góc Cắt Bên Trong" msgid "Pattern to use for inside of miters" -msgstr "Gương mẫu để dùng cho bên trong mũ tế" +msgstr "Kiểu mẫu sử dụng cho các góc cắt bên trong" msgid "Inside of miter is sharp" -msgstr "Trong mũ tế là bén" +msgstr "Đường cắt góc bên trong là sắc nhọn" msgid "Arc" -msgstr "Hình Cung" +msgstr "Đường Cung" msgid "Inside of miter is arc" -msgstr "Trong mũ tế là hình cung" +msgstr "Đường cắt góc bên trong là vòng cung" msgid "Outer Miter" -msgstr "Mũ Tế Ngoại" +msgstr "Góc Cắt Bên Ngoài" msgid "Pattern to use for outside of miters" -msgstr "Gương mẫu để dùng cho bên ngoài mũ tế" +msgstr "Kiểu mẫu sử dụng cho các đường cắt góc ngoài" msgid "Outside of miter is sharp" -msgstr "Ngoài mũ tế là bén" +msgstr "Đường cắt góc bên ngoài là sắc nhọn" msgid "Patch" -msgstr "Vá" +msgstr "Chắp/Vá" msgid "Outside of miter is squared-off patch" -msgstr "Ngoài mũ tế là vá vuông" +msgstr "Đường cắt góc bên ngoài là miếng vá được làm vuông đi" msgid "Outside of miter is arc" -msgstr "Ngoài mũ tế là hình cung" +msgstr "Đường cắt góc bên ngoài là vòng cung" msgid "Width Type" -msgstr "Loại Bề Rộng" +msgstr "Loại Chiều Rộng" msgid "What distance Width measures" -msgstr "Bề Rộng được đo khoảng cách nào" +msgstr "Đo khoảng cách Chiều Rộng bằng cách nào" msgid "Amount is offset of new edges from original" -msgstr "Mức là dịch của cạnh mới từ cạnh ban đầu" +msgstr "Lượng cung cấp là dịch chuyển của các cạnh mới từ cạnh gốc" msgid "Amount is width of new face" -msgstr "Mức là bề rộng của mặt mới" +msgstr "Lượng cung cấp là chiều rộng của Mặt mới" msgid "Amount is perpendicular distance from original edge to bevel face" -msgstr "Mức là khoảng cách vuông góc từ cạnh gốc đến mặt cạnh tròn" +msgstr "Lượng cung cấp là khoảng cách vuông góc từ cạnh gốc đến Mặt bo tròn" msgid "Percent" @@ -34139,11 +36876,11 @@ msgstr "Phần Trăm" msgid "Amount is percent of adjacent edge length" -msgstr "Mức là phần trăm của bề dài cạnh kề" +msgstr "Lượng cung cấp là phần trăm chiều dài của cạnh kề bên" msgid "Amount is absolute distance along adjacent edge" -msgstr "Mức là khoảng cách tuyệt đối theo cạnh kề bên" +msgstr "Lượng là khoảng cách tuyệt đối dọc theo cạnh kề bên" msgid "The profile shape (0.5 = round)" @@ -34151,75 +36888,75 @@ msgstr "Hình dạng mặt cắt (0.5 = tròn)" msgid "Profile Type" -msgstr "Loại Mặt Cắt" +msgstr "Thể Loại Mặt Cắt" msgid "The type of shape used to rebuild a beveled section" -msgstr "Loại hình dạng được dùng cho xây dựng lại một khúc cạnh tròn" +msgstr "Thể loại hình dạng sử dụng để tái dựng một bộ phận đã được bo tròn" msgid "Superellipse" -msgstr "Siêu Elip" +msgstr "Siêu Êlíp" msgid "The profile can be a concave or convex curve" -msgstr "Mặt cắt có thể là đường cong lõm hay lồi" +msgstr "Mặt cắt có thể là một đường cong lõm hoặc lồi" msgid "The profile can be any arbitrary path between its endpoints" -msgstr "Mặt cắt có thể là bắt cừ đường giữa hai điểm đầu và cuối" +msgstr "Mặt cắt có thể là bất cứ đường dẫn nào giữa các điểm đầu cùng" msgid "Number of segments for round edges/verts" -msgstr "Số lượng đoạn thẩng cho cạnh/đỉnh tròn" +msgstr "Số lượng phân đoạn để làm cong các cạnh/điểm đỉnh" msgid "Spread distance for inner miter arcs" -msgstr "Mở rộng khoảng cách cho hình cung mũ tế nội" +msgstr "Khoảng cách ảnh hưởng của các vòng cung cho đường cắt góc bên trong" msgid "Clamp Overlap" -msgstr "Kẹp Lại Lấn Trên" +msgstr "Chống Đè Gối Lên Nhau" msgid "Clamp the width to avoid overlap" -msgstr "Kẹp lại bề rộng cho tránh lấn trên" +msgstr "Hạn định chiều rộng để tránh đè gối lên nhau" msgid "Vertex group name" -msgstr "Tên nhóm đỉnh" +msgstr "Tên nhóm điểm đỉnh" msgid "Vertex Mesh Method" -msgstr "Phương Pháp Đỉnh Mạng Lưới" +msgstr "Phương Pháp Tạo Khung Lưới tại Điểm Đỉnh" msgid "The method to use to create the mesh at intersections" -msgstr "Phương pháp đề dùng khi chế tạo mạng lưới tại những giao cắt" +msgstr "Phương pháp sử dụng để kiến tạo khung lưới tại điểm giao cắt" msgid "Grid Fill" -msgstr "Tô Đầy Đồ Thị" +msgstr "Lấp Kín Khung Lưới Đồ Thị" msgid "Default patterned fill" -msgstr "Gương mẫu tô đầy mặc định" +msgstr "Kiểu mẫu tô kín mặc định" msgid "A cut-off at the end of each profile before the intersection" -msgstr "Giới hạn tại kết thúc của mặt cắt trước giao cắt" +msgstr "Điểm ngắt tại đầu cuối của mỗi mặt cắt trước điểm giao nhau" msgid "Bevel amount" -msgstr "Mức cạnh tròn" +msgstr "Lượng bo tròn" msgid "Width Percent" -msgstr "Phần Trăm Bề Rộng" +msgstr "Phần Trăm của Chiều Rộng" msgid "Bevel amount for percentage method" -msgstr "Mức cạnh tròn cho phương pháp phần trăm" +msgstr "Lượng bo tròn dành cho phương pháp phần trăm" msgid "Boolean Modifier" @@ -34227,75 +36964,99 @@ msgstr "Bộ Điều Chỉnh Bool" msgid "Boolean operations modifier" -msgstr "Bộ điều chỉnh thao tác bool" +msgstr "Bộ điều chỉnh các thao tác của Bool" msgid "Use mesh objects in this collection for Boolean operation" -msgstr "Dùng vật thể trong sưu tập cho thao tác Bool" +msgstr "Sử dụng các đối tượng trong bộ sưu tập này cho phép toán Bool" msgid "Debug" -msgstr "Sửa Sai Lầm" +msgstr "Hiệu Chỉnh Lỗi" msgid "Debugging options, only when started with '-d'" -msgstr "Tùy chọn sửa sai lầm, chỉ khởi động bằng '-d'" +msgstr "Các tùy chọn trong quá trình điều tra và sửa lỗi, chỉ khi nào khởi động với '-d' mà thôi" msgid "No Dissolve" -msgstr "Không Hòa Tan" +msgstr "Không Tan Biến" msgid "No Connect Regions" -msgstr "Không Kết Nối Vùng" +msgstr "Không Kết Nối Các Vùng" msgid "Overlap Threshold" -msgstr "Ngưỡng Lấn Trên" +msgstr "Giới Hạn Đè Gối Lên Nhau" msgid "Threshold for checking overlapping geometry" -msgstr "Ngưỡng cho phân biệt hình dạng lấn trên" +msgstr "Giới hạn để kiểm tra sự đè gối lên nhau trong hình học" + + +msgid "Material Mode" +msgstr "Chế Độ Nguyên Vật Liệu" + + +msgid "Method for setting materials on the new faces" +msgstr "Phương pháp đặt nguyên vật liệu trên các mặt mới" + + +msgid "Index Based" +msgstr "Dựa Trên Chỉ Số" + + +msgid "Set the material on new faces based on the order of the material slot lists. If a material doesn't exist on the modifier object, the face will use the same material slot or the first if the object doesn't have enough slots" +msgstr "Đặt nguyên vật liệu trên các Mặt mới, dựa trên thứ tự danh sách khe nguyên vật liệu. Nếu một nguyên vật liệu không tồn tại trên đối tượng bộ điều chỉnh thì Mặt sẽ sử dụng cùng một khe nguyên vật liệu, hoặc khe đầu tiên nếu đối tượng không có đủ số khe" + + +msgid "Transfer" +msgstr "Thuyên Chuyển" + + +msgid "Transfer materials from non-empty slots to the result mesh, adding new materials as necessary. For empty slots, fall back to using the same material index as the operand mesh" +msgstr "Thuyên chuyển nguyên vật liệu từ các khe không trống sang khung lưới kết quả, cho thêm nguyên vật liệu mới vào nếu cần. Đối với các khe trống rỗng thì quay trở lại sử dụng cùng một chỉ số nguyên vật liệu như khung lưới cung cấp trong toán hạng" msgid "Mesh object to use for Boolean operation" -msgstr "Vật thể mạng lưới cho dùng thao tác Bool" +msgstr "Đối tượng khung lưới dùng trong phép toán Bool" msgid "Operand Type" -msgstr "Loại Toán Tử" +msgstr "Thể Loại Toán Hạng" msgid "Use a mesh object as the operand for the Boolean operation" -msgstr "Dùng một mảng lưới làm một toán tử cho tao tác Bool" +msgstr "Sử dụng một đối tượng khung lưới làm toán hạng cho phép toán Bool" msgid "Use a collection of mesh objects as the operand for the Boolean operation" -msgstr "Dùng một sưu tập vật thể mạng lưới làm toán tử cho thao tác Bool" +msgstr "Sử dụng một bộ sưu tập các đối tượng khung lưới làm toán hạng cho phép toán Bool" msgid "Keep the part of the mesh that is common between all operands" -msgstr "Giữ bộ phận của mảng lưới cùng với hết toán tử " +msgstr "Duy trì phần của khung lưới được coi là chung (common) giữa các toán hạng" msgid "Union" -msgstr "Hợp" +msgstr "Hợp Nhất" msgid "Combine meshes in an additive way" -msgstr "Gồm hai mạng lưới kiểu cộng nhau" +msgstr "Kết hợp các khung lưới theo phương pháp thêm vào" msgid "Combine meshes in a subtractive way" -msgstr "Gồm hai mạng lưới kiểu trừ nhau" +msgstr "Kết hợp các khung lưới theo phương pháp trừ khấu đi" msgid "Method for calculating booleans" -msgstr "Phương pháp cho tính bool" +msgstr "Phương pháp tính toán các phép toán bool" msgid "Simple solver for the best performance, without support for overlapping geometry" -msgstr "Bộ giải nghiệm đơn giản cho hiệu suất tốt nhất, nhưng không hỗ trợ hình dạng lến lên" +msgstr "Giải nghiệm đơn giản hòng tối ưu hóa hiệu suất hoạt động, song không hỗ trợ các hình học chồng gối nhau" msgid "Exact" @@ -34303,39 +37064,39 @@ msgstr "Chính Xác" msgid "Advanced solver for the best result" -msgstr "Trình giải nghiệm cao cấp cho kết qủa tốt nhất" +msgstr "Giải nghiệm tân tiến để đạt được kết quả tốt nhất" msgid "Hole Tolerant" -msgstr "Chịu Lỗ" +msgstr "Dung Sai về Lỗ Hổng" msgid "Better results when there are holes (slower)" -msgstr "Kết qủa tốt hơn khi có lỗ (chậm hơn)" +msgstr "Kết quả tốt hơn khi có các lỗ (chậm hơn)" msgid "Self Intersection" -msgstr "Tự Giao Cắt" +msgstr "Bản Thân Giao Cắt" msgid "Allow self-intersection in operands" -msgstr "Cho tự giao cắt mình trong các thao tác" +msgstr "Cho phép các toán hạng có sự giao cắt trong bản thân" msgid "Build effect modifier" -msgstr "Xây dưng bộ điều chỉnh hiệu ứng" +msgstr "Bộ điều chỉnh hiệu ứng xây dựng" msgid "Total time the build effect requires" -msgstr "Tông thời gian cần cho hiệu ứng xây" +msgstr "Tổng thời gian cần thiết cho hiệu ứng xây dựng" msgid "Start frame of the effect" -msgstr "Số bức ảnh đầu của hiệu ứng" +msgstr "Khung hình đầu tiên của hiệu ứng" msgid "Seed for random if used" -msgstr "Nếu dùng, số hạt cho làm ngẫu nhiên" +msgstr "Mầm ngẫu nhiên, nếu sử dụng" msgid "Randomize" @@ -34343,43 +37104,43 @@ msgstr "Ngẫu Nhiên Hóa" msgid "Randomize the faces or edges during build" -msgstr "Ngẫu nhiên hóa vị trí mặt hay cạnh khi xây dựng" +msgstr "Ngẫu nhiên hóa vị trí các mặt hoặc cạnh trong khi xây dựng" msgid "Reversed" -msgstr "Nghịch" +msgstr "Đảo Nghịch" msgid "Deconstruct the mesh instead of building it" -msgstr "Gỡ ra mạng lưới thay thế xây lên nó" +msgstr "Phá hủy khung lưới thay vì xây dựng nó" msgid "Cast Modifier" -msgstr "Bộ Điều Chỉnh Đúc" +msgstr "Bộ Điều Chỉnh Đúc Khuôn" msgid "Modifier to cast to other shapes" -msgstr "Bộ điều chỉnh cho đúc đến hình dạng khác" +msgstr "Bộ điều chỉnh cho đúc thành hình dạng khác" msgid "Target object shape" -msgstr "Hình dạng vật thể mục tiêu" +msgstr "Hình dạng đối tượng mục tiêu" msgid "Cuboid" -msgstr "Lập Phương" +msgstr "Hình Lập Phương" msgid "Control object: if available, its location determines the center of the effect" -msgstr "Vật thể điều khiển: nếu có, vị rí của nó được xác định vị trí của hiệu ứng" +msgstr "Vật điều khiển: nếu có thì vị trí của nó sẽ quyết định điểm tâm của hiệu ứng" msgid "Only deform vertices within this distance from the center of the effect (leave as 0 for infinite.)" -msgstr "Chỉ méo hóa các đỉnh trong khoảng cách này từ trung tâm của hiệu ứng (đặt = 0 cho vô hạn)" +msgstr "Chỉ biến dạng các điểm đỉnh nội trong khoảng cách này từ tâm của hiệu ứng (để là 0 nghĩa là vô cực)" msgid "Size of projection shape (leave as 0 for auto)" -msgstr "Kích cỡ của hình dạng phép chiếu (đặt = 0 cho tự động)" +msgstr "Kích thước của hình dạng dự phóng (0 là chế độ tự động)" msgid "Size from Radius" @@ -34387,7 +37148,7 @@ msgstr "Kích Thước từ Bán Kính" msgid "Use radius as size of projection shape (0 = auto)" -msgstr "Dùng bán kính làm kích cỡ cho hình dạng chiếu (0 = tự động)" +msgstr "Dùng bán kính làm kích thước cho hình dạng dự phóng (0 = tự động)" msgid "Use Transform" @@ -34395,139 +37156,151 @@ msgstr "Dùng Biến Hóa" msgid "Use object transform to control projection shape" -msgstr "Dùng biến hóa vật thể để điều khiển hình dạng phép chiếu" +msgstr "Dùng biến hóa của đối tượng để điều khiển hình dạng dự phóng" msgid "Cloth Modifier" -msgstr "Bộ Điều Chỉnh Vải" +msgstr "Bộ Điều Chỉnh Vải Vóc" msgid "Cloth simulation modifier" -msgstr "Bộ điều chỉnh mô phỏng vải" +msgstr "Bộ điều chỉnh mô phỏng vải vóc" msgid "Hair Grid Maximum" -msgstr "Cực Đại Đồ Thị Tóc" +msgstr "Tối Đa của Khung Lưới Đồ Thị Tóc" msgid "Hair Grid Minimum" -msgstr "Cực Tiểu Đồ Thị Tóc" +msgstr "Tối Thiểu của Khung Lưới Đồ Thị Tóc" msgid "Hair Grid Resolution" -msgstr "Độ Phân Giải Đồ Thị Tóc" +msgstr "Độ Phân Giải của Khung Lưới Đồ Thị Tóc" msgid "Collision Modifier" -msgstr "Bộ điều chỉnh Va Chạm" +msgstr "Bộ Điều Chỉnh Sự Va Đập" msgid "Collision modifier defining modifier stack position used for collision" -msgstr "Bộ điều chỉnh được chỉ định vị trí trong xếp đống được dùng cho va chạm" +msgstr "Bộ điều chỉnh xác định vị trí trong ngăn xếp dùng cho sự va đập" msgid "Settings" -msgstr "Cài Đặt" +msgstr "Sắp Đặt" msgid "Corrective Smooth Modifier" -msgstr "Bộ Điều Chỉnh Mịn Chỉnh Sửa" +msgstr "Bộ Điều Chỉnh Dùng Sự Làm Mịn để Sửa Lỗi" msgid "Correct distortion caused by deformation" -msgstr "Chỉnh méo sai lầm từ sự méo hóa" +msgstr "Chỉnh sửa sự vặn vẹo gây ra trong quá trình biến dạng" msgid "Lambda Factor" msgstr "Hệ Số Lambda" +msgid "Smooth effect factor" +msgstr "Hiệu số hiệu ứng làm mượt" + + msgid "Bind current shape" -msgstr "Trói hình dạng hiện tại" +msgstr "Kết buộc hình dạng hiện tại" msgid "Rest Source" -msgstr "Nguồn Nghỉ Ngơi" +msgstr "Nguồn cho Tư Thế Nghỉ" msgid "Select the source of rest positions" -msgstr "Chọn nguồn của vị trí nghỉ ngơi" +msgstr "Chọn nguồn cho tư thế nghỉ" msgid "Original Coords" msgstr "Tọa Độ Ban Đầu" +msgid "Use base mesh vertex coordinates as the rest position" +msgstr "Sử dụng các tọa độ điểm đỉnh của khung lưới nền làm vị trí nghỉ" + + msgid "Bind Coords" -msgstr "Trói Tọa Độ" +msgstr "Tọa Độ Kết Buộc" + + +msgid "Use bind vertex coordinates for rest position" +msgstr "Sử dụng các tọa độ điểm đỉnh kết buộc làm vị trí nghỉ" msgid "Compensate for scale applied by other modifiers" -msgstr "Bù lại cho phóng to được áp dụng bởi bộ điều chỉnh khác" +msgstr "Đền bù cho tỷ lệ mà các bộ điều chỉnh đã áp dụng" msgid "Smooth Type" -msgstr "Loại Mịn" +msgstr "Kiểu Làm Mịn" msgid "Method used for smoothing" -msgstr "Phương pháp cho mịn hóa" +msgstr "Phương pháp sử dụng để làm mịn" msgid "Use the average of adjacent edge-vertices" -msgstr "Dùng trung bình của đỉnh cạnh kề" +msgstr "Dùng trung bình của các điểm đỉnh/cạnh kề bên" msgid "Length Weight" -msgstr "Quyền Lượng Bề Dài" +msgstr "Trọng Lượng tùy Chiều Dài" msgid "Use the average of adjacent edge-vertices weighted by their length" -msgstr "Dùng trung bình của đỉnh cạnh kề được quyền lượng tùy bề dài của chúng nó" +msgstr "Dùng trung bình của các điểm đỉnh kề bên vốn được cân trọng theo chiều dài của chúng" msgid "Only Smooth" -msgstr "Chỉ Mịn" +msgstr "Duy Làm Mịn" msgid "Apply smoothing without reconstructing the surface" -msgstr "Áp dụng mịn hóa mà không xây lại mặt" +msgstr "Áp dụng việc làm mịn mà không kiến tạo lại bề mặt" msgid "Pin Boundaries" -msgstr "Đóng Đinh Ranh Giới" +msgstr "Ghim Ranh Giới Lại" msgid "Excludes boundary vertices from being smoothed" -msgstr "Không mịn hóa đỉnh của ranh giới" +msgstr "Không làm mịn các điểm đỉnh ranh giới" msgid "Curve Modifier" -msgstr "Cụ Sửu Đổi Cong" +msgstr "Bộ Điều Chỉnh Đường Cong" msgid "Curve deformation modifier" -msgstr "Bộ điều chỉnh méo hóa đường cong" +msgstr "Bộ điều chỉnh biến dạng bằng đường cong" msgid "Deform Axis" -msgstr "Trục Méo Hóa" +msgstr "Trục Biến Dạng" msgid "The axis that the curve deforms along" -msgstr "Trục cho đường cong méo hóa đi theo " +msgstr "Trục để đường cong biến dạng theo" msgid "Curve object to deform with" -msgstr "Vật thể đường cong cho méo hóa" +msgstr "Đường cong dùng để biến dạng hình" msgid "Data Transfer Modifier" -msgstr "Bộ Điều Chỉnh Truyền Dữ Liệu" +msgstr "Bộ Điều Chỉnh Thuyên Chuyển Dữ Liệu" msgid "Modifier transferring some data from a source mesh" -msgstr "Bộ điều chỉnh cho truyền dữ liệu từ một mạng lưới nguồn" +msgstr "Bộ điều chỉnh thuyên chuyển dữ liệu từ một khung lưới nguồn" msgid "Edge Data Types" @@ -34535,31 +37308,31 @@ msgstr "Kiểu Dữ Liệu Cạnh" msgid "Which edge data layers to transfer" -msgstr "Truyền các lớp dữ liệu từ cạnh nào" +msgstr "Dùng những tầng dữ liệu về cạnh nào để thuyên chuyển sang" msgid "Transfer sharp mark" -msgstr "Truyền ký dấu bén" +msgstr "Thuyên chuyển dấu chỉ cạnh sắc" msgid "UV Seam" -msgstr "Vết Sẹo UV" +msgstr "Đường Khâu UV" msgid "Transfer UV seam mark" -msgstr "Truyền ký dấu vết sẹo UV" +msgstr "Thuyên chuyển dấu chỉ đường khâu UV" msgid "Transfer subdivision crease values" -msgstr "Truyền giá trị nhăn của phân hóa" +msgstr "Thuyên chuyển các giá trị của nếp gấp phân hóa" msgid "Bevel Weight" -msgstr "Quyền Lượng Cạnh Tròn" +msgstr "Trọng Lượng Bo Tròn" msgid "Transfer bevel weights" -msgstr "Truyền quyền lượng của cạnh tròn" +msgstr "Thuyên chuyển trọng lượng bo tròn sang" msgid "Freestyle" @@ -34567,27 +37340,27 @@ msgstr "Phong Cách Tự Do" msgid "Transfer Freestyle edge mark" -msgstr "Truyền ký dấu cạnh Phong Cách Tự Do" +msgstr "Thuyên chuyển dấu chỉ cạnh PCTD" msgid "Face Corner Data Types" -msgstr "Kiểu Dữ Liệu Góc Mặt" +msgstr "Loại Dữ Liệu Góc Mặt" msgid "Which face corner data layers to transfer" -msgstr "Truyền các lớp dữ liệu của góc giác mặt nào" +msgstr "Những tầng dữ liệu nào về góc của Mặt để thuyên chuyển sang" msgid "Custom Normals" -msgstr "Pháp Tuyến Tùy Chọn" +msgstr "Pháp Tuyến Tùy Chỉnh" msgid "Transfer custom normals" -msgstr "Truyền pháp tuyến tùy chọn" +msgstr "Thuyên chuyển các pháp tuyến tùy chỉnh sang" msgid "Transfer color attributes" -msgstr "Truyền đặc điểm màu" +msgstr "Thuyên chuyển các thuộc tính màu" msgid "UVs" @@ -34595,35 +37368,39 @@ msgstr "UV" msgid "Transfer UV layers" -msgstr "Truyền lớp UV" +msgstr "Thuyên chuyển các tầng UV sang" msgid "Poly Data Types" -msgstr "Kiểu Dữ Liệu Đa Giác" +msgstr "Kiểu Dữ Liệu của Đa Giác" + + +msgid "Which face data layers to transfer" +msgstr "Những tầng lớp dữ liệu mặt nào cần thuyên chuyển" msgid "Transfer flat/smooth mark" -msgstr "Truyền ký dấu bằng phẳng/mịn" +msgstr "Thuyên chuyển dấu hiệu chỉ tính phẳng bẹt/mịn màng" msgid "Freestyle Mark" -msgstr "Ký Dấu Phong Cách Tự Do" +msgstr "Dấu Chỉ PCTD" msgid "Transfer Freestyle face mark" -msgstr "Truyền ký dấu mặt Phong Cách Tự Do" +msgstr "Thuyên chuyển dấu chỉ Mặt PCTD" msgid "Vertex Data Types" -msgstr "Kiểu Dữ Liệu Đỉnh" +msgstr "Kiểu Dữ Liệu Điểm Đỉnh" msgid "Which vertex data layers to transfer" -msgstr "Truyền lớp dữ liệu đỉnh nào" +msgstr "Những tầng dữ liệu điểm đỉnh để thuyên chuyển" msgid "Transfer active or all vertex groups" -msgstr "Truyền nhóm đỉnh hoạt động hay hết nhóm đỉnh" +msgstr "Thuyên chuyển các nhóm điểm đỉnh đang hoạt động, hoặc toàn bộ các nhóm điểm đỉnh" msgid "Edge Mapping" @@ -34631,19 +37408,19 @@ msgstr "Ánh Xạ Cạnh" msgid "Method used to map source edges to destination ones" -msgstr "Phương pháp cho ánh xạ cạnh nguồn đến cạnh đích" +msgstr "Phương pháp để ánh xạ các cạnh nguồn đến các cạnh đích" msgid "Copy from identical topology meshes" -msgstr "Chép từ mạng lưới hình dạng học giống hệt nhau" +msgstr "Sao chép từ các khung lưới có cấu trúc liên kết giống hệt nhau" msgid "Nearest Vertices" -msgstr "Đỉnh Gần Nhất" +msgstr "Điểm Đỉnh Gần Nhất" msgid "Copy from most similar edge (edge which vertices are the closest of destination edge's ones)" -msgstr "Chép từ cạnh giống nhất (cạnh nào có các đỉnh gần nhất với các đỉnh của cạnh đích)" +msgstr "Sao chép từ cạnh đồng dạng nhiều nhất (cạnh có các điểm đỉnh gần nhất với các cái của cạnh đích)" msgid "Nearest Edge" @@ -34651,7 +37428,7 @@ msgstr "Cạnh Gần Nhất" msgid "Copy from closest edge (using midpoints)" -msgstr "Chép từ cạnh gần nhất (dùng trung điểm)" +msgstr "Sao chép từ cạnh gần nhất (dùng các trung điểm)" msgid "Nearest Face Edge" @@ -34659,35 +37436,35 @@ msgstr "Cạnh Mặt Gần Nhất" msgid "Copy from closest edge of closest face (using midpoints)" -msgstr "Chép từ cạnh gần nhất của mặt gần nhất (dùng trung điểm)" +msgstr "Sao chép từ cạnh gần nhất của Mặt cận nhất (dùng các trung điểm)" msgid "Projected Edge Interpolated" -msgstr "Nội Suy Cạnh Được Chiếu" +msgstr "Cạnh Phóng Chiếu Nội Suy" msgid "Interpolate all source edges hit by the projection of destination one along its own normal (from vertices)" -msgstr "Suy nội hết cạnh nguồn được trúng bởi phép chiếu của cạnh đích theo pháp tuyến của nó (từ các đỉnh)" +msgstr "Nội suy toàn bộ các cạnh của nguồn mà cái dự phóng ở đích đập vào, dọc theo pháp tuyến riêng của nó (từ các điểm đỉnh)" msgid "Islands Precision" -msgstr "Độ Chính Xác Đảo" +msgstr "Độ Chính Xác về các Hải Đảo" msgid "Factor controlling precision of islands handling (typically, 0.1 should be enough, higher values can make things really slow)" -msgstr "Hệ số điều khiển độ chính xác cho xử lý đảo (thường, 0.1 nên đủ, giá trị cao hơn có thể rất chậm chạp)" +msgstr "Hệ số điều khiển độ chính xác trong việc xử lý các hải đảo (thông thường 0,1 là đủ, giá trị cao hơn có thể làm cho mọi việc trở nên rất chậm chạp)" msgid "Destination Layers Matching" -msgstr "So Sánh Lớp Đích" +msgstr "Khớp với các Tầng Đích" msgid "How to match source and destination layers" -msgstr "Phương pháp cho so sánh lớp nguồn và đích là giống nhau" +msgstr "Phương pháp để so sánh các tầng nguồn và đích" msgid "Affect active data layer of all targets" -msgstr "Ảnh hưởng lớp dữ liệu hoạt động của hết mục tiêu" +msgstr "Ảnh hưởng tầng dữ liệu đang hoạt động của toàn bộ các mục tiêu" msgid "By Name" @@ -34695,7 +37472,7 @@ msgstr "Bằng Tên" msgid "Match target data layers to affect by name" -msgstr "So sánh lớp dữ liệu mục tiêu để ảnh hưởng bằng tên" +msgstr "Khớp các tầng dữ liệu mục tiêu sẽ bị ảnh hưởng bằng tên" msgid "By Order" @@ -34703,167 +37480,187 @@ msgstr "Bằng Thứ Tự" msgid "Match target data layers to affect by order (indices)" -msgstr "So sánh lớp dữ liệu mục tiêu để ảnh hưởng bằng tên (chỉ số)" +msgstr "Khớp các tầng dữ liệu mục tiêu sẽ bị ảnh hưởng bằng trật tự (các chỉ số)" msgid "Source Layers Selection" -msgstr "Sự Lựa Chọn Lớp Nguồn" +msgstr "Lựa Chọn các Tầng Nguồn" msgid "Which layers to transfer, in case of multi-layers types" -msgstr "Truyên lớp nào, cho trường hợp có nhiều loại lớp" +msgstr "Trong trường hợp các loại đa tầng thì những tầng nào để thuyên chuyển sang" msgid "Only transfer active data layer" -msgstr "Chỉ truyền lớp dữ liệu hoạt động" +msgstr "Chỉ thuyên chuyển tầng dữ liệu đang hoạt động mà thôi" msgid "All Layers" -msgstr "Hết Lớp" +msgstr "Toàn bộ các Tầng" msgid "Transfer all data layers" -msgstr "Truyên hết lớp dữ liệu" +msgstr "Thuyên chuyển toàn bộ các tầng dữ liệu" msgid "Selected Pose Bones" -msgstr "Xương Dạng Đứng Được Chọn" +msgstr "Xương Tư Thế đã Chọn" msgid "Transfer all vertex groups used by selected pose bones" -msgstr "Truyền hết nhóm đỉnh được xương dạng đứng được chọn đang sử dụng" +msgstr "Thuyên chuyển toàn bộ các nhóm điểm đỉnh mà các xương tư thế đã chọn sử dụng" msgid "Deform Pose Bones" -msgstr "Méo Hóa Xương Dạng Đứng" +msgstr "Xương Biến Dạng Tư Thế" msgid "Transfer all vertex groups used by deform bones" -msgstr "Truyền hết nhóm đỉnh được xương mẹo hóa được sử dụng" +msgstr "Thuyên chuyển toàn bộ các nhóm điểm đỉnh mà các xương biến dạng sử dụng" msgid "Face Corner Mapping" -msgstr "Ánh Xạ Góc Giác Mặt" +msgstr "Ánh Xạ Góc của Mặt" msgid "Method used to map source faces' corners to destination ones" -msgstr "Phương pháp cho ánh xạ góc giác của mặt nguồn đến mặt đích" +msgstr "Phương pháp sử dụng để ánh xạ các góc các mặt ở nguồn đến các cái ở đích" msgid "Nearest Corner and Best Matching Normal" -msgstr "Góc Giác Gần Nhất và Pháp Tuyến Giống Nhất" +msgstr "Góc Tối Cận cùng Pháp Tuyến Giống Nhất" msgid "Copy from nearest corner which has the best matching normal" -msgstr "Chép từ góc giác gần nhất mà có pháp tuyến giống nhất" +msgstr "Sao chép từ góc tối cận, tức cái có pháp tuyến xứng khớp nhất" msgid "Nearest Corner and Best Matching Face Normal" -msgstr "Góc Giác Gần Nhất và Pháp Tuyến Mặt Giống Nhất" +msgstr "Góc Cạnh Gần Nhất và Pháp Tuyến Mặt Giống Nhất" msgid "Copy from nearest corner which has the face with the best matching normal to destination corner's face one" -msgstr "Chép từ góc giác gần nhất mà mặt có pháp tuyến giống nhất với góc giác của mặt đích" +msgstr "Sao chép từ góc tối cận, tức cái có Mặt với pháp tuyến xứng khớp nhất với Mặt của góc đích" msgid "Nearest Corner of Nearest Face" -msgstr "Góc Giác Gần Nhất của Mặt Gần Nhất" +msgstr "Góc Tối Cận của Mặt Gần Nhất" + + +msgid "Copy from nearest corner of nearest face" +msgstr "Sao chép từ góc gần nhất của mặt cận nhất" msgid "Nearest Face Interpolated" -msgstr "Mặt Gần Nhất Được Nội Suy" +msgstr "Mặt Gần Nhất được Nội Suy" + + +msgid "Copy from interpolated corners of the nearest source face" +msgstr "Sao chép từ các góc nội suy của mặt nguồn gần nhất" msgid "Projected Face Interpolated" -msgstr "Mặt Được Chiếu Nội Suy" +msgstr "Mặt Phóng Chiếu được Nội Suy" + + +msgid "Copy from interpolated corners of the source face hit by corner normal projection" +msgstr "Sao chép từ các góc nội suy của mặt nguồn mà sự phóng chiếu pháp tuyến góc bắn trúng" msgid "Max Distance" -msgstr "Khoảng Cách Cực Đại" +msgstr "Khoảng Cách Tối Đa" msgid "Maximum allowed distance between source and destination element, for non-topology mappings" -msgstr "Khoảng cách cực đại giữa phần tử nguồn và đích, cho ánh xạ kiểu không hình dạng học" +msgstr "Khoảng cách tối đa cho phép giữa phần tử nguồn và đích, dành cho ánh xạ không có cấu trúc liên kết" msgid "Factor to use when applying data to destination (exact behavior depends on mix mode, multiplied with weights from vertex group when defined)" -msgstr "Hệ số dùng khi áp dụng dữ liệu đến đích (hành vi tùy chế độ pha trộn, nhân với quyền lượng từ nhóm đỉnh khi được chỉ định)" +msgstr "Hệ số để sử dụng khi áp dụng dữ liệu vào đích (Thực tế xử hành thế nào còn tùy vào chế độ hòa trộn. Nhân với trọng lượng từ nhóm điểm đỉnh nếu được định đặt)" msgid "How to affect destination elements with source values" -msgstr "Làm sao ảnh hưởng phần tử đích với giá trị nguồn" +msgstr "Phương pháp tác động các phần tử ở đích dùng các giá trị nguồn" msgid "Overwrite all elements' data" -msgstr "Ghi vượt quyền hết dữ liệu phần tử" +msgstr "Viết đè lên dữ liệu của các phần tử" msgid "Above Threshold" -msgstr "Hơn Ngưỡng" +msgstr "Trên Giới Hạn" msgid "Only replace destination elements where data is above given threshold (exact behavior depends on data type)" -msgstr "Chỉ thay thế phần tử đích nào có dữ liệu lớn hơn ngưỡng được xác định (hành vi tùy kiểu dữ liệu)" +msgstr "Chỉ thay thế các phần tử ở đích khi dữ liệu lớn hơn giới hạn đã cho nào đó (thực thế xử lý thế nào còn tùy vào kiểu dữ liệu)" msgid "Below Threshold" -msgstr "Dưới Ngưỡng" +msgstr "Giới Hạn Dưới" msgid "Only replace destination elements where data is below given threshold (exact behavior depends on data type)" -msgstr "Chỉ thay thế phần tử đích nào có dữ liệu nhỏ hơn ngưỡng được xác định (hành vi tùy kiểu dữ liệu)" +msgstr "Chỉ thay thế các phần tử ở đích khi dữ liệu thấp hơn giới hạn đã cho (thực thế xử lý thế nào còn tùy vào kiểu dữ liệu)" msgid "Mix source value into destination one, using given threshold as factor" -msgstr "Pha trộn giá trị nguồn vào giá trị đích, dùng ngưỡng được xác định làm hệ số" +msgstr "Hòa trộn giá trị nguồn với cái ở đích, dùng giới hạn đã định làm hệ số" msgid "Add source value to destination one, using given threshold as factor" -msgstr "Cộng giá trị nguồn với giá trị đích, dùng ngưỡng được xác định làm hệ số" +msgstr "Cộng giá trị nguồn vào cái ở đích, dùng giới hạn đã định làm hệ số" msgid "Subtract source value to destination one, using given threshold as factor" -msgstr "Trừ giá trị nguồn từ giá trị đích, dùng ngưỡng được xác định làm hệ số" +msgstr "Khấu Trừ giá trị nguồn khỏi cái ở đích, dùng giới hạn đã định làm hệ số" msgid "Multiply source value to destination one, using given threshold as factor" -msgstr "Nhân giá trị nguồn với giá trị đích, dùng ngưỡng được xác định làm hệ số" +msgstr "Nhân giá trị nguồn với cái ở đích, dùng giới hạn đã định làm hệ số" msgid "Source Object" -msgstr "Vật Thể Nguồn" +msgstr "Đối Tượng Nguồn" msgid "Object to transfer data from" -msgstr "Truyền dữ liệu từ vật thể nào" +msgstr "Đối tượng để thuyên chuyển dữ liệu từ đó sang" msgid "Face Mapping" -msgstr "Ánh Xạ Mặt" +msgstr "Ánh Xạ Bản Đồ Mặt" msgid "Method used to map source faces to destination ones" -msgstr "Phương pháp cho ánh xạ mặt nguồn đến mặt đích" +msgstr "Phương pháp dùng để ánh xạ những các mặt ở nguồn đến những cái ở đích" msgid "Nearest Face" msgstr "Mặt Gần Nhất" +msgid "Copy from nearest face (using center points)" +msgstr "Sao chép từ mặt gần nhất (sử dụng các điểm trung tâm)" + + msgid "Best Normal-Matching" -msgstr "Pháp Tuyến Giống Nhất" +msgstr "Pháp Tuyến Khớp Nhất" + + +msgid "Copy from source face which normal is the closest to destination one" +msgstr "Sao chép từ mặt nguồn tức cái mà pháp tuyến nằm gần nhất với cái ở đích" msgid "Interpolate all source polygons intersected by the projection of destination one along its own normal" -msgstr "Nội suy hết đa giác nguồn bị giao cắt bởi phép chiếu của đích theo pháp tuyến của nó" +msgstr "Nội suy toàn bộ các đa giác nguồn bị giao cắt bởi sự dự phóng của đích, dọc theo pháp tuyến của riêng của nó" msgid "Ray Radius" -msgstr "Bán Kính Tia" +msgstr "Bán Kính Tia Xạ" msgid "'Width' of rays (especially useful when raycasting against vertices or edges)" -msgstr "'Bề Rộng' của tia (rất lợi ích khi phát tia để trúng đỉnh hay cạnh)" +msgstr "'Chiều rộng' của tia xạ (đặc biệt có lợi khi bắn tia trên các điểm đỉnh hay các cạnh)" msgid "Edge Data" @@ -34871,99 +37668,99 @@ msgstr "Dữ Liệu Cạnh" msgid "Enable edge data transfer" -msgstr "Bật truyền dữ liệu cạnh" +msgstr "Cho phép thuyên chuyển dữ liệu cạnh" msgid "Face Corner Data" -msgstr "Dữ Liệu Góc Mặt" +msgstr "Dữ Liệu Góc của Mặt" msgid "Enable face corner data transfer" -msgstr "Bật truyển dữ liệu góc giác mặt" +msgstr "Cho phép thuyên chuyển dữ liệu góc của Mặt" msgid "Only Neighbor Geometry" -msgstr "Chỉ Hình Dạng Kề" +msgstr "Duy Hình Học Lân Cận" msgid "Source elements must be closer than given distance from destination one" -msgstr "Phần tử nguồn phải gần đích hơn một khoảng cách được xác định" +msgstr "Các thành phần nguồn cần phải gần hơn khoảng cách đã cho với cái ở đích" msgid "Object Transform" -msgstr "Biến Hóa Vật Thể" +msgstr "Biến Hóa Đối Tượng" msgid "Evaluate source and destination meshes in global space" -msgstr "Đánh giá mạng lưới nguồn va đích trong không gian toàn cầu" +msgstr "Ước tính khung lưới nguồn và đích trong không gian toàn cầu" msgid "Enable face data transfer" -msgstr "Bật truyền dữ liệu mặt" +msgstr "Cho phép thuyên chuyển dữ liệu Mặt" msgid "Vertex Data" -msgstr "Dữ Liệu Đỉnh" +msgstr "Dữ Liệu Điểm Đỉnh" msgid "Enable vertex data transfer" -msgstr "Bật truyền dữ liệu đỉnh" +msgstr "Cho phép thuyên chuyển dữ liệu điểm đỉnh" msgid "Vertex Mapping" -msgstr "Ánh Xạ Đỉnh" +msgstr "Ánh Xạ Điểm Đỉnh" msgid "Method used to map source vertices to destination ones" -msgstr "Phương pháp cho ánh xạ đỉnh nguồn đến đỉnh đích" +msgstr "Phương pháp sử dụng để ánh xạ điểm đỉnh ở nguồn đến những cái ở đích" msgid "Copy from closest vertex" -msgstr "Chép từ đỉnh gần nhất" +msgstr "Sao chép từ điểm đỉnh gần nhất" msgid "Nearest Edge Vertex" -msgstr "Đỉnh Cạnh Gần Nhất" +msgstr "Điểm Đỉnh của Cạnh Gần Nhất" msgid "Copy from closest vertex of closest edge" -msgstr "Chép từ đỉnh gần nhất của cạnh gần nhất" +msgstr "Sao chép từ điểm đỉnh gần nhất của cạnh cận nhất" msgid "Nearest Edge Interpolated" -msgstr "Cạnh Gần Nhất Được Nội Suy" +msgstr "Cạnh Gần Nhất được Nội Suy" msgid "Copy from interpolated values of vertices from closest point on closest edge" -msgstr "Chép từ giá trị suy nội của các đỉnh từ điểm gần nhất trên cạnh gần nhất" +msgstr "Sao chép từ các giá trị nội suy của các điểm đỉnh từ điểm gần nhất trên cạnh cận nhất" msgid "Nearest Face Vertex" -msgstr "Đỉnh Mặt Gần Nhất" +msgstr "Điểm Đỉnh của Mặt Gần Nhất" msgid "Copy from closest vertex of closest face" -msgstr "Chép từ đỉnh gần nhất của mật gần nhất" +msgstr "Sao chép từ điểm đỉnh gần nhất của Mặt cận nhất" msgid "Copy from interpolated values of vertices from closest point on closest face" -msgstr "Chép từ giá trị suy nội của các đỉnh từ điểm gần nhất của mặt gần nhất" +msgstr "Sao chép từ các giá trị nội suy của các điểm đỉnh, từ điểm gần nhất trên Mặt cận nhất" msgid "Copy from interpolated values of vertices from point on closest face hit by normal-projection" -msgstr "Chép từ giá trị suy nội của các đỉnh từ điểm gần nhất trên mặt gần nhất bị trúng bởi phép chiếu của pháp tuyến" +msgstr "Sao chép từ các giá trị nội suy của các điểm đỉnh, từ điểm trên Mặt gần nhất mà dự phóng pháp tuyến đập vào" msgid "Vertex group name for selecting the affected areas" -msgstr "Tên nhóm đỉnh để chọn vùng được ảnh hướng" +msgstr "Tên nhóm điểm đỉnh sử dụng để lựa chọn các vùng bị ảnh hưởng" msgid "Decimate Modifier" -msgstr "Bộ Điều Chỉnh Chẻ Cắt" +msgstr "Bộ Điều Chỉnh Tiêu Hao" msgid "Decimation modifier" -msgstr "Bộ điều chỉnh chẻ cắt" +msgstr "Bộ điều chỉnh làm tiêu hao" msgid "Angle Limit" @@ -34971,23 +37768,23 @@ msgstr "Giới Hạn Góc" msgid "Only dissolve angles below this (planar only)" -msgstr "Hòa tan góc nhỏ hơn số này (chỉ cho mặt phẳng)" +msgstr "Chỉ tiêu hủy các góc nhỏ hơn giá trị này (chỉ mặt phẳng thôi)" msgid "Collapse" -msgstr "Tóp" +msgstr "Thu Lại" msgid "Use edge collapsing" -msgstr "Dùng tóp cạnh" +msgstr "Sử dụng quá trình thu cạnh lại" msgid "Un-Subdivide" -msgstr "Tóp Phân Hóa" +msgstr "Hủy Phân Chia" msgid "Use un-subdivide face reduction" -msgstr "Dùng giảm mặt tóp phân hóa" +msgstr "Dùng sự tiêu giảm phi Mặt phân hóa" msgid "Planar" @@ -34995,35 +37792,35 @@ msgstr "Mặt Phẳng" msgid "Dissolve geometry to form planar polygons" -msgstr "Hòa tan hình dạng để tạo đa giác mặt phẳng" +msgstr "Tiêu hủy hình học để tạo các đa giác mặt phẳng" msgid "Delimit" -msgstr "Hạn Chế" +msgstr "Phân Giới" msgid "Limit merging geometry" -msgstr "Hạn chế gồm hình dạng" +msgstr "Hạn chế sự hợp nhất hình học" msgid "Delimit by face directions" -msgstr "Dùng hướng mặt để hạn chế" +msgstr "Phân giới theo các định hướng của Mặt" msgid "Delimit by face material" -msgstr "Hạn chế bằng vật liệu" +msgstr "Phân giới bằng nguyên vật liệu của Mặt" msgid "Delimit by edge seams" -msgstr "Hạn chế bằng vết sẹo cạnh" +msgstr "Phân giới bằng các đường khâu vá" msgid "Delimit by sharp edges" -msgstr "Hạn chế bằng cạnh bén" +msgstr "Phân giới bằng các cạnh sắc nhọn" msgid "Delimit by UV coordinates" -msgstr "Hạn chế bằng tọa độ UV" +msgstr "Phân giới bằng các tọa độ UV" msgid "Face Count" @@ -35031,83 +37828,83 @@ msgstr "Số Lượng Mặt" msgid "The current number of faces in the decimated mesh" -msgstr "Số lượng mặt trong mạng lưới bị chẻ cắt" +msgstr "Số lượng các mặt hiện tại trong khung lưới bị tiêu hao" msgid "Invert vertex group influence (collapse only)" -msgstr "Đảo nghịch sự ảnh hưởng nhóm (chỉ cho tóp)" +msgstr "Đảo nghịch ảnh hưởng của nhóm điểm đỉnh (duy thu lại mà thôi)" msgid "Number of times reduce the geometry (unsubdivide only)" -msgstr "Số lần giảm hình dạng (chỉ cho tóp phân hóa)" +msgstr "Số lần tiêu giảm hình học (duy cho hủy phân chia mà thôi)" msgid "Ratio of triangles to reduce to (collapse only)" -msgstr "Tỉ số cho giảm lượng tam giác đến (chỉ cho tóp)" +msgstr "Tỷ số tam giác để tiêu giảm (duy thu lại mà thôi)" msgid "Axis of symmetry" -msgstr "Trục Đối Xứng" +msgstr "Trục đối xứng" msgid "Keep triangulated faces resulting from decimation (collapse only)" -msgstr "Giữ các mặt từ tam giác hóa từ chẻ cắt (chỉ cho tóp)" +msgstr "Giữ các mặt tam giác hóa đạt được qua quá trình tiêu hao (duy thu lại mà thôi)" msgid "All Boundaries" -msgstr "Hết Ranh Giới" +msgstr "Toàn Bộ Ranh Giới" msgid "Dissolve all vertices in between face boundaries (planar only)" -msgstr "Hóa tan tất cả đỉnh giữa ranh giới mặt (chỉ trong mặt phẳng)" +msgstr "Tiêu hủy các điểm đỉnh nằm giữa các ranh giới Mặt (duy cho Mặt Phẳng (planar) mà thôi)" msgid "Symmetry" -msgstr "Đối Xứng" +msgstr "Đối xứng" msgid "Maintain symmetry on an axis" -msgstr "Giữ lại đối xứng trên một trục" +msgstr "Duy trì sự đối xứng trên một trục" msgid "Vertex group name (collapse only)" -msgstr "Tên nhóm đỉnh (chỉ cho tóp)" +msgstr "Tên nhóm điểm đỉnh (duy thu lại mà thôi)" msgid "Vertex group strength" -msgstr "Sức nhóm đỉnh" +msgstr "Cường độ ảnh hưởng của nhóm điểm đỉnh" msgid "Displace Modifier" -msgstr "Bộ Điều Chỉnh Dịch" +msgstr "Bộ Điều Chỉnh Dời Hình" msgid "Displacement modifier" -msgstr "Cụ sửa dổi dịch" +msgstr "Bộ điều chỉnh dời hình" msgid "Use the texture's intensity value to displace in the X direction" -msgstr "Dùng giá trị cường độ chất liệu cho dịch hướng X" +msgstr "Dùng giá trị cường độ ánh sáng của chất liệu để dời hình trong hướng X" msgid "Use the texture's intensity value to displace in the Y direction" -msgstr "Dùng giá trị cường độ chất liệu cho dịch hướng Y" +msgstr "Dùng giá trị cường độ ánh sáng của chất liệu để dời hình trong hướng Y" msgid "Use the texture's intensity value to displace in the Z direction" -msgstr "Dùng giá trị cường độ chất liệu cho dịch hướng Z" +msgstr "Dùng giá trị cường độ ánh sáng của chất liệu để dời hình trong hướng Z" msgid "Use the texture's intensity value to displace along the vertex normal" -msgstr "Dùng giá trị cường độ chất liệu cho dịch theo hướng pháp tuyến đỉnh" +msgstr "Dùng giá trị cường độ ánh sáng của chất liệu để dời hình dọc theo hướng pháp tuyến điểm đỉnh" msgid "Custom Normal" -msgstr "Pháp Tuyến Tùy Chọn" +msgstr "Pháp Tuyến Tùy Chỉnh" msgid "Use the texture's intensity value to displace along the (averaged) custom normal (falls back to vertex)" -msgstr "Dùng giá trị cường độ của chất liệu cho dịch theo hướng pháp tuyến tùy chọn (tính trung bình), (nếu không có sẽ dùng đỉnh)" +msgstr "Dùng giá trị cường độ ánh sáng của chất liệu để dời hình theo hướng pháp tuyến tùy chỉnh (tính trung bình) - (dùng điểm đỉnh làm nguồn dự phòng để quay trở về nếu cần)" msgid "RGB to XYZ" @@ -35115,27 +37912,27 @@ msgstr "RGB sang XYZ" msgid "Use the texture's RGB values to displace the mesh in the XYZ direction" -msgstr "Dùng các giá trị RGB của chất liệu cho dịch mạng lưới hướng XYZ" +msgstr "Dùng các giá trị RGB của chất liệu để dời hình khung lưới theo hướng XYZ" msgid "Midlevel" -msgstr "Mức Độ Giữa" +msgstr "Trung Độ" msgid "Material value that gives no displacement" -msgstr "Giá trị vật liệu thì không được dịch gì cả" +msgstr "Giá trị mà nguyên vật liệu không gây ra sự dời hình" msgid "Direction is defined in local coordinates" -msgstr "Hướng được chỉ định bằng tọa độ địa phương" +msgstr "Chiều hướng được xác định trong tọa độ địa phương" msgid "Direction is defined in global coordinates" -msgstr "Hướng được chỉ định bằng tọa độ toàn cầu" +msgstr "Chiều hướng được xác định trong tọa độ toàn cầu" msgid "Amount to displace geometry" -msgstr "Mức cho dịch hình dạng" +msgstr "Lượng dời hình hình học" msgid "Texture Coordinates" @@ -35151,7 +37948,7 @@ msgstr "Dùng hệ thống tọa độ toàn cầu cho tọa độ chất liệu msgid "Use the linked object's local coordinate system for the texture coordinates" -msgstr "Dùng tọa độ địa phương của vật thể được liên kết cho làm tọa độ chất liệu" +msgstr "Dùng tọa độ địa phương của đối tượng kết nối cho tọa độ chất liệu" msgid "Use UV coordinates for the texture coordinates" @@ -35159,75 +37956,90 @@ msgstr "Dùng tọa độ UV cho tọa độ chất liệu" msgid "Texture Coordinate Bone" -msgstr "Xương Tọa Độ Chất Liệu" +msgstr "Xương đặt Tọa Độ Chất Liệu" msgid "Bone to set the texture coordinates" -msgstr "Xương dùng cho đặt tọa độ chất liệu" +msgstr "Xương dùng để đặt tọa độ của chất liệu" msgid "Texture Coordinate Object" -msgstr "Vật Thể Tọa Độ Chất Liệu" +msgstr "Đối Tượng Đặt Tọa Độ Chất Liệu" msgid "Object to set the texture coordinates" -msgstr "Vật thể dùng cho đặt tọa độ chất liệu" +msgstr "Đối tượng để đặt tọa độ của chất liệu" msgid "Dynamic Paint Modifier" -msgstr "Bộ Điều Chỉnh Sơn Động Lý" +msgstr "Bộ Điều Chỉnh Sơn Động Lực" msgid "Dynamic Paint modifier" -msgstr "Bộ điều chỉnh sơn động lý" +msgstr "Bộ điều chỉnh Sơn Động Lực" + + +msgctxt "Simulation" +msgid "Type" +msgstr "Thể Loại" + + +msgctxt "Simulation" +msgid "Canvas" +msgstr "Khung Vẽ" + + +msgctxt "Simulation" +msgid "Brush" +msgstr "Đầu Bút" msgid "EdgeSplit Modifier" -msgstr "Bộ Điều Chỉnh ChẻCạnh" +msgstr "Bộ Điều Chỉnh Tách Phân Cạnh" msgid "Edge splitting modifier to create sharp edges" -msgstr "Bộ điều chỉnh chẻ cạnh để chế tạo cạnh bén" +msgstr "Bộ điều chỉnh tách phân cạnh để kiến tạo các cạnh sắc nhọn" msgid "Split Angle" -msgstr "Chẻ Góc" +msgstr "Góc Độ Tách Phân" msgid "Angle above which to split edges" -msgstr "Chẻ cạnh có góc lớn hơn này" +msgstr "Góc độ mà những giá trị lớn hơn sẽ gây ra sự tách phân của cạnh" msgid "Use Edge Angle" -msgstr "Dùng Góc Cạnh" +msgstr "Dùng Góc của Cạnh" msgid "Split edges with high angle between faces" -msgstr "Chẻ cạnh có góc lớn giữa mặt" +msgstr "Tách phân các cạnh với góc độ giữa các mặt có giá trị cao" msgid "Use Sharp Edges" -msgstr "Dùng Cạnh Nhọn" +msgstr "Dùng các Cạnh Sắc Nhọn" msgid "Split edges that are marked as sharp" -msgstr "Chẻ cạnh được ký dấu là bén" +msgstr "Tách phân các cạnh được đánh dấu là sắc nhọn" msgid "Explode Modifier" -msgstr "Bộ Điều Chỉnh Nổ" +msgstr "Bộ Điều Chỉnh Nổ Tung" msgid "Explosion effect modifier based on a particle system" -msgstr "Bộ điều chỉnh cho hiệu ứng nổ, cơ sở một hệ thống hạt" +msgstr "Bộ điều chỉnh hiệu ứng nổ tung, dựa trên cơ sở một hệ thống hạt" msgid "Particle UV" -msgstr "Hạt UV" +msgstr "UV của Hệ Thống Hạt" msgid "UV map to change with particle age" -msgstr "Bản đồ UV cho đổi khi hạt lão hóa" +msgstr "Ánh xạ UV biến đổi với tuổi thọ của hạt" msgid "Protect" @@ -35235,27 +38047,27 @@ msgstr "Bảo Vệ" msgid "Clean vertex group edges" -msgstr "Làm sạch cạnh nhóm đỉnh" +msgstr "Làm sạch các cạnh của nhóm điểm đỉnh" msgid "Alive" -msgstr "Sống" +msgstr "Hoạt Động" msgid "Show mesh when particles are alive" -msgstr "Hiện mạng lưới khi hạt còn sống" +msgstr "Hiển thị khung lưới khi các hạt hoạt động" msgid "Dead" -msgstr "Hủy Diệt" +msgstr "Chết" msgid "Show mesh when particles are dead" -msgstr "Hiện mạng lưới khi hạt đã bị hủy diệt" +msgstr "Hiển thị khung lưới khi các hạt chết" msgid "Show mesh when particles are unborn" -msgstr "Hiện mạng lưới khi hạt chưa được sanh" +msgstr "Hiển thị khung lưới khi các hạt chưa được sinh ra" msgid "Cut Edges" @@ -35263,11 +38075,11 @@ msgstr "Cắt Cạnh" msgid "Cut face edges for nicer shrapnel" -msgstr "Cắt cạnh mặt cho mảnh tốt hơn" +msgstr "Cắt các cạnh Mặt để làm cho các mảnh vỡ trông đẹp hơn" msgid "Use particle size for the shrapnel" -msgstr "Kích cỡ hạt cho mảnh" +msgstr "Dùng kích thước của hạt cho các mảnh vỡ" msgid "Fluid Modifier" @@ -35279,123 +38091,123 @@ msgstr "Bộ điều chỉnh mô phỏng chất lỏng" msgid "Inflow/Outflow" -msgstr "Lưu Nhập/Lưu Xuất" +msgstr "Luồng Nhập/Luồng Xuất" msgid "Hook modifier to modify the location of vertices" -msgstr "Bộ điều chỉnh móc để sửa đổi vị trí của đỉnh" +msgstr "Bộ điều chỉnh móc để thay đổi vị trí của các điểm đỉnh" msgid "Center of the hook, used for falloff and display" -msgstr "Trung tâm của móc, được dùng cho sự giảm và hiển thị" +msgstr "Trung tâm của móc, sử dụng để tính sự suy giảm dần và hiển thị" msgid "Vertex Indices" -msgstr "Chỉ Số Đỉnh" +msgstr "Chỉ Số Điểm Đỉnh" msgid "Indices of vertices bound to the modifier. For bezier curves, handles count as additional vertices" -msgstr "Chỉ số đỉnh được hạn chế bởi bộ điều chỉnh. Cho cong Bezier, tay cầm cũng là đỉnh được đếm" +msgstr "Chỉ số của các điểm đỉnh đã được kết buộc vào bộ điều chỉnh. Đối với các đường cong bezier, các tay cầm được tính như các điểm đỉnh bổ xung" msgid "Laplacian Deform Modifier" -msgstr "Bộ Điều Chỉnh Méo Hóa Laplace" +msgstr "Bộ Điều Chỉnh Biến Dạng Laplace" msgid "Mesh deform modifier" -msgstr "Bộ điều chỉnh méo hóa mạng lưới" +msgstr "Bộ điều chỉnh biến dạng khung lưới" msgid "Bound" -msgstr "Trói" +msgstr "Liên Kết" msgid "Whether geometry has been bound to anchors" -msgstr "Hình dạng bị trói với neo hay không" +msgstr "Hình học của đối tượng đã được liên kết với các mấu neo chốt hay chưa" msgid "Anchor Weights" -msgstr "Quyền Lượng Neo" +msgstr "Trọng Lượng Neo" msgid "Name of Vertex Group which determines Anchors" -msgstr "Tên của Nhóm Đỉnh được xác định Các Neo" +msgstr "Tên của Nhóm Điểm Đỉnh, tức cái xác định các Mấu Neo Chốt" msgid "Laplacian Smooth Modifier" -msgstr "Bộ Điều Chỉnh Mịn Hoá Laplace" +msgstr "Bộ Điều Chỉnh Làm Mịn Laplace" msgid "Smoothing effect modifier" -msgstr "Bộ điều chỉnh hiệu ứng mịn hóa" +msgstr "Bộ điều chỉnh hiệu ứng làm mịn" msgid "Lambda Border" -msgstr "Ranh Giới Lamđa" +msgstr "Ranh Giới Lambda" msgid "Lambda factor in border" -msgstr "Hệ số lamđa trong ranh giới" +msgstr "Hệ số Lambda trong ranh giới" msgid "Normalized" -msgstr "Đơn Vị Hóa" +msgstr "Bình Thường Hóa" msgid "Improve and stabilize the enhanced shape" -msgstr "Phát triển và ổn định hóa dạng nâng cấp" +msgstr "Cải tiến và ổn định hình dạng đã được nâng cấp" msgid "Apply volume preservation after smooth" -msgstr "Áp dụng giữ nguyên thể tích sau mịn hóa" +msgstr "Duy trì thể tích sau khi đã làm mịn" msgid "Smooth object along X axis" -msgstr "Mịn hoá vật thể hướng X" +msgstr "Làm mịn đối tượng dọc theo hướng X" msgid "Smooth object along Y axis" -msgstr "Mịn hoá vật thể hướng Y" +msgstr "Làm mịn đối tượng dọc theo hướng Y" msgid "Smooth object along Z axis" -msgstr "Mịn hoá vật thể hướng Z" +msgstr "Làm mịn đối tượng dọc theo hướng Z" msgid "Lattice deformation modifier" -msgstr "Bộ điều chỉnh méo háo rào lưới" +msgstr "Bộ điều chỉnh biến dạng bằng lưới rào" msgid "Mask Modifier" -msgstr "Bộ Điều Chỉnh Mặt Nạ" +msgstr "Bộ Điều Chỉnh Màn Chắn Lọc" msgid "Mask modifier to hide parts of the mesh" -msgstr "Dùng bộ điều chỉnh mặt nạ để giấu bộ phận của mạng lưới" +msgstr "Dùng bộ điều chỉnh Màn Chắn Lọc để che giấu các phần của khung lưới" msgid "Armature to use as source of bones to mask" -msgstr "Dùng Cốt nào cho làm nguồn xương để che mặt nạ" +msgstr "Khung Cốt dùng làm các xương nguồn để chắn lọc" msgid "Use vertices that are not part of region defined" -msgstr "Dùng các đỉnh không phải là bộ phận của vùng được xác định" +msgstr "Dùng các điểm đỉnh không thuộc khu vực đã định" msgid "Weights over this threshold remain" -msgstr "Quyền lượng hơn ngưỡng này vẫn còn" +msgstr "Những trọng lượng vượt quá giới hạn này sẽ giữ nguyên" msgid "Use vertex group weights to cut faces at the weight contour" -msgstr "Dùng quyền lượng nhóm đỉnh để cắt mặt tại đường quyền đồng mức" +msgstr "Dùng trọng lượng của nhóm điểm đỉnh để cắt các mặt tại đường công tua của trọng lượng" msgid "Cache Modifier" -msgstr "Bộ Điều Chỉnh Đệm Chứa" +msgstr "Bộ Chỉnh Sửa Bộ Nhớ Đệm" msgid "Cache Mesh" -msgstr "Mạng Lưới Đệm Chứa" +msgstr "Bộ Nhớ Đệm Khung Lưới" msgid "MDD" @@ -35407,15 +38219,23 @@ msgstr "PC2" msgid "Deform Mode" -msgstr "Chế Độ Méo Hóa" +msgstr "Chế Độ Biến Dạng" msgid "Overwrite" -msgstr "Ghi Lên Trên" +msgstr "Viết Đè Lên" + + +msgid "Replace vertex coordinates with cached values" +msgstr "Thay thế tọa độ điểm đỉnh bằng các giá trị lưu trong bộ đệm nhớ" msgid "Integrate" -msgstr "Tích Phân" +msgstr "Tích Hợp" + + +msgid "Integrate deformation from this modifier's input with the mesh-cache coordinates (useful for shape keys)" +msgstr "Tích hợp biến dạng từ đầu vào của bộ điều chỉnh này với tọa độ bộ đệm khung lưới (hữu ích cho các hình mẫu)" msgid "Evaluation Factor" @@ -35423,35 +38243,35 @@ msgstr "Hệ Số Đánh Giá" msgid "Evaluation Frame" -msgstr "Bức Ảnh Đánh Giá" +msgstr "Khung Hình Đánh Giá" msgid "The frame to evaluate (starting at 0)" -msgstr "Số bức ảnh cho đánh giá (bắt đầu tại 0)" +msgstr "Khung hình để tính toán (bắt đầu tại 0)" msgid "Influence of the deformation" -msgstr "Sự ảnh hướng của méo hóa" +msgstr "Tác động của sự biến dạng" msgid "Frame Start" -msgstr "Bức Ảnh Đầu" +msgstr "Khung Hình Khởi Đầu" msgid "Add this to the start frame" -msgstr "Cộng này với bức ảnh đầu" +msgstr "Cộng giá trị này vào khung hình khởi đầu" msgid "Play Mode" -msgstr "Chế Độ Hát Lại" +msgstr "Chế Độ Chơi" msgid "Use the time from the scene" -msgstr "Dùng thời gian từ cảnh" +msgstr "Sử dụng thời gian của cảnh" msgid "Use the modifier's own time evaluation" -msgstr "Dùng phương pháp tính thời gian của bộ điều chỉnh" +msgstr "Dùng phương pháp tính thời gian của bản thân bộ điều chỉnh" msgid "Time Mode" @@ -35459,215 +38279,219 @@ msgstr "Chế Độ Thời Gian" msgid "Method to control playback time" -msgstr "Phương pháp cho điều khiển thời gian hát lại" +msgstr "Phương pháp điều khiển thời gian chơi lại" msgid "Control playback using a frame-number (ignoring time FPS and start frame from the file)" -msgstr "Điều khiển hát lại bằng một số bức ảnh (không quan thời gian tâm bức ảnh/giây và số bức ảnh đầu trong tập tin)" +msgstr "Điều khiển việc chơi lại bằng số của khung hình (bỏ qua thời gian Khung Hình/Giây và khung hình khởi đầu trong tập tin)" msgid "Control playback using time in seconds" -msgstr "Điều khiển hát lại bằng giây" +msgstr "Điều khiển việc chơi lại dùng thời gian trong số giây" msgid "Control playback using a value between 0 and 1" -msgstr "Điều khiển hát lại bằng dùng một giá trị giữa 0 và 1" +msgstr "Điều khiển việc chơi lại dùng một giá trị nằm giữa khoảng 0 và 1" msgid "Name of the Vertex Group which determines the influence of the modifier per point" -msgstr "Tên của Nhóm Đỉnh thì được quyết định sự ảnh hưởng của bộ điều chỉnh từng điểm" +msgstr "Tên của Nhóm Điểm Đỉnh, tức cái quyết định ảnh hưởng của bộ điều chỉnh trên mỗi điểm" msgid "MeshDeform Modifier" -msgstr "Bộ Điều Chỉnh MéoHóaMạngLưới" +msgstr "Bộ Điều Chỉnh Biến Dạng Khung Lưới" msgid "Mesh deformation modifier to deform with other meshes" -msgstr "Bộ điều chỉnh méo hóa mạng lưới cho làm méo hóa mạng lưới khác" +msgstr "Bộ điều chỉnh biến dạng khung lưới để làm biến dạng với các khung lưới khác" msgid "Whether geometry has been bound to control cage" -msgstr "Hình dạng có bị nhốt trong lồng điều khiển hay không" +msgstr "Hình học đã được liên kết với khung lồng điều khiển hay chưa" msgid "Mesh object to deform with" -msgstr "Vật thể mạng lưới để làm méo hóa" +msgstr "Đối tượng khung lưới để biến dạng với" msgid "The grid size for binding" -msgstr "Kích cỡ đồ thị cho trói" +msgstr "Kích thước khung lưới đồ thị để kết buộc" msgid "Recompute binding dynamically on top of other deformers (slower and more memory consuming)" -msgstr "Tính lại trói kiểu động lý trên đồ méo hóa khác (chậm hơn và dùng bộ nhớ hơn)" +msgstr "Năng động tính toán lại kết buộc sau toàn bộ các bộ biến dạng khác (chậm hơn và sử dụng bộ nhớ nhiều hơn)" msgid "Path to the object in the Alembic archive used to lookup geometric data" -msgstr "Đường dẫn đến vật thể trong kho Alembic để tìm dữ liệu hình dạng" +msgstr "Đường dẫn đến đối tượng trong kho Alembic, sử dụng để lùng tìm dữ liệu hình học" msgid "Read Data" -msgstr "Đọc Dữ Liệu" +msgstr "Dữ Liệu Đọc" msgid "Data to read from the cache" -msgstr "Dữ liệu để đọc từ đệm chứa" +msgstr "Dữ liệu đọc từ bộ đệm nhớ" msgid "Vertex Interpolation" -msgstr "Suy Nội Đỉnh" +msgstr "Nội Suy Điểm Đỉnh" msgid "Allow interpolation of vertex positions" -msgstr "Cho suy nội vị trí của đỉnh" +msgstr "Cho phép nội suy các vị trí của điểm đỉnh" msgid "Multiplier used to control the magnitude of the velocity vectors for time effects" -msgstr "Hệ số để kiểm soát độ lớn của vectơ vận tốc cho hiệu ứng thời gian" +msgstr "Số nhân sử dụng để điều khiển độ lớn của các véctơ vận tốc, dành cho các hiệu ứng thời gian" msgid "Mesh to Volume Modifier" -msgstr "Mạng Lưới Đến Bộ Điều Chỉnh Thể Tích " +msgstr "Bộ Điều Chỉnh Khung Lưới thành Thể Tích" msgid "Density of the new volume" -msgstr "Tỉ trọng của thể tích mới" +msgstr "Tỷ trọng của thể tích mới" msgid "Interior Band Width" -msgstr "Bề Rộng Vành Đai Nội" +msgstr "Bán Kính Nội" + + +msgid "Width of the gradient inside of the mesh" +msgstr "Chiều rộng của dốc màu bên trong khung lưới" msgid "Resolution Mode" -msgstr "Chế Độ Độ Phân Giải" +msgstr "Chế Độ Phân Giải" msgid "Mode for how the desired voxel size is specified" -msgstr "Chế độ cho chỉ định kích cỡ của thể tích tử" +msgstr "Chế độ để xác định kích thước thể tích tử theo mong muốn" msgid "Voxel Amount" -msgstr "Lượng Thể Tích Tử" +msgstr "Số Lượng Thể Tích Tử" msgid "Desired number of voxels along one axis" -msgstr "Số lượng thể tích tử theo một trục" +msgstr "Số lượng thể tích tử mong muốn dọc theo một trục" msgid "Desired voxel side length" -msgstr "Bề dài thể tích tử như cầu" +msgstr "Chiều dài mong muốn của thể tích tử" msgid "Approximate number of voxels along one axis" -msgstr "Lượng xấp xỉ của thể tích tử theo một trục" +msgstr "Ước tính số lượng thể tích tử dọc theo một trục" msgid "Smaller values result in a higher resolution output" -msgstr "Giá trị nhỏ hơn cho một ngõ ra có độ phân giải cao hơn" +msgstr "Giá trị nhỏ sẽ cho độ phân giải cao hơn" msgid "Mirroring modifier" -msgstr "Bộ điều chỉnh gương" +msgstr "Bộ điều chỉnh phản chiếu đối xứng" msgid "Bisect Distance" -msgstr "Khoảng Cách Chẻ Hai" +msgstr "Khoảng Cách Phân Đôi" msgid "Distance from the bisect plane within which vertices are removed" -msgstr "Khoảng cách từ mặt phẳng chẻ hai để xóa đỉnh ở phía trong" +msgstr "Những điểm đỉnh nào nằm trong khoảng cách giữa hai bề diện tách phân này sẽ bị xóa đi" msgid "Distance within which mirrored vertices are merged" -msgstr "Khoảng cách mà các đỉnh được gương sẽ bị gồm lại" +msgstr "Các điểm đỉnh phản chiếu đối xứng nội trong khoảng cách này sẽ được hợp nhất lại" msgid "Object to use as mirror" -msgstr "Vật thể cho làm gương" +msgstr "Đối tượng để làm trục phản chiếu đối xứng" msgid "Flip U Offset" -msgstr "Lật Dịch U" +msgstr "Dịch Chuyển Đảo Lật U" msgid "Amount to offset mirrored UVs flipping point from the 0.5 on the U axis" -msgstr "Mức để dịch các tọa độ UV gương từ điểm lật 0.5 trên trục U" +msgstr "Lượng dịch chuyển điểm lật đảo của UV phản chiếu đối xứng từ điểm 0.5 trên trục U" msgid "Flip V Offset" -msgstr "Lật Dịch V" +msgstr "Dịch Chuyển Đảo Lật V" msgid "Amount to offset mirrored UVs flipping point from the 0.5 point on the V axis" -msgstr "Mức để dịch các tọa độ UV gương từ điểm lật 0.5 trên trục V" +msgstr "Lượng dịch chuyển điểm lật đảo của UV phản chiếu đối xứng từ điểm 0.5 trên trục V" msgid "Mirrored UV offset on the U axis" -msgstr "Gương hóa dịch UV trên trục U" +msgstr "Dịch chuyển của UV được phản chiếu đối xứng trên trục U" msgid "Mirrored UV offset on the V axis" -msgstr "Gương hóa dịch UV trên trục V" +msgstr "Dịch chuyển của UV được phản chiếu đối xứng trên trục V" msgid "Mirror Axis" -msgstr "Trục Gương" +msgstr "Trục Phản Chiếu Đối Xứng" msgid "Enable axis mirror" -msgstr "Bật gương trục" +msgstr "Cho phép phản chiếu đối xứng qua trục" msgid "Bisect Axis" -msgstr "Cắt Xuyên Trục" +msgstr "Trục Phân Đôi" msgid "Cuts the mesh across the mirror plane" -msgstr "Cắt mạng lưới xuyên mặt phẳng gương" +msgstr "Cắt khung lưới thông qua bề diện phản chiếu đối xứng" msgid "Bisect Flip Axis" -msgstr "Cắt Trục Xuyên Lật" +msgstr "Trục Lật Đảo Phân Đôi" msgid "Flips the direction of the slice" -msgstr "Lật hướng của miến chẻ" +msgstr "Lật đảo hướng của lát cắt" msgid "Prevent vertices from going through the mirror during transform" -msgstr "Ngăn ngừa đỉnh xuyên qua gương khi biến hóa" +msgstr "Ngăn ngừa các điểm đỉnh xuyên qua trục phản chiếu đối xứng trong khi biến hóa" msgid "Merge vertices within the merge threshold" -msgstr "Gồm đỉnh trong ngưỡng gồm" +msgstr "Hội nhập các điểm đỉnh trong giới hạn đã định" msgid "Mirror U" -msgstr "Gương U" +msgstr "Phản Chiếu Đối Xứng U" msgid "Mirror the U texture coordinate around the flip offset point" -msgstr "Gương hóa tọa độ chất liệu U quanh điểm dịch lật" +msgstr "Phản chiếu đối xứng tọa độ chất liệu U quanh vị trí của điểm đảo chiều" msgid "Mirror UDIM" -msgstr "Gương UDIM" +msgstr "Phản Quang Phản Chiếu Đối Xứng UDIM" msgid "Mirror the texture coordinate around each tile center" -msgstr "Gương hóa tọa độ chất liệu quanh trung tâm của mỗi ổ" +msgstr "Phản quang phản chiếu đối xứng tọa độ chất liệu quanh vị trí tâm điểm của mỗi ô" msgid "Mirror V" -msgstr "Gương V" +msgstr "Phản Chiếu Đối Xứng V" msgid "Mirror the V texture coordinate around the flip offset point" -msgstr "Gương hóa tọa độ chất liệu V quanh điểm dịch lật" +msgstr "Phản chiếu đối xứng tọa độ chất liệu V quanh vị trí của điểm đảo chiều" msgid "Mirror vertex groups (e.g. .R->.L)" -msgstr "Nhóm đỉnh gương (ví dụ .P->.T)" +msgstr "Phản chiếu đối xứng nhóm điểm đỉnh (ví dụ: Phải->Trái)" msgid "Multires Modifier" @@ -35675,171 +38499,187 @@ msgstr "Bộ Điều Chỉnh Đa Phân Giải" msgid "Multiresolution mesh modifier" -msgstr "Bộ điều chỉnh mạng lưới đa độ phân giải" +msgstr "Bộ điều chỉnh khung lưới đa phân giải" msgid "Boundary Smooth" -msgstr "Ranh Giới Mịn" +msgstr "Ranh Giới Mịn Màng" msgid "Controls how open boundaries are smoothed" -msgstr "Kiểm soát cách được mịn hóa ranh giới" +msgstr "Điều khiển phương pháp làm mịn màng ranh giới" msgid "Keep Corners" -msgstr "Giữ Góc Giác" +msgstr "Duy Trì các Góc" msgid "Smooth boundaries, but corners are kept sharp" -msgstr "Mịn hóa ranh giới nhưng giữ góc giác còn bén" +msgstr "Làm mịn ranh giới song duy trì độ sắc nhọn của các góc" msgid "Smooth boundaries, including corners" -msgstr "Mịn hóa ranh giới, gồm góc giác" +msgstr "Làm mịn ranh giới, bao gồm cả các góc nữa" msgid "Store multires displacements outside the .blend file, to save memory" -msgstr "Giữ dịch đa độ phân giải ở ngoài tập tin .blend, giúp tiết kiệm bộ nhớ" +msgstr "Lưu trữ các dời hình đa phân giải ngoài tập tin .blend, để tiết kiệm bộ nhớ" msgid "Levels" -msgstr "Mức Độ" +msgstr "Mức Độ/Số Tầng Bậc" msgid "Number of subdivisions to use in the viewport" -msgstr "Số lượng phân hóa cho dùng trong màn chiếu" +msgstr "Lượng phân hóa sử dụng trong cổng nhìn" msgid "Accuracy of vertex positions, lower value is faster but less precise" -msgstr "Độ chính xác của vị trí đỉnh, giá trị càng thấp càng nhanh nhưng giảm độ chính xác" +msgstr "Độ chuẩn xác của các vị trí điểm đỉnh. Giá trị thấp hơn thì nhanh hơn, nhưng ít chính xác hơn" msgid "Render Levels" -msgstr "Mức Độ Kết Xuất" +msgstr "Những Mức Độ Kết Xuất" msgid "The subdivision level visible at render time" -msgstr "Mức độ phân hóa hiển thị khi kết xuất" +msgstr "Mức phân hóa có thể nhìn thấy được khi kết xuất" msgid "Sculpt Levels" -msgstr "Mức độ khắc" +msgstr "Mức Độ Điêu Khắc" msgid "Number of subdivisions to use in sculpt mode" -msgstr "Sô lượng mức độ cho dùng trong chế độ khắc" +msgstr "Lượng phân hóa sử dụng trong chế độ điêu khắc" msgid "Optimal Display" -msgstr "Màn Chiếu Tối Ưu" +msgstr "Hiển Thị Tối Ưu" msgid "Skip drawing/rendering of interior subdivided edges" -msgstr "Bỏ qua vẽ/kết xuất cạnh phân hóa nội bộ" +msgstr "Bỏ qua việc hiển thị/kết xuất các cạnh bên trong đã được phân chia" msgid "Total Levels" -msgstr "Tổng Tầng" +msgstr "Tổng Mức Độ" msgid "Number of subdivisions for which displacements are stored" -msgstr "Số lượng phân hóa mà chứa dịch" +msgstr "Lượng phân hóa mà sự dời hình được lưu trữ" msgid "Use Creases" -msgstr "Dùng Nhăn" +msgstr "Sử Dụng Nếp Gấp" msgid "Use mesh crease information to sharpen edges or corners" -msgstr "Dùng thông tin nhăn của mạng lưới để bén hóa cạnh hay góc giác" +msgstr "Sử dụng thông tin về nếp gấp của khung lưới để làm sắc các cạnh hoặc các góc" msgid "Use Custom Normals" -msgstr "Dùng Pháp Tuyến Tùy Chọn" +msgstr "Sử Dụng Pháp Tuyến Tùy Chỉnh" msgid "Interpolates existing custom normals to resulting mesh" -msgstr "Suy nội phạp tuyến đang tồn tại cho mạng lưới tổng kết" +msgstr "Nội suy những pháp tuyến tùy chỉnh hiện tại sang khung lưới kết quả" msgid "Sculpt Base Mesh" -msgstr "Khắc Mạng Lưới Cơ Sở" +msgstr "Điêu Khắc: Khung Lưới Cơ Sở" msgid "Make Sculpt Mode tools deform the base mesh while previewing the displacement of higher subdivision levels" -msgstr "Dụng cụ khắc được méo hóa mạng lưới cơ sở trong khi được xen dự khán của các tầng bậc phân hóa cao hơn" +msgstr "Bắt các công cụ của Chế Độ Điêu Khắc bóp méo khung lưới cơ sở trong khi xem trước sự dời hình ở các mức phân hóa cao hơn" msgid "UV Smooth" -msgstr "Mịn UV" +msgstr "Cách Làm Mịn UV" msgid "Controls how smoothing is applied to UVs" -msgstr "Điền khiển cách được áp dụng mịn hóa cho UV" +msgstr "Điều khiển phương pháp làm mịn áp dụng vào các UV" msgid "UVs are not smoothed, boundaries are kept sharp" -msgstr "Không mịn hóa UV, ranh giới được giữ bén" +msgstr "UV sẽ không được làm mịn, các đường ranh giới sẽ duy trì độ sắc nhọn" msgid "UVs are smoothed, corners on discontinuous boundary are kept sharp" -msgstr "UV được mịn hóa, góc trên ranh giới không liên tục được giữ bén" +msgstr "UV sẽ được làm mịn, các góc và các đường ranh giới gián đoạn sẽ được duy trì độ sắc nhọn" msgid "Keep Corners, Junctions" -msgstr "Giữ Góc Giác, Mối Nối" +msgstr "Duy Trì Góc Cạnh, Mối Nối" msgid "UVs are smoothed, corners on discontinuous boundary and junctions of 3 or more regions are kept sharp" -msgstr "UV được mịn hóa, góc giác của ranh giới không liên tục và mối nối của ba vùng trở lên được giữ bén" +msgstr "UV sẽ được làm mịn, các góc nằm trên các đường ranh giới gián đoạn và các vùng mối nối của 3 hoặc hơn sẽ được giữ là sắc nhọn" msgid "Keep Corners, Junctions, Concave" -msgstr "Giữ Góc Giác, Mối Nối, Lõm" +msgstr "Duy Trì Góc Cạnh, Mối Nối, Chỗ Lõm Vào" msgid "UVs are smoothed, corners on discontinuous boundary, junctions of 3 or more regions and darts and concave corners are kept sharp" -msgstr "Mịn hóa UV và giữ bén ranh giới không liên tục, mối nối của ba vùng trở lên, phi tiêu, và góc giác lõm " +msgstr "UV sẽ được làm mịn, các góc nằm trên các đường ranh giới gián đoạn, và các vùng mối nối của 3 hoặc hơn, các góc lồi và lõm sẽ được giữ là sắc nhọn" msgid "Keep Boundaries" -msgstr "Giữ Ranh Giới" +msgstr "Duy Trì Ranh Giới" msgid "UVs are smoothed, boundaries are kept sharp" -msgstr "Mịn hóa UV, các ranh giới được giữ bén" +msgstr "UV sẽ được làm mịn, các đường ranh giới sẽ được giữ là sắc nhọn" msgid "UVs and boundaries are smoothed" -msgstr "Mịn hóa tọa độ UV và ranh giới" +msgstr "Các UV và các ranh giới đều được làm mịn" msgid "Nodes Modifier" -msgstr "Bộ Điều Chỉnh Giao Điểm" +msgstr "Bộ Điều Chỉnh Nút" msgid "Node Group" -msgstr "Nhóm Giao Điểm" +msgstr "Nhóm Nút" msgid "Node group that controls what this modifier does" -msgstr "Nhóm giao điểm được kiểm soát hành động của bộ điều chỉnh này" +msgstr "Nhóm nút điều khiển hoạt động của bộ điều chỉnh này" + + +msgid "Show Node Group" +msgstr "Hiển Thị Nhóm Nút" + + +msgid "Simulation Bake Directory" +msgstr "Thư Mục Nướng Mô Phỏng" + + +msgid "Location on disk where the bake data is stored" +msgstr "Vị trí trên đĩa nơi lưu trữ dữ liệu nướng" msgid "Normal Edit Modifier" -msgstr "Bộ Điều Chỉnh Biên Tập Pháp Tuyến" +msgstr "Bộ Điều Chỉnh Pháp Tuyến" msgid "Modifier affecting/generating custom normals" -msgstr "Bộ điều chỉnh đang ảnh hướng/chế tạo pháp tuyến tùy chọn" +msgstr "Bộ điều chỉnh tác động/sinh tạo pháp tuyến tùy chỉnh" + + +msgid "How much of generated normals to mix with existing ones" +msgstr "Lượng hòa trộn các pháp tuyến sinh tạo với những cái hiện có" msgid "Maximum angle between old and new normals" -msgstr "Góc cực đại giữa pháp tuyến mới và cũ" +msgstr "Góc tối đa giữa các pháp tuyến cũ và mới" msgid "How to mix generated normals with existing ones" -msgstr "Tỉ số pha trộn pháp tuyến chế tạo với pháp tuyến tồn tại" +msgstr "Phương pháp hòa trộn những pháp tuyến sinh tạo với những cái hiện có" msgid "Copy" @@ -35847,63 +38687,63 @@ msgstr "Sao Chép" msgid "Copy new normals (overwrite existing)" -msgstr "Chép pháp tuyến mới (vượt quyền cho pháp tuyến tồn tại)" +msgstr "Sao chép các pháp tuyến mới (viết đè lên những cái hiện có)" msgid "Copy sum of new and old normals" -msgstr "Chép pháp tuyến mới cộng với pháp tuyến cũ" +msgstr "Sao chép tổng của những pháp tuyến mới và cũ" msgid "Copy new normals minus old normals" -msgstr "Chép pháp tuyến mới trừ pháp tuyến cũ" +msgstr "Sao chép những pháp tuyến mới, loại trừ các pháp tuyến cũ" msgid "Copy product of old and new normals (not cross product)" -msgstr "Sao chép tích pháp tuyến cũ với pháp tuyến mới (không phải là tích có hướng)" +msgstr "Sao chép tích của những pháp tuyến mới và cũ (không phải là tích hữu hướng)" msgid "How to affect (generate) normals" -msgstr "Làm sao ảnh hưởng (chế tạo) pháp tuyến" +msgstr "Phương pháp tác động (sinh tạo) pháp tuyến" msgid "From an ellipsoid (shape defined by the boundbox's dimensions, target is optional)" -msgstr "Từ một hình cầu elip (hình dạng được xác định bằng hộp bao quanh, mục tiêu là tùy chọn)" +msgstr "Từ một hình ellipsoid (hình dạng được xác định bởi các kích thước của khung hộp viền, mục tiêu là tùy chọn)" msgid "Directional" -msgstr "Tùy Hướng" +msgstr "Định Hướng" msgid "Normals 'track' (point to) the target object" -msgstr "Pháp tuyến 'đuổi theo' (chỉ đến) vật thể mục tiêu" +msgstr "Các pháp tuyến 'theo dõi' (hướng về) đối tượng mục tiêu" msgid "Lock Polygon Normals" -msgstr "Khóa Pháp Tuyến Đa Giác" +msgstr "Khóa Pháp Tuyến của Đa Giác" msgid "Do not flip polygons when their normals are not consistent with their newly computed custom vertex normals" -msgstr "Không lật đa giác khi pháp tuyến của chúng nó không đồng bộ với pháp tuyến đỉnh tùy chọn mới được tính" +msgstr "Không được đảo lật các đa giác khi các pháp tuyến của chúng không nhất quán với những pháp tuyến điểm đỉnh tùy chỉnh được tính toán" msgid "Offset from object's center" -msgstr "Dịch từ trung tâm của vật thể" +msgstr "Dịch chuyển từ trung tâm của đối tượng" msgid "Target object used to affect normals" -msgstr "Vật thể mục tiêu dùng cho ảnh hưởng pháp tuyến" +msgstr "Đối tượng mục tiêu dùng để tác động các pháp tuyến" msgid "Parallel Normals" -msgstr "Pháp Tuyến Songๆ" +msgstr "Pháp Tuyến Song Song" msgid "Use same direction for all normals, from origin to target's center (Directional mode only)" -msgstr "Dùng cùng hướng cho hết pháp tuyến, từ gốc tọa độ đến trung tâm mục tiêu (chỉ cho chế độ Tùy Hướng)" +msgstr "Các pháp tuyến đều có cùng một định hướng, từ tọa độ gốc đến tâm của mục tiêu (chỉ cho chế độ Định Hướng mà thôi)" msgid "Vertex group name for selecting/weighting the affected areas" -msgstr "Tên nhóm đỉnh cho chọn/đặt quyền lượng của khu vực bị ảnh hướng" +msgstr "Tên nhóm điểm đỉnh để lựa chọn/cân trọng những vùng bị tác động" msgid "Ocean Modifier" @@ -35911,63 +38751,63 @@ msgstr "Bộ Điều Chỉnh Đại Dương" msgid "Simulate an ocean surface" -msgstr "Mô phỏng bề mặt một đại dương" +msgstr "Mô phỏng bề mặt đại dương" msgid "Foam Fade" -msgstr "Phai Bọt" +msgstr "Sự Phai Mờ Dần của Bọt Sóng" msgid "How much foam accumulates over time (baked ocean only)" -msgstr "Mức bọt được tích trữ qua thời gian lâu (chỉ cho đại dương nướng)" +msgstr "Lượng bọt tích trữ qua thời gian (chỉ với đại dương đã được nướng mà thôi)" msgid "Choppiness" -msgstr "Độ Cuồn Cuộn" +msgstr "Độ Bập Bềnh" msgid "Choppiness of the wave's crest (adds some horizontal component to the displacement)" -msgstr "Độ cuồn cuộn của dãy đỉnh sóng (nó cộng thêm thành phần ngang với dịch)" +msgstr "Độ bập bềnh của đỉnh sóng (thêm một số thành phần di chuyển theo chiều ngang vào sự dời hình)" msgid "Damp reflected waves going in opposite direction to the wind" -msgstr "Tắt dần sóng phản xạ đi nghịch hướng với gió" +msgstr "Hãm các con sóng phản xạ đi ngược hướng với chiều gió" msgid "Depth of the solid ground below the water surface" -msgstr "Độ sâu của đất rắn ở dưới mặt nước" +msgstr "Độ sâu của đáy (mặt đất) ở dưới mặt nước" msgid "Fetch" -msgstr "Bờ Gió" +msgstr "Chiều Dài Đà Gió" msgid "This is the distance from a lee shore, called the fetch, or the distance over which the wind blows with constant velocity. Used by 'JONSWAP' and 'TMA' models" -msgstr "Khoảng cách gió được bay vào từ một bờ hay khoảng cách gió bay được vận tốc hằng số. Mô hình 'JONSWAP' và 'TMA' dùng nó" +msgstr "Đây là khoảng cách từ bờ biển trong hướng gió thổi đến, đến điểm tham chiếu, gọi là chiều dài đà gió, hoặc là khoảng cách mà gió sẽ phải đi với tốc độ bất biến. Được sử dụng trong các mô hình 'JONSWAP' và 'TMA'" msgid "Cache Path" -msgstr "Đường Dẫn Đệm Chứa" +msgstr "Đường Dẫn đến Bộ Nhớ Đệm" msgid "Path to a folder to store external baked images" -msgstr "Đường đến một hồ sơ cho chứa ảnh nướng ở ngoài" +msgstr "Đường dẫn đến thư mục để lưu giữ những hình ảnh được nướng ra bên ngoài" msgid "Foam Coverage" -msgstr "Bọt Che" +msgstr "Diện Tích của Bọt Sóng" msgid "Amount of generated foam" -msgstr "Mức bọt được chế tạo" +msgstr "Lượng bọt sóng được sinh tạo" msgid "Foam Layer Name" -msgstr "Tên Lớp Bọt" +msgstr "Tên Tầng Lớp của Bọt Sóng" msgid "Name of the vertex color layer used for foam" -msgstr "Tên của lớp màu đỉnh dùng cho bọt" +msgstr "Tên của tầng lớp màu điểm đỉnh dùng cho bọt sóng" msgid "Bake End" @@ -35975,7 +38815,7 @@ msgstr "Kết Thúc Nướng" msgid "End frame of the ocean baking" -msgstr "Số bức ảnh cuối cho nướng đại dương" +msgstr "Khung hình cuối cùng để nướng mô phỏng đại dương" msgid "Bake Start" @@ -35983,51 +38823,51 @@ msgstr "Bắt Đầu Nướng" msgid "Start frame of the ocean baking" -msgstr "Số bức ảnh đầu cho nướng đại dương" +msgstr "Khung hình đầu tiên để nướng mô phỏng đại dương" msgid "Method of modifying geometry" -msgstr "Phương pháp sửa đổi hình dạng" +msgstr "Phương pháp sửa đổi hình học" msgid "Generate ocean surface geometry at the specified resolution" -msgstr "Chế tạo hình dạng bề mặt đại dương có độ phân hóa được xác định" +msgstr "Sinh tạo hình học bề mặt đại dương với độ phân giải đã định" msgid "Displace existing geometry according to simulation" -msgstr "Dịch hình dạng đang tồn tại theo mô phỏng" +msgstr "Dịch chuyển hình học hiện có tùy theo sự mô phỏng" msgid "Invert Spray" -msgstr "Đảo Nghịch Xịt" +msgstr "Đảo Ngịch Bụi Nước" msgid "Invert the spray direction map" -msgstr "Đảo nghịch bản đồ định hướng của xịt" +msgstr "Đảo nghịch chiều hướng của ánh xạ về bụi nước" msgid "Ocean is Cached" -msgstr "Đại Dương Chứa Trong Đệm Chứa" +msgstr "Đại Dương trong Bộ Nhớ Đệm" msgid "Whether the ocean is using cached data or simulating" -msgstr "Đại dương có dùng dữ liệu đệm chứa hay đang mô phỏng" +msgstr "Đại dương đang sử dụng dữ liệu bộ nhớ đệm hay đang được mô phỏng trực tiếp" msgid "Random Seed" -msgstr "Số Hạt Ngẫu Nhiên" +msgstr "Mầm Ngẫu Nhiên" msgid "Seed of the random generator" -msgstr "Số hạt chi bộ tạo số ngẫu nhiên" +msgstr "Mầm của máy phát sinh số ngẫu nhiên" msgid "Repetitions of the generated surface in X" -msgstr "Lặp vòng của bề mặt dđược chế tạo hướng X" +msgstr "Số lần nhắc lại bề mặt đã sinh tạo theo hướng X" msgid "Repetitions of the generated surface in Y" -msgstr "Lặp vòng của bề mặt được chế tạo hướng Y" +msgstr "Số lần nhắc lại bề mặt đã sinh tạo theo hướng Y" msgid "Render Resolution" @@ -36035,71 +38875,75 @@ msgstr "Độ Phân Giải Kết Xuất" msgid "Resolution of the generated surface for rendering and baking" -msgstr "Độ phân giải của bề mặt được chế tạo cho kết xuất và nướng" +msgstr "Độ phân giải của bề mặt được sinh tạo cho kết xuất và nướng" msgid "Sharpen peak" -msgstr "Bén hóa tốc đỉnh" +msgstr "Làm cho đỉnh sắc nhọn" msgid "Peak sharpening for 'JONSWAP' and 'TMA' models" -msgstr "Bén hóa tốc đỉnh cho mô hình 'JONSWAP' và 'TMA'" +msgstr "Làm cho đỉnh sắc nhọn trong mô hình 'JONSWAP' và 'TMA'" msgid "Surface scale factor (does not affect the height of the waves)" -msgstr "Hệ số phóng to bề mặt (nó không ảnh hưởng độ cao của sóng)" +msgstr "Hệ số tỷ lệ bề mặt (không ảnh hưởng đến độ cao của sóng)" msgid "Spatial Size" -msgstr "Kích Cỡ Phạm Vi" +msgstr "Kích Thước Không Gian" msgid "Size of the simulation domain (in meters), and of the generated geometry (in BU)" -msgstr "Kích cỡ của phạm vi mô phỏng (đơn vị mét) và của hình dạng được chế tạo (đơn vị Blender)" +msgstr "Kích thước của phạm vi mô phỏng (trong đơn vị mét), và hình học sinh tạo (trong đơn vị Blender)" msgid "Spectrum" -msgstr "Quang Phổ" +msgstr "Phổ Sóng" msgid "Spectrum to use" -msgstr "Dùng quang phổ nào" +msgstr "Phổ sóng sử dụng" msgid "Turbulent Ocean" -msgstr "Đại Dương Nhiễu Loạn" +msgstr "Đại Dương Náo Động" msgid "Use for turbulent seas with foam" -msgstr "Dùng cho biển nhiễu loạn có bọt" +msgstr "Sử dụng cho cảnh đại dương náo động có bọt" msgid "Established Ocean" -msgstr "Biển Ổn Định" +msgstr "Đại Dương Tiêu Chuẩn" msgid "Use for a large area, established ocean (Pierson-Moskowitz method)" -msgstr "Dùng cho một diện tích lớn, đại dương ổn định (phương pháp Pierson-Moskowitz)" +msgstr "Sử dụng cho diện rộng, môi trường sóng biển hình thành hoàn chỉnh (tiêu chuẩn) (phương pháp của Pierson-Moskowitz)" msgid "Established Ocean (Sharp Peaks)" -msgstr "Biển Ổn Định (Tốc Đỉnh Bén)" +msgstr "Đại Dương Tiêu Chuẩn (Sóng Nhọn Đầu)" + + +msgid "Use for established oceans ('JONSWAP', Pierson-Moskowitz method) with peak sharpening" +msgstr "Sử dụng cho các đại dương đã được thiết lập ('JONSWAP', phương pháp Pierson-Moskowitz) với sóng nhọn đầu" msgid "Shallow Water" -msgstr "Nước Cạn" +msgstr "Nước Nông" msgid "Use for shallow water ('JONSWAP', 'TMA' - Texel-Marsen-Arsloe method)" -msgstr "Dùng cho nước cạn (phương pháp 'JONSWAP', 'TMA' - Texel-Marsen-Arsloe)" +msgstr "Sử dụng cho trường hợp nước nông (phương pháp 'JONSWAP', 'TMA' của Texel-Marsen-Arsloe)" msgid "Spray Map" -msgstr "Bản Đồ Xịt" +msgstr "Bản Đồ Bụi Nước" msgid "Name of the vertex color layer used for the spray direction map" -msgstr "Tên của lớp màu đỉnh dùng cho bản đồ đựnh hướng xịt" +msgstr "Tên của tầng lớp màu điểm đỉnh sử dụng làm bản đồ chiều hướng bay của bụi nước" msgid "Current time of the simulation" @@ -36107,67 +38951,71 @@ msgstr "Thời gian hiện tại của mô phỏng" msgid "Generate Foam" -msgstr "Chế Tạo Bọt" +msgstr "Sinh Tạo Bọt Sóng" msgid "Generate foam mask as a vertex color channel" -msgstr "Chế tạo mặt nạ bọt làm một kênh màu đỉnh" +msgstr "Sinh tạo màn chắn lọc cho bọt sóng như một kênh màu điểm đỉnh" msgid "Generate Normals" -msgstr "Chế Tạo Pháp Tuyến" +msgstr "Sinh Tạo các Pháp Tuyến" + + +msgid "Output normals for bump mapping - disabling can speed up performance if it's not needed" +msgstr "Xuất ra pháp tuyến cho ánh xạ gồ ghề - tắt chức năng đi có thể tăng tốc hiệu suất hoạt động nếu không cần thiết" msgid "Generate Spray Map" -msgstr "Chế Tạo Bản Đồ Xịt" +msgstr "Sinh Tạo Bản Đồ về Bụi Nước" msgid "Generate map of spray direction as a vertex color channel" -msgstr "Chế tạo bản đồ đựnh hướng xịt làm một kênh màu đỉnh" +msgstr "Sinh tạo bản đồ về chiều hướng của bụi nước như một kênh màu điểm đỉnh" msgid "Viewport Resolution" -msgstr "Độ Phân Giải Màn Chiếu" +msgstr "Độ Phân Giải Cổng Nhìn" msgid "Viewport resolution of the generated surface" -msgstr "Độ phân giải cửa màn chiếu cho bề mặt được chế tạo" +msgstr "Độ phân giải trong cổng nhìn của bề mặt được sinh tạo" msgid "Wave Alignment" -msgstr "Sắp Xếp Sóng" +msgstr "Căn Chỉnh Sóng" msgid "How much the waves are aligned to each other" -msgstr "Mức sóng được sắp xếp với nhau" +msgstr "Các con sóng sắp hàng với nhau là bao nhiêu" msgid "Wave Direction" -msgstr "Hướng Sóng" +msgstr "Chiều Hướng của Sóng" msgid "Main direction of the waves when they are (partially) aligned" -msgstr "Hướng chánh của sóng khi chúng nó (gmột phần) đưược sắp xếp nhau" +msgstr "Chiều hướng chính của các con sóng khi chúng (một phần nào đó) sắp hàng với nhau" msgid "Wave Scale" -msgstr "Phóng To Sóng" +msgstr "Tỷ Lệ của Con Sóng" msgid "Scale of the displacement effect" -msgstr "Phóng to của hiệu ứng dịch" +msgstr "Tỷ lệ của hiệu ứng dời hình" msgid "Smallest Wave" -msgstr "Sóng Nhỏ Nhật" +msgstr "Sóng Nhỏ Nhất" msgid "Shortest allowed wavelength" -msgstr "Bước sóng ngắn nhất" +msgstr "Tần số ngắn nhất cho phép" msgid "Wind Velocity" -msgstr "Vận Tốc Giớ" +msgstr "Vận Tốc Gió" msgid "Wind speed" @@ -36175,27 +39023,27 @@ msgstr "Tốc độ gió" msgid "ParticleInstance Modifier" -msgstr "Bộ Điều Chỉnh Thực Thể Hạt" +msgstr "Bộ Điều Chỉnh Tạo Thực Thể Hạt" msgid "Particle system instancing modifier" -msgstr "Bộ điều chỉnh thực thể của hệ thống hạt" +msgstr "Bộ điều chỉnh tạo thực thể hệ thống hạt" msgid "Pole axis for rotation" -msgstr "Trục cực cho xoay" +msgstr "Trục cực để xoay chiều" msgid "Index Layer Name" -msgstr "Tên Lớp Chỉ Số" +msgstr "Tên Tầng Chỉ Số" msgid "Custom data layer name for the index" -msgstr "Tên lớp dữ liệu tùy chọn cho chỉ số" +msgstr "Tên tầng dữ liệu tùy chỉnh dành cho chỉ số" msgid "Object that has the particle system" -msgstr "Vật thể thì có hệ thống hạt" +msgstr "Đối tượng có hệ thống hạt" msgid "Particle Amount" @@ -36203,23 +39051,23 @@ msgstr "Số Lượng Hạt" msgid "Amount of particles to use for instancing" -msgstr "Số lượng hạt để sử dụng cho làm thực thể" +msgstr "Lượng hạt sử dụng trong quá trình thực thể hóa" msgid "Particle Offset" -msgstr "Dịch Hạt" +msgstr "Dịch Chuyển của Hạt" msgid "Relative offset of particles to use for instancing, to avoid overlap of multiple instances" -msgstr "Dịch tương đối của hạt để sử dụng khi làm thực thể, cho tránh lấn trên nhiều thực thể" +msgstr "Dịch chuyển tương đối của các hạt để sử dụng trong quá trình thực thể hóa, hòng tránh các thực thể chồng chéo lên nhau" msgid "Particle System Number" -msgstr "Số Hệ Thống Hạt" +msgstr "Chỉ Số của Hệ Thống Hạt" msgid "Position along path" -msgstr "Vi trí trên đường" +msgstr "Vị trí dọc theo đường đi" msgid "Random Position" @@ -36231,35 +39079,35 @@ msgstr "Ngẫu nhiên hóa vị trí trên đường đi" msgid "Randomize rotation around path" -msgstr "Ngẫu nhiên hóa xoay quanh đường đi" +msgstr "Ngẫu nhiên hóa sự xoay chiều chung quanh đường đi" msgid "Rotation around path" -msgstr "Xoay quanh đường đi" +msgstr "Sự xoay chiều quanh đường đi" msgid "Show instances when particles are alive" -msgstr "Hiện thực thể khi hạt còn sống" +msgstr "Hiển thị thực thể khi các hạt đang hoạt động" msgid "Show instances when particles are dead" -msgstr "Hiện thực thể khi hạt đã bị hủy diệt" +msgstr "Hiển thị thực thể khi các hạt đã chết" msgid "Show instances when particles are unborn" -msgstr "Hiện thực thể khi hạt chưa được sanh" +msgstr "Hiển thị thực thể khi các hạt chưa sinh ra" msgid "Space to use for copying mesh data" -msgstr "Không gian để sử dụng chép dữ liệu mạng lưới" +msgstr "Không gian sử dụng cho quá trình sao chép dữ liệu khung lưới" msgid "Use offset from the particle object in the instance object" -msgstr "Sử dụng dịch từ vật thể hạt trong vật thể thực thể" +msgstr "Sử dụng dịch chuyển từ đối tượng hạt trong đối tượng thực thể" msgid "Use world space offset in the instance object" -msgstr "Sử dụng dịch không gian thế giới trong vật thể thực thể" +msgstr "Sử dụng dịch chuyển của không gian thế giới trong đối tượng thực thể" msgctxt "ParticleSettings" @@ -36268,31 +39116,31 @@ msgstr "Con Cái" msgid "Create instances from child particles" -msgstr "Chế tạo thực thể từ hạt con cái" +msgstr "Kiến Tạo thực thể từ các hạt con cái" msgid "Create instances from normal particles" -msgstr "Chế tạo thực thể từ hạt bình thường" +msgstr "Kiến Tạo thực thể từ các hạt bình thường" msgid "Create instances along particle paths" -msgstr "Chế tạo thực thể theo hướng của hạt" +msgstr "Kiến Tạo các thực thể dọc theo đường đi của hạt" msgid "Don't stretch the object" -msgstr "Không cho kéo dài vật thể" +msgstr "Không cho phép kéo dài đối tượng" msgid "Use particle size to scale the instances" -msgstr "Dùng kích cỡ hạt cho phóng to thực thể" +msgstr "Dùng kích thước của hạt để đổi tỷ lệ của các thực thể" msgid "Value Layer Name" -msgstr "Tên Lớp Giá Trị" +msgstr "Tên Tầng Giá Trị" msgid "Custom data layer name for the randomized value" -msgstr "Tên lớp dữ liệu tùy chọn cho giá trị được ngẫu nhiên hóa" +msgstr "Tên tầng dữ liệu tùy chỉnh cho giá trị ngẫu nhiên" msgid "ParticleSystem Modifier" @@ -36300,189 +39148,212 @@ msgstr "Bộ Điều Chỉnh Hệ Thống Hạt" msgid "Particle system simulation modifier" -msgstr "Bộ điều chỉnh cho mô phỏng hệ thống hạt" +msgstr "Bộ điều chỉnh mô phỏng hệ thống hạt" msgid "Particle System that this modifier controls" -msgstr "Bộ điều chỉnh này được điều khiển hệ thống hạt nào" +msgstr "Hệ Thống Hạt mà bộ điều chỉnh này điều khiển" msgid "Remesh Modifier" -msgstr "Bộ Điều Chỉnh Lập Lại Mạng Lưới" +msgstr "Bộ Điều Chỉnh Kiến Tạo Lại Khung Lưới" msgid "Generate a new surface with regular topology that follows the shape of the input mesh" -msgstr "Chế tạo một bề mặt mới có cấu trúc hình dạng bình thương mà theo dạng của mạng lưới ngõ vào" +msgstr "Sinh tạo bề mặt mới với cấu trúc liên kết thông thường dựa vào hình dạng của khung lưới cung cấp" msgid "Blocks" -msgstr "Cục" +msgstr "Khối Lập Thể" msgid "Output a blocky surface with no smoothing" -msgstr "Xuất bề mặt cục hóa nhưng không mịn hóa" +msgstr "Sản xuất bề mặt bằng khối lập thể và không làm mịn" msgid "Output a smooth surface with no sharp-features detection" -msgstr "Xuất một bề mặt mịn không có phát hiện đặc tính bén" +msgstr "Sản xuất bề mặt mịn, song bỏ qua các đặc điểm sắc cạnh" msgid "Output a surface that reproduces sharp edges and corners from the input mesh" -msgstr "Xuất một bề mặt mà được chép cạnh và góc bén của mạng lưới ngõ vào" +msgstr "Sản xuất một bề mặt tái tạo các cạnh và góc sắc nhọn từ khung lưới được cung cấp" msgid "Output a mesh corresponding to the volume of the original mesh" -msgstr "Xuất một mạng lưới tương tự với thể tích của mạng lưới ban đầu" +msgstr "Tạo ra một khung lưới tương ứng với thể tích của khung lưới gốc" msgid "Octree Depth" -msgstr "Độ Sâu Bát Mộc" +msgstr "Độ Sâu của Cây Octree" msgid "Resolution of the octree; higher values give finer details" -msgstr "Độ phân giải của bát mộc; giá trị càng cao chi tiết càng rõ" +msgstr "Độ phân giải của cây octree (tám nhánh); giá trị càng cao thì chi tiết càng tinh tế hơn" msgid "The ratio of the largest dimension of the model over the size of the grid" -msgstr "Tỉ số của kích thước lớn nhất của mô hình trên kích cỡ đồ thị" +msgstr "Tỷ số giữa cỡ thước lớn nhất của mô hình và kích thước của khung lưới đồ thị" msgid "Sharpness" -msgstr "Độ Bén" +msgstr "Độ Sắc Nhọn" msgid "Tolerance for outliers; lower values filter noise while higher values will reproduce edges closer to the input" -msgstr "Giới hạn cho loại bất bình thường, giá trị thấp hơn lọc huyên náo, giá trị cao sẽ chép cạnh giống ngõ vào hơn" +msgstr "Dung sai cho các đường viền; những giá trị thấp hơn sẽ thanh lọc được nhiễu, trong khi những giá trị cao hơn sẽ tái tạo các cạnh gần với nguồn cung cấp hơn" msgid "If removing disconnected pieces, minimum size of components to preserve as a ratio of the number of polygons in the largest component" -msgstr "Nếu xóa miến không kết nối, kích cỡ cực tiểu của các thành phần để giữ nguyên là một tỉ số của số lượng đa giác trong thành phần lớn nhất" +msgstr "Nếu sử dụng chức năng loại bỏ các miếng không kết nối, thì đây là cỡ tối thiểu để bảo tồn các phần tử, như tỷ lệ số các đa giác trong phần tử lớn nhất" msgid "Remove Disconnected" -msgstr "Xóa Không Kết Nối" +msgstr "Loại Bỏ những cái Không Kết Nối nữa" msgid "Smooth Shading" -msgstr "Tô Sắc Mịn" +msgstr "Tô Bóng Mịn Màng" msgid "Output faces with smooth shading rather than flat shaded" -msgstr "Xuật mặt tô bóng mịn thay thế tô sắc đều" +msgstr "Sản xuất các mặt với sự tô bóng mịn màng, thay vì tô bóng phẳng bẹt" msgid "Screw Modifier" -msgstr "Bộ Điều Chỉnh Đinh Ốc" +msgstr "Bộ Điều Chỉnh Xoáy Ốc" msgid "Revolve edges" -msgstr "Quay Cạnh" +msgstr "Xoay tròn các cạnh" msgid "Angle of revolution" -msgstr "Góc quay" +msgstr "Góc độ xoay vòng" msgid "Screw axis" -msgstr "Trục đinh ốc" +msgstr "Trục xoáy ốc" msgid "Number of times to apply the screw operation" -msgstr "Số lần áp dụng thao tác ốc" +msgstr "Số lần áp dụng phép toán kiến tạo xoáy ốc" msgid "Object to define the screw axis" -msgstr "Vật thể cho xác định trục đinh ốc" +msgstr "Đối tượng để xác định trục xoáy ốc" msgid "Render Steps" -msgstr "Bước Kết Xuất" +msgstr "Số Bước Kết Xuất" msgid "Number of steps in the revolution" -msgstr "Số lượng bước quay" +msgstr "Số lượng bước trong vòng xoay" msgid "Offset the revolution along its axis" -msgstr "Dịch quay theo hướng trục" +msgstr "Khoảng cách giữa các vòng xoay dọc theo hướng của trục" msgid "Merge adjacent vertices (screw offset must be zero)" -msgstr "Gồm điểm kề (dịch ốc phải bằng 0)" +msgstr "Hội nhập các điểm đỉnh kề cạnh (khoảng cách giữa các vòng xoay phải là 0)" msgid "Calculate Order" -msgstr "Tính Thứ Tự" +msgstr "Tính Toán Thứ Tự" msgid "Calculate the order of edges (needed for meshes, but not curves)" -msgstr "Tính thứ tự của cạnh (cần cho mạng lưới, mà không cần đường cong)" +msgstr "Tính toán thứ tự của các cạnh (cần thiết đối với các khung lưới, song đường cong thì không cần)" msgid "Flip normals of lathed faces" -msgstr "Lặt pháp tuyến của mặt quay" +msgstr "Đảo lật pháp tuyến của các mặt được tiện rãnh" msgid "Object Screw" -msgstr "Đinh Ốc Vật Thể" +msgstr "Đối Tượng Xoáy Ốc" msgid "Use the distance between the objects to make a screw" -msgstr "Khoảng cách giữa vật thể cho làm một ốc" +msgstr "Dùng khoảng cách giữa các đối tượng để tạo đường xoáy vít" msgid "Stretch U" -msgstr "Kéo Dài U" +msgstr "Kéo Giãn Chiều U" + + +msgid "Stretch the U coordinates between 0 and 1 when UVs are present" +msgstr "Kéo dài tọa độ U trong khoảng từ 0 đến 1 khi UV hiện hữu" msgid "Stretch V" -msgstr "Kéo Dài V" +msgstr "Kéo Giãn Chiều V" + + +msgid "Stretch the V coordinates between 0 and 1 when UVs are present" +msgstr "Kéo dài tọa độ V trong khoảng từ 0 đến 1 khi UV hiện hữu" msgid "SimpleDeform Modifier" -msgstr "Bộ Điều Chỉnh Méo Hóa Đơn Giản" +msgstr "Bộ Điều Chỉnh Biến Dạng Đơn Giản" msgid "Simple deformation modifier to apply effects such as twisting and bending" -msgstr "Bộ điều chỉnh méo đơn giản cho áp dụng hiệu ứng như xoắn và uốn cong" +msgstr "Bộ điều chỉnh biến dạng đơn giản để áp dụng các hiệu ứng như xoắn vặn và uốn cong" msgid "Angle of deformation" -msgstr "Góc của méo hóa" +msgstr "Góc độ biến dạng" msgid "Deform around local axis" -msgstr "Méo hóa quanh trục địa phương" +msgstr "Biến dạng quanh trục địa phương" + + +msgctxt "Operator" +msgid "Mode" +msgstr "Chế độ" msgctxt "Operator" msgid "Twist" -msgstr "Xoắn" +msgstr "Xoắn Vặn" msgid "Rotate around the Z axis of the modifier space" -msgstr "Xoay quang trục Z của không gian bộ điều chỉnh" +msgstr "Xoay quanh trục Z của không gian bộ điều chỉnh" msgctxt "Operator" msgid "Bend" -msgstr "Bể Cong" +msgstr "Uốn Cong" msgid "Bend the mesh over the Z axis of the modifier space" -msgstr "Uống cong mạng lưới quang trục Z của không gian bộ điều chỉnh" +msgstr "Uốn cong khung lưới trên trục Z của không gian bộ điều chỉnh" + + +msgctxt "Operator" +msgid "Taper" +msgstr "Vuốt Thon" msgid "Linearly scale along Z axis of the modifier space" -msgstr "Phóng to bậc một theo hướng Z của không gian bộ điều chỉnh" +msgstr "Đổi tỷ lệ dọc theo trục Z của không gian bộ điều chỉnh một cách tuyến tính" + + +msgctxt "Operator" +msgid "Stretch" +msgstr "Kéo Giãn" msgid "Stretch the object along the Z axis of the modifier space" -msgstr "Kéo dài vật thể theo hướng Z của không gian bộ điều chỉnh" +msgstr "Kéo giãn đối tượng theo hướng Z của không gian bộ điều chỉnh" msgid "Amount to deform object" -msgstr "Mức méo hóa vật thể" +msgstr "Lượng biến dạng đối tượng" msgid "Limits" @@ -36490,27 +39361,27 @@ msgstr "Giới Hạn" msgid "Lower/Upper limits for deform" -msgstr "Giới hạn Thấp/Cao cho méo hóa" +msgstr "Giới hạn Trên/Dưới cho sự biến dạng" msgid "Do not allow deformation along the X axis" -msgstr "Không cho méo hướng trục X" +msgstr "Không cho phép biến dạng dọc theo trục X" msgid "Do not allow deformation along the Y axis" -msgstr "Không cho méo hướng trục Y" +msgstr "Không cho phép biến dạng dọc theo trục Y" msgid "Do not allow deformation along the Z axis" -msgstr "Không cho méo hướng trục Z" +msgstr "Không cho phép biến dạng dọc theo trục Z" msgid "Origin" -msgstr "Gốc Tọa Độ" +msgstr "Tọa Độ Gốc" msgid "Offset the origin and orientation of the deformation" -msgstr "Dịch gốc tọa độ và định hướng của méo hóa" +msgstr "Dịch chuyển tọa độ gốc và chiều hướng của sự biến dạng" msgid "Skin Modifier" @@ -36518,27 +39389,27 @@ msgstr "Bộ Điều Chỉnh Da" msgid "Generate Skin" -msgstr "Chế Tạo Da" +msgstr "Sinh Tạo Da" msgid "Branch Smoothing" -msgstr "Mịn Hóa Nhánh" +msgstr "Làm Mịn Phân Nhánh" msgid "Smooth complex geometry around branches" -msgstr "Mịn hóa hình dạng phức tạp quanh nhánh" +msgstr "Làm mịn hình học phức tạp quanh các phân nhánh" msgid "Avoid making unsymmetrical quads across the X axis" -msgstr "Tránh tạo tư giác không đôi xúng qua trục X" +msgstr "Tránh việc kiến tạo tứ giác không đối xứng bên kia trục X" msgid "Avoid making unsymmetrical quads across the Y axis" -msgstr "Tránh tạo tư giác không đôi xúng qua trục Y" +msgstr "Tránh việc kiến tạo tứ giác không đối xứng bên kia trục Y" msgid "Avoid making unsymmetrical quads across the Z axis" -msgstr "Tránh tạo tư giác không đôi xúng qua trục Z" +msgstr "Tránh việc kiến tạo tứ giác không đối xứng bên kia trục Z" msgid "Soft Body Modifier" @@ -36546,151 +39417,171 @@ msgstr "Bộ Điều Chỉnh Thân Mềm" msgid "Soft body simulation modifier" -msgstr "Bộ điều chỉnh của mô phỏng thân mềm" +msgstr "Bộ điều chỉnh mô phỏng thân mềm" msgid "Soft Body Point Cache" -msgstr "Đệm Chứa Điểm Thân Mềm" +msgstr "Bộ Đệm Nhớ Điểm của Thân Mềm" msgid "Solidify Modifier" -msgstr "Bộ Điều Chỉnh Rắn Hóa" +msgstr "Bộ Điều Chỉnh Đắp Dày" msgid "Create a solid skin, compensating for sharp angles" -msgstr "Chế tạo một da chất rắn, mà bù lại cho các góc nhọn" +msgstr "Kiến Tạo nên một lớp da bọc đặc kín, bù trừ cho các góc sắc nhọn" msgid "Bevel Convex" -msgstr "Cạnh Tròn Lồi" +msgstr "Bo Tròn Lồi" msgid "Edge bevel weight to be added to outside edges" -msgstr "Quyền lượng cạnh tròn cạnh để áp dụng cho các cạnh ngoài" +msgstr "Trọng lượng bo tròn cạnh sẽ được thêm vào các cạnh ở bên ngoài" msgid "Inner Crease" -msgstr "Nhăn Nội" +msgstr "Nếp Gấp Bên Trong" msgid "Assign a crease to inner edges" -msgstr "Chỉ định một nhăn cho các cạnh nội" +msgstr "Ấn định một nếp gấp vào các cạnh bên trong" msgid "Outer Crease" -msgstr "Nhăn Ngoại" +msgstr "Nếp Gấp Bên Ngoài" msgid "Assign a crease to outer edges" -msgstr "Chỉ định nhăn cho các cạnh ngoại" +msgstr "Ấn định một nếp gấp vào các cạnh bên ngoài" msgid "Rim Crease" -msgstr "Nhăn Mép" +msgstr "Nếp Gấp ở Viền" msgid "Assign a crease to the edges making up the rim" -msgstr "Chỉ định một nhăn cho các cạnh hình thành mép" +msgstr "Ấn định một nếp gấp vào các cạnh cấu hình thành mép viền" msgid "Vertex Group Invert" -msgstr "Đảo Nghịch Nhóm Đỉnh" +msgstr "Đảo Nghịch Nhóm Điểm Đỉnh" msgid "Invert the vertex group influence" -msgstr "Đảo nghịch sự ảnh hưởng của định nhóm" +msgstr "Đảo nghịch ảnh hưởng của nhóm điểm đỉnh" msgid "Material Offset" -msgstr "Dịch Vật Liệu" +msgstr "Dịch Chuyển của Nguyên Vật Liệu" msgid "Offset material index of generated faces" -msgstr "Dịch chỉ số vật liệu của mặt được chế tạo" +msgstr "Dịch chuyển chỉ số nguyên vật liệu của các mặt được sinh tạo" msgid "Rim Material Offset" -msgstr "Dịch Vật Liệu Mép" +msgstr "Dịch Chuyển Nguyên Vật Liệu của Mép Viền" msgid "Offset material index of generated rim faces" -msgstr "Dịch chỉ số vật liệu của mặt mép được chế tạo" +msgstr "Dịch chuyển chỉ số nguyên vật liệu của các mặt mép viền được sinh tạo" + + +msgctxt "Mesh" +msgid "Boundary Shape" +msgstr "Hình Dạng Ranh Giới" msgid "Selects the boundary adjustment algorithm" -msgstr "Cho chọn giải thuật chỉng sửa ranh giới" +msgstr "Chọn thuật toán điều chỉnh đường biên bao bọc" + + +msgctxt "Mesh" +msgid "None" +msgstr "Không Có" msgid "No shape correction" -msgstr "Không sửa hình dạng" +msgstr "Không chỉnh sửa hình" + + +msgctxt "Mesh" +msgid "Round" +msgstr "Tròn" msgid "Round open perimeter shape" -msgstr "Hình danh chu vi mở tròn" +msgstr "Hình cong tròn có đường chu vi mở (không kín)" + + +msgctxt "Mesh" +msgid "Flat" +msgstr "Phẳng" msgid "Flat open perimeter shape" -msgstr "Hình dạng chu vi mở bằng thẳng" +msgstr "Hình phẳng có đường chu vi mở (không kín)" msgid "Merge Threshold" -msgstr "Ngưỡng Gồm" +msgstr "Giới Hạn Hợp Nhất" msgid "Distance within which degenerated geometry is merged" -msgstr "Khoảng cách cho gồm hình dạng bị thoái hóa" +msgstr "Khoảng cách mà các hình học suy thoái sẽ được hợp nhất lại, nếu nằm trong đó" msgid "Thickness Mode" -msgstr "Chế Độ Bề Dày" +msgstr "Chế Độ Chiều Dày" msgid "Selects the used thickness algorithm" -msgstr "Để chọn giải thuật bề dày" +msgstr "Chọn thuật toán sử dụng cho chiều dày" msgid "Most basic thickness calculation" -msgstr "Tính toán bề dày cơ bản nhất" +msgstr "Phép tính chiều dày cơ bản nhất" msgid "Even" -msgstr "Chẳn" +msgstr "Đồng Đều/Đều Đặn/Chẵn" msgid "Even thickness calculation which takes the angle between faces into account" -msgstr "Tính toán bề dày đều, nó sử dụng góc giác giữa các mặt" +msgstr "Phép tính độ dày đồng đều, đồng thời, xem xét đến góc độ giữa các mặt nữa" msgid "Thickness calculation using constraints, most advanced" -msgstr "Tính toán bề dày sử dụng ràng buộc, cấp cap nhất" +msgstr "Phép tính chiều dày sử dụng một số ràng buộc, tân tiến nhất" msgid "Offset the thickness from the center" -msgstr "Dịch bề dày từ trung tâm" +msgstr "Dịch chuyển chiều dày từ trung tâm" msgid "Rim Vertex Group" -msgstr "Nhóm Đỉnh Rìa" +msgstr "Nhóm Điểm Đỉnh Mép Viền" msgid "Vertex group that the generated rim geometry will be weighted to" -msgstr "Qường lượng đến nhóm đỉnh được sáng chế hình dạng rìa nào" +msgstr "Nhóm điểm đỉnh mà hình học cho mép viền sinh tạo sẽ được cân trọng" msgid "Shell Vertex Group" -msgstr "Nhóm Đỉnh Vỏ" +msgstr "Nhóm Điểm Đỉnh Vỏ" msgid "Vertex group that the generated shell geometry will be weighted to" -msgstr "Qường lượng đến nhóm đỉnh được sáng chế hình dạng vỏ nào" +msgstr "Nhóm điểm đỉnh mà hình học vỏ sinh tạo sẽ được cân trọng" msgid "Selects the used algorithm" -msgstr "Để chọn giải thuật được sử dụng" +msgstr "Lựa chọn thuật toán sử dụng" msgid "Output a solidified version of a mesh by simple extrusion" -msgstr "Xuất một phiên bản mạn lưới đã rắn hóa bằng kéo ra đơn giản" +msgstr "Tạo một phiên bản khung lưới bằng phương pháp đẩy trồi đơn giản" msgid "Complex" @@ -36698,43 +39589,47 @@ msgstr "Phức Tạp" msgid "Output a manifold mesh even if the base mesh is non-manifold, where edges have 3 or more connecting faces. This method is slower" -msgstr "Xuất một mạng lưới đa tập, mặc dù mạng lưới cơ sở không phải là đa tập, có cạnh có 3 trở lên mặt liên kết. Phương pháp này chậm hơn" +msgstr "Cho ra kết quả một khung lưới đa tạp, ngay cả khi khung lưới nền là phi đa tạp, nơi các cạnh có 3 các mặt, hoặc hơn, kết nối với chúng. Phương pháp này chậm hơn đấy nhé" msgid "Thickness of the shell" -msgstr "Bề dày của vỏ" +msgstr "Độ dày của vỏ" msgid "Offset clamp based on geometry scale" -msgstr "Kẹp lại dịch tùy phóng to hình dạng" +msgstr "Hạn định dịch chuyển tùy theo tỷ lệ hình học" msgid "Vertex Group Factor" -msgstr "Hệ Số Nhóm Đỉnh" +msgstr "Hệ Số Nhóm Điểm Đỉnh" msgid "Thickness factor to use for zero vertex group influence" -msgstr "Hệ số bề dày để dùng cho không có sự ảnh hưởng của nhóm đỉnh " +msgstr "Hệ số chiều dày sử dụng để tác động nhóm điểm đỉnh có trọng lượng bằng không" msgid "Even Thickness" -msgstr "Bề Dày Đều" +msgstr "Độ Dày Đồng Đều" msgid "Maintain thickness by adjusting for sharp corners (slow, disable when not needed)" -msgstr "Giữ bề dày đều bằng chỉnh góc nhọn (chậm, tắt khi không cần dùng)" +msgstr "Duy trì độ dày đồng đều bằng cách điều chỉnh các góc sắc nhọn (chậm, nên tắt đi khi không cần đến)" msgid "Flat Faces" -msgstr "Mặt Bằng Phẳng" +msgstr "Các Mặt Phẳng Bẹt" + + +msgid "Make faces use the minimal vertex weight assigned to their vertices (ensures new faces remain parallel to their original ones, slow, disable when not needed)" +msgstr "Tạo các mặt sử dụng trọng lượng điểm đỉnh tối thiểu đã ấn định cho các điểm đỉnh của chúng (hãy đảm bảo là các mặt mới vẫn song song với các mặt ban đầu nhé, hoạt động chậm, nên tắt đi khi không cần thiết)" msgid "Flip Normals" -msgstr "Lật Pháp Tuyến" +msgstr "Đảo Lật Pháp Tuyến" msgid "Invert the face direction" -msgstr "Đảo nghịch định hướng mặt" +msgstr "Đảo nghịch chiều hướng của Mặt" msgid "High Quality Normals" @@ -36742,87 +39637,87 @@ msgstr "Pháp Tuyến Chất Lượng Cao" msgid "Calculate normals which result in more even thickness (slow, disable when not needed)" -msgstr "Tính pháp tuyến cho được bề dày dều hơn (chậm, tắt khi không cần dùng)" +msgstr "Tính toán các pháp tuyến để đạt được độ dày đồng đều hơn (chậm, nên tắt đi khi không cần đến)" msgid "Fill Rim" -msgstr "Đầy Mép" +msgstr "Phủ Kín Mép Viền" msgid "Create edge loops between the inner and outer surfaces on face edges (slow, disable when not needed)" -msgstr "Tạo vòng cạnh giữa bề mặt nội và bề mặt ngoại của cạnh mặt (chậm, tắt khi không cần dùng)" +msgstr "Kiến Tạo các vòng cạnh giữa mặt trong và mặt ngoài của các cạnh Mặt (chậm, nên tắt đi khi không cần đến)" msgid "Only Rim" -msgstr "Chi Mép" +msgstr "Duy Mép Viền" msgid "Only add the rim to the original data" -msgstr "Chỉ kèm mép với dữ liệu ban đầu" +msgstr "Chỉ thêm mép viền vào dữ liệu gốc mà thôi" msgid "Angle Clamp" -msgstr "Kẹp Bằng Góc" +msgstr "Hạn Định Góc Độ" msgid "Clamp thickness based on angles" -msgstr "Kẹp bề dày tùy góc" +msgstr "Hạn định chiều dày dựa trên góc độ" msgid "Subdivision Surface Modifier" -msgstr "Bộ Điều Chỉnh Phân Hóa Bề Mặt" +msgstr "Bộ Điều Chỉnh Bề Mặt Phân Hóa" msgid "Subdivision surface modifier" -msgstr "Bộ điều chỉnh cho phân hóa bề mặt" +msgstr "Bộ điều chỉnh bề mặt phân hóa" msgid "Number of subdivisions to perform" -msgstr "Số lượng phân hóa để áp dụng" +msgstr "Lượng phân hóa thi hành" msgid "Number of subdivisions to perform when rendering" -msgstr "Số lượng phân hóa để áp dụng khi kết xuất" +msgstr "Lượng phân hóa thi hành khi kết xuất" msgid "Skip displaying interior subdivided edges" -msgstr "Bỏ qua hiển thị các cạnh phân hóa nội bộ" +msgstr "Bỏ qua việc hiển thị các cạnh đã được phân chia bên trong" msgid "Use Limit Surface" -msgstr "Dùng Bề Mặt Giới Hạn" +msgstr "Sử Dụng Giới Hạn Bề Mặt" msgid "Place vertices at the surface that would be produced with infinite levels of subdivision (smoothest possible shape)" -msgstr "Đặt các đỉnh tại bề mặt được sản xuất nếu được phân hóa bằng mức độ vô hạn (bề mặt mịn nhất có thể)" +msgstr "Đặt các điểm đỉnh lên bề mặt mà bề mặt đó sẽ tạo ra vô hạn các mức phân hóa (hình dạng mịn màng nhất)" msgid "SurfaceDeform Modifier" -msgstr "Bộ Điều Chỉnh Méo Hóa Bề Mặt" +msgstr "Bộ Điều Chỉnh Biến Dạng Bề Mặt" msgid "Interpolation Falloff" -msgstr "Độ Giảm Suy Nội" +msgstr "Dốc suy giảm của nội suy" msgid "Controls how much nearby polygons influence deformation" -msgstr "Điều khiển sự ảnh hưởng méo hóa của đa giác ở gần" +msgstr "Điều khiển lượng các đa giác lân cận tác động đến sự biến dạng bao nhiêu" msgid "Whether geometry has been bound to target mesh" -msgstr "Cho biết hình dạng bị trói với mạng lưới mục đích hay không" +msgstr "Hình học đã được liên kết với khung lưới hay chưa" msgid "Strength of modifier deformations" -msgstr "Sức của méo hóa từ bộ điều chỉnh" +msgstr "Cường độ biến dạng của bộ điều chỉnh" msgid "Sparse Bind" -msgstr "Gói Lại Loãng" +msgstr "Kết Buộc Thưa Thớt" msgid "Only record binding data for vertices matching the vertex group at the time of bind" -msgstr "Chỉ ghi dữ liệu gói lại cho các đỉnh giống nhóm đỉnh tại thời gói lại" +msgstr "Chỉ ghi dữ liệu kết buộc cho các điểm đỉnh khớp với nhóm điểm đỉnh tại thời điểm kết buộc mà thôi" msgid "Surface Modifier" @@ -36830,7 +39725,7 @@ msgstr "Bộ Điều Chỉnh Bề Mặt" msgid "Surface modifier defining modifier stack position used for surface fields" -msgstr "Bộ điều chỉnh bề mặt cho định nghĩa vị trí xếp đống của bộ điều chỉnh được dùng làm trường bề mặt" +msgstr "Bộ điều chỉnh bề mặt nhằm xác định vị trí ngăn xếp của bộ điều chỉnh sử dụng cho các trường hình bề mặt" msgid "Triangulate Modifier" @@ -36838,27 +39733,27 @@ msgstr "Bộ Điều Chỉnh Tam Giác Hóa" msgid "Triangulate Mesh" -msgstr "Tam Giác Hóa Mạng Lưới" +msgstr "Tam Giác Hóa Khung Lưới" msgid "Keep Normals" -msgstr "Giữ Pháp Tuyến" +msgstr "Duy Trì Pháp Tuyến" msgid "" "Try to preserve custom normals.\n" "Warning: Depending on chosen triangulation method, shading may not be fully preserved, \"Fixed\" method usually gives the best result here" msgstr "" -"Thử giữ nguyên pháp tuyến tùy chọn.\n" -"Cảnh Báo: Tùy phương pháp tam giác hóa được chọn, có lẽ tô sắc không được giữ nguyên, phướng pháp \"Hằng Số\" ưa có kết qủa tốt nhất cho cái này" +"Cố gắng bảo tồn các pháp tuyến tùy chỉnh.\n" +"(Cảnh báo: Tùy vào phương pháp tam giác hóa đã chọn, chuyển sắc của tô bóng có thể sẽ không được hoàn toàn bảo tồn. Phương pháp 'Cố định' (Fixed) cho kết quả tốt nhất ở chỗ này)" msgid "Minimum Vertices" -msgstr "Đỉnh Cực tiểu" +msgstr "Số Điểm Đỉnh Tối Thiểu" msgid "Triangulate only polygons with vertex count greater than or equal to this number" -msgstr "Chỉ tam giác hóa các đa giác có số lượng đỉnh bằng số này trở lên" +msgstr "Chỉ tam giác hóa các đa giác với số điểm đỉnh lớn hơn hoặc bằng con số này" msgid "N-gon Method" @@ -36866,43 +39761,43 @@ msgstr "Phương Pháp Đa Giác" msgid "Method for splitting the n-gons into triangles" -msgstr "Phương pháp cho chẻ đa giác thành tam giác" +msgstr "Phương pháp tách phân các đa giác nhiều cạnh (n-gons) thành các tam giác" msgid "Beauty" -msgstr "Đẹp" +msgstr "Làm Đẹp" msgid "Arrange the new triangles evenly (slow)" -msgstr "Tổ chức các tam giác mới đều (chậm)" +msgstr "Bố trí các tam giác mới đều đặn (chậm)" msgid "Split the polygons with an ear clipping algorithm" -msgstr "Chẻ đa giác với một giải thuật 'cắt lỗ tai'" +msgstr "Tách phân các đa giác với thuật toán 'cắt tai' (ear clipping)" msgid "Quad Method" -msgstr "Phương Pháp Tư Giác" +msgstr "Phương Pháp Tứ Giác" msgid "Method for splitting the quads into triangles" -msgstr "Phương pháp chẻ tư giác thành tam giác" +msgstr "Phương pháp tách phân các tứ giác thành các tam giác" msgid "Split the quads in nice triangles, slower method" -msgstr "Chẻ tư giác thành tam giác đẹp, phương pháp chậm hơn" +msgstr "Tách phân các tứ giác thành các tam giác đẹp, phương pháp chậm hơn" msgid "Split the quads on the first and third vertices" -msgstr "Chẻ tư giác tại đỉnh thứ 1 và thứ 3" +msgstr "Tách phân các tứ giác tại các điểm đỉnh thứ 1 và thứ 3" msgid "Fixed Alternate" -msgstr "Thay Phiên Bất Biến" +msgstr "So Le Cố Định" msgid "Split the quads on the 2nd and 4th vertices" -msgstr "Chẻ tư giác tại đỉnh thứ 2 và thứ 4" +msgstr "Tách phân các tứ giác tại điểm đỉnh thứ 2 và thứ 4" msgid "Shortest Diagonal" @@ -36910,7 +39805,7 @@ msgstr "Đường Chéo Ngắn Nhất" msgid "Split the quads along their shortest diagonal" -msgstr "Chẻ tư giác tại đường chéo ngắn nhất" +msgstr "Tách phân các tứ giác dọc theo đường chéo ngắn nhất của chúng" msgid "Longest Diagonal" @@ -36918,55 +39813,59 @@ msgstr "Đường Chéo Dài Nhất" msgid "Split the quads along their longest diagonal" -msgstr "Chẻ tư giác tại đường chéo dài nhất" +msgstr "Tách phân các tứ giác dọc theo đường chéo dài nhất của chúng" msgid "UV Project Modifier" -msgstr "Bộ Điều Chỉnh Chiếu UV" +msgstr "Bộ Điều Chỉnh Phóng Chiếu UV" msgid "UV projection modifier to set UVs from a projector" -msgstr "Bộ điều chỉnh chiếu UV cho đặt UV từ một vật thể chiếu" +msgstr "Bộ điều chỉnh dự phóng UV để đặt các UV theo máy phóng chiếu" msgid "Aspect X" -msgstr "Tỉ Cạnh X" +msgstr "Tỷ Lệ X" msgid "Horizontal aspect ratio (only used for camera projectors)" -msgstr "Tỉ số cảnh ngang (chỉ dùng cho phép chiếu máy quay phim)" +msgstr "Tỷ lệ tương quan theo chiều ngang (chỉ được sử dụng cho các phóng chiếu thông qua máy quay phim mà thôi)" msgid "Aspect Y" -msgstr "Tỉ Cạnh Y" +msgstr "Tỷ Lệ Y" msgid "Vertical aspect ratio (only used for camera projectors)" -msgstr "Tỉ số cảnh dọc (chỉ dùng cho phép chiếu máy quay phim)" +msgstr "Tỷ lệ tương quan theo chiều dọc (chỉ được sử dụng cho các phóng chiếu thông qua máy quay phim mà thôi)" msgid "Number of Projectors" -msgstr "Số Lượng Máy Chiếu" +msgstr "Số Lượng Máy Phóng Chiếu" msgid "Number of projectors to use" -msgstr "Dùng sô lượng máy chiếu" +msgstr "Số lượng máy phóng chiếu sử dụng" msgid "Projectors" -msgstr "Máy Chiếu" +msgstr "Máy Phóng Chiếu" msgid "Horizontal scale (only used for camera projectors)" -msgstr "Phóng to cảnh ngang (chỉ dùng cho phép chiếu máy quay phim)" +msgstr "Tỷ lệ chiều ngang (chỉ được sử dụng cho các phóng chiếu thông qua máy quay phim mà thôi)" msgid "Vertical scale (only used for camera projectors)" -msgstr "Phóng to cảnh dọc (chỉ dùng cho phép chiếu máy quay phim)" +msgstr "Tỷ lệ chiều dọc (chỉ được sử dụng cho các phóng chiếu thông qua máy quay phim mà thôi)" msgid "UVWarp Modifier" -msgstr "Bộ Điều Chỉnh Mở Gói UV" +msgstr "Bộ Điều Chỉnh Kéo UV" + + +msgid "Add target position to UV coordinates" +msgstr "Thêm vị trí mục tiêu vào các tọa độ UV" msgid "U-Axis" @@ -36978,88 +39877,92 @@ msgstr "Trục-V" msgid "Bone From" -msgstr "Xương Từ" +msgstr "Xương Nguồn" msgid "Bone defining offset" -msgstr "Xương xác định dịch" +msgstr "Xương xác định dịch chuyển" msgid "Bone To" -msgstr "Xương Đến" +msgstr "Xương Đích" msgid "UV Center" -msgstr "Trung Tâm UV" +msgstr "Tâm UV" msgid "Center point for rotate/scale" -msgstr "Điểm trung tâm cho xoay/phóng to" +msgstr "Điểm trung tâm cho sự xoay chiều/đổi tỷ lệ" msgid "Object From" -msgstr "Vật Thể Từ" +msgstr "Đối Tượng Nguồn" msgid "Object defining offset" -msgstr "Vật thể được chỉ định dịch" +msgstr "Đối tượng xác định dịch chuyển" msgid "Object To" -msgstr "Vật Thể Đến" +msgstr "Đối Tượng Đích" msgid "2D Offset for the warp" -msgstr "Dịch 2D cho uống cong" +msgstr "Dịch chuyển 2D trong bố trí kéo" msgid "2D Rotation for the warp" -msgstr "Xoay 2D cho uống cong" +msgstr "Xoay chiều 2D trong bố trí kéo" msgid "2D Scale for the warp" -msgstr "Phóng To 2D cho uống cong" +msgstr "Tỷ lệ 2D trong bố trí kéo" msgid "UV Layer" -msgstr "Lớp UV" +msgstr "Tầng Lớp UV" msgid "UV Layer name" -msgstr "Tên Lớp UV" +msgstr "Tên tầng lớp UV" msgid "WeightVG Edit Modifier" -msgstr "Bộ Điều Chỉnh Biên Tập Quyền Lượng Nhóm Đỉnh" +msgstr "Bộ Điều Chỉnh Biên Soạn Trọng Lượng NĐĐ" msgid "Edit the weights of vertices in a group" -msgstr "Biên tập quyền lượng của đỉnh trong một nhóm" +msgstr "Biên soạn trọng lượng của các điểm đỉnh trong một nhóm (Nhóm Điểm Đỉnh : NĐĐ)" msgid "Add Threshold" -msgstr "Ngưỡng Nhập" +msgstr "Thêm Ngưỡng" + + +msgid "Lower (inclusive) bound for a vertex's weight to be added to the vgroup" +msgstr "Giới hạn dưới (bao gồm cả) để thêm trọng số của điểm đỉnh vào vgroup (nhóm điểm đỉnh)" msgid "Default Weight" -msgstr "Quyền Lượng Mặc Định" +msgstr "Trọng Lượng Mặc Định" msgid "Default weight a vertex will have if it is not in the vgroup" -msgstr "Quyền lượng mặc định cho một đỉnh nếu không ở trong nhóm đỉnh" +msgstr "Trọng lượng mặc định cho một điểm đỉnh nếu nó không nằm trong nhóm ĐĐ" msgid "How weights are mapped to their new values" -msgstr "Làm quyền lượng được ánh xạ đến giá trị mới" +msgstr "Phương pháp ánh xạ trọng lượng thành các giá trị mới của chúng" msgid "Null action" -msgstr "Hành Động Không" +msgstr "Vô hiệu (không thi hành một hành động nào cả)" msgctxt "Curve" msgid "Custom Curve" -msgstr "Đường Cong Tùy Chọn" +msgstr "Đường Cong Tùy Chỉnh" msgctxt "Curve" @@ -37069,51 +39972,51 @@ msgstr "Ngẫu Nhiên" msgctxt "Curve" msgid "Median Step" -msgstr "Bước Giữa" +msgstr "Bước Trung Vị" msgid "Map all values below 0.5 to 0.0, and all others to 1.0" -msgstr "Ánh xạ hết giá trị đưới 0.5 đến 0.0 và hết giá trị khác bằng 1.0" +msgstr "Ánh xạ toàn bộ các giá trị dưới 0.5 về 0.0, còn toàn bộ các giá trị khác thì bằng 1.0 (Làm tròn số)" msgid "Invert Falloff" -msgstr "Đảo Nghịch Sự Giảm" +msgstr "Đảo Ngược Suy Giảm Dần" msgid "Invert the resulting falloff weight" -msgstr "Đảo nghịch quyền lượng của sự giảm kết qủa" +msgstr "Đảo ngược kết quả suy giảm dần của trọng lượng" msgid "Invert vertex group mask influence" -msgstr "Đảo ngược sự ảnh hưởng của mặt nạ nhóm đỉnh" +msgstr "Đảo ngược ảnh hưởng chắn lọc của nhóm điểm đỉnh" msgid "Mapping Curve" -msgstr "Đường Cong Ánh Xạ" +msgstr "Ánh Xạ Đường Cong" msgid "Custom mapping curve" -msgstr "Đường cong ánh xạ tùy chọn" +msgstr "Đường cong ánh xạ tùy biến" msgid "Global influence of current modifications on vgroup" -msgstr "Sự ảnh hưởng của các bộ điều chỉnh hiện tại của nhóm đỉnh" +msgstr "Ảnh hưởng toàn cầu của các điều chỉnh hiện tại trên nhóm điểm đỉnh" msgid "Which bone to take texture coordinates from" -msgstr "Dùng tọa độ chất liệu của xương nào" +msgstr "Lấy tọa độ chất liệu từ xương nào" msgid "Which object to take texture coordinates from" -msgstr "Dùng tọa độ chất liệu của vật thể nào" +msgstr "Lấy tọa độ chất liệu từ đối tượng nào" msgid "Which texture coordinates to use for mapping" -msgstr "Dùng tọa độ chất liệu nào cho làm ánh xạ" +msgstr "Dùng tọa độ chất liệu nào để ánh xạ" msgid "Use local generated coordinates" -msgstr "Dùng tọa độ địa phương được xhế tạo" +msgstr "Dùng tọa độ sinh tạo địa phương" msgid "Use global coordinates" @@ -37121,11 +40024,11 @@ msgstr "Dùng tọa độ toàn cầu" msgid "Use local generated coordinates of another object" -msgstr "Dùng tọa độ địa phương được chế tạo của vật thể khác" +msgstr "Dùng tọa độ sinh tạo địa phương của một đối tượng khác" msgid "Use coordinates from a UV layer" -msgstr "Dùng tọa dộ từ một lớp UV" +msgstr "Sử dụng tọa độ từ một tầng lớp UV" msgid "Use Channel" @@ -37133,215 +40036,219 @@ msgstr "Dùng Kênh" msgid "Which texture channel to use for masking" -msgstr "Dùng kênh nào cho làm mặt nạ" +msgstr "Kênh chất liệu nào sử dụng để chắn lọc" msgid "Masking Tex" -msgstr "Chất Liệu Mạt Nạ" +msgstr "Chất Liệu Chắn Lọc" msgid "Masking texture" -msgstr "Chất Liệu mặt nạ" +msgstr "Chất liệu chắn lọc" msgid "Mask Vertex Group" -msgstr "Nhóm Đỉnh Mặt Nạ" +msgstr "Nhóm Điểm Đỉnh Chắn Lọc" msgid "Masking vertex group name" -msgstr "Tên nhóm đỉnh mặt nạ" +msgstr "Tên của nhóm điểm đỉnh chắn lọc" msgid "Normalize Weights" -msgstr "Đơn Vị Hóa Quyền Lượng" +msgstr "Bình Thường Hóa Trọng Lượng" msgid "Normalize the resulting weights (otherwise they are only clamped within 0.0 to 1.0 range)" -msgstr "Đơn vị hóa quyền lượng kết qủa (nếu không, kẹp lại nó trong phạm vi 0.0 đến 1.0)" +msgstr "Bình thường hóa các trọng lượng kết quả (nếu không chúng sẽ chỉ được hạn định trong phạm vi từ 0,0 đến 1,0 mà thôi)" msgid "Remove Threshold" -msgstr "Ngưỡng Xóa" +msgstr "Giới Hạn Loại Bỏ" + + +msgid "Upper (inclusive) bound for a vertex's weight to be removed from the vgroup" +msgstr "Giới hạn trên (bao gồm cả) để loại bỏ trọng lượng của điểm đỉnh khỏi vgroup (nhóm điểm đỉnh)" msgid "Group Add" -msgstr "Nhập Nhóm" +msgstr "Cộng vào Nhóm" msgid "Add vertices with weight over threshold to vgroup" -msgstr "Kèm các định có quyền lượng ở trên ngưỡng nhập vào nhóm đỉnh" +msgstr "Cộng các điểm đỉnh với trọng lượng trên giới hạn vào nhóm ĐĐ" msgid "Group Remove" -msgstr "Xóa Nhóm" +msgstr "Loại Bỏ khỏi Nhóm" msgid "Remove vertices with weight below threshold from vgroup" -msgstr "Xóa các định có quyền lượng ở dưới ngưỡng ra khỏi nhóm đỉnh" +msgstr "Loại bỏ các điểm đỉnh với trọng lượng dưới giới hạn ra khỏi nhóm ĐĐ" msgid "WeightVG Mix Modifier" -msgstr "Bộ Điều Chỉnh Pha Trộn Quyền Lượng Nhóm Đỉnh" +msgstr "Bộ Điều Chỉnh Hòa Trộn Trọng Lượng Nhóm Điểm Đỉnh" msgid "Default Weight A" -msgstr "Quyền Lượng A Mặc Định" +msgstr "Trọng Lượng A Mặc Định" msgid "Default weight a vertex will have if it is not in the first A vgroup" -msgstr "Quyền lượng mặc định cho các đỉnh không ở trong nhóm đỉnh A thứ nhất" +msgstr "Trọng lượng mặc định một điểm đỉnh sẽ có nếu nó không ở trong nhóm điểm đỉnh A thứ nhất" msgid "Default Weight B" -msgstr "Quyền Lượng B Mặc Định" +msgstr "Trọng Lượng B Mặc Định" msgid "Default weight a vertex will have if it is not in the second B vgroup" -msgstr "Quyền lượng mặc định cho các đỉnh không ở trong nhóm đỉnh B thứ hai" +msgstr "Trọng lượng mặc định một điểm đỉnh sẽ có nếu nó không ở trong nhóm điểm đỉnh B thứ hai" msgid "Invert Weights A" -msgstr "Đảo Nghịch Quyền Lượng A" +msgstr "Đảo Ngược Trọng Lượng A" msgid "Invert the influence of vertex group A" -msgstr "Đảo nghịch sự ảnh hưởng của nhóm đỉnh A" +msgstr "Đảo ngược ảnh hưởng của nhóm điểm đỉnh A" msgid "Invert Weights B" -msgstr "Đảo Nghịch Quyền Lượng B" +msgstr "Đảo Ngược Trọng Lượng B" msgid "Invert the influence of vertex group B" -msgstr "Đảo nghịch sự ảnh hưởng của nhóm đỉnh B" +msgstr "Đảo ngược ảnh hưởng của nhóm điểm đỉnh B" msgid "How weights from vgroup B affect weights of vgroup A" -msgstr "Làm sao quyền lượng từ nhóm đỉnh B được ảnh hưởng quyền lượng của nhóm đỉnh A" +msgstr "Trọng lượng từ nhóm B tác động trọng lượng của nhóm A thế nào" msgid "Replace VGroup A's weights by VGroup B's ones" -msgstr "Thay thế quyền lượng của NhómĐỉnh A bằng quyền lượng của NhómĐỉnh B" +msgstr "Thay thế trọng lượng của nhóm A bằng trọng lượng của nhóm B" msgid "Add VGroup B's weights to VGroup A's ones" -msgstr "Cộng quyền lượng của NhómĐỉnh B với quyền lượng của NhómĐỉnh A" +msgstr "Cộng trọng lượng của nhóm B vào trọng lượng của nhóm A" msgid "Subtract VGroup B's weights from VGroup A's ones" -msgstr "Trừ quyền lượng của NhómĐỉnh B từ quyền lượng của NhómĐỉnh A" +msgstr "Khấu Trừ trọng lượng của nhóm B khỏi trọng lượng của nhóm A" msgid "Multiply VGroup A's weights by VGroup B's ones" -msgstr "Nhân quyền lượng của NhómĐỉnh A với quyền lượng của NhómĐỉnh B" +msgstr "Nhân trọng lượng của nhóm A với trọng lượng của nhóm B" msgid "Divide VGroup A's weights by VGroup B's ones" -msgstr "Chia quyền lượng của NhómĐỉnh A cho quyền lượng của NhómĐỉnh B" +msgstr "Chia trọng lượng của nhóm A cho trọng lượng của nhóm B" msgid "Difference between VGroup A's and VGroup B's weights" -msgstr "Chênh lệch giữa quyền lượng của NhómĐỉnh A và NhómĐỉnh B" +msgstr "Hiệu của trọng lượng nhóm A và nhóm B" msgid "Average value of VGroup A's and VGroup B's weights" -msgstr "Giá trị trung bình của quyền lượng của NhómĐỉnh A và NhómĐỉnh B" +msgstr "Giá trị trung bình của nhóm A và nhóm B" msgid "Minimum of VGroup A's and VGroup B's weights" -msgstr "Cực tiểu của quyền lượng của NhómĐỉnh A và NhómĐỉnh B" +msgstr "Trọng lượng tối thiểu của VGroup A và VGroup B" msgid "Maximum of VGroup A's and VGroup B's weights" -msgstr "Cực đại của quyền lượng của NhómĐỉnh A và NhómĐỉnh B" +msgstr "Trọng lượng tối đa của VGroup A và VGroup B" msgid "Vertex Set" -msgstr "Tập Hợp Đỉnh" +msgstr "Tập Hợp Điểm Đỉnh" msgid "Which vertices should be affected" -msgstr "Nên ảnh hưởng đỉnh nào" +msgstr "Những điểm đỉnh nào sẽ bị tác động" msgid "Affect all vertices (might add some to VGroup A)" -msgstr "Ảnh hưởng tất cả đỉnh (có lẽ nhập thêm đỉnh vào Nhóm Đỉnh A)" +msgstr "Ảnh hưởng toàn bộ các điểm đỉnh (có thể thêm một số vào nhóm điểm đỉnh A)" msgid "VGroup A" -msgstr "Nhóm Đỉnh A" +msgstr "Nhóm Điểm Đỉnh A" msgid "Affect vertices in VGroup A" -msgstr "Ảnh hưởng các đỉnh trong Nhóm Đỉnh A" +msgstr "Ảnh hưởng các điểm đỉnh trong nhóm điểm đỉnh A" msgid "VGroup B" -msgstr "Nhóm Đỉnh B" +msgstr "Nhóm Điểm Đỉnh B" msgid "Affect vertices in VGroup B (might add some to VGroup A)" -msgstr "Ảnh hưởng các đỉnh trong Nhóm Đỉnh B (có lẽ nhập thêm đỉnh vào Nhóm Đỉnh A)" +msgstr "Ảnh hưởng toàn bộ các điểm đỉnh trong nhóm B (có thể thêm một số vào nhóm điểm đỉnh A)" msgid "VGroup A or B" -msgstr "Nhóm Đỉnh A hay B" +msgstr "Nhóm Điểm Đỉnh A hoặc B" msgid "Affect vertices in at least one of both VGroups (might add some to VGroup A)" -msgstr "Ảnh hưởng đỉnh trong ít nhất một trong cả hai nhóm (có lẽ nhập thêm đỉnh vào Nhóm Đỉnh A)" +msgstr "Ảnh hưởng các điểm đỉnh trong ít nhất một trong hai nhóm (có thể thêm một số vào nhóm điểm đỉnh A)" msgid "VGroup A and B" -msgstr "Nhóm Đỉnh A và B" +msgstr "Nhóm Điểm Đỉnh A và B" msgid "Affect vertices in both groups" -msgstr "Ảnh hưởng đỉnh trong cả hai nhóm" +msgstr "Tác động các điểm đỉnh trong cả hai nhóm" msgid "Vertex Group A" -msgstr "Nhóm Đỉnh A" +msgstr "Nhóm Điểm Đỉnh A" msgid "First vertex group name" -msgstr "Tên của nhóm đỉnh thứ nhất" +msgstr "Tên của nhóm điểm đỉnh thứ nhất" msgid "Vertex Group B" -msgstr "Nhóm Đỉnh B" +msgstr "Nhóm Điểm Đỉnh B" msgid "Second vertex group name" -msgstr "Tên của nhóm đỉnh thứ hai" +msgstr "Tên của nhóm điểm đỉnh thứ nhì" msgid "WeightVG Proximity Modifier" -msgstr "Bộ Điều Chỉnh Khoảng Cách Quyền Lượng Nhóm Đỉnh" +msgstr "Bộ Điều Chỉnh Khoảng Tiếp Cận của Trọng Lượng Nhóm Điểm Đỉnh" msgid "Set the weights of vertices in a group from a target object's distance" -msgstr "Đặt quyền lượng của đỉnh trong một nhóm từ khoảng cách của một vật thể mục tiêu" +msgstr "Đặt trọng lượng của các điểm đỉnh trong một nhóm dùng khoảng cách của một đối tượng đích" msgid "Distance mapping to weight 1.0" -msgstr "Ánh xạ khoảng cách đến quyền lượng 1.0" +msgstr "Ánh xạ khoảng cách thành trọng lượng 1.0" msgid "Distance mapping to weight 0.0" -msgstr "Ánh xạ khoảng cách đến quyền lượng 0.0" +msgstr "Ánh xạ khoảng cách thành trọng lượng 0.0" msgid "Proximity Geometry" -msgstr "Khoảng Cách Hình Dạng" +msgstr "Hình Học Tiếp Cận" msgid "Use the shortest computed distance to target object's geometry as weight" -msgstr "Dùng khoảng cách được tính cách ngắn nhất đến hình dạng của vật thể mục tiêu cho làm quyền lượng" +msgstr "Dùng khoảng cách tính được ngắn nhất đến hình học của đối tượng mục tiêu làm trọng lượng" msgid "Compute distance to nearest vertex" -msgstr "Tính khoảng cách đến đỉnh gần nhất" +msgstr "Tính khoảng cách đến điểm đỉnh gần nhất" msgid "Compute distance to nearest edge" @@ -37349,35 +40256,35 @@ msgstr "Tính khoảng cách đến cạnh gần nhất" msgid "Compute distance to nearest face" -msgstr "Tính khoảng cách đến mặt gần nhất" +msgstr "Tính khoảng cách đến Mặt gần nhất" msgid "Proximity Mode" -msgstr "Chế Độ Khoảng Cách" +msgstr "Chế Độ Tiếp Cận" msgid "Which distances to target object to use" -msgstr "Dùng khoảng cách nào đến vật thể mục tiêu" +msgstr "Khoảng cách nào tới đối tượng mục tiêu để sử dụng" msgid "Use distance between affected and target objects" -msgstr "Dùng khoảng cách giữa vật thể được ảnh hưởng đến vật thể mục tiêu" +msgstr "Dùng khoảng cách giữa cái bị ảnh hưởng đến đối tượng mục tiêu" msgid "Use distance between affected object's vertices and target object, or target object's geometry" -msgstr "Dùng khoảng cách giữa đỉnh của vật thể được ảnh hưởng và vật thể mục tiêu, hay hình dạng của vật thể mục tiêu" +msgstr "Dùng khoảng cách giữa điểm đỉnh của cái bị ảnh hưởng và đối tượng mục tiêu, hoặc hình học của mục tiêu" msgid "Object to calculate vertices distances from" -msgstr "Tính khoảng cách đỉnh từ vật thể nào" +msgstr "Đối tượng để tính các khoảng cách điểm đỉnh từ nó" msgid "Volume Displace Modifier" -msgstr "Bộ Điều Chỉnh Dịch Thể Tích" +msgstr "Bộ Điều Chỉnh Dời Hình Thể Tích" msgid "Strength of the displacement" -msgstr "Sức của dịch" +msgstr "Cường Độ Dời Hình" msgid "Texture Mapping Mode" @@ -37385,151 +40292,155 @@ msgstr "Chế Độ Ánh Xạ Chất Liệu" msgid "Object to use for texture mapping" -msgstr "Vật thể để dùng cho ánh xạ chất liệu" +msgstr "Đối tượng sử dụng cho việc ánh xạ chất liệu" msgid "Texture Mid Level" -msgstr "Mức Độ Giữa Của Chất Liệu" +msgstr "Mức Trung Bình của Chất Liệu" msgid "Subtracted from the texture color to get a displacement vector" -msgstr "Được trừ từ màu sắc của chất liệu để tính một vectơ địch" +msgstr "Khấu trừ khỏi màu của chất liệu để lấy một véctơ dời hình" msgid "Texture Sample Radius" -msgstr "Bán Kính Mẫu Chất Liệu" +msgstr "Bán Kính Lấy Mẫu Chất Liệu" msgid "Smaller values result in better performance but might cut off the volume" -msgstr "Giá trị càng nhỏ có hiệu suất càng lớn nhưng có thể cắt bớt thể tích" +msgstr "Các giá trị nhỏ hơn cho kết quả hiệu suất hoạt động tốt hơn, song có thể cắt bỏ thể tích" msgid "Volume to Mesh Modifier" -msgstr "Thể Tích Sang Bộ Điều Chỉnh Mạng Lưới" +msgstr "Thể Tích sang Bộ Điều Chỉnh Khung Lưới" msgid "Reduces the final face count by simplifying geometry where detail is not needed" -msgstr "Giảm số lượng mặt bằng đơn giản hóa hình dạng tại chỗ thì không cần chi tiết" +msgstr "Giảm thiểu số lượng Mặt, bằng cách đơn giản hóa hình học ở những chỗ mà chi tiết là không cần thiết" msgid "Grid Name" -msgstr "Tên Đồ Thị" +msgstr "Tên của Khung Lưới Đồ Thị" msgid "Grid in the volume object that is converted to a mesh" -msgstr "Đồ thị trong vật thể thể tích sau được đổi sang một mạng lưới" +msgstr "Khung lưới đồ thị trong đối tượng thể tích đã được chuyển đổi thành khung lưới" msgid "Use resolution of the volume grid" -msgstr "Dùng độ phân giải của đồ thị thể tích" +msgstr "Sử dụng độ phân giải của khung lưới đồ thị thể tích" msgid "Voxels with a larger value are inside the generated mesh" -msgstr "Thể tích tử có một giá trị lớn hơn ở trong mạng lưới được chế tạo" +msgstr "Các thể tích tử có giá trị lớn hơn sẽ nằm bên trong khung lưới sinh tạo" msgid "Warp Modifier" -msgstr "Bộ Điều Chỉnh Uốn Cong" +msgstr "Bộ Điều Chỉnh Uốn Oằn" msgid "Warp modifier" -msgstr "Bộ điều chỉnh uốn cong" +msgstr "Bộ điều chỉnh uốn oằn" msgid "Bone to transform from" -msgstr "Biến hóa từ xương nào" +msgstr "Xương để biến hóa từ đó" msgid "Radius to apply" -msgstr "Bánh kính để áp dụng" +msgstr "Bán kính để áp dụng" msgid "Object to transform from" -msgstr "Vật thể để biến hóa từ" +msgstr "Đối tượng nguồn của biến hóa" msgid "Object to transform to" -msgstr "Vật thể để biến hóa thành" +msgstr "Đối tượng đích của biến hóa" msgid "Preserve volume when rotations are used" -msgstr "Giữ nguyên thể tích khi xoay" +msgstr "Bảo tồn thể tích khi xoay chiều" msgid "Wave Modifier" -msgstr "Bộ Điều Chỉnh Sóng" +msgstr "Bộ Điều Chỉnh Tạo Sóng" msgid "Wave effect modifier" -msgstr "Bộ điều chỉnh hiệu ứng sóng" +msgstr "Bộ điều chỉnh tạo hiệu ứng sóng" msgid "Damping Time" -msgstr "Thời Gian Tắt Dần" +msgstr "Thời Gian Suy Giảm" msgid "Number of frames in which the wave damps out after it dies" -msgstr "Sô lượng bức ảnh sóng được giảm mất sau nó bị hủy diệt" +msgstr "Số lượng khung hình mà sóng sẽ tắt dần sau khi nó lặng đi" msgid "Falloff Radius" -msgstr "Bán Kính Sự Giảm" +msgstr "Bán Kính Suy Giảm" msgid "Distance after which it fades out" -msgstr "Khoảng cách sóng được giảm mất" +msgstr "Khoảng cách mà sau đó sóng sẽ lặng dần đi" msgid "Height of the wave" -msgstr "Bề cao của sóng" +msgstr "Chiều cao của sóng" msgid "Lifetime of the wave in frames, zero means infinite" -msgstr "Tuổi thọ của sóng (dơ vị bức ảnh), số không nghĩa là vô hạn" +msgstr "Tuổi thọ của sóng trong số lượng khung hình, số không (zê-rô) nghĩa là vô hạn" msgid "Narrowness" -msgstr "Biên Độ" +msgstr "Độ Hẹp" msgid "Distance between the top and the base of a wave, the higher the value, the more narrow the wave" -msgstr "Khoảng cách từ đỉnh và đáy của sóng, giá trị càng cao sóng càng cao" +msgstr "Khoảng cách từ đỉnh và đáy của sóng, giá trị càng cao thì sóng càng hẹp" msgid "Speed of the wave, towards the starting point when negative" -msgstr "Tốc độ của sóng, đến điểm bắt đầu khi âm" +msgstr "Tốc độ của sóng. Tiến về điểm khởi đầu khi là giá trị âm" msgid "Start Position Object" -msgstr "Vật Thể Vị Trí Bắt Đầu" +msgstr "Đối Tượng làm Vị Trí Khởi Đầu" msgid "Object which defines the wave center" -msgstr "Vật thể cho chỉ định vị trí trung tâm sóng" +msgstr "Đối tượng xác định vị trí trung tâm của sóng" msgid "Start Position X" -msgstr "Vi Trí Bắt Đầu X" +msgstr "Vị Trí Khởi Đầu X" msgid "X coordinate of the start position" -msgstr "Tọa độ X của vị trị bắt đầu" +msgstr "Tọa độ X của vị trí khởi đầu" msgid "Start Position Y" -msgstr "Vi Trí Bắt Đầu Y" +msgstr "Vị Trí Khởi Đầu Y" msgid "Y coordinate of the start position" -msgstr "Tọa độ Y của vị trị bắt đầu" +msgstr "Tọa độ Y của vị trí khởi đầu" + + +msgid "Either the starting frame (for positive speed) or ending frame (for negative speed)" +msgstr "Khung hình khởi đầu (đối với tốc độ là số dương) hoặc khung hình kết thúc (đối với tốc độ là số âm)" msgid "Cyclic wave effect" -msgstr "Hiệu ứng sóng chu kỳ" +msgstr "Hiệu ứng sóng nhắc lại theo chu kỳ" msgid "Displace along normals" -msgstr "Dịch theo pháp tuyến" +msgstr "Dời hình dọc theo pháp tuyến" msgid "X Normal" @@ -37537,7 +40448,7 @@ msgstr "Pháp Tuyến X" msgid "Enable displacement along the X normal" -msgstr "Bật dịch hướng pháp tuyến X" +msgstr "Cho phép dời hình dọc theo hướng pháp tuyến X" msgid "Y Normal" @@ -37545,7 +40456,7 @@ msgstr "Pháp Tuyến Y" msgid "Enable displacement along the Y normal" -msgstr "Bật dịch hướng pháp tuyến Y" +msgstr "Cho phép dời hình dọc theo hướng pháp tuyến Y" msgid "Z Normal" @@ -37553,43 +40464,43 @@ msgstr "Pháp Tuyến Z" msgid "Enable displacement along the Z normal" -msgstr "Bật dịch hướng pháp tuyến Z" +msgstr "Cho phép dời hình dọc theo hướng pháp tuyến Z" msgid "X axis motion" -msgstr "Chuyển động X" +msgstr "Chuyển động của trục X" msgid "Y axis motion" -msgstr "Chuyển động Y" +msgstr "Chuyển động của trục Y" msgid "Vertex group name for modulating the wave" -msgstr "Tên nhóm đỉnh cho biến đổi sóng" +msgstr "Tên nhóm điểm đỉnh để điều biến làn sóng" msgid "Distance between the waves" -msgstr "Khoảng cách giữa các sóng" +msgstr "Khoảng cách giữa các làn sóng" msgid "WeightedNormal Modifier" -msgstr "Bộ Điều Chỉnh Pháp Tuyến Có Quyền Lượng" +msgstr "Bộ Điều Chỉnh Pháp Tuyến Cân Trọng" msgid "Keep Sharp" -msgstr "Giữ Bén" +msgstr "Duy Trì sự Sắc Nhọn" msgid "Keep sharp edges as computed for default split normals, instead of setting a single weighted normal for each vertex" -msgstr "Giữ cạnh bén giống được tính cho pháp tuyến chẻ mặc định, thay thế đặt một pháp tuyến có quyền lượng cho mỗi đỉnh" +msgstr "Duy trì các cạnh sắc nhọn như đã được tính toán cho các pháp tuyến phân tách mặc định, thay vì đặt một đơn pháp tuyến được cân trọng cho mỗi điểm đỉnh" msgid "Weighting Mode" -msgstr "Chế Độ Quyền Lượng" +msgstr "Chế Độ Tính Trọng Lượng" msgid "Weighted vertex normal mode to use" -msgstr "Dùng chế độ pháp tuyến đỉnh có quyền lượng nào" +msgstr "Chế độ pháp tuyến điểm đỉnh được cân trọng để sử dụng" msgid "Face Area" @@ -37597,75 +40508,79 @@ msgstr "Diện Tích Mặt" msgid "Generate face area weighted normals" -msgstr "Chế tạo pháp tuyến có quyền lượng diện tích mặt " +msgstr "Sinh tạo các pháp tuyến cân trọng cho diện tích Mặt" msgid "Generate corner angle weighted normals" -msgstr "Chế tạo pháp tuyến góc của góc có quyền lượng" +msgstr "Sinh tạo các pháp tuyến cân trọng cho góc độ của góc cạnh" + + +msgid "Face Area & Angle" +msgstr "Diện Tích Mặt và Góc Độ" msgid "Generated normals weighted by both face area and angle" -msgstr "Chế tạo pháp tuyến có quyền lượng bằng dùng diện tiện và góc mặt" +msgstr "Các pháp tuyến sinh tạo được cân trọng bởi cả hai diện tích Mặt và góc độ" msgid "Threshold value for different weights to be considered equal" -msgstr "Giá trị ngưỡng cho quyền lượng khác được nhận là bằng nhau" +msgstr "Giá trị giới hạn để cân nhắc các trọng lượng khác biệt là tương đồng" msgid "Face Influence" -msgstr "Sự Ảnh Hưởng Mặt" +msgstr "Tác Động Mặt" msgid "Use influence of face for weighting" -msgstr "Sử dụng sự ảnh hưởng mặt cho đặt quyền lượng" +msgstr "Sử dụng tác động của Mặt để cân trọng" msgid "Vertex group name for modifying the selected areas" -msgstr "Tên nhóm đỉnh để chỉnh sửa khu vực được chọn" +msgstr "Tên nhóm điểm đỉnh để điều chỉnh vùng được chọn" msgid "Corrective factor applied to faces' weights, 50 is neutral, lower values increase weight of weak faces, higher values increase weight of strong faces" -msgstr "Hệ số chỉnh sửa được áp dụng cho quyền lượng của các mặt, 50 là không ảnh hưởng, giá tr nhỏ hơn tăng quyền lượng của mặt yếu, giá lớn hơn tăng quyền lượng của mặt khỏe" +msgstr "Hệ số chỉnh sửa áp dụng vào các trọng lượng các mặt, 50 là trung tính, những giá trị thấp sẽ làm tăng trọng lượng của các mặt yếu, những giá trị cao sẽ làm tăng trọng lượng của các mặt mạnh" msgid "Weld Modifier" -msgstr "Bộ Điều Chỉnh Hàn" +msgstr "Bộ Điều Chỉnh Hàn Gắn" msgid "Weld modifier" -msgstr "Bộ điều chỉnh hàn" +msgstr "Bộ điều chỉnh hàn gắn" msgid "Only Loose Edges" -msgstr "Chỉ Cạnh Rời Ra" +msgstr "Duy các Cạnh Rời Rạc" msgid "Collapse edges without faces, cloth sewing edges" -msgstr "Sập các cạnh không có mặt, vải có cạnh mai lại" +msgstr "Thu các cạnh không có bề, các cạnh may của vải vóc lại" msgid "Mode defines the merge rule" -msgstr "Chế độ được chỉ định quy tắc gồm" +msgstr "Chế độ sử dụng để xác định nguyên tắc hợp nhất" msgid "Full merge by distance" -msgstr "Gồm bằng khoảng cách" +msgstr "Hội nhập toàn phần theo khoảng cách" msgid "Only merge along the edges" -msgstr "Chỉ gồm trên cạnh" +msgstr "Duy hợp nhất dọc theo cạnh mà thôi" msgid "Wireframe Modifier" -msgstr "Bộ Điều Chỉnh Khung Sợi Dây" +msgstr "Bộ Điều Chỉnh Mạch Lưới" msgid "Wireframe effect modifier" -msgstr "Bộ điều chỉnh khung sợi dây" +msgstr "Bộ điều chỉnh mạch lưới" msgid "Crease weight (if active)" -msgstr "Quyền lượng nhăn (nếu hoạt động)" +msgstr "Trọng lượng nếp gấp (nếu đang hoạt động)" msgid "Thickness factor" @@ -37677,83 +40592,83 @@ msgstr "Ranh Giới" msgid "Support face boundaries" -msgstr "Hỗ trợ ranh giới mặt" +msgstr "Hỗ trợ các đường ranh giới của Mặt" msgid "Offset Relative" -msgstr "Dịch Tương Đối" +msgstr "Dịch Chuyển Tương Đối" msgid "Crease hub edges for improved subdivision surface" -msgstr "Nhăn cạnh trạm cho phân hóa bề mặt tốt hơn" +msgstr "Miết các cạnh có trục nối (ra từ một điểm đỉnh) để cải thiện sự bề mặt phân hóa" msgid "Offset Even" -msgstr "Dịch Đều" +msgstr "Dịch Chuyển Đồng Đều" msgid "Scale the offset to give more even thickness" -msgstr "Phóng to dịch cho làm bề dày đều hơn" +msgstr "Đổi tỷ lệ dịch chuyển để làm độ dày đồng đều hơn" msgid "Scale the offset by surrounding geometry" -msgstr "Phóng to dịch tùy hình dạng xung quanh" +msgstr "Đổi tỷ lệ dịch chuyển theo hình học chung quanh" msgid "Remove original geometry" -msgstr "Xóa hình dạng ban đầu" +msgstr "Loại bỏ hình học gốc" msgid "Cache of the world-space positions of an element over a frame range" -msgstr "Đệm chứa của vị trí trong không gian thế giới của một phần tử qua một phạm vị bức ảnh" +msgstr "Bộ nhớ đệm các vị trí trong không gian thế giới của một phần tử trên một phạm vi khung hình" msgid "Custom color for motion path" -msgstr "Màu tùy chọn cho đường chuyển động" +msgstr "Màu tùy biến cho đường chuyển động" msgid "End frame of the stored range" -msgstr "Số bức ảnh cuối của phạm vi được chứa" +msgstr "Khung hình cuối của phạm vi lưu trữ" msgid "Starting frame of the stored range" -msgstr "Số bức ảnh đầu của phạm vi được chứa" +msgstr "Khung hình đầu của phạm vi lưu trữ" msgid "Edit Path" -msgstr "Biên Tập Đường" +msgstr "Biên Soạn Đường Dẫn" msgid "Path is being edited" -msgstr "Đang biên tập đường chuyển động" +msgstr "Đường dẫn đang được biên soạn" msgid "Number of frames cached" -msgstr "Số lượng bức ảnh trong đệm chứa" +msgstr "Số lượng khung hình lưu trong bộ nhớ đệm" msgid "Line Thickness" -msgstr "Bề Rộng Nét" +msgstr "Độ Dày của Đường Nét" msgid "Line thickness for motion path" -msgstr "Bề rộng nét cho đường chuyển động" +msgstr "Độ dày nét cho đường chuyển động" msgid "Lines" -msgstr "Dòng" +msgstr "Đường Nét/Thẳng" msgid "Use straight lines between keyframe points" -msgstr "Vẽ đường thẳng giữa các điểm bức ảnh mẫu" +msgstr "Sử dụng các đường thẳng giữa những điểm của khung khóa" msgid "Motion Path Points" -msgstr "Điểm Đường Chuyển Động" +msgstr "Các Điểm của Đường Chuyển Động" msgid "Cached positions per frame" -msgstr "Vị trí được chứa cho mỗi bức ảnh" +msgstr "Các vị trí lưu trữ trong bộ nhớ đệm của mỗi khung hình" msgid "Use Bone Heads" @@ -37761,11 +40676,11 @@ msgstr "Dùng Đầu Xương" msgid "For PoseBone paths, use the bone head location when calculating this path" -msgstr "Cho đường chuyển động của Xương Dạng Đứng, dùng vị trí đầu xương khi tính đường đi này" +msgstr "Dành cho đường chuyển động của các Xương Tư Thế: sử dụng vị trí đầu xương khi tính toán đường chuyển động này" msgid "Custom Colors" -msgstr "Màu Tùy Chọn" +msgstr "Màu Tùy Chỉnh" msgid "Use custom color for this motion path" @@ -37773,87 +40688,87 @@ msgstr "Dùng màu tùy chọn cho đường chuyển động này" msgid "Motion Path Cache Point" -msgstr "Điểm Đệm Chứa Đường Chuyển Động" +msgstr "Điểm trong Bộ Nhớ Đệm của Đường Chuyển Động" msgid "Cached location on path" -msgstr "Vị trí được chứa trên đường chuyển động" +msgstr "Vị trí được ghi trong bộ nhớ đệm của đường chuyển động" msgid "Path point is selected for editing" -msgstr "Điểm đường chuyển động được chọn cho biên tập" +msgstr "Điểm đường chuyển động đã được chọn để biên soạn" msgid "Movie Clip Proxy" -msgstr "Đại Lý Đoạn Phim" +msgstr "Bản Đại Diện của Đoạn Phim" msgid "Proxy parameters for a movie clip" -msgstr "Tham số đại lý cho đoạn phim" +msgstr "Tham số về bản đại diện cho đoạn phim" msgid "Build proxy resolution 100% of the original footage dimension" -msgstr "Xây độ phân giải đại lý 100% của kích thước đoạn phim ban đầu" +msgstr "Xây dựng đại diện với độ phân giải bằng 100% kích thước của đoạn phim gốc" msgid "Build proxy resolution 25% of the original footage dimension" -msgstr "Xây độ phân giải đại lý 25% của kích thước đoạn phim ban đầu" +msgstr "Xây dựng đại diện với độ phân giải bằng 25% kích thước của đoạn phim gốc" msgid "Build proxy resolution 50% of the original footage dimension" -msgstr "Xây độ phân giải đại lý 50% của kích thước đoạn phim ban đầu" +msgstr "Xây dựng đại diện với độ phân giải bằng 50% kích thước của đoạn phim gốc" msgid "Build proxy resolution 75% of the original footage dimension" -msgstr "Xây độ phân giải đại lý 75% của kích thước đoạn phim ban đầu" +msgstr "Xây dựng đại diện với độ phân giải bằng 75% kích thước của đoạn phim gốc" msgid "Free Run" -msgstr "Chạy Tự Do" +msgstr "Vận Hành Tự Do" msgid "Build free run time code index" -msgstr "Xây lên chỉ số mã thời gian chạy tự do" +msgstr "Dựng chỉ số mã thời gian theo quá trình thu tự do" msgid "Free Run (Rec Date)" -msgstr "Chạy Tự Do (Ngày Tháng Thâu)" +msgstr "Vận Hành Tự Do (Ngày Tháng Thu)" msgid "Build free run time code index using Record Date/Time" -msgstr "Xây lên chỉ số mã thời gian chạy tự do bằng Ngày Tháng/Thời Gian Thâu" +msgstr "Dựng chỉ số mã thời gian theo quá trình thu tự do, song dùng Ngày Tháng/Thời Gian thu" msgid "Rec Run" -msgstr "Thâu Chạy" +msgstr "Quá Trình Thu" msgid "Build record run time code index" -msgstr "Xây lên chỉ số mã thời gian thâu" +msgstr "Dựng chỉ số mã thời gian theo quá trình thu" msgid "Build proxy resolution 100% of the original undistorted footage dimension" -msgstr "Xây lên độ phân giải đại lý 100% của kích thước đoạn phim ban đầu, không bị méo hóa" +msgstr "Xây dựng đại diện với độ phân giải bằng 100% kích thước nguyên thủy của đoạn phim gốc" msgid "Build proxy resolution 25% of the original undistorted footage dimension" -msgstr "Xây lên độ phân giải đại lý 25% của kích thước đoạn phim ban đầu, không bị méo hóa" +msgstr "Xây dựng đại diện với độ phân giải bằng 25% kích thước nguyên thủy của đoạn phim gốc" msgid "Build proxy resolution 50% of the original undistorted footage dimension" -msgstr "Xây lên độ phân giải đại lý 50% của kích thước đoạn phim ban đầu, không bị méo hóa" +msgstr "Dựng độ phân giải của đại diện bằng 50% kích thước nguyên thủy của đoạn phim gốc" msgid "Build proxy resolution 75% of the original undistorted footage dimension" -msgstr "Xây lên độ phân giải đại lý 75% của kích thước đoạn phim ban đầu, không bị méo hóa" +msgstr "Xây dựng đại diện với độ phân giải bằng 75% kích thước nguyên thủy của đoạn phim gốc" msgid "Location to store the proxy files" -msgstr "Vị trí cho chứa tập tin đại lý" +msgstr "Vị trí để lưu giữ các tập tin đại diện" msgid "JPEG quality of proxy images" -msgstr "Chất lượng JPEG của ảnh đại lý" +msgstr "Chất lượng JPEG của hình ảnh đại diện" msgid "Timecode" @@ -37861,35 +40776,35 @@ msgstr "Mã Thời Gian" msgid "Record Run" -msgstr "Thâu Chạy" +msgstr "Quá Trình Thu" msgid "Use images in the order they are recorded" -msgstr "Sử dụng ảnh theo thứ tự được thâu" +msgstr "Sử dụng hình ảnh theo thứ tự đã được thu" msgid "Use global timestamp written by recording device" -msgstr "Sử dụng mã thời gian toàn cầu được ghi bởi thiết bị thâu" +msgstr "Dùng mã thời gian toàn cầu được ghi bởi thiết bị thu" msgid "Free Run (rec date)" -msgstr "Chạy Tự Do (ngày tháng thâu)" +msgstr "Vận Hành Tự Do (ngày tháng thu)" msgid "Interpolate a global timestamp using the record date and time written by recording device" -msgstr "Suy nội một mã thời gian toàn cầu bằng ngày tháng thâu và thời gian được ghi bằng thiết bị thâu" +msgstr "Nội suy một mã thời gian toàn cầu dùng ngày tháng thu và thời gian được ghi lại bởi thiết bị thu" msgid "Free Run No Gaps" -msgstr "Chạy Tự Do Không Cách Trống" +msgstr "Vận Hành Tự Do Không Cách Trống" msgid "Record run, but ignore timecode, changes in framerate or dropouts" -msgstr "Thâu chạy, nhưng không quan tâm mã thời gian, đổi tốc độ bức ảnh và bức ảnh thiếu" +msgstr "Dùng quá trình thu, song không quan tâm đến mã thời gian, đến những thay đổi trong tần số khung hình hoặc đến các đoạn bỏ chừng (không lấy mẫu)" msgid "Scopes for statistical view of a movie clip" -msgstr "Kế cho hiển thị thống kê của một đoạn phim" +msgstr "Kế đo lường để xem thống kê của một đoạn phim" msgid "Movie Clip User" @@ -37897,83 +40812,91 @@ msgstr "Người Dùng Đoạn Phim" msgid "Parameters defining how a MovieClip data-block is used by another data-block" -msgstr "Tham số chỉ định làm sao một ĐoạnPhon được một cục dữ liệu khác sử dụng" +msgstr "Những tham số nhằm xác định một khối dữ liệu Đoạn Phim được sử dụng bởi một khối dữ liệu khác như thế nào" msgid "Current frame number in movie or image sequence" -msgstr "Số bức ảnh hiện tại trong phim hay trình tự ảnh" +msgstr "Số khung hình hiện tại trong phim hay trong trình tự hình ảnh" msgid "Proxy Render Size" -msgstr "Kích Cỡ Kết Xuất Đại Lý" +msgstr "Kích Thước Kết Xuất của bản Đại Diện" msgid "Display preview using full resolution or different proxy resolutions" -msgstr "Hiển thị dự khán dùng độ phân giải toàn phần hay độ phân giải đại lý khác" +msgstr "Hiển thị xem trước dùng độ phân giải toàn phần hoặc các độ phân giải đại diện khác" msgid "None, full render" -msgstr "Không sử dụng, kết xuất toàn phần" +msgstr "Không dùng, kết xuất toàn phần" msgid "Render Undistorted" -msgstr "Kết Xuất Không Bị Méo Hóa" +msgstr "Kết Xuất Không Biến Dạng" msgid "Render preview using undistorted proxy" -msgstr "Kết xuất dự khán sử dụng đại lỵ không bị méo hóa" +msgstr "Xem trước kết xuất dùng đại diện chưa bị biến dạng" msgid "Movie tracking reconstructed camera data" -msgstr "Dữ liệu máy quay phim xây lại theo dõi phim" +msgstr "Quá trình giám sát phim khôi phục dữ liệu máy quay" msgid "Match-moving reconstructed camera data from tracker" -msgstr "Dữ liệu chuyển động giống hệt máy quay phim được xây lại từ bộ theo dõi" +msgstr "Dữ liệu về chuyển động của máy quay phim được khôi phục từ bộ giám sát" msgid "Average error of reconstruction" -msgstr "Sai lầm trung bình của sự xây lại" +msgstr "Sai số trung bình của quá trình khôi phục" msgid "Frame number marker is keyframed on" -msgstr "Ký hiệu số bức ảnh được làm bức ảnh mẫu ở đâu" +msgstr "Chỉ số của khung hình nơi dấu mốc được khung khóa hóa" msgid "Movie tracking data" -msgstr "Dữ liệu theo dõi phim" +msgstr "Dữ liệu giám sát phim" msgid "Match-moving data for tracking" -msgstr "Dữ liệu chuyển động giống hệt cho theo dõi" +msgstr "Dữ liệu kiểm soát chuyển động để giám sát" msgid "Active Object Index" -msgstr "Chỉ Số Vật Thể Hoạt Động" +msgstr "Chỉ Số của Đối Tượng đang Hoạt Động" msgid "Index of active object" -msgstr "Chỉ số của vật thể hoạt động" +msgstr "Chỉ số của đối tượng đang hoạt động" msgid "Collection of objects in this tracking data object" -msgstr "Sưu tập vật thể trong vật thể dữ liệu theo dõi này" +msgstr "Bộ sưu tập các đối tượng trong đối tượng dữ liệu giám sát này" msgid "Plane Tracks" -msgstr "Đường Vết Mặt Phẳng" +msgstr "Giám Sát Bình Diện" + + +msgid "Collection of plane tracks in this tracking data object. Deprecated, use objects[name].plane_tracks" +msgstr "Bộ sưu tập các giám sát bình diện trong đối tượng dữ liệu giám sát này. Đã lỗi thời, xin hãy sử dụng objects[name].plane_tracks" msgid "Tracks" -msgstr "Đường Vết" +msgstr "Giám Sát" + + +msgid "Collection of tracks in this tracking data object. Deprecated, use objects[name].tracks" +msgstr "Bộ sưu tập các giám sát trong đối tượng dữ liệu giám sát này. Đã lỗi thời, xin hãy sử dụng objects[name].tracks" msgid "Movie tracking camera data" -msgstr "Dữ liệu máy quay phim theo dõi phim" +msgstr "Dữ liệu máy quay trong việc giám sát phim" msgid "Match-moving camera data for tracking" -msgstr "Dữ liệu chuyển động giống máy quay phim cho theo dõi" +msgstr "Dữ liệu kiểm soát chuyển động của máy quay để giám sát" msgid "K1" @@ -37981,7 +40904,7 @@ msgstr "K1" msgid "First coefficient of fourth order Brown-Conrady radial distortion" -msgstr "Hệ số thứ nhất của đa thức bậc bốn cho sự méo hóa bán kính tuyến Brown-Conrady" +msgstr "Hệ số thứ nhất của biến dạng tỏa tròn đa thức bậc bốn của Brown-Conrady" msgid "K2" @@ -37989,7 +40912,7 @@ msgstr "K2" msgid "Second coefficient of fourth order Brown-Conrady radial distortion" -msgstr "Hệ số thứ hai của đa thức bậc bốn cho sự méo hóa bán kính tuyến Brown-Conrady" +msgstr "Hệ số thứ hai của biến dạng tỏa tròn đa thức bậc bốn của Brown-Conrady" msgid "K3" @@ -37997,7 +40920,7 @@ msgstr "K3" msgid "Third coefficient of fourth order Brown-Conrady radial distortion" -msgstr "Hệ số thứ ba của đa thức bậc bốn cho sự méo hóa bán kính tuyến Brown-Conrady" +msgstr "Hệ số thứ ba của biến dạng tỏa tròn đa thức bậc bậc bốn của Brown-Conrady" msgid "K4" @@ -38005,7 +40928,7 @@ msgstr "K4" msgid "Fourth coefficient of fourth order Brown-Conrady radial distortion" -msgstr "Hệ số thứ bốn của đa thức bậc bốn cho sự méo hóa bán kính tuyến Brown-Conrady" +msgstr "Hệ số thứ tư của biến dạng tỏa tròn đa thức bậc bốn của Brown-Conrady" msgid "P1" @@ -38013,7 +40936,7 @@ msgstr "P1" msgid "First coefficient of second order Brown-Conrady tangential distortion" -msgstr "Hệ số thứ nhất của đa thức bậc hai cho sự méo hóa tiếp tuyến độ Brown-Conrady" +msgstr "Hệ số thứ nhất của biến dạng tiếp tuyến đa thức bậc hai của Brown-Conrady" msgid "P2" @@ -38021,15 +40944,15 @@ msgstr "P2" msgid "Second coefficient of second order Brown-Conrady tangential distortion" -msgstr "Hệ số thứ hai của đa thức bậc hai cho sự méo hóa tiếp tuyến độ Brown-Conrady" +msgstr "Hệ số thứ hai của biến dạng tiếp tuyến đa thức bậc hai của Brown-Conrady" msgid "Distortion Model" -msgstr "Mô Hình Méo Hóa" +msgstr "Mô Hình Biến Dạng" msgid "Distortion model used for camera lenses" -msgstr "Mô hình méo hóa được dùng cho thấu kính máy quay phim" +msgstr "Mô hình biến dạng dùng cho thấu kính máy quay phim" msgid "Polynomial" @@ -38037,15 +40960,15 @@ msgstr "Đa Thức" msgid "Radial distortion model which fits common cameras" -msgstr "Mô hình sự méo tỏa tròn vừa cho nhiều máy quay phim phổ biến" +msgstr "Mô hình quang sai biến dạng thích hợp với nhiều máy quay phim phổ biến" msgid "Divisions" -msgstr "Phần Chia" +msgstr "Phân Chia" msgid "Division distortion model which better represents wide-angle cameras" -msgstr "Mô hình méo hóa phần chia cho biển diễn tốt hơn cho máy quay phim góc rộng" +msgstr "Mô hình biến dạng phân chia đại diện tốt hơn cho các máy quay phim góc-rộng" msgid "Nuke" @@ -38053,71 +40976,75 @@ msgstr "Nuke" msgid "Nuke distortion model" -msgstr "Mô hình sự méo hóa của Nuke" +msgstr "Mô hình biến dạng Nuke" msgid "Brown" -msgstr "Brown" +msgstr "Màu Nâu" msgid "Brown-Conrady distortion model" -msgstr "Mô hình sự méo hóa Brown-Conrady" +msgstr "Mô Hình Biến Dạng của Brown-Conrady" msgid "First coefficient of second order division distortion" -msgstr "Hệ số thứ nhất của đa thức bậc hai cho mô hình sự méo hóa chia phần" +msgstr "Hệ số thứ nhất của đa thức bậc hai mô hình biến dạng phép phân chia" msgid "Second coefficient of second order division distortion" -msgstr "Hệ số thứ hai của đa thức bậc hai cho mô hình sự méo hóa chia phần" +msgstr "Hệ số thứ hai của đa thức bậc hai mô hình biến dạng phép phân chia" msgid "Camera's focal length" -msgstr "Cách tiêu điểm của máy quay phim" +msgstr "Tiêu cự thấu kính của máy quay phim" msgid "First coefficient of third order polynomial radial distortion" -msgstr "Hệ số thứ nhất của đa thức bậc ba cho mô hình sự méo hóa tỏa tròn" +msgstr "Hệ số thứ nhất của quang sai biến dạng đa thức bậc ba" msgid "Second coefficient of third order polynomial radial distortion" -msgstr "Hệ số thứ hai của đa thức bậc ba cho mô hình sự méo hóa tỏa tròn" +msgstr "Hệ số thứ hai của quang sai biến dạng đa thức bậc ba" msgid "Third coefficient of third order polynomial radial distortion" -msgstr "Hệ số thứ ba của đa thức bậc ba cho mô hình sự méo hóa tỏa tròn" +msgstr "Hệ số thứ ba của quang sai biến dạng đa thức bậc ba" msgid "First coefficient of second order Nuke distortion" -msgstr "Hệ số thứ nhất của đa thức bậc hai cho sự méo hóa của Nuke" +msgstr "Hệ số thứ nhất của sự biến dạng bậc hai trong Nuke" msgid "Second coefficient of second order Nuke distortion" -msgstr "Hệ số thứ hai của đa thức bậc hai cho sự méo hóa của Nuke" +msgstr "Hệ số thứ nhất của sự biến dạng bậc hai trong Nuke" msgid "Pixel Aspect Ratio" -msgstr "Tỉ Số Cạnh Điểm Ảnh" +msgstr "Tỷ Lệ Tương Quan của Điểm Ảnh" msgid "Pixel aspect ratio" -msgstr "Tỉ số cạnh điểm ảnh" +msgstr "Tỷ lệ cân xứng của điểm ảnh" msgid "Principal Point" -msgstr "Điểm Chánh" +msgstr "Điểm Chủ Yếu" msgid "Optical center of lens" msgstr "Quang tâm của thấu kính" +msgid "Optical center of lens in pixels" +msgstr "Quang tâm của thấu kính trong số điểm ảnh" + + msgid "Sensor" -msgstr "Cảm Biến" +msgstr "Bộ Cảm Biến" msgid "Width of CCD sensor in millimeters" -msgstr "Bề rộng cảm biến CCD (đơn vị mm)" +msgstr "Chiều rộng bộ cảm biến CCD trong mi-li-mét" msgid "Units" @@ -38125,15 +41052,15 @@ msgstr "Đơn Vị" msgid "Units used for camera focal length" -msgstr "Đơn vị cho cách tiêu điểm của máy quay phim" +msgstr "Đơn vị sử dụng cho tiêu cự của máy quay phim" msgid "px" -msgstr "điểm" +msgstr "điểm ảnh" msgid "Use pixels for units of focal length" -msgstr "Dùng điềm ảnh cho đơn vị cách tiêu điểm" +msgstr "Dùng điềm ảnh làm đơn vị cho tiêu cự" msgid "mm" @@ -38141,31 +41068,31 @@ msgstr "mm" msgid "Use millimeters for units of focal length" -msgstr "Dùng mili mét cho đơn vị cách tiêu điểm" +msgstr "Dùng milimét làm đơn vị cho tiêu cự" msgid "Movie Tracking Dopesheet" -msgstr "Bảng Hoạt Hình Theo Dõi Phim" +msgstr "Bảng Hành Động Giám Sát Phim" msgid "Match-moving dopesheet data" -msgstr "Dữ liệu bảng hoạt hình chuyển động giống" +msgstr "Dữ liệu bảng hành động kiểm soát chuyển động" msgid "Display Hidden" -msgstr "Hiển Thị Ẩn" +msgstr "Hiển Thị Ẩn Giấu" msgid "Dopesheet Sort Field" -msgstr "Trường Sắp Thứ Tự Bảng Hoạt Hình" +msgstr "Lĩnh Vực để Sắp Thứ Tự" msgid "Method to be used to sort channels in dopesheet view" -msgstr "Phương pháp cho sắp thứ tự kênh trong màn bảng hoạt hình" +msgstr "Phương pháp để sắp xếp thứ tự các kênh trong cửa sổ của bảng hành động" msgid "Sort channels by their names" -msgstr "Sắp thứ tự bằng tên kênh" +msgstr "Sắp thứ tự các kênh bằng tên" msgid "Longest" @@ -38173,323 +41100,332 @@ msgstr "Dài Nhất" msgid "Sort channels by longest tracked segment" -msgstr "Sắp thứ tự kênh bằng đoạn được theo dõi dài nhất" +msgstr "Sắp thứ tự kênh bằng đoạn giám sát dài nhất" msgid "Total" -msgstr "Tổng Cộng" +msgstr "Tổng Số" msgid "Sort channels by overall amount of tracked segments" -msgstr "Sắp thứ tự bằng tổng cộng số lượng khúc được theo dõi" +msgstr "Sắp thứ tự bằng tổng lượng các đoạn được giám sát" msgid "Sort channels by average reprojection error of tracks after solve" -msgstr "Sắp thứ tự bằng sai lầm trung bình phép chiếu của đường vết sau giải nghiệm" +msgstr "Sắp xếp các kênh theo thứ tự của sai số tái dự phóng trung bình ở hậu kỳ giải nghiệm giám sát" msgid "Sort channels by first frame number" -msgstr "Sắp xếp kênh bằng số bức ảnh đầu" +msgstr "Sắp xếp các kênh theo thứ tự số của khung hình đầu tiên" msgid "Sort channels by last frame number" -msgstr "Sắp xếp kênh bằng số bức ảnh cuối" +msgstr "Sắp xếp các kênh theo thứ tự số của khung hình cuối cùng" msgid "Invert Dopesheet Sort" -msgstr "Đảo Nghịch Sắp Thứ Tự Bảng Hoạt Hình" +msgstr "Đảo Nghịch Thứ Tự" msgid "Invert sort order of dopesheet channels" -msgstr "Đảo nghịch thứ tự của kênh bảng hoạt hình" +msgstr "Đảo nghịch thứ tự các kênh trong bảng hành động" msgid "Movie tracking marker data" -msgstr "Dữ liệu ký hiệu theo dõi phim" +msgstr "Dữ liệu dấu mốc giám sát phim" msgid "Match-moving marker data for tracking" -msgstr "Dữ liệu ký hiệu chuyển động giống để theo dõi" +msgstr "Dữ liệu về dấu mốc kiểm soát chuyển động trong giám sát" msgid "Marker position at frame in normalized coordinates" -msgstr "Vị trí ký hiệu tại bức ảnh bằng tọa độ đơn vị hóa" +msgstr "Vị trí dấu mốc trên khung hình trong tọa độ đã được bình thường hóa" msgid "Keyframed" -msgstr "Có Bức Ảnh Ảnh Mẫu" +msgstr "Khung Khóa Hóa" msgid "Whether the position of the marker is keyframed or tracked" -msgstr "Vị trí của ký hiệu được làm bức ảnh mẫu hay được theo dõi" +msgstr "Vị trí của dấu mốc có được khung khóa hóa hay được giám sát hay không" msgid "Is marker muted for current frame" -msgstr "Ký hiệu được cắt tiếng cho bức ảnh hiện tại" +msgstr "Có phải dấu mốc đã bị giải hoạt ở khung hình hiện tại hay không" msgid "Pattern Bounding Box" -msgstr "Hộp Bao Quanh Gương Mẫu" +msgstr "Khung Hộp Viền Mẫu" msgid "Pattern area bounding box in normalized coordinates" -msgstr "Hộp bao quanh khu vực gương mẫu bằng tọa độ đơn vị hóa" +msgstr "Khung hộp viền hình mẫu trong tọa độ đã được bình thường hóa" msgid "Pattern Corners" -msgstr "Góc Giác Gương Mẫu" +msgstr "Các Góc Mẫu" msgid "Array of coordinates which represents pattern's corners in normalized coordinates relative to marker position" -msgstr "Mảng tọa độ cho góc giác của gương mẫu bằng tọa độ đơn vị hóa tương đối với vị trí ký hiệu" +msgstr "Mảng các tọa độ đại diện cho các góc của kiểu mẫu trong hệ tọa độ đã được bình thường hóa tương đối với vị trí của dấu mốc" msgid "Search Max" -msgstr "Tìm Kiếm Cực Đại" +msgstr "Tìm Kiếm Tối Đa" msgid "Right-bottom corner of search area in normalized coordinates relative to marker position" -msgstr "Góc giác phải-trên của khu vực tìm kiếm bằng tọa độ đơn vị hóa tương đối với vị trí ký hiệu" +msgstr "Góc dưới bên phải của vùng tìm kiếm trong tọa độ đã bình thường hóa tương đối với vị trí của dấu mốc" msgid "Search Min" -msgstr "Tìm Kiếm Cực Tiểu" +msgstr "Tìm Kiếm Tối Thiểu" msgid "Left-bottom corner of search area in normalized coordinates relative to marker position" -msgstr "Góc giác trái-dưới của khu vực tìm kiếm bằng tọa độ đơn vị hóa tương đối với vị trí ký hiệu" +msgstr "Góc dưới bên trái của vùng tìm kiếm trong tọa độ đã bình thường hóa tương đối với vị trí của dấu mốc" msgid "Movie Tracking Markers" -msgstr "Ký Hiệu Theo Dõi Phim" +msgstr "Giám Sát Phim" msgid "Collection of markers for movie tracking track" -msgstr "Sưu tập ký hiệu của cái theo dõi để theo dõi phim" +msgstr "Bộ sưu tập các dấu mốc để giám sát phim" msgid "Movie tracking object data" -msgstr "Dữ liệu vật thể theo dõi phim" +msgstr "Dữ liệu đối tượng giám sát phim" msgid "Match-moving object tracking and reconstruction data" -msgstr "Theo dõi chuyển động giống vật thể và dữ liệu xăy lại" +msgstr "Dữ liệu tái dựng và giám sát chuyển động của đối tượng" msgid "Object is used for camera tracking" -msgstr "Vật thể được sử dụng để theo dõi máy quay phim" +msgstr "Đối tượng dùng để giám sát máy quay phim" msgid "Keyframe A" -msgstr "Bức Ảnh Mẫu A" +msgstr "Khung Khóa A" msgid "First keyframe used for reconstruction initialization" -msgstr "Bức ảnh đầu dùng cho khởi động xây dựng lại" +msgstr "Khung hình đầu dùng để khởi động sự khôi phục" msgid "Keyframe B" -msgstr "Bức Ảnh Mẫu B" +msgstr "Khung Khóa B" msgid "Second keyframe used for reconstruction initialization" -msgstr "Bức ảnh thứ hai dùng cho khởi động xây dựng lại" +msgstr "Khung khóa thứ hai dùng để khởi động sự khôi phục" msgid "Unique name of object" -msgstr "Tên độc đáo của vật thể" +msgstr "Tên duy nhất của đối tượng" msgid "Collection of plane tracks in this tracking data object" -msgstr "Sưu tập đường vết mặt phẳng trong vật thể dữ liệu theo dõi này" +msgstr "Bộ sưu tập các dấu giám sát bình diện trong đối tượng dữ liệu về giám sát này" msgid "Scale of object solution in camera space" -msgstr "Tỉ số phóng to của nghiệm trong không gian máy quay phim" +msgstr "Tỷ lệ của giải nghiệm đối tượng trong không gian máy quay phim" msgid "Collection of tracks in this tracking data object" -msgstr "Sưu tập đường vết trong vật thể dữ liệu theo dõi này" +msgstr "Bộ sưu tập các dấu giám sát trong đối tượng dữ liệu về giám sát này" msgid "Collection of tracking plane tracks" -msgstr "Sưu tập đường vết theo dõi mặt phẳng" +msgstr "Bộ sưu tập các giám sát bình diện" + + +msgctxt "MovieClip" +msgid "Active Track" +msgstr "Giám Sát đang Hoạt Động" msgid "Active track in this tracking data object" -msgstr "Đường vết hoạt động trong vật thể dữ liệu theo dõi này" +msgstr "Giám sát đang hoạt động trong đối tượng dữ liệu giám sát này" msgid "Movie Tracks" -msgstr "Đường Vết Phim" +msgstr "Các Giám Sát Phim" msgid "Collection of movie tracking tracks" -msgstr "Sưu tập đường vết theo dõi trong phim" +msgstr "Bộ sưu tập các dấu giám sát theo dõi phim" msgid "Movie Objects" -msgstr "Vật Thể Phim" +msgstr "Các Đối Tượng Phim" msgid "Collection of movie tracking objects" -msgstr "Sưu tập vật thể theo dõi trong phim" +msgstr "Bộ sưu tập các đối tượng giám sát theo dõi phim" msgid "Active object in this tracking data object" -msgstr "Vật thể hoạt động trong vật thể dữ liệu theo dõi này" +msgstr "Đối tượng đang hoạt động trong đối tượng dữ liệu giám sát này" msgid "Movie Tracking Plane Marker Data" -msgstr "Dữ Liệu Ký Hiệu Mặt Phẳng Theo Dõi Phim" +msgstr "Dữ Liệu về Dấu Mốc Giám Sát Bình Diện của Phim" msgid "Match-moving plane marker data for tracking" -msgstr "Dữ liệu chuyển động giống ký hiệu mặt phẳng để theo dõi" +msgstr "Dữ liệu dấu mốc theo dõi di chuyển của bình diện trong giám sát" msgid "Corners" -msgstr "Góc Giác" +msgstr "Góc" msgid "Array of coordinates which represents UI rectangle corners in frame normalized coordinates" -msgstr "Mảng tọa độ của góc giác của chữ nhật đại diện bằng tọa độ khung được đơn vị hóa" +msgstr "Mảng tọa độ trong chế độ tọa độ bình thường hóa của khung hình đại diện cho các góc của hình chữ nhật trong Giao Diện Người Dùng" msgid "Movie Tracking Plane Markers" -msgstr "Ký Hiệu Mặt Phẳng Theo Dõi Phim" +msgstr "Dấu Mốc Giám Sát Bình Diện của Phim" msgid "Collection of markers for movie tracking plane track" -msgstr "Sưu tập ký hiệu cho theo dõi đường vết mặt phẳng trong phim" +msgstr "Bộ sưu tập các dấu mốc để giám sát bình diện của phim" msgid "Movie tracking plane track data" -msgstr "Dữ liệu đường vết mặt phẳng để theo dõi phim" +msgstr "Dữ liệu giám sát bình diện trong phim" msgid "Match-moving plane track data for tracking" -msgstr "Dữ liệu đường vết mặt phẳng chuyển động giống để theo dõi" +msgstr "Dữ liệu theo dõi di chuyển của bình diện để giám sát" msgid "Image displayed in the track during editing in clip editor" -msgstr "Ảnh được hiển trong trong đường vết khi biên tập trong trình biên soạn đoạn phim" +msgstr "Hình ảnh được hiển thị trên nền dấu giám sát trong quá trình biên soạn đoạn phim" msgid "Image Opacity" -msgstr "Độ Đục Ảnh" +msgstr "Độ Đục của Hình Ảnh" msgid "Opacity of the image" -msgstr "Độ đục của ảnh" +msgstr "Độ đục của hình ảnh" msgid "Markers" -msgstr "Ký Hiệu" +msgstr "Các Dấu Mốc" msgid "Collection of markers in track" -msgstr "Sưu tập ký hiệu trong đường vết" +msgstr "Bộ sưu tập các dấu mốc trong giám sát" msgid "Unique name of track" -msgstr "Tên độc đấu của đường vết" +msgstr "Tên duy nhất của giám sát" msgid "Plane track is selected" -msgstr "Được chọn đường vết mặt phẳng " +msgstr "Giám sát bình diện đã được chọn" msgid "Auto Keyframe" -msgstr "Bức Ảnh Mẫu Tự Động" +msgstr "Tạo Khung Khóa Tự Động" msgid "Automatic keyframe insertion when moving plane corners" -msgstr "Tự động chèn bức ảnh mẫu khi di chuyển góc giác mặt phẳng" +msgstr "Tự động chèn thêm khung khóa khi di chuyển các góc của bình diện" msgid "Movie Plane Tracks" -msgstr "Đường Vết Mặt Phẳng Phim" +msgstr "Các Giám Sát Bình Diện trong Phim" msgid "Collection of movie tracking plane tracks" -msgstr "Sưu tập đường vết mặt phẳng theo dõi phim" +msgstr "Bộ sưu tập các giám sát bình diện trong phim" msgid "Active Plane Track" -msgstr "Đường vết Mặt Phẳng Hoạt Động" +msgstr "Giám Sát Bình Diện đang Hoạt Động" + + +msgid "Active plane track in this tracking data object. Deprecated, use objects[name].plane_tracks.active" +msgstr "Giám sát bình diện đang hoạt động trong đối tượng dữ liệu giám sát này. Đã lỗi thời, xin hãy sử dụng objects[name].plane_tracks.active" msgid "Reconstructed Cameras" -msgstr "Máy Quay Phim Được Xây Dựng Lại" +msgstr "Máy Quay Phim được Khôi Phục" msgid "Collection of solved cameras" -msgstr "Sưu tập máy quay phim được giải nghiệm" +msgstr "Bộ sưu tập các máy quay phim được giải nghiệm" msgid "Movie tracking reconstruction data" -msgstr "Dữ liệu xây lại theo dõi phim" +msgstr "Dữ liệu khôi phục của quá trình giám sát phim" msgid "Match-moving reconstruction data from tracker" -msgstr "Dữ liệu xây dựng lại chuyển động giống từ bộ theo dõi" +msgstr "Dữ liệu khôi phục của quá trình theo dõi chuyển động từ dấu giám sát" msgid "Reconstructed" -msgstr "Được Xây Dựng Lại" +msgstr "Khôi Phục" msgid "Is tracking data contains valid reconstruction information" -msgstr "Là dữ liệu theo dõi có thông tin xây dựng lại hợp lê" +msgstr "Dữ liệu giám sát có chứa các thông tin khôi phục hợp lệ hay không" msgid "Movie tracking settings" -msgstr "Cài đặt theo dõi phim" +msgstr "Sắp đặt cho quá trình giám sát phim" msgid "Match moving settings" -msgstr "Cài đặt chuyển động giống" +msgstr "Những sắp đặt về theo dõi chuyển động" msgid "Cleanup action to execute" -msgstr "Hành động làm sạch để thực hành" +msgstr "Hành động dọn dẹp để thi hành" msgid "Select unclean tracks" -msgstr "Chọn đường vết chưa sạch" +msgstr "Chọn lựa những giám sát không hoàn chỉnh" msgid "Delete Track" -msgstr "Xóa Đường Vết" +msgstr "Xóa Giám Sát" msgid "Delete unclean tracks" -msgstr "Xóa đường vết không sạch" +msgstr "Xóa những giám sát không hoàn chỉnh" msgid "Delete Segments" -msgstr "Xóa Khúc" +msgstr "Xóa các Phân Đoạn" msgid "Delete unclean segments of tracks" -msgstr "Xóa khúc của đường vết không sạch" +msgstr "Xóa các phân đoạn giám sát không hoàn chỉnh" msgid "Reprojection Error" -msgstr "Sai Lầm Phép Chiếu Lại" +msgstr "Sai Số Tái Phóng Chiếu" msgid "Effect on tracks which have a larger re-projection error" -msgstr "Hiệu ứng của đường vết có một sai lầm phép chiếu lại lớn hơn" +msgstr "Tác động đến những giám sát có sai số tái phóng chiếu lớn hơn" msgid "Tracked Frames" -msgstr "Bức Ảnh Được Theo Dõi" +msgstr "Khung Hình được Giám Sát" msgid "Effect on tracks which are tracked less than the specified amount of frames" -msgstr "Hiệu ứng đường vết được theo dõi ít hơn số lượng bức ảnh được xác định" +msgstr "Tác động đến những giám sát có số lượng khung hình truy lùng nhỏ hơn số lượng chỉ định" msgid "Correlation" @@ -38497,183 +41433,187 @@ msgstr "Tương Quan" msgid "Default minimum value of correlation between matched pattern and reference that is still treated as successful tracking" -msgstr "Giá trị tương quan cực tiểu mặc định giữa gương mẫu giống và tiêu chuẩn thì chấp nhận là theo dõi thành công" +msgstr "Giá trị tương quan tối thiểu mặc định giữa kiểu mẫu so sánh và nguồn đối chiếu, tức cái đang được coi là sự giám sát thành công (nếu giá trị hữu hiệu của giám sát thấp hơn cái này thì phần mềm sẽ ngừng quá trình giám sát)" msgid "Frames Limit" -msgstr "Giới Hạn Bức Ảnh" +msgstr "Số Khung Hình Giới Hạn" msgid "Every tracking cycle, this number of frames are tracked" -msgstr "Trong mỗi chu trình theo dõi, số lượng bức ảnh này được theo dõi" +msgstr "Đối với mỗi chu trình giám sát, số lượng khung hình này là số lượng sẽ được giám sát" msgid "Default distance from image boundary at which marker stops tracking" -msgstr "Khoảng cách mặc định từ ranh giới ảnh thì ký hiệu sẽ dừng theo dõi" +msgstr "Khoảng cách mặc định từ ranh giới hình ảnh mà dấu mốc ngừng giám sát" msgid "Motion Model" -msgstr "Mô Hình Chuyển Động" +msgstr "Mô hình chuyển động" msgid "Default motion model to use for tracking" -msgstr "Mô hình chuyển động mặc định để dùng để theo dõi" +msgstr "Mô hình chuyển động mặc định dùng để giám sát" msgid "Search for markers that are perspectively deformed (homography) between frames" -msgstr "Tìm kiếm ký hiệu được méo hóa kiểu chiếu phối (ánh xạ méo hóa) giữa bức ảnh" +msgstr "Tìm những dấu mốc bị biến dạng theo luật xa gần (ánh xạ đồng hình) giữa các khung hình" msgid "Affine" -msgstr "Phỏng Xạ" +msgstr "Afin" msgid "Search for markers that are affine-deformed (t, r, k, and skew) between frames" -msgstr "Tìm kiếm ký hiệu được méo họa kiểu phỏng xạ (t, r, k, và nghiêng) giữa bức ảnh" +msgstr "Tìm các dấu mốc do biến dạng affine tạo ra (t, r, k, và sự xiên lệch) giữa các khung hình" msgid "Search for markers that are translated, rotated, and scaled between frames" -msgstr "Tìm kiếm ký hiệu được dịch, xoay, và phóng to giữa bức ảnh" +msgstr "Lùng tìm những dấu mốc bị dịch chuyển, xoay chiều, và đổi tỷ lệ giữa các khung hình" msgid "Search for markers that are translated and scaled between frames" -msgstr "Tìm kiếm ký hiệu được dịch và phóng to giữa bức ảnh" +msgstr "Lùng tìm những dấu mốc bị dịch chuyển và đổi tỷ lệ giữa các khung hình" msgid "Search for markers that are translated and rotated between frames" -msgstr "Tìm kiếm ký hiệu được dịch và xoay giữa bức ảnh" +msgstr "Lùng tìm những dấu mốc bị dịch chuyển và xoay chiều giữa các khung hình" msgid "Search for markers that are translated between frames" -msgstr "Tìm kiếm ký hiệu được dịch giữa bức ảnh" +msgstr "Lùng tìm những dấu mốc bị dịch chuyển giữa các khung hình" msgid "Pattern Match" -msgstr "Giống Gương Mẫu" +msgstr "So Khớp Mẫu" msgid "Track pattern from given frame when tracking marker to next frame" -msgstr "Theo dõi gương mẫu từ bức ảnh được xác định khi theo dõi ký hiệu đến bức ảnh tiếp" +msgstr "Mẫu giám sát từ khung hình đã cho, khi theo dõi dấu mốc tới khung hình tiếp theo" msgid "Track pattern from keyframe to next frame" -msgstr "Theo dõi gương mẫu từ bức ảnh đến bức ảnh tiếp" +msgstr "Mẫu giám sát từ khung khóa tới khung hình tiếp theo" msgid "Previous frame" -msgstr "Bức Ảnh Trước" +msgstr "Khung hình trước" msgid "Track pattern from current frame to next frame" -msgstr "Theo dõi gương mẫu từ bức ảnh hiện tại đến bức ảnh tiếp" +msgstr "Giám sát kiểu mẫu từ khung hình hiện tại đến khung hình tiếp theo" msgid "Pattern Size" -msgstr "Kích Cỡ Trang Hoàng" +msgstr "Kích Thước Kiểu Mẫu" msgid "Size of pattern area for newly created tracks" -msgstr "Kích cỡ" +msgstr "Kích thước diện tích của kiểu mẫu cho những giám sát mới kiến tạo" msgid "Search Size" -msgstr "Kích Cỡ Tìm Kiếm" +msgstr "Kích Thước Lùng Tìm" msgid "Size of search area for newly created tracks" -msgstr "Kích cỡ của vùng tìm kiếm cho cái theo dõi mới tạo" +msgstr "Kích thước của diện tích tìm kiếm cho những giám sát mới kiến tạo" msgid "Influence of newly created track on a final solution" -msgstr "Sự ảnh hưởng của cái theo dõi mới với một nghiệm cuối cùng" +msgstr "Tác động của dấu giám sát mới kiến tạo vào giải nghiệm cuối cùng" msgid "Distance between two bundles used for scene scaling" -msgstr "Khoảng cách giữa hai gói được dùng cho phóng to cảnh" +msgstr "Khoảng cách giữa hai nhóm điểm, sử dụng để đổi tỷ lệ cảnh" msgid "Distance between two bundles used for object scaling" -msgstr "Khoảng cách giữa hai gói được dùng cho phóng to vật thể" +msgstr "Khoảng cách giữa hai nhóm điểm, sử dụng để đổi tỷ lệ của đối tượng" msgid "Refine Focal Length" -msgstr "Chỉnh Lại Quãng Tiêu Điểm" +msgstr "Tinh Chỉnh Tiêu Cự" msgid "Refine focal length during camera solving" -msgstr "Chỉnh lại quãng tiêu điểm khi đang giải nghiệm máy quay phim" +msgstr "Tinh chỉnh tiêu cự ống kính trong quá trình giải nghiệm máy quay phim" msgid "Refine Principal Point" -msgstr "Chìng Lại Điểm Chánh" +msgstr "Tinh Chỉnh Chủ Điểm" msgid "Refine principal point during camera solving" -msgstr "Chỉnh lại điểm chánh khi đang giải nghiệm máy quay phim" +msgstr "Tinh chỉnh chủ điểm trong quá trình giải nghiệm máy quay phim" msgid "Refine Radial" -msgstr "Chỉnh Lại Tỏa Tròn" +msgstr "Tinh Chỉnh Độ Tỏa Tròn" msgid "Refine radial coefficients of distortion model during camera solving" -msgstr "Chỉnh lại hệ số tỏa tròn của mô hình méo hóa khi đang giải nghiệm máy quay phim" +msgstr "Tinh chỉnh hệ số tỏa tròn của mô hình biến dạng trong quá trình giải nghiệm máy quay phim" msgid "Refine Tangential" -msgstr "Chỉnh Lại Tiếp Tuyến" +msgstr "Tinh Chỉnh Tiếp Tuyến" msgid "Refine tangential coefficients of distortion model during camera solving" -msgstr "Chỉnh lại hệ số tiếp tuyến của mô hình méo hóa khi đang giải nghiệm máy quay phim" +msgstr "Tinh chỉnh hệ số tiếp tuyến của mô hình biến dạng trong quá trình giải nghiệm máy quay phim" msgid "Limit speed of tracking to make visual feedback easier (this does not affect the tracking quality)" -msgstr "Hạn chế tốc độ theo dõi cho làm hoàn ngược thị giác đễ hơn (này không ảnh hưởng chất lượng đuổi theo)" +msgstr "Hạn chế tốc độ giám sát để thấy được tác động dễ dàng hơn (điều này không ảnh hưởng đến chất lượng giám sát)" msgid "Fastest" -msgstr "Lẹ Nhất" +msgstr "Nhanh Nhất" + + +msgid "Track as fast as possible" +msgstr "Giám sát với tốc độ nhanh nhất có thể" msgid "Double" -msgstr "Đôi" +msgstr "Gấp/Đôi/Double" msgid "Track with double speed" -msgstr "Theo dõi tốc độ cấp đôi" +msgstr "Giám sát với tốc độ nhanh gấp đôi" msgid "Track with realtime speed" -msgstr "Theo dõi tốc độ thời gian thực" +msgstr "Giám sát với tốc độ thời gian thực" msgid "Track with half of realtime speed" -msgstr "Theo dõi bằng tốc độ nửa thời gian thực" +msgstr "Giám sát với tốc độ bằng một nửa thời gian thực" msgid "Quarter" -msgstr "Phần Tư" +msgstr "Một Phần Tư" msgid "Track with quarter of realtime speed" -msgstr "Theo dõi bằng tốc độ một phần tư thời gian thực" +msgstr "Giám sát bằng tốc độ một phần tư thời gian thực" msgid "Use Blue Channel" -msgstr "Dùng Kênh Xanh" +msgstr "Dùng Kênh Màu Lam" msgid "Use blue channel from footage for tracking" -msgstr "Dùng kênh màu xanh từ đoạn phim cho theo dõi" +msgstr "Dùng kênh màu lam của đoạn phim để giám sát" msgid "Prepass" -msgstr "Vòng Trước" +msgstr "Tiền Xử Lý" msgid "Use a brute-force translation-only initialization when tracking" -msgstr "Dùng một khởi động chỉ dịch kiểu vét cạn khi theo dõi" +msgstr "Sử dụng sự khởi thủy cưỡng chế (vét cạn), chỉ quan tâm đến dịch chuyển, trong quá trình giám sát" msgid "Use Green Channel" @@ -38681,19 +41621,19 @@ msgstr "Dùng Kênh Lục" msgid "Use green channel from footage for tracking" -msgstr "Dùng kênh màu lục từ đoạn phim cho theo dỏi" +msgstr "Dùng kênh màu lục từ đoạn phim để giám sát" msgid "Use a grease pencil data-block as a mask to use only specified areas of pattern when tracking" -msgstr "Dùng một cục dữ liệu bút sáp làm mặt nạ cho dùng chỉ khu vực gương mẫu được xác định khi theo dõi" +msgstr "Dùng khối dữ liệu Bút Chì Dầu như một màn chắn lọc để chỉ sử dụng những vùng nhất định của kiểu mẫu khi giám sát" msgid "Normalize" -msgstr "Đơn Vị Hóa" +msgstr "Bình Thường Hóa" msgid "Normalize light intensities while tracking (slower)" -msgstr "Đơn vị hóa cường độ ánh sáng khi theo dõi (chậm hơn)" +msgstr "Bình thường hóa cường độ ánh sáng trong khi giám sát (chậm hơn)" msgid "Use Red Channel" @@ -38701,131 +41641,131 @@ msgstr "Dùng Kênh Đỏ" msgid "Use red channel from footage for tracking" -msgstr "Dùng kênh màu đỏ từ đoạn phim cho theo dõi" +msgstr "Dùng kênh màu đỏ từ đoạn phim để giám sát" msgid "Keyframe Selection" -msgstr "Chọn Bức Ảnh Mẫu" +msgstr "Chọn Khung Khóa" msgid "Automatically select keyframes when solving camera/object motion" -msgstr "Tự động chọn bức ảnh mẫu khi giải nghiệm chuyển động máy quay phim/vật thể" +msgstr "Tự động chọn các khung khóa khi giải nghiệm chuyển động của máy quay phim/đối tượng" msgid "Tripod Motion" -msgstr "Chuyển Động Giá Ba Chân" +msgstr "Chuyển Động của Chân Máy Quay" msgid "Use special solver to track a stable camera position, such as a tripod" -msgstr "Dùng trình giải nghiệm đặc biệt cho đuổi theo vị trí một máy quay phim ổn định, như giá ba chân" +msgstr "Dùng bộ giải nghiệm đặc biệt để giám sát vị trí máy quay ổn định, như nằm trên một chân đế vậy" msgid "Movie tracking stabilization data" -msgstr "Dữ liệu ổn định hóa cho theo dõi phim" +msgstr "Dữ liệu chống rung trong quá trình giám sát phim" msgid "2D stabilization based on tracking markers" -msgstr "Ổn định hóa 2D cơ sở ký hiệu đuổi theo" +msgstr "Chống rung 2D dùng các dấu giám sát" msgid "Active Rotation Track Index" -msgstr "Chỉ Số Đường Vết Xoay Hoạt Động" +msgstr "Chỉ Số Giám Sát Xoay Chiều đang Hoạt Động" msgid "Index of active track in rotation stabilization tracks list" -msgstr "Chỉ số của đươông vết hoạt động trong danh sách đường vết ổn định hóa xoay" +msgstr "Chỉ số của giám sát đang hoạt động trong danh sách các dấu mốc giám sát chống rung xoay chiều" msgid "Active Track Index" -msgstr "Chỉ Số Rãnh Hoạt Động" +msgstr "Chỉ Số Giám Sát đang Hoạt Động" msgid "Index of active track in translation stabilization tracks list" -msgstr "Chỉ số của đường vết hoạt động trong danh sách đuổi theo ổn định hóa địch" +msgstr "Chỉ số của giám sát đang hoạt động trong danh sách các dấu mốc giám sát chống rung dịch chuyển" msgid "Anchor Frame" -msgstr "Neo Bức Ảnh" +msgstr "Khung Hình Tham Chiếu" msgid "Reference point to anchor stabilization (other frames will be adjusted relative to this frame's position)" -msgstr "Điểm tham chiếu để ổn định hóa neo (các bức ảnh khác sẽ bị chỉnh tương đối với vị trí bức ảnh này)" +msgstr "Điểm tham chiếu để neo chốt vào trong quá trình chống rung (các khung hình khác sẽ được điều chỉnh tương đối với vị trí của khung hình này)" msgid "Interpolate" -msgstr "Suy Nội" +msgstr "Nội Suy" msgid "Interpolation to use for sub-pixel shifts and rotations due to stabilization" -msgstr "Dùng phương pháp suy nội nào cho dịch và xoay hạ điểm ảnh bởi việc ổn định hóa" +msgstr "Nội suy để sử dụng đối với sự xê dịch của điểm ảnh phụ (sub-pixel) và những sự xoay chiều do chống rung" msgid "No interpolation, use nearest neighbor pixel" -msgstr "Không suy nội, dùng điểm ảnh gần nhất" +msgstr "Không nội suy, dùng điểm ảnh lân cận gần nhất" msgid "Bilinear" -msgstr "Nhị Bậc Một" +msgstr "Song Tuyến Tính" msgid "Simple interpolation between adjacent pixels" -msgstr "Suy nội đơn giản giữa điểm ảnh kề nhau" +msgstr "Nội suy đơn giản giữa các điểm ảnh kề cận" msgid "Bicubic" -msgstr "Nhị Lập Phương" +msgstr "Song Lập Phương" msgid "High quality pixel interpolation" -msgstr "Suy nội chất lượng cao" +msgstr "Nội suy điểm ảnh chất lượng cao" msgid "Location Influence" -msgstr "Sự Ảnh Hưởng Vị Trí" +msgstr "Ảnh Hưởng Vị Trí" msgid "Influence of stabilization algorithm on footage location" -msgstr "Sự ảnh hưởng của giải thuật ổn định hóa với vị trí đoạn phim" +msgstr "Sự ảnh hưởng của thuật toán chống rung đối với vị trí của đoạn phim" msgid "Rotation Influence" -msgstr "Sự Ảnh Hưởng Xoay" +msgstr "Ảnh Hưởng sự Xoay Chiều" msgid "Influence of stabilization algorithm on footage rotation" -msgstr "Sự ảnh hường của giải thuật ổn định hóa với xoay đoạn phim" +msgstr "Sự ảnh hưởng của thuật toán chống rung đối với sự xoay chiều của đoạn phim" msgid "Scale Influence" -msgstr "Sự Ảnh Hưởng Phóng To" +msgstr "Ảnh Hưởng Tỷ Lệ" msgid "Influence of stabilization algorithm on footage scale" -msgstr "Sự ảnh hường của giải thuật ổn định hóa với phóng to đoạn phim" +msgstr "Sự ảnh hưởng của thuật toán chống rung đối với tỷ lệ của đoạn phim" msgid "Rotation Tracks" -msgstr "Đường Vết Xoay" +msgstr "Các Giám Sát Xoay Chiều" msgid "Collection of tracks used for 2D stabilization (translation)" -msgstr "Sưu tập đường vết rãnh dùng cho ổn định hóa 2D (địch)" +msgstr "Bộ sưu tập các dấu giám sát sử dụng cho quá trình chống rung 2D (dịch chuyển)" msgid "Maximal Scale" -msgstr "Phóng To Cực Đại" +msgstr "Tỷ Lệ Tối Đa" msgid "Limit the amount of automatic scaling" -msgstr "Hạn chế lại mức tự động phóng to" +msgstr "Hạn chế lượng đổi tỷ lệ tự động" msgid "Show Tracks" -msgstr "Hiện Đường Vết" +msgstr "Hiển Thị các Giám Sát" msgid "Show UI list of tracks participating in stabilization" -msgstr "Hiện danh sách gaio diện của đường vết đang tham gia trong qúa trình ổn định hóa" +msgstr "Hiển thị danh sách Giao Diện Người Dùng các giám sát đang tham gia trong quá trình chống rung" msgid "Expected Position" @@ -38833,151 +41773,151 @@ msgstr "Vị Trí Dự Kiến" msgid "Known relative offset of original shot, will be subtracted (e.g. for panning shot, can be animated)" -msgstr "Trừ dịch tương đối thì biết rồi (ví dụ cho dời phim quay, có thể làm hoạt hình được) " +msgstr "Dịch chuyển tương đối biết trước của cú máy gốc, sẽ bị trừ đi (ví dụ: đối với cú máy lia, có thể hoạt họa được)" msgid "Expected Rotation" -msgstr "Xoay Dự Kiến" +msgstr "Xoay Chiều Dự Kiến" msgid "Rotation present on original shot, will be compensated (e.g. for deliberate tilting)" -msgstr "Xoay trong phim đã quay, sẽ chỉnh lại cho nó (ví dụ cho khi cố ý ngiêng)" +msgstr "Sự xoay chiều vốn tồn tại trong cú máy gốc, sẽ được đền bù (ví dụ: đối với những cú quay xoay theo phương thẳng đứng cố ý)" msgid "Expected Scale" -msgstr "Phóng To Dự Kiến" +msgstr "Tỷ Lệ Dự Kiến" msgid "Explicitly scale resulting frame to compensate zoom of original shot" -msgstr "Trực tiếp phóng to bức ảnh kết ảnh cho chỉnh phóng to của phim đã quay" +msgstr "Cố tình đổi tỷ lệ khung hình kết quả để bù trừ cho việc thu-phóng trên cú máy gốc" msgid "Translation Tracks" -msgstr "Rãnh Dịch" +msgstr "Các Giám Sát Dịch Chuyển" msgid "Use 2D Stabilization" -msgstr "Dùng Ổn Định Hóa 2D" +msgstr "Dùng phép chống rung 2D" msgid "Use 2D stabilization for footage" -msgstr "Dùng ổn định hóa 2D cho đoạn phim" +msgstr "Dùng phép chống rung 2D cho đoạn phim" msgid "Autoscale" -msgstr "Tự Phóng To" +msgstr "Tự Động Đổi Tỷ Lệ" msgid "Automatically scale footage to cover unfilled areas when stabilizing" -msgstr "Tự động phóng to đoạn phim cho che lại vùng không đầy khi ổn định hóa" +msgstr "Tự động đổi tỷ lệ đoạn phim để tô kín những vùng trống khi chống rung" msgid "Stabilize Rotation" -msgstr "Đôn Định Hoá Xoay" +msgstr "Ổn Định Hóa Xoay Chiều" msgid "Stabilize detected rotation around center of frame" -msgstr "Ổn định hóa xoay được phát hiện xúng quanh trung tâm của bức ảnh" +msgstr "Ổn định hóa sự xoay chiều phát hiện được quanh tâm của khung hình" msgid "Stabilize Scale" -msgstr "Ổn Định Hóa Phóng To" +msgstr "Ổn Định Hóa Tỷ Lệ" msgid "Compensate any scale changes relative to center of rotation" -msgstr "Chỉnh sự thay đổi phóng to tương đối với trung tâm xoay" +msgstr "Bù trừ bất cứ sự thay đổi tỷ lệ tương đối với tâm xoay nào" msgid "Movie tracking track data" -msgstr "Dữ liệu tđường vết cho theo dõi phim" +msgstr "Dữ liệu về giám sát theo dõi phim" msgid "Match-moving track data for tracking" -msgstr "Dữ liệu chuyển động giống cho đuổi theo" +msgstr "Dữ liệu theo dõi chuyển động cho quá trình giám sát" msgid "Average error of re-projection" -msgstr "Sai lầm trung bình của phép chiếu lại" +msgstr "Sai số trung bình của quá trình tái phóng chiếu" msgid "Bundle" -msgstr "Gói" +msgstr "Bộ Điểm" msgid "Position of bundle reconstructed from this track" -msgstr "Vị trí của gói được xây đựng lại từ đường vết này" +msgstr "Vị trí của bộ điểm được khôi phục từ giám sát này" msgid "Color of the track in the Movie Clip Editor and the 3D viewport after a solve" -msgstr "Màu của đường vết trong Trình Biên Soạn Đoạn Phim và màn chiếu 3D sau giải nghiệm" +msgstr "Màu của giám sát trong Trình Biên Soạn Đoạn Phim và cổng nhìn 3D sau một giải nghiệm" msgid "Minimal value of correlation between matched pattern and reference that is still treated as successful tracking" -msgstr "Giá trị tương quan cực tiểu giữa gương mẫu giống và tiêu chuẩn được chấp nhận là theo đõi thành công" +msgstr "Giá trị tương quan tối thiểu giữa kiểu mẫu so sánh và nguồn tham chiếu mà vẫn được coi là giám sát thành công" msgid "Grease pencil data for this track" -msgstr "Dữ liệu bút sáp cho đường vết này" +msgstr "Dữ liệu Bút Chì Dầu dành cho dấu giám sát này" msgid "Has Bundle" -msgstr "Có Gói" +msgstr "Có Bộ Điểm" msgid "True if track has a valid bundle" -msgstr "Đúng nếu đường vết có gói hợp lệ" +msgstr "Giá trị 'Đúng' nếu dấu giám sát có một bộ điểm hợp lệ" msgid "Track is hidden" -msgstr "Đường vệt được ẩn" +msgstr "Giám sát bị ẩn giấu" msgid "Track is locked and all changes to it are disabled" -msgstr "Đường vết bị khóa và hết sự thay đổi được bị tắt" +msgstr "Giám sát bị khóa lại và toàn bộ các thay đổi đến nó đều bị vô hiệu hóa" msgid "Distance from image boundary at which marker stops tracking" -msgstr "Khoảng cách từ ranh giới ảnh thì ký hiểu sẽ dừng theo dõi" +msgstr "Khoảng cách từ ranh giới hình ảnh nơi dấu mốc ngừng giám sát" msgid "Offset of track from the parenting point" -msgstr "Dịch của đường vết từ điểm phụ huynh" +msgstr "Dịch chuyển của giám sát từ điểm phụ huynh hóa" msgid "Track is selected" -msgstr "Đường vết được chọn" +msgstr "Giám sát đã được chọn" msgid "Select Anchor" -msgstr "Chọn Neo" +msgstr "Chọn Mấu Neo Chốt" msgid "Track's anchor point is selected" -msgstr "Được chọn điểm neo của đường vết" +msgstr "Điểm neo chốt của giám sát được chọn" msgid "Select Pattern" -msgstr "Chọn Gương Mẫu" +msgstr "Chọn Kiểu Mẫu" msgid "Track's pattern area is selected" -msgstr "Được chọn vùng trang hoàng của đuổi theo" +msgstr "Vùng kiểu mẫu của giám sát được chọn" msgid "Select Search" -msgstr "Chọn Tìm Kiếm" +msgstr "Chọn Vùng Tìm Kiếm" msgid "Track's search area is selected" -msgstr "Được chọn khu vực tìm kiếm của đường vết" +msgstr "Vùng tìm kiếm của giám sát được chọn" msgid "Apply track's mask on displaying preview" -msgstr "Áp dụng mặt nạ của đường vết khi hiển thị dự khán" +msgstr "Áp dụng màn chắn lọc của giám sát khi hiển thị xem trước" msgid "Use a brute-force translation only pre-track before refinement" -msgstr "Dùng một khởi động dịch kiểu vén cạn chỉ trước chỉnh sửa đường vết" +msgstr "Chỉ sử dụng sự phiên dịch theo kiểu vét cạn trong tiền xử lý giám sát, trước khi tinh chỉnh" msgid "Custom Color" @@ -38985,159 +41925,179 @@ msgstr "Màu Tùy Chọn" msgid "Use custom color instead of theme-defined" -msgstr "Dùng màu tùy chọn thay thế được xác định từ tập phong cách màu" +msgstr "Dùng màu tùy chọn thay vì màu chỉ định trong Bộ Màu Kiểu Mẫu" msgid "Display what the tracking algorithm sees in the preview" -msgstr "Hiển thị cái gì giải thuật theo dõi được nhìn thấy trong dự khán" +msgstr "Hiển thị những gì mà thuật toán giám sát thấy được trong xem trước" msgid "Normalize light intensities while tracking. Slower" -msgstr "Đơn vị hóa cường độ ánh sáng khi theo dõi (chậm hơn)" +msgstr "Bình thường hóa cường độ ánh sáng trong khi giám sát. Chậm hơn" msgid "Influence of this track on a final solution" -msgstr "Sự ảnh hưởng của theo dỏi này với nhiệm cuối cùng" +msgstr "Ảnh hưởng của giám sát này vào giải nghiệm cuối cùng" msgid "Stab Weight" -msgstr "Quyền Lượng Khối" +msgstr "Trọng Lượng Chống Rung" msgid "Influence of this track on 2D stabilization" -msgstr "Sự ảnh hưởng của đường vết này khi ổn định hóa 2D" +msgstr "Ảnh hưởng của dấu giám sát này trong quá trình chống rung 2D" + + +msgid "Active track in this tracking data object. Deprecated, use objects[name].tracks.active" +msgstr "Giám sát bình diện đang hoạt động trong đối tượng dữ liệu giám sát này. Đã lỗi thời, xin hãy sử dụng objects[name].tracks.active" msgid "NLA Strip" -msgstr "Dãy NLA" +msgstr "Dải NLA" msgid "A container referencing an existing Action" -msgstr "Một vật đựng đang tham chiếu một Hành Động đang tồn tại" +msgstr "Một vỏ chứa tham chiếu một Hành Động tồn tại" msgid "Action referenced by this strip" -msgstr "Hành Động đoạn này đang tham chiếu" +msgstr "Hành động mà dải này tham chiếu" msgid "Action End Frame" -msgstr "Hành Động Bức Ảnh Cuối" +msgstr "Khung Hình Cuối của Hành Động" msgid "Last frame from action to use" -msgstr "Số bức ảnh cuối từ hành động để sử dụng" +msgstr "Khung hình cuối của hành động để sử dụng" msgid "Action Start Frame" -msgstr "Hành Động Bức Ảnh Đầu" +msgstr "Khung Hình Đầu của Hành Động" msgid "First frame from action to use" -msgstr "Số bức ảnh đầu từ hành động để dùng" +msgstr "Khung hình đầu của hành động để sử dụng" msgid "NLA Strip is active" -msgstr "Dãy NLA đang hoạt động" +msgstr "Dải NLA đang hoạt động" msgid "Number of frames at start of strip to fade in influence" -msgstr "Số lượng bức ảnh tại đầu của đoạn cho phai vào sự ảnh hưởng" +msgstr "Số khung hình ở đầu dải phim để làm rõ dần ảnh hưởng" msgid "Blending" -msgstr "Pha" +msgstr "Pha Trộn" msgid "Method used for combining strip's result with accumulated result" -msgstr "Phương pháp cho gồm kết qủa của đoạn với kết qủa tích trữ" +msgstr "Phương pháp để kết hợp kết quả của dải phim với những kết quả đã tích tụ" msgid "Action to take for gaps past the strip extents" -msgstr "Thực hành hành động nào cho cách trống sau ranh giới đoạn" +msgstr "Hành động sẽ sử dụng cho những đoạn trống bên ngoài ranh giới của dải phim" msgid "F-Curves for controlling the strip's influence and timing" -msgstr "Cong-F cho điều khiển sự ảnh hưởng và thời tự của đoạn" +msgstr "Đường Cong-F để điều khiển ảnh hưởng và thời gian của dải phim" + + +msgid "End Frame (raw value)" +msgstr "Khung Hình Cuối (giá trị thô)" + + +msgid "Same as frame_end, except that any value can be set, including ones that create an invalid state" +msgstr "Tương tự như frame_end (khung hình cuối), song bất kỳ giá trị nào cũng có thể đặt được, bao gồm cả những giá trị tạo ra một trạng thái bất hợp lệ nữa" msgid "End Frame (manipulated from UI)" -msgstr "Bức Ảnh Cuối (thao tác từ giao diện)" +msgstr "Khung Hình Cuối (thao tác từ giao diện người dùng)" msgid "End frame of the NLA strip. Note: changing this value also updates the value of the strip's repeats or its action's end frame. If only the end frame should be changed, see the \"frame_end\" property instead" -msgstr "Bức ảnh cuối của đoạn NLA. Lưu ý: đổi giá trị này sẽ nâng cấp giá trị của lặp lại và bức ảnh cuối của đoạn. Nếu chỉ muốn đổi bức ảnh cuối, xem đặc tính \"bứcẢnh_cuối\" thay thế" +msgstr "Khung cuối của dải NLA. Lưu ý: việc thay đổi giá trị này cũng đồng thời cập nhật giá trị của số lần lặp lại của dải hoặc khung kết thúc của hành động. Nếu chỉ thay đổi khung kết thúc mà thôi thì xin hãy xem thuộc tính \"frame_end\" (khung hình cuối) nhé" + + +msgid "Start Frame (raw value)" +msgstr "Khung Hình Khởi Đầu (giá trị thô)" + + +msgid "Same as frame_start, except that any value can be set, including ones that create an invalid state" +msgstr "Tương tự như frame_start (khung hình đầu), song có thể đặt bất kỳ giá trị nào, bao gồm cả những giá trị tạo ra một trạng thái bất hợp lệ nữa" msgid "Start Frame (manipulated from UI)" -msgstr "Bức Ảnh Đầu (thao túng từ giao diện)" +msgstr "Khung Hình Đầu (thao tác từ giao diện người dùng)" msgid "Start frame of the NLA strip. Note: changing this value also updates the value of the strip's end frame. If only the start frame should be changed, see the \"frame_start\" property instead" -msgstr "Bức ảnh đầu của đoạn NLA. Lưu ý: đổi giá trị này sẽ nâng cấp giá trị của bức ảnh cuối của đoạn. Nếu chỉ muốn đổi bức ảnh đầu, xem đặc tính \"bứcẢnh_đầu\" thay thế" +msgstr "Khung hình bắt đầu của dải NLA. Lưu ý: việc thay đổi giá trị này cũng đồng thời cập nhật giá trị của khung hình kết thúc của dải nữa. Nếu chỉ thay đổi khung bắt đầu thì hãy xem tính chất \"frame_start\" (khung hình bắt đầu) nhé" msgid "Amount the strip contributes to the current result" -msgstr "Mức đoạn góp phần cho kết qủa hiện tại" +msgstr "Lượng đóng góp của dải phim vào kết quả hiện tại" msgid "Modifiers affecting all the F-Curves in the referenced Action" -msgstr "Các bộ điều chỉnh được ảnh hưởng hết Cong-F trong Hành Động được tham chiếu" +msgstr "Bộ điều chỉnh tác động toàn bộ các Đường Cong-F trong Hành Động tham chiếu" msgid "Disable NLA Strip evaluation" -msgstr "Tắt tính toán Đoạn NLA" +msgstr "Tắt sựu tính toán Dải NLA" msgid "Number of times to repeat the action range" -msgstr "Số lần lặp lại phạm vi hành động" +msgstr "Số lần nhắc lại phạm vi hành động" msgid "Scaling factor for action" -msgstr "Hệ số phóng to cho hành động" +msgstr "Hệ số tỷ lệ cho hành động" msgid "NLA Strip is selected" -msgstr "Đã chọn Đoạn NLA" +msgstr "Dải NLA đã được chọn" msgid "Strip Time" -msgstr "Thời Gian Đoạn" +msgstr "Thời Gian của Dải Phim" msgid "Frame of referenced Action to evaluate" -msgstr "Số bức ảnh của Hành Động được tham chiếu để tính toán" +msgstr "Khung hình của Hành Động tham chiếu để ước tính" msgid "NLA Strips" -msgstr "Đoạn NLA" +msgstr "Dải NLA" msgid "NLA Strips that this strip acts as a container for (if it is of type Meta)" -msgstr "Các Đoạn NLA thì đoạn này được làm một vật đựng dùm (nếu nó là loại Siêu)" +msgstr "Các Dải NLA mà dải này đứng làm vỏ chứa cho chúng (nếu nó là Siêu loại)" msgid "Type of NLA Strip" -msgstr "Loại Đoạn NLA" +msgstr "Thể Loại Dải NLA" msgid "Action Clip" -msgstr "Đoạn Phim Hành Động" +msgstr "Đoạn Quay Hành Động" msgid "NLA Strip references some Action" -msgstr "Đoạn NLA đang tham chiếu một hành động nào" +msgstr "Dải NLA tham chiếu một số Hành Động nào đó" msgid "NLA Strip 'transitions' between adjacent strips" -msgstr "Đoạn NLA 'tiến triển' giữa đoạn kề" +msgstr "Dải NLA 'chuyển cảnh' giữa các đoạn kề cạnh" msgid "Meta" -msgstr "Siêu" +msgstr "Siêu Đối Tượng" msgid "NLA Strip acts as a container for adjacent strips" -msgstr "Đoạn NLA làm như vật đựng cho đoạn kề" +msgstr "Dải NLA đứng làm vỏ chứa cho các dải kề cạnh" msgid "Sound Clip" @@ -39145,31 +42105,31 @@ msgstr "Đoạn Âm Thanh" msgid "NLA Strip representing a sound event for speakers" -msgstr "Đoạn NLA đang đại diện cho một sự kiện âm thanh cho loa" +msgstr "Dải NLA đại diện một sự kiện âm thanh cho các loa phát thanh" msgid "Animated Influence" -msgstr "Sự Ảnh Hưởng Hoạt Hình" +msgstr "Ảnh Hưởng Hoạt Họa" msgid "Influence setting is controlled by an F-Curve rather than automatically determined" -msgstr "Cài đặt sự ảnh hưởng được Cong-F điều khiển thay thế xác định tự động" +msgstr "Sắp đặt về ảnh hưởng sẽ do Đường Cong-F điều khiển, thay vì được xác định tự động" msgid "Animated Strip Time" -msgstr "Thời Gian Đoạn Hoạt Hình" +msgstr "Thời Gian Đoạn Hoạt Họa" msgid "Strip time is controlled by an F-Curve rather than automatically determined" -msgstr "Thời gian đoạn được Cong-F điều khiển thay thế xác định tự động" +msgstr "Thời gian của đoạn sẽ do Đường Cong-F điều khiển, thay vì được xác định tự động" msgid "Cyclic Strip Time" -msgstr "Thời Gian Chu Trình Đoạn" +msgstr "Tuần Hoàn Thời Gian của Dải" msgid "Cycle the animated time within the action start and end" -msgstr "Chu trình lại thời gian hoạt hình giữa bắt đầu và kết thúc của hành động " +msgstr "Tuần hoàn thời gian hoạt họa nội trong khoảng giữa điểm khởi đầu và kết thúc" msgid "Auto Blend In/Out" @@ -39177,51 +42137,59 @@ msgstr "Tự Động Pha Trộn Vào/Ra" msgid "Number of frames for Blending In/Out is automatically determined from overlapping strips" -msgstr "Số lượng bức ảnh cho Pha Trộn Vào/Ra được tính tự động từ đoạn lấn trên nhau" +msgstr "Số lượng khung hình để Pha Trộn Vào/Ra sẽ được tính toán tự động từ các dải đè gối nhau" msgid "NLA Strip is played back in reverse order (only when timing is automatically determined)" -msgstr "Hát lại Đoạn NLA nghịch hướng (chỉ khi thời tự được xác định tự động)" +msgstr "Dải NLA được chơi lại ngược chiều (chỉ khi thời gian được xác định tự động mà thôi)" msgid "Sync Action Length" -msgstr "Đồng Bộ Bề Dài Hành Động" +msgstr "Đồng Bộ Chiều Dài của Hành Động" msgid "Update range of frames referenced from action after tweaking strip and its keyframes" -msgstr "Nâng cấp phạm vi của các bức ảnh được tham chiếu từ hành động sau chỉnh đoạn và bức ảnh mẫu của nó" +msgstr "Cập nhật phạm vi các khung hình được tham chiếu từ hành động sau khi chỉnh sửa đoạn và các khung khóa của nó" msgid "NLA-Strip F-Curves" -msgstr "Cong-F Đoạn-NLA" +msgstr "Các Đường Cong-F của Dải-NLA" msgid "Collection of NLA strip F-Curves" -msgstr "Sưu tập Cong-F Đoạn NLA" +msgstr "Bộ sưu tập các Đường Cong-F của NLA" + + +msgid "Collection of NLA Strips" +msgstr "Bộ Sưu Tập các Dải NLA" msgid "NLA Track" msgstr "Rãnh NLA" +msgid "An animation layer containing Actions referenced as NLA strips" +msgstr "Một tầng hoạt họa có chứa các Hành Động tham chiếu như các dải NLA" + + msgid "NLA Track is active" msgstr "Rãnh NLA đang hoạt động" msgid "Override Track" -msgstr "Vượt Quyền Rãnh" +msgstr "Rãnh Vượt Quyền" msgid "In a local override data, whether this NLA track comes from the linked reference data, or is local to the override" -msgstr "Trong một dữ liệu địa phương được vượt quyền, rãnh NLA này từ dữ liệu tham chiếu được liên kết, hay là địa phương cho đồ vượt quyền" +msgstr "Trong dữ liệu vượt quyền cục bộ, cho dù rãnh NLA này đến từ dữ liệu tham chiếu liên kết hay cục bộ với vượt quyền" msgid "Solo" -msgstr "Độc Thân" +msgstr "Độc Tấu" msgid "NLA Track is evaluated itself (i.e. active Action and all other NLA Tracks in the same AnimData block are disabled)" -msgstr "Rãnh NLA được tính tóan một mình (nghĩa là Hành Động hoạt động và tất cả Rãnh NLA khác trong cùng cục DữLiệuHoạtHình bị tắt )" +msgstr "Rãnh NLA tự tính toán bản thân mình (ví dụ: Hành Động đang hoạt động và toàn bộ các rãnh NLA khác trong cùng khối AnimData (Dữ Liệu Hoạt Họa) đều bị tắt - vô hiệu hóa)" msgid "NLA Track is locked" @@ -39233,271 +42201,311 @@ msgstr "Tắt tính toán Rãnh NLA" msgid "NLA Track is selected" -msgstr "Rãnh NLA được chọn" +msgstr "Rãnh NLA đã được chọn" msgid "NLA Strips on this NLA-track" -msgstr "Đoạn NLA trong rãnh NLA này" +msgstr "Các Dải NLA trong rãnh NLA này" msgid "Collection of NLA Tracks" -msgstr "Sưu tập Rãnh NLA" +msgstr "Bộ Sưu Tập các Rãnh NLA" + + +msgctxt "Action" +msgid "Active Track" +msgstr "Giám Sát đang Hoạt Động" msgid "Active NLA Track" -msgstr "Rãnh NLA Hoạt Động" +msgstr "Rãnh NLA đang Hoạt Động" msgid "Node in a node tree" -msgstr "Giao điểm trong một cây giao điểm" +msgstr "Nút trong cây nút" msgid "The node label" -msgstr "Nhãn giao điểm" +msgstr "Nhãn của nút" msgid "Static Type" -msgstr "Loại Tĩnh" +msgstr "Kiểu Tĩnh" msgid "Node type (deprecated, use with care)" -msgstr "Loại giao điểm (lỗi thời, cẩn thận)" +msgstr "Kiểu nút static (lỗi thời, dùng cẩn thận)" msgid "Custom Node" -msgstr "Giao Điểm Tùy Chọn" +msgstr "Nút Tự Tạo" msgid "Custom color of the node body" -msgstr "Màu tùy chọn của thân giao điểm" +msgstr "Màu tùy chọn của thân nút" msgid "Absolute bounding box dimensions of the node" -msgstr "Cơ thước tuyệt đối cho hộp bao quanh giao điểm" +msgstr "Kích thước tuyệt đối của khung hộp viền cho nút" msgid "Height of the node" -msgstr "Bề cao giao điểm" +msgstr "Chiều cao của nút" msgid "Internal Links" -msgstr "Liên Kết Nội Bộ" +msgstr "Đường Kết Nối Nội Bộ" msgid "Internal input-to-output connections for muting" -msgstr "Các kết nối ngõ vào-đến-ra nội bộ cho cắt tiếng" +msgstr "Các kết nối giữa đầu vào-đến-đầu ra nội bộ để ngắt hoạt động" msgid "Optional custom node label" -msgstr "Nhãn giao điểm tùy chọn tùy chọn" +msgstr "Nhãn hiệu tùy chọn của nút tự tạo" msgid "Unique node identifier" -msgstr "Tên độc đáo cho giao điểm" +msgstr "Định danh duy nhất của nút" msgid "Outputs" -msgstr "Ngõ Ra" +msgstr "Đầu Ra" msgid "Parent this node is attached to" -msgstr "Phụ huynh giao điểm này được gắn đến" +msgstr "Phụ huynh mà nút này được gắn vào" msgid "Node selection state" -msgstr "Trạng thái chọn của giao điểm" +msgstr "Trạng thái lựa chọn của nút" msgid "Show Options" -msgstr "Hiện Tùy Chọn" +msgstr "Hiển Thị các Tùy Chọn" msgid "Show Preview" -msgstr "Hiện Dự Khán" +msgstr "Hiển Thị Xem Trước" msgid "Show Texture" -msgstr "Hiện Chất Liệu" +msgstr "Hiển Thị Chất Liệu" msgid "Display node in viewport textured shading mode" -msgstr "Hiển thị giao điểm dùng chế độ tô sắc chất liệu trong màn chiếu" +msgstr "Hiển thị nút trong chế độ tô bóng chất liệu của cổng nhìn" msgid "Node type (deprecated, use bl_static_type or bl_idname for the actual identifier string)" -msgstr "Loại giao điểm (lỗi thời, dùng bl_static_type hay bl_idname cho xâu tên thật sự)" +msgstr "Loại nút (lỗi thời, dùng bl_static_type hay bl_idname cho các chuỗi ký tự định danh (tên) thật)" msgid "Use custom color for the node" -msgstr "Dùng màu tùy chọn cho giao điểm" +msgstr "Dùng màu tùy chọn cho nút" msgid "Width of the node" -msgstr "Bề rộng giao điểm" +msgstr "Chiều rộng nút" msgid "Custom Group" -msgstr "Nhó Tùy Chọn" +msgstr "Nhóm Tự Tạo" msgid "Base node type for custom registered node group types" -msgstr "Loại giao điểm cơ sở cho loại nhóm giao điểm được đăng ký" +msgstr "Thể loại nút cơ sở cho các loại nhóm nút tự tạo đã đăng ký" msgid "Compositor Node" -msgstr "Giao Điểm Ghép" +msgstr "Nút Tổng Hợp" msgid "Alpha Over" -msgstr "Độ Đục Trên" +msgstr "Alpha Chồng Lên" msgid "Convert Premultiplied" -msgstr "Biến Đổi Nhân Trước" +msgstr "Chuyển Đổi Alpha Nhân Trước" msgid "Contrast Limit" -msgstr "Giới Hạn Chênh Lệch" +msgstr "Giới Hạn Tương Phản" msgid "How much to eliminate spurious edges to avoid artifacts (the larger value makes less active; the value 2.0, for example, means discard a detected edge if there is a neighboring edge that has 2.0 times bigger contrast than the current one)" -msgstr "Mức độ để trừ cạnh ngẫu nhiên cho tránh lỗi lầm (giá trị lớn làm giảm hoạt động; ví dụ: giá trị 2.0 nghĩa là bỏ cạnh được phát hiện nếu có một cảnh kề bên có chênh lệch 2.0 lần hơn cạnh hiện tại)" +msgstr "Mức độ loại bỏ các cạnh giả mạo để tránh giả tượng (giá trị lớn hơn làm cho năng tính giảm đi; giá trị 2.0, chẳng hạn, có nghĩa là loại bỏ một cạnh phát hiện thấy, nếu một cạnh lân cận nó có độ tương phản lớn hơn 2.0 lần cái hiện tại)" msgid "Corner Rounding" -msgstr "Tròn Hóa Góc Giác" +msgstr "Làm Tròn Góc" msgid "How much sharp corners will be rounded" -msgstr "Mức độ tròn hóa góc giác bén" +msgstr "Mức độ làm tròn các góc nhọn" msgid "Threshold to detect edges (smaller threshold makes more sensitive detection)" -msgstr "Ngưỡng cho phát hiện cạnh (ngưỡng nhỏ làm cho phát hiện nhạy cảm hơn)" +msgstr "Ngưỡng để phát hiện cạnh (ngưỡng nhỏ sẽ làm cho khả năng phát hiện nhạy cảm hơn)" msgid "Bilateral Blur" -msgstr "Mờ Hai Bên" +msgstr "Nhòe Mờ Song Phương" msgid "Color Sigma" -msgstr "Xichma Màu" +msgstr "Sigma của Màu" msgid "Space Sigma" -msgstr "Xichma Không Gia" +msgstr "Sigma của Không Gian" msgid "Aspect Correction" -msgstr "Chỉnh Tỉ Số Cạnh" +msgstr "Điều Chỉnh Tỷ Lệ Tương Quan" msgid "Type of aspect correction to use" -msgstr "Loại chỉnh tỉ số cạnh cho dùng" +msgstr "Thể loại điều chỉnh tỷ lệ tương quan sử dụng" msgid "Relative Size X" -msgstr "Kích Cỡ Tương Đối X" +msgstr "Kích Thước Tương Đối X" msgid "Relative Size Y" -msgstr "Kích Cỡ Tương Đối Y" +msgstr "Kích Thước Tương Đối Y" + + +msgctxt "NodeTree" +msgid "Filter Type" +msgstr "Thể Loại Bộ Lọc" + + +msgctxt "NodeTree" +msgid "Flat" +msgstr "Phẳng" + + +msgctxt "NodeTree" +msgid "Tent" +msgstr "Lều" + + +msgctxt "NodeTree" +msgid "Quadratic" +msgstr "Bình Phương" + + +msgctxt "NodeTree" +msgid "Cubic" +msgstr "Lập Phương" + + +msgctxt "NodeTree" +msgid "Gaussian" +msgstr "Gauss" + + +msgctxt "NodeTree" +msgid "Fast Gaussian" +msgstr "Gauss Nhanh" msgid "Bokeh" -msgstr "Tản Cảnh" +msgstr "Nhòe Bokeh" msgid "Use circular filter (slower)" -msgstr "Dùng bộ lọc tròn (chậm hơn)" +msgstr "Dùng bộ lọc hình tròn (chậm hơn)" msgid "Extend Bounds" -msgstr "Mở Rộng Cạnh" +msgstr "Nới Rộng Đường Biên" msgid "Extend bounds of the input image to fully fit blurred image" -msgstr "Mở rộng cạnh của ảnh ngõ vào cho nó đầy ảnh được mờ hóa" +msgstr "Nới rộng đường biên của hình ảnh đầu vào để khít vừa hình ảnh đã làm nhòe mờ" msgid "Apply filter on gamma corrected values" -msgstr "Áp dụng bộ lọc với giá trị được chỉnh gama trước" +msgstr "Áp dụng bộ lọc với các giá trị điều chỉnh gamma" msgid "Use relative (percent) values to define blur radius" -msgstr "Dùng giá trị tương đối (phân trăm) cho xác định bán kính mờ hóa" +msgstr "Dùng các giá trị tương đối (phần trăm) để xác định bán kính nhòe mờ" msgid "Variable Size" -msgstr "Kích Cỡ Biến" +msgstr "Kích Thước Biến Thiên" msgid "Support variable blur per pixel when using an image for size input" -msgstr "Hỗ trợ mờ hóa không đều từng điểm ảnh khi dùng một ảnh cho ngõ vào kích cỡ" +msgstr "Hỗ trợ sự nhòe mờ biến thiên từng điểm ảnh một, khi sử dụng hình ảnh cung cấp làm nguồn về kích thước" msgid "Bokeh Blur" -msgstr "Mờ Hóa Tản Cảnh" +msgstr "Nhòe Mờ Bokeh" msgid "Max Blur" -msgstr "Mờ Hóa Cực Đại" +msgstr "Nhòe Tối Đa" msgid "Blur limit, maximum CoC radius" -msgstr "Giới hạn mờ, bán kính Mờ cực đại" +msgstr "Giới hạn nhòe mờ, bán kính nhòe mờ tối đa (CoC = circle of confusion : điểm tròn không nhìn rõ)" msgid "Bokeh Image" -msgstr "Ảnh Tản Cảnh" +msgstr "Hình Nhòe Bokeh" msgid "Angle of the bokeh" -msgstr "Góc của tản cảnh" +msgstr "Góc độ của Bokeh" msgid "Catadioptric" -msgstr "Phản Xạ Khúc Xạ" +msgstr "Khúc Phản Xạ" msgid "Level of catadioptric of the bokeh" -msgstr "Mức phản xạ khúc xạ của tản cảnh" +msgstr "Mức khúc phản xạ của bokeh" msgid "Flaps" -msgstr "Lá" +msgstr "Số Cánh" msgid "Number of flaps" -msgstr "Sô lượng lá" +msgstr "Số lượng cánh" msgid "Rounding" -msgstr "Tròn Số" +msgstr "Làm Tròn" msgid "Level of rounding of the bokeh" -msgstr "Mức tròn số bokeh" +msgstr "Mức làm tròn hình bokeh" msgid "Lens Shift" -msgstr "Dời Thấu Kính" +msgstr "Dịch chuyển thấu kính" msgid "Shift of the lens components" -msgstr "Dời thành phần của thấu kính" +msgstr "Mức dịch chuyển (Shift) các thành phần của thấu kính" msgid "Box Mask" -msgstr "Mặt Nạ Hợp" +msgstr "Màn Chắn Lọc Hình Hộp" msgid "Height of the box" -msgstr "Bề cao của hợp" +msgstr "Chiều cao của hộp" msgid "Mask Type" -msgstr "Loại Mặt Nạ" +msgstr "Thể loại Màn Chắn Lọc" msgid "Not" @@ -39505,35 +42513,39 @@ msgstr "Nghịch" msgid "Rotation angle of the box" -msgstr "Góc xoay của hợp" +msgstr "Góc xoay của hộp" msgid "Width of the box" -msgstr "Bề rộng của hợp" +msgstr "Chiều rộng của hộp" msgid "X position of the middle of the box" -msgstr "Vị trí X của trung tâm hợp" +msgstr "Vị trí X của tâm hộp" msgid "Y position of the middle of the box" -msgstr "Vị trí Y của trung tâm hợp" +msgstr "Vị trí Y của tâm hộp" + + +msgid "Brightness/Contrast" +msgstr "Độ Sáng/Độ Tương Phản" msgid "Keep output image premultiplied alpha" -msgstr "Giữ độ đục nhân trước của ảnh ngõ ra" +msgstr "Duy trì alpha nhân trước của hình ảnh xuất" msgid "Channel Key" -msgstr "Màu Trong Kênh" +msgstr "Kênh Khóa" msgid "RGB color space" -msgstr "Không Gian RGB" +msgstr "Không gian RGB" msgid "HSV color space" -msgstr "Không gian màu HSV" +msgstr "Không gian HSV" msgid "YUV" @@ -39541,7 +42553,7 @@ msgstr "YUV" msgid "YUV color space" -msgstr "Không gian Màu YUV" +msgstr "Không gian YUV" msgid "YCbCr" @@ -39549,55 +42561,55 @@ msgstr "YCbCr" msgid "YCbCr color space" -msgstr "Không gian YCbCr" +msgstr "Không Gian YCbCr" msgid "Limit Channel" -msgstr "Hạn Chế Kênh" +msgstr "Kênh Hạn Chế" msgid "Limit by this channel's value" -msgstr "Hạn chế giá trị của kênh này" +msgstr "Hạn chế bởi giá trị của kênh này" msgid "Values higher than this setting are 100% opaque" -msgstr "Giá trị cao hơn cài đặt này là đục 100%" +msgstr "Giá trị cao hơn sắp đặt này sẽ có độ đục là 100%" msgid "Algorithm" -msgstr "Giải Thuật" +msgstr "Thuật Toán" msgid "Algorithm to use to limit channel" -msgstr "Dùng giải thuật nào cho hạn chế kênh" +msgstr "Thuật toán sử dụng để hạn chế kênh" msgid "Single" -msgstr "Một" +msgstr "Đơn/Một" msgid "Limit by single channel" -msgstr "Hạn chế bằng một kênh" +msgstr "Chỉ sử dụng một kênh mà thôi" msgid "Limit by maximum of other channels" -msgstr "Được hạn chế bởi cực đại của các kênh khác" +msgstr "Giới hạn bởi tối đa của các kênh khác" msgid "Values lower than this setting are 100% keyed" -msgstr "Giá trị thấp hơn này là trong suốt 100%" +msgstr "Giá trị thấp hơn sắp đặt này sẽ được khóa hóa 100%" msgid "Channel used to determine matte" -msgstr "Dùng kênh nào cho xác định lớp che" +msgstr "Kênh sử dụng để xác định lớp vẽ lồng" msgid "Chroma Key" -msgstr "Màu Trong Suốt" +msgstr "Lọc Màu" msgid "Alpha falloff" -msgstr "Sự Giảm Độ Đục" +msgstr "Suy giảm của alpha" msgid "Lift" @@ -39605,19 +42617,19 @@ msgstr "Nâng" msgid "Alpha lift" -msgstr "Nâng Độ Đục" +msgstr "Nâng alpha" msgid "Shadow Adjust" -msgstr "Chỉnh Bóng Tối" +msgstr "Điều Chỉnh Bóng Tối" msgid "Adjusts the brightness of any shadows captured" -msgstr "Cho chỉnh độ sáng của các bóng tối được bắt" +msgstr "Chỉnh độ sáng của bất cứ bóng tối nào đã chụp" msgid "Tolerance below which colors will be considered as exact matches" -msgstr "Dưới giới hạn này chấp nhận màu như chính xác giống nhau" +msgstr "Dung sai mà dưới nó các màu sắc sẽ được coi như là hoàn toàn khớp nhau" msgid "Acceptance" @@ -39625,43 +42637,43 @@ msgstr "Chấp Thuận" msgid "Tolerance for a color to be considered a keying color" -msgstr "Giới hạn cho màu được chấp thuận là màu trong suốt" +msgstr "Dung sai để một màu được chấp thuận là màu khóa" msgid "Color Balance" -msgstr "Thăng Bằng Màu" +msgstr "Cân Bằng Màu" msgid "Correction Formula" -msgstr "Công Thức Chỉnh" +msgstr "Công Thức Chỉnh Sửa" msgid "Lift/Gamma/Gain" -msgstr "Nâng/Gama/Tăng Lượng" +msgstr "Nâng/Gamma/Khuếch Đại" msgid "Offset/Power/Slope (ASC-CDL)" -msgstr "Dịch/Lũy Thừa/Dốc (ASC-CDL)" +msgstr "Dịch Chuyển/Lũy Thừa/Độ Dốc (ASC-CDL)" msgid "ASC-CDL standard color correction" -msgstr "Chỉnh sửa màu chuẩn ASC-CDL" +msgstr "Chỉnh sửa màu theo tiêu chuẩn ASC-CDL (American Society of Cinematographers - Color Decision List : Hội Các nhà quay phim Mỹ - Bảng Liệt Kê Quyết Định về Màu Sắc)" msgid "Correction for highlights" -msgstr "Chỉnh cho điểm sáng" +msgstr "Sửa Vùng Sáng" msgid "Correction for midtones" -msgstr "Chỉnh cho độ sáng giữa" +msgstr "Sửa Vùng Trung Sắc" msgid "Correction for shadows" -msgstr "Chỉnh cho bóng Tối" +msgstr "Sửa Vùng Tối" msgid "Correction for entire tonal range" -msgstr "Sứ chỉnh lại cho toàn phạm vi độ sáng tối" +msgstr "Chỉnh sửa đối với toàn khoảng sắc thái" msgid "Basis" @@ -39669,187 +42681,187 @@ msgstr "Cơ Sở" msgid "Support negative color by using this as the RGB basis" -msgstr "Hỗ trợ màu âm bằng dùng cái này làm cơ sở RGB" +msgstr "Hỗ trợ màu âm bằng các sử dụng cái này làm cơ sở cho RGB" msgid "Slope" -msgstr "Dốc" +msgstr "Độ Dốc" msgid "Color Correction" -msgstr "Chỉnh Màu" +msgstr "Chỉnh Sửa Màu" msgid "Blue channel active" -msgstr "Kênh xanh hoạt động" +msgstr "Kênh lam đang hoạt động" msgid "Green channel active" -msgstr "Kênh lục hoạt động" +msgstr "Kênh lục đang hoạt động" msgid "Highlights Contrast" -msgstr "Chênh Lệch Điểm Sáng" +msgstr "Tương Phản của Điểm Nhấn" msgid "Highlights contrast" -msgstr "Chệnh lệch điểm sáng" +msgstr "Độ tương phản của các điểm nhấn" msgid "Highlights Gain" -msgstr "Tăng lượng Điểm sáng" +msgstr "Mức Khuếch Đại của Điểm Nhấn" msgid "Highlights gain" -msgstr "Tăng lượng điểm sáng" +msgstr "Mức khuếch đại của điểm nhấn" msgid "Highlights Gamma" -msgstr "Gama Điểm Sáng" +msgstr "Gamma Điểm Nhấn" msgid "Highlights gamma" -msgstr "Gama điểm sáng" +msgstr "Gamma (sắc thái trung gian) của điểm nhấn" msgid "Highlights Lift" -msgstr "Nâng Điểm Sáng" +msgstr "Nâng Điểm Nhấn" msgid "Highlights lift" -msgstr "Nâng điểm sáng" +msgstr "Nâng điểm nhấn" msgid "Highlights Saturation" -msgstr "Độ Tươi Điểm Sáng" +msgstr "Độ Bão Hòa của Điểm Nhấn" msgid "Highlights saturation" -msgstr "Độ tươi điểm sáng" +msgstr "Độ bão hòa (độ tươi của màu) của các điểm nhấn" msgid "Master Contrast" -msgstr "Chênh Lệch Chủ" +msgstr "Độ Tương Phản Chính" msgid "Master contrast" -msgstr "Chênh lệch chủ" +msgstr "Độ tương phản chính" msgid "Master Gain" -msgstr "Tăng Lượng Chủ" +msgstr "Độ Khuếch Đại Chính" msgid "Master gain" -msgstr "Tăng lượng chủ" +msgstr "Độ khuyếch đại chính" msgid "Master Gamma" -msgstr "Gama Chủ" +msgstr "Độ Gamma Chính" msgid "Master gamma" -msgstr "Gama chủ" +msgstr "Độ gamma (sắc thái trung độ) chính" msgid "Master Lift" -msgstr "Nâng Chủ" +msgstr "Độ Nâng Chính" msgid "Master lift" -msgstr "Nâng chủ" +msgstr "Độ nâng chính" msgid "Master Saturation" -msgstr "Độ Tươi Chủ" +msgstr "Độ Bão Hòa Chính" msgid "Master saturation" -msgstr "Độ tươi chủ" +msgstr "Độ bão hòa (độ tươi của màu) chính" msgid "Midtones Contrast" -msgstr "Chênh Lệch Độ Sáng Giữa" +msgstr "Độ Tương Phản của Sắc Thái Trung Độ" msgid "Midtones contrast" -msgstr "Chênh lệch độ sáng giữa" +msgstr "Độ tương phản của sắc thái trung độ" msgid "Midtones End" -msgstr "Kết Thúc Độ Sáng Giữa" +msgstr "Kết Trung Độ" msgid "End of midtones" -msgstr "Kết thúc của độ sáng giữa" +msgstr "Điểm kết thúc của sắc thái trung độ" msgid "Midtones Gain" -msgstr "Tăng Lượng Độ Sáng Giữa" +msgstr "Khuyếch Đại Trung Độ" msgid "Midtones gain" -msgstr "Tăng lượng độ sáng giữa" +msgstr "Khuyếch đại của sắc thái trung độ" msgid "Midtones Gamma" -msgstr "Gama Độ Sáng Giữa" +msgstr "Gamma Trung Độ" msgid "Midtones gamma" -msgstr "Gama điều độ sáng giữa" +msgstr "Gamma của sắc thái trung độ" msgid "Midtones Lift" -msgstr "Nâng Độ Sáng Giữa" +msgstr "Nâng Trung Độ" msgid "Midtones lift" -msgstr "Nâng độ sáng giữa" +msgstr "Nâng sắc thái trung độ" msgid "Midtones Saturation" -msgstr "Độ Tươi Độ Sáng Trung" +msgstr "Bão Hòa Trung Độ" msgid "Midtones saturation" -msgstr "Độ tươi độ sáng giữa" +msgstr "Độ bão hòa (độ tươi) của sắc thái trung độ" msgid "Midtones Start" -msgstr "Bắt Đầu Độ Sáng Giữa" +msgstr "Khởi Trung Độ" msgid "Start of midtones" -msgstr "Bắt đầu của độ sáng giữa" +msgstr "Điểm khởi đầu của sắc thái trung độ" msgid "Red channel active" -msgstr "Kênh đỏ hoạt động" +msgstr "Kênh đỏ đang hoạt động" msgid "Shadows Contrast" -msgstr "Chênh Lệch Bóng Tối" +msgstr "Tương Phản của Bóng Tối" msgid "Shadows contrast" -msgstr "Chênh lệch bóng tối" +msgstr "Độ tương phản của bóng tối" msgid "Shadows Gain" -msgstr "Tăng Lượng Bóng Tối" +msgstr "Khuyếch Đại của Bóng Tối" msgid "Shadows gain" -msgstr "Tăng lượng bóng tối" +msgstr "Khuếch đại của bóng tối" msgid "Shadows Gamma" -msgstr "Gama Bóng Tối" +msgstr "Gamm của Bóng Tối" msgid "Shadows gamma" -msgstr "Gama bóng tối" +msgstr "Gamm (trung độ) của bóng tối" msgid "Shadows Lift" @@ -39857,19 +42869,19 @@ msgstr "Nâng Bóng Tối" msgid "Shadows lift" -msgstr "Nâng bóng tối" +msgstr "Nâng sáng bóng tối" msgid "Shadows Saturation" -msgstr "Độ Tươi Bóng Tối" +msgstr "Bão Hòa của Bóng Tối" msgid "Shadows saturation" -msgstr "Độ tươi bóng tối" +msgstr "Độ bão hòa của bóng tối" msgid "Color Key" -msgstr "Màu Trong" +msgstr "Khóa Màu" msgid "H" @@ -39877,7 +42889,7 @@ msgstr "Màu" msgid "Hue tolerance for colors to be considered a keying color" -msgstr "Giới hạn màu cho màu được chấp nhận làm một màu trong suốt" +msgstr "Dung sai về sắc thể cho các màu được chấp nhận là màu khóa" msgid "S" @@ -39885,83 +42897,83 @@ msgstr "Độ Tươi" msgid "Saturation tolerance for the color" -msgstr "Giới hạn độ tươi cho màu" +msgstr "Dung sai về độ bão hòa của màu" msgid "Value tolerance for the color" -msgstr "Giá trị chênh lệch cho màu" +msgstr "Dung sai về giá trị của màu" msgid "Color Spill" -msgstr "Tràn Màu" +msgstr "Màu Tràn/Vãi" msgid "Red spill suppression" -msgstr "Chặn tràn màu đỏ" +msgstr "Ngăn chặn sự tràn vãi màu đỏ" msgid "Green spill suppression" -msgstr "Chặn tràn màu lục" +msgstr "Ngăn chặn sự tràn vãi màu lục" msgid "Blue spill suppression" -msgstr "Chặn tràn màu xanh" +msgstr "Ngăn chặn sự tràn vãi màu lam" msgid "Limit by red" -msgstr "Hạn chế bằng đỏ" +msgstr "Giới hạn bởi màu đỏ" msgid "Limit by green" -msgstr "Hạn chế bằng lục" +msgstr "Giới hạn bởi màu lục" msgid "Limit by blue" -msgstr "Hạn chế bằng xanh" +msgstr "Giới hạn bởi màu lam" msgid "Simple limit algorithm" -msgstr "Giải thuật hạn chế đơn giản" +msgstr "Thuật toán hạn chế đơn giản" msgid "Average limit algorithm" -msgstr "Giải thuật hạn chế trung bình" +msgstr "Thuật toán hạn chế trung bình" msgid "Scale limit by value" -msgstr "Hạn chế phóng to bằng giá trị" +msgstr "Đổi tỷ lệ hạn chế bằng giá trị" msgid "Blue spillmap scale" -msgstr "Phóng to ánh xạ tràn xanh" +msgstr "Tỷ lệ ánh xạ tràn vãi của màu lam" msgid "Green spillmap scale" -msgstr "Phóng to ánh xạ tràn lục" +msgstr "Tỷ lệ ánh xạ tràn vãi của màu lục" msgid "Red spillmap scale" -msgstr "Phóng to ánh xạ tràn đỏ" +msgstr "Tỷ lệ ánh xạ tràn vãi của màu đỏ" msgid "Unspill" -msgstr "Bất Tràn" +msgstr "Chống Tràn Vãi" msgid "Compensate all channels (differently) by hand" -msgstr "Bù hết kênh (khác nhau) bằng tay" +msgstr "Bù trừ toàn bộ các kênh (riêng rẽ) một cách thủ công" msgid "Combine HSVA" -msgstr "Gồm HSVA" +msgstr "Kết Hợp HSVA" msgid "Combine RGBA" -msgstr "Gồm RGBA" +msgstr "Kết Hợp RGBA" msgid "Combine YCbCrA" -msgstr "Gồm YCbCrA" +msgstr "Kết Hợp YCbCrA" msgid "ITU 601" @@ -39973,51 +42985,55 @@ msgstr "ITU 709" msgid "Combine YUVA" -msgstr "Gồm YUVA" +msgstr "Kết Hợp YUVA" msgid "Combine Color" -msgstr "Gồm Màu" +msgstr "Kết Hợp Màu" msgid "Mode of color processing" -msgstr "Chế độ cho xử lý màu" +msgstr "Chế độ xử lý màu" msgid "Use RGB color processing" -msgstr "Dùng xử lý màu RGB" +msgstr "Sử dụng xử lý màu RGB" msgid "Use HSV color processing" -msgstr "Dùng xử lý màu HSV" +msgstr "Sử dụng xử lý màu HSV" msgid "Use HSL color processing" -msgstr "Dùng xử lý màu HSL" +msgstr "Sử dụng xử lý màu HSL" msgid "Use YCbCr color processing" -msgstr "Dùng xử lý màu YCbCr" +msgstr "Sử dụng xử lý màu YCbCr" msgid "Use YUV color processing" -msgstr "Dùng xử lý màu YUV" +msgstr "Sử dụng xử lý màu YUV" msgid "Color space used for YCbCrA processing" -msgstr "Không gian màu cho xử lý YCbCrA" +msgstr "Không gian màu được sử dụng để xử lý YCbCrA" msgid "Combine XYZ" -msgstr "Gồm XYZ" +msgstr "Kết Hợp XYZ" msgid "Composite" -msgstr "Ghép" +msgstr "Tổng Hợp" msgid "Colors are treated alpha premultiplied, or colors output straight (alpha gets set to 1)" -msgstr "Làm như màu được nhân độ đục trước, hay ngõ ra màu trực tiếp (độ đục được đặt bằng 1 )" +msgstr "Các màu được đối xử như là đã được nhân alpha trước, hoặc các màu được xuất ra nguyên dạng (alpha sẽ được đặt là 1)" + + +msgid "Convert Colorspace" +msgstr "Chuyển Đổi Không Gian Màu" msgid "From" @@ -40025,19 +43041,19 @@ msgstr "Từ" msgid "Color space of the input image" -msgstr "Không màu của ảnh ngõ vào" +msgstr "Không gian màu của hình ảnh đầu vào" msgid "To" -msgstr "Đến" +msgstr "Tới" msgid "Color space of the output image" -msgstr "Không màu của ảnh ngõ ra" +msgstr "Không gian màu của hình ảnh đầu ra" msgid "Corner Pin" -msgstr "Đinh Góc Giác" +msgstr "Ghim Đính Góc" msgid "X2" @@ -40057,119 +43073,119 @@ msgstr "Y1" msgid "Use relative values to crop image" -msgstr "Dùng giá trị tương đối cho cắt ảnh" +msgstr "Dùng giá trị tương đối để cắt hình ảnh" msgid "Crop Image Size" -msgstr "Khổ Cắt Ảnh" +msgstr "Cắt Khổ Ảnh" msgid "Whether to crop the size of the input image" -msgstr "Nên cắt kích cỡ của ảnh ngõ vào hay không" +msgstr "Có nên cắt kích thước của hình ảnh cung cấp hay không" msgid "Cryptomatte (Legacy)" -msgstr "Mặt Nạ Mã (Lỗi Thời)" +msgstr "Lớp Vẽ Lồng Bí Mật (lỗi thời)" msgid "Add object or material to matte, by picking a color from the Pick output" -msgstr "Thêm vật thể hay vật liệu vào mặt nạ, bằng chọn một màu từ Sự Rút ngõ ra" +msgstr "Thêm đối tượng hoặc chất liệu và lớp vẽ lồng, bằng cách chọn một màu từ đầu ra của Chọn (Pick)" msgid "Matte Objects" -msgstr "Vật Thể Mặt Nạ Mã" +msgstr "Đối Tượng Lồng" msgid "List of object and material crypto IDs to include in matte" -msgstr "Danh sách của ID mặt nạ mã vật thể và vật liệu để gồm trong mặt nạ" +msgstr "Danh sách các chỉ danh (ID) bí mật của đối tượng và nguyên vật liệu để bao gồm trong lớp vẽ lồng" msgid "Remove object or material from matte, by picking a color from the Pick output" -msgstr "Xá vật thể hay vật liệu từ mặt nạ, bằng chọn một màu từ Sự Rút ngõ ra" +msgstr "Xóa đối tượng hoặc chất liệu khỏi lớp vẽ lồng, bằng cách chọn một màu từ đầu ra của Chọn" msgid "Cryptomatte" -msgstr "Mặ Nạ Mã" +msgstr "Lớp Vẽ Lồng Bí Mật" msgid "Mattes" -msgstr "Mặt Nạ Mã" +msgstr "Lớp Vẽ Lồng" msgid "Has Layers" -msgstr "Có Lớp" +msgstr "Có Tầng Lớp" msgid "True if this image has any named layer" -msgstr "Đúng nếu ảnh này có lớp nào được đặt tên" +msgstr "Giá trị 'Đúng' nếu hình ảnh này có bất cứ một tầng lớp nào đã có tên" msgid "Has View" -msgstr "Có Màn" +msgstr "Có Góc Nhìn" msgid "True if this image has multiple views" -msgstr "Đúng nếu ảnh này có đa màn" +msgstr "Giá trị 'Đúng' nếu hình ảnh này có nhiều góc nhìn" msgid "Placeholder" -msgstr "Chỗ Chứa" +msgstr "Giữ Chỗ" msgid "Cryptomatte Layer" -msgstr "Lớp Mặt Nạ Mã" +msgstr "Tầng Lớp Vẽ Lồng Bí Mật" msgid "What Cryptomatte layer is used" -msgstr "Dùng lớp Mặt Nạ Mã nào" +msgstr "Tầng lớp vẽ lồng bí mật nào được sử dụng" msgid "Use Object layer" -msgstr "Dùng lớp Vật Thể" +msgstr "Sử Dụng Tầng Lớp Đối Tượng" msgid "Use Material layer" -msgstr "Dùng lớp Vật Liệu" +msgstr "Sử Dụng Tầng Lớp Nguyên Vật Liệu" msgid "Use Asset layer" -msgstr "Duông lớp Tích Sản" +msgstr "Sử Dụng Tầng Lớp Tài Sản" msgid "Where the Cryptomatte passes are loaded from" -msgstr "Nạp các vòng Mặt Nạ Mã từ chỗ nào" +msgstr "Nơi các lượt lớp vẽ lồng bí mật được nạp vào" msgid "Use Cryptomatte passes from a render" -msgstr "Dùng các vòng mặt nạ mã từ một kết xuất" +msgstr "Sử dụng các lượt Lớp Vẽ Lồng Bí Mật từ một kết xuất" msgid "Use Cryptomatte passes from an image" -msgstr "Dùng các vòng mặt nạ mã từ một ảnh" +msgstr "Sử dụng các lượt Lớp Vẽ Lồng Bí Mật từ một hình ảnh" msgid "Auto-Refresh" -msgstr "Tự Động Nạp Lại" +msgstr "Tự Động Làm Tươi" msgid "RGB Curves" -msgstr "Cong RGB" +msgstr "Đường Cong RGB" msgid "Vector Curves" -msgstr "Cong Vectơ" +msgstr "Đường Cong Véctơ" msgid "Compositor Custom Group" -msgstr "Nhóm Tùy Chọn Ghép" +msgstr "Nhóm Tổng Hợp Tùy Chỉnh" msgid "Custom Compositor Group Node for Python nodes" -msgstr "Giao Điểm Nhóm Ghép Tùy Chọn cho giao điểm Python" +msgstr "Nút Nhóm Tổng Hợp Tùy Chỉnh dành cho các nút Python" msgid "Directional Blur" -msgstr "Mờ Hóa Hướng" +msgstr "Nhòe Mờ Định Hướng" msgid "Center X" @@ -40181,23 +43197,23 @@ msgstr "Trung Tâm Y" msgid "Spin" -msgstr "Xoay" +msgstr "Xoáy" msgid "Zoom" -msgstr "Phóng Vào" +msgstr "Thu-Phóng" msgid "Defocus" -msgstr "Mờ Hóa" +msgstr "Làm Nhòe Mờ" msgid "Bokeh shape rotation offset" -msgstr "Dịch xoay hình dạng tản cảnh" +msgstr "Dịch chuyển trong xoay chiều của hình làm nhòe mờ Bokeh" msgid "Bokeh Type" -msgstr "Loại Tản Cảnh" +msgstr "Loại Nhòe Mờ Bokeh" msgid "Octagonal" @@ -40229,7 +43245,7 @@ msgstr "Ngũ Giác" msgid "5 sides" -msgstr "Nam cạnh" +msgstr "Năm cạnh" msgid "4 sides" @@ -40241,139 +43257,144 @@ msgstr "Tam Giác" msgid "3 sides" -msgstr "Ba cạnh" +msgstr "3 cạnh" msgid "Amount of focal blur, 128 (infinity) is perfect focus, half the value doubles the blur radius" -msgstr "Mức độ mờ hóa tiêu điểm, 128 (vô cực) rõ hoàn toàn, nửa giá trị nhân đôi bán kính mờ hóa" +msgstr "Lượng làm nhòe mờ tiêu điểm, 128 (vô cực), tức rõ hoàn toàn, chia đôi giá trị sẽ tăng bán kính làm nhòe mờ lên gấp đôi" msgid "Scene from which to select the active camera (render scene if undefined)" -msgstr "Chọn máy quay phim hoạt động từ cảnh nào (cảnh kết xuất nếu chưa được xác định)" +msgstr "Cảnh để chọn máy quay phim đang hoạt động ở đó (cảnh kết xuất nếu không xác định)" msgid "CoC radius threshold, prevents background bleed on in-focus midground, 0 is disabled" -msgstr "Ngưỡng bán kính mờ hóa, tránh nền tràn vào cảnh trong trường giữa rõ, 0 là tắt" +msgstr "Ngưỡng bán kính nhòe mờ (CoC), hòng ngăn ngừa hình nền rò rỉ vào vùng trung cảnh rõ nét, 0 là tắt đi" msgid "Gamma Correction" -msgstr "Chỉnh Gama" +msgstr "Chỉnh Sửa Gamma" msgid "Enable gamma correction before and after main process" -msgstr "Bật chỉnh sửa gama trước và sao qúa trình chánh" +msgstr "Cho phép chỉnh sửa gamma trước và sau quá trình xử lý chính" msgid "Enable low quality mode, useful for preview" -msgstr "Bất chế độ chất lượng thấp, lợi ích cho dự khán" +msgstr "Bật chế độ chất lượng thấp. Có ích trong việc xem trước" msgid "Use Z-Buffer" -msgstr "Dùng Đệm Z" +msgstr "Dùng Bộ Đệm Z" msgid "Disable when using an image as input instead of actual z-buffer (auto enabled if node not image based, eg. time node)" -msgstr "Tắt khi dùng ảnh làm ngõ vào thay thế dùng đệm Z thật (bật tự động nếu không có cơ sở ảnh, ví dụ giao điểm thời gian)" +msgstr "Tắt khi dùng một hình ảnh làm đầu vào, thay vì bộ đệm Z thực (tự động bật nếu nút không phải là hình ảnh, ví dụ: nút thời gian)" msgid "Z-Scale" -msgstr "Phóng To Z" +msgstr "Tỷ Lệ Z" msgid "Scale the Z input when not using a z-buffer, controls maximum blur designated by the color white or input value 1" -msgstr "Phóng to ngõ vào Z khi không dùng đệm Z, cho điều khiển mờ hóa cực đại được đặc bằng màu trắng hay giá trị nhập = 1" +msgstr "Tỷ lệ đầu vào Z, khi không sử dụng bộ đệm Z, để điều chế độ nhòe mờ tối đa được chỉ định bởi độ trắng của màu sắc, hoặc giá trị đầu vào bằng 1" msgid "Denoise" -msgstr "Bớt Huyên Náo Hoá" +msgstr "Khử Nhiễu" msgid "Denoising prefilter" -msgstr "Lọc trước bớt huyên náo" +msgstr "Tiền xử lý trước khi Khử Nhiễu" msgid "No prefiltering, use when guiding passes are noise-free" -msgstr "Không lọc trước, dùng khi vòng dẫn không có huyên náo" +msgstr "Không xử lý thanh lọc trước. Sử dụng khi các lượt hướng dẫn không có nhiễu" msgid "Denoise image and guiding passes together. Improves quality when guiding passes are noisy using least amount of extra processing time" -msgstr "Bớt huyên náo ảnh và vòng dẫn chung. Nó tăng chất lượng khi vòng dẫn có huyên náo mà giảm thời gian xử lý" +msgstr "Khử nhiễu hình ảnh và các lượt hướng dẫn cùng với nhau, cùng một lúc. Phương pháp này cải thiện chất lượng hình ảnh, khi các lượt hướng dẫn là các cái bị nhiễu, song sử dụng tối thiểu lượng thời gian xử lý đòi hỏi thêm" msgid "Prefilter noisy guiding passes before denoising image. Improves quality when guiding passes are noisy using extra processing time" -msgstr "Bớt huyên náo vòng dẫn trước bớt huyên náo ảnh. Nó tăng chất lượng khi vòng dẫn có huyên náo mà cần dùng thêm thời gian cho xử lý" +msgstr "Tiền xử lý thanh lọc các lượt nhiễu hướng dẫn trước đã, trước khi khử nhiễu hình ảnh. Phương pháp này cải thiện chất lượng của hình ảnh khi các lượt hướng dẫn có nhiều tạp nhiễu, song sẽ gia tăng thời gian xử lý lên" msgid "HDR" -msgstr "Phạm Vi Động Lý Rộng" +msgstr "High Dynamic Range: Phạm Vi Động Lý Rộng" msgid "Process HDR images" -msgstr "Xữ lý ảnh Phạm Vi Động Lý Rộng" +msgstr "Xử lý hình ảnh HDR" msgid "Despeckle" -msgstr "Giảm Dấu Chấm" +msgstr "Khử Chấm Lốm Đốm" msgid "Threshold for detecting pixels to despeckle" -msgstr "Ngưỡng cho phát hiện điềm ảnh cho giảm dấu chấm" +msgstr "Giới hạn dùng phát hiện các điểm ảnh để khử chấm lốm đốm" msgid "Neighbor" -msgstr "Kề" +msgstr "Lân Cận" msgid "Threshold for the number of neighbor pixels that must match" -msgstr "Ngưỡng cho số lượng điểm ảnh phải giống nhau" +msgstr "Giới hạn mà số lượng điểm ảnh lân cận nhất định phải khớp" msgid "Difference Key" -msgstr "Chênh Lệch Trong Suốt" +msgstr "Khóa Hóa Hiệu" msgid "Color distances below this additional threshold are partially keyed" -msgstr "Khoảng cách màu nhỏ ngưỡng kèm này được làm trong suốt một phần" +msgstr "Những khoảng cách màu dưới giới hạn này sẽ được Khóa Hóa Cục Bộ" msgid "Color distances below this threshold are keyed" -msgstr "Khoảng cách màu nhỏ ngưỡng này được làm trong suốt" +msgstr "Những khoảng cách màu dưới giới hạn này sẽ được khóa hóa" msgid "Dilate/Erode" -msgstr "Phình/Ăn Mòn" +msgstr "Giãn Ra/Xói Mòn" msgid "Distance to grow/shrink (number of iterations)" -msgstr "Khoảng cách cho to lớn/thu nhỏ (số lượng lặp vòng)" +msgstr "Khoảng cách để giãn ra/thu vào (số lần tuần hoàn)" + + +msgctxt "Image" +msgid "Edge" +msgstr "Cạnh" msgid "Edge to inset" -msgstr "Cạnh cho nới vào" +msgstr "Cạnh để cắt nội" msgid "Growing/shrinking mode" -msgstr "Chế độ to lớn/thu nhỏ" +msgstr "Chế độ giãn ra/thu vào" msgid "Feather" -msgstr "Phe Phẩy" +msgstr "Mép Nhòe" msgid "Distance Key" -msgstr "Mẫu Khoảng Cách" +msgstr "Khoảng Cách Khóa" msgid "YCbCr suppression" -msgstr "Đè xuống YCbCr" +msgstr "Ức chế YCbCr" msgid "Double Edge Mask" -msgstr "Mặt Nạ Hai Cạnh" +msgstr "Màn Chắn Lọc Đôi Cạnh" msgid "Buffer Edge Mode" -msgstr "Chế Độ Cạnh Đệm" +msgstr "Chế Độ Đệm Cạnh" msgid "Bleed Out" @@ -40381,79 +43402,79 @@ msgstr "Tràn Ra" msgid "Allow mask pixels to bleed along edges" -msgstr "Cho điểm ảnh mặt nạ tràn ra ngoài cạnh" +msgstr "Cho phép các điểm ảnh màn chắn lọc tràn ra dọc theo các cạnh" msgid "Keep In" -msgstr "Giữ Phía Trong" +msgstr "Giữ Nằm Trong" msgid "Restrict mask pixels from touching edges" -msgstr "Không cho điểm ảnh mặt nạ đụng cạnh" +msgstr "Hạn chế các điểm ảnh màn chắn lọc chạm vào các cạnh" msgid "Inner Edge Mode" -msgstr "Chế Độ Cạnh Nội" +msgstr "Chế Độ Cạnh Trong" msgid "All pixels on inner mask edge are considered during mask calculation" -msgstr "Dùng hết điểm ảnh tại cạnh của mặt nạ khi tính mặt nạ" +msgstr "Toàn bộ các điểm ảnh tại cạnh trong của màn chắn lọc là được cân nhắc trong khi tính toán màn chắn lọc" msgid "Adjacent Only" -msgstr "Chỉ Kề" +msgstr "Duy Kề Cạnh" msgid "Only inner mask pixels adjacent to outer mask pixels are considered during mask calculation" -msgstr "Chỉ điểm ảnh nội mặt nạ kề với điểm ra ngoài mặt nạ được chấp nhận khi tính mặt nạ" +msgstr "Chỉ các điểm ảnh của màn chắn lọc trong nằm kề cạnh các điểm ảnh của màn chắn lọc ngoài là được cân nhắc trong khi tính toán màn chắn lọc" msgid "Ellipse Mask" -msgstr "Mặt Nạ Elip" +msgstr "Màn Chắn Lọc hình Elip" msgid "Height of the ellipse" -msgstr "Chiều cao của elip" +msgstr "Chiều cao của hình elip" msgid "Rotation angle of the ellipse" -msgstr "Góc xoay elip" +msgstr "Góc xoay của hình elip" msgid "Width of the ellipse" -msgstr "Bề rộng elip" +msgstr "Chiều rộng hình elip" msgid "X position of the middle of the ellipse" -msgstr "Vị trí X cho trung tâm elip" +msgstr "Vị trí X của tâm hình elip" msgid "Y position of the middle of the ellipse" -msgstr "Vị trí Y cho trung tâm elip" +msgstr "Vị trí Y của tâm hình elip" msgid "Filter Type" -msgstr "Loại Bộ Lọc" +msgstr "Kiểu/Thể Loại Bộ/Thanh Lọc" msgid "Soften" -msgstr "Mềm Hóa" +msgstr "Làm Mềm Mại" msgid "Box Sharpen" -msgstr "Bén Hóa Hộp" +msgstr "Hình Hộp Sắc Cạnh" msgid "An aggressive sharpening filter" -msgstr "Bộ lọc mức độ dữ dội" +msgstr "Một bộ lọc làm sắc nét mạnh mẽ" msgid "Diamond Sharpen" -msgstr "Bén Hóa Hình Thoi" +msgstr "Làm Sắc Nét Kim Cương" msgid "A moderate sharpening filter" -msgstr "Bộ lọc mức độ giữa" +msgstr "Một bộ lọc làm sắc nét vừa phải" msgid "Laplace" @@ -40473,59 +43494,59 @@ msgstr "Kirsch" msgid "Shadow" -msgstr "Bóng Tối" +msgstr "Ngả/Bóng Tối" msgid "Flip X" -msgstr "Lật X" +msgstr "Đảo Chiều X" msgid "Flip Y" -msgstr "Lật Y" +msgstr "Đảo Chiều Y" msgid "Flip X & Y" -msgstr "Lật X & Y" +msgstr "Đảo Chiều X & Y" msgid "Glare" -msgstr "Ánh Chói" +msgstr "Lóe Sáng" msgid "Angle Offset" -msgstr "Dịch Góc" +msgstr "Góc Độ Dịch Chuyển" msgid "Streak angle offset" -msgstr "Dịch góc cho đường sọc" +msgstr "Góc độ dịch chuyển vệt sáng" msgid "Color Modulation" -msgstr "Biến Đổi Màu" +msgstr "Chuyển Điệu Màu" msgid "Amount of Color Modulation, modulates colors of streaks and ghosts for a spectral dispersion effect" -msgstr "Mức biến đổi màu, biến đổi màu cúa loé và bóng cho một hiệu ứng khuếch xạ quang phổ" +msgstr "Lượng Chuyển Động của Màu Sắc, chuyển đổi màu của các vệt sáng và ảo ảnh cho hiệu ứng tán sắc ma mị" msgid "Streak fade-out factor" -msgstr "Hệ số cho đường sọc biến mất" +msgstr "Hệ số mờ dần của vệt sáng" msgid "Glare Type" -msgstr "Loại Ánh Chói" +msgstr "Thể Loại Lóe Sáng" msgid "Ghosts" -msgstr "Bóng Ma" +msgstr "Ảo Ảnh" msgid "Streaks" -msgstr "Đường Sọc" +msgstr "Vệt Sáng" msgid "Fog Glow" -msgstr "Hào Quang Sương Mù" +msgstr "Hừng Sáng Sương Mù" msgid "Simple Star" @@ -40533,23 +43554,23 @@ msgstr "Ngôi Sao Đơn Giản" msgid "-1 is original image only, 0 is exact 50/50 mix, 1 is processed image only" -msgstr "-1 là ảnh nguồn gốc, 0 là pha trộn 50/50, 1 là chỉ ảnh quá trình" +msgstr "-1 là hình ảnh gốc, 0 là hòa trộn 50/50, 1 là chỉ hình ảnh đã được xử lý mà thôi" msgid "If not set to high quality, the effect will be applied to a low-res copy of the source image" -msgstr "Nếu không đặt chất lượng cao, sẽ áp dụng với bản sao chất lượng thấp của ảnh nguồn gốc" +msgstr "Nếu không đặt là chất lượng cao thì ảnh hưởng sẽ được áp dụng với bản sao chất lượng thấp của hình ảnh nguồn" msgid "Glow/glare size (not actual size; relative to initial size of bright area of pixels)" -msgstr "Kích cỡ hào quang/loé (không phải kích cỡ thật; tương đối với kích cỡ ban đầu của khu vực điểm ảnh sáng)" +msgstr "Kích thước vùng hừng sáng/ánh chói lòa (không phải kích thước thực; tương đối với kích thước ban đầu của vùng các điểm ảnh sáng bừng)" msgid "Total number of streaks" -msgstr "Số lượng đường sọc" +msgstr "Số lượng vệt sáng" msgid "The glare filter will only be applied to pixels brighter than this value" -msgstr "Chỉ áp dụng bộ lọc loé cho điểm ảnh sáng hơn giá trị này" +msgstr "Chỉ áp dụng bộ lọc ánh chói lòa vào các điểm ảnh sáng hơn giá trị này" msgid "Rotate 45" @@ -40557,31 +43578,35 @@ msgstr "Xoay 45°" msgid "Simple star filter: add 45 degree rotation offset" -msgstr "Bộ lọc ngôi sao đơn giản: cộng dịch xoay 45 độ" +msgstr "Bộ lọc ngôi sao đơn giản: xoay chiều 45 độ" msgid "Hue Correct" -msgstr "Chỉnh Màu Sắc" +msgstr "Chỉnh Sắc Màu" + + +msgid "Hue/Saturation/Value" +msgstr "Sắc Màu/Độ Bão Hòa/Giá Trị" msgid "ID Mask" -msgstr "Chỉ Số Mặt Nạ" +msgstr "Chắn Lọc ID" msgid "Pass index number to convert to alpha" -msgstr "Chỉ số vòng cho biến đổi thành độ đục" +msgstr "Chỉ số lượt để chuyển đổi thành alpha" msgid "Apply an anti-aliasing filter to the mask" -msgstr "Áp dụng bộ lọc khử răng cưa" +msgstr "Áp dụng bộ lọc khử răng cưa vào màn chắn lọc" msgid "Straight Alpha Output" -msgstr "Xuất Độ Đục Thẳng" +msgstr "Xuất Alpha Thẳng" msgid "Put node output buffer to straight alpha instead of premultiplied" -msgstr "Đệm ngỏ ra của giao điểm được thẳng thành vào độ đục thay thế nhân trước" +msgstr "Đặt đệm nhớ đầu ra của nút là alpha thẳng (straight alpha), thay vì nhân trước (premultiplied)" msgid "Inpaint" @@ -40589,120 +43614,165 @@ msgstr "Sơn Nội" msgid "Distance to inpaint (number of iterations)" -msgstr "Khoảng cách đến sơn nội (số lượng lặp lại)" +msgstr "Khoảng cách sơn nội (số lần lặp lại)" + + +msgid "Invert Color" +msgstr "Đảo Ngược Màu" msgid "Post Blur" -msgstr "Mờ Hóa Sau" +msgstr "Hậu Trình Nhòe Mờ" msgid "Matte blur size which applies after clipping and dilate/eroding" -msgstr "Kích cỡ mờ hóa lớp che để áp dụng sau cắt ảnh và nở ra/ăn mòn" +msgstr "Kích thước nhòe mờ của lớp vẽ lồng áp dụng sau khi cắt xén (clipping) và giãn ra/xói mòn (dilate/erode)" msgid "Pre Blur" -msgstr "Mờ Hoá Trước" +msgstr "Tiền Trình Nhòe Mờ" msgid "Chroma pre-blur size which applies before running keyer" -msgstr "Kích cỡ màu sắc mờ hóa trước được áp dụng trước bộ trong suốt hóa" +msgstr "Kích thước màu trước khi làm nhòe mờ (pre-blur) để áp dụng trước khi thi thành bộ lọc màu (keyer)" msgid "Clip Black" -msgstr "Cắt Màu Đen" +msgstr "Màu Đen Tách Biệt" msgid "Value of non-scaled matte pixel which considers as fully background pixel" -msgstr "Giá trị của điểm ảnh lớp che không được phóng to để chấp nhận điểm ảnh là điểm ảnh nền hoàn toàn" +msgstr "Giá trị của điểm ảnh lớp vẽ lồng nguyên cỡ (non-scaled) được tính là điểm ảnh hoàn toàn của cảnh nền" msgid "Clip White" -msgstr "Cắt Màu Trắng" +msgstr "Màu Trắng Tách Biệt" msgid "Value of non-scaled matte pixel which considers as fully foreground pixel" -msgstr "Giá trị của điểm ảnh lớp che không được phóng to để chấp nhận điểm ảnh là điểm ảnh cảnh trước hoàn toàn" +msgstr "Giá trị của điểm ảnh lớp vẽ lồng nguyên cỡ (non-scaled) được tính là điểm ảnh hoàn toàn của cảnh trước" msgid "Despill Balance" -msgstr "Thăng Bằng Bất Tràn" +msgstr "Cân Bằng sự Chống Màu Tràn" msgid "Balance between non-key colors used to detect amount of key color to be removed" -msgstr "Thăng bằng giữa màu không trong suốt được dùng cho phát hiện mức màu trong suốt để xóa" +msgstr "Sự cân bằng giữa những màu vô-khóa (non-key) sử dụng để phát hiện lượng màu khóa (key) cần loại bỏ" msgid "Despill Factor" -msgstr "Hệ Số Bất Tràn" +msgstr "Hệ Số Chống Màu Tràn" msgid "Factor of despilling screen color from image" -msgstr "Hế số cho bất tràn màu màn ra ảnh" +msgstr "Hệ số chống màu tràn của màn hình ra ảnh" + + +msgid "Distance to grow/shrink the matte" +msgstr "Khoảng cách để phát triển/thu nhỏ lớp lồng" msgid "Edge Kernel Radius" -msgstr "Bán Kính Hạt Nhân Cạnh" +msgstr "Bán Kính Nhân phát hiện Cạnh" msgid "Radius of kernel used to detect whether pixel belongs to edge" -msgstr "Bán kính của hạt nhân cho phần biềt nếu điểm ảnh là của cạnh" +msgstr "Bán kính của nhân tính toán, sử dụng để phát hiện xem điểm ảnh có trực thuộc đường biên hay không" msgid "Edge Kernel Tolerance" -msgstr "Giới Hạn Hạt Nhân Cạnh" +msgstr "Dung Sai Nhân phát hiện Cạnh" msgid "Tolerance to pixels inside kernel which are treating as belonging to the same plane" -msgstr "Giới hạn (đơn vị điểm ảnh) phía trong hạt nhân thì xem như ở trong cùng mặt phẳng" +msgstr "Dung sai đối với các điểm ảnh, nội bên trong nhân tính toán, để xem chúng như nằm trên cùng một bình diện" msgid "Feather Distance" -msgstr "Khoảng Cách Phe Phẩy" +msgstr "Khoảng Cách Mép Nhòe" msgid "Distance to grow/shrink the feather" -msgstr "Khoảng cách cho nở ra/thu nhỏ phe phẩy" +msgstr "Khoảng cách để mở rộng/thu nhỏ mép nhòe" msgctxt "Curve" msgid "Feather Falloff" -msgstr "Sự Giảm Phe Phẩy" +msgstr "Suy Giảm của Mép Nhòe" msgid "Screen Balance" -msgstr "Thăng Bằng Màn" +msgstr "Cân Bằng Màn Hình" msgid "Balance between two non-primary channels primary channel is comparing against" -msgstr "Thăng bằng giữa hai kênh không chánh đang so sánh với một kênh chánh" +msgstr "Sự cân bằng giữa hai kênh không chủ yếu mà kênh chủ yếu so sánh với" msgid "Keying Screen" -msgstr "Màn Trong Suốt" +msgstr "Khóa Hóa Màn Hình" msgid "Tracking Object" -msgstr "Vật Thể Theo Dõi" +msgstr "Đối Tượng Giám Sát" msgid "Eccentricity" msgstr "Lệch Tâm" +msgid "Controls how directional the filter is. 0 means the filter is completely omnidirectional while 2 means it is maximally directed along the edges of the image" +msgstr "Điều khiển phương pháp định hướng của bộ lọc. 0 có nghĩa là bộ lọc hoàn toàn trên mọi hướng trong khi 2 có nghĩa là nó được hướng tối đa dọc theo các cạnh của hình ảnh" + + +msgid "Controls the sharpness of the filter. 0 means completely smooth while 1 means completely sharp" +msgstr "Điều khiển độ sắc nét của bộ lọc. 0 có nghĩa là hoàn toàn trơn tru trong khi 1 có nghĩa là hoàn toàn sắc nét" + + +msgid "Uniformity" +msgstr "Tính Đồng Nhất" + + +msgid "Controls the uniformity of the direction of the filter. Higher values produces more uniform directions" +msgstr "Điều khiển tính đồng nhất của chiều hướng bộ lọc. Giá trị cao hơn tạo ra chiều hướng đồng nhất hơn" + + +msgid "Variation of Kuwahara filter to use" +msgstr "Biến thể của bộ lọc Kuwahara hòng sử dụng" + + +msgid "Classic" +msgstr "Cổ Điển" + + +msgid "Fast but less accurate variation" +msgstr "Biến thái nhanh song kém chính xác" + + msgid "Anisotropic" msgstr "Dị Hướng" +msgid "Accurate but slower variation" +msgstr "Biến thái chậm hơn song chính xác" + + msgid "Lens Distortion" -msgstr "Sự Méo Héo Thấu Kính" +msgstr "Sự Biến Dạng của Thấu Kính" msgid "For positive distortion factor only: scale image such that black areas are not visible" -msgstr "Chỉ cho trị số méo dương: phóng to ảnh cho ẩn chỗ màu đen" +msgstr "Chỉ dành cho hệ số biến dạng dương mà thôi: đổi tỷ lệ hình ảnh sao cho không nhìn thấy những khu vực màu đen nữa" + + +msgctxt "NodeTree" +msgid "Jitter" +msgstr "Biến Động" msgid "Enable/disable jittering (faster, but also noisier)" -msgstr "Bật/tắt hốt hoảng (lẹ hơn nhưng có huyên náo nhiều hơn)" +msgstr "Bật/tắt biến động (nhanh hơn nhưng nhiễu hơn)" msgid "Projector" @@ -40710,15 +43780,15 @@ msgstr "Máy Chiếu" msgid "Enable/disable projector mode (the effect is applied in horizontal direction only)" -msgstr "Bật/tắt chế độ máy chiếu (chỉ áp dụng hiệu ứng cho hướng ngang)" +msgstr "Bật/tắt chế độ máy chiếu (chỉ áp dụng hiệu ứng theo chiều ngang mà thôi)" msgid "Combined" -msgstr "Gồm Chung" +msgstr "Kết Hợp" msgid "Combined RGB" -msgstr "Gồm RGB" +msgstr "RGB Kết Hợp" msgid "Red Channel" @@ -40730,87 +43800,91 @@ msgstr "Kênh Lục" msgid "Blue Channel" -msgstr "Kênh Xanh" +msgstr "Kênh Lam" msgid "Luminance" -msgstr "Quang Độ" +msgstr "Hừng Sáng" msgid "Luminance Channel" -msgstr "Kênh Quang Độ" +msgstr "Kênh về Độ Sáng (Luminance)" msgid "Luminance Key" -msgstr "Trong Suốt Quang Độ" +msgstr "Khóa về Độ Sáng (Luminance)" msgid "Map Range" -msgstr "Phạm Vi Ánh Xạ" +msgstr "Ánh Xạ Phạm Vi" + + +msgid "Clamp the result of the node to the target range" +msgstr "Hạn định kết quả của nút trong phạm vi mục tiêu" msgid "Map UV" -msgstr "Bản Đồ UV" +msgstr "Ánh Xạ UV" msgid "Map Value" -msgstr "Giá Trị Bản Đồ" +msgstr "Ánh Xạ Giá Trị" msgid "Use Maximum" -msgstr "Dùng Cực Đại" +msgstr "Dùng Tối Đa" msgid "Use Minimum" -msgstr "Dùng Cực Tiểu" +msgstr "Dùng Tối Thiểu" msgid "Number of motion blur samples" -msgstr "Số lượng mẫu vật mờ hóa chuyển động" +msgstr "Lượng mẫu vật lấy để làm nhòe mờ chuyển động" msgid "Shutter" -msgstr "Trập" +msgstr "Cửa Chập" msgid "Exposure for motion blur as a factor of FPS" -msgstr "Hứng cho mờ hóa chuyển động, một hệ số của tốc độ bức ảnh/giây" +msgstr "Độ phơi sáng cho sự làm nhòe mờ chuyển động, theo tần số Khung Hình/Giây" msgid "Size Source" -msgstr "Kích Cỡ Nguồn" +msgstr "Nguồn Kích Thước" msgid "Where to get the mask size from for aspect/size information" -msgstr "Từ đâu lấy kích cỡ mặt nạ cho thông tin tỉ số cạnh/khổ" +msgstr "Nguồn sử dụng để lấy kích thước màn chắn lọc cho thông tin về tỷ lệ tương quan/kích thước" msgid "Scene Size" -msgstr "Kích Cỡ Cảnh" +msgstr "Kích Thước Cảnh" msgid "Use pixel size for the buffer" -msgstr "Dùng kích cỡ điểm ảnh cho đệm" +msgstr "Dùng kích thước điểm ảnh cho bộ đệm" msgid "Fixed/Scene" -msgstr "Bất Biến/Cảnh" +msgstr "Cố Định/Cảnh" msgid "Pixel size scaled by scene percentage" -msgstr "Phóng to điểm ảnh bằng phân trăm cảnh" +msgstr "Cỡ điểm ảnh được tỷ lệ hóa theo lượng phần trăm của cảnh" msgid "Use feather information from the mask" -msgstr "Dùng thông tin phe phẩy từ mặt nạ" +msgstr "Dùng thông tin về mép nhòe từ màn chắn lọc" msgid "Motion Blur" -msgstr "Mờ hóa chuyển động" +msgstr "Làm Nhòe Mờ Chuyển Động" msgid "Use multi-sampled motion blur of the mask" -msgstr "Dùng mờ hóa chuyển động kiểu đa mẫu vật của mặt nạ" +msgstr "Dùng sự nhòe mờ chuyển động đa mẫu vật của màn chắn lọc" msgctxt "NodeTree" @@ -40829,7 +43903,7 @@ msgstr "A + B" msgctxt "NodeTree" msgid "Subtract" -msgstr "Trừ" +msgstr "Khấu Trừ" msgid "A - B" @@ -40856,7 +43930,7 @@ msgstr "A / B" msgctxt "NodeTree" msgid "Multiply Add" -msgstr "Nhân Và Cộng" +msgstr "Nhân Cộng" msgid "A * B + C" @@ -40869,16 +43943,16 @@ msgstr "Lũy Thừa" msgid "A power B" -msgstr "A mũ B" +msgstr "A lũy thừa B" msgctxt "NodeTree" msgid "Logarithm" -msgstr "Log" +msgstr "Logarit" msgid "Logarithm A base B" -msgstr "Log A cơ sở B" +msgstr "Logarít A cơ số B" msgctxt "NodeTree" @@ -40887,25 +43961,25 @@ msgstr "Căn Bậc Hai" msgid "Square root of A" -msgstr "Căn bậc hai của A" +msgstr "Căn Bậc Hai của A" msgctxt "NodeTree" msgid "Inverse Square Root" -msgstr "Căn Bậc Hai Đảo Nghịch" +msgstr "Căn Bậc Hai Nghịch Đảo" msgid "1 / Square root of A" -msgstr "1 / căn bậc hai của A" +msgstr "1 / Căn Bậc Hai của A" msgctxt "NodeTree" msgid "Absolute" -msgstr "Giá Trị Tuyệt Đối" +msgstr "Tuyệt Đối" msgid "Magnitude of A" -msgstr "Độ lớn của A" +msgstr "Cấp số A (giá trị tuyệt đối của A)" msgctxt "NodeTree" @@ -40919,20 +43993,20 @@ msgstr "mũ(A)" msgctxt "NodeTree" msgid "Minimum" -msgstr "Cực Tiểu" +msgstr "Tối Thiểu" msgid "The minimum from A and B" -msgstr "Nhỏ nhất của A và B" +msgstr "Số nhỏ hơn giữa A và B" msgctxt "NodeTree" msgid "Maximum" -msgstr "Cực Đại" +msgstr "Tối Đa" msgid "The maximum from A and B" -msgstr "Lớn nhất của A và B" +msgstr "Số lớn hơn giữa A và B" msgctxt "NodeTree" @@ -40941,7 +44015,7 @@ msgstr "Nhỏ Hơn" msgid "1 if A < B else 0" -msgstr "1 nếu A < B, hoặc = 0" +msgstr "Bằng 1 nếu A < B, nếu không thì bằng 0" msgctxt "NodeTree" @@ -40950,7 +44024,7 @@ msgstr "Lớn Hơn" msgid "1 if A > B else 0" -msgstr "1 nếu A > B, hoặc = 0" +msgstr "Bằng 1 nếu A > B, nếu không thì bằng 0" msgctxt "NodeTree" @@ -40959,70 +44033,70 @@ msgstr "Dấu" msgid "Returns the sign of A" -msgstr "Trả dấu âm/dương của A" +msgstr "Lấy dấu của A" msgctxt "NodeTree" msgid "Compare" -msgstr "So Sánh" +msgstr "So sánh" msgid "1 if (A == B) within tolerance C else 0" -msgstr "1 nếu (A == B) trong phạm vi C, hoặc = 0" +msgstr "1 nếu (A == B) nội trong khoảng dung sai C nếu không thì bằng 0" msgctxt "NodeTree" msgid "Smooth Minimum" -msgstr "Cực Tiểu Mịn" +msgstr "Làm Mịn Tối Thiểu" msgid "The minimum from A and B with smoothing C" -msgstr "Cực tiêu từ A và B với mịn hóa C" +msgstr "Tối thiểu từ A và B, với độ làm mịn C" msgctxt "NodeTree" msgid "Smooth Maximum" -msgstr "Cực Đại Mịn" +msgstr "Làm Mịn Tối Đa" msgid "The maximum from A and B with smoothing C" -msgstr "Cực đại từ A và B với mịn hóa C" +msgstr "Tối đa từ A và B, với độ làm mịn C" msgctxt "NodeTree" msgid "Round" -msgstr "Tròn Số" +msgstr "Làm Tròn Số" msgid "Round A to the nearest integer. Round upward if the fraction part is 0.5" -msgstr "Tròn số A đến số nguyên gần nhất. Tròn số lên nếu phần phân số bằng 0.5 hoặc hơn" +msgstr "Làm tròn số A thành số nguyên gần nhất. Dùng số lớn hơn gần nhất nếu phần thập phân là 0,5" msgctxt "NodeTree" msgid "Floor" -msgstr "Sàn" +msgstr "Làm Tròn Xuống" msgid "The largest integer smaller than or equal A" -msgstr "Số nguyên lớn nhất mà vẫn còn nhỏ hơn hoặc bằng A" +msgstr "Số nguyên lớn nhất song nhỏ hơn hoặc bằng A" msgctxt "NodeTree" msgid "Ceil" -msgstr "Nóc" +msgstr "Làm Tròn Lên" msgid "The smallest integer greater than or equal A" -msgstr "Số nguyên nhỏ nhất nhưng lớn hơn hoặc bằng A" +msgstr "Số nguyên nhỏ nhất song lớn hơn hoặc bằng A" msgctxt "NodeTree" msgid "Truncate" -msgstr "Cắt" +msgstr "Cắt Xén" msgid "The integer part of A, removing fractional digits" -msgstr "Phần số nguyên của A, xóa phần sau dấu chấm (phẩy)" +msgstr "Phần số nguyên của A, loại bỏ các con số ở phần thập phân" msgctxt "NodeTree" @@ -41036,20 +44110,20 @@ msgstr "Phần phân số của A" msgctxt "NodeTree" msgid "Wrap" -msgstr "Lặp Lại" +msgstr "Hàm Tuần Hoàn" msgid "Wrap value to range, wrap(A,B)" -msgstr "Lặp lại giá trị trong phạm vi, wrap(A, B)" +msgstr "Hàm tuần hoàn wrap(A,B) đảo giá trị trong một phạm vi" msgctxt "NodeTree" msgid "Snap" -msgstr "Hút Dính" +msgstr "Bám dính" msgid "Snap to increment, snap(A,B)" -msgstr "Hút dính đến bước, hútDính(A, B)" +msgstr "Bám dính vào phân khoảng gia tăng, snap(A,B)" msgctxt "NodeTree" @@ -41058,7 +44132,7 @@ msgstr "Tới Lùi" msgid "Wraps a value and reverses every other cycle (A,B)" -msgstr "Gói lại một giá trị và trở ngược chiều mỗi chu kỳ lẽ (A, B)" +msgstr "Phản hồi một giá trị và ngược lại trong mỗi chu kỳ nhảy cách (A,B)" msgctxt "NodeTree" @@ -41121,7 +44195,7 @@ msgstr "Arctan2" msgid "The signed angle arctan(A / B)" -msgstr "Góc có dấu của arctan(A/B)" +msgstr "Góc arctan(A / B) âm hoặc dương" msgctxt "NodeTree" @@ -41153,11 +44227,11 @@ msgstr "tanh(A)" msgctxt "NodeTree" msgid "To Radians" -msgstr "Sang Rađian" +msgstr "Sang Rad" msgid "Convert from degrees to radians" -msgstr "Chuyển từ độ sang rađian" +msgstr "Chuyển đổi từ độ sang rad" msgctxt "NodeTree" @@ -41166,35 +44240,35 @@ msgstr "Sang Độ" msgid "Convert from radians to degrees" -msgstr "Chuyển từ rađian sang độ" +msgstr "Chuyển đổi từ rad sang độ" msgid "Clamp result of the node to 0.0 to 1.0 range" -msgstr "Kẹp lại kết qủa của giao điểm trong phạm vi 0 đến 1" +msgstr "Giới hạn kết quả của nút, chỉ cho phép nằm trong phạm vi 0,0 đến 1,0 mà thôi" msgid "Include alpha of second input in this operation" -msgstr "Dùng độ đục của ngõ vào thứ hai cho thao tác này" +msgstr "Sử dụng alpha của đầu vào thứ hai cho thao tác này" msgid "Movie Distortion" -msgstr "Sự Méo Hóa Phim" +msgstr "Biến Dạng Phim" msgid "Distortion to use to filter image" -msgstr "Dùng sự méo hóa nào cho lọc ảnh" +msgstr "Phương pháp biến dạng sử dụng cho hình ảnh" msgid "File Output" -msgstr "Ngõ Ra Tập Tin" +msgstr "Xuất Ra Tập Tin" msgid "Active Input Index" -msgstr "Chỉ Số Ngõ Vào Hoạt Động" +msgstr "Chỉ Số Đầu Vào đang Hoạt Động" msgid "Active input index in details view list" -msgstr "Chỉ số ngõ vào hoạt động trong danh sách màn chi tiết" +msgstr "Chỉ số đầu vào đang hoạt động trong danh sách góc nhìn chi tiết" msgid "Base Path" @@ -41202,7 +44276,7 @@ msgstr "Đường Dẫn Cơ Sở" msgid "Base output path for the image" -msgstr "Đường dẫn cơ sở cho ảnh" +msgstr "Đường dẫn xuất cơ sở cho hình ảnh" msgid "File Slots" @@ -41210,15 +44284,15 @@ msgstr "Khe Tập Tin" msgid "EXR Layer Slots" -msgstr "Khe Lớp EXR" +msgstr "Khe Tầng Lớp của EXR" msgid "Pixelate" -msgstr "Điểm Ảnh Hóa" +msgstr "Làm Thô Điểm Ảnh" msgid "Plane Track Deform" -msgstr "Sự Méo Hóa Mặt Phẳng Theo Dõi" +msgstr "Biến Dạng Bình Diện Giám Sát" msgid "Posterize" @@ -41226,55 +44300,55 @@ msgstr "Áp Phích Hóa" msgid "Alpha Convert" -msgstr "Biến Đổi Độ Đục" +msgstr "Chuyển Đổi Alpha" msgid "Conversion between premultiplied alpha and key alpha" -msgstr "Biến đổi giữa đã nhân độ đục trước và độ đục trong suốt" +msgstr "Chuyển đổi giữa alpha nhân trước và alpha khóa (key alpha)" msgid "To Premultiplied" -msgstr "Sang Đã Nhân Trước" +msgstr "Thành Alpha Nhân Trước" msgid "Convert straight to premultiplied" -msgstr "Đổi thằng sang đã nhân trước" +msgstr "Biến đổi alpha thẳng sang alpha nhân trước" msgid "To Straight" -msgstr "Sang Thẳng" +msgstr "Thành Alpha Thẳng" msgid "Convert premultiplied to straight" -msgstr "Đổi đã nhân trước sang thẳng" +msgstr "Chuyển đổi alpha nhân trước sang alpha thẳng" msgid "RGB to BW" -msgstr "RGB Sang Trắng Đen" +msgstr "RGB sang Trắng/Đen" msgid "Render Layers" -msgstr "Lớp Kết Xuất" +msgstr "Các Tầng Kết Xuất" msgid "Rotate" -msgstr "Xoay" +msgstr "Xoay Chiều" msgid "Method to use to filter rotation" -msgstr "Phương pháp cho dùng xoay bộ lọc" +msgstr "Phương pháp sử dụng để nội suy sự xoay chiều" msgid "Offset image horizontally (factor of image size)" -msgstr "Dịch ảnh ngang (phân số của khổ ảnh)" +msgstr "Dịch chuyển hình ảnh theo chiều ngang (khoảng cách là một phân số kích thước của hình ảnh)" msgid "Offset image vertically (factor of image size)" -msgstr "Dịch ảnh dọc (phân số của khổ ảnh)" +msgstr "Dịch chuyển hình ảnh theo chiều dọc (khoảng cách là một phân số kích thước của hình ảnh)" msgid "Coordinate space to scale relative to" -msgstr "Phóng to tương đối với không gian tọa độ nào" +msgstr "Không gian tọa độ để đổi tỷ lệ tương đối với" msgid "Scene Time" @@ -41282,47 +44356,47 @@ msgstr "Thời Gian Cảnh" msgid "Separate HSVA" -msgstr "Chẻ HSVA" +msgstr "Tách Phân HSVA" msgid "Separate RGBA" -msgstr "Chẻ RGBA" +msgstr "Tách Phân RGBA" msgid "Separate YCbCrA" -msgstr "Chẻ YCbCrA" +msgstr "Tách Phân YCbCrA" msgid "Separate YUVA" -msgstr "Chẻ YUVA" +msgstr "Tách Phân YUVA" msgid "Separate Color" -msgstr "Chẻ Màu" +msgstr "Tách Phân Màu" msgid "Separate XYZ" -msgstr "Chẻ XYZ" +msgstr "Tách Phân XYZ" msgid "Set Alpha" -msgstr "Đặt Độ Đục" +msgstr "Đặt Alpha" msgid "Apply Mask" -msgstr "Áp Dụng Mặt Nạ" +msgstr "Áp Dụng Chắn Lọc" msgid "Multiply the input image's RGBA channels by the alpha input value" -msgstr "Nhân các kênh của ảnh RGBA ngõ vào với giá trị ngõ vào độ đục" +msgstr "Nhân các kênh của hình ảnh RGBA ở đầu vào với giá trị alpha cung cấp" msgid "Replace Alpha" -msgstr "Thay Thế Độ Đục" +msgstr "Thay Thế Alpha" msgid "Replace the input image's alpha channel by the alpha input value" -msgstr "Thay thế cho kênh độ đục ngõ vào của ảnh RGBA bằng giá trị ngõ vào độ đục" +msgstr "Thay thế kênh alpha của hình ảnh đầu vào bằng giá trị đầu vào alpha" msgid "Stabilize 2D" @@ -41330,11 +44404,11 @@ msgstr "Ổn Định Hóa 2D" msgid "Method to use to filter stabilization" -msgstr "Phương pháp dùng cho lọc sự ổn định hóa" +msgstr "Phương pháp sử dụng để nội suy sự ổn định hóa" msgid "Invert stabilization to re-introduce motion to the frame" -msgstr "Lật sự ổn định hóa cho khung chuyển động lại" +msgstr "Đảo nghịch ảnh hưởng của ổn định hóa, hòng làm cho khung chuyển động lại (như cũ)" msgid "Sun Beams" @@ -41342,35 +44416,35 @@ msgstr "Tia Nắng" msgid "Ray Length" -msgstr "Độ Dài Tia" +msgstr "Chiều Dài của Tia Xạ" msgid "Length of rays as a factor of the image size" -msgstr "Độ dài của tia (phần số của khổ ảnh)" +msgstr "Độ dài của các tia xạ là một thừa số của kích thước hình ảnh" msgid "Source point of rays as a factor of the image width and height" -msgstr "Điểm nguồn của tia là phân số của bề rộng và bề cao ảnh" +msgstr "Điểm các tia xạ nguồn là một thừa số trong chiều rộng và chiều cao của hình ảnh" msgid "Switch" -msgstr "Công Tắt" +msgstr "Chuyển Mạch" msgid "Off: first socket, On: second socket" -msgstr "Tắt: ổ cắm thứ nhất, Bật: ổ cắm thứ nhị" +msgstr "Tắt: ổ cắm thứ nhất, Mở: ổ cắm thứ nhì" msgid "Switch View" -msgstr "Trao Đổi Màn" +msgstr "Đổi Kiểu Quan Sát" msgid "Node Output" -msgstr "Ngỏ Ra Giao Điểm" +msgstr "Đầu Ra của Nút" msgid "For node-based textures, which output node to use" -msgstr "Cho chất liệu cơ sở giao điểm, dùng giao điểm nào cho làm ngõ ra" +msgstr "Dành cho các chất liệu cơ sở nút: đầu ra nào của nút sẽ sử dụng" msgid "Time Curve" @@ -41378,115 +44452,123 @@ msgstr "Đường Cong Thời Gian" msgid "Tonemap" -msgstr "Bản Đồ Xám" +msgstr "Điều Chỉnh Sắc Thái" msgid "Adaptation" -msgstr "Ứng Phó" +msgstr "Thích Nghi/Tùy Ứng" msgid "If 0, global; if 1, based on pixel intensity" -msgstr "Nếu 0, toàn cầu; nếu 1, tùy cường độ điểm ảnh" +msgstr "Nếu là 0 thì là toàn cầu; nếu là 1 thì dựa trên cường độ của điểm ảnh" msgid "Set to 0 to use estimate from input image" -msgstr "Đặt = 0 cho dùng dự đoán từ ảnh ngõ vào" +msgstr "Đặt là 0 để sử dụng sự dự đoán từ hình ảnh cung cấp ở đầu vào" msgid "If 0, same for all channels; if 1, each independent" -msgstr "Nếu 0, giống cho hết kênh; nếu 1, mỗi cái đọc lập" +msgstr "Nếu là 0 thì toàn bộ các kênh đều tương tự; nếu là 1 thì mỗi cái đứng riêng độc lập" msgid "If not used, set to 1" -msgstr "Nếu không dùng, đặt = 1" +msgstr "Nếu không sử dụng thì đặt là 1" msgid "If less than zero, darkens image; otherwise, makes it brighter" -msgstr "Nếu ít hơn 0, làm ảnh tối hơn; hơn 0 làm ảnh sáng hơn" +msgstr "Nếu ít hơn 0 thì sẽ làm tối hình ảnh đi; nếu không, sẽ làm sáng lên" msgid "The value the average luminance is mapped to" -msgstr "Ánh xạ quang độ trung bình đến giá trị nào" +msgstr "Độ sáng trung bình sẽ được ánh xạ thành giá trị này" msgid "Normally always 1, but can be used as an extra control to alter the brightness curve" -msgstr "Thường bằng 1 nhưng có thể dùng một phương pháp thêm cho giúp điều khiển đường cong độ sáng" +msgstr "Thường thì luôn luôn là 1, song có thể sử dụng như một điều chế bổ sung để thay đổi đường cong về độ sáng" msgid "Tonemap Type" -msgstr "Loại Bản Đồ Xám" +msgstr "Phương Pháp Điều Chỉnh Sắc Thái" msgid "R/D Photoreceptor" -msgstr "Cảm Biến Ảnh Sáng R/D" +msgstr "Tế bào cảm nhận ánh sáng - R/D" + + +msgid "More advanced algorithm based on eye physiology, by Reinhard and Devlin" +msgstr "Thuật toán cao cấp hơn dựa trên sinh lý học của con mắt, bởi Reinhard và Devlin" msgid "Rh Simple" -msgstr "Rh Đơn Giản" +msgstr "Phương Pháp Đơn Giản - Rh" + + +msgid "Simpler photographic algorithm by Reinhard" +msgstr "Thuật toán nhiếp ảnh đơn giản hơn của Reinhard" msgid "Track Position" -msgstr "Vị Trí Đường Vết" +msgstr "Vị Trí của Giám Sát" msgid "Frame to be used for relative position" -msgstr "Dùng bức ảnh nào cho vị trí tương đối" +msgstr "Khung hình sử dụng cho vị trí tương đối" msgid "Which marker position to use for output" -msgstr "Dùng vị trí kỳ hiệu nào cho ngõ ra" +msgstr "Xuất loại vị trí dấu mốc nào" msgid "Output absolute position of a marker" -msgstr "Xuất vị trí tuyệt đối của ký hiệu" +msgstr "Xuất vị trí tuyệt đối của một dấu mốc" msgid "Relative Start" -msgstr "Tương Đối Đầu" +msgstr "Khởi Đầu Tương Đối" msgid "Output position of a marker relative to first marker of a track" -msgstr "Xuất vị trí của một ký hiệu tương đối với ký hiệu đầu một đường vết" +msgstr "Trích xuất vị trí của một dấu mốc tương đối với dấu mốc đầu tiên của một giám sát" msgid "Relative Frame" -msgstr "Bức Ảnh Tương Đối" +msgstr "Khung Hình Tương Đối" msgid "Output position of a marker relative to marker at given frame number" -msgstr "Xuất vị trí của ký hiệu tương đối với ký hiệu tại số bức ảnh được chọn" +msgstr "Trích xuất vị trí của dấu mốc tương đối với dấu mốc tại một khung hình số đã cho" msgid "Absolute Frame" -msgstr "Bức Ảnh Tuyệt Đối" +msgstr "Khung Hình Tuyệt Đối" msgid "Output absolute position of a marker at given frame number" -msgstr "Xuất vị trí tuyệt đối của ký hiệu cho ký hiệu tại số bức ảnh được chọn" +msgstr "Trích xuất vị trí tuyệt đối của dấu mốc tại khung hình số đã cho" msgid "Method to use to filter transform" -msgstr "Phương pháp cho lọc biến hóa" +msgstr "Phương pháp sử dụng để nội suy biến hóa" msgid "Translate" -msgstr "Dịch" +msgstr "Dịch Chuyển" msgid "Use relative (fraction of input image size) values to define translation" -msgstr "Giá trị tương đối (phân số của ảnh ngõ vào) để đặt dịch" +msgstr "Sử dụng các giá trị tương đối (phân số kích thước của hình ảnh cung cấp) để định nghĩa sự dịch chuyển" msgid "Wrapping" -msgstr "Gói Lại" +msgstr "Lặp Lại" msgid "Wrap image on a specific axis" -msgstr "Gói lại ảnh trên một trục xác định" +msgstr "Nhắc lại hình ảnh trên một trục chỉ định" msgid "No wrapping on X and Y" -msgstr "Không gói X và Y" +msgstr "Không nhắc lại trên X và Y" msgid "X Axis" @@ -41494,7 +44576,7 @@ msgstr "Trục X" msgid "Wrap all pixels on the X axis" -msgstr "Gói lại hết điểm ảnh trên trục X" +msgstr "Nhắc lại toàn bộ các điểm ảnh trên trục X" msgid "Y Axis" @@ -41502,47 +44584,47 @@ msgstr "Trục Y" msgid "Wrap all pixels on the Y axis" -msgstr "Gói lại hết điểm ảnh trên trục Y" +msgstr "Nhắc lại toàn bộ các điểm ảnh trên trục Y" msgid "Both Axes" -msgstr "Cá Hai Trục" +msgstr "Cả Hai Trục" msgid "Wrap all pixels on both axes" -msgstr "Gói lại hết điểm ảnh trên hai trục" +msgstr "Nhắc lại toàn bộ các điểm ảnh trên cả hai trục" msgid "Vector Blur" -msgstr "Mờ Hóa Vectơ" +msgstr "Nhòe Mờ Véctơ" msgid "Blur Factor" -msgstr "Hệ Số Mờ Hóa" +msgstr "Hệ Số Nhòe Mờ" msgid "Scaling factor for motion vectors (actually, 'shutter speed', in frames)" -msgstr "Hệ số phóng to cho vectơ cuyển động (thật sự 'tốc độ trập' bằng bức ảnh)" +msgstr "Hệ số tỷ lệ cho các vectơ về chuyển động (thực ra là 'tốc độ cửa chập', trong số khung hình)" msgid "Max Speed" -msgstr "Tốc Độ Cực Đại" +msgstr "Tốc Độ Tối Đa" msgid "Maximum speed, or zero for none" -msgstr "Tốc độ cực đại, đặt = 0 cho không có" +msgstr "Tốc độ tối đa, hoặc đặt bằng 0 nghĩa là không có" msgid "Min Speed" -msgstr "Tốc Độ Cực Tiểu" +msgstr "Tốt Độ Tối Thiểu" msgid "Minimum speed for a pixel to be blurred (used to separate background from foreground)" -msgstr "Tốc độ cực tiểu cho mờ hóa một điểm ảnh (dùng cho chẻ nền từ cảnh trước)" +msgstr "Tốc độ tối thiểu để làm cho điểm ảnh bị nhòe đi (dùng để tách biệt nền ra khỏi cảnh trước)" msgid "Interpolate between frames in a Bezier curve, rather than linearly" -msgstr "Suy nội bức ảnh giữa bằng cong Bezier, thay thế dùng đường thẳng" +msgstr "Nội suy các khung hình nằm giữa dùng đường cong Bezier, thay vì theo đường tiếp tuyến" msgid "Tile Order" @@ -41550,7 +44632,7 @@ msgstr "Thứ Tự Ô" msgid "Tile order" -msgstr "Thứ tự Ô" +msgstr "Thứ tự ô" msgid "Expand from center" @@ -41558,31 +44640,31 @@ msgstr "Mở rộng từ trung tâm" msgid "Random tiles" -msgstr "Ô ngẫu nhiên" +msgstr "Ô sắp đặt ngẫu nhiên" msgid "Bottom Up" -msgstr "Dưới Trên" +msgstr "Dưới Lên" msgid "Expand from bottom" -msgstr "Mở rộng từ dưới" +msgstr "Tính từ dưới lên" msgid "Rule of Thirds" -msgstr "Định luật Một Phần Ba" +msgstr "Quy Tắc Một Phần Ba" msgid "Expand from 9 places" -msgstr "Mở rộng từ 9 chỗ" +msgstr "Tính từ 9 chỗ" msgid "Z Combine" -msgstr "Gồm Z" +msgstr "Kết Hợp Z" msgid "Take alpha channel into account when doing the Z operation" -msgstr "Gồm kênh độ đục khi làm thao tác Z" +msgstr "Cân nhắc đến kênh alpha khi thi hành thao tác về Z" msgid "Anti-Alias Z" @@ -41590,43 +44672,43 @@ msgstr "Khử Răng Cưa Z" msgid "Anti-alias the z-buffer to try to avoid artifacts, mostly useful for Blender renders" -msgstr "Khử răng cưa đệm-Z cho tránh lỗi lầm, lợi ích nhiều nhất cho kết xuất kiểu Blender" +msgstr "Khử răng cưa bộ nhớ đệm-Z để cố gắng tránh giả tượng, lợi ích nhiều nhất cho các kết xuất Blender" msgid "Function Node" -msgstr "Giao Điểm Hàm Số" +msgstr "Nút Hàm" msgid "Align Euler to Vector" -msgstr "Sắp hàng Euler Đến Vectơ" +msgstr "Căn Chỉnh Euler theo Véctơ" msgid "Axis to align to the vector" -msgstr "Trục sắp hàng với vectơ" +msgstr "Trục để căn chỉnh theo véctơ" msgid "Align the X axis with the vector" -msgstr "Sắp hàng trục X với vectơ" +msgstr "Căn chỉnh trục X theo véctơ" msgid "Align the Y axis with the vector" -msgstr "Sắp hàng trục Y với vectơ" +msgstr "Căn chỉnh trục Y theo véctơ" msgid "Align the Z axis with the vector" -msgstr "Sắp hàng trục Z với vectơ" +msgstr "Căn chỉnh trục Z theo véctơ" msgid "Pivot Axis" -msgstr "Trục Điểm Tựa" +msgstr "Trục Tựa" msgid "Axis to rotate around" -msgstr "Trục để xoay quanh" +msgstr "Trục để xoay xung quanh" msgid "Automatically detect the best rotation axis to rotate towards the vector" -msgstr "Tự động phát hiện trục xoay tốt nhất cho xoay đến vectơ" +msgstr "Tự động phát hiện trục quay tốt nhất để xoay về phía véctơ" msgid "Rotate around the local X axis" @@ -41641,6 +44723,10 @@ msgid "Rotate around the local Z axis" msgstr "Xoay quanh trục Z địa phương" +msgid "Axis Angle to Rotation" +msgstr "Góc Trục sang Xoay Chiều" + + msgid "Boolean Math" msgstr "Toán Bool" @@ -41650,7 +44736,7 @@ msgstr "Và" msgid "True when both inputs are true" -msgstr "Đúng khi cả hai ngõ vào là đúng" +msgstr "'Đúng' khi cả hai nguồn đầu vào là 'đúng'" msgid "Or" @@ -41658,11 +44744,11 @@ msgstr "Hoặc" msgid "True when at least one input is true" -msgstr "Đúng khi ít nhất một ngõ vào là đúng" +msgstr "'Đúng' khi ít nhất một nguồn đầu vào là 'đúng'" msgid "Opposite of the input" -msgstr "Đảo nghịch ngõ vào" +msgstr "Đảo nghịch của đầu vào" msgid "Not And" @@ -41670,15 +44756,15 @@ msgstr "Không Và" msgid "True when at least one input is false" -msgstr "Đúng khi có ít nhất một ngõ vào là sai" +msgstr "'Đúng' khi ít nhất một trong hai nguồn đầu vào là 'Sai'" msgid "Nor" -msgstr "Không Hoặc" +msgstr "Phủ Định Hoặc" msgid "True when both inputs are false" -msgstr "Đúng khi cả hai ngõ vào là sai" +msgstr "'Đúng' khi cả hai nguồn đầu vào là sai" msgid "Equal" @@ -41686,15 +44772,15 @@ msgstr "Bằng Nhau" msgid "True when both inputs are equal (exclusive nor)" -msgstr "Đúng khi cả hai ngõ vào bằng nhau (không hặc loại trừ)" +msgstr "'Đúng' khi cả hai nguồn đầu vào bằng nhau (NOR độc quyền)" msgid "Not Equal" -msgstr "Khác Nhau" +msgstr "Không Bằng Nhau" msgid "True when both inputs are different (exclusive or)" -msgstr "Đúng khi cả hai ngõ khác nhau (hoặc trừ loại)" +msgstr "'Đúng' khi cả hai nguồn đầu vào khác bằng nhau (OR độc quyền)" msgid "Imply" @@ -41702,11 +44788,11 @@ msgstr "Ngụ Ý" msgid "True unless the first input is true and the second is false" -msgstr "Đúng trừ khi ngõ vào thứ nhất là đúng và thứ hai là sai" +msgstr "'Đúng' khi nguồn đầu vào thứ nhất là đúng và nguồn đầu vào thứ hai là sai" msgid "True when the first input is true and the second is false (not imply)" -msgstr "Đúng trừ khi ngõ vào thứ nhất là đúng và thứ hai là sai (không nhụ ý)" +msgstr "'Đúng' khi nguồn đầu vào thứ nhất là đúng và nguồn đầu vào thứ hai là sai (không suy ra)" msgid "Compare" @@ -41714,23 +44800,23 @@ msgstr "So Sánh" msgid "Input Type" -msgstr "Loại Ngõ Vào" +msgstr "Thể Loại Đầu Vào" msgid "Element-Wise" -msgstr "Từng Phần Tử" +msgstr "Theo Phần Tử" msgid "Compare each element of the input vectors" -msgstr "So sánh từng phần tử của vectơ ngõ vào" +msgstr "So sánh từng phần tử của các vectơ đầu vào" msgid "Compare the length of the input vectors" -msgstr "So sánh đồ lớn của vectơ ngõ vào" +msgstr "So sánh độ dài của các vectơ đầu vào" msgid "Compare the average of the input vectors elements" -msgstr "So sánh giá trị trung bình của phần tử của vectơ ngõ vào" +msgstr "So sánh giá trị trung bình của các phần tử vectơ đầu vào" msgid "Dot Product" @@ -41738,11 +44824,11 @@ msgstr "Tích Vô Hướng" msgid "Compare the dot products of the input vectors" -msgstr "So sánh tích vô hướng của vectơ ngõ vào" +msgstr "So sánh tích vô hướng của các vectơ đầu vào" msgid "Compare the direction of the input vectors" -msgstr "So sánh hướng của vectơ ngõ vào" +msgstr "So sánh chiều hướng của các vectơ đầu vào" msgid "Less Than" @@ -41750,15 +44836,15 @@ msgstr "Nhỏ Hơn" msgid "True when the first input is smaller than second input" -msgstr "Đúng khi ngõ vào thứ nhất nhỏ hơn ngõ vào thứ hai" +msgstr "Cho kết quả 'Đúng' khi nguồn đầu vào thứ nhất nhỏ hơn nguồn đầu vào thứ hai" msgid "Less Than or Equal" -msgstr "Nhỏ Hơn hay Bằng" +msgstr "Nhỏ Hơn hoặc Bằng Nhau" msgid "True when the first input is smaller than the second input or equal" -msgstr "Đúng khi ngõ vào thứ nhất nhõ hơn hoặc bằng ngõ vào thứ hai" +msgstr "'Đúng' khi nguồn đầu vào thứ nhất nhỏ hơn nguồn đầu vào thứ hai, hoặc cả hai bằng nhau" msgid "Greater Than" @@ -41766,23 +44852,23 @@ msgstr "Lớn Hơn" msgid "True when the first input is greater than the second input" -msgstr "Đúng khi ngõ vào thứ nhất lớn hơn ngõ vào thứ hai" +msgstr "'Đúng' khi nguồn đầu vào thứ nhất lớn hơn nguồn đầu vào thứ hai" msgid "Greater Than or Equal" -msgstr "Lớn Hơn hay Bằng" +msgstr "Lớn Hơn hoặc Bằng Nhau" msgid "True when the first input is greater than the second input or equal" -msgstr "Đúng khi ngõ vào thứ nhất lớn hơn hoặc bằng ngõ vào thứ hai" +msgstr "'Đúng' khi nguồn đầu vào thứ nhất lớn hơn nguồn đầu vào thứ hai, hoặc cả hai bằng nhau" msgid "True when both inputs are approximately equal" -msgstr "Đúng khi cả hai ngõ vào xấp xỉ bằng nhau" +msgstr "'Đúng' khi cả hai nguồn đầu vào xấp xỉ bằng nhau" msgid "True when both inputs are not approximately equal" -msgstr "Đúng khi cả hai ngõ vào không xấp xỉ bằng nhau" +msgstr "'Đúng' khi cả hai nguồn đầu vào không xấp xỉ bằng nhau" msgid "Brighter" @@ -41790,7 +44876,7 @@ msgstr "Sáng Hơn" msgid "True when the first input is brighter" -msgstr "Đúng khi ngõ vào thứ nhất là sáng hơn" +msgstr "'Đúng' khi đầu vào thứ nhất sáng hơn" msgid "Darker" @@ -41798,35 +44884,57 @@ msgstr "Tối Hơn" msgid "True when the first input is darker" -msgstr "Đúng khi ngõ vào thứ nhất là tối hơn" +msgstr "'Đúng' khi đầu vào thứ nhất là tối hơn" + + +msgid "Euler to Rotation" +msgstr "Euler sang Xoay Chiều" msgid "Float to Integer" -msgstr "Số Thật sang Số Nguyên" +msgstr "Số Thực sang Số Nguyên" + + +msgctxt "NodeTree" +msgid "Rounding Mode" +msgstr "Chế Độ Làm Tròn" msgid "Method used to convert the float to an integer" -msgstr "Phương pháp dùng cho biến đổi số thật sang số nguyên" +msgstr "Phương pháp sử dụng để chuyển đổi số thực thành số nguyên" msgid "Round the float up or down to the nearest integer" -msgstr "Tròn số thật lên hay xuống đến số nguyên gần nhất" +msgstr "Làm tròn số thực lên hoặc xuống số nguyên gần nhất" msgid "Round the float down to the next smallest integer" -msgstr "Tròn số thật xuống đến số nguyên gần nhất" +msgstr "Làm tròn số thực xuống số nguyên nhỏ nhất tiếp theo" + + +msgctxt "NodeTree" +msgid "Ceiling" +msgstr "Làm Tròn Lên" msgid "Round the float up to the next largest integer" -msgstr "Tròn số thật lên đến số nguyên gần nhất" +msgstr "Làm tròn số thực lên số nguyên lớn nhất tiếp theo" msgid "Round the float to the closest integer in the direction of zero (floor if positive; ceiling if negative)" -msgstr "Tròn số thật đến số nguyên gần nhất hướng số không (sàn nếu dương; nóc nếu âm)" +msgstr "Làm tròn số thực đến số nguyên gần nhất về hướng 0 (floor (xuống) nếu dương; ceiling (lên) nếu âm)" msgid "Input value used for unconnected socket" -msgstr "Ngõ vào dùng cho ổ cắm chưa liên kết" +msgstr "Giá trị đầu vào được sử dụng cho ổ cắm chưa kết nối" + + +msgid "Invert Rotation" +msgstr "Đảo Ngược Xoay Chiều" + + +msgid "Quaternion to Rotation" +msgstr "Quaternion sang Xoay Chiều" msgid "Random Value" @@ -41834,59 +44942,75 @@ msgstr "Giá Trị Ngẫu Nhiên" msgid "Replace String" -msgstr "Thay Thế Sợi Dây" +msgstr "Thay Thế Chuỗi Ký Tự" msgid "Rotate Euler" -msgstr "Xoay Euler" +msgstr "Xoay Chiều Euler" msgid "Base orientation for rotation" -msgstr "Định hướng cơ sở cho xoay" +msgstr "Định hướng cơ sở cho xoay chiều" msgid "Rotate the input rotation in the local space of the object" -msgstr "Quay xoay ngõ vào trong không gian địa phương của vật thể" +msgstr "Thực hiện xoay chiều ở đầu vào trong không gian địa phương của đối tượng" msgid "Rotate the input rotation in its local space" -msgstr "Quay xoay ngõ vào trong không gian địa phương của nó" +msgstr "Thực hiện xoay chiều ở đầu vào trong không gian địa phương của nó" msgid "Method used to describe the rotation" -msgstr "Phương pháp cho áp dụng xoay" +msgstr "Phương pháp sử dụng để mô tả sự xoay chiều" msgid "Rotate around an axis by an angle" -msgstr "Xoay quanh một trục bằng một góc" +msgstr "Xoay chung quanh trục một góc độ" msgid "Rotate around the X, Y, and Z axes" -msgstr "Xoay quanh trục X, Y, và Z" +msgstr "Xoay quanh các trục X, Y, và Z" + + +msgid "Rotate Vector" +msgstr "Xoay Chiều Véctơ" + + +msgid "Rotation to Axis Angle" +msgstr "Xoay Chiều sang Góc Trục" + + +msgid "Rotation to Euler" +msgstr "Xoay Chiều sang Euler" + + +msgid "Rotation to Quaternion" +msgstr "Xoay Chiều sang Quaternion" msgid "Slice String" -msgstr "Cắt Sợi Dây" +msgstr "Phân Cắt Chuỗi Ký Tự" msgid "String Length" -msgstr "Bề Dài Sợi Dây" +msgstr "Chiều Dài Chuỗi Ký Tự" msgid "Value to String" -msgstr "Giá trị đến Xâu" +msgstr "Giá Trị thành Chuỗi Ký Tự" msgid "Geometry Node" -msgstr "Giao Điểm Hình Dạng" +msgstr "Nút Hình Học" msgid "Accumulate Field" -msgstr "Trường Góp" +msgstr "Tích Lũy Trường" msgid "Add the values of an evaluated field together and output the running total for each element" -msgstr "Cộng với nahu các giá trị của một trường được tính toán và xuất tổng số cho mỗi phần tử" +msgstr "Thêm các giá trị của một trường đã được đánh giá lại với nhau và xuất tổng số đang thâu tóm ra cho mỗi phần tử" msgid "Domain Size" @@ -41894,7 +45018,7 @@ msgstr "Kích Thước Phạm Vi" msgid "Retrieve the number of elements in a geometry for each attribute domain" -msgstr "Tính số lượng phần tử trong một hình dạng cho mỗi phạm vi của đặc điểm" +msgstr "Trích xuất số lượng phần tử trong một hình học cho mỗi phạm vi thuộc tính" msgid "Component" @@ -41902,211 +45026,259 @@ msgstr "Thành Phần" msgid "Mesh component containing point, corner, edge and face data" -msgstr "Thành phần mạng lưới chứa dữ liệu điểm, góc giác, cánh và mặt" +msgstr "Thành phần khung lưới chứa dữ liệu điểm, góc, cạnh và Mặt" msgid "Point cloud component containing only point data" -msgstr "Thầnh phần mây điểm chỉ chứa dữ liệu điểm" +msgstr "Thành phần đám mây điểm chỉ chứa dữ liệu điểm mà thôi" msgid "Curve component containing spline and control point data" -msgstr "Thành phần đường cong đang chứa dữ liệu mẫu cong và điểm" +msgstr "Thành phần đường cong có chứa chốt trục và dữ liệu điểm điều khiển" msgid "Instances of objects or collections" -msgstr "Thực thể của các vật thể hay sưu tập" +msgstr "Thực thể của đối tượng hoặc của bộ sưu tập" msgid "Attribute Statistic" -msgstr "Thống Kê Đặc Điểm" +msgstr "Thống Kê Thuộc Tính" msgid "Calculate statistics about a data set from a field evaluated on a geometry" -msgstr "Tính thống kê về một tập hợp dữ liệu từ một tường được tính toán trên một hình dạng" +msgstr "Tính toán thống kê về tập dữ liệu từ một trường đã được đánh giá trên một hình học" msgid "The data type the attribute is converted to before calculating the results" -msgstr "Đặc điểm được biến đổi thành kiểu dữ liệu nào trước tính kết qủa" +msgstr "Kiểu dữ liệu mà thuộc tính được chuyển đổi thành, trước khi tính toán các kết quả" msgid "Which domain to read the data from" -msgstr "Nhập dữ liệu từ phạm vi nào" +msgstr "Tên miền (phạm vi), nơi cần phải đọc dữ liệu từ đó ra" + + +msgid "Blur Attribute" +msgstr "Thuộc Tính Làm Nhòe Mờ" + + +msgid "Mix attribute values of neighboring elements" +msgstr "Hòa trộn các giá trị thuộc tính của những phần tử lân cận" msgid "Calculate the limits of a geometry's positions and generate a box mesh with those dimensions" -msgstr "Tính giới hạn của các vị trí của một hình dạng và chế tạo một mạng lưới hộp có cơ thước giống" +msgstr "Tính giới hạn các vị trí của một hình học và tạo ra một khung lưới hình hộp với các kích thước đó" msgid "Capture Attribute" -msgstr "Bắt Đặc Điểm" +msgstr "Nắm Bắt Thuộc Tính" msgid "Store the result of a field on a geometry and output the data as a node socket. Allows remembering or interpolating data as the geometry changes, such as positions before deformation" -msgstr "Chứa kết qủa của một trường trên một hình dạng và xuất dữ liệu bằng một khe giao điểm. Nó cho nhớ lại hay nội suy dữ liệu khi hình dạng biến đổi, như ví trị trước méo hóa" +msgstr "Lưu trữ kết quả của một trường trên một hình học và xuất dữ liệu dưới dạng một ổ cắm nút. Cho phép ghi nhớ hoặc nội suy dữ liệu khi hình học thay đổi, chẳng hạn như vị trí trước khi biến dạng" msgid "Which domain to store the data in" -msgstr "Chứa dữ liệu trong phạm vi nào" +msgstr "Tên miền (phạm vi), nơi sẽ lưu trữ dữ liệu vào đó" msgid "Collection Info" -msgstr "Thông Tin Sưu Tập" +msgstr "Thông Tin Bộ Sưu Tập" + + +msgid "Retrieve geometry instances from a collection" +msgstr "Trích xuất các thực thể hình học từ một bộ sưu tập" + + +msgid "The transformation of the instances output. Does not affect the internal geometry" +msgstr "Biến hóa của đầu ra thực thể. Không tác động gì đến hình học bên trong" msgid "Original" -msgstr "Ban Đầu" +msgstr "Gốc/Nguyên Bản" msgid "Output the geometry relative to the collection offset" -msgstr "Xuất hình dạng tương đối với dịch của sưu tập" +msgstr "Xuất kết quả hình học ra tương đối với dịch chuyển của bộ sưu tập" msgid "Bring the input collection geometry into the modified object, maintaining the relative position between the objects in the scene" -msgstr "Đem hình dạng của sưu tập ngõ vào vật thể được sửa đổi, giữ nguyên vị trí tương đối giữa hai vật thể trong cảnh" +msgstr "Đưa bộ sưu tập hình học, ở đầu vào, vào trong đối tượng đã biến đổi, duy trì vị trí tương đối giữa các đối tượng trong cảnh" msgid "Convex Hull" -msgstr "Vỏ Lồi" +msgstr "Bao Lồi" msgid "Create a mesh that encloses all points in the input geometry with the smallest number of points" -msgstr "Chế tạo một mạng lưới vây quanh hết điểm trong hình dạng được nhập có số lượng điểm ít" +msgstr "Kiến Tạo một khung lưới bao quanh toàn bộ các điểm trong hình học đầu vào với số điểm nhỏ nhất" + + +msgid "Corners of Edge" +msgstr "Các Góc của Cạnh" + + +msgid "Retrieve face corners connected to edges" +msgstr "Lấy các góc mặt kết nối với các cạnh ra cho mình" + + +msgid "Corners of Face" +msgstr "Các Góc của Mặt" + + +msgid "Retrieve corners that make up a face" +msgstr "Trích xuất các góc tạo nên một Mặt" + + +msgid "Corners of Vertex" +msgstr "Các Góc của Điểm Đỉnh" + + +msgid "Retrieve face corners connected to vertices" +msgstr "Trích xuất các góc của Mặt kết nối với các điểm đỉnh" msgid "Generate a poly spline arc" -msgstr "Chế tạo một hình cung đa mấu cong" +msgstr "Tạo một đường cung chốt trục đa giác" msgid "Method used to determine radius and placement" -msgstr "Phương pháp sử dụng cho quyết định bán kính và vị trí" +msgstr "Phương pháp sử dụng để xác định bán kính và vị trí" msgid "Define arc by 3 points on circle. Arc is calculated between start and end points" -msgstr "Xác định hình cung bằng 3 trên vòng tròn. Hình cung được tính giữa điểm đầu và cuối" +msgstr "Xác định cung bằng 3 điểm trên đường tròn. Vòng cung được tính toán giữa điểm bắt đầu và điểm kết" msgid "Define radius with a float" -msgstr "Chỉ định bán kính bằng một số thật" +msgstr "Xác định bán kính với một số thực float" msgid "Endpoint Selection" -msgstr "Sự Lựa Chọn Điểm Kết Thúc" +msgstr "Lựa Chọn Điểm Kết" msgid "Provide a selection for an arbitrary number of endpoints in each spline" -msgstr "Cung cấp một sự lựa chọn cho một số lượng điểm kết thúc chưa được xác định trong mỗi mẫu cong" +msgstr "Cung cấp lựa chọn cho một số điểm cuối nào đó trong mỗi chốt trục" msgid "Handle Type Selection" -msgstr "Sự Lựa Chọn Loại Tay Cầm" +msgstr "Lựa Chọn theo Kiểu Tay Cầm" msgid "Provide a selection based on the handle types of Bézier control points" -msgstr "Cung cấp một sự lựa chọn tùy loại tay cầm của điểm kiểm soát Bezier" +msgstr "Cung cấp lựa chọn dựa trên các kiểu tay cầm của các điểm điều khiển Bézier" msgid "The handle can be moved anywhere, and doesn't influence the point's other handle" -msgstr "Tay cầm có thể di chuyển bất cứ chổ nào, và không được ảnh hưởng tay cầm kia của tay cầm" +msgstr "Tay cầm có thể di chuyển đến bất cứ đâu, và không gây tác động gì đến tay cầm kia của điểm cả" msgid "The location is automatically calculated to be smooth" -msgstr "Vị trí được tính tự động cho mịn" +msgstr "Vị trí được tự động tính toán là mịn màng" msgid "The location is calculated to point to the next/previous control point" -msgstr "Vị trí được tính tự động cho chỉ đến điểm kiểm soát kế tiếp/trước" +msgstr "Vị trí được tính để trỏ đến (tham chiếu) điểm điều khiển tiếp theo/trước đó" msgid "The location is constrained to point in the opposite direction as the other handle" -msgstr "Vị trí được buộc chỉ đến nghịch hướng với tay cầm kia" +msgstr "Vị trí buộc phải chỉ vào hướng ngược chiều với tay cầm khác" msgid "Whether to check the type of left and right handles" -msgstr "Kiểm tra hay không loại của tay cầm trái và phải" +msgstr "Có nên kiểm tra kiểu tay cầm trái và phải hay không" msgid "Use the left handles" -msgstr "Dùng các tay cầm trái" +msgstr "Sử dụng các tay cầm bên trái" msgid "Use the right handles" -msgstr "Dùng các tay cầm phải" +msgstr "Sử dụng các tay cầm bên phải" msgid "Retrieve the length of all splines added together" -msgstr "Tính chiều dài tổng số của tất cả mẫu cong" +msgstr "Trích xuất chiều dài của toàn bộ các chốt trục được cộng lại với nhau" + + +msgid "Curve of Point" +msgstr "Đường Cong của Điểm" + + +msgid "Retrieve the curve a control point is part of" +msgstr "Trích xuất đường cong mà điểm điều khiển là một phần của nó" msgid "Bezier Segment" -msgstr "Khúc Bezier" +msgstr "Phân Đoạn Bezier" msgid "Generate a 2D Bézier spline from the given control points and handles" -msgstr "Chế tạo một mẫu cong Bezier 2D từ các điểm kiểm soát và tay cầm được cung cấp" +msgstr "Tạo một chốt trục Bézier 2D từ các điểm điều khiển cung cấp và các tay cầm" msgid "Method used to determine control handles" -msgstr "Phương pháp dùng cho quyết định tay cầm kiểm soát" +msgstr "Phương pháp sử dụng để xác định các tay cầm điều khiển" msgid "The start and end handles are fixed positions" -msgstr "Tay cầm đầu và cuối ở vị trí không đổi" +msgstr "Tay cầm bắt đầu và kết thúc nằm ở vị trí cố định" msgid "The start and end handles are offsets from the spline's control points" -msgstr "Tay cầm đầu và cuối được nới từ các điểm kiểm soát của mẫu cong" +msgstr "Tay cầm bắt đầu và kết thúc được dịch chuyển khỏi các điểm điều khiển của chốt trục" msgid "Curve Circle" -msgstr "Vòng Tròn Đường Cong" +msgstr "Đường Cong Hình Tròn" msgid "Generate a poly spline circle" -msgstr "Chế tạo một vòng tròn đa mẫu cong" +msgstr "Tạo một vòng tròn chốt trục đa giác" msgid "Define the radius and location with three points" -msgstr "Chỉ định bán kính và vị trí bằng ba điểm" +msgstr "Xác định bán kính và vị trí bằng ba điểm" msgid "Define the radius with a float" -msgstr "Chỉ định bán kính bằng một số thật" +msgstr "Xác định bán kính bằng một số thật" msgid "Curve Line" -msgstr "Đường Cong" +msgstr "Dây Đường Cong" msgid "Generate a poly spline line with two points" -msgstr "Chế tạo một đa mẫu cong có hai điểm" +msgstr "Tạo một đường đa giác chốt trục với hai điểm" msgid "Define the start and end points of the line" -msgstr "Chỉ định điểm đầu và cuối của đường" +msgstr "Xác định điểm khởi đầu và điểm kết của đường thẳng" msgid "Define a line with a start point, direction and length" -msgstr "Chỉ định một đường có một điểm đầu, hướng và chiều dài" +msgstr "Xác định đường thẳng bằng một điểm khởi đầu, chiều hướng, và chiều dài" msgid "Quadrilateral" -msgstr "Tư Giác" +msgstr "Tứ Giác" msgid "Generate a polygon with four points" -msgstr "Chế tạo một đa giác có bốn điểm" +msgstr "Tạo một đa giác có bốn điểm" msgid "Create a rectangle" -msgstr "Chế tạo một chữ nhật" +msgstr "Kiến Tạo hình chữ nhật" msgid "Parallelogram" -msgstr "Hình Bình Hành" +msgstr "Hình bình hành" msgid "Create a parallelogram" -msgstr "Chế tạo một hình bình hành" +msgstr "Kiến Tạo hình bình hành" msgid "Trapezoid" @@ -42114,7 +45286,7 @@ msgstr "Hình Thang" msgid "Create a trapezoid" -msgstr "Chế tạo một hình thang" +msgstr "Kiến Tạo hình thang" msgid "Kite" @@ -42122,11 +45294,11 @@ msgstr "Hình Diều" msgid "Create a Kite / Dart" -msgstr "Chế tạo một hình diều" +msgstr "Kiến Tạo hình Diều / Phi Tiêu" msgid "Create a quadrilateral from four points" -msgstr "Chế tạo một tư gíac từ bốn điểm" +msgstr "Kiến Tạo một hình tứ giác từ bốn điểm" msgid "Quadratic Bezier" @@ -42134,39 +45306,39 @@ msgstr "Bezier Bậc Hai" msgid "Generate a poly spline in a parabola shape with control points positions" -msgstr "Chế tạo một đa mẫu cong có hình parabol từ những vị trí điểm kiểm soát" +msgstr "Tạo một đường đa giác theo hình parabol với các vị trí điểm điều khiển" msgid "Set Handle Type" -msgstr "Đặt Loại Tay Cầm" +msgstr "Đặt Kiểu Tay Cầm" msgid "Set the handle type for the control points of a Bézier curve" -msgstr "Đặt loại tay cầm cho các điểm kiểm soát của một đường cong Bezier" +msgstr "Đặt kiểu tay cầm cho các điểm điều khiển của một đường cong Bézier" msgid "Whether to update left and right handles" -msgstr "Nâng hay không nâng cấp tay cầm trái và phải" +msgstr "Có nên cập nhật tay cầm trái và tay cầm phải hay không" msgid "Curve Spiral" -msgstr "Đường Cong Ốc" +msgstr "Đường Cong hình Xoắn Ốc" msgid "Generate a poly spline in a spiral shape" -msgstr "Chế tạo một đa mẫu cong có hình ốc" +msgstr "Tạo ra một chốt trục đa giác theo hình xoắn ốc" msgid "Set Spline Type" -msgstr "Đặt Loại Mẫu Cong" +msgstr "Đặt Thể Loại Chốt Trục" msgid "Change the type of curves" -msgstr "Đổi loại của các đường cong" +msgstr "Đổi thể loại đường cong" msgid "The curve type to change the selected curves to" -msgstr "Loại đường cong để đổi sang cho các đường cong được chọn" +msgstr "Thể loại đường cong để đổi các đường cong đã chọn thành nó" msgid "Catmull Rom" @@ -42182,379 +45354,492 @@ msgstr "Ngôi Sao" msgid "Generate a poly spline in a star pattern by connecting alternating points of two circles" -msgstr "Chết tạo một đa mẫu cong có hình ngôi sao bằng kết nối những điểm xen kẽ của hai vònh tròn" +msgstr "Tạo đường đa giác theo hình ngôi sao bằng cách nối các điểm xen kẽ của hai vòng tròn" msgid "Curve to Mesh" -msgstr "Đường Cong sang Mạng Lưới" +msgstr "Đường Cong thành Khung Lưới" msgid "Convert curves into a mesh, optionally with a custom profile shape defined by curves" -msgstr "Biến đổi đường cong sang một mạng lưới, tùy chọn có một hình mặt cắt được xác định bởi các đường cong" +msgstr "Chuyển đổi các đường cong thành khung lưới, có thể với hình dạng cấu hình tùy chỉnh được xác định bởi các đường cong" msgid "Curve to Points" -msgstr "Điểm Sang Đường Cong" +msgstr "Đường Cong thành các Điểm" msgid "Generate a point cloud by sampling positions along curves" -msgstr "Chế tạo một mây điểm bằng lấy mẫu từ các điểm trên các đường cong" +msgstr "Tạo đám mây điểm bằng cách lấy mẫu các vị trí dọc theo đường cong" msgid "How to generate points from the input curve" -msgstr "Làm sao được chế tạo điểm từ đường cong ngõ vào" +msgstr "Phương pháp tạo các điểm từ đường cong cung cấp ở đầu vào" msgid "Evaluated" -msgstr "Được Tính Toán" +msgstr "Đã Tính Toán" msgid "Create points from the curve's evaluated points, based on the resolution attribute for NURBS and Bezier splines" -msgstr "Chế tạo điểm được tính từ điểm của đường cong, tùy đặc điểm độ phân giải cho NURBS và mẫu cong Bezier" +msgstr "Kiến Tạo điểm từ các điểm được tính toán của đường cong, dựa trên thuộc tính về độ phân giải cho NURBS và chốt trục Bezier" msgid "Sample each spline by evenly distributing the specified number of points" -msgstr "Mẫu mỗi mẫu cong bằng phân phối đều số lượng điểm được xác định" +msgstr "Lấy mẫu từng chốt trục một bằng cách phân bố đều số điểm chỉ định" msgid "Sample each spline by splitting it into segments with the specified length" -msgstr "Mẫu mỗi mẫu cong bằng chẻ nó thành khúc có chiều dài được xác định" +msgstr "Lấy mẫu vật từng chốt trục, bằng cách tách phân nó ra thành các phân đoạn có chiều dài chỉ định" msgid "Geometry Custom Group" -msgstr "Nhóm Tùy Chọn Hình Dạng" +msgstr "Nhóm Hình Học Tùy Chỉnh" msgid "Custom Geometry Group Node for Python nodes" -msgstr "Giao Điểm Nhóm Hình Dạng Chọn cho giao điểm Python" +msgstr "Nút Nhóm Hình Học Tùy Chỉnh cho các Nút Python" msgid "Deform Curves on Surface" -msgstr "Méo Hóa Các Đường Cong tren Bề Mặt" +msgstr "Biến Dạng các Đường Cong trên Bề Mặt" msgid "Translate and rotate curves based on changes between the object's original and evaluated surface mesh" -msgstr "Dịch và xoay các đường cong tùy sự thay đổi giữa mạng lưới ban đầu và bề mặt được tính toán" +msgstr "Dịch chuyển và xoay chiều các đường cong dựa trên những thay đổi giữa khung lưới bề mặt ban đầu và khung lưới bề mặt được đánh giá của đối tượng" msgid "Delete Geometry" -msgstr "Xóa Hình Dạng" +msgstr "Xóa Hình Học" msgid "Remove selected elements of a geometry" -msgstr "Xóa các phần tử được chọn của một hình dạng" +msgstr "Xóa đối tượng được chọn của một hình học" msgid "Which domain to delete in" -msgstr "Xoá trong phạm vi nào" +msgstr "Trong tên miền (phạm vi) nào cần phải xóa" msgid "Which parts of the mesh component to delete" -msgstr "Xóa các phần nào của thành phần mạng lưới" +msgstr "Những phần nào của phần tử khung lưới cần xóa" msgid "Only Edges & Faces" -msgstr "Chỉ Định & Mặt" +msgstr "Duy Cạch & Các Mặt" msgid "Only Faces" -msgstr "Chỉ Mặt" +msgstr "Duy Các Mặt" + + +msgid "Distribute Points in Volume" +msgstr "Phân Bố các Điểm trong Thể Tích" + + +msgid "Generate points inside a volume" +msgstr "Sinh tạo ra các điểm nội bên trong một thể tích" msgid "Distribution Method" -msgstr "Phương Pháp Phân Phối" +msgstr "Phương Pháp Phân Bố" msgid "Method to use for scattering points" -msgstr "Phương pháp cho phân phối điểm" +msgstr "Phương Pháp sử dụng để phân tán các điểm" + + +msgid "Distribute points randomly inside of the volume" +msgstr "Phân phối các điểm ngẫu nhiên nội bên trong thể tích" + + +msgid "Distribute the points in a grid pattern inside of the volume" +msgstr "Phân phối các điểm theo một mô hình khung lưới đồ thị nội bên trong thể tích" msgid "Distribute Points on Faces" -msgstr "Phân Phối Điểm trên các Mặt" +msgstr "Phân bố các điểm trên các mặt" msgid "Generate points spread out on the surface of a mesh" -msgstr "Chế tạo một số điểm trải ra trên bề mặt của một mạng lưới" +msgstr "Tạo nhiều điểm dàn trải ra trên bề mặt của một khung lưới" msgid "Distribute points randomly on the surface" -msgstr "Phân phối điểm ngẫu nhiên trên bề mặt" +msgstr "Phân bố các điểm một cách ngẫu nhiên trên bề mặt" msgid "Poisson Disk" -msgstr "Đĩa Poisson" +msgstr "Poisson Hình Đĩa" msgid "Distribute the points randomly on the surface while taking a minimum distance between points into account" -msgstr "Phân phối điểm ngẫu nhiên trên bề mặt khi xem xét khoảng cách giữa điểm" +msgstr "Phân bố các điểm một cách ngẫu nhiên trên bề mặt trong khi cân nhắc đến khoảng cách tối thiểu giữa các điểm" + + +msgid "Legacy Normal" +msgstr "Pháp Tuyến Cũ" + + +msgid "Output the normal and rotation values that have been output before the node started taking smooth normals into account" +msgstr "Xuất các giá trị pháp tuyến và xoay chiều đã được xuất ra trước khi nút bắt đầu tính đến các pháp tuyến mịn màng" msgid "Dual Mesh" -msgstr "Mạng Lưới Cặp Đôi" +msgstr "Khung Lưới Kép" msgid "Convert Faces into vertices and vertices into faces" -msgstr "Biến đổi mặt sang đỉnh và đỉnh sang mặt" +msgstr "Chuyển đổi các mặt thành các điểm đỉnh và các điểm đỉnh thành các mặt" msgid "Duplicate Elements" -msgstr "Sao Chép Phần Tử" +msgstr "Nhân Đôi các Phần Tử" msgid "Generate an arbitrary number copies of each selected input element" -msgstr "Chế tạo một số sao chép không xác định của mỗi phần tử được nhập" +msgstr "Tạo một số bản sao tùy ý của mỗi phần tử đầu vào đã chọn" msgid "Which domain to duplicate" -msgstr "Sao chép phạm vi nào" +msgstr "Phạm vi nào là phạm vi sẽ sao chép" msgid "Edge Paths to Curves" -msgstr "Đường Cạnh đến Đường Cong" +msgstr "Đường Cạnh thành Đường Cong" msgid "Edge Paths to Selection" -msgstr "Đường Cạnh đến Sự Lựa Chọn" +msgstr "Đường Cạnh thành Lựa Chọn" + + +msgid "Edges of Corner" +msgstr "Các Cạnh của Góc" + + +msgid "Retrieve the edges on both sides of a face corner" +msgstr "Trích xuất các cạnh trên cả hai bên của một góc Mặt" + + +msgid "Edges of Vertex" +msgstr "Các Cạnh của Điểm Đỉnh" + + +msgid "Retrieve the edges connected to each vertex" +msgstr "Trích xuất các cạnh kết nối với mỗi điểm đỉnh" + + +msgid "Edges to Face Groups" +msgstr "Các thành các Nhóm Mặt" + + +msgid "Group faces into regions surrounded by the selected boundary edges" +msgstr "Nhóm các mặt lại thành các vùng được bao quanh bởi các cạnh biên đã chọn" msgid "Extrude Mesh" -msgstr "Kéo Ra Mạng Lưới" +msgstr "Đẩy Trồi Khung Lưới" msgid "Generate new vertices, edges, or faces from selected elements and move them based on an offset while keeping them connected by their boundary" -msgstr "Chế tạo đỉnh, cạnh, hay mặt mới từ các phần tử được chọn và di chuyển chúng nó tùy một dịch và giữ chúng nó liên kết với ranh giới của chúng nó" +msgstr "Tạo các điểm đỉnh, các cạnh hoặc các mặt mới từ các phần tử đã chọn và di chuyển chúng dựa trên dịch chuyển trong khi vẫn giữ chúng được kết nối bằng ranh giới của chúng" + + +msgid "Face of Corner" +msgstr "Góc của Mặt" + + +msgid "Retrieve the face each face corner is part of" +msgstr "Trích xuất Mặt mà mỗi góc là một phần của nó" + + +msgid "Evaluate at Index" +msgstr "Tính Toán tại Chỉ Số" msgid "Retrieve data of other elements in the context's geometry" -msgstr "Lấy dữ liệu của các phần tử khác trong bối cảnh của hình dạng" +msgstr "Trích xuất dữ liệu của các phần tử khác trong hình học của ngữ cảnh" msgid "Domain the field is evaluated in" -msgstr "Phạm vi cho tính toán trường" +msgstr "Phạm vi mà trường được tính toán" + + +msgid "Evaluate on Domain" +msgstr "Tính Toán trên Phạm Vi" msgid "Retrieve values from a field on a different domain besides the domain from the context" -msgstr "Lấy giá trị từ một trường trên một phạm vi khác thay thế phạm vi của bối cảnh" +msgstr "Lấy các giá trị từ một trường trên một phạm vi khác bên cạnh phạm vi từ ngữ cảnh" msgid "Fill Curve" -msgstr "Đường Cong Lát Đầy" +msgstr "Phủ Kín Đường Cong" msgid "Generate a mesh on the XY plane with faces on the inside of input curves" -msgstr "Chế tạo một mạng lưới trên mặt phẳng XY có mặt phía trong các đường cong nhập" +msgstr "Tạo khung lưới trên bình diện XY với các mặt ở bên trong các đường cong đầu vào" msgid "N-gons" -msgstr "N-Giác" +msgstr "Đa Giác" msgid "Fillet Curve" -msgstr "Đường Cong Mép" +msgstr "Vê Tròn Đường Cong" msgid "Round corners by generating circular arcs on each control point" -msgstr "Tòn hóa các góc giác bằng chế tạo hình cung tròn trên mỗi điểm kiểm soát" +msgstr "Làm tròn các góc bằng cách tạo các cung tròn trên mỗi điểm điều khiển" msgid "How to choose number of vertices on fillet" -msgstr "Làm sao được chọn số lượng đỉnh cho mép " +msgstr "Phương pháp chọn số điểm đỉnh trên góc vê tròn" msgid "Align Bezier handles to create circular arcs at each control point" -msgstr "Sắp xếp tay cầm Bezier để chế tạo cung tròn từng điểm kiểm soát" +msgstr "Căn chỉnh các tay cầm của Bezier để kiến tạo các vòng cung tròn tại mỗi điểm điều khiển" msgid "Add control points along a circular arc (handle type is vector if Bezier Spline)" -msgstr "Thêm điểm kiểm soát theo một cung tròn (loại tay cầm là vectơ nếu là Mẫu Cong Bezier)" +msgstr "Cho thêm các điểm điều khiển dọc theo vòng cung tròn (kiểu tay cầm là véctơ nếu là Chốt Trục Bezier)" msgid "Flip Faces" -msgstr "Lật Mặt" +msgstr "Lật Đảo Các Mặt" msgid "Reverse the order of the vertices and edges of selected faces, flipping their normal direction" -msgstr "Lật ngược thứ tự của đỉnh và cạnh của mặt, lật hướng pháp tuyến của chúng nó" +msgstr "Đảo ngược thứ tự của các điểm đỉnh và các cạnh của các mặt đã chọn, đảo lật theo chiều hướng pháp tuyến của chúng" msgid "Geometry to Instance" -msgstr "Hình Dạng đến Thực Thể" +msgstr "Hình Học thành Thực Thể" msgid "Convert each input geometry into an instance, which can be much faster than the Join Geometry node when the inputs are large" -msgstr "Biến đổi mỗi hình dạng ngõ vào thành một thực thể, có thể nhanh hơn giao điểm Kết Nối Hình Dạng khi ngõ vào rất lớn" +msgstr "Chuyển đổi mỗi hình học đầu vào thành một thực thể, có thể nhanh hơn nhiều so với nút Hội Nhập Hình Học khi đầu vào có cỡ lớn" + + +msgid "Image Info" +msgstr "Thông Tin Hình Ảnh" + + +msgid "Retrieve information about an image" +msgstr "Trích xuất thông tin về một hình ảnh" msgid "Sample values from an image texture" -msgstr "Lấy mẫu giá trị từ một chất liệu ảnh" +msgstr "Giá trị lấy mẫu từ một chất liệu hình ảnh" + + +msgctxt "Image" +msgid "Mirror" +msgstr "Phản Chiếu Đối Xứng" + + +msgid "Repeatedly flip the image horizontally and vertically" +msgstr "Đảo lật hình ảnh theo chiều ngang và chiều dọc một cách lặp lại" msgid "Method for smoothing values between pixels" -msgstr "Phương pháp cho mịn hóa giá trị giữa các điểm ảnh" +msgstr "Phương pháp làm mịn các giá trị giữa các các điểm ảnh" msgid "Linear interpolation" -msgstr "Suy nội tuyến tính" +msgstr "Nội suy tuyến tính" msgid "No interpolation (sample closest texel)" -msgstr "Không suy nội (dùng điểm ảnh gần nhất)" +msgstr "Không nội suy (lấy mẫu vật điểm ảnh chất liệu gần nhất)" msgid "Cubic interpolation" -msgstr "Suy nội bật ba" +msgstr "Nội Suy Lập Phương" + + +msgid "Index of Nearest" +msgstr "Chỉ Số của cái Gần Nhất" + + +msgid "Find the nearest element in a group. Similar to the \"Sample Nearest\" node" +msgstr "Tìm phần tử gần nhất trong một nhóm. Tương tự như nút \"Lấy Mẫu Vật cái Gần Nhất\"" msgid "Curve Handle Positions" -msgstr "Vị Trí Của Tay Cầm Đường Cong" +msgstr "Vị Trí Điều Khiển Đường Cong" msgid "Retrieve the position of each Bézier control point's handles" -msgstr "Lấy vị trí của mỗi tay cầm của điểm kiểm soát Bezier" +msgstr "Trích xuất vị trí của các tay cầm của mỗi điểm điều khiển Bézier" msgid "Curve Tilt" -msgstr "Độ Nghiệng Đường Cong" +msgstr "Độ Nghiêng của Đường Cong" msgid "Retrieve the angle at each control point used to twist the curve's normal around its tangent" -msgstr "Rút góc tại mỗi điểm kiểm soát được dùng cho xoắn pháp tuyến của đường cong quanh tiếp tuyến của nó" +msgstr "Trích xuất góc tại mỗi điểm điều khiển sử dụng để xoắn vặn pháp tuyến của đường cong xung quanh tiếp tuyến của nó" + + +msgid "Is Edge Smooth" +msgstr "Cạnh Có Mịn Màng Không" + + +msgid "Retrieve whether each edge is marked for smooth or split normals" +msgstr "Truy xuất xem mỗi cạnh được đánh dấu cho các pháp tuyến mịn màng hay tách phân" msgid "Retrieve a stable random identifier value from the \"id\" attribute on the point domain, or the index if the attribute does not exist" -msgstr "Rút một giá trị phân biệt từ đạc điểm \"id\" trong phạm vi điễm, hoặc chỉ số nếu đặc điểm đó không tồn tại" +msgstr "Trích xuất giá trị định danh ngẫu nhiên ổn định từ thuộc tính \"id\" trên phạm vi điểm, hoặc chỉ số nếu thuộc tính không tồn tại" + + +msgid "Input image" +msgstr "Hình ảnh đầu vào" msgid "Retrieve an integer value indicating the position of each element in the list, starting at zero" -msgstr "Rút một giá trị số nguyên chỉ định vị trí của mỗi phần tử trong danh sách, bắt đầu từ số không" +msgstr "Trích xuất một giá trị số nguyên ám chỉ vị trí của từng phần tử trong danh sách, bắt đầu từ 0" msgid "Instance Rotation" -msgstr "Xoay Thực Thể" +msgstr "Xoay Chiều Thực Thể" msgid "Retrieve the rotation of each instance in the geometry" -msgstr "Rút xoáy của mỗi thực thể trong hình dạng" +msgstr "Trích xuất góc độ xoay chiều của từng thực thể trong hình học" msgid "Instance Scale" -msgstr "Phóng To Thực Thể" +msgstr "Tỷ Lệ của Thực Thể" msgid "Retrieve the scale of each instance in the geometry" -msgstr "Rút phóng to của mỗi thực thể trong hình dạng" +msgstr "Trích xuất tỷ lệ của mỗi thực thể trong hình học" msgid "Output a single material" -msgstr "Xuất một vật liệu riêng" +msgstr "Xuất một đơn nguyên vật liệu" msgid "Retrieve the index of the material used for each element in the geometry's list of materials" -msgstr "Rút chỉ số của vật liệu được dùng cho mỗi phần tử trong danh sách vật liệu của hình dạng" +msgstr "Trích xuất chỉ số của nguyên vật liệu sử dụng cho từng phần tử trong danh sách vật liệu của hình học" msgid "Edge Angle" -msgstr "Góc Cạnh" +msgstr "Góc Độ của Cạnh" msgid "Calculate the surface area of each face in a mesh" -msgstr "tính diện tích bề mặt từng mặt trong mạng lưới " +msgstr "Tính toán diện tích của mỗi Mặt trong một khung lưới" msgid "Edge Neighbors" -msgstr "Kề Cạnh" +msgstr "Lân Cận của Cạnh" msgid "Retrieve the number of faces that use each edge as one of their sides" -msgstr "Rút số lượng mặt sử dụng mỗi cạnh để làm một cạnh của chúng nó" +msgstr "Trích xuất số các mặt sử dụng mỗi cạnh làm một trong các cạnh của chúng" msgid "Edge Vertices" -msgstr "Đỉnh Cạnh" +msgstr "Điểm Đỉnh của Cạnh" msgid "Retrieve topology information relating to each edge of a mesh" -msgstr "Rút thông tin tô pô liên quân đến mỗi cạnh của một mạng lưới" +msgstr "Trích xuất thông tin cấu trúc liên kết liên quan đến mỗi cạnh của khung lưới" msgid "Calculate the surface area of a mesh's faces" -msgstr "Diện tích bề mặt từng mặt của một mạng lưới" +msgstr "Tính toán diện tích các mặt của khung lưới" msgid "Is Face Planar" -msgstr "Mặt Là Mặt Phẳng" +msgstr "Mặt có Nằm Trên Cùng Mặt Phẳng Không" + + +msgid "Retrieve whether all triangles in a face are on the same plane, i.e. whether they have the same normal" +msgstr "Trích xuất xem toàn bộ các tam giác trong một Mặt có nằm trên cùng một bình diện hay không, tức là có cùng pháp tuyến hay không" msgid "Face Neighbors" -msgstr "Kề Mặt" +msgstr "Lân Cận của Mặt" msgid "Retrieve topology information relating to each face of a mesh" -msgstr "Rút thông tin tô pô liên quân đến mỗi mặt của một mạng lưới" +msgstr "Trícg xuất thông tin cấu trúc liên kết liên quan đến từng Mặt của khung lưới" msgid "Mesh Island" -msgstr "Hòn Đảo Mạng Lưới" +msgstr "Hải Đảo Khung Lưới" msgid "Retrieve information about separate connected regions in a mesh" -msgstr "Rút thông tin về những vùng chẻ riêng trong một mạng lưới" +msgstr "Truy xuất thông tin về các vùng được kết nối riêng biệt trong một khung lưới" msgid "Vertex Neighbors" -msgstr "Đỉnh Kề" +msgstr "Lân Cận của Điểm Đỉnh" msgid "Retrieve topology information relating to each vertex of a mesh" -msgstr "Rút thông tin tô pô liên quân đến mỗi đỉnh của một mạng lưới" +msgstr "Truy xuất thông tin cấu trúc liên kết liên quan đến mỗi điểm đỉnh của khung lưới" msgid "Named Attribute" -msgstr "Đặc Điểm Có Tên" +msgstr "Thuộc Tính được Đặt Tên" msgid "Retrieve the data of a specified attribute" -msgstr "Rút dữ liệu của một đặc điểm được chỉ định" +msgstr "Trích xuất dữ liệu của một thuộc tính chỉ định" msgid "The data type used to read the attribute values" -msgstr "Kiểu dữ liệu để dùng khi đọc giá trị của đặc điểm" +msgstr "Thể loại dữ liệu sử dụng để đọc các giá trị thuộc tính" msgid "Retrieve a unit length vector indicating the direction pointing away from the geometry at each element" -msgstr "Rút một vectơ đơn vị hóa biểu lộ hướng phát từ hình dạng tại mỗi phần tử" +msgstr "Trích xuất vectơ độ dài đơn vị cho biết chiều hướng quay ra khỏi hình học ở mỗi phần tử" msgid "Retrieve a vector indicating the location of each element" -msgstr "Rút một vectơ biểu lộ vị trí của mỗi phần tử" +msgstr "Trích xuất một vectơ ám chỉ vị trí của mỗi phần tử" msgid "Retrieve the radius at each point on curve or point cloud geometry" -msgstr "Rút bán kính tại mỗi điểm trên đường cong hay hình dạng điểm mây" +msgstr "Trích xuất bán kính tại mỗi điểm trên đường cong hoặc hình học đám mây điểm" msgid "Retrieve the current time in the scene's animation in units of seconds or frames" -msgstr "Rút thời gian hiện tại trong hoạt hình của cảnh (đơn vị giây hoặc bức ảnh)" +msgstr "Trích xuất thời gian hiện tại trong hoạt họa của cảnh theo đơn vị số giây hoặc số khung hình" + + +msgid "Is Face Smooth" +msgstr "Mặt Có Mịn Màng Không" + + +msgid "Retrieve whether each face is marked for smooth or sharp normals" +msgstr "Truy xuất xem mỗi mặt được đánh dấu cho pháp tuyến mịn màng hay sắc nét" msgid "Shortest Edge Paths" -msgstr "Đường Cạnh Nhắn Nhất" +msgstr "Đường Cạnh Ngắn Nhất" msgid "Is Spline Cyclic" -msgstr "Là Mẫu Cong Chu Trình" +msgstr "Là Chốt Trục Tuần Hoàn" msgid "Retrieve whether each spline endpoint connects to the beginning" -msgstr "Rút thông tin từng điểm kết thúc của mẫu cong có kết nối với điểm đầu hay không" +msgstr "Truy xuất xem mỗi điểm cuối chốt trục có kết nối với điểm đầu hay không" msgid "Spline Resolution" -msgstr "Độ Phân Giải Mẫu Công" +msgstr "Độ Phân Giải của Chốt Trục" msgid "Retrieve the number of evaluated points that will be generated for every control point on curves" -msgstr "Rút số lượng điểm được tính toán sẽ được chế tạo cho mỗi điểm kiểm soát trên đường cong" +msgstr "Trích xuất số điểm đã đánh giá sẽ được sinh tạo cho mọi điểm điều khiển trên đường cong" msgid "Curve Tangent" @@ -42562,123 +45847,139 @@ msgstr "Tiếp Tuyến Đường Cong" msgid "Retrieve the direction of curves at each control point" -msgstr "Rút hướng của đường cong tại mỗi điểm kiểm soát" +msgstr "Trích xuất chiều hướng của các đường cong tại mỗi điểm điều khiển" msgid "Instance on Points" -msgstr "Thực Thể trên Điểm" +msgstr "Thực Thể Hóa trên Điểm" msgid "Generate a reference to geometry at each of the input points, without duplicating its underlying data" -msgstr "Chế tạo một tham chiếu đến hình dạng tại mỗi điểm ngõ vào, nhưng không làm bản sao dữ liệu của nó" +msgstr "Tạo tham chiếu đến hình học tại mỗi điểm đầu vào mà không sao chép dữ liệu cơ bản của nó" msgid "Instances to Points" -msgstr "Thực Thể đến Điểm" +msgstr "Thực Thể Hóa trên Điểm" msgid "" "Generate points at the origins of instances.\n" "Note: Nested instances are not affected by this node" msgstr "" -"Chế tạo điểm tại góc tọa độ của các thực thể.\n" -"Lưu ý: Thực thể đệ quy không bị ảnh hưởng bởi giao điểm này" +"Tạo các điểm tại tọa độ gốc của các các thực thể.\n" +"Lưu ý: Các thực thể lồng nhau không bị ảnh hưởng bởi nút này" + + +msgid "Interpolate Curves" +msgstr "Nội Suy Đường Cong" + + +msgid "Generate new curves on points by interpolating between existing curves" +msgstr "Tạo các đường cong mới trên các điểm bằng cách nội suy giữa các đường cong hiện có" msgid "Is Viewport" -msgstr "Là Màn Chiếu" +msgstr "Là Cổng Nhìn" msgid "Retrieve whether the nodes are being evaluated for the viewport rather than the final render" -msgstr "Rút thông tin cho biết giao điểm được tính cho màn chiếu hoặc cho kết thúc cuối cùng" +msgstr "Truy xuất xem các nút có đang được đánh giá cho cổng nhìn thay vì kết xuất cuối cùng hay không" msgid "Join Geometry" -msgstr "Kết Nối Hình Dạng" +msgstr "Hội Nhập Hình Học" msgid "Merge separately generated geometries into a single one" -msgstr "Gồm các hình dạng được chế tạo riêng biệt nhập vào một hình dạng" +msgstr "Hợp nhất các hình học được sinh tạo riêng biệt thành một hình duy nhất" msgid "Material Selection" -msgstr "Sự Lựa Chọn Vật Liệu" +msgstr "Lựa Chọn Nguyên Vật Liệu" msgid "Provide a selection of faces that use the specified material" -msgstr "Cung cấp một sự lựa chọn chứa những mặt đang dùng một vật liệu được chỉ định" +msgstr "Cung cấp lựa chọn các mặt sử dụng nguyên vật liệu chỉ định" msgid "Merge by Distance" -msgstr "Gồm tùy Khoảng Cách" +msgstr "Hợp Nhất theo Khoảng Cách" msgid "Merge vertices or points within a given distance" -msgstr "Gồm đỉnh hoặc điểm phía trong một khoảng cách được chỉ định" +msgstr "Hợp nhất các điểm đỉnh hoặc các điểm trong một khoảng cách nhất định" msgid "Merge all close selected points, whether or not they are connected" -msgstr "Gồm hết điềm gần được chọn, mặc kệ được kết nối hay không" +msgstr "Hợp nhất toàn bộ các điểm đã chọn gần nhau, cho dù chúng có kết nối hay không" msgid "Only merge mesh vertices along existing edges. This method can be much faster" -msgstr "Chỉ gồm các đỉnh mạng lưới trên những cạnh đang tồn tại. Phương pháp này có lẽ nhanh hơn nhiều" +msgstr "Chỉ hợp nhất các điểm đỉnh khung lưới dọc theo các cạnh hiện có mà thôi. Phương pháp này có thể nhanh hơn nhiều" msgid "Mesh Boolean" -msgstr "Bool Mạng Lưới" +msgstr "Lôgic Bool trên Khung Lưới" msgid "Cut, subtract, or join multiple mesh inputs" -msgstr "Cắt, trừ, hay kết nối những ngõ vào đa mạng lưới" +msgstr "Cắt, khấu trừ hoặc chắp nối nhiều đầu vào khung lưới" msgid "Mesh Circle" -msgstr "Vòng Tròn Mạng Lưới" +msgstr "Khung Lưới Hình Tròn" msgid "Generate a circular ring of edges" -msgstr "Chế tạo một vành cạnh có hình tròn" +msgstr "Tạo một vòng tròn bởi các cạnh" msgid "Fill Type" -msgstr "Loại Đầy" +msgstr "Kiểu Phủ Kín" msgid "N-Gon" -msgstr "Đa Giác" +msgstr "Đa-Giác" msgid "Generate a cone mesh" -msgstr "Chế tạo một mạng lưới hình nón" +msgstr "Tạo một khung lưới hình nón" msgid "Generate a cuboid mesh with variable side lengths and subdivisions" -msgstr "Chế tạo một hình hộp có chiều dài các cạnh và phân hóa được biến số," +msgstr "Tạo khung lưới hình khối lập phương với độ dài cạnh biến thiên và phân hóa" msgid "Generate a cylinder mesh" -msgstr "Chế tạo một mạng lưới hình trụ" +msgstr "Tạo một khung lưới hình trụ" + + +msgid "Face Group Boundaries" +msgstr "Ranh Giới Nhóm Mặt" + + +msgid "Find edges on the boundaries between groups of faces with the same ID value" +msgstr "Tìm các cạnh trên ranh giới giữa các nhóm các mặt có cùng giá trị ID" msgid "Generate a planar mesh on the XY plane" -msgstr "Chế tạo một mạng lưới mặt phẳng trên mặt phẳng XY" +msgstr "Tạo một khung lưới mặt phẳng trên bình diện XY" msgid "Ico Sphere" -msgstr "Hình Cầu NhịThậpDiện" +msgstr "Hình Cầu Nhị Thập Diện" msgid "Generate a spherical mesh that consists of equally sized triangles" -msgstr "Chế tạo một mạng lưới hình cầu tạo bởi tam giác có cỡ thước bằng nhau" +msgstr "Tạo một khung lưới hình cầu bao gồm các hình tam giác có kích thước bằng nhau" msgid "Mesh Line" -msgstr "Đường Mạng Lưới" +msgstr "Đường Khung Lưới" msgid "Generate vertices in a line and connect them with edges" -msgstr "Chế tạo đỉnh trên một đường và kết nối nó bằng cạnh" +msgstr "Tạo các điểm đỉnh trong một đường thẳng và nối chúng bằng các cạnh" msgid "Count Mode" @@ -42686,63 +45987,63 @@ msgstr "Chế Độ Đếm" msgid "Specify the total number of vertices" -msgstr "Chỉ định tổng số lượng đỉnh" +msgstr "Xác định tổng số điểm đỉnh" msgid "Specify the distance between vertices" -msgstr "Chỉ định khoảng cách giữa đỉnh" +msgstr "Xác định khoảng cách giữa các điểm đỉnh" msgid "Specify the offset from one vertex to the next" -msgstr "Chỉ định dịch từ một đỉnh đến đỉnh kế tiếp" +msgstr "Xác định dịch chuyển từ điểm đỉnh này tới điểm đỉnh tiếp theo" msgid "End Points" -msgstr "Điểm Cùng" +msgstr "Điểm Cuối" msgid "Specify the line's start and end points" -msgstr "Chỉ định điểm bắt đầu và kết thúc của đường" +msgstr "Xác định điểm bắt đầu và điểm kết của đường nét" msgid "Mesh to Curve" -msgstr "Mạng Lưới sang Đường Cong" +msgstr "Khung Lưới thành Đường Cong" msgid "Generate a curve from a mesh" -msgstr "Chế tạo một đường cong từ một mạng lưới" +msgstr "Tạo đường cong từ một khung lưới" msgid "Mesh to Points" -msgstr "Mạng Lưới sang Điểm" +msgstr "Khung Lưới thành các Điểm" msgid "Generate a point cloud from a mesh's vertices" -msgstr "Chế tạo một điểm từ các đỉnh của một vật thể mạng lưới" +msgstr "Tạo một đám mây điểm từ các điểm đỉnh của khung lưới" msgid "Create a point in the point cloud for each selected vertex" -msgstr "Chế tạo một điểm trong mây điểm cho mỗi đỉnh được chọn" +msgstr "Kiến Tạo một điểm trong đám mây điểm cho mỗi điểm đỉnh đã chọn" msgid "Create a point in the point cloud for each selected edge" -msgstr "Chế tạo một điểm trong mây điểm cho mỗi cạnh được chọn" +msgstr "Kiến Tạo một điểm trong đám mây điểm cho mỗi cạnh đã chọn" msgid "Create a point in the point cloud for each selected face" -msgstr "Chế tạo một điểm trong mây điểm cho mỗi mặt được chọn" +msgstr "Kiến Tạo một điểm trong đám mây điểm cho mỗi Mặt được chọn" msgid "Create a point in the point cloud for each selected face corner" -msgstr "Chế tạo một điểm trong mây điểm cho mỗi góc giác của mặt được chọn" +msgstr "Kiến Tạo một điểm trong đám mây điểm cho mỗi góc Mặt đã chọn" msgid "Create a fog volume with the shape of the input mesh's surface" -msgstr "Chế tạo một thể tích sương mù có hình dạng giống bề mặt của mạng lưới ngõ vào" +msgstr "Kiến Tạo một thể tích sương mù với hình dạng của bề mặt khung lưới đầu vào" msgid "How the voxel size is specified" -msgstr "Làm sao xác định cỡ thước của thể tích tử" +msgstr "Kích thước thể tích tử được xác định như thế nào" msgid "UV Sphere" @@ -42750,159 +46051,231 @@ msgstr "Hình Cầu UV" msgid "Generate a spherical mesh with quads, except for triangles at the top and bottom" -msgstr "Chế tạo một mạng lưới bằng tư giác, trừ các tam giác tại hai cực ở trên và dưới" +msgstr "Tạo khung lưới hình cầu với tứ giác, ngoại trừ các tam giác ở trên cùng và dưới cùng" msgid "Object Info" -msgstr "Thông Tin Vật Thể" +msgstr "Thông Tin Đối Tượng" msgid "Retrieve information from an object" -msgstr "Rút thông tin từ vật thể" +msgstr "Trích xuất thông tin từ một đối tượng" msgid "The transformation of the vector and geometry outputs" -msgstr "Biến hóa của ngõ ra vectơ và hình dạng" +msgstr "Sự biến hóa của véctơ và đầu ra của hình học" msgid "Output the geometry relative to the input object transform, and the location, rotation and scale relative to the world origin" -msgstr "Xuất hình dạng tương đối với ngõ vào biến hóa vật thể, và vị trí, xoay và phóng to tương đối với gốc tọa độ thế giới" +msgstr "Cung cấp hình học ở đầu ra tương đối với biến hóa của đối tượng ở đầu vào, cùng vị trí, xoay chiều và tỷ lệ tương đối với tọa độ gốc thế giới" msgid "Bring the input object geometry, location, rotation and scale into the modified object, maintaining the relative position between the two objects in the scene" -msgstr "Đem nhình dạng vật thể ngõ vào, vị trí, xoay và phóng to vào vật thể được sửa đổi, giữ nguyên vị trí tương đối giữa hai vật thể trong cảnh" +msgstr "Đưa hình học đối tượng cung cấp ở đầu vào, cùng vị trí, xoay chiều và tỷ lệ vào trong đối tượng đã chỉnh sửa, duy trì vị trí tương đối giữa hai đối tượng trong cảnh" + + +msgid "Offset Corner in Face" +msgstr "Dịch Chuyển Góc trong Mặt" + + +msgid "Retrieve corners in the same face as another" +msgstr "Trích xuất các góc trong cùng một Mặt như cái khác" + + +msgid "Offset Point in Curve" +msgstr "Dịch Chuyển Điểm trong Đường Cong" + + +msgid "Offset a control point index within its curve" +msgstr "Dịch chuyển một chỉ số điểm điều khiển nội trong đường cong của nó" msgid "Generate a point cloud with positions and radii defined by fields" -msgstr "Chế tạo một mây điểm có những vị trí và bán kính được chỉ định bởi trường nào" +msgstr "Tạo một đám mây điểm với các vị trí và bán kính được xác định bởi các trường" + + +msgid "Points of Curve" +msgstr "Các Điểm của Đường Cong" + + +msgid "Retrieve a point index within a curve" +msgstr "Trích xuất một chỉ số của điểm nội trong một đường cong" + + +msgid "Points to Curves" +msgstr "Điểm thành Đường Cong" + + +msgid "Split all points to curve by its group ID and reorder by weight" +msgstr "Tách phân toàn bộ các điểm thành đường cong theo ID nhóm của nó và sắp xếp lại theo trọng lượng" msgid "Points to Vertices" -msgstr "Điểm đến Đỉnh" +msgstr "Điểm thành Điểm Đỉnh" msgid "Generate a mesh vertex for each point cloud point" -msgstr "Chế tạo một đỉnh mạng lưới cho mỗi điểm trong mây điểm" +msgstr "Tạo một điểm đỉnh khung lưới cho mỗi điểm đám mây điểm" msgid "Points to Volume" -msgstr "Điểm sang Thể Tích" +msgstr "Điểm thành Thể Tích" msgid "Generate a fog volume sphere around every point" -msgstr "Chế tạo một hình cầu thể tích sương mù quanh mỗi điểm" +msgstr "Tạo hình cầu thể tích sương mù xung quanh mọi điểm" msgid "Specify the approximate number of voxels along the diagonal" -msgstr "Xác định xấp xỉ số lượng thể tích tử trên đường chéo" +msgstr "Xác định số lượng thể tích tử ước chừng dọc theo đường chéo" msgid "Specify the voxel side length" -msgstr "Xác định chiều dài cạnh của thể tích tử" +msgstr "Xác định chiều dài cạnh bên của thể tích tử" msgid "Geometry Proximity" -msgstr "Khoảng Cách Hình Dạng" +msgstr "Mức Lân Cận Hình Học" msgid "Compute the closest location on the target geometry" -msgstr "Tính vị trí gần nhất trên hình dạng mục tiêu" +msgstr "Tính toán địa điểm gần nhất trên hình học mục tiêu" msgid "Target Geometry" -msgstr "Hình Dạng Mục Tiêu" +msgstr "Hình Học Mục Tiêu" msgid "Element of the target geometry to calculate the distance from" -msgstr "Phần tử của hình dạng mục tiêu để tính khoảng cách từ nó" +msgstr "Phần tử của hình học mục tiêu để tính toán khoảng cách từ đó" msgid "Calculate the proximity to the target's points (faster than the other modes)" -msgstr "Tính khoảng cách đến các điểm của mục tiêu (nhanh hơn các chế độ khác)" +msgstr "Tính toán mức lân cận với các điểm của mục tiêu (nhanh hơn các chế độ khác)" msgid "Calculate the proximity to the target's edges" -msgstr "Tính khoảng cách đến các cạnh của mục tiêu" +msgstr "Tính toán mức lân cận tới các cạnh của mục tiêu" msgid "Calculate the proximity to the target's faces" -msgstr "Tính khoảng cách đến các mặt của mục tiêu" +msgstr "Tính toán mức lân cận với các mặt của mục tiêu" msgid "Raycast" -msgstr "Phát Tia" +msgstr "Bắn Tia" msgid "Cast rays from the context geometry onto a target geometry, and retrieve information from each hit point" -msgstr "Phát tia từ hình dạng bối cảnh đến hình dạng mục tiêu, và rút thông tin từ mỗi điểm trúng" +msgstr "Truyền các tia từ hình học ngữ cảnh lên hình học mục tiêu và trích xuất thông tin từ mỗi điểm đập trúng" msgid "Mapping from the target geometry to hit points" -msgstr "Ánh xạ từ hình dạng mục tiêu đến điểm trúng" +msgstr "Ánh xạ từ hình dạng mục tiêu đến điểm đánh trúng" msgid "Interpolate the attribute from the corners of the hit face" -msgstr "Suy nội đặc điểm từ các góc giác của mặt trúng" +msgstr "Nội suy thuộc tính từ các góc của Mặt đâm trúng" msgid "Use the attribute value of the closest mesh element" -msgstr "Dùng giá trị của đặc điểm của phần tử mạng lưới gần nhất" +msgstr "Sử dụng giá trị thuộc tính của phần tử khung lưới gần nhất" msgid "Realize Instances" -msgstr "Hình Thành Các Thực Thể" +msgstr "Hiện Thực Hóa các Thực Thể" + + +msgid "Convert instances into real geometry data" +msgstr "Chuyển đổi các thực thể thành dữ liệu hình học thực" msgid "Remove Named Attribute" -msgstr "Đã Xóa Đặc Điểm Có Tên" +msgstr "Xóa Thuộc Tính được Đặt Tên" msgid "Delete an attribute with a specified name from a geometry. Typically used to optimize performance" -msgstr "Xóa một đặc điểm có một tên được chỉ định từ một hình dạng. Thường dùng cho tối ưu hiệu suất" +msgstr "Xóa thuộc tính được đặt tên được chỉ định khỏi một hình học. Thường được sử dụng để tối ưu hóa hiệu suất" + + +msgid "Repeat Input" +msgstr "Lặp Lại Đầu Vào" + + +msgid "Paired Output" +msgstr "Đầu Ra được Ghép Bè" + + +msgid "Zone output node that this input node is paired with" +msgstr "Nút đầu ra của vùng mà nút đầu vào này vốn được ghép bè với" + + +msgid "Repeat Output" +msgstr "Lặp Lại Đầu Ra" + + +msgid "Active Item Index" +msgstr "Chỉ Số của Mục đang Hoạt Động" + + +msgid "Index of the active item" +msgstr "Chỉ số của mục đang hoạt động" + + +msgid "Inspection Index" +msgstr "Chỉ Số Thẩm Tra" + + +msgid "Iteration index that is used by inspection features like the viewer node or socket inspection" +msgstr "Chỉ số lặp lại được sử dụng bởi các tính năng thẩm tra như nút quan sát hoặc thẩm tra ổ cắm" msgid "Replace Material" -msgstr "Thay Thế Vật Liệu" +msgstr "Thay Thế Nguyên Vật Liệu" msgid "Swap one material with another" -msgstr "Trao đổi một vật liệu với cái khác" +msgstr "Tráo đổi nguyên vật liệu này với nguyên vật liệu khác" msgid "Resample Curve" -msgstr "Mẫu Lại Đường Cong" +msgstr "Lấy Mẫu Lại Đường Cong" msgid "Generate a poly spline for each input spline" -msgstr "Chế tạo một đa mẫu cong cho mỗi mẫu cong ngõ vào" +msgstr "Tạo chốt trục đa giác cho mỗi chốt trục cung cấp ở đầu vào" msgid "How to specify the amount of samples" -msgstr "Chỉ định số lượng mẫu" +msgstr "Phương pháp để xác định lượng mẫu thí nghiệm" msgid "Output the input spline's evaluated points, based on the resolution attribute for NURBS and Bezier splines. Poly splines are unchanged" -msgstr "Xuất các điểm được tính toán từ mẫu cong ngõ vào, tùy đặc điểm độ phân giải cho mẫu cong NURBS và Bezier. Các đa mẫu cong sẽ không đổi" +msgstr "Xuất các điểm đánh giá của chốt trục cung cấp ở đầu vào, dựa trên thuộc tính về độ phân giải cho các chốt trục NURBS và Bezier. Chốt trục đa giác Poly sẽ không thay đổi" msgid "Sample the specified number of points along each spline" -msgstr "Lấy mẫu cho số lượng điểm được xác định trên đường cong" +msgstr "Lấy mẫu theo số điểm chỉ định, dọc theo mỗi chốt trục" msgid "Calculate the number of samples by splitting each spline into segments with the specified length" -msgstr "Tính số lượng mẫu vật bằng chẻ mỗi mẫu cong thành khúc có chiều dài được xác định" +msgstr "Tính toán số lượng mẫu bằng cách tách phân mỗi chốt trục ra thành các phân đoạn nhỏ với chiều dài chỉ định" msgid "Reverse Curve" -msgstr "Lật Ngược Đường Cong" +msgstr "Đảo Ngược Đường Cong" + + +msgid "Change the direction of curves by swapping their start and end data" +msgstr "Đổi hướng của đường cong bằng bởi cách hoán đổi dữ liệu bắt đầu và kết thúc của chúng" msgid "Rotate Instances" -msgstr "Xoay Các Thực Thể" +msgstr "Xoay Chiều các Thực Thể" msgid "Rotate geometry instances in local or global space" -msgstr "Xoay thực thể của hình dạng trong không gian địa phương hoặc toàn cầu" +msgstr "Xoay chiều các thực thể hình học trong không gian cục bộ hoặc toàn cầu" msgid "Sample Curve" @@ -42910,79 +46283,131 @@ msgstr "Lấy Mẫu Đường Cong" msgid "Retrieve data from a point on a curve at a certain distance from its start" -msgstr "Rút dữ liệu từ một điểm trên một đường cong tại một khoảng cách nhất định từ bắt đầu của đường cong" +msgstr "Trích xuất dữ liệu từ một điểm trên đường cong ở một khoảng cách nhất định từ điểm khởi đầu" msgid "Method for sampling input" -msgstr "Phương pháp cho ngõ vào mẫu" +msgstr "Phương pháp lấy mẫu đầu vào" msgid "Find sample positions on the curve using a factor of its total length" -msgstr "Tìm vị trí mẫu trên đường cong bằng sử dụng một hệ số của tổng chiều dài của nó" +msgstr "Tìm các vị trí lấy mẫu trên đường cong bằng cách sử dụng một thừa số trên tổng chiều dài của nó" msgid "Find sample positions on the curve using a distance from its beginning" -msgstr "Tìm vị trí mẫu trên đường cong bằng sử dụng một khoảng cách từ đầu của nó" +msgstr "Tìm các vị trí lấy mẫu trên đường cong bằng cách sử dụng khoảng cách từ phần đầu của nó" + + +msgid "All Curves" +msgstr "Toàn Bộ các Đường Cong" + + +msgid "Sample lengths based on the total length of all curves, rather than using a length inside each selected curve" +msgstr "Lấy mẫu các chiều dài dựa trên tổng chiều dài của toàn bộ các đường cong, thay vì sử dụng một chiều dài bên trong mỗi đường cong đã chọn" + + +msgid "Sample Index" +msgstr "Lấy Mẫu Chỉ Số" + + +msgid "Retrieve values from specific geometry elements" +msgstr "Trích xuất các giá trị từ các phần tử hình học cụ thể" + + +msgid "Clamp the indices to the size of the attribute domain instead of outputting a default value for invalid indices" +msgstr "Hạn định số chỉ số theo kích thước của phạm vi thuộc tính thay vì xuất giá trị mặc định cho các chỉ số bất hợp lệ" + + +msgid "Sample Nearest" +msgstr "Lấy Mẫu Gần Nhất" + + +msgid "Find the element of a geometry closest to a position. Similar to the \"Index of Nearest\" node" +msgstr "Tìm phần tử của một hình học gần một vị trí nhất. Tương tự như nút \"Chỉ Số của cái Gần Nhất\"" + + +msgid "Sample Nearest Surface" +msgstr "Lấy Mẫu Bề Mặt Gần Nhất" + + +msgid "Calculate the interpolated value of a mesh attribute on the closest point of its surface" +msgstr "Tính giá trị nội suy của thuộc tính khung lưới ở điểm gần nhất trên bề mặt của nó" + + +msgid "Sample UV Surface" +msgstr "Lấy Mẫu UV của Bề Mặt" + + +msgid "Calculate the interpolated values of a mesh attribute at a UV coordinate" +msgstr "Tính toán các giá trị nội suy của thuộc tính khung lưới ở một tọa độ UV" msgid "Scale Elements" -msgstr "Phóng To Phần Tử" +msgstr "Đổi Tỷ Lệ Phần Tử" msgid "Scale groups of connected edges and faces" -msgstr "Phóng to các nhóm cạnh và đỉnh được kết nối nhau" +msgstr "Đổi tỷ lệ các nhóm, các cạnh và các mặt kết nối" msgid "Element type to transform" -msgstr "Loại phần tử cho biến hóa" +msgstr "Thể loại phần tử để biến hóa" msgid "Scale individual faces or neighboring face islands" -msgstr "Phóng to các mặt riêng hay hòn đảo cạnh kề" +msgstr "Đổi tỷ lệ các Mặt riêng rẽ hoặc các Mặt hải đảo lân cận" msgid "Scale individual edges or neighboring edge islands" -msgstr "Phóng to các cạnh riêng hay hòn đảo cạnh kề" +msgstr "Đổi tỷ lệ các cạnh riêng rẽ hoặc các cạnh hải đảo lân cận" msgid "Scale Mode" -msgstr "Chế Độ Phóng To" +msgstr "Chế Độ Tỷ Lệ Hóa" msgid "Scale elements by the same factor in every direction" -msgstr "Phóng to các phần tử bằng cùng hệ số mỗi hướng" +msgstr "Đổi tỷ lệ các phần tử theo cùng một hệ số trong mọi chiều hướng" msgid "Scale elements in a single direction" -msgstr "Phóng to các phần tử theo một hướng" +msgstr "Đổi tỷ lệ các phần tử theo một chiều hướng" msgid "Scale Instances" -msgstr "Phóng To Các Thực Thể" +msgstr "Đổi Tỷ Lệ Thực Thể" msgid "Scale geometry instances in local or global space" -msgstr "Phóng to các thực thể hình dạng trong không gian địa phương hoặc toàn cầu" +msgstr "Đổi tỷ lệ các thực thể hình học trong không gian cục bộ hoặc toàn cầu" + + +msgid "Self Object" +msgstr "Đối Tượng của Bản Thân" + + +msgid "Retrieve the object that contains the geometry nodes modifier currently being executed" +msgstr "Trích xuất đối tượng chứa bộ điều chỉnh nút hình học hiện đang được thực thi" msgid "Separate Components" -msgstr "Chẻ Thành Phhần" +msgstr "Tách Phân các Thành Phần" msgid "Split a geometry into a separate output for each type of data in the geometry" -msgstr "Chẻ một hình dạng thành ngõ ra riêng cho mỗi loại dữ liệu thì có trong hình dạng" +msgstr "Tách phân một hình học thành một đầu ra riêng biệt cho từng thể loại dữ liệu trong hình học đó" msgid "Separate Geometry" -msgstr "Chẻ Hình Dạng" +msgstr "Tách Phân Hình Học" msgid "Split a geometry into two geometry outputs based on a selection" -msgstr "Chẻ một hình dạng thành hai ngõ ra tùy theo một sự lựa chọn" +msgstr "Phân tách một hình học thành hai đầu ra hình học dựa trên một lựa chọn" msgid "Which domain to separate on" -msgstr "Chẻ trong phạm vi nào" +msgstr "Tên miền (phạm vi) nào để tách phân ra trên ấy" msgid "Set Handle Positions" @@ -42990,11 +46415,35 @@ msgstr "Đặt Vị Trí Tay Cầm" msgid "Set the positions for the handles of Bézier curves" -msgstr "Đặt vị trí cho các tay cầm của đường cong Bezier" +msgstr "Đặt vị trí cho các tay cầm của đường cong Bézier" + + +msgid "Set Curve Normal" +msgstr "Đặt Pháp Tuyến Đường Cong" + + +msgid "Set the evaluation mode for curve normals" +msgstr "Đặt chế độ tính toán cho pháp tuyến đường cong" + + +msgid "Mode for curve normal evaluation" +msgstr "Chế độ tính toán pháp tuyến đường cong" + + +msgid "Minimum Twist" +msgstr "Độ Xoắn Tối Thiểu" + + +msgid "Calculate normals with the smallest twist around the curve tangent across the whole curve" +msgstr "Tính toán các pháp tuyến với độ xoắn nhỏ nhất quanh tiếp tuyến đường cong trên toàn bộ đường cong" msgid "Z Up" -msgstr "Z Trên" +msgstr "Z Lên Trên" + + +msgid "Calculate normals perpendicular to the Z axis and the curve tangent. If a series of points is vertical, the X axis is used" +msgstr "Tính toán các pháp tuyến vuông góc với trục Z và tiếp tuyến của đường cong. Nếu một loạt các điểm đều là thẳng đứng thì trục X được sử dụng" msgid "Set Curve Radius" @@ -43002,15 +46451,15 @@ msgstr "Đặt Bán Kính Đường Cong" msgid "Set the radius of the curve at each control point" -msgstr "Đặt bán kính của đường cong tại mỗi điểm kiểm soát" +msgstr "Đặt bán kính của đường cong tại mỗi điểm điều khiển" msgid "Set Curve Tilt" -msgstr "Đặt Độ Nghieng Đường Cong" +msgstr "Đặt Độ Nghiêng của Đường Cong" msgid "Set the tilt angle at each curve control point" -msgstr "Đặt góc nghiêng tại mỗi điểm kiểm soát của đường cong" +msgstr "Đặt góc xoay nghiêng tại mỗi điểm điều khiển của đường cong" msgid "Set ID" @@ -43018,23 +46467,23 @@ msgstr "Đặt ID" msgid "Set the id attribute on the input geometry, mainly used internally for randomizing" -msgstr "Đặt đặc điểm id cho hình dạng ngõ vào, thường dùng cho ngẫu nhiên hóa nội bộ" +msgstr "Đặt thuộc tính id trên hình học đầu vào, chủ yếu được sử dụng nội bộ cho quá trình ngẫu nhiên hóa" msgid "Set Material" -msgstr "Đặt Vật Liệu" +msgstr "Đặt Nguyên Vật Liệu" msgid "Assign a material to geometry elements" -msgstr "Chỉ định một vật liệu đến phần tử hình dạng" +msgstr "Ấn định nguyên vật liệu cho các phần tử hình học" msgid "Set Material Index" -msgstr "Đặt Chỉ Số Vật Liệu" +msgstr "Đặt Chỉ Số Nguyên Vật Liệu" msgid "Set the material index for each selected geometry element" -msgstr "Đặt chỉ số vật lịêu cho mỗi phần tử hình dạng được chọn" +msgstr "Đặt chỉ số nguyên vật liệu cho từng phần tử hình học đã chọn" msgid "Set Point Radius" @@ -43042,231 +46491,279 @@ msgstr "Đặt Bán Kính Điểm" msgid "Set the display size of point cloud points" -msgstr "Đặt cỡ thước hiển thị của điểm trong mây điểm" +msgstr "Đặt kích thước hiển thị của các điểm đám mây điểm" msgid "Set Position" -msgstr "Đặt Vị Trí" +msgstr "Đặt Vị trí" msgid "Set the location of each point" -msgstr "Đặt vị trí của mỗi điểm" +msgstr "Đặt vị trí của từng điểm một" msgid "Set Shade Smooth" -msgstr "Đặt Tô Sắc Mịn" +msgstr "Đặt Tô Bóng là Mịn Màng" msgid "Control the smoothness of mesh normals around each face by changing the \"shade smooth\" attribute" -msgstr "Kiểm soát độ mịn của pháp tuyến mạng lưới quanh mỗi mật bằng đổi đặc điểm \"tô sắc mịn\"" +msgstr "Điều khiển độ mịn màng của các pháp tuyến khung lưới xung quanh mỗi Mặt bằng cách thay đổi thuộc tính \"tô bóng mịn màng\"" msgid "Set Spline Cyclic" -msgstr "Đặt Mẫu Cong Chu Trình" +msgstr "Đặt Chốt Trục là Tuần Hoàn" msgid "Control whether each spline loops back on itself by changing the \"cyclic\" attribute" -msgstr "Kiểm soát mỗi mẫu cong lặp lại đến một mình hay không bằng đổi đặc điểm \"chuTrình\"" +msgstr "Điều khiển xem mỗi chốt trục có tự lặp lại hay không bằng cách thay đổi thuộc tính \"tuần hoàn\"" msgid "Set Spline Resolution" -msgstr "Đặt Độ Phân Mẫu Cong" +msgstr "Đặt Độ Phân Giải Chốt Trục" msgid "Control how many evaluated points should be generated on every curve segment" -msgstr "Kiểm soát nên chế tạo bao nhiêu điểm được tính toán trên mỗi khúc đường cong" +msgstr "Điều khiển số lượng điểm đánh giá sẽ tạo ra trên mỗi phân đoạn đường cong" + + +msgid "Simulation Input" +msgstr "Đầu Vào Mô Phỏng" + + +msgid "Simulation Output" +msgstr "Đầu Ra Mô Phỏng" msgid "Spline Length" -msgstr "Chiều Dài Mẫu Cong" +msgstr "Chiều Dài Chốt Trục" msgid "Retrieve the total length of each spline, as a distance or as a number of points" -msgstr "Rút tổng chiều dài của mỗi mẫu cong, là khoảng cách hoặc số lượng điểm" +msgstr "Trích xuất tổng chiều dài của mỗi chốt trục, dưới dạng khoảng cách hoặc số điểm" msgid "Spline Parameter" -msgstr "Tham Số Mẫu Cong" +msgstr "Tham Số Chốt Trục" msgid "Retrieve how far along each spline a control point is" -msgstr "Rút ra bao xa trên mỗi mỗu cong đến một điểm kiểm soát" +msgstr "Trích xuất khoảng cách của điểm điều khiển dọc theo mỗi chốt trục một" msgid "Split Edges" -msgstr "Chẻ Cạnh" +msgstr "Tách Phân Cạnh" msgid "Duplicate mesh edges and break connections with the surrounding faces" -msgstr "Bản sao cạnh mạng lưới và gỡ liên kết với các mặt xung quanh" +msgstr "Nhân đôi các cạnh khung lưới và phá vỡ kết nối với các mặt xung quanh" msgid "Store Named Attribute" -msgstr "Chứa Đặc Điểm Có Tên" +msgstr "Lưu Trữ Thuộc Tính Có Tên" msgid "Store the result of a field on a geometry as an attribute with the specified name" -msgstr "Chứa kết qủa của một trường trên một hình dạng bằng một đặc điểm có tên được chỉ định" +msgstr "Lưu trữ kết quả của một trường trên một hình học dưới dạng một thuộc tính với tên được chỉ định" msgid "Join Strings" -msgstr "Kết Nối Xâu" +msgstr "Hội Nhập các Chuỗi Ký Tự" msgid "Combine any number of input strings" -msgstr "Gồm bất cứ số lượng xâu ngõ vào" +msgstr "Kết hợp bất kỳ số chuỗi ký tự đầu vào nào lại làm một" msgid "String to Curves" -msgstr "Xâu đến Mẫu Cong" +msgstr "Chuỗi Ký Tự thành Đường Cong" msgid "Generate a paragraph of text with a specific font, using a curve instance to store each character" -msgstr "Chế tạo một đoạn văn có văn bản dùng một phông được chỉ định, dùng một đường cong cho chứa mỗi ký tự" +msgstr "Tạo một đoạn văn bản với một phông chữ cụ thể, sử dụng một thực thể đường cong để lưu trữ từng ký tự một" msgid "Align text to the center" -msgstr "Kéo văn bản đến trung tâm" +msgstr "Căn chỉnh văn bản về trung tâm" msgid "Align text to the left and the right" -msgstr "Kéo văn bản vừa lề phía trái và phải" +msgstr "Căn chỉnh văn bản về bên trái và phải" msgid "Align text to the left and the right, with equal character spacing" -msgstr "Kéo văn bản vừa lề phía trái và phải, và có cách đều giữa ký tự" +msgstr "Căn chỉnh văn bản sang trái và phải, với khoảng cách ký tự bằng nhau" msgid "Font of the text. Falls back to the UI font by default" -msgstr "Phông của văn bản. Mặc định là dùng phông của giao diện" +msgstr "Phông của văn bản. Quay trở lại sử dụng phông của Giao Diện Người Dùng, theo mặc định, nếu có sự cố" msgid "Let the text use more space than the specified height" -msgstr "Cho văn bản giành chỗ hơn chiều được xác định" +msgstr "Cho phép văn bản sử dụng nhiều không gian hơn là chiều cao xác định" msgid "Scale To Fit" -msgstr "Phóng To Cho Vừa" +msgstr "Đổi Tỷ Lệ để Khít Vừa" msgid "Scale the text size to fit inside the width and height" -msgstr "Phóng to văn bản vừa chiều rộng và cao phía trong" +msgstr "Đổi tỷ lệ kích thước văn bản để phù hợp với chiều rộng và chiều cao" msgid "Only output curves that fit within the width and height. Output the remainder to the \"Remainder\" output" -msgstr "Chỉ xuất các đường cong vừa chiều rộng và cao phía trong. Xuất còn dư đến ngõ ra \"Dư\"" +msgstr "Chỉ cho ra kết quả các đường cong nào phù hợp với chiều rộng và chiều cao mà thôi. Cung cấp phần còn lại ở đầu ra \"Phần Còn Lại\"" msgid "Pivot point position relative to character" -msgstr "Vị trí của điểm tựa tương đối với ký tự" +msgstr "Vị trí điểm tựa tương đối với nhân vật" msgid "Top Left" -msgstr "Trên Trái" +msgstr "Đỉnh Trái" msgid "Top Center" -msgstr "Trên Trung" +msgstr "Trung Tâm Đỉnh" msgid "Top Right" -msgstr "Trên Phải" +msgstr "Đỉnh Bên Phải" msgid "Bottom Left" -msgstr "Dưới Trái" +msgstr "Đáy Bên Trái" msgid "Bottom Center" -msgstr "Dưới Trung" +msgstr "Trung Tâm Đáy" msgid "Bottom Right" -msgstr "Dưới Phải" +msgstr "Đáy Bên Phải" msgid "Subdivide Curve" -msgstr "Phân Hóa Đường Cong" +msgstr "Phân Chia Đường Cong" msgid "Dividing each curve segment into a specified number of pieces" -msgstr "Chia sẻ mỗi đường cong thành số miến được chỉ định" +msgstr "Chia mỗi phân đoạn đường cong thành một số phần cụ thể" msgid "Subdivide Mesh" -msgstr "Phân Hóa Mạng Lưới" +msgstr "Phân Chia Khung Lưới" msgid "Divide mesh faces into smaller ones without changing the shape or volume, using linear interpolation to place the new vertices" -msgstr "Chia sẻ các mặt mạng lưới thành mặt nhỏ hơn nhưng không đổi hình dạng hoặc thể tích, dùng nội suy tuyến tính để đặt vị trí cho các đỉnh mới" +msgstr "Chia các mặt khung lưới thành các mặt nhỏ hơn mà không thay đổi hình dạng hoặc thể tích, sử dụng nội suy tuyến tính để đặt các điểm đỉnh mới" msgid "Divide mesh faces to form a smooth surface, using the Catmull-Clark subdivision method" -msgstr "Chia sẻ các mặt mạng lưới cho tạo một bề mặt mịn, sử dụng phương pháp phân hóa bề mặt Catmull-Clark" +msgstr "Chia các mặt khung lưới để tạo thành một các mặt mịn màng, sử dụng phương pháp chia nhỏ Catmull-Clark" msgid "Switch between two inputs" -msgstr "Trao đổi giữa hai ngõ vào" +msgstr "Chuyển đổi giữa hai đầu vào" + + +msgid "The scene's 3D cursor location and rotation" +msgstr "Vị trí và xoay chiều của con trỏ 3D trong cảnh" + + +msgid "Face Set" +msgstr "Bề Mặt Ấn Định" + + +msgid "Each face's sculpt face set value" +msgstr "Giá trị bề mặt ấn định điêu khắc của mỗi mặt" msgid "Selection" -msgstr "Sự Lựa Chọn" +msgstr "Lựa Chọn" + + +msgid "User selection of the edited geometry, for tool execution" +msgstr "Lựa chọn hình học đã chỉnh sửa của người dùng, để thi hành công cụ" + + +msgid "Set Face Set" +msgstr "Đặt Bề Mặt Ấn Định" + + +msgid "Set sculpt face set values for faces" +msgstr "Đặt giá trị bề mặt ấn định điêu khắc cho các mặt" + + +msgid "Set Selection" +msgstr "Đặt Lựa Chọn" + + +msgid "Set selection of the edited geometry, for tool execution" +msgstr "Đặt lựa chọn là hình học đã chỉnh sửa, để thi hành công cụ" + + +msgid "Transform Geometry" +msgstr "Biến Hóa Hình Học" msgid "Translate, rotate or scale the geometry" -msgstr "Dịch, xoay, hay phóng to hình dạng" +msgstr "Dịch chuyển, xoay chiều hoặc đổi tỷ lệ hình học" msgid "Translate Instances" -msgstr "Dịch Thực Thẻ" +msgstr "Dịch Chuyển các Thực Thể" msgid "Move top-level geometry instances in local or global space" -msgstr "Di chuyển thực thể hình dạng tầng cấp cao không không gian địa phương hay toàn cầu" +msgstr "Di chuyển các thực thể hình học ở cấp cao nhất trong không gian cục bộ hoặc toàn cầu" msgid "Convert all faces in a mesh to triangular faces" -msgstr "Biến đổi hết mặt trong một mạng lưới thành mặt tam giác" +msgstr "Chuyển đổi toàn bộ các mặt trong khung lưới thành các mặt tam giác" msgid "Trim Curve" -msgstr "Cắt Đường Cong" +msgstr "Cắt Xén Đường Cong" msgid "Shorten curves by removing portions at the start or end" -msgstr "Rút ngắn các đường cong bằng cắt bớt một phần tại đầu và cuối" +msgstr "Thu ngắn các đường cong bằng cách xóa các phần ở đầu hoặc cuối đi" msgid "How to find endpoint positions for the trimmed spline" -msgstr "Phương pháp tìm điểm vị trí đầu và cuối cho mẫu cong bị cắt" +msgstr "Phương pháp tìm các vị trí điểm cuối đối với chốt trục đã được cắt tỉa" msgid "Find the endpoint positions using a factor of each spline's length" -msgstr "Tìm điểm vị trí đầu và cuối bằng dùng một hệ số của chiều dài từng mẫu cong" +msgstr "Tìm các vị trí điểm cuối bằng cách sử dụng một hệ số chiều dài của mỗi chốt trục" msgid "Find the endpoint positions using a length from the start of each spline" -msgstr "Tìm điểm vị trí đầu và cuối bằng dùng một chiều dài từ đầu mỗi mẫu cong" +msgstr "Tìm các vị trí điểm cuối bằng cách sử dụng độ dài từ đầu mỗi chốt trục" msgid "Pack UV Islands" -msgstr "Gói Đảo UV" +msgstr "Đóng Gói các Hải Đảo UV" msgid "Scale islands of a UV map and move them so they fill the UV space as much as possible" -msgstr "Phóng to hòn đảo của một bản đồ UV và di chuyển chúng nó cho che đầy không gian UV nhiều nhất có thể" +msgstr "Đổi tỷ lệ các hải đảo của ánh xạ UV và di chuyển chúng để chúng phủ kín không gian UV ở mức độ cao nhất có thể" msgid "UV Unwrap" msgstr "Mở Gói UV" +msgid "Generate a UV map based on seam edges" +msgstr "Sinh tạo ánh xạ UV dựa trên các cạnh đường khâu" + + msgid "Angle Based" msgstr "Cơ Sở Góc" msgid "This method gives a good 2D representation of a mesh" -msgstr "Phương pháp này cấp một biểu diễn 2D tốt cho một mạng lưới" +msgstr "Phương pháp này cung cấp một đại diện 2D tốt của khung lưới" msgid "Conformal" @@ -43274,172 +46771,188 @@ msgstr "Bảo Giác" msgid "Uses LSCM (Least Squares Conformal Mapping). This usually gives a less accurate UV mapping than Angle Based, but works better for simpler objects" -msgstr "Dùng LSCM (Bình Phương Tối Thiểu Bản Đồ Bảo Giác). Thường phương pháp này giảm độ chín xác so với phương pháp Cơ Sở UV, nhưng tốt hơn cho vật thể đơn giản hơn" +msgstr "Sử dụng LSCM (Least Squares Conformal Mapping). Chức năng này thường cung cấp ánh xạ UV kém chính xác hơn phương pháp dựa trên góc độ (Angle Based), nhưng hoạt động tốt hơn cho các đối tượng đơn giản hơn" + + +msgid "Vertex of Corner" +msgstr "Điểm Đỉnh của Góc" + + +msgid "Retrieve the vertex each face corner is attached to" +msgstr "Trích xuất điểm đỉnh mà mỗi góc của Mặt dính vào" msgid "Display the input data in the Spreadsheet Editor" -msgstr "Hiển thị dữ liệu ngõ vào trong Bộ Biện Tập Bảng Tính" +msgstr "Hiển thị dữ liệu đầu vào trong Trình Biên Soạn Bảng Tính" + + +msgid "Domain to evaluate the field on" +msgstr "Phạm vi để tính toán trường trên đó" msgid "Volume Cube" -msgstr "Hình Lập Phương Thể Tích" +msgstr "Khối Lập Phương Thể Tích" msgid "Generate a dense volume with a field that controls the density at each grid voxel based on its position" -msgstr "Chế tạo một thể tích mật độ cao có một trường kiểm soát tỉ trọng tại mỗi thể tích tử tùy theo vị trí của nó" +msgstr "Tạo một thể tích dày đặc với một trường điều khiển mật độ tại mỗi thể tích tử của khung lưới đồ thị dựa trên vị trí của nó" msgid "Generate a mesh on the \"surface\" of a volume" -msgstr "Chế tạo một mạng lưới trên \"bềMặt\" của một thể tích" +msgstr "Tạo lưới trên \"bề mặt\" của một thể tích" msgctxt "NodeTree" msgid "Frame" -msgstr "Bức Ảnh" +msgstr "Khung Hình" msgid "Collect related nodes together in a common area. Useful for organization when the re-usability of a node group is not required" -msgstr "Gồm các giao điểm có liên quan nhau trong một khu vực chung Tốt cho tổ chức khi sự dùng lại của một nhóm giao điểm là không yêu cầu" +msgstr "Thu thập các nút liên quan với nhau trong một khu vực chung. Hữu ích cho bố trí không yêu cầu khả năng tái sử dụng của một nhóm nút" msgid "Label Font Size" -msgstr "Kích Cỡ Phông Nhãn" +msgstr "Kích Thước Phông Trên Nhãn Hiệu" msgid "Font size to use for displaying the label" -msgstr "Kích cỡ phông cho hiển thị nhãn" +msgstr "Kích thước phông sử dụng để hiển thị nhãn hiệu" msgid "Shrink the frame to minimal bounding box" -msgstr "Thu nhỏ bức ảnh đến hợp bao quanh cực tiểu" +msgstr "Thu nhỏ khung hình lại về khung hộp viền tối thiểu" msgid "Group Input" -msgstr "Ngõ Vào Nhóm" +msgstr "Đầu Vào Nhóm" msgid "Expose connected data from inside a node group as inputs to its interface" -msgstr "Phơi ra dữ liệu liên quan từ phía trong một nhóm giao điểm cho làm ngõ vào trong giao diện của nó" +msgstr "Hiển thị dữ liệu kết nối từ bên trong một nhóm nút làm đầu vào cho giao diện của nó" msgid "Group Output" -msgstr "Ngõ Ra Nhóm" +msgstr "Đầu Ra Nhóm" msgid "Output data from inside of a node group" -msgstr "Dữ liệu ngõ ra từ phía trong của một nhóm giao điểm" +msgstr "Xuất ra dữ liệu từ bên trong nhóm nút" msgid "Active Output" -msgstr "Ngõ Ra Hoạt Động" +msgstr "Đầu Ra đang Sử Dụng" msgid "True if this node is used as the active group output" -msgstr "Đứng nếu dùng giao điểm này làm ngõ ra của nhóm hoạt động" +msgstr "Giá trị 'Đúng' nếu nút này được sử dụng làm đầu ra nhóm đang hoạt động" msgid "Reroute" -msgstr "Tuyến Lại" +msgstr "Đổi Tuyến" msgid "A single-socket organization tool that supports one input and multiple outputs" -msgstr "Một dụng cụ tổ chức chỉ có một khe thì hỗ trợ một ngõ vào và nhiều ngõ ra" +msgstr "Một công cụ tổ chức ổ cắm đơn hỗ trợ một đầu vào và nhiều đầu ra" msgid "Shader Node" -msgstr "Giao Điểm Bộ Tô Sắc" +msgstr "Nút Tô Bóng" msgid "Material shader node" -msgstr "Giao điểm bộ tô sắc vật liệu" +msgstr "Nút tô bóng nguyên vật liệu" msgid "Add Shader" -msgstr "Thêm Bộ Tô Sắc" +msgstr "Thêm Bộ Tô Bóng" msgid "Add two Shaders together" -msgstr "Cộng hai Bộ Tô Sắc với nhau" +msgstr "Thêm hai Bộ Tô Bóng cùng với nhau" msgid "Ambient Occlusion" -msgstr "Che Khuất Bao Quanh" +msgstr "Tính Hấp Thụ Quang Xạ Môi Trường" msgid "" "Compute how much the hemisphere above the shading point is occluded, for example to add weathering effects to corners.\n" "Note: For Cycles, this may slow down renders significantly" msgstr "" -"Tính boa nhiêu của bán cầu phía trên điểm được tô sắc đang bị che khuất, ví dụ để thêm hiệu ứng ăn mòi trên góc giác.\n" -"Lưu ý: Cho Cycles, cáy này có thể giảm tốc độ kết xuất rất nhiều" +"Tính toán mức độ che khuất của bán cầu phía trên điểm tô bóng, chẳng hạn như để thêm hiệu ứng ảnh hưởng bẩn mòn cũ do thời gian vào các góc cạnh.\n" +"Lưu ý: Đối với Cycles, chức năng này có thể làm chậm kết xuất đáng kể" msgid "Trace rays towards the inside of the object" -msgstr "Phát tia đến phía trong của vật thể" +msgstr "Dò các tia xạ hướng về phía bên trong của đối tượng" msgid "Only Local" -msgstr "Chỉ Địa Phương" +msgstr "Duy Cục Bộ" msgid "Only consider the object itself when computing AO" -msgstr "Chỉ quan tâm vật thể một mình khi tính che khuất bao quanh" +msgstr "Chỉ cân nhắc bản thân đối tượng khi tính toán AO (Ambient Occlusions: Tính Hấp Thụ Môi Trường, Viết Tắt là THTMT)" msgid "Number of rays to trace per shader evaluation" -msgstr "Số lượng tia để phát cho mỗi lần tính toán bộ sắc" +msgstr "Số tia xạ để dò tìm trong sự đánh giá của mỗi bộ tô bóng" msgid "Retrieve attributes attached to objects or geometry" -msgstr "Rút đặc điểm dính với vật thể hay hình dạng" +msgstr "Trích xuất các thuộc tính gắn liền với các đối tượng hoặc hình học" msgid "Attribute Name" -msgstr "Tên Đặc Điểm" +msgstr "Tên Thuộc Tính" msgid "Attribute Type" -msgstr "Loại Đặc Điểm" +msgstr "Thể Loại Thuộc Tính" msgid "General type of the attribute" -msgstr "Loại tổng quát của đặc điểm" +msgstr "Thể loại thông thường của thuộc tính" msgid "The attribute is associated with the object geometry, and its value varies from vertex to vertex, or within the object volume" -msgstr "Đặc điểm có liên quan với hình dạng vật thể, và giá trị của nó được biến đổi từ đỉnh đến đỉnh, hay phía trong thể tích vật thể" +msgstr "Thuộc tính liên quan với hình học của đối tượng, và giá trị của nó thay đổi từ điểm đỉnh này đến điểm đỉnh kia, hoặc nội bên trong thể tích của đối tượng" msgid "The attribute is associated with the object or mesh data-block itself, and its value is uniform" -msgstr "Đặc điểm có liên quan với vật thể hay cục dữ liệu mạng lưới trực tiếp, và giá trị của nó đều đặn" +msgstr "Thuộc tính liên quan với đối tượng hoặc khối dữ liệu của bản thân khung lưới, và giá trị của nó là đồng nhất" msgid "Instancer" -msgstr "Bộ Thực Thể Hóa" +msgstr "Thực Thể Hóa Viên" msgid "The attribute is associated with the instancer particle system or object, falling back to the Object mode if the attribute isn't found, or the object is not instanced" -msgstr "Đặc điểm có liên quan với hệ thống hạt thực thế hóa hay vật thể. Nếu không tìm được đặc điểm hay vật thể chưa được thực thế hóa, trở lại chế độ Vật Thẻ" +msgstr "Thuộc tính liên quan với thực thể hóa viên của hệ thống hạt hoặc đối tượng. Nó sẽ hồi phục trở về chế độ đối tượng nếu không tìm thấy thuộc tính, hoặc là đối tượng sẽ không được thực thể hóa nữa" + + +msgid "The attribute is associated with the View Layer, Scene or World that is being rendered" +msgstr "Thuộc tính liên quan tới Tầng Góc Nhìn, Cảnh hoặc Thế Giới đang được kết xuất" msgid "Background" -msgstr "Nền" +msgstr "Nền Sau" msgid "" "Add background light emission.\n" "Note: This node should only be used for the world surface output" msgstr "" -"Thêm phát xạ từ đèn nền.\n" -"Lưu ý: giao điểm này chỉ nên dùng cho ngõ ra của bề mặt thế giới" +"Thêm phát xạ ánh sáng nền.\n" +"Lưu ý: Nút này chỉ nên được sử dụng cho đầu ra bề mặt thế giới" msgid "" "Generates normals with round corners.\n" "Note: only supported in Cycles, and may slow down renders" msgstr "" -"Chế tạo pháp tuyến có góc tròn.\n" -"Lưu ý: chỉ được hỗ trợ trong Cycles, và có thể giảm tốc độ kết xuất" +"Sinh tạo các phpt với các góc tròn.\n" +"Lưu ý: chỉ được hỗ trợ trong Cycles và có thể làm chậm kết xuất" msgid "Blackbody" @@ -43447,23 +46960,23 @@ msgstr "Vật Đen" msgid "Convert a blackbody temperature to an RGB value" -msgstr "Biến đổi nhiệt độ vật đen sang một giá trị RGB" +msgstr "Chuyển đổi nhiệt độ vật đen thành giá trị RGB" msgid "Control the brightness and contrast of the input color" -msgstr "Kiểm soát độ sáng và chênh lệch của màu ngõ vào" +msgstr "Kiểm soát độ sáng và độ tương phản của màu đầu vào" msgid "Glossy BSDF" -msgstr "BSDF Bóng Loáng" +msgstr "BSDF Bóng Bẩy" msgid "Reflection with microfacet distribution, used for materials such as metal or mirrors" -msgstr "Phản xạ có phân phối mặt vi mô, được dùng cho vật liệu như kim loại hoặc cái kiến" +msgstr "Ánh phản xạ với sự phân bổ microfacet, được sử dụng cho các nguyên vật liệu như kim loại hoặc gương" msgid "Light scattering distribution on rough surface" -msgstr "Sự phân phối của tán xạ ánh sáng trên bề mặt nhám" +msgstr "Sự phân bố tán xạ ánh sáng trên bề mặt gồ ghề" msgid "Beckmann" @@ -43482,12 +46995,16 @@ msgid "Multiscatter GGX" msgstr "GGX Đa Tán Xạ" +msgid "GGX with additional correction to account for multiple scattering, preserve energy and prevent unexpected darkening at high roughness" +msgstr "GGX với khả năng hiệu chỉnh bổ sung để giải quyết hiện tượng tán xạ nhiều lần, bảo toàn năng lượng và ngăn ngừa hiện tượng tối đi bất ngờ ở độ nhám cao" + + msgid "Diffuse BSDF" -msgstr "BSDF Tán Xạ" +msgstr "BSDF Khuếch Tán" msgid "Lambertian and Oren-Nayar diffuse reflection" -msgstr "Phản tán xạ Lambert và Oren-Nayar" +msgstr "Phản xạ khuếch tán Lambert và Oren-Nayar" msgid "Glass BSDF" @@ -43495,7 +47012,7 @@ msgstr "BSDF Thủy Tinh" msgid "Glass-like shader mixing refraction and reflection at grazing angles" -msgstr "Bộ tô sắc như thủy tinh, pha trộn khúc xạ và phản xạ cho góc tiếp tuyến" +msgstr "Bộ tô bóng giống thủy tinh hòa trộn giữa ánh khúc xạ và phản xạ ở các góc tới" msgid "Hair BSDF" @@ -43503,39 +47020,55 @@ msgstr "BSDF Tóc" msgid "Reflection and transmission shaders optimized for hair rendering" -msgstr "Bộ tô sắc phản xạ và truyền ánh sáng được tối ưu cho kết xuất tóc" +msgstr "Các bộ tô bóng phản xạ và truyền xạ được tối ưu hóa để kết xuất tóc" msgid "Hair BSDF component to use" -msgstr "Thành phần BSDF tóc để dùng" +msgstr "Thành phần Tóc BSDF để sử dụng" msgid "Reflection" -msgstr "Phản Xạ" +msgstr "Phản Quang" msgid "The light that bounces off the surface of the hair" -msgstr "Ánh sáng nhồi từ bề mặt tóc" +msgstr "Ánh sáng phản chiếu từ bề mặt của sợi tóc" msgid "The light that passes through the hair and exits on the other side" -msgstr "Ánh sáng xuyên qua tóc và xuất ra phía đối diện" +msgstr "Ánh sáng đi qua tóc và thoát ra ở phía bên kia" msgid "Principled Hair BSDF" -msgstr "BSDF Tóc Tổng Quát" +msgstr "BSDF Nguyên Tắc của Tóc" msgid "Physically-based, easy-to-use shader for rendering hair and fur" -msgstr "Cơ sở vật lý, bộ tô sắc dễ dùng cho kết xuất tóc và lông" +msgstr "Bộ tô bóng dựa trên vật lý, dễ sử dụng để kết xuất tóc và lông thú" + + +msgid "Scattering model" +msgstr "Mô hình tán xạ" + + +msgid "Select from Chiang or Huang model" +msgstr "Chọn mô hình Chiang hoặc Huang" + + +msgid "Near-field hair scattering model by Chiang et al. 2016, suitable for close-up looks, but is more noisy when viewing from a distance" +msgstr "Mô hình tán xạ tóc cận trường của Chiang cùng các cộng sự 2016, thích hợp đối với quan sát cận cảnh, song nhiễu nhiều hơn khi nhìn từ xa" + + +msgid "Far-field hair scattering model by Huang et al. 2022, suitable for viewing from a distance, supports elliptical cross-sections and has more precise highlight in forward scattering directions" +msgstr "Mô hình tán xạ tóc viễn trường của Huang cùng các cộng sự 2022, thích hợp để quan sát từ xa, hỗ trợ mặt cắt hình elip và có điểm nhấn chính xác hơn theo hướng tán xạ về phía trước" msgid "Color Parametrization" -msgstr "Tham Số Hóa Màu Sắc" +msgstr "Tham Số Hóa Màu" msgid "Select the shader's color parametrization" -msgstr "Chọn tham số hóa cho màu của bộ tô sắc" +msgstr "Chọn tham số hóa màu của bộ tô bóng" msgid "Absorption Coefficient" @@ -43543,39 +47076,39 @@ msgstr "Hệ Số Hấp Thụ" msgid "Directly set the absorption coefficient \"sigma_a\" (this is not the most intuitive way to color hair)" -msgstr "Trực tiếp đặt hệ số hấp thụ \"xichma_a\" (này không phải là phương pháp trực giác nhất để tô màu tóc)" +msgstr "Đặt hệ số hấp thụ ánh sáng \"sigma_a\" trực tiếp (đây không phải là phương pháp trực giác nhất để tô màu tóc)" msgid "Melanin Concentration" -msgstr "Nộng Độ Hắc Tố" +msgstr "Nồng Độ Melanin" msgid "Define the melanin concentrations below to get the most realistic-looking hair (you can get the concentrations for different types of hair online)" -msgstr "Xác định nộng độ của hắt tố ở phía dưới để được tóc xem thật tế nhất (bạn có thể lấy thôn tin nông độ cho các loại tóc khác trên mạng)" +msgstr "Xác định nồng độ của mêlanin dưới đây để đạt được sự thể hiện tóc trông giống thật nhất (bạn có thể tìm được giá trị các nồng độ melanin cho các loại tóc khác nhau trên mạng)" msgid "Direct Coloring" -msgstr "Tô Trực Tiếp" +msgstr "Tô Màu Trực Tiếp" msgid "Choose the color of your preference, and the shader will approximate the absorption coefficient to render lookalike hair" -msgstr "Chọn màu bạn tùy thích, và bộ tô sắc sẽ tính xấp xỉ một hệ số để kết xuất tóc giống tóc thật" +msgstr "Chọn màu cấu hình của bạn, và bộ tô bóng sẽ ước tính xấp xỉ hệ số hấp thụ để kết xuất tóc giống như thế" msgid "Principled BSDF" -msgstr "BSDF Tổng Quát" +msgstr "BSDF Nguyên Tắc" msgid "Physically-based, easy-to-use shader for rendering surface materials, based on the Disney principled model also known as the \"PBR\" shader" -msgstr "Cơ sở vật lý, bộ tô sắc dễ dùng cho kết xuất vật liệu bề mặt, cơ sở mô hình tổng hoát của Disney và cũng có tên bộ tô sắc \"PBR\"" +msgstr "Bộ đổ bóng dựa trên vật lý, dễ sử dụng để kết xuất nguyên vật liệu bề mặt, dựa trên mô hình nguyên tắc của Disney, còn được gọi là bộ tô bóng \"PBR\"" msgid "Subsurface Method" -msgstr "Phương Pháp Hạ Bề Mặt" +msgstr "Phương Pháp Tán Xạ Dưới Bề Mặt" msgid "Method for rendering subsurface scattering" -msgstr "Phương pháp để kết xuất tán xạ hạ bề mặt" +msgstr "Phương pháp để kết xuất tán xạ dưới bề mặt" msgid "Christensen-Burley" @@ -43583,15 +47116,23 @@ msgstr "Christensen-Burley" msgid "Approximation to physically based volume scattering" -msgstr "Xấp xỉ với cơ sở vật lý của tán xá thể tích" +msgstr "Ước tính tán xạ thể tích trên cơ sở vật lý" msgid "Random Walk" -msgstr "Đi Bộ Ngẫu Nhiên" +msgstr "Tiến Bước Ngẫu Nhiên" msgid "Volumetric approximation to physically based volume scattering, using the scattering radius as specified" -msgstr "Xấp xỉ thể tích " +msgstr "Ước đoán thể tích thành tán xạ thể tích trên cơ sở vật lý, sử dụng bán kính tán xạ như chỉ định" + + +msgid "Random Walk (Skin)" +msgstr "Tiến Bước Ngẫu Nhiên (Da)" + + +msgid "Volumetric approximation to physically based volume scattering, with scattering radius automatically adjusted to match color textures. Designed for skin shading" +msgstr "Sự ước tính xấp xỉ thể tích với tán xạ thể tích dựa trên cơ sở vật lý, cùng bán kính tán xạ tự động điều chỉnh để tương xứng với các chất liệu màu. Được thiết kế để tô bóng cho da" msgid "Refraction BSDF" @@ -43599,35 +47140,55 @@ msgstr "BSDF Khúc Xạ" msgid "Glossy refraction with sharp or microfacet distribution, typically used for materials that transmit light" -msgstr "Khúc xạ bóng loáng có phân phối bén hay mặt vi mô, thường dùng cho vật liệu truyền ánh sáng" +msgstr "Khúc xạ ánh bóng loáng với sự phân bổ sắc nét hoặc vi mặt cắt, thường được sử dụng cho các nguyên vật liệu truyền ánh sáng" + + +msgid "Sheen BSDF" +msgstr "Nước Láng Bóng BSDF" msgid "" "Reflection for materials such as cloth.\n" "Typically mixed with other shaders (such as a Diffuse Shader) and is not particularly useful on its own" msgstr "" -"Phản xạ cho vật liệu như dải.\n" -"Thường cho pha trộn với những bộ tô sắc khác (như Bộ Tô Sắc Tán Xạ) và không sử dụng độc lập" +"Ánh phản xạ đối với các nguyên vật liệu như vải.\n" +"Thường được hòa trộn với các bộ tạo bóng khác (chẳng hạn như Bộ Tô Bóng Khuếch Tán). Khi đứng một mình thì nó không có hữu ích gì mấy" + + +msgid "Sheen shading model" +msgstr "Mô hình tô bóng nước láng bóng" + + +msgid "Classic Ashikhmin velvet (legacy model)" +msgstr "Nhung Ashikhmin cổ điển (mẫu lỗi thời)" + + +msgid "Microfiber" +msgstr "Vảy Vi-Mô" + + +msgid "Microflake-based model of multiple scattering between normal-oriented fibers" +msgstr "Mô hình đa tán xạ dựa trên vảy vi-mô giữa các sợi định hướng bình thường" msgid "Toon BSDF" -msgstr "BSDF Hoạt Hình" +msgstr "BSDF Hoạt Họa" msgid "Diffuse and Glossy shaders with cartoon light effects" -msgstr "Bộ tô sắc tán xạ và bóng loáng có hiệu ứng hoạt hình" +msgstr "Bộ tô bóng Khuếch Tán và Bóng Bẩy với các hiệu ứng ánh sáng hí họa" msgid "Toon BSDF component to use" -msgstr "Thành phần BSDF hoạt hình để dùng" +msgstr "BSDF Hoạt Họa thành phần để sử dụng" msgid "Use diffuse BSDF" -msgstr "Dùng BSDF tán xạ" +msgstr "Sử dụng BSDF khuếch tán" msgid "Use glossy BSDF" -msgstr "Dùng BSDF bóng loáng" +msgstr "Sử dụng BSDF bóng bẩy" msgid "Translucent BSDF" @@ -43635,7 +47196,7 @@ msgstr "BSDF Trong Mờ" msgid "Lambertian diffuse transmission" -msgstr "Truyền tán xạ kiểu Lambert" +msgstr "Truyền xạ khuếch tán Lambert" msgid "Transparent BSDF" @@ -43643,19 +47204,19 @@ msgstr "BSDF Trong Suốt" msgid "Transparency without refraction, passing straight through the surface as if there were no geometry" -msgstr "Trong suất nhưng không có phản xạ, xuyên thẳng qua bề mặt như không có hình dạng" +msgstr "Tính trong suốt không có khúc xạ, đi thẳng xuyên qua bề mặt như thể không có hình học nào cả" msgid "Bump" -msgstr "Nhám" +msgstr "Độ Gồ Ghề" msgid "Generate a perturbed normal from a height texture for bump mapping. Typically used for faking highly detailed surfaces" -msgstr "Chế tạo một pháp tuyến đảo lộn từ một hoạ tiết độ cao cho bản đồ nhám. Thương dùng cho giả bộ bề mặt chó chi tiết nhiều" +msgstr "Sinh tạo pháp tuyến nhiễu loạn từ chất liệu chiều cao để ánh xạ độ gồ ghề. Thường được sử dụng để làm giả các bề mặt có độ chi tiết cao" msgid "Invert the bump mapping direction to push into the surface instead of out" -msgstr "Đảo nghịch hướng bản đồ nhám cho cắt vào mặt thay phình ra" +msgstr "Đảo nghịch chiều hướng của ánh xạ độ gồ ghề để đẩy xuống bề mặt, thay vì đẩy ra" msgid "Camera Data" @@ -43663,87 +47224,87 @@ msgstr "Dữ Liệu Máy Quay Phim" msgid "Retrieve information about the camera and how it relates to the current shading point's position" -msgstr "Rút thông tin về máy quay phim và quân hệ với vị trí của điểm tô sắc hiện tại" +msgstr "Trích xuất thông tin về máy quay phim và tình trạng liên quan đến vị trí của điểm tô bóng hiện tại" msgid "Clamp a value between a minimum and a maximum" -msgstr "Kẹp lại một giá trị giữa cực tiểu và cực đại" +msgstr "Hạn định giá trị giữa giá trị nhỏ nhất và lớn nhất" msgid "Clamp Type" -msgstr "Loại Kẹp Lại" +msgstr "Kiểu Hạn Định" msgid "Min Max" -msgstr "Cực Tiểu/Đại" +msgstr "Tối Thiểu, Tối Đa" msgid "Constrain value between min and max" -msgstr "Hạn chế giá trị giữa cực tiểu và cực đại" +msgstr "Hạn chế giá trị giữa tối thiểu và tối đa" msgid "Constrain value between min and max, swapping arguments when min > max" -msgstr "Hạn chế giá trị giữa cực tiểu và cực đại, trao đổi tham số khi cực tiểu > cực đại" +msgstr "Hạn chế giá trị giữa tối thiểu và tối đa, đổi chỗ đối số khi giá trị tối thiểu > giá trị tối đa" msgid "Create a color from individual components using multiple models" -msgstr "Chế tạo một màu từ các thành phần riêng bằng dùng nhiều mô hình" +msgstr "Kiến Tạo màu từ các thành phần cá nhân bằng nhiều mô hình" msgid "Combine HSV" -msgstr "Gồm HSV" +msgstr "Kết Hợp HSV" msgid "Create a color from its hue, saturation, and value channels" -msgstr "Chế tạo một màu từ kênh độ sắc, độ tươi, và độ sáng của nó" +msgstr "Kiến Tạo màu từ các kênh sắc thái, độ bão hòa và giá trị của nó" msgid "Combine RGB" -msgstr "Gồm RGB" +msgstr "Kết Hợp RGB" msgid "Generate a color from its red, green, and blue channels (Deprecated)" -msgstr "Chế tạo một màu từ kênh đỏ, lục, và xanh của nó" +msgstr "Sinh tạo màu từ các kênh màu đỏ, lục và lam (Lỗi thời)" msgid "Create a vector from X, Y, and Z components" -msgstr "Chế tạo một vectơ từ thành phần X, Y, và Z" +msgstr "Kiến Tạo một vectơ từ các thành phần X, Y và Z" msgid "Shader Custom Group" -msgstr "Nhóm Tùy Chọn Tô Sắc" +msgstr "Nhóm Tô Bóng Tùy Chỉnh" msgid "Custom Shader Group Node for Python nodes" -msgstr "Giao Điểm Nhóm Tô Sắc Tùy Chọn cho giao điểm Python" +msgstr "Nhóm Tô Bóng Tùy Chỉnh dành cho các nút Python" msgid "Displace the surface along the surface normal" -msgstr "Dịch bề mặt theo pháp tuyến bề mặt" +msgstr "Dịch chuyển bề mặt dọc theo pháp tuyến bề mặt" msgid "Space of the input height" -msgstr "Không gian của đồ cao ngõ vào" +msgstr "Không gian sử dụng cho độ cao đầu vào" msgid "Object Space" -msgstr "Không Gian Vật Thể" +msgstr "Không Gian Đối Tượng" msgid "Displacement is in object space, affected by object scale" -msgstr "Dịch trong không gian vật thể, được ảnh hưởng bằng phóng to vật thể" +msgstr "Phép dời hình thực hiện trong không gian đối tượng, bị ảnh hưởng bởi tỷ lệ của đối tượng" msgid "Displacement is in world space, not affected by object scale" -msgstr "Dịch trong không gian thế giới, không được ảnh hưởng bằng phóng to vật thể" +msgstr "Phép dời hình thực hiện trong không gian thế giới, không ảnh hưởng bởi tỷ lệ của đối tượng" msgid "Specular BSDF" -msgstr "BSDF Cao Quang" +msgstr "Ánh Lóng Lánh BSDF" msgid "Similar to the Principled BSDF node but uses the specular workflow instead of metallic, which functions by specifying the facing (along normal) reflection color. Energy is not conserved, so the result may not be physically accurate" -msgstr "Giống giao điểm BSDF Tổng Quát nhưng dùng luồng công việc cao quang thay thế kim loại, thì hoạt động bằng chỉ định màu sắc tới (theo pháp tuyến). Nó không bảo toàn nặng lượng, cho nên kết qủa có lẽ không đúng theo vật lý" +msgstr "Tương tự như nút BSDF Nguyên Tắc nhưng sử dụng quy trình làm việc của ánh lóng lánh thay quy trình của ánh kim loại, hoạt động bằng cách chỉ định màu phản chiếu đối mặt (dọc theo pháp tuyến). Năng lượng không được bảo toàn, vì vậy kết quả có thể không chính xác về mặt vật lý" msgid "Emission" @@ -43751,135 +47312,135 @@ msgstr "Phát Xạ" msgid "Lambertian emission shader" -msgstr "Bộ tô sắc phát xạ kiểu Lambert" +msgstr "Bộ tô bóng phát xạ Lambert" msgid "Float Curve" -msgstr "Đường Cong Sỗ Thật Dấu Phẩy Động" +msgstr "Đường Cong Số Thực" msgid "Map an input float to a curve and outputs a float value" -msgstr "Ánh xạ một số thật dấu phẩy động ngõ vào đến một đường cong và ngõ ra một số thật dấu phẩy động" +msgstr "Ánh xạ một số thực float cung cấp ở đầu vào tới một đường cong và xuất ra một giá trị số thực float" msgid "Fresnel" -msgstr "Fresnel" +msgstr "Fresnen" msgid "" "Produce a blending factor depending on the angle between the surface normal and the view direction using Fresnel equations.\n" "Typically used for mixing reflections at grazing angles" msgstr "" -"Chế tạo một hệ số pha trộn tùy góc giữa pháp tuyến bề mặt và hướng của màn bằng dùng phương trình Fresnel.\n" -"Thường dùng cho pha trộn phản xạ tại những góc tiếp tuyến" +"Tạo ra hệ số pha trộn tùy thuộc vào góc giữa pháp tuyến bề mặt và chiều hướng góc nhìn bằng phương trình Fresnel.\n" +"Thường được sử dụng để hòa trộn các ánh phản xạ tại các góc tới" msgid "Apply a gamma correction" -msgstr "Áp dụng một chỉnh sửa gama" +msgstr "Áp dụng chỉnh sửa gamma" msgid "Curves Info" -msgstr "Thông Tin Cong Đường" +msgstr "Thông Tin Đường Cong" msgid "Retrieve hair curve information" -msgstr "Rút thông tin đường cong tóc" +msgstr "Trích xuất thông tin về đường cong của tóc" msgid "" "Create a \"hole\" in the image with zero alpha transparency, which is useful for compositing.\n" "Note: the holdout shader can only create alpha when transparency is enabled in the film settings" msgstr "" -"Chế tạo một \"lỗ\" trong ảnh có độ đục bằng số không, thì có lời thế cho gjép ảnh.\n" -"Lưu ý: bộ tô sắc giữ gìn chỉ được chế tạo độ đục khi được bật trong suốt trong những cài đặt phim" +"Kiến Tạo một \"lỗ\" trên hình ảnh với độ trong suốt alpha bằng không, rất hữu ích cho việc tổng hợp.\n" +"Lưu ý: bộ tô bóng giữ chỗ chỉ có thể kiến tạo alpha khi độ trong suốt được bật trong cài đặt của phim mà thôi" msgid "Apply a color transformation in the HSV color model" -msgstr "Áp dụng một biến hóa màu trong mô hình sắc HSV" +msgstr "Áp dụng sự biến hóa màu sắc trong mô hình màu HSV" msgid "Invert a color, producing a negative" -msgstr "Đảo nghịch một màu, tạo một màu âm" +msgstr "Đảo ngược màu, tạo ra âm bản" msgid "Layer Weight" -msgstr "Quyền Lượng Lớp" +msgstr "Trọng Lượng Tầng" msgid "" "Produce a blending factor depending on the angle between the surface normal and the view direction.\n" "Typically used for layering shaders with the Mix Shader node" msgstr "" -"Chế tạo một hệ số pha trộn tùy góc giữa pháp tuyến bề mặt và hướng của màn.\n" -"Thường dùng cho tạo các lớp bộ tô sắc bằng dùng giao điểm Pha Trộn Bộ Tô Sắc" +"Tạo ra hệ số hòa trộn tùy thuộc vào góc giữa pháp tuyến bề mặt và chiều hướng của góc nhìn.\n" +"Thường được sử dụng để tạo tầng lớp bộ tô bóng bằng nút Hòa Trộn Tô Bóng (Mix Shader)" msgid "Light Falloff" -msgstr "Sự Giảm Ánh Sáng" +msgstr "Suy Giảm của Ánh Sáng" msgid "Manipulate how light intensity decreases over distance. Typically used for non-physically-based effects; in reality light always falls off quadratically" -msgstr "Thao túng phương pháp cường độ ánh sáng giảm qua khoảng cách. Thường dùng cho hiệu ứng không cơ sở vật lý; thật tế cường độ ánh sáng giảm theo bặc hai" +msgstr "Điều khiển phương pháp cách cường độ ánh sáng suy giảm theo khoảng cách. Thường được sử dụng cho các hiệu ứng phi vật lý; trong thực tế, cường độ ánh sáng luôn luôn suy giảm theo bậc hai" msgid "Light Path" -msgstr "Đường Ánh Sáng" +msgstr "Đường Đi của Ánh Sáng" msgid "" "Retrieve the type of incoming ray for which the shader is being executed.\n" "Typically used for non-physically-based tricks" msgstr "" -"Rút loại của tia đang nhập vào bộ tô sắc đang thực hành.\n" -"Thường dùng cho xảo thuật không cơ sở vật lý" +"Trích xuất thể loại tia xạ chiếu vào mà bộ tô bóng đang thi hành.\n" +"Thường được sử dụng trong các thủ thuật phi vật lý" msgid "Remap a value from a range to a target range" -msgstr "Ánh xạ lại một giá trị từ một phạm vi đến một phạm vi mục tiêu" +msgstr "Đổi ánh xạ một giá trị từ một phạm vi sang một phạm vi mục tiêu" msgid "Clamp the result to the target range [To Min, To Max]" -msgstr "Kẹp lại kết qủa đến phạm vi mục đích [Đến Cực Tiểu, Đến Cực Đại]" +msgstr "Hạn chế kết quả trong một khoảng giới hạn mục tiêu [Tới Tối Thiểu, Tới Tối Đa]" msgid "Interpolation Type" -msgstr "Loại Suy Nội" +msgstr "Thể Loại Nội Suy" msgid "Linear interpolation between From Min and From Max values" -msgstr "Suy nội bậc một giữa giá trị Từ Cực Tiểu và Từ Cực Đại" +msgstr "Nội suy tuyến tính giữa các giá trị Từ Tối Thiểu (From Min) và Từ Tối Đa (From Max)" msgid "Stepped Linear" -msgstr "Bậc Một Có Bước" +msgstr "Tuyến Tính Phân Bước" msgid "Stepped linear interpolation between From Min and From Max values" -msgstr "Suy nội bước bậc một giữa giá trị Từ Cực Tiểu và Từ Cực Đại" +msgstr "Nội suy tuyến tính phân bước giữa các giá trị Từ Tối Thiểu (From Min) và Từ Tối Đa (From Max)" msgid "Smooth Step" -msgstr "Bước Mịn" +msgstr "Phân Bước Làm Mịn" msgid "Smooth Hermite edge interpolation between From Min and From Max values" -msgstr "Suy nội cạnh Hermite mịn giữa hai giá trị Từ Cực Tiểu và Từ Cực Đại" +msgstr "Nội suy tiếp tuyến cạnh mịn màng, theo phương pháp của Charles Hermite, giữa các giá trị Từ Tối Thiểu (From Min) và Từ Tối Đa (From Max)" msgid "Smoother Step" -msgstr "Bước Mịn Hơn" +msgstr "Phân Bước Làm Mịn Hơn" msgid "Smoother Hermite edge interpolation between From Min and From Max values" -msgstr "Suy nội cạnh Hermite mịn hơn giữa hai giá trị Từ Cực Tiểu và Từ Cực Đại" +msgstr "Nội suy tiếp tuyến cạnh mịn màng hơn, theo phương pháp của Charles Hermite, giữa các giá trị Từ Tối Thiểu (From Min) và Từ Tối Đa (From Max)" msgid "Transform the input vector by applying translation, rotation, and scale" -msgstr "Biến hóa vectơ ngõ vào bằng áp dụng dịch, xoay, và phóng to" +msgstr "Biến hóa vectơ đầu vào bằng cách áp dụng phép dịch chuyển, xoay chiều và đổi tỷ lệ" msgid "Type of vector that the mapping transforms" -msgstr "Ánh xạ được biến hóa loại vectơ nào" +msgstr "Thể loại vectơ mà quá trình ánh xạ sẽ biến hóa" msgid "Transform a point" @@ -43887,23 +47448,55 @@ msgstr "Biến hóa một điểm" msgid "Transform a texture by inverse mapping the texture coordinate" -msgstr "Biến hóa một chất liệu bằng ánh xạ tọa độ chất liệu" +msgstr "Biến hóa một chất liệu bằng cách ánh xạ đảo ngược tọa độ chất liệu" msgid "Transform a direction vector. Location is ignored" -msgstr "Biến hóa một vectơ chỉ hướng. Không quan tâm vị trí" +msgstr "Biến hóa một véctơ hướng. Vị trí sẽ bị bỏ qua" msgid "Transform a unit normal vector. Location is ignored" -msgstr "Biến hóa một vectơ đơn vị hóa. Không quan tâm vị trí" +msgstr "Biến hóa một véctơ pháp tuyến đơn vị. Vị trí sẽ bị bỏ qua" msgid "Perform math operations" -msgstr "Thực hành những thao tác toàn" +msgstr "Thực hiện các phép toán" + + +msgid "Mix values by a factor" +msgstr "Hòa trộn các giá trị với nhau theo hệ số" + + +msgid "Clamp Factor" +msgstr "Hạn Định Hệ Số" + + +msgid "Clamp the factor to [0,1] range" +msgstr "Hạn định hệ số trong phạm vi [0, 1]" + + +msgid "Clamp Result" +msgstr "Hạn Định Kết Quả" + + +msgid "Clamp the result to [0,1] range" +msgstr "Hạn định kết quả trong phạm vi [0, 1]" + + +msgid "Factor Mode" +msgstr "Chế Độ Hệ Số" + + +msgid "Use a single factor for all components" +msgstr "Sử dụng một hệ số duy nhất cho toàn bộ các thành phần" msgid "Non-Uniform" -msgstr "Không Đều" +msgstr "Bất Đồng Đều" + + +msgid "Per component factor" +msgstr "Mỗi thành phần một hệ số" msgid "MixRGB" @@ -43911,31 +47504,31 @@ msgstr "Pha Trộn RGB" msgid "Mix two input colors" -msgstr "Pha trộn hai màu ngõ vào" +msgstr "Hòa trộn hai màu cung cấp ở đầu vào" msgid "Mix Shader" -msgstr "Bộ Tô Sắc Pha Trộn" +msgstr "Bộ Hòa Trộn Tô Bóng" msgid "Mix two shaders together. Typically used for material layering" -msgstr "Pha trộn hai bộ tô sắc với nhau. Thường dùng cho tạo lớp vật liệu" +msgstr "Hòa trộn hai bộ tô bóng với nhau. Thường được sử dụng để phân tầng lớp nguyên vật liệu" msgid "Retrieve geometric information about the current shading point" -msgstr "Rút thông tin hình dạng về điểm tô sắc hiện tại" +msgstr "Trích xuất thông tin hình học về điểm tô bóng hiện tại" msgid "Generate a normal vector and a dot product" -msgstr "Chế tạo một pháp tuyến và tích vô hướng" +msgstr "Sinh tạo một vectơ pháp tuyến và một tích vô hướng" msgid "Generate a perturbed normal from an RGB normal map image. Typically used for faking highly detailed surfaces" -msgstr "Chế tạo một pháp tuyến đảo lộn từ một ảnh bản đồ pháp tuyến RGB. Thương dùng cho giả bộ bề mặt chó chi tiết nhiều" +msgstr "Sinh tạo pháp tuyến nhiễu loạn từ hình ảnh ánh xạ pháp tuyến RGB. Thường được sử dụng để làm giả các bề mặt có độ chi tiết cao" msgid "Space of the input normal" -msgstr "Không gian của pháp tuyến ngõ vào" +msgstr "Không gian của pháp tuyến cung cấp" msgid "Tangent Space" @@ -43943,111 +47536,115 @@ msgstr "Không Gian Tiếp Tuyến" msgid "Tangent space normal mapping" -msgstr "Ánh xạ pháp tuyến cho không gian tiếp tuyến" +msgstr "Ánh xạ pháp tuyến của không gian tiếp tuyến" msgid "Object space normal mapping" -msgstr "Ánh xạ pháp tuyến không gian vật thể" +msgstr "Ánh xạ pháp tuyến của không gian đối tượng" msgid "World space normal mapping" -msgstr "Ánh xạ pháp tuyến không gian thế giới" +msgstr "Ánh xạ pháp tuyến của không gian thế giới" msgid "Blender Object Space" -msgstr "Không Gian Vật Thể Blender" +msgstr "Không Gian Đối Tượng của Blender" msgid "Object space normal mapping, compatible with Blender render baking" -msgstr "Ánh xạ pháp tuyến không gian vật thể, thích hợp với nướng kết xuất Blender" +msgstr "Ánh xạ pháp tuyến không gian đối tượng, thích hợp với quá trình nướng kết xuất của Blender" msgid "Blender World Space" -msgstr "Không Gian Thế Giới Blender" +msgstr "Không Gian Thế Giới của Blender" msgid "World space normal mapping, compatible with Blender render baking" -msgstr "Ánh xạ pháp tuyến không gian thế giới, thích hợp với nướng kết xuất Blender" +msgstr "Ánh xạ pháp tuyến không gian thế giới, thích hợp với quá trình nướng kết xuất của Blender" msgid "UV Map for tangent space maps" -msgstr "Bản Đồ UV cho bản đồ không gian tiếp tuyến" +msgstr "Ánh xạ UV cho các ánh xạ không gian tiếp tuyến" msgid "Retrieve information about the object instance" -msgstr "Rút thông tin về thực thể của vật thể" +msgstr "Trích xuất thông tin về thực thể đối tượng" msgid "AOV Output" -msgstr "Ngõ Ra AOV" +msgstr "Đầu Ra của AOV" msgid "" "Arbitrary Output Variables.\n" "Provide custom render passes for arbitrary shader node outputs" msgstr "" -"Biến số Ngõ Ra Tùy Ý/.\n" -"Cho cung cấp vòng kết xuất cho ngõ ra của giao điểm bộ tô sắc tùy ý" +"Biến Đầu Ra Tùy Ý.\n" +"Cung cấp các lượt kết xuất tùy chỉnh cho các đầu ra của nút tô bóng tùy chọn" msgid "Name of the AOV that this output writes to" -msgstr "Tên của AOV thì cái này được ghi vào" +msgstr "Tên của AOV mà đầu ra này viết vào" msgid "Light Output" -msgstr "Ngõ Ra Ánh Sáng" +msgstr "Đầu Ra Ánh Sáng" msgid "Output light information to a light object" -msgstr "Xuất thông tin ánh sáng đến một vật thể đèn" +msgstr "Cung cấp thông tin ánh sáng cho một đối tượng nguồn sáng" msgid "True if this node is used as the active output" -msgstr "Đúng nếu giao điểm này được sử dụng làm ngõ ra hoạt động" +msgstr "Giá trị 'Đúng' nếu nút này được sử dụng làm đầu ra đang hoạt động" msgid "Which renderer and viewport shading types to use the shaders for" -msgstr "Sử dụng bộ tô sắc cho loại tô sắc của bộ kết xuất và màn chiếu nào" +msgstr "Máy kết xuất và loại chuyển sắc cổng nhìn nào để sử dụng các bộ tô bóng với chúng" msgid "Use shaders for all renderers and viewports, unless there exists a more specific output" -msgstr "Sử dụng bộ tô sắc cho tất cả bộ kết xuất và mản chiếu, trừ khi có một ngõ ra xác định hơn" +msgstr "Sử dụng các bộ tô bóng cho toàn bộ các máy kết xuất và cổng nhìn, trừ phi có một đầu ra khác cụ thể hơn" + + +msgid "Use shaders for EEVEE renderer" +msgstr "Sử dụng các bộ tô bóng cho trình kết xuất EEVEE" msgid "Cycles" -msgstr "Chu Trình" +msgstr "Chu Trình/Cycles" msgid "Use shaders for Cycles renderer" -msgstr "Sử dụng bộ tô sắc cho kết xuất Cycles" +msgstr "Sử dụng các bộ tô bóng cho máy kết xuất Cycles" msgid "Line Style Output" -msgstr "Ngõ Ra Phong Cách Nét" +msgstr "Đầu Ra Phong Cách Nét" msgid "Material Output" -msgstr "Ngõ Ra Vật Liệu" +msgstr "Đầu Ra Nguyên Vật Liệu" msgid "Output surface material information for use in rendering" -msgstr "Xuất thông tin về vật liệu bề mặt để dùng cho kết xuất" +msgstr "Cung cấp thông tin nguyên vật liệu bề mặt để sử dụng trong kết xuất" msgid "World Output" -msgstr "Ngõ Ra Thế Giới" +msgstr "Đầu Ra Thế Giới" msgid "Output light color information to the scene's World" -msgstr "Xuất thông tin về màu ánh sáng đến Thế Giới của cảnh" +msgstr "Cung cấp thông tin về màu ánh sáng cho Thế Giới của cảnh" msgid "Particle Info" -msgstr "Thông Tin Hạt" +msgstr "Thông Tin về Hạt" msgid "Retrieve the data of the particle that spawned the object instance, for example to give variation to multiple instances of an object" -msgstr "Rút dữ liệu cũa hạt đã sanh thực thể vật thể, ví dụ cho tạo biến thể cho nhiều thực thể của một vật thể" +msgstr "Trích xuất dữ liệu của hệ thống hạt đã sinh ra thực thể đối tượng, ví dụ để cung cấp biến thể cho nhiều thực thể của một đối tượng" msgid "Point Info" @@ -44055,19 +47652,27 @@ msgstr "Thông Tin Điểm" msgid "Retrieve information about points in a point cloud" -msgstr "Rút thông tin về những điểm trong một mây điểm" +msgstr "Trích xuất thông tin về các điểm trong đám mây điểm" msgid "A color picker" -msgstr "Bảng Chọn Màu Sắc" +msgstr "Trình chọn màu" msgid "Apply color corrections for each color channel" -msgstr "Áp dụng chỉnh sửa màu từng kênh màu" +msgstr "Áp dụng hiệu chỉnh màu sắc cho từng kênh màu một" msgid "Convert a color's luminance to a grayscale value" -msgstr "Biến đổi độ sáng của màu sang một giá trị màu xám" +msgstr "Chuyển đổi độ chói của màu thành giá trị thang độ xám" + + +msgid "" +"Generate an OSL shader from a file or text data-block.\n" +"Note: OSL shaders are not supported on all GPU backends" +msgstr "" +"Tạo bộ tô bóng OSL từ một tập tin hoặc khối dữ liệu văn bản.\n" +"Lưu ý: bộ tô bóng OSL chưa được hỗ trợ trên tất cả các chương trình phụ trợ nền GPU đâu nhé" msgid "Bytecode" @@ -44075,95 +47680,103 @@ msgstr "Mã Byte" msgid "Compile bytecode for shader script node" -msgstr "Biến dịch mã byte cho giao điểm văn thảo tô bóng" +msgstr "Biên dịch mã byte cho nút tập lệnh tô bóng" msgid "Bytecode Hash" -msgstr "Băm Mã Byte" +msgstr "Giá Trị Băm Bytecode" msgid "Hash of compile bytecode, for quick equality checking" -msgstr "Băm của mã byte biến dịch, cho kiểm tra bằng nhau nhanh" +msgstr "Giá trị băm của bytecode biên dịch, để kiểm tra tính tương đồng nhanh chóng" msgid "Shader script path" -msgstr "Đường dẫn văn thảo bộ tô sắc" +msgstr "Đường dẫn tập lệnh của bộ tô bóng" msgid "Script Source" -msgstr "Nguổn Văn Thảo" +msgstr "Nguồn Tập Lệnh" msgid "Use internal text data-block" -msgstr "Dùng cục dữ liệu văn bản nội bộ" +msgstr "Dùng khối dữ liệu văn bản nội bộ" msgid "Use external .osl or .oso file" -msgstr "Dùng tập tin .osl hay .oso ngoải" +msgstr "Dùng tập tin .osl hoặc .oso bên ngoài" msgid "Internal shader script to define the shader" -msgstr "Văn thảo bộ tô sắc nội bộ để xác định tô bóng" +msgstr "Tập lệnh tô bóng nội bộ để định nghĩa bộ tô bóng" msgid "Auto Update" -msgstr "Tự Động Nâng Cấp" +msgstr "Tự Động Cập Nhật" msgid "Automatically update the shader when the .osl file changes (external scripts only)" -msgstr "Tự động nâng cấp bộ tô sắc khi tập tin .osl đổi (chỉ văn thảo ngoài)" +msgstr "Tự động cập nhật bộ tô bóng khi tập tin .osl thay đổi (chỉ dành cho các tập lệnh ngoài mà thôi)" msgid "Split a color into its individual components using multiple models" -msgstr "Chẻ một màu thành các thành phần riêng dùng nhiều mô hình" +msgstr "Tách phân một màu thành các thành phần cá nhân của nó dùng nhiều mô hình" msgid "Separate HSV" -msgstr "Chẻ HSV" +msgstr "Tách Phân HSV" msgid "Split a color into its hue, saturation, and value channels" -msgstr "Chẻ một màu thành kênh độ sắc, độ tươi, và độ sáng" +msgstr "Chia một màu thành các kênh sắc thái, độ bão hòa và giá trị của nó" msgid "Separate RGB" -msgstr "Chẻ RGB" +msgstr "Tách Phân RGB" msgid "Split a color into its red, green, and blue channels (Deprecated)" -msgstr "Chẻ một màu thành kênh đỏ, lục, và xanh" +msgstr "Tách phân một màu thành các kênh đỏ, lục và lam (Lỗi thời)" msgid "Split a vector into its X, Y, and Z components" -msgstr "Chẻ một vectơ sang thành phần X, Y, và Z" +msgstr "Tách phân một vectơ thành các thành phần X, Y và Z của nó" msgid "Shader to RGB" -msgstr "Bộ Tô Sắc Đến RGB" +msgstr "Bộ Tô Bóng sang RGB" + + +msgid "" +"Convert rendering effect (such as light and shadow) to color. Typically used for non-photorealistic rendering, to apply additional effects on the output of BSDFs.\n" +"Note: only supported in EEVEE" +msgstr "" +"Chuyển đổi hiệu ứng kết xuất (chẳng hạn như ánh sáng và bóng tối) thành màu sắc. Thường được sử dụng cho quá trình kết xuất không giống ảnh thực, hòng áp dụng các hiệu ứng bổ sung cho đầu ra của BSDF.\n" +"Lưu ý: chỉ được hỗ trợ trong EEVEE mà thôi" msgid "Squeeze Value" -msgstr "Ép Giá Trị" +msgstr "Nén Ép Giá Trị" msgid "Subsurface Scattering" -msgstr "Tán Xạ Hạ Mặt" +msgstr "Tán Xạ Dưới Bề Mặt" msgid "" "Subsurface multiple scattering shader to simulate light entering the surface and bouncing internally.\n" "Typically used for materials such as skin, wax, marble or milk" msgstr "" -"Tán xạ hạ bề mặt cho mô phỏng ánh sáng đi vào bề mặt và nhồi phía trong.\n" -"Thường dùng cho vật thể như da, sáp, đá hoa hoặc sữa" +"Bộ đổ bóng đa tán xạ dưới bề mặt để mô phỏng ánh sáng đi vào bề mặt và dội lại bên trong.\n" +"Thường được sử dụng cho các vật liệu như da, sáp, đá cẩm thạch hoặc sữa" msgid "Generate a tangent direction for the Anisotropic BSDF" -msgstr "Chế tạo một hướng tiếp tuyến cho BSDF Dị Hướng" +msgstr "Tạo hướng tiếp tuyến cho BSDF Dị Hướng" msgid "Axis for radial tangents" -msgstr "Trục cho tiếp tuyến tỏa tròn" +msgstr "Trục cho các tiếp tuyến đường tròn" msgid "X axis" @@ -44179,19 +47792,19 @@ msgstr "Trục +Z" msgid "Method to use for the tangent" -msgstr "Phương pháp cho sử dụng vectơ tiếp tuyến" +msgstr "Phương pháp sử dụng cho tiếp tuyến" msgid "Radial tangent around the X, Y or Z axis" -msgstr "Tiếp tuyến tỏa tròn xung quanh trục X, Y, hay Z" +msgstr "Tiếp tuyến đường tròn chung quanh trục X, Y, hoặc Z" msgid "Tangent from UV map" -msgstr "Tiếp tuyến từ bản đồ UV" +msgstr "Tiếp tuyến từ ánh xạ UV" msgid "UV Map for tangent generated from UV" -msgstr "Bản đồ UV cho tiếp tuyến được chế tạo từ UV" +msgstr "Ánh xạ UV cho tiếp tuyến được sinh tạo từ UV" msgid "Brick Texture" @@ -44199,35 +47812,35 @@ msgstr "Chất Liệu Gạch" msgid "Generate a procedural texture producing bricks" -msgstr "Sáng tạo một chất liệu thủ tục cho sản xuất gạch" +msgstr "Tạo chất liệu thủ tục trông giống tường xây gạch" msgid "Offset Amount" -msgstr "Mức Dịch" +msgstr "Lượng Dịch Chuyển" msgid "Offset Frequency" -msgstr "Tần Số Dịch" +msgstr "Tần Số Dịch Chuyển" msgid "Squash Amount" -msgstr "Mức Nhẹp" +msgstr "Lượng Nén Ép" msgid "Squash Frequency" -msgstr "Tần Số Nhẹp" +msgstr "Tần Số Nén Ép" msgid "Texture coordinate mapping settings" -msgstr "Cài đặt cho ánh xạ tọa độ chất liệu" +msgstr "Sắp đặt về ánh xạ tọa độ của chất liệu" msgid "Checker Texture" -msgstr "Chất Liệu Ca Rô" +msgstr "Chất Liệu Bàn Cờ" msgid "Generate a checkerboard texture" -msgstr "Chế tạo một chất liệu ca rô" +msgstr "Tạo chất liệu ô bàn cờ" msgid "Texture Coordinate" @@ -44238,20 +47851,20 @@ msgid "" "Retrieve multiple types of texture coordinates.\n" "Typically used as inputs for texture nodes" msgstr "" -"Rút nhiều loại tọa độ chất liệu.\n" -"Thường dùng cho ngõ vào cho giao điểm chất liệu" +"Trích xuất nhiều thể loại tọa độ chất liệu.\n" +"Thường được sử dụng làm đầu vào cho các nút chất liệu" msgid "From Instancer" -msgstr "Bộ Thực Thể" +msgstr "Từ Thực Thể Hóa Viên" msgid "Use the parent of the instance object if possible" -msgstr "Nếu có thể làm, dùng phụ huynh của vật thể thực thể" +msgstr "Sử dụng phụ huynh của đối tượng thực thể nếu có khả năng" msgid "Use coordinates from this object (for object texture coordinates output)" -msgstr "Dùng tọa độ từ vật thể này (cho ngõ ra tọa độ chất liệu vật thể)" +msgstr "Dùng các tọa độ từ đối tượng này (để cung cấp các tọa độ chất liệu của đối tượng)" msgid "Environment Texture" @@ -44259,7 +47872,7 @@ msgstr "Chất Liệu Môi Trường" msgid "Sample an image file as an environment texture. Typically used to light the scene with the background node" -msgstr "Lấy mẫu một ảnh tệp làm một chất liệu môi trường. Thường dùng cho tỏa sáng cảnh bằng dùng giao điểm nền" +msgstr "Lấy mẫu một tập tin hình ảnh làm chất liệu môi trường. Thường được sử dụng để chiếu sáng cảnh với nút nền sau" msgid "Texture interpolation" @@ -44271,43 +47884,43 @@ msgstr "Thông Minh" msgid "Bicubic when magnifying, else bilinear (OSL only)" -msgstr "Dùng nhị lập phương khi phóng to, khác dùng nhị bật một (chỉ cho OSL)" +msgstr "Dùng song lập phương khi phóng đại, nếu không, dùng song tuyến tính (chỉ dành cho OSL: Open Shading Language = Ngôn Ngữ Tô Bóng Mở)" msgid "Projection" -msgstr "Phép Chiếu" +msgstr "Phóng Chiếu" msgid "Projection of the input image" -msgstr "Phép chiếu của ảnh ngõ vào" +msgstr "Phương pháp phóng chiếu hình ảnh được cung cấp" msgid "Equirectangular or latitude-longitude projection" -msgstr "Phép chiếu chữ nhật đều hay vĩ tuyến-kinh tuyến" +msgstr "Vuông Góc Đều, hoặc phép phóng chiếu kinh-vĩ tuyến" msgid "Projection from an orthographic photo of a mirror ball" -msgstr "Phép chiếu từ một ảnh trực giao của một trái banh gương" +msgstr "Phóng chiếu từ một hình ảnh trực giao của một địa cầu gương" msgid "Gradient Texture" -msgstr "Chất Liệu Chuyển Sắc" +msgstr "Chất Liệu Dốc Màu" msgid "Generate interpolated color and intensity values based on the input vector" -msgstr "Chế tạo các giá trị nội suy cho màu và cường độ sáng tùy theo vectơ ngõ vào" +msgstr "Tạo các giá trị cường độ và màu nội suy dựa trên vectơ đầu vào" msgid "IES Texture" -msgstr "Chất Liệu IES" +msgstr "Chất liệu IES" msgid "Used to match real world lights with IES files, which store the directional intensity distribution of light sources" -msgstr "Dùng cho làm giống với đèn thế thật bằng tập tin IES. Các tập tin này chứa sự phân phối hướng cho cường độ của đèn nguồn" +msgstr "Sử dụng để khớp các ánh sáng trong thế giới thực với các tập tin IES, tức cái lưu trữ sự phân bổ cường độ theo hướng của các nguồn sáng" msgid "IES light path" -msgstr "Đường ánh sáng IES" +msgstr "Đường đi của ánh sáng IES" msgid "IES Text" @@ -44315,111 +47928,140 @@ msgstr "Văn Bản IES" msgid "Internal IES file" -msgstr "Tập tin IES nội bộ" +msgstr "Văn bản IES (Illuminating Engineering Society: Hội Kỹ Sư Chiếu Sáng) nội bộ" msgid "Whether the IES file is loaded from disk or from a text data-block" -msgstr "Tập tin IES được nhập từ đĩa hay từ một cục dữ liệu văn bản" +msgstr "Tập tin IES (Illuminating Engineering Society: Hội Kỹ Sư Chiếu Sáng) được nạp từ đĩa hay từ một khối dữ liệu Văn Bản" msgid "Use external .ies file" -msgstr "Dùng tập tin .ies ngoài" +msgstr "Sử dụng tập tin .ies bên ngoài" msgid "Sample an image file as a texture" -msgstr "Lấy mẫu một ảnh cho làm một chất liệu" +msgstr "Lấy mẫu một tập tin hình ảnh làm chất liệu" + + +msgctxt "Image" +msgid "Projection" +msgstr "Phóng Chiếu" msgid "Method to project 2D image on object with a 3D texture vector" -msgstr "Phương pháp cho chiếu ảnh 2D trên vật thể có vectơ chất liệu 3D" +msgstr "Phương pháp phóng chiếu hình ảnh 2D trên đối tượng có vectơ chất liệu 3D" + + +msgctxt "Image" +msgid "Flat" +msgstr "Phẳng Bẹt" msgid "Image is projected flat using the X and Y coordinates of the texture vector" -msgstr "Chiếu ảnh bằng phẳng bằng tọa độ X và Y của vectơ chất liệu" +msgstr "Hình ảnh được phóng chiếu phẳng bẹt dùng tọa độ X và Y của vectơ chất liệu" + + +msgctxt "Image" +msgid "Box" +msgstr "Hình Hộp" msgid "Image is projected using different components for each side of the object space bounding box" -msgstr "Chiếu ảnh dùng thành phần khác nhau cho mỗi bề mặt của hộp bao quanh không gian vật thể" +msgstr "Hình ảnh được phóng chiếu dùng các thành phần khác nhau cho mỗi bên của khung hộp viền không gian đối tượng" + + +msgctxt "Image" +msgid "Sphere" +msgstr "Hình Cầu" msgid "Image is projected spherically using the Z axis as central" -msgstr "Chiếu ảnh kiểu hình cầu dùng trục Z làm trung tâm" +msgstr "Hình ảnh được phóng chiếu theo vòm hình cầu dùng trục Z làm tâm" + + +msgctxt "Image" +msgid "Tube" +msgstr "Hình Ống" msgid "Image is projected from the tube using the Z axis as central" -msgstr "Chiếu ảnh từ ống dùng tọa độ Z làm trung tâm" +msgstr "Hình ảnh được phóng chiếu từ hình ống dùng trục Z làm tâm" msgid "Projection Blend" -msgstr "Chiếu Pha Trộn" +msgstr "Lượng Pha Trộn của Phép Phóng Chiếu" msgid "For box projection, amount of blend to use between sides" -msgstr "Cho chiếu kiểu hộp, mức pha trộn để dùng giữa bề mặt" +msgstr "Lượng pha trộn giữa các bên cho phép phóng chiếu hình hộp" msgid "Generate a psychedelic color texture" -msgstr "Chế tạo một chất liệu màu rực rỡ" +msgstr "Tạo chất liệu màu phiêu bồng" msgid "Level of detail in the added turbulent noise" -msgstr "Mức thêm chi tiết trong huyên náo nhiễu loạn" +msgstr "Mức chi tiết trong nhiễu hỗn loạn thêm" msgid "Generate fractal Perlin noise" -msgstr "Chế tạo huyên náo Perlin phân dạng" +msgstr "Tạo nhiễu phân dạng Perlin" msgid "Number of dimensions to output noise for" -msgstr "Số chiều cho xuất huyên náo" +msgstr "Số chiều để tạo ra nhiễu cho nó" msgid "Use the scalar value W as input" -msgstr "Dùng giá trị của số W làm ngõ vào" +msgstr "Sử dụng giá trị vô hướng W làm đầu vào" msgid "Use the 2D vector (X, Y) as input. The Z component is ignored" -msgstr "Dùng vectơ 2D (x; y) cho làm ngõ vào. Không áp dụng thành phần z" +msgstr "Sử dụng véctơ 2D (X, Y) làm đầu vào. Phần tử Z sẽ bị bỏ qua" msgid "Use the 3D vector (X, Y, Z) as input" -msgstr "Dùng vectơ 3D (x; y; z) cho làm ngõ vào" +msgstr "Sử dụng véctơ 3D (X, Y, Z) làm đầu vào" msgid "Use the 4D vector (X, Y, Z, W) as input" -msgstr "Dùng vectơ 4D (x; y; z; w) cho làm ngõ vào" +msgstr "Sử dụng véctơ 4D (X, Y, Z, W) làm đầu vào" + + +msgid "Normalize outputs to 0.0 to 1.0 range" +msgstr "Bình thường hóa đầu ra sang phạm vi 0.0 đến 1.0" msgid "More uneven result (varies with location), more similar to a real terrain" -msgstr "Kết qủa bớt đồng đều (biến thể tù vị trí), giống địa hình thật tế hơn" +msgstr "Kết quả nhấp nhô (biến thiên vị trí), giống với địa hình thực hơn" msgid "Create sharp peaks" -msgstr "Chế tạo tượng đỉnh bén" +msgstr "Kiến Tạo các đỉnh sắc nhọn" msgid "Create peaks and valleys with different roughness values" -msgstr "Chế tạo thượng đỉnh và thung lũng có độ nhám khác nhau" +msgstr "Kiến Tạo các đỉnh núi và thung lũng với các giá trị độ gồ ghề khác nhau" msgid "Similar to Hybrid Multifractal creates a heterogeneous terrain, but with the likeness of river channels" -msgstr "Giống Đa Phân Dạng Kép, nó chế tạo một địa hình đa dạng, nhưng giống như có kênh sông" +msgstr "Tương tự như Hỗn Hợp Đa Phân Dạng (Hybrid Multifractal) kiến tạo một địa hình hỗn tạp, song với hình dạng trông giống như các mạch sông ngòi" msgid "Generate a volumetric point for each particle or vertex of another object" -msgstr "Chế tạo một điểm thể tích cho mỗi hạt hoặc đỉnh của một vật thể khác" +msgstr "Tạo ra một điểm thể tích cho mỗi hệ thống hạt hoặc điểm đỉnh của một đối tượng khác" msgid "Object to take point data from" -msgstr "Vật thể để cấp dữ liệu điểm " +msgstr "Đối tượng cung cấp dữ liệu điểm" msgid "Color Source" -msgstr "Nguồn Màu" +msgstr "Nguồn Màu Sắc" msgid "Data to derive color results from" -msgstr "Dữ liệu để tính màu kết qủa" +msgstr "Dữ liệu để suy tính màu sắc kết quả" msgid "Particle Age" @@ -44427,7 +48069,7 @@ msgstr "Tuổi Thọ Hạt" msgid "Lifetime mapped as 0.0 to 1.0 intensity" -msgstr "Ánh xạ tuổi thọ trong phạm vi cường độ 0.0 đến 1.0" +msgstr "Tuổi thọ được ánh xạ trong phạm vi cường độ từ 0,0 đến 1,0" msgid "Particle Speed" @@ -44435,19 +48077,19 @@ msgstr "Tốc Độ Hạt" msgid "Particle speed (absolute magnitude of velocity) mapped as 0.0 to 1.0 intensity" -msgstr "Ánh xạ tốc độ hạt (độ lớn tuyệt đối của vận tốc) trong phạm vi cường độ 0.0 đến 1.0" +msgstr "Tốc độ hạt (độ lớn tuyệt đối của vận tốc) được ánh xạ thành phạm vi cường độ từ 0,0 đến 1,0" msgid "Particle Velocity" -msgstr "Vặn Tốc Hạt" +msgstr "Vận Tốc Hạt" msgid "XYZ velocity mapped to RGB colors" -msgstr "Ánh xạ tốc độ XYZ sang màu RGB" +msgstr "Ánh xạ vận tốc XYZ sang màu sắc RGB" msgid "Particle System to render as points" -msgstr "Hệ Thống Hạt để kết xuất như điểm" +msgstr "Hệ Thống Hạt để kết xuất thành các điểm" msgid "Point Source" @@ -44455,51 +48097,51 @@ msgstr "Nguồn Điểm" msgid "Point data to use as renderable point density" -msgstr "Dữ liệu điểm cho dùng làm tỉ trọng có thể kết xuất điểm" +msgstr "Dữ liệu điểm để sử dụng làm mật độ điểm kết xuất" msgid "Generate point density from a particle system" -msgstr "Chế tạo tỉ trọng điểm từ một hệ thống hạt" +msgstr "Sinh tạo mật độ điểm từ một hệ thống hạt" msgid "Object Vertices" -msgstr "Đỉnh Vật Thể" +msgstr "Điểm Đỉnh của Đối Tượng" msgid "Generate point density from an object's vertices" -msgstr "Chế tạo tỉ trọng điểm từ các đỉnh của một vật thể" +msgstr "Sinh tạo mật độ điểm từ các điểm đỉnh của một đối tượng" msgid "Radius from the shaded sample to look for points within" -msgstr "Bán kính từ mẫu vật tô bóng để tìm kiếm điểm ở trong" +msgstr "Bán kính từ mẫu vật được tô bóng để lùng tìm các điểm nội bên trong" msgid "Resolution used by the texture holding the point density" -msgstr "Độ phân giải của chất liệu chứa mật độ điểm" +msgstr "Độ phân giải sử dụng bởi chất liệu nắm giữ mật độ điểm" msgid "Coordinate system to calculate voxels in" -msgstr "Hệ tọa độ sử dụng cho tính thể tích tử" +msgstr "Hệ tọa độ dùng để tính toán các thể tích tử" msgid "Vertex Attribute Name" -msgstr "Tên Đặc Điểm Đỉnh" +msgstr "Tên Thuộc Tính của Điểm Đỉnh" msgid "Vertex attribute to use for color" -msgstr "Đặc điểm đỉnh để dùng cho tô màu" +msgstr "Thuộc tính điểm đỉnh để sử dụng cho màu sắc" msgid "Vertex color layer" -msgstr "Lớp màu đỉnh" +msgstr "Tầng màu sắc điểm đỉnh" msgid "Vertex group weight" -msgstr "Quyền lượng nhóm đỉnh" +msgstr "Trọng lượng nhóm điểm đỉnh" msgid "XYZ normal vector mapped to RGB colors" -msgstr "Ánh xạ pháp tuyến XYZ sang màu RGB" +msgstr "Ánh xạ véctơ pháp tuyến XYZ sang các màu sắc RGB" msgid "Sky Texture" @@ -44507,7 +48149,7 @@ msgstr "Chất Liệu Bầu Trời" msgid "Generate a procedural sky texture" -msgstr "Chế tạo một hoạ tiết thủ tục bầu trời" +msgstr "Tạo chất liệu thủ tục bầu trời" msgid "Air" @@ -44515,15 +48157,15 @@ msgstr "Không Khí" msgid "Density of air molecules" -msgstr "Tỉ trọng của phần tử không khí" +msgstr "Mật độ của các phân tử không khí" msgid "Altitude" -msgstr "Độ Cao" +msgstr "Biên Độ" msgid "Height from sea level" -msgstr "Độ cao từ mực nước biển" +msgstr "Chiều cao từ mực nước biển" msgid "Dust" @@ -44531,15 +48173,15 @@ msgstr "Bụi" msgid "Density of dust molecules and water droplets" -msgstr "Tỉ trọng của bụi và giọt nước" +msgstr "Mật độ của các phân tử bụi và các hạt nước" msgid "Ground Albedo" -msgstr "Phản Soi Đất" +msgstr "Suất Phản Chiếu của Mặt Đất" msgid "Ground color that is subtly reflected in the sky" -msgstr "Màu đất được phản xạ nhẹt trong bầu trời" +msgstr "Màu mặt đất được phảng phất phản chiếu trong bầu trời" msgid "Ozone" @@ -44547,7 +48189,7 @@ msgstr "Ôzôn" msgid "Density of ozone layer" -msgstr "Tỉ trọng của lớp ôzôn" +msgstr "Độ dày đặc của tầng ozone" msgid "Sky Type" @@ -44555,7 +48197,7 @@ msgstr "Loại Bầu Trời" msgid "Which sky model should be used" -msgstr "Nên dùng mô hình bầu trời nào" +msgstr "Mô hình bầu trời nào nên sử dụng" msgid "Preetham" @@ -44587,55 +48229,55 @@ msgstr "Hướng Mặt Trời" msgid "Direction from where the sun is shining" -msgstr "Hướng cúa tia ánh sáng mặt trời xuất" +msgstr "Chiều hướng mà tia ánh sáng mặt trời soi vào" msgid "Sun Disc" -msgstr "Đĩa Mặt Trời" +msgstr "Hình Đĩa Mặt Trời" msgid "Include the sun itself in the output" -msgstr "Gồm mặt trời trong ngõ ra" +msgstr "Bao gồm bản thân hình mặt trời trong kết quả đầu ra" msgid "Sun Elevation" -msgstr "Góc Mặt Trời" +msgstr "Độ Nâng Cao của Mặt Trời" msgid "Sun angle from horizon" -msgstr "Góc mặt trời từ chân trời" +msgstr "Góc độ của mặt trời từ đường chân trời" msgid "Sun Intensity" -msgstr "Độ Sáng Mặt Trời" +msgstr "Cường Độ của Mặt Trời" msgid "Strength of sun" -msgstr "Sức nắng của mặt trời" +msgstr "Độ chói sáng của mặt trời" msgid "Sun Rotation" -msgstr "Xoay Mặt Trời" +msgstr "Độ Xoay Chiều của Mặt Trời" msgid "Rotation of sun around zenith" -msgstr "Xoay của mặt trời quanh đỉnh trời" +msgstr "Độ Xoay chiều của mặt trời quanh thiên đỉnh" msgid "Sun Size" -msgstr "Cỡ Mặt Trời" +msgstr "Kích Thước của Mặt Trời" msgid "Size of sun disc" -msgstr "Cỡ của mặt trời" +msgstr "Kích thước hình đĩa cho mặt trời" msgid "Turbidity" -msgstr "Độ Đục Ngẩu" +msgstr "Độ Vẩn Đục" msgid "Atmospheric turbidity" -msgstr "Độ đục ngẩu khí quyển" +msgstr "Độ vẩn đục của khí quyển" msgid "Voronoi Texture" @@ -44643,11 +48285,11 @@ msgstr "Chất Liệu Voronoi" msgid "Generate Worley noise based on the distance to random points. Typically used to generate textures such as stones, water, or biological cells" -msgstr "Chế tạo huyên náo Worley tùy theo khoảng cách đến điểm ngẫu nhiên. Thường dùng cho sáng tạo chất liệu như đá, nước, hoặc tế bào sinh học" +msgstr "Tạo nhiễu Worley dựa trên khoảng cách đến các điểm ngẫu nhiên. Thường được sử dụng để tạo ra các chất liệu như đá, nước hoặc các tế bào sinh học" msgid "The distance metric used to compute the texture" -msgstr "Thước dùng cho đo khoảng cách để tính chất liệu" +msgstr "Hệ đo khoảng cách sử dụng để tính toán chất liệu" msgid "Euclidean" @@ -44663,19 +48305,19 @@ msgstr "Khoảng Cách Manhattan" msgid "Chebychev distance" -msgstr "Khoảng Cách Chebychev" +msgstr "Khoảng cách Chebychev" msgid "Minkowski distance" -msgstr "Khoảng Cách Minkowski" +msgstr "Khoảng cách Minkowski" msgid "Feature Output" -msgstr "Ngỏ Ra Chi Tiết" +msgstr "Xuất Nét Đặc Trưng ở Đầu Ra" msgid "The Voronoi feature that the node will compute" -msgstr "Đặc trưng Voronoi giao điểm sẽ tính" +msgstr "Đặc trưng của Voronoi mà nút sẽ tính toán" msgid "F1" @@ -44683,7 +48325,7 @@ msgstr "F1" msgid "Computes the distance to the closest point as well as its position and color" -msgstr "Tính khoảng cách đến điểm gần nhất và vị trí và màu của nó" +msgstr "Tính toán khoảng cách tới điểm gần nhất, cùng với vị trí và màu sắc của nó" msgid "F2" @@ -44691,31 +48333,35 @@ msgstr "F2" msgid "Computes the distance to the second closest point as well as its position and color" -msgstr "Tính khoảng cách đến điểm gần nhất thứ hai và vị trí và màu của nó" +msgstr "Tính toán khoảng cách tới điểm thứ hai gần nhất, cùng với vị trí và màu sắc của nó" msgid "Smooth F1" -msgstr "Mịn Hóa F1" +msgstr "Làm Mịn F1" msgid "Smoothed version of F1. Weighted sum of neighbor voronoi cells" -msgstr "Phiên bản được mịn hóa của F1. Tích quyền lượng của các tế bào voroni kề nhau" +msgstr "Phiên bản F1 đã làm mịn. Tổng cân trọng của các tế bào voronoi lân cận" msgid "Distance to Edge" -msgstr "Khoảng cách đến Cạnh" +msgstr "Khoảng Cách tới Cạnh" msgid "Computes the distance to the edge of the voronoi cell" -msgstr "Tính khoảng cách đến cạnh của tế bào vornoi" +msgstr "Tính toán khoảng cách tới cạnh của tế bào voronoi" msgid "N-Sphere Radius" -msgstr "Bán Kính Hình Cầu N" +msgstr "Bán Kính Hình Cầu-N" msgid "Computes the radius of the n-sphere inscribed in the voronoi cell" -msgstr "Tính bán kính của sphere-n vừa trong tế bào voronoi" +msgstr "Tính toán bán kính của hình cầu-N nội tiếp trong tế bào voronoi" + + +msgid "Normalize output Distance to 0.0 to 1.0 range" +msgstr "Bình thường hóa Khoảng Cách đầu ra trong phạm vi 0.0 đến 1.0" msgid "Wave Texture" @@ -44723,63 +48369,63 @@ msgstr "Chất Liệu Sóng" msgid "Generate procedural bands or rings with noise" -msgstr "Chế tạo dải hay vành thủ tục có huyên náo" +msgstr "Sinh tạo chất liệu thủ tục hình dải hoặc vành nhẫn với nhiễu" msgid "Bands Direction" -msgstr "Hướng Dải" +msgstr "Hướng của Băng Sóng" msgid "Bands across X axis" -msgstr "Dải qua trục X" +msgstr "Băng sóng ngang trục X" msgid "Bands across Y axis" -msgstr "Dải qua trục Y" +msgstr "Băng sóng ngang trục Y" msgid "Bands across Z axis" -msgstr "Dải qua trục Z" +msgstr "Băng sóng ngang trục Z" msgid "Bands across diagonal axis" -msgstr "Dải qua trục chéo" +msgstr "Băng sóng ngang trục chéo" msgid "Rings Direction" -msgstr "Hướng Vành" +msgstr "Hướng của Hình Nhẫn" msgid "Rings along X axis" -msgstr "Vành qua trục X" +msgstr "Hình nhẫn ngang trục X" msgid "Rings along Y axis" -msgstr "Vành qua trục Y" +msgstr "Hình nhẫn ngang trục Y" msgid "Rings along Z axis" -msgstr "Vành qua trục Z" +msgstr "Hình nhẫn ngang trục Z" msgid "Rings along spherical distance" -msgstr "Vành cách xa hình cầu" +msgstr "Hình nhẫn dọc theo khoảng cách tỏa tròn" msgid "Wave Profile" -msgstr "Mặt Cắt Sóng" +msgstr "Mặt Cắt của Sóng" msgid "Use a standard sine profile" -msgstr "Dùng một mặt cắt sin tiêu chuẩn" +msgstr "Dùng mặt cắt hình sin tiêu chuẩn" msgid "Use a sawtooth profile" -msgstr "Dùng một mặt cắt răng cưa" +msgstr "Dùng mặt cắt hình răng cưa" msgid "Use a triangle profile" -msgstr "Dùng một mặt cắt tam giác" +msgstr "Sử dụng mô hình mặt cắt hình tam giác" msgid "Wave Type" @@ -44787,19 +48433,23 @@ msgstr "Loại Sóng" msgid "Use standard wave texture in bands" -msgstr "Dùng chất liệu sóng tiêu chuẩn trong quằn" +msgstr "Dùng chất liệu sóng tiêu chuẩn hình đường vằn (dải băng)" msgid "Use wave texture in rings" -msgstr "Dùng chất liệu sóng trong vành" +msgstr "Dùng chất liệu sóng hình vòng tròn" + + +msgid "White Noise Texture" +msgstr "Chất Liệu Nhiễu Trắng" msgid "Return a random value or color based on an input seed" -msgstr "Trả lại một giá trị hay màu ngẫu nhiên tùy một số hạt ngõ vào" +msgstr "Cung cấp giá trị hoặc màu ngẫu nhiên dựa trên nhân cung cấp ở đầu vào" msgid "UV Along Stroke" -msgstr "UV Theo Nét Vẽ" +msgstr "UV Dọc Theo Nét Vẽ" msgid "Use Tips" @@ -44807,119 +48457,173 @@ msgstr "Dùng Đỉnh" msgid "Lower half of the texture is for tips of the stroke" -msgstr "Dùng phần nửa dưới của chất liệu cho đỉnh đường nét" +msgstr "Dùng nửa phần dưới của chất liệu làm đỉnh cho nét vẽ" msgid "Retrieve a UV map from the geometry, or the default fallback if none is specified" -msgstr "Rút một bản đồ UV từ hình dạng, hoặc dùng bản đồ mặc định dự phòng nếu chưa được xác định cái nào" +msgstr "Trích xuất ánh xạ UV từ hình học, hoặc dự phòng mặc định nếu không có cái nào được chỉ định cả" msgid "UV coordinates to be used for mapping" -msgstr "Dùng tạo độ UV cho ánh xạ" +msgstr "Tọa độ UV để sử dụng trong quá trình ánh xạ" msgid "Map values to colors with the use of a gradient" -msgstr "Ánh xạ các giá trị đền màu sắc bằng một chuyển sắc" +msgstr "Ánh xạ các giá trị thành màu sắc bằng cách sử dụng một dốc màu" msgid "Used to Input numerical values to other nodes in the tree" -msgstr "Dùng để làm giá trị số Ngõ Vào đến các giao điểm khác trong cây" +msgstr "Được sử dụng để nhập các giá trị số cho các nút khác trong cây" msgid "Map an input vectors to curves, used to fine-tune the interpolation of the input" -msgstr "Ánh xạ vectơ ngõ vào đến đường cong, dùng để chỉnh nối suy của ngõ vào" +msgstr "Ánh xạ vectơ đầu vào thành các đường cong. Sử dụng để tinh chỉnh nội suy của đầu vào" msgid "Displace the surface along an arbitrary direction" -msgstr "Nới bề mặt theo một hướng nào" +msgstr "Dời hình bề mặt theo một hướng tùy ý" msgid "Tangent space vector displacement mapping" -msgstr "Ánh xạ dịch không gian vectơ tiếp tuyến" +msgstr "Ánh xạ dời hình vectơ trong không gian tiếp tuyến" msgid "Object space vector displacement mapping" -msgstr "Ánh xạ dịch vectơ không gian vật thể" +msgstr "Ánh xạ dời hình vectơ trong không gian đối tượng" msgid "World space vector displacement mapping" -msgstr "Ánh xạ dịch vectơ không gian thế giới" +msgstr "Ánh xạ dời hình vectơ trong không gian thế giới" + + +msgid "Vector Math" +msgstr "Toán Vectơ" msgid "Perform vector math operation" -msgstr "Thực hành thao tác toán vectơ" +msgstr "Thực hiện phép toán vectơ" msgid "Entry-wise multiply" -msgstr "Nhân từng thành phần" +msgstr "Nhân phần tử véctơ" msgid "Entry-wise divide" -msgstr "Chia từng thành phần" +msgstr "Chia phần tử véctơ" + + +msgctxt "NodeTree" +msgid "Cross Product" +msgstr "Tích Hữu Hướng" msgid "A cross B" -msgstr "A tích B (có hướng)" +msgstr "A x B" + + +msgctxt "NodeTree" +msgid "Project" +msgstr "Phóng Chiếu" msgid "Project A onto B" -msgstr "Chiếu A trên B" +msgstr "Phóng chiếu A lên B" + + +msgctxt "NodeTree" +msgid "Reflect" +msgstr "Phản Xạ" msgid "Reflect A around the normal B. B doesn't need to be normalized" -msgstr "Lật A quanh pháp tuyến B. Không cần đơn vị hóa B" +msgstr "Phản xạ A quanh pháp tuyến B. B không cần phải được bình thường hóa" + + +msgctxt "NodeTree" +msgid "Refract" +msgstr "Khúc Xạ" msgid "For a given incident vector A, surface normal B and ratio of indices of refraction, Ior, refract returns the refraction vector, R" -msgstr "Cho vectơ A rơi, pháp tuyến B và tỉ số của hệ số khúc xạ, phản xạ được trả vectơ phản xạ R" +msgstr "Đối với một véctơ tới nhất định A nào đó, pháp tuyến bề mặt B và tỷ lệ giữa chỉ số khúc xạ, Ior, và khúc xạ cho kết quả véctơ khúc xạ, R" + + +msgctxt "NodeTree" +msgid "Faceforward" +msgstr "Hướng Diện về Phía Trước" msgid "Orients a vector A to point away from a surface B as defined by its normal C. Returns (dot(B, C) < 0) ? A : -A" -msgstr "Đặt định hướng cho một vectơ A chỉ xa từ một bề mặt B được xác định bởi pháp tuyến C. Trả (tíchVôHướng(B, C) < 0) ? A : -A" +msgstr "Đặt định hướng cho một véctơ A quay mặt đi khỏi bề mặt B, như được xác định bởi pháp tuyến C. Cho kết quả là (tíchVôHướng(B, C) < 0) ? A : -A (Nếu (tíchVôHướng(B, C) < 0) thì bằng A (dương), nếu không thì bằng -A (âm))" + + +msgctxt "NodeTree" +msgid "Dot Product" +msgstr "Tích Vô Hướng" msgid "A dot B" -msgstr "A tích B (vô hướng)" +msgstr "A.B" + + +msgctxt "NodeTree" +msgid "Distance" +msgstr "Khoảng Cách" msgid "Distance between A and B" msgstr "Khoảng cách giữa A và B" +msgctxt "NodeTree" +msgid "Length" +msgstr "Chiều Dài" + + msgid "Length of A" -msgstr "Bề dài của A" +msgstr "Chiều dài của A" + + +msgctxt "NodeTree" +msgid "Scale" +msgstr "Tỷ Lệ" msgid "A multiplied by Scale" -msgstr "A nhân với Phóng To" +msgstr "A được nhân với Tỷ Lệ" + + +msgctxt "NodeTree" +msgid "Normalize" +msgstr "Bình Thường Hóa" msgid "Normalize A" -msgstr "Đơn Vị Hóa A" +msgstr "Bình Thường Hóa A" msgid "Entry-wise absolute" -msgstr "Giá trị tuyệt đối từng thành phần" +msgstr "Giá trị tuyệt đối của phần tử véctơ" msgid "Entry-wise minimum" -msgstr "Cực tiểu từng thành phần" +msgstr "Tối thiểu của phần tử véctơ" msgid "Entry-wise maximum" -msgstr "Cực đại từng thành phần" +msgstr "Tối đa của phần tử véctơ" msgid "Entry-wise floor" -msgstr "Sàn từng thành phần" +msgstr "Làm tròn lên phần tử véctơ" msgid "Entry-wise ceil" -msgstr "Nóc từng thành phần" +msgstr "Làm tròn xuống phần tử véctơ" msgid "The fraction part of A entry-wise" -msgstr "Phân dư của A từng thành phần" +msgstr "Phần phân số của phần tử véctơ" msgctxt "NodeTree" @@ -44928,55 +48632,55 @@ msgstr "Phần Dư" msgid "Entry-wise modulo using fmod(A,B)" -msgstr "hân dư của A từng thành phần dùng fmod(A,B)" +msgstr "Phép chia lấy dư của phần tử véctơ, dùng hàm fmod(A,B)" msgid "Entry-wise wrap(A,B)" -msgstr "Từng thành phần wrap(A,B)" +msgstr "Hàm tuần hoàn wrap(A,B) của phần tử véctơ" msgid "Round A to the largest integer multiple of B less than or equal A" -msgstr "Tròn số A đến số nguyên được chia B, ngưng lớn hơn hoặc bằng A" +msgstr "Làm tròn A thành số nguyên lớn nhất và là bội số của B, song nhỏ hơn hoặc bằng A" msgid "Entry-wise sin(A)" -msgstr "Từng thành phần sin(A)" +msgstr "Hàm sin(A) của phần tử véctơ" msgid "Entry-wise cos(A)" -msgstr "Từng thành phần cos(A)" +msgstr "Hàm cos(A) của phần tử véctơ" msgid "Entry-wise tan(A)" -msgstr "Từng thành phần tan(A)" +msgstr "Hàm tan(A) của phần tử véctơ" msgid "Vector Rotate" -msgstr "Xoay Vectơ" +msgstr "Xoay Chiều Véctơ" msgid "Rotate a vector around a pivot point (center)" -msgstr "Xoay một vectơ quanh một điểm tựa (trung tâm)" +msgstr "Xoay một vectơ quanh một điểm tựa (tâm)" msgid "Invert angle" -msgstr "Đảo Nghịch Góc" +msgstr "Đảo ngược góc độ" msgid "Type of rotation" -msgstr "Loại xoay" +msgstr "Kiểu xoay chiều" msgid "Rotate a point using axis angle" -msgstr "Xoay một điểm bằng góc trục" +msgstr "Xoay chiều một điểm dùng góc trục" msgid "Rotate a point using X axis" -msgstr "Xoay một điểm bằng trục X" +msgstr "Xoay chiều một điểm dùng trục X" msgid "Rotate a point using Y axis" -msgstr "Xoay một điểm bằng trục Y" +msgstr "Xoay chiều một điểm dùng trục Y" msgid "Z Axis" @@ -44984,51 +48688,51 @@ msgstr "Trục Z" msgid "Rotate a point using Z axis" -msgstr "Xoay một điểm bằng trục Z" +msgstr "Xoay chiều một điểm dùng trục Z" msgid "Rotate a point using XYZ order" -msgstr "Xoay một điểm bằng thứ tự XYZ" +msgstr "Xoay chiều một điểm dùng thứ tự XYZ" msgid "Vector Transform" -msgstr "Biến Hóa Vectơ" +msgstr "Biến Hóa Véctơ" msgid "Convert a vector, point, or normal between world, camera, and object coordinate space" -msgstr "Biến đổi một vectơ, điểm, hoặc pháp tuyến giữa không gian tọa độ thế giới, máy quay phim, và vật thể" +msgstr "Chuyển đổi vectơ, điểm hoặc pháp tuyến giữa không gian tọa độ thế giới, máy quay phim và đối tượng" msgid "Convert From" -msgstr "Biến Đổi Từ" +msgstr "Chuyển Đổi Từ" msgid "Space to convert from" -msgstr "Biến đổi từ không gian" +msgstr "Không gian nguồn để khởi đầu chuyển đổi" msgid "Convert To" -msgstr "Biến Đổi Thành" +msgstr "Chuyển Đổi Thành" msgid "Space to convert to" -msgstr "Biến Đổi thành không gian" +msgstr "Không gian đích để chuyển đổi sang" msgid "Transform a direction vector" -msgstr "Biến hóa một vectơ chỉ hướng" +msgstr "Biến hóa một vectơ có phương hướng" msgid "Transform a normal vector with unit length" -msgstr "Biến hóa pháp tuyến đã được đơn vị hóa" +msgstr "Biến hóa vectơ pháp tuyến có chiều dài đơn vị" msgid "Color Attribute" -msgstr "Đặc Điểm Màu" +msgstr "Thuộc Tính Màu" msgid "Retrieve a color attribute, or the default fallback if none is specified" -msgstr "Rút một đạc điểm màu, hoặc đặc điểm mặc định dự phòng nếu chưa có cái nào được xác định" +msgstr "Trích xuất thuộc tính màu hoặc thuộc tính dự phòng mặc định nếu không có thuộc tính nào được chỉ định cả" msgid "Volume Absorption" @@ -45036,7 +48740,7 @@ msgstr "Hấp Thụ Thể Tích" msgid "Absorb light as it passes through the volume" -msgstr "Hấp thu ánh sáng khi nó đi qua thể tích" +msgstr "Hấp thụ ánh sáng khi nó đi qua thể tích" msgid "Volume Info" @@ -45044,15 +48748,15 @@ msgstr "Thông Tin Thể Tích" msgid "Read volume data attributes from volume grids" -msgstr "Đọc đặc điểm của dữ liệu thể tích từ các đồ thị thể tích" +msgstr "Đọc các thuộc tính dữ liệu thể tích từ các khung lưới đồ thị thể tích" msgid "Principled Volume" -msgstr "Thể Tích Tổng Quát" +msgstr "Thể Tích Nguyên Tắc" msgid "Combine all volume shading components into a single easy to use node" -msgstr "Gồm hết thành phần" +msgstr "Kết hợp toàn bộ các thành phần tạo bóng tối thể tích vào một nút duy nhất dễ sử dụng" msgid "Volume Scatter" @@ -45060,27 +48764,32 @@ msgstr "Tán Xạ Thể Tích" msgid "Scatter light as it passes through the volume, often used to add fog to a scene" -msgstr "Tán xạ (rải) ánh sánh khi nó đi qua thể tích, thường xuyên dùng cho làm sương mù trong cảnh" +msgstr "Tán xạ ánh sáng khi nó đi qua thể tích, thường được sử dụng để thêm sương mù vào cảnh" msgid "Convert a wavelength value to an RGB value" -msgstr "Biến đổi một giá trị bước sóng sang một giá tri RGB" +msgstr "Chuyển đổi giá trị bước sóng thành giá trị RGB" msgid "" "Retrieve the edges of an object as it appears to Cycles.\n" "Note: as meshes are triangulated before being processed by Cycles, topology will always appear triangulated" msgstr "" -"Rút cạnh của một vật thể theo hình dạng của nó trong Cycles.\n" -"Lưu ý: khi đang tam giác hóa các mạng lưới trước được xử lý bởi Cycles, tô pô sẽ xuất hiện như đã tam giác hóa" +"Lấy các cạnh của một đối tượng như nó xuất hiện cho Cycles.\n" +"Lưu ý: vì các khung lưới được tam giác hóa trước khi được Cycles xử lý, cho nên cấu trúc liên kết sẽ luôn luôn xuất hiện trong trạng thái tam giác hóa" + + +msgctxt "Unit" +msgid "Pixel Size" +msgstr "Kích Thước Điểm Ảnh" msgid "Use screen pixel size instead of world units" -msgstr "Dùng kích cỡ điểm ảnh màn thay thế đơn vị thế giới" +msgstr "Dùng kích thước điểm ảnh màn hình, thay vì đơn vị thế giới" msgid "Texture Node" -msgstr "Giao Điểm Chất Liệu" +msgstr "Nút Chất Liệu" msgid "At" @@ -45092,59 +48801,67 @@ msgstr "Gạch" msgid "Offset every N rows" -msgstr "Dịch mỗi N hàng" +msgstr "Dịch chuyển mỗi N hàng một" msgid "Squash every N rows" -msgstr "Nhẹp mỗi N hàng" +msgstr "Nén lại cứ mỗi N hàng một" msgid "Checker" -msgstr "Ca Rô" +msgstr "Bàn Cờ" msgid "Curve Time" -msgstr "Thời Gian Đường Cong" +msgstr "Thời Gian của Đường Cong" msgid "Parameters defining the image duration, offset and related settings" -msgstr "Tham số đang chỉ định thời chiếu ảnh, dịch và cài đặt liên quan" +msgstr "Các tham số xác định khoảng thời lượng của hình ảnh, dịch chuyển và các sắp đặt liên quan" msgid "Mix RGB" -msgstr "Pha Trộn RGB" +msgstr "Hòa Trộn RGB" msgid "Value to Normal" -msgstr "Giá Trị Thành Pháp Tuyến " +msgstr "Giá Trị thành Pháp Tuyến" + + +msgid "Collection of repeat items" +msgstr "Bộ sưu tập các mục lặp lại" + + +msgid "Collection of simulation items" +msgstr "Bộ sưu tập các mục mô phỏng" msgid "Node Inputs" -msgstr "Ngõ Vào Giao Điểm" +msgstr "Đầu Vào của Nút" msgid "Collection of Node Sockets" -msgstr "Sưu Tập Ổ Cắm Giao Điểm" +msgstr "Bộ Sưu Tập các Ổ Cắm của Nút" msgid "Node Instance Hash" -msgstr "Băm Thực Thể Giao Điểm" +msgstr "Giá Trị Băm của Thực Thể Nút" msgid "Hash table containing node instance data" -msgstr "Bảng băm có dữ liệu thực thể giao điểm" +msgstr "Bảng băm (Hash table) có chứa dữ liệu về thực thể nút" msgid "Socket Template" -msgstr "Bản Mẫu Ổ Cắm" +msgstr "Bản Mẫu của Ổ Cắm" msgid "Type and default value of a node socket" -msgstr "Loại và giá trị mặc định của ổ cắm giao điểm" +msgstr "Loại và giá trị mặc định của ổ cắm nút" msgid "Identifier of the socket" -msgstr "Tên xác định của ổ cắm" +msgstr "Định danh của ổ cắm" msgid "Name of the socket" @@ -45156,11 +48873,11 @@ msgstr "Dữ liệu của ổ cắm" msgid "Link between nodes in a node tree" -msgstr "Liên kết giữa giao điểm trong một cây giao điểm" +msgstr "Liên kết giữa các nút trong cây nút" msgid "From node" -msgstr "Từ giao điểm" +msgstr "Từ nút" msgid "From socket" @@ -45168,43 +48885,43 @@ msgstr "Từ ổ cắm" msgid "Is Hidden" -msgstr "Được Ẩn" +msgstr "Bị Ẩn Giấu" msgid "Link is hidden due to invisible sockets" -msgstr "Liên kết được ẩn vì ổ cắm ẩn" +msgstr "Kết nối bị ẩn giấu vì các ổ cắm vô hình (không nhìn thấy được)" msgid "Link is muted and can be ignored" -msgstr "Liên kết đã bị tắt tiếng và có thể không quan tâm" +msgstr "Liên kết đã bị giải hoạt và có thể bỏ qua được" msgid "Link is valid" -msgstr "Liên kết hợp lệ" +msgstr "Kết nối là hợp lệ" msgid "To node" -msgstr "Đến giao điểm" +msgstr "Vào nút" msgid "To socket" -msgstr "Đến ổ cắm" +msgstr "Vào ổ cắm" msgid "Node Links" -msgstr "Liên Kết Giao Điểm" +msgstr "Kết Nối của Nút" msgid "Collection of Node Links" -msgstr "Sưu tập Liên Kết Giao Điểm" +msgstr "Bộ Sưu Tập các Kết Nối của Nút" msgid "Output File Slot" -msgstr "Khe Tập Tin Xuất" +msgstr "Khe Đầu Ra Tập Tin" msgid "Single layer file slot of the file output node" -msgstr "Ổ cắm cho tập tin một có lớp của giao điểm xuất tập tin" +msgstr "Khe tập tin đơn tầng của nút xuất ra tập tin" msgid "Subpath used for this slot" @@ -45212,131 +48929,147 @@ msgstr "Đường dẫn phụ cho ổ cắm này" msgid "Save as Render" -msgstr "Lưu bằng Kết Xuất" +msgstr "Lưu như Bản Kết Xuất" msgid "Apply render part of display transform when saving byte image" -msgstr "Áp dụng biến hóa hiển thị của phần kết xuất khi lưu ảnh byte" +msgstr "Áp dụng phần kết xuất của biến hóa hiển thị khi lưu hình ảnh byte" msgid "Use Node Format" -msgstr "Dùng Định Dạng Giao Điểm" +msgstr "Dùng Định Dạng Nút" msgid "Output File Layer Slot" -msgstr "Ổ Cắm Lớp Tếp Xuất" +msgstr "Khe Xuất Tầng Lớp ra Tập Tin" msgid "Multilayer slot of the file output node" -msgstr "Ổ cắm đa lớp của giao điểm tập tin xuất" +msgstr "Khe của nút xuất tầng lớp ra tập tin" msgid "OpenEXR layer name used for this slot" -msgstr "Tên lớp OpenEXR cho ổ cắm này" +msgstr "Tên tầng lớp OpenEXR cho khe này" msgid "Node Outputs" -msgstr "Ngo Ra Giao Điểm" +msgstr "Đầu Ra của Nút" msgid "Node Socket" -msgstr "Ổ Cắm Giao Điểm" +msgstr "Ổ Cắm của Nút" msgid "Input or output socket of a node" -msgstr "Ổ cắm ngõ vào hay ra của một giao điểm" +msgstr "Ổ cắm đầu vào hay ra của một nút" msgid "Type Label" -msgstr "Nhẵn Loại" +msgstr "Nhãn Thể Loại" msgid "Label to display for the socket type in the UI" -msgstr "Nhẵn cho hiển thị cho loại ổ cắm trong giao diện" +msgstr "Nhãn để hiển thị kiểu ổ cắm trong giao diện người dùng" + + +msgid "Subtype Label" +msgstr "Nhãn của Kiểu Thứ" + + +msgid "Label to display for the socket subtype in the UI" +msgstr "Nhãn để hiển thị ổ cắm kiểu thứ trong giao diện người dùng" msgid "Tooltip" -msgstr "Đề Thị Dụng Cụ" +msgstr "Chú Thích" msgid "Socket tooltip" -msgstr "Đề thị dụng cụ ổ cắm" +msgstr "Chú thích ổ cắm" msgid "Socket shape" -msgstr "Dạng Ổ Cắm" +msgstr "Hình dạng của ổ cắm" msgid "Diamond" -msgstr "Hình Thoi" +msgstr "Hình Kim Cương" msgid "Circle with inner dot" -msgstr "Vòng tròn có dấu chấm giữa" +msgstr "Hình tròn với chấm ở trong" msgid "Square with inner dot" -msgstr "Vuông có dấu chấm giữa" +msgstr "Hình vuông với chấm ở trong" msgid "Diamond with inner dot" -msgstr "Hình thoi có dấu chấm giữa" +msgstr "Hình kim cương với chấm ở trong" msgid "Enable the socket" -msgstr "Bất ổ cắm" +msgstr "Bật ổ cắm" msgid "Hide the socket" -msgstr "Ẩn ổ cắm" +msgstr "Ẩn Giấu ổ cắm" msgid "Hide Value" -msgstr "Ẩn Giá Trị" +msgstr "Ẩn Giấu Giá Trị" msgid "Hide the socket input value" -msgstr "Ẩn giá trị ổ cắm ngõ vào" +msgstr "Ẩn giấu giá trị đầu vào của ổ cắm" msgid "Unique identifier for mapping sockets" -msgstr "Tên độc đáo cho ánh xạ ổ cắm" +msgstr "Định danh duy nhất dành cho quá trình ánh xạ các ổ cắm" msgid "Linked" -msgstr "ĐƯợc Liên Kết" +msgstr "Kết Nối" msgid "True if the socket is connected" -msgstr "Đứng nếu ổ cắm có nối" +msgstr "Giá trị 'Đúng' nếu ổ cắm được kết nối" msgid "Multi Input" -msgstr "Đa Ngõ Vào" +msgstr "Đa Đầu Vào" msgid "True if the socket can accept multiple ordered input links" -msgstr "Đúng nếu ổ cắm được nhận nhiều liên kết ngõ vào có trực tự" +msgstr "'Đúng' nếu ổ cắm có thể chấp nhận nhiều kết nối đầu vào có thứ tự" msgid "Is Output" -msgstr "Là Ngõ Ra" +msgstr "Là Đầu Ra" msgid "True if the socket is an output, otherwise input" -msgstr "Nếu đúng, ổ cắm là ngõ ra, nếu không là ngõ vào" +msgstr "Giá trị 'Đúng' nếu ổ cắm là đầu ra, nếu không thì là đầu vào" + + +msgid "Unavailable" +msgstr "Không Khả Dụng" + + +msgid "True if the socket is unavailable" +msgstr "Đúng nếu ổ cắm không khả dụng" msgid "Custom dynamic defined socket label" -msgstr "Nhẵn ổ cấm được chỉ định động lý tùy chọn" +msgstr "Nhãn hiệu ổ cắm tùy chỉnh năng động" msgid "Link Limit" -msgstr "Giới Hạn Liên Kết" +msgstr "Giới Hạn Kết Nối" msgid "Max number of links allowed for this socket" -msgstr "Số lượng liên kết tối đa được nối với ổ cắm này" +msgstr "Số lượng đường kết nối tối đa cho phép của ổ cắm này" msgid "Socket name" @@ -45344,11 +49077,11 @@ msgstr "Tên ổ cắm" msgid "Node owning this socket" -msgstr "Giao điểm chủ của ổ cắm này" +msgstr "Nút chủ nhân của ổ cắm này" msgid "Socket links are expanded in the user interface" -msgstr "Liên kết ổ cắm được mở rộng trong giao diện" +msgstr "Đường kết nối của ổ cắm được hiển thị trong giao diện" msgid "Data type" @@ -45356,11 +49089,11 @@ msgstr "Kiểu dữ liệu" msgid "Boolean Node Socket" -msgstr "Ổ Cắm Giao Điểm Bool" +msgstr "Ổ Cắm Nút bool" msgid "Boolean value socket of a node" -msgstr "Ổ cắm giá trị bool của giao điểm" +msgstr "Ổ cắm giá trị bool của nút" msgid "Default Value" @@ -45368,367 +49101,571 @@ msgstr "Giá Trị Mặc Định" msgid "Collection Node Socket" -msgstr "Ổ Sưu Tập Cắm Giao Điểm" +msgstr "Bộ Sưu Tập Ổ Cắm Nút" msgid "Collection socket of a node" -msgstr "Ổ cắm sưu tập của một giao điểm" +msgstr "Bộ sưu tập ổ cắm của một nút" msgid "Color Node Socket" -msgstr "Ổ Cắm Giao Điểm Màu" +msgstr "Ổ Cắm Màu Sắc của Nút" msgid "RGBA color socket of a node" -msgstr "Ổ cắm màu RGBA của giao điểm" +msgstr "Ổ cắm màu RGBA (Đỏ, Lục, Lam, Alpha) của nút" msgid "Float Node Socket" -msgstr "Ổ Cắm Giao Điểm Số Thật" +msgstr "Ổ Cắm cho Nút Float" msgid "Floating-point number socket of a node" -msgstr "Ổ cắm số thật dấu phẩy động của một giao điểm" +msgstr "Ổ cắm số thực của nút" msgid "Geometry Node Socket" -msgstr "Ổ Cắm Giao Điểm Hình Dạng" +msgstr "Ổ Cắm Hình Học của Nút" msgid "Geometry socket of a node" -msgstr "Ổ cắm ảnh hìn dạng của một giao điểm" +msgstr "Ổ cắm hình học của nút" msgid "Image Node Socket" -msgstr "Ổ Cắm Giao Điểm Ảnh" +msgstr "Ổ Cắm Hình Ảnh của Nút" msgid "Image socket of a node" -msgstr "Ổ cắm ảnh của một giao điểm" +msgstr "Ổ cắm hình ảnh của nút" msgid "Integer Node Socket" -msgstr "Ổ Cắm Số Nguyên Giao Điểm" +msgstr "Ổ Cắm Nút Integer" msgid "Integer number socket of a node" -msgstr "Ổ cắm số nguyên của giao điểm" +msgstr "Ổ cắm cho số nguyên của nút" msgid "Material Node Socket" -msgstr "Ổ Cắm Giao Điểm Vặt Liệu" +msgstr "Ổ Cắm Nút Nguyên Vật Liệu" msgid "Material socket of a node" -msgstr "Ổ cắm vật liệu của giao điểm" +msgstr "Ổ cắm nguyên vật liệu của một nút" msgid "Object Node Socket" -msgstr "Ổ Cắm Giao Điểm Vật Thể" +msgstr "Ổ Cắm Đối tượng của Nút" msgid "Object socket of a node" -msgstr "Ổ cắm vật thể của một giao điểm" +msgstr "Ổ cắm đối tượng của nút" + + +msgid "Rotation Node Socket" +msgstr "Ổ Cắm Nút Xoay Chiều" + + +msgid "Rotation value socket of a node" +msgstr "Ổ cắm giá trị xoay chiều của một nút" msgid "Shader Node Socket" -msgstr "Ổ Cắm Giao Điểm Bộ Tô Sắc" +msgstr "Ổ Cắm Nút Shader" msgid "Shader socket of a node" -msgstr "Ổ cắm bộ tô sắc của một giao điểm" +msgstr "Ổ cắm cho bộ tô bóng của nút" msgid "String Node Socket" -msgstr "Ổ Cắm Xâu Giao Điểm" +msgstr "Ổ Cắm Nút String" msgid "String socket of a node" -msgstr "Ổ cắm xâu của một giao điểm" +msgstr "Ổ cắm cho chuỗi ký tự của nút" msgid "Texture Node Socket" -msgstr "Ổ Cắm Giao Điểm Chất Liệu" +msgstr "Ổ Cắm Nút Chất Liệu" msgid "Texture socket of a node" -msgstr "Ổ cắm chất liệu của một giao điểm" +msgstr "Ổ cắm chất liệu của một nút" msgid "Vector Node Socket" -msgstr "Ổ Cắm Giao Điểm Vectơ" +msgstr "Ổ Cắm Nút Véctơ" msgid "3D vector socket of a node" -msgstr "Ổ cắm vectơ 3D của một giao điểm" +msgstr "Ổ cắm cho vectơ 3D của nút" msgid "Virtual Node Socket" -msgstr "Ổ Cắm Giao Điểm Ảo" +msgstr "Ổ Cắm Nút Ảo" msgid "Virtual socket of a node" -msgstr "Ổ cắm ảo cúa giao điểm" +msgstr "Ổ cắm ảo của nút" + + +msgid "Node Tree Interface" +msgstr "Giao Diện Cây Nút" + + +msgid "Declaration of sockets and ui panels of a node group" +msgstr "Khai báo ổ cắm và bảng giao diện của một nhóm nút" + + +msgid "Active item" +msgstr "Mục đang hoạt động" + + +msgid "Active Index" +msgstr "Chỉ Số Đang Hoạt Động" + + +msgid "Items in the node interface" +msgstr "Các mục trong giao diện nút" + + +msgid "Node Tree Interface Item" +msgstr "Mục Giao Diện Cây Nút" + + +msgid "Item in a node tree interface" +msgstr "Mục trong một giao diện cây nút" + + +msgid "Global index of the item among all items in the interface" +msgstr "Chỉ Số toàn cầu của mục trong số tất cả các mục trong giao diện" + + +msgid "Item Type" +msgstr "Thể Loại Mục" + + +msgid "Type of interface item" +msgstr "Thể loại mục giao diện" + + +msgid "Socket" +msgstr "Ổ Cắm" + + +msgid "Panel that contains the item" +msgstr "Bảng chứa mục" + + +msgid "Position of the item in its parent panel" +msgstr "Vị trí của mục trong bảng phụ huynh của nó" + + +msgid "Declaration of a node panel" +msgstr "Khai báo của một bảng nút" + + +msgid "Default Closed" +msgstr "Mặc Định Đóng Lại" + + +msgid "Panel is closed by default on new nodes" +msgstr "Theo mặc định thì bảng điều khiển được đóng lại trên các nút mới" + + +msgid "Panel description" +msgstr "Miêu tả bảng" + + +msgid "Items in the node panel" +msgstr "Các mục trong bảng nút" + + +msgid "Panel name" +msgstr "Tên bảng" + + +msgid "Node Tree Interface Socket" +msgstr "Ổ Cắm Giao Diện Cây Nút" + + +msgid "Declaration of a node socket" +msgstr "Khai báo của một ổ cắm nút" msgid "Attribute Domain" -msgstr "Phạm Vi Đặc Điểm" +msgstr "Phạm Vi Thuộc tính" msgid "Attribute domain used by the geometry nodes modifier to create an attribute output" -msgstr "Phạm vi đặc điểm được dùng bởi bộ điều chỉnh giao điểm hình dạng để chế tạo một ngõ ra đặc điểm" +msgstr "Phạm vi thuộc tính sử dụng bởi trình biên soạn nút hình học để kiến tạo đầu ra thuộc tính" + + +msgid "Socket Type Name" +msgstr "Tên Loại Ổ Cắm" + + +msgid "Name of the socket type" +msgstr "Tên loại ổ cắm" msgid "Default Attribute" -msgstr "Đặc Điểm Mặc Định" +msgstr "Thuộc Tính Mặc Định" msgid "The attribute name used by default when the node group is used by a geometry nodes modifier" -msgstr "Tên mặc định cho đặc điểm khi nhóm giao điểm được sử dụng bởi một bộ điều chỉnh giao điểm hình dạng" +msgstr "Tên thuộc tính sử dụng mặc định khi nhóm nút được bộ điều chỉnh nút hình học sử dụng" + + +msgid "Socket description" +msgstr "Miêu tả ổ cắm" + + +msgid "Single Value" +msgstr "Đơn Giá Trị" + + +msgid "Only allow single value inputs rather than fields" +msgstr "Chỉ cho phép đầu vào đơn giá trị thay vì các trường" + + +msgid "Hide in Modifier" +msgstr "Ẩn Giấu trong Bộ Điều Chỉnh" + + +msgid "Don't show the input value in the geometry nodes modifier interface" +msgstr "Không hiển thị giá trị đầu vào trong giao diện bộ điều chỉnh nút hình học" msgid "Hide the socket input value even when the socket is not connected" -msgstr "Giấu giá trị ngõ vào của ổ cắm khi không kết nối" +msgstr "Ẩn giấu giá trị đầu vào của ổ cắm, ngay cả khi ổ cắm không được kết nối" + + +msgid "Input/Output Type" +msgstr "Thể Loại Đầu Vào/Đầu Ra" + + +msgid "Input or output socket type" +msgstr "Thể loại ổ cắm đầu vào hoặc đầu ra" + + +msgid "Generate a input node socket" +msgstr "Sinh tạo một ổ cắm cho nút đầu vào" + + +msgid "Generate a output node socket" +msgstr "Sinh tạo một ổ cắm cho nút đầu ra" msgid "Layer Selection" -msgstr "Sự lựa chọn lớp" +msgstr "Sự Lựa Chọn Tầng Lớp" msgid "Socket Type" msgstr "Loại Ổ Cắm" +msgid "Type of the socket generated by this interface item" +msgstr "Loại ổ cắm được sinh tạo bởi mục giao diện này" + + msgid "Boolean Node Socket Interface" -msgstr "Giao Diện Của Ổ Cắm Giao Điểm Bool" +msgstr "Giao Diện Ổ Cắm Nút Bool" msgid "Collection Node Socket Interface" -msgstr "Giao Diện Của Ổ Cắm Giao Điểm Sưu Tập" +msgstr "Bộ Sưu Tập Giao Diện Ổ Cắm của Nút" msgid "Color Node Socket Interface" -msgstr "Giao Diện Của Ổ Cắm Giao Điểm Màu" +msgstr "Giao Diện Ổ Cắm của Nút Color" msgid "Float Node Socket Interface" -msgstr "Giao Diện Cửa Ổ Cắm Giao Điểm Số Thật" +msgstr "Giao Diện Ổ Cắm của Nút Float" msgid "Maximum value" -msgstr "Giá trị cực đại " +msgstr "Giá trị tối đa" msgid "Minimum value" -msgstr "Giá trị cực tiểu" +msgstr "Giá trị tối thiểu" msgid "Subtype" -msgstr "Loại Phù" +msgstr "Kiểu Thứ" + + +msgid "Subtype of the default value" +msgstr "Kiểu thứ của giá trị mặc định" msgid "Geometry Node Socket Interface" -msgstr "Giao Diện Của Ổ Cắm Giao Điểm Hình Dạng" +msgstr "Giao Diện Ổ Cắm của Nút Hình Học" msgid "Image Node Socket Interface" -msgstr "Giao Diện Của Ổ Cắm Giao Điểm Ảnh" +msgstr "Giao Diện Ổ Cắm của Nút Hình Ảnh" msgid "Integer Node Socket Interface" -msgstr "Giao Diện Của Ổ Cắm Giao Điểm Số Nguyên" +msgstr "Giao Diện Ổ Cắm của Nút Integer" msgid "Material Node Socket Interface" -msgstr "Giao Diện Của Ổ Cắm Giao Điểm Chất Liệu" +msgstr "Giao Diện Ổ Cắm của Nút Nguyên Vật Liệu" msgid "Object Node Socket Interface" -msgstr "Giao Diện Của Ổ Cắm Giao Điểm Vật Thể" +msgstr "Giao Diện Ổ Cắm của Nút Đối Tượng" + + +msgid "Rotation Node Socket Interface" +msgstr "Giao Diện Ổ Cắm của Nút Xoay Chiều" msgid "Shader Node Socket Interface" -msgstr "Giao Diện Của Ổ Cắm Giao Điểm Bộ Tô Sắc" +msgstr "Giao Diện Ổ Cắm của Nút Tô Bóng" msgid "String Node Socket Interface" -msgstr "Giao Diện Của Ổ Cắm Giao Điểm Xâu" +msgstr "Giao Diện Ổ Cắm của Nút String" msgid "Texture Node Socket Interface" -msgstr "Giao Diện Của Ổ Cắm Giao Điểm Chất Liệu" +msgstr "Giao Diện Ổ Cắm của Nút Véctơ" msgid "Vector Node Socket Interface" -msgstr "Giao Diện Của Ổ Cắm Giao Điểm Vectơ" +msgstr "Giao Diện Ổ Cắm của Nút Vector" msgid "Node Tree Path" -msgstr "Đường Dẫn Cây Giao Điềm" +msgstr "Đường Phân Nhánh Cây Nút" msgid "Element of the node space tree path" -msgstr "Phần tử đường dẫn của cây giao điềm" +msgstr "Phần tử trên đường phân nhánh cây trong không gian nút" msgid "Base node tree from context" -msgstr "Cây cơ sở giao điểm từ bối cảnh" +msgstr "Nền cây nút trong ngữ cảnh" msgid "Collection of Nodes" -msgstr "Sưu Tập Giao Điểm" +msgstr "Bộ Sưu Tập Nút" msgid "Active Node" -msgstr "Giao Điểm Hoạt Động" +msgstr "Nút đang Hoạt Động" msgid "Active node in this tree" -msgstr "Giao điểm hoạt động trong cây này" +msgstr "Nút đang hoạt động trong cây này" + + +msgid "Nodes Modifier Bake" +msgstr "Nướng Bộ Điều Chỉnh của các Nút" + + +msgid "Frame where the baking ends" +msgstr "Khung hình nơi quá trình nướng kết thúc" + + +msgid "Frame where the baking starts" +msgstr "Khung hình nơi bắt đầu nướng" + + +msgid "Custom Path" +msgstr "Đường Dẫn Tùy Chỉnh" + + +msgid "Specify a path where the baked data should be stored manually" +msgstr "Chỉ định một đường dẫn nơi dữ liệu đã nướng sẽ được lưu trữ một cách thủ công" + + +msgid "Custom Simulation Frame Range" +msgstr "Phạm Vi Khung Mô Phỏng Tùy Chỉnh" + + +msgid "Override the simulation frame range from the scene" +msgstr "Vượt quyền phạm vi khung hình mô phỏng từ cảnh" + + +msgid "Bakes" +msgstr "Nướng" + + +msgid "Bake data for every bake node" +msgstr "Nướng dữ liệu cho mỗi nút nướng" msgid "Object Base" -msgstr "Cơ Sở Vật Thể" +msgstr "Cơ Sở Đối Tượng" msgid "An object instance in a render layer" -msgstr "Một thực thể vật thể trong một lớp kết xuất" +msgstr "Một thực thể của đối tượng đối tượng trong tầng kết xuất" msgid "Object this base links to" -msgstr "Cơ sở này được liên kết với vật thể nào" +msgstr "Đối tượng mà cơ sở này kết nối với" msgid "Object base selection state" -msgstr "Trạng thái lựa chọn của cơ sở vật thể" +msgstr "Trạng thái lựa chọn cơ sở đối tượng" msgid "Object Constraints" -msgstr "Ràng Buộc Vật Thể" +msgstr "Ràng Buộc Đối Tượng" msgid "Collection of object constraints" -msgstr "Sưu tập ràng buộc vật thể" +msgstr "Bộ sưu tập các ràng buộc đối tượng" msgid "Active Constraint" -msgstr "Ràng Buộc Hoạt Động" +msgstr "Ràng Buộc đang Hoạt Động" msgid "Active Object constraint" -msgstr "Ràng buộc Vật Thể Hoạt Động" +msgstr "Ràng buộc của Đối Tượng đang hoạt động" msgid "Object cast shadows in the 3D viewport" -msgstr "Vật thể được phát bóng tối trong màn chiếu 3D" +msgstr "Đối tượng ngả bóng tối trong cổng nhìn 3D" msgid "Object Grease Pencil Modifiers" -msgstr "Bộ Điều Chỉnh Bút Sáp Vật Thể" +msgstr "Bộ Điều Chỉnh Bút Chì Dầu của Đối Tượng" msgid "Collection of object grease pencil modifiers" -msgstr "Sưu tập bộ điều chỉnh bút sáp vật thề" +msgstr "Bộ sưu tập các bộ điều chỉnh Bút Chì Dầu cho đối tượng" + + +msgid "Object Light Linking" +msgstr "Liên Kết Ánh Sáng Đối Tượng" + + +msgid "Blocker Collection" +msgstr "Bộ Sưu Tập Đối Tượng Cản Trở Ánh Sáng" + + +msgid "Collection which defines objects which block light from this emitter" +msgstr "Bộ sưu tập xác định các đối tượng cản trở ánh sáng từ đối tượng phát xạ này" + + +msgid "Receiver Collection" +msgstr "Bộ Sưu Tập Đối Tượng Thu Nhận" + + +msgid "Collection which defines light linking relation of this emitter" +msgstr "Bộ sưu tập xác định mối quan hệ liên kết ánh sáng của đối tượng phát xạ này" msgid "Object Line Art" -msgstr "Vật Thể Nghệ Thuật Đường Nét" +msgstr "Mỹ Thuật Đường Nét cho Đối Tượng" msgid "Object line art settings" -msgstr "Cài đặt vật thể nghệ thuật đường nét" +msgstr "Các sắp đặt về mỹ thuật đường nét cho đối tượng" msgid "Angles smaller than this will be treated as creases" -msgstr "Goc nhỏ hơn giá trị này được xở lý như nhăn" +msgstr "Những góc nhỏ hơn giá trị này sẽ được coi là các nếp nhăn" msgid "How to use this object in line art calculation" -msgstr "Làm sao dùng vật thể này cho tính toán nghệ thuật đường nét" +msgstr "Phương pháp sử dụng đối tượng này trong tính toán của mỹ thuật đường nét" msgid "Inherit" -msgstr "Thừa Hưởng" +msgstr "Thừa Kế" msgid "Use settings from the parent collection" -msgstr "Dùng cài đặt từ sưu tập phụ huynh" +msgstr "Dùng sắp đặt từ bộ sưu tập phụ huynh" msgid "Generate feature lines for this object's data" -msgstr "Chế tạo đường đặc trưng cho dữ liệu của vật thể này" +msgstr "Sinh tạo các đường viền hình thể cho dữ liệu của đối tượng này" msgid "Only use the object data to produce occlusion" -msgstr "Chỉ dùng dữ liệu vật thể để tạo che khuất" +msgstr "Chỉ sử dụng dữ liệu đối tượng để tạo tính HTQXMT" msgid "Don't use this object for Line Art rendering" -msgstr "Không dùng vật thể này cho kết xuất Nghệ Thuật Đường Nét" +msgstr "Không sử dụng đối tượng này cho quá trình kết xuất Mỹ Thuật Đường Nét" msgid "Include this object but do not generate intersection lines" -msgstr "Gồm vật thể này nhưng không chế tạo đường giao cắt" +msgstr "Bao gồm đối tượng này nhưng không sinh tạo ra các đường giao cắt" msgid "Use this object's crease setting to overwrite scene global" -msgstr "Dùng cài đặt nhăn của vật thể này cho ghi trên cảnh toàn cầu" +msgstr "Dùng cài đặt về nếp nhăn/gấp của đối tượng này để viết đè lên cảnh toàn cầu" msgid "Use this object's intersection priority to override collection setting" -msgstr "Dùng độ ưu tien giao cắt của vật thể cho vượt quyền cài đặt của sưu tập" +msgstr "Sử dụng mức ưu tiên giao cắt của đối tượng này để vượt quyền cài đặt của bộ sưu tập" msgid "Object Modifiers" -msgstr "Bộ Điều Chỉnh Vật Thể" +msgstr "Bộ Điều Chỉnh Đối Tượng" msgid "Collection of object modifiers" -msgstr "Sưu tập bộ điều chỉnh vật thề" +msgstr "Bộ sưu tập các bộ điều chỉnh đối tượng" msgid "Active Modifier" -msgstr "Bộ Điều Chỉnh Hoạt Động" +msgstr "Bộ Điều Chỉnh đang Hoạt Động" msgid "Object Shader Effects" -msgstr "Hiệu Ứng Bộ Tô Sắc Vật Thể" +msgstr "Hiệu Ứng Bộ Tô Bóng Đối Tượng" msgid "Collection of object effects" -msgstr "Sưu tập của hiệu ứng vật thể" +msgstr "Bộ sưu tập các hiệu ứng của đối tượng" msgid "Operator Options" -msgstr "Tùy Chọn Thao Tác" +msgstr "Tùy Chọn của Thao Tác" msgid "Runtime options" -msgstr "Tùy chọn khi chạy" +msgstr "Các tùy chọn cho thời gian thi hành" msgid "True when the cursor is grabbed" -msgstr "Đúng khi bắt được con trỏ" +msgstr "Giá trị 'Đúng' khi nắm bắt được con trỏ" msgid "Invoke" -msgstr "Thực Hành" +msgstr "Khởi Động" msgid "True when invoked (even if only the execute callbacks available)" -msgstr "Đúng khi được thực hành (vẫn đúng nếu chỉ có gọi lại được thực hành)" +msgstr "Giá trị 'Đúng' khi được thi hành (ngay cả khi chỉ có thi hành các callback (hàm gọi lại) mà thôi)" msgid "True when run from the 'Adjust Last Operation' panel" -msgstr "Đúng khi chạy từ bảng 'Chỉnh Thảo Tác Cuối'" +msgstr "Đúng khi chạy từ bảng 'Điều Chỉnh Thao Tác Trước Đây'" msgid "Repeat Call" -msgstr "Kêu Lần Nữa" +msgstr "Nhắc Lại" msgid "True when run from the operator 'Repeat Last'" -msgstr "Đúng khi chạy từ thao tác 'Làm Lại Cuối'" +msgstr "Đúng khi chạy từ Thao Tác 'Nhắc Lại bước Sau Cùng'" msgid "Focus Region" @@ -45736,45 +49673,50 @@ msgstr "Vùng Tiêu Điểm" msgid "Enable to use the region under the cursor for modal execution" -msgstr "Bật để dùng vùng ở dưới con trỏ cho thực hành cách thức" +msgstr "Cho phép sử dụng vùng nằm dưới con trỏ trong việc thi hành mô thái" msgid "Operator Properties" -msgstr "Đặc Tính Thao Tác" +msgstr "Tính Chất của Thao Tác" msgid "Input properties of an operator" -msgstr "Đặc tính ngõ vào của một thao tác" +msgstr "Các tính chất đầu vào của một thao tác" + + +msgctxt "Operator" +msgid "Bake Keyframes" +msgstr "Nướng Khung Khóa" msgid "Add keyframes on every frame between the selected keyframes" -msgstr "Thêm bức ảnh mẫu cho mỗi bức ảnh giữa các bức ảnh mẫu được chọn" +msgstr "Thêm các khung khóa vào mỗi khung hình giữa các khung khóa được chọn" msgctxt "Operator" msgid "Clean Keyframes" -msgstr "Làm Sạch Bức Ảnh Mẫu" +msgstr "Dọn Dẹp các Khung Khóa" msgid "Simplify F-Curves by removing closely spaced keyframes" -msgstr "Đơn giản Hóa Cong-F bằng xóa bức ảnh rất gần nhau" +msgstr "Đơn giản hóa Đường Cong-F bằng cách loại bỏ các khung khóa có khoảng cách gần nhau" msgctxt "Operator" msgid "Select Keyframes" -msgstr "Chọn Bức Ảnh Mẫu" +msgstr "Lựa Chọn Khung Khóa" msgid "Select keyframes by clicking on them" -msgstr "Lựa chọn bức ảnh mẫu bằng bấm trên nó" +msgstr "Lựa chọn các khung khóa bằng cách bấm trên nó" msgid "Only Channel" -msgstr "Chỉ Kênh Này" +msgstr "Duy Kênh Này" msgid "Select all the keyframes in the channel under the mouse" -msgstr "Chọn hết bức ảnh mẫu trong kênh ở dưới con trỏ chuột" +msgstr "Chọn toàn bộ các khung khóa trong kênh nằm dưới chuột" msgid "Column Select" @@ -45782,23 +49724,23 @@ msgstr "Chọn Cột" msgid "Select all keyframes that occur on the same frame as the one under the mouse" -msgstr "Chọn hết bức ảnh mẫu ở cùng số bức ảnh đang ở dưới con trỏ chuột" +msgstr "Chọn toàn bộ các khung khóa ở cùng khung hình nằm dưới chuột" msgid "Deselect On Nothing" -msgstr "Thả Trên Rỗng" +msgstr "Hủy Chọn nếu Không Có Gì" msgid "Deselect all when nothing under the cursor" -msgstr "Thả tất cả khi không có cái gì ở dưới con trỏ" +msgstr "Hủy chọn toàn bộ khi không có gì nằm dưới con trỏ" msgid "Extend Select" -msgstr "Kéo Dài Sự Lựa Chọn" +msgstr "Nới Rộng Lựa Chọn" msgid "Toggle keyframe selection instead of leaving newly selected keyframes only" -msgstr "Bật/tắt lựa chọn bức ảnh mẫu thay thế chỉ bỏ lại bức ảnh mới chọn" +msgstr "Bật/Tắt trạng thái lựa chọn của khung khóa, thay vì chỉ để nguyên các khung khóa mới được chọn mà thôi" msgid "Mouse X" @@ -45810,217 +49752,226 @@ msgstr "Chuột Y" msgid "Wait to Deselect Others" -msgstr "Đợi để Thả Các Cái Khác" +msgstr "Đợi để hủy chọn những cái khác" msgctxt "Operator" msgid "Copy Keyframes" -msgstr "Chép Bức Ảnh Mẫu" +msgstr "Sao Chép Khung Khóa" + + +msgid "Copy selected keyframes to the internal clipboard" +msgstr "Sao chép các khung khóa đã chọn vào bảng nhớ tạm" msgctxt "Operator" msgid "Delete Keyframes" -msgstr "Xóa Bức Ảnh Mẫu" +msgstr "Xóa Khung Khóa" msgid "Remove all selected keyframes" -msgstr "Xóa hết bức ảnh mẫu được chọn" +msgstr "Xóa toàn bộ các khung khóa được chọn" msgid "Confirm" -msgstr "Xác Nhận" +msgstr "Chấp Thuận" msgid "Prompt for confirmation" -msgstr "Đòi xác nhận" +msgstr "Nhắc phê chuẩn" msgctxt "Operator" msgid "Duplicate Keyframes" -msgstr "Sao Chép Bức Ảnh Mẫu" +msgstr "Nhân Đôi Khung Khóa" msgid "Make a copy of all selected keyframes" -msgstr "Chép tất cả bức ảnh mẫu được chọn" +msgstr "Tạo bản sao của toàn bộ các khung khóa được chọn" msgctxt "Operator" msgid "Duplicate" -msgstr "Sao Chép" +msgstr "Nhân Đôi" msgid "Make a copy of all selected keyframes and move them" -msgstr "Chép hết bức ảnh mẫu được chọn và di chuyển chúng nó" +msgstr "Tạo bản sao của toàn bộ các khung khóa được chọn và di chuyển chúng" msgid "Duplicate Keyframes" -msgstr "Sao Chép Bức Ảnh Mẫu" +msgstr "Nhân Đôi Khung Khóa" msgid "Transform selected items by mode type" -msgstr "Biến hóa đồ được chọn tùy loại chế độ" +msgstr "Biến hóa các phần tử được chọn tùy theo kiểu chế độ" msgctxt "Operator" msgid "Set Keyframe Easing Type" -msgstr "Đặt Loại Xoa Bịu Bức Ảnh Mẫu" +msgstr "Đặt Kiểu Chậm Rãi Khung Khóa" msgid "Set easing type for the F-Curve segments starting from the selected keyframes" -msgstr "Đặt loại xoa dịu cho các khúc Cong-F bắt đầu từ các bức ảnh mẫu được chọn" +msgstr "Đặt kiểu chậm rãi cho các phân đoạn của Đường Cong-F, bắt đầu từ các khung hình đã chọn" + + +msgctxt "Operator" +msgid "Set F-Curve Extrapolation" +msgstr "Đặt Chế Độ Ngoại Suy cho Đường Cong-F" msgid "Set extrapolation mode for selected F-Curves" -msgstr "Đặt chế độ ngoại suy cho cong-F được chọn" +msgstr "Đặt chế độ ngoại suy cho Đường Cong-F được chọn" msgid "Constant Extrapolation" -msgstr "Ngoại Suy Hằng Số" +msgstr "Ngoại Suy Bất Biến" msgid "Values on endpoint keyframes are held" -msgstr "Giữ giá trị tại bức ảnh mẫu đầu và cuối" +msgstr "Duy trì các giá trị tại các khung khóa đầu và cuối" msgid "Linear Extrapolation" -msgstr "Suy Ngoại Bậc Một" +msgstr "Ngoại Suy Tuyến Tính" msgid "Straight-line slope of end segments are extended past the endpoint keyframes" -msgstr "Kéo dài dốc đường thẳng của khúc đầu và cuối ra ngoài điểm đầu và cuối" +msgstr "Đường dốc thẳng của các phân đoạn kết thúc sẽ được nới dài, vượt quá điểm cuối của các khung khóa" msgid "Make Cyclic (F-Modifier)" -msgstr "Làm Chu Trình (Bộ Điều Chỉnh-F)" +msgstr "Tuần Hoàn Hóa (Bộ Điều Chỉnh-F)" msgid "Add Cycles F-Modifier if one doesn't exist already" -msgstr "Thêm Bộ Điều Chỉnh-F Chu Trình nếu chưa có cái nào" +msgstr "Thêm Bộ Điều Chỉnh-F Tuần Hoàn nếu chưa có" msgid "Clear Cyclic (F-Modifier)" -msgstr "Xóa Chu Trình (Bộ Điều Chỉnh-F)" +msgstr "Ngắt Tuần Hoàn (Bộ Điều Chỉnh-F)" msgid "Remove Cycles F-Modifier if not needed anymore" -msgstr "Xoá Bộ Điều Chỉnh-F nếu không cần nữa" +msgstr "Xóa Bộ Điều Chỉnh-F nếu không cần nữa" msgctxt "Operator" msgid "Jump to Keyframes" -msgstr "Nhảy Đến Bức Ảnh Mẫu" +msgstr "Nhảy đến Khung Khóa" msgid "Set the current frame to the average frame value of selected keyframes" -msgstr "Đặt bức ảnh hiện tại đến giá trị trung bình của các bức ảnh mẫu được chọn" +msgstr "Đưa vị trí của khung hình hiện tại đến vị trí trung bình của các khung khóa đã chọn" msgctxt "Operator" msgid "Set Keyframe Handle Type" -msgstr "Đặt loại tay cầm Bức Ảnh Mẫu" +msgstr "Đặt Kiểu Tay Cầm cho Khung Khóa" msgid "Set type of handle for selected keyframes" -msgstr "Đặt loại tay cầm của bức ảnh mẫu được chọn" +msgstr "Đặt kiểu tay cầm cho các khung khóa được chọn" msgctxt "Operator" msgid "Set Keyframe Interpolation" -msgstr "Đặt Nội Suy Bức Ảnh Mẫu" +msgstr "Đặt Chế Độ Nội Suy Khung Khóa" msgid "Set interpolation mode for the F-Curve segments starting from the selected keyframes" -msgstr "Đặt chế độ nội suy cho các đoạn Cong-F bắt đầu từ các bức ảnh mẫu được chọn" +msgstr "Đặt chế độ nội suy cho các phân đoạn Đường Cong-F, bắt đầu từ các khung khóa được chọn" msgctxt "Operator" msgid "Insert Keyframes" -msgstr "Chèn Bức Ảnh Mẫu" +msgstr "Chèn Thêm Khung Khóa" msgid "Insert keyframes for the specified channels" -msgstr "Chèn bức ảnh mẫu cho các kênh được chọn" +msgstr "Chèn thêm khung khóa cho các kênh chỉ định" msgid "All Channels" -msgstr "Tất Cả Kênh" +msgstr "Toàn Bộ các Kênh" msgid "Only Selected Channels" -msgstr "Chỉ Các Kênh Được Chọn" +msgstr "Duy các Kênh được Chọn" msgid "In Active Group" -msgstr "Trong Nhóm Hoạt Động" +msgstr "Trong Nhóm đang Hoạt Động" msgctxt "Operator" msgid "Set Keyframe Type" -msgstr "Đặt Loại Bức Ảnh Mẫu" +msgstr "Đặt Thể Loại Khung Khóa" msgid "Set type of keyframe for the selected keyframes" -msgstr "Đặt loại bức ảnh mẫu cho các bức ảnh mẫu được chọn" +msgstr "Đặt thể loại khung khóa cho các khung khóa được chọn" msgctxt "Operator" msgid "Next Layer" -msgstr "Lớp Tiếp" +msgstr "Tầng Tiếp Theo" msgid "Switch to editing action in animation layer above the current action in the NLA Stack" -msgstr "Đổi đến hành động biên tập trong lớp hoạt hình ở trên hành động hiện tại trong Xếp Đống NLA" +msgstr "Chuyển sang biên soạn hành động trong tầng hoạt họa nằm trên hành động hiện tại trong Ngăn Xếp NLA" msgctxt "Operator" msgid "Previous Layer" -msgstr "Lớp Trước" +msgstr "Tầng Trước Đây" msgid "Switch to editing action in animation layer below the current action in the NLA Stack" -msgstr "Đổi đến biên tập hành động trong lớp hoạt hình dưới hành động hiện tại trong Xếp Đống NLA" +msgstr "Chuyển sang biên soạn hành động trong tầng hoạt họa bên dưới hành động hiện tại trong Ngăn Xếp NLA" msgctxt "Operator" msgid "Make Markers Local" -msgstr "Làm Ký Hiệu Địa Phương" +msgstr "Cục Bộ Hóa Dấu Mốc" msgid "Move selected scene markers to the active Action as local 'pose' markers" -msgstr "Di chuyển ký hiệu cảnh được chọn đến Hành Động hoạt động thành ký hiệu 'dạng đứng' địa phương" +msgstr "Di chuyển các dấu mốc cảnh được chọn vào Hành Động đang hoạt động, biến chúng thành các dấu mốc 'tư thế' cục bộ" msgctxt "Operator" msgid "Mirror Keys" -msgstr "Gương Bức Ảnh Mẫu" +msgstr "Phản Chiếu Đối Xứng Khung Khóa" msgid "Flip selected keyframes over the selected mirror line" -msgstr "Lật thời gian của các bức ảnh mẫu qua đường gương được chọn" +msgstr "Đảo lật các khung khóa được chọn, dùng đường tâm phản chiếu đối xứng đã chọn" msgid "By Times Over Current Frame" -msgstr "Bằng Lần Hơn Bức Ảnh Hiện Tại" +msgstr "Theo Thời Gian dùng khung hình Hiện Tại" msgid "Flip times of selected keyframes using the current frame as the mirror line" -msgstr "Lật thời gian của các bức ảnh mẫu được chọn mà dùng bức ảnh hiện tại làm đường gương" +msgstr "Đảo lật thời gian của các khung khóa được chọn, dùng khung hình hiện tại làm đường tâm phản chiếu đối xứng" msgid "By Values Over Zero Value" -msgstr "Bằng Giá Trị Hơn Giá Trị Không" +msgstr "Lấy Giá Trị Qua Mốc Số 0" msgid "Flip values of selected keyframes (i.e. negative values become positive, and vice versa)" -msgstr "Lật giá trị của các bức ảnh mẫu được chọn (ví dụ giá trị âm thành dương và trở ngược)" +msgstr "Lật đảo các giá trị của khung khóa được chọn (ví dụ: các giá trị âm thành dương, và ngược lại)" msgid "By Times Over First Selected Marker" -msgstr "Bằng Thời Gian Hơn Ký Hiệu Được Chọn Đầu Tiên" +msgstr "Theo Thời Gian dùng Dấu Mốc được Chọn Đầu Tiên" msgid "Flip times of selected keyframes using the first selected marker as the reference point" -msgstr "Lật thời gian của các bức ảnh mẫu được chọn mà dùng ky hiệu được chọn đầu tiên làm điểm lật" +msgstr "Lật đảo thời gian của các khung khóa đã chọn bằng cách sử dụng dấu mốc được chọn đầu tiên làm điểm tham chiếu" msgctxt "Operator" @@ -46029,148 +49980,152 @@ msgstr "Hành Động Mới" msgid "Create new action" -msgstr "Chế tạo hành động mới" +msgstr "Kiến Tạo hành động mới" msgctxt "Operator" msgid "Paste Keyframes" -msgstr "Dán Bứa Ảnh Mẫu" +msgstr "Dán Khung Khóa" + + +msgid "Paste keyframes from the internal clipboard for the selected channels, starting on the current frame" +msgstr "Dán các khung khóa từ bộ đệm nội bộ cho các kênh đã chọn, khởi đầu tại khung hình hiện tại" msgid "Flipped" -msgstr "Được Lật" +msgstr "Đảo Lật" msgid "Paste keyframes from mirrored bones if they exist" -msgstr "Dán bức ảnh mẫu từ xương gương nếu chúng nó tồn tại" +msgstr "Dán các khung khóa từ các xương phản chiếu đối xứng, nếu chúng tồn tại" msgid "Method of merging pasted keys and existing" -msgstr "Phương pháp gồm bức ảnh mẫu dán và bức ảnh mẫu tồn tại" +msgstr "Phương pháp hợp nhất các khóa được dán với những cái tồn tại" msgid "Overlay existing with new keys" -msgstr "Bỏ bức ảnh mẫu mới lên trên các bức ảnh mẫu tồn tại" +msgstr "Lồng những khóa mới với những cái hiện có" msgid "Overwrite All" -msgstr "Ghi Lại Lên Trên Tất Cả" +msgstr "Viết Đè Toàn Bộ" msgid "Replace all keys" -msgstr "Thay thế hết bức ảnh mẫu" +msgstr "Thay thế toàn bộ các khung khóa" msgid "Overwrite Range" -msgstr "Ghi Lại Lên Trên Phạm Vi" +msgstr "Viết Đè Phạm Vi" msgid "Overwrite keys in pasted range" -msgstr "Ghi lại lên trên bức ảnh mẫu trong phạm vi dán" +msgstr "Viết đè các khung khóa trong phạm vi dán" msgid "Overwrite Entire Range" -msgstr "Ghi Lại Lên Trên Toàn Phạm Vi" +msgstr "Viết Đè Toàn Bộ Phạm Vi" msgid "Overwrite keys in pasted range, using the range of all copied keys" -msgstr "Ghi lại lên trên bức ảnh mẫu trong phạm vi dán, dùng phạm vi của tất cả bức ảnh mẫu đã chép" +msgstr "Viết đè các khung khóa nằm trong phạm vi dán, dùng phạm vi của toàn bộ các khung khóa đã sao chép" msgid "Paste time offset of keys" -msgstr "Dịch thời gian của bức ảnh mẫu dán" +msgstr "Dán sự dịch chuyển về thời gian của các khung khóa" msgid "Paste keys starting at current frame" -msgstr "Dán bức ảnh mẫu bắt đầu tại bức ảnh hiện tại" +msgstr "Dán các khóa bắt đầu tại khung hình hiện tại" msgid "Frame End" -msgstr "Bức Ảnh Kết Thúc" +msgstr "Khung Hình Kết Thúc" msgid "Paste keys ending at current frame" -msgstr "Dán bức ảnh mẫu kết thúc tại bức ảnh hiện tại" +msgstr "Dán các khóa kết thúc tại khung hình hiện tại" msgid "Frame Relative" -msgstr "Bức Ảnh Tương Đối" +msgstr "Khung Hình Tương Đối" msgid "Paste keys relative to the current frame when copying" -msgstr "Dán bức ảnh mẫu tương đối với bức ảnh hiện tại khi chép lại" +msgstr "Dán các khóa tương đối với khung hình hiện tại khi sao chép" msgid "No Offset" -msgstr "Không Dịch" +msgstr "Không Dịch Chuyển" msgid "Paste keys from original time" -msgstr "Dán bức ảnh mẫu từ thời gian ban đầu" +msgstr "Dán các khóa dùng thời gian nguyên gốc" msgctxt "Operator" msgid "Set Preview Range to Selected" -msgstr "Đặt Phạm Vi Dự Khán đến Được Chọn" +msgstr "Đặt cái Đã Chọn làm Phạm Vi Xem Trước" msgid "Set Preview Range based on extents of selected Keyframes" -msgstr "Đặt Phạm Vi Dự Khán tùy phạm vi của Bức Ảnh Mẫu được chọn" +msgstr "Đặt khoảng của các Khung Khóa được chọn làm Phạm Vi Xem Trước" msgctxt "Operator" msgid "Push Down Action" -msgstr "Đẩy Hành Động Xuống" +msgstr "Đẩn Hành Động Xuống" msgid "Push action down on to the NLA stack as a new strip" -msgstr "Đẩy hành động xuống trong xếp đống NLA cho được làm một đoạn mới" +msgstr "Đẩn hành động xuống trên ngăn xếp NLA làm một dải mới" msgctxt "Operator" msgid "Select All" -msgstr "Chọn Hết" +msgstr "Chọn Toàn Bộ" msgid "Toggle selection of all keyframes" -msgstr "Tắt/bật sự lựa chọn của hết bức ảnh mẫu" +msgstr "Đảo lật lựa chọn toàn bộ các khung khóa" msgid "Selection action to execute" -msgstr "Chọn hành động để thực hành" +msgstr "Hành động lựa chọn để thi hành" msgid "Toggle" -msgstr "Bật/Tắt" +msgstr "Đảo Lật/Bật/Tắt" msgid "Toggle selection for all elements" -msgstr "Bật/tắt sự lựa chọn của tất cả phần tử" +msgstr "Đảo lật lựa chọn cho toàn bộ các phần tử" msgid "Select all elements" -msgstr "Chọn hết phần tử" +msgstr "Chọn toàn bộ các phần tử" msgid "Deselect" -msgstr "Thả Hết" +msgstr "Hủy Chọn" msgid "Deselect all elements" -msgstr "Thả tất cả phần tử" +msgstr "Hủy chọn toàn bộ các phần tử" msgid "Invert selection of all elements" -msgstr "Đảo nghịch sự lựa chọn của tất cả phần tử" +msgstr "Đảo nghịch lựa chọn của toàn bộ các phần tử" msgctxt "Operator" msgid "Box Select" -msgstr "Chọn Kiểu Hộp" +msgstr "Khoanh Vùng Chọn Hình Hộp" msgid "Select all keyframes within the specified region" -msgstr "Chọn hết bức ảnh mẫu trong phạm vi đã chọn" +msgstr "Chọn toàn bộ các khung khóa nội trong phạm vi xác định" msgid "Axis Range" @@ -46182,77 +50137,77 @@ msgstr "Đặt" msgid "Set a new selection" -msgstr "Đặt một sự lựa chọn mới" +msgstr "Đặt sự lựa chọn mới" msgid "Extend existing selection" -msgstr "Mở rộng sự lựa chọn hiện tại" +msgstr "Nới rộng lựa chọn hiện tại" msgid "Subtract existing selection" -msgstr "Trừ bớt sự lựa chọn hiện tại" +msgstr "Khấu trừ lựa chọn hiện tại" msgid "Operator has been activated using a click-drag event" -msgstr "Thao tác được hoạt động bằng một sự kiện bấm kéo" +msgstr "Thao tác đã được kích hoạt dùng sự kiện nhấp chuột và kéo rê (click-drag)" msgid "Wait for Input" -msgstr "Chờ Ngõ Vào" +msgstr "Đợi Chờ Đầu Vào" msgid "X Max" -msgstr "Cực Đại X" +msgstr "Tối Đa X" msgid "X Min" -msgstr "Cực Tiểu X" +msgstr "Tối Thiểu X" msgid "Y Max" -msgstr "Cực Đại Y" +msgstr "Tối Đa Y" msgid "Y Min" -msgstr "Cực Tiểu Y" +msgstr "Tối Thiểu Y" msgctxt "Operator" msgid "Circle Select" -msgstr "Chọn Kiểu Vòng Tròn" +msgstr "Lựa Chọn bằng Vòng Tròn" msgid "Select keyframe points using circle selection" -msgstr "Chọn điểm bức ảnh mẫu bằng lựa chọn kiểu vòng tròn" +msgstr "Chọn các điểm khung khóa dùng lựa chọn vòng tròn" msgid "Select all keyframes on the specified frame(s)" -msgstr "Chọn hết bức ảnh mẫu trên (các) bức ảnh được xác định" +msgstr "Chọn toàn bộ các khung khóa tại (các) khung hình được chọn" msgid "On Selected Keyframes" -msgstr "Trên Bức Ảnh Mẫu Được Chọn" +msgstr "Tại các Khung Khóa Đã Chọn" msgid "On Current Frame" -msgstr "Trên Bức Ảnh Hiện Tại" +msgstr "Tại Khung Hình Hiện Tại" msgid "On Selected Markers" -msgstr "Trên Ký Hiệu Được Chọn" +msgstr "Tại các Dấu Mốc Đã Chọn" msgid "Between Min/Max Selected Markers" -msgstr "Giữa Ký Hiệu Cực Tiểu/Đại Được Chọn " +msgstr "Giữa Dấu Mốc Tối Thiểu/Tối Đa đã Chọn" msgctxt "Operator" msgid "Lasso Select" -msgstr "Chọn Bằng Dây Trói" +msgstr "Lựa Chọn bằng Dây Thòng Lọng" msgid "Select keyframe points using lasso selection" -msgstr "Chọn điểm bức ảnh mẫu bằng dây trói" +msgstr "Chọn các điểm khung khóa dùng lựa chọn dây thòng lọng" msgctxt "Operator" @@ -46261,37 +50216,37 @@ msgstr "Chọn Trái/Phải" msgid "Select keyframes to the left or the right of the current frame" -msgstr "Chọn bức ảnh mẫu phía trái hay phải của bức ảnh hiện tại" +msgstr "Chọn các khung khóa về bên trái, hay về bên phải, của khung hình hiện tại" msgid "Check if Select Left or Right" -msgstr "Kiểm Tra nếu Chọn Phía Trái Hay Phải" +msgstr "Kiểm Tra xem Chọn Trái hay Phải" msgid "Before Current Frame" -msgstr "Trước Bức Ảnh Hiện Tại" +msgstr "Trước khung hình hiện tại" msgid "After Current Frame" -msgstr "Sau Bức Ảnh Hiện Tại" +msgstr "Sau Khung Hình Hiện Tại" msgctxt "Operator" msgid "Select Less" -msgstr "Giảm Chọn" +msgstr "Thu Nhỏ vùng Lựa Chọn" msgid "Deselect keyframes on ends of selection islands" -msgstr "Thả mẫu ảnh đầu và cuối của đảo chọn" +msgstr "Hủy chọn các khung khóa ở mép vùng lựa chọn" msgctxt "Operator" msgid "Select Linked" -msgstr "Chọn Đươc Liên Kết" +msgstr "Chọn cái Kết Nối" msgid "Select keyframes occurring in the same F-Curves as selected ones" -msgstr "Chọn các bức ảnh mẫu trên cùng Cong-F giống các bức ảnh được chọn" +msgstr "Chọn các khung khóa nằm cùng trên Đường Cong-F với những cái đã chọn" msgctxt "Operator" @@ -46300,182 +50255,199 @@ msgstr "Chọn Thêm" msgid "Select keyframes beside already selected ones" -msgstr "Chọn bức ảnh mẫu thêm với các bức ảnh mẫu đã chọn rồi" +msgstr "Chọn các khung khóa mới, bên cạnh những cái đã được chọn" msgctxt "Operator" msgid "Snap Keys" -msgstr "Hút Dính Bức Ảnh Mẫu" +msgstr "Bám Dính Khung Khóa" msgid "Snap selected keyframes to the times specified" -msgstr "Hút dính bức ảnh mẫu đến các thời gian được xác định" +msgstr "Bám dính các khung khóa được chọn vào các điểm thời gian chỉ định" msgid "Selection to Current Frame" -msgstr "Sự Lựa Chọn đến Bức Ảnh Hiện Tại" +msgstr "Lựa Chọn tới Khung Hình Hiện Tại" msgid "Snap selected keyframes to the current frame" -msgstr "Hút dính bức ảnh mẫu được chọn đến bức ảnh hiện tại" +msgstr "Bám dính các khung khóa được chọn vào khung hình hiện tại" msgid "Selection to Nearest Frame" -msgstr "Sự Lựa Chọn đến Bức Ảnh Gần Nhất" +msgstr "Cái Lựa Chọn đến Khung Hình Gần Nhất" msgid "Snap selected keyframes to the nearest (whole) frame (use to fix accidental subframe offsets)" -msgstr "Hút dính bức ảnh mẫu được chọn đến bức ảnh (nguyên) gần nhất (dùng để sửa địch đến hạ bức ảnh không cố ý)" +msgstr "Bám dính các khung khóa được chọn vào khung hình gần nhất (toàn bộ) (dùng để sửa sự dịch chuyển vô tình của phân-khung-hình" msgid "Selection to Nearest Second" -msgstr "Sự Lực Chọn đến Giây Gần Nhất" +msgstr "Lựa Chọn tới Giây Đồng Hồ Gần Nhất" msgid "Snap selected keyframes to the nearest second" -msgstr "Hút dính số bức ảnh mẫu được chọn đến giây gần nhất" +msgstr "Bám dính khung khóa được chọn vào giây đồng hồ gần nhất" msgid "Selection to Nearest Marker" -msgstr "Sự Lựa Chọn đến Ký Hiệu Gần Nhất" +msgstr "Cái Lựa Chọn đến Dấu Mốc Gần Nhất" msgid "Snap selected keyframes to the nearest marker" -msgstr "Hút dính số bức ảnh mẫu được chọn đến ký hiệu gần nhất" +msgstr "Bám dính khung khóa được chọn vào dấu gần nhất" msgctxt "Operator" msgid "Stash Action" -msgstr "Cất Chứa Hành Động" +msgstr "Cất Giấu Hành Động" msgid "Store this action in the NLA stack as a non-contributing strip for later use" -msgstr "Giữ hành động này trong NLA cho làm một đoạn không góp phần để sử dụng thời sau" +msgstr "Lưu giữ hành động này trong ngăn xếp NLA, như một dải không đóng góp, để sử dụng sau này" msgid "Create New Action" -msgstr "Tạo Hành Động Mới" +msgstr "Kiến Tạo Hành Động Mới" msgid "Create a new action once the existing one has been safely stored" -msgstr "Tạo nên một hành động mới sau hành động tồn tại đã cất giấu an toàn rồi" +msgstr "Kiến Tạo nên một hành động mới, một khi cái hiện tồn tại đã được lưu giữ an toàn" msgid "Store this action in the NLA stack as a non-contributing strip for later use, and create a new action" -msgstr "Cất giấu hành động này trong xếp đống NLA làm đoạn không góp phần để sử dụng thời sau, và tạo nên một hành động mới" +msgstr "Lưu giữ hành động này trong ngăn xếp NLA, như một dải không đóng góp, để sử dụng sau này, và kiến tạo một hành động mới" msgctxt "Operator" msgid "Unlink Action" -msgstr "Cắt Liên Kết Hành Động" +msgstr "Ngắt Kết Nối Hành Động" msgid "Unlink this action from the active action slot (and/or exit Tweak Mode)" -msgstr "Cắt liên kết hành động này từ khe hành động hoạt động (và/hay thoát Chế Độ Chỉnh Sửa)" +msgstr "Ngắt kết nối hành động này khỏi khe hành động đang hoạt động (và/hoặc thoát Chế Độ Hiệu Chỉnhh)" msgid "Force Delete" -msgstr "Xóa Lực" +msgstr "Bắt Buộc Xóa" msgid "Clear Fake User and remove copy stashed in this data-block's NLA stack" -msgstr "Xóa Người Dùng Giả và xóa bản sao được cất chứa trong xếp dống NLA của cục dữ liệu này" +msgstr "Xóa Người Dùng Giả và loại bỏ bản sao cất giấu trong ngăn xếp NLA của khối dữ liệu này" msgctxt "Operator" msgid "Frame All" -msgstr "Hết Bức Ảnh" +msgstr "Toàn Bộ Khung Hình" msgid "Reset viewable area to show full keyframe range" -msgstr "Đặt lại khu vực hiển thị để hiện toàn phạm vi bức ảnh mẫu" +msgstr "Hoàn lại khu vực nhìn thấy được để hiển thị toàn bộ phạm vi khung khóa" msgctxt "Operator" msgid "Go to Current Frame" -msgstr "Đến Bức Ảnh Hiện Tại" +msgstr "Đi Đến Khung Hình Hiện Tại" msgid "Move the view to the current frame" -msgstr "Di chuyển màn đến bức ảnh hiện tại" +msgstr "Di chuyển góc nhìn đến khung hình hiện tại" msgctxt "Operator" msgid "Frame Selected" -msgstr "Bức Ảnh Được Chọn" +msgstr "Đóng Khung cái được Chọn" msgid "Reset viewable area to show selected keyframes range" -msgstr "Đặt lại khu vực hiển thị để hiện phạm vi bức ảnh mẫu được chọn" +msgstr "Hoàn lại khu vực nhìn thấy được để hiển thị phạm vi các khung khóa đã chọn" msgctxt "Operator" msgid "Change Frame" -msgstr "Đổi Bức Ảnh" +msgstr "Đổi Khung Hình" msgid "Interactively change the current frame number" -msgstr "Kiểu tương tác đổi số bức ảnh hiện tại" +msgstr "Đổi số khung hình hiện tại một cách tương tác" msgctxt "Operator" msgid "Select Channel Keyframes" -msgstr "Chọn Bức Ảnh Mẫu Kênh" +msgstr "Chọn các Khung Khóa của Kênh" msgid "Select all keyframes of channel under mouse" -msgstr "Chọn hết bức ảnh mẫu của kênh ở dưới con trỏ chuột" +msgstr "Chọn toàn bộ các khung khóa của kênh nằm dưới chuột" msgid "Extend selection" -msgstr "Mở rộng sự lựa chọn" +msgstr "Nới rộng lựa chọn" + + +msgctxt "Operator" +msgid "Frame Channel Under Cursor" +msgstr "Kênh của Khung Hình Nằm Dưới Con Trỏ" + + +msgid "Reset viewable area to show the channel under the cursor" +msgstr "Hoàn lại khu vực quan sát để hiển thị kênh nằm dưới con trỏ" msgid "Include Handles" -msgstr "Gồm Tay Cầm" +msgstr "Bao Gồm các Tay Cầm" msgid "Include handles of keyframes when calculating extents" -msgstr "Gồm tay cầm của bức ảnh mẫu khi tính phạm vi" +msgstr "Bao gồm các tay cầm của khung khóa khi tính toán phạm vi" + + +msgid "Ignore frames outside of the preview range" +msgstr "Bỏ qua các khung hình bên ngoài phạm vi xem trước" msgctxt "Operator" msgid "Remove Empty Animation Data" -msgstr "Xóa Dữ Liệu Hoạt Hình Trống Rỗng" +msgstr "Xóa Dữ Liệu Hoạt Họa Trống" msgid "Delete all empty animation data containers from visible data-blocks" -msgstr "Xóa hết đồ đựng dữ liệu hoạt hình trống rỗng từ cục dữ liệu hiển thị" +msgstr "Xóa toàn bộ các vỏ chứa dữ liệu hoạt họa trống rỗng khỏi khối dữ liệu nhìn thấy được" msgctxt "Operator" msgid "Mouse Click on Channels" -msgstr "Bấm Chuột Trên Kênh" +msgstr "Bấm Chuột trên các Kênh" msgid "Handle mouse clicks over animation channels" -msgstr "Xử lý bấm chuột trên các kênh hoạt hình" +msgstr "Xử lý những bấm chuột trên các kênh hoạt họa" msgid "Select Children Only" -msgstr "Chỉ Chọn Con Cái" +msgstr "Duy Chọn Con Cái" msgid "Extend Range" msgstr "Mở Rộng Phạm Vi" +msgid "Selection of active channel to clicked channel" +msgstr "Mở rộng vùng chọn kênh đang hoạt động tới kênh đã được nhấp chuột vào" + + msgctxt "Operator" msgid "Collapse Channels" -msgstr "Tóp Kênh" +msgstr "Thu các Kênh Lại" msgid "Collapse (close) all selected expandable animation channels" -msgstr "Tóp (tức là đóng) hết kênh hoạt hình được chọn có thể mở rộng" +msgstr "Thu (đóng) toàn bộ các kênh hoạt họa có thể mở rộng đã chọn lại" msgid "Collapse all channels (not just selected ones)" -msgstr "Tóp hết kênh (không phải chỉ các kênh được chọn)" +msgstr "Thu toàn bộ các kênh lại (không chỉ những cái được chọn mà thôi)" msgctxt "Operator" @@ -46484,16 +50456,16 @@ msgstr "Xóa Kênh" msgid "Delete all selected animation channels" -msgstr "Xóa hết kênh hoạt hình được chọn" +msgstr "Xóa toàn bộ các kênh hoạt họa đã chọn" msgctxt "Operator" msgid "Toggle Channel Editability" -msgstr "Bật/Tắt Có Thể Biên Tập Kênh" +msgstr "Bật/Tắt Khả Năng Biên Soạn của Kênh" msgid "Toggle editability of selected channels" -msgstr "Bật/tắt có thể biên tập của các kênh đã chọn" +msgstr "Bật/Tắt khả năng biên soạn của các kênh đã chọn" msgid "Enable" @@ -46506,42 +50478,46 @@ msgstr "Mở Rộng Kênh" msgid "Expand (open) all selected expandable animation channels" -msgstr "Mở rộng hết kênh hoạt hình được chọn có thể mở rộng" +msgstr "Mở rộng (mở) toàn bộ các kênh hoạt họa có thể mở rộng đã chọn" msgid "Expand all channels (not just selected ones)" -msgstr "Mở rộng hết kênh (không phải chỉ các kênh được chọn)" +msgstr "Mở rộng toàn bộ các kênh (không chỉ những cái được chọn mà thôi)" msgctxt "Operator" msgid "Revive Disabled F-Curves" -msgstr "Hồi Phục Cong-F Bị Tắt" +msgstr "Hồi Phục Đường Cong-F đã Tắt" + + +msgid "Clear 'disabled' tag from all F-Curves to get broken F-Curves working again" +msgstr "Xóa thẻ 'tắt' (vô hiệu hóa) khỏi toàn bộ các Đường Cong-F để các Đường Cong-F bị hỏng hoạt động trở lại" msgctxt "Operator" msgid "Group Channels" -msgstr "Nhóm Lại Kênh" +msgstr "Nhóm Kênh" msgid "Add selected F-Curves to a new group" -msgstr "Thêm các Cong-F được chọn vào một nhóm mới" +msgstr "Thêm các Đường Cong-F được chọn vào một nhóm mới" msgid "Name of newly created group" -msgstr "Tên của nhóm mới được chế tạo" +msgstr "Tên của nhóm mới kiến tạo nên" msgctxt "Operator" msgid "Move Channels" -msgstr "Di Chuyên Kênh" +msgstr "Di Chuyển Kênh" msgid "Rearrange selected animation channels" -msgstr "Sắp xếp lại các kênh hoạt hình được chọn" +msgstr "Bố trí lại các kênh hoạt họa được chọn" msgid "To Top" -msgstr "Đến Trên Cùng" +msgstr "Lên Đỉnh" msgid "Down" @@ -46549,7 +50525,7 @@ msgstr "Xuống" msgid "To Bottom" -msgstr "Đến Dưới Cùng" +msgstr "Xuống Đáy" msgctxt "Operator" @@ -46558,94 +50534,103 @@ msgstr "Đổi Tên Kênh" msgid "Rename animation channel under mouse" -msgstr "Đổi tên kênh hoạt hình ở dưới chuột" +msgstr "Đổi tên kênh hoạt họa nằm dưới chuột" msgid "Toggle selection of all animation channels" -msgstr "Bật/tắt sự lựa chọn hết kênh hoạt hình" +msgstr "Bật/tắt lựa chọn của toàn bộ các kênh hoạt họa" msgid "Select all animation channels within the specified region" -msgstr "Chọn hết kênh hoạt hình trong phạm vi được xác định" +msgstr "Chọn toàn bộ các kênh hoạt họa nằm trong phạm vi chỉ định" msgid "Deselect rather than select items" -msgstr "Thả thay thế chọn mặt hàng" +msgstr "Hủy lựa chọn, thay vì chọn các phần tử" msgid "Extend selection instead of deselecting everything first" -msgstr "Kéo dài sự lựa chọn thay thế thả tất cả được chọn trước" +msgstr "Nới rộng vùng lựa chọn, thay vì trước nhất hủy các lựa chọn" msgctxt "Operator" msgid "Filter Channels" -msgstr "Lọc Kênh" +msgstr "Thanh Lọc Kênh" msgid "Start entering text which filters the set of channels shown to only include those with matching names" -msgstr "Bắt đầu gõ ký tự và lọc tập kênh chỉ hiện các kênh đồng tên" +msgstr "Khởi công nhập văn bản thanh lọc tập hợp các kênh được hiển thị, để chỉ cho hiện những kênh có tên khớp với mẫu thanh lọc mà thôi" msgctxt "Operator" msgid "Disable Channel Setting" -msgstr "Tắt Cài Đặt Kênh" +msgstr "Tắt Sắp Đặt về Kênh" msgid "Disable specified setting on all selected animation channels" -msgstr "Tắt cài đặt được xác định của hết kênh hoạt hình được chọn" +msgstr "Tắt sắp đặt chỉ định trên toàn bộ các kênh hoạt họa được chọn" msgctxt "Operator" msgid "Enable Channel Setting" -msgstr "Bật Cài Đặt Hoạt Hình" +msgstr "Bật Sắp Đặt về Kênh" msgid "Enable specified setting on all selected animation channels" -msgstr "Bật cài đặt được xác định của hết kênh hoạt hình được chọn" +msgstr "Bật sắp đặt chỉ định trên toàn bộ các kênh hoạt họa được chọn" msgctxt "Operator" msgid "Toggle Channel Setting" -msgstr "Bật/Tắt Cài Đặt Kênh" +msgstr "Bật/Tắt Sắp Đặt về Kênh" msgid "Toggle specified setting on all selected animation channels" -msgstr "Bật/tắt cài đặt được xác định của hết kênh hoạt hình được chọn" +msgstr "Bật/Tắt sắp đặt chỉ định trên toàn bộ các kênh hoạt họa được chọn" msgctxt "Operator" msgid "Ungroup Channels" -msgstr "Rã Nhóm Kênh" +msgstr "Tháo Nhóm Kênh" msgid "Remove selected F-Curves from their current groups" -msgstr "Xóa Cong-F được xác định từ nhóm hiện tại của chúng nó" +msgstr "Xóa các Đường Cong-F đã chọn khỏi những nhóm hiện tại của chúng" + + +msgctxt "Operator" +msgid "Frame Selected Channels" +msgstr "Đóng Khung các Kênh đã Chọn" + + +msgid "Reset viewable area to show the selected channels" +msgstr "Hoàn lại khu vực quan sát được để hiển thị các kênh đã chọn" msgctxt "Operator" msgid "Clear Useless Actions" -msgstr "Xóa Hành Động Vô Dụng" +msgstr "Xóa các Hành Động Vô Dụng" msgid "Mark actions with no F-Curves for deletion after save and reload of file preserving \"action libraries\"" -msgstr "Ký dấu xóa cho hết hành động không có Cong-F sau được lưu vào nhập lại tập tin giữ nguyên \"thư viện hành động\"" +msgstr "Đánh dấu các hành động không có Đường Cong-F để xóa chúng đi, sau khi đã lưu & nạp lại tập tin, song bảo tồn \"các thư viện hành động\"" msgid "Only Unused" -msgstr "Chỉ Không Dùng" +msgstr "Duy cái Chưa Sử Dụng" msgid "Only unused (Fake User only) actions get considered" -msgstr "Chỉ hành động không dùng được quan tâm (Người Dùng Giả Bộ)" +msgstr "Chỉ những hành động chưa sử dụng đến (duy Người Dùng Giả mà thôi) là được cân nhắc đến" msgctxt "Operator" msgid "Copy Driver" -msgstr "Chép Điều Vận" +msgstr "Sao Chép Điều Vận" msgid "Copy the driver for the highlighted button" -msgstr "Chép điều vận cho nút được tô sáng" +msgstr "Sao chép điều vận cho nút bấm đang nêu bật" msgctxt "Operator" @@ -46654,196 +50639,232 @@ msgstr "Thêm Điều Vận" msgid "Add driver for the property under the cursor" -msgstr "Thêm điều vận cho đặc tính ờ dưới con trỏ" +msgstr "Thêm điều vận cho tính chất nằm dưới con trỏ" msgctxt "Operator" msgid "Edit Driver" -msgstr "Biên Tập Điều Vận" +msgstr "Biên Soạn Điều Vận" + + +msgid "Edit the drivers for the connected property represented by the highlighted button" +msgstr "Biên soạn các trình điều vận cho tính chất kết nối biểu thị bằng nút nêu bật" msgctxt "Operator" msgid "Remove Driver" -msgstr "Xoá Điều Vận" +msgstr "Xóa Điều Vận" + + +msgid "Remove the driver(s) for the connected property(s) represented by the highlighted button" +msgstr "Xóa (các) trình điều vận cho (các) thuộc tính kết nối biểu thị bằng nút nêu bật" msgid "Delete drivers for all elements of the array" -msgstr "Xóa điều vận cho tất cả phần tử trong mảng" +msgstr "Xóa điều vận cho toàn bộ các phần tử trong mảng" msgctxt "Operator" msgid "Set End Frame" -msgstr "Đặt Bức Ảnh Cuối" +msgstr "Đặt Khung Hình Cuối" msgid "Set the current frame as the preview or scene end frame" -msgstr "Đặt bứa ảnh hiện tại làm bức ảnh dự khán hay kết thúc cảnh" +msgstr "Đặt khung hình hiện tại như khung hình cuối của cảnh hoặc xem trước" msgctxt "Operator" msgid "Clear Keyframe (Buttons)" -msgstr "Xóa Bức Ảnh Mẫu (Nút)" +msgstr "Xóa Khung Khóa (Nút Bấm)" msgid "Clear all keyframes on the currently active property" -msgstr "Xóa hết bức ảnh mẫu của đặc tính hoạt động hiện tại" +msgstr "Xóa toàn bộ các khung khóa của tính chất hiện tại đang hoạt động" msgid "Clear keyframes from all elements of the array" -msgstr "Xóa bức ảnh mẫu từ tất cả phần tử trong mảng" +msgstr "Xóa các khung khóa khỏi những phần tử trong mảng" msgctxt "Operator" msgid "Remove Animation" -msgstr "Xóa Hoạt Hình" +msgstr "Xóa Hoạt Họa" msgid "Remove all keyframe animation for selected objects" -msgstr "Xóa tất cả hoạt hình bức ảnh mẫu cho vật thể được chọn" +msgstr "Xóa toàn bộ các khung khóa hoạt họa cho những đối tượng được chọn" msgctxt "Operator" msgid "Delete Keying-Set Keyframe" -msgstr "Xóa Bức Ảnh Mẫu Trong Tập Bức Ảnh Mẫu" +msgstr "Xóa Khung Khóa của Bộ Khóa" msgid "Delete keyframes on the current frame for all properties in the specified Keying Set" -msgstr "Xóa bức ảnh mẫu trong bức ảnh hiện tại cho tất cả đặc tính trong Tập Mẫu Dạng được xác định" +msgstr "Xóa các khung khóa ở khung hình hiện tại cho toàn bộ các tính chất trong Bộ Khóa chỉ định" msgid "The Keying Set to use" -msgstr "Dùng Tập Bức Ảnh Mẫu Nào" +msgstr "Bộ Khóa để sử dụng" msgctxt "Operator" msgid "Delete Keyframe (Buttons)" -msgstr "Xóa Bức Ảnh Mẫu (Nút)" +msgstr "Xóa Khung Khóa (Nút Bấm)" msgid "Delete current keyframe of current UI-active property" -msgstr "Xóa bức ảnh mẫu hiện tại của đặc tính giao diện hoạt động hiện tại" +msgstr "Xóa khung khóa hiện tại của tính Chất Giao Diện Người Dùng đang hoạt động hiện tại" msgid "Delete keyframes from all elements of the array" -msgstr "Xóa hết bức ảnh mẫu từ tất cả phần tử trong mảng" +msgstr "Xóa các khung khóa khỏi toàn bộ các phần tử trong mảng" msgctxt "Operator" msgid "Delete Keying-Set Keyframe (by name)" -msgstr "Xóa Bức Ảnh Mẫu Trong Tập Bức Ảnh Mẫu (bằng tên)" +msgstr "Xóa Khung Khóa của Bộ Khóa (theo tên)" msgid "Alternate access to 'Delete Keyframe' for keymaps to use" -msgstr "Cách thay phiên cho đến 'Xóa Bức Ảnh Mẫu' cho các bản đồ phím để dùng" +msgstr "Phương pháp khác để truy cập thao tác 'Xóa Khung Khóa', dành cho các cấu hình phím sử dụng" msgctxt "Operator" msgid "Delete Keyframe" -msgstr "Xóa Bức Ảnh Mẫu" +msgstr "Xóa Khung Khóa" msgid "Remove keyframes on current frame for selected objects and bones" -msgstr "Xóa bức ảnh mẫu trong bức ảnh hiện tại cho vật thể và xương được chọn" +msgstr "Xóa các khung khóa ở khung hình hiện tại cho các đối tượng và xương được chọn" msgctxt "Operator" msgid "Insert Keyframe" -msgstr "Chèn Bức Ảnh Mẫu" +msgstr "Chèn Thêm Khung Khóa" msgctxt "Operator" msgid "Insert Keyframe (Buttons)" -msgstr "Chèn Bức Ảnh Mẫu (Nút)" +msgstr "Chèn Thêm Khung Khóa (Nút Bấm)" msgid "Insert a keyframe for current UI-active property" -msgstr "Chèn một bức ảnh mẫu cho đặc tính giao diện hoạt động hiện tại" +msgstr "Chèn thêm một khung khóa cho tính chất Giao Diện Người Dùng hiện tại đang hoạt động" msgid "Insert a keyframe for all element of the array" -msgstr "Chèn một bức ảnh mẫu cho tất cả phần tử trong mảng" +msgstr "Chèn thêm một khung khóa cho toàn bộ các phần tử trong mảng" msgctxt "Operator" msgid "Insert Keyframe (by name)" -msgstr "Chèn Bức Ảnh Mẫu (bằng tên)" +msgstr "Chèn Khung Khóa (bằng tên)" msgid "Alternate access to 'Insert Keyframe' for keymaps to use" -msgstr "Cách thay phiên cho đến 'Chèn Bức Ảnh Mẫu' cho các bản đồ phím để dùng" +msgstr "Phương pháp khác để truy cập thao tác 'Chèn Khung Khóa', dành cho các cấu hình phím sử dụng" msgctxt "Operator" msgid "Insert Keyframe Menu" -msgstr "Chèn Danh Bạ Bức Ảnh Mẫu" +msgstr "Chèn Thêm Trình Đơn Khung Khóa" msgid "Insert Keyframes for specified Keying Set, with menu of available Keying Sets if undefined" -msgstr "Chèn Bức Ảnh Mẫu cho Tập Hợp Bức Ảnh Mẫu được xác định, với danh bạ có Tập Hợp Bức Ảnh Mẫu đang có thể dùng nếu chưa được xác định" +msgstr "Chèn thêm Khung Khóa vào Bộ Khóa chỉ định, với trình đơn liệt kê các Bộ Khóa có thể sử dụng, nếu không xác định" msgid "Always Show Menu" -msgstr "Lần Nào Hiện Danh Bạ" +msgstr "Luôn Luôn Hiển Thị Trình Đơn" msgctxt "Operator" msgid "Set Active Keying Set" -msgstr "Đặt Tập Mẫu Dạng Hoạt Động" +msgstr "Đặt Bộ Khóa đang Hoạt Động" + + +msgid "Set a new active keying set" +msgstr "Đặt bộ khóa hoạt động mới" msgctxt "Operator" msgid "Add Empty Keying Set" -msgstr "Thêm Tập Bứa Ảnh Mẫu Trống Rỗng" +msgstr "Thêm Bộ Khóa Trống" + + +msgid "Add a new (empty) keying set to the active Scene" +msgstr "Thêm bộ khóa mới (trống rỗng) vào Cảnh đang hoạt động" msgctxt "Operator" msgid "Export Keying Set..." -msgstr "Xuất Tập Hợp Bức Ảnh Mẫu..." +msgstr "Xuất Khẩu Bộ Khóa..." + + +msgid "Export Keying Set to a Python script" +msgstr "Xuất khẩu Bộ Khóa ra một tập lệnh Python" msgid "Filter folders" -msgstr "Lọc hồ sơ" +msgstr "Thanh lọc các danh mục" + + +msgid "Filter Python" +msgstr "Thanh Lọc Python" msgid "Filter text" -msgstr "Lọc văn bản" +msgstr "Thanh lọc văn bản" msgctxt "Operator" msgid "Add Empty Keying Set Path" -msgstr "Thêm Đường Trống Rỗng Vào Tập Bức Ảnh Mẫu" +msgstr "Thêm Đường Dẫn Trống vào Bộ Khóa" + + +msgid "Add empty path to active keying set" +msgstr "Thêm đường dẫn trống vào bộ khóa đang hoạt động" msgctxt "Operator" msgid "Remove Active Keying Set Path" -msgstr "Xóa Đường Dẫn Hoạt Động Của Tập Bức Ảnh Mẫu" +msgstr "Xóa Đường Dẫn của Bộ Khóa đang Hoạt Động" + + +msgid "Remove active Path from active keying set" +msgstr "Xóa Đường Dẫn đang hoạt động khỏi bộ khóa hoạt động" msgctxt "Operator" msgid "Remove Active Keying Set" -msgstr "Xóa Tâp Bức Ảnh Mẫu Hoạt Động" +msgstr "Xóa Bộ Khóa đang Hoạt Động" + + +msgid "Remove the active keying set" +msgstr "Xóa bộ khóa đang hoạt động" msgctxt "Operator" msgid "Add to Keying Set" -msgstr "Thêm Vào Tập Bức Ảnh Mẫu" +msgstr "Thêm vào Bộ Khóa" msgid "Add current UI-active property to current keying set" -msgstr "Thêm đặc tính giao diện hoạt động vào tập bức ảnh mẫu hiện tại" +msgstr "Thêm tính chất giao diện hiện tại đang hoạt động vào Bộ Khóa hiện thời" msgid "Add all elements of the array to a Keying Set" -msgstr "Thêm hết phần tử trong mảng vào một Tập Bức Ảnh Mẫu" +msgstr "Thêm toàn bộ các phần tử của mảng vào một Bộ Khóa" msgctxt "Operator" msgid "Remove from Keying Set" -msgstr "Xóa Từ Tập Bức Ảnh Mẫu" +msgstr "Xóa khỏi Bộ Khóa" msgid "Remove current UI-active property from current keying set" -msgstr "Xóa đặc tính giao diện hoạt động hiện tại từ tập bức ảnh mẫu hiện tại" +msgstr "Xóa tính chất Giao Diện Người Dùng hiện tại đang hoạt động từ Bộ Khóa hiện thời" msgctxt "Operator" @@ -46851,70 +50872,95 @@ msgid "Paste Driver" msgstr "Dán Điều Vận" +msgid "Paste the driver in the internal clipboard to the highlighted button" +msgstr "Dán trình điều khiển vào bảng nhớ tạm nội bộ vào nút được nêu bật" + + msgctxt "Operator" msgid "Clear Preview Range" -msgstr "Xóa Phạm Vi Dự Khán" +msgstr "Xóa Phạm Vi Xem Trước" msgid "Clear preview range" -msgstr "Xóa phạm vi dự khán" +msgstr "Xóa phạm vi xem trước" msgctxt "Operator" msgid "Set Preview Range" -msgstr "Đặt Phạm Vi Dự Khán" +msgstr "Đặt Phạm Vi Xem Trước" msgid "Interactively define frame range used for playback" -msgstr "Chỉ định tương tác phạm vi dùng cho hát lại" +msgstr "Xác định phạm vi khung hình sử dụng để chơi lại một cách tương tác" msgctxt "Operator" msgid "Set Start Frame" -msgstr "Đặt Bức Ảnh Bắu Đầu" +msgstr "Đặt Khung Hình Đầu" msgid "Set the current frame as the preview or scene start frame" -msgstr "Đặt bức ảnh hiện tại là bức ảnh dự khán hay bức ảnh cảnh bắt đầu" +msgstr "Đặt khung hình hiện tại làm khung hình bắt đầu của cảnh hoặc của xem trước" msgctxt "Operator" msgid "Update Animated Transform Constraints" -msgstr "Nâng Cấp Ràng Buộc Biến Hóa Hoạt Hình" +msgstr "Cập Nhật các Ràng Buộc Biến Hóa Hoạt Họa" msgid "Update f-curves/drivers affecting Transform constraints (use it with files from 2.70 and earlier)" -msgstr "Nâng cấp Cong F/điều vận đang ảnh hưởng ràng buộc Biến Đổi (dùng nó với tập tin phiên bản 2.70 và trước)" +msgstr "Cập nhật các Đường Cong-F/Điều Vận tác động đến những ràng buộc Biến Hóa (sử dụng nó với các tập tin từ phiên bản 2.70 và sớm hơn)" msgid "Convert to Radians" -msgstr "Biến Đổi sang Rađian" +msgstr "Đổi Sang Rad" msgid "" "Convert f-curves/drivers affecting rotations to radians.\n" "Warning: Use this only once" msgstr "" -"Biến đổi cong f/điều vận đang ảnh hưởng xoay sang rađian.\n" -"Cảnh Cáo: chi áp dụng cái này một lần" +"Chuyển đổi các đường cong-F/các điều vận tác động đến xoay chiều, đổi góc độ xoay chiều sang thành radian.\n" +"Cảnh báo: Chỉ sử dụng một lần mà thôi" msgctxt "Operator" msgid "Align Bones" -msgstr "Sắp Xếp Xương" +msgstr "Căn Chỉnh Xương" msgid "Align selected bones to the active bone (or to their parent)" -msgstr "Sắp xếp xương được chọn với xương hoạt động (hay phụ huynh của chúng nó)" +msgstr "Căn chỉnh các xương được chọn theo xương đang hoạt động (hoặc phụ huynh của chúng nó)" + + +msgctxt "Operator" +msgid "Assign to Collection" +msgstr "Ấn Định vào Bộ Sưu Tập" + + +msgid "Assign bones to a collection" +msgstr "Ấn định xương vào một bộ sưu tập" + + +msgid "The bone collection to move the selected bones to" +msgstr "Bộ sưu tập xương để di chuyển các xương đã chọn vào" + + +msgid "Name of the newly added bone collection" +msgstr "Tên bộ sưu tập xương mới được thêm vào" msgctxt "Operator" msgid "Auto-Name by Axis" -msgstr "Tự Động Đặt Tên tùy Trục" +msgstr "Tự Động Đặt Tên theo Trục" msgid "Automatically renames the selected bones according to which side of the target axis they fall on" -msgstr "Tự động đặt đổi tên của xương được chọn tùy nó nằm bên nào của trục mục tiêu" +msgstr "Tự động đổi tên các xương được chọn, tùy bên của trục mục tiêu" + + +msgid "Axis to tag names with" +msgstr "Trục để gắn thẻ tên vào" msgid "X-Axis" @@ -46934,7 +50980,7 @@ msgstr "Trước/Sau" msgid "Top/Bottom" -msgstr "Trên/Dưới" +msgstr "Đỉnh/Đáy" msgctxt "Operator" @@ -46943,40 +50989,40 @@ msgstr "Thêm Xương" msgid "Add a new bone located at the 3D cursor" -msgstr "Thêm một xương tại vị trí của con trỏ 3D" +msgstr "Thêm một xương mới tại vị trí của con trỏ 3D" msgid "Name of the newly created bone" -msgstr "Tên của xương mới chế tạo" +msgstr "Tên của xương mới kiến tạo" msgctxt "Operator" msgid "Recalculate Roll" -msgstr "Tính Lại Lăn" +msgstr "Tính Lại Độ Lăn" msgid "Automatically fix alignment of select bones' axes" -msgstr "Tự động chỉnh sửa sắp xếp trục của xương được chọn" +msgstr "Tự động chỉnh sửa sự căn chỉnh trục của xương được chọn" msgid "Negate the alignment axis" -msgstr "Âm hóa trục sắp xếp" +msgstr "Đảo lật trục căn chỉnh" msgid "Shortest Rotation" -msgstr "Xoay Ngắn Nhất" +msgstr "Xoay Chiều Ngắn Nhất" msgid "Ignore the axis direction, use the shortest rotation to align" -msgstr "Không quan tâm hướng của trục, dùng xoay nắng nhất để sắp xếp" +msgstr "Không quan tâm đến chiều hướng của trục, dùng sự xoay chiều ngắn nhất để căn chỉnh" msgid "Local +X Tangent" -msgstr "Tiếp Tuyến +X Địa Phương" +msgstr "Tiếp Tuyến +X Cục Bộ" msgid "Local +Z Tangent" -msgstr "Tiếp Tuyến +Z Địa Phương" +msgstr "Tiếp Tuyến +Z Cục Bộ" msgid "Global +X Axis" @@ -46992,11 +51038,11 @@ msgstr "Trục +Z Toàn Cầu" msgid "Local -X Tangent" -msgstr "Tiếp Tuyến -X Địa Phương" +msgstr "Tiếp Tuyến -X Cục Bộ" msgid "Local -Z Tangent" -msgstr "Tiếp Tuyến -Z Địa Phương" +msgstr "Tiếp Tuyến -Z Cục Bộ" msgid "Global -X Axis" @@ -47012,68 +51058,185 @@ msgstr "Trục -Z Toàn Cầu" msgid "View Axis" -msgstr "Trục Màn Chiếu" +msgstr "Trục của Góc Nhìn" msgctxt "Operator" msgid "Extrude to Cursor" -msgstr "Kéo Ra đến Con Trỏ" +msgstr "Đẩy Trồi tới Con Trỏ" msgid "Create a new bone going from the last selected joint to the mouse position" -msgstr "Chế tạo một xương từ khớp được chọn cuối đến vị trí chuột" +msgstr "Kiến Tạo xương mới, kéo dài từ khớp nối chọn sau cùng đến vị trí của chuột" + + +msgctxt "Operator" +msgid "Add Bone Collection" +msgstr "Thêm Bộ Sưu Tập Xương" + + +msgid "Add a new bone collection" +msgstr "Thêm một bộ sưu tập xương mới" + + +msgctxt "Operator" +msgid "Add Selected Bones to Collection" +msgstr "Thêm Xương Đã Chọn vào Bộ Sưu Tập" + + +msgid "Add selected bones to the chosen bone collection" +msgstr "Thêm xương đã chọn vào bộ sưu tập xương đã chọn" + + +msgid "Bone Collection" +msgstr "Bộ Sưu Tập Xương" + + +msgid "Name of the bone collection to assign this bone to; empty to assign to the active bone collection" +msgstr "Tên bộ sưu tập xương để ấn định xương này vào đó; để trống để ấn định vào bộ sưu tập xương đang hoạt động" + + +msgctxt "Operator" +msgid "Deselect Bone Collection" +msgstr "Hủy Chọn Bộ Sưu Tập Xương" + + +msgid "Deselect bones of active Bone Collection" +msgstr "Hủy chọn các xương của Bộ Sưu Tập Xương đang hoạt động" + + +msgctxt "Operator" +msgid "Move Bone Collection" +msgstr "Di Chuyển Bộ Sưu Tập Xương" + + +msgid "Change position of active Bone Collection in list of Bone collections" +msgstr "Thay đổi vị trí của Bộ Sưu Tập Xương đang hoạt động trong danh sách các Bộ Sưu Tập Xương" + + +msgid "Direction to move the active Bone Collection towards" +msgstr "Chiều hướng để di chuyển Bộ Sưu Tập Xương đang hoạt động về phía ấy" + + +msgctxt "Operator" +msgid "Remove Bone Collection" +msgstr "Xóa Bộ Sưu Tập Xương" + + +msgid "Remove the active bone collection" +msgstr "Xóa bộ sưu tập xương đang hoạt động" + + +msgctxt "Operator" +msgid "Select Bones of Bone Collection" +msgstr "Chọn các Xương của Bộ Sưu Tập Xương" + + +msgid "Select bones in active Bone Collection" +msgstr "Chọn các xương trong Bộ Sưu Tập Xương đang hoạt động" msgctxt "Operator" msgid "Show All" -msgstr "Hiện Hết" +msgstr "Hiển Thị Toàn Bộ" + + +msgid "Show all bone collections" +msgstr "Hiển thị tất cả các bộ sưu tập xương" + + +msgctxt "Operator" +msgid "Solo Visibility" +msgstr "Hiển Thị Một Mình" + + +msgid "Hide all other bone collections and show the active one" +msgstr "Ẩn giấu toàn bộ các bộ sưu tập xương khác và hiển thị bộ sưu tập đang hoạt động" + + +msgctxt "Operator" +msgid "Remove Selected from Bone collections" +msgstr "Xóa cái Đã Chọn khỏi bộ sưu tập Xương" + + +msgid "Remove selected bones from the active bone collection" +msgstr "Xóa xương đã chọn khỏi bộ sưu tập xương đang hoạt động" + + +msgid "Name of the bone collection to unassign this bone from; empty to unassign from the active bone collection" +msgstr "Tên của bộ sưu tập xương để tách xương này khỏi nó; để trống để tách xương đang hoạt động khỏi bộ sưu tập" + + +msgid "Unassign the bone from this bone collection" +msgstr "Tách xương ra khỏi bộ sưu tập xương này" + + +msgid "Name of the bone to unassign from the collection; empty to use the active bone" +msgstr "Tên của xương cần tách ra khỏi bộ sưu tập; để trống để sử dụng xương đang hoạt động" + + +msgctxt "Operator" +msgid "Copy Colors to Selected" +msgstr "Sao Chép Màu sang cái Đã Chọn" + + +msgid "Copy the bone color of the active bone to all selected bones" +msgstr "Sao chép màu xương của xương đang hoạt động sang tất cả các xương đã chọn" + + +msgid "Copy Bone colors from the active bone to all selected bones" +msgstr "Sao chép màu Xương từ xương đang hoạt động sang tất cả các xương đã chọn" msgid "Pose Bone" -msgstr "Xương Dạng Đứng" +msgstr "Xương Tư Thế" + + +msgid "Copy Pose Bone colors from the active pose bone to all selected pose bones" +msgstr "Sao chép màu Xương Tư Thế từ xương tư thế đang hoạt động sang tất cả các xương tư thế đã chọn" msgctxt "Operator" msgid "Delete Selected Bone(s)" -msgstr "Xóa Xương Được Chọn" +msgstr "Xóa Xương được Chọn" msgid "Remove selected bones from the armature" -msgstr "Xóa xương được chọn từ cốt" +msgstr "Xóa xương được chọn khỏi khung cốt" msgctxt "Operator" msgid "Dissolve Selected Bone(s)" -msgstr "Hòa Tan (Các) Xương Được Chọn" +msgstr "Tiêu Hủy các Xương được Chọn" msgid "Dissolve selected bones from the armature" -msgstr "Hòa tan các xương được chọn từ cốt" +msgstr "Tiêu Hủy xương được chọn từ khung cốt" msgctxt "Operator" msgid "Duplicate Selected Bone(s)" -msgstr "Nhân Đôi (Các) Xương Được Chọn" +msgstr "Nhân Đôi Xương được Chọn" msgid "Make copies of the selected bones within the same armature" -msgstr "Chép lại các xương được chọn trong cùng cốt" +msgstr "Tạo các bản sao của xương được chọn, nội trong cùng một khung cốt" msgid "Flip Names" -msgstr "Lật Tên" +msgstr "Đảo Tên" msgid "Try to flip names of the bones, if possible, instead of adding a number extension" -msgstr "Nếu có thể, thử lật tên của xương thay thế kèm một đưôi số" +msgstr "Thử đảo tên của các xương, nếu có thể, thay vì thêm một đuôi bằng con số" msgid "Make copies of the selected bones within the same armature and move them" -msgstr "Chép lại xương được chọn trong cùng cốt và di chuyển nó" +msgstr "Tạo các bản sao của những xương được chọn, nội trong cùng một khung cốt, và di chuyển chúng" msgid "Duplicate Selected Bone(s)" -msgstr "Sao Chép Xương Được Chọn" +msgstr "Nhân Đôi Xương được Chọn" msgid "Move" @@ -47081,81 +51244,85 @@ msgstr "Di Chuyển" msgid "Move selected items" -msgstr "Di chuyển mặt hàng được chọn" +msgstr "Di chuyển phần tử được chọn" msgctxt "Operator" msgid "Extrude" -msgstr "Kéo Ra" +msgstr "Đẩy Trồi" msgid "Create new bones from the selected joints" -msgstr "Chế tạo xương mới từ khớp thì được chọn" +msgstr "Kiến Tạo các xương mới từ những khớp nối được chọn" msgid "Forked" -msgstr "Chia Ngả" +msgstr "Phân Nhánh" msgctxt "Operator" msgid "Extrude Forked" -msgstr "Kéo Ra Chia Ngả" +msgstr "Đẩy Trồi Phân Nhánh" msgid "Create new bones from the selected joints and move them" -msgstr "Tạo xương từ khớp được chọn và di chuyển chung nó" +msgstr "Kiến Tạo các xương mới từ những khớp nối được chọn và di chuyển chúng" msgctxt "Operator" msgid "Fill Between Joints" -msgstr "Làm Đầy Giữa Khớp" +msgstr "Thêm vào Giữa các Khớp Nối" msgid "Add bone between selected joint(s) and/or 3D cursor" -msgstr "Thêm xương giữa các khớp được chọn và/hoặc con trỏ 3D" +msgstr "Thêm xương vào giữa (các) khớp nối (và/hoặc con trỏ 3D) được chọn" msgctxt "Operator" msgid "Flip Names" -msgstr "Lật Tên" +msgstr "Đảo Tên" msgid "Flips (and corrects) the axis suffixes of the names of selected bones" -msgstr "Lật (và sửa) đuôi trục cho tên của các xương được chọn" +msgstr "Đảo lật (và chỉnh sửa) các trục được ghi trong hậu tố tên của các xương được chọn" msgid "Strip Numbers" -msgstr "Số Đoạn" +msgstr "Lược Bỏ Con Số" msgid "" "Try to remove right-most dot-number from flipped names.\n" "Warning: May result in incoherent naming in some cases" msgstr "" -"Thử xóa số chấm phía phải nhất từ tên được lật.\n" -"Cảnh Báo: Cho vài trường hợp có thể làm các tên không phù hợp với nhau" +"Cố gắng loại bỏ con số có dấu chấm, về bên phải nhất, ra khỏi các tên đảo lật chiều.\n" +"Cảnh báo: Có thể dẫn đến việc tên đặt sẽ trở nên không mạch lạc trong một số trường hợp" msgctxt "Operator" msgid "Hide Selected" -msgstr "Ẩn Được Chọn" +msgstr "Ẩn Giấu cái được Chọn" msgid "Tag selected bones to not be visible in Edit Mode" -msgstr "Đặt nhãn cho xương đươc chọn để không hiển thị trong Chế Độ Biên Tập" +msgstr "Đánh dấu các xương được chọn là vô hình trong Chế Độ Biên Soạn" msgid "Unselected" -msgstr "Không Được Chọn" +msgstr "Chưa Chọn" msgid "Hide unselected rather than selected" -msgstr "Ẩn không được chọn thay thế được chọn" +msgstr "Ẩn giấu những cái chưa chọn, thay vì những cái đã chọn" msgctxt "Operator" msgid "Move to Collection" -msgstr "Truyền đến Sưu Tập" +msgstr "Chuyển vào Bộ Sưu Tập" + + +msgid "Move bones to a collection" +msgstr "Di chuyển các xương vào một bộ sưu tập" msgctxt "Operator" @@ -47164,15 +51331,15 @@ msgstr "Xóa Phụ Huynh" msgid "Remove the parent-child relationship between selected bones and their parents" -msgstr "Xóa liên hệ phụ huynh-con cái giữa xương được chọn và phụ huynh của chúng nó" +msgstr "Xóa quan hệ phụ huynh-con cái giữa các xương được chọn và phụ huynh của chúng" msgid "Clear Type" -msgstr "Xóa Loại" +msgstr "Kiểu Xóa" msgid "What way to clear parenting" -msgstr "Phương pháp để xóa phụ huynh" +msgstr "Phương pháp để xóa mối liên kết phụ huynh" msgid "Clear Parent" @@ -47180,60 +51347,60 @@ msgstr "Xóa Phụ Huynh" msgid "Disconnect Bone" -msgstr "Ngắt Xương" +msgstr "Ngắt Rời Xương" msgctxt "Operator" msgid "Make Parent" -msgstr "Làm Phụ Huynh" +msgstr "Đặt Phụ Huynh" msgid "Set the active bone as the parent of the selected bones" -msgstr "Đặt xương hoạt động làm phụ huynh của xương được chọn" +msgstr "Đặt xương đang hoạt động làm phụ huynh của xương được chọn" msgid "Type of parenting" -msgstr "Loại phụ huynh" +msgstr "Thể Loại phụ huynh" msgid "Keep Offset" -msgstr "Giữ Dịch" +msgstr "Duy Trì Dịch Chuyển" msgctxt "Operator" msgid "Reveal Hidden" -msgstr "Hiển Thị Được Ẩn" +msgstr "Hiển Thị cái đã Ẩn Giấu" msgid "Reveal all bones hidden in Edit Mode" -msgstr "Hiện hết xương ẩn trong Chế Độ Biên Tập" +msgstr "Hiển thị toàn bộ các xương ẩn giấu trong Chế Độ Biên Soạn" msgctxt "Operator" msgid "Clear Roll" -msgstr "Xóa Xoáy" +msgstr "Xóa Độ Lăn" msgid "Clear roll for selected bones" -msgstr "Xóa xoáy cho các xương được chọn" +msgstr "Xóa độ lăn của xương được chọn" msgctxt "Operator" msgid "(De)select All" -msgstr "Chọn/Thả Hết" +msgstr "Chọn/Hủy Chọn Toàn Bộ" msgid "Toggle selection status of all bones" -msgstr "Đbật/tắt trạng thái sự lựa choựn của tất cả xương" +msgstr "Lật đảo trạng thái lựa chọn của toàn bộ các xương" msgctxt "Operator" msgid "Select Hierarchy" -msgstr "Chọn Tầng Bậc" +msgstr "Chọn Thứ Bậc" msgid "Select immediate parent/children of selected bones" -msgstr "Chọn phụ huynh/con cái trức tiếp của xương được chọn" +msgstr "Chọn phụ huynh/con cái ruột kề cận của các xương được chọn" msgid "Select Parent" @@ -47245,91 +51412,91 @@ msgstr "Chọn Con Cái" msgid "Extend the selection" -msgstr "Mở rộng sự lựa chọn" +msgstr "Nới rộng lựa chọn" msgid "Deselect those bones at the boundary of each selection region" -msgstr "Thả xương tại ranh giới của mỗi khu vực sự lựa chọn" +msgstr "Hủy chọn các xương tại ranh giới của mỗi vùng lựa chọn" msgctxt "Operator" msgid "Select Linked All" -msgstr "Chọn Hết Được Liên Kết" +msgstr "Chọn Toàn Bộ Kết Nối" msgid "Select all bones linked by parent/child connections to the current selection" -msgstr "Chọn hết xương được kết nối bởi phụ huynh/con cái đến sự lựa chọn hiện tại" +msgstr "Chọn toàn bộ các xương kết nối bởi sự liên kết giữa phụ huynh và con cái vào lựa chọn hiện tại" msgid "All Forks" -msgstr "Hết Ngã Ba" +msgstr "Toàn Bộ các Nhánh Phát Sinh" msgid "Follow forks in the parents chain" -msgstr "Đi theo ngã ba trong chuỗi của phụ huynh" +msgstr "Đi theo các nhánh phát sinh trong dây chuyền phụ huynh" msgid "(De)select bones linked by parent/child connections under the mouse cursor" -msgstr "Chọn (thả) xương được kết nối bởi phụ huynh/con cái ở dưới con trỏ" +msgstr "Chọn/hủy chọn các xương, kết nối bởi sự liên kết giữa phụ huynh và con cái, nằm dưới con trỏ chuột" msgctxt "Operator" msgid "Select Mirror" -msgstr "Chọn Gương" +msgstr "Chọn Phản Chiếu Đối Xứng" msgid "Mirror the bone selection" -msgstr "Gương sự lựa chọn của xương" +msgstr "Phản chiếu đối xứng lựa chọn xương" msgid "Active Only" -msgstr "Chỉ Hoạt Động" +msgstr "Duy cái đang Hoạt Động" msgid "Only operate on the active bone" -msgstr "Chỉ biến đổi xương hoạt động" +msgstr "Chỉ điều hành trên các xương đang hoạt động" msgid "Select those bones connected to the initial selection" -msgstr "Chọn các xương được kết nối với xượng được chọn đầu tiên" +msgstr "Chọn những xương có kết nối với lựa chọn đầu tiên" msgctxt "Operator" msgid "Select Similar" -msgstr "Chọn giống" +msgstr "Chọn Tương Tự" msgid "Select similar bones by property types" -msgstr "Chọn xương giống bằng loại đặc tính" +msgstr "Chọn các xương tương đồng về thể loại tính chất" msgid "Immediate Children" -msgstr "Con Cái Trực Tiệp" +msgstr "Con Cái Trực Tiếp" msgid "Siblings" -msgstr "Anh chị em" +msgstr "Anh Chị Em" msgid "Direction (Y Axis)" -msgstr "Hướng (Trục Y)" +msgstr "Chiều Hướng (Trục Y)" msgid "Prefix" -msgstr "Đầu" +msgstr "Tiền Tố" msgid "Suffix" -msgstr "Đuôi" +msgstr "Hậu Tố" msgctxt "Operator" msgid "Separate Bones" -msgstr "Chẻ Xương" +msgstr "Phân Tách Xương" msgid "Isolate selected bones into a separate armature" -msgstr "Tạo nên cốt mới cho các xương được chọn" +msgstr "Biệt lập các xương được chọn ra thành một khung cốt riêng" msgctxt "Operator" @@ -47343,46 +51510,46 @@ msgstr "Chọn đường ngắn nhất giữa hai xương" msgctxt "Operator" msgid "Split" -msgstr "Chẻ" +msgstr "Tách Phân" msgid "Split off selected bones from connected unselected bones" -msgstr "Chẻ các xương được chọn từ xương kết nối mà chưa được chọn" +msgstr "Tách rời xương được chọn khỏi các xương kết nối chưa chọn" msgctxt "Operator" msgid "Subdivide" -msgstr "Phân Hóa" +msgstr "Phân Chia" msgid "Break selected bones into chains of smaller bones" -msgstr "Chia xương được chọn thành chuỗi xương nhỏ hơn" +msgstr "Chia xương được chọn thành các dây chuyền xương nhỏ hơn" msgid "Number of Cuts" -msgstr "Số Lượng Cắt" +msgstr "Số Phân Đoạn" msgctxt "Operator" msgid "Switch Direction" -msgstr "Lật Hướng" +msgstr "Đảo Chiều Hướng" msgid "Change the direction that a chain of bones points in (head and tail swap)" -msgstr "Lật hướng chỉ của chuỗi xương (trao đổi đầu và đuôi)" +msgstr "Đổi chiều mà dây chuyền xương đang hướng vào (tráo đổi đầu và đuôi)'" msgctxt "Operator" msgid "Symmetrize" -msgstr "Đối Xứng Hóa" +msgstr "Đối xứng" msgid "Enforce symmetry, make copies of the selection or use existing" -msgstr "Ép đối xứng, chép lại sự lựa chọn hay dùng có sẵn" +msgstr "Tuân thủ sự đối xứng, tạo các bản sao của lựa chọn, hoặc sử dụng cái hiện có" msgid "Which sides to copy from and to (when both are selected)" -msgstr "Chép từ bên nào đến bên nào (khi cả hai được chọn)" +msgstr "Sao chép từ bên nào sang bên nào (khi cả hai đều được chọn)" msgid "-X to +X" @@ -47395,150 +51562,154 @@ msgstr "+X đến -X" msgctxt "Operator" msgid "Assign Action" -msgstr "Chỉ Định Hành Động" +msgstr "Ấn Định Hành Động" msgid "Set this pose Action as active Action on the active Object" -msgstr "Đặt Hành Động dạng đứng này làm Hành Động hoạt động trên Vật Thể hoạt động" +msgstr "Đặt Hành Động của tư thế này làm Hành Động đang Hoạt Động trên Đối Tượng đang sử dụng" msgctxt "Operator" msgid "Copy to Asset Library" -msgstr "Chép đến Thư Viện Tích Sản" +msgstr "Sao Chép sang Thư Viện Tài Sản" msgid "Copy the current .blend file into an Asset Library. Only works on standalone .blend files (i.e. when no other files are referenced)" -msgstr "Sao chép tập tin .blend hiện tại vào một Thư Viện Tích Sản. Chỉ được dùng cho những tập tin .blend độc lập (ví dụ tập tin không tham chiếu tập tin khác)" +msgstr "Sao chép tập tin .blend hiện tại vào Thư Viện Tài Sản. Chỉ hoạt động trên các tập tin .blend đứng một mình (tức là khi không có tập tin nào khác được tham chiếu cả)" msgid "Check Existing" -msgstr "Kiểm Tra Tồn Tại" +msgstr "Kiểm Tra sự Tồn Tại" msgid "Check and warn on overwriting existing files" -msgstr "Kiểm tra và báo cáo khi lưu trên tập tin tồn tại rồi" +msgstr "Kiểm tra và cảnh báo nếu định viết đè lên các tập tin tồn tại" msgid "Automatically determine display type for files" -msgstr "Tự động xác định cách hiển thị cho tập tin" +msgstr "Tự động xác định kiểu hiển thị cho các tập tin" msgid "Short List" -msgstr "Danh Sách Ngắn" +msgstr "Danh Sách Ngắn Gọn" msgid "Display files as short list" -msgstr "Hiển thị tập tin bằng danh sách ngắn" +msgstr "Hiển thị tập tin theo dạng ngắn gọn" msgid "Long List" -msgstr "Danh Sách Dài" +msgstr "Danh Sách Dài Dòng" msgid "Display files as a detailed list" -msgstr "Hiển thị tập tin bằng một danh sách chi tiết" +msgstr "Hiển thị các tập tin một cách chi tiết" msgid "File Browser Mode" -msgstr "Chế Độ Trình Duyệt Tập Tin" +msgstr "Chế Độ Duyệt Tập Tin" msgid "The setting for the file browser mode to load a .blend file, a library or a special file" -msgstr "Cài đặt cho chế độ trình duyệt tập tin để nhập một tập tin .blend, một thư viện, hay một tập tin đặc biệt" +msgstr "Sắp đặt cho chế độ duyệt tập tin để nạp một bản .blend, một thư viện, hoặc một tập tin đặc biệt" msgid "Path to file" -msgstr "Đường dỗn đến tập tin" +msgstr "Đường dẫn đến tập tin" msgid "Filter Alembic files" -msgstr "Lọc tập tin Alembic" +msgstr "Thanh lọc các tập tin Alembic" msgid "Filter archive files" -msgstr "Lọc tập tin trong kho chứa" +msgstr "Thanh lọc các tập tin lưu trữ (archive)" msgid "Filter .blend files" -msgstr "Lọc tập tin .blend" +msgstr "Thanh lọc các tập tin .blend" msgid "Filter btx files" -msgstr "Lọc tập tin btx" +msgstr "Thanh lọc các tập tin btx" msgid "Filter COLLADA files" -msgstr "Lọc tập tin COLLADA" +msgstr "Thanh lọc các tập tin COLLADA" msgid "Filter font files" -msgstr "Lọc tập tin phông" +msgstr "Thanh lọc các tập tin phông chữ" msgid "Filter image files" -msgstr "Lọc tập tin ảnh" +msgstr "Thanh lọc các tập tin hình ảnh" msgid "Filter movie files" -msgstr "Lọc tập tin phim" +msgstr "Thanh lọc các tập tin phim" msgid "Filter OBJ files" -msgstr "Lọc tập tin OBJ" +msgstr "Thanh lọc các tập tin OBJ" + + +msgid "Filter Python files" +msgstr "Thanh Lọc các tập tin Python" msgid "Filter sound files" -msgstr "Lọc tập tin âm thanh" +msgstr "Thanh lọc các tập tin âm thanh" msgid "Filter text files" -msgstr "Lọc tập tin văn bản" +msgstr "Thanh lọc các tập tin văn bản" msgid "Filter USD files" -msgstr "Lọc tập tin USD" +msgstr "Thanh lọc các tập tin USD" msgid "Filter OpenVDB volume files" -msgstr "Bộ lọc tập tin thể tích OpenVDB" +msgstr "Thanh lọc các tập tin thể tích OpenVDB" msgid "Hide Operator Properties" -msgstr "Ẩn Đặc Tính Thao Tác" +msgstr "Ẩn Giấu Tính Chất của Thao Tác" msgid "Collapse the region displaying the operator settings" -msgstr "Tóp vùng đang hiển thị cài đặt thao tác" +msgstr "Đóng vùng hiển thị các sắp đặt của thao tác lại" msgid "File sorting mode" -msgstr "Chế độ sắp xếp tập tin" +msgstr "Chế độ sắp xếp thứ tự tập tin" msgctxt "Operator" msgid "Delete Asset Catalog" -msgstr "Xóa Dang Mục Tích Sản" +msgstr "Xóa Danh Mục Tài Sản" msgid "Remove an asset catalog from the asset library (contained assets will not be affected and show up as unassigned)" -msgstr "Xóa một danh mục tích sản từ thư viện tích sản (các tích sản được chứa sẽ không bị ảnh hưởng và sẽ xuất hiện chưa được chỉ định)" +msgstr "Xóa danh mục tài sản khỏi thư viện tài sản (các tài sản nằm bên trong sẽ không bị ảnh hưởng gì và được hiển thị dưới dạng chưa được ấn định)" msgid "Catalog ID" -msgstr "ID Danh Mục" +msgstr "ID của Danh mục" msgid "ID of the catalog to delete" -msgstr "ID của danh mục để xóa" +msgstr "ID của danh mục để xóa đi" msgctxt "Operator" msgid "New Asset Catalog" -msgstr "Danh Mục Tích Sản Mới" +msgstr "Danh Mục Tài Sản Mới" msgid "Create a new catalog to put assets in" -msgstr "Chế tạo một danh mục mới để chứa tích sản" +msgstr "Kiến Tạo danh mục mới để đặt tài sản vào trong đó" msgid "Parent Path" @@ -47546,52 +51717,52 @@ msgstr "Đường Dẫn Phụ Huynh" msgid "Optional path defining the location to put the new catalog under" -msgstr "Đường tùy chọn cho chỉ định vị trí cho danh mục mới" +msgstr "Đường dẫn bổ sung nhằm xác định vị trí để đặt danh mục mới ở đó" msgctxt "Operator" msgid "Redo Catalog Edits" -msgstr "Làm Lại Các Biên Tập Danh Mục" +msgstr "Tái Tác các Chỉnh Sửa ở Danh Mục" msgid "Redo the last undone edit to the asset catalogs" -msgstr "Làm lại biên tập cuối đã hủy bước với các danh mục tích sản" +msgstr "Tái tác chỉnh sửa sau cùng ở danh mục tài sản, sau khi đã hoàn tác" msgctxt "Operator" msgid "Undo Catalog Edits" -msgstr "Hủy Bước Biên Tập Danh Mục" +msgstr "Hoàn Tác các Chỉnh Sửa trong Danh Mục" msgid "Undo the last edit to the asset catalogs" -msgstr "Hủy bước biên tập cuối tác dụng các danh mục tích sản" +msgstr "Hoàn tác sửa đổi sau cùng ở danh mục tài sản" msgctxt "Operator" msgid "Store undo snapshot for asset catalog edits" -msgstr "Chứa 'ảnh chụp' hủy bước cho biên tập danh mục tích sản" +msgstr "Lưu trữ các bản sao dữ liệu trong khi chỉnh sửa danh mục tài sản, giúp cho việc hoàn tác các thay đổi khả dĩ" msgid "Store the current state of the asset catalogs in the undo buffer" -msgstr "Chứa trạnh thái hiện tại của các danh mục tích sản trong đệm hủy bước" +msgstr "Lưu trữ trạng thái hiện tại của danh mục tài sản trong bộ đệm hoàn tác" msgctxt "Operator" msgid "Save Asset Catalogs" -msgstr "Lưu Danh Mục Tích Sản" +msgstr "Lưu Danh Mục Tài Sản" msgid "Make any edits to any catalogs permanent by writing the current set up to the asset library" -msgstr "Giữ vĩnh viễn các biện tập cho những danh mục bằng ghi cài đặt hiện tại vào thư viện tích sản" +msgstr "Biến toàn bộ các chỉnh sửa, trong bất kỳ danh mục nào, trở thành vĩnh cửu, bằng cách viết sắp đặt hiện tại vào thư viện tài sản" msgctxt "Operator" msgid "Clear Asset" -msgstr "Xóa Tích Sản" +msgstr "Xóa Tài Sản" msgid "Delete all asset metadata and turn the selected asset data-blocks back into normal data-blocks" -msgstr "Xóa hết siêu dữ liệu của tích sản và làm các cục dữ liệu tích sản được chọn trở thành cục dữ liệu bình thường" +msgstr "Xóa toàn bộ siêu dữ liệu về tài sản và đổi khối dữ liệu tài sản được chọn quay trở lại khối dữ liệu bình thường" msgid "Set Fake User" @@ -47599,52 +51770,70 @@ msgstr "Đặt Người Dùng Giả" msgid "Ensure the data-block is saved, even when it is no longer marked as asset" -msgstr "Làm chắc cục dữ lưu được lưu, mặc dù không còn được ghi là tích sàn" +msgstr "Đảm bảo rằng khối dữ liệu được lưu lại, ngay cả khi nó không còn được đánh dấu là tài sản nữa" + + +msgctxt "Operator" +msgid "Clear Single Asset" +msgstr "Xóa Đơn Tài Sản" + + +msgid "Delete all asset metadata and turn the asset data-block back into a normal data-block" +msgstr "Xóa toàn bộ các siêu dữ liệu tài sản và biến khối dữ liệu tài sản trở lại thành một khối dữ liệu thông thường" msgctxt "Operator" msgid "Refresh Asset Library" -msgstr "Hoàn Lại Thư Viện Tích Sản" +msgstr "Làm Mới Lại Thư Viện Tài Sản" msgid "Reread assets and asset catalogs from the asset library on disk" -msgstr "Nạp lại tích sản và danh mục tích sản từ thư viện tích sản trên đĩa" +msgstr "Đọc lại các tài sản và danh mục tài sản từ thư viện tài sản trên đĩa" msgctxt "Operator" msgid "Mark as Asset" -msgstr "Ký Dấu là Tích Sản" +msgstr "Đánh Dấu làm Tài Sản" msgid "Enable easier reuse of selected data-blocks through the Asset Browser, with the help of customizable metadata (like previews, descriptions and tags)" -msgstr "Bật dễ sử dụng lại các cục dữ liệu được chọn qua Trình Duyệt Tích Sản, bằng sự hỗ trợ của siêu dữ liệu tùy chọn (như dự khán, lời mô tả và thẻ)" +msgstr "Cho phép tái sử dụng khối dữ liệu được chọn dễ dàng hơn, thông qua Trình Xem Trước Tài Sản, với sự hỗ trợ giúp đỡ của siêu dữ liệu tùy chỉnh (tương tự như xem trước, miêu tả và dấu nhãn" + + +msgctxt "Operator" +msgid "Mark as Single Asset" +msgstr "Đánh Dấu là Đơn Tài Sản" + + +msgid "Enable easier reuse of a data-block through the Asset Browser, with the help of customizable metadata (like previews, descriptions and tags)" +msgstr "Cho phép tái dụng khối dữ liệu dễ dàng hơn thông qua Trình Duyệt Tài Sản, với sự trợ giúp của siêu dữ liệu khả tùy chỉnh (như các xem trước, các miêu tả và các thẻ)" msgctxt "Operator" msgid "Open Blend File" -msgstr "Mở Tập Tin Blender" +msgstr "Mở Tập Tin Blend" msgid "Open the blend file that contains the active asset" -msgstr "Mở tập tin blend đang chứa tích sản hoạt động" +msgstr "Mở tập tin blend có chứa tài sản đang hoạt động" msgctxt "Operator" msgid "Add Asset Tag" -msgstr "Thêm Thẻ Tích Sản" +msgstr "Thêm Dấu Nhãn Tài Sản" msgid "Add a new keyword tag to the active asset" -msgstr "Thêm một thẻ chữ vào tích sản hoạt động" +msgstr "Thêm một từ khóa đánh dấu vào tài sản đang hoạt động" msgctxt "Operator" msgid "Remove Asset Tag" -msgstr "Xóa Thẻ Tích Sản" +msgstr "Xóa Dấu Nhãn Tài Sản" msgid "Remove an existing keyword tag from the active asset" -msgstr "Xóa một chữ thẻ tồn tại từ tích sản hoạt động" +msgstr "Xóa một từ khóa đánh dấu hiện tồn tại khỏi tài sản đang/hoạt động" msgctxt "Operator" @@ -47653,7 +51842,7 @@ msgstr "Đăng Nhập" msgid "(undocumented operator)" -msgstr "(thao tác chưa có tài liệu)" +msgstr "(thao tác chưa có chú thích về chức năng)" msgctxt "Operator" @@ -47663,7 +51852,7 @@ msgstr "Đăng Xuất" msgctxt "Operator" msgid "Validate" -msgstr "Kiểm Tra Hợp Lệ" +msgstr "Kiểm Tra Tính Hợp Lệ" msgctxt "Operator" @@ -47672,7 +51861,7 @@ msgstr "Thêm Quy Tắc Quần Thể" msgid "Add a boid rule to the current boid state" -msgstr "Thêm một quy tắc vào trạng thái quần thể hiện tại" +msgstr "Thêm một quy tắc vào trạng thái của quần thể hiện tại" msgctxt "Operator" @@ -47686,20 +51875,20 @@ msgstr "Xóa quy tắc quần thể hiện tại" msgctxt "Operator" msgid "Move Down Boid Rule" -msgstr "Hạ Xuống Quy Tắc Quần Thể" +msgstr "Chuyển Quy Tắc Quần Thể Xuống" msgid "Move boid rule down in the list" -msgstr "Hạ xuống quy tắc quần thể trong danh sách" +msgstr "Chuyển quy tắc quần thể xuống trong danh sách" msgctxt "Operator" msgid "Move Up Boid Rule" -msgstr "Nâng Lên Quy Tắc Quần Thể" +msgstr "Chuyển Quy Tắc Quần Thể Lên" msgid "Move boid rule up in the list" -msgstr "Nâng lên quy tắc quần thể trong danh sách" +msgstr "Chuyển quy tắc quần thể lên trong danh sách" msgctxt "Operator" @@ -47708,7 +51897,7 @@ msgstr "Thêm Trạng Thái Quần Thể" msgid "Add a boid state to the particle system" -msgstr "Thêm trạng thái vào hệ thống hạt" +msgstr "Thêm một trạng thái quần thể vào hệ thống hạt" msgctxt "Operator" @@ -47722,43 +51911,43 @@ msgstr "Xóa trạng thái quần thể hiện tại" msgctxt "Operator" msgid "Move Down Boid State" -msgstr "Hạ Xuống Trạng Thái Quần Thể" +msgstr "Chuyển Trạng Thái Quần Thể Xuống" msgid "Move boid state down in the list" -msgstr "Hạ xuống trạng thái trong danh sách" +msgstr "Chuyển trạng thái quần thể xuống trong danh sách" msgctxt "Operator" msgid "Move Up Boid State" -msgstr "Nâng Lên Trái Trạng Quần Thể" +msgstr "Chuyển Trạng Thái Quần Thể Lên" msgid "Move boid state up in the list" -msgstr "Nâng lên trái trạng quần thể trong danh sách" +msgstr "Chuyển trạng thái quần thể lên trong danh sách" msgctxt "Operator" msgid "Add Brush" -msgstr "Thêm Bút" +msgstr "Thêm Đầu Bút" msgid "Add brush by mode type" -msgstr "Thêm bút bằng loại chế độ" +msgstr "Thêm đầu bút theo thể loại chế độ" msgctxt "Operator" msgid "Add Drawing Brush" -msgstr "Thêm Bút Vẽ" +msgstr "Thêm Đầu Bút Vẽ" msgid "Add brush for Grease Pencil" -msgstr "Thêm bút cho Bút Sáp" +msgstr "Cộng thêm đầu bút cho Bút Chì Dầu" msgctxt "Operator" msgid "Preset" -msgstr "Đặt Sẫn Sàng" +msgstr "Sắp Đặt Sẵn" msgid "Set brush shape" @@ -47777,55 +51966,64 @@ msgstr "Tối Đa" msgctxt "Curve" msgid "Line" -msgstr "Dường Nét" +msgstr "Đường Nét/Thẳng" msgctxt "Curve" msgid "Round" -msgstr "Tròn" +msgstr "Làm/Tròn" msgctxt "Operator" msgid "Reset Brush" -msgstr "Đặt Lại Bút" +msgstr "Hoàn Lại Đầu Bút" msgid "Return brush to defaults based on current tool" -msgstr "Trở bút lại mặc định tùy dụng cụ hiện tại" +msgstr "Hoàn đầu bút trở về các giá trị mặc định, tùy theo công cụ hiện sử dụng" msgctxt "Operator" msgid "Scale Sculpt/Paint Brush Size" -msgstr "Phóng To Kích Cỡ Bút Khắc/Sơn" +msgstr "Đổi Tỷ Lệ Kích Thước Bút Điêu Khắc/Bút Sơn" msgid "Change brush size by a scalar" -msgstr "Đổi kích cỡ bút bằng một trị số phóng to" +msgstr "Đổi kích thước đầu bút bằng một tỷ lệ (lượng vô hướng)" msgid "Scalar" -msgstr "Hệ Số" +msgstr "Tỷ Lệ" msgid "Factor to scale brush size by" -msgstr "Hệ số để phóng to kích cỡ bút" +msgstr "(Lượng vô hướng) Hệ số để đổi tỷ lệ kích thước đầu bút theo" + + +msgctxt "Operator" +msgid "Curve Falloff Preset" +msgstr "Sắp Đặt Sẵn Suy Giảm Dần của Đường Cong" + + +msgid "Set Curve Falloff Preset" +msgstr "Sắp Đặt Sẵn Suy Giảm Dần của Đường Cong" msgctxt "Operator" msgid "Stencil Brush Control" -msgstr "Điều Khiển Bút Khuôn Tô" +msgstr "Điều Khiển Bút Chấm Khuôn In" msgid "Control the stencil brush" -msgstr "Điều khiển bút khuôn tô" +msgstr "Điều khiển bút chấm khuôn in" msgid "Translation" -msgstr "Dịch" +msgstr "Dịch Chuyển/Phiên Dịch" msgid "Primary" -msgstr "Chánh" +msgstr "Chính" msgid "Secondary" @@ -47834,75 +52032,75 @@ msgstr "Phụ" msgctxt "Operator" msgid "Image Aspect" -msgstr "Ti Lệ Ảnh" +msgstr "Tỷ Lệ Tương Quan của Hình Ảnh" msgid "When using an image texture, adjust the stencil size to fit the image aspect ratio" -msgstr "Khi dùng một chất liệu ảnh, chỉnh kích cỡ khuôn tô cho vừa tỉ số cạnh của ảnh" +msgstr "Khi sử dụng một hình ảnh chất liệu, điều chỉnh kích thước khuôn in cho vừa với tỷ lệ tương quan của hình ảnh" msgid "Modify Mask Stencil" -msgstr "Sửa Đổi Khuôn Tô Mặt Nạ" +msgstr "Sửa Đổi Khuôn In Màn Chắn Lọc" msgid "Modify either the primary or mask stencil" -msgstr "Sửa đổi khuôn to chánh hay mặt nạ" +msgstr "Sửa đổi khuôn in chủ yếu hoặc khuôn in màn chắn lọc" msgid "Use Repeat" -msgstr "Dùng Lặp Vòng" +msgstr "Dùng sự Nhắc Lại" msgid "Use repeat mapping values" -msgstr "Dùng giá trí ánh xạ lặp vòng" +msgstr "Dùng các giá trị ánh xạ nhắc lại" msgid "Use Scale" -msgstr "Dùng Phóng To" +msgstr "Dùng Tỷ Lệ" msgid "Use texture scale values" -msgstr "Dùng giá trị phóng to chất liệu" +msgstr "Dùng các giá trị về tỷ lệ của chất liệu" msgctxt "Operator" msgid "Reset Transform" -msgstr "Đặt Lại Biến Hóa" +msgstr "Hoàn Lại Biến Hóa" msgid "Reset the stencil transformation to the default" -msgstr "Đặt lại biến hóa khuôn tô trở lại mặc định" +msgstr "Hoàn lại biến hóa của khuôn in về mặc định" msgctxt "Operator" msgid "Clear Filter" -msgstr "Xóa Bộ Lọc" +msgstr "Xóa Sạch Tìm Kiếm" msgid "Clear the search filter" -msgstr "Xóa bộ lọc tìm kiếm" +msgstr "Xóa sạch trường thanh lọc tìm kiếm" msgctxt "Operator" msgid "Context Menu" -msgstr "Danh Bạ Bối Cảnh" +msgstr "Trình Đơn Ngữ Cảnh" msgid "Display properties editor context_menu" -msgstr "Hiển thị danh_bạ_bôi_cảnh đặc tính của trình biên soạn" +msgstr "Hiển thị trình đơn ngữ cảnh trình biên soạn tính chất" msgctxt "Operator" msgid "Accept" -msgstr "Nhận" +msgstr "Chấp Nhận" msgid "Open a directory browser, hold Shift to open the file, Alt to browse containing directory" -msgstr "Mở một trình duyệt thư mục, Bấm giữ Shift để mở tập tin, Alt để trình duyệt thư mục đang chứa nó" +msgstr "Mở trình duyệt thư mục, giữ phím Shift xuống để mở tập tin, bấm Alt để duyệt thư mục nằm trong đó" msgid "Directory of the file" -msgstr "Mục lục của tập tin" +msgstr "Thư mục của tập tin" msgid "Select the file relative to the blend file" @@ -47910,56 +52108,60 @@ msgstr "Chọn tập tin tương đối với tập tin .blend" msgid "Open a file browser, hold Shift to open the file, Alt to browse containing directory" -msgstr "Mở một trình duyệt tập tin, Bấm giữ Shift để mở tập tin, Alt để trình duyệt mục lục đang chứa nó" +msgstr "Mở trình duyệt tập tin, giữ phím Shift xuống để mở tập tin, bấm Alt để duyệt thư mục nằm trong đó" msgctxt "Operator" msgid "Filter" -msgstr "Bộ Lọc" +msgstr "Thanh Lọc" msgid "Start entering filter text" -msgstr "Bắt đầu gõ văn bản của bộ lọc" +msgstr "Khởi công nhập văn bản thanh lọc" msgctxt "Operator" msgid "Toggle Pin ID" -msgstr "Bật/Tắt ID Ghim" +msgstr "Bật/Tắt Ghim ID" msgid "Keep the current data-block displayed" -msgstr "Giữ hiển thị của cục dữ liệu hiện tại" +msgstr "Duy trì sự hiển thị của khối dữ liệu hiện tại" msgctxt "Operator" msgid "Add layer" -msgstr "Thêm lớp" +msgstr "Thêm tầng lớp" msgid "Add an override layer to the archive" -msgstr "Thêm một lớp vượt quyền vào kho chứa" +msgstr "Thêm một tầng lớp viết đè vào kho lưu trữ" msgctxt "Operator" msgid "Move layer" -msgstr "Di chuyển lớp" +msgstr "Di chuyển tầng lớp" msgid "Move layer in the list, layers further down the list will overwrite data from the layers higher up" -msgstr "Di chuyển lớp trong danh sách, các lớp dưới trong danh sách sẽ vượt quyền dữ liệu từ các lớp cao hơn" +msgstr "Di chuyển tầng lớp trong danh sách, các dữ liệu của các tầng lớp nằm dưới trong danh sách sẽ được sử dụng để viết đè lên dữ liệu từ các lớp cao hơn ở trên" msgid "Direction to move the active vertex group towards" -msgstr "Hướng di chuyển đến cho nhóm đỉnh đang hoạt động" +msgstr "Phương hướng để di chuyển cho nhóm điểm đỉnh đang hoạt động tới" + + +msgid "Remove an override layer from the archive" +msgstr "Xóa một tầng lớp vượt quyền khỏi kho lưu trữ" msgctxt "Operator" msgid "Open Cache File" -msgstr "Mở Tập Tin Đệm Chứa" +msgstr "Mở Tập Tin Bộ Nhớ Đệm" msgid "Load a cache file" -msgstr "Nhập một tập tin đệm chứa" +msgstr "Nạp một tập tin bộ nhớ đệm" msgctxt "Operator" @@ -47968,206 +52170,223 @@ msgstr "Nạp Lại Kho" msgid "Update objects paths list with new data from the archive" -msgstr "Nâng cấp đường dẫn vật thể với dữ liệu mới từ kho" +msgstr "Cập nhật danh sách đường dẫn đối tượng bằng dữ liệu mới từ kho" msgctxt "Operator" msgid "Add Camera Preset" -msgstr "Thêm Đặt Sẫn Máy Quay Phim" +msgstr "Thêm Sắp Đặt Sẵn về Máy Quay Phim" msgid "Add or remove a Camera Preset" -msgstr "Thêm hay xóa đặt sẵn máy quay phim" +msgstr "Thêm hay xóa một Sắp Đặt Sẵn về Máy Quay Phim" msgid "Name of the preset, used to make the path name" -msgstr "Tên của đặt sẩn, dùng để làm tên đường dẫn" +msgstr "Tên của sắp đặt sẵn, dùng để đặt tên đường dẫn" msgid "Include Focal Length" -msgstr "Gồm Cách Xa Tiêu Điểm" +msgstr "Bao Gồm Tiêu Cự" msgid "Include focal length into the preset" -msgstr "Gồm cách xa tiêu điểm trong đặt sẵn" +msgstr "Bao gồm cả tiêu cự trong sắp đặt sẵn" msgctxt "Operator" msgid "Add Safe Area Preset" -msgstr "Thêm Đặt Sẫn Khu Vực An Toàn" +msgstr "Thêm Sắp Đặt Sẵn về Khu Vực An Toàn" msgid "Add or remove a Safe Areas Preset" -msgstr "Thêm hay xóa một đặt sẵn Khu Vực An Toàn" +msgstr "Thêm hay xóa một Sắp Đặt Sẵn về Khu Vực An Toàn" msgctxt "Operator" msgid "Add Marker" -msgstr "Thêm Ký Hiệu" +msgstr "Thêm Dấu Mốc" msgid "Place new marker at specified location" -msgstr "Đặt ký hiệu mới tại vị trí được xác định" +msgstr "Đặt dấu mốc mới tại vị trí chỉ định" msgid "Location of marker on frame" -msgstr "Vị trí của ký hiệu tại số bức ảnh" +msgstr "Vị trí của dấu mốc trên khung hình" msgctxt "Operator" msgid "Add Marker at Click" -msgstr "Thêm Ký Hiệu Khi Bấm" +msgstr "Thêm Dấu Mốc tại Điểm Bấm Chuột" msgid "Place new marker at the desired (clicked) position" -msgstr "Đặt ký hiệu mới tại vị trí yêu cầu (bấm)" +msgstr "Đặt dấu mốc mới tại vị trí yêu cầu (vị trí đã bấm chuột)" msgctxt "Operator" msgid "Add Marker and Move" -msgstr "Thêm Ký Hiệu Và Di Chuyển Nó" +msgstr "Thêm Dấu Mốc và Di Chuyển" msgid "Add new marker and move it on movie" -msgstr "Thêm ký hiệu và di chuyển nó trên phim" +msgstr "Thêm dấu mốc và di chuyển trên phim" msgid "Add Marker" -msgstr "Thêm Ký Hiệu" +msgstr "Thêm Dấu Mốc" msgctxt "Operator" msgid "Add Marker and Slide" -msgstr "Thêm Ký Hiệu Và Trượt Nó" +msgstr "Thêm Dấu Mốc và Trượt Đẩy" msgid "Add new marker and slide it with mouse until mouse button release" -msgstr "Thêm ký hiệu mới và trược nó với chuột đến khi thả nút chuột" +msgstr "Thêm dấu mốc mới và trượt đẩy nó bằng chuột cho đến khi nút chuột được thả ra" msgctxt "Operator" msgid "Apply Solution Scale" -msgstr "Áp Dụng Phóng To Nghiệm" +msgstr "Áp Dụng Tỷ Lệ vào Giải Nghiệm" msgid "Apply scale on solution itself to make distance between selected tracks equals to desired" -msgstr "Áp dụng phóng to với nghiệm một mình để làm khoảng cách giữa các đường theo dõi được chọn bằng khoảng cách ý định" +msgstr "Áp dụng tỷ lệ vào bản thân giải nghiệm để làm khoảng cách giữa các giám sát được chọn bằng khoảng cách mong muốn" msgid "Distance between selected tracks" -msgstr "Khoảng cách giữa đường theo dõi được chọn" +msgstr "Khoảng cách giữa các giám sát đã chọn" msgctxt "Operator" msgid "Average Tracks" -msgstr "Trung Bình Của Đường Theo Dõi" +msgstr "Tính Trung Bình các Giám Sát" msgid "Average selected tracks into active" -msgstr "Trung bình của đường theo dõi vào hoạt động" +msgstr "Các bản nhạc được chọn trung bình vào hoạt động" + + +msgctxt "MovieClip" +msgid "Keep Original" +msgstr "Duy Trì Bản Gốc" msgid "Keep original tracks" -msgstr "Giữ đường theo dõi ban đầu" +msgstr "Giữ lại các các giám sát gốc" msgctxt "Operator" msgid "3D Markers to Mesh" -msgstr "Ký Hiệu 3D Trên Mạng Lưới" +msgstr "Các Dấu Mốc 3D thành Khung Lưới" msgid "Create vertex cloud using coordinates of reconstructed tracks" -msgstr "Chế tạo mây đỉnh bằng tọa độ của các đường vết được xây dựng lại" +msgstr "Sinh kiến tạo đám mây điểm đỉnh dùng tọa độ của các giám sát đã khôi phục" msgid "Add or remove a Tracking Camera Intrinsics Preset" -msgstr "Thêm hay xóa một Đặt Sẵn Bản Chất Máy Quay Phim Đuổi Theo" +msgstr "Thêm hay xóa một Sắp Đặt Sẵn về Tính Chất Cơ Bản của Máy Quay Phim cho Quá Trình Giám Sát" msgctxt "Operator" msgid "Clean Tracks" -msgstr "Làm Sạch Đường Vết" +msgstr "Dọn Dẹp Giám Sát" msgid "Clean tracks with high error values or few frames" -msgstr "Làm sạch các đường vết có giá trị sai lầm cao hay ít bức ảnh" +msgstr "Dọn dẹp các giám sát có giá trị sai số cao, hoặc có số khung hình (truy lùng) ít" + + +msgid "Affect tracks which have a larger reprojection error" +msgstr "Ảnh hưởng đến các giám sát có lượng lỗi tái phóng chiếu lớn hơn" + + +msgid "Affect tracks which are tracked less than the specified number of frames" +msgstr "Ảnh hưởng đến các giám sát truy lùng được ít hơn số lượng khung hình chỉ định" msgctxt "Operator" msgid "Clear Solution" -msgstr "Xóa Nghiệm" +msgstr "Xóa Giải Nghiệm" msgid "Clear all calculated data" -msgstr "Xóa hết dữ liệu đã tính" +msgstr "Xóa toàn bộ các dữ liệu đã tính toán" msgctxt "Operator" msgid "Clear Track Path" -msgstr "Xóa Đường Vết" +msgstr "Xóa Đường Giám Sát" msgid "Clear tracks after/before current position or clear the whole track" -msgstr "Xóa đường vết sau/trước vị trí hiện tại hay xóa toàn bộ đường vết" +msgstr "Xóa các giám sát ở sau/trước vị trí hiện tại, hoặc xóa toàn bộ giám sát" msgid "Clear action to execute" -msgstr "Xóa hành động để thực hành" +msgstr "Xóa hành động sẽ thi hành" msgid "Clear Up To" -msgstr "Xóa Đến" +msgstr "Xóa Đến Tới" msgid "Clear path up to current frame" -msgstr "Xoá đường đến bức ảnh hiện tại" +msgstr "Xóa đường dẫn (từ đầu) đến khung hình hiện tại" msgid "Clear Remained" -msgstr "Xóa Còn Lại" +msgstr "Xóa Từ Đây Trở Đi" msgid "Clear path at remaining frames (after current)" -msgstr "Xóa đường tại bức ảnh còn lại (sau hiện tại)" +msgstr "Xóa đường dẫn ở các khung hình còn lại (sau cái hiện tại)" msgid "Clear All" -msgstr "Xóa Hết" +msgstr "Xóa Toàn Bộ" msgid "Clear the whole path" -msgstr "Xóa hết đươông" +msgstr "Xóa toàn bộ các đường dẫn" msgid "Clear Active" -msgstr "Xóa Hoạt Động" +msgstr "Xóa cái đang Hoạt Động" msgid "Clear active track only instead of all selected tracks" -msgstr "Chỉ xóa đường vết hoạt động thay hết đường vết được chọn" +msgstr "Chỉ xóa giám sát đang hoạt động mà thôi, thay vì toàn bộ các giám sát đã chọn" msgctxt "Operator" msgid "Constraint to F-Curve" -msgstr "Ràng buộc với Cong-F" +msgstr "Ràng Buộc thành Đường Cong-F" msgid "Create F-Curves for object which will copy object's movement caused by this constraint" -msgstr "Chế tạo Cong-F bằng chép chuyển động của vật thể được xảy ra từ ràng buộc này" +msgstr "Kiến Tạo Đường Cong-F cho đối tượng, tức cái sẽ sao chép chuyển động của đối tượng mà ràng buộc này gây ra" msgctxt "Operator" msgid "Copy Tracks" -msgstr "Chép Đường Vết" +msgstr "Sao Chép Giám Sát" + + +msgid "Copy the selected tracks to the internal clipboard" +msgstr "Sao chép các rãnh đã chọn vào bảng nhớ tạm nội bộ" msgctxt "Operator" msgid "Create Plane Track" -msgstr "Chế tạo Đường Vết Mặt Phẳng" +msgstr "Kiến Tạo Giám Sát Bình Diện" msgid "Create new plane track out of selected point tracks" -msgstr "Chế tạo đường vết mặt phẳng từ các đường vết điểm được chọn" +msgstr "Kiến Tạo giám sát bình diện mới từ những điểm giám sát đã chọn" msgctxt "Operator" @@ -48180,112 +52399,112 @@ msgstr "Đặt vị trí con trỏ 2D" msgid "Cursor location in normalized clip coordinates" -msgstr "Vị trí con trỏ bằng tọa độ đơn vị hóa của đoạn phim" +msgstr "Vị trí con trỏ trong tọa độ đã bình thường hóa của đoạn phim" msgctxt "Operator" msgid "Delete Marker" -msgstr "Xóa Ký Hiệu" +msgstr "Xóa Dấu Mốc" msgid "Delete marker for current frame from selected tracks" -msgstr "Xóa ký hiệu cho bức ảnh hiện tại từ các đường nvết được chọn" +msgstr "Xóa dấu mốc cho khung hình hiện tại khỏi các giám sát đã chọn" msgctxt "Operator" msgid "Delete Proxy" -msgstr "Xoá Dại Lý" +msgstr "Xóa Đại Diện" msgid "Delete movie clip proxy files from the hard drive" -msgstr "Xóa tập tin đại lý đoạn phim trong ổ cứng" +msgstr "Xóa các tập tin đại diện của đoạn phim khỏi ổ cứng" msgctxt "Operator" msgid "Delete Track" -msgstr "Xóa Đường Vết" +msgstr "Xóa Giám Sát" msgid "Delete selected tracks" -msgstr "Xóa các đường vết được chọn" +msgstr "Xóa các giám sát được chọn" msgctxt "Operator" msgid "Detect Features" -msgstr "Phát Hịện Đặc Tính" +msgstr "Phát Hiện Điểm Đặc Trưng" msgid "Automatically detect features and place markers to track" -msgstr "Tự động phát hiện đặc trưng và dán ký hiệu trong đường vết" +msgstr "Tự động phát hiện các điểm đặc trưng và đánh dấu để giám sát" msgid "Only features further than margin pixels from the image edges are considered" -msgstr "Chỉ kiểm tra đặc trưng xa hơn điểm ảnh lề từ cạnh ảnh" +msgstr "Chỉ những điểm đặc trưng nằm xa hơn các điểm ảnh lề, từ các cạnh của hình ảnh, là được cân nhắc mà thôi" msgid "Minimal distance accepted between two features" -msgstr "Khoảng cách cực tiểu để chấp nhận giữa hai đặc trưng" +msgstr "Khoảng cách tối thiểu chấp nhận được giữa hai điểm đặc trưng" msgid "Placement" -msgstr "Vị Trí Đặt" +msgstr "Định Vị" msgid "Placement for detected features" -msgstr "Vị trí đặt cho đặc trưng được phát hiện" +msgstr "Định vị cho các nét đặc trưng phát hiện thấy" msgid "Whole Frame" -msgstr "Toàn Khung" +msgstr "Toàn Bộ Khung Hình" msgid "Place markers across the whole frame" -msgstr "Đặt ký hiệu qua toàn khung" +msgstr "Dải các dấu mốc trên toàn thể khung hình" msgid "Inside Annotated Area" -msgstr "Trong Khu Vực Được Lời Ghi Chú" +msgstr "Nội Trong Khu Vực Chú Thích" msgid "Place markers only inside areas outlined with the Annotation tool" -msgstr "Chỉ đặt ký hiệu ở trong các khu vực được vẽ khoang vòng với dụng cụ Lời Ghi Chú" +msgstr "Chỉ đặt các dấu mốc nội bên trong vùng đã được khoanh vùng bằng công cụ Chú Thích mà thôi" msgid "Outside Annotated Area" -msgstr "Ngoài Khu Vực Được Lời Ghi Chú" +msgstr "Ngoài Khu Vực Chú Thích" msgid "Place markers only outside areas outlined with the Annotation tool" -msgstr "Chỉ đặt ký hiệu ở ngoài các khu vực được vẽ khoang vòng với dụng cụ Lời Ghi Chú" +msgstr "Chỉ đặt các dấu mốc bên ngoài vùng đã được khoanh vùng bằng công cụ Chú Thích mà thôi" msgid "Threshold level to consider feature good enough for tracking" -msgstr "Ngưỡng cho chấp nhận đặc trưng tốt đủ cho theo dõi" +msgstr "Mức giới hạn để cân nhắc là điểm đặc trưng đạt đủ điều kiện để giám sát" msgctxt "Operator" msgid "Disable Markers" -msgstr "Tắt Ký Hiệu" +msgstr "Tắt Dấu Mốc" msgid "Disable/enable selected markers" -msgstr "Bật/tắt ký hiệu được chọn" +msgstr "Bật/Tắt các dấu mốc được chọn" msgid "Disable action to execute" -msgstr "Tắt thực hành hành động nào" +msgstr "Tắt hành động sẽ thi hành" msgid "Disable selected markers" -msgstr "Tắt hý hiệu được chọn" +msgstr "Tắt các dấu mốc được chọn" msgid "Enable selected markers" -msgstr "Bật ký hiệu được chọn" +msgstr "Kích hoạt các dấu mốc được chọn" msgid "Toggle disabled flag for selected markers" -msgstr "Bật/tặt cờ không hoạt động cho ký hiệu được chọn" +msgstr "Bật/tắt cờ hiệu ngưng hoạt động (tắt/vô hiệu hóa) cho dấu mốc được chọn" msgctxt "Operator" @@ -48294,11 +52513,11 @@ msgstr "Chọn Kênh" msgid "Select movie tracking channel" -msgstr "Chọn kênh theo dõi trong phim" +msgstr "Chọn kênh đang giám sát của đoạn phim" msgid "Extend selection rather than clearing the existing selection" -msgstr "Mở rộng sự lựa chọn thay thế xóa sự lựa chọn đang có" +msgstr "Nới rộng lựa chọn, thay vì xóa lựa chọn đang có" msgid "Mouse location to select channel" @@ -48307,178 +52526,178 @@ msgstr "Vị trí chuột để chọn kênh" msgctxt "Operator" msgid "Filter Tracks" -msgstr "Lọc Đường Vết" +msgstr "Thanh Lọc Giám Sát" msgid "Filter tracks which has weirdly looking spikes in motion curves" -msgstr "Lọc đường vết thi đường cong chuyển động có gai phí thường" +msgstr "Thanh lọc các giám sát có các đỉnh nhọn bất thường trong đường cong chuyển động" msgid "Track Threshold" -msgstr "Ngưỡng Đường Vết" +msgstr "Giới Hạn Giám Sát" msgid "Filter Threshold to select problematic tracks" -msgstr "Ngưỡng Bộ Lọc cho chọn đường vết có vấn đề" +msgstr "Giới Hạn Thanh Lọc để chọn các giám sát có vấn đề" msgctxt "Operator" msgid "Jump to Frame" -msgstr "Nhảy đến Bức Ảnh" +msgstr "Nhảy đến Khung Hình" msgid "Jump to special frame" -msgstr "Nhảy đến bức ảnh đặc biệt" +msgstr "Nhảy đến khung hình đặc biệt" msgid "Position to jump to" -msgstr "Nhảy đến vị trí" +msgstr "Vị trí để nhảy đến" msgid "Jump to start of current path" -msgstr "Nhảy đến đầu đường hiện tại" +msgstr "Nhảy về đầu đường dẫn hiện tại" msgid "Jump to end of current path" -msgstr "Nhảy đến kết thúc đường hiện tại" +msgstr "Nhảy đến cuối đường dẫn hiện tại" msgid "Previous Failed" -msgstr "Bức Ảnh Trước Bị Thất Bại" +msgstr "Cái Thất Bại Trước Đây" msgid "Jump to previous failed frame" -msgstr "Nhảy đến bức ảnh trước bị thất bại" +msgstr "Nhảy đến khung hình bị thất bại trước đây" msgid "Next Failed" -msgstr "Bức Ảnh Bị Thất Bại" +msgstr "Cái Thất Bại Tiếp Theo" msgid "Jump to next failed frame" -msgstr "Nhảy đến bức ảnh tiếp bị thất bại" +msgstr "Nhảy đến khung hình bị thất bại tiếp theo" msgctxt "Operator" msgid "Center Current Frame" -msgstr "Chỉnh Trung Tâm Bức Ảnh Hiện Tại" +msgstr "Đặt Khung Hình Hiện Tại ở Trung Tâm" msgid "Scroll view so current frame would be centered" -msgstr "Cuộn màn cho bức ảnh hiện tại ở trung tâm" +msgstr "Cuộn khung nhìn để khung hình hiện tại được đặt ở trung tâm" msgctxt "Operator" msgid "Delete Curve" -msgstr "Bỏ Đường Cong" +msgstr "Xóa Đường Cong" msgid "Delete track corresponding to the selected curve" -msgstr "Bỏ đường vết của đường cong được chọn " +msgstr "Xóa giám sát tương ứng với đường cong được chọn" msgctxt "Operator" msgid "Delete Knot" -msgstr "Xóa Nơ" +msgstr "Xóa Dấu Mốc" msgid "Delete curve knots" -msgstr "Xóa nơ đường cong" +msgstr "Xóa dấu mốc của đường cong" msgctxt "Operator" msgid "Select" -msgstr "Chọn" +msgstr "Lựa Chọn" msgid "Select graph curves" -msgstr "Chọn đường cong biểu đồ" +msgstr "Chọn các đường cong biểu đồ" msgid "Mouse location to select nearest entity" -msgstr "Vị trí chuột để chọn mặt hàng gần nhất" +msgstr "Vị trí chuột để chọn thực thể gần nhất" msgctxt "Operator" msgid "(De)select All Markers" -msgstr "Chọn/Thả Hết Ký Hiệu" +msgstr "Chọn/Hủy Chọn Toàn Bộ các Dấu Mốc" msgid "Change selection of all markers of active track" -msgstr "Đổi sự lựa chọn của hết ký hiệu của đường vết hoạt động" +msgstr "Đổi sự lựa chọn của toàn bộ các dấu mốc của giám sát đang hoạt động" msgid "Select curve points using box selection" -msgstr "Chọn điểm đường cong bằng sự lựa chọn hộp" +msgstr "Chọn các điểm của đường cong bằng phương pháp khoanh vùng ranh giới chọn theo hình hộp" msgid "View all curves in editor" -msgstr "Hiển thị hết đường cong trong trình biên soạn" +msgstr "Hiển thị toàn bộ các đường cong trong trình biên soạn" msgctxt "Operator" msgid "Hide Tracks" -msgstr "Ẩn Đường Vết" +msgstr "Ẩn Giấu các Giám Sát" msgid "Hide selected tracks" -msgstr "Ẩn đường vết được chọn" +msgstr "Ẩn giấu các giám sát được chọn" msgid "Hide unselected tracks" -msgstr "Ẩn đường vết không được chọn" +msgstr "Ẩn giấu các giám sát không được chọn" msgctxt "Operator" msgid "Hide Tracks Clear" -msgstr "Xóa Đường Vết Ẩn" +msgstr "Hủy Ẩn Giấu Giám Sát" msgid "Clear hide selected tracks" -msgstr "Xóa đường vết được chọn đang ẩn" +msgstr "Hủy ẩn giấu các giám sát được chọn" msgctxt "Operator" msgid "Join Tracks" -msgstr "Kết Nối Đường Vết" +msgstr "Hội Nhập các Giám Sát" msgid "Join selected tracks" -msgstr "Kết nối đường vết được chọn" +msgstr "Hội nhập các giám sát được chọn" msgid "Delete a keyframe from selected tracks at current frame" -msgstr "Xóa một bức ảnh mẫu từ đường vết được chọn tại bức ảnh hiện tại" +msgstr "Xóa một khung khóa khỏi các giám sát được chọn tại khung hình hiện tại" msgid "Insert a keyframe to selected tracks at current frame" -msgstr "Chèn một bức ảnh mẫu vào đường vết được chọn tại bức ảnh hiện tại" +msgstr "Chèn thêm một khung khóa cho các dấu giám sát được chọn tại khung hình hiện tại" msgctxt "Operator" msgid "Toggle Lock Selection" -msgstr "Bật/Tắt Khóa Sự Lựa Chọn" +msgstr "Bật/Tắt Khóa Lựa Chọn" msgid "Toggle Lock Selection option of the current clip editor" -msgstr "Tùy Chọn Bật/Tắt của trình biên soạn đoạn phim hiện tại" +msgstr "Bật/Tắt tùy chọn Khóa Lựa Chọn (không cho phép lựa chọn) của trình biên soạn hiện tại" msgctxt "Operator" msgid "Lock Tracks" -msgstr "Khóa Đường Vết" +msgstr "Khóa Giám Sát" msgid "Lock/unlock selected tracks" -msgstr "Khóa/mở khóa đường vết được chọn" +msgstr "Khóa/mở khóa giám sát được chọn" msgid "Lock action to execute" -msgstr "Khóa hành động cho thực hành" +msgstr "Khóa hành động thi hành" msgid "Lock selected tracks" -msgstr "Khóa đường vết được chọn" +msgstr "Khóa các giám sát được chọn" msgid "Unlock" @@ -48486,11 +52705,11 @@ msgstr "Mở Khóa" msgid "Unlock selected tracks" -msgstr "Mở khóa cho đường vết được chọn" +msgstr "Mở khóa cho các giám sát được chọn" msgid "Toggle locked flag for selected tracks" -msgstr "Bật/tắt cờ khóa cho đường vết chọn được chọn" +msgstr "Đảo lật cờ hiệu thông báo tình trạng khóa của giám sát được chọn" msgctxt "Operator" @@ -48499,24 +52718,34 @@ msgstr "Đặt Chế Độ Đoạn Phim" msgid "Set the clip interaction mode" -msgstr "Đặt chế độ tương tác đoạn phim" +msgstr "Đặt chế độ tương tác của đoạn phim" + + +msgctxt "MovieClip" +msgid "Mode" +msgstr "Chế Độ" msgid "Show tracking and solving tools" -msgstr "Hiện dụng cụ theo dõi và giải nghiệm" +msgstr "Hiển thị các công cụ giám sát và giải nghiệm" + + +msgctxt "MovieClip" +msgid "Mask" +msgstr "Chắn Lọc" msgid "Show mask editing tools" -msgstr "Hiện dụng cụ biên tập mặt nạ" +msgstr "Hiển thị các công cụ biên soạn chắn lọc" msgctxt "Operator" msgid "New Image from Plane Marker" -msgstr "Ảnh mới từ Ký Hiệu Mặt Phẳng" +msgstr "Hình Ảnh Mới từ Dấu Mốc Giám Sát Bình Diện" msgid "Create new image from the content of the plane marker" -msgstr "Chế tạo một ảnh mới từ nội dung của kỳ hiệu mặt phẳng" +msgstr "Kiến Tạo hình ảnh mới từ nội dung của dấu mốc giám sát bình diện" msgctxt "Operator" @@ -48525,154 +52754,158 @@ msgstr "Mở Đoạn Phim" msgid "Load a sequence of frames or a movie file" -msgstr "Nhập một trình tự bức ảnh hay tập tin phim" +msgstr "Đọc một trình tự khung hình hoặc một tập tin phim" msgid "Enable Multi-View" -msgstr "Bật Đa Màn" +msgstr "Bật Đa Góc Nhìn" msgctxt "Operator" msgid "Paste Tracks" -msgstr "Dán Đường Vết" +msgstr "Dán Giám Sát" + + +msgid "Paste tracks from the internal clipboard" +msgstr "Dán các giám sát từ bảng nhớ tạm nội bộ" msgctxt "Operator" msgid "Prefetch Frames" -msgstr "Lấy Trước Các Bức Ảnh" +msgstr "Nạp Sẵn các Khung Hình" msgid "Prefetch frames from disk for faster playback/tracking" -msgstr "Lấy trước các bức ảnh từ đĩa cho hát lại/theo dõi nhanh hơn" +msgstr "Nạp sẵn các khung hình từ đĩa để chơi/giám sát được nhanh hơn" msgctxt "Operator" msgid "Rebuild Proxy and Timecode Indices" -msgstr "Xây dựng lại Chỉ Số của Đại Lý và Mã Thời Gian" +msgstr "Tái Xây Dựng Chỉ Số của Đại Diện và Mã Thời Gian" msgid "Rebuild all selected proxies and timecode indices in the background" -msgstr "Xây dưng lại hết chỉ số của đại lý và mã thời gian được chọn đang sau" +msgstr "Tái xây dựng toàn bộ các chỉ số của đại diện và mã thời gian được chọn ngầm ở sau nền" msgctxt "Operator" msgid "Refine Markers" -msgstr "Chỉnh Ký Hiệu" +msgstr "Tinh Chỉnh Dấu Mốc" msgid "Refine selected markers positions by running the tracker from track's reference to current frame" -msgstr "Chỉnh ký hiệu được chọn bằng chạy bộ theo dõi the từ tiêu chuẩn của đường vết đến bức ảnh hiện tại" +msgstr "Tinh chỉnh các dấu mốc được chọn bằng cách vận hành giám sát từ điểm đối chiếu của giám sát đến khung hình hiện tại" msgid "Backwards" -msgstr "Trở Ngược" +msgstr "Ngược Chiều" msgid "Do backwards tracking" -msgstr "Theo dõi ngược hướng" +msgstr "Giám sát ngược chiều" msgctxt "Operator" msgid "Reload Clip" -msgstr "Nhập Lại Đoạn Phim" +msgstr "Nạp Lại Đoạn Phim" msgid "Reload clip" -msgstr "Nhập lại đoạn phim" +msgstr "Nạp lại đoạn phim" msgid "Select tracking markers" -msgstr "Chọn ký hiệu theo dõi" +msgstr "Chọn các dấu giám sát" msgid "Mouse location in normalized coordinates, 0.0 to 1.0 is within the image bounds" -msgstr "Vị trị chuột bằng tọa độ đơn vị hóa, 0.0 đến 1.0 ở trong ranh giới ảnh" +msgstr "Vị trí chuột, trong tọa độ bình thường hóa, 0.0 đến 1.0, nằm nội trong ranh giới của hình ảnh" msgid "Change selection of all tracking markers" -msgstr "Đổi sự lựa chọn của hết ký hiệu theo dõi" +msgstr "Đổi sự lựa chọn của toàn bộ các dấu giám sát" msgid "Select markers using box selection" -msgstr "Chọn ký hiệu bằng sự lựa chọn kiểu hộp" +msgstr "Chọn các dấu mốc dùng phương pháp khoanh vùng chọn hình hộp" msgid "Select markers using circle selection" -msgstr "Chọn ký hiệu bằng sự lựa chọn kiểu hộp" +msgstr "Chọn các dấu mốc dùng sự lựa chọn vòng tròn" msgctxt "Operator" msgid "Select Grouped" -msgstr "Chọn Được Nhóm Lại" +msgstr "Chọn theo Nhóm" msgid "Select all tracks from specified group" -msgstr "Chọn hết đường vết từ nhóm được xác định" +msgstr "Chọn toàn bộ các giám sát từ nhóm chỉ định" msgid "Keyframed Tracks" -msgstr "Đường Vết Có Bức Ảnh Mẫu" +msgstr "Những Giám Sát đã Khung Khóa Hóa" msgid "Select all keyframed tracks" -msgstr "Chọn hết đường vết có bức ảnh mẫu" +msgstr "Chọn toàn bộ các giám sát đã khung khóa hóa" msgid "Estimated Tracks" -msgstr "Đường Vết Được Dự Đoán" +msgstr "Những Giám Sát đã Ước Tính" msgid "Select all estimated tracks" -msgstr "Chọn hết đường vết được dự đoán" +msgstr "Chọn toàn bộ các giám sát đã ước tính" msgid "Tracked Tracks" -msgstr "Đường Vết Được Theo Dõi" +msgstr "Những Giám Sát đã Truy Lùng" msgid "Select all tracked tracks" -msgstr "Chọn hết đường vết được theo dõi" +msgstr "Chọn toàn bộ các giám sát đã truy lùng" msgid "Locked Tracks" -msgstr "Đường Vết Được Khóa" +msgstr "Những Giám Sát đã bị Khóa Lại" msgid "Select all locked tracks" -msgstr "Chọn hết đường vết bị khóa" +msgstr "Chọn toàn bộ các giám sát đã bị khóa lại" msgid "Disabled Tracks" -msgstr "Đường Vết Bị Tắt" +msgstr "Những Giám Sát đã Vô Hiệu Hóa" msgid "Select all disabled tracks" -msgstr "Chọn hết đường vết bị khóa" +msgstr "Chọn toàn bộ các giám sát đã bị tắt đi (vô hiệu hóa)" msgid "Tracks with Same Color" -msgstr "Đường Vết cùng Màu Sắc" +msgstr "Những Giám Sát có Cùng Màu Sắc" msgid "Select all tracks with same color as active track" -msgstr "Chọn hết đường vết cùng màu với đường vết hoạt động" +msgstr "Chọn toàn bộ các giám sát có cùng màu sắc với giám sát đang hoạt động" msgid "Failed Tracks" -msgstr "Đường Vết Bị Thất Bại" +msgstr "Những Giám Sát Thất Bại" msgid "Select all tracks which failed to be reconstructed" -msgstr "Chọn hết đường vết thì xây dựng lại đã bị thất bại" +msgstr "Chọn toàn bộ các dấu giám sát thất bại trong quá trình khôi phục lại" msgid "Select markers using lasso selection" -msgstr "Chọn ký hiệu bằng dây trói" +msgstr "Chọn các dấu mốc bằng dây thòng lọng" msgctxt "Operator" msgid "Set Active Clip" -msgstr "Đặt Đoạn Phim Hoạt Động" +msgstr "Đặt Đoạn Phim đang Hoạt Động" msgctxt "Operator" @@ -48680,46 +52913,50 @@ msgid "Set Axis" msgstr "Đặt Trục" +msgid "Set the direction of a scene axis by rotating the camera (or its parent if present). This assumes that the selected track lies on a real axis connecting it to the origin" +msgstr "Đặt chiều hướng trục của cảnh bằng cách xoay máy quay phim (hoặc phụ huynh của nó nếu có). Điều này giả định rằng rãnh đã chọn nằm trên một trục thực kết nối nó với tọa độ gốc" + + msgid "Axis to use to align bundle along" -msgstr "Dùng trục nào cho sắp xếp gói" +msgstr "Trục sử dụng để căn chỉnh bộ điểm theo" msgid "Align bundle align X axis" -msgstr "Sắp xếp gói với trục X" +msgstr "Căn chỉnh bộ điểm theo trục X" msgid "Align bundle align Y axis" -msgstr "Sắp xếp gói với trục Y" +msgstr "Căn chỉnh bộ điểm theo trục Y" msgctxt "Operator" msgid "Set Origin" -msgstr "Đặt Gốc Tọa Độ" +msgstr "Đặt Tọa Độ Gốc" msgid "Set active marker as origin by moving camera (or its parent if present) in 3D space" -msgstr "Đặt ký hiệu hoạt động làm gốc tọa độ bằng di chuyển máy quay phim (hay phụ huynh của nó, nếu có) trong không gian 3D" +msgstr "Đặt dấu mốc đang hoạt động làm tọa độ gốc bằng cách di chuyển máy quay phim (hoặc phụ huynh của nó, nếu có) trong không gian 3D" msgid "Use Median" -msgstr "Dùng Điểm Trung" +msgstr "Dùng Trung Điểm" msgid "Set origin to median point of selected bundles" -msgstr "Đặt gốc tọa độ đến điểm trung của các gói được chọn" +msgstr "Đưa tọa độ gốc đến điểm trung vị của các bộ điểm được chọn" msgctxt "Operator" msgid "Set Plane" -msgstr "Đặt Mặt Phẳng" +msgstr "Đặt Bình Diện" msgid "Set plane based on 3 selected bundles by moving camera (or its parent if present) in 3D space" -msgstr "Đặt mặt phẳng tùy 3 gói được chọn bằng di chuyển máy quay phim (hay phụ huynh của nó, nếu có) trong không gian 3D" +msgstr "Đặt bình diện trên 3 bộ điểm được chọn bằng cách di chuyển máy quay phim (hoặc phụ huynh của nó, nếu có) trong không gian 3D" msgid "Plane to be used for orientation" -msgstr "Mặt phẩng dùng cho định hướng" +msgstr "Mặt phẳng dùng để định hướng" msgid "Set floor plane" @@ -48736,82 +52973,82 @@ msgstr "Đặt mặt tường" msgctxt "Operator" msgid "Set Scale" -msgstr "Đặt Phóng To" +msgstr "Đặt Tỷ Lệ" msgid "Set scale of scene by scaling camera (or its parent if present)" -msgstr "Đặt phóng to của cảnh bằng phóng to máy quay phim (hay phụ huynh của nó, nếu có)" +msgstr "Đặt tỷ lệ của cảnh bằng cách đổi tỷ lệ máy quay phim (hoặc phụ huynh của nó, nếu có)" msgctxt "Operator" msgid "Set Scene Frames" -msgstr "Đặt Bức Ảnh Cảnh" +msgstr "Đặt Số Khung Hình của Cảnh" msgid "Set scene's start and end frame to match clip's start frame and length" -msgstr "Đặt bức ảnh đầu và cuối của cảnh cho giống như bức ảnh đầu và bề dài của đoạn phim" +msgstr "Đặt khung hình đầu và cuối của cảnh khớp với khung hình đầu và chiều dài của đoạn phim" msgctxt "Operator" msgid "Set Solution Scale" -msgstr "Đặt Phóng To Nghiệm" +msgstr "Đặt Tỷ Lệ Giải Nghiệm" msgid "Set object solution scale using distance between two selected tracks" -msgstr "Đặt phóng to nghiệm vật thể bằng dùng khoảng cách giửa hai đường vết được chọn" +msgstr "Đặt khoảng cách giữa hai dấu giám sát được chọn làm tỷ lệ giải nghiệm của đối tượng" msgctxt "Operator" msgid "Set Solver Keyframe" -msgstr "Đặt Bức Ảnh Mẫu Trình Giải Nghiệm" +msgstr "Đặt Khung Khóa cho Bộ Giải Nghiệm" msgid "Set keyframe used by solver" -msgstr "'Đặt bức ảnh mẫu cho trình giải nghiệm được dùng" +msgstr "'Đặt khung khóa mà bộ giải nghiệm sử dụng" msgid "Keyframe to set" -msgstr "Số bức ảnh để đặt" +msgstr "Khung khóa để đặt" msgctxt "Operator" msgid "Set as Background" -msgstr "Đặt Làm Nền" +msgstr "Đặt làm Nền" msgid "Set current movie clip as a camera background in 3D Viewport (works only when a 3D Viewport is visible)" -msgstr "Đặt đoạn phim hiện tại cho làm một nền máy quay phim trong màn chiếu 3D (chỉ được dùng khi màn chiếu 3D được hiển thị)" +msgstr "Đặt đoạn phim hiện tại làm nền máy quay phim trong cổng nhìn 3D (chỉ hoạt động khi cổng nhìn 3D nhìn thấy được)'" msgctxt "Operator" msgid "Setup Tracking Scene" -msgstr "Chuẩn Bị Cảnh Theo Dõi" +msgstr "Thiết Lập Cảnh Giám Sát" msgid "Prepare scene for compositing 3D objects into this footage" -msgstr "Chuẩn bị cảnh cho ghép vật thể 3D trong phim thâu" +msgstr "Chuẩn bị cảnh cho quá trình tổng hợp các đối tượng 3D vào trong đoạn phim này" msgctxt "Operator" msgid "Slide Marker" -msgstr "Ký Hịệu Trượt" +msgstr "Trượt Đẩy Dấu Mốc" msgid "Slide marker areas" -msgstr "Khu vực trượt ký hiệu" +msgstr "Trượt đẩy khu vực dấu mốc" msgid "Offset in floating-point units, 1.0 is the width and height of the image" -msgstr "Dịch bằng đơn vịsố thật dấu phẩy động, 1.0 là bề rộng và bề cao của ảnh" +msgstr "Dịch chuyển trong đơn vị số thực, 1,0 là chiều rộng và chiều cao của hình ảnh" msgctxt "Operator" msgid "Slide Plane Marker" -msgstr "Trượt Ký Hiệu Mặt Phẳng" +msgstr "Trượt Đẩy Dấu Mốc Bình Diện" msgid "Slide plane marker areas" -msgstr "Khu vực trượt ký hiệu mặt phẳng" +msgstr "Trượt đẩy khu vực dấu mốc bình diện" msgctxt "Operator" @@ -48820,359 +53057,359 @@ msgstr "Giải Nghiệm Máy Quay Phim" msgid "Solve camera motion from tracks" -msgstr "Giải nghiệm chuyển động của máy quay phim từ đường vết" +msgstr "Giải nghiệm chuyển động của máy quay phim từ các dấu giám sát" msgctxt "Operator" msgid "Add Stabilization Tracks" -msgstr "Thêm Đường Vết Ổn Định Hóa" +msgstr "Thêm các Dấu Mốc Giám Sát Ổn Định" msgid "Add selected tracks to 2D translation stabilization" -msgstr "Thêm đường vết được chọn để dùng cho ổn định hóa dịch 2D" +msgstr "Thêm các dấu giám sát được chọn vào quá trình ổn định hóa dịch chuyển 2D" msgctxt "Operator" msgid "Remove Stabilization Track" -msgstr "Xóa Đường Vết Ổn Định Hóa" +msgstr "Xóa Giám Sát Ổn Định Hóa" msgid "Remove selected track from translation stabilization" -msgstr "Xóa đường vết được chọn từ ổn định hóa dịch" +msgstr "Xóa các dấu giám sát được chọn khỏi quá trình ổn định hóa dịch chuyển" msgctxt "Operator" msgid "Add Stabilization Rotation Tracks" -msgstr "Thêm Đường Vết Ổn Định Hóa Xoay" +msgstr "Thêm các Giám Sát Ổn Định Hóa sự Xoay Chiều" msgid "Add selected tracks to 2D rotation stabilization" -msgstr "Thêm đường vết được chọn vào dụng cụ ổn định hóa xoay 2D" +msgstr "Thêm các dấu giám sát được chọn vào quá trình ổn định hóa sự xoay chiều 2D" msgctxt "Operator" msgid "Remove Stabilization Rotation Track" -msgstr "Xóa Đường Vết Ổn Định Hóa Xoay" +msgstr "Xóa các Giám Sát Ổn Định Hóa sự Xoay Chiều" msgid "Remove selected track from rotation stabilization" -msgstr "Xóa đường vết được chọn từ ổn định hóa xoay" +msgstr "Xóa các dấu giám sát được chọn khỏi quá trình ổn định hóa sự xoay chiều" msgctxt "Operator" msgid "Select Stabilization Rotation Tracks" -msgstr "Chọn Đường Vết Ổn Định Hóa Xoay" +msgstr "Chọn các Dấu Giám Sát Ổn Định Xoay Chiều" msgid "Select tracks which are used for rotation stabilization" -msgstr "Chọn đường vết được sử dụng cho ổn định hóa xoay" +msgstr "Chọn các dấu giám sát, tức những cái sử dụng trong quá trình ổn định hóa sự xoay chiều" msgctxt "Operator" msgid "Select Stabilization Tracks" -msgstr "Chọn Đường Vết Ổn Định Hóa" +msgstr "Chọn các Dấu Mốc Giám Sát Ổn Định" msgid "Select tracks which are used for translation stabilization" -msgstr "Chọn đường vết được sử dụng cho ổn định hóa dịch" +msgstr "Chọn các dấu giám sát được sử dụng trong quá trình ổn định hóa dịch chuyển" msgctxt "Operator" msgid "Add Track Color Preset" -msgstr "Thêm Màu Đường Vết Đặt Sẵn" +msgstr "Thêm Sắp Đặt Sẵn về Màu Giám Sát" msgid "Add or remove a Clip Track Color Preset" -msgstr "Thêm hay xóa một Màu Đường Vết Đoạn Phim Đặt Sẵn" +msgstr "Thêm hay xóa một Sắp Đặt Sẵn về Màu Giám Sát của Đoạn Phim" msgctxt "Operator" msgid "Copy Color" -msgstr "Chép Màu" +msgstr "Sao Chép Màu" msgid "Copy color to all selected tracks" -msgstr "Chép lại màu vào hết đường vết được chọn" +msgstr "Sao chép màu sắc vào toàn bộ các giám sát được chọn" msgctxt "Operator" msgid "Track Markers" -msgstr "Ký Hiệu Đường Vết" +msgstr "Giám Sát các Dấu Mốc" msgid "Track selected markers" -msgstr "Ký hiệu đường vết được chọn" +msgstr "Giám sát các dấu mốc được chọn" msgid "Track Sequence" -msgstr "Trình Tự Dường Vết" +msgstr "Giám Sát Trình Tự" msgid "Track marker during image sequence rather than single image" -msgstr "Ký hiệu đường vết trong trình tự ảnh thay thế chỉ một ảnh" +msgstr "Giám sát dấu mốc trong trình tự hình ảnh thay vì một đơn hình ảnh" msgctxt "Operator" msgid "Track Settings as Default" -msgstr "Cài Đặt Đường Vết làm Mặc Định" +msgstr "Sắp Đặt của Giám Sát làm Sắp Đặt Mặc Định" msgid "Copy tracking settings from active track to default settings" -msgstr "Chép lại cài đặt đường vết từ đường vết hoạt động vào đặc trưng mặc định" +msgstr "Sao chép các sắp đặt của giám sát, từ dấu giám sát đang hoạt động, thành sắp đặt mặc định" msgctxt "Operator" msgid "Copy Track Settings" -msgstr "Chép Cài Đặt Đường Vết" +msgstr "Sao Chép Sắp Đặt về Giám Sát" msgid "Copy tracking settings from active track to selected tracks" -msgstr "Chép lại cài đặt đường vết từ đường vết hoạt động vào các đường vết được chọn" +msgstr "Sao chép sắp đặt của quá trình giám sát từ dấu giám sát đang hoạt động sang dấu giám sát được chọn" msgctxt "Operator" msgid "Link Empty to Track" -msgstr "Liên Kết Vật Thể Rỗng Với Đường Vết" +msgstr "Kết Nối Đối Tượng Rỗng với Giám Sát" msgid "Create an Empty object which will be copying movement of active track" -msgstr "Tạo Vật Thể Rỗng cho đi theo chuyển động của rãnh hoạt động" +msgstr "Kiến Tạo đối tượng Rỗng, tức cái sẽ sao chép chuyển động của dấu giám sát đang hoạt động" msgctxt "Operator" msgid "Add Tracking Object" -msgstr "Thêm Vật Thể Theo Dõi" +msgstr "Thêm Đối Tượng Giám Sát" msgid "Add new object for tracking" -msgstr "Thêm vật thể cho theo dõi" +msgstr "Thêm đối tượng mới cho quá trình giám sát" msgctxt "Operator" msgid "Remove Tracking Object" -msgstr "Xoá Vật Thể Theo Dõi" +msgstr "Loại Bỏ Đối Tượng Giám Sát" msgid "Remove object for tracking" -msgstr "Xóa vật thể cho theo dõi" +msgstr "Xóa đối tượng sử dụng Acho quá trình giám sát" msgctxt "Operator" msgid "Add Tracking Settings Preset" -msgstr "Thêm Cài Đặt Sẵn Theo Dõi" +msgstr "Thêm Sắp Đặt Sẵn về Cấu Hình Giám Sát" msgid "Add or remove a motion tracking settings preset" -msgstr "Thêm hay xóa một cài đặt theo dõi chuyển động đặt sẵn" +msgstr "Thêm hay xóa một sắp đặt sẵn về cấu hình giám sát chuyển động" msgctxt "Operator" msgid "Update Image from Plane Marker" -msgstr "Nâng cấp Ảnh từ Ký Hiệu Mặt Phẳng" +msgstr "Cập Nhật Hình Ảnh từ Dấu Mốc Giám Sát Bình Diện" msgid "Update current image used by plane marker from the content of the plane marker" -msgstr "Nâng cấp ảnh hiện tại được ký hiệu mặt phẳng sử dụng từ nội dung của ký hiệu mặt phẳng" +msgstr "Cập nhật hình ảnh hiện tại mà dấu mốc giám sát bình diện sử dụng bằng nội dung của dấu mốc giám sát bình diện" msgid "View whole image with markers" -msgstr "Hiển thị toàn ảnh với ký hiệu" +msgstr "Hiển thị toàn bộ hình ảnh với các dấu mốc" msgid "Fit View" -msgstr "Vừa Màn" +msgstr "Khít Vừa Góc Nhìn" msgid "Fit frame to the viewport" -msgstr "Phóng to khung cho vừa màn chiếu" +msgstr "Khít khung hình cho vừa với cổng nhìn" msgctxt "Operator" msgid "Center View to Cursor" -msgstr "Trung Tâm Màn đến Con Trỏ" +msgstr "Trung Tâm Hóa Góc Nhìn vào Con Trỏ" msgid "Center the view so that the cursor is in the middle of the view" -msgstr "Trung tâm hóa màn cho con trỏ ở tại trung tâm của màn" +msgstr "Trung tâm hóa góc nhìn sao cho con trỏ nằm ở giữa" msgctxt "Operator" msgid "NDOF Pan/Zoom" -msgstr "Chuột Dời/Phóng Vào NDOF" +msgstr "NDOF Lia/Thu-Phóng" msgid "Use a 3D mouse device to pan/zoom the view" -msgstr "Dùng thiết bị chuột 3D cho dời/phóng to màn" +msgstr "Dùng thiết bị chuột 3D để lia/thu-phóng góc nhìn" msgctxt "Operator" msgid "Pan View" -msgstr "Dời Màn" +msgstr "Lia Góc Nhìn" msgid "Pan the view" -msgstr "Dời màn" +msgstr "Lia góc nhìn" msgid "View all selected elements" -msgstr "Hiển thị tất cả phần tử" +msgstr "Hiển thị toàn bộ các phần tử được chọn" msgctxt "Operator" msgid "View Zoom" -msgstr "Phóng To Màn" +msgstr "Thu-Phóng Góc Nhìn" msgid "Zoom in/out the view" -msgstr "Phóng vào/ra màn" +msgstr "Thu-Phóng vào/ra góc nhìn" msgid "Zoom factor, values higher than 1.0 zoom in, lower values zoom out" -msgstr "Hệ số phóng to, giá trị hơn 1.0 cho phóng vào, nhỏ hơn cho phóng ra" +msgstr "Hệ số thu-phóng, giá trị cao hơn 1.0 là phóng to vào, nhỏ hơn là thu nhỏ lại" msgid "Use Mouse Position" -msgstr "Dùng Vị Trí Chuột" +msgstr "Sử Dụng Vị Trí của Chuột" msgid "Allow the initial mouse position to be used" -msgstr "Cho sử dụng vị trí khởi động của chuột" +msgstr "Cho phép vị trí khởi đầu của chuột được sử dụng" msgctxt "Operator" msgid "Zoom In" -msgstr "Phóng Vào" +msgstr "Phóng To" msgid "Zoom in the view" -msgstr "Phóng vào màn" +msgstr "Phóng vào góc nhìn" msgid "Cursor location in screen coordinates" -msgstr "Vị trí con trỏ bằng tọa độ màn" +msgstr "Vị trí của con trỏ trong tọa độ màn hình" msgctxt "Operator" msgid "Zoom Out" -msgstr "Phóng Ra" +msgstr "Thu Nhỏ" msgid "Zoom out the view" -msgstr "Phóng ra màn" +msgstr "Thu nhỏ góc nhìn" msgid "Cursor location in normalized (0.0 to 1.0) coordinates" -msgstr "Vị trí con trỏ bằng tọa độ đơn vị hóa (0.0 đến 1.0)" +msgstr "Vị trí con trỏ trong tọa độ đã bình thường hóa (0,0 đến 1,0)" msgctxt "Operator" msgid "View Zoom Ratio" -msgstr "Tỉ Số Phóng Màn" +msgstr "Tỷ Lệ Thu-Phóng Góc Nhìn" msgid "Set the zoom ratio (based on clip size)" -msgstr "Đặt tỉ số phóng to (tùy kích cỡ đoạn phim)" +msgstr "Đặt tỷ lệ thu phóng (tùy theo kích thước của đoạn phim)" msgid "Zoom ratio, 1.0 is 1:1, higher is zoomed in, lower is zoomed out" -msgstr "Tỉ số phóng, 1.0 là 1:1, lớn hơn là phóng vào, nhỏ hơn là phóng ra" +msgstr "Tỷ lệ thu-phóng, 1.0 nghĩa là 1:1, lớn hơn nghĩa là phóng to gần vào, nhỏ hơn là thu nhỏ ra" msgctxt "Operator" msgid "Add Cloth Preset" -msgstr "Thêm Đặt Sẵn Vải" +msgstr "Thêm Sắp Đặt Sẵn về Vải Vóc" msgid "Add or remove a Cloth Preset" -msgstr "Thêm hay xóa một Đặt Sẵn Vải" +msgstr "Thêm hay xóa Sắp Đặt Sẵn về Vải Vóc" msgctxt "Operator" msgid "Create New Collection" -msgstr "Chế Tạo Sưu Tập Mới" +msgstr "Kiến Tạo Bộ Sưu Tập Mới" msgid "Create an object collection from selected objects" -msgstr "Chế tạo một sưu tập vật thể mới từ các vật thể được chọn" +msgstr "Kiến tạo một bộ sưu tập đối tượng từ các đối tượng đã chọn" msgid "Name of the new collection" -msgstr "Tên của sưu tập mới" +msgstr "Tên của bộ sưu tập mới" msgctxt "Operator" msgid "Add Selected to Active Collection" -msgstr "Thêm Được Chọn Vào Sưu Tập Hoạt Động" +msgstr "Thêm cái được Chọn vào Bộ Sưu Tập đang Hoạt Động" msgid "Add the object to an object collection that contains the active object" -msgstr "Thêm vật thể vào một sưu tập vật thể có sở hữu vật thể hoạt động" +msgstr "Thêm đối tượng vào một bộ sưu tập có chứa đối tượng đang hoạt động" msgid "The collection to add other selected objects to" -msgstr "Sưu tập để bổ sung vật thể vào" +msgstr "Bộ sưu tập để thêm những đối tượng được chọn khác vào" msgctxt "Operator" msgid "Remove from Collection" -msgstr "Xóa từ Sưu Tập" +msgstr "Xóa Khỏi Bộ Sưu Tập" msgid "Remove selected objects from a collection" -msgstr "Xóa các vật thể được chọn từ một sưu tập" +msgstr "Xóa đối tượng được chọn khỏi một bộ sưu tập" msgid "The collection to remove this object from" -msgstr "Sưu tập nào để xóa ra vật thể này" +msgstr "Bộ sưu tập để xóa đối tượng này khỏi nó" msgctxt "Operator" msgid "Remove Selected from Active Collection" -msgstr "Xóa Được Chọn từ Sưu Tập Hoạt Động" +msgstr "Xóa cái được Chọn khỏi Bộ Sưu Tập đang Hoạt Động" msgid "Remove the object from an object collection that contains the active object" -msgstr "Xóa vật thể từ một sưu tập vật thể đang có sở hữu vật thể hoạt động" +msgstr "Xóa đối tượng khỏi bộ sưu tập có chứa đối tượng đang hoạt động" msgid "The collection to remove other selected objects from" -msgstr "Sưu tập để xóa các vật thể khác được chọn" +msgstr "Bộ sưu tập để xóa những đối tượng được chọn khác khỏi nó" msgctxt "Operator" msgid "Remove from All Collections" -msgstr "Xóa từ Tất Cả Sưu Tập" +msgstr "Xóa Khỏi Toàn Bộ các Bộ Sưu Tập" msgid "Remove selected objects from all collections" -msgstr "Xóa các vật thể được chọn từ tất cả sưu tập" +msgstr "Xóa các đối tượng được chọn khỏi toàn bộ các bộ sưu tập" msgctxt "Operator" msgid "Console Autocomplete" -msgstr "Tự Động Hoàn Thành Diện Điền Khiển" +msgstr "Tự Động Hoàn Chỉnh trong Bàn Giao Tiếp" msgid "Evaluate the namespace up until the cursor and give a list of options or complete the name if there is only one" -msgstr "Tinh toán không gian tên đến con trỏ và hiện một danh sách tùy chọn hay ghi xong tên nếu chỉ có một cái" +msgstr "Tính toán không gian tên đến vị trí con trỏ và cung cấp một danh sách các tùy chọn, hoặc hoàn chỉnh tên nếu chỉ có một cái duy nhất" msgctxt "Operator" msgid "Console Banner" -msgstr "Ti Nhắn Diện Điều Khiển" +msgstr "Biểu Ngữ của Bàn Giao Tiếp" msgid "Print a message when the terminal initializes" -msgstr "In một tin nhắn khi khởi động diện điều khiển" +msgstr "In một thông điệp ra khi khởi động thiết bị cuối" msgctxt "Operator" msgid "Clear All" -msgstr "Xóa Hết" +msgstr "Xóa Toàn Bộ" msgid "Clear text by type" -msgstr "Xóa văn bản tùy loại" +msgstr "Xóa văn bản tùy theo thể loại" msgid "History" @@ -49180,15 +53417,15 @@ msgstr "Lịch Sử" msgid "Clear the command history" -msgstr "Xoá lịch sử lệnh" +msgstr "Xóa lịch sử dòng lệnh" msgid "Scrollback" -msgstr "Cuộn Lui" +msgstr "Cuộn Trở Lại" msgid "Clear the scrollback history" -msgstr "Xóa lịch sử cuộn lui" +msgstr "Xóa lịch sử cuộn trở lại" msgctxt "Operator" @@ -49197,25 +53434,33 @@ msgstr "Xóa Dòng" msgid "Clear the line and store in history" -msgstr "Xoá dòng và lưu trong lịch sử" +msgstr "Xóa dòng và lưu vào lịch sử" msgctxt "Operator" msgid "Copy to Clipboard" -msgstr "Chép Vào Bảng Dán" +msgstr "Sao Chép vào Bảng Nhớ Tạm" msgid "Copy selected text to clipboard" -msgstr "Chép văn bản được chọn vào bảng dán" +msgstr "Sao chép văn bản được chọn vào bảng nhớ tạm" + + +msgid "Delete Selection" +msgstr "Xóa Lựa Chọn" + + +msgid "Whether to delete the selection after copying" +msgstr "Có nên xóa lựa chọn sau khi sao chép hay không" msgctxt "Operator" msgid "Copy to Clipboard (as Script)" -msgstr "Chép vào Bảng Dán (làm văn thảo)" +msgstr "Sao Chép vào Bảng Nhớ Tạm (thành Tập Lệnh)" msgid "Copy the console contents for use in a script" -msgstr "Chép nội dung diện điều khiển để sử dụng trong một văn thảo" +msgstr "Sao chép nội dung bàn giao tiếp để sử dụng trong một tập lệnh" msgctxt "Operator" @@ -49224,15 +53469,15 @@ msgstr "Xóa" msgid "Delete text by cursor position" -msgstr "Xóa văn bản tùy vi trí con trỏ" +msgstr "Xóa văn bản theo vị trí của con trỏ" msgid "Which part of the text to delete" -msgstr "Xóa văn bản đoạn nào" +msgstr "Phần nào của văn bản để xóa đi" msgid "Next Character" -msgstr "Ký Tự Tiếp" +msgstr "Ký Tự Tiếp Theo" msgid "Previous Character" @@ -49240,25 +53485,29 @@ msgstr "Ký Tự Trước" msgid "Next Word" -msgstr "Chữ Tiếp" +msgstr "Từ Tiếp Theo" msgid "Previous Word" -msgstr "Chữ Trước" +msgstr "Từ Đứng Trước" msgctxt "Operator" msgid "Console Execute" -msgstr "Thực Hành Diện Điều Khiển" +msgstr "Thi Hành Bàn Giao Tiếp" + + +msgid "Execute the current console line as a Python expression" +msgstr "Thực thi dòng hiện tại của giao diện dòng lệnh như một biểu thức Python vậy" msgctxt "Operator" msgid "History Append" -msgstr "Kèm Lịch Sử" +msgstr "Bổ Sung Thêm Dòng Lịch Sử" msgid "Append history at cursor position" -msgstr "Kèm lịch sử tại vị trí con trỏ" +msgstr "Bổ sung thêm dòng lịch sử tại vị trí của con trỏ" msgid "The index of the cursor" @@ -49266,28 +53515,28 @@ msgstr "Chỉ số của con trỏ" msgid "Remove Duplicates" -msgstr "Xóa Sao Chép" +msgstr "Xóa Mục Nhắc Lại" msgid "Remove duplicate items in the history" -msgstr "Xoá mặt hàng sao chép trong lịch sử" +msgstr "Xóa các mục nhắc lại trong lịch sử" msgid "Text to insert at the cursor position" -msgstr "Văn bản cho chèn tại vị trí con trỏ" +msgstr "Văn bản để chèn vào vị trí của con trỏ" msgctxt "Operator" msgid "History Cycle" -msgstr "Chu Trình Lịch Sử" +msgstr "Luân Chuyển Dòng Lịch Sử" msgid "Cycle through history" -msgstr "Đi vòng chu trình lịch sử" +msgstr "Luân chuyển qua dòng lịch sử" msgid "Reverse cycle history" -msgstr "Đảo nghịch chu trình lịch sử" +msgstr "Đảo nghịch chiều hướng luân chuyển dòng lịch sử" msgctxt "Operator" @@ -49301,29 +53550,34 @@ msgstr "Thêm 4 dấu cách tại đầu dòng" msgctxt "Operator" msgid "Indent or Autocomplete" -msgstr "Lõm hay Tự Động Hoàn Thành" +msgstr "Thụt Dòng hoặc Tự Động Hoàn Chỉnh" msgid "Indent selected text or autocomplete" -msgstr "Lõm hay tự động hoàn thành văn bản được chọn" +msgstr "Thụt dòng văn bản đã chọn hoặc tự động hoàn chỉnh câu cú" msgctxt "Operator" msgid "Insert" -msgstr "Chèn" +msgstr "Chèn Thêm" msgid "Insert text at cursor position" -msgstr "Chèn văn bản tại vị trí con trỏ" +msgstr "Chèn thêm văn bản tại vị trí con trỏ" msgctxt "Operator" msgid "Console Language" -msgstr "Ngôn Ngữ Diện Điều Khiển" +msgstr "Ngôn Ngữ Bàn Giao Tiếp" msgid "Set the current language for this console" -msgstr "Đặt ngôn ngữ hiện tại cho diện điều khiển" +msgstr "Đặt ngôn ngữ hiện tại cho bàn giao tiếp" + + +msgctxt "Python console" +msgid "Language" +msgstr "Ngôn Ngữ" msgctxt "Operator" @@ -49332,72 +53586,84 @@ msgstr "Di Chuyển Con Trỏ" msgid "Move cursor position" -msgstr "Vị trí di chuyển con trỏ" +msgstr "Di chuyển vị trí con trỏ" + + +msgid "Whether to select while moving" +msgstr "Có nên chọn trong khi di chuyển hay không" msgid "Where to move cursor to" -msgstr "Chỗ cho Di chuyển con trỏ đến" +msgstr "Nơi di chuyển con trỏ đến" msgid "Line Begin" -msgstr "Đắt Đầu Dòng" +msgstr "Đầu Dòng" msgid "Line End" -msgstr "Kết Thúc Dòng" +msgstr "Cuối Dòng" msgctxt "Operator" msgid "Paste from Clipboard" -msgstr "Dán Từ Bảng Dán" +msgstr "Dán Từ Bảng Nhớ Tạm" msgid "Paste text from clipboard" -msgstr "Dán văn bản từ bảng dán" +msgstr "Dán văn bản từ bảng nhớ tạm" + + +msgid "Paste text selected elsewhere rather than copied (X11/Wayland only)" +msgstr "Dán văn bản được chọn ra một chỗ khác thay vì sao chép (duy X11/Wayland mà thôi)" msgctxt "Operator" msgid "Scrollback Append" -msgstr "Kèm Cuộn Lại" +msgstr "Bổ Sung Dòng Cuộn Lại" msgid "Append scrollback text by type" -msgstr "Kèm văn bản cuộn lại tùy loại" +msgstr "Bổ Sung dòng chữ để cuộn trở lại theo thể loại" msgid "Console output type" -msgstr "Loại ngõ ra của diện điều khiển" +msgstr "Thể loại đầu ra của bàn giao tiếp" msgid "Information" msgstr "Thông Tin" +msgid "Select all the text" +msgstr "Chọn toàn bộ văn bản" + + msgctxt "Operator" msgid "Set Selection" -msgstr "Đặt Sự Lựa Chọn" +msgstr "Đặt Vùng Lựa Chọn" msgid "Set the console selection" -msgstr "Đặt sự lựa chọn của diện điều khiển" +msgstr "Đặt vùng lựa chọn trong bàn giao tiếp" msgctxt "Operator" msgid "Select Word" -msgstr "Chọn Chữ" +msgstr "Chọn Từ" msgid "Select word at cursor position" -msgstr "Chọn chữ tại vị trí con trỏ" +msgstr "Chọn từ nằm tại vị trí con trỏ" msgctxt "Operator" msgid "Unindent" -msgstr "Không Thục Dòng" +msgstr "Bỏ Thụt Dòng" msgid "Delete 4 spaces from line beginning" -msgstr "Xóa 4 dấu cách từ đầu dòng" +msgstr "Xóa 4 dấu cách ở đầu dòng" msgctxt "Operator" @@ -49411,11 +53677,11 @@ msgstr "Thêm một mục tiêu vào ràng buộc" msgctxt "Operator" msgid "Apply Constraint" -msgstr "Áp Dùng Ràng Buộc" +msgstr "Áp Dụng Ràng Buộc" msgid "Apply constraint and remove from the stack" -msgstr "Áp dụng ràng buộc và xóa từ xếp đống" +msgstr "Áp dụng ràng buộc và xóa khỏi ngăn xếp" msgid "Constraint" @@ -49423,63 +53689,63 @@ msgstr "Ràng Buộc" msgid "Name of the constraint to edit" -msgstr "Tên của ràng buộc cho biên tập" +msgstr "Tên của ràng buộc để biên soạn" msgid "The owner of this constraint" -msgstr "Chủ của ràng buộc này" +msgstr "Chủ sở hữu của ràng buộc này" msgid "Edit a constraint on the active object" -msgstr "Biên tập một ràng buộc trên vật thể hoạt động" +msgstr "Biên soạn một ràng buộc trên đối tượng đang hoạt động" msgid "Edit a constraint on the active bone" -msgstr "Biên tập một ràng buộc của xương hoạt động" +msgstr "Biên soạn một ràng buộc trên xương đang hoạt động" msgid "Report" -msgstr "Biên Bản" +msgstr "Thông/Thông Báo" msgid "Create a notification after the operation" -msgstr "Chế tạo một tin nhắn sau một thao tác" +msgstr "Kiến Tạo một thông báo sau khi thao tác đã hoàn thành" msgctxt "Operator" msgid "Clear Inverse" -msgstr "Xóa Nghịch" +msgstr "Xóa Đảo Ngược" msgid "Clear inverse correction for Child Of constraint" -msgstr "Xóa chỉnh sửa nghịch cho ràng buộc Con Cái Của" +msgstr "Xóa chỉnh sửa đảo ngược cho ràng buộc Làm Con Cái" msgctxt "Operator" msgid "Set Inverse" -msgstr "Đặt Nghịch" +msgstr "Đảo Ngược" msgid "Set inverse correction for Child Of constraint" -msgstr "Đặt chỉnh sửa nghịch cho ràng buộc Con Cái Của" +msgstr "Đặt chỉnh sửa đảo ngược cho ràng buộc Làm Con Cái" msgctxt "Operator" msgid "Duplicate Constraint" -msgstr "Xóa Ràng Buộc Bản Sao" +msgstr "Nhân Đôi Ràng Buộc" msgid "Duplicate constraint at the same position in the stack" -msgstr "Chép lại ràng buộc tại cùng vị trí trong xếp đống" +msgstr "Nhân đôi ràng buộc tại cùng vị trí trong ngăn xếp" msgctxt "Operator" msgid "Copy Constraint To Selected" -msgstr "Chép Ràng Buộc Đến Được Chọn" +msgstr "Sao Chép Ràng Buộc sang cái Được Chọn" msgid "Copy constraint to other selected objects/bones" -msgstr "Chép lại ràng buộc đến các vật thể/xương được chọn" +msgstr "Sao chép ràng buộc sang các đối tượng/xương đã chọn khác" msgctxt "Operator" @@ -49488,51 +53754,51 @@ msgstr "Xóa Ràng Buộc" msgid "Remove constraint from constraint stack" -msgstr "Xóa ràng buộc từ xếp đống ràng buộc" +msgstr "Xóa ràng buộc khỏi ngăn xếp ràng buộc" msgctxt "Operator" msgid "Disable and Keep Transform" -msgstr "Tắt Và Giữ Biến Hóa" +msgstr "Tắt nhưng Duy Trì Biến Hóa" msgid "Set the influence of this constraint to zero while trying to maintain the object's transformation. Other active constraints can still influence the final transformation" -msgstr "Đặt sự ảnh hưởng của ràng buộc này bằng không khi đang thử giữ biến hóa của vật thể. Các ràng buộc hoạt động khác vẫn có thể ảnh hưởng biến hóa cuối cùng" +msgstr "Đặt ảnh hưởng của ràng buộc này bằng 0 trong khi cố gắng duy trì biến hóa của đối tượng. Những ràng buộc đang hoạt động khác vẫn có thể tác động tới biến hóa cuối cùng" msgctxt "Operator" msgid "Auto Animate Path" -msgstr "Đường Đi Hoạt Hình Tự Động" +msgstr "Tự Động Hoạt Họa Đường Dẫn" msgid "Add default animation for path used by constraint if it isn't animated already" -msgstr "Thêm hoạt hình mặc định cho đường đi thì ràng buộc đang dùng nếu nó chưa có hoạt hình rồi" +msgstr "Thêm hoạt họa mặc định cho đường chuyển động mà ràng buộc sử dụng, nếu nó chưa được hoạt họa" msgid "First frame of path animation" -msgstr "Bức ảnh đầu của hoạt hình đường đi" +msgstr "Khung hình đầu tiên của hoạt họa theo đường dẫn" msgid "Number of frames that path animation should take" -msgstr "Số lượng bức ảnh cho hoạt hình đường đi" +msgstr "Lượng khung hình mà hoạt họa theo đường dẫn cần có" msgctxt "Operator" msgid "Reset Distance" -msgstr "Đặt Lại Khoảng Cách" +msgstr "Hoàn Lại Khoảng Cách" msgid "Reset limiting distance for Limit Distance Constraint" -msgstr "Đặt lại khoảng cách hạn chế cho Ràng Buộc Hạn Chế khoảng Cách" +msgstr "Hoàn lại khoảng cách hạn chế cho Ràng Buộc Khoảng Cách Giới Hạn" msgctxt "Operator" msgid "Move Constraint Down" -msgstr "Di Chuyển Ràng Buộc Dưới" +msgstr "Di Chuyển Ràng Buộc Xuống" msgid "Move constraint down in constraint stack" -msgstr "Di chuyển ràng buộc xuống trong xếp đống ràng buộc" +msgstr "Di chuyển ràng buộc xuống trong ngăn xếp ràng buộc" msgctxt "Operator" @@ -49541,37 +53807,37 @@ msgstr "Di Chuyển Ràng Buộc đến Chỉ Số" msgid "Change the constraint's position in the list so it evaluates after the set number of others" -msgstr "Đổi vị trí của ràng buộc trong danh sách cho nó được tính toán sau một số lượng đồ khác" +msgstr "Đổi chỗ của ràng buộc trong danh sách, hầu cho nó được tính toán sau những cái khác" msgid "The index to move the constraint to" -msgstr "Chỉ số để di chuyển ràng buộc đến" +msgstr "Chỉ số để di chuyển ràng buộc tới" msgctxt "Operator" msgid "Move Constraint Up" -msgstr "Di Chuyển Ràng Buộc Trên" +msgstr "Di Chuyển Ràng Buộc Lên" msgid "Move constraint up in constraint stack" -msgstr "Di chuyển ràng buộc lên trong xếp đống ràng buộc" +msgstr "Di chuyển ràng buộc lên trong ngăn xếp ràng buộc" msgctxt "Operator" msgid "Normalize Weights" -msgstr "Đơn Vị Hóa Quyền Lượng" +msgstr "Bình Thường Hóa Trọng Lượng" msgid "Normalize weights of all target bones" -msgstr "Đơn vị hóa quyền lượng của tất cả xương mục tiêu" +msgstr "Bình thường hóa trọng lượng của toàn bộ các xương" msgid "Clear inverse correction for Object Solver constraint" -msgstr "Xóa chỉnh sửa đảo nghịch cho ràng buộc Bộ Giải Nghiệm Vật Thể" +msgstr "Xóa chỉnh sửa đảo ngược cho ràng buộc Giải Nghiệm Đối Tượng" msgid "Set inverse correction for Object Solver constraint" -msgstr "Đặt chỉnh sửa đảo nghịch cho ràng buộc Trình Giải Nghiệm Vật Thể" +msgstr "Đặt chỉnh sửa đảo ngược cho ràng buộc Giải Nghiệm Đối Tượng" msgctxt "Operator" @@ -49580,51 +53846,97 @@ msgstr "Xóa Mục Tiêu" msgid "Remove the target from the constraint" -msgstr "Xóa mục tiêu từ ràng buộc" +msgstr "Xóa mục tiêu khỏi ràng buộc" msgctxt "Operator" msgid "Reset Original Length" -msgstr "Đặt Lại Chiều Dài Ban Đầu" +msgstr "Hoàn Lại Chiều Dài Gốc" msgid "Reset original length of bone for Stretch To Constraint" -msgstr "Đặt lại bề dài ban đầu của xương cho Ràng Buộc Kéo Dài Đến" +msgstr "Hoàn lại chiều dài nguyên thủy của xương đối với Ràng Buộc Kéo Giãn Tới" + + +msgctxt "Operator" +msgid "Set Attribute" +msgstr "Đặt Thuộc Tính" + + +msgid "Set values of the active attribute for selected elements" +msgstr "Đặt giá trị của thuộc tính đang hoạt động cho các phần tử đã chọn" msgctxt "Operator" msgid "Convert Particle System to Curves" -msgstr "Biến Hóa Hệ Thống Hạt sang Đường Cong" +msgstr "Chuyển Đổi Hệ Thống Hạt thành các Đường Cong" msgid "Add a new curves object based on the current state of the particle system" -msgstr "Thêm một vật thể đường cong mới tùy theo trạng thái hiện tại của hệ thống hạt" +msgstr "Thêm một đối tượng đường cong mới dựa trên trạng thái hiện tại của hệ thống hạt" msgctxt "Operator" msgid "Convert Curves to Particle System" -msgstr "Biến Đổi Đường Cong sang Hệ Thống Hạt" +msgstr "Chuyển Đổi Đường Cong thành Hệ Thống Hạt" msgid "Add a new or update an existing hair particle system on the surface object" -msgstr "Thêm hay nâng cấp một hệ thống hạt tóc đang tồn tại trên bề mặt vật thể" +msgstr "Thêm một hệ thống hạt mới hoặc cập nhật hệ thống hạt về tóc hiện có trên đối tượng bề mặt" + + +msgid "Remove selected control points or curves" +msgstr "Xóa các điểm điều khiển hoặc các đường cong đã chọn" msgctxt "Operator" msgid "Curve Sculpt Mode Toggle" -msgstr "Bật/Tắt Chế Đồ Khắc Đường Cong" +msgstr "Bật/Tắt Chế Độ Điêu Khắc Đường Cong" msgid "Enter/Exit sculpt mode for curves" -msgstr "Nhập/Xuất chế độ khắc cho đường cong" +msgstr "Bước Vào/Thoát Khỏi chế độ điêu khắc cho các đường cong" msgid "(De)select all control points" -msgstr "Chọn/thả hết điểm kiểm soát" +msgstr "Chọn/hủy chọn toàn bộ các điểm điều khiển" + + +msgctxt "Operator" +msgid "Select Ends" +msgstr "Chọn Đầu Cuối" msgid "Select end points of curves" -msgstr "Chọn các điểm kết thúc của các đường cong" +msgstr "Chọn các điểm cuối của đường cong" + + +msgid "Amount Back" +msgstr "Số Đằng Sau" + + +msgid "Number of points to select from the back" +msgstr "Số điểm để chọn từ phía sau" + + +msgid "Amount Front" +msgstr "Số Đằng Trước" + + +msgid "Number of points to select from the front" +msgstr "Số điểm để chọn từ phía trước" + + +msgid "Shrink the selection by one point" +msgstr "Thu hẹp vùng lựa chọn xuống một điểm" + + +msgid "Select all points in curves with any point selection" +msgstr "Chọn toàn bộ các điểm trong đường cong với bất kỳ lựa chọn điểm nào" + + +msgid "Grow the selection by one point" +msgstr "Tăng lựa chọn lên một điểm" msgctxt "Operator" @@ -49633,7 +53945,7 @@ msgstr "Chọn Ngẫu Nhiên" msgid "Randomizes existing selection or create new random selection" -msgstr "Ngẫu nhiên hóa sự lựa chọn hiện tại hay tạo một sự lựa chọn ngẫu nhiên mới" +msgstr "Ngẫu nhiên hóa lựa chọn hiện có hoặc kiến tạo lựa chọn ngẫu nhiên mới" msgid "Probability" @@ -49641,7 +53953,7 @@ msgstr "Xác Suất" msgid "Chance of every point or curve being included in the selection" -msgstr "Xác suát của mỗi điểm hay đường cong đang gồm và sự lựa chọn" +msgstr "Cơ hội của mỗi điểm hoặc đường cong được đưa vào trong lựa chọn" msgid "Source of randomness" @@ -49650,110 +53962,110 @@ msgstr "Nguồn của sự ngẫu nhiên" msgctxt "Operator" msgid "Set Select Mode" -msgstr "Đặt Chế Độ Chọn" +msgstr "Đặt Chế Độ Lựa Chọn" msgid "Change the mode used for selection masking in curves sculpt mode" -msgstr "Đổi chế độ được dùng cho mặt nạ sự lựa chọn trong chế độ khắc đường cong" +msgstr "Đổi chế độ sử dụng để chắn lọc lựa chọn trong chế độ điêu khắc đường cong" msgctxt "Operator" msgid "Snap Curves to Surface" -msgstr "Hút Dính Đường Cong đến Bề Mặt" +msgstr "Bám Dính Đường Cong vào Bề Mặt" msgid "Move curves so that the first point is exactly on the surface mesh" -msgstr "Di chuyển đường cong cho điểm đầu nằm chính xác trên bề mặt mạng lưới" +msgstr "Di chuyển các đường cong để điểm đầu tiên nằm chính xác trên khung lưới bề mặt" msgid "Attach Mode" -msgstr "Chế Độ Gắn" +msgstr "Chế Độ Gắn Vào" msgid "How to find the point on the surface to attach to" -msgstr "Phương pháp cho tìm điểm gắn trên bề mặt" +msgstr "Cách tìm điểm trên bề mặt để gắn vào" msgid "Find the closest point on the surface for the root point of every curve and move the root there" -msgstr "Tìm điểm gần nhất trên bề mặt cho điểm rễ của mỗi đường cong và di chuyển rễ đến đó" +msgstr "Tìm điểm gần nhất trên bề mặt đối với điểm gốc của mọi đường cong và di chuyển gốc tới đó" msgid "Re-attach curves to a deformed surface using the existing attachment information. This only works when the topology of the surface mesh has not changed" -msgstr "Gắn lại các đường cong đến một bề mặt bị méo hóa bằng dùng thông tin gắn bó. Cái này chỉ hoạt động khi tô pô của mạng lưới bề mặt không thay đổi" +msgstr "Gắn lại các đường cong vào bề mặt biến dạng bằng cách sử dụng thông tin đính kèm hiện có. Chức năng này chỉ hoạt động khi cấu trúc liên kết của khung lưới bề mặt chưa thay đổi mà thôi" msgctxt "Operator" msgid "Set Curves Surface Object" -msgstr "Đặt Vật Thể Bề Mặt Đường Cong" +msgstr "Đặt Đối Tượng Bề Mặt Đường Cong" msgid "Use the active object as surface for selected curves objects and set it as the parent" -msgstr "Dùng vật thể hoạt động làm bề mặt cho các đường cong đươc chọn và đặt nó là phụ huynh" +msgstr "Sử dụng đối tượng đang hoạt động làm bề mặt cho các đối tượng đường cong đã chọn và đặt nó làm phụ huynh" msgctxt "Operator" msgid "Toggle Cyclic" -msgstr "Bật/Tắt Chu Trình" +msgstr "Bật/Tắt tính Tuần Hoàn" msgid "Make active spline closed/opened loop" -msgstr "Làm mẫu cong hoạt động thành cong vòng mở/đóng" +msgstr "Làm cho chốt trục đang hoạt động trở thành vòng kín/mở" msgid "Direction to make surface cyclic in" -msgstr "Hướng để làm mặt thành chu trình" +msgstr "Chiều hướng để làm cho bề mặt tuần hoàn" msgid "Cyclic U" -msgstr "Chu Trình U" +msgstr "Tuần Hoàn U" msgid "Cyclic V" -msgstr "Chu Trình V" +msgstr "Tuần Hoàn V" msgctxt "Operator" msgid "(De)select First" -msgstr "Chọn/Thả Đầu" +msgstr "Chọn/Hủy Chọn Phần Đầu Tiên" msgid "(De)select first of visible part of each NURBS" -msgstr "Chọn/thả đầu của phần hiển thị của mỗi mặt NURBS" +msgstr "Chọn/Hủy chọn phần đầu tiên nhìn thấy được của mỗi NURBS (Non-uniform rational basis spline)" msgctxt "Operator" msgid "(De)select Last" -msgstr "Chọn/Thả Cuối" +msgstr "Chọn/Hủy Chọn Phần Cuối Cùng" msgid "(De)select last of visible part of each NURBS" -msgstr "Chọn/thả cuối của phần hiển thị của mỗi mặt NURBS" +msgstr "Chọn/Hủy chọn phần cuối cùng nhìn thấy được của mỗi NURBS (Non-uniform rational basis spline)" msgctxt "Operator" msgid "Decimate Curve" -msgstr "Chẻ Cắt Đường Cong" +msgstr "Tiêu Hao Đường Cong" msgid "Simplify selected curves" -msgstr "Đơn giản hóa các đường cong được chọn" +msgstr "Đơn giản hóa các đường cong đã chọn" msgid "Delete selected control points or segments" -msgstr "Xoá các điểm kiểm soát hay khú" +msgstr "Xóa các điểm điều khiển hay các phân đoạn" msgid "Which elements to delete" -msgstr "Xoá các phần tử nào" +msgstr "Phần tử nào để xoá" msgctxt "Operator" msgid "Dissolve Vertices" -msgstr "Hòa Tan Đỉnh" +msgstr "Tiêu Hủy Điểm Đỉnh" msgid "Delete selected control points, correcting surrounding handles" -msgstr "Xóa các điểm kiểm soát, sửa tay cầm xung quanh" +msgstr "Xóa các điểm điều khiển, chỉnh sửa các tay cầm chung quanh" msgctxt "Operator" @@ -49762,369 +54074,369 @@ msgstr "Vẽ Đường Cong" msgid "Draw a freehand spline" -msgstr "Vẽ một mẫu cong tự do" +msgstr "Vẽ một chốt trục tự do" msgid "Error distance threshold (in object units)" -msgstr "Ngưỡng khoảng cách lỗi lầm (đơn vị vật thể) " +msgstr "Giới hạn khoảng cách sai số (đơn vị đối tượng)" msgctxt "Operator" msgid "Duplicate Curve" -msgstr "Sao Chép Đường Cong" +msgstr "Nhân Đôi Đường Cong" msgid "Duplicate selected control points" -msgstr "Sao chép các điểm kiểm soát được chọn" +msgstr "Nhân đôi các điểm điều khiển đã chọn" msgctxt "Operator" msgid "Add Duplicate" -msgstr "Thêm Sao Chép" +msgstr "Thêm Bản Nhân Đôi" msgid "Duplicate curve and move" -msgstr "Sao chép đường cong và di chuyển" +msgstr "Nhân đôi đường cong và di chuyển bản sao" msgid "Duplicate Curve" -msgstr "Sao Chép Đường Cong" +msgstr "Nhân Đôi Đường Cong" msgid "Extrude selected control point(s)" -msgstr "Kéo ra các điểm kiểm soát được chọn" +msgstr "Đẩy trồi các điểm điều khiển đã chọn ra" msgid "Init" -msgstr "Khởi Đồu" +msgstr "Khởi Thủy" msgid "Resize" -msgstr "Chỉnh Kích Cỡ" +msgstr "Đổi Kích Thước" msgid "Skin Resize" -msgstr "Chỉnh Kích Cỡ Da" +msgstr "Đổi Kích Thước của Da" msgid "To Sphere" -msgstr "Đến Hình Cầu" +msgstr "Thành Hình Cầu" msgid "Bend" -msgstr "Bể Cong" +msgstr "Uốn Cong" msgid "Shrink/Fatten" -msgstr "Thu Nhỏ/Phình Lên" +msgstr "Thu Nhỏ/Phình To" msgid "Trackball" -msgstr "Trái Banh Điều Khiển" +msgstr "Hòn Bi Điều Khiển" msgid "Push/Pull" -msgstr "Đẩy/Kéo" +msgstr "Đẩn/Kéo" msgid "Vertex Crease" -msgstr "Nhăn Đỉnh" +msgstr "Nếp Gấp Điểm Đỉnh" msgid "Bone Size" -msgstr "Kích Cỡ Xương" +msgstr "Cỡ Xương" msgid "Bone Envelope" -msgstr "Bao Bì Xương" +msgstr "Phong Bao Xương" msgid "Bone Envelope Distance" -msgstr "Quãng Bao Bì Xương" +msgstr "Khoảng Cách Phong Bao Xương" msgid "Curve Shrink/Fatten" -msgstr "Thu Nhỏ/Phình Mập Đường Cong" +msgstr "Đường Cong: Thu Nhỏ/Phình To" msgid "Mask Shrink/Fatten" -msgstr "Thu Nhỏ/Phình Mập Mặt Nạ" +msgstr "Màn Chắn Lọc: Thu Nhỏ/Phình To" msgid "Grease Pencil Shrink/Fatten" -msgstr "Thu Nhỏ/Phình Mập Bút Sáp" +msgstr "Bút Chì Dầu: Thu Nhỏ/Phình To" msgid "Time Translate" -msgstr "Dịch ThờiGian" +msgstr "Dịch Chuyển Thời Gian" msgid "Time Slide" -msgstr "Trượt ThờiGian" +msgstr "Trượt Đẩy Thời Gian" msgid "Time Extend" -msgstr "KéoDài ThờiGian" +msgstr "Nới Thời Gian" msgid "Bake Time" -msgstr "ThờiGian Nướng" +msgstr "Thời Gian Nướng" msgid "Edge Slide" -msgstr "Trượt Cạnh" +msgstr "Trượt Đẩy Cạnh" msgid "Sequence Slide" -msgstr "Trượt Trình Tự" +msgstr "Trượt Đẩy Trình Tự" msgid "Grease Pencil Opacity" -msgstr "Độ Đục Bút Sáp" +msgstr "Độ Đục của Bút Chì Dầu" msgctxt "Operator" msgid "Extrude Curve and Move" -msgstr "Kéo Ra Đường Cong Và Di Chuyển" +msgstr "Đẩy Trồi Đường Cong và Di Chuyển" msgid "Extrude curve and move result" -msgstr "Kẻo ra đường cong và di chuyển kết qủa" +msgstr "Đẩy trồi đường cong và di chuyển kết quả" msgctxt "Operator" msgid "Set Handle Type" -msgstr "Đặt Loại Tay Cầm" +msgstr "Đặt Kiểu Tay Cầm" msgid "Set type of handles for selected control points" -msgstr "Đặt loại tay cầm cho điểm kiểm soát được chọn" +msgstr "Đặt kiểu tay cầm cho các điểm điều khiển được chọn" msgid "Spline type" -msgstr "Loại Mẫu Cong" +msgstr "Thể loại chốt trục" msgid "Toggle Free/Align" -msgstr "Bất/Tắt Tự Do/Sắp Xếp" +msgstr "Bật/Tắt Tự Do/Thẳng Hàng" msgid "Hide (un)selected control points" -msgstr "Ẩn điểm kiểm soát được chọn" +msgstr "Ẩn giấu các điểm điều khiển (được/chưa) chọn" msgctxt "Operator" msgid "Make Segment" -msgstr "Chế Tạo Khúc" +msgstr "Tạo Phân Đoạn" msgid "Join two curves by their selected ends" -msgstr "Kết nối điểm kết thúc của hai đường cong" +msgstr "Chắp nối hai đường cong với nhau bằng đầu kết của chúng" msgctxt "Operator" msgid "Match Texture Space" -msgstr "Tìm Không Gian Chất Liệu Giống" +msgstr "Xứng Hợp với Không Gian Chất Liệu" msgid "Match texture space to object's bounding box" -msgstr "Làm không gian chất liệu giống bao bì của vật thể" +msgstr "Khớp không gian chất liệu với khung hộp viền của đối tượng" msgctxt "Operator" msgid "Recalculate Handles" -msgstr "Tính Lại Tay Cầm" +msgstr "Tính Toán Lại các Tay Cầm" msgid "Recalculate the direction of selected handles" -msgstr "Tính lại hướng của tay cầm được lựa chọn" +msgstr "Tính lại chiều hướng của các tay cầm đã chọn" msgid "Recalculate handle length" -msgstr "Tính lại bề dài tay cầm" +msgstr "Tính lại chiều dài của tay cầm" msgctxt "Operator" msgid "Curve Pen" -msgstr "Bút Đường Cong" +msgstr "Bút Vẽ Đường Cong" msgid "Construct and edit splines" -msgstr "Chế tạo và biên tập mẫu cong" +msgstr "Kiến tạo và biên soạn các chốt trục" msgid "Close Spline" -msgstr "Đóng Mẫu Cong" +msgstr "Đóng Kín Chốt Trục" msgid "Make a spline cyclic by clicking endpoints" -msgstr "Chu trình hóa mẫu cong bằng bấm hai điểm đầu và cuối" +msgstr "Làm cho chốt trục tuần hoàn bằng cách nhấp vào các điểm cuối" msgid "Close Spline Method" -msgstr "Phương Pháp Đóng Mẫu Cong" +msgstr "Phương Pháp Đóng Kín Chốt Trục" msgid "The condition for close spline to activate" -msgstr "Điều kiệu cho hoạt động đóng mẫu cộng" +msgstr "Điều kiện để kích hoạt quá trình đóng kín chốt trục" msgid "On Press" -msgstr "Khi Bấm" +msgstr "Khi Ấn" msgid "Move handles after closing the spline" -msgstr "Di chuyển tay cầm sau đóng mẫu cong" +msgstr "Di chuyển các tay cầm sau khi đóng chốt trục lại" msgid "On Click" -msgstr "Khi Bấm" +msgstr "Khi Nhấp Chuột" msgid "Spline closes on release if not dragged" -msgstr "Mẫu công sẽ đóng nếu không kéo nó khi thả" +msgstr "Chốt Trục sẽ được đóng kín khi thả ra nếu không được kéo rê" msgid "Cycle Handle Type" -msgstr "Chu Trình Qua Loại Tay Cầm" +msgstr "Đặt Kiểu Tay Cầm" msgid "Cycle between all four handle types" -msgstr "Chu trình qua hết bốn loại tay cầm " +msgstr "Luân chuyển giữa toàn bộ bốn kiểu tay cầm" msgid "Delete Point" -msgstr "Xoá Điểm" +msgstr "Xóa Điểm" msgid "Delete an existing point" -msgstr "Xóa một điểm tồn tại" +msgstr "Xóa một điểm hiện có" msgid "Remove from selection" -msgstr "Xóa từ sự lựa chọn" +msgstr "Loại bỏ khỏi lựa chọn" msgid "Extrude Handle Type" -msgstr "Kéo Ra Loại Tay Cầm" +msgstr "Kiểu Tay Cầm Đẩy Trồi" msgid "Type of the extruded handle" -msgstr "Loại của tay cầm được kéo ra" +msgstr "Loại tay cầm đẩy trồi" msgid "Extrude Point" -msgstr "Kéo Ra Điểm" +msgstr "Đẩy Trồi Điểm" msgid "Add a point connected to the last selected point" -msgstr "Thêm một điểm kết nối với điểm cuối được chọn" +msgstr "Thêm một điểm kết nối với điểm đã chọn sau cùng" msgid "Insert Point" -msgstr "Điểm Chèn" +msgstr "Chèn Điểm" msgid "Insert Point into a curve segment" -msgstr "Chèn điểm vào một khúc đường cong" +msgstr "Chèn Điểm vào một phân đoạn đường cong" msgid "Move Point" -msgstr "Di Chuyển Đỉểm" +msgstr "Di Chuyển Điểm" msgid "Move a point or its handles" -msgstr "Di chuyển một điểm hay tay cầm của nó" +msgstr "Di chuyển một điểm hoặc các tay cầm của nó" msgid "Move Segment" -msgstr "Di Chuyển Khúc" +msgstr "Di Chuyển Phân Đoạn" msgid "Only Select Unselected" -msgstr "Chỉ Chọn Chưa Được Chọn" +msgstr "Duy Chọn cái Chưa Được Chọn" msgid "Ignore the select action when the element is already selected" -msgstr "Không quan tâm hành động lựa chọn khi phần tử được chọn rồi" +msgstr "Bỏ qua hành động lựa chọn khi phần tử đã được chọn rồi" msgid "Select Point" -msgstr "Điểm Chọn" +msgstr "Chọn Điểm" msgid "Select a point or its handles" -msgstr "Chọn một điểm hay tay cầm của nó" +msgstr "Chọn một điểm hoặc các tay cầm của nó" msgid "Toggle Selection" -msgstr "Bật/Tắt Sự Lựa Chọn" +msgstr "Bật/Tắt Lựa Chọn" msgid "Toggle the selection" -msgstr "Chọn/thả sự lựa chọn" +msgstr "Lật đảo sự lựa chọn" msgid "Toggle Vector" -msgstr "Bật/Tắt Vectơ" +msgstr "Bật/Tắt Véctơ" msgid "Toggle between Vector and Auto handles" -msgstr "Bật/tắt gip~a tay cầm Vectơ và Tự Động" +msgstr "Đổi các tay cầm thành Véctơ hoặc Tự động" msgctxt "Operator" msgid "Add Bezier Circle" -msgstr "Thêm Vòng Tròn Bezier" +msgstr "Thêm Vòng Tròn Bézier" msgid "Construct a Bezier Circle" -msgstr "Chế tạo một Vòng Tròn Bezier" +msgstr "Kiến Tạo Vòng Tròn Bézier" msgid "The alignment of the new object" -msgstr "Sắp xếp của vật thể mới" +msgstr "Sự căn chỉnh của đối tượng mới" msgid "Align the new object to the world" -msgstr "Sắp xếp vật thể mới với thế giới" +msgstr "Căn chỉnh đối tượng mới theo thế giới" msgid "Align the new object to the view" -msgstr "Sắp xếp vật thể mới với màn" +msgstr "Căn chỉnh đối tượng mới hướng theo góc nhìn" msgid "Use the 3D cursor orientation for the new object" -msgstr "Dùng định hướng của con trỏ 3D cho vật thể mới" +msgstr "Sử dụng định hướng của con trỏ 3D cho đối tượng mới" msgid "Enter Edit Mode" -msgstr "Vào Chế Độ Biên Tập" +msgstr "Chuyển Sang Chế Độ Biên Soạn" msgid "Enter edit mode when adding this object" -msgstr "Nhập vào chế độ biên tập khi thêm vật thể này" +msgstr "Chuyển ngay sang chế độ biên soạn, khi cho thêm đối tượng này" msgid "Location for the newly added object" -msgstr "Vị trí cho vật thể mới chế tạo" +msgstr "Vị trí cho đối tượng mới được thêm" msgid "Rotation for the newly added object" -msgstr "Góc xoay cho vật thể mới chế tạo" +msgstr "Góc xoay chiều cho đối tượng mới được thêm" msgid "Scale for the newly added object" -msgstr "Phóng to cho vật thể mới thêm" +msgstr "Tỷ lệ dành cho đối tượng mới được thêm vào" msgctxt "Operator" msgid "Add Bezier" -msgstr "Thêm Bezier" +msgstr "Thêm Bézier" msgid "Construct a Bezier Curve" -msgstr "Chế tạo một Cong Bezier" +msgstr "Tạo một đường cong Bézier" msgctxt "Operator" @@ -50133,58 +54445,58 @@ msgstr "Thêm Vòng Tròn NURBS" msgid "Construct a Nurbs Circle" -msgstr "Chế tạo một vòng tròn NURBS" +msgstr "Tạo một vòng tròn NURBS (Non-uniform rational basis spline)" msgctxt "Operator" msgid "Add Nurbs Curve" -msgstr "Thêm Cong NURBS" +msgstr "Thêm Đường Cong NURBS" msgid "Construct a Nurbs Curve" -msgstr "Tạo một đường Cong NURBS" +msgstr "Kiến tạo một Đường Cong NURBS" msgctxt "Operator" msgid "Add Path" -msgstr "Thêm Đường" +msgstr "Thêm Đường Dẫn" msgid "Construct a Path" -msgstr "Tạo một Đường" +msgstr "Kiến Tạo một Đường Dẫn" msgctxt "Operator" msgid "Set Curve Radius" -msgstr "Đặt Bán Kính Cong" +msgstr "Đặt Bán Kính Đường Cong" msgid "Set per-point radius which is used for bevel tapering" -msgstr "Đặt bán kính từ điểm cho làm nến cạnh tròn" +msgstr "Đặt bán kính cho mỗi điểm để sử dụng cho quá trình vuốt thon bo tròn" msgid "Reveal hidden control points" -msgstr "Hiển thị điểm kiểm soát được ẩn" +msgstr "Hiển thị những điểm điều khiển ẩn giấu" msgid "Deselect control points at the boundary of each selection region" -msgstr "Thả điểm kiểm soát tại ranh giới của khu vực được chọn" +msgstr "Hủy chọn các điểm điều khiển tại ranh giới của mỗi vùng lựa chọn" msgid "Select all control points linked to the current selection" -msgstr "Chọn tất cả điểm kiểm soát được liên kết với sự lựa chọn hiện tại" +msgstr "Chọn toàn bộ các điểm điều khiển kết nối với sự lựa chọn hiện tại" msgid "Select all control points linked to already selected ones" -msgstr "Chọn tất cả điểm kiểm soát được liên kết với điểm được chọn rồi" +msgstr "Chọn toàn bộ các điểm điều khiển kết nối với các điểm đã chọn rồi" msgid "Deselect linked control points rather than selecting them" -msgstr "Thả điểm kiểm soát được liên kết thay thế chọn nó" +msgstr "Hủy chọn các điểm điều khiển, thay vì lựa chọn chúng" msgid "Select control points at the boundary of each selection region" -msgstr "Thả điểm kiểm soát tại ranh giới của khu vực được chọn" +msgstr "Lựa chọn các điểm điều khiển tại ranh giới của mỗi vùng lựa chọn" msgctxt "Operator" @@ -50193,66 +54505,66 @@ msgstr "Chọn Tiếp Theo" msgid "Select control points following already selected ones along the curves" -msgstr "Chọn điểm kiểm soát trên đường cong tiếp theo sau các điềm được chọn rồi trên đường cong" +msgstr "Chọn các điểm điều khiển nằm tiếp theo với những cái đã chọn rồi, dọc theo đường cong" msgctxt "Operator" msgid "Checker Deselect" -msgstr "Thá Lẻ" +msgstr "Hủy Chọn So Le" msgid "Deselect every Nth point starting from the active one" -msgstr "Thả mỗi phần tử thứ N bắt đầu từ phần tử hoạt động" +msgstr "Không chọn các điểm tại vị trí N (nhảy cách), khởi đầu từ cái đang hoạt động" msgid "Number of selected elements in the repetitive sequence" -msgstr "Số lượng của phần tử được chọn trong trình tự lặp lại" +msgstr "Số phần tử được chọn trong trình tự lặp lại" msgid "Offset from the starting point" -msgstr "Dịch từ điểm bắt đầu" +msgstr "Dịch chuyển từ điểm khởi đầu" msgid "Deselected" -msgstr "Được Thả" +msgstr "Hủy Chọn" msgid "Number of deselected elements in the repetitive sequence" -msgstr "Số lượng phần tử được thả trong trình tự lặp lại" +msgstr "Số phần tử không chọn trong trình tự lặp lại" msgctxt "Operator" msgid "Select Previous" -msgstr "Chọn Trước" +msgstr "Chọn Đằng Trước" msgid "Select control points preceding already selected ones along the curves" -msgstr "Chọn điểm kiểm soát trên đường cong phía trước các điểm được chọn rồi" +msgstr "Chọn những điểm điều khiển, dọc theo đường cong, đứng trước những cái đã được chọn rồi" msgid "Randomly select some control points" -msgstr "Ngẫu nhiên chọn vài điểm kiểm soát" +msgstr "Chọn một số điểm điều khiển một cách ngẫu nhiên" msgid "Portion of items to select randomly" -msgstr "Số phân của mặt hàng để chọn ngẫu nhiên" +msgstr "Phần của các mục để chọn một cách ngẫu nhiên" msgid "Seed for the random number generator" -msgstr "Số hạt cho bộ phát số ngẫu nhiên" +msgstr "Mầm dành cho máy phát sinh số ngẫu nhiên" msgctxt "Operator" msgid "Select Control Point Row" -msgstr "Chọn Hàng Điểm Kiểm Soát" +msgstr "Chọn Dãy Điểm Điều Khiển" msgid "Select a row of control points including active one" -msgstr "Chọn một hàng điểm kiểm soát gồm điểm hoạt động" +msgstr "Chọn một dãy các điểm điều khiển, bao gồm cả cái đang hoạt động" msgid "Select similar curve points by property type" -msgstr "Chọn điểm đường cong giống tùy loại đặc trưng" +msgstr "Chọn các điểm đường cong tương đồng về thể loại tính chất" msgid "Greater" @@ -50260,52 +54572,52 @@ msgstr "Lớn Hơn" msgid "Less" -msgstr "Nhỏ Hơn" +msgstr "Giảm" msgctxt "Operator" msgid "Separate" -msgstr "Rút" +msgstr "Tách Rời" msgid "Separate selected points from connected unselected points into a new object" -msgstr "Rút điểm được chọn từ các điểm chưa chọn và chế tạo vật thể mới" +msgstr "Tách rời các điểm được chọn ra khỏi các điểm chưa chọn thành một đối tượng mới" msgctxt "Operator" msgid "Shade Flat" -msgstr "Tô Sắc Bằng Phẳng" +msgstr "Tô Bóng Phẳng" msgid "Set shading to flat" -msgstr "Đặt tô sắc bằng phẳng" +msgstr "Tô bóng phẳng bẹt" msgctxt "Operator" msgid "Shade Smooth" -msgstr "Tô Sắc Mịn" +msgstr "Tô Bóng Mịn Màng" msgid "Set shading to smooth" -msgstr "Đặt tô bóng mịn" +msgstr "Đặt tô bóng mịn màng" msgid "Select shortest path between two selections" -msgstr "Chọn đường ngăn nhất giữa hai sự lựa chọn" +msgstr "Chọn đường dẫn ngắn nhất giữa hai lựa chọn" msgctxt "Operator" msgid "Smooth" -msgstr "Mịn" +msgstr "Làm Mịn" msgid "Flatten angles of selected points" -msgstr "Giảm góc của điểm được chọn" +msgstr "Làm bẹt các góc của những điểm được chọn" msgctxt "Operator" msgid "Smooth Curve Radius" -msgstr "Mịn Bán Kính Đường Cong" +msgstr "Làm Mịn Bán Kính Đường Cong" msgid "Interpolate radii of selected points" @@ -50314,46 +54626,46 @@ msgstr "Nội suy bán kính của các điểm được chọn" msgctxt "Operator" msgid "Smooth Curve Tilt" -msgstr "Mịn Hóa Nghieng Đường Cong" +msgstr "Làm Mịn sự Xoay Nghiêng của Đường Cong" msgid "Interpolate tilt of selected points" -msgstr "Nội suy độ nghiêng của các điểm được chọn" +msgstr "Nội suy sự xoay nghiêng của các điểm được chọn" msgctxt "Operator" msgid "Smooth Curve Weight" -msgstr "Mịn Hóa Quyền Lượng Đường Cong" +msgstr "Làm Mịn Trọng Lượng Đường Cong" msgid "Interpolate weight of selected points" -msgstr "Suy nội quyền lượng của điểm được chọn" +msgstr "Nội suy trọng lượng của các điểm lựa chọn" msgctxt "Operator" msgid "Spin" -msgstr "Xoay" +msgstr "Xoáy" msgid "Extrude selected boundary row around pivot point and current view axis" -msgstr "Kéo dài ranh giới được chọn quanh điểm tựa và trục hiện tại của màn chiếu" +msgstr "Đẩy trồi hàng ranh giới được chọn quanh điểm tựa và trục hiện tại của khung nhìn" msgid "Axis in global view space" -msgstr "Trục trong không gian màn toàn cầu" +msgstr "Trục trong không gian khung nhìn toàn cầu" msgid "Center in global view space" -msgstr "Trung tâm trong không gian màn toàn cầu" +msgstr "Trung tâm hóa trong không gian khung nhìn toàn cầu" msgctxt "Operator" msgid "Set Spline Type" -msgstr "Đặt Loại Mẫu Cong" +msgstr "Đặt Thể Loại Chốt Trục" msgid "Set type of active spline" -msgstr "Đặt loại mẫu cong đang hoạt động" +msgstr "Đặt thể loại của chốt trục" msgid "Handles" @@ -50361,136 +54673,140 @@ msgstr "Tay Cầm" msgid "Use handles when converting bezier curves into polygons" -msgstr "Dùng tay cầm khi biến đổi cong Bezier thành đa giác" +msgstr "Sử dụng các tay cầm khi chuyển đổi các đường cong Bezier thành đa giác" msgctxt "Operator" msgid "Set Goal Weight" -msgstr "Đặt Quyền Lượng Mục Đích" +msgstr "Đặt Trọng Lượng Mục Tiêu" msgid "Set softbody goal weight for selected points" -msgstr "Đặt quyền lượng mục đích thân mềm cho điểm được chọn" +msgstr "Đặt trọng lượng mục tiêu của thân mềm cho các điểm được chọn" msgid "Split off selected points from connected unselected points" -msgstr "Rút riêng các điểm được chọn từ điểm kết nối chưa được chọn" +msgstr "Tách các điểm được chọn ra khỏi các điểm kết nối chưa chọn" msgid "Subdivide selected segments" -msgstr "Phân hoá khúc thẩng được chọn" +msgstr "Phân chia các phân đoạn được chọn" msgid "Switch direction of selected splines" -msgstr "Lật hướng của mẫu cong được chọn" +msgstr "Đảo chiều hướng của chốt trục được chọn" msgctxt "Operator" msgid "Clear Tilt" -msgstr "Xóa Nghiêng" +msgstr "Xóa Xoay Nghiêng" msgid "Clear the tilt of selected control points" -msgstr "Xóa nghiêng của điểm kiểm soát được chọn" +msgstr "Xóa sự xoay nghiêng của các điểm điều khiển lựa chọn" msgctxt "Operator" msgid "Extrude to Cursor or Add" -msgstr "Kéo Ra đến Con Trỏ hoặc Thêm" +msgstr "Đẩy Trồi tới Con Trỏ hoặc Cho Thêm" msgid "Add a new control point (linked to only selected end-curve one, if any)" -msgstr "Thêm một điểm kiểm soát mới (chỉ được liên kết với điểm cuối đường cong được chọn, nếu có)" +msgstr "Thêm điểm điều khiển mới (chỉ kết nối với điểm cuối của đường cong được chọn mà thôi, nếu có)" msgid "Location to add new vertex at" -msgstr "Vị trí cho chế tạo đỉnh mới" +msgstr "Vị trí để thêm điểm đỉnh mới vào" msgctxt "Operator" msgid "Denoise Animation" -msgstr "Giảm Huyên Náo Hoạt Hình" +msgstr "Khử Nhiễu Hoạt Họa" msgid "Denoise rendered animation sequence using current scene and view layer settings. Requires denoising data passes and output to OpenEXR multilayer files" -msgstr "Giảm huyên náo trình tự hoạt hình được kết xuất bằng sử dụng cài đặt của cảnh và lớp màn chiếu hiện tại. Nó yêu cầu có vòng dữ liệu giảm huyên náo và xuất vào tập tin OpenEXR đa lớp" +msgstr "Khử nhiễu chuỗi hoạt họa được kết xuất bằng cách sử dụng cảnh hiện tại và các sắp đặt của Tầng Góc Nhìn. Yêu cầu phải có các lượt về khử nhiễu dữ liệu và xuất ra các tập tin đa tầng lớp OpenEXR" msgid "Input Filepath" -msgstr "Đường Dẫn Ngõ Vào" +msgstr "Đường Dẫn Tập Tin Đầu Vào" msgid "File path for image to denoise. If not specified, uses the render file path and frame range from the scene" -msgstr "Đường dẫn của tập tin ảnh để giảm huyên náo. Nếu chưa được chỉ định, dùng đường dẫn kết xuất và phạm vi bức ảnh từ cảnh" +msgstr "Đường dẫn tập tin hình ảnh để khử nhiễu. Nếu không xác định thì dùng đường dẫn và khoảng khung hình từ trong cảnh" msgid "Output Filepath" -msgstr "Đường Dẫn Ngõ Xuất" +msgstr "Đường Dẫn Tập Tin Đầu Ra" msgid "If not specified, renders will be denoised in-place" -msgstr "Nếu chưa được chỉ định, sẽ giảm huyên náo kết xuất tại chỗ" +msgstr "Nếu không xác định thì các bản kết xuất sẽ được khử nhiễu tại chỗ" msgctxt "Operator" msgid "Merge Images" -msgstr "Gồm Ảnh" +msgstr "Hợp Nhất các Hình Ảnh" + + +msgid "Combine OpenEXR multi-layer images rendered with different sample ranges into one image with reduced noise" +msgstr "Kết hợp các hình ảnh đa tầng lớp OpenEXR đã kết xuất với các phạm vi mẫu khác nhau thành một hình ảnh với độ nhiễu thuyên giảm" msgid "File path for image to merge" -msgstr "Đường dẫn tập tin của ảnh để gồm" +msgstr "Đường dẫn tập tin của hình ảnh hợp nhất" msgid "File path for merged image" -msgstr "Đường dẫn tập tin của ảnh được gồm" +msgstr "Đường dẫn tập tin của hình ảnh hợp nhất" msgctxt "Operator" msgid "Use Nodes" -msgstr "Dùng Giao Điểm" +msgstr "Sử Dụng Nút" msgid "Enable nodes on a material, world or light" -msgstr "Bật giao điểm cho một vật liệu, thế giới, hay đèn" +msgstr "Kích hoạt các nút trên một chất liệu, thế giới, hay một nguồn sáng" msgctxt "Operator" msgid "Dynamic Paint Bake" -msgstr "Nướng Sơn Động Lý" +msgstr "Nướng Sơn Động Lực" msgid "Bake dynamic paint image sequence surface" -msgstr "Mặt nướng bề mặt của trình tự ảnh sơn động lý" +msgstr "Nướng bề mặt trình tự hình ảnh của sơn động lực" msgctxt "Operator" msgid "Toggle Output Layer" -msgstr "Bật/Tắt Lớp Xuất" +msgstr "Đảo Lật Tầng Đầu Ra" msgid "Add or remove Dynamic Paint output data layer" -msgstr "Thêm hay xóa lớp ngõ ra Sơn Động Lý" +msgstr "Thêm hay xóa tầng dữ liệu đầu ra của Sơn Động Lực" msgid "Output Toggle" -msgstr "Bật/Tắt Ngỏ Ra" +msgstr "Đảo Lật Đầu Ra" msgid "Output A" -msgstr "Ngõ Ra A" +msgstr "Đầu Ra A" msgid "Output B" -msgstr "Ngõ Ra B" +msgstr "Đầu Ra B" msgctxt "Operator" msgid "Add Surface Slot" -msgstr "Thêm Khe Bề Mật" +msgstr "Thêm Khe Bề Mặt" msgid "Add a new Dynamic Paint surface slot" -msgstr "Thêm một khe bề mặt Sơn Động Lý mới" +msgstr "Thêm một khe bề mặt Sơn Động Lực mới" msgctxt "Operator" @@ -50499,75 +54815,75 @@ msgstr "Xóa Khe Bề Mặt" msgid "Remove the selected surface slot" -msgstr "Xóa khe bề mặt được chọn" +msgstr "Xóa khe bề mặt đã chọn" msgctxt "Operator" msgid "Toggle Type Active" -msgstr "Bật/tắt Loại Hoạt Động" +msgstr "Bật/Tắt Trạng Thái Hoạt Động của Thể Loại" msgid "Toggle whether given type is active or not" -msgstr "Bật/tắt hành động có hoạt động hay không" +msgstr "Bật/Tắt tình trạng hoạt động của thể loại đã cho" msgctxt "Operator" msgid "Flush Edits" -msgstr "Xả Các Biên Tập" +msgstr "Đẩy các Thay Đổi ra" msgid "Flush edit data from active editing modes" -msgstr "Xả dữ liệu biên tập từ các chế độ biên tập hoạt động" +msgstr "Đẩy các dữ liệu biên soạn ra khỏi các Chế Độ Biên Soạn đang hoạt động" msgctxt "Operator" msgid "Toggle Fake User" -msgstr "Bật/Tắt Người Dùng Giả Bộ" +msgstr "Bật/Tắt Người Dùng Giả" msgctxt "Operator" msgid "Generate Preview" -msgstr "Chế Tạo Dự Khán" +msgstr "Tạo Bản Xem Trước" msgid "Create an automatic preview for the selected data-block" -msgstr "Chế tạo một dự khán tự động cho cục dữ liệu được chọn" +msgstr "Tự động kiến tạo bản xem trước cho khối dữ liệu được chọn" msgctxt "Operator" msgid "Generate Preview from Object" -msgstr "Chế Tạo Dự Khán từ Vật Thể" +msgstr "Tạo Xem Trước từ Đối Tượng" msgid "Create a preview for this asset by rendering the active object" -msgstr "Chế tạo một dự khán cho tích sản này bằng kết xuất vật thể hoạt động" +msgstr "Kiến Tạo bản xem trước cho nội dung này bằng cách kết xuất đối tượng đang hoạt động" msgctxt "Operator" msgid "Load Custom Preview" -msgstr "Nhập Dự Khán Tùy Chọn" +msgstr "Nạp Xem Trước Tùy Chỉnh" msgid "Choose an image to help identify the data-block visually" -msgstr "Chọn một ảnh để giúp phát hiện cục dữ liệu kiểu thị giác" +msgstr "Lựa chọn một hình ảnh nhằm giúp sự nhận diện khối dữ liệu một cách trực quan" msgctxt "Operator" msgid "Toggle Library Override Editable" -msgstr "Bật/Tắt Đồ Vượt Quyền Thư Viện Được Biên Tập" +msgstr "Bật/Tắt khả năng Biên Soạn Vượt Quyền Thư Viện" msgid "Set if this library override data-block can be edited" -msgstr "Đặt nếu cục dữ liệu của đồ vượt quyền thư viện này được biên soạn" +msgstr "Đặt nếu khối dữ liệu vượt quyền thư viện này có thể chỉnh sửa được" msgctxt "Operator" msgid "Unlink Data-Block" -msgstr "Gỡ Liên Két Cục Dữ Liệu" +msgstr "Tháo Gắn Kết Khối Dữ Liệu" msgid "Remove a usage of a data-block, clearing the assignment" -msgstr "Xóa sử dụng của một cục dữ liệu, xóa chỉ định" +msgstr "Xóa sự ấn định sử dụng của một khối dữ liệu" msgctxt "Operator" @@ -50576,117 +54892,117 @@ msgstr "Làm Lại" msgid "Redo previous action" -msgstr "Làm lại hành động mới làm" +msgstr "Thực hiện lại hành động trước đây" msgctxt "Operator" msgid "Undo" -msgstr "Hủy Bước" +msgstr "Hoàn Tác" msgid "Undo previous action" -msgstr "Hủy bước hành động mới làm" +msgstr "Bãi bỏ hành động trước đây" msgctxt "Operator" msgid "Undo History" -msgstr "Lịch Sử Hủy Bước" +msgstr "Lịch Sử Hoàn Tác" msgid "Redo specific action in history" -msgstr "Làm lại hành động xác định trong lịch sử" +msgstr "Tái thực hiện hành động nhất định nào đó trong lịch sử" msgid "Item" -msgstr "Mặt Hàng" +msgstr "Phần Tử" msgctxt "Operator" msgid "Undo Push" -msgstr "Hủy Đẩy" +msgstr "Hoàn Tác Đẩn" msgid "Add an undo state (internal use only)" -msgstr "Thêm một trạng thái hủy bước (chỉ dùng cho nội bộ)" +msgstr "Thêm trạng thái hoàn tác (chỉ sử dụng nội bộ mà thôi)" msgid "Undo Message" -msgstr "Tin Nhắn Hủy Bước" +msgstr "Bãi Bỏ Thông Điệp" msgctxt "Operator" msgid "Undo and Redo" -msgstr "Hủy Bước Và Làm Lại" +msgstr "Hoàn Tác và Tái Thực Hiện" msgid "Undo and redo previous action" -msgstr "Hủy bước hay làm lại hành động mới làm" +msgstr "Hoàn tác hay tái thực hiện hành động trước đây" msgctxt "Operator" msgid "Export Camera & Markers" -msgstr "Xuất Máy Quay Phim & Ký Hiệu" +msgstr "Xuất Khẩu Máy Quay Phim & các Dấu Mốc" msgid "Save a python script which re-creates cameras and markers elsewhere" -msgstr "Lưu văn thảo Python thì có thể chế tạo lại các máy quay phim và ký hiệu ở chỗ khác" +msgstr "Lưu tập lệnh Python, tức cái dùng để tái kiến tạo các máy quay phim và các dấu mốc ở nơi nào sử dụng nó" msgid "Filepath used for exporting the file" -msgstr "Đường dẫn dùng cho xuất tập tin" +msgstr "Đường dẫn tập tin sử dụng để xuất khẩu tập tin" msgid "End frame for export" -msgstr "Số bức ảnh cuối cho xuất" +msgstr "Khung hình cuối cùng để xuất khẩu" msgid "Start frame for export" -msgstr "Số bức ảnh đầu cho xuất" +msgstr "Khung hình khởi đầu để xuất khẩu" msgid "Only Selected" -msgstr "Chỉ Được Chọn" +msgstr "Duy cái Được Chọn" msgctxt "Operator" msgid "Export BVH" -msgstr "Xuất BVH" +msgstr "Xuất Khẩu BVH" msgid "Save a BVH motion capture file from an armature" -msgstr "Lưu một tập tin BVH chụp chuyển động từ một cột" +msgstr "Lưu tập tin BVH (Bounding Volume Hierarchy : Cây Phân Cấp Giới Hạn Thể Tích) nắm bắt chuyển động từ một khung cốt" msgid "End frame to export" -msgstr "Bức ảnh cuối cho xuất" +msgstr "Khung hình cuối cùng để xuất khẩu" msgid "Starting frame to export" -msgstr "Bức ảnh đầu cho xuất" +msgstr "Khung hình khởi đầu để xuất khẩu" msgid "Scale the BVH by this value" -msgstr "Giá trị cho phóng to BVH" +msgstr "Đổi tỷ lệ BVH bằng giá trị này" msgid "Root Translation Only" -msgstr "Chỉ Dịch Rễ" +msgstr "Duy Dịch Chuyển của Gốc" msgid "Only write out translation channels for the root bone" -msgstr "Chỉ lưu các kênh dịch cho xương rễ" +msgstr "Chỉ ghi lại các kênh dịch chuyển cho xương gốc mà thôi" msgid "Rotation conversion" -msgstr "Biến đổi xoay" +msgstr "Chuyển đổi sự xoay chiều" msgid "Euler (Native)" -msgstr "Euler (Thuộc Địa)" +msgstr "Euler (Bản Ngã)" msgid "Use the rotation order defined in the BVH file" -msgstr "Dùng thứ tự được chỉ định trong tập tin BVH" +msgstr "Dùng thứ tự xoay chiều đã xác định trong tập tin BVH" msgid "Euler (XYZ)" @@ -50694,7 +55010,7 @@ msgstr "Euler (XYZ)" msgid "Convert rotations to euler XYZ" -msgstr "Biến đổi xoay thành Euler XYZ" +msgstr "Chuyển đổi mọi sự xoay chiều thành Euler XYZ" msgid "Euler (XZY)" @@ -50702,7 +55018,7 @@ msgstr "Euler (XZY)" msgid "Convert rotations to euler XZY" -msgstr "Biến đổi xoay thành Euler XZY" +msgstr "Chuyển đổi mọi sự xoay chiều thành Euler XZY" msgid "Euler (YXZ)" @@ -50710,7 +55026,7 @@ msgstr "Euler (YXZ)" msgid "Convert rotations to euler YXZ" -msgstr "Biến đổi xoay thành Euler YXZ" +msgstr "Chuyển đổi mọi sự xoay chiều thành Euler YXZ" msgid "Euler (YZX)" @@ -50718,7 +55034,7 @@ msgstr "Euler (YZX)" msgid "Convert rotations to euler YZX" -msgstr "Biến đổi xoay thành Euler YZX" +msgstr "Chuyển đổi mọi sự xoay chiều thành Euler YZX" msgid "Euler (ZXY)" @@ -50726,7 +55042,7 @@ msgstr "Euler (ZXY)" msgid "Convert rotations to euler ZXY" -msgstr "Biến đổi xoay thành Euler ZXY" +msgstr "Chuyển đổi mọi sự xoay chiều thành Euler ZXY" msgid "Euler (ZYX)" @@ -50734,16 +55050,16 @@ msgstr "Euler (ZYX)" msgid "Convert rotations to euler ZYX" -msgstr "Biến đổi xoay thành Euler ZYX" +msgstr "Chuyển đổi mọi sự xoay chiều thành Euler ZYX" msgctxt "Operator" msgid "Export STL" -msgstr "Xuất STL" +msgstr "Xuất Khẩu STL" msgid "Save STL triangle mesh data" -msgstr "Lưu dữ liệu mạng lưới tam giác STL" +msgstr "Lưu dữ liệu khung lưới tam giác STL" msgid "Ascii" @@ -50751,63 +55067,63 @@ msgstr "Ascii" msgid "Save the file in ASCII file format" -msgstr "Lưu tập tin bằng định dạng tập tin ASCII" +msgstr "Lưu tập tin trong định dạng ASCII (American Standard Code for Information Interchange - Chuẩn Mã Trao Đổi Thông Tin Hoa Kỳ)" msgid "X Forward" -msgstr "X Trước" +msgstr "X Hướng Trước" msgid "Y Forward" -msgstr "Y Trước" +msgstr "Y Hướng Trước" msgid "Z Forward" -msgstr "Z Trước" +msgstr "Z Hướng Trước" msgid "-X Forward" -msgstr "-X Trước" +msgstr "-X Hướng Trước" msgid "-Y Forward" -msgstr "-Y Trước" +msgstr "-Y Hướng Trước" msgid "-Z Forward" -msgstr "-Z Trước" +msgstr "-Z Hướng Trước" msgid "X Up" -msgstr "X Trên" +msgstr "X Lên Trên" msgid "Y Up" -msgstr "Y Trên" +msgstr "Y Lên Trên" msgid "-X Up" -msgstr "-X Trên" +msgstr "-X Lên Trên" msgid "-Y Up" -msgstr "-Y Trên" +msgstr "-Y Lên Trên" msgid "-Z Up" -msgstr "-Z Trên" +msgstr "-Z Lên Trên" msgid "Batch Mode" -msgstr "Chế Độ Xấp" +msgstr "Chế Độ Thi Hành Hàng Loạt" msgid "All data in one file" -msgstr "Hết dữ liệu trong một tập tin" +msgstr "Toàn bộ các dữ liệu trong một tập tin" msgid "Each object as a file" -msgstr "Mỗi vật thể lưu một tập tin riêng" +msgstr "Mỗi đối tượng thành một tập tin" msgid "Global Space" @@ -50815,7 +55131,7 @@ msgstr "Không Gian Toàn Cầu" msgid "Export in this reference space" -msgstr "Xuất bằng không gian tham chiếu" +msgstr "Xuất khẩu trong không gian tham chiếu này" msgid "Apply Modifiers" @@ -50823,80 +55139,80 @@ msgstr "Áp Dụng Bộ Điều Chỉnh" msgid "Apply the modifiers before saving" -msgstr "Áp dụng bộ điều chỉnh trước lưu" +msgstr "Áp dụng các bộ điều chỉnh trước khi lưu" msgid "Scene Unit" -msgstr "Đơn Vị Cảnh" +msgstr "Đơn Vị của Cảnh" msgid "Apply current scene's unit (as defined by unit scale) to exported data" -msgstr "Áp dụng đơn vị của cảnh (tùy chỉ định bằng phóng to đơn vị) với dữ liệu xuất" +msgstr "Áp dụng đơn vị của cảnh (những được xác định trong thang đo) vào dữ liệu xuất khẩu" msgid "Selection Only" -msgstr "Chỉ Vật Chọn" +msgstr "Duy Lựa Chọn" msgid "Export selected objects only" -msgstr "Chỉ xuất vật thể được chọn" +msgstr "Chỉ Xuất Khẩu các đối tượng đã chọn mà thôi" msgctxt "Operator" msgid "Export FBX" -msgstr "Xuất FBX" +msgstr "Xuất Khẩu FBX" msgid "Write a FBX file" -msgstr "Lưu một tập tin FBX" +msgstr "Ghi một tập tin FBX" msgid "Add Leaf Bones" -msgstr "Thêm Xương Lá" +msgstr "Thêm Xương Ngọn" msgid "Append a final bone to the end of each chain to specify last bone length (use this when you intend to edit the armature from exported data)" -msgstr "Kèm một xương cuối tại kết thúc của mỗi chuỗi để xác định bề dài của xương cuối (dùng cái này nếu bạn muốn biên tập cốt từ dữ liệu được xuất)" +msgstr "Bổ sung thêm một xương kết thúc vào phần cuối của mỗi dây chuyền để xác định chiều dài của xương cuối cùng (sử dụng cái này nếu bạn có ý định biên soạn khung cốt từ dữ liệu được xuất khẩu)" msgid "Apply Scalings" -msgstr "Áp Dụng Phóng To" +msgstr "Áp Dụng Biến Đổi Tỷ Lệ" msgid "How to apply custom and units scalings in generated FBX file (Blender uses FBX scale to detect units on import, but many other applications do not handle the same way)" -msgstr "Làm sao để áp dụng phóng to đơn vị trong tập tin FBX được chế tạo (Blender sẽ dùng phóng to FBX để phát hiện đơn vị khi nhập tập tin, nhưng có nhiều ứng dụng khác không hoạt động như vậy)" +msgstr "Phương pháp áp dụng tỷ lệ tùy biến và thang đo trong các tập tin FBX (Filmbox:Phòng Bán Vé Phim) được sinh tạo (Blender sử dụng thang đo của FBX để phát hiện đơn vị đo lường trong khi nhập liệu, song nhiều trình ứng dụng khác không xử lý theo cùng một cách)" msgid "All Local" -msgstr "Hết Dùng Địa Phương" +msgstr "Hoàn Toàn Cục Bộ" msgid "Apply custom scaling and units scaling to each object transformation, FBX scale remains at 1.0" -msgstr "Áp dụng phóng to tùy chọn và đơn vị với mỗi biến hóa vật thể, phóng to FBX sẽ được giữ nguyên bằng 1.0" +msgstr "Áp dụng tỷ lệ tùy chỉnh và thang đo vào mỗi biến hóa của đối tượng, tỷ lệ FBX (Filmbox:Phòng Bán Vé Phim) được giữ nguyên là 1.0" msgid "FBX Units Scale" -msgstr "Phóng To Đơn Vị FBX" +msgstr "Thang Đo của FBX" msgid "Apply custom scaling to each object transformation, and units scaling to FBX scale" -msgstr "Áp dụng phóng to tùy chọn với mỗi biến hóa vật thể, và áp dụng phóng to đơn vị với phóng to FBX" +msgstr "Áp dụng tỷ lệ tùy chỉnh vào mỗi biến hóa của đối tượng, và dùng thang đo của FBX" msgid "FBX Custom Scale" -msgstr "Phóng To Tùy Chọn FBX" +msgstr "Tỷ Lệ Tùy Chỉnh FBX" msgid "Apply custom scaling to FBX scale, and units scaling to each object transformation" -msgstr "Áp dụng phóng to FBX tùy chọn với phóng to FBX, và phóng to đơn vị với mỗi biến hóa vật thể" +msgstr "Áp dùng tỷ lệ tùy chỉnh vào tỷ lệ của FBX (Filmbox:Phòng Bán Vé Phim), và áp dụng thang đo vào mỗi biến hóa của đối tượng" msgid "FBX All" -msgstr "Hết FBX" +msgstr "Hoàn Toàn FBX" msgid "Apply custom scaling and units scaling to FBX scale" -msgstr "Áp dụng phóng to và phóng to đơn vị với phóng to FBX" +msgstr "Áp dụng tỷ lệ tùy chỉnh và thang đo sang tỷ lệ của FBX (Filmbox:Phòng Bán Vé Phim)" msgid "Apply Unit" @@ -50904,11 +55220,15 @@ msgstr "Áp Dụng Đơn Vị" msgid "Take into account current Blender units settings (if unset, raw Blender Units values are used as-is)" -msgstr "Áp dụng cài đặt đơn vị hiện tại của Blender (nếu không đặt, dùng cài đặt đơn vị Blender)" +msgstr "Lưu tâm đến các sắp đặt về đơn vị của Blender hiện tại (nếu không đặt thì các giá trị Đơn Vị Blender nguyên thủy sẽ được sử dụng như hiện tại)" msgid "Armature FBXNode Type" -msgstr "Cốt Loại FBXNode" +msgstr "Thể loại nút FBXNode cho Khung Cốt" + + +msgid "FBX type of node (object) used to represent Blender's armatures (use the Null type unless you experience issues with the other app, as other choices may not import back perfectly into Blender...)" +msgstr "Loại nút FBX (đối tượng) được sử dụng để đại diện cho các khung cốt của Blender (sử dụng loại Null trừ khi bạn gặp sự cố với ứng dụng khác, vì các lựa chọn khác có thể không được nhập khẩu hoàn hảo vào Blender...)" msgid "Null" @@ -50916,11 +55236,11 @@ msgstr "Không" msgid "'Null' FBX node, similar to Blender's Empty (default)" -msgstr "Giao điểm 'Không' giống với Vật Thể Rỗng của Blender (mặc định)" +msgstr "Nút 'Null' của FBX, tương tự như Đối Tượng Rỗng của Blender (mặc định)" msgid "'Root' FBX node, supposed to be the root of chains of bones..." -msgstr "Giao điểm 'Rễ', nên là rễ của các chuỗi xương… " +msgstr "Nút 'Root' của FBX, đúng nghĩa ra là gốc của các dây chuyền xương..." msgid "LimbNode" @@ -50928,147 +55248,167 @@ msgstr "GiaoĐiểmKhớp" msgid "'LimbNode' FBX node, a regular joint between two bones..." -msgstr "'GiaoĐiểmKhớp' FBX, một khớp bình thường giữa hai xương..." +msgstr "Nút 'LimbNode' của FBX, một khớp nối thông thường giữa hai xương..." msgid "Baked Animation" -msgstr "Hoạt Hình Nướng" +msgstr "Hoạt Họa đã Nướng" msgid "Export baked keyframe animation" -msgstr "Xuất hoạt hình nướng" +msgstr "Xuất Khẩu khung hóa hoạt họa đã nướng" msgid "Force Start/End Keying" -msgstr "Bắt Đặt Bắt Đầu/Kết Thúc Bức Ảnh Mẫu" +msgstr "Bắt Buộc Khóa Hóa Khởi Đầu/Kết Thúc" msgid "Always add a keyframe at start and end of actions for animated channels" -msgstr "Lần nào kèm thêm một bức ảnh mẫu tại hành động đầu và cuối cho kênh hoạt hình" +msgstr "Luôn luôn thêm một khung khóa tại điểm khởi đầu và điểm kết của các hành động cho các kênh hoạt họa" msgid "How much to simplify baked values (0.0 to disable, the higher the more simplified)" -msgstr "Mức đơn giản hóa giá trị nướng (0.0 = tắt, càng cao càng đơn giản hóa)" +msgstr "Lượng đơn giản hóa các giá trị nướng (0.0 nghĩa là tắt, càng cao thì càng được đơn giản hóa)" msgid "Sampling Rate" -msgstr "Tốc Độ Lấy Mẫu Vật" +msgstr "Tần Số Lấy Mẫu Vật" msgid "How often to evaluate animated values (in frames)" -msgstr "Tốc độ tính toán giá trị hoạt hình (đơn vị bức ảnh)" +msgstr "Tần số ước tính các giá trị được hoạt họa (trong đơn vị khung hình)" msgid "All Actions" -msgstr "Hết Hành Động" +msgstr "Toàn Bộ các Hành Động" msgid "Export each action as a separated FBX's AnimStack, instead of global scene animation (note that animated objects will get all actions compatible with them, others will get no animation at all)" -msgstr "Kết xuất mỗi hành động trong AnimStack (XếpĐốngHoạtHình) FBX riêng, thay hoạt hình cảnh toàn cầu (lưu ý vật thể có hoạt hình sẽ được hết hành động thích hợp với nó, vật thể khác sẽ không được hoạt hình nào cả)" +msgstr "Xuất Khẩu mỗi hành động thành một AnimStack của FBX (Ngăn Xếp Hoạt Họa của FBX) riêng biệt, thay vì hoạt họa cảnh toàn cầu (LƯU Ý: các đối tượng đã hoạt họa sẽ tiếp nhận toàn bộ các hành động tương thích với chúng, những cái khác sẽ không được tiếp nhận bất cứ một hoạt họa nào cả)" msgid "Key All Bones" -msgstr "Làm Bức Ảnh Mẫu Hết Xương" +msgstr "Khóa Hóa Toàn Bộ các Xương" msgid "Force exporting at least one key of animation for all bones (needed with some target applications, like UE4)" -msgstr "Bắt xuất ít nhất một bức ảnh mẫu của hoạt hình cho hết xương (cần dùng cho vài ứng dụng mục tiêu, như UE4)" +msgstr "Bắt phải xuất khẩu ít nhất một tư thế khóa của hoạt họa cho toàn bộ các xương (cần thiết đối với một số trình ứng dụng đích, như UE4)" msgid "Export each non-muted NLA strip as a separated FBX's AnimStack, if any, instead of global scene animation" -msgstr "Xuất mỗi trình tự NLA không bị tắt tiếng làm một AnimStack (XếpĐốngHoạtHình) được chẻ FBX, nếu có, thay thế hoạt hình cảnh toàn cầu" +msgstr "Xuất Khẩu mỗi dải NLA hoạt động thành một AnimStack của FBX (Ngăn Xếp Hoạt Họa của FBX) riêng biệt, nếu có, thay vì hoạt họa cảnh toàn cầu" msgid "Apply Transform" msgstr "Áp Dụng Biến Hóa" +msgid "Bake space transform into object data, avoids getting unwanted rotations to objects when target space is not aligned with Blender's space (WARNING! experimental option, use at own risk, known to be broken with armatures/animations)" +msgstr "Nướng biến hóa không gian vào dữ liệu vật thể, tránh xoay chiều không mong muốn đối với các đối tượng khi không gian mục tiêu không căn chỉnh với không gian của Blender (CẢNH BÁO! đây là tùy chọn thử nghiệm, tự mình gánh chịu kết quả nếu cứ sử dụng, đã từng gây ra hỏng hóc với các hoạt họa, các khung cốt)" + + msgid "Active scene to file" -msgstr "Cảnh hoạt động vào một tập tin" +msgstr "Cảnh đang hoạt động thành một tập tin" msgid "Each scene as a file" -msgstr "Mỗi cảnh vào một tập tin" +msgstr "Mỗi cảnh thành một tập tin" msgid "Each collection (data-block ones) as a file, does not include content of children collections" -msgstr "Mỗi sưu tập (tức là sưu tập nào trong cục dữ liệu) vào một tập tin, không gồm nội dung của sưu tập con cái" +msgstr "Mỗi bộ sưu tập (khối dữ liệu) như một tập tin, không bao gồm nội dung của các bộ sưu tập con cái" msgid "Scene Collections" -msgstr "Sưu Tập Cảnh" +msgstr "Bộ Sưu Tập Cảnh" msgid "Each collection (including master, non-data-block ones) of each scene as a file, including content from children collections" -msgstr "Mỗi sưu tập (gồm sưu tập chủ, sưu tập không phải là cục dữ liệu) của mỗi cảnh vào một tập tin, gồm nội dung từ các sưu tập con cái" +msgstr "Mỗi bộ sưu tập (bao gồm cả các bộ sưu tập chính, không phải khối dữ liệu) của một cảnh là một tập tin, bao gồm cả nội dung của các bộ sưu tập con cái" msgid "Active Scene Collections" -msgstr "Sưu Tập Cảnh Hoạt Động" +msgstr "Bộ Sưu Tập Cảnh đang Hoạt Động" msgid "Each collection (including master, non-data-block one) of the active scene as a file, including content from children collections" -msgstr "Mỗi sưu tập (gồm sưu tập chủ, sưu tập không phải là cục dữ liệu) của cảnh hoạt động là một tập tin, gồm nội dung từ các sưu tập con cái" +msgstr "Mỗi bộ sưu tập (bao gồm cả bộ sưu tập chính, không phải khối dữ liệu) của một cảnh đang hoạt động là một tập tin, bao gồm cả nội dung của các bộ sưu tập con cái" + + +msgid "Export vertex color attributes" +msgstr "Xuất Khẩu các thuộc tính màu của điểm đỉnh" + + +msgid "Do not export color attributes" +msgstr "Không xuất khẩu các thuộc tính màu" + + +msgid "Export colors in sRGB color space" +msgstr "Xuất Khẩu màu trong không gian màu sRGB" + + +msgid "Export colors in linear color space" +msgstr "Xuất Khẩu màu trong không gian màu tuyến tính" msgid "Embed Textures" -msgstr "Nhét Chất Liệu" +msgstr "Nhúng Chất Liệu" msgid "Embed textures in FBX binary file (only for \"Copy\" path mode!)" -msgstr "Nhét chất liệu trong tập tin FBX nhị phận (chỉ cho mẫu đường dẫn \"Chép\")" +msgstr "Nhúng các chất liệu vào trong tập tin FBX nhị phân (chỉ dành cho chế độ \"Sao Chép\" đường dẫn mà thôi)" msgid "Scale all data (Some importers do not support scaled armatures!)" -msgstr "Phóng to hết dữ liệu (có vài bộ nhập không hỗ trợ cốt phóng to!)" +msgstr "Đổi tỷ lệ toàn bộ các dữ liệu (Một số trình nhập khẩu không hỗ trợ xương đã đổi tỷ lệ!)" msgid "Smoothing" -msgstr "Mịn Hóa" +msgstr "Làm Mịn" msgid "Export smoothing information (prefer 'Normals Only' option if your target importer understand split normals)" -msgstr "Xuất thông tin mịn hóa (nên dùng tùy chọn 'Chỉ Pháp Tuyến' nếu bộ nhập mục tiêu hiểu được pháp tuyến chẻ)" +msgstr "Xuất Khẩu thông tin làm mịn (nên dùng tùy chọn 'Duy Pháp Tuyến' nếu trình nhập khẩu đích của bạn hiểu được Tách Phân Pháp Tuyến)" msgid "Normals Only" -msgstr "Chỉ Pháp Tuyến" +msgstr "Duy Pháp Tuyến" msgid "Export only normals instead of writing edge or face smoothing data" -msgstr "Chỉ xuất pháp tuyến thay thế lưu dữ liệu mịn hóa cạnh hay mặt" +msgstr "Chỉ Xuất Khẩu các pháp tuyến thôi, thay vì ghi dữ liệu làm mịn cạnh hoặc Mặt" msgid "Write face smoothing" -msgstr "Ghi (lưu) mịn hóa mặt" +msgstr "Ghi sự làm mịn Mặt" msgid "Write edge smoothing" -msgstr "Ghi (lưu) mịn hóa cạnh" +msgstr "Ghi sự làm mịn cạnh" msgid "Object Types" -msgstr "Loại Vật Thể" +msgstr "Thể Loại Đối Tượng" msgid "Which kind of object to export" -msgstr "Xuất loại vật thể nào" +msgstr "Hạng loại đối tượng để xuất khẩu" msgid "Lamp" -msgstr "Đèn" +msgstr "Bóng Đèn" msgid "WARNING: not supported in dupli/group instances" -msgstr "CẢNH BÁO: không hỗ trở trong thực thể sao chép/nhóm" +msgstr "CẢNH BÁO: không hỗ trợ trong các thực thể sao chép/nhóm" msgid "Other" -msgstr "Khác" +msgstr "Cái Khác" msgid "Other geometry types, like curve, metaball, etc. (converted to meshes)" -msgstr "Hình dạng loại khác, như đường cong, siêu cầu, v.v. (bị đổi thành mạng lưới)" +msgstr "Các thể loại hình học khác, như đường cong, siêu cầu v.v. (được chuyển đổi thành các khung lưới)" msgid "Path Mode" @@ -51076,35 +55416,43 @@ msgstr "Chế Độ Đường Dẫn" msgid "Method used to reference paths" -msgstr "Phương pháp dùng với đường dẫn tham chiếu" +msgstr "Phương pháp sử dụng để đối chiếu các đường dẫn" + + +msgid "Use relative paths with subdirectories only" +msgstr "Chỉ sử dụng các đường dẫn tương đối với các thư mục thứ mà thôi" msgid "Always write absolute paths" -msgstr "Lần nào lưu đường dẫn tuyệt đối" +msgstr "Luôn luôn ghi đường dẫn tuyệt đối" msgid "Always write relative paths (where possible)" -msgstr "Lần nào lưu đường dẫn tương đối (khi có thể)" +msgstr "Luôn luôn ghi đường dẫn tương đối (khi có thể)" msgid "Match" -msgstr "Giống" +msgstr "Khớp" + + +msgid "Match absolute/relative setting with input path" +msgstr "Khớp cài đặt tuyệt đối/tương đối với đường dẫn đầu vào" msgid "Strip Path" -msgstr "Đường Dẫn Đoạn" +msgstr "Lược Bỏ Đường Dẫn" msgid "Filename only" -msgstr "Chỉ tên tập tin" +msgstr "Chỉ dùng tên của tập tin mà thôi" msgid "Copy the file to the destination path (or subdirectory)" -msgstr "Chép tập tin vào đường dẫn đích (thư mục phụ)" +msgstr "Sao chép tập tin vào đường dẫn đích (hoặc thư mục nhánh)" msgid "Primary Bone Axis" -msgstr "Trục Xương Chánh" +msgstr "Trục Xương Chính" msgid "-X Axis" @@ -51119,56 +55467,64 @@ msgid "-Z Axis" msgstr "Trục -Z" +msgid "Prioritize Active Color" +msgstr "Ưu Tiên Màu đang Hoạt Động" + + +msgid "Make sure active color will be exported first. Could be important since some other software can discard other color attributes besides the first one" +msgstr "Đảm bảo màu đang hoạt động sẽ được xuất khẩu trước. Có thể quan trọng vì một số phần mềm khác có thể loại bỏ các thuộc tính màu khác đi ngoài thuộc tính đầu tiên" + + msgid "Secondary Bone Axis" msgstr "Trục Xương Phụ" msgid "Export only objects from the active collection (and its children)" -msgstr "Chỉ xuất vật thể từ sưu tập hoạt đồng (và con cái của nó)" +msgstr "Duy Xuất Khẩu các đối tượng từ bộ sưu tập đang hoạt động (và các con cái của nó)" msgid "Only Deform Bones" -msgstr "Chỉ Méo Hóa Xương" +msgstr "Duy Xương Biến Dạng" msgid "Only write deforming bones (and non-deforming ones when they have deforming children)" -msgstr "Chỉ ghi (lưu) xương bị méo hóa (và xương không méo hóa khi có con cái bị méo hóa)" +msgstr "Chỉ ghi các xương bị biến dạng (và cả những cái tuy không biến dạng, song chúng có các con cái bị biến dạng) mà thôi" msgid "Batch Own Dir" -msgstr "Xấp Thư Mục Riêng" +msgstr "Đồng Loạt Tạo Thư Mục Cá Nhân" msgid "Create a dir for each exported file" -msgstr "Chế tạo một thư mục cho mỗi tập tin xuất" +msgstr "Kiến Tạo một thư mục cho mỗi tập tin xuất khẩu" msgid "Custom Properties" -msgstr "Đặc Tính Tự Tạo" +msgstr "Tính Chất Tùy Chỉnh" msgid "Export custom properties" -msgstr "Xuất đặc tính tùy chọn" +msgstr "Xuất Khẩu các tính chất tùy chỉnh" msgid "Loose Edges" -msgstr "Cạnh Rời Ra" +msgstr "Các Cạnh Rời Rạc" msgid "Export loose edges (as two-vertices polygons)" -msgstr "Xuất cạnh rời ra (làm đa giáac hai đỉnh)" +msgstr "Xuất Khẩu các cạnh rời rạc (tựa như các đa giác có hai điểm đỉnh)" msgid "Apply modifiers to mesh objects (except Armature ones) - WARNING: prevents exporting shape keys" -msgstr "Áp dụng bộ điều chỉnh với vật thể mạng lưới (trừ vật thể Cốt) - CẢNH BÁO: sẽ không cho thể xuất mẫu dạng" +msgstr "Áp dụng các bộ điều chỉnh vào những đối tượng khung lưới (ngoại trừ các Khung Cốt) - CẢNH BÁO: ngăn ngừa việc xuất khẩu các hình mẫu" msgid "Use Modifiers Render Setting" -msgstr "Dùng Cài đặt Kết Xuất Bộ Điều Chỉnh" +msgstr "Sử Dụng Sắp Đặt về Kết Xuất của các Bộ Điều Chỉnh" msgid "Use render settings when applying modifiers to mesh objects (DISABLED in Blender 2.8)" -msgstr "Dùng cài đặt kết xuất khi đang áp dụng bộ điều chỉnh với vật thể mạng lưới (BỊ TẮT trong Blender 2.8)" +msgstr "Sử dụng các sắp đặt về kết xuất khi áp dụng các bộ điều chỉnh vào đối tượng khung lưới (BỊ TẮT (không hoạt động) trong Blender 2.8)" msgid "Use Metadata" @@ -51176,108 +55532,180 @@ msgstr "Dùng Siêu Dữ Liệu" msgid "Export selected and visible objects only" -msgstr "Xuất chỉ vật thể được chọn và hiển thị" +msgstr "Duy Xuất Khẩu những đối tượng đã chọn và nhìn thấy được mà thôi" msgid "Use Space Transform" -msgstr "Dùng Biến Hóa Không Gian" +msgstr "Sử Dụng Biến Hóa Không Gian" msgid "Apply global space transform to the object rotations. When disabled only the axis space is written to the file and all object transforms are left as-is" -msgstr "Áp dụng biến hóa không gian toàn cầu cho xoay vật thể. Khi được tắt, chỉ không gian trục được lưu vào tập tin và hết biến hóa vật thể còn giữ nguyên" +msgstr "Áp dụng sự biến hóa không gian toàn cầu vào sự xoay chiều của đối tượng. Khi tắt đi thì chỉ có không gian của trục là được ghi vào tập tin mà thôi, và toàn bộ các biến hóa của đối tượng sẽ được giữ nguyên như cũ" msgid "Export Subdivision Surface" -msgstr "Xuất Phân Hóa Bề Mặt" +msgstr "Xuất Khẩu Bề Mặt Phân Hóa" msgid "Export the last Catmull-Rom subdivision modifier as FBX subdivision (does not apply the modifier even if 'Apply Modifiers' is enabled)" -msgstr "Xuất bộ điều chỉnh phân hóa Catmull-Rom cuối bằng phân hóa FBX (không áp dụng cự sửa đổi mặc dù đã bật 'Áp Dụng Bộ Điều Chỉnh')" +msgstr "Xuất Khẩu bộ điều chỉnh phân hóa Catmull-Rom cuối cùng thành phân hóa FBX (không áp dụng bộ điều chỉnh, ngay cả khi 'Áp Dụng Bộ Điều Chỉnh' được bật đi chăng nữa)" msgid "Triangulate Faces" -msgstr "Tam Giác Hoá Mặt" +msgstr "Tam Giác Hóa các Mặt" msgid "Convert all faces to triangles" -msgstr "Biến đổi hết mặt thành tam giác" +msgstr "Chuyển đổi toàn bộ các mặt thành tam giác" msgid "Add binormal and tangent vectors, together with normal they form the tangent space (will only work correctly with tris/quads only meshes!)" -msgstr "Thêm vectơ nhị pháp tuyến và tiếp tuyến chúng với pháp tuyến để hình thành không gian tiếp tuyến (nó chỉ họa động với mạng lưới chỉ có tam giác/tư giác!) " +msgstr "Thêm vectơ phó pháp tuyến và tiếp tuyến vào và cùng với pháp tuyến, chúng tạo nên không gian tiếp tuyến (chỉ hoạt động đúng đắn với các khung lưới chỉ có tam/tứ giác mà thôi)" msgid "Visible Objects" -msgstr "Vật Thể Hiển Thị" +msgstr "Các Đối Tượng Hữu Hình" msgid "Export visible objects only" -msgstr "Chỉ xuất vật thể hiển thị" +msgstr "Chỉ Xuất Khẩu các đối tượng nhìn thấy được mà thôi" msgctxt "Operator" msgid "Export glTF 2.0" -msgstr "Xuất glTF 2.0" +msgstr "Xuất Khẩu glTF 2.0" msgid "Export scene as glTF 2.0 file" -msgstr "Xuất cảnh bằng tập tin định dạng glTF 2.0" +msgstr "Xuất Khẩu cảnh ra tập tin glTF 2.0" msgid "Include All Bone Influences" -msgstr "Gồm Tất Cả Sự Ảnh Hưởng Của Xương" +msgstr "Bao Gồm Toàn Bộ các Tác Động của Xương" + + +msgid "Allow export of all joint vertex influences. Models may appear incorrectly in many viewers" +msgstr "Cho phép xuất khẩu toàn bộ các ảnh hưởng điểm đỉnh của khớp nối. Các mô hình có thể xuất hiện không chính xác ở nhiều trình quan sát" + + +msgid "Split Animation by Object" +msgstr "Tách Phân Hoạt Họa theo Đối Tượng" + + +msgid "Export Scene as seen in Viewport, But split animation by Object" +msgstr "Xuất Khẩu Cảnh như thấy trong Khung Nhìn, Song tách phân hoạt họa theo Đối Tượng" msgid "Export all Armature Actions" -msgstr "Xuất hết Hành Động Cốt" +msgstr "Xuất Khẩu toàn bộ các Hành Động của Khung Cốt" msgid "Export all actions, bound to a single armature. WARNING: Option does not support exports including multiple armatures" -msgstr "Xuất hết hành động, trói đến một cốt. CẢNH BÁO: Tùy chọn này không hỗ trợ xuất có nhiều cốt" +msgstr "Xuất khẩu toàn bộ các hành động, kết buộc vào đơn thực thể khung cốt. CẢNH BÁO: Tùy chọn không hỗ trợ xuất khẩu nhiều trường hợp khung cốt" + + +msgid "Set all glTF Animation starting at 0" +msgstr "Đặt toàn bộ Hoạt Họa glTF bắt đầu từ 0" + + +msgid "Set all glTF animation starting at 0.0s. Can be useful for looping animations" +msgstr "Đặt toàn bộ hoạt họa glTF bắt đầu từ giây 0.0. Có thể hữu ích cho quá trình nhắc lại tuần hoàn các hoạt họa" + + +msgid "Animation mode" +msgstr "Chế Độ Hoạt Họa" + + +msgid "Export Animation mode" +msgstr "Chế độ Xuất Khẩu Hoạt Họa" + + +msgid "Export actions (actives and on NLA tracks) as separate animations" +msgstr "Xuất khẩu các hành động (đang hoạt động và trên các rãnh NLA) thành các hoạt họa tách biệt" + + +msgid "Active actions merged" +msgstr "Các hành động đang hoạt động được hợp nhất" + + +msgid "All the currently assigned actions become one glTF animation" +msgstr "Toàn bộ các hành động hiện được ấn định sẽ trở thành một hoạt họa glTF" + + +msgid "Export individual NLA Tracks as separate animation" +msgstr "Xuất khẩu các cá nhân rãnh NLA thành các hoạt họa riêng biệt" + + +msgid "Export baked scene as a single animation" +msgstr "Xuất khẩu cảnh đã nướng dưới dạng một hoạt họa đơn nhất" msgid "Exports active actions and NLA tracks as glTF animations" -msgstr "Xuất hành động hoạt động va rãnh NLH kiểu hoạt hình glTF" +msgstr "Xuất Khẩu các hành động đang hoạt động và các rãnh NLA làm hoạt họa glTF" msgid "Apply modifiers (excluding Armatures) to mesh objects -WARNING: prevents exporting shape keys" -msgstr "Áp dụng bộ điều chỉnh (trừ Cốt) để làm mạng lưới cho vật thể - CẢNH BÁO: sẽ không cho thể xuất mẫu dạng" +msgstr "Áp dụng các bộ điều chỉnh (ngoại trừ Khung Cốt) vào đối tượng khung lưới - CẢNH BÁO: ngăn ngừa quá trình xuất khẩu các hình mẫu" + + +msgid "Export Attributes (when starting with underscore)" +msgstr "Xuất Khẩu các Thuộc Tính (khi bắt đầu bằng dấu gạch chân)" + + +msgid "Bake All Objects Animations" +msgstr "Nướng Toàn Bộ các Đối Tượng Hoạt Họa" + + +msgid "Force exporting animation on every object. Can be useful when using constraints or driver. Also useful when exporting only selection" +msgstr "Ép buộc xuất khẩu hoạt họa trên mọi đối tượng. Có thể hữu ích khi sử dụng các ràng buộc hoặc trình điều vận. Cũng hữu ích khi chỉ xuất khẩu lựa chọn mà thôi" msgid "Export cameras" -msgstr "Xuất máy quay phim" +msgstr "Xuất Khẩu Máy Quay Phim" msgid "Legal rights and conditions for the model" -msgstr "Quyền luật pháp và điều kiện của mô hình" +msgstr "Bản quyền hợp pháp và các điều kiện dành cho mô hình" + + +msgid "Use Current Frame as Object Rest Transformations" +msgstr "Sử Dụng Khung Hình Hiện Tại làm các Tư Thế Nghỉ Biến Hóa của Đối tượng" + + +msgid "Export the scene in the current animation frame. When off, frame 0 is used as rest transformations for objects" +msgstr "Xuất khẩu cảnh trong khung hình hoạt họa hiện tại. Khi tắt đi thì khung hình 0 được sử dụng làm tư thế nghỉ biến hóa cho các đối tượng" msgid "Export Deformation Bones Only" -msgstr "Chỉ Xuất Xương Méo Hóa" +msgstr "Duy Xuất Khẩu các Xương Biến Dạng" msgid "Export Deformation bones only" -msgstr "Chỉ Xuất Xương Được Méo Hóa" +msgstr "Chỉ xuất khẩu các xương biến dạng mà thôi" msgid "Color quantization bits" -msgstr "Bit lượng tử hóa màu sắc" +msgstr "Số bit lượng tử màu" msgid "Quantization bits for color values (0 = no quantization)" -msgstr "Bit lượng tử hóa cho giá trị màn sắc (0 = không lượng tử hóa)" +msgstr "Số bit lượng tử cho các giá trị màu sắc (bằng 0 có nghĩa là không lượng tử hóa)" msgid "Generic quantization bits" -msgstr "Bit lượng tử hóa tổng quát" +msgstr "Bit lượng tử hóa phổ thông" + + +msgid "Quantization bits for generic values like weights or joints (0 = no quantization)" +msgstr "Các bit lượng tử hóa dành cho các giá trị phổ thông như các trọng lượng hoặc các khớp nối (0 = không lượng tử hóa)" msgid "Draco mesh compression" -msgstr "Phương pháp nén mạng lưới Draco" +msgstr "Nén khung lưới dùng Draco" msgid "Compress mesh using Draco" -msgstr "Nén mạng lưới dùng Draco" +msgstr "Nén khung lưới dùng Draco" msgid "Compression level" @@ -51285,15 +55713,15 @@ msgstr "Mức nén" msgid "Compression level (0 = most speed, 6 = most compression, higher values currently not supported)" -msgstr "Mức nén (0 = tốc độ nhất, 6 = nén nhất, giá trị cao hơn chưa được hỗ trợ)" +msgstr "Mức độ nén (0 = tốc độ nhanh chóng, 6=nén nhiều nhất, những giá trị cao hơn thì hiện giờ chưa hỗ trợ)" msgid "Normal quantization bits" -msgstr "Bit lượng tử hóa bình thường" +msgstr "Bit lượng tử hóa pháp tuyến" msgid "Quantization bits for normal values (0 = no quantization)" -msgstr "Bit lượng tử hóa cho giá trị bình thường (0 = không lượng tử hóa)" +msgstr "Các bit lượng tử hóa dành cho các giá trị pháp tuyến (bằng 0 có nghĩa là không lượng tử hóa)" msgid "Position quantization bits" @@ -51301,7 +55729,7 @@ msgstr "Bit lượng tử hóa vị trí" msgid "Quantization bits for position values (0 = no quantization)" -msgstr "Bit lượng tử hóa cho giá trị vị trí (0 = không lượng tử hóa)" +msgstr "Các bit lượng tử hóa dành cho các giá trị vị trí (bằng 0 có nghĩa là không lượng tử hóa)" msgid "Texcoord quantization bits" @@ -51309,143 +55737,327 @@ msgstr "Bit lượng tử hóa tọa độ chất liệu" msgid "Quantization bits for texture coordinate values (0 = no quantization)" -msgstr "Bit lượng tử hóa cho giá trị tọa độ chất liệu (0 = không lượng tử hóa)" +msgstr "Các bit lượng tử hóa dành cho các giá trị tọa độ chất liệu (bằng 0 có nghĩa là không lượng tử hóa)" msgid "Export custom properties as glTF extras" -msgstr "Xuất đặc tính tùy chọn kiểu đồ thêm glTF" +msgstr "Xuất Khẩu các tính chất tùy chỉnh như các bổ sung của glTF" msgid "Always Sample Animations" -msgstr "Lần Nào Lấy Mẫu Vặt Hoạt Hình" +msgstr "Luôn Luôn Lấy Mẫu Vật các Hoạt Họa" msgid "Apply sampling to all animations" -msgstr "Áp dụng lấy mẫu vật cho tất cả hoạt hình" +msgstr "Áp dụng quá trình lấy mẫu vật vào toàn bộ các hoạt họa" + + +msgid "Output format. Binary is most efficient, but JSON may be easier to edit later" +msgstr "Định dạng đầu ra. Nhị phân là hiệu quả nhất, song JSON có thể dễ chỉnh sửa hơn sau này" msgid "glTF Binary (.glb)" -msgstr "Nhị Phận glTF (.glb)" +msgstr "glTF Nhị Phân (.glb)" msgid "Exports a single file, with all data packed in binary form. Most efficient and portable, but more difficult to edit later" -msgstr "Xuất một tập tin, với tất cả dữ liệu được gói vào dạng nhị phận. Hiệu qủa cao và đễ vận chuyển, nhưng biên tập khó hơn thời sau" +msgstr "Xuất Khẩu ra thành một tập tin đơn, với toàn bộ dữ liệu được đóng gói trong dạng nhị phân. Hiệu suất và di động nhất, song sau này khó biên soạn hơn" msgid "glTF Separate (.gltf + .bin + textures)" -msgstr "Riêng glTF (.glb + .bin + chất liệu)" +msgstr "glTF Tách Phân (.gltf + .bin + chất liệu)" msgid "Exports multiple files, with separate JSON, binary and texture data. Easiest to edit later" -msgstr "Xuất nhiều tập tin, với dữ liệu JSON, nhị phận và chất liệu riêng. Dễ nhất để biên tập thời sau" +msgstr "Xuất Khẩu thành nhiều tập tin, với nhị phân, JSON và dữ liệu chất liệu tách biệt. Sau này dễ biên soạn nhất" msgid "Limit to Playback Range" -msgstr "Hạn Chế đến Phạm Vi Hát Lại" +msgstr "Giới Hạn trong Phạm Vi Chơi Lại" msgid "Clips animations to selected playback range" -msgstr "Cắt hoạt hình đến phạm vi hạt lại được chọn" +msgstr "Cắt ngắn hoạt họa trong khoảng chơi lại đã chọn" + + +msgid "GPU Instances" +msgstr "Thực Thể GPU" + + +msgid "Export using EXT_mesh_gpu_instancing. Limited to children of a given Empty. Multiple materials might be omitted" +msgstr "Xuất khẩu dùng EXT_mesh_gpu_instancing (trình mở rộng thực thể hóa khung lưới dùng GPU). Giới hạn ở các con cái của một vật thể trống rỗng đã cho. Nhiều chất liệu có thể sẽ bị bỏ qua" + + +msgid "Flatten Bone Hierarchy" +msgstr "Xóa Tầng Bậc của Xương" + + +msgid "Flatten Bone Hierarchy. Useful in case of non decomposable transformation matrix" +msgstr "Xóa Hệ Thống Tầng Bậc của Xương. Hữu ích trong trường hợp ma trận biến hóa không thể phân tích được" + + +msgid "Create WebP" +msgstr "Tạo WebP" + + +msgid "Creates WebP textures for every texture. For already WebP textures, nothing happens" +msgstr "Tạo chất liệu WebP cho mọi chất liệu. Đối với các chất liệu WebP vốn đã có thì sẽ không có gì xảy ra cả" msgid "Output format for images. PNG is lossless and generally preferred, but JPEG might be preferable for web applications due to the smaller file size. Alternatively they can be omitted if they are not needed" -msgstr "Định dạng xuât cho ảnh. PNG không mất dữ liệu nguồn và ưu tiên, nhưng có lẽ JPEG tốt hơn cho ứng dụng trên mạng vì nó nhỏ gọn hơn. Còn cả hai có thể được bỏ nếu không cần" +msgstr "Định dạng đầu ra cho các hình ảnh. PNG là không mất dữ liệu và thường được ưu tiên, nhưng JPEG có thể thích hợp hơn cho các ứng dụng web do kích thước tập tin nhỏ hơn. Ngoài ra, chúng có thể được bỏ qua nếu không cần thiết" + + +msgid "Save PNGs as PNGs, JPEGs as JPEGs, WebPs as WebPs. For other formats, use PNG" +msgstr "Lưu các PNG dưới dạng PNG, JPEG dưới dạng JPEG, WebP dưới dạng WebP. Đối với các định dạng khác, xin sử dụng PNG nhé" msgid "JPEG Format (.jpg)" -msgstr "Định Dạng JPEG (.jpg)" +msgstr "Định dạng JPEG (.jpg)" msgid "Save images as JPEGs. (Images that need alpha are saved as PNGs though.) Be aware of a possible loss in quality" -msgstr "Lưu các ảnh bằng JPEG. (Những ảnh cần độ đục sẽ được lưu bằng PNG.) Coi chừng mất chất lượng ảnh" +msgstr "Lưu các hình ảnh thành JPEG. (Song những hình ảnh cần có kênh alpha trong đó sẽ được lưu thành PNG.) Nên nhớ là khả năng mất chất lượng hình ảnh có thể xảy ra" + + +msgid "WebP Format" +msgstr "Định Dạng WebP" + + +msgid "Save images as WebPs as main image (no fallback)" +msgstr "Lưu hình ảnh dưới dạng WebP làm hình ảnh chính (không dự phòng)" msgid "Don't export images" -msgstr "Không xuất ảnh" +msgstr "Không xuất khẩu hình ảnh" + + +msgid "Image quality" +msgstr "Chất lượng hình ảnh" + + +msgid "Quality of image export" +msgstr "Chất lượng xuất khẩu hình ảnh" + + +msgid "WebP fallback" +msgstr "Dự phòng WebP" + + +msgid "For all WebP textures, create a PNG fallback texture" +msgstr "Tạo chất liệu dự phòng PNG cho toàn bộ các chất liệu WebP" + + +msgid "Lighting Mode" +msgstr "Chế Độ Ánh Sáng" + + +msgid "Optional backwards compatibility for non-standard render engines. Applies to lights" +msgstr "Tùy chọn cho phép khả tương thích ngược (về các bản cũ) cho các động cơ kết xuất phi chuẩn. Áp dụng cho các nguồn sáng" + + +msgid "Physically-based glTF lighting units (cd, lx, nt)" +msgstr "Đơn vị chiếu sáng glTF dựa trên vật lý (cd, lx, nt)" + + +msgid "Unitless" +msgstr "Phi Đơn Vị" + + +msgid "Non-physical, unitless lighting. Useful when exposure controls are not available" +msgstr "Ánh sáng phi vật lý, phi đơn vị. Hữu ích khi không có các điều khiển phơi sáng khả dụng" + + +msgid "Raw (Deprecated)" +msgstr "Ảnh Thô (Đã lỗi thời)" + + +msgid "Blender lighting strengths with no conversion" +msgstr "Cường độ chiếu sáng của Blender, không chuyển đổi" + + +msgid "Bone Influences" +msgstr "Lượng Ảnh Hưởng của Xương" + + +msgid "Choose how many Bone influences to export" +msgstr "Chọn số lượng ảnh hưởng của Xương để xuất khẩu" + + +msgid "JPEG quality" +msgstr "Chất lượng JPEG" + + +msgid "Quality of JPEG export" +msgstr "Chất lượng xuất khẩu của JPEG" msgid "Keep original" -msgstr "Giữ nguyên bản" +msgstr "Duy trì bản gốc" msgid "Keep original textures files if possible. WARNING: if you use more than one texture, where pbr standard requires only one, only one texture will be used. This can lead to unexpected results" -msgstr "Giữ tập tin chất liệu nguyên bản nếu có thể. CẢNH BÁO: nếu bạn dùng hơn một chất liệu, khi tiêu chuẩn pbr chỉ cần một cái, chỉ một chất liệu sẽ được sử dụng. Cái này có thể tạo kết qủa không theo ý định" +msgstr "Duy trì các tập tin chất liệu ban đầu, nếu có thể. CẢNH BÁO: nếu bạn sử dụng nhiều hơn một chất liệu, trong khi tiêu chuẩn PBR chỉ đòi hỏi có một cái, thì chỉ một chất liệu là được sử dụng mà thôi. Điều này có thể tạo ra kết quả nằm ngoài ý muốn đấy nhé" msgid "Punctual Lights" -msgstr "Đèn Định Hướng, Điểm, Nón" +msgstr "Nguồn Sáng Nhất Thời" msgid "Export directional, point, and spot lights. Uses \"KHR_lights_punctual\" glTF extension" -msgstr "Xuất đèn định hướng, điểm, và hình nón. Dụng đuôi \"KHR_lights_punctual\" glTF" +msgstr "Xuất Khẩu các đèn pha, điểm chấm hữu hướng. Dùng định dạng glTF \"KHR_lights_punctual\" (Đèn Điểm Nhất Thời KHR)" + + +msgid "Export materials" +msgstr "Xuất khẩu các nguyên vật liệu" msgid "Export all materials used by included objects" -msgstr "Xuất hết vật liệu của vật thể xuất đang dùng" +msgstr "Xuất Khẩu toàn bộ các nguyên vật liệu sử dụng bởi các đối tượng bao gồm" msgid "Do not export materials, but write multiple primitive groups per mesh, keeping material slot information" -msgstr "Không xuất vật liệu, nhưng ghi vài nhóm cơ bản từng mạng lưới, giữ thông tin của khe vật liệu" +msgstr "Không xuất khẩu các nguyên vật liệu, song tiến hành ghi các nhóm đa hình học cơ sở cho mỗi khung lưới, duy trì thông tin về khe nguyên vật liệu" msgid "No export" -msgstr "Không xuất" +msgstr "Không xuất khẩu" msgid "Do not export materials, and combine mesh primitive groups, losing material slot information" -msgstr "Không xuất vật liệu, và gồm nhóm mạng lưới cơ bản, mất thông tin của khe vật liệu" +msgstr "Không xuất khẩu các nguyên vật liệu, và kết hợp các nhóm hình học cơ sở, không duy trì thông tin về khe nguyên vật liệu" msgid "Export shape keys (morph targets)" -msgstr "Xuất dạng mẫu (mục đích biên dạng)" +msgstr "Xuất Khẩu các hình mẫu (các mục tiêu biến dạng)" + + +msgid "Shape Key Animations" +msgstr "Hoạt Họa Hình Mẫu" + + +msgid "Export shape keys animations (morph targets)" +msgstr "Xuất Khẩu các hoạt họa hình mẫu (các mục tiêu biến dạng)" msgid "Shape Key Normals" -msgstr "Pháp Tuyến Mẫu Dạng" +msgstr "Pháp Tuyến Hình Mẫu" msgid "Export vertex normals with shape keys (morph targets)" -msgstr "Xuất pháp tuyến đỉnh với dạng mẫu (mục đích biến dạng)" +msgstr "Xuất Khẩu các pháp tuyến điểm đỉnh với các hình mẫu (các mục tiêu biến dạng)" + + +msgid "Reset shape keys between actions" +msgstr "Hoàn lại các hình mẫu giữa các hành động" + + +msgid "Reset shape keys between each action exported. This is needed when some SK channels are not keyed on some animations" +msgstr "Hoàn lại các hình mẫu giữa mỗi hành động xuất khẩu. Việc làm này là cần thiết khi một số kênh SK không được khóa hóa trên một số hoạt họa" msgid "Shape Key Tangents" -msgstr "Tiếp Tuyến Mẫu Dạng" +msgstr "Tiếp Tuyến của Hình Mẫu" msgid "Export vertex tangents with shape keys (morph targets)" -msgstr "Xuất tiếp tuyến đỉnh với dạng mẫu (mục đích biến dạng)" +msgstr "Xuất Khẩu các tiếp tuyến điểm đỉnh với các hình mẫu (các mục tiêu biến dạng)" + + +msgid "Negative Frames" +msgstr "Khung Hình Âm" + + +msgid "Negative Frames are slid or cropped" +msgstr "Khung Hình Âm được trượt đẩy đi hoặc cắt xén" + + +msgid "Slide" +msgstr "Trượt Đẩy" + + +msgid "Slide animation to start at frame 0" +msgstr "Trượt đẩy hoạt họa để bắt đầu tại khung 0" + + +msgid "Keep only frames above frame 0" +msgstr "Chỉ giữ lại các khung hình trên khung hình 0 mà thôi" + + +msgid "Group by NLA Track" +msgstr "Nhóm theo Rãnh NLA" + + +msgid "When on, multiple actions become part of the same glTF animation if they're pushed onto NLA tracks with the same name. When off, all the currently assigned actions become one glTF animation" +msgstr "Khi bật thì nhiều hành động sẽ trở thành một phần của cùng hoạt họa glTF, nếu chúng được đẩy lên các rãnh NLA với cùng một tên. Khi tắt đi thì toàn bộ các hành động hiện được ấn định sẽ trở thành một hoạt họa glTF" msgid "Merged Animation Name" -msgstr "Tên Hoạt Hình Được Gồm Lại" +msgstr "Tên Hoạt Họa Hợp Nhất" msgid "Name of single glTF animation to be exported" -msgstr "Tên của một họt hình glTF để xuất" +msgstr "Tên của đơn hoạt họa glTF sẽ được xuất khẩu" msgid "Export vertex normals with meshes" -msgstr "Xuất pháp tuyến đỉnh với mạng lưới" +msgstr "Xuất Khẩu các pháp tuyến điểm đỉnh với những khung lưới" + + +msgid "Force keeping channels for bones" +msgstr "Ép buộc duy trì các kênh cho xương" + + +msgid "If all keyframes are identical in a rig, force keeping the minimal animation. When off, all possible channels for the bones will be exported, even if empty (minimal animation, 2 keyframes)" +msgstr "Nếu toàn bộ các khung khóa đều giống hệt nhau trong một giàn điều khiển thì sự ép buộc sẽ duy trì hoạt họa ở mức tối thiểu. Khi tắt đi thì tất cả các kênh khả dĩ dành cho xương đều sẽ được xuất khẩu hết, ngay cả khi trống rỗng (hoạt họa tối thiểu, 2 khung khóa)" + + +msgid "Force keeping channel for objects" +msgstr "Bắt buộc duy trì kênh cho đối tượng" + + +msgid "If all keyframes are identical for object transformations, force keeping the minimal animation" +msgstr "Nếu tất cả các khung khóa biến hóa đối tượng là giống hệt nhau thì bắt buộc duy trì hoạt họa ở mức tối thiểu" msgid "Optimize Animation Size" -msgstr "Tối Ưu Cỡ Thước Hoạt Hình" +msgstr "Tối Ưu Hóa Kích Thước Hoạt Họa" + + +msgid "Reduce exported file size by removing duplicate keyframes" +msgstr "Giảm thiểu kích thước tập tin xuất khẩu bằng cách xóa các khung hình chính trùng lặp đi" msgid "Export original PBR Specular" -msgstr "Xuất Cao Quang PBR ban đầu" +msgstr "Xuất Khẩu ánh lóng lánh PBR glTF gốc" msgid "Export original glTF PBR Specular, instead of Blender Principled Shader Specular" -msgstr "Xuất cao quang PBR glTF ban đầu, thay thế Cao Quang từ Bộ Tô Sắc Tổng Quát của Blender" +msgstr "Xuất Khẩu ánh lóng lánh PBR glTF gốc, thay vì Bộ Tô Bóng Ánh Lóng Lánh Nguyên Tắc của Blender" + + +msgid "Reset pose bones between actions" +msgstr "Hoàn lại các xương tư thế giữa các hành động" + + +msgid "Reset pose bones between each action exported. This is needed when some bones are not keyed on some animations" +msgstr "Hoàn lại xương tư thế giữa mỗi hành động được xuất khẩu. Chức năng này cần thiết khi một số xương không được khóa hóa trên một số hoạt họa" + + +msgid "Use Rest Position Armature" +msgstr "Sử Dụng Khung Cốt Vị Trí Nghỉ" + + +msgid "Export armatures using rest position as joints' rest pose. When off, current frame pose is used as rest pose" +msgstr "Xuất khẩu các khung cốt bằng cách sử dụng vị trí nghỉ làm tư thế nghỉ của các khớp nối. Khi tắt đi thì tư thế của khung hình hiện tại sẽ được sử dụng làm tư thế nghỉ" msgid "Skinning" -msgstr "Da" +msgstr "Da Bọc" msgid "Export skinning (armature) data" -msgstr "Xuất dữ liệu da (cốt)" +msgstr "Xuất Khẩu dữ liệu da bọc (khung cốt)" msgid "Tangents" @@ -51453,100 +56065,124 @@ msgstr "Tiếp Tuyến" msgid "Export vertex tangents with meshes" -msgstr "Xuất tiếp tiếp đỉnh với mạng lưới" +msgstr "Xuất Khẩu các tiếp tuyến của điểm đỉnh với các khung lưới" msgid "Export UVs (texture coordinates) with meshes" -msgstr "Xuất UV (tọa độ chất liệu) với mạn lưới" +msgstr "Xuất Khẩu các UV (các tọa độ của chất liệu) với khung lưới" msgid "Folder to place texture files in. Relative to the .gltf file" -msgstr "Hồ sơ để chứa chất liệu vào. Tương đối với tập tin .gltf" +msgstr "Thư mục để đặt các tập tin chất liệu vào đó. Tương đối với tập tin .gltf" + + +msgid "Omitting Sparse Accessor if data is empty" +msgstr "Bỏ qua Trình Truy Cập Thưa Thớt nếu dữ liệu là trống rỗng" + + +msgid "Use Sparse Accessor if better" +msgstr "Sử dụng Trình Truy Cập Thưa Thớt nếu tốt hơn" + + +msgid "Try using Sparse Accessor if it saves space" +msgstr "Hãy thử sử dụng Trình Truy Cập Thưa Thớt nếu nó tiết kiệm được dung lượng" msgid "+Y Up" -msgstr "+Y Trên" +msgstr "+Y Lên Trên" msgid "Export using glTF convention, +Y up" -msgstr "Xuất dùng đuôi thoái quen glTF, +Y hướng trên" +msgstr "Xuất Khẩu dùng quy ước glTF, +Y là hướng lên phía trên" + + +msgid "Identifier of caller (in case of add-on calling this exporter). Can be useful in case of Extension added by other add-ons" +msgstr "Mã định danh của trình gọi (trong trường hợp trình bổ sung gọi trình xuất khẩu này). Có thể hữu ích trong trường hợp Tiện Ích Mở Rộng được thêm vào bởi các trình bổ sung khác" msgid "Export setting categories" -msgstr "Xuất loại cài đặt" +msgstr "Hạng mục" msgid "General" -msgstr "Tổng Quát" +msgstr "Chung Chung" msgid "General settings" -msgstr "Cài đặt tổng quát" +msgstr "Sắp đặt chung" msgid "Mesh settings" -msgstr "Cài đặt mạng lưới" +msgstr "Sắp đặt về khung lưới" msgid "Object settings" -msgstr "Cài đặt vật thể" +msgstr "Sắp đặt về đối tượng" msgid "Animation settings" -msgstr "Cài đặt hoạt hình" +msgstr "Sắp đặt về hoạt họa" msgid "Export objects in the active collection only" -msgstr "Chỉ xuất các vật thể trong sưu tập hoạt động" +msgstr "Chỉ xuất khẩu các đối tượng nằm trong bộ sưu tập đang hoạt động mà thôi" + + +msgid "Include Nested Collections" +msgstr "Bao Gồm các Bộ Sưu Tập Lồng Nhau" + + +msgid "Include active collection and nested collections" +msgstr "Bao gồm bộ sưu tập đang hoạt động và các bộ sưu tập lồng nhau" msgid "Export active scene only" -msgstr "Chỉ xuất cảnh hoạt động" +msgstr "Chỉ Xuất Khẩu cảnh đang hoạt động mà thôi" msgid "Export loose edges as lines, using the material from the first material slot" -msgstr "Xuất cạnh mồ côi bằng đường, dùng vật liệu từ khe vật liệu thứ nhất" +msgstr "Xuất Khẩu các cạnh mồ côi thành các đường nét, dùng nguyên vật liệu từ khe nguyên vật liệu đầu tiên" msgid "Loose Points" -msgstr "Điểm Mồ Côi" +msgstr "Các Điểm Rời Rạc" msgid "Export loose points as glTF points, using the material from the first material slot" -msgstr "Xuất điểm mồ côi bằng điểm glTF, dùng vật liệu từ khe vật liệu thứ nhất" +msgstr "Xuất Khẩu các điểm rời rạc dưới dạng các điểm glTF, sử dụng nguyên vật liệu từ khe nguyên vật liệu đầu tiên" msgid "Renderable Objects" -msgstr "Vật Thể Có Thể Kết Xuất" +msgstr "Đối Tượng có thể Kết Xuất Được" msgid "Export renderable objects only" -msgstr "Chỉ xuất vật thể có thể kết xuất" +msgstr "Chỉ Xuất Khẩu các đối tượng có thể kết xuất được mà thôi" msgid "Remember Export Settings" -msgstr "Ghi Nhớ Cài Đặt Xuất" +msgstr "Ghi Nhớ các Sắp Đặt về Xuất Khẩu" msgid "Store glTF export settings in the Blender project" -msgstr "Chứa cài đặt xuất glTF trong dự án Blender" +msgstr "Lưu các sắp đặt xuất khẩu glTF trong đề án Blender" msgctxt "Operator" msgid "Export X3D" -msgstr "Xuất X3D" +msgstr "Xuất Khẩu ra X3D" msgid "Export selection to Extensible 3D file (.x3d)" -msgstr "Xuất được chọn vào tập tin 3D Có Thể Mở Rộng (.x3d)" +msgstr "Xuất Khẩu lựa chọn ra tập tin định dạng Extensible 3D (3D có khả năng mở rộng) (.x3d)" msgid "Name decorations" -msgstr "Đặt tên cho trang Trí" +msgstr "Trang trí tên" msgid "Add prefixes to the names of exported nodes to indicate their type" -msgstr "Kèm đầu phía trước tên của giao điểm được xuất để giúp biết loại của chúng nó" +msgstr "Thêm tiền tố vào các tên của nút xuất khẩu để ám chỉ thể loại của chúng" msgid "Compress" @@ -51554,152 +56190,152 @@ msgstr "Nén" msgid "Compress the exported file" -msgstr "Nén tập tin được kết xuất" +msgstr "Nén tập tin xuất khẩu" msgid "H3D Extensions" -msgstr "Đồ Mở Rộng H3D" +msgstr "Định dạng H3D" msgid "Export shaders for H3D" -msgstr "Xuất bộ tô sặc cho H3D" +msgstr "Xuất Khẩu các bộ tô bóng cho H3D" msgid "Hierarchy" -msgstr "Tầng Bậc" +msgstr "Thứ Bậc" msgid "Export parent child relationships" -msgstr "Xuất quan hệ phủ huynh và con cái" +msgstr "Xuất Khẩu các quan hệ giữa phụ huynh và con cái" msgid "Use transformed mesh data from each object" -msgstr "Dùng dữ liệu mạng lưới được biến hóa từ mỗi vật thể" +msgstr "Sử dụng dữ liệu khung lưới biến hóa từ mỗi đối tượng" msgid "Write normals with geometry" -msgstr "Ghi pháp tuyến với hình dạng" +msgstr "Viết hình học ra cùng với các pháp tuyến của chúng" msgid "Write quads into 'IndexedTriangleSet'" -msgstr "Ghi tư giác và 'TậpTamGiácCóChỉSố'" +msgstr "Viết các tứ giác thành 'IndexedTriangleSet' (Bộ Tam Giác có Chỉ Số)" msgctxt "Operator" msgid "Export MDD" -msgstr "Xuất MD" +msgstr "Xuất Khẩu MDD" msgid "Animated mesh to MDD vertex keyframe file" -msgstr "Mạng Lưới hoạt hình thành tập tin MDD bức ảnh mẫu vật đỉnh" +msgstr "Khung lưới đã hoạt họa thành tập tin khung khóa điểm đỉnh MDD" msgid "Frames Per Second" -msgstr "Bức Ảnh/Giây" +msgstr "Khung Hình/Giây" msgid "Number of frames/second" -msgstr "Số lượng bức ảnh/giây" +msgstr "Số lượng khung hình/giây" msgid "End frame for baking" -msgstr "Số bức ảnh để kết thúc nướng" +msgstr "Khung hình cuối cùng để nướng" msgid "Start frame for baking" -msgstr "Số bức ảnh để bắt đầu nướng" +msgstr "Khung hình đầu tiên để nướng" msgid "Rest Frame" -msgstr "Bức Ảnh Nghỉ" +msgstr "Khung Hình Trạng Thái Nghỉ" msgid "Write the rest state at the first frame" -msgstr "Ghi lưu trạng thái nghỉ tại bức ảnh đầu" +msgstr "Ghi trạng thái nghỉ ở khung hình đầu tiên" msgctxt "Operator" msgid "Automatically Pack Resources" -msgstr "Tự Động Gói Lại Tài Nguyên" +msgstr "Tự Động Đóng Gói Tài Nguyên" msgid "Automatically pack all external files into the .blend file" -msgstr "Tự động gói hết tập tin ở ngoài trong tập tin .blend" +msgstr "Tự động đóng gói toàn bộ các tập tin ở bên ngoài vào trong tập tin .blend" msgctxt "Operator" msgid "Add Bookmark" -msgstr "Thêm Dấu Sách" +msgstr "Thêm Dấu Trang" msgid "Add a bookmark for the selected/active directory" -msgstr "Thêm dấu sách cho thư mục được chọn/hoạt động" +msgstr "Đánh dấu trang thư mục được chọn/đang hoạt động" msgctxt "Operator" msgid "Cleanup Bookmarks" -msgstr "Làm Sạch Dấu Sách" +msgstr "Dọn Dẹp Dấu Trang" msgid "Delete all invalid bookmarks" -msgstr "Xóa hết dấu sách không hợp lệ" +msgstr "Xóa toàn bộ các dấu trang không hợp lệ" msgctxt "Operator" msgid "Delete Bookmark" -msgstr "Xóa Dấu Sách" +msgstr "Xóa Dấu Trang" msgid "Delete selected bookmark" -msgstr "Xóa dấu sách được chọn" +msgstr "Xóa dấu trang được chọn" msgctxt "Operator" msgid "Move Bookmark" -msgstr "Di Chuyển Dấu Sách" +msgstr "Di Chuyển Dấu Trang" msgid "Move the active bookmark up/down in the list" -msgstr "Di chuyển dấu sách hoạt động lên/xuống trong danh sách" +msgstr "Di chuyển dấu trang đang hoạt động lên/xuống trong danh sách" msgid "Direction to move the active bookmark towards" -msgstr "Hướng để di chuyển lớp hoạt động" +msgstr "Chiều hướng để di chuyển dấu trang đang hoạt động về" msgid "Top of the list" -msgstr "Trên cùng của danh sách" +msgstr "Đỉnh của danh sách" msgid "Bottom of the list" -msgstr "Dưới cùng của danh sách" +msgstr "Đáy của danh sách" msgctxt "Operator" msgid "Cancel File Load" -msgstr "Hủy Nhập Tập Tin" +msgstr "Hủy Nạp Tập Tin" msgid "Cancel loading of selected file" -msgstr "Hủy nhập tập tin được chọn" +msgstr "Hủy quá trình nạp tập tin được chọn" msgctxt "Operator" msgid "Delete Selected Files" -msgstr "Xóa Tập Tin Được Chọn" +msgstr "Xóa Tập Tin được Chọn" msgid "Move selected files to the trash or recycle bin" -msgstr "Di chuyển các tập tin được chọn vào thùng rác hay thùng tái tạo" +msgstr "Di chuyển các tập tin đã chọn vào thùng rác hoặc thùng tái chế" msgctxt "Operator" msgid "Create New Directory" -msgstr "Chế Tạo Thư Mục Mới" +msgstr "Kiến Tạo Thư Mục Mới" msgid "Create a new directory" -msgstr "Chế tọa thư mục mới" +msgstr "Tọa thư mục mới" msgid "Name of new directory" @@ -51716,104 +56352,213 @@ msgstr "Mở thư mục mới" msgctxt "Operator" msgid "Edit Directory Path" -msgstr "Biên Tập Đường Dẫn Thư Mục" +msgstr "Chỉnh Sửa Đường Dẫn Thư Mục" msgid "Start editing directory field" -msgstr "Bắt đầu biên tập trường thư mục" +msgstr "Bắt đầu chỉnh sửa trường thư mục" msgctxt "Operator" msgid "Execute File Window" -msgstr "Thức Hành Cửa Sổ Tập Tin" +msgstr "Cửa Sổ Thi Hành Tập Tin" msgid "Execute selected file" -msgstr "Thực hành tập tin được chọn" +msgstr "Thi hành tập tin được chọn" + + +msgctxt "Operator" +msgid "External File Operation" +msgstr "Thao Tác Tập Tin Bên Ngoài" + + +msgid "Perform external operation on a file or folder" +msgstr "Thực hiện thao tác bên ngoài trên một tập tin hoặc thư mục" + + +msgid "File or folder path" +msgstr "Đường dẫn tập tin hoặc thư mục" + + +msgid "Operation to perform on the file or path" +msgstr "Thao tác thực hiện trên tập tin hoặc đường dẫn" + + +msgid "Open the file" +msgstr "Mở tập tin" + + +msgid "Open Folder" +msgstr "Mở Thư Mục" + + +msgid "Open the folder" +msgstr "Mở thư mục" + + +msgid "Edit the file" +msgstr "Biên soạn tập tin" + + +msgid "Create a new file of this type" +msgstr "Tạo một tập tin mới thuộc loại này" + + +msgid "Find File" +msgstr "Tìm Tập Tin" + + +msgid "Search for files of this type" +msgstr "Tìm kiếm các tập tin thuộc loại này" msgid "Show" -msgstr "Hiện" +msgstr "Hiển thị" + + +msgid "Show this file" +msgstr "Hiển thị tập tin này" msgid "Play" -msgstr "Hát" +msgstr "Chơi" + + +msgid "Play this file" +msgstr "Chơi tập tin này" + + +msgid "Browse" +msgstr "Duyệt" + + +msgid "Browse this file" +msgstr "Duyệt tập tin này" + + +msgid "Preview this file" +msgstr "Xem trước tập tin này" + + +msgid "Print" +msgstr "In Ấn" + + +msgid "Print this file" +msgstr "In tập tin này" + + +msgid "Install" +msgstr "Cài Đặt" + + +msgid "Install this file" +msgstr "Cài đặt tập tin này" + + +msgid "Run As User" +msgstr "Chạy Với Tư Cách Người Dùng" + + +msgid "Run as specific user" +msgstr "Chạy với tư cách người dùng cụ thể nào đó" + + +msgid "Show OS Properties for this item" +msgstr "Hiển Thị các Tính Chất của Hệ Điều Hành cho mục này" + + +msgid "Find in Folder" +msgstr "Tìm trong Thư Mục" + + +msgid "Search for items in this folder" +msgstr "Tìm kiếm các mục trong thư mục này" + + +msgid "Command Prompt Here" +msgstr "Dấu Nhắc Lệnh Ở Đây" + + +msgid "Open a command prompt here" +msgstr "Mở một dấu nhắc lệnh ở đây" msgctxt "Operator" msgid "Increment Number in Filename" -msgstr "Tiến Lên Số Trong Tên Tập Tin" +msgstr "Số Tăng trong Tên Tập Tin" msgid "Increment number in filename" -msgstr "Tiến lên số trong tên tập tin" +msgstr "Số tăng dùng trong tên của tập tin" msgid "Increment" -msgstr "Tiến Lên" +msgstr "Phân Khoảng/Gia Lượng" msgctxt "Operator" msgid "File Selector Drop" -msgstr "Chỗ Thả Tập Tin Được Chọn" +msgstr "Thả Tập Tin vào Trình Lựa Chọn" msgctxt "Operator" msgid "Find Missing Files" -msgstr "Tìm Tập Tin Mất Tích" +msgstr "Lùng Tìm các Tập Tin Mất Tích" msgid "Try to find missing external files" -msgstr "Thử tìm hết tập tin ở ngoài bị mất tích" +msgstr "Thử lùng tìm các tập tin bên ngoài bị mất tích" msgid "Find All" -msgstr "Tìm Hết" +msgstr "Lùng Tìm Toàn Bộ" msgid "Find all files in the search path (not just missing)" -msgstr "Tìm hết tập tin trong đường dẫn tìm (không phải chỉ mất tích)" +msgstr "Lùng tìm toàn bộ các tập tin trong đường dẫn tìm kiếm (không chỉ bản thiếu vắng mà thôi)" msgctxt "Operator" msgid "Toggle Hide Dot Files" -msgstr "Bật/Tắt Giấu Tập Tin Dấu Chấm" +msgstr "Bật/Tắt tính năng Ẩn Giấu các Tập Tin có Dấu Chấm Đầu" msgid "Toggle hide hidden dot files" -msgstr "Bật/tắt giấu tập tin dấu chấm" +msgstr "Bật/tắt tính năng ẩn giấu các tập tin bí ẩn có chấm đầu" msgctxt "Operator" msgid "Highlight File" -msgstr "Tô Sáng Tập Tin" +msgstr "Nêu Bật Tập Tin" msgid "Highlight selected file(s)" -msgstr "Tô sáng tập tin được chọn" +msgstr "Nêu bật tập tin được chọn" msgctxt "Operator" msgid "Make Paths Absolute" -msgstr "Làm Đường Dẫn Tuyệt Đối" +msgstr "Biến các Đường Dẫn thành Đường Dẫn Tuyệt Đối" msgid "Make all paths to external files absolute" -msgstr "Làm hết đường dẫn đến tập tin ngoài tuyệt đối" +msgstr "Tuyệt đối hóa toàn bộ các đường dẫn tham chiếu đến những tập tin bên ngoài" msgctxt "Operator" msgid "Make Paths Relative" -msgstr "Làm Đường Dẫn Tương Đối" +msgstr "Tương Đối Hóa các Đường Dẫn" msgid "Make all paths to external files relative to current .blend" -msgstr "Làm hết đường dẫn đến tập tin ngoài tương đối với tập tin .blend hiện tại" +msgstr "Tương đối hóa các đường dẫn đến những tập tin bên ngoài, làm cho chúng tương đối với tập tin .blend hiện tại" msgctxt "Operator" msgid "Execute File" -msgstr "Thức Hành Tập Tin" +msgstr "Thực Thi Tập Tin" msgid "Perform the current execute action for the file under the cursor (e.g. open the file)" @@ -51822,29 +56567,34 @@ msgstr "Thực hành hành động hiện tại cho tập tin ở dưới con tr msgctxt "Operator" msgid "Next Folder" -msgstr "Hồ Sơ Tiếp" +msgstr "Thư Mục Tiếp Theo" msgid "Move to next folder" -msgstr "Di chuyển đến hồ sơ tiếp" +msgstr "Di chuyển đến thư mục tiếp theo" msgctxt "Operator" msgid "Pack Resources" -msgstr "Gói Lại Tài Nguyên" +msgstr "Đóng Gói Tài Nguyên" msgid "Pack all used external files into this .blend" -msgstr "Gói hết tập tin ngoài trong tập tin .blend này" +msgstr "Đóng gói toàn bộ các tập tin bên ngoài, mà hiện đang được sử dụng, vào trong tập tin .blend này" msgctxt "Operator" msgid "Pack Linked Libraries" -msgstr "Gói Lại Thư Viện Được Liên Kết" +msgstr "Đóng Gói Thư Viện Nối Kết" msgid "Store all data-blocks linked from other .blend files in the current .blend file. Library references are preserved so the linked data-blocks can be unpacked again" -msgstr "Chứa hết cục dữ liệu được liên kết từ tập tin .blender khác trong tập tin .blend hiện tại. Tham chiếu thư viện được giữ nguyên cho các cục dữ liệu được liên kết có thể mở gói lai" +msgstr "Lưu trữ toàn bộ các khối dữ liệu liên kết tới các tập tin .blend khác trong tập tin .blend hiện tại. Các tham chiếu thư viện được bảo tồn để các khối dữ liệu liên kết có thể được tái giải nén một lần nữa" + + +msgctxt "Operator" +msgid "Parent Directory" +msgstr "Thư Mục Phụ Huynh" msgid "Move to parent directory" @@ -51853,84 +56603,84 @@ msgstr "Di chuyển đến thư mục phụ huynh" msgctxt "Operator" msgid "Previous Folder" -msgstr "Hồ Sơ Trước" +msgstr "Thư Mục Trước" msgid "Move to previous folder" -msgstr "Di chuyển tới hồ sơ trước" +msgstr "Di chuyển tới thư mục trước" msgctxt "Operator" msgid "Refresh File List" -msgstr "Nạp Lại Danh Sách Tập Tin" +msgstr "Cập Nhật Danh Sách Tập Tin" msgid "Refresh the file list" -msgstr "Nạp lại danh sách tập tin" +msgstr "Cập nhật danh sách tập tin (lấy các thay đổi vào)" msgctxt "Operator" msgid "Rename File or Directory" -msgstr "Đổi Tên Tập Tin Hay Thư Mục" +msgstr "Đổi Tên Tập Tin hoặc Thư Mục" msgid "Rename file or file directory" -msgstr "Đổi tên tập tin hay thư mục tập tin" +msgstr "Đổi tên tập tin hoặc thư mục" msgctxt "Operator" msgid "Report Missing Files" -msgstr "Báo Cáo Tập Tin Mất Tích" +msgstr "Thông Báo các Tập Tin bị Mất Tích" msgid "Report all missing external files" -msgstr "Báo cáo về hết tập tin ở ngoài bị mất tích" +msgstr "Thông báo không tìm thấy toàn bộ các tập tin bên ngoài" msgctxt "Operator" msgid "Reset Recent" -msgstr "Đặt Lại Gần Đây" +msgstr "Hoàn Lại Gần Đây" msgid "Reset recent files" -msgstr "Đặt lại tập tin gần đây" +msgstr "Hoàn lại các tập tin gần đây" msgid "Handle mouse clicks to select and activate items" -msgstr "Sử dụng bấm chuột để chọn và hoạt động mặt hàng" +msgstr "Xử lý các bấm chuột để lựa chọn và kích hoạt các phần tử" msgid "Select everything beginning with the last selection" -msgstr "Chọn tất cả bắt đầu với lựa chọn cuối cùng" +msgstr "Chọn mọi cái, khởi đầu với vùng chọn trước đây" msgid "Only Activate if Selected" -msgstr "Chỉ Hoạt Động nốu được Chọn" +msgstr "Chỉ Kích Hoạt nếu Được Chọn" msgid "Do not change selection if the item under the cursor is already selected, only activate it" -msgstr "Không đổi sự lựa chọn nếu mặt hàng ở dưới con trỏ đã chọn rồi, chỉ hoạt động nó" +msgstr "Không thay đổi vùng chọn nếu mục nằm dưới con trỏ đã được chọn rồi, chỉ kích hoạt nó thôi" msgid "Open a directory when selecting it" -msgstr "Mở thư mục khi chọn nó" +msgstr "Mở thư mục khi đang chọn nó" msgid "Pass Through" -msgstr "Xuyên Qua" +msgstr "Cho Phép Đi Qua" msgid "Even on successful execution, pass the event on so other operators can execute on it as well" -msgstr "Mạc dụ thực hành thành công, xuyên qua sự kiện cho những thao tác khác có thể thực hành nó nữa" +msgstr "Ngay cả khi thi hành thành công rồi đi chăng nữa thì cũng vẫn truyền các sự kiện tiếp đi, để các thao tác khác cũng có thể thi hành trên chúng nữa" msgctxt "Operator" msgid "(De)select All Files" -msgstr "Chọn/Thả Hết Tập Tin" +msgstr "Chọn/Hủy Chọn Toàn Bộ các Tập Tin" msgid "Select or deselect all files" -msgstr "Chọn và thả hết tập tin" +msgstr "Chọn và hủy chọn toàn bộ các tập tin" msgctxt "Operator" @@ -51939,28 +56689,28 @@ msgstr "Chọn Thư Mục" msgid "Select a bookmarked directory" -msgstr "Chọn thư mục có dấu sách" +msgstr "Chọn thư mục đã được đánh dấu trang" msgid "Activate/select the file(s) contained in the border" -msgstr "Hoạt động/chọn (các) tập tin ở trong ranh giới" +msgstr "Kích hoạt/chọn (các) tập tin nằm trong ranh giới" msgctxt "Operator" msgid "Walk Select/Deselect File" -msgstr "Đi Bộ Chọn/Thả Tập Tin" +msgstr "Tiến Bước Chọn/Hủy Chọn Tập Tin" msgid "Select/Deselect files by walking through them" -msgstr "Chọn/Thả tập tin bằng đi bộ xuyên nó" +msgstr "Chọn/Hủy chọn các tập tin bằng cách tiến bước thông xuyên qua chúng" msgid "Walk Direction" -msgstr "Hướng Đi Bộ" +msgstr "Chiều Hướng Tiến Bước" msgid "Select/Deselect element in this direction" -msgstr "Chọn/Thả phần tử theo hướng này" +msgstr "Chọn/Hủy Chọn phần tử ở hướng này" msgid "Previous" @@ -51968,117 +56718,117 @@ msgstr "Trước" msgid "Next" -msgstr "Tiếp" +msgstr "Tiếp Theo" msgctxt "Operator" msgid "Smooth Scroll" -msgstr "Cuộn Mịn" +msgstr "Cuộn Nhẹ Nhàng" msgid "Smooth scroll to make editable file visible" -msgstr "Cuộn mịn để hiện tập tin có thể biên tập" +msgstr "Cuộn nhẹ nhàng để làm cho tập tin biên soạn có thể nhìn thấy được" msgctxt "Operator" msgid "Sort from Column" -msgstr "Sắp Xếp từ Cột" +msgstr "Sắp Thứ Tự dùng Cột" msgid "Change sorting to use column under cursor" -msgstr "Đổi sắp xếp cho dùng cột ở dưới con trỏ" +msgstr "Đổi thứ tự sắp xếp dùng cột nằm dưới con trỏ" msgctxt "Operator" msgid "Unpack Resources" -msgstr "Gỡ Gói Tài Nguyên" +msgstr "Giải Nén Tài Nguyên" msgid "Unpack all files packed into this .blend to external ones" -msgstr "Gỡ gói hết tập tin gói vào tập tin .blend này vào các tập tin ngoài" +msgstr "Mở gói toàn bộ các tập tin đã đóng gói vào tập tin .blend này ra các tập tin bên ngoài" msgid "How to unpack" -msgstr "Phương pháp gỡ gói" +msgstr "Phương pháp mở gói" msgid "Use files in current directory (create when necessary)" -msgstr "Dùng tập tin trong thư mục hiện tại (chế tạo khi cần)" +msgstr "Sử dụng các tập tin trong thư mục hiện tại (kiến tạo bản mới khi cần)" msgid "Write files to current directory (overwrite existing files)" -msgstr "Lưu tập tin vào thư mục hiện tại (ghi lại trên tập tin có sẵn)" +msgstr "Ghi các tập tin vào thư mục hiện tại (viết đè lên những tập tin hiện có)" msgid "Use files in original location (create when necessary)" -msgstr "Dùng tập tin trong vị trí ban đầu (chế tạo khi cần)" +msgstr "Dùng các tập tin từ vị trí gốc (kiến tạo bản mới khi cần)" msgid "Write files to original location (overwrite existing files)" -msgstr "Lưu tập tin vào vị trí ban đầu (ghi trên tập tin có sẵn)" +msgstr "Ghi các tập tin vào vị trí gốc (viết đè lên những tập tin hiện có)" msgid "Disable auto-pack, keep all packed files" -msgstr "Tắt gói lại-tự động, giữ hết tập tin được gói lại" +msgstr "Tắt đóng gói-tự động, duy trì toàn bộ các tập tin đã đóng gói" msgid "Remove Pack" -msgstr "Xoá Gói" +msgstr "Loại Bỏ Gói" msgctxt "Operator" msgid "Unpack Item" -msgstr "Gỡ Gói Mặt Hàng" +msgstr "Mở Gói Phần Tử" msgid "Unpack this file to an external file" -msgstr "Gỡ gói cho tập tin này vào một tập tin ngoài" +msgstr "Mở gói tập tin này ra một tập tin ở bên ngoài" msgid "Name of ID block to unpack" -msgstr "Tên của cục ID cho gỡ gói" +msgstr "Tên của khối ID để mở gói" msgid "Identifier type of ID block" -msgstr "Loại phận tích của cục ID" +msgstr "Thể loại định danh nhận dạng của khối ID" msgid "Use file from current directory (create when necessary)" -msgstr "Dùng tập tin từ thư mục hiện tại (chế tạo khi cần)" +msgstr "Dùng tập tin từ thư mục hiện tại (kiến tạo bản mới khi cần)" msgid "Write file to current directory (overwrite existing file)" -msgstr "Lưu tập tin vào thư mục hiện tại (ghi trên tập tin có sẵn)" +msgstr "Ghi tập tin vào thư mục hiện tại (viết đè lên những tập tin hiện có)" msgid "Use file in original location (create when necessary)" -msgstr "Dùng tập tin tại vị trí ban đầu (chế tạo khi cần)" +msgstr "Dùng tập tin tại vị trí gốc (kiến tạo bản mới khi cần)" msgid "Write file to original location (overwrite existing file)" -msgstr "Lưu tập tin vào vị trí ban đầu (ghi trên tập tin có sẵn)" +msgstr "Ghi tập tin vào vị trí gốc (viết đè lên tập những tập tin hiện có)" msgctxt "Operator" msgid "Unpack Linked Libraries" -msgstr "Gỡ Gói Thư Viện Blender Được Liên Kết" +msgstr "Giải Nén các Thư Viện Kết Nối" msgid "Restore all packed linked data-blocks to their original locations" -msgstr "Hoàn lại hết cục dữ liệu liên kết được gói lại đến vị trí ban đầu" +msgstr "Khôi phục lại toàn bộ các khối dữ liệu kết nối đã được đóng gói về vị trí (trên ổ cứng) ban đầu của chúng" msgid "Scroll the selected files into view" -msgstr "Cuộn vào các tập tin được chọn cho nhìn thấy" +msgstr "Đưa các tập tin đã chọn vào tầm nhìn" msgctxt "Operator" msgid "Bake All" -msgstr "Nướng Hết" +msgstr "Nướng Toàn bộ các" msgid "Bake Entire Fluid Simulation" -msgstr "Nướng Toàn Bộ Mô Phỏng Chất Lỏng" +msgstr "Nướng Toàn Thể Mô Phỏng Chất Lỏng" msgctxt "Operator" @@ -52092,29 +56842,29 @@ msgstr "Nướng Dữ Liệu Chất Lỏng" msgctxt "Operator" msgid "Bake Guides" -msgstr "Nướng Hướng Dẫn" +msgstr "Nướng Chỉ Dẫn" msgid "Bake Fluid Guiding" -msgstr "Nướng Hướng Dẫn Chất Lỏng" +msgstr "Nướng Chỉ Dẫn Chất Lỏng" msgctxt "Operator" msgid "Bake Mesh" -msgstr "Nướng Mạng Lưới" +msgstr "Nướng Khung Lưới" msgid "Bake Fluid Mesh" -msgstr "Nướng Mạng Lưới Chất Lỏng" +msgstr "Nướng Khung Lưới Chất Lỏng" msgctxt "Operator" msgid "Bake Noise" -msgstr "Nướng Huyên Náo" +msgstr "Nướng Nhiễu" msgid "Bake Fluid Noise" -msgstr "Nướng Huyên Náo Chất Lỏng" +msgstr "Nướng Nhiễu Chất Lỏng" msgctxt "Operator" @@ -52128,101 +56878,111 @@ msgstr "Nướng Hạt Chất Lỏng" msgctxt "Operator" msgid "Free All" -msgstr "Xóa Hết" +msgstr "Phóng Thích Toàn bộ các" msgid "Free Entire Fluid Simulation" -msgstr "Xóa Toàn Bộ Mô Phỏng Chất Lỏng" +msgstr "Phóng Thích Toàn Thể Mô Phỏng Chất Lỏng" msgctxt "Operator" msgid "Free Data" -msgstr "Xóa Dữ Liệu" +msgstr "Phóng Thích Dữ Liệu" msgid "Free Fluid Data" -msgstr "Xóa Dữ Liệu Chất Lỏng" +msgstr "Phóng Thích Dữ Liệu Chất Lỏng" msgctxt "Operator" msgid "Free Guides" -msgstr "Xóa Hướng Dẫn" +msgstr "Phóng Thích Chỉ Dẫn" msgid "Free Fluid Guiding" -msgstr "Xóa Hướng Dẫn Chất Lỏng" +msgstr "Phóng Thích Chỉ Dẫn trong Chất Lỏng" msgctxt "Operator" msgid "Free Mesh" -msgstr "Xóa Mạng Lưới" +msgstr "Phóng Thích Khung Lưới" msgid "Free Fluid Mesh" -msgstr "Xóa Mạng Lưới Chất Lỏng" +msgstr "Phóng Thích Khung Lưới Chất Lỏng" msgctxt "Operator" msgid "Free Noise" -msgstr "Xóa Huyên Náo" +msgstr "Phóng Thích Nhiễu" msgid "Free Fluid Noise" -msgstr "Xóa Huyên Náo Chất Lỏng" +msgstr "Phóng Thích Nhiễu Chất Lỏng" msgctxt "Operator" msgid "Free Particles" -msgstr "Xóa Hạt" +msgstr "Phóng Thích Hạt" msgid "Free Fluid Particles" -msgstr "Xóa Hạt Chất Lỏng" +msgstr "Phóng Thích Hạt Chất Lỏng" msgctxt "Operator" msgid "Pause Bake" -msgstr "Đừng Lại Nướng" +msgstr "Tạm Ngưng Quá Trình Nướng" msgid "Pause Bake" -msgstr "Đừng Lại Nướng" +msgstr "Tạm Ngưng Quá Trình Nướng" msgctxt "Operator" msgid "Add Fluid Preset" -msgstr "Thêm Đặt Sẵn Chất Lỏng" +msgstr "Thêm Sắp Đặt Sẵn về Chất Lỏng" msgid "Add or remove a Fluid Preset" -msgstr "Thêm hay xóa Đặt Sẵn Chất Lỏng" +msgstr "Thêm hay xóa một Sắp Đặt Sẵn về Chất Lỏng" msgctxt "Operator" msgid "Set Case" -msgstr "Đặt Chữ Hoa/Nhỏ" +msgstr "Đặt Kiểu Chữ" msgid "Set font case" -msgstr "Đặt chữ hoa/nhỏ" +msgstr "Đặt kiểu chữ" msgctxt "Text" msgid "Case" -msgstr "Chữ Hoa/Nhỏ" +msgstr "Kiểu Chữ" msgid "Lower or upper case" -msgstr "Chữ nhỏ hay chữ hoa" +msgstr "Kiểu chữ thường hay chữ hoa" + + +msgctxt "Text" +msgid "Lower" +msgstr "Chữ Thường" + + +msgctxt "Text" +msgid "Upper" +msgstr "Chữ Hoa" msgctxt "Operator" msgid "Toggle Case" -msgstr "Đổi Hoa/Nhỏ" +msgstr "Chuyển Đổi Kiểu Chữ" msgid "Toggle font case" -msgstr "Đổi chữ hoa/nhỏ " +msgstr "Chuyển đổi kiểu chữ hoa/thường" msgctxt "Operator" @@ -52239,41 +56999,49 @@ msgstr "Lệch Lạc" msgid "Number to increase or decrease character code with" -msgstr "Số cho tăng hay giảm mã số ký tự" +msgstr "Số dùng để tăng hay giảm mã số của ký tự với" msgctxt "Operator" msgid "Change Spacing" -msgstr "Đổi Cách Giữa" +msgstr "Đổi Phân Khoảng" msgid "Change font spacing" -msgstr "Đổi cách giữa của phông" +msgstr "Đổi khoảng phân cách của phông" msgid "Amount to decrease or increase character spacing with" -msgstr "Mức giảm hay tăng cách giữa ký tự" +msgstr "Lượng dùng để tăng hoặc giảm khoảng phân cách của ký tự" msgid "Next or Selection" -msgstr "Tiếp hay sự lựa chọn" +msgstr "Tiếp Theo hay Lựa Chọn" msgid "Previous or Selection" -msgstr "Trước Hay Sự Lựa Chọn" +msgstr "Trước Đây hay Lựa Chọn" msgctxt "Operator" msgid "Line Break" -msgstr "Bể Dòng" +msgstr "Ngắt Dòng" msgid "Insert line break at cursor position" -msgstr "Chèn bể dòng tại vị trí con trỏ" +msgstr "Chèn thêm dấu ngắt dòng tại vị trí con trỏ" msgid "Move cursor to position type" -msgstr "Di chuyển con trỏ đến vị trí gõ chữ" +msgstr "Di chuyển con trỏ đến thể loại vị trí" + + +msgid "Text Begin" +msgstr "Đầu Văn Bản" + + +msgid "Text End" +msgstr "Cuối Văn Bản" msgid "Previous Line" @@ -52281,7 +57049,7 @@ msgstr "Dòng Trước" msgid "Next Line" -msgstr "Dòng Tiếp" +msgstr "Dòng Tiếp Theo" msgid "Previous Page" @@ -52289,37 +57057,41 @@ msgstr "Trang Trước" msgid "Next Page" -msgstr "Trang Tiếp" +msgstr "Trang Tiếp Theo" msgctxt "Operator" msgid "Move Select" -msgstr "Di Chuyển Chọn" +msgstr "Di Chuyển Lựa Chọn" msgid "Move the cursor while selecting" -msgstr "Di chuyển con trỏ khi đang chọn" +msgstr "Di chuyển con trỏ trong khi đang lựa chọn" msgid "Where to move cursor to, to make a selection" -msgstr "Di chuyển con trỏ đến đâu, để chọn văn bản" +msgstr "Nơi di chuyển con trỏ đến, để tạo vùng lựa chọn" msgctxt "Operator" msgid "Open Font" -msgstr "Nhập Phông" +msgstr "Đọc Phông" msgid "Load a new font from a file" -msgstr "Nhập phông mới từ tập tin" +msgstr "Nạp phông mới từ một tập tin" msgid "Select all text" -msgstr "Chọn hết văn bản" +msgstr "Chọn toàn bộ văn bản" msgid "Select word under cursor" -msgstr "Chọn chữ ở đưới con trỏ" +msgstr "Chọn chữ nằm dưới con trỏ" + + +msgid "Set cursor selection" +msgstr "Đặt con trỏ lựa chọn" msgctxt "Operator" @@ -52332,7 +57104,7 @@ msgstr "Đặt kiểu phông" msgid "Clear style rather than setting it" -msgstr "Xóa kiểu thay thế đặt nó" +msgstr "Xóa bỏ kiểu cách, thay vì đặt nó" msgid "Style" @@ -52340,33 +57112,33 @@ msgstr "Kiểu" msgid "Style to set selection to" -msgstr "Đặt kiểu phông" +msgstr "Đặt kiểu phông cho vùng lựa chọn" msgid "Bold" -msgstr "Đậm" +msgstr "Chữ Đậm" msgid "Italic" -msgstr "Nghiêng" +msgstr "Chữ Nghiêng" msgid "Underline" -msgstr "Gạch Dưới" +msgstr "Gạch Chân" msgctxt "Operator" msgid "Toggle Style" -msgstr "Bặt/Tắt Kiểu" +msgstr "Đảo Chọn Kiểu Cách" msgid "Toggle font style" -msgstr "Bật/tắt kiểu phông" +msgstr "Đảo chọn kiểu phông" msgctxt "Operator" msgid "Copy Text" -msgstr "Chép Văn Bản" +msgstr "Sao Chép Văn Bản" msgctxt "Operator" @@ -52375,20 +57147,20 @@ msgstr "Cắt Văn Bản" msgid "Cut selected text to clipboard" -msgstr "Cắt văn bản được chọn vào bảng dán" +msgstr "Cắt văn bản đã chọn vào bảng nhớ tạm" msgctxt "Operator" msgid "Insert Text" -msgstr "Chèn Văn Bản" +msgstr "Chèn Thêm Văn Bản" msgid "Accent Mode" -msgstr "Chế Độ Bỏ Dấu" +msgstr "Chế Độ Điền Dấu" msgid "Next typed character will strike through previous, for special character input" -msgstr "Ký tự gõ tiếp sẽ in trên ký tự trước, cho được nhập ký tự đặc biệt" +msgstr "Ký tự gõ tiếp sẽ in trên ký tự trước, dành cho việc gõ chữ cái đặc biệt" msgctxt "Operator" @@ -52416,11 +57188,11 @@ msgstr "Thêm một hộp văn bản mới" msgctxt "Operator" msgid "Remove Text Box" -msgstr "Xoá Hộp Văn Bản" +msgstr "Xóa Hộp Văn Bản" msgid "Remove the text box" -msgstr "Xoá hộp văn bản" +msgstr "Xóa hộp văn bản" msgid "The current text box" @@ -52429,175 +57201,218 @@ msgstr "Hộp văn bản hiện tại" msgctxt "Operator" msgid "Unlink" -msgstr "Cắt Liên Kết" +msgstr "Ngắt Kết Nối" msgid "Unlink active font data-block" -msgstr "Cắt liên kết với cục dữ liệu hoạt động " +msgstr "Ngắt kết nối của khối dữ liệu phông đang hoạt động" msgctxt "Operator" msgid "Add Attribute" -msgstr "Thêm Đặc Điểm" +msgstr "Thêm Thuộc Tính" msgid "Add attribute to geometry" -msgstr "Thêm đặc điểm cho hình dạng" +msgstr "Thêm thuộc tính vào hình học" msgid "Type of element that attribute is stored on" -msgstr "Loại phần tử để chứa đặc điểm" +msgstr "Thể loại phần tử mà thuộc tính sẽ được lưu vào đó" msgid "Name of new attribute" -msgstr "Tên của đặc điểm mới" +msgstr "Tên của thuộc tính mới" msgctxt "Operator" msgid "Convert Attribute" -msgstr "Biến Đổi Đặc Điểm" +msgstr "Chuyển Đổi Thuộc Tính" msgid "Change how the attribute is stored" -msgstr "Đổi phương pháp cho chứa đặc điểm" +msgstr "Đổi cách thuộc tính được lưu trữ" msgid "Which geometry element to move the attribute to" -msgstr "Phần tử hình dạng nào để di chuyển đặc điểm đến" +msgstr "Phần tử hình học nào để di chuyển thuộc tính sang" msgid "Generic" -msgstr "Tổng Quát" +msgstr "Phổ Thông" msgctxt "Operator" msgid "Remove Attribute" -msgstr "Xóa Đặc Điểm" +msgstr "Xóa Thuộc Tính" msgid "Remove attribute from geometry" -msgstr "Xóa đặc điểm từ hình dạng" +msgstr "Xóa thuộc tính khỏi hình học" msgctxt "Operator" msgid "Add Color Attribute" -msgstr "Thêm Đặc Điểm Màu Sắc" +msgstr "Thêm Thuộc Tính Màu" msgid "Add color attribute to geometry" -msgstr "Thêm đặc điểm màu sắc cho hình dạng" +msgstr "Thêm thuộc tính màu vào hình học" msgid "Default fill color" -msgstr "Màu mặc định cho tô tràn" +msgstr "Màu tô mặc định" msgid "RGBA color 32-bit floating-point values" -msgstr "Màu RGBA giá trị số thật dấu phẩy động 32 bit" +msgstr "Giá trị dấu phẩy động 32 bit màu RGBA" msgid "Name of new color attribute" -msgstr "Tên của đặc điểm màu sắc mới" +msgstr "Tên của thuộc tính màu mới" + + +msgctxt "Operator" +msgid "Convert Color Attribute" +msgstr "Chuyển Đổi Thuộc Tính Màu" + + +msgid "Change how the color attribute is stored" +msgstr "Đổi cách thuộc tính màu được lưu trữ" msgctxt "Operator" msgid "Duplicate Color Attribute" -msgstr "Bản Sao Đặc Điểm Màu" +msgstr "Nhân Đôi Thuộc Tính Màu" msgid "Duplicate color attribute" -msgstr "Bản sao đặc tính màu" +msgstr "Nhân đôi thuộc tính màu" msgctxt "Operator" msgid "Remove Color Attribute" -msgstr "Xóa Đặc Điểm Màu" +msgstr "Xóa Thuộc Tính Màu" msgid "Remove color attribute from geometry" -msgstr "Xóa đặc điểm màu từ hình dạng" +msgstr "Xóa thuộc tính màu khỏi hình học" msgctxt "Operator" msgid "Set Render Color" -msgstr "Đặt Màu Sắc Kết Xuất" +msgstr "Đặt Màu Kết Xuất" msgid "Set default color attribute used for rendering" -msgstr "Đặt đặc điểm màu sắc mặc định cho kết xuất" +msgstr "Đặt thuộc tính màu mặc định sử dụng để kết xuất" msgid "Name of color attribute" -msgstr "Tên của đặc điểm màu sắc" +msgstr "Tên của thuộc tính màu" + + +msgctxt "Operator" +msgid "Run Node Group" +msgstr "Chạy Nhóm Nút" + + +msgid "Execute a node group on geometry" +msgstr "Thực hiện một nhóm nút trên hình học" + + +msgid "Asset Library Identifier" +msgstr "Mã Định Danh Thư Viện Tài Sản" + + +msgid "Asset Library Type" +msgstr "Thể Loại Thư Viện Tài Sản" msgid "Name of the data-block to use by the operator" -msgstr "Tên của cục dữ liệu để dùng bởi thao tác" +msgstr "Tên của khối dữ liệu mà thao tác sử dụng" + + +msgid "Relative Asset Identifier" +msgstr "Mã Định Danh Tài Sản Tương Đối" msgid "Session UUID" -msgstr "Phiên Chạy UUID" +msgstr "UUID của Phiên Sử Dụng" msgid "Session UUID of the data-block to use by the operator" -msgstr "UUID phiên chạy của cục dữ liệu để thao tác dùng" +msgstr "UUID phiên sử dụng của khối dữ liệu mà thao tác sử dụng" + + +msgctxt "Operator" +msgid "Set Geometry Randomization" +msgstr "Đặt Ngẫu Nhiên Hóa Hình Học" + + +msgid "Toggle geometry randomization for debugging purposes" +msgstr "Bật/tắt ngẫu nhiên hóa hình học cho mục đích điều tra gỡ lỗi" + + +msgid "Randomize the order of geometry elements (e.g. vertices or edges) after some operations where there are no guarantees about the order. This avoids accidentally depending on something that may change in the future" +msgstr "Ngẫu nhiên hóa thứ tự của các phần tử hình học (ví dụ: các điểm đỉnh hoặc các cạnh) sau một số thao tác không có sự đảm bảo về thứ tự. Việc làm này tránh sự phụ thuộc vào cái gì đó có thể thay đổi trong tương lai một cách vô tình" msgctxt "Operator" msgid "Gizmo Select" -msgstr "Chọn Đồ Đạc" +msgstr "Chọn Gizmo" msgid "Select the currently highlighted gizmo" -msgstr "Chọn đồ đạc hiện tại đang nổi bật" +msgstr "Chọn gizmo hiện được nêu bật" msgctxt "Operator" msgid "Gizmo Tweak" -msgstr "Chỉnh Đồ Đạc" +msgstr "Hiệu Chỉnh Gizmo" msgid "Tweak the active gizmo" -msgstr "Chỉnh sửa đồ đạc hoạt động" +msgstr "Hiệu chỉnh gizmo đang hoạt động" msgctxt "Operator" msgid "Delete Active Frame" -msgstr "Xóa Bức Ảnh Hoạt Động" +msgstr "Xóa Khung Hình đang Hoạt Động" msgid "Delete the active frame for the active Grease Pencil Layer" -msgstr "Xóa bức ảnh hoạt động của Lớp Bút Sáp hoạt động" +msgstr "Xóa khung hình đang hoạt động của tầng Bút Chì Dầu đang hoạt động" msgctxt "Operator" msgid "Delete All Active Frames" -msgstr "Xóa Hết Bức Ảnh Hoạt Động" +msgstr "Xóa Toàn Bộ các Khung Hình đang Hoạt Động" msgid "Delete the active frame(s) of all editable Grease Pencil layers" -msgstr "Xóa (các) bức ảnh hoạt động của hết lớp Bút Sáp có thể biên tập" +msgstr "Xóa (các) khung hình đang hoạt động của toàn bộ các tầng lớp Bút Chì Dầu có thể biên soạn" msgctxt "Operator" msgid "Annotation Draw" -msgstr "Vẽ Lời Ghi Chú" +msgstr "Vẽ Chú Thích" msgid "Make annotations on the active data" -msgstr "Làm lời ghi chú trên dữ liệu hoạt động" +msgstr "Tạo các chú thích trên dữ liệu đang hoạt động" msgid "End Arrow Style" -msgstr "Phong Cách Kết Thúc Mũi Tên" +msgstr "Kiểu Mũi Tên Kết Thúc" msgid "Stroke end style" -msgstr "Phong cách kết thúc nét" +msgstr "Kiểu kết thúc nét vẽ" msgid "Don't use any arrow/style in corner" -msgstr "Không dùng bất cứ mũi tên/phong cách trong góc giác" +msgstr "Không được sử dụng bất cứ mũi tên/kiểu cách nào ở góc hết" msgid "Arrow" @@ -52605,7 +57420,7 @@ msgstr "Mũi Tên" msgid "Use closed arrow style" -msgstr "Dùng phong cách mũi tên đóng" +msgstr "Sử dụng kiểu mũi tên khép kín" msgid "Open Arrow" @@ -52613,31 +57428,31 @@ msgstr "Mũi Tên Mở" msgid "Use open arrow style" -msgstr "Dùng phong cách mũi tên mở" +msgstr "Sử dụng kiểu mũi tên mở" msgid "Segment" -msgstr "Khúc" +msgstr "Phân Đoạn" msgid "Use perpendicular segment style" -msgstr "Dùng phong cách Khúc vuông góc" +msgstr "Sử dụng kiểu phân đoạn vuông góc" msgid "Use square style" -msgstr "Dùng phong cách vuông" +msgstr "Sử dụng kiểu hình vuông" msgid "Start Arrow Style" -msgstr "Phong Cách Bắt Đầu Mũi Tên" +msgstr "Kiểu Mũi Tên Mở Đầu" msgid "Stroke start style" -msgstr "Phong cách bắt đầu nét" +msgstr "Kiểu cách ở đầu nét vẽ" msgid "Way to interpret mouse movements" -msgstr "Làm sao phiên dịch di chuyển chuột" +msgstr "Phương pháp phiên dịch các di chuyển của chuột" msgid "Draw Freehand" @@ -52645,7 +57460,7 @@ msgstr "Vẽ Tự Do" msgid "Draw freehand stroke(s)" -msgstr "Vẽ nét tự do" +msgstr "Vẽ các nét tự do" msgid "Draw Straight Lines" @@ -52653,245 +57468,245 @@ msgstr "Vẽ Đường Thẳng" msgid "Draw straight line segment(s)" -msgstr "Vẽ đoạn đường thẳng" +msgstr "Vẽ các phân đoạn đường thẳng" msgid "Draw Poly Line" -msgstr "Vẽ Đa Đường" +msgstr "Vẽ Đường Đa Giác" msgid "Click to place endpoints of straight line segments (connected)" -msgstr "Bấm trên điểm cuối của đoạn đường thẳng (kết nối nhau)" +msgstr "Bấm chuột để đặt điểm cuối của các phân đoạn đường thẳng (kết nối với nhau)" msgid "Eraser" -msgstr "Bôi" +msgstr "Tẩy/Xóa" msgid "Erase Annotation strokes" -msgstr "Bôi Nét Lời Ghi Chú" +msgstr "Xóa các nét vẽ Chú Thích" msgid "Stabilizer Stroke Factor" -msgstr "Hệ Số Cho Ổn Định Hóa Nét" +msgstr "Hệ Số Ổn Định Hóa Nét Vẽ" msgid "Higher values gives a smoother stroke" -msgstr "Giá trị càng cao nét càng mịm hơn" +msgstr "Các giá trị cao sẽ làm cho nét vẽ càng trơn tru hơn" msgid "Stabilizer Stroke Radius" -msgstr "Bán Kính Cho Ổn Định Hóa Nét" +msgstr "Bán Kính Ổn Định Hóa Nét Vẽ" msgid "Stabilize Stroke" -msgstr "Ổn Định Hóa Nét" +msgstr "Ổn Định Hóa Nét Vẽ" msgid "Helper to draw smooth and clean lines. Press Shift for an invert effect (even if this option is not active)" -msgstr "Cho giúp đỡ vẽ nét sạch và mịn hơn. Bấm phím Shift cho hiệu ứng ngược (cùng được dùng nếu nó chưa hoạt động)" +msgstr "Trình hỗ trợ để vẽ các đường trơn tru và sạch sẽ. Bấm 'Shift' để đảo ngược hiệu ứng (ngay cả khi tùy chọn này không được bật lên)" msgid "Wait for first click instead of painting immediately" -msgstr "Chờ bấm lần đầu thay thế sơn ngay lập tức" +msgstr "Chờ cái bấm chuột đầu tiên, thay vì sơn ngay lập tức" msgid "Delete the active frame for the active Annotation Layer" -msgstr "Xóa bức ảnh hoạt động của Lớp Ghi Chú hoạt động" +msgstr "Xóa khung hình đang hoạt động cho tầng Chú Thích đang hoạt động" msgctxt "Operator" msgid "Annotation Add New" -msgstr "Ghi Chú - Thêm Mới" +msgstr "Thêm Chú Thích Mới" msgid "Add new Annotation data-block" -msgstr "Thêm cục dữ liệu Ghi Chú mới" +msgstr "Thêm khối dữ liệu Chú Thích (Annotation) mới" msgctxt "Operator" msgid "Bake Object Transform to Grease Pencil" -msgstr "Nướng Biến Hóa Vật Thể đến Bút Sáp" +msgstr "Nướng Biến Hóa của Đối Tượng thành Bút Chì Dầu" msgid "Bake grease pencil object transform to grease pencil keyframes" -msgstr "Nướng biến hóa vật thể bút sáp đến bức ảnh mẫu bút sáp" +msgstr "Nướng biến hóa đối tượng bút chì dầu thành các khung khóa Bút Chì Dầu" msgid "The end frame of animation" -msgstr "Bức ảnh hoạt hình kết thúc" +msgstr "Khung hình cuối cùng của hoạt họa" msgid "The start frame" -msgstr "Bức ảnh bắt đầu" +msgstr "Khung hình đầu tiên" msgid "Target Frame" -msgstr "Bức Ảnh Mục Tiêu" +msgstr "Khung Hình Mục Tiêu" msgid "Destination frame" -msgstr "Bức ảnh đích" +msgstr "Khung hình đích" msgid "Only Selected Keyframes" -msgstr "Chỉ Bức Ảnh Mẫu Được Chọn" +msgstr "Duy Các Khung Khóa Được Chọn" msgid "Convert only selected keyframes" -msgstr "Chỉ biến đổi các bức ảnh mẫu được chọn" +msgstr "Duy chuyển đổi các khung khóa đã được chọn mà thôi" msgid "Projection Type" -msgstr "Kiểu Phép Chiếu" +msgstr "Thể Loại Phóng Chiếu" msgid "No Reproject" -msgstr "Không Chiếu Lại" +msgstr "Không Tái Phóng Chiếu" msgid "Reproject the strokes using the X-Z plane" -msgstr "Chiếu lại các nét sử dụng mặt phẳng XZ" +msgstr "Tái phóng chiếu các nét vẽ sử dụng bề diện X-Z" msgid "Side" -msgstr "Trượt" +msgstr "Bên" msgid "Reproject the strokes using the Y-Z plane" -msgstr "Chiếu lại các nét sử dụng mặt phẳng YZ" +msgstr "Tái phóng chiếu các nét vẽ sử dụng bề diện Y-Z" msgid "Reproject the strokes using the X-Y plane" -msgstr "Chiếu lại các nét sử dụng mặt phẳng XY" +msgstr "Tái phóng chiếu các nét vẽ sử dụng bề diện X-Y" msgid "Reproject the strokes to end up on the same plane, as if drawn from the current viewpoint using 'Cursor' Stroke Placement" -msgstr "Chiếu lại các nét cho nằm trên cùng mặt phẳng, như được vẽ từ điểm nhìn hiện tại dùng Vẽ Nét Bằng 'Con Trỏ'" +msgstr "Phóng chiếu lại các nét vẽ lên trên cùng một bình diện, tựa như vẽ từ điểm nhìn hiện tại, dùng phương pháp Đặt Nét Vẽ bằng 'Con Trỏ' ('Cursor' Stroke Placement)" msgid "Reproject the strokes using the orientation of 3D cursor" -msgstr "Chiếu lại các nét bằng định hướng của con trỏ 3D" +msgstr "Phóng chiếu lại các nét vẽ dùng định hướng của con trỏ 3D" msgid "Step between generated frames" -msgstr "Bước giữa các bức ảnh được chế tạo" +msgstr "Bước cách giữa các khung hình sinh tạo" msgctxt "Operator" msgid "Bake Mesh Animation to Grease Pencil" -msgstr "Nướng Hoạt hình Mạng Lưới thành Bút Sáp" +msgstr "Nướng Hoạt Họa Khung Lưới thành Bút Chì Dầu" msgid "Bake mesh animation to grease pencil strokes" -msgstr "Nướng hoạt hình mạng lưới thành nét bút sáp" +msgstr "Nướng hoạt họa của khung lưới thành các nét vẽ bút chì dầu" msgid "Threshold Angle" -msgstr "Ngưỡng Góc" +msgstr "Góc Độ Giới Hạn" msgid "Threshold to determine ends of the strokes" -msgstr "Ngưỡng để phát hiện đầu và cuối của các nét" +msgstr "Giới hạn dùng để xác định điểm kết của các nét vẽ" msgid "Export Faces" -msgstr "Xuất Các Mặt" +msgstr "Xuất Khẩu Các Mặt" msgid "Export faces as filled strokes" -msgstr "Xuất mặt bằng nét được tô đầy" +msgstr "Xuất Khẩu các mặt ra thành các nét vẽ được tô kín" msgid "Stroke Offset" -msgstr "Dịch Nét" +msgstr "Dịch Chuyển của Nét Vẽ" msgid "Offset strokes from fill" -msgstr "Dịch nét từ tô đầy" +msgstr "Dịch chuyển nét vẽ khỏi vùng tô kín" msgid "Only Seam Edges" -msgstr "Chỉ Cạnh Vết Sẹo" +msgstr "Duy các Cạnh Đường Khâu" msgid "Convert only seam edges" -msgstr "Chỉ biến đổi cạnh vết sẹo" +msgstr "Duy chuyển đổi các cạnh là đường khâu vá mà thôi" msgid "Target grease pencil" -msgstr "Mục tiêu bút sáp" +msgstr "Bút chì dầu mục tiêu" msgid "New Object" -msgstr "Vật Thể Mới" +msgstr "Đối Tượng Mới" msgid "Selected Object" -msgstr "Vật Thể Được Chọn" +msgstr "Đối Tượng Được Chọn" msgctxt "Operator" msgid "Insert Blank Frame" -msgstr "Chèn Bức Ảnh Rỗng" +msgstr "Chèn Thêm Khung Hình Trống" msgid "Insert a blank frame on the current frame (all subsequently existing frames, if any, are shifted right by one frame)" -msgstr "Chèn một bức ảnh rỗng trong bức ảnh hiện tại (tất cả bức ảnh tiếp sau sẽ được di chuyển phải một bức ảnh)" +msgstr "Chèn thêm một khung hình trống vào khung hình hiện tại (toàn bộ các khung hình hiện tại tiếp theo, nếu có, sẽ được dịch chuyển về bên phải một bước" msgid "Create blank frame in all layers, not only active" -msgstr "Chế tạo bức ảnh rỗng trong tất cả lớp, không phải chỉ lớp hoạt động" +msgstr "Kiến Tạo khung hình trống trong toàn bộ các tầng lớp, không chỉ tầng đang hoạt động mà thôi" msgid "Reset brush to default parameters" -msgstr "Đặt lại bút đến tham số mặc định" +msgstr "Hoàn lại đầu bút về các tham số mặc định" msgctxt "Operator" msgid "Reset All Brushes" -msgstr "Đặt Lại Hết Bút" +msgstr "Hoàn Lại Toàn Bộ các Đầu Bút" msgid "Delete all mode brushes and recreate a default set" -msgstr "Xóa hết bút chế độ và tạo ra một bộ mới" +msgstr "Xóa toàn bộ các đầu bút của chế độ và tái kiến tạo một bộ mặc định" msgctxt "Operator" msgid "Convert Grease Pencil" -msgstr "Biến Đổi Bút Sáp" +msgstr "Chuyển Đổi Bút Chì Dầu" msgid "Convert the active Grease Pencil layer to a new Curve Object" -msgstr "Biến đổi lớp hoạt động Bút Sáp thành Vật Thể Đường Cong mới" +msgstr "Chuyển đổi tầng Bút Chì Dầu đang hoạt động thành một Đối Tượng Đường Cong mới" msgid "Bevel resolution when depth is non-zero" -msgstr "Độ phân giải cạnh tròn khi độ sâu khác không" +msgstr "Độ phân giải bo cạnh khi chiều sâu khác không" msgid "The end frame of the path control curve (if Realtime is not set)" -msgstr "Bức ảnh cuối của đường cong điều khiển đường dẫn (nếu chưa được đặt ThờiGianThật)" +msgstr "Khung hình cuối của đường cong điều khiển đường dẫn (nếu Thời Gian Thực không được bật)" msgid "The duration of evaluation of the path control curve" -msgstr "Giai đoạn cho tính tóan đường cong điều khiển đường dẫn" +msgstr "Thời lượng để tính toán đường cong điều khiển đường dẫn" msgid "Gap Duration" -msgstr "Giai Đoạn Cách Không" +msgstr "Độ Dài của Khoảng Trống" msgid "Custom Gap mode: (Average) length of gaps, in frames (Note: Realtime value, will be scaled if Realtime is not set)" -msgstr "Hế Độ Cách Không Tùy Chọn: (Trung Bình) giai đoạn cách không, đơn vị số bức ảnh (Chú Ý: Giá trị thời gian thật sẽ bị phóng to nếu chưa được đặt ThờiGianThật)" +msgstr "Chế độ Phân Khoảng Tùy Chọn: (Trung Bình) chiều dài của phân khoảng, trong số khung hình (Lưu ý: giá trị thời gian thực, sẽ bị đổi tỷ lệ nếu Thời Gian Thực không được bật)" msgid "Gap Randomness" -msgstr "Ngẫu Nhiên Cách Không" +msgstr "Phân Khoảng Ngẫu Nhiên" msgid "Custom Gap mode: Number of frames that gap lengths can vary" -msgstr "Chế Độ Cách Không Tùy Chọn: Chênh lệch của số bức ảnh giai đoạn" +msgstr "Chế độ Phân Khoảng Tùy Chọn: Số khung hình mà các phân khoảng có thể dùng để đổi chiều dài của chúng" msgid "Radius Factor" @@ -52899,330 +57714,339 @@ msgstr "Hệ Số Bán Kính" msgid "Multiplier for the points' radii (set from stroke width)" -msgstr "Hệ số nhân cho bán kính của các điểm (đặt bằng bề dày nét)" +msgstr "Số nhân dành cho bán kính của các điểm (lấy từ chiều của rộng nét vẽ)" msgid "Custom Gap mode: Random generator seed" -msgstr "Chế Độ Cách Không Tùy Chọn: Hạt số cho chế tạo số ngẫu nhiên" +msgstr "Chế độ Phân Khoảng Tùy Chọn: mầm của máy phát sinh số ngẫu nhiên" msgid "The start frame of the path control curve" -msgstr "Bức ảnh đầu của đường cong điều khiển đường dẫn" +msgstr "Khung hình đầu của đường cong điều khiển đường dẫn" msgid "Timing Mode" -msgstr "Chế Độ Thời Tự" +msgstr "Chế Độ Thời Gian" msgid "How to use timing data stored in strokes" -msgstr "Làm sao dùng dữ liệu thời tự được chứa trong các nét" +msgstr "Phương pháp sử dụng dữ liệu về bố trí thời gian được lưu trong các nét vẽ" msgid "No Timing" -msgstr "Không Thời Tự" +msgstr "Không Sử Dụng Thời Gian" msgid "Ignore timing" -msgstr "Không quan tâm thời tự" +msgstr "Không quan tâm đến sự bố trí về thời gian" msgid "Simple linear timing" -msgstr "Thời tự bậc một đơn giản" +msgstr "Bố trí thời gian tuyến tính đơn giản" msgid "Use the original timing, gaps included" -msgstr "Dùng thời tự ban đầu, giữ cách không" +msgstr "Dùng sự bố trí thời gian gốc, kể cả các phân khoảng" msgid "Custom Gaps" -msgstr "Cách Không Tùy Chọn" +msgstr "Phân Khoảng Tùy Chọn" msgid "Use the original timing, but with custom gap lengths (in frames)" -msgstr "Dùng thời tự ban đầu, nhưng có giai đoạn cách không tùy chọn (đơn vị bức ảnh)" +msgstr "Dùng sự bố trí thời gian gốc, song với phân khoảng tùy chọn (trong đơn vị khung hình)" msgid "Which type of curve to convert to" -msgstr "Biến đổi thành kiểu đường cong nào" +msgstr "Thể loại đường cong để chuyển đổi thành" msgid "Animation path" -msgstr "Đường dẫn Hoạt Hình" +msgstr "Đường chuyển động của hoạt họa" msgid "Smooth Bezier curve" -msgstr "Cong Beizer Mịn" +msgstr "Đường Cong Bézier mịn màng" msgid "Polygon Curve" -msgstr "Cong Đa Giác" +msgstr "Đường Cong Đa Giác" msgid "Bezier curve with straight-line segments (vector handles)" -msgstr "Cong bezier có khúc đường thẳng (tay cầm vectơ)" +msgstr "Đường cong Bézier với các phân đoạn đường thẳng (các tay cầm vectơ)" msgid "Link Strokes" -msgstr "Liên Kết Nét" +msgstr "Kết Nối các Nét Vẽ" msgid "Whether to link strokes with zero-radius sections of curves" -msgstr "Liên kết nét hay không với khúc đường cong có bán kính bằng không" +msgstr "Liệu có kết nối các nét vẽ với các đoạn có bán kính bằng không của đường cong hay không" msgid "Normalize Weight" -msgstr "Đơn Vị Hóa Quyền Lượng" +msgstr "Bình Thường Hóa Trọng Lượng" msgid "Normalize weight (set from stroke width)" -msgstr "Đơn vị hóa quyền lượng (đặt từ bề dày nét)" +msgstr "Bình thường hóa trọng lượng (lấy từ chiều rộng của nét)" msgid "Whether the path control curve reproduces the drawing in realtime, starting from Start Frame" -msgstr "Đường cong điều khiển đường dẫn có vẽ lại trong thời gian thật hay không, bắt đầu từ Bức Ảnh Đầu" +msgstr "Liệu đường cong điều khiển đường chuyển động có tái tạo lại bản vẽ trong thời gian thực, bắt đầu từ Khung Hình Đầu, hay không" msgid "Has Valid Timing" -msgstr "Có Thời Tự Hợp Lệ" +msgstr "Có Thời Gian Bố Trí Hợp Lệ" msgid "Whether the converted Grease Pencil layer has valid timing data (internal use)" -msgstr "Lớp Bút Sáp biến đổi có dữ liệu thời tự hợp lệ hay không (dùng nội bộ)" +msgstr "Liệu tầng Bút Chì Dầu được chuyển đổi có dữ liệu bố trí thời gian hợp lệ hay không (sử dụng nội bộ)" msgid "Convert 2.7x grease pencil files to 2.80" -msgstr "Biến đổi tập tin bút sáp 2.7x sang 2.80" +msgstr "Chuyển đổi Bút Chì Dầu của 2.7x sang 2.80" msgid "Convert to Annotations" -msgstr "Biết Đổi thành Lời Ghi Chú" +msgstr "Chuyển Đổi sang thành Chú Thích" msgctxt "Operator" msgid "Copy Strokes" -msgstr "Chép Nét" +msgstr "Sao Chép Nét Vẽ" msgid "Copy selected Grease Pencil points and strokes" -msgstr "Chép các điểm và nét Bút Sáp được chọn" +msgstr "Sao chép các điểm và nét Bút Chì Dầu được chọn" msgctxt "Operator" msgid "Annotation Unlink" -msgstr "Gỡ Liên Kết Lời Ghi Chú" +msgstr "Ngắt Kết Nối với Chú Thích" msgid "Unlink active Annotation data-block" -msgstr "Gỡ liên kết cục dữ liệu Lời Ghi Chú hoạt động" +msgstr "Ngắt kết nối với khối dữ liệu Chú Thích đang hoạt động" msgid "Delete selected Grease Pencil strokes, vertices, or frames" -msgstr "Xoá nét, đỉnh, và bức ảnh Bút Sáp được chọn" +msgstr "Xóa các nét vẽ, điểm đỉnh, và các khung hình Bút Chì Dầu được chọn" msgid "Method used for deleting Grease Pencil data" -msgstr "Phương pháp dùng cho xóa dữ liệu Bút Sáp" +msgstr "Phương pháp sử dụng để xóa dữ liệu Bút Chì Dầu" msgid "Delete selected points and split strokes into segments" -msgstr "Xoá các điểm được chọn và chẻ nét sang đoạn đường" +msgstr "Xóa các điểm được chọn và tách phân các nét thành nhiều phân đoạn" msgid "Delete selected strokes" -msgstr "Xóa nét được chọn" +msgstr "Xóa các nét được chọn" msgid "Delete active frame" -msgstr "Xóa bức ảnh hoạt động" +msgstr "Xóa khung hình đang hoạt động" msgctxt "Operator" msgid "Dissolve" -msgstr "Hòa Tan" +msgstr "Tiêu Hủy" msgid "Delete selected points without splitting strokes" -msgstr "Xóa các điểm được chọn mà không chẻ nét" +msgstr "Xóa các điểm được chọn mà không tách phân các nét" msgid "Method used for dissolving stroke points" -msgstr "Phương pháp cho hòa tan điểm nét" +msgstr "Phương pháp sử dụng để tiêu hủy các điểm của nét vẽ" msgid "Dissolve selected points" -msgstr "Hòa tan các điểm được chọn" +msgstr "Tiêu hủy các điểm được chọn" msgid "Dissolve Between" -msgstr "Hòa Tan Giữa" +msgstr "Tiêu Hủy Phần Trung Gian" msgid "Dissolve points between selected points" -msgstr "Hòa tan điểm giữa các điểm được chọn" +msgstr "Tiêu hủy các điểm nằm giữa các điểm được chọn" msgid "Dissolve Unselect" -msgstr "Hòa Tan Chưa Được Chọn" +msgstr "Tiêu hủy cái Không được Chọn" msgid "Dissolve all unselected points" -msgstr "Hòa tan tất cả điểm chưa được chọn" +msgstr "Tiêu hủy toàn bộ các điểm không được chọn" msgctxt "Operator" msgid "Grease Pencil Draw" -msgstr "Vẽ Bút Sáp" +msgstr "Vẽ Nét Bút Chì Dầu" msgid "Draw a new stroke in the active Grease Pencil object" -msgstr "Vẽ một nét mới trong Vật Thể Bút Sáp hoạt động" +msgstr "Vẽ một nét mới trong Đối tượng Bút Chì Dầu đang hoạt động" msgid "No Fill Areas" -msgstr "Khu Vực Không Tô Đầy" +msgstr "Không Tô Kín Khu Vực" msgid "Disable fill to use stroke as fill boundary" -msgstr "Tắt tô đầy để sử dụng nét làm đầy ranh giới" +msgstr "Tắt khả năng tô kín để sử dụng các nét vẽ như đường ranh giới tô kín" msgid "No Stabilizer" -msgstr "Không Có Ổ Định Hóa" +msgstr "Không có Trình Ổn Định Hóa" msgid "No Straight lines" -msgstr "Không Có Nét Thẳng" +msgstr "Tắt Đường Thẳng" msgid "Disable key for straight lines" -msgstr "Tắt phím cho vẽ nét thẳng" +msgstr "Tắt khóa hóa đối với các đường thẳng" msgid "Speed guide angle" -msgstr "Góc đường dẫn tốc độ" +msgstr "Góc độ của hướng dẫn nhanh" msgid "Erase Grease Pencil strokes" -msgstr "Bôi nét Nút Sáp" +msgstr "Tẩy Nét Vẽ của Bút Chì Dầu" msgctxt "Operator" msgid "Duplicate Strokes" -msgstr "Sao Chép Nét" +msgstr "Nhân Đôi các Nét Vẽ" msgid "Duplicate the selected Grease Pencil strokes" -msgstr "Sao chép nét Bút Sáp được chọn" +msgstr "Nhân Đôi nét Bút Chì Dầu đã chọn" msgid "Make copies of the selected Grease Pencil strokes and move them" -msgstr "Chép lại các nét Bút Sáp được chọn và di chuyển nó" +msgstr "Tạo bản sao của các nét Bút Chì Dầu đã chọn và di chuyển chúng" msgid "Duplicate Strokes" -msgstr "Sao Chép Nét" +msgstr "Nhân Đôi các Nét Vẽ" msgctxt "Operator" msgid "Strokes Edit Mode Toggle" -msgstr "Bật/Tắt Chế Đồ Biên Tập Nét" +msgstr "Bật/Tắt Chế Độ Biên Soạn Nét Vẽ" msgid "Enter/Exit edit mode for Grease Pencil strokes" -msgstr "Vào/Thoát chế độ biên tập nét Bút Sáp" +msgstr "Bước Vào/Thoát Chế Độ Biên Soạn các nét Bút Chì Dầu" msgid "Return to Previous Mode" -msgstr "Trở lại Chế Độ Trước" +msgstr "Quay Trở Lại Chế Độ Trước" msgid "Return to previous mode" -msgstr "Trở lại chế độ trước" +msgstr "Quay trở lại chế độ trước" msgctxt "Operator" msgid "Extract Palette from Vertex Color" -msgstr "Rút Bảng Màu từ Màu Đỉnh" +msgstr "Tạo Bảng Pha Màu từ Màu Điểm Đỉnh" msgid "Extract all colors used in Grease Pencil Vertex and create a Palette" -msgstr "Rút ra tất cả màu được dùng trong Đỉnh Bút Sáp và tạo một Bảng Màu" +msgstr "Trích xuất toàn bộ các màu đã sử dụng trong Điểm Đỉnh Bút Chì Dầu và kiến tạo một Bảng Pha Màu" msgid "Convert only selected strokes" -msgstr "Biến đổi các nét cũ được chọn" +msgstr "Duy chuyển đổi các nét vẽ đã được chọn mà thôi" msgctxt "Operator" msgid "Extrude Stroke Points" -msgstr "Kéoo Ra Điểm Nét" +msgstr "Kéo/Đẩy Điểm của Nét Vẽ Ra" msgid "Extrude the selected Grease Pencil points" -msgstr "Kéo ra các điểm Bút Sáp được chọn" +msgstr "Kéo/Đẩy các Điểm của Bút Chì Dầu Ra" msgid "Extrude selected points and move them" -msgstr "Kéo ra điểm được chọn và di chuyển nó" +msgstr "Kéo/Đẩy các điểm được chọn và di chuyển chúng" msgid "Extrude Stroke Points" -msgstr "Kéo Ra Điểm Nét" +msgstr "Kéo/Đẩy Điểm của Nét Vẽ Ra" msgctxt "Operator" msgid "Grease Pencil Fill" -msgstr "Tô Đầy Bút Sáp" +msgstr "Tô Kín Nét Bút Chì Dầu" msgid "Fill with color the shape formed by strokes" -msgstr "Tô đầy với màu hình dạng được vẽ bằng nét" +msgstr "Tô Kín hình do các nét vẽ tạo thành bằng màu" msgid "Draw on Back" -msgstr "Vẽ Phía Sau" +msgstr "Vẽ ở Đằng Sau" msgid "Send new stroke to back" -msgstr "Gởi nét mới đến phía sau" +msgstr "Đưa nét vẽ về phía sau" + + +msgctxt "Operator" +msgid "Clean Duplicate Frames" +msgstr "Xóa Khung Hình Trùng Lặp" + + +msgid "Remove duplicate keyframes" +msgstr "Xóa các khung khóa trùng lặp" msgid "All Frames" -msgstr "Hết Bức Ảnh" +msgstr "Toàn Bộ các Khung Hình" msgid "Selected Frames" -msgstr "Bức Ảnh Được Chọn" +msgstr "Khung Hình được Chọn" msgctxt "Operator" msgid "Clean Fill Boundaries" -msgstr "Làm Sạch Ranh Giới Tô Đầy" +msgstr "Làm Sạch Ranh Giới Tô Kín" msgid "Remove 'no fill' boundary strokes" -msgstr "Xóa các nét ranh giới 'không tô đầy'" +msgstr "Xóa các nét vẽ ranh giới 'không tô kín'" msgid "Active Frame Only" -msgstr "Chỉ Bức Ảnh Hoạt Động" +msgstr "Duy Khung Hình đang Hoạt Động" msgid "Clean active frame only" -msgstr "Chỉ làm sạch bức ảnh hiện tại" +msgstr "Chỉ làm sạch khung hình đang hoạt động mà thôi" msgid "Clean all frames in all layers" -msgstr "Làm sạch tất cả bức ảnh trong tất cả lớp" +msgstr "Làm sạch toàn bộ các khung hình trong toàn bộ các tầng lớp" msgctxt "Operator" msgid "Clean Loose Points" -msgstr "Làm Sạch Điểm Mồ Côi" +msgstr "Làm Sạch các điểm Rời Rạc" msgid "Remove loose points" -msgstr "Xóa điểm mồ côi" +msgstr "Loại bỏ các điểm rời rạc" msgid "Limit" @@ -53230,37 +58054,37 @@ msgstr "Giới Hạn" msgid "Number of points to consider stroke as loose" -msgstr "Số lượng điểm để chấp nhận một nét là nét mồ côi" +msgstr "Số điểm để cân nhắc nét vẽ là rời rạc" msgctxt "Operator" msgid "Duplicate Frame" -msgstr "Sao Chép Bức Ảnh" +msgstr "Nhân Đôi Khung Hình" msgid "Make a copy of the active Grease Pencil Frame" -msgstr "Làm một bản sao của bức ảnh Bút Sáp hoạt động" +msgstr "Tạo bản sao khung hình Bút Chì Dầu đang hoạt động" msgid "Duplicate frame in active layer only" -msgstr "Chỉ sao chép bức ảnh hoạt động trong lớp hoạt động" +msgstr "Nhân đôi khung hình duy trong lớp đang hoạt động" msgid "Duplicate active frames in all layers" -msgstr "Sao chép bức ảnh hoạt động trong tất cả lớp" +msgstr "Nhân đôi khung hình đang hoạt động trong toàn bộ các lớp" msgctxt "Operator" msgid "Generate Automatic Weights" -msgstr "Chế Tạo Quyền Lượng Tự Động" +msgstr "Cân Trọng Tự Động" msgid "Generate automatic weights for armatures (requires armature modifier)" -msgstr "Chế tạo quyền lượng tự động cho các cốt (yêu cầu bộ điều chỉnh cốt)" +msgstr "Cân trọng tự động cho các khung cốt (đòi hỏi bộ điều chỉnh khung cốt)" msgid "Armature to use" -msgstr "Sử dụng cốt nào" +msgstr "Khung Cốt để Sử Dụng" msgid "Decay" @@ -53268,179 +58092,187 @@ msgstr "Suy Thoái" msgid "Factor to reduce influence depending of distance to bone axis" -msgstr "Hệ số để giảm sự ảnh hưởng tùy khoảng cách từ trục xương" +msgstr "Hệ số để thuyên giảm ảnh hưởng tùy thuộc vào khoảng cách đến trục của xương" msgid "Empty Groups" -msgstr "Nhóm Rỗng" +msgstr "Nhóm Trống Rỗng" msgid "Automatic Weights" -msgstr "Quyầng Lượng Tự Động" +msgstr "Cân Trọng Tự Động" msgid "Ratio between bone length and influence radius" -msgstr "Tỉ số giữa bề dài xương và bán kính ảnh hưởng" +msgstr "Tỷ số giữa chiều dài của xương và bán kính ảnh hưởng" msgctxt "Operator" msgid "Rotate Guide Angle" -msgstr "Xoay Góc Hướng Dẫn" +msgstr "Góc Độ Xoay Chiều Hướng Dẫn" msgid "Rotate guide angle" -msgstr "Xoay góc hướng dẫn" +msgstr "Góc độ xoay chiều hướng dẫn" msgid "Guide angle" -msgstr "Góc hướng dẫn" +msgstr "Góc độ của hướng dẫn" msgid "Increment angle" -msgstr "Tăng Lên Góc" +msgstr "Mức Tăng của Góc Độ" msgctxt "Operator" msgid "Hide Layer(s)" -msgstr "Ẩn (Các) Lớp" +msgstr "Ẩn Giấu Tầng Lớp" msgid "Hide selected/unselected Grease Pencil layers" -msgstr "Ẩn các lớp Bút Sáp chưa/được chọn" +msgstr "Ẩn giấu các tầng lớp Bút Chì Dầu chưa/được chọn" msgid "Hide unselected rather than selected layers" -msgstr "Ẩn các lớp chưa chọn thay thế các lớp được chọn" +msgstr "Ẩn giấu các tầng chưa được chọn, thay vì các tầng đã được chọn" msgctxt "Operator" msgid "Generate Grease Pencil Object using image as source" -msgstr "Chế tạo Vật Thể Bút Sáp bằng dùng ảnh làm nguồn" +msgstr "Sinh Tạo Đối Tượng Bút Chì Dầu từ hình ảnh nguồn" msgid "Generate a Grease Pencil Object using Image as source" -msgstr "Chế tạo một Vật Thể Bút Sáp bằng dùng Ảnh làm nguồn" +msgstr "Sinh Tạo Đối Tượng Bút Chì Dầu dùng hình ảnh cung cấp làm nguồn" msgid "Generate Mask" -msgstr "Chế Tạo Mặt Nạ" +msgstr "Sinh Tạo Màn Chắn Lọc" msgid "Create an inverted image for masking using alpha channel" -msgstr "Chế tạo một ảnh đảo nghịch cho làm mặt nạ bằng kenh độ đục" +msgstr "Kiến tạo một hình ảnh đảo ngược để chắn lọc dùng kênh alpha" msgid "Point Size" -msgstr "Kích Thước Điểm" +msgstr "Kích Thước của Điểm" msgid "Size used for grease pencil points" -msgstr "Kích thước được dùng cho điểm bút sáp" +msgstr "Kích thước sử dụng cho các điểm của bút chì dầu" msgctxt "Operator" msgid "Grease Pencil Interpolation" -msgstr "Suy Nội Bút Sáp" +msgstr "Nội Suy Bút Chì Dầu" msgid "Interpolate grease pencil strokes between frames" -msgstr "Suy nội nét bút sáp giữa bức ảnh" +msgstr "Nội suy nét Bút Chì Dầu giữa các khung hình" + + +msgid "Exclude Breakdowns" +msgstr "Loại Trừ các Khung Phân Tích" + + +msgid "Exclude existing Breakdowns keyframes as interpolation extremes" +msgstr "Loại trừ các khung khóa Phân Tích hiện tại dưới dạng các nội suy cường điệu" msgid "Flip Mode" -msgstr "Chế Đồ Lật" +msgstr "Chế Độ Đảo Lật" msgid "Invert destination stroke to match start and end with source stroke" -msgstr "Đảo nghịch nét đích cho giống bắt đầu và kết thúc tại nét nguồn" +msgstr "Đảo nghịch nét đích, hầu cho nó khớp với đầu và cuối của nét nguồn" msgid "No Flip" -msgstr "Không Lật" +msgstr "Không Đảo Lật" msgid "Interpolate only selected strokes" -msgstr "Chỉ suy nội giữa nét được chọn" +msgstr "Duy nội suy các nét đã chọn mà thôi" msgid "Layers included in the interpolation" -msgstr "Gồm lớp vào suy nội" +msgstr "Các tầng lớp bao gồm trong quá trình nội suy" msgid "Confirm on Release" -msgstr "Xác Nhận Khi Thả" +msgstr "Xác Nhận khi Thả Ra" msgid "Bias factor for which frame has more influence on the interpolated strokes" -msgstr "Hế số thành kiến cho bức ảnh nào sự ảnh hưởng nhiều hơn cho nét suy nội" +msgstr "Hệ số thiên lệch để khung hình có tác động lớn hơn đối với các nét vẽ nội suy" msgid "Amount of smoothing to apply to interpolated strokes, to reduce jitter/noise" -msgstr "Mức độ mịn hóa để áp dụng cho nét được suy nội, cho giảm bớt hốt hoảng/huyên náo" +msgstr "Lượng làm mịn áp dụng cho các nét nội suy, hòng để giảm mức biến động/nhiễu" msgctxt "Operator" msgid "Delete Breakdowns" -msgstr "Xóa Bức Ảnh Giữa" +msgstr "Xóa các Khung Phân Tích" msgid "Remove breakdown frames generated by interpolating between two Grease Pencil frames" -msgstr "Xóa bức ảnh giữa được chế tạo bằng suy nội hai bức ảnh Bút Sáp" +msgstr "Loại bỏ những khung hình phân tích, tức những cái được sinh tạo ra bởi sự nội suy các khung hình Bút Chì Dầu trung gian, giữa hai khung hình" msgctxt "Operator" msgid "Interpolate Sequence" -msgstr "Suy Nội Trình Tự" +msgstr "Nội Suy Trình Tự" msgid "Generate 'in-betweens' to smoothly interpolate between Grease Pencil frames" -msgstr "Chế tạo 'bức ảnh giữa' cho mịn hóa suy nội giữa bức ảnh Bút Sáp" +msgstr "Sinh tạo các 'khung hình trung gian' để làm cho sự chuyển hóa giữa các khung hình nội suy Bút Chì Dầu mịn màng (uyển chuyển) hơn" msgctxt "GPencil" msgid "Easing" -msgstr "Xoa Dịu" +msgstr "Chậm Rãi" msgid "Which ends of the segment between the preceding and following grease pencil frames easing interpolation is applied to" -msgstr "Áp dụng suy nội xoa dịu cho bên nào của đoạn giữa bức ảnh mẫu này và bức ảnh mẫu tiếp" +msgstr "Đầu nào của phân đoạn giữa khung hình Bút Chì Dầu trước và sau sẽ được nội suy chậm rãi" msgctxt "GPencil" msgid "Automatic Easing" -msgstr "Tự Động Xoa Dịu" +msgstr "Chậm Rãi Tự Động" msgid "Easing type is chosen automatically based on what the type of interpolation used (e.g. 'Ease In' for transitional types, and 'Ease Out' for dynamic effects)" -msgstr "Loại xoa dịu được tư ̣động chọn tùy loại suy nội đang dùng (ví dụ 'Xoa Dịu Vào' cho loại chuyển tiếp và 'Xoa Dịu Ra' cho hiệu ứng động lý)" +msgstr "Tự ̣động chọn kiểu chậm rãi dựa trên kiểu nội suy đang sử dụng (ví dụ: Chậm Rãi Vào đối với các kiểu chuyển tiếp và Chậm Rãi Ra cho các hiệu ứng năng động)" msgctxt "GPencil" msgid "Ease In" -msgstr "Xoa Dịu Vào" +msgstr "Chậm Rãi Vào" msgctxt "GPencil" msgid "Ease Out" -msgstr "Dịu Ra" +msgstr "Chậm Rãi Ra" msgctxt "GPencil" msgid "Ease In and Out" -msgstr "Xoa Dịu Vào và Ra" +msgstr "Chậm Rãi Vào và Ra" msgid "Number of frames between generated interpolated frames" -msgstr "Số lượng bức ảnh giữa bức ảnh nội suy được chế tạo" +msgstr "Số khung hình giữa các khung hình được sinh tạo" msgctxt "GPencil" msgid "Type" -msgstr "Loại" +msgstr "Thể Loại" msgid "Interpolation method to use the next time 'Interpolate Sequence' is run" -msgstr "Phương pháp nội suy để dùng lần sau được chạy 'Nội Suy Trình Tự'" +msgstr "Phương pháp nội suy sử dụng trong lần chạy 'Nội Suy Trình Tự' tiếp tới" msgctxt "GPencil" @@ -53450,11 +58282,11 @@ msgstr "Tuyến Tính" msgctxt "GPencil" msgid "Custom" -msgstr "Tùy Chọn" +msgstr "Tùy Chỉnh" msgid "Custom interpolation defined using a curve map" -msgstr "Suy nội tùy chọn được chỉ định bởi một ánh xạ đường cong" +msgstr "Nội suy tùy chỉnh được định nghĩa bởi một ánh xạ đường cong" msgctxt "GPencil" @@ -53464,12 +58296,12 @@ msgstr "Sin" msgctxt "GPencil" msgid "Quadratic" -msgstr "Bậc Hai" +msgstr "Bình Phương" msgctxt "GPencil" msgid "Cubic" -msgstr "Bậc Ba" +msgstr "Lập Phương/Bậc Ba" msgctxt "GPencil" @@ -53489,530 +58321,547 @@ msgstr "Lũy Thừa" msgctxt "GPencil" msgid "Circular" -msgstr "Vòng Tròn" +msgstr "Tuần Hoàn" msgctxt "GPencil" msgid "Back" -msgstr "Lùi" +msgstr "Quay Trở Lại" msgctxt "GPencil" msgid "Bounce" -msgstr "Nhồi" +msgstr "Bật Nẩy" msgctxt "GPencil" msgid "Elastic" -msgstr "Dẻo Giãn" +msgstr "Đàn Hồi" msgctxt "Operator" msgid "Active Layer" -msgstr "Lớp Hoạt Động" +msgstr "Tầng Lớp đang Hoạt Động" msgctxt "Operator" msgid "Add New Layer" -msgstr "Thêm Lớp Mới" +msgstr "Thêm Tầng Lớp Mới" msgid "Add new layer or note for the active data-block" -msgstr "Thêm một lớp hay tin nhắn mới cho cục dữ liệu hoạt động" +msgstr "Thêm tầng lớp hoặc ghi chú mới cho khối dữ liệu đang hoạt động" msgid "Name of the newly added layer" -msgstr "Tên của lớp mới thêm" +msgstr "Tên của tập hợp mới thêm vào" msgctxt "Operator" msgid "Add New Annotation Layer" -msgstr "Thêm Lớp Ghi Chú Mới" +msgstr "Thêm Tầng Chú Thích Mới" msgid "Add new Annotation layer or note for the active data-block" -msgstr "Thêm một lớp Ghi Chú hay tin nhắn mới cho cục dữ liệu hoạt động" +msgstr "Thêm tầng chú thích mới hoặc ghi chú cho khối dữ liệu đang hoạt động" msgctxt "Operator" msgid "Move Annotation Layer" -msgstr "Di Chuyển Lớp Ghi Chú" +msgstr "Di Chuyển Tầng Chú Thích" msgid "Move the active Annotation layer up/down in the list" -msgstr "Di chuyển lớp Ghi Chú hoạt động lên/xuống trong danh sách" +msgstr "Di chuyển tầng Chú Thích (Annotation) đang hoạt động lên/xuống trong danh sách" msgctxt "Operator" msgid "Remove Annotation Layer" -msgstr "Xóa Lớp Ghi Chú" +msgstr "Xóa Tầng Chú Thích" msgid "Remove active Annotation layer" -msgstr "Xóa lớp Ghi Chú hoạt động" +msgstr "Xóa Tầng Chú Thích (Annotation) đang hoạt động" msgctxt "Operator" msgid "Change Layer" -msgstr "Đổi Lớp" +msgstr "Đổi Tầng Lớp" msgid "Change active Grease Pencil layer" -msgstr "Đổi lớp Bút Sáp hoạt động" +msgstr "Đổi tầng Bút Chì Dầu đang hoạt động" msgctxt "Operator" msgid "Duplicate Layer" -msgstr "Bản Sao Lớp" +msgstr "Nhân Đôi Tầng Lớp" msgid "Make a copy of the active Grease Pencil layer" -msgstr "Làm một bản sao của lớp Bút Sáp hoạt động" +msgstr "Tạo bản sao của tầng Bút Chì Dầu đang hoạt động" msgid "All Data" -msgstr "Hết Dữ Liệu" +msgstr "Toàn Bộ các Dữ Liệu" msgid "Empty Keyframes" -msgstr "Bức Ảnh Mẫu Rỗng" +msgstr "Khung Khóa Trống" msgctxt "Operator" msgid "Duplicate Layer to New Object" -msgstr "Sao chép Lớp thành Vật Thể Mới" +msgstr "Nhân Đôi Tầng Lớp sang Đối Tượng mới" msgid "Make a copy of the active Grease Pencil layer to selected object" -msgstr "Làm một bản sao của lớp Bút Sáp hoạt động thành vật thể được chọn" +msgstr "Tạo bản sao của tầng Bút Chì Dầu đang hoạt động sang đối tượng được chọn" + + +msgctxt "GPencil" +msgid "Only Active" +msgstr "Duy cái đang Hoạt Động" msgid "Copy only active Layer, uncheck to append all layers" -msgstr "Chỉ chép Lớp hoạt động, gỡ chọn để kèm hết lớp" +msgstr "Chỉ sao chép Tầng Lớp đang hoạt động, bỏ dấu kiểm để chèn toàn bộ các tầng lớp vào" msgctxt "Operator" msgid "Isolate Layer" -msgstr "Cô Lập Lớp" +msgstr "Cô Lập Tầng Lớp" msgid "Toggle whether the active layer is the only one that can be edited and/or visible" -msgstr "Bật/tắt chỉ có thể biên tập và/hay hiển thị lớp hoạt động" +msgstr "Bật/Tắt trạng thái tầng lớp đang hoạt động có phải là cái duy nhất có thể chỉnh sửa và/hoặc nhìn thấy được hay không" msgid "Affect Visibility" -msgstr "Ảnh Hưởng Sự Hiển Thị" +msgstr "Tác Động Tầm Nhìn" msgid "In addition to toggling the editability, also affect the visibility" -msgstr "Còn có thể bật/tắt biên tập, cũng có thể ảnh hưởng hiển thị" +msgstr "Vừa lật đảo khả năng biên soạn, vừa tác động đến tầm nhìn (ẩn/hiện) nữa" msgctxt "Operator" msgid "Add New Mask Layer" -msgstr "Thêm Lớp Mặt Nạ Mới" +msgstr "Thêm Tầng Lớp Màn Chắn Lọc Mới" msgid "Add new layer as masking" -msgstr "Thêm lớp mới cho làm mặt nạ" +msgstr "Thêm tầng lớp mới làm màn chắn" msgid "Name of the layer" -msgstr "Tên của tập tin" +msgstr "Tên của tầng lớp" msgctxt "Operator" msgid "Move Grease Pencil Layer Mask" -msgstr "Di Chuyển Mặt Nạ Lớp Bút Sáp" +msgstr "Di Chuyển Tầng Màn Chắn Lọc Bút Chì Dầu" msgid "Move the active Grease Pencil mask layer up/down in the list" -msgstr "Di chuyển mặt nạ lớp Bút Sáp hoạt động lên/xuống trong danh sách" +msgstr "Di chuyển tầng màn chắn lọc Bút Chì Dầu đang hoạt động lên/xuống trong danh sách" msgctxt "Operator" msgid "Remove Mask Layer" -msgstr "Xóa Lớp Mặt Nạ" +msgstr "Loại Bỏ Tầng Màn Chắn Lọc" msgid "Remove Layer Mask" -msgstr "Xóa Lớp Mặt Nạ" +msgstr "Xóa Màn Chắn Lọc Tầng Lớp" msgctxt "Operator" msgid "Merge Down" -msgstr "Gồm Xương" +msgstr "Hợp Nhất Xuống Dưới" msgid "Combine Layers" -msgstr "Gồm Lớp" +msgstr "Kết Hợp các Tầng Lớp" msgid "Combine active layer into the layer below" -msgstr "Gồm lớp hoạt động vào lớp dưới" +msgstr "Kết hợp tầng lớp đang hoạt động vào tầng lớp bên dưới" msgid "Combine all layers into the active layer" -msgstr "Gồm hết lớp vào lớp hoạt động" +msgstr "Kết hợp toàn bộ các tầng lớp vào tầng lớp đang hoạt động" msgctxt "Operator" msgid "Move Grease Pencil Layer" -msgstr "Di Chuyển Lớp Bút Sáp" +msgstr "Di Chuyển Tầng Bút Chì Dầu" msgid "Move the active Grease Pencil layer up/down in the list" -msgstr "Di chuyển lớp hoạt động lên/xuống trong danh sách" +msgstr "Di chuyển tầng Bút Chì Dầu đang hoạt động lên/xuống trong danh sách" msgctxt "Operator" msgid "Remove Layer" -msgstr "Xóa Lớp" +msgstr "Xóa Tầng Lớp" msgid "Remove active Grease Pencil layer" -msgstr "Xóa lớp Bút Sáp hoạt động" +msgstr "Xóa tầng Bút Chì Dầu đang hoạt động" msgctxt "Operator" msgid "Lock All Layers" -msgstr "Khóa Hết Lớp" +msgstr "Khóa Toàn Bộ các Tầng Lớp" msgid "Lock all Grease Pencil layers to prevent them from being accidentally modified" -msgstr "Khóa hết lớp Bút Sáp cho không thể chỉnh sửa vô ý" +msgstr "Khóa toàn bộ các tầng lớp Bút Chì Dầu để ngăn ngừa chúng khỏi bị chỉnh sửa một cách bất ngờ" msgctxt "Operator" msgid "Disable Unused Layer Colors" -msgstr "Tắt Màu Lớp Không Dùng" +msgstr "Tắt Màu Tầng Lớp Không Sử Dụng" msgid "Lock and hide any color not used in any layer" -msgstr "Khóa và ẳn màu nào không dùng trong bất cứ lớp nào" +msgstr "Khóa và ẩn giấu bất cứ màu nào không sử dụng đến trong bất cứ tầng lớp nào" msgctxt "Operator" msgid "Hide Material(s)" -msgstr "Ẳn (Các) Vật Liệu" +msgstr "Ẩn Giấu Nguyên Vật Liệu" msgid "Hide selected/unselected Grease Pencil materials" -msgstr "Ẩn các vật liệu Bút Sáp được/chưa chọn" +msgstr "Ẩn giấu nguyên vật liệu đã chọn hoặc chưa chọn của Bút Chì Dầu" msgid "Hide unselected rather than selected colors" -msgstr "Ẩn các màu chưa chọn thay thế các màu được chọn" +msgstr "Ẩn giấu các màu chưa chọn, thay vì các màu đã chọn" msgctxt "Operator" msgid "Isolate Material" -msgstr "Cô Lập Vật Liệu" +msgstr "Biệt Lập Nguyên Vật Liệu Riêng Ra" msgid "Toggle whether the active material is the only one that is editable and/or visible" -msgstr "Bật/tắt có thể biên tập và/hay hiển chỉ vật liệu hoạt động" +msgstr "Bật/tắt trạng thái của nguyên vật liệu đang hoạt động, hầu cho nó duy là cái có thể biên soạn, và/hoặc duy là cái có thể nhìn thấy được" msgctxt "Operator" msgid "Lock All Materials" -msgstr "Khóa Hết Vật Liệu" +msgstr "Khóa Toàn Bộ các Nguyên Vật Liệu" msgid "Lock all Grease Pencil materials to prevent them from being accidentally modified" -msgstr "Khóa hết vật liệu Bút Sáp cho không thể chỉnh sửa vô ý" +msgstr "Khoá toàn bộ các nguyên vật liệu Bút Chì Dầu để ngăn ngừa chúng khỏi bị sửa đổi một cách bất ngờ" msgctxt "Operator" msgid "Lock Unused Materials" -msgstr "Khóa Các Vật Liệu Không Dùng" +msgstr "Khoá các Nguyên Vật Liệu Chưa Sử Dụng" msgid "Lock any material not used in any selected stroke" -msgstr "Khóa bất cứ vật liệu nào không dùng trong nét nào được chọn" +msgstr "Khóa bất cứ nguyên vật liệu nào không sử dụng đến trong toàn bộ các nét vẽ nào đã chọn" msgctxt "Operator" msgid "Show All Materials" -msgstr "Hiện Hết Vật Liệu" +msgstr "Hiển Thị Toàn Bộ các Nguyên Vật Liệu" msgid "Unhide all hidden Grease Pencil materials" -msgstr "Hiện tất cả vật liệu Bút Sáp được ẩn" +msgstr "Hiển thị toàn bộ các nguyên vật liệu Bút Chì Dầu ẩn giấu" msgctxt "Operator" msgid "Select Material" -msgstr "Chọn Vật Liệu" +msgstr "Chọn Nguyên Vật Liệu" msgid "Select/Deselect all Grease Pencil strokes using current material" -msgstr "Chọn/Thả hết nét Bút Sáp đang đùng vật liệu hiện tại" +msgstr "Chọn/Hủy chọn toàn bộ các nét vẽ Bút Chì Dầu đang sử dụng nguyên vật liệu hiện tại" msgid "Unselect strokes" -msgstr "Thả nét" +msgstr "Bỏ chọn các nét vẽ" msgctxt "Operator" msgid "Set Material" -msgstr "Đặt Vật Liệu" +msgstr "Đặt Nguyên Vật Liệu" msgid "Set active material" -msgstr "Đặt vật liệu hoạt động" +msgstr "Đặt nguyên vật liệu đang hoạt động" msgctxt "Operator" msgid "Convert Stroke Materials to Vertex Color" -msgstr "Biến Đổi Vật Liệu Nét thành Màu Đỉnh" +msgstr "Chuyển Đổi Các Nguyên Vật Liệu của Nét Vẽ sang Màu Điểm Đỉnh" msgid "Replace materials in strokes with Vertex Color" -msgstr "Thay thế vật liệu trong các nét bằng Màu Đỉnh" +msgstr "Thay thế nguyên vật liệu trong các nét vẽ với Màu Điểm Đỉnh" msgid "Create Palette" -msgstr "Chế Tạo Bảng Màu" +msgstr "Kiến Tạo Bảng Pha Màu" msgid "Create a new palette with colors" -msgstr "Chế tạo một bảng màu" +msgstr "Kiến Tạo bảng pha màu mới với các màu sắc" msgid "Remove Unused Materials" -msgstr "Xóa Các Vật Liệu Không Dùng" +msgstr "Xóa các Nguyên Vật Liệu Không Sử Dụng Đến" msgid "Remove any unused material after the conversion" -msgstr "Xóa bất cứ vật liệu không dùng sau biến đổi" +msgstr "Xóa bất cứ nguyên vật liệu nào không sử dụng đến sau khi chuyển đổi" msgctxt "Operator" msgid "Unlock All Materials" -msgstr "Mở Khóa Hết Vật Liệu" +msgstr "Tháo Khóa Toàn Bộ các Nguyên Vật Liệu" msgid "Unlock all Grease Pencil materials so that they can be edited" -msgstr "Mở khóa hết vật liệu Bút Sáp cho có thể biên tập chúng nó" +msgstr "Tháo khóa toàn bộ các nguyên vật liệu của Bút Chì Dầu, hầu cho chúng có thể biên soạn được" msgctxt "Operator" msgid "Copy Materials to Selected Object" -msgstr "Chép Vật Liệu đến Vật Thể Được Chọn" +msgstr "Sao Chép Nguyên Vật Liệu sang Đối Tượng được Chọn" msgid "Append Materials of the active Grease Pencil to other object" -msgstr "Kèm Vật Liệu của Bút Sáp hoạt động đến vật thể khác" +msgstr "Lấy Nguyên Vật Liệu của tầng Bút Chì Dầu đang hoạt động bổ sung sang cho đối tượng khác" msgid "Append only active material, uncheck to append all materials" -msgstr "Chỉ kèm vật liệu của Bút Sáp hoạt động, gỡ chọn để kèm hết vật liệu" +msgstr "Duy sử dụng các nguyên vật liệu đang hoạt động để bổ sung sang mà thôi. Bỏ dấu kiểm đi để bổ sung toàn bộ các nguyên vật liệu" msgctxt "Operator" msgid "Move Strokes to Layer" -msgstr "Di Chuyển Nét Đến Lớp" +msgstr "Di Chuyển Nét Vẽ vào Tầng Lớp" msgid "Move selected strokes to another layer" -msgstr "Di chuyển nét được chọn đến lớp khác" +msgstr "Di chuyển nét vẽ được chọn vào một tầng lớp khác" msgctxt "Operator" msgid "Strokes Paint Mode Toggle" -msgstr "Bật/Tắt Chế Đồ Sơn Nét" +msgstr "Bật/Tắt Chế Độ Sơn Nét Vẽ" msgid "Enter/Exit paint mode for Grease Pencil strokes" -msgstr "Vào/Thoát chế độ sơn cho nét Bút Sáp" +msgstr "Bước vào/Thoát khỏi chế độ sơn nét vẽ cho các nét Bút Chì Dầu" msgctxt "Operator" msgid "Paste Strokes" -msgstr "Dán Nét" +msgstr "Dán Nét Vẽ" msgid "Paste previously copied strokes to active layer or to original layer" -msgstr "Dán nét được chép lại vào lớp hoạt động hay lớp ban đầu" +msgstr "Dán những nét vẽ đã sao chép trước đây sang tầng đang hoạt động hoặc sang tầng Gốc/Nguyên Bản/gốc cũ" msgid "Paste on Back" -msgstr "Dán Phía Sau" +msgstr "Dán vào Đằng Sau" msgid "Add pasted strokes behind all strokes" -msgstr "Dán các nét được chép phía sau tất cả nét" +msgstr "Bố trí các nét vẽ được dán vào để chúng nằm đằng sau toàn bộ các nét vẽ hiện tại" msgid "Paste to Active" -msgstr "Dán đến Hoạt Động" +msgstr "Dán sang cái đang Hoạt Động" msgid "Paste by Layer" -msgstr "Dán tùy Lớp" +msgstr "Dán theo Tầng Lớp" msgctxt "Operator" msgid "Grease Pencil Box Shape" -msgstr "Hình Dạng Hộp Bút Sáp" +msgstr "Bút Chì Dầu Hình Hộp" msgid "Create predefined grease pencil stroke box shapes" -msgstr "Chế tạo hình dạng hộp nét bút sáp đã đặt sẵn" +msgstr "Kiến Tạo một nét vẽ Bút Chì Dầu hình hộp đã sắp đặt trước rồi" + + +msgid "Number of points per segment" +msgstr "Số điểm trên mỗi phân đoạn" + + +msgid "Number of subdivisions per segment" +msgstr "Lượng phân hóa trên mỗi phân đoạn" msgid "Type of shape" -msgstr "Loại hình dạng" +msgstr "Thể Loại Hình" msgid "Polyline" -msgstr "Đường Đa Điểm" +msgstr "Đường Đa Giác" msgctxt "Operator" msgid "Grease Pencil Circle Shape" -msgstr "Hình Dạng Vòng Tròn Bút Sáp" +msgstr "Bút Chì Dầu Hình Dạng Tròn" msgid "Create predefined grease pencil stroke circle shapes" -msgstr "Chế tạo hình dạng vòng tròn nét bút sáp đã đặt sẵn" +msgstr "Kiến Tạo nét vẽ bút chì dầu hình dạng tròn, dùng công thức định trước" msgctxt "Operator" msgid "Grease Pencil Curve Shape" -msgstr "Hình Dạng Đường Cong Bút Sáp" +msgstr "Bút Chì Dầu Hình Dạng Cong" msgid "Create predefined grease pencil stroke curve shapes" -msgstr "Chế tạo hình dạng đường cong nét bút sáp đã đặt sẵn" +msgstr "Kiến Tạo một nét vẽ Bút Chì Dầu hình dạng cong, dùng công thức định trước" msgctxt "Operator" msgid "Grease Pencil Line Shape" -msgstr "Hình Dạng Đường Thằng Bút Sáp" +msgstr "Bút Chì Dầu Hình Dạng Đường Thẳng" msgid "Create predefined grease pencil stroke lines" -msgstr "Chế tạo hình dạng đường thẳng nét bút sáp đã đặt sẵn" +msgstr "Kiến Tạo một nét vẽ Bút Chì Dầu hình dạng đường thẳng, dùng công thức định trước" msgctxt "Operator" msgid "Grease Pencil Polyline Shape" -msgstr "Hình Dạng Đường Đá Điểm Bút Sáp" +msgstr "Bút Chì Dầu Hình Dạng Đa Giác với Cạnh Thẳng" msgid "Create predefined grease pencil stroke polylines" -msgstr "Chế tạo hình dạng đường đa điểm nét bút sáp đã đặt sẵn" +msgstr "Kiến Tạo một nét vẽ Bút Chì Dầu hình dạng đa giác với cạnh thẳng, dùng công thức định trước" msgctxt "Operator" msgid "Recalculate internal geometry" -msgstr "Tính lại hình dạng nội bộ" +msgstr "Tính Toán lại Hình Học Nội Bộ" msgid "Update all internal geometry data" -msgstr "Nâng cấp tất cả dữ liệu hình dạng nội bộ" +msgstr "Cập nhật toàn bộ dữ liệu hình học nội bộ" msgctxt "Operator" msgid "Reproject Strokes" -msgstr "Chiếu Lại Nét" +msgstr "Tái Phóng Chiếu các Nét Vẽ" msgid "Reproject the selected strokes from the current viewpoint as if they had been newly drawn (e.g. to fix problems from accidental 3D cursor movement or accidental viewport changes, or for matching deforming geometry)" -msgstr "Chiếu lại nét được chọn từ điểm nhìn hiện tại như mới được vẽ ra (ví dụ cho sửa vấn đề khi di chuyển sờ ý con trỏ 3D hay đổi sờ ý màn chiếu, hay cho vẽ theo hình dạng bị méo hóa)" +msgstr "Tái phóng chiếu các nét được chọn từ điểm nhìn hiện tại, tựa như chúng mới được vẽ (ví dụ: để chỉnh sửa sự di chuyển bất ngờ của con trỏ 3D, hoặc những thay đổi bất ngờ của cổng nhìn, hay để khớp với hình học bị biến dạng)" + + +msgid "Keep original strokes and create a copy before reprojecting" +msgstr "Duy trì các nét ban đầu và kiến tạo một bản sao trước khi tái phóng chiếu" msgid "Reproject the strokes on to the scene geometry, as if drawn using 'Surface' placement" -msgstr "Chiếu lại các nét trên hình dạng cảnh, như được vẽ bằng 'Bề Mặt'" +msgstr "Tái phóng chiếu các nét vẽ lên hình học của cảnh, tựa như trong khi đang vẽ dùng phương pháp đặt nét vẽ lên 'Bề Mặt' vậy" msgctxt "Operator" msgid "Reset Fill Transformations" -msgstr "Đặt Lại Biến Hóa Tô Đầy" +msgstr "Hoàn Lại các Biến Hóa của Vùng Tô Kín" msgid "Reset any UV transformation and back to default values" -msgstr "Đặt lại hết biến hóa UV trở lại đến giá trị mặc định" +msgstr "Hoàn lại các biến hóa UV và quay trở lại các giá trị mặc định" msgctxt "Operator" msgid "Show All Layers" -msgstr "Hiện Hết Lớp" +msgstr "Hiển Thị Toàn Bộ các Tầng Lớp" msgid "Show all Grease Pencil layers" -msgstr "Hiện hết lớp Bút Sáp" +msgstr "Hiển thị toàn bộ các tầng lớp Bút Chì Dầu" msgctxt "Operator" msgid "Stroke Sculpt" -msgstr "Khắc Nét" +msgstr "Điêu Khắc Nét Vẽ" msgid "Apply tweaks to strokes by painting over the strokes" -msgstr "Áp dụng chỉnh sửa nét bằng trên sơn trên các nét" +msgstr "Áp dụng những hiệu chỉnh trên các nét vẽ bằng cách sơn đè lên chúng" msgid "Enter a mini 'sculpt-mode' if enabled, otherwise, exit after drawing a single stroke" -msgstr "Vào một 'chế độ khắc mini' nếu bật, nếu không bật, thoát sau vẽ một nét" +msgstr "Bước vào một 'chế độ điêu khắc' nhỏ, nếu đã bật, nếu không thì thoát ra sau khi vẽ một nét" msgctxt "Operator" msgid "Strokes Sculpt Mode Toggle" -msgstr "Bật/Tắt Chế Đồ Khắc Nét" +msgstr "Bật/Tắt Chế Độ Điêu Khắc Nét" msgid "Enter/Exit sculpt mode for Grease Pencil strokes" -msgstr "Vào/Thoát chế độ khắc cho nét Bút Sáp" +msgstr "Bước Vào/Thoát Khỏi chế độ điêu khắc nét Bút Chì Dầu" msgctxt "Operator" msgid "Add Segment" -msgstr "Thêm Khúc" +msgstr "Thêm Phân Đoạn" msgid "Add a segment to the dash modifier" -msgstr "Thêm một khúc cho bộ điều chỉnh gạch ngang" +msgstr "Thêm một phân đoạn vào bộ điều chỉnh dấu gạch ngang" msgid "Name of the modifier to edit" -msgstr "Tên của bộ điều chỉnh để biên tập" +msgstr "Tên của bộ điều chỉnh để biên soạn" msgctxt "Operator" msgid "Move Dash Segment" -msgstr "Di Chuyển Khúc Gạch Ngang" +msgstr "Di Chuyển Phân Đoạn Dấu Gạch Ngang" msgid "Move the active dash segment up or down" -msgstr "Di chuyển khúc gạch ngang hoạt động lên hay xuống" +msgstr "Di chuyển đoạn dấu gạch ngang đang hoạt động lên hoặc xuống" msgctxt "Operator" msgid "Remove Dash Segment" -msgstr "Xóa Khúc Gạch Ngang" +msgstr "Xóa Phân Đoạn Dấu Gạch Ngang" msgid "Remove the active segment from the dash modifier" -msgstr "Xóa khúc hoạt động từ bộ điều chỉnh gạch ngang" +msgstr "Loại bỏ phân đoạn đang hoạt động khỏi bộ điều chỉnh dấu gạch ngang" msgid "Index of the segment to remove" -msgstr "Chỉ số của khúc để xóa" +msgstr "Chỉ Số của phân khúc cần loại bỏ" msgid "Select Grease Pencil strokes and/or stroke points" -msgstr "Chọn nét và/hay điểm nét Bút Sáp" +msgstr "Chọn các nét và/hoặc các điểm của nét Bút Chì Dầu" msgid "Entire Strokes" -msgstr "Nét Toàn Bộ" +msgstr "Toàn Bộ các Nét" msgid "Select entire strokes instead of just the nearest stroke vertex" -msgstr "Chọn toàn bộ nét thay thế chỉ chọn đỉnh nét gần nhất" +msgstr "Chọn toàn bộ các nét vẽ, thay vì chỉ chọn điểm đỉnh của nét gần nhất" msgid "Mouse location" @@ -54021,11 +58870,11 @@ msgstr "Vị trí chuột" msgctxt "Operator" msgid "(De)select All Strokes" -msgstr "Chọn/Thả Hết Nét" +msgstr "Chọn/Hủy Chọn Toàn Bộ các Nét" msgid "Change selection of all Grease Pencil strokes currently visible" -msgstr "Đổi sự lựa chọn của hết nét Bút Sáp hiện tại được hiện" +msgstr "Đổi sự lựa chọn của toàn bộ các nét Bút Chì Dầu hiện tại nhìn thấy được" msgctxt "Operator" @@ -54034,31 +58883,31 @@ msgstr "Xen Kẽ" msgid "Select alternative points in same strokes as already selected points" -msgstr "Chọn điểm lẻ trong các nét có điểm được chọn rồi" +msgstr "So le (nhảy cách) chọn các điểm trên cùng một nét vẽ" msgid "Unselect Ends" -msgstr "Thả Kết Thúc" +msgstr "Không Chọn các Đầu" msgid "Do not select the first and last point of the stroke" -msgstr "Không chọn điểm đầu và cuối của nét" +msgstr "Không chọn điểm đầu và cuối của nét vẽ" msgid "Select Grease Pencil strokes within a rectangular region" -msgstr "Chọn nét Bút sáp trong một vùng chữ nhật" +msgstr "Chọn các nét Bút Chì Dầu trong vùng hình chữ nhật" msgid "Invert existing selection" -msgstr "Đảo nghịch sự lựa chọn hiện tại" +msgstr "Đảo ngược lựa chọn hiện tại" msgid "Intersect existing selection" -msgstr "Giao cắt sự lựa chọn hiện tại" +msgstr "Giao cắt lựa chọn hiện tại" msgid "Select Grease Pencil strokes using brush selection" -msgstr "Chọn nét Bút Sáp bằng sự lựa chọn bút" +msgstr "Chọn các nét Bút Chì Dầu dùng phương pháp lựa chọn bằng đầu bút" msgctxt "Operator" @@ -54067,15 +58916,15 @@ msgstr "Chọn Đầu" msgid "Select first point in Grease Pencil strokes" -msgstr "Chọn điểm đầu trong nét Bút Sáp" +msgstr "Chọn điểm đầu tiên trong các nét Bút Chì Dầu" msgid "Extend selection instead of deselecting all other selected points" -msgstr "Mở rộng sự lựa chọn thay thế thả tất cả điểm được chọn rồi" +msgstr "Nới rộng lựa chọn, thay vì hủy chọn toàn bộ các điểm khác đã chọn rồi" msgid "Selected Strokes Only" -msgstr "Chỉ Nét Được Chọn" +msgstr "Duy các Nét được Chọn" msgid "Only select the first point of strokes that already have points selected" @@ -54083,24 +58932,24 @@ msgstr "Chỉ chọn điểm đầu của các nét đã có điểm được ch msgid "Select all strokes with similar characteristics" -msgstr "Chọn hết nét có đặc điểm giống" +msgstr "Chọn toàn bộ các nét vẽ có những đặc điểm tương tự" msgid "Shared layers" -msgstr "Lớp chia sẻ" +msgstr "Có Cùng Tầng Lớp" msgid "Shared materials" -msgstr "Vật liệu chia sẻ" +msgstr "Có Cùng Chất Liệu" msgctxt "Operator" msgid "Lasso Select Strokes" -msgstr "Chọn Nét BằngDây Trói" +msgstr "Chọn Nét Vẽ bằng Dây Thòng Lọng" msgid "Select Grease Pencil strokes using lasso selection" -msgstr "Chọn nét Bút Sáp bằng sự lựa chọn dây trói" +msgstr "Chọn các nét Bút Chì Dầu dùng sự lựa chọn bằng dây thòng lọng" msgctxt "Operator" @@ -54109,23 +58958,23 @@ msgstr "Chọn Cuối" msgid "Select last point in Grease Pencil strokes" -msgstr "Chọn điểm cuối trong nét Bút Sáp" +msgstr "Chọn điểm cuối trong các nét Bút Chì Dầu" msgid "Only select the last point of strokes that already have points selected" -msgstr "Chỉ chọn điểm cuối của nét đã có điểm được chọn rồi" +msgstr "Chỉ chọn điểm cuối của những nét vẽ nào đã một số điểm được chọn rồi mà thôi" msgid "Shrink sets of selected Grease Pencil points" -msgstr "Thu nhỏ các tập điểm Bút Sáp được chọn" +msgstr "Thu nhỏ các bộ điểm Bút Chì Dầu đã chọn" msgid "Select all points in same strokes as already selected points" -msgstr "Chọn hết điểm trong cùng nét với điểm được chọn rồi" +msgstr "Chọn toàn bộ các điểm trong cùng nét vẽ như các điểm đã được chọn" msgid "Grow sets of selected Grease Pencil points" -msgstr "Mở rộng các tập điểm Bút Sáp được chọn" +msgstr "Tăng số các điểm Bút Chì Dầu được chọn" msgctxt "Operator" @@ -54134,24 +58983,24 @@ msgstr "Ngẫu Nhiên" msgid "Select random points for non selected strokes" -msgstr "Ngẫu nhiên chọn những điểm cho các nét chưa chọn" +msgstr "Chọn các điểm một cách ngẫu nhiên trên các nét chưa được chọn" msgctxt "Operator" msgid "Select Vertex Color" -msgstr "Chọn Màu Đỉnh" +msgstr "Lựa Chọn Màu Điểm Đỉnh" msgid "Select all points with similar vertex color of current selected" -msgstr "Chọn hết điểm có cùng màu đỉnh với được chọn hiện tại" +msgstr "Lựa chọn toàn bộ các điểm có màu điểm đỉnh tương đồng với cái được chọn" msgid "Tolerance of the selection. Higher values select a wider range of similar colors" -msgstr "Sự chênh lệch của sự lửa chọn. Giá trị càng cao được chọn phạm vi màu càng rộng" +msgstr "Dung sai của sự lựa chọn. Giá trị cao sẽ lựa chọn phạm vi màu sắc tương đồng rộng hơn" msgid "Hide/Unhide selected points for Grease Pencil strokes setting alpha factor" -msgstr "Ẩn/hiện các điểm được chọn cho nét Bút Sáp đang đặt hệ số độ đục" +msgstr "Ẩn giấu/hiện các điểm được chọn cho các nét Bút Chì Dầu bằng cách thay đổi hệ số alpha" msgctxt "Operator" @@ -54160,11 +59009,11 @@ msgstr "Bật/Tắt Chế Độ Chọn" msgid "Set selection mode for Grease Pencil strokes" -msgstr "Đặt chế độ sự lựa chọn cho nét Bút Sáp" +msgstr "Đặt chế độ lựa chọn cho các nét vẽ Bút Chì Dầu" msgid "Select Mode" -msgstr "Chế Độ Chọn" +msgstr "Chế Độ Lựa Chọn" msgid "Select mode" @@ -54173,89 +59022,89 @@ msgstr "Chế Độ Lựa Chọn" msgctxt "Operator" msgid "Set active material" -msgstr "Đặt vật liệu hoạt động" +msgstr "Đặt nguyên vật liệu đang hoạt động" msgid "Set the selected stroke material as the active material" -msgstr "Đặt vật liệu nét được chọn làm vật lịệu hoạt động" +msgstr "Đặt nguyên vật liệu của nét vẽ được chọn làm nguyên vật liệu đang hoạt động" msgctxt "Operator" msgid "Snap Cursor to Selected Points" -msgstr "Hút Dính Con Trỏ Đến Điểm Được Chọn" +msgstr "Bám Dính Con Trỏ vào các Điểm được Chọn" msgid "Snap cursor to center of selected points" -msgstr "Hút dính con trỏ đến trung tâm của các điểm được chọn" +msgstr "Bám dính con trỏ vào tâm của các điểm được chọn" msgctxt "Operator" msgid "Snap Selection to Cursor" -msgstr "Hút Dính Được Chọn Đến Con Trỏ" +msgstr "Bám Dính Lựa Chọn vào Con Trỏ" msgid "Snap selected points/strokes to the cursor" -msgstr "Hút dính các điểm/nét được chọn đến con trỏ" +msgstr "Bám dính các điểm/nét vẽ được chọn vào con trỏ" msgid "With Offset" -msgstr "Với Dịch" +msgstr "Với Dịch Chuyển" msgid "Offset the entire stroke instead of selected points only" -msgstr "Dịch toàn nét thay thế chỉ dịch các điểm được chọn" +msgstr "Dịch chuyển toàn bộ nét vẽ, thay vì chỉ điểm được chọn mà thôi" msgctxt "Operator" msgid "Snap Selection to Grid" -msgstr "Hút Dính Được Chọn Đến Đồ Thị" +msgstr "Bám Dính Lựa Chọn vào Khung Lưới Đồ Thị" msgid "Snap selected points to the nearest grid points" -msgstr "Hút dính các điểm được chọn đến các điểm đồ thị gần nhất" +msgstr "Bám dính điểm được chọn vào các điểm của khung lưới đồ thị gần nhất" msgctxt "Operator" msgid "Apply Stroke Thickness" -msgstr "Áp Dụng Bề Rộng Nét" +msgstr "Áp Dụng Độ Dày của Nét Vẽ" msgid "Apply the thickness change of the layer to its strokes" -msgstr "Áp dụng sự thay đổi bề rộng với các nét của lớp này" +msgstr "Áp dụng sự thay đổi về độ dày của tầng lớp sang các nét vẽ của nó" msgctxt "Operator" msgid "Arrange Stroke" -msgstr "Sắp Xếp Nét" +msgstr "Sắp Xếp Nét Vẽ" msgid "Arrange selected strokes up/down in the display order of the active layer" -msgstr "Sắp xếp các nét được chọn lên/xuống trong thứ tự hiển thị của lớp hoạt động" +msgstr "Sắp xếp các nét đã chọn lên/xuống, theo thứ tự hiển thị của lớp đang hoạt động" msgid "Bring to Front" -msgstr "Gởi Phía Trước" +msgstr "Đưa về Trước Nhất" msgid "Bring Forward" -msgstr "Gởi Phía Trước" +msgstr "Đưa về Trước" msgid "Send Backward" -msgstr "Gởi Phía Sau" +msgstr "Đưa về Sau" msgid "Send to Back" -msgstr "Gởi Phía Sau" +msgstr "Đưa về Sau Cùng" msgctxt "Operator" msgid "Set Caps Mode" -msgstr "Đặt Chế Độ Nắp" +msgstr "Đặt Chế Độ Đầu của Nét Vẽ" msgid "Change stroke caps mode (rounded or flat)" -msgstr "Đổi chế độ nắp nét (tròn hay bằng phẳng)" +msgstr "Đổi kiểu đầu của các nét vẽ (tròn hay phẳng)" msgid "Both" @@ -54263,211 +59112,244 @@ msgstr "Cả Hai" msgid "Set as default rounded" -msgstr "Đặt tròn là mặc định" +msgstr "Đặt mặc định là tròn" msgctxt "Operator" msgid "Change Stroke Color" -msgstr "Đổi Màu Nét" +msgstr "Đổi Màu của Nét" msgid "Move selected strokes to active material" -msgstr "Di chuyển các nét được chọn đến vật lịệu hoạt động" +msgstr "Di chuyển các nét được chọn sang chất liệu đang hoạt động" msgid "Name of the material" -msgstr "Tên của vật liệu" +msgstr "Tên của chất liệu" msgctxt "Operator" msgid "Stroke Cutter" -msgstr "Cắt Nét" +msgstr "Phương Pháp Cắt Nét Vẽ" msgid "Select section and cut" -msgstr "Chón khúc và cắt" +msgstr "Chọn phân đoạn và cắt" msgid "Flat Caps" -msgstr "Nắp Bằng Phẳng" +msgstr "Nắp Đầu Phẳng Bẹt" msgctxt "Operator" msgid "Set Cyclical State" -msgstr "Đặt Trạng Thái Chu Trình" +msgstr "Đặt Trạng Thái Tuần Hoàn" + + +msgid "Close or open the selected stroke adding a segment from last to first point" +msgstr "Đóng hoặc mở nét vẽ đã chọn, cho thêm một phân đoạn từ điểm cuối đến điểm đầu" msgid "Create Geometry" -msgstr "Chế Tạo Hình Dạng" +msgstr "Kiến Tạo Hình Học" msgid "Create new geometry for closing stroke" -msgstr "Chế tạo hình dạng cho đóng nét" +msgstr "Kiến tạo hình học mới cho nét vẽ đóng kín" msgid "Close All" -msgstr "Đóng Hết" +msgstr "Toàn Bộ Kín" msgid "Open All" -msgstr "Mở Hết" +msgstr "Toàn Bộ Mở" msgctxt "Operator" msgid "Set handle type" -msgstr "Đặt loại tay cầm" +msgstr "Đặt kiểu tay cầm" + + +msgid "Set the type of an edit curve handle" +msgstr "Đặt kiểu tay cầm của một đường cong biên soạn" msgctxt "Operator" msgid "Enter curve edit mode" -msgstr "Vào chế độ đường cong biên tập" +msgstr "Chuyển sang chế độ biên soạn đường cong" msgid "Called to transform a stroke into a curve" -msgstr "Kêu để biến hóa một nét thành một đường cong" +msgstr "Yêu cầu biến hóa nét vẽ thành một đường cong" msgid "Error Threshold" -msgstr "Ngưỡng Sai Lầm" +msgstr "Mức Lỗi Tối Đa" msgid "Threshold on the maximum deviation from the actual stroke" -msgstr "Ngưỡng cho hạn chế sai lệch cực đại từ nét thật" +msgstr "Ngưỡng về độ lệch hướng tối đa khỏi nét vẽ chính cho phép" msgctxt "Operator" msgid "Flip Stroke" -msgstr "Lật Nét" +msgstr "Lật Đảo Nét Vẽ" msgid "Change direction of the points of the selected strokes" -msgstr "Đổi hướng của điểm của các nét được chọn" +msgstr "Chuyển đổi chiều hướng của các điểm trên các nét được chọn" msgctxt "Operator" msgid "Join Strokes" -msgstr "Kết Nối Nét" +msgstr "Chắp Nối các Nét" msgid "Join selected strokes (optionally as new stroke)" -msgstr "Kết nối các nét được chọn (tùy chọn làm nét mới)" +msgstr "Chắp nối các nét vẽ đã chọn (tạo thành nét mới, nếu muốn)" msgid "Leave Gaps" -msgstr "Để Lại Cách Trống" +msgstr "Để Nguyên các Khoảng Trống" msgid "Leave gaps between joined strokes instead of linking them" -msgstr "Bỏ cách trống giữa nét kết nối thay thế kết nối nó" +msgstr "Để nguyên các khoảng trống giữa các nét vẽ, thay vì kết nối chúng" msgid "Join" -msgstr "Kết Nối" +msgstr "Chắp Nối/Hội Nhập" msgid "Join and Copy" -msgstr "Kết Nối Và Chép" +msgstr "Hội Nhập và Sao Chép" msgctxt "Operator" msgid "Merge Strokes" -msgstr "Gồm Nét" +msgstr "Hội Nhập các Nét Vẽ" msgid "Create a new stroke with the selected stroke points" -msgstr "Chế tạo một nét mới với các điểm nét được chọn" +msgstr "Kiến Tạo một nét vẽ mới với các điểm của nét vẽ đã chọn" msgid "Additive Drawing" -msgstr "Vẽ Cộng Lên" +msgstr "Vẽ Bổ Sung" msgid "Add to previous drawing" -msgstr "Cộng thêm vào đồ vẽ trước" +msgstr "Bổ sung vào các nét vẽ trước đây" msgid "Draw new stroke below all previous strokes" -msgstr "Vẽ nét mới phía dưới tất cả nét trước" +msgstr "Vẽ các nét mới nằm dưới những nét vẽ trước đây" msgid "Dissolve Points" -msgstr "Hòa Tan Điểm" +msgstr "Tiêu Hủy các Điểm" msgid "Dissolve old selected points" -msgstr "Hòa tan các điểm cũ được chọn" +msgstr "Tiêu hủy các điểm được chọn trước đây" msgid "Delete Strokes" -msgstr "Xóa Nét" +msgstr "Xóa các Nét Vẽ" msgid "Delete old selected strokes" -msgstr "Xóa các nét cũ được chọn" +msgstr "Xóa các nét vẽ đã chọn trước đây" msgid "Close new stroke" -msgstr "Đóng nét mới" +msgstr "Đóng kín các nét vẽ mới" msgctxt "Operator" msgid "Merge by Distance" -msgstr "Gồm Bằng Khoảng Cách" +msgstr "Hợp Nhất theo Khoảng Cách" msgid "Merge points by distance" -msgstr "Gồm bằng khoảng cách" +msgstr "Hội nhập các điểm theo khoảng cách" msgid "Use whole stroke, not only selected points" -msgstr "Dùng toàn bộ nét, không phải chỉ điểm được chọn" +msgstr "Sử dụng toàn bộ nét vẽ chứ không chỉ các điểm đã chọn mà thôi" msgctxt "Operator" msgid "Merge Grease Pencil Materials" -msgstr "Gồm Vật Liệu Bút Sáp" +msgstr "Hợp Nhất Chất Liệu Bút Chì Dầu" msgid "Replace materials in strokes merging similar" -msgstr "Thay thế vật liệu trong nét đang gồm giống nhau" +msgstr "Thay thế chất liệu trong nét vẽ, hợp nhất những cái tương đồng" msgid "Hue Threshold" -msgstr "Ngưỡng Màu Sắc" +msgstr "Ngưỡng của Sắc Màu" msgid "Saturation Threshold" -msgstr "Ngưỡng Độ Tươi" +msgstr "Ngưỡng của Độ Bão Hòa" msgid "Value Threshold" -msgstr "Ngưỡng Độ Sáng" +msgstr "Ngưỡng của Giá Trị" msgctxt "Operator" msgid "Normalize Stroke" -msgstr "Đơn Vị Hóa Nét" +msgstr "Bình Thường Hóa Nét Vẽ" msgid "Normalize stroke attributes" -msgstr "đơn vị hóa các đặc điểm của nét" +msgstr "Bình thường hóa các thuộc tính của nét vẽ" msgid "Attribute to be normalized" -msgstr "Đặc điểm cho đơn vị hoá" +msgstr "Thuộc tính sẽ được bình thường hóa" msgid "Normalizes the stroke thickness by making all points use the same thickness value" -msgstr "Đơn vị hóa chiều rộng của nét bằng cho hết điểm cùng giá trị chiều rộng" +msgstr "Bình thường hóa độ dày của nét vẽ bằng cách làm cho toàn bộ các điểm đều sử dụng cùng một giá trị độ dày giống nhau" msgid "Normalizes the stroke opacity by making all points use the same opacity value" -msgstr "Đơn vị hóa độ đục của nét bằng cho hết điểm cùng giá trị độ đục" +msgstr "Bình thường hóa độ mờ đục của nét vẽ bằng cách làm cho toàn bộ các điểm đều sử dụng cùng một giá trị đục giống nhau" + + +msgctxt "Operator" +msgid "Convert Stroke to Outline" +msgstr "Chuyển Đổi Nét Vẽ thành Đường Viền" + + +msgid "Try to keep global shape when the stroke thickness change" +msgstr "Cố gắng duy trì hình dạng toàn cầu khi độ dày nét vẽ thay đổi" + + +msgid "Keep Material" +msgstr "Duy Trì Nguyên Vật Liệu" + + +msgid "Keep current stroke material" +msgstr "Duy trì nguyên vật liệu hiện tại của đầu bút" + + +msgid "New Material" +msgstr "Nguyên Vật Liệu Mới" + + +msgid "Thickness of the stroke perimeter" +msgstr "Độ dày đường chu vi của nét vẽ" msgctxt "View3D" msgid "View" -msgstr "Màn Chiếu" +msgstr "Góc Nhìn" msgctxt "View3D" @@ -54475,9 +59357,14 @@ msgid "Front" msgstr "Trước" +msgctxt "View3D" +msgid "Side" +msgstr "Bên" + + msgctxt "View3D" msgid "Top" -msgstr "Trên" +msgstr "Đỉnh" msgctxt "View3D" @@ -54487,197 +59374,244 @@ msgstr "Máy Quay Phim" msgctxt "Operator" msgid "Reset Vertex Color" -msgstr "Đặt Lại Màu Đỉnh" +msgstr "Hoàn Lại Màu Điểm Đỉnh" msgid "Reset vertex color for all or selected strokes" -msgstr "Đặt lại màu đỉnh cho hết nét hoặc các nét đơực chọn" +msgstr "Hoàn lại màu điểm đỉnh cho toàn bộ hoặc các nét vẽ được chọn" msgid "Reset Vertex Color to Stroke only" -msgstr "Đặt Lại Màu Đỉnh thành chỉ Nét" +msgstr "Duy Hoàn Lại Màu Điểm Đỉnh trên Nét Vẽ" msgid "Reset Vertex Color to Fill only" -msgstr "Đặt Lại Màu Đỉnh thành chỉ Tô Đầy" +msgstr "Duy Hoàn Lại Màu Điểm Đỉnh trên Vùng Tô Kín" msgid "Reset Vertex Color to Stroke and Fill" -msgstr "Đặt Lại Màu Đỉh thành chỉ Nét và Tô Đầy" +msgstr "Hoàn Lại Màu Điểm Đỉnh trên Nét Vẽ và Vùng Tô Kín" msgctxt "Operator" msgid "Sample Stroke" -msgstr "Lấy Mẫu Vật Nét" +msgstr "Lấy Mẫu Vật Nét Vẽ" msgid "Sample stroke points to predefined segment length" -msgstr "Lấy điểm mẫu vật đến một khúc có bề dài đã được xác định" +msgstr "Lấy mẫu vật các điểm của nét vẽ theo chiều dài phân đoạn đã định" msgctxt "Operator" msgid "Separate Strokes" -msgstr "Chẻ Các Nét" +msgstr "Phân các Nét Vẽ" msgid "Separate the selected strokes or layer in a new grease pencil object" -msgstr "Chẻ nét được chọn hoặc lớp thành một vật thể bút sáp mới" +msgstr "Phân tách các nét vẽ được chọn hoặc tầng lớp trong một đối tượng Bút Chì Dầu mới" msgid "Selected Points" -msgstr "Điểm Được Chọn" +msgstr "Điểm được Chọn" msgid "Separate the selected points" -msgstr "Chẻ các điểm được chọn" +msgstr "Phân tách các điểm được chọn" msgid "Selected Strokes" -msgstr "Nét Được Chọn" +msgstr "Nét Vẽ được Chọn" msgid "Separate the selected strokes" -msgstr "Chẻ các nét được chọn" +msgstr "Tách phân các nét vẽ được chọn" msgid "Separate the strokes of the current layer" -msgstr "Chẻ các nét của lớp hiện tại" +msgstr "Tách phân các nét vẽ của tầng lớp hiện tại" msgctxt "Operator" msgid "Simplify Stroke" -msgstr "Đơn Giản Hóa Nét" +msgstr "Đơn Giản Hóa Nét Vẽ" + + +msgid "Simplify selected strokes, reducing number of points" +msgstr "Đơn giản hóa các nét đã chọn, giảm số điểm" msgctxt "Operator" msgid "Simplify Fixed Stroke" -msgstr "Đơn Giản Hóa Nét Bất Biến" +msgstr "Đơn Giản Hóa Nét Vẽ bằng Cố Định" + + +msgid "Simplify selected strokes, reducing number of points using fixed algorithm" +msgstr "Đơn giản hóa các nét đã chọn, giảm số điểm bằng thuật toán cố định" msgid "Number of simplify steps" -msgstr "Số lượng bước để đơn giản hóa" +msgstr "Số lượng bước đơn giản hóa sử dụng" msgctxt "Operator" msgid "Smooth Stroke" -msgstr "Mịn Hóa Nét" +msgstr "Nắn Mượt Nét Vẽ" msgid "Smooth selected strokes" -msgstr "Mịn hóa các nét được chọn" +msgstr "Nắn mượt nét vẽ được chọn" msgid "Smooth only selected points in the stroke" -msgstr "Chỉ mịn hóa các điểm trong nét" +msgstr "Duy nắn mượt các điểm được chọn trong nét vẽ" msgctxt "Operator" msgid "Split Strokes" -msgstr "Chẻ Nét" +msgstr "Phân Tách Nét Vẽ" msgid "Split selected points as new stroke on same frame" -msgstr "Chẻ điểm được chọn thành nét mới trong cùng bức ảnh" +msgstr "Phân tách các điểm được chọn như nét vẽ mới trong cùng một khung hình" + + +msgctxt "Operator" +msgid "Set Start Point" +msgstr "Đặt Điểm Bắt Đầu" + + +msgid "Set start point for cyclic strokes" +msgstr "Đặt điểm bắt đầu cho các nét tuần hoàn" msgctxt "Operator" msgid "Subdivide Stroke" -msgstr "Phân Hóa Nét" +msgstr "Phân Chia Nét Vẽ" msgid "Subdivide between continuous selected points of the stroke adding a point half way between them" -msgstr "Phân hóa giữa điểm nét liên tiếp được chọn và kèm thêm một điểm trung giữa chúng." +msgstr "Phân chia các điểm nối tiếp nhau của đường nét, thêm một điểm nằm giữa chúng" msgctxt "Operator" msgid "Trim Stroke" -msgstr "Cắt Bớt Nét" +msgstr "Cắt Gọn Nét Vẽ" msgid "Trim selected stroke to first loop or intersection" -msgstr "Cắt bớt nét được chọn đến lặp vòng đầu hay vùng giao cắt" +msgstr "Cắt gọn nét vẽ tới vòng mạch đầu tiên hoặc tới điểm giao cắt" + + +msgid "Add a segment to the time modifier" +msgstr "Thêm một phân đoạn vào bộ điều chỉnh thời gian" + + +msgctxt "Operator" +msgid "Move Time Segment" +msgstr "Di Chuyển Phân Đoạn Thời Gian" + + +msgid "Move the active time segment up or down" +msgstr "Di chuyển phân đoạn thời gian đang hoạt động lên hoặc xuống" + + +msgctxt "Operator" +msgid "Remove Time Segment" +msgstr "Xóa Phân Đoạn Thời Gian" + + +msgid "Remove the active segment from the time modifier" +msgstr "Xóa phân đoạn đang hoạt động khỏi bộ điều chỉnh thời gian" msgctxt "Operator" msgid "Flip Colors" -msgstr "Lật Màu" +msgstr "Đảo Màu" msgid "Switch tint colors" -msgstr "Trao đổi màu nhiễm" +msgstr "Đổi màu nhuốm" msgctxt "Operator" msgid "Trace Image to Grease Pencil" -msgstr "Vẽ Lại Ảnh sang Bút Sáp" +msgstr "Can Hình Ảnh thành Bút Chì Dầu" msgid "Extract Grease Pencil strokes from image" -msgstr "Rút nét Bút Sáp từ ảnh" +msgstr "Trích Xuất các Nét Bút Chì Dầu từ hình ảnh" + + +msgid "Trace Frame" +msgstr "Can Khung Hình" + + +msgid "Used to trace only one frame of the image sequence, set to zero to trace all" +msgstr "Sử dụng để chỉ can một khung hình của trình tự hình ảnh mà thôi, đặt thành 0 để can toàn bộ" msgid "Determines if trace simple image or full sequence" -msgstr "Chọn vẽ lại vẽ lại một ảnh hay toàn bộ trình tự" +msgstr "Xác định xem là sẽ can đơn hình ảnh hoặc toàn bộ trình tự" msgid "Trace the current frame of the image" -msgstr "Vẽ lại bức ảnh hiện tại của ảnh" +msgstr "Can khung hình hiện tại của hình ảnh" msgid "Trace full sequence" -msgstr "Vẽ lại taòn trình tự" +msgstr "Can toàn bộ trình tự" msgid "Resolution of the generated curves" -msgstr "Độ phân giải cửa những đường cong được chế tạo" +msgstr "Độ phân giải của đường cong sinh tạo ra" msgid "Distance to sample points, zero to disable" -msgstr "Khoảng cách đến các điểm mẫu, đặt = 0 để tắt" +msgstr "Khoảng cách đến các điểm lấy mẫu, 0 để tắt đi" msgid "Scale of the final stroke" -msgstr "Phóng to của nét cuối cùng" +msgstr "Tỷ lệ của nét vẽ kết thúc" msgid "Color Threshold" -msgstr "Mức Độ Màu Sắc" +msgstr "Ngưỡng Màu Sắc Cho Phép" msgid "Determine the lightness threshold above which strokes are generated" -msgstr "Quyết định mức độ cho chế tạo nét nếu độ sáng cao hơn" +msgstr "Xác định giá trị giới hạn về độ sáng mà trên đó các nét vẽ sẽ được sinh tạo (độ sáng trên ngưỡng này)" msgid "Turn Policy" -msgstr "Thổ Tục Lựa Chọn" +msgstr "Nguyên Tắc Đổi Chiều Hướng" msgid "Determines how to resolve ambiguities during decomposition of bitmaps into paths" -msgstr "Làm sao quyết định chỗ mơ hồ khi phân tích ảnh điểm ảnh sang đường nét" +msgstr "Xác định phương pháp lý giải các trường hợp mơ hồ trong quá trình phân tích bitmap thành đường dẫn" msgid "Prefers to connect black (foreground) components" -msgstr "Ưu tiên kết nối thành phần đen (cận cảnh)" +msgstr "Có thiện ý kết nối các thành phần màu đen (nền trước) hơn" msgid "Prefers to connect white (background) components" -msgstr "Ưu tiên kết nối thành phần trắng (hậu cảnh)" +msgstr "Có thiện ý kết nối các thành phần màu trắng (nền sau) hơn" msgid "Always take a left turn" -msgstr "Lần nào cũng quẹo trái" +msgstr "Luôn luôn rẽ trái" msgid "Always take a right turn" -msgstr "Lần nào cũng quẹo phải" +msgstr "Luôn luôn rẽ phải" msgid "Minority" -msgstr "Thiếu Số" +msgstr "Thiểu Số" msgid "Prefers to connect the color (black or white) that occurs least frequently in the local neighborhood of the current position" -msgstr "Ưu tiên kết nối màu nào (đen hay trắng) xuất hiện ít hơn xung quanh vị trí hiện tại" +msgstr "Có thiện ý kết nối các trường hợp màu (đen hoặc trắng) xảy ra ít nhất trong các vùng lân cận của vị trí hiện tại" msgid "Majority" @@ -54685,266 +59619,359 @@ msgstr "Đa Số" msgid "Prefers to connect the color (black or white) that occurs most frequently in the local neighborhood of the current position" -msgstr "Ưu tiên kết nối màu nào (đen hay trắng) xuất hiện nhiều hơn xung quanh vị trí hiện tại" +msgstr "Có thiện ý kết nối các trường hợp màu (đen hoặc trắng) xảy ra nhiều nhất trong các vùng lân cận của vị trí hiện tại" msgid "Choose pseudo-randomly" -msgstr "Chọn xấp xỉ ngẫu nhiên" +msgstr "Lựa Chọn Ngẫu Giả" msgid "Start At Current Frame" -msgstr "Bắt Đầu Tại Bức Ảnh Hiện Tại" +msgstr "Bắt Đầu ở Khung Hình Hiện Tại" msgid "Trace Image starting in current image frame" -msgstr "Vẽ lại Ảnh bắt đầu tại bức ảnh hiện tại" +msgstr "Can Hình Ảnh bắt đầu ở khung hình hiện tại" msgctxt "Operator" msgid "Transform Stroke Fill" -msgstr "Biến Hóa Tô Đầy Nét" +msgstr "Biến Hóa Vùng Tô Kín của Nét Vẽ" msgid "Transform grease pencil stroke fill" -msgstr "Biến hóa nét tô đầy của bút sáp" +msgstr "Biến hóa vùng tô kín của nét vẽ bút chì dầu" msgctxt "Operator" msgid "Unlock All Layers" -msgstr "Mở Khóa Hết Lớp" +msgstr "Mở Khóa Toàn Bộ các Tầng Lớp" msgid "Unlock all Grease Pencil layers so that they can be edited" -msgstr "Mở khóa hết lớp Bút Sáp cho có thể chỉnh sửa chúng nó" +msgstr "Mở khóa toàn bộ các tầng lớp Bút Chì Dầu, hầu cho chúng có thể biên soạn được" msgctxt "Operator" msgid "Vertex Paint Brightness/Contrast" -msgstr "Độ Sáng/Chênh Lệch Nước Sơn Đỉnh" +msgstr "Độ Sáng/Độ Tương Phản của Sơn Điểm Đỉnh" msgid "Adjust vertex color brightness/contrast" -msgstr "Chỉnh độ sáng/chênh lệch màu đỉnh" +msgstr "Điều chỉnh độ sáng/độ tương phản của màu điểm đỉnh" + + +msgctxt "Operator" +msgid "Vertex Paint Hue/Saturation/Value" +msgstr "Sơn Điểm Đỉnh: Sắc Màu, Độ Bão Hòa, Giá Trị" msgid "Adjust vertex color HSV values" -msgstr "Chỉnh giá trị đỉnh màu HSV" +msgstr "Chỉnh các giá trị HSV của màu điểm đỉnh" msgctxt "Operator" msgid "Vertex Paint Invert" -msgstr "Đảo Nghịch Sơn Đỉnh" +msgstr "Đảo Nghịch Sơn Điểm Đỉnh" msgid "Invert RGB values" -msgstr "Đảo nghịch giá trị RGB" +msgstr "Đảo nghịch các giá trị RGB" msgctxt "Operator" msgid "Vertex Paint Levels" -msgstr "Mức Sơn Đỉnh" +msgstr "Mức Độ Sơn Điểm Đỉnh" msgid "Adjust levels of vertex colors" -msgstr "Chỉnh mức của màu đỉnh" +msgstr "Chỉnh mức độ của màu điểm đỉnh" msgid "Value to multiply colors by" -msgstr "Giá trị cho nhân với màu" +msgstr "Giá trị để nhân với màu" msgid "Value to add to colors" -msgstr "Giá trị cho cộng với màu" +msgstr "Giá trị để cộng với màu" msgctxt "Operator" msgid "Vertex Paint Set Color" -msgstr "Đặt Màu Sơn Đỉnh" +msgstr "Đặt Màu cho Sơn Điểm Đỉnh" msgid "Set active color to all selected vertex" -msgstr "Đặt màu hoạt động đến hết đỉnh được chọn" +msgstr "Đặt màu đang hoạt động cho toàn bộ các điểm đỉnh được chọn" msgctxt "Operator" msgid "Assign to Vertex Group" -msgstr "Chỉ Đỉnh Vào Nhóm Đỉnh" +msgstr "Ấn Định vào Nhóm Điểm Đỉnh" msgid "Assign the selected vertices to the active vertex group" -msgstr "Chỉ định các đỉnh được chọn vào nhóm đỉnh hoạt động" +msgstr "Ấn Định các điểm đỉnh được chọn vào nhóm điểm đỉnh đang hoạt động" msgctxt "Operator" msgid "Deselect Vertex Group" -msgstr "Thả Nhóm Đỉnh" +msgstr "Hủy Chọn Nhóm Điểm Đỉnh" msgid "Deselect all selected vertices assigned to the active vertex group" -msgstr "Thả hết đỉnh được chọn mà được chỉ định đến nhóm đỉnh hoạt động" +msgstr "Hủy chọn toàn bộ các điểm đỉnh đã chọn ấn định cho nhóm điểm đỉnh đang hoạt động" msgctxt "Operator" msgid "Invert Vertex Group" -msgstr "Đảo Nghịch Nhóm Đỉnh" +msgstr "Đảo Nghịch Nhóm Điểm Đỉnh" msgid "Invert weights to the active vertex group" -msgstr "Đảo nghịch quyền lượng đến nhóm đỉnh hoạt động" +msgstr "Đảo nghịch trọng lượng theo nhóm điểm đỉnh đang hoạt động" msgctxt "Operator" msgid "Normalize Vertex Group" -msgstr "Đơn Vị Hóa Nhóm Đỉnh" +msgstr "Bình Thường Hóa Nhóm Điểm Đỉnh" msgid "Normalize weights to the active vertex group" -msgstr "Đơn vị hóa quyền lượng đến nhóm đỉnh hoạt động" +msgstr "Bình thường hóa trọng lượng theo nhóm điểm đỉnh đang hoạt động" msgctxt "Operator" msgid "Normalize All Vertex Group" -msgstr "Đơn Vị Hóa Hết Nhóm Đỉnh" +msgstr "Bình Thường Hóa Toàn Bộ Nhóm Điểm Đỉnh" msgid "Normalize all weights of all vertex groups, so that for each vertex, the sum of all weights is 1.0" -msgstr "Đơn vị hóa hết quyền lượng của hết nhóm đỉnh; cho mỗi đỉnh, tổng cộng hết quyền lượng = 1.0" +msgstr "Bình thường hóa tất trọng lượng của toàn bộ các nhóm điểm đỉnh, hầu cho mỗi điểm đỉnh, tổng trọng lượng là 1.0" msgid "Lock Active" -msgstr "Khóa Hoạt Động" +msgstr "Khóa cái đang Hoạt Động" msgid "Keep the values of the active group while normalizing others" -msgstr "Giữ các giá trị của nhóm đang hoạt động khi đơn vị hóa nhóm khác" +msgstr "Giữ các giá trị của nhóm đang hoạt động trong khi bình thường hóa những cái khác" msgctxt "Operator" msgid "Remove from Vertex Group" -msgstr "Xóa từ Nhóm Đỉnh" +msgstr "Xóa khỏi Nhóm Điểm Đỉnh" msgid "Remove the selected vertices from active or all vertex group(s)" -msgstr "Xóa các đỉnh được chọn từ nhóm đỉnh hoạt động hay hết nhóm đỉnh" +msgstr "Xóa các điểm đỉnh được chọn khỏi nhóm điểm đỉnh đang hoạt động hoặc khỏi toàn bộ các nhóm điểm đỉnh" msgctxt "Operator" msgid "Select Vertex Group" -msgstr "Chọn Nhóm Đỉnh" +msgstr "Chọn Nhóm Điểm Đỉnh" msgid "Select all the vertices assigned to the active vertex group" -msgstr "Chọn hết đỉnh chỉ định vào nhóm đỉnh hoạt động" +msgstr "Chọn toàn bộ các điểm đỉnh đã được ấn định vào nhóm điểm đỉnh đang hoạt động" msgctxt "Operator" msgid "Smooth Vertex Group" -msgstr "Mịn Hóa Nhóm Đỉnh" +msgstr "Làm Mịn Nhóm Điểm Đỉnh" msgid "Smooth weights to the active vertex group" -msgstr "Mịn hóa quyền lượng đến nhóm đỉnh hoạt động" +msgstr "Làm mịn trọng lượng của nhóm điểm đỉnh đang hoạt động" msgctxt "Operator" msgid "Stroke Vertex Paint" -msgstr "Sơn Đỉnh Nét" +msgstr "Sơn Điểm Đỉnh" msgid "Paint stroke points with a color" -msgstr "Sơn nét điểm bằng một màu" +msgstr "Sơn các điểm của nét vẽ với một màu sắc nhất định" msgctxt "Operator" msgid "Strokes Vertex Mode Toggle" -msgstr "Bật/Tắt Chế Đồ Đỉnh Nét" +msgstr "Bật/Tắt Chế Độ Điểm Đỉnh của Nét Vẽ" msgid "Enter/Exit vertex paint mode for Grease Pencil strokes" -msgstr "Vào/Thoát chế độ sơn đỉnh cho các nét Bút Sáp" +msgstr "Bước Vào/Thoát Khỏi chế độ sơn điểm đỉnh đối với các nét vẽ Bút Chì Dầu" msgctxt "Operator" msgid "Stroke Weight Paint" -msgstr "Sơn Quyền Lượng Nét" +msgstr "Sơn Trọng Lượng cho Nét Vẽ" + + +msgid "Draw weight on stroke points" +msgstr "Vẽ trọng lượng trên các điểm của nét vẽ" msgctxt "Operator" msgid "Weight Paint Sample Weight" -msgstr "Quyền Lượng Mẫu Vật Sơn Quyền Lượng" +msgstr "Lấy Mẫu Trọng Lượng của Sơn Trọng Lượng" msgid "Use the mouse to sample a weight in the 3D view" -msgstr "Dùng chuột cho lấy mẫu vật quyền lượng trong màn 3D" +msgstr "Dùng chuột để lấy mẫu vật một trọng lượng trong khung nhìn 3D" + + +msgctxt "Operator" +msgid "Weight Paint Toggle Direction" +msgstr "Đảo Lật Chiều Hướng Sơn Trọng Lượng" + + +msgid "Toggle Add/Subtract for the weight paint draw tool" +msgstr "Đảo lật giữa Cộng Thêm/Khấu Trừ cho công cụ vẽ sơn trọng lượng" msgctxt "Operator" msgid "Strokes Weight Mode Toggle" -msgstr "Bật/Tắt Chế Đồ Quyền Lượng Nét" +msgstr "Bật/Tắt Chế Độ Trọng Lượng Nét Vẽ" msgid "Enter/Exit weight paint mode for Grease Pencil strokes" -msgstr "Vào/Thoát chế độ sơn quyền lượng cho nét Bút Sáp" +msgstr "Bước Vào/Thoát Khỏi chế độ sơn trọng lượng cho các nét vẽ của Bút Chì Dầu" + + +msgctxt "Operator" +msgid "Blend Offset Keyframes" +msgstr "Pha Trộn Dịch Chuyển các Khung Khóa" + + +msgid "Shift selected keys to the value of the neighboring keys as a block" +msgstr "Xê dịch các khóa đã chọn tới giá trị của các khóa lân cận dưới dạng một khối" + + +msgid "Control which key to offset towards and how far" +msgstr "Điều khiển khóa nào sẽ dịch chuyển về phía trước và bao xa" msgctxt "Operator" msgid "Blend to Default Value" -msgstr "Pha Trộn Đến Giá Trị Mặc Định" +msgstr "Pha Trộn với Giá Trị Mặc Định" msgid "Blend selected keys to their default value from their current position" -msgstr "Pha trộn các bức ảnh mẫu được chọn đến giạ trị mặc định của chúng nó từ vị trí của chúng nó" +msgstr "Pha trộn các khóa đã chọn thành giá trị mặc định từ vị trí hiện tại của chúng" msgid "How much to blend to the default value" -msgstr "Mức độ cho pha trộn với giá trị mặc định" +msgstr "Lượng pha trộn với giá trị mặc định" + + +msgctxt "Operator" +msgid "Blend to Ease Keyframes" +msgstr "Pha Trộn vào các Khung Hình Chậm Rãi" + + +msgid "Blends keyframes from current state to an ease-in or ease-out curve" +msgstr "Pha trộn các khung khóa từ trạng thái hiện tại sang đường cong chậm rãi vào hoặc ra" + + +msgid "Favor either original data or ease curve" +msgstr "Ưu tiên dữ liệu gốc hoặc đường cong chậm rãi" msgctxt "Operator" msgid "Blend to Neighbor" -msgstr "Pha Trộn Đến Kề" +msgstr "Pha Trộn với Lân Cận" msgid "Blend selected keyframes to their left or right neighbor" -msgstr "Pha trộn các bức ảnh mẫu được chọn với bức ảnh mẫu kề trái và phải" +msgstr "Pha trộn các khung khóa đã chọn với các khung khóa lân cận bên trái hoặc bên phải của chúng" + + +msgid "The blend factor with 0 being the current frame" +msgstr "Hệ số pha trộn, 0 là khung hình hiện tại" msgctxt "Operator" msgid "Breakdown" -msgstr "Chẻ Phần" +msgstr "Phân Tích" msgid "Move selected keyframes to an inbetween position relative to adjacent keys" -msgstr "Di chuyển các bức ảnh được chọn đến một vị trí tương đối giữa với các bức ảnh mẫu kề" +msgstr "Di chuyển các khung khóa đã chọn đến vị trí nằm giữa tương đối với các khóa liền kề" msgid "Favor either the left or the right key" -msgstr "Ưu tiên bức ảnh trái hay bức ảnh mẫu phải" +msgstr "Ủng hộ phím trái hoặc phím phải" + + +msgctxt "Operator" +msgid "Butterworth Smooth" +msgstr "Làm Mịn Butterworth" + + +msgid "Smooth an F-Curve while maintaining the general shape of the curve" +msgstr "Làm mịn một Đường Cong-F trong khi duy trì hình dạng tổng thể của đường cong" + + +msgid "How much to blend to the smoothed curve" +msgstr "Lượng pha trộn vào đường cong mịn màng" + + +msgid "Blend In/Out" +msgstr "Pha Trộn Vào/Ra" + + +msgid "Linearly blend the smooth data to the border frames of the selection" +msgstr "Pha trộn tuyến tính dữ liệu một cách mịn màng vào các khung hình ranh giới của lựa chọn" + + +msgid "Frequency Cutoff (Hz)" +msgstr "Cắt Tần Số (Hz)" + + +msgid "Lower values give a smoother curve" +msgstr "Giá trị thấp hơn mang lại một đường cong mượt mà hơn" + + +msgid "Filter Order" +msgstr "Thứ Tự Thanh Lọc" + + +msgid "Higher values produce a harder frequency cutoff" +msgstr "Giá trị cao hơn tạo ra mức cắt tần số đột ngột hơn" + + +msgid "Samples per Frame" +msgstr "Số Mẫu Vật trên mỗi Khung Hình" + + +msgid "How many samples to calculate per frame, helps with subframe data" +msgstr "Số mẫu vật để tính toán trên mỗi khung hình là bao nhiêu. Hỗ trợ xử lý dữ liệu khung hình thứ" msgctxt "Operator" msgid "Click-Insert Keyframes" -msgstr "Bấm-Chèn Bức Ảnh Mẫu" +msgstr "Bấm Chuột-Chèn Thêm Khung Khóa" msgid "Insert new keyframe at the cursor position for the active F-Curve" -msgstr "Chèn bức ảnh mẫu mới tại vị trí con trỏ cho Cong-F hoạt động" +msgstr "Cộng thêm khung khóa mới tại vị trí con trỏ vào Đường Cong-F đang hoạt động" msgid "Frame to insert keyframe on" -msgstr "Số bức ảnh để chèn bức ảnh mẫu" +msgstr "Khung hình nơi chèn thêm khung khóa vào" msgid "Value for keyframe on" -msgstr "Giá trị cho số bức ảnh mẫu" +msgstr "Giá trị dùng để khung khóa hóa" msgid "Only Curves" -msgstr "Chỉ Đường Cong" +msgstr "Duy Đường Cong" msgid "Select all the keyframes in the curve" -msgstr "Chọn hết bức ảnh mẫu của đường cong" +msgstr "Chọn toàn bộ các khung khóa trong đường cong" msgctxt "Operator" @@ -54953,155 +59980,172 @@ msgstr "Đặt Con Trỏ" msgid "Interactively set the current frame and value cursor" -msgstr "Tương tác đặt số bức ảnh hiện tại và con trỏ giá trị" +msgstr "Đặt số khung hình hiện tại và con trỏ giá trị một cách tương tác" msgctxt "Operator" msgid "Decimate Keyframes" -msgstr "Chẻ Cắt Bức Ảnh Mẫu" +msgstr "Tiêu Hao Khung Khóa" msgid "Decimate F-Curves by removing keyframes that influence the curve shape the least" -msgstr "Chẻ cắt Cong-F bằng xóa các bức ảnh được ảnh hưởng hình dạng đường cong ít nhất" +msgstr "Tiêu Hao Đường Cong-F bằng cách loại bỏ các khung khóa có tác động ít nhất vào hình dạng của đường cong" msgid "The ratio of remaining keyframes after the operation" -msgstr "Tỉ số của bức ảnh mẫu vẫn còn sau thao tác" +msgstr "Tỷ lệ của các khung khóa còn lại sau khi thao tác hoàn tất" msgid "Which mode to use for decimation" -msgstr "Dùng chế độ nào khi chẻ cắt" +msgstr "Chế độ tiêu hao sử dụng" msgid "Use a percentage to specify how many keyframes you want to remove" -msgstr "Dùng một số phân trăm để xác định xóa bao nhiêu bức ảnh mẫu" +msgstr "Dùng phần trăm để xác định số khung khóa bạn cần loại bỏ" msgid "Error Margin" -msgstr "Lề Sai Lầm" +msgstr "Mức Dung sai" msgid "Use an error margin to specify how much the curve is allowed to deviate from the original path" -msgstr "Dùng một lề sai lầm để xác định mức đường cong được chệnh lệch từ đường cong ban đầu" +msgstr "Sử dụng mức sai số để xác định lượng lệch lạc cho phép so với đường dẫn gốc của đường cong" msgid "Max Error Margin" -msgstr "Lề Sai Lầm Cực Đại" +msgstr "Mức Sai Số Tối Đa" msgid "How much the new decimated curve is allowed to deviate from the original" -msgstr "Mức cho đường cong chẻ cắt mới được chệnh lệch từ đường cong ban đầu" +msgstr "Mức sai số mà đường cong bị tiêu hao được phép lệch lạc so với bản gốc" msgctxt "Operator" msgid "Delete Invalid Drivers" -msgstr "Xóa Các Điều Vận Bất Hợp Lệ" +msgstr "Xóa Điều Vận Bất Hợp Pháp" msgid "Delete all visible drivers considered invalid" -msgstr "Xóa hết điều vận hiển thị được không hợp lệ" +msgstr "Xóa toàn bộ các điều vận nằm nhìn thấy được song được nhận định là bất hợp pháp" msgctxt "Operator" msgid "Copy Driver Variables" -msgstr "Chép Biến Điều Vận" +msgstr "Sao Chép Biến Số Điều Vận" msgid "Copy the driver variables of the active driver" -msgstr "Chép các biến dắt của điều vận hoạt động" +msgstr "Sao chép các biến số điều vận của điều vận đang hoạt động" msgctxt "Operator" msgid "Paste Driver Variables" -msgstr "Dán Biến Điều Vận" +msgstr "Dán Biến Số Điều Vận" msgid "Add copied driver variables to the active driver" -msgstr "Kèm biến của điều vận đã chép vào dắt hoạt động" +msgstr "Thêm biến số điều vận vào điều vận đang hoạt động" msgid "Replace Existing" -msgstr "Thay Thế Tồn Tại" +msgstr "Thay Thế cái Tồn Tại" msgid "Replace existing driver variables, instead of just appending to the end of the existing list" -msgstr "Thay thế cho biến của điều vận đang tồn tại, thay thé chỉ kèm vào đuôi của danh sách biến" +msgstr "Thay thế các biến số điều vận hiện tại, thay vì kèm thêm vào cuối danh sách hiện có" + + +msgctxt "Operator" +msgid "Ease Keyframes" +msgstr "Chậm Rãi các Khung Hình" + + +msgid "Align keyframes on a ease-in or ease-out curve" +msgstr "Căn chỉnh các khung khóa trên đường cong chậm rãi-vào hoặc chậm rãi-ra" + + +msgid "Curve Bend" +msgstr "Độ Uốn của Đường Cong" + + +msgid "Control the bend of the curve" +msgstr "Điều khiển độ uốn của đường cong" msgctxt "Operator" msgid "Equalize Handles" -msgstr "Bằng Hóa Các Tay Cầm" +msgstr "Cân Bằng các Tay Cầm" msgid "Ensure selected keyframes' handles have equal length, optionally making them horizontal. Automatic, Automatic Clamped, or Vector handle types will be converted to Aligned" -msgstr "Làm chắc những tay cầm của bức ảnh mẫu dài bằng nhau, tùy chọn làm chúng nó ngang. Tự Động Kẹp Lại, hay đổi loại tay cầm Vectơ sang Sắp Hàng" +msgstr "Đảm bảo các tay cầm của các khung khóa đã chọn có độ dài bằng nhau, ngoài ra, đặt chúng nằm theo chiều ngang. Các kiểu tay cầm Tự Động, Tự Động Hạn Định hoặc Véc Tơ sẽ được chuyển đổi thành Thẳng Hàng" msgid "Flatten" -msgstr "Bằng Phẳng Hóa" +msgstr "Dát Phẳng" msgid "Make the values of the selected keyframes' handles the same as their respective keyframes" -msgstr "Làm gía trị của tay cầm Bezier của các bức ảnh mẫu giống các bức ảnh mẫu liên quan" +msgstr "Làm cho các giá trị của các tay cầm khung khóa đã chọn giống với các khung khóa tương ứng của chúng" msgid "Handle Length" -msgstr "Độ Dài Tay Cầm" +msgstr "Chiều Dài Tay Cầm" msgid "Length to make selected keyframes' bezier handles" -msgstr "Độ dài cho tay cầm Bezier của các bức ảnh mẫu được chọn" +msgstr "Chiều dài tay cầm bezier của khung khóa đã chọn" msgid "Side of the keyframes' bezier handles to affect" -msgstr "Cạnh của tay cầm Bezier của các bức ảnh mẫu để ảnh hưởng" +msgstr "Bên tay cầm của bezier sẽ tác động của khung khóa" msgid "Equalize selected keyframes' left handles" -msgstr "Đồng cỡ hóa tay cầm của các bức ảnh mẫu trái được chọn" +msgstr "Cân bằng tay cầm bên trái của các khung khóa đã chọn" msgid "Equalize selected keyframes' right handles" -msgstr "Đồng cỡ hóa tay cầm của các bức ảnh mẫu phải được chọn" +msgstr "Cân bằng tay cầm bên phải của các khung khóa đã chọn" msgid "Equalize both of a keyframe's handles" -msgstr "Đồng cỡ hóa cả hai tay cầm của bức ảnh mẫu" +msgstr "Cân bằng cả hai tay cầm của một khung khóa" msgctxt "Operator" msgid "Euler Discontinuity Filter" -msgstr "Bộ Lọc Đứt Euler" +msgstr "Thanh Lọc sự Gián Đoạn trong Euler" msgid "Fix large jumps and flips in the selected Euler Rotation F-Curves arising from rotation values being clipped when baking physics" -msgstr "Sửa nhảy lớn và lật trong Cong-F Xoay Euler được xuất hiện từ giá trị xoay bị cắt khi nướng vật lý" +msgstr "Nhằm sửa những độ nhảy và sự đảo lật lớn trong các Đường Cong-F về Xoay Chiều kiểu Euler xảy ra do các giá trị xoay chiều bị cắt đi khi nướng các vật lý" msgctxt "Operator" msgid "Add F-Curve Modifier" -msgstr "Thêm Bộ Điều Chỉnh Cong-F" +msgstr "Thêm Bộ Điều Chỉnh Đường Cong-F" msgid "Add F-Modifier to the active/selected F-Curves" -msgstr "Thêm Bộ Điều Chỉnh-F cho các Cong-F hoạt động/được chọn " +msgstr "Thêm Bộ Điều Chỉnh-F cho các Đường Cong-F đang hoạt động/đã chọn" msgid "Only Active" -msgstr "Chỉ Hoạt Động" +msgstr "Duy cái đang Hoạt Động" msgid "Only add F-Modifier to active F-Curve" -msgstr "Chỉ thêm Bộ Điều Chỉnh-F cho Cong-F hoạt động" +msgstr "Chỉ thêm Bộ Điều Chỉnh-F vào Đường Cong-F đang hoạt động mà thôi" msgctxt "Operator" msgid "Copy F-Modifiers" -msgstr "Chép Bộ Điều Chỉnh-F" +msgstr "Sao Chép Bộ Điều Chỉnh-F" msgid "Copy the F-Modifier(s) of the active F-Curve" -msgstr "Chép lại các Bộ Điều Chỉnh-F của Cong-F hoạt động" +msgstr "Sao chép các Bộ Điều Chỉnh-F của Đường Cong-F đang hoạt động" msgctxt "Operator" @@ -55110,178 +60154,387 @@ msgstr "Dán Bộ Điều Chỉnh-F" msgid "Add copied F-Modifiers to the selected F-Curves" -msgstr "Thêm Cụ Sửa Dổi-F được chép lại cho các Cong-F được chọn" +msgstr "Thêm các Bộ Điều Chỉnh-F đã sao chép vào Đường Cong-F được chọn" msgid "Only paste F-Modifiers on active F-Curve" -msgstr "Chỉ dán Bộ Điều Chỉnh-F cho Cong-F hoạt động" +msgstr "Chỉ dán Bộ Điều Chỉnh-F lên Đường Cong-F đang hoạt động mà thôi" msgid "Replace existing F-Modifiers, instead of just appending to the end of the existing list" -msgstr "Thay thế cho Cụ Sửa Dổi-F, thay chỉ kèm vào duôi của danh sách biến" +msgstr "Thay thế các Bộ Điều Chỉnh-F hiện tại, thay vì chèn thêm vào cuối danh sách hiện có" msgid "Place the cursor on the midpoint of selected keyframes" -msgstr "Đặt con trỏ tại trung điểm của các bức ảnh mẫu đã chọn" +msgstr "Đặt con trỏ tại trung điểm của các khung khóa đã chọn" + + +msgctxt "Operator" +msgid "Gaussian Smooth" +msgstr "Làm Mịn Gauss" + + +msgid "Smooth the curve using a Gaussian filter" +msgstr "Làm mịn đường cong bằng bộ lọc Gauss" msgid "Filter Width" -msgstr "Bề Rộng Bộ Lọc" +msgstr "Chiều Rộng Bộ Lọc" + + +msgid "How far to each side the operator will average the key values" +msgstr "Khoảng cách mà thao tác sẽ tính trung bình các giá trị khóa cho mỗi bên là bao xa" msgid "Sigma" msgstr "Xichma" +msgid "The shape of the gaussian distribution, lower values make it sharper" +msgstr "Hình dạng của phân phối gauss, các giá trị thấp hơn làm cho nó sắc nét hơn" + + msgctxt "Operator" msgid "Clear Ghost Curves" -msgstr "Xóa Đường Cong Bóng" +msgstr "Xóa Đường Cong Ảo Ảnh" msgid "Clear F-Curve snapshots (Ghosts) for active Graph Editor" -msgstr "Xóa ảnh chụp (Ảnh Bóng Ma) Cong-F cho Trình Biên Soạn Biểu Đồ hoạt động" +msgstr "Xóa các bản sao (Ảo Ảnh) Đường Cong-F khỏi Trình Biên Soạn Đồ Thị đang hoạt động" msgctxt "Operator" msgid "Create Ghost Curves" -msgstr "Chế Tạo Đường Cong Bóng Ma" +msgstr "Kiến Tạo Đường Cong Ảo Ảnh" msgid "Create snapshot (Ghosts) of selected F-Curves as background aid for active Graph Editor" -msgstr "Chế tạo ảnh chụp (Ảnh Bóng Ma) của Cong-F được chọn làm nền giup đở dùng Trình Biên Soạn Biểu Đồ hoạt động" +msgstr "Kiến Tạo bản sao (Ảo Ảnh) của Đường Cong-F được chọn để làm hình ảnh nền hỗ trợ cho Trình Biên Soạn Đồ Thị đang hoạt động" msgctxt "Operator" msgid "Hide Curves" -msgstr "Ẩn Đường Cong" +msgstr "Ẩn Giấu Đường Cong" msgid "Hide selected curves from Graph Editor view" -msgstr "Ẩn các đường cong được chọn từ màn Trình Biên Soạn Biểu Đồ" +msgstr "Ẩn giấu các đường cong đã chọn trên khung nhìn của Trình Biên Soạn Đồ Thị" msgid "Hide unselected rather than selected curves" -msgstr "Ẩn các đường cong chưa chọn thay đường cong được chọn" +msgstr "Ẩn giấu đường cong chưa được chọn, thay vì đường cong đã chọn" msgid "Insert a keyframe on all visible and editable F-Curves using each curve's current value" -msgstr "Chén một bức ảnh mẫu trên hết Cong-F hiển thị và biên tập được bằng dùng giá trị hiện tại của mỗi đường cong" +msgstr "Chèn thêm một khung khóa trên toàn bộ các Đường Cong-F nhìn thấy được và có thể biên soạn được, dùng giá trị hiện tại của mỗi đường cong" msgid "Insert a keyframe on selected F-Curves using each curve's current value" -msgstr "Chén một bức ảnh mẫu trên Cong-F, dùng giá trị hiện tại của mỗi đường cong" +msgstr "Chèn thêm một khung khóa vào Đường Cong-F được chọn, dùng giá trị hiện tại của mỗi đường cong" + + +msgid "Only Active F-Curve" +msgstr "Duy Đường Cong-F đang Hoạt Động" + + +msgid "Insert a keyframe on the active F-Curve using the curve's current value" +msgstr "Chèn thêm một khung khóa vào Đường Cong-F đang hoạt động, dùng giá trị hiện tại của đường cong" msgid "Active Channels at Cursor" -msgstr "Các Kênh Hoạt Động tại Con Trỏ" +msgstr "Các Kênh đang Hoạt Động tại Con Trỏ" msgid "Insert a keyframe for the active F-Curve at the cursor point" -msgstr "Chén một bức ảnh mẫu cho Cong-F hoạt động tại điểm con trỏ" +msgstr "Chèn thêm một khung khóa vào Đường Cong-F đang hoạt động tại điểm con trỏ" msgid "Selected Channels at Cursor" -msgstr "Các Kênh Được Chọn tại Con Trỏ" +msgstr "Các Kênh được Chọn tại Con Trỏ" msgid "Insert a keyframe for selected F-Curves at the cursor point" -msgstr "Chén một bức ảnh mẫu cho các Cong-F được chọn tại điểm của con trỏ" +msgstr "Chèn thêm một khung khóa vào các Đường Cong-F được chọn tại điểm con trỏ" msgctxt "Operator" msgid "Jump to Keyframe" -msgstr "Nhảy Đến Bức Ảnh Mẫu" +msgstr "Nhảy đến Khung Khóa" msgid "Jump to previous/next keyframe" -msgstr "Nhảy đến bức ảnh trước/tiếp" +msgstr "Nhảy đến khung hình trước đây/tiếp theo" msgid "Next Keyframe" -msgstr "Bức Ảnh Tiếp" +msgstr "Khung Khóa Tiếp Theo" + + +msgctxt "Operator" +msgid "Keys to Samples" +msgstr "Khóa sang Mẫu Vật" + + +msgid "Convert selected channels to an uneditable set of samples to save storage space" +msgstr "Chuyển đổi các kênh đã chọn thành một tập hợp mẫu vật bất khả chỉnh sửa để tiết kiệm dung lượng lưu trữ" + + +msgctxt "Operator" +msgid "Match Slope" +msgstr "Khớp Độ Dốc" + + +msgid "Blend selected keys to the slope of neighboring ones" +msgstr "Pha trộn các khóa đã chọn với độ dốc của các khóa lân cận" + + +msgid "Defines which keys to use as slope and how much to blend towards them" +msgstr "Xác định những khóa nào sẽ sử dụng làm độ dốc và mức độ pha trộn về phía chúng" msgid "By Values Over Cursor Value" -msgstr "Bằng Giá Trị Hơn Giá Trị Con Trỏ" +msgstr "Theo Giá Trị dùng Giá Trị của Con Trỏ" msgid "Flip values of selected keyframes using the cursor value (Y/Horizontal component) as the mirror line" -msgstr "Dùng con trỏ làm gương lật giá trị của các bức ảnh mẫu được chọn (thành phần Y/Ngang)" +msgstr "Đảo lật các giá trị của các khung khóa được chọn dùng giá trị của con trỏ (thành phần Y/ Chiều Ngang) làm đường tâm phản chiếu" msgid "By Times Over Zero Time" -msgstr "Bằng Thời Gian Hơn Thời Gian Số Không" +msgstr "Theo Thời Gian Qua Mốc Thời Gian Zero" msgid "Flip times of selected keyframes, effectively reversing the order they appear in" -msgstr "Lật thời gian của các bức ảnh mẫu được chọn, làm lật thứ tự ngược chiều" +msgstr "Lật đảo thời gian của các khung khóa được chọn, tương tự như việc đảo ngược thứ tự xuất hiện của chúng" + + +msgid "Paste keys with a value offset" +msgstr "Dán các khóa có giá trị dịch chuyển" + + +msgid "Left Key" +msgstr "Khóa Trái" + + +msgid "Paste keys with the first key matching the key left of the cursor" +msgstr "Dán các phím có phím đầu tiên khớp với phím bên trái của con trỏ" + + +msgid "Right Key" +msgstr "Khóa Phải" + + +msgid "Paste keys with the last key matching the key right of the cursor" +msgstr "Dán các phím có phím cuối cùng khớp với phím bên phải con trỏ" + + +msgid "Current Frame Value" +msgstr "Giá Trị Khung Hình Hiện Tại" + + +msgid "Paste keys relative to the value of the curve under the cursor" +msgstr "Dán các phím tương đối với giá trị của đường cong bên dưới con trỏ" + + +msgid "Cursor Value" +msgstr "Giá Trị Con Trỏ" + + +msgid "Paste keys relative to the Y-Position of the cursor" +msgstr "Dán các phím tương đối với Vị Trí-Y bên dưới con trỏ" + + +msgid "Paste keys with the same value as they were copied" +msgstr "Dán các khóa có cùng giá trị như chúng đã được sao chép" msgid "Set Preview Range based on range of selected keyframes" -msgstr "Đặt Phạm Vi Dự Khán tùy phạm vi của bức ảnh mẫu được chọn" +msgstr "Đặt Phạm Vi Xem Trước dựa trên phạm vi các khung khóa đã chọn" + + +msgctxt "Operator" +msgid "Push Pull Keyframes" +msgstr "Đẩn Kéo Khung Khóa" + + +msgid "Exaggerate or minimize the value of the selected keys" +msgstr "Cường điệu hoặc thu nhỏ giá trị của các khóa đã chọn" + + +msgid "Control how far to push or pull the keys" +msgstr "Điều khiển khoảng cách đẩn hoặc kéo các khóa" msgctxt "Operator" msgid "Reveal Curves" -msgstr "Hiện Đường Cong" +msgstr "Bộc Lộ các Đường Cong" msgid "Make previously hidden curves visible again in Graph Editor view" -msgstr "Hiện các đường cong được ẩn cho hiển thị lại trong màn Trình Biên Soạn Biểu Đồ" +msgstr "Làm cho các đường cong đã ẩn giấu trước đây lại hiện ra trong góc nhìn của Trình Biên Soạn Đồ Thị" + + +msgctxt "Operator" +msgid "Samples to Keys" +msgstr "Mẫu Vật sang Khóa" + + +msgid "Convert selected channels from samples to keyframes" +msgstr "Chuyển đổi các kênh đã chọn từ số mẫu vật sang số khung khóa" + + +msgctxt "Operator" +msgid "Scale Average Keyframes" +msgstr "Tỷ Lệ Khung Khóa Trung Bình" + + +msgid "Scale selected key values by their combined average" +msgstr "Đổi tỷ lệ các giá trị khóa đã chọn theo mức trung bình tổng hợp của chúng" + + +msgid "Scale Factor" +msgstr "Hệ Số Tỷ Lệ" + + +msgid "The scale factor applied to the curve segments" +msgstr "Hệ số tỷ lệ áp dụng cho các phân đoạn đường cong" msgid "Are handles tested individually against the selection criteria" -msgstr "Tay cầm được kiểm tra riêng đối với mục đích sự lựa chọn" +msgstr "Kiểm tra xem mỗi tay cầm có được bao gồm trong vùng lựa chọn hay không" msgid "Select Curves" -msgstr "Chọn Đường Cong" +msgstr "Lựa Chọn Đường Cong" + + +msgid "Allow selecting all the keyframes of a curve by selecting the calculated F-curve" +msgstr "Cho phép lựa chọn tất cả các khung khóa của một đường cong bằng cách chọn đường cong-F đã được tính toán" msgid "Allow selecting all the keyframes of a curve by selecting the curve itself" -msgstr "Cho chọn hết bức ảnh mẫu của một đường cong bằng chọn đường cong một mình" +msgstr "Cho phép chọn toàn bộ các khung khóa của đường cong bằng cách lựa chọn bản thân đường cong ấy" + + +msgctxt "Operator" +msgid "Select Key / Handles" +msgstr "Chọn Khóa/Tay cầm" + + +msgid "For selected keyframes, select/deselect any combination of the key itself and its handles" +msgstr "Đối với các khung khóa đã chọn, hãy chọn/hủy chọn bất kỳ tổ hợp của bản thân khóa nào đó cùng các tay cầm của nó" + + +msgid "Effect on the key itself" +msgstr "Tác động lên bản thân khóa" + + +msgid "Keep" +msgstr "Giữ" + + +msgid "Leave as is" +msgstr "Để nguyên như vậy" + + +msgid "Effect on the left handle" +msgstr "Dùng các tay cầm bên trái" + + +msgid "Effect on the right handle" +msgstr "Dùng các tay cầm bên phải" + + +msgctxt "Operator" +msgid "Shear Keyframes" +msgstr "Xô Lệch Khung Khóa" + + +msgid "Affect the value of the keys linearly, keeping the same relationship between them using either the left or the right key as reference" +msgstr "Ảnh hưởng đến giá trị của các khóa một cách tuyến tính, giữ nguyên mối quan hệ giữa chúng bằng cách sử dụng khóa bên trái hoặc bên phải làm tham chiếu" + + +msgid "Which end of the segment to use as a reference to shear from" +msgstr "Đầu nào của phân đoạn được sử dụng làm tham chiếu để xô lệch từ đó" + + +msgid "From Left" +msgstr "Từ Bên Trái" + + +msgid "Shear the keys using the left key as reference" +msgstr "Xô lệch các khóa sử dụng khóa bên trái làm tham chiếu" + + +msgid "From Right" +msgstr "Từ Bên Phải" + + +msgid "Shear the keys using the right key as reference" +msgstr "Xô lệch các khóa sử dụng khóa bên phải làm tham chiếu" + + +msgid "Shear Factor" +msgstr "Hệ Số Xô Lệch" + + +msgid "The amount of shear to apply" +msgstr "Lượng xô lệch áp dụng" msgctxt "Operator" msgid "Smooth Keys" -msgstr "Mịn Hóa Bức Ảnh Mẫu" +msgstr "Làm Mịn Khung Khóa" msgid "Apply weighted moving means to make selected F-Curves less bumpy" -msgstr "Áp dụng quyền lượng trung bình di chuyền để giảm đô nhám của các Cong-F được chọn" +msgstr "Áp dụng trung bình di động tỷ trọng tuyến tính để giảm độ gồ ghề của các Đường Cong-F được chọn" msgid "Snap selected keyframes to the chosen times/values" -msgstr "Hút dính bức ảnh mẫu được chọn đến thời gian/giá trị được chọn" +msgstr "Bám dính các khung khóa được chọn vào các thời điểm/giá trị được chọn" msgid "Selection to Cursor Value" -msgstr "Sự Lựa Chọn đến Giá Trị Con Trỏ" +msgstr "Lựa Chọn tới Giá trị Con Trỏ" msgid "Set values of selected keyframes to the cursor value (Y/Horizontal component)" -msgstr "Đặt giá trị của các bức ảnh mẫu được chọn đến giá trị con trỏ (Y/Thành Phần Ngang)" +msgstr "Lấy các giá trị của con trỏ đặt cho giá trị của các khung khóa được chọn (Y/thành phần Nằm Ngang)" msgid "Flatten Handles" -msgstr "Bằng Phẳng Hóa Tay Cầm" +msgstr "Tay Cầm Dát Phẳng" msgid "Flatten handles for a smoother transition" -msgstr "Bằng phẳng hóa tay cầm cho tiến triển mịn hơn" +msgstr "Tay cầm dát phẳng để tạo sự chuyển cảnh mịn màng hơn" msgctxt "Operator" msgid "Snap Cursor Value to Selected" -msgstr "Hút Dính Giá Trị Con Trỏ Đến Được Chọn" +msgstr "Bám Dính Giá Trị Con Trỏ vào cái được Chọn" msgid "Place the cursor value on the average value of selected keyframes" -msgstr "Đặt giá trị con trỏ tại giá trị trung bình của các bức ảnh mẫu được chọn" +msgstr "Đặt giá trị của con trỏ vào thành giá trị trung bình của các khung khóa đã chọn" + + +msgctxt "Operator" +msgid "Sound to Samples" +msgstr "Âm Thanh thành Số Mẫu Vật" + + +msgid "Bakes a sound wave to samples on selected channels" +msgstr "Nướng một sóng âm thanh thành số mẫu vật trên các kênh đã chọn" msgid "Attack Time" -msgstr "Thời Gian Tăng" +msgstr "Thời Gian Công" + + +msgid "Value for the envelope calculation that tells how fast the envelope can rise (the lower the value the steeper it can rise)" +msgstr "Giá trị để tính toán tốc độ tăng lên của phong bao (giá trị càng thấp thì nó càng có thể nâng lên ở góc độ dốc hơn)" msgid "Highest Frequency" @@ -55289,7 +60542,7 @@ msgstr "Tần Số Cao Nhất" msgid "Cutoff frequency of a low-pass filter that is applied to the audio data" -msgstr "Tần số thôi của một bộ lọc thông thấp áp dụng cho dữ liệu âm thanh" +msgstr "Tần số cắt của một bộ lọc thông thấp áp dụng cho dữ liệu âm thanh" msgid "Lowest Frequency" @@ -55297,72 +60550,250 @@ msgstr "Tần Số Thấp Nhất" msgid "Cutoff frequency of a high-pass filter that is applied to the audio data" -msgstr "Tần số thôi của một bộ lọc thông cao áp dụng cho dữ liệu âm thanh" +msgstr "Tần số cắt của bộ lọc thông cao áp dụng cho dữ liệu âm thanh" msgid "Release Time" -msgstr "Thời Gian Suy Giảm" +msgstr "Thời Gian Thả" + + +msgid "Value for the envelope calculation that tells how fast the envelope can fall (the lower the value the steeper it can fall)" +msgstr "Giá trị tính toán phong bao cho biết tốc độ phong bao có thể rơi là bao nhiêu (giá trị càng thấp thì phong bao càng có thể rơi dốc cao hơn)" msgid "Square Threshold" -msgstr "Ngưỡng Vuông" +msgstr "Giới Hạn Hình Vuông" msgid "Square only: all values with an absolute amplitude lower than that result in 0" -msgstr "Chỉ vuông: hết giá trị có biên độ tuyệt đối thấp hơn là bằng 0" +msgstr "Duy Hình Vuông: toàn bộ các giá trị có một biên độ tuyệt đối, nếu thấp hơn cái đó thì sẽ cho kết quả bằng 0" + + +msgid "Minimum amplitude value needed to influence the envelope" +msgstr "Giá trị biên độ tối thiểu cần thiết để tác động đến phong bao" + + +msgid "Only the positive differences of the envelope amplitudes are summarized to produce the output" +msgstr "Duy những chênh lệch dương của biên độ phong bao là sẽ được tóm tắt để tạo ra đầu ra" + + +msgid "The amplitudes of the envelope are summarized (or, when Accumulate is enabled, both positive and negative differences are accumulated)" +msgstr "Biên độ của phong bao được tóm tắt lại (hoặc, khi bật Tích Lũy lên thì cả sự chênh lệch dương và âm sẽ đều được tích lũy cả)" msgid "The output is a square curve (negative values always result in -1, and positive ones in 1)" -msgstr "Ngõ ra là đường cong vuông (giá trị âm luôn luôn = -1 và giá trị dương luôn luôn = 1)" +msgstr "Đầu ra là một đường cong hình vuông (các giá trị âm luôn luôn cho kết quả là -1, và các giá trị dương luôn luôn kết quả là 1)" + + +msgctxt "Operator" +msgid "Time Offset Keyframes" +msgstr "Dịch Chuyển Thời Gian các Khung khóa" + + +msgid "Shifts the value of selected keys in time" +msgstr "Dịch giá trị của các khóa đã chọn theo thời gian" + + +msgid "How far in frames to offset the animation" +msgstr "Dịch chuyển hoạt họa bao nhiêu khung hình" msgid "Reset viewable area to show selected keyframe range" -msgstr "Đặt lại khu vực có thể thấy cho hiện phạm vi bức ảnh mẫu được chọn" +msgstr "Hoàn lại khu vực có thể nhìn thấy để hiển thị phạm vi khung khóa được chọn" msgid "Stroke Mode" -msgstr "Chế Đồ Nét" +msgstr "Chế Độ Nét Vẽ" msgid "Action taken when a paint stroke is made" -msgstr "Thực hành hành động nào khi sơn một nét" +msgstr "Hành động thi hành khi vẽ một nét sơn" msgid "Apply brush normally" -msgstr "Sơn bình thường" +msgstr "Áp dụng đầu bút như bình thường" msgid "Invert action of brush for duration of stroke" -msgstr "Đảo nghịch hành động cho giai đoạn của nét" +msgstr "Đảo nghịch hành động của bút cho khoảng thời lượng của nét vẽ" msgid "Switch brush to smooth mode for duration of stroke" -msgstr "Trao đổi sang chế độ mịn cho giai đoạn nét" +msgstr "Đổi bút sang chế độ mịn màng cho khoảng thời lượng của nét vẽ" msgid "Flat" -msgstr "Bằng Phẳng" +msgstr "Phẳng Bẹt" + + +msgctxt "Operator" +msgid "Delete Frame" +msgstr "Xóa Khung Hình" + + +msgid "Delete Grease Pencil Frame(s)" +msgstr "Xóa (các) Khung Hình Bút Chì Dầu" + + +msgid "Method used for deleting Grease Pencil frames" +msgstr "Phương pháp sử dụng để xóa khung hình Bút Chì Dầu" + + +msgid "Deletes current frame in the active layer" +msgstr "Xóa khung hình hiện tại trong tầng lớp đang hoạt động" + + +msgid "All Active Frames" +msgstr "Toàn Bộ các Khung Hình Đang Hoạt Động" + + +msgid "Delete active frames for all layers" +msgstr "Xóa các khung hình đang hoạt động cho tất cả các tầng lớp" + + +msgctxt "Operator" +msgid "Grease Pencil Draw Mode Toggle" +msgstr "Bật/Tắt Chế Độ Vẽ Bút Chì Dầu" + + +msgid "Enter/Exit draw mode for grease pencil" +msgstr "Bước Vào/Thoát Ra khỏi chế độ vẽ Bút Chì Dầu" msgid "Duplicate" -msgstr "Dao Chép" +msgstr "Nhân Đôi" + + +msgid "Insert a blank frame on the current scene frame" +msgstr "Chèn thêm một khung hình trống rỗng vào khung hình của cảnh hiện tại" + + +msgid "Insert a blank frame in all editable layers" +msgstr "Chèn thêm một khung hình trống rỗng vào tất cả các tầng lớp có thể chỉnh sửa được" + + +msgid "Add a new Grease Pencil layer in the active object" +msgstr "Thêm một tầng lớp Bút Chì Dầu mới vào đối tượng đang hoạt động" + + +msgid "Name of the new layer" +msgstr "Tên của tầng lớp mới" + + +msgctxt "Operator" +msgid "Add New Layer Group" +msgstr "Thêm Nhóm Tầng Lớp Mới" + + +msgid "Add a new Grease Pencil layer group in the active object" +msgstr "Cho thêm nhóm tầng lớp Bút Chì Dầu mới vào đối tượng đang hoạt động" + + +msgid "Name of the new layer group" +msgstr "Tên của nhóm tầng lớp mới" + + +msgid "Remove the active Grease Pencil layer" +msgstr "Loại bỏ tầng lớp Bút Chì Dầu đang hoạt động" + + +msgctxt "Operator" +msgid "Reorder Layer" +msgstr "Sắp Xếp Lại Tầng Lớp" + + +msgid "Reorder the active Grease Pencil layer" +msgstr "Sắp xếp lại trật tự của tầng lớp Bút Chì Dầu đang hoạt động" + + +msgid "Above" +msgstr "Trên" + + +msgid "Below" +msgstr "Dưới" + + +msgid "Target Name" +msgstr "Tên Mục tiêu" + + +msgid "Name of the target layer" +msgstr "Tên của tầng lớp mục tiêu" + + +msgid "(De)select all visible strokes" +msgstr "(Hủy)chọn toàn bộ các nét nhìn thấy được" + + +msgctxt "Operator" +msgid "Select Alternate" +msgstr "Chọn Xen Kẽ" + + +msgid "Select alternated points in strokes with already selected points" +msgstr "Chọn các điểm xen kẽ trong các nét vẽ với các điểm đã được chọn" + + +msgid "Deselect Ends" +msgstr "Hủy Chọn Cuối" + + +msgid "(De)select the first and last point of each stroke" +msgstr "(Hủy)chọn điểm đầu và điểm cuối của mỗi nét" + + +msgid "Select end points of strokes" +msgstr "Chọn các điểm cuối của nét vẽ" + + +msgid "Amount End" +msgstr "Lượng ở Cuối" + + +msgid "Number of points to select from the end" +msgstr "Số điểm lựa chọn từ cuối" + + +msgid "Amount Start" +msgstr "Lượng ở Đầu" + + +msgid "Number of points to select from the start" +msgstr "Số điểm lựa chọn từ đầu" + + +msgid "Selects random points from the current strokes selection" +msgstr "Chọn các điểm ngẫu nhiên từ lựa chọn nét hiện tại" msgctxt "Operator" msgid "Select Mode" -msgstr "Chế Độ Chọn" +msgstr "Chế Độ Lựa Chọn" + + +msgid "Change the selection mode for Grease Pencil strokes" +msgstr "Đổi chế độ lựa chọn cho các nét Bút Chì Dầu" msgid "Select only points" -msgstr "Chỉ chọn điểm" +msgstr "Duy chọn các điểm mà thôi" msgid "Select all stroke points" -msgstr "Chọn hết điểm nét" +msgstr "Chọn toàn bộ các điểm của nét vẽ" msgid "Select all stroke points between other strokes" -msgstr "Chọn hết điểm nét giữa các nét khác" +msgstr "Chọn toàn bộ các điểm của nét giữa các nét vẽ khác" + + +msgid "Simplify selected strokes" +msgstr "Đơn giản hóa các nét đã chọn" + + +msgid "Smooth Endpoints" +msgstr "Đầu Cuối Mịn Màng" msgctxt "Operator" @@ -55376,29 +60807,47 @@ msgstr "Thêm một khe kết xuất" msgctxt "Operator" msgid "Clear Render Region" -msgstr "Xóa Vùng Kết Xuất" +msgstr "Xóa Sạch Vùng Kết Xuất" msgid "Clear the boundaries of the render region and disable render region" -msgstr "Xóa các ranh giới của vùng kết xuất và tắt vùng kết xuất" +msgstr "Xóa sạch các ranh giới của vùng kết xuất và vô hiệu hóa (tắt) vùng kết xuất" msgctxt "Operator" msgid "Clear Render Slot" -msgstr "Xóa Khe Kết Xuất" +msgstr "Xóa Sạch Khe Kết Xuất" msgid "Clear the currently selected render slot" -msgstr "Xóa khe kết xuất được chọn" +msgstr "Xóa sạch khe kết xuất được chọn hiện tại" + + +msgctxt "Operator" +msgid "Copy Image" +msgstr "Sao Chép Hình Ảnh" + + +msgid "Copy the image to the clipboard" +msgstr "Sao chép hình ảnh vào bảng nhớ tạm" + + +msgctxt "Operator" +msgid "Paste Image" +msgstr "Dán Hình Ảnh" + + +msgid "Paste new image from the clipboard" +msgstr "Dán hình ảnh mới từ bảng nhớ tạm" msgctxt "Operator" msgid "Set Curves Point" -msgstr "Đặt Điểm Đường Cong" +msgstr "Đặt Điểm của các Đường Cong" msgid "Set black point or white point for curves" -msgstr "Đặt điểm đen hay trắng cho đường cong" +msgstr "Đặt điểm đen hay trắng cho các đường cong" msgid "Black Point" @@ -55410,147 +60859,147 @@ msgstr "Điểm Trắng" msgid "Sample Size" -msgstr "Số Lượng Mẫu Vật" +msgstr "Kích Thước Mẫu" msgctxt "Operator" msgid "Cycle Render Slot" -msgstr "Chuyển Vòng Khe Kết Xuất" +msgstr "Luân Chuyển Khe Kết Xuất" msgid "Cycle through all non-void render slots" -msgstr "Chuyển vòng hết khe kết xuất khác không" +msgstr "Luân chuyển qua toàn bộ các khe kết xuất không trống" msgid "Cycle in Reverse" -msgstr "Chuyển Vòng Ngược" +msgstr "Luân Chuyển Ngược Chiều" msgctxt "Operator" msgid "Image Edit Externally" -msgstr "Biên Tập Ảnh Ở Ngoài" +msgstr "Biên Soạn Hình Ảnh ở Bên Ngoài" msgid "Edit image in an external application" -msgstr "Biên tập ảnh bằng một ứng dụng ở ngoài" +msgstr "Biên soạn hình ảnh bằng một trình ứng dụng ở bên ngoài" msgctxt "Operator" msgid "Browse Image" -msgstr "Trình Duyệt Ảnh" +msgstr "Duyệt Thảo Hình Ảnh" msgid "Open an image file browser, hold Shift to open the file, Alt to browse containing directory" -msgstr "Mở một trình duyệt tập tin ảnh, Bấm giữ Shift để mở tập tin, Alt để trình duyệt mục lục" +msgstr "Mở trình duyệt tập tin hình ảnh, giữ phím Shift xuống để mở tập tin, bấm Alt để duyệt thư mục bao chùm" msgctxt "Operator" msgid "Flip Image" -msgstr "Lật Ảnh" +msgstr "Đảo Lật Hình Ảnh" msgid "Flip the image" -msgstr "Lật ảnh" +msgstr "Đảo Lật Hình Ảnh" msgid "Flip the image horizontally" -msgstr "Lật ảnh ngang" +msgstr "Đảo lật hình ảnh theo chiều ngang" msgid "Flip the image vertically" -msgstr "Lật ảnh dọc" +msgstr "Đảo lật hình ảnh theo chiều dọc" msgctxt "Operator" msgid "Invert Channels" -msgstr "Đảo Nghịch Các Kênh" +msgstr "Đảo Nghịch các Kênh" msgid "Invert image's channels" -msgstr "Đảo nghịch các kênh của ảnh" +msgstr "Đảo nghịch các kênh của hình ảnh" msgid "Invert alpha channel" -msgstr "Đảo ngược kênh độ đục" +msgstr "Đảo nghịch kênh alpha" msgid "Invert blue channel" -msgstr "Đảo ngược kênh xanh" +msgstr "Đảo nghịch kênh lam" msgid "Invert green channel" -msgstr "Đảo ngược kênh lục" +msgstr "Đảo nghịch kênh lục" msgid "Invert red channel" -msgstr "Đảo ngược kênh đỏ" +msgstr "Đảo nghịch kênh đỏ" msgctxt "Operator" msgid "Match Movie Length" -msgstr "Làm Dài Bằng Phim" +msgstr "Khớp với Độ Dài của Đoạn Phim" msgid "Set image's user's length to the one of this video" -msgstr "Đặt độ dài của ảnh người dùng bằng đồ dài của video này" +msgstr "Đặt độ dài hình ảnh của người dùng bằng độ dài của phim video này" msgctxt "Operator" msgid "New Image" -msgstr "Ảnh Mới" +msgstr "Hình Ảnh Mới" msgid "Create a new image" -msgstr "Chế tạo ảnh mới" +msgstr "Kiến Tạo một hình ảnh mới" msgid "Create an image with an alpha channel" -msgstr "Chế tạo ảnh có kênh độ đục" +msgstr "Kiến Tạo một hình ảnh có kênh alpha" msgid "32-bit Float" -msgstr "32-Bit Số Thật" +msgstr "32-Bit Số Thực" msgid "Create image with 32-bit floating-point bit depth" -msgstr "Chế tạo ảnh độ sâu 32 bit số thật dấu phẩy động" +msgstr "Kiến Tạo hình ảnh với độ sâu 32 bit số thực" msgid "Fill the image with a grid for UV map testing" -msgstr "Vẽ một đồ thị trong ảnh cho thử xem bản đồ UV" +msgstr "Vẽ một khung lưới đồ thị trong hình ảnh để thử nghiệm ánh xạ UV" msgid "Image height" -msgstr "Bề cao ảnh" +msgstr "Chiều cao của hình ảnh" msgid "Image data-block name" -msgstr "Tên cục dữ liệu ảnh" +msgstr "Tên của khối dữ liệu hình ảnh" msgid "Create a tiled image" -msgstr "Chế tạo một ảnh ô" +msgstr "Kiến tạo một hình ảnh phân ô cờ" msgid "Create an image with left and right views" -msgstr "Chế tạo một ảnh có màn nhìn trái và phải" +msgstr "Kiến Tạo một hình ảnh có các góc nhìn bên trái và phải" msgid "Image width" -msgstr "Bề rộng ảnh" +msgstr "Chiều rộng của hình ảnh" msgctxt "Operator" msgid "Open Image" -msgstr "Mở Ảnh" +msgstr "Mở Hình Ảnh" msgid "Open image" -msgstr "Mở Ảnh" +msgstr "Mở hình ảnh" msgid "Allow the path to contain substitution tokens" -msgstr "Cho đường dẫn chứa đồ xèng thay thế " +msgstr "Cho phép đường dẫn chứa các mã thông báo thay thế" msgid "Detect Sequences" @@ -55558,65 +61007,65 @@ msgstr "Phát Hiện Trình Tự" msgid "Automatically detect animated sequences in selected images (based on file names)" -msgstr "Tự động phát hiện trình tự hoạt hình trong các ảnh được chọn (tùy tên ảnh)" +msgstr "Tự động phát hiện các trình tự hoạt họa trong những hình ảnh đã chọn (dựa vào các tên của tập tin)" msgid "Detect UDIMs" -msgstr "Phát Hiện UDIM" +msgstr "Phát Hiện các UDIM" msgid "Detect selected UDIM files and load all matching tiles" -msgstr "Phát hiện các tập tin UDIM và nhập tất cả tập tin giống hệt" +msgstr "Phát hiện các tập tin UDIM lựa chọn và nạp toàn bộ các ô xứng khớp" msgctxt "Operator" msgid "Pack Image" -msgstr "Gói Ảnh" +msgstr "Đóng Gói Hình Ảnh" msgid "Pack an image as embedded data into the .blend file" -msgstr "Gói một ảnh làm dữ liệu nhét vào tập tin .blend" +msgstr "Đóng gói một hình ảnh thành dữ liệu nhúng sẵn vào trong tập tin .blend" msgctxt "Operator" msgid "Project Apply" -msgstr "Áp Dụng Phép Chiếu" +msgstr "Áp Dụng Phóng Chiếu" msgid "Project edited image back onto the object" -msgstr "Chiếu lại ảnh được chỉnh sửa trên vật thể" +msgstr "Phóng chiếu hình ảnh đã biên soạn trở lại lên trên mình đối tượng" msgctxt "Operator" msgid "Project Edit" -msgstr "Biên Tập Phép Chiếu" +msgstr "Biên Soạn Ảnh Chụp Cổng Nhìn" msgid "Edit a snapshot of the 3D Viewport in an external image editor" -msgstr "Biên tập một ảnh chụp của màn chiếu trong một phần mềm biên tập ảnh phía ngoài" +msgstr "Biên soạn ảnh chụp nhanh Cổng Nhìn 3D trong một trình biên soạn hình ảnh ở bên ngoài" msgctxt "Operator" msgid "Open Cached Render" -msgstr "Mở Kết Xuất Đệm Chứa" +msgstr "Mở Kết Xuất Lưu Trong Đệm" msgid "Read all the current scene's view layers from cache, as needed" -msgstr "Nhập lại từ đệm chứa hết lớp màn chiếu của cảnh hiện tại, tùy cần" +msgstr "Đọc toàn bộ các tầng góc nhìn của cảnh hiện tại từ bộ đệm nhớ, khi cần thiết" msgctxt "Operator" msgid "Reload Image" -msgstr "Nhập Lại Ảnh" +msgstr "Nạp Lại Hình Ảnh" msgid "Reload current image from disk" -msgstr "Nhập lại ảnh hiện tại từ dĩa" +msgstr "Nạp lại hình ảnh hiện tại từ đĩa" msgctxt "Operator" msgid "Remove Render Slot" -msgstr "Xóa Màn Kết Xuất" +msgstr "Xóa Khe Kết Xuất" msgid "Remove the current render slot" @@ -55625,51 +61074,51 @@ msgstr "Xóa khe kết xuất hiện tại" msgctxt "Operator" msgid "Render Region" -msgstr "Vùng Kết Xuất" +msgstr "Kết Xuất Vùng" msgid "Set the boundaries of the render region and enable render region" -msgstr "Đặt ranh giới của vùng kết xuất và bật vùng kết xuất" +msgstr "Đặt ranh giới của vùng kết xuất và kích hoạt (bật) vùng kết xuất" msgctxt "Operator" msgid "Replace Image" -msgstr "Thay Ảnh" +msgstr "Thay Thế Hình Ảnh" msgid "Replace current image by another one from disk" -msgstr "Thay ảnh hiện tại bằng ảnh khác từ đĩa" +msgstr "Thay thế hình ảnh hiện tại bằng một cái khác từ đĩa" msgctxt "Operator" msgid "Resize Image" -msgstr "Chỉnh Khổ Ảnh" +msgstr "Đổi Kích Thước Hình Ảnh" msgid "Resize the image" -msgstr "Chỉnh khổ ảnh" +msgstr "Đổi kích thước của hình ảnh" msgctxt "Operator" msgid "Sample Color" -msgstr "Lấy Mẫu Vật Màu" +msgstr "Lấy Mẫu Vật về Màu Sắc" msgid "Use mouse to sample a color in current image" -msgstr "Dùng con trỏ để lấy mẫu vật màu từ ảnh hiện tại" +msgstr "Dùng con trỏ để lấy mẫu vật một màu sắc trong hình ảnh hiện tại" msgctxt "Operator" msgid "Sample Line" -msgstr "Lấy Mẫu Vật Đường" +msgstr "Lấy Mẫu Vật về Đường Vẽ" msgid "Sample a line and show it in Scope panels" -msgstr "Lấy mẫu vật của một đường và hiện nó vào các bảng Kế" +msgstr "Lấy mẫu một đường vẽ và hiển thị nó trong các bảng Kế Đo Lường" msgid "Mouse cursor style to use during the modal operator" -msgstr "Phong cách con trỏ chuột để dùng khi làm thao tác cách thức" +msgstr "Phong cách con trỏ chuột để sử dụng trong giai đoạn của operator mô thái" msgid "X End" @@ -55690,42 +61139,56 @@ msgstr "Đầu Y" msgctxt "Operator" msgid "Save Image" -msgstr "Lưu Ảnh" +msgstr "Lưu Hình Ảnh" msgid "Save the image with current name and settings" -msgstr "Lưu ảnh với tên và cài đặt hiện tại" +msgstr "Lưu hình ảnh với tên và các sắp đặt hiện tại" msgctxt "Operator" msgid "Save All Modified" -msgstr "Lưu Hết Được Sửa Đổi" +msgstr "Lưu Toàn Bộ những cái đã Thay Đổi" msgid "Save all modified images" -msgstr "Lưu hết ảnh được sửa đổi" +msgstr "Lưu toàn bộ các hình ảnh đã thay đổi" msgctxt "Operator" msgid "Save As Image" -msgstr "Lưu Dạng Ảnh" +msgstr "Lưu thành Hình Ảnh" msgid "Save the image with another name and/or settings" -msgstr "Lưu ảnh dùng tên va/hay cài đặt khác" +msgstr "Lưu hình ảnh với một cái tên khác và/hoặc các sắp đặt khác" + + +msgid "Create a new image file without modifying the current image in Blender" +msgstr "Kiến tạo một tập tin hình ảnh mới mà không sửa đổi hình ảnh hiện tại trong Blender" msgid "Save As Render" msgstr "Lưu Như Kết Xuất" +msgid "" +"Save image with render color management.\n" +"For display image formats like PNG, apply view and display transform.\n" +"For intermediate image formats like OpenEXR, use the default render output color space" +msgstr "" +"Lưu hình ảnh với quản lý màu kết xuất.\n" +"Đối với các định dạng hình ảnh hiển thị như PNG, xin hãy áp dụng biến hóa góc nhìn và hiển thị.\n" +"Đối với các định dạng hình ảnh trung gian như OpenEXR, xin hãy sử dụng không gian màu đầu ra kết xuất mặc định" + + msgctxt "Operator" msgid "Save Sequence" -msgstr "Lưu Trình Tự Ảnh" +msgstr "Lưu Trình Tự" msgid "Save a sequence of images" -msgstr "Lưu một trình tự ảnh" +msgstr "Lưu một trình tự các hình ảnh" msgctxt "Operator" @@ -55734,269 +61197,284 @@ msgstr "Thêm Ô" msgid "Adds a tile to the image" -msgstr "Thêm một ô cho ảnh" +msgstr "Thêm một ô vào hình ảnh" msgid "How many tiles to add" -msgstr "Thêm bao nhiêu ô" +msgstr "Số ô để thêm" msgid "Fill new tile with a generated image" -msgstr "Tô đầy ô mới với một ảnh được chế tạo" +msgstr "Phủ kín ô mới bằng một hình ảnh sinh tạo" msgid "Optional tile label" -msgstr "Nhãn ô tùy chọn" +msgstr "Điền nhãn ô bổ sung nếu cần" msgid "UDIM number of the tile" -msgstr "Số UDIM của ô" +msgstr "Số ô UDIM" msgctxt "Operator" msgid "Fill Tile" -msgstr "Tô Đầy Ô" +msgstr "Phủ Nền Ô" msgid "Fill the current tile with a generated image" -msgstr "Tô đầy ô hiện tái với một ảnh được chế tạo" +msgstr "Phủ kín ô hiện tại với một hình ảnh sinh tạo" msgctxt "Operator" msgid "Remove Tile" -msgstr "Xoá Ô" +msgstr "Xóa Ô" msgid "Removes a tile from the image" -msgstr "Xóa một ô từ ảnh" +msgstr "Xóa một ô cờ khỏi hình ảnh" msgctxt "Operator" msgid "Unpack Image" -msgstr "Gỡ Gói Ảnh" +msgstr "Mở Gói Hình Ảnh" msgid "Save an image packed in the .blend file to disk" -msgstr "Lưu một ảnh được gói lại trong tập tin .blend và lưư trong đĩa" +msgstr "Lưu hình ảnh được đóng gói trong tập tin .blend ra đĩa (tách ra đĩa)" msgid "Image Name" -msgstr "Tên Ảnh" +msgstr "Tên Hình Ảnh" msgid "Image data-block name to unpack" -msgstr "Tên của cục dữ liệu ảnh để gỡ gói" +msgstr "Tên của khối dữ liệu hình ảnh để mở gói" msgid "Use Local File" -msgstr "Dùng Tập Tin Địa Phương" +msgstr "Sử Dụng Tập Tin Cục Bộ" msgid "Write Local File (overwrite existing)" -msgstr "Lưư Tập Tin Địa Phương (luư trên tập tin tồn tại)" +msgstr "Ghi tập tin địa phương (viết đè lên những tập tin tồn tại)" msgid "Use Original File" -msgstr "Dùng Tập Tin Ban Đầu" +msgstr "Dùng Tập Tin Gốc" msgid "Write Original File (overwrite existing)" -msgstr "Lưư Tập Tin Ban Đầu (luư trên tập tin tồn tại)" +msgstr "Ghi Tập Tin Gốc (viết đè lên tập tin hiện có)" msgid "View the entire image" -msgstr "Hiển thị toàn ảnh" +msgstr "Hiển thị toàn bộ hình ảnh" msgctxt "Operator" msgid "Cursor To Center View" -msgstr "Con Trỏ đến Trung Tâm Màn " +msgstr "Con Trỏ về Trung Tâm của Góc Nhìn" msgid "Set 2D Cursor To Center View location" -msgstr "Đặt Con Trỏ 2D Đến vị trí của Trung Tâm Màn" +msgstr "Đặt Con Trỏ 2D về vị trí Trung Tâm của Góc Nhìn" msgctxt "Operator" msgid "View Center" -msgstr "Hiển Thị Trung Tâm" +msgstr "Trung Tâm Hóa Góc Nhìn" msgid "View all selected UVs" -msgstr "Hiển thị hết UV được chọn" +msgstr "Hiển thị toàn bộ các UV đã chọn" msgctxt "Operator" msgid "Zoom View" -msgstr "Phóng Màn" +msgstr "Thu Phóng Khung Nhìn" msgid "Zoom in/out the image" -msgstr "Phóng to/rút nhỏ ảnh" +msgstr "Thu nhỏ/phóng to hình ảnh" msgctxt "Operator" msgid "Zoom to Border" -msgstr "Phóng Đến Ranh Giới" +msgstr "Phóng vào Đường Ranh Giới" msgid "Zoom in the view to the nearest item contained in the border" -msgstr "Phóng vào màn chiếu đến mặt hàng vừa ranh giới" +msgstr "Phóng to khung nhìn vào phần tử gần nhất nằm trong ranh giới" msgid "Zoom Out" -msgstr "Rút Nhỏ" +msgstr "Thu Nhỏ" msgid "Zoom in the image (centered around 2D cursor)" -msgstr "Xem ảnh phóng to (trung tâm quanh con trỏ 2D)" +msgstr "Phóng to hình ảnh (trung tâm là con trỏ 2D)" msgid "Zoom out the image (centered around 2D cursor)" -msgstr "Xem ảnh rút nhỏ (trung tâm quanh con trỏ 2D)" +msgstr "Thu nhỏ hình ảnh (trung tâm là con trỏ 2D)" msgid "Set zoom ratio of the view" -msgstr "Đặt tỉ số xem phóng tocủa màn" +msgstr "Đặt tỷ lệ thu-phóng của khung nhìn" msgctxt "Operator" msgid "Import BVH" -msgstr "Nhập BVH" +msgstr "Nhập Khẩu BVH" msgid "Load a BVH motion capture file" -msgstr "Nhập một tập tin BVH chục chuyển động" +msgstr "Nạp một tập tin nắm bắt chuyển động BVH (Bounding Volume Hierarchy : Cây Phân Cấp Giới Hạn Thể Tích)" msgid "Filepath used for importing the file" -msgstr "Đường dẫn dùng cho nhập tập tin" +msgstr "Đường dẫn tập tin sử dụng để nhập nội" msgid "Starting frame for the animation" -msgstr "Bức ảnh bắt đầu cho hoạt hình" +msgstr "Khung hình khởi đầu của hoạt họa" msgid "Convert rotations to quaternions" -msgstr "Biến đổi xoay sang quaternion" +msgstr "Chuyển đổi mọi sự xoay chiều sang hệ thống Quatenion" msgid "Import target type" -msgstr "Loại mục tiêu để nhập" +msgstr "Thể loại mục tiêu để Nhập Khẩu" msgid "Update Scene Duration" -msgstr "Nâng Cấp Giai Đoạn Cảnh" +msgstr "Cập Nhật Thời Lượng của Cảnh" msgid "Extend the scene's duration to the BVH duration (never shortens the scene)" -msgstr "Kéo dài giai đoạn cảnh cho bằng giai đoạn BVH (không bao giờ cắt ngắn cảnh)" +msgstr "Nới dài thời lượng của cảnh cho bằng thời lượng của bản BVH (không bao giờ thu ngắn cảnh lại)" msgid "Update Scene FPS" -msgstr "Nâng Cấp Tốc Độ Bức Ảnh Cảnh" +msgstr "Cập Nhật Tần Số Khung Hình của Cảnh" msgid "Set the scene framerate to that of the BVH file (note that this nullifies the 'Scale FPS' option, as the scale will be 1:1)" -msgstr "Đặt tốc độ bức ảnh của cảnh bằng tốc độ của tập tin BVH (lưu ý cái này sẽ xóa tùy chọn 'Phóng To Tốc Độ Bức Ảnh' vì phóng to sẽ trở thành 1:1)" +msgstr "Đặt tần số khung hình của cảnh bằng tốc độ của tập tin BVH (lưu ý: điều này sẽ vô hiệu hóa tùy chọn về 'Tỷ Lệ Tần Số Khung Hình', vì tỷ lệ sẽ trở thành 1:1)" msgid "Loop the animation playback" -msgstr "Lặp lại khi hát hoạt hình" +msgstr "Tuần hoàn quá trình chơi lại hoạt họa" msgid "Scale FPS" -msgstr "Phóng To Hóa Tốc Độ Bức Ảnh/Giây" +msgstr "Đổi Tỷ Lệ Tần Số Khung Hình" msgid "Scale the framerate from the BVH to the current scenes, otherwise each BVH frame maps directly to a Blender frame" -msgstr "Phón hóa tốc độ bức ảnh từ BVH đến cảnh hiện tại, nếu không mỗi bức ảnh BVH được ánh xạ đến một bức ảnh Blender" +msgstr "Đổi tỷ lệ tần số khung hình từ BVH sang các cảnh hiện tại, nếu không, mỗi khung hình BVH sẽ được ánh xạ trực tiếp sang một khung hình Blender" msgctxt "Operator" msgid "Import SVG" -msgstr "Nhập SVG" +msgstr "Nhập Khẩu SVG" msgid "Load a SVG file" -msgstr "Nhập một tập tin SVG" +msgstr "Nạp một tập tin SVG" msgctxt "Operator" msgid "Import Images as Planes" -msgstr "Nhập Ảnh Kiểu Mặt Phẳng" +msgstr "Nhập Khẩu Hình Ảnh như Bình Diện" msgid "Create mesh plane(s) from image files with the appropriate aspect ratio" -msgstr "Chế tạo (các) mặt phẳng từ tập tin ảnh với tỉ số cạnh đúng" +msgstr "Kiến Tạo (các) bình diện khung lưới từ các tập tin hình ảnh với tỷ lệ kích thước phù hợp" msgid "How to align the planes" -msgstr "Làm sao sắp xếp mặt phẳng" +msgstr "Phương pháp căn chỉnh các bình diện" msgid "Facing Positive X" -msgstr "Chỉ Hướng X Dương" +msgstr "Đối Mặt X Dương" msgid "Facing Positive Y" -msgstr "Chỉ Hướng Y Dương" +msgstr "Đối Mặt Y Dương" msgid "Z+ (Up)" -msgstr "Z+ (Phía Trên)" +msgstr "Z+ (Lên)" msgid "Facing Positive Z" -msgstr "Chỉ Hướng Z Dương" +msgstr "Đối Mặt Z Dương" msgid "Facing Negative X" -msgstr "Chỉ Hướng X Âm" +msgstr "Đối Mặt X Âm" msgid "Facing Negative Y" -msgstr "Chỉ Hướng Y Âm" +msgstr "Đối Mặt Y Âm" msgid "Z- (Down)" -msgstr "Z- (Phía Dưới)" +msgstr "Z- (Xuống)" msgid "Facing Negative Z" -msgstr "Chỉ Hướng Z Âm" +msgstr "Đối Mặt Z Âm" msgid "Face Camera" -msgstr "Chỉ Hướng Máy Quay Phim" +msgstr "Đối Mặt với Máy Quay Phim" msgid "Facing Camera" -msgstr "Chỉ Hướng Máy Quay Phim" +msgstr "Đối Mặt với Máy Quay Phim" msgid "Facing the Camera's dominant axis" -msgstr "Chỉ hướng đến trục chánh của Máy Quay Phim" +msgstr "Đối mặt trục nổi trội của Máy Quay Phim" msgid "Track Camera" -msgstr "Theo Dõi Máy Quay Phim" +msgstr "Giám Sát Máy Quay Phim" msgid "Always face the camera" -msgstr "Lần nào cũng chỉ hướng đến máy quay phim" +msgstr "Luôn luôn đối mặt máy quay phim" + + +msgctxt "Material" +msgid "Blend" +msgstr "Pha Trộn" + + +msgctxt "Material" +msgid "Clip" +msgstr "Cắt Xén" + + +msgctxt "Material" +msgid "Hashed" +msgstr "Băm" msgid "Setup Corner Pin" -msgstr "Đặt Đinh Góc" +msgstr "Sắp Đặt Ghim Đính Góc" msgid "Build Compositor Nodes to reference this image without re-rendering" -msgstr "Xây dựng Giao Điểm Ghép Ảnh cho tham chiếu đến ảnh này mà không kết xuất lại" +msgstr "Xây dựng các Nút Tổng Hợp để tham chiếu hình ảnh này mà không phải tái kết xuất" msgid "Brightness of Emission Texture" -msgstr "Độ Sáng của Chất Liệu Phát Xạ" +msgstr "Cường Độ của Chất Liệu Phát Sáng" msgid "Definition" @@ -56004,87 +61482,87 @@ msgstr "Độ Phân Giải" msgid "Number of pixels per inch or Blender Unit" -msgstr "Số lượng điềm ảnh mỗi inch (= 2,54 cm) hay Đơn Vị Blender" +msgstr "Số điểm ảnh mỗi in-sơ (inch) hoặc mỗi Đơn Vị Blender" msgid "How large in the camera frame is the plane" -msgstr "Kích thước mặt phẳng trong màn máy quay phim" +msgstr "Kích thước của bình diện nằm trong khung hình máy quay phim" msgid "Fill camera frame, spilling outside the frame" -msgstr "Làm đầy màn của máy quay phim, tràn ra ngoài màn" +msgstr "Phủ kín khung hình máy quay phim, cho tràn ra bên ngoài khung hình" msgid "Fit entire image within the camera frame" -msgstr "Toàn bộ ảnh vừa màn của máy quay phim" +msgstr "Khít hình ảnh nội trong khung máy quay phim" msgid "Force Reload" -msgstr "Bắt Nhập Lại" +msgstr "Bắt Buộc Tái Nạp" msgid "Force reloading of the image if already opened elsewhere in Blender" -msgstr "Bắt nhập lại ảnh nếu ảnh được mở rồi chỗ nào khác trong Blender" +msgstr "Bắt buộc tái nạp hình ảnh, tuy rằng đã mở nó ở chỗ khác trong Blender rồi" msgid "Height of the created plane" -msgstr "Bề cao của mặt phẳng được chế tạo" +msgstr "Chiều cao của bình diện đã kiến tạo" msgid "Animate Image Sequences" -msgstr "Trình Tự Ảnh Hoạt Hình" +msgstr "Trình Tự Hình Ảnh Hoạt Họa" msgid "Import sequentially numbered images as an animated image sequence instead of separate planes" -msgstr "Nhập ảnh có số thứ tự thành một trình tự ảnh hoạt hình thay thế nhiều mặt phẳng riêng" +msgstr "Nhập Khẩu các hình ảnh sắp số theo thứ tự như một trình tự hình ảnh hoạt họa thay vì các bình diện riêng biệt" msgid "Offset Planes" -msgstr "Dịch Mặt Phẳng" +msgstr "Dịch Chuyển Bình Diện" msgid "Offset Planes From Each Other" -msgstr "Dịch Các Mặt Phẳng Cách Nhau" +msgstr "Dịch Chuyển các Bình Diện Cách Rời Nhau" msgid "Space between planes" -msgstr "Khoảng cách giữa mặt phẳng" +msgstr "Phân khoảng giữa các bình diện" msgid "How planes are oriented relative to each others' local axis" -msgstr "Làm sao các mặt phẳng được định hướng tương đối với trục địa phương của nhau" +msgstr "Phương pháp định hướng các bình diện tương đối với trục địa phương của nhau" msgid "Side by Side to the Left" -msgstr "Kề Nhau Đi Phía Trái" +msgstr "Cạnh Kề Cạnh về Bên Trái" msgid "Side by Side, Downward" -msgstr "Kề Nhau Đi Phía Dưới" +msgstr "Cạnh Kề Cạnh, Xuống Dưới" msgid "Stacked Above" -msgstr "Xếp Trên" +msgstr "Chồng Chất Ở Trên" msgid "Side by Side to the Right" -msgstr "Kề Nhau Đi Phía Phải" +msgstr "Cạnh Kề Cạnh về Bên Phải" msgid "Side by Side, Upward" -msgstr "Kề Nhau Đi Phía Trên" +msgstr "Cạnh Kề Cạnh, Lên Trên" msgid "Stacked Below" -msgstr "ếp Dưới\"" +msgstr "Chồng Chất Ở Dưới" msgid "Overwrite Material" -msgstr "Vượt Quyền Vật Liệu" +msgstr "Viết Đè Nguyên Vật Liệu Lên Cái Cũ" msgid "Overwrite existing Material (based on material name)" -msgstr "Vượt quyền cho Vật Liệu đang tồn tại (tùy tên vật liệu)" +msgstr "Viết đè lên Nguyên Vật Liệu hiện tại (dựa vào tên của nguyên vật liệu)" msgid "Relative Paths" @@ -56092,213 +61570,239 @@ msgstr "Đường Dẫn Tương Đối" msgid "Use relative file paths" -msgstr "Sử dụng đường dẫn tập tin tương đối" +msgstr "Sử dụng các đường dẫn tập tin tương đối" msgid "Node shader to use" -msgstr "Sử dụng bộ tô sắc giao điểm nào" +msgstr "Nút tô bóng sử dụng" msgid "Principled" -msgstr "Tổng Quát" +msgstr "Nguyên Tắc" msgid "Principled Shader" -msgstr "Bộ Tô Sắc Tổng Quát" +msgstr "Bộ Tô Bóng Nguyên Tắc" msgid "Shadeless" -msgstr "Bất Bộ Tô Sắc" +msgstr "Không Tô Bóng" msgid "Only visible to camera and reflections" -msgstr "Chỉ máy quay phim và phản xạ được nhìn thấy" +msgstr "Duy nhìn thấy được qua máy quay phim và ánh phản quang" msgid "Emission Shader" -msgstr "Bộ Tô Sắc Phát Xạ" +msgstr "Bộ Tô Bóng Phát Xạ" + + +msgctxt "Material" +msgid "Shadow Mode" +msgstr "Chế Độ Bóng Tối" + + +msgctxt "Material" +msgid "None" +msgstr "Không Có" msgid "Size Mode" -msgstr "Chế Độ Kích Cỡ" +msgstr "Chế Độ Kích Thước" msgid "How the size of the plane is computed" -msgstr "Làm sao tính kích cở của mặt phẳng" +msgstr "Phương pháp tính toán kích thước của bình diện" msgid "Use absolute size" -msgstr "Sử dụng kích cỡ tuyệt đối" +msgstr "Dùng kích thước tuyệt đối" msgid "Camera Relative" -msgstr "Tương Đối Máy Quay Phim" +msgstr "Tương Đối với Máy Quay Phim" msgid "Scale to the camera frame" -msgstr "Phóng to đầy màn máy quay phim" +msgstr "Tỷ lệ hóa theo khung hình máy quay phim" msgid "Dpi" -msgstr "Dộ Phân Giải" +msgstr "Số Điểm Mỗi In-Sơ (DPI)" msgid "Use definition of the image as dots per inch" -msgstr "Độ phân giải của ảnh (đơn vị điểm/inch)" +msgstr "Dùng số điểm ảnh mỗi in-sơ (inch) (DPI = Dots Per Inch) làm định nghĩa cho hình ảnh" msgid "Dots/BU" -msgstr "Điểm/Đơn Vị Blender " +msgstr "Số Điểm/Đơn Vị Blender" msgid "Use definition of the image as dots per Blender Unit" -msgstr "Sử dụng độ phân giải của ảnh là diểm/Đơn Vị Blender" +msgstr "Dùng số điểm ảnh (Dots) mỗi Đơn Vị Blender (BU) làm định nghĩa cho hình ảnh" msgid "Use alpha channel for transparency" -msgstr "Sử dụng kênh độ đục cho trong suốt" +msgstr "Dùng kênh alpha cho độ trong suốt" msgctxt "Operator" msgid "Import STL" -msgstr "Nhập STL" +msgstr "Nhập Khẩu STL" msgid "Load STL triangle mesh data" -msgstr "Nhập dữ liệu lưới tam giác STL" +msgstr "Nạp dữ liệu khung lưới tam giác STL" msgid "Facet Normals" -msgstr "Pháp Tuyến Mặt" +msgstr "Pháp Tuyến Bề Mặt" msgid "Use (import) facet normals (note that this will still give flat shading)" -msgstr "Sử dụng (nhập) pháp tuyến mặt (lưu ý này vẫn sẽ tô sắc đều)" +msgstr "Sử dụng (nhập khẩu) các pháp tuyến bề mặt (nên lưu ý rằng điều này vẫn làm cho tô bóng phẳng bẹt)" msgid "Apply current scene's unit (as defined by unit scale) to imported data" -msgstr "Áp dụng đơn vị của cảnh hiện tại (tùy giai điệu đơn vị được chỉ định) với dữ liệu nhập" +msgstr "Áp dụng đơn vị của cảnh hiện tại (như được định nghĩa trong đơn vị đo lường) vào dữ liệu nhập khẩu" msgctxt "Operator" msgid "Import FBX" -msgstr "Nhập FBX" +msgstr "Nhập Khẩu FBX" msgid "Load a FBX file" -msgstr "Nhập một tập tin FBX" +msgstr "Nạp một tập tin FBX" msgid "Animation Offset" -msgstr "Dịch Hoạt Hình" +msgstr "Dịch Chuyển của Hoạt Họa" msgid "Offset to apply to animation during import, in frames" -msgstr "Dịch cho áp dụng với hoạt hình khi nhập (bức ảnh)" +msgstr "Dịch chuyển cần áp dụng vào hoạt họa trong khi nhập khẩu, trong số khung hình" msgid "Automatic Bone Orientation" -msgstr "Tự Định Định Hướng Xương" +msgstr "Tự Động Định Hướng Xương" msgid "Try to align the major bone axis with the bone children" -msgstr "Thử sắp hàng trục chánh của xương với các xương con cái" +msgstr "Thử căn chỉnh trục chủ yếu của xương với các xương con cái" + + +msgid "Import vertex color attributes" +msgstr "Nhập Khẩu thuộc tính màu của điểm đỉnh" + + +msgid "Do not import color attributes" +msgstr "Không nhập khẩu thuộc tính màu" + + +msgid "Expect file colors in sRGB color space" +msgstr "Kỳ vọng màu tập tin trong không gian màu sRGB" + + +msgid "Expect file colors in linear color space" +msgstr "Kỳ vọng màu tập tin trong không gian màu tiếp tuyến" msgid "Decal Offset" -msgstr "Dịch Can" +msgstr "Dịch Chuyển của Đề-Can" msgid "Displace geometry of alpha meshes" -msgstr "Dịch hình của lưới độ đục" +msgstr "Hình học dịch chuyển của các khung lưới alpha" msgid "Force Connect Children" -msgstr "Bắt Buộc Kết Nối Con Cái" +msgstr "Ép Buộc Kết Nối với Con Cái" msgid "Force connection of children bones to their parent, even if their computed head/tail positions do not match (can be useful with pure-joints-type armatures)" -msgstr "Bắt buộc kết nối xương con cái với phụ huynh, cùng khi vị trí đầu/đuôi được tính không giống nhau (có lợi ích cho cốt loại-khớp-nguyên chất)" +msgstr "Ép buộc sự kết nối của các xương con cái với phụ huynh, ngay cả khi vị trí đầu/đuôi đã tính không xứng khớp nối (có thể có ích cho các khung cốt nguyên thể loại khớp nối)" msgid "Ignore Leaf Bones" -msgstr "Không Quan Tâm Xương Lá" +msgstr "Bỏ Qua Xương Ngọn" msgid "Ignore the last bone at the end of each chain (used to mark the length of the previous bone)" -msgstr "Không quan tâm xương cuối của mỗi chuỗi (dùng cho ký dấu bề dài của xương trước)" +msgstr "Không quan tâm đến xương cuối cùng của mỗi dây chuyền (dùng để đánh dấu chiều dài của xương trước)" msgid "Import options categories" -msgstr "Nhập loại tùy chọn" +msgstr "Thể Loại Tùy Chọn về Nhập Liệu" msgid "Main" -msgstr "Chánh" +msgstr "Chính" msgid "Main basic settings" -msgstr "Cài đặt mặc định cơ bản" +msgstr "Sắp đặt cơ bản chính" msgid "Armature-related settings" -msgstr "Cài đật thuộc về cốt" +msgstr "Những sắp đặt về khung cốt" msgid "Alpha Decals" -msgstr "Can Độ Đục" +msgstr "Alpha như Đề-Can" msgid "Treat materials with alpha as decals (no shadow casting)" -msgstr "Cử Sử vật liệu có độ đục như can (không phát bóng tối)" +msgstr "Đối xử với các nguyên vật liệu có alpha như các đề-can (không ngả bóng tối)" msgid "Import Animation" -msgstr "Nhập Hoạt Hình" +msgstr "Nhập Khẩu Hoạt Họa" msgid "Import FBX animation" -msgstr "Nhập hoạt hình FBX" +msgstr "Nhập Khẩu hoạt họa của FBX" msgid "Import custom normals, if available (otherwise Blender will recompute them)" -msgstr "Nhập pháp tuyến tùy chọn, nếu có (nếu không Blênder sẽ tính nó lại)" +msgstr "Nhập Khẩu các pháp tuyến tùy biến, nếu có (nếu không, Blender sẽ tính toán chúng lại)" msgid "Import user properties as custom properties" -msgstr "Nhập đặc tính người dùng như đặc tính tùy chọn" +msgstr "Nhập Khẩu các tính chất người dùng thành những tính chất tùy biến" msgid "Import Enums As Strings" -msgstr "Nhập Liệt Kê Xâu" +msgstr "Nhập Khẩu Enum như các Chuỗi Ký Tự" msgid "Store enumeration values as strings" -msgstr "Chứa giá trị liệt kê trong xâu" +msgstr "Lưu các giá trị liệt kê (enumeration) tựa như các chuỗi ký tự" msgid "Image Search" -msgstr "Tìm Kiếm Ảnh" +msgstr "Tìm Kiếm Hình Ảnh" msgid "Search subdirs for any associated images (WARNING: may be slow)" -msgstr "Tìm ảnh liên quan trong các thư mục phụ (CẢNH BÁO: có thể rất chậm)" +msgstr "Lùng các thư mục nhánh để tìm những hình ảnh liên quan (CẢNH BÁO: có thể chậm chạp)" msgid "Manual Orientation" -msgstr "Định Hướng Tùy Chọn" +msgstr "Định Hướng Thủ Công" msgid "Specify orientation and scale, instead of using embedded data in FBX file" -msgstr "Chỉ định định hướng và phóng to, thay thế dùng dữ liệu được nhét vào tập tin FBX" +msgstr "Xác định chiều hướng và tỷ lệ, thay vì sử dụng dữ liệu đã được nhúng sẵn trong tập tin FBX (Filmbox:Phòng Bán Vé Phim)" msgid "Use Pre/Post Rotation" -msgstr "Dùng Xoay Trước/Sau" +msgstr "Dùng Sự Xoay Chiều (Tiền/Hậu) Kỳ" msgid "Use pre/post rotation from FBX transform (you may have to disable that in some cases)" -msgstr "Dùng xoay trước/sau từ biến hóa FBX (bạn có lẽ cần tắt nó cho vài trường hợp)" +msgstr "Dùng sự xoay chiều (tiền/hậu) kỳ từ biến hóa của FBX (bạn có thể phải tắt cái đó đi trong một số trường hợp)" msgid "Subdivision Data" @@ -56306,172 +61810,191 @@ msgstr "Dữ Liệu Phân Hóa" msgid "Import FBX subdivision information as subdivision surface modifiers" -msgstr "Nhập thông tin phân hóa FBX như bộ điều chỉnh phân hóa bề mặt" +msgstr "Nhập Khẩu thông tin về Bề Mặt Phân Hóa của FBX thành các bộ điều chỉnh bề mặt phân hóa" msgctxt "Operator" msgid "Import glTF 2.0" -msgstr "Nhập glTF 2.0" +msgstr "Nhập Khẩu glTF 2.0" msgid "Load a glTF 2.0 file" -msgstr "Nhập một tập tin glTF 2.0" +msgstr "Nạp một tập tin glTF 2.0" msgid "Bone Dir" -msgstr "Hướng Xương" +msgstr "Chiều Hướng của Xương" msgid "Heuristic for placing bones. Tries to make bones pretty" -msgstr "Quy định cho đặt vị trí xương. Nó thử đặt xương gọn" +msgstr "Đặt các xương theo bố trí có lý. Thử làm cho các xương đẹp hơn" + + +msgid "Blender (best for import/export round trip)" +msgstr "Blender (tốt nhất cho chu trình xuất/nhập khẩu khứ hồi)" + + +msgid "Good for re-importing glTFs exported from Blender, and re-exporting glTFs to glTFs after Blender editing. Bone tips are placed on their local +Y axis (in glTF space)" +msgstr "Tốt cho việc tái nhập khẩu glTF đã xuất khẩu từ Blender ra, và tái xuất khẩu glTF ra glTF sau khi biên soạn Blender. Đầu xương được đặt trên trục +Y cục bộ của chúng (trong không gian glTF)" msgid "Temperance (average)" -msgstr "Độ Giữ Gìn (trung bình)" +msgstr "Điều Độ (trung bình)" msgid "Decent all-around strategy. A bone with one child has its tip placed on the local axis closest to its child" -msgstr "Chiến thuật tốt tổng quát. Một xương có một con cái được đặt đỉnh của nó trên trục địa phương gần nhất với con cái" +msgstr "" +"Chiến lược toàn diện khá tốt.\n" +"Xương chỉ có một con cái thì đỉnh đầu sẽ được đặt trong trục địa phương\n" +"gần nhất với con cái của nó" msgid "Fortune (may look better, less accurate)" -msgstr "Giào (có lẽ đẹp hơn, nhưng giảm độ chính xác)" +msgstr "May Mắn (có thể trông tốt hơn, song kém chính xác)" msgid "Might look better than Temperance, but also might have errors. A bone with one child has its tip placed at its child's root. Non-uniform scalings may get messed up though, so beware" -msgstr "Có lẽ đẹp hơn Giữ Gìn, nhưng có thể có sai lầm. Một xương có một con cái đã có đỉnh tại rễ của con cái. Phóng to không đều có thể bị hư, cẩn thận" +msgstr "Có thể trông khá hơn là chế độ Điều Độ (Temperance), song lại cũng có thể gây ra lỗi lầm nữa. Xương có một con cái sẽ đặt đỉnh đầu của nó tại gốc của con cái. Sự đổi tỷ lệ bất đồng đều có thể sẽ làm hỏng toàn bộ các, cho nên phải cẩn thận" msgid "Guess Original Bind Pose" -msgstr "Đoán Dạng Đứng Gói Lại Ban Đầu" +msgstr "Đoán Tư Thế Kết Buộc Gốc" msgid "Try to guess the original bind pose for skinned meshes from the inverse bind matrices. When off, use default/rest pose as bind pose" -msgstr "Thử đoán dạng đứng gói lại ban đầu cho mạng lưới có da từ các ma trận gói lại đảo nghịch. Khi tắt, dùng dạng đứng mặc định/nghỉ cho làm dạng đứng gói lại" +msgstr "Đối với các khung lưới đã được bọc da thì thử đoán mò tư thế kết buộc gốc từ các ma trận kết buộc đảo ngược. Khi tắt đi thì sử dụng tư thế mặc định/nghỉ làm tư thế kết buộc" msgid "Pack Images" -msgstr "Gói Các Ảnh" +msgstr "Đóng Gói các Hình Ảnh" msgid "Pack all images into .blend file" -msgstr "Gói lại hết ảnh vào tập tin .blend" +msgstr "Đóng gói toàn bộ các hình ảnh vào tập tin .blend" msgid "How normals are computed during import" -msgstr "Làm sao tính pháp tuyến khi nhập" +msgstr "Phương pháp mà các pháp tuyến sẽ được tính toán trong khi nhập khẩu" msgid "Use Normal Data" -msgstr "Dùng Dữ Liệu Pháp Tuyến" +msgstr "Sử Dụng Dữ Liệu Pháp Tuyến" msgid "Flat Shading" -msgstr "Tô Sắc Đều" +msgstr "Tô Bóng Phẳng Bẹt" + + +msgid "Import WebP textures" +msgstr "Nhập Khẩu Chất Liệu WebP" + + +msgid "If a texture exists in WebP format, loads the WebP texture instead of the fallback PNG/JPEG one" +msgstr "Nếu một chất liệu tồn tại ở định dạng WebP thì hãy tải kết cấu WebP vào, thay vì chất liệu PNG/JPEG dự phòng" msgid "Log Level" -msgstr "Mức Log" +msgstr "Mức Ghi Nhật Ký" msgid "The glTF format requires discontinuous normals, UVs, and other vertex attributes to be stored as separate vertices, as required for rendering on typical graphics hardware. This option attempts to combine co-located vertices where possible. Currently cannot combine verts with different normals" -msgstr "Định dạng glTF yêu cầu những pháp tuyến không liên tiếp, tọa độ UV, và đặc trưng điểm khác được chứa bởi đỉnh riêng biệt, theo như cầu của phần cứng đồ họa bình thường. Tùy chọn này thử gồm lại đỉnh ở cùng chỗ. Hiện tại chưa được gồm đỉnh có pháp tuyến khác nhau" +msgstr "Định dạng glTF đòi hỏi các pháp tuyến phải gián đoạn nhau. Các UV và các thuộc tính điểm đỉnh khác cũng phải được lưu như các điểm đỉnh riêng biệt, như điều kiện đòi hỏi đối với phần cứng về đồ họa tiêu biểu vậy. Tùy chọn này cố gắng kết hợp các điểm đỉnh nằm cùng một vị trí lại làm một, nếu có thể. Hiện tại, phép toán này không thể kết hợp các điểm đỉnh có pháp tuyến khác biệt" msgctxt "Operator" msgid "Import X3D/VRML2" -msgstr "Nhập X3D/VRML2" +msgstr "Nhập Khẩu X3D/VRML2" msgid "Import an X3D or VRML2 file" -msgstr "Nhập vào một tập tin X3D hay VRML2" +msgstr "Nhập Khẩu một tập tin X3D hoặc VRML2" msgctxt "Operator" msgid "Import MDD" -msgstr "Nhập MDD" +msgstr "Nhập Khẩu MDD" msgid "Import MDD vertex keyframe file to shape keys" -msgstr "Nhập tập tin bức ảnh mẫu đỉnh MDD vào mẫu dạng" +msgstr "Nhập Khẩu tập tin khung khóa điểm đỉnh MDD vào các hình mẫu" msgid "Start frame for inserting animation" -msgstr "Sô bức ảnh cho chèn họạt hình" +msgstr "Khung hình khởi đầu để chèn thêm hoạt họa vào" msgctxt "Operator" msgid "Copy Reports to Clipboard" -msgstr "Chép Biên Bản Vào Bảng Dán" +msgstr "Sao Chép các Bản Thông Báo vào Bảng Nhớ Tạm" msgid "Copy selected reports to clipboard" -msgstr "Chép lại các biên bản được chọn vào bảng dán" +msgstr "Sao chép các bản báo cáo được chọn vào bảng nhớ tạm" msgctxt "Operator" msgid "Delete Reports" -msgstr "Xóa Biên Bản" +msgstr "Xóa các Bản Thông Báo" msgid "Delete selected reports" -msgstr "Xóa biên bản được chọn" +msgstr "Xóa các bản thông báo được chọn" msgctxt "Operator" msgid "Replay Operators" -msgstr "Hát Lại Thao Tác" +msgstr "Chơi Lại các Thao Tác" msgid "Replay selected reports" -msgstr "Hát lại biên bản được chọn" +msgstr "Chơi lại các bản thông báo được chọn" msgctxt "Operator" msgid "Update Reports Display" -msgstr "Nâng Cấp MHiển Thị Biên Bản" +msgstr "Cập Nhật Hiển Thị Bản Thông Báo" msgid "Update the display of reports in Blender UI (internal use)" -msgstr "Nâng cấp hiển thị của biên bản trong giao diện Blender (dùng nội bộ)" +msgstr "Cập nhật hiển thị của bản thông báo trong Giao Diện Người Dùng của Blender (sử dụng nội bộ)" msgid "Change selection of all visible reports" -msgstr "Đổi sự lựa chọn của tất cả biên bản hiển thị" +msgstr "Đổi lựa chọn của toàn bộ các thông báo nhìn thấy được" msgid "Toggle box selection" -msgstr "Bật/tắt lựa chọn kiểu hộp" +msgstr "Bật/tắt lựa chọn bằng khoanh vùng hình hộp" msgctxt "Operator" msgid "Select Report" -msgstr "Chọn Biên Bản" +msgstr "Chọn Thông/Thông Báo" msgid "Select reports by index" -msgstr "Chọn biên bản bằng chỉ số" +msgstr "Chọn thông/thông báo bằng chỉ số" msgid "Extend report selection" -msgstr "Mở rộng sự lựa chọn biên bản" +msgstr "Mở rộng lựa chọn thông báo" msgid "Index of the report" -msgstr "Chỉ số của biên bản" +msgstr "Chỉ số của thông/thông báo" msgctxt "Operator" msgid "Flip (Distortion Free)" -msgstr "Lật (Vô Méo Hóa)" +msgstr "Đảo Chiều (Không Biến Dạng)" msgid "Mirror all control points without inverting the lattice deform" -msgstr "Gương hóa hết điểm kiểm soát mà không đảo nghịch méo hóa rào lưới" +msgstr "Phản chiếu đối xứng toàn bộ các điểm điều khiển mà không đảo nghịch sự biến dạng của lưới rào" msgid "Coordinates along this axis get flipped" -msgstr "Lật tọa độ của trục này" +msgstr "Những tọa độ trên trục này sẽ bị đảo lật" msgid "U (X) Axis" @@ -56488,111 +62011,116 @@ msgstr "Trục W (Z)" msgctxt "Operator" msgid "Make Regular" -msgstr "Làm Đều" +msgstr "Sắp Đều" msgid "Set UVW control points a uniform distance apart" -msgstr "Đặt các điểm kiểm soát UVW một khoảng cách bằng nhau" +msgstr "Đặt các điểm điều khiển UVW cách nhau đồng đều" msgid "Change selection of all UVW control points" -msgstr "Đổi sự lựa chọn của hết điểm kiểm soát UVW" +msgstr "Đổi lựa chọn của toàn bộ các điểm điều khiển UVW" msgid "Deselect vertices at the boundary of each selection region" -msgstr "Thả đỉnh tại biên giới của mỗi vùng được chọn" +msgstr "Hủy chọn các điểm đỉnh tại ranh giới của mỗi vùng lựa chọn" msgid "Select mirrored lattice points" -msgstr "Chọn điểm rào lưới được gương lại" +msgstr "Chọn các điểm lưới rào phản chiếu đối xứng" msgid "Select vertex directly linked to already selected ones" -msgstr "Chọn đỉnh được kết nối trực tiếp với các đỉnh được chọn" +msgstr "Chọn điểm đỉnh kết nối trực tiếp với những cái đã được chọn" msgid "Randomly select UVW control points" -msgstr "Ngẫu nhiên chọn điểm kiểm soát UVW" +msgstr "Chọn các điểm điều khiển UVW một cách ngẫu nhiên" msgctxt "Operator" msgid "Select Ungrouped" -msgstr "Chọn Chưa Thành Nhóm" +msgstr "Chọn cái Chưa được Nhóm" msgid "Select vertices without a group" -msgstr "Chọn các đỉnh chưa của nhóm nào" +msgstr "Chọn các điểm đỉnh chưa có nhóm" msgctxt "Operator" msgid "Add Time Marker" -msgstr "Thêm Ký Hịệu Thời Gian" +msgstr "Thêm Dấu Mốc Thời Gian" msgid "Add a new time marker" -msgstr "Thêm một ký hiệu thời gian" +msgstr "Thêm một dấu mốc thời gian mới" msgctxt "Operator" msgid "Bind Camera to Markers" -msgstr "Trói Mấy Quay Phim Với Ký Hiệu" +msgstr "Kết Buộc Máy Quay Phim vào Dấu Mốc" msgid "Bind the selected camera to a marker on the current frame" -msgstr "Trói lại máy quay phim được chọn với một ký hiệu trong bức ảnh hiện tại" +msgstr "Kết buộc máy quay phim đã chọn vào một dấu mốc trên khung hình hiện tại" msgctxt "Operator" msgid "Delete Markers" -msgstr "Xóa Ký Hiệu" +msgstr "Xóa Dấu Mốc" msgid "Delete selected time marker(s)" -msgstr "Xóa các ký hiệu được chọn" +msgstr "Xóa các dấu mốc thời gian được chọn" msgctxt "Operator" msgid "Duplicate Time Marker" -msgstr "Sao Chép Ký Hiệu Thời Gian" +msgstr "Nhân Đôi Dấu Mốc Thời Gian" msgid "Duplicate selected time marker(s)" -msgstr "Sao chép các ký hiệu thời gian được chọn" +msgstr "Nhân đôi các dấu mốc thời gian đã chọn" + + +msgctxt "Operator" +msgid "Copy Markers to Scene" +msgstr "Sao Chép các Dấu Mốc vào Cảnh" msgid "Copy selected markers to another scene" -msgstr "Chép các ký hiệu được chọn vào một cảnh khác" +msgstr "Sao chép các dấu mốc được chọn vào một cảnh khác" msgctxt "Operator" msgid "Move Time Marker" -msgstr "Di Chuyển Ký Hiệu Thời Gian" +msgstr "Di Chuyển Dấu Mốc Thời Gian" msgid "Move selected time marker(s)" -msgstr "Di chuyển các ký hiệu thời gian được chọn" +msgstr "Di chuyển các dấu mốc thời gian được chọn" msgctxt "Operator" msgid "Rename Marker" -msgstr "Đổi Tên Ký Hiệu" +msgstr "Đổi Tên Dấu Mốc" msgid "Rename first selected time marker" -msgstr "Đổi tên ký hiệu đầu được chọn" +msgstr "Đổi tên dấu mốc thời gian được chọn đầu tiên" msgid "New name for marker" -msgstr "Tên mới cho ký hiệu" +msgstr "Tên mới cho dấu mốc" msgctxt "Operator" msgid "Select Time Marker" -msgstr "Chọn Ký hiệu Thời Gian" +msgstr "Chọn Dấu Mốc Thời Gian" msgid "Select time marker(s)" -msgstr "Chọn (các) ký hiệu thời gian" +msgstr "Chọn các dấu mốc thời gian" msgid "Select the camera" @@ -56601,190 +62129,206 @@ msgstr "Chọn máy quay phim" msgctxt "Operator" msgid "(De)select all Markers" -msgstr "Chọn/(thả) hết Ký Hiệu" +msgstr "Chọn/Hủy Chọn toàn bộ các Dấu Mốc" msgid "Change selection of all time markers" -msgstr "Đổi sự lựa chọn của hết ký hiệu thời gian" +msgstr "Đổi lựa chọn của toàn bộ các dấu mốc thời gian" msgctxt "Operator" msgid "Marker Box Select" -msgstr "Chọn Ký Hiệu Kiểu Hộp" +msgstr "Chọn Dấu Mốc bằng Khoanh Vùng Hình Hộp" msgid "Select all time markers using box selection" -msgstr "Chọn tất cả ký hiệu thời gian bằng sự lựa chọn kiểu hộp" +msgstr "Chọn toàn bộ các dấu mốc thời gian bằng phương pháp khoanh vùng hình hộp" msgctxt "Operator" msgid "Select Markers Before/After Current Frame" -msgstr "Chọn Ký Hiệu Trước/Sau Bức Ảnh Hiện Tại" +msgstr "Chọn các Dấu Mốc nằm Trước/Sau Khung Hình Hiện Tại" msgid "Select markers on and left/right of the current frame" -msgstr "Chọn ký hiện tại và phía trái/phải của bức ảnh hiện tại" +msgstr "Chọn các dấu mốc nằm trên và nằm bên trái / phải của khung hình hiện tại" msgctxt "Operator" msgid "Add Feather Vertex" -msgstr "Thêm Đỉnh Phe Phẩy" +msgstr "Thêm Điểm Đỉnh cho Mép Nhòe" msgid "Add vertex to feather" -msgstr "Thêm đỉnh cho phe phẩy" +msgstr "Thêm điểm đỉnh vào mép nhòe" msgid "Location of vertex in normalized space" -msgstr "Vị trí của đỉnh trong không gian đơn vị hóa" +msgstr "Vị trí của điểm đỉnh trong không gian đã bình thường hóa" msgctxt "Operator" msgid "Add Feather Vertex and Slide" -msgstr "Thêm Đỉnh Phe Phẩy Và Trượt" +msgstr "Thêm Điểm Đỉnh cho Mép Nhòe và Trượt Đẩy" msgid "Add new vertex to feather and slide it" -msgstr "Thêm đỉnh mới cho phe phẩy và trượt nó" +msgstr "Thêm điểm đỉnh mới cho mép nhòe và trượt đẩy nó" msgid "Add Feather Vertex" -msgstr "Thêm Đỉnh Phe Phẩy" +msgstr "Thêm Điểm Đỉnh cho Mép Nhòe" msgid "Slide Point" -msgstr "Điểm Trượt" +msgstr "Trượt Đẩy Điểm" msgid "Slide control points" -msgstr "Điểm kiểm soát trượt" +msgstr "Trượt Đẩy các Điểm Điều Khiển" msgctxt "Operator" msgid "Add Vertex" -msgstr "Thêm Đỉnh" +msgstr "Thêm Điểm Đỉnh" msgid "Add vertex to active spline" -msgstr "Thêm đỉnh cho mẫu cong hoạt động" +msgstr "Thêm điểm đỉnh cho chốt trục đang hoạt động" msgctxt "Operator" msgid "Add Vertex and Slide" -msgstr "Thêm Đỉnh Và Trượt" +msgstr "Thêm Điểm Đỉnh và Trượt Đẩy" msgid "Add new vertex and slide it" -msgstr "Thêm đỉnh mới và trượt nó" +msgstr "Thêm điểm đỉnh mới và trượt đẩy nó" msgid "Add Vertex" -msgstr "Thêm Đỉnh" +msgstr "Thêm Điểm Đỉnh" msgctxt "Operator" msgid "Copy Splines" -msgstr "Chép Mẫu Cong" +msgstr "Sao Chép Chốt Trục" + + +msgid "Copy the selected splines to the internal clipboard" +msgstr "Sao chép các chốt trục đã chọn vào bảng nhớ tạm nội bộ" msgid "Toggle cyclic for selected splines" -msgstr "Bật/tắt chu trình cho cạc mẫu cong được chọn" +msgstr "Bật/Tắt tính tuần hoàn của các chốt trục được chọn" msgid "Delete selected control points or splines" -msgstr "Xóa các điểm điền khiển hay mẫu cong được chọn" +msgstr "Xóa các điểm điều khiển hoặc chốt trục đã chọn" msgctxt "Operator" msgid "Duplicate Mask" -msgstr "Sao Chép Mặt Nạ" +msgstr "Nhân Đôi Màn Chắn Lọc" msgid "Duplicate selected control points and segments between them" -msgstr "Sao chép điểm kiểm soát được chọn và khúc giữa nó" +msgstr "Nhân đôi các điểm điều khiển đã chọn và các phân đoạn giữa chúng" msgid "Duplicate mask and move" -msgstr "Sao chép mặt nạ và di chuyển" +msgstr "Nhân đôi màn chắn lọc và di chuyển" msgid "Duplicate Mask" -msgstr "Sao Chép Mặt Nạ" +msgstr "Nhân Đôi Màn Chắn Lọc" msgctxt "Operator" msgid "Clear Feather Weight" -msgstr "Xóa Quyền Lượng Phe Phẩy" +msgstr "Xóa Trọng Lượng Mép Nhòe" msgid "Reset the feather weight to zero" -msgstr "Đặt lại quyền lượng phe phẩy bằng 0" +msgstr "Hoàn lại trọng lượng mép nhòe về 0" msgctxt "Operator" msgid "Clear Restrict View" -msgstr "Xóa Hạn Chế Hiển Thị" +msgstr "Hiện" + + +msgid "Reveal temporarily hidden mask layers" +msgstr "Tạm thời biểu lộ các tầng lớp màn chắn lọc ẩn giấu" msgctxt "Operator" msgid "Set Restrict View" -msgstr "Đặt Hạn Chế Hiển Thị" +msgstr "Ẩn Giấu" + + +msgid "Temporarily hide mask layers" +msgstr "Tạm thời ẩn giấu các tầng lớp màn chắn lọc" msgctxt "Operator" msgid "Move Layer" -msgstr "Di Chuyển Lớp" +msgstr "Di Chuyển Tầng" msgid "Move the active layer up/down in the list" -msgstr "Di chuyển lớp hoạt động lên/xuống trong danh sách" +msgstr "Di chuyển tầng đang hoạt động lên/xuống trong danh sách" msgid "Direction to move the active layer" -msgstr "Hướng để di chuyển lớp hoạt động" +msgstr "Chiều hướng để di chuyển tầng lớp đang hoạt động" msgctxt "Operator" msgid "Add Mask Layer" -msgstr "Thêm Lớp Mặt Nạ" +msgstr "Thêm Tầng Màn Chắn Lọc" msgid "Add new mask layer for masking" -msgstr "Thêm lớp cho làm mặt nạ" +msgstr "Tạo thêm tầng màn chắn lọc mới cho quá trình chắn lọc" msgid "Name of new mask layer" -msgstr "Tên của lớp mặt nạ mới" +msgstr "Tên của tầng màn chắn lọc mới" msgid "Remove mask layer" -msgstr "Xóa lớp mặt nạ" +msgstr "Loại bỏ tầng màn chắn lọc" msgctxt "Operator" msgid "New Mask" -msgstr "Mặt Nạ Mới" +msgstr "Màn Chắn Lọc Mới" msgid "Create new mask" -msgstr "Tạo mặt nạ mới" +msgstr "Kiến Tạo màn chắn lọc mới" msgid "Name of new mask" -msgstr "Tên của mặt nạ mới" +msgstr "Tên của màn chắn lọc mới" msgid "Clear the mask's parenting" -msgstr "Xóa phụ huynh của mặt nạ" +msgstr "Hủy phụ huynh của màn chắn lọc" msgid "Set the mask's parenting" -msgstr "Đặt phụ huynh mặt nạ" +msgstr "Đặt phụ huynh của màn chắn lọc" msgctxt "Operator" msgid "Paste Splines" -msgstr "Dán Mẫu Cong" +msgstr "Dán Chốt Trục" + + +msgid "Paste splines from the internal clipboard" +msgstr "Dán chốt trục từ bảng nhớ tạm nội bộ vào" msgctxt "Operator" @@ -56793,15 +62337,15 @@ msgstr "Thêm Vòng Tròn" msgid "Add new circle-shaped spline" -msgstr "Thêm mẫu cong vòng tròn mới" +msgstr "Thêm hình tròn bằng chốt trục mới" msgid "Location of new circle" -msgstr "Vị trí vòng tròn mới" +msgstr "Vị trí của vòng tròn mới" msgid "Size of new circle" -msgstr "Kích cỡ vòng tròn mới" +msgstr "Kích thước của vòng tròn mới" msgctxt "Operator" @@ -56810,141 +62354,141 @@ msgstr "Thêm Hình Vuông" msgid "Add new square-shaped spline" -msgstr "Thêm một mẫu cong hình vuông mới" +msgstr "Thêm một hình vuông bằng chốt trục mới" msgid "Select spline points" -msgstr "Chọn điểm mẫu cong" +msgstr "Chọn các điểm của chốt trục" msgid "Change selection of all curve points" -msgstr "Đổi sự lựa chọn của tất cả điểm đường cong" +msgstr "Đổi lựa chọn của toàn bộ các điểm trên đường cong" msgid "Select curve points using circle selection" -msgstr "Chọn điểm đường cong bằng sự lựa chọn vòng tròn" +msgstr "Chọn các điểm của đường cong bằng lựa chọn vòng tròn" msgid "Select curve points using lasso selection" -msgstr "Chọn điểm của đường cong bằng dây trói" +msgstr "Chọn các điểm của đường cong dùng dây thòng lọng" msgid "Deselect spline points at the boundary of each selection region" -msgstr "Thả điểm mẫu cong tại ranh giới của khu vực được chọn" +msgstr "Hủy chọn các điểm đường của cong chốt trục tại ranh giới của vùng được chọn" msgid "Select all curve points linked to already selected ones" -msgstr "Chọn hết điểm liên kết với các điểm được chọn" +msgstr "Chọn toàn bộ các điểm nối với điểm đang chọn" msgid "(De)select all points linked to the curve under the mouse cursor" -msgstr "Chon/thả hết điểm liên kết với đường cong ở dưới con trỏ chuột" +msgstr "Chọn/hủy chọn toàn bộ các điểm kết nối với đường cong nằm dưới con trỏ chuột" msgid "Select more spline points connected to initial selection" -msgstr "Chọn thêm điểm của mẫu cong kết nối với sự lựa chọn khởi đầu" +msgstr "Chọn thêm các điểm của chốt trục có kết nối với lựa chọn ban đầu" msgctxt "Operator" msgid "Clear Shape Key" -msgstr "Xóa Mẫu Dạng" +msgstr "Xóa Hình Dạng Khóa" msgid "Remove mask shape keyframe for active mask layer at the current frame" -msgstr "Xóa bức ảnh mẫu hình dạng mặt nạ cho lớp mặt nạ hoạt động tại bức ảnh hiện tại" +msgstr "Xóa khung khóa hình mẫu chắn lọc tại khung hình hiện tại trong tầng màn chắn lọc đang hoạt động" msgctxt "Operator" msgid "Feather Reset Animation" -msgstr "Phe Phẩy Đặt Lại Hoạt Hình" +msgstr "Hoàn Lại Mép Nhòe của Hoạt Họa" msgid "Reset feather weights on all selected points animation values" -msgstr "Đặt lại quyền lượng của tất cả giá trị hoạt hình của các điểm được chọn" +msgstr "Hoàn lại trọng lượng của toàn bộ các giá trị hoạt họa của các điểm được chọn" msgctxt "Operator" msgid "Insert Shape Key" -msgstr "Chèn Mẫu Dạng" +msgstr "Chèn Thêm Hình Dạng Khóa" msgid "Insert mask shape keyframe for active mask layer at the current frame" -msgstr "Chèn bức ảnh mẫu hình dạng mặt nạ cho lớp mặt nạ hoạt động tại bức ảnh hiện tại" +msgstr "Chèn khung khóa hình mẫu chắn lọc tại khung hình hiện tại cho tầng màn chắn lọc đang hoạt động" msgctxt "Operator" msgid "Re-Key Points of Selected Shapes" -msgstr "Tính Lại Điểm Của Bức Ảnh Mẫu Cho Mẵu Dạng Được Chọn" +msgstr "Khóa Hóa Lại những Điểm của các Hình Dạng được Chọn" msgid "Recalculate animation data on selected points for frames selected in the dopesheet" -msgstr "Tính lại dữ liệu hoạt hình cho các điểm được chọn cho bức ảnh được chọn trong bản hoạt hình" +msgstr "Tính lại dữ liệu hoạt họa tại điểm đã chọn cho các khung hình được chọn trong bảng hành động" msgctxt "Operator" msgid "Slide Point" -msgstr "Trượt Điểm" +msgstr "Trượt Đẩy Điểm" msgid "Slide New Point" -msgstr "Trược Điểm Mới" +msgstr "Trượt Đẩy Điểm Mới" msgid "Newly created vertex is being slid" -msgstr "Đỉnh mới được chế tạo đang trượt" +msgstr "Điểm đỉnh mới kiến tạo đang bị trượt đẩy" msgid "Slide Feather" -msgstr "Trược Phe Phẩy" +msgstr "Trượt Đẩy Mép Nhòe" msgid "First try to slide feather instead of vertex" -msgstr "Trước thử trượt phe phẩy thay thế đỉnh" +msgstr "Trước tiên thử trượt đẩy mép nhòe đã, thay vì trượt đẩy điểm đỉnh" msgctxt "Operator" msgid "Slide Spline Curvature" -msgstr "Trượt Độ Cong Mẫu Cong" +msgstr "Trượt Đẩy Độ Cong của Chốt Trục" msgid "Slide a point on the spline to define its curvature" -msgstr "Trượt một điểm trên mẫu cong để chỉ định độ cong của nó" +msgstr "Trượt đẩy một điểm trên chốt trục để xác định độ cong của nó" msgctxt "Operator" msgid "Copy Material" -msgstr "Chép Vật Liệu" +msgstr "Sao Chép Nguyên Vật Liệu" msgid "Copy the material settings and nodes" -msgstr "Chép lại cài đặt của vật liệu và giao điểm" +msgstr "Sao chép sắp đặt về nguyên vật liệu và các nút" msgctxt "Operator" msgid "New Material" -msgstr "Vật Liệu Mới" +msgstr "Nguyên Vật Liệu Mới" msgid "Add a new material" -msgstr "Thêm một Vật Liệu" +msgstr "Thêm nguyên vật liệu mới" msgctxt "Operator" msgid "Paste Material" -msgstr "Dán Vật Liệu" +msgstr "Dán Nguyên Vật Liệu" msgid "Paste the material settings and nodes" -msgstr "Dán cài đặt của vật liệu và giao điểm" +msgstr "Dán các sắp đặt về nguyên vật liệu cùng các nút" msgctxt "Operator" msgid "Cleanup Math Vis Console" -msgstr "Gọn Lại Giao Điều Khiển Hiển Thị Toán" +msgstr "Dọn Dẹp Bàn Giao Tiếp Diễn Họa Toán Học" msgid "Remove all visualized variables from the Console" -msgstr "Xoá hết biến số được hiển thị từ Giao Điều Khiển" +msgstr "Xóa hết toàn bộ các biến số đã được diễn họa khỏi Bàn Giao Tiếp" msgctxt "Operator" @@ -56953,21 +62497,21 @@ msgstr "Xóa Biến Số" msgid "Remove the variable from the Console" -msgstr "Xóa biến số từ Giao Điều Khiển" +msgstr "Xóa biến số khỏi Bàn Giao Tiếp" msgctxt "Operator" msgid "Show BBox" -msgstr "Hiện Hộp Bao Quanh" +msgstr "Hiển Thị Khung Viền Hình Hộp" msgid "Show/Hide the BBox of Matrix items" -msgstr "Hiện/Ẩn Hộp Bao Quanh của mặt hàng Ma Trận" +msgstr "Bật/Tắt Khung Viền Hình Hộp cho các phần tử của ma trận" msgctxt "Operator" msgid "Hide/Unhide" -msgstr "Ẩn/Hiện" +msgstr "Ẩn Giấu/Hiện" msgid "Change the display state of the var" @@ -56976,90 +62520,90 @@ msgstr "Đổi trạng thái hiển thị của biến số" msgctxt "Operator" msgid "Lock/Unlock" -msgstr "Khóa/Mở Khóa" +msgstr "Khóa/Tháo Khóa" msgid "Lock the var from being deleted" -msgstr "Khóa biến số cho không thể xóa" +msgstr "Khóa biến số lại, không cho phép nó bị xóa đi" msgid "Delete selected metaball element(s)" -msgstr "Xóa các phần tử siêu cầu được chọn" +msgstr "Xóa các phần tử siêu cầu đã chọn" msgctxt "Operator" msgid "Duplicate Metaball Elements" -msgstr "Sao Chép Phần Tử Siêu Cầu" +msgstr "Nhân đôi các Phần Tử Siêu Cầu" msgid "Duplicate selected metaball element(s)" -msgstr "Sao chép các phần tử siêu cầu được chọn" +msgstr "Nhân đôi các phần tử siêu cầu đã chọn" msgid "Make copies of the selected metaball elements and move them" -msgstr "Chép lại hết phần tử siêu cầu được chọn và di chuyển chúng nó" +msgstr "Tạo bản sao các phần tử siêu cầu được chọn và di chuyển chúng" msgid "Duplicate Metaball Elements" -msgstr "Sao Chép Phần Tử Siêu Cầu" +msgstr "Nhân Đôi các Phần Tử Siêu Cầu" msgid "Hide (un)selected metaball element(s)" -msgstr "Ẩn (các) phần tử siêu cầu (chưa) được chọn" +msgstr "Ẩn giấu các phần tử siêu cầu (chưa/được) chọn" msgid "Reveal all hidden metaball elements" -msgstr "Hiện hết phần tử siêu cầu được ẩn" +msgstr "Bộc lộ toàn bộ các phần tử siêu cầu ẩn giấu" msgid "Change selection of all metaball elements" -msgstr "Đổi sự lựa chọn của hết phần tử siêu cầu" +msgstr "Đổi lựa chọn của toàn bộ các phần tử siêu cầu" msgid "Randomly select metaball elements" -msgstr "Ngẫu nhiên chọn phần tử siêu cầu" +msgstr "Ngẫu nhiên chọn các phần tử siêu cầu" msgid "Select similar metaballs by property types" -msgstr "Chọn siêu cầu giống bằng loại đặc tính" +msgstr "Chọn các siêu cầu tương đồng về thể loại tính chất" msgctxt "Operator" msgid "Average Normals" -msgstr "Tính Trung Bình Pháp Tuyến" +msgstr "Tính Trung Bình các Pháp Tuyến" msgid "Average custom normals of selected vertices" -msgstr "Tính trung bình của pháp tuyến tùy chọn của đỉnh được chọn" +msgstr "Tính trung bình các pháp tuyến tùy chỉnh của những điểm đỉnh được chọn" msgid "Averaging method" -msgstr "Phương Pháp Tính Trung Bình" +msgstr "Phương pháp tính trung bình" msgid "Take average of vertex normals" -msgstr "Tính trung bình của pháp tuyến đỉnh" +msgstr "Lấy trung bình các pháp tuyến điểm đỉnh" msgid "Set all vertex normals by face area" -msgstr "Đặt hết pháp tuyến đỉnh bằng diện tích mặt" +msgstr "Đặt toàn bộ các pháp tuyến điểm đỉnh theo diện tích Mặt" msgid "Set all vertex normals by corner angle" -msgstr "Đặt hết pháp tuyến đỉnh bằng góc của góc giác" +msgstr "Đặt toàn bộ các pháp tuyến điểm đỉnh theo góc độ của góc" msgid "Weight applied per face" -msgstr "Quyền lượng được áp dụng mỗi mặt" +msgstr "Trọng lượng áp dụng mỗi mặt" msgctxt "Operator" msgid "Beautify Faces" -msgstr "Trang Điểm Các Mặt" +msgstr "Làm Đẹp Các Mặt" msgid "Rearrange some faces to try to get less degenerated geometry" -msgstr "Sắp xếp lại vài mặt để thử giảm hình dạng suy biến" +msgstr "Sắp xếp lại một số các mặt để cố gắng thuyên giảm lượng các hình học suy biến" msgid "Angle limit" @@ -57068,125 +62612,125 @@ msgstr "Giới hạn góc" msgctxt "Operator" msgid "Bevel" -msgstr "Cạnh Tròn" +msgstr "Bo Tròn" msgid "Cut into selected items at an angle to create bevel or chamfer" -msgstr "Cắt thàng những mặt hàng được chọn tại một góc để chế tạo cạnh tròn hay góc tròn" +msgstr "Cắt vào các phần tử đã chọn theo một góc độ để kiến tạo hình bo tròn hoặc hình vê bo cạnh" msgid "Do not allow beveled edges/vertices to overlap each other" -msgstr "Không cho cạnh/đỉnh cạnh tròn lấn trên nhau" +msgstr "Không cho phép các cạnh/điểm đỉnh bo tròn đè gối lên nhau" msgid "Face Strength Mode" -msgstr "Chế Độ Sức Mặt" +msgstr "Chế độ Cường Độ Mặt" msgid "Whether to set face strength, and which faces to set face strength on" -msgstr "Đặt sức mặt hay không, và đặt sức mặt cho mặt nào" +msgstr "Có đặt sức mạnh cho các Mặt hay không và nếu có thì đặt trên Mặt nào" msgid "Set face strength on new and modified faces only" -msgstr "Chỉ đặt sức mặt cho mặt mới và mặt được sửa đổi" +msgstr "Duy đặt sức mạnh cho những Mặt mới hoặc cho những cái đã được sửa đổi mà thôi" msgid "Prefer sliding along edges to even widths" -msgstr "Ưu tiên trượt theo cạnh cho giữ bề rộng đều" +msgstr "Ưa thích trượt dọc theo các cạnh để tạo chiều rộng đồng đều hơn" msgid "Material for bevel faces (-1 means use adjacent faces)" -msgstr "Vật liệu cho cạnh tròn mặt (-1 nghĩa là dùng mặt kề)" +msgstr "Nguyên vật liệu dành cho các mặt bo tròn (-1 nghĩa là dùng các mặt tiếp giáp)" msgid "The method for determining the size of the bevel" -msgstr "Phương pháp to chỉ định kích thước của cạnh tròn" +msgstr "Phương pháp để xác định kích thước của cạnh vát/bo tròn" msgid "Controls profile shape (0.5 = round)" -msgstr "Điều khiển mặt cắt (0.5 = tròn)" +msgstr "Điều khiển hình dạng mặt cắt (0.5 = tròn)" msgid "Segments for curved edge" -msgstr "Đoạn cho cạnh cong" +msgstr "Số phân đoạn của cạnh cong" msgid "Amount to spread arcs for arc inner miters" -msgstr "Mức để mở rộng hình cung cho mũ tế nội" +msgstr "Mức ảnh hưởng của các vòng cung trong đường cắt góc bên trong" msgid "The method to use to create meshes at intersections" -msgstr "Phương pháp để chế tạo mạng lưới tại những chổ giao cắt" +msgstr "Phương pháp sử dụng để kiến tạo khung lưới tại các điểm giao cắt" msgid "A cutoff at each profile's end before the intersection" -msgstr "Cắt kết thúc của mỗi mặt cắt trước chỗ giao cắt" +msgstr "Cắt bỏ tại đầu cuối của mặt cắt, trước khi giao cắt" msgctxt "Operator" msgid "Bisect" -msgstr "Giao Cắt Thành Hai" +msgstr "Phân Đôi" msgid "Cut geometry along a plane (click-drag to define plane)" -msgstr "Cắt hình dạng theo một mặt phẳng (bấm-kéo cho chỉ định mặt phẳng)" +msgstr "Cắt hình học bằng một bình diện (bấm chuột-kéo để xác định bình diện)" msgid "Clear Inner" -msgstr "Xóa Nội" +msgstr "Xóa Bên Trong" msgid "Remove geometry behind the plane" -msgstr "Xóa hình dạng ở đang sau mặt phẳng" +msgstr "Loại bỏ hình học ở đằng sau bình diện" msgid "Clear Outer" -msgstr "Xóa Ngoại" +msgstr "Xóa Bên Ngoài" msgid "Remove geometry in front of the plane" -msgstr "Xóa hình dạng ở phía trước mặt phẳng" +msgstr "Loại bỏ hình học ở phía trước bình diện" msgid "Plane Point" -msgstr "Điểm Mặt Phẳng" +msgstr "Điểm của Bình Diện" msgid "A point on the plane" -msgstr "Một điểm trên mặt phẳng" +msgstr "Một điểm trên bình diện" msgid "Plane Normal" -msgstr "Pháp Tuyến Mặt Phẳng" +msgstr "Pháp Tuyến của Bình Diện" msgid "The direction the plane points" -msgstr "Hướng chỉ của mặt phẩng" +msgstr "Chiều hướng mà bình diện sẽ hướng vào" msgid "Axis Threshold" -msgstr "Ngưỡng Trục" +msgstr "Giới Hạn Trục" msgid "Preserves the existing geometry along the cut plane" -msgstr "Giữ nguyên hình dạng trên mặt phẳng cắt" +msgstr "Bảo tồn hình học hiện tại dọc theo bình diện cắt" msgid "Fill in the cut" -msgstr "Làm đầy chỗ cắt" +msgstr "Lấp đầy chỗ cắt" msgctxt "Operator" msgid "Blend from Shape" -msgstr "Pha Trộn Từ Hình Dạng" +msgstr "Pha Trộn từ Hình Mẫu" msgid "Blend in shape from a shape key" -msgstr "Pha trận hình dạng từ một mẫu dạng" +msgstr "Hòa trộn hình dạng từ một hình mẫu" msgid "Add rather than blend between shapes" -msgstr "Thêm thay pha trộn hai hình dạng" +msgstr "Thêm, thay vì pha trộn, giữa các hình dạng" msgid "Blending factor" @@ -57194,24 +62738,24 @@ msgstr "Hệ số pha trộn" msgid "Shape key to use for blending" -msgstr "Mẫu dạng để dùng cho pha trộn" +msgstr "Hình mẫu sử dụng trong quá trình pha trộn" msgctxt "Operator" msgid "Bridge Edge Loops" -msgstr "Kết Nối Vòng Cạnh" +msgstr "Cầu Nối các Vòng Cạnh" msgid "Create a bridge of faces between two or more selected edge loops" -msgstr "Chế tạo một cầu mặt giữa hai vòng cạnh trở lên được chọn" +msgstr "Kiến tạo một cầu nối các mặt giữa hai vòng cạnh hoặc nhiều hơn" msgid "Interpolation method" -msgstr "Phương Pháp Suy Nội" +msgstr "Phương pháp nội suy" msgid "Blend Path" -msgstr "Đường Pha Trộn" +msgstr "Pha Trộn Đường Đi" msgid "Blend Surface" @@ -57219,7 +62763,7 @@ msgstr "Pha Trộn Bề Mặt" msgid "Merge Factor" -msgstr "Hệ Số Gồm" +msgstr "Hệ Số Hợp Nhất" msgctxt "Curve" @@ -57236,39 +62780,39 @@ msgstr "Hệ Số Mặt Cắt" msgid "How much intermediary new edges are shrunk/expanded" -msgstr "Mức cạnh giữa mới được rút/nở lại" +msgstr "Lượng thu lại/nới ra của các cạnh mới trung gian" msgid "Smoothness factor" -msgstr "Hệ Số Mịn" +msgstr "Hệ số mịn màng" msgid "Twist offset for closed loops" -msgstr "Xoắn dịch cho vòng đóng" +msgstr "Dịch chuyển xoắn vặn cho vòng mạch kín" msgid "Connect Loops" -msgstr "Kết Nối Vòng" +msgstr "Chắp Nối Vòng Mạch" msgid "Method of bridging multiple loops" -msgstr "Phương Pháp kết nối nhiều vòng" +msgstr "Phương pháp cầu nối nhiều vòng mạch lại với nhau" msgid "Open Loop" -msgstr "Vòng Không Nối Lại " +msgstr "Vòng Mạch Mở" msgid "Closed Loop" -msgstr "Vòng Được Nối Lại" +msgstr "Vòng Mạch Kín" msgid "Loop Pairs" -msgstr "Vòng Đôi" +msgstr "Cặp Vòng Mạch" msgid "Merge rather than creating faces" -msgstr "Gồm thay thế chế tạo mặt mới" +msgstr "Hội nhập, thay vì kiến tạo, các mặt mới" msgctxt "Operator" @@ -57276,125 +62820,117 @@ msgid "Reverse Colors" msgstr "Đảo Nghịch Màu" -msgid "Flip direction of vertex colors inside faces" -msgstr "Lật ngược hướng của màu đỉnh trong các mặt" - - msgctxt "Operator" msgid "Rotate Colors" -msgstr "Xoay Màu" - - -msgid "Rotate color attributes inside faces" -msgstr "Xoay đặc điểm màu trong mặt" +msgstr "Xoay Chiều Màu Sắc" msgid "Counter Clockwise" -msgstr "Nghịch Hướng Kim Đồng Hồ" +msgstr "Nghịch Kim Đồng Hồ" msgctxt "Operator" msgid "Convex Hull" -msgstr "Vỏ Lồi" +msgstr "Bao Lồi" msgid "Enclose selected vertices in a convex polyhedron" -msgstr "Bao quanh đỉnh được chọn trong một đa diện lồi" +msgstr "Bao bọc các điểm đỉnh được chọn trong một khối đa diện lồi" msgid "Delete Unused" -msgstr "Xóa Không Được Dùng" +msgstr "Xóa cái Không Sử Dụng" msgid "Delete selected elements that are not used by the hull" -msgstr "Xóa các phần tử mà vỏ chưa được dùng" +msgstr "Xóa những phần tử được chọn mà vỏ không sử dụng đến" msgid "Max Face Angle" -msgstr "Góc Mặt Cực Đại" +msgstr "Góc Độ Mặt Tối Đa" msgid "Face angle limit" -msgstr "Giới hạn góc mặt" +msgstr "Giới hạn góc độ của Mặt" msgid "Join Triangles" -msgstr "Kết Nối Tam Giác" +msgstr "Hội Nhập các Tam Giác" msgid "Merge adjacent triangles into quads" -msgstr "Gồm tam giác kề nhau thành tư giác" +msgstr "Hội nhập các tam giác kề cạnh thành tứ giác" msgid "Make Holes" -msgstr "Tạo Lỗ" +msgstr "Tạo Lỗ Hổng" msgid "Delete selected faces that are used by the hull" -msgstr "Bỏ các mặt được chọn mà vỏ được dùng" +msgstr "Xóa các mặt được chọn mà vỏ sử dụng" msgid "Compare Materials" -msgstr "So Sánh Vật Liệu" +msgstr "So Sánh Nguyên Vật Liệu" msgid "Compare Seam" -msgstr "So Sánh Vết Sẹo" +msgstr "So Sánh Đường Khâu" msgid "Max Shape Angle" -msgstr "Góc Hình Dạng Cực Đại" +msgstr "Góc Độ Hình Dạng Tối Đa" msgid "Shape angle limit" -msgstr "Giới hạn góc hình dạng" +msgstr "Giới hạn góc độ của hình dạng" msgid "Compare Sharp" -msgstr "So Sánh Bén" +msgstr "So Sánh Độ Sắc Nhọn" msgid "Use Existing Faces" -msgstr "Dùng Mặt Đang Tồn Tại" +msgstr "Sử Dụng các Mặt Hiện Có" msgid "Skip hull triangles that are covered by a pre-existing face" -msgstr "Bỏ tam giác vỏ được che lại bằng một mặt có sẵn" +msgstr "Bỏ qua các tam giác của vỏ mà Mặt có sẵn che lấp" msgid "Compare UVs" -msgstr "So Sánh UV" +msgstr "So Sánh các UV" msgid "Compare VCols" -msgstr "So Sánh Cột Dọc" +msgstr "So Sánh các Cột V" msgctxt "Operator" msgid "Add Custom Split Normals Data" -msgstr "Thêm Dữ Liệu Pháp Tuyến Chẻ Tùy Chọn" +msgstr "Thêm Dữ Liệu Pháp Tuyến Tách Phân Tùy Chỉnh" msgid "Add a custom split normals layer, if none exists yet" -msgstr "Thêm một lớp pháp tuyến chẻ tùy chọn, nếu chưa có lớp nào" +msgstr "Thêm một tầng pháp tuyến tách phân tùy chỉnh, nếu chưa có tầng nào" msgctxt "Operator" msgid "Clear Custom Split Normals Data" -msgstr "Xóa Dữ Liệu Pháp Tuyến Chẻ Tùy Chọn" +msgstr "Xóa Dữ Liệu Pháp Tuyến Tách Phân Tùy Chỉnh" msgid "Remove the custom split normals layer, if it exists" -msgstr "Xóa lớp pháp tuyến chẻ tùy chọn, nếu có" +msgstr "Xóa tầng pháp tuyến tách phân tùy chỉnh, nếu có" msgctxt "Operator" msgid "Clear Sculpt Mask Data" -msgstr "Xóa Dữ Liệu Mặt Nạ Khắc" +msgstr "Xóa Dữ Liệu Màn Chắn Lọc Điêu Khắc" msgid "Clear vertex sculpt masking data from the mesh" -msgstr "Xóa dữ liệu mặt nạ khắc đỉnh từ mạng lưới" +msgstr "Xóa dữ liệu chắn lọc điểm đỉnh điêu khắc khỏi khung lưới" msgctxt "Operator" @@ -57403,7 +62939,7 @@ msgstr "Thêm Dữ Liệu Da" msgid "Add a vertex skin layer" -msgstr "Thêm một lớp da đỉnh" +msgstr "Thêm một lớp da điểm đỉnh" msgctxt "Operator" @@ -57412,131 +62948,131 @@ msgstr "Xóa Dữ Liệu Da" msgid "Clear vertex skin layer" -msgstr "Xóa lớp da đỉnh" +msgstr "Xóa lớp da điểm đỉnh" msgctxt "Operator" msgid "Decimate Geometry" -msgstr "Dơn Vị Hoá Hình Dạng" +msgstr "Tiêu Hao Hình Học" msgid "Simplify geometry by collapsing edges" -msgstr "Đơn vị hóa hình dạng bằng tóp cạnh" +msgstr "Đơn giản hóa hình học bằng thu các cạnh lại" msgid "Use active vertex group as an influence" -msgstr "Cho nhóm đỉnh hoạt động để ảnh hưởng" +msgstr "Dùng nhóm điểm đỉnh đang hoạt động làm một thế lực ảnh hưởng" msgid "Delete selected vertices, edges or faces" -msgstr "Xoá đỉnh, cạnh, hay mặt được chọn" +msgstr "Xóa các điểm đỉnh, cạnh, hay các mặt được chọn" msgid "Method used for deleting mesh data" -msgstr "Phương pháp cho xóa dữ liệu mạng lưới" +msgstr "Phương pháp sử dụng để xóa dữ liệu khung lưới" msgctxt "Operator" msgid "Delete Edge Loop" -msgstr "Xoá Vòng Cạnh" +msgstr "Xóa Vòng Cạnh" msgid "Delete an edge loop by merging the faces on each side" -msgstr "Xóa vòng cạnh bằng cách gồm các mặt của hai bên" +msgstr "Xóa một vòng cạnh bằng cách hòa nhập các mặt ở mỗi bên lại" msgid "Face Split" -msgstr "Chẻ Mặt" +msgstr "Tách Phân Mặt" msgid "Split off face corners to maintain surrounding geometry" -msgstr "Chẻ riêng góc giác mặt cho giữ nguyên hình dạng xung quanh" +msgstr "Tách các góc của Mặt ra để duy trì hình học bao quanh" msgctxt "Operator" msgid "Delete Loose" -msgstr "Xóa Cô Lập" +msgstr "Xóa Rời Rạc" msgid "Delete loose vertices, edges or faces" -msgstr "Xóa đỉnh, cạnh, hay mặt cô lập" +msgstr "Xóa các điểm đỉnh, cạnh, hay các mặt rời rạc" msgid "Remove loose edges" -msgstr "Xóa cạnh cô lập" +msgstr "Xóa các cạnh rời rạc" msgid "Remove loose faces" -msgstr "Xóa mặt cô lập" +msgstr "Xóa các mặt rời rạc" msgid "Remove loose vertices" -msgstr "Xoá đỉnh cô lập" +msgstr "Xóa các điểm đỉnh rời rạc" msgctxt "Operator" msgid "Degenerate Dissolve" -msgstr "Hòa Tan Thoát Hóa" +msgstr "Tiêu Hủy có Suy Biến" msgid "Dissolve zero area faces and zero length edges" -msgstr "Hòa tan mặt diện tích không và cạnh bề dài không" +msgstr "Tiêu hủy các mặt có diện tích bằng không và các cạnh có chiều dài bằng không" msgid "Maximum distance between elements to merge" -msgstr "Khoảng cách cực đại cho gồm phần tử" +msgstr "Khoảng cách tối đa giữa các phần tử để hợp nhất" msgctxt "Operator" msgid "Dissolve Edges" -msgstr "Hòa Tan Cạnh" +msgstr "Tiêu Hủy Cạnh" msgid "Dissolve edges, merging faces" -msgstr "Hoà tan cạnh, gồm mặt" +msgstr "Tiêu hủy cạnh, hòa nhập các mặt lại" msgid "Dissolve Vertices" -msgstr "Hòa Tan Đỉnh" +msgstr "Tiêu Hủy Điểm Đỉnh" msgid "Dissolve remaining vertices" -msgstr "Hòa tan đỉnh còn lại" +msgstr "Tiêu hủy các điểm đỉnh còn lại" msgctxt "Operator" msgid "Dissolve Faces" -msgstr "Hòa Tan Mặt" +msgstr "Tiêu Hủy Các Mặt" msgid "Dissolve faces" -msgstr "Hòa tan mặt" +msgstr "Tiêu hủy các mặt" msgctxt "Operator" msgid "Limited Dissolve" -msgstr "Hòa Tan Hạn Chế" +msgstr "Tiêu Hủy Giới Hạn" msgid "Dissolve selected edges and vertices, limited by the angle of surrounding geometry" -msgstr "Hòa tan cạnh và đỉnh đã chọn, được hạn chế bởi góc của hình dạng xung quanh" +msgstr "Tiêu hủy các cạnh và điểm đỉnh được chọn, song giới hạn bởi góc độ của các hình học bao quanh" msgid "Delimit dissolve operation" -msgstr "Phân Dịnh Thao Tác Hòa Tan" +msgstr "Thao tác tiêu hủy phân giới" msgid "Dissolve all vertices in between face boundaries" -msgstr "Hòa tan hết đỉnh giữa ranh giới mặt" +msgstr "Tiêu hủy toàn bộ các điểm đỉnh nằm giữa các ranh giới Mặt" msgctxt "Operator" msgid "Dissolve Selection" -msgstr "Hòa Tan Sự Lựa Chọn" +msgstr "Tiêu Hủy Lựa Chọn" msgid "Dissolve geometry based on the selection mode" -msgstr "Hòa tan hình dạng tùy chế độ sự lựa chọn" +msgstr "Tiêu hủy hình học dựa trên chế độ lựa chọn" msgid "Tear Boundary" @@ -57544,15 +63080,15 @@ msgstr "Xé Ranh Giới" msgid "Split off face corners instead of merging faces" -msgstr "Chẻ góc giác mặt thay thế gồm mặt" +msgstr "Tách các góc của Mặt ra, thay vì hòa nhập các Mặt lạ" msgid "Dissolve vertices, merge edges and faces" -msgstr "Hòa tan đỉnh, gồm cạnh và mặt" +msgstr "Tiêu hủy các điểm đỉnh đi và hợp nhất các cạnh cùng các mặt lại" msgid "Duplicate and extrude selected vertices, edges or faces towards the mouse cursor" -msgstr "Sao chép và kéo dài các đỉnh, cạnh, hay mặt được chọn đến con trỏ chuột" +msgstr "Nhân đôi và đẩy trồi các điểm đỉnh, cạnh, hoặc các mặt được chọn về phía con trỏ chuột" msgid "Rotate Source" @@ -57560,330 +63096,334 @@ msgstr "Xoay Nguồn" msgid "Rotate initial selection giving better shape" -msgstr "Xoay sự lựa chọn đầu tiên cho hình dạng tốt hơn" +msgstr "Xoay vùng lựa chọn ban đầu để được hình dạng tốt hơn" msgid "Duplicate selected vertices, edges or faces" -msgstr "Sao chép các đỉnh, cạnh, hay mặt được chọn" +msgstr "Nhân đôi các điểm đỉnh, cạnh, hay các mặt được chọn" msgid "Duplicate mesh and move" -msgstr "sao chép mạng lưới và di chuyển" +msgstr "Nhân đôi khung lưới và di chuyển" msgctxt "Operator" msgid "Collapse Edges & Faces" -msgstr "Tóp Cạnh & Mặt" +msgstr "Thu Các Cạnh & Các Mặt Lại" + + +msgid "Collapse isolated edge and face regions, merging data such as UVs and color attributes. This can collapse edge-rings as well as regions of connected faces into vertices" +msgstr "Thu gọn các vùng cạnh và Mặt đứng cô lập, hợp nhất dữ liệu như UV và các thuộc tính màu. Chức năng này có thể thu gọn các vòng cạnh cũng như các vùng của các Mặt kết nối thành các điểm đỉnh" msgctxt "Operator" msgid "Make Edge/Face" -msgstr "Chế Tạo Cạnh/Mặt" +msgstr "Tạo Cạnh/Mặt" msgid "Add an edge or face to selected" -msgstr "Thêm một cạnh hay mặt cho được chọn" +msgstr "Thêm một cạnh hoặc Mặt vào cái được chọn" msgctxt "Operator" msgid "Rotate Selected Edge" -msgstr "Xoay Cạnh Được Chọn" +msgstr "Xoay Chiều Cạnh được Chọn" msgid "Rotate selected edge or adjoining faces" -msgstr "Xoay cạnh được chọn hay mặt kề" +msgstr "Xoay chiều cạnh đã chọn hoặc các mặt tiếp giáp" msgctxt "Operator" msgid "Edge Split" -msgstr "Chẻ Cạnh" +msgstr "Phân Tách Cạnh" msgid "Split selected edges so that each neighbor face gets its own copy" -msgstr "Chẻ cạnh được chọn cho mỗi mặt kề được một bản sao riêng" +msgstr "Tách phân các cạnh được chọn, hầu cho mỗi Mặt lân cận có một bản sao riêng cho bản thân mình" msgid "Method to use for splitting" -msgstr "Phương pháp cho chẻ" +msgstr "Phương pháp sử dụng để tách phân" msgid "Faces by Edges" -msgstr "Chọn Mặt bằng Cạnh" +msgstr "Các Mặt theo Cạnh" msgid "Split faces along selected edges" -msgstr "Chẻ mặt theo các cạnh được chọn" +msgstr "Tách phân các mặt dọc theo những cạnh được chọn" msgid "Faces & Edges by Vertices" -msgstr "Mặt & Cạnh bằng Đỉnh" +msgstr "Các Mặt & Cạnh theo Điểm Đỉnh" msgid "Split faces and edges connected to selected vertices" -msgstr "Chẻ các mặt và cạnh được kết nối đến các đỉnh được chọn" +msgstr "Tách phân các mặt và các cạnh kết nối với những điểm đỉnh đã chọn ra" msgctxt "Operator" msgid "Edge Ring Select" -msgstr "Chọn Vành Cạnh" +msgstr "Chọn Vành Đai Cạnh" msgid "Select an edge ring" -msgstr "Chọn một vành cạnh" +msgstr "Chọn một vành đai cạnh" msgid "Remove from the selection" -msgstr "Thả từ sự lựa chọn" +msgstr "Xóa khỏi lựa chọn" msgid "Select Ring" -msgstr "Chọn Vành" +msgstr "Chọn Vành Đai" msgid "Select ring" -msgstr "Chọn vành" +msgstr "Chọn vành đai" msgid "Toggle Select" -msgstr "Chọn/Thả Được Chọn" +msgstr "Bật/Tắt Lựa Chọn" msgctxt "Operator" msgid "Select Sharp Edges" -msgstr "Chọn Cạnh Bén" +msgstr "Chọn các Cạnh Sắc Nhọn" msgid "Select all sharp enough edges" -msgstr "Chọn hết cạnh bén đủ" +msgstr "Chọn toàn bộ cạnh đủ độ sắc nhọn" msgctxt "Operator" msgid "Extrude Context" -msgstr "Bối Cảnh Kéo Ra" +msgstr "Bối Cảnh Đẩy Trồi" msgid "Extrude selection" -msgstr "Kéo ra sự lựa chọn" +msgstr "Đẩy trồi lựa chọn" msgid "Mirror Editing" -msgstr "Biên Tập Kiểu Gương" +msgstr "Biên Soạn Phản Chiếu Đối Xứng" msgid "Dissolve Orthogonal Edges" -msgstr "Hòa Tan Cạnh Vuông Góc" +msgstr "Tiêu Hủy các Cạnh Trực Giao" msgctxt "Operator" msgid "Extrude Region and Move" -msgstr "Kéo Ra Vùng Và Di Chuyển" +msgstr "Đẩy Trồi Vùng và Di Chuyển" msgid "Extrude region together along the average normal" -msgstr "Kéo ra vùng theo pháp tuyến trung bình" +msgstr "Đẩy trồi cả vùng cùng một lúc dọc theo pháp tuyến trung bình" msgid "Extrude Context" -msgstr "Bối Cảnh Kéo Ra" +msgstr "Bối Cảnh Đẩy Trồi" msgctxt "Operator" msgid "Extrude Only Edges" -msgstr "Chỉ Kéo Ra Cạnh" +msgstr "Duy Đẩy Trồi các Cạnh" msgid "Extrude individual edges only" -msgstr "Chỉ kéo ra cạnh riêng nhau" +msgstr "Duy đẩy trồi từng cá nhân cạnh mà thôi" msgctxt "Operator" msgid "Extrude Only Edges and Move" -msgstr "Chỉ Kéo Ra Cạnh Và Di Chuyển" +msgstr "Duy Đẩy Trồi các Cạnh và Di Chuyển" msgid "Extrude edges and move result" -msgstr "Kéo ra cạnh và di chuyển kết qủa" +msgstr "Đẩy trồi cạnh và di chuyển kết quả" msgid "Extrude Only Edges" -msgstr "Chỉ Kéo Ra Cạnh" +msgstr "Duy Đẩy Trồi các Cạnh" msgctxt "Operator" msgid "Extrude Individual Faces" -msgstr "Kéo Ra Mặt Riêng" +msgstr "Đẩy Trồi Từng Cá Nhân Các Mặt" msgid "Extrude individual faces only" -msgstr "Chỉ kéo ra mặt riêng nhau" +msgstr "Duy đẩy trồi từng cá nhân các mặt mà thôi" msgctxt "Operator" msgid "Extrude Individual Faces and Move" -msgstr "Kéo Ra Mặt Riêng Nhau Và Di Chuyển" +msgstr "Đẩy Trồi Từng Cá Nhân Các Mặt và Di Chuyển" msgid "Extrude each individual face separately along local normals" -msgstr "Kéo ra mỗi mặt riêng nhau theo pháp tuyến địa phương" +msgstr "Đẩy trồi riêng biệt từng cá nhân Mặt dọc theo pháp tuyến địa phương" msgid "Extrude Individual Faces" -msgstr "Kéo Ra Mặt Riêng Nhau" +msgstr "Đẩy Trồi Từng Cá Nhân Các Mặt" msgid "Shrink/fatten selected vertices along normals" -msgstr "Thu nhỏ/phình lên đỉnh được chọn theo pháp tuyến" +msgstr "Thu nhỏ/phình to các điểm đỉnh đã chọn ra dọc theo pháp tuyến" msgctxt "Operator" msgid "Extrude Manifold" -msgstr "Kéo Ra Đa Tập" +msgstr "Đẩy Trồi Đa Tạp" msgid "Extrude, dissolves edges whose faces form a flat surface and intersect new edges" -msgstr "Kéo ra, hòa tan cạnh thì có mặt hình thành một bề mặt bằng phẳng và cạnh mới giao cắt" +msgstr "Đẩy trồi, làm tiêu tan các cạnh mà các mặt của chúng tạo nên một mặt phẳng, đồng thời góc cắt các cạnh mới" msgid "Extrude Region" -msgstr "Kéo Ra Khu Vực" +msgstr "Đẩy Trồi Vùng" msgid "Extrude region of faces" -msgstr "Kéo ra vùng của các mặt" +msgstr "Đẩy trồi vùng của các mặt" msgctxt "Operator" msgid "Extrude Region" -msgstr "Kéo Ra Vùng" +msgstr "Đẩy Trồi Vùng" msgid "Extrude region and move result" -msgstr "Kéo ra vùng và di chuyển kết qủa" +msgstr "Đẩy trồi vùng và di chuyển kết quả" msgctxt "Operator" msgid "Extrude Region and Shrink/Fatten" -msgstr "Kéo Ra Vùng Và Thu Nhỏ/Phình Lên" +msgstr "Đẩy Trồi Vùng và Thu Nhỏ/Phình To" msgid "Extrude region together along local normals" -msgstr "Kéo ra vùng chung theo các pháp tuyến" +msgstr "Đẩy trồi cả vùng cùng một lúc dọc theo pháp tuyến địa phương" msgctxt "Operator" msgid "Extrude Repeat" -msgstr "Lặp Lại Kéo Ra" +msgstr "Đẩy Trồi Lặp Lại" msgid "Extrude selected vertices, edges or faces repeatedly" -msgstr "Kéo ra đỉnh, cạnh, hay mặt được chọn nhiều lần" +msgstr "Nhắc đi nhắc lại quá trình đẩy trồi các điểm đỉnh, cạnh, hoặc các mặt được chọn" msgid "Offset vector" -msgstr "Vectơ Dịch" +msgstr "Khoảng cách dịch chuyển" msgctxt "Operator" msgid "Extrude Only Vertices and Move" -msgstr "Chỉ Kéo Ra Đỉnh Và Di Chuyển" +msgstr "Duy Đẩy Trồi các Điểm Đỉnh và Di Chuyển" msgid "Extrude vertices and move result" -msgstr "Kéo ra đỉnh và di chuyển kết qủa" +msgstr "Đẩy trồi các điểm đỉnh và di chuyển kết quả" msgid "Extrude Only Vertices" -msgstr "Chỉ Kéo Ra Đỉnh" +msgstr "Duy Đẩy Trồi các Điểm Đỉnh" msgid "Extrude individual vertices only" -msgstr "Chỉ kéo ra cá đỉnh riêng nhau" +msgstr "Chỉ đẩy trồi cá nhân các điểm đỉnh mà thôi" msgctxt "Operator" msgid "Extrude Only Vertices" -msgstr "Chỉ Kéo Ra Đỉnh" +msgstr "Duy Đẩy Trồi các Điểm Đỉnh" msgctxt "Operator" msgid "Make Planar Faces" -msgstr "Mặt Phẳng Hóa Mặt" +msgstr "Tạo Các Mặt Bằng Phẳng" msgid "Flatten selected faces" -msgstr "Làm bằng phẳng các mặt được chọn" +msgstr "San phẳng các mặt đã chọn" msgctxt "Operator" msgid "Face Set Extract" -msgstr "Rút Ra Tập Mặt" +msgstr "Trích Xuất Mặt Ấn Định" msgid "Create a new mesh object from the selected Face Set" -msgstr "Chế tạo một vật thể mạng lưới mới từ Tập Mặt được chọn" +msgstr "Kiến Tạo một đối tượng khung lưới mới từ Mặt ấn định đã chọn" msgid "Add Boundary Loop" -msgstr "Chọn Vòng Ranh Giới" +msgstr "Thêm Vòng Mạch Ranh Giới" msgid "Add an extra edge loop to better preserve the shape when applying a subdivision surface modifier" -msgstr "Thêm một vòng cạnh nữa cho bảo trì hình dạng tốt hơn khi áp dụng một bộ điều chỉnh phân hóa bề mặt" +msgstr "Thêm một vòng cạnh dư để bảo tồn hình dạng tốt hơn khi áp dụng bộ điều chỉnh bề mặt phân hóa" msgid "Extract as Solid" -msgstr "Rút Ra như Rắn" +msgstr "Trích Xuất thành Khối Đặc" msgid "Extract the mask as a solid object with a solidify modifier" -msgstr "Rút ra mặt nạ như một vật thể rắn mà có một cụ sửi đổi rắn hóa" +msgstr "Trích xuất màn chắn lọc thành một đối tượng khối đặc với một bộ điều chỉnh đắp dày" msgid "Project to Sculpt" -msgstr "Chiếu đến Khắc" +msgstr "Phóng Chiếu vào Bản Điêu Khắc" msgid "Project the extracted mesh into the original sculpt" -msgstr "Chiếu mạng lưới được rút ra trên khắc ban đầu" +msgstr "Phóng chiếu khung lưới trích xuất vào bản điêu khắc gốc" msgid "Smooth iterations applied to the extracted mesh" -msgstr "Áp dụng lặp lại mịn đến mạng lưới được rút ra" +msgstr "Số lần tái lặp quá trình làm mịn để áp dụng vào khung lưới trích xuất" msgctxt "Operator" msgid "Weld Edges into Faces" -msgstr "Hàn Cạnh Thành Mặt" +msgstr "Hàn Cạnh vào Các Mặt" msgid "Weld loose edges into faces (splitting them into new faces)" -msgstr "Hàn cạnh mồ côi thành mặt (chẻ chúng nó thành mặt mới)" +msgstr "Hàn các cạnh rời rạc vào thành các mặt (tách phân chúng thành các mặt mới)" msgctxt "Operator" msgid "Copy Mirrored UV Coords" -msgstr "Chép Tọa Độ UV Kiểu Gương" +msgstr "Sao Chép các Tọa Độ UV Phản Chiếu Đối Xứng" msgid "Copy mirror UV coordinates on the X axis based on a mirrored mesh" -msgstr "Chép lại tọa độ UV kiểu gương quanh trục X tùy một mạng lưới đang gương" +msgstr "Sao chép các tọa độ UV phản chiếu đối xứng trên trục X dựa trên khung lưới đang được phản chiếu đối xứng" msgid "Axis Direction" -msgstr "Hướng Trục" +msgstr "Chiều Hướng của Trục" msgid "Tolerance for finding vertex duplicates" -msgstr "Chênh lệch cho tìm kiếm điểm sao chép thừa" +msgstr "Dung sai trong quá trình tìm các điểm đỉnh trùng lặp" msgctxt "Operator" msgid "Select Linked Flat Faces" -msgstr "Chọn Mặt Bằng Phẳng Được Liên Kết" +msgstr "Chọn các Mặt Phẳng Bẹt Kết Nối" msgid "Select linked faces by angle" -msgstr "Chọn mặt liên kết bằng góc" +msgstr "Chọn các mặt kết nối theo góc độ" msgid "Display faces flat" @@ -57891,41 +63431,41 @@ msgstr "Hiển thị các mặt bằng phẳng" msgid "Display faces smooth (using vertex normals)" -msgstr "Hiển thị mặt kiểu mịn (dùng pháp tuyến đỉnh)" +msgstr "Hiển thị các mặt mịn màng (dùng các pháp tuyến điểm đỉnh)" msgctxt "Operator" msgid "Fill" -msgstr "Làm Đầy" +msgstr "Vùng/Tô Phủ Kín/Lấp Đầy" msgid "Fill a selected edge loop with faces" -msgstr "Làm đầy một vòng cạnh bằng mặt" +msgstr "Lấp kín một vòng cạnh đã chọn bằng các mặt" msgid "Use best triangulation division" -msgstr "Sử dụng tam giác hóa tốt nhất" +msgstr "Dùng phương pháp tam giác hóa tốt nhất" msgctxt "Operator" msgid "Grid Fill" -msgstr "Làm Đầy Đồ Thị" +msgstr "Lấp Kín Khung Lưới Đồ Thị" msgid "Fill grid from two loops" -msgstr "Làm đầy đồ thị từ hai vòng" +msgstr "Lấp kín khung lưới đồ thị từ hai mạch lưới" msgid "Vertex that is the corner of the grid" -msgstr "Đinh được làm góc của đồ thị" +msgstr "Điểm đỉnh là góc của khung lưới đồ thị" msgid "Span" -msgstr "Xuyên Qua" +msgstr "Số Nhịp Nối" msgid "Number of grid columns" -msgstr "Số lượng cột đồ thị" +msgstr "Số cột của khung lưới đồ thị" msgid "Simple Blending" @@ -57933,82 +63473,91 @@ msgstr "Pha Trộn Đơn Giản" msgid "Use simple interpolation of grid vertices" -msgstr "Dùng suy nội đơn giản cho đỉnh đồ thị" +msgstr "Dùng sự nội suy đơn giản của các điểm đỉnh khung lưới đồ thị" msgctxt "Operator" msgid "Fill Holes" -msgstr "Đầy Lỗ" +msgstr "Lấp Lỗ Hổng" msgid "Fill in holes (boundary edge loops)" -msgstr "Đầy lỗ (vòng cạnh ranh giới)" +msgstr "Lấp kín các lỗ (vòng cạnh ranh giới)" msgid "Sides" -msgstr "Cạnh" +msgstr "Số Cạnh" msgid "Number of sides in hole required to fill (zero fills all holes)" -msgstr "Số lượng cạnh lỗ phải có để đầy lại (nếu = 0, đầy lại hết lỗ)" +msgstr "Số cạnh của lỗ đòi hỏi phải lấp kín (zê-rô nghĩa là lấp kín toàn bộ các lỗ)" msgctxt "Operator" msgid "Flip Normals" -msgstr "Lật Pháp Tuyến" +msgstr "Đảo Lật Pháp Tuyến" msgid "Flip the direction of selected faces' normals (and of their vertices)" -msgstr "Lật hướng pháp tuyến của mặt được chọn (và đỉnh của nó)" +msgstr "Đảo chiều pháp tuyến của các mặt được chọn (và các điểm đỉnh của chúng)" msgid "Custom Normals Only" -msgstr "Chỉ Pháp Tuyến Tùy Chọn" +msgstr "Duy Pháp Tuyến Tự Tạo" msgid "Only flip the custom loop normals of the selected elements" -msgstr "Chỉ lật pháp tuyến vòng tùy chọn của phần tử được chọn" +msgstr "Duy đảo nghịch pháp tuyến tựu tạo của phần tử đã được chọn" + + +msgctxt "Operator" +msgid "Flip Quad Tessellation" +msgstr "Đảo Lật Phân Hóa Tứ Giác" + + +msgid "Flips the tessellation of selected quads" +msgstr "Đảo lật phân hóa tứ giác đã chọn" msgid "Hide (un)selected vertices, edges or faces" -msgstr "Ẳn đỉnh, cạnh, và mặt (không) được chọn" +msgstr "Ẩn giấu các điểm đỉnh, cạnh, hoặc các mặt (chưa/được) chọn" msgctxt "Operator" msgid "Inset Faces" -msgstr "Nới Vào Mặt" +msgstr "Cắt Nội Các Mặt" msgid "Inset new faces into selected faces" -msgstr "Nới vào mặt mới vào mặt được chọn" +msgstr "Cắt nội những các mặt mới từ các mặt được chọn" msgid "Inset face boundaries" -msgstr "Nới vào ranh giới mặt" +msgstr "Ranh giới của mặt cắt nội" msgid "Edge Rail" -msgstr "Ray Cạnh" +msgstr "Bám theo Cạnh" msgid "Inset the region along existing edges" -msgstr "Nới vào vùng theo cạnh đang tồn tại" +msgstr "Cắt nội vùng dọc theo các cạnh hiện có" msgid "Individual face inset" -msgstr "Nới vào mặt riêng" +msgstr "Cắt nội riêng từng Mặt một" msgid "Blend face data across the inset" -msgstr "Pha trộn dữ liệu qua khoảng cách nới vào" +msgstr "Hòa trộn dữ liệu Mặt cho cả vùng cắt nội" msgid "Outset" -msgstr "Nới Ra" +msgstr "Cắt Ngoại" msgid "Outset rather than inset" -msgstr "Nới ra thay thế nới vào" +msgstr "Cắt ngoại, thay vì cắt nội" msgid "Select Outer" @@ -58016,7 +63565,7 @@ msgstr "Chọn Ngoài" msgid "Select the new inset faces" -msgstr "Chọn các mặt nới vào mới" +msgstr "Chọn các mặt cắt nội mới" msgctxt "Operator" @@ -58025,7 +63574,7 @@ msgstr "Giao Cắt (Dao)" msgid "Cut an intersection into faces" -msgstr "Cắt một vùng giao cắt thành hai mặt" +msgstr "Cắt một vùng giao cắt thành các mặt" msgid "Self Intersect" @@ -58037,19 +63586,19 @@ msgstr "Tự giao cắt các mặt được chọn" msgid "Selected/Unselected" -msgstr "Được Chọn/Chưa Chọn" +msgstr "Chọn/Chưa Chọn" msgid "Intersect selected with unselected faces" -msgstr "Giao cắt với các mặt chưa được chọn" +msgstr "Giao cắt các mặt được chọn với những cái chưa được chọn" msgid "Separate Mode" -msgstr "Chế Độ Chẻ" +msgstr "Chế Độ Tách Phân" msgid "Separate all geometry from intersections" -msgstr "Chẻ tất cả hình dạng từ vùng giao cắt" +msgstr "Tách phân toàn bộ các hình học khỏi vùng giao cắt" msgid "Cut" @@ -58057,23 +63606,23 @@ msgstr "Cắt" msgid "Cut into geometry keeping each side separate (Selected/Unselected only)" -msgstr "Cắt trong hình dạng mà giữ lại mỗi mặt riêng (Chỉ Cho Được Chọn/Chưa Chọn)" +msgstr "Cắt vào hình học, giữ mỗi bên biệt lập (Duy chế độ được Chọn/Chưa Chọn mà thôi)" msgid "Merge all geometry from the intersection" -msgstr "Gồm hết hình dạng từ vùng giao cắt" +msgstr "Hòa nhập toàn bộ các hình học ở vùng giao cắt" msgid "Which Intersect solver to use" -msgstr "Dùng trình giải nghiệm Giao Cắt nào" +msgstr "Trình giải nghiệm Giao Cắt nào để sử dụng" msgid "Faster solver, some limitations" -msgstr "Trình giải nghiệm nhanh hơn, mà có vài điều bị hạn chế" +msgstr "Trình giải nghiệm nhanh, tuy có một số giới hạn" msgid "Exact solver, slower, handles more cases" -msgstr "Trình giải nghiệm chính xác, được xử lý nhiều trường hợp hơn" +msgstr "Trình giải nghiệm chính xác, tuy chậm hơn, song giải quyết được nhiều trường hợp hơn" msgctxt "Operator" @@ -58082,7 +63631,7 @@ msgstr "Giao Cắt (Bool)" msgid "Cut solid geometry from selected to unselected" -msgstr "Cắt hình dạng rắn từ được chọn đến chưa chọn" +msgstr "Cắt hình học lập thể từ cái được chọn vào cái chưa được chọn" msgid "Boolean Operation" @@ -58090,32 +63639,32 @@ msgstr "Thao Tác Bool" msgid "Which boolean operation to apply" -msgstr "Áp dụng thao tác bool nào" +msgstr "Phép toán bool nào sẽ được áp dụng" msgid "Which Boolean solver to use" -msgstr "Sử dụng trình giải nghiệm Bool nào" +msgstr "Trình giải nghiệm phép toán Bool nào sẽ được sử dụng" msgid "Do self-union or self-intersection" -msgstr "Làm tự hợp hay tự giao cắt" +msgstr "Thi hành tự hợp nhất hoặc tự giao cắt" msgid "Swap" -msgstr "Trao Đổi" +msgstr "Tráo Đổi" msgid "Use with difference intersection to swap which side is kept" -msgstr "Dùng với thao tác giao cắt trừ cho trao đổi bên nào được giữ lại" +msgstr "Dùng với phương pháp giao cắt (bool) lấy hiệu, hòng để tráo đổi (sự lựa chọn) xem bên nào sẽ được giữ lại" msgctxt "Operator" msgid "Knife Project" -msgstr "Chiếu Dao" +msgstr "Dao Cắt Phóng Chiếu" msgid "Use other objects outlines and boundaries to project knife cuts" -msgstr "Dùng nét ranh giới của vật thể khác cho chiếu đường cắt của dao" +msgstr "Sử dụng đường viền của các đối tượng và các ranh giới để phóng chiếu các đường cắt của dao" msgid "Cut Through" @@ -58123,76 +63672,91 @@ msgstr "Cắt Xuyên Qua" msgid "Cut through all faces, not just visible ones" -msgstr "Cắt xuyên hết mặt, không phải chỉ mặt được hiển thị" +msgstr "Cắt xuyên qua toàn bộ các mặt, không chỉ những cái nhìn thấy được mà thôi" msgctxt "Operator" msgid "Knife Topology Tool" -msgstr "Dụng Cụ Dao Hình Dạng Học" +msgstr "Công Cụ Dao cho Cấu Trúc Liên Kết" msgid "Cut new topology" -msgstr "Cắt hình dạng học mới" +msgstr "Cắt cấu trúc liên kết mới" + + +msgctxt "Mesh" +msgid "Angle Snapping" +msgstr "Bám Dính vào Góc Độ" msgid "Angle snapping mode" -msgstr "Chế độ hút dính góc" +msgstr "Chế độ bám dính vào góc độ" msgid "No angle snapping" -msgstr "Không hút dính góc" +msgstr "Không bám dính vào góc độ" + + +msgctxt "Mesh" +msgid "Screen" +msgstr "Màn Hình" msgid "Screen space angle snapping" -msgstr "Hút dính góc trong không gian màn hình" +msgstr "Bám dính vào góc độ trong không gian màn hình" + + +msgctxt "Mesh" +msgid "Relative" +msgstr "Tương Đối" msgid "Angle snapping relative to the previous cut edge" -msgstr "Hút dính góc tương đối cạnh cắt trước" +msgstr "Bám dính góc độ tương đối với cạnh cắt trước" msgid "Angle Snap Increment" -msgstr "Bước Hút Dính Góc" +msgstr "Gia Lượng cho Góc Độ Bám Dính" msgid "The angle snap increment used when in constrained angle mode" -msgstr "Bước hút dính góc dùng khi bị hạn chế trong chế độ góc" +msgstr "Gia lượng góc độ bám dính, sử dụng khi đang ở trong chế độ ràng buộc vào góc độ" msgid "Only cut selected geometry" -msgstr "Chỉ cắt hình dạng được chọn" +msgstr "Chỉ cắt hình học được chọn mà thôi" msgid "Occlude Geometry" -msgstr "Hấp Thụ Hình Dạng" +msgstr "Hình Học Che Khuất" msgid "Only cut the front most geometry" -msgstr "Chỉ cắt hình dạng phía trước nhất" +msgstr "Chỉ cắt hình học nằm ở phía trước nhất mà thôi" msgid "Measurements" -msgstr "Số Đo" +msgstr "Đo Lường" msgid "Visible distance and angle measurements" -msgstr "Hiện khoảng cách và góc đo" +msgstr "Các đo lường về khoảng cách và góc độ sẽ được biểu hiện" msgid "Show no measurements" -msgstr "Không hiện số đo" +msgstr "Không hiển thị các đo lường" msgid "Show both distances and angles" -msgstr "Hiện cả khoảng cách và góc" +msgstr "Hiển thị cả hai, khoảng cách và góc độ" msgid "Show just distance measurements" -msgstr "Chỉ hiện khoảng cách đo" +msgstr "Chỉ hiển thị các đo lường về khoảng cách mà thôi" msgid "Show just angle measurements" -msgstr "Chỉ hiện góc đo" +msgstr "Chỉ hiển thị các đo lường về góc độ mà thôi" msgid "X-Ray" @@ -58200,38 +63764,38 @@ msgstr "X-Quang" msgid "Show cuts hidden by geometry" -msgstr "Hiện bộ phận được che bởi hình đạng" +msgstr "Hiển thị các vết cắt bị hình học ẩn giấu đi" msgctxt "Operator" msgid "Multi Select Loops" -msgstr "Chọn Đa Vòng" +msgstr "Chọn Nhiều Vòng Mạch" msgid "Select a loop of connected edges by connection type" -msgstr "Chọn một vòng cạnh kết nối tùy loại kết nối" +msgstr "Chọn một vòng mạch của các cạnh kết nối với nhau theo thể loại kết nối" msgid "Ring" -msgstr "Vành" +msgstr "Vành Đai" msgctxt "Operator" msgid "Loop Select" -msgstr "Chọn Vòng" +msgstr "Chọn Vòng Mạch" msgid "Select a loop of connected edges" -msgstr "Chọn một vòng của cạnh kết nối" +msgstr "Chọn một vòng mạch của các cạnh kết nối với nhau" msgctxt "Operator" msgid "Select Loop Inner-Region" -msgstr "Chọn Vòng Vùng-Nội Bộ" +msgstr "Chọn Vùng Bên Trong Vòng Mạch" msgid "Select region of faces inside of a selected loop of edges" -msgstr "Chọn vùng mặt ở trong một vòng cạnh được chọn" +msgstr "Chọn vùng các mặt nằm nội trong một vòng mạch của các cạnh được chọn" msgid "Select Bigger" @@ -58239,98 +63803,107 @@ msgstr "Chọn Lớn Hơn" msgid "Select bigger regions instead of smaller ones" -msgstr "Chọn vùng lớn hơn thay vùng nhỏ hơn" +msgstr "Chọn các vùng lớn hơn, thay vì những cái nhỏ hơn" msgctxt "Operator" msgid "Loop Cut" -msgstr "Cắt Vòng" +msgstr "Vòng Mạch Phân Chia" msgid "Add a new loop between existing loops" -msgstr "Thêm một vòng giữa vòng có sẵn" +msgstr "Thêm một vòng mạch giữa các vòng mạch hiện có" msgid "Edge Index" msgstr "Chỉ Số Cạnh" +msgid "Falloff type of the feather" +msgstr "Kiểu suy giảm dần của mép nhòe" + + +msgctxt "Mesh" +msgid "Object Index" +msgstr "Chỉ Số Đối Tượng" + + msgctxt "Operator" msgid "Loop Cut and Slide" -msgstr "Cắt Vòng Và Trượt" +msgstr "Vòng Mạch Cắt và Trượt Đẩy" msgid "Cut mesh loop and slide it" -msgstr "Cắt vòng mạng lưới và trượt nó" +msgstr "Vòng mạch cắt khung lưới và trượt đẩy nó" msgid "Loop Cut" -msgstr "Cắt Vòng" +msgstr "Vòng Mạch Cắt" msgid "Slide an edge loop along a mesh" -msgstr "Trượt một vòng cạnh theo một mạng lưới" +msgstr "Trượt đẩy một vòng cạnh dọc theo khung lưới" msgctxt "Operator" msgid "Mark Freestyle Edge" -msgstr "Ký Dấu Cạnh Phong Cách Tự Do" +msgstr "Đánh Dấu Cạnh PCTD" msgid "(Un)mark selected edges as Freestyle feature edges" -msgstr "(Xóa) ký dấu cạnh được chọn là cạnh đặc trưng Phong Cách Tự Do" +msgstr "(Xóa/Đánh) dấu các cạnh được chọn là các cạnh viền hình thể Phong Cách Tự Do (PCTD)" msgctxt "Operator" msgid "Mark Freestyle Face" -msgstr "Ký Dấu Mặt Phong Cách Tự Do" +msgstr "Đánh Dấu Mặt PCTD" msgid "(Un)mark selected faces for exclusion from Freestyle feature edge detection" -msgstr "(Xóa) ký dấu mặt để trừ loại từ phát hiện cạnh đặc trưng Phong Cách Tự Do" +msgstr "(Xóa/Đánh) dấu các mặt được chọn để loại trừ khỏi quá trình phát hiện cạnh viền hình thể Phong Cách Tự Do (PCTD)" msgctxt "Operator" msgid "Mark Seam" -msgstr "Ký Dấu Vết Sẹo" +msgstr "Đánh Dấu Đường Khâu" msgid "(Un)mark selected edges as a seam" -msgstr "(Xóa) ký dấu các cạnh được chọn là vết sẹo" +msgstr "(Xóa/Đánh) dấu các cạnh được chọn là đường khâu" msgctxt "Operator" msgid "Mark Sharp" -msgstr "Ký Dấu Bén" +msgstr "Đánh Dấu là Sắc Nhọn" msgid "(Un)mark selected edges as sharp" -msgstr "(Xóa) ký dấu cạnh được chọn là bén" +msgstr "(Xóa/đánh) dấu các cạnh được chọn là sắc nhọn" msgid "Consider vertices instead of edges to select which edges to (un)tag as sharp" -msgstr "Quan tâm đỉnh thay thế cạnh khi chọn cạnh nào được (xóa) ký dấu là nhọn" +msgstr "Cân nhắc các điểm đỉnh, thay vì các cạnh, để chọn những cạnh nào để (xóa/đánh) nhãn là sắc nhọn" msgctxt "Operator" msgid "Merge" -msgstr "Gồm" +msgstr "Hợp Nhất" msgid "Merge selected vertices" -msgstr "Gồm các đỉnh được chọn" +msgstr "Hội nhập các điểm đỉnh được chọn" msgid "Merge method to use" -msgstr "Dùng phương pháp nào" +msgstr "Phương pháp hợp nhất sử dụng" msgid "At Center" -msgstr "Tại Trung Tâm" +msgstr "Tại Tâm" msgid "At Cursor" -msgstr "Tại Con Trỏ" +msgstr "Tại Vị Trí Con Trỏ" msgid "At First" @@ -58342,29 +63915,29 @@ msgstr "Tại Cuối" msgid "Move UVs according to merge" -msgstr "Di chuyển UV tùy việc gồm" +msgstr "Di chuyển các UV tùy theo phương pháp hợp nhất" msgctxt "Operator" msgid "Merge Normals" -msgstr "Gồm Pháp Tuyến" +msgstr "Hợp Nhất Pháp Tuyến" msgid "Merge custom normals of selected vertices" -msgstr "Gồm pháp tuyến tùy chọn của đỉnh được chọn" +msgstr "Hội nhập các pháp tuyến tùy chỉnh của những điểm đỉnh đã chọn" msgctxt "Operator" msgid "Face Normals Strength" -msgstr "Sức Pháp Tuyến Mặt" +msgstr "Cường Độ Pháp Tuyến Mặt" msgid "Set/Get strength of face (used in Weighted Normal modifier)" -msgstr "Đặt/lấy sức của mặt (được dùng cho bộ điều chỉnh Pháp tuyến Có Quyền Lượng)" +msgstr "Đặt/Đọc cường độ (sức mạnh) của Mặt (sử dụng trong bộ điều chỉnh Pháp Tuyến Cân Trọng)" msgid "Strength to use for assigning or selecting face influence for weighted normal modifier" -msgstr "Sức để dùng cho chỉ định hay chọn sự ảnh hưởng mặt của bộ điều chỉnh pháp tuyến quyền lượng" +msgstr "Sức mạnh sử dụng để chỉ định hoặc lựa chọn tác động của Mặt trong bộ điều chỉnh pháp tuyến cân trọng" msgid "Weak" @@ -58372,7 +63945,7 @@ msgstr "Yếu" msgid "Strong" -msgstr "Khỏe" +msgstr "Mạnh" msgid "Set Value" @@ -58385,48 +63958,56 @@ msgstr "Đặt giá trị của các mặt" msgctxt "Operator" msgid "Recalculate Normals" -msgstr "Tính Lại Pháp Tuyến" +msgstr "Tính Toán Lại Pháp Tuyến" msgid "Make face and vertex normals point either outside or inside the mesh" -msgstr "Làm pháp tuyến của mặt và đỉnh chỉ ra ngaòi hay chỉ vào trong mạng lưới" +msgstr "Làm cho các pháp tuyến của Mặt và của điểm đỉnh hướng ra ngoài hoặc hướng vào trong khung lưới" msgctxt "Operator" msgid "Normals Vector Tools" -msgstr "Dụng Cụ Pháp Tuyến" +msgstr "Công Cụ Véctơ của Pháp Tuyến" msgid "Custom normals tools using Normal Vector of UI" -msgstr "Dụng Cụ pháp tuyến tùy chọn đang dùng Pháp Tuyến của Giao Diện" +msgstr "Những công cụ pháp tuyến tùy chỉnh sử dụng Véctơ Pháp Tuyến của Giao Diện Người Dùng (UI)" msgid "Absolute Coordinates" -msgstr "Tọa Độ tuyệt Đối" +msgstr "Tọa Độ Tuyệt Đối" msgid "Copy Absolute coordinates or Normal vector" -msgstr "Chép lại tọa đồ Tuyệt Đối hay Pháp Tuyến" +msgstr "Sao chép các tốc độ Tuyệt Đối hoặc véctơ Pháp Tuyến" msgid "Mode of tools taking input from interface" -msgstr "Chế độ của dụng cụ đang nhận ngõ vào từ giao diện" +msgstr "Chế độ mà các công cụ lấy nhập liệu cung cấp từ giao diện vào" msgid "Copy Normal" -msgstr "Chép Lại Pháp Tuyến" +msgstr "Sao Chép Pháp Tuyến" + + +msgid "Copy normal to the internal clipboard" +msgstr "Sao chép pháp tuyến vào bảng nhớ tạm nội bộ" msgid "Paste Normal" msgstr "Dán Pháp Tuyến" +msgid "Paste normal from the internal clipboard" +msgstr "Dán pháp tuyến từ bảng nhớ tạm nội bộ" + + msgid "Add Normal" msgstr "Thêm Pháp Tuyến" msgid "Add normal vector with selection" -msgstr "Thêm pháp tuyến với sự lựa chọn" +msgstr "Thêm véctơ pháp tuyến vào lựa chọn" msgid "Multiply Normal" @@ -58434,108 +64015,112 @@ msgstr "Nhân Pháp Tuyến" msgid "Multiply normal vector with selection" -msgstr "Nhân pháp tuyến với sự lựa chọn" +msgstr "Nhân véctơ pháp tuyến với lựa chọn" msgid "Reset Normal" -msgstr "Đặt Lại Pháp Tuyến" +msgstr "Hoàn Lại Pháp Tuyến" + + +msgid "Reset the internal clipboard and/or normal of selected element" +msgstr "Hoàn lại bảng nhớ tạm nội bộ và/hoặc pháp tuyến của phần tử đã chọn" msgctxt "Operator" msgid "Offset Edge Loop" -msgstr "Dịch Vòng Cạnh" +msgstr "Dịch Chuyển Vòng Cạnh" msgid "Create offset edge loop from the current selection" -msgstr "Chế tạo vòng cạnh địch từ sự lựa chọn hiện tại" +msgstr "Kiến Tạo vòng cạnh thêm nằm lệch đi từ lựa chọn hiện tại" msgid "Cap Endpoint" -msgstr "Nắp Điểm Kết Thúc" +msgstr "Đóng Nắp Điểm Cuối" msgid "Extend loop around end-points" -msgstr "Kéo ra vòng quanh điểm kết thúc" +msgstr "Nới vòng mạch chung quanh các điểm kết" msgctxt "Operator" msgid "Offset Edge Slide" -msgstr "Trượt Cạnh Dịch" +msgstr "Dịch Chuyển Cạch Trượt Đẩy" msgid "Offset edge loop slide" -msgstr "Trượt vòng cạnh dịch" +msgstr "Dịch chuyển cạch trượt đẩy" msgid "Offset Edge Loop" -msgstr "Vòng Cạnh Địch" +msgstr "Dịch Chuyển Vòng Cạnh" msgctxt "Operator" msgid "Mask Extract" -msgstr "Rút Ra Mặt Nạ" +msgstr "Trích Xuất Màn Chắn Lọc" msgid "Create a new mesh object from the current paint mask" -msgstr "Chế tạo một vật thể mạng lưới từ mặt nạ hiện tại" +msgstr "Kiến tạo một đối tượng khung lưới mới từ màn chắn lọc sơn hiện tại" msgid "Minimum mask value to consider the vertex valid to extract a face from the original mesh" -msgstr "Giá trị mặt nạ cực tiểu để chấp nhận đỉnh là hợp lệ cho rút được một mặt từ mạng lưới ban đầu" +msgstr "Giá trị màn chắn lọc tối thiểu để (có thể) cân nhắc điểm đỉnh là hợp lệ, hòng trích xuất Mặt ra khỏi khung lưới gốc" msgctxt "Operator" msgid "Mask Slice" -msgstr "Mặt Nạ Miến Lát" +msgstr "Cắt Rời vùng Chắn Lọc" msgid "Slices the paint mask from the mesh" -msgstr "Lát mặt nạ sơn từ mạng lưới" +msgstr "Cắt lát vùng chắn lọc được vẽ bằng sơn ra khỏi khung lưới" msgid "Fill Holes" -msgstr "Đầy Lỗ" +msgstr "Lấp Lỗ Hổng" msgid "Fill holes after slicing the mask" -msgstr "Đầy lỗ sau lát mạng lưới" +msgstr "Lấp các lỗ hổng sau khi cắt lát vùng chắn lọc" msgid "Slice to New Object" -msgstr "Lát đến Vật Thể Mới" +msgstr "Cắt Rời thành Đối Tượng Mới" msgid "Create a new object from the sliced mask" -msgstr "Chế tạo một vật thể mới từ mặt nạ bị lát" +msgstr "Kiến Tạo một đối tượng mới từ vùng chắn lọc đã được cắt lát ra" msgctxt "Operator" msgid "Point Normals to Target" -msgstr "Chỉ Pháp tuyến đến Mục Tiêu" +msgstr "Hướng Pháp Tuyến vào Mục đích" msgid "Point selected custom normals to specified Target" -msgstr "Chỉ pháp tuyến tùy chọn được chọn đến một mục tiêu được xác định" +msgstr "Hướng các pháp tuyến tùy chỉnh đã chọn vào Mục Đích chỉ định" msgid "Make all affected normals parallel" -msgstr "Làm hết pháp tuyến được ảnh hưởng song song nhau" +msgstr "Làm cho toàn bộ các pháp tuyến ảnh hưởng nằm song song" msgid "Invert affected normals" -msgstr "Lật pháp tuyến được ảnh hưởng" +msgstr "Đảo Ngược các pháp tuyến ảnh hưởng" msgid "How to define coordinates to point custom normals to" -msgstr "Làm sao được xác định tọa độ pháp tuyến được chỉ đến" +msgstr "Phương pháp định nghĩa các tọa độ để hướng các pháp tuyến tùy chỉnh vào" msgid "Use static coordinates (defined by various means)" -msgstr "Dùng tọa độ tĩnh (được xác định bằng nhiều cách khác nhau)" +msgstr "Sử dụng các tọa độ tĩnh (được định nghĩa theo nhiều cách)" msgid "Follow mouse cursor" -msgstr "Theo dõi con tro chuột" +msgstr "Đi theo con trỏ chuột" msgid "Spherize" @@ -58543,44 +64128,44 @@ msgstr "Hình Cầu Hóa" msgid "Interpolate between original and new normals" -msgstr "Suy nội giữa pháp tuyến ban đầu và pháp tuyến mới" +msgstr "Nội suy giữa các pháp tuyến gốc và những cái mới" msgid "Spherize Strength" -msgstr "Sức Hình Cầu Hóa" +msgstr "Cường Độ Hình Cầu Hóa" msgid "Ratio of spherized normal to original normal" -msgstr "Tỉ số pháp tuyến hình cầu hóa với pháp tuyến ban đầu" +msgstr "Tỷ lệ giữa pháp tuyến được hình cầu hóa và pháp tuyến gốc" msgid "Target location to which normals will point" -msgstr "Vị trí mục tiêu để chỉ hướng pháp tuyến đến" +msgstr "Vị trí mục tiêu mà các pháp tuyến sẽ hướng vào" msgctxt "Operator" msgid "Poke Faces" -msgstr "Chọc Mặt" +msgstr "Phân Nan Quạt Các Mặt" msgid "Split a face into a fan" -msgstr "Chẻ mặt thành một quạt" +msgstr "Tách phân Mặt thành một hình quạt (dùng hình như nan bánh xe đạp)" msgid "Poke Center" -msgstr "Chọc Trung Tâm" +msgstr "Tâm của Nan Quạt" msgid "Poke face center calculation" -msgstr "Tính chọc trung tâm mặt" +msgstr "Phép tính tâm phân nan Mặt" msgid "Weighted Median" -msgstr "Trung Vị Có Quyền Lượng" +msgstr "Trung Bình Trọng" msgid "Weighted median face center" -msgstr "Trung tâm mặt trung vị có quyền lượng" +msgstr "Tâm Mặt bằng phép trung bình trọng" msgid "Median" @@ -58588,45 +64173,45 @@ msgstr "Trung Vị" msgid "Median face center" -msgstr "Trung tâm của trung vị mặt" +msgstr "Tâm Mặt bằng phương pháp trung bình hóa" msgid "Face bounds center" -msgstr "Trung tâm của ranh giới Mặt" +msgstr "Tâm của ranh giới Mặt" msgid "Poke Offset" -msgstr "Chọc Dịch" +msgstr "Dịch Chuyển của Nan Quạt" msgctxt "Operator" msgid "Poly Build Delete at Cursor" -msgstr "Xây Đựng Xóa Đa Giác tại Con Trỏ" +msgstr "Dựng Đa Giác: Xóa tại Con Trỏ" msgctxt "Curve" msgid "Proportional Falloff" -msgstr "Sự Giảm Đồng Biến" +msgstr "Dốc Suy Giảm Cân Đối" msgid "Falloff type for proportional editing mode" -msgstr "Loại sự giảm cho chế độ biên tập đồng biến" +msgstr "Loại dốc suy giảm dành cho Chế Độ Biên Soạn cân đối" msgid "Constant falloff" -msgstr "Sự giảm hằng số" +msgstr "Dốc suy giảm bất biến" msgid "Random falloff" -msgstr "Sự giảm ngẫu nhiên" +msgstr "Dốc suy giảm ngẫu nhiên" msgid "Proportional Size" -msgstr "Kích Cỡ Đồng Biến" +msgstr "Kích Thước Cân Đối" msgid "Always confirm operation when releasing button" -msgstr "Lần nào xác nhân thao tác khi thả nút" +msgstr "Luôn luôn xác nhận thao tác khi thả nút ra" msgid "Use accurate transformation" @@ -58634,87 +64219,87 @@ msgstr "Dùng biến hóa chính xác" msgid "Proportional Editing" -msgstr "Biên Tập Đồng Biến" +msgstr "Biên Soạn Cân Đối" msgid "Projected (2D)" -msgstr "Được Chiếu (2D)" +msgstr "Phóng Chiếu (2D)" msgctxt "Operator" msgid "Poly Build Dissolve at Cursor" -msgstr "Hóa Tàn Xây Dựng Đa Giác tại Con Trỏ" +msgstr "Dựng Đa Giác: Tiêu Hủy tại Con Trỏ" msgctxt "Operator" msgid "Extrude at Cursor Move" -msgstr "Kéo Ra tại Động Chuyển Con Trỏ" +msgstr "Đẩy Trồi khi Di Chuyển Con Trỏ" msgid "Poly Build Transform at Cursor" -msgstr "Xây Đựng Biến Hóa Đa Giác tại Con Trỏ" +msgstr "Dựng Đa Giác: Biến Hóa tại Con Trỏ" msgctxt "Operator" msgid "Poly Build Face at Cursor" -msgstr "Mặt Xây Dựng Đa Giác tại Con Trỏ" +msgstr "Dựng Đa Giác: Mặt tại Con Trỏ" msgid "Create Quads" -msgstr "Chế tạo tư giác" +msgstr "Kiến Tạo Tứ Giác" msgid "Automatically split edges in triangles to maintain quad topology" -msgstr "Tự động chẻ cạnh trong tam giác cho bảo trì hình dáng học tư giác" +msgstr "Tự động tách phân các cạnh trong tam giác để duy trì cấu trúc liên kết tứ giác" msgctxt "Operator" msgid "Face at Cursor Move" -msgstr "Di Chuyển Mặt tại Con Trỏ" +msgstr "Mặt khi Con Trỏ Di Chuyển" msgid "Poly Build Face at Cursor" -msgstr "Xây Đựng Mặt Đa Giác tại Con Trỏ" +msgstr "Dựng Đa Giác: Mặt tại Con Trỏ" msgctxt "Operator" msgid "Poly Build Split at Cursor" -msgstr "Xây Đựng Đa Giác Chẻ tại Con Trỏ" +msgstr "Dựng Đa Giác: Phân Chia tại Con Trỏ" msgctxt "Operator" msgid "Split at Cursor Move" -msgstr "Chẻ tại Di Chuyển Con Trỏ" +msgstr "Tách Phân khi Con Trỏ Di Chuyển" msgid "Poly Build Split at Cursor" -msgstr "Xây Đựng Đa Giác Chẻ tại Con Trỏ" +msgstr "Dựng Đa Giác: Phân Chia tại Con Trỏ" msgctxt "Operator" msgid "Poly Build Transform at Cursor" -msgstr "Xây Dựng Biến Hóa Đa Giác tại Con Trỏ" +msgstr "Dựng Đa Giác: Biến Hóa tại Con Trỏ" msgctxt "Operator" msgid "Transform at Cursor Move" -msgstr "Biến Hóa tại Chuyển Động Con Trỏ" +msgstr "Biến Hóa khi Con Trỏ Di Chuyển" msgid "Construct a circle mesh" -msgstr "Xây dựng một mạng lưới vòng tròn" +msgstr "Kiến tạo một khung lưới vòng tròn" msgid "Generate UVs" -msgstr "Chế Tạo UV" +msgstr "Sinh Tạo các UV" msgid "Generate a default UV map" -msgstr "Chế tạo một bản đồ UV mặc định" +msgstr "Sinh tạo một ánh xạ UV mặc định" msgid "Don't fill at all" -msgstr "Hoàn toàn đừng đầy" +msgstr "Để hở (không tô kín)" msgid "Use n-gons" @@ -58722,11 +64307,11 @@ msgstr "Dùng đa giác" msgid "Triangle Fan" -msgstr "Quạt Tam Giác" +msgstr "Hình Rẻ Quạt" msgid "Use triangle fans" -msgstr "Dùng quạt tam giác" +msgstr "Dùng hình rẻ quạt" msgctxt "Operator" @@ -58735,28 +64320,28 @@ msgstr "Thêm Hình Nón" msgid "Construct a conic mesh" -msgstr "Xây dựng một mạng lưới hình nón" +msgstr "Kiến tạo một khung lưới hình nón" msgid "Base Fill Type" -msgstr "Cơ Sở Loại Đầy" +msgstr "Kiểu Phủ Đáy" msgid "Radius 1" -msgstr "Bán kính 1" +msgstr "Bán Kính 1" msgid "Radius 2" -msgstr "Bán kính 2" +msgstr "Bán Kính 2" msgctxt "Operator" msgid "Add Cube" -msgstr "Thêm Lập Phương" +msgstr "Thêm Khối Lập Phương" msgid "Construct a cube mesh" -msgstr "Xây dựng một mạng lưới lập phương" +msgstr "Kiến tạo một khung lưới hình lập phương" msgctxt "Operator" @@ -58765,28 +64350,28 @@ msgstr "Thêm Hình Trụ" msgid "Construct a cylinder mesh" -msgstr "Xây đựng một mạng lưới hình trụ" +msgstr "Kiến tạo một khung lưới hình trụ" msgid "Cap Fill Type" -msgstr "Loại Đầy Nắp" +msgstr "Kiểu Phủ Nắp Đầu" msgctxt "Operator" msgid "Add Grid" -msgstr "Thêm Đồ Thị" +msgstr "Thêm Khung Lưới Đồ Thị" msgid "Construct a grid mesh" -msgstr "Xây đựng một lưới đồ thị" +msgstr "Kiến tạo một khung lưới đồ thị" msgid "X Subdivisions" -msgstr "Số Phân Hóa X" +msgstr "Lượng Phân Hóa X" msgid "Y Subdivisions" -msgstr "Số Phân Hóa Y" +msgstr "Lượng Phân Hóa Y" msgctxt "Operator" @@ -58795,25 +64380,25 @@ msgstr "Thêm Hình Cầu Nhị Thập Diện" msgid "Construct an Icosphere mesh" -msgstr "Xây đựng một hình cầu nhị thập diện" +msgstr "Kiến tạo một khung lưới Hình Cầu Nhị Thập Diện" msgctxt "Operator" msgid "Add Monkey" -msgstr "Thêm Đồu Con Khỉ" +msgstr "Thêm Đầu Con Khỉ" msgid "Construct a Suzanne mesh" -msgstr "Tạo mạng lưới đầu con khỉ" +msgstr "Kiến tạo một khung lưới tên là Su-zan (đầu khỉ)" msgctxt "Operator" msgid "Add Plane" -msgstr "Thêm Mặt Phẳng" +msgstr "Thêm Bình Diện" msgid "Construct a filled planar mesh with 4 vertices" -msgstr "Xây một mạng lưới mặt phẳng đầy với 4 đỉnh" +msgstr "Tạo một khung lưới mặt phẳng tô kín với 4 điểm đỉnh" msgctxt "Operator" @@ -58822,55 +64407,55 @@ msgstr "Thêm Hình Xuyến" msgid "Construct a torus mesh" -msgstr "Xây đựng một lưới hình xuyến" +msgstr "Kiến tạo một khung lưới hình xuyến" msgid "Exterior Radius" -msgstr "Bán Kính Ngoại" +msgstr "Bán Kính Bên Ngoài" msgid "Total Exterior Radius of the torus" -msgstr "Tổng Bánh Kính Ngoại của hình xuyến" +msgstr "Bán Kính Bên Ngoài của Hình Xuyến" msgid "Interior Radius" -msgstr "Bán Kính Nội" +msgstr "Bán Kính Bên Trong" msgid "Total Interior Radius of the torus" -msgstr "Tổng Bánh Kính Nội của hình xuyến" +msgstr "Bán Kính Bên Trong của Hình Xuyến" msgid "Major Radius" -msgstr "Bán Kính Vòng" +msgstr "Bán Kính Chính" msgid "Radius from the origin to the center of the cross sections" -msgstr "Bán kính từ trung tâm vòng đến trung tâm ống" +msgstr "Bán kính từ trục gốc đến trung tâm của mặt cắt" msgid "Major Segments" -msgstr "Khúc Quanh Lỗ" +msgstr "Số Phân Đoạn Chính" msgid "Number of segments for the main ring of the torus" -msgstr "Số lượng khúc quanh lỗ của hình xuyến" +msgstr "Số lượng phân đoạn quanh vòng của hình xuyến" msgid "Minor Radius" -msgstr "Bán Kính Ống" +msgstr "Bán Kính Phụ" msgid "Radius of the torus' cross section" -msgstr "Bán kính của ống hình xuyến" +msgstr "Bán kính mặt cắt của hình xuyến" msgid "Minor Segments" -msgstr "Khúc Ống" +msgstr "Số Phân Đoạn Phụ" msgid "Number of segments for the minor ring of the torus" -msgstr "Số lượng khúc cho ống của hình xuyến" +msgstr "Số lượng phân đoạn quanh mặt cắt của hình xuyến" msgid "Dimensions Mode" @@ -58878,19 +64463,19 @@ msgstr "Chế Độ Kích Thước" msgid "Major/Minor" -msgstr "Vòng/Ống" +msgstr "Chính/Phụ" msgid "Use the major/minor radii for torus dimensions" -msgstr "Dùng bán kính vòng/ống cho kích thước hình xuyến" +msgstr "Dùng bán kính chủ yếu/thứ yếu cho các kích thước của hình xuyến" msgid "Exterior/Interior" -msgstr "Ngoại/Nội" +msgstr "Bên Ngoài/Bên Trong" msgid "Use the exterior/interior radii for torus dimensions" -msgstr "Dùng bán kính ngoài/trong cho kích thước hình xuyến" +msgstr "Dùng bán kính nội/ngoại cho các kích thước của hình xuyến" msgctxt "Operator" @@ -58899,265 +64484,270 @@ msgstr "Thêm Hình Cầu UV" msgid "Construct a UV sphere mesh" -msgstr "Xây mạng lưới hình cầu UV (kinh/vĩ tuyến)" +msgstr "Kiến tạo khung lưới hình cầu UV" msgctxt "Operator" msgid "Align (rotate) object to XY plane" -msgstr "Sắp Xếp (xoay) vật thể đến mặt phẳng X" +msgstr "Căn chỉnh (xoay chiều) đối tượng với bình diện XY" msgid "Rotates entire object (not mesh) so the selected faces/vertices lie, on average, parallel to the XY plane (it does not adjust Z location)" -msgstr "Xoay toàn bộ vật thể (không phải mạng lưới) cho các mặt/đỉnh được chọn nằm (trung bình) song song trên mặt phẳng XY (nó không chỉnh vị trí Z)" +msgstr "Xoay chiều toàn bộ đối tượng (không phải khung lưới) để các mặt / điểm đỉnh đã chọn, trung bình mà nói nằm song song với bình diện XY (không điều chỉnh vị trí Z)" msgctxt "Operator" msgid "3D-Print Check All" -msgstr "In 3D - Kiểm Tra Hết" +msgstr "In Ấn-3D Kiểm Tra Toàn Bộ" msgid "Run all checks" -msgstr "Chạy tất cả các kiểm tra " +msgstr "Thi hành toàn bộ các tra cứu" msgctxt "Operator" msgid "3D-Print Check Degenerate" -msgstr "In 3D - Kiểm Tra Thoái Hóa" +msgstr "In Ấn-3D: Kiểm Tra tình trạng Suy Biến" msgid "Check for degenerate geometry that may not print properly (zero area faces, zero length edges)" -msgstr "Kiểm tra có hình dạng thoái hóa có thể in không đúng (mặt diện tích không, cạnh bề dài không)" +msgstr "Kiểm tra hình học suy biến, tức những cái có thể không in được chỉnh chu (các mặt có diện tích bằng không, các cạnh có chiều dài bằng không)" msgctxt "Operator" msgid "3D-Print Check Distorted Faces" -msgstr "In 3D - Kiểm Tra Mặt Bị Méo" +msgstr "In Ấn-3D: Kiểm Tra các Mặt Biến Dạng" msgid "Check for non-flat faces" -msgstr "Kiểm tra có mặt không bằng phẳng" +msgstr "Kiểm tra/lùng tìm những các mặt không bằng phẳng" msgctxt "Operator" msgid "3D-Print Check Intersections" -msgstr "In 3D - Kiêm Tra Tự Giao Cắt" +msgstr "In Ấn-3D: Kiểm Tra Giao Cắt" msgid "Check geometry for self intersections" -msgstr "Kiểm tra có hình dạng tự giao cắt" +msgstr "Kiểm tra xem hình học có tự giao cắt hay không" msgctxt "Operator" msgid "3D-Print Check Overhang" -msgstr "In 3D - Nhô Ra" +msgstr "In Ấn-3D: Kiểm Tra tình trạng Nhô Ra/Lơ Lửng" msgid "Check faces don't overhang past a certain angle" -msgstr "Kiểm tra mặt cho không nhô ra ngoài hơn một góc được xác định" +msgstr "Kiểm tra các mặt không nhô ra/lơ lửng hơn một góc độ nhất định" msgctxt "Operator" msgid "3D-Print Check Sharp" -msgstr "In 3D - Kiểm Tra Bén" +msgstr "In Ấn-3D: Kiểm Tra tình trạng Sắc Nhọn" msgid "Check edges are below the sharpness preference" -msgstr "Kiểm tra cạnh có độ bén thấp hơn ngưỡng tùy chọn" +msgstr "Kiểm tra xem các cạnh có độ sắc nhọn thấp hơn giá trị ưa thích hay không" msgctxt "Operator" msgid "3D-Print Check Solid" -msgstr "In 3D - Kiềm Tra Rắn " +msgstr "In Ấn-3D: Kiểm Tra Khối Đặc" msgid "Check for geometry is solid (has valid inside/outside) and correct normals" -msgstr "Kiểm tra hình dạng rắn (có bên trong/bên ngoài hợp lệ) và pháp tuyến đúng" +msgstr "Kiểm tra xem hình học có phải là khối đặc hay không (có bên trong/bên ngoài hợp lệ) và có pháp tuyến đúng đắn" msgctxt "Operator" msgid "3D-Print Check Thickness" -msgstr "In 3D - Kiểm Tra Bề Dày" +msgstr "In Ấn-3D: Kiểm Tra Độ Dày" msgid "Check geometry is above the minimum thickness preference (relies on correct normals)" -msgstr "Kiểm tra bề dày vật thể hơn ngưỡng từy chọn (kiểm tra này nhờ pháp tuyến đúng)" +msgstr "Kiểm tra độ dày của hình học cao hơn sắp đặt ưa thích (dựa vào pháp tuyến đúng hướng)" msgctxt "Operator" msgid "3D-Print Clean Distorted" -msgstr "In 3D - Làm Sạch Bị Méo" +msgstr "In Ấn-3D: Dọn Dẹp sự Biến Dạng" msgid "Tessellate distorted faces" -msgstr "Tam giác hóa mặt bị méo" +msgstr "Phân lưới tổ ong các mặt bị biến dạng" msgid "Limit for checking distorted faces" -msgstr "Giới hạn cho kiểm tra mặt bị méo hóa" +msgstr "Giới hạn cho việc kiểm tra các mặt bị biến dạng" msgctxt "Operator" msgid "3D-Print Clean Non-Manifold" -msgstr "In 3D - Làm Sạch Vô Đa Tập" +msgstr "In Ấn-3D: Dọn Dẹp tình trạng Phi Đa Tạp" msgid "Cleanup problems, like holes, non-manifold vertices and inverted normals" -msgstr "Xóa các vấn đề, như lỗ, đỉnh vô đa tập, và pháp tuyến nghịch hướng" +msgstr "Dọn dẹp các vướng mắc như các hố hổng, điểm đỉnh phi đa tạp và các pháp tuyến đảo nghịch" msgid "Minimum distance between elements to merge" -msgstr "Khoảng cách cực tiểu cho gồm phần tử" +msgstr "Khoảng cách tối thiểu giữa các phần tử để hợp nhất" msgctxt "Operator" msgid "3D-Print Export" -msgstr "In 3D - Xuất" +msgstr "In Ấn-3D: Xuất Khẩu" msgid "Export selected objects using 3D-Print settings" -msgstr "Xuất các vật thể được chọn bằng cài đặt In 3D" +msgstr "Xuất khẩu các đối tượng dùng những sắp đặt In Ấn-3D" msgctxt "Operator" msgid "3D-Print Info Area" -msgstr "In 3D - Thông Tin Diện Tích" +msgstr "In Ấn-3D: Thông Tin về Diện Tích" msgid "Report the surface area of the active mesh" -msgstr "Báo diện tích của mạng lưới hoạt động" +msgstr "Thông Báo về diện tích bề mặt của khung lưới đang hoạt động" msgctxt "Operator" msgid "3D-Print Info Volume" -msgstr "In 3D - Thông Tin Thể Tích" +msgstr "In Ấn-3D: Thông Tin về Thể Tích" msgid "Report the volume of the active mesh" -msgstr "Báo thể tích của mạng lưới hoạt động" +msgstr "Thông Báo về thể tích của khung lưới đang hoạt động" msgctxt "Operator" msgid "Scale to Bounds" -msgstr "Phóng To Đến Ranh Giới" +msgstr "Đổi Tỷ Lệ cho Khít Ranh Giới" msgid "Scale edit-mesh or selected-objects to fit within a maximum length" -msgstr "Phóng to mạng lưới biên tập hay vật thể được chọn cho vừa một bề dài cực đại" +msgstr "Đổi tỷ lệ khung lưới biên soạn, hoặc đối tượng được chọn, để khít vừa một chiều dài tối đa" msgid "Length Limit" -msgstr "Giới Hạn Bề Dài" +msgstr "Giới Hạn Chiều Dài" msgctxt "Operator" msgid "Scale to Volume" -msgstr "Phóng To Đến Thề Tích" +msgstr "Tỷ Lệ Hóa thành Thể Tích" msgid "Scale edit-mesh or selected-objects to a set volume" -msgstr "Phóng to mạng lưới biên tập hay vật thể được chọn đến một thể tích được xác định" +msgstr "Đổi tỷ lệ khung lưới biên soạn, hoặc đối tượng được chọn, thành một thể tích nhất định" msgctxt "Operator" msgid "3D-Print Select Report" -msgstr "In 3D - Chọn Biên Bản" +msgstr "In Ấn-3D: Chọn Báo Cáo" msgid "Select the data associated with this report" -msgstr "Chọn các dữ liệu thuộc biên bản này" +msgstr "Chọn các dữ liệu liên quan với bản thông báo này" msgctxt "Operator" msgid "Triangulate Faces" -msgstr "Mặt Thành Tam Giác" +msgstr "Tam Giác Hóa các Mặt" msgid "Triangulate selected faces" -msgstr "Chia các mặt được chọn thành tam giác" +msgstr "Biến các mặt đã chọn thành tam giác" msgctxt "Operator" msgid "Select Boundary Loop" -msgstr "Chọn Vòng Ranh Giới" +msgstr "Chọn Vòng Mạch Ranh Giới" msgid "Select boundary edges around the selected faces" -msgstr "Chọn các cạnh của ranh giới vòng mặt được chọn" +msgstr "Chọn các cạnh ranh giới vòng quanh các mặt được chọn" msgid "Merge vertices based on their proximity" -msgstr "Gồm đỉnh tùy khoảng cách xa" +msgstr "Hội nhập các điểm đỉnh dựa trên tính lân cận của chúng" msgid "Sharp Edges" -msgstr "Cạnh Bén" +msgstr "Cạnh Sắc" msgid "Calculate sharp edges using custom normal data (when available)" -msgstr "Tính cạnh bén bằng dùng dữ liệu pháp tuyến tùy chọn (khi có)" +msgstr "Tính toán cạnh sắc dùng dữ liệu pháp tuyến tùy chỉnh (khi khả dụng)" msgid "Merge selected to other unselected vertices" -msgstr "Gồm đỉnh được chọn với các đỉnh chưa chọn" +msgstr "Hội nhập các điểm đỉnh được chọn với những các chưa chọn" msgid "Reveal all hidden vertices, edges and faces" -msgstr "Hiện hết đỉnh, cạnh, và mặt bị ẩn" +msgstr "Hiện toàn bộ các điểm đỉnh, các cạnh, và các mặt bị ẩn giấu" msgctxt "Operator" msgid "Rip" -msgstr "Xé" +msgstr "Phân Xé" msgid "Disconnect vertex or edges from connected geometry" -msgstr "Ngắt đỉnh hay cạnh từ hình dạng kết nối" +msgstr "Tách của các điểm đỉnh hoặc các cạnh khỏi hình học được kết nối với nhau" + + +msgctxt "Mesh" +msgid "Fill" +msgstr "Lấp Đầy" msgid "Fill the ripped region" -msgstr "Đầy lại vùng được xé" +msgstr "Lấp đầy vùng bị xé ra" msgctxt "Operator" msgid "Extend Vertices" -msgstr "Kéo Ra Đỉnh" +msgstr "Nới các Điểm Đỉnh ra" msgid "Extend vertices along the edge closest to the cursor" -msgstr "Kéo ra các đỉnh của cạnh gần nhất con trỏ" +msgstr "Nới các điểm đỉnh dọc theo cạnh gần nhất với con trỏ" msgid "Extend vertices and move the result" -msgstr "Kéo ra đỉnh và di chuyển kết qủa" +msgstr "Nới các điểm đỉnh ra và di chuyển kết quả" msgid "Extend Vertices" -msgstr "Kéo Ra Đỉnh" +msgstr "Nới các Điểm Đỉnh ra" msgid "Rip polygons and move the result" -msgstr "Xé hình đa giác và di chuyển kết qủa" +msgstr "Phân xé các hình đa giác ra và di chuyển kết quả" msgid "Rip" -msgstr "Xé" +msgstr "Phân Xé" msgctxt "Operator" msgid "Screw" -msgstr "Ốc Xoắn" +msgstr "Đinh Vít" msgid "Extrude selected vertices in screw-shaped rotation around the cursor in indicated viewport" -msgstr "Kéo ra các đỉnh kiểu ốc xoắn quanh con trỏ trong màn chiếu xác định" +msgstr "Đẩy trồi các điểm đỉnh đã chọn theo sự xoay chiều hình đinh vít quanh con trỏ trong cổng nhìn chỉ định" msgid "Turns" -msgstr "Lần Quay" +msgstr "Số Vòng Xoay" msgid "(De)select all vertices, edges or faces" -msgstr "Thả/chọn hết đỉnh, cạnh, hay mặt" +msgstr "(Hủy) chọn toàn bộ các điểm đỉnh, các cạnh, hay các mặt" msgctxt "Operator" @@ -59166,11 +64756,11 @@ msgstr "Chọn Trục" msgid "Select all data in the mesh on a single axis" -msgstr "Chọn hết dữ liệu trong mạng lưới trên một trục" +msgstr "Chọn toàn bộ các dữ liệu trong khung lưới trên một đơn trục" msgid "Select the axis to compare each vertex on" -msgstr "Chọn trục để so sánh các đỉnh với nó" +msgstr "Chọn trục để so sánh với mỗi điểm đỉnh" msgid "Axis Mode" @@ -59178,43 +64768,47 @@ msgstr "Chế Độ Trục" msgid "Axis orientation" -msgstr "Định hướng trục" +msgstr "Định hướng của trục" msgid "Align the transformation axes to world space" -msgstr "Sắp xếp các trục đến không gian thế giới" +msgstr "Sắp xếp các trục biến hóa theo không gian thế giới" msgid "Align the transformation axes to the selected objects' local space" -msgstr "Sắp xếp các trục biến hóa đến không gian địa phương của vật thể được chọn" +msgstr "Sắp xếp các trục biến hóa theo không gian địa phương của đối tượng được chọn" msgid "Align the transformation axes to average normal of selected elements (bone Y axis for pose mode)" -msgstr "Sắp xếp các trục biến hóa đến pháp tuyến trung bình của phần tử được chọn (trục Y của xương cho chế độ dạng đứng)" +msgstr "Sắp xếp các trục biến hóa theo pháp tuyến trung bình của các yếu tố được chọn (trục Y của xương cho chế độ tư thế)" msgid "Gimbal" -msgstr "Các Đăng" +msgstr "Trục Vạn Năng" msgid "Align each axis to the Euler rotation axis as used for input" -msgstr "Sắp xếp các trục biến hóa đến trục xoay Euler được dùng cho ngõ vào" +msgstr "Sắp xếp mỗi trục theo trục xoay chiều Euler, như dùng làm đầu vào" msgid "Align the transformation axes to the window" -msgstr "Sắp xếp các trục biến hóa đến cửa sổ" +msgstr "Căn chỉnh các trục biến hóa theo cửa sổ" msgid "Align the transformation axes to the 3D cursor" -msgstr "Sắp xếp các trục biến hóa đến con trỏ 3D" +msgstr "Căn chỉnh các trục biến hóa theo con trỏ 3D" + + +msgid "Align the transformation axes to the object's parent space" +msgstr "Căn chỉnh các trục biến hóa với không gian phụ huynh của đối tượng" msgid "Axis Sign" -msgstr "Dấu Trục" +msgstr "Dấu của Trục" msgid "Side to select" -msgstr "Bên để chọn" +msgstr "Bên để lựa chọn" msgid "Positive Axis" @@ -59226,41 +64820,54 @@ msgstr "Trục Âm" msgid "Aligned Axis" -msgstr "Trục Được Sắp Xếp" +msgstr "Trục Thẳng Hàng" + + +msgctxt "Operator" +msgid "Select by Attribute" +msgstr "Chọn theo Thuộc Tính" + + +msgid "Select elements based on the active boolean attribute" +msgstr "Chọn các phần tử dựa trên thuộc tính boolean đang hoạt động" msgctxt "Operator" msgid "Select Faces by Sides" -msgstr "Chọn Mặt Bằng Cạnh" +msgstr "Chọn Các Mặt theo Số Cạnh" + + +msgid "Select vertices or faces by the number of face sides" +msgstr "Lựa chọn các điểm đỉnh hoặc các mặt theo số cạnh của mặt" msgid "Number of Vertices" -msgstr "Số Lượng Đỉnh" +msgstr "Số Lượng Điểm Đỉnh" msgid "Type of comparison to make" -msgstr "Kiểu so sánh để làm" +msgstr "Phép so sánh" msgid "Equal To" -msgstr "Bằng Nhau" +msgstr "Bằng Với" msgid "Not Equal To" -msgstr "Khác Nhau" +msgstr "Khác Với" msgctxt "Operator" msgid "Select Interior Faces" -msgstr "Chọn Mặt Ở Trong" +msgstr "Chọn các Mặt Nội Tiếp" msgid "Select faces where all edges have more than 2 face users" -msgstr "Chọn các mặt có cạnh nối hơn 2 mặt" +msgstr "Chọn các Mặt nơi toàn bộ các cạnh có hơn 2 người dùng Mặt" msgid "Deselect vertices, edges or faces at the boundary of each selection region" -msgstr "Thả đỉnh, cạnh, hay mặt tại ranh giới của mỗi vùng được chọn" +msgstr "Hủy chọn các điểm đỉnh, các cạnh, hay các mặt tại ranh giới của mỗi vùng lựa chọn" msgid "Face Step" @@ -59268,74 +64875,74 @@ msgstr "Bước Mặt" msgid "Connected faces (instead of edges)" -msgstr "Mặt Kết Nối (thay thế cạnh)" +msgstr "Các mặt kết nối (thay vì các cạnh)" msgid "Select all vertices connected to the current selection" -msgstr "Chọn hết đỉnh được kết nối với các đỉnh được chọn hiện tại" +msgstr "Chọn toàn bộ các điểm đỉnh kết nối với lựa chọn hiện tại" msgid "Delimit selected region" -msgstr "Hạn chế vùng được chọn" +msgstr "Phân giới vùng được chọn" msgid "(De)select all vertices linked to the edge under the mouse cursor" -msgstr "Chọn/thả hết đỉnh nối với cạnh ở dưới con trỏ chuột" +msgstr "Chọn/hủy chọn toàn bộ các điểm đỉnh kết nối với cạnh nằm dưới con trỏ chuột" msgctxt "Operator" msgid "Select Loose Geometry" -msgstr "Chọn Hình Dạng Rời Ra" +msgstr "Chọn Hình Học Rời Rạc" msgid "Select loose geometry based on the selection mode" -msgstr "Chọn hình dạng rời ra tùy chế độ sự lựa chọn" +msgstr "Chọn hình học rời rạc dựa trên chế độ lựa chọn" msgid "Select mesh items at mirrored locations" -msgstr "Chọn các đỉnh, cạnh, hay mặt tại vị trí gương" +msgstr "Chọn các phần tử của khung lưới tại các vị trí phản chiếu đối xứng" msgid "Extend the existing selection" -msgstr "Mở rộng các đỉnh, cạnh, hay mặt được chọn" +msgstr "Nới rộng sự lựa chọn hiện tại" msgid "Change selection mode" -msgstr "Đổi chế độ sự lựa chọn" +msgstr "Đổi chế độ lựa chọn" msgid "Vertex selection mode" -msgstr "Chế độ sự lựa chọn đỉnh" +msgstr "Chế độ lựa chọn điểm đỉnh" msgid "Edge selection mode" -msgstr "Chế độ sự lựa chọn cạnh" +msgstr "Chế độ lựa chọn cạnh" msgid "Face selection mode" -msgstr "Chế độ sự lựa chọn mặt" +msgstr "Chế độ lựa chọn Mặt" msgid "Select more vertices, edges or faces connected to initial selection" -msgstr "Chọn các đỉnh, cạnh, hay mặt kết nối với sự lựa chọn đầu tiên" +msgstr "Chọn thêm các điểm đỉnh, cạnh, hay các mặt kết nối với sự lựa chọn ban đầu" msgctxt "Operator" msgid "Select Next Element" -msgstr "Chọn Phần Tử Tiếp" +msgstr "Chọn Phần Tử Tiếp Theo" msgid "Select the next element (using selection order)" -msgstr "Chọn phần tử tiếp (theo thứ tự sự lựa chọn)" +msgstr "Chọn phần tử tiếp theo (theo thứ tự lựa chọn)" msgctxt "Operator" msgid "Select Non-Manifold" -msgstr "Chọn Không Đa Tập" +msgstr "Lựa Chọn Phi Đa Tạp" msgid "Select all non-manifold vertices or edges" -msgstr "Chọn tất cả đỉnh hay cạnh không đa tập" +msgstr "Chọn toàn bộ các điểm đỉnh hay các cạnh phi đa tạp" msgid "Boundary edges" @@ -59343,31 +64950,31 @@ msgstr "Cạnh ranh giới" msgid "Multiple Faces" -msgstr "Đa Mặt" +msgstr "Đa Các Mặt" msgid "Edges shared by more than two faces" -msgstr "Hai mặt trở lên được chia sẻ cạnh" +msgstr "Các cạnh có chung số các mặt hơn hai cái" msgid "Non Contiguous" -msgstr "Không Liên Tiếp" +msgstr "Không Tiếp Giáp" msgid "Edges between faces pointing in alternate directions" -msgstr "Cạnh giữa mặt chỉ nghịch hướng nhau" +msgstr "Các cạnh giữa các mặt đối hướng nghịch nhau" msgid "Vertices connecting multiple face regions" -msgstr "Các đỉnh kết nối hơn một vùng mặt" +msgstr "Các điểm đỉnh kết nối nhiều vùng Mặt cùng một lúc" msgid "Wire edges" -msgstr "Cạnh sợi dây" +msgstr "Các cạnh dây" msgid "Deselect every Nth element starting from the active vertex, edge or face" -msgstr "Thả mỗi phần tử thứ N bắt đầu từ đỉnh, cạnh, hay mặt hoạt động" +msgstr "Hủy chọn bất cứ phần tử thứ N nào, bắt đầu từ điểm đỉnh, cạnh, hay Mặt đang hoạt động" msgctxt "Operator" @@ -59376,186 +64983,296 @@ msgstr "Chọn Phần Tử Trước" msgid "Select the previous element (using selection order)" -msgstr "Chọn phần tử trước (theo thứ tự sự lựa chọn)" +msgstr "Chọn phần tử trước (dùng trật tự lựa chọn)" msgid "Randomly select vertices" -msgstr "Chọn đỉnh ngẫu nhiên" +msgstr "Chọn các điểm đỉnh một cách ngẫu nhiên" msgid "Select similar vertices, edges or faces by property types" -msgstr "Chọn đỉnh, cạnh, hay mặt bằng loại đặc tính" +msgstr "Chọn các điểm đỉnh, cạnh hoặc các mặt tương tự, theo thể loại tính chất" + + +msgctxt "Mesh" +msgid "Type" +msgstr "Thể Loại" + + +msgctxt "Mesh" +msgid "Normal" +msgstr "Pháp Tuyến" + + +msgctxt "Mesh" +msgid "Amount of Adjacent Faces" +msgstr "Số Lượng Các Mặt Kề Cạnh" + + +msgctxt "Mesh" +msgid "Vertex Groups" +msgstr "Nhóm Điểm Đỉnh" + + +msgctxt "Mesh" +msgid "Amount of Connecting Edges" +msgstr "Số Lượng Cạnh Kết Nối" + + +msgctxt "Mesh" +msgid "Vertex Crease" +msgstr "Nếp Gấp Điểm Đỉnh" + + +msgctxt "Mesh" +msgid "Length" +msgstr "Chiều Dài" + + +msgctxt "Mesh" +msgid "Direction" +msgstr "Chiều Hướng" + + +msgctxt "Mesh" +msgid "Amount of Faces Around an Edge" +msgstr "Số lượng Các Mặt Quanh một Cạnh" + + +msgctxt "Mesh" +msgid "Face Angles" +msgstr "Góc Độ Mặt" + + +msgctxt "Mesh" +msgid "Crease" +msgstr "Nếp Gấp" + + +msgctxt "Mesh" +msgid "Bevel" +msgstr "Bo Tròn" + + +msgctxt "Mesh" +msgid "Seam" +msgstr "Đường Khâu" + + +msgctxt "Mesh" +msgid "Sharpness" +msgstr "Độ Sắc Nhọn" + + +msgctxt "Mesh" +msgid "Freestyle Edge Marks" +msgstr "Dấu Cạnh Phong Cách Tự Do" + + +msgctxt "Mesh" +msgid "Material" +msgstr "Nguyên Vật Liệu" + + +msgctxt "Mesh" +msgid "Area" +msgstr "Diện Tích/Khu Vực" + + +msgctxt "Mesh" +msgid "Polygon Sides" +msgstr "Số Cạnh của Đa Giác" + + +msgctxt "Mesh" +msgid "Perimeter" +msgstr "Chu Vi" + + +msgctxt "Mesh" +msgid "Coplanar" +msgstr "Đồng Bề Diện" + + +msgctxt "Mesh" +msgid "Flat/Smooth" +msgstr "Bằng Thẳng/Mịn" + + +msgctxt "Mesh" +msgid "Freestyle Face Marks" +msgstr "Dấu Mặt Phong Cách Tự Do" msgctxt "Operator" msgid "Select Similar Regions" -msgstr "Chọn Vùng Giống" +msgstr "Chọn các Vùng Tương Tự" msgid "Select similar face regions to the current selection" -msgstr "Chọn vùng mặt giống với được chọn hiện tại" +msgstr "Chọn những vùng Mặt tương đồng với lựa chọn hiện tại" msgid "Separate selected geometry into a new mesh" -msgstr "Chẻ hình dạng chọn thành một mạng lưới mới" +msgstr "Tách các hình học đã chọn thành một khung lưới mới" msgid "By Material" -msgstr "Bằng Vật Liệu" +msgstr "Theo Nguyên Vật Liệu" msgid "By Loose Parts" -msgstr "Bằng Bộ Phận Rời Ra" +msgstr "Theo Bộ Phận Rời Rạc" msgctxt "Operator" msgid "Set Normals from Faces" -msgstr "Đặt Pháp Tuyến Từ Mặt" +msgstr "Đặt Pháp Tuyến từ các Mặt" msgid "Set the custom normals from the selected faces ones" -msgstr "Đặt pháp tuyến tùy chọn từ pháp tuyến của các mặt được chọn" +msgstr "Đặt pháp tuyến tùy thích theo các mặt đã chọn" msgid "Keep Sharp Edges" -msgstr "Giữ Cạnh Bén" +msgstr "Giữ Lại/Duy Trì các Cạnh Sắc Nhọn" msgid "Do not set sharp edges to face" -msgstr "Không đặt cạnh bén đến mặt" +msgstr "Không đặt cạnh sắc nhọn vào Mặt" msgctxt "Operator" msgid "Shape Propagate" -msgstr "Truyền Dẫn Mẫu Dạng" +msgstr "Truyền Lan Hình Mẫu" msgid "Apply selected vertex locations to all other shape keys" -msgstr "Áp dụng vị trí của đỉnh được chọn đến tất cả mẫu dạng khác" +msgstr "Áp dụng các vị trí của những điểm đỉnh được chọn vào toàn bộ các hình mẫu khác" msgid "Edge Tag" -msgstr "Nhãn Cạnh" +msgstr "Đánh Dấu Cạnh" msgid "The edge flag to tag when selecting the shortest path" -msgstr "Nhãn cờ cạnh nào khi chọn đường nhắn nhất " +msgstr "Cờ dấu cạnh để đánh dấu khi sử dụng lựa chọn đường ngắn nhất" msgid "Tag Seam" -msgstr "Thẻ Vết Sẹo" +msgstr "Nhãn Đường Khâu" msgid "Tag Sharp" -msgstr "Thẻ Bén" +msgstr "Nhãn Sắc Nhọn" msgid "Tag Crease" -msgstr "Thẻ Nhăn" +msgstr "Nhãn Nếp Gấp" msgid "Tag Bevel" -msgstr "Thẻ Cạnh Tròn" +msgstr "Nhãn Bo Tròn" msgid "Tag Freestyle Edge Mark" -msgstr "Thẻ Ký Hiệu Cạnh Phong Cách Tự Do" +msgstr "Nhãn Dấu Cạnh PCTD" msgid "Face Stepping" -msgstr "Bước Xuyên Mặt" +msgstr "Bước Bậc Thang theo Mặt" msgid "Traverse connected faces (includes diagonals and edge-rings)" -msgstr "Xuyên mặt được kết nối (gồm đường chéo và vòng cạnh)" +msgstr "Thông duyệt các mặt kết nối (bao gồm các đường chéo và các vòng-đai cạnh)" msgid "Fill Region" -msgstr "Làm Đầy Vùng" +msgstr "PHủ Kín Vùng" msgid "Select all paths between the source/destination elements" -msgstr "Chọn hết đường giữa phần tử nguồn/địch" +msgstr "Chọn toàn bộ các đường đi giữa các phần tử nguồn/đích" msgid "Topology Distance" -msgstr "Khoảng Cách Hình Dạng Học" +msgstr "Khoảng Cách Cấu Trúc Liên Kết" msgid "Find the minimum number of steps, ignoring spatial distance" -msgstr "Tìm số lượng bước tối thiểu, không quan tâm khoảng cách không gian" +msgstr "Lùng tìm số bước tối thiểu, bỏ qua khoảng cách không gian" msgctxt "Operator" msgid "Select Shortest Path" -msgstr "Chọn Đường Ngăn Nhất" +msgstr "Chọn Đường Ngắn Nhất" msgid "Selected shortest path between two vertices/edges/faces" -msgstr "Chọn đường ngắn nhất giữa hai đỉnh/cạnh/mặt" +msgstr "Đường ngắn nhất được chọn giữa hai điểm đỉnh/cạnh/các mặt" msgctxt "Operator" msgid "Smooth Normals Vectors" -msgstr "Mịn Hóa Vectơ Pháp Tuyến" +msgstr "Làm Mịn Véctơ Pháp Tuyến" msgid "Smooth custom normals based on adjacent vertex normals" -msgstr "Mịn hóa pháp tuyến tùy chọn tùy pháp tuyến của đỉnh kề bên" +msgstr "Làm mịn các pháp tuyến tự tạo dựa vào các pháp tuyến của điểm đỉnh kề cạnh" msgid "Specifies weight of smooth vs original normal" -msgstr "Cho xác định quyền lượng của pháp tuyến mịn hoá đối với pháp tuyến ban đầu" +msgstr "Chỉ định trọng lượng làm mịn so sánh với pháp tuyến gốc" msgctxt "Operator" msgid "Solidify" -msgstr "Rắn Hóa" +msgstr "Đắp Dày" msgid "Create a solid skin by extruding, compensating for sharp angles" -msgstr "Chế tạo một da chất rắn bằng kéo ra và bù cho góc nhọn" +msgstr "Kiến Tạo một lớp da dày bằng cách đẩy trồi ra, bù trừ các góc sắc nhọn" msgctxt "Operator" msgid "Sort Mesh Elements" -msgstr "Sắp Thứ Tự Phần Tử Mạng Lưới" +msgstr "Sắp Xếp Thứ Tự các Phần Tử Khung Lưới" msgid "The order of selected vertices/edges/faces is modified, based on a given method" -msgstr "Thứ tự của đỉnh/cạnh/mặt được sửa đổi, tùy một phương pháp chọn được xác định" +msgstr "Thứ tự của các điểm đỉnh/cạnh/các mặt được chọn sẽ bị sửa đổi, dựa vào phương pháp đã cho" msgid "Which elements to affect (vertices, edges and/or faces)" -msgstr "Ảnh hưởng phần tử nào (đỉnh, cạnh, và/hay mặt)" +msgstr "Những phần tử nào bị ảnh hưởng (điểm đỉnh, cạnh, và/hoặc các mặt)" msgid "Reverse the sorting effect" -msgstr "Lật ngược hiệu ứng sắp thứ tự" +msgstr "Đảo ngược hiệu ứng sắp xếp thứ tự" msgid "Seed for random-based operations" -msgstr "Số hạt cho thao tác cơ sở ngẫu nhiên" +msgstr "Mầm cho các phép toán ngẫu nhiên" msgid "Type of reordering operation to apply" -msgstr "Áp dụng loại thao tác sắp thứ tự lại nào" +msgstr "Phương pháp đổi thứ tự áp dụng" msgid "View Z Axis" -msgstr "Trục Z Màn" +msgstr "Trục Z của Góc Nhìn" msgid "Sort selected elements from farthest to nearest one in current view" -msgstr "Sắp thứ tự phần tử được chọn từ xa nhất đến gần nhất trong màn hiện tại" +msgstr "Sắp xếp thứ tự các phần tử được chọn từ xa nhất đến gần nhất trong góc nhìn hiện tại" msgid "View X Axis" -msgstr "Trục X Màn" +msgstr "Trục X của Góc Nhìn" msgid "Sort selected elements from left to right one in current view" -msgstr "Sắp thứ tự phần tử được chọn từ trái sang phải trong màn hiện tại " +msgstr "Sắp xếp thứ tự các phần tử được chọn từ trái sang phải trong góc nhìn hiện tại" msgid "Cursor Distance" @@ -59563,64 +65280,64 @@ msgstr "Khoảng Cách Con Trỏ" msgid "Sort selected elements from nearest to farthest from 3D cursor" -msgstr "Sắp thứ tự phần tử được chọn từ gần nhất đến xa nhất từ con trở 3D" +msgstr "Sắp xếp thứ tự các phần tử được chọn từ gần nhất đến xa nhất so với con trỏ 3D" msgid "Sort selected faces from smallest to greatest material index" -msgstr "Sắp hàng các mặt từ chỉ số vật liệu nhỏ nhất đến lớn nhất" +msgstr "Sắp xếp các mặt được chọn theo thứ tự, từ chỉ số nguyên vật liệu nhỏ nhất đến lớn nhất" msgid "" "Move all selected elements in first places, preserving their relative order.\n" "Warning: This will affect unselected elements' indices as well" msgstr "" -"Di chuyển phần tử được chọn vào thứ tự đầu, và giữ nguyên thứ tự tương đối với nhau.\n" -"Cảnh Báo: Cái này sẽ đổi chỉ số của các phần tử chưa chọn nhe" +"Di chuyển toàn bộ các phần tử đã chọn về vị trí đầu, duy trì trật tự tương đối của chúng.\n" +"Cảnh báo: Việc làm này cũng sẽ ảnh hưởng đến chỉ số của các phần tử chưa được chọn đấy nhé" msgid "Randomize order of selected elements" -msgstr "Ngẫu nhiên hóa thứ tự của phần tử" +msgstr "Ngẫu nhiên hóa thứ tự của các phần tử được chọn" msgid "Reverse current order of selected elements" -msgstr "Lật ngược thứ tự hiện tại của các phần tử được chọn" +msgstr "Đảo ngược thứ tự hiện tại của các phần tử được chọn" msgid "Extrude selected vertices in a circle around the cursor in indicated viewport" -msgstr "Kéo ra các đỉnh được chọn trong một vòng tròn quang con trỏ trong màn chiếu được xác định" +msgstr "Đẩy trồi các điểm đỉnh được chọn trong một vòng tròn quanh con trỏ trong cổng nhìn chỉ định" msgid "Rotation for each step" -msgstr "Xoay cho mỗi bước" +msgstr "Góc xoay chiều cho mỗi bước" msgid "Use Duplicates" -msgstr "Dùng Các Sao Chép" +msgstr "Sử dụng các Bản Nhân Đôi" msgid "Auto Merge" -msgstr "Tự Động Gồm" +msgstr "Tự Động Hợp Nhất" msgid "Merge first/last when the angle is a full revolution" -msgstr "Gồm đầu/cuối khi góc bằng một sự xoay vòng toàn bộ" +msgstr "Hội nhập cái đầu tiên/cuối cùng khi góc độ là một vòng xoay hoàn chỉnh (360 độ)" msgid "Split off selected geometry from connected unselected geometry" -msgstr "Chẻ riêng hình dạng được chọn từ hình dạng kết nối mà không được chọn" +msgstr "Tách hình học được chọn ra khỏi hình học kết nối chưa chọn" msgctxt "Operator" msgid "Split Normals" -msgstr "Chẻ Pháp Tuyến" +msgstr "Pháp Tuyến Tách Phân" msgid "Split custom normals of selected vertices" -msgstr "Chẻ pháp tuyến tùy chọn của các đỉnh được chọn" +msgstr "Tách phân các pháp tuyến của những điểm đỉnh được chọn tùy ý" msgid "Subdivide selected edges" -msgstr "Chia nữa các cạnh được chọn" +msgstr "Phân chia các cạnh đã chọn" msgid "Fractal" @@ -59628,35 +65345,35 @@ msgstr "Phân Dạng" msgid "Fractal randomness factor" -msgstr "Hệ số ngẫu nhiên phân dạng" +msgstr "Hệ số ngẫu nhiên của phân dạng" msgid "Along Normal" -msgstr "Theo Hướng Pháp Tuyến" +msgstr "Dọc Theo Pháp Tuyến" msgid "Apply fractal displacement along normal only" -msgstr "Chỉ áp dụng dịch phân dạng theo hướng pháp tuyến" +msgstr "Chỉ áp dụng dời hình phân dạng theo hướng pháp tuyến mà thôi" msgid "Create N-Gons" -msgstr "Chế Tạo N Giác" +msgstr "Kiến Tạo Đa Giác Nhiều Cạnh" msgid "When disabled, newly created faces are limited to 3 and 4 sided faces" -msgstr "Khi tắt, mặt mới được chế tạo được hạn chế chỉ có mặt 3 và 4 cạnh" +msgstr "Khi tắt đi thì các mặt mới được kiến tạo sẽ có giới hạn là 3 đến 4 cạnh mà thôi" msgid "Quad Corner Type" -msgstr "Loại Góc Tứ Giác" +msgstr "Kiểu Góc Tứ Giác" msgid "How to subdivide quad corners (anything other than Straight Cut will prevent n-gons)" -msgstr "Phương pháp để chia góc giác của tư giác (phương pháp khác Cắt Thẳng sẽ không tạo n giác)" +msgstr "Phương pháp phân chia các góc tứ giác (bất cứ phương pháp nào ngoài phương pháp Cắt Thẳng (Straight Cut) đều sẽ cản trở việc tạo ra các đa-giác (n-gons))" msgid "Inner Vert" -msgstr "Đỉnh Ở Trong" +msgstr "Điểm Đỉnh Nội" msgid "Straight Cut" @@ -59664,24 +65381,24 @@ msgstr "Cắt Thẳng" msgid "Fan" -msgstr "Quạt" +msgstr "Hình Quạt" msgctxt "Operator" msgid "Subdivide Edge-Ring" -msgstr "Phân Hóa Cạnh-Vành" +msgstr "Phân Chia Vành Đai Cạnh" msgid "Subdivide perpendicular edges to the selected edge-ring" -msgstr "Phân hóa các cạnh vuông góc với cạnh vành được chọn" +msgstr "Phân chia các cạnh vuông góc với vành đai cạnh được chọn" msgid "Enforce symmetry (both form and topological) across an axis" -msgstr "Bắt buộc đối xứng (cả dạng và hình dạng học) qua một trục" +msgstr "Bắt phải tôn trọng sự đối xứng (cả về hình dạng và về cấu trúc liên kết) qua một trục" msgid "Which sides to copy from and to" -msgstr "Chép từ cạnh nào đến cạnh nào" +msgstr "Sao chép từ cạnh nào đến cạnh nào" msgid "-Y to +Y" @@ -59701,240 +65418,240 @@ msgstr "+Z đến -Z" msgid "Limit for snap middle vertices to the axis center" -msgstr "Giới hạn cho hút dính đỉnh ở giữa đến trung tâm trục" +msgstr "Giới hạn để bám dính các điểm đỉnh ở giữa vào tâm trục" msgctxt "Operator" msgid "Snap to Symmetry" -msgstr "Hút Dính Đến Đối Xứng" +msgstr "Bám Dính vào Đối Xứng" msgid "Snap vertex pairs to their mirrored locations" -msgstr "Hút dính đỉnh đôi đến vị trí gương lại" +msgstr "Bám dính các cặp điểm đỉnh vào các vị trí phản chiếu đối xứng của chúng" msgid "Mix factor of the locations of the vertices" -msgstr "Hệ số pha trộn vị trí của các đỉnh" +msgstr "Hệ số hòa trộn của các địa điểm pháp tuyến" msgid "Distance within which matching vertices are searched" -msgstr "Khoảng cách thì các đỉnh giống được tìm kiếm" +msgstr "Khoảng cách để lùng tìm các điểm đỉnh khớp với điều kiện" msgid "Snap middle vertices to the axis center" -msgstr "Hút dính đỉnh ở giữa đến trung tâm trục" +msgstr "Bám dính điểm giữa của các điểm đỉnh vào điểm tâm của trục" msgctxt "Operator" msgid "Tris to Quads" -msgstr "Tam Giác thành Tư Giác" +msgstr "Tam Giác thành Tứ Giác" msgid "Join triangles into quads" -msgstr "Hòa hợp tam giác thành tư giác" +msgstr "Hội nhập các tam giác thành các tứ giác" msgctxt "Operator" msgid "Un-Subdivide" -msgstr "Gồm" +msgstr "Hủy Phân Chia" msgid "Un-subdivide selected edges and faces" -msgstr "Giảm phân hóa các cạnh và mặt được chọn" +msgstr "Hủy phân chia các cạnh và các mặt được chọn" msgid "Number of times to un-subdivide" -msgstr "Số lần gồm lại để giảm phân hóa" +msgstr "Số lần hủy phân chia" msgctxt "Operator" msgid "Add UV Map" -msgstr "Thêm Bản Đồ UV" +msgstr "Thêm Ánh Xạ UV" msgid "Add UV map" -msgstr "Thêm bản đồ UV" +msgstr "Thêm ánh xạ UV" msgctxt "Operator" msgid "Remove UV Map" -msgstr "Xóa Bản Đồ UV" +msgstr "Xóa Ánh Xạ UV" msgid "Remove UV map" -msgstr "Xóa Bản Đồ UV" +msgstr "Loại bỏ ánh xạ UV" msgctxt "Operator" msgid "Reverse UVs" -msgstr "Đảo Nghịch UV" +msgstr "Đảo Ngược UV" msgid "Flip direction of UV coordinates inside faces" -msgstr "Đảo ngịch hướng tọa độ UV ở trong mặt" +msgstr "Lật đảo chiều hướng của các tọa độ UV nội trong các mặt" msgctxt "Operator" msgid "Rotate UVs" -msgstr "Quay UV" +msgstr "Xoay Chiều UV" msgid "Rotate UV coordinates inside faces" -msgstr "Quay tọa độ UV ở trong mặt" +msgstr "Xoay chiều những tọa độ UV nội trong các mặt" msgctxt "Operator" msgid "Vertex Connect" -msgstr "Kết Nối Đỉnh" +msgstr "Kết Nối Điểm Đỉnh" msgid "Connect selected vertices of faces, splitting the face" -msgstr "Kết nối các đỉnh được chọn của mặt, cho chẻ mặt" +msgstr "Kết nối các điểm đỉnh của những Mặt được chọn, phân chia Mặt ra" msgctxt "Operator" msgid "Split Concave Faces" -msgstr "Chẻ Mặt Lõm" +msgstr "Phân Chia các Mặt Lõm" msgid "Make all faces convex" -msgstr "Lăm hết mặt lồi" +msgstr "Làm cho toàn bộ các mặt lồi ra" msgctxt "Operator" msgid "Split Non-Planar Faces" -msgstr "Chia Mặt Không Mặt Phẳng" +msgstr "Phân Chia các Mặt Không Phẳng" msgid "Split non-planar faces that exceed the angle threshold" -msgstr "Chia các mặt không mặt phẳng hơn ngưỡng góc được xác định" +msgstr "Phân chia các mặt không phẳng có góc độ vượt quá giới hạn góc" msgctxt "Operator" msgid "Vertex Connect Path" -msgstr "Đường Kết Nối Đỉnh" +msgstr "Đường Kết Nối Điểm Đỉnh" msgid "Connect vertices by their selection order, creating edges, splitting faces" -msgstr "Nối 2 đỉnh của mặt bằng thứ tự được chọn, chế tạo cạnh, và chẻ mặt" +msgstr "Kết nối các điểm đỉnh theo thứ tự được chọn, kiến tạo các cạnh, tách phân các mặt" msgctxt "Operator" msgid "Smooth Vertices" -msgstr "Mịn Hóa Đỉnh" +msgstr "Làm Mịn Điểm Đỉnh" msgid "Flatten angles of selected vertices" -msgstr "Bằng Phẳng hóa góc của các đỉnh được chọn" +msgstr "Làm bẹp các góc của những điểm đỉnh được chọn" msgid "Smoothing factor" -msgstr "Hệ Số Mịn Hóa" +msgstr "Hệ số làm mịn" msgid "Number of times to smooth the mesh" -msgstr "Số lần mịn hóa mạng lưới" +msgstr "Số lần làm mịn khung lưới" msgid "Smooth along the X axis" -msgstr "Mịn hướng trục X" +msgstr "Làm mịn dọc theo trục X" msgid "Smooth along the Y axis" -msgstr "Mịn hướng trục Y" +msgstr "Làm mịn dọc theo trục Y" msgid "Smooth along the Z axis" -msgstr "Mịn hướng trục Z" +msgstr "Làm mịn dọc theo trục Z" msgctxt "Operator" msgid "Laplacian Smooth Vertices" -msgstr "Mịn Hóa Định Laplace" +msgstr "Làm Mịn Điểm Đỉnh Laplace" msgid "Laplacian smooth of selected vertices" -msgstr "Mịn hoá kiểu Laplace các đỉnh được chọn" +msgstr "Làm mịn các điểm đỉnh được chọn theo phương pháp Laplace" msgid "Lambda factor" -msgstr "Hệ Số Lamđa" +msgstr "Hệ số Lambda" msgid "Number of iterations to smooth the mesh" -msgstr "Số lượng lặp lặi cho mịn hóa mạng lưới" +msgstr "Số lần lặp lại quá trình làm mịn khung lưới" msgid "Smooth X Axis" -msgstr "Mịn Trục X" +msgstr "Làm Mịn Trục X" msgid "Smooth Y Axis" -msgstr "Mịn Trị Số Y" +msgstr "Làm Mịn Trục Y" msgid "Smooth Z Axis" -msgstr "Mịn Trị Số Z" +msgstr "Làm Mịn Trục Z" msgctxt "Operator" msgid "Wireframe" -msgstr "Khung Sợi Dây" +msgstr "Khung Dây" msgid "Create a solid wireframe from faces" -msgstr "Chế tạo một khung sợi dây rắn từ các mặt" +msgstr "Kiến Tạo một khung dây đặc từ các mặt" msgid "Crease Weight" -msgstr "Quyền Lượng Nhăn" +msgstr "Trọng Lượng Nếp Gấp" msgid "Crease hub edges for an improved subdivision surface" -msgstr "Nhăn cạnh trạm cho phân hóa bề mặt tốt hơn" +msgstr "Miết các cạnh có trục nối (ra từ một điểm đỉnh) để cải thiện sự bề mặt phân hóa" msgid "Remove original faces" -msgstr "Xóa các mặt ban đầu" +msgstr "Xóa các mặt gốc" msgid "Push action down onto the top of the NLA stack as a new strip" -msgstr "Đẩy hành động xuống trên xếp đống NLA để làm một đoạn mới" +msgstr "Đẩn hành động xuống vào đỉnh của ngăn xếp NLA như một dải mới" msgctxt "Operator" msgid "Sync Action Length" -msgstr "Đồng Bộ Chiều Dài Hoạt Động" +msgstr "Đồng Bộ Chiều Dài của Hành Động" msgid "Synchronize the length of the referenced Action with the length used in the strip" -msgstr "Đồng bộ chiều dài của Hành Động tham chiếu với chiều dài dùng trong đoạn" +msgstr "Đồng bộ hóa chiều dài của Hành Động tham chiếu với chiều dài sử dụng trong dải" msgid "Active Strip Only" -msgstr "Chỉ Đoạn Hoạt Động" +msgstr "Duy Dải đang Hoạt Động" msgid "Only sync the active length for the active strip" -msgstr "Chỉ đồng bộ chiều dài hoạt động cho đoạn hoạt động" +msgstr "Chỉ đồng bộ hóa chiều dài sử dụng cho dải đang hoạt động" msgctxt "Operator" msgid "Add Action Strip" -msgstr "Thêm Đoạn Hành Động" +msgstr "Thêm Dải Hành Động" msgid "Add an Action-Clip strip (i.e. an NLA Strip referencing an Action) to the active track" -msgstr "Thêm một Đoạn Hành Động (ví dụ Đoạn NLA tham chiếu một Hành Động) vào rãnh hoạt động" +msgstr "Thêm một dải Phân Đoạn Hành Động (ví dụ: Dải NLA tham chiếu một Hành Động) vào rãnh đang hoạt động" msgctxt "Operator" msgid "Apply Scale" -msgstr "Áp Dụng Phóng To" +msgstr "Áp Dụng Tỷ Lệ" msgid "Apply scaling of selected strips to their referenced Actions" -msgstr "Áp dụng phóng to của các đoạn được chọn đến Hành Động tham chiếu của chúng nó" +msgstr "Áp dụng thay đổi về tỷ lệ của các dải được chọn vào các Hành Động tham chiếu của chúng" msgctxt "Operator" @@ -59943,27 +65660,27 @@ msgstr "Nướng Hành Động" msgid "Bake all selected objects location/scale/rotation animation to an action" -msgstr "Nướng tất cả hoạt hình vị trí/phóng to/xoay của vật thể được chọn vào một hành động" +msgstr "Nướng toàn bộ các hoạt họa về vị trí/tỷ lệ/xoay chiều của các đối tượng đã chọn thành một hành động" msgid "Which data's transformations to bake" -msgstr "Nướng biến hóa của dữ liệu nào" +msgstr "Những biến hóa nào của dữ liệu để nướng" msgid "Bake bones transformations" -msgstr "Nướng biến hóa xương" +msgstr "Nướng các biến hóa của xương" msgid "Bake object transformations" -msgstr "Nướng biến hóa vật thể" +msgstr "Nướng các biến hóa của đối tượng" msgid "Clean Curves" -msgstr "Làm Sạch Đường Cong" +msgstr "Dọn Dẹp các Đường Cong" msgid "After baking curves, remove redundant keys" -msgstr "Sau nướng đường cong, xóa bức ảnh mẫu dư thừa" +msgstr "Sau khi nướng các đường cong thì xóa các khóa không sử dụng nữa đi" msgid "Clear Constraints" @@ -59971,7 +65688,7 @@ msgstr "Xóa Ràng Buộc" msgid "Remove all constraints from keyed object/bones, and do 'visual' keying" -msgstr "Xóa hết ràng buộc từ vật thể/xương có bức ảnh mẫu, và làm bức ảnh mẫu 'thị giác'" +msgstr "Xóa toàn bộ các ràng buộc khỏi đối tượng/xương đã được khóa hóa, và thi hành khung khóa hóa 'trực quan'" msgid "Clear Parents" @@ -59979,184 +65696,201 @@ msgstr "Xóa Phụ Huynh" msgid "Bake animation onto the object then clear parents (objects only)" -msgstr "Nướng hoạt hình trong vật thể khi xóa phụ huynh (chỉ cho vật thể)" +msgstr "Nướng hoạt họa vào đối tượng, rồi xóa phụ huynh đi (chỉ các đối tượng mà thôi)" msgid "Only Selected Bones" -msgstr "Chỉ Các Xương Được Chọn" +msgstr "Duy các Xương được Chọn" msgid "Only key selected bones (Pose baking only)" -msgstr "Chỉ xương được chọn bằng bức ảnh mẫu (Chỉ cho nướng Dạng Đứng)" +msgstr "Chỉ khung khóa hóa các xương được chọn (chỉ nướng Tư Thế) mà thôi" msgid "Overwrite Current Action" -msgstr "Ghi Lên Hành Động Hiện Tại" +msgstr "Viết Đè Lên Hành Động Hiện Tại" msgid "Bake animation into current action, instead of creating a new one (useful for baking only part of bones in an armature)" -msgstr "Nướng hành động vào hành động hiện tại, thay chế tạo một cái mới (dùng cho chỉ nướng một phần xương trong một cốt)" +msgstr "Nướng hoạt họa thành hành động hiện tại, thay vì tạo một cái mới (có lợi cho việc nướng duy một phần các xương trong một khung cốt mà thôi)" msgid "Visual Keying" -msgstr "Bức Ảnh Mẫu Thị Giác" +msgstr "Tạo Khung Khóa Trực Quan" msgid "Keyframe from the final transformations (with constraints applied)" -msgstr "Bức ảnh mẫu từ biến hóa cuối (có áp dụng ràng buộc)" +msgstr "Tạo khung khóa từ những biến hóa cuối cùng (với các ràng buộc được áp dụng nữa)" msgctxt "Operator" msgid "Clear Scale" -msgstr "Xóa Phóng to" +msgstr "Xóa Tỷ Lệ" msgid "Reset scaling of selected strips" -msgstr "Đặt lại phóng to của đoạn được chọn" +msgstr "Hoàn lại tỷ lệ của các dải được chọn" msgid "Handle clicks to select NLA Strips" -msgstr "Dùng chuột để chọn Đoạn NLA" +msgstr "Dùng các bấm chuột để chọn các Dải NLA" msgctxt "Operator" msgid "Delete Strips" -msgstr "Xóa Đoạn" +msgstr "Xóa Dải" msgid "Delete selected strips" -msgstr "Xóa đoạn được chọn" +msgstr "Xóa các dải được chọn" msgctxt "Operator" msgid "Duplicate Strips" -msgstr "Sao Chép Đoạn" +msgstr "Nhân Đôi Dải" + + +msgid "Duplicate selected NLA-Strips, adding the new strips to new track(s)" +msgstr "Nhân đôi các dải NLA đã chọn, cho thêm các dải mới vào (các) rãnh mới" msgid "When duplicating strips, assign new copies of the actions they use" -msgstr "Khi sao chép đoạn, chỉ định sao chép mới của hành động chúng nó dùng" +msgstr "Khi sao chép các dải thì ấn định các bản sao mới của những hành động mà chúng sử dụng" msgctxt "Operator" msgid "Duplicate Linked" -msgstr "Bản Sao Được Liên Kết" +msgstr "Nhân Đôi Kết Nối" + + +msgid "Duplicate Linked selected NLA-Strips, adding the new strips to new track(s)" +msgstr "Nhân đôi các dải NLA liên kết đã chọn, cho thêm các dải mới vào (các) rãnh mới" msgid "Duplicate Strips" -msgstr "Sao Chép Đoạn" +msgstr "Nhân Đôi Dải" msgctxt "Operator" msgid "Add F-Modifier" -msgstr "Thêm Bộ Điều Chỉnh F" +msgstr "Thêm Bộ Điều Chỉnh-F" msgid "Add F-Modifier to the active/selected NLA-Strips" -msgstr "Thêm Bộ Điều Chỉnh F vào Đoạn NLA hoạt động/được chọn" +msgstr "Thêm Bộ Điều Chỉnh-F vào các Dải NLA đang hoạt động/được chọn" + + +msgctxt "Action" +msgid "Only Active" +msgstr "Duy cái đang Hoạt Động" msgid "Only add a F-Modifier of the specified type to the active strip" -msgstr "Chỉ thêm một Bộ Điều Chỉnh có loại được xác định vào đoạn hoạt động" +msgstr "Chỉ thêm một Bộ Điều Chỉnh-F với thể loại xác định vào dải đang hoạt động mà thôi" msgid "Copy the F-Modifier(s) of the active NLA-Strip" -msgstr "Chép các Bộ Điều Chỉnh F của Đoạn NLA hoạt động" +msgstr "Sao chép (các) Bộ Điều Chỉnh-F của Dải NLA đang hoạt động" msgid "Add copied F-Modifiers to the selected NLA-Strips" -msgstr "Thêm Bộ Điều Chỉnh F đã chép lại vào Đoạn NLA được chọn" +msgstr "Thêm Bộ Điều Chỉnh-F đã sao chép vào các Dải NLA được chọn" msgid "Only paste F-Modifiers on active strip" -msgstr "Chỉ dán Cụ Sửa Dổi-F trên đoạn hoạt động" +msgstr "Chỉ dán Bộ Điều Chỉnh-F trên dải đang hoạt động" msgctxt "Operator" msgid "Make Single User" -msgstr "Làm Chỉ Dùng Một Lần" +msgstr "Biến Thành Đơn Người Dùng" msgid "Ensure that each action is only used once in the set of strips selected" -msgstr "Làm chắc mỗi hành động chỉ được dùng một lần trong tập đoạn được chọn" +msgstr "Đảm bảo rằng mỗi hành động chỉ được sử dụng một lần trong bộ các dải được chọn" msgctxt "Operator" msgid "Add Meta-Strips" -msgstr "Thêm Siêu Đoạn" +msgstr "Thêm các Dải Siêu" msgid "Add new meta-strips incorporating the selected strips" -msgstr "Thêm siêu đoạn mới gồm các đoạn được chọn" +msgstr "Thêm dải siêu mới, kết hợp các dải được chọn vào đó" msgctxt "Operator" msgid "Remove Meta-Strips" -msgstr "Xóa Siêu Đoạn" +msgstr "Xóa các Dải Siêu" msgid "Separate out the strips held by the selected meta-strips" -msgstr "Chẻ ra các đoạn được giữ trong các siêu đoạn được chọn" +msgstr "Tách các dải đang được giữ trong dải siêu được chọn ra" msgctxt "Operator" msgid "Move Strips Down" -msgstr "Di Chuyển Đoạn Xuống" +msgstr "Di Chuyển các Dải Xuống" msgid "Move selected strips down a track if there's room" -msgstr "Di chuyển đoạn xuống một rãnh nếu có chỗ đi" +msgstr "Di chuyển các dải xuống một rãnh nếu có chỗ" msgctxt "Operator" msgid "Move Strips Up" -msgstr "Di Chuyển Đoạn Lên" +msgstr "Di Chuyển các Dải Lên" msgid "Move selected strips up a track if there's room" -msgstr "Di chuyển đoạn được chọn lên một rãnh nếu có chỗ đi" +msgstr "Di chuyển các dải được chọn lên một rãnh nếu có chỗ" msgctxt "Operator" msgid "Toggle Muting" -msgstr "Bật/Tắt Cắt Tiếng" +msgstr "Bật/Tắt Hoạt Tính" msgid "Mute or un-mute selected strips" -msgstr "Cắt hay không cắt tiếng đoạn được chọn" +msgstr "Giải hoạt/chặn hoặc kích hoạt các dải được chọn" msgid "Set Preview Range based on extends of selected strips" -msgstr "Đặt Phạm Vi Dự Khán tùy phạm vi của các đoạn được chọn" +msgstr "Đặt Phạm Vi Xem Trước dựa trên diện tích của các dải đã chọn" msgid "Select or deselect all NLA-Strips" -msgstr "Chọn hay thả hết đoạn NLA" +msgstr "Chọn hay hủy chọn toàn bộ các Dải NLA" msgid "Use box selection to grab NLA-Strips" -msgstr "Dùng hộp lựa chọn để chọn Đoạn NLA" +msgstr "Dùng lựa chọn hình hộp để nắm được các Dải NLA" msgid "Select strips to the left or the right of the current frame" -msgstr "Chọn đoạn phía trái hay phía phải của bức ảnh hiện tại" +msgstr "Chọn các dải nằm về bên trái hoặc bên phải của khung hình hiện tại" + + +msgid "Based on Mouse Position" +msgstr "Dựa trên Vị Trí Chuột" msgctxt "Operator" msgid "Include Selected Objects" -msgstr "Gồm Vật Thể Được Chọn" +msgstr "Bao Gồm các Đối Tượng được Chọn" msgid "Make selected objects appear in NLA Editor by adding Animation Data" -msgstr "Làm vật thể đơực chọn xuất hiện trong Bộ Soan NLA bằng thêm Dữ Liệu Hoạt Hình" +msgstr "Làm cho đối tượng được chọn xuất hiện trong Trình Biên Soạn NLA bằng cách thêm Dữ Liệu Hoạt Họa vào" msgctxt "Operator" msgid "Snap Strips" -msgstr "Hút Dính Đoạn" +msgstr "Bám Dính các Dải" msgid "Move start of strips to specified time" -msgstr "Di chuyển đầu của đoạn đến thời gian xác định" +msgstr "Di chuyển điểm đầu của các dải đến thời điểm xác định" msgctxt "Operator" @@ -60165,25 +65899,25 @@ msgstr "Thêm Đoạn Âm Thanh" msgid "Add a strip for controlling when speaker plays its sound clip" -msgstr "Thêm một đoạn cho điều khiểu khi loa sẽ hát âm thanh của đoạn âm thanh" +msgstr "Thêm một dải để điều khiểu khi loa chơi đoạn âm thanh của nó" msgctxt "Operator" msgid "Split Strips" -msgstr "Chẻ Đoạn" +msgstr "Phân Đoạn các Dải" msgid "Split selected strips at their midpoints" -msgstr "Chẻ đoạn được chọn tại trung điểm của chúng nó" +msgstr "Phân đoạn các dải được chọn tại trung điểm của chúng" msgctxt "Operator" msgid "Swap Strips" -msgstr "Trao Đổi Đoạn" +msgstr "Tráo Đổi Chỗ các Dải" msgid "Swap order of selected strips within tracks" -msgstr "Trao đổi thứ tự của đoạn được chọn trong rãnh" +msgstr "Tráo đổi thứ tự của những dải được chọn nội trong các rãnh" msgctxt "Operator" @@ -60192,330 +65926,415 @@ msgstr "Thêm Rãnh" msgid "Add NLA-Tracks above/after the selected tracks" -msgstr "Thêm Rãnh NLA trên/sau các rãnh được chọn" +msgstr "Thêm các Rãnh NLA trên/sau các rãnh được chọn" msgid "Above Selected" -msgstr "Trên Được Chọn" +msgstr "Trên cái được Chọn" msgid "Add a new NLA Track above every existing selected one" -msgstr "Thêm một rãnh NLA trên mỗi rãnh tồn tại được chọn" +msgstr "Thêm một Rãnh NLA trên mọi rãnh tồn tại được chọn" msgctxt "Operator" msgid "Delete Tracks" -msgstr "Xóa Lắn" +msgstr "Xóa Rãnh" msgid "Delete selected NLA-Tracks and the strips they contain" -msgstr "Xoá các rãnh NLA được chọn và các đoạn nội dung của chúng nó" +msgstr "Xóa các Rãnh NLA được chọn và các dải mà chúng chứa đựng" msgctxt "Operator" msgid "Add Transition" -msgstr "Thêm Tiến Triển" +msgstr "Thêm Chuyển Cảnh" msgid "Add a transition strip between two adjacent selected strips" -msgstr "Thêm một đoạn tiến triển giữa hai đoạn kề được chọn" +msgstr "Thêm một dải chuyển cảnh vào giữa hai dải kề cạnh được chọn" msgctxt "Operator" msgid "Enter Tweak Mode" -msgstr "Vào Chế Độ Chỉnh" +msgstr "Bước Vào Chế Độ Hiệu Chỉnh" msgid "Enter tweaking mode for the action referenced by the active strip to edit its keyframes" -msgstr "Vào chế độ chỉnh của hành động được đoạn hoạt động tham chiếu để biên tập bức ảnh ảnh mẫu của nó" +msgstr "Đưa hành động, mà dải đang hoạt động tham chiếu, bước vào chế độ hiệu chỉnh để biên soạn các khung khóa của nó" msgid "Isolate Action" -msgstr "Độc Lập Hóa Hành Động" +msgstr "Cô Lập Hành Động" msgid "Enable 'solo' on the NLA Track containing the active strip, to edit it without seeing the effects of the NLA stack" -msgstr "Bật 'độc lập' trên Rãnh NLA có đoạn hoạt động, để biên tập nó mà không thấy hiệu ứng của xếp đống NLA" +msgstr "Cho phép 'độc tấu' trên Rãnh NLA có chứa dải đang hoạt động, để biên soạn nó mà không nhìn thấy hiệu ứng của ngăn xếp NLA" msgid "Evaluate Upper Stack" -msgstr "Tính Toán Xếp Đống Trên" +msgstr "Tính Toán Ngăn Xếp Nằm Trên" msgid "In tweak mode, display the effects of the tracks above the tweak strip" -msgstr "Trong chế độ chỉnh sửa, hiển thị hiệu ứng của các rãnh trên đoạn chỉnh sửa" +msgstr "Ở chế độ tinh chỉnh, hiển thị hiệu ứng của các dãnh nằm trên dải tinh chỉnh" msgctxt "Operator" msgid "Exit Tweak Mode" -msgstr "Thoát Chế Độ Chỉnh" +msgstr "Thoát Chế Độ Hiệu Chỉnh" msgid "Exit tweaking mode for the action referenced by the active strip" -msgstr "Thóat chế độ chỉnh của hành động được đoạn hoạt động tham chiếu" +msgstr "Đưa hành động, mà dải đang hoạt động tham chiếu, thoát khỏi chế độ hiệu chỉnh" msgid "Disable 'solo' on any of the NLA Tracks after exiting tweak mode to get things back to normal" -msgstr "Tắt 'độc lập' cho bắt cư rãnh NLA nào sau thoát chế độ chỉnh để dẫn đồ trở lại bình thường" +msgstr "Tắt 'độc tấu' trên bất cứ Rãnh NLA nào sau khi thoát khỏi chế độ hiệu chỉnh để đưa mọi thứ trở lại bình thường" msgid "Reset viewable area to show full strips range" -msgstr "Đặt lại khu vực được nhìn thấy cho hiện toàn phạm vi của các đoạn" +msgstr "Hoàn lại khu vực nhìn thấy được để hiển thị toàn bộ phạm vi của các dải" msgid "Reset viewable area to show selected strips range" -msgstr "Đặt lại khu vực được nhìn thấy cho hiện phạm vị của các đoạn được chọn" +msgstr "Hoàn lại khu vực nhìn thấy được để hiển thị phạm vị của các dải được chọn" msgctxt "Operator" msgid "Add Node Collection" -msgstr "Thêm Sưu Tập Giao Điểm" +msgstr "Thêm Bộ Sưu Tập Nút" + + +msgid "Add a collection info node to the current node editor" +msgstr "Thêm một nút thông tin bộ sưu tập vào trình biên soạn nút hiện tại" msgctxt "Operator" msgid "Add File Node" -msgstr "Thêm Giao Điểm Tập Tin" +msgstr "Thêm Nút Tập Tin" msgid "Add a file node to the current node editor" -msgstr "Thêm một giao điểm tập tin trong trình biên soạn giao điểm hiện tại" +msgstr "Thêm một nút tập tin vào trình biên soạn nút hiện tại" msgctxt "Operator" msgid "Add Node Group" -msgstr "Thêm Nhóm Giao Điểm" +msgstr "Thêm Nhóm Nút" msgid "Add an existing node group to the current node editor" -msgstr "Thêm một nhóm giao điểm vào trình biên soạn giao điểm hiện tại" +msgstr "Thêm nhóm nút hiện có vào trình biên soạn nút hiện tại" + + +msgid "Show the datablock selector in the node" +msgstr "Hiển thị trình chọn khối dữ liệu trong nút" + + +msgctxt "Operator" +msgid "Add Node Group Asset" +msgstr "Thêm Tài Sản Nhóm Nút" + + +msgid "Add a node group asset to the active node tree" +msgstr "Thêm tài sản nhóm nút vào cây nút đang hoạt động" msgctxt "Operator" msgid "Add Mask Node" -msgstr "Thêm Giao Điểm Mặt Nạ" +msgstr "Thêm Nút Màn Chắn Lọc" msgid "Add a mask node to the current node editor" -msgstr "Thêm một giao điểm mặt nạ vào trình biên soạn giao điểm hiện tại" +msgstr "Thêm một nút màn chắn lọc vào trình biên soạn nút hiện tại" + + +msgctxt "Operator" +msgid "Add Material" +msgstr "Thêm Nguyên Vật Liệu" + + +msgid "Add a material node to the current node editor" +msgstr "Thêm nút nguyên vật liệu vào trình biên soạn nút hiện tại" msgctxt "Operator" msgid "Add Node" -msgstr "Thêm Giao Điểm" +msgstr "Thêm Nút" msgid "Add a node to the active tree" -msgstr "Thêm một giao điểm vào cây hoạt động" +msgstr "Thêm một nút vào cây đang hoạt động" msgid "Settings to be applied on the newly created node" -msgstr "Cài đặt để áp dụng cho giao đểm mới chế tạo" +msgstr "Các sắp đặt để áp dụng vào nút mới được kiến tạo" msgid "Node Type" -msgstr "Loại Giao Điểm" +msgstr "Loại Nút" msgid "Node type" -msgstr "Loại giao điểm" +msgstr "Thể loại nút" msgid "Start transform operator after inserting the node" -msgstr "Bắt đầu thao tác biến hóa sau chèn giao điểm" +msgstr "Khởi động thao tác biến hóa ngay sau khi chèn thêm nút" msgctxt "Operator" msgid "Add Node Object" -msgstr "Thêm Vật Thể Giao Điểm" +msgstr "Thêm Đối Tượng Nút" msgid "Add an object info node to the current node editor" -msgstr "Thêm một giao điểm thông tin vật thể trong trình biên soạn giao điểm hiện tại" +msgstr "Thêm nút thông tin đối tượng vào trình biên soạn nút hiện tại" + + +msgctxt "Operator" +msgid "Add Repeat Zone" +msgstr "Thêm Vùng Lặp Lại" + + +msgid "Add a repeat zone that allows executing nodes a dynamic number of times" +msgstr "Thêm vùng lặp lại cho phép thực thi các nút với một số lần năng động" + + +msgid "Offset of nodes from the cursor when added" +msgstr "Dịch chuyển của các nút từ con trỏ khi đã được thêm vào" msgctxt "Operator" msgid "Add Reroute" -msgstr "Thêm Tuyến Lại" +msgstr "Thêm Đổi Tuyến" msgid "Add a reroute node" -msgstr "Thêm một giao điểm tuyến lại" +msgstr "Thêm một nút đổi tuyến" + + +msgctxt "Operator" +msgid "Add Simulation Zone" +msgstr "Thêm Vùng Mô Phỏng" + + +msgid "Add simulation zone input and output nodes to the active tree" +msgstr "Thêm các nút đầu vào và đầu ra của vùng mô phỏng vào cây hiện nay đang hoạt động" msgctxt "Operator" msgid "Attach Nodes" -msgstr "Gắn Giao Điểm" +msgstr "Gắn các Nút" msgid "Attach active node to a frame" -msgstr "Gắn giao điểm hoạt động với một bức ảnh" +msgstr "Gắn nút đang hoạt động vào khung" msgctxt "Operator" msgid "Background Image Fit" -msgstr "Vừa Ảnh Nền" +msgstr "Khít Hình Ảnh Nền" msgid "Fit the background image to the view" -msgstr "Chỉnh khổ ảnh nền cho vừa màn" +msgstr "Khít vừa hình ảnh nền vào khung nhìn" msgctxt "Operator" msgid "Background Image Move" -msgstr "Di Chuyển Ảnh Nền" +msgstr "Di Chuyển Hình Ảnh Nền" msgid "Move node backdrop" -msgstr "Di chuyển nền giao điểm" +msgstr "Di chuyển hình ảnh nền của nút" msgctxt "Operator" msgid "Backimage Sample" -msgstr "Mẫu Vật Ảnh Nền" +msgstr "Lấy Mẫu Vật Hình Ảnh Nền" msgid "Use mouse to sample background image" -msgstr "Dùng chuột để lấy mẫu điểm ảnh nền" +msgstr "Dùng chuột để lấy mẫu vật hình ảnh nền" msgctxt "Operator" msgid "Background Image Zoom" -msgstr "Phóng To Ảnh Nền" +msgstr "Thu-Phóng Hình Ảnh Nền" msgid "Zoom in/out the background image" -msgstr "Phỏng vào/ra ảnh nền" +msgstr "Phóng to/thu nhỏ hình ảnh nền" msgctxt "Operator" msgid "Clear Viewer Region" -msgstr "Xóa Vùng Bộ Chiếu" +msgstr "Xóa Địa Phận Vùng Quan Sát" msgid "Clear the boundaries for viewer operations" -msgstr "Xóa ranh giời cho thao tác màn chiếu" +msgstr "Xóa hết các ranh giới cho các thao tác quan sát đi" + + +msgid "Copy the selected nodes to the internal clipboard" +msgstr "Sao chép các nút đã chọn vào bảng nhớ tạm nội bộ" + + +msgid "Paste nodes from the internal clipboard to the active node tree" +msgstr "Dán các nút từ bảng nhớ tạm nội bộ vào cây nút đang hoạt động" + + +msgid "The 2D view location for the center of the new nodes, or unchanged if not set" +msgstr "Vị trí góc nhìn 2D để làm trung tâm của các nút mới, hoặc không thay đổi gì nếu chưa đặt" msgctxt "Operator" msgid "Collapse and Hide Unused Sockets" -msgstr "Tóp Và Ẩn Ổ Cắm Chưa dùng" +msgstr "Thu Lại và Ẩn Giấu các Ổ Cắm Chưa Dùng" msgid "Toggle collapsed nodes and hide unused sockets" -msgstr "Bật/tắt tóp giao điểm và ẩn ổ cắm chưa dùng" +msgstr "Bật/Tắt trạng thái nút thu lại và ẩn giấu các ổ cắm không dùng đến" msgctxt "Operator" msgid "Add Cryptomatte Socket" -msgstr "Thêm Ổ Cắm Mặt Nạ Mã" +msgstr "Thêm Ổ Cắm Lớp Vẽ Lồng Bí Mật" msgid "Add a new input layer to a Cryptomatte node" -msgstr "Thêm một lớp ngõ vào cho một giao điểm Mặt Nạ Mã" +msgstr "Thêm một tầng lớp đầu vào mới vào nút Lớp Vẽ Lồng Bí Mật" msgctxt "Operator" msgid "Remove Cryptomatte Socket" -msgstr "Xóa Ổ Cắm Mặt Nạ Mã" +msgstr "Tháo Ổ Cắm Lớp Vẽ Lồng Bí Mật" msgid "Remove layer from a Cryptomatte node" -msgstr "Xóa lớp từ một giao điểm Mặt Nạ Mã" +msgstr "Xóa bỏ tầng lớp khỏi một nút Lớp Vẽ Lồng Bí Mật" + + +msgctxt "Operator" +msgid "Deactivate Viewer Node" +msgstr "Giải Hoạt Nút Quan Sát" + + +msgid "Deactivate selected viewer node in geometry nodes" +msgstr "Giải hoạt nút quan sát đã chọn trong các nút hình học" + + +msgid "Remove selected nodes" +msgstr "Xóa các nút đã chọn" msgctxt "Operator" msgid "Delete with Reconnect" -msgstr "Xóa Với Kết Nối Lại" +msgstr "Xóa và Tái Kết Nối" + + +msgid "Remove nodes and reconnect nodes as if deletion was muted" +msgstr "Xóa các nút đi và kết nối lại các nút như thể thao tác xóa đã bị tắt đi vậy" msgctxt "Operator" msgid "Detach Nodes" -msgstr "Gỡ Giao Điểm" +msgstr "Tách Rời các Nút" msgid "Detach selected nodes from parents" -msgstr "Gỡ giao điểm được chọn từ phụ huynh" +msgstr "Tách rời những nút được chọn khỏi các phụ huynh" msgctxt "Operator" msgid "Detach and Move" -msgstr "Gỡ Và Di Chuyển" +msgstr "Tách Rời và Di Chuyển" msgid "Detach nodes, move and attach to frame" -msgstr "Gỡ giao điểm, di chuyển và gắn với bức ảnh" +msgstr "Tách rời các nút, di chuyển và gắn vào khung" msgid "Attach Nodes" -msgstr "Gắn Giao Điểm" +msgstr "Gắn các Nút" msgid "Detach Nodes" -msgstr "Gỡ Giao Điểm" +msgstr "Tách Rời các Nút" msgctxt "Operator" msgid "Duplicate Nodes" -msgstr "Sao Chép Giao Điểm" +msgstr "Nhân Đôi các Nút" msgid "Duplicate selected nodes" -msgstr "Sao chép giao điểm được chọn" +msgstr "Nhân đôi các nút được chọn" msgid "Keep Inputs" -msgstr "Giữ Ngõ Vào" +msgstr "Duy Trì Đầu Vào" msgid "Keep the input links to duplicated nodes" -msgstr "Giữ nguyên liên kếti ngõ vào cho giao điểm được sao chép" +msgstr "Duy trì các kết nối đầu vào ở các nút được sao chép" + + +msgid "Duplicate node but not node trees, linking to the original data" +msgstr "Nhân đôi nút song không nhân đôi các cây nút, liên kết với dữ liệu gốc" msgid "Duplicate selected nodes and move them" -msgstr "Sao chép giao điểm được chọn và di chuyển chúng nó" +msgstr "Nhân đôi các nút được chọn và di chuyển chúng" msgid "Duplicate Nodes" -msgstr "Sao Chép Giao Điểm" +msgstr "Nhân Đôi các Nút" msgid "Move and Attach" -msgstr "Di Chuyển Và Gắn" +msgstr "Di Chuyển và Gắn Vào" msgid "Move nodes and attach to frame" -msgstr "Di chuyên ̉ giao điểm và gắn với bức ảnh" +msgstr "Di chuyển các nút và gắn vào khung" msgid "Duplicate selected nodes keeping input links and move them" -msgstr "Sao chép giao điểm được chọn mà giữ nguyên liên kết ngõ vào và di chuyển nó" +msgstr "Nhân đôi các nút được chọn, duy trì các kết nối đầu vào và di chuyển chúng" + + +msgid "Duplicate selected nodes, but not their node trees, and move them" +msgstr "Nhân đôi các nút đã chọn, song không nhân đôi các cây nút của chúng, và di chuyển" msgctxt "Operator" msgid "Find Node" -msgstr "Kiếm Giao Điểm" +msgstr "Lùng Tìm Nút" msgid "Search for a node by name and focus and select it" -msgstr "Tìm kiếm một giao điểm bằng tên và tập trung và chọn nó" +msgstr "Tìm kiếm nút bằng cách sử dụng chỉ danh, rồi tập trung vào và đồng thời chọn nó" msgctxt "Operator" msgid "glTF Material Output" -msgstr "Ngõ Ra Vật Liệu glTF" +msgstr "đầu Ra Nguyên Vật Liệu glTF" msgid "Add a node to the active tree for glTF export" -msgstr "Thêm một giao điểm vào cây giao điểm hoạt động cho xuất glTF" +msgstr "Thêm một nút vào cây đang hoạt động để xuất khẩu glTF" msgctxt "Operator" msgid "Edit Group" -msgstr "Biên Tập Nhóm" +msgstr "Biên Soạn Nhóm" msgid "Edit node group" -msgstr "Biên tập nhóm giao điểm" +msgstr "Biên soạn nhóm nút" msgid "Exit" @@ -60524,32 +66343,32 @@ msgstr "Thoát" msgctxt "Operator" msgid "Group Insert" -msgstr "Chèn Nhóm" +msgstr "Chèn Thêm vào Nhóm" msgid "Insert selected nodes into a node group" -msgstr "Chèn các giao điểm được chọn vào một nhóm giao điểm" +msgstr "Chèn thêm các nút đã chọn vào trong một nhóm nút" msgctxt "Operator" msgid "Make Group" -msgstr "Chế Tạo Nhóm" +msgstr "Tạo Nhóm" msgid "Make group from selected nodes" -msgstr "Chế tạo nhóm mới từ các giao điểm được chọn" +msgstr "Tạo nhóm từ các nút đã chọn" msgid "Separate selected nodes from the node group" -msgstr "Chẻ giao điểm được chọn từ nhóm giao điểm" +msgstr "Phân rã các nút đã chọn ra khỏi nhóm nút" msgid "Copy to parent node tree, keep group intact" -msgstr "Chép lại đến cây giao điểm phụ huynh, giữ nguyên nhóm" +msgstr "Sao chép sang cây nút phụ huynh, giữ nguyên nhóm" msgid "Move to parent node tree, remove from group" -msgstr "Di chuyển đến cây giao điểm phụ huynh, xóa từ nhóm" +msgstr "Di chuyển đến cây nút phụ huynh, xóa khỏi nhóm" msgctxt "Operator" @@ -60558,202 +66377,246 @@ msgstr "Rã Nhóm" msgid "Ungroup selected nodes" -msgstr "Rã giao điểm được chọn" +msgstr "Rã nhóm các nút đã chọn" msgctxt "Operator" msgid "Toggle Hidden Node Sockets" -msgstr "Hiện/Ẩn Ổ Cắm Giao Điểm" +msgstr "Hiện/Ẩn các Ổ Cắm Nút bị Ẩn Giấu" msgid "Toggle unused node socket display" -msgstr "Hiện/ẩn ổ cắm giao điểm không dùng" +msgstr "Hiện/Ẩn ổ cắm nút không dùng đến" msgctxt "Operator" msgid "Hide" -msgstr "Ẩn" +msgstr "Ẩn Giấu" msgid "Toggle hiding of selected nodes" -msgstr "Bật/tắt ẩn giao điểm được chọn" +msgstr "Hiện/Ẩn các nút đã chọn" + + +msgctxt "Operator" +msgid "Remove Item" +msgstr "Xóa Mục" msgctxt "Operator" msgid "Insert Offset" -msgstr "Chèn Nới Ra" +msgstr "Dịch Chuyển khi Chèn Thêm" msgid "Automatically offset nodes on insertion" -msgstr "Tự động nới giao điểm khi chèn" +msgstr "Tự động dịch chuyển các nút khi chèn thêm" + + +msgctxt "Operator" +msgid "Duplicate Item" +msgstr "Nhân Đôi Mục" + + +msgid "Add a copy of the active item to the interface" +msgstr "Thêm một bản sao của mục đang hoạt động vào giao diện" + + +msgctxt "Operator" +msgid "New Item" +msgstr "Mục Mới" + + +msgid "Add a new item to the interface" +msgstr "Thêm mục mới vào giao diện" + + +msgid "Type of the item to create" +msgstr "Thể loại mục cần tạo" + + +msgid "Remove active item from the interface" +msgstr "Xóa mục đang hoạt động khỏi giao diện" msgctxt "Operator" msgid "Join Nodes" -msgstr "Kết Nối Giao Điểm" +msgstr "Hội Nhập các Nút" msgid "Attach selected nodes to a new common frame" -msgstr "Gắn giao điểm được chọn với một bức ảnh chung" +msgstr "Gắn các nút được chọn vào một khung dùng chung" msgctxt "Operator" msgid "Link Nodes" -msgstr "Liên Kết Giao Điểm" +msgstr "Kết Nối các Nút" msgid "Use the mouse to create a link between two nodes" -msgstr "Dùng con chuột để chế tạo một liên kết giữa hai giao điểm" +msgstr "Dùng chuột để kiến tạo một kết nối giữa hai nút" msgid "Delay in seconds before maximum speed is reached" -msgstr "Trì hoãn (giây) trước đến tốc độ cực đại" +msgstr "Trì hoãn hằng giây đồng hồ trước khi đạt đến tốc độ tối đa" msgid "Detach" -msgstr "Gỡ" +msgstr "Ngắt Rời" msgid "Detach and redirect existing links" -msgstr "Gỡ và chuyển hướng lại các liên kết đang tồn tại" +msgstr "Ngắt rời và chuyển hướng các đường kết nối hiện tại" msgid "Drag Start" -msgstr "Bắt Đầu Kéo" +msgstr "Điểm Kéo Khởi Đầu" msgid "The position of the mouse cursor at the start of the operation" -msgstr "Vị trí của con trỏ chuột tại bắt đầu của thao tác" +msgstr "Vị trí của con trỏ chuột khi bắt đầu thao tác" msgid "Inside Padding" -msgstr "Lót Trong" +msgstr "Lề Lót Trong" msgid "Inside distance in UI units from the edge of the region within which to start panning" -msgstr "Khoảng cách trong (đơn vị giao diện) từ cạnh của khu vực sẽ bắt đầu dời đi" +msgstr "Khoảng cách bên trong (trong đơn vị giao diện) từ cạnh của khu vực khởi đầu hành động lia" msgid "Maximum speed in UI units per second" -msgstr "Tốc độ cực đại (đơn vị giao diện/giây)" +msgstr "Tốc độ tối đa, trong đơn vị giao diện trên mỗi giây đồng hồ" msgid "Outside Padding" -msgstr "Lót Ngoài" +msgstr "Lề Lót Ngoài" msgid "Outside distance in UI units from the edge of the region at which to stop panning" -msgstr "Khoảng cách ngoài (đơn vị giao diện) từ cạnh của khu vực sẽ dừng dời đi" +msgstr "Khoảng cách bên ngoài (trong đơn vị giao diện) từ cạnh của khu vực nơi kết thúc hành động lia" msgid "Speed Ramp" -msgstr "Dốc Tốc Độ" +msgstr "Dốc Tăng Tốc" msgid "Width of the zone in UI units where speed increases with distance from the edge" -msgstr "Chiều rộng của vùng (đơn vị giao diện) tăng tốc bởi khoảng cách từ cạnh" +msgstr "Chiều rộng của vùng, trong đơn vị giao diện, nơi tốc độ sẽ tăng dần theo khoảng cách từ cạnh" msgid "Zoom Influence" -msgstr "Sự Ảnh Hưởng Phóng To" +msgstr "Ảnh Hưởng Thu Phóng" msgid "Influence of the zoom factor on scroll speed" -msgstr "Sự ảnh hưởng của hệ số phóng to cho tốc độ cuộn" +msgstr "Tác động của hệ số thu-phóng trong tốc độ cuộn" msgctxt "Operator" msgid "Make Links" -msgstr "Làm Liên Kết" +msgstr "Tạo các Kết Nối" msgid "Makes a link between selected output in input sockets" -msgstr "Chế tạo liên kết giữa ổ cắm ngõ ra và ổ cắm ngo vào được chọn" +msgstr "Tạo một đường kết nối giữa đầu ra lựa chọn trong các ổ cắm đầu vào" msgid "Replace socket connections with the new links" -msgstr "Thay thế kết nối ổ cắm với liên kết mới" +msgstr "Thay thế các mối kết nối ổ cắm với những đường kết nối mới" msgctxt "Operator" msgid "Link to Viewer Node" -msgstr "Liên Kết Với Giao Điểm Màn Chiếu" +msgstr "Kết Nối với Nút Quan Sát" msgid "Link to viewer node" -msgstr "Liên kết với giao điểm màn chiếu" +msgstr "Kết nối tới nút quan sát" msgctxt "Operator" msgid "Cut Links" -msgstr "Cắt Liên Kết" +msgstr "Cắt Kết Nối" msgid "Use the mouse to cut (remove) some links" -msgstr "Dùng con chuột cắt (bỏ) vài liên kết" +msgstr "Dùng chuột để cắt (xóa/loại bỏ) một số kết nối" msgctxt "Operator" msgid "Detach Links" -msgstr "Gỡ Liên Kết" +msgstr "Ngắt Rời các Kết Nối" msgid "Remove all links to selected nodes, and try to connect neighbor nodes together" -msgstr "Xóa hết liên kết đến các giao điểm được chọn, và thử kết nối giao điểm kề với nhau" +msgstr "Loại bỏ toàn bộ các kết nối đến các nút được chọn, và thử kết nối các nút lân cận lại với nhau" msgctxt "Operator" msgid "Mute Links" -msgstr "Tắt Tiếng Liên Kết" +msgstr "Giải Hoạt Kết Nối" msgid "Use the mouse to mute links" -msgstr "Dùng con chuột để tắt tiếng liên kết" +msgstr "Dùng chuột để chặn/giải hoạt các kết nối" msgctxt "Operator" msgid "Detach" -msgstr "Gỡ" +msgstr "Ngắt Rời" msgid "Move a node to detach links" -msgstr "Di chuyển giao điểm để gỡ liên kết" +msgstr "Di chuyển một nút để ngắt rời các đường kết nối" msgid "Detach Links" -msgstr "Gỡ Liên Kết" +msgstr "Tách Rời các Kết Nối" msgctxt "Operator" msgid "Toggle Node Mute" -msgstr "Bật/Tắt Cắt tiếng Giao Điểm" +msgstr "Kích/Giải Hoạt Nút" + + +msgid "Toggle muting of selected nodes" +msgstr "Bật/tắt giải hoạt các nút đã chọn" msgctxt "Operator" msgid "Assign New Geometry Node Group" -msgstr "Chỉ Định Nhóm Giao Điểm Hình Dạng Mới" +msgstr "Ấn Định Nhóm Nút Hình Học Mới" msgid "Create a new geometry node group and assign it to the active modifier" -msgstr "Chế tạo một nhóm giao điểm hình dạng mới và chỉ định nó cho bộ điều chỉnh hoạt động" +msgstr "[Kiến tạo nhóm nút hình học mới và ấn định nó vào bộ điều chỉnh đang hoạt động" + + +msgctxt "Operator" +msgid "New Geometry Node Tool Group" +msgstr "Nhóm Công Cụ Nút Hình Học Mới" + + +msgid "Create a new geometry node group for a tool" +msgstr "Tạo một nhóm nút hình học mới cho một công cụ" msgctxt "Operator" msgid "New Geometry Node Modifier" -msgstr "Bộ Điều Chỉnh Giao Điểm Hình Dạng Mới" +msgstr "Tạo Bộ Điều Chỉnh Nút Hình Học" msgid "Create a new modifier with a new geometry node group" -msgstr "Chế tạo một bộ điều chỉnh mới với một nhóm giao điểm hình dạng mới" +msgstr "Kiến Tạo một bộ điều chỉnh với một nhóm nút hình học mới" msgctxt "Operator" msgid "New Node Tree" -msgstr "Cây Giao Điểm Mới" +msgstr "Cây Nút Mới" msgid "Create a new node tree" -msgstr "Chế tạo cây giao ̣điểm mới" +msgstr "Kiến Tạo một cây nút mới" msgid "Tree Type" @@ -60762,221 +66625,287 @@ msgstr "Loại Cây" msgctxt "Operator" msgid "Add Node Color Preset" -msgstr "Thêm Đặt Sẵn Màu Giao Điểm" +msgstr "Thêm Sắp Đặt Sẵn về Màu Sắc của Nút" msgid "Add or remove a Node Color Preset" -msgstr "Thêm và xóa một Đặt Sẵn Màu Giao Điểm" +msgstr "Thêm và xóa một Sắp Đặt Sẵn về Màu Sắc của Nút" msgid "Copy color to all selected nodes" -msgstr "Chép màu đến hết giao điểm được chọn" +msgstr "Sao chép màu sắc sang toàn bộ các nút được chọn" msgctxt "Operator" msgid "Toggle Node Options" -msgstr "Bật/Tắt Tùy chọn Giao Điểm" +msgstr "Bật/Tắt các Tùy Chọn của Nút" msgid "Toggle option buttons display for selected nodes" -msgstr "Bật/tắt iển thị nút tùy chọn cho giao điểm được chọn" +msgstr "Bật/Tắt hiển thị các nút bấm tùy chọn cho các nút đã chọn" msgctxt "Operator" msgid "Add File Node Socket" -msgstr "Thêm Ổ Cắm Giao Điểm Tập Tin" +msgstr "Thêm Ổ Cắm vào Nút Tập Tin" msgid "Add a new input to a file output node" -msgstr "Thêm một ngõ vào mới cho một giao điểm xuất tập tin" +msgstr "Thêm một đầu vào mới cho nút xuất tập tin" msgid "Subpath of the output file" -msgstr "Hạ đường dẫn của tập tin ngõ ra" +msgstr "Phân đường dẫn của tập tin đầu ra" msgctxt "Operator" msgid "Move File Node Socket" -msgstr "Di Chuyển Ổ Cắm Giao Điểm Tập Tin" +msgstr "Di Chuyển Ổ Cắm ở Nút Tập Tin" msgid "Move the active input of a file output node up or down the list" -msgstr "Di chuyển ngõ vào hoạt động của một giao điểm xuất tập tin lên hay xuống danh sách" +msgstr "Di chuyển đầu vào đang hoạt động của một nút xuất tập tin lên hay xuống danh sách" msgctxt "Operator" msgid "Remove File Node Socket" -msgstr "Xóa Ổ Cắm Giao Điểm Tập Tin" +msgstr "Xóa Ổ Cắm ở Nút Tập Tin" + + +msgid "Remove the active input from a file output node" +msgstr "Xóa đầu vào đang hoạt động khỏi một nút xuất tập tin" msgid "Attach selected nodes" -msgstr "Gắn giao điểm được chọn" +msgstr "Gắn các nút được chọn vào" msgctxt "Operator" msgid "Toggle Node Preview" -msgstr "Bật/Tặt Dự Khán Giao Điểm" +msgstr "Bật/Tắt Xem Trước Nút" msgid "Toggle preview display for selected nodes" -msgstr "Bật/tắt màn dự khán cho các giao điểm chọn" +msgstr "Bật/Tắt hiển thị xem trước cho các nút đã chọn" msgctxt "Operator" msgid "Read View Layers" -msgstr "Nhập Lớp Màn Chiếu" +msgstr "Đọc các Tầng Góc Nhìn" msgid "Read all render layers of all used scenes" -msgstr "Nhập hết lớp kết xuất của tất cả cảnh được sử dụng" +msgstr "Đọc toàn bộ các tầng kết xuất của toàn bộ các cảnh đang sử dụng" msgctxt "Operator" msgid "Render Changed Layer" -msgstr "Kết Xuất Lớp Đã Đổi" +msgstr "Kết Xuất Tầng Thay Đổi" msgid "Render current scene, when input node's layer has been changed" -msgstr "Kết xuất cảnh hiện tại khi lớp của giao điểm ngõ vào đã đổi" +msgstr "Kết xuất cảnh hiện tại, khi tầng của nút đầu vào thay đổi" + + +msgctxt "Operator" +msgid "Add Repeat Item" +msgstr "Thêm Mục Lặp Lại" + + +msgid "Add a repeat item to the repeat zone" +msgstr "Thêm một mục lặp lại vào vùng lặp lại" + + +msgctxt "Operator" +msgid "Move Repeat Item" +msgstr "Di Chuyển Mục Lặp Lại" + + +msgid "Move a repeat item up or down in the list" +msgstr "Di chuyển mục lặp lại lên hoặc xuống trong danh sách" + + +msgctxt "Operator" +msgid "Remove Repeat Item" +msgstr "Xóa Mục Lặp Lại" + + +msgid "Remove a repeat item from the repeat zone" +msgstr "Xóa mục lặp lại khỏi vùng lặp lại" msgctxt "Operator" msgid "Resize Node" -msgstr "Chỉnh Kích Cỡ Giao Điểm" +msgstr "Đổi Kích Thước Nút" msgid "Resize a node" -msgstr "Chỉnh kích cỡ giao điểm" +msgstr "Đổi kích thước của nút" msgid "Select the node under the cursor" -msgstr "Chọn giao điểm ở dưới con trỏ" +msgstr "Chọn nút nằm dưới con trỏ" + + +msgid "Clear Viewer" +msgstr "Xóa Quan Sát" + + +msgid "Deactivate geometry nodes viewer when clicking in empty space" +msgstr "Giải hoạt quan sát của các nút hình học khi nhấp chuột vào khoảng trống" msgid "Socket Select" -msgstr "Sự Lựa Chọn Ổ Cắm" +msgstr "Chọn Ổ Cắm" msgid "(De)select all nodes" -msgstr "Chọn/(thả) hết giao điểm" +msgstr "Chọn/hủy chọn toàn bộ các nút" msgid "Use box selection to select nodes" -msgstr "Dùng sự lựa chọn kiểu hộp để chọn giao điểm" +msgstr "Sử dụng lựa chọn hình hộp để chọn các nút" msgid "Only activate when mouse is not over a node (useful for tweak gesture)" -msgstr "Chỉ hoạt động khi chuột không ở trên một giao điểm (có lợi ích cho chỉnh cử chỉ)" +msgstr "Chỉ kích hoạt khi chuột không nằm trên một nút (hữu ích cho việc hiệu chỉnh cử chỉ)" msgid "Use circle selection to select nodes" -msgstr "Dùng vòng tròn để chọn giao điểm" +msgstr "Dùng vòn tròn lựa chọn để chọn các nút" msgid "Select nodes with similar properties" -msgstr "Chọn giao điểm có đặc tính giống" +msgstr "Chọn các nút có tính chất tương đồng" msgid "Select nodes using lasso selection" -msgstr "Chọn giao điểm bằng dây trói" +msgstr "Chọn các nút dùng dây thòng lọng lựa chọn" msgctxt "Operator" msgid "Link Viewer" -msgstr "Liên Kết Màn Chiếu" +msgstr "Kết Nối với nút Quan Sát" msgid "Select node and link it to a viewer node" -msgstr "Chọn giao điểm và liên kết nó với giao điểm màn chiếu" +msgstr "Chọn nút và kết nối nó với một nút quan sát" msgid "Link to Viewer Node" -msgstr "Liên Kết Giao Điểm Màn Chiếu" +msgstr "Kết Nối với Nút Quan Sát" msgctxt "Operator" msgid "Select Linked From" -msgstr "Chọn Liên Kết Từ" +msgstr "Chọn cái Kết Nối Từ" msgid "Select nodes linked from the selected ones" -msgstr "Chọn các giao điểm từ những giao điểm được chọn" +msgstr "Chọn các nút kết nối từ những nút đã chọn" msgctxt "Operator" msgid "Select Linked To" -msgstr "Chọn Liên Kết Đến" +msgstr "Chọn cái Kết Nối Tới" msgid "Select nodes linked to the selected ones" -msgstr "Chọn các giao điểm liên kết đến những giao điểm được chọn" +msgstr "Chọn các nút kết nối tới những cái được chọn" msgctxt "Operator" msgid "Activate Same Type Next/Prev" -msgstr "Hoạt Động Cùng Loại Tiếp/Trước" +msgstr "Kích Hoạt Cùng Thể Loại Tiếp Theo/Trước Đây" msgid "Activate and view same node type, step by step" -msgstr "Hoạt động và hiện các giao điểm cùng loại, bước qua bước" +msgstr "Kích hoạt và xem nút cùng thể loại, từng bước một" msgctxt "Operator" msgid "Script Node Update" -msgstr "Nâng Cấp Giao Điểm Văn Thảo" +msgstr "Cập Nhật Nút Tập Lệnh" msgid "Update shader script node with new sockets and options from the script" -msgstr "Nâng cấp giao điểm văn thảo bộ tô sắc với ổ cắm mới và tùy chọn từ văn thảo đó" +msgstr "Cập nhật nút tập lệnh tô bóng với ổ cắm mới và các tùy chọn từ tập lệnh" + + +msgctxt "Operator" +msgid "Add State Item" +msgstr "Thêm Mục Trạng Thái" + + +msgid "Add a state item to the simulation zone" +msgstr "Thêm một mục trạng thái vào vùng mô phỏng" + + +msgctxt "Operator" +msgid "Move State Item" +msgstr "Di Chuyển Mục Trạng Thái" + + +msgid "Move a simulation state item up or down in the list" +msgstr "Di chuyển một mục trạng thái mô phỏng lên hoặc xuống trong danh sách" + + +msgctxt "Operator" +msgid "Remove State Item" +msgstr "Xóa Mục Trạng Thái" + + +msgid "Remove a state item from the simulation zone" +msgstr "Xóa một mục trạng thái khỏi vùng mô phỏng" msgctxt "Operator" msgid "Update Views" -msgstr "Nâng Cấp Các Màn" +msgstr "Cập Nhật các Góc Nhìn" msgid "Update views of selected node" -msgstr "Nâng cấp các màn của giao điểm được chọn" +msgstr "Cập nhật các góc nhìn của nút được chọn" msgctxt "Operator" msgid "Move and Attach" -msgstr "Di Chuyển Và Gắn" +msgstr "Di Chuyển và Gắn Vào" msgctxt "Operator" msgid "Parent Node Tree" -msgstr "Cây Giao Điểm Phụ Huynh" +msgstr "Cây Nút Phụ Huynh" msgid "Go to parent node tree" -msgstr "Đi tới cây giao điểm phụ huynh" +msgstr "Đi tới cây nút phụ huynh" msgid "Resize view so you can see all nodes" -msgstr "Chỉnh màn cho được nhìn thấy được hết giao điểm" +msgstr "Đổi cỡ khung nhìn để bạn có thể nhìn thấy được toàn bộ các nút" msgid "Resize view so you can see selected nodes" -msgstr "Chỉnh màn cho được nhìn thấy được hết các giao điểm chọn" +msgstr "Đổi cỡ khung nhìn để bạn có thể nhìn thấy được toàn bộ các nút đã chọn" msgctxt "Operator" msgid "Viewer Region" -msgstr "Vùng Hiển Thị" +msgstr "Định Khu Vực Quan Sát" msgid "Set the boundaries for viewer operations" -msgstr "Đặt ranh giới cho thao tác bộ hiển thị" +msgstr "Đặt ranh giới cho các thao tác quan sát" msgctxt "Operator" msgid "Add Object" -msgstr "Thêm Vật Thể" +msgstr "Thêm Đối Tượng" msgid "Add an object to the scene" -msgstr "Thêm vật thể trong cảnh" +msgstr "Thêm một đối tượng vào cảnh" msgctxt "Operator" @@ -60985,64 +66914,64 @@ msgstr "Thêm Bộ Điều Chỉnh" msgid "Add named object" -msgstr "Thêm vật thể có tên" +msgstr "Thêm đối tượng được đặt tên" msgid "Drop X" -msgstr "Thả X" +msgstr "X của điểm Thả" msgid "X-coordinate (screen space) to place the new object under" -msgstr "Tọa độ X (không gian màn) để đặt vị trí của vật thể" +msgstr "Tọa độ-X (không gian màn hình) để đặt đối tượng mới vào" msgid "Drop Y" -msgstr "Thả Y" +msgstr "Y của điểm Thả" msgid "Y-coordinate (screen space) to place the new object under" -msgstr "Tọa độ Y (không gian màn) để đặt vị trí của vật thể" +msgstr "Tọa độ-Y (không gian màn hình) để đặt đối tượng mới vào" msgid "Duplicate object but not object data, linking to the original data" -msgstr "Sao chép vật thể nhưng không chép dữ liệu, liên kết với dữ liệu ban đầu" +msgstr "Nhân đôi đối tượng nhưng không nhân đôi dữ liệu, liên kết với dữ liệu gốc" msgctxt "Operator" msgid "Align Objects" -msgstr "Sắp Xếp Vật Thể" +msgstr "Căn Chỉnh các Đối Tượng" msgid "Align objects" -msgstr "Sắp xếp các vật thể" +msgstr "Căn chỉnh các đối tượng" msgid "Align to axis" -msgstr "Sắp xếp đến trục" +msgstr "Sắp hàng theo trục" msgid "Align Mode" -msgstr "Chế Độ Sắp Xếp" +msgstr "Chế Độ Căn Chỉnh" msgid "Side of object to use for alignment" -msgstr "Bên vật thể để sắp xếp" +msgstr "Phía bên của đối tượng sử dụng để sắp hàng" msgid "Negative Sides" -msgstr "Cạnh Âm" +msgstr "Bên Âm" msgid "Centers" -msgstr "Các Trung Tâm" +msgstr "Trung Tâm" msgid "Positive Sides" -msgstr "Cạnh Dương" +msgstr "Bên Dương" msgid "Enables high quality but slow calculation of the bounding box for perfect results on complex shape meshes with rotation/scale" -msgstr "Mở tính hộp bao quanh có chất lượng cao mà tinh toán chậm cho được kết qủa hoàn hảo cho mạng lưới phức tạp được quay/phóng to" +msgstr "Cho phép sự tính toán khung hộp viền chất lượng cao, tuy chậm, để đạt được kết quả hoàn hảo trên các khung lưới có hình dạng phức tạp khi xoay chiều/thay đổi tỷ lệ" msgid "Relative To" @@ -61050,62 +66979,62 @@ msgstr "Tương Đối Với" msgid "Reference location to align to" -msgstr "Vị trí làm tiêu chuẩn để sắp xếp" +msgstr "Vị trí đối chiếu để sắp hàng theo" msgid "Scene Origin" -msgstr "Gốc Tọa Độ Cảnh" +msgstr "Tọa Độ Gốc của Cảnh" msgid "Use the scene origin as the position for the selected objects to align to" -msgstr "Dùng góc tọa độ của cảnh để đặt vị trí cho sắp xếp các vật thể được chọn" +msgstr "Dùng tọa độ gốc của cảnh làm vị trí để căn chỉnh các đối tượng được chọn theo" msgid "Use the 3D cursor as the position for the selected objects to align to" -msgstr "Dùng con trỏ 3D để đặt vị trí cho sắp xếp vật thể được chọn" +msgstr "Dùng con trỏ 3D làm vị trí để sắp hàng các đối tượng được chọn theo" msgid "Use the selected objects as the position for the selected objects to align to" -msgstr "Dùng các vật thể được chọn để đặt vị trí cho sắp xếp vật thể được chọn đến" +msgstr "Dùng đối tượng được chọn làm vị trí để các đối tượng được chọn sắp hàng theo" msgid "Use the active object as the position for the selected objects to align to" -msgstr "Dùng vật thể hoạt động để đặt vị trí cho sắp xếp vật thể được chọn" +msgstr "Dùng đối tượng đang hoạt động làm vị trí cho các đối tượng được chọn sắp hàng theo" msgctxt "Operator" msgid "Animated Transforms to Deltas" -msgstr "Đổi Biến Hóa Sang Lệch Lạc" +msgstr "Biến Hóa Hoạt Họa sang Delta" msgid "Convert object animation for normal transforms to delta transforms" -msgstr "Biến đổi hoạt hình vật thể cho biến hóa bình thường sang lệch lạc" +msgstr "Chuyển đổi hoạt họa của đối tượng từ biến hóa bình thường sang biến hóa Delta" msgctxt "Operator" msgid "Add Armature" -msgstr "Thêm Cốt" +msgstr "Thêm Khung Cốt" msgid "Add an armature object to the scene" -msgstr "Thêm vật thể cốt trong cảnh" +msgstr "Thêm đối tượng khung cốt vào cảnh" msgctxt "Operator" msgid "Assign Custom Property Values as Default" -msgstr "Chỉ Định Giá Trị Đặc Tính Tùy Chọn cho làm Mặc Định" +msgstr "Ấn Định các Giá Trị Tính Chất Tùy Chỉnh làm Mặc Định" msgid "Assign the current values of custom properties as their defaults, for use as part of the rest pose state in NLA track mixing" -msgstr "Chỉ định giá trị hiện tại để làm giá tri mặc định cho đặc tính tùy chọn, cho làm phần của dạng đứng nghỉ ngơi trong pha trộn rãnh NLA" +msgstr "Ấn định các giá trị hiện tại của các tính chất tùy chỉnh làm mặc định của chúng, để sử dụng như một phần của trạng thái tư thế nghỉ trong quá trình pha trộn rãnh NLA" msgid "Process bone properties" -msgstr "Đặc tính qúa trình xương" +msgstr "Xử lý các tính chất của xương" msgid "Process data properties" -msgstr "Đặc tính qúa trình dữ liệu" +msgstr "Xử lý các tính chất của dữ liệu" msgctxt "Operator" @@ -61114,47 +67043,47 @@ msgstr "Nướng" msgid "Bake image textures of selected objects" -msgstr "Nướng ảnh chất liệu của các vật thể được chọn" +msgstr "Nướng các chất liệu hình ảnh của những đối tượng được chọn" msgid "Object to use as cage, instead of calculating the cage from the active object with cage extrusion" -msgstr "Dùng vật thể làm lồng, thay thế tính lồng từ vật thể hoạt động bằng kéo ra lồng" +msgstr "Đối tượng dùng để làm lồng, thay vì tính toán khung lồng từ đối tượng đang hoạt động với sự đẩy trồi khung lồng" msgid "Vertical dimension of the baking map (external only)" -msgstr "Bề cao của bản đồ nướng (chỉ cho lưu ở ngoài)" +msgstr "Chiều cao của ánh xạ nướng (chỉ bên ngoài mà thôi)" msgid "Which algorithm to use to generate the margin" -msgstr "Dùng giải thuật nào để chế tạo lề" +msgstr "Thuật toán nào sẽ được sử dụng để sinh tạo lề" msgid "Filter to combined, diffuse, glossy, transmission and subsurface passes" -msgstr "Lọc đến vòng gồm, tán xạ, bóng loáng, truyền, và hạ mạt" +msgstr "Thanh lọc các lượt kết hợp, khuếch tán, độ bóng bẩy, sự truyền xạ, và bên dưới bề mặt" msgid "Type of pass to bake, some of them may not be supported by the current render engine" -msgstr "Loại vòng kế xuất để nướng, có lẽ có vài loại động cơ kết xuất hiện tại chưa hỗ trợ" +msgstr "Loại lượt để nướng, một số chúng có thể không được bộ máy kết xuất hiện tại hỗ trợ" msgid "Automatically name the output file with the pass type" -msgstr "Dùng tên vòng cho tự động đặt tên của tập tin xuất " +msgstr "Tự động đặt tên cho tập tin xuất bằng thể loại lượt" msgid "Clear images before baking (only for internal saving)" -msgstr "Xóa ành trước nướng (chỉ cho lưu nội bộ)" +msgstr "Xóa các hình ảnh trước khi nướng (chỉ để lưu giữ nội bộ mà thôi)" msgid "Split baked maps per material, using material name in output file (external only)" -msgstr "Chẻ bản đồ nướng riêng cho mỗi vật liệu, dùng tên vật liệu trong tập tin xuất (chỉ cho ngoài)" +msgstr "Tách các ánh xạ đã nướng ra cho từng nguyên vật liệu riêng biệt, dùng tên của chất liệu trong tập tin xuất (chỉ bên ngoài thôi)" msgid "UV layer to override active" -msgstr "Dùng lớp UV trước hoạt động" +msgstr "Tầng UV thay thế cái đang hoạt động" msgid "Horizontal dimension of the baking map (external only)" -msgstr "Bề rộng ngang của bản đồ nướng (chỉ cho lưu ở ngoài)" +msgstr "Kích thước chiều ngang của ánh xạ nướng (chỉ bên ngoài thôi)" msgctxt "Operator" @@ -61163,87 +67092,87 @@ msgstr "Thêm Máy Quay Phim" msgid "Add a camera object to the scene" -msgstr "Thêm một vật thể máy quay phim trong cảnh" +msgstr "Thêm đối tượng máy quay phim vào cảnh" msgctxt "Operator" msgid "Clear Library Override" -msgstr "Xóa Đồ Vượt Quyền Thư Viện" +msgstr "Xóa Vượt Quyền Thư Viện" msgid "Delete the selected local overrides and relink their usages to the linked data-blocks if possible, else reset them and mark them as non editable" -msgstr "Xóa các đồ vượt quyền địa phương được chọn và kết nối lại sử dụng đến các cục dữ liệu được liên kết, nếu có thể, hoặc đặt lại nó và ký dấu nó không thể biên tập " +msgstr "Xóa các vượt quyền cục bộ đã chọn và liên kết lại mức sử dụng của chúng với các khối dữ liệu liên kết nếu có thể, nếu không, hãy hoàn chúng lại và đánh dấu chúng là không thể chỉnh sửa được" msgctxt "Operator" msgid "Add to Collection" -msgstr "Thêm vào Sưu Tập" +msgstr "Thêm vào Bộ Sưu Tập" msgid "Add an object to a new collection" -msgstr "Thêm một vật thể vào một sưu tập mới" +msgstr "Thêm một đối tượng vào một bộ sưu tập mới" msgctxt "Operator" msgid "Add Collection" -msgstr "Thêm Sưu Tập" +msgstr "Thêm Bộ Sưu Tập" msgid "Add the dragged collection to the scene" -msgstr "Thêm sưu tập được kéo đến vào cảnh" +msgstr "Thêm bộ sưu tập kéo rê vào cảnh" msgid "Add the dropped collection as collection instance" -msgstr "Thêm sưu tập được thả làm thực thể sưu tập" +msgstr "Thêm bộ sưu tập đã bỏ làm thực thể bộ sưu tập" msgctxt "Operator" msgid "Add Collection Instance" -msgstr "Thêm Thực Thể Sưu Tập" +msgstr "Thêm Thực Thể Bộ Sưu Tập" msgid "Add a collection instance" -msgstr "Thêm một thực thể sưu tập" +msgstr "Thêm một thực thể bộ sưu tập" msgid "Collection name to add" -msgstr "Tên của sưu tập thêm" +msgstr "Tên của bộ sưu tập để thêm" msgctxt "Operator" msgid "Link to Collection" -msgstr "Liên Kết với Sưu Tập" +msgstr "Kết Nối với Bộ Sưu Tập" msgid "Add an object to an existing collection" -msgstr "Thêm một vật thể vào sưu tập đang tồn tại" +msgstr "Thêm một đối tượng vào một bộ sưu tập tồn tại" msgctxt "Operator" msgid "Select Objects in Collection" -msgstr "Chọn Vật Thể trong Sưu Tập" +msgstr "Lựa Chọn Đối Tượng trong Bộ Sưu Tập" msgid "Select all objects in collection" -msgstr "Chọn hết vật thể trong sưu tập" +msgstr "Lựa chọn toàn bộ các đối tượng trong bộ sưu tập" msgctxt "Operator" msgid "Remove Collection" -msgstr "Rút Sưu Tập" +msgstr "Xóa Bộ Sưu Tập" msgid "Remove the active object from this collection" -msgstr "Rút vật thể hoạt động từ sưu tập này" +msgstr "Xóa bỏ đối tượng đang hoạt động khỏi bộ sưu tập này" msgctxt "Operator" msgid "Unlink Collection" -msgstr "Cắt Liên Kết Sưu Tập" +msgstr "Ngắt Kết Nối Bộ Sưu Tập" msgid "Unlink the collection from all objects" -msgstr "Cắt liên kết của sưu tập từ tất cả vật thể" +msgstr "Ngắt kết nối của bộ sưu tập khỏi toàn bộ các đối tượng" msgctxt "Operator" @@ -61252,86 +67181,103 @@ msgstr "Thêm Ràng Buộc" msgid "Add a constraint to the active object" -msgstr "Thêm một ràng buộc cho vật thể hoạt động" +msgstr "Thêm một ràng buộc vào đối tượng đang hoạt động" msgctxt "Operator" msgid "Add Constraint (with Targets)" -msgstr "Thêm Ràng Buộc" +msgstr "Thêm Ràng Buộc (với Mục Tiêu)" msgid "Add a constraint to the active object, with target (where applicable) set to the selected objects/bones" -msgstr "Thêm một ràng buộc cho vật thể hoạt động, với mục tiêu (khi được áp dụng) đặt cho các vật thể/xương được chọn " +msgstr "Thêm một ràng buộc vào đối tượng đang hoạt động, với mục tiêu (nơi có thể) đặt cho các đối tượng/xương đã chọn" msgctxt "Operator" msgid "Clear Object Constraints" -msgstr "Xóa Ràng Buộc Vật Thể" +msgstr "Xóa các Ràng Buộc của Đối Tượng" + + +msgid "Clear all constraints from the selected objects" +msgstr "Xóa toàn bộ các ràng buộc khỏi các đối tượng đã chọn" msgctxt "Operator" msgid "Copy Constraints to Selected Objects" -msgstr "Chép Ràng Buộc Đến Vật Thể Được Chọn" +msgstr "Sao Chép Ràng Buộc sang các Đối Tượng được Chọn" msgid "Copy constraints to other selected objects" -msgstr "Chép lại ràng buộc đến các vật thể khác được chọn" +msgstr "Sao chép ràng buộc sang các đối tượng được chọn khác" msgctxt "Operator" msgid "Convert To" -msgstr "Biến Đổi Thành" +msgstr "Chuyển Đổi Thành" msgid "Convert selected objects to another type" -msgstr "Biến đổi các vật thể được chọn thành loại khác" +msgstr "Chuyển đổi các đối tượng được chọn sang một thể loại khác" + + +msgctxt "Object" +msgid "Keep Original" +msgstr "Duy Trì Bản Gốc" msgid "Keep original objects instead of replacing them" -msgstr "Giữ các vật thể gốc và không thay thế cho chúng nó" +msgstr "Duy trì các đối tượng gốc, thay vì thay thế chúng" + + +msgid "Merge UVs" +msgstr "Hợp nhất UV" msgid "Merge UV coordinates that share a vertex to account for imprecision in some modifiers" -msgstr "Gồm những tọa độ UV đang chia sẻ cùng đỉnh để ứng phó cho thiếu chính xác của vài bộ điều chỉnh" +msgstr "Hợp nhất các tọa độ UV có chung một điểm đỉnh để giải thích sự không chính xác trong một số bộ điều chỉnh" msgid "Type of object to convert to" -msgstr "Biến đổi thành loại vật nào" +msgstr "Thể loại đối tượng để chuyển đổi sang" msgid "Curve from Mesh or Text objects" -msgstr "Đường Cong từ vật thể Mạng Lưới hay Văn Bản" +msgstr "Đường Cong từ các đối tượng Khung Lưới hoặc Văn Bản" + + +msgid "Grease Pencil from Curve or Mesh objects" +msgstr "Bút Chì Dầu từ các đối tượng Đường Cong hoặc Khung Lưới" msgid "Curves from evaluated curve data" -msgstr "Đường cong từ dữ liệu đã được tính toán" +msgstr "Đường cong từ dữ liệu đường cong đã tính toán" msgctxt "Operator" msgid "Copy Global Transform" -msgstr "Chép Biến Hóa Toàn Cầu" +msgstr "Sao Chép Biến Hóa Toàn Cầu" msgid "Copies the matrix of the currently active object or pose bone to the clipboard. Uses world-space matrices" -msgstr "Chép ma trận của vật thể hoạt động hiện tại hay xương dạng đứng vào bảng dán. Nó dùng ma trận không gian thế giới" +msgstr "Sao chép ma trận của đối tượng hiện đang hoạt động hoặc xương tư thế vào bộ nhớ tạm. Sử dụng ma trận không gian thế giới" msgctxt "Operator" msgid "Corrective Smooth Bind" -msgstr "Trói Chỉnh Mịn" +msgstr "Kết Buộc Làm Mịn để Sửa Sai" msgid "Bind base pose in Corrective Smooth modifier" -msgstr "Trói dạng đứng cơ sở trong bộ điều chỉnh Mịn Sửa" +msgstr "Kết buộc tư thế cơ sở trong bộ điều chỉnh Làm Mịn để Sửa Sai" msgctxt "Operator" msgid "Add Empty Curves" -msgstr "Thêm Đường Cong Rỗng" +msgstr "Thêm Đường Cong Trống Rỗng" msgid "Add an empty curve object to the scene with the selected mesh as surface" -msgstr "Thêm một vật thể đường cong rỗng vào cảnh và mạng lưới được chọn làm bề mặt" +msgstr "Thêm một đối tượng đường cong trống rỗng vào cảnh với khung lưới đã chọn làm bề mặt" msgctxt "Operator" @@ -61340,49 +67286,49 @@ msgstr "Thêm Đường Cong Ngẫu Nhiên" msgid "Add a curves object with random curves to the scene" -msgstr "Thêm một vật thể đường cong có đường cong ngẫu nhiên vào cảnh" +msgstr "Thêm một đối tượng đường cong với các đường cong ngẫu nhiên vào cảnh" msgctxt "Operator" msgid "Add Object Data Instance" -msgstr "Thêm Thực Thể Dữ Liệu Vật Thể" +msgstr "Thêm Thực Thể Dữ Liệu Đối Tượng" msgid "Add an object data instance" -msgstr "Thêm một thực thể dữ liệu vật thể" +msgstr "Thêm một thực thể dữ liệu đối tượng" msgctxt "Operator" msgid "Transfer Mesh Data" -msgstr "Truyền Dữ Liệu Mạng Lưới" +msgstr "Thuyên Chuyển Dữ Liệu của Khung Lưới" msgid "Transfer data layer(s) (weights, edge sharp, etc.) from active to selected meshes" -msgstr "Truyền (các) lớp dữ liệu (quyền lượng, cạnh bén, v.v.) từ các mạng lưới hoạt động đến mạng lưới được chọn" +msgstr "Thuyên chuyển các tầng dữ liệu (trọng lượng, độ sắc nhọn của cạnh, ...) từ khung lưới đang hoạt động sang khung lưới được chọn" msgid "Which data to transfer" -msgstr "Truyền dữ liệu nào" +msgstr "Dữ liệu nào để thuyên chuyển sang" msgid "Vertex Group(s)" -msgstr "(Các) Nhóm Đỉnh" +msgstr "(Các) Nhóm Điểm Đỉnh" msgid "Subdivision Crease" -msgstr "Nhăn Phân Hóa" +msgstr "Nếp Gấp Phân Hóa" msgid "Transfer crease values" -msgstr "Truyền giá trị nhăn" +msgstr "Thuyên chuyển các giá trị của nếp gấp" msgid "Factor controlling precision of islands handling (the higher, the better the results)" -msgstr "Hệ số điều khiển độ chính xác khi xử lý đảo (càng cao, kết qủa càng tốt)" +msgstr "Hệ số điều khiển độ chính xác của việc xử lý các hải đảo (càng cao thì kết quả càng tốt)" msgid "Factor to use when applying data to destination (exact behavior depends on mix mode)" -msgstr "Hệ số dùng khi áp dụng dữ liệu với đích (hành vi tùy chế độ pha trộn)" +msgstr "Hệ số để sử dụng khi áp dụng dữ liệu vào đích (thực tế xử lý thế nào còn tùy vào chế độ hòa trộn)" msgid "Auto Transform" @@ -61393,53 +67339,53 @@ msgid "" "Automatically compute transformation to get the best possible match between source and destination meshes.\n" "Warning: Results will never be as good as manual matching of objects" msgstr "" -"Tự động tính biến hóa cho được giống nhau nhất giữa mạng lưới nguồn và mạng lưới đích.\n" -"Cảnh Báo: Kết qủa sẽ không bao giờ tốt bằng tìm bằng tay vật thể giống nhau" +"Tự động tính toán biến hóa để tìm trường hợp khung lưới nguồn khớp với khung lưới đích nhiều nhất\n" +"(Cảnh báo: Kết quả sẽ không bao giờ tốt bằng việc so sánh các đối tượng một cách thủ công)" msgid "Create Data" -msgstr "Chế Tạo Dữ Liệu" +msgstr "Kiến Tạo Dữ Liệu" msgid "Add data layers on destination meshes if needed" -msgstr "Thêm lớp dữ liếu cho mạng lưới đích nếu cần" +msgstr "Thêm tầng dữ liệu vào các khung lưới đích nếu cần" msgid "Freeze Operator" -msgstr "Thao Tác Đông Băng" +msgstr "Cố Định Hình Thao Tác" msgid "Prevent changes to settings to re-run the operator, handy to change several things at once with heavy geometry" -msgstr "Ngăn chặn đổi cài đặt của thao tác chạy lại, tiện cho đổi nhiều điều một lượt có hình dạng phức tạp" +msgstr "Ngăn ngừa những thay đổi trong sắp đặt gây cho thao tác phải tái thi hành. Tiện lợi trong việc thay đổi nhiều thứ cùng một lúc với hình học nặng nề" msgid "Reverse Transfer" -msgstr "Truyền Ngược" +msgstr "Thuyên Chuyển Ngược Chiều" msgid "Transfer from selected objects to active one" -msgstr "Truyền từ vật thể được chọn đến vật thể hoạt động" +msgstr "Thuyên chuyển từ các đối tượng được chọn sang cái đang hoạt động" msgctxt "Operator" msgid "Transfer Mesh Data Layout" -msgstr "Truyền Bố Trí Dữ Liệu Mạng Lưới" +msgstr "Thuyên Chuyển Bố Trí Dữ Liệu của Khung Lưới" msgid "Transfer layout of data layer(s) from active to selected meshes" -msgstr "Truyền bố trí của (các) lớp dữ liệu từ hoạt động đến các mạng lưới được chọn" +msgstr "Thuyên chuyển bố trí của (các) tầng dữ liệu từ cái đang hoạt động sang các khung lưới đã chọn" msgid "Exact Match" -msgstr "Chính Xác Giống" +msgstr "Khớp Hoàn Toàn" msgid "Also delete some data layers from destination if necessary, so that it matches exactly source" -msgstr "Cũng xóa lớp dữ liệu từ đích nếu cần, cho nó giống hệt nguồn" +msgstr "Đồng thời xóa các tầng lớp dữ liệu khỏi đích nếu cần, hầu cho nó khớp với nguồn hoàn toàn" msgid "Delete selected objects" -msgstr "Xóa các vật thể được chọn" +msgstr "Xóa các đối tượng đã chọn" msgid "Delete Globally" @@ -61447,16 +67393,29 @@ msgstr "Xóa Toàn Cầu" msgid "Remove object from all scenes" -msgstr "Rút vật thể từ tất cả cảnh" +msgstr "Loại bỏ đối tượng khỏi toàn bộ các cảnh" + + +msgctxt "Operator" +msgid "Drop Geometry Node Group on Object" +msgstr "Thả Nhóm Nút Hình Học trên Đối Tượng" + + +msgid "Session UUID of the geometry node group being dropped" +msgstr "UUID phiên sử dụng của nhóm nút hình học đang được thả" + + +msgid "Show the datablock selector in the modifier" +msgstr "Hiển thị trình chọn khối dữ liệu trong bộ điều chỉnh" msgctxt "Operator" msgid "Add Empty Image/Drop Image to Empty" -msgstr "Kèm Ảnh Rỗng/Ảnh Nền cho Vật Thể Rỗng" +msgstr "Thêm Hình Ảnh Trống/Thả Hình Ảnh vào Đối Tượng Rỗng" msgid "Add an empty image type to scene with data" -msgstr "Thêm một vật thể rỗng có ảnh và dữ liệu trong cảnh" +msgstr "Thêm một thể loại hình ảnh trống vào cảnh với dữ liệu" msgid "Filepath" @@ -61464,170 +67423,183 @@ msgstr "Đường Dẫn Tập Tin" msgid "Path to image file" -msgstr "Đường dẫn đến tập tin" +msgstr "Đường dẫn đến tập tin hình ảnh" msgctxt "Operator" msgid "Drop Named Material on Object" -msgstr "Bỏ Vật Liệu Có Tên trên Vật Thể" +msgstr "Thả Nguyên Vật Liệu có Tên lên Đối Tượng" msgctxt "Operator" msgid "Duplicate Objects" -msgstr "Bản Sao Vật Thể" +msgstr "Tạo Bản Nhân Đôi các Đối Tượng" msgid "Duplicate selected objects" -msgstr "Bản sao các vật thể đang chọn" +msgstr "Nhân đôi các đối tượng đã chọn" msgid "Duplicate the selected objects and move them" -msgstr "Bản sao các vật thể đang chọn và di chhuyển nó" +msgstr "Nhân đôi các đối tượng lựa chọn và di chuyển chúng" msgid "Duplicate Objects" -msgstr "Bản Sao Vật Thể" +msgstr "Tạo Bản Nhân Đôi các Đối Tượng" msgid "Duplicate the selected objects, but not their object data, and move them" -msgstr "Tạo bản sao của các vật thể được chọn, nhưng không phải dữ liệu vật thể, và di chuyển chúng nó" +msgstr "Nhân đôi các đối tượng đã chọn, song không nhân đôi dữ liệu đối tượng của chúng và di chuyển chúng" msgctxt "Operator" msgid "Make Instances Real" -msgstr "Thực Thể Thành Thật" +msgstr "Biến Thực Thể thành Thật" msgid "Make instanced objects attached to this object real" -msgstr "Làm vật thể thực thể được gắn với vật thể này thành thật" +msgstr "Biến các đối tượng thực thể gắn với đối tượng này thành thật" msgid "Parent newly created objects to the original instancer" -msgstr "Đặt vật thể mới chế tạo là con cái của vật thể thực thể ban đầu" +msgstr "Phụ huynh hóa các đối tượng mới kiến tạo với thực thể viên gốc" msgid "Keep Hierarchy" -msgstr "Giữ Phân Cấp" +msgstr "Duy Trì Thứ Bậc" msgid "Maintain parent child relationships" -msgstr "Giữ nguyên quan hệ phủ huynh và con cái" +msgstr "Duy trì quan hệ phụ huynh và con cái" msgctxt "Operator" msgid "Toggle Edit Mode" -msgstr "Bật/Tắt Chế Độ Biên Tập" +msgstr "Bật/Tắt Chế Độ Biên Soạn" msgid "Toggle object's edit mode" -msgstr "Bật/tắt chế độ biên tập của vật thể" +msgstr "Bật/tắt chế độ biên soạn của đối tượng" msgctxt "Operator" msgid "Add Effector" -msgstr "Thêm Bộ Hiệu Ứng" +msgstr "Thêm Hiệu Ứng Viên" msgid "Add an empty object with a physics effector to the scene" -msgstr "Thêm vật thể rỗng có hiệu ứng vật lý trong cảnh" +msgstr "Thêm một đối tượng rỗng với một hiệu ứng viên vật lý vào cảnh" msgctxt "Operator" msgid "Add Empty" -msgstr "Thêm Vật Thể Rỗng" +msgstr "Thêm Đối Tượng Rỗng" msgid "Add an empty object to the scene" -msgstr "Thêm vật thể rỗng trong cảnh" +msgstr "Thêm một đối tượng rỗng vào cảnh" msgctxt "Operator" msgid "Explode Refresh" -msgstr "Nạp Lại Nổ" +msgstr "Cập Nhật Nổ Tung" msgid "Refresh data in the Explode modifier" -msgstr "Nạp Lại dữ liệu trong bộ điều chỉnh Nổ" +msgstr "Cập nhật dữ liệu trong Bộ Điều Chỉnh Nổ Tung" msgctxt "Operator" msgid "Toggle Force Field" -msgstr "Bật/Tắt Lực Trường" +msgstr "Bật/Tắt Trường Lực" msgid "Toggle object's force field" -msgstr "Bật/tắt lực trường của vật thể" +msgstr "Bật/Tắt trường lực của đối tượng" msgctxt "Operator" msgid "Copy Geometry Node Group" -msgstr "Chép Nhóm Giao Điểm Hình Dạng Học" +msgstr "Sao Chép Nhóm Nút Hình Học" msgid "Copy the active geometry node group and assign it to the active modifier" -msgstr "Chép nhóm giao điểm hình dạng hoạt động và chỉ định nó cho bộ điều chỉnh hoạt động" +msgstr "Sao chép nhóm nút hình học đang hoạt động và ấn định nó cho bộ điều chỉnh đang sử dụng" msgctxt "Operator" msgid "Input Attribute Toggle" -msgstr "Bật/Tắt Ngõ Vào Đặc Điểm" +msgstr "Bật/Tắt Thuộc Tính Đầu Vào" msgid "Switch between an attribute and a single value to define the data for every element" -msgstr "Trao đổi giữa đặc điểm và một cái giá trị cho chỉ định dữ liệu từng phần tử" +msgstr "Đổi qua lại giữa một thuộc tính và một đơn giá trị để xác định dữ liệu cho mọi phần tử" + + +msgid "Input Name" +msgstr "Tên Đầu Vào" + + +msgctxt "Operator" +msgid "Move to Nodes" +msgstr "Di Chuyển đến các Nút" + + +msgid "Move inputs and outputs from in the modifier to a new node group" +msgstr "Di chuyển đầu vào và đầu ra từ trong bộ điều chỉnh sang nhóm nút mới" msgctxt "Operator" msgid "Add Grease Pencil" -msgstr "Thêm Bút Sáp" +msgstr "Thêm Bút Chì Dầu" msgid "Add a Grease Pencil object to the scene" -msgstr "Thêm một vật thể bút sáp vào cảnh" +msgstr "Thêm một đối tượng Bút Chì Dầu vào cảnh" msgid "Stroke offset for the line art modifier" -msgstr "Cách nới nét cho bộ điều chỉnh đường nghệ thuật" +msgstr "Dịch chuyển của nét vẽ dành cho bộ điều chỉnh mỹ thuật đường nét" msgid "Create an empty grease pencil object" -msgstr "Chế tạo một vật thể bút sáp trống rỗng" +msgstr "Kiến Tạo một đối tượng Bút Chì Dầu trống rỗng" msgid "Create a simple stroke with basic colors" -msgstr "Chế tạo một nét đơn giản có màu cơ bản" +msgstr "Kiến Tạo một nét vẽ với những màu cơ bản" msgid "Monkey" -msgstr "Đầu Kỷ" +msgstr "Đầu Khỉ" msgid "Construct a Suzanne grease pencil object" -msgstr "Xây dựng một vật thể bút sáp con khỉ" +msgstr "Kiến tạo một đối tượng Bút Chì Dầu Suzanne (đầu khỉ)" msgid "Scene Line Art" -msgstr "Nghệ Thuật Đường Nét Cảnh" +msgstr "Mỹ Thuật Đường Nét cho Cảnh" msgid "Quickly set up line art for the entire scene" -msgstr "Chuẩn bị nhanh nghệ thuật đường nét cho toàn cảnh" +msgstr "Nhanh chóng thiết lập mỹ thuật đường nét đối với toàn bộ cảnh" msgid "Collection Line Art" -msgstr "Nghệ Thuật Đươông Nét Sưu Tập" +msgstr "Mỹ Thuật Đường Nét cho Bộ Sưu Tập" msgid "Quickly set up line art for the active collection" -msgstr "Chuẩn bị nhanh nghệ thuật đường nét cho sưu tập hoạt động" +msgstr "Nhanh chóng thiết lập mỹ thuật đường nét đối với bộ sưu tập đang hoạt động" msgid "Quickly set up line art for the active object" -msgstr "Chuẩn bị nhanh nghệ thuật đường nét cho vật thể hoạt động" +msgstr "Nhanh chóng thiết lập mỹ thuật đường nét cho đối tượng đang hoạt động" msgid "Show In Front" -msgstr "Hiện Phía Trước" +msgstr "Hiển Thị Ở Đằng Trước" msgid "Show line art grease pencil in front of everything" @@ -61635,11 +67607,11 @@ msgstr "Hiện nghệ thuật bút sáp trước mỗi thứ" msgid "Use lights for this grease pencil object" -msgstr "Dùng các đèn cho vật thể bút sáp này" +msgstr "Sử dụng ánh sáng đối với đối tượng bút chì dầu này" msgid "Add a procedural operation/effect to the active grease pencil object" -msgstr "Thêm một tương tác/hiệu ứng thủ tục cho vật thể bút sáp hoạt động" +msgstr "Thêm một thao tác (phép toán)/hiệu ứng thủ tục vào đối tượng Bút Chì Dầu đang hoạt động" msgctxt "Operator" @@ -61648,49 +67620,49 @@ msgstr "Áp Dụng Bộ Điều Chỉnh" msgid "Apply modifier and remove from the stack" -msgstr "Áp dụng bộ điều chỉnh và xóa từ xếp đống" +msgstr "Áp dụng bộ điều chỉnh và xóa khỏi ngăn xếp" msgid "Apply As" -msgstr "Áp Dụng Như" +msgstr "Áp Dụng Tựa Như" msgid "How to apply the modifier to the geometry" -msgstr "Làm sao áp dụng bộ điều chỉnh với hình dạng" +msgstr "Phương pháp áp dụng bộ điều chỉnh vào hình học" msgid "Object Data" -msgstr "Dữ Liệu Vật Thể" +msgstr "Dữ Liệu Đối Tượng" msgid "Apply modifier to the object's data" -msgstr "Áp dụng bộ điều chỉnh với dữ liệu của vật thể" +msgstr "Áp dụng bộ điều chỉnh vào dữ liệu của đối tượng" msgid "New Shape" -msgstr "Dạng Mới" +msgstr "Hình Dạng Mới" msgid "Apply deform-only modifier to a new shape on this object" -msgstr "Áp dụng bộ điều chỉnh chỉ được méo hóa đến một dạng mới của vật thể này" +msgstr "Áp dụng bộ điều chỉnh chỉ gây biến dạng sang một hình dạng mới trên đối tượng này" msgctxt "Operator" msgid "Copy Modifier" -msgstr "Chép Bộ Điều Chỉnh" +msgstr "Sao Chép Bộ Điều Chỉnh" msgid "Duplicate modifier at the same position in the stack" -msgstr "Chép lại bộ điều chỉnh tại cùng vị trí trong xếp đống" +msgstr "Nhân đôi bộ điều chỉnh tại cùng vị trí trong ngăn xếp" msgctxt "Operator" msgid "Copy Modifier to Selected" -msgstr "Chép Bộ Điều Chỉnh đến Được Chọn" +msgstr "Sao Chép Bộ Điều Chỉnh sang cái Được Chọn" msgid "Copy the modifier from the active object to all selected objects" -msgstr "Chép bộ điều chỉnh từ vật thể hoạt động đến các vật thể được chọn" +msgstr "Sao chép bộ điều chỉnh từ đối tượng đang hoạt động sang toàn bộ các đối tượng được chọn" msgctxt "Operator" @@ -61699,16 +67671,16 @@ msgstr "Di Chuyển Bộ Điều Chỉnh Xuống" msgid "Move modifier down in the stack" -msgstr "Di chuyển bộ điều chỉnh xuống trong xếp đống" +msgstr "Di chuyển bộ điều chỉnh trong ngăn xếp xuống phía dưới" msgctxt "Operator" msgid "Move Active Modifier to Index" -msgstr "Di Chuyển Bộ Điều Chỉnh Hoạt Động đến Chỉ Số" +msgstr "Di Chuyển Bộ Điều Chỉnh đang Hoạt Động đến Chỉ Số" msgid "Change the modifier's position in the list so it evaluates after the set number of others" -msgstr "Đổi vị trí của bộ điều chỉnh trong danh sách cho nó được tính toán sau một số lượng khác" +msgstr "Chuyển đổi vị trí của bộ điều chỉnh trong danh sách, hầu cho nó được tính toán sau một số những cái khác đã định nào đó" msgid "The index to move the modifier to" @@ -61721,112 +67693,116 @@ msgstr "Di Chuyển Bộ Điều Chỉnh Lên" msgid "Move modifier up in the stack" -msgstr "Di chuyển bộ điều chỉnh lên trong xếp đống" +msgstr "Di chuyển bộ điều chỉnh trong ngăn xếp lên phía trên" msgctxt "Operator" msgid "Remove Grease Pencil Modifier" -msgstr "Xóa Bộ Điều Chỉnh Bút Sáp" +msgstr "Xóa Bộ Điều Chỉnh Bút Chì Dầu" msgid "Remove a modifier from the active grease pencil object" -msgstr "Xóa một bộ điều chỉnh từ vật thể bút sáp hoạt động" +msgstr "Xóa một bộ điều chỉnh khỏi đối tượng Bút Chì Dầu đang hoạt động" msgctxt "Operator" msgid "Hide Collection" -msgstr "Ẩn Sưu Tập" +msgstr "Ẩn Giấu Bộ Sưu Tập" msgid "Show only objects in collection (Shift to extend)" -msgstr "Chỉ hiện các vật thể trong sưu tập (bấm Shift để mở rộng)" +msgstr "Duy hiển thị các đối tượng trong bộ sưu tập mà thôi (Shift để nới rộng)" msgid "Collection Index" -msgstr "Chỉ Số Sưu Tập" +msgstr "Chỉ Số của Bộ Sưu Tập" msgid "Index of the collection to change visibility" -msgstr "Chỉ số của sưu tập để đổi sự hiển thị" +msgstr "Chỉ số của bộ sưu tập để đổi tầm nhìn (bật/tắt hiển thị)" msgid "Extend visibility" -msgstr "Mở rộng sự hiển thị" +msgstr "Nới rộng tầm nhìn" msgid "Toggle visibility" -msgstr "Bật/tắt sự hiển thị" +msgstr "Bật/tắt tính ẩn/hiện" msgctxt "Operator" msgid "Clear All Restrict Render" -msgstr "Xóa Hết Hạn Chế Kết Xuất" +msgstr "Xóa Toàn Bộ các Hạn Chế Kết Xuất" msgid "Reveal all render objects by setting the hide render flag" -msgstr "Hiện hết vật thể kết xuất bằng đặt cờ ẩn kết xuất" +msgstr "Hiện toàn bộ các đối tượng kết xuất bằng cách tắt cờ hiệu ẩn kết xuất" msgctxt "Operator" msgid "Show Hidden Objects" -msgstr "Hiện Vật Thể Ẩn" +msgstr "Hiển Thị Đối Tượng Ẩn Giấu" msgid "Reveal temporarily hidden objects" -msgstr "Hiện vật thể được ẩn tạm thời" +msgstr "Tạm thời biểu lộ (cho phép nhìn thấy) các đối tượng ẩn giấu" msgctxt "Operator" msgid "Hide Objects" -msgstr "Ẩn Vật Thể" +msgstr "Ẩn Giấu Đối Tượng" msgid "Temporarily hide objects from the viewport" -msgstr "Tạm thời ẩn vật thể từ màn chiếu" +msgstr "Tạm thời ẩn giấu các đối tượng khỏi cổng nhìn" msgid "Hide unselected rather than selected objects" -msgstr "Ẩn vật thể chưa chọn thay thế vật thế được chọn" +msgstr "Ẩn giấu đối tượng chưa chọn, thay vì đối tượng được chọn" msgctxt "Operator" msgid "Hook to New Object" -msgstr "Móc Với Vật Thể Mới" +msgstr "Móc vào Đối Tượng Mới" msgid "Hook selected vertices to a newly created object" -msgstr "Móc các đỉnh được chọn với một vật thể mới chế tạo" +msgstr "Móc các điểm đỉnh được chọn với đối tượng mới kiến tạo" msgctxt "Operator" msgid "Hook to Selected Object" -msgstr "Móc Với Vật Thể Được Chọn" +msgstr "Móc vào Đối Tượng được Chọn" msgid "Hook selected vertices to the first selected object" -msgstr "Móc các đỉnh được chọn với vật thể đầu được chọn" +msgstr "Móc các điểm đỉnh đã chọn vào đối tượng được chọn đầu tiên" + + +msgid "Assign the hook to the hook object's active bone" +msgstr "Ấn định móc vào xương đang hoạt động của đối tượng móc" msgctxt "Operator" msgid "Assign to Hook" -msgstr "Chỉ Định Móc" +msgstr "Ấn Định vào Móc" msgid "Assign the selected vertices to a hook" -msgstr "Chỉ định các đỉnh được chọn với một cái móc" +msgstr "Ấn định các điểm đỉnh được chọn vào cái móc" msgid "Modifier number to assign to" -msgstr "Số bộ điều chỉnh để chỉ định" +msgstr "Số của bộ điều chỉnh để ấn định vào" msgctxt "Operator" msgid "Recenter Hook" -msgstr "Đặt Lại Trung Tâm Móc" +msgstr "Đặt Lại Tâm của Móc" msgid "Set hook center to cursor position" -msgstr "Đặt trung tâm móc đến vị trí con trỏ" +msgstr "Đặt tâm của cái móc đến vị trí con trỏ" msgctxt "Operator" @@ -61835,227 +67811,321 @@ msgstr "Xóa Móc" msgid "Remove a hook from the active object" -msgstr "Xóa một cái móc từ vật thể hoạt động" +msgstr "Xóa một cái móc từ đối tượng đang hoạt động" msgid "Modifier number to remove" -msgstr "Số bộ điều chỉnh để xóa" +msgstr "Số của bộ điều chỉnh để xóa" msgctxt "Operator" msgid "Reset Hook" -msgstr "Đặt Lại Móc" +msgstr "Hoàn Lại Móc" msgid "Recalculate and clear offset transformation" -msgstr "Tính lại và xóa biến hóa dịch" +msgstr "Tính toán lại và xóa dịch chuyển trong biến hóa" msgctxt "Operator" msgid "Select Hook" -msgstr "Chọn Móc" +msgstr "Chọn Cái Móc" msgid "Select affected vertices on mesh" -msgstr "Chọn đỉnh được ảnh hưởng trong mạng lưới" +msgstr "Chọn các điểm đỉnh bị ảnh hưởng trong khung lưới" msgctxt "Operator" msgid "Set Offset from Cursor" -msgstr "Đặt Dịch Từ Con Trỏ" +msgstr "Đặt Dịch Chuyển từ Con Trỏ" msgid "Set offset used for collection instances based on cursor position" -msgstr "Đặt dịch được sử dụng cho thực thể sưu tập tùy vị trí con trỏ" +msgstr "Đặt dịch chuyển cho các thực thể của bộ sưu tập dựa trên vị trí của con trỏ" msgctxt "Operator" msgid "Set Offset from Object" -msgstr "Đặt Dịch từ Vật Thể" +msgstr "Đặt Dịch Chuyển từ Đối Tượng" msgid "Set offset used for collection instances based on the active object position" -msgstr "Đặt dịch được sử dụng cho thực thể sưu tập tùy vị trí của vật thể hoạt động" +msgstr "Đặt dịch chuyển sử dụng cho các thực thể bộ sưu tập dựa trên vị trí của đối tượng đang hoạt động" msgctxt "Operator" msgid "Set Cursor to Offset" -msgstr "Đặt Dịch đến Con Trỏ" +msgstr "Đặt Con Trỏ vào vị trí Dịch Chuyển" msgid "Set cursor position to the offset used for collection instances" -msgstr "Đặt vị trí con trỏ đến dịch được sử dụng cho các thực thể sưu tập" +msgstr "Đặt vị trí con trỏ vào dịch chuyển sử dụng cho các thực thể bộ sưu tập" msgctxt "Operator" msgid "Restrict Render Unselected" -msgstr "Hạn Chế Kết Xuất Chưa Chọn" +msgstr "Hạn Chế Kết Xuất cái Chưa được Chọn" msgid "Hide unselected render objects of same type as active by setting the hide render flag" -msgstr "Ẩn vật thể kết xuất chưa được chọn mà cùng loại vật thể hoạt động bằng đặt cờ ẩn kết xuất" +msgstr "Ẩn giấu các đối tượng kết xuất chưa được chọn có cùng thể loại như cái đang hoạt động bằng cách đặt cờ hiệu ẩn kết xuất" msgctxt "Operator" msgid "Join" -msgstr "Kết Nối" +msgstr "Chắp Nối/Hội Nhập" msgid "Join selected objects into active object" -msgstr "Nối vật thể được chọn vào vật thể hoạt động" +msgstr "Hội nhập các đối tượng được chọn vào đối tượng đang hoạt động" msgctxt "Operator" msgid "Join as Shapes" -msgstr "Kết Nối Dạng" +msgstr "Hội Nhập thành các Hình Dạng" msgid "Copy the current resulting shape of another selected object to this one" -msgstr "Chép hình dạng kết qủa hiện tại của một vật thể khác được chọn truyền đến vật thể này" +msgstr "Sao chép hình dạng kết quả hiện tại của một đối tượng đã chọn khác sang cái này" msgctxt "Operator" msgid "Transfer UV Maps" -msgstr "Truyền Bản Đồ UV" +msgstr "Thuyên Chuyển các Ánh Xạ UV" msgid "Transfer UV Maps from active to selected objects (needs matching geometry)" -msgstr "Truyền Bản Đồ UV từ vật thể hoạt động đến các vật thể được chọn (yêu cầu có hình dạng giống nhau)" +msgstr "Thuyên chuyển các Ánh Xạ UV từ đối tượng đang hoạt động sang cái được chọn (yêu cầu hình học xứng khớp)" msgctxt "Operator" msgid "Laplacian Deform Bind" -msgstr "Trói Méo Hóa Laplace" +msgstr "Kết Buộc Biến Dạng Laplace" msgid "Bind mesh to system in laplacian deform modifier" -msgstr "Trói mạng lưới đến hệ thống ở trong bộ điều chỉnh méo hóa Laplace" +msgstr "Kết buộc khung lưới vào hệ thống trong bộ điều chỉnh biến dạng laplace" msgctxt "Operator" msgid "Add Light" -msgstr "Thêm Đèn" +msgstr "Thêm Nguồn Ánh Sáng" msgid "Add a light object to the scene" -msgstr "Thêm một vật thể đèn vào cảnh" +msgstr "Thêm một đối tượng phát ánh sáng vào cảnh" + + +msgctxt "Operator" +msgid "New Light Linking Collection" +msgstr "Bộ Sưu Tập Liên Kết Ánh Sáng Mới" + + +msgid "Create new light linking collection used by the active emitter" +msgstr "Tạo bộ sưu tập liên kết ánh sáng mới sử dụng bởi vật phát xạ đang hoạt động" + + +msgctxt "Operator" +msgid "Link Blockers to Emitter" +msgstr "Liên Kết Vật Cản Trở với Vật Phát Xạ" + + +msgid "Light link selected blockers to the active emitter object" +msgstr "Liên kết ánh sáng các vật cản trở đã chọn với đối tượng phát xạ đang hoạt động" + + +msgid "State of the shadow linking" +msgstr "Trạng thái liên kết bóng tối" + + +msgid "Include selected blockers to cast shadows from the active emitter" +msgstr "Bao gồm các vật cản trở đã chọn để ngả bóng tối từ vật phát xạ đang hoạt động" + + +msgid "Exclude selected blockers from casting shadows from the active emitter" +msgstr "Loại trừ các vật cản trở đã chọn khỏi khả năng ngả bóng tối từ vật phát xạ đang hoạt động" + + +msgctxt "Operator" +msgid "Select Light Linking Blockers" +msgstr "Chọn các Vật Cản Trở Liên Kết Ánh Sáng" + + +msgid "Select all objects which block light from this emitter" +msgstr "Chọn toàn bộ các vật cản trở ánh sáng từ vật phát xạ này" + + +msgctxt "Operator" +msgid "Link Receivers to Emitter" +msgstr "Liên Kết Vật Tiếp Nhận với Vật Phát Xạ" + + +msgid "Light link selected receivers to the active emitter object" +msgstr "Liên kết ánh sáng từ các vật tiếp nhận đã chọn với đối tượng phát xạ đang hoạt động" + + +msgid "State of the light linking" +msgstr "Trạng thái liên kết ánh sáng" + + +msgid "Include selected receivers to receive light from the active emitter" +msgstr "Bao gồm các vật tiếp nhận đã chọn để thu nhận ánh sáng từ đối tượng phát xạ đang hoạt động" + + +msgid "Exclude selected receivers from receiving light from the active emitter" +msgstr "Loại trừ các vật tiếp nhận đã chọn khỏi sự thu nhận ánh sáng từ đối tượng phát xạ đang hoạt động" + + +msgctxt "Operator" +msgid "Select Light Linking Receivers" +msgstr "Chọn Vật Tiếp Nhận Ánh Sáng Liên Kết" + + +msgid "Select all objects which receive light from this emitter" +msgstr "Chọn toàn bộ các đối tượng tiếp nhận ánh sáng từ vật phát xạ này" + + +msgctxt "Operator" +msgid "Remove From Light Linking Collection" +msgstr "Xóa Khỏi Bộ Sưu Tập Liên Kết Ánh Sáng" + + +msgid "Remove this object or collection from the light linking collection" +msgstr "Xóa đối tượng hoặc bộ sưu tập này khỏi bộ sưu tập liên kết ánh sáng" msgctxt "Operator" msgid "Add Light Probe" -msgstr "Thêm Quang Kế" +msgstr "Thêm Bộ Thăm Dò Ánh Sáng" msgid "Add a light probe object" -msgstr "Thêm một quang kế" +msgstr "Thêm một bộ thăm dò ánh sáng" msgctxt "Operator" msgid "Bake Light Cache" -msgstr "Đệm Chứa Ánh Sáng Nướng" +msgstr "Nướng Bộ Đệm Nhớ Ánh Sáng" + + +msgid "Bake irradiance volume light cache" +msgstr "Nướng bộ nhớ đệm ánh sáng thể tích chiếu xạ" msgid "Delay in millisecond before baking starts" -msgstr "Trì hoãn bằng 1/1000 giây" +msgstr "Trì hoãn trước khi nướng, trong đơn vị mili-giây" msgid "Subset" -msgstr "Tập Phụ" +msgstr "Tập Hợp Con" msgid "Subset of probes to update" -msgstr "Hạ tập của ánh sáng kế để nâng cấp" +msgstr "Tập hợp con của các bộ thăm dò ánh sáng để cập nhật" msgid "Selected Only" -msgstr "Chỉ Được Chọn" +msgstr "Duy cái được Chọn" msgctxt "Operator" msgid "Delete Light Cache" -msgstr "Xóa Đệm Chứa Ánh Sáng" +msgstr "Xóa Bộ Đệm Nhớ về Ánh Sáng" msgid "Delete cached indirect lighting" -msgstr "Xóa ánh sáng gián tiếp được chứa" +msgstr "Xóa ánh sáng gián tiếp đã ghi trong bộ đệm nhớ" msgid "All Light Probes" -msgstr "Hết Ánh Sáng Kế" +msgstr "Toàn Thể các vật Thăm Dò Ánh Sáng" + + +msgid "Delete all light probes' baked lighting data" +msgstr "Xóa toàn bộ dữ liệu bố trí ánh sáng của đầu dò ánh sáng" + + +msgid "Only delete selected light probes' baked lighting data" +msgstr "Duy xóa dữ liệu bố trí ánh sáng đã chọn của đầu dò ánh sáng" + + +msgid "Only delete the active light probe's baked lighting data" +msgstr "Duy xóa dữ liệu bố trí ánh sáng đã nướng của đầu dò ánh sáng đang hoạt động" msgctxt "Operator" msgid "Bake Line Art" -msgstr "Nướng Nghệ Thuật Đường Nét" +msgstr "Nướng Mỹ Thuật Đường Nét" msgid "Bake Line Art for current GPencil object" -msgstr "Nướng Nghệ Thuật Đường Nét của vật thể Bút Sáp hiện tại" +msgstr "Nướng Mỹ Thuật Đường Nét của đối tượng Bút Sáp hiện tại" msgctxt "Operator" msgid "Bake Line Art (All)" -msgstr "Nướng Nghệ Thuật Đường Nét (Hết)" +msgstr "Nướng Mỹ Thuật Đường Nét (Toàn Bộ)" msgid "Bake all Grease Pencil objects that have a line art modifier" -msgstr "Nướng hết vật thể Bút Sáp có một bộ điều chỉnh nghệ thuật đường nét" +msgstr "Nướng toàn bộ các đối tượng Bút Chì Dầu có bộ điều chỉnh mỹ thuật đường nét" msgctxt "Operator" msgid "Clear Baked Line Art" -msgstr "Xoá Nghệ Thuật Đường Nét Đã Nướng" +msgstr "Xóa Mỹ Thuật Đường Nét Đã Nướng" msgid "Clear all strokes in current GPencil object" -msgstr "Xóa hết nét trong vật thể Bút Sáp hiện tại" +msgstr "Xóa toàn bộ các nét vẽ trong đối tượng Bút Chì Dầu hiện tại" msgctxt "Operator" msgid "Clear Baked Line Art (All)" -msgstr "Xóa Nghệ Thuật Đường Nét Đã Nướng (Hết)" +msgstr "Xóa Mỹ Thuật Đường Nét Đã Nướng (Toàn Bộ)" msgid "Clear all strokes in all Grease Pencil objects that have a line art modifier" -msgstr "Xóa hết nét trong hết vật thể Bút Sáp có một bộ điều chỉnh nghệ thuật đường nét" +msgstr "Xóa toàn bộ các nét trong toàn bộ các đối tượng Bút Chì Dầu có bộ điều chỉnh mỹ thuật đường nét" msgid "Link objects to a collection" -msgstr "Liên kết vật thể với một sưu tập" +msgstr "Kết nối các đối tượng vào một bộ sưu tập" msgid "Index of the collection to move to" -msgstr "Truyền đến chỉ số sưu tập nào" +msgstr "Chỉ số của bộ sưu tập để chuyển tới" msgid "Move objects to a new collection" -msgstr "Truyền vật thể đến sưu tập mới" +msgstr "Chuyển các đối tượng tới một bộ sưu tập mới" msgid "Name of the newly added collection" -msgstr "Tên của sưu tập mới" +msgstr "Tên của bộ sưu tập mới được thêm vào" msgctxt "Operator" msgid "Load Background Image" -msgstr "Nhập Ảnh Nền" +msgstr "Nạp Hình Ảnh Nền" msgid "Add a reference image into the background behind objects" -msgstr "Thêm một ảnh tham chiếu vào nền phía sau vật thể" +msgstr "Thêm một hình ảnh tham chiếu vào nền, đằng sau các đối tượng" msgid "Align to View" -msgstr "Sắp Xếp với Màn" +msgstr "Căn Chỉnh theo Góc Nhìn" msgctxt "Operator" msgid "Load Reference Image" -msgstr "Nhập Ảnh Tham Chiếu" +msgstr "Nạp Hình Ảnh Tham Chiếu" msgid "Add a reference image into the scene between objects" -msgstr "Thêm một ảnh tham chiếu vào cảnh giữa vật thể" +msgstr "Thêm một hình ảnh tham chiếu vào cảnh, giữa các đối tượng" msgctxt "Operator" @@ -62064,85 +68134,85 @@ msgstr "Xóa Vị Trí" msgid "Clear the object's location" -msgstr "Xóa vị trí của vật thể" +msgstr "Xóa vị trí của đối tượng" msgid "Clear Delta" -msgstr "Xoá Lệch Lạc" +msgstr "Xóa Delta" msgid "Clear delta location in addition to clearing the normal location transform" -msgstr "Xóa lệch lạc vị trí khi xóa biến hóa dịch bình thường" +msgstr "Khi xóa biến hóa vị trí bình thường thì xóa cả vị trí Delta nữa" msgctxt "Operator" msgid "Make Instance Face" -msgstr "Chế Tạo Mặt Thực Thể" +msgstr "Tạo Thực Thể theo Mặt" msgid "Convert objects into instanced faces" -msgstr "Biến đổi vật thể thành thực thể mặt" +msgstr "Chuyển đổi các đối tượng sang thành các bản sao theo các mặt" msgctxt "Operator" msgid "Link/Transfer Data" -msgstr "Liên Kết/Truyền Dữ Liệu" +msgstr "Kết Nối/Thuyên Chuyển Dữ Liệu" msgid "Transfer data from active object to selected objects" -msgstr "Truyền dữ liệu từ vật thể hoạt động đến các vật thể được chọn" +msgstr "Chuyển dữ liệu từ đối tượng hiện đang hoạt động sang đối tượng đã chọn" msgid "Link Object Data" -msgstr "Dữ Liệu Vật Thể Liên Kết" +msgstr "Kết Nối Dữ Liệu Đối Tượng" msgid "Replace assigned Object Data" -msgstr "Thay thế cho Dữ Liệu Vật Thể được chỉ định" +msgstr "Thay Thế Dữ Liệu Đối Tượng đã được Ấn Định" msgid "Link Materials" -msgstr "Liên Kết Vật Liệu" +msgstr "Kết Nối Nguyên Vật Liệu" msgid "Replace assigned Materials" -msgstr "Thay thế cho Vật Liệu được chỉ định" +msgstr "Thay thế nguyên vật liệu đã được ấn định" msgid "Link Animation Data" -msgstr "Dữ Liệu Hoạt Hình Liên Kết" +msgstr "Kết Nối Dữ Liệu Hoạt Họa" msgid "Replace assigned Animation Data" -msgstr "Thay thế cho Dữ Liệu Hoạt Hình" +msgstr "Thay thế dữ liệu hoạt họa đã được ấn định" msgid "Link Collections" -msgstr "Liên Kết Sưu Tập" +msgstr "Kết nối các Bộ Sưu Tập" msgid "Replace assigned Collections" -msgstr "Thay thế cho Sưu Tập được chọn" +msgstr "Thay thế các bộ sưu tập đã được ấn định" msgid "Link Instance Collection" -msgstr "Sưu Tập Thực Thể Liên Kết" +msgstr "Kết Nối Bộ Sưu Tập Thực Thể" msgid "Replace assigned Collection Instance" -msgstr "Thay thế cho Sưu Tập Thực Thể được chỉ định" +msgstr "Thay thế Thực Thể Bộ Sưu Tập đã được ấn định" msgid "Link Fonts to Text" -msgstr "Liên Kết Phông đến Văn Bản" +msgstr "Kết Nối Phông Chữ với Văn Bản" msgid "Replace Text object Fonts" -msgstr "Thay thế cho Phông của vật thể Văn Bản" +msgstr "Thay thế Phông của đối tượng Văn Bản" msgid "Copy Modifiers" -msgstr "Chép Bộ Điều Chỉnh" +msgstr "Sao Chép Bộ Điều Chỉnh" msgid "Replace Modifiers" @@ -62150,171 +68220,171 @@ msgstr "Thay Thế Bộ Điều Chỉnh" msgid "Copy Grease Pencil Effects" -msgstr "Chép Hiệu Ứng Bút Sáp" +msgstr "Sao Chép Hiệu Ứng Bút Chì Dầu" msgid "Replace Grease Pencil Effects" -msgstr "Thay Thế Cho Hiệu Ứng Bút Sáp" +msgstr "Thay Thế Hiệu Ứng Bút Chì Dầu" msgctxt "Operator" msgid "Link Objects to Scene" -msgstr "Liên Kết Vật Thể Với Cảnh" +msgstr "Kết Nối các Đối Tượng với Cảnh" msgid "Link selection to another scene" -msgstr "Liên kết sự lựa chọn với cảnh khác" +msgstr "Kết nối lựa chọn với một cảnh khác" msgctxt "Operator" msgid "Make Local" -msgstr "Đổi Thành Địa Phương" +msgstr "Cục Bộ Hóa" msgid "Make library linked data-blocks local to this file" -msgstr "Làm cục dữ liệu thư viện được liên kết thành địa phương trong tập tin này" +msgstr "Cục bộ hóa các khối dữ liệu thư viện kết nối vào tập tin này" msgid "Selected Objects and Data" -msgstr "Vật Thể Và Dữ Liệu Được Chọn" +msgstr "Đối Tượng và Dữ Liệu đã Chọn" msgid "Selected Objects, Data and Materials" -msgstr "Vật Thể, Dữ Liệu, Và Vật Liệu Được Chọn" +msgstr "Đối Tượng, Dữ Liệu, và Nguyên Vật Liệu đã Chọn" msgctxt "Operator" msgid "Make Library Override" -msgstr "Chế Tạo Vượt Quyền Thư Viện" +msgstr "Tạo sự Vượt Quyền Thư Viện" msgid "Create a local override of the selected linked objects, and their hierarchy of dependencies" -msgstr "Làm một đồ vượt quyền địa phương cho các cục dữ liệu được liên kết, và tầng bậc phụ thuộc của chúng nó" +msgstr "Kiến Tạo sự vượt quyền cục bộ cho các đối tượng kết nối lựa chọn, và các thứ bậc phụ thuộc của chúng" msgid "Override Collection" -msgstr "Vượt Quyền Sưu Tập" +msgstr "Bộ Sưu Tập Vượt Quyền" msgid "Session UUID of the directly linked collection containing the selected object, to make an override from" -msgstr "UUID phiên chạy của sưu tập được liên kết trực tiếp đang chứa vật thê được chọn, để làm một đồ vượt quyền từ nó" +msgstr "UUID của phiên sử dụng của bộ sưu tập liên kết trực tiếp có chứa đối tượng đã chọn, để thực hiện vượt quyền từ đó" msgid "Make linked data local to each object" -msgstr "Làm dữ liệu liên kết thành địa phương cho mỗi vật thể" +msgstr "Cục bộ hóa dữ liệu kết nối vào mỗi đối tượng" msgid "Object Animation" -msgstr "Hoạt Hình Vật Thể" +msgstr "Hoạt họa của Đối Tượng" msgid "Make object animation data local to each object" -msgstr "Làm dữ liệu hoạt hình thành địa phương cho mỗi vật thể" +msgstr "Làm cho dữ liệu hoạt họa của đối tượng trở thành cục bộ" msgid "Make materials local to each data-block" -msgstr "Làm vật liệu thành địa phương cho mỗi cục dữ liệu" +msgstr "Cục bộ hóa các nguyên vật liệu vào mỗi khối dữ liệu" msgid "Make single user object data" -msgstr "Đổi thành dữ liệu vật thể một người dùng" +msgstr "Biến dữ liệu đối tượng thành đơn người dùng" msgid "Object Data Animation" -msgstr "Hoạt Hình Dữ Liệu Vật Thể" +msgstr "Dữ Liệu, Hoạt Họa của Đối Tượng" msgid "Make object data (mesh, curve etc.) animation data local to each object" -msgstr "Làm dữ liệu vật thể (mạng lưới, đường cong, v.v.) dữ liệu hoạt hình thành địa phương cho mỗi vật thể" +msgstr "Làm cho dữ liệu đối tượng (khung lưới, đường cong v.v.), dữ liệu hoạt họa trở thành cục bộ tại mỗi đối tượng" msgid "Make single user objects" -msgstr "Đổi thành vật thể một người dùng" +msgstr "Biến thành các đối tượng đơn người dùng" msgctxt "Operator" msgid "Add Material Slot" -msgstr "Thêm Khe Vật Liệu" +msgstr "Thêm Khe Nguyên Vật Liệu" msgid "Add a new material slot" -msgstr "Thêm một khe vật liệu" +msgstr "Thêm một khe nguyên vật liệu mới" msgctxt "Operator" msgid "Assign Material Slot" -msgstr "Chỉ Định Khe Vật Liệu" +msgstr "Chỉ Định Khe Nguyên Vật Liệu" msgid "Assign active material slot to selection" -msgstr "Chỉ định khe vật liệu hoạt động đến sự lựa chọn" +msgstr "Chỉ định khe nguyên vật liệu cho lựa chọn" msgctxt "Operator" msgid "Copy Material to Selected" -msgstr "Chép Vật Liệu Đến Được Chọn" +msgstr "Sao Chép Nguyên Vật Liệu sang Cái được Chọn" msgid "Copy material to selected objects" -msgstr "Chép lại vật liệu đến các vật thể được chọn" +msgstr "Sao chép nguyên vật liệu sang các đối tượng được chọn" msgctxt "Operator" msgid "Deselect Material Slot" -msgstr "Thả Khe Vật Liệu" +msgstr "Hủy Chọn Khe Nguyên Vật Liệu" msgid "Deselect by active material slot" -msgstr "Thả bằng khe vật liệu hoạt động" +msgstr "Hủy chọn theo khe nguyên vật liệu đang hoạt động" msgctxt "Operator" msgid "Move Material" -msgstr "Di Chuyển Vật Liệu" +msgstr "Di Chuyển Nguyên Vật Liệu" msgid "Move the active material up/down in the list" -msgstr "Di chuyển vật liệu hoạt động lên/xuống trong danh sách" +msgstr "Di chuyển nguyên vật liệu đang hoạt động lên/xuống trong danh sách" msgid "Direction to move the active material towards" -msgstr "Hướng để di chuyển vật liệu hoạt động" +msgstr "Phương hướng để di chuyển nguyên vật liệu đang hoạt động" msgctxt "Operator" msgid "Remove Material Slot" -msgstr "Xóa Khe Vật Liệu" +msgstr "Xóa Khe Nguyên Vật Liệu" msgid "Remove the selected material slot" -msgstr "Xóa khe vật liệu được chọn" +msgstr "Xóa khe nguyên vật liệu đã chọn" msgctxt "Operator" msgid "Remove Unused Slots" -msgstr "Xóa Các Khe Chưa Dùng" +msgstr "Xóa các Khe Không Sử Dụng Đến" msgid "Remove unused material slots" -msgstr "Xóa khe vật liệu chưa dùng" +msgstr "Xóa các khe chất liệu không sử dụng đến" msgctxt "Operator" msgid "Select Material Slot" -msgstr "Chọn Khe Vật Liệu" +msgstr "Chọn Khe Nguyên Vật Liệu" msgid "Select by active material slot" -msgstr "Chọn bằng khe vật liệu hoạt động" +msgstr "Chọn theo khe nguyên vật liệu đang hoạt động" msgctxt "Operator" msgid "Mesh Deform Bind" -msgstr "Trói Méo Hóa Mạng Lưới" +msgstr "Kết Buộc Biến Dạng Khung Lưới" msgid "Bind mesh to cage in mesh deform modifier" -msgstr "Trói mạng lưới với lồng trong bộ điều chỉnh méo hóa mạng lưới" +msgstr "Kết buộc khung lưới với khung lồng trong bộ điều chỉnh biến dạng khung lưới" msgctxt "Operator" @@ -62323,54 +68393,54 @@ msgstr "Thêm Siêu Cầu" msgid "Add an metaball object to the scene" -msgstr "Thêm một siêu cầu trong cảnh" +msgstr "Thêm một Siêu Cầu vào cảnh" msgid "Primitive" -msgstr "Cơ Bản" +msgstr "Hình Cơ Bản" msgctxt "Operator" msgid "Set Object Mode" -msgstr "Đặt Chế Độ Vật Thể" +msgstr "Đặt Chế Độ Đối Tượng" msgid "Sets the object interaction mode" -msgstr "Đặt chế độ tương tác vật thể" +msgstr "Đặt chế độ tương tác với đối tượng" msgctxt "Operator" msgid "Set Object Mode with Sub-mode" -msgstr "Đặt Chế Độ Vật Thể bởi Hạ Chế Độ" +msgstr "Đặt Chế Độ Đối Tượng với chế độ thứ cấp" msgid "Mesh Mode" -msgstr "Chế Độ Mạng Lưới" +msgstr "Chế Độ Khung Lưới" msgid "Add a procedural operation/effect to the active object" -msgstr "Kèm tương tác/hiệu ứng thủ tục cho vật thể hoạt động" +msgstr "Thêm một phép toán/hiệu ứng thủ tục vào đối tượng đang hoạt động" msgid "For mesh objects, merge UV coordinates that share a vertex to account for imprecision in some modifiers" -msgstr "Vật thể mạn lưới, gồm tọa độ UV đang chia sẻ cùng một đỉnh để ứng phó cho thiếu chính xác của vài bộ điều chỉnh" +msgstr "Đối với các đối tượng khung lưới, hợp nhất các tọa độ UV có chung một điểm đỉnh để giải thích sự không chính xác trong một số bộ điều chỉnh" msgid "Make Data Single User" -msgstr "Làm Dữ Liệu Sang Một Người Sử Dụng" +msgstr "Biến Dữ Liệu thành Đơn Người Dùng" msgid "Make the object's data single user if needed" -msgstr "Làm dữ liệu của vật thể sang một người sử dụng nếu cần thiết" +msgstr "Biến dữ liệu của đối tượng thành đơn người dùng nếu cần" msgctxt "Operator" msgid "Apply Modifier as Shape Key" -msgstr "Áp Dụng làm Mẫu Dạng" +msgstr "Áp Dụng Bộ Điều Chỉnh thành Hình Mẫu" msgid "Apply modifier as a new shape key and remove from the stack" -msgstr "Áp dụng bộ điều chỉnh để làm một mẫu dạng và xóa từ xếp đống" +msgstr "Áp dụng bộ điều chỉnh thành hình mẫu mới, đồng thời xóa bỏ khỏi ngăn xếp" msgid "Keep Modifier" @@ -62378,20 +68448,20 @@ msgstr "Giữ Bộ Điều Chỉnh" msgid "Do not remove the modifier from stack" -msgstr "Không xóa bộ điều chỉnh từ xếp đống" +msgstr "Không xóa bộ điều chỉnh khỏi ngăn xếp" msgctxt "Operator" msgid "Convert Particles to Mesh" -msgstr "Biến Đổi Hạt thành Mạng Lưới" +msgstr "Chuyển Đổi Hệ Thống Hạt thành Khung Lưới" msgid "Convert particles to a mesh object" -msgstr "Biến đổi hạt thành vật thể mạng lưới" +msgstr "Chuyển đổi hạt thành một đối tượng khung lưới" msgid "Change the modifier's index in the stack so it evaluates after the set number of others" -msgstr "Đổi chỉ số của bộ điều chỉnh trong xếp đống cho nó được tính toán một số lượng khác" +msgstr "Đổi chỉ số của bộ điều chỉnh trong ngăn xếp, hầu cho nó được tính toán sau những cái khác nằm trên" msgctxt "Operator" @@ -62400,83 +68470,83 @@ msgstr "Xóa Bộ Điều Chỉnh" msgid "Remove a modifier from the active object" -msgstr "Xóa một bộ điều chỉnh từ vật thể hoạt động" +msgstr "Xóa bộ điều chỉnh khỏi đối tượng đang hoạt động" msgctxt "Operator" msgid "Set Active Modifier" -msgstr "Đặt Bộ Điều Chỉnh Hoạt Động" +msgstr "Đặt Bộ Điều Chỉnh đang Hoạt Động" msgid "Activate the modifier to use as the context" -msgstr "Hoạt động bộ điều chỉnh cho dùng làm bối cảnh" +msgstr "Kích hoạt bộ điều chỉnh để sử dụng làm ngữ cảnh" msgid "Move objects to a collection" -msgstr "Di chuyển vật thể đến một sưu tập" +msgstr "Chuyển các đối tượng vào một bộ sưu tập" msgctxt "Operator" msgid "Multires Apply Base" -msgstr "Đa Độ Phân Giải Áp Dụng Cơ Sở" +msgstr "Đa Phân Giải Áp Dụng Cơ Sở" msgid "Modify the base mesh to conform to the displaced mesh" -msgstr "Sửa đổi mạng lưới cơ sở cho phù hợp với mạng lưới được dịch " +msgstr "Sửa đổi khung lưới cơ sở cho phù hợp với khung lưới biến dạng" msgctxt "Operator" msgid "Multires Pack External" -msgstr "Đa Độ Phân Giải Gói Ngoài" +msgstr "Đa Phân Giải Đóng Gói Từ Bên Ngoài" msgid "Pack displacements from an external file" -msgstr "Gói dịch từ tập tin ngoài" +msgstr "Đóng gói những dịch chuyển từ một tập tin bên ngoài" msgctxt "Operator" msgid "Multires Save External" -msgstr "Đa Độ Phân Giải Lưu Ngoài" +msgstr "Đa Phân Giải Lưu Ra Bên Ngoài" msgid "Save displacements to an external file" -msgstr "Lưu dịch vào một tập tin ngoài" +msgstr "Lưu các biến đổi về hình thể ra một tập tin bên ngoài" msgctxt "Operator" msgid "Delete Higher Levels" -msgstr "Xóa Tầng Cao Hơn " +msgstr "Xóa Mức Cao Hơn" msgid "Deletes the higher resolution mesh, potential loss of detail" -msgstr "Xóa mạng lưới độ phân giải cao hơn, có thể mất chi tiết" +msgstr "Xóa khung lưới với độ phân giải cao hơn, có khả năng mất chi tiết" msgctxt "Operator" msgid "Rebuild Lower Subdivisions" -msgstr "Xây Dựng Lại Phân Hóa Tầng Dưới" +msgstr "Xây Dựng Lại với Lượng Phân Hóa Thấp Hơn" msgid "Rebuilds all possible subdivisions levels to generate a lower resolution base mesh" -msgstr "Xây dựng lại hết tầng phân hóa để chế tạo một mạng lưới cơ sở có độ phân giải thấp hơn" +msgstr "Xây dựng lại toàn bộ các mức phân hóa có thể, để sinh tạo khung lưới nền có độ phân giải thấp hơn" msgctxt "Operator" msgid "Multires Reshape" -msgstr "Đa Phân Giải Dạng Lại" +msgstr "Đổi Hình Dạng Đa Phân Giải" msgid "Copy vertex coordinates from other object" -msgstr "Chép tọa độ đỉnh từ vật thể khác" +msgstr "Sao chép các tọa độ điểm đỉnh từ đối tượng khác" msgctxt "Operator" msgid "Multires Subdivide" -msgstr "Đa Độ Phân Giải Phân Hóa" +msgstr "Phân Hóa Đa Phân Giải" msgid "Add a new level of subdivision" -msgstr "Thêm một tầng phân hóa" +msgstr "Thêm một mức phân hóa mới" msgid "Subdivision Mode" @@ -62484,28 +68554,28 @@ msgstr "Chế Độ Phân Hóa" msgid "How the mesh is going to be subdivided to create a new level" -msgstr "Phương pháp phân hóa mạng lưới để chế tạo một tầng mới" +msgstr "Phương pháp khung lưới sẽ được phân hóa để kiến tạo một mức phân hóa mới" msgid "Create a new level using Catmull-Clark subdivisions" -msgstr "Chế tạo một tầng mới bằng dùng phân hóa Catmull-Clark" +msgstr "Kiến Tạo một mức mới dùng phép phân hóa Catmull-Clark" msgid "Create a new level using simple subdivisions" -msgstr "Chế tạo một tầng mới bằng dùng phân hóa đơn giản" +msgstr "Kiến Tạo một mức phân hóa mới dùng phép phân hóa đơn giản" msgid "Create a new level using linear interpolation of the sculpted displacement" -msgstr "Chế tạo một tầng bằng dùng suy nội bậc một cúa sự nới khắc" +msgstr "Kiến tạo một mức mới dùng phép nội suy tiếp tuyến của dời hình đã điêu khắc" msgctxt "Operator" msgid "Unsubdivide" -msgstr "Tóp Phân Hóa" +msgstr "Hủy Phân Chia" msgid "Rebuild a lower subdivision level of the current base mesh" -msgstr "Xây dựng lại một tầng phân hóa thấp hơn của mạng lưới cơ sở hiện tại" +msgstr "Xây dựng lại khung lưới nền hiện tại với mức phân hóa thấp hơn" msgctxt "Operator" @@ -62514,88 +68584,88 @@ msgstr "Nướng Đại Dương" msgid "Bake an image sequence of ocean data" -msgstr "Nướng trình tự ảnh của dữ liệu đại dương" +msgstr "Nướng một trình tự hình ảnh của dữ liệu đại dương" msgid "Free the bake, rather than generating it" -msgstr "Xóa nướng, thay thế chế tạo nó" +msgstr "Phóng thích nướng, thay vì sinh tạo nó" msgctxt "Operator" msgid "Clear Origin" -msgstr "Xóa Gốc Tọa Độ" +msgstr "Xóa Tọa Độ Gốc" msgid "Clear the object's origin" -msgstr "Xóa gốc tọa độ của vật thể" +msgstr "Xóa tọa độ gốc của đối tượng" msgid "Set the object's origin, by either moving the data, or set to center of data, or use 3D cursor" -msgstr "Đặt gốc tọa độ vật thể bằng di chuyển dữ liệu, hay đặt đến trung tâm của dữ liệu, hay dùng con trỏ 3D" +msgstr "Đặt tọa độ gốc của đối tượng bằng cách hoặc là di chuyển dữ liệu, hay là đặt vào tâm của dữ liệu, hoặc sử dụng con trỏ 3D" msgid "Median Center" -msgstr "Trung Tâm Trung Vị" +msgstr "Tâm Trung Vị" msgid "Bounds Center" -msgstr "Trung Tâm Ranh Giới" +msgstr "Tâm của Khung Viền" msgid "Geometry to Origin" -msgstr "Hình Dạng Đến Gốc Tọa Độ" +msgstr "Hình Học Đến Tọa Độ Gốc" msgid "Move object geometry to object origin" -msgstr "Di chuyển hình dạng vật thể đến gốc tọa độ của vật thể" +msgstr "Di chuyển hình học của đối tượng đến tọa độ gốc của đối tượng" msgid "Origin to Geometry" -msgstr "Gốc Tọa Độ Đến Hình Dạng" +msgstr "Tọa Độ Gốc đến Hình Học" msgid "Calculate the center of geometry based on the current pivot point (median, otherwise bounding box)" -msgstr "Tính trung tâm của hình dạng tùy điểm tựa hiện tại (trung vị, hay hộp bao quanh)" +msgstr "Tính tâm hình học dựa vào điểm tựa hiện tại (trung bình hóa, nếu không thì dùng khung hộp viền)" msgid "Origin to 3D Cursor" -msgstr "Gốc Tọa Độ Đến Con Trỏ 3D" +msgstr "Tọa Độ Gốc đến Con Trỏ 3D" msgid "Move object origin to position of the 3D cursor" -msgstr "Di chuyển gốc tọa độ vật thể đến vị trí con trỏ 3D" +msgstr "Di chuyển tọa độ gốc của đối tượng đến vị trí con trỏ 3D" msgid "Origin to Center of Mass (Surface)" -msgstr "Gốc Tọa Độ Đến Tâm Khối Lượng (Bề Mặt)" +msgstr "Tọa Độ Gốc đến Tâm của Khối (Bề Mặt)" msgid "Calculate the center of mass from the surface area" -msgstr "Tính tâm khối lượng từ diện tích bề mặt" +msgstr "Tính tâm của khối từ diện tích bề mặt" msgid "Origin to Center of Mass (Volume)" -msgstr "Gốc Tọa Độ Đến Tâm Khối Lượng (Thể Tích)" +msgstr "Tọa Độ Gốc đến Tâm Khối (Thể Tích)" msgid "Calculate the center of mass from the volume (must be manifold geometry with consistent normals)" -msgstr "Tính tâm khối lượng từ thể tích (chỉ được dùng với hình dạng đa tập có pháp tuyến phù hợp)" +msgstr "Tính tâm khối hình học từ thể tích (hình học phải là hình đa tạp (không có những hình học, trên thực tế, không thể tồn tại) với các pháp tuyết nhất quán)" msgid "Clear the object's parenting" -msgstr "Xóa quan hệ phụ huynh của vật thể" +msgstr "Xóa quan hệ phụ huynh của đối tượng" msgid "Completely clear the parenting relationship, including involved modifiers if any" -msgstr "Hoàn toàn xóa quan hệ phụ huynh, gồm các bộ điều chỉnh liên quan nếu có" +msgstr "Hoàn toàn xóa quan hệ phụ huynh, kể cả các bộ điều chỉnh dính líu nếu có" msgid "Clear and Keep Transformation" -msgstr "Xóa Và Giữ Biến Hóa" +msgstr "Xóa nhưng Duy Trì Biến Hóa" msgid "As 'Clear Parent', but keep the current visual transformations of the object" -msgstr "Giống 'Xóa Phụ Huynh', nhưng giữ nguyên các biến hoá thị giác hiện tại của vật thể" +msgstr "Tương tự như 'Xóa Phụ Huynh', song duy trì các biến hóa trực quan hiện tại của đối tượng" msgid "Clear Parent Inverse" @@ -62603,85 +68673,85 @@ msgstr "Xóa Đảo Nghịch Phụ Huynh" msgid "Reset the transform corrections applied to the parenting relationship, does not remove parenting itself" -msgstr "Hoàn lại biến hóa chỉnh sửa được áp dụng với quan hệ phụ huynh, không xóa quan hệ phụ huỳnh một mình" +msgstr "Xóa những chỉnh sửa biến hóa được áp dụng vào mối quan hệ phụ huynh. Không xóa bản thân mối quan hệ phụ huynh" msgctxt "Operator" msgid "Apply Parent Inverse" -msgstr "Áp Dụng Đảo Nghịch Phụ Huynh" +msgstr "Áp dụng Phụ Huynh Đảo Nghịch" msgid "Apply the object's parent inverse to its data" -msgstr "Áp dụng đảo nghịch phụ huynh của vật thể với dữ liệu của nó" +msgstr "Áp dụng phụ huynh của đối tượng đảo ngược với dữ liệu của nó" msgctxt "Operator" msgid "Make Parent without Inverse" -msgstr "Làm phụ huynh mà không Đảo Nghịch" +msgstr "Đặt Phụ Huynh mà không Đảo Nghịch" msgid "Set the object's parenting without setting the inverse parent correction" -msgstr "Đặt phụ huynh của vật thể nhưng không đặt chỉnh sửa đảo nghịch của phụ huynh" +msgstr "Sắp đặt phụ huynh cho đối tượng mà không đặt chỉnh sửa đảo nghịch phụ huynh" msgid "Keep Transform" -msgstr "Giữ Biến Hóa" +msgstr "Duy Trì Biến Hóa" msgid "Preserve the world transform throughout parenting" -msgstr "Giữ nguyên biến hóa thế giới xuyên qua phụ huynh" +msgstr "Bảo tồn biến hóa toàn cầu trong suốt quá trình phụ huynh hóa" msgid "Set the object's parenting" -msgstr "Đặt phụ huynh vật thể" +msgstr "Sắp đặt phụ huynh hóa của đối tượng" msgid "Apply transformation before parenting" -msgstr "Áp dụng biến hóa trước đặt phụ huynh" +msgstr "Áp dụng biến hóa trước khi đặt phụ huynh" msgid "Armature Deform" -msgstr "Méo Hóa Cốt" +msgstr "Biến Dạng của Khung Cốt" msgid " With Empty Groups" -msgstr " Với Nhóm Rỗng" +msgstr " Với các Nhóm Trống" msgid " With Automatic Weights" -msgstr " Với Quyầng Lượng Tự Động" +msgstr " Với Cân Trọng Tự Động" msgid " With Envelope Weights" -msgstr " Với Quyền Lượng Bao Bì" +msgstr " Với Trọng Lượng từ Phong Bao" msgid "Bone Relative" -msgstr "Tướng Đối Xương" +msgstr "Xương Tương Đối" msgid "Curve Deform" -msgstr "Méo Hóa Đường Cong" +msgstr "Biến Dạng bằng Đường Cong" msgid "Path Constraint" -msgstr "Ràng Buộc Đường Đi" +msgstr "Ràng Buộc Đường Dẫn" msgid "Lattice Deform" -msgstr "Méo Hóa Lưới Rào" +msgstr "Biến Dạng của Lưới Rào" msgid "Vertex (Triangle)" -msgstr "Đỉnh (Tam Giác)" +msgstr "Điểm Đỉnh (Tam Giác)" msgid "X Mirror" -msgstr "Gương X" +msgstr "Phản Chiếu Đối Xứng X" msgid "Apply weights symmetrically along X axis, for Envelope/Automatic vertex groups creation" -msgstr "Áp dụng quyền lượng dùng đối xứng qua trục X, cho chế tạo nhóm đỉnh Bao Bì/Tự Động" +msgstr "Áp dụng trọng lượng một cách đối xứng qua trục X. Dành cho việc kiến tạo các nhóm điểm đỉnh tự động, hoặc Phong Bao" msgctxt "Operator" @@ -62690,16 +68760,16 @@ msgstr "Thêm Khe Hệ Thống Hạt" msgid "Add a particle system" -msgstr "Thêm một khe hệ thống hạt" +msgstr "Thêm một hệ thống hạt" msgctxt "Operator" msgid "Remove Particle System Slot" -msgstr "Xóa Khe Hệ Thống Hạt" +msgstr "Xóa Khe của Hệ Thống Hạt" msgid "Remove the selected particle system" -msgstr "Xóa hệ thống hạt được chọn" +msgstr "Xóa hệ thống hạt đã chọn" msgctxt "Operator" @@ -62708,11 +68778,11 @@ msgstr "Dán Biến Hóa Toàn Cầu" msgid "Pastes the matrix from the clipboard to the currently active pose bone or object. Uses world-space matrices" -msgstr "Dán ma trận từ bảng dán đến vật thể hay xương dạng đứng đang hoạt động hiện tại" +msgstr "Dán ma trận từ bảng nhớ tạm vào xương hoặc đối tượng tư thế hiện đang hoạt động. Sử dụng ma trận không gian thế giới" msgid "Only used for baking. Step=1 creates a key on every frame, step=2 bakes on 2s, etc" -msgstr "Chỉ dùng cho nướng. Bước=1 chế tạo mốt bức ảnh mẫu mỗi bức ảnh, bước=2 nướng xen kẽ, v.v." +msgstr "Chỉ sử dụng để nướng mà thôi. Bước = 1 kiến tạo khóa trên mỗi khung hình, bước = 2 nướng trên 2s, vân vân" msgid "Paste Method" @@ -62720,7 +68790,7 @@ msgstr "Phương Pháp Dán" msgid "Update the current transform, selected keyframes, or even create new keys" -msgstr "Nâng cấp biến hóa hiện tại, các bức ảnh mẫu được chọn, hay cùng chế tạo bức ảnh mẫu mới" +msgstr "Cập nhật biến hóa hiện tại, khung khóa đã chọn hoặc thậm chí kiến tạo các khóa mới nữa" msgid "Current Transform" @@ -62728,32 +68798,56 @@ msgstr "Biến Hóa Hiện Tại" msgid "Paste onto the current values only, only manipulating the animation data if auto-keying is enabled" -msgstr "Chỉ dán các giá trị hiện tại, chỉ xử lý dữ liệu hoạt hình nếu đã bật bức mẫu tự động" +msgstr "Chỉ dán vào các giá trị hiện tại mà thôi. Chỉ thao tác với dữ liệu hoạt họa nếu tính năng tự động khóa được bật lên" msgid "Paste onto frames that have a selected key, potentially creating new keys on those frames" -msgstr "Dán trên các bức ảnh có một bức mẫu đã chọn, có lẽ sẽ chế tạo bức mẫu mới tại các bức ảnh đó" +msgstr "Dán vào các khung hình có khóa đã được chọn, có khả năng tạo khóa mới trên các khung hình đó" msgid "Bake on Key Range" -msgstr "Nướng trong Phạm Vi Bức Mẫu" +msgstr "Nướng trên Phạm Vi Khung Khóa" msgid "Paste onto all frames between the first and last selected key, creating new keyframes if necessary" -msgstr "Dán trên các bức ảnh giữa bức mẫu đầu và cuối được chọn, chế tạo bức ảnh mẫu mới nếu cần" +msgstr "Dán vào toàn bộ các khung hình nằm giữa khóa được chọn đầu tiên và cuối cùng, tạo các khung khóa mới nếu cần" + + +msgid "Location Axis" +msgstr "Trục Vị Trí" + + +msgid "Coordinate axis used to mirror the location part of the transform" +msgstr "Trục tọa độ sử dụng để phản chiếu đối xứng phần vị trí của phép biến hóa" + + +msgid "Rotation Axis" +msgstr "Trục Xoay Chiều" + + +msgid "Coordinate axis used to mirror the rotation part of the transform" +msgstr "Trục tọa độ sử dụng để phản chiếu đối xứng phần xoay chiều của phép biến hóa" + + +msgid "Mirror Transform" +msgstr "Phản Chiếu Đối Xứng Biến Hóa" + + +msgid "When pasting, mirror the transform relative to a specific object or bone" +msgstr "Khi dán thì phản chiếu đối xứng biến hóa tương đối với một đối tượng hoặc xương cụ thể nào đó" msgctxt "Operator" msgid "Calculate Object Motion Paths" -msgstr "Tính Đường Chuyển Động Vật Thể" +msgstr "Tính Đường Chuyển Động của Đối Tượng" msgid "Generate motion paths for the selected objects" -msgstr "Chế tạo đường chuyển động cho vật thể được chọn " +msgstr "Sinh tạo đường chuyển động cho các đối tượng được chọn" msgid "Display type" -msgstr "Loại hiển thị" +msgstr "Kiểu hiển thị" msgid "Computation Range" @@ -62762,153 +68856,157 @@ msgstr "Phạm Vi Tính Toán" msgctxt "Operator" msgid "Clear Object Paths" -msgstr "Xóa Đường Đi Vật Thể" +msgstr "Xóa Đường Chuyển Động của Đối Tượng" + + +msgid "Only clear motion paths of selected objects" +msgstr "Chỉ xóa các đường chuyển động của các đối tượng được chọn mà thôi" msgctxt "Operator" msgid "Update Object Paths" -msgstr "Nâng Cấp Đường Đi Vật Thể" +msgstr "Cập Nhật Đường Chuyển Động của Đối Tượng" msgid "Recalculate motion paths for selected objects" -msgstr "Tính lại đường chuyển động cho các vật thể được chọn" +msgstr "Tính toán lại đường chuyển động cho các đối tượng được chọn" msgctxt "Operator" msgid "Update All Object Paths" -msgstr "Nâng Cấp Hết Đường Đi Của Vật Thể" +msgstr "Cập Nhật Toàn Bộ các Đường Chuyển Động của các Đối Tượng" msgid "Recalculate all visible motion paths for objects and poses" -msgstr "Tính lại hết đường chuyển động đang hiển thị cho vật thể và đạng đứng" +msgstr "Tính toán lại toàn bộ các đường chuyển động, có thể nhìn thấy, đối với các đối tượng và các tư thế" msgctxt "Operator" msgid "Add Point Cloud" -msgstr "Thêm Mây Điểm" +msgstr "Thêm Đám Mây Điểm" msgid "Add a point cloud object to the scene" -msgstr "Thêm một vật thể mây điểm vào cảnh" +msgstr "Cho thêm một đối tượng đám mây điểm vào cảnh" msgctxt "Operator" msgid "Toggle Pose Mode" -msgstr "Bật/Tắt Chế Độ Dạng Đứng" +msgstr "Bật/Tắt Chế Độ Tư Thế" msgid "Enable or disable posing/selecting bones" -msgstr "Bật hay tắt đặt dạng đứng/chọn xương " +msgstr "Bật hay tắt các xương tư thế/lựa chọn" msgctxt "Operator" msgid "QuadriFlow Remesh" -msgstr "Lưu Tư Làm Lại Mạng Lưới" +msgstr "Kiến Tạo Lại Khung Lưới theo luồng Tứ Giác" msgid "Create a new quad based mesh using the surface data of the current mesh. All data layers will be lost" -msgstr "Chế tạo một mạng lưới mới cơ sở tư giác bằng dữ liệu bề mặt của mạng lưới hiện tại. Sẽ xóa tất cả lớp dữ liệu" +msgstr "Kiến tạo một khung lưới mới trên nền tứ giác dùng dữ liệu về bề mặt của khung lưới hiện tại. Toàn bộ các tầng lớp dữ liệu đều sẽ bị mất đi" msgid "Old Object Face Area" -msgstr "Diện Tích Mặt Của Vật Thể Cũ" +msgstr "Diện Tích Mặt Cũ của Đối Tượng" msgid "This property is only used to cache the object area for later calculations" -msgstr "Đặc tính này chỉ được dùng cho chứa diện tích vật thể để tính toán sau" +msgstr "Tính chất này chỉ sử dụng để lưu diện tích của đối tượng trong bộ nhớ đệm để tính toán sau này" msgid "How to specify the amount of detail for the new mesh" -msgstr "Chỉ định mức chi tiết cho mạng lưới mới" +msgstr "Phương pháp để xác định lượng chi tiết cho khung lưới mới" msgid "Specify target number of faces relative to the current mesh" -msgstr "Chỉ định số lượng mặt mục tiêu tương đối với mạng lưới hiện tại" +msgstr "Xác định số lượng các mặt mục tiêu tương đối với khung lưới hiện tại" msgid "Edge Length" -msgstr "Bề Dài Cạnh" +msgstr "Độ Dài Cạnh" msgid "Input target edge length in the new mesh" -msgstr "Gõ bề dài mục tiêu của cạnh cho mạng lưới mới" +msgstr "Độ dài mục tiêu của cạnh trong khung lưới mới" msgid "Input target number of faces in the new mesh" -msgstr "Gõ số lượng mặt cho mạng lưới mới" +msgstr "Số lượng các mặt mục tiêu cung cấp trong khung lưới mới" msgid "Random seed to use with the solver. Different seeds will cause the remesher to come up with different quad layouts on the mesh" -msgstr "Số hạy ngẫu nhiên để dùng với trình giải nghiệm. Số hạt khác sẽ ảnh hưởng bộ làm lại mạng lưới sáng tạo mẫu bố cục tư giác khác nhau trên mạng lưới" +msgstr "Mầm ngẫu nhiên để sử dụng với trình giải nghiệm. Các mầm khác nhau sẽ khiến cho trình kiến tạo lại khung lưới sinh tạo ra những bố trí tứ giác trên khung lưới khác nhau" msgid "Smooth Normals" -msgstr "Mịn Hóa Pháp Tuyến" +msgstr "Làm Mịn Pháp Tuyến" msgid "Set the output mesh normals to smooth" -msgstr "Đặt pháp tuyến mạng lưới ngõ ra thành mịn" +msgstr "Đặt các pháp tuyến của khung lưới kết quả thành mịn màng" msgid "Target edge length in the new mesh" -msgstr "Bề dài mục tiêu của cạnh cho mạng lưới mới" +msgstr "Chiều dài mục tiêu của cạnh trong khung lưới mới" msgid "Number of Faces" -msgstr "Sô Lượng Mặt" +msgstr "Số Các Mặt" msgid "Approximate number of faces (quads) in the new mesh" -msgstr "Số lượng mặt (tư giác) xấp xỉ trong mạng lưới mới" +msgstr "Ước tính số các mặt (tứ giác) trong khung lưới mới" msgid "Relative number of faces compared to the current mesh" -msgstr "Số lượng mặt tương đối với mạng lưới hiện tại" +msgstr "Số lượng tương đối các mặt khi so sánh với khung lưới hiện tại" msgid "Use Mesh Symmetry" -msgstr "Dùng Đối Xứng Mạng Lưới" +msgstr "Sử Dụng sự Đối Xứng của Khung Lưới" msgid "Generates a symmetrical mesh using the mesh symmetry configuration" -msgstr "Chế tạo một mạng lưới đối xứng bằng dùng cấu hình đối xứng cho mạng lưới" +msgstr "Sinh tạo một khung lưới đối xứng, dùng cấu hình đối xứng của khung lưới" msgid "Preserve Mesh Boundary" -msgstr "Giữ Nguyên Ranh Giới Mạng Lưới" +msgstr "Bảo Tồn Ranh Giới Khung Lưới" msgid "Try to preserve mesh boundary on the mesh" -msgstr "Thử giữ nguyên ranh giới của mạng lưới ở trên mạng lưới" +msgstr "Cố gắng bảo tồn ranh giới trên khung lưới" msgid "Preserve Sharp" -msgstr "Giữ Nguyên Bén" +msgstr "Bảo Tồn nét Sắc Nhọn" msgid "Try to preserve sharp features on the mesh" -msgstr "Thử giữ nguyên chi tiết bén trên mạng lưới" +msgstr "Cố gắng bảo tồn những nét đặc trưng sắc nhọn trên hình thể của khung lưới" msgctxt "Operator" msgid "Quick Explode" -msgstr "Nổ Nhanh" +msgstr "Hiệu Ứng Nổ Nhanh" msgid "Make selected objects explode" -msgstr "Nổ các vật thể được chọn" +msgstr "Làm cho những đối tượng được chọn nổ tung" msgid "Number of Pieces" -msgstr "Sô Lượng Miến" +msgstr "Số Mảnh" msgid "Fade the pieces over time" -msgstr "Sau đoạn thời gian, phai miến" +msgstr "Phai mờ dần các mảnh theo thời gian" msgid "Explode Style" -msgstr "Phong Cách Nổ" +msgstr "Mốt Nổ Tung" msgid "Outwards Velocity" @@ -62917,45 +69015,65 @@ msgstr "Vận Tốc Bay Ra" msgctxt "Operator" msgid "Quick Fur" -msgstr "Lông Nhanh" +msgstr "Hiệu Ứng Lông Nhanh" + + +msgid "Add a fur setup to the selected objects" +msgstr "Thêm một cài đặt về lông/tóc cho đối tượng được chọn" + + +msgid "Apply Hair Guides" +msgstr "Áp Dụng các Hướng Dẫn Tóc" + + +msgid "Hair Radius" +msgstr "Bán Kính Tóc" + + +msgid "Frizz" +msgstr "Tóc Xù" + + +msgid "View Percentage" +msgstr "Phần Trăm Quan Sát" msgctxt "Operator" msgid "Quick Liquid" -msgstr "Chất Lỏng Nhanh" +msgstr "Chất Lỏng Nhanh Chóng" msgid "Make selected objects liquid" -msgstr "Chất lỏng hóa các vật thể được chọn" +msgstr "Làm cho các đối tượng đã chọn trở thành chất lỏng" msgid "Render Liquid Objects" -msgstr "Kết Xuất Vật Thể Chất Lỏng" +msgstr "Kết Xuất các Đối Tượng Chất Lỏng" msgid "Keep the liquid objects visible during rendering" -msgstr "Giữ hiển thị vật thể chất lỏng khi đang kết xuất" +msgstr "Duy trì sự hữu hình (nhìn thấy được) của các đối tượng chất lỏng trong quá trình kết xuất" msgctxt "Operator" msgid "Quick Smoke" -msgstr "Khói Nhanh" +msgstr "Hiệu Ứng Khói Nhanh" msgid "Use selected objects as smoke emitters" -msgstr "Dùng các vật thể được chọn làm nguồn phát khói" +msgstr "Sử dụng các đối tượng làm nguồn phát khói" msgid "Render Smoke Objects" -msgstr "Kết Xuất Vật Thể Khói" +msgstr "Kết Xuất Đối Tượng Phát Khói" msgid "Keep the smoke objects visible during rendering" -msgstr "Hiển thị vật thể khói khi kết xuất" +msgstr "Hiển thị đối tượng phát khói khi kết xuất" msgid "Smoke Style" -msgstr "Phong Cách Khói" +msgstr "Mốt Khói" msgid "Smoke & Fire" @@ -62964,168 +69082,168 @@ msgstr "Khói & Lửa" msgctxt "Operator" msgid "Randomize Transform" -msgstr "Ngẫu Nhiên Biến Hóa" +msgstr "Ngẫu Nhiên Hóa sự Biến Hóa" msgid "Randomize objects location, rotation, and scale" -msgstr "Ngẫu nhiên hóa vị trí, xoay, và phóng to" +msgstr "Ngẫu nhiên hóa vị trí, xoay chiều, và tỷ lệ của đối tượng" msgid "Maximum distance the objects can spread over each axis" -msgstr "Khoảng cách tối đa phân phối vật thể quanh mỗi trục" +msgstr "Khoảng cách tối đa để phân tỏa các đối tượng trên mỗi trục" msgid "Seed value for the random generator" -msgstr "Số hạt cho bộ phát số ngẫu nhiên" +msgstr "Giá trị mầm dành cho bộ máy phát sinh số ngẫu nhiên" msgid "Maximum rotation over each axis" -msgstr "Xoay tối da quanh mỗi trục" +msgstr "Độ xoay chiều tối đa trên mỗi trục" msgid "Maximum scale randomization over each axis" -msgstr "Phóng to tối đa cho mỗi trục" +msgstr "Tỷ lệ ngẫu nhiên hóa tối đa trên mỗi trục" msgid "Scale Even" -msgstr "Phóng To Đều" +msgstr "Đổi Tỷ Lệ Đồng Đều" msgid "Use the same scale value for all axis" -msgstr "Dùng phóng to đều cho mỗi trục" +msgstr "Dùng cùng giá trị đổi tỷ lệ cho toàn bộ các trục" msgid "Transform Delta" -msgstr "Lệch Lạc Biến Hóa" +msgstr "Biến Hóa Delta" msgid "Randomize delta transform values instead of regular transform" -msgstr "Ngẫu nhiên hóa các giá trị biến hóa lệch lạc thay thế dùng biến hóa bình thường" +msgstr "Ngẫu nhiên hóa các giá trị biến hóa delta, thay vì sự biến hóa thông thường" msgid "Randomize Location" -msgstr "Ngẫu Nhiên Vị Trí" +msgstr "Ngẫu Nhiên Hóa Vị Trí" msgid "Randomize the location values" -msgstr "Ngẫu nhiên hóa giá trị vị trí" +msgstr "Ngẫu nhiên hóa các giá trị về vị trí" msgid "Randomize Rotation" -msgstr "Ngẫu Nhiên Xoay" +msgstr "Ngẫu Nhiên Hóa sự Xoay Chiều" msgid "Randomize the rotation values" -msgstr "Ngẫu nhiên hóa giá trị xoay" +msgstr "Ngẫu nhiên hóa các giá trị xoay chiều" msgid "Randomize Scale" -msgstr "Ngẫu Nhiên Phóng To" +msgstr "Ngẫu Nhiên Hóa Tỷ Lệ" msgid "Randomize the scale values" -msgstr "Ngẫu nhiên hóa giá trị phóng to" +msgstr "Ngẫu nhiên hóa các giá trị về tỷ lệ" msgctxt "Operator" msgid "Reset Library Override" -msgstr "Đặt Lại Đồ Vượt Quyền Thư Viện" +msgstr "Hoàn Lại Vượt Quyền Thư Viện" msgid "Reset the selected local overrides to their linked references values" -msgstr "Đặt lại đồ vượt quyền địa phương được chọn trở lại đến những giá trị tham chiếu được liên kết" +msgstr "Hoàn lại các vượt quyền cục bộ đã chọn thành các giá trị tham chiếu liên kết của chúng" msgctxt "Operator" msgid "Clear Rotation" -msgstr "Xoá Xoay" +msgstr "Xóa Sự Xoay Chiều" msgid "Clear the object's rotation" -msgstr "Xóa xoay của vật thể" +msgstr "Xóa sự xoay chiều của đối tượng" msgid "Clear delta rotation in addition to clearing the normal rotation transform" -msgstr "Xóa lệch lạc xoay khi xóa biến hóa xoay bình thường" +msgstr "Xóa cả sự xoay chiều delta trong khi xóa các biến hóa xoay chiều bình thường nữa" msgid "Clear the object's scale" -msgstr "Xóa phóng to của vật thể" +msgstr "Xóa tỷ lệ của đối tượng" msgid "Clear delta scale in addition to clearing the normal scale transform" -msgstr "Xóa lệch lạc phóng to khi xóa biến hóa phóng to bình thường" +msgstr "Xóa cả tỷ lệ delta trong khi xóa tỷ lệ biến hóa bình thường nữa" msgctxt "Operator" msgid "Scatter Objects" -msgstr "Rải Ra Vật Thể" +msgstr "Phân Tán Đối Tượng Rải Rác" msgid "Change selection of all visible objects in scene" -msgstr "Đổi sự lựa chọn của tất cả vật thể hiển thị trong cảnh" +msgstr "Đổi sự lựa chọn của toàn bộ các đối tượng nhìn thấy được trong cảnh" msgctxt "Operator" msgid "Select by Type" -msgstr "Chọn Tùy Loại" +msgstr "Chọn theo Thể Loại" msgid "Select all visible objects that are of a type" -msgstr "Chọn tất cả vật thể hiển thị cùng loại" +msgstr "Chọn toàn bộ các đối tượng nhìn thấy được và cùng thể loại" msgctxt "Operator" msgid "Select Camera" -msgstr "Chọn Máy quay Phim" +msgstr "Chọn Máy Quay Phim" msgid "Select the active camera" -msgstr "Chọn máy quay phim hoạt động" +msgstr "Chọn máy quay phim đang hoạt động" msgid "Select all visible objects grouped by various properties" -msgstr "Chọn tất cả vật thể hiển thị được nhóm lại theo đặc tính lặt vặt" +msgstr "Chọn toàn bộ các đối tượng, nhìn thấy được, được nhóm lại theo một số tính chất tương đồng" msgid "Shared parent" -msgstr "Phụ huynh được chia sẻ" +msgstr "Có cùng phụ huynh" msgid "Shared object type" -msgstr "Loại vật thể được chia sẻ" +msgstr "Thể loại đối tượng đồng phân hưởng" msgid "Shared collection" -msgstr "Sưu tập được chia sẻ" +msgstr "Có Cùng Bộ Sưu Tập" msgid "Render pass index" -msgstr "Chỉ số vòng kết xuất" +msgstr "Chỉ số lượt kết xuất" msgid "Object color" -msgstr "Màu vật thể" +msgstr "Màu đối tượng" msgid "Objects included in active Keying Set" -msgstr "Vật thể được gồm vào Tập Mẫu Dạng hoạt động" +msgstr "Những đối tượng nằm trong Bộ Khóa đang hoạt động" msgid "Light Type" -msgstr "Loại Đèn" +msgstr "Loại Nguồn Ánh Sáng" msgid "Matching light types" -msgstr "Cùng loại đèn" +msgstr "Loại nguồn sáng tương xứng" msgid "Select object relative to the active object's position in the hierarchy" -msgstr "Chọn vật thể tương đối với vị trí của vật thể hoạt trong tầng bậc" +msgstr "Chọn đối tượng tương đối với vị trí của đối tượng đang hoạt động trong thứ bậc" msgid "Direction to select in the hierarchy" -msgstr "Hướng để chọn trong tầng bậc" +msgstr "Phương hướng chọn trong thứ bậc" msgid "Child" @@ -63133,69 +69251,77 @@ msgstr "Con Cái" msgid "Deselect objects at the boundaries of parent/child relationships" -msgstr "Thả vật thể tại ranh giới của quan hệ phụ huynh/con cái" +msgstr "Hủy chọn đối tượng tại ranh giới của quan hệ phụ huynh/con cái" msgid "Select all visible objects that are linked" -msgstr "Chọn hết vật thể hiển thị được liên kết nhau" +msgstr "Chọn toàn bộ các đối tượng kết nối có thể nhìn thấy" msgid "Instanced Collection" -msgstr "Sưu Tập Được Thực Thể" +msgstr "Bộ Sưu Tập đã được Thực Thể Hóa" msgid "Library (Object Data)" -msgstr "Thư Viện (Dữ Liệu Vật Thể)" +msgstr "Thư Viện (Dữ Liệu Đối Tượng)" msgid "Select the mirror objects of the selected object e.g. \"L.sword\" and \"R.sword\"" -msgstr "Chọn vật thể gương của vật thể được chọn, ví dụ \"T.câyKiếm\" và \"P.câyKiếm\"" +msgstr "Chọn các đối tượng phản chiếu đối xứng của đối tượng đã chọn ví dụ: \"L.sword\" và \"R.sword\"" msgid "Select connected parent/child objects" -msgstr "Chọn vật thể phụ huynh/con cái được kết nối" +msgstr "Chọn các đối tượng phụ huynh/con cái có kết nối" msgctxt "Operator" msgid "Select Pattern" -msgstr "Chọn Gương Mẫu" +msgstr "Chọn Kiểu Mẫu" msgid "Select objects matching a naming pattern" -msgstr "Chọn vật thể theo một gương mẫu đặt tên" +msgstr "Chọn các đối tượng xứng khớp với một mẫu tên" msgid "Case Sensitive" -msgstr "Chữ Thường Chữ Hoa" +msgstr "Mẫn Cảm với Loại Chữ" msgid "Do a case sensitive compare" -msgstr "So sanh chu ý chữ thường hay chữ hoa" +msgstr "Tiến hành so sánh có phân biệt chữ thường và chữ hoa" msgid "Name filter using '*', '?' and '[abc]' unix style wildcards" -msgstr "Lọc tên bằng ký tự đại diện unix như '*', '?' và '[abc]'" +msgstr "Thanh lọc tên bằng ký tự đại diện unix như '*', '?' và '[abc]'" + + +msgid "Select or deselect random visible objects" +msgstr "Chọn và hủy chọn các đối tượng nhìn thấy được một cách ngẫu nhiên" msgctxt "Operator" msgid "Select Same Collection" -msgstr "Chọn Cùng Sưu Tập" +msgstr "Chọn Cùng Bộ Sưu Tập" msgid "Select object in the same collection" -msgstr "Chọn vật thể trong cùng sưu tập" +msgstr "Chọn lựa đối tượng trong cùng một bộ sưu tập" msgid "Name of the collection to select" -msgstr "Tên của sưu tập để chọn" +msgstr "Tên của bộ sưu tập để lựa chọn" msgid "Render and display faces uniform, using Face Normals" -msgstr "Kết xuất và hiển thị các mặt đều, bằng sử dụng Pháp Tuyến Mặt" +msgstr "Kết xuất và hiển thị các Mặt đồng đều, dùng các Pháp Tuyến Mặt" msgid "Render and display faces smooth, using interpolated Vertex Normals" -msgstr "Kết xuất và hiển thị các mặt mịn, suy nội Pháp Tuyến Đỉnh" +msgstr "Kết xuất và hiển thị các mặt mịn màng, sử dụng các Pháp Tuyến Điểm Đỉnh đã được nội suy" + + +msgid "Set the sharpness of mesh edges based on the angle between the neighboring faces" +msgstr "Đặt độ sắc nét của các cạnh khung lưới dựa trên góc giữa các mặt lân cận" msgctxt "Operator" @@ -63204,88 +69330,88 @@ msgstr "Thêm Hiệu Ứng" msgid "Add a visual effect to the active object" -msgstr "Thêm một hiệu ứng thị giác cho vật thể hoạt động" +msgstr "Thêm một hiệu ứng trực quan vào đối tượng đang hoạt động" msgctxt "ID" msgid "Blur" -msgstr "Mờ" +msgstr "Làm Nhòe Mờ" msgid "Apply Gaussian Blur to object" -msgstr "Áp dụng Mờ Hóa Gauss với vật thể" +msgstr "Áp Dụng Mờ Nhòe Gaus vào đối tượng" msgctxt "ID" msgid "Colorize" -msgstr "Màu Hóa" +msgstr "Đổi Sắc Thái" msgid "Apply different tint effects" -msgstr "Áp dụng các hiệu ứng nhiễm màu khác" +msgstr "Áp dụng hiệu ứng sắc thái khác" msgctxt "ID" msgid "Flip" -msgstr "Lật" +msgstr "Đảo Lật" msgid "Flip image" -msgstr "Lật ảnh" +msgstr "Đảo chiều hình ảnh" msgctxt "ID" msgid "Glow" -msgstr "Hào Quang" +msgstr "Hừng Sáng" msgid "Create a glow effect" -msgstr "Chế tạo một hiệu ứng hào quang" +msgstr "Kiến Tạo một hiệu ứng hừng sáng" msgctxt "ID" msgid "Pixelate" -msgstr "Điểm Ảnh Hóa" +msgstr "Làm Thô Điểm Ảnh" msgid "Pixelate image" -msgstr "Điểm ảnh hóa ảnh" +msgstr "Làm thô điểm ảnh của hình ảnh" msgctxt "ID" msgid "Rim" -msgstr "Vành" +msgstr "Mép/Vành Mép" msgid "Add a rim to the image" -msgstr "Thêm một vành cho ảnh" +msgstr "Thêm đường viền mép vào hình ảnh" msgctxt "ID" msgid "Shadow" -msgstr "Bóng Tối" +msgstr "Ngả/Bóng Tối" msgid "Create a shadow effect" -msgstr "Chế tạo một hiệu ứng bóng tối" +msgstr "Kiến Tạo một hiệu ứng ngả bóng tối" msgctxt "ID" msgid "Swirl" -msgstr "Xoắn" +msgstr "Xoáy Lốc" msgid "Create a rotation distortion" -msgstr "Chế tạo một méo hóa xoắn" +msgstr "Kiến Tạo một biến dạng xoay chiều" msgctxt "ID" msgid "Wave Distortion" -msgstr "Méo Hóa Sóng" +msgstr "Biến Dạng Sóng" msgid "Apply sinusoidal deformation" -msgstr "Áp dụng méo hóa dạng sóng" +msgstr "Áp dụng sự biến dạng theo hàm sin" msgctxt "Operator" @@ -63294,134 +69420,134 @@ msgstr "Sao Chép Hiệu Ứng" msgid "Duplicate effect at the same position in the stack" -msgstr "Chép lại hiệu ứng tại cùng vị trí trong xếp đống" +msgstr "Nhân đôi hiệu ứng tại cùng vị trí trong ngăn xếp" msgid "Name of the shaderfx to edit" -msgstr "Tên của hiệu ứng bộ tô sắc để biên tập" +msgstr "Tên hiệu ứng tô bóng (shaderfx) để chỉnh sửa" msgctxt "Operator" msgid "Move Down Effect" -msgstr "Hạ Xuống Hiệu Ứng" +msgstr "Chuyển Hiệu Ứng Xuống Dưới" msgid "Move effect down in the stack" -msgstr "Di chuyển hiệu ứng xuống trong xếp đống" +msgstr "Di chuyển hiệu ứng xuống dưới ngăn xếp" msgctxt "Operator" msgid "Move Effect to Index" -msgstr "Di Chuyển Hiệu Ứng đến Chỉ Số" +msgstr "Đưa Hiệu Ứng vào Chỉ Số" msgid "Change the effect's position in the list so it evaluates after the set number of others" -msgstr "Đổi vị trí của hiệu ứng trong danh sách cho nó được tính toán sau một số lượng khác" +msgstr "Đồi vị trí của hiệu ứng trong danh sách, hầu cho nó được tính toán sau một số những cái khác nào đó" msgid "The index to move the effect to" -msgstr "Chỉ số để di chuyển hiệu ứng đến" +msgstr "Chỉ số để đưa hiệu ứng tới" msgctxt "Operator" msgid "Move Up Effect" -msgstr "Di Chuyển Lên Hiệu Ứng" +msgstr "Đưa Hiệu Ứng Lên Trên" msgid "Move effect up in the stack" -msgstr "Di chuyển hiệu ứng lên trong xếp đống" +msgstr "Chuyển hiệu ứng lên trên trong ngăn xếp" msgctxt "Operator" msgid "Remove Grease Pencil Effect" -msgstr "Xóa Hiệu Ứng Bút Sáp" +msgstr "Xóa Hiệu Ứng Bút Chì Dầu" msgid "Remove a effect from the active grease pencil object" -msgstr "Xóa một hiệu ứng từ vật thể bút sáp hoạt động" +msgstr "Xóa một hiệu ứng khỏi đối tượng Bút Chì Dầu đang hoạt động" msgctxt "Operator" msgid "Add Shape Key" -msgstr "Thêm Mẫu Dạng" +msgstr "Thêm Hình Mẫu" msgid "Add shape key to the object" -msgstr "Thêm mẫu dạng cho vật thể" +msgstr "Thêm hình mẫu vào đối tượng" msgid "From Mix" -msgstr "Từ Pha Trộn" +msgstr "Từ Thể Dạng Hiện Tại" msgid "Create the new shape key from the existing mix of keys" -msgstr "Chế tạo một mẫu dạng mới từ pha trộn các mẫu dạng đang tồn tại" +msgstr "Kiến Tạo một hình mẫu mới từ thể dạng hiện tại của các hình mẫu" msgctxt "Operator" msgid "Clear Shape Keys" -msgstr "Xóa Mẫu Dạng" +msgstr "Xóa Hình Mẫu" msgid "Clear weights for all shape keys" -msgstr "Xóa quyền lượng cho hết mẫu dạng" +msgstr "Xóa trọng lượng cho toàn bộ các hình mẫu" msgctxt "Operator" msgid "Mirror Shape Key" -msgstr "Gương Mẫu Dạng" +msgstr "Phản Chiếu Đối Xứng Hình Mẫu" msgid "Mirror the current shape key along the local X axis" -msgstr "Gương lái mẫu dạng hiện tại qua trục x địa phương" +msgstr "Phản chiếu hình mẫu hiện tại phản chiếu đối xứng theo trục X địa phương" msgctxt "Operator" msgid "Move Shape Key" -msgstr "Di Chuyển Mẫu Dạng" +msgstr "Di Chuyển Hình Mẫu" msgid "Move the active shape key up/down in the list" -msgstr "Di chuyển mẫu dạng hoạt động lên/xuống trong danh sách" +msgstr "Di chuyển hình mẫu đang hoạt động lên/xuống trong danh sách" msgctxt "Operator" msgid "Remove Shape Key" -msgstr "Xóa Mẫu Dạng" +msgstr "Xóa Hình Mẫu" msgid "Remove shape key from the object" -msgstr "Xóa mẫu dạng từ vật thể" +msgstr "Xóa hình mẫu khỏi đối tượng" msgid "Remove all shape keys" -msgstr "Xóa hết mẫu dạng" +msgstr "Xóa toàn bộ các hình mẫu" msgid "Apply Mix" -msgstr "Á Dụng Sự Pha Trộn" +msgstr "Áp Dụng Hòa Trộn" msgid "Apply current mix of shape keys to the geometry before removing them" -msgstr "Áp dụng sự pha trộnhiện tại của mẫu dạng cho hình dạng trược xóa nó" +msgstr "Áp dụng hòa trộn của các hình mẫu hiện tại cho hình học trước khi loại bỏ chúng" msgctxt "Operator" msgid "Re-Time Shape Keys" -msgstr "Đặt Lại Thời Tự Mẫu Dạng" +msgstr "Hoàn Lại Thời Định của Hình Mẫu" msgid "Resets the timing for absolute shape keys" -msgstr "Đặt lại thời tự cho mẫu dạng tuyệt đối" +msgstr "Hoàn lại thời định cho các hình mẫu tuyệt đối" msgctxt "Operator" msgid "Transfer Shape Key" -msgstr "Truyền Mẫu Dạng" +msgstr "Thuyên Chuyển Hình Mẫu" msgid "Copy the active shape key of another selected object to this one" -msgstr "Chép lại mẫu dạng hoạt động của một vật thể khác được chọn truyền đến vặt thể này" +msgstr "Sao chép hình mẫu đang hoạt động của một đối tượng đã chọn khác vào cái này" msgid "Transformation Mode" @@ -63429,11 +69555,11 @@ msgstr "Chế Độ Biến Hóa" msgid "Relative shape positions to the new shape method" -msgstr "Vị trí dạng tương đối đến phương pháp dạng mới" +msgstr "Các vị trí hình dạng tương đối đến phương pháp hình dạng mới" msgid "Apply the relative positional offset" -msgstr "Áp dụng dịch vị trí tương đối" +msgstr "Áp dụng dịch chuyển vị trí tương đối" msgid "Relative Face" @@ -63441,7 +69567,7 @@ msgstr "Mặt Tương Đối" msgid "Calculate relative position (using faces)" -msgstr "Tính vị trí tương đối mới (dùng mặt)" +msgstr "Tính toán vị trí tương đối (dùng các mặt)" msgid "Relative Edge" @@ -63449,63 +69575,140 @@ msgstr "Cạnh Tương Đối" msgid "Calculate relative position (using edges)" -msgstr "Tính vị trí tương đối (dùng cạnh)" +msgstr "Tính toán vị trí tương đối (dùng các cạnh)" msgid "Clamp Offset" -msgstr "Kẹp Lại Dịch" +msgstr "Hạn Định Dịch Chuyển" msgid "Clamp the transformation to the distance each vertex moves in the original shape" -msgstr "Kẹp lại biến hóa trong khoảng cách mỗi đỉnh có thể di chuyển trong dạng ban đầu" +msgstr "Hạn định biến hóa vào khoảng cách mà mỗi điểm đỉnh di chuyển trong hình dạng gốc" + + +msgctxt "Operator" +msgid "Bake Simulation" +msgstr "Nướng Mô Phỏng" + + +msgid "Bake simulations in geometry nodes modifiers" +msgstr "Nướng các mô phỏng trong bộ điều chỉnh nút hình học" + + +msgid "Bake cache on all selected objects" +msgstr "Nướng bộ đệm nhớ trên toàn bộ các đối tượng đã chọn" + + +msgctxt "Operator" +msgid "Bake Single Simulation Zone" +msgstr "Nướng Đơn Vùng Mô Phỏng" + + +msgid "Bake a single simulation zone" +msgstr "Nướng một đơn vùng mô phỏng" + + +msgid "Bake ID" +msgstr "ID Nướng" + + +msgid "Nested node id of the node to bake" +msgstr "Id nút lồng nhau của nút cần nướng" + + +msgid "Name of the modifier that contains the node to bake" +msgstr "Tên của bộ điều chỉnh có chứa nút để nướng" + + +msgctxt "Operator" +msgid "Calculate Simulation to Frame" +msgstr "Tính Toán Mô Phỏng đến Khung Hình" + + +msgid "Calculate simulations in geometry nodes modifiers from the start to current frame" +msgstr "Tính toán mô phỏng trong các bộ điều chỉnh nút hình học từ khung hình bắt đầu đến khung hiện tại" + + +msgid "Calculate all selected objects instead of just the active object" +msgstr "Tính toán toàn bộ các đối tượng đã được chọn, thay vì chỉ đối tượng đang hoạt động mà thôi" + + +msgctxt "Operator" +msgid "Delete Cached Simulation" +msgstr "Xóa Mô Phỏng đã Lưu trong Bộ Nhớ Đệm" + + +msgid "Delete cached/baked simulations in geometry nodes modifiers" +msgstr "Xóa các mô phỏng được lưu trong bộ nhớ đệm/đã được nướng trong bộ điều chỉnh nút hình học" + + +msgid "Delete cache on all selected objects" +msgstr "Xóa bộ đệm nhớ trên toàn bộ các đối tượng đã chọn" + + +msgctxt "Operator" +msgid "Delete Single Cached Simulation" +msgstr "Xóa Mô Phỏng Lưu Trong Đơn Bộ Nhớ Đệm" + + +msgid "Delete simulation data of a single simulation zone" +msgstr "Xóa dữ liệu mô phỏng của một đơn vùng mô phỏng" + + +msgid "Nested node id of the bake to delete" +msgstr "Id nút lồng nhau của nướng cần phải xóa đi" + + +msgid "Name of the modifier that contains the node" +msgstr "Tên của bộ điều chỉnh có chứa nút" msgctxt "Operator" msgid "Skin Armature Create" -msgstr "Chế Tạo Da Cốt" +msgstr "Kiến Tạo Khung Cốt cho Da" msgid "Create an armature that parallels the skin layout" -msgstr "Chế tạo một cốt song song cài đặt da" +msgstr "Kiến Tạo một khung cốt tương đồng với bố trí của da" msgctxt "Operator" msgid "Skin Mark/Clear Loose" -msgstr "Ký Dấu Da/Xóa Rời Ra" +msgstr "Đánh Dấu/Xóa Dấu Rời Rạc của Da" msgid "Mark/clear selected vertices as loose" -msgstr "Ký Dấu/xóa các đỉnh là rời ra" +msgstr "Đánh dấu/xóa dấu các điểm đỉnh được chọn là rời rạc" msgid "Mark" -msgstr "Ký Dấu" +msgstr "Đánh Dấu" msgid "Mark selected vertices as loose" -msgstr "Ký dấu các đỉnh được chọn là rời ra" +msgstr "Đánh dấu các điểm đỉnh được chọn là rời rạc" msgid "Set selected vertices as not loose" -msgstr "Đặt các đỉnh được chọn là không rời ra" +msgstr "Đặt các điểm đỉnh được chọn là không rời rạc" msgctxt "Operator" msgid "Skin Radii Equalize" -msgstr "Bằng Hóa Bán Kính Da" +msgstr "Bán Kính Da Đồng Đều" msgid "Make skin radii of selected vertices equal on each axis" -msgstr "Làm bán kính da của các đỉnh được chọn bằng nhau cho mỗi trục" +msgstr "Bắt các bán kính da của các điểm đỉnh đã chọn trên mỗi trục bằng nhau" msgctxt "Operator" msgid "Skin Root Mark" -msgstr "Da Ký Dấu Rễ" +msgstr "Đánh Dấu Gốc của Da" msgid "Mark selected vertices as roots" -msgstr "Ký dấu các đỉnh được chọn là rễ" +msgstr "Đánh dấu các điểm đỉnh đã chọn là gốc" msgctxt "Operator" @@ -63514,29 +69717,29 @@ msgstr "Thêm Loa" msgid "Add a speaker object to the scene" -msgstr "Thêm một vật thể loa vào cảnh" +msgstr "Thêm một đối tượng loa vào cảnh" msgctxt "Operator" msgid "Subdivision Set" -msgstr "Đặt Phân Hóa" +msgstr "Đặt Mức Phân Hóa" msgid "Sets a Subdivision Surface level (1 to 5)" -msgstr "Đặt một mức độ Phân Hóa Bề Mặt (1 đến 5)" +msgstr "Đặt mức Bề Mặt Phân Hóa (1 đến 5)" msgid "Apply the subdivision surface level as an offset relative to the current level" -msgstr "Áp dụng tầng bề mặt phân hóa làm một dịch tương đối với tầng hiện tại" +msgstr "Áp dụng mức bề mặt phân hóa tựa như một dịch chuyển tương đối với mức hiện tại" msgctxt "Operator" msgid "Surface Deform Bind" -msgstr "Trói Méo Hóa Mặt" +msgstr "Kết Buộc Biến Dạng Bề Mặt" msgid "Bind mesh to target in surface deform modifier" -msgstr "Trói mạng lưới với mục đích trong bộ điều chỉnh méo hóa mặt" +msgstr "Kết buộc khung lưới với mục tiêu trong bộ điều chỉnh biến dạng bề mặt" msgctxt "Operator" @@ -63545,369 +69748,374 @@ msgstr "Thêm Văn Bản" msgid "Add a text object to the scene" -msgstr "Thêm một vật thể văn bản trong cảnh" +msgstr "Thêm một đối tượng văn bản vào cảnh" msgctxt "Operator" msgid "Clear Track" -msgstr "Xóa Theo Dõi" +msgstr "Xóa Giám Sát" msgid "Clear tracking constraint or flag from object" -msgstr "Xóa ràng buộc hay cờ theo dõi từ vật thể" +msgstr "Xóa ràng buộc giám sát hoặc cờ hiệu khỏi đối tượng" msgid "Clear Track" -msgstr "Xóa Theo Dõi" +msgstr "Xóa Giám Sát" msgid "Clear and Keep Transformation (Clear Track)" -msgstr "Xóa Và Giữ Nguyên Biến Hóa (Xóa Theo Dõi)" +msgstr "Xóa và Giữ Nguyên Biến Hóa (Xóa Giám Sát)" msgctxt "Operator" msgid "Make Track" -msgstr "Bắt Đuổi Theo" +msgstr "Bắt Phải Giám Sát" msgid "Make the object track another object, using various methods/constraints" -msgstr "Bắt vật thể theo dõi một vật thể khác, bằng các phương pháp/ràng buộc" +msgstr "Bắt đối tượng phải giám sát một đối tượng khác, bằng các phương pháp/ràng buộc khác nhau" msgid "Track to Constraint" -msgstr "Theo Dõi đến Ràng Buộc" +msgstr "Ràng Buộc Giám Sát theo" msgid "Lock Track Constraint" -msgstr "Khóa Ràng Buộc Theo Dõi" +msgstr "Ràng Buộc Giám Sát Cố Định" msgctxt "Operator" msgid "Transfer Mode" -msgstr "Chế Độ Truyền" +msgstr "Chế Độ Thuyên Chuyển" msgid "Switches the active object and assigns the same mode to a new one under the mouse cursor, leaving the active mode in the current one" -msgstr "Trao đổi vật thể hoạt động và chỉ định cùng chế độ đến một cái mới ở dưới con trỏ, giữ nguyên chế độ hoạt động trong chế độ hiện tại" +msgstr "Tráo đổi đối tượng đang hoạt động và ấn định đồng chế độ sang một cái mới nằm dưới con trỏ chuột, để nguyên cái hiện tại ở chế độ đang hoạt động" msgid "Flash On Transfer" -msgstr "Chớp khi truyền" +msgstr "Chớp Nháy khi Thuyên Chuyển" msgid "Flash the target object when transferring the mode" -msgstr "Chớp vật thể mục tiêu khi truyền chế độ" +msgstr "Nhấp nháy đối tượng mục tiêu khi thuyên chuyển chế độ" msgctxt "Operator" msgid "Apply Object Transform" -msgstr "Áp Dụng Biến Hóa Vật Thể" +msgstr "Áp Dụng Biến Hóa của Đối Tượng" msgid "Apply the object's transformation to its data" -msgstr "Áp dụng biến hóa của vật thể với dữ liệu của nó" +msgstr "Áp dụng biến hóa của đối tượng vào dữ liệu của nó" msgid "Isolate Multi User Data" -msgstr "Cố Lập Dữ Liệu Đa Người Sử Dụng" +msgstr "Cô Lập Dữ Liệu Đa Người Dùng" msgid "Create new object-data users if needed" -msgstr "Chế tạo người dùng mới cho dữ diệu của vật thể nếu cần thiết" +msgstr "Kiến Tạo người dùng dữ liệu đối tượng mới nếu cần" msgid "Apply Properties" -msgstr "Áp Dụng Đặc Tính" +msgstr "Áp Dụng các Tính Chất" msgid "Modify properties such as curve vertex radius, font size and bone envelope" -msgstr "Chỉnh đặc tính như bán kính của đỉnh đường cong, kích thước phông, và bao bì xương" +msgstr "Thay đổi các tính chất như bán kính điểm đỉnh của đường cong, cỡ phông chữ và phong bao của xương" msgctxt "Operator" msgid "Interactive Light Track to Cursor" -msgstr "Theo Đõi Đèn Kiểu Tương Tác đến Con Trỏ" +msgstr "Nguồn Sáng Theo Dõi Vị Trí của Con Trỏ một cách Tương Tác" msgid "Interactively point cameras and lights to a location (Ctrl translates)" -msgstr "Chỉ máy quay phim và đèn kiểu tương tác đến một vị trí (Ctrl được dịch)" +msgstr "Hướng các máy ảnh và các nguồn sáng vào một vi trí một cách tương tác (Ctrl dịch chuyển)" msgctxt "Operator" msgid "Place Object Under Mouse" -msgstr "Đặt Vật Thể Dưới Chuột" +msgstr "Đặt Đối Tượng Nằm Dưới Chuột" msgid "Snap selected item(s) to the mouse location" -msgstr "Hút dính (các) mặt hàng được chọn đến vị trí chuột" +msgstr "Bám dính (các) phần tử được chọn vào vị trí chuột" msgid "Object name to place (uses the active object when this and 'session_uuid' are unset)" -msgstr "Tên vật thể cho đặt (nó dùng vật thể hoạt động khi cáy này và 'uuid_phiênChạy' chưa được đặt)" +msgstr "Tên đối tượng để đặt vào (sử dụng đối tượng đang hoạt động khi cái này và 'uuid của phiên sử dụng' ('session_uuid') chưa được đặt)" msgid "Session UUID of the object to place (uses the active object when this and 'name' are unset)" -msgstr "UUID của phiên chạy để đặt (nó dùng vật thể hoạt động khi cáy này và 'tên' chưa được đặt)" +msgstr "UUID của phiên sử dụng của đối tượng cần đặt vào (sử dụng đối tượng đang hoạt động khi cái này và 'tên' (name) chưa được đặt)" msgctxt "Operator" msgid "Transforms to Deltas" -msgstr "Biến Hóa đến Lệch Lạc" +msgstr "Biến Hóa sang Delta" msgid "Convert normal object transforms to delta transforms, any existing delta transforms will be included as well" -msgstr "Đổi biến hóa bình thường vật thể sang biến hóa lệch lạc, gồm biến hóa lệch lạc nào có sẵn" +msgstr "Chuyển đổi các biến hóa đối tượng bình thường sang biến hóa Delta. Bất cứ sự biến hóa Delta hiện có nào đều cũng sẽ được bao gồm cả vào nữa" msgid "Which transforms to transfer" -msgstr "Truyền biến hóa nào" +msgstr "Biến hóa nào để thuyên chuyển" msgid "All Transforms" -msgstr "Hết Biến Hóa" +msgstr "Toàn Bộ các Biến Hóa" msgid "Transfer location, rotation, and scale transforms" -msgstr "Truyền biến hóa vị trí, xoay, và phóng to" +msgstr "Thuyên chuyển các biến hóa về vị trí, xoay chiều, và tỷ lệ" msgid "Transfer location transforms only" -msgstr "Chỉ truyền biến hóa vị trí" +msgstr "Chỉ thuyên chuyển biến hóa về vị trí mà thôi" msgid "Transfer rotation transforms only" -msgstr "Chỉ truyền biến hóa xoay" +msgstr "Chỉ thuyên chuyển biến hóa về xoay chiều mà thôi" msgid "Transfer scale transforms only" -msgstr "Chỉ truyền biến hóa phóng to" +msgstr "Chỉ thuyên chuyển các biến hóa về tỷ lệ mà thôi" msgid "Reset Values" -msgstr "Đặc Lại Giá Trị" +msgstr "Hoàn Lại các Giá Trị" msgid "Clear transform values after transferring to deltas" -msgstr "Xoá giá trị biến hóa sau đổi sang lệch lạc" +msgstr "Xóa các giá trị biến hóa sau khi đã thuyên chuyển sang deltas" msgctxt "Operator" msgid "Add Vertex Group" -msgstr "Thêm Nhóm Đỉnh" +msgstr "Thêm Nhóm Điểm Đỉnh" msgid "Add a new vertex group to the active object" -msgstr "Thêm một nhóm đỉnh cho vật thể hoạt động" +msgstr "Thêm một nhóm điểm đỉnh vào đối tượng đang hoạt động" msgctxt "Operator" msgid "Assign to New Group" -msgstr "Chỉ Định đến Nhóm Đỉnh Mới" +msgstr "Ấn Định vào Nhóm Mới" msgid "Assign the selected vertices to a new vertex group" -msgstr "Chỉ định các đỉnh được chọn thành lập một nhóm đỉnh mới" +msgstr "Ấn định các điểm đỉnh được chọn vào một nhóm điểm đỉnh mới" msgctxt "Operator" msgid "Clean Vertex Group Weights" -msgstr "Lạm Sạch Quyền Lượng Nhóm Đỉnh" +msgstr "Làm Vệ Sinh các Trọng Lượng Nhóm Điểm Đỉnh" msgid "Remove vertex group assignments which are not required" -msgstr "Xóa chỉ định nhóm đỉnh thì không cần thiết" +msgstr "Loại bỏ các ấn định nhóm điểm đỉnh, tức những cái không đòi hỏi" msgid "Define which subset of groups shall be used" -msgstr "Chỉ định sẽ dùng hạ tập hợp nào của các nhóm" +msgstr "Xác định tập hợp con nào của các nhóm sẽ được sử dụng" msgid "Keep Single" -msgstr "Giữ Cô Lập" +msgstr "Giữ Đơn Thể" msgid "Keep verts assigned to at least one group when cleaning" -msgstr "Giữ chỉ định đỉnh vào ít nhất một nhóm khi làm sạch" +msgstr "Lưu giữ các điểm đỉnh được ấn định vào ít nhất một nhóm nào đó khi dọn dẹp" msgid "Remove vertices which weight is below or equal to this limit" -msgstr "Xóa các đỉnh có quyền lượng thấp hơn hay bằng giới hạn này" +msgstr "Xóa các điểm đỉnh có trọng lượng thấp hơn hoặc bằng giá trị giới hạn này" + + +msgctxt "Operator" +msgid "Duplicate Vertex Group" +msgstr "Nhân Đôi Nhóm Điểm Đỉnh" msgid "Make a copy of the active vertex group" -msgstr "Chép lại nhóm đỉnh hoạt động" +msgstr "Tạo một bản sao của nhóm điểm đỉnh đang hoạt động" msgctxt "Operator" msgid "Copy Vertex Group to Selected" -msgstr "Chép Nhóm Đỉnh Đến Được Chọn" +msgstr "Sao Chép Nhóm Điểm Đỉnh đến những cái được Chọn" msgid "Replace vertex groups of selected objects by vertex groups of active object" -msgstr "Thay thế cho các nhóm đỉnh của vật thể được chọn bằng nhóm đỉnh của vật thể hoạt động" +msgstr "Thay thế các nhóm điểm đỉnh của đối tượng được chọn bằng các nhóm điểm đỉnh của đối tượng đang hoạt động" msgid "Invert active vertex group's weights" -msgstr "Đảo nghịch quyền lượng của nhóm đỉnh hoạt động" +msgstr "Đảo nghịch trọng lượng của nhóm điểm đỉnh đang hoạt động" msgid "Add Weights" -msgstr "Thêm Quyền Lượng" +msgstr "Thêm Trọng Lượng" msgid "Add vertices from groups that have zero weight before inverting" -msgstr "Thêm đỉnh từ các nhóm có quyền lượng bằng không trước đảo nghịch" +msgstr "Thêm các điểm đỉnh từ những nhóm có trọng lượng bằng không, trước khi đảo nghịch" msgid "Remove Weights" -msgstr "Xóa Quyền Lượng" +msgstr "Xóa Trọng Lượng" msgid "Remove vertices from groups that have zero weight after inverting" -msgstr "Xóa đỉnh từ các nhóm có quyền lượng bằng không sau đảo nghịch" +msgstr "Xóa các điểm đỉnh khỏi các nhóm có trọng lượng bằng không sau khi đảo nghịch" msgctxt "Operator" msgid "Vertex Group Levels" -msgstr "Tầng Nhóm Đỉnh" +msgstr "Mức Độ của Nhóm Điểm Đỉnh" msgid "Add some offset and multiply with some gain the weights of the active vertex group" -msgstr "Cộng chút dịch và nhân với chút tăng lượng cho quyền lượng của nhóm đỉnh hoạt động" +msgstr "Cộng một chút dịch chuyển và nhân với một lượng khuếch đại vào các trọng lượng của nhóm điểm đỉnh đang hoạt động" msgid "Value to multiply weights by" -msgstr "Giá trị để nhân quyền lượng" +msgstr "Giá trị để nhân trọng lượng lên" msgid "Value to add to weights" -msgstr "Giá trị để cộng với quyền lượng" +msgstr "Giá trị để thêm vào trọng lượng" msgctxt "Operator" msgid "Limit Number of Weights per Vertex" -msgstr "Hạn chế Số Lượng Quyền cho mỗi Đỉnh" +msgstr "Hạn Chế Số Trọng Lượng cho mỗi Điểm Đỉnh" msgid "Limit deform weights associated with a vertex to a specified number by removing lowest weights" -msgstr "Hạn chế quyền lượng méo hóa liên quan với một đỉnh " +msgstr "Hạn chế trọng lượng biến dạng liên quan với một điểm đỉnh xuống một số nhất định bằng cách xóa những trọng lượng nhỏ nhất" msgid "Maximum number of deform weights" -msgstr "Số lượng quyền lượng méo hóa tối đa" +msgstr "Số trọng lượng biến dạng tối đa" msgctxt "Operator" msgid "Change the Lock On Vertex Groups" -msgstr "Đổi Khóa Của Nhóm Đỉnh" +msgstr "Đổi Khóa trên các Nhóm Điểm Đỉnh" msgid "Change the lock state of all or some vertex groups of active object" -msgstr "Đổi trạng thái khóa cho hết hoặc vài nhóm đỉnh của vật thể hoạt động" +msgstr "Đổi trạng thái khóa của toàn bộ, hoặc một số, nhóm điểm đỉnh trong đối tượng đang hoạt động" msgid "Lock action to execute on vertex groups" -msgstr "Khóa hành động chỉ thực hành cho nhóm đỉnh" +msgstr "Hành động khóa sẽ thi hành trên nhóm điểm đỉnh" msgid "Unlock all vertex groups if there is at least one locked group, lock all in other case" -msgstr "Mở khóa cho hết nhóm đỉnh nếu có ít nhất một nhóm bị khóa, khóa hết trong các trường hợp khác" +msgstr "Mở khóa toàn bộ các nhóm điểm đỉnh, nếu có ít nhất một nhóm bị khóa, nếu không, khóa toàn bộ các nhóm lại" msgid "Lock all vertex groups" -msgstr "Khóa hết nhóm đỉnh" +msgstr "Khóa toàn bộ các nhóm điểm đỉnh" msgid "Unlock all vertex groups" -msgstr "Mở khóa hết nhóm đỉnh" +msgstr "Mở khóa toàn bộ các nhóm điểm đỉnh" msgid "Invert the lock state of all vertex groups" -msgstr "Đảo nghịch trạng thái khóa của hết nhóm đỉnh" +msgstr "Đảo nghịch trạng thái khóa của toàn bộ các nhóm điểm đỉnh" msgid "Apply the action based on vertex group selection" -msgstr "Áp dụng hành động tùy sự lựa chọn của nhóm đỉnh" +msgstr "Áp dụng hành động dựa trên sự lựa chọn nhóm điểm đỉnh" msgid "Apply action to all vertex groups" -msgstr "Áp dụng hành động đến hết nhóm đỉnh" +msgstr "Áp dụng hành động vào toàn bộ các nhóm điểm đỉnh" msgid "Apply to selected vertex groups" -msgstr "Áp dụng đến các nhóm đỉnh được chọn" +msgstr "Áp dụng vào nhóm điểm đỉnh được chọn" msgid "Apply to unselected vertex groups" -msgstr "Áp dụng đến các nhóm đỉnh không được chọn" +msgstr "Áp dụng vào các nhóm điểm đỉnh chưa được chọn" msgid "Invert Unselected" -msgstr "Đảo Nghịch Được Chọn" +msgstr "Đảo Ngược cái Chưa Được Chọn" msgid "Apply the opposite of Lock/Unlock to unselected vertex groups" -msgstr "Áp dụng nghịch Khóa/Mở Khóa đến các nhóm không được chọn" +msgstr "Áp dụng trạng thái đối lập của Khóa/Tháo Khóa vào các nhóm điểm đỉnh chưa được chọn" msgctxt "Operator" msgid "Mirror Vertex Group" -msgstr "Gương Nhóm Đỉnh" +msgstr "Phản Chiếu Đối Xứng Nhóm Điểm Đỉnh" msgid "Mirror vertex group, flip weights and/or names, editing only selected vertices, flipping when both sides are selected otherwise copy from unselected" -msgstr "Gương lại nhóm đỉnh, lật quyền lượng và/hay tên, chỉ biên tập các đỉnh được chọn, lật khi cả hai bên được chọn; nếu không, chép lại từ các đỉnh chưa chọn" +msgstr "Phản chiếu đối xứng nhóm điểm đỉnh, đảo trọng lượng và/hoặc các tên, chỉ biên soạn các điểm đỉnh được chọn mà thôi, đảo lật khi cả hai bên đều được chọn, nếu không, sao chép từ cái chưa được chọn" msgid "All Groups" -msgstr "Hết Nhóm" +msgstr "Toàn Bộ các Nhóm" msgid "Mirror all vertex groups weights" -msgstr "Gương hết quyền lượng nhóm đỉnh" +msgstr "Phản chiếu đối xứng toàn bộ các trọng lượng nhóm điểm đỉnh" msgid "Flip Group Names" -msgstr "Lật Tên Nhóm" +msgstr "Đảo Bên Tên của Nhóm" msgid "Flip vertex group names" -msgstr "Lật tên nhóm đỉnh" +msgstr "Đảo bên các tên của nhóm điểm đỉnh" msgid "Mirror Weights" -msgstr "Gương Quyền Lượng" +msgstr "Phản Chiếu Đối Xứng Trọng Lượng" msgid "Mirror weights" -msgstr "Gương quyền lượng" +msgstr "Phản chiếu đối xứng trọng lượng" msgctxt "Operator" msgid "Move Vertex Group" -msgstr "Di Chuyển Nhóm Đỉnh" +msgstr "Di Chuyển Nhóm Điểm Đỉnh" msgid "Move the active vertex group up/down in the list" -msgstr "Di chuyển nhóm đỉnh đang hoạt động lên/xuống trong danh sách" +msgstr "Di chuyển nhóm điểm đỉnh lên/xuống trong danh sách" msgid "Normalize weights of the active vertex group, so that the highest ones are now 1.0" -msgstr "Đơn vị hóa quyền lượng của nhóm đỉnh đang hoạt động, cho giá trị lớn nhất bằng 1.0" +msgstr "Bình thường hóa trọng lượng của nhóm điểm đỉnh đang hoạt động, hầu cho các giá trị lớn nhất hiện tại là 1.0" msgctxt "Operator" msgid "Normalize All Vertex Groups" -msgstr "Đơn Vị Hóa Hết Nhóm Đỉnh" +msgstr "Bình Thường Hóa Toàn Bộ các Nhóm Điểm Đỉnh" msgctxt "Operator" msgid "Quantize Vertex Weights" -msgstr "Bước Hóa Quyền Lượng Nhóm Đỉnh" +msgstr "Lượng Tử Hóa Trọng Lượng Điểm Đỉnh" msgid "Set weights to a fixed number of steps" -msgstr "Đặt quyền lượng vào một số lượng bước" +msgstr "Đặt trọng lượng vào một số bước cố định" msgid "Number of steps between 0 and 1" @@ -63916,157 +70124,157 @@ msgstr "Số lượng bước giữa 0 và 1" msgctxt "Operator" msgid "Remove Vertex Group" -msgstr "Xóa Nhóm Đỉnh" +msgstr "Xóa Nhóm Điểm Đỉnh" msgid "Delete the active or all vertex groups from the active object" -msgstr "Xóa nhóm đỉnh hoạt động hay hết nhóm đỉnh từ vật thể đang hoạt động" +msgstr "Xóa nhóm điểm đỉnh đang hoạt động hoặc toàn bộ các nhóm điểm đỉnh khỏi đối tượng đang hoạt động" msgid "Remove all vertex groups" -msgstr "Xóa hết nhóm đỉnh" +msgstr "Xóa toàn bộ các nhóm điểm đỉnh" msgid "All Unlocked" -msgstr "Hết Bị Khóa" +msgstr "Toàn Bộ Không Bị Khóa" msgid "Remove all unlocked vertex groups" -msgstr "Xóa hết nhóm đỉnh được mở khóa" +msgstr "Xóa toàn bộ các nhóm điểm đỉnh không bị khóa" msgid "Remove from all groups" -msgstr "Xóa từ hết nhóm đỉnh" +msgstr "Xóa khỏi toàn bộ các nhóm" msgid "All Vertices" -msgstr "Hết Đỉnh" +msgstr "Toàn Bộ các Điểm Đỉnh" msgid "Clear the active group" -msgstr "Xóa nhóm hoạt động" +msgstr "Xóa nhóm đang hoạt động" msgctxt "Operator" msgid "Set Active Vertex Group" -msgstr "Đặt Nhóm Đỉnh Hoạt Động" +msgstr "Đặt Nhóm Điểm Đỉnh đang Hoạt Động" msgid "Set the active vertex group" -msgstr "Đặt nhóm đỉnh hoạt động" +msgstr "Đặt nhóm điểm đỉnh đang hoạt động" msgid "Vertex group to set as active" -msgstr "Đặt nhóm đỉnh nào là hoạt động" +msgstr "Nhóm điểm đỉnh được đặt là đang hoạt động" msgctxt "Operator" msgid "Smooth Vertex Weights" -msgstr "Mịn Hóa Quyền Lượng Đỉnh" +msgstr "Trọng Lượng Điểm Đỉnh Biến Chuyển Mịn Màng" msgid "Smooth weights for selected vertices" -msgstr "Mịn hóa quyền lượng cho đỉnh được chọn" +msgstr "Làm mịn trọng lượng cho các điểm đỉnh đã chọn" msgid "Expand/Contract" -msgstr "Nở Ra/Rút Nhỏ" +msgstr "Mở Rộng/Thu Nhỏ" msgid "Expand/contract weights" -msgstr "Nở ra /rút nhỏ quyền lượng" +msgstr "Mở rộng/thu nhỏ trọng lượng" msgctxt "Operator" msgid "Sort Vertex Groups" -msgstr "Sắp Xếp Nhóm Đỉnh" +msgstr "Sắp Xếp Thứ Tự các Nhóm Điểm Đỉnh" msgid "Sort vertex groups" -msgstr "Sắp xếp thứ tự các nhóm đỉnh" +msgstr "Sắp xếp thứ tự các nhóm điểm đỉnh" msgid "Sort Type" -msgstr "Loại Sắp Xếp" +msgstr "Kiểu Sắp Xếp Trật Tự" msgid "Sort type" -msgstr "Loại Sắp Xếp" +msgstr "Kiểu sắp xếp trật tự" msgid "Bone Hierarchy" -msgstr "Tầng Bậc Xương" +msgstr "Thứ Bậc của Xương" msgctxt "Operator" msgid "Make Vertex Parent" -msgstr "Làm Phụ Huynh Đỉnh" +msgstr "Đặt Điểm Đỉnh làm Phụ Huynh" msgid "Parent selected objects to the selected vertices" -msgstr "Phụ huynh các vật thể được chọn với các đỉnh được chọn" +msgstr "Đặt các điểm đỉnh được chọn làm phụ huynh các đối tượng được chọn" msgctxt "Operator" msgid "Copy Active" -msgstr "Chép Hoạt Động" +msgstr "Sao Chép cái đang Hoạt Động" msgid "Copy weights from active to selected" -msgstr "Chép quyền lượng từ hoạt động đến được chọn" +msgstr "Sao chép trọng lượng từ cái đang hoạt động sang cái được chọn" msgctxt "Operator" msgid "Delete Weight" -msgstr "Xóa Quyền Lượng" +msgstr "Xóa Trọng Lượng" msgid "Delete this weight from the vertex (disabled if vertex group is locked)" -msgstr "Xóa quyền lượng này từ đỉnh (bị tắt nếu nhóm đỉnh bị khóa)" +msgstr "Xóa trọng lượng này khỏi điểm đỉnh (vô hiệu hóa nếu nhóm điểm đỉnh bị khóa)" msgid "Weight Index" -msgstr "Chỉ Số Quyền Lượng" +msgstr "Chỉ Số Trọng Lượng" msgid "Index of source weight in active vertex group" -msgstr "Chỉ số của quyền lượng nguồn trong nhóm đỉnh hoạt động" +msgstr "Chỉ số của trọng lượng nguồn trong nhóm điểm đỉnh đang hoạt động" msgctxt "Operator" msgid "Normalize Active" -msgstr "Đơn Vị Hóa Hoạt Động" +msgstr "Bình Thường Hóa cái đang Hoạt Động" msgid "Normalize active vertex's weights" -msgstr "Đơn vị hóa quyền lượng của đỉnh hoạt động" +msgstr "Bình thường hóa các trọng lượng của điểm đỉnh đang hoạt động" msgctxt "Operator" msgid "Paste Weight to Selected" -msgstr "Dán Quyền Lượng Đến Được Chọn" +msgstr "Dán Trọng Lượng sang cái được Chọn" msgid "Copy this group's weight to other selected vertices (disabled if vertex group is locked)" -msgstr "Chép quyền lượng của vật thể này đến các đỉnh khác đã chọn (bị tắt nếu nhóm đỉnh bị khóa)" +msgstr "Sao chép trọng lượng của nhóm này sang các điểm đỉnh đã chọn khác (tắt nếu nhóm điểm đỉnh đã bị khóa lại)" msgctxt "Operator" msgid "Set Active Group" -msgstr "Đặt Nhóm Hoạt Động" +msgstr "Đặt Nhóm đang Hoạt Động" msgid "Set as active vertex group" -msgstr "Đặt làm nhóm đỉnh hoạt động" +msgstr "Đặt làm nhóm điểm đỉnh đang hoạt động" msgctxt "Operator" msgid "Apply Visual Transform" -msgstr "Áp Dụng Biến Hóa Thị Giác" +msgstr "Áp Dụng Biến Hóa Trực Quan" msgid "Apply the object's visual transformation to its data" -msgstr "Áp dụng biến hóa thị giác của vật với dứ liệu của nó" +msgstr "Áp dụng biến hóa trực quan của đối tượng vào dữ liệu của nó" msgctxt "Operator" @@ -64075,38 +70283,38 @@ msgstr "Thêm Thể Tích" msgid "Add a volume object to the scene" -msgstr "Thêm một vật thể thể tích trong cảnh" +msgstr "Thêm một đối tượng thể tích vào cảnh" msgctxt "Operator" msgid "Import OpenVDB Volume" -msgstr "Nhập Thể Tích OpenVDB" +msgstr "Nhập Khẩu Thể Tích OpenVDB" msgid "Import OpenVDB volume file" -msgstr "Nhập tập tin thể tích OpenVDB" +msgstr "Nhập Khẩu tập tin thể tích OpenVDB" msgid "Automatically detect animated sequences in selected volume files (based on file names)" -msgstr "Tự động phát hiện trình tự hoạt hình trong các tập tin thể tích (tùy tên tập tin)" +msgstr "Tự động phát hiện các trình tự hoạt họa trong các tập tin thể tích đã chọn (dựa trên tên của tập tin)" msgctxt "Operator" msgid "Voxel Remesh" -msgstr "Mạng Lưới Lại Thể Tích Tử" +msgstr "Kiến Tạo Lại Thể Tích Tử" msgid "Calculates a new manifold mesh based on the volume of the current mesh. All data layers will be lost" -msgstr "Tính lại một mạng lưới đa tập cơ sở tùy thể tích của mạng lưới hiện tại. Sẽ xóa tất cả lớp dữ liệu" +msgstr "Tính toán một khung lưới đa tạp mới dựa trên thể tích của khung lưới hiện tại. Toàn bộ các tầng dữ liệu đều sẽ bị mất" msgctxt "Operator" msgid "Edit Voxel Size" -msgstr "Biên Tập Kích Thước Thể Tích Tử" +msgstr "Biên Soạn Kích Thước Thể Tích Tử" msgid "Modify the mesh voxel size interactively used in the voxel remesher" -msgstr "Đổi tương tác kích thước mạng lưới thể tích tử được dùng trong bộ mạng lưới lại chế độ thể tích tử" +msgstr "Sửa đổi kích thước thể tích tử một cách tương tác. Sử dụng trong trình kiến tạo lại thể tích tử" msgctxt "Operator" @@ -64115,24 +70323,24 @@ msgstr "Mục Lục - Đặt Hành Động" msgid "Change the active action used" -msgstr "Đổi hành động hoạt động được dùng" +msgstr "Đổi hành động đang hoạt động sử dụng" msgctxt "Operator" msgid "Outliner Animation Data Operation" -msgstr "Mục Lục - Thao Tác Dữ Liệu Hoạt Hình" +msgstr "Mục Lục - Thao Tác Dữ Liệu Hoạt Họa" msgid "Animation Operation" -msgstr "Thao Tác Hoạt Hình" +msgstr "Thao Tác Hoạt Họa" msgid "Clear Animation Data" -msgstr "Xóa Dữ Liệu Hoạt Hình" +msgstr "Xóa Dữ Liệu Hoạt Họa" msgid "Remove this animation data container" -msgstr "Xóa đồ chứa dữ liệu hoạt hình" +msgstr "Xóa vỏ chứa dữ liệu hoạt họa này" msgid "Set Action" @@ -64140,11 +70348,11 @@ msgstr "Đặt Hành Động" msgid "Unlink Action" -msgstr "Gỡ Liên Kết Hành Động" +msgstr "Ngắt Kết Nối Hành Động" msgid "Refresh Drivers" -msgstr "Nạp Lại Điều Vận Lại" +msgstr "Cập Nhật Điều Vận" msgid "Clear Drivers" @@ -64153,233 +70361,233 @@ msgstr "Xóa Điều Vận" msgctxt "Operator" msgid "Set Color Tag" -msgstr "Đặt Nhẵn Màu" +msgstr "Đặt Nhãn Màu" msgid "Set a color tag for the selected collections" -msgstr "Đặt một nhẵn màu cho các sưu tập được chọn" +msgstr "Đặt một nhãn màu cho bộ sưu tập đã chọn" msgid "Color Tag" -msgstr "Nhẵm Màu" +msgstr "Nhãn Màu" msgctxt "Operator" msgid "Disable Collection" -msgstr "Tắt Sưu Tập" +msgstr "Tắt Bộ Sưu Tập" msgid "Disable viewport display in the view layers" -msgstr "Tắt hiển thị màn chiếu trong các lớp màn chiếu" +msgstr "Tắt hiển thị cổng nhìn ở các tầng góc nhìn" msgctxt "Operator" msgid "Disable Collection in Render" -msgstr "Tắt Sưu Tập trong Kết Xuất" +msgstr "Tắt Bộ Sưu Tập trong Kết Xuất" msgid "Do not render this collection" -msgstr "Không kết xuất sưu tập này" +msgstr "Không kết xuất bộ sưu tập này" msgid "Drag to move to collection in Outliner" -msgstr "Kéo để di chuyển sưu tập trong Mục Lục" +msgstr "Kéo rê để chuyển sang bộ sưu tập trong Mục Lục (Outliner)" msgctxt "Operator" msgid "Duplicate Collection" -msgstr "Sao Chép Sưu Tập" +msgstr "Nhân Đôi Bộ Sưu Tập" msgid "Recursively duplicate the collection, all its children, objects and object data" -msgstr "Sao chép sưu tập kiểu đệ quy, hết con cái, vật thể, và dữ liệu vật thể của nó" +msgstr "Sao chép bộ sưu tập một cách đệ quy, toàn bộ các con cái của nó, các đối tượng và dữ liệu đối tượng" msgctxt "Operator" msgid "Duplicate Linked Collection" -msgstr "Sao Chép Sưu Tập Được Liên Kết" +msgstr "Nhân Đôi Bộ Sưu Tập Kết Nối" msgid "Recursively duplicate the collection, all its children and objects, with linked object data" -msgstr "Sao chép sưu tập kiểu đệ quy, hết con cái và vật thể của nó, với dữ liệu vật thể được liên kết" +msgstr "Sao chép bộ sưu tập một cách đệ quy, toàn bộ các con cái và đối tượng của nó, với dữ liệu đối tượng kết nối" msgctxt "Operator" msgid "Enable Collection" -msgstr "Bật Sưu Tập" +msgstr "Bật Bộ Sưu Tập" msgid "Enable viewport display in the view layers" -msgstr "Bật hiển thị màn chiếu trong các lớp màn chiếu" +msgstr "Bật hiển thị cổng nhìn trong các tầng góc nhìn" msgctxt "Operator" msgid "Enable Collection in Render" -msgstr "Bật Sưu Tập trong Kết Xuất" +msgstr "Cho Phép Kết Xuất Bộ Sưu Tập" msgid "Render the collection" -msgstr "Kết xuất suư tập" +msgstr "Kết xuất bộ sưu tập này" msgctxt "Operator" msgid "Enable in View Layer" -msgstr "Bật trong Lớp Hiển Thị" +msgstr "Bật trong Tầng Góc Nhìn" msgid "Include collection in the active view layer" -msgstr "Gồm sưu tập trong lớp màn chiếu hoạt động" +msgstr "Bao gồm bộ sưu tập trong Tầng Góc Nhìn đang hoạt động" msgctxt "Operator" msgid "Disable from View Layer" -msgstr "Tắt từ Lớp Hiển Thị" +msgstr "Tắt trong Tầng Góc Nhìn" msgid "Exclude collection from the active view layer" -msgstr "Trừ lọai sưu tập từ lớp màn chiếu hoạt động" +msgstr "Loại trừ bộ sưu tập khỏi Tầng Góc Nhìn đang hoạt động" msgid "Hide the collection in this view layer" -msgstr "Ẩn sưu tập trong lớp màn chiếu hoạt động" +msgstr "Ẩn giấu bộ sưu tập trong Tầng Góc Nhìn này" msgctxt "Operator" msgid "Hide Inside Collection" -msgstr "Ẩn trong Sưu Tập" +msgstr "Ẩn Giấu những cái Nằm Trong Bộ Sưu Tập" msgid "Hide all the objects and collections inside the collection" -msgstr "Ẩn hết vật thể và sưu tập trong sưu tập" +msgstr "Ẩn giấu toàn bộ các đối tượng và các bộ sưu tập nằm trong bộ sưu tập này" msgctxt "Operator" msgid "Delete Hierarchy" -msgstr "Xóa Tầng Bậc" +msgstr "Xóa Cây Thứ Bậc Bên Dưới" msgid "Delete selected collection hierarchies" -msgstr "Xóa các tầng bậc sưu tập được chọn" +msgstr "Xóa các thứ bậc của bộ sưu tập được chọn" msgctxt "Operator" msgid "Clear Holdout" -msgstr "Xóa Mặt Nạ" +msgstr "Không Giữ Chỗ" msgid "Clear masking of collection in the active view layer" -msgstr "Xóa mặt nạ của sưu tập trong lớp màn chiếu hoạt động" +msgstr "Tắt chắn lọc của bộ sưu tập trong Tầng Góc Nhìn đang hoạt động" msgctxt "Operator" msgid "Set Holdout" -msgstr "Đặt Mặt Nạ" +msgstr "Đặt Giữ Lại" msgid "Mask collection in the active view layer" -msgstr "Mặt nạ sưu tập trong lớp màn chiếu hoạt động" +msgstr "Chắn lọc bộ sưu tập trong Tầng Góc Nhìn đang hoạt động" msgctxt "Operator" msgid "Clear Indirect Only" -msgstr "Xóa Chỉ Gián Tiếp" +msgstr "Tắt Duy Gián Tiếp" msgid "Clear collection contributing only indirectly in the view layer" -msgstr "Xóa sưu tập chỉ được góp gián tiếp trong lớp màn chiếu" +msgstr "Tắt tính năng chỉ đóng góp gián tiếp trong Tầng Góc Nhìn của bộ sưu tập" msgctxt "Operator" msgid "Set Indirect Only" -msgstr "Đặt Chỉ Gián Tiếp" +msgstr "Đặt Duy Gián Tiếp" msgid "Set collection to only contribute indirectly (through shadows and reflections) in the view layer" -msgstr "Đặt sưu tập chỉ được góp gián tiếp (bằng bóng tối và phản xạ) trong lớp màn chiếu" +msgstr "Đặt tính năng chỉ đóng góp gián tiếp (vào bóng tối và ánh phản quang) trong Tầng Góc Nhìn của bộ sưu tập" msgctxt "Operator" msgid "Instance Collection" -msgstr "Thực Thể Sưu Tập" +msgstr "Tạo Thực Thể Bộ Sưu Tập" msgid "Instance selected collections to active scene" -msgstr "Thực thể sưu tập được chọn vào cảnh hoạt động" +msgstr "Thực thể hóa (biến thành thật/tạo bản sao) những bộ sưu tập được chọn vào cảnh đang hoạt động" msgctxt "Operator" msgid "Isolate Collection" -msgstr "Cô Lập Sưu Tập" +msgstr "Cô Lập Bộ Sưu Tập" msgid "Hide all but this collection and its parents" -msgstr "Ẩn hết trừ sưu tập này và phụ huynh của nó" +msgstr "Ẩn giấu toàn bộ ngoại trừ bộ sưu tập này và các phụ huynh của nó" msgid "Extend current visible collections" -msgstr "Mở rộng sưu tập hiển thị hiện tại" +msgstr "Nới/mở rộng các bộ sưu tập hiện tại nhìn thấy được" msgctxt "Operator" msgid "Link Collection" -msgstr "Liên Kết Sưu Tập" +msgstr "Kết Nối Bộ Sưu Tập" msgid "Link selected collections to active scene" -msgstr "Liên kết sưu tập được chọn với cảnh hoạt động" +msgstr "Kết nối những bộ sưu tập được chọn với cảnh đang hoạt động" msgctxt "Operator" msgid "New Collection" -msgstr "Sưu Tập Mới" +msgstr "Bộ Sưu Tập Mới" msgid "Add a new collection inside selected collection" -msgstr "Thêm một sưu tập trong sưu tập được chọn" +msgstr "Thêm một bộ sưu tập mới vào nội trong bộ sưu tập được chọn" msgid "Nested" -msgstr "Đệ Quy" +msgstr "Lồng" msgid "Add as child of selected collection" -msgstr "Thêm làm con cái của sưu tập được chọn" +msgstr "Thêm vào làm con cái của bộ sưu tập được chọn" msgctxt "Operator" msgid "Deselect Objects" -msgstr "Thả Vật Thể Chọn" +msgstr "Hủy Chọn các Đối Tượng" msgid "Deselect objects in collection" -msgstr "Thả vật thể trong sưu tập" +msgstr "Bỏ chọn các đối tượng trong bộ sưu tập" msgctxt "Operator" msgid "Select Objects" -msgstr "Chọn Vật Thể" +msgstr "Lựa Chọn các Đối Tượng" msgid "Select objects in collection" -msgstr "Chọn vật thể trong sưu tập" +msgstr "Chọn các đối tượng trong bộ sưu tập" msgctxt "Operator" msgid "Show Collection" -msgstr "Hiện Sưu Tập" +msgstr "Hiển Thị Bộ Sưu Tập" msgid "Show the collection in this view layer" -msgstr "Hiện sưu tập trong lớp màn chiếu" +msgstr "Hiển thị bộ sưu tập trong Tầng Góc Nhìn này" msgctxt "Operator" msgid "Show Inside Collection" -msgstr "Hiện Trong Sưu Tập" +msgstr "Hiển Thị Nội Dung Bên Trong của Bộ Sưu Tập" msgid "Show all the objects and collections inside the collection" -msgstr "Hiện hết vật thể và các sưu tập trong sưu tập" +msgstr "Hiển thị toàn bộ các đối tượng và các bộ sưu tập nằm bên trong bộ sưu tập" msgctxt "Operator" @@ -64402,102 +70610,106 @@ msgstr "Thao Tác Dữ Liệu" msgctxt "Operator" msgid "Data Stack Drop" -msgstr "Thả Xếp Đống Dữ Liệu" +msgstr "Thả Ngăn Xếp Dữ Liệu" msgid "Copy or reorder modifiers, constraints, and effects" -msgstr "Chép hay sắp xếp lại bộ điều chỉnh, ràng buộc, và hiệu ứng" +msgstr "Sao chép hoặc đổi trật tự các bộ điều chỉnh, ràng buộc và các hiệu ứng" msgid "Delete selected objects and collections" -msgstr "Xóa các vật thể và sưu tập được chọn" +msgstr "Xóa các đối tượng và các bộ sưu tập được chọn" msgid "Delete child objects and collections" -msgstr "Xóa vật thể con cái và sưu tập" +msgstr "Xóa các đối tượng và các bộ sưu tập con cái" msgctxt "Operator" msgid "Add Drivers for Selected" -msgstr "Thêm Điều Vận Cho Được Chọn" +msgstr "Thêm Điều Vận cho cái được Chọn" msgid "Add drivers to selected items" -msgstr "Thêm điều vận cho mặt hàng được chọn" +msgstr "Thêm điều vận cho những phần tử được chọn" msgctxt "Operator" msgid "Delete Drivers for Selected" -msgstr "Xóa Điều Vận Cho Được Chọn" +msgstr "Xóa Điều Vận cho cái được Chọn" msgid "Delete drivers assigned to selected items" -msgstr "Xóa điều vận được chỉ định cho mặt hàng được chọn" +msgstr "Xóa các điều vận đã chỉ định cho những phần tử được chọn" msgctxt "Operator" msgid "Expand/Collapse All" -msgstr "Mở Rộng/Tóp Hết" +msgstr "Mở Rộng/Thu Lại Toàn Bộ" msgid "Expand/Collapse all items" -msgstr "Mở Rộng/Tóp hết mặt hàng" +msgstr "Mở Rộng/Thu Lại toàn bộ các phần tử" msgid "Hide selected objects and collections" -msgstr "Ẩn vật thể và sưu tập được chọn" +msgstr "Ẩn giấu các đối tượng được chọn và các bộ sưu tập" msgctxt "Operator" msgid "Update Highlight" -msgstr "Nâng Cấp Nổi Bật" +msgstr "Cập Nhật cái Nêu Bật" msgid "Update the item highlight based on the current mouse position" -msgstr "Nâng cấp mặt hàng nổi bật tùy vị trí hiện tại của chuột" +msgstr "Cập nhật phần tử nêu bật dựa vào vị trí hiện tại của chuột" msgctxt "Operator" msgid "Outliner ID Data Copy" -msgstr "Mục Lục - Chép Dữ Liệu ID" +msgstr "Mục lục - Sao Chép Dữ Liệu ID" + + +msgid "Copy the selected data-blocks to the internal clipboard" +msgstr "Sao chép các khối dữ liệu đã chọn vào bảng nhớ tạm nội bộ" msgctxt "Operator" msgid "Delete Data-Block" -msgstr "Xóa Cục Dữ Liệu" +msgstr "Xóa Khối Dữ Liệu" msgid "Delete the ID under cursor" -msgstr "Xoá ID ở dưới con trỏ" +msgstr "Xóa ID nằm dưới con trỏ" msgctxt "Operator" msgid "Outliner ID Data Operation" -msgstr "Mục Lục - Thao Tác Dữ Liệu ID" +msgstr "Mục lục - Thao Tác Dữ Liệu ID" msgid "General data-block management operations" -msgstr "Thao tác tổng quát cho quản lý cục dữ liệu" +msgstr "Các thao tác quản lý khối dữ liệu chung" msgid "ID Data Operation" -msgstr "Thảo Tác Dữ Liệu ID" +msgstr "Thao Tác Dữ Liệu ID" msgid "Unlink" -msgstr "Gỡ Liên Kết" +msgstr "Ngắt Kết Nối" msgid "Make Local" -msgstr "Làm Địa Phương" +msgstr "Cục Bộ Hóa" msgid "Remap Users" -msgstr "Ánh Xạ Lại Người Dùng" +msgstr "Kết Nối Lại Người Dùng" msgid "Make all users of selected data-blocks to use instead current (clicked) one" -msgstr "Làm cho hết người dùng các cục dữ liệu được chọn dùng cục dữ liệu hiện tại (đã bấm)" +msgstr "Làm cho toàn bộ các những người dùng của các khối dữ liệu được chọn trở thành sử dụng, thay vì cái hiện tại (được bấm chuột)" msgid "Paste" @@ -64505,15 +70717,15 @@ msgstr "Dán" msgid "Add Fake User" -msgstr "Thêm Người Dùng Giả Bộ" +msgstr "Thêm Người Dùng Giả" msgid "Ensure data-block gets saved even if it isn't in use (e.g. for motion and material libraries)" -msgstr "Làm chắc cục dữ liệu được lưu cũng nếu không có ai dùng (ví dụ cho thư viện chuyển động và vật liệu)" +msgstr "Đảm bảo khối dữ liệu được lưu giữ ngay cả khi không dùng đến (ví dụ: đối với các thư viện về cử chỉ và nguyên vật liệu)" msgid "Clear Fake User" -msgstr "Xóa Người Dùng Giả Bộ" +msgstr "Xóa Người Dùng Giả" msgid "Rename" @@ -64522,12 +70734,16 @@ msgstr "Đổi Tên" msgctxt "Operator" msgid "Outliner ID Data Paste" -msgstr "Mục Lục - Dán Dữ Liệu ID" +msgstr "Mục lục - Dán Dữ Liệu ID" + + +msgid "Paste data-blocks from the internal clipboard" +msgstr "Dán khối dữ liệu từ bảng nhớ tạm nội bộ vào" msgctxt "Operator" msgid "Outliner ID Data Remap" -msgstr "Mục Lục - Ánh Xạ Lại Dữ Liệu ID" +msgstr "Mục lục - Đổi ánh xạ về dữ liệu ID" msgid "New ID" @@ -64535,7 +70751,7 @@ msgstr "ID Mới" msgid "New ID to remap all selected IDs' users to" -msgstr "Ánh xạ lại hết ID người dùng được chọn đến ID mới này" +msgstr "ID mới để ánh xạ sang toàn bộ các ID của người dùng đã chọn" msgid "Old ID" @@ -64547,11 +70763,11 @@ msgstr "ID cũ để thay thế" msgid "Extend selection for activation" -msgstr "Mở rộng sự lựa chọn cho làm hoạt động" +msgstr "Mở rộng vùng chọn để kích hoạt" msgid "Select a range from active element" -msgstr "Chọn một phạm vi từ phần tử hoạt động" +msgstr "Chọn một khoảng từ phần tử đang hoạt động" msgctxt "Operator" @@ -64560,7 +70776,7 @@ msgstr "Kéo và Thả" msgid "Drag and drop element to another place" -msgstr "Kéo và thả phần tử đến một chỗ khác" +msgstr "Kéo và thả phần tử sang một chỗ khác" msgctxt "Operator" @@ -64569,11 +70785,11 @@ msgstr "Mở/Đóng" msgid "Toggle whether item under cursor is enabled or closed" -msgstr "Bật/tắt mặt hàng ở dưới con trỏ được mở hay đóng" +msgstr "Lật đảo trạng thái của phần tử nằm dưới con trỏ là hoạt động hay đóng lại" msgid "Close or open all items" -msgstr "Mở hay đóng hết mặt hàng" +msgstr "Mở hoặc đóng toàn bộ các phần tử" msgctxt "Operator" @@ -64582,33 +70798,33 @@ msgstr "Đổi Tên" msgid "Rename the active element" -msgstr "Đổi tên phần tử hoạt động" +msgstr "Đổi tên phần tử đang hoạt động" msgid "Use Active" -msgstr "Dùng Hoạt Động" +msgstr "Dùng Cái đang Hoạt Động" msgid "Rename the active item, rather than the one the mouse is over" -msgstr "Đổi tên của mặt hàng hoạt động, thay mặt hàng ở phía dưới chuột" +msgstr "Đổi tên phần tử đang hoạt động, thay vì phần tử nằm dưới chuột" msgctxt "Operator" msgid "Keying Set Add Selected" -msgstr "Sưu Tập Mẫu - Thêm Được Chọn" +msgstr "Bộ Hình Mẫu - Thêm cái được Chọn" msgid "Add selected items (blue-gray rows) to active Keying Set" -msgstr "Thêm mặt hàng được chọn (hàng màu xanh xấm) vào Tập Mẫu Dạng" +msgstr "Thêm các phần tử được chọn (các hàng màu lam xám) vào Bộ Hình Mẫu đang hoạt động" msgctxt "Operator" msgid "Keying Set Remove Selected" -msgstr "Tập Mẫu DẠng - Xóa Được Chọn" +msgstr "Bộ Hình Mẫu - Xóa cái được Chọn" msgid "Remove selected items (blue-gray rows) from active Keying Set" -msgstr "Xóa mặt hàng được chọn (hàng màu xanh xấm) từ Tập Mẫu Dạng" +msgstr "Xóa các phần tử được chọn (các hàng màu lam xám) khỏi Bộ Hình Mẫu đang hoạt động" msgctxt "Operator" @@ -64620,66 +70836,74 @@ msgid "Library Operation" msgstr "Thao Tác Thư Viện" +msgid "" +"Delete this library and all its items.\n" +"Warning: No undo" +msgstr "" +"Xóa thư viện này và toàn bộ các phần tử của nó.\n" +"Cảnh báo: Không thể hoàn tác (hủy bước) được" + + msgid "Relocate" -msgstr "Di Chuyển" +msgstr "Tái Định Vị" msgid "Select a new path for this library, and reload all its data" -msgstr "Chọn một đường dẫn mới cho thư viện này và nhập lại hết dữ liệu của nó" +msgstr "Chọn một đường dẫn mới cho thư viện này và tái nạp toàn bộ các dữ liệu của nó" msgid "Reload" -msgstr "Nhập Lại" +msgstr "Tái Nạp" msgid "Reload all data from this library" -msgstr "Nhập lại hết dữ liệu từ thư viện này" +msgstr "Tái nạp toàn bộ các dữ liệu từ thư viện này" msgctxt "Operator" msgid "Relocate Library" -msgstr "Đổi Chỗ Thư Viện" +msgstr "Tái Định Vị Thư Viện" msgid "Relocate the library under cursor" -msgstr "Đổi chỗ thư viện ở dưới con trỏ" +msgstr "Tái định vị thư viện nằm dưới con trỏ" msgctxt "Operator" msgid "Outliner Library Override Operation" -msgstr "Mục Lục - Thao Tác Vượt Quyền Thư Viện" +msgstr "Mục Lục Thao tác Vượt Quyền Thư Viện" msgid "Create, reset or clear library override hierarchies" -msgstr "Chế tạo, đặt lại hay xóa những tầng bậc vượt quyền của thư viện" +msgstr "Kiến Tạo, hoàn lại hoặc xóa cấu trúc thứ bậc vượt quyền thư viện" msgid "Selection Set" -msgstr "Tập Hợp Sự Lựa Chọn" +msgstr "Bộ Lựa Chọn" msgid "Over which part of the tree items to apply the operation" -msgstr "Áp dụng thao tác trên phần nào của mặt hàng cây" +msgstr "Phần nào của các mục trong cây để áp dụng thao tác đây" msgid "Apply the operation over selected data-blocks only" -msgstr "Áp dụng thao tác chỉ trên các cục dữ liệu được chọn" +msgstr "Chỉ áp dụng thao tác trên các khối dữ liệu đã chọn mà thôi" msgid "Content" -msgstr "Nội Dung" +msgstr "Nội dung" msgid "Apply the operation over content of the selected items only (the data-blocks in their sub-tree)" -msgstr "Áp dụng thao tác chỉ trên nội dung của các mặt hàng được chọn (các cục dữ liệu trong hạ cây của chúng nó)" +msgstr "Chỉ áp dụng thao tác trên nội dung của các mục đã chọn mà thôi (các khối dữ liệu trong chi nhánh cây của chúng)" msgid "Selected & Content" -msgstr "Được Chọn & Nội Dung" +msgstr "Cái Đã Chọn & Nội dung" msgid "Apply the operation over selected data-blocks and all their dependencies" -msgstr "Áp dụng thao tác trên các cục dữ liệu được chọn và hết phụ thuộc của nó" +msgstr "Áp dụng thao tác trên các khối dữ liệu đã chọn và toàn bộ các phần phụ thuộc của chúng" msgid "Library Override Operation" @@ -64687,120 +70911,120 @@ msgstr "Thao Tác Vượt Quyền Thư Viện" msgid "Make" -msgstr "Làm" +msgstr "Tạo" msgid "Create a local override of the selected linked data-blocks, and their hierarchy of dependencies" -msgstr "Làm một đồ vượt quyền địa phương của các cục dữ liệu được liên kết, và tầng bậc phụ thuộc của chúng nó" +msgstr "Kiến Tạo vượt quyền cục bộ các khối dữ liệu liên kết đã chọn và tầng lớp thứ bậc các phụ thuộc của chúng" msgid "Reset" -msgstr "Đặt Lại" +msgstr "Hoàn Lại" msgctxt "Operator" msgid "Outliner Library Override Troubleshoot Operation" -msgstr "Thao Tác Tìm Lỗi Lầm Của Đồ Vược Quyền Thư Viện Cho Mục Lục" +msgstr "Mục Lục Thao Tác Khắc Phục Sự Cố Vượt Quyền Thư Viện" msgid "Advanced operations over library override to help fix broken hierarchies" -msgstr "Thao tác cấp cao trên đồ vượt quyền thư viện choo giúp sửa tầng bậc hư" +msgstr "Những thao tác tân tiến đối với vượt quyền thư viện để giúp sửa các cấu trúc thứ bậc bị hỏng" msgid "Library Override Troubleshoot Operation" -msgstr "Thao Tác Tìm Lỗi Lầm Của Vượt Quyền Thư Viện" +msgstr "Thao Tác Khắc Phục Sự Cố Vượt Quyền Thư Viện" msgid "Resync" -msgstr "Đồng Bộ Lại" +msgstr "Tái Đồng Bộ Hóa" msgid "Rebuild the selected local overrides from their linked references, as well as their hierarchies of dependencies" -msgstr "Xây dựng lại các đồ vượt quyền địa phương được chọn từ những tham chiếu được liên kết, và tầng bậc phụ thuộc của nó" +msgstr "Xây dựng lại các vượt quyền cục bộ đã chọn từ các tham chiếu liên kết của chúng, cũng như phân cấp thứ bậc phụ thuộc của chúng" msgid "Resync Enforce" -msgstr "Bắt Buộc Đồng Bộ Lại" +msgstr "Bắt Buộc Tái Đồng Bộ Hóa" msgid "Rebuild the selected local overrides from their linked references, as well as their hierarchies of dependencies, enforcing these hierarchies to match the linked data (i.e. ignoring existing overrides on data-blocks pointer properties)" -msgstr "Xây dựng lại đồ vượt quyền địa phương được chọn từ tham chiếu được liên kết, và tầng bậc phụ thuộc của nó, bắt buộc tầng bậc đó có dữ lệu giống dữ liệu được liên kết (ví dụ không quan tâm đồ vượt quyền hiện tại của đặc tính của con trỏ cục dữ liệu)" +msgstr "Xây dựng lại các vượt quyền cục bộ đã chọn từ các tham chiếu liên kết của chúng, cũng như phân cấp thức bậc phụ thuộc của chúng, thực thi các phân cấp thứ bậc này để khớp với dữ liệu liên kết (tức là bỏ qua các vượt quyền hiện có trên các tính chất con trỏ khối dữ liệu)" msgid "Delete the selected local overrides (including their hierarchies of override dependencies) and relink their usages to the linked data-blocks" -msgstr "Xóa cái đồ vượt quyền địa phương được chọn (gồm tầng bậc phụ thuộc của đồ vượt quyền của nó) và kết nối lại sử dụng của nó đến các cục dữ liệu được kết nối" +msgstr "Xóa các vượt quyền cục bộ đã chọn (bao gồm cả phân cấp thứ bậc của các phần phụ thuộc vượt quyền của chúng) và liên kết lại mức sử dụng của chúng với các khối dữ liệu liên kết" msgctxt "Operator" msgid "Drop Material on Object" -msgstr "Thả Vật Liệu Trên Vật Thể" +msgstr "Thả Nguyên Vật Liệu lên Đối Tượng" msgid "Drag material to object in Outliner" -msgstr "Kéo vật liệu đến vật thể trong Mục Lục" +msgstr "Kéo nguyên vật liệu vào đối tượng trong Mục Lục" msgctxt "Operator" msgid "Outliner Modifier Operation" -msgstr "Mục Lục - Sửa Đổi Thao Tác" +msgstr "Mục Lục - Thao Tác Bộ Điều Chỉnh" msgid "Modifier Operation" -msgstr "Thao Tác Sửa Đổi" +msgstr "Thao Tác Bộ Điều Chỉnh" msgid "Toggle Viewport Use" -msgstr "Bật/tắt Dùng Màn chiếu" +msgstr "Bật/Tắt Sử Dụng Trong Cổng Nhìn" msgid "Toggle Render Use" -msgstr "Bật/tắt Dùng Kết Xuất" +msgstr "Bật/Tắt Sử Dụng Kết Xuất" msgctxt "Operator" msgid "Outliner Object Operation" -msgstr "Thao Tác Vật Thể Mục Lục" +msgstr "Mục Lục - Thao Tác Đối Tượng" msgid "Object Operation" -msgstr "Thao Tác Vật Thể" +msgstr "Thao Tác Đối Tượng" msgid "Select Hierarchy" -msgstr "Chọn Tầng Bậc" +msgstr "Chọn Thứ Bậc" msgid "Make all users of selected data-blocks to use instead a new chosen one" -msgstr "Bắt hết người dùng của các cục dữ liệu được chọn dùng một cục dữ liệu mới được chọn" +msgstr "Bắt toàn bộ các người dùng của các khối dữ liệu lựa chọn phải sử dụng, thay vì một cái được chọn mới" msgid "Context menu for item operations" -msgstr "Danh bạ bối cảnh cho thao tác mặt hàng" +msgstr "Trình đơn ngữ cảnh cho thao tác phần tử" msgctxt "Operator" msgid "Purge All" -msgstr "Xóa Hết" +msgstr "Thanh Lọc Toàn Bộ" msgid "Clear all orphaned data-blocks without any users from the file" -msgstr "Xóa từ tập tin hết cục dữ liệu mồ côi không có người dùng" +msgstr "Xóa toàn bộ các khối dữ liệu mổ côi, không có người dùng, khỏi tập tin" msgid "Linked Data-blocks" -msgstr "Cục Dữ Liệu Được Liên Kết" +msgstr "Khối Dữ Liệu Kết Nối" msgid "Include unused linked data-blocks into deletion" -msgstr "Kèm các cục dữ liệu " +msgstr "Bao gồm các khối dữ liệu liên kết không sử dụng đến trong quá trình xóa" msgid "Local Data-blocks" -msgstr "Cục Dữ Liệu Địa Phương" +msgstr "Khối Dữ liệu Cục bộ" msgid "Include unused local data-blocks into deletion" -msgstr "Kèm xóa các cục dữ liệu địa phương chưa được sử dụng" +msgstr "Bao gồm các khối dữ liệu cục bộ không sử dụng đến trong quá trình xóa" msgid "Recursive Delete" @@ -64808,43 +71032,43 @@ msgstr "Xóa Đệ Quy" msgid "Recursively check for indirectly unused data-blocks, ensuring that no orphaned data-blocks remain after execution" -msgstr "Tìm kiểu đệ quy " +msgstr "Kiểm tra đệ quy các khối dữ liệu gián tiếp chưa sử dụng, đảm bảo rằng không có khối dữ liệu mồ côi nào còn lại sau khi thi hành cả" msgctxt "Operator" msgid "Drop to Clear Parent (hold Alt to keep transforms)" -msgstr "Thả để Xóa Phụ Huynh (bấm Alt cho giữ các biến hóa)" +msgstr "Thả để Xóa Phụ Huynh (ấn giữ Alt để duy trì các biến hóa)" msgid "Drag to clear parent in Outliner" -msgstr "Kéo cho xóa phụ huynh trong Mục Lục" +msgstr "Kéo rê để xóa phụ huynh trong Mục Lục" msgctxt "Operator" msgid "Drop to Set Parent (hold Alt to keep transforms)" -msgstr "Thả để Đặt Phụ Huynh (bấm Alt cho giữ các biến hóa)" +msgstr "Thả để Đặt Phụ Huynh (ấn giữ Alt để duy trì các biến hóa)" msgid "Drag to parent in Outliner" -msgstr "Kéo đến phụ huynh trong Mục Lục" +msgstr "Kéo vào phụ huynh trong Mục Lục" msgctxt "Operator" msgid "Drop Object to Scene" -msgstr "Thả Xuống Vặt Thể Vào Cảnh" +msgstr "Thả Đối Tượng vào Cảnh" msgid "Drag object to scene in Outliner" -msgstr "Kéo vật thể vào cảnh trong Mục Lục" +msgstr "Kéo đối tượng vào cảnh trong Mục Lục" msgctxt "Operator" msgid "Outliner Scene Operation" -msgstr "Thao Tác Cảnh Mục Lục" +msgstr "Mục Lục - Thao Tác Cảnh" msgid "Context menu for scene operations" -msgstr "Danh bạ bối cảnh cho thao tác cảnh" +msgstr "Trình đơn ngữ cảnh cho các thao tác cảnh" msgid "Scene Operation" @@ -64857,7 +71081,7 @@ msgstr "Cuộn Trang" msgid "Scroll page up or down" -msgstr "Cuộn trang lên hay xuống" +msgstr "Cuộn trang lên hoặc xuống" msgid "Scroll up one page" @@ -64866,110 +71090,110 @@ msgstr "Cuộn lên một trang" msgctxt "Operator" msgid "Toggle Selected" -msgstr "Chọn/Thả Được Chọn" +msgstr "Đảo Lật Trạng Thái được Chọn" msgid "Toggle the Outliner selection of items" -msgstr "Chọn/thả mặt hàng trong Mục Lục" +msgstr "Đảo lật lựa chọn các phần tử trong Bảng Mục Lục" msgid "Use box selection to select tree elements" -msgstr "Dùng sự lựa chọn hộp để chọn phần tử cây" +msgstr "Dùng lựa chọn hình hộp để chọn các phần tử của cây" msgid "Tweak gesture from empty space for box selection" -msgstr "Chỉnh " +msgstr "Tinh chỉnh cử chỉ từ không gian trống cho việc lựa chọn khoanh vùng hình hộp" msgctxt "Operator" msgid "Walk Select" -msgstr "Chọn Đi Bộ" +msgstr "Lựa Chọn theo lối Đi Bộ" msgid "Use walk navigation to select tree elements" -msgstr "Dùng sự lựa chọn chuyển hướng đi bộ để chọn phần tử cây" +msgstr "Sử dụng động tác đi bộ để lựa chọn các phần tử của cây" msgid "Extend selection on walk" -msgstr "Mở rộng sự lựa chọn khi đi bộ" +msgstr "Nới rộng vùng lựa chọn bằng phương pháp đi bộ" msgid "Toggle All" -msgstr "Bật/Tắt Hết" +msgstr "Bật/Tắt Toàn Bộ" msgid "Toggle open/close hierarchy" -msgstr "Bật/tắt mở/đóng tầng bậc" +msgstr "Bật/Tắt trạng thái đóng/mở của cây thứ bậc" msgctxt "Operator" msgid "Show Active" -msgstr "Hiện Hoạt Động" +msgstr "Hiển Thị cái đang Hoạt Động" msgid "Open up the tree and adjust the view so that the active object is shown centered" -msgstr "Mở rộng cây và chỉnh màn cho hiển thị vật thể hoạt động ngay giữa" +msgstr "Mở rộng cây và điều chỉnh góc nhìn để đối tượng đang hoạt động được biểu hiện là nằm ở trung tâm" msgctxt "Operator" msgid "Show Hierarchy" -msgstr "Hiện Tầng Bậc" +msgstr "Hiển Thị Thứ Bậc" msgid "Open all object entries and close all others" -msgstr "Mở hết mục vật thể và đóng tất cả khác" +msgstr "Mở toàn bộ các mục đối tượng được và đóng toàn bộ các khác" msgctxt "Operator" msgid "Show/Hide One Level" -msgstr "Hiện/Ẩn Một Tầng" +msgstr "Hiện/Ẩn Giấu Một Tầng" msgid "Expand/collapse all entries by one level" -msgstr "Mở rộng/tóp hết mục một tầng" +msgstr "Mở rộng/thu toàn bộ các mục lại, chỉ một tầng thôi" msgid "Expand all entries one level deep" -msgstr "Mở rộng hết mục một tầng sâu" +msgstr "Mở rộng toàn bộ các mục, sâu một tầng" msgctxt "Operator" msgid "Unhide All" -msgstr "Hiện Hết" +msgstr "Hiện Toàn Bộ" msgid "Unhide all objects and collections" -msgstr "Hiện hết vật thể trong sưu tập" +msgstr "Hiện(Không ẩn giấu) toàn bộ các đối tượng trong bộ sưu tập" msgctxt "Operator" msgid "Add New Paint Curve Point" -msgstr "Thêm Điểm Đường Cong Sơn Mới" +msgstr "Thêm Điểm Mới trên Đường Cong Sơn" msgid "Add New Paint Curve Point" -msgstr "Thêm Điểm Đường Cong Sơn Mới" +msgstr "Thêm Điểm Mới trên Đường Cong Sơn" msgid "Location of vertex in area space" -msgstr "Vị trí của đỉnh trong không gian khu vực" +msgstr "Vị trí của điểm đỉnh trong không gian khu vực" msgctxt "Operator" msgid "Add Curve Point and Slide" -msgstr "Thêm Điểm Đường Cong Và Trượt" +msgstr "Thêm Điểm trên Đường Cong và Trượt Đẩy" msgid "Add new curve point and slide it" -msgstr "Thêm điểm đường cong mới và trượt nó" +msgstr "Thêm điểm mới trên đường cong và trượt đẩy nó" msgid "Slide Paint Curve Point" -msgstr "Trượt Điểm Đường Cong Sơn" +msgstr "Trượt Đẩy Điểm trên Đường Cong Sơn" msgid "Select and slide paint curve point" -msgstr "Chọn và trượt điểm đường cong sơn" +msgstr "Chọn và trượt đẩy điểm trên đường cong sơn" msgctxt "Operator" @@ -64983,11 +71207,11 @@ msgstr "Đặt con trỏ" msgctxt "Operator" msgid "Remove Paint Curve Point" -msgstr "Xóa Điểm Đường Cong Sơn" +msgstr "Xóa Điểm trên Đường Cong Sơn" msgid "Remove Paint Curve Point" -msgstr "Xóa Điểm Đường Cong Sơn" +msgstr "Xóa Điểm trên Đường Cong Sơn" msgid "Draw curve" @@ -65005,32 +71229,32 @@ msgstr "Thêm đường cong sơn mới" msgctxt "Operator" msgid "Select Paint Curve Point" -msgstr "Chọn Điểm Đường Cong Sơn" +msgstr "Chọn Điểm trên Đường Cong Sơn" msgid "Select a paint curve point" -msgstr "Chọn một điểm đường cong sơn" +msgstr "Chọn một điểm trên đường cong sơn" msgid "(De)select all" -msgstr "Chọn/thả hết" +msgstr "Chọn/Hủy chọn toàn bộ" msgctxt "Operator" msgid "Slide Paint Curve Point" -msgstr "Trượt Điểm Đường Cong Sơn" +msgstr "Trượt Đẩy Điểm trên Đường Cong Sơn" msgid "Align Handles" -msgstr "Sắp Xếp Tay Cầm" +msgstr "Sắp Hàng Tay Cầm" msgid "Aligns opposite point handle during transform" -msgstr "Sắp xếp điểm tay cầm đối diện khi biến hóa" +msgstr "Sắp hàng điểm tay cầm đối diện trong khi biến hóa" msgid "Attempt to select a point handle before transform" -msgstr "Thử chọn một điểm tay cầm trước biến hóa" +msgstr "Thử chọn một điểm tay cầm trước khi biến hóa" msgctxt "Operator" @@ -65038,6 +71262,10 @@ msgid "Add Simple UVs" msgstr "Thêm UV Đơn Giản" +msgid "Add cube map UVs on mesh" +msgstr "Thêm ánh xạ UV khối lập phương trên khung lưới" + + msgctxt "Operator" msgid "Add Paint Slot" msgstr "Thêm Khe Sơn" @@ -65048,175 +71276,212 @@ msgstr "Thêm một khe sơn" msgid "Name for new paint slot source" -msgstr "Tên cho nguồn của khe sơn mới" +msgstr "Tên cho nguồn khe sơn mới" msgid "Slot Type" -msgstr "Loại Khe" +msgstr "Thể Loại Khe" msgid "Type of new paint slot" -msgstr "Lọai của khe sơn mới" +msgstr "Thể loại khe sơn mới" msgid "Material Layer Type" -msgstr "Loại Lớp Vật Liệu" +msgstr "Thể Loại Tầng Lớp Nguyên Vật Liệu" msgid "Material layer type of new paint slot" -msgstr "Loại lớp vật liệu của khe sơn mới" +msgstr "Thể loại tầng lớp nguyên vật liệu của khe sơn mới" + + +msgid "Specular IOR Level" +msgstr "Mức Chỉ Số Khúc Xạ của Ánh Lóng Lánh" msgctxt "Operator" msgid "Swap Colors" -msgstr "Trao Đổi Màu" +msgstr "Đổi Màu" msgid "Swap primary and secondary brush colors" -msgstr "Trao đổi màu chánh và phụ của bút" +msgstr "Đổi màu chính và màu phụ của bút" msgctxt "Operator" msgid "Brush Select" -msgstr "Chọn Bút" +msgstr "Chọn Đầu Bút" msgid "Select a paint mode's brush by tool type" -msgstr "Chọn một chế độ bút sơn bằng loại dụng cụ" +msgstr "Chọn đầu bút ở chế độ sơn bằng thể loại công cụ" msgid "Create Missing" -msgstr "Chế Tạo Thiếu" +msgstr "Kiến Tạo những cái Chưa Có" msgid "If the requested brush type does not exist, create a new brush" -msgstr "Nếu không có loại bút yêu cầu, chế tạo một bút mới" +msgstr "Nếu loại đầu bút yêu cầu không tồn tại thì kiến tạo một đầu bút mới" msgid "Paint Selection" -msgstr "Sự Lựa Chọn Điểm" +msgstr "Lựa Chọn Sơn" msgid "Comb" -msgstr "Lược" +msgstr "Chải bằng Lược" + + +msgid "Grow / Shrink" +msgstr "Tăng Trưởng / Thu Nhỏ" msgid "Puff" -msgstr "Sưng" +msgstr "Làm Bồng Lên" msgid "Clone" -msgstr "Chép Lại" +msgstr "Rập Khuôn" msgid "Toggle between two brushes rather than cycling" -msgstr "Đổi giữa hai bút thay thế chu trình vòng" +msgstr "Đảo lật giữa hai đầu bút, thay vì luân chuyển tuần hoàn" msgid "Change selection for all faces" -msgstr "Đổi sự ựa chọn cho tất cả mặt" +msgstr "Đổi lựa chọn cho toàn bộ các mặt" msgctxt "Operator" msgid "Face Select Hide" -msgstr "Ẳn Mặt Chọn" +msgstr "Ẩn Giấu Mặt Lựa Chọn" msgid "Hide selected faces" -msgstr "Ẩn mặt được chọn" +msgstr "Ẩn giấu các mặt được chọn" + + +msgid "Deselect Faces connected to existing selection" +msgstr "Hủy Chọn các Mặt kết nối với lựa chọn hiện tại" + + +msgid "Also deselect faces that only touch on a corner" +msgstr "Đồng thời hủy chọn các mặt chỉ chạm vào một góc" msgid "Select linked faces" -msgstr "Chọn mặt được liên kết" +msgstr "Chọn các mặt kết nối với nhau" msgctxt "Operator" msgid "Select Linked Pick" -msgstr "Chọn Mặt Được Liên Kết" +msgstr "Chọn Kết Nối Tuyển Lựa" msgid "Select linked faces under the cursor" -msgstr "Chọn mặt được liên kết ở dưới con trỏ" +msgstr "Chọn các mặt kết nối với nhau nằm dưới con trỏ" + + +msgctxt "Operator" +msgid "Select Loop" +msgstr "Chọn Vòng Mạch" + + +msgid "Select face loop under the cursor" +msgstr "Chọn vòng mạch mặt nằm dưới con trỏ" + + +msgid "If false, faces will be deselected" +msgstr "Nếu là sai (false) thì các mặt sẽ bị hủy chọn" + + +msgid "Select Faces connected to existing selection" +msgstr "Chọn các Mặt kết nối với lựa chọn hiện tại" + + +msgid "Also select faces that only touch on a corner" +msgstr "Đồng thời chọn các mặt chỉ chạm vào một góc" msgctxt "Operator" msgid "Reveal Faces/Vertices" -msgstr "Hiện Mặt/Đỉnh" +msgstr "Tiết Lộ các Mặt / Điểm Đỉnh" msgid "Reveal hidden faces and vertices" -msgstr "Hiện các mặt và đỉnh đã ẩn" +msgstr "Tiết lộ các mặt và các điểm đỉnh UV ẩn khuất" msgid "Specifies whether the newly revealed geometry should be selected" -msgstr "Chỉ định hình dạng mới được hiện sẽ được chọn hay không" +msgstr "Xác định xem có nên chọn hình dạng mới được tiết lộ hay không" msgctxt "Operator" msgid "Grab Clone" -msgstr "Bắt Bản Sao" +msgstr "Nắm Bản Rập Khuôn" msgid "Move the clone source image" -msgstr "Di chuyển ảnh nguồn bản sau" +msgstr "Di chuyển hình ảnh nguồn rập khuôn" msgid "Delta offset of clone image in 0.0 to 1.0 coordinates" -msgstr "Lệch lạc dịch của ảnh bản sao trong tọa độ 0.0 đến 1.0" +msgstr "Dịch chuyển delta của hình ảnh rập khuôn trong khoảng tọa độ 0,0 đến 1,0" msgctxt "Operator" msgid "Hide/Show" -msgstr "Ẩn/Hiện" +msgstr "Ẩn Giấu/Hiện" msgid "Hide/show some vertices" -msgstr "Ẩn/hiện vài đỉnh" +msgstr "Ẩn giấu/hiển thị một số điểm đỉnh" msgid "Whether to hide or show vertices" -msgstr "Nên ẩn hay hiện đỉnh" +msgstr "Ẩn giấu hay hiển thị các điểm đỉnh" msgid "Hide vertices" -msgstr "Ẩn đỉnh" +msgstr "Ẩn giấu các điểm đỉnh" msgid "Show vertices" -msgstr "Hiện đỉnh" +msgstr "Hiển thị các điểm đỉnh" msgid "Which vertices to hide or show" -msgstr "Đỉnh nào cho ẩn hay hiện" +msgstr "Những điểm đỉnh nào sẽ được ẩn giấu, hoặc được hiển thị" msgid "Hide or show vertices outside the selection" -msgstr "Ẩn hay hiện đỉnh ở ngoài sự lựa chọn" +msgstr "Ẩn giấu hoặc hiển thị các điểm đỉnh ở ngoài vùng lựa chọn" msgid "Hide or show vertices inside the selection" -msgstr "Ẩn hay hiện đỉnh trong sự lựa chọn" +msgstr "Ẩn giấu hoặc hiển thị các điểm đỉnh nội trong vùng lựa chọn" msgid "Hide or show all vertices" -msgstr "Ẩn hay hiện tất cả đỉnh" +msgstr "Ẩn giấu hoặc hiển thị toàn bộ các điểm đỉnh" msgid "Masked" -msgstr "Được Mặt Nạ" +msgstr "Bị Che Chắn" msgid "Hide or show vertices that are masked (minimum mask value of 0.5)" -msgstr "Ẩn hay hiện đỉnh được mặt nạ che (giá trị mặt nạ tối thiểu là 0.5)" +msgstr "Ẩn giấu hoặc hiển thị các điểm đỉnh bị che chắn (giá trị màn chắn lọc tối thiểu 0.5)" msgctxt "Operator" msgid "Image from View" -msgstr "Ảnh Từ Màn" +msgstr "Hình Ảnh từ Khung Nhìn" msgid "Make an image from biggest 3D view for reprojection" -msgstr "Chế tạo một ảnh từ màn hìn 3D lớn nhất để chiếu lại" +msgstr "Tạo một hình ảnh từ góc nhìn 3D lớn nhất để tái phóng chiếu" msgid "Name of the file" @@ -65225,24 +71490,24 @@ msgstr "Tên của tập tin" msgctxt "Operator" msgid "Image Paint" -msgstr "Sơn Ảnh" +msgstr "Sơn Hình Ảnh" msgid "Paint a stroke into the image" -msgstr "Sơn một nét trên ảnh" +msgstr "Sơn một nét vào hình ảnh" msgctxt "Operator" msgid "Mask Box Gesture" -msgstr "Cử Chỉ Hộp Mặt Nạ" +msgstr "Tạo Màn Chắn Lọc dùng Cử Chỉ Hình Hộp" msgid "Add mask within the box as you move the brush" -msgstr "Thêm mặt nạ trong hộp khi di chuyển bút" +msgstr "Thêm màn chắn lọc nội trong hình hộp trong khi bạn di chuyển đầu bút" msgid "Set mask to the level specified by the 'value' property" -msgstr "Đặt mặt nạ theo mức độ được xác định trong đặc tính 'giá trị'" +msgstr "Đặt màn chắn lọc theo mức độ xác định trong tính chất 'giá trị'" msgid "Value Inverted" @@ -65250,83 +71515,83 @@ msgstr "Giá Trị Đảo Nghịch" msgid "Set mask to the level specified by the inverted 'value' property" -msgstr "Đặt mặt nạ theo mức độ được xác định trong đặc tính 'giá trị'" +msgstr "Đặt màn chắn lọc theo mức độ xác định trong tính chất 'giá trị' đảo nghịch" msgid "Invert the mask" -msgstr "Đảo Nghịch Mặt Nạ" +msgstr "Đảo nghịch màn chắn lọc" msgid "Front Faces Only" -msgstr "Chỉ Mặt Phía Trước" +msgstr "Duy các Mặt Trước" msgid "Affect only faces facing towards the view" -msgstr "Chỉ ảnh hưởng các mặt chỉ đến màn chiếu" +msgstr "Duy ảnh hưởng các mặt hướng về phía góc nhìn" msgid "Limit to Segment" -msgstr "Hạn Chế Ở Trong Khúc" +msgstr "Giới Hạn trong Phân đoạn" msgid "Apply the gesture action only to the area that is contained within the segment without extending its effect to the entire line" -msgstr "Áp dụng hành động cử chỉ trong khu vực được chứa trong khúc và không kéo ra sự ảnh hưởng đến toàn đường" +msgstr "Duy áp dụng cử chỉ gợi ý vào khu vực nằm nội trong phân đoạn mà thôi, không cho phép tác động của nó lan toả tới toàn thể dòng" msgid "Mask level to use when mode is 'Value'; zero means no masking and one is fully masked" -msgstr "Dùng mức độ mặc nạ khi chế độ = 'Giá Trị'; 0.0 nghĩa là không dùng mặt nạ và 1.0 là dùng mức độ toàn bộ" +msgstr "Mức độ Màn Chắn Lọc sử dụng khi chế độ là 'Giá Trị'; 0.0 nghĩa là không chắn lọc và 1.0 là chắn lọc ở mức độ cao nhất" msgctxt "Operator" msgid "Mask Flood Fill" -msgstr "Tô Tràn Mặt Nạ" +msgstr "Phủ Tràn Màn Chắn Lọc" msgid "Fill the whole mask with a given value, or invert its values" -msgstr "Tô tràn đầy mặt nạ với một giá trị tùy chọn, hay đảo nghịch giá trị của nó" +msgstr "Tô phủ màn chắn lọc với một giá trị cho trước, hoặc đảo nghịch giá trị của nó" msgctxt "Operator" msgid "Mask Lasso Gesture" -msgstr "Mặt Nạ Động Tắc Dây Trói" +msgstr "Tạo Màn Chắn Lọc dùng Cử Chỉ Dây Thòng Lọng" msgid "Add mask within the lasso as you move the brush" -msgstr "Kèm mặt nạ ở trong dây trói khi bạn di chuyển bút" +msgstr "Thêm màn chắn lọc nội trong vòng dây thòng lọng trong khi bạn di chuyển đầu bút" msgctxt "Operator" msgid "Mask Line Gesture" -msgstr "Cử Chỉ Đường Mặt Nạ" +msgstr "Tạo Màn Chắn Lọc dùng Cử Chỉ Đường Thẳng" msgid "Add mask to the right of a line as you move the brush" -msgstr "Thêm mặt nạ bên phải của một đường khi di chuyển bút" +msgstr "Thêm màn chắn lọc ở bên phải đường thẳng trong khi bạn di chuyển đầu bút" msgctxt "Operator" msgid "Project Image" -msgstr "Phép Chiếu Ảnh" +msgstr "Phóng Chiếu Hình Ảnh" msgid "Project an edited render from the active camera back onto the object" -msgstr "Chiếu lại một ảnh kết xuất được biên tập từ máy quay phim hoạt động trên vật thể" +msgstr "Phóng chiếu một bản kết xuất đã biên soạn từ máy quay phim đang hoạt động lên đối tượng" msgid "Use the mouse to sample a color in the image" -msgstr "Dùng chuột để lấy mẫu vật màu trong ảnh" +msgstr "Dùng chuột để lấy mẫu vật một màu sắc trong hình ảnh" msgid "Sample Merged" -msgstr "Gồm Mẫu Vật" +msgstr "Lấy Mẫu Vật cái đã Hợp Nhất" msgid "Sample the output display color" -msgstr "Lấy mẫu vật từ màu màn chiếu ngõ ra" +msgstr "Lấy mẫu vật màu sắc hiển thị ở đầu ra (màn hình)" msgid "Add to Palette" -msgstr "Thêm Vao Bảng Màu" +msgstr "Thêm vào Bảng Pha Màu" msgctxt "Operator" @@ -65335,276 +71600,314 @@ msgstr "Bật/Tắt Sơn Chất Liệu" msgid "Toggle texture paint mode in 3D view" -msgstr "Bật/tắt chế độ sơn chất liệu trong màn 3D" +msgstr "Bật/Tắt chế độ sơn chất liệu trong khung nhìn 3D" msgid "Change selection for all vertices" -msgstr "Đổi sự lựa chọn cho tất cả đỉnh" +msgstr "Đổi sự lựa chọn cho toàn bộ các điểm đỉnh" msgctxt "Operator" msgid "Vertex Select Hide" -msgstr "Ẩn Đỉnh Chọn" +msgstr "Ẩn Giấu Điểm Đỉnh Lựa Chọn" msgid "Hide selected vertices" -msgstr "Ẩn các đỉnh được chọn" +msgstr "Ẩn giấu các điểm đỉnh đã chọn" msgid "Hide unselected rather than selected vertices" -msgstr "Ẩn các đỉnh chưa chọn thay đường cong được chọn" +msgstr "Ẩn giấu cái chưa được chọn, thay vì các điểm đỉnh đã chọn" + + +msgid "Deselect Vertices connected to existing selection" +msgstr "Chọn các Điểm Đỉnh kết nối với lựa chọn hiện tại" + + +msgctxt "Operator" +msgid "Select Linked Vertices" +msgstr "Chọn các Điểm Đỉnh Kết Nối" + + +msgid "Select linked vertices" +msgstr "Chọn các điểm đỉnh kết nối" + + +msgctxt "Operator" +msgid "Select Linked Vertices Pick" +msgstr "Chọn các Điểm Đỉnh Kết Nối Tuyển Lựa" + + +msgid "Select linked vertices under the cursor" +msgstr "Chọn các điểm đỉnh kết nối nằm dưới chuột" + + +msgid "Whether to select or deselect linked vertices under the cursor" +msgstr "Chọn hoặc hủy chọn các điểm đỉnh liên kết nằm dưới con trỏ" + + +msgid "Select Vertices connected to existing selection" +msgstr "Chọn các Điểm Đỉnh kết nối với lựa chọn hiện tại" msgctxt "Operator" msgid "Dirty Vertex Colors" -msgstr "Màu Đỉnh Dơ" +msgstr "Màu Điểm Đỉnh Kẽ Bẩn" msgid "Generate a dirt map gradient based on cavity" -msgstr "Chế tạo một chuyển sắc bản đồ đất tùy " +msgstr "Sinh tạo một dốc màu ánh xạ bụi bẩn dựa trên hố hốc" msgid "Blur Iterations" -msgstr "Lặp Lại Mờ Hóa" +msgstr "Số Lần Làm Nhòe Mờ" msgid "Number of times to blur the colors (higher blurs more)" -msgstr "Số lần làm mờ màu (giá trị cao hơn làm mờ nhiều hơn)" +msgstr "Số lần làm nhòe mờ các màu (giá trị cao hơn thì càng làm nhòe mờ nhiều hơn)" msgid "Blur Strength" -msgstr "Sức Mờ Hóa" +msgstr "Cường Độ Làm Nhòe Mờ" msgid "Blur strength per iteration" -msgstr "Sức mờ hóa mỗi lặp lại" +msgstr "Cường độ Làm Nhòe Mờ ở mỗi lần lặp lại" msgid "Highlight Angle" -msgstr "Góc Nổi Bật" +msgstr "Góc Độ Nêu Bật" msgid "Less than 90 limits the angle used in the tonal range" -msgstr "Góc ít hơn 90 độ được hạn chế góc được dùng trong phạm vi xám" +msgstr "Nếu ít hơn giới hạn 90 độ thì góc được sử dụng trong phạm vi sắc thái" msgid "Dirt Angle" -msgstr "Góc Dơ" +msgstr "Góc Độ Kẽ Bẩn" msgid "Dirt Only" -msgstr "Chỉ Dơ" +msgstr "Duy Kẽ Bẩn" msgid "Don't calculate cleans for convex areas" -msgstr "Không tính làm sạch cho khu vực lồi" +msgstr "Không tính toán những chỗ sạch cho các khu vực lồi" msgid "Normalize the colors, increasing the contrast" -msgstr "Đơn vị hóa màu, tăng lên chênh lệch" +msgstr "Bình thường hóa các màu, gia tăng độ tương phản" msgctxt "Operator" msgid "Vertex Color from Weight" -msgstr "Màu Đỉnh từ Quyền Lượng" +msgstr "Màu Điểm Đỉnh từ Trọng Lượng" msgid "Convert active weight into gray scale vertex colors" -msgstr "Đổi quyền lượng hoạt động sang màu độ xám cho các đỉnh" +msgstr "Đổi trọng lượng đang hoạt động sang gam điểm đỉnh màu ghi" + + +msgid "Adjust vertex color Hue/Saturation/Value" +msgstr "Điều chỉnh màu điểm đỉnh Sắc Màu/Độ Bão Hòa/Giá Trị" msgctxt "Operator" msgid "Set Vertex Colors" -msgstr "Đặt Màu Đỉnh" +msgstr "Đặt Màu Điểm Đỉnh" msgid "Fill the active vertex color layer with the current paint color" -msgstr "Tô đầy lớp màu đỉnh hoạt động bằng màu sơn hiện tại" +msgstr "Tô tầng màu điểm đỉnh đang hoạt động bằng màu sơn hiện tại" + + +msgid "Set color completely opaque instead of reusing existing alpha" +msgstr "Đặt màu là hoàn toàn đục, thay vì tái sử dụng alpha hiện có" msgctxt "Operator" msgid "Smooth Vertex Colors" -msgstr "Mịn Hóa Màu Đỉnh" +msgstr "Làm Mịn Màu Điểm Đỉnh" msgid "Smooth colors across vertices" -msgstr "Mịn hóa màu qua các đỉnh" +msgstr "Làm cho màu trên các điểm đỉnh mịn màng" msgctxt "Operator" msgid "Vertex Paint" -msgstr "Sơn Đỉnh" +msgstr "Sơn Điểm Đỉnh" msgid "Paint a stroke in the active color attribute layer" -msgstr "Sơn một nét trong lớp đặc điểm màu hoạt động" +msgstr "Sơn một nét vẽ trong tầng thuộc tính màu đang hoạt động" msgctxt "Operator" msgid "Vertex Paint Mode" -msgstr "Chế Độ Sơn Đỉnh" +msgstr "Chế Độ Sơn Điểm Đỉnh" msgid "Toggle the vertex paint mode in 3D view" -msgstr "Bật/tắt chế độ sơn quyền lượng trong màn 3D" +msgstr "Bật/Tắt chế độ sơn điểm đỉnh trong khung nhìn 3D" msgctxt "Operator" msgid "Weight from Bones" -msgstr "Quyền Lượng Từ Xương" +msgstr "Trọng Lượng từ các Xương" msgid "Set the weights of the groups matching the attached armature's selected bones, using the distance between the vertices and the bones" -msgstr "Đặt quyền lượng của nhóm giống với xương được chọn của cốt gắn, dùng khoảng cách giữa các đỉnh và xương" +msgstr "Đặt trọng lượng của những nhóm xứng khớp với các xương của khung cốt gắn liền được chọn, dùng khoảng cách giữa các điểm đỉnh và các xương" msgid "Method to use for assigning weights" -msgstr "Phương pháp dùng để chỉ định quyền lượng" +msgstr "Phương pháp sử dụng để chỉ định trọng lượng" msgid "Automatic weights from bones" -msgstr "Quyền lượng tự động từ xương" +msgstr "Cân trọng tự động từ các xương" msgid "From Envelopes" -msgstr "Từ Bao Bì" +msgstr "Từ các Phong Bao" msgid "Weights from envelopes with user defined radius" -msgstr "Quyền từ bao bì với bán kính người dùng được xác định" +msgstr "Trọng lượng từ các phong bao với bán kính mà người dùng xác định" msgctxt "Operator" msgid "Weight Gradient" -msgstr "Chuyển Sắc Quyền Lượng" +msgstr "Dốc Trọng Lượng" msgid "Draw a line to apply a weight gradient to selected vertices" -msgstr "Vẽ một đường cho áp dụng một chuyển sắc quyền lượng đến đỉnh được chọn" +msgstr "Vẽ một đường để áp dụng một dốc trọng lượng vào các điểm đỉnh được chọn" msgctxt "Operator" msgid "Weight Paint" -msgstr "Sơn Quyền Lượng" +msgstr "Sơn Trọng Lượng" msgid "Paint a stroke in the current vertex group's weights" -msgstr "Sơn một nét trong quyền lượng của nhóm đỉnh hiện tại" +msgstr "Sơn một nét trong trọng lượng của nhóm điểm đỉnh hiện tại" msgctxt "Operator" msgid "Weight Paint Mode" -msgstr "Chế Độ Sơn Quyền Lượng" +msgstr "Chế Độ Sơn Trọng Lượng" msgid "Toggle weight paint mode in 3D view" -msgstr "Bật/tắt chế độ sơn quyền lượng trong màn 3D" +msgstr "Bật/Tắt chế độ sơn trọng lượng trong khung nhìn 3D" msgctxt "Operator" msgid "Weight Paint Sample Group" -msgstr "Nhóm Mẫu Vật Quyền Lượng Sơn" +msgstr "Nhóm Mẫu Vật của Sơn Trọng Lượng" msgid "Select one of the vertex groups available under current mouse position" -msgstr "Chọn một nhóm đỉnh thì có thể chọn ở dưới vị trí con trỏ chuột" +msgstr "Chọn một nhóm điểm đỉnh có thể sử dụng được nằm dưới vị trí con trỏ chuột" msgctxt "Operator" msgid "Set Weight" -msgstr "Đặt Quyền Lượng" +msgstr "Đặt Trọng Lượng" msgid "Fill the active vertex group with the current paint weight" -msgstr "Tô nhóm đỉnh hoạt động với quyền lượng sơn hiện tại" +msgstr "Tô nhóm điểm đỉnh đang hoạt động với trọng lượng sơn hiện tại" msgctxt "Operator" msgid "New Palette Color" -msgstr "Màu Bảng Màu Mới" +msgstr "Màu Mới của Bảng" msgid "Add new color to active palette" -msgstr "Thêm màu mới vào bảng màu hoạt động" +msgstr "Thêm màu mới vào bảng pha màu" msgctxt "Operator" msgid "Delete Palette Color" -msgstr "Xóa Màu Bảng Màu" +msgstr "Xóa Màu trong Bảng" msgid "Remove active color from palette" -msgstr "Xóa màu hoạt động từ bảng màu" +msgstr "Xóa màu đang hoạt động khỏi bảng pha màu" msgctxt "Operator" msgid "Move Palette Color" -msgstr "Di Chuyển Màu Của Bảng Màu " +msgstr "Di Chuyển Bảng Pha Màu" msgid "Move the active Color up/down in the list" -msgstr "Di chuyển màu hoạt động lên/xuống trong danh sách" +msgstr "Di chuyển Màu đang hoạt động lên/xuống trong danh sách" msgctxt "Operator" msgid "Extract Palette from Image" -msgstr "Rút Bảng Màu Từ Ảnh" +msgstr "Trích Xuất Bảng Pha Màu từ Hình Ảnh" msgid "Extract all colors used in Image and create a Palette" -msgstr "Rút hết màu được dùng trong Ảnh và chế tạo một bảnh màu" +msgstr "Trích xuất toàn bộ các màu sắc sử dụng trong hình ảnh và kiến tạo một bảng pha màu" msgctxt "Operator" msgid "Join Palette Swatches" -msgstr "Góp Bảng Màu" +msgstr "Hội Nhập các Màu Mẫu trong Bảng Pha" msgid "Join Palette Swatches" -msgstr "Góp Bảng Màu" +msgstr "Hội Nhập các Màu Mẫu trong Bảng Pha" msgid "Name of the Palette" -msgstr "Tên của Bảng Màu" +msgstr "Tên của Bảng Pha Màu" msgctxt "Operator" msgid "Add New Palette" -msgstr "Thêm Bảng Màu Mới" +msgstr "Thêm Bảng Pha Màu Mới" msgid "Add new palette" -msgstr "Thêm bảng màu mới" +msgstr "Thêm bảng pha màu mới" msgctxt "Operator" msgid "Sort Palette" -msgstr "Sắp Xếp Bảng" +msgstr "Sắp Xếp Trật Tự Bảng Pha Màu" msgid "Sort Palette Colors" -msgstr "Sắp Xếp Màu Trong Bảng" +msgstr "Sắp Xếp Trật Tự các Màu trong Bảng Pha" msgid "Hue, Saturation, Value" -msgstr "Màu Sắc, Độ Tươi, Độ Sáng" +msgstr "Sắc Màu, Độ Bão Hòa, Giá Trị" msgid "Saturation, Value, Hue" -msgstr "Độ Tươi, Độ Sáng, Màu Sắc" +msgstr "Độ Bão Hòa, Giá Trị, Sắc Màu" msgid "Value, Hue, Saturation" -msgstr "Độ Sáng, Màu Sắc, Độ Tươi" +msgstr "Giá Trị, Sắc Màu, Độ Bão Hòa" msgctxt "Operator" msgid "Brush Edit" -msgstr "Biên Tập Bút" +msgstr "Biên Soạn Đầu Bút" msgid "Apply a stroke of brush to the particles" -msgstr "Áp dụng một nét của bút với các hạt" +msgstr "Áp dụng một nét vẽ của bút vào các hạt" msgctxt "Operator" @@ -65613,24 +71916,24 @@ msgstr "Kết Nối Tóc" msgid "Connect hair to the emitter mesh" -msgstr "Kết nối tóc với mạng lưới phát" +msgstr "Kết nối tóc với khung lưới phát" msgid "All Hair" -msgstr "Hết Tóc" +msgstr "Toàn Bộ Tóc" msgid "Connect all hair systems to the emitter mesh" -msgstr "Kết nối hết hệ thống tóc với mạng lưới phát" +msgstr "Kết nối toàn bộ các hệ thống tóc với khung lưới phát" msgctxt "Operator" msgid "Copy Particle Systems" -msgstr "Chép Các Hệ Thống Hạt" +msgstr "Sao Chép Hệ Thống Hạt" msgid "Copy particle systems from the active object to selected objects" -msgstr "Chép các hệ thống hạt từ vật thể hoạt động này đến các vật thể được chọn" +msgstr "Sao chép các hệ thống hạt từ đối tượng đang hoạt động sang đối tượng được chọn" msgid "Remove Target Particles" @@ -65638,146 +71941,146 @@ msgstr "Xóa Hạt Mục Tiêu" msgid "Remove particle systems on the target objects" -msgstr "Xóa các hệ thống hạt của vật thể mục tiêu" +msgstr "Xóa các hệ thống hạt trên đối tượng mục tiêu" msgid "Space transform for copying from one object to another" -msgstr "Biến hóa không gian cho chép một vật thể đến vật thể khác" +msgstr "Biến hóa không gian cho quá trình sao chép từ một đối tượng sang một đối tượng khác" msgid "Copy inside each object's local space" -msgstr "Chép trong không gian địa phương của mỗi vật thể" +msgstr "Sao chép nội trong không gian địa phương của mỗi đối tượng" msgid "Copy in world space" -msgstr "Chép trong không gian thế giới" +msgstr "Sao chép trong không gian thế giới" msgid "Use the active particle system from the context" -msgstr "Dùng hệ thống hoạt động từ bối cảnh" +msgstr "Dùng hệ thống hạt đang hoạt động từ ngữ cảnh" msgid "Delete selected particles or keys" -msgstr "Xóa các hạt hay bức ảnh mẫu được chọn" +msgstr "Xóa các hạt hay điểm điều khiển được chọn" msgid "Delete a full particle or only keys" -msgstr "Xóa một hạt toàn bộ hay chỉ bức ảnh mẫu" +msgstr "Xóa hết hạt hoặc chỉ xóa các điểm điều khiển thôi" msgctxt "Operator" msgid "Disconnect Hair" -msgstr "Ngắt Tóc" +msgstr "Ngắt Kết Nối Tóc" msgid "Disconnect hair from the emitter mesh" -msgstr "Ngắt tóc từ mạng lưới phát" +msgstr "Ngắt kết nối tóc khỏi khung lưới phát" msgid "Disconnect all hair systems from the emitter mesh" -msgstr "Ngắt tất cả hệ thống tóc từ mạng lưới phát" +msgstr "Ngắt kết nối của toàn bộ các hệ thống tóc khỏi khung lưới phát" msgctxt "Operator" msgid "Duplicate Particle System" -msgstr "Sao Chép Hệ Thống Hạt" +msgstr "Nhân Đôi Hệ Thống Hạt" msgid "Duplicate particle system within the active object" -msgstr "Sao chép hệ thống hạt trong vật thể hoạt động" +msgstr "Nhân đôi (tạo một bản sao) hệ thống hạt trong đối tượng đang hoạt động" msgid "Duplicate Settings" -msgstr "Cài Đặt Sao Chép" +msgstr "Nhân Đôi các Sắp Đặt" msgid "Duplicate settings as well, so the new particle system uses its own settings" -msgstr "Cũng sao chép các cài đặt, cho hệ thống hạt mới được sử dụng cài đặt riêng" +msgstr "Cũng nhân đôi các sắp đặt sang cho hệ thống hạt mới, hầu cho nó sử dụng sắp đặt riêng của mình" msgctxt "Operator" msgid "Copy Particle Instance Object" -msgstr "Sao Chép Vật Thể Thực Thể Hạt" +msgstr "Sao Chép Đối Tượng Thực Thể Hóa Hạt" msgid "Duplicate the current instance object" -msgstr "Sao chép vật thể thực thể hiện tại" +msgstr "Nhân đôi đối tượng thực thể hiện tại" msgctxt "Operator" msgid "Move Down Instance Object" -msgstr "Hạ Xuống Vật Thể Thực Thể" +msgstr "Di Chuyển Đối Tượng Thực Thể Xuống Dưới" msgid "Move instance object down in the list" -msgstr "Hạ xuống vật thể thực thể trong danh sách" +msgstr "Di chuyển đối tượng thực thể xuống dưới trong danh sách" msgctxt "Operator" msgid "Move Up Instance Object" -msgstr "Nâng Lên Vật Thể Thực Thể" +msgstr "Di Chuyển Đối Tượng Thực Thể Lên" msgid "Move instance object up in the list" -msgstr "Nâng lên vật thể thực thể trong danh sách" +msgstr "Di chuyển đối tượng thực thể lên trong danh sách" msgctxt "Operator" msgid "Refresh Instance Objects" -msgstr "Hoàn Lại Vật Thể Thực Thể" +msgstr "Làm Tươi Lại Đối Tượng Thực Thể" msgid "Refresh list of instance objects and their weights" -msgstr "Hoàn lại danh sách vật thể thực thể và quyền lượng của chúng nó" +msgstr "Cập nhật các thay đổi trong danh sách các đối tượng thực thể và trọng lượng của chúng" msgctxt "Operator" msgid "Remove Particle Instance Object" -msgstr "Xóa Vật Thể Thực Thể Hạt" +msgstr "Xóa Đối Tượng Thực Thể Hóa Hạt" msgid "Remove the selected instance object" -msgstr "Xóa vật thể thực thể được chọn" +msgstr "Xóa đối tượng thực thể đã chọn" msgctxt "Operator" msgid "Clear Edited" -msgstr "Xóa Được Biên Tập" +msgstr "Xóa Biên Soạn" msgid "Undo all edition performed on the particle system" -msgstr "Hủy bước hết biên tập của hệ thống hạt" +msgstr "Hoàn tác toàn bộ các biên soạn đã thi hành trên hệ thống hạt" msgctxt "Operator" msgid "Add Hair Dynamics Preset" -msgstr "Thêm Đặt Sẳn Động Lý Tóc" +msgstr "Thêm Sắp Đặt Sẵn Động Lực Học của Tóc" msgid "Add or remove a Hair Dynamics Preset" -msgstr "Thêm hay xóa một Đặt Sẵn Động Lý Tóc" +msgstr "Thêm hay xóa một Sắp Đặt Sẵn về Động Lực Học của Tóc" msgid "Hide selected particles" -msgstr "Ẩn các hạt được chọn" +msgstr "Ẩn giấu các hạt đã chọn" msgctxt "Operator" msgid "Mirror" -msgstr "Gương" +msgstr "Phản Chiếu Đối Xứng" msgid "Duplicate and mirror the selected particles along the local X axis" -msgstr "Sao chép và gương các hạt được chọn qua trục X địa phương" +msgstr "Nhân đôi và phản chiếu đối xứng các hạt đã chọn dọc theo trục X địa phương" msgctxt "Operator" msgid "New Particle Settings" -msgstr "Cài Đặt Hạt Mới" +msgstr "Sắp Đặt Mới cho Hạt" msgid "Add new particle settings" -msgstr "Kèm cài đặt hạt mới" +msgstr "Thêm các sắp đặt mới cho hạt" msgctxt "Operator" @@ -65786,42 +72089,42 @@ msgstr "Mục Tiêu Hạt Mới" msgid "Add a new particle target" -msgstr "Kèm một mục tiêu hạt mới" +msgstr "Thêm một mục tiêu hạt mới" msgctxt "Operator" msgid "Particle Edit Toggle" -msgstr "Bật/Tắt Biên Tập Hạt" +msgstr "Bật/Tắt Biên Soạn Hạt" msgid "Toggle particle edit mode" -msgstr "Bật/tắt chế độ biên tập hạt" +msgstr "Bật/Tắt Chế Độ Biên Soạn hạt" msgctxt "Operator" msgid "Rekey" -msgstr "Bứa Ảnh Mẫu Lại" +msgstr "Đổi Số Điểm" msgid "Change the number of keys of selected particles (root and tip keys included)" -msgstr "Đổi số bứa ảnh mẫu của hạt được chọn (gồm bức ảnh mẫu rễ và đỉnh cuối)" +msgstr "Đổi số điểm điều khiển của hạt được chọn (bao gồm cả điểm gốc và ngọn)" msgid "Number of Keys" -msgstr "Sô Lượng Bức Ảnh Mẫu" +msgstr "Số Điểm" msgctxt "Operator" msgid "Remove Doubles" -msgstr "Xoá Đỉnh Đôi" +msgstr "Xóa Điểm Đỉnh Kép" msgid "Remove selected particles close enough of others" -msgstr "Xóa hạt được chọn gần đủ với hạt khác" +msgstr "Xóa các hạt đã chọn nằm gần vừa đủ với các cái khác" msgid "Threshold distance within which particles are removed" -msgstr "Ngưỡng khoảng cách cho được hủy diệt các hạt ở phía trong" +msgstr "Những hạt nào nằm trong khoảng cách này sẽ bị xóa đi" msgctxt "Operator" @@ -65830,19 +72133,19 @@ msgstr "Hiện" msgid "Show hidden particles" -msgstr "Hiện hạt được ẩn" +msgstr "Hiển thị các hạt ẩn" msgid "(De)select all particles' keys" -msgstr "Chọn/thả tất cả bức ảnh mẫu của hạt" +msgstr "Chọn/hủy chọn toàn bộ các điểm điều khiển của hạt" msgid "Deselect boundary selected keys of each particle" -msgstr "Thả bức ảnh mẫu ranh giới được chọn của mỗi hạt" +msgstr "Hủy chọn các điểm điều khiển ở ranh giới vùng được chọn của mỗi hạt" msgid "Select all keys linked to already selected ones" -msgstr "Chọn hết bức ảnh mẫu được liên kết với các bức ảnh mẫu đã chọn" +msgstr "Lựa chọn toàn bộ các khóa (keys) kết nối với những cái đã được chọn" msgid "Select nearest particle from mouse pointer" @@ -65850,163 +72153,177 @@ msgstr "Chọn hạt gần nhất với con trỏ chuột" msgid "Deselect linked keys rather than selecting them" -msgstr "Thả bức ảnh mẫu liên kết thay chọn nó" +msgstr "Hủy chọn các điểm điều khiển kết nối, thay vì lựa chọn chúng" msgid "Select keys linked to boundary selected keys of each particle" -msgstr "Chọn bức ảnh mẫu liên kết với bức ảnh mẫu ranh giới được chọn của mỗi hạt" +msgstr "Chọn các điểm điều khiển kết nối với ranh giới các điểm đã chọn của mỗi hạt (sợi)" msgid "Select a randomly distributed set of hair or points" -msgstr "Chọn một tập tóc hay điểm được phân phối ngẫu nhiên" +msgstr "Chọn một tập hợp của tóc hay các điểm được phân phối ngẫu nhiên" msgid "Select either hair or points" -msgstr "Chọn tóc hay điểm" +msgstr "Chọn hoặc là tóc, hoặc là các điểm" msgctxt "Operator" msgid "Select Roots" -msgstr "Chọn Rễ" +msgstr "Chọn Gốc" msgid "Select roots of all visible particles" -msgstr "Chọn rễ của tất cả hạt hiển thị" +msgstr "Chọn gốc của toàn bộ các hạt có thể nhìn thấy" msgctxt "Operator" msgid "Select Tips" -msgstr "Chọn Đỉnh Cuối" +msgstr "Chọn Đỉnh" msgid "Select tips of all visible particles" -msgstr "Chọn đỉnh cuối của tất cả hạt hiển thị" +msgstr "Chọn các đỉnh của toàn bộ các hạt có thể nhìn thấy" msgctxt "Operator" msgid "Shape Cut" -msgstr "Cắt Hình Dạng" +msgstr "Cắt Theo Hình Dạng" msgid "Cut hair to conform to the set shape object" -msgstr "Cắt tóc cho phù hợp với vật thể hình dạng tập" +msgstr "Cắt tóc cho phù hợp với đối tượng chỉnh hình đã đặt" msgid "Subdivide selected particles segments (adds keys)" -msgstr "Phân hóa đoạn thẳng hạt được chọn (thêm bức ảnh mẫu)" +msgstr "Phân hóa các phân đoạn của những hạt được chọn (thêm điểm điều khiển)" msgctxt "Operator" msgid "Move Down Target" -msgstr "Hạ Xuống Mục Tiêu" +msgstr "Chuyển Mục Tiêu Xuống Dưới" msgid "Move particle target down in the list" -msgstr "Di chuyển mục tiêu hạt xuống trong danh sách" +msgstr "Chuyển mục tiêu hạt xuống dưới trong danh sách" msgctxt "Operator" msgid "Move Up Target" -msgstr "Nâng Lên Mục Tiêu" +msgstr "Chuyển Mục Tiêu Lên Trên" msgid "Move particle target up in the list" -msgstr "Di chuyển mục tiêu hạt lên trong danh sách" +msgstr "Chuyển mục tiêu hạt lên trên trong danh sách" msgctxt "Operator" msgid "Remove Particle Target" -msgstr "Xóa Mục Tiêu Hạt" +msgstr "Xóa Mục Tiêu của Hạt" msgid "Remove the selected particle target" -msgstr "Xóa mục tiêu hạt được chọn" +msgstr "Xóa mục tiêu của hạt được chọn" msgctxt "Operator" msgid "Unify Length" -msgstr "Dài Bằng Nhau" +msgstr "Đồng Bộ Hóa Độ Dài" msgid "Make selected hair the same length" -msgstr "Làm sợi tóc được chọn dài bằng nhau" +msgstr "Làm sợi tóc được chọn có cùng độ dài" msgctxt "Operator" msgid "Weight Set" -msgstr "Tập Quyền Lượng" +msgstr "Đặt Trọng Lượng" msgid "Set the weight of selected keys" -msgstr "Đặt quyền lực của bức ảnh mẫu được xác định" +msgstr "Đặt trọng lượng cho điểm điều khiển đã chọn" msgid "Interpolation factor between current brush weight, and keys' weights" -msgstr "Hệ số suy nội giữa quyền lượng bút hiện tại, và quyền lượng bức ảnh mẫu" +msgstr "Hệ số nội suy giữa trọng lượng bút hiện tại, và trọng lượng của điểm điều khiển" msgctxt "Operator" msgid "Apply Pose Asset" -msgstr "Áp Dụng Tích Sản Dạng Đứng" +msgstr "Áp Dụng Tài Sản Tư Thế" msgid "Apply the given Pose Action to the rig" -msgstr "Áp dụng Hành Động Dạng Đứng đươc giao cho giàn" +msgstr "Áp dụng Hành Động của Tư Thế đã cho vào giàn dựng nhân vật" + + +msgid "Amount that the pose is applied on top of the existing poses. A negative value will subtract the pose instead of adding it" +msgstr "Số lượng mà tư thế được áp dụng trên các tư thế hiện có. Một giá trị âm sẽ trừ tư thế thay vì thêm nó" msgid "Apply Flipped" -msgstr "Áp Dụng Lật" +msgstr "Áp Dụng Đảo Lật" msgid "When enabled, applies the pose flipped over the X-axis" -msgstr "Khi được bật, áp dụng dạng đứng lật qua trục X" +msgstr "Khi được bật thì áp dụng tư thế lật ngược trên trục X" msgctxt "Operator" msgid "Blend Pose Asset" -msgstr "Pha Trộn Tích Sản Dạng Đứng" +msgstr "Pha Trộn Tài Sản Tư Thế" msgid "Blend the given Pose Action to the rig" -msgstr "Pha trộn Hành Động Dạng Đứng được giao cho giàn" +msgstr "Pha trộn Hành Động của Tư Thế nhất định vào giàn dựng nhân vật" msgctxt "Operator" msgid "Convert Legacy Pose Library" -msgstr "Biến Đổi Thư Viện Dạng Đứng Lỗi Thời" +msgstr "Chuyển Đổi Thư Viện Tư Thế Lỗi Thời" msgid "Create a pose asset for each pose marker in this legacy pose library data-block" -msgstr "Chế tạo một tích sản dạng đứng từng ký hiệu dạng đứng trong cục dữ liệu của thư viện dạng đứng lỗi thời" +msgstr "Kiến Tạo tài sản tư thế cho mỗi dấu mốc tư thế trong khối dữ liệu thư viện tư thế lỗi thời này" msgid "Create a pose asset for each pose marker in the current action" -msgstr "Chế tạo một tích sản dạng đứng cho mỗi cái dấu trong hành động hiện tại" +msgstr "Kiến Tạo tài sản tư thế cho mỗi dấu mốc tư thế trong hành động hiện tại" + + +msgctxt "Operator" +msgid "Copy Pose as Asset" +msgstr "Sao Chép Tư Thế làm Tài Sản" msgid "Create a new pose asset on the clipboard, to be pasted into an Asset Browser" -msgstr "Chế tạo một tích sản dạng đứng mới trên bảng dán, để dán trong một Trình Duyệt Tích Sản" +msgstr "Kiến Tạo tài sản tư thế mới trên bảng nhớ tạm của hệ thống, để dán vào Trình Duyệt Tài Sản" msgctxt "Operator" msgid "Create Pose Asset" -msgstr "Chế Tạo Tích Sản Dạng Đứng" +msgstr "Kiến Tạo Tài Sản Tư Thế" msgid "Create a new Action that contains the pose of the selected bones, and mark it as Asset. The asset will be stored in the current blend file" -msgstr "Chế tạo một Hành Động đang chứa dạng đứng của các xương được chọn, và ghi dấu nó là Tích Sản. Tích sản sẽ được chứa trong tập tin .blend hiện tại" +msgstr "Kiến Tạo một Hành Động mới có chứa tư thế của xương đã chọn và đánh dấu nó là Tài Sản. Tài sản sẽ được lưu trữ trong tập tin blend hiện tại" msgid "Activate New Action" -msgstr "Kích Động Hoạt Động Mới" +msgstr "Kích hoạt Hành động Mới" msgid "Pose Name" -msgstr "Tên Dạng Đứng" +msgstr "Tên Tư Thế" + + +msgctxt "Operator" +msgid "Paste as New Asset" +msgstr "Dán thành Tài Sản Mới" msgid "Paste the Asset that was previously copied using Copy As Asset" -msgstr "Dán Tích Sản được chép trước đây bởi Chép Làm Tích Sản" +msgstr "Dán Tài Sản đã được sao chép trước đó bằng Sao Chép Làm Tài Sản" msgctxt "Operator" @@ -66015,33 +72332,33 @@ msgstr "Chọn Xương" msgid "Select those bones that are used in this pose" -msgstr "Chọn các xương được dùng trong dạng đứng này" +msgstr "Chọn các xương được sử dụng trong tư thế này" msgctxt "Operator" msgid "Restore Previous Action" -msgstr "Hoàn Lại Hành Động Trước" +msgstr "Khôi Phục Lại Hành Động Trước Đây" msgid "Switch back to the previous Action, after creating a pose asset" -msgstr "Trở lại đến Hành Động trước, sau được chế tạo một tích sản dạng đứng" +msgstr "Quay trở lại Hành Động trước đây, sau khi tạo tài sản tư thế" msgctxt "Operator" msgid "Apply Pose as Rest Pose" -msgstr "Áp Dụng Dạng Đứng Làm Dạng Đứng Nghỉ" +msgstr "Áp Dụng Tư Thế làm Tư Thế Nghỉ" msgid "Apply the current pose as the new rest pose" -msgstr "Áp dụng dạng đứng hiện tại làm dạng đứng nghỉ mới" +msgstr "Áp dụng tư thế hiện tại làm tư thế nghỉ mới" msgid "Only apply the selected bones (with propagation to children)" -msgstr "Chỉ áp dụng các xương được chọn (và tiến triển đến con cái)" +msgstr "Chỉ áp dụng các xương được chọn (lan truyền đến con cái nữa)" msgid "Blend from current position to previous or next keyframe" -msgstr "Phan trộn từ vị trí hiện tại đến bức ảnh mẫu trước hay sau" +msgstr "Pha trộn từ vị trí hiện tại đến khung khóa trước hoặc khung khóa tiếp theo" msgid "Axis Lock" @@ -66049,47 +72366,47 @@ msgstr "Khóa Trục" msgid "Transform axis to restrict effects to" -msgstr "Trục biến hóa để hạn chế hiệu ứng" +msgstr "Hạn chế tác động, chỉ cho phép biến hóa trên trục" msgid "All axes are affected" -msgstr "Ảnh hưởng được hết trục" +msgstr "Toàn bộ các trục đều tác động" msgid "Only X-axis transforms are affected" -msgstr "Chỉ ảnh hưởng được biến hóa Trục X" +msgstr "Duy các biến hóa trên trục-X là có tác động mà thôi" msgid "Only Y-axis transforms are affected" -msgstr "Chỉ ảnh hưởng được biến hóa Trục Y" +msgstr "Duy các biến hóa trên trục-Y là có tác động mà thôi" msgid "Only Z-axis transforms are affected" -msgstr "Chỉ ảnh hưởng được biến hóa Trục Z" +msgstr "Duy các biến hóa trên trục-Z là có tác động mà thôi" msgid "Set of properties that are affected" -msgstr "Tập đặc tính được ảnh hưởng" +msgstr "Tập hợp các tính chất bị ảnh hưởng" msgid "All Properties" -msgstr "Hết Đặc Tính" +msgstr "Toàn Bộ các Tính Chất" msgid "All properties, including transforms, bendy bone shape, and custom properties" -msgstr "Hết đặc tính, gồm biến hóa, dạng xương dẻo, và đặc tính tùy chọn" +msgstr "Toàn bộ các tính chất, bao gồm các biến hóa, hình dạng xương dẻo, và các tính chất tự tạo" msgid "Location only" -msgstr "Chỉ vị trí" +msgstr "Duy vị trí" msgid "Rotation only" -msgstr "Chỉ xoay" +msgstr "Duy xoay chiều" msgid "Scale only" -msgstr "Chỉ phóng to" +msgstr "Duy đổi tỷ lệ" msgid "Bendy Bone" @@ -66097,76 +72414,93 @@ msgstr "Xương Dẻo" msgid "Bendy Bone shape properties" -msgstr "Đặc Tính Dạng Xương Dẻo" +msgstr "Tính chất của hình dạng Xương Dẻo" msgid "Custom properties" -msgstr "Đặc tính tự tạo" +msgstr "Tính chất tự tạo" msgid "Weighting factor for which keyframe is favored more" -msgstr "Quyền lượng cho hổ trợ bức ảnh mẫu nào hơn" +msgstr "Hệ số trọng lượng mà khung khóa ưu ái hơn" msgid "Frame number of keyframe immediately after the current frame" -msgstr "Số lượng bức ảnh lập tức sau bức ảnh hiện tại" +msgstr "Khung hình số của khung khóa ngay đằng sau khung hình hiện tại" msgid "Previous Keyframe" -msgstr "Bức Ảnh Trước" +msgstr "Khung Khóa Trước" msgid "Frame number of keyframe immediately before the current frame" -msgstr "Số lượng bức ảnh lập tức trước bức ảnh hiện tại" +msgstr "Khung hình số của khung khóa ngay đằng trước khung hình hiện tại" + + +msgctxt "Operator" +msgid "Blend Pose with Rest Pose" +msgstr "Pha Trộn Tư Thế với Tư Thế Nghỉ" + + +msgid "Make the current pose more similar to, or further away from, the rest pose" +msgstr "Làm cho tư thế hiện tại giống hơn, hoặc xa hơn, với tư thế nghỉ" msgctxt "Operator" msgid "Pose Breakdowner" -msgstr "Dạng Đứng Giữa" +msgstr "Máy Phân Tích Tư Thế" msgid "Create a suitable breakdown pose on the current frame" -msgstr "Chế tạo một dạng đứng giữa cho bức ảnh hiện tại" +msgstr "Kiến tạo một tư thế phân tích thích hợp cho khung hình hiện tại" msgid "Add a constraint to the active bone" -msgstr "Thêm một ràng buộc cho xương hoạt động" +msgstr "Thêm một ràng buộc vào xương đang hoạt động" msgid "Add a constraint to the active bone, with target (where applicable) set to the selected Objects/Bones" -msgstr "Thêm ràng buộc cho xương hoạt động, với mục tiêu (khi được áp dụng) đặt với Vật Thể/Xương được chọn" +msgstr "Thêm ràng buộc vào xương đang hoạt động, đặt các đối tượng/xương đã chọn làm mục tiêu của nó (nếu có thể)" msgctxt "Operator" msgid "Clear Pose Constraints" -msgstr "Xóa Ràng Buộc Dạng Đứng" +msgstr "Xóa các Ràng Buộc Tư Thế" + + +msgid "Clear all constraints from the selected bones" +msgstr "Xóa toàn bộ các ràng buộc khỏi xương đã được chọn" msgctxt "Operator" msgid "Copy Constraints to Selected Bones" -msgstr "Chép Ràng Buộc Đến Xương Được Chọn" +msgstr "Sao Chép các Ràng Buộc sang các Xương Đã Chọn" msgid "Copy constraints to other selected bones" -msgstr "Chép ràng buộc đến các xương khác được chọn" +msgstr "Sao chép các ràng buộc sang các xương đã chọn khác" msgctxt "Operator" msgid "Copy Pose" -msgstr "Chép Dạng Đứng" +msgstr "Sao Chép Tư Thế" + + +msgid "Copy the current pose of the selected bones to the internal clipboard" +msgstr "Sao chép tư thế hiện tại của xương đã chọn vào bảng nhớ tạm nội bộ" msgid "Tag selected bones to not be visible in Pose Mode" -msgstr "Nhãn xương được chọn cho không hiển thị trong Chế Độ Dạng Đứng" +msgstr "Đánh dấu các xương được chọn là không thể nhìn thấy được trong Chế Độ Tư Thế" msgctxt "Operator" msgid "Add IK to Bone" -msgstr "Thêm IK Cho Xương" +msgstr "Thêm IK cho Xương" msgid "Add IK Constraint to the active Bone" -msgstr "Thêm Ràng Buộc IK với Xương hoạt động" +msgstr "Thêm Ràng Buộc IK vào Xương đang hoạt động" msgid "With Targets" @@ -66174,7 +72508,7 @@ msgstr "Với Mục Tiêu" msgid "Assign IK Constraint with targets derived from the select bones/objects" -msgstr "Chỉ định Ràng buộc IK với mục tiêu được tính từ xương/vật thể được chọn" +msgstr "Chỉ định các mục tiêu được suy ra từ các xương/đối tượng được chọn cho Ràng Buộc IK" msgctxt "Operator" @@ -66183,90 +72517,94 @@ msgstr "Xóa IK" msgid "Remove all IK Constraints from selected bones" -msgstr "Xóa hết Ràng Buột IK từ xương được chọn" +msgstr "Xóa toàn bộ các Ràng Buộc IK khỏi những xương được chọn" msgctxt "Operator" msgid "Clear Pose Location" -msgstr "Xóa Vị Trí Dạng Đứng" +msgstr "Xóa Vị Trí Tư Thế" msgid "Reset locations of selected bones to their default values" -msgstr "Đặt lại vị trí của xương được chọn đến vị trí mặc định" +msgstr "Hoàn lại vị trí của những xương được chọn về các giá trị mặc định" msgctxt "Operator" msgid "Paste Pose" -msgstr "Dán Dạng Đứng" +msgstr "Dán Tư Thế" msgid "Paste the stored pose on to the current pose" -msgstr "Dán dạng đứng được chứa cho dạng đứng hiện tại" +msgstr "Dán tư thế đã lưu lên tư thế hiện tại" msgid "Flipped on X-Axis" -msgstr "Lật Trục X" +msgstr "Đảo Chiều trên Trục X" msgid "Paste the stored pose flipped on to current pose" -msgstr "Dán dạng đứng được chứa kiểu lật cho dạng đứng hiện tại" +msgstr "Dán tư thế đã lưu và đảo chiều lên tư thế hiện tại" msgid "On Selected Only" -msgstr "Chỉ Cho Được Chọn" +msgstr "Duy Vào cái được Chọn" msgid "Only paste the stored pose on to selected bones in the current pose" -msgstr "Chỉ dán dạng đứng được chứa cho xương được chọn trong dạng đứng hiện tại" +msgstr "Chỉ dán tư thế đã lưu giữ vào các xương được chọn trong tư thế hiện tại mà thôi" msgctxt "Operator" msgid "Calculate Bone Paths" -msgstr "Tính Đường Đi Xương" +msgstr "Tính Đường Di Chuyển của Xương" msgid "Calculate paths for the selected bones" -msgstr "Tính đường đi cho xương được chọn" +msgstr "Tính toán các đường di chuyển cho những xương được chọn" msgid "Which point on the bones is used when calculating paths" -msgstr "Dùng điểm nào trên xương khi tính đường đi" +msgstr "Dùng điểm nào trên xương khi tính toán các đường di chuyển" msgctxt "Operator" msgid "Clear Bone Paths" -msgstr "Xóa Đường Dẫn Xương" +msgstr "Xóa Đường Di Chuyển của Xương" + + +msgid "Only clear motion paths of selected bones" +msgstr "Chỉ xóa các đường chuyển động của các xương đã chọn mà thôi" msgctxt "Operator" msgid "Update Range from Scene" -msgstr "Nâng Cấp Phạm Vi từ Cảnh" +msgstr "Cập Nhật Khoảng từ Cảnh" msgid "Update frame range for motion paths from the Scene's current frame range" -msgstr "Nâng cấp phạm vi cho đường chuyển động từ phạm vi hiện tại của Cảnh" +msgstr "Cập nhật khoảng khung hình dành cho các đường chuyển động từ khoảng khung hình hiện tại của Cảnh" msgctxt "Operator" msgid "Update Bone Paths" -msgstr "Nâng Cấp Đường Đi Của Xương" +msgstr "Cập Nhật Đường Di Chuyển của Xương" msgid "Recalculate paths for bones that already have them" -msgstr "Tính lại đường đi cho các xương đã có đường đi" +msgstr "Tính lại các đường di chuyển cho những xương đã có chúng rồi" msgctxt "Operator" msgid "Propagate Pose" -msgstr "Truyền Dẫn Dạng Đứng" +msgstr "Lan Truyền Tư Thế" msgid "Copy selected aspects of the current pose to subsequent poses already keyframed" -msgstr "Chép phần được chọn của dạng đứng hiện tại đến đạng ứng tiếp tục đã làm bức ảnh mẫu rồi" +msgstr "Sao chép các phương diện của tư thế hiện tại sang các tư thế tiếp tới đã được khung khóa hóa" msgid "Frame to stop propagating frames to (for 'Before Frame' mode)" -msgstr "Bức ảnh cho nghỉ truyền dẫn bức ảnh đến (cho chế độ 'Trước Bức Ảnh')" +msgstr "Khung hình để ngưng sự lan truyền (dành cho chế độ 'Trước Khung Hình')" msgid "Terminate Mode" @@ -66274,136 +72612,144 @@ msgstr "Chế Độ Kết Thúc" msgid "Method used to determine when to stop propagating pose to keyframes" -msgstr "Phương pháp dùng cho biết khi ngừng truyền dẫn dạng đứng bức ảnh mẫu" +msgstr "Phương pháp sử dụng để xác định khi nào sẽ ngưng sự truyền lan tư thế sang các khung khóa" msgid "To Next Keyframe" -msgstr "Đến Bức Ảnh Mẫu Tiếp" +msgstr "Sang Khung Khóa Tiếp Tới" msgid "Propagate pose to first keyframe following the current frame only" -msgstr "Truyền dẫn dạng đứng chỉ đến bức ảnh mẫu đầu tiên sau bức ảnh hiện tại" +msgstr "Chỉ truyền lan tư thế sang khung khóa đầu tiên sau khung hình hiện tại mà thôi" msgid "To Last Keyframe" -msgstr "Đến Bức Ảnh Mẫu Cuối" +msgstr "Đến Khung Khóa Cuối Cùng" msgid "Propagate pose to the last keyframe only (i.e. making action cyclic)" -msgstr "Truyền dẫn dạng đứng chỉ đến bức ảnh mẫu cuối (cho làm hành động chu trình)" +msgstr "Lan truyền tư thế đến khung khóa cuối cùng mà thôi (tức là làm cho hành động tuần hoàn)" msgid "Before Frame" -msgstr "Trước Bức Ảnh" +msgstr "Trước Khung Hình" msgid "Propagate pose to all keyframes between current frame and 'Frame' property" -msgstr "Truyền dẫn dạng đứng đến hết bức ảnh mẫu giữa bức ảnh hiện tại và đặc tính 'Bức Ảnh'" +msgstr "Lan truyền tư thế đến toàn bộ các khung khóa nằm giữa khung hình hiện tại và tính chất 'Khung Hình'" msgid "Before Last Keyframe" -msgstr "Trước Bức Ảnh Mẫu Cuối" +msgstr "Trước Khung Khóa Cuối Cùng" msgid "Propagate pose to all keyframes from current frame until no more are found" -msgstr "Truyền dẫn dạng đứng đến hết bức ảnh mẫu từ bức ảnh hiện tại tới không cỏn nữa" +msgstr "Lan truyền tư thế đến toàn bộ các khung khóa, từ khung hình hiện tại tới khi không còn nữa" msgid "Propagate pose to all selected keyframes" -msgstr "Truyền dẫn dạng đứng đến hết bức ảnh mẫu vật được chọn" +msgstr "Lan truyền tư thế đến toàn bộ các khung khóa được chọn" msgid "Propagate pose to all keyframes occurring on frames with Scene Markers after the current frame" -msgstr "Truyền dạng đứng đến hết bức ảnh mẫu trên bức ảnh có Ký Hiệu Cảnh sau bức ảnh hiện tại" +msgstr "Lan truyền tư thế đến toàn bộ các khung khóa nằm cùng trên những khung hình có các Dấu Cảnh sau khung hình hiện tại" msgctxt "Operator" msgid "Push Pose from Breakdown" -msgstr "Đẩy Dạng Đứng Từ Bức Ảnh Phụ" +msgstr "Cường Điệu Tư Thế từ Dáng Phân Tích" msgid "Exaggerate the current pose in regards to the breakdown pose" -msgstr "Làm qúa mức dạng đứng hiện tại so với dạng đứng bức ảnh phụ" +msgstr "Cường điệu tư thế hiện tại, bắt nguồn từ tư thế phân tích" msgctxt "Operator" msgid "Flip Quats" -msgstr "Lật Quaternion" +msgstr "Bật/Tắt Quatenion" msgid "Flip quaternion values to achieve desired rotations, while maintaining the same orientations" -msgstr "Lật giá trị quaternion để được xoay theo ý, nhưng vẫn còn giữ nguyên định hướng" +msgstr "Bật/tắt các giá trị Quatenion để đạt được sự xoay chiều mong muốn, trong khi vẫn duy trì định hướng" msgctxt "Operator" msgid "Relax Pose to Breakdown" -msgstr "Giãn Dạng Đứng Đến Bức Ảnh Phụ" +msgstr "Thả Lỏng về Tư Thế Phân Tích" msgid "Make the current pose more similar to its breakdown pose" -msgstr "Làm dạng đứng hiện tại giống hơn với dạng đứng của bức ảnh mẫu phụ của nó" +msgstr "Làm cho tư thế hiện tại (quay trở về) tương đồng với tư thế phân tích của nó" msgctxt "Operator" msgid "Reveal Selected" -msgstr "Hiện Được Chọn " +msgstr "Hiển Thị Cái được Chọn" msgid "Reveal all bones hidden in Pose Mode" -msgstr "Hiện hết xương đang giấu trong Chế Độ Dạng Đứng" +msgstr "Hiển thị toàn bộ các xương bị ẩn giấu trong Chế Độ Tư Thế" msgctxt "Operator" msgid "Clear Pose Rotation" -msgstr "Xóa Xoay Dạng Đứng" +msgstr "Xóa Xoay Chiều Tư Thế" msgid "Reset rotations of selected bones to their default values" -msgstr "Đặt lại xoay của xương được chọn trở lại giá trị mặc định" +msgstr "Hoàn lại sự xoay chiều của các xương được chọn về các giá trị mặc định" msgctxt "Operator" msgid "Set Rotation Mode" -msgstr "Chọn Chế Độ Xoay" +msgstr "Chọn Chế Độ Xoay Chiều" msgid "Set the rotation representation used by selected bones" -msgstr "Đặc biển diễn xoay để dùng cho xương được chọn dùng" +msgstr "Đặt phương pháp thể hiện sự xoay chiều sử dụng bởi các xương được chọn" msgctxt "Operator" msgid "Clear Pose Scale" -msgstr "Xóa Phóng To Dạng Đứng" +msgstr "Xóa Tỷ Lệ của Tư Thế" msgid "Reset scaling of selected bones to their default values" -msgstr "Đặt lại phóng to của xương được chọn trở lại giá trị mặc định" +msgstr "Hoàn lại tỷ lệ của xương được chọn về các giá trị mặc định" msgctxt "Operator" msgid "Select Constraint Target" -msgstr "Chọn Mục Tiêu Ràng Buộc" +msgstr "Chọn Mục Tiêu của Ràng Buộc" msgid "Select bones used as targets for the currently selected bones" -msgstr "Chọn các xương được dùng làm mục đích cho xương được chọn hiện tại" +msgstr "Chọn các xương dùng làm mục tiêu cho các xương hiện được chọn" msgid "Select all visible bones grouped by similar properties" -msgstr "Chọn hết xương hiển thị được nhóm lại bằng cùng đặc tính" +msgstr "Chọn toàn bộ các xương nhìn thấy, đã được nhóm lại vì có các tính chất tương đồng" + + +msgid "Same collections as the active bone" +msgstr "Cùng một bộ sưu tập như xương đang hoạt động" + + +msgid "Same color as the active bone" +msgstr "Cùng màu với xương đang hoạt động" msgid "All bones affected by active Keying Set" -msgstr "Hết xương được ảnh hưởng bằng Tặp Bức Ảnh Mẫu hoạt động" +msgstr "Toàn bộ các xương bị ảnh hưởng bởi Bộ Khóa đang hoạt động" msgctxt "Operator" msgid "Select Connected" -msgstr "Chọn Được Kết Nối" +msgstr "Chọn cái có Kết Nối" msgid "Select bones linked by parent/child connections under the mouse cursor" -msgstr "Chọn xương được kết nối bởi phụ huynh/con cái ở dưới con trỏ" +msgstr "Chọn các xương kết nối bởi sự liên kết giữa phụ huynh và con cái nằm dưới con trỏ chuột" msgctxt "Operator" @@ -66412,85 +72758,85 @@ msgstr "Chọn Xương Phụ Huynh" msgid "Select bones that are parents of the currently selected bones" -msgstr "Chọn các xương làm phụ huynh của các xượng được chọn hiện tại" +msgstr "Chọn các xương là phụ huynh của các xương được chọn hiện tại" msgctxt "Operator" msgid "Clear Pose Transforms" -msgstr "Xóa Biến Hóa Dạng Đứng" +msgstr "Xóa các Biến Hóa của Tư Thế" msgid "Reset location, rotation, and scaling of selected bones to their default values" -msgstr "Đặt lại vị trí, xoay, và phóng to của xương được chọn đến giá trị mặc định" +msgstr "Hoàn lại vị trí, sự xoay chiều, và tỷ lệ của các xương được chọn về giá trị mặc định" msgctxt "Operator" msgid "Clear User Transforms" -msgstr "Xóa Biến Hóa Người Dùng" +msgstr "Xóa Biến Hóa của Người Dùng" msgid "Reset pose bone transforms to keyframed state" -msgstr "Đặt lại biến hóa xương dạng đứng đến trạng thái bức ảnh mẫu" +msgstr "Hoàn lại các biến hóa của xương tư thế về trạng thái của khung khóa" msgid "Only visible/selected bones" -msgstr "Chỉ xương hiển thị/được chọn" +msgstr "Duy xương nhìn thấy được/đã chọn mà thôi" msgctxt "Operator" msgid "Apply Visual Transform to Pose" -msgstr "Áp Dụng Thị Giác Biến Hóa Với Dạng Đứng" +msgstr "Áp Dụng Biến Hóa Trực Quan thành Tư Thế" msgid "Apply final constrained position of pose bones to their transform" -msgstr "Áp dụng vị trí ràng buộc cuối cùng của xương dạng đứng đến biến hóa của chúng nó" +msgstr "Áp dụng vị trí ràng buộc cuối cùng của xương tư thế thành biến hóa của chúng" msgctxt "Operator" msgid "Disable Add-on" -msgstr "Tắt Đồ Kèm" +msgstr "Tắt Trình Bổ Sung" msgid "Disable an add-on" -msgstr "Tắt một đồ kèm" +msgstr "Tắt một trình bổ sung" msgid "Module name of the add-on to disable" -msgstr "Tên mô đun của đồ kèm để tắt" +msgstr "Tên mô-đun của trình bổ sung để tắt đi" msgctxt "Operator" msgid "Enable Add-on" -msgstr "Bật Đồ Kèm" +msgstr "Bật Trình Bổ Sung" msgid "Enable an add-on" -msgstr "Bật một đồ kèm" +msgstr "Bật một trình bổ sung" msgid "Module name of the add-on to enable" -msgstr "Tên mô đun đồ kèm để bật" +msgstr "Tên mô-đun của trình bổ sung để bật lên" msgid "Display information and preferences for this add-on" -msgstr "Hiển thị thông tin và tùy chọn cho đồ kèm này" +msgstr "Hiển thị thông tin và các cài đặt sở thích cho trình bổ sung này" msgid "Module name of the add-on to expand" -msgstr "Tên mô đun của đồ kèm để mở rộng" +msgstr "Tên mô đun của trình bổ sung để mở rộng" msgctxt "Operator" msgid "Install Add-on" -msgstr "Lắp đặt Đồ Kèm" +msgstr "Lắp Đặt Trình Bổ Sung" msgid "Install an add-on" -msgstr "Lắp đặt một đồ kèm" +msgstr "Lắp đặt một trình bổ sung" msgid "Remove existing add-ons with the same ID" -msgstr "Xóa đồ kèm đang tồn tại cùng ID (tên)" +msgstr "Xóa các trình bổ sung hiện tại có cùng ID (nhận dạng)" msgid "Target Path" @@ -66499,227 +72845,267 @@ msgstr "Đường Dẫn Mục Tiêu" msgctxt "Operator" msgid "Refresh" -msgstr "Nạp Lại" +msgstr "Làm Tươi Lại" msgid "Scan add-on directories for new modules" -msgstr "Quét thư mục đồ kèm để tìm mô đun mới" +msgstr "Rà quét các thư mục của trình bổ sung để tìm những mô-đun mới" msgctxt "Operator" msgid "Remove Add-on" -msgstr "Xóa Đồ Kèm" +msgstr "Xóa Trình Bổ Sung" msgid "Delete the add-on from the file system" -msgstr "Xóa đồ kèm từ hệ thống tập tin" +msgstr "Xóa trình bổ sung khỏi hệ thống tập tin" msgid "Module name of the add-on to remove" -msgstr "Tên mô đun của đồ kèm để xóa" +msgstr "Tên mô-đun của trình bổ sung để xóa" msgid "Show add-on preferences" -msgstr "Hiện tùy chọn đồ kèm" +msgstr "Hiển thị cài đặt sở thích về trình bổ sung" msgctxt "Operator" msgid "Install Template from File..." -msgstr "Lắp đặt bBố Cục Mẫu từ Tập Tin..." +msgstr "Lắp Đặt Bản Mẫu Từ Tập Tin..." msgid "Install an application template" -msgstr "Lắp đặt một bố cục mẫu ứng dụng" +msgstr "Cài đặt một bản mẫu trình ứng dụng" msgid "Remove existing template with the same ID" -msgstr "Xóa bố cục mẫu đang tồn tại có cùng ID" +msgstr "Xóa bản mẫu tồn tại có cùng ID (nhận dạng)" msgctxt "Operator" msgid "Add Asset Library" -msgstr "Thêm Thư Viện Tích Sản" +msgstr "Thêm Thư Viện Tài Sản" msgid "Add a directory to be used by the Asset Browser as source of assets" -msgstr "Thêm một thư mục cho Trình Duyệt Tích Sản được sử dụng làm nguồn tích sản" +msgstr "Thêm thư mục để Trình Duyệt Tài Sản sử dụng làm nguồn tài sản" msgctxt "Operator" msgid "Remove Asset Library" -msgstr "Xoá Tích Sản" +msgstr "Xóa Thư viện Tài sản" msgid "Remove a path to a .blend file, so the Asset Browser will not attempt to show it anymore" -msgstr "Xóa một đường dẫn đến một tập tin .blend, cho Trình Duyệt Tích Sản sẽ không thử hiện nó nữa" +msgstr "Xóa một đường dẫn đến tập tin .blend đi, để cho Trình Duyệt Thảo Tài Sản sẽ không cố công hiển thị nó nữa" msgctxt "Operator" msgid "Register File Association" -msgstr "Quan Hệ Tập tin Đăng Ký" +msgstr "Đăng Ký sự Liên Hệ với Tập Tin" msgid "Use this installation for .blend files and to display thumbnails" -msgstr "Dùng sự lắp đặt này cho tập tin .blend và hiển thị ảnh tem" +msgstr "Dùng sự lắp đặt này cho tập tin .blend và hiển thị hình thu nhỏ" msgctxt "Operator" msgid "Add Auto-Execution Path" -msgstr "Thêm Đường Dẫn TựĐộng-ThựcHành" +msgstr "Thêm Đường Dẫn Thi Hành Tự Động" msgid "Add path to exclude from auto-execution" -msgstr "Thêm đường dẫn để trừ thực hành tự động" +msgstr "Thêm đường dẫn nhằm loại trừ ra khỏi sự thi hành tự động" msgctxt "Operator" msgid "Remove Auto-Execution Path" -msgstr "Xóa Đường Dẫn TựĐộng-ThựcHành" +msgstr "Xóa Đường Dẫn Thi Hành Tự Động" msgid "Remove path to exclude from auto-execution" -msgstr "Xóa đường dẫn để trừ thực hành tự động" +msgstr "Xóa đường dẫn nhằm loại trừ ra khỏi sự thi hành tự động" msgctxt "Operator" msgid "Copy Previous Settings" -msgstr "Chép Cài Đặt Trước" +msgstr "Sao Chép Sắp Đặt Trước Đây" msgid "Copy settings from previous version" -msgstr "Chép cài đặt từ phiên bản trước" +msgstr "Sao chép các sắp đặt từ phiên bản trước" + + +msgctxt "Operator" +msgid "Add Extension Repository" +msgstr "Thêm Kho Lưu Trữ Tiện Ích Mở Rộng" + + +msgid "Add a directory to be used as a local extension repository" +msgstr "Thêm một thư mục sẽ được sử dụng làm kho lưu trữ tiện ích mở rộng cục bộ" + + +msgctxt "Operator" +msgid "Remove Extension Repository" +msgstr "Xóa Kho Lưu Trữ Tiện Ích Mở Rộng" + + +msgid "Remove an extension repository" +msgstr "Xóa kho lưu trữ tiện ích mở rộng" msgctxt "Operator" msgid "Activate Keyconfig" -msgstr "Hoạt Động Cấu Hình Bàn Phím" +msgstr "Kích Hoạt Cấu Hình Phím" msgctxt "Operator" msgid "Export Key Configuration..." -msgstr "Xuất Cấu Hình Bàn Phím..." +msgstr "Xuất Khẩu Cấu Hình Phím..." + + +msgid "Export key configuration to a Python script" +msgstr "Xuất khẩu cấu hình khóa ra một tập lệnh Python" msgid "All Keymaps" -msgstr "Hết Ánh Xạ Bàn Phím" +msgstr "Toàn Thể các Cấu Hình Phím" msgid "Write all keymaps (not just user modified)" -msgstr "Lưu hết ánh xạ phím (không phải chỉ cái nào người dùng được sửa đổi)" +msgstr "Ghi toàn bộ các cấu hình phím (không chỉ cái mà người dùng đã thay đổi mà thôi)" msgctxt "Operator" msgid "Import Key Configuration..." -msgstr "Nhập Cấu Hình Bàn Phím..." +msgstr "Nhập Khẩu Cấu Hình Phím..." + + +msgid "Import key configuration from a Python script" +msgstr "Nhập khẩu cấu hình khóa từ tập lệnh Python" msgid "Keep Original" -msgstr "Giữ Ban Đầu" +msgstr "Duy Trì Bản Gốc" msgid "Keep original file after copying to configuration folder" -msgstr "Giữ tập tin ban đầu sao chép nó vào hồ sơ cấu hình" +msgstr "Duy trì tập tin gốc sau khi sao chép nó vào thư mục cấu hình" msgctxt "Operator" msgid "Remove Key Config" -msgstr "Xóa Cấu Hình Bàn Phím" +msgstr "Xóa Cấu Hình Phím" msgid "Remove key config" -msgstr "Xóa cấu hình bàn phím" +msgstr "Xóa cấu hình phím" msgctxt "Operator" msgid "Test Key Configuration for Conflicts" -msgstr "Kiểm Tra Cấu Hình Bàn Phím Có Mâu Thuẫn" +msgstr "Kiểm Tra Cấu Hình Phím Mâu Thuẫn" msgid "Test key configuration for conflicts" -msgstr "Kiểm tra cấu hình bàn phím có mâu thuẫn hay không" +msgstr "Kiểm tra xem có sự mâu thuẫn nào trong cấu hình phím hay không" msgctxt "Operator" msgid "Add Key Map Item" -msgstr "Thêm Mặt Hàng Ánh Xạ Bàn Phím" +msgstr "Thêm Bố Trí Bàn Phím" msgid "Add key map item" -msgstr "Thêm mặt hàng ánh xạ bàn phím" +msgstr "Thêm bố trí bàn phím" msgctxt "Operator" msgid "Remove Key Map Item" -msgstr "Xóa Mặt Hàng Ánh Xạ Bàn Phím" +msgstr "Xóa Bố Trí Bàn Phím" msgid "Remove key map item" -msgstr "Xóa mặt hàng ánh xạ bàn phím" +msgstr "Xóa bố trí bàn phím" msgid "Item Identifier" -msgstr "Tên Mặt Hàng" +msgstr "Định danh của Phần Tử" msgid "Identifier of the item to remove" -msgstr "Tên của mặt hàng để xóa" +msgstr "Định danh của phần tử để xóa bỏ" msgctxt "Operator" msgid "Restore Key Map Item" -msgstr "Hoàn Lại Mặt Hàng Ánh Xạ Bàn Phím" +msgstr "Khôi Phục Bố Trí Bàn Phím" msgid "Restore key map item" -msgstr "Hoàn lại mặt hàng ánh xạ bàn phím" +msgstr "Khôi phục bố trí bàn phím" msgid "Identifier of the item to restore" -msgstr "Tên của mặt hàng để hoàn lại" +msgstr "Định danh của phần tử khôi phục lại" msgctxt "Operator" msgid "Restore Key Map(s)" -msgstr "Hoàn Lại Ánh Xạ Bàn Phím" +msgstr "Khôi Phục (các) Bố Trí Bàn Phím" msgid "Restore key map(s)" -msgstr "Hoàn lại hết ánh xạ bàn phím" +msgstr "Khôi phục (các) bố trí bàn phím" msgid "Restore all keymaps to default" -msgstr "Hoàn lại hết ánh xạ bàn phím đến mặc định" +msgstr "Khôi phục các bố trí bàn phím mặc định" msgctxt "Operator" msgid "Reset to Default Theme" -msgstr "Hoàn Lại Phong Cách Mặc Định" +msgstr "Hoàn Lại về Kiểu Mẫu Mặc Định" msgid "Reset to the default theme colors" -msgstr "Hoàn lại màu phong cách mặc định" +msgstr "Hoàn lại về các màu kiểu mẫu mặc định" + + +msgctxt "Operator" +msgid "Add Python Script Directory" +msgstr "Thêm Thư Mục Tập Lệnh Python" msgid "Filter Folders" -msgstr "Lọc Hồ Sơ" +msgstr "Thanh Lọc Danh Mục" + + +msgctxt "Operator" +msgid "Remove Python Script Directory" +msgstr "Xóa Thư Mục Tập Lệnh Python" + + +msgid "Index of the script directory to remove" +msgstr "Chỉ Số của thư mục tập lệnh cần xóa" msgctxt "Operator" msgid "Copy Studio Light Settings" -msgstr "Chép lại Cài Đặt Đèn Xưởng" +msgstr "Sao Chép Sắp Đặt Ánh Sáng Studio" msgid "Copy Studio Light settings to the Studio Light editor" -msgstr "Chép Lại cài đặt Đèn Xưởng vào trình biên soạn Đèn Xưởbg" +msgstr "Sao chép sắp đặt về Ánh Sáng Studio sang trình biên soạn Ánh Sáng Studio" msgctxt "Operator" msgid "Install Light" -msgstr "Lắp Đặt Đèn" +msgstr "Lắp Đặt Nguồn Ánh Sáng" msgid "Install a user defined light" -msgstr "Lắp đặt một đèn người dùng được chỉ định" +msgstr "Lắp đặt một nguồn ánh sáng do người dùng định nghĩa" msgid "MatCap" @@ -66727,11 +73113,11 @@ msgstr "Vật Liệu Bắt" msgid "Install custom MatCaps" -msgstr "Lắp đặt Vật Liệu Bắt tùy chọn" +msgstr "Lắp Đặt Ánh Sáng MatCap Tùy Chỉnh" msgid "Install custom HDRIs" -msgstr "Lắp đặt HDRI tùy chọn" +msgstr "Lắp Đặt HDRI tùy chỉnh" msgid "Studio" @@ -66739,51 +73125,60 @@ msgstr "Xưởng" msgid "Install custom Studio Lights" -msgstr "Lắp đặt Đèn Xưởng tùy chọn" +msgstr "Lắp Đặt Ánh Sáng Studio tùy chỉnh" msgctxt "Operator" msgid "Save Custom Studio Light" -msgstr "Lưu Đèn Xưởng Tùy Tạo" +msgstr "Lưu Bố Trí Ánh Sáng Studio Tùy Chỉnh" msgid "Save custom studio light from the studio light editor settings" -msgstr "Lưu đèn xưởng tùy chọn từ cài đặt của trình biên soạn đèn xưởng" +msgstr "Lưu bố trí ánh sáng studio tùy chỉnh từ các sắp đặt của trình biên soạn ánh sáng studio" msgid "Show light preferences" -msgstr "Cho xem tùy chọn đèn" +msgstr "Hiển thị cài đặt sở thích về ánh sáng" msgctxt "Operator" msgid "Uninstall Studio Light" -msgstr "Gỡ Đèn Xưởng" +msgstr "Tháo Lắp Đặt Ánh Sáng Studio" msgid "Delete Studio Light" -msgstr "Xóa Đèn Xưởng" +msgstr "Xóa Bố Trí Ánh Sáng Studio" msgctxt "Operator" msgid "Install Theme..." -msgstr "Lắp Đặt Phong Cách..." +msgstr "Lắp Đặt Kiểu Mẫu ..." msgid "Load and apply a Blender XML theme file" -msgstr "Nhập và áp dụng tập tin phong cách XML Blender" +msgstr "Nạp và áp dụng tập tin kiểu mẫu XML của Blender" msgid "Remove existing theme file if exists" -msgstr "Xóa tập tin phong cách nếu có" +msgstr "Xóa tập tin kiểu mẫu hiện thời nếu có" + + +msgctxt "Operator" +msgid "Remove File Association" +msgstr "Xóa Liên Kết Tập Tin" + + +msgid "Remove this installation's associations with .blend files" +msgstr "Xóa sự liên kết của cài đặt này với các tập tin .blend" msgctxt "Operator" msgid "Add New Cache" -msgstr "Thêm Đệm Chứa Mới" +msgstr "Thêm Bộ Đệm Nhớ Mới" msgid "Add new cache" -msgstr "Thêm đệm chứa mới" +msgstr "Thêm bộ đệm nhớ mới" msgctxt "Operator" @@ -66801,142 +73196,142 @@ msgstr "Nướng" msgctxt "Operator" msgid "Bake All Physics" -msgstr "Nướng Hết Vật Lý" +msgstr "Nướng Toàn Bộ các Vật Lý" msgid "Bake all physics" -msgstr "Nướng hết vật lý" +msgstr "Nướng toàn bộ các vật lý" msgctxt "Operator" msgid "Bake from Cache" -msgstr "Nướng Từ Đệm Chứa" +msgstr "Nướng từ Bộ Nhớ Đệm" msgid "Bake from cache" -msgstr "Nướng từ đệm chứa" +msgstr "Nướng từ bộ đệm nhớ" msgctxt "Operator" msgid "Delete Physics Bake" -msgstr "Xóa Nướng Vật Lý" +msgstr "Xóa Kết Quả Nướng Vật Lý" msgid "Delete physics bake" -msgstr "Xóa nướng vật lý" +msgstr "Xóa kết quả nướng vật lý đi" msgctxt "Operator" msgid "Delete All Physics Bakes" -msgstr "Xóa Hết Nướng Vật Lý" +msgstr "Xóa Toàn Bộ các Kết Quả Nướng Vật Lý" msgid "Delete all baked caches of all objects in the current scene" -msgstr "Xóa hết đệm chứa được nướng của tất cả vật thể trong cảnh hiện tại" +msgstr "Xóa toàn bộ các kết quả nướng lưu trong bộ đệm nhớ của toàn bộ các đối tượng trong cảnh hiện tại" msgctxt "Operator" msgid "Delete Current Cache" -msgstr "Xóa Đệm Chứa Hiện Tại" +msgstr "Xóa Bộ Đệm Nhớ Hiện Tại" msgid "Delete current cache" -msgstr "Xóa đệm chứa hiện tại" +msgstr "Xóa bộ đệm nhớ hiện tại" msgctxt "Operator" msgid "Add Integrator Preset" -msgstr "Thêm Đặt Sẵn Đồ Tích Phân" +msgstr "Thêm Sắp Đặt Sẵn về Máy Tích Hợp" msgid "Add an Integrator Preset" -msgstr "Thêm một đặt sẵn đồ tích phân" +msgstr "Thêm một Sắp Đặt Sẵn về Máy Tích Hợp" msgctxt "Operator" msgid "Add Performance Preset" -msgstr "Thêm Đặt Sẵn Hiệu Suất" +msgstr "Thêm Sắp Đặt Sẵn về Hiệu Suất Hoạt Động" msgid "Add an Performance Preset" -msgstr "Thêm một Đặt Sẵn Hiệu Suất" +msgstr "Thêm một Sắp Đặt Sẵn về Hiệu Suất Hoạt Động" msgctxt "Operator" msgid "Add Sampling Preset" -msgstr "Thêm Đặt Sẵn Mẫu Vật" +msgstr "Thêm Sắp Đặt Sẵn về Lấy Mẫu Vật" msgid "Add a Sampling Preset" -msgstr "Thêm Một Đặt Sẳn Mẫu Vật" +msgstr "Thêm một Sắp Đặt Sẵn về Lấy Mẫu Vật" msgctxt "Operator" msgid "Add Viewport Sampling Preset" -msgstr "Thêm Một Đặt Sẳn Mẫu Vật Màn Chiếu" +msgstr "Thêm Sắp Đặt Sẵn về Lấy Mẫu Cổng Nhìn" msgid "Add a Viewport Sampling Preset" -msgstr "Thêm Một Đặt Sẳn Mẫu Vật Màu Chiếu" +msgstr "Thêm một Sắp Đặt Sẵn về Lấy Mẫu Vật Cổng Nhìn" msgctxt "Operator" msgid "Viewport Render" -msgstr "Kết Xuất Màn Chiếu" +msgstr "Kết Xuất Cổng Nhìn" msgid "Take a snapshot of the active viewport" -msgstr "Chụp ảnh của màn chiếu hoạt động" +msgstr "Chụp nhanh cổng nhìn đang hoạt động" msgid "Render files from the animation range of this scene" -msgstr "Kết xuất tập tin từ phạm vi hoạt hình của cảnh này" +msgstr "Kết xuất các tập tin trực thuộc phạm vi hoạt họa của cảnh này" msgid "Render Keyframes Only" -msgstr "Chỉ kết xuất bức ảnh mẫu" +msgstr "Duy Kết xuất các Khung Hình" msgid "Render only those frames where selected objects have a key in their animation data. Only used when rendering animation" -msgstr "Chỉ kết xuất bức ảnh cho các vật thể được chọn có bức ảnh mẫu trong dữ liệu hoạt hình của chung" +msgstr "Duy kết xuất các khung hình, nơi mà các đối tượng được chọn, có khung khóa trong dữ liệu hoạt họa của chúng" msgid "Render using the sequencer's OpenGL display" -msgstr "Kết xuất bằng màn OpenGL của bộ trình tự" +msgstr "Kết xuất dùng hiển thị OpenGL của trình phối hình" msgid "View Context" -msgstr "Bối Cảnh Màn" +msgstr "Ngữ Cảnh Góc Nhìn" msgid "Use the current 3D view for rendering, else use scene settings" -msgstr "Dùng bối cảnh màn 3D cho kết xuất, hay dùng cài đặt cảnh" +msgstr "Dùng ngữ cảnh góc nhìn 3D hiện tại cho quá trình kết xuất, nếu không, sử dụng những sắp đặt của cảnh" msgid "Write Image" -msgstr "Lưu Ảnh" +msgstr "Ghi Hình Ảnh" msgid "Save rendered the image to the output path (used only when animation is disabled)" -msgstr "Lưu ảnh kết xuất đến đường dẵn xuất (chỉ dùng khi hoạt hình được tắt)" +msgstr "Lưu hình ảnh đã kết xuất ra đường dẫn đầu ra (chỉ sử dụng khi hoạt họa bị tắt đi)" msgctxt "Operator" msgid "Play Rendered Animation" -msgstr "Hát Lại Hoạt Hình Được Kết Xuất" +msgstr "Chơi Hoạt Họa đã Kết Xuất" msgid "Play back rendered frames/movies using an external player" -msgstr "Hát lại bức ảnh/phim kết xuất bằng một bộ hát lại ở ngoài" +msgstr "Chơi lại khung hình/phim đã kết xuất bằng máy chơi ở ngoài" msgctxt "Operator" msgid "Add Render Preset" -msgstr "Thêm Kết Xuất Đặt Sẵn" +msgstr "Thêm Sắp Đặt Sẵn về Kết Xuất" msgid "Add or remove a Render Preset" -msgstr "Thêm hay xóa Kết Xuất Đặt Sẳn" +msgstr "Thêm hay xóa một Sắp Đặt Sẵn về Kết Xuất" msgctxt "Operator" @@ -66945,84 +73340,84 @@ msgstr "Kết Xuất" msgid "Render active scene" -msgstr "Kết xuất cảnh hoạt động" +msgstr "Kết xuất cảnh đang hoạt động" msgid "Render Layer" -msgstr "Lớp Kết Xuất" +msgstr "Tầng Kết Xuất" msgid "Single render layer to re-render (used only when animation is disabled)" -msgstr "Một lớp kết xuất để kết xuất lại (chỉ dùng khi hoạt hình được tắt)" +msgstr "Đơn nhất tầng kết xuất để tái kết xuất (chỉ sử dụng khi hoạt họa được tắt đi)" msgid "Scene to render, current scene if not specified" -msgstr "Kết xuất cảnh nào, kết xuất cảnh hiện tại nếu chưa xác định cảnh" +msgstr "Cảnh để kết xuất. Kết xuất cảnh hiện tại nếu chưa xác định" msgid "Use 3D Viewport" -msgstr "Dùng Màn Chiếu 3D" +msgstr "Dùng Cổng Nhìn 3D" msgid "When inside a 3D viewport, use layers and camera of the viewport" -msgstr "Khi ở trong một màn chiếu 3D, dùng các lớp và máy quay phim của màn chiếu" +msgstr "Khi ở trong một cổng nhìn 3D, dùng các tầng và máy quay phim của cổng nhìn" msgctxt "Operator" msgid "Shutter Curve Preset" -msgstr "Đường Cong Trập Đặt Sẵn" +msgstr "Sắp Đặt Sẵn về Đường Cong cho Cửa Chập" msgid "Set shutter curve" -msgstr "Đặt đường cong trập" +msgstr "Đặt đường cong (đồ thị) cho cửa chập" msgctxt "Operator" msgid "Cancel Render View" -msgstr "Hủy Màn Kết Xuất" +msgstr "Hủy Cảnh Kết Xuất" msgid "Cancel show render view" -msgstr "Hủy hiện màn kết xuất" +msgstr "Hủy (không) hiển thị cảnh kết xuất" msgctxt "Operator" msgid "Show/Hide Render View" -msgstr "Hiện/Ản Màn Kết Xuất" +msgstr "Hiển Thị/Ẩn Giấu Cảnh Kết Xuất" msgid "Toggle show render view" -msgstr "Bật/tắt màn kết xuất" +msgstr "Bật/Tắt hiển thị cảnh kết xuất" msgctxt "Operator" msgid "Bake to Keyframes" -msgstr "Nướng đến Bức Ảnh Mẫu" +msgstr "Nướng thành Khung Khóa" msgid "Bake rigid body transformations of selected objects to keyframes" -msgstr "Nướng biến hóa thân rắn của vật thể được chọn đến bức ảnh mẫu" +msgstr "Nướng những biến hóa thân cứng của đối tượng được chọn thành các khung khóa" msgctxt "Operator" msgid "Connect Rigid Bodies" -msgstr "Kết Nối Thân Rắn" +msgstr "Kết Nối các Thân Cứng" msgid "Create rigid body constraints between selected rigid bodies" -msgstr "Chế tạo ràng buộc thân rắn giữa các thân rắn được chọn" +msgstr "Kiến Tạo ràng buộc thân cứng giữa các thân cứng được chọn" msgid "Type of generated constraint" -msgstr "Loại ràng buộc được chế tạo" +msgstr "Thể loại ràng buộc sinh tạo" msgid "Glue rigid bodies together" -msgstr "Dính hai thân rắn với nhau" +msgstr "Dính kết hai thân cứng lại với nhau" msgid "Constrain rigid bodies to move around common pivot point" -msgstr "Ràng buộc thân rắn để di chuyển quanh cùng một điểm tựa" +msgstr "Ràng buộc các thân cứng để chỉ di chuyển quanh cùng một điểm tựa" msgid "Hinge" @@ -67030,35 +73425,35 @@ msgstr "Bản Lề" msgid "Restrict rigid body rotation to one axis" -msgstr "Ràng buộc xoay thân rắn quanh một trục" +msgstr "Ràng buộc sự xoay chiều của thân cứng quanh một trục" msgid "Slider" -msgstr "Trơn Trượt" +msgstr "Thanh Trượt" msgid "Restrict rigid body translation to one axis" -msgstr "Hạn chế di chuyển thân rắn theo hướng của một trục" +msgstr "Hạn chế dịch chuyển thân cứng trên một trục mà thôi" msgid "Piston" -msgstr "Piton" +msgstr "Pittông" msgid "Restrict rigid body translation and rotation to one axis" -msgstr "Hạn chế di chuyển và xoay thân rắn theo hướng của một trục" +msgstr "Hạn chế dịch chuyển và xoay chiều thân cứng vào một trục" msgid "Restrict translation and rotation to specified axes" -msgstr "Hạn chế di chuyển và xoay theo hướng của các trục được xác định" +msgstr "Hạn chế dịch chuyển và xoay chiều vào các trục đã xác định" msgid "Generic Spring" -msgstr "Lò Xo Tổng Quát" +msgstr "Lực Đàn Hồi Phổ Thông" msgid "Restrict translation and rotation to specified axes with springs" -msgstr "Hạn chế di chuyển và xoay theo các trục được xác định với lò xo" +msgstr "Hạn chế dịch chuyển và xoay chiều theo các trục đã xác định với lực đàn hồi" msgid "Motor" @@ -67066,74 +73461,74 @@ msgstr "Động Cơ" msgid "Drive rigid body around or along an axis" -msgstr "Dắt thân rắn quanh hay theo hướng của một trục" +msgstr "Điều vận thân cứng chung quanh hoặc dọc theo một trục" msgid "Connection Pattern" -msgstr "Gương Mẫu Kết Nối" +msgstr "Mô Hình Kết Nối" msgid "Pattern used to connect objects" -msgstr "Gương mẫu dùng cho kết nối vật thể" +msgstr "Mô hình dùng để kết nối các đối tượng" msgid "Connect selected objects to the active object" -msgstr "Kết nối vật thể được chọn với vật thể hoạt động" +msgstr "Kết nối các đối tượng được chọn với đối tượng đang hoạt động" msgid "Chain by Distance" -msgstr "Chuỗi Tùy Khoảng Cách" +msgstr "Dây Chuyền theo Khoảng Cách" msgid "Connect objects as a chain based on distance, starting at the active object" -msgstr "Kết nối vật thể kiểu chuỗi tùy khoảng cách, bắt đầu tại vật thể hoạt động" +msgstr "Kết nối các đối tượng trong một dây chuyền dựa vào khoảng cách, bắt đầu bằng đối tượng đang hoạt động" msgid "Constraint pivot location" -msgstr "Ràng buộc vị trí điểm tựa" +msgstr "Vị trí điểm tựa của ràng buộc" msgid "Pivot location is between the constrained rigid bodies" -msgstr "Vị trí điểm tựa ở giữa thân rắn được ràng buộc" +msgstr "Vị trí điểm tựa sẽ nằm giữa các thân cứng bị ràng buộc" msgid "Pivot location is at the active object position" -msgstr "Vị trí điểm tựa ở tại vị trí vật thể hoạt động" +msgstr "Vị trí điểm tựa sẽ nằm tại vị trí đối tượng đang hoạt động" msgid "Pivot location is at the selected object position" -msgstr "Vị trí điểm tựa ở tại vị trí vật thể được chọn" +msgstr "Vị trí điểm tựa sẽ nằm tại vị trí đối tượng được chọn" msgctxt "Operator" msgid "Add Rigid Body Constraint" -msgstr "Thêm Ràng Buộc Thân Rắn" +msgstr "Thêm Ràng Buộc Thân Cứng" msgid "Add Rigid Body Constraint to active object" -msgstr "Kèm thêm Ràng Buộc Thân Rắn cho vật thể hoạt động" +msgstr "Thêm Ràng Buộc Thân Cứng vào đối tượng đang hoạt động" msgid "Rigid Body Constraint Type" -msgstr "Loại Ràng Buộc Thân Rắn" +msgstr "Thể Loại Ràng Buộc Thân Cứng" msgctxt "Operator" msgid "Remove Rigid Body Constraint" -msgstr "Xóa Ràng Buộc Thân Rắn" +msgstr "Xóa Ràng Buộc Thân Cứng" msgid "Remove Rigid Body Constraint from Object" -msgstr "Xóa Ràng Buộc Thân Rắn Từ Vật Thể" +msgstr "Xóa Ràng Buộc Thân Cứng khỏi Đối Tượng" msgctxt "Operator" msgid "Calculate Mass" -msgstr "Tính Khối Lượng" +msgstr "Tính Toán Khối Lượng" msgid "Automatically calculate mass values for Rigid Body Objects based on volume" -msgstr "Tự động tính khối lượng cho Vật Thể Rắn Buộc tùy thể tích" +msgstr "Tự động tính toán giá trị khối lượng cho các Đối Tượng Thân Cứng tùy theo thể tích" msgid "Density value (kg/m^3), allows custom value if the 'Custom' preset is used" @@ -67141,28 +73536,28 @@ msgstr "Giá trị tỉ trọng (kg/m^3), nó cho giá trị tùy chọn nếu msgid "Material Preset" -msgstr "Đặt Lại Vật Liệu" +msgstr "Nguyên Vật Liệu Sắp Đặt Sẵn" msgid "Type of material that objects are made of (determines material density)" -msgstr "Vật thể được tạo bằng loại vật liệu nào (được xác định tỉ trọng vật liệu)" +msgstr "Loại nguyên vật liệu mà các đối tượng được tạo nên bởi nó (xác định tỷ trọng của nguyên vật liệu)" msgctxt "Operator" msgid "Add Rigid Body" -msgstr "Thêm Thân Rắn" +msgstr "Thêm Thân Cứng" msgid "Add active object as Rigid Body" -msgstr "Thêm vật thể hoạt động làm Thân Rắn" +msgstr "Thêm đối tượng đang hoạt động vào làm Thân Cứng" msgid "Rigid Body Type" -msgstr "Loại Thân Rắn" +msgstr "Loại Thân Cứng" msgid "Object is directly controlled by simulation results" -msgstr "Vật thể được điều khiển trực tiếp bằng kết qủa mô phỏng" +msgstr "Đối tượng bị điều khiển trực tiếp bởi những kết quả của mô phỏng" msgid "Passive" @@ -67170,94 +73565,94 @@ msgstr "Thụ Động" msgid "Object is directly controlled by animation system" -msgstr "Vật thể được điều khiển trực tiếp bằng hệ thống hoạt hình" +msgstr "Đối tượng bị điều khiển trực tiếp bởi hệ thống hoạt họa" msgctxt "Operator" msgid "Remove Rigid Body" -msgstr "Xóa Thân Rắn" +msgstr "Xóa Thân Cứng" msgid "Remove Rigid Body settings from Object" -msgstr "Xóa Cài Đặt Thân Rắn của Vật Thể" +msgstr "Xóa các sắp đặt Thân Cứng khỏi Đối Tượng" msgctxt "Operator" msgid "Copy Rigid Body Settings" -msgstr "Chép Cài Đặt Thân Rắn" +msgstr "Sao Chép Sắp Đặt về Thân Cứng" msgid "Copy Rigid Body settings from active object to selected" -msgstr "Chép Cài Đặt Thân Rắn từ vật thể hoạt động đến vật thể được chọn" +msgstr "Sao chép các sắp đặt Thân Cứng từ đối tượng đang hoạt động sang đối tượng được chọn" msgctxt "Operator" msgid "Add Rigid Bodies" -msgstr "Thêm Thân Rắn" +msgstr "Thêm các Thân Cứng" msgid "Add selected objects as Rigid Bodies" -msgstr "Thêm các vật thể được chọn làm Thân Rắn" +msgstr "Thêm các đối tượng được chọn vào làm các Thân Cứng" msgctxt "Operator" msgid "Remove Rigid Bodies" -msgstr "Xóa Thân Rắn" +msgstr "Xóa các Thân Cứng" msgid "Remove selected objects from Rigid Body simulation" -msgstr "Xóa các vật thể được chọn làm mô phỏng Thân Rắn" +msgstr "Xóa các đối tượng được chọn khỏi mô phỏng Thân Cứng" msgctxt "Operator" msgid "Change Collision Shape" -msgstr "Đổi Dạng Va Chạm" +msgstr "Đổi Hình Dạng Va Đập" msgid "Change collision shapes for selected Rigid Body Objects" -msgstr "Đổi dạng va chạm cho các Vật Thể Thân Rắn được chọn" +msgstr "Đổi hình dạng va đập cho các Đối Tượng Thân Cứng được chọn" msgid "Rigid Body Shape" -msgstr "Dạng Thân Rắn" +msgstr "Hình Dạng Thân Cứng" msgid "Box-like shapes (i.e. cubes), including planes (i.e. ground planes)" -msgstr "Dạng như hộp (ví dụ lập phương), gồm mặt phẳng (ví dụ mặt phẳng sàn)" +msgstr "Hình dạng tương tự như hình hộp (ví dụ: các hình lập phương), kể cả các bình diện (ví dụ: các bình diện nền)" msgid "A mesh-like surface encompassing (i.e. shrinkwrap over) all vertices (best results with fewer vertices)" -msgstr "Bề mặt như mạng lưới bao quanh (ví dụ thu rút xiết trên) tất cả đỉnh (kết qủa tốt nhất khi có đỉnh ít)" +msgstr "Một bề mặt tương tự như khung lưới chứa đựng (ví dụ: co-bọc bao chùm lên) toàn bộ các điểm đỉnh (kết quả tốt nhất khi số điểm đỉnh ít đi)" msgid "Mesh consisting of triangles only, allowing for more detailed interactions than convex hulls" -msgstr "Mạng lưới chỉ tạo bởi tam giác, cho chỗ cắt nhau có chi tiết hơn vỏ lồi" +msgstr "Thành phần của khung lưới chỉ bao gồm các tam giác mà thôi, cho phép những sự tương tác chi tiết hơn, hơn là những bao lồi" msgid "Compound Parent" -msgstr "Phụ Huynh Hợp" +msgstr "Phụ Huynh Phức Hợp" msgid "Combines all of its direct rigid body children into one rigid object" -msgstr "Gồm hết con cái thân rắn trực tiếp của nó thành một vật thể rắn" +msgstr "Kết hợp toàn bộ các thân cứng con cái trực tiếp vào một đối tượng cứng" msgctxt "Operator" msgid "Add Rigid Body World" -msgstr "Thêm Thế Giới Thân Rắn" +msgstr "Thêm Thế Giới Thân Cứng" msgid "Add Rigid Body simulation world to the current scene" -msgstr "Thêm thế giới mô phỏng Thân Rắn cho cảnh hiện tại" +msgstr "Thêm thế giới mô phỏng Thân Cứng vào cảnh hiện tại" msgctxt "Operator" msgid "Remove Rigid Body World" -msgstr "Xóa Thế Giới Thân Rắn" +msgstr "Xóa Thế Giới Thân Cứng" msgid "Remove Rigid Body simulation world from the current scene" -msgstr "Xóa thế giới mô phỏng Thân Rắn của cảnh hiện tại" +msgstr "Xóa thế giới mô phỏng Thân Cứng của cảnh hiện tại" msgctxt "Operator" @@ -67266,140 +73661,152 @@ msgstr "Xóa Cảnh" msgid "Delete active scene" -msgstr "Xóa Cảnh Hoạt Động" +msgstr "Xóa cảnh đang hoạt động" msgctxt "Operator" msgid "Add Edge Marks to Keying Set" -msgstr "Thêm Ký Hiệu Cho Tập Mẫu Dạng" +msgstr "Thêm Dấu Cạnh vào Bộ Khóa" msgid "Add the data paths to the Freestyle Edge Mark property of selected edges to the active keying set" -msgstr "Thêm các đường dẫn dữ liệu vào đặc tính Ký Hiệu Phong Cách Tự Do của các cạnh được chọn vào tập mẫu dạng hoạt động" +msgstr "Thêm các đường dẫn dữ liệu tới tính chất Dấu Cạnh Phong Cách Tự Do của các cạnh được chọn vào Bộ Khóa đang hoạt động" msgctxt "Operator" msgid "Add Face Marks to Keying Set" -msgstr "Thêm Ký Hiệu Mặt Vào Tập Mẫu Dạng" +msgstr "Thêm Dấu Chỉ Mặt vào Bộ Khóa" msgid "Add the data paths to the Freestyle Face Mark property of selected polygons to the active keying set" -msgstr "Thêm đường dẫn dữ liệu vào đặc tính Ký Hiệu Mặt Phong Cách Tự Do của các đa giác được chọn vào tập mẫu dạng hoạt động" +msgstr "Thêm các đường dẫn dữ liệu vào tính chất Dấu Chỉ Mặt Phong Cách Tự Do của những đa giác được chọn vào Bộ Khóa đang hoạt động" msgctxt "Operator" msgid "Add Alpha Transparency Modifier" -msgstr "Thêm Bộ Điều Chỉnh Độ Đục" +msgstr "Thêm Bộ Điều Chỉnh Độ Trong Alpha" msgid "Add an alpha transparency modifier to the line style associated with the active lineset" -msgstr "Thêm một bộ điều chỉnh độ đục vào phong cách nét của tập nét hoạt động" +msgstr "Thêm một bộ điều chỉnh độ trong alpha vào phong cách của bộ đường nét đang hoạt động" msgctxt "Operator" msgid "Add Line Color Modifier" -msgstr "Thêm Bộ Điều Chỉnh Màu Nét" +msgstr "Thêm Bộ Điều Chỉnh Màu của Đường Nét" msgid "Add a line color modifier to the line style associated with the active lineset" -msgstr "Thêm một bộ điều chỉnh màu nét vào phong cách nét của tập nét hoạt động" +msgstr "Thêm một bộ điều chỉnh màu đường nét vào phong cách của bộ đường nét đang hoạt động" msgctxt "Operator" msgid "Fill Range by Selection" -msgstr "Đầy Phạm Vi Tùy Lựa Chọn" +msgstr "Tính Toán Phạm Vi theo Lựa Chọn" + + +msgid "Fill the Range Min/Max entries by the min/max distance between selected mesh objects and the source object (either a user-specified object or the active camera)" +msgstr "Điền Phạm Vi Tối Thiểu/Tối Đa theo khoảng cách tối thiểu/tối đa giữa các đối tượng khung lưới đã chọn và đối tượng nguồn (đối tượng do người dùng chỉ định hoặc máy quay phim đang hoạt động)" msgid "Name of the modifier to work on" -msgstr "Tên của bộ điều chỉnh để chỉnh" +msgstr "Tên của bộ điều chỉnh để tiến hành" msgid "Type of the modifier to work on" -msgstr "Loại bộ điều chỉnh để chỉnh" +msgstr "Thể loại bộ điều chỉnh để tiến hành" msgid "Color modifier type" -msgstr "Loại bộ điều chỉnh màu" +msgstr "Thể loại bộ điều chỉnh màu sắc" msgid "Alpha modifier type" -msgstr "Loại bộ điều chỉnh độ đục" +msgstr "Thể loại bộ điều chỉnh alpha" msgid "Thickness modifier type" -msgstr "Loại bộ điều chỉnh bề dày" +msgstr "Thể loại bộ điều chỉnh độ dày" msgctxt "Operator" msgid "Add Stroke Geometry Modifier" -msgstr "Thêm Bộ Điều Chỉnh Hình Dạng Nét" +msgstr "Thêm Bộ Điều Chỉnh Hình Học của Nét Vẽ" msgid "Add a stroke geometry modifier to the line style associated with the active lineset" -msgstr "Thêm một bộ điều chỉnh hình dạng nét vào phong cách nét của tập nét hoạt động" +msgstr "Thêm một bộ điều chỉnh hình học nét vẽ vào phong cách của bộ đường nét đang hoạt động" msgctxt "Operator" msgid "Add Line Set" -msgstr "Thêm Tập Nét" +msgstr "Thêm Bộ Đường Nét" msgid "Add a line set into the list of line sets" -msgstr "Thêm một tập nét trong danh sách của tập nét" +msgstr "Thêm một bộ đường nét vào danh sách của các bộ đường nét" msgctxt "Operator" msgid "Copy Line Set" -msgstr "Chép Tập Nét" +msgstr "Sao Chép Bộ Đường Nét" + + +msgid "Copy the active line set to the internal clipboard" +msgstr "Sao chép bộ đường nét đang hoạt động vào bảng nhớ tạm nội bộ" msgctxt "Operator" msgid "Move Line Set" -msgstr "Di Chuyên ̉ Tập Nét" +msgstr "Di Chuyển Bộ Đường Nét" msgid "Change the position of the active line set within the list of line sets" -msgstr "Đổi vị trí của tập nét hoạt động trong danh sách của tập nét" +msgstr "Đổi vị trí của bộ đường nét đang hoạt động nội trong danh sách của các bộ đường nét" msgid "Direction to move the active line set towards" -msgstr "Hướng để di chuyển nét hoạt động" +msgstr "Hướng để di chuyển bộ đường nét đang hoạt động tới" msgctxt "Operator" msgid "Paste Line Set" -msgstr "Dán Tập Nét" +msgstr "Dán Bộ Đường Nét" + + +msgid "Paste the internal clipboard content to the active line set" +msgstr "Dán nội dung của bảng nhớ tạm nội bộ vào bộ đường nét đang hoạt động" msgctxt "Operator" msgid "Remove Line Set" -msgstr "Xóa Tập Nét" +msgstr "Xóa Bộ Đường Nét" msgid "Remove the active line set from the list of line sets" -msgstr "Xóa tập nét hoạt động từ danh sách tập nét" +msgstr "Xóa bộ đường nét đang hoạt động khỏi danh sách của các bộ đường nét" msgctxt "Operator" msgid "New Line Style" -msgstr "Phong Cách Nét Mới" +msgstr "Phong Cách của Nét Mới" msgid "Create a new line style, reusable by multiple line sets" -msgstr "Chế tạo một phong cách nét mới, nhiều tập nét có thể dùng lại" +msgstr "Kiến Tạo một phong cách nét mới, có thể được tái sử dụng bởi nhiều bộ đường nét khác" msgid "Duplicate the modifier within the list of modifiers" -msgstr "Sao chép bộ điều chỉnh trong danh sách bộ điều chỉnh" +msgstr "Nhân đôi bộ điều chỉnh trong danh sách" msgctxt "Operator" msgid "Move Modifier" -msgstr "Di Chuyển Sụ Sửa Đổi" +msgstr "Di Chuyển Bộ Điều Chỉnh" msgid "Move the modifier within the list of modifiers" -msgstr "Di chuyển bộ điều chỉnh trong danh sách bộ điều chỉnh" +msgstr "Di chuyển bộ điều chỉnh trong danh sách" msgid "Direction to move the chosen modifier towards" @@ -67407,115 +73814,115 @@ msgstr "Hướng để di chuyển bộ điều chỉnh đến" msgid "Remove the modifier from the list of modifiers" -msgstr "Xóa bộ điều chỉnh từ danh sách bộ điều chỉnh" +msgstr "Xóa bộ điều chỉnh khỏi danh sách" msgctxt "Operator" msgid "Add Freestyle Module" -msgstr "Thêm Mô Đun Phong Cách Tự Do" +msgstr "Thêm Mô-Đun PCTD" msgid "Add a style module into the list of modules" -msgstr "Thêm một mô đun trong danh sách mô đun" +msgstr "Thêm một mô-đun phong cách vào trong danh sách các mô-đun" msgctxt "Operator" msgid "Move Freestyle Module" -msgstr "Di Chuyển Mô Đun Phong Cách Tự Do" +msgstr "Di Chuyển Mô-Đun PCTD" msgid "Change the position of the style module within in the list of style modules" -msgstr "Đổi vị trí của mô đun phong cách trong danh sách mô đun phong cách" +msgstr "Đổi vị trí của mô-đun phong cách trong danh sách" msgid "Direction to move the chosen style module towards" -msgstr "Hướng để di chuyển mô đun phong cách" +msgstr "Hướng để di chuyển mô-đun phong cách đã chọn tới" msgctxt "Operator" msgid "Open Style Module File" -msgstr "Mở Tập Tin Mô Đun Phong Cách" +msgstr "Mở Tập Tin Mô-Đun Phong Cách" msgid "Open a style module file" -msgstr "Mở một tập tin mô đun phong cách" +msgstr "Mở một tập tin mô-đun phong cách" msgid "Make internal" -msgstr "Làm nột bộ" +msgstr "Biến thành nội bộ" msgid "Make module file internal after loading" -msgstr "Làm mô đun nội bộ sau nhập" +msgstr "Biến tập tin mô-đun trở thành bộ phận nội bộ sau khi nạp song" msgctxt "Operator" msgid "Remove Freestyle Module" -msgstr "Xóa Mô Đun Phong Cách" +msgstr "Xóa Mô-Đun PCTD" msgid "Remove the style module from the stack" -msgstr "Xóa mô đun phong cách từ xếp đống" +msgstr "Xóa mô-đun phong cách từ ngăn xếp" msgctxt "Operator" msgid "Create Freestyle Stroke Material" -msgstr "Chế Tạo Vật Liệu Nét Phong Cách Tự Do" +msgstr "Kiến Tạo Nguyên Vật Liệu Nét PCTD" msgid "Create Freestyle stroke material for testing" -msgstr "Chế tạo vật liệu nét Phong Cách Tự Do cho thử" +msgstr "Kiến Tạo nguyên vật liệu nét PCTD để thử nghiệm" msgctxt "Operator" msgid "Add Line Thickness Modifier" -msgstr "Thêm Bộ Điều Chỉnh Bề Rộng Nét" +msgstr "Thêm Bộ Điều Chỉnh Độ Dày Nét" msgid "Add a line thickness modifier to the line style associated with the active lineset" -msgstr "Thêm một bộ điều chỉnh bề rộng cho phong cách nét của tập hoạt động" +msgstr "Thêm một bộ điều chỉnh độ dày đường nét vào phong cách của bộ đường nét đang hoạt động" msgctxt "Operator" msgid "Add Grease Pencil Brush Preset" -msgstr "Thêm Đặt Sẵn Bút Lông Bút Sáp" +msgstr "Thêm Sắp Đặt Sẵn về Đầu Bút Chì Dầu" msgid "Add or remove grease pencil brush preset" -msgstr "Thêm hay xóa một đặt sẵn bút lông bút sáp" +msgstr "Thêm hoặc xóa sắp đặt sẵn về đầu bút cho Bút Chì Dầu" msgctxt "Operator" msgid "Add Grease Pencil Material Preset" -msgstr "Thêm Đặt Sẵn Vật Liệu Bút Sáp" +msgstr "Thêm Sắp Đặt Trước về Nguyên Vật Liệu của Bút Chì Dầu" msgid "Add or remove grease pencil material preset" -msgstr "Thêm hay xóa đặt sẵn vật liệu bút sáp" +msgstr "Thêm hoặc xóa sắp đặt trước về nguyên vật liệu của Bút Chì Dầu" msgid "Bake the active view layer lighting" -msgstr "Nướng ánh sáng của lớp màn chiếu hoạt động" +msgstr "Nướng ánh sáng của tầng góc nhìn đang hoạt động" msgid "Bake both irradiance grids and reflection cubemaps" -msgstr "Nướng cả đồ thị sự rọi và bản đồ lập phương phản xạ" +msgstr "Nướng cả hai khung lưới đồ thị chiếu sáng và bản đồ lập phương phản quang" msgid "Dirty Only" -msgstr "Chỉ Dơ" +msgstr "Duy Dấu Bẩn" msgid "Only bake light probes that are marked as dirty" -msgstr "Chỉ nướng ánh sáng kế được ký dấu là dơ" +msgstr "Duy nướng các điểm thăm dò ánh sáng được đánh dấu là bẩn (đã sửa đổi) mà thôi" msgid "Cubemaps Only" -msgstr "Chỉ Bản Đồ Lập Phương" +msgstr "Duy Bản Đồ Lập Phương" msgid "Try to only bake reflection cubemaps if irradiance grids are up to date" -msgstr "Thử chỉ nướng bản đồ lập phương phản xạ nếu đồ thị sự rọi đã nâng cấp rồi" +msgstr "Thử nghiệm chỉ nướng bản đồ lập phương phản quang nếu khung lưới đồ thị chiếu sáng đã được cập nhật" msgctxt "Operator" @@ -67524,7 +73931,12 @@ msgstr "Cảnh Mới" msgid "Add new scene by type" -msgstr "Thêm cảnh mới tùy loại" +msgstr "Thêm cảnh mới theo thể loại" + + +msgctxt "Scene" +msgid "Type" +msgstr "Thể Loại" msgctxt "Scene" @@ -67533,74 +73945,89 @@ msgstr "Mới" msgid "Add a new, empty scene with default settings" -msgstr "Thêm một cảnh mới, trống rỗng có cài đặt mặc định" +msgstr "Thêm một cảnh mới, trống, với các sắp đặt mặc định" + + +msgctxt "Scene" +msgid "Copy Settings" +msgstr "Sao Chép các Sắp Đặt" msgid "Add a new, empty scene, and copy settings from the current scene" -msgstr "Thêm một cảnh mới, trống rỗng và chép lại cài đặt từ cảnh hiện tại" +msgstr "Thêm một cảnh mới, trống, và sao chép các sắp đặt từ cảnh hiện tại" + + +msgctxt "Scene" +msgid "Linked Copy" +msgstr "Bản Sao Kết Nối" msgid "Link in the collections from the current scene (shallow copy)" -msgstr "Liên kết trong sưu tập từ cảnh hiện tại (chép cạng)" +msgstr "Kết nối các bộ sưu tập từ cảnh hiện tại (bản sao hờ)" + + +msgctxt "Scene" +msgid "Full Copy" +msgstr "Bản Sao Toàn Phần" msgid "Make a full copy of the current scene" -msgstr "Chép toàn bộ cảnh hiện tại" +msgstr "Tạo bản sao toàn phần của cảnh hiện tại" msgid "Add new scene by type in the sequence editor and assign to active strip" -msgstr "Thêm một cảnh mới tùy loại trong trình biên soạn trình tự và chỉ định đến đoạn hoạt động" +msgstr "Thêm cảnh mới, theo thể loại, trong trình phối hình và ấn định vào dải đang hoạt động" msgid "Copy Settings" -msgstr "Chép Cài Đặt" +msgstr "Sao Chép các Sắp Đặt" msgid "Linked Copy" -msgstr "Chép Được Liên Kết" +msgstr "Bản Sao Kết Nối" msgid "Full Copy" -msgstr "Chép Toàn Bộ" +msgstr "Sao Chép Toàn Phần" msgctxt "Operator" msgid "Add Render View" -msgstr "Thêm Màn Kết Xuất" +msgstr "Thêm Cảnh Kết Xuất" msgid "Add a render view" -msgstr "Thêm một màn kết xuất" +msgstr "Thêm một cảnh kết xuất" msgctxt "Operator" msgid "Remove Render View" -msgstr "Xóa Màn Kết Xuất" +msgstr "Xóa Cảnh Kết Xuất" msgid "Remove the selected render view" -msgstr "Xóa màn kết xuất được chọn" +msgstr "Xóa cảnh kết xuất đã chọn" msgctxt "Operator" msgid "Add View Layer" -msgstr "Thêm Lớp Màn Chiếu" +msgstr "Thêm Tầng Góc Nhìn" msgid "Add a view layer" -msgstr "Thêm một lớp màn chiếu" +msgstr "Thêm một tầng góc nhìn" msgid "Add a new view layer" -msgstr "Thêm một lớp màn chiếu" +msgstr "Thêm một tầng góc nhìn" msgid "Copy settings of current view layer" -msgstr "Chép cài đặt của màn lớp hiện tại" +msgstr "Sao chép các sắp đặt của tầng góc nhìn hiện tại" msgid "Add a new view layer with all collections disabled" -msgstr "Thêm một màn lớp mới mà có hết sưu tập bị tắt" +msgstr "Cho thêm một tầng góc nhìn vào với toàn bộ các bộ sưu tập bị vô hiệu hóa (tắt đi)" msgctxt "Operator" @@ -67609,38 +74036,38 @@ msgstr "Thêm AOV" msgid "Add a Shader AOV" -msgstr "Thêm một AOV Bộ Tô Sắc" +msgstr "Thêm một Bộ Tô Bóng AOV" msgctxt "Operator" msgid "Add Lightgroup" -msgstr "Thêm Nhóm Đèn" +msgstr "Thêm Nhóm Ánh Sáng" msgid "Add a Light Group" -msgstr "Thêm một Nhóm Đèn" +msgstr "Thêm một Nhóm Ánh Sáng" msgid "Name of newly created lightgroup" -msgstr "Tên của nhóm đèn mới được chế tạo" +msgstr "Tên của nhóm ánh sáng mới kiến tạo" msgctxt "Operator" msgid "Add Used Lightgroups" -msgstr "Thêm Nhóm Đèn Được Dùng" +msgstr "Thêm các Nhóm Ánh Sáng đã Sử Dụng" msgid "Add all used Light Groups" -msgstr "Thêm hết Nhóm Đèn được dùng" +msgstr "Thêm toàn thể các Nhóm Ánh Sáng đã sử dụng" msgctxt "Operator" msgid "Remove View Layer" -msgstr "Xóa Lớp Màn Chiếu" +msgstr "Xóa Tầng Góc Nhìn" msgid "Remove the selected view layer" -msgstr "Xóa lớp màn chiếu được chọn" +msgstr "Xóa tầng góc nhìn được chọn" msgctxt "Operator" @@ -67649,34 +74076,34 @@ msgstr "Xóa AOV" msgid "Remove Active AOV" -msgstr "Xóa AOV Hoạt Động" +msgstr "Xóa AOV đang Hoạt Động" msgctxt "Operator" msgid "Remove Lightgroup" -msgstr "Xóa NhómĐèn" +msgstr "Xóa Nhóm Ánh Sáng" msgid "Remove Active Lightgroup" -msgstr "Xóa NhómĐèn Hoạt Động" +msgstr "Xóa Nhóm Ánh Sáng đang Hoạt Động" msgctxt "Operator" msgid "Remove Unused Lightgroups" -msgstr "Xóa Các NhómĐèn Không Sử Dụng" +msgstr "Xóa các Nhóm Ánh Sáng Không Sử Dụng Đến" msgid "Remove all unused Light Groups" -msgstr "Xoá hết Nhóm Đèn không sử dụng" +msgstr "Xóa toàn bộ các Nhóm Ánh Sáng (đèn/nguồn sáng) không dùng đến" msgctxt "Operator" msgid "Handle Area Action Zones" -msgstr "Khu Vực Hành Động Tay Cầm" +msgstr "Quản lý các Vùng của Khu Vực Hành Động" msgid "Handle area action zones for mouse actions/gestures" -msgstr "Khu vực hành động cho hành động/cử chỉ chuột" +msgstr "Quản lý các khu vực hành động dành cho các hành động của chuột hoặc các cử chỉ" msgid "Modifier state" @@ -67685,393 +74112,398 @@ msgstr "Trạng thái bộ điều chỉnh" msgctxt "Operator" msgid "Cancel Animation" -msgstr "Hủy Hoạt Hình" +msgstr "Hủy Hoạt Họa" msgid "Cancel animation, returning to the original frame" -msgstr "Hủy hoạt hình, trở lại bức ảnh ban đầu" +msgstr "Hủy hoạt họa, quay trở lại khung hình ban đầu" msgid "Restore Frame" -msgstr "Hoàn Lại Bức Ảnh" +msgstr "Quay Trở Lại Khung Hình" msgid "Restore the frame when animation was initialized" -msgstr "Hoàn lại bức ảnh khi hoạt hình khởi động" +msgstr "Quay trở lại khung hình sau khi hoạt họa đã khởi động" msgctxt "Operator" msgid "Play Animation" -msgstr "Hát Hoạt Hình" +msgstr "Chơi Hoạt Họa" msgid "Play animation" -msgstr "Hát hoạt hình" +msgstr "Chơi hoạt họa" msgid "Play in Reverse" -msgstr "Hát Ngược Chiều" +msgstr "Chơi Ngược Chiều" msgid "Animation is played backwards" -msgstr "Hát hoạt hình ngược chiều" +msgstr "Hoạt họa sẽ được chơi ngược lại" msgid "Sync" -msgstr "Đồng Bộ" +msgstr "Đồng Bộ Hóa" msgid "Drop frames to maintain framerate" -msgstr "Nhảy qua bức ảnh cho giữ nguyên tốc độ bức ảnh" +msgstr "Bỏ qua các khung hình để duy trì tần số khung hình" msgctxt "Operator" msgid "Animation Step" -msgstr "Bước Hoạt Hình" +msgstr "Bước Hoạt Họa" msgid "Step through animation by position" -msgstr "Bước tới trong hoạt hình bằng vị trí" +msgstr "Lần bước qua đoạn hoạt họa dùng vị trí" msgctxt "Operator" msgid "Close Area" -msgstr "Đóng Khu Vực" +msgstr "Đóng Khu Vực Lại" msgid "Close selected area" -msgstr "Đóng khu vực được chọn" +msgstr "Đóng khu vực đã chọn lại" msgctxt "Operator" msgid "Duplicate Area into New Window" -msgstr "Bản Sao Khu Vực Thành Cửa Sổ Mới" +msgstr "Nhân Đôi Địa Phận thành Cửa Sổ Mới" msgid "Duplicate selected area into new window" -msgstr "Bản sao khu vực được chọn thành cửa sổ mới" +msgstr "Nhân đôi khu vực được chọn thành cửa sổ mới" msgctxt "Operator" msgid "Join Area" -msgstr "Kết Nối Khu Vực" +msgstr "Hội Nhập Địa Phận" msgid "Join selected areas into new window" -msgstr "Kết nối khu vực được chọn thành cửa sổ mới " +msgstr "Hội nhập các khu vực được chọn vào thành cửa sổ mới" msgctxt "Operator" msgid "Move Area Edges" -msgstr "Di Chuyển Cạnh Khu Vực" +msgstr "Di Chuyển các Cạnh của Khu Vực" msgid "Move selected area edges" -msgstr "Di chuyển cạnh khu vực được chọn" +msgstr "Di chuyển các cạnh của khu vực được chọn" msgctxt "Operator" msgid "Area Options" -msgstr "Tùy Chọn Khu Vực" +msgstr "Tùy Chọn về Khu Vực" msgid "Operations for splitting and merging" -msgstr "Thao tác cho chẻ và gồm" +msgstr "Các thao tác để tách phân và hòa nhập" msgctxt "Operator" msgid "Split Area" -msgstr "Chẻ Khu Vực" +msgstr "Tách Phân Khu Vực" msgid "Split selected area into new windows" -msgstr "Chẻ các khu vực được chọn thành cửa sổ mới" +msgstr "Tách phân khu vực được chọn thành các cửa sổ mới" msgctxt "Operator" msgid "Swap Areas" -msgstr "Trao Đổi Khu Vực" +msgstr "Tráo Đổi Khu Vực" msgid "Swap selected areas screen positions" -msgstr "Trao đổi vị trí của khu vực được chọn " +msgstr "Tráo đổi vị trí màn hình của những khu vực được chọn" msgctxt "Operator" msgid "Back to Previous Screen" -msgstr "Trở Lại Màn Trước" +msgstr "Trở Lại Màn Hình Trước" msgid "Revert back to the original screen layout, before fullscreen area overlay" -msgstr "Trở lại bố trí màn ban đầu, trước áp dụng lớp che khu vực toàn màn" +msgstr "Quay lại bố trí màn hình ban đầu, trước khi hiển thị lớp lồng trên toàn màn hình" msgctxt "Operator" msgid "Delete Screen" -msgstr "Xóa Màn" +msgstr "Xóa Màn Hình" msgid "Delete active screen" -msgstr "Xóa màn hoạt động" +msgstr "Xóa màn hình đang hoạt động" msgctxt "Operator" msgid "Show Drivers Editor" -msgstr "Hiện Trình Biên Soạn Điều Vận" +msgstr "Hiển Thị Trình Biên Soạn Điều Vận" msgid "Show drivers editor in a separate window" -msgstr "Hiện trình biên soạn điều vận trong một cửa sổ riêng" +msgstr "Hiển thị trình biên soạn điều vận trong một cửa sổ riêng biệt" msgctxt "Operator" msgid "Jump to Endpoint" -msgstr "Nhảy Đến Điểm Kết Thúc" +msgstr "Nhảy đến Điểm Kết" msgid "Jump to first/last frame in frame range" -msgstr "Nhảy đến bức ảnh đầu/cuối trong phạm vi bức ảnh" +msgstr "Nhảy đến khung ảnh đầu/cuối trong phạm vi khung hình" msgid "Last Frame" -msgstr "Bức Ảnh Cuối" +msgstr "Khung Hình Cuối" msgid "Jump to the last frame of the frame range" -msgstr "Nhảy đến bức ảnh cuối của phạm vi bức ảnh" +msgstr "Nhảy đến khung hình cuối cùng của phạm vi khung hình" msgctxt "Operator" msgid "Frame Offset" -msgstr "Dịch Bức Ảnh" +msgstr "Dịch Chuyển Khung Hình" msgid "Move current frame forward/backward by a given number" -msgstr "Di chuyển bức ảnh hiện tại tới/lui bằng cách số bức ảnh được xác định" +msgstr "Dịch chuyển khung hình hiện tại về phía trước/về phía sau bằng một số đã cho" msgctxt "Operator" msgid "Expand/Collapse Header Menus" -msgstr "Nở Rộng/Tóp Danh Bạ Đầu" +msgstr "Mở Rộng/Thu Lại các Trình Đơn Tiêu Đề" msgid "Expand or collapse the header pulldown menus" -msgstr "Nở rống hay tóp lại đầu danh bạ kéo xuống" +msgstr "Mở rộng hoặc thu lại các trình đơn thả xuống từ thanh tiêu đề" msgctxt "Operator" msgid "Show Info Log" -msgstr "Hiện Nhật Ký Thông Tin" +msgstr "Hiển Thị Thông Tin Nhật Ký" msgid "Show info log in a separate window" -msgstr "Hiện nhật ký thông tin trong một cửa sổ riêng" +msgstr "Hiển thị thông tin nhật ký trong một cửa sổ riêng biệt" msgctxt "Operator" msgid "Jump to Marker" -msgstr "Nhảy Đến Ký Hiệu" +msgstr "Nhảy đến Dấu Mốc" msgid "Jump to previous/next marker" -msgstr "Nhảy đến ký hiệu trước/tiếp" +msgstr "Nhảy đến dấu mốc trước đây/tiếp theo" msgid "Next Marker" -msgstr "Ký Hiệu Tiếp" +msgstr "Dấu Mốc Tiếp Theo" msgctxt "Operator" msgid "New Screen" -msgstr "Màn Mới" +msgstr "Màn Hình Mới" msgid "Add a new screen" -msgstr "Thêm màn mới" +msgstr "Thêm màn hình mới" msgctxt "Operator" msgid "Redo Last" -msgstr "Làm Lại Cuối Cùng" +msgstr "Làm Lại Hành Động Trước Đây" msgid "Display parameters for last action performed" -msgstr "Hiển thị tham số cho hành động cuối được thực hành" +msgstr "Hiển thị các tham số của thao tác thi hành sau cùng (trước đây)" msgctxt "Operator" msgid "Region Alpha" -msgstr "Độ Đục Khu Vực" +msgstr "Apha của Vùng" msgid "Blend in and out overlapping region" -msgstr "Pha trộn vào và ra vùng che lấn" +msgstr "Hòa trộn đoạn tiến vào/bước ra của vùng đè gối lên nhau" + + +msgctxt "Operator" +msgid "Region" +msgstr "Vùng" msgid "Display region context menu" -msgstr "Hiển thị danh bạ bối cảnh vùng" +msgstr "Hiển thị trình đơn ngữ cảnh vùng" msgctxt "Operator" msgid "Flip Region" -msgstr "Lật Vùng" +msgstr "Đảo Chiều Vùng" msgid "Toggle the region's alignment (left/right or top/bottom)" -msgstr "Bật/tắt sắp xếp của vùng (trái/phải hay trên/dưới)" +msgstr "Đảo chiều sự căn chỉnh của vùng (trái/phải hoặc trên/dưới)" msgctxt "Operator" msgid "Toggle Quad View" -msgstr "Bật/Tắt Màn Chiếu Tư" +msgstr "Bật/Tắt Bốn Góc Nhìn" msgid "Split selected area into camera, front, right, and top views" -msgstr "Chẻ vùng chọn thành màn nhìn máy quay phim, phía trước, phía phải, và phía trên" +msgstr "Tách phân khu vực đã chọn thành các góc nhìn: qua máy quay phim, đằng trước, phải và trên xuống" msgctxt "Operator" msgid "Scale Region Size" -msgstr "Phóng To Kích Cỡ Vùng" +msgstr "Đổi Tỷ Lệ Kích Thước của Vùng" msgid "Scale selected area" -msgstr "Phóng to vùng được chọn" +msgstr "Đổi tỷ lệ khu vực được chọn" msgctxt "Operator" msgid "Toggle Region" -msgstr "Bật/Tắt Vùng" +msgstr "Bật/Tắt Vùng/Khu Vực" msgid "Hide or unhide the region" -msgstr "Ẩn hay hiện vùng" +msgstr "Ẩn giấu hoặc hiển thị vùng/khu vực" msgid "Type of the region to toggle" -msgstr "Loại vùng để bặt/tắt" +msgstr "Thể loại vùng để bật/tắt" msgctxt "Operator" msgid "Repeat History" -msgstr "Làm Lại Lịch Sử" +msgstr "Lịch Sử Nhắc Lại" msgid "Display menu for previous actions performed" -msgstr "Hiển thị danh bạ cho các hành động đã thực hành trước" +msgstr "Hiển thị trình đơn cho các hành động đã thi hành trước đây" msgctxt "Operator" msgid "Repeat Last" -msgstr "Làm Lại Cuối" +msgstr "Nhắc Lại bước Sau Cùng" msgid "Repeat last action" -msgstr "Làm lại hành động cuối" +msgstr "Nhắc lại hành động cuối cùng" msgctxt "Operator" msgid "Toggle Maximize Area" -msgstr "Bật/Tắt Cực Đại Hóa Diện Tích" +msgstr "Bật/Tắt Tối Đa Hóa Diện Tích" msgid "Toggle display selected area as fullscreen/maximized" -msgstr "Bật/tắt hiển thị khu vực được chọn làm toàn màn/lớn nhất" +msgstr "Bật/Tắt hiển thị vùng được chọn giữa hai chế độ: toàn màn hình/tối đa" msgid "Hide Panels" -msgstr "Ẩn Bảng" +msgstr "Ẩn Giấu các Bảng" msgid "Hide all the panels" -msgstr "Ẩn hết bảng" +msgstr "Ẩn giấu toàn bộ các bảng" msgctxt "Operator" msgid "Set Screen" -msgstr "Đạt Màn" +msgstr "Đặt Màn Hình" msgid "Cycle through available screens" -msgstr "Chu trình qua các màn thì có" +msgstr "Luân chuyển qua các màn hình vốn có" msgctxt "Operator" msgid "Save Screenshot" -msgstr "Lưu Ảnh Màn" +msgstr "Chụp Màn Hình" msgid "Capture a picture of the whole Blender window" -msgstr "Chụp một ảnh của toàn bộ cửa sổ Blender" +msgstr "Chụp ảnh toàn bộ cửa sổ Blender" msgctxt "Operator" msgid "Save Screenshot (Editor)" -msgstr "Lưu Chụp Ảnh Màn (Trình Biên Soạn)" +msgstr "Lưu Ảnh Chụp Màn Hình (Trình Biên Soạn)" msgid "Capture a picture of an editor" -msgstr "Chụp một ảnh của một bệ biên tập" +msgstr "Chụp ảnh của một trình biên soạn" msgctxt "Operator" msgid "Cycle Space Context" -msgstr "Chu Trình Bối Cảnh Không Gian" +msgstr "Luân Chuyển Ngữ Cảnh Không Gian" msgid "Cycle through the editor context by activating the next/previous one" -msgstr "Chu trình quanh bối cảnh trình biên soạn bằng hoạt động bối cảnh tiếp/trước" +msgstr "Luân chuyển qua ngữ cảnh trình biên soạn bằng cách kích hoạt cái tiếp theo/trước đây" msgid "Direction to cycle through" -msgstr "Hướng để chu trình" +msgstr "Phương hướng để luân chuyển" msgctxt "Operator" msgid "Cycle Space Type Set" -msgstr "Đặt Lọai Không Gian Chu Trình" +msgstr "Luân Chuyển Bộ Phong Cách Không Gian" msgid "Set the space type or cycle subtype" -msgstr "Đặt loại không gian hay chu trình hạ loại" +msgstr "Đặt kiểu không gian hoặc luân chuyển qua các kiểu bậc thứ" msgctxt "Operator" msgid "Clean Up Space Data" -msgstr "Làm Sạch Dữ Lịệu Không Gian" +msgstr "Dọn Dẹp Dữ Liệu Không Gian" msgid "Remove unused settings for invisible editors" -msgstr "Xoá cài đặt không dùng cho trình biên soạn ẩn" +msgstr "Xóa các sắp đặt không dùng đến đối với các trình biên soạn không nhìn thấy được" msgctxt "Operator" msgid "Open Preferences..." -msgstr "Mở Tùy Chọn..." +msgstr "Mở Cài Đặt Sở Thích..." msgid "Edit user preferences and system settings" -msgstr "Biên tập cài đặt tùy chọn của người dùng và hệ thống" +msgstr "Biên soạn các cài đặt sở thích của người dùng và sắp đặt của hệ thống" msgid "Section to activate in the Preferences" -msgstr "Phần nào cho kích động trong Tùy Chọn" +msgstr "Phần để kích hoạt trong Cài Đặt Sở Thích" msgid "Themes" -msgstr "Phong Cách" +msgstr "Kiểu Mẫu" msgid "Editing" -msgstr "Biên Tập" +msgstr "Biên Soạn" msgid "Add-ons" -msgstr "Đồ Kèm" +msgstr "Trình Bổ Sung" msgid "Keymap" -msgstr "Ánh Xạ Phím" +msgstr "Bố Trí Phím" msgid "File Paths" @@ -68079,233 +74511,258 @@ msgstr "Đường Dẫn Tập Tin" msgid "Extensions" -msgstr "Đuôi Tập Tin" +msgstr "Phần Mở Rộng/Định Dạng" msgid "Experimental" -msgstr "Thí Nghiệm" +msgstr "Thử Nghiệm" msgctxt "Operator" msgid "Cycle Workspace" -msgstr "Chu Trình Công Trường" +msgstr "Luân Chuyển Không Gian Làm Việc" msgid "Cycle through workspaces" -msgstr "Chu trình qua công trường" +msgstr "Luân chuyển qua các không gian làm việc" msgctxt "Operator" msgid "Execute a Python Preset" -msgstr "Thực Hành Một Đặt Sẵn Python" +msgstr "Thi hành một Sắp Đặt Sẵn Python" + + +msgid "Load a preset" +msgstr "Nạp một sắp đặt sẵn" msgid "Menu ID Name" -msgstr "Tên ID Danh Bạ" +msgstr "Tên ID của Trình Đơn" msgid "ID name of the menu this was called from" -msgstr "Tên ID của danh bạ nào được gọi này" +msgstr "Tên ID của trình đơn mà cái này được gọi" msgctxt "Operator" msgid "Run Python File" -msgstr "Chạy Tập Tin Python" +msgstr "Thi hành Tập Python" msgid "Run Python file" -msgstr "Chạy tập tin Python" +msgstr "Thi hành tập tin Python" msgctxt "Operator" msgid "Reload Scripts" -msgstr "Nhập Lại Văn Thảo" +msgstr "Nạp Lại Tập Lệnh" msgid "Reload scripts" -msgstr "Nhập lại văn thảo" +msgstr "Nạp lại tập lệnh" msgctxt "Operator" msgid "Stroke Curves Sculpt" -msgstr "Khắc Đường Cong Nét" +msgstr "Điêu Khắc bằng Đường Cong của Nét Vẽ" msgid "Sculpt curves using a brush" -msgstr "Khắc đường cong bằng một bút" +msgstr "Điêu Khắc Đường Cong bằng Đầu Bút" msgctxt "Operator" msgid "Edit Minimum Distance" -msgstr "Khoảng Cách Cực Tiểu Cho Biên Tập" +msgstr "Biên Soạn Khoảng Cách Tối Thiểu" msgid "Change the minimum distance used by the density brush" -msgstr "Đổi khoảng cách cực tiểu được sử dụng bởi bút mật độ" +msgstr "Đổi khoảng cách tối thiểu được sử dụng bởi các đầu bút về mật độ/độ đậm đặc" msgctxt "Operator" msgid "Select Grow" -msgstr "Chọn Lớn Lên" +msgstr "Phát Triển Lựa Chọn" msgid "Select curves which are close to curves that are selected already" -msgstr "Chọn các đường cong gần đến các đường cong đang chọn rồi" +msgstr "Chọn các đường cong nằm gần với các đường cong đã được chọn" msgid "By how much to grow the selection" -msgstr "Mức độ mở rộng sự lựa chọn" +msgstr "Phát triển vùng lựa chọn ra bao nhiêu" msgid "Constant per Curve" -msgstr "Đồng đều cho mỗi Đường Cong" +msgstr "Hằng Số trên mỗi Đường Cong" msgid "The generated random number is the same for every control point of a curve" -msgstr "Dùng một số ngẫu nhiên được chế tạo đều giống cho mỗi điểm kiểm soát của một đường cong" +msgstr "Số ngẫu nhiên được tạo ra sẽ giống nhau cho mọi điểm điều khiển của đường cong" msgid "Minimum value for the random selection" -msgstr "Giá trị cực tiểu cho sự lựa chọn ngẫu nhiên" +msgstr "Giá trị tối thiểu cho lựa chọn ngẫu nhiên" msgid "Partial" -msgstr "Một Phần" +msgstr "Một Phần Cục Bộ" msgid "Allow points or curves to be selected partially" -msgstr "Cho chọn một phần của điểm hay đường cong" +msgstr "Cho phép các điểm hoặc đường cong được chọn một phần mà thôi" msgctxt "Operator" msgid "Sculpt" -msgstr "Khắc" +msgstr "Điêu Khắc" msgid "Sculpt a stroke into the geometry" -msgstr "Khắc một nét vào hình dạng" +msgstr "Điêu khắc một nét vào hình học" msgid "Ignore Background Click" -msgstr "Không quan tâm Bấm Nền" +msgstr "Bỏ Qua Bấm Chuột ở Sau Nền" msgid "Clicks on the background do not start the stroke" -msgstr "Cảnh trên nền không bắt đầu một nét" +msgstr "Những cái bấm chuột ở sau nền sẽ không khởi đầu nét vẽ" msgctxt "Operator" msgid "Filter Cloth" -msgstr "Bộ Lọc Vải" +msgstr "Thao Tác Vải Vóc" msgid "Applies a cloth simulation deformation to the entire mesh" -msgstr "Áp dụng một méo hóa mô phỏng vải cho toàn bộ mạng lưới" +msgstr "Áp dụng một biến dạng của mô phỏng vải vóc vào toàn thể khung lưới" + + +msgid "" +"Radius used for calculating area normal on initial click,\n" +"in percentage of brush radius" +msgstr "" +"Bán kính được sử dụng để tính pháp tuyến diện tích trên cái nhấp chuột đầu tiên,\n" +"trong giá trị phần trăm của bán kính đầu bút" msgid "Force Axis" -msgstr "Trục Lực" +msgstr "Trục của Lực" msgid "Apply the force in the selected axis" -msgstr "Áp dụng lực theo trục được chọn" +msgstr "Áp dụng lực vào trục được chọn" msgid "Apply force in the X axis" -msgstr "Áp dụng lực theo trục X" +msgstr "Áp dụng lực vào trục X" msgid "Apply force in the Y axis" -msgstr "Áp dụng lực theo trục Z" +msgstr "Áp dụng lực vào trục Y" msgid "Apply force in the Z axis" -msgstr "Áp dụng lực theo trục Z" +msgstr "Áp dụng lực vào trục Z" + + +msgid "How many times to repeat the filter" +msgstr "Số lần lặp lại bộ lọc là bao nhiêu" msgid "Orientation of the axis to limit the filter force" -msgstr "Định hướng của trục đến hạn chế của lực bộ lọc" +msgstr "Định hướng của trục để giới hạn sự thao tác lực trên đó" msgid "Use the local axis to limit the force and set the gravity direction" -msgstr "Dùng trục địa phương để hạn chế lực và đặt hướng hấp dẫn" +msgstr "Sử dụng trục địa phương để giới hạn lực và đặt chiều hướng của trọng lực" msgid "Use the global axis to limit the force and set the gravity direction" -msgstr "Dùng trục toàn cầu để hạn chế lực và đặt hướng hấp dẫn" +msgstr "Sử dụng trục toàn cầu để giới hạn lực và đặt chiều hướng của trọng lực" msgid "Use the view axis to limit the force and set the gravity direction" -msgstr "Dùng trục màn chiếu để hạn chế lực và đặt hướng hấp dẫn" +msgstr "Sử dụng trục của góc nhìn để giới hạn lực và đặt chiều hướng của trọng lực" + + +msgid "Starting Mouse" +msgstr "Chuột Khởi Động" msgid "Filter strength" -msgstr "Sức Bộ Lọc" +msgstr "Cường độ thanh lọc" msgid "Operation that is going to be applied to the mesh" -msgstr "Thao tác sẽ áp dụng trên mạng lưới" +msgstr "Thao tác sẽ được áp dụng vào khung lưới" msgid "Applies gravity to the simulation" -msgstr "Áp dụng hấp dẫn trong mô phỏng" +msgstr "Áp dụng trọng lực vào mô phỏng" msgid "Inflates the cloth" -msgstr "Phình to vải" +msgstr "Thổi phồng vải vóc lên" msgid "Expands the cloth's dimensions" -msgstr "Mở rộng kích thước của vải" +msgstr "Nới rộng kích thước của vải vóc" msgid "Pulls the cloth to the cursor's start position" -msgstr "Kéo vải đến vị trí bắt đầu của con trỏ" +msgstr "Kéo vải vóc về vị trí khởi đầu của con trỏ" msgid "Scales the mesh as a soft body using the origin of the object as scale" -msgstr "Phóng to mạng lưới kiểu thân mềm dùng góc tọa độ của vật thể làm tỉ số" +msgstr "Đổi tỷ lệ khung lưới như một thân mềm, dùng tọa độ gốc của đối tượng để đổi tỷ lệ" msgid "Use Collisions" -msgstr "Dùng Va Chạm" +msgstr "Sử Dụng Va Đập" msgid "Collide with other collider objects in the scene" -msgstr "Va chạm với các vật thể được va chạm trong cảnh" +msgstr "Va đập với các đối tượng va đập trong cảnh" msgid "Use Face Sets" -msgstr "Dùng Tập Hợp Mặt" +msgstr "Sử Dụng Mặt Ấn Định" msgid "Apply the filter only to the Face Set under the cursor" -msgstr "Áp dụng bộ lọc chỉ cho Tập Mặt ở dưới con trỏ" +msgstr "Duy áp dụng bộ lọc vào Mặt Ấn Định nằm dưới con trỏ mà thôi" msgctxt "Operator" msgid "Filter Color" -msgstr "Bộ Lọc Màu" +msgstr "Thao Tác Màu Sắc" msgid "Applies a filter to modify the active color attribute" -msgstr "Áp dụng một bộ lọc cho sửa đổi đặc điểm màu hoạt động" +msgstr "Áp dụng một thao tác thanh lọc để sửa đổi thuộc tính màu đang hoạt động" + + +msgctxt "Mesh" +msgid "Fill Color" +msgstr "Màu Tô Phủ" msgid "Fill with a specific color" -msgstr "Tô đầy bằng một màu nhất định" +msgstr "Tô kín với một màu cụ thể" msgid "Change hue" -msgstr "Đổi màu sắc" +msgstr "Đổi sắc màu" msgid "Change saturation" -msgstr "Đổi độ tươi" +msgstr "Đổi độ bão hòa (độ tươi của màu)" msgid "Change value" -msgstr "Đổi độ sáng" +msgstr "Đổi giá trị" msgid "Change brightness" @@ -68313,50 +74770,50 @@ msgstr "Đổi độ sáng" msgid "Change contrast" -msgstr "Đổi Chênh Lệch" +msgstr "Đổi độ tương phản" msgid "Smooth colors" -msgstr "Mịn hóa màu" +msgstr "Làm cho màu sắc mịn màng" msgid "Change red channel" -msgstr "Đổi kênh màu đỏ" +msgstr "Đổi kênh đỏ" msgid "Change green channel" -msgstr "Đổi kênh màu lục" +msgstr "Đổi kênh lục" msgid "Change blue channel" -msgstr "Đổi kênh màu xanh" +msgstr "Đổi kênh lam" msgctxt "Operator" msgid "Detail Flood Fill" -msgstr "Tô Tràn Chi Tiết" +msgstr "Phủ Kín Chi Tiết" msgid "Flood fill the mesh with the selected detail setting" -msgstr "Tô tràn mạng lưới với cài đặt chi tiết được chọn" +msgstr "Phủ kín khung lưới dùng sắp đặt về chi tiết đã chọn" msgctxt "Operator" msgid "Dynamic Topology Toggle" -msgstr "Bật/Tắt Hình Dạng Học Động Lý" +msgstr "Bật/Tắt Cấu Trúc Động" msgid "Dynamic topology alters the mesh topology while sculpting" -msgstr "Hình dạng học động lý sẽ đổi mạng lưới khi khắc" +msgstr "Liên kết cấu trúc động biến đổi khung lưới trong khi điêu khắc" msgctxt "Operator" msgid "Edit Dyntopo Detail Size" -msgstr "Biên Tập Kích Cỡ Chi Tiết Hình Dạng học Động Lý" +msgstr "Biên Soạn Mức Chi Tiết của Cấu Trúc Động" msgid "Modify the detail size of dyntopo interactively" -msgstr "Đổi cỡ thước của chi tiết của tô pô học động lý kiểu tương tác" +msgstr "Sửa đổi kích thước chi tiết của cấu trúc động một cách tương tác" msgctxt "Operator" @@ -68365,652 +74822,693 @@ msgstr "Mở Rộng" msgid "Generic sculpt expand operator" -msgstr "Thao tác mở rộng khắc tổng quát" +msgstr "Thao tác nới ra/mở rộng tổng quát trong điêu khắc" msgid "Falloff Type" -msgstr "Loại Sự Giảm" +msgstr "Loại Suy Giảm Dần" msgid "Initial falloff of the expand operation" -msgstr "Dộ giảm của thao tác mở rộng" +msgstr "Mức nhòe mờ ở mép ban đầu của thao tác nới ra/mở rộng" msgid "Geodesic" -msgstr "Đường trắc địa" +msgstr "Trắc Địa" msgid "Topology Diagonals" -msgstr "Đường Chéo Tô Pô" +msgstr "Cấu Trúc Đường Chéo" msgid "Boundary Topology" -msgstr "Tô Pô Ranh Giới" +msgstr "Ranh Giới Cấu Trúc" msgid "Boundary Face Set" -msgstr "Tập Hợp Mặt Ranh Giới" +msgstr "Ranh Giới Mặt Ấn Định" msgid "Active Face Set" -msgstr "Tập Hợp Mặt Hoạt Động" +msgstr "Mặt Ấn Định đang Hoạt Động" msgid "Invert the expand active elements" -msgstr "Đảo nghịch mở rộng các phần tử hoạt động" +msgstr "Đảo ngược các phần tử nới ra/mở rộng đang hoạt động" msgid "Max Vertex Count for Geodesic Move Preview" -msgstr "Số Lượng Đỉnh Tối Cao cho Dự Khán của Di Chuyển Dường Trắc Địa" +msgstr "Số Điểm Đỉnh Tối Đa cho quá trình Xem Trước Di Chuyển Trắc Địa" msgid "Maximum number of vertices in the mesh for using geodesic falloff when moving the origin of expand. If the total number of vertices is greater than this value, the falloff will be set to spherical when moving" -msgstr "Số lượng đỉnh tối đa trong mạng lưới cho dùng độ giảm của đường trắc địa khi di chuyển gộc của mở rộng. Nếu tổng đỉnh hơn giá trị này, đặc độ giảm là hình cầu khi di chuyển" +msgstr "Số lượng điểm đỉnh tối đa trong khung lưới sử dụng làm mép nhòe dần trắc địa khi di chuyển tọa độ gốc của thao tác mở rộng. Nếu tổng số điểm đỉnh lớn hơn giá trị này thì mép nhòe dần sẽ là hình cầu khi di chuyển" + + +msgid "Normal Smooth" +msgstr "Làm Mịn Pháp Tuyến" + + +msgid "Blurring steps for normal falloff" +msgstr "Số bước Làm Nhòe Mờ cho suy giảm dần của pháp tuyến" msgid "Data Target" -msgstr "Mục Tiêu Dữ Liệu" +msgstr "Dữ Liệu Sử Dụng" msgid "Data that is going to be modified in the expand operation" -msgstr "Dữ liệu sẽ được sửa đổi trong thao tác mở rộng" +msgstr "Dữ liệu sẽ được biến đổi trong thao tác mở rộng" + + +msgid "Auto Create" +msgstr "Tự Động Kiến Tạo" + + +msgid "Fill in mask if nothing is already masked" +msgstr "Tô phủ màn chắn lọc nếu chưa có gì được đánh dấu để chắn lọc cả" msgid "Falloff Gradient" -msgstr "Dốc Độ Giảm" +msgstr "Độ Dốc Suy Giảm Dần" msgid "Expand Using a linear falloff" -msgstr "Mở Rộng dùng một độ giảm bậc một" +msgstr "Mở rộng sử dụng nhòe dần tuyến tính" msgid "Preserve Previous" -msgstr "Giữ Nguyên Trước" +msgstr "Bảo Toàn trạng thái Trước Đây" msgid "Preserve the previous state of the target data" -msgstr "Giữ nguyên trạng thái trước của dữ liệu mục tiêu" +msgstr "Bảo toàn trạng thái trước đây của dữ liệu mục tiêu" msgid "Modify Active" -msgstr "Sửa Đổi Hoạt Động" +msgstr "Sửa Đổi cái đang Hoạt Động" msgid "Modify the active Face Set instead of creating a new one" -msgstr "Chỉnh sửa Tập Hợp Mặt hoạt động thay thế chế tạo một cái mới" +msgstr "Sửa đổi Mặt Ấn Định đang hoạt động thay vì tạo một cái mới" msgid "Reposition Pivot" -msgstr "Chỉnh Vị Trí Đỉm Tựa" +msgstr "Định Vị Lại Điểm Tựa" msgid "Reposition the sculpt transform pivot to the boundary of the expand active area" -msgstr "Chỉnh điểm tựa của biến hóa khắc đến ranh giới của khu vực hoạt động được mở rộng" +msgstr "Định vị điểm tựa biến hóa trong điêu khắc đến ranh giới của khu vực mở rộng đang hoạt động" msgctxt "Operator" msgid "Face Set Box Gesture" -msgstr "Cử Chỉ Hộp Tập Mặt" +msgstr "Mặt Ấn Định dùng Cử Chỉ Hình Hộp" msgid "Add face set within the box as you move the brush" -msgstr "Thâm tập mặt trong hộp khi di chuyển bút" +msgstr "Thêm Mặt ấn định nội trong hình hộp trong khi bạn di chuyển đầu bút" msgctxt "Operator" msgid "Face Sets Visibility" -msgstr "Sự Hiển Thị Tập Mặt" +msgstr "Tầm Nhìn của các Mặt Ấn Định" msgid "Change the visibility of the Face Sets of the sculpt" -msgstr "Đổi sự hiển thị của các Tập Hợp Mặt của đồ Khắc" +msgstr "Đổi tầm nhìn của các Mặt Ấn Định trong điêu khắc" msgid "Toggle Visibility" -msgstr "Bật/Tắt Sự Hiển Thị" +msgstr "Bật/Tắt Tầm Nhìn" msgid "Hide all Face Sets except for the active one" -msgstr "Ẩn hết Tập Hợp Mặt trừ tập hợp mặt hoạt động" +msgstr "Ẩn giấu toàn bộ các Mặt Ấn Định ngoại trừ cái đang hoạt động" msgid "Show Active Face Set" -msgstr "Hiện Các Tập Hợp Mặt Hoạt Động" +msgstr "Hiển Thị Mặt Ấn Định đang Hoạt Động" msgid "Hide Active Face Sets" -msgstr "Ẩn Các Tập Hợp Mặt Hoạt Động" +msgstr "Ẩn giấu các Mặt Ấn Định đang Hoạt Động" msgctxt "Operator" msgid "Edit Face Set" -msgstr "Biên Tập Tập Hợp Mặt" +msgstr "Biên Soạn Mặt Ấn Định" msgid "Edits the current active Face Set" -msgstr "Biên tập Tập Hợp Mặt hoạt động hiện tại" +msgstr "Biên soạn Mặt Ấn Định đang hoạt động" msgid "Grow Face Set" -msgstr "Tăng Tập Hợp Mặt" +msgstr "Tăng Diện Mặt Ấn Định" msgid "Grows the Face Sets boundary by one face based on mesh topology" -msgstr "Phình to ranh giới Tập Hợp Mặt bằng một mặt tùy hình dạng của mạng lưới" +msgstr "Nới rộng đường biên các Mặt Ấn Định ra một Mặt, dựa trên cơ sở cấu trúc liên kết của khung lưới" msgid "Shrink Face Set" -msgstr "Thu Nhỏ Tập Hợp Mặt" +msgstr "Co Diện Mặt Ấn Định" msgid "Shrinks the Face Sets boundary by one face based on mesh topology" -msgstr "Rút nhỏ ranh giới Tập Hợp Mặt bằng một mặt tùy hình dạng của mạng lưới" +msgstr "Co đường ranh giới của các Mặt Ấn Định lại bằng một Mặt, dựa trên cơ sở cấu trúc liên kết của khung lưới" msgid "Deletes the faces that are assigned to the Face Set" -msgstr "Xóa các mặt đã chỉ định đến Tập Hợp Mặt" +msgstr "Xóa các Mặt đã được quy cho Mặt Ấn Định" msgid "Fair Positions" -msgstr "Vị Trí Mịn" +msgstr "Làm Mịn Vị Trí" msgid "Creates a smooth as possible geometry patch from the Face Set minimizing changes in vertex positions" -msgstr "Chế tạo một miếng vá mịn nhất có thể từ Tập Hợp Mặt mà hạn chế cực tiểu sự thay đổi vị trí của đỉnh" +msgstr "Kiến tạo một hình học chắp vá một cách hết sức mịn màng từ Mặt Ấn Định, hòng gây ít thay đổi nhất đối với vị trí của các điểm đỉnh" msgid "Fair Tangency" -msgstr "Tiếp Tuyến Mịn" +msgstr "Làm Mịn Tiếp Tuyến" msgid "Creates a smooth as possible geometry patch from the Face Set minimizing changes in vertex tangents" -msgstr "Chế tạo một miếng vá mịn nhật có thể từ Tập Hợp Mặt mà hạn chế cực tiểu sự thay đổi tiếp tuyến của đỉnh" +msgstr "Kiến tạo một hình học chắp vá một cách hết sức mịn màng từ Mặt Ấn Định, hòng gây ít thay đổi nhất đối với vị trí các tiếp tuyến của điểm đỉnh" msgid "Modify Hidden" -msgstr "Sửa Đổi Được Ẩn" - - -msgid "Apply the edit operation to hidden Face Sets" -msgstr "Áp dụng thao tác biên tập cho Tập Hợp Mặt được ẩn" +msgstr "Sửa Đổi cái Ẩn Khuất" msgctxt "Operator" msgid "Face Set Lasso Gesture" -msgstr "Cử Chỉ Dây Trói Tập Hợp Mặt" +msgstr "Mặt Ấn Định dùng Cử Chỉ Dây Thòng Lọng" msgid "Add face set within the lasso as you move the brush" -msgstr "Thêm mặt trong dây trói khi di chuyển bút" +msgstr "Thêm Mặt ấn định nội trong vòng dây thòng lọng trong khi bạn di chuyển đầu bút" msgctxt "Operator" msgid "Create Face Set" -msgstr "Chế Tạo Tập Hợp Mặt" +msgstr "Kiến Tạo Mặt Ấn Định" msgid "Create a new Face Set" -msgstr "Chế tạo một Tập Hợp Mặt mới" +msgstr "Kiến tạo một Mặt Ấn Định mới" msgid "Face Set from Masked" -msgstr "Tập Hợp Mặt Từ Đeo Mặt Nạ" +msgstr "Mặt Ấn Định từ Màn Chắn" msgid "Create a new Face Set from the masked faces" -msgstr "Chế tạo một Tập Hợp Mặt từ các mặt được đeo mặt nạ" +msgstr "Kiến tạo một Mặt Ấn Định mới từ các Mặt chắn lọc" msgid "Face Set from Visible" -msgstr "Tập Hợp Mặt Từ Hiện" +msgstr "Mặt Ấn Định từ cái Hữu Hình" msgid "Create a new Face Set from the visible vertices" -msgstr "Chế tậo một Tập Hợp Mặt từ các đỉnh đang hiện" +msgstr "Kiến tạo một Mặt Ấn Định mới từ các điểm đỉnh nhìn thấy được" msgid "Face Set Full Mesh" -msgstr "Tập Hợp Mặt Toàn Bộ Mạng Lưới" +msgstr "Mặt Ấn Định trên Toàn Bộ Khung Lưới" msgid "Create an unique Face Set with all faces in the sculpt" -msgstr "Chế tạo một Tâp Hợp Mặt độc đáo có tất cả mặt trong đồ khắc" +msgstr "Kiến tạo một Mặt Ấn Định duy nhất với toàn bộ các Mặt trong bản điêu khắc" msgid "Face Set from Edit Mode Selection" -msgstr "Tập Hợp Mặt Từ Sự Lựa Chọn Của Chế Độ Biên Tập" +msgstr "Mặt Ấn Định từ Lựa Chọn của Chế Độ Biên Soạn" msgid "Create an Face Set corresponding to the Edit Mode face selection" -msgstr "Chế tạo môđt Tập Hợp Mặt tương tự sự lựa chọn của Chế Độ Biên Tập" +msgstr "Kiến Tạo một Mặt Ấn Định tương ứng với vùng lựa chọn Mặt trong Chế Độ Biên Soạn" msgctxt "Operator" msgid "Init Face Sets" -msgstr "Khởi Động Tập Hợp Mặt" +msgstr "Khởi Thủy Mặt Ấn Định" msgid "Initializes all Face Sets in the mesh" -msgstr "Khởi động hết Tập Hợp Mặt trong mạng lưới" +msgstr "Khởi thủy toàn bộ các Mặt Ấn Định trong khung lưới" msgid "Face Sets from Loose Parts" -msgstr "Tập Hợp Mặt Từ Bộ Phận Rời Ra" +msgstr "Mặt Ấn Định từ các Phần Rời Rạc" msgid "Create a Face Set per loose part in the mesh" -msgstr "Chế tạo một Tập Hợp Mặt từng bộ phận rời ra trong mạng lưới" +msgstr "Kiến Tạo Mặt Ấn Định cho mỗi phần rời rạc trong khung lưới" msgid "Face Sets from Material Slots" -msgstr "Tập Hợp Mặt Từ Khe Vật Liệu" +msgstr "Mặt Ấn Định từ các Khe Nguyên Vật Liệu" msgid "Create a Face Set per Material Slot" -msgstr "Chế tạo một Tập Hợp Mặt từng Khe Vật Liệu" +msgstr "Kiến Tạo Mặt Ấn Định cho mỗi Khe Nguyên Vật Liệu" msgid "Face Sets from Mesh Normals" -msgstr "Tập Hợp Mặt Từ Pháp Tuyến Mạng Lưới" +msgstr "Mặt Ấn Định từ các Pháp Tuyến của Khung Lưới" msgid "Create Face Sets for Faces that have similar normal" -msgstr "Chế tạo Tập Hợp Mặt cho các Mặt có pháp tuyến giống" +msgstr "Kiến Tạo Mặt Ấn Định cho các Mặt có pháp tuyến tương đồng" msgid "Face Sets from UV Seams" -msgstr "Tập Hợp Mặt Từ Vết Sẹo UV" +msgstr "Mặt Ấn Định từ các Đường Khâu UV" msgid "Create Face Sets using UV Seams as boundaries" -msgstr "Chế tạo Tập Hợp Mặt dùng các Vết Sẹo UV để làm ranh giới" +msgstr "Kiến Tạo Mặt Ấn Định dùng các Đường Khâu UV làm ranh giới" msgid "Face Sets from Edge Creases" -msgstr "Tập Hợp Mặt Từ Nhăn Cạnh" +msgstr "Mặt Ấn Định từ các Nếp Gấp" msgid "Create Face Sets using Edge Creases as boundaries" -msgstr "Chế tạo Tập Hợp Mặt dùng các các Nhăn Cạnh làm ranh giới" +msgstr "Kiến Tạo Mặt Ấn Định dùng các Nếp Gấp làm ranh giới" msgid "Face Sets from Bevel Weight" -msgstr "Tập Hợp Mặt Từ Quyền Lượng Cạnh Tròn" +msgstr "Mặt Ấn Định từ Trọng Lượng Bo Tròn" msgid "Create Face Sets using Bevel Weights as boundaries" -msgstr "Tập Hợp Mặt dùng các Quyền Lượng Cạnh Tròn làm ranh giới" +msgstr "Kiến Tạo Mặt Ấn Định dùng Trọng Lượng Bo Tròn làm ranh giới" msgid "Face Sets from Sharp Edges" -msgstr "Tập Hợp Mặt Từ Cạnh Bén" +msgstr "Mặt Ấn Định từ các Cạnh Sắc Nhọn" msgid "Create Face Sets using Sharp Edges as boundaries" -msgstr "Chế tạo Tập Hợp Mặt dùng các cạnh bén làm ranh giới" +msgstr "Kiến Tạo Mặt Ấn Định dùng các Cạnh Sắc Nhọn làm ranh giới" msgid "Face Sets from Face Set Boundaries" -msgstr "Tập Hợp Mặt từ Biên Giới Tập Hợp Mặt" +msgstr "Mặt Ấn Định từ Ranh Giới của Mặt Ấn Định" msgid "Create a Face Set per isolated Face Set" -msgstr "Chế tạo một Tập Hợp Mặt từng Tập Hợp Mặt cô lập" +msgstr "Kiến Tạo Mặt Ấn Định cho mỗi Mặt Ấn Định riêng biệt" msgid "Minimum value to consider a certain attribute a boundary when creating the Face Sets" -msgstr "Gía trị cực tiểu đề chấp nhận một đặc trưng nhất định là ranh giới khi đang chế tạo Tập Hợp Mặt" +msgstr "Giá trị tối thiểu để chấp nhận một thuộc tính nào đó là đường ranh giới khi kiến tạo các Mặt Ấn Định" msgctxt "Operator" msgid "Randomize Face Sets Colors" -msgstr "Ngẫu Nhiên Hóa Màu Của Tập Hợp Mặt" +msgstr "Ngẫu Nhiên Hóa các Màu Sắc của Mặt Ấn Định" msgid "Generates a new set of random colors to render the Face Sets in the viewport" -msgstr "Chế tạo một tập hợp màu ngẫu nhiên để kết xuất các Tập Hợp Mặt trong màn chiếu" +msgstr "Sáng tạo một bộ màu ngẫu nhiên mới để kết xuất các Mặt Ấn Định trong cổng nhìn" msgctxt "Operator" msgid "Mask by Color" -msgstr "Mặt Nạ bằng Màu" +msgstr "Chắn Lọc theo Màu" msgid "Creates a mask based on the active color attribute" -msgstr "Chế tạo một mặc nạ tùy đặc điểm màu hoạt động" +msgstr "Kiến tạo một màn chắn lọc dựa trên thuộc tính màu đang hoạt động" msgid "Contiguous" -msgstr "Liên Tiếp" +msgstr "Tiếp Giáp" msgid "Mask only contiguous color areas" -msgstr "Chỉ mặt nạ khu vực liên tiếp" +msgstr "Chọn lọc duy các vùng màu tiếp giáp" msgid "Invert the generated mask" -msgstr "Đảo nghịch mặt nạ được chế tạo" +msgstr "Đảo nghịch màn chắn lọc đã sinh tạo" msgid "Preserve Previous Mask" -msgstr "Giữ Nguyên Mặt Nạ Cũ" +msgstr "Bảo Tồn Màn Chắn Lọc Trước Đây" msgid "Preserve the previous mask and add or subtract the new one generated by the colors" -msgstr "Giữ nguyên mặt nạ cũ và cộng hay trừ mặt nạ mới được chế tạo bằng màu" +msgstr "Bảo tồn màn chắn lọc trước đây và thêm vào hoặc khấu trừ cái mới đã được sinh tạo bởi các màu đi" msgid "How much changes in color affect the mask generation" -msgstr "Mức độ sự thay đổi của màu được ảnh hưởng qúa trình chế tạo mặt nạ" +msgstr "Lượng thay đổi trong màu sắc tác động đến sự sinh tạo màn chắn lọc là bao nhiêu" msgctxt "Operator" msgid "Mask Filter" -msgstr "Bộ Lọc Mặt Nạ" +msgstr "Thanh Lọc Màn Chắn Lọc" msgid "Applies a filter to modify the current mask" -msgstr "Áp dụng một bộ lọc để sửa đổi mặt nạ hiện tại" +msgstr "Áp dụng một thao tác thanh lọc để sửa đổi màn chắn lọc hiện tại" msgid "Auto Iteration Count" -msgstr "Tự Động Đếm Lặp Lại" +msgstr "Số Lần Lặp Lại Tự Động" msgid "Use a automatic number of iterations based on the number of vertices of the sculpt" -msgstr "Dùng một số tự động lặp lại tùy số lượng đỉnh khắc" +msgstr "Sử dụng số lần lặp lại dựa trên số điểm đỉnh của bản/vật điêu khắc" msgid "Filter that is going to be applied to the mask" -msgstr "Bộ lọc để áp dụng với mặt nạ" +msgstr "Thao tác thanh lọc sẽ được áp dụng vào màn chắn lọc" msgid "Smooth Mask" -msgstr "Mịn Hóa Mặt Nạ" +msgstr "Làm Mịn Màn Chắn Lọc" msgid "Smooth mask" -msgstr "Mịn hóa mặt nạ" +msgstr "Làm màn chắn lọc trở nên mịn màng" msgid "Sharpen Mask" -msgstr "Bén Hóa Mặt Nạ" +msgstr "Sắc Cạnh Hóa Màn Chắn Lọc" msgid "Sharpen mask" -msgstr "Bén hóa mặt nạ" +msgstr "Làm màn chắn lọc trở nên sắc cạnh" msgid "Grow Mask" -msgstr "Lớn Lên Mặt Nạ" +msgstr "Tăng Diện Màn Chắn Lọc" msgid "Grow mask" -msgstr "Lớn lên mặt nạ" +msgstr "Tăng diện (triển khai/mở rộng diện tích) màn chắn lọc" msgid "Shrink Mask" -msgstr "Rút Nhỏ Mặt Nạ" +msgstr "Thu Diện Màn Chắn Lọc" msgid "Shrink mask" -msgstr "Rút nhỏ mặt nạ" +msgstr "Thu nhỏ diện màn chắn lọc" msgid "Increase Contrast" -msgstr "Tăng Chênh Lệch" +msgstr "Tăng Mức Tương Phản" msgid "Increase the contrast of the paint mask" -msgstr "Tăng chênh lệch của mặt nạ sơn" +msgstr "Tăng mức tương phản của màn chắn lọc sơn" msgid "Decrease Contrast" -msgstr "Giảm Chênh Lệch" +msgstr "Giảm Mức Tương Phản" msgid "Decrease the contrast of the paint mask" -msgstr "Giảm chênh lệch của mặt nạ sơn" +msgstr "Giảm mức tương phản của màn chắn lọc sơn" msgid "Number of times that the filter is going to be applied" -msgstr "Số lần để ạp dụng bộ lọc" +msgstr "Số lần một thao tác thanh lọc sẽ được áp dụng" -msgid "Operator" -msgstr "Thao Tác" +msgctxt "Operator" +msgid "Mask From Cavity" +msgstr "Màn Chắn Lọc từ Khe Hốc" + + +msgid "Creates a mask based on the curvature of the surface" +msgstr "Kiến Tạo một màn chắn lọc dựa trên độ cong của bề mặt" + + +msgid "Cavity (Inverted)" +msgstr "Khe Hốc (Đảo Ngược)" + + +msgid "Mix mode" +msgstr "Chế độ hòa trộn" + + +msgid "Use settings from here" +msgstr "Sử dụng các cài đặt từ đây" + + +msgid "Use settings from operator properties" +msgstr "Sử dụng cài đặt từ các tính chất của thao tác" + + +msgid "Use settings from brush" +msgstr "Sử dụng các cài đặt từ đầu bút" + + +msgid "Use settings from scene" +msgstr "Sử dụng các cài đặt từ cảnh" msgctxt "Operator" msgid "Init Mask" -msgstr "Khởi Động Mặt Nạ" +msgstr "Khởi Thủy Màn Chắn Lọc" msgid "Creates a new mask for the entire mesh" -msgstr "Chế tạo một mặt nạ cho toàn bộ mạng lưới" +msgstr "Kiến Tạo màn chắn lọc mới cho toàn bộ lưới" msgid "Random per Vertex" -msgstr "Ngẫu nhiên từng Đỉnh" +msgstr "Ngẫu Nhiên Hóa mỗi Điểm Đỉnh" msgid "Random per Face Set" -msgstr "Ngẫu nhiên từng Tập Hợp Mặt" +msgstr "Ngẫu Nhiên Hóa mỗi Mặt Ấn Định" msgid "Random per Loose Part" -msgstr "Ngẫu nhiên từng Bộ Phận Rời Ra" +msgstr "Ngẫu Nhiên Hóa mỗi Phần Rời Rạc" msgctxt "Operator" msgid "Filter Mesh" -msgstr "Bộ Lọc Mạng Lưới" +msgstr "Thao Tác Khung Lưới" msgid "Applies a filter to modify the current mesh" -msgstr "Áp dụng một bộ lọc để sửa đổi mạng lưới hiện tại" +msgstr "Áp dụng một thao tác thanh lọc để sửa đổi khung lưới hiện tại" msgid "Apply the deformation in the selected axis" -msgstr "Áp dụng méo hóa theo hướng trục được chọn" +msgstr "Áp dụng sự biến dạng trong trục được chọn" msgid "Deform in the X axis" -msgstr "Méo hóa trục X" +msgstr "Biến dạng trên trục X" msgid "Deform in the Y axis" -msgstr "Méo hóa trục Y" +msgstr "Biến dạng trên trục Y" msgid "Deform in the Z axis" -msgstr "Méo hóa trục Z" +msgstr "Biến dạng trên trục Z" msgid "Orientation of the axis to limit the filter displacement" -msgstr "Định hướng của trục cho hạn chế bộ lọc dịch" +msgstr "Định hướng của trục nhằm giới hạn sự dời hình của bộ lọc" msgid "Use the local axis to limit the displacement" -msgstr "Dùng trục địa phương cho hạn chế địch" +msgstr "Sử dụng trục địa phương để giới hạn phép dời hình" msgid "Use the global axis to limit the displacement" -msgstr "Dùng trục toàn cầu cho hạn chế địch" +msgstr "Sử dụng trục toàn cầu để giới hạn phép dời hình" msgid "Use the view axis to limit the displacement" -msgstr "Dùng trục màn chiếu cho hạn chế địch" +msgstr "Sử dụng trục của góc nhìn để giới hạn phép dời hình" msgid "Curvature Smooth Iterations" -msgstr "Lặp Lại Mịn Hóa Độ Cong" +msgstr "Số Lần Lặp Lại Quá Trình Làm Mịn Đường Cong" msgid "How much smooth the resulting shape is, ignoring high frequency details" -msgstr "Độ mịn của hình dạng kết quả, bỏ qua chi tiết tần số cao" +msgstr "Lượng làm mịn màng hình dạng kết quả, bỏ qua các chi tiết có tần số cao" msgid "Intensify Details" -msgstr "Tăng Chi Tiết" +msgstr "Tăng Cường Chi Tiết" msgid "How much creases and valleys are intensified" -msgstr "Mức cho tăng nhăn và thung lũng" +msgstr "Lượng tăng cường các nếp gấp và thung lũng chũng là bao nhiêu" msgid "Smooth Ratio" -msgstr "Tỉ Số Mịn" +msgstr "Tỷ Lệ Làm Mịn" msgid "How much smoothing is applied to polished surfaces" -msgstr "Mức mịn hóa để áp dụng cho bề mặt được đánh bóng" +msgstr "Lượng làm mịn được áp dụng vào các bề mặt bóng bảy là bao nhiêu" msgid "Smooth mesh" -msgstr "Mịn hóa mạng lưới" +msgstr "Làm mịn khung lưới" msgid "Scale mesh" -msgstr "Phóng to mạng lưới" +msgstr "Đổi tỷ lệ khung lưới" msgid "Inflate mesh" -msgstr "Phình mạng lưới" +msgstr "Thổi phồng khung lưới" msgid "Morph into sphere" -msgstr "Biến hóa thành hình cầu" +msgstr "Biến đổi thành hình cầu" msgid "Randomize vertex positions" -msgstr "Ngẫu nhiên hóa vị trí đỉnh" +msgstr "Ngẫu nhiên hóa vị trí điểm đỉnh" msgid "Relax mesh" -msgstr "Giãn mạng lưới" +msgstr "Nới Lỏng Khung Lưới" msgid "Relax Face Sets" -msgstr "Giãn Tập Hợp Mặt" +msgstr "Nới Lỏng các Mặt Ấn Định" msgid "Smooth the edges of all the Face Sets" -msgstr "Mịn hóa cạnh của hết Tập Hợp Mặt" +msgstr "Làm cho các cạnh của toàn bộ các Mặt Ấn Định trở nên trơn tru, mịn màng" msgid "Surface Smooth" -msgstr "Mịn Hóa Bề Mặt" +msgstr "Bề Mặt Mịn Màng" msgid "Smooth the surface of the mesh, preserving the volume" -msgstr "Mịn hóa bề mặt của mạng lưới, giữ nguyên thể tích" +msgstr "Làm mịn bề mặt khung lưới, đồng thời bảo tồn thể tích" msgid "Sharpen" -msgstr "Làm rõ" +msgstr "Làm Sắc Nét" msgid "Sharpen the cavities of the mesh" -msgstr "Bén hóa lỗ của mạng lưới" +msgstr "Làm cho các khe hốc của khung lưới trở nên sắc nhọn hơn" msgid "Enhance Details" -msgstr "Rõ Hóa Chi Tiết" +msgstr "Làm Nổi Bật Chi Tiết" msgid "Enhance the high frequency surface detail" -msgstr "Rõ hóa chi tiết tần số cao của bề mặt" +msgstr "Làm nổi bật chi tiết có tần số cao trên bề mặt" msgid "Erase Displacement" -msgstr "Xóa dịch" +msgstr "Xóa Dời Hình" msgid "Deletes the displacement of the Multires Modifier" -msgstr "Xoá địch của Bộ Điều Chỉnh Đa Độ Phân Giải" +msgstr "Xóa dời hình của Bộ điều chỉnh Đa Phân Giải" msgctxt "Operator" msgid "Rebuild BVH" -msgstr "Xây Lại BVH" +msgstr "Xây Dựng Lại BVH" msgid "Recalculate the sculpt BVH to improve performance" -msgstr "Tịnh lại BVH khắc cho tăng hiệu suất" +msgstr "Tính lại BVH (Bounding Volume Hierarchy : Cây Phân Cấp Giới Hạn Thể Tích) của điêu khắc để cải thiện hiệu suất thi hành của máy" msgctxt "Operator" msgid "Project Line Gesture" -msgstr "Cử Chỉ Phép Chiếu Đường" +msgstr "Phóng Chiếu Cử Chỉ Đường Thẳng" msgid "Project the geometry onto a plane defined by a line" -msgstr "Chiếu hình dạng trên một mặt phẳng được chỉ định bởi một đường" +msgstr "Phóng chiếu hình học lên một bình diện được định nghĩa bởi một đường thẳng" msgid "Sample the vertex color of the active vertex" -msgstr "Lấy mẫu từ màu đỉnh của đỉnh hoạt động" +msgstr "Lấy mẫu màu điểm đỉnh của điểm đỉnh đang hoạt động" msgctxt "Operator" msgid "Sample Detail Size" -msgstr "Kích Cỡ Chi Tiết Mẫu Vật" +msgstr "Lấy Mẫu Vật Cỡ Chi Tiết" msgid "Sample the mesh detail on clicked point" -msgstr "Lấy mẫu vật chi tiết từ mạng lưới tại điểm bấm" +msgstr "Lấy mẫu vật chi tiết khung lưới tại điểm bấm chuột" msgid "Screen coordinates of sampling" -msgstr "Tọa độ màn của mẫu vật" +msgstr "Những tọa độ màn hình của quá trình lấy mẫu vật" msgid "Detail Mode" -msgstr "Chố Đồ Chi Tiết" +msgstr "Chế Độ Chi Tiết" msgid "Target sculpting workflow that is going to use the sampled size" -msgstr "Lưu công trìhn khắc mục tiêu thì sẽ dùng kích cỡ mẫu" +msgstr "Hướng cho luồng làm việc trong điêu khắc sử dụng kích thước lấy mẫu" msgid "Dyntopo" -msgstr "Hình Dạng Học Động Lý" +msgstr "Cấu Trúc Động" msgid "Sample dyntopo detail" -msgstr "Lấy mẫu từ chi tiết hình dạng học động lý" +msgstr "Lấy mẫu chi tiết từ liên kết cấu trúc động" msgid "Sample mesh voxel size" -msgstr "Lấy mẫu từ kích cỡ thể tích tử của mạng lưới" +msgstr "Lấy mẫu từ kích thước của thể tích tử" msgctxt "Operator" msgid "Sculpt Mode" -msgstr "Chế Độ Khắc" +msgstr "Chế Độ Điêu Khắc" msgid "Toggle sculpt mode in 3D view" -msgstr "Bật/tắt chế độ khắc trong màn chiếu 3D" +msgstr "Bật/Tắt chế độ điêu khắc trong cổng nhìn 3D" msgctxt "Operator" msgid "Set Detail Size" -msgstr "Đặt Kích Cỡ Chi Tiết" +msgstr "Đặt Cỡ Chi Tiết" msgid "Set the mesh detail (either relative or constant one, depending on current dyntopo mode)" -msgstr "Đặt chi tiết mạng lưới (tương đối hay đẩng, tùy chế độ hình dạng học động lý)" +msgstr "Đặt chi tiết của khung lưới (tương đối hoặc bất biến, tùy vào chế độ liên kết cấu trúc động hiện tại)" msgctxt "Operator" msgid "Set Persistent Base" -msgstr "Đặt Cơ Sở Cố Chấp" +msgstr "Đặt Cơ Sở Ổn Định" msgid "Reset the copy of the mesh that is being sculpted on" -msgstr "Hoàn lại bản sao của mạng lưới đang khắc" +msgstr "Hoàn lại bản sao của khung lưới đang được điêu khắc" msgctxt "Operator" @@ -69019,198 +75517,215 @@ msgstr "Đặt Vị Trí Điểm Tựa" msgid "Sets the sculpt transform pivot position" -msgstr "Cho đặt vị trí điểm tựa của biến hóa khắc" +msgstr "Đặt vị trí điểm tựa cho biến hóa trong điêu khắc" msgid "Sets the pivot to the origin of the sculpt" -msgstr "Cho đặt điểm tựa đến góc tọa độ của khắc" +msgstr "Đặt điểm tựa ở tọa độ gốc của điêu khắc" msgid "Unmasked" -msgstr "Gỡ Mặt Nạ" +msgstr "Không Chắn Lọc" msgid "Sets the pivot position to the average position of the unmasked vertices" -msgstr "Cho đặt vị trí điểm tựa đến vị trí trung bình của đỉnh được gỡ mặt nạ" +msgstr "Đặt vị trí điểm tựa vào vị trí trung bình của các điểm đỉnh không chắn lọc" msgid "Mask Border" -msgstr "Ranh Giới Mặt Nạ" +msgstr "Ranh Giới của Màn Chắn Lọc" msgid "Sets the pivot position to the center of the border of the mask" -msgstr "Cho đặt vị trí điểm tựa đến trung tâm của ranh giới mặt nạ" +msgstr "Đặt vị trí điểm tựa vào trung tâm đường ranh giới của màn chắn lọc" msgid "Active Vertex" -msgstr "Đỉnh Hoạt Động" +msgstr "Điểm Đỉnh đang Hoạt Động" msgid "Sets the pivot position to the active vertex position" -msgstr "Cho đặt vị trí điểm tựa đến vị trí đỉnh hoạt động" +msgstr "Đặt vị trí điểm tựa vào vị trí của điểm đỉnh đang hoạt động" msgid "Sets the pivot position to the surface under the cursor" -msgstr "Cho đặt vị trí điểm tực đến bề mặt ở dưới con trỏ" +msgstr "Đặt vị trí điểm tựa vào bề mặt bên dưới con trỏ" msgid "Mouse Position X" -msgstr "Vị Trí X Của Chuột" +msgstr "Vị Trí X của Chuột" msgid "Position of the mouse used for \"Surface\" mode" -msgstr "Vi trí của chuột được dùng cho chế độ \"Bề Mặt\"" +msgstr "Vị trí chuột sử dụng trong chế độ \"Bề Mặt -- Surface\"" msgid "Mouse Position Y" -msgstr "Vị Trí Y Của Chuột" +msgstr "Vị Trí Y của Chuột" msgid "Symmetrize the topology modifications" -msgstr "Đôi xúng hóa sửa đổi hình dạng học" +msgstr "Đối xứng các biến đổi trong cấu trúc liên kết" msgid "Distance within which symmetrical vertices are merged" -msgstr "Khoảng cách cho các đỉnh đối xứng được gồm lại" +msgstr "Khoảng cách mà các điểm đỉnh đối xứng nằm trong đó sẽ được hợp nhất lại" msgctxt "Operator" msgid "Trim Box Gesture" -msgstr "Cử Chỉ Cắt Bằng Hộp" +msgstr "Cử Chỉ Cắt Xén Hình Hộp" msgid "Trims the mesh within the box as you move the brush" -msgstr "Cất mạng lưới ở trong hộp khi di chuyển bút" +msgstr "Cắt xén khung lưới trong hình hộp trong khi bạn di chuyển đầu bút" + + +msgid "Extrude Mode" +msgstr "Chế Độ Đẩy Trồi" + + +msgid "Project back faces when extruding" +msgstr "Phóng chiếu các mặt đằng sau khi đẩy trồi" + + +msgid "Extrude back faces by fixed amount" +msgstr "Đẩy trồi các mặt đằng sau với lượng cố định" msgid "Trim Mode" -msgstr "Chế Độ Cắt" +msgstr "Chế Độ Cắt Xén" msgid "Use a difference boolean operation" -msgstr "Dùng một thao tác bool trừ" +msgstr "Sử dụng một thao tác bool hiệu số (difference)" msgid "Use a union boolean operation" -msgstr "Dùng một thao tác bool gồm" +msgstr "Sử dụng một thao tác bool hợp nhất (union)" msgid "Join the new mesh as separate geometry, without performing any boolean operation" -msgstr "Nối lại mạng lưới mới mà làm hình dạng mới, và không thực hành một thao tác bool nào" +msgstr "Hội nhập khung lưới mới thành hình học tách rời mà không thi hành bất cứ thao tác lôgic bool nào" msgid "Shape Orientation" -msgstr "Định Hướng Hình Dạng" +msgstr "Định Hướng của Hình Dạng" msgid "Use the view to orientate the trimming shape" -msgstr "Dùng màn chiếu để đặt định hướng cho hình dạng cắt bớt" +msgstr "Sử dụng góc nhìn để định hướng hình dạng đang cắt xén" msgid "Use the surface normal to orientate the trimming shape" -msgstr "Dùng pháp tuyến bề mặt để đặt định hướng cho hình dạng cắt bớt" +msgstr "Sử dụng pháp tuyến bề mặt để định hướng hình dạng đang cắt xén" msgid "Use Cursor for Depth" -msgstr "Dùng con trỏ cho Độ Sậu" +msgstr "Sử Dụng Con Trỏ cho Chiều Sâu" msgid "Use cursor location and radius for the dimensions and position of the trimming shape" -msgstr "Dùng bán kính và vị trí của con trỏ cho cỡ thước và vị trí của hình dạng cắt bớt" +msgstr "Sử dụng vị trí và bán kính của con trỏ làm kích thước và vị trí của hình dạng đang cắt xén" msgctxt "Operator" msgid "Trim Lasso Gesture" -msgstr "Cử Chỉ Dây Trói Cắt" +msgstr "Cắt Xén dùng Cử Chỉ Dây Thòng Lọng" msgid "Trims the mesh within the lasso as you move the brush" -msgstr "Cắt mạng lưới ở trong dây trói khi di chuyển bút" +msgstr "Cắt xén khung lưới nội trong vòng dây thòng lọng trong khi bạn di chuyển đầu bút" msgctxt "Operator" msgid "Sculpt UVs" -msgstr "Khắc UV" +msgstr "Điêu Khắc UV" msgid "Sculpt UVs using a brush" -msgstr "Khắc UV bằng một bút lông" +msgstr "Điêu Khắc UV bằng đầu bút" msgid "Switch brush to relax mode for duration of stroke" -msgstr "Trao đổi bút lông đến chế độ giãn ra cho vẽ nét" +msgstr "Đổi chế độ đầu bút sang chế độ thả lỏng cho khoảng thời lượng của nét vẽ" msgctxt "Operator" msgid "Change Effect Input" -msgstr "Đổi Ngõ Vào Hiệu Ứng" +msgstr "Đổi Đầu Vào của Hiệu Ứng" msgid "The effect inputs to swap" -msgstr "Trao đổi ngõ vào hiệu ứng nào" +msgstr "Những đầu vào của hiệu ứng để tráo đổi" msgctxt "Operator" msgid "Change Effect Type" -msgstr "Đổi Loại Hiệu Ứng" +msgstr "Đổi Kiểu Hiệu Ứng" msgctxt "Sequence" msgid "Type" -msgstr "Loại" +msgstr "Thể Loại" msgid "Sequencer effect type" -msgstr "Loại hiệu ứng bộ trình tự" +msgstr "Kiểu hiệu ứng của trình phối hình" + + +msgctxt "Sequence" +msgid "Crossfade" +msgstr "Chuyển Tiếp Mờ Dần" msgid "Crossfade effect strip type" -msgstr "Loại đoạn hiệu ứng cho phai đổi" +msgstr "Loại dải hiệu ứng chuyển tiếp mờ dần" msgctxt "Sequence" msgid "Add" -msgstr "Cộng" +msgstr "Thêm" msgid "Add effect strip type" -msgstr "Thêm loại đoạn hiệu ứng" +msgstr "Thêm loại dải hiệu ứng" msgctxt "Sequence" msgid "Subtract" -msgstr "Trừ" +msgstr "Khấu Trừ" msgid "Subtract effect strip type" -msgstr "Trừ loại đoạn hiệu ứng" +msgstr "Loại dải hiệu ứng khấu trừ" msgctxt "Sequence" msgid "Alpha Over" -msgstr "Độ Đục Trên" +msgstr "Alpha Chồng Lên" msgid "Alpha Over effect strip type" -msgstr "Loại đoạn hiệu ứng Độ Đục Trên" +msgstr "Loại dải hiệu ứng Alpha Trên" msgctxt "Sequence" msgid "Alpha Under" -msgstr "Độ Đục Dưới" +msgstr "Alpha Dưới" msgid "Alpha Under effect strip type" -msgstr "Loại đoạn hiệu ứng Độ Đục Dưới" +msgstr "Loại dải hiệu ứng Alpha Dưới" msgctxt "Sequence" msgid "Gamma Cross" -msgstr "Xuyên Gama" +msgstr "Hòa Trộn Gamma" msgid "Gamma Cross effect strip type" -msgstr "Loại đoạn hiệu ứng Xuyên Gama" +msgstr "Loại dải hiệu ứng Hòa Trộn Gamma" msgctxt "Sequence" @@ -69219,29 +75734,34 @@ msgstr "Nhân" msgid "Multiply effect strip type" -msgstr "Loại đoạn hiệu ứng nhân" +msgstr "Loại dải hiệu ứng nhân" + + +msgctxt "Sequence" +msgid "Alpha Over Drop" +msgstr "Alpha Thả Trên" msgid "Alpha Over Drop effect strip type" -msgstr "Loại đoạn hiệu ứng Độ Đục Rớt Trên" +msgstr "Loại dải hiệu ứng Alpha Thả Trên" msgctxt "Sequence" msgid "Wipe" -msgstr "Lau" +msgstr "Gạt" msgid "Wipe effect strip type" -msgstr "Loại đoạn hiệu ứng lau" +msgstr "Loại dải hiệu ứng gạt" msgctxt "Sequence" msgid "Glow" -msgstr "Hào Quang" +msgstr "Hừng Sáng" msgid "Glow effect strip type" -msgstr "Loại đoạn hiệu ứng hào quang" +msgstr "Loại dải hiệu ứng hừng sáng" msgctxt "Sequence" @@ -69250,36 +75770,36 @@ msgstr "Biến Hóa" msgid "Transform effect strip type" -msgstr "Loại đoạn hiệu ứng biến hóa" +msgstr "Loại dải hiệu ứng biến hóa" msgctxt "Sequence" msgid "Color" -msgstr "Màu" +msgstr "Màu Sắc" msgid "Color effect strip type" -msgstr "Loại đoạn hiệu ứng màu" +msgstr "Loại dải hiệu ứng màu" msgctxt "Sequence" msgid "Speed" -msgstr "Tốc Độc" +msgstr "Tốc Độ" msgctxt "Sequence" msgid "Multicam Selector" -msgstr "Chọn Đa Máy Quay Phim" +msgstr "Trình Chọn Đa Máy Quay" msgctxt "Sequence" msgid "Adjustment Layer" -msgstr "Lớp Chỉnh" +msgstr "Tầng Điều Chỉnh" msgctxt "Sequence" msgid "Gaussian Blur" -msgstr "Mờ Hóa Gauss" +msgstr "Nhòe Mờ Gaus" msgctxt "Sequence" @@ -69289,7 +75809,7 @@ msgstr "Văn Bản" msgctxt "Sequence" msgid "Color Mix" -msgstr "Pha Trộn Màu" +msgstr "Trộn Màu" msgctxt "Operator" @@ -69298,47 +75818,55 @@ msgstr "Đổi Dữ Liệu/Tập Tin" msgid "Use Placeholders" -msgstr "Dùng Dấu Chứa Chỗ" +msgstr "Sử Dụng Bản Giữ Chỗ" msgid "Use placeholders for missing frames of the strip" -msgstr "Dùng dấu chứa chỗ cho bức ảnh bị mất của đoạn" +msgstr "Sử dụng những phần giữ chỗ cho các khung hình còn thiếu của dải" msgctxt "Operator" msgid "Change Scene" -msgstr "Đổi Cảnh" +msgstr "Thay Đổi Cảnh" msgid "Change Scene assigned to Strip" -msgstr "Đổi Cảnh được chỉ định cho Đoạn" +msgstr "Thay Đổi ấn định cho Dải" msgctxt "Operator" msgid "Copy" -msgstr "Chép" +msgstr "Sao Chép" + + +msgid "Copy the selected strips to the internal clipboard" +msgstr "Sao chép các dải đã chọn vào bảng nhớ tạm nội bộ" msgctxt "Operator" msgid "Crossfade Sounds" -msgstr "Phai Đổi Âm Thanh" +msgstr "Hòa Trộn Âm Thanh Xuyên Kênh" msgid "Do cross-fading volume animation of two selected sound strips" -msgstr "Làm hoạt hình phai đổi âm lượng của hai đoạn âm thanh được chọn" +msgstr "Hoạt họa âm lượng hòa trộn xuyên kênh của hai dải âm thanh được chọn" msgid "Cursor location in normalized preview coordinates" -msgstr "Vị trí con trỏ bằng tọa độ đơn vị hóa của dự khán" +msgstr "Vị trí con trỏ trong tọa độ bình thường hóa của xem trước" msgctxt "Operator" msgid "Deinterlace Movies" -msgstr "Đổi Phim Xen Kẽ Sang Tuần Tự" +msgstr "Tuần Tự Hóa Phim" msgid "Deinterlace all selected movie sources" -msgstr "Đổi hết nguồn phim được chọn từ xen kẽ sang tuần tự" +msgstr "Tuần tự hóa (deinterlace) toàn bộ các nguồn phim đã chọn" + + +msgid "Delete selected strips from the sequencer" +msgstr "Xóa các dải đã chọn khỏi trình phối hình" msgid "Delete Data" @@ -69346,357 +75874,357 @@ msgstr "Xóa Dữ Liệu" msgid "After removing the Strip, delete the associated data also" -msgstr "Sau xoá Đoạn, xoá những dữ liệu liên quan nữa" +msgstr "Sau khi loại bỏ Dải thì đồng thời xóa dữ liệu được liên kết nữa" msgid "Duplicate the selected strips" -msgstr "Sao chép các đoạn được chọn" +msgstr "Nhân đôi các dải được chọn" msgid "Duplicate selected strips and move them" -msgstr "Chép và di chuyển các đoạn được chọn" +msgstr "Nhân đôi các dải được chọn và di chuyển chúng" msgid "Slide a sequence strip in time" -msgstr "Trượt một đoạn trình tự trong thời gian" +msgstr "Đẩy trượt một dải trình tự theo thời gian" msgctxt "Operator" msgid "Add Effect Strip" -msgstr "Thêm Đoạn Hiệu Ứng" +msgstr "Thêm Dải Hiệu Ứng" msgid "Add an effect to the sequencer, most are applied on top of existing strips" -msgstr "Thêm một hiệu ứng vào bộ trình tự, đa số được áp dụng trên các đoạn đang tồn tại" +msgstr "Thêm một hiệu ứng vào trình phối hình, đại đa số là áp dụng lên trên các dải hiện có" msgid "Channel to place this strip into" -msgstr "Dán đoạn này vào kênh nào" +msgstr "Kênh để đặt dải này vào" msgid "Initialize the strip with this color" -msgstr "Khởi động đoạn bằng màu này" +msgstr "Khởi thủy dải với màu sắc này" msgid "End frame for the color strip" -msgstr "Bức ảnh cuối cho đoạn màu" +msgstr "Khung hình cuối cho dải có màu" msgid "Start frame of the sequence strip" -msgstr "Bức ảnh đầu của đoạn trình tự" +msgstr "Khung hình đầu của dải trình tự" msgid "Allow Overlap" -msgstr "Cho Lấn Trên" +msgstr "Cho Phép Chồng Đè Lên Nhau" msgid "Don't correct overlap on new sequence strips" -msgstr "Không sửa lấn trên cho đoạn trình tự mới" +msgstr "Không sửa sự đè gối trên các dải trình tự mới" msgid "Override Overlap Shuffle Behavior" -msgstr "Vượt Quyền Cho Hành Vi Xáo Lấn Trên " +msgstr "Vượt Quyền Xử Lý Xáo Trộn Chồng Chéo Lên Nhau" msgid "Use the overlap_mode tool settings to determine how to shuffle overlapping strips" -msgstr "Dùng cài đặt cụ dụng chếĐộ_lấnTrên để chỉ định làm sao xáo trộn các đoạn lấn trên" +msgstr "Sử dụng các cài đặt công cụ chế độ chồng đè (overlap_mode) để xác định cách xáo trộn các dải chồng gối lên nhau" msgid "Replace Selection" -msgstr "Thay Thế Sự Lựa Chọn" +msgstr "Thay Thế Lựa Chọn" msgid "Replace the current selection" -msgstr "Thay thế sự lựa chọn hiện tại" +msgstr "Thay thế lựa chọn hiện tại" msgctxt "Operator" msgid "Set Selected Strip Proxies" -msgstr "Đặt Đại Lỵ Đoạn Phim Được Chọn" +msgstr "Đặt Tính Chất Đại Diện cho Dải được Chọn" msgid "Enable selected proxies on all selected Movie and Image strips" -msgstr "Bật các đại lý được chọn cho hết đoạn Phim và Ảnh" +msgstr "Cho phép đại diện đã chọn hoạt động trên toàn bộ các dải Phim, Hình Ảnh được chọn" msgctxt "Operator" msgid "Export Subtitles" -msgstr "Xuất Phụ Đề" +msgstr "Xuất Khẩu Phụ Đề" msgid "Export .srt file containing text strips" -msgstr "Xuất tập tin .srt đang chứa các đoạn văn bản" +msgstr "Xuất Khẩu tập tin .srt có chứa các dải văn bản" msgctxt "Operator" msgid "Add Fades" -msgstr "Thêm Phai" +msgstr "Thêm Phai Mờ Dần" msgid "Adds or updates a fade animation for either visual or audio strips" -msgstr "Thêm hay nâng cấp một hoạt hình phai cho đoạn hiển thị hay âm thanh" +msgstr "Thêm hoặc cập nhật một đoạn hoạt họa phai mờ dần cho các dải phim hoặc âm thanh" msgid "Fade Duration" -msgstr "Giai Đoạn Phai" +msgstr "Thời Lượng Phai Mờ Dần" msgid "Duration of the fade in seconds" -msgstr "Giai Đoạn phai (giây)" +msgstr "Khoảng thời lượng, trong số giây, để phai mờ dần" msgid "Fade Type" -msgstr "Loại Phai" +msgstr "Kiểu Phai Mờ Dần" msgid "Fade in, out, both in and out, to, or from the current frame. Default is both in and out" -msgstr "Phai vào, ra, cả hai vào và ra, đến, hoặc từ bức ảnh hiện tại. Mặc định là cả hai vào và ra" +msgstr "Chuyển tiếp (Phai mờ dần) vào, ra, và cả hai vào và ra, tới, hoặc từ, khung hình hiện tại. Mặc định là cả hai, vào và ra" msgid "Fade In and Out" -msgstr "Phai Vào Và Ra" +msgstr "Phai Mờ Dần Vào và Ra" msgid "Fade selected strips in and out" -msgstr "Phai đoạn được chọn vào và ra" +msgstr "Phai mờ dần các dải được chọn từ trong ra cả hai phía" msgid "Fade In" -msgstr "Phai Vào" +msgstr "Phai Mờ Dần Từ Ngoài Vào" msgid "Fade in selected strips" -msgstr "Phai vào các đoạn được/chưa chọn" +msgstr "Phai mờ dần các dải được chọn từ ngoài vào" msgid "Fade Out" -msgstr "Phai Ra" +msgstr "Phai Mờ Dần Từ Trong Ra" msgid "Fade out selected strips" -msgstr "Phai ra đoạn được chọn" +msgstr "Phai mờ dần các dải được chọn từ trong ra" msgid "From Current Frame" -msgstr "Từ Bức Ảnh Hiện Tại" +msgstr "Từ Khung Hình Hiện Tại" msgid "Fade from the time cursor to the end of overlapping sequences" -msgstr "Phai từ con trỏ thời gian đến kết thúc của trình tự lấn lên nhau" +msgstr "Phai mờ dần từ thời gian của con trỏ đến điểm cuối của các đoạn gối chồng" msgid "To Current Frame" -msgstr "Đến Bức Ảnh Hiện Tại" +msgstr "Tới Khung Hình Hiện Tại" msgid "Fade from the start of sequences under the time cursor to the current frame" -msgstr "Phai từ bắt đầu của trình tự ở dưới con trỏ thời gian đến bức ảnh hiện tại" +msgstr "Phai mờ dần từ đầu trình tự dưới con trỏ đến khung hình hiện tại" msgctxt "Operator" msgid "Clear Fades" -msgstr "Xóa Các Phai" +msgstr "Xóa Hiệu Ứng Phai Mờ Dần" msgid "Removes fade animation from selected sequences" -msgstr "Xóa hoạt hình phai từ các trình tự được chọn" +msgstr "Xóa hoạt họa phai mờ dần khỏi các trình tự được chọn" msgctxt "Operator" msgid "Insert Gaps" -msgstr "Chèn Cách Rỗng" +msgstr "Chèn Khoảng Cách Trống" msgid "Insert gap at current frame to first strips at the right, independent of selection or locked state of strips" -msgstr "Chèn cách rỗng tại bức ảnh hiện tại với đoạn đầu tiên bên phải, độc lập từ sự lựa chọn hay trạng thái khóa của đoạn" +msgstr "Chèn thêm khe hở vào giữa khung hình hiện tại với dải đầu tiên bên phải, không phụ thuộc vào sự lựa chọn hay trạng thái khóa của dải" msgid "Frames to insert after current strip" -msgstr "Chèn bức ảnh sau đoạn hiện tại" +msgstr "Những khung hình để chèn ở đằng sau dải hiện tại" msgctxt "Operator" msgid "Remove Gaps" -msgstr "Xóa Cách Rỗng" +msgstr "Xóa Khoảng Cách Trống" msgid "Remove gap at current frame to first strip at the right, independent of selection or locked state of strips" -msgstr "Xóa cách rỗng tại bức ảnh hiện tại đến đoạn đầu tiên ở bên phải, độc lập từ sự lựa chọn hay trạng thái khóa của đoạn" +msgstr "Xóa khe hở giữa khung hình hiện tại đến dải đầu tiên ở bên phải, không phụ thuộc vào sự lựa chọn hay trạng thái khóa của các dải" msgid "All Gaps" -msgstr "Hết Cách Rỗng" +msgstr "Toàn bộ các Khoảng Cách Trống" msgid "Do all gaps to right of current frame" -msgstr "Làm hết cách rỗng bên phải của bức ảnh hiện tại" +msgstr "Đưa toàn bộ các khoảng cách trống về bên phải của khung hình hiện tại" msgctxt "Operator" msgid "Add Image Strip" -msgstr "Thêm Đoạn Ảnh" +msgstr "Thêm Dải về Hình Ảnh" msgid "Add an image or image sequence to the sequencer" -msgstr "Thêm một ảnh hay đoạn ảnh trong bộ trình tự" +msgstr "Thêm một hình ảnh hay trình tự hình ảnh vào trình phối hình" msgid "Scale fit method" -msgstr "Phương pháp phóng to vừa" +msgstr "Phương Pháp Đổi Tỷ Lệ để Khít Vừa" msgid "Scale image to fit within the canvas" -msgstr "Phóng to ành cho vừa mặt sơn" +msgstr "Đổi tỷ lệ hình ảnh để khít vừa vào khung vẽ" msgid "Scale to Fill" -msgstr "Phóng To cho Đầy" +msgstr "Đổi Tỷ Lệ để Phủ Kín" msgid "Scale image to completely fill the canvas" -msgstr "Phóng to ảnh cho đầy toàn bộ mặt sơn" +msgstr "Đổi tỷ lệ hình ảnh để phủ kín khung vẽ" msgid "Stretch to Fill" -msgstr "Kéo cho Đầy" +msgstr "Kéo Giãn để Lấp Đầy" msgid "Stretch image to fill the canvas" -msgstr "Kéo ảnh cho đầy mặt sơn" +msgstr "Kéo giãn hình ảnh để phủ kín khung vẽ" msgid "Use Original Size" -msgstr "Dùng Khổ Ban Đầu" +msgstr "Sử Dụng Kích Thước của Bản gốc" msgid "Keep image at its original size" -msgstr "Giữ nguyên khổ ảnh ban đầu" +msgstr "Duy trì kích thước của hình ảnh như trong bản gốc của nó" msgid "Set View Transform" -msgstr "Đặt Biến Hóa Màn Chiếu" +msgstr "Đặt Biến Hóa Góc Nhìn" msgid "Set appropriate view transform based on media color space" -msgstr "Đặt biến hóa màn chiếu hợp lệ tùy không gian màu của truyền thông" +msgstr "Đặt biến hóa góc nhìn thích đáng dựa trên không gian màu của phương tiện truyền thông" msgctxt "Operator" msgid "Separate Images" -msgstr "Chẻ Ảnh" +msgstr "Phân Tách Hình Ảnh" msgid "On image sequence strips, it returns a strip for each image" -msgstr "Cho đoạn trình tự ảnh, nó chế tạo một đoạn cho mỗi ảnh" +msgstr "Với các dải trình tự hình ảnh, nó tạo một dải cho mỗi hình ảnh" msgid "Length of each frame" -msgstr "Bề dài của mỗi bức ảnh" +msgstr "Chiều dài của mỗi khung hình" msgctxt "Operator" msgid "Lock Strips" -msgstr "Khóa Đoạn" +msgstr "Khóa Dải" msgid "Lock strips so they can't be transformed" -msgstr "Khóa đoạn cho không thể được biến hóa chúng nó" +msgstr "Khóa các dải hầu cho chúng không thể biến hóa" msgctxt "Operator" msgid "Add Mask Strip" -msgstr "Thêm Đoạn Mặt Nạ" +msgstr "Thêm Dải Màn Chắn Lọc" msgid "Add a mask strip to the sequencer" -msgstr "Thêm một đoạn mặt nạ vào bộ trình tự" +msgstr "Thêm một dải màn chắn lọc cho trình phối hình" msgctxt "Operator" msgid "Make Meta Strip" -msgstr "Chố Tạo Siêu Đoạn" +msgstr "Tạo Siêu Dải" msgid "Group selected strips into a meta-strip" -msgstr "Nhóm lại các đoạn được chọn vào một siêu đoạn" +msgstr "Nhóm các dải được chọn vào thành một siêu dải" msgctxt "Operator" msgid "UnMeta Strip" -msgstr "Không Siêu Đoạn" +msgstr "Tháo Siêu Dải" msgid "Put the contents of a meta-strip back in the sequencer" -msgstr "Bỏ nội dung của một siêu đoạn trở lại vào bộ trình tự" +msgstr "Tháo rời và đặt nội dung của một siêu dải quay trở lại trình phối hình như cũ" msgctxt "Operator" msgid "Toggle Meta Strip" -msgstr "Bật/Tắt Siêu Đoạn" +msgstr "Bật/Tắt Siêu Dải" msgid "Toggle a meta-strip (to edit enclosed strips)" -msgstr "Bật/tắt một siêu đọan (để biên tập các đoạn ở trong)" +msgstr "Bật/Tắt siêu dải (để biên soạn các dải gói ở trong)" msgctxt "Operator" msgid "Add Movie Strip" -msgstr "Thêm Đoạn Phim" +msgstr "Thêm Dải Phim" msgid "Add a movie strip to the sequencer" -msgstr "Thêm một đoạn phim vào bộ trình tự" +msgstr "Thêm một dải phim cho trình phối hình" msgid "Adjust Playback Rate" -msgstr "Chỉnh Tốc Độ Hát Lại" +msgstr "Điều Chỉnh Tần Số Chơi Lại" msgid "Play at normal speed regardless of scene FPS" -msgstr "Hát lại bằng tốc độ bình thường bất kể tốc độ hát lại của cảnh" +msgstr "Chơi ở tốc độ bình thường bất kể tần số khung hình/giây (FPS) của cảnh là gì" msgid "Load sound with the movie" -msgstr "Nhập âm thanh với phim" +msgstr "Nạp âm thanh với phim" msgid "Use Movie Framerate" -msgstr "Dùng Tốc Độ Bức Ảnh Phim" +msgstr "Dùng Tần Số Khung Hình Phim" msgid "Use framerate from the movie to keep sound and video in sync" -msgstr "Dùng tốc độ bức ảnh phim cho giữ âm thanh và video đồng bộ nhau" +msgstr "Dùng tần số khung hình phim để giữ âm thanh và video đồng bộ với nhau" msgctxt "Operator" msgid "Add MovieClip Strip" -msgstr "Thêm Đoạn Phim" +msgstr "Thêm Dải về Đoạn Phim" msgid "Add a movieclip strip to the sequencer" -msgstr "Thêm một đoạn phim vào bộ trình tự" +msgstr "Thêm một dải về đoạn phim cho trình phối hình" msgctxt "Operator" msgid "Mute Strips" -msgstr "Cắt Tiếng Đoạn" +msgstr "Chặn/Giải Hoạt Dải" msgid "Mute (un)selected strips" -msgstr "Cắt tiếng các đoạn được/chưa chọn" +msgstr "Chặn/Giải hoạt tính của các dải (được/chưa) chọn" msgid "Mute unselected rather than selected strips" -msgstr "Cắt tiếng đoạn chưa chọn thay thế đoạn được chọn" +msgstr "Chặn/Giải hoạt tính các dải không được chọn, thay vì các dải được chọn" msgctxt "Operator" msgid "Clear Strip Offset" -msgstr "Xóa Dịch Đoạn" +msgstr "Xóa Dịch Chuyển của Dải" msgid "Clear strip offsets from the start and end frames" -msgstr "Xóa dịch đoạn từ bức ảnh đầu và cuối" +msgstr "Xóa các dịch chuyển của dải khỏi khung hình đầu và cuối" msgctxt "Operator" @@ -69704,158 +76232,249 @@ msgid "Paste" msgstr "Dán" +msgid "Paste strips from the internal clipboard" +msgstr "Dán các dải từ bảng nhớ tạm nội bộ" + + msgid "Keep strip offset relative to the current frame when pasting" -msgstr "Giữ nới của đoạn tương đối với bức ảnh hiện tại khi dán" +msgstr "Duy trì dịch chuyển của dải tương đối với khung hình hiện tại khi dán vào" msgctxt "Operator" msgid "Reassign Inputs" -msgstr "Chỉ Định Lại Ngõ Vào" +msgstr "Đổi Đầu Vào" msgid "Reassign the inputs for the effect strip" -msgstr "Chỉ định lại các ngõ vào cho đoạn hiệu ứng" +msgstr "Đổi nguồn của dãy hiệu ứng" msgid "Rebuild all selected proxies and timecode indices using the job system" -msgstr "Xây dưng lại hết đại lý và chỉ số mã thời gian bằng hệ thống công việc" +msgstr "Tái dựng toàn bộ các đại diện và chỉ số mã thời gian dùng hệ thống công việc (job system)" msgctxt "Operator" msgid "Refresh Sequencer" -msgstr "Vẽ Lại Bộ Trình Tự" +msgstr "Vẽ Lại Trình Phối Hình" msgid "Refresh the sequencer editor" -msgstr "Vẽ lại trình biên soạn trình tự" +msgstr "Vẽ lại trình phối hình" msgctxt "Operator" msgid "Reload Strips" -msgstr "Nhập Lại Đoạn" +msgstr "Tái Nạp các Dải" msgid "Reload strips in the sequencer" -msgstr "Nhập lại đoạn trong bộ trình tự" +msgstr "Tái nạp các dải trong trình phối hình" msgid "Adjust Length" -msgstr "Chỉnh Bề Dài" +msgstr "Điều Chỉnh Chiều Dài" msgid "Adjust length of strips to their data length" -msgstr "Chỉnh bề dài của đoạn đến bề dài dữ liệu" +msgstr "Điều chỉnh chiều dài của các dải theo chiều dài dữ liệu của chúng" msgctxt "Operator" msgid "Set Render Size" -msgstr "Đặt Kích Cỡ Kết Xuất" +msgstr "Đặt Kích Thước Kết Xuất" msgid "Set render size and aspect from active sequence" -msgstr "Đặt kích cỡ kết xuất và tỉ số cảnh từ trình tự hoạt động" +msgstr "Đặt kích thước kết xuất và tỷ lệ tương quan của khung hình từ trình tự đang hoạt động" + + +msgctxt "Operator" +msgid "Add Freeze Frame" +msgstr "Thêm Khung Hình Đóng Băng" + + +msgid "Add freeze frame" +msgstr "Thêm khung hình đóng băng" + + +msgid "Duration of freeze frame segment" +msgstr "Thời lượng của phân đoạn khung hình đóng băng" + + +msgctxt "Operator" +msgid "Add Retiming Key" +msgstr "Thêm Khóa Tính Lại Thời Gian" + + +msgid "Add retiming Key" +msgstr "Thêm Khóa tính lại thời gian" + + +msgid "Timeline Frame" +msgstr "Khung Hình Lịch Trình Thời Gian" + + +msgid "Frame where key will be added" +msgstr "Khung hình nơi khóa sẽ được thêm vào" + + +msgctxt "Operator" +msgid "Reset Retiming" +msgstr "Hoàn Nguyên Tính Lại Thời Gian" + + +msgid "Reset strip retiming" +msgstr "Hoàn nguyên tính lại thời gian của dải" + + +msgctxt "Operator" +msgid "Set Speed" +msgstr "Đặt Tốc Độ" + + +msgid "Set speed of retimed segment" +msgstr "Đặt tốc độ của phân đoạn được tính lại thời gian" + + +msgid "New speed of retimed segment" +msgstr "Tốc độ mới của phân đoạn được tính lại thời gian" + + +msgctxt "Operator" +msgid "Retime Strips" +msgstr "Dải Tính Lại Thời Gian" + + +msgid "Show retiming keys in selected strips" +msgstr "Hiển thị các phím tính lại thời gian trong các dải đã chọn" + + +msgctxt "Operator" +msgid "Add Speed Transition" +msgstr "Thêm Chuyển Tiếp Tốc Độ" + + +msgid "Add smooth transition between 2 retimed segments" +msgstr "Thêm chuyển tiếp mượt mà giữa 2 phân đoạn tính lại thời gian" msgid "Use mouse to sample color in current frame" -msgstr "Dùng chuột cho lấy mẫu vật màu trong bức ảnh hiện tại" +msgstr "Dùng chuột để lấy mẫu màu sắc trong khung hình hiện tại" + + +msgctxt "Operator" +msgid "Update Scene Frame Range" +msgstr "Cập Nhật Phạm Vi Khung Hình của Cảnh" + + +msgid "Update frame range of scene strip" +msgstr "Cập nhật phạm vi khung hình của dải về cảnh" msgctxt "Operator" msgid "Add Scene Strip" -msgstr "Thêm Đoạn Cảnh" +msgstr "Thêm Dải về Cảnh" + + +msgid "Add a strip to the sequencer using a Blender scene as a source" +msgstr "Thêm một dải cho trình phối hình dùng một cảnh của Blender làm nguồn" msgctxt "Operator" msgid "Add Strip with a new Scene" -msgstr "Thêm Đoạn có một Cảnh mới" +msgstr "Thêm Dải với một Cảnh mới" + + +msgid "Create a new Strip and assign a new Scene as source" +msgstr "Kiến Tạo một Dải mới và ấn định một Cảnh mới làm nguồn" msgid "Add new Strip with a new empty Scene with default settings" -msgstr "Thêm một Đoạn mới, trống rỗng có cài đặt mặc định" +msgstr "Thêm Dải mới với một Cảnh trống mới dùng các cài đặt mặc định" msgid "Add a new Strip, with an empty scene, and copy settings from the current scene" -msgstr "Thêm một Đoạn mới, có một cảnh trống rỗng, và chép cài đặt từ cảnh hiện tại" +msgstr "Thêm một Dải mới, với một cảnh trống và sao chép các cài đặt từ cảnh hiện tại" msgid "Add a Strip and link in the collections from the current scene (shallow copy)" -msgstr "Thêm một cảnh và liên kết trong sưu tập từ cảnh hiện tại (chép cạng)" +msgstr "Thêm một dải và liên kết các bộ sưu tập từ cảnh hiện tại vào (bản sao nông)" msgid "Add a Strip and make a full copy of the current scene" -msgstr "Thêm một Đoạn và chép toàn bộ cảnh hiện tại" +msgstr "Thêm một Dải và tạo một bản sao đầy đủ của cảnh hiện tại" msgid "Select a strip (last selected becomes the \"active strip\")" -msgstr "Chọn một đoạn (cuối được chọn sẽ thành \"đoạn hoạt động\")" +msgstr "Chọn một dải (cái được chọn cuối cùng sẽ trở thành \"dải đang hoạt động\")" msgid "Use the object center when selecting, in edit mode used to extend object selection" -msgstr "Dùng trung tâm vật thể khi chọn, trong chế độ biên tập được dùng cho mở rộng sự lựa chọn vật thể" +msgstr "Dùng tâm của đối tượng khi lựa chọn, trong chế độ biên soạn thì dùng để nới rộng vùng lựa chọn đối tượng" msgid "Linked Handle" -msgstr "Tay Cầm Liên Kết" +msgstr "Tay Cầm Kết Nối" msgid "Select handles next to the active strip" -msgstr "Chọn tay cầm kề đoạn hoạt động" +msgstr "Chọn các tay cầm kế tiếp dải đang hoạt động" msgid "Linked Time" -msgstr "Thời Gian Liên Kết" +msgstr "Thời Gian Kết Nối" msgid "Select other strips at the same time" -msgstr "Chọn các đoạn khác cùng một lượt" +msgstr "Chọn các dải khác có cùng một thời gian" msgid "Side of Frame" -msgstr "Phía của Bức Ảnh" +msgstr "Vùng Bên Cạnh Khung hình" msgid "Select all strips on same side of the current frame as the mouse cursor" -msgstr "Chọn hết đoạn ở cùng phía con trỏ so với bức ảnh hiện tại" +msgstr "Lựa chọn toàn bộ các dải nằm cùng bên với khung hình hiện tại, ở phía mà con trỏ chuột nằm" msgid "Select or deselect all strips" -msgstr "Chọn hay thả hết đoạn" +msgstr "Chọn hay hủy chọn toàn bộ các dải" msgid "Select strips using box selection" -msgstr "Chọn đoạn bằng sự lựa chọn kiểu hộp" +msgstr "Chọn các dải bằng phương pháp chọn khoanh ranh giới hình hộp" msgid "Select Handles" -msgstr "Chọn Tay Cầm" +msgstr "Chọn các Tay Cầm" msgid "Select the strips and their handles" -msgstr "Chọn các đoạn và tay cầm cúa các đoạn" +msgstr "Chọn các dải và những tay cầm của chúng" msgid "Select all strips grouped by various properties" -msgstr "Chọn hết đoạn tùy các đặc tính" +msgstr "Chọn toàn bộ các dải được nhóm lại tùy theo các tính chất khác nhau" msgid "Shared strip type" -msgstr "Loại đoạn được chia sẻ" +msgstr "Có cùng thể loại dải" msgid "Global Type" -msgstr "Loại Toàn Cầu" +msgstr "Thể Loại Toàn Cầu" msgid "All strips of same basic type (graphical or sound)" -msgstr "Hết đoạn cùng loại cơ bản (đồ họa hay âm thanh)" +msgstr "Toàn bộ các dải có cùng thể loại cơ bản (đồ họa hay âm thanh)" msgid "Shared strip effect type (if active strip is not an effect one, select all non-effect strips)" -msgstr "Loại đoạn hiệu ứng được chi sẻ (nếu đoạn hoạt động không phải là đoạn hiệu ứng, chọn hết đoạn không hiệu ứng)" +msgstr "Có cùng thể loại dải hiệu ứng (nếu dải đang hoạt động không phải là dải hiệu ứng thì chọn toàn bộ các dải phi hiệu ứng)" msgid "Shared data (scene, image, sound, etc.)" -msgstr "Dữ liệu được chia sẻ (cảnh, ảnh, âm thanh, v.v.)" +msgstr "Dùng chung dữ liệu (khung cảnh, hình ảnh, âm thanh, v.v.)" msgid "Effect" @@ -69863,23 +76482,23 @@ msgstr "Hiệu Ứng" msgid "Shared effects" -msgstr "Hiệu Ứng Được Chia Sẻ" +msgstr "Có Cùng hiệu ứng" msgid "Effect/Linked" -msgstr "Hiệu Ứng/Liên Kết" +msgstr "Hiệu Ứng/Kết Nối" msgid "Other strips affected by the active one (sharing some time, and below or effect-assigned)" -msgstr "Các đoạn khác được ảnh hưởng bằng đoạn hoạt động (chia sẻ chút thời gian, và dưới hay hiệu ứng chỉ định)" +msgstr "Các dải khác bị ảnh hưởng bởi dải đang hoạt động (cùng phân hưởng đoạn thời gian nào đó, và ở dưới hay do hiệu ứng chỉ định)" msgid "Overlap" -msgstr "Lấn Trên" +msgstr "Đè Gối" msgid "Overlapping time" -msgstr "Thời gian lấn trên" +msgstr "Đè gối thời gian" msgid "Same Channel" @@ -69887,53 +76506,53 @@ msgstr "Cùng Kênh" msgid "Only consider strips on the same channel as the active one" -msgstr "Chỉ dùng đoạn trong cùng kênh với kênh hoạt động" +msgstr "Chỉ dùng các dải trên cùng kênh với kênh đang hoạt động" msgctxt "Operator" msgid "Select Handles" -msgstr "Chọn Tay Cầm" +msgstr "Chọn các Tay Cầm" msgid "Select gizmo handles on the sides of the selected strip" -msgstr "Chọn tay cầm đồ đạc ở hai bên của đoạn được chọn" +msgstr "Chọn các tay cầm của gizmo tại hai bên của dải được chọn" msgid "The side of the handle that is selected" -msgstr "Bên của tay cầm được chọn" +msgstr "Phía bên của tay cầm đã chọn" msgid "Left Neighbor" -msgstr "Kề Trái" +msgstr "Lân Cận Bên Trái" msgid "Right Neighbor" -msgstr "Kề Phải" +msgstr "Lân Cận Bên Phải" msgid "Both Neighbors" -msgstr "Kề Trái & Phải" +msgstr "Lân Cận Hai Bên" msgid "Shrink the current selection of adjacent selected strips" -msgstr "Thu nhỏ sự lựa chọn hiện tại của các đoạn kề được chọn" +msgstr "Thu nhỏ lựa chọn hiện tại của các dải được chọn kề cạnh lại" msgid "Select all strips adjacent to the current selection" -msgstr "Chọn hết đoạn kề với sự lựa chọn hiện tại" +msgstr "Chọn toàn bộ các dải kề cạnh với lựa chọn hiện tại" msgctxt "Operator" msgid "Select Pick Linked" -msgstr "Chọn Liên Kết" +msgstr "Chọn cái được Nhặt Ra và Kết Nối" msgid "Select a chain of linked strips nearest to the mouse pointer" -msgstr "Chọn một chuỗi đoạn được liên kết nhau gần nhất với con trỏ chuột" +msgstr "Chọn một dây chuyền các dải kết nối nhau nằm gần với con trỏ chuột nhất" msgid "Select more strips adjacent to the current selection" -msgstr "Chọn các đoạn thêm kề sự lựa chọn hiện tại" +msgstr "Chọn thêm các dải kề cận vào lựa chọn hiện tại" msgctxt "Operator" @@ -69942,11 +76561,11 @@ msgstr "Chọn Bên" msgid "Select strips on the nominated side of the selected strips" -msgstr "Chọn các đoạn ở phía bên được lựa chọn của các đoạn đã chọn" +msgstr "Chọn các dải nằm phía bên được đề đạt của dải được chọn" msgid "The side to which the selection is applied" -msgstr "Bên nào để áp dụng sự lựa chọn" +msgstr "Phía bên mà sự lựa chọn sẽ được áp dụng" msgid "Mouse Position" @@ -69954,125 +76573,129 @@ msgstr "Vị Trí Chuột" msgid "No Change" -msgstr "Không Đổi" +msgstr "Không Thay Đổi" msgctxt "Operator" msgid "Select Side of Frame" -msgstr "Chọn Tuơng Đối Với Bức Ảnh" +msgstr "Lựa Chọn Vùng Bên Cạnh Khung Khóa" msgid "Select strips relative to the current frame" -msgstr "Chọn các đoạn tương đối so với bức ảnh hiện tại" +msgstr "Chọn các dải nằm tương đối với khung hình hiện tại" msgid "Select to the left of the current frame" -msgstr "Chọn phía trái hay phía phải của bức ảnh hiện tại" +msgstr "Chọn về bên trái của khung hình hiện tại" msgid "Select to the right of the current frame" -msgstr "Chọn phía phải của bức ảnh hiện tại" +msgstr "Chọn về bên phải của khung hình hiện tại" msgid "Select intersecting with the current frame" -msgstr "Chọn đang giao cắt với bức ảnh hiện tại" +msgstr "Lựa chọn giao cắt với khung hình hiện tại" msgctxt "Operator" msgid "Set Range to Strips" -msgstr "Đặt Phạm Vi đến các Đọan" +msgstr "Đặt Phạm Vi cho các Dải" msgid "Set the frame range to the selected strips start and end" -msgstr "Đặt phạm vi bức ảnh đến đầu và cuối của các đoạn đã chọn" +msgstr "Đặt phạm vi khung hình cho các điểm đầu và cuối của các dải đã chọn" msgid "Set the preview range instead" -msgstr "Đặt phạm vi dự khán trước" +msgstr "Đặt phạm vi xem trước thay vì" msgctxt "Operator" msgid "Slip Strips" -msgstr "Trượt Đoạn" +msgstr "Trượt Đẩy Dải" msgid "Slip the contents of selected strips" -msgstr "Trượt nội dụng của các đoạn được chọn" +msgstr "Trượt đẩy nội dung của các dải đã chọn" msgid "Offset to the data of the strip" -msgstr "Địch đến dữ liệu của đoạn" +msgstr "Dịch chuyển trong dữ liệu của dải" msgctxt "Operator" msgid "Snap Strips to the Current Frame" -msgstr "Hút dính Đoạn đến Bức Ảnh Hiện Tại" +msgstr "Bám Dính các Dải vào Khung Hình Hiện Tại" msgid "Frame where selected strips will be snapped" -msgstr "Bức ảnh nào được hút dính đoạn" +msgstr "Khung hình mà các dải đã được chọn sẽ bám dính vào" msgctxt "Operator" msgid "Add Sound Strip" -msgstr "Thêm Đoạn Âm Thanh" +msgstr "Thêm Dải Âm Thanh" msgid "Add a sound strip to the sequencer" -msgstr "Thêm một âm thanh cho bộ trình tự" +msgstr "Thêm một dải âm thanh cho trình phối hình" msgid "Cache the sound in memory" -msgstr "Chứa âm thanh trong bộ nhớ" +msgstr "Giữ âm thanh trong bộ nhớ đệm" msgid "Merge all the sound's channels into one" -msgstr "Gồm hết kênh âm thanh thành một kênh" +msgstr "Hội nhập toàn bộ các kênh âm thanh thành một kênh" msgid "Split the selected strips in two" -msgstr "Chẻ các đoạn được chọn thành hai" +msgstr "Tách phân các dải được chọn ra thành hai" msgid "Channel in which strip will be cut" -msgstr "Kênh nào cho cắt đoạn" +msgstr "Kênh mà dải sẽ được cắt ra" msgid "Frame where selected strips will be split" -msgstr "Bức ảnh nào cho cắt các đoạn được chọn" +msgstr "Khung hình mà các dải sẽ được tách phân ra" msgid "Ignore Selection" -msgstr "Không Quan Tâm Sự Lựa Chọn" +msgstr "Bỏ Qua Lựa Chọn" + + +msgid "Make cut even if strip is not selected preserving selection state after cut" +msgstr "Thực hiện cắt ngay cả khi dải không được chọn, duy trì trạng thái lựa chọn sau khi cắt xong" msgid "The side that remains selected after splitting" -msgstr "Bên nào vẫn còn được chọn sau chẻ" +msgstr "Bên sẽ được giữ lại ở trạng thái được chọn sau khi tách phân ra" msgid "The type of split operation to perform on strips" -msgstr "Loại thao tác chẻ để thực hành với các đoạn" +msgstr "Loại thao tác tách phân sẽ thi hành trên các dải" msgid "Use Cursor Position" -msgstr "Đặt Vị Trí Con Trỏ" +msgstr "Sử Dụng Vị Trí của Chuột" msgid "Split at position of the cursor instead of current frame" -msgstr "Chẻ vị trí của con trỏ thay thế bức ảnh hiện tại" +msgstr "Tách phân tại vị trí con trỏ, thay vì tại vị trí của khung hình hiện tại" msgctxt "Operator" msgid "Split Multicam" -msgstr "Chẻ Đa Máy Quay Phim" +msgstr "Tách Phân Đa Máy Quay" msgid "Split multicam strip and select camera" -msgstr "Chẻ đoạn đa máy quay phim và chọn máy quay phim" +msgstr "Tách phân dải đa máy quay và chọn máy quay phim" msgid "Set a color tag for the selected strips" -msgstr "Đặt một thẻ màu cho các đoạn được chọn" +msgstr "Đặt một nhãn màu cho các dải đã chọn" msgid "Color 09" @@ -70081,54 +76704,95 @@ msgstr "Màu 09" msgctxt "Operator" msgid "Jump to Strip" -msgstr "Nhảy Đến Đoạn" +msgstr "Nhảy đến Dải" msgid "Move frame to previous edit point" -msgstr "Di chuyển bức ảnh đến điểm biên tập trước" +msgstr "Di chuyển khung hình đến điểm biên soạn trước" msgid "Use Strip Center" -msgstr "Dùng Trung Tâm đoạn" +msgstr "Dùng Trung Tâm của Dải" msgid "Next Strip" -msgstr "Đoạn Tiếp" +msgstr "Dải Tiếp Theo" msgctxt "Operator" msgid "Add Strip Modifier" -msgstr "Thêm Bộ Điều Chỉnh Đoạn" +msgstr "Thêm Bộ Điều Chỉnh Dải" msgid "Add a modifier to the strip" -msgstr "Thêm một bộ điều chỉnh cho đoạn" +msgstr "Thêm một bộ điều chỉnh cho dải" msgctxt "Operator" msgid "Copy to Selected Strips" -msgstr "Chép Đến Đoạn Được Chọn" +msgstr "Sao Chép sang các Dải được Chọn" msgid "Copy modifiers of the active strip to all selected strips" -msgstr "Chép lại bộ điều chỉnh của đoạn hoạt động đến hết đoạn được chọn" +msgstr "Sao chép các bộ điều chỉnh của dải đang hoạt động đến toàn bộ các dải được chọn" msgid "Replace modifiers in destination" -msgstr "Thay thế cho bộ điều chỉnh trong đích" +msgstr "Thay thế các bộ điều chỉnh ở đích" msgid "Append active modifiers to selected strips" -msgstr "Kèm bộ điều chỉnh hoạt động với các đoạn được chọn" +msgstr "Bổ sung bộ điều chỉnh đang hoạt động vào dải được chọn" + + +msgctxt "Operator" +msgid "Redefine Equalizer Graphs" +msgstr "Đồ Thị Cân Bằng Tái Định" + + +msgid "Redefine equalizer graphs" +msgstr "Đồ thị cân bằng tái định" + + +msgid "Graphs" +msgstr "Đồ Thị" + + +msgid "Number of graphs" +msgstr "Số lượng đồ thị" + + +msgid "Unique" +msgstr "Duy Nhất" + + +msgid "One unique graphical definition" +msgstr "Một định nghĩa đồ họa độc nhất" + + +msgid "Graphical definition in 2 sections" +msgstr "Định nghĩa đồ họa trong 2 phần" + + +msgid "Triplet" +msgstr "Ba" + + +msgid "Graphical definition in 3 sections" +msgstr "Định nghĩa đồ họa trong 3 phần" + + +msgid "Name of modifier to redefine" +msgstr "Tên của bộ điều chỉnh để tái xác định" msgctxt "Operator" msgid "Move Strip Modifier" -msgstr "Di Chuyển Bộ Điều Chỉnh Đoạn" +msgstr "Di Chuyển Bộ Điều Chỉnh Dải" msgid "Move modifier up and down in the stack" -msgstr "Di chuyển bộ điều chỉnh lên xuống trong xếp đống" +msgstr "Di chuyển bộ điều chỉnh, lên và xuống, trong ngăn xếp" msgid "Name of modifier to remove" @@ -70137,186 +76801,186 @@ msgstr "Tên của bộ điều chỉnh để xóa" msgctxt "Operator" msgid "Remove Strip Modifier" -msgstr "Xóa Bộ Điều Chỉnh Đoạn" +msgstr "Xóa Bộ Điều Chỉnh của Dải" msgid "Remove a modifier from the strip" -msgstr "Xóa một bộ điều chỉnh từ đoạn" +msgstr "Xóa bộ điều chỉnh khỏi dải" msgctxt "Operator" msgid "Clear Strip Transform" -msgstr "Xóa Biến Hóa Đoạn" +msgstr "Xóa Biến Hóa của Dải" msgid "Reset image transformation to default value" -msgstr "Đặt lại biến hóa ảnh trở lại đến giá trị mặc định" +msgstr "Hoàn lại biến hóa hình ảnh về giá trị mặc định" msgid "Property" -msgstr "Đặc Tính" +msgstr "Tính Chất" msgid "Strip transform property to be reset" -msgstr "Đặc trưng biến hóa của đoạn để đặt lại" +msgstr "Tính chất biến hóa của dải sẽ được hoàn lại" msgid "Reset strip transform location" -msgstr "Đặt lại biến hóa vị trí của đoạn" +msgstr "Hoàn lại vị trí biến hóa của dải" msgid "Reset strip transform scale" -msgstr "Đặt lại biến hóa phóng to của đoạn" +msgstr "Hoàn lại biến hóa tỷ lệ của dải" msgid "Reset strip transform rotation" -msgstr "Đặt lại biến hóa xoay của đoạn" +msgstr "Hoàn lại biến hóa xoay chiều của dải" msgid "Reset strip transform location, scale and rotation" -msgstr "Đặt lại biến hóa vị trí, phóng to, và xoay" +msgstr "Hoàn lại biến hóa vị trí, tỷ lệ và chiều xoay của dải" msgctxt "Operator" msgid "Strip Transform Set Fit" -msgstr "Biến Hóa Đoạn Đặt Vừa" +msgstr "Biến Hóa Dải Phim: Khít Vừa" msgid "Scale fit fit_method" -msgstr "Phương pháp vừa hóa" +msgstr "Đổi tỷ lệ để khít vừa dùng phương pháp fit_method" msgid "Scale image so fits in preview" -msgstr "Phóng to ảnh cho vừa trong dự khán" +msgstr "Đổi tỷ lệ hình ảnh hầu cho nó khít vừa khung xem trước" msgid "Scale image so it fills preview completely" -msgstr "Phóng to ảnh cho vừa đầy toàn bộ dự khán" +msgstr "Đổi tỷ lệ hình ảnh hầu cho nó hoàn toàn lấp đầy khung xem trước" msgid "Stretch image so it fills preview" -msgstr "Kéo ảnh cho vừa dự khán" +msgstr "Kéo giãn hình ảnh hầu cho nó lấp đầy khung xem trước" msgctxt "Operator" msgid "Swap Strip" -msgstr "Trao Đổi Đoạn" +msgstr "Tráo Đổi Dải" msgid "Swap active strip with strip to the right or left" -msgstr "Trao đổi đoạn hoạt động với đoạn ở phía phả hay trái" +msgstr "Tráo đổi dải đang hoạt động với dải ở bên phải hay trái" msgid "Side of the strip to swap" -msgstr "Bên nào của đoạn cho trao đổi" +msgstr "Phía bên của dải để tráo đổi" msgctxt "Operator" msgid "Sequencer Swap Data" -msgstr "Trao Đổi Dữ Liệu Bộ Trình Tự" +msgstr "Trình Phối Hình Tráo Đổi Dữ Liệu" msgid "Swap 2 sequencer strips" -msgstr "Trao đổi 2 đoạn của bộ trình tự" +msgstr "Tráo đổi 2 dải của trình phối hình" msgctxt "Operator" msgid "Swap Inputs" -msgstr "Trao Đổi Ngõ Vào" +msgstr "Tráo Đổi các Đầu Vào" msgid "Swap the first two inputs for the effect strip" -msgstr "Trao đổi hai ngõ vào đầu của đoạn hiệu ứng" +msgstr "Tráo đổi hai nguồn đầu vào đầu tiên của trình tự hiệu ứng" msgctxt "Operator" msgid "Unlock Strips" -msgstr "Mở Khóa Đoạn" +msgstr "Tháo khóa Dải" msgid "Unlock strips so they can be transformed" -msgstr "Mở khóa đoạn cho có thể biến hóa chúng nó" +msgstr "Tháo khóa các dải để chúng có thể biến hóa" msgctxt "Operator" msgid "Unmute Strips" -msgstr "Mở Tiếng Đoạn" +msgstr "Kích Hoạt Dải" msgid "Unmute (un)selected strips" -msgstr "Mở tiếng các dãy được/chưa chọn" +msgstr "Bật hoạt tính của các dải được/chưa chọn" msgid "Unmute unselected rather than selected strips" -msgstr "Mở tiếng của các đoạn chưa được chọn thay các đoạn được chọn" +msgstr "Bật hoạt tính của các dải không được chọn, hơn là các dải được chọn" msgid "View all the strips in the sequencer" -msgstr "Hiển thị hết đoạn trong bộ trình tự" +msgstr "Hiển thị toàn bộ các dải trong trình phối hình" msgid "Zoom preview to fit in the area" -msgstr "Phóng to dự khán cho vừa khu vực" +msgstr "Thu-phóng vùng xem trước cho khít vừa diện tích" msgctxt "Operator" msgid "Border Offset View" -msgstr "Màn Dịch Lề" +msgstr "Khoanh Vùng Quan Sát Cục Bộ" msgid "Set the boundaries of the border used for offset view" -msgstr "Đặt ranh giới của lề được sử dụng cho màn nhìn dịch" +msgstr "Khoanh vùng ranh giới để quan sát cục bộ" msgid "Zoom the sequencer on the selected strips" -msgstr "Phóng bộ trình tự đến các đoạn được chọn" +msgstr "Thu-phóng trình phối hình trên các dải được chọn" msgctxt "Operator" msgid "Sequencer View Zoom Ratio" -msgstr "Tỉ Số Phóng To Màn Bộ Trình Tự" +msgstr "Tỷ Lệ Thu-Phóng Cổng Nhìn của Trình Phối Hình" msgid "Change zoom ratio of sequencer preview" -msgstr "Đổi tỉ số phóng to của dự khán bộ trình tự" +msgstr "Đổi tỷ lệ thu-phóng xem trước trình phối hình" msgctxt "Operator" msgid "Update Animation Cache" -msgstr "Nâng Cấp Đệm Chứa Hoạt Hình" +msgstr "Cập Nhật Bộ Đệm Nhớ Hoạt Họa" msgid "Update the audio animation cache" -msgstr "Nâng cấp đệm chứa âm thanh hoạt hình" +msgstr "Cập nhật bộ đệm nhớ âm thanh hoạt họa" msgctxt "Operator" msgid "Mixdown" -msgstr "Pha Trộn Kết" +msgstr "Hòa Trộn" msgid "Mix the scene's audio to a sound file" -msgstr "Pha trộn kết âm thanh của cảnh vào một tập tin âm thanh" +msgstr "Hòa trộn âm thanh của cảnh vào một tập tin âm thanh" msgid "Sample accuracy, important for animation data (the lower the value, the more accurate)" -msgstr "Độ chính xác mẫu vật, quan trọng cho dữ liệu hoạt hình (giá trị càng thấp càng chính xác)" +msgstr "Độ chính xác của mẫu vật - quan trọng đối với dữ liệu hoạt họa (giá trị càng thấp càng chính xác)" msgid "Bitrate in kbit/s" -msgstr "Tốc độ bit kbit/giây" +msgstr "Tần số bit trong kbit/giây" msgid "Advanced Audio Coding" -msgstr "Mã Hóa Âm Thanh Cấp Cao" +msgstr "Mã Hóa Âm Thanh Cao Cấp" msgid "Dolby Digital ATRAC 3" -msgstr "ATRAC 3 Kỷ Thuật Số Dolby" +msgstr "ATRAC 3 Kỹ Thuật Số Dolby" msgid "Free Lossless Audio Codec" -msgstr "Bộ Hóa Giải Mã Tự Do Âm Thanh Không Mật Nguồn" +msgstr "Bộ Hóa Giải Mã Miễn Phí Âm Thanh Bảo Toàn Chất Lượng" msgid "MPEG-1 Audio Layer II" @@ -70328,7 +76992,7 @@ msgstr "Âm Thanh MPEG-2 Lớp III" msgid "Pulse Code Modulation (RAW)" -msgstr "Mã Số Xung Biến Đổi (RAW)" +msgstr "Điều Mã Xung - PCM - (RAW)" msgid "Xiph.Org Vorbis Codec" @@ -70364,7 +77028,7 @@ msgstr "ogg" msgid "Xiph.Org Ogg Container" -msgstr "Bình Chứa Xiph.Org Ogg" +msgstr "Định dạng Xiph.Org Ogg" msgid "wav" @@ -70372,23 +77036,23 @@ msgstr "wav" msgid "Waveform Audio File Format" -msgstr "Định Dạng Tập Tin Âm Thanh Dạng Sóng" +msgstr "Định Dạng Tập Tin Âm Thanh Hình Sóng" msgid "Sample format" -msgstr "Định Dạng Mẫu Vật" +msgstr "Định dạng mẫu vật" msgid "8-bit unsigned" -msgstr "8 bit không dấu" +msgstr "8-bit không dấu" msgid "16-bit signed" -msgstr "16 bit có dấu" +msgstr "16-bit có dấu" msgid "24-bit signed" -msgstr "24 bit có dấu" +msgstr "24-bit có dấu" msgid "32-bit signed" @@ -70396,19 +77060,19 @@ msgstr "32 bit có dấu" msgid "32-bit floating-point" -msgstr "32 bit số thật dấu phẩy động" +msgstr "32 bit số thực" msgid "64-bit floating-point" -msgstr "64 bit số thật dấu phẩy động" +msgstr "64 bit số thực" msgid "Split channels" -msgstr "Chẻ các kênh" +msgstr "Tách phân các kênh" msgid "Each channel will be rendered into a mono file" -msgstr "Mỗi kênh sẽ kết xuất trong một tập tin độc kênh" +msgstr "Mỗi kênh sẽ được kết xuất thành một tập tin mono (đơn kênh)" msgctxt "Operator" @@ -70417,38 +77081,38 @@ msgstr "Mở Âm Thanh" msgid "Load a sound file" -msgstr "Nhập một tập tin âm thanh" +msgstr "Đọc một tập tin âm thanh" msgctxt "Operator" msgid "Open Sound Mono" -msgstr "Mở Âm Thanh Độc Kênh" +msgstr "Mở Âm Thanh Mono" msgid "Load a sound file as mono" -msgstr "Nhập một âm thanh kiểu độc kênh" +msgstr "Nạp một tập tin âm thanh và biến thành mono (đơn kênh)" msgid "Mixdown the sound to mono" -msgstr "Pha trộn kết âm thanh thành độc kênh" +msgstr "Kết hợp âm thanh lại thành mono (đơn kênh)" msgctxt "Operator" msgid "Pack Sound" -msgstr "Gói Âm Thanh" +msgstr "Đóng Gói Âm Thanh" msgid "Pack the sound into the current blend file" -msgstr "Gói lại âm thanh vào tập tin .blend hiện tại" +msgstr "Đóng gói âm thanh vào tập tin .blend hiện tại" msgctxt "Operator" msgid "Unpack Sound" -msgstr "Gỡ Gói Âm Thanh" +msgstr "Mở Gói Âm Thanh" msgid "Unpack the sound to the samples filename" -msgstr "Gỡ gói âm thanh vào tên tập tin mẫu vật" +msgstr "Mở Gói âm thanh ra tên tập tin các mẫu vật" msgid "Sound Name" @@ -70456,114 +77120,114 @@ msgstr "Tên Âm Thanh" msgid "Sound data-block name to unpack" -msgstr "Tên cục dữ liệu âm thanh để gỡ gói" +msgstr "Tên khối dữ liệu âm thanh để mở gói" msgctxt "Operator" msgid "Update Animation" -msgstr "Nâng Cấp Hoạt Hình" +msgstr "Cập Nhật Hoạt Họa" msgid "Update animation flags" -msgstr "Nâng cấp cờ hoạt hình" +msgstr "Cập nhật các cờ hoạt họa" msgctxt "Operator" msgid "Add Row Filter" -msgstr "Thêm Bộ Lọc Hàng" +msgstr "Thêm Thanh Lọc Hàng" msgid "Add a filter to remove rows from the displayed data" -msgstr "Thêm một bộ lọc để xóa các hàng từ dữ liệu được hiển thị" +msgstr "Thêm một thanh lọc để xóa các hàng khỏi dữ liệu hiển thị" msgctxt "Operator" msgid "Change Visible Data Source" -msgstr "Đổi Nguồn Dữ Liệu Hiển Thị" +msgstr "Thay Đổi Nguồn Dữ Liệu Nhìn Thấy Được" msgid "Change visible data source in the spreadsheet" -msgstr "Đổi nguồn dữ liệu hiển thị trong bảng tính" +msgstr "Đổi nguồn dữ liệu hữu hình trong bảng tính" msgid "Attribute Domain Type" -msgstr "Loại Phạm Vi Đặc Điểm" +msgstr "Thể Loại Phạm Vi Thuộc Tính" msgid "Component Type" -msgstr "Loại Thành Phần" +msgstr "Thể Loại Thành Phần" msgctxt "Operator" msgid "Remove Row Filter" -msgstr "Xóa Bộ Lọc Hàng" +msgstr "Xóa Thanh Lọc Hàng" msgid "Remove a row filter from the rules" -msgstr "Xóa một bộ lọc hàng từ quy định" +msgstr "Xóa một thanh lọc hàng khỏi các quy tắc" msgctxt "Operator" msgid "Toggle Pin" -msgstr "Bật/Tắt Đinh Ghim" +msgstr "Bật/Tắt Đính Ghim" msgid "Turn on or off pinning" -msgstr "Bật hat tắt đinh ghim" +msgstr "Bật hoặc tắt đính ghim" msgctxt "Operator" msgid "Add Surface Circle" -msgstr "Thêm Vòng Tròn Bề Mặt" +msgstr "Thêm Vòng Tròn Mặt" msgid "Construct a Nurbs surface Circle" -msgstr "Xây một Vòng Tròn bề mặt NURBS" +msgstr "Kiến tạo một Vòng Tròn mặt NURBS (Non-uniform rational basis spline)" msgctxt "Operator" msgid "Add Surface Curve" -msgstr "Thêm Đường Cong Bề Mặt" +msgstr "Thêm Đường Cong Mặt" msgid "Construct a Nurbs surface Curve" -msgstr "Xây một Đường Cong bề mặt NURBS" +msgstr "Kiến tạo một Đường Cong mặt NURBS (Non-uniform rational basis spline)" msgctxt "Operator" msgid "Add Surface Cylinder" -msgstr "Thêm Hình Trụ Bề Mật" +msgstr "Thêm Hình Trụ Mặt" msgid "Construct a Nurbs surface Cylinder" -msgstr "Xây một Hình Trụ bề mặt NURBS" +msgstr "Kiến tạo một Hình Trụ mặt NURBS (Non-uniform rational basis spline)" msgctxt "Operator" msgid "Add Surface Sphere" -msgstr "Thêm Hình Cầu Bề Mặt" +msgstr "Thêm Hình Cầu Mặt" msgid "Construct a Nurbs surface Sphere" -msgstr "Xây một Hình Cầu bề mặt NURBS" +msgstr "Kiến tạo một Hình Cầu mặt NURBS (Non-uniform rational basis spline)" msgctxt "Operator" msgid "Add Surface Patch" -msgstr "Thêm Vá Bề Mặt" +msgstr "Thêm Miếng Bề Mặt" msgid "Construct a Nurbs surface Patch" -msgstr "Xây một Vá bề mặt NURB" +msgstr "Kiến tạo một miếng bề mặt Nurbs (Non-uniform rational basis spline)" msgctxt "Operator" msgid "Add Surface Torus" -msgstr "Thêm Hình Xuyến Bề Mặt" +msgstr "Thêm Hình Xuyến Mặt" msgid "Construct a Nurbs surface Torus" -msgstr "Xây một Hình Xuyến bề mặt NURBS" +msgstr "Kiến tạo một Hình Xuyến với mặt NURBS (Non-uniform rational basis spline)" msgctxt "Operator" @@ -70577,11 +77241,11 @@ msgstr "Thêm một chất liệu mới" msgctxt "Operator" msgid "Copy Texture Slot Settings" -msgstr "Chép Cài Đặt Khe Chất Liệu" +msgstr "Sao Chép Sắp Đặt của Khe Chất Liệu" msgid "Copy the material texture settings and nodes" -msgstr "Chép cài đặt và giao điểm của chất liệu vật liệu" +msgstr "Sao chép các sắp đặt và các nút chất liệu của nguyên vật liệu" msgctxt "Operator" @@ -70595,54 +77259,63 @@ msgstr "Di chuyển khe chất liệu lên và xuống" msgctxt "Operator" msgid "Paste Texture Slot Settings" -msgstr "Dán Cài Đặt Khe Chất Liệu" +msgstr "Dán Sắp Đặt của Khe Chất Liệu" msgid "Copy the texture settings and nodes" -msgstr "Chép cài đặt và giao điểm chất liệu" +msgstr "Sao chép các sắp đặt và các nút về chất liệu" + + +msgctxt "Operator" +msgid "Add Text Editor Preset" +msgstr "Thêm Cài Sẵn Trình Biên Soạn Văn Bản" + + +msgid "Add or remove a Text Editor Preset" +msgstr "Thêm hoặc xóa Cài Đặt Sẵn của Trình Biên Soạn Văn Bản" msgctxt "Operator" msgid "Text Auto Complete" -msgstr "Tự Động Hoàn Thành Văn Bản" +msgstr "Tự Động Hoàn Chỉnh Câu/Từ" msgid "Show a list of used text in the open document" -msgstr "Hiện một danh sách của văn bản được dùng trong tài liệu mở" +msgstr "Hiển thị một danh sách các chữ/từ đã sử dụng trong tài liệu đang mở" msgctxt "Operator" msgid "Toggle Comments" -msgstr "Bật/Tắt Chú Thích" +msgstr "Bật/Tắt Nhận Xét" msgid "Add or remove comments" -msgstr "Thâm hay xóa chú thích" +msgstr "Cho thêm hoặc xóa đi các nhận xét" msgid "Toggle Comments" -msgstr "Bật/Tắt Chú Thích" +msgstr "Bật/Tắt Nhận Xét" msgid "Comment" -msgstr "Chú Thích" +msgstr "Nhận Xét" msgid "Un-Comment" -msgstr "Xóa Chú Thích" +msgstr "Bỏ Nhận Xét" msgctxt "Operator" msgid "Convert Whitespace" -msgstr "Biến Đổi Dấu Cách" +msgstr "Chuyển Đổi Khoảng Trống Trắng" msgid "Convert whitespaces by type" -msgstr "Biến đổi dấu cách tùy loại" +msgstr "Chuyển đổi khoảng trống trắng tùy thể loại" msgid "Type of whitespace to convert to" -msgstr "Biến đổi thành loại dấu cách nào" +msgstr "Thể loại khoảng trống trắng để chuyển đổi thành" msgid "To Spaces" @@ -70664,11 +77337,11 @@ msgstr "Cắt" msgctxt "Operator" msgid "Duplicate Line" -msgstr "Chép Dòng" +msgstr "Nhân Đôi Dòng" msgid "Duplicate the current line" -msgstr "Chép dòng hiện tại" +msgstr "Nhân đôi dòng hiện tại" msgctxt "Operator" @@ -70677,20 +77350,20 @@ msgstr "Tìm Tiếp" msgid "Find specified text" -msgstr "Tìm văn bản được xác định" +msgstr "Tìm văn bản chỉ định" msgctxt "Operator" msgid "Find & Set Selection" -msgstr "Tìm Kiếm & Đặt Sự Lựa Chọn" +msgstr "Tìm và Đặt Vùng Lựa Chọn" msgid "Find specified text and set as selected" -msgstr "Tìm văn bản được xác định và đặt nó là được chọn" +msgstr "Tìm văn bản chỉ định và đặt là được chọn" msgid "Indent selected text" -msgstr "Thụt văn bản được chọn" +msgstr "Thụt lề cho văn bản được chọn" msgctxt "Operator" @@ -70703,13 +77376,30 @@ msgstr "Nhảy con trỏ đến dòng" msgid "Line number to jump to" -msgstr "Số dòng cho nhảy đến" +msgstr "Số của dòng để nhảy đến" + + +msgctxt "Operator" +msgid "Jump to File at Point" +msgstr "Nhảy đến Tập Tin tại Điểm" + + +msgid "Jump to a file for the text editor" +msgstr "Nhảy đến một tập tin cho trình biên soạn văn bản" msgid "Column" msgstr "Cột" +msgid "Column to jump to" +msgstr "Cột để nhảy đến" + + +msgid "Line to jump to" +msgstr "Dòng để nhảy đến" + + msgctxt "Operator" msgid "Line Number" msgstr "Số Dòng" @@ -70721,11 +77411,11 @@ msgstr "Số dòng hiện tại" msgctxt "Operator" msgid "Make Internal" -msgstr "Làm Nội Bộ" +msgstr "Gắn Làm Nội Bộ" msgid "Make active text file internal" -msgstr "Làm tập tin văn bản hoạt động nội bộ" +msgstr "Biến tập tin văn bản đang hoạt động thành tập tin nội bộ" msgid "File Top" @@ -70733,16 +77423,16 @@ msgstr "Đầu Tập Tin" msgid "File Bottom" -msgstr "Đấy Tập Tin" +msgstr "Đáy Tập Tin" msgctxt "Operator" msgid "Move Lines" -msgstr "Di Chuyển Dòng" +msgstr "Di Chuyển các Dòng" msgid "Move the currently selected line(s) up/down" -msgstr "Di chuyển các dòng được chọn lên/xuống" +msgstr "Di chuyển (những) dòng hiện đang chọn lên/xuống" msgctxt "Operator" @@ -70751,7 +77441,7 @@ msgstr "Văn Bản Mới" msgid "Create a new text data-block" -msgstr "Chế tạo một cục dữ liệu văn bản mới" +msgstr "Kiến Tạo một khối văn bản mới" msgctxt "Operator" @@ -70760,42 +77450,42 @@ msgstr "Mở Văn Bản" msgid "Open a new text data-block" -msgstr "Mở một cục dữ liệu văn bản mới" +msgstr "Mở một khối văn bản mới" msgid "Make Internal" -msgstr "Làm Nội Bộ" +msgstr "Gắn Làm Nội Bộ" msgid "Make text file internal after loading" -msgstr "Làm tập tin văn bản là tập tin nội bộ sau nhập" +msgstr "Gắn tập tin văn bản vào nội bộ sau khi nạp" msgctxt "Operator" msgid "Toggle Overwrite" -msgstr "Bật/Tắt Ghi Trên" +msgstr "Bật/Tắt Viết Đè" msgid "Toggle overwrite while typing" -msgstr "Bật/tắt ghi trên khi gõ chữ" +msgstr "Bật/Tắt viết đè trong khi đánh máy chữ" msgctxt "Operator" msgid "Refresh PyConstraints" -msgstr "Nạp Lại Ràng Buộc Python" +msgstr "Làm Tươi Lại Ràng Buộc Python" msgid "Refresh all pyconstraints" -msgstr "Nạp lại hết ràng buộc Python" +msgstr "Làm tươi lại toàn bộ các ràng buộc Python" msgctxt "Operator" msgid "Reload" -msgstr "Nhập Lại" +msgstr "Tái Nạp" msgid "Reload active text data-block from its file" -msgstr "Nhập lại cục dữ liệu văn bản hoạt động từ tập tin của nó" +msgstr "Nạp lại khối dữ liệu văn bản đang hoạt động từ tập tin của nó" msgctxt "Operator" @@ -70804,50 +77494,50 @@ msgstr "Thay Thế" msgid "Replace text with the specified text" -msgstr "Thay thế văn bản với văn bản được xác định" +msgstr "Thay thế văn bản với văn bản xác định" msgid "Replace All" -msgstr "Thay Thế Hết" +msgstr "Thay Thế Toàn Bộ" msgid "Replace all occurrences" -msgstr "Thay thế cho hết lần xuất hiện" +msgstr "Thay thế toàn bộ các trường hợp tìm thấy" msgctxt "Operator" msgid "Replace & Set Selection" -msgstr "Thay Thế & Đặt Sự Lựa Chọn" +msgstr "Thay Thế & Đặt Vùng Lựa Chọn" msgid "Replace text with specified text and set as selected" -msgstr "Thay thế văn bản với văn bản được xác định và đặt là được chọn" +msgstr "Thay thế văn bản với văn bản xác định và đặt là được chọn" msgctxt "Operator" msgid "Resolve Conflict" -msgstr "Giải Mâu Thuẫn" +msgstr "Giải Tỏa Mâu Thuẫn" msgid "When external text is out of sync, resolve the conflict" -msgstr "Khi văn bản ngoài không đồng bộ, giải mâu thuẫn" +msgstr "Giải tỏa mâu thuẫn khi văn bản bên ngoài không còn đồng bộ nữa" msgid "How to solve conflict due to differences in internal and external text" -msgstr "Làm sao giải mẫu thuẫn từ chênh lệch giữa văn bản ngoài và văn bản trong" +msgstr "Phương pháp giải tỏa mâu thuẫn gây ra do những chênh lệch trong văn bản nội bộ và văn bản bên ngoài" msgid "Ignore" -msgstr "Không Chú Ý" +msgstr "Bỏ Qua" msgctxt "Operator" msgid "Run Script" -msgstr "Chạy Văn Thảo" +msgstr "Thi Hành Tập Lệnh" msgid "Run active script" -msgstr "Chạy văn thảo hoạt động" +msgstr "Thi hành tập lệnh đang hoạt động" msgctxt "Operator" @@ -70856,16 +77546,16 @@ msgstr "Lưu" msgid "Save active text data-block" -msgstr "Lưu cục dữ liệu văn bản hoạt động" +msgstr "Lưu khối dữ liệu văn bản đang hoạt động" msgctxt "Operator" msgid "Save As" -msgstr "Luư" +msgstr "Lưu Thành" msgid "Save active text file with options" -msgstr "Lưu tập tin văn bản hoạt động với tùy chọn" +msgstr "Lưu tập tin văn bản đang hoạt động với các tùy chọn" msgctxt "Operator" @@ -70874,7 +77564,7 @@ msgstr "Cuộn" msgid "Number of lines to scroll" -msgstr "Cuộn bao nhiêu dòng " +msgstr "Số dòng cuộn" msgctxt "Operator" @@ -70888,50 +77578,54 @@ msgstr "Chọn Dòng" msgid "Select text by line" -msgstr "Chọn văn bản tùy dòng" +msgstr "Chọn văn bản theo dòng" + + +msgid "Set text selection" +msgstr "Đặt lựa chọn văn bản" msgctxt "Operator" msgid "Find" -msgstr "Tìm" +msgstr "Lùng Tìm" msgid "Start searching text" -msgstr "Bắt đầu tìm văn bản" +msgstr "Khởi lùng tìm văn bản" msgctxt "Operator" msgid "To 3D Object" -msgstr "Đến Vật Thể 3D" +msgstr "Thành Đối Tượng 3D" msgid "Create 3D text object from active text data-block" -msgstr "Chế tạo vật thể văn bản 3D từ cục dữ liệu văn bản hoạt động" +msgstr "Kiến Tạo đối tượng văn bản 3D từ khối dữ liệu văn bản đang hoạt động" msgid "Split Lines" -msgstr "Chẻ Dòng" +msgstr "Phân Tách Dòng" msgid "Create one object per line in the text" -msgstr "Chế tạo một vật thể cho mỗi dòng trong văn bản" +msgstr "Kiến Tạo mỗi dòng trong văn bản thành một đối tượng" msgid "Unindent selected text" -msgstr "Không thụt văn bản được chọn" +msgstr "Xóa thụt lề của văn bản được chọn" msgid "Unlink active text data-block" -msgstr "Gỡ liên kết cục dữ liệu văn bản hoạt động" +msgstr "Ngắt kết nối với khối dữ liệu văn bản đang hoạt động" msgctxt "Operator" msgid "Scale B-Bone" -msgstr "Phóng To Xương-B" +msgstr "Đổi Tỷ Lệ Xương-Dẻo" msgid "Scale selected bendy bones display size" -msgstr "Phóng to kích thước hiển thị của các xương dẻo được chọn" +msgstr "Đổi tỷ lệ kích thước hiển thị của các xương dẻo (bendy bones) đã chọn" msgid "Constraint Axis" @@ -70939,7 +77633,7 @@ msgstr "Ràng Buộc Trục" msgid "Matrix Orientation" -msgstr "Định Hướng Ma Trận" +msgstr "Ma Trận Định Hướng" msgid "Transformation orientation" @@ -70947,64 +77641,64 @@ msgstr "Định hướng biến hóa" msgid "Bend selected items between the 3D cursor and the mouse" -msgstr "Bể cong mặt hàng được chọn giữa cong trỏ 3D và chuột" +msgstr "Uốn cong các phần tử được chọn giữa con trỏ 3D và chuột" msgid "Center Override" -msgstr "Vượt Quyền Trung Tâm" +msgstr "Thay Thế Trọng Tâm" msgid "Force using this center value (when set)" -msgstr "Bắt dùng giá trị này cho trung tâm (khi được đặt)" +msgstr "Bắt phải sử dụng giá trị trọng tâm này (khi đã đặt rồi)" msgid "Edit Grease Pencil" -msgstr "Biên Tập Bút Sáp" +msgstr "Biên Soạn Bút Chì Dầu" msgid "Edit selected Grease Pencil strokes" -msgstr "Biên tập nét Bút Sáp được chọn" +msgstr "Biên soạn nét Bút Chì Dầu được chọn" msgid "Use Snapping Options" -msgstr "Dùng Tùy Chọn Hút Dính" +msgstr "Dùng các Tùy Chọn về Bám dính" msgctxt "Operator" msgid "Create Orientation" -msgstr "Chế Tạo Định Hướng" +msgstr "Kiến Tạo Định Hướng" msgid "Create transformation orientation from selection" -msgstr "Chế tạo định hướng biến hóa từ sự lựa chọn" +msgstr "Kiến Tạo định hướng biến hóa từ lựa chọn" msgid "Name of the new custom orientation" -msgstr "Tên của định hướng tùy chọn" +msgstr "Tên của định hướng tùy chọn mới" msgid "Overwrite Previous" -msgstr "Ghi Trên Trước" +msgstr "Viết Đè lên cái Trước Đây" msgid "Overwrite previously created orientation with same name" -msgstr "Ghi trên định hướng được chế tạo trước có cùng tên" +msgstr "Viết đè lên các định hướng đã kiến tạo trước đây có cùng tên" msgid "Use After Creation" -msgstr "Dùng Sau Chế Tạo" +msgstr "Sử dụng sau khi kiến tạo" msgid "Select orientation after its creation" -msgstr "Chọn định hướng sau được chế tạo nó" +msgstr "Chọn định hướng sau sự kiến tạo của nó" msgid "Use View" -msgstr "Dùng Màn" +msgstr "Sử Dụng Góc Nhìn" msgid "Use the current view instead of the active object to create the new orientation" -msgstr "Dùng màn hiện tại thay thế vật thể hoạt động cho chế tạo định hướng mới" +msgstr "Dùng góc nhìn hiện tại, thay vì cái của đối tượng đang hoạt động, để kiến tạo định hướng mới" msgctxt "Operator" @@ -71013,74 +77707,78 @@ msgstr "Xóa Định Hướng" msgid "Delete transformation orientation" -msgstr "Xóa định hướng biến hóa" +msgstr "Xóa định hướng của biến hóa" msgctxt "Operator" msgid "Edge Bevel Weight" -msgstr "Quyền Lượng Cạnh Tròn Cạnh" +msgstr "Trọng Lượng Bo Tròn Cạnh" msgid "Change the bevel weight of edges" -msgstr "Đổi quyền lượng của cạnh" +msgstr "Đổi trọng lượng bo tròn của các cạnh" msgctxt "Operator" msgid "Edge Crease" -msgstr "Nhăn Cạnh" +msgstr "Miết Nếp Gấp" msgid "Change the crease of edges" -msgstr "Đổi nhăn của cạnh" +msgstr "Đổi độ cứng/sắc nét của nếp gấp" msgctxt "Operator" msgid "Edge Slide" -msgstr "Trượt Cạnh" +msgstr "Trượt Đẩy Cạnh" msgid "Correct UVs" -msgstr "Sửa UV" +msgstr "Chỉnh Sửa UV" msgid "Correct UV coordinates when transforming" -msgstr "Sửa tọa độ UV khi biến hóa" +msgstr "Chỉnh sửa các tọa độ UV khi biến hóa" msgid "When Even mode is active, flips between the two adjacent edge loops" -msgstr "Khi chế độ Chẵn đang hoạt động, lật giữa hai vòng cạnh kề" +msgstr "Khi sử dụng chế độ Đều Đặn, đảo lật giữa hai vòng cạnh kề cận" msgid "Single Side" -msgstr "Một Mặt" +msgstr "Đơn Bên" msgid "Snap to Elements" -msgstr "Hút Dính đến Phần Tử" +msgstr "Bám Dính Vào các Phần Tử" + + +msgid "Snap to increments" +msgstr "Bám Dính theo Mức Tịnh Tiến" msgid "Snap to vertices" -msgstr "Hút dính đến đỉnh" +msgstr "Bám dính vào các điểm đỉnh" msgid "Snap to edges" -msgstr "Hút dính đến cạnh" +msgstr "Bám dính vào cạnh" msgid "Snap by projecting onto faces" -msgstr "Hút dính bằng chiếu trên mặt" +msgstr "Bám dính bằng cách phóng chiếu lên các mặt" msgid "Snap to volume" -msgstr "Hút dính đến thể tích" +msgstr "Bám dính vào thể tích" msgid "Edge Center" -msgstr "Trung Điểm Cạnh" +msgstr "Trung Điểm của Cạnh" msgid "Snap to the middle of edges" -msgstr "Hút dính đến trung điểm của cạnh" +msgstr "Bám dính vào trung điểm của các cạnh" msgid "Edge Perpendicular" @@ -71088,11 +77786,11 @@ msgstr "Cạnh Vuông Góc" msgid "Snap to the nearest point on an edge" -msgstr "Hút dính đến điểm gần nhất trên một cạnh" +msgstr "Bám dính vào điểm gần nhất trên một cạnh" msgid "Face Project" -msgstr "Chiếu Mặt" +msgstr "Phóng Chiếu Mặt" msgid "Face Nearest" @@ -71100,120 +77798,128 @@ msgstr "Mặt Gần Nhất" msgid "Snap to nearest point on faces" -msgstr "Hút dính đến điểm gần nhất trên các mặt" +msgstr "Bám dính vào điểm gần nhất trên các mặt" msgid "Snap With" -msgstr "Hút Dính Với" +msgstr "Bám Dính Với" msgid "Snap closest point onto target" -msgstr "Hút dính đến điểm gần nhất" +msgstr "Bám dính điểm gần nhất vào mục tiêu" msgid "Snap transformation center onto target" -msgstr "Hút dính trung tâm biến hóa đến mục tiêu" +msgstr "Bám dính trung tâm biến hóa vào mục tiêu" msgid "Snap median onto target" -msgstr "Hút dính trung vị đến mục tiêu" +msgstr "Bám dính trung điểm vào mục tiêu" msgid "Snap active onto target" -msgstr "Hút dính hoạt động đến mục tiêu" +msgstr "Bám dính cái đang hoạt động vào mục tiêu" msgid "Clamp within the edge extents" -msgstr "Kẹp lại trong hạn của cạnh" +msgstr "Hạn định nội trong phạm vi của cạnh" msgid "Make the edge loop match the shape of the adjacent edge loop" -msgstr "Làm vòng cạnh theo hình dạng của vòng cạnh kề" +msgstr "Bắt vòng cạnh phải khớp với hình dạng của vòng cạnh kề cạnh" msgid "Target: Include Edit" -msgstr "Mục Tiêu: Gồm Biên Tập" +msgstr "Mục Tiêu: Bao Gồm cái Chỉnh Sửa" msgid "Target: Include Non-Edited" -msgstr "Mục Tiêu: Gồm Chưa Biên Tập" +msgstr "Mục Tiêu: Bao Gồm cái Không Chỉnh Sửa" msgid "Project Individual Elements" -msgstr "Chiếu Phần Tử Riêng Nhau" +msgstr "Phóng Chiếu Từng Phần Tử Riêng Biệt" msgid "Target: Exclude Non-Selectable" -msgstr "Mục Tiêu: Trừ Lọai Không Thể Chọn" +msgstr "Mục Tiêu: Loại Trừ cái Không Thể Chọn" msgid "Target: Include Active" -msgstr "Mục Tiêu: Gồm Hoạt Động" +msgstr "Mục Tiêu: Bao Gồm cái đang Hoạt Động" msgctxt "Operator" msgid "Transform from Gizmo" -msgstr "Biến Hóa Từ Đồ Đạc" +msgstr "Biến Hóa từ Gizmo" msgid "Mirror selected items around one or more axes" -msgstr "Gương lại các mặt hàng được chọn quanh một trục trở lên" +msgstr "Phản chiếu đối xứng các phần tử được chọn quanh một hay nhiều trục" msgctxt "Operator" msgid "Push/Pull" -msgstr "Đẩy/Kéo" +msgstr "Đẩn/Kéo" msgid "Push/Pull selected items" -msgstr "Đẩy/Kéo mặt hằng được chọn" +msgstr "Đẩn/Kéo các phần tử được chọn" msgctxt "Operator" msgid "Resize" -msgstr "Đổi Kích Cỡ" +msgstr "Đổi Kích Thước" msgid "Scale (resize) selected items" -msgstr "Phóng to (đổi kích cỡ) mặt hàng được chọn" +msgstr "Đổi tỷ lệ (đổi kích thước) các phần tử được chọn" msgid "Mouse Directional Constraint" -msgstr "Ràng Buộc Hướng Chuột" +msgstr "Ràng Buộc Định Hướng của Chuột" msgid "Remove on Cancel" -msgstr "Xóa Khi Hủy" +msgstr "Xóa khi Hủy" msgid "Remove elements on cancel" -msgstr "Xóa phần tử khi hủy" +msgstr "Xóa các phần tử khi hủy" msgid "Edit Texture Space" -msgstr "Biên Tập Không Gian Chất Liệu" +msgstr "Biên Soạn Không Gian Chất Liệu" msgid "Edit object data texture space" -msgstr "Biên tập không gian chất liệu dữ liệu của vật thể" +msgstr "Biên soạn dữ liệu đối tượng trong không gian chất liệu" + + +msgid "Duplicated Keyframes" +msgstr "Khung Khóa Trùng Lặp" + + +msgid "Transform duplicated keyframes" +msgstr "Biến hóa các khung khóa hóa trùng lặp" msgctxt "Operator" msgid "Rotate" -msgstr "Xoay" +msgstr "Xoay Chiều" msgid "Rotate selected items" -msgstr "Xoay mặt hàng được chọn" +msgstr "Xoay chiều các phần tử được chọn" msgctxt "Operator" msgid "Rotate Normals" -msgstr "Xoay Pháp Tuyến" +msgstr "Xoay Chiều Pháp Tuyến" msgid "Rotate split normal of selected items" -msgstr "Xoay pháp tuyến chẻ của các mặt hàng được chọn" +msgstr "Xoay chiều pháp tuyến tách phân của những đối tượng được chọn" msgctxt "Operator" @@ -71227,20 +77933,24 @@ msgstr "Chọn định hướng biến hóa" msgctxt "Operator" msgid "Sequence Slide" -msgstr "Trượt Trình Tự" +msgstr "Trượt Đẩy Trình Tự" msgid "Edge Pan" -msgstr "Dời Cạnh" +msgstr "Lia ở Cạnh" msgid "Enable edge panning in 2D view" -msgstr "Bật dời cạnh trong màn 2D" +msgstr "Bật/tắt khả năng lia ở cạnh (edge panning) trong khung nhìn 2D" msgctxt "Operator" msgid "Shear" -msgstr "Méo Mó" +msgstr "Xô Nghiêng" + + +msgid "Shear selected items along the given axis" +msgstr "Xô nghiêng các mục đã chọn dọc theo trục đã cho" msgid "Axis Ortho" @@ -71254,38 +77964,38 @@ msgstr "Thu Nhỏ/Phình To" msgctxt "Operator" msgid "Skin Resize" -msgstr "Đổi Kích Cỡ Da" +msgstr "Đổi Kích Thước của Da" msgid "Scale selected vertices' skin radii" -msgstr "Phóng to bán kính da của các đỉnh được chọn" +msgstr "Đổi tỷ lệ bán kính da của các điểm đỉnh được chọn" msgctxt "Operator" msgid "Tilt" -msgstr "Ngiêng" +msgstr "Xoay Nghiêng" msgid "Tilt selected control vertices of 3D curve" -msgstr "Nghiêng hóa các đỉnh điều khiển của đường cong 3D" +msgstr "Xoay nghiêng các điểm đỉnh điều khiển đã chọn của đường cong 3D" msgctxt "Operator" msgid "To Sphere" -msgstr "Đến Hình Cầu" +msgstr "Thành Hình Cầu" msgid "Move selected items outward in a spherical shape around geometric center" -msgstr "Di chuyển các mặt hàng được chọn xa hơn bởi kiểu hình cầu xung quanh trung tâm của hình dạng" +msgstr "Di chuyển các phần tử được chọn ra phía ngoài, trong khung hình cầu, quanh trung tâm hình học" msgctxt "Operator" msgid "Trackball" -msgstr "Trái Banh Điều Khiển" +msgstr "Hòn Bi Điều Khiển" msgid "Trackball style rotation of selected items" -msgstr "Xoay các mặt hàng được chọn kiểu trái banh điều khiển" +msgstr "Xoay chiều dùng phong cách điều khiển hình cầu trên vật được chọn" msgctxt "Operator" @@ -71294,15 +78004,15 @@ msgstr "Biến Hóa" msgid "Align with Point Normal" -msgstr "Sắp xếp với Pháp Tuyến Điểm" +msgstr "Căn chỉnh với Pháp Tuyến của Điểm" msgid "Auto Merge & Split" -msgstr "Tự Động Gồm & Chẻ" +msgstr "Tự Động Hợp Nhất và Tách Phân" msgid "Forces the use of Auto Merge and Split" -msgstr "Ép buộc sử dụng Tự Động Gồm và Chẻ" +msgstr "Ép sử dụng Tự Động Hợp Nhất và Tách phân" msgid "Values" @@ -71320,20 +78030,20 @@ msgstr "Biến Hóa Con Trỏ" msgctxt "Operator" msgid "Vertex Crease" -msgstr "Nhăn Đỉnh" +msgstr "Nếp Gấp Điểm Đỉnh" msgid "Change the crease of vertices" -msgstr "Đổi nhăn của các đỉnh" +msgstr "Đổi nếp gấp của các điểm đỉnh" msgctxt "Operator" msgid "Vertex Slide" -msgstr "Trược Đỉnh" +msgstr "Trượt Điểm Đỉnh" msgid "Slide a vertex along a mesh" -msgstr "Trượt một đỉnh theo một mạng lưới" +msgstr "Đẩy trượt một điểm đỉnh dọc theo khung lưới" msgctxt "Operator" @@ -71342,124 +78052,163 @@ msgstr "Ngẫu Nhiên Hóa" msgid "Randomize vertices" -msgstr "Ngẫu nhiên hóa các đỉnh" +msgstr "Ngẫu nhiên hóa điểm đỉnh" msgid "Align offset direction to normals" -msgstr "Sắp xếp hướng địch cùng với pháp tuyến" +msgstr "Căn chỉnh chiều hướng dịch chuyển theo các pháp tuyến" msgid "Distance to offset" -msgstr "Khoảng cách đến dịch" +msgstr "Khoảng cách để dịch chuyển" msgid "Increase for uniform offset distance" -msgstr "Tăng cho khoảng cách dịch đều" +msgstr "Tăng lên để có khoảng cách dịch chuyển đồng đều" msgctxt "Operator" msgid "Warp" -msgstr "Bể Cong" +msgstr "Uốn Oằn/Kéo" msgid "Warp vertices around the cursor" -msgstr "Bể cong đỉnh quanh con trỏ" +msgstr "Uốn oằn các điểm đỉnh quanh con trỏ" msgid "Offset Angle" -msgstr "Dịch Góc" +msgstr "Góc Độ Dịch Chuyển" msgid "Angle to use as the basis for warping" -msgstr "Dùng góc nào cho làm cơ sở cho bể cong" +msgstr "Góc độ sử dụng làm cơ sở cho quá trình uốn oằn" msgid "Warp Angle" -msgstr "Góc Bể Cong" +msgstr "Góc Độ Uốn Oằn" msgid "Amount to warp about the cursor" -msgstr "Mức bể cong quanh con trỏ" +msgstr "Lượng uốn oằn quanh con trỏ" + + +msgctxt "Operator" +msgid "Add Entry" +msgstr "Thêm Mục Nhập" + + +msgid "Add an entry to the list after the current active item" +msgstr "Thêm một mục nhập vào danh sách, sau mục đang hoạt động hiện tại" + + +msgctxt "Operator" +msgid "Move Entry" +msgstr "Di Chuyển Mục" + + +msgid "Move an entry in the list up or down" +msgstr "Di chuyển một mục trong danh sách lên hoặc xuống" + + +msgid "UP" +msgstr "LÊN" + + +msgid "DOWN" +msgstr "XUỐNG" + + +msgctxt "Operator" +msgid "Remove Selected Entry" +msgstr "Xóa Danh Mục đã Chọn" + + +msgid "Remove the selected entry from the list" +msgstr "Xóa mục đã chọn khỏi danh sách" msgctxt "Operator" msgid "Assign Value as Default" -msgstr "Chỉ Định Giá Trị làm Mặc Định" +msgstr "Ấn Định Giá Trị làm Mặc Định" msgid "Set this property's current value as the new default" -msgstr "Đặt giá trị hiện tại của đặc tính làm mặc định mới" +msgstr "Đặt giá trị hiện tại của tính chất này làm mặc định mới" msgctxt "Operator" msgid "Press Button" -msgstr "Bấm Nút" +msgstr "Ấn Nút" msgid "Presses active button" -msgstr "Được bấm nút hoạt động" +msgstr "Ấn nút đang hoạt động" msgid "Skip Depressed" -msgstr "Nhảy Qua Được Bấm" +msgstr "Bỏ Qua nếu đã Ấn Xuống" msgctxt "Operator" msgid "Clear Button String" -msgstr "Xóa Xâu Nút" +msgstr "Xóa Dòng Chữ của Nút Bấm" msgid "Unsets the text of the active button" -msgstr "Gỡ đặt văn bản của nút hoạt động" +msgstr "Hủy bỏ văn bản của nút bấm đang hoạt động" msgctxt "Operator" msgid "Copy as New Driver" -msgstr "Chép như Một Điều Vận Mới" +msgstr "Sao Chép thành Điều Vận Mới" + + +msgid "Create a new driver with this property as input, and copy it to the internal clipboard. Use Paste Driver to add it to the target property, or Paste Driver Variables to extend an existing driver" +msgstr "Kiến Tạo một điều vận mới với tính chất này làm đầu vào, và sao chép nó vào bộ nhớ tạm nội bộ. Sử dụng chức năng Dán Điều Vận (Paste Driver) để cho thêm vào tính chất mục tiêu, hoặc sử dụng chức năng Dán Biến Số Điều Vận (Paste Driver Variables) để mở rộng một điều vận hiện có" msgctxt "Operator" msgid "Copy Data Path" -msgstr "Chép Đường Dẫn Dữ Liệu" +msgstr "Sao Chép Đường Dẫn Dữ Liệu" msgid "Copy the RNA data path for this property to the clipboard" -msgstr "Chép đường dẫn RNA cho đặc tính này đến bảng dán" +msgstr "Sao chép đường dẫn RNA cho tính chất này ra bảng nhớ tạm" msgid "Copy full data path" -msgstr "Chép toàn bộ đường dẫn dữ liệu" +msgstr "Sao chép toàn bộ đường dẫn dữ liệu" msgctxt "Operator" msgid "Copy Python Command" -msgstr "Chép Lệnh Python" +msgstr "Sao Chép Lệnh Python" msgid "Copy the Python command matching this button" -msgstr "Chép lệnh Python giống nút này" +msgstr "Sao chép lệnh Python xứng khớp với nút này" msgctxt "Operator" msgid "Copy to Selected" -msgstr "Chép đến Được Chọn" +msgstr "Sao Chép Sang cái được Chọn" msgid "Copy the property's value from the active item to the same property of all selected items if the same property exists" -msgstr "Chép giá trị của đặc tính từ mặt hàng hoạt động đến đặc tính giống của hết mặt hàng được chọn nếu đặc tính giống đang tồn tại" +msgstr "Sao chép giá trị của tính chất từ mục đang hoạt động vào cùng một tính chất của toàn bộ các mục đã chọn nếu có cùng một tính chất tồn tại" msgid "Copy to selected all elements of the array" -msgstr "Chép đến tất cả phần tử của mảng" +msgstr "Sao chép sang toàn bộ các phần tử của mảng" msgctxt "Operator" msgid "Drop Color" -msgstr "Màu Thả" +msgstr "Nhỏ Màu" msgid "Drop colors to buttons" -msgstr "Thả màu vào nút" +msgstr "Nhỏ màu vào các nút bấm" msgid "Source color" @@ -71467,20 +78216,20 @@ msgstr "Màu nguồn" msgid "Gamma Corrected" -msgstr "Gama Được Chỉnh" +msgstr "Gamma Đã Chỉnh Sửa" msgid "The source color is gamma corrected" -msgstr "Màu nguồn được chỉnh gama rồi" +msgstr "Màu sắc nguồn đã được chỉnh gamma" msgctxt "Operator" msgid "Drop Material in Material slots" -msgstr "Thả Vật Liệu vào khe Vật Liệu" +msgstr "Thả Nguyên Vật Liệu vào các khe Nguyên Vật Liệu" msgid "Drag material to Material slots in Properties" -msgstr "Kéo vật liệu đến khe Vật Liệu trong Đặc Điểm" +msgstr "Kéo rê nguyên vật liệu vào các khe nguyên vật liệu trong Tính Chất" msgctxt "Operator" @@ -71489,389 +78238,409 @@ msgstr "Thả Tên" msgid "Drop name to button" -msgstr "Thả tên đến Nút" +msgstr "Thả tên vào nút bấm" msgid "The string value to drop into the button" -msgstr "Giá trị xâu cho thả trên nút" +msgstr "Giá trị chuỗi văn bản (dòng chữ) để thả vào nút" msgctxt "Operator" msgid "Edit Source" -msgstr "Biên Tập Mã Nguồn" +msgstr "Biên Soạn Mã Nguồn" msgid "Edit UI source code of the active button" -msgstr "Biên tập mã nguồn gioa diện của nút hoạt động" +msgstr "Biên soạn mã nguồn Giao Diện Người Dùng của nút bấm đang hoạt động" msgctxt "Operator" msgid "Edit Translation" -msgstr "Biên Tập Phiên Dịch" +msgstr "Biên Soạn Bản Dịch" msgid "Translate the label and tooltip of the given property" -msgstr "Phiên dịch nhãn và đề thị của đặc tính" +msgstr "Dịch chuyển nhãn và chú thích về công cụ của tính chất đã cho" msgid "Label of the control" -msgstr "Nhãn của đồ điều khiển" +msgstr "Nhãn của điều khiển" msgid "Flags about the label of the button" -msgstr "Các cờ về nhãn của nút" +msgstr "Các cờ hiệu về nhãn của nút bấm" msgid "Message is marked as fuzzy in po file" -msgstr "Tin nhắn trong tập tin được ký là mờ mịt trong tập tin .po" +msgstr "Thông điệp được đánh dấu là mờ ảo trong tập tin .po" msgid "Some error occurred with this message" -msgstr "Có lỗi với tin nhắn này" +msgstr "Có lỗi gì đó xảy ra với thông điệp này" msgid "Tip of the control" -msgstr "Đề thị của đồ điều khiển" +msgstr "Chú giải của điều khiển" msgid "Flags about the tip of the button" -msgstr "Các cờ về đề thị của nút" +msgstr "Các cờ hiệu về lời chú giải của nút bấm" msgid "Remove all local translation files, to be able to use the system ones again" -msgstr "Xóa hết tập tin phiên dịch địa phương, để có thể sử dụng lại tập tin của hệ thống" +msgstr "Xóa toàn bộ các tập tin phiên dịch địa phương, hòng để quay trở lại sử dụng bản của hệ thống" msgid "Label of the enum item of the control, if any" -msgstr "Nhãn của mặt hàng liệt kê của đồ điều khiển" +msgstr "Nhãn của phần tử liệt kê trong điều khiển, nếu có" msgid "Flags about the RNA enum item label of the button" -msgstr "Các cờ về nhãn mặt hàng liệt kê RNA của nút" +msgstr "Các cờ hiệu về nhãn cho phần tử liệt kê RNA của nút bấm" msgid "Tip of the enum item of the control, if any" -msgstr "Đề thị của hàng liệt kê của đồ điều khiển, nếu có" +msgstr "Lời chú thích về phần tử liệt kê của điều khiển, nếu có" msgid "Flags about the RNA enum item tip of the button" -msgstr "Các cờ về mặt hàng liệt kê RNA của nút" +msgstr "Các cờ hiệu về chú thích cho phần tử liệt kê RNA của nút bấm" msgid "Current (translated) language" -msgstr "Ngô ngữ (phiên dịch) hiện tại" +msgstr "Ngôn ngữ (được phiên dịch) hiện tại" msgid "Original label of the control" -msgstr "Nhãn ban đầu của đồ điều khiển" +msgstr "Nhãn gốc/nguyên bản của điều khiển" msgid "Original tip of the control" -msgstr "Đề thị ban đầu của đồ điều khiển" +msgstr "Chú thích gốc/nguyên bản của điều khiển" msgid "Original label of the enum item of the control, if any" -msgstr "Nhãn ban đầu của mặt hàng liệt kê của đồ điều khiển nếu có" +msgstr "Nhãn hiệu gốc cho phần tử liệt kê của điều khiển, nếu có" msgid "Original tip of the enum item of the control, if any" -msgstr "Đề thị ban đầu của mặt hàng liệt kê của đồ điều khiển, nếu có" +msgstr "Chú thích gốc cho phần tử liệt kê của điều khiển, nếu có" msgid "Original RNA-defined label of the control, if any" -msgstr "Nhãn ban đầu được RNA xác định của đồ điều khiển, nếu có" +msgstr "Nhãn hiệu gốc của điều khiển mà RNA định nghĩa, nếu có" msgid "Original RNA-defined tip of the control, if any" -msgstr "Đề thị ban đầu được RNA xác định của đồ điều khiển, nếu có" +msgstr "Lời chú thích của điều khiển mà RNA định nghĩa, nếu có" msgid "Path to the matching po file" -msgstr "Đường dẫn đến cùng tập tin .po" +msgstr "Đường dẫn đến tập tin po tương ứng" msgid "RNA context for label" -msgstr "Bối cảnh RNA cho nhãn" +msgstr "Ngữ cảnh RNA cho nhãn hiệu" msgid "Identifier of the RNA enum item, if any" -msgstr "Tên của mặt hàng liệt kê RNA, nếu có" +msgstr "Định danh của phần tử liệt kê RNA, nếu có" msgid "RNA-defined label of the control, if any" -msgstr "Nhãn được RNA xác định của đồ điều khiển, nếu có" +msgstr "Nhãn của điều khiển được RNA định nghĩa, nếu có" msgid "Flags about the RNA-defined label of the button" -msgstr "Các cờ về nhãn được RNA xác định của nút" +msgstr "Các cờ về nhãn của nút bấm mà RNA định nghĩa" msgid "Identifier of the RNA property, if any" -msgstr "Tên của đặc tính RNA, nếu có" +msgstr "Định danh của tính chất RNA, nếu có" msgid "Identifier of the RNA struct, if any" -msgstr "Tên của cầu trúc RNA, nếu có" +msgstr "Định danh của cấu trúc RNA, nếu có" msgid "RNA-defined tip of the control, if any" -msgstr "Đề thị được RNA xạc định của đồ điều khiển, nếu có" +msgstr "Lời chú thích của điều khiển được RNA định nghĩa, nếu có" msgid "Flags about the RNA-defined tip of the button" -msgstr "Các cờ về đề thị được RNA xác định của nút" +msgstr "Các cờ hiệu về lời chú thích của nút bấm mà RNA định nghĩa" msgid "Stats from opened po" -msgstr "Thống kê từ tập tin .po được mở" +msgstr "Thống kê từ tập tin po đã mở" msgid "Try to rebuild mo file, and refresh Blender's UI" -msgstr "Thử xây dựng lại tập tin .mo, và nâng cấp giao diện Blender" +msgstr "Thử xây dựng lại tập tin .mo, và làm tươi mới lại Giao Diện Người Dùng của Blender" msgid "Update po file, try to rebuild mo file, and refresh Blender's UI" -msgstr "Nâng cấp tập tin .po, thử xây dựng lại tập .mo, và nâng cấp giao diện Blender" +msgstr "Cập nhật tập tin .po, thử nghiệm xây dựng lại tập tin .mo, và làm tươi mới lại Giao Diện Người Dùng của Blender" msgid "Edit i18n in current language for the active button" -msgstr "Biên tập i18n bằng ngôn ngữ hiện tại cho nút hoạt động" +msgstr "Biên soạn i18n trong ngôn ngữ hiện tại đối với nút đang hoạt động" msgctxt "Operator" msgid "Eyedropper" -msgstr "Ống Hút Giọt Nước" +msgstr "Ống Nhỏ Mắt" msgid "Sample a color from the Blender window to store in a property" -msgstr "Lấy mẫu màu từ cửa sổ Blender cho chứa trong một đặc tính" +msgstr "Lấy mẫu vật màu sắc từ Cửa Sổ Blender để lưu vào một tính chất" msgctxt "Operator" msgid "Eyedropper Colorband" -msgstr "Vành Màu Ống Hút Giọt Nước" +msgstr "Ống Nhỏ Mắt trên Dải Màu" msgid "Sample a color band" -msgstr "Lấy mẫu từ một vành màu" +msgstr "Lấy mẫu vật một dải màu" msgctxt "Operator" msgid "Eyedropper Colorband (Points)" -msgstr "Vành Màu Ống Hút Giọt Nước (Điểm)" +msgstr "Ống Nhỏ Mắt trên Dải Màu (Điểm)" msgid "Point-sample a color band" -msgstr "Lấy một mẫu vật điểm từ một vành màu" +msgstr "Lấy mẫu vật thử nghiệm trên một điểm (Point-sample) của dải màu (color band)" msgctxt "Operator" msgid "Eyedropper Depth" -msgstr "Ống Hút Giọt Nước Độ Sâu" +msgstr "Độ Sâu của Ống Nhỏ Mắt" msgid "Sample depth from the 3D view" -msgstr "Lấy mẫu vật độ sâu từ màn 3D" +msgstr "Độ sâu của mẫu vật từ khung nhìn 3D" msgctxt "Operator" msgid "Eyedropper Driver" -msgstr "Điều Vận Ống Hút Giọt Nước" +msgstr "Ống Nhỏ Mắt của Điều Vận" msgid "Pick a property to use as a driver target" -msgstr "Chọn một đặc tính để làm một mục tiêu điều vận" +msgstr "Chọn một tính chất để làm một mục tiêu của điều vận" msgid "Mapping Type" -msgstr "Loại Ánh Xạ" +msgstr "Kiểu Ánh Xạ" msgid "Method used to match target and driven properties" -msgstr "Phương pháp để phần tích đặc tính mục đích và đặc tính được dắt" +msgstr "Phương pháp sử dụng để xứng khớp mục tiêu và các tính chất điều vận" msgid "All from Target" -msgstr "Hết từ Mục Tiêu" +msgstr "Toàn Bộ các Thành Phần của Mục Tiêu" msgid "Drive all components of this property using the target picked" -msgstr "Dắt tất cả thành phần của đặc tính nào dùng mục tiêu được chọn" +msgstr "Điều vận toàn bộ các thành phần của tính chất này dùng mục tiêu đã chọn" msgid "Single from Target" -msgstr "Một cái từ Mục Tiêu" +msgstr "Đơn Thành Phần của Mục Tiêu" msgid "Drive this component of this property using the target picked" -msgstr "Dắt thành phần này của đặc tính này bằng mục tiêu được chọn" +msgstr "Điều vận thành phần này của tính chất, dùng mục tiêu đã chọn" msgid "Match Indices" -msgstr "Chỉ Số Giống" +msgstr "Khớp Chỉ Số" msgid "Create drivers for each pair of corresponding elements" -msgstr "Chế tạo điều vận cho mỗi cặp phần tử tương tự" +msgstr "Kiến Tạo điều vận cho mỗi cặp phần tử tương ứng" msgid "Manually Create Later" -msgstr "Tự Chế Tạo Thời Sau" +msgstr "Tự Kiến Tạo Sau Này" msgid "Create drivers for all properties without assigning any targets yet" -msgstr "Chế tạo điều vận cho tất cả đặc tính mà chưa chỉ định mục tiêu nào" +msgstr "Kiến Tạo điều vận cho toàn bộ các tính chất, mà không chỉ định mục tiêu nào hết" msgid "Manually Create Later (Single)" -msgstr "Chế Tạo Sau Bằng Tay (Một Cái)" +msgstr "Tự Kiến Tạo Sau Này (Đơn Thân)" msgid "Create driver for this property only and without assigning any targets yet" -msgstr "Chế tạo điều vận chỉ cho đặc tính này mà không chỉ định mục tiêu nào" +msgstr "Kiến Tạo điều vận cho tính chất này thôi, và không chỉ định mục tiêu nào hết" msgctxt "Operator" msgid "Grease Pencil Eyedropper" -msgstr "Ống Hút Giọt Nước Bút Sáp" +msgstr "Ống Nhỏ Mắt của Bút Chì Dầu" msgid "Sample a color from the Blender Window and create Grease Pencil material" -msgstr "Mẫu một màu từ Cửa Sổ Blender và chế tạo vật liệu Bút Sắp" +msgstr "Lấy mẫu một màu sắc từ Cửa Sổ Blender và kiến tạo chất liệu Bút Chì Dầu" msgctxt "Operator" msgid "Eyedropper Data-Block" -msgstr "Cục Dữ Liệu Ống Hút" +msgstr "Khối Dữ Liệu Ống Nhỏ Mắt" msgid "Sample a data-block from the 3D View to store in a property" -msgstr "Rút một mẫu vật cục dữ liệu từ Cửa Sổ Màn 3D để chứa trong một đặc tính" +msgstr "Lấy mẫu vật một khối dữ liệu từ góc nhìn 3D để lưu trữ trong một tính chất" msgctxt "Operator" msgid "I18n Add-on Export" -msgstr "Xuất Đồ Kèm I18n" +msgstr "Xuất Khẩu Trình Bổ Sung I18n" msgid "Export given add-on's translation data as PO files" -msgstr "Xuất dữ liệu phiên dịch của đồ kèm chỉ định trong tập tin .PO" +msgstr "Xuất Khẩu dữ liệu phiên dịch của trình bổ sung chỉ định thành các tập tin PO" msgid "Add-on to process" -msgstr "Đồ kèm cho qúa trình" +msgstr "Trình bổ sung để xử lý" msgid "Export POT" -msgstr "Xuất POT" +msgstr "Xuất Khẩu POT" msgid "Export (generate) a POT file too" -msgstr "Xuất (chế tạo) một tập tin POT nữa" +msgstr "Xuất Khẩu (sinh tạo) một tập tin POT nữa" msgid "Update Existing" -msgstr "Nâng Cấp Đang Tồn Tại" +msgstr "Cập Nhật Tồn Tại" msgid "Update existing po files, if any, instead of overwriting them" -msgstr "Nâng cấp các tập tin .po tồn tại, nếu có, vượt quyền lưu trên nó" +msgstr "Cập nhật các tập tin .po tồn tại, nếu có, thay vì viết đè lên chúng" msgctxt "Operator" msgid "I18n Add-on Import" -msgstr "Nhập Đồ Kèm I18n " +msgstr "Nhập Khẩu Trình Bổ Sung I18n" msgid "Import given add-on's translation data from PO files" -msgstr "Nhập dữ liệu phiên dịch của đồ kèm từ tập tin PO" +msgstr "Nhập Khẩu dữ liệu phiên dịch của trình bổ sung từ các tập PO" msgctxt "Operator" msgid "Update I18n Add-on" -msgstr "Nâng Cấp Kèm Đồ I18n" +msgstr "Nâng Cấp Trình Bổ Sung I18n" msgid "Wrapper operator which will invoke given op after setting its module_name" -msgstr "Thao tác gói nào sẽ thực hành thao tác được xác định sau đặt tên mô đun của nó" +msgstr "Vỏ bọc ngoài của operator (wrapper) sẽ là cái kích hoạt op đã cho, sau khi sắp đặt tên mô-đun của nó" msgid "Operator Name" -msgstr "Tên Thao Tác" +msgstr "Tên của Thao Tác" msgid "Name (id) of the operator to invoke" -msgstr "Tên (mã số) thao tác để kích động" +msgstr "Tên (id : chỉ danh) của thao tác để kích hoạt" msgid "Update given add-on's translation data (found as a py tuple in the add-on's source code)" -msgstr "Nâng cấp dữ liệu phiên dịch của đồ kèm chỉ định (là mẫu số py trong mã nguồn của đồ kèm)" +msgstr "Cập nhật dữ liệu phiên dịch của trình bổ sung chỉ định (một tập hợp 'py' trong mã nguồn của trình bổ sung)" + + +msgid "Clean up i18n working repository (po files)" +msgstr "Dọn dẹp kho lưu trữ làm việc của i18n (các tập tin po)" msgctxt "Operator" msgid "Edit Translation Update Mo" -msgstr "Biên Tập Nâng Cấp Phiên Dịch Mo" +msgstr "Biên Soạn Phiên Dịch Nâng Cấp Mo" msgid "Try to \"compile\" given po file into relevant blender.mo file" -msgstr "Thử \"biên dịch\" tập tin .po thành tập tin .mo Blender liên quan" +msgstr "Thử \"biên dịch\" tập tin po thành tập tin blender.mo thích hợp" msgctxt "Operator" msgid "I18n Load Settings" -msgstr "I18n Nhập Cài Đặt" +msgstr "I18n Nạp các Sắp Đặt" msgid "Load translations' settings from a persistent JSon file" -msgstr "Nhập cài đặt dịch từ tập tin JSon cố chấp" +msgstr "Nạp các sắp đặt về phiên dịch từ tập tin JSon ổn định" msgid "Path to the saved settings file" -msgstr "Đường dẫn cho tập tin cài đặt được lưu" +msgstr "Đường dẫn tới tập tin lưu trữ các sắp đặt" msgctxt "Operator" msgid "I18n Save Settings" -msgstr "I18n Lưu Cài Đặt" +msgstr "I18n Lưu các Sắp Đặt" msgid "Save translations' settings in a persistent JSon file" -msgstr "Lưu Cài đặt phiên dịch vào tập tin JSon cố chấp" +msgstr "Lưu các sắp đặt về phiên dịch vào một tập tin JSon ổn định" + + +msgid "Update i18n data (po files) in Blender source code repository" +msgstr "Cập nhật dữ liệu i18n (các tập tin po) trong kho lưu trữ mã nguồn Blender" msgctxt "Operator" msgid "Init I18n Update Settings" -msgstr "Khởi Động Nâng Cấp Cài Đặt I18n" +msgstr "Khởi Động các Sắp Đặt Nâng Cấp I18n" + + +msgid "Init settings for i18n files update operators" +msgstr "Khởi động cài đặt cho thao tác nâng cấp của svn I18n" msgctxt "Operator" msgid "Init I18n Update Select Languages" -msgstr "Khởi Động Nâng Cấp I18n Ngôn Ngữ Được Chọn" +msgstr "Khởi Động I18n Nâng Cấp các Ngôn Ngữ được Chọn" + + +msgid "(De)select (or invert selection of) all languages for i18n files update operators" +msgstr "Chọn/hủy chọn (hay đảo nghịch sự lựa chọn) toàn bộ các ngôn ngữ cho thao tác nâng cấp tập tin I18n" msgid "Invert Selection" -msgstr "Đảo Nghịch Sự Lựa Chọn" +msgstr "Đảo Nghịch Lựa Chọn" msgid "Inverse selection (overrides 'Select All' when True)" -msgstr "Đảo nghịch sự lựa chọn (chẳng kể 'Chọn Hết' khi Đúng)" +msgstr "Đảo nghịch sự lựa chọn (vượt quyền 'Chọn Toàn Bộ' khi Đúng)" msgid "Select All" -msgstr "Chọn Hết" +msgstr "Chọn Toàn Bộ" msgid "Select all if True, else deselect all" -msgstr "Chọn hết nếu Đúng, thay thế thả hết" +msgstr "Chọn toàn bộ nếu 'Đúng', nếu không, hủy chọn toàn bộ các" msgctxt "Operator" msgid "Update I18n Statistics" -msgstr "Nâng Cấp Thống Kê I18n" +msgstr "Cập Nhật các Thống Kê I18n" msgid "Create or extend a 'i18n_info.txt' Text datablock" -msgstr "Chế tạo hay kèm một cục dữ liệu Văn bản 'i18n_info.txt'" +msgstr "Kiến Tạo hoặc mở rộng một khối dữ liệu Văn Bản 'i18n_info.txt'" + + +msgid "Update i18n working repository (po files)" +msgstr "Cập nhật kho lưu trữ công việc i18n (các tập tin po)" msgid "Skip POT" @@ -71879,215 +78648,311 @@ msgstr "Bỏ Qua POT" msgid "Skip POT file generation" -msgstr "Bỏ qua chế tạo tập tin POT" +msgstr "Bỏ qua việc sinh tạo tập tin POT" msgctxt "Operator" msgid "Jump to Target" -msgstr "Nhảy đến Mục Tiêu" +msgstr "Nhảy Đến Mục Tiêu" msgid "Switch to the target object or bone" -msgstr "Trao đổi đến vật thể mục tiêu hay xương" +msgstr "Đổi sang đối tượng hoặc xương mục tiêu" msgctxt "Operator" msgid "List Filter" -msgstr "Lọc Danh Sách" +msgstr "Thanh Lọc Danh Sách" msgid "Start entering filter text for the list in focus" -msgstr "Bắt đầu gõ văn bản bộ lọc cho danh sách đang tập trung" +msgstr "Khởi công nhập văn bản thanh lọc cho danh sách đang được tập trung vào" msgid "Delete the selected local override and relink its usages to the linked data-block if possible, else reset it and mark it as non editable" -msgstr "Xóa các đồ vượt quyền địa phương được chọn và kết nối lại những sử dụng đến các cục dữ liệu được liên kết, nếu có thể, hoặc đặt lại nó và ký dấu nó không thể biên tập " +msgstr "Xóa vượt quyền cục bộ đã chọn và liên kết lại mức sử dụng của nó với khối dữ liệu liên kết nếu có thể, nếu không thì hoàn lại nó và đánh dấu là không thể chỉnh sửa" msgid "Create a local override of the selected linked data-block, and its hierarchy of dependencies" -msgstr "Chế tạo một đồ vượt quyền địa phương của các cục dữ liệu được liên kết được chọn, và tầng bậc phụ thuộc của chúng nó" +msgstr "Kiến Tạo vượt quyền cục bộ khối dữ liệu liên kết đã chọn và hệ thống phân cấp thứ bậc phụ thuộc của nó" msgid "Reset the selected local override to its linked reference values" -msgstr "Đặt lại đồ vượt quyền địa phương được chọn trở lại đến những giá trị tham chiếu được liên kết" +msgstr "Hoàn lại vượt quyền cục bộ đã chọn thành các giá trị tham chiếu liên kết của nó" msgctxt "Operator" msgid "Remove Override" -msgstr "Xóa Vượt Quyền" +msgstr "Xóa sự Vượt Quyền" msgid "Remove an override operation" -msgstr "Xóa một thao tác vượt quyền" +msgstr "Xóa bỏ một thao tác vượt quyền" msgid "Reset to default values all elements of the array" -msgstr "Đặt lại hết phần tử của mảng đến giá trị mặc định " +msgstr "Hoàn lại toàn bộ các yếu tố của mảng về giá trị mặc định" msgctxt "Operator" msgid "Define Override Type" -msgstr "Định Nghĩa Loại Vượt Quyền" +msgstr "Định Nghĩa Kiểu Vượt Quyền" msgid "Create an override operation, or set the type of an existing one" -msgstr "Tạo một thao tác vượt quyền, hay đặt loại vượt quyền của thao tác đang tồn tại" +msgstr "Kiến Tạo một thao tác vượt quyền, hoặc đặt thể loại của một cái hiện có" msgid "Type of override operation" -msgstr "Loại thao tác vượt quyền" +msgstr "Thể loại của thao tác vượt quyền" msgid "NoOp" -msgstr "Vô Hành" +msgstr "Không Có Thao Tác" msgid "'No-Operation', place holder preventing automatic override to ever affect the property" -msgstr "'Vô Hành', nó chứa chỗ và ngăn ngừa thao tác vượt quyền tự động được ảnh hưởng đặc tính" +msgstr "'Không Có Thao Tác', chỗ giữ ngăn ngừa sự vượt quyền tự động để luôn luôn ảnh hưởng tính chất" msgid "Completely replace value from linked data by local one" -msgstr "Thay thế giá trị hoàn toàn từ dữ liệu liên kết bằng một cái địa phương" +msgstr "Hoàn toàn thay thế giá trị từ dữ liệu kết nối bằng cái ở địa phương" msgid "Store difference to linked data value" -msgstr "Chứa chênh lệch vào giá trị dữ liệu được liên kết" +msgstr "Lưu sự khác biệt vào giá trị dữ liệu kết nối" msgid "Store factor to linked data value (useful e.g. for scale)" -msgstr "Chứa hệ số vào giá trị dữ liệu được liên kết (có lợi ích, ví dụ cho phóng to)" +msgstr "Lưu hệ số vào giá trị dữ liệu kết nối (chẳng hạn như có tác dụng trong việc tỷ lệ hóa)" msgctxt "Operator" msgid "Reload Translation" -msgstr "Nhập Lại Phiên Dịch" +msgstr "Tái Nạp Phiên Dịch" msgid "Force a full reload of UI translation" -msgstr "Bắt nhập lại phiên dịch của giao diện" +msgstr "Buộc phải tái nạp toàn bộ bản phiên dịch của Giao Diện Người Dùng" msgctxt "Operator" msgid "Reset to Default Value" -msgstr "Hoàn Lại Giá Trí Mặc Định" +msgstr "Hoàn Lại về Giá Trị Mặc Định" msgid "Reset this property's value to its default value" -msgstr "Hoàn lại giá trị của đặc tính này bằng mặc định" +msgstr "Hoàn lại giá trị của tính chất này về giá trị mặc định" msgctxt "Operator" msgid "Unset Property" -msgstr "Đặc Tính Chưa Đặt" +msgstr "Xóa Giá Trị của Tính Chất" msgid "Clear the property and use default or generated value in operators" -msgstr "Xóa đặc tính và dùng giá trị mặc định hay được chế tạo trong thao tác" +msgstr "Xóa giá trị tính chất và dùng giá trị mặc định hay giá trị được sinh tạo trong các thao tác/phép toán (operators)" + + +msgctxt "Operator" +msgid "View Drop" +msgstr "Thả vào Khung Nhìn" + + +msgid "Drag and drop onto a data-set or item within the data-set" +msgstr "Kéo và thả vào bộ dữ liệu hoặc mục nội trong bộ dữ liệu" msgctxt "Operator" msgid "Rename View Item" -msgstr "Đổi Tên Mặt Hàng Màn" +msgstr "Đổi Tên Mục Quan Sát" msgid "Rename the active item in the data-set view" -msgstr "Đổi tên của mặt hàng hoạt động trong màn của tập hợp dữ liệu" +msgstr "Đổi tên phần tử đang hoạt động trong góc nhìn bộ dữ liệu" + + +msgctxt "Operator" +msgid "View Filter" +msgstr "Thanh Lọc Góc Nhìn" + + +msgid "Start entering filter text for the data-set in focus" +msgstr "Bắt đầu nhập văn bản thanh lọc cho tập dữ liệu đang được tập trung vào" msgctxt "Operator" msgid "Align" -msgstr "Sắp Xếp" +msgstr "Căn Chỉnh" + + +msgid "Aligns selected UV vertices on a line" +msgstr "Căn chỉnh các điểm đỉnh UV đã chọn trên một đường" msgid "Axis to align UV locations on" -msgstr "Trục cho sắp xếp vị trí UV" +msgstr "Trục để căn chỉnh các vị trí UV trên đó" msgid "Straighten" -msgstr "Thẳng Hóa" +msgstr "Nắn Thẳng" + + +msgid "Align UV vertices along the line defined by the endpoints" +msgstr "Căn chỉnh các điểm đỉnh UV, dọc theo đường được xác định bởi các điểm cuối" msgid "Straighten X" -msgstr "Thẳng Hóa X" +msgstr "Nắn Thẳng X" + + +msgid "Align UV vertices, moving them horizontally to the line defined by the endpoints" +msgstr "Căn chỉnh các điểm đỉnh UV, di chuyển chúng theo chiều ngang, đến đường được xác định bởi các điểm cuối" msgid "Straighten Y" -msgstr "Thẳng Y" +msgstr "Nắn Thẳng Y" + + +msgid "Align UV vertices, moving them vertically to the line defined by the endpoints" +msgstr "Căn chỉnh các điểm đỉnh UV, di chuyển chúng theo chiều dọc, đến đường vốn được xác định bởi các điểm cuối" msgid "Align Auto" -msgstr "Tự Động Sắp Xếp" +msgstr "Tự Động Căn Chỉnh" + + +msgid "Automatically choose the direction on which there is most alignment already" +msgstr "Tự động chọn hướng đã căn chỉnh nhiều nhất" + + +msgid "Align Vertically" +msgstr "Căn Chỉnh theo Chiều Dọc" + + +msgid "Align UV vertices on a vertical line" +msgstr "Căn chỉnh các điểm đỉnh UV trên một đường thẳng đứng" + + +msgid "Align Horizontally" +msgstr "Căn Chỉnh theo Chiều Ngang" + + +msgid "Align UV vertices on a horizontal line" +msgstr "Căn chỉnh các điểm đỉnh UV trên một đường ngang" + + +msgctxt "Operator" +msgid "Align Rotation" +msgstr "Căn Chỉnh Xoay Chiều" + + +msgid "Align the UV island's rotation" +msgstr "Căn chỉnh xoay chiều của hải đảo UV" + + +msgid "Axis to align to" +msgstr "Trục để căn chỉnh vào" msgid "Correct Aspect" -msgstr "Sửa Tỉ Lệ Cạnh Ảnh" +msgstr "Giữ Đúng Tỷ Lệ Tương Quan" + + +msgid "Take image aspect ratio into account" +msgstr "Tính toán đến tỷ lệ cân đối của hình ảnh" + + +msgid "Method to calculate rotation angle" +msgstr "Phương pháp tính góc xoay chiều" + + +msgid "Align from all edges" +msgstr "Căn chỉnh từ toàn bộ các cạnh" + + +msgid "Only selected edges" +msgstr "Duy các cạnh được chọn" + + +msgid "Align to Geometry axis" +msgstr "Căn chỉnh theo trục của Hình Học" msgctxt "Operator" msgid "Average Islands Scale" -msgstr "Phóng To Đặo Trung Bình" +msgstr "Tỷ Lệ Trung Bình Hóa các Hải Đảo" msgid "Average the size of separate UV islands, based on their area in 3D space" -msgstr "Kích cỡ trung bình của các đạo UV riêng, được tính bằng diện tích của chúng trong không gian 3D" +msgstr "Tính trung bình kích thước của từng hải đảo UV riêng biệt, dựa trên diện tích của chúng trong không gian 3D" msgid "Scale U and V independently" -msgstr "Phóng To U và V Độc Lập" +msgstr "Đổi tỷ lệ U và V độc lập" msgid "Reduce shear within islands" -msgstr "Giảm sự méo trong hòn đảo" +msgstr "Thuyên giảm mức xô nghiêng trong các hải đảo" + + +msgctxt "Operator" +msgid "Copy UVs" +msgstr "Sao Chép UV" + + +msgid "Copy selected UV vertices" +msgstr "Sao chép các điểm đỉnh UV đã chọn" msgctxt "Operator" msgid "Cube Projection" -msgstr "Phép Chiếu Lập Phương" +msgstr "Phóng Chiếu Khối Lập Phương" msgid "Project the UV vertices of the mesh over the six faces of a cube" -msgstr "Chiếu đỉnh UV của mạng lưới trên 6 mặt của lập phương" +msgstr "Phóng chiếu các điểm đỉnh UV của khung lưới trên sáu các mặt của một hình lập phương" msgid "Clip to Bounds" -msgstr "Kẹp Lại Đến Ranh Giới" +msgstr "Cắt đến Ranh Giới" msgid "Clip UV coordinates to bounds after unwrapping" -msgstr "Kẹp lại tọa độ UV đến ranh giới sau gỡ ra" +msgstr "Hạn định các tọa độ UV trong đường viền ranh giới sau khi mở gói" msgid "Map UVs taking image aspect ratio into account" -msgstr "Chiếu UV tùy tỉ lệ cạnh ảnh" +msgstr "Hiển thị UV tùy tỷ lệ cạnh ảnh" msgid "Cube Size" -msgstr "Kích Cỡ Lập Phương" +msgstr "Kích Thước Khối Lập Phương" msgid "Size of the cube to project on" -msgstr "Kích cỡ của lập phương để chiếu lên trên" +msgstr "Kích thước của hình lập phương để phóng chiếu lên" msgid "Scale to Bounds" -msgstr "Phóng To Đến Ranh Giới" +msgstr "Tỷ Lệ Hóa cho Khít Ranh Giới" msgid "Scale UV coordinates to bounds after unwrapping" -msgstr "Phóng to tọa độ UV đến ranh giới sau gỡ gói" +msgstr "Đổi tỷ lệ các tọa độ UV cho khít ranh giới sau khi mở gói" msgctxt "Operator" msgid "Cylinder Projection" -msgstr "Phép Chiều Hình Trụ" +msgstr "Phóng Chiếu Hình Trụ" msgid "Project the UV vertices of the mesh over the curved wall of a cylinder" -msgstr "Chiếu đỉnh UV của mạng lưới trên tường cong của hình trụ" +msgstr "Hiển thị điểm đỉnh UV của khung lưới trên tường của hình trụ" msgid "How to determine rotation around the pole" -msgstr "Làm sao tính xoay quanh cực" +msgstr "Phương pháp xác định sự xoay chiều chung quanh cực" msgid "Polar ZX" @@ -72107,146 +78972,187 @@ msgstr "Cực 0 là Y" msgid "Direction of the sphere or cylinder" -msgstr "Hướng của hình cầu hay hình trụ" +msgstr "Phương hướng của hình cầu hay hình trụ" msgid "View on Equator" -msgstr "Hiển Thị Tại Xích Đạo" +msgstr "Góc Nhìn trên Xích Đạo" msgid "3D view is on the equator" -msgstr "Màn 3D ở tại xích đạo" +msgstr "Góc nhìn 3D nằm trên xích đạo" msgid "View on Poles" -msgstr "Chiếu Tại Các Cực" +msgstr "Góc Nhìn trên các Cực" msgid "3D view is on the poles" -msgstr "Màn 3D ở tại các cực" +msgstr "Góc nhìn 3D nằm trên các cực" msgid "Align to Object" -msgstr "Sắp Xếp Với Vật Thể" +msgstr "Căn Chỉnh theo Đối Tượng" msgid "Align according to object transform" -msgstr "Sắp xếp theo biến hóa vật thể" +msgstr "Căn chỉnh theo biến hóa của đối tượng" + + +msgid "Pole" +msgstr "Điểm Cực" + + +msgid "How to handle faces at the poles" +msgstr "Phương pháp xử lý các mặt tại các điểm cực hội tụ" + + +msgid "UVs are pinched at the poles" +msgstr "UV bị nhúm lại tại các điểm cực" + + +msgid "UVs are fanned at the poles" +msgstr "UV xòe hình quạt tại các điểm cực" msgid "Radius of the sphere or cylinder" msgstr "Bán kính của hình cầu hay hình trụ" +msgid "Preserve Seams" +msgstr "Bảo Tồn các Đường Khâu" + + +msgid "Separate projections by islands isolated by seams" +msgstr "Tách phân các phóng chiếu riêng biệt theo các hải đảo vốn được cô lập bởi các đường khâu" + + msgctxt "Operator" msgid "Export UV Layout" -msgstr "Xuất Cài Đặt UV" +msgstr "Xuất Khẩu Bố Trí UV" msgid "Export UV layout to file" -msgstr "Xuất cài đặt UV đến tập tin" +msgstr "Xuất Khẩu bố trí UV ra tập tin" msgid "All UVs" -msgstr "Hết UV" +msgstr "Toàn Bộ UV" msgid "Export all UVs in this mesh (not just visible ones)" -msgstr "Xuất hết UV trong mạng lưới này (không phải chỉ UV được hiện)" +msgstr "Xuất Khẩu toàn bộ các UV trong khung lưới này (không phải chỉ UV nhìn thấy được)" msgid "File format to export the UV layout to" -msgstr "Định dạng tập tin để xuất cài đặt UV" +msgstr "Định dạng tập tin để xuất khẩu bố trí của UV ra" msgid "Scalable Vector Graphic (.svg)" -msgstr "Hình Ảnh Vectơ Được Phóng To (.svg)" +msgstr "Đồ Họa Véc Tơ Có Thể Mở Rộng (.svg)" msgid "Export the UV layout to a vector SVG file" -msgstr "Xuất cài đặt UV vào một tập tin SVG vectơ" +msgstr "Xuất Khẩu bố trí UV ra một tập tin SVG vectơ" + + +msgid "Encapsulated PostScript (.eps)" +msgstr "PostScript Đóng Gói (.eps)" msgid "Export the UV layout to a vector EPS file" -msgstr "Xuất cài đặt UV vào một tập tin EPS vectơ" +msgstr "Xuất Khẩu bố trí của UV ra một tập tin EPS (Encapsulate PostScript) vectơ" msgid "PNG Image (.png)" -msgstr "Ảnh PNG (.png)" +msgstr "Hình Ảnh PNG (.png)" msgid "Export the UV layout to a bitmap image" -msgstr "Xuất cài đặt UV vào một mảng ảnh" +msgstr "Xuất Khẩu bố trí của UV thành một hình ảnh bitmap" + + +msgctxt "Mesh" +msgid "Modified" +msgstr "Đã Thay Đổi" msgid "Exports UVs from the modified mesh" -msgstr "Xuất UV từ mạng lưới được sửa đổi" +msgstr "Xuất khẩu các UV từ khung lưới đã thay đổi" msgid "Fill Opacity" -msgstr "Độ Đục Tô Tràn" +msgstr "Độ Đục của Màu Phủ" msgid "Set amount of opacity for exported UV layout" -msgstr "Đặt mức đục cho cài đặt UV được xuất" +msgstr "Đặt độ đục cho bố trí của UV được xuất khẩu" msgid "Dimensions of the exported file" -msgstr "Kích thước của tập tin kết xuất" +msgstr "Kích thước của tập tin được kết xuất" msgctxt "Operator" msgid "Follow Active Quads" -msgstr "Đi Theo Tứ Giác Hoạt Động" +msgstr "Đi Theo Tứ Giác đang Hoạt Động" msgid "Follow UVs from active quads along continuous face loops" -msgstr "Đi theo UV từ tứ giác hoạt động theo vòng mặt liên tiếp" +msgstr "Đi theo các UV từ tứ giác đang hoạt động dọc theo các vòng Mặt nối tiếp" msgid "Edge Length Mode" -msgstr "Chế Độ Bề Dài Cạnh" +msgstr "Chế Độ Chiều Dài Cạnh" msgid "Method to space UV edge loops" -msgstr "Phương pháp đặt khoảng cách giữa vòng cạnh" +msgstr "Phương pháp phân khoảng các vòng cạnh UV" msgid "Space all UVs evenly" -msgstr "Khaỏng Cách Giữa UV Đều" +msgstr "Phân Khoảng Toàn bộ các UV Đều Đặn" msgid "Average space UVs edge length of each loop" -msgstr "Khoảng cách trung bình giữa cạnh UV của mỗi vòng" +msgstr "Phân khoảng trung bình trên chiều dài cạnh UV của mỗi vòng mạch" msgid "Length Average" -msgstr "Khoảng Cách Trung Bình" +msgstr "Trung Bình Chiều Dài" msgid "Hide (un)selected UV vertices" -msgstr "Ẩn đỉnh UV được chọn/thả" +msgstr "Ẩn giấu các điểm đỉnh UV (được/chưa) chọn" msgctxt "Operator" msgid "Lightmap Pack" -msgstr "Gói Ánh Xạ Ánh Sáng" +msgstr "Đóng Gói Ánh Xạ Ánh Sáng" + + +msgid "Pack each face's UVs into the UV bounds" +msgstr "Đóng gói mỗi UV của Mặt vào ranh giới UV" msgid "Pack Quality" -msgstr "Chất Lượng Gói" +msgstr "Chất Lượng Đóng Gói" + + +msgid "Quality of the packing. Higher values will be slower but waste less space" +msgstr "Chất lượng đóng gói. Giá trị cao hơn sẽ chậm hơn song gây lãng phí dung lượng ít hơn" msgid "Selected Faces" -msgstr "Mặt Được Chọn" +msgstr "Các Mặt được Chọn" msgid "All Faces" -msgstr "Hết Mặt" +msgstr "Toàn Bộ các Mặt" msgid "Size of the margin as a division of the UV" -msgstr "Kích thước lề để làm một phần của bản đồ UV " +msgstr "Kích thước lề mép như một phân vùng của ánh xạ UV" msgid "New UV Map" @@ -72254,69 +79160,181 @@ msgstr "Bản Đồ UV Mới" msgid "Create a new UV map for every mesh packed" -msgstr "Chế tạo một bản đồ UV cho mỗi mạng lưới được gói" +msgstr "Kiến Tạo một ánh xạ UV mới cho mọi khung lưới được đóng gói" msgid "Share Texture Space" -msgstr "Chia Sẻ Không Gian Chất Liệu" +msgstr "Dùng Chung Không Gian Chất Liệu" msgid "Objects share texture space, map all objects into a single UV map" -msgstr "Vật thể chia sẻ cùng không gian chất liệu, ánh xạ tất cả vật thể trong một bản đồ UV" +msgstr "Các đối tượng sử dụng chung cùng một không gian chất liệu, ánh xạ toàn bộ các đối tượng trong một sơ đồ UV" msgid "Mark selected UV edges as seams" -msgstr "Ký dấu các cạnh UV được chọn là vết sẹo" +msgstr "Đánh dấu các cạnh UV được chọn là đường khâu" msgid "Clear Seams" -msgstr "Xóa Vết Sẹo" +msgstr "Xóa Đường Khâu" msgid "Clear instead of marking seams" -msgstr "Xóa thay thế ký dấu vết sẹo" +msgstr "Xóa thay vì đánh dấu đường khâu" msgctxt "Operator" msgid "Minimize Stretch" -msgstr "Giảm Kéo Dài" +msgstr "Tối Giản sự Kéo Giãn" msgid "Reduce UV stretching by relaxing angles" -msgstr "Giảm kéo dài UV bằng buồng thả góc" +msgstr "Giảm thiểu sự kéo giãn UV bằng cách chậm rãi các góc" msgid "Blend factor between stretch minimized and original" -msgstr "Hệ số pha trộn giữa giảm kéo dài và ban đầu" +msgstr "Hệ số pha trộn giữa sự kéo giãn được tối giảm và bản gốc" msgid "Virtually fill holes in mesh before unwrapping, to better avoid overlaps and preserve symmetry" -msgstr "Đầy hết lỗ trong mạng lưới kiểu ảo trước mở gói, tốt hơn cho tranh lấn trên và giữ nguyên đối xứng" +msgstr "Hình tượng hóa lấp các lỗ hổng trong khung lưới trước khi mở gói, để tránh chồng gối và duy trì sự đối xứng tốt hơn" msgid "Number of iterations to run, 0 is unlimited when run interactively" -msgstr "Số lần lặp lại để chạy, 0 là vô hạn khi chạy tương tác" +msgstr "Số lần thi hành, 0 là vô hạn khi thi hành tương tác" msgctxt "Operator" msgid "Pack Islands" -msgstr "Gói Đảo" +msgstr "Đóng Gói Hải Đảo" msgid "Transform all islands so that they fill up the UV/UDIM space as much as possible" -msgstr "Biến hóa hết hòn đảo cho chúng nó vừa đầy nhất không gian UV/UDIM có thể làm" +msgstr "Biến hóa toàn bộ các hải đảo, hầu cho chúng chiếm chỗ trong không gian UV/UDIM ở mức độ cao nhất" msgid "Space between islands" -msgstr "Khoảng cách giữa đảo" +msgstr "Khoảng trống giữa các hải đảo" + + +msgid "Margin Method" +msgstr "Phương Thức Mép Lề" + + +msgid "Scaled" +msgstr "Đổi Tỷ Lệ" + + +msgid "Use scale of existing UVs to multiply margin" +msgstr "Sử dụng tỷ lệ của các UV hiện có để nhân mép lề" + + +msgid "Just add the margin, ignoring any UV scale" +msgstr "Chỉ thêm mép lề, bỏ qua mọi tỷ lệ của UV" msgid "Fraction" msgstr "Phân Số" +msgid "Specify a precise fraction of final UV output" +msgstr "Chỉ định một phân số chính xác của đầu ra UV cuối cùng" + + +msgid "Merge Overlapping" +msgstr "Hợp Nhất Sự Đè Gối Lên Nhau" + + +msgid "Overlapping islands stick together" +msgstr "Các hải đảo chồng gối dính vào nhau" + + +msgid "Lock Pinned Islands" +msgstr "Khóa các Hải Đảo đã được Ghim Xuống" + + +msgid "Constrain islands containing any pinned UV's" +msgstr "Hạn chế các hải đảo có chứa bất kỳ UV nào vốn được ghim xuống" + + +msgid "Pin Method" +msgstr "Phương Pháp Ghim" + + +msgid "Pinned islands won't rescale" +msgstr "Các hải đảo vốn được ghim xuống sẽ không thể thay đổi tỷ lệ" + + +msgid "Pinned islands won't rotate" +msgstr "Các hải đảo vốn được ghim xuống sẽ không xoay chiều" + + +msgid "Rotation and Scale" +msgstr "Xoay Chiều và Đổi Tỷ Lệ" + + +msgid "Pinned islands will translate only" +msgstr "Các hải đảo vốn được ghim xuống sẽ chỉ dịch chuyển mà thôi" + + +msgid "Pinned islands are locked in place" +msgstr "Các hải đảo vốn được ghim xuống sẽ được khóa tại chỗ" + + +msgid "Rotate islands to improve layout" +msgstr "Xoay chiều quần đảo để cải thiện bố cục" + + +msgid "Rotation Method" +msgstr "Phương Pháp Xoay Chiều" + + +msgid "Axis-aligned" +msgstr "Căn chỉnh theo trục" + + +msgid "Rotated to a minimal rectangle, either vertical or horizontal" +msgstr "Đã xoay chiều thành hình chữ nhật tối thiểu, hoặc theo chiều dọc hoặc theo chiều ngang" + + +msgid "Only 90 degree rotations are allowed" +msgstr "Duy được phép xoay chiều 90 độ mà thôi" + + +msgid "Any angle is allowed for rotation" +msgstr "Mọi góc độ đều được phép xoay chiều" + + +msgid "Scale islands to fill unit square" +msgstr "Đổi tỷ lệ quần đảo để phủ kín hình vuông đơn vị" + + +msgid "Shape Method" +msgstr "Phương Pháp Hình Dạng" + + +msgid "Exact Shape (Concave)" +msgstr "Hình Dạng Chính Xác (Lõm)" + + +msgid "Uses exact geometry" +msgstr "Sử dụng hình học chính xác" + + +msgid "Boundary Shape (Convex)" +msgstr "Hình Dạng Ranh Giới (Lồi)" + + +msgid "Uses convex hull" +msgstr "Sử dụng vỏ lồi" + + +msgid "Uses bounding boxes" +msgstr "Sử dụng các khung hộp viền" + + msgid "Pack to" -msgstr "Ém đến" +msgstr "Đóng Gọn vào" msgid "Closest UDIM" @@ -72324,37 +79342,58 @@ msgstr "UDIM gần nhất" msgid "Pack islands to closest UDIM" -msgstr "Ém hòn đảo vào UDIM gần nhất" +msgstr "Đóng gói các hải đảo vào UDIM nằm gần nhất" msgid "Active UDIM" -msgstr "UDIM Hoạt Động" +msgstr "UDIM đang Hoạt Động" msgid "Pack islands to active UDIM image tile or UDIM grid tile where 2D cursor is located" -msgstr "Ém hòn đảo đến ô của ảnh UDIM hoạt động hay ô của đồ thị UDIM tại vị trí của con trỏ 2D" +msgstr "Đóng gói các hải đảo vào ô hình ảnh UDIM đang hoạt động hoặc ô khung lưới đồ thị UDIM nơi con trỏ 2D nằm" + + +msgid "Original bounding box" +msgstr "Khung hộp viền ban đầu" + + +msgid "Pack to starting bounding box of islands" +msgstr "Đóng gói vào khung hộp viền khởi đầu của các hải đảo" + + +msgctxt "Operator" +msgid "Paste UVs" +msgstr "Dán UV" + + +msgid "Paste selected UV vertices" +msgstr "Dán các điểm đỉnh UV đã chọn" msgctxt "Operator" msgid "Pin" -msgstr "Đóng Đinh" +msgstr "Đính Ghim" msgid "Set/clear selected UV vertices as anchored between multiple unwrap operations" -msgstr "Đặt/xoá đỉnh UV được chọn được dính giữa nhiều thao tác mở gói" +msgstr "Đặt/xóa các điểm đỉnh UV được chọn như đã được neo chốt trong các thao tác mở gói" msgid "Clear pinning for the selection instead of setting it" -msgstr "Xóa đóng đinh cho sự lựa chọn thay thế đặt nó" +msgstr "Tháo ghim cho vùng lựa chọn, thay vì cắm ghim nó" + + +msgid "Invert pinning for the selection instead of setting it" +msgstr "Đảo ngược ghim (tháo) cho lựa chọn thay vì đặt ghim" msgctxt "Operator" msgid "Project from View" -msgstr "Chiếu Từ Màn" +msgstr "Phóng Chiếu từ Góc Nhìn" msgid "Project the UV vertices of the mesh as seen in current 3D view" -msgstr "Chiếu đỉnh UV của mạng lưới như đang xem trong màn 3D" +msgstr "Phóng chiếu các điểm đỉnh UV của khung lưới như thấy được trong góc nhìn 3D" msgid "Camera Bounds" @@ -72362,278 +79401,328 @@ msgstr "Ranh Giới Máy Quay Phim" msgid "Map UVs to the camera region taking resolution and aspect into account" -msgstr "Ánh xạ UV đến máy quay phim mà quan tâm độ phân giải và tỉ số cạnh" +msgstr "Ánh xạ các UV tới vùng của máy quay phim, cân nhắc tới độ phân giải và tỉ lệ tương quan" msgid "Use orthographic projection" -msgstr "Dùng phép chiếu trực giao" +msgstr "Dùng phóng chiếu trực giao" + + +msgid "Randomize the UV island's location, rotation, and scale" +msgstr "Ngẫu nhiên hóa vị trí, xoay chiều và tỷ lệ của hải đảo UV" + + +msgid "Maximum rotation" +msgstr "Độ xoay chiều tối đa" + + +msgid "Use the same scale value for both axes" +msgstr "Sử dụng cùng một giá trị tỷ lệ cho cả hai trục" + + +msgid "Randomize the rotation value" +msgstr "Ngẫu nhiên hóa giá trị xoay chiều" msgctxt "Operator" msgid "Merge UVs by Distance" -msgstr "Gồm UV Bằng Khoảng Cách" +msgstr "Hợp Nhất UV theo Khoảng Cách" msgid "Selected UV vertices that are within a radius of each other are welded together" -msgstr "Gồm các đỉnh UV được chọn ở cách xa nhau nhỏ hơn bán kính được xác định" +msgstr "Các điểm đỉnh UV được chọn nằm trong bán kính của nhau sẽ được hàn gắn lại thành một" msgid "Maximum distance between welded vertices" -msgstr "Cách xa cực đại cho gồm đỉnh" +msgstr "Khoảng cách tối đa giữa các điểm đỉnh đã được hàn gắn" msgctxt "Operator" msgid "Reset" -msgstr "Đặt Lại" +msgstr "Hoàn Lại" msgid "Reset UV projection" -msgstr "Đặt lại phép chiếu UV" +msgstr "Hoàn lại sự phóng chiếu UV" msgid "Reveal all hidden UV vertices" -msgstr "Hiện hết đỉnh UV được ẩn" +msgstr "Hiện toàn bộ các điểm đỉnh UV ẩn giấu" msgctxt "Operator" msgid "UV Rip" -msgstr "Xé UV" +msgstr "Tách Xé UV" msgid "Rip selected vertices or a selected region" -msgstr "Xé các đỉnh được chọn hoặc một vùng đã chọn" +msgstr "Tách xé các điểm đỉnh đã được chọn hoặc vùng đã chọn ra" msgctxt "Operator" msgid "UV Rip Move" -msgstr "Di Chuyển Xé UV" +msgstr "Tách Xé UV Di Chuyển" + + +msgid "Unstitch UVs and move the result" +msgstr "Tháo đường khâu UV và di chuyển kết quả" msgid "UV Rip" -msgstr "Xé UV" +msgstr "Tách Xé UV" msgctxt "Operator" msgid "Seams from Islands" -msgstr "Vết Sẹo Từ Hòn Đảo" +msgstr "Tạo Đường Khâu từ các Hải Đảo" msgid "Set mesh seams according to island setup in the UV editor" -msgstr "Đặt vết sẹo mạng lưới tùy cài đặt hòn đảo trong biên tập UV" +msgstr "Đặt đường khâu của khung lưới tùy theo sắp đặt về hải đảo trong trình biên soạn UV" msgid "Mark boundary edges as seams" -msgstr "Ký dấu các cạnh ranh giới là vết sẹo" +msgstr "Đánh dấu các cạnh ranh giới là đường khâu" msgid "Mark boundary edges as sharp" -msgstr "Ký dấu cạnh bén" +msgstr "Đánh dấu các cạnh viền là sắc nhọn" msgid "Select UV vertices" -msgstr "Chọn Đỉnh UV" +msgstr "Chọn các điểm đỉnh UV" msgid "Change selection of all UV vertices" -msgstr "Đổi sự lựa chọn cho hết đỉnh UV" +msgstr "Đổi lựa chọn của toàn bộ các điểm đỉnh UV" msgid "Select UV vertices using box selection" -msgstr "Chọn đỉnh UV bằng sự lựa chọn kiểu hộp" +msgstr "Chọn lựa các điểm đỉnh UV dùng phương pháp chọn khoanh vùng hình hộp" msgid "Pinned" -msgstr "Đóng Đinh" +msgstr "Ghim Xuống" msgid "Border select pinned UVs only" -msgstr "Chỉ chọn cạnh UV được đóng đinh" +msgstr "Chỉ chọn các UV đã được ghim xuống dùng lựa chọn ranh giới" msgid "Select UV vertices using circle selection" -msgstr "Chọn đỉnh UV bằng sự lựa chọn kiểu vòng tròn" +msgstr "Chọn điểm đỉnh UV dùng vòng tròn lựa chọn" msgid "Select an edge ring of connected UV vertices" -msgstr "Chọn một vòng cạnh đỉnh UV được kết nối" +msgstr "Chọn một vành đai cạnh của các điểm đỉnh UV kết nối" msgctxt "Operator" msgid "Lasso Select UV" -msgstr "Chọn Bằng Dây Trói UV" +msgstr "Chọn UV bằng Dây Thòng Lọng" msgid "Select UVs using lasso selection" -msgstr "Chọn đỉnh UV bằng dây trói" +msgstr "Chọn các UV dùng vòng dây thòng lọng" msgid "Deselect UV vertices at the boundary of each selection region" -msgstr "Thả đỉnh UV tại ranh giới của mỗi vùng được chọn" +msgstr "Hủy chọn các điểm đỉnh UV tại ranh giới của mỗi vùng lựa chọn" msgid "Select all UV vertices linked to the active UV map" -msgstr "Chọn hết đỉnh UV liên kết với bản đồ UV hoạt động" +msgstr "Chọn toàn bộ các điểm đỉnh UV kết nối với ánh xạ UV đang hoạt động" msgid "Select all UV vertices linked under the mouse" -msgstr "Chọn hết đỉnh UV liên kết dưới chuột" +msgstr "Chọn toàn bộ các điểm đỉnh UV kết nối dưới chuột" msgid "Deselect linked UV vertices rather than selecting them" -msgstr "Thả đỉnh UV được liên kết thay thế chọn chúng nó" +msgstr "Hủy/Bỏ chọn các điểm đỉnh UV kết nối, thay vì lựa chọn chúng" msgid "Select a loop of connected UV vertices" -msgstr "Chọn một vòng đỉnh UV kết nối" +msgstr "Chọn một mạch lưới của các điểm đỉnh UV kết nối" msgctxt "Operator" msgid "UV Select Mode" -msgstr "Chế Độ Chọn UV" +msgstr "Chế Độ Lựa Chọn UV" msgid "Change UV selection mode" -msgstr "Đổi chế độ sự lựa chọn UV" +msgstr "Đổi chế độ lựa chọn UV" msgid "Island" -msgstr "Đảo" +msgstr "Hải Đảo" msgid "Island selection mode" -msgstr "Chế độ sự lựa chọn đảo" +msgstr "Chế độ lựa chọn hải đảo" msgid "Select more UV vertices connected to initial selection" -msgstr "Chọn đỉnh UV thêm được kết nối với sự lựa chọn khởi động" +msgstr "Chọn thêm các điểm đỉnh UV kết nối với lựa chọn ban đầu" msgctxt "Operator" msgid "Select Overlap" -msgstr "Chọn Lấn Lên" +msgstr "Chọn cái Chồng Gối Lên Nhau" msgid "Select all UV faces which overlap each other" -msgstr "Chọn tất cả mặt UV đang che lấn lên nhau" +msgstr "Chọn toàn bộ các mặt UV chồng gối lên nhau" msgctxt "Operator" msgid "Selected Pinned" -msgstr "Chọn Được Đóng Đinh" +msgstr "Chọn cái được Ghim Xuống" msgid "Select all pinned UV vertices" -msgstr "Chón hết đỉnh UV được đóng đinh" +msgstr "Chọn toàn bộ các điểm đỉnh UV đã được ghim xuống" msgid "Select similar UVs by property types" -msgstr "Chọn UV giống bằng loại đặc tính" +msgstr "Chọn các UV tương tự theo thể loại tính chất" + + +msgctxt "Mesh" +msgid "Pinned" +msgstr "Ghim Xuống" + + +msgctxt "Mesh" +msgid "Length 3D" +msgstr "Chiều Dài 3D" + + +msgctxt "Mesh" +msgid "Area 3D" +msgstr "Diện Tích 3D" + + +msgctxt "Mesh" +msgid "Object" +msgstr "Đối Tượng" + + +msgctxt "Mesh" +msgid "Winding" +msgstr "Chiều Hướng Pháp Tuyến" + + +msgctxt "Mesh" +msgid "Amount of Faces in Island" +msgstr "Số Lượng Mặt trong Hải Đảo" msgctxt "Operator" msgid "Select Split" -msgstr "Chọn Chẻ" +msgstr "Phân Tách Lựa Chọn" msgid "Select only entirely selected faces" -msgstr "Chỉ chọn mặt nào được chọn toàn bộ" +msgstr "Chỉ chọn toàn bộ các mặt được chọn" msgctxt "Operator" msgid "Smart UV Project" -msgstr "Chương Trình UV Thông Minh" +msgstr "Phóng Chiếu UV Thông Minh" msgid "Projection unwraps the selected faces of mesh objects" -msgstr "Phép chiếu được mở gói cho các mặt đã chọn của vật thể mạng lưới" +msgstr "Mở gói các mặt đã chọn của đối tượng khung lưới theo phương pháp phóng chiếu" msgid "Lower for more projection groups, higher for less distortion" -msgstr "Nhỏ hơn cho nhiều nhóm phép chiều hơn, cao hơn cho giảm méo hóa" +msgstr "Thấp hơn để có số nhóm phóng chiếu nhiều hơn, cao hơn để biến dạng ít hơn" msgid "Area Weight" -msgstr "Quyền Lượng Diện Tích" +msgstr "Trọng Lượng Diện Tích" msgid "Weight projection's vector by faces with larger areas" -msgstr "Tăng thêm quyền lương của vectơ phép chiếu bởi mặt có diện tích lớn hơn" +msgstr "Véctơ của quá trình phóng chiếu trọng lượng theo các mặt với diện tích lớn hơn" msgid "Island Margin" -msgstr "Lề Đảo" +msgstr "Lề của Hải Đảo" msgid "Margin to reduce bleed from adjacent islands" -msgstr "Lề cho giảm tràn ra ngoài từ đảo kề" +msgstr "Lề phân cách để giảm thiểu rò rỉ từ các hải đảo kề cạnh" msgctxt "Operator" msgid "Snap Cursor" -msgstr "Hút Dinh Con Trỏ" +msgstr "Bám Dính Con Trỏ" msgid "Snap cursor to target type" -msgstr "Hút dính con trỏ đến loại mục tiêu" +msgstr "Bám dính con trỏ vào loại mục tiêu" msgid "Target to snap the selected UVs to" -msgstr "Hút dính UV được chọn đến mục tiêu nào" +msgstr "Mục tiêu để bám dính UV được chọn vào" msgctxt "Operator" msgid "Snap Selection" -msgstr "Sự Lựa Chọn Hút Dính" +msgstr "Bám Dính Lựa Chọn" msgid "Snap selected UV vertices to target type" -msgstr "Hút dính đỉnh UV được chọn đến loại mục tiêu nào" +msgstr "Bám dính các điểm đỉnh UV được chọn vào loại mục tiêu" msgid "Cursor (Offset)" -msgstr "Con Trỏ (Dịch)" +msgstr "Con Trỏ (Dịch Chuyển)" msgid "Adjacent Unselected" -msgstr "Kề Chưa Được Chọn" +msgstr "Kề Cận Chưa được Chọn" msgctxt "Operator" msgid "Sphere Projection" -msgstr "Phép Chiếu Hình Cầu" +msgstr "Phóng Chiếu Hình Cầu" msgid "Project the UV vertices of the mesh over the curved surface of a sphere" -msgstr "Chiếu đỉnh UV của mạng lưới trên bề mặt cong của một hình cầu" +msgstr "Phóng chiếu các điểm đỉnh UV của khung lưới trên bề mặt cong của một hình cầu" msgctxt "Operator" msgid "Stitch" -msgstr "Mai" +msgstr "Đính Vá" msgid "Stitch selected UV vertices by proximity" -msgstr "Mai đỉnh UV được chọn tùy khoàng cách" +msgstr "Đính Vá các điểm đỉnh UV được chọn tùy theo mức lân cận của chúng" msgid "Index of the active object" -msgstr "Chỉ số của vật thể hoạt động" +msgstr "Chỉ số của đối tượng đang hoạt động" msgid "Clear seams of stitched edges" -msgstr "Xóa vết sẹo của cạnh được mai lại" +msgstr "Xóa các đường khâu của các cạnh đã được đính lại" msgid "Limit distance in normalized coordinates" -msgstr "Hạn chế khoảng cách trong tọa độ đơn vị hóa" +msgstr "Khoảng cách giới hạn trong các tọa độ được bình thường hóa" msgid "Snap at Midpoint" -msgstr "Hút Dính tại Trung Điểm" +msgstr "Bám Dính vào Trung Điểm" msgid "UVs are stitched at midpoint instead of at static island" -msgstr "May đỉnh UV tại trung điểm thay taị đảo tĩnh" +msgstr "Các UV được vá lại tại trung điểm, thay vì tại hải đảo tĩnh" msgid "Operation Mode" @@ -72641,31 +79730,31 @@ msgstr "Chế Độ Thao Tác" msgid "Use vertex or edge stitching" -msgstr "Sử dụng mai đỉnh hay cạnh" +msgstr "Dùng phương pháp đính vá điểm đỉnh hoặc cạnh" msgid "Objects Selection Count" -msgstr "Số Lượng Vật Thể Được Chọn" +msgstr "Số Lượng Đối Tượng đã Chọn" msgid "Snap Islands" -msgstr "Hút Dính Đảo" +msgstr "Bắt Dính các Hải Đảo Lại" msgid "Snap islands together (on edge stitch mode, rotates the islands too)" -msgstr "Hút dính đảo với nhau (trong chế độ mai cạnh, cũng xoay đảo)" +msgstr "Bắt dính các hải đảo lại với nhau (trong chế độ đính vá cạnh, đồng thời xoay chiều hải đảo nữa)" msgid "Static Island" -msgstr "Đảo Tĩnh" +msgstr "Hải Đảo Tĩnh" msgid "Island that stays in place when stitching islands" -msgstr "Đảo sẽ ở lại tại chỗ khi mai các đảo" +msgstr "Hải đảo sẽ nằm nguyên tại vị trí khi chắp vá các hải đảo" msgid "Stored Operation Mode" -msgstr "Chế Độ Thao Tác Chứa" +msgstr "Chế Độ Thao Tác đã Lưu" msgid "Use Limit" @@ -72673,7 +79762,7 @@ msgstr "Dùng Giới Hạn" msgid "Stitch UVs within a specified limit distance" -msgstr "Mau đỉnh UV gần hơn khoảng cách được xác định" +msgstr "May vá các UV nằm trong một khoảng cách giới hạn đã định" msgctxt "Operator" @@ -72682,37 +79771,37 @@ msgstr "Mở Gói" msgid "Unwrap the mesh of the object being edited" -msgstr "Mỡ gói mạng lưới của vật thể đang biên tập" +msgstr "Mở gói khung lưới của đối tượng đang biên soạn" msgid "Unwrapping method (Angle Based usually gives better results than Conformal, while being somewhat slower)" -msgstr "Phương pháp mở gói (Cơ Sở Góc được kết qủa tốt hơn Bảo Giác nhưng hơi chậm hơn)" +msgstr "Phương pháp mở gói (thường thì Cơ Sở Góc cho những kết quả tốt hơn là Bảo Giác (bảo toàn độ lớn của các góc giữa các hướng trong khu vực nhỏ, mặc dù khoảng cách bị biến dạng) nhưng hơi chậm hơn một chút)" msgid "Use Subdivision Surface" -msgstr "Dùng Phân Hóa Bề Mặt" +msgstr "Sử Dụng Bề Mặt Phân Hóa" msgid "Map UVs taking vertex position after Subdivision Surface modifier has been applied" -msgstr "Ánh xá tọa độ UV dùng vị trí đỉnh sau bộ điều chỉnh Phân Hóa Bề Mặt được áp dụng" +msgstr "Ánh xạ UV lấy vị trí điểm đỉnh sau khi bộ điều chỉnh Bề Mặt Phân Hóa đã được áp dụng" msgctxt "Operator" msgid "Weld" -msgstr "Hàn" +msgstr "Hàn Gắn" msgid "Weld selected UV vertices together" -msgstr "Hàn đỉnh UV được chọn với nhau" +msgstr "Hàn gắn các điểm đỉnh UV được chọn lại với nhau" msgctxt "Operator" msgid "View Edge Pan" -msgstr "Dời Cạnh Màn" +msgstr "Lia trên Cạnh Khung Nhìn" msgid "Pan the view when the mouse is held at an edge" -msgstr "Dời màn khi chuột được giữ tại một cạnh" +msgstr "Lia qua lại góc nhìn khi đầu chuột được giữ tại trên một cạnh" msgid "Delta X" @@ -72725,11 +79814,11 @@ msgstr "Lệch Lạc Y" msgctxt "Operator" msgid "Reset View" -msgstr "Đặt Lại Màn" +msgstr "Hoàn Lại Khung Nhìn" msgid "Reset the view" -msgstr "Đặt lại màn" +msgstr "Hoàn lại khung nhìn" msgctxt "Operator" @@ -72738,7 +79827,7 @@ msgstr "Cuộn Xuống" msgid "Scroll the view down" -msgstr "Cuộn màn chiếu xuống" +msgstr "Cuộn khung nhìn xuống" msgid "Page" @@ -72755,7 +79844,7 @@ msgstr "Cuộn Trái" msgid "Scroll the view left" -msgstr "Cuộn màn chiếu trái phía trái" +msgstr "Cuộn khung nhìn sang trái" msgctxt "Operator" @@ -72764,7 +79853,7 @@ msgstr "Cuộn Phải" msgid "Scroll the view right" -msgstr "Cuộn màn chiếu phía phải" +msgstr "Cuộn khung nhìn sang phải" msgctxt "Operator" @@ -72773,119 +79862,123 @@ msgstr "Cuộn Lên" msgid "Scroll the view up" -msgstr "Cuộn màn chiếu lên" +msgstr "Cuộn khung nhìn lên" msgctxt "Operator" msgid "Scroller Activate" -msgstr "Hoạt Động Cuộn" +msgstr "Thanh Cuộn Kích Hoạt" msgid "Scroll view by mouse click and drag" -msgstr "Cuộn màn chiếu bằng bấm và kéo chuột" +msgstr "Cuộn góc nhìn bằng cách bấm chuột và kéo" msgctxt "Operator" msgid "Smooth View 2D" -msgstr "Mịn Hóa Màn 2D" +msgstr "Xem 2D Mịn Màng" msgctxt "Operator" msgid "Zoom 2D View" -msgstr "Phóng Màn 2D" +msgstr "Thu Phóng Khung Nhìn 2D" msgid "Zoom Factor X" -msgstr "Hệ Số Phóng Vào X" +msgstr "Hệ Số Thu Phóng X" msgid "Zoom Factor Y" -msgstr "Hệ Số Phóng Vào Y" +msgstr "Hệ Số Thu Phóng Y" msgctxt "Operator" msgid "New Camera from VR Landmark" -msgstr "Máy Quay Phim Mới Từ Mốc Bờ Sự Thật Ảo" +msgstr "Máy Quay Phim Mới từ Địa Ranh VR" msgid "Create a new Camera from the selected VR Landmark" -msgstr "Tạo một Máy Quay Phim mới từ Mốc Bờ sự thật ảo" +msgstr "Kiến Tạo một máy quay phim mới từ địa ranh VR đã chọn" msgctxt "Operator" msgid "Add Background Image" -msgstr "Thêm Ảnh Nền" +msgstr "Thêm Hình Ảnh Nền" msgid "Add a new background image" -msgstr "Thêm một ảnh nền mới" +msgstr "Thêm một hình ảnh nền mới" msgctxt "Operator" msgid "Remove Background Image" -msgstr "Xóa Ảnh Nền" +msgstr "Xóa Hình Ảnh Nền" msgid "Remove a background image from the 3D view" -msgstr "Xoá ảnh nền từ màn 3D" +msgstr "Xóa hình ảnh nền khỏi khung nhìn 3D" msgid "Background image index to remove" -msgstr "Chỉ số của ảnh nền để xóa" +msgstr "Chỉ số của hình ảnh nền để xóa" msgctxt "Operator" msgid "Select Menu" -msgstr "Danh Bạ Lựa Chọn" +msgstr "Trình Đơn Lựa Chọn" msgid "Menu bone selection" -msgstr "Danh bạ sự lựa chọn xương" +msgstr "Trình đơn lựa chọn xương" msgctxt "Operator" msgid "Align Camera to View" -msgstr "Sắp Xếp Máy Quay Phim với Màn" +msgstr "Canh Máy Quay Phim vào Góc Nhìn" msgid "Set camera view to active view" -msgstr "Đặt màn chiếu máy quay phim thành màn chiếu hoạt động" +msgstr "Đặt góc nhìn của máy quay phim vào góc nhìn đang hoạt động" msgctxt "Operator" msgid "Camera Fit Frame to Selected" -msgstr "Được Chọn Vừa Khung Máy Quay Phim" +msgstr "Máy Quay Khít Khung Hình vào cái được Chọn" msgid "Move the camera so selected objects are framed" -msgstr "Di chuyển máy quay phim cho các vật thể được chọn ở trong khung máy quay phim" +msgstr "Di chuyển máy quay phim hầu cho các đối tượng được chọn nằm ở trong khung của máy quay phim" msgctxt "Operator" msgid "Scene Camera to VR Landmark" -msgstr "Máy Quay Phim Cảnh Đến Mốc Bờ Sự Thật Ảo" +msgstr "Máy Quay Phim của Cảnh vào Địa Ranh VR" msgid "Position the scene camera at the selected landmark" -msgstr "Di chuyển máy quay phim của cảnh đến mốc bờ đã chọn" +msgstr "Đặt máy quay phim của cảnh tại vùng địa danh đã chọn" msgid "Clear the boundaries of the border render and disable border render" -msgstr "Xóa các ranh giới của ranh giới kết xuất và tắt kết xuất ràng giới" +msgstr "Xóa các khoanh vùng kết xuất và tắt chế độ kết xuất này" msgctxt "Operator" msgid "Clipping Region" -msgstr "Vùng Cắt" +msgstr "Cắt Xén Vùng" msgid "Set the view clipping region" -msgstr "Đặt vùng cắt của màn" +msgstr "Đặt vùng cắt xén trong góc nhìn" msgctxt "Operator" msgid "Copy Objects" -msgstr "Chép Lại Vật Thể" +msgstr "Sao Chép Đối Tượng" + + +msgid "Copy the selected objects to the internal clipboard" +msgstr "Sao chép các đối tượng đã chọn vào bảng nhớ tạm nội bộ" msgctxt "Operator" @@ -72898,57 +79991,57 @@ msgstr "Đặt vị trí của con trỏ 3D" msgid "Preset viewpoint to use" -msgstr "Đặt điểm nhìn để dùng" +msgstr "Đặt trước điểm nhìn để sử dụng" msgid "Leave orientation unchanged" -msgstr "Không đổi định hướng" +msgstr "Giữ nguyên định hướng" msgid "Orient to the viewport" -msgstr "Định hướng đến màn chiếu" +msgstr "Định Hướng theo cổng nhìn" msgid "Orient to the current transform setting" -msgstr "Định hướng đến cài đặt biến hóa hiện tại" +msgstr "Định hướng theo sắp đặt về biến đổi hiện tại" msgid "Match the surface normal" -msgstr "Làm giống pháp tuyến bề mặt" +msgstr "Khớp với pháp tuyến bề mặt" msgid "Surface Project" -msgstr "Phép Chiếu Bề Mặt" +msgstr "Phóng Chiếu lên Bề Mặt" msgid "Project onto the surface" -msgstr "Chiếu trên bề mặt" +msgstr "Phóng chiếu lên trên bề mặt" msgctxt "Operator" msgid "Cursor to VR Landmark" -msgstr "Con Trỏ Đến Mốc Bờ Sự Thật Ảo" +msgstr "Con Trỏ đến Địa Ranh VR" msgid "Move the 3D Cursor to the selected VR Landmark" -msgstr "Di chuyển Con Trỏ 3D đến Mốc Bờ sự thật ảo đã chọn" +msgstr "Di chuyển con trỏ 3D tới địa ranh VR đã chọn" msgctxt "Operator" msgid "Dolly View" -msgstr "Trượt Màn" +msgstr "Lướt Khung Nhìn" msgid "Dolly in/out in the view" -msgstr "Trượt va/ra trong màn chiếu" +msgstr "Lướt vào/ra trong khung nhìn" msgid "Region Position X" -msgstr "Vùng Vị Trí X" +msgstr "Vị Trí X của Vùng" msgid "Region Position Y" -msgstr "Vùng Vị Trí Y" +msgstr "Vị Trí Y của Vùng" msgctxt "Operator" @@ -72957,183 +80050,187 @@ msgstr "Thả Thế Giới" msgid "Drop a world into the scene" -msgstr "thả thé giới vào cảnh" +msgstr "Thả thế giới vào cảnh" msgctxt "Operator" msgid "Extrude Individual and Move" -msgstr "Kéo Ra Riêng Và Di Chuyển" +msgstr "Đẩy Trồi Cá Nhân và Di Chuyển" msgctxt "Operator" msgid "Extrude Manifold Along Normals" -msgstr "Kéo Ra Đa Tập Theo Pháp Tuyến" +msgstr "Đẩy Trồi Đa Tạp Dọc Theo Pháp Tuyến" msgid "Extrude manifold region along normals" -msgstr "Kéo ra vùng đa tập theo pháp tuyến" +msgstr "Đẩy trồi vùng đa tạp và di chuyển theo pháp tuyến" msgctxt "Operator" msgid "Extrude and Move on Normals" -msgstr "Kéo Ra Và Di Chuyển Theo Pháp Tuyến" +msgstr "Đẩy Trồi và Di Chuyển trên các Pháp Tuyến" msgid "Dissolves adjacent faces and intersects new geometry" -msgstr "Hòa tan các mặt kề bên và đang giao cắt hình dạng mới" +msgstr "Tiêu hủy các mặt kề cạnh và giao cắt với hình học mới" msgctxt "Operator" msgid "Extrude and Move on Individual Normals" -msgstr "Kéo Ra Và Di Chuyển Theo Pháp Tuyến Riêng" +msgstr "Đẩy trồi và Di Chuyển trên các Pháp Tuyến Cá Nhân" msgctxt "Operator" msgid "Fly Navigation" -msgstr "Chuyển Hướng Bay" +msgstr "Điều Hành Bay Lượn" msgid "Interactively fly around the scene" -msgstr "Bay tương tác quanh cảnh" +msgstr "Bay lượn một cách tương tác quanh khung cảnh" msgctxt "Operator" msgid "Add Primitive Object" -msgstr "Thêm Vật Thể Đơn Giản" +msgstr "Thêm Đối Tượng Cơ Bản" msgid "Interactively add an object" -msgstr "Kiểu tương tác thêm một vật thể" +msgstr "Thêm đối tượng một cách tương tác" msgid "The initial aspect setting" -msgstr "Tỉ số cạnh khởi động" +msgstr "Sắp đặt tỷ lệ tương quan khởi đầu" msgid "Use an unconstrained aspect" -msgstr "Dùng một tỉ số cạnh không bị hạn chế" +msgstr "Sử dụng tỷ lệ tương quan không kiềm chế (tự do)" msgid "Use a fixed 1:1 aspect" -msgstr "Dùng một tỉ số cạnh hằng số 1:1" +msgstr "Sử dụng tỷ lệ tương quan cố định 1:1" msgid "The initial position for placement" -msgstr "Vị trí khởi động cho đặt vị trí" +msgstr "Vị trí khởi đầu để sắp đặt" msgid "Start placing the edge position" -msgstr "Bắt đầu đặt vị trí của cạnh" +msgstr "Khởi đầu đặt xuống vị trí của cạnh" msgid "Start placing the center position" -msgstr "Bắt đầu đặt vị trí của trung tâm" +msgstr "Khởi đầu đặt xuống vị trí trung tâm" msgid "ICO Sphere" -msgstr "Hình Cầu Nhị Thập Diện" +msgstr "Hình Cầu Đa Diện Đều" msgctxt "Operator" msgid "Local View" -msgstr "Màn Địa Phương" +msgstr "Góc Nhìn Cục Bộ" msgid "Toggle display of selected object(s) separately and centered in view" -msgstr "Bật/tắt hiển thị (các) vật thể được chọn riêng nhau và tại trung tâm màn chiếu" +msgstr "Bật/Tắt hiển thị (các) đối tượng được chọn riêng biệt và được đặt ở trung tâm góc nhìn" msgid "Frame Selected" -msgstr "Khung Vừa Được Chọn" +msgstr "Đóng Khung cái được Chọn" msgid "Move the view to frame the selected objects" -msgstr "Di chuyển khung màn cho nó vừa các sự lựa chọn" +msgstr "Chuyển góc nhìn đến để đóng khung những đối tượng được chọn" msgctxt "Operator" msgid "Remove from Local View" -msgstr "Xóa từ Màn Địa Phương" +msgstr "Xóa khỏi Góc Nhìn Cục Bộ" msgid "Move selected objects out of local view" -msgstr "Di chuyển các vật thể được chọn ra ngoài màn địa phương" +msgstr "Chuyển các đối tượng được chọn ra khỏi Góc Nhìn Cục Bộ" msgid "Move the view" -msgstr "Di chuyển màn chiếu" +msgstr "Di chuyển góc nhìn" msgctxt "Operator" msgid "View Navigation (Walk/Fly)" -msgstr "Hiện Chuyển Hướng (Đi Bộ/Bay)" +msgstr "Điều Hướng Khung Nhìn (Đi Bộ/Bay Lượn)" msgid "Interactively navigate around the scene (uses the mode (walk/fly) preference)" -msgstr "Chuyển hướng tương tác trong cảnh (nó dùng chế độ tùy chọn (đi bộ/bay))" +msgstr "Điều hành một cách tương tác quanh khung cảnh (sử dụng cấu hình về chế độ (đi bộ/bay lượn)'" msgctxt "Operator" msgid "NDOF Transform View" -msgstr "Màn Biến Hóa NDOF" +msgstr "Biến Hóa Góc Nhìn bằng NDOF" msgid "Pan and rotate the view with the 3D mouse" -msgstr "Quét và xoay màn chiếu bằng chuột 3D" +msgstr "Lia và xoay chiều góc nhìn bằng chuột 3D" msgctxt "Operator" msgid "NDOF Orbit View" -msgstr "Qũy Đạo Màn NDOF" +msgstr "Quỹ Đạo Quanh Góc Nhìn bằng NDOF" msgid "Orbit the view using the 3D mouse" -msgstr "Qũy đạo màn chiếu bằng chuột 3D" +msgstr "Quỹ đạo quanh góc nhìn bằng chuột 3D" msgctxt "Operator" msgid "NDOF Orbit View with Zoom" -msgstr "Qũy Đặo Màn Với Phóng NDOF" +msgstr "Quỹ Đạo Quanh Góc Nhìn và Thu Phóng bằng NDOF" msgid "Orbit and zoom the view using the 3D mouse" -msgstr "Xoay quanh và phóng bằng chuột 3D" +msgstr "Quỹ đạo và thu phóng góc nhìn bằng chuột 3D" msgctxt "Operator" msgid "NDOF Pan View" -msgstr "Quét Màn NDOF" +msgstr "Lia Góc Nhìn bằng NDOF" msgid "Pan the view with the 3D mouse" -msgstr "Quét màn chiếu bằng chuột 3D" +msgstr "Lia góc nhìn bằng chuột 3D" msgctxt "Operator" msgid "Set Active Object as Camera" -msgstr "Đặt Vật Thể Hoạt Động Thành Máy Quay Phim" +msgstr "Đặt Đối Tượng đang Hoạt Động làm Máy Quay Phim" msgid "Set the active object as the active camera for this view or scene" -msgstr "Đặt vật thể hoạt động thành máy quay phim hoạt động cho màn hay cảnh này" +msgstr "Đặt đối tượng đang hoạt động làm máy quay phim đang hoạt động cho góc nhìn hay cảnh này" msgctxt "Operator" msgid "Object Mode Menu" -msgstr "Danh Bạ Chế Độ Vật Thể" +msgstr "Trình Đơn Chế Độ Đối Tượng" msgctxt "Operator" msgid "Paste Objects" -msgstr "Dán Vật Thể" +msgstr "Dán Đối Tượng" + + +msgid "Paste objects from the internal clipboard" +msgstr "Dán các đối tượng từ bảng nhớ tạm nội bộ vào" msgid "Put pasted objects in the active collection" -msgstr "Bỏ vật thể được dán vào sưu tập hoạt động" +msgstr "Đặt các đối tượng đã dán vào trong bộ sưu tập đang hoạt động" msgid "Select pasted objects" -msgstr "Chọn vật thể được dán" +msgstr "Chọn những đối tượng đã dán" msgctxt "Operator" @@ -73142,34 +80239,34 @@ msgstr "Đặt Vùng Kết Xuất" msgid "Set the boundaries of the border render and enable border render" -msgstr "Đặt biên giới của ranh giới kết xuất và bật kết xuất ranh giới" +msgstr "Đặt ranh giới cho kết xuất theo đường ranh giới và bật chức năng kết xuất này" msgctxt "Operator" msgid "Rotate View" -msgstr "Xoay Màn" +msgstr "Xoay Góc Nhìn" msgid "Rotate the view" -msgstr "Xoay màn" +msgstr "Xoay góc nhìn" msgctxt "Operator" msgid "Ruler Add" -msgstr "Thêm Cây Thước" +msgstr "Thêm Thước Đo" msgid "Add ruler" -msgstr "Thêm Cây Thước" +msgstr "Thêm Thước Đo" msgctxt "Operator" msgid "Ruler Remove" -msgstr "Xóa Cây Thước" +msgstr "Xóa Thước Đo" msgid "Select and activate item(s)" -msgstr "Chọn và hoạt động (các) mặt hàng" +msgstr "Chọn và kích hoạt (các) đối tượng" msgid "Enumerate" @@ -73177,195 +80274,195 @@ msgstr "Liệt Kê" msgid "List objects under the mouse (object mode only)" -msgstr "Làm danh sách cho vật thể ở dưới chuột (chỉ trong chế độ vật thể)" +msgstr "Liệt kê danh sách các đối tượng nằm dưới chuột (chỉ trong chế độ đối tượng mà thôi)" msgid "Use object selection (edit mode only)" -msgstr "Dùng sự lựa chọn vật thể (chỉ cho chế độ biên tập)" +msgstr "Sử dụng sự lựa chọn đối tượng (duy chế độ biên soạn)" msgid "Select items using box selection" -msgstr "Chọn mặt hàng bằng sự lựa chọn kiểu hộp" +msgstr "Chọn các phần tử dùng phương pháp khoanh vùng hình hộp" msgid "Select items using circle selection" -msgstr "Chọn mặt hàng bằng sự lựa chọn kiểu vòng tròn" +msgstr "Chọn các phần tử dùng vòng tròn" msgid "Select items using lasso selection" -msgstr "Chọn mặt hàng bằng sự lựa chọn kiểu dây trói" +msgstr "Chọn các phần tử dùng vòng dây thòng lọng" msgid "Menu object selection" -msgstr "Danh bạ sự lựa chọn vật thể" +msgstr "Trình đơn lựa chọn đối tượng" msgid "Object Name" -msgstr "Tên Vật Thể" +msgstr "Tên Đối Tượng" msgctxt "Operator" msgid "Smooth View" -msgstr "Màn Mịn" +msgstr "Chuyển Động Góc Nhìn Mềm Mại" msgctxt "Operator" msgid "Snap Cursor to Active" -msgstr "Hút Dính Con Trỏ Đến Hoạt Động" +msgstr "Bám Dính Con Trỏ vào cái đang Hoạt Động" msgid "Snap 3D cursor to the active item" -msgstr "Hút díh con trỏ 3D đến mặt hàng hoạt động" +msgstr "Bám dính con trỏ 3D vào đối tượng đang hoạt động" msgctxt "Operator" msgid "Snap Cursor to World Origin" -msgstr "Hút Dính Con Trỏ Đến Gốc Thế Giới" +msgstr "Bám Dính Con Trỏ vào Tọa Độ Thế Giới" msgid "Snap 3D cursor to the world origin" -msgstr "Hút dính con trỏ 3D đến gốc thế giới" +msgstr "Bám dính con trỏ 3D vào tọa độ thế giới" msgctxt "Operator" msgid "Snap Cursor to Grid" -msgstr "Hút Dính Con Trỏ Đến Đồ Thị" +msgstr "Bám Dính Con Trỏ vào Khung Lưới Đồ Thị" msgid "Snap 3D cursor to the nearest grid division" -msgstr "Hút dính con trỏ 3D đến khúc đồ thị gần nhất" +msgstr "Bám dính con trỏ 3D vào phân khoảng khung lưới đồ thị gần nhất" msgctxt "Operator" msgid "Snap Cursor to Selected" -msgstr "Hút Dính Con Trỏ Đến Được Chọn" +msgstr "Bám Dính Con Trỏ về chỗ được Chọn" msgid "Snap 3D cursor to the middle of the selected item(s)" -msgstr "Hút dính con trỏ 3D đến trung điểm giữa các mặt hàng được chọn" +msgstr "Bám dính con trỏ 3D vào trung điểm của (các) phần tử được chọn" msgctxt "Operator" msgid "Snap Selection to Active" -msgstr "Hút Dính Đến Hoạt Động" +msgstr "Bám Dính Lựa Chọn vào cái đang Hoạt Động" msgid "Snap selected item(s) to the active item" -msgstr "Hút dính (các) mặt hàng đến mặt hàng hoạt động" +msgstr "Bám dính phần tử được chọn vào phần tử đang hoạt động" msgid "Snap selected item(s) to the 3D cursor" -msgstr "Hút dính (các) mặt hàng được chọn đến con trỏ 3D" +msgstr "Bám dính (các) phần tử được chọn vào con trỏ 3D" msgid "If the selection should be snapped as a whole or by each object center" -msgstr "Sự lựa chọn nên hút dính toàn bộ hay mỗi trung tâm của các vật thể" +msgstr "Nếu cái lựa chọn phải bám dính toàn phần hoặc bởi trung tâm của mỗi đối tượng" msgid "Snap selected item(s) to their nearest grid division" -msgstr "Hút dính (các) mặt hàng được chọn đến khúc đồ thị gần nhất" +msgstr "Bám dính (các) phần tử được chọn vào phân khoảng khung lưới đồ thị gần nhất" msgctxt "Operator" msgid "Flip MatCap" -msgstr "Lật Vật Liệu Bắt" +msgstr "Đảo Lật MatCap" msgid "Flip MatCap" -msgstr "Lật Vật Liệu Bắt" +msgstr "Đảo Lật MatCap" msgctxt "Operator" msgid "Toggle Shading Type" -msgstr "Bật/Tắt Loạt Tô Sắc" +msgstr "Bật/Tắt Kiểu Tô Bóng" msgid "Toggle shading type in 3D viewport" -msgstr "Bật/tắt loại tô sắc trong màn chiếu 3D" +msgstr "Bật/Tắt kiểu tô bóng trong cổng nhìn 3D" msgid "Shading type to toggle" -msgstr "Loại tô sắc để bặt/tắt" +msgstr "Kiểu tô bóng để bật/tắt" msgid "Toggle wireframe shading" -msgstr "Bặt/tắt tô sắc sợi dây" +msgstr "Bật/tắt tô bóng của khung dây" msgid "Toggle solid shading" -msgstr "Bặt/tắc tô sắc rắn" +msgstr "Bật/Tắt tô bóng đặc (lập thể)" msgid "Material Preview" -msgstr "Dự Khán Vật Liệu" +msgstr "Xem Trước Nguyên Vật Liệu" msgid "Toggle material preview shading" -msgstr "Bật/tắt tô sắc của dự khán vật liệu" +msgstr "Bật/Tắt xem trước tô bóng của nguyên vật liệu" msgid "Toggle rendered shading" -msgstr "Bật/tắt tô sắc kết xuất" +msgstr "Bật/Tắt tô bóng đã kết xuất" msgctxt "Operator" msgid "Toggle X-Ray" -msgstr "Bặt/Tắt X-Quang" +msgstr "Bật/Tắt X-Quang" msgid "Transparent scene display. Allow selecting through items" -msgstr "Hiển thị cảnh trong suốt. Cho chọn xuyên qua mặt hàng" +msgstr "Hiển thị cảnh trong suốt. Cho phép lựa chọn xuyên qua các phần tử" msgctxt "Operator" msgid "Transform Gizmo Set" -msgstr "Biến Hóa Tập Đồ Đạc" +msgstr "Đặt Gizmo Biến Hóa" msgid "Set the current transform gizmo" -msgstr "Đặt đồ đạc biến hóa hiện tại" +msgstr "Đặt dụng cụ (gizmo) biến hóa hiện tại" msgctxt "Operator" msgid "Update Custom VR Landmark" -msgstr "Nâng Cấp Mốc Bờ Sự Thật Ảo Tùy Chọn" +msgstr "Cập Nhật Địa Ranh VR Tùy Chỉnh" msgid "Update the selected landmark from the current viewer pose in the VR session" -msgstr "Nâng cấp mốc bờ đã chọn từ dáng đứng hiện của đồ nhìn tại trong phiên chạy của sự thật ảo" +msgstr "Cập nhật địa danh đã chọn từ tư thế quan sát hiện tại trong phiên VR" msgid "View all objects in scene" -msgstr "Hiển thị tất cả vật thể trong cảnh" +msgstr "Hiển thị toàn bộ các đối tượng trong cảnh" msgid "All Regions" -msgstr "Hết Vùng" +msgstr "Toàn Bộ các Vùng" msgid "View selected for all regions" -msgstr "Hiển thị đồ được chọn cho tất cả vùng" +msgstr "Hiển thị cái được chọn trên toàn bộ các vùng" msgctxt "Operator" msgid "View Axis" -msgstr "Hiện Trục" +msgstr "Trục của Góc Nhìn" msgid "Use a preset viewpoint" -msgstr "Sử dụng một điểm nhìn đặt sẵn" +msgstr "Sử dụng một điểm nhìn đặt trước" msgid "Align Active" -msgstr "Sắp Xếp Hoạt Động" +msgstr "Sắp Hàng theo cái đang Hoạt Động" msgid "Align to the active object's axis" -msgstr "Sắp xếp với trục của vật thể hoạt động" +msgstr "Sắp hàng theo trục của đối tượng đang hoạt động" msgid "Rotate relative to the current orientation" -msgstr "Xoay tương đối với định hướng hiện tại" +msgstr "Xoay chiều tương đối về định hướng hiện tại" msgctxt "View3D" @@ -73374,7 +80471,7 @@ msgstr "Trái" msgid "View from the left" -msgstr "Xem từ phía trái" +msgstr "Quan sát từ bên trái" msgctxt "View3D" @@ -73383,24 +80480,24 @@ msgstr "Phải" msgid "View from the right" -msgstr "Xem từ phía phải" +msgstr "Quan sát từ bên phải" msgctxt "View3D" msgid "Bottom" -msgstr "Dưới" +msgstr "Đáy" msgid "View from the bottom" -msgstr "Xem từ phía dưới" +msgstr "Quan sát từ dưới lên" msgid "View from the top" -msgstr "Xem từ phía trên" +msgstr "Quan sát từ trên xuống" msgid "View from the front" -msgstr "Xem từ phía trước" +msgstr "Quan sát từ đằng trước" msgctxt "View3D" @@ -73409,185 +80506,185 @@ msgstr "Sau" msgid "View from the back" -msgstr "Xem từ phía sau" +msgstr "Quan sát từ đằng sau" msgctxt "Operator" msgid "View Camera" -msgstr "Xem Máy Quay Phim Màn" +msgstr "Nhìn qua Máy Quay Phim" msgid "Toggle the camera view" -msgstr "Bật/tắt màn máy quay phim" +msgstr "Bật/tắt góc nhìn trong máy quay phim" msgctxt "Operator" msgid "Frame Camera Bounds" -msgstr "Ranh Giới Khung Máy Quay Phim" +msgstr "Viền Khung dùng Ranh Giới của Máy Quay Phim" msgid "Center the camera view, resizing the view to fit its bounds" -msgstr "Trung màn màn máy quay phim, chỉnh màn cho vừa ranh giới của nó" +msgstr "Trung tâm hóa góc nhìn của máy quay phim, đổi kích thước của góc nhìn để khít vừa ranh giới của nó" msgctxt "Operator" msgid "View Lock Center" -msgstr "Trung Tâm Khóa Màn" +msgstr "Trung Tâm Hóa Góc Nhìn bị Khóa" msgid "Center the view lock offset" -msgstr "Trung tâm hóa màn đến địch khóa màn" +msgstr "Trung tâm hóa góc nhìn, dịch chuyển điểm khóa" msgctxt "Operator" msgid "Center View to Mouse" -msgstr "Trung Tâm Màn đến Chuột" +msgstr "Trung Tâm Hóa Góc Nhìn vào Chuột" msgid "Center the view to the Z-depth position under the mouse cursor" -msgstr "Trung tâm hóa màn đến vị trí độ sâu Z dưới con trỏ chuột" +msgstr "Trung tâm hóa góc nhìn theo vị trí chiều sâu-Z nằm dưới con trỏ chuột" msgctxt "Operator" msgid "View Lock Clear" -msgstr "Xóa Khoá Màn" +msgstr "Tháo Khóa Góc Nhìn" msgid "Clear all view locking" -msgstr "Xóa hết khóa màn" +msgstr "Tháo toàn bộ các khóa về góc nhìn" msgctxt "Operator" msgid "View Lock to Active" -msgstr "Khóa Màn Với Hoạt Động" +msgstr "Khóa Góc Nhìn vào Cái đang Hoạt Động" msgid "Lock the view to the active object/bone" -msgstr "Khóa màn với vật thể/xương hoạt động" +msgstr "Khóa góc nhìn vào đối tượng/xương đang hoạt động" msgctxt "Operator" msgid "View Orbit" -msgstr "Qũy Đạo Màn" +msgstr "Quỹ Đạo Quanh Góc Nhìn" msgid "Orbit the view" -msgstr "Qũy đạo quanh màn" +msgstr "Quỹ Đạo quanh góc nhìn" msgid "Orbit" -msgstr "Qũy Đạo" +msgstr "Quỹ Đạo" msgid "Direction of View Orbit" -msgstr "Hướng qũy đạo màn" +msgstr "Hướng Quỹ Đạo Góc Nhìn" msgid "Orbit Left" -msgstr "Qũy Đạo Trái" +msgstr "Quỹ Đạo Trái" msgid "Orbit the view around to the left" -msgstr "Qũy đạo màn phía trái" +msgstr "Xoay quỹ đạo quanh góc nhìn về bên trái" msgid "Orbit Right" -msgstr "Qũy Đạo Phải" +msgstr "Quỹ Đạo Phải" msgid "Orbit the view around to the right" -msgstr "Qũy đạo màn phía phải" +msgstr "Xoay quỹ đạo quanh góc nhìn về bên phải" msgid "Orbit Up" -msgstr "Qũy Đạo Lên" +msgstr "Quỹ Đạo Lên" msgid "Orbit the view up" -msgstr "Qũy đạo màn lên" +msgstr "Xoay quỹ đạo quanh góc nhìn lên phía trên" msgid "Orbit Down" -msgstr "Qũy Đạo Xuống" +msgstr "Quỹ Đạo Xuống" msgid "Orbit the view down" -msgstr "Qũy đạo màn xuống" +msgstr "Xoay quỹ đạo quanh góc nhìn xuống dưới" msgctxt "Operator" msgid "Pan View Direction" -msgstr "Hướng Dời Màn" +msgstr "Chiều Hướng Lia Góc Nhìn" msgid "Pan the view in a given direction" -msgstr "Dời màn đến hướng được xác định" +msgstr "Lia góc nhìn theo hướng chỉ định" msgid "Pan" -msgstr "Dời" +msgstr "Lia" msgid "Direction of View Pan" -msgstr "Hướng dời màn" +msgstr "Hướng Lia Góc Nhìn" msgid "Pan Left" -msgstr "Dời Trái" +msgstr "Lia Trái" msgid "Pan the view to the left" -msgstr "Dời màn phía trái" +msgstr "Lia góc nhìn về bên trái" msgid "Pan Right" -msgstr "Dời Phải" +msgstr "Lia Phải" msgid "Pan the view to the right" -msgstr "Dời màn phía phải" +msgstr "Lia góc nhìn về bên phải" msgid "Pan Up" -msgstr "Dời Trên" +msgstr "Lia Lên" msgid "Pan the view up" -msgstr "Dời màn phía trên" +msgstr "Lia góc nhìn lên trên" msgid "Pan Down" -msgstr "Dời Xuống" +msgstr "Lia Xuống" msgid "Pan the view down" -msgstr "Dời màn phía xuống" +msgstr "Lia góc nhìn xuống dưới" msgctxt "Operator" msgid "View Perspective/Orthographic" -msgstr "Chiếu Phối Cảnh/Trực Giao Cảnh" +msgstr "Góc Nhìn Phối Cảnh/Trực Giao" msgid "Switch the current view from perspective/orthographic projection" -msgstr "Trao đổi màn hiện tại từ phép chiếu phối cảnh/trực giao" +msgstr "Chuyển đổi góc nhìn hiện tại giữa hai phép chiếu: phối cảnh (luật xa gần) và trực giao" msgctxt "Operator" msgid "View Roll" -msgstr "Lăn Màn" +msgstr "Lăn Góc Nhìn" msgid "Roll the view" -msgstr "Lăn màn" +msgstr "Lăn góc nhìn" msgid "Roll Angle Source" -msgstr "Nguồn Góc Lăn" +msgstr "Nguồn của Góc Lăn" msgid "How roll angle is calculated" -msgstr "Làm sao tính góc lăn" +msgstr "Phương pháp tính góc lăn" msgid "Roll Angle" @@ -73595,7 +80692,7 @@ msgstr "Góc Lăn" msgid "Roll the view using an angle value" -msgstr "Lăn màn dùng một giá trị góc" +msgstr "Lăn góc nhìn dùng một giá trị góc" msgid "Roll Left" @@ -73603,7 +80700,7 @@ msgstr "Lăn Trái" msgid "Roll the view around to the left" -msgstr "Lăn màn quanh đến trái" +msgstr "Lăn góc nhìn về bên trái" msgid "Roll Right" @@ -73611,297 +80708,297 @@ msgstr "Lăn Phải" msgid "Roll the view around to the right" -msgstr "Lăn màn đến phía phải" +msgstr "Lăn góc nhìn về bên phải" msgid "Move the view to the selection center" -msgstr "Di chuyển màn đến trung tâm của sự lựa chọn" +msgstr "Di chuyển góc nhìn đến trung tâm của lựa chọn" msgctxt "Operator" msgid "Add Camera and VR Landmark from Session" -msgstr "Thêm Máy Quay Phim và Môc Bờ VR từ Phiên Chạy" +msgstr "Thêm Máy Quay Phim và Địa Ranh VR từ Phiên Sử Dụng" msgid "Create a new Camera and VR Landmark from the viewer pose of the running VR session and select it" -msgstr "Thêm một Máy Quay Phim và mốc bờ VR từ dạng đứng đồ nhìn của phiên chạy VR đang chạy vào danh sách và chọn nó" +msgstr "Kiến Tạo một Máy Quay Phim và Địa Danh VR mới từ tư thế quan sát viên của phiên VR đang hoạt động và lựa chọn nó" msgctxt "Operator" msgid "Activate VR Landmark" -msgstr "Kích Hoạt Mốc Bờ Sự Thật Ảo" +msgstr "Khởi Thủy Địa Ranh VR" msgid "Change to the selected VR landmark from the list" -msgstr "Đổi đến mốc bờ sự thật ảo được chọn từ danh sách" +msgstr "Đổi sang địa ranh VR đã chọn trong danh sách" msgctxt "Operator" msgid "Add VR Landmark" -msgstr "Thêm Mốc Bờ Sự Thật Ảo" +msgstr "Cho Thêm Địa Ranh VR" msgid "Add a new VR landmark to the list and select it" -msgstr "Thêm một mốc bờ sự thật ảo trong danh sách và chọn nó" +msgstr "Thêm địa ranh VR mới vào trong danh sách và lựa chọn nó" msgctxt "Operator" msgid "Add VR Landmark from Camera" -msgstr "Thêm Mốc Bờ VR từ Máy Quay Phim" +msgstr "Thêm Địa Ranh VR từ Máy Quay Phim" msgid "Add a new VR landmark from the active camera object to the list and select it" -msgstr "Thêm một mốc bờ sự thật ảo từ vật thể máy quay phim hoạt động vào danh sách và chọn nó" +msgstr "Cho thêm địa ranh VR mới từ đối tượng máy quay phim đang hoạt động vào danh sách và lựa chọn nó" msgctxt "Operator" msgid "Add VR Landmark from Session" -msgstr "Thêm Môc Bờ VR từ Phiên Chạy" +msgstr "Thêm Địa Ranh VR từ Phiên Sử Dụng" msgid "Add VR landmark from the viewer pose of the running VR session to the list and select it" -msgstr "Thêm mốc bờ từ dạng đứng đồ nhìn của phiên chạy sự thật ảo đang chạy vào danh sách và chọn mốc bờ mời đó" +msgstr "Thêm địa ranh VR mới tư thế quan sát trong phiên VR đang hoạt động vào danh sách và lựa chọn nó" msgctxt "Operator" msgid "Remove VR Landmark" -msgstr "Xóa Mốc Bờ Sự Thật Ảo" +msgstr "Xóa Địa Ranh VR" msgid "Delete the selected VR landmark from the list" -msgstr "Xóa mốc bờ sự thật ảo được chọn từ danh sách" +msgstr "Xóa địa ranh VR đã chọn khỏi danh sách" msgctxt "Operator" msgid "Walk Navigation" -msgstr "Chuyển Hướng Đi Bộ" +msgstr "Điều Hướng Đi Bộ" msgid "Interactively walk around the scene" -msgstr "Tương tác đi bộ trong cảnh" +msgstr "Đi bộ trong cảnh một cách tương tác" msgid "Zoom in/out in the view" -msgstr "Phóng vào/ra trong màn" +msgstr "Thu-phóng vào/ra trong khung nhìn" msgid "Zoom in the view to the nearest object contained in the border" -msgstr "Phóng vào màn đến vật thể gần nhất ở trong ranh giới" +msgstr "Thu-phóng trong khung nhìn vào đối tượng gần nhất nằm nội trong ranh giới" msgctxt "Operator" msgid "Zoom Camera 1:1" -msgstr "Phóng Máy Quay Phim 1:1" +msgstr "Thu-Phóng Máy Quay 1:1" msgid "Match the camera to 1:1 to the render output" -msgstr "Phóng màn máy quay phim đến 1:1 với kích cỡ ảnh kết xuất" +msgstr "Khớp tỷ lệ của góc nhìn của máy quay phim và kích thước ảnh kết xuất giống nhau 1:1" msgctxt "Operator" msgid "Export Alembic" -msgstr "Xuất Alembic" +msgstr "Xuất Khẩu Alembic" msgid "Export current scene in an Alembic archive" -msgstr "Xuất cảnh hiện tại trong một kho Alembic" +msgstr "Xuất Khẩu cảnh hiện tại trong một kho Alembic" msgid "Apply Subdivision Surface" -msgstr "Áp Dụng Phân Hóa Bề Mặt" +msgstr "Áp Dụng Bề Mặt Phân Hóa" msgid "Export subdivision surfaces as meshes" -msgstr "Xuất mặt phân hóa như mạng lưới" +msgstr "Xuất khẩu các bề mặt phân hóa như những khung lưới" msgid "Run as Background Job" -msgstr "Chạy Công Việc Đằng Sau" +msgstr "Thi Hành tựa như Công Việc Ngầm ở Nền Đằng Sau" msgid "Enable this to run the import in the background, disable to block Blender while importing. This option is deprecated; EXECUTE this operator to run in the foreground, and INVOKE it to run as a background job" -msgstr "Bật cái này để chạy nhập phía sau, tắt để bắt Blender phải đợi khi đang nhập. Tùy chọn này lỡi thời; THỰC HÀNH tương tác này để chạy phía trước, và BẬT nó để chạy nó bằng một hóa trình phía sau" +msgstr "Bật cái này để thi hành quá trình nhập khẩu ngầm ở trên nền đằng sau. Tắt đi để ngăn chặn Blender trong khi nhập khẩu. Tùy chọn này đã trở thành lỗi thời; EXECUTE (thi hành) thao tác này để chạy ở nền trước, và INVOKE (kích hoạt) nó để thi hành như một công việc ngầm ở nền đằng sau" msgid "Curves as Mesh" -msgstr "Đường cong bằng Mạng Lưới" +msgstr "Đường Cong thành Khung Lưới" msgid "Export curves and NURBS surfaces as meshes" -msgstr "Xuất đường cong và bề mặt NURBS bằng mạng lưới" +msgstr "Xuất Khẩu các đường cong và các bề mặt NURBS thành các khung lưới" msgid "End frame of the export, use the default value to take the end frame of the current scene" -msgstr "Bức ảnh cuối để xuất, dùng giá trị mặc định để dùng bức ảnh cuối của cảnh hiện tại" +msgstr "Khung hình cuối để xuất khẩu, dùng giá trị mặc định để lấy khung hình cuối của cảnh hiện tại" msgid "Use Settings for" -msgstr "Dùng cài đặt cho" +msgstr "Sử Dụng các Sắp Đặt cho" msgid "Determines visibility of objects, modifier settings, and other areas where there are different settings for viewport and rendering" -msgstr "Xác định sự hiển thị của vật thể, cài đặt của bộ điều chỉnh, và các lĩnh vực khác có những cài đặt khác cho màn chiếu và kết xuất" +msgstr "Xác định tính hữu hình của các đối tượng, các sắp đặt của bộ điều chỉnh, và các khu vực khác, tức những nơi có những sắp đặt bất đồng về cổng nhìn và kết xuất" msgid "Use Render settings for object visibility, modifier settings, etc" -msgstr "Dùng cài đặt cho sự hiển thị của vật thể, cài đặt bộ điều chỉnh, v.v." +msgstr "Sử dụng các sắp đặt về Kết Xuất cho tính hữu hình của đối tượng, các sắp đặt của bộ điều chỉnh, vân vân" msgid "Use Viewport settings for object visibility, modifier settings, etc" -msgstr "Dùng cài đặt Màn Chiếu cho sự hiển thị của vật thể, bộ điều chỉnh, v.v." +msgstr "Sử dụng các sắp đặt của Cổng Nhìn cho tính hữu hình của đối tượng, các sắp đặt của bộ điều chỉnh, vân vân" msgid "Export Custom Properties" -msgstr "Xuất Đặc Tính Tùy Chọn" +msgstr "Xuất Khẩu các Tính Chất Tùy Chỉnh" msgid "Export custom properties to Alembic .userProperties" -msgstr "Xuất đặc tính tùy chọn vào tập tin Alembic .userProperties" +msgstr "Xuất Khẩu các tính chất tùy chỉnh ra Alembic .userProperties (các tính chất của người dùng)" msgid "Export Hair" -msgstr "Xuất Tóc" +msgstr "Xuất Khẩu Tóc" msgid "Exports hair particle systems as animated curves" -msgstr "Xuất hệ thống hạt tóc thành đường cong hoạt hình" +msgstr "Xuất Khẩu các hệ thống hạt về tóc thành các đường cong hoạt họa" msgid "Export Particles" -msgstr "Xuất Hạt" +msgstr "Xuất Khẩu Hạt" msgid "Exports non-hair particle systems" -msgstr "Xuất hệ thống hạt trừ tóc" +msgstr "Xuất Khẩu các hệ thống hạt không phải là tóc" msgid "Export per face shading group assignments" -msgstr "Xuất tô sắc mỗi mặt tùy chỉ định nhóm" +msgstr "Xuất Khẩu các chỉ định nhóm tô bóng của mỗi Mặt" msgid "Flatten Hierarchy" -msgstr "Bằng Phẳng Hóa Tầng Bậc" +msgstr "Hợp các Tầng Bậc Thành Một" msgid "Do not preserve objects' parent/children relationship" -msgstr "Không giữ quan hệ phụ huynh/con cái của vật thể" +msgstr "Không bảo tồn quan hệ phụ huynh/con cái của các đối tượng" msgid "Value by which to enlarge or shrink the objects with respect to the world's origin" -msgstr "Giá trị để phóng to hay rút nhỏ vật thể tương đối với gốc tọa độ của thế giới" +msgstr "Giá trị để phóng to hoặc thu nhỏ đối tượng, phỏng theo tọa độ gốc thế giới" msgid "Geometry Samples" -msgstr "Mẫu Vật Hình Dạng" +msgstr "Lượng Mẫu Vật Hình Học" msgid "Number of times per frame object data are sampled" -msgstr "Số lần lấy mẫu vật từ dữ liệu vật thể cho mỗi bức ảnh" +msgstr "Số lần lấy mẫu dữ liệu đối tượng của mỗi khung hình" msgid "Export normals" -msgstr "Xuất Pháp Tuyến" +msgstr "Xuất Khẩu các pháp tuyến" msgid "Export undeformed mesh vertex coordinates" -msgstr "Xuất tọa đồ mạng lưới không bị méo hó" +msgstr "Xuất Khẩu tọa độ điểm đỉnh của khung lưới chưa biến dạng" msgid "Export UVs with packed island" -msgstr "Xuất UV với đảo gói" +msgstr "Xuất Khẩu các UV với hải đảo được tập hợp lại" msgid "Selected Objects Only" -msgstr "Chỉ Vật Thể Chọn" +msgstr "Duy Đối Tượng được Chọn" msgid "Export only selected objects" -msgstr "Chỉ xuất vật thể được chọn" +msgstr "Duy Xuất Khẩu các đối tượng được chọn" msgid "Shutter Close" -msgstr "Đóng Trập" +msgstr "Cửa Chập Đóng" msgid "Time at which the shutter is closed" -msgstr "Thời gian trập được đóng" +msgstr "Thời điểm cửa chập đóng lại" msgid "Shutter Open" -msgstr "Mở Trập" +msgstr "Cửa Chập Mở" msgid "Time at which the shutter is open" -msgstr "Thời gian trập được mở" +msgstr "Thời điểm cửa chập mở ra" msgid "Start frame of the export, use the default value to take the start frame of the current scene" -msgstr "Bức ảnh đầu để xuất, dùng giá trị mặc định để dùng bức ảnh đầu của cảnh hiện tại" +msgstr "Khung hình đầu tiên để xuất khẩu, dùng giá trị mặc định để lấy khung hình đầu của cảnh hiện tại" msgid "Use Subdivision Schema" -msgstr "Dùng Phương Pháp Phân Hóa" +msgstr "Dùng Kế Hoạch Phân Hóa" msgid "Export meshes using Alembic's subdivision schema" -msgstr "Xuất mạng lưới bằng phương pháp phân hóa của Alembic" +msgstr "Xuất Khẩu các khung lưới bằng kế hoạch phân hóa của Alembic" msgid "Export polygons (quads and n-gons) as triangles" -msgstr "Xuất đa giác (tư giác & n-giác) sang tam giác" +msgstr "Xuất Khẩu đa giác (tứ giác và đa-giác) ra thành tam giác" msgid "Use Instancing" -msgstr "Dùng Thực Thể Hóa" +msgstr "Sử Dụng Thực Thể Hóa" msgid "Export data of duplicated objects as Alembic instances; speeds up the export and can be disabled for compatibility with other software" -msgstr "Xuất dữ liệu của vật thể được sao chép bằng thực thể Alembic; tăng tốc cho xuất dữ liệu và có thể tắt nó cho phù hợp với phần mềm khác" +msgstr "Xuất Khẩu dữ liệu của đối tượng như các thực thể Alembic; gia tốc quá trình xuất khẩu và có thể tắt đi để đảm bảo tính tương thích với các phần mềm khác" msgid "Export UVs" -msgstr "Xuất UV" +msgstr "Xuất Khẩu các UV" msgid "Export color attributes" -msgstr "Xuất đặc tính màu sắc" +msgstr "Xuất khẩu thuộc tính màu" msgid "Visible Objects Only" -msgstr "Chỉ Các Vật Thể Hiển Thị" +msgstr "Duy Đối Tượng Hữu Hình" msgid "Export only objects that are visible" -msgstr "Chỉ xuất các vật thể hiển thị" +msgstr "Chỉ Xuất Khẩu các đối tượng nhìn thấy được mà thôi" msgid "Transform Samples" -msgstr "Biến Hóa Mẫu Vật" +msgstr "Lượng Mẫu Vật Biến Hóa" msgid "Number of times per frame transformations are sampled" -msgstr "Số lần mỗi bức ảnh lấy mẫu vật biến hóa" +msgstr "Số lần các biến hóa của mỗi khung hình được lấy mẫu" msgctxt "Operator" msgid "Import Alembic" -msgstr "Nhập Alembic" +msgstr "Nhập Khẩu Alembic" msgid "Load an Alembic archive" -msgstr "Nhập kho Alembic" +msgstr "Nạp kho Alembic" msgid "Always Add Cache Reader" -msgstr "Lần Nào Thêm Đệm Chứa" +msgstr "Luôn Luôn Thêm Trình Đọc Bộ Đệm Nhớ" msgid "Add cache modifiers and constraints to imported objects even if they are not animated so that they can be updated when reloading the Alembic archive" -msgstr "Thêm các bộ điều chỉnh và ràng buộc của đệm chứa cho những vật thể nhập mặc dù chúng nó không có hoạt hình, cho có thể nâng cấp chúng nó khi nhập lại từ kho Alembic" +msgstr "Thêm bộ điều chỉnh bộ đệm nhớ và các ràng buộc vào các đối tượng nhập khẩu, ngay cả khi chúng chưa được hoạt họa, hầu cho chúng có thể được cập nhật khi nạp lại kho lưu trữ Alembic vào" msgid "Enable this to run the export in the background, disable to block Blender while exporting. This option is deprecated; EXECUTE this operator to run in the foreground, and INVOKE it to run as a background job" -msgstr "Bật cái này để chạy xuất phía sau, tắt để bắt Blender phải đợi khi đang xuất. Tùy chọn này lỡi thời; THỰC HÀNH tương tác này để chạy phía trước, và BẬT nó để chạy nó bằng một hóa trình phía sau" +msgstr "Bật cái này để thi hành quá trình nhập ngầm ở trên nền đằng sau. Tắt đi để để ngăn chặn Blender trong khi nhập. Tùy chọn này đã trở thành lỗi thời; EXECUTE (thi hành) thao tác này để chạy ở nền trước, và INVOKE (kích hoạt) nó để thi hành như một công việc ngầm ở nền đằng sau" msgid "Is Sequence" @@ -73909,166 +81006,178 @@ msgstr "Là Trình Tự" msgid "Set to true if the cache is split into separate files" -msgstr "Đặt đúng nếu đệm chứa được chẻ thành tập tin khác nhau" +msgstr "Đặt là đúng (true) nếu bộ nhớ đệm được phân chia thành nhiều tập tin khác nhau" msgid "Set Frame Range" -msgstr "Đặt Phạm Vi Bức Ảnh" +msgstr "Đặt Phạm Vi Khung Hình" msgid "If checked, update scene's start and end frame to match those of the Alembic archive" -msgstr "Nếu được chọn, nâng cấp bức ảnh đầu và cuối của cảnh cho giống kho Alembic" +msgstr "Nếu được chọn thì cập nhật khung hình đầu và cuối của cảnh để xứng khớp với những cái nằm trong kho Alembic" msgid "Validate Meshes" -msgstr "Kiểm Tra Mạng Lưới" +msgstr "Kiểm Nhận các Khung Lưới" msgid "Check imported mesh objects for invalid data (slow)" -msgstr "Kiểm tra dữ liệu của vật thể mạng lới có hợp lệ (chậm)" +msgstr "Kiểm tra dữ liệu bất hợp pháp trong các đối tượng khung lưới nhập khẩu (chậm)" msgctxt "Operator" msgid "Append" -msgstr "Kèm" +msgstr "Bổ Sung" msgid "Append from a Library .blend file" -msgstr "Kèm từ một tập tin .blend Thư Viện" +msgstr "Bổ sung thêm từ một tập tin .blend Thư Viện" msgid "Put new objects on the active collection" -msgstr "Bỏ vật thể mới vào sưu tập hoạt động" +msgstr "Đặt các đối tượng mới vào bộ sưu tập đang hoạt động" msgid "Select new objects" -msgstr "Chọn vật thể mới" +msgstr "Chọn các đối tượng mới" + + +msgid "Clear Asset Data" +msgstr "Xóa Dữ Liệu Tài Sản" + + +msgid "Don't add asset meta-data or tags from the original data-block" +msgstr "Không thêm siêu dữ liệu của tài sản hoặc thẻ đánh dấu từ khối dữ liệu gốc vào" msgid "Re-Use Local Data" -msgstr "Dùng Lại Dữ Liệu Địa Phương" +msgstr "Tái Sử Dụng Dữ Liệu Cục Bộ" msgid "Try to re-use previously matching appended data-blocks instead of appending a new copy" -msgstr "Thử dùng lại các cục dữ liệu giống đã kèm rồi thay thế lèm một bản sao mới" +msgstr "Thử tái sử dụng các khối dữ liệu đã khớp và được bổ sung trước đây, thay vì chèn thêm bản sao mới" msgid "Instance Collections" -msgstr "Sưu Tập Thực Thể" +msgstr "Thực Thể Hóa Bộ Sưu Tập" msgid "Create instances for collections, rather than adding them directly to the scene" -msgstr "Chế tạo thực thể cho các sưu tập, thay thế bỏ chúng nó trực tiếp vào trong cảnh" +msgstr "Biến các bộ sưu tập thành các thực thể, thay vì thêm chúng trực tiếp vào cảnh" msgid "Instance Object Data" -msgstr "Dữ Liệu Vật Thể Thực Thể" +msgstr "Thực Thể Hóa Dữ Liệu Đối Tượng" msgid "Create instances for object data which are not referenced by any objects" -msgstr "Chế tạo thực thể cho dữ liệu vật thể chưa được tham chiếu bởi vật thể nào" +msgstr "Kiến Tạo thực thể cho dữ liệu đối tượng, tức những cái hiện không có bất cứ đối tượng nào tham chiếu đến" msgid "Link the objects or data-blocks rather than appending" -msgstr "Liên kết các vật thể hay cục dữ liệu thay thế kèm chúng nó" +msgstr "Kết nối các đối tượng hoặc các khối dữ liệu thay vì bổ sung thêm" msgid "Set \"Fake User\" for appended items (except objects and collections)" -msgstr "Đặt \"Người Dùng Giả\" cho mặt hàng kèm (trừ vật thể và sưu tập)" +msgstr "Đặt \"Người Dùng Giả\" cho các phần tử bổ sung mà thôi (ngoại trừ các đối tượng và các bộ sưu tập)" msgid "Localize All" -msgstr "Địa Phương Hóa Hết" +msgstr "Cục Bộ Hóa Toàn Bộ" msgid "Localize all appended data, including those indirectly linked from other libraries" -msgstr "Địa phương hóa hết dữ liệu, gồm đồ liên kết gián tiếp từ các thư viện khác" +msgstr "Cục bộ hóa toàn bộ các dữ liệu bổ sung, bao gồm cả những cái được kết nối gián tiếp từ những thư viện khác" msgctxt "Operator" msgid "Batch Rename" -msgstr "Đổi Tên Đợt" +msgstr "Đổi Tên Hàng Loạt" msgid "Rename multiple items at once" -msgstr "Đổi tên nhiều mặt hàng một lượt" +msgstr "Đổi tên nhiều mục cùng một lúc" msgid "Type of data to rename" -msgstr "Loại dữ liệu để đổi tên" +msgstr "Kiểu dữ liệu để đổi tên" msgid "Grease Pencils" -msgstr "Các Bút Sáp" +msgstr "Bút Chì Dầu" msgid "Sequence Strips" -msgstr "Các Đoạn Trình Tự" +msgstr "Dải Trình Tự" + + +msgid "Action Clips" +msgstr "Đoạn Quay Hành Động" msgctxt "Operator" msgid "Validate .blend strings" -msgstr "Kiểm tra xâu .blend" +msgstr "Kiểm chứng các chuỗi ký tự trong bản .blend" msgid "Check and fix all strings in current .blend file to be valid UTF-8 Unicode (needed for some old, 2.4x area files)" -msgstr "Kiểm tra và sửa hết xâu trong tập tin .blend hiện tại thành UTF-8 hợp lệ (cần cho vài tập tin phiên bản 2.4x)" +msgstr "Kiểm tra và sửa toàn bộ các chuỗi ký tự trong tập tin .blend hiện tại xem chúng có hợp lệ với mã Unicode UTF-8 hay không (cần thiết đối với một số các tập tin cũ trong địa phận của 2.4x)" msgctxt "Operator" msgid "Call Menu" -msgstr "Kêu Danh Bạ" +msgstr "Khởi Động Trình Đơn" msgid "Open a predefined menu" -msgstr "Mở một danh bạ đặt sẵn" +msgstr "Mở một trình đơn đã được định nghĩa" msgid "Name of the menu" -msgstr "Tên của danh bạ" +msgstr "Tên của trình đơn" msgctxt "Operator" msgid "Call Pie Menu" -msgstr "Kêu Danh Bạ Quạt" +msgstr "Khởi Động Trình Đơn Hình Rẻ Quạt" msgid "Open a predefined pie menu" -msgstr "Mở một danh bạ quạt đặt sẵn" +msgstr "Mở một trình đơn hình rẻ quạt đã được định nghĩa" msgid "Name of the pie menu" -msgstr "Tên của danh bạ quạt" +msgstr "Tên của trình đơn hình rẻ quạt" msgctxt "Operator" msgid "Call Panel" -msgstr "Kêu Bảng" +msgstr "Gọi Bảng" msgid "Open a predefined panel" -msgstr "Mở một bảng đặt sẵn" +msgstr "Mở một bảng đã được định nghĩa" msgid "Keep Open" -msgstr "Giữ Mở Ra" +msgstr "Giữ Mở" msgctxt "Operator" msgid "Export COLLADA" -msgstr "Xuất COLLADA" +msgstr "Xuất Khẩu COLLADA" msgid "Save a Collada file" -msgstr "Lưu một tập tin Collada" +msgstr "Lưu tập tin Collada" msgid "Only Selected UV Map" -msgstr "Chỉ Bản Độ UV Được Chọn" +msgstr "Duy Ánh Xạ UV được Chọn" msgid "Export only the selected UV Map" -msgstr "Chỉ xuất Bản Đồ UV được chọn" +msgstr "Duy Xuất Khẩu Ánh Xạ UV được chọn mà thôi" msgid "Apply Global Orientation" @@ -74076,199 +81185,203 @@ msgstr "Áp Dụng Định Hướng Toàn Cầu" msgid "Rotate all root objects to match the global orientation settings otherwise set the global orientation per Collada asset" -msgstr "Xoay hết vật thể rễ cho giống cài đặt định hướng toàn cầu, nếu không, đặt định hướng toàn cầu từng tích sản Collada" +msgstr "Xoay chiều toàn bộ các đối tượng gốc để khớp với các sắp đặt toàn cầu về định hướng, nếu không thì đặt định hướng toàn cầu cho mỗi tài sản của Collada" + + +msgid "Apply modifiers to exported mesh (non destructive)" +msgstr "Áp dụng các bộ điều chỉnh vào khung lưới được xuất khẩu (không hủy hoại (an toàn))" msgid "Deform Bones Only" -msgstr "Chỉ Méo Hóa Xương" +msgstr "Duy Biến Dạng các Xương" msgid "Only export deforming bones with armatures" -msgstr "Chỉ xuất xương có thể méo với cốt" +msgstr "Chỉ xuất khẩu các xương biến dạng với khung cốt" msgid "Transformation type for translation, scale and rotation. Note: The Animation transformation type in the Anim Tab is always equal to the Object transformation type in the Geom tab" -msgstr "Lọai biến hóa cho dịch, phóng to và xoay. Lưu Ý: Loại biến hóa Hoạt Hình trong Nhãn Hoạt Hình lần nào cũng bằng loại biến hóa Vật Thể trong nhãn Hình Dạng" +msgstr "Kiểu biến hóa cho dịch chuyển, tỷ lệ và xoay chiều. Lưu ý: kiểu biến hóa của hoạt họa trong thẻ 'Anim' (Hoạt Họa) luôn luôn tương đồng với kiểu biến hóa của Đối Tượng trong thẻ 'Geom' (Hình Học)" msgid "Use representation for exported transformations" -msgstr "Dùng biểu diễn cho biến hóa được xuất" +msgstr "Sử dụng () để đại diện cho các biến hóa xuất ngoại" msgid "Decomposed" -msgstr "Được Tách Rời" +msgstr "Phân Tích" msgid "Use , and representation for exported transformations" -msgstr "Dùng biểu diễn , cho biến hóa được xuất" +msgstr "Sử dụng đại diện về , cho các biến hóa xuất ngoại" msgid "Key Type" -msgstr "Loại Bức Ảnh Mẫu" +msgstr "Kiểu Khóa Hóa" msgid "Type for exported animations (use sample keys or Curve keys)" -msgstr "Lọai cho hoạt hình được xuất (dùng bức ảnh mẫu mẫu vật hay Đường Cong mẫu)" +msgstr "Kiểu xuất khẩu hoạt họa (dùng các bản mẫu khung khóa hoặc các khóa hóa của Đường Cong)" msgid "Export Sampled points guided by sampling rate" -msgstr "Xuất điểm Mẫu Vật được hướng dẫn bằng tốc độ lấy mẫu vật" +msgstr "Xuất Khẩu các điểm mẫu vật đã lấy theo chỉ dẫn của tần số lấy mẫu vật" msgid "Export Curves (note: guided by curve keys)" -msgstr "Xuất Đường Cong (lưu ý: được hướng dẫn bằng đường cong mẫu)" +msgstr "Xuất Khẩu các Đường Cong (lưu ý: theo sự chỉ dẫn của những khóa hóa đường cong)" msgid "Global Forward Axis" -msgstr "Trục Phía Trước Toàn Cầu" +msgstr "Trục Trước Toàn Cầu" msgid "Global Forward axis for export" -msgstr "Phía Trước Trục Toàn Cầu cho xuất" +msgstr "Trục hướng về phía Trước toàn cầu để xuất khẩu" msgid "Global Forward is positive X Axis" -msgstr "Phía Trước Toàn Cầu là Trục X dương" +msgstr "Trục Trước Toàn Cầu là Trục X dương" msgid "Global Forward is positive Y Axis" -msgstr " Phía Trước Toàn Cầu là Trục Y dương" +msgstr "Trục Trước Toàn Cầu là Trục Y dương" msgid "Global Forward is positive Z Axis" -msgstr "Phía Trước Toàn Cầu là Trục Z dương" +msgstr "Trục Trước Toàn Cầu là Trục Z dương" msgid "Global Forward is negative X Axis" -msgstr "Phía Trước Toàn Cầu là Trục X âm" +msgstr "Trục Trước Toàn Cầu là Trục X âm" msgid "Global Forward is negative Y Axis" -msgstr "Phía Trước Toàn Cầu là Trục Y âm" +msgstr "Trục Trước Toàn Cầu là Trục Y âm" msgid "Global Forward is negative Z Axis" -msgstr "Phía Trước Toàn Cầu là Trục Z âm" +msgstr "Trục Trước Toàn Cầu là Trục Z âm" msgid "Global Up Axis" -msgstr "Trục Trên Toàn Cầu" +msgstr "Trục Lên Toàn Cầu" msgid "Global Up axis for export" -msgstr "Trục Phía Trên Toàn Cầu cho xuất" +msgstr "Trục hướng Lên Trên toàn cầu để xuất khẩu" msgid "Global UP is positive X Axis" -msgstr "Phía Trên Toàn Cầu là trục X dương" +msgstr "Trục Lên Toàn Cầu là Trục X dương" msgid "Global UP is positive Y Axis" -msgstr "Phía Trên Toàn Cầu là trục Y dương" +msgstr "Trục Lên Toàn Cầu là Trục Y dương" msgid "Global UP is positive Z Axis" -msgstr "Phía Trên Toàn Cầu là trục Z dương" +msgstr "Trục Lên Toàn Cầu là Trục X dương" msgid "Global UP is negative X Axis" -msgstr "Phía Trên Toàn Cầu là trục X âm" +msgstr "Trục Lên Toàn Cầu là Trục X âm" msgid "Global UP is negative Y Axis" -msgstr "Phía Trên Toàn Cầu là trục Y âm" +msgstr "Trục Lên Toàn Cầu là Trục Y âm" msgid "Global UP is negative Z Axis" -msgstr "Phía Trên Toàn Cầu là trục Z âm" +msgstr "Trục Lên Toàn Cầu là Trục Z âm" msgid "Modifier resolution for export" -msgstr "Độ phân giải cho bộ điều chỉnh khi xuất" +msgstr "Độ phân giải của bộ điều chỉnh khi xuất ngoại" msgid "Apply modifier's viewport settings" -msgstr "Áp dụng cài đặt màn của bộ điều chỉnh" +msgstr "Áp dụng các sắp đặt cổng nhìn của bộ điều chỉnh" msgid "Apply modifier's render settings" -msgstr "Áp dụng cài đặt kết xuất của bộ điều chỉnh" +msgstr "Áp dụng các sắp đặt kết xuất của bộ điều chỉnh" msgid "Object Transformation type for translation, scale and rotation" -msgstr "Loại Biến Hóa cho dịch, phóng to, và xoay" +msgstr "Kiểu Biến Hóa của Đối Tượng dành cho biến hóa, tỷ lệ, và xoay chiều" msgid "Include all Actions" -msgstr "Gồm tất cả Hành Động" +msgstr "Bao gồm toàn bộ các Hành Động" msgid "Export also unassigned actions (this allows you to export entire animation libraries for your character(s))" -msgstr "Cũng xuất hành động chưa được chỉ định (cho bạn có thể xuất toàn bộ thư viện hoạt hình cho các nhân vật)" +msgstr "Xuất Khẩu các hành động chưa được ấn định (điều này cho phép bạn xuất khẩu toàn bộ các thư viện hoạt họa cho (các) nhân vật của mình)" msgid "Include Animations" -msgstr "Gồm Hoạt Hình" +msgstr "Bao Gồm Hoạt Họa" msgid "Export animations if available (exporting animations will enforce the decomposition of node transforms into and components)" -msgstr "Xuất các hoạt hình nếu có (xuất hoạt hình sẽ ép buộc chia biến hóa giao của điểm sang thành phần )" +msgstr "Xuất Khẩu hoạt họa nếu có (xuất khẩu hoạt họa sẽ đảm bảo sự phân tích các biến hóa của nút ra các thành phần )" msgid "Include Armatures" -msgstr "Gồm Cốt" +msgstr "Bao Gồm Khung Cốt" msgid "Export related armatures (even if not selected)" -msgstr "Xuất cốt liên quan (cũng xuất nếu chưa được chọn)" +msgstr "Xuất Khẩu các khung cốt liên quan (ngay cả khi không được chọn)" msgid "Include Children" -msgstr "Gồn Con Cái" +msgstr "Bao Gồm Con Cái" msgid "Export all children of selected objects (even if not selected)" -msgstr "Xuất tất cả con cái của vật thể được chọn (cũng xuất nếu chưa được chọn)" +msgstr "Xuất Khẩu toàn bộ các con cái của đối tượng được chọn (ngay cả khi không được chọn)" msgid "Include Shape Keys" -msgstr "Gồm Mẫu Dạng" +msgstr "Bao Gồm Hình Mẫu" msgid "Export all Shape Keys from Mesh Objects" -msgstr "Xuất hết mẫu dạng từ Vật Thể Mạng Lưới" +msgstr "Xuất Khẩu toàn bộ các Hình Mẫu từ Đối Tượng Khung Lưới" msgid "Keep Bind Info" -msgstr "Giữ Thông Tin Trói" +msgstr "Lưu Giữ Thông Tin Kết Buộc" msgid "Store Bindpose information in custom bone properties for later use during Collada export" -msgstr "Giữ thông tin trói dạng đứng trong đặc tính tùy chọn của xương để dùng khi xuất tập tin Collada" +msgstr "Lưu giữ thông tin Bindpose (Tư Thế Kết Buộc) trong tính chất tùy chọn của xương để dùng sau này trong khi xuất khẩu ra định dạng Collada" msgid "All Keyed Curves" -msgstr "Hết Đường Cong Có Bức Ảnh Mẫu" +msgstr "Toàn bộ các đường cong đã khóa hóa" msgid "Export also curves which have only one key or are totally flat" -msgstr "Cũng xuất đường cong thì chỉ có một bức ảnh mẫu hay là bằng bằng phẳng hoàn toàn" +msgstr "Đồng thời Xuất Khẩu các đường cong chỉ có một khóa hoặc hoàn toàn phẳng lặng" msgid "Keep Keyframes" -msgstr "Giữ Bức Ảnh Mẫu" +msgstr "Giữ các Khung Khóa" msgid "Use existing keyframes as additional sample points (this helps when you want to keep manual tweaks)" -msgstr "Dùng bức ảnh đang tồn tại làm điểm mẫu vật thêm (này giúp giữ các chỉnh sửa làm bằng tay)" +msgstr "Sử dụng các khung khóa hiện tại như các điểm mẫu vật bổ sung (điều này sẽ có giúp cho mình nếu bạn muốn duy trì các hiệu chỉnh thủ công)" msgid "Keep Smooth curves" -msgstr "Giữ đường cong Mịn" +msgstr "Duy Trì các Đường Cong Mượt Mà" msgid "Export also the curve handles (if available) (this does only work when the inverse parent matrix is the unity matrix, otherwise you may end up with odd results)" -msgstr "Cũng xuất tay cầm đường cong (nếu có) (này chỉ hoạt động khi ma trận phụ huynh đảo nghịch là ma tận dơn vị, nếu không bạn có thể được kết qủa không hợp ý)" +msgstr "Xuất Khẩu cả các tay cầm của đường cong (nếu có) (cái này chỉ làm việc khi ma trận phụ huynh đảo ngược là ma trận của Unity, nếu không, chúng có thể tạo ra những kết quả bất thường)" msgid "Limit Precision" @@ -74276,31 +81389,35 @@ msgstr "Hạn Chế Độ Chính Xác" msgid "Reduce the precision of the exported data to 6 digits" -msgstr "Hạn chế độ chính xác của dữ liệu xuất đến 6 số cái" +msgstr "Hạn chế độ chính xác của dữ liệu xuất khẩu ra dùng 6 số cái mà thôi" msgid "Export to SL/OpenSim" -msgstr "Xuất cho SL/OpenSim" +msgstr "Xuất Khẩu cho Sl/OpenSim" + + +msgid "Compatibility mode for Second Life, OpenSimulator and other compatible online worlds" +msgstr "Chế độ tương thích với Second Life, OpenSimulator và các thế giới trực tuyến tương thích khác" msgid "Export Section" -msgstr "Xuất Phần" +msgstr "Bộ Phận Xuất Khẩu Liệu" msgid "Only for User Interface organization" -msgstr "Chỉ cho tổ chức Giao Diện" +msgstr "Duy dành cho sự bố trí Giao Diện Người Dùng" msgid "Data export section" -msgstr "Phần xuất dữ liệu" +msgstr "Phần xuất khẩu dữ liệu" msgid "Geom" -msgstr "Hình Dạng" +msgstr "Hình Học" msgid "Geometry export section" -msgstr "Phần xuất hình dạng" +msgstr "Phần xuất khẩu hình học" msgid "Arm" @@ -74308,68 +81425,68 @@ msgstr "Cốt" msgid "Armature export section" -msgstr "Phần xuất cốt" +msgstr "Phần xuất khẩu khung cốt" msgid "Anim" -msgstr "Hoạt Hình" +msgstr "Hoạt Họa" msgid "Animation export section" -msgstr "Phần xuất hoạt hình" +msgstr "Phần xuất khẩu hoạt họa" msgid "Extra" -msgstr "Thêm" +msgstr "Bổ Sung" msgid "Collada export section" -msgstr "Phần xuất Collada" +msgstr "Phần xuất khẩu collada" msgid "The distance between 2 keyframes (1 to key every frame)" -msgstr "Khoảng cách giữa hai bức ảnh mẫu (1 cho mỗi bức ảnh làm mẫu)" +msgstr "Khoảng cách giữa hai khung hình (1 để khóa hóa từng khung hình một)" msgid "Export only selected elements" -msgstr "Chỉ xuất phần tử được chọn" +msgstr "Chỉ Xuất Khẩu các yếu tố được chọn mà thôi" msgid "Sort by Object name" -msgstr "Sắp thứ tự bằng tên Vật Thể" +msgstr "Sắp thứ tự theo tên của Đối Tượng" msgid "Sort exported data by Object name" -msgstr "Sắp thứ tự dữ liệu xuất bằng tên Vật Thể" +msgstr "Sắp thứ tự dữ liệu được xuất khẩu ra theo tên của Đối Tượng" msgid "Use Blender Profile" -msgstr "Dùng Mặt Cắt Blender" +msgstr "Sử Dụng Sắp Đặt của Blender" msgid "Export additional Blender specific information (for material, shaders, bones, etc.)" -msgstr "Xuất thông tin thêm đặc biệt về Blender (cho vật liệu, bộ tô sắc, xương, v.v.)" +msgstr "Xuất Khẩu các thông tin bổ sung, đặc trưng của Blender (đối với nguyên vật liệu, bộ tô bóng, xương, v.v.)" msgid "Use Object Instances" -msgstr "Dùng Thực Thể Vật Thể" +msgstr "Sử Dụng các Thực Thể của Đối Tượng" msgid "Instantiate multiple Objects from same Data" -msgstr "Thực thể hóa nhiều Vật Thể từ cùng dữ liệu" +msgstr "Thực thể hóa nhiều Đối Tượng từ cùng một Dữ Liệu" msgid "Copy textures to same folder where the .dae file is exported" -msgstr "Chép chất liệu vào cùng hồ sơ được xuất tập tin .dae" +msgstr "Sao chép các chất liệu vào cùng một thư mục, nơi tập tin .dae được xuất khẩu ra" msgctxt "Operator" msgid "Import COLLADA" -msgstr "Nhập COLLADA" +msgstr "Nhập Khẩu COLLADA" msgid "Load a Collada file" -msgstr "Nhập một tập tin Collada" +msgstr "Nạp một tập tin Collada" msgid "Auto Connect" @@ -74377,143 +81494,151 @@ msgstr "Tự Động Kết Nối" msgid "Set use_connect for parent bones which have exactly one child bone" -msgstr "Đặt use_connect (tự_động_kết_nối) cho xương phụ huynh thì chỉ có một xương con cái" +msgstr "Đặt use_connect (tự động kết nối) cho các xương phụ huynh chỉ có duy nhất một xương con" + + +msgid "Import custom normals, if available (otherwise Blender will compute them)" +msgstr "Nhập Khẩu các pháp tuyến tùy chỉnh, nếu có (nếu không, Blender sẽ tính toán chúng)" msgid "Find Bone Chains" -msgstr "Tìm Chuỗi Xương" +msgstr "Tìm các Dây Chuyền Xương" msgid "Find best matching Bone Chains and ensure bones in chain are connected" -msgstr "Tìm Chuỗi Xương giống nhất và làm chắc các xương trong chuỗi được kết nối" +msgstr "Tìm các Dây Chuyền Xương xứng khớp nhất và đảm bảo rằng các xương trong dây chuyền đều được kết nối" msgid "Fix Leaf Bones" -msgstr "Sửa Xương Lá" +msgstr "Sửa Xương Ngọn" msgid "Fix Orientation of Leaf Bones (Collada does only support Joints)" -msgstr "Sửa Định Hướng của Xương Lá (ColladA chỉ được hỗ trợ Khớp)" +msgstr "Sửa Định Hướng của các Xương Ngọn (Collada chỉ hỗ trợ các Khớp Nối (đầu xương))" msgid "Import Units" -msgstr "Nhập Dơn Vị" +msgstr "Nhập Khẩu Đơn Vị" msgid "If disabled match import to Blender's current Unit settings, otherwise use the settings from the Imported scene" -msgstr "Nếu tắt dùng cài đặt đơn vị Blender hiện tại, nếu không dùng cài đặt từ cảnh Nhập" +msgstr "Nếu tắt thì khớp nhập khẩu với các sắp đặt Đơn Vị hiện tại của Blender, nếu không, dùng các sắp đặt từ cảnh được Nhập Khẩu" msgid "Minimum Chain Length" -msgstr "Bề Dài Chuỗi Ngăn Nhất" +msgstr "Chiều Dài Tối Thiểu của Dây Chuyền" msgid "When searching Bone Chains disregard chains of length below this value" -msgstr "Khi tìm kiếm Chuỗi Xương, không quan tâm chuỗi xương ngăn hơn giá trị này" +msgstr "Khi tìm kiếm các Dây Chuyền Xương, bỏ qua các dây chuyền ngắn hơn giá trị này" msgctxt "Operator" msgid "Context Collection Boolean Set" -msgstr "Sưu Tập Bool Bối Cảnh" +msgstr "Ngữ Cảnh Đặt Giá Trị Bool cho Bộ Sưu Tập" msgid "Set boolean values for a collection of items" -msgstr "Đặt giá trị bool cho một sưu tập mặt hàng" +msgstr "Đặt giá trị bool cho một bộ sưu tập các phần tử" msgid "The data path from each iterable to the value (int or float)" -msgstr "Đường dẫn từ mỗi vật lặp lại đến giá trị (số nguyên hay số thật)" +msgstr "Đường dẫn dữ liệu đến giá trị (số nguyên hay số thực) từ mỗi phần tử khả dĩ tuần hoàn (iterable)" msgid "The data path relative to the context, must point to an iterable" -msgstr "Đường dẫn dữ liệu tương đối với bối cảnh, phải chỉ đến một vật lặp lại" +msgstr "Đường dẫn dữ liệu tương đối với ngữ cảnh, phải hướng đến một phần tử khả dĩ tuần hoàn (iterable)" msgctxt "Operator" msgid "Context Array Cycle" -msgstr "Chu Trình Mảng Bối Cảnh" +msgstr "Ngữ Cảnh Luân Chuyển Mảng" msgid "Set a context array value (useful for cycling the active mesh edit mode)" -msgstr "Đặt một giá trị mảng bối cảnh (có lợi ích cho chu trình chế độ biên tập mạng lưới hoạt động)" +msgstr "Đặt một giá trị mảng ngữ cảnh (có lợi cho việc luân chuyển Chế Độ Biên Soạn của khung lưới đang hoạt động)" msgid "Context Attributes" -msgstr "Đặc Trưng Bối Cảnh" +msgstr "Thuộc Tính của Ngữ Cảnh" msgid "Context data-path (expanded using visible windows in the current .blend file)" -msgstr "Đường dẫn-dữ liệu của bối cảnh (mở rộng trong các cửa sổ trong tập tin .blend hiện tại)" +msgstr "Ngữ cảnh đường dẫn dữ liệu (được mở rộng bằng cách sử dụng các cửa sổ hữu hình trong tập tin .blend hiện tại)" msgid "Cycle backwards" -msgstr "Chu Trình Ngược" +msgstr "Luân Chuyển Ngược Chiều" msgctxt "Operator" msgid "Context Enum Cycle" -msgstr "Chu Trình Liệt Kê Bối Cảnh" +msgstr "Luân Chuyển Ngữ Cảnh Enum" msgid "Toggle a context value" -msgstr "Bật/tắt một giá trị bối cảnh" +msgstr "Đổi một giá trị ngữ cảnh" msgid "Wrap" -msgstr "Gói" +msgstr "Hàm Tuần Hoàn/Đảo Chiều" msgid "Wrap back to the first/last values" -msgstr "Gói lại đến giá trị đầu/cuối" +msgstr "Quay trở lại các giá trị đầu/cuối" msgctxt "Operator" msgid "Context Int Cycle" -msgstr "Chu Trình Lặp Lặi Bối Cảnh" +msgstr "Luân Chuyển Số Nguyên (Int)" + + +msgid "Set a context value (useful for cycling active material, shape keys, groups, etc.)" +msgstr "Đặt giá trị ngữ cảnh (hữu ích để quay vòng nguyên vật liệu đang hoạt động, hình mẫu, nhóm, v.v.)" msgctxt "Operator" msgid "Context Enum Menu" -msgstr "Danh Bạ Liệt Kê Bối Cảnh" +msgstr "Ngữ Cảnh Trình Đơn Enum" msgctxt "Operator" msgid "Context Modal Mouse" -msgstr "Chuột Cách Thức Bối Cảnh" +msgstr "Ngữ Cảnh Chuột Mô Thái" msgid "Adjust arbitrary values with mouse input" -msgstr "Chỉnh giá trị tùy chọn bằng ngõ vào chuột" +msgstr "Chỉnh các giá trị tùy chọn bằng đầu vào của chuột" msgid "Header Text" -msgstr "Văn Bản Phần Đầu" +msgstr "Văn Bản của Tiêu Đề" msgid "Text to display in header during scale" -msgstr "Văn bản cho hiển thị trong phần đầu khi phóng to" +msgstr "Văn bản để hiển thị trên tiêu đề trong khi đổi tỷ lệ" msgid "Scale the mouse movement by this value before applying the delta" -msgstr "Phóng to chuyển động của chuột bằng giá trị này trước áp dụng lệch lạc" +msgstr "Đổi tỷ lệ chuyển động của chuột bằng giá trị này, trước khi áp dụng delta" msgid "Invert the mouse input" -msgstr "Đảo nghịch ngõ vào chuột" +msgstr "Đảo nghịch đầu vào của chuột" msgctxt "Operator" msgid "Context Enum Pie" -msgstr "Quạt Liệt Kê Bối Cảnh" +msgstr "Ngữ Cảnh Enum Hình Rẻ Quạt" msgctxt "Operator" msgid "Context Scale Float" -msgstr "Số Thật Phóng To Bối Cảnh" +msgstr "Ngữ Cảnh Đổi Tỷ Lệ Số Thực" msgid "Scale a float context value" -msgstr "Phóng to một giá trị bối cảnh số thật" +msgstr "Đổi tỷ lệ giá trị của một số float (số thực)" msgid "Assign value" @@ -74522,28 +81647,28 @@ msgstr "Chỉ định giá trị" msgctxt "Operator" msgid "Context Scale Int" -msgstr "Phóng To Bối Cảnh Số Nguyên" +msgstr "Ngữ Cảnh Đổi Tỷ Lệ Số Nguyên" msgid "Scale an int context value" -msgstr "Phóng to một giá trị bối cảnh số nguyên" +msgstr "Đổi tỷ lệ giá trị của một số nguyên (int) theo ngữ cảnh" msgid "Always Step" -msgstr "Lần Nào Bước Tới" +msgstr "Luôn Luôn Làm Tròn" msgid "Always adjust the value by a minimum of 1 when 'value' is not 1.0" -msgstr "Lần nào chỉnh giá trị 1 trở lên khi 'giá trị' không = 1.0" +msgstr "Luôn luôn sửa giá trị thành giá trị tối thiểu 1 khi 'giá trị' khác 1.0" msgctxt "Operator" msgid "Context Set Boolean" -msgstr "Bối Cảnh Đặt Bool" +msgstr "Ngữ Cảnh Đặt Giá Trị Bool" msgid "Set a context value" -msgstr "Đạt Một Giá Trị Bối Cảnh" +msgstr "Đặt một giá trị ngữ cảnh" msgid "Assignment value" @@ -74552,80 +81677,80 @@ msgstr "Giá trị chỉ định" msgctxt "Operator" msgid "Context Set Enum" -msgstr "Bối Cảnh Đặt Liệt Kê" +msgstr "Ngữ Cảnh Đặt Enum" msgid "Assignment value (as a string)" -msgstr "Giá trị chỉ định (xâu)" +msgstr "Giá trị chỉ định (chuỗi ký tự)" msgctxt "Operator" msgid "Context Set Float" -msgstr "Bối Cảnh Đặt Số Thật" +msgstr "Đặt Số Thực" msgid "Apply relative to the current value (delta)" -msgstr "Áp dụng tương đối với giá trị hiện tại (lệch lạc)" +msgstr "Áp dụng tương đối với giá trị hiện tại (delta)" msgctxt "Operator" msgid "Set Library ID" -msgstr "Đặt ID Thư Viện" +msgstr "Đặt ID cho Thư Viện" msgid "Set a context value to an ID data-block" -msgstr "Đặt một giá trị bối cảnh cho một cục dữ liếu ID" +msgstr "Đặt giá trị ngữ cảnh cho một khối dữ liệu ID" msgctxt "Operator" msgid "Context Set" -msgstr "Bối Cảnh Đặt" +msgstr "Ngữ Cảnh Thiết Lập" msgctxt "Operator" msgid "Context Set String" -msgstr "Bối Cảnh Đặt Xâu" +msgstr "Ngữ Cảnh Đặt Chuỗi Ký Tự" msgctxt "Operator" msgid "Context Set Value" -msgstr "Bối Cảnh Đặt Giá Trị" +msgstr "Ngữ Cảnh Đặt Giá Trị" msgctxt "Operator" msgid "Context Toggle" -msgstr "Bối Cảnh Bật/Tắt" +msgstr "Ngữ Cảnh Bật/Tắt" msgid "Optionally override the context with a module" -msgstr "Tùy chọn, vượt quyền cho bối cảnh với một mô đun" +msgstr "Có thể (tùy ý) vượt quyền ngữ cảnh với một mô-đun" msgctxt "Operator" msgid "Context Toggle Values" -msgstr "Bối Cảnh Bật/Tắt Giá Trị" +msgstr "Ngữ Cảnh Bật/Tắt các Giá Trị" msgid "Toggle enum" -msgstr "Bật/Tắt Liệt Kê" +msgstr "Bật/tắt liệt kê (enum)" msgctxt "Operator" msgid "Debug Menu" -msgstr "Danh Bạ Kiểm Tra Sai Lầm" +msgstr "Trình Đơn Hiệu Chỉnh Lỗi" msgid "Open a popup to set the debug level" -msgstr "Mở danh bạ nhảy lên để kiểm tra sai lầm của một trận" +msgstr "Mở trình đơn bật lên để đặt mức độ hiệu chỉnh lỗi" msgid "Debug Value" -msgstr "Giá Trị Kiểm Tra Sai Lầm" +msgstr "Giá Trị Hiệu Chỉnh Lỗi" msgctxt "Operator" msgid "Demo" -msgstr "Ví Dụ" +msgstr "Trình Diễn Giới Thiệu" msgctxt "Operator" @@ -74638,41 +81763,41 @@ msgstr "Trước" msgid "Pause" -msgstr "Tạm Dừng" +msgstr "Tạm Ngưng" msgctxt "Operator" msgid "Demo Mode (Start)" -msgstr "Chế Độ Ví Dụ (Bắt Đầu)" +msgstr "Chế Độ Trình Diễn Giới Thiệu (Bắt Đầu)" msgctxt "Operator" msgid "Demo Mode (Setup)" -msgstr "Chế Độ Ví Dụ (Chuẩn Bị)" +msgstr "Chế Độ Trình Diễn Giới Thiệu (Thiết Lập)" msgid "Create a demo script and optionally execute it" -msgstr "Chế tạo một văn thảo ví dụ và tùy chọn thực hành nó nữa" +msgstr "Kiến Tạo một tập lệnh giới thiệu và thi hành nó tùy theo lựa chọn" msgid "Number of times to play the animation" -msgstr "Số lượng lần cho hát hoạt hình" +msgstr "Số lần chơi hoạt họa" msgid "Render Anim" -msgstr "Kết Xuất Hoạt Hình" +msgstr "Kết Xuất Hoạt Họa" msgid "Render entire animation (render mode only)" -msgstr "Kết Xuất Toàn Bộ Hoạt Hình (chỉ cho chế độ kết xuất)" +msgstr "Kết xuất toàn bộ hoạt họa (chỉ trong chế độ kết xuất mà thôi)" msgid "Screen Switch" -msgstr "Trao Đổi Màn" +msgstr "Chuyển Đổi Màn Hình" msgid "Time between switching screens (in seconds) or 0 to disable" -msgstr "Thời gian giữa đổi màn (giây) hay 0 để tắt" +msgstr "Thời gian trì hoãn giữa các lần chuyển đổi màn hình (trong số giây) hoặc là đặt bằng 0 để tắt đi" msgid "Time Max" @@ -74680,7 +81805,7 @@ msgstr "Thời Gian Tối Đa" msgid "Maximum number of seconds to show the animation for (in case the end frame is very high for no reason)" -msgstr "Số lượng giây chiếu hoạt hình (cho trường hợp số bức ảnh kết thúc rất lớn cho một lý do nào)" +msgstr "Số giây tối đa để hiển thị hoạt họa (trong trường hợp khung hình kết thúc quá cao một cách vô lý)" msgid "Time Min" @@ -74688,15 +81813,15 @@ msgstr "Thời Gian Tối Thiểu" msgid "Minimum number of seconds to show the animation for (for small loops)" -msgstr "Số lượng giây cho chiếu hoạt hình (cho lặp lại nhỏ)" +msgstr "Số giây tối thiểu để hiển thị hoạt họa (dành cho những vòng tuần hoàn nhắc lại nho nhỏ)" msgid "Search Path" -msgstr "Đường Dẫn Tìm Kiếm" +msgstr "Đường Dẫn để Tìm Kiếm" msgid "Directory used for importing the file" -msgstr "Thư mục dùng cho nhập tập tin" +msgstr "Thư mục dùng để nhập khẩu tập tin" msgid "Render Delay" @@ -74704,11 +81829,11 @@ msgstr "Trì Hoãn Kết Xuất" msgid "Time to display the rendered image before moving on (in seconds)" -msgstr "Thời gian để hiển thị ảnh kết xuất trước làm tiếp (đơn vị giây)" +msgstr "Thời gian hiển thị hình ảnh kết xuất trước khi đi tiếp (trong số giây)" msgid "Run once and exit" -msgstr "Chạy một lần và nghỉ" +msgstr "Chạy một lần rồi thoát" msgid "Random Order" @@ -74716,376 +81841,400 @@ msgstr "Thứ Tự Ngẫu Nhiên" msgid "Select files randomly" -msgstr "Chọn tập tin ngẫu nhiên" +msgstr "Chọn các tập tin một cách ngẫu nhiên" msgid "Run Immediately!" -msgstr "Chạy Lập Tức!" +msgstr "Thi Hành Ngay Lập Tức!" msgid "Run demo immediately" -msgstr "Chạy ví dụ lập tức" +msgstr "Thi hành bản giới thiệu ngay lập tức" msgctxt "Operator" msgid "View Documentation" -msgstr "Hiển Thị Tài Liệu" +msgstr "Xem Tài Liệu" msgid "Open online reference docs in a web browser" -msgstr "Mở tài liệu tham chiếu trên mạng trong một trình duyệt" +msgstr "Mở tài liệu tham chiếu trên mạng trong trình duyệt mạng" msgid "Doc ID" -msgstr "ID Tài Liệu" +msgstr "ID của Tài Liệu" msgctxt "Operator" msgid "View Manual" -msgstr "hiển Thị Sách Dẫn" +msgstr "Xem Bản Hướng Dẫn" msgid "Load online manual" -msgstr "Nhập sách dẫn trên mạng" +msgstr "Nạp bản hướng dẫn sử dụng trực tuyến" msgctxt "Operator" msgid "View Online Manual" -msgstr "Xem Sách Dẫn Trên Mạng" +msgstr "Xem Hướng Dẫn Sử Dụng Trực Tuyến" msgid "View a context based online manual in a web browser" -msgstr "Xem một sách dẫn cơ sở bối cảnh trên mạng bằng một trình duyệt" +msgstr "Xem bản hướng dẫn sự dụng trên mạng tùy ngữ cảnh đòi hỏi trong một trình duyệt mạng" msgctxt "Operator" msgid "Handle dropped .blend file" -msgstr "Xử lý tập tin .blend bị rớt" +msgstr "Xử lý tập tin .blend thả vào" msgctxt "Operator" msgid "Export to PDF" -msgstr "Xuất đến PDF" +msgstr "Xuất Khẩu dưới dạng PDF" msgid "Export grease pencil to PDF" -msgstr "Xuất bút sáp đến PDF" +msgstr "Xuất Khẩu bút chì dầu ra PDF" msgid "Which frames to include in the export" -msgstr "Bức ảnh nào để gồm khi xuất" +msgstr "Khung nào để đưa kèm vào xuất khẩu" msgid "Include only active frame" -msgstr "Chỉ gồm bức ảnh hoạt động" +msgstr "Chỉ bao gồm các khung hình đang hoạt động mà thôi" msgid "Include selected frames" -msgstr "Gồm các bức ảnh được chọn" +msgstr "Bao gồm các khung hình đã chọn" msgid "Include all scene frames" -msgstr "Gồm hết bức ảnh của cạnh" +msgstr "Bao gồm toàn bộ các khung hình trong cảnh" msgid "Which objects to include in the export" -msgstr "Vật thể nào để gồm vào xuất" +msgstr "Đối tượng nào để bao gồm trong quá trình xuất khẩu" msgid "Include only the active object" -msgstr "Chỉ vật thể hoạt động" +msgstr "Chỉ bao gồm đối tượng đang hoạt động mà thôi" msgid "Include selected objects" -msgstr "Gồm vật thể được Cchọn" +msgstr "Bao gồm các đối tượng được chọn" msgid "Include all visible objects" -msgstr "Gồm hết vật thể đang hiển thị" +msgstr "Bao gồm toàn bộ các đối tượng nhìn thấy được" msgid "Precision of stroke sampling. Low values mean a more precise result, and zero disables sampling" -msgstr "Độ chính xác cho lấy mẫu nét. Giá trị thấp nghĩa là kết qủa chính xác, và số không nghĩa là tắt lấy mẫu" +msgstr "Độ chính xác của quá trình lấy mẫu nét vẽ. Giá trị thấp có nghĩa là kết quả chính xác hơn, và 0 là không lấy mẫu" msgid "Export strokes with fill enabled" -msgstr "Xuất các nét đã bật tô đầy" +msgstr "Xuất Khẩu các nét vẽ với tính năng tô phủ kín được bật lên" msgid "Export strokes with constant thickness" -msgstr "Xuất các nét có độ dày hằng số" +msgstr "Xuất khẩu các nét vẽ với độ dày bất biến" msgctxt "Operator" msgid "Export to SVG" -msgstr "Xuất vào SVG" +msgstr "Xuất Khẩu thành SVG" msgid "Export grease pencil to SVG" -msgstr "Xuất bút sáp vào SVG" +msgstr "Xuất Khẩu bút chì dầu ra SVG" msgid "Clip Camera" -msgstr "Cắt máy quay phim" +msgstr "Cắt Xén Máy Quay Phim" msgid "Clip drawings to camera size when export in camera view" -msgstr "Cắt đồ vẽ vào khổ của máy quay phim khi xuất trong màn nhìn của máy quay phim" +msgstr "Cắt xén các hình vẽ cho bằng kích thước của máy quay phim khi xuất khẩu trong góc nhìn của máy quay phim" msgid "Import SVG into grease pencil" -msgstr "Nhập SVG vào bút sáp" +msgstr "Nhập khẩu SVG vào thành bút chì dầu" msgid "Resolution of the generated strokes" -msgstr "Độ phân giải cửa nét được chế tạo" +msgstr "Độ phân giải của các nét vẽ sinh tạo" msgid "Scale of the final strokes" -msgstr "Phóng to của nét cuối cùng" +msgstr "Tỷ lệ của các nét vẽ kết thúc" msgctxt "Operator" msgid "Add Theme Preset" -msgstr "Thêm Phong Cách Đặt Sẵn" +msgstr "Thêm Kiểu Mẫu Sắp Đặt Sẵn" msgid "Add or remove a theme preset" -msgstr "Thêm hay xóa một phong cách đặt sẵn" +msgstr "Thêm hay xóa một kiểu mẫu sắp đặt sẵn" msgctxt "Operator" msgid "Add Keyconfig Preset" -msgstr "Thêm Cấu Hình Bàn Phím Đặt Sẵn " +msgstr "Thêm Cấu Hình Phím Sắp Đặt Sẵn" msgid "Add or remove a Key-config Preset" -msgstr "Thêm hay xóa một cấu hình bàn phím đặt sẵn" +msgstr "Thêm hay xóa một Cấu Hình Phím Sắp Đặt Sẵn" msgctxt "Operator" msgid "Reload Library" -msgstr "Nhập Lại Thư Viện" +msgstr "Tái Nạp Thư Viện" msgid "Reload the given library" -msgstr "Nhập lại thư viện được chỉ định" +msgstr "Tái nạp thư viện đã cho" msgid "Library to reload" -msgstr "Thư Viện để nhập lại" +msgstr "Thư viện để nạp lại" msgid "Relocate the given library to one or several others" -msgstr "Di chuyển thư viện đến một hoặc vài thư viện khác" +msgstr "Tái định vị thư viện đã cho từ một hoặc vài nguồn khác" msgid "Library to relocate" -msgstr "Thư viện để di chuyển" +msgstr "Thư viện để tìm lại" msgctxt "Operator" msgid "Link" -msgstr "Liên Kết" +msgstr "Kết Nối" msgid "Link from a Library .blend file" -msgstr "Liên kết từ một tập tin .blend thư viện" +msgstr "Kết nối từ một tập tin Thư Viện .blend" msgctxt "Operator" msgid "Memory Statistics" -msgstr "Thông Ke Bộ Nhớ" +msgstr "Thống Kê về Bộ Nhớ" msgid "Print memory statistics to the console" -msgstr "In thống kê bộ nhớ trong diện điều khiển" +msgstr "In các thống kê về bộ nhớ ra bàn giao tiếp" msgctxt "Operator" msgid "Export Wavefront OBJ" -msgstr "Xuất vật thể OBJ Wavefront" +msgstr "Xuất Khẩu Wavefront OBJ" msgid "Save the scene to a Wavefront OBJ file" -msgstr "Lưu cảnh vào một tập tin OBJ Wavefront" +msgstr "Lưu cảnh ra một tập tin Wavefront OBJ" msgid "Apply modifiers to exported meshes" -msgstr "Áp dụng bộ điều chỉnh với mạng lưới đã xuất" +msgstr "Áp dụng các bộ điều chỉnh vào khung lưới xuất khẩu" msgid "The last frame to be exported" -msgstr "Bức ảnh cuối cùng cho xuất" +msgstr "Khung hình cuối cùng để xuất khẩu" msgid "Export Animation" -msgstr "Xuất Hoạt Hình" +msgstr "Xuất Khẩu Hoạt Họa" msgid "Export multiple frames instead of the current frame only" -msgstr "Xuất nhiều bức ảnh thay thế chỉ xuất bức ảnh hiện tại" +msgstr "Xuất Khẩu nhiều khung hình thay vì chỉ khung hình hiện tại mà thôi" msgid "Export Colors" -msgstr "Xuất Màu" +msgstr "Xuất Khẩu Màu" msgid "Export per-vertex colors" -msgstr "Xuất màu từng đỉnh" +msgstr "Xuất Khẩu Màu của mỗi Điểm Đỉnh" msgid "Export Curves as NURBS" -msgstr "Xuất Đường Cong bằng NURBD" +msgstr "Xuất Khẩu các Đường Cong thành NURBS" msgid "Export curves in parametric form instead of exporting as mesh" -msgstr "Xuật đường cong bằng dạng phương trình thay thế xuất bằng mạng lưới" +msgstr "Xuất khẩu các đường cong ở dạng tham số thay vì xuất khẩu dưới dạng khung lưới" msgid "Object Properties" -msgstr "Đặc Tính Vật Thể" +msgstr "Các Tính Chất của Đối Tượng" msgid "Determines properties like object visibility, modifiers etc., where they differ for Render and Viewport" -msgstr "Định rõ đặc tính như sự hiển thị của vật thể, bộ điều chỉnh, v.v. khi chúng nó khác cho Kết Xuất và Màn Chiếu" +msgstr "Xác định các tính chất như tính hữu hình của đối tượng, của các bộ điều chỉnh, v.v., và sự khác nhau của chúng trong chế độ Kết Xuất và chế độ Cổng Nhìn" msgid "Export objects as they appear in render" -msgstr "Xuất các vật thể giống hiển thị kết xuất" +msgstr "Xuất khẩu các đối tượng như chúng Xuất Khẩu hiện trong kết xuất" msgid "Export objects as they appear in the viewport" -msgstr "Xuất vật thể giống hiển thị trong màn chiếu" +msgstr "Xuất khẩu các đối tượng như chúng Xuất Khẩu hiện trong cổng nhìn" msgid "Export Material Groups" -msgstr "Xuất Nhóm Vật Liệu" +msgstr "Xuất Khẩu các Nhóm Nguyên Vật Liệu" msgid "Generate an OBJ group for each part of a geometry using a different material" -msgstr "Chế tạo một nhóm OBJ cho mỗi bộ phận của một hình dạng bằng dùng một vật liệu khác" +msgstr "Sinh tạo một nhóm OBJ cho mỗi phần của hình học dùng một nguyên vật liệu khác" msgid "Export Materials" -msgstr "Xuất vật liệu" +msgstr "Xuất Khẩu các Nguyên Vật Liệu" msgid "Export MTL library. There must be a Principled-BSDF node for image textures to be exported to the MTL file" -msgstr "Xuất thư Viện MTL. Yêu cầu có một giao điểm BSDF tổng quát để xuất ảnh chất liệu vào tập tin MTL" +msgstr "Xuất khẩu thư viện MTL. Phải có nút Nguyên Tắc-BSDF để chất liệu hình ảnh được xuất khẩu thành tập tin MTL" msgid "Export Normals" -msgstr "Xuất Pháp Tuyến" +msgstr "Xuất Khẩu các Pháp Tuyến" msgid "Export per-face normals if the face is flat-shaded, per-face-per-loop normals if smooth-shaded" -msgstr "Xuất pháp tuyến từng mặt nếu mặt được tô sắc đều, pháp tuyến từng mặt lặp vòng nếu tô sắc mịn" +msgstr "Xuất khẩu các pháp tuyến mỗi Mặt nếu Mặt được tô bóng phẳng bẹt, nếu không, xuất khẩu các pháp tuyến của từng mạch lưới mỗi bề nếu được tô bóng mịn màng" msgid "Export Object Groups" -msgstr "Xuất Nhóm Vật Thể" +msgstr "Xuất Khẩu các Nhóm Đối Tượng" msgid "Append mesh name to object name, separated by a '_'" -msgstr "Kèm tên mạng lưới với tên vật liệu, dùng một '_' làm dấu cách" +msgstr "Bổ sung tên khung lưới vào tên đối tượng, phân cách bằng dấu '_'" + + +msgid "Export Materials with PBR Extensions" +msgstr "Xuất Khẩu Nguyên Vật Liệu với các Mở Rộng PBR" + + +msgid "Export MTL library using PBR extensions (roughness, metallic, sheen, coat, anisotropy, transmission)" +msgstr "Xuất khẩu thư viện MTL bằng cách sử dụng các mở rộng PBR (độ nhám, tính kim loại, độ bóng, lớp tráng, dị hướng, truyền xạ)" msgid "Export Selected Objects" -msgstr "Xuất Vật Thể Được Chọn" +msgstr "Xuất Khẩu các Đối Tượng Lựa Chọn" msgid "Export only selected objects instead of all supported objects" -msgstr "Chỉ xuất các vật thể được chọn thay thế hết vật thể được hỗ trợ" +msgstr "Chỉ Xuất Khẩu các đối tượng đã chọn thay vì toàn bộ các đối tượng được hỗ trợ" msgid "Export Smooth Groups" -msgstr "Xuất Nhóm Mịn" +msgstr "Xuất Khẩu các Nhóm Mịn Màng" msgid "Every smooth-shaded face is assigned group \"1\" and every flat-shaded face \"off\"" -msgstr "Mỗi mặt đã tô sắc mịn được chỉ định vào nhóm \"1\" và mỗi mặt đã tô sắc đều \"tắt\"" +msgstr "Mọi Mặt tô bóng mịn màng sẽ được ấn định nhóm \"1\" và mọi Mặt tô bóng phẳng bẹt là \"tắt\" (off)" msgid "Export Triangulated Mesh" -msgstr "Xuất Mạng Lưới Tam Giác Hóa" +msgstr "Xuất Khẩu Khung Lưới Tam Giác Hóa" msgid "All ngons with four or more vertices will be triangulated. Meshes in the scene will not be affected. Behaves like Triangulate Modifier with ngon-method: \"Beauty\", quad-method: \"Shortest Diagonal\", min vertices: 4" -msgstr "Hết n-giác có bốn đỉnh trở lên sẽ được tam giác hóa. Các mạng lưới trong cảnh sẽ bị ảnh hưởng. Hành vi như Bộ Điều Chỉnh Tam Giác Hóa sử dụng phương pháp n-giác: \"Đẹp\", phương-pháp-tư-giác: \"Đường Chéo Ngắn Nhất\", đỉnh cực tiểu: 4" +msgstr "Toàn bộ các đa giác có bốn đỉnh trở lên sẽ được tam giác hóa. Các khung lưới trong cảnh sẽ không bị ảnh hưởng đến. Hành xử như bộ điều chỉnh Tam Giác Hóa với phương pháp đa giác: \"Làm Đẹp\", phương pháp tứ-giác: \"Đường Chéo Ngắn Nhất\", số điểm đỉnh tối thiểu: 4" msgid "Export Vertex Groups" -msgstr "Xuất Nhóm Đỉnh" +msgstr "Xuất Khẩu các Nhóm Điểm Đỉnh" msgid "Export the name of the vertex group of a face. It is approximated by choosing the vertex group with the most members among the vertices of a face" -msgstr "Xuất tên của nhóm đỉnh của một mặt. Nó được xấp xỉ bởi chọn nhóm đỉnh có số lượng nhiều nhất trong các đỉnh của mặt" +msgstr "Xuất khẩu tên của nhóm điểm đỉnh của một Mặt. Nó được tính xấp xỉ bằng cách chọn nhóm điểm đỉnh có nhiều thành viên nhất trong số các điểm đỉnh của một mặt" msgid "Positive X axis" -msgstr "Trục X dương" +msgstr "Trục X Dương" msgid "Positive Y axis" -msgstr "Trục Y dương" +msgstr "Trục Y Dương" msgid "Positive Z axis" -msgstr "Trục Z dương" +msgstr "Trục Z Dương" msgid "Negative X axis" -msgstr "Trục X âm" +msgstr "Trục X Âm" msgid "Negative Y axis" -msgstr "Trục Y âm" +msgstr "Trục Y Âm" msgid "Negative Z axis" -msgstr "Trục Z âm" +msgstr "Trục Z Âm" msgid "Write relative paths where possible" -msgstr "Lưu đường dẫn tương đối khi có thể" +msgstr "Luôn luôn viết đường dẫn tương đối khi có thể" msgid "Write filename only" -msgstr "Chỉ ghi tên tập tin" +msgstr "Chỉ viết tên của tập tin mà thôi" msgid "Copy the file to the destination path" -msgstr "Chép tập tin vào đường dẫn đích" +msgstr "Sao chép tập tin vào đường dẫn đích" msgid "Generate Bitflags for Smooth Groups" -msgstr "Chế tạo Cờ Bit Mịn cho Nhóm Mịn" +msgstr "Tạo các cờ hiệu bit cho các Nhóm Mịn Màng" msgid "The first frame to be exported" -msgstr "Bức ảnh đầu tiên để kết xuất" +msgstr "Khung hình đầu tiên sẽ được xuất khẩu" msgctxt "Operator" msgid "Import Wavefront OBJ" -msgstr "Xuất OBJ Wavefront" +msgstr "Nhập khẩu Wavefront OBJ" msgid "Load a Wavefront OBJ scene" -msgstr "Nhập một cảnh OBJ Wavefront" +msgstr "Nạp một Cảnh của Wavefront OBJ" msgid "Clamp Bounding Box" -msgstr "Kẹp Lại Hộp Bao Quanh" +msgstr "Hạn Định Khung Hộp Viền" msgid "Resize the objects to keep bounding box under this value. Value 0 disables clamping" -msgstr "Đổi cỡ thước vật thể cho giữ hộp bao Quang nhỏ hơn giá trị này. Đặc = 0 để tắt kẹp lại" +msgstr "Thay đổi kích thước các đối tượng để hạn định khung viền hình hộp dưới giá trị này. Giá trị 0 sẽ tắt hạn định" msgid "Import OBJ groups as vertex groups" -msgstr "Nhập nhóm OBJ thành nhóm đỉnh" +msgstr "Nhập Khẩu các nhóm OBJ như các nhóm điểm đỉnh" + + +msgid "Split By Group" +msgstr "Tách Phân theo Nhóm" + + +msgid "Import each OBJ 'g' as a separate object" +msgstr "Nhập khẩu từng OBJ 'g' thành một đối tượng riêng biệt" + + +msgid "Split By Object" +msgstr "Tách Phân theo Đối Tượng" + + +msgid "Import each OBJ 'o' as a separate object" +msgstr "Nhập khẩu từng OBJ 'o' thành một đối tượng riêng biệt" msgctxt "Operator" @@ -75098,15 +82247,15 @@ msgstr "Mở một tập tin Blender" msgid "Display File Selector" -msgstr "Hiển Thị Đồ Lựa Chọn Tập Tin" +msgstr "Hiển Thị Trình Lựa Chọn Tập Tin" msgid "Load UI" -msgstr "Nhập Giao Diện" +msgstr "Nạp Giao Diện" msgid "Load user interface setup in the .blend file" -msgstr "Nhập cài đặt giao diện người dùng trong tập tin .blend" +msgstr "Nạp sắp đặt về giao diện người dùng trong tập tin .blend" msgid "State" @@ -75114,271 +82263,331 @@ msgstr "Trạng Thái" msgid "Trusted Source" -msgstr "Nguồn Tin Tưởng" +msgstr "Nguồn Đáng Tin Cậy" msgid "Allow .blend file to execute scripts automatically, default available from system preferences" -msgstr "Cho tập tin .blend thực hành văn thảo tự động, mặc định từ tùy chọn của hệ thống" +msgstr "Cho phép tập tin .blend thi hành tập lệnh tự động. Sắp đặt mặc định nằm trong cài đặt sở thích của hệ thống" msgctxt "Operator" msgid "Operator Cheat Sheet" -msgstr "Bảng Ăn Gian Thao Tác" +msgstr "Bảng Liệt Kê các Thao Tác" msgid "List all the operators in a text-block, useful for scripting" -msgstr "Làm danh sách có hết thao tác trong một cục văn bản, tốt cho soạn văn thảo" +msgstr "Liệt kê toàn bộ các thao tác trong khối văn bản, có lợi cho việc biên soạn tập lệnh" msgctxt "Operator" msgid "Restore Operator Defaults" -msgstr "Hoàn Lại Mặc Định Thao Tác" +msgstr "Hoàn Lại về các Mặc Định của Thao Tác" msgid "Set the active operator to its default values" -msgstr "Đặt lại thao tác hoạt động có giá trị mặc định" +msgstr "Hoàn lại các giá trị của thao của (operator) đang hoạt động về sắp đặt mặc định" msgctxt "Operator" msgid "Operator Enum Pie" -msgstr "Quạt Liệt Kê Thao Tác" +msgstr "Thao Tác: Trình Đơn Rẻ Quạt" + + +msgid "Operator name (in Python as string)" +msgstr "Tên thao tác (trong Python dưới dạng chuỗi ký tự)" msgid "Property name (as a string)" -msgstr "Tên đặc tính (là xâu)" +msgstr "Tên tính chất (là một chuỗi ký tự)" msgctxt "Operator" msgid "Operator Preset" -msgstr "Thao Tác Đặt Sẵn" +msgstr "Sắp Đặt Sẵn của Thao Tác" msgid "Add or remove an Operator Preset" -msgstr "Thêm hay xóa một Thao Tác Đặt Sẵn" +msgstr "Thêm hay xóa một sắp đặt sẵn của Thao Tác" + + +msgid "Disable add-on for workspace" +msgstr "Tắt trình bổ sung cho không gian làm việc" msgid "UI Tag" -msgstr "Nhãn Giao Diện" +msgstr "Nhãn UI" + + +msgid "Enable add-on for workspace" +msgstr "Bật trình bổ sung cho không gian làm việc" msgid "Open a path in a file browser" -msgstr "Mở một đường dẫn trong một trình duyệt tập tin" +msgstr "Mở đường dẫn trong trình duyệt tập tin" msgctxt "Operator" msgid "Export PLY" -msgstr "Xuất PLY" +msgstr "Xuất Khẩu PLY" + + +msgid "Save the scene to a PLY file" +msgstr "Lưu cảnh ra một tập tin PLY" + + +msgid "ASCII Format" +msgstr "Định dạng ASCII" + + +msgid "Export file in ASCII format, export as binary otherwise" +msgstr "Xuất Khẩu tập tin dùng định dạng ASCII, nếu không xuất khẩu ở dạng nhị phân" + + +msgid "Export Vertex Colors" +msgstr "Xuất Khẩu Màu Điểm Đỉnh" + + +msgid "Do not import/export color attributes" +msgstr "Không nhập/xuất khẩu thuộc tính màu" + + +msgid "Vertex colors in the file are in sRGB color space" +msgstr "Màu điểm đỉnh trong tập tin là nằm trong không gian màu sRGB cơ mà" + + +msgid "Vertex colors in the file are in linear color space" +msgstr "Màu điểm đỉnh trong tập tin là nằm trong không gian màu tuyến tính cơ mà" + + +msgid "Export Vertex Normals" +msgstr "Xuất Khẩu các Pháp Tuyến Điểm Đỉnh" + + +msgid "Export specific vertex normals if available, export calculated normals otherwise" +msgstr "Xuất khẩu các pháp tuyến điểm đỉnh cụ thể nếu có, xuất khẩu các pháp tuyến đã được tính toán nếu không" msgctxt "Operator" msgid "Import PLY" -msgstr "Nhập PLY" +msgstr "Nhập Khẩu PLY" + + +msgid "Import an PLY file as an object" +msgstr "Nhập khẩu tập tin PLY như một đối tượng" + + +msgid "Merges vertices by distance" +msgstr "Hợp nhất các điểm đỉnh theo khoảng cách" msgctxt "Operator" msgid "Batch-Clear Previews" -msgstr "Xóa Dự Khán Sỉ" +msgstr "Xóa Đồng Loạt các Xem Trước" msgid "Clear selected .blend file's previews" -msgstr "Xóa các dự khán của tập tin .blend được chọn" +msgstr "Xóa các xem trước của tập tin .blend được chọn" msgid "Save Backups" -msgstr "Lưu Dự Phòng" +msgstr "Lưu Bản Dự Phòng" msgid "Keep a backup (.blend1) version of the files when saving with cleared previews" -msgstr "Giữ một phiên bản dự phòng (.blend1) của tập tin khi lưu có dự khán bị xóa" +msgstr "Giữ một phiên bản dự phòng (.blend1) của tập tin khi lưu với các xem trước bị xóa đi" msgid "Clear collections' previews" -msgstr "Xóa dự khán của các sưu tập" +msgstr "Xóa những xem trước của các bộ sưu tập" msgid "Materials & Textures" -msgstr "Vật Liệu & Chất Liệu" +msgstr "Nguyên Vật Liệu & Chất Liệu" msgid "Clear 'internal' previews (materials, textures, images, etc.)" -msgstr "Xóa dự khán 'nội bộ'(vật liệu, chất liệu, ảnh, v.v.)" +msgstr "Xóa các xem trước 'nội bộ' (nguyên vật liệu, chất liệu, hình ảnh, v.v.)" msgid "Clear objects' previews" -msgstr "Xóa dự khán vật thể" +msgstr "Xóa các xem trước của đối tượng" msgid "Clear scenes' previews" -msgstr "Xóa dự khán cảnh" +msgstr "Xóa các xem trước của cảnh" msgid "Trusted Blend Files" -msgstr "Tập Tin Blender Tin Tưởng" +msgstr "Tập Tin Blender Đáng Tin Cậy" + + +msgid "Enable Python evaluation for selected files" +msgstr "Bật tính toán Python cho các tập tin đã chọn" msgctxt "Operator" msgid "Batch-Generate Previews" -msgstr "Phát Ra Dự Khán Sỉ" +msgstr "Sinh Tạo các Xem Trước Đồng Loạt" msgid "Generate selected .blend file's previews" -msgstr "Phát ra dự khán cho tập tin .blend được chọn" +msgstr "Tạo các xem trước cho tập tin .blend được chọn" msgid "Root path of all files listed in `files` collection" -msgstr "Đường rễ của tất cả tập tin có danh trong sưu tập `tập tin`" +msgstr "Đường dẫn gốc của toàn bộ các tập tin được liệt kê trong bộ sưu tập các 'tập tin'" msgid "Collection of file paths with common `directory` root" -msgstr "Sưu tập của các đường tập tin cùng rễ `thư mục`" +msgstr "Bộ sưu tập các đường dẫn tập tin có cùng một 'thư mục' gốc" msgid "Show Blender files in the File Browser" -msgstr "Hiện các tập tin Blender trong Trình Duyệt Tập Tin" +msgstr "Biểu hiện tập tin Blender trong Trình Duyệt Tập Tin" msgid "Show folders in the File Browser" -msgstr "Hiện hồ sơ trong Trình Duyệt Tập Tin" +msgstr "Hiển thị các thư mục trong Trình Duyệt Tập Tin" msgid "Keep a backup (.blend1) version of the files when saving with generated previews" -msgstr "Giữ một phiên bản dự phòng (.blend1) của tập tin khi lưu có dự khán được chế tạo" +msgstr "Giữ một phiên bản dự phòng (.blend1) của các tập tin khi lưu, với các xem trước được sinh tạo" msgid "Generate collections' previews" -msgstr "Chế tạo dự khán của các sưu tập" +msgstr "Tạo xem trước của các bộ sưu tập" msgid "Generate 'internal' previews (materials, textures, images, etc.)" -msgstr "Chế tạo dự khán 'nội bộ' (vật liệu, chất liệu, ảnh, v.v.)" +msgstr "Tạo xem trước 'nội bộ' (nguyên vật liệu, chất liệu, hình ảnh, v.v.)" msgid "Generate objects' previews" -msgstr "Chế tạo dự khán của các vật thể" +msgstr "Tạo xem trước đối tượng" msgid "Generate scenes' previews" -msgstr "Chế tạo dự khán của các cảnh" +msgstr "Tạo xem trước cảnh" msgctxt "Operator" msgid "Clear Data-Block Previews" -msgstr "Xóa Dự Khán Cục Dữ Liệu" +msgstr "Xóa Xem Trước Khối Dữ Liệu" msgid "Clear data-block previews (only for some types like objects, materials, textures, etc.)" -msgstr "Xóa dự khán cục dữ liệu (chỉ cho vài loài như vật thể, vật liệu, chất liệu. v.v.)" +msgstr "Xóa những xem trước khối dữ liệu (chỉ dành cho một số thể loại như đối tượng, nguyên vật liệu, chất liệu, v.v. mà thôi)" msgid "Data-Block Type" -msgstr "Kiểu Cục Dữ Liệu" +msgstr "Kiểu Khối Dữ Liệu" msgid "Which data-block previews to clear" -msgstr "Xóa dự khán nào của cục dữ liệu" +msgstr "Những xem trước khối dữ liệu nào sẽ phải xóa đi" msgid "All Types" -msgstr "Hết Loại" +msgstr "Toàn Bộ các Thể Loại" msgid "All Geometry Types" -msgstr "Tất Cả Loại Hình Dạng" +msgstr "Toàn Bộ các Kiểu Hình Học" msgid "Clear previews for scenes, collections and objects" -msgstr "Xóa dự khán cho cảnh, sưu tập, và vật thể" +msgstr "Xóa sạch các xem trước về cảnh, bộ sưu tập và đối tượng" msgid "All Shading Types" -msgstr "Tất Cả Loạt Tô Sắc" +msgstr "Toàn Bộ các Kiểu Tô Bóng" msgid "Clear previews for materials, lights, worlds, textures and images" -msgstr "Xóa các dự khán cho các vật liệu, đèn, thế giới, chất liệu và ảnh" +msgstr "Xóa các xem trước về nguyên vật liệu, nguồn sáng, thế giới, chất liệu và các hình ảnh" msgctxt "Operator" msgid "Refresh Data-Block Previews" -msgstr "Vẽ Lại Dự Khán Cục Dữ Liệu" +msgstr "Làm Tươi Lại Xem Trước về Khối Dữ Liệu" msgid "Ensure data-block previews are available and up-to-date (to be saved in .blend file, only for some types like materials, textures, etc.)" -msgstr "Làm chắc dự khán cục dữ liệu có thể dùng và được nâng cấp (lưu trong tập .blend, chỉ cho vài kiểu như vật liệu, chất liệu, v.v.)" +msgstr "Đảm bảo các trường hợp xem trước dữ liệu là sẵn có để sử dụng và được cập nhật với những thay đổi mới nhất (sẽ được lưu trong tập tin .blend, song chỉ dành cho một số thể loại như nguyên vật liệu, chất liệu, v.v. mà thôi)" msgctxt "Operator" msgid "Add Property" -msgstr "Thêm Đặc Tính" +msgstr "Thêm Tính Chất" msgid "Add your own property to the data-block" -msgstr "Thêm một đặc tính của bạn vào cục dữ liệu" +msgstr "Cho thêm tính chất của riêng mình vào khối dữ liệu" msgid "Property Edit" -msgstr "Biên Tập Đặc Tính" +msgstr "Biên Soạn Tính Chất" msgid "Property data_path edit" -msgstr "Biên tập data_path (đường_dẫn_dữ_liệu) đặc tính" +msgstr "Biên soạn data_path (đường_dẫn_dữ_liệu) tính chất" msgid "Jump to a different tab inside the properties editor" -msgstr "Nhảy đến nhãn khác trong trình biên soạn đặc tính" +msgstr "Nhảy đến một mục khác trong trình biên soạn tính chất" msgid "Context" -msgstr "Bối Cảnh" +msgstr "Ngữ Cảnh" msgctxt "Operator" msgid "Edit Property" -msgstr "Biên Tập Đặc Tính" +msgstr "Biên Soạn Tính Chất" msgid "Change a custom property's type, or adjust how it is displayed in the interface" -msgstr "Đổi loại của một đặc tính tùy chọn, hoặc chỉnh kiểu được hiển thị trong giao diện" +msgstr "Đổi thể loại thuộc tính tùy chỉnh, hoặc điều chỉnh diện mạo hiển thị trong giao diện" msgid "Array Length" -msgstr "Độ Dài Mảng" +msgstr "Chiều Dài Mảng" msgid "Python value for unsupported custom property types" -msgstr "Giá trị Python cho loại đặc tính tùy chọn không được hỗ trợ" +msgstr "Giá trị Python cho các thể loại thuộc tính tùy chỉnh chưa được hỗ trợ" msgid "Library Overridable" -msgstr "Có Thể Vượt Quyền Bằng Thư Viện" +msgstr "Thư Viện Có Thể Vượt Quyền" msgid "Allow the property to be overridden when the data-block is linked" -msgstr "Cho vượt quyền cho đặc tính khi cục dữ liệu được liên kết" +msgstr "Cho phép vượt quyền tính chất khi khối dữ liệu đã được kết nối" msgid "Property Name" -msgstr "Tên Đặc Tính" +msgstr "Tên Tính Chất" msgid "Property name edit" -msgstr "Biên tập tên đặc tính" +msgstr "Biên soạn tên tính chất" msgid "A single floating-point value" -msgstr "Một cái giá trị số thật dấu phẩy động" +msgstr "Một đơn giá trị số thực" msgid "Float Array" -msgstr "Mảng Số Dấu Phẩy Động" +msgstr "Mảng Số Thực" msgid "An array of floating-point values" -msgstr "Một mảng số thật dấu phẩy động" +msgstr "Một mảng các giá trị số thực" msgid "A single integer" -msgstr "Một cái số nguyên" +msgstr "Một đơn số nguyên" msgid "Integer Array" @@ -75386,19 +82595,43 @@ msgstr "Mảng Số Nguyên" msgid "An array of integers" -msgstr "Một mảng số nguyên" +msgstr "Một mảng các số nguyên" + + +msgid "A true or false value" +msgstr "Một giá trị đúng hoặc sai" + + +msgid "Boolean Array" +msgstr "Mảng Bool" + + +msgid "An array of true or false values" +msgstr "Một mảng các giá trị đúng hoặc sai" msgid "A string value" -msgstr "Một cái giá trị xâu" +msgstr "Một giá trị chuỗi văn bản (dòng chữ)" + + +msgid "Data-Block" +msgstr "Khối Dữ Liệu" + + +msgid "A data-block value" +msgstr "Giá trị khối dữ liệu" + + +msgid "Edit a Python value directly, for unsupported property types" +msgstr "Chỉnh sửa trực tiếp giá trị Python cho các thể loại tính chất chưa được hỗ trợ" msgid "Soft Max" -msgstr "Cực Đại Mềm" +msgstr "Tối Đa Mềm" msgid "Soft Min" -msgstr "Cực Tiểu Mềm" +msgstr "Tối Thiểu Mềm" msgid "Soft Limits" @@ -75406,29 +82639,29 @@ msgstr "Giới Hạn Mềm" msgid "Limits the Property Value slider to a range, values outside the range must be inputted numerically" -msgstr "Hạn chế trơn trượt Giá Trị Đặc Tính vào một phạm vi, bạn phải tự gõ giá trị ờ ngoài phạm vi này" +msgstr "Đặt khoảng giới hạn thanh trượt của Giá Trị Tính Chất trong một phạm vi nhất định. Các giá trị nằm ngoài phạm vi này nhất định phải được điền vào một cách thủ công" msgctxt "Operator" msgid "Edit Property Value" -msgstr "Biên Tập Giá Trí Đặc Tính" +msgstr "Biên Soạn Giá Trị của Tính Chất" msgid "Edit the value of a custom property" -msgstr "Biên tập giá trị của một đặc tính tùy chọn" +msgstr "Biên soạn giá trị của tính chất tùy chỉnh" msgid "Value for custom property types that can only be edited as a Python expression" -msgstr "Vị trí cho các loại đặc tính tùy chọn chỉ được biên tập như một biểu thức Python" +msgstr "Giá trị cho các thể loại tính chất tùy chỉnh chỉ có thể được biên soạn dưới dạng biểu thức Python mà thôi" msgctxt "Operator" msgid "Remove Property" -msgstr "Xoá Đặc Tính" +msgstr "Xóa Tính Chất" msgid "Internal use (edit a property data_path)" -msgstr "Dùng nội bộ (biên tập một data_path (đường_dẫn_dữ_liệu) đặc tính)" +msgstr "Sử dụng nội bộ (biên soạn một data_path (đường_dẫn_dữ_liệu) của tính chất)" msgctxt "Operator" @@ -75442,75 +82675,75 @@ msgstr "Thoát Blender" msgctxt "Operator" msgid "Radial Control" -msgstr "Điều Khiển Bán Kính Tuyến" +msgstr "Điều Khiển Tỏa Tròn" msgid "Set some size property (e.g. brush size) with mouse wheel" -msgstr "Đặt đặc tính kích cỡ nào (ví dụ kích cỡ bút lông) bằng nút cuộn" +msgstr "Đặt một tính chất kích thước nào đó (ví dụ: kích thước đầu bút) với bánh xe chuột" msgid "Color Path" -msgstr "Đường Dẫn Màu" +msgstr "Đường Dẫn của Màu Sắc" msgid "Path of property used to set the color of the control" -msgstr "Đường dẫn của đặc tính để đặt màu của đồ điều khiển" +msgstr "Đường dẫn đến tính chất dùng để đặt màu sắc cho bộ điều khiển" msgid "Primary Data Path" -msgstr "Đường Dẫn Dữ Liệu Chánh" +msgstr "Đường Dẫn Dữ Liệu Chủ Yếu" msgid "Primary path of property to be set by the radial control" -msgstr "Đường dẫn chánh của đặc tính để đặt bằng đồ điều khiển bán kính tuyến" +msgstr "Đường dẫn chính đến tính chất được đặt bằng điều khiển tỏa tròn" msgid "Secondary Data Path" -msgstr "Đường Dẫn Dữ Liệu Phụ" +msgstr "Đường Dẫn Dữ Liệu Thứ Yếu" msgid "Secondary path of property to be set by the radial control" -msgstr "Đường dẫn phụ của đặc tính để đặt bằng đồ điều khiển bán kính tuyến" +msgstr "Đường dẫn thứ yếu đến tính chất được đặt bằng điều khiển tỏa tròn" msgid "Fill Color Override Path" -msgstr "Đường Dẫn Màu Tô Tràn Vượt Quyền" +msgstr "Đường Dẫn Thay Thế của Màu Tô" msgid "Fill Color Override Test" -msgstr "Thử Màu Tô Tràn Vượt Quyền" +msgstr "Thí Điểm Thay Thế Màu Tô" msgid "Fill Color Path" -msgstr "Đường Dẫn Tô Tràn Màu" +msgstr "Đường Dẫn của Màu Tô" msgid "Path of property used to set the fill color of the control" -msgstr "Đường dẫn của đặc tính để đặt màu tô của đồ điều khiển" +msgstr "Đường dẫn đến tính chất dùng để đặt màu tô của bộ điều khiển" msgid "Image ID" -msgstr "ID Ảnh" +msgstr "ID cho Hình Ảnh" msgid "Path of ID that is used to generate an image for the control" -msgstr "Đường dẫn của ID được dùng để chế tạo một ảnh cho đồ điều khiển" +msgstr "Đường dẫn đến ID dùng để sinh tạo một hình ảnh cho bộ điều khiển" msgid "Confirm On Release" -msgstr "Xác Nhận Khi Thả" +msgstr "Chấp Thuận Khi Thả Ra" msgid "Finish operation on key release" -msgstr "Kết thúc thao tác khi thả phím" +msgstr "Kết thúc thao tác khi thả phím ra" msgid "Rotation Path" -msgstr "Đường Dẫn Xoay" +msgstr "Đường Dẫn đến Xoay Chiều" msgid "Path of property used to rotate the texture display" -msgstr "Đường dẫn của đặc tính để xoay màn chiếu chất liệu" +msgstr "Đường dẫn đến tính chất dùng để xoay chiều hiển thị của chất liệu" msgid "Secondary Texture" @@ -75518,94 +82751,102 @@ msgstr "Chất Liệu Phụ" msgid "Tweak brush secondary/mask texture" -msgstr "Chỉnh chất liệu phụ/mặt nạ bút lông" +msgstr "Hiệu chỉnh chất liệu phụ/màn chắn lọc của đầu bút" msgid "Use Secondary" -msgstr "Dùng Phụ" +msgstr "Dùng Cái Phụ" msgid "Path of property to select between the primary and secondary data paths" -msgstr "Đường dẫn của đặc tính để chọn từ đường dẫn chánh hay phụ" +msgstr "Đường dẫn đến tính chất để lựa chọn giữa các đường dẫn chính và phụ" msgid "Zoom Path" -msgstr "Đường Dẫn Phóng" +msgstr "Đường Dẫn cho Thu-Phóng" msgid "Path of property used to set the zoom level for the control" -msgstr "Đường dẫn của đặc tính để đặt phóng của đồ điều khiển" +msgstr "Đường dẫn đến tính chất sử dụng để đặt độ thu-phóng của bộ điều khiển" msgctxt "Operator" msgid "Load Factory Settings" -msgstr "Nhập Cài Đặt Mặc Định" +msgstr "Nạp Sắp Đặt của Xưởng Sản Xuất" msgid "Load factory default startup file and preferences. To make changes permanent, use \"Save Startup File\" and \"Save Preferences\"" -msgstr "Nhập tập tin khởi động và tùy chọn mặc định. Để làm sự thay đổi vĩnh cửu, sử dụng \"Lưu Tập Tin Khởi Động\" và \"Lưu Tùy Chọn\"" +msgstr "Nạp tập tin khởi động mặc định của nhà sản xuất và các cài đặt sở thích. Sử dụng \"Lưu Tập Tin Khởi Động\" and \"Lưu các Cài Đặt Sở Thích\" để ấn định vĩnh viễn các thay đổi" + + +msgid "Factory Startup App-Template Only" +msgstr "Duy Mẫu Ứng Dụng Khởi Động của Xưởng Sản Xuất" msgctxt "Operator" msgid "Load Factory Preferences" -msgstr "Nhập Tùy Chọn Mặc Định" +msgstr "Nạp Cài Đặt Sở Thích của Xưởng Sản Xuất" msgid "Load factory default preferences. To make changes to preferences permanent, use \"Save Preferences\"" -msgstr "Nhập tùy chọn mặc định. Để làm sự thay đổi vĩnh cửu, sử dụng \"Lưu Tùy Chọn\"" +msgstr "Nạp các cài đặt sở thích mặc định của nhà sản xuất. Sử dụng \"Lưu các Cài Đặt Sở Thích\" để ấn định vĩnh viễn các thay đổi trong cài đặt sở thích" msgctxt "Operator" msgid "Reload History File" -msgstr "Nhập Lại Tập Tin Lịch Sử" +msgstr "Tái Nạp Tập Tin Lịch Sử" msgid "Reloads history and bookmarks" -msgstr "Nhập lại lịch sử và dấu sách" +msgstr "Đọc lại lịch sử và các dấu trang" msgctxt "Operator" msgid "Reload Start-Up File" -msgstr "Nhập Lại Tập Tin Khởi Động" +msgstr "Đọc Lại Tập Tin Khởi Động" + + +msgid "Open the default file" +msgstr "Mở tập tin mặc định" msgid "Path to an alternative start-up file" -msgstr "Đường dẫn đến tập tin khởi động thay phiên" +msgstr "Đường dẫn đến tập tin khởi động khác" msgid "Load user interface setup from the .blend file" -msgstr "Nhập cài đặt giao diện người dùng từ tập tin .blend" +msgstr "Nạp sắp đặt về giao diện người dùng từ tập tin .blend" msgid "Factory Startup" -msgstr "Khởi Động Nhà Máy" +msgstr "Khởi Động với Sắp Đặt của Xưởng Sản Xuất" msgctxt "Operator" msgid "Load Preferences" -msgstr "Nhập Tùy Chọn" +msgstr "Nạp Cài Đặt Sở Thích" msgid "Load last saved preferences" -msgstr "Nhập tùy chọn được lưu lần cuối cùng" +msgstr "Nạp các cài đặt sở thích đã lưu trước đây" msgctxt "Operator" msgid "Recover Auto Save" -msgstr "Tự Động Lưu Hồi Phục" +msgstr "Hồi Phục dùng Bản Tự Động Lưu" msgid "Open an automatically saved file to recover it" -msgstr "Tự động mở tập tin đã lưu để hồi phục nó" +msgstr "Mở tập tin đã lưu tự động để hồi phục nó" msgctxt "Operator" msgid "Recover Last Session" -msgstr "Lấy Lại Phiên Chạy Cuối" +msgstr "Hồi Phục Phiên Trước Đây" msgid "Open the last closed file (\"quit.blend\")" -msgstr "Mở tập tin đóng cuối (\"quit.blend\")" +msgstr "Mở tập tin đã đóng trước đây (\"quit.blend\")" msgctxt "Operator" @@ -75614,7 +82855,7 @@ msgstr "Vẽ Lại Đồng Hồ" msgid "Simple redraw timer to test the speed of updating the interface" -msgstr "Đồng hồ vẽ lại đơn giản cho thử tốc độ nâng cấp giao diện" +msgstr "Vẽ lại đồng hồ đơn giản để thử tốc độ cập nhật giao diện" msgid "Number of times to redraw" @@ -75626,23 +82867,23 @@ msgstr "Thời Hạn" msgid "Seconds to run the test for (override iterations)" -msgstr "Giây cho chạy xét nghiệm (vượt quyền cho lặp lặi)" +msgstr "Số giây để chạy thử nghiệm (thay thế số lần lặp lại)" msgid "Draw Region" -msgstr "Vùng Vẽ" +msgstr "Vẽ Vùng" msgid "Draw region" -msgstr "Vùng vẽ" +msgstr "Vẽ vùng" msgid "Draw Region & Swap" -msgstr "Vùng Vẽ & Trao Đổi" +msgstr "Vẽ Vùng & Tráo Đổi" msgid "Draw region and swap" -msgstr "Vẽ vùng và trao đổi" +msgstr "Vẽ vùng và tráo đổi" msgid "Draw Window" @@ -75654,52 +82895,52 @@ msgstr "Vẽ cửa sổ" msgid "Draw Window & Swap" -msgstr "Vẽ Cửa Sô & Trao Đổi" +msgstr "Vẽ Cửa Sổ & Tráo Đổi" msgid "Draw window and swap" -msgstr "Vẽ cửa sổ và trao đổi" +msgstr "Vẽ cửa sổ và tráo đổi" msgid "Animation Step" -msgstr "Bước Hoạt Hình" +msgstr "Bước Hoạt Họa" msgid "Animation steps" -msgstr "Bước hoạt hình" +msgstr "Các bước hoạt họa" msgid "Animation Play" -msgstr "Hát Hoạt Hình" +msgstr "Chơi Hoạt Họa" msgid "Animation playback" -msgstr "Hát lại hoạt hình" +msgstr "Chơi lại hoạt họa" msgid "Undo/Redo" -msgstr "Hủy Bước/Làm Lại" +msgstr "Hoàn Tác/Tái Thực Hiện" msgid "Undo and redo" -msgstr "Hủy bước và làm lại" +msgstr "Hoàn tác và tái thực hiện" msgctxt "Operator" msgid "Revert" -msgstr "Hoàn Nguyên" +msgstr "Trở Lại" msgid "Reload the saved file" -msgstr "Nhập lại tập tin đã lưu" +msgstr "Tái nạp tập tin đã lưu" msgid "Save the current file in the desired location" -msgstr "Lưu tập tin hiện tại ở chỗ được chọn" +msgstr "Lưu tập tin hiện tại vào vị trí mong muốn" msgid "Write compressed .blend file" -msgstr "Lưu tập tin .blend nén" +msgstr "Ghi tập tin .blend được nén" msgid "Save Copy" @@ -75707,24 +82948,24 @@ msgstr "Lưu Bản Sao" msgid "Save a copy of the actual working state but does not make saved file active" -msgstr "Lưu một bản sao của trạng thái công việc mà không cho tập tin lưu thành hoạt động" +msgstr "Lưu một bản sao của trạng thái làm việc, song không làm cho tập tin đã lưu hoạt động" msgid "Remap Relative" -msgstr "Ánh Xạ Lại Tướng Đối" +msgstr "Tái Ánh Xạ Tương Đối" msgid "Remap relative paths when saving to a different directory" -msgstr "Ánh xạ lại đường dẫn tương đối khi lưu trong một thư mục khác" +msgstr "Bố trí lại các đường dẫn tương đối khi lưu sang một thư mục khác" msgctxt "Operator" msgid "Save Startup File" -msgstr "Lưu Tập Tin Khởi Đầu" +msgstr "Lưu Tập Tin Khởi Động" msgid "Make the current file the default .blend file" -msgstr "Đặt tập tin hiện tại là tập tin .blend mặc định" +msgstr "Đặt tập tin hiện tại làm tập tin .blend mặc định" msgctxt "Operator" @@ -75737,67 +82978,96 @@ msgstr "Lưu tập tin Blender hiện tại" msgid "Exit Blender after saving" -msgstr "Thoát Blender sau lưu" +msgstr "Thoát Blender sau khi lưu" + + +msgid "Save the current Blender file with a numerically incremented name that does not overwrite any existing files" +msgstr "Lưu tập tin Blender hiện tại với tên có số tịnh tiến để ngăn việc viết đè lên bất kỳ tập tin hiện có nào" msgctxt "Operator" msgid "Save Preferences" -msgstr "Lưu Tùy Chọn" +msgstr "Lưu các Cài Đặt Sở Thích" msgid "Make the current preferences default" -msgstr "Làm tùy chọn hiện tại thành tùy chọn mặc định" +msgstr "Biến các cài đặt sở thích hiện tại thành mặc định" msgctxt "Operator" msgid "Search Menu" -msgstr "Danh Bạ Tìm" +msgstr "Trình Đơn Tìm Kiếm" msgid "Pop-up a search over all menus in the current context" -msgstr "Nhảy lên một tìm kiếm qua hết danh bạ trong bối cảnh hiện tại" +msgstr "Bật hộp tìm kiếm trên toàn bộ các trình đơn trong ngữ cảnh hiện tại" msgctxt "Operator" msgid "Search Operator" -msgstr "Thao Tác Tìm Kiếm" +msgstr "Lùng Tìm Thao Tác" msgid "Pop-up a search over all available operators in current context" -msgstr "Nhảy lên một tìm kiếm qua hết thao tác có trong bối cảnh hiện tại" +msgstr "Bật hộp tìm kiếm trên toàn bộ các operator hiện có trong ngữ cảnh hiện tại" + + +msgctxt "Operator" +msgid "Search Single Menu" +msgstr "Tìm Kiếm Một Trình Đơn" + + +msgid "Pop-up a search for a menu in current context" +msgstr "Bật lên tìm kiếm cho một trình đơn trong ngữ cảnh hiện tại" + + +msgid "Initial Query" +msgstr "Truy Vấn Khởi Đầu" + + +msgid "Query to insert into the search box" +msgstr "Truy vấn để điền vào hộp tìm kiếm" + + +msgid "Menu Name" +msgstr "Tên Trình Đơn" + + +msgid "Menu to search in" +msgstr "Trình đơn để tìm kiếm trong đó" msgctxt "Operator" msgid "Set Stereo 3D" -msgstr "Đặt Nhị Kênh 3D" +msgstr "Đặt Lập Thể 3D" msgid "Toggle 3D stereo support for current window (or change the display mode)" -msgstr "Bật/tắt hỗ trợ nhị kênh 3D cho cửa sổ hiện tại (hay đồi chế độ hiển thị)" +msgstr "Bật/Tắt hỗ trợ lập thể cho cửa sổ hiện tại (hoặc đổi chế độ hiển thị)" msgid "Anaglyph Type" -msgstr "Loại Ảnh Nhị Kênh" +msgstr "Thể Loại Ảnh Nổi Màu Bổ Sung" msgid "Red-Cyan" -msgstr "Đỏ-Xanh Da Trời" +msgstr "Đỏ-Xanh Lơ" msgid "Green-Magenta" -msgstr "Lục-Tím Đỏ" +msgstr "Lục-Hồng Điều" msgid "Yellow-Blue" -msgstr "Vàng-Xanh Dương" +msgstr "Vàng-Lam" msgid "Anaglyph" -msgstr "Nhị Kênh" +msgstr "Ảnh Nổi Màu Bổ Sung" msgid "Render views for left and right eyes as two differently filtered colors in a single image (anaglyph glasses are required)" -msgstr "Kết xuất màn cho con mắt trái và phải có màu lọc khác nhau trong cùng một ảnh (yêu cầu có soi xanh/đỏ)" +msgstr "Kết xuất các góc nhìn cho mắt trái và phải với các màu riêng rẽ, thành một hình ảnh (yêu cầu phải có kính xem ảnh nổi màu bổ sung)" msgid "Interlace" @@ -75805,35 +83075,35 @@ msgstr "Xen Kẽ" msgid "Render views for left and right eyes interlaced in a single image (3D-ready monitor is required)" -msgstr "Kết xuất màn cho con mắt trái và phải xen kẽ trong cùng một ảnh (yêu cầu màn hình hỗ trợ 3D)" +msgstr "Kết xuất các góc nhìn cho mắt trái và phải, xen kẽ nhau, thành một hình ảnh (đòi hỏi phải có màn hình 3D Sẵn Sàng)" msgid "Time Sequential" -msgstr "Trình Tự Thời Gian" +msgstr "Tuần Tự Thời Gian" msgid "Render alternate eyes (also known as page flip, quad buffer support in the graphic card is required)" -msgstr "Kết xuất cho mắt thay phiên (cũng gọi là lật trang, yên cầu có mạch đồ họa hỗ trợ tư đệm)" +msgstr "Kết xuất cho các mắt, lật đảo giữa hai cái (cũng gọi là lật đảo trang, đòi hỏi phải có thẻ đồ họa hỗ trợ bốn bộ đệm (quad buffer))" msgid "Side-by-Side" -msgstr "Trai Phải" +msgstr "Bên Kề Bên" msgid "Render views for left and right eyes side-by-side" -msgstr "Kết xuất màn cho mắt trái và phải kề bên nhau trái phải" +msgstr "Kết xuất các góc nhìn cho mắt trái và phải, cái nọ đứng kề bên cái kia" msgid "Top-Bottom" -msgstr "Trên Dưới" +msgstr "Trên xuống Dưới" msgid "Render views for left and right eyes one above another" -msgstr "Kết xuất màn cho mắt trái và phải ở trên và dưới nhau" +msgstr "Kết xuất các góc nhìn cho mắt trái và phải, cái nọ nằm trên cái kia" msgid "Interlace Type" -msgstr "Loại Xen Kẽ" +msgstr "Kiểu Xen Kẽ" msgid "Row Interleaved" @@ -75845,53 +83115,53 @@ msgstr "Xen Kẽ Cột" msgid "Checkerboard Interleaved" -msgstr "Xen Kẽ Ca Rô" +msgstr "Xen Kẽ Ô Cờ" msgid "Swap Left/Right" -msgstr "Trao Đổi Trái/Phải" +msgstr "Chuyển Đổi Trái/Phải" msgid "Swap left and right stereo channels" -msgstr "Trao Đổi kênh nhị kênh trái và phải" +msgstr "Chuyển đổi các kênh lập thể trái và phải" msgid "Cross-Eyed" -msgstr "Mắt Lé Vào" +msgstr "Tầm Mắt Giao Nhau (Mắt Lác)" msgid "Right eye should see left image and vice versa" -msgstr "Con mắt phải nên thấy ảnh trái và ngược lại" +msgstr "Mắt bên phải sẽ thấy hình ảnh bên trái và ngược lại" msgctxt "Operator" msgid "Splash Screen" -msgstr "Ảnh Quảng Cáo" +msgstr "Màn Hình Chào Đón" msgid "Open the splash screen with release info" -msgstr "Mở ảnh quảng cáo và thông tin phiên bản" +msgstr "Mở màn hình chào đón với thông tin về phiên bản" msgctxt "Operator" msgid "About Blender" -msgstr "Về Blender" +msgstr "Thông Tin về Blender" msgid "Open a window with information about Blender" -msgstr "Mở một cửa sổ cho chiếu thông tin về Blender" +msgstr "Mở một cửa sổ với các thông tin về Blender" msgid "Import an STL file as an object" -msgstr "Nhập một tập tin STL tạo một vật thể" +msgstr "Nhập khẩu tập tin STL như một đối tượng" msgid "Validate Mesh" -msgstr "Kiểm Tra Mạng Lưới" +msgstr "Kiểm Nhận Khung Lưới" msgid "Validate and correct imported mesh (slow)" -msgstr "Kiểm tra và sửa mạng lưới đã nhập (chậm)" +msgstr "Kiểm tra tính hợp lệ và chỉnh sửa khung lưới nhập khẩu (chậm)" msgctxt "Operator" @@ -75900,68 +83170,68 @@ msgstr "Lưu Thông Tin Hệ Thống" msgid "Generate system information, saved into a text file" -msgstr "Chế tạo thông tin hệ thống, lưu trong một tập tin văn bản" +msgstr "Sinh tạo thông tin của hệ thống rồi lưu trong một tập tin văn bản" msgctxt "Operator" msgid "Set Tool by Name" -msgstr "Đặt Dụng Cụ bằng Tên" +msgstr "Đặt Công Cụ bằng Tên" msgid "Set Fallback" -msgstr "Đặt Dụng Cụ Dự Phòng" +msgstr "Đặt Sử Dụng Chức Năng Dự Bị" msgid "Set the fallback tool instead of the primary tool" -msgstr "Đặt dụng cụ dự phòng thay thế dụng cụ chánh" +msgstr "Đặt sử dụng chức năng công cụ dự bị, thay vì chức năng công cụ chủ yếu" msgid "Cycle" -msgstr "Chu Trình" +msgstr "Luân Chuyển" msgid "Cycle through tools in this group" -msgstr "Chù trình quanh dụng cụ trong nhóm này" +msgstr "Luân chuyển qua các công cụ trong nhóm này" msgid "Identifier of the tool" -msgstr "Tên xác định của dụng cụ" +msgstr "Định danh của công cụ" msgctxt "Operator" msgid "Set Tool by Index" -msgstr "Đặt Dụng Cụ bằng Chỉ Số" +msgstr "Đặt Công Cụ bằng Chỉ Số" msgid "Set the fallback tool instead of the primary" -msgstr "Đặt dụng cụ dự phòng thay thế dụng cụ chánh" +msgstr "Đặt công cụ dự bị thay vì công cụ chủ yếu" msgid "Include tool subgroups" -msgstr "Gồm hạ nhóm dụng cụ" +msgstr "Bao gồm các phân-nhóm của công cụ" msgid "Index in Toolbar" -msgstr "Chỉ số trong Thanh Dụng Cụ" +msgstr "Chỉ Số trong Thanh Công Cụ" msgctxt "Operator" msgid "Toolbar" -msgstr "Thanh Dụng Cụ" +msgstr "Thanh Công Cụ" msgctxt "Operator" msgid "Fallback Tool Pie Menu" -msgstr "Danh Bạ Quạt Của Dụng Cụ Dự Phòng" +msgstr "Công Cụ Dự Bị của Trình Đơn Rẻ Quạt" msgctxt "Operator" msgid "Toolbar Prompt" -msgstr "Dấu Gõ Thanh Dụng Cụ" +msgstr "Nhắc Lệnh của Thanh Công Cụ" msgid "Leader key like functionality for accessing tools" -msgstr "Sự hoạt động giống như phím lãnh đạo để đến dụng cụ " +msgstr "Chức năng tương tự như khóa dẫn đầu dành cho việc tiếp cận các công cụ" msgid "Open a website in the web browser" @@ -75978,80 +83248,96 @@ msgstr "URL để mở" msgctxt "Operator" msgid "Open Preset Website" -msgstr "Mở Trang Mạng Đặt Sẵn" +msgstr "Mở Trang Mạng Định Sẵn" msgid "Open a preset website in the web browser" -msgstr "Mở một trang mạng đặt sẵn trong trình duyệt mạng" +msgstr "Mở một trang mạng định sẵn trong trình duyệt mạng" msgid "Optional identifier" -msgstr "Mã nhận dạng tùy chọn" +msgstr "Định danh bổ sung" msgid "Site" -msgstr "Trang Mạng" +msgstr "Địa Điểm Trang Mạng" msgctxt "Operator" msgid "Export USD" -msgstr "Xuất USD" +msgstr "Xuất Khẩu USD" msgid "Export current scene in a USD archive" -msgstr "Xuất cảnh hiện tại vào một kho USD" +msgstr "Xuất Khẩu cảnh hiện tại ra kho USD" msgid "Export all frames in the render frame range, rather than only the current frame" -msgstr "Xuất hết bức ảnh trong phạm số bức ảnh kết xuất, thay thế chỉ bức ảnh hiện tại" +msgstr "Xuất Khẩu toàn bộ các khung hình trong phạm vi khung hình kết xuất, thay vì chỉ khung hiện tại mà thôi" msgid "Export hair particle systems as USD curves" -msgstr "Xuất hệ thống hạt tóc thành đường cong USD" +msgstr "Xuất khẩu hệ thống hạt tóc dưới dạng đường cong USD" msgid "Export viewport settings of materials as USD preview materials, and export material assignments as geometry subsets" -msgstr "Xuất cài đặt của màn chiếu của vật liệu bằng vật liệu dự khán USD, và xuất chỉ định vật liệu bằng hạ tập hợp hình dạng" +msgstr "Xuất khẩu các cài đặt cổng nhìn của nguyên vật liệu dưới dạng nguyên vật liệu xem trước USD và các ấn định nguyên vật liệu xuất khẩu dưới dạng tập con hình học" + + +msgid "Include mesh color attributes in the export" +msgstr "Bao gồm các thuộc tính màu sắc của khung lưới trong xuất khẩu" msgid "Include normals of exported meshes in the export" -msgstr "Gồm pháp tuyến của mạng lưới được xuất" +msgstr "Bao gồm các pháp tuyến của khung lưới xuất khẩu trong quá trình xuất khẩu" msgid "Export Textures" -msgstr "Xuất Chất Liệu" +msgstr "Xuất Khẩu Chất Liệu" msgid "If exporting materials, export textures referenced by material nodes to a 'textures' directory in the same directory as the USD file" -msgstr "Nếu đang xuất vật liệu, xuất chất liệu được tham chiếu bởi giao điểm vật liệu vào một thư mục 'chất liệu' trong cùng thư mục đang chứa tập tin USD" +msgstr "Nếu xuất khẩu nguyên vật liệu thì hãy xuất khẩu các chất liệu tham chiếu bởi các nút nguyên vật liệu ra một thư mục 'textures' (nguyên vật liệu) trong cùng thư mục với tập tin USD" msgid "UV Maps" -msgstr "Bản Đồ UV" +msgstr "Ánh Xạ UV" msgid "Include all mesh UV maps in the export" -msgstr "Gồm hết bản đồ UV mạng lưới khi kết xuất" +msgstr "Bao gồm toàn bộ các ánh xạ UV khung lưới trong xuất khẩu" msgid "To USD Preview Surface" -msgstr "Đến Bề Mặt USD Dự Khán" +msgstr "Thành Bề Mặt Xem Trước USD" msgid "Generate an approximate USD Preview Surface shader representation of a Principled BSDF node network" -msgstr "Chế tạo một đại diện bộ tô sắc xấp xỉ Bề Mặt USD Dự Khán cho một mạng lưới giao điểm BSDF Tổng Quát" +msgstr "Sinh tạo tô bóng đại diện xấp xỉ với Bề Mặt Xem Trước USD của mạng nút BSDF Nguyên tắc" msgid "Overwrite Textures" -msgstr "Ghi Lại Trên Chất Liệu" +msgstr "Viết Đè Chất Liệu" + + +msgid "Overwrite existing files when exporting textures" +msgstr "Viết đè lên các tập tin hiện có khi xuất khẩu chất liệu" msgid "Use relative paths to reference external files (i.e. textures, volumes) in USD, otherwise use absolute paths" -msgstr "Dùng đường dẫn tương đối để tham chiếu đến các tập tin ngoài (ví dụ: chất liệu, thể tích) trong USD" +msgstr "Sử dụng đường dẫn tương đối để tham chiếu các tập tin bên ngoài (tức là các chất liệu, thể tích/khối) trong USD, nếu không thì sử dụng đường dẫn tuyệt đối" + + +msgid "Root Prim" +msgstr "Cấu Trúc Cơ Bản Gốc" + + +msgid "If set, add a transform primitive with the given path to the stage as the parent of all exported data" +msgstr "Nếu được đặt thì cho thêm một hình cơ bản biến hóa với đường dẫn đã cho vào sân khấu làm phụ huynh của dữ liệu đã xuất khẩu" msgid "Only export selected objects. Unselected parents of selected objects are exported as empty transform" -msgstr "Chỉ các xuất vật thể được chọn. Xuất các phụ huynh chưa chọn của vật thể được chọn bằng biến hóa trống rỗng" +msgstr "Chỉ xuất khẩu các đối tượng đã chọn mà thôi. Các đối tượng phụ huynh không được chọn của các đối tượng đã chọn được xuất khẩu dưới dạng biến hóa trống rỗng" msgid "Instancing" @@ -76059,140 +83345,216 @@ msgstr "Thực Thể Hóa" msgid "Export instanced objects as references in USD rather than real objects" -msgstr "Xuất vật thể được thực thể bằng tham chiếu trong USD, thay thế vật thể thật" +msgstr "Xuất Khẩu các đối tượng thực thể dưới dạng tham chiếu trong USD thay vì là các đối tượng thực" msgid "Visible Only" -msgstr "Chỉ Được Hiển Thị" +msgstr "Duy Hữu Hình" msgid "Only export visible objects. Invisible parents of exported objects are exported as empty transforms" -msgstr "Chỉ xuất các vật thể được hiển thị. Xuất các phụ huynh ẩn của vật thể đang xuất bằng biến hóa trống rỗng" +msgstr "Chỉ xuất khẩu các đối tượng nhìn thấy được. Các phụ huynh ẩn khuất của các đối tượng xuất khẩu sẽ được xuất khẩu dưới dạng các biến hóa trống rỗng" msgctxt "Operator" msgid "Import USD" -msgstr "Nhập USD" +msgstr "Nhập Khẩu USD" msgid "Import USD stage into current scene" -msgstr "Nhập sân khấu USD vào cảnh hiện tại" +msgstr "Nhập Khẩu giàn cảnh USD vào cảnh hiện tại" msgid "Create Collection" -msgstr "Chế Tạo Sưu Tập" +msgstr "Kiến Tạo Bộ Sưu Tập" msgid "Add all imported objects to a new collection" -msgstr "Thêm hết vật thể vào một sưu tập mới" +msgstr "Thêm toàn bộ các đối tượng đã nhập khẩu vào bộ sưu tập mới" + + +msgid "Import All Materials" +msgstr "Nhập Khẩu Toàn Bộ các Nguyên Vật Liệu" + + +msgid "Also import materials that are not used by any geometry. Note that when this option is false, materials referenced by geometry will still be imported" +msgstr "Đồng thời nhập khẩu các nguyên vật liệu chưa sử dụng đến bởi bất kỳ hình học nào. Lưu ý rằng khi tùy chọn này là sai (false) thì các nguyên vật liệu mà hình học tham chiếu đến cũng sẽ vẫn được nhập khẩu đấy nhé" + + +msgid "Blend Shapes" +msgstr "Pha Trộn Hình Dạng" msgid "Import guide geometry" -msgstr "Nhập hình dạng hướng dẫn" +msgstr "Nhập khẩu hình học hướng dẫn" msgid "Import Instance Proxies" -msgstr "Nhập Đại Lý Thực Thể" +msgstr "Nhập Khẩu Thực Thể Đại Diện" msgid "Create unique Blender objects for USD instances" -msgstr "Chế tạo vật thể đặc đáo Blender cho các thực thể USD" +msgstr "Biến các thực thể USD thành các đối tượng Blender độc đáo/duy nhất" msgid "Import proxy geometry" -msgstr "Nhập hình dạng đại lý" +msgstr "Nhập Khẩu hình học đại diện" msgid "Import final render geometry" -msgstr "Nhập hình dạng kết xuất cuối" +msgstr "Nhập Khẩu hình học kết xuất cuối cùng" msgid "Shapes" msgstr "Hình Dạng" +msgid "Skeletons" +msgstr "Bộ Xương" + + msgid "Import Subdivision Scheme" -msgstr "Nhập Giải Thuật Phân Hóa Bề Mặt" +msgstr "Nhập Khẩu Kế Hoạch Phân Hóa" msgid "Create subdivision surface modifiers based on the USD SubdivisionScheme attribute" -msgstr "Chế tạo bộ điều chỉnh phân hóa bề mặt tùy đặc điểm SubdivisionScheme (GiảiThuậtPhânHóa) của USD" +msgstr "Kiến Tạo bộ điều chỉnh phân hóa dựa trên thuộc tính SubdivisionScheme (Kế Hoạch Phân Hóa) của USD" msgid "Textures Directory" msgstr "Thư Mục Chất Liệu" +msgid "Path to the directory where imported textures will be copied" +msgstr "Đường dẫn đến thư mục nơi các chất liệu nhập khẩu sẽ được sao chép" + + +msgid "Import Textures" +msgstr "Nhập Khẩu các Chất Liệu" + + +msgid "Behavior when importing textures from a USDZ archive" +msgstr "Hành xử sẽ sử dụng khi nhập khẩu các chất liệu từ kho lưu trữ USDZ" + + +msgid "Don't import textures" +msgstr "Không nhập khẩu các chất liệu" + + +msgid "Packed" +msgstr "Đóng Gói" + + +msgid "Import textures as packed data" +msgstr "Nhập khẩu các chất liệu dưới dạng dữ liệu đã được đóng gói" + + +msgid "Copy files to textures directory" +msgstr "Sao chép các tập tin vào thư mục chất liệu" + + msgid "Import USD Preview" -msgstr "Nhập Dự Khán USD" +msgstr "Nhập Khẩu Xem Trước USD" msgid "Convert UsdPreviewSurface shaders to Principled BSDF shader networks" -msgstr "Biến đổi bộ tô sắc UsdPreviewSurface sang mạng lưới BSDF Tổng Quát" +msgstr "Chuyển đổi các bộ tô bóng UsdPreviewSurface (Duyệt Bề Mặt USD) sang mạng lưới các bộ tô bóng BSDF nguyên tắc" msgid "Visible Primitives Only" -msgstr "Chỉ Vật Thể Cơ Bản Hiển Thị" +msgstr "Duy Đối Tượng Cơ Bản Nhìn Thấy Được" msgid "Do not import invisible USD primitives. Only applies to primitives with a non-animated visibility attribute. Primitives with animated visibility will always be imported" -msgstr "Không nhập vật thể cơ bản USD. Chỉ áp dụng cho vật thể cơ bản có đặc điểm hiển thị không hoạt hình. Vật thể cơ bản có đặc điểm hiển thị hoạt hình lần được nhập." +msgstr "Không nhập khẩu các đối tượng cơ bản của USD vô hình, tức những cái không nhìn thấy được. Chỉ áp dụng vào các đối tượng cơ bản có thuộc tính tầm nhìn (khả năng nhìn thấy được, hay tính hữu hình) chưa được hoạt họa mà thôi. Các đối tượng cơ bản có thuộc tính tầm nhìn đã được hoạt họa rồi thì sẽ luôn luôn được nhập khẩu" msgid "Light Intensity Scale" -msgstr "Tỉ Số Cường Độ Đèn" +msgstr "Tỷ Lệ Cường Độ Ánh Sáng" msgid "Scale for the intensity of imported lights" -msgstr "Tỉ số cho cường độ của những đèn nhập" +msgstr "Tỷ lệ cho cường độ ánh sáng của các nguồn sáng nhập khẩu" msgid "Material Name Collision" -msgstr "Tên Vật Liệu Giống" +msgstr "Tên Nguyên Vật Liệu Xung Đột" msgid "Behavior when the name of an imported material conflicts with an existing material" -msgstr "Hành vi khi tên của một vật liệu giống hệt một vật liệu đang tồn tại" +msgstr "Phương pháp hành xử khi tên của nguyên vật liệu nhập khẩu xung đột với nguyên vật liệu hiện có" msgid "Make Unique" -msgstr "Làm Độc Đáo" +msgstr "Biến Thành Độc Nhất" msgid "Import each USD material as a unique Blender material" -msgstr "Nhập mỗi vật liệu USD làm một vật liệu Blender độc đáo" +msgstr "Nhập Khẩu từng nguyên vật liệu USD làm nguyên vật liệu Blender độc nhất" msgid "Reference Existing" -msgstr "Tham Chiếu Đang Tồn Tại" +msgstr "Tham Chiếu cái hiện Tồn Tại" msgid "If a material with the same name already exists, reference that instead of importing" -msgstr "Nếu một vật liệu có tên giống đang tồn tại, tham chiếu vật liệu đó thay thế nhập vào" +msgstr "Nếu một nguyên vật liệu có cùng tên đã tồn tại rồi thì hãy tham chiếu đến nguyên vật liệu đó thay vì nhập khẩu" msgid "Path Mask" -msgstr "Mặt Nạ Đường Dẫn" +msgstr "Chắn Lọc Đường Dẫn" + + +msgid "Import only the primitive at the given path and its descendants. Multiple paths may be specified in a list delimited by commas or semicolons" +msgstr "Duy nhập khẩu hình cơ bản tại đường dẫn đã cho và các hậu duệ của nó. Chúng ta có thể chỉ định nhiều đường dẫn trong một danh sách, phân cách chúng bằng dấu phẩy (,) hoặc dấu chấm phẩy (;) nhé" + + +msgid "Mesh Attributes" +msgstr "Các Thuộc Tính Khung Lưới" + + +msgid "Read USD Primvars as mesh attributes" +msgstr "Đọc các Biến Số Cấu Trúc Cơ Bản USD dưới dạng các thuộc tính khung lưới" msgid "Read mesh color attributes" -msgstr "Đọc đặc điểm màu đỉnh" +msgstr "Đọc các thuộc tính màu của khung lưới" msgid "Read mesh UV coordinates" -msgstr "Đọc tọa độ UV của mạng lưới" +msgstr "Đọc tọa độ UV của khung lưới" msgid "Update the scene's start and end frame to match those of the USD archive" -msgstr "Nâng cấp bức ảnh đầu và cuối của cảnh cho giống kho USD" +msgstr "Cập nhật khung hình khởi đầu và kết thúc của cảnh để khớp với những khung hình của kho lưu trữ USD" msgid "Set Material Blend" -msgstr "Đặt Pha Trộn Vật Liệu" +msgstr "Bật tính năng Pha Trộn Nguyên Vật Liệu" msgid "If the Import USD Preview option is enabled, the material blend method will automatically be set based on the shader's opacity and opacityThreshold inputs" -msgstr "Nếu đã bật tùy chọn Dự Khán USD, phương pháp pha trộn vật liệu sẽ cài đặt tự động tùy độ đục của bộ tô sắc và ngõ vào opacityThreshold (ngưỡng độ đục)" +msgstr "Nếu tùy chọn Nhập Khẩu Xem Trước USD được bật lên thì phương pháp pha trộn nguyên vật liệu sẽ tự động được kích hoạt và hoạt động dựa trên độ đục của bộ tô bóng và độ opacityThreshold (ngưỡng về độ đục) cung cấp ở đầu vào" + + +msgid "File Name Collision" +msgstr "Tên Tập Tin Xung Đột" + + +msgid "Behavior when the name of an imported texture file conflicts with an existing file" +msgstr "Phương pháp hành xử khi tên của tập tin chất liệu nhập khẩu xung đột với tập tin hiện có" + + +msgid "Use Existing" +msgstr "Sử Dụng cái Hiện Có" + + +msgid "If a file with the same name already exists, use that instead of copying" +msgstr "Nếu một tập tin có cùng tên đã tồn tại rồi thì hãy sử dụng tập tin đó thay vì sao chép" + + +msgid "Overwrite existing files" +msgstr "Viết đè lên các tập tin hiện có" msgctxt "Operator" @@ -76201,16 +83563,16 @@ msgstr "Đóng Cửa Sổ" msgid "Close the current window" -msgstr "Đóng cửa sổ hiện tại" +msgstr "Đóng cửa sổ hiện tại lại" msgctxt "Operator" msgid "Toggle Window Fullscreen" -msgstr "Bật/Tắt Cửa Sổ Toàn Màn" +msgstr "Bật/Tắt Toàn Màn Hình Cửa Sổ" msgid "Toggle the current window full-screen" -msgstr "Bật/tắt cửa sổ hiện tại thành toàn màn" +msgstr "Bật/tắt toàn màn hình cửa sổ hiện tại" msgctxt "Operator" @@ -76219,295 +83581,295 @@ msgstr "Cửa Sổ Mới" msgid "Create a new window" -msgstr "Chế tạo một cửa sổ mới" +msgstr "Kiến Tạo một cửa sổ mới" msgctxt "Operator" msgid "New Main Window" -msgstr "Cửa Sổ Chánh Mới" +msgstr "Cửa Sổ Chính Mới" msgid "Create a new main window with its own workspace and scene selection" -msgstr "Chế tạo một cửa sổ chánh mới có công trường và sự lựa chọn cảnh riêng" +msgstr "Kiến Tạo một cửa sổ mới với không gian làm việc và cảnh lựa chọn của riêng nó" msgctxt "Operator" msgid "XR Navigation Fly" -msgstr "Bay Chỉ Hướng XR" +msgstr "Điều Hành Bay Lượn của XR" msgid "Move/turn relative to the VR viewer or controller" -msgstr "Di chuyển quẹo tương đối màn hay đồ điều khiển VR (Sự Thật Ảo" +msgstr "Di chuyển/xoay/rẽ tương đối với quan sát hoặc điều khiển của VR" msgid "Lock Direction" -msgstr "Khóa Hướng" +msgstr "Khóa Chiều Hướng" msgid "Limit movement to viewer's initial direction" -msgstr "Hạn chế chuyển động đến hướng khởi động của người nhìn" +msgstr "Giới hạn chuyển động theo hướng ban đầu của quan sát" msgid "Lock Elevation" -msgstr "Khóa Độ Cao" +msgstr "Khóa Di Chuyển Nâng Lên" msgid "Prevent changes to viewer elevation" -msgstr "Không cho đổi độ cao của người nhìn" +msgstr "Ngăn chặn thay đổi độ cao của quan sát" msgid "Fly mode" -msgstr "Chế độ bay" +msgstr "Chế Độ Bay" msgid "Move along navigation forward axis" -msgstr "Đi theo trục định hướng tới" +msgstr "Di chuyển dọc theo trục điều hướng về đằng trước" msgid "Move along navigation back axis" -msgstr "Đi theo trục định hướng lùi" +msgstr "Di chuyển dọc theo trục điều hướng về đằng sau" msgid "Move along navigation left axis" -msgstr "Đi theo trục định hướng trái" +msgstr "Di chuyển dọc theo trục điều hướng về bên trái" msgid "Move along navigation right axis" -msgstr "Đi theo trục định hướng phải" +msgstr "Di chuyển dọc theo trục điều hướng về bên phải" msgid "Move along navigation up axis" -msgstr "Đi theo trục định hướng lên" +msgstr "Di chuyển dọc theo trục điều hướng lên trên" msgid "Move along navigation down axis" -msgstr "Đi theo trục định hướng xuống" +msgstr "Di chuyển dọc theo trục điều hướng xuống dưới" msgid "Turn Left" -msgstr "Quẹo Trái" +msgstr "Rẽ Trái" msgid "Turn counter-clockwise around navigation up axis" -msgstr "Quẹo nghịch hướng kim đồng hồ quanh trục lên chuyển hướng" +msgstr "Xoay ngược chiều kim đồng hồ quanh trục điều hướng lên trên" msgid "Turn Right" -msgstr "Quẹo Phải" +msgstr "Rẽ Phải" msgid "Turn clockwise around navigation up axis" -msgstr "Quẹo hướng kim đồng hồ quanh trục lên chuyển hướng" +msgstr "Xoay thuận chiều kim đồng hồ quanh trục điều hướng lên trên" msgid "Viewer Forward" -msgstr "Người Nhìn Đi Tới" +msgstr "Quan Sát về Đằng Trước" msgid "Move along viewer's forward axis" -msgstr "Di chuyển theo trục tới của người nhìn" +msgstr "Di chuyển dọc theo trục đằng trước của quan sát" msgid "Viewer Back" -msgstr "Người Nhìn Đi Lùi" +msgstr "Quan Sát về Đằng Sau" msgid "Move along viewer's back axis" -msgstr "Di chuyển theo trục lùi của người nhìn" +msgstr "Di chuyển dọc theo trục đằng sau của quan sát" msgid "Viewer Left" -msgstr "Người Nhìn Phía Trái" +msgstr "Quan Sát về Bên Trái" msgid "Move along viewer's left axis" -msgstr "Di chuyển theo trục trái của người nhìn" +msgstr "Di chuyển dọc theo trục bên trái của quan sát" msgid "Viewer Right" -msgstr "Người Nhìn Phía Phải" +msgstr "Quan Sát về Bên Phải" msgid "Move along viewer's right axis" -msgstr "Di chuyển theo trục phải của người nhìn" +msgstr "Di chuyển dọc theo trục bên phải của quan sát" msgid "Controller Forward" -msgstr "Đồ Điều Khiển Tới" +msgstr "Điều Khiển Đi Về Phía Trước" msgid "Move along controller's forward axis" -msgstr "Di chuyển theo trục tới của người nhìn" +msgstr "Di chuyển dọc theo trục hướng trước của điều khiển" msgid "Frame Based Speed" -msgstr "Tốc Độ Tùy Tốc Độ Bức Ảnh/Giây" +msgstr "Tốc Độ Dựa Trên Khung Hình" msgid "Apply fixed movement deltas every update" -msgstr "Áp dụng chênh lệch chuyển động từng nâng cấp" +msgstr "Áp dụng chuyển động delta cố định mỗi lần cập nhật" msgid "Speed Interpolation 0" -msgstr "Suy Nội Tốc Độ 0" +msgstr "Nội suy tốc độ 0" msgid "First cubic spline control point between min/max speeds" -msgstr "Điểm kiểm soát thứ nhất của mẫu cong bậc ba giữa tốc độ cực tiểu/cực đại" +msgstr "Điểm điều khiển cubic chốt trục đầu tiên giữa tốc độ tối thiểu/tối đa" msgid "Speed Interpolation 1" -msgstr "Suy Nội Tốc Độ 1" +msgstr "Nội Suy Tốc Độ 1" msgid "Second cubic spline control point between min/max speeds" -msgstr "Điểm kiểm soát thứ hai của mẫu cong bậc ba giữa tốc độ cực tiểu/cực đại" +msgstr "Điểm điều khiển cubic chốt trục thứ hai giữa tốc độ tối thiểu/tối đa" msgid "Maximum Speed" -msgstr "Tốc Độ Cực Đại" +msgstr "Tốc Độ Tối Đa" msgid "Maximum move (turn) speed in meters (radians) per second or frame" -msgstr "Tốc độ cực đại di chuyển (quẹo) mét (radian)/giây từng bức ảnh" +msgstr "Tốc độ di chuyển tối đa (xoay/rẽ) trong số mét (radian) mỗi giây hoặc mỗi khung hình" msgid "Minimum Speed" -msgstr "Tốc Độ Cực Tiểu" +msgstr "Tốc Độ Tối Thiểu" msgid "Minimum move (turn) speed in meters (radians) per second or frame" -msgstr "Tốc độ cực tiểu di chuyển (quẹo) mét (radian)/giây từng bức ảnh" +msgstr "Tốc độ di chuyển tối thiểu (xoay/rẽ) trong số mét (radian) mỗi giây hoặc mỗi khung hình" msgctxt "Operator" msgid "XR Navigation Grab" -msgstr "Cầm Chuyển Hướng XR" +msgstr "Cầm Nắm Điều Hướng XR" msgid "Navigate the VR scene by grabbing with controllers" -msgstr "Chuyển hướng trong cảnh VR bằng cầm đồ điều khiển" +msgstr "Điều hướng cảnh VR bằng cách cầm nắm điều khiển" msgid "Prevent changes to viewer location" -msgstr "Tránh đổi vị trí của người nhìn" +msgstr "Ngăn chặn thay đổi vị trí quan sát" msgid "Prevent changes to viewer rotation" -msgstr "Tránh đổi xoay của người nhìn" +msgstr "Ngăn chặn thay đổi hướng xoay chiều của quan sát" msgid "Lock Up Orientation" -msgstr "Khóa Định Hướng Lên" +msgstr "Khóa Định Hướng Lên Trên" msgid "Prevent changes to viewer up orientation" -msgstr "Tránh đổi định hướng lên của người nhìn" +msgstr "Ngăn ngừa các thay đổi đối với hướng lên trên của quan sát" msgid "Prevent changes to viewer scale" -msgstr "Tránh đổi phóng to của người nhìn" +msgstr "Ngăn chặn thay đổi tỷ lệ quan sát" msgctxt "Operator" msgid "XR Navigation Reset" -msgstr "Đặt Lại Chuyển Hướng XR" +msgstr "Hoàn Lại Điều Hướng VR" msgid "Reset VR navigation deltas relative to session base pose" -msgstr "Đặt lại chênh lệch chuyển hướng tương đối dạng đứng cơ sở của phiên chạy" +msgstr "Hoàn lại delta điều hướng VR tương đối với tư thế cơ sở của phiên sử dụng" msgid "Reset location deltas" -msgstr "Đặt lại chênh lệch vị trí" +msgstr "Hoàn lại vị trí delta" msgid "Reset rotation deltas" -msgstr "Đặt lại chênh lệch xoay" +msgstr "Hoàn lại xoay chiều delta" msgid "Reset scale deltas" -msgstr "Đặt lại chênh lệch phóng to" +msgstr "Hoàn lại tỷ lệ delta" msgctxt "Operator" msgid "XR Navigation Teleport" -msgstr "Biến Hiện Chuyển Hướng XR" +msgstr "Viễn Tải Điều Hướng của XR" msgid "Set VR viewer location to controller raycast hit location" -msgstr "Đặt vị trí người nhìn VR cho vị trí trúng phát tia của đồ điều khiển" +msgstr "Đặt vị trí quan sát VR thành vị trí tia bắn va đập trúng của bộ điều khiển" msgid "Raycast axis in controller/viewer space" -msgstr "Trục của tia phát trong không gian đồ điều khiển/người nhìn" +msgstr "Trục bắn tia trong không gian điều khiển/quan sát" msgid "Raycast color" -msgstr "Màu của tia phát" +msgstr "Màu của tia bắn" msgid "Maximum raycast distance" -msgstr "Khoảng cách phát tia cực đại" +msgstr "Khoảng cách bắn tia tối đa" msgid "From Viewer" -msgstr "Từ Người Nhìn" +msgstr "Từ Tư Thế Quan Sát" msgid "Use viewer pose as raycast origin" -msgstr "Dùng hình dạng của người nhìn làm góc tọa độ phát tia" +msgstr "Sử dụng tư thế quan sát làm tọa độ gốc bắn tia" msgid "Interpolation factor between viewer and hit locations" -msgstr "Hệ số suy nội giữa vị trí người nhìn và trúng" +msgstr "Hệ số nội suy giữa người xem và địa điểm truy nhập" msgid "Offset along hit normal to subtract from final location" -msgstr "Nới theo pháp tuyến trúng để trừ từ vị trí cuối cùng" +msgstr "Dịch chuyển, dọc theo pháp tuyến của điểm bắn trúng vào, để khấu trừ đi khỏi vị trí cuối cùng" msgid "Selectable Only" -msgstr "Chỉ Được Chọn" +msgstr "Duy cái có thể Chọn" msgid "Only allow selectable objects to influence raycast result" -msgstr "Chỉ cho vật thể được chọn ảnh hưởng kết qủa phát tia" +msgstr "Chỉ cho phép các đối tượng có thể chọn tác động đến kết quả của quá trình bắn tia mà thôi" msgid "Teleport Axes" -msgstr "Trục Biến Hiện" +msgstr "Trục Viễn Tải" msgid "Enabled teleport axes in navigation space" -msgstr "Đã bật trục biến hiện trong không gian chuyển hướng" +msgstr "Bật các trục viễn tải lên trong không gian điều hướng" msgctxt "Operator" msgid "Toggle VR Session" -msgstr "Bật/Tắt Phiên Chạy Sự Thật Ảo" +msgstr "Bật/Tắt Phiên VR" msgid "Open a view for use with virtual reality headsets, or close it if already opened" -msgstr "Mở một màn để dùng với bộ đeo " +msgstr "Mở một góc nhìn để sử dụng với các bộ đầu thực tế ảo, hoặc tắt đi nếu nó đã bật rồi" msgctxt "Operator" msgid "Add Workspace" -msgstr "Thêm Công Trường" +msgstr "Thêm Không Gian Làm Việc" msgid "Add a new workspace by duplicating the current one or appending one from the user configuration" -msgstr "Thêm một công trường bằng sao chép công trường hiện tại hay kèm một cái từ cấu hình người dùng" +msgstr "Thêm một không gian làm việc mới bằng cách sao chép cái hiện tại, hoặc bổ sung một cái từ cấu hình người dùng" msgctxt "Operator" msgid "Append and Activate Workspace" -msgstr "Kèm và Hoạt Động Công Trường" +msgstr "Bổ Sung và Kích Hoạt Không Gian Làm Việc" msgid "Append a workspace and make it the active one in the current window" -msgstr "Kèm một công trường và làm nó thành công trường hoạt động trong cửa sổ hiện tại" +msgstr "Bổ sung một không gian làm việc và biến nó thành cái đang hoạt động trong cửa sổ hiện tại" msgid "Path to the library" @@ -76515,52 +83877,52 @@ msgstr "Đường dẫn đến thư viện" msgid "Name of the workspace to append and activate" -msgstr "Tên của công trườnng để kèm và hoạt động" +msgstr "Tên của không gian làm việc để bổ sung và kích hoạt" msgctxt "Operator" msgid "Delete Workspace" -msgstr "Xóa Công Trường" +msgstr "Xóa Không Gian Làm Việc" msgid "Delete the active workspace" -msgstr "Xóa công trường hoạt động" +msgstr "Xóa không gian làm việc đang hoạt động" msgctxt "Operator" msgid "New Workspace" -msgstr "Công Trường Mới" +msgstr "Không Gian Làm Việc Mới" msgid "Add a new workspace" -msgstr "Thêm một công trường mới" +msgstr "Thêm một không gian làm việc mới" msgctxt "Operator" msgid "Workspace Reorder to Back" -msgstr "Sắp Thứ Tự Công Trường đến Phía Sau" +msgstr "Đổi Trật Tự Không Gian Làm Việc ra Đằng Sau" msgid "Reorder workspace to be last in the list" -msgstr "Sắp lại thứ tự công trường cho nó là cuối cùng trong danh sách" +msgstr "Đổi trật tự không gian thành cái cuối cùng trong danh sách" msgctxt "Operator" msgid "Workspace Reorder to Front" -msgstr "Sắp Thứ Tự Công Trường đến Phía Trước" +msgstr "Đổi Trật Tự Không Gian Làm Việc ra Đằng Trước" msgid "Reorder workspace to be first in the list" -msgstr "Sắp thứ tự công trường cho nó là thứ nhất trong danh sách" +msgstr "Đổi trật tự không gian thành cái đầu tiên trong danh sách" msgctxt "Operator" msgid "Pin Scene to Workspace" -msgstr "Ghim Cảnh vào Công Trường" +msgstr "Đính Ghim Cảnh vào Không Gian Làm Việc" msgid "Remember the last used scene for the current workspace and switch to it whenever this workspace is activated again" -msgstr "Nhớ lại cảnh cuối cùng được dùng cho công trường hiện tại và trao đổi đến nó khi công trường này được khởi động lại" +msgstr "Ghi nhớ cảnh sử dụng gần đây nhất cho không gian làm việc hiện tại và chuyển sang cảnh đó bất cứ khi nào không gian làm việc này được kích hoạt trở lại" msgctxt "Operator" @@ -76569,139 +83931,139 @@ msgstr "Thế Giới Mới" msgid "Create a new world Data-Block" -msgstr "Chế tạo một Cục Dữ liệu thế giới mới" +msgstr "Kiến Tạo một Khối Dữ Liệu thế giới mới" msgid "External file packed into the .blend file" -msgstr "Tập tin ngoài được nhét vào tập tin .blend" +msgstr "Tập tin bên ngoài được đóng gói vào tập tin .blend" msgid "Raw data (bytes, exact content of the embedded file)" -msgstr "Dữ liệu nguyên gốc (byte, nội dung chính xác của tập tin được nhét)" +msgstr "Dữ liệu gốc (byte, nội dung nguyên gốc của tập tin được nhúng vào)" msgid "Size of packed file in bytes" -msgstr "Kích thước của tập tin được nhét (đơn vị byte)" +msgstr "Cỡ của tập tin đóng gói trong đơn vị byte" msgid "Active Brush" -msgstr "Bút Hoạt Động" +msgstr "Đầu Bút đang Hoạt Động" msgid "Editable cavity curve" -msgstr "Cong lỗ có thể biên tập" +msgstr "Đường cong có thể biên soạn cho khe hốc" msgid "Average multiple input samples together to smooth the brush stroke" -msgstr "Trung bình của nhiều mẫu vật ngõ vào cho mịn hóa nét vé" +msgstr "Tính trung bình nhiều mẫu vật được cung cấp lại để làm mềm các nét đầu bút" msgid "Active Palette" -msgstr "Bảng Màu Hoạt Động" +msgstr "Bảng Pha Màu đang Hoạt Động" msgid "Show Brush" -msgstr "Hiện Bút Lông" +msgstr "Hiển Thị Đầu Bút" msgid "Show Brush On Surface" -msgstr "Hiện Bút Lông Trên Bề Mạt" +msgstr "Hiển Thị Đầu Bút Trên Bề Mặt" msgid "Fast Navigate" -msgstr "Chuyển Hướng Lẹ" +msgstr "Điều Hướng Nhanh" msgid "For multires, show low resolution while navigating the view" -msgstr "Cho đa độ phân giải, hiện độ phân giải thấp khi chuyển hướng màn" +msgstr "Dành cho đa phân giải, hiển thị độ phân giải thấp trong khi điều hướng góc nhìn" msgid "Tiling offset for the X Axis" -msgstr "Dịch cho ô hóa trục X" +msgstr "Khoảng nhảy cách ô trên Trục X" msgid "Stride at which tiled strokes are copied" -msgstr "Bước cho chép nét được ô hóa" +msgstr "Khoảng nhảy cách mà các nét vẽ sắp xếp ô sẽ được sao chép" msgid "Tile X" -msgstr "Ô Hóa X" +msgstr "Số Ô Trục X" msgid "Tile along X axis" -msgstr "Ô hóa theo trục X" +msgstr "Số ô theo trục X" msgid "Tile Y" -msgstr "Ô Hóa Y" +msgstr "Số Ô Trục Y" msgid "Tile along Y axis" -msgstr "Ô hóa theo trục Y" +msgstr "Số ô theo trục Y" msgid "Tile Z" -msgstr "Ô Hóa Z" +msgstr "Sắp Ô Z" msgid "Tile along Z axis" -msgstr "Ô hóa theo trục Z" +msgstr "Sắp ô theo trục Z" msgid "Paint Tool Slots" -msgstr "Khe Dụng Cụ Sơn" +msgstr "Khe Công Cụ Sơn" msgid "Mask painting according to mesh geometry cavity" -msgstr "Sơn mặt nạ tùy lỗ trong hình dạng mạng lưới" +msgstr "Sơn màn chắn lọc tùy theo hố hốc trong hình học của khung lưới" msgid "Delay Viewport Updates" -msgstr "Trì Hoãn Nâng Cấp Màn Chiếu" +msgstr "Trì Hoãn Cập Nhật Cổng Nhìn" msgid "Update the geometry when it enters the view, providing faster view navigation" -msgstr "Nâng cấp hình dạng khi nó nhập vào màn, để di chuyển nhanh hơn" +msgstr "Cập nhật hình học khi bước vào khung nhìn. Cung cấp phương pháp điều hướng góc nhìn nhanh nhẹn hơn" msgid "Symmetry Feathering" -msgstr "Phe phẩy Đối Xứng" +msgstr "Hòa Nhòe Đối Xứng" msgid "Reduce the strength of the brush where it overlaps symmetrical daubs" -msgstr "Giảm sức bút lông cho khi nét lấn trên trục đối xứng" +msgstr "Giảm cường độ đầu bút nơi nó đè gối lên các vết lem nhem đối xứng" msgid "Symmetry X" -msgstr "Đối Xứng X" +msgstr "Đối xứng X" msgid "Mirror brush across the X axis" -msgstr "Gương lại bút ngang trục X" +msgstr "Phản chiếu đối xứng đầu bút sang bên kia trục X" msgid "Symmetry Y" -msgstr "Đối Xứng Y" +msgstr "Đối xứng Y" msgid "Mirror brush across the Y axis" -msgstr "Gương lại bút ngang trục X" +msgstr "Phản chiếu đối xứng đầu bút sang bên kia trục Y" msgid "Symmetry Z" -msgstr "Đối Xứng Z" +msgstr "Đối xứng Z" msgid "Mirror brush across the Z axis" -msgstr "Gương lại bút ngang trục Z" +msgstr "Phản chiếu đối xứng đầu bút sang bên kia trục Z" msgid "Curves Sculpt Paint" -msgstr "Sơn Khắc Đường Cong" +msgstr "Điêu Khắc Đường Cong: Sơn" msgid "Grease Pencil Paint" -msgstr "Nước Sơn Bút Sáp" +msgstr "Sơn bằng Bút Chì Dầu" msgid "Paint Mode" @@ -76709,67 +84071,67 @@ msgstr "Chế Độ Sơn" msgid "Paint using the active material base color" -msgstr "Sơn bằng màu cơ sở vật liệu hoạt động" +msgstr "Sơn sử dụng màu cơ sở của nguyên vật liệu đang hoạt động" msgid "Paint the material with a color attribute" -msgstr "Sơn vật liệu bằng một đặc điểm màu" +msgstr "Sơn nguyên vật liệu với một thuộc tính màu" msgid "Grease Pencil Sculpt Paint" -msgstr "Sơn Khắc Bút Sáp" +msgstr "Điêu Khắc Sơn bằng Bút Chì Dầu" msgid "Image Paint" -msgstr "Nước Sơn Ảnh" +msgstr "Sơn Hình Ảnh" msgid "Properties of image and texture painting mode" -msgstr "Đặc tính của chế độ sơn ảnh và chất liệu" +msgstr "Tính chất của chế độ sơn hình ảnh và chất liệu" msgid "Canvas" -msgstr "Vải Sơn" +msgstr "Khung Vẽ" msgid "Image used as canvas" -msgstr "Ảnh được làm mặt sơn" +msgstr "Hình ảnh sử dụng làm khung vẽ" msgid "Image used as clone source" -msgstr "Ảnh được làm nguồn sao chép" +msgstr "Hình ảnh sử dụng để làm nguồn rập khuôn" msgid "Dither" -msgstr "Đẩu Động" +msgstr "Phối Màu" msgid "Amount of dithering when painting on byte images" -msgstr "Mức đẩu động khi sơn trên ảnh byte" +msgstr "Lượng phối màu khi sơn trên những hình ảnh byte" msgid "Texture filtering type" -msgstr "Kiểu lọc chất liệu" +msgstr "Thao tác thanh lọc chất liệu" msgid "Invert the stencil layer" -msgstr "Đảo nghịch khuông tô" +msgstr "Đảo ngược lớp khuôn in" msgid "Missing Materials" -msgstr "Vật Liệu Thiếu" +msgstr "Thiếu Nguyên Vật Liệu" msgid "The mesh is missing materials" -msgstr "Mạng lưới đang thiếu vật liệu" +msgstr "Khung lưới thiếu nguyên vật liệu" msgid "Missing Stencil" -msgstr "Thiếu Khuôn Tô" +msgstr "Thiếu Khuôn In" msgid "Image Painting does not have a stencil" -msgstr "Ảnh Sơn không có một khuôn tô" +msgstr "Sơn Hình Ảnh không có khuôn in" msgid "Missing Texture" @@ -76777,7 +84139,7 @@ msgstr "Thiếu Chất Liệu" msgid "Image Painting does not have a texture to paint on" -msgstr "Ảnh Sơn chưa có một chất liệu để sơn lên trên" +msgstr "Sơn Hình Ảnh không có chất liệu nào để sơn lên cả" msgid "Missing UVs" @@ -76785,71 +84147,71 @@ msgstr "Thiếu UV" msgid "A UV layer is missing on the mesh" -msgstr "Thiếu một lớp UV trên mạng lưới" +msgstr "Thiếu mất một tầng UV trên khung lưới" msgid "Mode of operation for projection painting" -msgstr "Chế độ thao tác cho sơn kiểu chiều đồ" +msgstr "Chế độ thao tác cho quá trình sơn phóng chiếu" msgid "Detect image slots from the material" -msgstr "Phát hiện khe ảnh từ vật liệu" +msgstr "Phát hiện các khe hình ảnh từ nguyên vật liệu" msgid "Set image for texture painting directly" -msgstr "Đặt ảnh cho được sơn chất liệu trực tiếp" +msgstr "Đặt hình ảnh cho quá trình sơn chất liệu trực tiếp" msgid "Screen Grab Size" -msgstr "Kích Cỡ Bắt Màn" +msgstr "Cỡ Nắm Bắt Màn Hình" msgid "Size to capture the image for re-projecting" -msgstr "Kích cỡ để chụp ảnh cho phép chiếu lại" +msgstr "Kích thước để chụp ảnh cho quá trình tái phóng chiếu" msgid "Bleed" -msgstr "Tràn" +msgstr "Tràn Ra" msgid "Extend paint beyond the faces UVs to reduce seams (in pixels, slower)" -msgstr "Cho sơn tràn ra ngoài các mặt UV để giảm vết sẹo (đơn vị điểm ảnh, chậm hơn)" +msgstr "Cho sơn tràn ra ngoài các mặt của UV để thuyên giảm các đường khâu (trong số điểm ảnh, chậm hơn)" msgid "Stencil Color" -msgstr "Màu Khuôn Tô" +msgstr "Màu của Khuôn In" msgid "Stencil color in the viewport" -msgstr "Màu khuôn tô trong màn chiếu" +msgstr "Màu của khuôn in trong cổng nhìn" msgid "Stencil Image" -msgstr "Ảnh Khuôn Tô" +msgstr "Hình Ảnh Khuôn In" msgid "Image used as stencil" -msgstr "Ảnh được làm khuôn tô" +msgstr "Hình ảnh dùng làm khuôn in" msgid "Cull" -msgstr "Hủy Diệt" +msgstr "Loại Trừ" msgid "Ignore faces pointing away from the view (faster)" -msgstr "Không quan tâm mặt chỉ nghịch hướng từ màn (lẹ hơn)" +msgstr "Bỏ qua các mặt được hướng quay đi khỏi góc nhìn (nhanh hơn)" msgid "Clone Map" -msgstr "Bản Đồ Bản Sao" +msgstr "Ánh Xạ để Rập Khuôn" msgid "Use another UV map as clone source, otherwise use the 3D cursor as the source" -msgstr "Dùng một bản đồ UV khác làm nguồn, nếu kkhông dùng con trỏ 3D làm nguồn" +msgstr "Dùng một ánh xạ UV khác làm nguồn rập khuôn, còn không thì dùng con trỏ 3D làm nguồn" msgid "Paint most on faces pointing towards the view" -msgstr "Sơn da số mặt chỉ đến màn" +msgstr "Sơn hầu hết trên các mặt hướng về phía góc nhìn" msgid "Occlude" @@ -76857,111 +84219,139 @@ msgstr "Che Khuất" msgid "Only paint onto the faces directly under the brush (slower)" -msgstr "Chỉ sơn trên mặt ngay trực tiếp ở dưới bút lông (chậm hơn)" +msgstr "Chỉ sơn trên các mặt trực tiếp ngay dưới đầu bút (chậm hơn)" msgid "Stencil Layer" -msgstr "Lớp Khuôn Tô" +msgstr "Tầng Khuôn In" msgid "Set the mask layer from the UV map buttons" -msgstr "Đặt lớp mặt nạ từ nút bản đồ UV" +msgstr "Đặt tầng màn chắn lọc dùng các nút về ánh xạ UV" + + +msgid "Area Normal Falloff" +msgstr "Suy Giảm Dần Pháp Tuyến Khu Vực" + + +msgid "Extend the angular range with a falloff gradient" +msgstr "Mở rộng phạm vi góc với một dốc suy giảm dần" + + +msgid "Area Normal Limit" +msgstr "Giới Hạn Pháp Tuyến Khu Vực" + + +msgid "The range of angles that will be affected" +msgstr "Phạm vi góc độ sẽ bị ảnh hưởng" + + +msgid "View Normal Falloff" +msgstr "Suy Giảm Dần Pháp Tuyến Góc Nhìn" + + +msgid "View Normal Limit" +msgstr "Giới Hạn Pháp Tuyến Góc Nhìn" + + +msgid "Maximum edge length for dynamic topology sculpting (as divisor of Blender unit - higher value means smaller edge length)" +msgstr "Chiều dài cạnh tối đa dành cho điêu khắc liên kết cấu trúc động (làm mẫu số của đơn vị blender - giá trị càng lớn thì chiều dài cạnh càng nhỏ)" msgid "Detail Percentage" -msgstr "Phần Trăm Chi Tiết" +msgstr "Lượng Phần Trăm của Chi Tiết" msgid "Maximum edge length for dynamic topology sculpting (in brush percenage)" -msgstr "Bề dài cạnh cực đại cho khắc kiểu hình dạng học động lý (phần trăm bút)" +msgstr "Chiều dài cạnh tối đa dành cho điêu khắc với liên kết cấu trúc động (theo giá trị phần trăm của đầu bút)" msgid "Detail Refine Method" -msgstr "Phương Pháp Chỉnh Chi Tiết" +msgstr "Phương Pháp Tinh Chỉnh Chi Tiết" msgid "In dynamic-topology mode, how to add or remove mesh detail" -msgstr "Trong chế độ hình dạng học, làm sao thêm hay xóa chi tiết của mạng lưới" +msgstr "Trong chế độ liên kết cấu trúc động, phương pháp để thêm hay xóa chi tiết của khung lưới" msgid "Subdivide Edges" -msgstr "Phân Hóa Cạnh" +msgstr "Phân Chia Cạnh" msgid "Subdivide long edges to add mesh detail where needed" -msgstr "Khi cần, phân hóa cạnh dài để tăng chi tiết mạng lưới tại chỗ nào cần" +msgstr "Khi cần, phân chia các cạnh dài để tăng chi tiết của khung lưới" msgid "Collapse Edges" -msgstr "Tóp Cạnh" +msgstr "Thu Cạnh Lại" msgid "Collapse short edges to remove mesh detail where possible" -msgstr "Tóp cạnh ngắn để bất chi tiết mạng lưới, nếu có thể làm" +msgstr "Thu các cạnh ngắn lại để loại bỏ các chi tiết của khung lưới ở những chỗ có thể" msgid "Subdivide Collapse" -msgstr "Tóp Phân Hóa" +msgstr "Phân Hóa và Thu Lại" msgid "Both subdivide long edges and collapse short edges to refine mesh detail" -msgstr "Làm cả hai, phân hóa cạnh dài và tóp cạnh ngắn để chỉnh chi tiết mạng lưới" +msgstr "Sử dụng cả hai phương pháp: phân hóa các cạnh dài và thu các cạnh ngắn lại để tinh chỉnh chi tiết của khung lưới" msgid "Detail Size" -msgstr "Kịch Cỡ Chi Tiết" +msgstr "Cỡ Chi Tiết" msgid "Maximum edge length for dynamic topology sculpting (in pixels)" -msgstr "Bề dài cạnh cực đại cho khắc kiểu hình dạng học động lý (điểm ảnh)" +msgstr "Chiều dài cạnh tối đa dành cho điêu khắc với liên kết cấu trúc động (trong số điểm ảnh)" msgid "Detail Type Method" -msgstr "Phương Pháp Loại Chi Tiết" +msgstr "Phương Pháp tính Mức Chi Tiết" msgid "In dynamic-topology mode, how mesh detail size is calculated" -msgstr "Trong chế độ hình dạng học động lý, phương pháp tính kích cỡ chi tiết mạng lưới" +msgstr "Trong chế độ liên kết cấu trúc động, phương pháp tính toán mức chi tiết của khung lưới" msgid "Relative Detail" -msgstr "Chi Tiết Tương Đối" +msgstr "Mức Chi Tiết Tương Đối" msgid "Mesh detail is relative to the brush size and detail size" -msgstr "Chi tiết mạng tương đối với kích cỡ bút và kích cỡ chi tiết" +msgstr "Mức chi tiết khung lưới tương đối với kích thước của đầu bút và cỡ chi tiết" msgid "Constant Detail" -msgstr "Chi Tiết Bất Biến" +msgstr "Mức Chi Tiết Bất Biến" msgid "Mesh detail is constant in world space according to detail size" -msgstr "Chi tiết mạng lưới bất biến trong không gian thế giới tùy theo kích cỡ chi tiết" +msgstr "Chi tiết khung lưới bất biến trong không gian thế giới chiểu theo kích thước chi tiết" msgid "Brush Detail" -msgstr "Chi Tiết Bút" +msgstr "Mức Chi Tiết của Đầu Bút" msgid "Mesh detail is relative to brush radius" -msgstr "Chi tiết mạng lưới tương đối với bán kính bút" +msgstr "Mức chi tiết của khung lưới tương đối với bán kính của đầu bút" msgid "Manual Detail" -msgstr "Chi Tiết Bằng Tay" +msgstr "Tự Điều Chỉnh Mức Chi Tiết" msgid "Mesh detail does not change on each stroke, only when using Flood Fill" -msgstr "Chi tiết mạng lưới của mỗi nét không đổi, chỉ khi đang dùng Tô Tràn" +msgstr "Chi tiết khung lưới không thay đổi sau mỗi nét vẽ, chỉ sử dụng Phủ Tràn (Flood Fill)" msgid "Amount of gravity after each dab" -msgstr "Mức hấp dẫn sau chấm" +msgstr "Lượng trọng lực sau mỗi chấm" msgid "Object whose Z axis defines orientation of gravity" -msgstr "Dùng trục Z của vật thể nào để định hướng hấp dẫn" +msgstr "Đối tượng mà trục Z của nó xác định hướng của trọng lực" msgid "Lock X" @@ -76969,7 +84359,7 @@ msgstr "Khóa X" msgid "Disallow changes to the X axis of vertices" -msgstr "Hạn chế đổi trục X của đỉnh" +msgstr "Không cho phép thay đổi trục X của các điểm đỉnh" msgid "Lock Y" @@ -76977,7 +84367,7 @@ msgstr "Khóa Y" msgid "Disallow changes to the Y axis of vertices" -msgstr "Hạn chế đổi trục Y của đỉnh" +msgstr "Không cho phép thay đổi trục Y của các điểm đỉnh" msgid "Lock Z" @@ -76985,19 +84375,19 @@ msgstr "Khóa Z" msgid "Disallow changes to the Z axis of vertices" -msgstr "Hạn chế đổi trục Z của đỉnh" +msgstr "Không cho phép thay đổi trục Z của các điểm đỉnh" msgid "Radial Symmetry Count X Axis" -msgstr "Số Lần Đối Xứng Bán Kính Tuyến Trục X" +msgstr "Số Lần Đối Xứng Tỏa Tròn trên Trục X" msgid "Number of times to copy strokes across the surface" -msgstr "Số lần chép nét qua bề mặt" +msgstr "Số lần sao chép các nét vẽ sang bên kia của bề mặt" msgid "Source and destination for symmetrize operator" -msgstr "Nguồn và đích cho thao tác đối xứng hóa" +msgstr "Nguồn và đích cho operator đối xứng" msgid "Transform Mode" @@ -77005,31 +84395,31 @@ msgstr "Chế Độ Biến Hóa" msgid "How the transformation is going to be applied to the target" -msgstr "Phương pháp cho áp dụng biến hóa cho mục tiêu" +msgstr "Phương pháp biến hóa sẽ được áp dụng vào mục tiêu" msgid "Applies the transformation to all vertices in the mesh" -msgstr "Áp dụng biến hóa cho tất cả đỉnh của mạng lưới" +msgstr "Áp dụng biến hóa vào toàn bộ các điểm đỉnh trong khung lưới" msgid "Applies the transformation simulating elasticity using the radius of the cursor" -msgstr "Áp dụng biến hóa cho mô phỏng độ dẻo bằng dùng bán kính của con trỏ" +msgstr "Áp dụng biến hóa mô phỏng độ đàn hồi bằng cách sử dụng bán kính của con trỏ" msgid "Use Deform Only" -msgstr "Chỉ Dùng Méo Hóa" +msgstr "Duy Sử Dụng Biến Dạng" msgid "Use only deformation modifiers (temporary disable all constructive modifiers except multi-resolution)" -msgstr "Chỉ dùng bộ điều chỉnh méo hóa (tạm thời tắt hết bộ điều chỉnh xây dựng trừ đa độ phân giải)" +msgstr "Chỉ sử dụng những bộ điều chỉnh biến dạng mà thôi (tạm thời tắt toàn bộ các bộ điều chỉnh có tính xây dựng ngoại trừ đa phân giải)" msgid "UV Sculpting" -msgstr "Khắc UV" +msgstr "Điêu Khắc UV" msgid "Properties of vertex and weight paint mode" -msgstr "Đặc tính của chế độ đỉnh và sơn quyền lượng" +msgstr "Tính chất của chế độ điểm đỉnh và sơn trọng lượng" msgid "Restrict" @@ -77037,67 +84427,71 @@ msgstr "Hạn Chế" msgid "Restrict painting to vertices in the group" -msgstr "Hạn chế sơn chỉ cho đỉnh trong nhóm" +msgstr "Hạn chế sơn ở các điểm đỉnh nằm trong nhóm thôi" msgid "Properties of paint mode" -msgstr "Đặc tính của chế độ sơn" +msgstr "Các tính chất của chế độ sơn" + + +msgid "Image used as painting target" +msgstr "Hình ảnh được sử dụng làm mục tiêu sơn" msgid "Source to select canvas from" -msgstr "Nguồn để chọn làm mặt sơn" +msgstr "Nguồn để chọn khung vẽ" msgid "Paint Tool Slot" -msgstr "Khe Dụng Cụ Sơn" +msgstr "Khe Công Cụ Sơn" msgid "Palette Color" -msgstr "Màu Bảng" +msgstr "Màu trong Bảng" msgid "Palette Splines" -msgstr "Mẫu Cong Bảng" +msgstr "Chốt Trục của Bảng Pha Màu" msgid "Collection of palette colors" -msgstr "Sưu tập màu bảng" +msgstr "Bộ sưu tập các màu trong bảng" msgid "Active Palette Color" -msgstr "Màu Bảng Hoạt Động" +msgstr "Màu trong Bảng đang Sử Dụng" msgid "Panel containing UI elements" -msgstr "Bảng đang chứa phần tử Giao Diện" - - -msgid "Refraction" -msgstr "Khúc Xạ" - - -msgid "Denoising" -msgstr "Bất Huyên Náo Hoá" +msgstr "Bảng có chứa các phần tử giao diện người dùng (UI)" msgid "Light Groups" -msgstr "Nhóm Đèn" +msgstr "Nhóm Ánh Sáng" msgid "Integrator Presets" -msgstr "Đặt Sẵn Bộ Tích Phân" +msgstr "Sắp Đặt Sẵn về Tích Phân" msgid "Performance Presets" -msgstr "Đặc Sẵn Cho Hiệu Suất" +msgstr "Những Sắp Đặt Trước về Hiệu Suất Hoạt Động" msgid "Sampling Presets" -msgstr "Đặt Sẵn Mẫu Vật" +msgstr "Sắp Đặt Sẵn về Mẫu Vật" msgid "Viewport Sampling Presets" -msgstr "Đặt Sẵn Mẫu Màn Chiếu" +msgstr "Sắp Đặt Sẵn về Mẫu Vật Cổng Nhìn" + + +msgid "Selectability & Visibility" +msgstr "Khả Năng Lựa Chọn & Tính Hữu Hình" + + +msgid "Physical light sources" +msgstr "Các nguồn ánh sáng cụ thể" msgid "Film" @@ -77105,23 +84499,23 @@ msgstr "Phim" msgid "Passes" -msgstr "Các Vòng" +msgstr "Các Lượt" msgid "Chain Scaling" -msgstr "Phóng To Chuỗi" +msgstr "Đổi Tỷ Lệ Dây Chuyền" msgid "Fitting" -msgstr "Vừa Hóa" +msgstr "Khít Vừa" msgid "Override Layers" -msgstr "Vượt Quyền Lớp" +msgstr "Tầng Lớp Vượt Quyền" msgid "Render Procedural" -msgstr "Kết Xuất Thủ Tục" +msgstr "Kết Xuất Thủ Tục Hóa" msgid "Bone Constraints" @@ -77133,15 +84527,15 @@ msgstr "Xương Dẻo" msgid "Viewport Display" -msgstr "Hiển Thị Màn Chiếu" +msgstr "Hiển Thị Cổng Nhìn" msgid "Custom Shape" -msgstr "Hình Dạng Tùy Chọn" +msgstr "Hình Dạng Tùy Chỉnh" msgid "Camera Presets" -msgstr "Đặt Sẵn Máy Quay Phim" +msgstr "Sắp Đặt Sẵn của Máy Quay Phim" msgid "2D Cursor" @@ -77149,35 +84543,35 @@ msgstr "Con Trỏ 2D" msgid "Predefined tracking camera intrinsics" -msgstr "Bản chất theo dõi máy quay phim được đặt sẵn" +msgstr "Sắp Đặt Sẵn về Tính Chất Cơ Bản của Máy Quay Phim cho Quá Trình Giám Sát" msgid "Clip Display" -msgstr "Cất Màn Chiếu" +msgstr "Hiển Thị Đoạn Phim" msgid "Footage" -msgstr "Đoạn Phim" +msgstr "Cảnh Quay" msgid "Footage Settings" -msgstr "Cài Đặt Đoạn Phim" +msgstr "Sắp Đặt của Cảnh Quay" msgid "Marker Display" -msgstr "Hiển Thị Ký Hiệu" +msgstr "Hiển Thị Dấu Mốc" msgid "Mask Settings" -msgstr "Cài Đặt Mặt Nạ" +msgstr "Sắp Đặt Màn Chắn Lọc" msgid "Mask Display" -msgstr "Hiển Thị Mặt Nạ" +msgstr "Hiển Thị Màn Chắn Lọc" msgid "Proxy/Timecode" -msgstr "Đặi Lý/Mã Thời Gian" +msgstr "Đại Diện/Mã Thời Gian" msgid "Stabilization" @@ -77193,7 +84587,7 @@ msgstr "Giải" msgid "Mask Tools" -msgstr "Dụng Cụ Mặt Nạ" +msgstr "Công Cụ Chắn Lọc" msgid "Transforms" @@ -77202,51 +84596,56 @@ msgstr "Biến Hóa" msgctxt "MovieClip" msgid "Scene Setup" -msgstr "Cài Đặt Cảnh" +msgstr "Thiết Lập Cảnh" msgid "Predefined track color" -msgstr "Màu theo dõi được đặt sẵn" +msgstr "Màu giám sát định trước" msgid "Color Presets" -msgstr "Màu Đặt Sẵn" +msgstr "Màu Định Trước" msgid "Tracking Settings" -msgstr "Cài đặt Đuổi Theo" +msgstr "Sắp Đặt về Giám Sát" msgid "Tracking Settings Extras" -msgstr "Thêm Cài Đặt Theo Dõi" +msgstr "Sắp Đặt Bổ Sung về Giám Sát" + + +msgctxt "Camera" +msgid "Lens" +msgstr "Thấu Kính" msgid "Tracking Settings Extra" -msgstr "Thêm Cài Đặt Theo Dõi" +msgstr "Sắp Đặt Bổ Sung về Giám Sát" msgid "Predefined tracking settings" -msgstr "Cài đặt theo dõi được đặt sẵn" +msgstr "Cấu hình giám sát đặt trước" msgid "Tracking Presets" -msgstr "Đặt Sẵn Theo Dõi" +msgstr "Sắp Đặt Trước" msgid "Cloth Presets" -msgstr "Đặt Sẵn Vải" +msgstr "Sắp Đặt Sẵn về Vải Vóc" msgid "Restrictions" -msgstr "Các Hạn Chế" +msgstr "Những Hạn Chế/Bó/Thu Hẹp/Giới Hạn" msgid "Aperture" -msgstr "Độ Mở" +msgstr "Khẩu Độ" msgid "Beam Shape" -msgstr "Hình Dạng Cột" +msgstr "Hình Dạng Tia Đèn Pha" msgid "Caustics" @@ -77254,19 +84653,23 @@ msgstr "Tụ Quang" msgid "Fast GI Approximation" -msgstr "Xấp Xỉ GI Nhanh" +msgstr "Ước Tính GI Nhanh" msgid "Shadow Terminator" -msgstr "Ranh Giới Bóng Tối" +msgstr "Phương Pháp Kết Thúc Bóng Tối" + + +msgid "Shadow Linking" +msgstr "Liên Kết Bóng Tối" msgid "Ray Visibility" -msgstr "Sự Hiển Thị Tia" +msgstr "Tầm Nhìn của Tia Xạ" msgid "Post Processing" -msgstr "Qúa Trình Sau" +msgstr "Xử Lý Hậu Kỳ" msgid "Pixel Filter" @@ -77278,35 +84681,39 @@ msgstr "Trong Suốt" msgid "Light Paths" -msgstr "Đường Ánh Sáng" +msgstr "Đường Đi của Ánh Sáng" msgid "Clamping" -msgstr "Kẹp" +msgstr "Hạn Định" msgid "Max Bounces" -msgstr "Nhồi Tối Đa" +msgstr "Số Lần Bật Nẩy Tối Đa" msgid "Shutter Curve" -msgstr "Đường Cong Trập" +msgstr "Đường Cong của Cửa Chập" msgid "Performance" -msgstr "Hiệu Suất" +msgstr "Hiệu Suất Thi Hành" msgid "Acceleration Structure" -msgstr "Cấu Trúc Gia Tốc" +msgstr "Cấu Trúc Tăng Tốc" msgid "Final Render" -msgstr "Kết Xuất Cuối" +msgstr "Kết Xuất Kết Thúc" msgid "Threads" -msgstr "Tuyến" +msgstr "Số Luồng" + + +msgid "Path Guiding" +msgstr "Hướng Dẫn Đường Đi" msgid "Subdivision" @@ -77314,11 +84721,11 @@ msgstr "Phân Hóa" msgid "Render Pass" -msgstr "Vòng Kết Xuất" +msgstr "Lượt Kết Xuất" msgid "Mist Pass" -msgstr "Vòng Sương Mù" +msgstr "Lượt về Sương Mù" msgid "Custom Distance" @@ -77326,23 +84733,23 @@ msgstr "Khoảng Cách Tùy Chọn" msgid "Cascaded Shadow Map" -msgstr "Bản Đồ Bóng Tối Tầng Bậc" +msgstr "Ánh Xạ Bóng Tối Đổ Xa Dần" msgid "Contact Shadows" -msgstr "Bóng Tối Đụng" +msgstr "Bóng Tối Tiếp Xúc" msgid "Composition Guides" -msgstr "Nét Hướng Dẫn Ghép" +msgstr "Khung Bố Cục" msgid "Center-Cut Safe Areas" -msgstr "Vùng An Toàn Cắt Tâm" +msgstr "Vùng An Toàn Trung Tâm" msgid "Stereoscopy" -msgstr "Nhị Kênh Thuật" +msgstr "Lập Thể" msgid "Texture Space" @@ -77350,23 +84757,23 @@ msgstr "Không Gian Chất Liệu" msgid "Geometry Data" -msgstr "Dữ Liệu Hình Dạng" +msgstr "Dữ Liệu Hình Học" msgid "Start & End Mapping" -msgstr "Bắt Đầu & Kết Thúc Ánh Xạ" +msgstr "Khởi Đầu & Kết Thúc Ánh Xạ" msgid "Adjustments" -msgstr "Chỉnh Sửa" +msgstr "Điều Chỉnh" msgid "Probe" -msgstr "Ánh Sáng Kế" +msgstr "Bộ Dò Ánh Sáng" msgid "Custom Parallax" -msgstr "Thị Sai Tự Chọn" +msgstr "Thị Sai Tùy Chỉnh" msgid "Paragraph" @@ -77374,7 +84781,7 @@ msgstr "Đoạn Văn" msgid "Path Animation" -msgstr "Đường Dẫn Hoạt Hình" +msgstr "Hoạt Họa Đường Dẫn" msgid "Effects" @@ -77382,11 +84789,11 @@ msgstr "Hiệu Ứng" msgid "Spot Shape" -msgstr "Hình Dạng Dấu Chấm" +msgstr "Hình Dạng Đèn Pha" msgid "Text Boxes" -msgstr "Hợp Văn Bản" +msgstr "Hộp Văn Bản" msgid "OpenVDB File" @@ -77394,136 +84801,169 @@ msgstr "Tập Tin OpenVDB" msgid "Create Pose Asset" -msgstr "Chế Tạo Tích Sản Dạng Đứng" +msgstr "Kiến Tạo Tài Sản Tư Thế" msgid "Filters" -msgstr "Bộ Lọc" +msgstr "Các Thao Tác Thanh Lọc" msgid "Snapping" -msgstr "Hút Dính" +msgstr "Bám Dính" msgid "Bake Animation" -msgstr "Nướng Hoạt Hình" +msgstr "Nướng Hoạt Họa" msgid "Advanced Filter" -msgstr "Bộ Lọc Nâng Cấp" +msgstr "Thao Tác Thanh Lọc Cấp Tiến" msgid "Bookmarks" -msgstr "Dấu Sách" +msgstr "Dấu Trang" msgid "Recent" msgstr "Gần Đây" +msgctxt "File browser" +msgid "Volumes" +msgstr "Các Thể Tích Lưu Trữ" + + msgid "Directory Path" msgstr "Đường Dẫn Thư Mục" msgid "Filter Settings" -msgstr "Cài Đặt Bộ Lọc" +msgstr "Sắp Đặt về Thanh Lọc" msgid "Fluid Presets" -msgstr "Đặt Sẵn Chất Lỏng" +msgstr "Sắp Đặt Sẵn cho Chất Lỏng" + + +msgid "Notes" +msgstr "Ghi Chú" + + +msgid "Optimize Animations" +msgstr "Tối Ưu Hóa Hoạt Họa" + + +msgid "Rest & Ranges" +msgstr "Nghỉ & Phạm Vi" + + +msgid "Sampling Animations" +msgstr "Lấy Mẫu Hoạt Họa" + + +msgid "Shape Keys Animation" +msgstr "Hoạt Họa Hình Mẫu" + + +msgid "Scene Graph" +msgstr "Đồ Thị Cảnh" + + +msgid "Optimize Shape Keys" +msgstr "Tối Ưu Hóa các Hình Mẫu" msgid "Exporter Extensions" -msgstr "Các Đuôi Xuất" +msgstr "Các Định Dạng của Trình Xuất Khẩu" msgid "Importer Extensions" -msgstr "Các Đuôi Nhập" +msgstr "Các Định Dạng của Trình Nhập Khẩu" msgid "Active Tool" -msgstr "Dụng Cụ Hoạt Động" +msgstr "Công Cụ đang Hoạt Động" msgid "Overlays" -msgstr "Lớp Che Trên" +msgstr "Lớp Vẽ Lồng" msgid "Guides" -msgstr "Đường Hướng Dẫn" +msgstr "Hướng Dẫn" msgid "UV Editing" -msgstr "Biên Tập UV" +msgstr "Biên Soạn UV" msgid "Clone from Image/UV Map" -msgstr "Bản sao từ Ảnh/Bản Đồ UV" +msgstr "Rập Khuôn từ Hình Ảnh/Ánh Xạ UV" msgid "Color Picker" -msgstr "Bảng Chọn Màu Sắc" +msgstr "Trình Chọn Màu" msgid "Color Palette" -msgstr "Bảng Màu Sắc" +msgstr "Bảng Pha Màu" msgid "Scopes" -msgstr "Các Kế" +msgstr "Kế Đo Lường" msgid "Sample Line" -msgstr "Đường Mẫu Vật" +msgstr "Lấy Mẫu Vật về Đường Vẽ" msgctxt "Operator" msgid "Sample" -msgstr "Mẫu Vật" +msgstr "Lấy Mẫu Vật" msgid "Sample pixel values under the cursor" -msgstr "Lắy mẫu vật giá trị của điểm ảnh ở dưới con trỏ" +msgstr "Lấy mẫu vật các giá trị điểm ảnh nằm dưới con trỏ" msgctxt "Operator" msgid "Annotate" -msgstr "Lời Ghi Chú" +msgstr "Chú Thích" msgctxt "Operator" msgid "Annotate Line" -msgstr "Đường Lời Ghi Chú" +msgstr "Chú Thích Đường Thẳng" msgctxt "Operator" msgid "Annotate Polygon" -msgstr "Đa Gíac Lời Ghi Chứ" +msgstr "Chú Thích Đa Giác" msgctxt "Operator" msgid "Annotate Eraser" -msgstr "Cục Bôi Lời Ghi Chú" +msgstr "Tẩy Xóa Chú Thích" msgctxt "Operator" msgid "Tweak" -msgstr "Chỉnh" +msgstr "Hiệu Chỉnh" msgctxt "Operator" msgid "Select Box" -msgstr "Chọn Hộp" +msgstr "Lựa Chọn bằng Khoanh Vùng Hình Hộp" msgctxt "Operator" msgid "Select Circle" -msgstr "Chọn Vòng Tròn" +msgstr "Lựa Chọn bằng Hình Tròn" msgctxt "Operator" msgid "Select Lasso" -msgstr "Chọn Dây Trói" +msgstr "Lựa Chọn bằng Dây Thòng Lọng" msgctxt "Operator" @@ -77532,36 +84972,36 @@ msgstr "Con Trỏ" msgid "Set the cursor location, drag to transform" -msgstr "Đặt vị trí con trỏ, kéo để biến hóa" +msgstr "Định vị con trỏ, kéo rê để biến hóa" msgctxt "Operator" msgid "Scale" -msgstr "Phóng To" +msgstr "Tỷ Lệ" msgid "Supports any combination of grab, rotate, and scale at once" -msgstr "Được hỗ trợ bất cứ sự phối hợp của kéo, xoay, và phóng to một lượt" +msgstr "Hỗ trợ các kiểu kết hợp của các hành động cùng một lúc: tóm nắm, xoay chiều, đổi tỷ lệ" msgctxt "Operator" msgid "Rip Region" -msgstr "Xé Vùng" +msgstr "Phân Xé Vùng" msgctxt "Operator" msgid "Grab" -msgstr "Cầm" +msgstr "Túm Nắm" msgctxt "Operator" msgid "Relax" -msgstr "Giãn" +msgstr "Nới Lỏng" msgctxt "Operator" msgid "Pinch" -msgstr "Ngắc" +msgstr "Nhúm" msgctxt "Operator" @@ -77571,70 +85011,74 @@ msgstr "Vẽ" msgctxt "Operator" msgid "Soften" -msgstr "Mềm Hóa" +msgstr "Làm Mềm Mại" msgctxt "Operator" msgid "Smear" -msgstr "Nhẹp" +msgstr "Bôi Nhòe" msgctxt "Operator" msgid "Clone" -msgstr "Chép Lại" +msgstr "Rập Khuôn" msgctxt "Operator" msgid "Mask" -msgstr "Mặt Nạ" +msgstr "Màn Chắn Lọc" msgid "Tiling" -msgstr "Ô Hóa" +msgstr "Bố Trí Ô Cờ" msgid "Texture Mask" -msgstr "Mặt Nạ Chất Liệu" +msgstr "Màn Chắn Lọc Chất Liệu" msgid "Histogram" -msgstr "Sơ Đồ Thống Kê" +msgstr "Biểu Đồ Tần Xuất" msgid "Vectorscope" -msgstr "Kế Vectơ" +msgstr "Véctơ Kế" msgid "Waveform" -msgstr "Hình Dạng Sóng" +msgstr "Hình Sóng" msgid "Freestyle Line" -msgstr "Phong Cách Vẽ Tự Do" +msgstr "Đường Nét PCTD" msgid "Material settings" -msgstr "Cài đặt vật liệu" +msgstr "Sắp Đặt về Nguyên Vật Liệu" msgid "Material Presets" -msgstr "Đặt Sẵn Vật Liệu" +msgstr "Nguyên Vật Liệu Sắp Đặt Sẵn" msgid "Grease Pencil Material Slots" -msgstr "Khe Vật Liệu Bút Sáp" +msgstr "Khe Nguyên Vật Liệu của Bút Chì Dầu" msgid "Math Vis" -msgstr "Hiển Thị Toán" +msgstr "Diễn Họa Toán Học" msgid "Math Vis Console" -msgstr "Giao Điền Khiển Hiển Thị Toán" +msgstr "Bàn Giao Tiếp Diễn Họa Toán Học" msgid "Backdrop" -msgstr "Cảnh Sau" +msgstr "Phông Nền" + + +msgid "Modes" +msgstr "Các Chế Độ" msgid "Slot" @@ -77642,77 +85086,86 @@ msgstr "Khe" msgid "Predefined node color" -msgstr "Màu giao điểm được đặt sẵn" +msgstr "Màu nút sắp đặt sẵn" + + +msgid "Simulation State" +msgstr "Trạng Thái Mô Phỏng" msgctxt "Operator" msgid "Links Cut" -msgstr "Cắt Liên Kết" +msgstr "Ngắt Kết Nối" msgid "Delta Transform" -msgstr "Biến Hóa Lệch Lạc" +msgstr "Biến Hóa Delta" msgid "Scale by Face Size" -msgstr "Phóng To bằng Kích Cỡ Mặt" +msgstr "Tỷ Lệ Hóa theo Kích Thước Mặt" msgid "Object Scatter" -msgstr "Rải Ra Vật Thể" +msgstr "Phân Tán Rải Rác Đối Tượng" msgid "Boid Brain" -msgstr "Ốc Quần thể" +msgstr "Bộ Não của Quần Thể" msgid "Clumping" -msgstr "Dính Bó" +msgstr "Khóm Lại" msgid "Clump Noise" -msgstr "Huyên Náo Bó" +msgstr "Nhiễu Khóm" msgid "Kink" -msgstr "Thắt Nút" +msgstr "Xoắn Vặn" msgid "Parting" -msgstr "Chẻ" +msgstr "Chia Ngôi" msgctxt "ParticleSettings" msgid "Roughness" -msgstr "Độ Nhám" +msgstr "Độ Rối" + + +msgctxt "ParticleSettings" +msgid "Emission" +msgstr "Phát Xạ" msgid "Field Weights" -msgstr "Quyền Lượng Trường" +msgstr "Trọng Lượng Trường" msgid "Force Field Settings" -msgstr "Cài Đặt Lực Trường" +msgstr "Sắp Đặt của Trường Lực" msgid "Type 1" -msgstr "Loại 1" +msgstr "Kiểu 1" msgid "Type 2" -msgstr "Loại 2" +msgstr "Kiểu 2" msgid "Hair Dynamics" -msgstr "Động Lý Tóc" +msgstr "Động Lực Học của Tóc" msgid "Collisions" -msgstr "Va Chạm" +msgstr "Va Đập" msgid "Hair Dynamics Presets" -msgstr "Đặt Sẵn Động Lý Tóc" +msgstr "Cấu Hình về Động Lực Học của Tóc" msgid "Structure" @@ -77720,7 +85173,7 @@ msgstr "Cấu Trúc" msgid "Hair Shape" -msgstr "Hình Dạng Tóc" +msgstr "Hình Dáng của Tóc" msgid "Battle" @@ -77728,7 +85181,7 @@ msgstr "Chiến Đấu" msgid "Misc" -msgstr "Lạt Vạt" +msgstr "Linh Tinh" msgid "Movement" @@ -77736,123 +85189,127 @@ msgstr "Chuyển Động" msgid "Deflection" -msgstr "Chệch Hướng" +msgstr "Chuyển Động Lệch Hướng" msgid "Fluid Interaction" -msgstr "Tương tác Chất Lỏng" +msgstr "Sự Tương Tác của Chất Lỏng" msgid "Springs" -msgstr "Lò Xo" +msgstr "Lực Đàn Hồi" msgid "Viscoelastic Springs" -msgstr "Lò Xo Giãn Tắt Dần" +msgstr "Lực Đàn Hồi có Tính Nhớt" msgid "Forces" -msgstr "Lực" +msgstr "Tính Năng của Lực" msgid "Border Collisions" -msgstr "Va Chạm Ranh Giới" +msgstr "Ranh Giới Va Đập" msgid "Internal Springs" -msgstr "Lò Xo Nội Bộ" +msgstr "Nội Lực Đàn Hồi" msgid "Object Collisions" -msgstr "Va Chạm Vật Thể" +msgstr "Sự Va Đập của Đối Tượng" msgid "Physical Properties" -msgstr "Đặc Tính Vật Lý" +msgstr "Tính Chất Vật Lý" msgid "Property Weights" -msgstr "Quyền Lượng Đặc Tính" +msgstr "Trọng Lượng của Tính Chất" msgid "Self Collisions" -msgstr "Tự Va Chạm" +msgstr "Sự Va Đập vào Bản Thân" msgid "Softbody & Cloth" -msgstr "Thân Mềm & Vải" +msgstr "Thân Mềm & Vải Vóc" msgid "Diffusion" -msgstr "Sự Tán Xạ" +msgstr "Khuếch Tán" msgid "Falloff Ramp" -msgstr "Dốc Sự Giảm" +msgstr "Dốc Màu Suy Giảm Dần" msgid "Smudge" -msgstr "Nhòe" +msgstr "Làm Bẩn/Nhòe" msgid "Waves" -msgstr "Sóng" +msgstr "Làn Sóng" msgid "Paintmaps" -msgstr "Bản Đồ Sơn" +msgstr "Ánh Xạ Sơn" msgid "Wetmaps" -msgstr "Bản Độ Ướt" +msgstr "Ánh Xạ Độ Ướt" msgid "Force Fields" -msgstr "Lực Trường" +msgstr "Trường Lực" msgid "Flow Source" -msgstr "Nguồn Lưu" +msgstr "Nguồn Phát" + + +msgid "Simulation Nodes" +msgstr "Các Nút Mô Phỏng" msgid "Sensitivity" -msgstr "Độ Nhạy Cảm" +msgstr "Độ Mẫn Cảm" msgid "Surface Response" -msgstr "Phản Ứng Bề Mặt" +msgstr "Phản Ứng của Bề Mặt" msgid "Override Iterations" -msgstr "Lặp Lại Vượt Quyền" +msgstr "Đổi Số Lần Lặp Lại" msgid "Dynamics" -msgstr "Động Lý" +msgstr "Động Năng" msgid "Deactivation" -msgstr "Tắt Hoạt Động" +msgstr "Giải Hoạt" msgid "Self Collision" -msgstr "Tự Va Chạm" +msgstr "Tự Va Đập" msgid "Aerodynamics" -msgstr "Khí Động Lực Học" +msgstr "Khí Động Lực" msgid "Strengths" -msgstr "Sức Lực" +msgstr "Mức Độ" msgid "Diagnostics" -msgstr "Khám Phá" +msgstr "Điều Tra/Kiểm Nghiệm" msgid "Helpers" -msgstr "Đồ Giúp Đỡ" +msgstr "Tính Chất Hỗ Trợ" msgid "Viscosity" @@ -77860,51 +85317,67 @@ msgstr "Độ Nhớt" msgid "Show options for the properties editor" -msgstr "Hiện sự lựa chọn cho trình biên soạn đặc tính" +msgstr "Hiển thị các tùy chọn cho trình biên soạn tính chất" + + +msgid "Creates a panel in the View Layer context of the properties editor" +msgstr "Tạo một bảng trong ngữ cảnh Tầng Lớp Góc Nhìn Lớp của trình biên soạn tính chất" msgid "Freestyle Line Style SVG Export" -msgstr "Xuất Phong Cách Nét Tự Do SVG" +msgstr "Xuất Khẩu Phong Cách Đường Nét ra Định Dạng SVG" msgid "Creates a Panel in the render context of the properties editor" -msgstr "Chế tạo một Bảng trong bối cảnh kết xuất của trình biên soạn đặc tính" +msgstr "Kiến tạo một Bảng trong ngữ cảnh kết xuất của trình biên soạn tính chất" msgid "Freestyle SVG Export" -msgstr "Xuất Nét Tự Do SVG" +msgstr "Xuất Khẩu Phong Cách Đường Nét ra Định Dạng SVG" msgid "Bloom" -msgstr "Nở Ra" +msgstr "Lóa Sáng" msgid "Indirect Lighting" -msgstr "Ánh Sáng Gián Tiếp" +msgstr "Áng Sáng Gián Tiếp" + + +msgid "Denoising" +msgstr "Lọc Nhiễu" + + +msgid "Raytracing" +msgstr "Dò Tia" + + +msgid "Screen Tracing" +msgstr "Dò Tia Màn Hình" msgid "Shadows" -msgstr "Bống Tối" +msgstr "Bóng Tối" msgid "Screen Space Reflections" -msgstr "Phản Xạ Không Gian Màn" +msgstr "Phản Quang trong Không Gian Màn Hình" msgid "Volumetrics" -msgstr "Về Thể Tích" +msgstr "Thể Tích" msgid "Volumetric Lighting" -msgstr "Ánh Sáng Thể Tích" +msgstr "Chiếu Sáng trong Thể Tích" msgid "Volumetric Shadows" -msgstr "Bóng Tối Thể Tích" +msgstr "Bóng Tối trong Thể Tích" msgid "Encoding" -msgstr "Mã Hoá" +msgstr "Mã Hóa" msgid "Audio" @@ -77912,15 +85385,23 @@ msgstr "Âm Thanh" msgid "Video" -msgstr "Video" +msgstr "Phim Video" + + +msgid "FFmpeg Presets" +msgstr "Cài Đặt Trước về FFmpeg" msgid "Format Presets" -msgstr "Đặt Sẵn Định Dạng" +msgstr "Những Sắp Đặt Sẵn về Định Dạng" + + +msgid "Hydra Debug" +msgstr "Điều Tra Gỡ Lỗi Hydra" msgid "Views" -msgstr "Màn" +msgstr "Góc Nhìn" msgid "Metadata" @@ -77928,84 +85409,84 @@ msgstr "Siêu Dữ Liệu" msgid "Burn Into Image" -msgstr "Cháy Vào Ảnh" +msgstr "Đóng Dấu vào Hình Ảnh" msgid "Note" -msgstr "Tin Nhắn" +msgstr "Ghi Chú" msgid "Time Stretching" -msgstr "Kéo Dài Thời Gian" +msgstr "Kéo Giãn Thời Gian" msgid "Keyframing Settings" -msgstr "Cài Đặt Bức Ảnh Mẫu" +msgstr "Sắp Đặt về Khung Khóa Hóa" msgid "Onion Skin" -msgstr "Bóng Ma" +msgstr "Bóc Vỏ Hành" msgid "Cache Settings" -msgstr "Cài Đặt Đệm Chứa" +msgstr "Sắp Đặt của Bộ Đệm Nhớ" msgid "Frame Overlay" -msgstr "Khung Che Trên" +msgstr "Vẽ Lồng Khung Hình" msgid "Scene Strip Display" -msgstr "Hiển Thị Đoạn Cảnh" +msgstr "Hiển Thị Dải của Cảnh" msgid "Preview Overlays" -msgstr "Lớp Che Dự Khán" +msgstr "Xem Trước các Lớp Vẽ Lồng" msgid "Proxy Settings" -msgstr "Cài Đặt Đại Lý" +msgstr "Sắp Đặt về Đại Diện" msgid "Sequencer Overlays" -msgstr "Lớp Che Bộ Trình Tự" +msgstr "Lồng Đè trong Trình Phối Hình" msgid "Strip Cache" -msgstr "Đệm Chứa Đoạn" +msgstr "Bộ Đệm Nhớ của Dải" msgid "Strip Proxy & Timecode" -msgstr "Đặi Lý & Mã Thời Gian Đoạn" +msgstr "Đại Diện & Mã Thời Gian của Dải" msgctxt "Operator" msgid "Blade" -msgstr "Lưới Dao" +msgstr "Lưỡi Dao" msgid "Feature Weights" -msgstr "Quyền Lượng Đặc Trưng:" +msgstr "Trọng Lượng Nét Đặc Trưng" msgid "Find & Replace" -msgstr "Tìm & Thay Thế" +msgstr "Lùng Tìm & Thay Thế" msgid "Auto Keyframing" -msgstr "Bức Ảnh Mẫu Tự Động" +msgstr "Tự Động Khung Khóa Hóa" msgid "Playback" -msgstr "Hát Lại" +msgstr "Chơi Lại" msgid "Rename Active Item" -msgstr "Đổi Tên Mặt Hàng Hoạt Động" +msgstr "Đổi Tên Mục đang Hoạt Động" msgid "Rename Marker" -msgstr "Đổi Tên Ký Hiệu" +msgstr "Đổi Tên Dấu Mốc" msgid "" @@ -78014,28 +85495,32 @@ msgid "" " " msgstr "" "\n" -" Bảng nhảy lên cho tùy chọn thêm mà không vừa vào khúc đầu của cài đặt dụng cụ\n" +" Bảng bật đè lên trên (Popover) để cho thêm những tùy chọn bổ sung không khít vừa thanh tiêu đề của phần sắp đặt về công cụ\n" " " msgid "Extra Options" -msgstr "Tùy Chọn Thêm" +msgstr "Những Tùy Chọn Bổ Sung" msgid "I18n Update Translation" -msgstr "Nâng Cấp Dịch I18n" +msgstr "Cập Nhật Phiên Dịch I18n" msgid "Timeline" -msgstr "Thời Biểu" +msgstr "Lịch Trình Thời Gian" + + +msgid "Copy on Duplicate" +msgstr "Sao Chép trên Bản Nhân Đôi" msgid "New Objects" -msgstr "Vật Thể Mới" +msgstr "Đối Tượng Mới" msgid "Debugging" -msgstr "Sửa Sai Lầm" +msgstr "Điều Tra Lỗi" msgid "New Features" @@ -78043,39 +85528,51 @@ msgstr "Tính Năng Mới" msgid "Prototypes" -msgstr "Mô Hình Thử Nghiệm" +msgstr "Mô Hình Mẫu Đầu Tiên" + + +msgid "Extension Repositories" +msgstr "Kho Tiện Ích Mở Rộng" msgid "Applications" -msgstr "Ứng Dụng" +msgstr "Trình Ứng Dụng" msgid "Asset Libraries" -msgstr "Thư Viện Tích Sản" +msgstr "Thư Viện Tài Sản" msgid "Development" -msgstr "Thử Nghiệm" +msgstr "Xây Dựng" + + +msgid "Script Directories" +msgstr "Các Thư Mục Tập Lệnh" msgid "Tablet" -msgstr "Bảng Vẽ" +msgstr "Bảng Điện" + + +msgid "Touchpad" +msgstr "Bàn Di Chuột" msgid "Editors" -msgstr "Các Trình Biên Soạn" +msgstr "Trình Biên Soạn" msgid "Menus" -msgstr "Các Danh Bạ" +msgstr "Trình Đơn" msgid "Open on Mouse Over" -msgstr "Mở Khi Chuột Lên Trên" +msgstr "Mở Khi Chuột Nằm Trên" msgid "Pie Menus" -msgstr "Danh Bạ Quạt" +msgstr "Trình Đơn Hình Rẻ Quạt" msgid "Temporary Editors" @@ -78088,15 +85585,15 @@ msgstr "Kết Xuất Văn Bản" msgctxt "WindowManager" msgid "Translation" -msgstr "Phiên Dịch" +msgstr "Dịch Chuyển/Phiên Dịch" msgid "Preferences Navigation" -msgstr "Chuyển Hướng Tùy Chọn" +msgstr "Trình Biên Soạn Ánh Sáng Studio" msgid "Fly & Walk" -msgstr "Bay & Đi Bộ" +msgstr "Bay Lượn & Đi bộ" msgid "Walk" @@ -78104,23 +85601,23 @@ msgstr "Đi Bộ" msgid "Orbit & Pan" -msgstr "Quay & Dời" +msgstr "Quỹ Đạo & Lia" msgid "3D Mouse Settings" -msgstr "Cài Đặt Chuột 3D" +msgstr "Sắp Đặt về Chuột 3D" msgid "Save Preferences" -msgstr "Lưu Tùy Chọn" +msgstr "Lưu các Cài Đặt Sở Thích" msgid "Auto Run Python Scripts" -msgstr "Tự Động Chạy Văn Thảo Python" +msgstr "Tự Động Thi hành Tập Lệnh Python" msgid "Blend Files" -msgstr "Các Tập Tin Blend" +msgstr "Tập Tin Blend" msgid "Editor" @@ -78128,7 +85625,7 @@ msgstr "Trình Biên Soạn" msgid "Studio Lights" -msgstr "Đèn Ánh Sáng Xưởng" +msgstr "Ánh Sáng Studio" msgid "MatCaps" @@ -78144,23 +85641,27 @@ msgstr "Thiết Bị Kết Xuất Cycles" msgid "Memory & Limits" -msgstr "Bộ Nhớ & Giới Hạn" +msgstr "Bộ Nhớ & các Giới Hạn" msgid "Operating System Settings" -msgstr "Cài Đặt Hệ Điều Hành" +msgstr "Các Sắp Đặt của Hệ Điều Hành" + + +msgid "Text Editor Presets" +msgstr "Cài Đặt Trước của Trình Biên Soạn Văn Bản" msgid "Bone Color Sets" -msgstr "Tập Màu Sắc Xương" +msgstr "Bộ Màu Sắc của Xương" msgid "Theme Space" -msgstr "Phong Cách - Không Gian" +msgstr "Kiểu Mẫu của Không Gian" msgid "Theme Space List" -msgstr "Phong Cách - Danh Sách Không Gian" +msgstr "Kiểu Mẫu của Không Gian Danh Sách" msgid "Panel Colors" @@ -78168,15 +85669,31 @@ msgstr "Màu Bảng" msgid "Collection Colors" -msgstr "Màu Sưu Tập" +msgstr "Màu của Bộ Sưu Tập" + + +msgid "Dope Sheet/Timeline" +msgstr "Bảng Hành Động/Dòng Thời Gian" + + +msgid "File/Asset Browser" +msgstr "Trình Duyệt Tập Tin/Tài Nguyên" + + +msgid "Graph Editor/Drivers" +msgstr "Trình Biên Soạn Đồ Thị/Điều Vận" + + +msgid "Image/UV Editor" +msgstr "Trình Biên Soạn Hình Ảnh/UV" msgid "Axis & Gizmo Colors" -msgstr "Màu Trục & Đồ Đạc" +msgstr "Màu của Trục & Gizmo" msgid "Icon Colors" -msgstr "Màu Biểu Tượng" +msgstr "Màu của Biểu Tượng" msgid "Styles" @@ -78184,23 +85701,27 @@ msgstr "Phong Cách" msgid "Transparent Checkerboard" -msgstr "Ca Rô Trong Suốt" +msgstr "Bảng Ô Cờ Trong Suốt" msgid "Menu" -msgstr "Danh Bạ" +msgstr "Trình Đơn" + + +msgid "Menu Background" +msgstr "Nền Trình Đơn" msgid "Menu Item" -msgstr "Mặt Hàng Danh Bạ" +msgstr "Trình Mục" msgid "Number Field" -msgstr "Số Trường" +msgstr "Ô Số" msgid "Value Slider" -msgstr "Trơn Trượt Giá Trị" +msgstr "Thanh Trượt Đổi Giá Trị" msgid "Option" @@ -78208,19 +85729,19 @@ msgstr "Tùy Chọn" msgid "Pie Menu" -msgstr "Danh Bạ Quạt" +msgstr "Trình Đơn Hình Rẻ Quạt" msgid "Progress Bar" -msgstr "Thanh Tiến Triển" +msgstr "Thanh Tiến Trình" msgid "Pulldown" -msgstr "Kéo Xuống" +msgstr "Trình Đơn Thả" msgid "Radio Buttons" -msgstr "Nút Vô Tuyến" +msgstr "Nút Chọn" msgid "Scroll Bar" @@ -78232,11 +85753,11 @@ msgstr "Tab" msgid "Toolbar Item" -msgstr "Mặt Hàng Thanh Dụng Cụ" +msgstr "Thành Phần của Thanh Công Cụ" msgid "Strip Colors" -msgstr "Màu Đoạn" +msgstr "Màu của Dải" msgid "Text Style" @@ -78248,63 +85769,75 @@ msgstr "Giao Diện Người Dùng" msgid "Gradient Colors" -msgstr "Màu Chuyển Sắc" +msgstr "Màu Dốc" msgid "Global Transform" msgstr "Biến Hóa Toàn Cầu" +msgid "Mirror Options" +msgstr "Các Tùy Chọn Phản Chiếu Đối Xứng" + + msgid "Curves Sculpt Add Curve Options" -msgstr "Tùy Chọn Cho Thêm Đường Cong Khắc Đường Cong" +msgstr "Điêu Khắc Đường Cong: Các Tùy Chọn về Thêm Đường Cong" msgid "Curves Grow/Shrink Scaling" -msgstr "Phóng To Lớn Lên/Rút Nhỏ cho Đường Cong" +msgstr "Tỷ Lệ Phình Ra/Thu Lại của Đường Cong" + + +msgid "Curves Sculpt Parameter Falloff" +msgstr "Điêu Khắc Đường Cong Tham Số Suy Giảm Dần" msgid "Brush Presets" -msgstr "Đặt Sẵn Cho Bút" +msgstr "Sắp Đặt Sẵn Đầu Bút" msgid "Drawing Plane" -msgstr "Mặt Phẳng Vẽ" +msgstr "Bề Diện Tác Họa" msgid "Multi Frame" -msgstr "Đa Bức Ảnh" +msgstr "Đa Khung Hình" msgid "Stroke Placement" -msgstr "Vị Trí Đặt Nét" +msgstr "Phương Pháp Đặt Nét Vẽ" + + +msgid "Auto-masking" +msgstr "Tự động chắn lọc" msgid "Masking" -msgstr "Mạt Nạ" +msgstr "Chắn Lọc" msgid "Curve Edit Mode" -msgstr "Chế Đồ Biên Tập Đường Cong" +msgstr "Chế Độ Biên Soạn Đường Cong" msgid "Mesh Edit Mode" -msgstr "Chế Độ Biên Tập Mạng Lưới" +msgstr "Chế Độ Biên Soạn Khung Lưới" msgid "Measurement" -msgstr "Đo" +msgstr "Đo Lường" msgid "Motion Tracking" -msgstr "Theo Dõi Chuyển Động" +msgstr "Giám Sát Chuyển Động" msgid "Pose Library" -msgstr "Thư Viện Dạng Đứng" +msgstr "Thư Viện Tư Thế" msgid "3D-Print" -msgstr "In-3D" +msgstr "In Ấn-3D" msgid "Analyze" @@ -78312,51 +85845,51 @@ msgstr "Phân Tích" msgid "Quad View" -msgstr "Tư Phân Màn" +msgstr "Bốn Góc Nhìn" msgid "Auto-Masking" -msgstr "Tự Động-Mặt Nạ" +msgstr "Tự Động Chắn Lọc" msgid "Wire Color" -msgstr "Màu Sợi Dây" +msgstr "Màu của Dây" msgid "Compositor" -msgstr "Bộ Ghép" +msgstr "Trình Tổng Hợp" msgid "Shadow Settings" -msgstr "Cài Đặt Bóng Tối" +msgstr "Sắp Đặt về Bóng Tối" msgid "SSAO Settings" -msgstr "Cài Đặt Hấp Thụ Bao Quanh" +msgstr "Sắp Đặt về SSAO" msgid "Stencil Mask" -msgstr "Mặt Nạ Khuôn Tô" +msgstr "Khuôn-In Chắn Lọc" msgctxt "Operator" msgid "Scale Cage" -msgstr "Phóng To Lồng" +msgstr "Khung Lồng Đổi Tỷ Lệ" msgctxt "Operator" msgid "Measure" -msgstr "Đo" +msgstr "Đo Lường" msgctxt "Operator" msgid "Breakdowner" -msgstr "Bức Ảnh Mẫu Phụ" +msgstr "Trình Phân Tích" msgctxt "Operator" msgid "Push" -msgstr "Đẩy" +msgstr "Đẩn" msgctxt "Operator" @@ -78366,31 +85899,31 @@ msgstr "Lăn" msgctxt "Operator" msgid "Bone Size" -msgstr "Kích Cỡ Xương" +msgstr "Cỡ Xương" msgctxt "Operator" msgid "Bone Envelope" -msgstr "Bao Bì Xương" +msgstr "Phong Bao Xương" msgid "Extrude freely or along an axis" -msgstr "Kéo ra tự do hay theo một trục" +msgstr "Đẩy trồi (kéo ra) tự do hoặc dọc theo một trục" msgctxt "Operator" msgid "Extrude Along Normals" -msgstr "Kéo Ra Theo Pháp Tuyến" +msgstr "Đẩy Trồi Dọc Theo Pháp Tuyến" msgctxt "Operator" msgid "Extrude Individual" -msgstr "Kéo Ra Riêng" +msgstr "Đẩy Trồi Cá Nhân" msgctxt "Operator" msgid "Offset Edge Loop Cut" -msgstr "Dịch Cắt Vòng Cạnh" +msgstr "Dịch Chuyển Vòng Cạnh Cắt" msgctxt "Operator" @@ -78400,17 +85933,17 @@ msgstr "Dao" msgctxt "Operator" msgid "Poly Build" -msgstr "Xây Dựng Đa Giác" +msgstr "Dựng Đa Giác" msgctxt "Operator" msgid "Spin Duplicates" -msgstr "Xoay Bản Sao" +msgstr "Xoáy Nhân Đôi" msgctxt "Operator" msgid "Rip Edge" -msgstr "Xé Cạnh" +msgstr "Phân Xé Cạnh" msgctxt "Operator" @@ -78419,20 +85952,25 @@ msgstr "Bán Kính" msgid "Expand or contract the radius of the selected curve points" -msgstr "Kéo ra hay đụng bán kính của các điểm đường cong được chọn" +msgstr "Tăng (nới rộng/nở) hoặc giảm (thu lại/co) bán kính của các điểm đường cong được chọn" + + +msgctxt "Operator" +msgid "Select Text" +msgstr "Chọn Văn Bản" msgctxt "Operator" msgid "Comb" -msgstr "Lược" +msgstr "Chải bằng Lược" msgid "Comb hairs" -msgstr "Chạy tóc" +msgstr "Chải tóc" msgid "Smooth hairs" -msgstr "Mịn tóc" +msgstr "Làm cho tóc mịn màng" msgid "Add hairs" @@ -78441,20 +85979,20 @@ msgstr "Thêm tóc" msgctxt "Operator" msgid "Length" -msgstr "Bề Dài" +msgstr "Chiều Dài" msgid "Make hairs longer or shorter" -msgstr "Làm tóc dài hơn hay ngắn hơn" +msgstr "Làm tóc dài ra hay ngắn lại" msgctxt "Operator" msgid "Puff" -msgstr "Sưng" +msgstr "Làm Bồng Lên" msgid "Make hairs stand up" -msgstr "Làm tóc đứng lên" +msgstr "Làm bồng tóc lên" msgid "Cut hairs" @@ -78463,16 +86001,16 @@ msgstr "Cắt tóc" msgctxt "Operator" msgid "Weight" -msgstr "Quyền Lượng" +msgstr "Trọng Lượng" msgid "Weight hair particles" -msgstr "Làm nặng hạt tóc" +msgstr "Đổi trọng lượng các hạt tóc" msgctxt "Operator" msgid "Draw Sharp" -msgstr "Vẽ Bén" +msgstr "Vẽ Sắc Nhọn" msgctxt "Operator" @@ -78482,77 +86020,77 @@ msgstr "Đất Sét" msgctxt "Operator" msgid "Clay Strips" -msgstr "Dãy Đất Sét" +msgstr "Thỏi Đất Sét" msgctxt "Operator" msgid "Clay Thumb" -msgstr "Ngón Tay Cái Đất Sét" +msgstr "Dí Ngón Cái Trên Đất Sét" msgctxt "Operator" msgid "Layer" -msgstr "Lớp" +msgstr "Tầng Lớp" msgctxt "Operator" msgid "Inflate" -msgstr "Phình Lên" +msgstr "Bơm Phồng" msgctxt "Operator" msgid "Blob" -msgstr "Cầu Thể" +msgstr "Viên Tròn" msgctxt "Operator" msgid "Crease" -msgstr "Nhăn" +msgstr "Nếp Gấp" msgctxt "Operator" msgid "Flatten" -msgstr "Bằng Phẳng Hóa" +msgstr "Dát Phẳng" msgctxt "Operator" msgid "Scrape" -msgstr "Càu" +msgstr "Cạo" msgctxt "Operator" msgid "Multi-plane Scrape" -msgstr "Cào Đa-Mặt Phẳng" +msgstr "Cạo Đa Bề Diện" msgctxt "Operator" msgid "Elastic Deform" -msgstr "Méo Hóa Dẻo" +msgstr "Biến Dạng Đàn Hồi" msgctxt "Operator" msgid "Snake Hook" -msgstr "Móc" +msgstr "Móc Hình Rắn" msgctxt "Operator" msgid "Thumb" -msgstr "Ngon Tay Cái" +msgstr "Dí/Ngón Cái" msgctxt "Operator" msgid "Pose" -msgstr "Dạng Đứng" +msgstr "Tư Thế" msgctxt "Operator" msgid "Nudge" -msgstr "Dời Chút" +msgstr "Đẩy Nhẹ" msgctxt "Operator" msgid "Slide Relax" -msgstr "Giãn Trơn Trượt" +msgstr "Trượt Đẩy Nới Lỏng" msgctxt "Operator" @@ -78562,7 +86100,7 @@ msgstr "Ranh Giới" msgctxt "Operator" msgid "Cloth" -msgstr "Vải" +msgstr "Vải Vóc" msgctxt "Operator" @@ -78572,17 +86110,17 @@ msgstr "Đơn Giản Hóa" msgctxt "Operator" msgid "Draw Face Sets" -msgstr "Vẽ Tập Hợp Mặt" +msgstr "Vẽ Mặt Ấn Định" msgctxt "Operator" msgid "Multires Displacement Eraser" -msgstr "Đồ Bôi Dịch Đa Độ Phân Giải" +msgstr "Tẩy Xóa Dời Hình Đa Phân Giải" msgctxt "Operator" msgid "Multires Displacement Smear" -msgstr "Nhẹp Dịch Đa Độ Phân Giải" +msgstr "Bôi Nhòe Dời Hình Đa Phân Giải" msgctxt "Operator" @@ -78592,57 +86130,57 @@ msgstr "Sơn" msgctxt "Operator" msgid "Box Mask" -msgstr "Mặt Nạ Hộp" +msgstr "Màn Chắn Lọc Hình Hộp" msgctxt "Operator" msgid "Lasso Mask" -msgstr "Mặt Nạ Dây Trói" +msgstr "Màn Chắn Lọc Hình Dây Thòng Lọng" msgctxt "Operator" msgid "Line Mask" -msgstr "Mặt Nạ Đường" +msgstr "Chắn Lọc Đường Thẳng" msgctxt "Operator" msgid "Box Hide" -msgstr "Ẩn Hộp" +msgstr "Ẩn Hình Hộp" msgctxt "Operator" msgid "Box Face Set" -msgstr "Tập Hợp Mặt Hộp" +msgstr "Mặt Ấn Định Hình Hộp" msgctxt "Operator" msgid "Lasso Face Set" -msgstr "Tập Hợp Mặt Dây Trói" +msgstr "Mặt Ấn Định bằng Dây Thòng Lọng" msgctxt "Operator" msgid "Box Trim" -msgstr "Cắt Bằng Hộp" +msgstr "Cắt Xén Hình Hộp" msgctxt "Operator" msgid "Lasso Trim" -msgstr "Cắt Bằng Dây Trói" +msgstr "Cắt Xén bằng Dây Thòng Lọng" msgctxt "Operator" msgid "Line Project" -msgstr "Chiếu Đường" +msgstr "Phóng Chiếu Đường Thẳng" msgctxt "Operator" msgid "Mesh Filter" -msgstr "Bộ Lọc Mạng Lưới" +msgstr "Bộ Lọc Khung Lưới" msgctxt "Operator" msgid "Cloth Filter" -msgstr "Bộ Lọc Vải" +msgstr "Bộ Lọc Vải Vóc" msgctxt "Operator" @@ -78652,57 +86190,57 @@ msgstr "Bộ Lọc Màu" msgctxt "Operator" msgid "Blur" -msgstr "Mờ Hóa" +msgstr "Làm Nhòe Mờ" msgctxt "Operator" msgid "Average" -msgstr "Trung Bình" +msgstr "Trung Bình Hóa" msgctxt "Operator" msgid "Gradient" -msgstr "Nabl" +msgstr "Dốc Màu" msgctxt "Operator" msgid "Sample Weight" -msgstr "Mẫu Vật Quyền Lượng" +msgstr "Lấy Mẫu Trọng Lượng" msgctxt "Operator" msgid "Sample Vertex Group" -msgstr "Mẫu Vật Nhóm Đỉnh" +msgstr "Lấy Mẫu Nhóm Điểm Đỉnh" msgctxt "Operator" msgid "Erase" -msgstr "Xóa" +msgstr "Tẩy Xóa" msgctxt "Operator" msgid "Tint" -msgstr "Màu Nhiễm" +msgstr "Nhuốm Màu" msgctxt "Operator" msgid "Cutter" -msgstr "Đồ Cắt" +msgstr "Công Cụ Cắt" msgctxt "Operator" msgid "Line" -msgstr "Nét" +msgstr "Đường Nét/Thẳng/Dòng" msgctxt "Operator" msgid "Polyline" -msgstr "Đường Đa Điểm" +msgstr "Đường Đa Giác" msgctxt "Operator" msgid "Arc" -msgstr "Hình Cung" +msgstr "Đường Cung" msgctxt "Operator" @@ -78712,73 +86250,92 @@ msgstr "Đường Cong" msgctxt "Operator" msgid "Box" -msgstr "Hộp" +msgstr "Hình Hộp" msgctxt "Operator" msgid "Circle" -msgstr "Vòng Tròn" +msgstr "Hình/Vòng/Tròn" msgctxt "Operator" msgid "Interpolate" -msgstr "Suy Nội" +msgstr "Nội Suy" msgid "Expand or contract the radius of the selected points" -msgstr "Kéo ra hay rút nhỏ bán kính của các điểm được chọn" +msgstr "Mở rộng to hoặc thu nhỏ bán kính của các điểm được chọn" msgctxt "Operator" msgid "Transform Fill" -msgstr "Biến Hóa Tô Đầy" +msgstr "Biến Hóa Vùng Tô Kín" msgctxt "Operator" msgid "Thickness" -msgstr "Bề Dày" +msgstr "Độ Dày" msgctxt "Operator" msgid "Strength" -msgstr "Sức Lực" +msgstr "Độ Đậm/Sức Mạnh/Cường Độ" + + +msgctxt "Operator" +msgid "Paint Selection" +msgstr "Lựa Chọn Sơn" + + +msgctxt "Operator" +msgid "Density" +msgstr "Tỷ Trọng/Mật Độ" + + +msgctxt "Operator" +msgid "Grow / Shrink" +msgstr "Tăng Trưởng / Thu Nhỏ" msgctxt "Operator" msgid "Slide" -msgstr "Trượt" +msgstr "Trượt Đẩy" msgid "Clone from Paint Slot" -msgstr "Bản sao từ Khe Sơn" +msgstr "Rập Khuôn từ Khe Sơn" msgid "Front-Face Falloff" -msgstr "Sự Giảm Mặt-Phía Trước" +msgstr "Suy Giảm Dần Mặt Trước" msgid "Normal Falloff" -msgstr "Sự Giảm Bình Thường" +msgstr "Suy Giảm Dần theo Pháp Tuyến" + + +msgid "Gap Closure" +msgstr "Lấp Kín Khoảng Trống" msgid "Post-Processing" -msgstr "Qúa Trình Sau" +msgstr "Xử Lý Hậu Kỳ" msgid "Particle Tool" -msgstr "Dụng Cụ Hạt" +msgstr "Công Cụ cho Hạt" msgid "Default tools for particle mode" -msgstr "Dụng cụ mặc định cho chế độ hạt" +msgstr "Các công cụ mặc định cho chế độ hạt" msgid "Cut Particles to Shape" -msgstr "Cắt Hái tùy Hình Dạng" +msgstr "Cắt Hạt thành Hình Dạng" msgid "Pose Options" -msgstr "Tùy Chọn Dạng Đứng" +msgstr "Tùy Chọn về Tư Thế" msgid "Transform Orientations" @@ -78786,11 +86343,15 @@ msgstr "Định Hướng Biến Hóa" msgid "View Lock" -msgstr "Khoá Màn" +msgstr "Khóa Góc Nhìn" + + +msgid "Viewport Debug" +msgstr "Hiệu Chỉnh Lỗi Cổng Nhìn" msgid "VR" -msgstr "Sự Thật Ảo" +msgstr "Virtual Reality: Thực Tế Ảo" msgid "Action Maps" @@ -78798,15 +86359,15 @@ msgstr "Ánh Xạ Hành Động" msgid "Landmarks" -msgstr "Mốc Bờ" +msgstr "Địa Ranh" msgid "VR Session" -msgstr "Phiên Chạy Sự Thật Ảo" +msgstr "Phiên Sử Dụng VR" msgid "Viewport Feedback" -msgstr "Phản Hỏi Màn Hình" +msgstr "Phản Hồi của Cổng Nhìn" msgid "Edge Detection" @@ -78814,15 +86375,15 @@ msgstr "Phát Hiện Cạnh" msgid "Edge Type" -msgstr "Loại Cạnh" +msgstr "Kiểu Cạnh" msgid "Face Marks" -msgstr "Ký Hiệu Mặt" +msgstr "Dấu Chỉ Mặt" msgid "Freestyle Alpha" -msgstr "Độ Đục Phong Cách Tự Do" +msgstr "Alpha Phong Cách Tự Do" msgid "Freestyle Color" @@ -78830,19 +86391,19 @@ msgstr "Màu Phong Cách Tự Do" msgid "Freestyle Geometry" -msgstr "Hình Dạng Phong Cách Tự Do" +msgstr "Hình Học Phong Cách Tự Do" msgid "Freestyle Strokes" -msgstr "Nét Phong Cách Tự Do" +msgstr "Nét Vẽ Phong Cách Tự Do" msgid "Splitting" -msgstr "Chẻ" +msgstr "Tách Phân" msgid "Split Pattern" -msgstr "Chẻ Gương Mẫu" +msgstr "Mẫu Tách Phân" msgid "Freestyle Texture" @@ -78850,11 +86411,11 @@ msgstr "Chất Liệu Phong Cách Tự Do" msgid "Freestyle Thickness" -msgstr "Chiều Dầy Phong Cách Tự Do" +msgstr "Độ Dày Phong Cách Tự Do" msgid "Filter Add-ons" -msgstr "Lọc Đồ Kèm" +msgstr "Thanh Lọc Trình Bổ Sung" msgid "Particle in a particle system" @@ -78862,23 +86423,23 @@ msgstr "Hạt trong một hệ thống hạt" msgid "Alive State" -msgstr "Trạng Thái Sống" +msgstr "Trạng Thái Sinh Tồn" msgid "Dying" -msgstr "Đang Hủy Diệt" +msgstr "Suy Thoái" msgid "Birth Time" -msgstr "Thời Sanh" +msgstr "Thời Điểm Sinh" msgid "Die Time" -msgstr "Thời Hủy Diệt" +msgstr "Thời Điểm Chết" msgid "Exists" -msgstr "Đang Tồn Tại" +msgstr "Tồn Tại" msgid "Particle Location" @@ -78886,31 +86447,31 @@ msgstr "Vị Trí Hạt" msgid "Keyed States" -msgstr "Trạng Thái Có Bức Ảnh Mẫu" +msgstr "Trạng Thái Hình Mẫu Hóa" msgid "Previous Angular Velocity" -msgstr "Vận Tốc Xoay Trước" +msgstr "Vận Tốc Góc Trước Đây" msgid "Previous Particle Location" -msgstr "Vị Trí Trước Của Hạt" +msgstr "Vị Trí Hạt Trước Đây" msgid "Previous Rotation" -msgstr "Xoay Trước" +msgstr "Sự Xoay Chiều Trước Đây" msgid "Previous Particle Velocity" -msgstr "Vận Tốc Trước Của Hạt" +msgstr "Vận Tốc Hạt Trước Đây" msgid "Particle Brush" -msgstr "Bút Hạt" +msgstr "Đầu Bút Hạt" msgid "Particle editing brush" -msgstr "Bút để chỉnh sửa hạt" +msgstr "Đầu bút để chỉnh sửa hạt" msgid "Particle count" @@ -78918,7 +86479,7 @@ msgstr "Số lượng hạt" msgid "Length Mode" -msgstr "Chế Độ Bề Dài" +msgstr "Chế Độ Chiều Dài" msgid "Make hairs longer" @@ -78926,15 +86487,15 @@ msgstr "Làm tóc dài hơn" msgid "Make hairs shorter" -msgstr "Làm tóc ngăn hơn" +msgstr "Làm tóc ngắn hơn" msgid "Puff Mode" -msgstr "Chế Độ Sưng" +msgstr "Chế Độ Làm Bồng" msgid "Make hairs more puffy" -msgstr "Làm tóc sưng lên hơn" +msgstr "Làm tóc bồng lên nhiều hơn" msgid "Sub" @@ -78942,67 +86503,67 @@ msgstr "Trừ" msgid "Make hairs less puffy" -msgstr "Giảm sưng tóc" +msgstr "Giảm lượng bồng lên của tóc" msgid "Brush steps" -msgstr "Bước bút" +msgstr "Số Bước của đầu bút" msgid "Brush strength" -msgstr "Sức bút" +msgstr "Độ đậm/sức mạnh/cường độ của đầu bút" msgid "Puff Volume" -msgstr "Thể Tích Sưng" +msgstr "Thể Tích Làm Bồng Lên" msgid "Apply puff to unselected end-points (helps maintain hair volume when puffing root)" -msgstr "Áp dụng sưng cho các điểm kết thúc chưa chọn (giúp giữ nguyên thể tích tóc khi sưng rễ)" +msgstr "Áp dụng ảnh hưởng làm bồng lên vào các điểm kết chưa chọn (giúp giữ nguyên thể tích tóc khi làm bồng gốc)" msgid "Particle Instance Object Weight" -msgstr "Quyền Lượng Vật Thể Thực Thể Hạt" +msgstr "Trọng Lượng Đối Tượng Thực Thể Hóa Hạt" msgid "Weight of a particle instance object in a collection" -msgstr "Quyền lượng của một hạt vật thể thực thể trong một sưu tập" +msgstr "Trọng lượng của một đối tượng thực thể hóa hạt trong một bộ sưu tập" msgid "The number of times this object is repeated with respect to other objects" -msgstr "Số lần chép lại vật thể này so với vật thể khác" +msgstr "Số lần nhắc lại đối tượng này so với các đối tượng khác" msgid "Particle instance object name" -msgstr "Tên của vật thể thực thể hạt" +msgstr "Tên của đối tượng thực thể hóa hạt" msgid "Properties of particle editing mode" -msgstr "Đặc tính của chế độ chỉnh sửa hạt" +msgstr "Tính chất của chế độ chỉnh sửa hạt" msgid "Keys" -msgstr "Bứa Ảnh Mẫu" +msgstr "Số Điểm Điều Khiển" msgid "How many keys to make new particles with" -msgstr "Số lượng bức ảnh mẫu để chế tạo cho hạt mới" +msgstr "Số lượng điểm điều khiển sử dụng để tạo các hạt mới" msgid "How many steps to display the path with" -msgstr "Số lượng bước để hiển thị đường dẫn" +msgstr "Số lượng bước sử dụng để hiển thị đường dẫn" msgid "Emitter Distance" -msgstr "Khoảng Cách Đồ Phát" +msgstr "Khoảng Cách của Phần Tử Phát" msgid "Distance to keep particles away from the emitter" -msgstr "Giữ hạt bao xa từ đồ phát" +msgstr "Khoảng cách giữ các hạt cách xa phần tử phát" msgid "How many frames to fade" -msgstr "Số lượng bức ảnh cho phai" +msgstr "Số lượng khung hình để phai mờ" msgid "Editable" @@ -79010,7 +86571,7 @@ msgstr "Có Thể Chỉnh Sửa" msgid "A valid edit mode exists" -msgstr "Có một chế độ biên tập hợp lệ" +msgstr "Một Chế Độ Biên Soạn hợp lệ tồn tại" msgid "Editing hair" @@ -79018,19 +86579,19 @@ msgstr "Chỉnh sửa tóc" msgid "The edited object" -msgstr "Vật thể bị chỉnh sửa" +msgstr "Đối tượng được chỉnh sửa" msgid "Selection Mode" -msgstr "Chế Độ Sự Lựa Chọn" +msgstr "Chế Độ Lựa Chọn" msgid "Particle select and display mode" -msgstr "Chế độ chọn và hiển thị hạt" +msgstr "Chế độ lựa chọn và hiển thị tóc" msgid "Path edit mode" -msgstr "Chế độ chỉnh sửa đường dẫn" +msgstr "Chế độ biên soạn đường dẫn" msgid "Point select mode" @@ -79042,15 +86603,15 @@ msgstr "Đỉnh" msgid "Tip select mode" -msgstr "Chế độ chọn đỉnh" +msgstr "Chế độ chọn đỉnh đầu" msgid "Shape Object" -msgstr "Hình Dạng Vật Thể" +msgstr "Đối Tượng Chỉnh Hình" msgid "Outer shape to use for tools" -msgstr "Hình dạng ngoài dùng cho dụng cụ" +msgstr "Hình dạng chùm bên ngoài để dùng cho các công cụ" msgid "Display Particles" @@ -79058,7 +86619,7 @@ msgstr "Hiển Thị Hạt" msgid "Display actual particles" -msgstr "Hiển thị hạt thật sự" +msgstr "Hiển thị cụ thể các hạt" msgid "Auto Velocity" @@ -79070,255 +86631,255 @@ msgstr "Tính vận tốc điểm tự động" msgid "Interpolate new particles from the existing ones" -msgstr "Suy nội hạt mới từ hạt đang tồn tại" +msgstr "Nội suy những hạt mới từ những cái tồn tại" msgid "Deflect Emitter" -msgstr "Chệch Hướng Đồ Phát" +msgstr "Làm Lệch Hướng Vật Phát" msgid "Keep paths from intersecting the emitter" -msgstr "Không cho những đi đường trúng đồ phát hạt" +msgstr "Không cho đường dẫn giao cắt với vật phát" msgid "Fade Time" -msgstr "Thời Gian Phai" +msgstr "Thời Gian Phai Mờ" msgid "Fade paths and keys further away from current frame" -msgstr "Phai đường đi và bức ảnh mẫu từ bức ảnh hiện tại" +msgstr "Làm phai mờ các đường dẫn và các hình mẫu nằm xa hơn từ khung hình hiện tại" msgid "Keep Lengths" -msgstr "Giữ bề dài" +msgstr "Giữ Chiều Dài" msgid "Keep path lengths constant" -msgstr "Giữ bề dài đường đi bằng nhau" +msgstr "Giữ chiều dài đường dẫn bất biến" msgid "Keep Root" -msgstr "Giữ Rễ" +msgstr "Giữ Gốc" msgid "Keep root keys unmodified" -msgstr "Không cho sửa đổi mẫu của rễ" +msgstr "Giữ cho hình mẫu gốc nguyên dạng" msgid "Particle Hair Key" -msgstr "Bức Ảnh Mẫu Hạt Tóc" +msgstr "Hình Mẫu Hạt Tóc" msgid "Particle key for hair particle system" -msgstr "Bức ảnh mẫu hạt cho hệ thống hạt tóc" +msgstr "Hình mẫu của hạt cho hệ thống hạt tóc" msgid "Location (Object Space)" -msgstr "Vị Trí (Tọa Độ Vật Thể)" +msgstr "Vị Trí (Không Gian Đối Tượng)" msgid "Location of the hair key in object space" -msgstr "Vị trí của bức ảnh mẫu tóc trong không gian vật thể" +msgstr "Vị trí hình mẫu của tóc trong không gian đối tượng" msgid "Location of the hair key in its local coordinate system, relative to the emitting face" -msgstr "Vi trí của bức ảnh mẫu tóc trong hệ thống địa phương, tương đối với mặt phát" +msgstr "Vị trí hình mẫu của tóc trong hệ thống tọa độ địa phương của nó, tương đối với Mặt phát" msgid "Relative time of key over hair length" -msgstr "Thời gian tương đối của bức ảnh mẫu theo bề dài tóc" +msgstr "Thời gian tương đối của hình mẫu trên chiều dài của tóc" msgid "Weight for cloth simulation" -msgstr "Quyền lượng cho mô phỏng vải" +msgstr "Trọng lượng cho mô phỏng vải vóc" msgid "Particle Key" -msgstr "Mẫu Hạt" +msgstr "Hình Mẫu của Hạt" msgid "Key location for a particle over time" -msgstr "Vị trí mẫu cho một hạt trong thời gian" +msgstr "Vị trí hình mẫu cho một hệ thống hạt qua thời gian" msgid "Key angular velocity" -msgstr "Vận tốc góc bức ảnh mẫu" +msgstr "Vận tốc góc của hình mẫu" msgid "Key location" -msgstr "Vị trí bức ảnh mẫu" +msgstr "Vị trí của hình mẫu" msgid "Key rotation quaternion" -msgstr "Quaternion xoay bức ảnh mẫu" +msgstr "Xoay chiều của hình mẫu dùng Quatenion" msgid "Time of key over the simulation" -msgstr "Thời gian của bức ảnh mẫu trong mô phỏng" +msgstr "Thời gian của hình mẫu trong mô phỏng" msgid "Key velocity" -msgstr "Vận tốc bức ảnh mẫu" +msgstr "Vận tốc của hình mẫu" msgid "Particle system in an object" -msgstr "Hệ thống hạt trong một vật thể" +msgstr "Hệ thống hạt trong một đối tượng" msgid "Active Particle Target" -msgstr "Mục Tiêu Hạt Hoạt Động" +msgstr "Mục Tiêu Hạt đang Hoạt Động" msgid "Active Particle Target Index" -msgstr "Chỉ Số Mục Tiêu Hạt Hoạt Động" +msgstr "Chỉ Số của Mục Tiêu Hạt đang Hoạt Động" msgid "Child Particles" -msgstr "Hạt Con Cái" - - -msgid "Child particles generated by the particle system" -msgstr "Hạt con cái xuất được chế tạo từ hệ thống hạt" - - -msgid "Child Seed" msgstr "Số Hạt Con Cái" +msgid "Child particles generated by the particle system" +msgstr "Số hạt con cái xuất phát từ hệ thống hạt" + + +msgid "Child Seed" +msgstr "Mầm Con Cái" + + msgid "Offset in the random number table for child particles, to get a different randomized result" -msgstr "Địch trong bản số ngẫu nhiên cho hạt con cái, cho được kết qủa ngẫu nhiên khác" +msgstr "Dịch chuyển của giá trị trong bảng số ngẫu nhiên cho các hạt con cái, để đạt được một kết quả ngẫu nhiên khác biệt" msgid "Cloth dynamics for hair" -msgstr "Động lý vải cho tóc" +msgstr "Động lực học của vải vóc cho tóc" msgid "The current simulation time step size, as a fraction of a frame" -msgstr "Kích cỡ bước thời gian hiện tại của mô phỏng, là phần số của một bức ảnh" +msgstr "Kích thước bước thời gian hiện tại của mô phỏng, tức một phân số của khung hình" msgid "Multiple Caches" -msgstr "Nhiều Đệm Chứa" +msgstr "Đa Bộ Nhớ Đệm" msgid "Particle system has multiple point caches" -msgstr "Hệ thống hạt có nhiều đệm chứa điểm" +msgstr "Hệ thống hạt có nhiều bộ nhớ đệm điểm" msgid "Vertex Group Clump Negate" -msgstr "Vô Hiệu Ứng Bó Nhóm Đỉnh" +msgstr "Đảo Nghịch Nhóm Điểm Đỉnh Tạo Khóm" msgid "Negate the effect of the clump vertex group" -msgstr "Vô hiệu ứng của nhóm đỉnh bó" +msgstr "Đảo nghịch hiệu ứng của nhóm điểm đỉnh tạo khóm" msgid "Vertex Group Density Negate" -msgstr "Vô Hiệu Ứng Tỉ Trọng Nhóm Đỉnh" +msgstr "Đảo Nghịch Nhóm Điểm Đỉnh Mật Độ" msgid "Negate the effect of the density vertex group" -msgstr "Vô hiệu ứng của tỉ trọng nhóm đỉnh" +msgstr "Đảo nghịch hiệu ứng của nhóm điểm đỉnh mật độ" msgid "Vertex Group Field Negate" -msgstr "Vô Hiệu Ứng Trường Nhóm Đỉnh" +msgstr "Đảo Nghịch Nhóm Điểm Đỉnh Trường" msgid "Negate the effect of the field vertex group" -msgstr "Vô hiệu ứng của trường nhóm đỉnh" +msgstr "Đảo nghịch hiệu ứng của nhóm điểm đỉnh về trường" msgid "Vertex Group Kink Negate" -msgstr "Vô Hiệu Ứng Thắt Nút Nhóm Đỉnh" +msgstr "Đảo Nghịch Nhóm Điểm Đỉnh Xoắn Vặn" msgid "Negate the effect of the kink vertex group" -msgstr "Vô hiệu ứng của thắt nút nhóm đỉnh" +msgstr "Đảo nghịch hiệu ứng của nhóm điểm đỉnh về xoắn vặn" msgid "Vertex Group Length Negate" -msgstr "Vô Hiệu Ứng Bề Dài Nhóm Đỉnh" +msgstr "Đảo Nghịch Nhóm Điểm Đỉnh Chiều Dài" msgid "Negate the effect of the length vertex group" -msgstr "Vô hiệu ứng của bề dài nhóm đỉnh" +msgstr "Đảo nghịch hiệu ứng của nhóm điểm đỉnh về chiều dài" msgid "Vertex Group Rotation Negate" -msgstr "Vô Hiệu Ứng Xoay Nhóm Đỉnh" +msgstr "Đảo Nghịch Nhóm Điểm Đỉnh Xoay Chiều" msgid "Negate the effect of the rotation vertex group" -msgstr "Vô hiệu ứng của xoay nhóm đỉnh" +msgstr "Đảo nghịch hiệu ứng của nhóm điểm đỉnh về sự xoay chiều" msgid "Vertex Group Roughness 1 Negate" -msgstr "Vô Hiệu Ứng Nhóm Đỉnh Độ Nhám 1" +msgstr "Đảo Nghịch Nhóm Điểm Đỉnh về Độ Ráp 1" msgid "Negate the effect of the roughness 1 vertex group" -msgstr "Vô hiệu ứng độ nhám của nhóm định 1" +msgstr "Đảo nghịch hiệu ứng của nhóm điểm đỉnh 1 về độ ráp" msgid "Vertex Group Roughness 2 Negate" -msgstr "Vô Hiệu Ứng Nhóm Đỉnh Độ Nhám 2" +msgstr "Đảo Nghịch Nhóm Điểm Đỉnh về Độ Ráp 2" msgid "Negate the effect of the roughness 2 vertex group" -msgstr "Vô hiệu ứng độ nhám của nhóm định 2" +msgstr "Đảo nghịch hiệu ứng của nhóm điểm đỉnh 2 về độ ráp" msgid "Vertex Group Roughness End Negate" -msgstr "Vô Hiệu Ứng Kết Thúc Nhám Nhóm Đỉnh" +msgstr "Đảo Nghịch Nhóm Điểm Đỉnh về Độ Gồ Ghề ở Đỉnh" msgid "Negate the effect of the roughness end vertex group" -msgstr "Vô hiệu ứng của kết thúc nhám nhóm đỉnh" +msgstr "Đảo nghịch hiệu ứng của nhóm điểm đỉnh về độ gồ ghề ở đỉnh" msgid "Vertex Group Size Negate" -msgstr "Vô Hiệu Ứng Kích Cỡ Nhóm Đỉnh" +msgstr "Đảo Nghịch Nhóm Điểm Đỉnh về Kích Thước" msgid "Negate the effect of the size vertex group" -msgstr "Vô hiệu ứng của kích cỡ nhóm đỉnh" +msgstr "Đảo nghịch hiệu ứng của nhóm điểm đỉnh về kích thước" msgid "Vertex Group Tangent Negate" -msgstr "Vô Hiệu Ứng Tiếp Tuyến Nhóm Đỉnh" +msgstr "Đảo Nghịch Nhóm Điểm Đỉnh về Tiếp Tuyến" msgid "Negate the effect of the tangent vertex group" -msgstr "Vô hiệu ứng của tiếp tuyến nhóm định" +msgstr "Đảo nghịch hiệu ứng của nhóm điểm đỉnh về tiếp tuyến" msgid "Vertex Group Twist Negate" -msgstr "Vô Hiệu Ứng Xoắn Nhóm Đỉnh" +msgstr "Vô Hiệu Hóa Nhóm Điểm Đỉnh Xoắn Vặn" msgid "Negate the effect of the twist vertex group" -msgstr "Vô hiệu ứng xoắn của nhóm đỉnh" +msgstr "Vô hiệu hóa tác động của nhóm điểm đỉnh xoắn vặn" msgid "Vertex Group Velocity Negate" -msgstr "Vô Hiệu Ứng Vận Tốc Nhóm Đỉnh" +msgstr "Vô Hiệu Hóa Nhóm Điểm Đỉnh Vận Tốc" msgid "Negate the effect of the velocity vertex group" -msgstr "Vô hiệu ứng vận tốc của nhóm đỉnh" +msgstr "Vô hiệu hóa tác động của nhóm điểm đỉnh về vận tốc" msgid "Particle system can be edited in particle mode" -msgstr "Có thể chỉnh sửa hệ thống hạt trong chế độ hạt" +msgstr "Hệ thống hạt có thể chỉnh sửa được trong chế độ hạt" msgid "Edited" -msgstr "Được Chỉnh Sửa" +msgstr "Đã Chỉnh Sửa" msgid "Particle system has been edited in particle mode" -msgstr "Hệ thống hạt được chỉnh sửa trong chế độ hạt" +msgstr "Hệ thống hạt đã bị chỉnh sửa trong chế độ hạt" msgid "Global Hair" @@ -79326,43 +86887,43 @@ msgstr "Tóc Toàn Cầu" msgid "Hair keys are in global coordinate space" -msgstr "Mẫu dạng tóc dùng tọa độ không gian toàn cầu" +msgstr "Các hình mẫu của tóc nằm trong tọa độ không gian toàn cầu" msgid "Particle system name" -msgstr "Tên hệ thống hạt" +msgstr "Tên của hệ thống hạt" msgid "Use this object's coordinate system instead of global coordinate system" -msgstr "Dùng hệ tọa độ của vật thể này thay thế hệ tóa độ toàn cầu" +msgstr "Sử dụng hệ tọa độ của đối tượng này thay vì hệ tọa độ thế giới" msgid "Particles generated by the particle system" -msgstr "Các hạt được chế tạo từ hệ thống hạt" +msgstr "Các hạt xuất phát từ hệ thống hạt" msgid "Reactor Target Object" -msgstr "Vật Thể Mục Tiêu Lò Phản Ứng" +msgstr "Đối Tượng Mục Tiêu của Phản Ứng Viên" msgid "For reactor systems, the object that has the target particle system (empty if same object)" -msgstr "Cho hệ thống lò phản ứng, vật thể có hệ thống hạt mục tiêu (trống nếu cùng vật thể)" +msgstr "Dành cho hệ thống phản ứng, đối tượng có hệ thống hạt mục tiêu (bỏ trống nếu là cùng một đối tượng)" msgid "Reactor Target Particle System" -msgstr "Hệ Thống Hạt Mục Tiêu Lò Phản Ứng" +msgstr "Hệ Thống Hạt Mục Tiêu của Phản Ứng Viên" msgid "For reactor systems, index of particle system on the target object" -msgstr "Cho hệ thống lò phản ứng, chỉ số của hệ thống hạt của vật thể mục tiêu" +msgstr "Dành cho hệ thống phản ứng, chỉ số của hệ thống hạt trong đối tượng mục tiêu" msgid "Offset in the random number table, to get a different randomized result" -msgstr "Dịch trong bảng số ngẫu nhiên, cho được một kết qủa ngẫu nhiên khác" +msgstr "Giá trị trong bảng số ngẫu nhiên để đạt được kết quả ngẫu nhiên khác biệt" msgid "Particle system settings" -msgstr "Cài đặt hệ thống hạt" +msgstr "Sắp đặt của hệ thống hạt" msgid "Target particle systems" @@ -79370,139 +86931,139 @@ msgstr "Hệ thống hạt mục tiêu" msgid "Enable hair dynamics using cloth simulation" -msgstr "Bật động lý tóc bằng mô phỏng vải" +msgstr "Bật động lực học của tóc dùng mô phỏng vải vóc" msgid "Keyed Timing" -msgstr "Thời Tự Bức Ảnh Mẫu" +msgstr "Thời Định Khóa Hóa" msgid "Use key times" -msgstr "Dùng thời gian bức ảnh mẫu" +msgstr "Sử dụng thời định khóa hóa" msgid "Vertex Group Clump" -msgstr "Bó Nhóm Đỉnh" +msgstr "Nhóm Điểm Đỉnh Tạo Khóm" msgid "Vertex group to control clump" -msgstr "Nhóm đỉnh cho điều khiển bó" +msgstr "Nhóm điểm đỉnh để điều khiển sự tạo khóm" msgid "Vertex Group Density" -msgstr "Nhóm Đỉnh Tỉ Trọng" +msgstr "Nhóm Điểm Đỉnh Mật Độ" msgid "Vertex group to control density" -msgstr "Nhóm đỉnh để điền khiểu tỉ trọng" +msgstr "Nhóm điểm đỉnh để điều khiển mật độ" msgid "Vertex Group Field" -msgstr "Nhóm Đỉnh Trường" +msgstr "Nhóm Điểm Đỉnh cho Trường Lực" msgid "Vertex group to control field" -msgstr "Nhóm đỉnh để điền khiểu trường" +msgstr "Nhóm điểm đỉnh để điều khiển trường lực" msgid "Vertex Group Kink" -msgstr "Thắt Nút Nhóm Đỉnh" +msgstr "Nhóm Điểm Đỉnh Xoắn Vặn" msgid "Vertex group to control kink" -msgstr "Nhóm đỉnh cho điều khiển thắt nút" +msgstr "Nhóm điểm đỉnh để điều khiển sự xoắn vặn" msgid "Vertex Group Length" -msgstr "Bề Dài Nhóm Đỉnh" +msgstr "Nhóm Điểm Đỉnh cho Chiều Dài" msgid "Vertex group to control length" -msgstr "Nhóm đỉnh để điều khiển bề dài" +msgstr "Nhóm điểm đỉnh để điều khiển chiều dài" msgid "Vertex Group Rotation" -msgstr "Nhóm Đỉnh Xoay" +msgstr "Nhóm Điểm Đỉnh cho Xoay Chiều" msgid "Vertex group to control rotation" -msgstr "Nhóm đỉnh để điều khiển xoay" +msgstr "Nhóm điểm đỉnh để quản lý sự xoay chiều" msgid "Vertex Group Roughness 1" -msgstr "Nhóm Đỉnh Độ Nhám 1" +msgstr "Nhóm Điểm Đỉnh cho Độ Rối 1" msgid "Vertex group to control roughness 1" -msgstr "Nhóm đỉnh để điều khiển độ nhám 1" +msgstr "Nhóm điểm đỉnh để điều khiển độ rối 1" msgid "Vertex Group Roughness 2" -msgstr "Nhóm Đỉnh Độ Nhám 2" +msgstr "Nhóm Điểm Đỉnh cho Độ Rối 2" msgid "Vertex group to control roughness 2" -msgstr "Nhóm đỉnh để điều khiển độ nhám 2" +msgstr "Nhóm điểm đỉnh để điều khiển độ rối 2" msgid "Vertex Group Roughness End" -msgstr "Độ Nhám Đỉnh Nhóm Đỉnh" +msgstr "Nhóm Điểm Đỉnh cho Độ Rối ở Đỉnh" msgid "Vertex group to control roughness end" -msgstr "Nhóm đỉnh để điều khiển độ nhám đỉnh" +msgstr "Nhóm điểm đỉnh khống chế độ rối ở đỉnh" msgid "Vertex Group Size" -msgstr "Kích Cỡ Nhóm Đỉnh" +msgstr "Nhóm Điểm Đỉnh Kích Thước" msgid "Vertex group to control size" -msgstr "Nhóm đỉnh để điều khiển kích cỡ" +msgstr "Nhóm điểm đỉnh để khống chế kích thước" msgid "Vertex Group Tangent" -msgstr "Tiếp Tuyến Nhóm Đỉnh" +msgstr "Nhóm Điểm Đỉnh Tiếp Tuyến" msgid "Vertex group to control tangent" -msgstr "Nhóm đỉnh để điều khiển tiếp tuyến" +msgstr "Nhóm điểm đỉnh quản lý tiếp tuyến" msgid "Vertex Group Twist" -msgstr "Xoắn Nhóm Đỉnh" +msgstr "Nhóm Điểm Đỉnh Xoắn Vặn" msgid "Vertex group to control twist" -msgstr "Nhóm đỉnh để điều khiển xoắn" +msgstr "Nhóm điểm đỉnh để điều khiển xoắn vặn" msgid "Vertex Group Velocity" -msgstr "Vận Tốc Nhóm Đỉnh" +msgstr "Nhóm Điểm Đỉnh Vận Tốc" msgid "Vertex group to control velocity" -msgstr "Nhóm đỉnh để điều khiển vận tóc" +msgstr "Nhóm điểm đỉnh để điều khiển vận tốc" msgid "Collection of particle systems" -msgstr "Sưu tập của hệ thống hạt" +msgstr "Bộ sưu tập các của hệ thống hạt" msgid "Active Particle System" -msgstr "Hệ Thống Hạt Hoạt Động" +msgstr "Hệ Thống Hạt đang Hoạt Động" msgid "Active particle system being displayed" -msgstr "Hệ thống hạt hoạt động đang hiển thị" +msgstr "Hệ thống hạt hoạt động đang được hiển thị" msgid "Active Particle System Index" -msgstr "Chỉ Số Hệ Thống Hạt Hoạt Động" +msgstr "Chỉ Số Hệ Thống Hạt đang Hoạt Động" msgid "Index of active particle system slot" -msgstr "Chỉ số khe hệ thống hạt hoạt động" +msgstr "Chỉ số khe của hệ thống hạt đang hoạt động" msgid "Particle Target" @@ -79526,15 +87087,15 @@ msgstr "Kẻ Thù" msgid "Keyed particles target is valid" -msgstr "Mục tiêu của hạt mẫu dạng được hợp lệ" +msgstr "Mục tiêu của hệ thống hạt đã được khung khóa hóa là mục tiêu hợp lệ" msgid "Particle target name" -msgstr "Tên hạt mục tiêu" +msgstr "Tên hệ thống hạt mục tiêu" msgid "The object that has the target particle system (empty if same object)" -msgstr "Vật thể nào sở hữu mục tiêu của hệ thống hạt này (trống nếu là cùng vật thể)" +msgstr "Đối tượng có hệ thống hạt mục tiêu (bỏ trống nếu là cùng một đối tượng)" msgid "Target Particle System" @@ -79542,7 +87103,7 @@ msgstr "Hệ Thống Hạt Mục Tiêu" msgid "The index of particle system on the target object" -msgstr "Chỉ số của hệ thống hạt của vật thể mục tiêu" +msgstr "Chỉ số của hệ thống hạt ở đối tượng mục tiêu" msgid "Path Compare" @@ -79550,43 +87111,43 @@ msgstr "So Sánh Đường Dẫn" msgid "Match paths against this value" -msgstr "So sánh đường dẫn với giá trị này" +msgstr "Khớp các đường dẫn với giá trị này" msgid "Use Wildcard" -msgstr "Dùng Ký Tự Đại Điễn" +msgstr "Dùng Ký Tự Đại Diện" msgid "Enable wildcard globbing" -msgstr "Bật chùm ký tự đại điễn" +msgstr "Cho phép phiên dịch ký tự đại diện (thành tên các văn bản cụ thể)" msgid "Paths Compare" -msgstr "So Sánh Đường Dẫn" +msgstr "So Sánh các Đường Dẫn" msgid "Collection of paths" -msgstr "Sưu tập đường dẫn" +msgstr "Bộ sưu tập các đường dẫn" msgid "Point in a point cloud" -msgstr "Điểm trong một mây điểm" +msgstr "Điểm trong đám mây điểm" msgid "Active Point Cache" -msgstr "Đệm Chứa Điểm Hoạt Động" +msgstr "Bộ Đệm Nhớ về Điểm đang Hoạt Động" msgid "Active point cache for physics simulations" -msgstr "Đệm chứa điểm hoạt động cho mô phỏng vật lý học" +msgstr "Bộ đệm nhớ về điểm của các mô phỏng vật lý" msgid "Cache Compression" -msgstr "Nén Đệm Chứa" +msgstr "Nén Bộ Nhớ Đệm" msgid "No compression" -msgstr "Không Nén" +msgstr "Không nén" msgid "Lite" @@ -79594,7 +87155,7 @@ msgstr "Nhẹ" msgid "Fast but not so effective compression" -msgstr "Nhanh mà mà hiệu qủa nén không cao" +msgstr "Nhanh nhưng hiệu quả nén không cao" msgid "Heavy" @@ -79602,75 +87163,75 @@ msgstr "Nặng" msgid "Cache file path" -msgstr "Đường dẫn đệm chứa" +msgstr "Đường dẫn đến bộ nhớ đệm" msgid "Frame on which the simulation stops" -msgstr "Số bức ảnh cho kết thúc mô phỏng" +msgstr "Khung hình nơi mô phỏng kết thúc" msgid "Frame on which the simulation starts" -msgstr "Số bức ảnh cho bắt đầu mô phỏng" +msgstr "Khung hình nơi mô phỏng bắt đầu" msgid "Cache Step" -msgstr "Bước Đệm Chứa" +msgstr "Quãng Bộ Nhớ Đệm" msgid "Number of frames between cached frames" -msgstr "Số lượng bức ảnh giữa bức ảnh được chứa lại" +msgstr "Số khung hình giữa các khung hình trong bộ nhớ đệm" msgid "Cache Index" -msgstr "Chỉ Số Đệm Chứa" +msgstr "Chỉ Số của Bộ Nhớ Đệm" msgid "Index number of cache files" -msgstr "Chỉ số của tập tin đệm chứa" +msgstr "Chỉ số của các tập tin bộ nhớ đệm" msgid "Cache Info" -msgstr "Thông Tin Đệm Chứa" +msgstr "Thông Tin về Bộ Nhớ Đệm" msgid "Info on current cache status" -msgstr "Thông tin về trạng thái hiện tại của đệm chứa" +msgstr "Thông tin về trạng thái hiện tại của bộ nhớ đệm" msgid "The cache is baked" -msgstr "Đệm chứa được nướng" +msgstr "Bộ nhớ đệm đã được nướng xong" msgid "The cache is being baked" -msgstr "Đang nướng đệm chứa" +msgstr "Bộ nhớ đệm đang được nướng" msgid "Some frames were skipped while baking/saving that cache" -msgstr "Một số bức ảnh đá bí bỏ qua khi nướng/lưu đệm chứa đó" +msgstr "Một số khung hình đã bị bỏ qua trong khi nướng/lưu bộ nhớ đệm đó" msgid "Cache Is Outdated" -msgstr "Đệm Chứa Đã Lỗi Thời" +msgstr "Bộ Nhớ Đệm Nhớ đã Lỗi Thời" msgid "Cache name" -msgstr "Tên đệm chứa" +msgstr "Tên bộ nhớ đệm" msgid "Point Cache List" -msgstr "Danh Sách Chứa Điểm" +msgstr "Danh Sách Bộ Đệm Điểm" msgid "Disk Cache" -msgstr "Đệm Chứa Đĩa" +msgstr "Bộ Nhớ Đệm trên Đĩa" msgid "Save cache files to disk (.blend file must be saved first)" -msgstr "Lưu tập tin đệm chứa vào đĩa (yêu cầu luư tập tin .blend trước)" +msgstr "Lưu tập tin bộ nhớ đệm ra đĩa (yêu cầu lưu tập tin .blend trước đã)" msgid "Read cache from an external location" -msgstr "Nhập đệm chứa từ một chỗ ở ngoài" +msgstr "Đọc bộ nhớ đệm từ một địa điểm bên ngoài" msgid "Library Path" @@ -79678,31 +87239,31 @@ msgstr "Đường Dẫn Thư Viện" msgid "Use this file's path for the disk cache when library linked into another file (for local bakes per scene file, disable this option)" -msgstr "Dùng đường dẫn của tập tin này làm đệm chứa đĩa khi thư viện được liên kết với một tập tin khác (để được làm nướng địa phương cho mỗi tập tin cảnh, tắt tùy chọn này)" +msgstr "Dùng đường dẫn của tập tin này làm bộ đệm nhớ trên đĩa khi thư viện kết nối với một tập tin khác (hãy tắt tùy chọn này đối với các nướng địa phương cho tập tin của cảnh)" msgid "Point cache for physics simulations" -msgstr "Đệm chứa điểm cho mô phỏng vật lý học" +msgstr "Bộ nhớ đệm điểm cho mô phỏng vật lý" msgid "Point Caches" -msgstr "Đệm Chứa Điểm" +msgstr "Bộ Nhớ Đệm Điểm" msgid "Collection of point caches" -msgstr "Sưu tập đệm chứa điểm" +msgstr "Bộ sưu tập các bộ nhớ đệm điểm" msgid "A collection of pose channels, including settings for animating bones" -msgstr "Một tập kênh dạng đứng, gồm cài đặt cho họat hình xương" +msgstr "Một bộ sưu tập các kênh tư thế, bao gồm các sắp đặt cho các xương hoạt họa" msgid "Pose Bones" -msgstr "Xương Dạng Đứng" +msgstr "Xương Tư Thế" msgid "Individual pose bones for the armature" -msgstr "Các xương dạng đứng riêng cho cốt" +msgstr "Các cá nhân xương tư thế của khung cốt" msgid "IK Param" @@ -79710,11 +87271,11 @@ msgstr "Tham Số IK" msgid "Parameters for IK solver" -msgstr "Tham số cho trình giải nghiệm IK" +msgstr "Tham số cho giải nghiệm IK" msgid "Selection of IK solver for IK chain" -msgstr "Sự lựa chọn trình giải nghiệm IK cho chuỗi IK" +msgstr "Lựa chọn giải nghiệm IK cho chuỗi IK" msgid "Auto IK" @@ -79722,127 +87283,127 @@ msgstr "IK Tự Động" msgid "Add temporary IK constraints while grabbing bones in Pose Mode" -msgstr "Thêm ràng buộc IK tạm thời khi đang cầm xương trong Chế Độ Dạng Đứng" +msgstr "Thêm ràng buộc IK tạm thời khi tóm bắt xương trong Chế Độ Tư Thế" msgid "Relative Mirror" -msgstr "Gương Tương Đối" +msgstr "Phản Chiếu Đối Xứng Tương Đối" msgid "Apply relative transformations in X-mirror mode (not supported with Auto IK)" -msgstr "Áp dụng biến hóa tương đối trong chế độ gương-X (không được hỗ trợ với IK tự động)" +msgstr "Áp dụng sự biến hóa phản chiếu đối xứng trên trục X (không hỗ trợ IK Tự Động)" msgid "Channel defining pose data for a bone in a Pose" -msgstr "Kênh chỉ định dữ liệu dạng đứng cho một xương trong một Dạng Đứng" +msgstr "Kênh xác định dữ liệu tư thế cho một xương trong một Tư Thế" msgid "Bone associated with this PoseBone" -msgstr "Xương liên quan với XươngDạngĐứng này" +msgstr "Xương liên hệ với Xương Tư Thế này" msgid "Child of this pose bone" -msgstr "Con cái của xương dạng đứng này" +msgstr "Con cái của xương tư thế này" msgid "Constraints that act on this pose channel" -msgstr "Các ràng buộc được thực hành trong kênh dạng đứng này" +msgstr "Các ràng buộc sẽ gây tác động trên kênh tư thế này" msgid "Custom Object" -msgstr "Vật Thể Tùy Chọn" +msgstr "Đối Tượng Sử Dụng" msgid "Object that defines custom display shape for this bone" -msgstr "Vật thể đang chỉ định hình dạng hiển thị tùy chọn cho xương này" +msgstr "Đối tượng xác định hình dạng tùy chỉnh cho xương này" msgid "Custom Shape Rotation" -msgstr "Hình Dạng Xoay Tùy Chọn" +msgstr "Xoay Chiều của Hình Dạng Tùy Chỉnh" msgid "Adjust the rotation of the custom shape" -msgstr "Chỉnh xoay của hình dạng tùy chọn" +msgstr "Điều chỉnh mức xoay chiều của hình dạng tùy chỉnh" msgid "Custom Shape Scale" -msgstr "Phóng To Hình Dạng Tùy Chọn" +msgstr "Tỷ Lệ của Hình Dạng Tùy Chọn" msgid "Adjust the size of the custom shape" -msgstr "Chỉnh kích cỡ của hình dạng tùy chọn" +msgstr "Điều chỉnh kích thước của hình dạng tùy chọn" msgid "Custom Shape Transform" -msgstr "Biến Hóa Vật Thể Tùy Chọn" +msgstr "Biến Hóa của Hình Dạng Tùy Chọn" msgid "Bone that defines the display transform of this custom shape" -msgstr "Xương được chỉ định biến hóa hiển thị của hình dạng tùy chọn này" +msgstr "Xương xác định hiển thị biến hóa của hình dạng tùy chọn này" msgid "Custom Shape Translation" -msgstr "Biến Hóa Hình Dạng Tùy Chọn" +msgstr "Dịch Chuyển của Hình Dạng Tùy Chọn" msgid "Adjust the location of the custom shape" -msgstr "Chỉnh vị trí của hình dạng tùy chọn" +msgstr "Điều chỉnh vị trí của hình dạng tùy chọn" msgid "Pose Head Position" -msgstr "Vị Trí Đầu Dạng Đứng" +msgstr "Vị Trí Đầu của Tư Thế" msgid "Location of head of the channel's bone" -msgstr "Vị trí của đầu xương của kênh" +msgstr "Vị trí đầu xương của kênh" msgid "IK Lin Weight" -msgstr "Quyền Lượng Bậc Một IK" +msgstr "Trọng Lượng IK Tuyến Tính" msgid "Weight of scale constraint for IK" -msgstr "Quyền lượng của phóng to cho IK" +msgstr "Trọng lượng của ràng buộc tỷ lệ cho IK" msgid "IK X Maximum" -msgstr "Cực Đại IK X" +msgstr "Tối Đa IK X" msgid "Maximum angles for IK Limit" -msgstr "Góc cực đại cho Hạn Chế IK" +msgstr "Góc độ tối đa cho Giới Hạn IK" msgid "IK Y Maximum" -msgstr "Cực Đại IK Y" +msgstr "Tối Đa IK Y" msgid "IK Z Maximum" -msgstr "Cực Đại IK Z" +msgstr "Tối Đa IK Z" msgid "IK X Minimum" -msgstr "Cực Tiểu IK X" +msgstr "Tối Thiểu IK X" msgid "Minimum angles for IK Limit" -msgstr "Góc cực tiểu cho Hạn Chế IK" +msgstr "Góc độ tối thiểu cho Giới Hạn IK" msgid "IK Y Minimum" -msgstr "Cực Tiểu IK Y" +msgstr "Tối Thiểu IK Y" msgid "IK Z Minimum" -msgstr "Cực Tiểu IK Z" +msgstr "Tối Thiểu IK Z" msgid "IK Rotation Weight" -msgstr "Quyền Lượng Xoay IK" +msgstr "Trọng Lượng Xoay Chiều IK" msgid "Weight of rotation constraint for IK" -msgstr "Quyền lượng của ranh buộc xoay cho IK" +msgstr "Trọng lượng của ràng buộc xoay chiều cho IK" msgid "IK X Stiffness" @@ -79850,7 +87411,7 @@ msgstr "Độ Cứng IK X" msgid "IK stiffness around the X axis" -msgstr "Độ cứng IK quanh trục X" +msgstr "Độ cứng của IK quanh trục X" msgid "IK Y Stiffness" @@ -79858,7 +87419,7 @@ msgstr "Độ Cứng IK Y" msgid "IK stiffness around the Y axis" -msgstr "Độ cứng IK quanh trục Y" +msgstr "Độ cứng của IK quanh trục Y" msgid "IK Z Stiffness" @@ -79866,15 +87427,15 @@ msgstr "Độ Cứng IK Z" msgid "IK stiffness around the Z axis" -msgstr "Độ cứng IK quanh trục Z" +msgstr "Độ cứng của IK quanh trục Z" msgid "IK Stretch" -msgstr "Kéo Dài IK" +msgstr "Kéo Giãn IK" msgid "Allow scaling of the bone for IK" -msgstr "Cho phóng to xương cho IK" +msgstr "Cho phép đổi tỷ lệ của xương trong IK" msgid "Has IK" @@ -79882,7 +87443,7 @@ msgstr "Có IK" msgid "Is part of an IK chain" -msgstr "Là phần của một chuỗi IK" +msgstr "Là một phần của chuỗi IK" msgid "IK X Lock" @@ -79890,7 +87451,7 @@ msgstr "Khóa IK X" msgid "Disallow movement around the X axis" -msgstr "Không cho chuyển động quanh trục X" +msgstr "Không cho phép chuyển động quanh trục X" msgid "IK Y Lock" @@ -79898,7 +87459,7 @@ msgstr "Khóa IK Y" msgid "Disallow movement around the Y axis" -msgstr "Không cho chuyển động quanh trục Y" +msgstr "Không cho phép chuyển động quanh trục Y" msgid "IK Z Lock" @@ -79906,39 +87467,47 @@ msgstr "Khóa IK Z" msgid "Disallow movement around the Z axis" -msgstr "Không cho chuyển động quanh trục Z" +msgstr "Không cho phép chuyển động quanh trục Z" msgid "Pose Matrix" -msgstr "Ma Trận Dạng Đứng" +msgstr "Ma Trận Tư Thế" + + +msgid "Final 4×4 matrix after constraints and drivers are applied, in the armature object space" +msgstr "Ma trận 4×4 cuối cùng sau khi đã áp dụng các ràng buộc và các điều vận, trong không gian đối tượng của khung cốt" msgid "Alternative access to location/scale/rotation relative to the parent and own rest bone" -msgstr "Lối thay phiên đến vị trí/phóng to/xoay tương đối với phụ huynh và xương nghỉ một mình" +msgstr "Hình thức khác để truy cập vị trí/tỷ lệ/xoay chiều tương đối với phụ huynh và xương ở trạng thái nghỉ của bản thân" msgid "Channel Matrix" msgstr "Ma Trận Kênh" +msgid "4×4 matrix of the bone's location/rotation/scale channels (including animation and drivers) and the effect of bone constraints" +msgstr "Ma trận 4×4 của các kênh vị trí/xoay chiều/tỷ lệ của xương (bao gồm hoạt họa và các điều vận) cùng ảnh hưởng của các ràng buộc xương" + + msgid "Parent of this pose bone" -msgstr "Phụ huynh của xương dạng đứng này" +msgstr "Phụ huynh của xương tư thế này" msgid "Pose Tail Position" -msgstr "Vị Trí Đuôi Dạng Đứng" +msgstr "Vị Trí Đuôi của Tư Thế" msgid "Location of tail of the channel's bone" -msgstr "Vị trí cho đuôi của xương của kênh" +msgstr "Vị trí đuôi xương của kênh" msgid "Scale to Bone Length" -msgstr "Phóng to đến Bề Dài Xương" +msgstr "Đổi Tỷ Lệ cho Khít với Chiều Dài của Xương" msgid "Scale the custom object by the bone length" -msgstr "Phóng to vật thể tùy chọn bằng bề dài của xương" +msgstr "Đổi tỷ lệ đối tượng tùy chọn theo chiều dài của xương" msgid "IK X Limit" @@ -79966,87 +87535,87 @@ msgstr "Hạn chế chuyển động quanh trục Z" msgid "IK Linear Control" -msgstr "Điều Khiển IK Bật Một" +msgstr "Điều Khiển IK Tuyến Tính" msgid "Apply channel size as IK constraint if stretching is enabled" -msgstr "Áp dụng kích cỡ kênh như ràng buộc IK nếu có bật kéo dài" +msgstr "Áp dụng kích thước của kênh như ràng buộc IK nếu cho phép kéo giãn" msgid "IK Rotation Control" -msgstr "Điều Khiển Xoay IK" +msgstr "Điều Khiển IK Xoay Chiều" msgid "Apply channel rotation as IK constraint" -msgstr "Áp dụng xoay kênh như ràng buộc IK" +msgstr "Áp dụng sự xoay chiều của kênh như là ràng buộc IK" msgid "PoseBone Constraints" -msgstr "Ràng Buộc Xương Dạng Đứng" +msgstr "Ràng Buộc Xương Tư Thế" msgid "Collection of pose bone constraints" -msgstr "Sưu tập ràng buộc xương dạng đứng" +msgstr "Bộ sưu tập các ràng buộc cho xương tư thế" msgid "Active PoseChannel constraint" -msgstr "Ràng Buộc Kênh Dạng Đứng Hoạt Động" +msgstr "Ràng buộc của Kênh Tư Thế đang hoạt động" msgid "Global preferences" -msgstr "Tùy chọn toàn cầu" +msgstr "Cài đặt sở thích toàn cầu" msgid "Active Section" -msgstr "Phần Hoạt Động" +msgstr "Phân Vùng Hoạt Động" msgid "Active section of the preferences shown in the user interface" -msgstr "Khúc hoạt động của tùy chọn người dùng được hiển thị trong giao diện người dùng" +msgstr "Phân vùng hoạt động của các cài đặt sở thích đang được hiển thị trong giao diện người dùng" msgid "Application Template" -msgstr "Bố Cục Mẫu Ứng Dụng" +msgstr "Mẫu Ứng Dụng" msgid "Apps" -msgstr "Ứng Dụng" +msgstr "Trình Ứng Dụng" msgid "Preferences that work only for apps" -msgstr "Tùy chọn chỉ hoạt động cho ứng dụng" +msgstr "Các cài đặt sở thích chỉ làm việc với các trình ứng dụng mà thôi" msgid "Auto-Execution Paths" -msgstr "Đường Dẫn Tự Động-Thực Hành" +msgstr "Đường Dẫn Thi Hành Tự Động" msgid "Edit Methods" -msgstr "Phương Pháp Biên Tập" +msgstr "Phương Pháp Biên Soạn" msgid "Settings for interacting with Blender data" -msgstr "Cài đặt cho tương tác với thông tin Blender" +msgstr "Sắp đặt để tương tác với dữ liệu của Blender" msgid "Settings for features that are still early in their development stage" -msgstr "Cài đặt chi tính năng đang khởi động phát triển" +msgstr "Những sắp đặt dành cho các chức năng vẫn còn nằm trong giai đoạn đầu (non nớt) của quá trình phát triển" msgid "Default paths for external files" -msgstr "Đường dẫn mặc định cho tập tin ngoài" +msgstr "Đường dẫn mặc định cho những tập tin ở bên ngoài" msgid "Settings for input devices" -msgstr "Cài đặt cho thiết bị ngõ vào" +msgstr "Sắp đặt cho các thiết bị đầu vào" msgid "Preferences have changed" -msgstr "Đã đổi Tùy Chọn Người Dùng" +msgstr "Cài đặt sở thích đã thay đổi" msgid "Shortcut setup for keyboards and other input devices" -msgstr "Cài đặt phím tắt cho bàn phím và thiết bị ngõ vào khác" +msgstr "Sắp đặt đường tắt cho bàn phím và các thiết bị khác" msgid "System & OpenGL" @@ -80054,59 +87623,67 @@ msgstr "Hệ Thống & OpenGL" msgid "Graphics driver and operating system settings" -msgstr "Cài đặt trình điều khiển đồ họa và hệ điều hành" +msgstr "Điều vận đồ họa và các sắp đặt của hệ điều hành" msgid "Save on Exit" -msgstr "Lưu Khi Thoát" +msgstr "Lưu khi Thoát" msgid "Save preferences on exit when modified (unless factory settings have been loaded)" -msgstr "Lưu tùy chọn khi thoát nếu nó được sửa đổi (trừ khi được nhập cài đặt xưởng)" +msgstr "Lưu các cài đặt sở thích đã thay đổi lại khi thoát (trừ phi các sắp đặt của xưởng sản xuất đã được nạp)" + + +msgid "Recent Searches" +msgstr "Các Tìm Kiếm Gần Đây" + + +msgid "Sort the recently searched items at the top" +msgstr "Sắp xếp thứ tự các mục tìm kiếm gần đây ở trên cùng" msgid "Version of Blender the userpref.blend was saved with" -msgstr "Phiên bản của Blender đã lưu tập tin .blend tùy chọn" +msgstr "Bản userpref.blend (tùy chọn của người dùng), phiên bản của Blender, đã được lưu cùng" msgid "View & Controls" -msgstr "Màn & Đồ Điều Khiển" +msgstr "Góc Nhìn & các Điều Khiển" msgid "Preferences related to viewing data" -msgstr "Tùy chọn về hiển thị thông tin" +msgstr "Cài đặt sở thích liên quan đến việc duyệt trình dữ liệu" msgid "Corner Splitting" -msgstr "Chẻ Góc Giác" +msgstr "Tách Biệt ở Góc" msgid "Split and join editors by dragging from corners" -msgstr "Chẻ và gồm trình biên soạn bằng kéo tư góc giác" +msgstr "Tách phân hoặc hội nhập các trình biên soạn lại bằng cách kéo rê từ các góc" msgid "Edge Resize" -msgstr "Chỉnh Cỡ Thước Cạnh" +msgstr "Đổi Kích Thước Cạnh" msgid "Resize editors by dragging from the edges" -msgstr "Chỉnh cỡ thước của những trình biên soạn bằng kéo cạnh của nó" +msgstr "Chỉnh sửa các trình biên soạn bằng cách kéo rê từ các cạnh" msgid "Regions Visibility Toggle" -msgstr "Bật/Tắt Sự Hiển Thị Của Vùng" +msgstr "Bật/Tắt khả năng Ẩn/Hiện của Vùng" msgid "Header and side bars visibility toggles" -msgstr "Bật/tắt sự hiển thị của đầu và thanh bên hong" +msgstr "Bật/Tắt tính ẩn/hiện của tiêu đề và thanh bên" msgid "Auto Keying Mode" -msgstr "Chế Độ Bức Ảnh Mẫu Tự Động" +msgstr "Chế Độ Khung Khóa Tự Động" msgid "Mode of automatic keyframe insertion for Objects and Bones (default setting used for new Scenes)" -msgstr "Chế độ chèn bức ảnh mẫu tự động cho Vật Thể và Xương (cài đặt mặc định được dùng cho Cảnh mới)" +msgstr "Chế độ chèn thêm khung khóa tự động cho các Đối Tượng và các Xương (cài đặt mặc định để sử dụng cho các Cảnh mới)" msgid "Add/Replace" @@ -80114,492 +87691,604 @@ msgstr "Thêm/Thay Thế" msgid "Collection Instance Empty Size" -msgstr "Cỡ Của Vật Thể Rỗng Thực Thể" +msgstr "Tạo Bộ Sưu Tập Mới" msgid "Display size of the empty when new collection instances are created" -msgstr "Hiển thị cỡ của vật thể rỗng khi chế tạo thực thể của sưu tập" +msgstr "Hiển thị kích thước của đối tượng rỗng khi các thực thể của bộ sưu tập mới được kiến tạo" msgid "New Curve Smoothing Mode" -msgstr "Chế Độ Mịn Hóa Đường Cong Mới" +msgstr "Chế Độ Làm Mềm Mại Đường Cong Mới" msgid "Auto Handle Smoothing mode used for newly added F-Curves" -msgstr "Chế độ tự động mịn hóa được sử dụng cho các Cong-F mới thêm" +msgstr "Chế độ Tự Động Làm Mịn Tay Cầm sử dụng cho những Đường Cong-F mới cho thêm vào" msgid "Unselected F-Curve Opacity" -msgstr "Độ Đục của Cong-F chưa được chọn" +msgstr "Độ Đục của Đường Cong-F Chưa Chọn" msgid "The opacity of unselected F-Curves against the background of the Graph Editor" -msgstr "Độ đục của các Cong-F chưa được chọn so với nền của Trình Biên Soạn Biều Đồ" +msgstr "Độ đục của các Đường Cong-F chưa chọn, so với nền đằng sau của Trình Biên Soạn Đồ Thị" msgid "Annotation Default Color" -msgstr "Màu Mặc Định Lời Ghi Chú" +msgstr "Màu Sắc Mặc Định của Ghi Chú" msgid "Color of new annotation layers" -msgstr "Màu của lớp lời ghi chú mới" +msgstr "Màu sắc của các tầng chú thích mới" msgid "Grease Pencil Eraser Radius" -msgstr "Bút Sáp Bán Kính Xóa" +msgstr "Bút Chì Dầu Bán Kính của Tẩy" msgid "Radius of eraser 'brush'" -msgstr "Bán Kính của 'bút' xóa" +msgstr "Bán kính của 'đầu bút' tẩy" msgid "Grease Pencil Euclidean Distance" -msgstr "Bút Sáp Khoảng Cách Euclid" +msgstr "Khoảng Cách Euclid của Bút Chì Dầu" msgid "Distance moved by mouse when drawing stroke to include" -msgstr "Khoảng cách chuột di chuyển khi vẽ nét gồm" +msgstr "Khoảng cách mà chuột được di chuyển trước khi nét vẽ được ghi nhận" msgid "Grease Pencil Manhattan Distance" -msgstr "Bút Sáp Khaỏnh Cách Manhattan" +msgstr "Khoảng cách Manhattan của Bút Chì Dầu" msgid "Pixels moved by mouse per axis when drawing stroke" -msgstr "Điểm ảnh chuột di chuyển theo mỗi trục khi vẽ nét" +msgstr "Số điểm ảnh chuột được di chuyển trên mỗi trục khi vẽ nét (trước khi chuyển động được ghi nhận)" msgid "New Handles Type" -msgstr "Loại Tay Cầm Mới" +msgstr "Loại Tay Cầm cho Cái Mới" msgid "Handle type for handles of new keyframes" -msgstr "Loại tay cầm cho tay cầm của bức ảnh mẫu mới" +msgstr "Loại tay cầm cho các khung khóa mới" msgctxt "Action" msgid "New Interpolation Type" -msgstr "Loại Nội Suy Mới" +msgstr "Kiểu Nội Suy Mới" msgid "Interpolation mode used for first keyframe on newly added F-Curves (subsequent keyframes take interpolation from preceding keyframe)" -msgstr "Chế độ suy nội dùng cho bức ảnh đầu của Cong-F mới thêm (bức ảnh sau dùng suy nội từ bức ảnh trước)" +msgstr "Chế độ nội suy sử dụng cho khung khóa đầu tiên của Đường Cong-F mới được thêm vào (các khung khóa sau đó sẽ dùng sự nội suy từ khung khóa nằm trước)" msgid "Material Link To" -msgstr "Liên Kết Vật Liệu Với" +msgstr "Nguyên Vật Liệu Kết Nối Với" msgid "Toggle whether the material is linked to object data or the object block" -msgstr "Bật/tắt vật liệu được liên kết với dữ liệu vật thể hay cục vật thể" +msgstr "Xác định hoặc là nguyên vật liệu được kết nối với dữ liệu đối tượng, hoặc là với khối đối tượng" msgid "Auto-offset Margin" -msgstr "Tự Động Dịch Lề" +msgstr "Mép Lề để Tự Động Dịch Chuyển" msgid "Minimum distance between nodes for Auto-offsetting nodes" -msgstr "Khoảng cách cực tiểu giữa giao điểm cho Tự Động dịch giao điểm" +msgstr "Khoảng cách tối thiểu giữa các nút, dành cho quá trình Tự Động Dịch Chuyển các nút" + + +msgid "Node Preview Resolution" +msgstr "Độ Phân Giải Xem Trước của Nút" + + +msgid "Resolution used for Shader node previews (should be changed for performance convenience)" +msgstr "Độ phân giải sử dụng để xem trước nút Tô Bóng (nên thay đổi để thuận tiện cho việc thực hiện với hiệu suất hoạt động tốt hơn)" msgid "Auto-offset" -msgstr "Tự động dịch" +msgstr "Tự Động Dịch Chuyển" msgid "Automatically offset the following or previous nodes in a chain when inserting a new node" -msgstr "Tự động dịch các giao điểm trước hay sau trong một chuỗi khi chèn một giao điểm mới" +msgstr "Tự động dịch chuyển các nút nằm trước, hoặc tiếp sau trong một chuỗi xích khi chèn thêm nút mới" msgid "Align Object To" -msgstr "Sắp Hàng Vật Thể Đến" +msgstr "Căn Chỉnh Đối Tượng Theo" msgid "The default alignment for objects added from a 3D viewport menu" -msgstr "Sắp hàng mặc định cho vật thể thêm từ danh bạ của một màn 3D" +msgstr "Căn chỉnh mặc định cho các đối tượng được cho thêm vào từ trình đơn cổng nhìn 3D" msgid "Align newly added objects to the world coordinate system" -msgstr "Sắp xếp vật thể mới thêm với hệ thống tọa độ thế giới" +msgstr "Căn chỉnh những đối tượng mới thêm vào theo hệ thống tọa độ thế giới" msgid "Align newly added objects to the active 3D view orientation" -msgstr "Sắp hàng vật thể mới thêm theo định hướng của Màn Chiếu 3D hoạt động" +msgstr "Căn chỉnh những đối tượng mới cho thêm vào theo chiều hướng của góc nhìn 3D đang hoạt động" msgid "Align newly added objects to the 3D Cursor's rotation" -msgstr "Sắp xếp các vật thể mới thêm với xoay của con trỏ 3D" +msgstr "Căn chỉnh những đối tượng mới thêm theo chiều xoay của Con Trỏ 3D" msgid "Sculpt/Paint Overlay Color" -msgstr "Màu Khắc/Sơn Lên Trên" +msgstr "Màu Lớp Lồng trong Điêu Khắc/Sơn" msgid "Color of texture overlay" -msgstr "Màu của lớp che chất liệu" +msgstr "Màu của chất liệu lồng" + + +msgid "Only Show Selected F-Curve Keyframes" +msgstr "Duy Hiển Thị các Khung Khóa của Đường Cong-F được Chọn" msgid "Only keyframes of selected F-Curves are visible and editable" -msgstr "Chỉ bức ảnh mẫu của Cong-F được chọn được hiển thị và có thể biên tập" +msgstr "Duy các khung khóa của Đường Cong-F được chọn là nhìn thấy được và có thể biên soạn mà thôi" msgid "Undo Memory Size" -msgstr "Kích Cỡ Bộ Nhớ Hủy Bước" +msgstr "Lượng Bộ Nhớ Dùng Cho Hoàn Tác" msgid "Maximum memory usage in megabytes (0 means unlimited)" -msgstr "Bộ nhớ tối đa được dùng (đơn vị megabyte, 0 nghĩa là vô hạn)" +msgstr "Lượng bộ nhớ sử dụng tối đa trong đơn vị megabyte (0 nghĩa là vô hạn)" msgid "Undo Steps" -msgstr "Bước Hủy Bước" +msgstr "Số Bước Hoàn Tác" msgid "Number of undo steps available (smaller values conserve memory)" -msgstr "Sô lượng hủy bước có thể dùng (giá trị nhỏ được tiết kiệm bộ nhớ)" +msgstr "Số lượng bước hoàn tác khả dĩ (dùng các giá trị nhỏ để tiết kiệm bộ nhớ)" msgid "Channel Group Colors" -msgstr "Màu Sắc Nhóm Kênh" +msgstr "Màu của Nhóm Kênh" msgid "Use animation channel group colors; generally this is used to show bone group colors" -msgstr "Dùng màu sắc của nhóm kênh hoạt hình; thường xuyên được dùng cho hiện màu sắc của nhóm xương" +msgstr "Sử dụng màu của nhóm kênh hoạt họa; thường sử dụng để hiển thị các màu của nhóm xương" msgid "Auto Keying Enable" -msgstr "Bật Bức Ảnh Mẫu Tự Động" +msgstr "Bật Khung Khóa Hóa Tự Động" msgid "Automatic keyframe insertion for Objects and Bones (default setting used for new Scenes)" -msgstr "Tự động chèn bức ảnh mẫu cho Vật Thể và Xương (cài đặt mặc định được dùng cho Cảnh mới)" +msgstr "Tự động chèn thêm khung khóa cho các Đối Tượng và các Xương (sắp đặt mặc định dùng cho những Cảnh mới)" msgid "Show Auto Keying Warning" -msgstr "Hiện Báo Cáo Bức Ảnh Mẫu Tự Động" +msgstr "Hiển Thị Cảnh Báo Nếu Khung Khóa Hóa Tự Động" msgid "Show warning indicators when transforming objects and bones if auto keying is enabled" -msgstr "Hiện cảnh báo khi biến hóa vật thể và xương nếu bức ảnh mẫu tự động được bật" +msgstr "Nếu sử dụng chức năng tự động khung khóa hóa thì hiển thị những dấu hiệu cảnh báo khi biến hóa các đối tượng và các xương" msgid "Cursor Lock Adjust" -msgstr "Chỉnh Khóa Con Trò" +msgstr "Điều Chỉnh Khóa Con Trỏ" msgid "Place the cursor without 'jumping' to the new location (when lock-to-cursor is used)" -msgstr "Đặt vị trí con trò mà không 'nhảy' đến một vị trí mới (khi đang dùng khóa đến con trỏ)" +msgstr "Đặt con trỏ mà không cần 'nhảy' sang vị trí mới (khi sử dụng khóa-vào-con trỏ )" msgid "Duplicate Action" -msgstr "Sao Chép Hành Động" +msgstr "Nhân Đôi Hành Động" msgid "Causes actions to be duplicated with the data-blocks" -msgstr "Chép lại các hành động với cục dữ liệu" +msgstr "Làm cho các hành động cùng được sao chép với khối dữ liệu" msgid "Duplicate Armature" -msgstr "Sao Chép Cốt" +msgstr "Nhân Đôi Khung Cốt" msgid "Causes armature data to be duplicated with the object" -msgstr "Làm dữ liệu cốt được chép lại với vật thể" +msgstr "Làm cho dữ liệu khung cốt cùng được sao chép với đối tượng" msgid "Duplicate Camera" -msgstr "Sao Chép Máy Quay Phim" +msgstr "Nhân Đôi Máy Quay Phim" msgid "Causes camera data to be duplicated with the object" -msgstr "Chép lại dữ liệu máy quay phim với vật thể" +msgstr "Làm cho dữ liệu máy quay phim cùng được sao chép với đối tượng" msgid "Causes curve data to be duplicated with the object" -msgstr "Chép lại dữ liệu đường cong với vật thể" +msgstr "Làm cho dữ liệu cong cùng được sao chép với đối tượng" msgid "Duplicate Curves" -msgstr "Sao Chép Đường Cong" +msgstr "Nhân Đôi Đường Cong" msgid "Causes curves data to be duplicated with the object" -msgstr "Cho chép lại dữ liệu đường cong với vật thể" +msgstr "Làm cho dữ liệu đường cong cùng được sao chép với đối tượng" msgid "Duplicate GPencil" -msgstr "Sao Chép Bút Sáp" +msgstr "Nhân Đôi Bút Chì Dầu" msgid "Causes grease pencil data to be duplicated with the object" -msgstr "Chép lại dữ liệu bút sáp với vật thể" +msgstr "Làm cho dữ liệu Bút Chì Dầu được sao chép với đối tượng" msgid "Duplicate Lattice" -msgstr "Sao Chép Lưới Rào" +msgstr "Nhân Đôi Lưới Rào" msgid "Causes lattice data to be duplicated with the object" -msgstr "Chép lại dữ liệu lưới rào với vật thể" +msgstr "Làm cho dữ liệu lưới rào cùng được sao chép với đối tượng" msgid "Duplicate Light" -msgstr "Sao Chép Đèn" +msgstr "Nhân Đôi Ánh Sáng" msgid "Causes light data to be duplicated with the object" -msgstr "Chép lại dữ liệu đèn với vật thể" +msgstr "Làm cho dữ liệu ánh sáng được sao chép với đối tượng" msgid "Duplicate Light Probe" -msgstr "Sao Chép Quang Kế" +msgstr "Nhân Đôi Bộ Thăm Dò Ánh Sáng" msgid "Causes light probe data to be duplicated with the object" -msgstr "Chép lại dữ liệu quang kế với vật thể" +msgstr "Làm cho dữ liệu bộ thăm dò ánh sáng được sao chép với đối tượng" msgid "Duplicate Material" -msgstr "Sao Chẹp Vật Liệu" +msgstr "Nhân Đôi Nguyên Vật Liệu" msgid "Causes material data to be duplicated with the object" -msgstr "Chép lại dữ liệu vật liệu với vật thể" +msgstr "Làm cho dữ liệu về nguyên vật liệu cùng được sao chép với đối tượng" msgid "Duplicate Mesh" -msgstr "Sao Chép Mạng Lưới" +msgstr "Nhân Đôi Khung Lưới" msgid "Causes mesh data to be duplicated with the object" -msgstr "Chép lại dữ liệu mạng lưới với vật thể" +msgstr "Làm cho dữ liệu khung lưới cùng được sao chép với đối tượng" msgid "Duplicate Metaball" -msgstr "Sao Chép Siêu Cầu" +msgstr "Nhân Đôi Siêu Cầu" msgid "Causes metaball data to be duplicated with the object" -msgstr "Chép lại dữ liệu siêu cầu với vật thể" +msgstr "Làm cho dữ liệu siêu cầu cùng được sao chép với đối tượng" + + +msgid "Duplicate Node Tree" +msgstr "Nhân Đôi Cây Nút" + + +msgid "Make copies of node groups when duplicating nodes in the node editor" +msgstr "Tạo bản sao của các nhóm nút khi nhân đôi (sao chép) các nút trong trình biên soạn nút" msgid "Duplicate Particle" -msgstr "Sao Chép Hạt" +msgstr "Nhân Đôi Hạt" msgid "Causes particle systems to be duplicated with the object" -msgstr "Chép lại dữ liệu hệ thống hạt với vật thể" +msgstr "Làm cho dữ liệu hệ thống hạt cùng được sao chép với đối tượng" msgid "Duplicate Point Cloud" -msgstr "Sao Chép Mây Điểm" +msgstr "Nhân Đôi Đám Mây Điểm" msgid "Causes point cloud data to be duplicated with the object" -msgstr "Chép lại dữ liệu mây điểm với vật thể" +msgstr "Làm cho dữ liệu đám mây điểm củng được sao chép với đối tượng" msgid "Duplicate Speaker" -msgstr "Bản Sao Loa" +msgstr "Nhân Đôi Loa" msgid "Causes speaker data to be duplicated with the object" -msgstr "Chép lại dữ liệu loa với vật thể" +msgstr "Làm cho dữ liệu loa cùng được sao chép với đối tượng" msgid "Duplicate Surface" -msgstr "Sao Chép Bề Mặt" +msgstr "Nhân Đôi Bề Mặt" msgid "Causes surface data to be duplicated with the object" -msgstr "Chép lại dữ liệu bề mặt với vật thể" +msgstr "Làm cho dữ liệu bề mặt cùng được sao chép với đối tượng" msgid "Duplicate Text" -msgstr "Sao Chép Văn Bản" +msgstr "Nhân Đôi Văn Bản" msgid "Causes text data to be duplicated with the object" -msgstr "Chép lại dữ liệu văn bản với vật thể" +msgstr "Làm cho dữ liệu văn bản cùng được sao chép với đối tượng" msgid "Duplicate Volume" -msgstr "Sao Chép Thể Tích" +msgstr "Nhân Đôi Thể Tích" msgid "Causes volume data to be duplicated with the object" -msgstr "Chép lại dữ liệu thể tích với vật thể" +msgstr "Làm cho dữ liệu thể tích được sao chép cùng với đối tượng" msgid "Enter edit mode automatically after adding a new object" -msgstr "Vào Chế Độ Biên Tập tự động sau thêm một vật thể mới" +msgstr "Sau khi cho thêm một đối tượng mới vào thì tự động chuyển sang chế độ biên soạn" + + +msgid "F-Curve High Quality Drawing" +msgstr "Vẽ Đường Cong-F Chất Lượng Cao" + + +msgid "Draw F-Curves using Anti-Aliasing (disable for better performance)" +msgstr "Vẽ Đường Cong-F dùng phương pháp Khử Răng Cưa (tắt đi để có hiệu suất hoạt động cao hơn)" msgid "Global Undo" -msgstr "Hủy Bước Toàn Cầu" +msgstr "Hoàn Tác Toàn Cầu" msgid "Global undo works by keeping a full copy of the file itself in memory, so takes extra memory" -msgstr "Hủy bước toàn cầu được hoạt động bằng giữ một sao chép toàn bộ của tập tin trong bộ nhớ, cho nên nó cần bộ nhớ nhiều hơn" +msgstr "Hoàn tác toàn cầu hoạt động bằng cách lưu giữ toàn bộ bản sao của tập tin trong bộ nhớ, do đó nó cần bộ nhớ nhiều hơn" msgid "New F-Curve Colors - XYZ to RGB" -msgstr "Màu Cong-F Mới - XYZ đến RGB" +msgstr "Màu cho Đường Cong-F Mới - XYZ đến RGB" msgid "Color for newly added transformation F-Curves (Location, Rotation, Scale) and also Color is based on the transform axis" -msgstr "Màu cho Cong-F biến hóa mới kèm (Vị Trí, Xoay, Phóng To) và Màu từ cơ sở trục biến hóa" +msgstr "Màu cho các Đường Cong-F biến hóa mới được thêm (Vị Trí, Xoay, Tỷ Lệ) và Màu Sắc được dựa trên trục biến hóa nữa" msgid "Auto Keyframe Insert Available" -msgstr "Có Thể Dùng Chèn Bức Ảnh Mẫu Tự Động" +msgstr "Tự Động Chèn Thêm Khung Khóa Có Sẵn" msgid "Automatic keyframe insertion in available F-Curves" -msgstr "Chèn bức ảnh mẫu tự động cho các Cong-F có thể dùng" +msgstr "Tự động chèn thêm khung khóa trong các Đường Cong-F có sẵn" msgid "Keyframe Insert Needed" -msgstr "Cần Chèn Bức Ảnh Mẫu" +msgstr "Khung Khóa Chèn Thêm Cần Thiết" msgid "Keyframe insertion only when keyframe needed" -msgstr "Chèn bức ảnh mẫu chỉ khi cần bức ảnh mẫu" +msgstr "Chỉ chèn thêm khung khóa khi nào cần thiết mà thôi" msgid "Cursor Surface Project" -msgstr "Bề Mặt Chiếu Con Trỏ" +msgstr "Con Trỏ dùng sự Phóng Chiếu Bề Mặt" msgid "Use the surface depth for cursor placement" -msgstr "Sùng độ sâu bề mặt cho đặt vị trí con trỏ" +msgstr "Sử dụng chiều sâu bề mặt trong việc đặt con trỏ" msgid "Allow Negative Frames" -msgstr "Cho Bức Ảnh Âm" +msgstr "Cho Phép Số Khung Hình Âm" msgid "Current frame number can be manually set to a negative value" -msgstr "Số bức ảnh hiện tại có thể đặt thành giá trị âm" +msgstr "Số khung hình hiện tại có thể thủ công đặt thành một giá trị âm" msgid "Auto Close Character Pairs" -msgstr "Tự Động Đóng Cặp Đôi Ký Tự" +msgstr "Tự Động Đóng Cặp Ký Tự" msgid "Automatically close relevant character pairs when typing in the text editor" -msgstr "Tự động đóng những cặp đôi ký tự liên quan nhau trong trình biên soạn văn bản" +msgstr "Tự động đóng các cặp ký tự có liên quan khi đánh máy chữ vào trình biên soạn văn bản" msgid "Use Visual keying automatically for constrained objects" -msgstr "Dùng đặt bức ảnh mẫu thị giác tự động cho vật thể được ràng buộc" +msgstr "Sử dụng khung khóa hóa Trực Quan tự động đối với các đối tượng bị ràng buộc" msgid "Experimental features" -msgstr "Tính năng thử nhiệm" +msgstr "Chức năng thử nghiệm" + + +msgid "Overlay Next" +msgstr "Vẽ Lồng Tiếp Tới" + + +msgid "Enable the new Overlay codebase, requires restart" +msgstr "Bật cơ sở mã nguồn Vẽ Lồng mới, yêu cầu phải khởi động lại" msgid "Override Auto Resync" -msgstr "Vượt Quyền Cho Đồng Bộ Lại Tự Động" +msgstr "Tái Đồng Bộ Hóa Vượt Quyền" msgid "Enable library overrides automatic resync detection and process on file load. Disable when dealing with older .blend files that need manual Resync (Enforce) handling" -msgstr "Bật đồ vượt quyền thư viện được tự động phát hiện đồng bộ lại và qúa trình khi nạp tập tin. Tắt khi xử lý tập tin .blend cũ hơn vì cần đồng bộ lại (Bắt Buộc) bằng tay." +msgstr "Bật tính năng vượt quyền thư viện tự động phát hiện đồng bộ hóa và gia công khi nạp tập tin. Tắt tính năng đi khi xử lý các tập tin .blend cũ hơn, tức những cái cần phải Tái Đồng Bộ Hóa (Bắt Buộc) một cách thủ công" msgid "Asset Debug Info" -msgstr "Thông Tin Sửa Lỗi Lầm Tích Sản" +msgstr "Thông Tin Điều Tra Gỡ Lỗi Tài Sản" msgid "Enable some extra fields in the Asset Browser to aid in debugging" -msgstr "Bật vài trường thêm trong Trình Duyệt Tích Sản cho giúp đỡ sửa lỗi lầm" +msgstr "Bật một số trường bổ sung trong Trình Duyệt Thảo Tài Sản để hỗ trợ quá trình điều tra gỡ lỗi" + + +msgid "All Linked Data Direct" +msgstr "Toàn Bộ Dữ Liệu Kết Nối Trực Tiếp" + + +msgid "Forces all linked data to be considered as directly linked. Workaround for current issues/limitations in BAT (Blender studio pipeline tool)" +msgstr "Buộc toàn bộ dữ liệu liên kết được coi là được kết nối trực tiếp. Giải pháp tránh né cho các sự cố/hạn chế hiện tại trong BAT (Công cụ đường ống của studio Blender)" msgid "Asset Indexing" -msgstr "Chỉ Số Tích Sản" +msgstr "Lập Mục Lục Tài Sản" msgid "Disabling the asset indexer forces every asset library refresh to completely reread assets from disk" -msgstr "Tắt bộ đặt chỉ số cho tích sản bắt buộc mỗi lần hoàn lại thư viện tích sản phải nhập lại tích sản từ đĩa" +msgstr "Việc tắt trình lập mục lục buộc mỗi chu kỳ làm mới nội dung thư viện tài sản phải đọc lại nội dung tài sản hoàn toàn từ đĩa" msgid "Cycles Debug" -msgstr "Sửa Sai Lầm Cycles" +msgstr "Điều Tra Gỡ Lỗi của Cycles" msgid "Enable Cycles debugging options for developers" -msgstr "Bật tùy chọn sửa sai lầm Cycles cho lập trình viên" +msgstr "Cho phép các tùy chọn điều tra lỗi trong Cycles đối với các lập trình viên" + + +msgid "EEVEE Debug" +msgstr "Điều Tra Gỡ Lỗi của EEVEE" + + +msgid "Enable EEVEE debugging options for developers" +msgstr "Bật các tùy chọn về điều tra gỡ lỗi EEVEE cho các nhà phát triển" + + +msgid "Experimental Compositors" +msgstr "Các Trình Tổng Hợp Thử Nghiệm" + + +msgid "Enable compositor full frame and realtime GPU execution mode options (no tiling, reduces execution time and memory usage)" +msgstr "Bật các tùy chọn chế độ thực thi GPU toàn khung hình và thời gian thực của bộ tổng hợp (không xếp ô, giảm thời gian thực thi và mức sử dụng bộ nhớ)" msgid "Extended Asset Browser" -msgstr "Trình Duyệt Tích Sản Mở Rộng" +msgstr "Trình Duyệt Thảo Tài Sản Mở Rộng" msgid "Enable Asset Browser editor and operators to manage regular data-blocks as assets, not just poses" -msgstr "Bật trình biên soạn Trình Duyệt Tích Sản và các thao tác để quản lý các cục dữ liệu bình thường như tích sản, không chỉ đạng đứng" +msgstr "Bật trình biên soạn Duyệt Thảo Tài Sản và các thao tác quản lý những khối dữ liệu thông thường tựa các tài sản, không chỉ các tư thế mà thôi" + + +msgid "Enables extension repositories, accessible from the \"Extension Repositories\" panel in the \"File Paths\" section of the preferences. These paths are exposed as add-ons, package management is not yet integrated" +msgstr "Bật các kho lưu trữ tiện ích mở rộng, có thể truy cập từ bảng \"Kho Lưu Trữ Tiện Ích Mở Rộng\" trong phần \"Đường Dẫn Tập Tin\" của cấu hình. Các đường dẫn này được biểu lộ dưới dạng trình bổ sung. Quản lý gói vẫn chưa được tích hợp" + + +msgid "Grease Pencil 3.0" +msgstr "Bút Chì Dầu 3.0" + + +msgid "Enable the new grease pencil 3.0 codebase" +msgstr "Bật cơ sở mã bút chì dầu 3.0 mới" msgid "New Curves Tools" -msgstr "Dụng Cụ Đường Cong Mới" +msgstr "Sử Dụng các Công Cụ Đường Cong Mới" msgid "Enable additional features for the new curves data block" -msgstr "Bật thêm tính nắng cho cục dữ liệu đường cong mới" +msgstr "Bật các tính năng bổ sung cho khối dữ liệu đường cong mới" msgid "New Point Cloud Type" -msgstr "Loại Mây Điểm Mới" +msgstr "Kiểu của Mây Điểm Chấm Mới Tạo" msgid "Enable the new point cloud type in the ui" -msgstr "Bật loại mây điểm mới trong giao diện" +msgstr "Bật kiểu của mây điểm chấm mới tạo trong giao diện người dùng" + + +msgid "New Volume Nodes" +msgstr "Các Nút Thể Tích Mới" + + +msgid "Enables visibility of the new Volume nodes in the UI" +msgstr "Cho phép hiển thị các nút Thể Tích mới trong giao diện người dùng" msgid "Override Templates" -msgstr "Bố Cục Mẫu Đồ Vượt Quyền" +msgstr "Vượt Quyền các Bản Mẫu" + + +msgid "Enable library override template in the Python API" +msgstr "Bật bản mẫu vượt quyền thư viện trong API của Python" msgid "Sculpt Texture Paint" -msgstr "Sơn Chất Liệu Khắc" +msgstr "Sơn Chất Liệu trong Điêu Khắc" msgid "Use texture painting in Sculpt Mode" -msgstr "Sử dụng sơn chất liệu trong Chế Độ Khắc" +msgstr "Sử dụng sơn chất liệu trong Chế Độ Điêu Khắc" msgid "Sculpt Mode Tilt Support" -msgstr "Sự Hỗ Trợ Nghiêng Trong Chế Độ Khắc" +msgstr "Hỗ Trợ Xoay Nghiêng trong Chế Độ Điêu Khắc" msgid "Support for pen tablet tilt events in Sculpt Mode" -msgstr "Hỗ trợ sự kiện bảng vẽ nghiêng trong Chế Độ Khắc" +msgstr "Sự hỗ trợ cho các sự kiện xoay nghiêng của bút bảng điện trong Chế Độ Điêu Khắc" + + +msgid "Shader Node Previews" +msgstr "Xem Trước Nút Tô Bóng" + + +msgid "Enables previews in the shader node editor" +msgstr "Cho phép xem trước trong trình chỉnh sửa nút tô bóng" msgid "Undo Legacy" -msgstr "Hủy Bước Xưa" +msgstr "Hoàn Tác Kiểu Lỗi Thời" msgid "Use legacy undo (slower than the new default one, but may be more stable in some cases)" -msgstr "Dùng hủy bước xưa (chậm hơn hủy bước mới (mặc định), nhưng ổn định hơn cho vài trường hợp)" +msgstr "Sử dụng kiểu hoàn tác cũ trước đây (chậm hơn cái mặc định mới, song có thể ổn định hơn đối với một số trường hợp)" + + +msgid "Enable viewport debugging options for developers in the overlays pop-over" +msgstr "Bật tùy chọn gỡ lỗi cổng nhìn cho các nhà phát triển trong cửa sổ bật lên vẽ lồng" + + +msgid "Active Asset Library" +msgstr "Thư Viện Tài Sản đang Hoạt Động" + + +msgid "Index of the asset library being edited in the Preferences UI" +msgstr "Chỉ số của thư viện tài sản đang được biên soạn trong Cài Đặt Sở Thích Giao Diện Người Dùng" + + +msgid "Active Extension Repository" +msgstr "Kho Lưu Trữ Tiện Ích Mở Rộng Đang Hoạt Động" + + +msgid "Index of the extensions repository being edited in the Preferences UI" +msgstr "Chỉ Số kho lưu trữ cho tiện ích mở rộng đang được chỉnh sửa trong Cấu Hình Giao Diện Người Dùng" msgid "Animation Player" -msgstr "Bộ Hát Hoạt Hình" +msgstr "Máy Chơi Hoạt Họa" msgid "Path to a custom animation/frame sequence player" -msgstr "Đường dẫn đến bộ hát hoạt hình/trình tự" +msgstr "Đường dẫn đến máy chơi hoạt họa/trình tự khung hình tùy chọn" msgid "Animation Player Preset" -msgstr "Đặt Sẵn Bộ Hát Hoạt Hình" +msgstr "Cấu Hình Sắp Đặt Sẵn của Máy Chơi Hoạt Họa" msgid "Preset configs for external animation players" -msgstr "Cấu hình đặt sẵn cho bộ hát hoạt hình ở ngoài" +msgstr "Những cấu hình sắp đặt sẵn cho các máy chơi hoạt họa bên ngoài" msgid "Built-in animation player" -msgstr "Bộ hát hoạt hình nội bộ" +msgstr "Máy chơi hoạt họa gắn sẵn" msgid "DJV" @@ -80607,7 +88296,7 @@ msgstr "DJV" msgid "Open source frame player" -msgstr "Bộ hát bức ảnh mã nguồn mở" +msgstr "Máy chơi khung hình nguồn mở" msgid "FrameCycler" @@ -80615,7 +88304,7 @@ msgstr "FrameCycler" msgid "Frame player from IRIDAS" -msgstr "Bộ hát bức ảnh từ IRIDAS" +msgstr "Máy chơi khung hình từ IRIDAS" msgid "RV" @@ -80623,7 +88312,7 @@ msgstr "RV" msgid "Frame player from Tweak Software" -msgstr "Bộ hát bức ảnh từ Phần Mềm Tweak" +msgstr "Máy chơi khung hình từ Tweak Software" msgid "MPlayer" @@ -80631,11 +88320,11 @@ msgstr "MPlayer" msgid "Media player for video and PNG/JPEG/SGI image sequences" -msgstr "Bộ hát phim cho video và trình tử ảnh PNG/JPEG/SGI" +msgstr "Máy chơi phương tiện truyền thông cho phim video và các trình tự hình ảnh dạng PNG/JPEG/SGI" msgid "Custom animation player executable path" -msgstr "Đường dẫn đến bộ hát hoạt hình tùy chọn" +msgstr "Đường dẫn đến máy chơi hoạt họa tùy chọn" msgid "Auto Save Time" @@ -80643,79 +88332,79 @@ msgstr "Thời Gian Tự Động Lưu" msgid "The time (in minutes) to wait between automatic temporary saves" -msgstr "Thời gian (phút) để chờ giữa lần lưu tự động tập tin tạm thời" +msgstr "Thời gian chờ đợi (trong số phút) giữa các lần tự động lưu những tập tin tạm thời" msgid "File Preview Type" -msgstr "Loại Dự Khán Tập Tin" +msgstr "Kiểu Xem Trước Tập Tin" msgid "What type of blend preview to create" -msgstr "Chế tạo loại dự khán nào cho tập tin blend" +msgstr "Kiểu xem trước blend để kiến tạo" msgid "Do not create blend previews" -msgstr "Không chế tạo dự khán cho tập tin blend" +msgstr "Không kiến tạo các bản xem trước blend" msgid "Automatically select best preview type" -msgstr "Tự động chọn loại dự khán tốt nhất" +msgstr "Tự động chọn kiểu xem trước tốt nhất" msgid "Screenshot" -msgstr "Chụp Màn" +msgstr "Ảnh Chụp Màn Hình" msgid "Capture the entire window" -msgstr "Chụp toàn cửa sổ" +msgstr "Chụp toàn bộ cửa sổ" msgid "Camera View" -msgstr "Màn Máy Quy Phim" +msgstr "Góc Nhìn Máy Quay Phim" msgid "Workbench render of scene" -msgstr "Bàn công trình của cảnh" +msgstr "Kết xuất cảnh theo phong cách của Workbench (Bàn Làm Việc)" msgid "Fonts Directory" -msgstr "Thư Mục Phông" +msgstr "Thư Mục Phông Chữ" msgid "The default directory to search for loading fonts" -msgstr "Thư mục mặc định cho tìm kiếm phông để nhập" +msgstr "Thư mục mặc định tìm kiếm các phông chữ để nạp" msgid "Translation Branches Directory" -msgstr "Thư Mục Nhánh Phiên Dịch" +msgstr "Thư Mục các Phân Nhánh Phiên Dịch" msgid "The path to the '/branches' directory of your local svn-translation copy, to allow translating from the UI" -msgstr "Đường dẫn đến thư mục '/branches' (các nhánh) của svn-translation điạ phương của bạn, để có thể phiên dịch từ giao diện" +msgstr "Đường dẫn đến thư mục '/branches' (các phân nhánh) cho bản sao svn-translation (bản dịch-svn) địa phương của bạn, cho phép phiên dịch từ Giao Diện Người Dùng" msgid "Image Editor" -msgstr "Trình Biên Soạn Ảnh" +msgstr "Trình Biên Soạn Hình Ảnh" msgid "Path to an image editor" -msgstr "Đường dẫn đến một ứng dụng trình biên soạn ảnh" +msgstr "Đường dẫn đến một trình biên soạn hình ảnh" msgid "Recent Files" -msgstr "Tập Tin Gần Đây" +msgstr "Những Tập Tin Gần Đây" msgid "Maximum number of recently opened files to remember" -msgstr "Số lượng tối đa tập tin gần đây để nhớ" +msgstr "Lượng tối đa số tập tin mở gần đây để ghi nhớ" msgid "Render Cache Path" -msgstr "Đường Dẫn Đệm Chứa Kế Xuất" +msgstr "Đường Dẫn của Bộ Đệm Kết Xuất" msgid "Where to cache raw render results" -msgstr "Chỗ cho lưu đệm chứa kết qủa kết xuất nguyên thủy" +msgstr "Nơi lưu kết quả kết xuất nguyên thủy" msgid "Render Output Directory" @@ -80723,43 +88412,43 @@ msgstr "Thư Mục Kết Xuất" msgid "The default directory for rendering output, for new scenes" -msgstr "Thư mục mặc định cho kết xuất ảnh xuất, cho cảnh mới" +msgstr "Thư mục mặc định để kết xuất hình ảnh xuất ngoại, dành cho những cảnh mới" msgid "Save Versions" -msgstr "Phiên Bản Lưu" +msgstr "Số Phiên Bản của Blender Lưu" msgid "The number of old versions to maintain in the current directory, when manually saving" -msgstr "Giữ số lượng phiên bản cũ trong thư mục hiện tại, khi người dùng tự lưu" +msgstr "Số lượng phiên bản cũ cần duy trì trong thư mục hiện tại, khi người dùng tự lưu" msgid "Python Scripts Directory" -msgstr "Thư Mục Văn Thảo Python" +msgstr "Thư Mục Tập Lệnh Python" msgid "Show Hidden Files/Data-Blocks" -msgstr "Hiện Tập Tin/Cục Dữ Liệu Được Ẩn" +msgstr "Hiển Thị Tập Tin/Khối Dữ Liệu Ẩn" msgid "Show files and data-blocks that are normally hidden" -msgstr "Chỉ những tập tin và cục dữ liệu thường xuyên được ẩn" +msgstr "Hiện các tập tin và khối dữ liệu, mà khi thông thường, chúng bị ẩn giấu đi" msgid "Show Recent Locations" -msgstr "Hiện Các Vị Trí Gần Đây" +msgstr "Hiển Thị các Vị Trí Gần Đây" msgid "Show Recent locations list in the File Browser" -msgstr "Hiện danh sách vị trí Gần Đây trong Trình Duyệt Tập Tin" +msgstr "Hiển thị danh sách các vị trí gần đây trong Trình Duyệt Tập Tin" msgid "Show System Locations" -msgstr "Hiện Vị Trí Hệ Thống" +msgstr "Hiển Thị các Vị Trí Hệ thống" msgid "Show System locations list in the File Browser" -msgstr "Hiện danh sách vị trí Hệ Thống trong Trình Duyệt Tập Tin" +msgstr "Hiển thị danh sách các vị trí của hệ thống trong Trình Duyệt Tập Tin" msgid "Sounds Directory" @@ -80767,7 +88456,7 @@ msgstr "Thư Mục Âm Thanh" msgid "The default directory to search for sounds" -msgstr "Thư mục mặc định cho tìm kiếm âm thanh" +msgstr "Thư mục mặc định để tìm kiếm âm thanh" msgid "Temporary Directory" @@ -80775,23 +88464,53 @@ msgstr "Thư Mục Tạm Thời" msgid "The directory for storing temporary save files" -msgstr "Thư mục mặc định cho lưu chứa tập tin tạm thời" +msgstr "Thư mục mặc định để lưu trữ các tập tin tạm thời" + + +msgid "" +"Command to launch the text editor, either a full path or a command in $PATH.\n" +"Use the internal editor when left blank" +msgstr "" +"Lệnh khởi chạy trình soạn thảo văn bản, một đường dẫn đầy đủ hoặc một lệnh trong biến môi trường $PATH.\n" +"Sử dụng trình chỉnh sửa nội bộ khi để trống" + + +msgid "Text Editor Args" +msgstr "Các Đối Số của Trình Biên Soạn Văn Bản" + + +msgid "" +"Defines the specific format of the arguments with which the text editor opens files. The supported expansions are as follows:\n" +"\n" +"$filepath The absolute path of the file.\n" +"$line The line to open at (Optional).\n" +"$column The column to open from the beginning of the line (Optional).\n" +"$line0 & column0 start at zero.\n" +"Example: -f $filepath -l $line -c $column" +msgstr "" +"Xác định định dạng cụ thể của các đối số mà trình soạn thảo văn bản dùng để mở các tập tin. Các đối số mở rộng hiện được hỗ trợ như sau:\n" +"\n" +"$filepath Đường dẫn tuyệt đối của tập tin.\n" +"$line Dòng để mở tại đó (không bắt buộc).\n" +"$column Cột để mở tại đó, tính từ đầu dòng (không bắt buộc).\n" +"$line0 & column0 bắt đầu từ số 0 nhé.\n" +"Ví dụ: -f $filepath -l $line -c $column" msgid "The default directory to search for textures" -msgstr "Thư mục mặc định cho tìm kiếm chất liệu" +msgstr "Thư mục mặc định để lùng tìm chất liệu" msgid "Auto Save Temporary Files" -msgstr "Tự Động Lưu Tập Tin Tạm Thời" +msgstr "Tự Động Lưu các Tập Tin Tạm Thời" msgid "" "Automatic saving of temporary files in temp directory, uses process ID.\n" "Warning: Sculpt and edit mode data won't be saved" msgstr "" -"Tự động lưu tập tin tạm thời vào thư mục tạm thời, nó dùng ID quá trình.\n" -"Cảnh Báo: Sẽ không lưu dữ liệu của chế độ khắc hay biên tập)" +"Tự động lưu các tập tin tạm thời trong thư mục tạm thời (temp), sử dụng nhận dạng ID của quy trình (process ID).\n" +"Cảnh báo: Dữ liệu của chế độ điêu khắc và chế độ biên soạn sẽ không được lưu đâu nhé" msgid "Compress File" @@ -80799,91 +88518,91 @@ msgstr "Nén Tập Tin" msgid "Enable file compression when saving .blend files" -msgstr "Bật nén tập tin khi lưu tập tin .blend" +msgstr "Cho phép nén khi lưu các tập tin .blend" msgid "Enable filtering of files in the File Browser" -msgstr "Bật bộ lọc tập tin trong Trình Duyệt Tập Tin" +msgstr "Cho phép thanh lọc các tập tin trong Trình Duyệt Tập Tin" msgid "Load user interface setup when loading .blend files" -msgstr "Nhập cài đặt giao diện người dùng khi nhập tập tin .blend" +msgstr "Nạp sắp đặt về giao diện người dùng khi đọc các tập tin .blend" msgid "Default relative path option for the file selector, when no path is defined yet" -msgstr "Đường dẫn tương đối mặc định cho bộ lựa chọn tập tin, khi đường dẫn chưa được chỉ định" +msgstr "Tùy chọn đường dẫn tương đối mặc định cho công cụ lựa chọn tập tin, khi chưa có đường dẫn nào được định nghĩa trước cả" msgid "Allow any .blend file to run scripts automatically (unsafe with blend files from an untrusted source)" -msgstr "Cho bắt cư tập tin .blend phép chạy văn thảo tự động (khôn an toàn với tập tin .blend từ nguồn gốc không tin tưởng)" +msgstr "Cho phép toàn bộ các tập tin .blend thi hành tập lệnh tự động (không an toàn nếu tập tin blend là bản từ nguồn không đáng tin cậy)" msgid "Tabs as Spaces" -msgstr "Tab Thành Dấu Cách" +msgstr "Tab thành Dấu Cách Trống" msgid "Automatically convert all new tabs into spaces for new and loaded text files" -msgstr "Tự động đổi hết nhãn mới thành dấu cách cho tập tin văn bản mới và nhập" +msgstr "Đối với các tập tin văn bản mới và đã được nạp, tự động chuyển đổi toàn bộ các ký tự tab thành dấu cách trống" msgid "Drag Threshold" -msgstr "Ngưỡng Kéo" +msgstr "Ngưỡng Kéo Rê" msgid "Number of pixels to drag before a drag event is triggered for keyboard and other non mouse/tablet input (otherwise click events are detected)" -msgstr "Số lượng điểm ảnh cần kéo trước một sự kiện chỉnh sửa/kéo được khởi động cho bàn phím hay ngõ vào không sử dụng chuột (nếu không, được phát hiện sự kiện bấm)" +msgstr "Số điểm ảnh phải kéo rê trước khi sự kiện kéo rê (drag event) do đầu vào của bàn phím và chuột/bảng điện khác được kích hoạt (nếu không thì sẽ được phát hiện là sự kiện bấm (click events))" msgid "Mouse Drag Threshold" -msgstr "Ngưỡng Kéo Chuột" +msgstr "Ngưỡng Kéo Rê Chuột" msgid "Number of pixels to drag before a drag event is triggered for mouse/track-pad input (otherwise click events are detected)" -msgstr "Số lượng điểm ảnh cần kéo trước một sự kiện chỉnh kéo được khởi động cho ngõ vào chuột/bảng vẽ (nếu không, được phát hiện sự kiện bấm)" +msgstr "Số điểm ảnh phải kéo rê trước khi sự kiện kéo rê, do chuột/track-pad cung cấp cho, được kích hoạt (nếu không thì sẽ được phát hiện là sự kiện nút bấm)" msgid "Tablet Drag Threshold" -msgstr "Ngưỡng Kéo Bảng Vẽ" +msgstr "Ngưỡng Kéo Rê của Bảng Điện" msgid "Number of pixels to drag before a drag event is triggered for tablet input (otherwise click events are detected)" -msgstr "Số lượng điểm ảnh cần kéo trước một sự kiện kéo được khởi động cho ngõ vào bảng vẽ (nếu không, được phát hiện sự kiện bấm)" +msgstr "Số điểm ảnh cần phải kéo rê trước khi sự kiện kéo rê được kích hoạt, đối với đầu vào của bảng điện (nếu không thì sẽ được phát hiện là sự kiện bấm (click events))" msgid "Invert Zoom Direction" -msgstr "Đẳo Nghịch Hương Phóng Vào" +msgstr "Đảo Nghịch Hướng Thu-Phóng" msgid "Invert the axis of mouse movement for zooming" -msgstr "Đảo nghịch trục chuyển động chuột cho phóng vào" +msgstr "Đảo nghịch trục chuyển động của chuột trong thu-phóng" msgid "Wheel Invert Zoom" -msgstr "Đảo Nghịch Phóng To Nút Cuộn" +msgstr "Bánh Xe Đảo Hướng Thu-Phóng" msgid "Swap the Mouse Wheel zoom direction" -msgstr "Trao đổi hướng phóng của Nút Cuộn" +msgstr "Đổi hướng thu-phóng của Bánh Xe Chuột" msgid "Double Click Timeout" -msgstr "Thời Hạn Nhận Bấm 2 Lần" +msgstr "Thời Hạn của Nháy Đúp" msgid "Time/delay (in ms) for a double click" -msgstr "Thời gian/chậm lại (ms) cho sự kiện bấm hai lần" +msgstr "Thời gian/sự trì hoãn (trong mili-giây) của nháy đúp" msgid "Emulate 3 Button Modifier" -msgstr "Bộ Điều Chỉnh Giả Bộ Chuột 3 Nút" +msgstr "Phím Bổ Trợ Mô Phỏng Nút Chuột thứ 3" msgid "Hold this modifier to emulate the middle mouse button" -msgstr "Giữ bộ điều chỉnh này để giả bộ nút chuột giữa" +msgstr "Giữ phím bổ trợ này xuống để mô phỏng nút chuột giữa" msgid "OS-Key" -msgstr "Phím Hệ Điều Hành" +msgstr "Khóa Hệ Điều Hành" msgid "Motion Threshold" @@ -80891,75 +88610,75 @@ msgstr "Ngưỡng Chuyển Động" msgid "Number of pixels to before the cursor is considered to have moved (used for cycling selected items on successive clicks)" -msgstr "Số lượng điểm ảnh cần đi trước được xác nhận con trỏ đã chuyển động (dùng cho chu trình qua mặt hàng được chọn khi bấm nhiều lần liên tiếp)" +msgstr "Số điểm ảnh phải di chuyển trước khi con trỏ được coi là đã di chuyển (sử dụng để luân chuyển những cái được chọn trong những lần bấm tiếp theo)" msgid "View Navigation" -msgstr "Chuyển Hướng Màn" +msgstr "Điều Hướng Góc Nhìn" msgid "Which method to use for viewport navigation" -msgstr "Dùng phương pháp nào cho chuyển hướng màn chiếu" +msgstr "Dùng phương pháp nào để điều hướng cổng nhìn" msgid "Interactively walk or free navigate around the scene" -msgstr "Tương tác đi bộ hay chuyển hướng tự do quanh cảnh" +msgstr "Đi bộ hoặc điều hướng tự do chung quanh cảnh một cách tương tác" msgid "Fly" -msgstr "Bay" +msgstr "Bay Lượn" msgid "Use fly dynamics to navigate the scene" -msgstr "Dùng động lý bay để chuyển hướng trong cảnh" +msgstr "Dùng động năng bay lượn để điều hướng cảnh" msgid "Deadzone" -msgstr "Vùng Nghỉ" +msgstr "Vùng Chết" msgid "Threshold of initial movement needed from the device's rest position" -msgstr "Ngưỡng khởi động chuyển động từ vị trí nghỉ của thiết bị" +msgstr "Giới hạn chuyển động khởi đầu cần có, từ tư thế nghỉ, của thiết bị" msgid "Helicopter Mode" -msgstr "Chế Độ Trựt Thăng" +msgstr "Chế Độ Trực Thăng" msgid "Device up/down directly controls the Z position of the 3D viewport" -msgstr "Lên/xuống của thiết bị được trực tiếp điều khiển vị trí Z của màn chiếu 3D" +msgstr "Chuyển động lên/xuống của thiết bị trực tiếp điều khiển vị trí Z của cổng nhìn 3D" msgid "Lock Camera Pan/Zoom" -msgstr "Khóa Dời/Phóng To Máy Quay Phim" +msgstr "Khóa Lia/Thu-Phóng của Máy Quay Phim" msgid "Pan/zoom the camera view instead of leaving the camera view when orbiting" -msgstr "Dời/phóng to màn máy quay phim hay thế ra ngoài màn máy quay phim khi quay" +msgstr "Lia/thu phóng góc nhìn máy quay phim thay vì rời khỏi chế độ quan sát qua máy phim khi quỹ đạo" msgid "Lock Horizon" -msgstr "Khóa Chân Trời" +msgstr "Khóa Đường Chân Trời" msgid "Keep horizon level while flying with 3D Mouse" -msgstr "Giử chân trời ngang khi bay với chuột 3D" +msgstr "Giữ đường chân trời cân bằng trong khi bay lượn với Chuột 3D" msgid "Orbit Sensitivity" -msgstr "Cảm Biến Qũy Đạo" +msgstr "Độ Mẫn Cảm khi Quỹ Đạo" msgid "Overall sensitivity of the 3D Mouse for orbiting" -msgstr "Cảm biến tổng quát của chuột khi qũy đạo" +msgstr "Độ mẫn cảm nói chung của Chuột 3D khi quỹ đạo" msgid "Y/Z Swap Axis" -msgstr "Trao Đổi Trục Y/Z" +msgstr "Tráo Đổi Trục Y/Z" msgid "Pan using up/down on the device (otherwise forward/backward)" -msgstr "Đời bằng lên/xuống của tiết bị (nếu không dời trái/phải)" +msgstr "Lia dùng điều khiển lên/xuống của thiết bị (nếu không thì tiến/lùi)" msgid "Invert X Axis" @@ -80975,11 +88694,11 @@ msgstr "Đảo Nghịch Trục Z" msgid "Invert Pitch (X) Axis" -msgstr "Đảo Nghịch Trục Nghiêng (X)" +msgstr "Đảo Nghịch Trục Lao Lên Xuống (X)" msgid "Invert Yaw (Y) Axis" -msgstr "Đảo Nghịch Trục Xoay (Y)" +msgstr "Đảo Nghịch Trục Lúc Lắc (Y)" msgid "Invert Roll (Z) Axis" @@ -80987,39 +88706,39 @@ msgstr "Đảo Nghịch Trục Lăn (Z)" msgid "Overall sensitivity of the 3D Mouse for panning" -msgstr "Cảm biến thổng quát của chuột 3D khi dởi" +msgstr "Độ mẫn cảm nói chung của Chuột 3D khi lia" msgid "Show Navigation Guide" -msgstr "Hiện Dấu hướng Dẫn Chuyển Hướng" +msgstr "Hiển Thị Hướng Dẫn về Điều Hướng" msgid "Display the center and axis during rotation" -msgstr "Hiển thị trung tâm và trục khi xoay" +msgstr "Hiển thị tâm và trục trong khi xoay" msgid "NDOF View Navigate" -msgstr "Chuyển Hướng Màn NDOF" +msgstr "Điều Hành Góc Nhìn trong NDOF" msgid "Navigation style in the viewport" -msgstr "Phong cách chuyển hướng của màn chiếu" +msgstr "Phong cách điều hướng trong cổng nhìn" msgid "Use full 6 degrees of freedom by default" -msgstr "Mặc định dùng hết 6 hướng di chuyển tự do " +msgstr "Dùng toàn bộ 6 độ điều hành tự do như mặc định" msgid "Orbit about the view center by default" -msgstr "Mặc định qũy đạo quanh trung tâm màn" +msgstr "Quỹ đạo quanh tâm của khung nhìn như mặc định" msgid "NDOF View Rotation" -msgstr "Xoay Màn NDOF" +msgstr "Xoay Góc Nhìn trong NDOF" msgid "Rotation style in the viewport" -msgstr "Kiểu xoay màn chiếu" +msgstr "Phong cách xoay chiều trong cổng nhìn" msgid "Turntable" @@ -81027,47 +88746,47 @@ msgstr "Bàn Xoay" msgid "Use turntable style rotation in the viewport" -msgstr "Dùng kiểu bàn xoay khi xoay trong màn chiếu" +msgstr "Dùng phong cách bàn xoay (turntable) khi xoay chiều trong cổng nhìn" msgid "Use trackball style rotation in the viewport" -msgstr "Dùng xoay kiểu trái banh điều khiển trong màn chiếu" +msgstr "Sử dụng phong cách xoay chiều của chuột có bi lăn (trackball) trong cổng nhìn" msgid "Invert Zoom" -msgstr "Đảo Nghịch Phóng Vào" +msgstr "Đảo Nghịch Thu-Phóng" msgid "Zoom using opposite direction" -msgstr "Phóng vào dùng hướng nghịch chiều" +msgstr "Thu-phóng dùng hướng nghịch chiều" msgid "Softness" -msgstr "Độ Mềm" +msgstr "Độ Mềm Mại" msgid "Adjusts softness of the low pressure response onset using a gamma curve" -msgstr "Được chỉnh độ mềm của phản ứng áp suất thấp bằng một cong gama" +msgstr "Dùng đường cong gamma điều chỉnh độ nhẹ nhàng/mềm mại của phản ứng đối với áp lực thấp" msgid "Max Threshold" -msgstr "Ngưỡng Cực Đại" +msgstr "Ngưỡng Tối Đa" msgid "Raw input pressure value that is interpreted as 100% by Blender" -msgstr "Áp suất ngõ vào trực tiếp được xác định là 100% bằng Blender" +msgstr "Giá trị áp lực thực cung cấp được Blender phiên dịch là 100%" msgid "Tablet API" -msgstr "API Bảng Vẽ" +msgstr "API cho Bảng Điện" msgid "Select the tablet API to use for pressure sensitivity (may require restarting Blender for changes to take effect)" -msgstr "Chọn API bảng vẽ cho sự nhạy cảm áp suất (có lẽ cần khởi động Blender lại cho áp dụng sự thay đổi)" +msgstr "Chọn API cho máy tính bảng, để sử dụng cho độ nhạy về áp lực (có thể đòi hỏi phải khởi động lại Blender để thay đổi có hiệu lực)" msgid "Automatically choose Wintab or Windows Ink depending on the device" -msgstr "Tự động chọn Bàn Cửa Sổ hay Mực Cửa Sổ tùy thiết bị" +msgstr "Tự động chọn Wintab hoặc Windows Ink tùy theo thiết bị" msgid "Windows Ink" @@ -81075,7 +88794,7 @@ msgstr "Mực Cửa Sổ" msgid "Use native Windows Ink API, for modern tablet and pen devices. Requires Windows 8 or newer" -msgstr "Dùng API (giao diện ứng dụng) Mực Cửa Sổ, cho bảng vẽ và thiết bị bút hiện đại. Yêu cầu Window 8 trở lên" +msgstr "Sử dụng API (giao diện lập trình ứng dụng) Windows Ink, dành cho các bảng điện tân tiến có bút điện. Đòi hỏi Windows 8 hoặc mới hơn" msgid "Wintab" @@ -81083,39 +88802,39 @@ msgstr "Bảng Vẽ Cửa Sổ" msgid "Use Wintab driver for older tablets and Windows versions" -msgstr "Dùng trình điều khiển Bảng Vẽ Cửa Sổ cho bảng vẽ cũ và phiên bản Window cũ" +msgstr "Dùng điều vận Wintab cho các bảng điện và phiên bản Windows cũ hơn" msgid "Auto Perspective" -msgstr "Phép Chiếu Tự Động" +msgstr "Tự Động Phối Cảnh" msgid "Automatically switch between orthographic and perspective when changing from top/front/side views" -msgstr "Tự động trao đổi từ phép chiếu trực giao và chiếu phối cảnh khi đổi từ xem phía trên/trước/trái/phải " +msgstr "Tự động chuyển đổi giữa hai chế độ hiển thị, trực giao và phối cảnh (luật xa gần), khi thay đổi từ một góc nhìn sang góc trên/trước/trái/phải" msgid "Release Confirms" -msgstr "Xác Nhận Khi Thả" +msgstr "Xác Nhận khi Thả" msgid "Moving things with a mouse drag confirms when releasing the button" -msgstr "Di chuyển đồ bằng kéo chuột được xác nhận khi thả nút chuột" +msgstr "Di chuyển các đối tượng bằng việc kéo rê chuột, xác nhận khi thả nút" msgid "Emulate Numpad" -msgstr "Giả Bộ Bàn Phím Số" +msgstr "Mô Phỏng Bàn Phím Số" msgid "Main 1 to 0 keys act as the numpad ones (useful for laptops)" -msgstr "Phím 1 đến 0 trong bàn phím chánh được làm tương tự bàn phím số (tiện cho máy sắt tay)" +msgstr "Phím 1 đến 0 trên bàn phím chính cư xử giống như bàn phím số (tiện lợi cho các máy tính laptop)" msgid "Continuous Grab" -msgstr "Cầm Liên Tiếp" +msgstr "Nắm Giữ Liên Tục" msgid "Let the mouse wrap around the view boundaries so mouse movements are not limited by the screen size (used by transform, dragging of UI controls, etc.)" -msgstr "Cho chuột lặp lại quanh màn chiếu cho chuyển động chuột không bị hạn chế bởi cỡ thước của màn hình (biến hóa, kéo đổ điều khiển của giao diện, v.v. được sử dụng)" +msgstr "Cho phép chuột đảo (chuyển tiếp) quanh ranh giới góc nhìn, để chuyển động của chuột không bị giới hạn bởi kích thước của màn hình (được sử dụng trong biến hóa, kéo rê các điều khiển giao diện người dùng, v.v.)" msgid "Auto Depth" @@ -81123,115 +88842,123 @@ msgstr "Độ Sâu Tự Động" msgid "Use the depth under the mouse to improve view pan/rotate/zoom functionality" -msgstr "Dùng độ sâu dưới chuột cho giúp hoạt động đời/xoay/phỏng vào" +msgstr "Dùng độ sâu ở dưới chuột để gia tăng tầm nhìn đối với chức năng quét/xoay/thu-phóng" msgid "Emulate 3 Button Mouse" -msgstr "Giả Bộ Chuột 3 Nút" +msgstr "Mô Phỏng Chuột 3 Nút" msgid "Emulate Middle Mouse with Alt+Left Mouse" -msgstr "Giả Bộ Nút Chuột Giữa bằng Alt+Left Chuột" +msgstr "Mô Phỏng Nút Chuột Giữa bằng tập hợp Alt+Nút Chuột Trái" + + +msgid "Multi-touch Gestures" +msgstr "Cử Chỉ Đa Chạm (Multi-touch Gestures)" + + +msgid "Use multi-touch gestures for navigation with touchpad, instead of scroll wheel emulation" +msgstr "Sử dụng cử chỉ đa chạm (multi-touch gestures) để điều hướng bằng bàn di chuột, thay vì mô phỏng bánh xe cuộn" msgid "Default to Advanced Numeric Input" -msgstr "Mặc Định đến Ngõ Vào Số Nâng Cao" +msgstr "Đặt Chế Độ Nhập Số Cấp Tiến là Mặc Định" msgid "When entering numbers while transforming, default to advanced mode for full math expression evaluation" -msgstr "Khi gõ số vào trong khi đang biến hóa, đặt mặc định là chế độ nâng cao cho có thể tính toán toàn bộ biểu thước" +msgstr "Khi nhập các con số trong khi biến hóa, đặt chế độ mặc định là chế độ cấp tiến để có thể tính toán các biểu thức toán học toàn phần" msgid "Orbit Around Selection" -msgstr "Quay Quanh Sự Lựa Chọn" +msgstr "Quỹ Đạo Quanh Lựa Chọn" msgid "Use selection as the pivot point" -msgstr "Dùng sự lựa chọn làm điểm tựa" +msgstr "Dùng cái lựa chọn làm điểm tựa" msgid "Zoom to Mouse Position" -msgstr "Phóng Vào đến Vị Trí Chuột" +msgstr "Thu-Phóng vào Vị Trí của Chuột" msgid "Zoom in towards the mouse pointer's position in the 3D view, rather than the 2D window center" -msgstr "Phóng vào đến vị trí của con trỏ chuột trong màn 3D thay thế trung tâm cửa sổ 2D" +msgstr "Thu-phóng vào vị trí của con trỏ chuột trong góc nhìn 3D, thay vì vào trung tâm cửa sổ 2D" msgid "Orbit Method" -msgstr "Phương Pháp Quay" +msgstr "Phương Pháp Quỹ Đạo Xoay Quanh" msgid "Orbit method in the viewport" -msgstr "Phương pháp quay trong màn chiếu" +msgstr "Phương pháp quỹ đạo xoay quanh trong cổng nhìn" msgid "Turntable keeps the Z-axis upright while orbiting" -msgstr "Bàn quay được giữ trục Z hướng trên khi đang quay" +msgstr "Bàn xoay giữ cho trục Z thẳng đứng trong khi đang quỹ đạo" msgid "Trackball allows you to tumble your view at any angle" -msgstr "Bóng xoay cho bạn được xoay màn đến bất cứ góc" +msgstr "Hình cầu điều khiển cho phép bạn đảo góc nhìn của mình ở bất cứ góc độ nào" msgid "Scale trackball orbit sensitivity" -msgstr "Chỉnh độ nhạy cảm xoay bóng xoay" +msgstr "Tỷ lệ hóa độ nhạy trong khi quỹ đạo dùng hình cầu điều khiển" msgid "Rotation amount per pixel to control how fast the viewport orbits" -msgstr "Mức xoay từng điểm ảnh cho điền khiển tốc độ xoay của qũy đạo màn chiếu" +msgstr "Độ xoay cho mỗi điểm ảnh để điều khiển tốc độ quỹ đạo của cổng nhìn" msgid "Zoom Axis" -msgstr "Trục Phóng Vào" +msgstr "Trục Thu-Phóng" msgid "Axis of mouse movement to zoom in or out on" -msgstr "Trục chuyển động của chuột để phóng vào và ra" +msgstr "Trục dùng cho chuyển động của chuột để thu-phóng" msgid "Zoom in and out based on vertical mouse movement" -msgstr "Phóng vào và ra tùy chuyển động dọc của chuột" +msgstr "Thu-phóng dựa trên chuyển động dọc của chuột" msgid "Zoom in and out based on horizontal mouse movement" -msgstr "Phóng vào hay ra tùy chuyển động ngang của chuột" +msgstr "Thu-phóng dựa trên chuyển động ngang của chuột" msgid "Zoom Style" -msgstr "Kiểu Phóng" +msgstr "Mốt Thu-Phóng" msgid "Which style to use for viewport scaling" -msgstr "Dùng kiểu nào cho phóng to màn chiếu" +msgstr "Mốt sử dụng để thay đổi tỷ lệ cổng nhìn" msgid "Continue" -msgstr "Tiếp Tục" +msgstr "Tiếp/Liên Tục" msgid "Continuous zooming. The zoom direction and speed depends on how far along the set Zoom Axis the mouse has moved" -msgstr "Phóng to liên tục. Hướng và tốc độ phóng to tùy quãng xa của chuột trên Trục Phóng To đã đặt" +msgstr "Thu-phóng liên tục. Chiều hướng và tốc độ còn tùy thuộc vào khoảng cách chuột di chuyển dọc theo Trục Thu-Phóng (Zoom Axis)" msgid "Dolly" -msgstr "Dời" +msgstr "Lướt" msgid "Zoom in and out based on mouse movement along the set Zoom Axis" -msgstr "Phóng và và ra tùy sự di chuyển trên Trục Phóng To đã đặt" +msgstr "Phóng to (xem gần vào) và thu nhỏ (lùi xa ra) tùy theo chuyển động của chuột dọc theo Trục Thu-Phóng (Zoom Axis)" msgid "Zoom in and out as if you are scaling the view, mouse movements relative to center" -msgstr "Phóng vào và ra như đang phóng to màn, sự di chuyển chuột tương đối với trung tâm" +msgstr "Phóng to (xem gần vào) và thu nhỏ (lùi xa ra) ví như khi mình đổi tỷ lệ của góc nhìn. Chuyển động của chuột tương đối với điểm tâm" msgid "Walk Navigation" -msgstr "Chuyển Hướng Đi Bộ" +msgstr "Điều Hướng Đi Bộ" msgid "Settings for walk navigation mode" -msgstr "Cài đặt cho chế độ chuyển hướng đi bộ" +msgstr "Sắp đặt cho chế độ điều hướng đi bộ" msgid "Key Config" @@ -81239,23 +88966,23 @@ msgstr "Cấu Hình Phím" msgid "The name of the active key configuration" -msgstr "Tên của cấu hình phím hoạt đang động" +msgstr "Tên của cấu hình phím đang hoạt động" msgid "Show UI Key-Config" -msgstr "Hiện Cấu Hình Phím Giao Diện" +msgstr "Hiển Thị Cấu Hình Phím trong UI" msgid "Anisotropic Filtering" -msgstr "Bộ Lọc Dị Hướng" +msgstr "Thanh Lọc Dị Hướng" msgid "Quality of anisotropic filtering" -msgstr "Chất lượng của bộ lọc dị hướng" +msgstr "Chất lượng của thanh lọc dị hướng" msgid "Audio Device" -msgstr "Thiết Bị Âm Thanh" +msgstr "Thiết bị Âm Thanh" msgid "Audio output device" @@ -81263,87 +88990,87 @@ msgstr "Thiết bị phát âm thanh" msgid "No device - there will be no audio output" -msgstr "Không có thiết bị - sẽ không có ngõ ra âm thanh" +msgstr "Không có thiết bị - sẽ không có âm thanh chơi/cung cấp ở đầu ra" msgid "Audio Mixing Buffer" -msgstr "Đệm Pha Trộn Âm Thanh" +msgstr "Bộ Đệm Pha Trộn Âm Thanh" msgid "Number of samples used by the audio mixing buffer" -msgstr "Số lượng mẫu để dùng cho đệm pha trộn âm thanh" +msgstr "Dùng số lượng mẫu vật sử dụng bởi bộ đệm pha trộn âm thanh" msgid "256 Samples" -msgstr "256 Mẫu" +msgstr "256 Mẫu Vật" msgid "Set audio mixing buffer size to 256 samples" -msgstr "Đặt kích thước đệm pha trộn âm thanh bằng 256 mẫu" +msgstr "Đặt cỡ bộ đệm pha trộn âm thanh bằng 256 mẫu vật" msgid "512 Samples" -msgstr "512 Mẫu" +msgstr "512 Mẫu Vật" msgid "Set audio mixing buffer size to 512 samples" -msgstr "Đặt kích thước đệm pha trộn âm thanh bằng 512 mẫu" +msgstr "Đặt cỡ bộ đệm pha trộn âm thanh bằng 512 mẫu vật" msgid "1024 Samples" -msgstr "1024 Mẫu" +msgstr "1024 Mẫu Vật" msgid "Set audio mixing buffer size to 1024 samples" -msgstr "Đặt kích thước đệm pha trộn âm thanh bằng 1024 mẫu" +msgstr "Đặt cỡ bộ đệm pha trộn âm thanh bằng 1024 mẫu vật" msgid "2048 Samples" -msgstr "2048 Mẫu" +msgstr "2048 Mẫu Vật" msgid "Set audio mixing buffer size to 2048 samples" -msgstr "Đặt kích thước đệm pha trộn âm thanh bằng 2048 mẫu" +msgstr "Đặt cỡ bộ đệm pha trộn âm thanh bằng 2048 mẫu vật" msgid "4096 Samples" -msgstr "4096 Mẫu" +msgstr "4096 Mẫu Vật" msgid "Set audio mixing buffer size to 4096 samples" -msgstr "Đặt kích thước đệm pha trộn âm thanh bằng 4096 mẫu" +msgstr "Đặt cỡ bộ đệm pha trộn âm thanh bằng 4096 mẫu vật" msgid "8192 Samples" -msgstr "8192 Mẫu" +msgstr "8192 Mẫu Vật" msgid "Set audio mixing buffer size to 8192 samples" -msgstr "Đặt kích cỡ đệm pha trộn âm thanh bằng 8192 mẫu" +msgstr "Đặt cỡ bộ đệm pha trộn âm thanh bằng 8192 mẫu vật" msgid "16384 Samples" -msgstr "16384 Mẫu" +msgstr "16384 Mẫu Vật" msgid "Set audio mixing buffer size to 16384 samples" -msgstr "Đặt kích thước đệm pha trộn âm thanh bằng 16384 mẫu" +msgstr "Đặt cỡ bộ đệm pha trộn âm thanh bằng 16384 mẫu vật" msgid "32768 Samples" -msgstr "32768 Mẫu" +msgstr "32768 Mẫu Vật" msgid "Set audio mixing buffer size to 32768 samples" -msgstr "Đặt kích thước đệm pha trộn âm thanh bằng 32768 mẫu" +msgstr "Đặt cỡ bộ đệm pha trộn âm thanh bằng 32768 mẫu vật" msgid "Audio Sample Format" -msgstr "Định Dạng Mẫu Vật Âm Thanh" +msgstr "Định Dạng Mẫu Âm Thanh" msgid "Audio sample format" -msgstr "Định dạng mẫu vật âm thanh" +msgstr "Định dạng lấy mẫu vật cho âm thanh" msgid "8-bit Unsigned" @@ -81351,7 +89078,7 @@ msgstr "8-Bit Không Dấu" msgid "Set audio sample format to 8-bit unsigned integer" -msgstr "Đặt định dạng mẫu vật bằng số nguyên 8 bit không dấu" +msgstr "Đặt định dạng mẫu vật âm thanh là số nguyên 8 bit không dấu" msgid "16-bit Signed" @@ -81359,7 +89086,7 @@ msgstr "16-Bit Có Dấu" msgid "Set audio sample format to 16-bit signed integer" -msgstr "Đặt định dạng mẫu vật bằng số nguyên 16 bit có dấu" +msgstr "Đặt định dạng mẫu vật âm thanh là số nguyên 16 bit có dấu (âm/dương)" msgid "24-bit Signed" @@ -81367,7 +89094,7 @@ msgstr "24-Bit Có Dấu" msgid "Set audio sample format to 24-bit signed integer" -msgstr "Đặt định dạng mẫu vật bằng số nguyên 24 bit có dấu" +msgstr "Đặt định dạng mẫu vật âm thanh là số nguyên 24 bit có dấu (âm/dương)" msgid "32-bit Signed" @@ -81375,27 +89102,27 @@ msgstr "32 Bit Có Dấu" msgid "Set audio sample format to 32-bit signed integer" -msgstr "Đặt định dạng mẫu vật bằng số nguyên 32 bit có dấu" +msgstr "Đặt định dạng mẫu vật âm thanh là số nguyên 32 bit có dấu (âm/dương)" msgid "Set audio sample format to 32-bit float" -msgstr "Đặt định dạng mẫu vật bằng số thật 32 bit" +msgstr "Đặt định dạng mẫu vật âm thanh là số thực 32 bit" msgid "64-bit Float" -msgstr "64-̆it Số Thật" +msgstr "64-bit Số Thực" msgid "Set audio sample format to 64-bit float" -msgstr "Đặt định dạng mẫu vật bằng số thật 64 bit" +msgstr "Đặt định dạng mẫu vật âm thanh là số thực 64 bit" msgid "Audio Sample Rate" -msgstr "Tốc Độ Mẫu Vật Âm Thanh" +msgstr "Tần Số Lấy Mẫu Âm Thanh" msgid "Audio sample rate" -msgstr "Tốc độ mẫu vật âm thanh" +msgstr "Tần số lấy mẫu vật của âm thanh" msgid "44.1 kHz" @@ -81403,7 +89130,7 @@ msgstr "44.1 kHz" msgid "Set audio sampling rate to 44100 samples per second" -msgstr "Đặt tốc độ mẫu vật âm thanh bằng 44100 mẫu vật/giây" +msgstr "Đặt tần số lấy mẫu vật âm thanh bằng 44100 mẫu mỗi giây" msgid "48 kHz" @@ -81411,7 +89138,7 @@ msgstr "48 kHz" msgid "Set audio sampling rate to 48000 samples per second" -msgstr "Đặt tốc độ mẫu vật âm thanh bằng 48000 mẫu vật/giây" +msgstr "Đặt tần số lấy mẫu vật âm thanh bằng 48000 mẫu mỗi giây" msgid "96 kHz" @@ -81419,7 +89146,7 @@ msgstr "96 kHz" msgid "Set audio sampling rate to 96000 samples per second" -msgstr "Đặt tốc độ mẫu vật âm thanh bằng 96000 mẫu vật/giây" +msgstr "Đặt tần số lấy mẫu vật âm thanh bằng 96000 mẫu mỗi giây" msgid "192 kHz" @@ -81427,39 +89154,59 @@ msgstr "192 kHz" msgid "Set audio sampling rate to 192000 samples per second" -msgstr "Đặt tốc độ mẫu vật âm thanh bằng 192000 mẫu vật/giây" +msgstr "Đặt tần số lấy mẫu vật âm thanh bằng 192000 mẫu mỗi giây" msgid "Clip Alpha" -msgstr "Độ Đuc Cắt" +msgstr "Cắt Xén Alpha" msgid "Clip alpha below this threshold in the 3D textured view" -msgstr "Cắt độ đục dưới ngưỡng này trong màn chất liệu 3D" +msgstr "Cắt xén alpha dưới giới hạn này trong chế độ xem chất liệu 3D" msgid "GL Texture Limit" -msgstr "Giới Hạn Chất Liệu GL" +msgstr "Giới Hạn Chất Liệu Gl" msgid "Limit the texture size to save graphics memory" -msgstr "Hạn chế kích cỡ chất liệu cho tiết kiệm bộ nhớ" +msgstr "Hạn chế kích thước của chất liệu để tiết kiệm bộ nhớ đồ họa" + + +msgid "GPU Backend" +msgstr "GPU Phụ Trợ Nền" + + +msgid "GPU backend to use (requires restarting Blender for changes to take effect)" +msgstr "GPU phụ trợ nền sẽ sử dụng (đòi hỏi phải khởi động lại Blender để các thay đổi có hiệu lực)" + + +msgid "Use OpenGL backend" +msgstr "Sử dụng nền phụ trợ OpenGL" msgid "Metal" msgstr "Metal" +msgid "Use Metal backend" +msgstr "Sử dụng nền phụ trợ Metal" + + +msgid "Use Vulkan backend" +msgstr "Sử dụng nền phụ trợ Vulkan" + + msgid "Image Display Method" -msgstr "Phương Pháp Hiển Thị Ảnh" +msgstr "Phương Pháp Hiển Thị Hình Ảnh" msgid "Method used for displaying images on the screen" -msgstr "Phương pháp cho chiếu ảnh trên màn" +msgstr "Phương pháp sử dụng để hiển thị các hình ảnh trên màn hình" msgid "Automatically choose method based on GPU and image" -msgstr "Tự động chọn phương pháp cơ sở GPU và ảnh" +msgstr "Tự động chọn phương pháp dựa trên GPU và hình ảnh" msgid "2D Texture" @@ -81467,7 +89214,7 @@ msgstr "Chất Liệu 2D" msgid "Use CPU for display transform and display image with 2D texture" -msgstr "Dùng CPU cho biến hóa hiển thị và ảnh hiển thị có chất liệu 2D" +msgstr "Sử dụng CPU để hiển thị biến hóa và hiển thị hình ảnh với chất liệu 2D" msgid "GLSL" @@ -81475,203 +89222,227 @@ msgstr "GLSL" msgid "Use GLSL shaders for display transform and display image with 2D texture" -msgstr "Dùng bộ tô sắc GLSL cho biến hóa hiển thị và ảnh hiển thị có chất liệu 2D" +msgstr "Sử dụng bộ bóng GLSL để hiển thị biến hóa và hiển thị hình ảnh với chất liệu 2D" + + +msgid "Is Microsoft Store Install" +msgstr "Có phải là Cài Đặt Microsoft Store Không" + + +msgid "Whether this blender installation is a sandboxed Microsoft Store version" +msgstr "Liệu bản cài đặt blender này có phải là phiên bản Microsoft Store gói trong môi trường hộp cát hay không" msgid "Legacy Compute Device Type" -msgstr "Thiết Bị Tính Lỗi Thời" +msgstr "Loại Thiết Bị Tính Toán Lỗi Thời" msgid "For backwards compatibility only" -msgstr "Chỉ cho phù hợp với đồ lỗi thời" +msgstr "Duy dành cho tương thích ngược" msgid "Ambient Color" -msgstr "Màu Bao Quanh" +msgstr "Màu của Ánh Sáng Tự Nhiên" msgid "Color of the ambient light that uniformly lit the scene" -msgstr "Màu của ánh sáng bao quanh được làm sáng toàn cảnh" +msgstr "Màu của ánh sáng môi trường chiếu sáng cảnh đồng đều" msgid "Memory Cache Limit" -msgstr "Giới Hạn Đệm Chứa Bộ Nhớ" +msgstr "Giới Hạn Bộ Nhớ Đệm" msgid "Memory cache limit (in megabytes)" -msgstr "Giới hạn cho đệm chứa bộ nhớ (megabyte)" +msgstr "Giới hạn lượng bộ nhớ sử dụng cho bộ nhớ đệm (trong đơn vị megabyte)" + + +msgid "Register for All Users" +msgstr "Đăng Ký cho Toàn Bộ các Người Dùng" + + +msgid "Make this Blender version open blend files for all users. Requires elevated privileges" +msgstr "Làm cho phiên bản Blender này mở các tập tin blend cho toàn bộ các người dùng. Đòi hỏi đặc quyền người dùng cao cấp" msgid "Maximum number of lines to store for the console buffer" -msgstr "Giữ số lượng dòng tối đa cho đệm diện điều khiển" +msgstr "Số dòng tối đa được lưu giữ trong bộ đệm của bàn giao tiếp" msgid "Disk Cache Compression Level" -msgstr "Mức Nén Đệm Chứa Đĩa" +msgstr "Mức Nén Bộ Đệm Nhớ trên Đĩa" msgid "Smaller compression will result in larger files, but less decoding overhead" -msgstr "Nén càng nhỏ tập tin càng lớn, nhưng nén càng nhanh" +msgstr "Mức nén nhỏ sẽ làm cho các tập tin lớn hơn, song sẽ giảm thiểu tổng phí giải mã (decoding overhead)" msgid "Requires fast storage, but uses minimum CPU resources" -msgstr "Yêu cần có đồ chứa nhanh, nhưng ít sử dụng tài nguyên CPU" +msgstr "Đòi hỏi kho chứa (bộ nhớ, hoặc đĩa) có tốc độ cao, song sẽ sử dụng rất ít tài nguyên CPU" msgid "Doesn't require fast storage and uses less CPU resources" -msgstr "Không yêu cầu đồ chứa nhanh và giảm dùng tài nguyên CPU " +msgstr "Không đòi hỏi kho chứa (bộ nhớ, hoặc đĩa) có tốc độ cao và sử dụng ít tài nguyên CPU hơn" msgid "Works on slower storage devices and uses most CPU resources" -msgstr "Hoạt động với đồ chứa chậm hơn nhưng sử dụng nhiều tài nguyên CPU" +msgstr "Hoạt động được trên các thiết bị có kho chứa (bộ nhớ, hoặc đĩa) có tốc độ thấp, song sử dụng tài nguyên CPU nhiều nhất" msgid "Disk Cache Directory" -msgstr "Mục Lục Đệm Chứa Trong Đĩa" +msgstr "Thư Mục cho Bộ Đệm Nhớ trên Đĩa" msgid "Override default directory" -msgstr "Vượt quyền cho mục lục mặc định" +msgstr "Thay thế thư mục mặc định" msgid "Disk Cache Limit" -msgstr "Giới Hạn Đệm Chứa Đĩa" +msgstr "Giới Hạn Bộ Đệm Nhớ trên Đĩa" msgid "Disk cache limit (in gigabytes)" -msgstr "Giới hạn đệm chứa đĩa (gigabyte)" +msgstr "Giới hạn của bộ đệm nhớ trên đĩa (trong đơn vị gigabytes)" msgid "Proxy Setup" -msgstr "Cài Đặt Đại Lý" +msgstr "Thiết Lập Đại Diện" msgid "When and how proxies are created" -msgstr "Khi nào va làm sao được chế tạo đại lý" +msgstr "Thời điểm và phương pháp các đại diện sẽ được kiến tạo" msgid "Manual" -msgstr "Bằng Tay" +msgstr "Thủ Công" msgid "Set up proxies manually" -msgstr "Đặt đại lý bằng tay" +msgstr "Thiết lập các bản đại diện một cách thủ công" msgid "Build proxies for added movie and image strips in each preview size" -msgstr "Xây đại lý cho phim và dãy ảnh được thêm vào từng khổ dự khán" +msgstr "Xây dựng bản đại diện cho các đoạn phim và hình ảnh được thêm vào, trong mỗi kích thước xem trước đã định" msgid "Solid Lights" -msgstr "Đèn Rắn" +msgstr "Nguồn Sáng cho Lập Thể" msgid "Lights used to display objects in solid shading mode" -msgstr "Đèn được dùng cho hiển thị vật thể trong chế độ tô sắc rắn" +msgstr "Nguồn ánh sáng được sử dụng để hiển thị các đối tượng ở chế độ chuyển sắc cho chất rắn" msgid "Texture Collection Rate" -msgstr "Tốc Độ Sưu Tập Chất Liệu" +msgstr "Tốc Độ Thu Dọn Chất Liệu" msgid "Number of seconds between each run of the GL texture garbage collector" -msgstr "Số lượng giây giữa mỗi lần được chạy bộ gồm rác chất liệu GL" +msgstr "Số giây giữa các lần thi hành của Bộ dọn rác (garbage collector) chất liệu GL" msgid "Texture Time Out" -msgstr "Hết Thời Hạn Chất Liệu" +msgstr "Thời Hạn của Chất Liệu" msgid "Time since last access of a GL texture in seconds after which it is freed (set to 0 to keep textures allocated)" -msgstr "Thời gian cuối được thử dùng chất liệu (giây) sau nó được thả (đặc = 0 cho giữ chất liệu mãi)" +msgstr "Thời gian kể từ lần truy cập cuối cùng bộ đệm đệm đỉnh của đối tượng GL (VBO) trong số giây đồng hồ sau khi nó được phóng thích (đặt thành 0 để duy trì VBO ở tình trạng đã được cấp phát)." msgid "UI Line Width" -msgstr "Bề Dày Nét Giao Diện" +msgstr "Chiều Rộng Đường Nét của UI" msgid "Suggested line thickness and point size in pixels, for add-ons displaying custom user interface elements, based on operating system settings and Blender UI scale" -msgstr "Bề dày nét và kích cỡ điểm (đơn vị điểm ảnh) được khuyến kích dùng cho đồ kèm hiển thị phần tử trong giao diện, cơ sở tùy cài đặt của hệ điều hành và tỉ số phóng to giao diện của Blender" +msgstr "Độ dày đường nét và kích thước điểm được đề xuất, trong đơn vị số điểm ảnh, dành cho các tiện ích bổ sung (add-ons) hiển thị các phần tử giao diện người dùng tùy chỉnh. Dựa trên cài đặt của hệ điều hành và thang đo giao diện người dùng của Blender" msgid "UI Scale" -msgstr "Phóng To Giao Diện" +msgstr "Đổi Tỷ Lệ Giao Diện Người Dùng" msgid "Size multiplier to use when displaying custom user interface elements, so that they are scaled correctly on screens with different DPI. This value is based on operating system DPI settings and Blender display scale" -msgstr "Hệ số nhân để sử dụng khi hiển thị phần tử giao diện người dùng được tùy chọn, cho chúng nó được phóng to đúng cho màn hình có độ phân giải khác nào. Giá trị này tùy cơ sở cài đặt độ phân giải của hệ điều hành và phóng to hiển thị của Blender" +msgstr "Số nhân kích thước hòng để sử dụng khi vẽ các thành phần giao diện người dùng tùy chỉnh, hầu cho chúng được tỷ lệ hóa một cách đúng đắn trên màn hình với lượng DPI (Dots Per Inch: Số điểm ảnh trong một đơn vị in-xơ Anh) khác nhau. Giá trị này dựa trên cài đặt DPI của hệ điều hành và thang đo hiển thị của Blender" msgid "Edit Mode Smooth Wires" -msgstr "Chế Độ Biên Tập Dây Mịn" +msgstr "Dây Lưới Mềm Mại trong Chế Độ Biên Soạn" msgid "Enable edit mode edge smoothing, reducing aliasing (requires restart)" -msgstr "Bật mịn hóa cạnh của Chế Độ Biên Tập, giảm răng cưa (cần khởi động lại)" +msgstr "Bật khả năng làm mịn màng cạnh trong chế độ biên soạn, nhằm thuyên giảm tình trạng răng cưa (đòi hỏi phải khởi động lại)" msgid "GPU Subdivision" -msgstr "Phân Hóa GPU" +msgstr "Mức Phân Hóa của GPU" msgid "Enable GPU acceleration for evaluating the last subdivision surface modifiers in the stack" -msgstr "Bật tăng tốc GPU cho tính toán cho bộ điều chỉnh phân hóa bề mặt cuối cùng trong xếp đống" +msgstr "Bật tăng tốc GPU để đánh giá các bộ điều chỉnh bề mặt phân hóa cuối cùng trong ngăn xếp" msgid "Overlay Smooth Wires" -msgstr "Che Trên Dây Mịn" +msgstr "Vẽ Lồng Dây Mịn Màng" msgid "Enable overlay smooth wires, reducing aliasing" -msgstr "Bật che trên dây mịn, để giảm răng cưa" +msgstr "Cho phép vẽ lồng dây mịn màng, giảm ảnh hưởng răng cưa" msgid "Region Overlap" -msgstr "Vùng Che Trên" +msgstr "Vùng Đè Gối Nhau" msgid "Display tool/property regions over the main region" -msgstr "Hiển thị vùng dụng cụ/đặc tính trên vùng chánh" +msgstr "Hiển thị công cụ/vùng tính chất trên khu vực chính" msgid "GPU Depth Picking" -msgstr "Chọn Bằng Độ Sâu OpenGL" +msgstr "Chọn Lọc theo Chiều Sâu GPU" msgid "When making a selection in 3D View, use the GPU depth buffer to ensure the frontmost object is selected first" -msgstr "Khi chọn đồ trong màn 3D, dùng đệm độ sâu GPU để làm chắc vật thể phía trước nhất được chọn trước" +msgstr "Khi thực hiện lựa chọn trong Góc Nhìn 3D, xin hãy sử dụng bộ đệm độ sâu GPU để đảm bảo là đối tượng trước nhất là đối tượng được chọn đầu tiên" msgid "Use Disk Cache" -msgstr "Dùng Đệm Chứa Đĩa" +msgstr "Sử Dụng Bộ Nhớ Đệm trên Đĩa" msgid "Store cached images to disk" -msgstr "Chứa các ảnh vào đệm chứa đĩa" +msgstr "Lưu các hình ảnh được ghi trong bộ đệm nhớ vào đĩa" msgid "Edit Studio Light" -msgstr "Biên Tập Đèn Xưởng" +msgstr "Biên Soạn Ánh Sáng Studio" msgid "View the result of the studio light editor in the viewport" -msgstr "Xem kết qủa của trình biên soạn đèn xưởng trong trong màn chiếu" +msgstr "Xem kết quả của trình biên soạn ánh sáng studio trong cổng nhìn" msgid "VBO Collection Rate" -msgstr "Tốc Độ Gồm Rác Vật Thể Đệm Đỉnh" +msgstr "Tần Số Thu Lượm VBO" + + +msgid "Number of seconds between each run of the GL vertex buffer object garbage collector" +msgstr "Số giây đồng hồ giữa các lần thi hành trình thu dọn rác đối tượng bộ đệm điểm đỉnh của GL (thư viện đồ họa)" msgid "VBO Time Out" -msgstr "Hết Thời Hạn Vật Thể Đệm Đỉnh" +msgstr "Thời Hạn của VBO" + + +msgid "Time since last access of a GL vertex buffer object in seconds after which it is freed (set to 0 to keep VBO allocated)" +msgstr "Thời gian kể từ lần truy cập cuối cùng của một đối tượng bộ đệm điểm đỉnh GL, trong số giây, sau đó được phóng thích (đặt thành 0 để duy trì VBO ở tình trạng được cấp phát)" msgid "Viewport Anti-Aliasing" -msgstr "Khử Răng Cưa Màn Chiếu" +msgstr "Khử Răng Cưa Khung Chiếu" msgid "Method of anti-aliasing in 3d viewport" -msgstr "Phương pháp khử răng cưa trong màn chiếu 3D" +msgstr "Phương pháp khử răng cưa trong cổng nhìn 3D" msgid "No Anti-Aliasing" @@ -81679,15 +89450,15 @@ msgstr "Không Khử Răng Cưa" msgid "Scene will be rendering without any anti-aliasing" -msgstr "Kết xuất cảnh mả không sử dụng khử răng cưa" +msgstr "Cảnh sẽ được kết xuất không khử răng cưa" msgid "Single Pass Anti-Aliasing" -msgstr "Khử Răng Cưa Một Vòng" +msgstr "Khử Răng Cưa Đơn Lượt" msgid "Scene will be rendered using a single pass anti-aliasing method (FXAA)" -msgstr "Kết xuất cảnh bằng một phương pháp khử răng cưa một vòng (FXAA)" +msgstr "Cảnh sẽ được kết xuất dùng phương pháp Khử Răng Cưa Đơn Lượt (FXAA : Fast Approximate Anti-Aliasing -- Khử Răng Cưa Ước Chừng Nhanh Chóng)" msgid "5 Samples" @@ -81695,7 +89466,7 @@ msgstr "5 Mẫu Vật" msgid "Scene will be rendered using 5 anti-aliasing samples" -msgstr "Kết xuất cảnh bằng dùng 5 mẫu khử răng cưa" +msgstr "Cảnh sẽ được kết xuất dùng 5 mẫu vật khử răng cưa" msgid "8 Samples" @@ -81703,39 +89474,39 @@ msgstr "8 Mẫu Vật" msgid "Scene will be rendered using 8 anti-aliasing samples" -msgstr "Kết xuất cảnh bằng dùng 8 mẫu khử răng cưa" +msgstr "Cảnh sẽ được kết xuất dùng 8 mẫu vật khử răng cưa" msgid "11 Samples" -msgstr "11 Mẫu" +msgstr "11 Mẫu Vật" msgid "Scene will be rendered using 11 anti-aliasing samples" -msgstr "Kết xuất cảnh bằng dùng 11 mẫu khử răng cưa" +msgstr "Cảnh sẽ được kết xuất dùng 11 mẫu vật khử răng cưa" msgid "16 Samples" -msgstr "16 Mẫu" +msgstr "16 Mẫu Vật" msgid "Scene will be rendered using 16 anti-aliasing samples" -msgstr "Kết xuất cảnh bằng dùng 16 mẫu khử răng cưa" +msgstr "Cảnh sẽ được kết xuất dùng 16 mẫu vật khử răng cưa" msgid "32 Samples" -msgstr "32 Mẫu" +msgstr "32 Mẫu Vật" msgid "Scene will be rendered using 32 anti-aliasing samples" -msgstr "Kết xuất cảnh bằng dùng 32 mẫu khử răng cưa" +msgstr "Cảnh sẽ được kết xuất dùng 32 mẫu vật khử răng cưa" msgid "Color Picker Type" -msgstr "Loại Bảng Chọn Màu" +msgstr "Trình Chọn Màu" msgid "Different styles of displaying the color picker widget" -msgstr "Phong cách khác cho hiển thị khiển tố bảng màu" +msgstr "Một số phong cách khác nhau để hiển thị thành tố điều khiển chọn màu sắc" msgid "Circle (HSV)" @@ -81743,7 +89514,7 @@ msgstr "Vòng Tròn (HSV)" msgid "A circular Hue/Saturation color wheel, with Value slider" -msgstr "Bảng màu tròn Màu Sắt/Độ Tươi, với trơn trượt Độ Xám" +msgstr "Vòng tròn màu sắc có hình tròn về Sắc Màu/Độ Bão Hòa, với thanh trượt Giá Trị" msgid "Circle (HSL)" @@ -81751,31 +89522,31 @@ msgstr "Vòng Tròn (HSL)" msgid "A circular Hue/Saturation color wheel, with Lightness slider" -msgstr "Bảng màu tròn Màu Sắt/Độ Tươi, với trơn trượt Độ Sáng" +msgstr "Vòng tròn màu sắc có hình tròn về Sắc Màu/Độ Bão Hòa, với thanh trượt Độ Sáng/Tối" msgid "Square (SV + H)" -msgstr "Vuông (SV + H)" +msgstr "Hình Vuông (SV + H)" msgid "A square showing Saturation/Value, with Hue slider" -msgstr "Vuông hiển thị Độ Tươi/Độ Xám, với trơn trượt Màu Sắc" +msgstr "Hình vuông hiển thị Độ Bão Hòa (độ tươi)/Giá Trị, với thanh trượt về Sắc Màu" msgid "Square (HS + V)" -msgstr "Vuông (HS + V)" +msgstr "Hình Vuông (HS + V)" msgid "A square showing Hue/Saturation, with Value slider" -msgstr "Một vuông hiển thị Màu Sắc/Độ Tươi, với trơn trượt Độ Xám" +msgstr "Hình vuông hiển thị Sắc Màu/Độ Bão Hòa (độ tươi), với thanh trượt Giá Trị" msgid "Square (HV + S)" -msgstr "Vuông (HV + S)" +msgstr "Hình Vuông (HV + S)" msgid "A square showing Hue/Value, with Saturation slider" -msgstr "Một vuộng hiển thị Màu Sắc/Độ Xám, với trơn trượt Độ Tươi" +msgstr "Hình vuông hiển thị Sắc Màu/Giá Trị, với thanh trượt Độ Bão Hòa (độ tươi)" msgid "Factor Display Type" @@ -81783,11 +89554,11 @@ msgstr "Kiểu Hiển Thị Hệ Số" msgid "How factor values are displayed" -msgstr "Phương pháp cho hiển thị hệ số" +msgstr "Phương pháp hiển thị các giá trị hệ số" msgid "Display factors as values between 0 and 1" -msgstr "Hiển thị hệ số bằng giá trị giữa 0 và 1" +msgstr "Hiển thị hệ số tựa các giá trị từ 0 đến 1" msgid "Percentage" @@ -81795,23 +89566,23 @@ msgstr "Phần Trăm" msgid "Display factors as percentages" -msgstr "Hiển thị hệ số bằng phần trăm" +msgstr "Hiển thị hệ số như các phần trăm" msgid "File Browser Display Type" -msgstr "Loại Hiển Thị Trình Duyệt Tập Tin" +msgstr "Hiển Thị Trình Duyệt Tập Tin tại" msgid "Default location where the File Editor will be displayed in" -msgstr "Vị trí mặc định cho hiển thị Biên Tập Tập Tin" +msgstr "Địa phương mặc định nơi Trình Biên Soạn Tập Tin sẽ được hiển thị trong đó" msgid "Maximized Area" -msgstr "Khu Vực Toàn Bộ Hóa" +msgstr "Tối Đa Hóa Diện Tích" msgid "Open the temporary editor in a maximized screen" -msgstr "Mở trình biên soạn tạm thời trong một màn toàn bộ" +msgstr "Mở trình biên soạn tạm thời trong chế độ màn hình mở rộng tối đa" msgid "New Window" @@ -81831,51 +89602,51 @@ msgstr "Đường dẫn đến phông giao diện" msgid "Monospaced Font" -msgstr "Phông Đều Cách" +msgstr "Phông Đơn Cách" msgid "Path to interface monospaced Font" -msgstr "Đường dẫn đến Phông giao diện đều cách" +msgstr "Đường dẫn đến phông đơn cách của giao diện" msgid "Gizmo Size" -msgstr "Kích Cỡ Đồ Đạc" +msgstr "Kích Thước Gizmo" msgid "Diameter of the gizmo" -msgstr "Đường kính của đồ đạc" +msgstr "Đường kính của gizmo" msgid "Navigate Gizmo Size" -msgstr "Cỡ Thước Đồ Đạc Chuyển Hướng" +msgstr "Kích Thước Gizmo Điều Hướng" msgid "The Navigate Gizmo size" -msgstr "Cỡ thước của Đồ Đạc Chuyển Hướng" +msgstr "Kích thước Gizmo điều hướng" msgid "Header Position" -msgstr "Vị Trí Phần Đầu" +msgstr "Vị Trí Tiêu Đề" msgid "Default header position for new space-types" -msgstr "Vị trí phần đầu mặc định cho cho loại dấu cách mới" +msgstr "Vị trí tiêu đề mặc định cho những thể loại không gian mới" msgid "Keep Existing" -msgstr "Giữ Tồn Tại" +msgstr "Duy Trì Hiện Tại" msgid "Keep existing header alignment" -msgstr "Giữ nguyên sắp xếp đầu hiện tại" +msgstr "Duy trì sự căn chỉnh tiêu đề hiện tại" msgid "Top aligned on load" -msgstr "Sắp xếp trên khi nhập" +msgstr "Căn chỉnh về đỉnh khi mới nạp" msgid "Bottom align on load (except for property editors)" -msgstr "Sắp xếp dưới khi nhập (trừ trình biên soạn đặc tính)" +msgstr "Căn chỉnh về đáy khi mới nạp (ngoại trừ các trình biên soạn tính chất)" msgid "Language" @@ -81883,263 +89654,303 @@ msgstr "Ngôn Ngữ" msgid "Language used for translation" -msgstr "Ngôn ngữ cho phiên dịch" +msgstr "Ngôn ngữ sử dụng trong bản phiên dịch" + + +msgid "Automatic (Automatic)" +msgstr "Tự Động (Automatic)" msgid "Automatically choose system's defined language if available, or fall-back to English" -msgstr "Tự động chọn tìm kiếm ngôn ngữ được chỉ định của hệ thống, nếu có, hay dùng Tiếng Anh" +msgstr "Tự động chọn ngôn ngữ mà hệ thống xác định, nếu có, hoặc quay trở lại tiếng Anh cơ sở" msgid "HDRI Preview Size" -msgstr "Cơ Thước Dự Khán HDRI" +msgstr "Kích Thước Xem Trước HDRI" msgid "Diameter of the HDRI preview spheres" -msgstr "Bán kính của hình cầu dự khán HDRI" +msgstr "Đường kính của những hình cầu xem trước HDRI" msgid "Mini Axes Brightness" -msgstr "Độ Sáng Tiểu Trục" +msgstr "Độ Sáng Bộ Trục Nhỏ" msgid "Brightness of the icon" -msgstr "Độ sáng của biểu tượng tiểu trục" +msgstr "Độ sáng của biểu tượng" msgid "Mini Axes Size" -msgstr "Kích Cỡ Tiểu Trục" +msgstr "Kích Thước Bộ Trục Nhỏ" msgid "The axes icon's size" -msgstr "Kích Cỡ biểu tượng của tiểu trục" +msgstr "Kích thước biểu tượng của bộ trục" msgid "Mini Axes Type" -msgstr "Loại Tiểu Trục" +msgstr "Loại Trục Nhỏ" + + +msgid "Show small rotating 3D axes in the top right corner of the 3D viewport" +msgstr "Hiển thị các trục 3D xoay chiều nhỏ ở góc trên cùng bên phải của cổng nhìn 3D" + + +msgid "Simple Axes" +msgstr "Trục Đơn Giản" msgid "Interactive Navigation" -msgstr "Chuyển Hướng Tương Tác" +msgstr "Điều Hướng Tương Tác" msgid "Sub Level Menu Open Delay" -msgstr "Trì Hoãn Mở Danh Bạ Tầng Phụ" +msgstr "Lượng Trì Hoãn Mở Trình Đơn Tầng Dưới" msgid "Time delay in 1/10 seconds before automatically opening sub level menus" -msgstr "Trì hoãn thời gian (1/10 giây) trước tự động mở danh bạ tầng phụ" +msgstr "Thời gian trì hoãn, trong 1/10 giây, trước khi tự động mở các trình đơn ở tầng dưới" msgid "Top Level Menu Open Delay" -msgstr "Trì Hoãn Mở Danh Bạ Mức Cao" +msgstr "Lượng Trì Hoãn Mở Tầng Đỉnh của Trình Đơn" msgid "Time delay in 1/10 seconds before automatically opening top level menus" -msgstr "Trì hoãn thời gian (1/10 giây) trước tự động mở danh bạ mức cao" +msgstr "Thời gian trì hoãn, trong 1/10 giây, trước khi tầng đỉnh của trình đơn tự động mở ra" msgid "Animation Timeout" -msgstr "Thời Hạn Hoạt Hình" +msgstr "Thời Hạn Trước Khi Tắt Hoạt Họa" msgid "Time needed to fully animate the pie to unfolded state (in 1/100ths of sec)" -msgstr "Thời gian cần cho hoạt hình danh bạ quạt có thể mở toàn bộ (1/100 giây)" +msgstr "Thời gian đòi hỏi để hoạt họa trạng thái hình rẻ quạt mở ra trọn vẹn (trong 1/100 giây)" msgid "Recenter Timeout" -msgstr "Thời Hạn Trung Tâm Lại" +msgstr "Thời Hạn Đặt Lại về Trung Tâm" msgid "Pie menus will use the initial mouse position as center for this amount of time (in 1/100ths of sec)" -msgstr "Danh bạ quạt sẽ dùng vị trí khởi đầu của chuột làm trung tâm cho thờn gian này (1/100 giây)" +msgstr "Trình đơn rẻ quạt sẽ sử dụng vị trí khởi đầu của chuột làm trung tâm cho lượng thời gian này (trong 1/100 giây)" msgid "Confirm Threshold" -msgstr "Chấp Nhận Ngưỡng" +msgstr "Giới Hạn Chấp Nhận" msgid "Distance threshold after which selection is made (zero to disable)" -msgstr "Ngưỡng khoảng cách sau được chọn đồ (0 = tắt)" +msgstr "Sau giới hạn về khoảng cách này thì sự lựa chọn mới có thể được chấp nhận (đặt = 0 để tắt)" msgid "Pie menu size in pixels" -msgstr "Kích cỡ danh bạ quạt (điểm ảnh)" +msgstr "Kích thước trình đơn hình rẻ quạt trong số điểm ảnh" msgid "Distance from center needed before a selection can be made" -msgstr "Khoảng cách từ trung tâm trước có thể chọn đồ" +msgstr "Khoảng cách từ trung tâm cần có trước khi có thể lựa chọn" msgid "Tap Key Timeout" -msgstr "Hết Hạn Bấm Nút" +msgstr "Thời Định bằng Phím Bấm" + + +msgid "Pie menu button held longer than this will dismiss menu on release (in 1/100ths of sec)" +msgstr "Nút trình đơn rẻ quạt được giữ lâu hơn mức này sẽ loại bỏ trình đơn khi thả ra (trong 1/100 giây)" + + +msgid "FPS Average Samples" +msgstr "Trung Bình Mẫu Vật FPS" + + +msgid "The number of frames to use for calculating FPS average. Zero to calculate this automatically, where the number of samples matches the target FPS" +msgstr "Số khung hình được sử dụng để tính trung bình tần số khung hình/giây. 0 để tính toán cái này một cách tự động, khi số mẫu vật tương xứng với tần số khung hình/giây mục tiêu" msgid "Render Display Type" -msgstr "Loại Hiển Thị Kết Xuất" +msgstr "Kiểu Hiển Thị Bản Kết Xuất" msgid "Default location where rendered images will be displayed in" -msgstr "Chọn chỗ cho hiển thị các ảnh kết xuất" +msgstr "Địa phương mặc định nơi các hình ảnh kết xuất sẽ được hiển thị trong đó" msgid "Keep User Interface" -msgstr "Giữ Nguyên Giao Diện Người Dùng" +msgstr "Duy Trì Giao Diện Người Dùng" msgid "Images are rendered without changing the user interface" -msgstr "Ảnh được kết xuất nhưng không thay đổi giao diện người dùng" +msgstr "Hình ảnh được kết xuất mà không thay đổi giao diện người dùng" msgid "Images are rendered in a maximized Image Editor" -msgstr "Ảnh được kết xuất trong Trình Biên Soạn Ảnh toàn màn" +msgstr "Hình ảnh sẽ được kết xuất trong Trình Biên Soạn Hình Ảnh mở tối đa" msgid "Images are rendered in an Image Editor" -msgstr "Ảnh được kết xuất trong một ứng dụng Biên Tập Ảnh" +msgstr "Hình ảnh được kết xuất trong Trình Biên Soạn Hình Ảnh" msgid "Images are rendered in a new window" -msgstr "Ảnh được kết xuất trong một cửa sổ mới" +msgstr "Hình ảnh được kết xuất trong một cửa sổ mới" msgid "Rotation step for numerical pad keys (2 4 6 8)" -msgstr "Bước xoay cho phím bàn số (2 4 6 8)" +msgstr "Bước xoay cho các phím bàn số (2 4 6 8)" msgid "Enabled Add-ons Only" -msgstr "Chỉ Đồ Kèm Được Bật" +msgstr "Duy Trình Bổ Sung đã Bật mà thôi" msgid "Only show enabled add-ons. Un-check to see all installed add-ons" -msgstr "Chỉ hiện đồ kèm được bật. Gỡ dấu để nhìn thấy tất cả đồ kèm." +msgstr "Chỉ hiển thị các trình bổ sung đã bật (kích hoạt) mà thôi. Bỏ dấu kiểm để thấy toàn bộ các trình bổ sung đã cài" msgid "Toolbox Column Layout" -msgstr "Cài Đặt Cột Hộp Dụng Cụ" +msgstr "Bố Trí Hộp Công Cụ Theo Cột" msgid "Use a column layout for toolbox" -msgstr "Dùng cài đặt cột cho hộp dụng cụ" +msgstr "Dùng bố trí cột cho hộp công cụ" msgid "Developer Extras" -msgstr "Đồ Thêm Cho Người Lập Trình" +msgstr "Bổ Sung dành cho Lập Trình Viên" msgid "Show options for developers (edit source in context menu, geometry indices)" -msgstr "Hiện tùy chọn cho người lập trình (biên tập mã nguồn trong danh bạ bối cảnh, chỉ số của hình dạng)" +msgstr "Hiển thị các tùy chỉnh dành cho những người xây dựng phần mềm (nguồn biên soạn trong trình đơn ngữ cảnh, chỉ số hình học)" msgid "Use transform gizmos by default" -msgstr "Mặc định là dùng đồ đạc biến hóa" +msgstr "Mặc định sử dụng các gizmo biến hóa" msgid "Navigation Controls" -msgstr "Bộ Chuyển Hướng" +msgstr "Điều Khiển về Điều Hướng" msgid "Show navigation controls in 2D and 3D views which do not have scroll bars" -msgstr "Hiện bộ chuyển hướng trong màn 2D và 3D mà không có thanh cuộn" +msgstr "Hiển thị các điều khiển về điều hướng trong các góc nhìn 2D và 3D cho những cái không có các thanh cuộn" msgid "Display Object Info" -msgstr "Hiện Thông Tin Vật Thể" +msgstr "Hiển Thị Thông Tin về Đối Tượng" msgid "Include the name of the active object and the current frame number in the text info overlay" -msgstr "Gồm tên của vật thể hoạt động và số bức ảnh hiện tại trong lớp chiếu thông tin văn bản" +msgstr "Bao gồm tên của đối tượng đang hoạt động và số khung hình hiện tại trong lớp thông tin văn bản vẽ lồng" msgid "Display Playback Frame Rate (FPS)" -msgstr "Chiếu Tốc Độ Hát Lại (Bức Ảnh/Giây)" +msgstr "Hiển Thị Tỷ Lệ Khung Hình Chơi Lại (FPS)" msgid "Include the number of frames displayed per second in the text info overlay while animation is played back" -msgstr "Gồm số lượng bức ảnh được chiếu từng giây trong lớp chiếu thông tin văn bản khi hát lại hoạt hình" +msgstr "Bao gồm số khung hình được hiển thị mỗi giây trong lớp thông tin văn bản vẽ lồng trong khi hoạt họa đang được chơi lại" msgid "Show Splash" -msgstr "Hiện Ảnh Giới Thiệu" +msgstr "Hiển Thị Màn Hình Chào Đón" msgid "Display splash screen on startup" -msgstr "Hiển thị hình quảng cáo khi khởi đầu" +msgstr "Hiển thị màn hình chào đón khi khởi đầu" msgid "Show Memory" -msgstr "Hiện Bộ Nhớ" +msgstr "Hiển Thị Bộ Nhớ" msgid "Show Blender memory usage" -msgstr "Hiện cách dùng bộ nhớ của Blender" +msgstr "Hiển thị mức sử dụng bộ nhớ của Blender" + + +msgid "Show Scene Duration" +msgstr "Hiển Thị Thời Lượng của Cảnh" + + +msgid "Show scene duration" +msgstr "Hiển thị khoảng thời lượng của cảnh" msgid "Show Statistics" -msgstr "Hiện Thống Kê" +msgstr "Hiển Thị Thống Kê" msgid "Show scene statistics" -msgstr "Hiện thống kê cảnh" +msgstr "Hiển thị thiết kế về cảnh" msgid "Show Version" -msgstr "Hiện Phiên Bản" +msgstr "Hiển Thị Phiên Bản" msgid "Show Blender version string" -msgstr "Hiện xâu phiên bản Blender" +msgstr "Hiển thị dòng chữ về phiên bản của Blender" msgid "Show VRAM" -msgstr "Hiện VRAM" +msgstr "Hiển Thị VRAM" msgid "Show GPU video memory usage" -msgstr "Hiện cách dùng bộ nhớ video" +msgstr "Hiển thị mức sử dụng bộ nhớ video của bộ xử lý đồ họa (GPU)" msgid "Tooltips" -msgstr "Đề Thị Dụng Cụ" +msgstr "Chú Thích về Công Cụ" msgid "Display tooltips (when disabled, hold Alt to force display)" -msgstr "Hiển thị đề thị dụng cụ (khi tắt, bấm Alt cho bắt buộc hiển thị)" +msgstr "Hiển thị các chú thích công cụ (khi bị tắt thì bấm Alt để bắt phải xuất hiện)" msgid "Python Tooltips" -msgstr "Đề Thị Dụng Cụ Python" +msgstr "Chú Thích về Công Cụ Python" msgid "Show Python references in tooltips" -msgstr "Hiện tham khảo Python trong đề thị dụng cụ" +msgstr "Hiển thị các tham chiếu về Python trong các chú thích về công cụ" msgid "Display View Name" -msgstr "Hiển Thị Tên Màn" +msgstr "Hiển Thị Tên Góc Nhìn" msgid "Include the name of the view orientation in the text info overlay" -msgstr "Gồm tên của định hướng màn trong lớp chiếu thông tin văn bản" +msgstr "Bao gồm tên của chiều hướng góc nhìn trong lớp thông tin văn bản vẽ lồng" msgid "Smooth View" -msgstr "Màn Mịn" +msgstr "Chuyển Động Góc Nhìn Mềm Mại" msgid "Time to animate the view in milliseconds, zero to disable" -msgstr "Thời gian cho hoạt động màn (milli giây), Đặt = 0 để tắt" +msgstr "Thời gian để hoạt họa góc nhìn trong số milli giây, đặt = 0 để tắt đi" msgid "Text Hinting" -msgstr "Mẹo Văn Bản" +msgstr "Gợi Ý Văn Bản" msgid "Method for making user interface text render sharp" -msgstr "Cách cho làm rõ văn bản của giao diện người dùng" +msgstr "Phương pháp làm cho văn bản trong giao diện người dùng kết xuất sắc nét (Text Hinting)" msgid "Slight" -msgstr "Chút" +msgstr "Đôi Chút" + + +msgid "Timecode Style" +msgstr "Mốt Mã Thời Gian" + + +msgid "Format of timecode displayed when not displaying timing in terms of frames" +msgstr "Định dạng mã thời gian để hiển thị khi không cho hiện thời gian dùng số khung hình" msgid "Minimal Info" @@ -82147,43 +89958,43 @@ msgstr "Thông Tin Tối Thiểu" msgid "Most compact representation, uses '+' as separator for sub-second frame numbers, with left and right truncation of the timecode as necessary" -msgstr "Biểu Diễn gọn nhất, dùng dấu '+' làm dấu chẻ cho bức ảnh nhỏ hơn một giây, và cắt bên trái và bên phải của mã thời gian nếu cần thiết" +msgstr "Để biểu hiện ngắn gọn nhất, dùng dấu '+' làm dấu phân cách cho số khung hình nhỏ hơn một giây, xén gọn hai bên trái và phải của mã thời gian tùy theo nhu cầu" msgid "SMPTE (Full)" -msgstr "SMPTE (Toàn)" +msgstr "SMPTE (Toàn Phần)" msgid "Full SMPTE timecode (format is HH:MM:SS:FF)" -msgstr "Toàn bộ mẫ thời gian SMPTE (định dạng HH:MM:SS:FF, giờ:phút:giây:bứcẢnh)" +msgstr "Mã thời gian SMPTE toàn phần (định dạnh HH:MM:SS:FF = GIỜ:PHÚT:GIÂY:KHUNG HÌNH)" msgid "SMPTE (Compact)" -msgstr "SMPTE (gọn)" +msgstr "SMPTE (Ngắn Gọn)" msgid "SMPTE timecode showing minutes, seconds, and frames only - hours are also shown if necessary, but not by default" -msgstr "Mã thời gian SMPTE chỉ hiện phút, giây, và bức ảnh - chỉ hiện giờ khi cần thiết, nhưng mặc định là không hiện" +msgstr "Mã thời gian SMPTE chỉ hiển thị phút, giây, và số khung hình mà thôi - Số giờ chỉ được hiển thị khi cần thiết, không đặt là mặc định" msgid "Compact with Milliseconds" -msgstr "Gọn với Milli Giây" +msgstr "Ngắn Gọn dùng Milli Giây" msgid "Similar to SMPTE (Compact), except that instead of frames, milliseconds are shown instead" -msgstr "Giống SMPTE (Gọn) nhưng thay thế bức ảnh nó hiện bằng milli giây" +msgstr "Tương tự như SMPTE (Ngắn gọn), song thay vì hiển thị số khung hình, hiển thị số milli giây" msgid "Only Seconds" -msgstr "Chỉ giây" +msgstr "Duy Số Giây" msgid "Direct conversion of frame numbers to seconds" -msgstr "Biến đổi bức ảnh trực tiếp sang giây" +msgstr "Trực tuyến chuyển đổi số khung hình thành số giây" msgid "Changes the thickness of widget outlines, lines and dots in the interface" -msgstr "Được đổi bề dày của nét ngoài của khiển tố, đường và dấu chấm trong giao diện" +msgstr "Đổi độ dày đường viền của thành tố điều khiển, đường thẳng và các chấm trong giao diện" msgid "Thin" @@ -82195,7 +90006,7 @@ msgstr "Nét mỏng hơn mặc định" msgid "Automatic line width based on UI scale" -msgstr "Tự động chỉnh bề rộng nét theo phóng to giao diện" +msgstr "Tự động chỉnh chiều rộng nét dựa vào tỷ lệ của Giao Diện Người Dùng" msgid "Thick" @@ -82207,27 +90018,43 @@ msgstr "Nét dày hơn mặc định" msgid "Changes the size of the fonts and widgets in the interface" -msgstr "Được đổi kich cỡ của phông và khiển tố trong giao diện" +msgstr "Đổi kích thước phông chữ và các thành tố điều khiển trong giao diện" + + +msgid "" +"Enable a fresnel effect on edit mesh overlays.\n" +"It improves shape readability of very dense meshes, but increases eye fatigue when modeling lower poly" +msgstr "" +"Kích hoạt hiệu ứng fresnen khi chỉnh sửa lớp vẽ lồng khung lưới.\n" +"Nó cải thiện khả năng đọc hình dạng của các khung lưới rất dày đặc, song làm tăng sự mỏi mệt của mắt khi kiến tạo mô hình ở dạng đa giác thấp hơn" msgid "Open menu buttons and pulldowns automatically when the mouse is hovering" -msgstr "Mở nút danh bạ và danh bạ kéo xuống tự động khi chuột đang dừng lại trên" +msgstr "Mở các nút trình đơn và các trình đơn thả xuống tự động khi đầu chuột lơ lửng ở trên" msgid "Save Prompt" -msgstr "Nhắc Lưu" +msgstr "Nhắc Nhở Khi Lưu" msgid "Ask for confirmation when quitting with unsaved changes" -msgstr "Hỏi xác nhận khi nghỉ khi có thay đổi chưa được lưu" +msgstr "Yêu cầu sự chấp thuận khi thoát phần mềm khi có những thay đổi chưa được lưu lại" msgid "Text Anti-Aliasing" -msgstr "Khử Răng Văn Bản" +msgstr "Khử Răng Cưa Văn Bản" msgid "Smooth jagged edges of user interface text" -msgstr "Mịn hóa cạnh răng cưa của văn bản trong giao diện" +msgstr "Làm mượt các cạnh lởm chởm của văn bản trong giao diện người dùng" + + +msgid "Text Subpixel Anti-Aliasing" +msgstr "Khử Răng Cưa Điểm Ảnh Thứ Văn Bản" + + +msgid "Render text for optimal horizontal placement" +msgstr "Kết xuất văn bản để có vị trí chiều ngang tối ưu" msgid "Translate Interface" @@ -82235,119 +90062,367 @@ msgstr "Phiên Dịch Giao Diện" msgid "Translate all labels in menus, buttons and panels (note that this might make it hard to follow tutorials or the manual)" -msgstr "Phiên dịch tất cả nhãn trong danh bạ, nút, và bảng (lưu ý cái này có thể làm khó theo bài dẫn và sách hướng dẫn của Blender)" +msgstr "Phiên dịch các nhãn trên trình đơn, nút bấm và các bảng (lưu ý rằng sắp đặt này có thể làm cho việc theo dõi các bài hướng dẫn hoặc bản hướng dẫn sử dụng)" msgid "Translate New Names" -msgstr "Phiên Dịch Tên Mới" +msgstr "Phiên Dịch Những Tên Mới" msgid "Translate the names of new data-blocks (objects, materials...)" -msgstr "Phiên dịch tên của cục dữ liệu mới (vật thể, vật liệu...)" +msgstr "Phiên dịch các tên của những khối dữ liệu (đối tượng, nguyên vật liệu...)" msgid "Translate Tooltips" -msgstr "Phiên Dịch Đề Thị Dụng Cụ" +msgstr "Phiên Dịch Chú Thích về Công Cụ" msgid "Translate the descriptions when hovering UI elements (recommended)" -msgstr "Phiên dịch các mô tả khi dừng lại trên phần tử giao diện (được khuyến khích dùng)" +msgstr "Phiên dịch các miêu tả khi lơ lửng trên các phần tử giao diện người dùng (UI) (khuyến nghị)" msgid "Use Weight Color Range" -msgstr "Dùng Phạm Vi Màu Quyền Lượng" +msgstr "Dùng Phạm Vi Màu Trọng Lượng" msgid "Enable color range used for weight visualization in weight painting mode" -msgstr "Bật phạm vi màu được dùng cho hiển thị quyền lượng trong chế độ sơn" +msgstr "Cho phép sử dụng khoảng màu để diễn họa trọng lượng trong chế độ sơn trọng lượng" msgid "2D View Minimum Grid Spacing" -msgstr "Cách Giữa Cực Tiểu Đồ Thị Màn 2D" +msgstr "Phân Khoảng Tối Thiểu của Khung Lưới Đồ Thị ở Khung Nhìn 2D" msgid "Minimum number of pixels between each gridline in 2D Viewports" -msgstr "Số lượng điểm ảnh tối thiểu giữa đường đồ thị trong màn chiếu 2D" +msgstr "Số lượng điểm ảnh tối thiểu giữa mỗi đường khung lưới đồ thị trong Cổng Nhìn 2D" msgid "Zoom Keyframes" -msgstr "Phóng Bức Ảnh Mẫu" +msgstr "Số Khung Khóa Thu-Phóng" msgid "Keyframes around cursor that we zoom around" -msgstr "Phóng đến số bức ảnh mẫu nào xung quanh con trỏ" +msgstr "Số khung khóa chung quanh con trỏ mà chúng ta thu-phóng vào" msgid "Zoom Seconds" -msgstr "Giây Phóng" +msgstr "Số Giây Thu-Phóng" msgid "Seconds around cursor that we zoom around" -msgstr "Giây phóng quanh con trỏ" +msgstr "Số giây chung quanh con trỏ mà chúng ta thu-phóng vào" msgid "Zoom to Frame Type" -msgstr "Phóng đến Loại Bức Ảnh" +msgstr "Kiểu Thu-Phóng vào Khung Hình" msgid "How zooming to frame focuses around current frame" -msgstr "Làm sao phóng đến bức ảnh sẽ tập trung quanh bức ảnh hiện tại" +msgstr "Kiểu thu-phóng trong khung hình để tập trung vào những vùng quanh khung hình hiện tại" msgid "Keep Range" -msgstr "Giữ Phạm Vi" +msgstr "Duy Trì Phạm Vi" msgid "Seconds" -msgstr "Giây" +msgstr "Số Giây Đồng Hồ" msgid "Weight Color Range" -msgstr "Phạm Vi Màu Quyền Lượng" +msgstr "Phạm Vi Màu Trọng Lượng" msgid "Color range used for weight visualization in weight painting mode" -msgstr "Phạm vi màu được dùng cho hiển thị quyền lượng trong chế độ sơn quyền lượng" +msgstr "Khoảng màu sử dụng để diễn họa trọng lượng trong chế độ sơn trọng lượng" + + +msgid "Primitive Boolean" +msgstr "Bool Cơ Bản" + + +msgid "RNA wrapped boolean" +msgstr "Bool dùng vỏ RNA" + + +msgid "Primitive Float" +msgstr "Số Thực Cơ Bản" + + +msgid "RNA wrapped float" +msgstr "Số thực dùng vỏ RNA" + + +msgid "Primitive Int" +msgstr "Số Nguyên Cơ Bản" + + +msgid "RNA wrapped int" +msgstr "Số nguyên dùng vỏ RNA" + + +msgid "String Value" +msgstr "Giá Trị String" + + +msgid "RNA wrapped string" +msgstr "Chuỗi ký tự dùng vỏ RNA" + + +msgid "Property Definition" +msgstr "Định Nghĩa của Tính Chất" + + +msgid "RNA property definition" +msgstr "Định nghĩa của tính chất RNA" + + +msgid "Description of the property for tooltips" +msgstr "Miêu tả của tính chất dành cho chú giải công cụ" + + +msgid "Animatable" +msgstr "Có Thể Hoạt Họa" + + +msgid "Property is animatable through RNA" +msgstr "Tính chất có thể hoạt họa thông qua RNA" + + +msgid "Optional Argument" +msgstr "Đối Số Tùy Ý" + + +msgid "True when the property is optional in a Python function implementing an RNA function" +msgstr "Đúng khi tính chất là tùy ý (không bắt buộc) trong hàm Python triển khai hàm RNA" + + +msgid "Enum Flag" +msgstr "Cờ Liệt Kê" + + +msgid "True when multiple enums" +msgstr "Đúng khi có nhiều enum (liệt kê)" + + +msgid "True when the property is hidden" +msgstr "Đúng khi tính chất ở trạng thái ẩn khuất" + + +msgid "Library Editable" +msgstr "Thư Viện Có Thể Chỉnh Sửa" + + +msgid "Property is editable from linked instances (changes not saved)" +msgstr "Tính chất có thể chỉnh sửa được từ các thực thể liên kết (các thay đổi sẽ không được lưu)" + + +msgid "Never None" +msgstr "Không Bao Giờ Không Có" + + +msgid "True when this value can't be set to None" +msgstr "Đúng khi không thể đặt giá trị này thành Không Có (None) được" + + +msgid "Return" +msgstr "Trả Lại" + + +msgid "True when this property is an output value from an RNA function" +msgstr "Đúng khi thuộc tính này là giá trị đầu ra từ hàm RNA" + + +msgid "Overridable" +msgstr "Có Thể Vượt Quyền" + + +msgid "Property is overridable through RNA" +msgstr "Tính chất có thể vượt quyền được thông qua RNA" + + +msgid "Path Output" +msgstr "Đầu Ra Đường Dẫn" + + +msgid "Property is a filename, filepath or directory output" +msgstr "Tính chất là tên một tập tin, một đường dẫn tập tin hoặc một thư mục đầu ra" + + +msgid "Read Only" +msgstr "Duy Đọc" + + +msgid "Property is editable through RNA" +msgstr "Tính chất có thể biên soạn được thông qua RNA" + + +msgid "Registered" +msgstr "Đăng Ký" + + +msgid "Property is registered as part of type registration" +msgstr "Tính chất được đăng ký như một phần của đăng ký kiểu vậy" + + +msgid "Registered Optionally" +msgstr "Đăng Ký Tùy Ý" + + +msgid "Property is optionally registered as part of type registration" +msgstr "Tính chất được đăng ký một cách tùy ý như một phần của đăng ký kiểu vậy" + + +msgid "Required" +msgstr "Đòi Hỏi" + + +msgid "False when this property is an optional argument in an RNA function" +msgstr "Sai khi tính chất này là một đối số tùy ý (không bắt buộc) trong một hàm RNA" + + +msgid "Runtime" +msgstr "Thời Gian Chạy" + + +msgid "Property has been dynamically created at runtime" +msgstr "Tính chất đã được tạo ra một cách năng động trong thời gian chạy" + + +msgid "Skip Save" +msgstr "Bỏ Qua Lưu" + + +msgid "True when the property is not saved in presets" +msgstr "Đúng khi tính chất không được lưu trong các cài đặt trước" msgid "Base" msgstr "Cơ Sở" +msgid "Struct definition used for properties assigned to this item" +msgstr "Định nghĩa cấu trúc sử dụng cho các tính chất được ấn định cho mục này" + + +msgid "Semantic interpretation of the property" +msgstr "Giải thích ngữ nghĩa của tính chất" + + +msgid "Byte String" +msgstr "Chuỗi Ký Tự Byte" + + +msgid "A string that is displayed hidden ('********')" +msgstr "Một chuỗi ký tự được hiển thị trong dạng ẩn khuất ('********')" + + +msgid "Unsigned" +msgstr "Số Dương Không Dấu" + + +msgid "Time (Scene Relative)" +msgstr "Thời Gian (Tương Đối với Cảnh)" + + +msgid "Time specified in frames, converted to seconds based on scene frame rate" +msgstr "Thời gian chỉ định trong khung hình, được chuyển đổi thành số giây dựa trên tần số khung hình của cảnh" + + +msgid "Time (Absolute)" +msgstr "Thời Gian (Tuyệt Đối)" + + +msgid "Time specified in seconds, independent of the scene" +msgstr "Thời gian được chỉ định bằng giây, không phụ thuộc vào cảnh" + + +msgid "Camera Distance" +msgstr "Khoảng Cách Máy Quay Phim" + + msgid "Temperature" msgstr "Nhiệt Độ" +msgid "Euler Angles" +msgstr "Góc Euler" + + +msgid "Axis-Angle" +msgstr "Góc-Trục" + + msgid "XYZ" msgstr "XYZ" +msgid "XYZ Length" +msgstr "Chiều Dài XYZ" + + +msgid "Layer Member" +msgstr "Thành Viên của Tầng Lớp" + + +msgid "Subset of tags (defined in parent struct) that are set for this property" +msgstr "Tập hợp con của các thẻ (được xác định trong cấu trúc phụ huynh) được đặt cho tính chất này" + + +msgid "Translation Context" +msgstr "Ngữ Cảnh Phiên Dịch" + + +msgid "Translation context of the property's name" +msgstr "Ngữ cảnh phiên dịch của tên tính chất" + + +msgid "Data type of the property" +msgstr "Kiểu dữ liệu của tính chất" + + +msgid "Enumeration" +msgstr "Liệt Kê" + + +msgid "Pointer" +msgstr "Con Trỏ" + + +msgid "Unit" +msgstr "Đơn Vị" + + +msgid "Type of units for this property" +msgstr "Thể loại đơn vị cho tài sản này" + + msgid "ID Property Group" -msgstr "Nhóm Đặc Tính ID" +msgstr "Nhóm Tính Chất ID" msgid "Group of ID properties" -msgstr "Nhóm của đặc tính ID" +msgstr "Nhóm các tính chất ID (tên)" msgid "Asset Handle" -msgstr "Tay Cầm Tích Sản" +msgstr "Tham Chiếu đến Tài Sản" msgid "Reference to some asset" -msgstr "Tham chiếu đến một tích sản nào" +msgstr "Tham chiếu đến một tài sản nào đó" msgid "File Entry" -msgstr "Nhập Tập Tin" +msgstr "Chỉ Số Tập Tin" msgid "TEMPORARY, DO NOT USE - File data used to refer to the asset" -msgstr "TẠM THỜI, ĐỪNG DÙNG " +msgstr "TẠM THỜI, ĐỪNG SỬ DỤNG - dữ liệu tập tin được sử dụng để tham chiếu đến tài sản" msgid "Case" -msgstr "Hoa/Nhỏ" +msgstr "Kiểu Chữ" msgid "Upper Case" @@ -82355,35 +90430,35 @@ msgstr "Chữ Hoa" msgid "Lower Case" -msgstr "Chư Thường" +msgstr "Chữ Thường" msgid "Title Case" -msgstr "Chữ Tựa" +msgstr "Chữ Hoa Đầu Từ" msgid "Find" -msgstr "Tìm" +msgstr "Lùng Tìm" msgid "Strip Characters" -msgstr "Chữ Đoạn" +msgstr "Lược Bỏ Ký Tự" msgid "Digits" -msgstr "Số Cái" +msgstr "Con Số" msgid "Punctuation" -msgstr "Dấu" +msgstr "Dấu Chấm Câu" msgid "Strip Part" -msgstr "Phần Đoạn" +msgstr "Lược Bỏ Phần" msgid "Find/Replace" -msgstr "Tìm/Thay Thế" +msgstr "Lùng Tìm/Thay Thế" msgid "Replace text in the name" @@ -82395,47 +90470,47 @@ msgstr "Đặt Tên" msgid "Set a new name or prefix/suffix the existing one" -msgstr "Đặt một tên hay kèm đầu/đuôi với tên có sẵn" +msgstr "Đặt một tên mới hoặc đặt tiền tố/hậu tố cho một cái hiện tại" msgid "Strip leading/trailing text from the name" -msgstr "Đoạn văn bản dẫn đường/đi theo từ tên" +msgstr "Tước bỏ các chữ dẫn đầu/nối đuôi khỏi tên" msgid "Change Case" -msgstr "Đổi Hoa/Thường" +msgstr "Đổi Kiểu Chữ" msgid "Change case of each name" -msgstr "Đổi hoa/thường của mỗi tên" +msgstr "Đổi kiểu chữ (Hoa/Thường) cho mỗi tên" msgid "Regular Expression Replace" -msgstr "Biểu Thức Chính Quy Thay Thế" +msgstr "Thay Thế dùng Biểu Thức Chính Quy" msgid "Use regular expression for the replacement text (supporting groups)" -msgstr "Dùng biểu thức chính quy cho thay thế văn bản (được hỗ trợ nhóm)" +msgstr "Sử dụng biểu thức chính quy đối với văn bản thay thế (hỗ trợ nhóm)" msgid "Regular Expression Find" -msgstr "Biểu Thức Chính Quy Tìm" +msgstr "Lùng Tìm dùng Biểu Thức Chính Quy" msgid "Use regular expressions to match text in the 'Find' field" -msgstr "Dùng biểu thức chính quy để tìm văn bản trong hộp 'Tìm'" +msgstr "Sử dụng biểu thức chính quy để so sánh văn bản trong trường 'Lùng Tìm' (Find)" msgid "Form of curves" -msgstr "Hình của đường cong" +msgstr "Hình dạng đường cong" msgid "Rounded Ribbons" -msgstr "Dải Tròn Hóa" +msgstr "Băng Thắt Nơ Tròn" msgid "Render curves as flat ribbons with rounded normals, for fast rendering" -msgstr "Kết xuất đường cong bằng dải bằng phẳng có pháp tuyến vòng tròn hóa, cho kết xuất nhanh hơn" +msgstr "Kết xuất các đường cong như một băng thắt nơ với pháp tuyến tròn, để kết xuất với tốc độ nhanh" msgid "3D Curves" @@ -82443,19 +90518,19 @@ msgstr "Đường Cong 3D" msgid "Render curves as circular 3D geometry, for accurate results when viewing closely" -msgstr "Kết xuất đường cong bằng hình dạng vòng tròn, cho kết qủa chính xác khi nhìn gần" +msgstr "Kết xuất các đường cong như một hình học 3D, hòng đạt được kết quả chính xác khi quan sát tóc ở góc độ gần" msgid "Number of subdivisions used in Cardinal curve intersection (power of 2)" -msgstr "Dùng số lượng phân hóa trong giao cắt của đường cong Cốt Yếu (mũ 2)" +msgstr "Lượng phân hóa sử dụng trong sự giao cắt của đường cong chính tắc (mũ 2) (Cardinal curve intersection)" msgid "CPU" -msgstr "CPU" +msgstr "Central Processing Unit: Bộ Xử Lý Trung Tâm của Máy Tính" msgid "CUDA" -msgstr "CUDA" +msgstr "Compute Unified Device Architecture: Kiến Trúc Thiết Bị Thống Nhất Vi Tính" msgid "OptiX" @@ -82463,7 +90538,7 @@ msgstr "Optix" msgid "HIP" -msgstr "HIP" +msgstr "Heterogeneous-compute Interface for Portability: Giao diện tính toán không đồng nhất cho Tính Di Động" msgid "oneAPI" @@ -82471,11 +90546,11 @@ msgstr "oneAPI" msgid "Cast Shadow" -msgstr "Phát Bóng Tối" +msgstr "Bóng Tối Ngả Xuống" msgid "Light casts shadows" -msgstr "Đèn được phát bóng tối" +msgstr "Ánh sáng sẽ ngả bóng tối" msgid "Shadow Caustics" @@ -82483,55 +90558,109 @@ msgstr "Tụ Quang Bóng Tối" msgid "Generate approximate caustics in shadows of refractive surfaces. Lights, caster and receiver objects must have shadow caustics options set to enable this" -msgstr "Chế tạo tụ quang xấp xỉ trong bóng tối của bề mặt khúc xạ. Đèn, vật thể phát ánh sáng, vật thể nhận ánh sáng phải cài đặt tùy chọn tụ quang bóng tối trước để bật cái này" +msgstr "Sinh tạo tụ quang xấp xỉ trong bóng tối của các bề mặt khúc xạ. Đèn (nguồn sáng), đối tượng phát sáng, ngả bóng, và các đối tượng thu nhận phải bật các tùy chọn về tụ quang bóng tối để cho phép chức năng này hoạt động" msgid "Is Portal" -msgstr "Là Cổng" +msgstr "Là Cổng Ánh Sáng" msgid "Use this area light to guide sampling of the background, note that this will make the light invisible" -msgstr "Dùng đèn diện tích này để hướng dẫn lấy mẫu vật của nền, lưu ý này sẽ ẩn đèn này" +msgstr "Dùng nguồn sáng diện tích này để hướng dẫn quá trình lấy mẫu nền. Lưu ý là cái này sẽ làm cho nguồn sáng trở nên vô hình" msgid "Maximum number of bounces the light will contribute to the render" -msgstr "Số lượng nhồi tối đa thì ánh sáng sẽ góp phần cho kết xuất" +msgstr "Số lượng bật nẩy tối đa mà ánh sáng sẽ đóng góp vào bản kết xuất" msgid "Multiple Importance Sample" -msgstr "Đa Mẫu Vật Sự Quan Trọng" +msgstr "Lấy Mẫu Đa Cân Trọng" msgid "Use multiple importance sampling for the light, reduces noise for area lights and sharp glossy materials" -msgstr "Dùng đa mẫu vật quan trọng cho đèn, được giảm huyên náo cho đèn diện tích và vật liệu bóng loáng" +msgstr "Dùng phương pháp lấy nhiều mẫu theo trọng số cho nguồn sáng. Phương pháp này sẽ giảm nhiễu các nguồn sáng diện tích (area lights) và các nguyên vật liệu có tính bóng loáng" + + +msgctxt "Light" +msgid "Emission Sampling" +msgstr "Lấy Mẫu Vật Phát Xạ" + + +msgid "Sampling strategy for emissive surfaces" +msgstr "Chiến lược lấy mẫu cho các bề mặt phát xạ" + + +msgctxt "Light" +msgid "None" +msgstr "Không Có" + + +msgid "Do not use this surface as a light for sampling" +msgstr "Không sử dụng bề mặt này làm nguồn sáng để lấy mẫu" + + +msgctxt "Light" +msgid "Auto" +msgstr "Tự Động" + + +msgid "Automatically determine if the surface should be treated as a light for sampling, based on estimated emission intensity" +msgstr "Tự động xác định xem bề mặt có nên được coi là nguồn sáng để lấy mẫu hay không, dựa trên cường độ phát xạ ước tính" + + +msgctxt "Light" +msgid "Front" +msgstr "Trước" + + +msgid "Treat only front side of the surface as a light, usually for closed meshes whose interior is not visible" +msgstr "Chỉ coi mặt trước của bề mặt là nguồn sáng, thường dành cho các khung lưới kín không nhìn thấy được nội thất" + + +msgctxt "Light" +msgid "Back" +msgstr "Sau" + + +msgid "Treat only back side of the surface as a light for sampling" +msgstr "Chỉ coi mặt sau của bề mặt là một nguồn sáng để lấy mẫu" + + +msgctxt "Light" +msgid "Front and Back" +msgstr "Trước và Sau" + + +msgid "Treat surface as a light for sampling, emitting from both the front and back side" +msgstr "Coi bề mặt là nguồn sáng để lấy mẫu, phát xạ từ cả mặt trước và mặt sau" msgid "Homogeneous Volume" -msgstr "Thể Tích Đồng Loại" +msgstr "Thể Tích Đồng Nhất" msgid "When using volume rendering, assume volume has the same density everywhere (not using any textures), for faster rendering" -msgstr "Khi dùng kết xuất thể tích, giả sư toàn thể tích có tỉ trọng đều (không dùng chất liệu) cho kết xuất lẹ hơn" +msgstr "Khi sử dụng quá trình kết xuất thể tích, giả định là thể tích có tỷ trọng đồng đều ở khắp nơi (không sử dụng bất cứ chất liệu nào), để kết xuất nhanh hơn" msgid "Volume Interpolation" -msgstr "Suy Nội Thể Tích" +msgstr "Nội Suy Thể Tích" msgid "Interpolation method to use for smoke/fire volumes" -msgstr "Phương pháp suy nội cho thể tích khói/lửa" +msgstr "Phương pháp nội suy để dùng cho những thể tích khói/lửa" msgid "Volume Sampling" -msgstr "Mẫu Vật Thể Tích" +msgstr "Lấy Mẫu Vật cho Thể Tích" msgid "Sampling method to use for volumes" -msgstr "Phương pháp lấy mẫu vật cho thể tích" +msgstr "Phương pháp lấy mẫu vật để dùng cho các thể tích" msgid "Use distance sampling, best for dense volumes with lights far away" -msgstr "Lấy mẫu vật khoảng cách, tốt cho thể tích tỉ trọng cao và nguồn ạnh sáng ở xa" +msgstr "Dùng phương pháp lấy mẫu vật khoảng cách. Tốt nhất cho các thể tích có tỷ trọng cao với nguồn sáng nằm ở xa" msgid "Equiangular" @@ -82539,147 +90668,147 @@ msgstr "Góc Đều" msgid "Use equiangular sampling, best for volumes with low density with light inside or near the volume" -msgstr "Lấy mẫu vật góc đều, tốt cho thể tích tỉ trọng thấp và nguồn ạnh sáng ở trong hay gần thể tích" +msgstr "Sử dụng phương pháp lấy mẫu vật góc đều. Tốt nhất cho các thể tích có tỷ trọng thấp với nguồn sáng nằm bên trong hoặc nằm gần thể tích" msgid "Multiple Importance" -msgstr "Đa Quan Trọng" +msgstr "Đa Cân Trọng" msgid "Combine distance and equi-angular sampling for volumes where neither method is ideal" -msgstr "Lấy mẫu vật khoảng cách và góc đều cho thể tích cả hai phương pháp không tốt" +msgstr "Kết hợp phương pháp lấy mẫu vật khoảng cách và góc đều cho các thể tích, trong khi chẳng phương pháp nào là hoàn mỹ cả" msgid "Step Rate" -msgstr "Tốc Độ Bước" +msgstr "Tần Số Bước" msgid "Scale the distance between volume shader samples when rendering the volume (lower values give more accurate and detailed results, but also increased render time)" -msgstr "Phóng to khoảng cách giữa mẫu bộ tô sắc thể tích khi đang kết xuất thể tích (giá trị càng thấp càng chính xác và chi tiết nhiều hơn nhưng càng chậm hơn)" +msgstr "Đổi tỷ lệ khoảng cách giữa các mẫu vật bộ tô bóng thể tích khi đang kết xuất thể tích (giá trị thấp sẽ cho kết quả chính xác và chi tiết hơn, song thời gian kết xuất sẽ lâu hơn)" msgid "AO Distance" -msgstr "Khoảng Cách Che Khuất Bao Quanh" +msgstr "Khoảng Cách AO" msgid "AO distance used for approximate global illumination (0 means use world setting)" -msgstr "Khoảng cách che khuất bao quanh cho phát sáng toàn cầu xấp xỉ (0 nghĩa dùng cài đặt thế giới)" +msgstr "Khoảng cách AO (THTMT) dành cho quá trình ước tính ánh sáng toàn cầu (0 có nghĩa là sử dụng cài đặt về thế giới)" msgid "Dicing Scale" -msgstr "Tỉ Số Phân Hóa" +msgstr "Tỷ Lệ Phân Chia" msgid "Multiplier for scene dicing rate (located in the Subdivision panel)" -msgstr "Hệ số nhân cho nhịp phân hóa cảnh (ở trong bảng Phân Hóa)" +msgstr "Số nhân cho tần số phân chia cảnh (nằm trong bảng Phân Hóa (Subdivision))" msgid "Cast Shadow Caustics" -msgstr "Phát Tụ Quang Bóng Tối" +msgstr "Phát Tụ Quang trong Bóng Tối" msgid "With refractive materials, generate approximate caustics in shadows of this object. Up to 10 bounces inside this object are taken into account. Lights, caster and receiver objects must have shadow caustics options set to enable this" -msgstr "Cho vật liệu khúc xạ, chế tạo tụ quang xấp xỉ trong bóng tối của vật thể này. Tính tối đa 10 nhồi phía trong vật thể này. Đèn, vật thể phát ánh sáng, vật thể nhận ánh sáng phải cài đặt tùy chọn tụ quang bóng tối trước để bật cái này" +msgstr "Với các nguyên vật liệu khúc xạ thì tạo tụ quang xấp xỉ trong bóng của đối tượng này. Sẽ tính toán đến mức cao nhất 10 lần bật nẩy bên trong đối tượng này. Đèn (nguồn sáng), đối tượng phát sáng, ngả bóng, và các đối tượng thu nhận phải bật các tùy chọn về tụ quang bóng tối để cho phép chức năng này hoạt động" msgid "Receive Shadow Caustics" -msgstr "Nhận Tụ Quang Bóng Tối" +msgstr "Tiếp Nhận Tụ Quang trong Bóng Tối" msgid "Receive approximate caustics from refractive materials in shadows on this object. Lights, caster and receiver objects must have shadow caustics options set to enable this" -msgstr "Nhận tụ quang từ xấp xỉ từ vật liệu khúc xạ trong bóng tối của vật thể này Đèn, vật thể phát ánh sáng, vật thể nhận ánh sáng phải cài đặt tùy chọn tụ quang bóng tối trước để bật cái này" +msgstr "Tiếp nhận các ước tính xấp xỉ về tụ quang từ các nguyên vật liệu khúc xạ trong bóng tối trên đối tượng này. Các đối tượng đèn (nguồn sáng), đối tượng phát sáng, ngả bóng, và vật thu nhận phải bật các tùy chọn về tụ quang bóng tối để cho phép chức năng này hoạt động" msgid "Motion Steps" -msgstr "Bước Chuyển Động" +msgstr "Số Bước Chuyển Động" msgid "Control accuracy of motion blur, more steps gives more memory usage (actual number of steps is 2^(steps - 1))" -msgstr "Cho kiểm soát độ chính xác của mờ hóa chuyển động, bước càng nhiều cần sủ dụng bộ nhớ càng nhiều (số lượng bước thật là 2^(số bước - 1 ))" +msgstr "Khống chế độ chính xác của sự nhòe mờ trong chuyển động. Số bước càng nhiều thì càng sử dụng bộ nhớ nhiều hơn (số bước thực là 2^(số bước - 1) (^ = lũy thừa))" msgid "Shadow Terminator Geometry Offset" -msgstr "Nới Hình Dạng Ranh Giới Bóng Tối" +msgstr "Dịch Chuyển Kết Thúc Bóng Tối Hình Học" msgid "Offset rays from the surface to reduce shadow terminator artifact on low poly geometry. Only affects triangles at grazing angles to light" -msgstr "Nới tia từ bề mặt để giảm vấn đề ranh giới của bóng tối trên hình dạnh ít đa giác. Nó chỉ ảnh hưởng các tam giác có góc thấp với ánh sáng" +msgstr "Dịch chuyển của các tia xạ trên bề mặt để thuyên giảm giả tượng ở điểm kết thúc bóng tối trên hình học có lượng đa giác thấp. Duy tác động đến các hình tam giác ở góc lướt qua (grazing angles) với ánh sáng mà thôi" msgid "Shadow Terminator Shading Offset" -msgstr "Nới Tô Sắc Ranh Giới Bóng Tối" +msgstr "Dịch Chuyển Tô Bóng của Mép Bóng Tối" msgid "Push the shadow terminator towards the light to hide artifacts on low poly geometry" -msgstr "Đẩy ranh giới của bóng tối đến ánh sáng cho giấu lỗi lầm trên hình dạng đa giác thấp" +msgstr "Đẩn phần kết thúc của bóng tối về phía ánh sáng để giấu đi các giả tượng trên hình học có lượng đa giác thấp" msgid "Use Adaptive Subdivision" -msgstr "Dùng Phân Hóa Ứng Phó" +msgstr "Phân Hóa Tùy Ứng" msgid "Use adaptive render time subdivision" -msgstr "Dùng thời gian kết xuất phân hóa ứng phó" +msgstr "Dùng sự phân hóa tùy ứng trong thời gian kết xuất" msgid "Use Camera Cull" -msgstr "Dùng Hủy Diệt Máy Quay Phim" +msgstr "Loại Bỏ trong Máy Quay Phim" msgid "Allow this object and its duplicators to be culled by camera space culling" -msgstr "Cho vật thể này và sao chép của nó bị hùy diệt bằng hủy diệt không gian máy quay phim" +msgstr "Cho phép đối tượng này và các bộ sao chép của nó bị loại trừ bởi quá trình lọc bỏ trong không gian máy quay phim" msgid "Use Deformation Motion" -msgstr "Dùng Méo Hóa Chuyển Động" +msgstr "Biến Dạng Chuyển Động" msgid "Use deformation motion blur for this object" -msgstr "Dùng mờ hóa méo hóa cho vật thể này" +msgstr "Dùng sự làm nhòe mờ chuyển động biến dạng cho đối tượng này" msgid "Use Distance Cull" -msgstr "Dùng Khoảng Hũy Diệt" +msgstr "Loại Bỏ theo Khoảng Cách" msgid "Allow this object and its duplicators to be culled by distance from camera" -msgstr "Cho vật thể này và sao chép của nó bị hùy diệt bằng khoảng cách từ máy quay phim" +msgstr "Cho phép đối tượng này và các máy sao chép của nó bị loại bỏ bởi khoảng cách từ máy quay phim" msgid "Use Motion Blur" -msgstr "Mờ Hóa Chuyển Động" +msgstr "Làm Nhòe Mờ Chuyển Động" msgid "Use motion blur for this object" -msgstr "Dùng mờ hóa cho vật thể này" +msgstr "Sử dụng quá trình làm nhòe mờ chuyển động cho đối tượng này" msgid "Store Denoising Passes" -msgstr "Chứa Lại Vòng Bớt Huyên Náo" +msgstr "Lưu các lượt lọc nhiễu" msgid "Store the denoising feature passes and the noisy image. The passes adapt to the denoiser selected for rendering" -msgstr "Chứa các vòng bớt huyên náo đặc trưng và ảnh có huyên náo. Các vòng ứnh phố với bộ bớt huyên náo được chọn cho kết xuất" +msgstr "Lưu các lượt lọc nhiễu hình thể và hình ảnh bị nhiễu. Các lượt tùy ứng với trình khử nhiễu lựa chọn cho quá trình kết xuất" msgid "Debug Sample Count" -msgstr "Số Lượng Mẫu Cho Sửa Sai Lầm" +msgstr "Điều Tra về Lượng Mẫu Vật" msgid "Number of samples/camera rays per pixel" -msgstr "Số lượng mẫu/tia máy quay phim cho mỗi điểm ảnh" +msgstr "Số mẫu vật/tia xạ của máy quay phim trên mỗi điểm ảnh" msgid "Use Denoising" -msgstr "Dùng Bất Huyên Náo" +msgstr "Sử Dụng Lọc Nhiễu" msgid "Denoise the rendered image" -msgstr "Bất huyên náo trong ảnh kết xuất" +msgstr "Lọc nhiễu hình ảnh được kết xuất" msgid "Pass containing shadows and light which is to be multiplied into backdrop" -msgstr "Vòng chứa bóng tối và ánh sáng cho nhân với cảnh sau" +msgstr "Lượt (kết xuất) có chứa bóng tối và ánh sáng, tức những cái sẽ được nhân lên thành nền sau" msgid "Volume Direct" @@ -82687,7 +90816,7 @@ msgstr "Thể Tích Trực Tiếp" msgid "Deliver direct volumetric scattering pass" -msgstr "Đưa vòng thể tích trực tiếp tán xạ" +msgstr "Thực hiện lượt tán xạ thể tích trực tiếp" msgid "Volume Indirect" @@ -82695,83 +90824,83 @@ msgstr "Thể Tích Gián Tiếp" msgid "Deliver indirect volumetric scattering pass" -msgstr "Đưa vòng thể tích gián tiếp tán xạ" +msgstr "Thực hiện lượt tán xạ thể tích gián tiếp" msgid "Adaptive Min Samples" -msgstr "Mẵu Tối Thiểu Ứng Phó" +msgstr "Lượng Mẫu Vật Tùy Ứng Tối Thiểu" msgid "Minimum AA samples for adaptive sampling, to discover noisy features before stopping sampling. Zero for automatic setting based on noise threshold" -msgstr "Số lượng mẫu tối thiểu chống răng cư cho mẫu ứng phó, cho phát hiện đặc trưng huyên náo trước nghỉ tính mẫu. Đặt = 0 cho cài đặt tự động cơ sở tùy ngưỡng huyên náo" +msgstr "Lượng mẫu vật chống răng cưa (AA: Anti-Aliasing) tối thiểu trong quá trình lấy mẫu vật tùy ứng, hòng phát hiện những nét đặc trưng hình thể bị nhiễu nặng nề, trước khi ngừng lấy mẫu vật. Đặt bằng 0 để tự động sắp đặt dựa trên giới hạn nhiễu" msgid "Adaptive Sampling Threshold" -msgstr "Ngưỡng Mẫu Ứng Phó" +msgstr "Ngưỡng Lấy Mẫu Vật Tùy Ứng" msgid "Noise level step to stop sampling at, lower values reduce noise at the cost of render time. Zero for automatic setting based on number of AA samples" -msgstr "Mức độ bước huyên náo để dừng lại lấy mẫu, giá trị thấp giảm huyên náo nhưng dùng thời gian kết xuất lâu hơn. Đặt = 0 cho cài đặt tự động tùy số lượng mẫu cho chống răng cưa" +msgstr "Thang bậc cho mức nhiễu để ngừng quá trình lấy mẫu tại đó. Giá trị thấp hơn sẽ làm giảm nhiễu tuy sẽ phải chịu cái giá kéo dài thời gian kết xuất. Số 0 để cài đặt một cách tự động dựa trên số lượng mẫu AA (khử nhiễu: Anti-Aliasing)" msgid "AO Bounces" -msgstr "Nhồi Che Khuất Bao Quanh" +msgstr "Sự Bật Nẩy của THTMT" msgid "After this number of light bounces, use approximate global illumination. 0 disables this feature" -msgstr "Sau số lần nhồi ánh sáng này, dùng phát sáng toàn cầu xấp xỉ. Đặt = 0 để tắt" +msgstr "Sau số lần bật nẩy của ánh sáng này, dùng sức chiếu sáng toàn cầu xấp xỉ. Đặt = 0 để tắt" msgid "AO Bounces Render" -msgstr "Kết Xuất Nhồi Che Khuất Bao Quanh" +msgstr "Kết Xuất sự Bật Nẩy của THTMT" msgid "Automatic Scrambling Distance" -msgstr "Khoảng Cách Hốt Hoảng Tự Động" +msgstr "Khoảng Cách Xáo Trộn Tự Động" msgid "Automatically reduce the randomization between pixels to improve GPU rendering performance, at the cost of possible rendering artifacts" -msgstr "Tự động giảm bớt sự ngẫu nhiên giữa điểm ảnh cho tăng hiệu suất kết xuất của GPU, nhưng tăng xác suất có sai lầm kết xuất" +msgstr "Tự động giảm mức ngẫu nhiên giữa các điểm ảnh để cải thiện hiệu suất kết xuất của GPU, song có thể kết xuất giả tượng" msgid "Bake Type" -msgstr "Loại Nướng" +msgstr "Thể Loại Nướng" msgid "Type of pass to bake" -msgstr "Loại vòng để nướng" +msgstr "Loại lượt để nướng" msgid "Filter Glossy" -msgstr "Lọc Bóng Loáng" +msgstr "Thanh Lọc Ánh Bóng Bẩy" msgid "Adaptively blur glossy shaders after blurry bounces, to reduce noise at the cost of accuracy" -msgstr "Ứng phó mờ hóa bộ tô sắc bóng loáng sau nhồi mờ hóa cho giảm huyên náo thay thế độ chính xác" +msgstr "Tùy ứng làm nhòe mờ các bộ tô màu bóng bẩy sau các bật nẩy của nhòe mờ, hòng thuyên giảm nhiễu mặc dù sẽ mất tính chính xác" msgid "Camera Cull Margin" -msgstr "Lề Hủy Diệt Máy Quay Phim" +msgstr "Khoảng Giới Hạn Loại Trừ của Máy Quay Phim" msgid "Margin for the camera space culling" -msgstr "Lề dùng cho hủy diệt không gian máy quay phim" +msgstr "Khoảng giới hạn sử dụng để loại trừ trong không gian máy quay phim" msgid "Reflective Caustics" -msgstr "Tụ Quang Phản Xạ" +msgstr "Tụ Quang của Phản Xạ" msgid "Use reflective caustics, resulting in a brighter image (more noise but added realism)" -msgstr "Dùng tụ quang phản xạ, kết qủa là một ảnh sáng hơn (huyên náo hơn xem thực tế hơn) " +msgstr "Sử dụng tụ quang của phản xạ, để đạt được một hình ảnh sáng hơn (nhiễu sẽ gia tăng, song thực tế hơn)" msgid "Refractive Caustics" -msgstr "Tụ Quang Khúc Xạ" +msgstr "Tụ Quang của Khúc Xạ" msgid "Use refractive caustics, resulting in a brighter image (more noise but added realism)" -msgstr "Dùng tụ quang khúc xạ, kết qủa là một ảnh sáng hơn (huyên náo hơn xem thực tế hơn)" +msgstr "Sử dụng tụ quang của khúc xạ để đạt được một hình ảnh sáng hơn (nhiễu sẽ gia tăng, song thực tế hơn)" msgid "BVH Layout" @@ -82787,27 +90916,27 @@ msgstr "Embree" msgid "BVH Time Steps" -msgstr "Bước Thời Gian BVH" +msgstr "Bước Thời Gian của BVH" msgid "Split BVH primitives by this number of time steps to speed up render time in cost of memory" -msgstr "Chẻ đồ cơ bản cùa BVH bằng số bước thời gian này để tăng tốc độ kết xuất thay thế tiết kiệm bộ nhớ" +msgstr "Tách phân các yếu tố của BVH (Bounding Volume Hierarchy=Cây Phân Cấp Giới Hạn Thể Tích) theo số bước thời gian này để tăng tốc thời gian kết xuất, mặc dầu việc này sẽ tiêu tốn bộ nhớ nhiều hơn" msgid "Viewport BVH Type" -msgstr "Loại BVH Màn Chiếu" +msgstr "Loại Cổng Nhìn cho BVH" msgid "Choose between faster updates, or faster render" -msgstr "Chọn nâng cấp lẹ hơn hay kết xuất lẹ hơn" +msgstr "Chọn một trong hai, cập nhật nhanh hơn, hoặc kết xuất nhanh hơn" msgid "Dynamic BVH" -msgstr "BVH Động Lý" +msgstr "BVH Năng Động" msgid "Objects can be individually updated, at the cost of slower render time" -msgstr "Có thể nâng cấp vật thể riêng nhau nhưng kết xuất chậm hơn" +msgstr "Các đối tượng có được cập nhật riêng biệt, mặc dù kết xuất sẽ chậm hơn" msgid "Static BVH" @@ -82815,15 +90944,15 @@ msgstr "BVH Tĩnh Thái" msgid "Any object modification requires a complete BVH rebuild, but renders faster" -msgstr "Sửa đổi vật thể nào yêu cầu phải xây dựng lại toàn BVH nhưng được kết xuất lẹ hơn" +msgstr "Bất cứ sự sửa đổi đối tượng nào cũng đòi hỏi BVH (Bounding Volume Hierarchy: Cây Phân Cấp Giới Hạn Thể Tích) phải được tái dựng, nhưng sẽ kết xuất nhanh hơn" msgid "Use Compact BVH" -msgstr "Dùng BVH Nhỏ Gọn" +msgstr "Sử Dụng BVH Gọn Nhẹ" msgid "Use compact BVH structure (uses less ram but renders slower)" -msgstr "Dùng cấu trúc BVH nhỏ gọn (nó dùng bộ nhớ ít hơn nhưng kết xuất chậm hơn)" +msgstr "Sử dụng cấu trúc BVH gọn nhẹ (sử dụng bộ nhớ ít hơn nhưng kết xuất chậm hơn)" msgid "AVX2" @@ -82839,51 +90968,51 @@ msgstr "SSE41" msgid "Adaptive Compile" -msgstr "Biên Địch Ứng Phó" +msgstr "Biên Dịch Tùy Ứng" msgid "Use Curves BVH" -msgstr "Dùng BVH Đường Cong" +msgstr "Sử Dụng BVH cho Đường Cong" msgid "Use special type BVH optimized for curves (uses more ram but renders faster)" -msgstr "Dùng BVH loại đặc biệt tối ưu cho đường cong (nó dùng bộ nhớ nhiều hơn nhưng kết xuất nhanh hơn)" +msgstr "Dùng thể loại BVH (Bounding Volume Hierarchy : Cây Phân Cấp Giới Hạn Thể Tích) đặc biệt đã được tối ưu hóa cho các đường cong (sử dụng bộ nhớ nhiều hơn nhưng kết xuất nhanh hơn)" msgid "OptiX Module Debug" -msgstr "Sửa Lỗi Mô Đun Optix" +msgstr "Điều Tra và Gỡ lỗi Mô-Đun OptiX" msgid "Load OptiX module in debug mode: lower logging verbosity level, enable validations, and lower optimization level" -msgstr "Nhập mô đun Optix trong chế độ sửa lỗi: cho giảm mức độ chi tiết, bật xác nhận, và gỉam mức độ tối ưu" +msgstr "Nạp mô-đun OptiX ở chế độ điều tra và gỡ lỗi: mức độ chi tiết ghi nhật ký thấp hơn, cho phép các kiểm tra xác thực, và hạ thấp mức tối ưu hóa" msgid "Use Spatial Splits" -msgstr "Dùng Chẻ Không Gian" +msgstr "Sử Dụng Phân Tách Không Gian" msgid "Use BVH spatial splits: longer builder time, faster render" -msgstr "Dùng chẻ không gian BVH (tầng bậc thể tích bao bì): thời gian xây lâu hơn, thời gian kết xuất nhanh hơn" +msgstr "Sử dụng phân tách không gian BVH (Bounding Volume Hierarchy = phân ranh giới thể tích theo thứ bậc): thời gian dựng sẽ lâu hơn, kết xuất nhanh hơn" msgid "Denoiser" -msgstr "Bộ Bớt Huyên Náo" +msgstr "Bộ Khử Nhiễu" msgid "Denoise the image with the selected denoiser. For denoising the image after rendering" -msgstr "Bớt huyên náo ảnh bằng bộ bớt huyên náo được chọn. Cho bớt huyên náo sau kết xuất" +msgstr "Khử nhiễu hình ảnh với trình khử nhiễu (denoiser) đã chọn. Dành cho quá trình khử nhiễu hình ảnh sau khi kết xuất" msgid "Denoising Input Passes" -msgstr "Vòng Ngõ Ra Bớt Huyên Náo" +msgstr "Các Lượt Khử Nhiễu Cung Cấp" msgid "Passes used by the denoiser to distinguish noise from shader and geometry detail" -msgstr "Các vòng bộ bớt huyên náo được dùng cho phân biệt chi tiết từ bộ tô sác và hình dạng" +msgstr "Các lượt sử dụng bởi trình khử nhiễu để phân định giữa nhiễu và chuyển sắc của bộ tô bóng, cùng các chi tiết của hình học" msgid "Don't use utility passes for denoising" -msgstr "Không dùng vòng phục vụ cho huyên náo" +msgstr "Không sử dụng các lượt tiện ích để khử nhiễu" msgid "Albedo" @@ -82891,7 +91020,7 @@ msgstr "Suất Phản Chiếu" msgid "Use albedo pass for denoising" -msgstr "Dùng vòng suất phản chiếu cho bớt huyên náo" +msgstr "Sử dụng lượt suất phản chiếu để khử nhiễu" msgid "Albedo and Normal" @@ -82899,23 +91028,23 @@ msgstr "Suất Phản Chiếu và Pháp Tuyến" msgid "Use albedo and normal passes for denoising" -msgstr "Dùng vòng suất phản chiếu và pháp tuyến cho bớt huyên náo" +msgstr "Sử dụng các lượt suất phản chiếu và lượt pháp tuyến để khử nhiễu" msgid "Denoising Prefilter" -msgstr "Bớt Huyên Náo Bộ Lọc Trước" +msgstr "Thanh Lọc Tiền Khử Nhiễu" msgid "Prefilter noisy guiding (albedo and normal) passes to improve denoising quality when using OpenImageDenoiser" -msgstr "Vòng hướng dẫn bộ lọc trước (suất phản chiếu và pháp tuyến) cho tiến bộ chất lượng bớt huyên náo" +msgstr "Tiền xử lý lượt nhiễu hướng dẫn (suất phản chiếu và pháp tuyến) trước khi thanh lọc nhằm cải thiện chất lượng khử nhiễu khi sử dụng OpenImageDenoiser (Trình Khử Nhiễu Hình Ảnh Mở)" msgid "Denoise color and guiding passes together. Improves quality when guiding passes are noisy using least amount of extra processing time" -msgstr "Bớt huyên náo màu sắc và hướng dẫn chung. Nó tiến bộ chất lượng khi vòng hướng dẫn có nhiều huyên náo bằng giảm dùng thời gian xử lý thêm" +msgstr "Đồng xử lý các lượt khử nhiễu màu và các lượt hướng dẫn với nhau. Chỉ cải thiện chất lượng khi các lượt hướng dẫn có nhiều tạp nhiễu sử dụng ít thời gian xử lý hơn" msgid "Prefilter noisy guiding passes before denoising color. Improves quality when guiding passes are noisy using extra processing time" -msgstr "Bộ lọc trước vòng hướng dẫn có nhiều huyên náo trước bớt huyên náo màu sắc. Nó tiến bộ chất lượng khi vòng hướng dẫn có nhiều huyên náo sử dụng nhiều thời gian xử lý" +msgstr "Tiền xử lý các lượt nhiễu hướng dẫn trước đã, trước khi khử nhiễu màu. Chỉ cải thiện chất lượng của hình ảnh khi các lượt hướng dẫn có nhiều tạp nhiễu, sử dụng nhiều thời gian xử lý hơn" msgid "Device" @@ -82923,19 +91052,19 @@ msgstr "Thiết Bị" msgid "Device to use for rendering" -msgstr "Dùng thiết bị nào cho kết xuất" +msgstr "Thiết bị dùng để kết xuất" msgid "Use CPU for rendering" -msgstr "Kết xuất bằng CPU (Bộ Xử Lý)" +msgstr "Kết xuất bằng Bộ Xử Lý" msgid "GPU Compute" -msgstr "Kết Xuất Bằng GPU (Bộ Xử Lý Đồ Họa)" +msgstr "Tính Toán bằng GPU" msgid "Use GPU compute device for rendering, configured in the system tab in the user preferences" -msgstr "Dùng thiết bị tính GPU khi kết xuất, được cầu hình trong nhãn hệ thống trong tùy chọn người dùng" +msgstr "Dùng thiết bị tính toán GPU (Graphic Processing Unit : Bộ Xử Lý Đồ Họa) khi kết xuất, được cầu hình trong bảng hệ thống của cài đặt sở thích của người dùng" msgid "Dicing Camera" @@ -82943,219 +91072,295 @@ msgstr "Máy Quay Phim Phân Hóa" msgid "Camera to use as reference point when subdividing geometry, useful to avoid crawling artifacts in animations when the scene camera is moving" -msgstr "Máy quay phim để dùng khi phân hóa hình dạng, giúp tránh hiệu ứng cuộn trong hoạt hình khi máy quay phim cảnh đang di chuyển" +msgstr "Máy quay phim dùng để làm điểm đối chiếu khi phân chia hình học, có tác dụng để tránh các giả tượng truyền lan trong các đoạn hoạt họa khi máy quay phim dùng quay cảnh chuyển động" msgid "Dicing Rate" -msgstr "Nhịp Phân Hóa" +msgstr "Tần Số Phân Hóa" msgid "Size of a micropolygon in pixels" -msgstr "Kích thước (điểm ảnh) của đa giác vi mô" +msgstr "Kích thước của vi đa giác (điểm ảnh)" msgid "Diffuse Bounces" -msgstr "Nhồi Tán Xạ" +msgstr "Lượng Bật Nẩy của Khuếch Tán" msgid "Maximum number of diffuse reflection bounces, bounded by total maximum" -msgstr "Số lượng nhồi tán xạ tối đa, giới hạn là nhồi tối đa" +msgstr "Lượng bật nẩy tối đa của khuếch tán, giới hạn bởi mức tối đa tổng thể" msgid "Direct Light Sampling" -msgstr "Mẫu Ánh Sáng Trực Tiếp" +msgstr "Lấy Mẫu Ánh Sáng Trực Tiếp" msgid "The type of strategy used for sampling direct light contributions" -msgstr "Loại chiến thuật sử dụng cho góp mẫu ánh sáng trực tiếp" +msgstr "Thể loại chiến lược sử dụng để lấy mẫu sự đóng góp ánh sáng trực tiếp" msgid "Multiple Importance Sampling" -msgstr "Đa Mẫu Vật Tùy Sự Quan Trọng" +msgstr "Lấy Mẫu Đa Cân Trọng" msgid "Multiple importance sampling is used to combine direct light contributions from next-event estimation and forward path tracing" -msgstr "Đa mẫu vật tùy sự quan trọng được sử dụng cho gồm góp ánh sánh trực tiếp và kết xuất phía trước" +msgstr "Lấy nhiều Mẫu theo Trọng Số được sử dụng để kết hợp các đóng góp của ánh sáng trực tiếp từ ước tính sự kiện tiếp theo và dò đường dẫn về phía trước" msgid "Forward Path Tracing" -msgstr "Kết Xuất Đường Phía Trước" +msgstr "Dò Đường Dẫn về Phía Trước" msgid "Direct light contributions are only sampled using forward path tracing" -msgstr "Chỉ góp mẫu ánh sáng trực tiếp sử dụng kết xuất đường phía trước" +msgstr "Những đóng góp của ánh sáng trực tiếp chỉ được lấy mẫu bằng cách sử dụng phương pháp dò đường dẫn về phía trước" msgid "Next-Event Estimation" -msgstr "Dự Đoán Sự Kiện Tiếp" +msgstr "Ước Tính Sự Kiện Tiếp Theo" msgid "Direct light contributions are only sampled using next-event estimation" -msgstr "Chỉ góp mẫu ánh sáng trực tiếp sử dụng dự đoán sự kiến tiếp" +msgstr "Các đóng góp ánh sáng trực tiếp chỉ được lấy mẫu bằng cách sử dụng ước tính sự kiện tiếp theo mà thôi" msgid "Cull Distance" -msgstr "Khoảng Cách Hủy Diệt" +msgstr "Khoảng Cách Loại Bỏ" msgid "Cull objects which are further away from camera than this distance" -msgstr "Hủy diệt vật thể xa hơn cách này từ máy quay phim" +msgstr "Loại bỏ các đối tượng nằm xa hơn khoảng cách này kể từ máy quay phim" msgid "Fast GI Method" -msgstr "Phương Pháp GI Nhanh" +msgstr "Phương pháp GI nhanh" msgid "Fast GI approximation method" -msgstr "Phương pháp xấp xỉ GI nhanh" +msgstr "Phương pháp ước tính GI nhanh" msgid "Replace global illumination with ambient occlusion after a specified number of bounces" -msgstr "Thay thế cho ánh sáng toàn cầu bằng che khuất bao quanh sao một số lượng nhồi được xác định" +msgstr "Thay thế ánh sáng toàn cầu bằng tính hấp thụ quang xạ môi trường sau một số lần bật nảy chỉ định nào đó" msgid "Add ambient occlusion to diffuse surfaces" -msgstr "Thêm che khuất bao quanh với bề mặt tán xạ" +msgstr "Thêm tính hấp thụ quang xạ môi trường (THTQXMT) vào các bề mặt khuếch tán" msgid "Feature Set" -msgstr "Tập Tính Năng" +msgstr "Bộ Chức Năng" msgid "Feature set to use for rendering" -msgstr "Dùng tập tính năng nào khi kết xuất" +msgstr "Sử dụng bộ chức năng nào khi kết xuất" msgid "Supported" -msgstr "Được Hỗ Trợ" +msgstr "Hỗ Trợ" msgid "Only use finished and supported features" -msgstr "Chỉ dùng tính năng hoàn thành và hỗ trợ" +msgstr "Chỉ sử dụng các chức năng đã hoàn chỉnh và được hỗ trợ" msgid "Use experimental and incomplete features that might be broken or change in the future" -msgstr "Dùng tính năng thí nghiệm và chưa hoàn thành mà có lẽ bị hư hay sẽ đổi trong tương lại" +msgstr "Sử dụng các chức năng thử nghiệm và chưa hoàn chỉnh có thể sẽ bị hư hỏng hoặc thay đổi trong tương lai" msgid "Image brightness scale" -msgstr "Giai điệu độ sáng ảnh" +msgstr "Tỉ lệ độ sáng của hình ảnh" msgid "Transparent Glass" -msgstr "Kiến Trong Suốt" +msgstr "Kính Trong Suốt" msgid "Render transmissive surfaces as transparent, for compositing glass over another background" -msgstr "Kết xuất trong suốt các mặt truyền ánh sáng, để ghép kiến trên một nền khác" +msgstr "Kết xuất các bề mặt có khả năng truyền xạ như là trong suốt, để tổng hợp mặt kính trên một nền khác" msgid "Transparent Roughness Threshold" -msgstr "Ngưỡng Độ Nhám Trong Suốt" +msgstr "Giới Hạn của Độ Ráp Trong Suốt" msgid "For transparent transmission, keep surfaces with roughness above the threshold opaque" -msgstr "Cho truyền ánh sáng trong suốt, kết xuất đục các mặt có độ nhám cao hơn ngưỡng" +msgstr "Dành cho sự truyền xạ trong suốt, duy trì độ đục của các bề mặt có độ ráp cao hơn giá trị giới hạn" msgid "Pixel filter width" -msgstr "Bề rộng bộ lọc (điểm ảnh)" +msgstr "Chiều rộng bộ lọc điểm ảnh" msgid "Glossy Bounces" -msgstr "Nhồi Bóng Loáng" +msgstr "Lượng Bật Nẩy của Ánh Bóng Bẩy" msgid "Maximum number of glossy reflection bounces, bounded by total maximum" -msgstr "Số lượng nhồi phản xạ bóng loáng tối đa, giới hạn là nhồi tổng tối đa" +msgstr "Lượng bật nẩy tối đa của ánh bóng bẩy phản quang, giới hạn bởi mức tối đa tổng thể" + + +msgid "Directional Sampling Type" +msgstr "Thể Loại Lấy Mẫu Định Hướng" + + +msgid "Type of the directional sampling used for guiding" +msgstr "Thể loại lấy mẫu định hướng được sử dụng để hướng dẫn" + + +msgid "Diffuse Product MIS" +msgstr "Tích Khuếch Tán Lấy Mẫu Đa Cân Trọng" + + +msgid "Guided diffuse BSDF component based on the incoming light distribution and the cosine product (closed form product)" +msgstr "Thành phần BSDF khuếch tán có hướng dẫn dựa trên sự phân bố ánh sáng đưa vào và tích cosine (tích dạng đóng kín)" + + +msgid "Re-sampled Importance Sampling" +msgstr "Lấy Mẫu Vật Cân Trọng Tái Tác" + + +msgid "Perform RIS sampling to guided based on the product of the incoming light distribution and the BSDF" +msgstr "Thực hiện lấy mẫu RIS theo hướng dẫn dựa trên tích của sự phân bổ ánh sáng đưa vào và BSDF" + + +msgid "Roughness-based" +msgstr "Dựa Trên Độ Nhám" + + +msgid "Adjust the guiding probability based on the roughness of the material components" +msgstr "Điều chỉnh xác suất dẫn hướng dựa trên độ nhám của các thành phần nguyên vật liệu" + + +msgid "Guiding Distribution Type" +msgstr "Thể Loại Phân Bổ Hướng Dẫn" + + +msgid "Type of representation for the guiding distribution" +msgstr "Thể loại đại diện phân bổ hướng dẫn" + + +msgid "Parallax-Aware VMM" +msgstr "VMM Cảnh Tỉnh Thị Sai" + + +msgid "Use Parallax-aware von Mises-Fisher models as directional distribution" +msgstr "Sử dụng các mô hình von Mises-Fisher cảnh tỉnh thị sai làm phân bổ hữu hướng" + + +msgid "Directional Quad Tree" +msgstr "Cây Tứ Giác Hữu Hướng" + + +msgid "Use Directional Quad Trees as directional distribution" +msgstr "Sử dụng các Cây Tứ Giác Hữu Hướng làm phân phối hữu hướng" + + +msgid "Use von Mises-Fisher models as directional distribution" +msgstr "Sử dụng các mô hình của von Mises-Fisher làm phân phối hữu hướng (VMM: von Mises–Fisher Mixture Model, Richard von Mises và Ronald Fisher)" + + +msgid "Guiding Roughness Threshold" +msgstr "Ngưỡng Độ Nhám Hướng Dẫn" + + +msgid "The minimal roughness value of a material to apply guiding" +msgstr "Giá trị độ nhám tối thiểu của nguyên vật liệu để áp dụng hướng dẫn" + + +msgid "Training Samples" +msgstr "Số Mẫu Huấn Luyện" + + +msgid "The maximum number of samples used for training path guiding. Higher samples lead to more accurate guiding, however may also unnecessarily slow down rendering once guiding is accurate enough. A value of 0 will continue training until the last sample" +msgstr "Số mẫu vật tối đa sử dụng để huấn luyện hướng dẫn đường đi. Số mẫu vật cao hơn dẫn đến hướng dẫn chính xác hơn, song cũng có thể làm chậm quá trình kết xuất một cách không cần thiết một khi hướng dẫn đã đủ chính xác. Giá trị 0 sẽ tiếp tục huấn luyện cho đến mẫu vật cuối cùng" msgid "Light Sampling Threshold" -msgstr "Ngưỡng Mẫu Vật Ánh Sáng" +msgstr "Giới Hạn Mẫu Vật Ánh Sáng" msgid "Probabilistically terminate light samples when the light contribution is below this threshold (more noise but faster rendering). Zero disables the test and never ignores lights" -msgstr "Dùng xác suất để hủy mẫu vật đèn khi mẫu vật góp ánh sáng dưới ngưỡng này (huyên náo nhiều hơn nhưng nhanh hơn). Đặt = 0 để tắt kiểm trà này và không quan tâm đèn" +msgstr "Ngừng quá trình lấy mẫu vật ánh sáng theo xác suất ước tính khi sự đóng góp của ánh sáng nằm dưới giới hạn này (nhiễu hơn nhưng kết xuất nhanh hơn). Giá trị bằng 0 thì sẽ không kiểm tra và không bao giờ bỏ qua ánh sáng cả" msgid "Total maximum number of bounces" -msgstr "Số lượng nhồi tối đa" +msgstr "Tổng lượng bật nẩy tối đa" msgid "Max Subdivisions" -msgstr "Phân Hóa Tối Đa" +msgstr "Độ Phân Chia Tối Đa" msgid "Stop subdividing when this level is reached even if the dice rate would produce finer tessellation" -msgstr "Nghỉ phân hóa khi được gặp mức này, mặc dù kết qủa tốc độ phân hóa sẽ làm phân hóa nhiến hơn" +msgstr "Ngừng phân chia khi đạt đến mức này, ngay cả khi tần số phân hóa sẽ cho mức phân hóa tinh tế hơn đi nữa" msgid "Min Light Bounces" -msgstr "Nhồi Ánh Sáng Tối Thiểu" +msgstr "Lượng Bật Nẩy Tối Thiểu của Ánh Sáng" msgid "Minimum number of light bounces. Setting this higher reduces noise in the first bounces, but can also be less efficient for more complex geometry like curves and volumes" -msgstr "Số lượng nhồi ánh sáng tối thiểu. Đặt giá trị cao hơn để giảm huyên náo trong các nhồi đầu, nhưng có thể mất hiệu suất cho hình dạng phức tạp như đường cong và thể tích" +msgstr "Số lần bật nẩy tối thiểu của ánh sáng. Đặt giá trị này cao sẽ giúp thuyên giảm lượng nhiễu trong những lần bật nẩy đầu tiên, song đối với những hình học phức tạp, như các đường cong và thể tích, nó có thể kém hiệu quả" msgid "Min Transparent Bounces" -msgstr "Nhồi Trong Suốt Tối Thiểu" +msgstr "Lượng Bật Nẩy Tối Thiểu của Tia Trong Suốt" msgid "Minimum number of transparent bounces. Setting this higher reduces noise in the first bounces, but can also be less efficient for more complex geometry like curves and volumes" -msgstr "Số lượng nhồi trong suốt tối thiểu. Đặt giá trị này cao hơn để giảm huyên náo trong các nhồi đầu, nhưng có thể mất hiệu suất cho hình dạng phức tạp hơn như đường cong và thể tích" +msgstr "Số lần bật nẩy tối thiểu của tia trong suốt. Đặt giá trị này cao sẽ giúp thuyên giảm lượng nhiễu trong những lần bật nẩy đầu tiên, song đối với những hình học phức tạp, như các đường cong và thể tích, thì nó có thể kém hiệu quả" msgid "Motion Blur Position" -msgstr "Vị Trí Mờ Hóa Di Chuyển" +msgstr "Vị Trí Làm Nhòe Mờ Chuyển Động" msgid "Offset for the shutter's time interval, allows to change the motion blur trails" -msgstr "Dịch cho giai đoạn trập, để đổi mờ hóa chuyển động" +msgstr "Độ dịch chuyển trong thời khoảng của cửa chập, cho phép thay đổi chuyển động đuôi quét nhòe mờ" msgid "Start on Frame" -msgstr "Bắt Đầu tại Bức Ảnh" +msgstr "Bắt Đầu tại Khung Hình" msgid "The shutter opens at the current frame" -msgstr "Trập mở tại bức ảnh hiện tại" +msgstr "Cửa chập mở ra tại khung hình hiện tại" msgid "Center on Frame" -msgstr "Ngay Bức Ảnh" +msgstr "Tập Trung vào Khung Hình" msgid "The shutter is open during the current frame" -msgstr "Mở trập cho bức ảnh hiện tại" +msgstr "Cửa chập mở trong lúc nằm tại khung hình hiện tại" msgid "End on Frame" -msgstr "Kết Thúc tại Bức Ảnh" +msgstr "Kết Thúc tại Khung Hình" msgid "The shutter closes at the current frame" -msgstr "Đóng trập tại bức ảnh hiện tại" +msgstr "Cửa chập đóng lại tại khung hình hiện tại" msgid "Offscreen Dicing Scale" -msgstr "Phóng To Phân Hóa Cho Ngoài Màn" +msgstr "Tần Số Phân Hóa Ngoài Màn Hình" msgid "Multiplier for dicing rate of geometry outside of the camera view. The dicing rate of objects is gradually increased the further they are outside the camera view. Lower values provide higher quality reflections and shadows for off screen objects, while higher values use less memory" -msgstr "Tỉ số cho phân hóa hình dạng ở ngoài tấm nhìn máy quay phim. Lượng phân hóa càng tăng càng xa từ tấm nhìn của máy quay phim. Giá trị nhỏ tăng chất lượng phản xạ và bóng tối cho vật thể ở ngoài màn, nhưng giá trị cao tiết kiệm bộ nhớ" +msgstr "Số nhân dùng làm tần số phân hóa hình học ngoại biên góc nhìn của máy quay phim. Tần Số Phân Hóa của các đối tượng được tăng dần lên tùy khoảng cách xa của chúng trong góc nhìn của máy quay phim. Các giá trị thấp sẽ cho chất lượng phản quang và bóng tối của các đối tượng nằm ngoài màn hình cao hơn, song các giá trị cao hơn sử dụng ít bộ nhớ hơn" msgid "Pixel filter type" -msgstr "Loại bộ lọc điểm ảnh" +msgstr "Thể loại bộ lọc điểm ảnh" msgid "Box filter" -msgstr "Bộ lọc hộp" +msgstr "Bộ lọc hình hộp" msgid "Gaussian filter" -msgstr "Bộ lọc Gauss" +msgstr "Bộ lọc Gaus" msgid "Blackman-Harris" @@ -83167,135 +91372,163 @@ msgstr "Bộ lọc Blackman-Harris" msgid "Minimum AA samples for adaptive sampling, to discover noisy features before stopping sampling. Zero for automatic setting based on noise threshold, for viewport renders" -msgstr "Số lượng mẫu tối thiểu cho mẫu ứng phó, cho phát hiện đặc trưng có huyên náo trước nghỉ tính mẫu. Đặt = 0 cho cài đặt tự động tùy ngưỡng huyên náo, cho màn chiếu" +msgstr "Lượng mẫu vật khử răng cưa (AA: Anti-Aliasing) tối thiểu cho quá trình lấy mẫu vật tùy ứng, nhằm phát hiện những nét đặc trưng của hình thể bị nhiễu tạp, trước khi ngừng lấy mẫu vật. Đặt bằng 0 để tự động sắp đặt dựa trên giới hạn nhiễu. Dành cho các kết xuất cổng nhìn" msgid "Noise level step to stop sampling at, lower values reduce noise at the cost of render time. Zero for automatic setting based on number of AA samples, for viewport renders" -msgstr "Mức độ bước huyên náo để dừng lại, giá trị thấp giảm huyên náo nhưng dùng thời gian kết xuất lâu hơn. Đặt = 0 cho cài đặt tự động tùy số lượng mẫu chống răng cưa, cho màn chiếu" +msgstr "Phân bậc mức nhiễu để ngừng quá trình lấy mẫu. Giá trị thấp hơn sẽ thuyên giảm nhiễu, song thời gian kết xuất sẽ dài hơn. Đặt bằng 0 để tự động sắp đặt dựa trên lượng mẫu vật chống răng cưa. Dành cho các kết xuất cổng nhìn" msgid "Viewport Denoiser" -msgstr "Bộ Bớt Huyên Nào Màn Chiếu" +msgstr "Khử Nhiễu Cổng Nhìn" msgid "Denoise the image after each preview update with the selected denoiser" -msgstr "Bớt huyên náo ảnh sau mỗi khi nâng cấp dự khán bằng bộ bớt huyên náo được chọn" +msgstr "Khử nhiễu hình ảnh sau mỗi lần cập nhật xem trước dùng máy khử nhiễu đã chọn" msgid "Viewport Denoising Input Passes" -msgstr "Vòng Ngõ Vào Bớt Huyên Nào Hóa Màn Chiếu" +msgstr "Các Lượt Khử Nhiễu Cổng Nhìn Cung Cấp" msgid "Viewport Denoising Prefilter" -msgstr "Bộ Lọc Trước Bớt Huyên Nào Hóa Màn Chiếu" +msgstr "Thanh Lọc Tiền Khử Nhiễu Cổng Nhìn" msgid "Start Denoising" -msgstr "Bắt Đầu Bớt Huyên Náo" +msgstr "Khởi Đầu Khử Nhiễu" msgid "Sample to start denoising the preview at" -msgstr "Mẫu cho bắt đầu bất huyên náo của dự khán" +msgstr "Mức mẫu vật khởi đầu khử nhiễu bản xem trước" msgid "Viewport Dicing Rate" -msgstr "Tốc Độ Phân Hóa Màn Chiếu" +msgstr "Tần Số Phân Hóa trong Cổng Nhìn" msgid "Size of a micropolygon in pixels during preview render" -msgstr "Kích thước (điểm ảnh) của một đa giác vi mô trong khi kết xuất dự khán" +msgstr "Kích thước của một vi đa giác trong đơn vị điểm ảnh trong khi xem trước kết xuất" msgid "Pause Preview" -msgstr "Tạm Đừng Dự Khán" +msgstr "Ngưng Xem Trước" msgid "Pause all viewport preview renders" -msgstr "Tạm dừng lại kết xuất dự khán trong hết màn chiếu" +msgstr "Tạm dừng toàn bộ các kết xuất xem trước trong cổng nhìn" msgid "Viewport Samples" -msgstr "Mẫu Vật Màn Chiếu" +msgstr "Lượng Mẫu Vật trong Cổng Nhìn" msgid "Number of samples to render in the viewport, unlimited if 0" -msgstr "Kết xuất số lượng mẫu vật trong màn chiếu, vô hạn nếu = 0" +msgstr "Lượng mẫu vật để kết xuất trong cổng nhìn, vô hạn nếu = 0" msgid "Scrambling Distance viewport" -msgstr "Màn chiếu Khoảng Cách Hốt Hoảng" +msgstr "Khoảng Cách Xáo Trộn Cổng Nhìn" msgid "Uses the Scrambling Distance value for the viewport. Faster but may flicker" -msgstr "Dùng giá trị Khoảng Cách Hốt Hoảng cho màn chiếu. Nhanh hơn nhưng có thể chớp" +msgstr "Sử dụng giá trị Khoảng Cách Xáo Trộn cho cổng nhìn. Nhanh hơn nhưng có thể gây nhấp nháy" msgid "Rolling Shutter Duration" -msgstr "Giai Đoạn Lăn Trập" +msgstr "Thời Lượng của Cửa Chập Quét Mành" msgid "Scanline \"exposure\" time for the rolling shutter effect" -msgstr "Thời gian \"hứng\" quét dòng cho hiệu ứng lăn trập" +msgstr "Thời gian \"phơi sáng\" của dòng quét trong hiệu ứng cửa chập quét mành cuộn (rolling shutter)" msgid "Shutter Type" -msgstr "Loại Trập" +msgstr "Loại Cửa Chập" msgid "Type of rolling shutter effect matching CMOS-based cameras" -msgstr "Loại hiệu ứng trập lăn giống máy quay phim cơ sở CMOS" +msgstr "Thể loại hiệu ứng cửa chập quét mành cuộn (rolling shutter) giống như máy quay phim dùng CMOS" msgid "No rolling shutter effect used" -msgstr "Không dùng hiệu ứng lăn trập" +msgstr "Không dùng hiệu ứng cửa chập quét mành cuộn (rolling shutter)" msgid "Sensor is being scanned from top to bottom" -msgstr "Quét cảm biến từ trên đến dưới" +msgstr "Rà quét bộ cảm biến từ trên xuống dưới" msgid "If non-zero, the maximum value for a direct sample, higher values will be scaled down to avoid too much noise and slow convergence at the cost of accuracy" -msgstr "Nếu ≠ 0, giá trị là cực đại cho mẫu vật trực tiếp, giá trị cao hơn sẽ bị phóng nhỏ lại cho tránh qúa nhiều huyên náo và tính hội tụ chậm và không chính xác" +msgstr "Nếu khác 0 thì là giá trị tối đa cho một mẫu vật trực tiếp, những giá trị cao hơn sẽ được thu nhỏ lại để tránh quá nhiều nhiễu và trì trệ quá trình đồng quy, mặc dù sẽ mất tính chính xác" msgid "If non-zero, the maximum value for an indirect sample, higher values will be scaled down to avoid too much noise and slow convergence at the cost of accuracy" -msgstr "Nếu ≠ 0, giá trị là cực đại cho mẫu vật gián tiếp, giá trị cao hơn sẽ bị phóng nhỏ lại cho tránh qúa nhiều huyên náo và tính hội tụ chậm và không chính xác" +msgstr "Nếu khác 0 thì là giá trị tối đa cho một mẫu vật gián tiếp, những giá trị cao hơn sẽ được thu nhỏ lại để tránh quá nhiều nhiễu và trì trệ quá trình đồng quy, mặc dù sẽ mất tính chính xác" msgid "Sample Offset" -msgstr "Nới Mẫu" +msgstr "Lượng Mẫu Vật Xê Dịch" msgid "Number of samples to skip when starting render" -msgstr "Số lượng mẫu để bỏ qua khi bắt đầu kết xuất" +msgstr "Số mẫu vật bỏ qua khi khởi động kết xuất" msgid "Number of samples to render for each pixel" -msgstr "Kết xuất sộ lượng mẫu vật cho mỗi điểm ảnh" +msgstr "Số mẫu vật để kết xuất cho mỗi điểm ảnh" msgid "Sampling Pattern" -msgstr "Cấu Hình Mẫu Vật" +msgstr "Mô Hình Mẫu Vật" + + +msgid "Random sampling pattern used by the integrator" +msgstr "Mô hình mẫu vật ngẫu nhiên mà bộ tích phân sử dụng" + + +msgid "Use on-the-fly computed Owen-scrambled Sobol for random sampling" +msgstr "Sử dụng tính toán Sobol dùng xáo trộn-Owen trực tiếp, trong khi máy đang chạy, để lấy mẫu ngẫu nhiên" + + +msgid "Tabulated Sobol" +msgstr "Bảng Sobol" + + +msgid "Use pre-computed tables of Owen-scrambled Sobol for random sampling" +msgstr "Sử dụng các bảng Sobol xáo trộn-Owen tính toán trước để lấy mẫu ngẫu nhiên" msgid "Scrambling Distance" -msgstr "Khoảng Cách Hốt Hoảng" +msgstr "Khoảng Cách Xáo Trộn" msgid "Reduce randomization between pixels to improve GPU rendering performance, at the cost of possible rendering artifacts if set too low" -msgstr "Giảm bớt sự ngẫu nhiên giữa điểm ảnh cho tăng hiệu suất kết xuất của GPU, nhưng tăng xác suất có sai lầm kết xuất nếu đặt nó qúa thấp" +msgstr "Giảm mức ngẫu nhiên hóa giữa các điểm ảnh để cải thiện hiệu suất kết xuất GPU, song có khả năng kết xuất ra giả tượng nếu đặt quá thấp" msgid "Seed value for integrator to get different noise patterns" -msgstr "Số hạt cho bộ tích phân được gương mẫu huyên náo khác" +msgstr "Giá trị hạt cho bộ tích phân kiết tạo các mẫu hình nhiễu khác nhau" + + +msgid "Use Open Shading Language" +msgstr "Sử Dụng Ngôn Ngữ Tô Bóng Mở" + + +msgid "Surface Guiding Probability" +msgstr "Xác Suất Hướng Dẫn Bề Mặt" + + +msgid "The probability of guiding a direction on a surface" +msgstr "Xác suất hướng dẫn trên một bề mặt" msgid "Viewport Texture Limit" -msgstr "Hạn Chế Chất Liệu Màn Chiếu" +msgstr "Giới Hạn Chất Liệu trong Cổng Nhìn" msgid "Limit texture size used by viewport rendering" -msgstr "Hạn chế kích thước chất liệu màn chiếu được sử dụng" +msgstr "Hạn chế kích thước chất liệu sử dụng bởi quá trình kết xuất cổng nhìn" msgid "No Limit" @@ -83307,31 +91540,31 @@ msgstr "Không hạn chế kích thước chất liệu" msgid "Limit texture size to 128 pixels" -msgstr "Hạn chế kích thước chất liệu đến 128 điểm ảnh" +msgstr "Hạn chế kích thước chất liệu là 128 điểm ảnh" msgid "Limit texture size to 256 pixels" -msgstr "Hạn chế kích thước chất liệu đến 256 điểm ảnh" +msgstr "Hạn chế kích thước chất liệu là 256 điểm ảnh" msgid "Limit texture size to 512 pixels" -msgstr "Hạn chế kích thước chất liệu đến 512 điểm ảnh" +msgstr "Hạn chế kích thước chất liệu là 512 điểm ảnh" msgid "Limit texture size to 1024 pixels" -msgstr "Hạn chế kích thước chất liệu đến 1024 điểm ảnh" +msgstr "Hạn chế kích thước chất liệu là 1024 điểm ảnh" msgid "Limit texture size to 2048 pixels" -msgstr "Hạn chế kích thước chất liệu đến 2048 điểm ảnh" +msgstr "Hạn chế kích thước chất liệu là 2048 điểm ảnh" msgid "Limit texture size to 4096 pixels" -msgstr "Hạn chế kích thước chất liệu đến 4096 điểm ảnh" +msgstr "Hạn chế kích thước chất liệu là 4096 điểm ảnh" msgid "Limit texture size to 8192 pixels" -msgstr "Hạn chế kích thước chất liệu đến 8192 điểm ảnh" +msgstr "Hạn chế kích thước chất liệu là 8192 điểm ảnh" msgid "Render Texture Limit" @@ -83339,427 +91572,519 @@ msgstr "Hạn Chế Chất Liệu Kết Xuất" msgid "Limit texture size used by final rendering" -msgstr "Hạn chế kích thước chất liệu được dùng khi kết xuất cuối cùng" +msgstr "Hạn chế kích thước chất liệu sử dụng trong quá trình kết xuất cuối cùng" msgid "Tile Size" -msgstr "Kích Cỡ Ô" +msgstr "Kích Thước Ô" + + +msgid "Limit the render time (excluding synchronization time). Zero disables the limit" +msgstr "Giới hạn thời gian kết xuất (ngoại trừ thời gian đồng bộ hóa). Đặt bằng 0 để tắt giới hạn đi" msgid "Transmission Bounces" -msgstr "Nhồi Truyền" +msgstr "Lượng Bật Nẩy của Tia Truyền Xạ" msgid "Maximum number of transmission bounces, bounded by total maximum" -msgstr "Số lượng nhồi truyền tối đa, giới hạn là nhồi tối đa" +msgstr "Lượng bật nẩy tối đa của tia truyền xạ, giới hạn bởi tổng tối đa" msgid "Transparent Max Bounces" -msgstr "Nhồi Trong Suốt Tối Đa" +msgstr "Lượng Bật Nẩy Tối Đa của Tia Trong Suốt" + + +msgid "Maximum number of transparent bounces. This is independent of maximum number of other bounces" +msgstr "Số lần bật nẩy tối đa của tia trong suốt. Số này không phụ thuộc vào số lần bật nẩy tối đa khác" msgid "Use Adaptive Sampling" -msgstr "Dùng Mẫu Ứng Phó" +msgstr "Sử Dụng Lấy Mẫu Vật Tùy Ứng" msgid "Automatically reduce the number of samples per pixel based on estimated noise level" -msgstr "Tự động giảm số lượng mẫu vật cho mỗi điểm ảnh tùy mức huyên náo đã dự đoán" +msgstr "Tự động giảm lượng mẫu vật mỗi điểm ảnh dựa trên mức nhiễu ước tính" msgid "Use Animated Seed" -msgstr "Dùng Số Hạt Hoạt Động" +msgstr "Dùng Giá Trị Hạt Biến Động" msgid "Use different seed values (and hence noise patterns) at different frames" -msgstr "Dùng giá trị hạt khác nhau (và cấu hình huyên náo) mỗi bức ảnh" +msgstr "Dùng các giá trị mầm khác nhau (và do đó đổi các mô hình nhiễu) cho các khung hình khác nhau" msgid "Use Tiling" -msgstr "Dùng Ô" +msgstr "Sử Dụng Phân Ô" msgid "Render high resolution images in tiles to reduce memory usage, using the specified tile size. Tiles are cached to disk while rendering to save memory" -msgstr "Kết xuất ảnh có độ phân giải cao bằng ô cho giảm sử dụng bộ nhớ, dùng cỡ ô được xác định. Các ô được chứa trên đĩa khi kết xuất cho tiết kiệm bộ nhớ" +msgstr "Kết xuất các hình ảnh có độ phân giải cao, trong từng ô, để giảm mức sử dụng bộ nhớ, dùng kích thước ô chỉ định. Các ô sẽ được lưu bộ đệm nhớ ra đĩa trong quá trình kết xuất, để tiết kiệm bộ nhớ" msgid "Allow objects to be culled based on the camera frustum" -msgstr "Cho vật thể bị hủy diệt tùy hình cụt của máy quay phim" +msgstr "Cho phép các đối tượng được loại trừ ra khỏi dựa trên hình cụt phóng chiếu của máy quay phim" + + +msgid "Deterministic" +msgstr "Tất Định" + + +msgid "Makes path guiding deterministic which means renderings will be reproducible with the same pixel values every time. This feature slows down training" +msgstr "Làm cho hướng dẫn đường đi trở nên tất định, tức là các kết xuất với cùng giá trị điểm ảnh sẽ có thể tái tạo, lúc nào cũng giống nhau. Tính năng này sẽ làm chậm huấn luyện lại" msgid "Allow objects to be culled based on the distance from camera" -msgstr "Cho vật thể được bị hủy diệt tùy khoảng cách từ máy quay phim" +msgstr "Cho phép các đối tượng bị loại trừ ra dựa trên khoảng cách từ máy quay phim đến" msgid "Approximate diffuse indirect light with background tinted ambient occlusion. This provides fast alternative to full global illumination, for interactive viewport rendering or final renders with reduced quality" -msgstr "Xấp xỉ ánh sáng tán xạ không trực tiếp bằng che khuất bao quanh nhiễm từ cảnh sao. Cái này cho một phương pháp nhanh thay thế phát sáng toàn cầu toàn phần, cho kết xuất màn kiểu tương tác hay kết xuất cuối chất lượng kém" +msgstr "Ước tính ánh sáng gián tiếp khuếch tán với nền nhuốm tính hấp thụ quang xạ môi trường. Phương pháp này cung cấp một phương cách thay thế nhanh chóng so với sự chiếu sáng toàn cầu đầy đủ, dành cho quá trình kết xuất cổng nhìn tương tác hoặc kết xuất cuối cùng với chất lượng thấp" + + +msgid "Guiding" +msgstr "Hướng Dẫn" + + +msgid "Use path guiding for sampling paths. Path guiding incrementally learns the light distribution of the scene and guides path into directions with high direct and indirect light contributions" +msgstr "Sử dụng hướng dẫn đường đi để lấy mẫu các đường đi. Hướng dẫn đường đi tìm hiểu sự phân bố ánh sáng của cảnh dần dần, tịnh tiến, và hướng dẫn đường đi vào các hướng có sự đóng góp ánh sáng trực tiếp và gián tiếp cao" + + +msgid "Guide Direct Light" +msgstr "Hướng Dẫn Ánh Sáng Trực Tiếp" + + +msgid "Consider the contribution of directly visible light sources during guiding" +msgstr "Xem xét sự đóng góp của các nguồn sáng nhìn thấy trực tiếp trong quá trình hướng dẫn" + + +msgid "Use MIS Weights" +msgstr "Sử Dụng Trọng Lượng MIS" + + +msgid "Use the MIS weight to weight the contribution of directly visible light sources during guiding" +msgstr "Sử dụng trọng lượng (MIS: Multiple Importance Sampling) để cân trọng sự đóng góp của nguồn sáng nhìn thấy trực tiếp trong quá trình hướng dẫn" msgid "Layer Samples" -msgstr "Dùng Lớp Mẫu Vật" +msgstr "Số Mẫu Vật của Tầng" msgid "How to use per view layer sample settings" -msgstr "Làm sao sử dụ cài đặt mẫu vật cho mỗi lớp hiển thị" +msgstr "Phương pháp sử dụng các sắp đặt về mẫu vật của từng tầng góc nhìn một" msgid "Per render layer number of samples override scene samples" -msgstr "Cho mỗi lớp kết xuất, số lượng mẫu vật vượt quyền mẫu vật cảnh" +msgstr "Số mẫu vật của mỗi tầng kết xuất sẽ vượt quyền số mẫu vật của cảnh" msgid "Bounded" -msgstr "Giới Hạn" +msgstr "Giới Nội" msgid "Bound per render layer number of samples by global samples" -msgstr "Dùng mẫu vật toàn cầu làm giới hạn số lượng mẫu vật cho mỗi lớp kết xuất" +msgstr "Dùng số mẫu vật toàn cầu làm giới hạn cho số mẫu vật của mỗi tầng kết xuất" msgid "Ignore per render layer number of samples" -msgstr "Không quan tâm số lượng mẫu vật cho mỗi lớp kết xuất" +msgstr "Bỏ qua số mẫu vật của mỗi tầng kết xuất" + + +msgid "Light Tree" +msgstr "Cây Ánh Sáng" + + +msgid "Sample multiple lights more efficiently based on estimated contribution at every shading point" +msgstr "Lấy mẫu vật nhiều nguồn sáng hiệu quả hơn dựa trên sự đóng góp ước tính tại mọi điểm tối" msgid "Automatically reduce the number of samples per pixel based on estimated noise level, for viewport renders" -msgstr "Tự động giảm số lượng mẫu từng điểm ảnh tùy mức độ huyên náo đã dự đoán, cho kết xuất màn chiếu" +msgstr "Tự động giảm số lượng mẫu trên mỗi điểm ảnh dựa trên mức độ nhiễu ước tính. Dành cho kết xuất cổng nhìn" msgid "Use Viewport Denoising" -msgstr "Dùng Bất Huyên Nào Hóa Của Màn Chiếu" +msgstr "Sử Dụng Khử Nhiễu trong Cổng Nhìn" msgid "Denoise the image in the 3D viewport" -msgstr "Bớt huyên náo của ảnh trong màn chiếu 3D" +msgstr "Khử nhiễu hình ảnh trong cổng nhìn 3D" + + +msgid "Surface Guiding" +msgstr "Hướng Dẫn Bề Mặt" + + +msgid "Use guiding when sampling directions on a surface" +msgstr "Sử dụng hướng dẫn khi lấy mẫu chiều hướng trên một bề mặt" + + +msgid "Volume Guiding" +msgstr "Hướng Dẫn Thể Tích" + + +msgid "Use guiding when sampling directions inside a volume" +msgstr "Sử dụng hướng dẫn khi lấy mẫu chiều hướng bên trong một thể tích" msgid "Volume Bounces" -msgstr "Nhồi Thể Tích" +msgstr "Lượng Bật Nẩy trong Thể Tích" msgid "Maximum number of volumetric scattering events" -msgstr "Số lượng sự kiện tán xạ thể tích tối đa" +msgstr "Số sự kiện tán xạ tối đa trong thể tích" + + +msgid "Volume Guiding Probability" +msgstr "Xác Suất của Hướng Dẫn Thể Tích" + + +msgid "The probability of guiding a direction inside a volume" +msgstr "Xác suất hướng dẫn một chiều hướng nội bên trong một thể tích" msgid "Max Steps" -msgstr "Bước Tối Đa" +msgstr "Số Bước Tối Đa" msgid "Maximum number of steps through the volume before giving up, to avoid extremely long render times with big objects or small step sizes" -msgstr "Số lượng bước xuyên qua thể tích trước chịu thua cho tránh thời gian kết xuất qúa lâu với vật thể to hay kích thước bước nhỏ" +msgstr "Số bước đi xuyên qua thể tích, trước khi từ bỏ, để tránh thời gian kết xuất quá lâu đối với các đối tượng lớn hoặc các cỡ bước nhỏ" msgid "Globally adjust detail for volume rendering, on top of automatically estimated step size. Higher values reduce render time, lower values render with more detail" -msgstr "Giá trị cao hơn giảm thời gian kết xuất, giá trị thấp hơn kết xuất chi tiết nhiều hơn" +msgstr "Điều chỉnh chi tiết cho quá trình kết xuất thể tích một cách toàn cầu, bên trên sự tính toán kích thước bước tự động. Giá trị cao sẽ làm giảm thời gian kết xuất, trong khi, những giá trị thấp sẽ làm cho kết xuất có nhiều chi tiết hơn" msgid "Render pass to show in the 3D Viewport" -msgstr "Hiện vòng kết xuất trong màn chiếu 3D" +msgstr "Lượt kết xuất để hiển thị trong Cổng Nhìn 3d" msgid "Show the Combined Render pass" -msgstr "Hiện vòng Gồm Kết Xuất" +msgstr "Hiển thị lượt Kết Xuất Kết Hợp" msgid "Show the Emission render pass" -msgstr "Hiện vòng kết xuất Phát Xạ" +msgstr "Hiển thị lượt kết xuất Phát Xạ" msgid "Show the Background render pass" -msgstr "Hiện vòng kết xuất Hậu Cảnh" +msgstr "Hiển thị lượt kết xuất Ảnh Nền" msgid "Show the Ambient Occlusion render pass" -msgstr "Hiện vòng kết xuất Che Khuất Bao Quanh" +msgstr "Hiển thị lượt kết xuất về THTQXMT (AO)" msgid "Show the Shadow Catcher render pass" -msgstr "Hiện vòng kết xuất Bắt Bóng Tối" +msgstr "Hiển thị lượt kết xuất Vật Tóm Bắt Bóng Tối" msgid "Diffuse Direct" -msgstr "Tán Xạ Trực Tiếp" +msgstr "Khuếch Tán Trực Tiếp" msgid "Show the Diffuse Direct render pass" -msgstr "Hiện vòng kết xuất Tán Xá Trực Tiếp" +msgstr "Hiển thị lượt kết xuất Khuếch Tán Trực Tiếp" msgid "Diffuse Indirect" -msgstr "Tán Xạ Gián Tiếp" +msgstr "Khuếch Tán Gián Tiếp" msgid "Show the Diffuse Indirect render pass" -msgstr "Hiện vòng kết xuất Tán Xạ Gián Tiếp" +msgstr "Hiển thị lượt kết xuất Khuếch Tán Gián Tiếp" msgid "Show the Diffuse Color render pass" -msgstr "Hiện vòng kết xuất Tán Xá Màu" +msgstr "Hiển thị lượt kết xuất Màu Khuếch Tán" msgid "Glossy Direct" -msgstr "Bóng Loáng Trực Tiếp" +msgstr "Ánh Bóng Bẩy Trực Tiếp" msgid "Show the Glossy Direct render pass" -msgstr "Hiện vòng kết xuất Bóng Loáng Trực Tiếp" +msgstr "Hiển thị lượt kết xuất Ánh Bóng Bẩy Trực Tiếp" msgid "Glossy Indirect" -msgstr "Bóng Lóang Gián Tiếp" +msgstr "Ánh Bóng Bẩy Gián Tiếp" msgid "Show the Glossy Indirect render pass" -msgstr "Hiện vòng kết xuất Bóng Loáng Trực Tiếp" +msgstr "Hiển thị lượt kết xuất Ánh Bóng Bẩy Gián Tiếp" msgid "Glossy Color" -msgstr "Màu Bóng Loáng" +msgstr "Màu Sắc của Ánh Bóng Bẩy" msgid "Show the Glossy Color render pass" -msgstr "Hiện vòng kết xuất Bóng Loáng Màu" +msgstr "Hiển thị lượt kết xuất Màu Sắc của Ánh Bóng Bẩy" msgid "Transmission Direct" -msgstr "Truyền Trực Tiếp" +msgstr "Truyền Xạ Trực Tiếp" msgid "Show the Transmission Direct render pass" -msgstr "Hiện vòng kết xuất Truyền Xạ Trực Tiếp" +msgstr "Hiển thị lượt kết xuất Truyền Xạ Trực Tiếp" msgid "Transmission Indirect" -msgstr "Truyền Gián Tiếp" +msgstr "Truyền Xạ Gián Tiếp" msgid "Show the Transmission Indirect render pass" -msgstr "Hiện vòng kết xuất Truyền Xạ Gián Tiếp" +msgstr "Hiển thị lượt kết xuất Truyền Xạ Gián Tiếp" msgid "Transmission Color" -msgstr "Màu Truyền Xạ" +msgstr "Màu Truyền Lan" msgid "Show the Transmission Color render pass" -msgstr "Hiện vòng kết xuất Truyền Xạ Màu" +msgstr "Hiển thị lượt kết xuất Màu Truyền Lan" msgid "Show the Volume Direct render pass" -msgstr "Hiện vòng kết xuất Thể Tích Trực Tiếp" +msgstr "Hiển thị lượt kết xuất Thể Tích Trực Tiếp" msgid "Show the Volume Indirect render pass" -msgstr "Hiện vòng kết xuất Thể Tích Gián Tiếp" +msgstr "Hiển thị lượt kết xuất Thể Tích Gián Tiếp" msgid "Show the Position render pass" -msgstr "Hiện vòng kết xuất Vị Trí" +msgstr "Hiển thị lượt kết xuất Vị Trí" msgid "Show the Normal render pass" -msgstr "Hiện vòng kết xuất Pháp Tuyến" +msgstr "Hiển thị lượt kết xuất Pháp Tuyến" msgid "Show the UV render pass" -msgstr "Hiện vòng kết xuất UV" +msgstr "Hiển thị lượt kết xuất UV" msgid "Show the Mist render pass" -msgstr "Hiện vòng kết xuất Sương Mù" +msgstr "Hiển thị lượt kết xuất Sương Mù" msgid "Denoising Albedo" -msgstr "Suất Phản Chiếu Bớt Huyên Náo" +msgstr "Khử Nhiễu Suất Phản Chiếu" msgid "Albedo pass used by denoiser" -msgstr "Vòng suất phản chiếu cho bộ bớt huyên náo sử dụng" +msgstr "Lượt suất phản chiếu sử dụng bởi trình khử nhiễu" msgid "Denoising Normal" -msgstr "Pháp Tuyến Bợt Huyên Náo" +msgstr "Khử Nhiễu Pháp Tuyến" msgid "Normal pass used by denoiser" -msgstr "Vòng pháp tuyến cho bộ bớt huyên náo sử dụng" +msgstr "Lượt pháp tuyến sử dụng bởi trình khử nhiễu" msgid "Sample Count" -msgstr "Sô Lượng Mẫu" +msgstr "Số Mẫu Vật" msgid "Per-pixel number of samples" -msgstr "Số lượng mẫu từng điểm ảnh" +msgstr "Số lượng mẫu vật mỗi điểm ảnh" msgid "Show Active Pixels" -msgstr "Hiện Điểm Ảnh Hoạt Động" +msgstr "Hiển Thị các Điểm Ảnh đang Hoạt Động" msgid "When using adaptive sampling highlight pixels which are being sampled" -msgstr "Khi dùng mẫu ứng phó, tô sáng các điểm ảnh đang được lấy mẫu" +msgstr "Khi sử dụng các điểm ảnh nổi bật mẫu tùy ứng đang được lấy mẫu" msgid "Object visibility for camera rays" -msgstr "Sự hiển thị vật thể cho tia máy quay phim" +msgstr "Tầm nhìn của đối tượng đối với các tia xạ của máy quay phim" msgid "Object visibility for diffuse reflection rays" -msgstr "Sự hiển thị vật thể cho tia phản xạ tán xạ" +msgstr "Tầm nhìn của đối tượng đối với các tia khuếch tán" msgid "Object visibility for glossy reflection rays" -msgstr "Sự hiển thị vật thể cho tia phản xạ bóng loáng" +msgstr "Tầm nhìn của đối tượng đối với các tia phản quang ánh bóng bẩy" msgid "Object visibility for volume scatter rays" -msgstr "Sự hiển thị vật thể cho tia tán xạ thể tích" +msgstr "Tầm nhìn của đối tượng đối với các tia tán xạ thể tích" msgid "Object visibility for shadow rays" -msgstr "Sự hiển thị vật thể cho tia bóng tối" +msgstr "Tầm nhìn của đối tượng đối với các tia về bóng tối" msgid "Object visibility for transmission rays" -msgstr "Sự hiển thị vật thể cho tia truyền" +msgstr "Tầm nhìn của đối tượng đối với các tia truyền xạ" msgid "Maximum number of bounces the background light will contribute to the render" -msgstr "Số lượng nhồi tối đa ánh sáng nền được góp phần cho ảnh kết xuất" +msgstr "Lượng bật nẩy tối đa của ánh sáng nền đóng góp vào bản kết xuất" msgid "Map Resolution" -msgstr "Độ Phân Giải Bản Đồ" +msgstr "Độ Phân Giải của Bản Đồ" msgid "Importance map size is resolution x resolution/2; higher values potentially produce less noise, at the cost of memory and speed" -msgstr "Kích cỡ bản đồ sự quan trọng là độ phân giải x độ phân giải/2, giá trị càng cao huyên náo càng ít, nhưng cần dùng bộ nhớ nhiều hơn và chậm hơn" +msgstr "Kích thước bản đồ về mức quan trọng = độ phân giải x độ phân giải/2; Những giá trị cao hơn sẽ tạo nhiễu ít hơn, song sẽ sử dụng nhiều bộ nhớ hơn và tốc độ thi hành sẽ bị ảnh hưởng" msgid "Sampling Method" -msgstr "Phương Pháp Lấy Mẫu" +msgstr "Phương Pháp Lấy Mẫu Vật" msgid "How to sample the background light" -msgstr "Làm sao lấy mẫu vật ánh sáng cảnh hậu" +msgstr "Phương pháp lấy mẫu vật ánh sáng nền" msgid "Don't sample the background, faster but might cause noise for non-solid backgrounds" -msgstr "Không lấy mẫu vật từ cảnh hậu, nhánh hơn nhưng có thể tạo huyên náo cho cảnh hậu không rắn" +msgstr "Không lấy mẫu vật nền, nhanh hơn song có thể gây ra nhiễu đối với những nền không đặc" msgid "Automatically try to determine the best setting" -msgstr "Tự động xác định đặc tính tốt nhất" +msgstr "Tự động thử xác định sắp đặt tốt nhất" msgid "Manually set the resolution of the sampling map, higher values are slower and require more memory but reduce noise" -msgstr "Đặt bằng tay độ phân giải của bản đồ mẫu vật, giá trị càng cao càng chậm và dùng trị nhớ nhiều hơn, nhưng giảm huyên náo" +msgstr "Đặt độ phân giải của ánh xạ mẫu vật thủ công. Những giá trị cao hơn sẽ làm cho chậm hơn và đòi hỏi nhiều bộ nhớ hơn, song giảm được nhiễu" msgid "Interpolation method to use for volumes" -msgstr "Dùng phương pháp suy nội nào cho thể tích" +msgstr "Phương pháp nội suy sử dụng cho các thể tích" msgid "Distance between volume shader samples when rendering the volume (lower values give more accurate and detailed results, but also increased render time)" -msgstr "Khoảng cách giữa mẫu vật bộ tô sắc thể tích khi kết xuất thể tích (giá trị càng thấp càng chính xác và chi tiết nhiều hơn nhưng chậm hơn)" +msgstr "Khoảng cách giữa các mẫu vật tô bóng thể tích khi kết xuất thể tích (giá trị càng thấp thì càng chính xác và chi tiết hơn nhưng thời gian kết xuất sẽ tăng lên)" msgid "Settings/info about a language" -msgstr "Cài đặt/thông tin về một ngôn ngữ" +msgstr "Sắp đặt/thông tin về ngôn ngữ" msgid "Language Name" -msgstr "Tên Nhôn Ngữ" +msgstr "Tên Ngôn Ngữ" msgid "Language label (eg. \"French (Français)\")" -msgstr "Nhãn ngôn ngữ (ví dụ \"Tiếng Pháp (Français)\")" +msgstr "Nhãn hiệu ngôn ngữ (ví dụ: \"French (Français)\" (tiếng Pháp))" msgid "Numeric ID" -msgstr "ID Mã Số" +msgstr "Số ID" msgid "Numeric ID (read only!)" -msgstr "ID mã số (chỉ được đọc)" +msgstr "Số ID (chỉ để đọc thôi!)" + + +msgid "PO Work File Path" +msgstr "Đường Dẫn Tập Tin PO Công Việc" + + +msgid "Path to the relevant po file in the work repository" +msgstr "Đường dẫn đến tập tin po thích hợp trong kho công việc" + + +msgid "PO Blender File Path" +msgstr "Đường Dẫn Tập Tin PO của Blender" + + +msgid "Path to the relevant po file in Blender's source repository" +msgstr "Đường dẫn đến tập tin po thích hợp trong kho lưu trữ nguồn của Blender" msgid "Language ID" -msgstr "Mã Số Ngôn Ngữ" +msgstr "ID của Ngôn Ngữ" msgid "ISO code (eg. \"fr_FR\")" -msgstr "Mã số ISO, như fr_FR" +msgstr "Mã ISO (ví dụ: \"fr_FR\")" msgid "If this language should be used in the current operator" -msgstr "Nếu nên dùng ngôn ngữ này trong thao tác hiện tại" +msgstr "Nếu ngôn ngữ này cần phải được sử dụng trong thao tác (operator) hiện tại" msgid "Active Language" -msgstr "Ngôn Ngữ Hoạt Động" +msgstr "Ngôn Ngữ đang Hoạt Động" msgid "Index of active language in langs collection" -msgstr "Chỉ số của ngôn ngữ hoạt động trong tập ngôn ngữ" +msgstr "Chỉ số của ngôn ngữ đang hoạt động trong tập ngôn ngữ" msgid "Whether these settings have already been auto-set or not" -msgstr "Cài đặt này được tự động đặt hay không" +msgstr "Những sắp đặt này đã được tự động cài đặt hay chưa" msgid "Languages" -msgstr "Ngông Ngữ" +msgstr "Ngôn Ngữ" + + +msgid "Languages to update in work repository" +msgstr "Ngôn ngữ để cập nhật trong kho lưu trữ công việc" msgid "POT File Path" -msgstr "Đường Dẫn Tập Tin POT" +msgstr "Đường Dẫn của Tập Tin POT" msgid "Path to the pot template file" -msgstr "Đường dẫn đến tập tin bố cục mẫu .pot" +msgstr "Đường dẫn đến tập tin mẫu pot (phiên dịch)" msgid "Hide BBoxes" -msgstr "Ẩn Hộp Bao Quanh" +msgstr "Ẩn Giấu Khung Viền Hình Hộp" msgid "Hide the bounding boxes rendered for Matrix like items" -msgstr "Ẩn hộp bao quanh được kết xuất cho mặt hàng giống Ma Trận" +msgstr "Ẩn Giấu Khung Viền Hình Hộp (BBoxes) đã kết xuất cho các phần tử mang tính Ma Trận (Matrix like)" msgid "Scale factor" -msgstr "Hệ số phóng to" +msgstr "Hệ Số Đổi Tỷ Lệ" msgid "Resize the Bounding Box and the coordinate lines for the display of Matrix items" -msgstr "Chỉnh kích cỡ của Hộp Bao Quanh và đường tọa độ để hiển thị mặt hàng Ma Trận" +msgstr "Đổi cỡ Khung Viền Hình Hộp (BBoxes) và các đường phối hợp hỗ trợ việc hiển thị các phần tử Ma Trận" msgid "Always In Front" -msgstr "Lần Nào Ở Phía Trước" +msgstr "Luôn Luôn Ở Đằng Trước" msgid "Draw Points and lines always in front" -msgstr "Lần nào cũng vẽ Điểm và đường ở phía trước" +msgstr "Luôn luôn vẽ các Điểm và các đường ở đằng trước" msgid "Hide Names" -msgstr "Ẩn Tên" +msgstr "Ẩn Giấu Tên" msgid "Hide the names of the rendered items" -msgstr "Ẩn tên của mặt hàng được kết xuất" +msgstr "Ẩn giấu tên của những phần tử được kết xuất" msgid "Python expression to be evaluated as the initial node setting" -msgstr "Đánh giá biểu thức Python nào cho cài đặt khởi động của giao điểm" +msgstr "Biểu thức Python để tính toán tựa như sắp đặt khởi đầu của nút" msgid "The amount of objects per unit on the line" -msgstr "Lượng vật thể từng đơn vị ở trên đường" +msgstr "Số lượng đối tượng mỗi đơn vị trên đường vẽ" msgid "Normal Offset" -msgstr "Dịch Bình Thường" +msgstr "Dịch Chuyển Pháp Tuyến" msgid "Distance from the surface" @@ -83767,51 +92092,51 @@ msgstr "Khoảng cách từ bề mặt" msgid "Maximum distance of the objects to the line" -msgstr "Khoảng cách cực đại của vật thể từ đường" +msgstr "Khoảng cách tối đa của các đối tượng so với đường vẽ" msgid "Random Scale Percentage" -msgstr "Phần Trăm Phóng To Ngẫu Nhiên" +msgstr "Lượng Phần Trăm Thay Đổi Tỷ Lệ một cách Ngẫu Nhiên" msgid "Increase to get a larger range of sizes" -msgstr "Tăng lên cho được một phạm vi rộng hơn" +msgstr "Gia tăng giá trị này để tạo được nhiều kích thước khác nhau" msgid "Maximum rotation of the generated objects" -msgstr "Xoay cực đại của vật thể được chế tạo" +msgstr "Lượng xoay chiều tối đa của các đối tượng sinh tạo" msgid "Size of the generated objects" -msgstr "Kích cỡ của vật thể được chế tạo" +msgstr "Kích thước của các đối tượng sinh tạo" msgid "Change it to get a different scatter pattern" -msgstr "Đổi nó cho được một dạng rải ra khác" +msgstr "Đổi giá trị này để tạo các kiểu mẫu phân tán rải rác khác nhau" msgid "Use Normal Rotation" -msgstr "Dùng Xoay Pháp Tuyến" +msgstr "Sử Dụng Xoay Chiều theo Pháp Tuyến" msgid "Rotate the instances according to the surface normals" -msgstr "Xoay các thực thể tùy pháp tuyến của bề mặt" +msgstr "Xoay chiều các thực thể chiểu theo pháp tuyến của bề mặt" msgid "Operator File List Element" -msgstr "Thao Tác - Phần Tử Danh Sách Tập Tin" +msgstr "Thao Tác: Thành Phần trong Danh Sách Tập Tin" msgid "Name of a file or directory within a file list" -msgstr "Tên của tập tin hay thư mục trong danh sách tập tin" +msgstr "Tên của tập tin hoặc thư mục nằm trong danh sách tập tin" msgid "Operator Mouse Path" -msgstr "Thao Tác - Đường Dẫn Chuột" +msgstr "Thao Tác: Đường Di Chuyển của Chuột" msgid "Mouse path values for operators that record such paths" -msgstr "Giá rị đường dẫn chuột cho thao tác lưu các đường như vậy" +msgstr "Giá trị đường di chuyển chuột cho các thao tác thu ghi các đường như vậy" msgid "Time of mouse location" @@ -83819,95 +92144,135 @@ msgstr "Thời gian của vị trí chuột" msgid "Operator Stroke Element" -msgstr "Thao Tác - Phần Tử " +msgstr "Thao Tác: Thành Phần của Đường Nét" msgid "Is Stroke Start" -msgstr "Là Bắt Đầu Nét" +msgstr "Là Điểm Đầu của Nét" msgid "Mouse Event" -msgstr "Sự Kiện Chuột" +msgstr "Sự Kiện của Chuột" msgid "Tablet pressure" -msgstr "Áp Suất Bảng Vẽ" +msgstr "Áp lực của bảng vẽ" msgid "Brush Size" -msgstr "Khổ Bút Lông" +msgstr "Kích Thước Đầu Bút" msgid "Brush size in screen space" -msgstr "Khổ bút lông trong không gian màn" +msgstr "Kích thước đầu bút trong không gian màn hình" msgid "Tilt X" -msgstr "Nghiêng X" +msgstr "Xoay Nghiêng X" msgid "Tilt Y" -msgstr "Nghiêng Y" +msgstr "Xoay Nghiêng Y" + + +msgid "Max Lights" +msgstr "Số Đèn Tối Đa" + + +msgid "Limit maximum number of lights" +msgstr "Giới hạn số lượng đèn tối đa" + + +msgid "Tiny Prim Culling" +msgstr "Loại Bỏ Cấu Trúc Cơ Bản Nhỏ Xíu" + + +msgid "Hide small geometry primitives to improve performance" +msgstr "Ẩn giấu các hình học cơ bản nhỏ để cải thiện hiệu suất hoạt động" + + +msgid "Max Texture Memory Per Field" +msgstr "Lượng Bộ Nhớ Tối Đa cho Chất Liệu Trên Mỗi Trường" + + +msgid "Maximum memory for a volume field texture in Mb (unless overridden by field prim)" +msgstr "Bộ nhớ tối đa cho chất liệu trường thể tích tính bằng đơn vị Mb (trừ khi bị vượt quyền bởi trường cấu trúc cơ bản (prim))" + + +msgid "Volume Raymarching Step Size" +msgstr "Kích Thước Bước trong Diễu Hành Tia Thể Tích" + + +msgid "Step size when raymarching volume" +msgstr "Kích thước bước khi diễu hành tia thể tích" + + +msgid "Volume Raymarching Step Size Lighting" +msgstr "Chiếu Sáng theo Kích Thước Bước của Diễu Hành Tia Thể Tích" + + +msgid "Step size when raymarching volume for lighting computation" +msgstr "Kích thước bước khi diễu hành tia thể tích để tính toán ánh sáng" msgid "Implements the properties for the SVG exporter" -msgstr "Thực hành đặc tính cho bộ xuất SVG" +msgstr "Thực thi các tính chất cho trình xuất khẩu SVG (SVG exporter)" msgid "Line Join" -msgstr "Kết Nối Đường" +msgstr "Khớp Nối Đường Vẽ" msgid "Miter" -msgstr "Mũ Tế" +msgstr "Cắt Góc" msgid "Corners are sharp" -msgstr "Góc giác bén" +msgstr "Các góc đều sắc nhọn" msgid "Corners are smoothed" -msgstr "Góc giác mịn" +msgstr "Các góc được làm mịn" msgid "Corners are beveled" -msgstr "Góc giác được cạnh tròn" +msgstr "Góc được bo tròn" msgid "Export a single frame" -msgstr "Xuất một bức ảnh" +msgstr "Xuất Khẩu một đơn khung hình" msgid "Export an animation" -msgstr "Xuất một hoạt hình" +msgstr "Xuất Khẩu một hoạt họa" msgid "Fill Contours" -msgstr "Tô Nét Đồng Mức" +msgstr "Phủ Kín Đường Công-Tua" msgid "Fill the contour with the object's material color" -msgstr "Tô đầy nét đồng mức với màu vật liệu của vật thể" +msgstr "Phủ kín (tô kín) đường công-tua (đường viền hình dạng) bằng màu nguyên vật liệu của đối tượng" msgid "Split at Invisible" -msgstr "Chẻ tại Vô Hình" +msgstr "Tách Phân tại Điểm Vô Hình" msgid "Split the stroke at an invisible vertex" -msgstr "Chẻ nét tại một đỉnh vô hình" +msgstr "Tách phân các nét tại điểm đỉnh vô hình (invisible)" msgid "SVG Export" -msgstr "Xuất SVG" +msgstr "Xuất Khẩu ra SVG" msgid "Export Freestyle edges to an .svg format" -msgstr "Xuất cảnh Nệt Tự Do vào một tập tin định dạng .svg" +msgstr "Xuất Khẩu các cạnh Phong Cách Tự Do ra định dạng .svg" msgid "Format type to export to" -msgstr "Xuất bằng loại định dạng nào" +msgstr "Định dạng để xuất khẩu thành" msgid "OBJ" @@ -83927,15 +92292,15 @@ msgstr "X3D" msgid "Export Directory" -msgstr "Thư Mục Tếp Xuất" +msgstr "Thư Mục Xuất Khẩu" msgid "Path to directory where the files are created" -msgstr "Đường dẫn thư mục là chỗ cho xuất tập tin" +msgstr "Đường dẫn tới thư mục, nơi các tập tin sẽ được kiến tạo" msgid "Limit for checking zero area/length" -msgstr "Giới hạn cho kiểm tra diện tích/bề dài bằng không" +msgstr "Giới hạn cho việc kiểm tra diện tích/chiều dài bằng không" msgid "Face Areas" @@ -83943,39 +92308,39 @@ msgstr "Diện Tích Mặt" msgid "Normalize normals proportional to face areas" -msgstr "Đơn vị hoá pháp tuyến theo tỉ số diện tích của các mặt" +msgstr "Bình thường hóa các pháp tuyến cho cân đối với các diện tích Mặt" msgid "Apply Scale" -msgstr "Áp Dụng Phóng To" +msgstr "Áp Dụng Tỷ Lệ" msgid "Apply scene scale setting on export" -msgstr "Áp dụng phóng to cài đặt của cảnh khi xuất tập tin" +msgstr "Áp dụng tỷ lệ của cảnh khi xuất khẩu" msgid "Data Layers" -msgstr "Lớp Dữ Liệu" +msgstr "Các Tầng Dữ Liệu" msgid "Export normals, UVs, vertex colors and materials for formats that support it significantly increasing file size" -msgstr "Xuất pháp tuyến, UV, màu đỉnh và vật liệu cho các định dạng có hỗ trợ nó nhưng tăng cỡ thước tập tinh nhiều" +msgstr "Xuất Khẩu pháp tuyến, UV, màu đỉnh và vật liệu cho các định dạng có hỗ trợ nó nhưng tăng cỡ thước tập tinh nhiều" msgid "Copy Textures" -msgstr "Chép Chất Liệu" +msgstr "Sao Chép Chất Liệu" msgid "Copy textures on export to the output path" -msgstr "Chép chất liệu khi xuất tập tin tới đường dẫn xuất tập tin" +msgstr "Sao chép chất liệu trong khi xuất khẩu ra đường dẫn tập tin đầu ra" msgid "Selected UV Element" -msgstr "Phần Tử UV Được Chọn" +msgstr "Phần Tử UV được Chọn" msgid "Element Index" -msgstr "Chỉ Số Phần Tử" +msgstr "Chỉ Số của Yếu Tố" msgid "Face Index" @@ -83983,87 +92348,159 @@ msgstr "Chỉ Số Mặt" msgid "Base Pose Angle" -msgstr "Góc Dạng Đứng Cơ Sở" +msgstr "Góc Độ Tư Thế Cơ Sở" msgid "Base Pose Location" -msgstr "Vị Trí Dạng Đứng Cơ Sở" +msgstr "Vị Trí Tư Thế Cơ Sở" msgid "Base Scale" -msgstr "Phóng To Cơ Sở" +msgstr "Tỷ Lệ Cơ Sở" msgid "Viewer reference scale associated with this landmark" -msgstr "Phóng to than chiếu của người nhìn có liên quan đến mốc bờ này" +msgstr "Tỷ lệ tham chiếu của quan sát liên hệ tới đến địa điểm này" msgid "VR Landmark" -msgstr "Mốc Bờ Sự Thật Ảo" +msgstr "Địa Ranh VR" msgid "Scene Camera" -msgstr "Máy Quay Phim Cảnh" +msgstr "Máy Quay Phim của Cảnh" msgid "Use scene's currently active camera to define the VR view base location and rotation" -msgstr "Dùng máy quay phim đang hoạt hình để xác định vị trí và xoay của cơ sở sự thật ảo" +msgstr "Sử dụng máy quay phim đang hoạt động hiện nay của cảnh để xác định vị trí và độ xoay chiều cơ sở của góc nhìn Thực Tế Ảo (VR)" msgid "Use an existing object to define the VR view base location and rotation" -msgstr "Dùng một vật thể đang tồn tại để xác định vị trí và xoay của cơ sở người nhìn VR" +msgstr "Sử dụng một đối tượng hiện tại để xác định vị trí và xoay chiều cơ sở của khung quan sát VR" msgid "Custom Pose" -msgstr "Dạng Đứng Tùy Chọn" +msgstr "Tư Thế Tùy Chỉnh" msgid "Allow a manually defined position and rotation to be used as the VR view base pose" -msgstr "Cho một vị trí và xoay được chọn bằng tay để dùng cho dạng đứng cơ sở đồ nhìn của sự thật ảo" +msgstr "Cho phép tư thế cơ sở trong góc nhìn VR sử dụng sự xác định vị trí và góc xoay chiều thủ công" msgid "ID Property" -msgstr "Đặc Tính ID (tên)" +msgstr "Tính Chất của ID" msgid "Property that stores arbitrary, user defined properties" -msgstr "Đặc tính chứa đăc tính người dùng tự xác định" +msgstr "Tính chất để lưu chứa những tính chất tùy định, do người dùng định nghĩa" + + +msgid "Quaternion Attribute Value" +msgstr "Giá Trị Thuộc Tính Quaternion" + + +msgid "Rotation value in geometry attribute" +msgstr "Giá trị xoay chiều trong thuộc tính hình học" + + +msgid "Bilateral Filter" +msgstr "Bộ Lọc Song Phương" + + +msgid "Blur the resolved radiance using a bilateral filter" +msgstr "Làm nhòe mờ sự chiếu sáng đã được giải quyết bằng bộ lọc song phương" + + +msgid "Spatial Reuse" +msgstr "Tái Dụng Không Gian" + + +msgid "Reuse neighbor pixels' rays" +msgstr "Tái sử dụng tia xạ của các điểm ảnh lân cận" + + +msgid "Temporal Accumulation" +msgstr "Tích Lũy Tạm Thời" + + +msgid "Accumulate samples by reprojecting last tracing results" +msgstr "Tích lũy mẫu vật bằng cách tái phóng chiếu kết quả dò tia sau cùng" + + +msgid "Number of rays per pixel" +msgstr "Số lượng tia trên mỗi điểm ảnh" + + +msgid "1 ray per pixel" +msgstr "1 tia cho mỗi điểm ảnh" + + +msgid "1 ray for every 4 pixels" +msgstr "1 tia cho mỗi 4 điểm ảnh" + + +msgid "1 ray for every 16 pixels" +msgstr "1 tia cho mỗi 16 điểm ảnh" + + +msgid "Clamp ray intensity to reduce noise (0 to disable)" +msgstr "Hạn định cường độ tia để giảm nhiễu (0 để tắt đi)" + + +msgid "Screen-Trace Precision" +msgstr "Độ Chính Xác của Dò Tia Màn Hình" msgid "Precision of the screen space ray-tracing" -msgstr "Độ chính xác của dò tia trong không gian màn" +msgstr "Độ chính xác dò tia không gian màn hình" + + +msgid "Screen-Trace Thickness" +msgstr "Chiều Dày của Dò Tia Màn Hình" + + +msgid "Surface thickness used to detect intersection when using screen-tracing" +msgstr "Độ dày bề mặt được sử dụng để phát hiện sự giao cắt khi sử dụng tính năng dò tia màn hình" + + +msgid "Enable noise reduction techniques for raytraced effects" +msgstr "Cho phép các kỹ thuật giảm nhiễu cho những hiệu ứng dò tia" + + +msgid "Read-only Integer" +msgstr "Số Nguyên Duy Đọc" msgid "Region in a subdivided screen area" -msgstr "Khu vực trong diện tích màn phân hóa" +msgstr "Vùng trong diện tích màn hình được phân chia" msgid "Alignment of the region within the area" -msgstr "Sắp xếp của vùng trong khu vực" +msgstr "Căn chỉnh của vùng nội trong khu vực" msgid "Don't use any fixed alignment, fill available space" -msgstr "Không dùng sắp xếp nào được nhất định, làm đầy không gian cõ thể dùng" +msgstr "Không sử dụng sự căn chỉnh cố định, song sử dụng toàn bộ không gian vốn có" msgid "Horizontal Split" -msgstr "Chẻ Ngang" +msgstr "Tách Phân theo Chiều Ngang" msgid "Vertical Split" -msgstr "Chẻ Dọc" +msgstr "Tách Phân theo Chiều Dọc" msgid "Region floats on screen, doesn't use any fixed alignment" -msgstr "Vùng được chổi trên màn, nó không dùng sắp xếp nào nhất định" +msgstr "Vùng để trôi nổi trên màn hình, không sử dụng bất cứ sự căn chỉnh cố định nào" msgid "Quad Split" -msgstr "Chẻ Tư" +msgstr "Phân Tách Tứ Giác" msgid "Region is split horizontally and vertically" -msgstr "Chẻ vùng hướng ngang và dọc" +msgstr "Vùng được tách phân theo chiều ngang và chiều dọc" msgid "Region Data" @@ -84075,23 +92512,23 @@ msgstr "Dữ liệu của vùng được xác định (loại tùy loại vùng) msgid "Region height" -msgstr "Bề cao vùng" +msgstr "Chiều cao của vùng" msgid "Type of this region" -msgstr "Loại vùng này" +msgstr "Thể loại của vùng này" msgid "View2D" -msgstr "Màn Chiếu 2D" +msgstr "Khung Nhìn 2D" msgid "2D view of the region" -msgstr "Màn chiếu 2D của vùng" +msgstr "Khung nhìn 2D của vùng" msgid "Region width" -msgstr "Bề rộng vùng" +msgstr "Chiều rộng của vùng" msgid "The window relative vertical location of the region" @@ -84103,35 +92540,39 @@ msgstr "Vị trí ngang của vùng tương đối với cửa sổ" msgid "3D View Region" -msgstr "Vùng Màn 3D" +msgstr "Vùng Khung Nhìn 3D" msgid "3D View region data" -msgstr "Dữ liệu vùng màn 3D" +msgstr "Dữ liệu vùng Khung Nhìn 3D" msgid "Clip Planes" -msgstr "Mặt Phẳng Cắt" +msgstr "Các Bình Diện Cắt Xén" msgid "Is Axis Aligned" -msgstr "Trục Được Sắp Xếp" +msgstr "Có Căn Chỉnh với Trục hay Không" + + +msgid "Whether the current view is aligned to an axis (does not check whether the view is orthographic, use \"is_perspective\" for that). Setting this will rotate the view to the closest axis" +msgstr "Góc nhìn hiện tại có được căn chỉnh theo một trục hay không (không kiểm tra xem góc nhìn là trực giao hay không, sử dụng \"is_perspective\" (là phối cảnh xa gần) cho cái đó). Đặt tùy chọn này sẽ xoay chiều góc nhìn sang trục gần nhất" msgid "Is Perspective" -msgstr "Là Chiếu Phối Cảnh" +msgstr "Là Phối Cảnh" msgid "Lock view rotation of side views to Top/Front/Right" -msgstr "Khóa xoay màn của màn bên phía đến Trên/Trước/Phải" +msgstr "Khóa xoay chiều góc nhìn trong các góc nhìn bên trong Đỉnh/Trước/Phải" msgid "Perspective Matrix" -msgstr "Ma Trận Chiếu Phối Cảnh" +msgstr "Ma Trận Phối Cảnh" msgid "Current perspective matrix (``window_matrix * view_matrix``)" -msgstr "Ma trận chiếu phối cảnh hiện tại (``window_matrix * view_matrix``) (``maTrận_cửaSổ * maTrận_màn``)" +msgstr "Ma trận phối cảnh hiện tại (``window_matrix * view_matrix``) = (``matrận_cửasổ * matrận_gócnhìn``)" msgid "Sync Zoom/Pan" @@ -84139,67 +92580,67 @@ msgstr "Đồng Bộ Phóng Vào/Dời" msgid "Sync view position between side views" -msgstr "Đồng bộ vị trí màn giữa các màn bên hông" +msgstr "Đồng bộ vị trí góc nhìn giữa các góc nhìn bên" msgid "Clip Contents" -msgstr "Cắt Nội Dung" +msgstr "Cắt Xén Nội Dung" msgid "Clip view contents based on what is visible in other side views" -msgstr "Cắt nội dụng màn chiếu tùy có cái gì hiển thị trong các màn hông" +msgstr "Cắt xén nội dung của góc nhìn dựa trên những cái gì nhìn thấy được trong các góc nhìn bên khác" msgid "Use Clip Planes" -msgstr "Dùng Mặt Phẳng Cắt" +msgstr "Sử Dụng Bình Diện Cắt Xén" msgid "Camera Offset" -msgstr "Dịch Máy Quay Phim" +msgstr "Dịch Chuyển của Máy Quay Phim" msgid "View shift in camera view" -msgstr "Dịch của màn trong màn máy quay phim" +msgstr "Dịch chuyển của góc nhìn trong ống kính của máy quay phim" msgid "Camera Zoom" -msgstr "Phóng Máy Quay Phim" +msgstr "Thu-Phóng của Máy Quay Phim" msgid "Zoom factor in camera view" -msgstr "Hệ số phóng cho màn máy quay phim" +msgstr "Hệ số thu-phóng cho góc nhìn máy quay phim" msgid "Distance to the view location" -msgstr "Khoảng cách đến vị trí màn" +msgstr "Khoảng cách đến vị trí góc nhìn" msgid "View Location" -msgstr "Vị Trí Màn" +msgstr "Vị Trí Góc Nhìn" msgid "View pivot location" -msgstr "Vị trí điểm tựa màn" +msgstr "Vị trí điểm tựa của góc nhìn" msgid "View Matrix" -msgstr "Ma Trận Màn" +msgstr "Ma Trận Góc Nhìn" msgid "Current view matrix" -msgstr "Ma trận màn hiện tại" +msgstr "Ma trận của góc nhìn hiện tại" msgid "View Perspective" -msgstr "Điểm Nhìn Màn Chiếu" +msgstr "Phối Cảnh Góc Nhìn" msgid "View Rotation" -msgstr "Xoay Màn" +msgstr "Xoay Chiều Góc Nhìn" msgid "Rotation in quaternions (keep normalized)" -msgstr "Xoay bằng quaternion (giữ đơn vị hóa)" +msgstr "Xoay chiều kiểu Quatenion (giữ bình thường hóa)" msgid "Window Matrix" @@ -84207,15 +92648,23 @@ msgstr "Ma Trận Cửa Sổ" msgid "Current window matrix" -msgstr "Ma Trận Cửa Sổ Hiện Tại" +msgstr "Ma trận cửa sổ hiện tại" + + +msgid "Hydra Render Engine" +msgstr "Động Cơ Kết Xuất Hydra" + + +msgid "Base class from USD Hydra based renderers" +msgstr "Lớp cơ bản từ các trình kết xuất dựa trên cơ sở USD Hydra" msgid "View layer name" -msgstr "Tên Lớp Hiển Thị" +msgstr "Tên tầng góc nhìn" msgid "Render Ambient Occlusion in this Layer" -msgstr "Kết xuất Che Khuất Bao Quanh trong Lớp này" +msgstr "Kết xuất THTQXMT (Ambient Occlusion) trong Lớp này" msgid "Render motion blur in this Layer, if enabled in the scene" @@ -84223,115 +92672,120 @@ msgstr "Kết xuất mờ hóa trong Lớp này, nếu đã bật trong cảnh n msgid "Deliver Ambient Occlusion pass" -msgstr "Cấp vòng Che Khuất Bao Quanh" +msgstr "Thực hiện lượt về THTQXMT (Ambient Occlusion)" msgid "Deliver full combined RGBA buffer" -msgstr "Cấp toàn đệm gồm RGBA" +msgstr "Thực hiện sự kết hợp toàn thể bộ đệm RGBA" msgid "Deliver diffuse color pass" -msgstr "Cấp vòng màu tán xạ" +msgstr "Thực hiện lượt về màu khuếch tán" msgid "Deliver diffuse direct pass" -msgstr "Cấp vòng tán xạ trực tiếp" +msgstr "Thực hiện lượt về khuếch tán trực tiếp" msgid "Deliver diffuse indirect pass" -msgstr "Cấp vòng tán xạ gián tiếp" +msgstr "Thực hiện lượt về khuếch tán gián tiếp" msgid "Deliver emission pass" -msgstr "Cấp vòng phát xạ" +msgstr "Thực hiện lượt về phát xạ" msgid "Deliver environment lighting pass" -msgstr "Cấp vòng ạnh sáng môi trường" +msgstr "Thực hiện lượt về ánh sáng môi trường" msgid "Deliver glossy color pass" -msgstr "Cấp vòng màu bóng loáng" +msgstr "Thực hiện lượt về màu sắc của ánh bóng bẩy" msgid "Deliver glossy direct pass" -msgstr "Cấp vòng phản xạ bóng loáng trực tiếp" +msgstr "Thực hiện lượt về phản xạ ánh bóng bẩy trực tiếp" msgid "Deliver glossy indirect pass" -msgstr "Cấp vòng bóng loáng gián tiếp" +msgstr "Thực hiện lượt về ánh bóng bẩy gián tiếp" msgid "Deliver material index pass" -msgstr "Cấp vòng chỉ số vật liệu" +msgstr "Thực hiện lượt về chỉ số nguyên vật liệu" msgid "Deliver mist factor pass (0.0 to 1.0)" -msgstr "Cấp hệ số sương mù (0.0 đến 1.0)" +msgstr "Thực hiện lượt hệ số sương mù (0,0 đến 1,0)" msgid "Deliver normal pass" -msgstr "Cấp vòng pháp tuyến" +msgstr "Thực hiện lượt về pháp tuyến" + + +msgctxt "Scene" +msgid "Object Index" +msgstr "Chỉ Số Đối Tượng" msgid "Deliver object index pass" -msgstr "Cấp chỉ số vật thể" +msgstr "Thực hiện lượt về chỉ số đối tượng" msgid "Deliver position pass" -msgstr "Cấp vòng vị trí" +msgstr "Thực hiện lượt về vị trí" msgid "Deliver shadow pass" -msgstr "Cấp vòng bóng tối" +msgstr "Thực hiện lượt về bóng tối" msgid "Subsurface Color" -msgstr "Màu Hạ Bề Mặt" +msgstr "Màu Dưới Bề Mặt" msgid "Deliver subsurface color pass" -msgstr "Cấp vòng màu hạ bề mặt" +msgstr "Thực hiện lượt về màu dưới bề mặt" msgid "Subsurface Direct" -msgstr "Hạ Bề Mặt Trực Tiếp" +msgstr "Dưới Bề Mặt Trực Tiếp" msgid "Deliver subsurface direct pass" -msgstr "Cấp vòng hạ bề mặt trực tiếp" +msgstr "Thực hiện lượt về lớp dưới bề mặt trực tiếp" msgid "Subsurface Indirect" -msgstr "Hạ Bề Mặt Gián Tiếp" +msgstr "Dưới Bề Mặt Gián Tiếp" msgid "Deliver subsurface indirect pass" -msgstr "Xuất vòng hạ bề mặt gián tiếp" +msgstr "Thực hiện lượt về lớp dưới bề mặt gián tiếp" msgid "Deliver transmission color pass" -msgstr "Cấp vòng màu truyền gián tiếp" +msgstr "Thực hiện lượt về màu truyền xạ gián tiếp" msgid "Deliver transmission direct pass" -msgstr "Cấp vòng truyền trực tiếp" +msgstr "Thực hiện lượt về truyền xạ trực tiếp" msgid "Deliver transmission indirect pass" -msgstr "Cấp vòng truyền gián tiếp" +msgstr "Thực hiện lượt về truyền xạ gián tiếp" msgid "Deliver texture UV pass" -msgstr "Cấp vòng UV chất liệu" +msgstr "Thực hiện lượt về UV chất liệu" msgid "Deliver speed vector pass" -msgstr "Cấp vòng vectơ vận tốc" +msgstr "Thực hiện lượt về vectơ tốc độ" msgid "Deliver Z values pass" -msgstr "Cấp vòng giá trị Z" +msgstr "Thực hiện lượt về các giá trị Z" msgid "Sky" @@ -84339,11 +92793,11 @@ msgstr "Bầu Trời" msgid "Render Sky in this Layer" -msgstr "Kết xuất bầu trời trong Lớp này" +msgstr "Kết xuất Bầu Trời trong Tầng này" msgid "Render Solid faces in this Layer" -msgstr "Kết xuất lớp Mặt Rắn trong Lớp này" +msgstr "Kết xuất các mặt Đặc trong Tầng này" msgid "Strand" @@ -84351,43 +92805,47 @@ msgstr "Sợi" msgid "Render Strands in this Layer" -msgstr "Kết xuất Sợi trong Lớp này" +msgstr "Kết xuất các Sợi trong Tầng này" msgid "Render volumes in this Layer" -msgstr "Kết xuất các thể tích trong Lớp này" +msgstr "Kết xuất các thể tích trong Tầng Lớp này" msgid "Render Passes" -msgstr "Vòng Kết Xuất" +msgstr "Các Lượt Kết Xuất" msgid "Collection of render passes" -msgstr "Sưu tập vòng kết xuất" +msgstr "Bộ sưu tập các lượt kết xuất" msgid "Result of rendering, including all layers and passes" -msgstr "Kết qủa kết xuất, gồm tất cả lớp và vòng" +msgstr "Kết quả kết xuất, bao gồm toàn bộ các tầng và các lượt" msgid "Rendering settings for a Scene data-block" -msgstr "Cài đặt kết xuất cho một cục dữ liệu Cảnh" +msgstr "Sắp đặt kết xuất cho một khối dữ liệu Cảnh" msgid "Bias" -msgstr "Thành Kiến" +msgstr "Thiên Lệch" + + +msgid "Bias towards faces further away from the object (in Blender units)" +msgstr "Thiên lệch về phía các mặt nằm xa hơn đối tượng (trong đơn vị Blender)" msgid "Algorithm to generate the margin" -msgstr "Giải thuật cho chế tạo lề" +msgstr "Thuật toán sinh tạo lề" msgid "Number of samples used for ambient occlusion baking from multires" -msgstr "Số lượng mẫu vật cho che khuất bao quanh khi nướng từ đa phân giải" +msgstr "Số mẫu vật sử dụng cho quá trình nướng tính hấp thụ quang xạ môi trường từ đa phân giải" msgid "Choose shading information to bake into the image" -msgstr "Chọn thông tin tô sắc cho nướng vào ảnh" +msgstr "Chọn thông tin về tô bóng để nướng thành hình ảnh" msgid "Bake normals" @@ -84395,51 +92853,51 @@ msgstr "Nướng pháp tuyến" msgid "Bake displacement" -msgstr "Nướng dịch" +msgstr "Nướng sự dời hình" msgid "Instead of automatically normalizing to the range 0 to 1, apply a user scale to the derivative map" -msgstr "Thay thế tự động đơn vị hoá trong phạm vị 0 đến 1, áp dùng một phóng to người dùng cho bản đồ đạo hàm" +msgstr "Thay vì tự động bình thường hóa trong phạm vị từ 0 đến 1, thì áp dụng tỷ lệ người dùng vào ánh xạ chiết suất" msgid "Region Maximum X" -msgstr "X Cực Đại Của Vùng" +msgstr "Tối Đa X của Vùng" msgid "Maximum X value for the render region" -msgstr "Giá trị X cực đại cho vùng kết xuất" +msgstr "Giá trị X tối đa của vùng kết xuất" msgid "Region Maximum Y" -msgstr "Y Cực Đại Của Vùng" +msgstr "Tối Đa Y của Vùng" msgid "Maximum Y value for the render region" -msgstr "Giá trị Y cực đại cho vùng kết xuất" +msgstr "Giá trị Y tối đa của vùng kết xuất" msgid "Region Minimum X" -msgstr "X Cực Tiểu Của Vùng" +msgstr "Tối Thiểu X của Vùng" msgid "Minimum X value for the render region" -msgstr "Giá trị X cực tiểu cho vùng kết xuất" +msgstr "Giá trị X tối thiểu của vùng kết xuất" msgid "Region Minimum Y" -msgstr "Y Cực Tiểu Của Vùng" +msgstr "Tối Thiểu Y của Vùng" msgid "Minimum Y value for the render region" -msgstr "Giá trị Y cực tiểu cho kết xuất ranh giới" +msgstr "Giá trị Y tối thiểu của vùng kết xuất" msgid "Dither Intensity" -msgstr "Cường Độ Đẩu Động" +msgstr "Cường Độ Phối Màu" msgid "Amount of dithering noise added to the rendered image to break up banding" -msgstr "Mức huyên náo đẩu động thêm vào ảnh kết xuất cho phá vành" +msgstr "Lượng nhiễu phối màu thêm vào hình ảnh kết xuất để giảm bớt ảnh hưởng dải màu" msgid "Engine" @@ -84447,71 +92905,90 @@ msgstr "Động Cơ" msgid "Engine to use for rendering" -msgstr "Động cơ dùng cho kết xuất" +msgstr "Động cơ dùng cho việc kết xuất" msgid "The file extension used for saving renders" -msgstr "Đuổi tập tin cho lưu ảnh kết xuất" +msgstr "Đuôi tập tin dùng để lưu các bản kết xuất" + + +msgid "Directory/name to save animations, # characters define the position and padding of frame numbers" +msgstr "Thư mục/tên để lưu các hoạt họa, các ký tự # là để xác định vị trí và chèn đệm vào các số khung hình" msgid "World background is transparent, for compositing the render over another background" -msgstr "Nền thế giới trong suốt, dùng để ghép ảnh kết xuất trên một nền khác" +msgstr "Nền thế giới sẽ là trong suốt, nhằm để tổng hợp bản kết xuất trên một nền khác" msgid "Width over which the reconstruction filter combines samples" -msgstr "Bề rộng, nếu hơn, cho bộ lọc xây dựng lại được gồm mẫu vật" +msgstr "Chiều rộng mà bộ lọc khôi phục sử dụng để kết hợp các mẫu vật" msgid "FPS" -msgstr "Bức Ảnh/Giây" +msgstr "Khung Hình/Giây" msgid "Framerate, expressed in frames per second" -msgstr "Tốc độ bức ảnh (bức ảnh/giây)" +msgstr "Tấn số khung hình, biểu đạt trong số khung hình/giây" msgid "FPS Base" -msgstr "Cơ Sở Ảnh/Giây" +msgstr "Cơ Sở Khung Hình/Giây" msgid "Framerate base" -msgstr "Cơ sở tốc độ bức ảnh/giây" +msgstr "Cơ sở tần số khung hình/giây" msgid "Frame Map New" -msgstr "Ánh Xạ Bức Ảnh Mới" +msgstr "Ánh Xạ Khung Hình Mới" msgid "How many frames the Map Old will last" -msgstr "Số lượng bức ảnh cho kết thúc Ánh Xạ Cũ" +msgstr "Số lượng khung hình mà Ánh Xạ Cũ đổi thành" msgid "Frame Map Old" -msgstr "Ánh Xạ Bức Ảnh Cũ" +msgstr "Ánh Xạ Khung Hình Cũ" msgid "Old mapping value in frames" -msgstr "Giá trị ánh xạ cũ bằng số bức ảnh" +msgstr "Giá trị ánh xạ cũ trong số khung hình" msgid "Additional Subdivision" -msgstr "Phân Hóa Thêm" +msgstr "Mức Phân Chia Bổ Sung" msgid "Additional subdivision along the curves" -msgstr "Phân hóa thêm theo đường cong" +msgstr "Mức phân chia bổ sung dọc theo các đường cong" + + +msgctxt "Curves" +msgid "Curves Shape Type" +msgstr "Thể Loại Hình Dạng Đường Cong" msgid "Curves shape type" -msgstr "Loại hình dạng đường cong" +msgstr "Thể loại hình dạng đường cong" + + +msgctxt "Curves" +msgid "Strand" +msgstr "Sợi" + + +msgctxt "Curves" +msgid "Strip" +msgstr "Dải" msgid "Multiple Engines" -msgstr "Nhiều Động Cơ" +msgstr "Đa Động Cơ" msgid "More than one rendering engine is available" -msgstr "Có hơn một động cơ kết xuất để dùng" +msgstr "Có nhiều động cơ kết xuất có thể sử dụng được" msgid "Movie Format" @@ -84519,35 +92996,35 @@ msgstr "Định Dạng Phim" msgid "When true the format is a movie" -msgstr "Khi đúng, định dạng là phim" +msgstr "Khi giá trị là ĐÚNG thì định dạng là phim" msgid "Line thickness in pixels" -msgstr "Bề rộng (điểm ảnh)" +msgstr "Độ dày của đường nét trong số điểm ảnh" msgid "Line Thickness Mode" -msgstr "Chế Độ Bề Rộng Đường Nét" +msgstr "Chế Độ Độ Dày của Đường Nét" msgid "Line thickness mode for Freestyle line drawing" -msgstr "Chế độ bề rộng cho vẽ nét Phong Cách Tự Do " +msgstr "Chế độ độ dày của đường nét cho cách vẽ nét PCTD" msgid "Specify unit line thickness in pixels" -msgstr "Xác định bề rộng nét (điểm ảnh)" +msgstr "Xác định đơn vị độ dày của nét trong số điểm ảnh" msgid "Unit line thickness is scaled by the proportion of the present vertical image resolution to 480 pixels" -msgstr "Bề rộng nét đơn vị hóa được phóng to bởi tỉ lệ với độ phân giải của màn hiện tại đến 480 điểm ảnh" +msgstr "Đơn vị độ dày của nét được tỷ lệ hóa theo tương quan của độ phân giải chiều cao hiện tại của hình ảnh với 480 điểm ảnh (1,0 với 480px, 1,5 với 720px và 2,0 với 960px.)" msgid "Metadata Input" -msgstr "Ngõ Vào Siêu Dữ Liệu" +msgstr "Đầu Vào Siêu Dữ Liệu" msgid "Where to take the metadata from" -msgstr "Nguồn gốc của siêu dữ liệu" +msgstr "Lấy siêu dữ liệu từ đâu" msgid "Use metadata from the current scene" @@ -84555,119 +93032,119 @@ msgstr "Dùng siêu dữ liệu từ cảnh hiện tại" msgid "Sequencer Strips" -msgstr "Các Đoạn Trong Bộ Trình Tự" +msgstr "Dải của Trình Phối Hình" msgid "Use metadata from the strips in the sequencer" -msgstr "Dùng siêu dữ liệu từ các đoạn trong trình biên soạn trình tự" +msgstr "Dùng siêu dữ liệu từ các dải trong trình phối hình" msgid "Time taken in frames between shutter open and close" -msgstr "Thời gian để mở và đóng trập (đơn vị là bức ảnh)" +msgstr "Khoảng thời gian sử dụng giữa lúc màn trập đóng và mở, trong đơn vị khung hình" msgid "Curve defining the shutter's openness over time" -msgstr "Đường cong chỉ định độ mở của trập qua thời gian" +msgstr "Đường cong xác định độ mở của cửa chập theo thời gian" msgid "Pixel Aspect X" -msgstr "Tỉ Số Điểm Ảnh X" +msgstr "Tỷ Lệ Điểm Ảnh Chiều X" msgid "Horizontal aspect ratio - for anamorphic or non-square pixel output" -msgstr "Tỉ số cạnh ngang - cho xuất điểm ảnh dị hướng hay điểm ảnh không vuông" +msgstr "Tỷ lệ tương quan chiều ngang - dành cho đầu ra có điểm ảnh tiệm biến (biến dạng) hoặc không vuông" msgid "Pixel Aspect Y" -msgstr "Tỉ Số Điểm Ảnh Y" +msgstr "Tỷ Lệ Điểm Ảnh Chiều Y" msgid "Vertical aspect ratio - for anamorphic or non-square pixel output" -msgstr "Tỉ số cạnh dọc - cho xuất điểm ảnh dị hướng hay điểm ảnh không vuông" +msgstr "Tỷ lệ tương quan chiều dọc - dành cho đầu ra có điểm ảnh tiệm biến (biến dạng) hoặc không vuông" msgid "Pixel Size" -msgstr "Kích Cỡ Điểm Ảnh" +msgstr "Kích Thước Điểm Ảnh" msgid "Pixel size for viewport rendering" -msgstr "Kích thước điểm ảnh cho màn chiếu kết xuất" +msgstr "Kích thước điểm ảnh dành cho kết xuất cổng nhìn" msgid "Automatic pixel size, depends on the user interface scale" -msgstr "Kích thước điểm ảnh tự động, tùy phóng to của giao diện người dùng" +msgstr "Đổi kích thước điểm ảnh tự động tùy theo tỷ lệ trong giao diện của người dùng" msgid "Render at full resolution" -msgstr "Kết xuất ảnh dùng độ phân giải" +msgstr "Kết xuất với độ phân giải toàn phần" msgid "Render at 50% resolution" -msgstr "Kết xuất ảnh dùng 50% độ phân giải" +msgstr "Kết xuất với 50% độ phân giải" msgid "Render at 25% resolution" -msgstr "Kết xuất ảnh dùng 25% độ phân giải" +msgstr "Kết xuất với 25% độ phân giải" msgid "Render at 12.5% resolution" -msgstr "Kết xuất ảnh dùng 12.5% độ phân giải" +msgstr "Kết xuất với 12.5% độ phân giải" msgid "Resolution Scale" -msgstr "Tỉ Số Độ Phân Giải" +msgstr "Tỷ Lệ Độ Phân Giải" msgid "Percentage scale for render resolution" -msgstr "Phần trăm của độ phân giải kết xuất" +msgstr "Tỷ lệ phần trăm của độ phân giải kết xuất" msgid "Number of horizontal pixels in the rendered image" -msgstr "Số lượng điểm ảnh ngan (rộng) của ảnh kết xuất" +msgstr "Số lượng điểm ảnh theo chiều ngang của hình ảnh kết xuất" msgid "Number of vertical pixels in the rendered image" -msgstr "Số lượng điểm ảnh dọc (cao) của ảnh kết xuất" +msgstr "Số lượng điểm ảnh theo chiều dọc của hình ảnh kết xuất" msgid "Sequencer Preview Shading" -msgstr "Tô Sắc Dự Khán Bộ Trình Tự" +msgstr "Tô Bóng trong Xem Trước của Trình Phối Hình" msgid "Display method used in the sequencer view" -msgstr "Phương pháp hiển thị trong màn bộ trình tự" +msgstr "Phương pháp hiển thị sử dụng trong góc nhìn của trình phối hình" msgid "Display the object as wire edges" -msgstr "Hiển thị vạt thể như cạnh sợi dây" +msgstr "Hiển thị đối tượng như các mạch lưới" msgid "Display in solid mode" -msgstr "Hiển thị trong chế độ rắn" +msgstr "Hiển thị trong chế độ đặc (lập thể)" msgid "Display in Material Preview mode" -msgstr "Hiển thị trong chế độ Dự Khán Vật Liệu" +msgstr "Hiển thị trong chế độ Xem Trước Nguyên Vật Liệu" msgid "Display render preview" -msgstr "Hiển thị dự khán kết xuất" +msgstr "Hiển thị xem trước kết xuất" msgid "Simplify Child Particles" -msgstr "Đơn Giản Hóa Hạt Con Cái" +msgstr "Đơn Giản Hóa Con Cái Hạt" msgid "Global child particles percentage" -msgstr "Phần trăm của hạt con cái toàn cầu" +msgstr "Lượng phần trăm con cái hạt toàn cầu" msgid "Global child particles percentage during rendering" -msgstr "Phần trăm của hạt con cái toàn cầu khi kết xuất" +msgstr "Lượng phần trăm con cái hạt toàn cầu trong khi kết xuất" msgid "Simplify Grease Pencil drawing" -msgstr "Đơn Giản Hóa vẽ bằng Bút Sáp" +msgstr "Đơn giản hóa bản vẽ Bút Chì Dầu" msgid "Antialiasing" @@ -84675,39 +93152,47 @@ msgstr "Chống Răng Cưa" msgid "Use Antialiasing to smooth stroke edges" -msgstr "Dùng Chống Răng Cưa để mịn hóa cạnh nét" +msgstr "Sử dụng chống răng cưa để làm mịn các cạnh của nét vẽ" msgid "Display modifiers" -msgstr "Cụ Sửa Hiển Thị" +msgstr "Hiển Thị các Bộ Điều Chỉnh" msgid "Playback Only" -msgstr "Chỉ Hát Lại" +msgstr "Duy Chơi Lại" msgid "Simplify Grease Pencil only during animation playback" -msgstr "Đơn giản hóa Bút Sáp chỉ khi hát lại hoạt hình" +msgstr "Duy đơn giản hóa Bút Chì Dầu trong khi chơi lại hoạt họa" msgid "Display Shader Effects" -msgstr "Hiển Thị Hiệu Ứng Bộ Tô Sắc" +msgstr "Hiển Thị Hiệu Ứng của Bộ Tô Bóng" msgid "Layers Tinting" -msgstr "Nhiễm Màu Lớp" +msgstr "Nhuốm Màu Tầng Lớp" msgid "Display layer tint" -msgstr "Hiển thị màu nhiễm của lớp" +msgstr "Hiển thị màu nhuốm của tầng lớp" msgid "Display fill strokes in the viewport" -msgstr "Hiển thị nét tô đầy trong màn chiếu" +msgstr "Hiển thị các nét tô kín trong cổng nhìn" + + +msgid "Simplify Shadows" +msgstr "Đơn Giản Hóa Bóng Đổ" + + +msgid "Resolution percentage of shadows in viewport" +msgstr "Phần trăm độ phân giải của các bóng tối trong khung nhìn" msgid "Simplify Subdivision" -msgstr "Đơn Giản Hóa Phân Hóa" +msgstr "Đơn Giản Hóa Độ Phân Hóa" msgid "Global maximum subdivision level" @@ -84723,15 +93208,15 @@ msgstr "Đơn Giản Hóa Thể Tích" msgid "Resolution percentage of volume objects in viewport" -msgstr "Phần trăm độ phân giải của vật thể thể tích trong màn chiếu" +msgstr "Lượng phần trăm độ phân giải của các đối tượng thể tích trong cổng nhìn" msgid "Color to use behind stamp text" -msgstr "Màu cho của nền văn bản đóng dấu" +msgstr "Màu cho nền văn bản đóng dấu" msgid "Size of the font used when rendering stamp text" -msgstr "Kích cỡ của phông khi kết xuất văn bản đóng dấu" +msgstr "Kích thước phông sử dụng khi kết xuất văn bản đóng dấu" msgid "Text Color" @@ -84739,31 +93224,31 @@ msgstr "Màu Văn Bản" msgid "Color to use for stamp text" -msgstr "Màu dùng cho văn bản đóng dấu" +msgstr "Màu để sử dụng cho văn bản đóng dấu" msgid "Stamp Note Text" -msgstr "Đóng Dấu Văn Bản Tin Nhắn" +msgstr "Văn Bản Ghi Chú Đóng Dấu" msgid "Custom text to appear in the stamp note" -msgstr "Văn bản tùy chọn cho xuất hiện trong tin nhắn đóng dấu" +msgstr "Văn bản tùy chọn xuất hiện trong ghi chú đóng dấu" msgid "Render Views" -msgstr "Kết Xuất Các Màn" +msgstr "Kết Xuất các Góc Nhìn" msgid "Maximum number of CPU cores to use simultaneously while rendering (for multi-core/CPU systems)" -msgstr "Số lượng lõi CPU để dùng cùng một lượt khi kết xuất (cho hệ thống có đa lõi/CPU)" +msgstr "Số lượng lõi của Bộ Xử Lý sẽ sử dụng cùng một lúc trong khi kết xuất (dành cho những hệ thống có Bộ Xử Lý nhiều lõi)" msgid "Threads Mode" -msgstr "Chế Độ Tuyến" +msgstr "Chế Độ Đa Luồng" msgid "Determine the amount of render threads used" -msgstr "Xác định dùng bao nhiêu tuyến kết xuất" +msgstr "Xác định số lượng luồng kết xuất sử dụng" msgid "Auto-Detect" @@ -84771,75 +93256,75 @@ msgstr "Tự Động Phát Hiện" msgid "Automatically determine the number of threads, based on CPUs" -msgstr "Tự động chọn số lượng tuyến, tùy số lượng bộ xử lý" +msgstr "Tự động chọn số luồng, tùy theo bộ xử lý" msgid "Manually determine the number of threads" -msgstr "Xác định bằng tay số lượng tuyến" +msgstr "Tự xác định số luồng một cách thủ công" msgid "Clear Images before baking" -msgstr "Xóa Ành trước nướng" +msgstr "Xóa các Hình Ảnh trước khi nướng" msgid "Low Resolution Mesh" -msgstr "Mạng Lưới Độ Phân Giải Thấp" +msgstr "Khung Lưới Độ Phân Giải Thấp" msgid "Calculate heights against unsubdivided low resolution mesh" -msgstr "Tính bề cao đối với mạng lưới độ phân giải thấp chưa được phân hóa" +msgstr "Tính chiều cao dựa vào khung lưới có độ phân giải thấp chưa bị phân hóa" msgid "Bake from Multires" -msgstr "Nướng từ Đa Độ Phân Giải" +msgstr "Nướng Từ Đa Phân Giải" msgid "Bake directly from multires object" -msgstr "Nướng trực tiếp từ vật thể đa độ phân giải" +msgstr "Nướng trực tiếp từ đối tượng đa phân giải" msgid "User Scale" -msgstr "Phóng To Người Dùng" +msgstr "Tỷ lệ của người dùng" msgid "Use a user scale for the derivative map" -msgstr "Dùng một phóng to người dùng cho bản đồ đạo hàm" +msgstr "Dùng tỷ lệ của người dùng cho ánh xạ (sơ đồ) dẫn xuất" msgid "Render Region" -msgstr "Vùng Kết Xuất" +msgstr "Kết Xuất Vùng" msgid "Render a user-defined render region, within the frame size" -msgstr "Kết xuất một vùng ranh giới người dùng được xác định, ở trong khổ khung" +msgstr "Kết xuất vùng do người dùng xác định, nội trong kích thước của khung hình" msgid "Process the render result through the compositing pipeline, if compositing nodes are enabled" -msgstr "Xử lý kết qủa kết xuất xuyên đường ống ghép, nếu bật giao điểm ghép" +msgstr "Xử lý kết quả kết xuất dùng tiến trình tổng hợp, nếu sử dụng các nút tổng hợp" msgid "Crop to Render Region" -msgstr "Cắt Bớt Vừa Vùng Kết Xuất" +msgstr "Cắt vào Vùng Kết Xuất" msgid "Crop the rendered frame to the defined render region size" -msgstr "Cắt bớt khung ảnh được kết xuất cho vừa khổ của vùng kết xuất được xác định" - - -msgid "File Extensions" -msgstr "Đuôi Tập Tin" +msgstr "Cắt khung hình được kết xuất vào kích thước của vùng đã xác định" msgid "Add the file format extensions to the rendered file name (eg: filename + .jpg)" -msgstr "Kèm đuổi định dạng tập tin với tên tập tin kết xuất (ví dụ: tên tập tin + .jpg)" +msgstr "Kèm đuôi chỉ định dạng của hình ảnh với tên tập tin kết xuất (ví dụ: tên + .jpg)" + + +msgid "Use Freestyle" +msgstr "Sử Dụng Phong Cách Tự do" msgid "Draw stylized strokes using Freestyle" -msgstr "Vẽ nét có phong cách bằng Phong Cách Tự Do" +msgstr "Vẽ các nét đã sắp đặt mốt dùng PCTD (Phong Cách Tự Do)" msgid "Use high quality tangent space at the cost of lower performance" -msgstr "Dùng không gian tiếp tuyến chất lượng cao mặc dù giảm hiệu suất" +msgstr "Sử dụng không gian tiếp tuyến chất lượng cao tuy sẽ phải trải giá bằng hiệu suất thi hành thấp hơn" msgid "Lock Interface" @@ -84847,87 +93332,87 @@ msgstr "Khóa Giao Diện" msgid "Lock interface during rendering in favor of giving more memory to the renderer" -msgstr "Khóa giao diện khi kết xuất để cho giành bộ nhớ thêm cho bộ kết xuất" +msgstr "Khóa giao diện trong khi kết xuất để dành thêm bộ nhớ cho bộ kết xuất" msgid "Use multi-sampled 3D scene motion blur" -msgstr "Dùng da mẫu vật chuyển động mờ hóa cảnh 3D" +msgstr "Dùng sự nhòe mờ chuyển động cảnh 3D đa mẫu vật" msgid "Use multiple views in the scene" -msgstr "Dùng đa màn trong cảnh" +msgstr "Dùng đa góc nhìn trong cảnh" msgid "Overwrite existing files while rendering" -msgstr "Ghi trên tập tin có sẵn khi kết xuất" +msgstr "Viết đè lên các tập tin hiện có trong khi kết xuất" msgid "Persistent Data" -msgstr "Dữ Liệu Cố Chấp" +msgstr "Dữ Liệu Ổn Định" msgid "Keep render data around for faster re-renders and animation renders, at the cost of increased memory usage" -msgstr "Giữ lại dữ liệu kết xuất cho kết xuất lại và hoạt hình nhanh hơn, nhưng dùng bộ nhớ nhiều hơn" +msgstr "Duy trì dữ liệu kết xuất lại để tăng tốc quá trình tái kết xuất và kết xuất hoạt họa được nhanh hơn, tuy mức sử dụng bộ nhớ sẽ tăng lên" msgid "Placeholders" -msgstr "Chứa Chỗ" +msgstr "Giữ Chỗ" msgid "Create empty placeholder files while rendering frames (similar to Unix 'touch')" -msgstr "Chế tạo tập tin chứa chỗ khi kết xuất bức ảnh (giống như 'touch' (rở) của Unix)" +msgstr "Kiến Tạo tập tin giữ chỗ rỗng trong khi kết xuất các khung hình (giống như chức năng 'touch' (chạm/sờ) của Unix)" msgid "Cache Result" -msgstr "Chứa Kết Qủa" +msgstr "Lưu Kết Quả" msgid "Save render cache to EXR files (useful for heavy compositing, Note: affects indirectly rendered scenes)" -msgstr "Lưu đệm chứa kết xuất vào tập tin EXR (lợi ích cho ghép ảnh nặng, Chú ý: được ảnh hưởng cảnh kết xuất gián tiếp)" +msgstr "Lưu bộ nhớ đệm kết xuất vào tập tin EXR (Có lợi cho quá trình tổng hợp phức tạp. Để ý: gián tiếp ảnh hưởng cảnh kết xuất)" msgid "Process the render (and composited) result through the video sequence editor pipeline, if sequencer strips exist" -msgstr "Xử lý kết qủa kết xuất (và ảnh ghép lại) xuyên đường ống trình biên soạn trình tự video, nếu có đoạn trình tự hay video" +msgstr "Xử lý kết quả kết xuất (và tổng hợp) thông qua tiến trình của trình phối hình, nếu ở đó có tồn tại các dải phim" msgid "Override Scene Settings" -msgstr "Vượt Quyền Cài Đặt Cảnh" +msgstr "Vượt Quyền các Sắp Đặt của Cảnh" msgid "Use workbench render settings from the sequencer scene, instead of each individual scene used in the strip" -msgstr "Dùng cài đặt kết xuất của bàn công trình từ cảnh trình tự, thay thế mỗi cảnh riêng trong đoạn" +msgstr "Sử dụng các sắp đặt kết xuất workbench (kết xuất thử nghiệm trong khi làm việc) từ cảnh của trình phối hình, thay vì từng cá nhân cảnh riêng biệt sử dụng trong dải" msgid "Use Simplify" -msgstr "Dùng Đơn Giải Hóa" +msgstr "Đơn Giản Hóa" msgid "Enable simplification of scene for quicker preview renders" -msgstr "Bật đơn giải hóa cảnh cho kết xuất dự khán nhanh hơn" +msgstr "Cho phép đơn giản hóa cảnh để xem trước các bản kết xuất nhanh hơn" msgid "Render Single Layer" -msgstr "Kết Xuất Một Lớp" +msgstr "Kết Xuất Một Tầng Lớp" msgid "Only render the active layer. Only affects rendering from the interface, ignored for rendering from command line" -msgstr "Chỉ kết xuất lớp hoạt động. Chỉ ảnh hưởng kết xuất từ giao diện, không quan tâm kết xuất từ dòng lệnh" +msgstr "Duy kết xuất tầng đang hoạt động. Chỉ tác động đến quá trình kết xuất từ giao diện mà thôi, nếu kết xuất bằng dòng lệnh thì cái này sẽ bị bỏ qua" msgid "Use Spherical Stereo" -msgstr "Dùng Nhị Kênh Hình Cầu" +msgstr "Dùng Lập Thể Hình Cầu" msgid "Active render engine supports spherical stereo rendering" -msgstr "Động cơ kết xuất hoạt động được hỗ trợ kết xuất nhị kênh hình cầu" +msgstr "Bộ máy kết xuất đang hoạt động hỗ trợ kết xuất lập thể hình cầu" msgid "Stamp Output" -msgstr "Đóng Dấu" +msgstr "Đóng Dấu Kết Quả" msgid "Render the stamp info text in the rendered image" -msgstr "Kết xuất thông tin văn bản đóng dấu trong ảnh kết xuất" +msgstr "Kết xuất văn bản thông tin để đóng dấu trong hình ảnh kết xuất" msgid "Stamp Camera" @@ -84935,7 +93420,7 @@ msgstr "Đóng Dấu Máy Quay Phim" msgid "Include the name of the active camera in image metadata" -msgstr "Lưu tên của máy quay phim hoạt động trong trong siêu dữ liệu của ảnh" +msgstr "Bao gồm tên của máy quay phim đang hoạt động trong siêu dữ liệu của hình ảnh" msgid "Stamp Date" @@ -84943,43 +93428,43 @@ msgstr "Đóng Dấu Ngày Tháng" msgid "Include the current date in image/video metadata" -msgstr "Gồm ngày tháng năm hiện tại trong siêu dữ liệu của ảnh/video" +msgstr "Bao gồm ngày tháng hiện tại trong siêu dữ liệu của hình ảnh/video" msgid "Stamp Filename" -msgstr "Đóng Dấu Tên Tập Tin" +msgstr "Đóng Dấu Tên Tập" msgid "Include the .blend filename in image/video metadata" -msgstr "Gồm tên tập tin .blend trong siêu dữ liệu của ảnh/video" +msgstr "Bao gồm tên tập tin .blend trong siêu dữ liệu của hình ảnh/video" msgid "Stamp Frame" -msgstr "Đóng Dấu Bức Ảnh" +msgstr "Đóng Dấu Khung Hình" msgid "Include the frame number in image metadata" -msgstr "Lưu số bức ảnh trong siêu dữ liệu của ảnh" +msgstr "Bao gồm số khung hình trong siêu dữ liệu của hình ảnh" msgid "Include the rendered frame range in image/video metadata" -msgstr "Gồm phạm vi bức ảnh được kết xuất trong siêu dữ liệu của ảnh/video" +msgstr "Bao gồm phạm vi khung hình kết xuất trong siêu dữ liệu của hình ảnh/video" msgid "Stamp Hostname" -msgstr "Đóng Dấu Tên Máy" +msgstr "Rập Tên Máy" msgid "Include the hostname of the machine that rendered the frame" -msgstr "Gồm tên của máy vi tính được kết xuất bức ảnh" +msgstr "Bao gồm tên máy (hostname) đã kết xuất khung hình" msgid "Stamp Labels" -msgstr "Nhãn Đóng Dấu" +msgstr "Rập Nhãn Hiệu" msgid "Display stamp labels (\"Camera\" in front of camera name, etc.)" -msgstr "Hiển thị nhãn đóng dấu (\"Máy Quay Phim\" trước tên máy quay phim, v.v.)" +msgstr "Hiển thị các nhãn hiệu rập (\"Máy Quay Phim\" trước tên của máy quay phim, v.v.)" msgid "Stamp Lens" @@ -84987,27 +93472,27 @@ msgstr "Đóng Dấu Thấu Kính" msgid "Include the active camera's lens in image metadata" -msgstr "Lưu thấu kính của máy quay phim hoạt động trong siêu dữ liệu của ảnh" +msgstr "Bao gồm thấu kính của máy quay phim đang hoạt động trong siêu dữ liệu của ảnh" msgid "Stamp Marker" -msgstr "Đóng Dấu Ký Hiệu" +msgstr "Đóng Dấu Mốc" msgid "Include the name of the last marker in image metadata" -msgstr "Lưu tên của ký hiệu cuối cùng trong siêu dữ liệu của ảnh" +msgstr "Bao gồm tên của dấu mốc cuối cùng trong siêu dữ liệu của hình ảnh" msgid "Stamp Peak Memory" -msgstr "Đóng Dấu Bộ Nhớ Tốc Đỉnh" +msgstr "Đóng Dấu Lượng Bộ Nhớ" msgid "Include the peak memory usage in image metadata" -msgstr "Lưu số lượng bộ nhớ tốc đỉnh được sử dụng trong siêu dữ liệu ảnh" +msgstr "Bao gồm lượng bộ nhớ sử dụng tối đa trong siêu dữ liệu của hình ảnh" msgid "Include a custom note in image/video metadata" -msgstr "Gồm một ghi chú tùy chọn trong siêu dữ liệu của ảnh/video" +msgstr "Bao gồm lời ghi chú tự tạo trong siêu dữ liệu của hình ảnh/video" msgid "Stamp Render Time" @@ -85015,7 +93500,7 @@ msgstr "Đóng Dấu Thời Gian Kết Xuất" msgid "Include the render time in image metadata" -msgstr "Gồm thời gian kết xuất trong siêu dữ liệu của ảnh" +msgstr "Bao gồm thời gian kết xuất trong siêu dữ liệu của hình ảnh" msgid "Stamp Scene" @@ -85023,15 +93508,15 @@ msgstr "Đóng Dấu Cảnh" msgid "Include the name of the active scene in image/video metadata" -msgstr "Gồm tên của cảnh hoạt động trong siêu dữ liệu của ảnh/video" +msgstr "Bao gồm tên của cảnh đang hoạt động trong siêu dữ liệu của hình ảnh/video" msgid "Stamp Sequence Strip" -msgstr "Đóng Dấu Đoạn Trình Tự" +msgstr "Đóng Dấu Dải Trình tự" msgid "Include the name of the foreground sequence strip in image metadata" -msgstr "Gồm tên của đoạn trình tự cảnh trước trong siêu dữ liệu của ảnh" +msgstr "Bao gồm tên của dải trình tự nằm trước trong siêu dữ liệu của hình ảnh" msgid "Stamp Time" @@ -85039,19 +93524,19 @@ msgstr "Đóng Dấu Thời Gian" msgid "Include the rendered frame timecode as HH:MM:SS.FF in image metadata" -msgstr "Gồm mã thời gian bức ảnh kết xuất kiểu HH:MM:SS.FF (giờ:phút:giây.số bức ảnh) trong siêu dữ liệu của ảnh" +msgstr "Bao gồm mã thời gian của khung hình được kết xuất ở định dạng HH:MM:SS.FF (giờ:phút:giây.số khung hình) vào siêu dữ liệu của hình ảnh" msgid "Setup Stereo Mode" -msgstr "Chuẩn Bị Chế Độ Nhị Kênh" +msgstr "Thiết Lập Chế Độ Lập Thể" msgid "Single stereo camera system, adjust the stereo settings in the camera panel" -msgstr "Một hệ thống máy quay phim nhị kênh, chỉnh cài đặt nhị kênh trong bảng máy quay phim" +msgstr "Một hệ thống máy quay phim lập thể, điều chỉnh sắp đặt lập thể trong bảng về máy quay phim" msgid "Multi camera system, adjust the cameras individually" -msgstr "Hệ thống máy quay phim, chỉnh các máy quay phim riêng" +msgstr "Hệ thống nhiều máy quay phim, chỉnh sửa các máy quay phim riêng biệt" msgid "Render Slot" @@ -85059,7 +93544,7 @@ msgstr "Khe Kết Xuất" msgid "Parameters defining the render slot" -msgstr "Tham số để chỉ định khe kết xuất" +msgstr "Tham số định nghĩa khe kết xuất" msgid "Render slot name" @@ -85067,51 +93552,75 @@ msgstr "Tên khe kết xuất" msgid "Collection of render layers" -msgstr "Sưu tập lớp kết xuất" +msgstr "Bộ sưu tập các tầng kết xuất" msgid "Active render slot of the image" -msgstr "Khe kết xuất hoạt động của ảnh" +msgstr "Khe kết xuất đang hoạt động của hình ảnh" msgid "Render View" -msgstr "Màn Kết Xuất" +msgstr "Góc Nhìn Kết Xuất" msgid "Collection of render views" -msgstr "Sưu tập màn kết xuất" +msgstr "Bộ sưu tập các góc nhìn kết xuất" msgid "Active Render View" -msgstr "Màn Kết Xuất Hoạt Động" +msgstr "Góc Nhìn Kết Xuất đang Hoạt Động" msgid "Active View Index" -msgstr "Chi Số Màn Hoạt Động" +msgstr "Chỉ Số Góc Nhìn đang Hoạt Động" msgid "Active index in render view array" -msgstr "Chỉ số hoạt động trong mảng màn kết xuất" +msgstr "Chỉ số đang hoạt động trong mảng các góc nhìn kết xuất" + + +msgid "Repeat Item" +msgstr "Mục Lặp Lại" + + +msgid "Color of the corresponding socket type in the node editor" +msgstr "Màu của loại ổ cắm tương ứng trong trình biên soạn nút" + + +msgid "Retiming Key" +msgstr "Khóa Tính Lại Thời Gian" + + +msgid "Key mapped to particular frame that can be moved to change playback speed" +msgstr "Khóa được ánh xạ tới khung hình cụ thể nào đó, tức cái có thể di chuyển được, để thay đổi tốc độ chơi lại" + + +msgid "Position of retiming key in timeline" +msgstr "Vị trí của khóa tính lại thời gian trong dòng thời gian" + + +msgid "Collection of RetimingKey" +msgstr "Bộ Sưu Tập của Khóa Tính Lại Thời Gian" msgid "Constraint influencing Objects inside Rigid Body Simulation" -msgstr "Ràng buộc được ảnh hưởng Vật Thể trong Mô Phỏng Thân Rắn" +msgstr "Ràng buộc ảnh hưởng các Đối Tượng trong Mô Phỏng Thân Cứng" msgid "Breaking Threshold" -msgstr "Ngưỡng Bể" +msgstr "Giới Hạn Phá Hủy" msgid "Impulse threshold that must be reached for the constraint to break" -msgstr "Ngưỡng xung lượng phải qua cho ràng buộc được bể" +msgstr "Giới hạn xung lượng cần phải đạt tới trước khi ràng buộc bị phá hủy" msgid "Disable Collisions" -msgstr "Tắt Va Chạm" +msgstr "Tắt Va Đập" msgid "Disable collisions between constrained rigid bodies" -msgstr "Tắt va chạm giữa thân rắn bị ràng buộc" +msgstr "Tắt va đập giữa các thân cứng bị ràng buộc" msgid "Enable this constraint" @@ -85119,107 +93628,107 @@ msgstr "Bật ràng buộc này" msgid "Lower X Angle Limit" -msgstr "Hạn Chế Góc X Thấp" +msgstr "Giới Hạn Góc Dưới của X" msgid "Lower limit of X axis rotation" -msgstr "Giới hạn xoay thấp quanh trục " +msgstr "Giới hạn dưới của xoay chiều quanh trục X" msgid "Upper X Angle Limit" -msgstr "Hạn Chế Góc X Cao" +msgstr "Giới Hạn Góc Trên của X" msgid "Upper limit of X axis rotation" -msgstr "Giới hạn xoay cao quanh trục X" +msgstr "Giới hạn trên của sự xoay chiều quanh trục X" msgid "Lower Y Angle Limit" -msgstr "Hạn Chế Góc Y Thấp" +msgstr "Giới Hạn Góc Dưới của Y" msgid "Lower limit of Y axis rotation" -msgstr "Giới hạn xoay thấp quanh trục Y" +msgstr "Giới hạn dưới của sự xoay chiều quanh trục Y" msgid "Upper Y Angle Limit" -msgstr "Hạn Chế Góc X Cao" +msgstr "Giới Hạn Góc Trên của X" msgid "Upper limit of Y axis rotation" -msgstr "Giới hạn xoay cao quanh trục Y" +msgstr "Giới hạn trên của sự xoay chiều quanh trục Y" msgid "Lower Z Angle Limit" -msgstr "Hạn Chế Góc Z Thấp" +msgstr "Giới Hạn Góc Dưới của Z" msgid "Lower limit of Z axis rotation" -msgstr "Giới hạn xoay thấp quanh trục Z" +msgstr "Giới hạn dưới của sự xoay chiều quanh trục Z" msgid "Upper Z Angle Limit" -msgstr "Hạn Chế Góc Z Cao" +msgstr "Giới Hạn Góc Trên của Z" msgid "Upper limit of Z axis rotation" -msgstr "Giới hạn xoay cao quanh trục Z" +msgstr "Giới hạn trên của sự xoay chiều quanh trục Z" msgid "Lower X Limit" -msgstr "Hạn Chế X Thấp" +msgstr "Giới Hạn Dưới của X" msgid "Lower limit of X axis translation" -msgstr "Giới hạn dịch thấp hướng trục X" +msgstr "Giới hạn dưới của dịch chuyển theo trục X" msgid "Upper X Limit" -msgstr "Hạn Chế X Cao" +msgstr "Giới Hạn Trên của X" msgid "Upper limit of X axis translation" -msgstr "Giới hạn dịch cao hướng trục X" +msgstr "Giới hạn trên của dịch chuyển theo trục X" msgid "Lower Y Limit" -msgstr "Hạn Chế Y Thấp" +msgstr "Giới Hạn Dưới của Y" msgid "Lower limit of Y axis translation" -msgstr "Giới hạn dịch thấp hướng trục Y" +msgstr "Giới hạn dưới của dịch chuyển theo trục Y" msgid "Upper Y Limit" -msgstr "Hạn Chế X Cao" +msgstr "Giới Hạn Trên của Y" msgid "Upper limit of Y axis translation" -msgstr "Giới hạn dịch cao hướng trục Y" +msgstr "Giới hạn trên của dịch chuyển theo trục Y" msgid "Lower Z Limit" -msgstr "Hạn Chế Z Thấp" +msgstr "Giới Hạn Dưới của Z" msgid "Lower limit of Z axis translation" -msgstr "Giới hạn dịch thấp hướng trục Z" +msgstr "Giới hạn dưới của dịch chuyển theo trục Z" msgid "Upper Z Limit" -msgstr "Hạn Chế Z Thấp" +msgstr "Giới Hạn Trên của Z" msgid "Upper limit of Z axis translation" -msgstr "Giới hạn dịch cao hướng trục Z" +msgstr "Giới hạn trên của dịch chuyển theo trục Z" msgid "Max Impulse" -msgstr "Xung Lượng Cực Đại" +msgstr "Xung Lượng Tối Đa" msgid "Maximum angular motor impulse" -msgstr "Xung lượng góc cực đại đường thẳng của động cơ" +msgstr "Xung lượng góc tối đa tuyến tính của mô tơ" msgid "Target Velocity" @@ -85227,87 +93736,87 @@ msgstr "Vận Tốc Mục Tiêu" msgid "Target angular motor velocity" -msgstr "Vận tốc góc mục tiêu của động cơ" +msgstr "Vận tốc góc mục tiêu của mô tơ" msgid "Maximum linear motor impulse" -msgstr "Xung lượng cực đại đường thẳng của động cơ" +msgstr "Xung lượng tối đa tuyến tính của mô tơ" msgid "Target linear motor velocity" -msgstr "Vận tốc đường thẳng mục tiêu của động cơ" +msgstr "Vận tốc tuyến tính mục tiêu của mô tơ" msgid "Object 1" -msgstr "Vật Thể 1" +msgstr "Đối Tượng 1" msgid "First Rigid Body Object to be constrained" -msgstr "Vật Thể Thân Rắn Thứ Nhất để ràng buộc" +msgstr "Đối Tượng Thân Cứng thứ nhất bị ràng buộc" msgid "Object 2" -msgstr "Vật Thể 2" +msgstr "Đối Tượng 2" msgid "Second Rigid Body Object to be constrained" -msgstr "Vật Thể Thân Rắn Thứ Nhị để ràng buộc" +msgstr "Đối Tượng Thân Cứng thứ hai bị ràng buộc" msgid "Solver Iterations" -msgstr "Lặp Lại Trình Giải Nghiệm" +msgstr "Số Lần Lặp Lại Giải Nghiệm" msgid "Number of constraint solver iterations made per simulation step (higher values are more accurate but slower)" -msgstr "Số lượng lặp lại tính cho mỗi bước mô phỏng (càng cao càng chính xác nhưng chậm hơn)" +msgstr "Số lần lặp lại giải nghiệm của ràng buộc được thi hành cho mỗi bước mô phỏng (giá trị càng cao thì càng chính xác nhưng chậm hơn)" msgid "Damping X Angle" -msgstr "Tắt Dần Góc X" +msgstr "Giảm Chấn Góc X" msgid "Damping on the X rotational axis" -msgstr "Tắt dần quanh trục X" +msgstr "Giảm chấn trên trục xoay chiều X" msgid "Damping Y Angle" -msgstr "Tắt Dần Góc Y" +msgstr "Giảm Chấn Góc Y" msgid "Damping on the Y rotational axis" -msgstr "Tắt dần quanh trục Y" +msgstr "Giảm chấn trên trục xoay chiều Y" msgid "Damping Z Angle" -msgstr "Tắt Dần Góc Z" +msgstr "Giảm Chấn Góc Z" msgid "Damping on the Z rotational axis" -msgstr "Tắt dần quanh trục Z" +msgstr "Giảm chấn trên trục xoay chiều Z" msgid "Damping X" -msgstr "Tắt Dần X" +msgstr "Giảm Chấn X" msgid "Damping on the X axis" -msgstr "Tắt dần hướng trục X" +msgstr "Giảm chấn trên trục X" msgid "Damping Y" -msgstr "Tắt Dần Y" +msgstr "Giảm Chấn Y" msgid "Damping on the Y axis" -msgstr "Tắt dần hướng trục Y" +msgstr "Giảm chấn trên trục Y" msgid "Damping Z" -msgstr "Tắt Dần Z" +msgstr "Giảm Chấn Z" msgid "Damping on the Z axis" -msgstr "Tắt dần hướng trục Z" +msgstr "Giảm chấn trên trục Z" msgid "X Angle Stiffness" @@ -85315,15 +93824,15 @@ msgstr "Độ Cứng Góc X" msgid "Stiffness on the X rotational axis" -msgstr "Độ cứng xoay quanh trục X" +msgstr "Độ cứng trên trục xoay chiều X" msgid "Y Angle Stiffness" -msgstr "Độ cứng quanh trục Y" +msgstr "Độ Cứng Góc Y" msgid "Stiffness on the Y rotational axis" -msgstr "Độ cứng xoay quanh trục Y" +msgstr "Độ cứng trên trục xoay chiều Y" msgid "Z Angle Stiffness" @@ -85331,7 +93840,7 @@ msgstr "Độ Cứng Góc Z" msgid "Stiffness on the Z rotational axis" -msgstr "Độ cứng xoay quanh trục Z" +msgstr "Độ cứng trên trục xoay chiều Z" msgid "X Axis Stiffness" @@ -85339,7 +93848,7 @@ msgstr "Độ Cứng Trục X" msgid "Stiffness on the X axis" -msgstr "Độ cứng hướng trục X" +msgstr "Độ cứng trên trục xoay X" msgid "Y Axis Stiffness" @@ -85347,7 +93856,7 @@ msgstr "Độ Cứng Trục Y" msgid "Stiffness on the Y axis" -msgstr "Độ cứng hướng trục Y" +msgstr "Độ cứng trên trục xoay Y" msgid "Z Axis Stiffness" @@ -85355,39 +93864,43 @@ msgstr "Độ Cứng Trục Z" msgid "Stiffness on the Z axis" -msgstr "Độ cứng hướng trục Z" +msgstr "Độ cứng trên trục xoay Z" msgid "Spring Type" -msgstr "Loại Lò Xo" +msgstr "Kiểu Lực Đàn Hồi" msgid "Which implementation of spring to use" -msgstr "Dùng thực hành nào của lò xo" +msgstr "Bản thực hiện về lực đàn hồi (lò xo) nào sẽ được sử dụng" msgid "Blender 2.7" msgstr "Blender 2.7" +msgid "Spring implementation used in Blender 2.7. Damping is capped at 1.0" +msgstr "Bản thực hiện về lực đàn hồi (lò xo) sử dụng trong Blender 2.7. Giảm chấn không thể vượt quá giá trị 1.0" + + msgid "Blender 2.8" msgstr "Blender 2.8" msgid "New implementation available since 2.8" -msgstr "Thực hành mới của Blender 2.8" +msgstr "Bản thực hiện mới có thể sử dụng được từ phiên bản 2.8" msgid "Type of Rigid Body Constraint" -msgstr "Loại Ràng buộc Thân Rắn" +msgstr "Kiểu Ràng Buộc Thân Cứng" msgid "Breakable" -msgstr "Có Thể Bể" +msgstr "Có Thể Bị Phá Hủy" msgid "Constraint can be broken if it receives an impulse above the threshold" -msgstr "Ranh buộc có thể bể nếu nó gặp xung lượng hơn ngưỡng này" +msgstr "Ràng buộc có thể bị phá hủy nếu nó nhận được một xung cao hơn giới hạn" msgid "X Angle" @@ -85395,7 +93908,7 @@ msgstr "Góc X" msgid "Limit rotation around X axis" -msgstr "Hạn chế xoay quanh trục X" +msgstr "Hạn chế xoay chiều quanh trục X" msgid "Y Angle" @@ -85403,7 +93916,7 @@ msgstr "Góc Y" msgid "Limit rotation around Y axis" -msgstr "Hạn chế xoay quanh trục Y" +msgstr "Hạn chế xoay chiều quanh trục Y" msgid "Z Angle" @@ -85411,155 +93924,155 @@ msgstr "Góc Z" msgid "Limit rotation around Z axis" -msgstr "Hạn chế xoay quanh trục Z" +msgstr "Hạn chế xoay chiều quanh trục Z" msgid "Limit translation on X axis" -msgstr "Hạn chế dịch hướng trục X" +msgstr "Hạn chế dịch chuyển trên hướng trục X" msgid "Limit translation on Y axis" -msgstr "Hạn chế dịch hướng trục Y" +msgstr "Hạn chế dịch chuyển trên hướng trục Y" msgid "Limit translation on Z axis" -msgstr "Hạn chế dịch hướng trục Z" +msgstr "Hạn chế dịch chuyển trên hướng trục Z" msgid "Angular Motor" -msgstr "Động Cơ Xoay" +msgstr "Mô Tơ Góc" msgid "Enable angular motor" -msgstr "Bật động cơ xoay" +msgstr "Bật Mô Tơ Góc" msgid "Linear Motor" -msgstr "Động Cơ Đường Thẳng" +msgstr "Mô Tơ Tuyến Tính" msgid "Enable linear motor" -msgstr "Bật dợng cơ đường thẳng" +msgstr "Bật mô tơ tuyến tính" msgid "Override Solver Iterations" -msgstr "Vượt Quyền Lặp Lại Trình Giải Nghiệm" +msgstr "Đổi Số Lần Lặp Lại Giải Nghiệm" msgid "Override the number of solver iterations for this constraint" -msgstr "Vượt quyền số lần lặp lại của trình giải nghiệm cho ràng buộc này" +msgstr "Đổi số lần lặp lại giải nghiệm cho ràng buộc này" msgid "X Angle Spring" -msgstr "Lò Xo Góc X" +msgstr "Lực Đàn Hồi Góc X" msgid "Enable spring on X rotational axis" -msgstr "Bật lò xo cho xoay quanh trục X" +msgstr "Cho phép lực đàn hồi trên trục xoay X" msgid "Y Angle Spring" -msgstr "Lò Xo Góc Y" +msgstr "Lực Đàn Hồi Góc Y" msgid "Enable spring on Y rotational axis" -msgstr "Bật lò xo cho xoay quanh trục Y" +msgstr "Cho phép lực đàn hồi trên trục xoay chiều Y" msgid "Z Angle Spring" -msgstr "Lò Xo Góc Z" +msgstr "Lực Đàn Hồi Góc Z" msgid "Enable spring on Z rotational axis" -msgstr "Bật lò xo cho xoay quanh trục Z" +msgstr "Cho phép lực đàn hồi trên trục xoay chiều Z" msgid "X Spring" -msgstr "Lò Xo X" +msgstr "Lực Đàn Hồi X" msgid "Enable spring on X axis" -msgstr "Bật lò xo hướng trục X" +msgstr "Cho phép lực đàn hồi trên trục X" msgid "Y Spring" -msgstr "Lò Xo Y" +msgstr "Lực Đàn Hồi Y" msgid "Enable spring on Y axis" -msgstr "Bật lò xo hướng trục Y" +msgstr "Cho phép lực đàn hồi trên trục Y" msgid "Z Spring" -msgstr "Lò Xo Z" +msgstr "Lực Đàn Hồi Z" msgid "Enable spring on Z axis" -msgstr "Bật lò xo hướng trục Z" +msgstr "Cho phép lực đàn hồi trên trục Z" msgid "Rigid Body Object" -msgstr "Vật Thể Thân Rắn" +msgstr "Đối Tượng Thân Cứng" msgid "Settings for object participating in Rigid Body Simulation" -msgstr "Cài đặt cho vật thể tham gia mô phỏng thân rắn" +msgstr "Sắp đặt cho đối tượng tham gia Mô Phỏng Thân Cứng" msgid "Angular Damping" -msgstr "Tắt Dần Góc" +msgstr "Giảm Chấn Góc" msgid "Amount of angular velocity that is lost over time" -msgstr "Số lượng vận tốc góc được mất qua thời gian" +msgstr "Lượng vận tốc góc suy thoái theo thời gian" msgid "Collision Collections" -msgstr "Sưu Tập Va Chạm" +msgstr "Bộ Sưu Tập Va Đập" msgid "Collision collections rigid body belongs to" -msgstr "Các sưu tập va chạm đang sở hữu Thân Rắn" +msgstr "Bộ sưu tập va đập mà thân cứng trực thuộc" msgid "Collision Margin" -msgstr "Lề Va Chạm" +msgstr "Lề Va Đập" msgid "Threshold of distance near surface where collisions are still considered (best results when non-zero)" -msgstr "Ngưỡng khoảng cách gần mặt vật thể mà vẫn còn va chạm nhau (tốt nhất khi khác 0)" +msgstr "Khoảng cách giới hạn từ bề mặt của đối tượng nơi sự va đập được phép xảy ra (kết quả tốt nhất khi khác 0)" msgid "Collision Shape" -msgstr "Hình Dạng Va Chậm" +msgstr "Hình Dạng Khối Va Đập" msgid "Collision Shape of object in Rigid Body Simulations" -msgstr "Hình Dạng Va Chạm của vật thể trong Mô Phỏng Thân Rắn" +msgstr "Hình Dạng Va Đập của đối tượng trong Mô Phỏng Thân Cứng" msgid "Angular Velocity Deactivation Threshold" -msgstr "Ngưỡng Vận Tốc Góc Tắt Hoạt Động" +msgstr "Vận Tốc Góc Giới Hạn trước khi Giải Hoạt" msgid "Angular Velocity below which simulation stops simulating object" -msgstr "Ngừng mô phỏng cho vật thể nào có vận tốc góc chậm hơn này" +msgstr "Vận Tốc Góc mà dưới nó bộ mô phỏng sẽ ngưng đối tượng được mô phỏng" msgid "Linear Velocity Deactivation Threshold" -msgstr "Ngưỡng Vận Tốc Đường Thẳng Tắt Hoạt Dộng" +msgstr "Vận Tốc Tuyến Tính Giới Hạn trước khi Giải Hoạt" msgid "Linear Velocity below which simulation stops simulating object" -msgstr "Ngưng mô phỏng cho vật thể nào có vận tốc đường thẳng chậm hơn này" +msgstr "Vận Tốc Tuyến Tính mà dưới nó bộ mô phỏng sẽ ngưng đối tượng được mô phỏng" msgid "Rigid Body actively participates to the simulation" -msgstr "Thân Rắn hoạt động tham gia mô phỏng" +msgstr "Thân Cứng Năng Động tham gia mô phỏng" msgid "Resistance of object to movement" -msgstr "Cản trở di chuyển của vật thể" +msgstr "Trở lực của đối tượng trong chuyển động" msgid "Kinematic" @@ -85567,103 +94080,103 @@ msgstr "Động Học" msgid "Allow rigid body to be controlled by the animation system" -msgstr "Cho hệ thống hoạt hình quản lý vật thể rắn" +msgstr "Cho phép hệ thống hoạt họa quản lý thân cứng" msgid "Linear Damping" -msgstr "Tắt Dần Bật Một" +msgstr "Giảm Chấn Tuyến Tính" msgid "Amount of linear velocity that is lost over time" -msgstr "Mức vận tốc đường thẳng được mất sau thời gian lâu" +msgstr "Vận tốc tuyến tính sẽ bị suy thoái theo thời gian" msgid "How much the object 'weighs' irrespective of gravity" -msgstr "'Nặng lượng' của vật thể không kể hấp dẫn" +msgstr "'Trọng lượng' của đối tượng, không kể trọng lực" msgid "Mesh Source" -msgstr "Nguồn Mạng Lưới" +msgstr "Khung Lưới Nguồn" msgid "Source of the mesh used to create collision shape" -msgstr "Nguồn mạng lưới dùng cho chế tạo hình dạng va chạm" +msgstr "Khung lưới nguồn được dùng để kiến tạo hình dạng va đập" msgid "Base mesh" -msgstr "Mạng lưới cơ sở" +msgstr "Khung Lưới Cơ Sở" msgid "Deformations (shape keys, deform modifiers)" -msgstr "Mèo Hóa (hình dạng mẫu, cụ sửu đổi méo hóa)" +msgstr "Biến dạng (các hình mẫu, các bộ điều chỉnh biến dạng)" msgid "All modifiers" -msgstr "Tất cả bộ điều chỉnh" +msgstr "Toàn bộ các bộ điều chỉnh" msgid "Bounciness" -msgstr "Độ Nhồi" +msgstr "Tính Bật Nẩy" msgid "Tendency of object to bounce after colliding with another (0 = stays still, 1 = perfectly elastic)" -msgstr "Sức nhồi lại của vật thể sau va chạm vật thể khác (0 = đứng yên, 1 = hoàn toàn dẻo)" +msgstr "Xu hướng bật nảy của đối tượng sau khi va đập với đối tượng khác (0 = đứng yên, 1 = hoàn toàn đàn hồi)" msgid "Role of object in Rigid Body Simulations" -msgstr "Nhiệm vụ của vật thể trong Mô Phỏng Thân Rắn" +msgstr "Vai trò của đối tượng trong Mô Phỏng Thân Cứng" msgid "Enable Deactivation" -msgstr "Bật Tắt Hoạt Động" +msgstr "Cho Phép Giải Hoạt" msgid "Enable deactivation of resting rigid bodies (increases performance and stability but can cause glitches)" -msgstr "Bật tắt hoạt động cho thân rắn không chuyển động (tăng hiệu qủa và sự ổn định nhưng có thể tạo sai lầm)" +msgstr "Cho phép giải hoạt những thân cứng đang ở trạng thái nghỉ (tăng hiệu suất thi hành và sự ổn định, song có thể sinh ra những sai lầm)" msgid "Deforming" -msgstr "Được Méo Hóa" +msgstr "Biến Dạng" msgid "Rigid body deforms during simulation" -msgstr "Thân rắn có thể bị méo trong mô phỏng" +msgstr "Thân cứng biến dạng trong quá trình mô phỏng" msgid "Use custom collision margin (some shapes will have a visible gap around them)" -msgstr "Dùng lề tùy chọn (vài hình dạng sẽ có cách trống bao quanh họ )" +msgstr "Dùng lề va đập tùy chọn (một số hình dạng sẽ có khoảng trống có thể thấy được bao quanh chúng )" msgid "Start Deactivated" -msgstr "Bắt Đầu Tắt" +msgstr "Giải Hoạt Khi Bắt Đầu" msgid "Deactivate rigid body at the start of the simulation" -msgstr "Tắt hoạt động của thân rắn khi bắt đầu mô phỏng" +msgstr "Giải hoạt thân cứng khi bắt đầu mô phỏng" msgid "Self-contained rigid body simulation environment and settings" -msgstr "Môi trường và cài đặt mô phỏng thân rắn kín đào" +msgstr "Sắp đặt và môi trường của mô phỏng thân cứng độc lập" msgid "Collection containing objects participating in this simulation" -msgstr "Sưu tập đang sở hữu vật thể đang tham gia trong mô phỏng này" +msgstr "Bộ sưu tập chứa các đối tượng tham gia vào mô phỏng này" msgid "Collection containing rigid body constraint objects" -msgstr "Sưu tập đang sở hữu vật thể ràng buộc thân rắn" +msgstr "Bộ sưu tập chứa các đối tượng ràng buộc thân cứng" msgid "Simulation will be evaluated" -msgstr "Sẽ tính toán mô phỏng" +msgstr "Mô phỏng sẽ được tính toán" msgid "Substeps Per Frame" -msgstr "Hạ Bước Từng Bức Ảnh" +msgstr "Số Bước Phụ Mỗi Giây" msgid "Number of simulation steps taken per frame (higher values are more accurate but slower)" -msgstr "Số lượng bước mô phỏng được tính mỗi bức ảnh (giá trị càng cao càng chính xác nhưng càng chậm)" +msgstr "Số lượng bước mô phỏng thi hành trong mỗi giây (giá trị càng cao thì càng chính xác, nhưng chậm hơn)" msgid "Change the speed of the simulation" @@ -85671,27 +94184,27 @@ msgstr "Đổi tốc độ của mô phỏng" msgid "Split Impulse" -msgstr "Chẻ Xung Lục" +msgstr "Phân Tách Xung Lực" msgid "Reduce extra velocity that can build up when objects collide (lowers simulation stability a little so use only when necessary)" -msgstr "Giảm vận tốc dư có thể xuất hiện khi vật thể va chạm nhau (nó giảm sự ổn định của mô phỏng một chút cho nên chỉ dùng khi cần)" +msgstr "Thuyên giảm sự gia tăng của tốc lực có khả năng xuất hiện và tăng tiến khi các đối tượng va đập với nhau (sẽ hạ thấp sự ổn định của mô phỏng một chút, cho nên chỉ dùng khi cần thiết mà thôi)" msgid "Settings for particle fluids physics" -msgstr "Cài đặt cho vật lý hạt chất lỏng" +msgstr "Sắp đặt cho vật lý chất lỏng dùng hệ thống hạt" msgid "Buoyancy" -msgstr "Lực Nổi" +msgstr "Độ Nổi" msgid "Artificial buoyancy force in negative gravity direction based on pressure differences inside the fluid" -msgstr "Lực nổi giả nghịch hướng với hấp dẫn tùy chênh lẹch áp suất trong chất lỏng" +msgstr "Lực nổi nhân tạo nghịch hướng với trọng lực dựa trên sự chênh lệch về áp lực nội bên trong chất lỏng" msgid "Interaction Radius" -msgstr "Bán Kín Tương tác" +msgstr "Bán Kính Tương Tác" msgid "Fluid interaction radius" @@ -85699,95 +94212,95 @@ msgstr "Bán kính tương tác cho chất lỏng" msgid "Linear viscosity" -msgstr "Độ Nhớt Bậc Một" +msgstr "Độ nhớt tuyến tính" msgid "Plasticity" -msgstr "Độ Nhựa" +msgstr "Tính Mềm Dẻo" msgid "How much the spring rest length can change after the elastic limit is crossed" -msgstr "Bề dài nghỉ ngơi của lò xo có thể đổi bao nhiêu sau qua giới hạn giãn" +msgstr "Lượng thay đổi của đoạn ở trạng thái nghỉ trong lực đàn hồi khi giới hạn kéo giãn bị giao thoa" msgid "Repulsion Factor" -msgstr "Hệ Số Đẩy Lui" +msgstr "Hệ Số Lực Đẩy" msgid "How strongly the fluid tries to keep from clustering (factor of stiffness)" -msgstr "Sức chất lỏng chống bó lại (hệ số của độ cứng)" +msgstr "Sức chất lỏng chống trả khả năng hợp lại (tỉ số của độ cứng)" msgid "Rest Density" -msgstr "Tỉ Trọng Nghỉ" +msgstr "Tỷ Trọng Nghỉ" msgid "Fluid rest density" -msgstr "Tỉ trọng nghỉ của chất lỏng" +msgstr "Tỷ trọng (ở trạng thái) nghỉ của chất lỏng" msgid "Spring rest length (factor of particle radius)" -msgstr "Bề dài nghỉ lò xo (hệ số của bán kính hạt)" +msgstr "Chiều dài của đoạn ở trạng thái nghỉ của lực đàn hồi (hệ số của bán kính hạt)" msgid "SPH Solver" -msgstr "Trình Giải Nghiệm SPH" +msgstr "Giải Nghiệm SPH" msgid "The code used to calculate internal forces on particles" -msgstr "Mã lập trình nào để tính lực nội bộ được tác dụng trên hạt" +msgstr "Mã lập trình sử dụng để tính các lực tác động bên trong hệ thống hạt" msgid "Double-Density" -msgstr "Mật Độ Đôi" +msgstr "Tỷ Trọng Nhân Đôi" msgid "An artistic solver with strong surface tension effects (original)" -msgstr "Một trình giải nghiệm nghệ thuật có hiệu ứng lực kéo mặt mạnh (ban đầu)" +msgstr "Giải nghiệm nghệ thuật với hiệu ứng kéo giãn mạnh bề mặt (gốc/nguyên thủy) (Double-Density Relaxation Algorithm)" msgid "Classical" -msgstr "Cổ Tích" +msgstr "Kinh-Điển" msgid "A more physically-accurate solver" -msgstr "Một trình giải nghiệm theo vật lý thật tế hơn" +msgstr "Một giải nghiệm vật lý chính xác hơn" msgid "Spring Force" -msgstr "Lực Lò Xo" +msgstr "Lực Đàn Hồi" msgid "Spring force" -msgstr "Lực lò xo" +msgstr "Lực đàn hồi (Co Giãn)" msgid "Spring Frames" -msgstr "Bức Ảnh Lò Xo" +msgstr "Số Khung Hình của Lực Đàn Hồi" msgid "Create springs for this number of frames since particles birth (0 is always)" -msgstr "Chế tạo lò xo cho số lượng bức ảnh này sau sanh hạt (0 = lần nào cùng làm)" +msgstr "Kiến Tạo lực đàn hồi trong số khung hình này kể từ khi sinh kiến tạo hạt (0 = luôn luôn)" msgid "Stiff Viscosity" -msgstr "Độ Nhớt Cứng" +msgstr "Độ sệt của tính nhớt" msgid "Creates viscosity for expanding fluid" -msgstr "Chế tạo độ nhớt cho chất lỏng nở rộng" +msgstr "Kiến Tạo độ nhớt cho chất lỏng lan tràn" msgid "How incompressible the fluid is (speed of sound)" -msgstr "Độ bất nén của chất lỏng (tốc độ âm thanh)" +msgstr "Mức bất khả nén của chất lỏng (tốc độ của âm thanh)" msgid "Factor Density" -msgstr "Hệ Số Tỉ Trọng" +msgstr "Tỷ Trọng là Thừa Số" msgid "Density is calculated as a factor of default density (depends on particle size)" -msgstr "Tỉ trọng là hệ số của tỉ trọng mặc định (tùy kích cỡ hạt)" +msgstr "Tỷ trọng được tính như một thừa số của tỷ trọng mặc định (tùy theo kích thước hạt)" msgid "Factor Radius" @@ -85795,67 +94308,67 @@ msgstr "Hệ Số Bán Kính" msgid "Interaction radius is a factor of 4 * particle size" -msgstr "Bán kính tương tác = 4 * kích cỡ hạt" +msgstr "Bán kính tương tác = 4 * kích thước hạt" msgid "Factor Repulsion" -msgstr "Hệ Số Đẩy Lui" +msgstr "Hệ Số Lực Đẩy" msgid "Repulsion is a factor of stiffness" -msgstr "Đẩy lui là hệ số của độ cứng" +msgstr "Lực đẩy là hệ số của độ cứng" msgid "Factor Rest Length" -msgstr "Hệ Số Bề Dài Nghỉ Ngơi" +msgstr "Hệ Số Chiều Dài của Trạng Thái Nghỉ" msgid "Spring rest length is a factor of 2 * particle size" -msgstr "Bề dài lò xo là hệ số của kích cỡ hạt * 2" +msgstr "Chiều dài lực đàn hồi ở trạng thái nghỉ là một thừa số của 2 * cỡ của hạt" msgid "Factor Stiff Viscosity" -msgstr "Hệ Số Độ Cứng Của Độ Nhớt" +msgstr "Hệ Số Độ Sệt của Tính Nhớt" msgid "Stiff viscosity is a factor of normal viscosity" -msgstr "Độ nhớt cứng là hệ số của độ nhớt bình thường" +msgstr "Độ sệt của tính nhớt là một hệ số của chất nhớt bình thường" msgid "Initial Rest Length" -msgstr "Bề Dài Nghỉ Khởi Đầu" +msgstr "Chiều Dài Trạng Thái Nghỉ Khởi Đầu" msgid "Use the initial length as spring rest length instead of 2 * particle size" -msgstr "Sử dụng bề dài đầu như bề dài nghỉ (không bị kéo hay đẩy) thay thế kích cỡ hạt * 2" +msgstr "Dùng chiều dài khởi đầu làm chiều dài của lực đàn hồi ở trạng thái nghỉ, thay vì kích thước hạt * 2" msgid "Use viscoelastic springs instead of Hooke's springs" -msgstr "Dùng lò xo giãn tắt dần thay thế lò xo Hooke" +msgstr "Dùng lực đàn hồi có tính đàn nhớt, thay vì lực đàn hồi của Hooke" msgid "Elastic Limit" -msgstr "Gới Hạn Giãn" +msgstr "Giới Hạn Co Giãn" msgid "How much the spring has to be stretched/compressed in order to change its rest length" -msgstr "Cần kéo/nén lò xo bao xa để đổi bề dài nghỉ ngơi của nó" +msgstr "Lượng kéo ra/nén vào của lực đàn hồi là bao nhiêu trước khi thay đổi chiều dài trong trạng thái nghỉ" msgid "Light Direction" -msgstr "Hướng Ánh Sáng" +msgstr "Chiều Hướng của Ánh Sáng" msgid "Direction of the light for shadows and highlights" -msgstr "Hướng của ánh sáng cho bóng tối và cao quang" +msgstr "Chiều hướng của ánh sáng dành cho các bóng tối và các chi tiết nêu bật" msgid "Attenuation constant" -msgstr "Hằng Số Giảm" +msgstr "Hằng số suy yếu" msgid "Distance of object that contribute to the Cavity/Edge effect" -msgstr "Khoảng cách của vật thể được góp phần cho hiệu ứng Hang/Cạnh" +msgstr "Khoảng cách của đối tượng đóng góp vào hiệu ứng Khe Hốc/Cạnh" msgid "Number of samples" @@ -85863,43 +94376,47 @@ msgstr "Số lượng mẫu vật" msgid "Render Anti-Aliasing" -msgstr "Phương Pháp Khử Răng Cưa" +msgstr "Kết Xuất Khử Răng Cưa" msgid "Method of anti-aliasing when rendering final image" -msgstr "Phương pháp khử răng cưa khi kết xuất ảnh cuối" +msgstr "Phương pháp khử răng cưa khi kết xuất hình ảnh cuối cùng" msgid "Shading Settings" -msgstr "Cài Đặt Bóng Tối" +msgstr "Sắp Đặt về Tô Bóng" msgid "Shading settings for OpenGL render engine" -msgstr "Cài đặt cho động cơ kết xuất OpenGL" +msgstr "Sắp đặt về tô bóng dành cho bộ máy kết xuất OpenGL" msgid "Shadow Focus" -msgstr "Tiêu Điểm Bóng Tối" +msgstr "Độ Nét của Bóng Tối" msgid "Shadow factor hardness" -msgstr "Hệ số độ cứng bóng tối" +msgstr "Hệ số về độ đậm của bóng tối" msgid "Shadow Shift" -msgstr "Dời Bóng Tối" +msgstr "Dịch Chuyển của Bóng Tối" msgid "Shadow termination angle" -msgstr "Góc cắt bóng tối" +msgstr "Góc kết thúc của bóng tối" msgid "Method of anti-aliasing when rendering 3d viewport" -msgstr "Phương pháp khử răng cưa khi kết xuất màn chiếu 3D" +msgstr "Phương pháp khử răng cưa khi kết xuất cổng nhìn 3D" + + +msgid "Maximum intensity a bloom pixel can have (0 to disable)" +msgstr "Cường độ sáng lóa tối đa mà một điểm ảnh có thể có (0 để tắt đi)" msgid "Color applied to the bloom effect" -msgstr "Màu để áp dụng cho hiệu ứng nở ra" +msgstr "Màu áp dụng vào hiệu ứng sáng lóa" msgid "Blend factor" @@ -85907,87 +94424,87 @@ msgstr "Hệ Số Pha Trộn" msgid "Knee" -msgstr "Cua Đường" +msgstr "Độ Chuyển Đổi" msgid "Makes transition between under/over-threshold gradual" -msgstr "Làm tiến triển từ từ giữa dưới/trên ngưỡng" +msgstr "Làm cho sự chuyển đổi giữa hai ngưỡng dưới/trên từ từ" msgid "Bloom spread distance" -msgstr "Khoảng cách tràn nở ra" +msgstr "Khoảng cách sự sáng lóa lan truyền" msgid "Filters out pixels under this level of brightness" -msgstr "Lọc các điểm ảnh ở dưới độ sáng này" +msgstr "Lọc bỏ các điểm ảnh dưới cường độ sáng này" msgid "Denoise Amount" -msgstr "Mức Độ Bớt Huyên Náo" +msgstr "Lượng Khử Nhiễu" msgid "Amount of flicker removal applied to bokeh highlights" -msgstr "Mức độ giảm bớt chớp được áp dụng cho điểm sáng của tản cảnh" +msgstr "Lượng nhấp nháy loại bỏ áp dụng cho phần sáng/nổi bật của nhòe mờ bokeh" msgid "Max Size" -msgstr "Kích Cỡ Cực Đại" +msgstr "Kích Thước Tối Đa" msgid "Max size of the bokeh shape for the depth of field (lower is faster)" -msgstr "Kích cỡ cực đại của hình dạng tản cảnh cho độ sâu trường (càng thấp càng nhanh)" +msgstr "Kích thước của hình nhòe bokeh cho trường ảnh (thấp thì nhanh hơn)" msgid "Neighbor Rejection" -msgstr "Bỏ Kề" +msgstr "Loại Bỏ Lân Cận" msgid "Maximum brightness to consider when rejecting bokeh sprites based on neighborhood (lower is faster)" -msgstr "Độ sáng cực đại để dùng khi bỏ tinh linh của tản cảnh tùy khu kề (thấp hơn là nhanh hơn)" +msgstr "Độ sáng tối đa để cân nhắc khi loại bỏ các nhiễu sáng đột ngột trong nhòe mờ bokeh dựa trên mức lân cận (thấp hơn thì sẽ nhanh hơn)" msgid "Over-blur" -msgstr "Mờ Hóa Huốt" +msgstr "Nhòe Mờ Thái Quá" msgid "Apply blur to each jittered sample to reduce under-sampling artifacts" -msgstr "Áp dụng mờ hóa cho mỗi mẫu hốt hoảng để giảm bớt lỗi lầm thiếu mẫu" +msgstr "Áp dụng nhòe mờ cho mỗi mẫu lấy biến động hòng giảm bớt giả tượng do lấy mẫu không đủ (under-sampling) gây ra" msgid "Sprite Threshold" -msgstr "Ngưỡng Tinh Linh" +msgstr "Ngưỡng của Nhiễu Sáng Đột Ngột" msgid "Brightness threshold for using sprite base depth of field" -msgstr "Ngưỡng độ sáng cho dùng trường độ sâu cơ sở tinh linh" +msgstr "Giới hạn cường độ sáng cho việc sử dụng trường ảnh cơ sở nhiễu sáng đột ngột (sprite base depth of field)" msgid "Auto Bake" -msgstr "Nướng Tự Động" +msgstr "Tự Động Nướng" msgid "Auto bake indirect lighting when editing probes" -msgstr "Tự động nướng ánh sáng không trực tiếp khi biên tập ánh sáng kế" +msgstr "Tự động nướng ánh sáng gián tiếp khi biên soạn các điểm thăm dò ánh sáng" msgid "Light Cache Info" -msgstr "Thông Tin Đệm Chứa Ánh Sáng" +msgstr "Thông Tin về Bộ Đệm Ánh Sáng" msgid "Cubemap Display Size" -msgstr "Kích Cỡ Hiển Thị Bản Đồ Lập Phương" +msgstr "Kích Thước Hiển Thị của Bản Đồ Lập Phương" msgid "Size of the cubemap spheres to debug captured light" -msgstr "Kích cỡ của hình cầu bản đồ lập phương để sửa lỗi lầm của ánh sáng được bắt" +msgstr "Kích thước của các hình cầu bản đồ lập phương (cubemap) dùng để điều tra ánh sáng nắm bắt được" msgid "Cubemap Size" -msgstr "Kích Cỡ Bản Đồ Lập Phương" +msgstr "Kích Thước Bản Đồ Lập Phương" msgid "Size of every cubemaps" -msgstr "Kích cỡ của mỗi bản đồ lập phương" +msgstr "Kích thước của mỗi một bản đồ lập phương (cubemap)" msgid "64 px" @@ -86018,52 +94535,68 @@ msgid "4096 px" msgstr "4096 điểm ảnh" +msgid "Number of times the light is reinjected inside light grids, 0 disable indirect diffuse light" +msgstr "Số lần ánh sáng được bơm trở lại vào bên trong khung lưới đồ thị ánh sáng, đặt bằng 0 để tắt ánh sáng khuếch tán gián tiếp" + + msgid "Filter Quality" -msgstr "Chất Lương Bộ Lọc" +msgstr "Chất Lượng Thanh Lọc" msgid "Take more samples during cubemap filtering to remove artifacts" -msgstr "Lấy mẫu vật nhiều hơn khi bộ lọc bản đồ lập phương để bất huyên náo" +msgstr "Lấy thêm mẫu vật trong quá trình thanh lọc bản đồ lập phương (cubemap filtering) để loại bỏ giả tượng" msgid "Clamp Glossy" -msgstr "Kẹp Bóng Loáng" +msgstr "Hạn Định Bóng Loáng" + + +msgid "Clamp pixel intensity to reduce noise inside glossy reflections from reflection cubemaps (0 to disable)" +msgstr "Hạn định cường độ điểm ảnh để giảm nhiễu bên trong các tia phản xạ bóng loáng từ bản đồ lập phương cho tia phản xạ (0 để tắt đi)" msgid "Irradiance Display Size" -msgstr "Kích Cỡ Hiển Thị Sự Rọi" +msgstr "Kích Thước Hiển Thị sự Tỏa Sáng" msgid "Size of the irradiance sample spheres to debug captured light" -msgstr "Kích cỡ của hình cầu mẫu vật sự rọi để sửa lỗi lầm của ánh sáng được bắt" +msgstr "Kích thước của các hình cầu mẫu vật của sự tỏa sáng để điều tra ánh sáng nắm bắt được" + + +msgid "Irradiance Pool Size" +msgstr "Kích Thước Bể Bức Xạ" + + +msgid "Size of the irradiance pool, a bigger pool size allows for more irradiance grid in the scene but might not fit into GPU memory and decrease performance" +msgstr "Kích thước của bể bức xạ, kích thước bể lớn hơn sẽ cho phép có nhiều khung lưới đồ thị bức xạ hơn trong cảnh, song có thể không khít vừa với lượng bộ nhớ GPU và sẽ làm giảm hiệu suất hoạt động" msgid "Irradiance Smoothing" -msgstr "Mịn Hóa Sự Rọi" +msgstr "Làm Mịn Ánh Tỏa Sáng" msgid "Show Cubemap Cache" -msgstr "Hiển Thị Đệm Chứa Bản Đồ Lập Phương" +msgstr "Hiển Thị Bộ Đệm Nhớ Bản Đồ Lập Phương" msgid "Display captured cubemaps in the viewport" -msgstr "Hiển thị bản đồ lập phương được bắt trong màn chiếu" +msgstr "Hiển thị các bản đồ lập phương nắm bắt được trong cổng nhìn" msgid "Show Irradiance Cache" -msgstr "Hiển Thị Đệm Chứa Sự Rọi" +msgstr "Hiển Thị Bộ Đệm Nhớ của Sự Tỏa Sáng" msgid "Display irradiance samples in the viewport" -msgstr "Hiển thị mẫu vật sự rọi trong màn chiếu" +msgstr "Hiển thị các mẫu vật về sự tỏa sáng trong cổng nhìn" msgid "Irradiance Visibility Size" -msgstr "Kích Cỡ Hiển Thị Sự Rọi" +msgstr "Kích Thước Tầm Nhìn của Sự Tỏa Sáng" msgid "Size of the shadow map applied to each irradiance sample" -msgstr "Kích cỡ của bản đồ bóng tối được áp dụng cho mỗi mẫu vật sự rọi" +msgstr "Kích thước của ánh xạ bóng tối áp dụng vào mỗi mẫu vật của sự tỏa sáng" msgid "8 px" @@ -86079,19 +94612,19 @@ msgstr "32 điểm ảnh" msgid "Distance of object that contribute to the ambient occlusion effect" -msgstr "Khoảng cách của vật thể được góp phần cho hiệu ứng che khuất bao quanh" +msgstr "Khoảng cách của đối tượng đóng góp vào hiệu ứng tính hấp thụ quang xạ môi trường" msgid "Factor for ambient occlusion blending" -msgstr "Hệ số cho pha trộn che khuất bao quanh" +msgstr "Hệ số pha trộn tính hấp thụ quang xạ môi trường" msgid "Trace Precision" -msgstr "Độ Chính Xác Vệt" +msgstr "Độ Chính Xác trong Dò Tìm" msgid "Precision of the horizon search" -msgstr "Độ chính xác của tìm kiếm chân trời" +msgstr "Độ chính xác của quá trình lùng tìm đường chân trời" msgid "Light Threshold" @@ -86099,139 +94632,203 @@ msgstr "Ngưỡng Ánh Sáng" msgid "Minimum light intensity for a light to contribute to the lighting" -msgstr "Độ cường ánh sáng cực tiểu cho một đèn được góp phần cho ánh sáng" +msgstr "Cường độ ánh sáng tối thiểu để nguồn sáng có thể đóng góp phần mình trong bố trí ánh sáng" msgid "Background Separation" -msgstr "Chẻ Cảnh Sau" +msgstr "Tách Phân Nền Sau" msgid "Lower values will reduce background bleeding onto foreground elements" -msgstr "Gía trị thấp hơn sẽ giảm cảnh sau tràn vào cảnh trước" +msgstr "Các giá trị thấp sẽ giảm thiểu sự rò rỉ của nền sau sang các phần tử ở nền trước" msgid "Maximum blur distance a pixel can spread over" -msgstr "Khoảng cách mờ hóa cực đại cho một điểm ảnh được tràn qua" +msgstr "Khoảng cách làm nhòe mờ tối đa mà một điểm ảnh có thể lan tỏa ra" msgid "Motion steps" -msgstr "Bước chuyển động" +msgstr "Số Bước của Chuyển Động" msgid "Controls accuracy of motion blur, more steps means longer render time" -msgstr "Nó kiểm sóat độ chính xác của mờ hóa chuyển động, bước càng nhiều thới gian kết xuất càng lâu" +msgstr "Điều khiển độ chính xác của sự nhòe mờ trong chuyển động. Số bước càng nhiều thì càng thời gian kết xuất sẽ càng dài hơn" msgid "Overscan Size" -msgstr "Kích Cỡ Quét Ra Ngoài" +msgstr "Kích Thước Quá Khổ" msgid "Percentage of render size to add as overscan to the internal render buffers" -msgstr "Phân trăm của ảnh kết xuất để kèm cho như quét ra ngoải trong đệm kết xuất nội bộ" +msgstr "Tỷ lệ phần trăm quá khổ để kết xuất thêm trong bộ đệm kết xuất nội bộ" + + +msgid "Tracing Method" +msgstr "Phương Pháp Dò Tia" + + +msgid "Select the tracing method used to find scene-ray intersections" +msgstr "Chọn phương pháp dò tia sử dụng để tìm sự giao cắt của tia cảnh" + + +msgid "No intersection with scene geometry" +msgstr "Không có sự giao cắt với hình học của cảnh" + + +msgid "Screen-Trace" +msgstr "Dò Tia Màn Hình" + + +msgid "Raytrace against the depth buffer" +msgstr "Dò tia trong bộ đệm về chiều sâu" + + +msgid "Reflection Trace Options" +msgstr "Các Tùy Chọn về Dò Tìm Tia Phản Chiếu" + + +msgid "EEVEE settings for tracing reflections" +msgstr "Các cài đặt EEVEE để dò tìm tia phản xạ" msgid "Directional Shadows Resolution" -msgstr "Độ Phân Giải Bóng Tối Định Hướng" +msgstr "Độ Phân Giải của Bóng Tối Hữu Hướng" msgid "Size of sun light shadow maps" -msgstr "Kích cỡ của bản đồ bóng tối nắng" +msgstr "Kích thước ánh xạ bóng tối của ánh mặt trời" msgid "Cube Shadows Resolution" -msgstr "Độ Phân Giải Bóng Tối Lập Phương" +msgstr "Độ Phân Giải Bóng Tối của Khối Lập Phương" msgid "Size of point and area light shadow maps" -msgstr "Kích cỡ của bản đồ bóng tối ánh sáng điểm và ánh sáng diện tích" +msgstr "Kích thước của ánh xạ bóng tối cho đèn pha và đèn diện tích" + + +msgid "Shadow Normal Bias" +msgstr "Thiên Lệch Pháp Tuyến Bóng Tối" + + +msgid "Shadow Pool Size" +msgstr "Kích Thước Bể Chứa Bóng Tối" + + +msgid "Size of the shadow pool, a bigger pool size allows for more shadows in the scene but might not fit into GPU memory" +msgstr "Kích thước của bể chứa bóng tối, kích thước bể lớn hơn sẽ cho phép có nhiều bóng tối trong cảnh hơn, song có thể không khít vừa với bộ nhớ GPU" + + +msgid "Shadow Ray Count" +msgstr "Số Lượng Tia Bóng Tối" + + +msgid "Amount of shadow ray to trace for each light" +msgstr "Lượng tia bóng tối để theo dõi cho mỗi ánh sáng" + + +msgid "Shadow Step Count" +msgstr "Số Bước Bóng Tối" + + +msgid "Amount of shadow map sample per shadow ray" +msgstr "Số lượng mẫu vật ánh xạ bóng tối trên mỗi tia bóng tối" msgid "Edge Fading" -msgstr "Phai Cạnh" +msgstr "Mờ Dần vùng gần Cạnh" msgid "Screen percentage used to fade the SSR" -msgstr "Phần trăm được sử dụng cho phản xạ không gian màn" +msgstr "Lượng phần trăm màn hình sử dụng để phai mờ dần Phản Chiếu Không Gian Màn Hình -- Screen Space Reflection (SSR)" + + +msgid "Clamp pixel intensity to remove noise (0 to disable)" +msgstr "Hạn định cường độ điểm ảnh để loại bỏ nhiễu (0 để tắt)" msgid "Max Roughness" -msgstr "Độ Nhám Cực Đại" +msgstr "Độ Nhám/Gồ Ghề/Rối Tối Đa" msgid "Do not raytrace reflections for roughness above this value" -msgstr "Không dò tia phản xạ cho độ nhạm lớn hơn giá trị này" +msgstr "Không dò tia các phản xạ về độ nhám có giá trị cao hơn giá trị này" msgid "Pixel thickness used to detect intersection" -msgstr "Chiều dày điểm ảnh được sử dụng cho phát hiện vùng giao cắt" +msgstr "Độ dày điểm ảnh sử dụng để phát hiện sự giao cắt" msgid "Jitter Threshold" -msgstr "Ngưỡng Hốt Hoảng" +msgstr "Giới Hạn Biến Động" msgid "Rotate samples that are below this threshold" -msgstr "Xoay mẫu vật dưới ngưỡng này" +msgstr "Xoay chiều các mẫu vật có giá trị dưới giới hạn này" msgid "Number of samples to compute the scattering effect" -msgstr "Số lượng mẫu vật để tính cho hiệu ứng tán xạ" +msgstr "Số lượng mẫu vật để tính hiệu ứng tán xạ" msgid "Render Samples" -msgstr "Mẫu Vật Kết Xuất" +msgstr "Số Mẫu Vật Kết Xuất" + + +msgid "Number of samples per pixel for rendering" +msgstr "Số mẫu mỗi điểm ảnh để kết xuất" msgid "Number of samples, unlimited if 0" -msgstr "Số lượng mẫu vật, không giới hạn nếu = 0" +msgstr "Số lượng mẫu vật, vô hạn nếu bằng 0" msgid "High brightness pixels generate a glowing effect" -msgstr "Điểm ảnh rất sáng được chế tạo một hiệu ứng hào quang" +msgstr "Những điểm ảnh có độ sáng cao sinh tạo hiệu ứng hừng sáng" msgid "High Quality Slight Defocus" -msgstr "Bớt Tập Trung Một Tí Chất Lượng Cao" +msgstr "Biên Vùng Nét Chất Lượng Cao" msgid "Sample all pixels in almost in-focus regions to eliminate noise" -msgstr "Lấy mẫu cho tất cả điểm ảnh trong vùng tập trung để giảm bớt huyên náo" +msgstr "Lấy mẫu cho toàn bộ điểm ảnh ở biên vùng nét để giảm bớt nhiễu" msgid "Jitter Camera" -msgstr "Hốt Hoảng Máy Quay Phim" +msgstr "Rung Động Máy Quay Phim" msgid "Jitter camera position to create accurate blurring using render samples" -msgstr "Hốt hoảng vị trí của máy quay phim để chế tạo mờ hóa chính xác dùng mẫu kết xuất" +msgstr "Rung động vị trí của máy quay phim để kiến tạo nhòe mờ chính xác dùng các mẫu kết xuất" msgid "Enable ambient occlusion to simulate medium scale indirect shadowing" -msgstr "Bật che khuất bao quanh để mô phỏng bóng tối giàn tiếp có kích cỡ giữa" +msgstr "Cho phép THTQXMT để mô phỏng ngả bóng tối gián tiếp tỷ lệ trung bình" msgid "Bent Normals" -msgstr "Pháp Tuyến Bể" +msgstr "Pháp Tuyến Bị Bẻ Cong" msgid "Compute main non occluded direction to sample the environment" -msgstr "Tính hướng chánh không bị che khuất để lấy mẫu vật từ môi trường" +msgstr "Tính toán chiều hướng không bị che khuất chính để lấy mẫu vật môi trường" msgid "Bounces Approximation" -msgstr "Xấp Xỉ Nhồi" +msgstr "Ước Lượng Số Lần Bật Nẩy" msgid "An approximation to simulate light bounces giving less occlusion on brighter objects" -msgstr "Một xấp xỉ để mô phỏng nhồi ánh sáng, giảm che khuất cho vật thể sáng" +msgstr "Một ước tính để mô phỏng tia sáng bật nẩy, làm giảm tính hấp thụ đối với những đối tượng sáng hơn" msgid "Enable motion blur effect (only in camera view)" -msgstr "Bật hiệu ứng mờ hóa (chỉ cho màn máy quay phim)" +msgstr "Bật hiệu ứng nhòe mờ chuyển động (duy trong góc nhìn máy quay phim)" msgid "Internally render past the image border to avoid screen-space effects disappearing" -msgstr "Nội bộ kết xuất ở ra ngoài ranh giới ảnh để tránh hiệu ứng trong không gian màn biến mất" +msgstr "Kết xuất quá biên giới của hình ảnh, ngầm bên trong, để tránh hiệu ứng không gian màn hình bị biến mất" msgid "High Bit Depth" @@ -86239,87 +94836,91 @@ msgstr "Độ Sâu Bit Cao" msgid "Use 32-bit shadows" -msgstr "Dùng bóng tối 32 bit" +msgstr "Dùng bóng tối 32-bit" + + +msgid "Enable shadow casting from lights" +msgstr "Cho phép ngả bóng tối từ các nguồn ánh sáng" msgid "Soft Shadows" -msgstr "Bóng Tối Mềm" +msgstr "Bóng Tối Mềm Mại" msgid "Randomize shadowmaps origin to create soft shadows" -msgstr "Ngẫu nhiên hóa gốc tọa độ của bản đồ bóng tối để chế tạo bóng tối mềm" +msgstr "Ngẫu nhiên hóa tọa độ gốc của ánh xạ bóng tối để kiến tạo bóng tối mềm mại" msgid "Enable screen space reflection" -msgstr "Bật phản xạ trong không gian màn" +msgstr "Cho phép sự phản xạ của không gian màn hình" msgid "Half Res Trace" -msgstr "Dò Tia Nửa Độ Phân Giải" +msgstr "Dò Tia dùng Một Nửa Độ Phân Giải" msgid "Raytrace at a lower resolution" -msgstr "Dò tia dùng độ phân giải thấp hơn" +msgstr "Dò tia ở độ phân giải thấp hơn" msgid "Screen Space Refractions" -msgstr "Khúc Xạ Không Gian Màn" +msgstr "Khúc Xạ trong Không Gian Màn Hình" msgid "Enable screen space Refractions" -msgstr "Bật Khúc Xạ trong không gian màn" +msgstr "Bật ảnh hưởng Khúc Xạ trong không gian màn hình" msgid "Viewport Denoising" -msgstr "Bất Huyên Nào Hóa Màn Chiếu" +msgstr "Khử Nhiễu trong Cổng Nhìn" msgid "Denoise image using temporal reprojection (can leave some ghosting)" -msgstr "Giảm huyên náo bằng phép chiếu lại thời gian (có thể làm bóng ma)" +msgstr "Giảm nhiễu dùng phương pháp tái phóng chiếu theo thời gian (temporal reprojection) (có thể để lại một số ảo ảnh)" msgid "Enable scene light interactions with volumetrics" -msgstr "Bất tương tác ánh sáng với các thể tich" +msgstr "Cho phép ánh sáng của cảnh tương tác với các thể tích" msgid "Generate shadows from volumetric material (Very expensive)" -msgstr "Chế tạo bóng tối từ vật liệu thê tích (rất chậm)" +msgstr "Sinh tạo bóng tối từ nguyên vật liệu thể tích (Rất đắt giá)" msgid "End distance of the volumetric effect" -msgstr "Khoảng cách kết thúc hiệu ứng thể tích" +msgstr "Khoảng cách kết thúc của hiệu ứng thể tích" msgid "Maximum light contribution, reducing noise" -msgstr "Sự góp ánh sáng cực đại, bất huyên náo" +msgstr "Lượng ánh sáng đóng góp tối đa, thuyên giảm nhiễu" msgid "Exponential Sampling" -msgstr "Mẫu Vật Lũy Thừa" +msgstr "Lấy Mẫu Vật Lũy Thừa" msgid "Distribute more samples closer to the camera" -msgstr "Phân phối mẫu vật gần máy quay phim hơn" +msgstr "Khi gần máy quay phim hơn thì phân bổ mẫu vật nhiều hơn" msgid "Number of samples to compute volumetric effects" -msgstr "Số lượng mẫu vật để tính hiệu ứng thể tích" +msgstr "Lượng mẫu vật để tính toán các ảnh hưởng của thể tích" msgid "Volumetric Shadow Samples" -msgstr "Mẫu Vật Bóng Tối Thể Tích" +msgstr "Số Mẫu Vật Bóng Tối của Thể Tích" msgid "Number of samples to compute volumetric shadowing" -msgstr "Số lượng mẫu vật để tính bóng tối thể tích" +msgstr "Số mẫu vật để tính toán sự tỏa bóng tối của thể tích" msgid "Start distance of the volumetric effect" -msgstr "Khoảng cách bắt đầu hiệu ứng thể tích" +msgstr "Khoảng cách khởi đầu của hiệu ứng thể tích" msgid "Control the quality of the volumetric effects (lower size increase vram usage and quality)" -msgstr "Điều khiển chất lượng của hiệu ứng thể tích (kích cỡ càng nhỏ càng tăng dùng bộ nhớ độ họa và chất lượng)" +msgstr "Điều chế chất lượng của hiệu ứng thể tích (kích thước nhỏ sẽ làm tăng lượng bộ nhớ video sử dụng và chất lượng)" msgid "2 px" @@ -86331,91 +94932,115 @@ msgstr "4 điểm ảnh" msgid "Grease Pencil Render" -msgstr "Kết Xuất Bút Sáp" +msgstr "Kết Xuất Bút Chì Dầu" msgid "Render settings" -msgstr "Cài đặt kết xuất" +msgstr "Sắp Đặt về Kết Xuất" msgid "Anti-Aliasing Threshold" -msgstr "Ngưỡng Chống Răng Cưa" +msgstr "Ngưỡng Khử Răng Cưa" msgid "Threshold for edge detection algorithm (higher values might over-blur some part of the image)" -msgstr "Ngưỡng cho giải thuật phát hiện cạnh (giá trị cao hơn có lẽ mờ hóa vài phần của ảnh) " +msgstr "Ngưỡng sử dụng trong thuật toán phát hiện cạnh (các giá trị cao có thể làm cho một số phần của hình ảnh trở nên nhòe mờ quá mức" + + +msgid "Scene Hydra" +msgstr "Cảnh Hydra" + + +msgid "Scene Hydra render engine settings" +msgstr "Các cài đặt của động cơ kết xuất Cảnh Hydra" + + +msgid "Export Method" +msgstr "Phương Pháp Xuất Khẩu" + + +msgid "How to export the Blender scene to the Hydra render engine" +msgstr "Phương pháp xuất khẩu cảnh Blender sang động cơ kết xuất Hydra" + + +msgid "Fast interactive editing through native Hydra integration" +msgstr "Chỉnh sửa tương tác nhanh thông qua sự tích hợp Hydra bản địa" + + +msgid "Export scene through USD file, for accurate comparison with USD file export" +msgstr "Xuất khẩu cảnh qua tập tin USD, để so sánh một cách chính xác với quá trình xuất khẩu tập tin USD" msgid "Scene Objects" -msgstr "Vật Thể Cảnh" +msgstr "Đối Tượng của Cảnh" msgid "All of the scene objects" -msgstr "Tất cả vật thể của cảnh" +msgstr "Toàn bộ các đối tượng của cảnh" msgid "Scene Render View" -msgstr "Màn kết xuất Cảnh" +msgstr "Góc Nhìn Kết Xuất Cảnh" msgid "Render viewpoint for 3D stereo and multiview rendering" -msgstr "Điểm nhìn cho nhị kênh 3D và kết xuất kiểu đa màn" +msgstr "Điểm nhìn kết xuất dành cho lập thể 3D và cho kết xuất đa góc nhìn" msgid "Camera Suffix" -msgstr "Đuôi Máy Quay Phim" +msgstr "Hậu Tố của Máy Quay Phim" msgid "Suffix to identify the cameras to use, and added to the render images for this view" -msgstr "Đuôi cho biết dùng máy quay phim dùng nào, và kèm với ảnh kết xuất của màn này" +msgstr "Hậu tố để xác định máy quay phim sử dụng, và được thêm vào các hình ảnh kết xuất cho góc nhìn này" msgid "File Suffix" -msgstr "Đuôi Tập Tin" +msgstr "Hậu Tố của Tập Tin" msgid "Suffix added to the render images for this view" -msgstr "Đuôi kèm với ảnh kết xuất cho màn này" +msgstr "Hậu tố được thêm vào các hình ảnh kết xuất cho góc nhìn này" msgid "Render view name" -msgstr "Tên màn kết xuất" +msgstr "Tên của khung nhìn kết xuất" msgid "Disable or enable the render view" -msgstr "Tắt hay bật màn kết xuất" +msgstr "Tắt hay bật khung nhìn kết xuất" msgid "Scopes for statistical view of an image" -msgstr "Kế hiển thị thống kê của ảnh" +msgstr "Kế đo lường hiển thị thống kê của hình ảnh" msgid "Proportion of original image source pixel lines to sample" -msgstr "Tỉ số của số hàng ảnh nguồn ban đầu để lấy mẫu vật" +msgstr "Tỷ lệ tương ứng của các đường điểm ảnh trong hình ảnh nguồn để lấy mẫu" msgid "Histogram for viewing image statistics" -msgstr "Biểu đồ cho hiển thị thống kê ảnh" +msgstr "Biểu đồ hiển thị thống kê của hình ảnh" msgid "Sample every pixel of the image" -msgstr "Lấy mẫu vật tại mỗi điểm ảnh của ảnh" +msgstr "Lấy mẫu vật từng điểm ảnh một của hình ảnh" msgid "Vectorscope Opacity" -msgstr "Vectơ Kế Độ Đục" +msgstr "Độ Đục của Véctơ Kế" msgid "Opacity of the points" -msgstr "Độ đục của điểm" +msgstr "Độ Đục của các điểm" msgid "Waveform Opacity" -msgstr "Độ Đục Hình Dạng Sóng" +msgstr "Độ Đục của Hình Sóng" msgid "Waveform Mode" -msgstr "Chế Độ Hình Dạng Sóng" +msgstr "Chế Độ Hình Sóng" msgid "Parade" @@ -86430,28 +95055,40 @@ msgid "YCbCr (ITU 709)" msgstr "YCbCr (ITU 709)" +msgid "Alternate script path, matching the default layout with sub-directories: startup, add-ons, modules, and presets (requires restart)" +msgstr "Đường dẫn tập lệnh thay thế, khớp với bố trí mặc định với các thư mục con: startup, add-ons, modules, và presets (đòi hỏi phải khởi động lại)" + + +msgid "Identifier for the Python scripts directory" +msgstr "Chỉ danh cho thư mục tập lệnh Python" + + +msgid "Python Scripts Directories" +msgstr "Thư Mục Tập Lệnh Python" + + msgid "Sequence strip in the sequence editor" -msgstr "Đoạn trình tự trong trình biên soạn trình tự" +msgstr "Dải trình tự trong trình phối hình" msgid "Blend Opacity" -msgstr "Độ Đục Pha Trộn" +msgstr "Pha Trộn Độ Đục" msgid "Percentage of how much the strip's colors affect other strips" -msgstr "Phần tăm màu của đoạn này được ảnh hưởng đoạn khác" +msgstr "Lượng phần trăm mà màu của dải ảnh hưởng đến các dải khác" msgid "Method for controlling how the strip combines with other strips" -msgstr "Phương pháp điều khiển làm sao đoạn này được ghép với đoạn khác" +msgstr "Phương pháp điều chế sự pha trộn của các dải phim" msgid "Alpha Under" -msgstr "Độ Đục Dưới" +msgstr "Alpha Dưới" msgid "Gamma Cross" -msgstr "Xuyên Gama" +msgstr "Hòa Trộn Gamma" msgid "Over Drop" @@ -86459,85 +95096,93 @@ msgstr "Thả Trên" msgid "Y position of the sequence strip" -msgstr "Vị trí Y của đoạn trình tự" +msgstr "Vị trí Y của dải trình tự" msgid "Strip Color" -msgstr "Màu Đoạn" +msgstr "Màu Dải" msgid "Color tag for a strip" -msgstr "Thẻ màu cho một đoạn" +msgstr "Nhãn màu đánh dấu cho một dải" msgid "Effect Fader Position" -msgstr "Vị Trí Hiệu Ứng Phai" +msgstr "Vị trí hiệu ứng mờ dần" msgid "Custom fade value" -msgstr "Hệ số phai tùy chọn" +msgstr "Giá trị mờ dần tùy chỉnh" msgid "The length of the contents of this strip before the handles are applied" -msgstr "Bề dài nội dung của đoạn này trước áp dụng tay cầm" +msgstr "Chiều dài nội dung của đoạn phim này kể từ điểm trước vị trí của tay cầm (bao gồm cả khoảng cách của tay cầm)" msgid "The length of the contents of this strip after the handles are applied" -msgstr "Bề dài nội dung của đoạn này sau áp dụng tay cầm" +msgstr "Chiều dài nội dung của dải này cho đến điểm sau vị trí của tay cầm (bao gồm cả khoảng cách của tay cầm)" msgid "End frame displayed in the sequence editor after offsets are applied" -msgstr "Bức ảnh cuối được hiển thị trong trình biên soạn trình tự sau áp dụng dịch" +msgstr "Khung hình cuối hiển thị trong trình phối hình sau khi đã dịch chuyển vị trí" msgid "Start frame displayed in the sequence editor after offsets are applied, setting this is equivalent to moving the handle, not the actual start frame" -msgstr "Bức ảnh đầu tiên được hiển thị trong trình biên soạn trình tự sau áp dụng dịch, đặt này giống như di chuyển tay cầm, không phải là bức ảnh đầu tiên thật" +msgstr "Khung hình đầu tiên hiển thị trong trình phối hình sau khi đã dịch chuyển vị trí, đặt giá trị này cũng giống như di chuyển tay cầm chứ không phải khung hình đầu tiên thực" msgid "End Offset" -msgstr "Dịch Cuối" +msgstr "Dịch Chuyển ở Cuối" msgid "X position where the strip begins" -msgstr "Vị trí X đoạn được bắt đầu" +msgstr "Vị trí X khởi đầu của đoạn phim" msgid "Lock strip so that it cannot be transformed" -msgstr "Khóa đoạn cho không thể biến hóa nó" +msgstr "Khóa dải lại để nó không thể biến hóa được" msgid "Modifiers affecting this strip" -msgstr "Bộ điều chỉnh ảnh hướng đoạn này" +msgstr "Bộ điều chỉnh ảnh hưởng dải này" msgid "Disable strip so that it cannot be viewed in the output" -msgstr "Tắt đoạn cho không thể nhìn thấy nó trong ngõ ra" +msgstr "Vô hiệu hóa đoạn phim để không thể xem thấy nó ở đầu ra" msgid "Override Cache Settings" -msgstr "Vượt Quyền Cài Đặt Đệm Chứa" +msgstr "Vượt Quyền các Sắp Đặt về Bộ Đệm Nhớ" msgid "Override global cache settings" -msgstr "Vượt quyền cho cài đặt đệm chứa toàn cầu" +msgstr "Vượt quyền các sắp đặt toàn cầu về bộ đệm nhớ" msgid "Left Handle Selected" -msgstr "Tay Cầm Trái Được Chọn" +msgstr "Đã Chọn Tay Cầm Trái" msgid "Right Handle Selected" -msgstr "Tay Cầm Phải Được Chọn" +msgstr "Đã Chọn Tay Cầm Phải" + + +msgid "Show Retiming Keys" +msgstr "Hiển Thị Khóa Tính Lại Thời Gian" + + +msgid "Show retiming keys, so they can be moved" +msgstr "Hiển thị các khóa tính lại thời gian, để chúng có thể di chuyển được" msgctxt "Sequence" msgid "Image" -msgstr "Ảnh" +msgstr "Hình Ảnh" msgctxt "Sequence" msgid "Meta" -msgstr "Siêu" +msgstr "Siêu Đối Tượng" msgctxt "Sequence" @@ -86557,7 +95202,7 @@ msgstr "Đoạn Phim" msgctxt "Sequence" msgid "Mask" -msgstr "Mặt Nạ" +msgstr "Màn Chắn Lọc" msgctxt "Sequence" @@ -86567,7 +95212,7 @@ msgstr "Âm Thanh" msgctxt "Sequence" msgid "Cross" -msgstr "Xuyên" +msgstr "Giao Hòa/Hình Thập Tự" msgctxt "Sequence" @@ -86576,111 +95221,115 @@ msgstr "Thả Trên" msgid "Cache Composite" -msgstr "Chứa Ảnh Ghép" +msgstr "Lưu Hình Ảnh Tổng Hợp trong Bộ Nhớ Đệm" msgid "Cache intermediate composited images, for faster tweaking of stacked strips at the cost of memory usage" -msgstr "Chứa các ảnh giữa ghép, cho chỉnh các đoạn xếp đống nhanh hơn nhưng dùng bộ nhớ nhiều hơn" +msgstr "Lưu các hình ảnh tổng hợp trung gian trong bộ nhớ đệm để hiệu chỉnh các dải chồng tầng trong ngăn xếp nhanh hơn, tuy sẽ tiêu tốn bộ nhớ nhiều hơn" msgid "Cache Preprocessed" -msgstr "Đệm Chứa Tiền Qúa Trình" +msgstr "Lưu Bản Xử Lý Trước trong Bộ Nhớ Đệm" msgid "Cache preprocessed images, for faster tweaking of effects at the cost of memory usage" -msgstr "Đệm chứa các ảnh tiền qúa trình, cho chỉnh các hiệu ứng nhanh hơn nhưng sử dụng bộ nhớ nhiều hơn" +msgstr "Lưu các hình ảnh đã xử lý trước trong bộ nhớ đệm, để hiệu chỉnh được nhanh hơn, tuy sẽ tiêu tốn bộ nhớ nhiều hơn" msgid "Cache Raw" -msgstr "Chứa Nguyên Thủy" +msgstr "Lưu Hình Ảnh Thô trong Bộ Nhớ Đệm" msgid "Cache raw images read from disk, for faster tweaking of strip parameters at the cost of memory usage" -msgstr "Chứa ảnh nguyên thủy từ đĩa, cho chỉnh tham số đoạn nhanh hơn nhưng dùng bộ nhớ nhiều hơn" +msgstr "Lưu các hình ảnh thô đọc từ đĩa trong bộ nhớ đệm, để hiệu chỉnh các tham số của dải nhanh hơn, tuy sẽ tiêu tốn bộ nhớ nhiều hơn" msgid "Use Default Fade" -msgstr "Dùng Phai Mặc Định" +msgstr "Dùng Phai Mờ Dần Mặc Định" msgid "Fade effect using the built-in default (usually make transition as long as effect strip)" -msgstr "Hiệu ứng phai mặc định nội bộ (thương làm tiến triển dài bằng đoạn hiệu ứng)" +msgstr "Hiệu ứng mờ dần sử dụng thủ pháp mặc định gắn sẵn (thường thì chiều dài chuyển cảnh bằng chiều dài của dải hiệu ứng)" msgid "Use Linear Modifiers" -msgstr "Dùng Bộ Điều Chỉnh Bật Một" +msgstr "Dùng Bộ Điều Chỉnh Tuyến Tính" msgid "Calculate modifiers in linear space instead of sequencer's space" -msgstr "Tính bộ điều chỉnh trong không gian bậc một thay thế không gian của bộ trình tự" +msgstr "Tính toán các bộ điều chỉnh trong không gian tuyến tính thay vì không gian của trình phối hình" msgid "Effect Sequence" -msgstr "Trình Tự Hiệu Ứng" +msgstr "Dãy Hiệu Ứng" msgid "Sequence strip applying an effect on the images created by other strips" -msgstr "Đoạn trình tự cho áp dụng một sự kiện trên ảnh được chế tạo bằng các đoạn khác" +msgstr "Dải trình tự áp dụng một ảnh hưởng trên các hình ảnh của các dải khác" msgid "Representation of alpha information in the RGBA pixels" -msgstr "Biểu diễn của thông tin độ đục trong các điểm ảnh RGBA" +msgstr "Tượng trưng của thông tin alpha trong các điểm ảnh RGBA" msgid "RGB channels in transparent pixels are unaffected by the alpha channel" -msgstr "Điểm ảnh trong suốt trong các kênh RGB không bị ảnh hưởng bằng kênh độ đục" +msgstr "Các kênh RGB trong các điểm ảnh trong suốt không bị kênh alpha ảnh hưởng" msgid "RGB channels in transparent pixels are multiplied by the alpha channel" -msgstr "Nhân điểm ảnh trong suốt trong các kênh RGB với kênh độ đục" +msgstr "Các kênh RGB trong các điểm ảnh trong suốt được kênh alpha nhân lên" msgid "Multiply Colors" -msgstr "Nhân Màu" +msgstr "Nhân Các Màu Lên" msgid "Adjust the intensity of the input's color" -msgstr "Chỉnh cường độ của màu ngõ vào" +msgstr "Điều chỉnh cường độ của màu sắc ở đầu vào" + + +msgid "Multiply alpha along with color channels" +msgstr "Nhân alpha cùng với các kênh màu" msgid "Strobe" -msgstr "Chớp" +msgstr "Chớp/Giật" msgid "Only display every nth frame" -msgstr "Chỉ hiển thị bức ảnh thứ n" +msgstr "Chỉ hiển thị khung hình ở vị trí thứ n mà thôi" msgid "Remove fields from video movies" -msgstr "Xóa trường xen kẽ trong phim video" +msgstr "Xóa các trường khỏi phim video" msgid "Flip on the X axis" -msgstr "Lật qua trục X" +msgstr "Đảo chiều trên trục X" msgid "Flip on the Y axis" -msgstr "Lật qua trục Y" +msgstr "Đảo chiều trên trục Y" msgid "Convert Float" -msgstr "Đổi Số Thật" +msgstr "Đổi Sang Float" msgid "Convert input to float data" -msgstr "Biến đổi ngõ vào sang dữ liệu số thật" +msgstr "Đổi dữ liệu cung cấp thành dữ liệu số thực (float)" msgid "Use a preview proxy and/or time-code index for this strip" -msgstr "Dùng một đại lý dự khán và/hay chỉ số mã thời gian cho đoạn này" +msgstr "Dùng đại diện xem trước và/hoặc chỉ số mã thời gian cho đoạn phim này" msgid "Reverse Frames" -msgstr "Trở Lui Bức Ảnh" +msgstr "Đảo Ngược các Khung Hình" msgid "Reverse frame order" -msgstr "Sắp xếp thứ tự bức ảnh ngược" +msgstr "Đảo ngược trật tự của khung hình" msgid "Add Sequence" @@ -86688,55 +95337,55 @@ msgstr "Thêm Trình Tự" msgid "Input 1" -msgstr "Ngõ Vào 1" +msgstr "Đầu Vào 1" msgid "First input for the effect strip" -msgstr "Ngõ ào thứ nhất cho đoạn hiệu ứng" +msgstr "Đầu vào thứ nhất cho dải hiệu ứng" msgid "Input 2" -msgstr "Ngõ Vào 2" +msgstr "Đầu Vào 2" msgid "Second input for the effect strip" -msgstr "Ngõ vào thứ hai cho đoạn hiệu ứng" +msgstr "Đầu vào thứ hai cho dải hiệu ứng" msgid "Adjustment Layer Sequence" -msgstr "Trình Tự Chỉnh Lớp" +msgstr "Trình Tự Tầng Điều Chỉnh" msgid "Sequence strip to perform filter adjustments to layers below" -msgstr "Đoạn trình tự để thực hành chỉnh bộ lọc cho lớp dưới" +msgstr "Dải trình tự thi hành các điều chỉnh thanh lọc cho các tầng bên dưới" msgid "Animation End Offset" -msgstr "Dịch Kết Thúc Hoạt Hình" +msgstr "Dịch Chuyển Cuối của Hoạt Họa" msgid "Animation end offset (trim end)" -msgstr "Dịch kết thúc hoạt hình (cắt kết thúc)" +msgstr "Dịch chuyển cuối của hoạt họa (điểm cắt cuối)" msgid "Animation Start Offset" -msgstr "Dịch Bắt Đầu Hoạt Hình" +msgstr "Dịch Chuyển Đầu của Hoạt Họa" msgid "Animation start offset (trim start)" -msgstr "Dịch bắt đầu hoạt hình (cắt bắt đầu)" +msgstr "Dịch chuyển đầu của hoạt họa (điểm cắt đầu)" msgid "Alpha Over Sequence" -msgstr "Trình Tự Độ Đục Trên" +msgstr "Trình Tự Alpha Trên" msgid "Alpha Under Sequence" -msgstr "Trình Tự Độ Đục Dưới" +msgstr "Trình Tự Alpha Dưới" msgid "Color Mix Sequence" -msgstr "Quản Lý Trình Tự Màu" +msgstr "Trình Tự Hòa Trộn Màu" msgid "Color Sequence" @@ -86744,55 +95393,55 @@ msgstr "Trình Tự Màu" msgid "Sequence strip creating an image filled with a single color" -msgstr "Đoạn trình tự đang chế tạo một ảnh chỉ có một màu toàn ảnh" +msgstr "Dải trình tự tạo một hình ảnh được phủ bằng một màu duy nhất" msgid "Effect Strip color" -msgstr "Màu Hiệu Ứng Trình Tự" +msgstr "Màu của Dải Hiệu Ứng" msgid "Cross Sequence" -msgstr "Xuyên Trình Tự" +msgstr "Trình Tự Giao Hòa" msgid "Gamma Cross Sequence" -msgstr "Trình Tự Xuyên Gama" +msgstr "Trình Tự Giao Hòa Gamma" msgid "Gaussian Blur Sequence" -msgstr "Trình Tự Mờ Hóa Gauss" +msgstr "Trình Tự Mờ Nhòe Gaus" msgid "Sequence strip creating a gaussian blur" -msgstr "Đoạn trình tự đang chế tạo mờ hóa Gauss" +msgstr "Dải trình tự tạo mờ nhòe Gaus" msgid "Size of the blur along X axis" -msgstr "Kích cỡ mờ hóa hướng trục X" +msgstr "Kích thước mờ nhòe dọc theo trục X" msgid "Size of the blur along Y axis" -msgstr "Kích cỡ mờ hóa hướng trục Y" +msgstr "Kích thước mờ nhòe dọc theo trục Y" msgid "Glow Sequence" -msgstr "Trình Tự Hào Quang" +msgstr "Dải Hừng Sáng" msgid "Sequence strip creating a glow effect" -msgstr "Đoạn trình tự cho chế tạo một hiệu ứng hào quang" +msgstr "Dải trình tự tạo hiệu ứng hừng sáng" msgid "Blur Distance" -msgstr "Khoảng Cách Mờ Hóa" +msgstr "Khoảng Cách làm Nhòe Mờ" msgid "Radius of glow effect" -msgstr "Bán kính của hiệu ứng hào quang" +msgstr "Bán kính của hiệu ứng hừng sáng" msgid "Boost Factor" -msgstr "Hệ Số Tăng" +msgstr "Hệ Số Gia Tăng" msgid "Brightness multiplier" @@ -86800,31 +95449,31 @@ msgstr "Số nhân độ sáng" msgid "Brightness limit of intensity" -msgstr "Giới hạn độ sáng của cường độ" +msgstr "Giới hạn cường độ của độ sáng" msgid "Accuracy of the blur effect" -msgstr "Độ chính xác của hiệu ứng hào quang" +msgstr "Độ chính xác của hiệu ứng nhòe mờ" msgid "Minimum intensity to trigger a glow" -msgstr "Độ cường cực tiểu cho kích hoạt một hào quang" +msgstr "Cường độ tối thiểu để kích hoạt sự hừng sáng" msgid "Only Boost" -msgstr "Chỉ Tăng" +msgstr "Duy Gia Tăng" msgid "Show the glow buffer only" -msgstr "Chỉ hiện đệm hào quang" +msgstr "Chỉ hiển thị bộ đệm hừng sáng mà thôi" msgid "Multicam Select Sequence" -msgstr "Trình Tự Chọn Đa Máy Quay Phim" +msgstr "Trình Tự Đa Máy Quay Lựa Chọn" msgid "Sequence strip to perform multicam editing" -msgstr "Đoạn trình tự cho thực hành biên tập đa máy quay phim" +msgstr "Dải trình tự thực hiện biên soạn đa máy quay phim" msgid "Multicam Source Channel" @@ -86836,7 +95485,7 @@ msgstr "Trình Tự Nhân" msgid "Over Drop Sequence" -msgstr "Trình Tự Thả Trên" +msgstr "Trình Tự Thả Lên" msgid "SpeedControl Sequence" @@ -86844,7 +95493,7 @@ msgstr "Trình Tự Điều Khiển Tốc Độ" msgid "Sequence strip to control the speed of other strips" -msgstr "Đoạn trình tự cho điều khiển tốc độ của đoạn khác" +msgstr "Đoạn phim cho điều khiển tốc độ của đoạn khác" msgid "Speed Control" @@ -86852,11 +95501,11 @@ msgstr "Điều Khiển Tốc Độ" msgid "Speed control method" -msgstr "Phương pháp kiểm soát tốc độ" +msgstr "Phương pháp điều khiển tốc độ" msgid "Adjust input playback speed, so its duration fits strip length" -msgstr "Chỉnh tốc độ hát của ngõ vào, cho thời gian hát vừa chiều của đoạn" +msgstr "Điều chỉnh tốc độ chơi lại đầu vào, hầu cho thời lượng của nó nó khớp với chiều dài của dải" msgid "Multiply with the speed factor" @@ -86864,11 +95513,11 @@ msgstr "Nhân với hệ số tốc độ" msgid "Frame number of the input strip" -msgstr "Số bức ảnh của đoạn ngõ vào" +msgstr "Số khung hình của dải cung cấp ở đầu vào" msgid "Percentage of the input strip length" -msgstr "Phần trăm của chiều dài của đoạn ngõ vào" +msgstr "Tỷ lệ phần trăm của chiều dài dải cung cấp ở đầu vào" msgid "Multiply Factor" @@ -86876,27 +95525,27 @@ msgstr "Hệ Số Nhân" msgid "Multiply the current speed of the sequence with this number or remap current frame to this frame" -msgstr "Nhân tốc độ hiện tại của đoạn với số này hay ánh xạ lại bức ảnh hiện tại đến bức ảnh này" +msgstr "Nhân tốc độ hiện tại của trình tự với số này hay ánh xạ lại khung hình hiện tại sang khung hình này" msgid "Frame number of input strip" -msgstr "Số bức ảnh của đoạn ngõ vào" +msgstr "Số khung hình của dải cung cấp ở đầu vào" msgid "Percentage of input strip length" -msgstr "Phần trăm của chiều dài của đoạn ngõ vào" +msgstr "Tỷ lệ phần trăm chiều dài của dải cung cấp ở đầu vào" msgid "Frame Interpolation" -msgstr "Nội Suy Bức Ảnh" +msgstr "Nội Suy Khung Hình" msgid "Do crossfade blending between current and next frame" -msgstr "Phai giữa bức ảnh hiện tại và bức ảnh kế" +msgstr "Tạo hiệu ứng chuyển cảnh pha trộn nhòe mờ cắt ngang giữa khung hình hiện tại và khung hình tiếp theo" msgid "Subtract Sequence" -msgstr "Trình Tự Trừ" +msgstr "Trình Tự Khấu Trừ" msgid "Text Sequence" @@ -86904,23 +95553,23 @@ msgstr "Trình Tự Văn Bản" msgid "Sequence strip creating text" -msgstr "Đoạn trình tự cho chế tạo văn bản" +msgstr "Dải trình tự tạo văn bản" msgid "Align X" -msgstr "Sắp Xếp X" +msgstr "Căn Chỉnh X" msgid "Align the text along the X axis, relative to the text bounds" -msgstr "Sắp xếp văn bản theo trục X, tương đối với ranh giới của văn bản" +msgstr "Căn chỉnh văn bản dọc theo trục X, tương đối với biên giới của văn bản" msgid "Align Y" -msgstr "Sắp Xếp Y" +msgstr "Căn Chỉnh Y" msgid "Align the text along the Y axis, relative to the text bounds" -msgstr "Sắp xếp văn bản theo trục Y, tương đối với ranh giới của văn bản" +msgstr "Căn chỉnh văn bản dọc theo trục X, tương đối với biên giới của văn bản" msgid "Box Color" @@ -86932,124 +95581,156 @@ msgstr "Lề Hộp" msgid "Box margin as factor of image width" -msgstr "Lề hệp là tỉ số của bề rộng ảnh" +msgstr "Lề hộp như hệ số chiều rộng của hình ảnh" msgid "Text color" -msgstr "Màu văn bản" +msgstr "Màu của văn bản" msgid "Size of the text" -msgstr "Kích cỡ văn bản" +msgstr "Cỡ văn bản" msgid "Location of the text" -msgstr "Vị trị của văn bản" +msgstr "Vị trí của văn bản" msgid "Text that will be displayed" -msgstr "Văn bản được hiển thị" +msgstr "Văn bản để hiển thị" msgid "Display text as bold" -msgstr "Hiển thị văn bản đậm" +msgstr "Hiển thị văn bản dưới dạng chữ đậm" + + +msgctxt "Sequence" +msgid "Box" +msgstr "Hình Hộp" msgid "Display colored box behind text" -msgstr "Hiện hộp màu phía sau văn bản" +msgstr "Hiển thị hình hộp có màu đằng sau văn bản" msgid "Display text as italic" -msgstr "Hiển thị văn bản nghiêng" +msgstr "Hiển thị văn bản dưới dạng chữ nghiêng" msgid "Display shadow behind text" -msgstr "Hiện bóng tối phía sau văn bản" +msgstr "Hiển thị bóng tối đằng sau văn bản" msgid "Wrap Width" -msgstr "Bề Rộng Dòng Lại" +msgstr "Chiều Rộng Trang" msgid "Word wrap width as factor, zero disables" -msgstr "Dùng bề rộng dòng lại, đặt = 0 để tắt" +msgstr "Dùng chiều rộng của trang, trước khi xuống dòng, làm hệ số, đặt = 0 để tắt" msgid "Transform Sequence" -msgstr "Biến Hóa Trình Tự" +msgstr "Trình Tự Biến Hóa" msgid "Sequence strip applying affine transformations to other strips" -msgstr "Đoạn trình tự áp dụng biến họa phỏng xạ cho đoạn khác" +msgstr "Dải trình tự áp dụng biến đổi Afin tới các dải khác" msgid "Method to determine how missing pixels are created" -msgstr "Phương pháp để xác định làm sao chế tạo điểm ảnh thiếu" +msgstr "Phương pháp xác định cách kiến tạo các điểm ảnh còn thiếu" msgid "Bilinear interpolation" -msgstr "Suy Nội Nhị Bậc Một" +msgstr "Nội suy song tuyến tính" msgid "Bicubic interpolation" -msgstr "Suy Nội Nhị Lập Phương" +msgstr "Nội suy song lập phương" msgid "Degrees to rotate the input" -msgstr "Độ để xoay ngõ vào" +msgstr "Góc độ để xoay đầu vào" msgid "Amount to scale the input in the X axis" -msgstr "Mức để phóng to ngõ vào hướng trục X" +msgstr "Lượng tỷ lệ đổi đầu vào trên trục X" msgid "Amount to scale the input in the Y axis" -msgstr "Mức để phóng to ngõ vào hướng trục Y" +msgstr "Lượng tỷ lệ đổi đầu vào trên trục Y" msgid "Translate X" -msgstr "Dịch X" +msgstr "Dịch Chuyển X" msgid "Amount to move the input on the X axis" -msgstr "Mức để di chuyển ngõ vào hướng trục X" +msgstr "Lượng di chuyển đầu vào trên trục X" msgid "Translate Y" -msgstr "Dịch Y" +msgstr "Dịch Chuyển Y" msgid "Amount to move the input on the Y axis" -msgstr "Mức để di chuyển ngõ vào hướng trục Y" +msgstr "Lượng di chuyển đầu vào trên trục Y" msgid "Translation Unit" -msgstr "Đơn Vị Dịch" +msgstr "Đơn Vị Dịch Chuyển" msgid "Unit of measure to translate the input" -msgstr "Đơn vị đo cho địch ngõ vào" +msgstr "Đơn vị đo lường để dịch chuyển đầu vào" msgid "Scale uniformly, preserving aspect ratio" -msgstr "Phóng to đều, giữ nguyên tỉ số cạnh" +msgstr "Đổi tỷ lệ đồng đều, giữ nguyên tỷ lệ khung hình" msgid "Wipe Sequence" -msgstr "Trình Tự Lau" +msgstr "Trình Tự Gạt" msgid "Sequence strip creating a wipe transition" -msgstr "Đoạn trình cho chế tạo một tiến triển lau" +msgstr "Dải trình tự kiến tạo hiệu ứng chuyển cảnh gạt" + + +msgid "Angle of the transition" +msgstr "Góc Chuyển Tiếp" msgid "Blur Width" -msgstr "Bề Rộng Mờ" +msgstr "Độ Rộng Nhòe Mờ" + + +msgid "Width of the blur for the transition, in percentage relative to the image size" +msgstr "Độ rộng nhòe mờ trong chuyển tiếp, tính theo tỷ lệ phần trăm so với kích thước của hình ảnh" + + +msgctxt "Sequence" +msgid "Direction" +msgstr "Chiều Hướng" + + +msgid "Whether to fade in or out" +msgstr "Mờ dần vào hay ra" + + +msgctxt "Sequence" +msgid "Out" +msgstr "Ra" + + +msgctxt "Sequence" +msgid "In" +msgstr "Vào" msgctxt "Sequence" msgid "Transition Type" -msgstr "Loại Tiến Triển" +msgstr "Kiểu Chuyển Cảnh" msgctxt "Sequence" @@ -87059,12 +95740,12 @@ msgstr "Đơn" msgctxt "Sequence" msgid "Double" -msgstr "Đôi" +msgstr "Gấp Đôi" msgctxt "Sequence" msgid "Iris" -msgstr "Tròn Mắt" +msgstr "Iris/Tròng Mắt" msgctxt "Sequence" @@ -87073,19 +95754,19 @@ msgstr "Đồng Hồ" msgid "Sequence strip to load one or more images" -msgstr "Đoạn trình tự cho nhập một ảnh trở lên" +msgstr "Dải trình tự để nạp một hoặc nhiều hình ảnh vào" msgid "Mask Sequence" -msgstr "Trình Tự Mặt Nạ" +msgstr "Trình Tự Màn Chắn Lọc" msgid "Sequence strip to load a video from a mask" -msgstr "Đoạn trình tự cho nhập một video từ một mặt nạ" +msgstr "Dải trình tự để nạp một video từ một màn chắn lọc" msgid "Mask that this sequence uses" -msgstr "Trình tự này đang dùng mặt nạ nào" +msgstr "Màn Chắn Lọc mà trình tự này đang sử dụng" msgid "Meta Sequence" @@ -87093,7 +95774,7 @@ msgstr "Siêu Trình Tự" msgid "Sequence strip to group other strips as a single sequence strip" -msgstr "Đoạn trình tự cho nhóm lại các đoạn khác thành một đoạn trình tự" +msgstr "Dải trình tự để nhóm các dải khác lại thành một" msgid "Sequences" @@ -87101,7 +95782,7 @@ msgstr "Các Trình Tự" msgid "Sequences nested in meta strip" -msgstr "Các trình tự đệ quy trong siêu trình tự" +msgstr "Các trình tự lồng trong dải siêu" msgid "MovieClip Sequence" @@ -87109,27 +95790,27 @@ msgstr "Trình Tự Đoạn Phim" msgid "Sequence strip to load a video from the clip editor" -msgstr "Đoạn trình tự để nhập một video từ trình biên soạn đoạn phim" +msgstr "Dải trình tự để nạp một video từ trình biên soạn phim" msgid "Frames per second" -msgstr "Bức ảnh/giây" +msgstr "Số khung hình mỗi giây" msgid "Stabilize 2D Clip" -msgstr "Ổn Định Hóa Đoạn Phim 2D" +msgstr "Đoạn Phim Ổn Định Hóa 2D" msgid "Use the 2D stabilized version of the clip" -msgstr "Dùng phiên bản đoạn phim 2D được ổn định hóa" +msgstr "Dùng phiên bản đã ổn định hóa 2D của đoạn phim" msgid "Undistort Clip" -msgstr "Đoạn Phim Không Méo Hóa" +msgstr "Đoạn Phim Chưa Biến Dạng" msgid "Use the undistorted version of the clip" -msgstr "Dùng phiên bản đoạn phim không bị méo hóa" +msgstr "Dùng phiên bản đoạn phim chưa bị biến dạng" msgid "Movie Sequence" @@ -87137,67 +95818,84 @@ msgstr "Trình Tự Phim" msgid "Sequence strip to load a video" -msgstr "Đoạn trình tự cho nhập một video" +msgstr "Dải trình tự để nạp video" + + +msgid "Retiming Keys" +msgstr "Khóa Tính Lại Thời Gian" msgid "Stream Index" -msgstr "Chỉ Số Dòng" +msgstr "Chỉ Số của Luồng" msgid "For files with several movie streams, use the stream with the given index" -msgstr "Cho tập tin có nhiều dòng phim, dùng dòng có chỉ số được xác định" +msgstr "Dành cho các tập tin phim đa luồng, dùng luồng có chỉ số đã cho" msgid "Mode to load movie views" -msgstr "Chế độ cho nhập màn phim" +msgstr "Chế độ nạp các góc nhìn của phim" msgid "Scene Sequence" msgstr "Trình Tự Cảnh" +msgid "Sequence strip using the rendered image of a scene" +msgstr "Dải trình tự sử dụng hình ảnh kết xuất của một cảnh" + + msgid "Scene that this sequence uses" -msgstr "Cảnh trình tự này đang dùng" +msgstr "Cảnh mà trình tự này đang sử dụng" msgid "Camera Override" -msgstr "Vượt Quyền Máy Quay Phim" +msgstr "Thay Thế Máy Quay Phim" + + +msgid "Override the scene's active camera" +msgstr "Vượt quyền máy quay phim đang hoạt động của cảnh" msgid "Input type to use for the Scene strip" -msgstr "Loại ngõ vào cho đoạn Cảnh" +msgstr "Loại đầu vào sử dụng cho đoạn phim của Cảnh" msgid "Use the Scene's 3D camera as input" -msgstr "Dùng máy quay phim 3D của Cảnh cho làm ngõ vào" +msgstr "Sử dụng máy quay phim 3D của Cảnh làm đầu vào" msgid "Use the Scene's Sequencer timeline as input" -msgstr "Dùng thời lịch của Bộ Trình Tự của Cảnh cho làm ngõ vào" +msgstr "Sử dụng dòng thời gian trong Trình Phối Hình của cảnh làm đầu vào" msgid "Use Annotations" -msgstr "Dùng Lời Ghi Chú" +msgstr "Sử dụng Chú thích" msgid "Show Annotations in OpenGL previews" -msgstr "Hiện Lời Ghi Chú trong dự khán OpenGL" +msgstr "Hiển thị Chú Thích trong các xem trước OpenGL" msgid "Playback volume of the sound" -msgstr "Âm lượng hát lại âm thanh" +msgstr "Âm lượng chơi lại" msgid "Sound Sequence" -msgstr "Trình Tự Âm Thanh" +msgstr "Dãy Âm Thanh" msgid "Sequence strip defining a sound to be played over a period of time" -msgstr "Đoạn trình tự được chỉ định một âm thanh cho hát qua một giai đoạn thời gian" +msgstr "Đoạn phim xác định một âm thanh được chơi lại qua một giai đoạn thời gian" + + +msgctxt "Sound" +msgid "Pan" +msgstr "Lia" msgid "Playback panning of the sound (only for Mono sources)" -msgstr "Hát lại dời âm thanh (chỉ cho nguồn Độc kênh)" +msgstr "Chơi lại sự luân chuyển của âm thanh (chỉ cho các nguồn Đơn Kênh (Mono))" msgid "Display Waveform" @@ -87205,71 +95903,71 @@ msgstr "Hiển Thị Dạng Sóng" msgid "Display the audio waveform inside the strip" -msgstr "Hiển thị dạng sóng của âm thanh ở trong đoạn" +msgstr "Hiển thị hình sóng âm bên trong đoạn phim" msgid "Sound data-block used by this sequence" -msgstr "Cục dữ liệu âm thanh được trình tự này dùng" +msgstr "Khối dữ liệu âm thanh mà trình tự này sử dụng" msgid "Sequence Color Balance Data" -msgstr "Dữ Liệu Thăng Bằng Màu Của Trình Tự" +msgstr "Dữ Liệu Cân Bằng Màu của Trình Tự" msgid "Color balance parameters for a sequence strip and its modifiers" -msgstr "Tham số thăng bằng màu sắc cho một đoạn trình tự và các bộ điều chỉnh của nó" +msgstr "Tham số cân bằng màu cho một dải trình tự và các bộ điều chỉnh của nó" msgid "Correction Method" -msgstr "Phương Pháp Sửa Chữa" +msgstr "Phương Pháp Chỉnh Sửa" msgid "Color balance gain (highlights)" -msgstr "Tăng lượng thăng bằng màu (điểm sáng)" +msgstr "Khuếch đại cân bằng màu (vùng nêu bật)" msgid "Color balance gamma (midtones)" -msgstr "Gama thăng bằng màu (điều trung)" +msgstr "Gamma của cân bằng màu (sắc thái ở vùng trung độ (midtones))" msgid "Inverse Gain" -msgstr "Tăng Lượng Nghịch" +msgstr "Đảo Nghịch Khuếch Đại" msgid "Invert the gain color" -msgstr "Đảo nghịch màu tăng lượng" +msgstr "Đảo nghịch màu khuếch đại" msgid "Inverse Gamma" -msgstr "Đảo Nghịch Gama" +msgstr "Đảo Nghịch Gamma" msgid "Invert the gamma color" -msgstr "Đảo nghịch màu gama" +msgstr "Đảo nghịch màu gamma" msgid "Inverse Lift" -msgstr "Nâng Nghịch" +msgstr "Đảo Nghịch Màu Nâng" msgid "Invert the lift color" -msgstr "Đảo nghịch màu nâng" +msgstr "Đảo nghịch màu nâng sáng" msgid "Inverse Offset" -msgstr "Nới Đảo Nghịch" +msgstr "Đảo Nghịch Dịch Chuyển" msgid "Invert the offset color" -msgstr "Đảo nghịch màu nới" +msgstr "Đảo nghịch màu dịch chuyển" msgid "Inverse Power" -msgstr "Đảo Nghịch Lũy Thừa" +msgstr "Đảo Nghịch Năng Lượng" msgid "Invert the power color" -msgstr "Đảo nghịch màu lũy thừa" +msgstr "Đảo nghịch màu năng lượng" msgid "Inverse Slope" @@ -87281,167 +95979,190 @@ msgstr "Đảo nghịch màu dốc" msgid "Color balance lift (shadows)" -msgstr "Nâng thăng bằng màu (bóng tối)" +msgstr "Nâng sáng cân bằng màu (bóng tối)" msgid "Sequence Color Balance" -msgstr "Thăng Bằng Màu Trình Tự" +msgstr "Cân Bằng Màu của Trình Tự" msgid "Color balance parameters for a sequence strip" -msgstr "Tham số thăng bằng cho một đoạn trình tự" +msgstr "Tham số cân bằng màu cho một dải trình tự" msgid "Sequence Crop" -msgstr "Cắt Trình Tự" +msgstr "Cắt Xén Trình Tự" msgid "Cropping parameters for a sequence strip" -msgstr "Tham số cắt cho một đoạn trình tự" +msgstr "Các tham số để cắt xén một dải trình tự" msgid "Number of pixels to crop from the right side" -msgstr "Số lượng điểm ảnh để xén từ phía phải" +msgstr "Số điểm ảnh để cắt xén từ bên phải" msgid "Number of pixels to crop from the top" -msgstr "Số lượng điểm ảnh để cắt từ phía trên" +msgstr "Số điểm ảnh để cắt xén từ đỉnh" msgid "Number of pixels to crop from the left side" -msgstr "Số lượng điểm ảnh để cắt từ phía trái" +msgstr "Số điểm ảnh để cắt xén từ bên trái" msgid "Number of pixels to crop from the bottom" -msgstr "Số lượng điểm ảnh để cắt từ phía dưới" +msgstr "Số điểm ảnh để cắt xén từ đáy" msgid "Sequence editing data for a Scene data-block" -msgstr "Dữ liệu biên tập trình tự cho một cục dữ liệu Cảnh" +msgstr "Dữ liệu biên soạn của trình phối hình cho một khối dữ liệu Cảnh" msgid "Active Strip" -msgstr "Đoạn Hoạt Động" +msgstr "Dải đang Hoạt Động" msgid "Sequencer's active strip" -msgstr "Đoạn hoạt động của bộ trình tự" +msgstr "Dải đang hoạt động của Trình Phối Hình" msgid "Meta Stack" -msgstr "Siêu Xếp Đống" +msgstr "Siêu Ngăn Xếp" msgid "Meta strip stack, last is currently edited meta strip" -msgstr "Xếp đống siêu đoạn, cuối là siêu đoạn hiện tại đang biên tập" +msgstr "Ngăn xếp của siêu đoạn phim, đoạn cuối cùng là siêu đoạn hiện đang biên soạn" msgid "Overlay Offset" -msgstr "Dịch Lớp Che Trên" +msgstr "Dịch Chuyển Lớp Lồng" msgid "Number of frames to offset" -msgstr "Số bức ảnh để dịch" +msgstr "Số lượng khung hình để dịch chuyển" msgid "Proxy Directory" -msgstr "Thư Mục Đại Lý" +msgstr "Thư Mục Đại Diện" + + +msgctxt "Sequence" +msgid "Proxy Storage" +msgstr "Lưu Trữ Đại Diện" msgid "How to store proxies for this project" -msgstr "Làm sao chứa đại lý cho dự án này" +msgstr "Phương pháp lưu trữ bản đại diện cho đề án này" + + +msgctxt "Sequence" +msgid "Per Strip" +msgstr "Mỗi Dải" msgid "Store proxies using per strip settings" -msgstr "Chứa đại lý dùng cài đặt từng đoạn" +msgstr "Lưu trữ bản đại diện dùng sắp đặt của riêng từng dải phim một" + + +msgctxt "Sequence" +msgid "Project" +msgstr "Đề Án" msgid "Store proxies using project directory" -msgstr "Chứa đại lý bằng thư mục dự án" +msgstr "Lưu trữ bản đại diện dùng thư mục của đề án" + + +msgid "Retiming Key Selection Status" +msgstr "Trạng Thái Lựa Chọn Khóa Tính Lại Thời Gian" msgid "Top-level strips only" -msgstr "Chỉ đoạn mức cấp cao nhất" +msgstr "Duy các dải phim ở tầng trên cùng" msgid "All Sequences" -msgstr "Hết Trình Tự" +msgstr "Toàn Bộ các Trình Tự" msgid "All strips, recursively including those inside metastrips" -msgstr "Hết đoạn, đệ quy gồm các đoạn trong siêu đoạn" +msgstr "Toàn bộ các dải phim - bao gồm toàn bộ các đoạn trong siêu đoạn một cách đệ quy" msgid "Show Cache" -msgstr "Hiện Đệm Chứa" +msgstr "Hiển Thị Bộ Nhớ Đệm" msgid "Visualize cached images on the timeline" -msgstr "Hiện các ảnh được chứa trên thời lịch" +msgstr "Trực quan hóa các hình ảnh đã lưu trong bộ nhớ đệm trên dòng thời gian" msgid "Composite Images" -msgstr "Ghép Ảnh" +msgstr "Hình Ảnh Tổng Hợp" msgid "Visualize cached composite images" -msgstr "Hiện các ảnh ghép được chứa" +msgstr "Trực quan hóa các hình ảnh tổng hợp lưu trong bộ nhớ đệm" msgid "Final Images" -msgstr "Các Ảnh Cuối Cùng" +msgstr "Hình Ảnh Kết Thúc" msgid "Visualize cached complete frames" -msgstr "Hiện các ảnh hoàn thành được chứa" +msgstr "Trực quan hóa các khung hình hoàn thiện lưu trong bộ nhớ đệm" + + +msgid "Preprocessed Images" +msgstr "Hình Ảnh Xử Lý Trước" msgid "Visualize cached pre-processed images" -msgstr "Hiển thị các ảnh tiền qùa trình được chứa" +msgstr "Trực quan hóa các hình ảnh đã được tiền xử lý và lưu trong bộ nhớ đệm" msgid "Raw Images" -msgstr "Ảnh Nguyên Thủy" +msgstr "Hình Ảnh Thô" msgid "Visualize cached raw images" -msgstr "Hiện ảnh nguyên thủy được chứa" +msgstr "Trực quan hóa các hình ảnh thô/gốc lưu trong bộ nhớ đệm" msgid "Show Overlay" -msgstr "Hiện Lớp Che" +msgstr "Hiển Thị Lớp Lồng" msgid "Partial overlay on top of the sequencer with a frame offset" -msgstr "Lớp che một phần lên trên bộ trình tự với một địch bức ảnh" +msgstr "Vẽ lồng một phần nào đó trên trình phối hình với sự dịch chuyển khung hình" msgid "Cache Final" -msgstr "Chứa Cuối Cùng" +msgstr "Lưu bản Kết Thúc trong Bộ Nhớ Đệm" msgid "Cache final image for each frame" -msgstr "Chứa ảnh cuối cùng cho mỗi bức ảnh" +msgstr "Lưu các hình ảnh kết thúc trong bộ nhớ đệm" msgid "Overlay Lock" -msgstr "Khóa Lớp Che" +msgstr "Khóa Lớp Lồng" msgid "Prefetch Frames" -msgstr "Chứa Trước Các Bức Ảnh" +msgstr "Nạp Sẵn các Khung Hình" msgid "Render frames ahead of current frame in the background for faster playback" -msgstr "Kết xuất bức ảnh trước bức ảnh hiện tại trong phía sau cho được hát lại nhanh hơn" +msgstr "Vượt trước kết xuất khung hình hiện tại ở nền, hòng giúp chơi lại được nhanh hơn" msgid "Sequence Element" -msgstr "Phần Tử Trình Tự" +msgstr "Phần Tử của Trình Tự" msgid "Sequence strip data for a single frame" -msgstr "Dữ liệu đoạn trình tự cho một bức ảnh" +msgstr "Dữ liệu dải trình tự cho riêng một khung hình" msgid "Name of the source file" @@ -87449,99 +96170,103 @@ msgstr "Tên của tập tin nguồn" msgid "Orig FPS" -msgstr "Bức Ảnh/Giây Ban Đầu" +msgstr "Khung Hình/Giây Ban Đầu" msgid "Original frames per second" -msgstr "Bức ảnh/giây ban đầu" +msgstr "Số khung hình mỗi giây ban đầu" msgid "Orig Height" -msgstr "Bề Cao Ban Đầu" +msgstr "Chiều Cao Ban Đầu" msgid "Original image height" -msgstr "Bề cao ban đầu của ảnh" +msgstr "Chiều cao ban đầu của hình ảnh" msgid "Orig Width" -msgstr "Bề Rộng Ban Đầu" +msgstr "Chiều Rộng Ban Đầu" msgid "Original image width" -msgstr "Bề rộng ban đầu của ảnh" +msgstr "Chiều rộng ban đầu của hình ảnh" msgid "Collection of SequenceElement" -msgstr "Sưu tập Phần Tử Trình Tự" +msgstr "Bộ Sưu Tập của Phần Tử Trình Tự" msgid "Modifier for sequence strip" -msgstr "Bộ điều chỉnh cho đoạn trình tự" +msgstr "Bộ điều chỉnh cho dải trình tự" msgid "Mask ID used as mask input for the modifier" -msgstr "ID mặt nạ dùng làm mặt nạ ngõ vào cho bộ điều chỉnh" +msgstr "Chỉ danh ID của Màn Chắn Lọc được sử dụng làm nguồn cung cấp màn chắn lọc cho bộ điều chỉnh" msgid "Mask Strip" -msgstr "Đoạn Mặt Nạ" +msgstr "Dải Màn Chắn Lọc" msgid "Strip used as mask input for the modifier" -msgstr "Đoạn được dùng làm mặt nạ ngõ vào cho bộ điều chỉnh" +msgstr "Dải phim được sử dụng làm nguồn màn chắn lọc cung cấp cho bộ điều chỉnh" msgid "Mask Input Type" -msgstr "Loại Mạt Nạ Ngõ Vào" +msgstr "Thể Loại Màn Chắn Lọc Cung Cấp" msgid "Type of input data used for mask" -msgstr "Loại dữ liệu ngõ vào dùng cho mặt nạ" +msgstr "Loại dữ liệu cung cấp dùng làm màn chắn lọc" msgid "Use sequencer strip as mask input" -msgstr "Dùng đoạn bộ trình tự làm mặt nạ ngõ vào" +msgstr "Dùng dải trình tự của trình phối hình làm nguồn cung cấp màn chắn lọc" msgid "Use mask ID as mask input" -msgstr "Dùng ID mặt nạ làm mặt nạ ngõ vào" +msgstr "Dùng ID của màn chắn lọc làm nguồn màn chắn lọc cung cấp" msgid "Mask Time" -msgstr "Thời Gian Mặt Nạ" +msgstr "Thời Gian của Màn Chắn Lọc" msgid "Time to use for the Mask animation" -msgstr "Thời gian áp dụng hoạt hình Mặt Nạ" +msgstr "Thời điểm sử dụng hoạt họa Màn Chắn Lọc" msgid "Mask animation is offset to start of strip" -msgstr "Hoạt hình mặt nạ được dịch từ đầu của đoạn" +msgstr "Hoạt họa Màn Chắn Lọc nằm lệch với điểm đầu của đoạn phim" msgid "Mask animation is in sync with scene frame" -msgstr "Hoạt hình mặt nạ được đồng hành với bức ảnh cảnh" +msgstr "Hoạt họa Màn Chắn Lọc đồng hành với khung hình trong cảnh" msgid "Mute this modifier" -msgstr "Cắt tiếng bộ điều chỉnh này" +msgstr "Chặn/Tắt hoạt tính bộ điều chỉnh này" msgid "Mute expanded settings for the modifier" -msgstr "Cắt tiếng cài đặt mở rộng cho bộ điều chỉnh" +msgstr "Chặn/Tắt sắp đặt mở rộng cho bộ điều chỉnh" msgid "Tone Map" -msgstr "Ánh Xạ Độ Xám" +msgstr "Ánh Xạ Sắc Thái" msgid "White Balance" -msgstr "Thăng Bằng Trắng" +msgstr "Cân Bằng Trắng" + + +msgid "Sound Equalizer" +msgstr "Bộ Cân Bằng Âm Thanh" msgid "Bright/contrast modifier data for sequence strip" -msgstr "Dữ liệu của bộ điều chỉnh độ sáng/chênh lệch cho đoạn trình tự" +msgstr "Dữ liệu của bộ điều chỉnh độ (sáng/tương phản) cho dải trình tự" msgid "Bright" @@ -87549,15 +96274,15 @@ msgstr "Độ Sáng" msgid "Adjust the luminosity of the colors" -msgstr "Chỉnh quang độ của màu sắc" +msgstr "Điều chỉnh độ sáng của các màu sắc" msgid "Adjust the difference in luminosity between pixels" -msgstr "Chỉnh chênh lệch quang độ giữa điểm ảnh" +msgstr "Điều chỉnh độ chênh lệch trong độ sáng giữa các điểm ảnh" msgid "Color balance modifier for sequence strip" -msgstr "Cụ thăng bằng màu cho đoạn dãy" +msgstr "Bộ điều chỉnh cân bằng màu sắc cho dải trình tự" msgid "Multiply the intensity of each pixel" @@ -87565,111 +96290,119 @@ msgstr "Nhân cường độ của mỗi điểm ảnh" msgid "RGB curves modifier for sequence strip" -msgstr "Bộ điều chỉnh cong RGB cho đoạn trình tự" +msgstr "Bộ điều chỉnh đường cong RGB cho dải trình tự" msgid "Hue correction modifier for sequence strip" -msgstr "Bộ điều chỉnh màu sắc cho đoạn trình tự" +msgstr "Bộ điều chỉnh sắc màu cho dải trình tự" msgid "Tone mapping modifier" -msgstr "Bộ điều chỉnh ánh xạ độ xám" +msgstr "Bộ điều chỉnh ánh xạ tông màu" msgid "Tone mapping algorithm" -msgstr "Giải thuật ánh xạ độ xám" +msgstr "Thuật toán ánh xạ tông màu" + + +msgid "Equalize audio" +msgstr "Cân bằng âm thanh" + + +msgid "Graphical definition equalization" +msgstr "Cân bằng định nghĩa đồ họa" msgid "White balance modifier for sequence strip" -msgstr "Bộ điều chỉnh thăng bằng trắng cho đoạn trình tự" +msgstr "Bộ điều chỉnh cân bằng trắng cho dải trình tự" msgid "White Value" -msgstr "Giá Trị Trắng" +msgstr "Giá trị màu trắng" msgid "This color defines white in the strip" -msgstr "Màu này được chỉ định màu trắng trong đoạn" +msgstr "Màu này sẽ xác định màu trắng trong dải" msgid "Strip Modifiers" -msgstr "Bộ Điều Chỉnh Đoạn" +msgstr "Bộ Điều Chỉnh Dải" msgid "Collection of strip modifiers" -msgstr "Sưu tập bộ điều chỉnh đoạn" +msgstr "Bộ sưu tập các bộ điều chỉnh dải" msgid "Sequence Proxy" -msgstr "Đại Lý Trình Tự" +msgstr "Đại Diện của Trình Tự" msgid "Proxy parameters for a sequence strip" -msgstr "Tham số đại lý cho một đoạn trình tự" +msgstr "Các tham số của bản đại diện cho một dải trình tự" msgid "Build 100% proxy resolution" -msgstr "Xây lên độ phân giải 100% của đại lý" +msgstr "Kiến dựng bản đại diện với độ phân giải 100%" msgid "Build 25% proxy resolution" -msgstr "Xây lên độ phân giải 25% của đại lý" +msgstr "Kiến dựng bản đại diện với độ phân giải 25%" msgid "Build 50% proxy resolution" -msgstr "Xây lên độ phân giải 50% của đại lý" +msgstr "Kiến dựng bản đại diện với độ phân giải 50%" msgid "Build 75% proxy resolution" -msgstr "Xây lên độ phân giải 75% của đại lý" +msgstr "Kiến dựng bản đại diện với độ phân giải 75%" msgid "Location of custom proxy file" -msgstr "Vị trí của tập tin đại lý tùy chọn" +msgstr "Vị trí của tập tin đại diện tùy chọn" msgid "Quality of proxies to build" -msgstr "Chất lượng của đại lý để xây dựng" +msgstr "Chất lượng của các bản đại diện sẽ xây dựng" msgid "Method for reading the inputs timecode" -msgstr "Phương pháp để nhập mẵ thời gian ngõ vào" +msgstr "Phương pháp để đọc mã thời gian của đầu vào" msgid "Use images in the order as they are recorded" -msgstr "Dùng ảnh theo thứ tự được thâu" +msgstr "Dùng các hình ảnh theo thứ tự được thu" msgid "Record Run No Gaps" -msgstr "Thâu Đoạn Không Có Cách Trống" +msgstr "Quá Trình Thu Không Cách Trống" msgid "Like record run, but ignore timecode, changes in framerate or dropouts" -msgstr "Giống thâu đoạn, nhưng không quan tâm mã thời gian, sự thay đổi tốc độ bức ảnh hay bức ảnh thiếu" +msgstr "Giống quá trình thu, nhưng bỏ qua mã thời gian, các thay đổi trong tần số khung hình hoặc các đoạn bỏ chừng" msgid "Overwrite existing proxy files when building" -msgstr "Vượt quyền cho tập tin đại lý tồn tại khi xây dựng" +msgstr "Viết đè lên các tập tin đại diện đang tồn tại khi kiến dựng" msgid "Use a custom directory to store data" -msgstr "Dùng thư mục tùy chọn cho chứa dữ liệu" +msgstr "Dùng thư mục tùy chọn để lưu trữ dữ liệu" msgid "Proxy Custom File" -msgstr "Tập Tin Đại Lý Tùy Chọn" +msgstr "Tập Tin Đại Diện Tùy Chọn" msgid "Use a custom file to read proxy data from" -msgstr "Xày dựng một tập tin tùy chọn để nhập dữ liệu đại lý" +msgstr "Dùng một tập tin tùy chọn để đọc dữ liệu đại diện" msgid "Lock channel" -msgstr "Khóa kênh" +msgstr "Khóa Kênh" msgid "Mute channel" -msgstr "Tắt tiếng kênh" +msgstr "Chặn âm thanh của kênh" msgid "Sequence Transform" @@ -87677,167 +96410,183 @@ msgstr "Biến Hóa Trình Tự" msgid "Transform parameters for a sequence strip" -msgstr "Tham số biến hóa cho một đoạn trình tự" +msgstr "Các tham số biến hóa cho một dải trình tự" msgid "Type of filter to use for image transformation" -msgstr "Loại bộ lọc dùng cho biến hóa ảnh" +msgstr "Thể loại bộ lọc sử dụng cho quá trình biến hóa hình ảnh" + + +msgid "Subsampling (3×3)" +msgstr "Lấy Mẫu Phụ (3×3)" + + +msgid "Use nearest with 3×3 subsamples during rendering" +msgstr "Sử dụng gần nhất với các mẫu phụ 3 × 3 trong quá trình kết xuất" msgid "Move along X axis" -msgstr "Di chuyển hướng trục X" +msgstr "Di chuyển dọc theo trục X" msgid "Move along Y axis" -msgstr "Di chuyển hướng trục Y" +msgstr "Di chuyển dọc theo trục Y" msgid "Origin of image for transformation" -msgstr "Gốc tọa độ cho biến hóa ảnh" +msgstr "Tọa độ gốc của hình ảnh biến hóa" msgid "Rotate around image center" -msgstr "Xoay quanh trung tâm ảnh" +msgstr "Xoay chiều quanh trung tâm hình ảnh" msgid "Scale along X axis" -msgstr "Phóng to hướng trục X" +msgstr "Đổi tỷ lệ dọc theo trục X" msgid "Scale along Y axis" -msgstr "Phóng to hướng trục Y" +msgstr "Đổi tỷ lệ dọc theo trục Y" msgid "Preview Overlay Settings" -msgstr "Cài Đặt Lớp Che Của Dự Khán" +msgstr "Cài Đặt Vẽ Lồng Xem Trước" msgid "Show Annotation" -msgstr "Hiện Lời Ghi Chú" +msgstr "Hiển Thị Chú Thích" msgid "Show annotations for this view" -msgstr "Hiện lời ghi chú cho màn này" +msgstr "Hiển thị các chú thích cho góc nhìn này" msgid "Image Outline" -msgstr "Nét Ngoài Ảnh" +msgstr "Đường Viền Hình Ảnh" msgid "Show Metadata" -msgstr "Hiện Siêu Dữ Liệu" +msgstr "Hiển Thị Siêu Dữ Liệu" msgid "Show metadata of first visible strip" -msgstr "Hiện siêu dữ liệu của đoạn đầu được nhìn thấy" +msgstr "Hiển thị siêu dữ liệu của dải đầu tiên nhìn thấy được" msgid "Show TV title safe and action safe areas in preview" -msgstr "Hiện khu vực an toàn cho tựa truyền hình và an toàn hành động trong dự khán" +msgstr "Hiển thị vùng đảm bảo cho đầu đề và hành động của TV trong xem trước" msgid "Timeline Overlay Settings" -msgstr "Cài Đặt Lớp Che Cho Thời Lịch" +msgstr "Cài Đặt Vẽ Lồng của Dòng Thời Gian" msgid "Show F-Curves" -msgstr "Hiện Các Cong-F" +msgstr "Hiển Thị Đường Cong-F" msgid "Display strip opacity/volume curve" -msgstr "Hiển thị đường cong độ đục/âm lượng của đoạn" +msgstr "Hiển thị đường cong về độ đục/âm lượng của dải" msgid "Show Grid" -msgstr "Hiện Đồ Thị" +msgstr "Hiển Thị Khung Lưới Đồ Thị" msgid "Show vertical grid lines" -msgstr "Hiện đường hướng dẫn dộc" +msgstr "Hiển thị các đường khung lưới đồ thị chiều dọc" msgid "Show Duration" -msgstr "Hiện Bề Dài Thời Gian" +msgstr "Hiển Thị Khoảng Thời Lượng" msgid "Show Offsets" -msgstr "Hiện Dịch" +msgstr "Hiển Thị Dịch Chuyển" msgid "Display strip in/out offsets" -msgstr "Hiển thị địch vào/ra của đoạn" +msgstr "Hiển thị dịch chuyển vào/ra của dải" + + +msgid "Display retiming keys on top of strips" +msgstr "Hiển thị các khóa tính lại thời gian trên đầu các dải" msgid "Show Source" -msgstr "Hiện Nguồn Lưu" +msgstr "Hiển Thị Nguồn" msgid "Display path to source file, or name of source datablock" -msgstr "Hiển thị đường dẩn đến tập tin nguồn gốc, hoặc tên của cục dữ liệu nguồn gốc" +msgstr "Hiển thị đường dẫn đến tập tin, hoặc tên của khối dữ liệu nguồn" msgid "Show Color Tags" -msgstr "hiện Thẻ Màu" +msgstr "Hiển Thị các Thẻ Đánh Dấu Màu" msgid "Display the strip color tags in the sequencer" -msgstr "Hiển thị các thẻ màu của đoạn trong bộ trình tự" +msgstr "Hiển thị các thẻ đánh dấu màu của dải trong trình phối hình" msgid "Show Thumbnails" -msgstr "Hiện Ảnh Tem" +msgstr "Hiển Thị Hình Thu Nhỏ" msgid "Show strip thumbnails" -msgstr "Hiện ảnh thêm cho đoạn" +msgstr "Hiển thị các hình thu nhỏ của dải" msgid "Waveform Display" -msgstr "Hiển Thị Dạng Sóng" +msgstr "Hiển Thị Sóng Âm" msgid "How Waveforms are displayed" -msgstr "Làm sao hiển thị dạng sóng" +msgstr "Phương pháp hiển thị Sóng Âm" msgid "Waveforms Off" -msgstr "Tắt Dạng Sóng" +msgstr "Tắt Hình Sóng Âm" msgid "Don't display waveforms for any sound strips" -msgstr "Không hiển thị dạng sóng cho bất cứ đoạn âm thanh" +msgstr "Không hiển thị hình sóng âm cho bất cứ dải âm thanh nào" msgid "Waveforms On" -msgstr "Bật Dạng Sóng" +msgstr "Bật Hình Sóng Âm" msgid "Display waveforms for all sound strips" -msgstr "Hiển thị dạng sóng cho hết đoạn âm thanh" +msgstr "Hiển thị hình sóng âm cho toàn bộ các dải âm thanh" msgid "Use Strip Option" -msgstr "Dùng Tùy Chọn Đoạn" +msgstr "Dùng Tùy Chọn của Dải" msgid "Display waveforms depending on strip setting" -msgstr "Hiển thị dạng sóng tùy cài đặt của đoạn" +msgstr "Hiển thị hình sóng tùy theo cài đặt của dải" msgid "Sequencer Tool Settings" -msgstr "Cài Đặt Dụng Cụ Bộ Trình Tự" +msgstr "Các Cài Đặt của Công Cụ Phối Hình" msgid "Overlap Mode" -msgstr "Chế Độ Lấn Trên" +msgstr "Chế Độ Đè Gối Lên Nhau" msgid "How to resolve overlap after transformation" -msgstr "Làm sao giải quyết lấn trên sau biến hóa" +msgstr "Phương pháp sử dụng để xử lý tình trạng đè gối lên nhau sau khi biến hóa" + + +msgid "Move strips so transformed strips fit" +msgstr "Di chuyển các dải sao cho các dải biến hóa khít vừa vặn" msgid "Trim or split strips to resolve overlap" -msgstr "Cắt hay chẻ đoạn để giải quyết lấn trên" +msgstr "Cắt xén hoặc tách phân các dải để xử lý tình trạng đè gối lên nhau" msgid "Shuffle" @@ -87849,11 +96598,11 @@ msgstr "Di chuyển các đoạn đến chỗ trống gần hất cho giải quy msgid "Rotation or scaling pivot point" -msgstr "Điểm tựa xoay hay phóng to" +msgstr "Xoay chiều hoặc tỷ lệ hóa điểm tựa" msgid "Bounding Box Center" -msgstr "Trung Tâm Hộp Bao Quanh" +msgstr "Trung Tâm Khung Hộp Viền" msgid "Median Point" @@ -87861,71 +96610,71 @@ msgstr "Điểm Trung Vị" msgid "Pivot around the 2D cursor" -msgstr "Tựa quanh con trỏ 2D" +msgstr "Dùng con trỏ 2D làm điểm tựa" msgid "Individual Origins" -msgstr "Tọa Độ Gốc Riêng" +msgstr "Tọa Độ Gốc Cá Nhân" msgid "Pivot around each selected island's own median point" -msgstr "Tựa quanh điểm trung vị của mỗi hòn đảo được chọn" +msgstr "Dùng điểm trung vị riêng của mỗi hải đảo đã chọn làm điểm tựa" msgid "Snapping Distance" -msgstr "Khoảng Cách Hút Dính" +msgstr "Khoảng Cách Bám Dính" msgid "Maximum distance for snapping in pixels" -msgstr "Khoảng cách cực đại cho hút dính trong điểm ảnh" +msgstr "Khoảng cách tối đa để bám dính vào các điểm ảnh" msgid "Ignore Muted Strips" -msgstr "Không quan tâm các đoạn bị cắt tiếng" +msgstr "Bỏ Qua các Dải đã Giải Hoạt (Tắt)" msgid "Don't snap to hidden strips" -msgstr "Không hút dính đến các đoạn được ẩn" +msgstr "Không bám dính vào các dải ẩn giấu" msgid "Ignore Sound Strips" -msgstr "Không Quan Tâm Đoạn Âm Thanh" +msgstr "Bỏ Qua các Dải Âm Thanh" msgid "Don't snap to sound strips" -msgstr "Không hút dính đến các đoạn âm thanh" +msgstr "Không bám dính vào các dải âm thanh" msgid "Snap to current frame" -msgstr "Hút dính đến bức ảnh hiện tại" +msgstr "Bám dính vào khung hình hiện tại" msgid "Hold Offset" -msgstr "Giữ Chỗ Nới" +msgstr "Dịch Chuyển Cắt" msgid "Snap to strip hold offsets" -msgstr "Hút dính đến nới cho giữ chỗ cho đoạn" +msgstr "Bám dính vào dịch chuyển cắt" msgid "Snap Current Frame to Strips" -msgstr "Hút Dính Đến Bức Ảnh đến Đoạn" +msgstr "Bám Dính Khung Hình Hiện Tại vào các Dải" msgid "Snap current frame to strip start or end" -msgstr "Hút dính bức ảnh đến đầu hay cuối đoạn" +msgstr "Bám dính khung hình hiện tại vào điểm khởi đầu hoặc điểm kết của dải" msgid "Collection of Sequences" -msgstr "Sưu Tập Trình Tự" +msgstr "Bộ Sưu Tập các Trình Tự" msgid "Effect affecting the grease pencil object" -msgstr "Hiệu ứng được ảnh hưởng vật thể bút sáp" +msgstr "Hiệu ứng tác động đối tượng Bút Chì Dầu" msgid "Effect name" -msgstr "Tên Hiệu Ứng" +msgstr "Tên của hiệu ứng" msgid "Set effect expansion in the user interface" @@ -87933,43 +96682,43 @@ msgstr "Đặt hiệu ứng mở rộng trong giao điện người dùng" msgid "Display effect in Edit mode" -msgstr "Hiển thị hiệu ứng trong chế độ Biên Tập" +msgstr "Hiển thị hiệu ứng trong chế độ Biên Soạn" msgid "Use effect during render" -msgstr "Dùng hiệu ứng khi kết xuất" +msgstr "Sử dụng hiệu ứng nội trong thời gian kết xuất" msgid "Display effect in viewport" -msgstr "Hiển thị hiệu ứng trong màn chiếu" +msgstr "Hiển thị hiệu ứng trong cổng nhìn" msgid "Gaussian Blur Effect" -msgstr "Hiệu Ứng Mờ Hóa Gauss" +msgstr "Hiệu Ứng Nhòe Mờ Gauss" msgid "Gaussian Blur effect" -msgstr "Hiệu ứng Mờ Hoá Gauss" +msgstr "Hiệu Ứng Nhòe Mờ Gauss" msgid "Rotation of the effect" -msgstr "Xoay của hiệu ứng" +msgstr "Xoay chiều của hiệu ứng" msgid "Number of Blur Samples (zero, disable blur)" -msgstr "Số lượng Mẫu Vật Mờ Hóa (đặt = 0 để tắt)" +msgstr "Số Mẫu Vật Làm Nhòe Mờ (0 là không làm nhòe mờ)" msgid "Factor of Blur" -msgstr "Hệ Số Mờ Hóa" +msgstr "Hệ Số Làm Nhòe Mờ" msgid "Use as Depth Of Field" -msgstr "Dùng Độ Sâu Trường" +msgstr "Sử Dụng Độ Sâu Trường Ảnh" msgid "Blur using camera depth of field" -msgstr "Mờ hóa bằng độ sâu trường của máy quay phim" +msgstr "Làm Nhòe Mờ dùng độ sâu trường ảnh của máy quay phim" msgid "Colorize Effect" @@ -87981,23 +96730,23 @@ msgstr "Hiệu ứng tô màu" msgid "Mix factor" -msgstr "Hệ số pha trộn" +msgstr "Hệ Số Hòa Trộn" msgid "High Color" -msgstr "Màu Cao" +msgstr "Màu Thanh" msgid "Second color used for effect" -msgstr "Màu thứ nhị được dùng cho hiệu ứng" +msgstr "Màu thứ hai sử dụng trong hiệu ứng" msgid "Low Color" -msgstr "Màu Thấp" +msgstr "Màu Trầm" msgid "First color used for effect" -msgstr "Màu thứ nhất được dùng hiệu ứng" +msgstr "Màu thứ nhất sử dụng trong hiệu ứng" msgid "Effect mode" @@ -88005,11 +96754,11 @@ msgstr "Chế độ hiệu ứng" msgid "Gray Scale" -msgstr "Độ Xám" +msgstr "Gam Màu Xám" msgid "Sepia" -msgstr "Độ Nâu" +msgstr "Gam Nâu Đen" msgid "Duotone" @@ -88017,55 +96766,55 @@ msgstr "Nhị Sắc" msgid "Flip Effect" -msgstr "Lật Hiệu Ứng" +msgstr "Đảo Chiều Hiệu Ứng" msgid "Flip effect" -msgstr "Lật hiệu ứng" +msgstr "Đảo chiều hiệu ứng" msgid "Flip image horizontally" -msgstr "Lật ảnh ngang" +msgstr "Đảo chiều hình ảnh theo chiều ngang" msgid "Flip image vertically" -msgstr "Lật ảnh dọc" +msgstr "Đảo chiều hình ảnh theo chiều Dọc" msgid "Glow Effect" -msgstr "Hiệu Ứng Hào Quang" +msgstr "Hiệu Ứng Hừng Sáng" msgid "Glow effect" -msgstr "Hiệu ứng hào quang" +msgstr "Hiệu ứng hừng sáng" msgid "Glow Color" -msgstr "Màu Hào Quang" +msgstr "Màu Hừng Sáng" msgid "Color used for generated glow" -msgstr "Màu được dùng cho hào quang" +msgstr "Màu sử dụng cho sự hừng sáng tạo ra" msgid "Glow mode" -msgstr "Chế độ hào quang" +msgstr "Chế Độ Hừng Sáng" msgid "Effect Opacity" -msgstr "Độ Đục Hiệu Ứng" +msgstr "Độ Đục của Hiệu Ứng" msgid "Number of Blur Samples" -msgstr "Số lượng Mẫu Vật Mờ Hóa" +msgstr "Số Mẫu Vật Làm Nhòe Mờ" msgid "Select Color" -msgstr "Chọn Màu" +msgstr "Chọn theo/Màu" msgid "Color selected to apply glow" -msgstr "Màu được chọn để áp dụng cho hào quang" +msgstr "Màu dùng để áp dụng ánh hừng sáng" msgid "Size of the effect" @@ -88073,15 +96822,15 @@ msgstr "Kích thước của hiệu ứng" msgid "Limit to select color for glow effect" -msgstr "Giới hạn để chọn màu cho hiệu ứng hào quang" +msgstr "Giới hạn hiệu ứng hừng sáng trong màu đã chọn" msgid "Glow Under" -msgstr "Hào Quang Dưới" +msgstr "Hừng Sáng Bên Dưới" msgid "Glow only areas with alpha (not supported with Regular blend mode)" -msgstr "Hào quang chỉ trong vùng có độ đục (kh`ng được hỗ trợ trong chế độ pha trộn Bình Thường)" +msgstr "Duy hừng sáng các khu vực có alpha (không hỗ trợ trong chế độ pha trộn Thông Thường -- Regular blend mode)" msgid "Pixelate Effect" @@ -88093,67 +96842,67 @@ msgstr "Hiệu ứng điểm ảnh hóa" msgid "Pixel size" -msgstr "Kích cỡ điểm ảnh" +msgstr "Kích Thước Điểm Ảnh" msgid "Antialias pixels" -msgstr "Điểm ảnh chống răng cưa" +msgstr "Chống răng cưa các điểm ảnh" msgid "Rim Effect" -msgstr "Hiệu Ứng Vành" +msgstr "Hiệu Ứng Viền Mép" msgid "Rim effect" -msgstr "Hiệu ứng vành" +msgstr "Hiệu ứng viền mép" msgid "Number of pixels for blurring rim (set to 0 to disable)" -msgstr "Số lượng điểm ảnh cho mờ hóa vành (đặt = 0 để tắt)" +msgstr "Số điểm ảnh để làm nhòe mờ vành mép (đặt là 0 để tắt đi)" msgid "Mask Color" -msgstr "Màu Mặt Nạ" +msgstr "Màu Chắn Lọc Ra" msgid "Color that must be kept" -msgstr "Màu thì phải giữ nguyên" +msgstr "Màu cần phải duy trì (không được thay đổi)" msgid "Offset of the rim" -msgstr "Dịch của vành" +msgstr "Dịch chuyển của mép viền" msgid "Rim Color" -msgstr "Màu Vành" +msgstr "Màu của Mép Viền" msgid "Color used for Rim" -msgstr "Màu được dùng cho Vành" +msgstr "Màu sử dụng cho Mép Viền" msgid "Shadow Effect" -msgstr "Hiệu Ứng Bóng Tối" +msgstr "Hiệu Ứng Ngả Bóng" msgid "Shadow effect" -msgstr "Hiệu ứng bóng tối" +msgstr "Hiệu ứng ngả bóng" msgid "Amplitude of Wave" -msgstr "Biên Độ Sóng" +msgstr "Biên Độ của Sóng" msgid "Number of pixels for blurring shadow (set to 0 to disable)" -msgstr "Số lượng điểm ảnh cho mờ hóa bóng tối (đặt = 0 để tắt)" +msgstr "Số điểm ảnh để làm nhòe mờ bóng tối (đặt bằng 0 để tắt đi)" msgid "Object to determine center of rotation" -msgstr "Vật thể cho xác định trung tâm xoay" +msgstr "Đối tượng xác định tâm xoay" msgid "Offset of the shadow" -msgstr "Dịch của bóng tối" +msgstr "Dịch chuyển của bóng tối" msgid "Direction of the wave" @@ -88161,39 +96910,48 @@ msgstr "Hướng của sóng" msgid "Period of Wave" -msgstr "Chu Kỳ của Sóng" +msgstr "Quãng Sóng" msgid "Phase Shift of Wave" -msgstr "Pha của Sóng" +msgstr "Pha Dịch Chuyển của Sóng" msgid "Rotation around center or object" -msgstr "Xoay quanh trung tâm vật hay thể" +msgstr "Sự xoay chiều quanh tâm hoặc quanh đối tượng" + + +msgid "Scale of the shadow" +msgstr "Tỷ Lệ của Bóng Tối" msgid "Color used for Shadow" -msgstr "Màu được dùng cho bóng tối" +msgstr "Màu sử dụng cho Bóng Tối" msgid "Use Object" -msgstr "Dùng Vật Thể" +msgstr "Sử Dụng Đối Tượng" msgid "Use object as center of rotation" -msgstr "Dùng vật thể làm trung tâm xoay" +msgstr "Sử dụng đối tượng làm tâm xoay chiều" + + +msgctxt "GPencil" +msgid "Wave" +msgstr "Sóng" msgid "Use wave effect" -msgstr "Dùng hiệu ứng sóng" +msgstr "Sử dụng hiệu ứng sóng" msgid "Swirl Effect" -msgstr "Hiệu Ứng Xoắn" +msgstr "Hiệu Ứng Xoáy Lốc" msgid "Swirl effect" -msgstr "Hiệu ứng xoắn" +msgstr "Hiệu ứng xoáy lốc" msgid "Angle of rotation" @@ -88201,83 +96959,83 @@ msgstr "Góc xoay" msgid "Object to determine center location" -msgstr "Vật thể để xác định trung tâm vị trí" +msgstr "Đối tượng để xác định vị trí tâm" msgid "Make image transparent outside of radius" -msgstr "Làm ảnh trong suốt ở ngoài bán kính" +msgstr "Làm cho hình ảnh trở nên trong suốt bên ngoài bán kính" msgid "Wave Deformation Effect" -msgstr "Hiệu Ứng Méo Hóa Sóng" +msgstr "Hiệu Ứng Biến Dạng Sóng" msgid "Wave Deformation effect" -msgstr "Hiệu ứng Méo Hóa Sóng" +msgstr "Hiệu ứng biến dạng sóng" msgid "Shape Key" -msgstr "Mẫu Dạng" +msgstr "Hình Mẫu" msgid "Shape key in a shape keys data-block" -msgstr "Mẫu dạng trong một cục dữ liệu mẫu dạng" +msgstr "Hình mẫu trong một khối dữ liệu hình mẫu" msgid "Frame for absolute keys" -msgstr "Bức ảnh cho mẫu dạng tuyệt đối" +msgstr "Khung hình cho các hình mẫu tuyết đối" msgid "Interpolation type for absolute shape keys" -msgstr "Loại suy nội cho mẫu dạng tuyết đối" +msgstr "Kiểu nội suy cho các hình mẫu tuyết đối" msgid "Toggle this shape key" -msgstr "Bật/tắt mẫu dạng này" +msgstr "Bật/Tắt hình mẫu này" msgid "Name of Shape Key" -msgstr "Tên của mẫu dạng" +msgstr "Tên của Hình Mẫu" msgid "Relative Key" -msgstr "Mẫu Dạng Tương Đối" +msgstr "Hình Mẫu Tương Đối" msgid "Shape used as a relative key" -msgstr "Mẫu dạng được dùng làm mẫu dạng tương đối" +msgstr "Hình dạng sử dụng làm hình mẫu tương đối" msgid "Slider Max" -msgstr "Cực Đại Trơn Trượt" +msgstr "Thanh Trượt Tối Đa" msgid "Maximum for slider" -msgstr "Cực đại cho trơn trượt" +msgstr "Mức tối đa của thanh trượt" msgid "Slider Min" -msgstr "Cực Tiểu Trơn Trượt" +msgstr "Thanh Trượt Tối Thiểu" msgid "Minimum for slider" -msgstr "Cực tiểu cho trơn trượt" +msgstr "Mức tối thiểu của thanh trượt" msgid "Value of shape key at the current frame" -msgstr "Giá trị của mẫu dạng tại bức ảnh hiện tại" +msgstr "Giá trị của hình mẫu tại khung hình hiện tại" msgid "Vertex weight group, to blend with basis shape" -msgstr "Nhóm quyền lượng đỉnh, cho pha trộn với mẫu dạng cơ sở" +msgstr "Nhóm trọng lượng điểm đỉnh, để pha trộn với hình mẫu cơ bản" msgid "Shape Key Bezier Point" -msgstr "Mẫu Dạng Điểm Bezier" +msgstr "Điểm Hình Mẫu cho Bezier" msgid "Point in a shape key for Bezier curves" -msgstr "Điểm trong một mẫu dạng cho cong Bezier" +msgstr "Điểm trong hình mẫu cho các đường cong Bezier" msgid "Handle 1 Location" @@ -88289,43 +97047,51 @@ msgstr "Vị Trí Tay Cầm 2" msgid "Shape Key Curve Point" -msgstr "Mẫu Dạng Điểm Đường Cong" +msgstr "Điểm Hình Mẫu cho Đường Cong" msgid "Point in a shape key for curves" -msgstr "Điểm trong một mẫu dạng cho đường cong" +msgstr "Điểm trong một hình mẫu cho các đường cong" msgid "Shape Key Point" -msgstr "Điểm Mẫu Dạng" +msgstr "Điểm của Hình Mẫu" msgid "Point in a shape key" -msgstr "Điểm trong mẫu dạng" +msgstr "Điểm trong hình mẫu" + + +msgid "Simulation Item" +msgstr "Mục Mô Phỏng" + + +msgid "Attribute domain where the attribute is stored in the simulation state" +msgstr "Phạm vi thuộc tính nơi thuộc tính vốn được lưu trữ ở trong trạng thái mô phỏng" msgid "Soft body simulation settings for an object" -msgstr "Cài đặt của mô phỏng thân mềm cho vật thể" +msgstr "Sắp đặt mô phỏng thân mềm cho một đối tượng" msgid "Aero" -msgstr "Khí Động Lý" +msgstr "Khí Động Lực Học" msgid "Make edges 'sail'" -msgstr "Làm cạnh 'bay như bượm'" +msgstr "Làm các cạnh 'bay như cánh buồm'" msgid "Aerodynamics Type" -msgstr "Loại Khí Động Lực Học" +msgstr "Thể Loại Khí Động Lực Học" msgid "Method of calculating aerodynamic interaction" -msgstr "Phương pháp cho tính tương tác khí động lực học" +msgstr "Phương pháp tính sự tương tác của khí động lực học" msgid "Edges receive a drag force from surrounding media" -msgstr "Cạnh được một lực cản trở từ môi trường xung quanh" +msgstr "Các cạnh nhận được một lực cản từ môi trường quanh mình" msgid "Lift Force" @@ -88333,135 +97099,135 @@ msgstr "Lực Nâng" msgid "Edges receive a lift force when passing through surrounding media" -msgstr "Cạnh được một lực nâng khi xuyên qua môi trường xung quanh" +msgstr "Các cạnh nhận được một lực nâng khi đi qua môi trường quanh mình" msgid "Dampening" -msgstr "Tắt Dần" +msgstr "Giảm Chấn" msgid "Blending to inelastic collision" -msgstr "Méo hóa từ va chạm không dẻo" +msgstr "Pha trộn với va đập không đàn hồi" msgid "Ball Size" -msgstr "Kích Cỡ Trái Banh" +msgstr "Kích Thước Hình Cầu" msgid "Absolute ball size or factor if not manually adjusted" -msgstr "Kích cỡ trái banh tuyệt đối hay hệ số nếu chưa được chỉnh lại bằng tay" +msgstr "Kích thước tuyệt đối của hình cầu, hay hệ số, nếu không chỉnh sửa thủ công" msgid "Ball inflating pressure" -msgstr "Áp suất bơm trái banh" +msgstr "Áp suất thổi phồng hình cầu" msgid "Bending" -msgstr "Bể Cong" +msgstr "Uốn Cong" msgid "Choke" -msgstr "Nghẹt" +msgstr "Tắc Nghẹn" msgid "'Viscosity' inside collision target" -msgstr "'Độ Nhớt' trong mục tiêu va chạm" +msgstr "'Độ Nhớt' bên trong mục tiêu va đập" msgid "Collision Type" -msgstr "Loại Va Chạm" +msgstr "Kiểu Va Đập" msgid "Choose Collision Type" -msgstr "Chọn Loại Va Chạm" +msgstr "Chọn Kiểu Va Đập" msgid "Manual adjust" -msgstr "Chỉnh bằng tay" +msgstr "Chỉnh sửa thủ công" msgid "Average Spring length * Ball Size" -msgstr "Bề dài Lò Xo trung bình * Kích Cỡ Trái Banh" +msgstr "Trung Bình Chiều dài Lực Đàn Hồi * Kích Thước Hình Cầu" msgid "Minimal" -msgstr "Cực Tiểu" +msgstr "Tối Thiểu" msgid "Minimal Spring length * Ball Size" -msgstr "Bề dài Lò Xo cực tiểu * Kích Cỡ Trái Banh" +msgstr "Chiều dài Lực Đàn Hồi Tối Thiểu * Kích Thước Hình Cầu" msgid "Maximal" -msgstr "Cực Đại" +msgstr "Tối Đa" msgid "Maximal Spring length * Ball Size" -msgstr "Bề dài Lò Xo cực đại * Kích Cỡ Trái Banh" +msgstr "Chiều dài Lực Đàn Hồi Tối Đa * Kích Thước Hình Cầu" msgid "AvMinMax" -msgstr "TiểuĐạiTrungBình" +msgstr "TrungBình_Tối_Đa/Thiểu" msgid "(Min+Max)/2 * Ball Size" -msgstr "(Tiểu+Đại)/2 * Kích Cỡ Trái Banh" +msgstr "(Tối Thiểu + Tối Đa) / 2 * Kích Thước Hình Cầu" msgid "Edge spring friction" -msgstr "Ma sát lò xo cạnh" +msgstr "Ma sát của lực đàn hồi cạnh" msgid "Error Limit" -msgstr "Giới Hạn Sai Lầm" +msgstr "Giới Hạn Sai Số" msgid "The Runge-Kutta ODE solver error limit, low value gives more precision, high values speed" -msgstr "Giới hạn trình giải nghiệm Runge-Kutta ODE, giá trị càng thấp càng chính xác, giá trị càng cao càng nhanh" +msgstr "Giới hạn sai số của bộ giải nghiệm Runge-Kutta ODE, giá trị càng thấp thì càng chính xác hơn, giá trị cao thì nhanh hơn" msgid "General media friction for point movements" -msgstr "Hệ số ma sát trung gian cho chuyển động điểm" +msgstr "Hệ số ma sát phương tiện nói chung cho các chuyển động của điểm" msgid "Fuzziness while on collision, high values make collision handling faster but less stable" -msgstr "Độ mờ khi va chạm, giá trị càng cao làm thực hành va chạm nhanh hơn mà càng bất ổn định" +msgstr "Độ mờ ám trong khi va đập, giá trị càng cao làm cho việc thi hành sự va đập càng nhanh, song cũng bất ổn định hơn" msgid "Default Goal (vertex target position) value" -msgstr "Giá trị Mục Đích Mặc Định (vị trí đỉnh mục tiêu)" +msgstr "Giá trị Mục Tiêu Mặc Định (vị trí mục tiêu của điểm đỉnh)" msgid "Goal maximum, vertex weights are scaled to match this range" -msgstr "Cực đại của mục tiêu, phóng to quyền lượng đỉnh cho nằm ở trong phạm vi này" +msgstr "Tối đa của mục tiêu. Trọng lượng điểm đỉnh sẽ được tỷ lệ hóa để khớp với phạm vi này" msgid "Goal minimum, vertex weights are scaled to match this range" -msgstr "Cực tiểu của mục tiêu, phóng to quyền lượng đỉnh cho nầm ở trong phạm vi này" +msgstr "Tối thiểu của mục tiêu. Trọng lượng điểm đỉnh sẽ được tỷ lệ hóa để khớp với phạm vi này" msgid "Gravitation" -msgstr "Hấp Dẫn" +msgstr "Trọng Lực" msgid "Apply gravitation to point movement" -msgstr "Áp dụng hấp dẫn với chuyển động của điểm" +msgstr "Áp dụng trọng lực vào chuyển động của điểm" msgid "Center of Mass" -msgstr "Tâm Khối Lượng" +msgstr "Tâm của khối lượng" msgid "Location of center of mass" -msgstr "Vị trí của tâm khối lượng" +msgstr "Vị trí Tâm của khối lượng" msgid "General Mass value" -msgstr "Giá Trị Khối Lượng Tổng Quát" +msgstr "Giá trị Khối Lượng chung" msgid "Permanent deform" -msgstr "Méo hóa vĩnh cửu" +msgstr "Biến dạng vĩnh cửu" msgid "Pull" @@ -88469,63 +97235,67 @@ msgstr "Kéo" msgid "Edge spring stiffness when longer than rest length" -msgstr "Độ cứng lò xo cạnh khi dài hơn bề dài nghỉ" +msgstr "Độ cứng lực đàn hồi của cạnh khi nó dài hơn chiều dài của đoạn ở trạng thái nghỉ" msgid "Edge spring stiffness when shorter than rest length" -msgstr "Độ cứng lò xo cạnh khi ngắn hơn bề dài nghỉ ngơi" +msgstr "Độ cứng trong lực đàn hồi của cạnh khi nó ngắn hơn chiều dài của đoạn ở trạng thái nghỉ" msgid "Rotation Matrix" -msgstr "Ma Trận Xoay" +msgstr "Ma Trận Xoay Chiều" msgid "Estimated rotation matrix" -msgstr "Dự đoán ma trận xoay" +msgstr "Ma trận xoay chiều dự đoán" msgid "Scale Matrix" -msgstr "Phóng To Ma Trận" +msgstr "Ma Trận Tỷ Lệ" msgid "Estimated scale matrix" -msgstr "Dự đoán ma trận phóng to" +msgstr "Ma trận tỷ lệ dự đoán" msgid "Tweak timing for physics to control frequency and speed" -msgstr "Chỉnh thời tự vật lý để điều khiển tần số và tốc độ" +msgstr "Hiệu chỉnh thời gian cho bộ vật lý điều khiển tần số và tốc độ" + + +msgid "Spring Length" +msgstr "Chiều Dài Lực Đàn Hồi" msgid "Alter spring length to shrink/blow up (unit %) 0 to disable" -msgstr "Chỉnh bề dài lò xo đến thu nhỏ/phóng to (đơn vị %) đặt 0 cho tắt" +msgstr "Điều chỉnh chiều dài của lực đàn hồi để thu nhỏ/phóng to (đơn vị phần trăm %). Đặt bằng 0 để tắt đi" msgid "Maximal # solver steps/frame" -msgstr "Số lượng bước tối đa/bức ảnh cho trình giải nghiệm" +msgstr "Số lượng bước/khung hình tối đa của bộ giải nghiệm" msgid "Minimal # solver steps/frame" -msgstr "Số lượng bước tối thiểu/bức ảnh cho trình giải nghiệm" +msgstr "Số lượng bước/khung hình tối thiểu của bộ giải nghiệm" msgid "Use velocities for automagic step sizes" -msgstr "Dùng vận tốc cho kích cỡ bước tự động" +msgstr "Dùng vận tốc làm cỡ phân bước tự động" msgid "Print Performance to Console" -msgstr "In Hiệu Suất Vào Diện Điều Khiển" +msgstr "In Hiệu Suất Thi Hành ra Bàn Giao Tiếp" msgid "Turn on SB diagnose console prints" -msgstr "Bật in kiểm tra thân mềm trong diện điều khiển" +msgstr "Bật khả năng in các chẩn đoán về Thân Mềm ra bàn giao tiếp" msgid "Edge Collision" -msgstr "Va Chạm Cạnh" +msgstr "Va Đập Cạnh" msgid "Edges collide too" -msgstr "Cạnh Cũng Vạ Cham" +msgstr "Cạnh cũng vạ đập nữa" msgid "Use Edges" @@ -88533,23 +97303,23 @@ msgstr "Dùng Cạnh" msgid "Use Edges as springs" -msgstr "Dùng Cạnh làm lò xo" +msgstr "Dùng các Cạnh làm lực đàn hồi" msgid "Estimate Transforms" -msgstr "Dự Đoán Biến Hóa" +msgstr "Biến Hóa Ước Tính" msgid "Store the estimated transforms in the soft body settings" -msgstr "Chứa các biến hóa dự đoán trong cài đặt thân mềm" +msgstr "Lưu trữ ước tính biến hóa trong sắp đặt thân mềm" msgid "Face Collision" -msgstr "Vạ Chạm Mặt" +msgstr "Vạ Đập Mặt" msgid "Faces collide too, can be very slow" -msgstr "Mặt cũng va chạm, có thể rất chậm" +msgstr "Các mặt cũng va đập nữa, có thể rất chậm" msgid "Use Goal" @@ -88557,55 +97327,55 @@ msgstr "Dùng Mục Tiêu" msgid "Define forces for vertices to stick to animated position" -msgstr "Chỉ định lực cho đỉnh dính với vị trí hoạt hình" +msgstr "Xác định lực cho các điểm đỉnh bám vào vị trí hoạt họa" msgid "Enable naive vertex ball self collision" -msgstr "Bật tự va chạm mình của trại banh đỉnh kiểu khờ" +msgstr "Cho phép sự tự va đập ngẫu nhiên bởi sự bao bọc các điểm đỉnh bằng khung đàn hồi hình cầu" msgid "Stiff Quads" -msgstr "Tư Giác Cứng" +msgstr "Tứ Giác Cứng" msgid "Add diagonal springs on 4-gons" -msgstr "Thêm lò xo chéo cho tư giác" +msgstr "Thêm lực đàn hồi chéo góc trong các hình tứ giác" msgid "Goal Vertex Group" -msgstr "Nhóm Đỉnh Mục Tiêu" +msgstr "Nhóm Điểm Đỉnh Mục Tiêu" msgid "Control point weight values" -msgstr "Quyền lượng của điểm kiểm soát" +msgstr "Trọng lượng của điểm điều khiển" msgid "Mass Vertex Group" -msgstr "Nhóm Đỉnh Khối Lượng" +msgstr "Khối Nhóm Điểm Đỉnh" msgid "Control point mass values" -msgstr "Giá trị khối lượng cho điểm kiểm soát" +msgstr "Hệ số khối lượng cho điểm điều khiển" msgid "Spring Vertex Group" -msgstr "Nhóm Đỉnh Lò Xo" +msgstr "Nhóm Điểm Đỉnh Lực Đàn Hồi" msgid "Control point spring strength values" -msgstr "Các giá trí sức lò xo của điểm kiểm soát" +msgstr "Các giá trị của điểm điều khiển cường độ lực đàn hồi" msgid "Space data for a screen area" -msgstr "Dữ liệu không gian cho một vùng màn" +msgstr "Dữ liệu không gian cho một vùng màn hình" msgid "Sync Visible Range" -msgstr "Đồng Bộ Hóa Phạm Vị Hiển Thị" +msgstr "Đồng Bộ Hóa Phạm Vi Nhìn Thấy Được" msgid "Synchronize the visible timeline range with other time-based editors" -msgstr "Đồng bộ hóa phạm vi hiển thi trong thời lịch với các trình biên soạn khác" +msgstr "Đồng bộ hóa khoảng nhìn thấy được trên dòng thời gian với các trình biên soạn có nền tảng thời gian" msgid "Space data type" @@ -88613,33 +97383,33 @@ msgstr "Loại dữ liệu không gian" msgid "Space Clip Editor" -msgstr "Trình Biên Soạn Đoạn Phim Không Gian" +msgstr "Không Gian Trình Biên Soạn Đoạn Phim" msgid "Clip editor space data" -msgstr "Dữ liệu không gian trình biên soạn đoạn phim" +msgstr "Dữ liệu không gian của trình biên soạn đoạn phim" msgctxt "MovieClip" msgid "Annotation Source" -msgstr "Nguồn Lời Ghi Chú" +msgstr "Nguồn Chú Thích" msgid "Where the annotation comes from" -msgstr "Nguồn gốc của lời ghi chú" +msgstr "Chú thích từ đâu đến" msgid "Show annotation data-block which belongs to movie clip" -msgstr "Hiện cục dữ liệu lời ghi chú của đoạn phim" +msgstr "Hiển thị khối dữ liệu chú thích trực thuộc đoạn phim" msgctxt "MovieClip" msgid "Track" -msgstr "Rãnh" +msgstr "Giám Sát/Rãnh" msgid "Show annotation data-block which belongs to active track" -msgstr "Hiện cục dữ liệu lời ghi chú của rãnh hoạt động" +msgstr "Hiển thị khối dữ liệu chú thích trực thuộc rãnh đang hoạt động" msgid "Blending Factor" @@ -88647,7 +97417,7 @@ msgstr "Hệ Số Pha Trộn" msgid "Overlay blending factor of rasterized mask" -msgstr "Hệ số pha trộn lấn trên của mặt nạ quét dòng" +msgstr "Hệ số pha trộn lớp lồng của màn chắn lọc điểm ảnh hóa" msgid "2D Cursor Location" @@ -88655,43 +97425,43 @@ msgstr "Vị Trí Con Trỏ 2D" msgid "2D cursor location for this view" -msgstr "Vị trí con tro 2D trong màn này" +msgstr "Vị trí con trỏ 2D trong góc nhìn này" msgid "Lock to Selection" -msgstr "Khóa Với Sự Lựa Chọn" +msgstr "Khóa vào Lựa Chọn" msgid "Lock viewport to selected markers during playback" -msgstr "Khóa màn chiếu với các ký hiệu được chọn khi hát lại" +msgstr "Khóa cổng nhìn vào dấu mốc được chọn trong khi chơi lại" msgid "Lock to Time Cursor" -msgstr "Khóa Với Con Trỏ Thời Gian" +msgstr "Khóa vào Con Trỏ Thời Gian" msgid "Lock curves view to time cursor during playback and tracking" -msgstr "Khóa màn đường cong với con trỏ thời gian khi hát lại và theo dõi" +msgstr "Khóa góc nhìn đường cong vào con trỏ thời gian khi chơi lại và giám sát" msgid "Mask displayed and edited in this space" -msgstr "Mặt nạ được hiển thị và được biên tập trong không gian này" +msgstr "Màn Chắn Lọc được hiển thị và biên soạn trong không gian này" msgid "Edge Display Type" -msgstr "Loại Hiển Thị Cạnh" +msgstr "Kiểu Hiển Thị Cạnh" msgid "Display type for mask splines" -msgstr "Loại hiển thị cho mẫu cong mặt nạ" +msgstr "Kiểu hiển thị cho các chốt trục chắn lọc (mask splines)" msgid "Display white edges with black outline" -msgstr "Hiển thị cạnh màu trắng có nét ngoài màu đen" +msgstr "Hiển thị các cạnh màu trắng với đường viền màu đen" msgid "Display dashed black-white edges" -msgstr "Hiển thị cạnh bằng gạch ngang màu trắng đen" +msgstr "Hiển thị cạnh vạch đứt đoạn trắng-đen" msgid "Display black edges" @@ -88703,278 +97473,282 @@ msgstr "Hiển thị cạnh màu trắng" msgid "Overlay Mode" -msgstr "Chế Độ Lớp Che" +msgstr "Chế Độ Vẽ Lồng" msgid "Overlay mode of rasterized mask" -msgstr "Chế độ lớp che của mặt nạ quét dòng" +msgstr "Chế độ vẽ lớp lồng của màn chắn lọc quét mành (rasterized)" msgid "Alpha Channel" -msgstr "Kênh Độ Đục" +msgstr "Kênh Alpha" msgid "Show alpha channel of the mask" -msgstr "Hiện kênh độ đục của mặt nạ" +msgstr "Hiển thị kênh alpha của màn chắn lọc" msgid "Combine space background image with the mask" -msgstr "Gồm ảnh nền không gian với mặt nạ" +msgstr "Kết hợp hình ảnh nền của không gian với màn chắn lọc" msgid "Editing context being displayed" -msgstr "Đang biên tập bối cảnh đang hiển thị" +msgstr "Ngữ cảnh biên soạn đang được hiển thị" msgid "Path Length" -msgstr "Bề Dài Đường Đi" +msgstr "Chiều Dài Đường Dẫn" msgid "Length of displaying path, in frames" -msgstr "Bề dài của đường hiển thị, bằng số lượng bức ảnh" +msgstr "Chiều dài của đường dẫn được hiển thị, trong số khung hình" msgid "Pivot center for rotation/scaling" -msgstr "Điềm tựa làm trung tâm cho xoay/phóng to" +msgstr "Tâm điểm tựa cho sự xoay chiều/sự thay đổi tỷ lệ" msgid "Pivot around bounding box center of selected object(s)" -msgstr "Tựa quanh trung tâm của hộp bao quanh của các vật thể được chọn" +msgstr "Dùng trung tâm khung hộp viền đối tượng được chọn làm điểm tựa" msgid "Pivot around each object's own origin" -msgstr "Tựa quanh gốc tọa độ của mỗi vật thể riêng" +msgstr "Dùng tọa độ gốc của cá nhân mỗi đối tượng làm điểm tựa" msgid "Pivot around the median point of selected objects" -msgstr "Tựa quanh điểm trung vị của vật thể được chọn" +msgstr "Dùng điểm trung vị của đối tượng được chọn làm điểm tựa" msgid "Scopes to visualize movie clip statistics" -msgstr "Kế cho hiển thị thống kê đoạn phim" +msgstr "Kế đo lường để quan sát các thống kê của đoạn phim" msgid "Show Blue Channel" -msgstr "Hiện Kênh Xanh" +msgstr "Hiển Thị Kênh Lam" msgid "Show blue channel in the frame" -msgstr "Hiện kênh màu xanh trong bức ảnh" +msgstr "Hiển thị kênh màu lam trong khung hình" msgid "Show Bundles" -msgstr "Hiện Gói" +msgstr "Hiển Thị Bộ Điểm" msgid "Show projection of 3D markers into footage" -msgstr "Hiện phép chiếu của ký hiệu 3D trên đoạn phim" +msgstr "Hiển thị sự dự phóng của các dấu mốc 3D vào đoạn phim" msgid "Show Disabled" -msgstr "Hiện Được Tắt" +msgstr "Hiển Thị cái Bị Tắt" msgid "Show disabled tracks from the footage" -msgstr "Hiện đường vết được tắt từ đoạn phim" +msgstr "Hiển thị các giám sát bị tắt trong đoạn phim" msgid "Show Filters" -msgstr "Hiện Bộ Lọc" +msgstr "Hiển Thị Bộ Lọc" msgid "Show filters for graph editor" -msgstr "Hiện bộ lọc cho trình biên soạn biểu đồ" +msgstr "Hiển thị các bộ lọc cho trình biên soạn đồ thị" msgid "Show Gizmo" -msgstr "Hiện đồ đạc" +msgstr "Hiển Thị Gizmo" msgid "Show gizmos of all types" -msgstr "Hiện tất cả loại đồ đạc" +msgstr "Hiển thị toàn bộ các thể loại Gizmo" msgid "Navigate Gizmo" -msgstr "Đồ Đạc Chuyển Hướng" +msgstr "Gizmo Điều Hướng" msgid "Viewport navigation gizmo" -msgstr "Đồ đạc chuyển hướng trong màn chiếu" +msgstr "Gizmo điều hướng cổng nhìn" msgid "Show Frames" -msgstr "Hiện Bức Ảnh" +msgstr "Hiển Thị Khung Hình" msgid "Show curve for per-frame average error (camera motion should be solved first)" -msgstr "Hiện đường cong của sai lầm trung bình từng bức ảnh (nên giải nghiệm cho chuyển động máy quay phim trước)" +msgstr "Hiển thị đường cong về sai số trung bình mỗi khung hình (nên tiến hành giải nghiệm chuyển động máy quay phim trước đã)" msgid "Show Tracks Error" -msgstr "Hiện Sai Lầm Đường Vết" +msgstr "Hiển Thị Sai Lầm Giám Sát" msgid "Display the reprojection error curve for selected tracks" -msgstr "Hiển thị đường cong sai lầm của phép chiếu lại cho đường vết được chọn" +msgstr "Hiển thị đường cong sai số tái phóng chiếu cho các dấu giám sát được chọn" msgid "Show Tracks Motion" -msgstr "Hiện Chuyển Động Đường Vết" +msgstr "Hiển Thị Chuyển Động của Giám Sát" msgid "Display the speed curves (in \"x\" direction red, in \"y\" direction green) for the selected tracks" -msgstr "Hiển thị đường cong tốc độ (hướng \"x\" màu đỏ, hướng \"y\" màu lục) cho các đường vết được chọn" +msgstr "Hiển thị các đường cong tốc độ (hướng \"x\" màu đỏ, hướng \"y\" màu lục) cho các dấu giám sát được chọn" msgid "Show Green Channel" -msgstr "Hiện Kênh Lục" +msgstr "Hiển Thị Kênh Lục" msgid "Show green channel in the frame" -msgstr "Hiện kênh màu lục trong bức ảnh" +msgstr "Hiển thị kênh màu lục trong khung hình" msgid "Show grid showing lens distortion" -msgstr "Hiện đồ thị chỉ méo hóa thấu kính" +msgstr "Hiển thị khung lưới đồ thị về sự bóp méo của thấu kính" msgid "Show Marker Pattern" -msgstr "Hiện Gương Mẫu Ký Hiệu" +msgstr "Hiển Thị Mô Hình Dấu Mốc" msgid "Show pattern boundbox for markers" -msgstr "Hiện hộp bao quanh mẫu dạng cho ký hiệu" +msgstr "Hiển thị khung viền hình hộp giới hạn quanh kiểu mẫu cho các dấu mốc" msgid "Show Marker Search" -msgstr "Hiện Tìm Kiếm Ký Hiệu" +msgstr "Hiển Thị Hộp Tìm Kiếm cho Dấu Mốc" msgid "Show search boundbox for markers" -msgstr "Hiện hộp bao quanh tìm kiếm cho ký hiệu" +msgstr "Hiển thị hình hộp giới hạn vùng tìm kiếm cho các dấu mốc" msgid "Show Mask Overlay" -msgstr "Hiện Mặt Nạ Che Trên" +msgstr "Hiển Thị Lớp Lồng của Màn Chắn Lọc" msgid "Show Mask Spline" -msgstr "Hiện Mẫu Cong Mặt Nạ" +msgstr "Hiển Thị Chốt Trục Chắn Lọc" msgid "Show metadata of clip" -msgstr "Hiện siêu dữ liệu của đoạn" +msgstr "Hiển thị siêu dữ liệu của đoạn phim" msgid "Show track names and status" -msgstr "Hiện tên đường vết và trạng thái" +msgstr "Hiển thị tên giám sát và trạng thái" msgid "Show Red Channel" -msgstr "Hiện Kênh Đỏ" +msgstr "Hiển Thị Kênh Màu Đỏ" msgid "Show red channel in the frame" -msgstr "Hiện kênh màu đỏ trong bức ảnh" +msgstr "Hiển thị kênh màu đỏ trong khung hình" msgid "Adjust Last Operation" -msgstr "Chỉnh Thao Tác Cuối" +msgstr "Điều Chỉnh Thao Tác Trước Đây" msgid "Toolbar" -msgstr "Thanh Dụng Cụ" +msgstr "Thanh Công Cụ" msgid "Show Seconds" -msgstr "Hiện Giây" +msgstr "Hiển Thị Số Giây" msgid "Show timing in seconds not frames" -msgstr "Hiện thời tự bằng giây, không phải số bức ảnh" +msgstr "Hiển thị thời định bằng số giây chứ không phải số khung hình" msgid "Show Stable" -msgstr "Hiện Ổn Định" +msgstr "Hiển Thị Ổn Định" msgid "Show stable footage in editor (if stabilization is enabled)" -msgstr "Hiện đoạn phim ổn định trong trình biên soạn (nếu được bật ổn định hóa)" +msgstr "Hiển thị đoạn phim ổn định trong trình biên soạn (nếu đã sử dụng ổn định hóa)" msgid "Show Tiny Markers" -msgstr "Hiện Ký Hiệu Nhỏ" +msgstr "Hiển Thị Dấu Mốc Nhỏ Xíu" msgid "Show markers in a more compact manner" -msgstr "Hiện ký hiệu một kiểu gọn hơ" +msgstr "Hiển thị các dấu mốc trong hình thức ngắn gọn hơn" msgid "Show Track Path" -msgstr "Hiện Đường Vết" +msgstr "Hiển Thị Đường Giám Sát" msgid "Show path of how track moves" -msgstr "Hiện đường vết chỉ chuyển động của theo dõi" +msgstr "Hiển thị đường chuyển động của giám sát" msgid "Display frame in grayscale mode" -msgstr "Hiển thị bức ảnh dùng chế độ độ xám" +msgstr "Hiển thị khung hình trong chế độ gam màu xám" msgid "Manual Calibration" -msgstr "Chỉnh Bằng Tay" +msgstr "Hiệu Chuẩn Thủ Công" msgid "Use manual calibration helpers" -msgstr "Dùng đồ giúp đỡ chỉnh bằng tay" +msgstr "Sử dụng bộ trợ lý hiệu chuẩn thủ công" msgid "Mute Footage" -msgstr "Cắt Tiếng Đoạn Phim" +msgstr "Giải Hoạt Đoạn Phim" msgid "Mute footage and show black background instead" -msgstr "Tắt đoạn phim và hiện nền màu đen thay thế" +msgstr "Giải Hoạt đoạn phim và hiển thị nền màu đen" msgctxt "MovieClip" msgid "View" -msgstr "Màn Chiếu" +msgstr "Góc Nhìn" msgid "Type of the clip editor view" -msgstr "Loại màn chiếu của trình biên soạn đoạn" +msgstr "Loại góc nhìn của trình biên soạn đoạn phim" msgid "Show editing clip preview" -msgstr "Hiện dự khán của đoạn đang biên tập" +msgstr "Hiển thị duyệt trước của đoạn phim đang biên soạn" msgctxt "MovieClip" msgid "Graph" -msgstr "Biểu Đồ" +msgstr "Đồ Thị" msgid "Show graph view for active element" -msgstr "Hiện màn biểu đồ cho phần tử hoạt động" +msgstr "Hiển thị biểu đồ cho yếu tố đang hoạt động" msgctxt "MovieClip" msgid "Dopesheet" -msgstr "Bảng Hoạt Hình" +msgstr "Bảng Hành Động" msgid "Dopesheet view for tracking data" -msgstr "Màn bảng hoạt hình cho dữ liệu theo dõi" +msgstr "Khung nhìn bảng hành động cho dữ liệu giám sát" msgid "Space Console" -msgstr "Diện Điều Khiển Không Gian" +msgstr "Không Gian Bàn Giao Tiếp" + + +msgid "Interactive Python console" +msgstr "Bảng điều khiển Python tương tác" msgid "Font size to use for displaying the text" -msgstr "Kích cỡ phông dùng cho hiển thị văn bản" +msgstr "Kích thước phông dùng để hiển thị văn bản" msgid "Command history" @@ -88982,27 +97756,27 @@ msgstr "Lịch sử lệnh" msgid "Command line prompt language" -msgstr "Ngôn ngữ dấu lệnh dòng lệnh" +msgstr "Ngôn ngữ dòng lệnh" msgid "Prompt" -msgstr "Dấu Lệnh" +msgstr "Dấu Nhắc" msgid "Command line prompt" -msgstr "Dấu lệnh dòng lệnh" +msgstr "Dấu nhắc dòng lệnh" msgid "Command output" -msgstr "Ngõ ra lệnh" +msgstr "Kết quả của dòng lệnh" msgid "Space Dope Sheet Editor" -msgstr "Trình Biên Soạn Dữ Liệu Bảng Hoạt Hình Không Gian" +msgstr "Không Gian Trình Biên Soạn Bảng Hành Động" msgid "Dope Sheet space data" -msgstr "Dữ liệu không gian Bảng Hoạt Hình" +msgstr "Dữ liệu không gian của Bảng Hành Động" msgid "Action displayed and edited in this space" @@ -89010,43 +97784,47 @@ msgstr "Hành động được hiển thị và chỉnh sửa trong không gian msgid "Show the active object's cloth point cache" -msgstr "Hiện đệm chứa điểm vải của vật thể hoạt động" +msgstr "Hiển thị bộ nhớ đệm điểm vải vóc của đối tượng đang hoạt động" msgid "Show the active object's Dynamic Paint cache" -msgstr "Hiện đệm chứa Sơn Động Lý của vật thể hoạt động" +msgstr "Hiển thị bộ nhớ đệm Sơn Động Lực của đối tượng đang hoạt động" msgid "Show the active object's particle point cache" -msgstr "Hiện đệm chứa điểm hạt của vật thể hoạt động" +msgstr "Hiển thị bộ nhớ đệm điểm hệ thống hạt của đối tượng đang hoạt động" msgid "Show the active object's Rigid Body cache" -msgstr "Hiện đệm chứa thân rắn của vật thể hoạt động" +msgstr "Hiển thị bộ nhớ đệm Thân Cứng của đối tượng đang hoạt động" + + +msgid "Show the active object's simulation nodes cache and bake data" +msgstr "Hiển thị bộ nhớ đệm và dữ liệu nướng của các nút mô phỏng của đối tượng đang hoạt động" msgid "Show the active object's smoke cache" -msgstr "Hiện đệm chứa khói của vật thể hoạt động" +msgstr "Hiển thị bộ nhớ đệm khói của đối tượng đang hoạt động" msgid "Softbody" -msgstr "Thân Thể Mềm" +msgstr "Thân Mềm" msgid "Show the active object's softbody point cache" -msgstr "Hiện đệm chứa điểm thân mềm của vật thể hoạt động" +msgstr "Hiển thị bộ nhớ đệm điểm thân mềm của đối tượng đang hoạt động" msgid "Settings for filtering animation data" -msgstr "Cài đặt cho lọc dữ liệu hoạt hình" +msgstr "Sắp đặt cho quá trình thanh lọc dữ liệu hoạt họa" msgid "Edit all keyframes in scene" -msgstr "Biên tập tất cả bức ảnh mẫu trong cảnh" +msgstr "Biên soạn toàn bộ các khung khóa trong cảnh" msgid "Timeline and playback controls" -msgstr "Thời biểu và điều khiển hát lại hoạt hình" +msgstr "Lịch trình thời gian và điều khiển chơi lại" msgid "Action Editor" @@ -89054,119 +97832,119 @@ msgstr "Trình Biên Soạn Hành Động" msgid "Edit keyframes in active object's Object-level action" -msgstr "Biên tập bức ảnh mẫu trong hành động Tầng Vật Thể của vật thể hoạt động" +msgstr "Biên soạn các khung khóa trong hành động mức Đối Tượng của đối tượng đang hoạt động" msgid "Shape Key Editor" -msgstr "Trình Biên Soạn Mẫu Dạng" +msgstr "Trình Biên Soạn Hình Mẫu" msgid "Edit keyframes in active object's Shape Keys action" -msgstr "Biên tập bức ảnh mẫu trong hành động Mẫu Dạng của vật thể hoạt động" +msgstr "Biên soạn các khung khóa trong hành động Hình Mẫu của đối tượng đang hoạt động" msgid "Edit timings for all Grease Pencil sketches in file" -msgstr "Biên tập hết thời tự cho tất cả phác Bút Sáp trong tập tin" +msgstr "Biên soạn thời gian cho toàn bộ các những phác thảo Bút Chì Dầu trong tập tin" msgid "Edit timings for Mask Editor splines" -msgstr "Biên tập thời tự cho mẫu cong Biên Tập Mặt Nạ" +msgstr "Biên soạn thời gian cho chốt trục của Trình Biên Soạn Màn Chắn Lọc" msgid "Edit timings for Cache File data-blocks" -msgstr "Biên tập thời tự cho cục dữ liệu Tập Tin Đệm Chứa" +msgstr "Biên soạn thời gian cho khối dữ liệu Tập Tin Bộ Nhớ Đệm" msgid "Show the status of cached frames in the timeline" -msgstr "Hiện trạng thái của bức ảnh được chứa trong thời biểu" +msgstr "Hiển thị thông tin về khung hình lưu trong bộ nhớ đệm của lịch trình thời gian" msgid "Show Curve Extremes" -msgstr "Hiện Đường Cong Cực Đoan" +msgstr "Hiển Thị những Cực Độ của Đường Cong" msgid "Mark keyframes where the key value flow changes direction, based on comparison with adjacent keys" -msgstr "Ký hiệu bức ảnh mẫu khi giá trí bức ảnh mẫu được đổi hướng, tùy so sánh với bức ảnh mẫu kề" +msgstr "Đánh dấu những khung khóa, nơi mà dòng lưu giá trị của khóa thay đổi chiều hướng, dựa trên sự so sánh với các khóa kề cạnh" msgid "Show Handles and Interpolation" -msgstr "Hiện Tay Cầm và Suy Nội" +msgstr "Hiển Thị Tay Cầm và Nội Suy" msgid "Display keyframe handle types and non-bezier interpolation modes" -msgstr "Hiện loại của tay cầm bức ảnh mẫu và chế độ suy nội vô bezier" +msgstr "Hiển thị các kiểu tay cầm của khung khóa và các chế độ nội suy phi-bezier (không phải là bezier)" msgid "Show Markers" -msgstr "Hiện Ký Hiệu" +msgstr "Hiển Thị Dấu Mốc" msgid "If any exists, show markers in a separate row at the bottom of the editor" -msgstr "Nếu có cái nào, hiện các ký hiệu trong một hàng ở phía dưới trình biên soạn" +msgstr "Nếu có, hiển thị các dấu mốc trong một hàng riêng biệt ở dưới đáy của trình biên soạn" msgid "Show Pose Markers" -msgstr "Hiện Ký Hiệu Dạng Đứng" +msgstr "Hiển Thị Dấu Mốc Tư Thế" msgid "Show markers belonging to the active action instead of Scene markers (Action and Shape Key Editors only)" -msgstr "Hiện ký hiệu của hành động hoạt động thay thế ký hiệu Cảnh (chỉ cho Trình Biên Soạn Hành Động và Mẫu Dạng)" +msgstr "Hiển thị các dấu mốc trực thuộc hành động đang hoạt động thay vì các dấu Cảnh (chỉ dành cho Trình Biên Soạn Hành Động và Hình Mẫu mà thôi)" msgid "Show Sliders" -msgstr "Hiện Trơn Trượt" +msgstr "Hiển Thị Khung Trượt" msgid "Show sliders beside F-Curve channels" -msgstr "Hiện trơn trượt kề kênh Cong-F" +msgstr "Hiển thị khung trượt giá trị bên lề các kênh Đường Cong-F" msgid "Auto-Merge Keyframes" -msgstr "Tự Động-Gồm Bức Ảnh Mẫu" +msgstr "Tự Động Hợp Nhất các Khung Khóa" msgid "Automatically merge nearby keyframes" -msgstr "Tự động gồm bức ảnh mẫu gần nhau" +msgstr "Tự động hợp nhất các khung khóa kề cạnh" msgid "Sync Markers" -msgstr "Đồng Bộ Hóa Ký Hiệu" +msgstr "Đồng Bộ Dấu Mốc" msgid "Sync Markers with keyframe edits" -msgstr "Đồng bộ hóa Ký Hiệu với sự biên tập bức ảnh mẫu" +msgstr "Đồng Bộ Hóa các Dấu Mốc với những thay đổi trên khung khóa" msgid "Realtime Updates" -msgstr "Nâng Cấp Thời Gian Thật" +msgstr "Cập Nhật Thời Gian Thực" msgid "When transforming keyframes, changes to the animation data are flushed to other views" -msgstr "Khi biến hóa bức ảnh mẫu, sự thay đổi của dữ liệu hành động được nâng cấp đến các màn khác" +msgstr "Khi biến hóa các khung khóa, sự thay đổi của dữ liệu hoạt họa sẽ được hiển thị ở các góc nhìn khác" msgid "Space File Browser" -msgstr "Trình Duyệt Tập Tin Không Gian" +msgstr "Không Gian Trình Duyệt Tập Tin" msgid "File browser space data" -msgstr "Dữ liệu không gian trình duyệt tập tin" +msgstr "Dữ liệu không gian của trình duyệt tập tin" msgid "Active Operator" -msgstr "Thao Tác Hoạt Động" +msgstr "Thao Tác đang Hoạt Động" msgid "User's bookmarks" -msgstr "Dấu sách của người dùng" +msgstr "Dấu trang của người dùng" msgid "Active Bookmark" -msgstr "Dấu Sách Hoạt Động" +msgstr "Dấu Trang đang Sử Dụng" msgid "Index of active bookmark (-1 if none)" -msgstr "Chỉ số của dấu sách hoạt động (-1 nếu không có)" +msgstr "Chỉ số của dấu trang đang sử dụng (-1 nếu không có)" msgid "Browsing Mode" @@ -89174,195 +97952,199 @@ msgstr "Chế Độ Trình Duyệt" msgid "Type of the File Editor view (regular file browsing or asset browsing)" -msgstr "Loại chiếu của Trình Biên Soạn Tập Tin (trình duyệt tập tin bình thường hay trình tích sản)" +msgstr "Thể loại góc nhìn Trình Biên Soạn Tập Tin (trình duyệt tập tin hoặc tài sản thông thường)" msgid "Asset Browser" -msgstr "Bộ Trình Duyệt Tích Sản" +msgstr "Trình Duyệt Thảo Tài Sản" msgid "Filebrowser Parameter" -msgstr "Tham Số Trình Duyệt Tập Tin" +msgstr "Tham Số của Trình Duyệt Tập Tin" msgid "Parameters and Settings for the Filebrowser" -msgstr "Tham Số và cài đặt cho Trình Duyệt Tập Tin" +msgstr "Tham số và sắp đặt cho Trình Duyệt Tập Tin" msgid "Recent Folders" -msgstr "Hồ Sơ Gần Đây" +msgstr "Thư Mục Gần Đây" msgid "Active Recent Folder" -msgstr "Hồ Sơ Gần Đây Hoạt Động" +msgstr "Thư Mục Gần Đây Sử Dụng" msgid "Index of active recent folder (-1 if none)" -msgstr "Chỉ số của hồ sơ gần đây hoạt động (-1 nếu không có)" +msgstr "Chỉ số của thư mục gần đây sử dụng (-1 nếu không có)" msgid "System Bookmarks" -msgstr "Dấu Sách Hệ Thống" +msgstr "Dấu Trang của Hệ Thống" msgid "System's bookmarks" -msgstr "Dấu Sách Của Hệ Thống" +msgstr "Dấu trang của hệ thống" msgid "Active System Bookmark" -msgstr "Dấu Sách Hệ Thống Hoạt Động" +msgstr "Dấu Trang Hệ Thống đang Sử Dụng" msgid "Index of active system bookmark (-1 if none)" -msgstr "Chỉ số của dấu sách hệ thống hoạt động (-1 nếu không có)" +msgstr "Chỉ số của dấu trang hệ thống đang sử dụng (-1 nếu không có)" msgid "System Folders" -msgstr "Hồ Sơ Hệ Thống" +msgstr "Thư Mục Hệ Thống" msgid "System's folders (usually root, available hard drives, etc)" -msgstr "Hồ sơ của hệ thông (thường là rễ, ổ cứng có thể dùng, v.v.)" +msgstr "Thư mục của hệ thống (thường là thư mục gốc, các ổ cứng có thể sử dụng, v.v.)" msgid "Active System Folder" -msgstr "Hồ Sơ Hệ Thống Hoạt Động" +msgstr "Thư Mục Hệ Thống đang Sử Dụng" msgid "Index of active system folder (-1 if none)" -msgstr "Chỉ số của hồ sơ hệ thống hoạt động (-1 nếu không có)" +msgstr "Chỉ số của thư mục hệ thống đang sử dụng (-1 nếu không có)" msgid "Space Graph Editor" -msgstr "Trình Biên Soạn Biểu Đồ Không Gian" +msgstr "Không Gian Trình Biên Soạn Đồ Thị" msgid "Graph Editor space data" -msgstr "Dữ liệu không gian của Trình Biên Soạn Biểu Đồ" +msgstr "Dữ liệu không gian của Trình Biên Soạn Đồ Thị" msgid "Cursor X-Value" -msgstr "Con Trỏ Tọa Độ X" +msgstr "Con Trỏ Giá Trị-X" msgid "Graph Editor 2D-Value cursor - X-Value component" -msgstr "Tọa độ X của con trỏ trong Trình Biên Soạn Biểu Đồ" +msgstr "Tọa độ X của con trỏ 2D trong Trình Biên Soạn Đồ Thị" msgid "Cursor Y-Value" -msgstr "Con Trỏ Tọa Độ Y" +msgstr "Con Trỏ Giá Trị-Y" msgid "Graph Editor 2D-Value cursor - Y-Value component" -msgstr "Tọa độ Y của con trỏ trong Trình Biên Soạn Biểu Đồ" +msgstr "Tọa độ Y của con trỏ 2D trong Trình Biên Soạn Đồ Thị" msgid "Has Ghost Curves" -msgstr "Có Đường Cong Bóng" +msgstr "Có Đường Cong Ảo Ảnh" msgid "Graph Editor instance has some ghost curves stored" -msgstr "Thực thể Biên Tập biểu đồ có giữ vài đường cong bóng" +msgstr "Thực thể Trình Biên Soạn Đồ Thị có lưu giữ một số đường cong ảo ảnh" msgid "Edit animation/keyframes displayed as 2D curves" -msgstr "Biên tập hoạt hình/bức ảnh được hiển thị như đường cong 2D" +msgstr "Biên soạn hoạt họa/khung hình đang hiển thị như các đường cong 2D" msgid "Edit drivers" -msgstr "Biên tập điều vận" +msgstr "Biên soạn điều vận" msgid "Individual Centers" -msgstr "Trung Tâm Riêng" +msgstr "Trọng Tâm Cá Nhân" msgid "Show Cursor" -msgstr "Hiện Con Trỏ" +msgstr "Hiển Thị Con Trỏ" msgid "Show 2D cursor" -msgstr "Hiện Con Trỏ 2D" +msgstr "Hiển thị con trỏ 2D" msgid "Show Extrapolation" -msgstr "Hiện Suy Ngoại" +msgstr "Hiển Thị Ngoại Suy" msgid "Show Handles" -msgstr "Hiện Tay Cầm" +msgstr "Hiển Thị Tay Cầm" msgid "Show handles of Bezier control points" -msgstr "Hiện tay cầm của điểm kiểm soát Bezier" +msgstr "Hiển thị tay cầm của các điểm điều khiển Bezier" msgid "Auto Normalization" -msgstr "Tự Động Đơn Vị Hóa" +msgstr "Tự Động Bình Thường Hóa" msgid "Automatically recalculate curve normalization on every curve edit" -msgstr "Tự động đơn vị hóa lại đường cong mỗi khi chỉnh sửa đường cong" +msgstr "Tự động bình thường hóa đường cong sau mỗi chỉnh sửa" msgid "Use Normalization" -msgstr "Dùng Đơn Vị Hóa" +msgstr "Sử Dụng Bình Thường Hóa" msgid "Display curves in normalized range from -1 to 1, for easier editing of multiple curves with different ranges" -msgstr "Hiển thị đường cong được đơn vị hóa trong phạm vi -1 đến 1, cho đễ biên tập nhiều đường cong có phạm vi khác nhau" +msgstr "Hiển thị các đường cong trong phạm vi bình thường hóa từ -1 đến +1, hầu cho việc biên soạn nhiều đường cong với các phạm vi khác nhau dễ dàng hơn" msgid "Only Selected Keyframes Handles" -msgstr "Chỉ Tay Cầm Bức Ảnh Mẫu Được Chọn" +msgstr "Duy Tay Cầm của Khung Khóa được Chọn" msgid "Only show and edit handles of selected keyframes" -msgstr "Chỉ hiện và biên tập tay cầm của bức ảnh mẫu được chọn" +msgstr "Duy hiển thị và biên soạn các tay cầm của những khung khóa được chọn mà thôi" msgid "Space Image Editor" -msgstr "Trình Biên Soạn Ảnh Không Gian" +msgstr "Không Gian Trình Biên Soạn Hình Ảnh" msgid "Image and UV editor space data" -msgstr "Dữ liệu của trình biên soạn không gian và ảnh UV" +msgstr "Dữ liệu không gian của trình biên soạn UV và hình ảnh" msgid "Display Channels" -msgstr "Hiển Thị Kênh" +msgstr "Hiển Thị các Kênh" msgid "Channels of the image to display" -msgstr "Các kênh của ảnh để hiển thị" +msgstr "Kênh của hình ảnh để hiển thị" + + +msgid "Color & Alpha" +msgstr "Màu & Alpha" msgid "Display image with RGB colors and alpha transparency" -msgstr "Hiển thị ảnh bằng màu RGB và độ đục" +msgstr "Hiển thị hình ảnh với các màu RGB (đỏ, lục, lam) và độ trong alpha" msgid "Display image with RGB colors" -msgstr "Hiển thị ảnh bằng màu RGB" +msgstr "Hiển thị hình ảnh với các màu RGB (đỏ, lục, lam)" msgid "Display alpha transparency channel" -msgstr "Hiển thị kênh độ đục" +msgstr "Hiển thị kênh về độ trong alpha" msgid "Z-Buffer" -msgstr "Đệm Z" +msgstr "Bộ Đệm-Z" msgid "Display Z-buffer associated with image (mapped from camera clip start to end)" -msgstr "Hiển Thị đệm Z của ảnh (ánh xạ từ độ sâu bắt đầu cắt đến kết thúc của máy quay phim)" +msgstr "Hiển thị bộ đệm-Z liên quan đến hình ảnh (ánh xạ từ điểm đầu đến điểm cuối khoảng cắt xén (tầm nhìn) của máy quay phim)" msgid "Grease pencil data for this space" -msgstr "Dữ liệu bút sáp cho không gian này" +msgstr "Dữ liệu Bút Chì Dầu cho không gian này" msgid "View the image" -msgstr "Hiển thị ảnh" +msgstr "Xem hình ảnh" msgid "UV Editor" @@ -89370,71 +98152,71 @@ msgstr "Trình Biên Soạn UV" msgid "UV edit in mesh editmode" -msgstr "Biên tập UV trong chế độ biên tập mạng lưới" +msgstr "Biên soạn UV trong Chế Độ Biên Soạn khung lưới" msgid "2D image painting mode" -msgstr "Chế độ sơn ảnh 2D" +msgstr "Chế độ sơn hình ảnh 2D" msgid "Mask editing" -msgstr "Biên tập mặt nạ" +msgstr "Biên soạn Màn Chắn Lọc" msgid "Overlay Settings" -msgstr "Cài Đặt Lớp Che" +msgstr "Sắp Đặt về Lớp Vẽ Lồng" msgid "Settings for display of overlays in the UV/Image editor" -msgstr "Cài đặt cho hiển thị các lớp che trong trình biên soạn UV/Ảnh" +msgstr "Cài đặt để hiển thị các lớp vẽ lồng trong trình biên soạn UV/Hình Ảnh" msgid "Rotation/Scaling Pivot" -msgstr "Điểm Tựa Xoay/Phóng To" +msgstr "Điểm Tựa cho Xoay Chiều/Đổi Tỷ Lệ" msgid "Pivot around the 3D cursor" -msgstr "Tựa quanh con trỏ 3D" +msgstr "Con trỏ 3D làm Điểm Tựa" msgid "Pivot around active object" -msgstr "Tựa quanh vật thể hoạt động" +msgstr "Dùng đối tượng đang hoạt động làm điểm tựa" msgid "Line Sample" -msgstr "Mẫu Đường" +msgstr "Mẫu vật theo đường vẽ" msgid "Sampled colors along line" -msgstr "Màu mẫu được lấy từ một đường" +msgstr "Lấy mẫu vật màu sắc dọc theo đường vẽ" msgid "Scopes to visualize image statistics" -msgstr "Các kế cho hiển thị thông kế ảnh" +msgstr "Kế đo lường để trực quan các thông kế của hình ảnh" msgid "Show Mask Editor" -msgstr "Hiện Biên Tập Mặt Nạ" +msgstr "Hiển Thị Trình Biên Soạn Màn Chắn Lọc" msgid "Show Mask editing related properties" -msgstr "Hiện đặc tính về biên tập Mặt Nạ" +msgstr "Hiển thị các tính chất liên quan đến biên soạn Màn Chắn Lọc" msgid "Show Paint" -msgstr "Hiện Sơn" +msgstr "Hiển Thị Sơn" msgid "Show paint related properties" -msgstr "Hiện đặc tính về sơn" +msgstr "Hiển thị các tính chất liên quan đến sơn" msgid "Show Render" -msgstr "Hiện Kết Xuất" +msgstr "Hiển Thị Kết Xuất" msgid "Show render related properties" -msgstr "Hiện đặc tính về kết xuất" +msgstr "Hiển thị các tính chất liên quan đến kết xuất" msgid "Display Repeated" @@ -89442,99 +98224,99 @@ msgstr "Hiển Thị Lặp Lại" msgid "Display the image repeated outside of the main view" -msgstr "Hiển thị ảnh lặp lại ra ngoài màn chiếu chánh" +msgstr "Hiển thị hình ảnh lăp đi lặp lại bên ngoài vùng của góc nhìn chính" msgid "Show Stereo" -msgstr "Hiện Nhị Kênh" +msgstr "Hiển Thị Lập Thể" msgid "Display the image in Stereo 3D" -msgstr "Hiển thị ảnh kiểu Nhị Kênh 3D" +msgstr "Hiển thị hình ảnh trong Lập Thể 3D" msgid "Show UV Editor" -msgstr "Hiện Trình Biên Soạn UV" +msgstr "Hiển Thị Trình Biên Soạn UV" msgid "Show UV editing related properties" -msgstr "Hiện đặc tính về biên tập UV" +msgstr "Hiển thị các tính chất liên quan đến biên soạn UV" msgid "Image Pin" -msgstr "Đinh Ảnh" +msgstr "Ghim Hình Ảnh Lại" msgid "Display current image regardless of object selection" -msgstr "Hiển thị ảnh hiện tại không kể có vật thể nào được chọn" +msgstr "Hiển thị hình ảnh hiện tại, bất kể đối tượng nào được chọn" msgid "Update Automatically" -msgstr "Nâng Cấp Tự Động" +msgstr "Cập Nhật Tự Động" msgid "Update other affected window spaces automatically to reflect changes during interactive operations such as transform" -msgstr "Tự động nâng cấp các không gian cửa sổ khác được ảnh hưởng cho có hiển thị sự biến đổi khi thực hành thao tác tương tác như biến hóa" +msgstr "Tự động cập nhật những không gian cửa sổ khác bị ảnh hưởng để phản ảnh các thay đổi trong quá trình tương tác của các thao tác, tựa như thao tác biến hóa chẳng hạn" msgid "UV editor settings" -msgstr "Cài đặt của trình biên soạn UV" +msgstr "Sắp đặt cho trình biên soạn UV" msgid "Zoom factor" -msgstr "Hệ Số Phóng To" +msgstr "Hệ số thu-phóng" msgid "Space Info" -msgstr "Thông Tin Không Gian" +msgstr "Không Gian Thông Tin" msgid "Info space data" -msgstr "Dữ liệu không gian thông tin" +msgstr "Dữ liệu về không gian thông tin" msgid "Show Debug" -msgstr "Hiện Sửa Sai Lầm" +msgstr "Hiển Thị Truy Lùng Lỗi" msgid "Display debug reporting info" -msgstr "Hiển thị báo cáo cho sửa sai lầm" +msgstr "Hiển thị thông tin truy lùng lỗi" msgid "Show Error" -msgstr "Hiện Sai Lầm" +msgstr "Hiển Thị Lỗi" msgid "Display error text" -msgstr "Hiển thị văn bản sai lầm" +msgstr "Hiển thị văn bản báo lỗi" msgid "Show Info" -msgstr "Hiện Thông Tin" +msgstr "Hiển Thị Thông Tin" msgid "Display general information" -msgstr "Hiển thị thông tin tổng quát" +msgstr "Hiển thị thông tin phổ thông" msgid "Show Operator" -msgstr "Hiện Thao Tác" +msgstr "Hiển Thị Thao Tác" msgid "Display the operator log" -msgstr "Hiển thị vở thao tác" +msgstr "Hiển thị sổ ghi thông tin hoạt động của operator" msgid "Show Warn" -msgstr "Hiện Cảnh Báo" +msgstr "Hiển Thị Cảnh Báo" msgid "Display warnings" -msgstr "Hiển thị cảnh cáo" +msgstr "Hiển thị các cảnh báo" msgid "Space Nla Editor" -msgstr "Không Gian Biên Tập NLA" +msgstr "Không Gian Trình Biên Soạn NLA" msgid "NLA editor space data" @@ -89542,51 +98324,51 @@ msgstr "Dữ liệu không gian của trình biên soạn NLA" msgid "Show Local Markers" -msgstr "Hiện Ký Hiệu Địa Phương" +msgstr "Hiển Thị Dấu Mốc Cục Bộ" msgid "Show action-local markers on the strips, useful when synchronizing timing across strips" -msgstr "Hiện ký hiệu hành động-địa phương trên các đoạn, có lợi ích khi đồng bộ hóa thời tự qua các đoạn" +msgstr "Hiển thị các dấu mốc địa phương của hành động trên các dải, có lợi khi đồng bộ hóa thời gian của cái dải" msgid "Show Control F-Curves" -msgstr "Hiện Cong-F Điều Khiển" +msgstr "Hiển Thị các Đường Cong-F Khống Chế" msgid "Show influence F-Curves on strips" -msgstr "Hiện các Cong-F được ảnh hưởng các đoạn" +msgstr "Hiển thị những Đường Cong-F tác động đến các dải" msgid "When transforming strips, changes to the animation data are flushed to other views" -msgstr "Khi biến hóa đoạn, biến đổi dữ liệu hoạt hình sẽ chiếu trong các màn khác" +msgstr "Khi biến hóa các dải, các biến đổi trong hoạt họa sẽ được hiển thị trên các góc nhìn khác" msgid "Space Node Editor" -msgstr "Trình Biên Soạn Giao Điểm Không Gian" +msgstr "Không Gian Trình Biên Soạn Nút" msgid "Node editor space data" -msgstr "Dữ liệu không gian của trình biên soạn giao điểm" +msgstr "Dữ liệu không gian trình biên soạn nút" msgid "Channels of the image to draw" -msgstr "Các kênh của ảnh để vẽ" +msgstr "Các kênh của hình ảnh để vẽ" msgid "Backdrop Offset" -msgstr "Dịch Y Nền " +msgstr "Dịch Chuyển của Nền" msgid "Backdrop offset" -msgstr "Dịch Y của nền " +msgstr "Dịch Chuyển Y của nền" msgid "Backdrop Zoom" -msgstr "Phóng Vào Nền" +msgstr "Thu-Phóng của Nền" msgid "Backdrop zoom factor" -msgstr "Hệ số phóng to nền" +msgstr "Hệ số thu-phóng của nền" msgid "Cursor Location" @@ -89594,87 +98376,136 @@ msgstr "Vị Trí Con Trỏ" msgid "Location for adding new nodes" -msgstr "Vị trí cho thêm giao điểm mới" +msgstr "Vị trí để thêm các nút mới" msgid "Edit Tree" -msgstr "Biên Tập Cây" +msgstr "Biên Soạn Cây" msgid "Node tree being displayed and edited" -msgstr "Cây giao điểm đang hiển thị và biên tập" +msgstr "Cây nút đang được hiển thị và biên soạn" + + +msgid "Node Tool Tree" +msgstr "Cây Công Cụ Nút" + + +msgid "Node group to edit as node tool" +msgstr "Nhóm nút để chỉnh sửa làm công cụ nút" + + +msgctxt "ID" +msgid "Geometry Nodes Type" +msgstr "Thể Loại Nút Hình Học" + + +msgctxt "ID" +msgid "Modifier" +msgstr "Bộ Điều Chỉnh" + + +msgid "Edit node group from active object's active modifier" +msgstr "Chỉnh sửa nhóm nút từ bộ điều chỉnh đang hoạt động của đối tượng hoạt động" + + +msgctxt "ID" +msgid "Tool" +msgstr "Công Cụ" + + +msgid "Edit any geometry node group for use as an operator" +msgstr "Chỉnh sửa bất kỳ nhóm nút hình học nào để sử dụng làm thao tác" msgid "Data-block whose nodes are being edited" -msgstr "Cục dữ liệu đang biên tập giao điểm của nó" +msgstr "Khối dữ liệu có các nút hiện đang được biên soạn" msgid "ID From" -msgstr "ID Từ" +msgstr "Từ ID" msgid "Data-block from which the edited data-block is linked" -msgstr "Cục dữ liệu nào được liên kết với cục dữ liệu được biên tập" +msgstr "Khối dữ liệu mà từ đó khối dữ liệu biên soạn được kết nối" msgid "Auto-offset Direction" -msgstr "Hướng Tự Động Dịch" +msgstr "Hướng Tự Động Dịch Chuyển" msgid "Direction to offset nodes on insertion" -msgstr "Hướng để dịch giao điểm khi chèn giao điểm mới" +msgstr "Hướng để dịch chuyển các nút khi chèn thêm nút mới" msgid "Settings for display of overlays in the Node Editor" -msgstr "Cài đặt cho hiển thị các lớp che trong Trình Biên Soạn Giao Điểm" +msgstr "Các sắp đặt dành cho việc hiển thị các lớp vẽ lồng trong Trình Biên Soạn Nút" msgid "Path from the data-block to the currently edited node tree" -msgstr "Đường đẫn từ cục dữ liệu đến cây giao điểm đang biên tập" +msgstr "Đường dẫn từ khối dữ liệu đến cây nút hiện đang biên soạn" msgid "Use the pinned node tree" -msgstr "Dùng cây giao điểm được đóng đinh" +msgstr "Dùng cây nút được ghim lại" + + +msgctxt "ID" +msgid "Shader Type" +msgstr "Kiểu Bộ Tô Bóng" msgid "Type of data to take shader from" -msgstr "Lấy bộ tô sắc từ loại dữ liệu nào" +msgstr "Kiểu dữ liệu để lấy bộ tô bóng từ đó ra" msgid "Edit shader nodes from Object" -msgstr "Biên tập giao điểm bộ tô sắc từ Vật Thể" +msgstr "Biên soạn các nút tô bóng từ Đối Tượng" msgid "Edit shader nodes from World" -msgstr "Biên tập giao điểm bộ tô sắc từ Thế Giới" +msgstr "Biên soạn các nút tô bóng từ Thế Giới" msgid "Edit shader nodes from Line Style" -msgstr "Biên tập giao điểm bộ tô sắc từ Phong Cách Nét" +msgstr "Biên soạn các nút tô bóng từ Phong Cách Đường Nét" msgid "Use active Viewer Node output as backdrop for compositing nodes" -msgstr "Dùng Giao Điểm Khán hoạt động ngõ ra làm nền cho giao điểm ghép" +msgstr "Dùng kết quả của Nút Quan Sát đang hoạt động làm hình ảnh nền cho các nút tổng hợp" + + +msgid "Supports Previews" +msgstr "Hỗ Trợ Xem Trước" + + +msgid "Whether the node editor's type supports displaying node previews" +msgstr "Thể loại trình biên soạn nút có hỗ trợ hiển thị bản xem trước nút hay không" + + +msgctxt "ID" +msgid "Texture Type" +msgstr "Kiểu Chất Liệu" msgid "Type of data to take texture from" -msgstr "Lấy chất liệu từ loại dữ liệu nào" +msgstr "Kiểu dữ liệu để lấy chất liệu từ đó ra" msgid "Edit texture nodes from World" -msgstr "Biên tập giao điểm chất liệu từ Thế Giới" +msgstr "Biên soạn các nút chất liệu từ Thế Giới" msgid "Edit texture nodes from Brush" -msgstr "Biên tập giao điểm chất liệu từ Bút" +msgstr "Biên soạn các nút chất liệu từ Đầu Bút" msgid "Edit texture nodes from Line Style" -msgstr "Biên tập giao điểm chất liệu từ Phong Cách Nét" +msgstr "Biên soạn các nút chất liệu từ Phong Cách Nét" msgid "Node tree type to display and edit" -msgstr "Cây giao điểm cho hiển thị và biên tập" +msgstr "Loại cây nút để hiển thị và biên soạn" msgid "Auto Render" @@ -89682,11 +98513,11 @@ msgstr "Tự Động Kết Xuất" msgid "Re-render and composite changed layers on 3D edits" -msgstr "Kết xuất lại và ghép lớp được đổi trong biên tập 3D" +msgstr "Tái kết xuất và tổng hợp các tầng lớp bị chuyển đổi do những biên soạn thi hành ở môi trường 3D" msgid "Space Outliner" -msgstr "Mục Lục Không Gian" +msgstr "Không Gian Mục Lục" msgid "Outliner space data" @@ -89694,19 +98525,19 @@ msgstr "Dữ liệu không gian mục lục" msgid "Type of information to display" -msgstr "Loại dữ liệu để hiển thị" +msgstr "Loại thông tin để hiển thị" msgid "Display scenes and their view layers, collections and objects" -msgstr "Hiển thị cảnh và lớp màn, sưu tập, và vật thể của chúng nó" +msgstr "Hiển thị các cảnh và các Tầng Góc Nhìn, các bộ sưu tập và các đối tượng" msgid "Display collections and objects in the view layer" -msgstr "Hiển thị các sưu tập và vật thể trong lớp màn" +msgstr "Hiển thị các bộ sưu tập và các đối tượng trong Tầng Góc Nhìn" msgid "Display data belonging to the Video Sequencer" -msgstr "Hiển thị dữ liệu của Bộ Trình Tự Video" +msgstr "Hiển thị dữ liệu trực thuộc Trình Phối Hình" msgid "Blender File" @@ -89714,7 +98545,7 @@ msgstr "Tập Tin Blender" msgid "Display data of current file and linked libraries" -msgstr "Hiển thị dữ liệu của tập tin hiện tại và các thư viện được liên kết" +msgstr "Hiển thị dữ liệu của tập tin hiện tại và các thư viện kết nối" msgid "Data API" @@ -89722,15 +98553,15 @@ msgstr "API Dữ Liệu" msgid "Display low level Blender data and its properties" -msgstr "Hiển thị dữ liệu Blender cấp thấp và đặc tính của nó" +msgstr "Hiển thị dữ liệu thâm sâu của Blender cùng các tính chất của nó" msgid "Library Overrides" -msgstr "Đồ Vượt Quyền Thư Viện" +msgstr "Vượt Quyền Thư Viện" msgid "Display data-blocks with library overrides and list their overridden properties" -msgstr "Hiển thị cục dữ liệu có đồ vượt quyền thư viện và chiếu các đặc điểm được vượt quyền" +msgstr "Hiển thị các khối dữ liệu có vượt quyền thư viện và liệt kê các tính chất đã vượt quyền của chúng" msgid "Orphan Data" @@ -89738,312 +98569,375 @@ msgstr "Dữ Liệu Mồ Côi" msgid "Display data-blocks which are unused and/or will be lost when the file is reloaded" -msgstr "Hiển thị cục dữ liệu mà chưa được dùng và/hay sẽ bị mất khi tập tin được nhập lại" +msgstr "Hiển thị khối dữ liệu không dùng đến và/hoặc sẽ bị mất khi tái nạp tập tin" msgctxt "ID" msgid "Filter by Type" -msgstr "Lọc bằng Loại" +msgstr "Thanh Lọc theo Thể Loại" msgid "Data-block type to show" -msgstr "Hiển thị loại cục dữ liệu nào" +msgstr "Thể loại khối dữ liệu để hiển thị" msgid "Invert the object state filter" -msgstr "Đảo nghịch bộ lọc trạng thái của vật thể" +msgstr "Đảo nghịch sự thanh lọc theo trạng thái của đối tượng" msgid "Object State Filter" -msgstr "Bộ Lọc Trạng Thái Vật Thể" +msgstr "Thanh Lọc theo Trạng Thái của Đối Tượng" msgid "Show all objects in the view layer" -msgstr "Hiện tất cả vật thể trong lớp màn chiếu" +msgstr "Hiển thị toàn bộ các đối tượng trong tầng góc nhìn" msgid "Show visible objects" -msgstr "Hiện vật thể đang hiển thị" +msgstr "Hiển thị đối tượng nhìn thấy được" msgid "Show selected objects" -msgstr "Hiện vật thể được chọn" +msgstr "Hiển thị đối tượng được chọn" msgid "Show only the active object" -msgstr "Chỉ hiện vật thể hoạt động" +msgstr "Duy hiển thị đối tượng đang hoạt động mà thôi" msgid "Show only selectable objects" -msgstr "Chỉ hiện vật thể có thể được chọn" +msgstr "Duy hiển thị các đối tượng có thể chọn mà thôi" msgid "Live search filtering string" -msgstr "Xâu lọc tìm kiếm trực tiếp" +msgstr "Chuỗi ký tự để thanh lọc khi tìm kiếm trực tiếp" msgid "Library Override View Mode" -msgstr "Chế Độ Hiển Thị Cho Vượt Quyền Của Thư Viện" +msgstr "Chế Độ Quan Sát Vượt Quyền Thư Viện" msgid "Choose different visualizations of library override data" -msgstr "Chọn những kiểu sự hiển thị khác cho dữ liệu vượt quyền của thư viện" +msgstr "Chọn các diễn họa trực quan khác nhau về dữ liệu vượt quyền thư viện" msgid "Display all local override data-blocks with their overridden properties and buttons to edit them" -msgstr "Hiển thị hết cục dữ liệu vượt quyền địa phương với đặc tính được vượt quyền và những nút cho biện tập chúng nó" +msgstr "Hiển thị toàn bộ các khối dữ liệu vượt quyền cục bộ với các tính chất vượt quyền của chúng và các nút biên soạn chúng" msgid "Hierarchies" -msgstr "Tầng Bậc" +msgstr "Cấu Trúc Thứ Bậc" msgid "Display library override relationships" -msgstr "Hiển thị các quan hệ vượt quyền cho thư viện" +msgstr "Hiển thị các mối quan hệ vượt quyền thư viện" msgid "Show Mode Column" -msgstr "Hiện Cột Chế Độ" +msgstr "Hiển Thị Cột Chế Độ" msgid "Show the mode column for mode toggle and activation" -msgstr "Hiện cột chế độ để bật/tắt và khởi động" +msgstr "Hiển thị cột chế độ để có thể bật/tắt và kích hoạt chế độ" msgid "Indirect only" -msgstr "Chỉ gián tiếp" +msgstr "Duy gián tiếp" msgid "Case Sensitive Matches Only" -msgstr "Chỉ Giống Hệt Chứ Hoa Và Chữ Thương" +msgstr "Duy Xứng Khớp Loại Chữ" msgid "Only use case sensitive matches of search string" -msgstr "Chỉ nhận kết qủa có chữ hoa và chữ thương giống hệt xâu văn bản đang tìm" +msgstr "Chỉ sử dụng những trường hợp khớp có cùng loại chữ (hoa/thường) với văn bản lùng tìm mà thôi" msgid "Show Object Children" -msgstr "Hiện Vật Thể Con Cái" +msgstr "Hiển Thị Con Cái của Đối Tượng" msgid "Show children" -msgstr "Hiện con cái" +msgstr "Hiển thị con cái" msgid "Show Collections" -msgstr "Hiện Sưu Tập" +msgstr "Hiển Thị Bộ Sưu Tập" msgid "Show collections" -msgstr "Hiện sưu tập" +msgstr "Hiển thị bộ sưu tập" msgid "Complete Matches Only" -msgstr "Chỉ Giống Hệt Toàn Bộ" +msgstr "Duy Khớp Hoàn Toàn" msgid "Only use complete matches of search string" -msgstr "Chỉ dùng đồ giống hệt toàn bộ của xâu tìm kiếm" +msgstr "Chỉ sử dụng những trường hợp hoàn toàn khớp với chuỗi ký tự tìm kiếm mà thôi" msgid "Show only data-blocks of one type" -msgstr "Hiện chỉ một loại cục dữ liệu" +msgstr "Hiển thị duy các khối dữ liệu của một thể loại" msgid "Show System Overrides" -msgstr "Hiện Đồ Vượt Quyền Hệ Thống" +msgstr "Hiển Thị các Vượt Quyền Hệ Thống" msgid "For libraries with overrides created, show the overridden values that are defined/controlled automatically (e.g. to make users of an overridden data-block point to the override data, not the original linked data)" -msgstr "Cho thư viện đã có đồ vượt quyền, hiện các giá trị được chỉ định/kiểm soát tự động (ví dụ bắt người dùng một cục dữ liệu chỉ đến dữ liệu bị vượt quyền, không phải là dữ liệu ban đầu được liên kết)" +msgstr "Đối với các thư viện có các trường hợp vượt quyền đã được kiến tạo thì hiển thị các giá trị vượt quyền được xác định/điều khiển tự động (ví dụ: làm cho các người dùng của một khối dữ liệu trỏ vào (tham chiếu) dữ liệu vượt quyền chứ không phải dữ liệu liên kết ban đầu)" msgid "Filter Objects" -msgstr "Lọc Vật Thể" +msgstr "Thanh Lọc Đối Tượng" msgid "Show objects" -msgstr "Hiện vật thể" +msgstr "Hiển thị đối tượng" msgid "Show Armatures" -msgstr "Hiện Cốt" +msgstr "Hiển Thị Khung Cốt" msgid "Show armature objects" -msgstr "Hiện vật thể cốt" +msgstr "Hiển thị đối tượng khung cốt" msgid "Show Cameras" -msgstr "Hiện Máy Quay Phim" +msgstr "Hiển Thị Máy Quay Phim" msgid "Show camera objects" -msgstr "Hiện vật thể máy quay phim" +msgstr "Hiển Thị Đối Tượng Máy Quay Phim" msgid "Show Object Contents" -msgstr "Hiện Nội Dung Vật Thể" +msgstr "Hiển Thị Nội Đối Tượng" msgid "Show what is inside the objects elements" -msgstr "Hiện cái gì ờ trong phần tử vật thể" +msgstr "Hiển thị các phần tử bên trong các đối tượng" msgid "Show Empties" -msgstr "Hiện vật Thể Rỗng" +msgstr "Hiển Thị Đối Tượng Trống/Rỗng" msgid "Show empty objects" -msgstr "Hiện vật thể rỗng" +msgstr "Hiển Thị Đối Tượng Rỗng" + + +msgid "Show Grease Pencil" +msgstr "Hiển Thị Bút Chì Dầu" + + +msgid "Show grease pencil objects" +msgstr "Hiển thị các đối tượng bút chì dầu" msgid "Show Lights" -msgstr "Hiện Đèn" +msgstr "Hiển Thị Nguồn Sáng" msgid "Show light objects" -msgstr "Hiện vật thể đèn" +msgstr "Hiển Thị các đối tượng là nguồn sáng" msgid "Show Meshes" -msgstr "Hiện Mạng Lưới" +msgstr "Hiển Thị Khung Lưới" msgid "Show mesh objects" -msgstr "Hiện vật thể mạng lưới" +msgstr "Hiển thị các đối tượng khung lưới" msgid "Show Other Objects" -msgstr "Hiện Vật Thể Khác" +msgstr "Hiển Thị các Đối Tượng Khác" msgid "Show curves, lattices, light probes, fonts, ..." -msgstr "Hiện đường cong, lưới rào, quang kế, phông, ..." +msgstr "Hiển thị các đường cong, lưới rào, bộ thăm dò ánh sáng, phông chữ, ..." msgid "Show All View Layers" -msgstr "Hiện Hết Lớp Màn Chiếu" +msgstr "Hiển Thị Toàn Bộ các Tầng Góc Nhìn" msgid "Show all the view layers" -msgstr "Hiện tất cả lớp màn chiếu" +msgstr "Hiển thị toàn bộ các tầng góc nhìn" msgid "Sort Alphabetically" -msgstr "Sắp xếp Thứ Tự Chữ Cái" +msgstr "Sắp Xếp theo Thứ Tự Bảng Chữ Cái" msgid "Sync Outliner Selection" -msgstr "Đồng Bộ Hóa Sự Lựa Chọn Mục Lục" +msgstr "Đồng Bộ Hóa Lựa Chọn trong Mục Lục" msgid "Sync outliner selection with other editors" -msgstr "Đồng bộ hóa sự lựa chọn của mục lục với các trình biên soạn khác" +msgstr "Đồng bộ hóa lựa chọn trong mục lục với các trình biên soạn khác (phản ảnh sự lựa chọn trong các cửa sổ khác)" msgid "Space Preferences" -msgstr "Tùy Chọn Không Gian" +msgstr "Cài Đặt Sở Thích về Không Gian" msgid "Blender preferences space data" -msgstr "Dữ liệu không gian tùy chọn Blender" +msgstr "Cài đặt sở thích của Blender về dữ liệu không gian" msgid "Search term for filtering in the UI" -msgstr "Chữ tìm kiếm cho lọc trong giao diện người dùng" +msgstr "Chữ tìm kiếm để thanh lọc trong Giao Diện Người Dùng" msgid "Filter method" -msgstr "Phương Pháp Lọc" +msgstr "Phương pháp thanh lọc" msgid "Filter based on the operator name" -msgstr "Lọc tùy cơ sở tên của thao tác" +msgstr "Thanh lọc dựa trên tên của thao tác" msgid "Key-Binding" -msgstr "Chỉ Định Phím" +msgstr "Tập Hợp Phím" msgid "Filter based on key bindings" -msgstr "Lọc tùy chỉ định phím" +msgstr "Thanh lọc dựa trên những bố trí phím bấm" msgid "Properties Space" -msgstr "Không Gian Đặc Tính" +msgstr "Không Gian Tính Chất" msgid "Properties space data" -msgstr "Dữ liệu của không gian đặc tính" +msgstr "Dữ liệu của không gian tính chất" msgid "Active Tool and Workspace settings" -msgstr "Cài đặt Dụng Cụ hoạt động và Công Trường" +msgstr "Sắp Đặt Không Gian Làm Việc và Công Cụ ĐHĐ" msgid "Scene Properties" -msgstr "Đặc Tính Cảnh" +msgstr "Tính Chất của Cảnh" + + +msgctxt "ID" +msgid "Render" +msgstr "Kết Xuất" msgid "Render Properties" -msgstr "Đặc Tính Kết Xuất" +msgstr "Tính Chất của Kết Xuất" + + +msgctxt "ID" +msgid "Output" +msgstr "Đầu Ra" msgid "Output Properties" -msgstr "Đặc Tính Ngõ Ra" +msgstr "Tính Chất Đầu Ra" + + +msgctxt "ID" +msgid "View Layer" +msgstr "Tầng Góc Nhìn" msgid "View Layer Properties" -msgstr "Đặc Tính Lớp Màn Chiếu" +msgstr "Tính Chất Tầng Lớp Góc Nhìn" msgid "World Properties" -msgstr "Đặc Tính Thế Giới" +msgstr "Tính ChấtThế Giới" msgid "Collection Properties" -msgstr "Đặc Tính Sưu Tập" +msgstr "Tính Chất Bộ Sưu Tập" + + +msgctxt "ID" +msgid "Constraints" +msgstr "Ràng Buộc" msgid "Object Constraint Properties" -msgstr "Đặc Tính Ràng Buộc Vật Thể" +msgstr "Tính Chất của Ràng Buộc Đối Tượng" + + +msgctxt "ID" +msgid "Modifiers" +msgstr "Bộ Điều Chỉnh" msgid "Modifier Properties" -msgstr "Đặc Tính Bộ Điều Chỉnh" +msgstr "Tính Chất của Bộ Điều Chỉnh" + + +msgctxt "ID" +msgid "Data" +msgstr "Dữ Liệu" msgid "Object Data Properties" -msgstr "Đắc Tính Dữ Liệu Vật Thể" +msgstr "Tính Chất của Dữ Liệu Đối Tượng" + + +msgctxt "ID" +msgid "Bone" +msgstr "Xương" msgid "Bone Properties" -msgstr "Đặc Tính Xương" +msgstr "Tính Chất của Xương" + + +msgctxt "ID" +msgid "Bone Constraints" +msgstr "Ràng Buộc của Xương" msgid "Bone Constraint Properties" -msgstr "Đặc Tính Ràng Buộc Xương" +msgstr "Tính Chất của Ràng Buộc Xương" msgid "Material Properties" -msgstr "Đặc Tính Vật Liệu" +msgstr "Tính Chất Nguyên Vật Liệu" msgid "Texture Properties" -msgstr "Đặc Tính Chất Liệu" +msgstr "Tính Chất Chất Liệu" + + +msgctxt "ID" +msgid "Particles" +msgstr "Hạt" msgid "Particle Properties" -msgstr "Đặc Tính Hạt" +msgstr "Tính Chất Hạt" + + +msgctxt "ID" +msgid "Physics" +msgstr "Vật Lý" msgid "Physics Properties" -msgstr "Đặc Tính Vật Lý" +msgstr "Tính Chất Vật Lý" + + +msgctxt "ID" +msgid "Effects" +msgstr "Hiệu Ứng" msgid "Visual Effects Properties" -msgstr "Đặc Tính Hiệu Ứng Hiển Thị" +msgstr "Tính Chất của Hiệu Ứng Trực Quan" msgid "Outliner Sync" @@ -90051,43 +98945,43 @@ msgstr "Đồng Bộ Hóa Mục Lục" msgid "Change to the corresponding tab when outliner data icons are clicked" -msgstr "Đổi đến cùng nhẵn khi biểi tượng của dữ liệu mục lục được bấm" +msgstr "Đổi đến thẻ tương ứng khi các biểu tượng dữ liệu mục lục được bấm vào" msgid "Always change tabs when clicking an icon in an outliner" -msgstr "Lần nào cũng đổi nhẵn khi bấm một biểu tượng trong một mục lục" +msgstr "Luôn luôn đổi thẻ khi bấm vào một biểu tượng trong mục lục" msgid "Never change tabs when clicking an icon in an outliner" -msgstr "Không bao giờ đổi nhẵn khi bấm một biểu tượng trong một mục lục" +msgstr "Không bao giờ đổi thẻ khi bấm vào một biểu tượng trong mục lục" msgid "Change tabs only when this editor shares a border with an outliner" -msgstr "Chỉ đổi nhẵn khi bộ biên đồ này đang chia sẻ một biên giới với một mục lục" +msgstr "Chỉ đổi thẻ khi trình biên soạn này có cùng cạnh với một cửa sổ mục lục" msgid "Tab Search Results" -msgstr "Kết Qủa Tìm Kiếm Nhẵn" +msgstr "Kết Quả Thẻ Tìm Kiếm" msgid "Whether or not each visible tab has a search result" -msgstr "Mỗi nhẵn hiện có kết qủa tìm kiếm hay không" +msgstr "Mỗi thẻ nhìn thấy được có kết quả tìm kiếm hay không" msgid "Pin ID" -msgstr "ID Đóng Đinh" +msgstr "Ghim ID" msgid "Use the pinned context" -msgstr "Dùng bối cảnh đóng đinh" +msgstr "Sử dụng ngữ cảnh đã ghim lại" msgid "Space Sequence Editor" -msgstr "Trình Biên Soạn Phối Hình Không Gian" +msgstr "Không Gian Trình Phối Hình" msgid "Sequence editor space data" -msgstr "Dữ liệu không gian của trình biên soạn trình tự" +msgstr "Dữ liệu không gian của trình phối hình" msgid "Display Channel" @@ -90095,35 +98989,35 @@ msgstr "Hiển Thị Kênh" msgid "The channel number shown in the image preview. 0 is the result of all strips combined" -msgstr "Số kênh đang hiển thị trong dự khán ảnh. 0 là hết đoạn ảnh ghép lại" +msgstr "Số kênh được hiển thị trong hình ảnh xem trước. Số 0 là kết quả kết hợp của toàn bộ các dải" msgid "View mode to use for displaying sequencer output" -msgstr "Chế độ hiển thị để dùng cho hiển thị ngõ ra của bộ trình tự" +msgstr "Chế độ góc nhìn dùng để hiển thị kết quả của trình phối hình" msgid "Luma Waveform" -msgstr "Hình Dạng Sóng Độ Sáng" +msgstr "Đồ Thị Sóng Ánh Sáng" msgid "Chroma Vectorscope" -msgstr "Kế Vectơ Màu Sắc" +msgstr "Véctơ Kế về Màu Sắc" msgid "Grease Pencil data for this Preview region" -msgstr "Dữ liệu Bút Sáp cho vùng Dự Khán này" +msgstr "Dữ liệu Bút Chì Dầu cho vùng Xem Trước này" msgid "Overlay Type" -msgstr "Loại Lớp Che" +msgstr "Kiểu Vẽ Lồng" msgid "Overlay display method" -msgstr "Phương pháp của lớp che" +msgstr "Phương pháp hiển thị lớp vẽ lồng" msgid "Show rectangle area overlay" -msgstr "Hiện khu vực chữ nhật lớp che" +msgstr "Hiển thị khu vực hình chữ nhật lồng ở trên" msgid "Reference" @@ -90131,7 +99025,7 @@ msgstr "Tham Chiếu" msgid "Show reference frame only" -msgstr "Chỉ cho xem bức ảnh tham chiếu" +msgstr "Chỉ hiển thị khung hình tham khảo mà thôi" msgid "Current" @@ -90139,243 +99033,251 @@ msgstr "Hiện Tại" msgid "Show current frame only" -msgstr "Chỉ hiện bức ảnh hiện tại" +msgstr "Chỉ hiển thị khung hình hiện tại mà thôi" msgid "Channels of the preview to display" -msgstr "Vẽ các kênh nào trong dự khán" +msgstr "Những kênh của bản xem trước để hiển thị" msgid "Settings for display of overlays" -msgstr "Cài đặt cho hiển thị các lớp che" +msgstr "Cài đặt về hiển thị các lớp vẽ lồng" msgid "No display" -msgstr "Không hiển thị" +msgstr "Không Hiển Thị" msgid "Scene size" -msgstr "Kích cỡ cảnh" +msgstr "Kích thước cảnh" msgid "Use Backdrop" -msgstr "Ảnh Nền" +msgstr "Dùng Màn Nền" msgid "Display result under strips" -msgstr "Hiển thị kết qủa dưới đoạn" +msgstr "Hiển thị kết quả dưới các dải" msgid "Display Frames" -msgstr "Hiển Thị Số Bức Ảnh" +msgstr "Hiển Thị Số Khung Hình" msgid "Display frames rather than seconds" -msgstr "Hiển thị số bức ảnh thay thế giây" +msgstr "Hiển thị theo số khung hình, hơn là theo số giây" msgid "Context Gizmo" -msgstr "Đồ Đạc Bối Cảnh" +msgstr "Gizmo Ngữ Cảnh" msgid "Context sensitive gizmos for the active item" -msgstr "Đồ đạc nhạy cảm bối cảnh cho mặt hàng hoạt động" +msgstr "Gizmo mẫn cảm với ngữ cảnh cho đối tượng đang hoạt động" msgid "Tool Gizmo" -msgstr "Đô Đạc Dụng Cụ" +msgstr "Gizmo về Công Cụ" msgid "Active tool gizmo" -msgstr "Đồ đạc dụng cụ hoạt động" +msgstr "Gizmo về công cụ đang hoạt động" msgid "Show Overexposed" -msgstr "Hiện Hứng Dư" +msgstr "Hiển Thị Bị Quá Sáng" msgid "Show overexposed areas with zebra stripes" -msgstr "Hiện khu vực bị hứng dư bằng sọc ngựa quảng" +msgstr "Hiển thị khu vực bị quá sáng bằng các đường vằn ngựa" msgid "Show Overlays" -msgstr "Hiện Các Lớp Che" +msgstr "Hiển Thị Lớp Vẽ Lồng" msgid "Separate Colors" -msgstr "Chẻ Màu" +msgstr "Phân Tách Màu Sắc" msgid "Separate color channels in preview" -msgstr "Chẻ kênh màu trong dự khán" +msgstr "Tách phân các kênh màu trong xem trước" msgid "Transform Preview" -msgstr "Dự Khán Biến Hóa" +msgstr "Xem Trước Biến Hóa" msgid "Show preview of the transformed frames" -msgstr "Hiện dự khán của các bức ảnh được biến hóa" +msgstr "Hiển thị xem trước của các khung hình đã được biến hóa" msgid "Limit View to Contents" -msgstr "Hạn Chế Màn Chiếu Nội Dung" +msgstr "Giới Hạn Góc Nhìn trong Nội Dung" msgid "Limit timeline height to maximum used channel slot" -msgstr "Hạn chế chiều cao của thời lịch tới khe kênh tối đa được dùng" +msgstr "Giới hạn chiều cao dòng thời gian ở khe kênh sử dụng tối đa" msgid "Transform markers as well as strips" -msgstr "Biến hóa ký hiệu và đoạn ảnh" +msgstr "Đồng biến hóa dấu mốc và các dải" msgid "Use Proxies" -msgstr "Dùng Đại Lý" +msgstr "Sử Dụng Đại Diện" msgid "Use optimized files for faster scrubbing when available" -msgstr "Dùng tập tin tối ưu cho keo đi nhanh hơn khi có thể dùng" +msgstr "Sử dụng các tập tin đã tối ưu hóa để rà quét qua nhanh tróng hơn khi có thể" msgid "Zoom to Fit" -msgstr "Phóng To Cho Vừa" +msgstr "Thu-Phóng để Khít Vừa" msgid "Automatically zoom preview image to make it fully fit the region" -msgstr "Tự động phóng to ảnh dự khán cho ché vừa đầy vùng" +msgstr "Tự động thu-phóng hình ảnh xem trước để làm cho nó khít vừa vùng" msgid "View Type" -msgstr "Loại Màn" +msgstr "Kiểu Góc Nhìn" msgid "Type of the Sequencer view (sequencer, preview or both)" -msgstr "Loại màn chiếu của bộ trình tự (bộ trình tự, dự khán hay cả hai)" +msgstr "Góc nhìn của Trình Phối Hình (trình phối hình, xem trước hay cả hai)" msgid "Sequencer & Preview" -msgstr "Bộ Trình Tự & Dự Khán" +msgstr "Xem Trước & Trình Phối Hình" msgid "Space Spreadsheet" -msgstr "Bảnh Tính Không Gian" +msgstr "Không Gian Bảng Tính" msgid "Spreadsheet space data" -msgstr "Dữ liệu không gian bảng tính" +msgstr "Dữ liệu không gian của bảng tính" msgid "Attribute domain to display" -msgstr "Phạm vi đặc điểm để hiển thị" +msgstr "Phạm vi thuộc tính để hiển thị" msgid "Columns" -msgstr "Cột" +msgstr "Các Cột" msgid "Persistent data associated with spreadsheet columns" -msgstr "Dữ liệu cố chấp liên quan các cột bảng tính" +msgstr "Dữ liệu ổn định liên hệ với các cột của bảng tính" msgid "Display Context Path Collapsed" -msgstr "Hiển Thị Đường Dẫn Bối Cảnh Bị Sạp" +msgstr "Hiển Thị Đường Dẫn Ngữ Cảnh bị Thu Lại" msgid "Geometry Component" -msgstr "Thành Phần Hình Dạng" +msgstr "Thành Phần Hình Học" msgid "Part of the geometry to display data from" -msgstr "Hiển thị dữ liệu từ bộ phận nào của hình dạng" +msgstr "Phần của hình học để hiển thị dữ liệu từ đó" msgid "Is Pinned" -msgstr "Được Đóng Đinh" +msgstr "Được Ghim Xuống" msgid "Context path is pinned" -msgstr "Đường dẫn được đóng đinh" +msgstr "Đường dẫn ngữ cảnh được ghim xuống" msgid "Object Evaluation State" -msgstr "Tráng Thái Tính Toán Vật Thể" +msgstr "Trạng Thái Ước Tính Đối Tượng" msgid "Use data from fully or partially evaluated object" -msgstr "Dùng dữ liệu từ vật thể được tính toán toàn bộ hay một phần" +msgstr "Sử dụng dữ liệu từ đối tượng được ước tính đầy đủ hoặc chỉ ước tính một phần mà thôi" msgid "Use data from original object without any modifiers applied" -msgstr "Dùng dữ liệu của vật thể ban gốc mà không có bộ điều chỉnh nào được áp dụng" +msgstr "Sử dụng dữ liệu từ đối tượng gốc mà không áp dụng bất kỳ bộ điều chỉnh nào cả" msgid "Viewer Node" -msgstr "Giao Điểm Màn Chiếu" +msgstr "Nút Quan Sát" msgid "Use intermediate data from viewer node" -msgstr "Dùng dữ liệu giữa từ giao điểm màn chiếu" +msgstr "Sử dụng dữ liệu trung gian từ nút quan sát" msgid "Row Filters" -msgstr "Bộ Lọc Hàng" +msgstr "Thanh Lọc Hàng" msgid "Filters to remove rows from the displayed data" -msgstr "Các bộ lọc cho xóa hàng từ dữ liệu được hiển thị" +msgstr "Thanh lọc các hàng ra khỏi dữ liệu hiển thị" msgid "Show Only Selected" -msgstr "Hiện Chỉ Được Chọn" +msgstr "Duy Hiển Thị cái Được Chọn" msgid "Only include rows that correspond to selected elements" -msgstr "Chỉ gồm các hàng tương tự phần tử được chọn" +msgstr "Chỉ bao gồm các hàng tương ứng với các phần tử đã chọn mà thôi" msgid "Use Filter" -msgstr "Sử Dụng Bộ Lọc" +msgstr "Sử Dụng Thanh Lọc" + + +msgid "Viewer Path" +msgstr "Đường Dẫn Quan Sát" + + +msgid "Path to the data that is displayed in the spreadsheet" +msgstr "Đường dẫn đến dữ liệu hiển thị trong bảng tính" msgid "Space Text Editor" -msgstr "Trình Biên Soạn Văn Bản Không Gian" +msgstr "Không Gian Biên Soạn Văn Bản" msgid "Text editor space data" -msgstr "Dữ liệu không gian của trình biên soạn văn bản" +msgstr "Dữ liệu không gian biên soạn văn bản" msgid "Find Text" -msgstr "Tìm Văn Bản" +msgstr "Văn Bản Lùng Tìm" msgid "Text to search for with the find tool" -msgstr "Tìm văn bản nào khi dùng dụng cụ tìm kiếm" +msgstr "Văn bản để lùng tìm dùng công cụ tìm kiếm" msgid "Margin Column" -msgstr "Lề Cột" +msgstr "Cột Lề" msgid "Column number to show right margin at" -msgstr "Số cột để cho hiện vị trí lề phía phải" +msgstr "Số cột dùng để hiển thị lề bên phải" msgid "Replace Text" -msgstr "Thay Thế Văn Bản" +msgstr "Văn Bản Thay Thế" msgid "Text to replace selected text with using the replace tool" -msgstr "Thay thế văn bản với văn bản nào khi dùng dụng cụ thay thế" +msgstr "Văn bản để thay thế văn bản được chọn dùng công cụ thay thế" msgid "Highlight Line" -msgstr "Tô Sáng Dòng" +msgstr "Nêu Bật Dòng" msgid "Highlight the current line" -msgstr "Tô sáng dòng hiện tại" +msgstr "Nêu bật dòng hiện tại" msgid "Line Numbers" @@ -90383,43 +99285,43 @@ msgstr "Số Dòng" msgid "Show line numbers next to the text" -msgstr "Hiện số dòng kề bên hàng văn bản" +msgstr "Hiển thị số dòng kề bên dòng văn bản" msgid "Show Margin" -msgstr "Hiện Lề" +msgstr "Hiển Thị Lề" msgid "Show right margin" -msgstr "Hiện lề phía phải" +msgstr "Hiển thị lề phải" msgid "Syntax Highlight" -msgstr "Tô Sáng Cú Pháp" +msgstr "Nêu Bật Cú Pháp" msgid "Syntax highlight for scripting" -msgstr "Tô sáng cú pháp cho viết văn thảo" +msgstr "Nêu bật cú pháp trong khi viết tập lệnh" msgid "Word Wrap" -msgstr "Trở Dòng Chữ" +msgstr "Xuống Dòng tại Ranh Giới của Từ" msgid "Wrap words if there is not enough horizontal space" -msgstr "Cho chữ đi dòng dưới nếu không có đủ không gian ngang" +msgstr "Xuống dòng tại ranh giới của các từ nếu không có đủ chỗ trống theo hàng ngang" msgid "Tab Width" -msgstr "Bề Rộng Tab" +msgstr "Chiều Rộng của Tab" msgid "Number of spaces to display tabs with" -msgstr "Dùng số lượng dấu cách cho hiển thị tab" +msgstr "Dùng số lượng dấu cách để hiển thị các ký tự tab" msgid "Text displayed and edited in this space" -msgstr "Không gian cho hiển thị và biên tập văn bản" +msgstr "Không gian để hiển thị và biên soạn văn bản" msgid "Top Line" @@ -90427,247 +99329,383 @@ msgstr "Dòng Trên Cùng" msgid "Top line visible" -msgstr "Dòng trên cùng" +msgstr "Dòng trên cùng nhìn thấy được" msgid "Search in all text data-blocks, instead of only the active one" -msgstr "Tìm kiếm trong hết cục dữ liệu văn bản, thay thế chỉ trong cục dữ liệu đang hoạt động" +msgstr "Tìm kiếm trong toàn bộ các khối dữ liệu văn bản thay vì chỉ trong khối dữ liệu đang hoạt động mà thôi" msgid "Find Wrap" -msgstr "Tìm Trở Dòng" +msgstr "Đảo Chiều Tìm Kiếm" msgid "Search again from the start of the file when reaching the end" -msgstr "Tìm kiếm tiếp từ đầu tập tin khi tìm kiếm đến cuối tập tin" +msgstr "Tìm lại từ đầu tập tin sau khi đã đến cuối tập tin" msgid "Live Edit" -msgstr "Biên Tập Trực Tiếp" +msgstr "Biên Soạn Trực Tuyến" + + +msgid "Run Python while editing" +msgstr "Chạy Python trong khi đang biên soạn" msgid "Match Case" -msgstr "Tìm Tùy Kiểu Chữ" +msgstr "Khớp Kiểu Chữ" msgid "Search string is sensitive to uppercase and lowercase letters" -msgstr "Tìm xâu theo kiểu chữ hoa hay chữ thường" +msgstr "Việc lùng tìm chuỗi ký tự phải mẫn cảm với loại chữ là chữ hoa hay chữ thường" msgid "Overwrite characters when typing rather than inserting them" -msgstr "Ghi lên ký tự khi gõ chữ mới thay thế chèn ký tự mới vào" +msgstr "Viết đè lên các ký tự khi đánh máy chữ thay vì chèn thêm chúng vào" msgid "Visible Lines" -msgstr "Dòng Hiển Thị" +msgstr "Số Dòng Nhìn Thấy được" msgid "Amount of lines that can be visible in current editor" -msgstr "Số lượng dòng có thể hiển thị một lượt trong trình biên soạn hiện tại" +msgstr "Số lượng dòng có thể nhìn thấy được trong trình biên soạn hiện tại" msgid "3D View Space" -msgstr "Không Gian Màn 3D" +msgstr "Không Gian Khung Nhìn 3D" msgid "3D View space data" -msgstr "Dữ liệu không của Màn 3D" +msgstr "Dữ liệu không gian của Khung Nhìn 3D" msgid "Active camera used in this view (when unlocked from the scene's active camera)" -msgstr "Máy quay phim hoạt động cho màn này (khi mở khóa từ máy quay phim hoạt động của cảnh)" +msgstr "Máy quay phim đang hoạt động trong góc nhìn này (khi không đặt là máy quay phim đang hoạt động của cảnh nữa)" msgid "3D View far clipping distance" -msgstr "Khoảng cách cắt xa cho Màn 3D" +msgstr "Điểm cuối của tầm nhìn trong Khung Nhìn 3D" msgid "3D View near clipping distance (perspective view only)" -msgstr "Khoảng cách cắt gần cho Màn 3D (chỉ cho phép chiếu phối cảnh)" +msgstr "Điểm đầu của tầm nhìn trong Khung Nhìn 3D (duy góc nhìn phối cảnh mà thôi)" msgid "Visibility Icon" -msgstr "Biểu Tượng Hiển Thị" +msgstr "Biểu Tượng Tính Hữu Hình" msgid "Lens" -msgstr "Kính Thấu" +msgstr "Lăng Kính" msgid "Viewport lens angle" -msgstr "Góc Thấu Kính Màn Chiếu" +msgstr "Góc độ thấu kính của cổng nhìn" msgid "Display an isolated subset of objects, apart from the scene visibility" -msgstr "Hiển thị một hạ tập hợp vật thể cô lập, không thuộc sự hiển thị của cảnh" +msgstr "Hiển thị tập hợp nhỏ của đối tượng biệt lập, ngoại trừ tầm nhìn trong cảnh là thế nào" msgid "Lock to Bone" -msgstr "Khóa Với Xương" +msgstr "Chốt vào Xương" msgid "3D View center is locked to this bone's position" -msgstr "Trung tâm Màn 3D bị khóa đến vị trí xương này" +msgstr "Trung tâm Góc Nhìn 3D được chốt vào vị trí này của xương" msgid "Lock Camera to View" -msgstr "Khóa Máy Quy Phim Trong Màn" +msgstr "Chốt Máy Quay vào Góc Nhìn" msgid "Enable view navigation within the camera view" -msgstr "Bật chuyển hướng màn trong màn của máy quay phim" +msgstr "Cho phép điều hướng góc nhìn trong máy quay phim" msgid "Lock to Cursor" -msgstr "Khóa Với Con Trỏ" +msgstr "Chốt vào Con Trỏ" msgid "3D View center is locked to the cursor's position" -msgstr "Trung tâm Màn 3D bị khóa đến vị trí con trỏ" +msgstr "Trung tâm khung nhìn 3D được chốt vào vị trí con trỏ" msgid "Lock to Object" -msgstr "Khóa Với Vật Thể" +msgstr "Chốt vào Đối Tượng" msgid "3D View center is locked to this object's position" -msgstr "Trung tâm Màn 3D bị khóa đến vị trí vật thể này" +msgstr "Trung tâm khung nhìn 3D được chốt vào vị trí của đối tượng này" msgid "Mirror VR Session" -msgstr "Gương Phiên Chạy Sự Thật Ảo" +msgstr "Phản Ảnh Phiên Hoạt Động của VR" msgid "Synchronize the viewer perspective of virtual reality sessions with this 3D viewport" -msgstr "Đồng bộ hóa chiếu phối cảnh của người xem của phiên chạy sự thật ảo với màn chiếu 3D này" +msgstr "Đồng bộ hóa phối cảnh quan sát của phiên thực tế ảo với cổng nhìn 3D này" msgid "Settings for display of overlays in the 3D viewport" -msgstr "Cài đặt cho hiển thị các lớp che trong màn chiếu 3D" +msgstr "Những sắp đặt về hiển thị lớp vẽ lồng trong cổng nhìn 3D" msgid "3D Region" msgstr "Vùng 3D" +msgid "3D region for this space. When the space is in quad view, the camera region" +msgstr "Vùng 3D trong không gian này. Khi không gian là bốn góc nhìn, vùng máy quay phim" + + msgid "Quad View Regions" -msgstr "Vùng Tư Màn" +msgstr "Các Vùng của Bốn Góc Nhìn" msgid "3D regions (the third one defines quad view settings, the fourth one is same as 'region_3d')" -msgstr "Vùng 3D (vùng thứ ba được chỉ định cài đặt tư màn, vùng thứ tư cùng giống 'region_3d' (vùng_3d))" +msgstr "Các Vùng 3D (vùng thứ ba định nghĩa sắp đặt cho bốn góc nhìn, vùng thứ tư thì tương tự như 'region_3d' (vùng_3D))" msgid "Settings for shading in the 3D viewport" -msgstr "Cài đặt cho tô sắc trong màn chiếu 3D" +msgstr "Những sắp đặt về tô bóng trong cổng nhìn 3D" msgid "Show 3D Marker Names" -msgstr "Hiện Tên Ký Hiệu 3D" +msgstr "Hiển Thị Tên Dấu Mốc 3D" msgid "Show names for reconstructed tracks objects" -msgstr "Hiện tên cho vật thể đường vết được xây lại" +msgstr "Hiển thị tên cho các đối tượng giám sát được khôi phục lại" msgid "Show Camera Path" -msgstr "Hiện Đường Máy Quay Phim" +msgstr "Hiển Thị Đường Đi của Máy Quay Phim" msgid "Show reconstructed camera path" -msgstr "Hiện đường máy quay phim được xây đựng lại" +msgstr "Hiển thị đường đi của máy quay phim đã khôi phục lại" msgid "Show Camera Focus Distance" -msgstr "Hiện Quãng Tiêu Điểm Máy Quay Phim" +msgstr "Hiển Thị Khoảng Cách Hội Tụ của Máy Quay Phim" msgid "Gizmo to adjust camera focus distance (depends on limits display)" -msgstr "Đồ đạc để chỉnh quãng tiêu điểm của máy quay (tùy giới hạn của màn hình)" +msgstr "Gizmo để điều chỉnh khoảng cách hội tụ của máy quay phim (phụ thuộc vào các giới hạn hiển thị)" msgid "Show Camera Lens" -msgstr "Hiện Thấu Kính Máy Quay Phim" +msgstr "Hiển Thị Lăng Kính Máy Quay Phim" msgid "Gizmo to adjust camera focal length or orthographic scale" -msgstr "Đồ đạc cho chỉnh bề dài tiêu điểm của máy quay phim hay phóng to trực giao" +msgstr "Gizmo điều chỉnh tiêu cự thấu kính của máy quay phim hoặc tỷ lệ của phép chiếu trực giao" msgid "Show Empty Force Field" -msgstr "Hiện Lực Trường Rỗng" +msgstr "Hiển Thị Trường Lực Rỗng" msgid "Gizmo to adjust the force field" -msgstr "Đồ đạc để chỉnh lực trường" +msgstr "Gizmo để điều chỉnh trường lực" msgid "Show Empty Image" -msgstr "Hiện Ảnh Rỗng" +msgstr "Hiển Thị Hình Ảnh Rỗng" msgid "Gizmo to adjust image size and position" -msgstr "Đồ đạc để chỉnh khổ và vị trí ảnh" +msgstr "Gizmo để điều chỉnh kích thước hình ảnh và vị trí" msgid "Show Light Look-At" -msgstr "Hiện Đèn Xem Đến" +msgstr "Hiển Thị Nguồn Sáng Nhìn Vào" msgid "Gizmo to adjust the direction of the light" -msgstr "Đồ đạc để chỉnh hướng của đèn" +msgstr "Gizmo (công cụ) để điều chỉnh chiều hướng của ánh sáng" msgid "Show Light Size" -msgstr "Hiện Kích Cỡ Đèn" +msgstr "Hiển Thị Kích Thước Nguồn Sáng" msgid "Gizmo to adjust spot and area size" -msgstr "Đồ đạc để chỉnh kích cỡ điểm và diện tích" +msgstr "Gizmo để điều chỉnh kích thước đèn pha và đèn diện tích" msgid "Show Object Rotation" -msgstr "Hiện Xoay Vật Thể" +msgstr "Hiển Thị Sự Xoay Chiều của Đối Tượng" msgid "Gizmo to adjust rotation" -msgstr "Đồ đạc để chỉnh xoay" +msgstr "Gizmo để điều chỉnh sự xoay chiều" msgid "Show Object Scale" -msgstr "Hiện Phóng To Vật Thể" +msgstr "Hiển Thị Tỷ Lệ Đối Tượng" msgid "Gizmo to adjust scale" -msgstr "Đồ đạc để chỉnh phóng to" +msgstr "Gizmo để điều chỉnh tỷ lệ" msgid "Show Object Location" -msgstr "Hiện Vị Trí Vật Thể" +msgstr "Hiển Thị Địa Điểm của Đối Tượng" msgid "Gizmo to adjust location" -msgstr "Đồ đạc để chỉnh vị trí" +msgstr "Gizmo để điều chỉnh địa điểm" + + +msgid "Allow selection of armatures" +msgstr "Cho phép lựa chọn khung cốt" + + +msgid "Allow selection of cameras" +msgstr "Cho phép lựa chọn máy quay phim" + + +msgid "Allow selection of curves" +msgstr "Cho phép lựa chọn đường cong" + + +msgid "Allow selection of hair curves" +msgstr "Cho phép lựa chọn các đường cong tóc" + + +msgid "Allow selection of empties" +msgstr "Cho phép lựa chọn vật thể trống rỗng" + + +msgid "Allow selection of text objects" +msgstr "Cho phép lựa chọn đối tượng văn bản" + + +msgid "Allow selection of grease pencil objects" +msgstr "Cho phép lựa chọn đối tượng bút chì dầu" + + +msgid "Allow selection of lattices" +msgstr "Cho phép lựa chọn lưới rào" + + +msgid "Allow selection of lights" +msgstr "Cho phép lựa chọn đèn" + + +msgid "Allow selection of light probes" +msgstr "Cho phép lựa chọn đầu dò ánh sáng" + + +msgid "Allow selection of mesh objects" +msgstr "Cho phép lựa chọn các đối tượng khung lưới" + + +msgid "Allow selection of metaballs" +msgstr "Cho phép lựa chọn các siêu cầu" + + +msgid "Allow selection of point clouds" +msgstr "Cho phép lựa chọn các đám mây điểm" + + +msgid "Allow selection of speakers" +msgstr "Cho phép lựa chọn loa" + + +msgid "Allow selection of surfaces" +msgstr "Cho phép lựa chọn bề mặt" + + +msgid "Allow selection of volumes" +msgstr "Cho phép lựa chọn các thể tích" + + +msgid "Show armatures" +msgstr "Hiển thị khung cốt" + + +msgid "Show cameras" +msgstr "Hiển thị máy quay phim" + + +msgid "Show curves" +msgstr "Hiển thị đường cong" + + +msgid "Show hair curves" +msgstr "Hiển thị đường cong tóc" + + +msgid "Show empties" +msgstr "Hiển thị vật thể trống rỗng" + + +msgid "Show text objects" +msgstr "Hiển thị đối tượng văn bản" + + +msgid "Show lattices" +msgstr "Hiển thị lưới rào" + + +msgid "Show lights" +msgstr "Hiển thị đèn" + + +msgid "Show light probes" +msgstr "Hiển thị đầu dò ánh sáng" + + +msgid "Show metaballs" +msgstr "Hiển thị siêu cầu" + + +msgid "Show point clouds" +msgstr "Hiển thị các đám mây điểm" + + +msgid "Show speakers" +msgstr "Hiển thị loa" + + +msgid "Show surfaces" +msgstr "Hiển thị bề mặt" + + +msgid "Show volumes" +msgstr "Hiển thị thể tích" msgid "Show Reconstruction" -msgstr "Hiện Sự Xây Dựng Lại" +msgstr "Hiển Thị Sự Khôi Phục" msgid "Display reconstruction data from active movie clip" -msgstr "Hiển thị dữ liệu xây dựng lại từ đoạn phim hoạt động" +msgstr "Hiển thị dữ liệu khôi phục từ đoạn phim đang hoạt động" msgid "Show the left and right cameras" -msgstr "Hiện máy quay phim trái và phải" +msgstr "Hiển thị máy quay phim trái và phải" msgid "Show the stereo 3D convergence plane" -msgstr "Hiện mặt phẳng hội tụ 3D kiểu nhị kênh" +msgstr "Hiển thị bình diện hội tụ 3D lập thể" msgid "Show the stereo 3D frustum volume" -msgstr "Hiện thể tích hình cụt 3D kiểu nhị kênh" +msgstr "Hiển thị thể tích hình cụt 3D lập thể" + + +msgid "Show Viewer" +msgstr "Hiển Thị Quan Sát" + + +msgid "Display non-final geometry from viewer nodes" +msgstr "Hiển thị hình học chưa kết thúc từ các nút quan sát" msgid "3D" @@ -90675,19 +99713,19 @@ msgstr "3D" msgid "Plane Alpha" -msgstr "Độ Đục Mặt Phẳng" +msgstr "Alpha của Bình Diện" msgid "Opacity (alpha) of the convergence plane" -msgstr "Độ đục của mặt phằng hội tụ" +msgstr "Độ đục (alpha) của bình diện hội tụ" msgid "Stereo Eye" -msgstr "Mắt Nhị Kênh" +msgstr "Mắt Lập Thể" msgid "Current stereo eye being displayed" -msgstr "Mắt nhị kênh hiện tại đang hiển thị" +msgstr "Mắt lập thể hiện tại đang được hiển thị" msgid "Left Eye" @@ -90699,47 +99737,47 @@ msgstr "Mắt Phải" msgid "Volume Alpha" -msgstr "Độ Đục Thể Tích" +msgstr "Alpha của Thể Tích" msgid "Opacity (alpha) of the cameras' frustum volume" -msgstr "Độ đục của thể tích hình cụt của các máy quay phim" +msgstr "Độ đục (alpha) cho thể tích hình cụt của các máy quay phim" msgid "Tracks Size" -msgstr "Kích Cỡ Đường Vết" +msgstr "Kích Thước Giám Sát" msgid "Display size of tracks from reconstructed data" -msgstr "Kích cỡ hiển thi của đường vết từ dữ liệu được xây đựng lại" +msgstr "Hiển thị kích thước của dấu giám sát từ dữ liệu khôi phục lại" msgid "Tracks Display Type" -msgstr "Kiểu Hiển Thị Đường Vết" +msgstr "Kiểu Hiển Thị Giám Sát" msgid "Viewport display style for tracks" -msgstr "Phong cách hiển thị đường vết trong màn chiếu" +msgstr "Phong cách hiển thị các dấu giám sát trong cổng nhìn" msgid "Use Local Camera" -msgstr "Dùng Máy Quay Phim Địa Phương" +msgstr "Sử Dụng Máy Quay Phim Cục Bộ" msgid "Use a local camera in this view, rather than scene's active camera" -msgstr "Dùng một máy quay phim địa phương trong màn này, thay thế máy quay phim hoạt động của cảnh" +msgstr "Sử dụng máy quay phim địa phương trong góc nhìn này, hơn là sử dụng máy quay phim đang hoạt động của cảnh" msgid "Local Collections" -msgstr "Sưu Tập Địa Phương" +msgstr "Bộ Sưu Tập Cục Bộ" msgid "Display a different set of collections in this viewport" -msgstr "Hiển thị một tập sưu tập khác trong màn chiếu này" +msgstr "Hiển thị một bộ bộ sưu tập khác trong cổng nhìn này" msgid "Use a region within the frame size for rendered viewport (when not viewing through the camera)" -msgstr "Dùng một vùng trong khổ khung cho màn chiếu được kết xuất (khi không xem qua máy quay phim)" +msgstr "Sử dụng một vùng nội trong kích thước khung hình cho cổng nhìn kết xuất (khi không quan sát qua máy quay phim)" msgid "Display Background" @@ -90747,167 +99785,253 @@ msgstr "Hiển Thị Nền" msgid "Show the grid background and borders" -msgstr "Hiện nền đồ thị và ranh giới" +msgstr "Hiển thị nền khung lưới đồ thị và đường viền ranh giới" msgid "Display overlays like UV Maps and Metadata" -msgstr "Hiển thị lớp che trên như Bản Đồ UV va Siêu Dữ Liệu" +msgstr "Hiển thị các lớp vẽ lồng, như các Ánh Xạ UV và Siêu Dữ Liệu" msgid "Get the node tree path as a string" -msgstr "Lấy xâu ký tự của đường dẫn cây giao điểm" +msgstr "Lấy đường dẫn cây nút như một chuỗi ký tự" + + +msgid "Preview Shape" +msgstr "Xem Trước Hình Dạng" + + +msgid "Preview shape used by the node previews" +msgstr "Hình dạng xem trước được sử dụng bởi các bản xem trước của nút" + + +msgid "Use the default flat previews" +msgstr "Sử dụng bản xem trước phẳng mặc định" + + +msgid "Use the material preview scene for the node previews" +msgstr "Sử dụng cảnh xem trước nguyên vật liệu để xem trước nút" msgid "Show Tree Path" -msgstr "Hiện Đường Vết Cây" +msgstr "Hiển Thị Đường Dẫn Cây" msgid "Display breadcrumbs for the editor's context" -msgstr "Hiển thị bụi cho bối cảnh của trình biên soạn" +msgstr "Hiển thị đường dẫn cho ngữ cảnh của trình biên soạn" msgid "Show Named Attributes" -msgstr "Hiển Thị Đặc Điểm Có Tên" +msgstr "Hiển Thị các Thuộc Tính được Đặt Tên" msgid "Show when nodes are using named attributes" -msgstr "Hiện khi giao điểm đang dùng đặc điểm có tên" +msgstr "Hiển thị khi các nút đang sử dụng các thuộc tính được đặt tên" msgid "Display overlays like colored or dashed wires" -msgstr "Hiển thị lớp che kiểu sợi dây màu hoặc gạch ngang" +msgstr "Hiển thị các lớp vẽ lồng, như các dây tô màu hoặc các gạch ngang" + + +msgid "Show Node Previews" +msgstr "Hiển Thị Xem Trước Nút" + + +msgid "Display each node's preview if node is toggled" +msgstr "Hiển thị bản xem trước của mỗi nút nếu nút được bật" msgid "Show Timing" -msgstr "Hiện Thời Tự" +msgstr "Hiển Thị Thời Gian" msgid "Display each node's last execution time" -msgstr "Hiển thị thời gian thị thực cuối cùng cho mỗi giao điểm" +msgstr "Hiển thị thời gian thực hiện sau cùng của mỗi nút" msgid "Show Wire Colors" -msgstr "Hiện Màu Sợi Dây" +msgstr "Hiển Thị Màu của Dây" msgid "Color node links based on their connected sockets" -msgstr "Liên kết giao điểm màu tùy ổ cắm được kết nối của chúng nó" +msgstr "Tô màu liên kết của nút dựa trên các ổ cắm được kết nối của chúng" msgid "Space UV Editor" -msgstr "Trình Biên Soạn UV Không Gian" +msgstr "Không Gian Trình Biên Soạn UV" msgid "UV editor data for the image editor space" -msgstr "Dữ liệu biên soạn UV của không gian trình biên soạn ảnh" +msgstr "Dữ liệu trình biên soạn UV cho không gian của trình biên soạn ảnh" msgid "Dynamic Grid Size" -msgstr "Kích Thước Đồ Thị Động Lý" +msgstr "Năng Động Đổi Kích Thước Khung Lưới Đồ Thị" msgid "Number of grid units in UV space that make one UV Unit" -msgstr "Số lượng đơn vị đồ thị trong không gian UV được góp thành một Đơn Vị UV" +msgstr "Số đơn vị khung lưới đồ thị trong không gian UV tạo ra một đơn vị UV" + + +msgctxt "Mesh" +msgid "Display Stretch Type" +msgstr "Hiển Thị Thể Loại Kéo Giãn" msgid "Type of stretch to display" -msgstr "Loại kiểu kéo để hiển thị" +msgstr "Thể loại kéo giãn để hiển thị" + + +msgctxt "Mesh" +msgid "Angle" +msgstr "Góc Độ" msgid "Angular distortion between UV and 3D angles" -msgstr "Méo hóa góc giữa UV và góc 3D" +msgstr "Biến dạng của góc giữa UV và các góc 3D" msgid "Area distortion between UV and 3D faces" -msgstr "Méo hóa diện tích giữa mặt UV va 3D" +msgstr "Biến dạng của diện tích/khu vực giữa UV và các mặt 3D" msgid "Display style for UV edges" -msgstr "Hiển thị phong cách cho cạnh UV" +msgstr "Kiểu hiển thị cho các cạnh UV" + + +msgid "Grid Shape Source" +msgstr "Nguồn Hình Dạng Khung Lưới" + + +msgid "Specify source for the grid shape" +msgstr "Xác định nguồn cho hình dạng khung lưới đồ thị" + + +msgid "Dynamic grid" +msgstr "Khung lưới khung lưới đồ thị năng động" + + +msgid "Manually set grid divisions" +msgstr "Đặt phân chia khung lưới đồ thị một cách thủ công" + + +msgid "Grid aligns with pixels from image" +msgstr "Khung lưới đồ thị căn chỉnh với các điểm ảnh từ hình ảnh" msgid "Constrain to Image Bounds" -msgstr "Hạn Chế đến Trong Ranh Giới Ảnh" +msgstr "Hạn Chế trong Ranh Giới của Hình Ảnh" msgid "Constraint to stay within the image bounds while editing" -msgstr "Hạn chế ở trong ranh giới ảnh khi đang biên tập" +msgstr "Trong khi biên soạn, hạn chế để chỉ nằm trong ranh giới của hình ảnh mà thôi" + + +msgid "Round to Pixels" +msgstr "Làm Tròn về Điểm Ảnh" + + +msgid "Round UVs to pixels while editing" +msgstr "Làm tròn UV về điểm ảnh trong khi chỉnh sửa" + + +msgid "Don't round to pixels" +msgstr "Không làm tròn về điểm ảnh" + + +msgid "Round to pixel corners" +msgstr "Làm tròn về các góc điểm ảnh" + + +msgid "Round to pixel centers" +msgstr "Làm tròn về trung tâm điểm ảnh" msgid "Display Faces" -msgstr "Hiển Thị Mặt" +msgstr "Hiển Thị Các Mặt" msgid "Display faces over the image" -msgstr "Hiển thị các mặt trên ảnh" +msgstr "Hiển thị các mặt trên hình ảnh" + + +msgid "Grid Over Image" +msgstr "Khung Lưới Đồ Thị Trên Hình Ảnh" + + +msgid "Show the grid over the image" +msgstr "Hiển thị khung lưới đồ thị trên hình ảnh" msgid "Display metadata properties of the image" -msgstr "Hiển thị đặc tính siêu dữ liệu của ảnh" +msgstr "Hiển thị tính chất siêu dữ liệu của hình ảnh" msgid "Display Modified Edges" -msgstr "Hiển Thị Cạnh Được Sửa Đổi" +msgstr "Hiển Thị Cạnh đã được Sửa Đổi" msgid "Display edges after modifiers are applied" -msgstr "Hiển thị cạnh sau áp dụng bộ điều chỉnh" +msgstr "Hiển thị các cạnh sau khi các bộ điều chỉnh đã được áp dụng" msgid "Pixel Coordinates" -msgstr "Tọa Độ Điểm Ảnh" +msgstr "Tọa Độ của Điểm Ảnh" msgid "Display UV coordinates in pixels rather than from 0.0 to 1.0" -msgstr "Hiển thị tọa độ UV bằng điểm ảnh thay giá trị 0.0 đến 1.0" +msgstr "Hiển thị tọa độ UV trong đơn vị điểm ảnh, thay vì là từ 0.0 đến 1.0" msgid "Display Stretch" -msgstr "Hiển Thị Kéo Ra" +msgstr "Hiển Thị Sự Kéo Giãn" msgid "Display faces colored according to the difference in shape between UVs and their 3D coordinates (blue for low distortion, red for high distortion)" -msgstr "Hiển thị mặt được tô màu tùy chênh lệch hình dạng giữa UV và tọa độ 3D của chúng nó (xanh méo hóa thấp, đỏ méo hóa cao)" +msgstr "Hiển thị các mặt, với màu tô, chiểu theo sự khác biệt về hình dạng giữa UV và tọa độ 3D của chúng (màu xanh lam biểu đạt sự biến dạng ít, màu đỏ biểu đạt sự biến dạng nhiều)" msgid "Display Texture Paint UVs" -msgstr "Hiển Thị UV Sơn Chất Liệu " +msgstr "Hiển Thị UV Sơn Chất Liệu" + + +msgid "Display overlay of texture paint UV layer" +msgstr "Hiển thị lớp vẽ lồng của tầng UV sơn chất liệu" msgid "Tile Grid Shape" -msgstr "Hình Dạng Đồ Thị Ô" +msgstr "Hình Dạng của Khung Lưới Đồ Thị Ô Cờ" msgid "How many tiles will be shown in the background" -msgstr "Số lượng ô sẽ được hiện trong nền" +msgstr "Số ô sẽ hiển thị trên nền" msgid "Live Unwrap" -msgstr "Mở Gói Trực Tiếp" +msgstr "Mở Gói Trực Tuyến" msgid "Continuously unwrap the selected UV island while transforming pinned vertices" -msgstr "Liên tiếp mở gói đảo UV được chọn khi biến hóa các đỉnh được đóng đinh" +msgstr "Liên tiếp mở gói hải đảo UV được chọn trong khi biến hóa các điểm đỉnh bị ghim xuống" msgid "UV Opacity" -msgstr "Độ Đục UV" +msgstr "Độ Đục của UV" msgid "Opacity of UV overlays" -msgstr "Độ đục của lớp che trên UV" +msgstr "Độ đục của lớp vẽ UV phủ chồng lên" msgid "Element of a curve, either NURBS, Bezier or Polyline or a character with text objects" -msgstr "Phần tử của một đường cong, NURBS, Bezier, đường đa điểm hay nhân vật có vật thể văn bản" +msgstr "Phần tử của một đường cong, hoặc là NURBS (Non-uniform rational basis spline), Bézier, Polyline (nhiều đường/nét), hoặc là ký tự trong đối tượng văn bản" msgid "Bezier Points" -msgstr "Các Điểm Bezier" +msgstr "Các Điểm của Bézier" msgid "Collection of points for Bezier curves only" -msgstr "Sưu tập điểm chỉ cho cong Beizer" +msgstr "Bộ sưu tập điểm cho duy các đường cong Bézier mà thôi" msgid "Character Index" @@ -90915,135 +100039,147 @@ msgstr "Chỉ Số Ký Tự" msgid "Location of this character in the text data (only for text curves)" -msgstr "Vị trí của ký tự này trong dữ liệu văn bản (chỉ cho đường cong văn bản" +msgstr "Vị trí của ký tự này trong dữ liệu văn bản (chỉ dành cho các đường cong văn bản" msgid "Hide this curve in Edit mode" -msgstr "Ẩn đường cong này trong chế độ Biên Tập" +msgstr "Ẩn giấu đường cong này trong Chế Độ Biên Soạn" msgid "Material slot index of this curve" -msgstr "Chỉ số khe vật liệu của đường coong này" +msgstr "Chỉ số khe nguyên vật liệu của đường cong này" msgid "Order U" -msgstr "Bậc U" +msgstr "Bậc chiều U" + + +msgid "NURBS order in the U direction. Higher values make each point influence a greater area, but have worse performance" +msgstr "Bậc của NURBS theo hướng U. Giá trị cao hơn làm cho mỗi điểm ảnh hưởng đến một khu vực lớn hơn, song có hiệu suất hoạt động kém hơn" msgid "Order V" -msgstr "Bậc V" +msgstr "Bậc chiều V" + + +msgid "NURBS order in the V direction. Higher values make each point influence a greater area, but have worse performance" +msgstr "Bậc của NURBS theo hướng V. Giá trị cao hơn làm cho mỗi điểm ảnh hưởng đến một khu vực lớn hơn, song có hiệu suất hoạt động kém hơn" msgid "Points U" -msgstr "Điểm U" +msgstr "Số Điểm U" msgid "Total number points for the curve or surface in the U direction" -msgstr "Tổng cộng số lượng điểm cho đường cong hay bề mặt hướng U" +msgstr "Tổng cộng số lượng điểm cho đường cong hoặc bề mặt trên hướng U" msgid "Points V" -msgstr "Điểm V" +msgstr "Số Điểm V" msgid "Total number points for the surface on the V direction" -msgstr "Tổng cộng số lượng điểm cho đường cong hay bề mặt hướng V" +msgstr "Tổng cộng số lượng điểm cho bề mặt trên hướng V" msgid "Collection of points that make up this poly or nurbs spline" -msgstr "Sưu tập điểm của mẫu cong đường đa điểm hay mẫu cong NURBS này" +msgstr "Bộ sưu tập của các điểm tạo nên chốt trục hoặc chốt trục nurbs này" msgid "Radius Interpolation" -msgstr "Suy Nội Bán Kính" +msgstr "Nội Suy Bán Kính" msgid "The type of radius interpolation for Bezier curves" -msgstr "Loại suy nội cho cong Bezier" +msgstr "Kiểu nội suy bán kính cho đường cong Bezier" msgid "Curve or Surface subdivisions per segment" -msgstr "Số lượng phân hóa Đường Cong hay Bề Mặt cho mỗi khúc" +msgstr "Lượng phân hóa của Đường Cong hay Bề Mặt cho mỗi phân đoạn" msgid "Surface subdivisions per segment" -msgstr "Số lượng phân hóa bề mặt cho mỗi khúc" +msgstr "Lượng phân hóa bề mặt cho mỗi phân đoạn" msgid "Tilt Interpolation" -msgstr "Suy Nội Nghiêng" +msgstr "Nội Suy Xoay Nghiêng" msgid "The type of tilt interpolation for 3D, Bezier curves" -msgstr "Loại suy nội nghiêng cho đường cong 3D, cong Bezier" +msgstr "Kiểu nội suy xoay nghiêng cho đường cong 3D, Bézier" msgid "The interpolation type for this curve element" -msgstr "Loại suy nội cho phần tử đường cong này" +msgstr "Kiểu nội suy cho yếu tố này của đường cong" msgid "Bezier U" -msgstr "Bezier U" +msgstr "Bézier U" msgid "Make this nurbs curve or surface act like a Bezier spline in the U direction" -msgstr "Làm đường cong hay bề mặt NURBS này hoạt động giống một mẫu cong Bezier cho hướng U" +msgstr "Bắt đường cong nurbs và bê mặt này hành động giống như một đường cong Bezier trong hướng U" msgid "Bezier V" -msgstr "Bezier V" +msgstr "Bézier V" msgid "Make this nurbs surface act like a Bezier spline in the V direction" -msgstr "Làm bề mặt NURBS này hoạt động giống một mẫu cong Bezier cho hướng V" +msgstr "Bắt bề mặt nurbs này hành động giống như một chốt trục Bezier trong hướng V" msgid "Make this curve or surface a closed loop in the U direction" -msgstr "Làm đường cong hay bề mặt này thành vòng đóng cho hướng U" +msgstr "Bắt đường cong hoặc bề mặt này tuần hoàn trên hướng U" msgid "Make this surface a closed loop in the V direction" -msgstr "Làm đường cong hay bề mặt này thành vòng đóng cho hướng V" +msgstr "Bắt bề mặt này tuần hoàn trên hướng V" msgid "Endpoint U" -msgstr "Điểm Kết Thúc U" +msgstr "Điểm Kết U" msgid "Make this nurbs curve or surface meet the endpoints in the U direction" -msgstr "Nối các điểm kết thúc của đường cong hay bề mặt NURBS cho hướng U (phải tắt Chu Trình U)" +msgstr "Bắt bề mặt nurbs này khớp với các điểm kết trong hướng U" msgid "Endpoint V" -msgstr "Điểm Kết Thúc V" +msgstr "Điểm Kết V" + + +msgid "Make this nurbs surface meet the endpoints in the V direction" +msgstr "Bắt các bề mặt nurb này khớp với các điểm kết trong hướng V" msgid "Smooth the normals of the surface or beveled curve" -msgstr "Mịn hóa pháp tuyến của bề mặt hay đường cong được cạnh tròn" +msgstr "Làm mịn pháp tuyến của bề mặt hoặc đường cong được bo tròn" msgid "Spline Bezier Points" -msgstr "Điểm Bezier Mẫu Cong" +msgstr "Điểm của Chốt Trục Bézier" msgid "Collection of spline Bezier points" -msgstr "Sưu tập của điểm Bezier mẫu cong" +msgstr "Bộ sưu tập các của điểm chốt trục Bézier" msgid "Spline point without handles" -msgstr "Điểm mẫu cong không có tay cầm" +msgstr "Điểm của chốt trục không có tay cầm" msgid "NURBS weight" -msgstr "Quyền lượng NURBS" +msgstr "Trọng lượng NURBS" msgid "Spline Points" -msgstr "Điểm Mẫu Cong" +msgstr "Điểm của Chốt Trục" msgid "Collection of spline points" -msgstr "Sưu tập điểm mẫu cong" +msgstr "Bộ sưu tập các điểm chốt trục" msgid "Spreadsheet Column" @@ -91051,7 +100187,7 @@ msgstr "Cột Bảng Tính" msgid "Persistent data associated with a spreadsheet column" -msgstr "Dữ liệu cố chấp liên quan một cột bảng tính" +msgstr "Dữ liệu ổn định liên quan đến một cột bảng tính nào đó" msgid "The data type of the corresponding column visible in the spreadsheet" @@ -91075,27 +100211,27 @@ msgstr "Tên Cột" msgid "Spreadsheet Row Filter" -msgstr "Bộ Lọc Hàng Bảng Tính" +msgstr "Thanh Lọc Hàng của Bảng Tính" msgid "How close float values need to be to be equal" -msgstr "Chênh lệch cho chấp nhận hai giá trị dấu phẩy động là bằng nhau" +msgstr "Giá trị số thực xấp xỉ là bao nhiêu để được cho là bằng nhau" msgid "Boolean Value" -msgstr "Giá Trị Bool" +msgstr "Giá Trị Boolean" msgid "Float Value" -msgstr "Giá Trị Dấu Phẩy Động" +msgstr "Giá Trị Số Thực" msgid "2D Vector Value" -msgstr "Giá Trị Vectơ 2D" +msgstr "Giá Trị Véctơ 2D" msgid "Vector Value" -msgstr "Giá Trị Vectơ" +msgstr "Giá Trị Véctơ" msgid "Integer Value" @@ -91111,91 +100247,106 @@ msgstr "Giá Trị Văn Bản" msgid "Stereo 3D Display" -msgstr "Hiển Thị 3D Nhị Kênh" +msgstr "Hiển Thị 3D Lập Thể" msgid "Settings for stereo 3D display" -msgstr "Cài đặt cho hiển thị 3D nhị kênh" +msgstr "Sắp đặt cho hiển thị 3D lập thể" msgid "Stereo Output" -msgstr "Ngõ Ra Nhị Kênh" +msgstr "Đầu Ra Lập Thể" msgid "Settings for stereo output" -msgstr "Cài đặt cho ngõ ra nhị kênh" +msgstr "Sắp đặt cho đầu ra lập thể" msgid "Stereo Mode" -msgstr "Chế Độ Nhị Kênh" +msgstr "Chế Độ Lập Thể" msgid "Squeezed Frame" -msgstr "Bức Ảnh Ép" +msgstr "Khung Hình Bị Bóp Nén" msgid "Combine both views in a squeezed image" -msgstr "Gồm cả hai màn trong một ảnh ép" +msgstr "Kết hợp hai góc nhìn thành một hình ảnh bị bóp nén" msgid "String Attribute Value" -msgstr "Giá Trị Đặc Điểm Xâu" +msgstr "Giá trị Thuộc Tính String" msgid "String value in geometry attribute" -msgstr "Giá trị xâu trong đặc điểm hình dạng" +msgstr "Giá trị String (chuỗi ký tự) trong thuộc tính hình học" msgid "Studio Light" -msgstr "Đèn Xưởng" +msgstr "Ánh Sáng Studio" msgid "Studio light" -msgstr "Đèn xưởng" +msgstr "Ánh sáng studio" msgid "Has Specular Highlight" -msgstr "Có Cao Quang Bóng Loáng" +msgstr "Có Điểm Nhấn Lóng Lánh" msgid "Studio light image file has separate \"diffuse\" and \"specular\" passes" -msgstr "Ảnh ánh sáng xưởng có vòng \"tán xạ\" và \"cao quang\" riêng nhau" +msgstr "Tập tin hình ảnh của bố trí ánh sáng studio có các lượt \"khuếch xạ\" và \"lóng lánh\" riêng biệt" msgid "Irradiance Cache Path" -msgstr "Đường Dẵn Đệm Chứa Sự Rọi" +msgstr "Đường Dẫn của Bộ Đệm Nhớ về Sự Tỏa Sáng" msgid "Path where the irradiance cache is stored" -msgstr "Đường dẫn đến chỗ giữ đệm chứa sự rọi" +msgstr "Đường dẫn đến bộ đệm nhớ lưu sự chiếu sáng" msgid "SH Cache Path" -msgstr "Đường Dẫn Đệm Chứa Giao Động Hình Cầu" +msgstr "Đường Dẫn của Bộ Đệm Nhớ SH" msgid "Path where the spherical harmonics cache is stored" -msgstr "Dương dẫn đến chỗ đệm chứa giao động hình cầu" +msgstr "Đường dẫn đến bộ đệm nhớ lưu kết quả của hàm điều hòa cầu (Spherical Harmonics, viết tắt SH)" msgid "Lights user to display objects in solid draw mode" -msgstr "Đèn dùng cho hiển thị vật thể trong chế độ vẽ rắn" +msgstr "Nguồn ánh sáng dùng để hiển thị các đối tượng trong chế độ vẽ khối lập thể" + + +msgctxt "Light" +msgid "World" +msgstr "Thế Giới" msgid "Collection of studio lights" -msgstr "Sưu tập đèn ánh sáng xưởng" +msgstr "Bộ Sưu Tập các Bố Trí Ánh Sáng Studio" + + +msgctxt "Image" +msgid "Mapping" +msgstr "Ánh Xạ" msgid "Map X and Y coordinates directly" -msgstr "Ánh xạ tọa độ X và Y trực tiếp" +msgstr "Ánh xạ tọa độ X và Y trực tiếp" + + +msgctxt "Image" +msgid "Cube" +msgstr "Khối Lập Phương" msgid "Map using the normal vector" -msgstr "Ánh xạ bằng pháp tuyến" +msgstr "Ánh xạ dùng vectơ pháp tuyến" msgid "Map with Z as central axis" -msgstr "Ánh xạ dùng trục Z làm trục trung ương" +msgstr "Ánh xạ dùng trục Z làm trục tâm" msgid "X Mapping" @@ -91211,27 +100362,27 @@ msgstr "Ánh Xạ Z" msgid "Maximum value for clipping" -msgstr "Giá trị cực đại để cắt" +msgstr "Giá trị tối đa cho quá trình cắt xén" msgid "Minimum value for clipping" -msgstr "Giá trị cực tiểu để cắt" +msgstr "Giá trị tối thiểu cho quá trình cắt xén" msgid "Has Maximum" -msgstr "Có Cực Đại" +msgstr "Có Tối Đa" msgid "Whether to use maximum clipping value" -msgstr "Chọn dùng giá trị cực đại để cắt" +msgstr "Có sử dụng giá trị cắt xén tối đa hay không" msgid "Has Minimum" -msgstr "Có Cực Tiểu" +msgstr "Có Tối Thiểu" msgid "Whether to use minimum clipping value" -msgstr "Chọn dùng giá trị cực tiểu để cắt" +msgstr "Có sử dụng giá trị cắt xén tối thiểu hay không" msgid "Texture Paint Slot" @@ -91239,7 +100390,7 @@ msgstr "Khe Sơn Chất Liệu" msgid "Slot that contains information about texture painting" -msgstr "Khe có thông tin về sơn chất liệu" +msgstr "Khe chứa thông tin về quá trình sơn chất liệu" msgid "Icon" @@ -91247,11 +100398,11 @@ msgstr "Biểu Tượng" msgid "Paint slot icon" -msgstr "Biểu tượng khe sơn" +msgstr "Biểu tượng khe Sơn" msgid "Slot has a valid image and UV map" -msgstr "Khe có một ảnh và bản đồ UV hợp lệ" +msgstr "Khe có một hình ảnh và ánh xạ UV hợp lệ" msgid "Name of the slot" @@ -91263,63 +100414,63 @@ msgstr "Hộp Văn Bản" msgid "Text bounding box for layout" -msgstr "Hộp bao quanh cho bố trí" +msgstr "Khung hộp viền văn bản trong bố trí" msgid "Textbox Height" -msgstr "Bề Cao Hộp Văn Bản" +msgstr "Chiều Cao Hộp Văn Bản" msgid "Textbox Width" -msgstr "Bề Rộng Hộp Văn Bản" +msgstr "Chiều Rộng Hộp Văn Bản" msgid "Textbox X Offset" -msgstr "Dịch X Hộp Văn Bản" +msgstr "Dịch Chuyển X của Hộp Văn Bản" msgid "Textbox Y Offset" -msgstr "Dịch Y Hộp Văn Bản" +msgstr "Dịch Chuyển Y của Hộp Văn Bản" msgid "Text Character Format" -msgstr "Định Dạng Ký Tự Văn Bản" +msgstr "Định Dạng Ký Tự" msgid "Text character formatting settings" -msgstr "Cài đặt cho định dạng ký tự văn bản" +msgstr "Sắp đặt về định dạng của ký tự" msgid "Spacing between characters" -msgstr "Cách giữa ký tự" +msgstr "Chỉnh phân khoảng giữa các ký tự" msgid "Material slot index of this character" -msgstr "Chỉ số khe vật liệu của ký tự này" +msgstr "Chỉ số khe nguyên vật liệu của ký tự này" msgid "Text Line" -msgstr "Dòng Văn Bản" +msgstr "Dòng Chữ" msgid "Line of text in a Text data-block" -msgstr "Dòng văn bản trong một cục dữ liệu Văn Bản" +msgstr "Dòng chữ trong một khối dữ liệu Văn Bản" msgid "Texture slot defining the mapping and influence of a texture" -msgstr "Khe chất liệu được chỉ định ánh xạ va sự ảnh hưởng của một chất liệu" +msgstr "Khe chất liệu xác định ánh xạ và sự ảnh hưởng của chất liệu" msgid "Mode used to apply the texture" -msgstr "Chế độ nào cho áp dụng chất liệu" +msgstr "Chế độ sử dụng để áp dụng chất liệu" msgid "Default color for textures that don't return RGB or when RGB to intensity is enabled" -msgstr "Màu mặc định cho chất liệu không trở lại giá trị RGB hay khi được bật RGB sang cường độ" +msgstr "Màu mặc định cho chất liệu không cung cấp giá trị RGB, hoặc khi Đổi RGB sang Cường Độ" msgid "Value to use for Ref, Spec, Amb, Emit, Alpha, RayMir, TransLu and Hard" -msgstr "Dùng giá trị nào cho Phản Xạ, Cao Quang, Bao Quanh, Phát Xạ, Độ Đục, Gương Tia, Trong Suốt Mờ, và Độ Cứng" +msgstr "Giá trị sử dụng cho Phản Xạ, Lóng Lánh, Cộng Hưởng Môi Trường, Phát Xạ, Alpha, Đối Xứng Tia, Trong Mờ, và Độ Cứng" msgid "Texture slot name" @@ -91327,43 +100478,43 @@ msgstr "Tên khe chất liệu" msgid "Fine tune of the texture mapping X, Y and Z locations" -msgstr "Chỉnh sửa ánh xạ chất liệu vị trí X, Y và Z" +msgstr "Tinh chỉnh vị trí ánh xạ chất liệu X, Y và Z" msgid "Output Node" -msgstr "Giao Điểm Ngõ Ra" +msgstr "Nút Đầu Ra" msgid "Which output node to use, for node-based textures" -msgstr "Dùng giao điểm ngõ ra nào, cho chất liệu cơ sở giao đểm" +msgstr "Nút đầu ra để sử dụng, dành cho các chất liệu cơ sở nút" msgid "Set scaling for the texture's X, Y and Z sizes" -msgstr "Đặt phóng to kích cỡ X, Y và Z của chất liệu" +msgstr "Đặt tỷ lệ về kích thước X, Y và Z của chất liệu" msgid "Texture data-block used by this texture slot" -msgstr "Cục dữ lịệu văn bản khe chất liệu này được dùng" +msgstr "Khối dữ liệu của chất liệu mà khe chất liệu này sử dụng" msgid "Brush Texture Slot" -msgstr "Khe Chất Liệu Bút" +msgstr "Khe Chất Liệu của Đầu Bút" msgid "Texture slot for textures in a Brush data-block" -msgstr "Khe chất liệu cho chất liệu trong một cục dữ liệu Bút" +msgstr "Khe cho chất liệu trong một khối dữ liệu Đầu Bút" msgid "Brush texture rotation" -msgstr "Xoay chất liệu Bút" +msgstr "Xoay chiều của chất liệu đầu bút" msgid "Has Texture Angle Source" -msgstr "Có Nguồn Gốc Góc Chất Liệu" +msgstr "Nguồn có Góc Độ Chất Liệu" msgid "Stencil" -msgstr "Khuôn Tô" +msgstr "Khuôn In" msgid "Random Angle" @@ -91371,7 +100522,7 @@ msgstr "Góc Ngẫu Nhiên" msgid "Brush texture random angle" -msgstr "Góc ngẫu nhiên của chất liệu bút" +msgstr "Góc ngẫu nhiên của chất liệu đầu bút" msgid "LineStyle Texture Slot" @@ -91379,87 +100530,87 @@ msgstr "Khe Chất Liệu Phong Cách Nét" msgid "Texture slot for textures in a LineStyle data-block" -msgstr "Khe chất liệu cho các chất liệu trong một cục dữ liệu Phong Cách Nét" +msgstr "Khe cho các chất liệu trong khối dữ liệu phong cách nét" msgid "Alpha Factor" -msgstr "Hệ Số Độ Đục" +msgstr "Hệ Số Alpha" msgid "Amount texture affects alpha" -msgstr "Mức chất liệu được ảnh hướng độ đục" +msgstr "Lượng chất liệu tác động đến alpha" msgid "Diffuse Color Factor" -msgstr "Hệ Số Màu Tán Xạ" +msgstr "Hệ Số Màu Khuếch Tán" msgid "Amount texture affects diffuse color" -msgstr "Mức chất liệu được ảnh hưởng màu tán xạ" +msgstr "Lượng chất liệu tác động màu khuếch tán" msgid "Texture coordinates used to map the texture onto the background" -msgstr "Tọa độ chất liệu dùng cho ánh xạ chất liệu vào nền" +msgstr "Tọa độ chất liệu dùng để ánh xạ chất liệu vào nền" msgid "Use screen coordinates as texture coordinates" -msgstr "Dùng tọa độ màn làm tọa độ chất liệu" +msgstr "Dùng tọa độ màn hình làm tọa độ chất liệu" msgid "Use global coordinates for the texture coordinates" -msgstr "Dùng tọa độ toàn cầu cho tọa độ chất liệu" +msgstr "Dùng tọa độ toàn cầu làm tọa độ chất liệu" msgid "Along stroke" -msgstr "Theo đường nét" +msgstr "Dọc theo đường nét" msgid "Use stroke length for texture coordinates" -msgstr "Dùng bề dài nét cho tọa độ chất liệu" +msgstr "Dùng chiều dài nét cho tọa độ chất liệu" msgid "Use the original undeformed coordinates of the object" -msgstr "Dùng tọa độ ban đầu không bị méo hóa của vật thể" +msgstr "Dùng tọa độ không bị biến dạng nguyên thủy của đối tượng" msgid "The texture affects the alpha value" -msgstr "Chất liệu được ảnh hưởng giá trị độ đục" +msgstr "Chất liệu tác động giá trị alpha" msgid "The texture affects basic color of the stroke" -msgstr "Chất liệu được ảnh hưởng màu cơ bản của nét" +msgstr "Chất liệu tác động màu cơ bản của nét" msgid "Particle Settings Texture Slot" -msgstr "Khe Chất Liệu Cài Đặt Hạt" +msgstr "Khe Chất Liệu Sắp Đặt Hạt" msgid "Texture slot for textures in a Particle Settings data-block" -msgstr "Khe chất liệu cho các chất liệu trong một cục dữ liệu Cài Đặt Hạt" +msgstr "Khe chất liệu cho các chất liệu trong một khối dữ liệu Sắp Đặt Hạt" msgid "Clump Factor" -msgstr "Hệ Số Bó" +msgstr "Hệ Số Khóm" msgid "Amount texture affects child clump" -msgstr "Mức chất liệu được ảnh hưởng bó lại của con cái" +msgstr "Lượng chất liệu ảnh hưởng độ kết khối của con" msgid "Damp Factor" -msgstr "Hệ Số Tắt Dần" +msgstr "Hệ Số Suy Giảm" msgid "Amount texture affects particle damping" -msgstr "Mức chất liệu được ảnh hưởng tắt dần hạt" +msgstr "Lượng chất liệu tác động sự suy giảm của hạt" msgid "Density Factor" -msgstr "Hệ Số Tỉ Trọng" +msgstr "Hệ Số Tỷ Trọng" msgid "Amount texture affects particle density" -msgstr "Lượng chất liệu được ảnh hưởng mật độ hạt" +msgstr "Lượng chất liệu ảnh hưởng mật độ của hạt" msgid "Field Factor" @@ -91467,39 +100618,39 @@ msgstr "Hệ Số Trường" msgid "Amount texture affects particle force fields" -msgstr "Mức chất liệu được ảnh hưởng lực trường hạt" +msgstr "Lượng chất liệu ảnh hưởng trường lực của hạt" msgid "Gravity Factor" -msgstr "Hệ Số Hấp Dẫn" +msgstr "Hệ Số Trọng Lực" msgid "Amount texture affects particle gravity" -msgstr "Mức chất liệu được ảnh hưởng hấp dẫn của hạt" +msgstr "Lượng chất liệu ảnh hưởng trọng lực của hạt" msgid "Kink Amplitude Factor" -msgstr "Hệ Số Biên Độ Thắt Nút" +msgstr "Hệ Số Biên Độ Xoắn Vặn" msgid "Amount texture affects child kink amplitude" -msgstr "Mức chất liệu được ảnh hưởng biên độ độ thắt nút của con cái" +msgstr "Lượng chất liệu ảnh hưởng biên độ xoắn vặn của con cái" msgid "Kink Frequency Factor" -msgstr "Hệ Số Tân Số Thắt Nút" +msgstr "Hệ Số về Tần Số Xoắn Vặn" msgid "Amount texture affects child kink frequency" -msgstr "Mức chất liệu được ảnh hưởng tân số thắt nút của con cái" +msgstr "Lượng chất liệu ảnh hưởng tần số xoắn vặn của con cái" msgid "Length Factor" -msgstr "Hệ Số Bề Dài" +msgstr "Hệ Số Chiều Dài" msgid "Amount texture affects child hair length" -msgstr "Mức chất liệu được ảnh hưởng bề dài tóc con cái" +msgstr "Lượng chất liệu ảnh hưởng chiều dài tóc con cái" msgid "Life Time Factor" @@ -91507,31 +100658,31 @@ msgstr "Hệ Số Tuổi Thọ" msgid "Amount texture affects particle life time" -msgstr "Mức chất liệu được ảnh hưởng tuổi thọ hạt" +msgstr "Lượng chất liệu ảnh hưởng tuổi thọ hạt" msgid "Object to use for mapping with Object texture coordinates" -msgstr "Dùng vật thể nào cho ánh xạ với tọa độ chất liệu của Vật Thể" +msgstr "Đối tượng dùng để ánh xạ với tọa độ chất liệu của Đối Tượng" msgid "Rough Factor" -msgstr "Hệ Số Nhám" +msgstr "Hệ Số Ráp" msgid "Amount texture affects child roughness" -msgstr "Mức chất liệu được ảnh hưởng độ nhám con cái" +msgstr "Lượng chất liệu ảnh hưởng độ ráp của con cái" msgid "Size Factor" -msgstr "Hệ Số Kích Cỡ" +msgstr "Hệ Số Kích Thước" msgid "Amount texture affects physical particle size" -msgstr "Mức chất liệu được ảnh hưởng kích cỡ hạt" +msgstr "Lượng chất liệu ảnh hưởng kích thước hạt" msgid "Use linked object's coordinates for texture coordinates" -msgstr "Dùng tọa độ của vật thể được liên kết cho tọa độ chất liệu" +msgstr "Dùng tọa độ đối tượng kết nối làm tọa độ chất liệu" msgid "Use UV coordinates for texture coordinates" @@ -91543,7 +100694,7 @@ msgstr "Sợi / Hạt" msgid "Use normalized strand texture coordinate (1D) or particle age (X) and trail position (Y)" -msgstr "Dùng tọa độ chất liệu đơn vị hóa (1 chiều) hay tuổi thọ hạt (X) và vị trí đường vết chuyển động (Y)" +msgstr "Dùng tọa độ chất liệu của sợi đã bình thường hóa (1D) hoặc tuổi thọ hạt (X) và vị trí của đường chuyển động (Y)" msgid "Emission Time Factor" @@ -91551,35 +100702,35 @@ msgstr "Hệ Số Thời Gian Phát" msgid "Amount texture affects particle emission time" -msgstr "Mức chất liệu được ảnh hưởng thời gian phát hạt" +msgstr "Lượng chất liệu ảnh hưởng thời gian phát hạt" msgid "Twist Factor" -msgstr "Hệ Số Xoắn" +msgstr "Hệ Số Xoắn Vặn" msgid "Amount texture affects child twist" -msgstr "Mức chất liệu được ảnh hưởng xoắn" +msgstr "Lượng chất liệu tác động độ xoắn vặn của con cái" msgid "Affect the child clumping" -msgstr "Ảnh hưởng dính bó của con cái" +msgstr "Tác động sự kết khối của con cái" msgid "Affect the particle velocity damping" -msgstr "Điều khiển tắt dần vật tốc hạt" +msgstr "Tác động sự suy giảm vận tốc của hạt" msgid "Affect the density of the particles" -msgstr "Điều khiển mật độ hạt" +msgstr "Tác động mật độ của hạt" msgid "Force Field" -msgstr "Lực Trường" +msgstr "Trường Lực" msgid "Affect the particle force fields" -msgstr "Điều khiển lực trường của hạt" +msgstr "Điều khiển trường lực của hạt" msgid "Affect the particle gravity" @@ -91587,23 +100738,23 @@ msgstr "Điều khiển hấp dẫn hạt" msgid "Kink Amplitude" -msgstr "Biên Độ Thắt Nút" +msgstr "Biên Độ Xoắn Vặn" msgid "Affect the child kink amplitude" -msgstr "Ảnh hưởng biên độ thắt nút của con cái" +msgstr "Ảnh hưởng biên độ xoắn vặn của con cái" msgid "Kink Frequency" -msgstr "Tần Số Thắt Nút" +msgstr "Tần Số Xoắn Vặn" msgid "Affect the child kink frequency" -msgstr "Ảnh hưởng tần số thắt nút của con cái" +msgstr "Ảnh hưởng tần số xoắn vặn của con cái" msgid "Affect the child hair length" -msgstr "Ảnh hưởng bề dài tóc của con cái" +msgstr "Điều khiển chiều dài tóc của con cái" msgid "Life Time" @@ -91611,19 +100762,19 @@ msgstr "Tuổi Thọ" msgid "Affect the life time of the particles" -msgstr "Ảnh hưởng tuổi thọ của hạt" +msgstr "Điều khiển tuổi thọ của hạt" msgid "Rough" -msgstr "Nhám" +msgstr "Độ Gồ Ghề/Rối" msgid "Affect the child rough" -msgstr "Ảnh hưởng nhám của con cái" +msgstr "Điều khiển độ gồ ghề/rối của con cái" msgid "Affect the particle size" -msgstr "Ảnh hưởng kích cỡ hạt" +msgstr "Điều khiển kích thước hạt" msgid "Emission Time" @@ -91635,23 +100786,23 @@ msgstr "Ảnh hưởng thời gian phát của hạt" msgid "Affect the child twist" -msgstr "Ảnh hưởng xoắn của con cái" +msgstr "Tác động xoắn vặn của con cái" msgid "Affect the particle initial velocity" -msgstr "Ảnh hưởng vận tốc khởi động của hạt" +msgstr "Tác động vận tốc khởi đầu của hạt" msgid "UV map to use for mapping with UV texture coordinates" -msgstr "Dùng bản đồ UV nào cho ánh xạ với tọa độ chất liệu UV" +msgstr "Ánh xạ UV sử dụng để ánh xạ với tọa độ chất liệu UV" msgid "Amount texture affects particle initial velocity" -msgstr "Mức chất liệu được ảnh hưởng vận tốc khởi động" +msgstr "Lượng chất liệu ảnh hưởng vận tốc khởi đầu" msgid "User interface styling and color settings" -msgstr "Cài đặt màu và phong cách của giao diện người dùng" +msgstr "Các cài đặt về phong cách giao diện người dùng và màu sắc" msgid "Clip Editor" @@ -91659,115 +100810,131 @@ msgstr "Trình Biên Soạn Đoạn Phim" msgid "Name of the theme" -msgstr "Tên của phong cách" +msgstr "Tên Kiểu Mẫu" msgid "Active Theme Area" -msgstr "Khu Vực Phong Cách Hoạt Động" +msgstr "Kiểu Mẫu đang Hoạt Động cho Diện Tích" + + +msgid "Theme Asset Shelf Color" +msgstr "Màu Kiểu Mẫu của Kệ Tài Sản" + + +msgid "Theme settings for asset shelves" +msgstr "Các cài đặt kiểu mẫu cho kệ tài sản" + + +msgid "Main Region Background" +msgstr "Nền Sau Khu Vực Chính" + + +msgid "Header Background" +msgstr "Nền Đầu Đề" msgid "Theme Bone Color Set" -msgstr "Tập Phong Cách Màu Sắc Xương" +msgstr "Bộ Màu Kiểu Mẫu của Xương" msgid "Theme settings for bone color sets" -msgstr "Cài đặt phong cách cho tập màu sắc xương" +msgstr "Sắp đặt kiểu mẫu cho những bộ màu sắc của xương" msgid "Color used for active bones" -msgstr "Màu cho xương hoạt động" +msgstr "Màu sử dụng cho xương đang hoạt động" msgid "Color used for the surface of bones" -msgstr "Màu cho bề mặt xương" +msgstr "Màu sử dụng cho bề mặt của các xương" msgid "Color used for selected bones" -msgstr "Màu cho xương được chọn" +msgstr "Màu sử dụng cho xương lựa chọn" msgid "Colored Constraints" -msgstr "Màu Ràng Buộc" +msgstr "Tô Màu Ràng Buộc" msgid "Allow the use of colors indicating constraints/keyed status" -msgstr "Cho dùng màu để chỉ trạng thái ràng buộc/bức ảnh mẫu" +msgstr "Cho phép dùng các màu sắc để biểu thị trạng thái ràng buộc/khung khóa hóa" msgid "Theme Clip Editor" -msgstr "Phong Cách Trình Biên Soạn Đoạn Phim" +msgstr "Kiểu Mẫu của Trình Biên Soạn Đoạn Phim" msgid "Theme settings for the Movie Clip Editor" -msgstr "Cài đặt phong cách cho Trình Biên Soạn Đoạn Phim" +msgstr "Sắp đặt kiểu mẫu cho Trình Biên Soạn Đoạn Phim" msgid "Active Marker" -msgstr "Ký Hiệu Hoạt Động" +msgstr "Dấu Mốc đang Hoạt Động" msgid "Color of active marker" -msgstr "Màu cho ký hiệu hoạt động" +msgstr "Màu cho dấu mốc đang hoạt động" msgid "Disabled Marker" -msgstr "Ký Hiệu Tắt" +msgstr "Dấu Mốc đã Tắt" msgid "Color of disabled marker" -msgstr "Màu cho ký hiệu tắt" +msgstr "Màu cho dấu mốc đã bị vô hiệu hóa" msgid "Align Handle" -msgstr "Sắp Xếp Tay Cầm" +msgstr "Tay Cầm Thẳng Hàng" msgid "Align Handle Selected" -msgstr "Sắp Xếp Tay Cầm Được Chọn" +msgstr "Tay Cầm Thẳng Hàng Được Chọn" msgid "Auto Handle Selected" -msgstr "Đã Chọn Tay Cầm Tự Động" +msgstr "Tay Cầm Tự Động Được Chọn" msgid "Auto-Clamped Handle Selected" -msgstr "Đã Chọn Tay Cầm Tự Động Kẹp Lại" +msgstr "Tay Cầm Tự Động Hạn Định Được Chọn" msgid "Free Handle Selected" -msgstr "Đã Chọn Tay Cầm Tự Do" +msgstr "Tay Cầm Tự Do Được Chọn" msgid "Handle Vertex" -msgstr "Đỉnh Tay Cầm" +msgstr "Điểm Đỉnh của Tay Cầm" msgid "Handle Vertex Select" -msgstr "Chọn Đỉnh Tay Cầm" +msgstr "Tay Cầm của Điểm Đỉnh được Chọn" msgid "Handle Vertex Size" -msgstr "Kích Cỡ Đỉnh Tay Cầm" +msgstr "Kích Thước Tay Cầm của Điểm Đỉnh" msgid "Locked Marker" -msgstr "Ký Hiệu Bị Khóa" +msgstr "Dấu Mốc Bị Khóa" msgid "Color of locked marker" -msgstr "Màu cho ký hiệu được khóa" +msgstr "Màu của dấu mốc bị khóa" msgid "Color of marker" -msgstr "Màu ký hiệu" +msgstr "Màu của dấu mốc" msgid "Marker Outline" -msgstr "Nét Ngoài Ký Hiệu" +msgstr "Đường Viền Dấu Mốc" msgid "Color of marker's outline" -msgstr "Màu nét ngoài của ký hiệu" +msgstr "Màu của đường viền dấu mốc" msgid "Metadata Background" @@ -91779,103 +100946,103 @@ msgstr "Văn Bản Siêu Dữ Liệu" msgid "Path After" -msgstr "Đường Sau" +msgstr "Đường Dẫn Sau" msgid "Color of path after current frame" -msgstr "Màu của đường sau bức ảnh hiện tại" +msgstr "Màu của đường dẫn nằm sau khung hình hiện tại" msgid "Path Before" -msgstr "Đường Trước" +msgstr "Đường Dẫn Trước" msgid "Color of path before current frame" -msgstr "Màu của đường trước bức ảnh hiện tại" +msgstr "Màu của đường dẫn nằm trước khung hình hiện tại" msgid "Selected Marker" -msgstr "Ký Hiệu Được Chọn" +msgstr "Dấu Mốc được Chọn" msgid "Color of selected marker" -msgstr "Màu cho ký hiệu được chọn" +msgstr "Màu của dấu mốc được chọn" msgid "Settings for space" -msgstr "Cài đặt cho không gian" +msgstr "Sắp đặt cho không gian" msgid "Settings for space list" -msgstr "Cài đặt cho danh sách không gian" +msgstr "Sắp đặt cho không gian danh sách" msgid "Strips" -msgstr "Các Đoạn" +msgstr "Dải Phim" msgid "Strips Selected" -msgstr "Các Đoạn Được Chọn" +msgstr "Dải được Chọn" msgid "Marker Line" -msgstr "Đường Ký Hiệu" +msgstr "Đường Đánh Dấu" msgid "Marker Line Selected" -msgstr "Đường Ký Hiệu Được Chọn" +msgstr "Đường Đánh Dấu Được Chọn" msgid "Scrubbing/Markers Region" -msgstr "Vùng Kéo/Ký Hiệu" +msgstr "Vùng Rà Quét/Dấu Mốc" msgid "Theme Collection Color" -msgstr "Phong Cách Màu Sưu Tập" +msgstr "Kiểu Mẫu về Màu của Bộ Sưu Tập" msgid "Theme settings for collection colors" -msgstr "Cài đặt cho phong cách màu sưu tập" +msgstr "Sắp đặt kiểu mẫu cho các màu sắc của bộ sưu tập" msgid "Collection Color Tag" -msgstr "Nhẵn Màu Sưu Tập" +msgstr "Nhãn Màu của Bộ Sưu Tập" msgid "Theme Console" -msgstr "Phong Cách - Diện Điền Khiển" +msgstr "Kiểu Mẫu của Bàn Giao Tiếp" msgid "Theme settings for the Console" -msgstr "Cài đặt phong cách cho diện điều khiển" +msgstr "Sắp đặt kiểu mẫu của Bàn Giao Tiếp" msgid "Line Error" -msgstr "Sai Lầm Nét" +msgstr "Dòng Báo Lỗi" msgid "Line Info" -msgstr "Thông Tin Nét" +msgstr "Dòng Thông Tin" msgid "Line Input" -msgstr "Nét Ngõ Vào" +msgstr "Dòng Đầu Vào" msgid "Line Output" -msgstr "Nét Ngõ Ra" +msgstr "Dòng Đầu Ra" msgid "Theme Dope Sheet" -msgstr "Phong Cách - Bảng Hoạt Hình" +msgstr "Kiểu Mẫu của Bảng Hành Động" msgid "Theme settings for the Dope Sheet" -msgstr "Cài đặt phong cách cho Bảng Hoạt Hình" +msgstr "Sắp đặt kiểu mẫu cho Bảng Hành Động" msgid "Active Channel Group" -msgstr "Nhóm Kênh Hoạt Động" +msgstr "Nhóm Kênh đang Hoạt Động" msgid "Channel Group" @@ -91883,271 +101050,275 @@ msgstr "Nhóm Kênh" msgid "Channels Selected" -msgstr "Kênh Được Chọn" +msgstr "Kênh được Chọn" msgid "Dope Sheet Sub-channel" -msgstr "Hạ-Kênh Bảng Hoạt Hình" +msgstr "Kênh Thứ của Bảng Hành Động" msgid "Interpolation Line" -msgstr "Nét Suy Nội" +msgstr "Đường Nội Suy" msgid "Color of lines showing non-bezier interpolation modes" -msgstr "Màu của nét cho xem các chế độ vô Bezier" +msgstr "Màu sắc của các đường biểu hiện chế độ nội suy phi-bezier (non-bezier)" msgid "Color of Keyframe" -msgstr "Mâu Của Bức Ảnh Mẫu" +msgstr "Màu của Khung Khóa" msgid "Keyframe Border" -msgstr "Ranh Giới Bức Ảnh Mẫu" +msgstr "Đường Viền Khung Khóa" msgid "Color of keyframe border" -msgstr "Màu cho ranh giới của bức ảnh mẫu" +msgstr "Màu của đường viền khung khóa" msgid "Keyframe Border Selected" -msgstr "Ranh Giới Bức Ảnh Mẫu Được Chọn" +msgstr "Đường Viền Khung Khóa được Chọn" msgid "Color of selected keyframe border" -msgstr "Màu cho ranh giới của bức ảnh mẫu khi được chọn" +msgstr "Màu của đường viền khung khóa được chọn" msgid "Breakdown Keyframe" -msgstr "Mẫu Họa Phụ" +msgstr "Khung Khóa Phân Tích" msgid "Color of breakdown keyframe" -msgstr "Màu của bức ảnh mẫu phụ" +msgstr "Màu của khung khóa phân tích" msgid "Breakdown Keyframe Selected" -msgstr "Bức Ảnh Mẫu Phụ Được Chọn" +msgstr "Khung Khóa Phân Tích được Chọn" msgid "Color of selected breakdown keyframe" -msgstr "Màu của bức ảnh mẫu phụ khi được chọn" +msgstr "Màu của khung khóa phân tích được chọn" msgid "Extreme Keyframe" -msgstr "Bức Mẵu Cực Đoan" +msgstr "Khung Khóa Cường Điệu" msgid "Color of extreme keyframe" -msgstr "Màu của bức ảnh mẫu cực đoan" +msgstr "Màu của khung khóa cường điệu" msgid "Extreme Keyframe Selected" -msgstr "Bức Ảnh Mẫu Cực Đoan Được Chọn" +msgstr "Khung Khóa Cường Điệu được Chọn" msgid "Color of selected extreme keyframe" -msgstr "Maù của bức ảnh mẫu cực đoan khi được chọn" +msgstr "Màu của khung khóa cường điệu được chọn" msgid "Jitter Keyframe" -msgstr "Mấ Họa Hốt Hoảng" +msgstr "Khung Khóa Biến Động" msgid "Color of jitter keyframe" -msgstr "Màu của bức ảnh mẫu hốt hoảng" +msgstr "Màu của khung khóa biến động" msgid "Jitter Keyframe Selected" -msgstr "Bức Ảnh Mẫu Hốt Hoảng Được Chọn" +msgstr "Khung Khóa Biến Động được Chọn" msgid "Color of selected jitter keyframe" -msgstr "Màu Của bức ảnh mẫu hốt hoảng khi được chọn" +msgstr "Màu của khung khóa biến động được chọn" msgid "Moving Hold Keyframe" -msgstr "Màu Bức Ảnh Giữ" +msgstr "Khung Khóa Duy Trì Chuyển Động" msgid "Color of moving hold keyframe" -msgstr "Màu của bức ảnh giữ" +msgstr "Màu của khung khóa duy trì chuyển động" msgid "Moving Hold Keyframe Selected" -msgstr "Bức Ảnh Giữ Di Chuyển Được Chọn" +msgstr "Khung Hình Duy Trì Chuyển Động được Chọn" msgid "Color of selected moving hold keyframe" -msgstr "Màu của bức ảnh mẫu giữ khi đang di chuyển và được chọn" +msgstr "Màu của khung khóa duy trì chuyển động được chọn" msgid "Keyframe Scale Factor" -msgstr "Hệ Số Phóng To Bức Ảnh Mẫu" +msgstr "Hệ Số Tỷ Lệ Khung Khóa" msgid "Scale factor for adjusting the height of keyframes" -msgstr "Hệ số phóng to cho chỉnh đồ cao của bức ảnh mẫu" +msgstr "Hệ số tỷ lệ để điều chỉnh độ cao của các khung khóa" msgid "Keyframe Selected" -msgstr "Bức Ảnh Mẫu Được Chọn" +msgstr "Khung Khóa được Chọn" msgid "Color of selected keyframe" -msgstr "Màu của bức ảnh mẫu được chọn" +msgstr "Màu của khung khóa được chọn" msgid "Long Key" -msgstr "Bức Ảnh Mẫu Dài" +msgstr "Khung Khóa Dài" msgid "Long Key Selected" -msgstr "Bức Ảnh Mẫu Dài Được Chọn" +msgstr "Khung Khóa Dài được Chọn" msgid "Preview Range" -msgstr "Phạm Vi Dự Khán" +msgstr "Phạm Vi Xem Trước" msgid "Color of preview range overlay" -msgstr "Màu của lớp che cho phạm vi dự khán" +msgstr "Màu vẽ lồng phân khoảng xem trước" + + +msgid "Simulated Frames" +msgstr "Khung Hình Mô Phỏng" msgid "Summary" -msgstr "Tóm Lại" +msgstr "Tóm Tắt" msgid "Color of summary channel" -msgstr "Màu của kênh tóm lại" +msgstr "Màu của kênh tóm tắt" msgid "Value Sliders" -msgstr "Trơn Trượt Giá Trị" +msgstr "Thanh Trượt Giá Trị" msgid "View Sliders" -msgstr "Trơn Trượt Màn Chiếu" +msgstr "Thanh Trượt Khung Nhìn" msgid "Theme File Browser" -msgstr "Phong Cách Trình Duyệt Tập Tin" +msgstr "Kiểu Mẫu của Trình Duyệt Tập Tin" msgid "Theme settings for the File Browser" -msgstr "Cài đặt phong cách cho trình duyệt tập tin" +msgstr "Sắp đặt kiểu mẫu cho Trình Duyệt Tập Tin" msgid "Alternate Rows" -msgstr "Hàng Xen kẽ" +msgstr "Dòng So Le" msgid "Overlay color on every other row" -msgstr "Che màu trên hàng xen kẽ" +msgstr "Màu vẽ lồng trên các dòng so le" msgid "Selected File" -msgstr "Tập Tin Được Chọn" +msgstr "Tập Tin được Chọn" msgid "Font Style" -msgstr "Phong Cách Phông" +msgstr "Kiểu Phông Chữ" msgid "Theme settings for Font" -msgstr "Cài đặt phong cách cho Phông" +msgstr "Sắp đặt kiểu mẫu về Phông Chữ" msgid "Font size in points" -msgstr "Kích cỡ phông bằng điểm" +msgstr "Kích thước phông chữ trong số điểm" msgid "Shadow Size" -msgstr "Kích Cỡ Bóng Tối" +msgstr "Kích Thước Bóng Tối" msgid "Shadow size (0, 3 and 5 supported)" -msgstr "Kích cỡ bóng tối (hỗ trợ 0, 3, và 5)" +msgstr "Kích thước bóng tối (hỗ trợ 0, 3, và 5)" msgid "Shadow Alpha" -msgstr "Độ Đục Bóng Tối" +msgstr "Alpha của Bóng Tối" msgid "Shadow X Offset" -msgstr " Bóng Tối Dịch X" +msgstr "Dịch Chuyển X của Bóng Tối" msgid "Shadow offset in pixels" -msgstr "Dịch bóng tối bằng điểm ảnh" +msgstr "Dịch chuyển của bóng tối trong đơn vị điểm ảnh" msgid "Shadow Y Offset" -msgstr "Bóng Tối Dịch Y" +msgstr "Dịch Chuyển Y của Bóng Tối" msgid "Shadow Brightness" -msgstr "Độ Sáng Bóng Tối" +msgstr "Độ Sáng của Bóng Tối" msgid "Shadow color in gray value" -msgstr "Giá trị màu xám cho màu bóng tối" +msgstr "Màu của bóng tối trong giá trị màu xám" msgid "Theme Background Color" -msgstr "Phong Cách Màu Nền" +msgstr "Kiểu Mẫu của Màu Nền" msgid "Theme settings for background colors and gradient" -msgstr "Cài đặt phong cách cho màu nền và chuyển sắc" +msgstr "Sắp đặt kiểu mẫu cho các màu nền và dốc màu" msgid "Background Type" -msgstr "Loại Nền" +msgstr "Thể Loại Nền" msgid "Type of background in the 3D viewport" -msgstr "Loại nền trong màn chiếu 3D" +msgstr "Thể loại nền trong cổng nhìn 3D" msgid "Single Color" -msgstr "Một Màu" +msgstr "Đơn Màu" msgid "Use a solid color as viewport background" -msgstr "dùng một màu đục cho nền mản chiếu" +msgstr "Sử dụng một màu nguyên làm nền của cổng nhìn" msgid "Linear Gradient" -msgstr "Chuyển Sắc Bậc Một" +msgstr "Dốc Màu Tiếp Tuyến" msgid "Use a screen space vertical linear gradient as viewport background" -msgstr "Dùng một chuyển sắc bậc một dọc (không gian màn) cho nền màn chiếu" +msgstr "Sử dụng một dốc màu tiếp tuyến theo chiều dựng đứng trong không gian màn hình làm nền của cổng nhìn" msgid "Vignette" -msgstr "Chuyển Sắc Tròn" +msgstr "Viền Mờ" msgid "Use a radial gradient as viewport background" -msgstr "Dùng chuyển sắc tròn cho nền màn chiếu" +msgstr "Sử dụng một dốc màu tỏa tròn làm nền của cổng nhìn" msgid "Gradient Low" -msgstr "Chuyển Sắc Thấp" +msgstr "Điểm Thấp của Dốc Màu" msgid "Gradient High/Off" -msgstr "Chuyển Sắc Cao/Tắt" +msgstr "Điểm Cao/Tắt của Dốc Màu" msgid "Theme Graph Editor" -msgstr "Phong Cách - Trình Biên Soạn Biểu Đồ" +msgstr "Kiểu Mẫu của Trình Biên Soạn Đồ Thị" msgid "Theme settings for the graph editor" -msgstr "Cài đặt phong cách cho trình biên soạn biểu đồ" +msgstr "Sắp đặt kiểu mẫu cho trình biên soạn đồ thị" msgid "Channels Region" @@ -92155,547 +101326,571 @@ msgstr "Vùng Kênh" msgid "Vector Handle Selected" -msgstr "Đã Chọn Tay Cầm Vectơ" +msgstr "Tay Cầm Véctơ Được Chọn" msgid "Last Selected Point" -msgstr "Điểm Cuối Đã Chọn" +msgstr "Điểm Chọn Cuối Cùng" msgid "Vertex Bevel" -msgstr "Cạnh Tròn Đỉnh" +msgstr "Bo Tròn Điểm Đỉnh" msgid "Vertex Select" -msgstr "Chọn Đỉnh" +msgstr "Điểm Đỉnh được Chọn" msgid "Vertex Size" -msgstr "Kích Cỡ Đỉnh" +msgstr "Kích Thước Điểm Đỉnh" msgid "Vertex Group Unreferenced" -msgstr "Nhóm Đỉnh Không Đươc Tham Chiếu" +msgstr "Nhóm Điểm Đỉnh Không Tham Chiếu" msgid "Window Sliders" -msgstr "Trơn Trượt Cửa Sổ" +msgstr "Thanh Trượt Cửa Sổ" msgid "Theme Image Editor" -msgstr "Phong Cách Trình Biên Soạn Ảnh" +msgstr "Kiểu Mẫu của Trình Biên Soạn Ảnh" msgid "Theme settings for the Image Editor" -msgstr "Cài đặt phong cách cho Trình Biên Soạn Ảnh" +msgstr "Sắp đặt kiểu mẫu cho Trình Biên Soạn Ảnh" msgid "Edge Select" -msgstr "Chọn Cạnh" +msgstr "Cạnh được Chọn" + + +msgid "Edge Width" +msgstr "Chiều Rộng Cạnh" msgid "Active Vertex/Edge/Face" -msgstr "Đỉnh/Cạnh/Mặt Hoạt Động" +msgstr "Điểm Đỉnh/Cạnh/Mặt đang Hoạt Động" msgid "Face Orientation Back" -msgstr "Định Hướng Mặt Phía Sau" +msgstr "Định Hướng Mặt: Sau" msgid "Face Dot Selected" -msgstr "Dấu Chấm Mạt Được Chọn" +msgstr "Dấu Chấm trên Mặt được Chọn" msgid "Face Orientation Front" -msgstr "Định Hướng Mặt Phía Trước" +msgstr "Định Hướng Mặt: Trước" + + +msgid "Face Retopology" +msgstr "Tái Cấu Trúc Mặt" msgid "Face Dot Size" -msgstr "Kích Cỡ Dấu Chấm Mặt" +msgstr "Kích Thước Dấu Chấm Mặt" msgid "Paint Curve Handle" -msgstr "Sơn Tay Cầm Cong" +msgstr "Tay Cầm của Đường Cong Sơn" msgid "Paint Curve Pivot" -msgstr "Sơn Điểm Tựa Đường Cong" +msgstr "Điểm Tựa của Đường Cong Sơn" msgid "Stitch Preview Active Island" -msgstr "Khâu Dự Khán Hon Đảo Hoạt Động " +msgstr "Đính Vá: Xem Trước Hải Đảo đang Hoạt Động" msgid "Stitch Preview Edge" -msgstr "Khâu Dự khán Cạnh" +msgstr "Đính Vá: Xem Trước Cạnh" msgid "Stitch Preview Face" -msgstr "Khâu Dự khán Mặt" +msgstr "Đính Vá: Xem Trước Mặt" msgid "Stitch Preview Stitchable" -msgstr "Khâu Dự khán Đồ Có Thể Khâu" +msgstr "Đính Vá: Xem Trước những chỗ Đính Vá Được" msgid "Stitch Preview Unstitchable" -msgstr "Khâu Dự Khán Đồ Không Thế Khâu" +msgstr "Đính Vá: Xem Trước những chỗ Không Thể Đính Vá Được" msgid "Stitch Preview Vertex" -msgstr "Khâu Dự khán Đỉnh" +msgstr "Đính Vá: Xem Trước Điểm Đỉnh" msgid "Scope Region Background" -msgstr "Nền Vùng Biểu Đồ" +msgstr "Nền của Vùng Kế Đo Lường" msgid "Texture Paint/Modifier UVs" -msgstr "Nước Sơn Chất Liệu/UV Bộ Điều Chỉnh" +msgstr "Sơn Chất Liệu/UV của Bộ Điều Chỉnh" msgid "Wire Edit" -msgstr "Biên Tập Sợi Dây" +msgstr "Biên Soạn Mạch Lưới" msgid "Theme Info" -msgstr "Phong Cách Thông Tin" +msgstr "Kiểu Mẫu của Thông Tin" msgid "Theme settings for Info" -msgstr "Cài đặt phong cách cho thông tin" +msgstr "Sắp đặt kiểu mẫu cho Thông Tin" msgid "Debug Icon Background" -msgstr "Nền Biểu Tượng Sửa Sai Lầm" +msgstr "Nền Sau của Biểu Tượng Điều Tra Lỗi" msgid "Background color of Debug icon" -msgstr "Màu nền của biểu tượng Sưa Sai Lầm" +msgstr "Màu nền sau của biểu tượng điều tra lỗi (Debug)" msgid "Debug Icon Foreground" -msgstr "Cận Cảnh Biểu Tượng Sửa Sai Lầm" +msgstr "Nền Trước của Biểu Tượng Điều Tra Lỗi" msgid "Foreground color of Debug icon" -msgstr "Màu cận cảnh của biểu tượng Sửa Sai Lầm" +msgstr "Màu nền trước của biểu tượng điều tra lỗi (Debug)" msgid "Error Icon Background" -msgstr "Nền Biểu Tượng Sai Lầm" +msgstr "Nền Sau của Biểu Tượng Lỗi" msgid "Background color of Error icon" -msgstr "Màu nền của biểu tượng Sai Lầm" +msgstr "Màu nền sau của biểu tượng Lỗi" msgid "Error Icon Foreground" -msgstr "Cận Cảnh Biểu Tượng Sai Lầm" +msgstr "Nền Trước của Biểu Tượng Lỗi" msgid "Foreground color of Error icon" -msgstr "Màu cận cảnh của biểu tượng Sai Lầm" +msgstr "Màu nền trước của biểu tượng Lỗi" msgid "Info Icon Background" -msgstr "Nền Biểu Tượng Thông Tin" +msgstr "Nền Sau của Biểu Tượng Thông Tin" msgid "Background color of Info icon" -msgstr "Màu nền của biểu tượng thông tin" +msgstr "Màu nền sau của biểu tượng Thông Tin" msgid "Info Icon Foreground" -msgstr "Cận Cảnh Biểu Tượng Thông Tin" +msgstr "Nền Trước của Biểu Tượng Thông Tin" msgid "Foreground color of Info icon" -msgstr "Màu cận cảnh của biểu tượng Thông Tin" +msgstr "Màu nền trước của biểu tượng Thông Tin" msgid "Operator Icon Background" -msgstr "Nền Biểu Tượng Thao Tác" +msgstr "Nền Sau của Biểu Tượng Thao Tác" msgid "Background color of Operator icon" -msgstr "Màu nền của biểu tượng Thao Tác" +msgstr "Màu nền sau của biểu tượng Thao Tác (toán tử)" msgid "Operator Icon Foreground" -msgstr "Cận Cảnh Biểu Tượng Thao Tác" +msgstr "Nền Trước của Biểu Tượng Thao Tác" msgid "Foreground color of Operator icon" -msgstr "Màu cận cảnh của biểu tượng Thao Tác" +msgstr "Màu nền trước của biểu tượng Thao Tác (toán tử)" msgid "Property Icon Background" -msgstr "Nền Biểu Tượng Đặc Tính" +msgstr "Nền Sau của Biểu Tượng Tính Chất" msgid "Background color of Property icon" -msgstr "Màu nền của biểu tượng Đặc Tính" +msgstr "Màu nền sau của biểu tượng Tính Chất" msgid "Property Icon Foreground" -msgstr "Cận Cảnh Biểu Tượng Đặc Tính" +msgstr "Nền Trước của Biểu Tượng Tính Chất" msgid "Foreground color of Property icon" -msgstr "Màu cận cảnh của biểu tượng Đặc Tính" +msgstr "Màu nền trước của biểu tượng Tính Chất" msgid "Selected Line Background" -msgstr "Nền Hàng Được Chọn" +msgstr "Nền Sau của Dòng được Chọn" msgid "Background color of selected line" -msgstr "Màu nền của đường được chọn" +msgstr "Màu nền sau của dòng được chọn" msgid "Selected Line Text Color" -msgstr "Màu Văn Bản Đường Được Chọn" +msgstr "Màu Văn Bản của Dòng Được Chọn" msgid "Text color of selected line" -msgstr "Màu văn bản của đường được chọn" +msgstr "Màu văn bản của dòng được chọn" msgid "Warning Icon Background" -msgstr "Nền Biểu Tượng Cảnh Báo" +msgstr "Nền Sau của Biểu Tượng Cảnh Báo" msgid "Background color of Warning icon" -msgstr "Màu nền của biểu tượng Cảnh Báo" +msgstr "Màu nền sau của biểu tượng Cảnh Báo" msgid "Warning Icon Foreground" -msgstr "Cận Cảnh Biểu Tượng Cảnh Báo" +msgstr "Nền Trước của Biểu Tượng Cảnh Báo" msgid "Foreground color of Warning icon" -msgstr "Màu cận cảnh của biểu tượng Cảnh Báo" +msgstr "Màu nền trước của biểu tượng Cảnh Báo" msgid "Theme Nonlinear Animation" -msgstr "Phong Cách Hoạt Hình Không Đường Thẳng" +msgstr "Kiểu Mẫu Hoạt Họa Phi Tuyến Tính" msgid "Theme settings for the NLA Editor" -msgstr "Cài đặt phong cách cho Trình Biên Soạn NLA" +msgstr "Sắp đặt kiểu mẫu cho biên soạn NLA" msgid "Active Action" -msgstr "Hành Động Hoạt Động" +msgstr "Hành Động đang Hoạt Động" msgid "Animation data-block has active action" -msgstr "Cục dữ liệu hoạt hình có hành động hoạt động" +msgstr "Khối dữ liệu hoạt họa có hành động đang hoạt động" msgid "No Active Action" -msgstr "Không Có Hành Động Hoạt Động" +msgstr "Không có Hành Động đang Hoạt Động" msgid "Animation data-block doesn't have active action" -msgstr "Cục dữ liệu hành động không có hành động hoạt động" +msgstr "Khối dữ liệu hoạt họa không có hành động đang hoạt động" msgid "Nonlinear Animation Channel" -msgstr "Kênh Hoạt Hình Không Bậc Một" +msgstr "Kênh Hoạt Họa Phi Tuyến Tính" + + +msgid "Sub-channel" +msgstr "Kênh Phụ" msgid "Meta Strips" -msgstr "Siêu Đoạn" +msgstr "Dải Siêu" msgid "Unselected Meta Strip (for grouping related strips)" -msgstr "Siêu Đoạn Chưa Được Chọn (cho nhóm lại các đoạn liên quan)" +msgstr "Dải Siêu Chưa Chọn (để nhóm các dải có liên quan với nhau lại)" msgid "Meta Strips Selected" -msgstr "Siêu Đoạn Được Chọn" +msgstr "Dải Siêu được Chọn" msgid "Selected Meta Strip (for grouping related strips)" -msgstr "Siêu Đoạn Được Chọn (cho nhóm lại các đoạn liên quan)" +msgstr "Dải Siêu Được Chọn (để nhóm các dải có liên quan với nhau lại)" msgid "Nonlinear Animation Track" -msgstr "Rãnh Hoạt Hình Vô Tuyến Tính" +msgstr "Rãnh Hoạt Họa Phi tuyến tính" msgid "Sound Strips" -msgstr "Đoạn Âm Thanh" +msgstr "Dải Âm Thanh" msgid "Unselected Sound Strip (for timing speaker sounds)" -msgstr "Đoạn Âm Thannh Chưa Được Chọn (cho nhịp âm thanh loa)" +msgstr "Dải Âm Thanh Chưa Được Chọn (để giữ nhịp/tính thời gian cho âm thanh loa)" msgid "Sound Strips Selected" -msgstr "Đoạn Âm Thanh Được Chọn" +msgstr "Dải Âm Thanh được Chọn" msgid "Selected Sound Strip (for timing speaker sounds)" -msgstr "Đoạn Âm Thannh Được Chọn (cho nhịp âm thanh loa)" +msgstr "Dải Âm Thanh Được Chọn (để giữ nhịp/tính thời gian cho âm thanh loa)" msgid "Unselected Action-Clip Strip" -msgstr "Đoạn Phim-Hoạt Hình Chưa Được Chọn" +msgstr "Dải Phân Đoạn Hành Động Chưa Chọn" msgid "Selected Action-Clip Strip" -msgstr "Đoạn Phim-Hoạt Động Được Chọn " +msgstr "Dải Phân Đoạn Hành Động Được Chọn" msgid "Transitions" -msgstr "Chuyển Tiếp" +msgstr "Chuyển Cảnh" msgid "Unselected Transition Strip" -msgstr "oạn Tiến Triển Chưa Chọn" +msgstr "Dải Chuyển Cảnh Chưa Chọn" msgid "Transitions Selected" -msgstr "Tiến Triển Được Chọn" +msgstr "Chuyển Cảnh được Chọn" msgid "Selected Transition Strip" -msgstr "Đoạn Tiến Triển Được Chọn" +msgstr "Dải Chuyển Cảnh Được Chọn" msgid "Color for strip/action being \"tweaked\" or edited" -msgstr "Màu cho đoạn/hành động đang \"chỉnh\" hay biên tập" +msgstr "Màu sắc cho dải/hành động đang được \"hiệu chỉnh\" hoặc biên soạn" msgid "Tweak Duplicate Flag" -msgstr "Chỉnh Cờ Bản Sao" +msgstr "Cờ Báo Hiệu Chỉnh Trùng Lặp" msgid "Warning/error indicator color for strips referencing the strip being tweaked" -msgstr "Màu cảnh báo/sai lầm cho đoạn đang tham chiếu đoạn đang được chỉnh sửa" +msgstr "Màu biểu thị cảnh báo/lỗi lầm cho các dải phim cùng đối chiếu dải đang được hiệu chỉnh" msgid "Theme Node Editor" -msgstr "Phong Cách Trình Biên Soạn Giao Điểm" +msgstr "Kiểu Mẫu của Trình Biên Soạn Nút" msgid "Theme settings for the Node Editor" -msgstr "Cài đặt phong cách cho Trình Biên Soạn Giao Điểm" +msgstr "Sắp đặt kiểu mẫu cho Trình Biên Soạn Nút" msgid "Attribute Node" -msgstr "Giao Điểm Đặc Điểm" +msgstr "Nút Thuộc Tính" msgid "Color Node" -msgstr "Giao Điểm Màu" +msgstr "Nút Màu Sắc" msgid "Converter Node" -msgstr "Giao Điểm Biến Đổi" +msgstr "Nút Chuyển Đổi" msgid "Dashed Lines Opacity" -msgstr "Độ Đục Đường Gạch Ngang" +msgstr "Độ Đục của Đường Đứt Đoạn" msgid "Opacity for the dashed lines in wires" -msgstr "Độ đục cho đường gạch nagng trong sợi dây" +msgstr "Độ đục cho các đường đứt đoạn trong dây" msgid "Distort Node" -msgstr "Giao Điểm Méo Hóa" +msgstr "Nút Biến Dạng" msgid "Filter Node" -msgstr "Giao Điểm Bộ Lọc" +msgstr "Nút Thanh Lọc" msgid "Frame Node" -msgstr "Giao Điểm Bức Ảnh" +msgstr "Nút Viền Khung" msgid "Grid Levels" -msgstr "Mức Đồ Đồ Thị" +msgstr "Mức Phân Hóa Khung Lưới Đồ Thị" msgid "Number of subdivisions for the dot grid displayed in the background" -msgstr "Số lượng phân hóa cho đồ thị dấu chấm được hiển thị trên nền" +msgstr "Lượng phân hóa cho khung lưới đồ thị chấm chấm hiển thị ở nền" msgid "Group Node" -msgstr "Giao Điểm Nhóm" +msgstr "Nút Nhóm" msgid "Group Socket Node" -msgstr "Giao Điểm Nhóm Ổ Cắm" +msgstr "Nút Ổ Cắm của Nhóm" msgid "Input Node" -msgstr "Giao Điểm Ngõ Vào" +msgstr "Nút Đầu Vào" msgid "Layout Node" -msgstr "Giao Điểm Cài đặt" +msgstr "Nút Bố Trí" msgid "Matte Node" -msgstr "Giao Điểm Che Lấp" +msgstr "Nút Lớp Vẽ Lồng" msgid "Node Backdrop" -msgstr "Ảnh Nền Giao Điểm" +msgstr "Nền của Nút" msgid "Node Selected" -msgstr "Giao Điểm Được Chọn" +msgstr "Nút được Chọn" msgid "Noodle Curving" -msgstr "Khắc Mỳ" +msgstr "Dây Nối Cong" msgid "Curving of the noodle" -msgstr "Độ cong của cong mỳ" +msgstr "Dây nối cong" msgid "Pattern Node" -msgstr "Giao Điểm Trang Hoàng" +msgstr "Nút Hoa Văn" + + +msgid "Repeat Zone" +msgstr "Vùng Nhắc Lại" msgid "Script Node" -msgstr "Giao Điểm Văn Thảo" +msgstr "Nút Tập Lệnh" msgid "Selected Text" -msgstr "Văn Bản Được Chọn" +msgstr "Văn Bản được Chọn" + + +msgid "Simulation Zone" +msgstr "Vùng Mô Phỏng" msgid "Vector Node" -msgstr "Giao Điểm Vectơ" +msgstr "Nút Véctơ" msgid "Wires" -msgstr "Sợi Dây" +msgstr "Đường Dây" msgid "Wire Select" -msgstr "Chọn Sợi Dây" +msgstr "Dây được Chọn" msgid "Theme Outliner" -msgstr "Phong Cách Mục Lục" +msgstr "Kiểu Mẫu của Mục Lục" msgid "Theme settings for the Outliner" -msgstr "Cài đặt cho Mục Lục" +msgstr "Sắp đặt kiểu mẫu cho Mục Lục" msgid "Active Highlight" -msgstr "Tô Sáng Hoạt Động" +msgstr "Năng Động Nêu Bật" msgid "Edited Object" -msgstr "Vật Thể Được Biên Tập" +msgstr "Đối Tượng đã Biên Soạn" msgid "Filter Match" -msgstr "Lọc Giống" +msgstr "Khớp Điều Kiện Thanh Lọc" msgid "Selected Highlight" -msgstr "Tô Sáng Được Chọn" +msgstr "Nêu Bật cái được Chọn" msgid "Theme Panel Color" -msgstr "Phong Cách Màu Bảng" +msgstr "Kiểu Mẫu của Màu của Bảng" msgid "Theme settings for panel colors" -msgstr "Cài đặt phong cách màu bảng" +msgstr "Sắp đặt kiểu mẫu cho các màu sắc của bảng" msgid "Sub Background" -msgstr "Hạ Nền" +msgstr "Nền Dưới" msgid "Theme Preferences" -msgstr "Tùy Chọn Phong Cách" +msgstr "Cài Đặt Sở Thích về Phong Cách" msgid "Theme settings for the Blender Preferences" -msgstr "Cài đặt phong cách cho Tùy Chọn Blender" +msgstr "Những sắp đặt về phong cách cho các Cài Đặt Sở Thích của Blender" msgid "Theme Properties" -msgstr "Phong Cách Đặc Tính" +msgstr "Kiểu Mẫu của Tính Chất" msgid "Theme settings for the Properties" -msgstr "Cài đặt phong cách cho Đặc Tính" +msgstr "Sắp đặt kiểu mẫu cho các Tính Chất" msgid "Active Modifier Outline" -msgstr "Mục Lục Bộ Điều Chỉnh Hoạt Động" +msgstr "Đường Viền của Bộ Điều Chỉnh đang Hoạt Động" msgid "Search Match" -msgstr "Tìm Kiếm Giống Hệt" +msgstr "Kết Quả Tìm Thấy" msgid "Theme Sequence Editor" -msgstr "Phong Cách Trình Biên Soạn Trình Tự" +msgstr "Kiểu Mẫu của Trình Phối Hình" msgid "Theme settings for the Sequence Editor" -msgstr "Cài đặt phong cách cho Trình Biên Soạn Trình Tự" +msgstr "Sắp đặt kiểu mẫu của Trình Phối Hình" msgid "Audio Strip" -msgstr "Đoạn Âm Thanh" +msgstr "Dải Âm Thanh" msgid "Color Strip" -msgstr "Đoạn Màu" +msgstr "Dải Màu Sắc" msgid "Draw Action" -msgstr "Vẽ Hành Động" +msgstr "Hành Động Vẽ" msgid "Image Strip" -msgstr "Đoạn Ảnh" +msgstr "Dải Hình Ảnh" msgid "Meta Strip" -msgstr "Đoạn Siêu" +msgstr "Siêu Trình tự" msgid "Clip Strip" -msgstr "Đoạn Khúc Phim" +msgstr "Dải Đoạn Phim" msgid "Preview Background" -msgstr "Nền Dự Khán" +msgstr "Nền Xem Trước" msgid "Scene Strip" -msgstr "Đoạn Cảnh" +msgstr "Dải về Cảnh" msgid "Selected Strips" -msgstr "Các Đoạn Đã Chọn" +msgstr "Dải Được Chọn" msgid "Text Strip" -msgstr "Đoạn Văn Bản" +msgstr "Dải Văn Bản" + + +msgid "Transition Strip" +msgstr "Dải Chuyển Tiếp" msgid "Theme Space Settings" -msgstr "Phong Cách Cài Đặt Không Gian" +msgstr "Kiểu Mẫu của các Sắp Đặt Không Gian" msgid "Window Background" @@ -92703,55 +101898,55 @@ msgstr "Nền Cửa Sổ" msgid "Region Background" -msgstr "Nền Vùng" +msgstr "Nền của Vùng" msgid "Region Text" -msgstr "Văn Bản Vùng" +msgstr "Văn Bản của Vùng" msgid "Region Text Highlight" -msgstr "Tô Sáng Văn Bản Vùng" +msgstr "Nêu Bật Văn Bản của Vùng" msgid "Region Text Titles" -msgstr "Tựa Văn Bản Vùng" +msgstr "Tựa Đề của Vùng" msgid "Execution Region Background" -msgstr "Nền Vùng Thực Hành" +msgstr "Nền của Vùng Thi Hành" msgid "Header Text Highlight" -msgstr "Tô Sáng Văn Bản Đầu" +msgstr "Nêu Bật Văn Bản của Tiêu Đề" msgid "Navigation Bar Background" -msgstr "Nền Thanh Chuyển Hướng" +msgstr "Nền của Thanh Điều Hướng" msgid "Tab Active" -msgstr "Nhãn Hoạt Động" +msgstr "Thẻ đang Hoạt Động" msgid "Tab Background" -msgstr "Nhãn Nền" +msgstr "Nền Thẻ" msgid "Tab Inactive" -msgstr "Nhãn Không Hoạt Động" +msgstr "Thẻ Không Hoạt Động" msgid "Tab Outline" -msgstr "Nhãn Mục Lục" +msgstr "Đường Viền Thẻ" msgid "Text Highlight" -msgstr "Tô Sáng Văn Bản" +msgstr "Văn Bản Nêu Bật" msgid "Theme Space List Settings" -msgstr "Cài Đặt Phong Cách Danh Sách Không Gian" +msgstr "Sắp Đặt về Kiểu Mẫu của Không Gian Danh Sách" msgid "Source List" @@ -92759,71 +101954,71 @@ msgstr "Danh Sách Nguồn" msgid "Source List Text" -msgstr "Văn Bản Danh Sách Nguồn" +msgstr "Văn Bản trong Danh Sách Nguồn" msgid "Source List Text Highlight" -msgstr "Tô Sáng Văn Bản Danh Sách Nguồn" +msgstr "Nêu Bật Văn Bản trong Danh Sách Nguồn" msgid "Source List Title" -msgstr "Tựa Danh Sách Nguồn" +msgstr "Tựa Đề cho Danh Sách Nguồn" msgid "Theme Spreadsheet" -msgstr "Phong Cách Bảng Tính" +msgstr "Kiểu Mẫu của Bảng Tính" msgid "Theme settings for the Spreadsheet" -msgstr "Cài đặt phong cách cho Bảng Tính" +msgstr "Cài đặt kiểu mẫu cho Bảng Tính" msgid "Theme Status Bar" -msgstr "Thanh Trạng Thái Phong Cách" +msgstr "Kiểu Mẫu cho Thanh Trạng Thái" msgid "Theme settings for the Status Bar" -msgstr "Cài đặt phong cách cho Thanh Trạng Thái" +msgstr "Cài đặt kiểu mẫu cho Thanh Trạng Thái" msgid "Theme Strip Color" -msgstr "Phong Cách Màu Sấc Đoàn" +msgstr "Kiểu Mẫu Màu Dải" msgid "Theme settings for strip colors" -msgstr "Cài đặt phong cách cho màu đoạn" +msgstr "Cài đặt kiểu mẫu cho các màu của dải" msgid "Theme settings for style sets" -msgstr "Cài đặt phong cách cho tập phong cách" +msgstr "Cài đặt về kiểu mẫu cho các bộ phong cách" msgid "Panel Title Font" -msgstr "Phông Tựa Bảng" +msgstr "Phông cho Tựa Đề của Bảng" msgid "Widget Style" -msgstr "Phong Cách Khiển Tố" +msgstr "Phong Cách của Thành Tố Điều Khiển" msgid "Widget Label Style" -msgstr "Phong Cách Nhãn Khiển Tố" +msgstr "Phong Cách Nhãn của Thành Tố Điều Khiển" msgid "Theme Text Editor" -msgstr "Phong Cách Trình Biên Soạn Văn Bản" +msgstr "Kiểu Mẫu của Trình Biên Soạn Văn Bản" msgid "Theme settings for the Text Editor" -msgstr "Cài đặt phong cách cho Trình Biên Soạn Văn Bản" +msgstr "Sắp đặt kiểu mẫu cho trình Biên Soạn Văn Bản" msgid "Line Numbers Background" -msgstr "Dòng Số Nền" +msgstr "Nền của Số Dòng" msgid "Syntax Built-In" -msgstr "Cú Pháp Đặt Sẵn" +msgstr "Cú Pháp Gắn Sẵn" msgid "Syntax Comment" @@ -92831,15 +102026,15 @@ msgstr "Cú Pháp Chú Thích" msgid "Syntax Numbers" -msgstr "Cú Pháp Số" +msgstr "Cú Pháp Con Số" msgid "Syntax Preprocessor" -msgstr "Cú Pháp Quá Trình Trước" +msgstr "Cú Pháp Tiền Xử Lý" msgid "Syntax Reserved" -msgstr "Cú Pháp Được Giữ Lại" +msgstr "Cú Pháp Dự Bị" msgid "Syntax Special" @@ -92847,35 +102042,35 @@ msgstr "Cú Pháp Đặc Biệt" msgid "Syntax String" -msgstr "Cú Pháp Xâu" +msgstr "Cú Pháp Chuỗi Ký Tự" msgid "Syntax Symbols" -msgstr "Cú Pháp Dấu Hiệu" +msgstr "Cú Pháp Ký Hiệu" msgid "Theme Top Bar" -msgstr "Thanh Trên Phong Cách" +msgstr "Kiểu Mẫu của Thanh Tiêu Đề" msgid "Theme settings for the Top Bar" -msgstr "Cài đặt phong cách cho Thanh Trên" +msgstr "Sắp đặt kiểu mẫu cho Thanh Tiêu Đề" msgid "Theme User Interface" -msgstr "Phong Cách Giao Diện Người Dùng" +msgstr "Kiểu Mẫu của Giao Diện Người Dùng" msgid "Theme settings for user interface elements" -msgstr "Cài đặt phong cách cho phần tử giao diện" +msgstr "Sắp đặt kiểu mẫu của các yếu tố trong giao diện" msgid "Editor Outline" -msgstr "Mục Lục Trình Biên Soạn" +msgstr "Nét Viền Trình Biên Soạn" msgid "Color of the outline of the editors and their round corners" -msgstr "Màu của mục lục của trình biên soạn và góc giác vòng tròn" +msgstr "Màu nét viền của các trình biên soạn và các góc bo tròn của chúng" msgid "Gizmo A" @@ -92887,271 +102082,308 @@ msgstr "Đồ Đạc B" msgid "Gizmo Highlight" -msgstr "Đồ Đạc Nổi Bật" +msgstr "Màu Nêu Bật của Gizmo" msgid "Gizmo Primary" -msgstr "Đồ Đạc Chánh" +msgstr "Màu Chính của Gizmo" msgid "Gizmo Secondary" -msgstr "Đồ Đạc Phụ" +msgstr "Màu Phụ của Gizmo" msgid "Gizmo View Align" -msgstr "Sắp Xếp Màn Đồ Đạc" +msgstr "Gizmo Căn Chỉnh Góc Nhìn" msgid "Icon Alpha" -msgstr "Độ Đục Biểu Tượng" +msgstr "Alpha của Biểu Tượng" msgid "Transparency of icons in the interface, to reduce contrast" -msgstr "Độ đục hay trong suốt của biểu tượng trong giao diện, cho giảm sự chênh lệch" +msgstr "Độ trong của biểu tượng trong giao diện, hòng để giảm độ tương phản" msgid "Icon Border" -msgstr "Ranh Giới Biểu Tượng" +msgstr "Đường Viền của Biểu Tượng" msgid "Control the intensity of the border around themes icons" -msgstr "Điều khiển cường độ của ranh giới quanh biểu tượng cho phong cách" +msgstr "Điều chỉnh cường độ của đường ranh giới chung quanh các biểu tượng kiểu mẫu" msgid "File Folders" -msgstr "Các Hồ Sơ Tập Tin" +msgstr "Thư Mục Tập Tin" msgid "Color of folders in the file browser" -msgstr "Màu của hồ sơ tập tin trong trình duyệt tập tin" +msgstr "Màu sắc của thư mục trong trình duyệt tập tin" msgid "Icon Saturation" -msgstr "Độ Tươi Biểu Tượng" +msgstr "Độ Tươi của Màu Biểu Tượng" msgid "Saturation of icons in the interface" -msgstr "Độ tươi của biểu tượng trong giao điện" +msgstr "Độ tươi của màu trên các biểu tượng trong giao diện" msgid "Menu Shadow Strength" -msgstr "Sức Bóng Tối Danh Bạ" +msgstr "Cường Độ Bóng Tối của Trình Đơn" msgid "Blending factor for menu shadows" -msgstr "Hệ số pha trộn cho bóng tối danh bạ" +msgstr "Hệ số pha trộn cho bóng tối của trình đơn" msgid "Menu Shadow Width" -msgstr "Bề Rộng Bóng Tối Danh Bạ" +msgstr "Chiều Rộng Bóng Tối của Trình Đơn" msgid "Width of menu shadows, set to zero to disable" -msgstr "Bề rộng bóng tối danh ba, đăt = 0 để tắt" +msgstr "Chiều rộng bóng tối của trình đơn, đặt = 0 để tắt đi" msgid "Panel Roundness" -msgstr "Độ Tròn Bảng" +msgstr "Độ Tròn của Bảng" msgid "Roundness of the corners of panels and sub-panels" -msgstr "Độ tròn của góc giác bảng và hạ bảng" +msgstr "Độ tròn của góc bảng và góc các bảng phụ" msgid "Primary Color" -msgstr "Màu Sắc Chánh" +msgstr "Màu Chính" msgid "Primary color of checkerboard pattern indicating transparent areas" -msgstr "Màu sắc chánh của chất liệu ca rô để biểu lộ chỗ trong suốt" +msgstr "Màu chính của mô hình bàn cờ, dùng để ám chỉ khu vực trong suốt" msgid "Secondary color of checkerboard pattern indicating transparent areas" -msgstr "Màu phụ của chất liệu ca rô để biểu lộ chỗ trong suốt" +msgstr "Màu phụ của mô hình bàn cờ, dùng để ám chỉ những khu vực trong suốt" msgid "Checkerboard Size" -msgstr "Khổ Ca Rô" +msgstr "Kích Thước Bàn Cờ" msgid "Size of checkerboard pattern indicating transparent areas" -msgstr "Khổ của hoọa tiết ca rô biểu lộ khu vực trong suốt" +msgstr "Kích thước của mô hình bàn cờ dùng để ám chỉ những khu vực trong suốt" msgid "Box Backdrop Colors" -msgstr "Màu Nền Hộp" +msgstr "Màu Nền của Hình Hộp" msgid "List Item Colors" -msgstr "Màu Mặt Hàng Danh Sách" +msgstr "Màu cho Phần Tử trong Danh Sách" msgid "Menu Widget Colors" -msgstr "Màu Khiển Tố Danh Bạ" +msgstr "Màu cho Thành Tố Trình Đơn" msgid "Menu Backdrop Colors" -msgstr "Màu Nền Danh Bạ" +msgstr "Màu Nền của Trình Đơn" msgid "Menu Item Colors" -msgstr "Màu Mặt Hàng Danh Bạ" +msgstr "Màu cho Phần Tử của Trình Đơn" msgid "Number Widget Colors" -msgstr "Màu Khiển Tố Số" +msgstr "Màu cho Thành Tố Điều Khiển Số" msgid "Slider Widget Colors" -msgstr "Màu Khiển Tố Trơn Trượt" +msgstr "Màu cho Thành Tố Thanh Trượt" msgid "Option Widget Colors" -msgstr "Màu Khiển Tố Tùy Chọn" +msgstr "Màu cho Thành Tố Tùy Chọn" msgid "Pie Menu Colors" -msgstr "Màu Danh Bạ Quạt" +msgstr "Màu cho Trình Đơn Hình Rẻ Quạt" msgid "Progress Bar Widget Colors" -msgstr "Màu Khiển Tố Thanh Tiến Triển" +msgstr "Màu cho Thành Tố Thanh Tiến Trình" msgid "Pulldown Widget Colors" -msgstr "Màu Khiển Tố Kéo Xuống" +msgstr "Màu cho Thành Tố Kéo Xuống" msgid "Radio Widget Colors" -msgstr "Màu Khiển Tố Truyền Thanh" +msgstr "Màu cho Thành Tố Radio" msgid "Regular Widget Colors" -msgstr "Màu Khiển Tố Bình Thường" +msgstr "Màu cho Thành Tố Bình Thường" msgid "Scroll Widget Colors" -msgstr "Màu Khiển Tố Cuộn" +msgstr "Màu cho Thành Tố Cuộn Dòng" msgid "State Colors" -msgstr "Màu Trạng Thái" +msgstr "Màu cho Trạng Thái" msgid "Tab Colors" -msgstr "Màu Tab" +msgstr "Màu Thẻ" msgid "Text Widget Colors" -msgstr "Màu Văn Bản Khiển Tố" +msgstr "Màu của Thành Tố Văn Bản" msgid "Toggle Widget Colors" -msgstr "Bật/Tắt Màu Khiển Tố" +msgstr "Màu của Thành Tố Bật/Tắt" msgid "Tool Widget Colors" -msgstr "Màu Khiển Tố Dụng Cụ" +msgstr "Màu của Thành Tố Công Cụ" msgid "Toolbar Item Widget Colors" -msgstr "Màu Khiển Tố Mặt Hàng Thanh Dụng Cụ" +msgstr "Màu của Thành Tố Phần Tử trong Thanh Công Cụ" msgid "Tooltip Colors" -msgstr "Màu Đề Thị Dụng Cụ" +msgstr "Màu của Chú Thích về Công Cụ" msgid "Widget Emboss" -msgstr "Chạm Nổ Khiển Tố" +msgstr "Chạm Nổi của Thành Tố Điều Khiển" msgid "Color of the 1px shadow line underlying widgets" -msgstr "Màu của nét bóng tối 1 điểm ảnh ở dưới khiển tố" +msgstr "Màu cho nét bóng tối 1 điểm ảnh nằm dưới thành tố điều khiển" msgid "Text Cursor" msgstr "Con Trỏ Văn Bản" +msgid "Color of the text insertion cursor (caret)" +msgstr "Màu của con trỏ chèn văn bản (gạch nháy)" + + msgid "Theme 3D Viewport" -msgstr "Phong Cách Màn Chiếu 3D" +msgstr "Kiểu Mẫu của Cổng Nhìn 3D" msgid "Theme settings for the 3D viewport" -msgstr "Cài đặt phong cách cho màn chiếu 3D" +msgstr "Sắp đặt kiểu mẫu cho Cổng Nhìn 3D" + + +msgid "Settings for asset shelf" +msgstr "Các cài đặt cho giá tài sản" msgid "Bone Locked Weight" -msgstr "Quyền Lượng Xương Được Khóa" +msgstr "Trọng Lượng Khóa của Xương" msgid "Shade for bones corresponding to a locked weight group during painting" -msgstr "Khi đang sơn, màu cho các xương của một nhóm quyền lượng được khóa" +msgstr "Màu dành cho các xương tương ứng với một nhóm trọng lượng được khóa lại trong khi sơn" + + +msgid "Bone Pose Selected" +msgstr "Xương Tư Thế Đã Chọn" + + +msgid "Outline color of selected pose bones" +msgstr "Màu đường viền của xương tư thế đã chọn" msgid "Bone Pose Active" -msgstr "Dạng Đứng Xương Hoạt Động" +msgstr "Tư Thế Xương đang Hoạt Động" + + +msgid "Outline color of active pose bones" +msgstr "Màu đường viền của xương tư thế đang hoạt động" msgid "Bone Solid" -msgstr "Xương Rắn" +msgstr "Khối Lập Thể của Xương" + + +msgid "Default color of the solid shapes of bones" +msgstr "Màu mặc định cho hình dạng đặc của xương" msgid "Bundle Solid" -msgstr "Gói Rắn" +msgstr "Khối Lập Thể của Bộ Điểm" + + +msgid "Camera Passepartout" +msgstr "Khung Cắt Cảnh của Máy Quay Phim" msgid "Camera Path" -msgstr "Đường Máy Quay Phim" +msgstr "Đường Đi của Máy Quay Phim" msgid "Clipping Border" -msgstr "Ranh Giới Cắt" +msgstr "Ranh Giới Cắt Xén" msgid "Edge Bevel" -msgstr "Cạnh Tròn Cạnh" +msgstr "Bo Tròn Cạnh" + + +msgctxt "WindowManager" +msgid "Edge Crease" +msgstr "Miết Nếp Gấp" msgid "Edge UV Face Select" -msgstr "Cạnh Chọn Mặt UV" +msgstr "Cạnh của Mặt UV được Chọn" msgid "Edge Seam" -msgstr "Vết Sẹo Cảnh" +msgstr "Cạnh Đường Khâu" + + +msgid "Edge Selection" +msgstr "Lựa Chọn Cạnh" msgid "Edge Sharp" -msgstr "Cạnh Bén" +msgstr "Cạnh Sắc Nhọn" msgid "Edge Angle Text" -msgstr "Văn Bản Góc Cạnh" +msgstr "Văn Bản về Góc Độ của Cạnh" msgid "Edge Length Text" -msgstr "Văn Bản Bề Dài Cạnh" +msgstr "Văn Bản về Độ Dài của Cạnh" msgid "Face Angle Text" -msgstr "Văn Bản Góc Mặt" +msgstr "Văn Bản về Góc Độ của Mặt" msgid "Face Area Text" -msgstr "Văn Bản Diện Tích Mặt" +msgstr "Văn Bản về Diện Tích Mặt" msgid "Grease Pencil Vertex" -msgstr "Đỉnh Bút Sáp" +msgstr "Điểm Đỉnh Bút Chì Dầu" msgid "Grease Pencil Vertex Select" -msgstr "Chọn Đỉnh Bút Sáp" +msgstr "Điểm Đỉnh Bút Chì Dầu được Chọn" msgid "Grease Pencil Vertex Size" -msgstr "Kích Cỡ Đỉnh Bút Sáp" +msgstr "Kích Thước Điểm Đỉnh của Bút Chì Dầu" msgid "Face Normal" @@ -93159,83 +102391,83 @@ msgstr "Pháp Tuyến Mặt" msgid "NURBS Active U Lines" -msgstr "NURBS Đường U Hoạt Động" +msgstr "Đường U đang Hoạt Động của NURBS" msgid "NURBS Active V Lines" -msgstr "NURBS Đường V Hoạt Động" +msgstr "Đường V đang Hoạt Động của NURBS" msgid "NURBS U Lines" -msgstr "NURNS Đường U" +msgstr "Đường U của NURBS" msgid "NURBS V Lines" -msgstr "NURBS Đường V" +msgstr "Đường V của NURBS" msgid "Object Origin Size" -msgstr "Kích Cỡ Tọa Độ Gốc Vật Thể" +msgstr "Kích Thước Tọa Độ Gốc của Đối Tượng" msgid "Diameter in pixels for object/light origin display" -msgstr "Đường kích (đơn vị điểm ảnh) cho hiển thị gốc tọa độ vật thể/đèn" +msgstr "Đường kính (trong đơn vị điểm ảnh) để hiển thị tọa độ gốc của đối tượng/nguồn sáng" msgid "Object Selected" -msgstr "Vật Thể Được Chọn" +msgstr "Đối Tượng được Chọn" msgid "Outline Width" -msgstr "Bề Dày Nét Ngoài" +msgstr "Chiều Rộng Đường Viền" msgid "Skin Root" -msgstr "Rễ Da" +msgstr "Gốc của Da" msgid "Split Normal" -msgstr "Chẻ Pháp Tuyến" +msgstr "Pháp Tuyến Tách Phân" msgid "Grease Pencil Keyframe" -msgstr "Bức Ảnh Mẫu Bút Sáp" +msgstr "Khung Khóa Bút Chì Dầu" msgid "Color for indicating Grease Pencil keyframes" -msgstr "Màu cho hiển thị bức ảnh mẫu Bút Sáp" +msgstr "Màu để biểu thị các khung khóa Bút Chì Dầu" msgid "Object Keyframe" -msgstr "Bức Ảnh Mẫu Vật Thể" +msgstr "Khung Khóa Đối Tượng" msgid "Color for indicating object keyframes" -msgstr "Màu cho chỉ rõ bức ảnh mẫu của vật thể" +msgstr "Màu để biểu thị khung khóa của đối tượng" msgid "View Overlay" -msgstr "Lớp Che Màn" +msgstr "Lớp Lồng Khung Nhìn" msgid "Color for wireframe when in edit mode, but edge selection is active" -msgstr "Màu cho sợi dây khi trong chế độ biên tập, mà sự lựa chọn cạnh đang hoạt động" +msgstr "Màu của mạch lưới khi ở trong Chế Độ Biên Soạn, và sự lựa chọn cạnh đang hoạt động" msgid "Theme Widget Color Set" -msgstr "Tập Phong Cách Màu Khiển Tố" +msgstr "Bộ Màu Kiểu Mẫu của Thành Tố Điều Khiển" msgid "Theme settings for widget color sets" -msgstr "Cài đặt phong cách cho tập màu sắc khiển tố" +msgstr "Sắp đặt kiểu mẫu cho các bộ màu của thành tố điều khiển" msgid "Inner" -msgstr "Ở Trong" +msgstr "Bên Trong/Nội Tại" msgid "Inner Selected" -msgstr "Ở Trong Được Chọn" +msgstr "Vùng Bên Trong và được Chọn" msgid "Roundness" @@ -93243,107 +102475,127 @@ msgstr "Độ Tròn" msgid "Amount of edge rounding" -msgstr "Mức tròn hóa cạnh" +msgstr "Lượng làm tròn cạnh" msgid "Shade Down" -msgstr "Nhạt Xuống" +msgstr "Chuyển Sắc ở Dưới" msgid "Shade Top" -msgstr "Nhạt Trên" +msgstr "Chuyển Sắc ở Trên" msgid "Theme Widget State Color" -msgstr "Phong Cách Màu Trạng Thái Khiển Tố" +msgstr "Màu Chủ Đề cho cTrạng Thái của Thành Tố Điều Khiển" msgid "Theme settings for widget state colors" -msgstr "Cài đặt phong cách cho màu trạng thái Khiển Tố" +msgstr "Sắp đặt kiểu mẫu cho các màu về trạng thái của thành tố điều khiển" msgid "Animated" -msgstr "Hoạt Động" +msgstr "Hoạt Họa" msgid "Animated Selected" -msgstr "Được Chọn Có Hoạt Hình" +msgstr "Hoạt Họa và được Chọn" msgid "Changed" -msgstr "Được Đổi" +msgstr "Đã Thay Đổi" msgid "Changed Selected" -msgstr "Được Đổi Được Chọn" +msgstr "Đã Thay Đổi và được Chọn" msgid "Driven" -msgstr "Được Dắt" +msgstr "Bị Điều Vận" msgid "Driven Selected" -msgstr "Được Chọn Có Dắt" +msgstr "Bị Điều Vận được Chọn" msgid "Overridden" -msgstr "Được Vượt Quyền" +msgstr "Vượt Quyền" msgid "Overridden Selected" -msgstr "Được Vượt Quyền Được Chọn" +msgstr "Đã Vượt Quyền và được Chọn" + + +msgid "Time Modifier Segment" +msgstr "Phân Đoạn của Bộ Điều Chỉnh Thời Gian" + + +msgid "Last frame of the segment" +msgstr "Khung hình cuối cùng của phân đoạn" msgid "Loop back and forth" -msgstr "Lặp lại tới lùi" +msgstr "Lặp lại" + + +msgid "Number of cycle repeats" +msgstr "Số chu kỳ lặp lại" + + +msgid "First frame of the segment" +msgstr "Khung hình đầu tiên của phân đoạn" msgid "Marker for noting points in the timeline" -msgstr "Dấu hiệu cho ghi điểm trên thời biểu" +msgstr "Dấu mốc dùng để đánh dấu các điểm (cần ghi nhớ) trên lịch trình thời gian" msgid "Camera that becomes active on this frame" -msgstr "Máy quay phim được trở thành hoạt động trong bức ảnh này" +msgstr "Máy quay phim được kích hoạt ở khung hình này" msgid "The frame on which the timeline marker appears" -msgstr "Số bức ảnh có ký hiệu trong thời biểu" +msgstr "Số khung hình nơi dấu mốc lịch trình thời gian xuất hiện" msgid "Marker selection state" -msgstr "Trạng thái sự lựa chọn của ký hiệu" +msgstr "Trạng thái lựa chọn của dấu mốc" msgid "Window event timer" -msgstr "Đồng hồ sự kiện cửa sổ" +msgstr "Đồng hồ bấm giờ cho sự kiện của Cửa Sổ" msgid "Time since last step in seconds" -msgstr "Thời từ bước cuối (giây)" +msgstr "Thời gian từ bước cuối (trước đây) trong số giây" + + +msgid "Time since the timer started seconds" +msgstr "Thời gian kể từ khi máy đếm thời gian bắt đầu tính bằng giây" msgid "Time Step" -msgstr "Bước Thời Gian" +msgstr "Phân Khoảng Thời Gian" msgid "Stroke Placement (2D View)" -msgstr "Nơi Vẽ Nét (Màn 2D)" +msgstr "Phương Pháp Đặt Nét Vẽ (Khung Nhìn 2D)" msgid "Stick stroke to the image" -msgstr "Giáng nét trên ảnh" +msgstr "Gắn nét vẽ vào hình ảnh" msgid "Stick stroke to the view" -msgstr "Giáng nét trên màn" +msgstr "Gắn nét vẽ chiểu theo góc nhìn" msgid "Annotation Stroke Placement (3D View)" -msgstr "Vị Trí Nét Lời Ghi Chú (Màn Chiếu 3D)" +msgstr "Phương Pháp Đặt Nét Chú Thích (Góc Nhìn 3D)" msgid "How annotation strokes are orientated in 3D space" -msgstr "Làm sao nét lời ghi chú được định hướng trong không gian 3D" +msgstr "Định hướng của nét chú thích trong không gian 3D là thế nào" msgid "Draw stroke at 3D cursor location" @@ -93351,19 +102603,19 @@ msgstr "Vẽ nét tại vị trí của con trỏ 3D" msgid "Stick stroke to surfaces" -msgstr "Giáng nét vẽ trên mặt" +msgstr "Gắn nét vẽ vào bề mặt" msgid "Annotation Stroke Thickness" -msgstr "Bề Dày Nét Lời Ghi Chú" +msgstr "Độ Dày của Nét Chú Thích" msgid "Auto-Keying Mode" -msgstr "Chế Độ Mẫu Tự Động" +msgstr "Chế Độ Tạo Khung Khóa Tự Động" msgid "Mode of automatic keyframe insertion for Objects, Bones and Masks" -msgstr "Chế độ cho tự động chèn bức ảnh mẫu cho Vật Thể, Xương, và Mặt Nạ" +msgstr "Chế độ tự động chèn thêm khung khóa cho các Đối Tượng, Xương, và các Màn Chắn Lọc" msgid "Add & Replace" @@ -93371,63 +102623,63 @@ msgstr "Thêm & Thay Thế" msgid "Curves Sculpt" -msgstr "Khắc Đường Cong" +msgstr "Điêu Khắc Đường Cong" msgid "Curve Profile Widget" -msgstr "Khiển Tố Mặt Cắt Đường Cong" +msgstr "Thành Tố về Mặt Cắt Đường Cong" msgid "Used for defining a profile's path" -msgstr "Dùng cho chỉ định một đường mặt cắt" +msgstr "Sử dụng để định nghĩa một đường dẫn mặt cắt" msgid "Threshold distance for Auto Merge" -msgstr "Khoảng cách ngưỡng cho Tự Động Gồm" +msgstr "Giới hạn khoảng cách dành cho quá trình Hợp Nhất Tự Động" msgid "Grease Pencil Interpolate" -msgstr "Suy Nội Bút Sáp" +msgstr "Nội Suy Bút Chì Dầu" msgid "Settings for Grease Pencil Interpolation tools" -msgstr "Cài đặt cho dụng cụ Suy Nội Bút Sáp" +msgstr "Sắp đặt cho các công cụ Nội Suy Bút Chì Dầu" msgid "Grease Pencil Sculpt" -msgstr "Bút Sáp Khắc" +msgstr "Điêu Khắc Nét Bút Chì Dầu" msgid "Settings for stroke sculpting tools and brushes" -msgstr "Cài đặt cho dụng cụ nét khắc và nét bút" +msgstr "Sắp đặt cho các công cụ điêu khắc nét và các đầu bút" msgid "Stroke Placement (3D View)" -msgstr "Nơi Vẽ Nét (Màn chiếu 3D)" +msgstr "Phương Pháp Đặt Nét Vẽ (Khung Nhìn 3D)" msgid "Draw stroke at Object origin" -msgstr "Vẽ nét tại gốc tọa độ Vật Thể" +msgstr "Vẽ nét tại tọa độ gốc của Đối Tượng" msgid "Stick stroke to other strokes" -msgstr "Giáng nét vẽ trên nét vẽ khác" +msgstr "Gắn nét vẽ vào các nét vẽ khác" msgid "Stroke Snap" -msgstr "Hút Dính Nét" +msgstr "Bám Dính Nét Vẽ" msgid "All Points" -msgstr "Tất Cả Điểm" +msgstr "Toàn Bộ các Điểm" msgid "Snap to all points" -msgstr "Hút dính đến hết điểm" +msgstr "Bám dính vào toàn bộ các điểm" msgid "Snap to first and last points and interpolate" -msgstr "Hút dính đến điểm đầu và cuối và suy nội" +msgstr "Bám dính vào điểm đầu tiên, cuối cùng, và nội suy" msgid "First Point" @@ -93435,200 +102687,230 @@ msgstr "Điểm Đầu" msgid "Snap to first point" -msgstr "Hút dính đến điểm đầu" +msgstr "Bám dính vào điểm đầu tiên" msgid "New Keyframe Type" -msgstr "Loại Bức Ảnh Mẫu Mới" +msgstr "Loại Khung Khóa Mới" msgid "Type of keyframes to create when inserting keyframes" -msgstr "Loại bức ảnh mẫu để chế tạo khi chèn bức ảnh mẫu" +msgstr "Loại khung khóa sẽ kiến tạo khi chèn thêm chúng" msgid "Lock Markers" -msgstr "Khóa Ký Hiệu" +msgstr "Khóa Dấu Mốc" msgid "Prevent marker editing" -msgstr "Không cho biên tập ký hiệu" +msgstr "Ngăn ngừa sự biên soạn dấu mốc" msgid "Lock Object Modes" -msgstr "Khóa Chế Độ Vật Thể" +msgstr "Chế Độ Khóa Đối Tượng" msgid "Restrict selection to objects using the same mode as the active object, to prevent accidental mode switch when selecting" -msgstr "Hạn chế sự lựa chọn đến vật thể đang dùng cũng chế độ của vật thể hoạt động, cho tránh sơ ý thay đổi chế độ khi đang lựa chọn" +msgstr "Hạn chế lựa chọn đối với các đối tượng sử dụng cùng một chế độ với đối tượng đang hoạt động, để ngăn ngừa việc chuyển đổi chế độ bất ngờ khi chọn lọc" msgid "Mesh Selection Mode" -msgstr "Chế Độ Chọn Mạng Lưới" +msgstr "Chế Độ Lựa Chọn Khung Lưới" msgid "Which mesh elements selection works on" -msgstr "Phần tử mạng lưới nào sự lựa chọn được tác dụng" +msgstr "Sự lựa chọn sẽ hoạt động trên phần tử nào của khung lưới" msgid "Normal Vector" -msgstr "Vectơ Pháp Tuyến" +msgstr "Véctơ Pháp Tuyến" msgid "Normal Vector used to copy, add or multiply" -msgstr "Vectơ pháp tuyến được dùng để sao chép, cộng hay nhân" +msgstr "Véctơ Pháp Tuyến sử dụng để sao chép, cộng, hoặc nhân" msgid "Plane Axis" -msgstr "Trục Mặt Phẳng" +msgstr "Trục Bình Diện" msgid "The axis used for placing the base region" -msgstr "Trục được dùng cho đặt vị trí cho vùng cơ sở" +msgstr "Trục sử dụng để đặt vùng cơ sở" msgid "Auto Axis" -msgstr "Trục Tự Động" +msgstr "Tự Động chọn Trục" msgid "Select the closest axis when placing objects (surface overrides)" -msgstr "Chọn trục gần nhất khi đặt vị trí vật thể (đồ vượt quyền bề mặt)" +msgstr "Chọn trục gần nhất khi đặt đối tượng xuống (vượt quyền bề mặt)" msgid "The initial depth used when placing the cursor" -msgstr "Độ sâu khởi động khi đặt vị trí con trỏ" +msgstr "Độ sâu khởi đầu sử dụng khi đặt con trỏ" msgid "Start placing on the surface, using the 3D cursor position as a fallback" -msgstr "Bắt đầu đặt vị trí trên bề mặt, dùng con trỏ 3D nếu có vấn đề" +msgstr "Bắt đầu đặt lên bề mặt, sử dụng vị trí của con trỏ 3D làm chỗ dựa nếu có vấn đề" msgid "Cursor Plane" -msgstr "Mặt Phẳng Con Trỏ" +msgstr "Bề Diện của Con Trỏ" msgid "Start placement using a point projected onto the orientation axis at the 3D cursor position" -msgstr "Bắt đầu đặt vị trí dùng một điểm được chiếu trên trục định hướng tại vị trí của con trỏ 3D" +msgstr "Khởi đầu đặt xuống, dùng một điểm dự phóng trên trục định hướng, tại vị trí của con trỏ 3D" msgid "Cursor View" -msgstr "Màn Nhìn Con Trỏ" +msgstr "Góc Nhìn của Con Trỏ" msgid "Start placement using a point projected onto the view plane at the 3D cursor position" -msgstr "Bắt đầu đặt vị trí dùng một điểm được chiếu trên mặt phẳng màn nhìn tại vị trí con trỏ 3D" +msgstr "Khởi đầu đặt xuống, dùng một điểm dự phóng trên bề diện quan sát tại vị trí của con trỏ 3D" msgid "Use the surface normal (using the transform orientation as a fallback)" -msgstr "Dùng pháp tuyến bề mặt (dùng định hướng của biến hóa nếu có sự cố)" +msgstr "Sử dụng pháp tuyến bề mặt (dùng định hướng biến hóa làm nền dự phòng)" msgid "Use the current transform orientation" -msgstr "Dùng định hướng của biến hóa hiện tại" +msgstr "Sử dụng định hướng biến hóa hiện tại" msgid "Display size for proportional editing circle" -msgstr "Kích cỡ hiển thị cho vòng tròn biên tập đồng biến" +msgstr "Hiển thị kích thước cho vòng tròn biên soạn cân đối" msgctxt "Curve" msgid "Proportional Editing Falloff" -msgstr "Sự Giảm Biên Tập Đồng Biến" +msgstr "Dốc Suy Giảm trong Biên Soạn Cân Đối" msgid "UV Local View" -msgstr "Màn UV Địa Phương" +msgstr "Góc Nhìn UV Cục Bộ" msgid "Display only faces with the currently displayed image assigned" -msgstr "Chỉ hiển thị các mặt có ảnh đang hiển thị được chỉ định" +msgstr "Duy hiển thị các mặt với hình ảnh biểu hiện hiện tại đã được ấn định cho mà thôi" + + +msgctxt "Unit" +msgid "Snap Anim Element" +msgstr "Bám Dính Phần Tử Hoạt Họa" msgid "Type of element to snap to" -msgstr "Hút dính đến loại phần tử nào" +msgstr "Thể loại phần tử để bám dính vào" + + +msgid "Snap to frame" +msgstr "Bám Dính vào Khung Hình" + + +msgid "Snap to seconds" +msgstr "Bám Dính vào Số Giây" + + +msgctxt "Unit" +msgid "Nearest Marker" +msgstr "Dấu Mốc Gần Nhất" msgid "Snap to nearest marker" -msgstr "Hút dính đến ký hiệu gần nhất" +msgstr "Bám dính vào dấu mốc gần nhất" msgid "Snap Element" -msgstr "Phần Tử Hút Dính" +msgstr "Phần Tử Bám Dính" + + +msgid "Type of element for the 'Snap With' to snap to" +msgstr "Thể loại phần tử ‘Bám Dính Với' để bám dính vào" + + +msgid "Project Mode" +msgstr "Chế Độ Dự Án" + + +msgid "Type of element for individual transformed elements to snap to" +msgstr "Thể loại phần tử để các cá nhân phần tử biến hóa có thể bám dính vào" msgid "Snap to" -msgstr "Hút Dính đến" +msgstr "Bám dính vào" msgid "The target to use while snapping" -msgstr "Mục tiểu khi đang hút dính" +msgstr "Mục tiêu sử dụng trong khi bám dính" msgid "Snap to all geometry" -msgstr "Hút dính đến hết hình dạng" +msgstr "Bám dính vào toàn bộ hình học" msgid "Use the current snap settings" -msgstr "Dùng cài đặt hiện tại" +msgstr "Sử dụng sắp đặt về bám dính hiện tại" msgid "Face Nearest Steps" -msgstr "Bước Mặt Gần Nhất" +msgstr "Số Bước Mặt Gần Nhất" msgid "Number of steps to break transformation into for face nearest snapping" -msgstr "Số lượng bước để chia sẽ biến hóa xa trong cho hút dính đến mặt gần nhất" +msgstr "Số bước để phân rã biến hóa thành Mặt gần nhất với bám dính" msgid "Snap Node Element" -msgstr "Phần Tử Giao Điểm Hút Dịnh" +msgstr "Phần Tử Nút để Bám Dính" msgid "Snap to grid" -msgstr "Hút đến đồ thị" +msgstr "Bám dính vào khung lưới đồ thị" msgid "Node X" -msgstr "Giao Điểm X" +msgstr "Nút X" msgid "Snap to left/right node border" -msgstr "Hút dính đến ranh giới trái/phải" +msgstr "Bám dính vào bên trái/phải của ranh giới nút" msgid "Node Y" -msgstr "Giao Điểm Y" +msgstr "Nút Y" msgid "Snap to top/bottom node border" -msgstr "Hút dính đến ranh giới trên/dưới" +msgstr "Bám dính vào phần trên/dưới của ranh giới nút" msgid "Node X / Y" -msgstr "Giao Điểm X / Y" +msgstr "Nút X / Y" msgid "Snap to any node border" -msgstr "Hút dính đến bất cứ ranh giới nào" +msgstr "Bám dính vào bất cứ ranh giới nào của nút" msgid "Snap Target" -msgstr "Mục Tiêu Hút Dính" +msgstr "Mục Tiêu Bám Dính" msgid "Which part to snap onto the target" -msgstr "Hút dính đến phần nào của mục tiêu" +msgstr "Phần bám dính vào mục tiêu" msgid "Snap UV Element" -msgstr "Phần Tử UV Hút Dính" +msgstr "Bám Dính Phần Tử UV" msgid "Snap to increments of grid" -msgstr "Hút dình đến bước của đồ thị" +msgstr "Bám dính vào khoảng cách của đồ thị" msgid "Mesh Statistics Visualization" -msgstr "Hiển Thị Thống Kê Mạng Lưới" +msgstr "Diễn Họa Thông Tin Thống Kê về Khung Lưới" msgid "Transform Pivot Point" @@ -93636,331 +102918,355 @@ msgstr "Biến Hóa Điểm Tựa" msgid "Unified Paint Settings" -msgstr "Cài Đặt Sơn Thống Nhất" +msgstr "Sắp Đặt Sơn Hợp Nhất" msgid "Weight Paint Auto-Normalize" -msgstr "Sơn Quyền Lượng Tự Động-Đơn Vị Hóa" +msgstr "Sơn Trọng Lượng Tự Động Bình Thường Hóa" msgid "Ensure all bone-deforming vertex groups add up to 1.0 while weight painting" -msgstr "Bắt hết nhóm làm méo xương cộng lên đến 1.0 khi sơn quyền lượng" +msgstr "Đảm bảo là toàn bộ các nhóm điểm đỉnh biến dạng xương được cộng lại thành 1,0 trong khi sơn trọng lượng" msgid "Changing edge seams recalculates UV unwrap" -msgstr "Đổi vết sẹo cạnh sẽ tính lại mở gói UV" +msgstr "Những thay đổi các đường khâu của cạnh sẽ gây ra sự tính toán lại về mở gói UV" msgid "Automerge" -msgstr "Tự Động Gồm" +msgstr "Tự Động Hợp Nhất" msgid "Join by distance last drawn stroke with previous strokes in the active layer" -msgstr "Kết nối bằng khoảng cách của nét vẽ cuối giữa các nét vẽ trước trong lớp hoạt động" +msgstr "Hội nhập, theo khoảng cách, nét được vẽ sau cùng với nét vẽ trước đây, trong tầng lớp đang hoạt động" msgid "Use Additive Drawing" -msgstr "Dùng Vẽ Cộng Lên" +msgstr "Sử Dụng Phương Pháp Vẽ Gia Tăng" msgid "When creating new frames, the strokes from the previous/active frame are included as the basis for the new one" -msgstr "Khi chế tạo bức ảnh mới, nét từ bức ảnh trước/hoạt động được gồm làm cơ sở cho bức ảnh mới" +msgstr "Khi sinh tạo các khung hình mới, các nét từ khung hình trước/đang hoạt động sẽ được bao gồm để làm cơ sở cho cái mới" msgid "Draw Strokes on Back" -msgstr "Vẽ Nét ở Phía Dưới" +msgstr "Vẽ Nét Ở Đằng Sau" msgid "When draw new strokes, the new stroke is drawn below of all strokes in the layer" -msgstr "Khi vẽ nét mới, nét mới được vẽ ở dưới hết nét trong lớp" +msgstr "Khi vẽ các nét mới, nét mới sẽ được vẽ ở dưới toàn bộ các nét trong tầng lớp" msgid "Selection Mask" -msgstr "Mặt Nạ Sự Lựa Chọn" +msgstr "Chắn Lọc vùng Lựa Chọn" msgid "Only sculpt selected stroke points" -msgstr "Chỉ khắc các điểm nét được chọn" +msgstr "Chỉ điêu khắc các điểm được chọn của nét vẽ mà thôi" msgid "Only sculpt selected stroke points between other strokes" -msgstr "Chỉ khắc các điểm nét được chọn giữa các nét khác" +msgstr "Chỉ điêu khắc các điểm được chọn của nét vẽ giữa các nét khác mà thôi" msgid "Only sculpt selected stroke" -msgstr "Chỉ khắc các nét được chọn" +msgstr "Chỉ điêu khắc các nét vẽ được chọn mà thôi" msgid "Only Endpoints" -msgstr "Chỉ Đỉnh" +msgstr "Duy Điểm Đầu/Đuôi" msgid "Only use the first and last parts of the stroke for snapping" -msgstr "Chỉ dùng đỉnh đầu và cuối của nét vẽ cho hút dính" +msgstr "Chỉ dùng phần đầu và cuối của nét vẽ để bám dính thôi" msgid "Compact List" -msgstr "Danh Sách Gọn" +msgstr "Danh Sách Ngắn Gọn" msgid "Show compact list of color instead of thumbnails" -msgstr "Cho xem danh sách gọn có màu thay thế tấm ảnh nhỏ" +msgstr "Hiển thị danh sách ngắn gọn của màu sắc thay vì của các hình thu nhỏ" msgid "Only paint selected stroke points" -msgstr "Chỉ sơn các điểm nét được chọn" +msgstr "Duy sơn các điểm nét vẽ được chọn" msgid "Only paint selected stroke points between other strokes" -msgstr "Chỉ sơn các điểm nét được chọn giữa các nét khác" +msgstr "Duy sơn các điểm nét vẽ được chọn nằm giữa các nét vẽ khác" msgid "Only paint selected stroke" -msgstr "Chỉ sơn nét được chọn" +msgstr "Duy sơn nét vẽ được chọn" msgid "Add weight data for new strokes" -msgstr "Thêm dữ liệu quyền lượng cho nét mời" +msgstr "Thêm dữ liệu trọng lượng vào các nét vẽ mới" msgid "When creating new strokes, the weight data is added according to the current vertex group and weight, if no vertex group selected, weight is not added" -msgstr "Khi chế tạo nét mới, dữ liệu quyền lượng được cộng tùy theo nhóm đỉnh và quyền lượng hiện tại, nếu không có nhóm đỉnh được chọn, sẽ không cộng quyền lượng" +msgstr "Khi tạo các nét vẽ mới, dữ liệu trọng lượng sẽ được thêm vào tùy theo nhóm điểm đỉnh hiện tại và trọng lượng, nếu không có nhóm điểm đỉnh nào đã được chọn thì trọng số sẽ không được thêm vào" msgid "Cycle-Aware Keying" -msgstr "Lặp Lại Bức Ảnh Mẫu Trong Chu Trình" +msgstr "Khóa Hóa Cảnh Giác về sự Tuần Hoàn" msgid "For channels with cyclic extrapolation, keyframe insertion is automatically remapped inside the cycle time range, and keeps ends in sync. Curves newly added to actions with a Manual Frame Range and Cyclic Animation are automatically made cyclic" -msgstr "Cho các kênh có suy ngoại chu trình, chèn bức ảnh mẫu tự động được ánh xạ lại trong phạm vi chu trình, và sẽ kết thúc đồng bộ. Đườg cong mới bổ sung vào các hành động có Phạm Vi Bức Ảnh Bằng Tay và Hoạt Hình Chu Trình sang tự động chu trình" +msgstr "Đối với các kênh có ngoại suy tuần hoàn, việc chèn khung khóa sẽ được tự động tái ánh xạ trong phạm vi thời gian chu kỳ, và duy trì các đầu (đầu/đít) đồng bộ hóa. Các đường cong mới được thêm vào các hành động có Phạm Vi Khung Hình Thủ Công và Hoạt Họa Tuần Hoàn sẽ được tự động trở thành tuần hoàn" msgid "Auto Keying" -msgstr "Bức Ảnh Mẫu Tự Động" +msgstr "Tự Động Tạo Khung Khóa" msgid "Automatic keyframe insertion for Objects, Bones and Masks" -msgstr "Tự động chèn bức ảnh mẫu cho Vật Thể, Xương, và Mặt Nạ" +msgstr "Tự động chèn thêm khung khóa cho các Đối Tượng, Xương, và các Màn Chắn Lọc" msgid "Auto Keyframe Insert Keying Set" -msgstr "Tập Bức Ảnh Mẫu Tự Động Chèn" +msgstr "Bộ Khóa Tự Động Chèn Thêm" msgid "Automatic keyframe insertion using active Keying Set only" -msgstr "Tự động chèn bức ảnh mẫu chỉ dùng Tập Mẫu hoạt động" +msgstr "Tự động chèn thêm khung khóa từ Bộ Khóa đang hoạt động mà thôi" msgid "Weight Paint Lock-Relative" -msgstr "Sơn Quyền Lượng Khóa-Tương Đối" +msgstr "Sơn Trọng Lượng Khóa Họ Hàng" msgid "Display bone-deforming groups as if all locked deform groups were deleted, and the remaining ones were re-normalized" -msgstr "Hiển thị các nhóm méo hóa xương như hết các nhóm méo hóa bị khóa được xóa, và các nhóm còn được đơn vị hóa lại" +msgstr "Hiển thị các nhóm biến dạng xương tựa như là toàn bộ các nhóm biến dạng xương bị khóa đã bị xóa sạch, những cái còn lại thì được bình thường hóa" msgid "Auto Merge Vertices" -msgstr "Tự Động Gồm Đỉnh" +msgstr "Tự Động Hợp Nhất các Điểm Đỉnh" msgid "Automatically merge vertices moved to the same location" -msgstr "Từ động gồm đỉnh được di chuyển đến cùng vị trí" +msgstr "Tự động hợp nhất các điểm đỉnh được di chuyển đến cùng một vị trí" msgid "Split Edges & Faces" -msgstr "Chẻ Cạnh % & Mặt" +msgstr "Tách Phân Cạnh và Các Mặt" msgid "Automatically split edges and faces" -msgstr "Tự Động chẻ các cạnh và mặt" +msgstr "Tự động tách phân các cạnh và các mặt" msgid "Weight Paint Multi-Paint" -msgstr "Sơn Quyền Lượng Đa-Sơn" +msgstr "Sơn Trọng Lượng Đồng Loạt" msgid "Paint across the weights of all selected bones, maintaining their relative influence" -msgstr "Sơn qua hết quyền lượng của xương được chọn, giữ nguyên sự ảnh hướng tướng đối của chúng nó" +msgstr "Sơn đè lên trọng lượng của toàn bộ các xương được chọn, duy trì ảnh hưởng tương đối của chúng" msgid "Proportional Editing Actions" -msgstr "Biên Tập Đồng Biến Hành Động" +msgstr "Biên Soạn Cân Đối các Hành Động" msgid "Proportional editing in action editor" -msgstr "Biên tập đồng biến trong bộ biên sọan hành động" +msgstr "Biên soạn cân đối trong bộ biên soạn hành động" msgid "Proportional Editing using connected geometry only" -msgstr "Biên Tập Đồng Biến chỉ dùng hình dạng được kết nối" +msgstr "Biên Soạn Cân Đối chỉ sử dụng hình học kết nối với nhau thôi" msgid "Proportional edit mode" -msgstr "Chế độ biên tập đồng biến" +msgstr "Chế độ biên soạn cân đối" msgid "Proportional Editing Objects" -msgstr "Biên Tập Vặt Thể Đồng Biến" +msgstr "Đối Tượng Biên Soạn Cân Đối" msgid "Proportional editing mask mode" -msgstr "Chế độ biên tập mặt nạ kiểu đồng biến" +msgstr "Chế độ dùng màn chắn lọc biên soạn cân đối" msgid "Proportional editing object mode" -msgstr "Chế độ biên tập vật thể kiểu đồng biến" +msgstr "Chế độ đối tượng biên soạn cân đối" + + +msgid "Proportional Editing F-Curves" +msgstr "Biên Soạn Cân Đối Đường Cong-F" + + +msgid "Proportional editing in F-Curve editor" +msgstr "Biên soạn cân đối trong trình biên soạn Đường Cong-F" msgid "Projected from View" -msgstr "Chiếu Từ Màn" +msgstr "Phóng Chiếu từ Góc Nhìn" msgid "Proportional Editing using screen space locations" -msgstr "Biên Tập Đồng Biến dùng vị trí không gian màn" +msgstr "Biên Soạn Cân Đối sử dụng các vị trí không gian màn hình" msgid "Layered" -msgstr "Có Lớp" +msgstr "Đặt Thành Tầng Lớp" msgid "Add a new NLA Track + Strip for every loop/pass made over the animation to allow non-destructive tweaking" -msgstr "Thêm một rãnh NLA + Đoạn cho mỗi lặp lại/vòng làm trên họat hình để cho chỉnh mà không pha hoạt hình ban đầu" +msgstr "Tạo thêm một Rãnh NLA + Dải phim cho mỗi vòng/lượt thi hành trên đoạn hoạt họa, hòng cho phép chỉnh sửa một cách an toàn, không hủy hoại" msgid "Snap during transform" -msgstr "Hút dính khi biến hóa" +msgstr "Bám dính trong khi biến hóa" msgid "Align Rotation to Target" -msgstr "Sắp Xếp Xoay đến Mục Tiêu" +msgstr "Căn Chỉnh Xoay Chiều vào Mục Tiêu" msgid "Align rotation with the snapping target" -msgstr "Sắp xếp xoay với mục tiêu hút dính" +msgstr "Căn chỉnh sự xoay chiều với mục tiêu bám dính vào" + + +msgid "Enable snapping when transforming keyframes" +msgstr "Cho phép bám dính khi biến hóa các khung khóa" msgid "Exclude back facing geometry from snapping" -msgstr "Không cho hút dính với hình dạng mặt phía sau " +msgstr "Không bám dính hình học ở mặt sau" msgid "Snap onto Edited" -msgstr "Hút Dính đến đã Biên Tập" +msgstr "Bám Dính vào cái Chỉnh Sửa" msgid "Snap onto non-active objects in Edit Mode (Edit Mode Only)" -msgstr "Hút dính đến vật thể không hoạt động trong Chế Độ Biên Tập (chỉ Chế Độ Biên Tập)" +msgstr "Bám dính vào các đối tượng không chỉnh sửa được trong Chế Độ Biên Soạn (Duy trong Chế Độ Biên Soạn)" msgid "Absolute Grid Snap" -msgstr "Hút Dính Đổ Thị Tuyệt Đối" +msgstr "Bám Dính vào Khung Lưới Đồ Thị Tuyệt Đối" msgid "Absolute grid alignment while translating (based on the pivot center)" -msgstr "Sắp xếp đồ thị tuyệt đối khi dịch (tùy trung tâm điểm tựa)" +msgstr "Căn chỉnh tuyệt đối với khung lưới đồ thị khi dịch chuyển (dựa vào tâm của điểm tựa)" msgid "Snap Node during transform" -msgstr "Hút dính Giao Điểm khi biến hóa" +msgstr "Bám Dính Nút trong khi biến hóa" msgid "Snap onto Non-edited" -msgstr "Hút dính đến Chưa Biên Tập" +msgstr "Bao dính vào cái Không Chỉnh Sửa được" msgid "Snap onto objects not in Edit Mode (Edit Mode Only)" -msgstr "hút Dính đếng vật thể không nhập Chế Độ Biên Tập (chỉ Chế Độ Biên Tập)" +msgstr "Bám dính vào các đối tượng không nằm trong Chế Độ Biên Soạn (Duy trong Chế Độ Biên Soạn)" msgid "Snap Peel Object" -msgstr "Hút Dính Vật Thể Lột" +msgstr "Bám Dính vào Đối Tượng Bóc" msgid "Consider objects as whole when finding volume center" -msgstr "Dùng toàn bộ vật thể khi tìm trung tâm thể tích" +msgstr "Cân nhắc các đối tượng như một tổng thể khi lùng tìm trung tâm thể tích" msgid "Use Snap for Rotation" -msgstr "Dùng Hút Dính cho Xoay" +msgstr "Bám Dính trong Xoay Chiều" msgid "Rotate is affected by the snapping settings" -msgstr "Xoay được ảnh hưởng bằng cài đặt hút dính" +msgstr "Xoay chiều bị tác động bởi sắp đặt về bám dính" msgid "Use Snap for Scale" -msgstr "Dùng Hút Dính cho Phóng To" +msgstr "Bám Dính trong Tỷ Lệ Hóa" msgid "Scale is affected by snapping settings" -msgstr "Phóng to được ảnh hưởng bằng cài đặt hút dính" +msgstr "Tỷ lệ bị tác động bởi sắp đặt về bám dính" msgid "Snap onto Selectable Only" -msgstr "Chỉ Hút Dính đến Được Chọn" +msgstr "Duy Bám Dính vào cái Có Thể Chọn" msgid "Snap only onto objects that are selectable" -msgstr "Chỉ hút dính đến những vật thể có thể chọn" +msgstr "Chỉ bám dính vào các đối tượng có thể chọn mà thôi" msgid "Snap onto Active" -msgstr "Hút Dính Đến Hoạt Động" +msgstr "Bám Dính vào cái đang Hoạt Động" msgid "Snap onto itself only if enabled (Edit Mode Only)" -msgstr "Chỉ hút dính đến một mình nếu được bật (Chỉ trong Chế Độ Biên Tập)" +msgstr "Duy bám dính vào chính bản thân mình nếu cho phép (chỉ trong Chế Độ Biên Soạn) mà thôi" msgid "Snap to strip edges or current frame" -msgstr "Hút dính đến cạnh đoạn hay bức ảnh hiện tại" +msgstr "Bám dính vào các mép dải hoặc vào khung hình hiện tại" + + +msgid "Absolute Time Snap" +msgstr "Bám Dính Thời Gian Tuyệt Đối" + + +msgid "Absolute time alignment when transforming keyframes" +msgstr "Căn chỉnh thời gian tuyệt đối khi biến hóa các khung khóa" msgid "Snap to Same Target" -msgstr "Hút Dính đến Cùng Mục Tiêu" +msgstr "Bám Dính vào cùng một Mục Tiêu" msgid "Snap only to target that source was initially near (Face Nearest Only)" -msgstr "Chỉ hút dính đến mục tiêu có nguồn khởi động gần (Chỉ Mặt Gần Nhất)" +msgstr "Chỉ bám dính vào mục tiêu lúc đầu nằm gần nguồn (Duy Mặt Gần Nhất) mà thôi" msgid "Use Snap for Translation" -msgstr "Dùng Hút Dính cho Dịch" +msgstr "Sử Dụng Bám Dính trong Dịch Chuyển" msgid "Move is affected by snapping settings" -msgstr "Chuyển động được ảnh hưởng bằng cài đặt hút dính" +msgstr "Di chuyển sẽ bị ảnh hưởng bởi sắp đặt về bám dính" msgid "Snap UV during transform" -msgstr "Hút dính UV khi biến hóa" +msgstr "Bám dính UV trong khi biến hóa" msgid "Correct Face Attributes" -msgstr "Sửa Đặc Điểm Mặt" +msgstr "Chỉnh Sửa các Thuộc Tính của Mặt" + + +msgid "Correct data such as UVs and color attributes when transforming" +msgstr "Sửa chữa dữ liệu, như UV và các thuộc tính màu, trong khi đang biến hóa" msgid "Keep Connected" -msgstr "Giữ Được Kết Nối" +msgstr "Giữ Kết Nối" msgid "During the Face Attributes correction, merge attributes connected to the same vertex" -msgstr "Khi chỉnh sửa Đặc Điểm Mặt, gồm đặc điểm đang kết nối đến cùng đỉnh " +msgstr "Trong quá trình chỉnh sửa các Thuộc Tính của Mặt, hợp nhất các thuộc tính kết nối vào cùng một điểm đỉnh" msgid "Transform Origins" -msgstr "Biến Hóa Góc Tọa Độ" +msgstr "Biến Hóa Tọa Độ Gốc" msgid "Transform object origins, while leaving the shape in place" -msgstr "Biến hóa gốc đồ thị củ vật thể, khi giữ nguyên hình dạng" +msgstr "Biến hóa tọa độ gốc của đối tượng, trong khi giữ nguyên hình dạng" msgid "Only Locations" -msgstr "Chỉ Vị Trí" +msgstr "Duy Vị Trí" msgid "Only transform object locations, without affecting rotation or scaling" -msgstr "Chỉ biến hóa vị trí của các vật thể, mà không ảnh hưởng xoay hay phóng to" +msgstr "Duy biến hóa địa điểm đối tượng mà thôi, không tác động đến xoay chiều hoặc tỷ lệ" msgid "Transform Parents" @@ -93968,27 +103274,27 @@ msgstr "Biến Hóa Phụ Huynh" msgid "Transform the parents, leaving the children in place" -msgstr "Biến hóa phụ huynh, mà giữ nguyên các con cái" +msgstr "Biến hóa các phụ huynh mà thôi, để nguyên con cái" msgid "UV Sync Selection" -msgstr "Sự Lựa Chọn UV Đồng Bộ" +msgstr "UV Đồng Bộ Hóa Lựa Chọn" msgid "Keep UV and edit mode mesh selection in sync" -msgstr "Giữ sự lựa chọn đồng bộ trong chế độ biên tập UV và mạng lưới" +msgstr "Duy trì sự đồng bộ hóa giữa UV và lựa chọn của khung lưới trong Chế Độ Biên Soạn" msgid "Relaxation Method" -msgstr "Phương Pháp Giãn Ra" +msgstr "Phương Pháp Nới Lỏng" msgid "Algorithm used for UV relaxation" -msgstr "Giải thuật được dùng cho giãn ra" +msgstr "Thuật toán sử dụng để chậm rãi" msgid "Use Laplacian method for relaxation" -msgstr "Vài phương pháp giãn ra Laplace" +msgstr "Dùng phương pháp chậm rãi (relaxation) Laplace" msgid "HC" @@ -93996,19 +103302,23 @@ msgstr "HC" msgid "Use HC method for relaxation" -msgstr "Dùng phương pháp giãn ra HC" +msgstr "Dùng phương pháp chậm rãi (relaxation) HC (Humphrey's Classes)" + + +msgid "Use Geometry (cotangent) relaxation, making UVs follow the underlying 3D geometry" +msgstr "Sử dụng sự nới lỏng Hình Học (cotang), làm cho các UV đi theo hình học 3D nền tảng" msgid "UV Sculpt" -msgstr "Khắc UV" +msgstr "Điêu Khắc UV" msgid "Sculpt All Islands" -msgstr "Khắc Hết Đảo" +msgstr "Điêu Khắc: Toàn Bộ các Hải Đảo" msgid "Brush operates on all islands" -msgstr "Áp dụng bút với hết đảo" +msgstr "Đầu bút hoạt động trên toàn bộ các hải đảo" msgid "Lock Borders" @@ -94016,102 +103326,102 @@ msgstr "Khóa Ranh Giới" msgid "Disable editing of boundary edges" -msgstr "Tắt biên tập cạnh ranh giới" +msgstr "Không cho phép biên soạn các cạnh ranh giới" msgid "UV Selection Mode" -msgstr "Chế Độ Sự Lựa Chọn UV" +msgstr "Chế Độ Lựa Chọn UV" msgid "UV selection and display mode" -msgstr "Chế độ sự lựa chọn và hiển thị UV" +msgstr "Chế độ lựa chọn và hiển thị UV" msgid "Sticky Selection Mode" -msgstr "Chế Độ Sự Lựa Chọn Dính" +msgstr "Chế Độ Lựa Chọn Dính Kết" msgid "Method for extending UV vertex selection" -msgstr "Phương pháp cho mở rộng sự lựa chọn đỉnh UV" +msgstr "Chế độ dành cho việc mở rộng vùng lựa chọn điểm đỉnh của UV" msgid "Sticky vertex selection disabled" -msgstr "Tắt sự lựa chọn đỉnh dính" +msgstr "Tắt sự lựa chọn điểm đỉnh dính kết" msgid "Shared Location" -msgstr "Vị Trí Chia Sẻ" +msgstr "Có Cùng Vị Trí" msgid "Select UVs that are at the same location and share a mesh vertex" -msgstr "Chọn UV tại cùng vị trí và có cùng một đỉnh mạng lưới" +msgstr "Chọn UV nằm tại cùng một vị trí và có chung một điểm đỉnh khung lưới" msgid "Shared Vertex" -msgstr "Đỉnh Chia Sẻ" +msgstr "Có Cùng Điểm Đỉnh" msgid "Select UVs that share a mesh vertex, whether or not they are at the same location" -msgstr "Chọn các đỉnh UV có chia sẻ một đỉnh mạng lưới, mặc dù không ở tại cùng vị trí" +msgstr "Chọn các UV có cùng một điểm đỉnh khung lưới, bất kể chúng có nằm ở cùng một vị trí hay không" msgid "Filter Vertex groups for Display" -msgstr "Lọc nhóm Đỉnh cho Chiếu" +msgstr "Thanh Lọc các Nhóm Điểm Đỉnh để Hiển Thị" msgid "All Vertex Groups" -msgstr "Hết Nhóm Đỉnh" +msgstr "Toàn Bộ Các Nhóm Điểm Đỉnh" msgid "Vertex Groups assigned to Deform Bones" -msgstr "Nhóm Đỉnh được chỉ định cho Xương Méo" +msgstr "Nhóm điểm đỉnh chỉ định cho các Xương Biến Dạng" msgid "Vertex Groups assigned to non Deform Bones" -msgstr "Nhóm Đỉnh được chỉ định cho Xương Không Méo" +msgstr "Nhóm Điểm Đỉnh đã chỉ định cho Xương Không Biến Dạng" msgid "Mask Non-Group Vertices" -msgstr "Mặt Nạ Đỉnh Không Thuộc Nhóm Nào" +msgstr "Chắn các Điểm Đỉnh Không Nhóm" msgid "Display unweighted vertices" -msgstr "Hiển thị đỉnh không có quyền lượng" +msgstr "Hiển thị các điểm đỉnh không có trọng lượng" msgid "Show vertices with no weights in the active group" -msgstr "Hiện các đỉnh không có quyền lượng trong nhóm hoạt động" +msgstr "Hiển thị các điểm đỉnh không có trọng lượng nằm trong nhóm đang hoạt động" msgid "Show vertices with no weights in any group" -msgstr "Hiến đỉnh không có quyền lượng trong bất cứ nhóm nào" +msgstr "Hiển thị các điểm đỉnh không có trọng lượng nằm trong bất cứ nhóm nào" msgid "Vertex Group Weight" -msgstr "Quyền Lượng Nhóm Đỉnh" +msgstr "Trọng Lượng Nhóm Điểm Đỉnh" msgid "Weight to assign in vertex groups" -msgstr "Quyền lượng để chỉ định trong nhóm đỉnh" +msgstr "Trọng lượng để chỉ định trong các nhóm điểm đỉnh" msgctxt "View3D" msgid "Drag" -msgstr "Lực Cản" +msgstr "Kéo Rê" msgid "Action when dragging in the viewport" -msgstr "Hành động khi kéo màn chiếu" +msgstr "Hành động khi kéo rê trong cổng nhìn" msgctxt "View3D" msgid "Active Tool" -msgstr "Dụng Cụ Hoạt Động" +msgstr "Công Cụ đang Hoạt Động" msgctxt "View3D" msgid "Select" -msgstr "Chọn" +msgstr "Lựa Chọn" msgid "Name of the custom transform orientation" @@ -94127,7 +103437,7 @@ msgstr "Định Hướng Biến Hóa Hiện Tại" msgid "Use scene orientation instead of a custom setting" -msgstr "Dùng định hướng của cảnh thay thế một cài đặt tùy chọn" +msgstr "Dùng định hướng của cảnh thay vì một sắp đặt tùy chỉnh" msgid "UDIM Tile" @@ -94135,43 +103445,43 @@ msgstr "Ô UDIM" msgid "Properties of the UDIM tile" -msgstr "Đặc tính của ô UDIM" +msgstr "Tính chất của ô UDIM" msgid "Number of channels in the tile pixels buffer" -msgstr "Số lượng kênh của đệm điểm ảnh ô" +msgstr "Số kênh trong bộ đệm điểm ảnh của ô" msgid "Tile label" -msgstr "Nhẵn ô" +msgstr "Nhãn hiệu của ô" msgid "Number of the position that this tile covers" -msgstr "Số lượng vị trí ô này đang che" +msgstr "Số vị trí mà ô này bao trùm" msgid "Width and height of the tile buffer in pixels, zero when image data can't be loaded" -msgstr "Chiều rộng và cao của đếm ô (đơn vị điểm ảnh), = 0 khi không thể nhập dữ liệu ảnh" +msgstr "Chiều rộng và chiều cao của bộ đệm của ô, trong số điểm ảnh. Đặt bằng 0 khi không thể tải dữ liệu hình ảnh được" msgid "Collection of UDIM tiles" -msgstr "Sưu tập ô UDIM" +msgstr "Bộ sưu tập các ô UDIM" msgid "Active Image Tile" -msgstr "Ô Ảnh Hoạt Động" +msgstr "Ô Hình Ảnh đang Hoạt Động" msgid "Active Tile Index" -msgstr "Chi Số Ô Hoạt Động" +msgstr "Chỉ Số Ô đang Hoạt Động" msgid "Active index in tiles array" -msgstr "Chỉ số hoạt động trong mảng ô" +msgstr "Chỉ Số đang hoạt động trong mảng các ô" msgid "UI list containing the elements of a collection" -msgstr "Danh sách Giao Diện có phần tử của một sưu tập" +msgstr "Danh sách Giao Diện Người Dùng có chứa các phần tử của một bộ sưu tập" msgid "FILTER_ITEM" @@ -94179,19 +103489,19 @@ msgstr "BÔ_LỌC_MẶT_HÀNG" msgid "The value of the reserved bitflag 'FILTER_ITEM' (in filter_flags values)" -msgstr "Giá trị của cờ giữ lại 'BÔ_LỌC_MẶT_HÀNG; (trong giá trị filter_flags (cờ_bộ_lọc))" +msgstr "Giá trị của cờ bitflag 'FILTER_ITEM' dự trữ (trong các giá trị của filter_flags)" msgid "If this is set, the uilist gets a custom ID, otherwise it takes the name of the class used to define the uilist (for example, if the class name is \"OBJECT_UL_vgroups\", and bl_idname is not set by the script, then bl_idname = \"OBJECT_UL_vgroups\")" -msgstr "Nếu này được đặt, uilist được một ID tùy chọn, nếu không nó lấy tên của lớp được chỉ định uilist này (ví dụ, nếu lớp tên là \"VẬT_THỂ_UL_nhómĐỉnh\", và bl_idtên chưa được văn thảo đặt, thì bl_idtên = \"VẬT_THỂ_UL_nhómĐỉnh\")" +msgstr "Nếu cái này được xác định thì uilist sẽ có một ID tùy chọn. Nếu không, nó sẽ lấy tên của lớp dùng để xác định uilist này (ví dụ, nếu tên lớp là \"OBJECT_UL_vgroups\", và bl_idname chưa được tập lệnh xác định, thì bl_idname = \"OBJECT_UL_vgroups\")" msgid "Filter by Name" -msgstr "Lọc Bằng Tên" +msgstr "Lọc bằng Tên" msgid "Only show items matching this name (use '*' as wildcard)" -msgstr "Chỉ hiện mặt hàng giống tên này (dùng '*' cho ký tự đại diện)" +msgstr "Chỉ hiển thị các phần tử khớp với tên này mà thôi (dùng '*' làm ký tự đại diện)" msgid "Default Layout" @@ -94199,23 +103509,23 @@ msgstr "Bố Trí Mặc Định" msgid "Use the default, multi-rows layout" -msgstr "Dùng mặc định, bố trí đa hàng" +msgstr "Dùng bố trí nhiều hàng mặc định" msgid "Compact Layout" -msgstr "Bố trí Gọn" +msgstr "Bố Trí Nhỏ Gọn" msgid "Use the compact, single-row layout" -msgstr "Dùng bố trí gọn, độc hàng" +msgstr "Dùng bố trí nhỏ gọn một hàng" msgid "Grid Layout" -msgstr "Bố Trí Đồ Thị" +msgstr "Bố Trí Khung Lưới Đồ Thị" msgid "Use the grid-based layout" -msgstr "Dùng bố trí cơ sở đồ thị" +msgstr "Sử dụng bố trí kiểu khung lưới đồ thị" msgid "List Name" @@ -94227,23 +103537,23 @@ msgstr "Định danh của danh sách, nếu có cái nào được đưa vào t msgid "Invert filtering (show hidden items, and vice versa)" -msgstr "Đảo nghịch bộ lọc (hiện mặt hàng ẩn và ngược lại)" +msgstr "Đảo nghịch thanh lọc (hiển thị phần tử ẩn giấu và ngược lại)" msgid "Show Filter" -msgstr "Hiện Bộ Lọc" +msgstr "Hiển Thị Bộ Lọc" msgid "Show filtering options" -msgstr "Hiện tùy chọn bộ lọc" +msgstr "Hiển thị các tùy chọn về thanh lọc" msgid "Sort by Name" -msgstr "Sắp Thú Tự Bằng Tên" +msgstr "Sắp Xếp theo Tên" msgid "Sort items by their name" -msgstr "Sắp thú tự của mặt hàng bằng tên" +msgstr "Sắp xếp các phần tử theo thứ tự tên của chúng" msgid "Lock Order" @@ -94251,91 +103561,103 @@ msgstr "Khóa Thứ Tự" msgid "Lock the order of shown items (user cannot change it)" -msgstr "Khóa thứ tự của mặt hàng được hiện (người dùng không thể đổi nó)" +msgstr "Khóa thứ tự của các mục được hiển thị (người dùng không thể thay đổi nó)" msgid "Reverse the order of shown items" -msgstr "Lật ngược thứ tự của mặt hàng được hiện" +msgstr "Đảo ngược thứ tự của các phần tử đang hiển thị" + + +msgid "USD Hook" +msgstr "Móc USD" + + +msgid "Defines callback functions to extend USD IO" +msgstr "Xác định các hàm gọi lại để mở rộng vào ra (IO) USD" + + +msgid "A short description of the USD hook" +msgstr "Mô tả ngắn gọn về móc (hook) USD" msgid "UV Map Layers" -msgstr "Lớp Bản Đồ UV" +msgstr "Các Tầng Lớp Ánh Xạ UV" msgid "Collection of UV map layers" -msgstr "Sưu tập lớp bản đồ UV" +msgstr "Bộ sưu tập các tầng lớp ánh xạ UV" msgid "Active UV Map Layer" -msgstr "Lớp Bản Đồ UV Hoạt Động" +msgstr "Tầng Lớp Ánh Xạ UV đang Hoạt Động" msgid "Active UV Map layer" -msgstr "Lớp bản đồ UV hoạt động" +msgstr "Tầng Lớp Ánh Xạ UV đang Hoạt Động" msgid "Active UV Map Index" -msgstr "Chi Số Bản Đồ UV Hoạt Động" +msgstr "Chỉ Số Ánh Xạ UV đang Hoạt Động" msgid "Active UV map index" -msgstr "Chi số bản đồ UV hoạt động" +msgstr "Chỉ số ánh xạ UV đang hoạt động" msgid "UV projector used by the UV project modifier" -msgstr "Bộ điều chỉnh chiếu UV được dùng đồ chiều nào" +msgstr "Máy chiếu UV mà bộ điều chỉnh phóng chiếu UV sử dụng" msgid "Object to use as projector transform" -msgstr "Vật thể dùng cho biến hóa đồ chiếu" +msgstr "Đối tượng dùng làm biến hóa của máy chiếu" msgid "Overrides for some of the active brush's settings" -msgstr "Vượt quyền cho vài cài đặt hoạt động của bút" +msgstr "Những thay thế cho một số sắp đặt của đầu bút đang hoạt động" msgid "Radius of the brush" -msgstr "Bán kính của bút" +msgstr "Bán kính của đầu bút" msgid "Use Unified Color" -msgstr "Dùng Màu Thông Nhất" +msgstr "Dùng Màu Đồng Nhất" msgid "Instead of per-brush color, the color is shared across brushes" -msgstr "Thay thế dùng màu riêng cho mỗi cái bút, dùng một màu cho hết bút" +msgstr "Thay vì mỗi đầu bút dùng một màu riêng biệt, toàn bộ các đầu bút sử dụng cùng một màu sắc" msgid "Use Unified Radius" -msgstr "Dùng Bán Kính Thống Nhất" +msgstr "Dùng Bán Kính Đồng Nhất" msgid "Instead of per-brush radius, the radius is shared across brushes" -msgstr "Thay thế dùng bán kính riêng cho mỗi cái bút, dùng một bán kính cho hết bút" +msgstr "Thay vì mỗi đầu bút dùng một bán kính riêng biệt, toàn bộ các đầu bút sử dụng cùng một bán kính" msgid "Use Unified Strength" -msgstr "Dùng Sức Thống Nhất" +msgstr "Dùng Cường Độ Đồng Nhất" msgid "Instead of per-brush strength, the strength is shared across brushes" -msgstr "Thay thế dùng sức riêng cho mỗi cái bút, dùng một sức cho hết bút" +msgstr "Thay vì mỗi đầu bút dùng một cường độ riêng biệt, toàn bộ các đầu bút sẽ sử dụng cùng một cường độ" msgid "Use Unified Weight" -msgstr "Dùng Quyền Lượng Thống Nhất" +msgstr "Dùng Trọng Lượng Đồng Nhất" msgid "Instead of per-brush weight, the weight is shared across brushes" -msgstr "Thay thế dùng quyền lượng riêng cho mỗi cái bút, dùng một quyền lượng cho hết bút" +msgstr "Thay vì mỗi đầu bút dùng một trọng lượng riêng biệt, toàn bộ các đầu bút sẽ sử dụng cùng một trọng lượng" msgid "Length Unit" -msgstr "Đơn Vị Bề Dài" +msgstr "Đơn Vị Độ Dài" msgid "Unit that will be used to display length values" -msgstr "Đơn vị cho hiển thị giá trị bề dài" +msgstr "Đơn vị sẽ được sử dụng để hiển thị các giá trị về độ dài" msgid "Mass Unit" @@ -94343,11 +103665,15 @@ msgstr "Đơn Vị Khối Lượng" msgid "Unit that will be used to display mass values" -msgstr "Đơn vị cho hiển thị giá trị khối lượng" +msgstr "Đơn vị sẽ được sử dụng để hiển thị các giá trị về khối lượng" msgid "Unit Scale" -msgstr "Đơn Vị Phóng To" +msgstr "Tỷ Lệ Đơn Vị" + + +msgid "Scale to use when converting between Blender units and dimensions. When working at microscopic or astronomical scale, a small or large unit scale respectively can be used to avoid numerical precision problems" +msgstr "Tỷ lệ sử dụng khi chuyển đổi giữa các đơn vị và kích thước Blender. Khi làm việc với tỷ lệ siêu nhỏ hoặc quy mô khổng lồ, chúng ta có thể sử dụng thang đo nhỏ, hoặc lớn, để tránh các vấn đề về độ chính xác của số" msgid "Unit System" @@ -94355,31 +103681,31 @@ msgstr "Hệ Thống Đơn Vị" msgid "The unit system to use for user interface controls" -msgstr "Hệ thống dơn vị để dùng cho đồ điều khiển giao diện người dùng" +msgstr "Hệ thống đơn vị để sử dụng cho các điều khiển trong giao diện người dùng" msgid "Metric" -msgstr "Quốc Thế" +msgstr "Mét" msgid "Imperial" -msgstr "Anh Quốc" +msgstr "Hệ Đo Lường Anh Quốc" msgid "Rotation Units" -msgstr "Dơn Vị Xoay" +msgstr "Đơn Vị Xoay Chiều" msgid "Unit to use for displaying/editing rotation values" -msgstr "Đơn vị dùng cho hiển/biên tập giá trị xoay" +msgstr "Đơn vị dùng để hiển thị/biên soạn các giá trị của sự xoay chiều" msgid "Use degrees for measuring angles and rotations" -msgstr "Dùng độ cho đo góc và xoay" +msgstr "Dùng đơn vị độ để đo các góc độ và sự xoay chiều" msgid "Radians" -msgstr "Rađian" +msgstr "Rad" msgid "Temperature Unit" @@ -94387,7 +103713,7 @@ msgstr "Đơn Vị Nhiệt Độ" msgid "Unit that will be used to display temperature values" -msgstr "Đơn vị cho hiển thị giá trị nhiệt độ" +msgstr "Đơn vị sẽ được sử dụng để hiển thị các giá trị nhiệt độ" msgid "Time Unit" @@ -94395,87 +103721,149 @@ msgstr "Đơn Vị Thời Gian" msgid "Unit that will be used to display time values" -msgstr "Đơn vị cho hiển thị giá trị thời gian" +msgstr "Đơn vị sử dụng để hiển thị các giá trị thời gian" msgid "Separate Units" -msgstr "Đơn Vị Chẻ" +msgstr "Tách Biệt Đơn Vị" msgid "Display units in pairs (e.g. 1m 0cm)" -msgstr "Hiển thị đơn vị đôi (ví dụ 1m 0cm)" +msgstr "Hiển thị các đơn vị tách biệt (ví dụ: 1m 0cm)" msgid "Settings to define a reusable library for Asset Browsers to use" -msgstr "Cài đặt cho định nghĩa một thư viện có thể dùng lại cho Bộ Trình Duyệt Tích Sản được sử dụng" +msgstr "Sắp đặt nhằm xác định một thư viện khả tái dụng, hầu cho các Trình Duyệt Thảo Tài Sản có thể sử dụng nó" + + +msgid "Default Import Method" +msgstr "Phương Pháp Nhập Khẩu Mặc Định" + + +msgid "Determine how the asset will be imported, unless overridden by the Asset Browser" +msgstr "Xác định phương pháp tài sản sẽ được nhập khẩu, trừ khi bị vượt quyền bởi Trình Duyệt Thảo Tài Sản" msgid "Identifier (not necessarily unique) for the asset library" -msgstr "Đinh danh của thư viện tích sản (có lẽ không độc đáo)" +msgstr "Định danh (không cần phải độc nhất) cho thư viện tài sản" msgid "Path to a directory with .blend files to use as an asset library" -msgstr "Đường dẫn đến một thư mục chứa tập tin .blend để dùng làm thư viện tích sản" +msgstr "Đường dẫn đến một thư mục có các tập tin .blend để sử dụng làm các thư viện tài sản" + + +msgid "Use relative path when linking assets from this asset library" +msgstr "Sử dụng đường dẫn tương đối khi liên kết tài sản từ thư viện tài sản này" + + +msgid "Extension Repository" +msgstr "Kho Lưu Trữ Tiện Ích Mở Rộng" + + +msgid "Settings to define an extension repository" +msgstr "Các cài đặt để xác định một kho lưu trữ tiện ích mở rộng" + + +msgctxt "File browser" +msgid "Local Directory" +msgstr "Thư Mục Cục Bộ" + + +msgid "The local directory containing extensions" +msgstr "Thư mục cục bộ chứa các tiện ích mở rộng" + + +msgid "Unique module identifier" +msgstr "Mã định danh mô-đun độc nhất" + + +msgid "Unique repository name" +msgstr "Tên kho lưu trữ độc nhất" + + +msgctxt "File browser" +msgid "Remote Path" +msgstr "Đường Dẫn Từ Xa" + + +msgid "Remote URL or path for extension repository" +msgstr "URL từ xa hoặc đường dẫn cho kho lưu trữ tiện ích mở rộng" + + +msgid "Local Cache" +msgstr "Bộ Đệm Cục Bộ" + + +msgid "Store packages in local cache, otherwise downloaded package files are immediately deleted after installation" +msgstr "Lưu trữ các gói trong bộ đệm nhớ cục bộ, nếu không thì các tập tin gói đã tải xuống sẽ bị xóa ngay lập tức sau khi cài đặt xong" + + +msgid "User Extension Repositories" +msgstr "Kho Lưu Trữ Tiện Ích Mở Rộng của Người Dùng" + + +msgid "Collection of user extension repositories" +msgstr "Bộ sưu tập các kho lưu trữ tiện ích mở rộng của người dùng" msgid "Solid Light" -msgstr "Đèn Rắn" +msgstr "Nguồn Sáng Lập Thể" msgid "Light used for Studio lighting in solid shading mode" -msgstr "Đèn được dùng cho ánh sáng Xưởng trong chế độ tô sắc rắn" +msgstr "Nguồn sáng sử dụng cho bố trí ánh sáng Studio trong chế độ chuyển sắc lập thể (Solid)" msgid "Color of the light's diffuse highlight" -msgstr "Màu cho cao quang tán xạ của đèn" +msgstr "Màu của ánh sáng cho các điểm nhấn khuếch xạ nổi bật" msgid "Direction that the light is shining" -msgstr "Hướng đèn đang rọi" +msgstr "Chiều hướng mà ánh sáng phát ra" msgid "Smooth the lighting from this light" -msgstr "Mịn họa ánh sáng từ đèn này" +msgstr "Làm mịn ánh sáng từ nguồn sáng này" msgid "Color of the light's specular highlight" -msgstr "Màu cao quang của đèn" +msgstr "Màu cho ánh lóng lánh của nguồn sáng" msgid "Enable this light in solid shading mode" -msgstr "Bật đèn này trong chế độ tô sắc rắn" +msgstr "Bật nguồn sáng này trong chế độ chuyển sắc lập thể (Solid)" msgid "Group of vertices, used for armature deform and other purposes" -msgstr "Nhom đỉnh dùng cho méo hóa cốt và hoạt động khác" +msgstr "Nhóm điểm đỉnh, dùng để biến dạng khung cốt và các mục đích khác" msgid "Index number of the vertex group" -msgstr "Chỉ số của nhóm đỉnh" +msgstr "Số mã về chỉ số của nhóm điểm đỉnh" msgid "Maintain the relative weights for the group" -msgstr "Giữ nguyên quyền lượng tương đối của nhóm" +msgstr "Duy trì trọng lượng tương đối của nhóm" msgid "Collection of vertex groups" -msgstr "Sưu tập nhóm đỉnh" +msgstr "Bộ sưu tập các nhóm điểm đỉnh" msgid "Active Vertex Group" -msgstr "Nhóm Đỉnh Hoạt Động" +msgstr "Nhóm Điểm Đỉnh đang Hoạt Động" msgid "Active Vertex Group Index" -msgstr "Chỉ Số Nhóm Đỉnh Hoạt Động" +msgstr "Chỉ Số Nhóm Điểm Đỉnh đang Hoạt Động" msgid "Active index in vertex group array" -msgstr "Chỉ số hoạt động trong mảng nhóm đỉnh" +msgstr "Chỉ số đang hoạt động trong mảng nhóm điểm đỉnh" msgid "Scroll and zoom for a 2D region" -msgstr "Cuộn và phóng vào cho một vùng 2D" +msgstr "Cuộn và thu-phóng dành cho vùng 2D" msgid "Transform Matrix" @@ -94483,111 +103871,127 @@ msgstr "Ma Trận Biến Hóa" msgid "Matrix combining location and rotation of the cursor" -msgstr "Ma trận gồm vị trí và xoay của con trỏ" +msgstr "Ma trận kết hợp vị trí và xoay chiều của con trỏ" msgid "3D rotation" -msgstr "Xoay 3D" +msgstr "Xoay chiều 3D" msgid "3D View Overlay Settings" -msgstr "Cài Đặt Lớp Che Màn Chiếu 3D" +msgstr "Sắp Đặt về Vẽ Lồng trong Góc Nhìn 3D" msgid "Backwire Opacity" -msgstr "Độ Đục Sợi Dây Hậu" +msgstr "Độ Đục của các Mạch Lưới Phía Sau" msgid "Opacity when rendering transparent wires" -msgstr "Độ đục khi kết xuất sợi dây trong suốt" +msgstr "Độ đục khi kết xuất các mạch lưới trong suốt" msgid "Bone Wireframe Opacity" -msgstr "Độ Đục Khung Sợi Dây Xương" +msgstr "Độ Đục Khung Dây Xương" msgid "Maximum opacity of bones in wireframe display mode" -msgstr "Độ đục cực đại của xương trong chế độ hiển thị khung sợi dây" +msgstr "Độ đục tối đa của xương trong chế độ hiển thị khung dây" msgid "Display Handles" -msgstr "Hiển Thị Tay Cầm" +msgstr "Hiển Thị các Tay Cầm" msgid "Limit the display of curve handles in edit mode" -msgstr "Hạn chế hiển thị của tay cầm của đường cong trong chế độ biên tập" +msgstr "Giới hạn sự hiển thị các tay cầm của đường cong trong chế độ biên soạn" msgid "Strength of the fade effect" -msgstr "Sức của hiệu ứng phai" +msgstr "Cường độ của hiệu ứng nhòe mờ dần" msgid "Fade layer opacity for Grease Pencil layers except the active one" -msgstr "Phai độ đục của các lớp Bút Sáp trừ lớp dang hoạt động" +msgstr "Phai mờ dần độ đục các tầng lớp Bút Chì Dầu ngoại trừ cái đang hoạt động" msgid "Fade factor" -msgstr "Hệ số phai" +msgstr "Hệ Số phai Mờ Dần" msgid "Canvas grid opacity" -msgstr "Độ đục đồ thị mặt sơn" +msgstr "Độ đục của khung lưới đồ thị khung tranh" msgid "Grid Lines" -msgstr "Đường Đồ Thị" +msgstr "Số Đường Khung Lưới Đồ Thị" msgid "Number of grid lines to display in perspective view" -msgstr "Hiển thị số lượng đường đồ thị trong màn chiếu phối cảnh" +msgstr "Số đường khung lưới đồ thị được hiển thị trong góc nhìn phối cảnh" msgid "Multiplier for the distance between 3D View grid lines" -msgstr "Hệ số nhân cho khoảng cách giữa các đường của đồ thị Màn 3 Chiều" +msgstr "Số nhân dành cho khoảng cách giữa các đường khung lưới đồ thị trong Góc Nhìn 3D" msgid "Grid Scale Unit" -msgstr "Đơn Vị Phóng To Đồ Thị" +msgstr "Đơn Vị Tỷ Lệ của Khung Lưới Đồ Thị" msgid "Grid cell size scaled by scene unit system settings" -msgstr "Kích cỡ ô đồ thị phóng to bằng cài đặt hệ thống dơn vị cảnh" +msgstr "Kích thước ô khung lưới đồ thị được tỷ lệ hóa theo các sắp đặt về hệ thống đơn vị của cảnh" msgid "Number of subdivisions between grid lines" -msgstr "Số lượng đường phụ giữa các đường đồ thị" +msgstr "Lượng phân chia giữa các đường của khung lưới đồ thị" msgid "Normal Screen Size" -msgstr "Kích Cỡ Màn Bình Thường" +msgstr "Kích Thước Pháp Tuyến trên Màn Hình" msgid "Screen size for normals in the 3D view" -msgstr "Kích cỡ cho pháp tuyến trong màn 3D" +msgstr "Kích thước màn hình cho các pháp tuyến trong góc nhìn 3D" msgid "Normal Size" -msgstr "Kích Cỡ Bình Thường" +msgstr "Kích Thước Pháp Tuyến" msgid "Display size for normals in the 3D view" -msgstr "Hiển thị kích cỡ cho pháp tuyến trong màn 3D" +msgstr "Cỡ pháp tuyến hiển thị trong khung nhìn 3D" + + +msgid "Retopology Offset" +msgstr "Dịch Chuyển Tái Cấu Trúc" + + +msgid "Offset used to draw edit mesh in front of other geometry" +msgstr "Dịch chuyển sử dụng để vẽ khung lưới biên soạn ở đằng trước hình học khác" + + +msgid "Curves Sculpt Cage Opacity" +msgstr "Điêu Khắc Đường Cong: Độ Đục của Khung Lồng" + + +msgid "Opacity of the cage overlay in curves sculpt mode" +msgstr "Độ đục của lớp vẽ khung lồng trong chế độ điêu khắc đường cong" msgid "Sculpt Face Sets Opacity" -msgstr "Khắc Độ Đục Tập Hợp Mặt" +msgstr "Điêu khắc: Độ đục của Mặt Ấn Định" msgid "Sculpt Mask Opacity" -msgstr "Khắc Độ Đục Mặt Nạ" +msgstr "Điêu Khắc: Độ đục Màn Chắn Lọc" msgid "Display X Axis" -msgstr "Hiển Thị Trục X" +msgstr "Hiển Thị Trục-X" msgid "Show the X axis line" -msgstr "Hiện đường của trục X" +msgstr "Hiển thị đường trục X" msgid "Display Y Axis" @@ -94595,7 +103999,7 @@ msgstr "Hiển Thị Trục Y" msgid "Show the Y axis line" -msgstr "Hiện đường của trục Y" +msgstr "Hiển thị đường trục Y" msgid "Display Z Axis" @@ -94603,23 +104007,23 @@ msgstr "Hiển Thị Trục Z" msgid "Show the Z axis line" -msgstr "Hiện đường của trục Z" +msgstr "Hiển thị đường trục Z" msgid "Show Bones" -msgstr "Hiện Xương" +msgstr "Hiển Thị Xương" msgid "Display bones (disable to show motion paths only)" -msgstr "Hiển thị xương (tắt để chỉ cho xem đường chuyển động)" +msgstr "Thị các xương (tắt để chỉ hiển thị các đường chuyển động mà thôi)" msgid "Show 3D Cursor" -msgstr "Hiện Con Trỏ 3D" +msgstr "Hiển Thị Con Trỏ 3D" msgid "Display 3D Cursor Overlay" -msgstr "Hiển Thị Lớp Che Con Trỏ 3D" +msgstr "Hiển Thị Vẽ Lồng của Con Trỏ 3D" msgid "Draw Normals" @@ -94627,59 +104031,59 @@ msgstr "Vẽ Pháp Tuyến" msgid "Display 3D curve normals in editmode" -msgstr "Hiển thị pháp tuyến của đường cong trong chế độ biên tập" +msgstr "Hiển thị pháp tuyến của đường cong 3D trong Chế Độ Biên Soạn" msgid "Display Bevel Weights" -msgstr "Hiển Thị Quyền Lượng Cạnh Tròn" +msgstr "Hiển Thị Trọng Lượng Bo Tròn/Vát" msgid "Display weights created for the Bevel modifier" -msgstr "Hiển thị quyền lượng được chế tạo cho bộ điều chỉnh Cạnh Tròn" +msgstr "Hiển thị trọng lượng đã kiến tạo cho bộ điều chỉnh Bo Tròn/Vát" msgid "Display Creases" -msgstr "Hiển Thị Nhăn" +msgstr "Hiển Thị Nếp Gấp/Nhăn" msgid "Display creases created for Subdivision Surface modifier" -msgstr "Hiển thị nhăn được chế tạo cho bộ điều chỉnh Phân Hóa Bề Mặt" +msgstr "Hiển thị các nếp gấp đã kiến tạo cho bộ điều chỉnh Bề Mặt Phân Hóa" msgid "Display Seams" -msgstr "Hiển Thị Sẹo" +msgstr "Hiển Thị Đường Khâu" msgid "Display UV unwrapping seams" -msgstr "Hiển thị vết sẹo mở gói UV" +msgstr "Hiển thị đường khâu mở gói UV" msgid "Display Sharp" -msgstr "Hiển Thị Bén" +msgstr "Hiển Thị Sắc Nhọn" msgid "Display sharp edges, used with the Edge Split modifier" -msgstr "Hiển thị cạnh bén, dùng với bộ điều chỉnh Chẻ Cạnh" +msgstr "Hiển thị các cạnh sắc nhọn, dùng với bộ điều chỉnh Phân Cạnh" msgid "Display selected edge angle, using global values when set in the transform panel" -msgstr "Hiển thị góc cạnh được chọn, dùng giá trị toàn cầu khi đặt trong bảng biến hóa" +msgstr "Hiển thị góc độ của cạnh đã chọn, dùng giá trị toàn cầu khi đã đặt trong bảng biến hóa" msgid "Display selected edge lengths, using global values when set in the transform panel" -msgstr "Hiển thị bề dài của các cạnh được chọn, dùng giá trị toàn cầu khi đặt trong bảng biến hóa" +msgstr "Hiển thị chiều dài cạnh đã chọn, dùng giá trị toàn cầu khi đã đặt trong bảng biến hóa" msgid "Face Angles" -msgstr "Góc Mặt" +msgstr "Góc Độ Mặt" msgid "Display the angles in the selected edges, using global values when set in the transform panel" -msgstr "Hiển thị góc của các cạnh được chọn, dùng giá trị toàn cầu khi đặt trong bảng biến hóa" +msgstr "Hiển thị góc độ của các cạnh đã chọn, dùng giá trị toàn cầu khi đã đặt trong bảng biến hóa" msgid "Display the area of selected faces, using global values when set in the transform panel" -msgstr "Hiển thị diện tích của các mặt được chọn, dùng giá trị toàn cầu khi đặt trong bảng biến hóa" +msgstr "Hiển thị diện tích của các mặt đã chọn, dùng giá trị toàn cầu khi đặt trong bảng biến hóa" msgid "Indices" @@ -94687,23 +104091,23 @@ msgstr "Chỉ Số" msgid "Display the index numbers of selected vertices, edges, and faces" -msgstr "Hiển thị các chỉ số của đỉnh, cạnh, và mặt được chọn" +msgstr "Hiển thị chỉ số của các điểm đỉnh, cạnh, và mặt đã chọn" msgid "Extras" -msgstr "Đồ Thêm" +msgstr "Bổ Sung" msgid "Object details, including empty wire, cameras and other visual guides" -msgstr "Chi tiết vật thể, gồm sợi dây trống rỗng, máy quay phim và nét hướng dẫn" +msgstr "Chi tiết đối tượng, bao gồm mạch lưới trống/rỗng, máy quay phim và các đường trợ giúp trực quan" msgid "Display Face Center" -msgstr "Hiển Thị Trung Tâm Mặt" +msgstr "Hiển Thị Điểm Tâm Mặt" msgid "Display face center when face selection is enabled in solid shading modes" -msgstr "Hiển thị trung tâm mặt khi bật sự lựa chọn mặt trong các chế độ tô sắc rắn" +msgstr "Hiển thị điểm tâm của Mặt khi sự lựa chọn Mặt đang được bật trong chế độ tô bóng lập thể" msgid "Display Normals" @@ -94711,111 +104115,119 @@ msgstr "Hiển Thị Pháp Tuyến" msgid "Display face normals as lines" -msgstr "Hiển thị pháp tuyến mặt bẳng đường" +msgstr "Hiển thị pháp tuyến Mặt như các đường thẳng" msgid "Face Orientation" -msgstr "Định Hướng Mặt" +msgstr "Chiều Hướng của Mặt" msgid "Show the Face Orientation Overlay" -msgstr "Hiển Thị Lớp Che Định Hướng Mặt" +msgstr "Hiển thị lớp vẽ lồng Chiều Hướng của Mặt" msgid "Highlight selected faces" -msgstr "Tô sáng các mặt được chọn" +msgstr "Nêu bật các mặt đã chọn" msgid "Fade Inactive Objects" -msgstr "Phai Vật Thể Không Hoạt Động" +msgstr "Phai Mờ Dần các Đối Tượng Không Hoạt Động" msgid "Fade inactive geometry using the viewport background color" -msgstr "Phai hình dạng không hoạt động bằng màu của nền màn chiếu" +msgstr "Phai mờ dần các hình học dùng màu nền của cổng nhìn" msgid "Display Grid Floor" -msgstr "Hiển Thị Sàn Đồ Thị" +msgstr "Hiển Thị Sàn Khung Lưới Đồ Thị" msgid "Show the ground plane grid" -msgstr "Hiện đồ thị mặt phẳng sàn" +msgstr "Hiển thị lưới khung lưới đồ thị mặt sàn" msgid "Display Freestyle Edge Marks" -msgstr "Hiển Thị Ký Hiệu Cạnh Phong Cách Tự Do" +msgstr "Hiển Thị Dấu Chỉ Cạnh Phong Cách Tự Do" msgid "Display Freestyle edge marks, used with the Freestyle renderer" -msgstr "Hiển thị ký hiệu cạnh Phong Cách Tự Do, dùng với bộ kết xuất Phong Cách Tự Do" +msgstr "Hiển thị dấu chỉ cạnh, dùng với bộ kết xuất Phong Cách Tự Do (PCTD)" msgid "Display Freestyle Face Marks" -msgstr "Hiển Thị Ký Hiệu Mặt Phong Cách Tự Do" +msgstr "Hiển Thị Dấu Chỉ Mặt Phong Cách Tự Do" msgid "Display Freestyle face marks, used with the Freestyle renderer" -msgstr "Hiển thị ký hiệu mặt Phong Cách Tự Do, dùng với kết xuất Phong Cách Tự Do" +msgstr "Hiển thị các dấu chỉ mặt, dùng với bộ kết xuất Phong Cách Tự Do (PCTD)" + + +msgid "Light Colors" +msgstr "Màu của Ánh Sáng" + + +msgid "Show light colors" +msgstr "Hiển thị màu của ánh sáng" msgid "HDRI Preview" -msgstr "Đự Khán HDRI" +msgstr "Xem Trước HDRI" msgid "Show HDRI preview spheres" -msgstr "Hiện các hình cầu dự khán HDRI" +msgstr "Hiển thị các hình cầu xem trước HDRI" msgid "Show the Motion Paths Overlay" -msgstr "Hiện Lớp Che Đường Chuyển động" +msgstr "Hiển Thị Lớp Vẽ Đường Chuyển Động" msgid "Object Origins" -msgstr "Gốc Tọa Độ Vật Thể" +msgstr "Tọa Độ Gốc của Đối Tượng" msgid "Show object center dots" -msgstr "Hiện đấu chấm trung tâm" +msgstr "Hiển thị điểm tâm của đối tượng" msgid "All Object Origins" -msgstr "Hết Gốc Tọa Độ Vật Thể" +msgstr "Tọa Độ Gốc của mọi Đối Tượng" msgid "Show the object origin center dot for all (selected and unselected) objects" -msgstr "Hiện dấu chấm trung tâm của gốc tọa độ cho tất cả vật thể (được chọn và không được chọn)" +msgstr "Hiển thị dấu chấm tọa độ gốc ở trung tâm đối tượng cho toàn bộ các đối tượng (chọn hay chưa chọn)" msgid "Show the Onion Skinning Overlay" -msgstr "Hiện Lớp Che Bóng Ma" +msgstr "Hiển Thị Lớp Bóc Vỏ Hành" msgid "Display Grid" -msgstr "Hiển Thị Đồ Thị" +msgstr "Hiển Thị Khung Lưới Đồ Thị" msgid "Show grid in orthographic side view" -msgstr "Hiện đồ thị trong màn trực giao bên hông" +msgstr "Hiển thị khung lưới đồ thị trong góc nhìn bên trực giao" msgid "Outline Selected" -msgstr "Được Chọn Nét Ngoài" +msgstr "Viền Nét cái được Chọn" msgid "Show an outline highlight around selected objects" -msgstr "Vẽ một nét sáng ngoài quanh các vật thể được chọn" +msgstr "Hiển thị một đường viền nêu bật xung quanh các đối tượng đã chọn" msgid "Display overlays like gizmos and outlines" -msgstr "Hiển thị lớp che như đồ đạc và nét ngoài" +msgstr "Hiển thị các lớp vẽ lồng, như gizmos và đường viền" msgid "Show Wire" -msgstr "Hiện Sợi Dây" +msgstr "Hiển Thị Mạch Lưới" msgid "Use wireframe display in painting modes" -msgstr "Dùng hiển thị sợi dây trong chế đồ sơn" +msgstr "Hiển thị mạch lưới trong chế độ sơn" msgid "Relationship Lines" @@ -94823,207 +104235,251 @@ msgstr "Đường Liên Hệ" msgid "Show dashed lines indicating parent or constraint relationships" -msgstr "Hiện đường gạch chỉ quan hệ phụ huynh hay ràng buộc" +msgstr "Hiển thị nét gạch ngang biểu thị quan hệ phụ huynh hay quan hệ ràng buộc" + + +msgid "Retopology" +msgstr "Tái Cấu Trúc" + + +msgid "Hide the solid mesh and offset the overlay towards the view. Selection is occluded by inactive geometry, unless X-Ray is enabled" +msgstr "Ẩn giấu khung lưới đặc và dịch chuyển lớp vẽ lồng về phía góc nhìn. Lựa chọn bị che khuất đi bởi hình học không hoạt động, trừ khi X-Quang được bật lên" + + +msgid "Sculpt Curves Cage" +msgstr "Điêu Khắc: Khung Lồng Đường Cong" + + +msgid "Show original curves that are currently being edited" +msgstr "Hiển thị các đường cong ban đầu mà hiện đang được biên soạn" + + +msgid "Sculpt Show Face Sets" +msgstr "Điêu Khắc: Hiển Thị các Mặt Ấn Định" + + +msgid "Sculpt Show Mask" +msgstr "Điêu Khắc: Hiển Thị Màn Chắn Lọc" msgid "Display Split Normals" -msgstr "Hiển Thị Pháp Tuyến Chẻ" +msgstr "Hiển Thị Pháp Tuyến Tách Phân" msgid "Display vertex-per-face normals as lines" -msgstr "Hiển thị pháp tuyến đỉnh mỗi mặt bằng đường" +msgstr "Vẽ pháp tuyến của điểm đỉnh trên mỗi mặt như các đường thẳng" msgid "Display scene statistics overlay text" -msgstr "Hiện văn bản thống kê của cảnh che trên" +msgstr "Hiển thị văn bản vẽ lồng thông tin thống kê về cảnh" -msgid "Stat Vis" -msgstr "Hiển Thị Thống Kê" +msgid "Mesh Analysis" +msgstr "Phân Tích Khung Lưới" msgid "Display statistical information about the mesh" -msgstr "Hiển thị thông tin thống kê về mạng lưới" +msgstr "Hiển thị thông tin thống kê về khung lưới" msgid "Show Text" -msgstr "Hiện Văn Bản" +msgstr "Hiển Thị Văn Bản" msgid "Display overlay text" -msgstr "Hiển thị văn bản lớp che" +msgstr "Hiển thị văn bản vẽ lồng" msgid "Display Vertex Normals" -msgstr "Hiển Thị Pháp Tuyến Đỉnh" +msgstr "Hiển Thị Pháp Tuyến Điểm Đỉnh" msgid "Display vertex normals as lines" -msgstr "Hiển thị pháp tuyến đỉnh bằng đường" +msgstr "Hiển thị pháp tuyến của điểm đỉnh như các đường thẳng" + + +msgid "Show attribute overlay for active viewer node" +msgstr "Hiển thị lớp vẽ lồng thuộc tính cho nút quan sát đang hoạt động" msgid "Show Weights" -msgstr "Hiện Quyền Lượng" +msgstr "Hiển Thị Trọng Lượng" msgid "Display weights in editmode" -msgstr "Hiển thị quyền lượng trong chế độ biên tập" +msgstr "Hiển thị trọng lượng trong Chế Độ Biên Soạn" msgid "Show face edges wires" -msgstr "Hiện sợi dây cạnh mặt" +msgstr "Hiển thị các cạch mạch lưới của Mặt" msgid "Show Weight Contours" -msgstr "Hiện Đường Đồng Mức Quyền Lượng" +msgstr "Hiển Thị Đường Viền Vùng Trọng Lượng" msgid "Show contour lines formed by points with the same interpolated weight" -msgstr "Hiện đường đồng mức được hình thành từ điểm cùng quyền lượng được suy nội" +msgstr "Hiển thị các đường viền công-tua được hình thành bởi các điểm với trọng lượng nội suy tương đồng" msgid "Show Bone X-Ray" -msgstr "Hiện Xương X-Quang" +msgstr "Hiển Thị Xương X-Quang" msgid "Show the bone selection overlay" -msgstr "Hiện lớp che của sự lựa chọn xương" +msgstr "Hiển thị lớp vẽ lựa chọn xương" msgid "Stencil Mask Opacity" -msgstr "Độ Đục Mặt Nạ Khuôn Tô" +msgstr "Độ Đục của Khuôn-In Chắn Lọc" msgid "Opacity of the texture paint mode stencil mask overlay" -msgstr "Độ đục của lớp che của chế độ mặt nạ khuôn tô cho sơn chất liệu" +msgstr "Độ Đục của lớp vẽ lồng khuôn in chắn lọc trong chế độ sơn chất liệu" + + +msgid "Freeze Culling" +msgstr "Cố Định Hình Loại Bỏ" + + +msgid "Freeze view culling bounds" +msgstr "Cố định hình ranh giới vùng loại bỏ" msgid "Canvas X-Ray" -msgstr "X-Quang Mặt Sơn" +msgstr "X-Quang Khung Vẽ" msgid "Show Canvas grid in front" -msgstr "Hiện đồ thị Mặt Sơn phía trước" +msgstr "Hiển thị khung lưới đồ thị Khung Vẽ ở đằng trước" msgid "Show Edit Lines" -msgstr "Hiện Đường Biên Tập" +msgstr "Hiển Thị Đường Biên Soạn" msgid "Show Edit Lines when editing strokes" -msgstr "Hiện Đường Biên Tập khi biên tập nét" +msgstr "Hiển thị những đường biên soạn khi biên soạn các nét vẽ" msgid "Fade Grease Pencil Objects" -msgstr "Phai Vật Thể Bút Sáp" +msgstr "Phai Mờ Dần Đối Tượng Bút Chì Dầu" msgid "Fade Grease Pencil Objects, except the active one" -msgstr "Phai Vật Thể Bút Sáp, trừ vật thể hoạt dộng" +msgstr "Phai Mờ Dần các Đối Tượng Bút Chì Dầu, ngoại trừ cái đang hoạt động" msgid "Fade Layers" -msgstr "Phai Lớp" +msgstr "Phai Mờ Dần các Tầng Lớp" msgid "Toggle fading of Grease Pencil layers except the active one" -msgstr "Bật/tắt phai lớp Bút Sáp trừ các lớp đang hoạt dộng" +msgstr "Bật/Tắt sự phai mờ dần của các tầng lớp Bút Chì Dầu, ngoại trừ cái đang hoạt động" msgid "Fade Objects" -msgstr "Phai Vật Thể" +msgstr "Phai Mờ Dần Đối Tượng" msgid "Fade all viewport objects with a full color layer to improve visibility" -msgstr "Phai hết vật thể màn chiếu có một lớp màu đầu đủ để tăng sự hiển thị" +msgstr "Phai mờ dần toàn bộ các đối tượng trong cổng nhìn bằng một tầng đơn sắc, hòng cải thiện tầm nhìn" msgid "Use Grid" -msgstr "Dùng Đồ Thị" +msgstr "Sử Dụng Khung Lưới Đồ Thị" msgid "Display a grid over grease pencil paper" -msgstr "Hiển thị một đồ thị trên giấy bút sáp" +msgstr "Hiển thị một khung lưới đồ thị trên mặt giấy Bút Chì Dầu" msgid "Lines Only" -msgstr "Chỉ Dường" +msgstr "Duy Đường Nét" msgid "Show Edit Lines only in multiframe" -msgstr "Cho Xem Biên Tập Đường chỉ trong đa màn" +msgstr "Duy hiển thị các Đường Nét Biên Soạn trong đa khung hình" msgid "Stroke Direction" -msgstr "Hướng Nét" +msgstr "Chiều Hướng của Nét Vẽ" msgid "Show stroke drawing direction with a bigger green dot (start) and smaller red dot (end) points" -msgstr "Hiện hướng vẽ nét bằng chấm điểm màu lục lớn hơn (bắt đầu) và chấm điểm màu đỏ nhỏ hơn (kết thúc)" +msgstr "Dùng các chấm màu xanh lá cây lớn hơn (bắt đầu) và các chấm đỏ nhỏ hơn (kết thúc) để hiển thị hướng của nét vẽ" msgid "Stroke Material Name" -msgstr "Tên Vật Liệu Nét" +msgstr "Tên Nguyên Vật Liệu của Nét Vẽ" msgid "Show material name assigned to each stroke" -msgstr "Hiện tên của vật liệu được chỉ định từng nét" +msgstr "Hiển thị tên nguyên vật liệu đã ấn định cho mỗi nét vẽ" msgid "Constant Screen Size Normals" -msgstr "Pháp Tuyến Kích Cỡ Hằng Số Với Màn" +msgstr "Kích Thước Pháp Tuyến Màn Hình Bất Biến" msgid "Keep size of normals constant in relation to 3D view" -msgstr "Giữ kích cỡ của pháp tuyến hằng số tương đối với màn 3D" +msgstr "Giữ kích thước pháp tuyến bất biến, tương đối với góc nhìn 3D" msgid "Vertex Opacity" -msgstr "Độ Đục Đỉnh" +msgstr "Độ Đục của Điểm Đỉnh" msgid "Opacity for edit vertices" -msgstr "Độ đục cho biên tập đỉnh" +msgstr "Độ đục cho các điểm đỉnh biên soạn" + + +msgid "Viewer Attribute Opacity" +msgstr "Độ Đục của Thuộc Tính trong Quan Sát" + + +msgid "Opacity of the attribute that is currently visualized" +msgstr "Độ đục của thuộc tính hiện đang được trực quan" msgid "Weight Paint Opacity" -msgstr "Độ Đục Sơn Quyền Lượng" +msgstr "Độ Đục của Sơn Trọng Lượng" msgid "Opacity of the weight paint mode overlay" -msgstr "Độ đục của lớp che của chế độ sơn quyền lượng" +msgstr "Độ đục của lớp vẽ chế độ sơn trọng lượng" msgid "Wireframe Opacity" -msgstr "Độ Đục Khung Sợi Dây" +msgstr "Độ Đục của Khung Dây" msgid "Opacity of the displayed edges (1.0 for opaque)" -msgstr "Độ đục của cạnh hiển thị (1.0 cho đục)" +msgstr "Độ đục của các cạnh hiển thị (1,0 là đục hoàn toàn)" msgid "Wireframe Threshold" -msgstr "Ngưỡng Sợi Dây" +msgstr "Ngưỡng của Mạch Lưới" msgid "Adjust the angle threshold for displaying edges (1.0 for all)" -msgstr "Chỉnh ngưỡng góc cho hiển thị cạnh (1.0 cho hết)" +msgstr "Điều chỉnh giới hạn góc độ cho các cạnh đang hiển thị (1.0 để làm toàn bộ)" msgid "Opacity to use for bone selection" -msgstr "Độ đục để dùng cho sự lựa chọn xương" +msgstr "Độ đục để sử dụng cho xương lựa chọn" msgid "3D View Shading Settings" -msgstr "Cài Đặt Tô Sắc Màn 3D" +msgstr "Sắp Đặt Tô Bóng của Khung Nhìn 3D" msgid "Shader AOV Name" -msgstr "Tên Bộ Tô Sắc AOV" +msgstr "Tên của Bộ Tô Bóng AOV" msgid "Name of the active Shader AOV" -msgstr "Tên của Bộ Tô Sắc AOV hoạt động" +msgstr "Tên của Bộ Tô Bóng AOV đang hoạt động" msgid "Background Color" @@ -95031,135 +104487,186 @@ msgstr "Màu Nền" msgid "Color for custom background color" -msgstr "Màu cho màu nền tùy chọn" +msgstr "Màu sắc dành cho màu nền tùy chỉnh" + + +msgctxt "View3D" +msgid "Background" +msgstr "Nền Sau" msgid "Way to display the background" -msgstr "Cách để hiển thị nền" +msgstr "Phương pháp hiển thị nền đằng sau" + + +msgctxt "View3D" +msgid "Theme" +msgstr "Kiểu Mẫu" msgid "Use the theme for background color" -msgstr "Dùng phong cách cho màu nền" +msgstr "Dùng định nghĩa trong cấu hình kiểu mẫu của hệ thống làm màu của nền" + + +msgctxt "View3D" +msgid "World" +msgstr "Thế Giới" msgid "Use the world for background color" -msgstr "Dùng thế giới cho màu nền" +msgstr "Dùng màu thế giới làm màu nền" + + +msgctxt "View3D" +msgid "Viewport" +msgstr "Khung Nhìn" msgid "Use a custom color limited to this viewport only" -msgstr "Dùng một màu tùy chọn chỉ được dùng cho màn chiếu này" +msgstr "Dùng một màu tùy chỉnh, giới hạn trong cổng nhìn này mà thôi" msgid "Cavity Ridge" -msgstr "Dẫy Đỉnh Lỗ Hổng" +msgstr "Lằn Gợn Khe Hốc" msgid "Factor for the cavity ridges" -msgstr "Hệ số cho dãy đỉnh lỗ hổng" +msgstr "Hệ số dành cho các lằn gợn khe hốc" + + +msgctxt "View3D" +msgid "Cavity Type" +msgstr "Kiểu Khe Hốc" msgid "Way to display the cavity shading" -msgstr "Cách để tô sắc lỗ hổng" +msgstr "Phương pháp hiển thị chuyển sắc của khe hốc" msgid "Cavity shading computed in world space, useful for larger-scale occlusion" -msgstr "Tô sắc lỗ hổng tính trong không gian thế giới, lợi ích cho khe khuất quy mô lớn " +msgstr "Chuyển sắc của các khe hốc, được tính toán trong không gian thế giới, hữu ích cho sự che khuất đi ở quy mô lớn hơn" + + +msgctxt "View3D" +msgid "Screen" +msgstr "Màn Hình" msgid "Curvature-based shading, useful for making fine details more visible" -msgstr "Tô sác cơ sở độ cong, lợi ích cho dễ thấy chi tiết nhỏ" +msgstr "Tô bóng trên cơ sở độ cong. Có lợi trong việc làm cho các chi tiết nhỏ nhìn thấy được rõ hơn" + + +msgctxt "View3D" +msgid "Both" +msgstr "Cả Hai" msgid "Use both effects simultaneously" -msgstr "Dùng hai hiệu ứng cùng một lượt" +msgstr "Dùng cả hai hiệu ứng cùng một lúc" msgid "Cavity Valley" -msgstr "Thung Lũng Lỗ Hổng" +msgstr "Vùng Trũng của Khe Hốc" msgid "Factor for the cavity valleys" -msgstr "Hệ số cho thung lũng lỗ hổng" +msgstr "Hệ số dành cho các vùng trũng của khe hốc" msgid "Show material color" -msgstr "Hiện màu vật liệu" +msgstr "Hiển thị màu của nguyên vật liệu" msgid "Show scene in a single color" -msgstr "Hiện cảnh bằng một màu" +msgstr "Hiển thị cảnh dùng đơn màu" msgid "Show object color" -msgstr "Hiện màu vật thể" +msgstr "Hiển thị màu của đối tượng" msgid "Show random object color" -msgstr "Hiện màu vật thể ngẫu nhiên" +msgstr "Hiển thị màu của đối tượng ngẫu nhiên" msgid "Show active color attribute" -msgstr "Hiện đặc điểm màu hoạt động" +msgstr "Hiển thị thuộc tính màu đang hoạt động" + + +msgid "Show the texture from the active image texture node using the active UV map coordinates" +msgstr "Hiển thị chất liệu từ nút chất liệu hình ảnh đang hoạt động bằng cách sử dụng tọa độ ánh xạ UV đang hoạt động" msgid "Curvature Ridge" -msgstr "Dãy Đỉnh Độ Cong" +msgstr "Độ Cong của Lằn Gợn" msgid "Factor for the curvature ridges" -msgstr "Hệ số cho dãy đỉnh độ cong" +msgstr "Hệ số dành cho các độ cong của lằn gợn" msgid "Curvature Valley" -msgstr "Thung Lủng Độ Cong" +msgstr "Độ Cong của Vùng Trũng" msgid "Factor for the curvature valleys" -msgstr "Hệ số cho thung lũng độ cong" +msgstr "Hệ số dành cho độ cong của các vùng trũng" msgid "Cycles Settings" -msgstr "Cài Đặt Cycles" +msgstr "Sắp Đặt của Cycles" msgid "Lighting Method for Solid/Texture Viewport Shading" -msgstr "Phương Pháp Ánh Sáng cho Tô Sắc Rắn/Chất Liệu Màn Chiếu " +msgstr "Phương pháp bố trí ánh sáng cho Tô Bóng Cổng Nhìn Lập Thể/Chất Liệu" msgid "Display using studio lighting" -msgstr "Hiển thị bằng ánh sáng xưởng" +msgstr "Hiển thị dùng ánh sáng studio" msgid "Display using matcap material and lighting" -msgstr "Hiển thị bằng vật liệu bắt va ánh sáng" +msgstr "Hiển thị dùng chất liệu matcap và bố trí ánh sáng" msgid "Display using flat lighting" -msgstr "Hiển thị bằng tô sắc đều" +msgstr "Hiển thị dùng bố trí ánh sáng bằng phẳng" msgid "Outline Color" -msgstr "Màu Nét Ngoài" +msgstr "Màu của Đường Viền" msgid "Color for object outline" -msgstr "Màu cho nét ngoài của vật thể" +msgstr "Màu của đường viền đối tượng" msgid "Render Pass to show in the viewport" -msgstr "Hiện Vòng Kết Xuất trong màn chiếu" +msgstr "Lượt Kết Xuất để hiển thị trong cổng nhìn" msgid "Diffuse Light" -msgstr "Đèn Tán Xạ" +msgstr "Ánh Sáng Khuếch Tán" msgid "Specular Light" -msgstr "Đèn Cao Quang" +msgstr "Ánh Sáng Lóng Lánh" msgid "Volume Light" -msgstr "Đèn Thể Tích" +msgstr "Ánh Sáng Thể Tích" + + +msgid "CryptoObject" +msgstr "Đối Tượng Bí Mật" + + +msgid "CryptoAsset" +msgstr "Tài Sản Bí Mật" + + +msgid "CryptoMaterial" +msgstr "Nguyên Vật Liệu Bí Mật" msgid "AOV" @@ -95167,267 +104674,355 @@ msgstr "AOV" msgid "Selected StudioLight" -msgstr "Đèn Xưởng Được Chọn" +msgstr "Ánh Sáng Studio được Chọn" msgid "Shadow Intensity" -msgstr "Cường Độ Bóng Tối" +msgstr "Độ Đậm của Bóng Tối" msgid "Darkness of shadows" -msgstr "Độ tối của bóng tối" +msgstr "Độ Đậm của Bóng Tối" msgid "Cavity" -msgstr "Lỗ Hổng" +msgstr "Khe Hốc" msgid "Show Cavity" -msgstr "Hiện lỗ hổng" +msgstr "Hiển Thị Khe Hốc" msgid "Show Object Outline" -msgstr "Hiện Nét Ngoài Vật Thể" +msgstr "Hiển Thị Đường Viền Đối Tượng" msgid "Show Shadow" -msgstr "Hiện Bóng Tối" +msgstr "Hiển Thị Bóng Tối" msgid "Specular Highlights" -msgstr "Cao Quang Bóng Loáng" +msgstr "Điểm Nhấn Lóng Lánh" msgid "Render specular highlights" -msgstr "Kết xuất cao quang bóng loáng" +msgstr "Kết xuất các điểm nhấn lóng lánh" msgid "Show X-Ray" -msgstr "Hiện X-Quang" +msgstr "Hiển Thị X-Quang" msgid "Show whole scene transparent" -msgstr "Hiện toàn bộ cảnh trong suốt" +msgstr "Hiển thị toàn cảnh trong suốt" msgid "Color for single color mode" -msgstr "Màu cho chế độ một màu" +msgstr "Màu cho chế độ màu đơn" msgid "Studiolight" -msgstr "Đèn Xưởng" +msgstr "Ánh Sáng Studio" msgid "Studio lighting setup" -msgstr "Cài đặt đèn xưởng" +msgstr "Sắp đặt ánh sáng studio" msgid "World Opacity" -msgstr "Độ Đục Thế Giới" +msgstr "Độ Đục của Thế Giới" msgid "Show the studiolight in the background" -msgstr "Hiện đèn xưởng trong nền" +msgstr "Hiển thị ánh sáng xưởng phim (studiolight) trên nền" msgid "Blur the studiolight in the background" -msgstr "Mờ hóa đèn xưởng trong nền" +msgstr "Làm Nhòe Mờ ánh sáng studiolight ở nền" msgid "Strength of the studiolight" -msgstr "Sức của đèn xưởng" +msgstr "Cường độ ánh sáng studiolight" msgid "Studiolight Rotation" -msgstr "Xoay Đèn Xưởng" +msgstr "Xoay Chiều Ánh Sáng Studiolight" msgid "Rotation of the studiolight around the Z-Axis" -msgstr "Xoay của đèn xưởng quanh Trục-Z" +msgstr "Xoay chiều của ánh sáng Studio (studiolight) xung quanh trục Z" msgid "Viewport Shading" -msgstr "Tô Sắc Màn Chiếu" +msgstr "Tô Bóng của Cổng Nhìn" msgid "Method to display/shade objects in the 3D View" -msgstr "Phương pháp cho hiển thị/tô sắc vật thể trong Màn 3D" +msgstr "Phương pháp để hiển thị/tô bóng đối tượng trong Khung Nhìn 3D" + + +msgid "When to preview the compositor output inside the viewport" +msgstr "Khi xem trước đầu ra của trình tổng hợp bên trong khung nhìn" + + +msgid "The compositor is disabled" +msgstr "Trình tổng hợp bị vô hiệu hóa" + + +msgid "The compositor is enabled only in camera view" +msgstr "Trình tổng hợp chỉ được bật trong góc nhìn của máy quay phim mà thôi" + + +msgid "The compositor is always enabled regardless of the view" +msgstr "Trình tổng hợp luôn luôn được bật bất kể góc nhìn là gì" msgid "Use depth of field on viewport using the values from the active camera" -msgstr "Dùng độ sâu trường cho màn chiếu bằng dùng các giá trị từ máy quay phim hoạt động" +msgstr "Sử dụng độ sâu trường ảnh trong cổng nhìn, dùng các giá trị từ máy quay phim đang hoạt động" msgid "Scene Lights" -msgstr "Đèn Cảnh" +msgstr "Ánh Sáng của Cảnh" msgid "Render lights and light probes of the scene" -msgstr "Kết xuát các đèn và các quang kế của cảnh" +msgstr "Kết xuất ánh sáng và các đầu thăm dò ánh sáng của cảnh" msgid "Scene World" -msgstr "Thế Giới Cảnh" +msgstr "Thế Giới của Cảnh" msgid "Use scene world for lighting" -msgstr "Dùng thế giới cảnh cho ánh sáng" +msgstr "Dùng thế giới của cảnh để bố trí ánh sáng" msgid "World Space Lighting" -msgstr "Ánh Sáng Không Gian Thế Giới" +msgstr "Bố Trí Ánh Sáng của Không Gian Thế Giới" msgid "Make the HDR rotation fixed and not follow the camera" -msgstr "Không đổi xoay của HDR và không cho đi theo máy quay phim" +msgstr "Cố định chiều xoay HDR và không đi theo máy quay phim" msgid "Make the lighting fixed and not follow the camera" -msgstr "Không cho ánh sáng đổi và không cho đi theo máy quay phim" +msgstr "Làm cho bố trí ánh sáng cố định và không đi theo máy quay phim" msgid "Show VR Controllers" -msgstr "Hiện Đồ Điều Khiển VR" +msgstr "Hiển Thị các Điều Khiển VR" msgid "Show Landmarks" -msgstr "Hiện Mốc Bờ" +msgstr "Hiển Thị Địa Ranh" msgid "Show VR Camera" -msgstr "Hiện Máy Quay Phim Sự Thật Ảo" +msgstr "Hiển Thị Máy Quay Phim VR" + + +msgid "Wire Color Type" +msgstr "Thể Loại Màu Dây" msgid "Theme" -msgstr "Phong Cách" +msgstr "Kiểu Mẫu" + + +msgid "Show scene wireframes with the theme's wire color" +msgstr "Hiển thị các khung dây của cảnh với màu dây từ kiểu mẫu" + + +msgid "Show object color on wireframe" +msgstr "Hiển thị màu đối tượng trên khung dây" + + +msgid "Show random object color on wireframe" +msgstr "Hiển thị màu đối tượng ngẫu nhiên trên khung dây" msgid "X-Ray Alpha" -msgstr "Độ Đục X-Quang" +msgstr "X-Quang Alpha" msgid "Amount of alpha to use" -msgstr "Mức độ đục để dùng" +msgstr "Lượng alpha sử dụng" msgid "View layer" -msgstr "Lớp hiển thị" +msgstr "Tầng góc nhìn" msgid "Active AOV" -msgstr "AOV Hoạt Động" +msgstr "AOV đang Hoạt Động" msgid "Active AOV Index" -msgstr "Chi Số AOV Hoạt Động" +msgstr "Chỉ Số AOV đang Hoạt Động" + + +msgid "Index of active AOV" +msgstr "Chỉ số AOV đang hoạt động" msgid "Active Layer Collection" -msgstr "Sưu Tập Lớp Hoạt Động" +msgstr "Bộ Sưu Tập Tầng Lớp đang Hoạt Động" msgid "Active layer collection in this view layer's hierarchy" -msgstr "Sưu tập lớp hoạt động trong tầng bậc của lớp hiển thị này" +msgstr "Bộ sưu tập tầng lớp đang hoạt động trong phân cấp của tầng góc nhìn" msgid "Active Lightgroup" -msgstr "NhómĐèn Hoạt Động" +msgstr "NhómÁnhSáng đang Hoạt Động" msgid "Active Lightgroup Index" -msgstr "Chỉ Số NhómĐèn Hoạt Động" +msgstr "Chỉ Số NhómÁnhSáng đang Hoạt Động" msgid "Index of active lightgroup" -msgstr "Chỉ số của nhóm đèn hoạt động" +msgstr "Chỉ số của nhóm ánh sáng đang hoạt động" msgid "Cycles ViewLayer Settings" -msgstr "Cài Đặt Lớp Hiển Thị Cycles" +msgstr "Sắp Đặt về Tầng Lớp Góc Nhìn của Máy Kết Xuất Cycles" msgid "Dependencies in the scene data" -msgstr "Tầng bậc nhờ trong dữ liệu cảnh" +msgstr "Những phụ thuộc trong dữ liệu của cảnh" + + +msgid "EEVEE Settings" +msgstr "Các Cài Đặt của EEVEE" + + +msgid "View layer settings for EEVEE" +msgstr "Các cài đặt của tầng lớp góc nhìn cho EEVEE" + + +msgid "Root of collections hierarchy of this view layer, its 'collection' pointer property is the same as the scene's master collection" +msgstr "Gốc của hệ thống tầng bậc các bộ sưu tập trong góc nhìn này, tính chất con trỏ ‘bộ sưu tập’ của nó cũng đồng thời là con trỏ của bộ sưu tập chính của cảnh" msgid "Material Override" -msgstr "Vượt Quyền Vật Liệu" +msgstr "Vượt Quyền Nguyên Vật Liệu" msgid "Material to override all other materials in this view layer" -msgstr "Vật liệu nào để vượt quyền cho tất cả vật liệu khác trong lớp hiển thị" +msgstr "Nguyên vật liệu dùng để thay thế toàn bộ các nguyên vật liệu khác trong Tầng Góc Nhìn này" msgid "All the objects in this layer" -msgstr "Tất cả vật thể trong lớp này" +msgstr "Toàn bộ các đối tượng trong tầng lớp này" msgid "Alpha Threshold" -msgstr "Ngưỡng Độ Đục" +msgstr "Giới Hạn Alpha" msgid "Z, Index, normal, UV and vector passes are only affected by surfaces with alpha transparency equal to or higher than this threshold" -msgstr "Vòng Z, chỉ số, pháp tuyến, UV, và vectơ chỉ được ảnh hướng bằng bề mặt có độ đục bằng hoặc cao hơn ngưỡng này" +msgstr "Các lượt về Z, Chỉ Số, pháp tuyến, UV, và vectơ chỉ bị ảnh hưởng bởi các bề mặt có độ trong alpha bằng hoặc cao hơn giới hạn này" msgid "Cryptomatte Levels" -msgstr "Tầng Mặt Nạ Mã" +msgstr "Số Tầng Phân của Lớp Vẽ Lồng Bí Mật" msgid "Sets how many unique objects can be distinguished per pixel" -msgstr "Đặt số lượng vật thể độc đáo được phân biệt tại mỗi điểm ảnh" +msgstr "Đặt số đối tượng đơn nhất có thể phân biệt tại mỗi điểm ảnh" msgid "Override number of render samples for this view layer, 0 will use the scene setting" -msgstr "Vượt quyền số lượng mẫu vật cho lớp hiển thị này, 0 sẽ dùng cài đặt cảnh" +msgstr "Vượt quyền số mẫu vật kết xuất cho Tầng Góc Nhìn này. Giá trị 0 nghĩa là sẽ sử dụng sắp đặt của cảnh" msgid "Enable or disable rendering of this View Layer" -msgstr "Bật hay tắt kết xuất Lớp Hiển Thị này" +msgstr "Bật hoặc tắt khả năng kết xuất của Tầng Góc Nhìn này" msgid "Render stylized strokes in this Layer" -msgstr "Kết xuất nét có phong cách trong Lớp này" +msgstr "Kết xuất các nét đã sắp đặt mốt trong Tầng này" msgid "Cryptomatte Accurate" -msgstr "Mặt Nạ Mã Chính Xác" +msgstr "Lớp Vẽ Lồng Bí Mật Chính Xác" msgid "Generate a more accurate cryptomatte pass" -msgstr "Chế tạo một vòng mặt nạ mã chính xác hơn" +msgstr "Sinh tạo lượt lớp vẽ lồng bí mật (cryptomatte pass) chính xác hơn" msgid "Cryptomatte Asset" -msgstr "Tích Sản Mặt Nạ Mã" +msgstr "Tài Sản của Lớp Vẽ Lồng Bí Mật" msgid "Render cryptomatte asset pass, for isolating groups of objects with the same parent" -msgstr "Kết xuất vòng tích sản mặt nạ mã, cho cô lập nhóm vật thể cùng phụ huynh" +msgstr "Kết xuất lượt về tài sản của Lớp Vẽ Lồng Bí Mật, dành cho các nhóm đối tượng biệt lập có cùng một phụ huynh" msgid "Cryptomatte Material" -msgstr "Vật Liệu Mặt Nạ Mã" +msgstr "Nguyên Vật Liệu của Lớp Vẽ Lồng Bí Mật" msgid "Render cryptomatte material pass, for isolating materials in compositing" -msgstr "Kết xuất vòng vật liệu mặt nạ mã, cho cô độc vật liệu khi ghép ảnh" +msgstr "Kết xuất lượt về nguyên vật liệu của Lớp Vẽ Lồng Bí Mật (cryptomatte material), hòng để biệt riêng các nguyên vật liệu trong quá trình tổng hợp" msgid "Cryptomatte Object" -msgstr "Vật Thể Mặt Nạ Mã" +msgstr "Đối Tượng của Lớp Vẽ Lồng Bí Mật" msgid "Render cryptomatte object pass, for isolating objects in compositing" -msgstr "Kết xuất vòng vặt thể mặt nạ mã, cho cô độc vật thể khi ghép ảnh" +msgstr "Kết xuất lượt về đối tượng của Lớp Vẽ Lồng Bí Mật, hòng để biệt lập các đối tượng trong quá trình tổng hợp" + + +msgid "View Layer settings for EEVEE" +msgstr "Các Cài Đặt của Tầng Lớp Góc Nhìn cho EEVEE" msgid "Deliver bloom pass" -msgstr "Đưa vòng nở" +msgstr "Cung cấp lượt về sáng lóa" + + +msgid "Deliver alpha blended surfaces in a separate pass" +msgstr "Cung cấp các bề mặt pha trộn alpha trong một lượt riêng biệt" msgid "Deliver volume direct light pass" -msgstr "Đưa vòng ánh sáng trực tiếp thể tích" +msgstr "Cung cấp lượt về ánh sáng thể tích trực tiếp" + + +msgid "Path to data that is viewed" +msgstr "Đường dẫn đến dữ liệu quan sát" + + +msgid "Viewer Path Element" +msgstr "Phần Tử trên Đường Dẫn của Trình Quan Sát" + + +msgid "Element of a viewer path" +msgstr "Phần tử trên một đường dẫn trình của trình quan sát" + + +msgid "Type of the path element" +msgstr "Thể loại phần tử trên đường dẫn" + + +msgid "Name that can be displayed in the UI for this element" +msgstr "Tên có thể được hiển thị trong giao diện người dùng cho thành phần này" + + +msgid "Node ID" +msgstr "ID của Nút" + + +msgid "Repeat Output Node ID" +msgstr "ID của Nút Đầu Ra Nhắc Lại" + + +msgid "Simulation Output Node ID" +msgstr "ID của Nút Đầu Ra Mô Phỏng" msgid "Volume Display" @@ -95435,107 +105030,171 @@ msgstr "Hiển Thị Thể Tích" msgid "Volume object display settings for 3D viewport" -msgstr "Cài đặt hiển thị vật thể thể tích cho màn chiếu 3D" +msgstr "Sắp đặt về hiển thị đối tượng thể tích trong cổng nhìn 3D" msgid "Thickness of volume display in the viewport" -msgstr "Bề dày của thể tích được hiển thị trong màn chiếu" +msgstr "Độ dày đặc của thể tích hiển thị trong cổng nhìn" msgid "Interpolation method to use for volumes in solid mode" -msgstr "Phương pháp suy nội để dùng cho thể tích trong chế độ rắn" +msgstr "Phương pháp nội suy sử dụng cho các thể tích trong chế độ đặc/lập thể" msgid "Wireframe Detail" -msgstr "Chi Tiết Khung Sợi Dây" +msgstr "Chi Tiết Khung Dây" msgid "Amount of detail for wireframe display" -msgstr "Bao nhiêu chi tiết cho hiển thị khung sợi dây" +msgstr "Lượng chi tiết để hiển thị khung dây" msgid "Coarse" -msgstr "Thô" +msgstr "Thô Thiển" msgid "Display one box or point for each intermediate tree node" -msgstr "Hiển thị một hộp hay điểm cho mỗi giao điểm cây cấp giữa" +msgstr "Đối với mỗi nút trung gian trong cây nút, hiển thị một hình hộp hoặc một điểm cho chúng" msgid "Fine" -msgstr "Nhiễn" +msgstr "Tinh Tế" + + +msgid "Display box for each leaf node containing 8×8 voxels" +msgstr "Hiển thị hình hộp cho mỗi nút nhánh lá chứa 8×8 thể tích tử" msgid "Type of wireframe display" -msgstr "Kiểu hiển thị khung sợi dây" +msgstr "Kiểu hiển thị khung dây" msgid "Don't display volume in wireframe mode" -msgstr "Không hiển thị thể tích trong chế độ khung sợi dây" +msgstr "Không hiển thị thể tích trong chế độ khung dây" msgid "Display single bounding box for the entire grid" -msgstr "Hiển thị một hộp bao quanh cho toàn bộ đồ thị" +msgstr "Hiển thị một đơn khung viền hình hộp cho toàn thể khung lưới đồ thị" msgid "Boxes" -msgstr "Hộp" +msgstr "Hình Hộp" msgid "Display bounding boxes for nodes in the volume tree" -msgstr "Hiển thị hộp bao quanh cho các giao điểm trong cây thể tích" +msgstr "Đối với các nút trong cây thể tích, hiển thị những khung viền hình hộp cho chúng" msgid "Display points for nodes in the volume tree" -msgstr "Hiển thị điểm cho các giao điểm trong cây thể tích" +msgstr "Đối với các nút trong cây thể tích, hiển thị các điểm cho chúng" msgid "Volume Grid" -msgstr "Đồ Thị Thể Tích" +msgstr "Khung Lưới Đồ Thị Thể Tích" msgid "3D volume grid" -msgstr "Đồ thị thể tích 3D" +msgstr "Khung lưới đồ thị thể tích 3D" msgid "Number of dimensions of the grid data type" -msgstr "Số lượng chiều cho kiểu dữ liệu của đồ thị" +msgstr "Số chiều của kiểu dữ liệu khung lưới đồ thị" + + +msgctxt "Volume" +msgid "Data Type" +msgstr "Kiểu Dữ Liệu" msgid "Data type of voxel values" -msgstr "Kiểu dữ liệu cho giá trị của thể tích tử" +msgstr "Kiểu dữ liệu của những giá trị thể tích tử" + + +msgctxt "Volume" +msgid "Boolean" +msgstr "Bool" + + +msgctxt "Volume" +msgid "Float" +msgstr "Số Thật" msgid "Single precision float" -msgstr "Số thật dấu phẩy động đơn" +msgstr "Số thực mức chính xác đơn" + + +msgctxt "Volume" +msgid "Double" +msgstr "Số Thực Double" msgid "Double precision" -msgstr "Số thật dấu phẩy động đôi" +msgstr "Mức chính xác đôi" + + +msgctxt "Volume" +msgid "Integer" +msgstr "Số Nguyên" + + +msgctxt "Volume" +msgid "Integer 64-bit" +msgstr "Số Nguyên 64-bit" msgid "64-bit integer" -msgstr "Số nguyên 64 bit" +msgstr "Số nguyên 64-bit" + + +msgctxt "Volume" +msgid "Mask" +msgstr "Màn Chắn Lọc" msgid "No data, boolean mask of active voxels" -msgstr "Không có dữ liệu, mặt nạ bool của thể tích hoạt động" +msgstr "Không phải là dữ liệu, màn chắn lọc bool của thể tích tử đang hoạt động" + + +msgctxt "Volume" +msgid "Float Vector" +msgstr "Vectơ Số Thực" msgid "3D float vector" -msgstr "Vectơ số thật dấu phẩy động đơn 3D" +msgstr "Véctơ 3D số thực float" + + +msgctxt "Volume" +msgid "Double Vector" +msgstr "Véctơ Số Thực Double" msgid "3D double vector" -msgstr "Vectơ số thật dấu phẩy động đôi 3D" +msgstr "Véctơ 3D số thực double" + + +msgctxt "Volume" +msgid "Integer Vector" +msgstr "Véctơ Số Nguyên" msgid "3D integer vector" -msgstr "Vectơ số nguyên 3D" +msgstr "Véctơ 3D số nguyên" + + +msgctxt "Volume" +msgid "Points (Unsupported)" +msgstr "Điểm (Chưa Hỗ Trợ)" msgid "Points grid, currently unsupported by volume objects" -msgstr "Đồ thị điểm, hiện tại vật thể thể tích chưa hỗ trợ" +msgstr "Khung lưới đồ thị điểm, hiện tại các đối tượng thể tích chưa hỗ trợ cái này" + + +msgctxt "Volume" +msgid "Unknown" +msgstr "Chưa Biết" msgid "Unsupported data type" @@ -95543,55 +105202,55 @@ msgstr "Kiểu dữ liệu chưa hỗ trợ" msgid "Is Loaded" -msgstr "Đã Nhập" +msgstr "Đã Được Nạp" msgid "Grid tree is loaded in memory" -msgstr "Cây đồ thị đã nhập vào bộ nhớ" +msgstr "Cây khung lưới đồ thị đã được nạp vào trong bộ nhớ" msgid "Matrix Object" -msgstr "Vật Thể Ma Trận" +msgstr "Đối Tượng của Ma Trận" msgid "Transformation matrix from voxel index to object space" -msgstr "Ma trận biến hóa từ chỉ số thể tích tử đến không gian vật thể" +msgstr "Ma trận biến hóa từ chỉ số thể tích tử đến không gian đối tượng" msgid "Volume grid name" -msgstr "Tên đồ thị thể tích" +msgstr "Tên của khung lưới đồ thị thể tích" msgid "Volume Grids" -msgstr "Đồ Thị Thể Tích" +msgstr "Khung Lưới Đồ Thị Thể Tích" msgid "Active Grid Index" -msgstr "Chi Số Đồ Thị Hoạt Động" +msgstr "Chỉ Số Khung Lưới Đồ Thị đang Hoạt Động" msgid "Index of active volume grid" -msgstr "Chỉ số của đồ thị thể tích hoạt động" +msgstr "Chỉ số của khung lưới đồ thị thể tích đang hoạt động" msgid "If loading grids failed, error message with details" -msgstr "Nếu nhập đồ thị bị thất bại, tin nhắn sai lầm có chi tiết" +msgstr "Nếu việc nạp các khung lưới đồ thị không thành công thì hiển thị thông điệp báo lỗi với các chi tiết" msgid "Frame number that volume grids will be loaded at, based on scene time and volume parameters" -msgstr "Số bức ảnh để nhập đồ thị thể tích, tùy thời gian cảnh và tham số thể tích" +msgstr "Số khung hình mà khung lưới đồ thị thể tích sẽ được nạp vào, dựa trên thời gian của cảnh và các tham số thể tích" msgid "Frame File Path" -msgstr "Đường Đẫn Tập Tin Bức Ảnh" +msgstr "Đường Dẫn Tập Tin của Khung Hình" msgid "Volume file used for loading the volume at the current frame. Empty if the volume has not be loaded or the frame only exists in memory" -msgstr "Tập tin thể tích dùng cho nhập thể tích tại bức ảnh hiện tại. Trống rỗng nếu thể tích chưa được nhập hoặc bức ảnh chỉ tồn tại trong bộ nhớ" +msgstr "Tập tin về thể tích sử dụng để nạp thể tích tại khung hình hiện tại. Trống rỗng nếu thể tích chưa được nạp vào hoặc khung hình chỉ tồn tại trong bộ nhớ mà thôi" msgid "List of grids and metadata are loaded in memory" -msgstr "Danh sách các đồ thị và siêu dữ liệu đã nhập vào bộ nhớ" +msgstr "Danh sách các khung lưới đồ thị và siêu dữ liệu được nạp vào bộ nhớ" msgid "Volume Render" @@ -95599,51 +105258,51 @@ msgstr "Kết Xuất Thể Tích" msgid "Volume object render settings" -msgstr "Cài đặt kết xuất cho vật thể thể tích" +msgstr "Sắp đặt về kết xuất đối tượng thể tích" msgid "Specify volume data precision. Lower values reduce memory consumption at the cost of detail" -msgstr "Chĩ định độ chính xác cho dữ liệu thể tích. Giá trị nhỏ hơn giảm bớt sử dụng bộ nhớ nhưng giảm chi tiết" +msgstr "Chỉ định độ chính xác của dữ liệu thể tích. Giá trị thấp hơn tuy giảm mức tiêu thụ bộ nhớ song sẽ ảnh hưởng đến mức chi tiết" msgid "Full float (Use 32 bit for all data)" -msgstr "Số thật dấu hẫy động toàn bộ (Dùng 32 bit cho hết dữ liệu)" +msgstr "Full float (Sử dụng 32 bit cho toàn bộ dữ liệu)" msgid "Half float (Use 16 bit for all data)" -msgstr "Số thật dấu phẩy động nửa (Dùng 16 bit cho hết dữ liệu)" +msgstr "Half float (Sử dụng 16 bit cho toàn bộ dữ liệu)" msgid "Variable" -msgstr "Biến Thiên" +msgstr "Biến Đổi" msgid "Use variable bit quantization" -msgstr "Dùng phân hóa bit biến thiên" +msgstr "Sử dụng lượng tử hóa bit biến đổi" msgid "Specify volume density and step size in object or world space" -msgstr "Chỉ định tỉ trọng thể tích và kích thước bước trong không gian vật thể hay thế giới" +msgstr "Xác định độ dày đặc của thể tích và kích thước bước trong không gian đối tượng hoặc không gian thế giới" msgid "Keep volume opacity and detail the same regardless of object scale" -msgstr "Giữ nguyên độ đục thể tích và chi tiết không quan tâm phóng to của vật thể" +msgstr "Duy trì nguyên độ đục và chi tiết của thể tích, bất kể tỷ lệ của đối tượng là bao nhiêu" msgid "Specify volume step size and density in world space" -msgstr "Chỉ định kích thước bước và tỉ trọng thể tích trong không gian thế giới" +msgstr "Xác định kích thước phân bước và độ dày đặc của thể tích trong không gian thế giới" msgid "Distance between volume samples. Lower values render more detail at the cost of performance. If set to zero, the step size is automatically determined based on voxel size" -msgstr "Khoảng cách giữa mẫu thể tích. Giá trị thấp hơn được kết xuất chi tiết nhiều hơn nhưng giảm hiệu suất. Nếu đặt = 0, Blender sẽ tự động tính kích thước của bước tùy kích thước của thể tích tử" +msgstr "Khoảng cách giữa các mẫu vật về thể tích. Giá trị thấp hơn sẽ kết xuất nhiều chi tiết hơn, song sẽ thi hành chậm hơn. Nếu đặt là 0 thì cỡ bước sẽ được tự động quyết định, dựa trên kích thước của thể tích tử" msgid "Walk navigation settings" -msgstr "Cài đặt chuyển hướng đi bộ" +msgstr "Sắp đặt về điều hướng khi đi bộ" msgid "Jump Height" -msgstr "Độ Cao Nhảy" +msgstr "Độ Cao Khi Nhảy Lên" msgid "Maximum height of a jump" @@ -95651,39 +105310,39 @@ msgstr "Độ cao tối đa khi nhảy lên" msgid "Mouse Sensitivity" -msgstr "Cảm nhảy của chuột" +msgstr "Mức Nhạy Cảm của Chuột" msgid "Speed factor for when looking around, high values mean faster mouse movement" -msgstr "Hệ số tốc độ khi nhìn quanh, giá trị càng cao chuột di chuyển càng lẹ" +msgstr "Hệ số tốc độ khi quan sát chung quanh, giá trị càng cao thì chuột di chuyển càng nhanh" msgid "Teleport Duration" -msgstr "Thời Gian Biến Xuất" +msgstr "Khoảng Thời Lượng Viễn Tải" msgid "Interval of time warp when teleporting in navigation mode" -msgstr "Đoạn của sự méo thời gian khi biến xuất trong chế độ chuyển hướng" +msgstr "Khoảng thời gian biến dạng khi viễn tải trong chế độ điều hướng" msgid "Walk with gravity, or free navigate" -msgstr "Đi bộ với hấp dẫn hay chuyển hướng tự do" +msgstr "Đi bộ có trọng lực, hoặc điều hướng tự do" msgid "Reverse Mouse" -msgstr "Nghịch Chuột" +msgstr "Đảo Nghịch Chuột" msgid "Reverse the vertical movement of the mouse" -msgstr "Lật ngược vị trí chuyển động của chuột" +msgstr "Đảo ngược chuyển động dựng đứng của chuột" msgid "View Height" -msgstr "Độ Cao Điểm Nhìn" +msgstr "Độ Cao Góc Nhìn" msgid "View distance from the floor when walking" -msgstr "Độ cao từ sàn khi đi bộ" +msgstr "Khoảng cách của góc nhìn từ sàn khi đi bộ" msgid "Walk Speed" @@ -95691,19 +105350,19 @@ msgstr "Tốc Độ Đi Bộ" msgid "Base speed for walking and flying" -msgstr "Tốc độ cơ sở cho đi bộ và bay" +msgstr "Tốc độ chuẩn dành cho đi bộ và bay lượn" msgid "Multiplication factor when using the fast or slow modifiers" -msgstr "Hệ số nhân khi sử dụng bộ điều chỉnh nhanh hay chậm" +msgstr "Hệ số nhân khi sử dụng các bộ điều chỉnh về nhanh hay chậm" msgid "Open window" -msgstr "Mở Cửa sổ" +msgstr "Mở cửa sổ" msgid "Window height" -msgstr "Chiều cao Cửa Sổ" +msgstr "Chiều cao của cửa sổ" msgid "Parent Window" @@ -95711,19 +105370,24 @@ msgstr "Cửa Sổ Phụ Huynh" msgid "Active workspace and scene follow this window" -msgstr "Công trường và cảnh hoạt động đi theo cửa sổ" +msgstr "Không gian làm việc đang hoạt động và cảnh đi theo cửa sổ này" msgid "Active scene to be edited in the window" -msgstr "Cảnh hoạt động cho biên tập trong cửa sổ" +msgstr "Cảnh đang hoạt động để biên soạn trong cửa sổ" + + +msgctxt "Screen" +msgid "Screen" +msgstr "Màn Hình" msgid "Active workspace screen showing in the window" -msgstr "Màn công trường hoạt động đang hiện trong cửa sổ" +msgstr "Màn hình của không gian làm việc đang hoạt động hiển thị trong cửa sổ" msgid "The active workspace view layer showing in the window" -msgstr "Lớp của màn công trường hoạt động đang hiện trong cửa sổ" +msgstr "Tầng góc nhìn của không gian làm việc đang hoạt động hiển thị trong cửa sổ" msgid "Window width" @@ -95731,47 +105395,51 @@ msgstr "Chiều rộng cửa sổ" msgid "Active workspace showing in the window" -msgstr "Công trường hoạt động đang hiện trong cửa sổ" +msgstr "Không gian làm việc đang hoạt động hiển thị trong cửa sổ" msgid "Horizontal location of the window" -msgstr "Vị trí ngang của cửa sổ" +msgstr "Vị trí theo chiều ngang của cửa sổ" msgid "Vertical location of the window" -msgstr "Vị trí dộc của cửa sổ" +msgstr "Vị trí theo chiều dọc của cửa sổ" msgid "Work Space Tool" -msgstr "Dụng Cụ Công Trường" +msgstr "Công Cụ Không Gian Làm Việc" msgid "Has Data-Block" -msgstr "Có Cục Dữ Liệu" +msgstr "Có Khối Dữ Liệu" msgid "Identifier Fallback" -msgstr "Mã Nhận Dạng Dự Phòng" +msgstr "Định Danh Nhận Dạng Dự Bị" msgid "Tool Mode" -msgstr "Chế Độ Dụng Cụ" +msgstr "Chế Độ Công Cụ" msgid "Use Paint Canvas" -msgstr "Sử Dụng Sơn Mặt Sơn" +msgstr "Sử Dụng Khung Vẽ Sơn" + + +msgid "Does this tool use a painting canvas" +msgstr "Công cụ này có sử dụng một khung vẽ sơn hay không" msgid "Widget" -msgstr "Khiển Tố" +msgstr "Thành Tố Điều Khiển" msgid "Lighting for a World data-block" -msgstr "Ánh Sáng cho một cục dữ liệu Thế Giới" +msgstr "Ánh sáng cho khối dữ liệu Thế Giới" msgid "Length of rays, defines how far away other faces give occlusion effect" -msgstr "Bề dài của tia, cho chỉ định cách xa cho mặt khác có hiệu ứng che khuất" +msgstr "Chiều dài của các tia xạ, xác định khoảng cách các mặt khác cách xa là bao nhiêu, trước khi có hiệu ứng mờ khuất đi" msgid "World Mist" @@ -95779,43 +105447,43 @@ msgstr "Sương Mù Thế Giới" msgid "Mist settings for a World data-block" -msgstr "Cài đặt sương mù cho một cục dữ liệu Thế Giới" +msgstr "Sắp đặt sương mù đối với khối dữ liệu Thế Giới" msgid "Distance over which the mist effect fades in" -msgstr "Khoảng cách sương mù mới bắt đầu phai" +msgstr "Khoảng cách hiệu ứng sương mù dày đặc dần" msgid "Type of transition used to fade mist" -msgstr "Loại tiến triển dùng cho phai đến sương mù" +msgstr "Kiểu chuyển tiếp sử dụng để phai mờ sương mù" msgid "Use quadratic progression" -msgstr "Dùng tiến triển bậc hai" +msgstr "Dùng tiến trình bình phương" msgid "Use linear progression" -msgstr "Dùng tiến triển bậc một" +msgstr "Dùng tiến trình tuyến tính" msgid "Inverse Quadratic" -msgstr "Nghịch Bấc Hai" +msgstr "Đảo Nghịch Bậc Hai" msgid "Use inverse quadratic progression" -msgstr "Dùng tiến triển bậc hai đảo nghịch" +msgstr "Dùng tiến trình bình phương đảo nghịch" msgid "Control how much mist density decreases with height" -msgstr "Điều khiểu giảm tỉ trọng sương mù với độ cao" +msgstr "Điều khiểu mức suy giảm độ dày đặc của sương mù với độ cao" msgid "Overall minimum intensity of the mist effect" -msgstr "Cường độ cực tiểu tổng quát của hiệu ứng sương mù" +msgstr "Cường độ tối thiểu tổng quát của hiệu ứng sương mù" msgid "Starting distance of the mist, measured from the camera" -msgstr "Khoảng cách bắt đầu sương mù, đo từ máy quay phim" +msgstr "Khoảng bắt đầu của sương mù, đo từ máy quay phim" msgid "Use Mist" @@ -95823,59 +105491,59 @@ msgstr "Dùng Sương Mù" msgid "Occlude objects with the environment color as they are further away" -msgstr "Che khuất vật thể với màu môi trường càng nhiều cho vật thể càng xa" +msgstr "Làm cho mờ khuất đối tượng đi bằng màu môi trường, càng xa càng bị mờ đi nhiều" msgid "XR Action Map" -msgstr "Ánh Xạ Hành Động XR" +msgstr "Bảng Ánh Xạ Hành Động XR" msgid "Items in the action map, mapping an XR event to an operator, pose, or haptic output" -msgstr "Những mặt hành trong ánh xạ bản đồ, ánh xạ một sự kiện XR đến một thao tác, dạng đứng, hay ngõ ra khác" +msgstr "Những phần tử trong bảng hành động, ánh xạ một sự kiện XR đến một thao tác, tư thế, hoặc đầu ra xúc tác nào đó" msgid "Name of the action map" -msgstr "Tên của ánh xạ hành động" +msgstr "Tên của bảng hành động" msgid "Selected Item" -msgstr "Mặt Hàng Được Chọn" +msgstr "Mục được Chọn" msgid "XR Action Map Binding" -msgstr "Sứ Trói Lại Ánh Xạ Hành Động XR" +msgstr "Kết Buộc Ánh Xạ Hành Động XR" msgid "Binding in an XR action map item" -msgstr "Sự trói lại trong một mặt hàng ánh xạ của hành động" +msgstr "Kết buộc trong một mục của bảng ánh xạ hành động XR" msgid "Axis 0 Region" -msgstr "Vùng Trùc 0" +msgstr "Vùng của Trục 0" msgid "Action execution region for the first input axis" -msgstr "Vùng thực hành hành động cho trục ngõ vào thứ nhất" +msgstr "Vùng thi hành hàng động cho trục thứ nhất cung cấp ở đầu vào" msgid "Use any axis region for operator execution" -msgstr "Dùng bất cứ vùng trúc nào cho thực hành thao tác" +msgstr "Sử dụng bất cứ vùng của trục nào để thi hành thao tác" msgid "Use positive axis region only for operator execution" -msgstr "Dùng vùng trúc dương chỉ cho thực hành thao tác" +msgstr "Chỉ sử dụng vùng của trục dương (+) để thi hành thao tác mà thôi" msgid "Use negative axis region only for operator execution" -msgstr "Dùng vùng trúc âm chỉ cho thực hành thao tác" +msgstr "Chỉ sử dụng vùng của trục âm (-) để thi hành thao tác mà thôi" msgid "Axis 1 Region" -msgstr "Vùng Trùc 1" +msgstr "Vùng của Trục 1" msgid "Action execution region for the second input axis" -msgstr "Vùng thực hành hành động cho trục ngõ vào thứ hai" +msgstr "Vùng thi hành hàng động cho trục thứ hai cung cấp ở đầu vào" msgid "Component Paths" @@ -95883,131 +105551,131 @@ msgstr "Đường Dẫn Thành Phần" msgid "OpenXR component paths" -msgstr "Đường dẫn của thành phần OpenXR" +msgstr "Đường dẫn thành phần OpenXR" msgid "Name of the action map binding" -msgstr "Tên của sự trói lại ánh xạ của hảnh động" +msgstr "Tên của kết buộc trong bảng ánh xạ hành động" msgid "Pose Location Offset" -msgstr "Nới Vị Trí Dạng Đứng" +msgstr "Dịch Chuyển trong Vị Trí của Tư Thế" msgid "Pose Rotation Offset" -msgstr "ới Xoay Dạng Đứng" +msgstr "Dịch Chuyển trong Xoay Chiều của Tư Thế" msgid "OpenXR interaction profile path" -msgstr "Đường dẫn mặt cắt cho tương tác của OpenXR" +msgstr "Đường dẫn đến hồ sơ tương tác OpenXR" msgid "Input threshold for button/axis actions" -msgstr "Ngưỡng ngõ vào cho hành động nút/trục" +msgstr "Ngưỡng đầu vào cho các hành động nút bấm/trục" msgid "XR Action Map Bindings" -msgstr "Sợ Trói Lại Ánh Xạ Hành Động XR" +msgstr "Kết Buộc trong bảng Ánh Xạ Hành Động XR" msgid "Collection of XR action map bindings" -msgstr "Sưu tập sự trói lại ánh xạ của hành động XR" +msgstr "Bộ sưu tập các kết buộc trong bảng ánh xạ hành động XR" msgid "XR Action Map Item" -msgstr "Mặt Hàng Ánh Xạ Hành Động XR" +msgstr "Phần Tử trong Bảng Ánh Xạ Hành Động XR" msgid "Bimanual" -msgstr "Hai Đường Dẫn" +msgstr "Hành Động Hai Tay" msgid "The action depends on the states/poses of both user paths" -msgstr "Hành động nhờ trạng thái/dạng đứng của cả hai đường dẫn người dùng" +msgstr "Hành động phụ thuộc vào các trạng thái/tư thế của cả hai đường dẫn người dùng" msgid "Bindings" -msgstr "Sự Trói Lại" +msgstr "Kết Buộc" msgid "Bindings for the action map item, mapping the action to an XR input" -msgstr "Sự trói lại cho mặt hàng ánh xạ hành động, ánh xạ hành động đến ngõ ra XR" +msgstr "Những kết buộc cho phần tử trong bảng hành động, ánh xạ từ hành động sang đầu vào của XR" msgid "Haptic Amplitude" -msgstr "Biên Độ Tương Tác Đụng" +msgstr "Biên Độ Xúc Tác" msgid "Intensity of the haptic vibration, ranging from 0.0 to 1.0" -msgstr "Cường độ của rung động tương tác đụng, phạm vi từ 0.0 đến 1.0" +msgstr "Cường độ rung xúc tác, dao động trong khoảng từ 0,0 đến 1,0" msgid "Haptic Duration" -msgstr "Giai Đoạn Tương Tác Đụng" +msgstr "Thời Lượng Xúc Tác" msgid "Haptic duration in seconds. 0.0 is the minimum supported duration" -msgstr "Giai đoạn tương tác (giây). 0.0 là cực tiểu" +msgstr "Khoảng thời lượng xúc tác trong số giây đồng hồ. 0.0 là khoảng thời lượng tối thiểu hỗ trợ" msgid "Haptic Frequency" -msgstr "Tần Số Tương Tác Đụng" +msgstr "Tần Số Xúc Tác" msgid "Frequency of the haptic vibration in hertz. 0.0 specifies the OpenXR runtime's default frequency" -msgstr "Tần số của rung động tương tác đụng (Hz). 0.0 là tần số mặc định của bộ thời chạy của OpenXR" +msgstr "Tần số rung động xúc tác trong đơn vị hertz. 0.0 xác định tần số mặc định trong thời gian thi hành của OpenXR" msgid "Haptic Match User Paths" -msgstr "Tần số của rung động tương tác đụng (Hz). 0.0 là tần số " +msgstr "Xúc Tác Khớp với Đường Dẫn Người Dùng" msgid "Apply haptics to the same user paths for the haptic action and this action" -msgstr "Áp dụng tương tác đụng với cùng đường dẫn người dùng cho hành động tương tác đụng và hành động này" +msgstr "Áp dụng xúc tác vào cùng một đường dẫn người dùng cho hành động xúc tác và hành động này" msgid "Haptic mode" -msgstr "Chế độ tương tác đụng" +msgstr "Chế độ xúc giác" msgid "Haptic application mode" -msgstr "Chế độ áp dụng của tương tác đụng" +msgstr "Chế độ ứng dụng xúc tác" msgid "Apply haptics on button press" -msgstr "Áp dụng tương tác đụng khi bấm nút" +msgstr "Áp dụng xúc tác khi nhấn nút" msgid "Apply haptics on button release" -msgstr "Áp dụng tương tác đụng khi thả nút" +msgstr "Áp dụng xúc tác khi thả nút" msgid "Press Release" -msgstr "Bấm & Thả" +msgstr "Nhấn-Thả" msgid "Apply haptics on button press and release" -msgstr "Áp dụng tương tác đụng khi bấm và thả nút" +msgstr "Áp dụng xúc tác trên cái nhấn và thả nút" msgid "Apply haptics repeatedly for the duration of the button press" -msgstr "Áp đụng tương tác đụng nhiều lần cho giai đoạn bấm nút" +msgstr "Áp dụng xúc tác nhiều lần, nhắc đi nhắc lại, trong khoảng thời lượng nhấn nút" msgid "Haptic Name" -msgstr "Tên Tương Tác Đụng" +msgstr "Tên Xúc Tác" msgid "Name of the haptic action to apply when executing this action" -msgstr "Tên của hành động tương tác đụng để áp dụng khi thực thi hành động này" +msgstr "Tên của hành động xúc tác áp dụng khi thực hiện hành động này" msgid "Name of the action map item" -msgstr "Tên của mặc hàng ánh xạ hành động" +msgstr "Tên của phần tử ánh xạ hành động" msgid "Identifier of operator to call on action event" -msgstr "Tên của thao tác để kêu khi có sự kiện hành động" +msgstr "Định danh của thao tác để thi hành khi có sự kiện xảy ra" msgid "Operator Mode" @@ -96015,79 +105683,75 @@ msgstr "Chế Độ Thao Tác" msgid "Operator execution mode" -msgstr "Chế độ thực thi thao tác" +msgstr "Chế độ thi hành thao tác" msgid "Execute operator on button press (non-modal operators only)" -msgstr "Thực thi thao khi bấm nút (chỉ cho các thao tác không cách thức)" +msgstr "Thi hành thao tác khi nút được bấm (duy các thao tác phi mô thái (non-modal) mà thôi)" msgid "Execute operator on button release (non-modal operators only)" -msgstr "Thực thi thao khi thả nút (chỉ cho các thao tác không cách thức)" +msgstr "Thi hành thao tác khi nút được thả ra (duy các thao tác phi mô thái (non-modal) mà thôi)" msgid "Modal" -msgstr "Cách Thức" +msgstr "Mô Thái" msgid "Use modal execution (modal operators only)" -msgstr "Dùng thực thi cách thức (chỉ cho các thao tác cách thức)" +msgstr "Sử dụng sự thi hành mô thái (duy các thao tác mô thái mà thôi)" msgid "Name of operator (translated) to call on action event" -msgstr "Tên của thao tác (được phiên dịch) để kêu khi có sự kiện hành động" +msgstr "Tên của thao tác (đã dịch) để gọi khi sự kiện hành động xảy ra" msgid "Is Controller Aim" -msgstr "Là Mục Tiêu Đồ Điều Khiển" +msgstr "Là Mục Tiêu Điều Khiển" msgid "The action poses will be used for the VR controller aims" -msgstr "Đạng đứng của hành động sẽ được sử dụng cho mục tiêu của đồ điều khiển VR" +msgstr "Các tư thế hành động sẽ được sử dụng cho các mục tiêu điều khiển VR" msgid "Is Controller Grip" -msgstr "Lả Đồ Cầm Đồ Điều Khiển" +msgstr "Là Cần Nắm Điều Khiển" msgid "The action poses will be used for the VR controller grips" -msgstr "Các hành động sẽ được sử dụng ho đồ cầm của đồ điều khiển" +msgstr "Các tư thế hành động sẽ được sử dụng cho cần nắm điều khiển VR" msgid "Selected Binding" -msgstr "Sự Trói Lại Được Chọn" +msgstr "Kết Buộc được Chọn" msgid "Currently selected binding" -msgstr "Sự trói lại được chọn hiện tại" +msgstr "Kết buộc được chọn hiện tại" msgid "Action type" -msgstr "Loại hành động" +msgstr "Thể Loại Hành Động" msgid "Float action, representing either a digital or analog button" -msgstr "Hành động số thật, làm đại diện cho một nút kỹ thuật số hay " +msgstr "Hàng động số thực, đại diện cho một nút kỹ thuật số hay một nút kỹ thuật tương tự (analog)" msgid "Vector2D" -msgstr "Vectơ2D" - - -msgid "2D float vector action, representing a thumbstick or trackpad" -msgstr "Hành động vectơ số thật 2D, đại diện cho một cây ngón tay cái hay bàn di chuột" +msgstr "Véctơ 2D" msgid "3D pose action, representing a controller's location and rotation" -msgstr "Hành động dạng đứng 3D, đại diện cho vị trí và xoay của một đồ điều khiển" +msgstr "Hành động của tư thế 3D, đại diện cho vị trí và xoay chiều của điều khiển" msgid "Vibration" -msgstr "Rung Động" +msgstr "Rung" msgid "Haptic vibration output action, to be applied with a duration, frequency, and amplitude" -msgstr "Hành động ngõ ra rung động tương tác đụng, để áp dụng với một giai đoạn, tần số, và biên độ" +msgstr "Hành động đầu ra rung xúc giác (tay), sẽ được áp dụng với một khoảng thời lượng, tần số và biên độ" msgid "User Paths" @@ -96095,23 +105759,23 @@ msgstr "Đường Dẫn Người Dùng" msgid "OpenXR user paths" -msgstr "Đường dẫn của người dùng OpenXR" +msgstr "Đường dẫn người dùng OpenXR" msgid "XR Action Map Items" -msgstr "Mặt Hàng Ánh Xạ Hành Động XR" +msgstr "Các Ánh Xạ Hành Động XR" msgid "Collection of XR action map items" -msgstr "Sưu tập mặt hàng ánh xạ hành động XR" +msgstr "Bộ sưu tập các ánh xạ hành động XR" msgid "XR Action Maps" -msgstr "Ánh Xạ Hành Động XR" +msgstr "Các Ánh Xạ Hành Động" msgid "Collection of XR action maps" -msgstr "Sưu tập ánh xạ hành động XR" +msgstr "Bộ sưu tập các ánh xạ hành động XR" msgid "XR Component Path" @@ -96127,79 +105791,79 @@ msgstr "Đường Dẫn Thành Phần XR" msgid "Collection of OpenXR component paths" -msgstr "Sưu tập đường dẫn của thành phần OpenXR" +msgstr "Bộ sưu tập các đường dẫn thành phần OpenXR" msgid "XR Data for Window Manager Event" -msgstr "Dữ Liệu XR cho Sự Kiện Quản Lý Cửa Sổ" +msgstr "Sự Kiện Dữ liệu XR cho Trình Quản lý Cửa sổ" msgid "XR action name" -msgstr "Tên của hành động XR" +msgstr "Tên hành động XR" msgid "Action Set" -msgstr "Tập Hành Động" +msgstr "Bộ Hành Động" msgid "XR action set name" -msgstr "Tên của tập hành động XR" +msgstr "Tên bộ hành động XR" msgid "Whether bimanual interaction is occurring" -msgstr "Có tương tác hai tay hay không" +msgstr "Liệu tương tác hai tay có xảy ra hay không" msgid "Controller Location" -msgstr "Vị Trí Đồ Điều Khiển" +msgstr "Vị Trí của Điều Khiển" msgid "Location of the action's corresponding controller aim in world space" -msgstr "Vị trí nhắm của đồ điều khiển tương tự cho hành động trong không gian thế giới" +msgstr "Vị trí của mục tiêu điều khiển tương ứng với hành động trong không gian thế giới" msgid "Controller Location Other" -msgstr "Vị Trí Đồ Điều Khiển Khác" +msgstr "Vị Trí Điều Khiển của Người Kia" msgid "Controller aim location of the other user path for bimanual actions" -msgstr "Vị trí nhắm của đồ điều khiển cho đường người dụng khác cho những hành động hai tay" +msgstr "Vị trí mục tiêu điều khiển của đường dẫn người dùng khác đối với các hành động hai tay" msgid "Controller Rotation" -msgstr "Xoay Đồ Điều Khiển" +msgstr "Xoay Chiều của Điều Khiển" msgid "Rotation of the action's corresponding controller aim in world space" -msgstr "Xoay của nhắm của đồ điều khiển tương tự cho hành động trong không gian thế giới" +msgstr "Xoay chiều của mục tiêu điều khiển tương ứng với hành động trong không gian thế giới" msgid "Controller Rotation Other" -msgstr "Xoay Đồ Điều Khiển Khác" +msgstr "Điều Khiển Xoay Chiều của Người Kia" msgid "Controller aim rotation of the other user path for bimanual actions" -msgstr "Xoay của nhắm của đồ điều khiển cho đường người dụng khác cho những hành động hai tay" +msgstr "Xoay chiều của mục tiêu điều khiển mà đường dẫn người dùng khác sử dụng đối với các hành động hai tay" msgid "Float Threshold" -msgstr "Ngưỡng Số Thật Dấu Phẩy Động" +msgstr "Giới Hạn Số Thực" msgid "Input threshold for float/2D vector actions" -msgstr "Ngưỡng ngõ vào cho hành động số thật dấu phẩy động/vectơ 2D" +msgstr "Ngưỡng đầu vào cho các hành động véctơ 2D/số thực" msgid "XR action values corresponding to type" -msgstr "Giá trị hành động XR tương tự cho loại" +msgstr "Các giá trị hành động XR tương ứng với thể loại" msgid "State Other" -msgstr "Trạng Thái Khác" +msgstr "Trạng Thái của Người Kia" msgid "State of the other user path for bimanual actions" -msgstr "Trạng thái của đường người dùng cho hành động hai tay" +msgstr "Trạng thái của đường dẫn người dùng kia đối với các hành động hai tay" msgid "XR action type" @@ -96211,7 +105875,7 @@ msgstr "Đường Dẫn Người Dùng" msgid "User path of the action. E.g. \"/user/hand/left\"" -msgstr "Đường dẫn người dùng của hành động. ví dụ: \"/ngườiDùng/tay/trái\"" +msgstr "Đường dẫn người dùng của hành động. Ví dụ. \"/user/hand/left\" (/người dùng/tay/trái)" msgid "User Path Other" @@ -96219,107 +105883,132 @@ msgstr "Đường Dẫn Người Dùng Khác" msgid "Other user path, for bimanual actions. E.g. \"/user/hand/right\"" -msgstr "Đường dẫn người dùng khác, cho hành động hai tay. Ví dụ \"/ngườiDùng/tay/phải\"" +msgstr "Đường dẫn người dùng khác, cho các hành động cần hai tay. Ví dụ. \"/user/hand/right\" (người dùng/tay/phải)" msgid "Rotation angle around the Z-Axis to apply the rotation deltas from the VR headset to" -msgstr "Góc xoay quanh trục Z để áp dụng chênh lệch xoay từ bộ ống nghe sứ thật ảo" +msgstr "Góc độ xoay chiều quanh trục-Z để áp dụng các xoay chiều delta từ bộ đầu VR sang" msgid "Coordinates to apply translation deltas from the VR headset to" -msgstr "Tọa độ nào để áp dụng chênh lệch từ bộ ống nghe sự thật ảo" +msgstr "Tọa độ để áp dụng các dịch chuyển delta từ bộ đầu VR sang" msgid "Base Pose Object" -msgstr "Vật Thể Dạng Đứng Cơ Sở" +msgstr "Đối Tượng Tư Thế Cơ Sở" msgid "Object to take the location and rotation to which translation and rotation deltas from the VR headset will be applied to" -msgstr "Lấy vị trí và xoay của vật thể nào để áp dụng chênh lệch từ bộ ống nghe sự thật ảo" +msgstr "Đối tượng mà vị trí và xoay chiều của nó sẽ được đặt chiểu theo dịch chuyển và xoay chiều delta của bộ đầu VR" msgid "Base Pose Type" -msgstr "Loại Dạng Đứng Cơ Sở" +msgstr "Kiểu Tư Thế Cơ Sở" msgid "Define where the location and rotation for the VR view come from, to which translation and rotation deltas from the VR headset will be applied to" -msgstr "Chỉ định chỗ nào để lấy vị trí và xoay cho màn sự thật ảo, để áp dụng chênh lệch dịch và xoay nào từ bộ ống nghe sự thật ảo" +msgstr "Xác định xem vị trí và xoay chiều của góc nhìn VR đến từ đâu. Vị trí và xoay chiều này sẽ được áp dụng cho dịch chuyển và xoay chiều delta của bộ đầu VR" msgid "Follow the active scene camera to define the VR view's base pose" -msgstr "Đi theo máy quay phim hoạt động của cảnh để xác định dạng đứng cơ sở của màn sự thật ảo" +msgstr "Chiểu theo máy quay phim của cảnh đang hoạt động để xác định tư thế cơ sở của góc nhìn VR" msgid "Follow the transformation of an object to define the VR view's base pose" -msgstr "Đi theo biến hóa của một vật thể để xác định dạng đứng cơ sở của màn sự thật ảo" +msgstr "Chiểu theo biến hóa của một đối tượng để xác định tư thế cơ sở của góc nhìn VR" msgid "Follow a custom transformation to define the VR view's base pose" -msgstr "Đi theo một biến hóa mới để xác định dạng đứng cơ sở của màn sự thật ảo" +msgstr "Chiểu theo một biến hóa tùy chỉnh xác định tư thế cơ sở của góc nhìn VR" msgid "Uniform scale to apply to VR view" -msgstr "Phóng to đều để áp dụng cho màn VR" +msgstr "Tỷ lệ đồng nhất áp dụng cho khung quan sát VR" msgid "VR viewport far clipping distance" -msgstr "Khoảng cách cắt xa cho màn chiếu sự thật ảo" +msgstr "Điểm cuối của tầm nhìn trong cổng nhìn VR" msgid "VR viewport near clipping distance" -msgstr "Khoảng cách cắt xa cho màn chiếu sự thật ảo" +msgstr "Điểm đầu của tầm nhìn trong cổng nhìn VR" + + +msgctxt "Color" +msgid "Controller Draw Style" +msgstr "Kiểu Cách Vẽ Điều Khiển" msgid "Style to use when drawing VR controllers" -msgstr "Phong cách dùng khi vẽ đồ điều khiển VR" +msgstr "Kiểu cách sử dụng khi vẽ các điều khiển VR" + + +msgctxt "Color" +msgid "Dark" +msgstr "Tối" msgid "Draw dark controller" -msgstr "Vẽ đồ điều khiển đậm" +msgstr "Vẽ điều khiển màu tối" + + +msgctxt "Color" +msgid "Light" +msgstr "Sáng" msgid "Draw light controller" -msgstr "Vẽ đồ điều khiển sáng" +msgstr "Vẽ điều khiển màu sáng" + + +msgctxt "Color" +msgid "Dark + Ray" +msgstr "Tối + Tia Xạ" msgid "Draw dark controller with aiming axis ray" -msgstr "Vẽ đồ điều khiển đậm có tia trục nhắm" +msgstr "Vẽ điều khiển màu tối với tia trục nhắm" + + +msgctxt "Color" +msgid "Light + Ray" +msgstr "Nhạt + Tia Xạ" msgid "Draw light controller with aiming axis ray" -msgstr "Vẽ đồ điều khiển sáng có trục tia nhắm" +msgstr "Vẽ điều khiển màu sáng với tia trục nhắm" msgid "Show Controllers" -msgstr "Hiện Đồ Điều Khiển" +msgstr "Hiển Thị các Điều Khiển" msgid "Show VR controllers (requires VR actions for controller poses)" -msgstr "Hiện đồ điều khiển VR (yêu cầu có hành động VR cho dạng đứng VR)" +msgstr "Hiển thị các điều khiển VR ( đòi hỏi các hành động VR đối với các tư thế điều khiển)" msgid "Show Custom Overlays" -msgstr "Hiện Các Lớp Che Tùy Chọn" +msgstr "Hiển Thị Lớp Vẽ Lồng Tùy Chỉnh" msgid "Show custom VR overlays" -msgstr "Hiện các lớp che VR tùy chọn" +msgstr "Hiển thị lớp vẽ lồng tùy chỉnh của VR" msgid "Show Object Extras" -msgstr "Hiện Thêm Vật Thể" +msgstr "Hiển Thị Đối Tượng Bổ Sung" msgid "Show object extras, including empties, lights, and cameras" -msgstr "Hiện vật thể thêm như vật thể rỗng, đèn, và máy quay phim" +msgstr "Hiển thị các đối tượng bổ sung, bao gồm các đối tượng trống rỗng, đèn và máy quay phim" msgid "Show Selection" -msgstr "Hiện sợ Lựa Chọn" +msgstr "Hiển Thị Vùng Lựa Chọn" msgid "Show selection outlines" -msgstr "Hiện đường nét lựa chọn" +msgstr "Hiển thị đường viền vùng lựa chọn" msgid "Absolute Tracking" @@ -96327,7 +106016,7 @@ msgstr "Theo Dõi Tuyệt Đối" msgid "Allow the VR tracking origin to be defined independently of the headset location" -msgstr "Cho góc tọa độ theo dõi VR được xác định độc lập từ vị trí bộ ống nghe" +msgstr "Cho phép tọa độ gốc theo dõi của VR được xác định độc lập với vị trí của bộ đầu" msgid "Positional Tracking" @@ -96335,59 +106024,59 @@ msgstr "Theo Dõi Vị Trí" msgid "Allow VR headsets to affect the location in virtual space, in addition to the rotation" -msgstr "Cho bộ ống nghe sự thật ảo được ảnh hưởng vị trí trong không gian ảo, và xoay" +msgstr "Cho phép bộ đầu VR tác động đến vị trí trong không gian thực tế ảo, bên cạnh sự xoay chiều" msgid "Session State" -msgstr "Trạng Thái Phiên Chạy" +msgstr "Trạng Thái của Phiên Hoạt Động" msgid "Active Action Map" -msgstr "Ánh Xạ Hành Động Hoạt Động" +msgstr "Bản Đồ Hành Động Hiện Sử Dụng" msgid "Navigation Location" -msgstr "Vị trí chuyển hướng" +msgstr "Vị Trí Điều Hướng" msgid "Location offset to apply to base pose when determining viewer location" -msgstr "Vị trí nới để áp dụng cho đạng đứng cơ sở khi tính vị trí người nhìn" +msgstr "Dịch chuyển đối với vị trí để áp dụng vào tư thế cơ sở khi xác định vị trí quan sát" msgid "Navigation Rotation" -msgstr "Xoay Chuyển Hướng" +msgstr "Xoay Chiều của Điều Hướng" msgid "Rotation offset to apply to base pose when determining viewer rotation" -msgstr "Xoay nới để áp dụng cho đạng đứng cơ sở khi tính xoay người nhìn" +msgstr "Dịch chuyển cho chiều xoay để áp dụng vàp tư thế cơ sở khi xác định chiều xoay quan sát" msgid "Navigation Scale" -msgstr "Phóng To Chuyển Hướng" +msgstr "Tỷ Lệ Điều Hướng" msgid "Additional scale multiplier to apply to base scale when determining viewer scale" -msgstr "Thêm số phọng to nhân cho đạng đứng cơ sở khi tính phóng to người nhìn" +msgstr "Số nhân tỷ lệ bổ sung để áp dụng vào tỷ lệ cơ sở, khi xác định tỷ lệ quan sát" msgid "Selected Action Map" -msgstr "Ánh Xạ Hành Động Được Chọn" +msgstr "Bản Đồ Hành Động đã Chọn" msgid "Viewer Pose Location" -msgstr "Vị Trí Dạng Đứng Của Người Nhìn" +msgstr "Vị Trí Tư Thế Quan Sát" msgid "Last known location of the viewer pose (center between the eyes) in world space" -msgstr "Vị trí cuối được biết về dạng đứng người nhìn (trung tâm giữa hai con mắt) trong không gian thế giới" +msgstr "Vị trí được biết đến trước đây của tư thế quan sát (điểm tâm nằm giữa hai mắt) trong không gian thế giới" msgid "Viewer Pose Rotation" -msgstr "Xoay Dạng Đứng Của Người Nhìn" +msgstr "Chiều Xoay của Tư Thế Quan Sát" msgid "Last known rotation of the viewer pose (center between the eyes) in world space" -msgstr "Xoay cuối được biết về dạng đứng người nhìn (trung tâm giữa hai con mắt) trong không gian thế giới" +msgstr "Xoay chiều sau cùng của tư thế quan sát (giữa hai mắt) trong không gian thế giới" msgid "XR User Path" @@ -96403,53 +106092,299 @@ msgstr "Đường Dẫn Người Dùng XR" msgid "Collection of OpenXR user paths" -msgstr "Sưu tập đường dẫn của người dùng OpenXR" +msgstr "Bộ sưu tập những đường dẫn người dùng của OpenXR" msgid "Work Space UI Tag" -msgstr "Nhãn Giao Diện Công Trường" +msgstr "Nhãn UI Không Gian Làm Việc" msgid "WorkSpace UI Tags" -msgstr "Nhãn Giao Diện Công Trường" +msgstr "Nhãn giao diện người dùng (UI) của không gian làm việc" + + +msgid "Activate Gizmo" +msgstr "Kích hoạt Gizmo" + + +msgid "Activation event for gizmos that support drag motion" +msgstr "Sự kiện kích hoạt cho các gizmo hỗ trợ chuyển động kéo rê" + + +msgid "Press causes immediate activation, preventing click being passed to the tool" +msgstr "Nhấn xuống sẽ kích hoạt ngay lập tức, ngăn chặn khả năng cái nhấp chuột sẽ được chuyển đến cho công cụ" + + +msgid "Drag allows click events to pass through to the tool, adding a small delay" +msgstr "Kéo rê cho phép các sự kiện nhấp chuột chuyển đến công cụ, tăng sự trì trệ lên một tí" + + +msgid "Right Mouse Select Action" +msgstr "Hành Động Lựa Chọn bằng Chuột Phải" + + +msgid "Default action for the right mouse button" +msgstr "Hành động mặc định cho nút chuột phải" + + +msgid "Select & Tweak" +msgstr "Lựa Chọn & Hiệu Chỉnh" + + +msgid "Right mouse always tweaks" +msgstr "Chuột phải luôn luôn hiệu chỉnh" + + +msgid "Selection Tool" +msgstr "Công Cụ Lựa Chọn" + + +msgid "Right mouse uses the selection tool" +msgstr "Chuột phải sử dụng công cụ lựa chọn" + + +msgid "Select Mouse" +msgstr "Lựa Chọn bằng Nút Chuột" + + +msgid "Mouse button used for selection" +msgstr "Nút chuột dùng để lựa chọn" + + +msgid "Use left mouse button for selection. The standard behavior that works well for mouse, trackpad and tablet devices" +msgstr "Sử dụng nút chuột trái để lựa chọn. Cư xử tiêu chuẩn này hoạt động tốt cho các thiết bị chuột, bàn di chuột và máy tính bảng" + + +msgid "Use right mouse button for selection, and left mouse button for actions. This works well primarily for keyboard and mouse devices" +msgstr "Sử dụng nút chuột phải để lựa chọn và nút chuột trái cho các hành động. Cách bố trí này hoạt động tốt chủ yếu cho các thiết bị bàn phím và chuột" + + +msgid "Spacebar Action" +msgstr "Hành Động của phím Dấu Cách" + + +msgid "Action when 'Space' is pressed" +msgstr "Hành động khi nhấn 'Dấu Cách'" + + +msgid "Toggle animation playback ('Shift-Space' for Tools)" +msgstr "Bật/tắt chơi lại hoạt họa ('Shift-thanh cách' cho Công Cụ)" + + +msgid "" +"Open the popup tool-bar\n" +"When 'Space' is held and used as a modifier:\n" +"• Pressing the tools binding key switches to it immediately.\n" +"• Dragging the cursor over a tool and releasing activates it (like a pie menu).\n" +"For Play use 'Shift-Space'" +msgstr "" +"Mở thanh công cụ bật lên\n" +"Khi ‘Thanh Cách’ được giữ xuống và được sử dụng làm công cụ sửa đổi thì:\n" +"• Nhấn phím kết buộc với công cụ sẽ ngay lập tức chuyển sang cái đó.\n" +"• Kéo rê con trỏ qua một công cụ và thả ra để kích hoạt nó (giống như trình đơn rẻ quạt).\n" +"Để Chơi xin hãy sử dụng 'Shift-Thanh Cách'" msgid "Search" msgstr "Tìm Kiếm" +msgid "Open the operator search popup" +msgstr "Mở cửa sổ bật lên tìm kiếm thao tác" + + +msgid "Tool Keys" +msgstr "Các Phím Công Cụ" + + +msgid "The method of keys to activate tools such as move, rotate & scale (G, R, S)" +msgstr "Phương pháp phím để kích hoạt các công cụ như di chuyển, xoay chiều & đổi tỷ lệ (G (túm nắm), R (xoay chiều), S (đổi tỷ lệ))" + + +msgid "Immediate" +msgstr "Ngay Lập Tức" + + +msgid "Activate actions immediately" +msgstr "Kích hoạt các hành động ngay lập tức" + + +msgid "Activate the tool for editors that support tools" +msgstr "Kích hoạt công cụ cho các trình biên soạn hỗ trợ các công cụ này" + + +msgid "Alt Click Tool Prompt" +msgstr "Alt Nhắc Lệnh Công Cụ" + + +msgid "Tapping Alt (without pressing any other keys) shows a prompt in the status-bar, prompting a second keystroke to activate the tool" +msgstr "Nhấn Alt xuống (không nhấn bất kỳ phím nào khác) thì sẽ hiển thị lời nhắc trên thanh trạng thái, nhắc nhở nhấn phím thứ hai để kích hoạt công cụ" + + +msgid "Alt Cursor Access" +msgstr "Alt Truy Cập Con Trỏ" + + +msgid "" +"Hold Alt-LMB to place the Cursor (instead of LMB), allows tools to activate on press instead of drag.\n" +"Incompatible with the input preference \"Emulate 3 Button Mouse\" when the \"Alt\" key is used" +msgstr "" +"Giữ Alt-NCT để đặt Con Trỏ (thay vì chỉ NCT không thôi), cho phép các công cụ kích hoạt khi nhấn xuống, thay vì kéo rê.\n" +"Bố trí này không tương thích với cấu hình đầu vào “Mô Phỏng Chuột 3 Nút\" khi phím \"Alt\" được sử dụng" + + +msgid "Transform Navigation with Alt" +msgstr "Điều Hướng Biến Hóa bằng phím Alt" + + +msgid "During transformations, use Alt to navigate in the 3D View. Note that if disabled, hotkeys for Proportional Editing, Automatic Constraints, and Auto IK Chain Length will require holding Alt" +msgstr "Trong quá trình biến hóa, hãy sử dụng Alt để điều hướng trong Góc Nhìn 3D. Hãy lưu ý rằng nếu bị tắt đi thì các phím nóng để Biên Soạn Cân Đối, Ràng Buộc Tự Động và Độ Dài Chuỗi IK Tự Động sẽ đòi hỏi phải giữ Alt xuống đấy nhé" + + +msgid "Alt Tool Access" +msgstr "Alt Truy Cập Công Cụ" + + +msgid "" +"Hold Alt to use the active tool when the gizmo would normally be required\n" +"Incompatible with the input preference \"Emulate 3 Button Mouse\" when the \"Alt\" key is used" +msgstr "" +"Giữ phím Alt để sử dụng công cụ đang hoạt động khi gizmo vốn thường đòi hỏi phải sử dụng\n" +"Bố trí này không tương thích với tùy chọn đầu vào “Mô Phỏng Chuột 3 Nút\" khi phím \"Alt\" được sử dụng" + + +msgid "Open Folders on Single Click" +msgstr "Mở Thư Mục bằng Đơn Nhấp Chuột" + + +msgid "Navigate into folders by clicking on them once instead of twice" +msgstr "Điều hướng vào các thư mục bằng cách nhấp vào chúng một lần thay vì hai lần" + + +msgid "Pie Menu on Drag" +msgstr "Trình Đơn Rẻ Quạt khi Kéo Rê" + + +msgid "" +"Activate some pie menus on drag,\n" +"allowing the tapping the same key to have a secondary action.\n" +"\n" +"• Tapping Tab in the 3D view toggles edit-mode, drag for mode menu.\n" +"• Tapping Z in the 3D view toggles wireframe, drag for draw modes.\n" +"• Tapping Tilde in the 3D view for first person navigation, drag for view axes" +msgstr "" +"Kích hoạt một số trình đơn rẻ quạt khi kéo rê,\n" +"cho phép nhấn một phím hai lần để có hành động thứ hai.\n" +"\n" +"• Nhấn vào Tab trong góc nhìn 3D để bật chế độ biên soạn, kéo rê cho chế độ trình đơn.\n" +"• Nhấn vào Z trong góc nhìn 3D để bật/tắt khung dây, kéo rê để chuyển sang chế độ vẽ.\n" +"• Nhấn vào Dấu Ngã trong góc nhìn 3D để điều hướng góc nhìn, kéo rê để xem các trục" + + +msgid "Region Toggle Pie" +msgstr "Trình Đơn Rẻ Quạt Chuyển Đổi Vùng" + + +msgid "N-key opens a pie menu to toggle regions" +msgstr "Phím N mở trình đơn rẻ quạt để bật/tắt vùng" + + +msgid "Select All Toggles" +msgstr "Bật/Tắt Chọn Toàn Bộ" + + +msgid "Causes select-all ('A' key) to de-select in the case a selection exists" +msgstr "Làm cho chức năng lựa chọn toàn bộ (phím 'A') hủy chọn trong trường hợp một lựa chọn đã tồn tại" + + +msgid "Extra Shading Pie Menu Items" +msgstr "Các Trình Mục Hình Rẻ Quạt Khác về Tô Bóng" + + +msgid "Show additional options in the shading menu ('Z')" +msgstr "Hiển thị các tùy chọn bổ sung trong trình đơn tô bóng ('Z')" + + +msgid "Tab for Pie Menu" +msgstr "Tab cho Trình Đơn Hình Rẻ Quạt" + + +msgid "Causes tab to open pie menu (swaps 'Tab' / 'Ctrl-Tab')" +msgstr "Làm cho phím tab mở trình đơn hình rẻ quạt (hoán đổi giữa 'Tab' / 'Ctrl-Tab')" + + +msgid "Alt-MMB Drag Action" +msgstr "Hành Động của Alt-NCG Kéo Rê" + + +msgid "Action when Alt-MMB dragging in the 3D viewport" +msgstr "Hành động khi kéo rê Alt-Nút Chuột Giữa (MMB) trong cổng nhìn 3D" + + +msgid "Set the view axis where each mouse direction maps to an axis relative to the current orientation" +msgstr "Đặt trục quan sát trong đó mỗi chiều hướng của chuột ánh xạ tới một trục tương đối với định hướng hiện tại" + + +msgid "Set the view axis where each mouse direction always maps to the same axis" +msgstr "Đặt trục quan sát trong đó mỗi chiều hướng của chuột luôn luôn ánh xạ tới cùng một trục" + + +msgid "MMB Action" +msgstr "Hành Động của Nút Chuột Giữa" + + +msgid "The action when Middle-Mouse dragging in the viewport. Shift-Middle-Mouse is used for the other action. This applies to trackpad as well" +msgstr "Hành động khi kéo rê Nút Chuột Giữa trong khung nhìn. Shift-Nút Chuột Giữa sẽ được sử dụng cho hành động kia. Bố trí này cũng áp dụng cho trackpad nữa" + + +msgid "Tilde Action" +msgstr "Hành Động cho Nút Dấu Ngã" + + +msgid "Action when 'Tilde' is pressed" +msgstr "Hành Động khi nhấn 'Dấu Ngã'" + + msgid "Navigate" -msgstr "Chuyển Hướng" +msgstr "Điều Hướng" + + +msgid "View operations (useful for keyboards without a numpad)" +msgstr "Các thao tác quan sát (hữu ích cho bàn phím không có bàn phím số)" + + +msgid "Control transform gizmos" +msgstr "Điều khiển các gizmo biến hóa" msgctxt "WindowManager" msgid "Window" -msgstr "Cửa Số" +msgstr "Cửa Sổ" msgctxt "WindowManager" msgid "Screen" -msgstr "Màn" +msgstr "Màn Hình" msgctxt "WindowManager" msgid "Screen Editing" -msgstr "Biên Tập Màn" +msgstr "Biên Soạn Màn Hình" msgctxt "WindowManager" msgid "Region Context Menu" -msgstr "Danh Bạ Bối Cảnh Vùng" +msgstr "Trình Đơn Ngữ Cảnh Vùng/Địa Phận" msgctxt "WindowManager" msgid "View2D" -msgstr "Màn 2D" +msgstr "Khung Nhìn 2D" msgctxt "WindowManager" msgid "View2D Buttons List" -msgstr "Danh Sách Nút Màn 2 Chiều" +msgstr "Danh Sách Nút Bấm Khung Nhìn 2D" msgctxt "WindowManager" @@ -96459,177 +106394,177 @@ msgstr "Giao Diện Người Dùng" msgctxt "WindowManager" msgid "3D View" -msgstr "Màn 3D" +msgstr "Góc Nhìn 3D" msgctxt "WindowManager" msgid "Object Mode" -msgstr "Chế Độ Vật Thể" +msgstr "Chế Độ Đối Tượng" msgctxt "WindowManager" msgid "3D View Tool: Tweak" -msgstr "Dụng Cụ Màn 3D: Chỉnh" +msgstr "Công Cụ Góc Nhìn 3D: Hiệu Chỉnh" msgctxt "WindowManager" msgid "3D View Tool: Tweak (fallback)" -msgstr "Dụng Cụ Màn 3D: Chỉnh (dự trữ)" +msgstr "Công Cụ Góc Nhìn 3D: Hiệu Chỉnh (dự bị)" msgctxt "WindowManager" msgid "3D View Tool: Select Box" -msgstr "Dụng Cụ Màn 3D: Chọn Hộp" +msgstr "Công Cụ Góc Nhìn 3D: Lựa Chọn bằng Khoanh Hình Hộp" msgctxt "WindowManager" msgid "3D View Tool: Select Box (fallback)" -msgstr "Dụng Cụ Màn 3D: Chọn Hộp (dự trữ)" +msgstr "Công Cụ Góc Nhìn 3D: Lựa Chọn bằng Khoanh Hình Hộp (dự bị)" msgctxt "WindowManager" msgid "3D View Tool: Select Circle" -msgstr "Dụng Cụ Màn 3D: Chọn Vòng Tròn" +msgstr "Công Cụ Góc Nhìn 3D: Lựa Chọn bằng Vòng Tròn" msgctxt "WindowManager" msgid "3D View Tool: Select Circle (fallback)" -msgstr "Dụng Cụ Màn 3D: Chọn Vòng Tròn (dự trữ)" +msgstr "Công Cụ Góc Nhìn 3D: Lựa Chọn bằng Vòng Tròn (dự bị)" msgctxt "WindowManager" msgid "3D View Tool: Select Lasso" -msgstr "Dụng Cụ Màn 3D: Chọn Dây Trói" +msgstr "Công Cụ Góc Nhìn 3D: Lựa Chọn bằng Dây Thòng Lọng" msgctxt "WindowManager" msgid "3D View Tool: Select Lasso (fallback)" -msgstr "Dụng Cụ Màn 3D: Chọn Dây Trói (dự trữ)" +msgstr "Công Cụ Góc Nhìn 3D: Lựa Chọn bằng Dây Thòng Lọng (dự bị)" msgctxt "WindowManager" msgid "3D View Tool: Cursor" -msgstr "Dụng Cụ Màn 3D: Con Trỏ" +msgstr "Công Cụ Góc Nhìn 3D: Con Trỏ" msgctxt "WindowManager" msgid "3D View Tool: Cursor (fallback)" -msgstr "Dụng Cụ Màn 3D: Con Trỏ (dự trữ)" +msgstr "Công Cụ Góc Nhìn 3D: Con Trỏ (dự bị)" msgctxt "WindowManager" msgid "3D View Tool: Move" -msgstr "Dụng Cụ Màn 3D: Di Chuyển" +msgstr "Công Cụ Góc Nhìn 3D: Di Chuyển" msgctxt "WindowManager" msgid "3D View Tool: Move (fallback)" -msgstr "Dụng Cụ Màn 3D: Di Chuyển (dự trữ)" +msgstr "Công Cụ Góc Nhìn 3D: Di Chuyển (dự bị)" msgctxt "WindowManager" msgid "3D View Tool: Rotate" -msgstr "Dụng Cụ Màn 3D: Xoay" +msgstr "Công Cụ Góc Nhìn 3D: Xoay Chiều" msgctxt "WindowManager" msgid "3D View Tool: Rotate (fallback)" -msgstr "Dụng Cụ Màn 3D: Xoay (dự trữ)" +msgstr "Công Cụ Góc Nhìn 3D: Xoay Chiều (dự bị)" msgctxt "WindowManager" msgid "3D View Tool: Scale" -msgstr "Dụng Cụ Màn 3D: Phóng To" +msgstr "Công Cụ Góc Nhìn 3D: Tỷ Lệ Hóa" msgctxt "WindowManager" msgid "3D View Tool: Scale (fallback)" -msgstr "Dụng Cụ Màn 3D: Phóng To (dự trữ)" +msgstr "Công Cụ Góc Nhìn 3D: Tỷ Lệ Hóa (dự bị)" msgctxt "WindowManager" msgid "3D View Tool: Transform" -msgstr "Dụng Cụ Màn 3D: Biến Hóa" +msgstr "Công Cụ Góc Nhìn 3D: Biến Hóa" msgctxt "WindowManager" msgid "3D View Tool: Transform (fallback)" -msgstr "Dụng Cụ Màn 3D: Biến Hóa (dự trữ)" +msgstr "Công Cụ Góc Nhìn 3D: Biến Hóa (dự bị)" msgctxt "WindowManager" msgid "Generic Tool: Annotate" -msgstr "Dụng Cụ Tổng Quát: Ghi Chú" +msgstr "Công Cụ Phổ Thông: Chú Thích" msgctxt "WindowManager" msgid "Generic Tool: Annotate (fallback)" -msgstr "Dụng Cụ Tổng Quát: Ghi Chú (dự trữ)" +msgstr "Công Cụ Phổ Thông: Chú Thích (dự bị)" msgctxt "WindowManager" msgid "Generic Tool: Annotate Line" -msgstr "Dụng Cụ Tổng Quát: Ghi Chú Đường" +msgstr "Công Cụ Phổ Thông: Chú Thích Đường Thẳng" msgctxt "WindowManager" msgid "Generic Tool: Annotate Line (fallback)" -msgstr "Dụng Cụ Tổng Quát: Ghi Chú Đường (dự trữ)" +msgstr "Công Cụ Phổ Thông: Chú Thích Đường Thẳng (dự bị)" msgctxt "WindowManager" msgid "Generic Tool: Annotate Polygon" -msgstr "Dụng Cụ Tổng Quát: Ghi Chú Đa Giác" +msgstr "Công Cụ Phổ Thông: Chú Thích Đa Giác" msgctxt "WindowManager" msgid "Generic Tool: Annotate Polygon (fallback)" -msgstr "Dụng Cụ Tổng Quát: Ghi Chú Đa Giác (dự trữ)" +msgstr "Công Cụ Phổ Thông: Chú Thích Đa Giác (dự bị)" msgctxt "WindowManager" msgid "Generic Tool: Annotate Eraser" -msgstr "Dụng Cụ Tổng Quát: Ghi Chú Cục Gôm" +msgstr "Công Cụ Phổ Thông: Tẩy Xóa Chú Thích" msgctxt "WindowManager" msgid "Generic Tool: Annotate Eraser (fallback)" -msgstr "Dụng Cụ Tổng Quát: Ghi Chú Cục Gôm (dự trữ)" +msgstr "Công Cụ Phổ Thông: Tẩy Xóa Chú Thích (dự bị)" msgctxt "WindowManager" msgid "3D View Tool: Measure" -msgstr "Dụng Cụ Màn Nhìn 3D: Đo" +msgstr "Công Cụ Góc Nhìn 3D: Đo Lường" msgctxt "WindowManager" msgid "3D View Tool: Measure (fallback)" -msgstr "Dụng Cụ Màn Nhìn 3D: Đo (dự trữ)" +msgstr "Công Cụ Góc Nhìn 3D: Đo Lường (dự bị)" msgctxt "WindowManager" msgid "3D View Tool: Object, Add Primitive" -msgstr "Dụng Cụ Màn Nhìn 3D: Vật Thể, Thêm Vật Thể Đơn Giản" +msgstr "Công Cụ Góc Nhìn 3D: Đối Tượng, Thêm Hình Học Cơ Bản" msgctxt "WindowManager" msgid "3D View Tool: Object, Add Primitive (fallback)" -msgstr "Dụng Cụ Màn Nhìn 3D: Vật Thể, Thêm Vật Thể Đơn Giản (dự trữ)" +msgstr "Công Cụ Góc Nhìn 3D: Đối Tượng, Thêm Hình Học Cơ Bản (dự bị)" msgctxt "WindowManager" msgid "Mesh" -msgstr "Mạng Lưới" +msgstr "Khung Lưới" msgctxt "WindowManager" msgid "3D View Tool: Shear" -msgstr "Dụng Cụ Màn 3D: Méo Hóa" +msgstr "Công Cụ Góc Nhìn 3D: Xô Nghiêng" msgctxt "WindowManager" msgid "3D View Tool: Shear (fallback)" -msgstr "Dụng Cụ Màn 3D: Méo Hóa (dự trữ)" +msgstr "Công Cụ Góc Nhìn 3D: Xô Nghiêng (dự bị)" msgctxt "WindowManager" @@ -96637,9 +106572,14 @@ msgid "Curve" msgstr "Đường Cong" +msgctxt "WindowManager" +msgid "Curves" +msgstr "Đường Cong" + + msgctxt "WindowManager" msgid "Armature" -msgstr "Cốt" +msgstr "Khung Cốt" msgctxt "WindowManager" @@ -96659,57 +106599,57 @@ msgstr "Phông" msgctxt "WindowManager" msgid "Grease Pencil" -msgstr "Bút Sáp" +msgstr "Bút Chì Dầu" msgctxt "WindowManager" msgid "Pose" -msgstr "Dạng Đứng" +msgstr "Tư Thế" msgctxt "WindowManager" msgid "Vertex Paint" -msgstr "Sơn Đỉnh" +msgstr "Sơn Điểm Đỉnh" msgctxt "WindowManager" msgid "Weight Paint" -msgstr "Sơn Quyền Lượng" +msgstr "Sơn Trọng Lượng" msgctxt "WindowManager" msgid "Paint Vertex Selection (Weight, Vertex)" -msgstr "Sơn Đỉnh Được Chọn (Quyền Lượng, Đỉnh)" +msgstr "Sơn Lựa Chọn Điểm Đỉnh (Trọng Lượng, Điểm Đỉnh)" msgctxt "WindowManager" msgid "Paint Face Mask (Weight, Vertex, Texture)" -msgstr "Sơm Mặt Nạ Mặt (Quyền Lượng, Đỉnh, Chất Liệu)" +msgstr "Sơn Màn Chắn Lọc Mặt (Trọng Lượng, Điểm Đỉnh, Chất Liệu)" msgctxt "WindowManager" msgid "Image Paint" -msgstr "Sơn Ảnh" +msgstr "Sơn Hình Ảnh" msgctxt "WindowManager" msgid "Sculpt" -msgstr "Khắc" +msgstr "Điêu Khắc" msgctxt "WindowManager" msgid "3D View Tool: Sculpt, Face Set Edit" -msgstr "Dụng Cụ Màn 3D: Biên Tập Khắc, Tập Hợp Mặt" +msgstr "Công Cụ Góc Nhìn 3D: Điêu Khắc, Biên Soạn Mặt Ấn Định" msgctxt "WindowManager" msgid "3D View Tool: Sculpt, Face Set Edit (fallback)" -msgstr "Dụng Cụ Màn 3D: Biên Tập Khắc, Tập Hợp Mặt (dự trữ)" +msgstr "Công Cụ Chế Độ Góc Nhìn 3D: Điêu Khắc, Biên Soạn Mặt Ấn Định (dự bị)" msgctxt "WindowManager" msgid "Sculpt Curves" -msgstr "Đường Cong Khắc:" +msgstr "Điêu Khắc Đường Cong" msgctxt "WindowManager" @@ -96719,7 +106659,7 @@ msgstr "Hạt" msgctxt "WindowManager" msgid "Knife Tool Modal Map" -msgstr "Ánh Xạ Cách Thức Dụng Cụ Dao" +msgstr "Ánh Xạ Mô Thái Công Cụ Dao" msgctxt "WindowManager" @@ -96729,42 +106669,42 @@ msgstr "Hủy" msgctxt "WindowManager" msgid "Confirm" -msgstr "Xác Nhận" +msgstr "Chấp Thuận" msgctxt "WindowManager" msgid "Undo" -msgstr "Hủy Bước" +msgstr "Hoàn Tác" msgctxt "WindowManager" msgid "Snap to Midpoints On" -msgstr "Bật Hút Dính đến Trung Điểm" +msgstr "Bật Bám Dính vào Trung Điểm" msgctxt "WindowManager" msgid "Snap to Midpoints Off" -msgstr "Tắt Hút Dính đến Trung Điểm" +msgstr "Tắt Bám Dính vào Trung Điểm" msgctxt "WindowManager" msgid "Ignore Snapping On" -msgstr "Lờ Hút Dính Bật" +msgstr "Bật Bỏ Qua Bám Dính" msgctxt "WindowManager" msgid "Ignore Snapping Off" -msgstr "Lờ Hút Dính Tắt" +msgstr "Tắt Bỏ Qua Bám Dính" msgctxt "WindowManager" msgid "Toggle Angle Snapping" -msgstr "Bật/Tắt Hút Dính Góc" +msgstr "Bật/Tắt Bám Dính vào Góc Độ" msgctxt "WindowManager" msgid "Cycle Angle Snapping Relative Edge" -msgstr "Chu Trình Cho Góc Hút Dính Đến Cạnh Tương Đối" +msgstr "Luân Chuyển Bám Dính Góc Độ Cạnh Tương Đối" msgctxt "WindowManager" @@ -96774,32 +106714,32 @@ msgstr "Bật/Tắt Cắt Xuyên Qua" msgctxt "WindowManager" msgid "Toggle Distance and Angle Measurements" -msgstr "Bặt/Tắt Đo Khoảng Cách và Góc" +msgstr "Bật/tắt các Đo Lường về Khoảng Cách và Góc Độ" msgctxt "WindowManager" msgid "Toggle Depth Testing" -msgstr "Bặt/Tắt Xét Nghiệm Độ Sâu" +msgstr "Bật/Tắt Kiểm Thử Chiều Sâu" msgctxt "WindowManager" msgid "End Current Cut" -msgstr "Kết Thúc Cắt Hiện Tại" +msgstr "Kiến Thức Đường Cắt Hiện Tại" msgctxt "WindowManager" msgid "Add Cut" -msgstr "Thêm Cắt" +msgstr "Thêm Đường Cắt" msgctxt "WindowManager" msgid "Add Cut Closed" -msgstr "Thêm Cắt Đóng" +msgstr "Thêm Đường Cắt Đóng Kín" msgctxt "WindowManager" msgid "Panning" -msgstr "Dời Đi" +msgstr "Lia" msgctxt "WindowManager" @@ -96819,16 +106759,16 @@ msgstr "Khóa Trục Z" msgctxt "WindowManager" msgid "Custom Normals Modal Map" -msgstr "Bản Đồ Cách Thức Cho Pháp Tuyến Tùy Chọn" +msgstr "Ánh Xạ Mô Thái Pháp Tuyến Tùy Chỉnh" msgctxt "WindowManager" msgid "Reset" -msgstr "Đặt Lại" +msgstr "Hoàn Lại" msgid "Reset normals to initial ones" -msgstr "Đặt lại pháp tuyến trở lại ban đầu" +msgstr "Hoàn lại các pháp tuyến về các giá trị ban đầu" msgctxt "WindowManager" @@ -96837,7 +106777,7 @@ msgstr "Đảo Nghịch" msgid "Toggle inversion of affected normals" -msgstr "Bặt/tắt sự đảo nghịch của các pháp tuyến bị ảnh hưởng" +msgstr "Bật/Tắt Đảo Nghịch các Pháp Tuyến Ảnh Hưởng" msgctxt "WindowManager" @@ -96846,192 +106786,192 @@ msgstr "Hình Cầu Hóa" msgid "Interpolate between new and original normals" -msgstr "Nội suy giữa pháp tuyến mới và ban đầu" +msgstr "Nội suy giữa các pháp tuyến gốc và những cái mới" msgctxt "WindowManager" msgid "Align" -msgstr "Sắp Hàng" +msgstr "Căn Chỉnh" msgctxt "WindowManager" msgid "Use Mouse" -msgstr "Dùng Chuột" +msgstr "Sử Dụng Chuột" msgid "Follow mouse cursor position" -msgstr "Theo dõi vị trí con tro chuột" +msgstr "Đi theo vị trí con trỏ chuột" msgctxt "WindowManager" msgid "Use Pivot" -msgstr "Dùng Điểm Tựa" +msgstr "Sử Dụng Điểm Tựa" msgid "Use current rotation/scaling pivot point coordinates" -msgstr "Dùng tọa độ của điểm tựa hiện tại cho xoay/phóng to" +msgstr "Sử dụng tọa độ của điểm tựa đổi tỷ lệ / xoay chiều hiện tại" msgctxt "WindowManager" msgid "Use Object" -msgstr "Dùng Vật Thể" +msgstr "Sử Dụng Đối Tượng" msgid "Use current edited object's location" -msgstr "Dùng vị trí của vật thể hiện tại được biên tệp" +msgstr "Sử dụng vị trí của đối tượng được biên soạn hiện tại" msgctxt "WindowManager" msgid "Set and Use 3D Cursor" -msgstr "Cài Đặt và Dùng Con Trỏ 3D" +msgstr "Đặt và Sử Dụng Con Trỏ 3D" msgid "Set new 3D cursor position and use it" -msgstr "Cài đặt vị trí của con trỏ 3D mới và dùng nó" +msgstr "Đặt vị trí con trỏ 3D mới và sử dụng nó" msgctxt "WindowManager" msgid "Select and Use Mesh Item" -msgstr "Chọn và Dùng Mặt Hàng Mạng Lưới" +msgstr "Chọn và Sử Dụng Phần Tử Khung Lưới" msgid "Select new active mesh element and use its location" -msgstr "Chọn phần tử mạng lưới hoạt động mới và sử dụng vị trí của nó" +msgstr "Lựa chọn phần tử khung lưới đang hoạt động và sử dụng vị trí của nó" msgctxt "WindowManager" msgid "Bevel Modal Map" -msgstr "Bản Đồ Cách Thức Cạnh Tròn" +msgstr "Ánh Xạ Mô Thái Bo Tròn" msgid "Cancel bevel" -msgstr "Hủy Cạnh Tròn" +msgstr "Hủy bo tròn" msgid "Confirm bevel" -msgstr "Xác nhận cạnh tròn" +msgstr "Chấp thuận bo tròn" msgctxt "WindowManager" msgid "Change Offset" -msgstr "Đổi Sự Nới" +msgstr "Đổi Dịch Chuyển" msgid "Value changes offset" -msgstr "Giá trị cho đổi sự nới " +msgstr "Giá Trị đổi dịch chuyển" msgctxt "WindowManager" msgid "Change Profile" -msgstr "Đổi Mặt Cắt" +msgstr "Thay Đổi Mặt Cắt" msgid "Value changes profile" -msgstr "Giá trí cho đổi mặt cắt" +msgstr "Giá trị đổi mặt cắt" msgctxt "WindowManager" msgid "Change Segments" -msgstr "Đổi Khúc" +msgstr "Đổi số Phân Đoạn" msgid "Value changes segments" -msgstr "Giá trị cho đổi khúc" +msgstr "Giá trị đổi số phân đoạn" msgctxt "WindowManager" msgid "Increase Segments" -msgstr "Tăng Khúc" +msgstr "Tăng Số Phân Đoạn" msgid "Increase segments" -msgstr "Tăng khúc" +msgstr "Tăng số phân đoạn" msgctxt "WindowManager" msgid "Decrease Segments" -msgstr "Giảm Khúc" +msgstr "Giảm Số Phân Đoạn" msgid "Decrease segments" -msgstr "Giảm khúc" +msgstr "Giảm số phân đoạn" msgctxt "WindowManager" msgid "Change Offset Mode" -msgstr "Đổi Chế Độ Nới" +msgstr "Chế Độ Đổi Dịch Chuyển" msgid "Cycle through offset modes" -msgstr "Chu trình qua các chế độ nới" +msgstr "Luân chuyển qua các chế độ dịch chuyển" msgctxt "WindowManager" msgid "Toggle Clamp Overlap" -msgstr "Bặt/Tắt Kẹp Lại Lấn Trên" +msgstr "Bật/Tắt Chống Đè Gối Lên Nhau" msgid "Toggle clamp overlap flag" -msgstr "Bặt/tắt cờ kẹp lại lấn trên" +msgstr "Bật/tắt chống đè gối lên nhau" msgctxt "WindowManager" msgid "Change Affect Type" -msgstr "Đổi Loại Sự Ảnh Hưởng" +msgstr "Đổi Kiểu Hiệu Ứng" msgid "Change which geometry type the operation affects, edges or vertices" -msgstr "Đổi loại hình dạng được ảnh hưởng bởi thao tác, cạnh hoặc đỉnh" +msgstr "Đổi thể loại hình học mà thao tác ảnh hưởng, các cạnh hoặc các điểm đỉnh" msgctxt "WindowManager" msgid "Toggle Harden Normals" -msgstr "Bật/Tắt Cứng Hóa Pháp Tuyến" +msgstr "Bật/Tắt Cương Pháp Tuyến" msgid "Toggle harden normals flag" -msgstr "Bật/tắt cờ cứng hóa pháp tuyến" +msgstr "Bật/tắt cờ hiệu cương pháp tuyến" msgctxt "WindowManager" msgid "Toggle Mark Seam" -msgstr "Bật/Tắt Ký Dấu Vết Sẹo" +msgstr "Bật/Tắt Đánh Dấu Đường Khâu" msgid "Toggle mark seam flag" -msgstr "Bật/tắt cờ ký dấu vết sẹo" +msgstr "Bật/tắt cờ hiệu đánh dấu đường khâu" msgctxt "WindowManager" msgid "Toggle Mark Sharp" -msgstr "Bật/Tắt Ký Dấu Bén" +msgstr "Bật/Tắt Đánh Dấu/Xóa Dấu Sắc Nhọn" msgid "Toggle mark sharp flag" -msgstr "Bật/tắt cờ ký dấu bén" +msgstr "Bật/tắt cờ hiệu đánh dấu/xóa dấu sắc nhọn" msgctxt "WindowManager" msgid "Change Outer Miter" -msgstr "Đổi Mũ Tế Ngoại" +msgstr "Đổi Góc Cắt Bên Ngoài" msgid "Cycle through outer miter kinds" -msgstr "Chu trình qua những loại mũ tế ngoại" +msgstr "Luân chuyển qua các kiểu góc cắt bên ngoài" msgctxt "WindowManager" msgid "Change Inner Miter" -msgstr "Đổi Mũ Tế Nội" +msgstr "Đổi Góc Cắt Bên Trong" msgid "Cycle through inner miter kinds" -msgstr "Chu trình qua những loại mũ tế nội" +msgstr "Luân chuyển qua các kiểu góc cắt bên trong" msgctxt "WindowManager" msgid "Cycle through profile types" -msgstr "Chu trình qua những loại mặt cắt" +msgstr "Luân chuyển qua các kiểu mặt cắt" msgctxt "WindowManager" @@ -97040,66 +106980,66 @@ msgstr "Đổi Phương Pháp Giao Cắt" msgid "Cycle through intersection methods" -msgstr "Chu trình qua những phương pháp giao cắt" +msgstr "Luân chuyển qua các phương pháp giao cắt" msgctxt "WindowManager" msgid "Paint Stroke Modal" -msgstr "Cách Thức Nét Sơn" +msgstr "Mô Thái Nét Sơn" msgid "Cancel and undo a stroke in progress" -msgstr "Hủy và hủy bước một nét đang thực hành" +msgstr "Hủy và hoàn tác một nét vẽ đang trong quá trình hoạt động" msgctxt "WindowManager" msgid "Sculpt Expand Modal" -msgstr "Cách Thức Mở Rộng Khắc" +msgstr "Điêu Khắc: Mô Thái Mở Rộng" msgctxt "WindowManager" msgid "Toggle Preserve State" -msgstr "Bật/Tắt Trạng Thái Bảo Quản" +msgstr "Bật/Tắt Bảo Tồn Trạng Thái" msgctxt "WindowManager" msgid "Toggle Gradient" -msgstr "Bật/Tắt Chuyển Sắc" +msgstr "Bật/Tắt Dốc Màu" msgctxt "WindowManager" msgid "Geodesic recursion step" -msgstr "Bước đệ quy đường trắc địa" +msgstr "Tiến bước đệ quy trắc địa" msgctxt "WindowManager" msgid "Topology recursion Step" -msgstr "Bước đệ quy tôpô" +msgstr "Bước đệ quy cấu trúc liên kế" msgctxt "WindowManager" msgid "Move Origin" -msgstr "Di Chuyển Gốc Tọa Độ" +msgstr "Di Chuyển Tọa Độ Gốc" msgctxt "WindowManager" msgid "Geodesic Falloff" -msgstr "Sự Giảm Đường Trắc Địa" +msgstr "Suy Giảm Dần Trắc Địa" msgctxt "WindowManager" msgid "Topology Falloff" -msgstr "Sự Giảm Tôpô" +msgstr "Suy Giảm Dần theo Cấu Trúc Liên Kết (Topology Falloff)" msgctxt "WindowManager" msgid "Diagonals Falloff" -msgstr "Sự Giảm Đường Chéo" +msgstr "Suy Giảm Dần Chéo Góc" msgctxt "WindowManager" msgid "Spherical Falloff" -msgstr "Sự Giảm Hình Cầu" +msgstr "Nhòe Mờ Dần Hình Cầu" msgctxt "WindowManager" @@ -97109,27 +107049,27 @@ msgstr "Hút dính mở rộng đến Tập Hợp Mặt" msgctxt "WindowManager" msgid "Loop Count Increase" -msgstr "Tăng Số Lần Lặp Lại" +msgstr "Tăng Số Vòng Tuần Hoàn" msgctxt "WindowManager" msgid "Loop Count Decrease" -msgstr "Giảm Số Lần Lặp Lại" +msgstr "Giảm Số Vòng Tuần Hoàn" msgctxt "WindowManager" msgid "Toggle Brush Gradient" -msgstr "Bật/Tắt Chuyển Sắc Bút" +msgstr "Bật/Tắt Dốc Màu của Đầu Bút" msgctxt "WindowManager" msgid "Texture Distortion Increase" -msgstr "Tăng Sự Méo Hóa Chất Liệu" +msgstr "Tăng Biến Dạng Chất Liệu" msgctxt "WindowManager" msgid "Texture Distortion Decrease" -msgstr "Giảm Sự Méo Hóa Chất Liệu" +msgstr "Giảm Biến Dạng Chất Liệu" msgctxt "WindowManager" @@ -97139,107 +107079,107 @@ msgstr "Đường Cong Sơn" msgctxt "WindowManager" msgid "Curve Pen Modal Map" -msgstr "Ánh Xạ Cách Thức Cho Bút Đường Cong" +msgstr "Ánh Xạ Mô Thái Bút Vẽ Đường Cong" msgctxt "WindowManager" msgid "Free-Align Toggle" -msgstr "Bắt/Tắt Sắp Hàng Tự Do" +msgstr "Bật/Tắt giữa Tự Do và Thẳng Hàng" msgid "Move handle of newly added point freely" -msgstr "Di chuyển tự do tay cầm của một điểm mới thêm" +msgstr "Di chuyển tay cầm của điểm mới thêm vào một cách tự do" msgctxt "WindowManager" msgid "Move Adjacent Handle" -msgstr "Di Chuyển Tay Cầm Kề" +msgstr "Di Chuyển Tay Cầm Kề Cận" msgid "Move the closer handle of the adjacent vertex" -msgstr "Di chuyển tay cầm gần nhất của đỉnh kề" +msgstr "Di chuyển tay cầm gần hơn của điểm đỉnh kề cận" msgctxt "WindowManager" msgid "Move Entire Point" -msgstr "Di Chuyển Toàn Điểm" +msgstr "Di Chuyển Toàn Bộ Điểm" msgid "Move the entire point using its handles" -msgstr "Di chuyển toàn điểm bằng dùng tay cầm" +msgstr "Di chuyển toàn bộ điểm dùng các tay cầm của nó" msgctxt "WindowManager" msgid "Link Handles" -msgstr "Liên Kết Tay Cầm" +msgstr "Kết Nối các Tay Cầm" msgid "Mirror the movement of one handle onto the other" -msgstr "Gương chuyển động của một tay với tay cầm kia" +msgstr "Phản chiếu đối xứng chuyển động của tay cầm này lên tay cầm kia" msgctxt "WindowManager" msgid "Lock Angle" -msgstr "Khóa Góc" +msgstr "Khóa Góc Độ" msgid "Move the handle along its current angle" -msgstr "Di chuyển tay cầm theo góc hiện tại của nó" +msgstr "Di chuyển tay cầm dọc theo góc độ hiện tại của nó+" msgctxt "WindowManager" msgid "Object Non-modal" -msgstr "Vật Thể Không-Cách Thức" +msgstr "Vô-Mô Thái của Đối Tượng" msgctxt "WindowManager" msgid "View3D Placement Modal" -msgstr "Cách Thức Đặt Vị Vrí Màn 3D" +msgstr "Mô Thái Định Vị Khung Nhìn 3D" msgctxt "WindowManager" msgid "Snap On" -msgstr "Bật Hút Dính" +msgstr "Bật Bám Dính" msgctxt "WindowManager" msgid "Snap Off" -msgstr "Tắt Hút Dính" +msgstr "Tắt Bám Dính" msgctxt "WindowManager" msgid "Fixed Aspect On" -msgstr "Bật Giữ Tỉ Số Điểm Ảnh" +msgstr "Bật Cố Định Tỷ Lệ Tương Quan" msgctxt "WindowManager" msgid "Fixed Aspect Off" -msgstr "Tắt Giữ Tỉ Số Điểm Ảnh" +msgstr "Tắt Cố Định Tỷ Lệ Tương Quan" msgctxt "WindowManager" msgid "Center Pivot On" -msgstr "Bật Điểm Tựa Trung Tâm" +msgstr "Bật Trung Tâm Hóa Điểm Tựa" msgctxt "WindowManager" msgid "Center Pivot Off" -msgstr "Tắt Điểm Tựa Trung Tâm" +msgstr "Tắt Trung Tâm Hóa Điểm Tựa" msgctxt "WindowManager" msgid "View3D Walk Modal" -msgstr "Cách Thức Đi Bộ Màn 3D" +msgstr "Mô Thái Đi Bộ Khung Nhìn 3D" msgctxt "WindowManager" msgid "Forward" -msgstr "Tới" +msgstr "Về Phía Trước" msgctxt "WindowManager" msgid "Backward" -msgstr "Lùi" +msgstr "Về Phía Sau" msgctxt "WindowManager" @@ -97264,36 +107204,36 @@ msgstr "Xuống" msgctxt "WindowManager" msgid "Stop Move Forward" -msgstr "Dừng Di Chuyển Tới" +msgstr "Ngừng Di Chuyển Về Phía Trước" + + +msgctxt "WindowManager" +msgid "Stop Move Backward" +msgstr "Ngừng Di Chuyển Về Phía Sau" msgctxt "WindowManager" msgid "Stop Move Left" -msgstr "Dừng Di Chuyển Trái" - - -msgctxt "WindowManager" -msgid "Stop Mode Right" -msgstr "Dừng Di Chuyển Phải" +msgstr "Ngừng Di Chuyển Trái" msgctxt "WindowManager" msgid "Teleport" -msgstr "Biến Hiện" +msgstr "Viễn Tải" msgid "Move forward a few units at once" -msgstr "Đi tới và đơn vị một lượt" +msgstr "Di chuyển về phía trước một vài đơn vị cùng một lúc" msgctxt "WindowManager" msgid "Accelerate" -msgstr "Tăng Tốc Độ" +msgstr "Tăng Tốc" msgctxt "WindowManager" msgid "Decelerate" -msgstr "Giảm Tốc Độ" +msgstr "Giảm Tốc" msgctxt "WindowManager" @@ -97302,7 +107242,7 @@ msgstr "Nhanh" msgid "Move faster (walk or fly)" -msgstr "Đi nhanh hơn (đi bộ hoặc bay)" +msgstr "Di chuyển nhanh hơn (đi bộ hoặc bay lượn)" msgctxt "WindowManager" @@ -97311,7 +107251,7 @@ msgstr "Nhanh (Tắt)" msgid "Resume regular speed" -msgstr "Đi tốc độ bình thường tiếp" +msgstr "Hoàn trở lại tốc độ bình thường" msgctxt "WindowManager" @@ -97320,7 +107260,7 @@ msgstr "Chậm" msgid "Move slower (walk or fly)" -msgstr "Đi chậm hơn (đi bộ hoặc bay)" +msgstr "Di chuyển chậm hơn (đi bộ hoặc bay lượn)" msgctxt "WindowManager" @@ -97334,7 +107274,7 @@ msgstr "Nhảy" msgid "Jump when in walk mode" -msgstr "Nhảy khi trong chế độ đi bộ" +msgstr "Nhảy khi ở chế độ đi bộ" msgctxt "WindowManager" @@ -97343,93 +107283,111 @@ msgstr "Nhảy (Tắt)" msgid "Stop pushing jump" -msgstr "Dừng bấm nhảy" +msgstr "Ngừng thúc đẩy nhảy" msgctxt "WindowManager" msgid "Toggle Gravity" -msgstr "Bật/Tắt Hấp Dẫn" +msgstr "Bật/Tắt Trọng Lực" msgid "Toggle gravity effect" -msgstr "Bật/tắt hiệu ứng hấp dẫn" +msgstr "Bật/tắt hiệu ứng trọng lực" msgctxt "WindowManager" msgid "Z Axis Correction" -msgstr "Sự Chỉnh Sửa Trục Z" +msgstr "Hiệu Chỉnh Trục Z" msgid "Z axis correction" -msgstr "Sự chỉnh sửa cho trục Z" +msgstr "Hiệu chỉnh trục Z" + + +msgctxt "WindowManager" +msgid "Increase Jump Height" +msgstr "Tăng Độ Cao Nhảy" + + +msgid "Increase jump height" +msgstr "Tăng độ cao nhảy" + + +msgctxt "WindowManager" +msgid "Decrease Jump Height" +msgstr "Giảm Độ Cao Nhảy" + + +msgid "Decrease jump height" +msgstr "Giảm độ cao nhảy" msgctxt "WindowManager" msgid "View3D Fly Modal" -msgstr "Cách Thức Bay Màn 3D" +msgstr "Mô Thái Bay Lượn Khung Nhìn 3D" msgctxt "WindowManager" msgid "Pan" -msgstr "Dời" +msgstr "Lia" msgctxt "WindowManager" msgid "Pan (Off)" -msgstr "Dời (Tắt)" +msgstr "Lia (Tắt)" msgctxt "WindowManager" msgid "X Axis Correction" -msgstr "Sự Chỉnh Sửa Trục X" +msgstr "Hiệu Chỉnh Trục X" msgid "X axis correction (toggle)" -msgstr "Sự chỉnh sửa cho trục X (tắt/bắt)" +msgstr "Bật/tắt hiệu chỉnh trục x" msgid "Z axis correction (toggle)" -msgstr "Sự chỉnh sửa cho trục Z (tắt/bắt)" +msgstr "Bật/tắt hiệu chỉnh trục Z" msgctxt "WindowManager" msgid "Precision" -msgstr "Độ Chính Xác" +msgstr "Chuẩn Xác" msgctxt "WindowManager" msgid "Precision (Off)" -msgstr "Độ Chính Xác (Tắt)" +msgstr "Chuẩn Xác (Tắt)" msgctxt "WindowManager" msgid "Rotation" -msgstr "Xoay" +msgstr "Xoay Chiều" msgctxt "WindowManager" msgid "Rotation (Off)" -msgstr "Xoay (Tắt)" +msgstr "Xoay Chiều (Tắt)" msgctxt "WindowManager" msgid "View3D Rotate Modal" -msgstr "Cách Thức Xoay Màn 3D" +msgstr "Mô Thái Xoay Khung Nhìn 3D" msgctxt "WindowManager" msgid "Axis Snap" -msgstr "Hút Dính Đến Trục" +msgstr "Bám Dính Trục" msgctxt "WindowManager" msgid "Axis Snap (Off)" -msgstr "Hút Dính Đến Trục (Tắt)" +msgstr "Bám Dính Trục (Tắt)" msgctxt "WindowManager" msgid "Switch to Zoom" -msgstr "Đổi sang Phóng To" +msgstr "Đổi sang Thu Phóng" msgctxt "WindowManager" @@ -97439,67 +107397,67 @@ msgstr "Đổi sang Di Chuyển" msgctxt "WindowManager" msgid "View3D Move Modal" -msgstr "Cách Thức Di Chuyển Màn 3D" +msgstr "Mô Thái Di Chuyển Khung Nhìn 3D" msgctxt "WindowManager" msgid "Switch to Rotate" -msgstr "Đổi sang Xoay" +msgstr "Đổi sang Xoay Chiều" msgctxt "WindowManager" msgid "View3D Zoom Modal" -msgstr "Cách Thức Phong Màn 3D" +msgstr "Mô Thái Thu-Phóng Khung Nhìn 3D" msgctxt "WindowManager" msgid "View3D Dolly Modal" -msgstr "Cách Thức Dời Màn 3D" +msgstr "Mô Thái Lướt Khung Nhìn 3D" msgctxt "WindowManager" msgid "3D View Generic" -msgstr "Màn 3D Tổng Quát" +msgstr "Thông Dụng về Khung Nhìn 3D" msgctxt "WindowManager" msgid "Graph Editor" -msgstr "Trình Biên Soạn Biểu Đồ" +msgstr "Trình Biên Soạn Đồ Thị" msgctxt "WindowManager" msgid "Graph Editor Generic" -msgstr "Trình Biên Soạn Biểu Đồ Tổng Quát" +msgstr "Thông Dụng về Biên Soạn Đồ Thị" msgctxt "WindowManager" msgid "Dopesheet" -msgstr "Bảng Hoạt Hình" +msgstr "Bảng Hành Động" msgctxt "WindowManager" msgid "Dopesheet Generic" -msgstr "Bảng Hoạt Hình Tổng Quát" +msgstr "Thông Dụng về Bảng Hành Động" msgctxt "WindowManager" msgid "NLA Editor" -msgstr "Trình Biên Soạn NLA" +msgstr "Soạn NLA" msgctxt "WindowManager" msgid "NLA Generic" -msgstr "NLA Tổng Quát" +msgstr "Thông Dụng về NLA" msgctxt "WindowManager" msgid "Timeline" -msgstr "Thời Biểu" +msgstr "Lịch Trình Thời Gian" msgctxt "WindowManager" msgid "Image" -msgstr "Ảnh" +msgstr "Hình Ảnh" msgctxt "WindowManager" @@ -97509,57 +107467,57 @@ msgstr "Trình Biên Soạn UV" msgctxt "WindowManager" msgid "Image Editor Tool: Uv, Move" -msgstr "Dụng Cụ Biên Tập Ảnh: UV, Di Chuyển" +msgstr "Công Cụ Biên Soạn Hình Ảnh: UV, Di Chuyển" msgctxt "WindowManager" msgid "Image Editor Tool: Uv, Move (fallback)" -msgstr "Dụng Cụ Biên Tập Ảnh: UV, Di Chuyển (dự trữ)" +msgstr "Công Cụ Biên Soạn Hình Ảnh: UV, Di Chuyển" msgctxt "WindowManager" msgid "Image Editor Tool: Uv, Rotate" -msgstr "Dụng Cụ Biên Tập Ảnh: UV, Xoay" +msgstr "Công Cụ Biên Soạn Hình Ảnh: UV, Xoay Chiều" msgctxt "WindowManager" msgid "Image Editor Tool: Uv, Rotate (fallback)" -msgstr "Dụng Cụ Biên Tập Ảnh: UV, Xoay (dự trữ)" +msgstr "Công Cụ Biên Soạn Hình Ảnh: UV, Xoay Chiều (dự bị)" msgctxt "WindowManager" msgid "Image Editor Tool: Uv, Scale" -msgstr "Dụng Cụ Biên Tập Ảnh: UV, Phóng To" +msgstr "Công Cụ Biên Soạn Hình Ảnh: UV, Đổi Tỷ Lệ" msgctxt "WindowManager" msgid "Image Editor Tool: Uv, Scale (fallback)" -msgstr "Dụng Cụ Biên Tập Ảnh: UV, Phóng To (dự trữ)" +msgstr "Công Cụ Biên Soạn Hình Ảnh: UV, Đổi Tỷ Lệ (dự bị)" msgctxt "WindowManager" msgid "UV Sculpt" -msgstr "Khắc UV" +msgstr "Điêu Khắc UV" msgctxt "WindowManager" msgid "Image View" -msgstr "Màn Ảnh" +msgstr "Quan Sát Hình Ảnh" msgctxt "WindowManager" msgid "Image Editor Tool: Sample" -msgstr "Dụng Cụ Biên Tập Ảnh: Mẫu Vật" +msgstr "Công Cụ Biên Soạn Hình Ảnh: Mẫu" msgctxt "WindowManager" msgid "Image Editor Tool: Sample (fallback)" -msgstr "Dụng Cụ Biên Tập Ảnh: Mẫu Vật (dự trữ)" +msgstr "Công Cụ Biên Soạn Hình Ảnh: Mẫu (dự bị)" msgctxt "WindowManager" msgid "Image Generic" -msgstr "Ảnh Tổng Quát" +msgstr "Hình Ảnh Phổ Thông" msgctxt "WindowManager" @@ -97569,107 +107527,107 @@ msgstr "Mục Lục" msgctxt "WindowManager" msgid "Node Editor" -msgstr "Trình Biên Soạn Giao Điểm" +msgstr "Trình Biên Soạn Nút" msgctxt "WindowManager" msgid "Node Generic" -msgstr "Giao Điểm Tổng Quát" +msgstr "Thông Dụng về Nút" msgctxt "WindowManager" msgid "SequencerCommon" -msgstr "Bộ Trình Tự Chung" +msgstr "Trình Phối Hình Phổ Thông" msgctxt "WindowManager" msgid "Sequencer" -msgstr "Bộ Trình Tự" +msgstr "Trình Phối Hình" msgctxt "WindowManager" msgid "Sequencer Tool: Tweak" -msgstr "Dụng Cụ Bộ Trình Tự: Chỉnh" +msgstr "Công Cụ Phối Hình: Hiệu Chỉnh" msgctxt "WindowManager" msgid "Sequencer Tool: Tweak (fallback)" -msgstr "Dụng Cụ Bộ Trình Tự: Chỉnh (dự trữ)" +msgstr "Công Cụ Phối Hình: Hiệu Chỉnh (dự bị)" msgctxt "WindowManager" msgid "Sequencer Tool: Select Box" -msgstr "Dụng Cụ Bộ Trình Tự: Hộp Lựa Chọn" +msgstr "Công Cụ Phối Hình: Lựa Chọn Hình Hộp" msgctxt "WindowManager" msgid "Sequencer Tool: Select Box (fallback)" -msgstr "Dụng Cụ Bộ Trình Tự: Chọn Hộp (dự trữ)" +msgstr "Công Cụ Phối Hình: Lựa Chọn Hình Hộp (dự bị)" msgctxt "WindowManager" msgid "Sequencer Tool: Blade" -msgstr "Dụng Cụ Bộ Trình Tự: Lưới Dao" +msgstr "Công Cụ Phối Hình: Lưỡi Dao Cắt" msgctxt "WindowManager" msgid "Sequencer Tool: Blade (fallback)" -msgstr "Dụng Cụ Bộ Trình Tự: (dự trữ)" +msgstr "Công Cụ Phối Hình: Lưỡi Dao Cắt (dự bị)" msgctxt "WindowManager" msgid "SequencerPreview" -msgstr "Dự Khán Bộ Trình Tự" +msgstr "Xem Trước Phối Hình" msgctxt "WindowManager" msgid "Sequencer Tool: Cursor" -msgstr "Dụng Cụ Bộ Trình Tự: Con Trỏ" +msgstr "Công Cụ Phối Hình: Con Trỏ" msgctxt "WindowManager" msgid "Sequencer Tool: Cursor (fallback)" -msgstr "Dụng Cụ Bộ Trình Tự: Con Trỏ (dự trữ)" +msgstr "Công Cụ Phối Hình: Con Trỏ (dự bị)" msgctxt "WindowManager" msgid "Sequencer Tool: Move" -msgstr "Dụng Cụ Bộ Trình Tự: Di Chuyển" +msgstr "Công Cụ Phối Hình: Di Chuyển" msgctxt "WindowManager" msgid "Sequencer Tool: Move (fallback)" -msgstr "Dụng Cụ Màn Bộ Trình Tự: Di Chuyển (dự trữ)" +msgstr "Công Cụ Phối Hình: Di Chuyển (dự bị)" msgctxt "WindowManager" msgid "Sequencer Tool: Rotate" -msgstr "Dụng Cụ Bộ Trình Tự: Xoay" +msgstr "Công Cụ Phối Hình: Xoay Chiều" msgctxt "WindowManager" msgid "Sequencer Tool: Rotate (fallback)" -msgstr "Dụng Cụ Bộ Trình Tự: Xoay (dự trữ)" +msgstr "Công Cụ Phối Hình: Xoay Chiều (dự bị)" msgctxt "WindowManager" msgid "Sequencer Tool: Scale" -msgstr "Dụng Cụ Bộ Trình Tự: Phóng To" +msgstr "Công Cụ Phối Hình: Tỷ Lệ" msgctxt "WindowManager" msgid "Sequencer Tool: Scale (fallback)" -msgstr "Dụng Cụ Bộ Trình Tự: Phóng To (dự trữ)" +msgstr "Công Cụ Phối Hình: Tỷ Lệ (dự bị)" msgctxt "WindowManager" msgid "Sequencer Tool: Sample" -msgstr "Dụng Cụ Bộ Trình Tự: Mẫu Vật" +msgstr "Công Cụ Phối Hình: Lấy Mẫu" msgctxt "WindowManager" msgid "Sequencer Tool: Sample (fallback)" -msgstr "Dụng Cụ Bộ Trình Tự: Mẫu Vật" +msgstr "Công Cụ Phối Hình: Lấy Mẫu (dự bị)" msgctxt "WindowManager" @@ -97679,7 +107637,7 @@ msgstr "Trình Duyệt Tập Tin" msgctxt "WindowManager" msgid "File Browser Main" -msgstr "Trình Duyệt Tập Tin Chánh" +msgstr "Trình Duyệt Tập Tin Chính" msgctxt "WindowManager" @@ -97694,7 +107652,7 @@ msgstr "Thông Tin" msgctxt "WindowManager" msgid "Property Editor" -msgstr "Trình Biên Soạn Đặc Tính" +msgstr "Biên Soạn Tính Chất" msgctxt "WindowManager" @@ -97704,217 +107662,232 @@ msgstr "Văn Bản" msgctxt "WindowManager" msgid "Text Generic" -msgstr "Văn Bản Tổng Quát" +msgstr "Thông Dụng về Văn Bản" msgctxt "WindowManager" msgid "Console" -msgstr "Diện Điều Khiển" +msgstr "Bàn Giao Tiếp" msgctxt "WindowManager" msgid "Clip" -msgstr "Khúc Phim" +msgstr "Đoạn Phim" msgctxt "WindowManager" msgid "Clip Editor" -msgstr "Trình Biên Soạn Khúc Phim" +msgstr "Trình Biên Soạn Đoạn Phim" msgctxt "WindowManager" msgid "Clip Graph Editor" -msgstr "Trình Biên Soạn Biểu Đồ Khúc Phim" +msgstr "Trình Biên Soạn Đồ Thị Phim" msgctxt "WindowManager" msgid "Clip Dopesheet Editor" -msgstr "Trình Biên Soạn Bảng Hoạt Hình Khúc Phim" +msgstr "Trình Biên Soạn Bảng Hành Động Phim" msgctxt "WindowManager" msgid "Grease Pencil Stroke Curve Edit Mode" -msgstr "Chế Độ Biên Tập Nét Đường Cong Bút Sáp" +msgstr "Bút Chì Dầu: Chế Độ Biên Soạn Nét" msgctxt "WindowManager" msgid "Grease Pencil Stroke Edit Mode" -msgstr "Chế Độ Biên Tập Nét Bút Sáp" +msgstr "Bút Chì Dầu: Chế Độ Biên Soạn Nét" msgctxt "WindowManager" msgid "Grease Pencil Stroke Paint (Draw brush)" -msgstr "Sơn Nét Bút Sáp (Bút Vẽ)" +msgstr "Bút Chì Dầu: Sơn Nét Vẽ (Đầu bút)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Paint (Fill)" -msgstr "Sơn Nét Bút Sáp (Tô Đầy)" +msgstr "Bút Chì Dầu: Sơn Nét Vẽ (Tô Kín)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Paint (Erase)" -msgstr "Sơn Nét Bút Sáp (Bôi)" +msgstr "Bút Chì Dầu: Sơn Nét Vẽ (Xóa)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Paint (Tint)" -msgstr "Sơn Nét Bút Sáp (Màu Nhiễm)" +msgstr "Sơn Nét Vẽ Bút Chì Dầu (Nhuốm Màu)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Paint Mode" -msgstr "Chế Độ Sơn Nét Bút Sáp" +msgstr "Bút Chì Dầu: Chế Độ Sơn Nét Vẽ" msgctxt "WindowManager" msgid "Grease Pencil Stroke Sculpt Mode" -msgstr "Chế Độ Khắc Nét Bút Sáp" +msgstr "Bút Chì Dầu: Chế Độ Điêu Khắc Nét Vẽ" msgctxt "WindowManager" msgid "Grease Pencil Stroke Sculpt (Smooth)" -msgstr "Khắc Nét Bút Sáp (Mịn)" +msgstr "Bút Chì Dầu: Điêu Khắc Nét Vẽ (Làm Mềm Mại, Trơn Tru)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Sculpt (Thickness)" -msgstr "Khắc Nét Bút Sáp (Bề Dày)" +msgstr "Bút Chì Dầu: Điêu Khắc Nét Vẽ (Độ Dày)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Sculpt (Strength)" -msgstr "Khắc Nét Bút Sáp (Sức)" +msgstr "Bút Chì Dầu: Điêu Khắc Nét (Độ Đậm)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Sculpt (Grab)" -msgstr "Khắc Nét Bút Sáp (Cầm)" +msgstr "Bút Chì Dầu: Điêu Khắc Nét (Nắm)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Sculpt (Push)" -msgstr "Khắc Nét Bút Sáp (Đẩy)" +msgstr "Bút Chì Dầu: Điêu Khắc Nét (Đẩn)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Sculpt (Twist)" -msgstr "Khắc Nét Bút Sáp (Xoắn)" +msgstr "Bút Chì Dầu: Điêu Khắc Nét (Xoắn Vặn)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Sculpt (Pinch)" -msgstr "Khắc Nét Bút Sáp (Ngắt)" +msgstr "Bút Chì Dầu: Điêu Khắc Nét (Nhúm)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Sculpt (Randomize)" -msgstr "Khắc Nét Bút Sáp (Ngẫu Nhiên)" +msgstr "Bút Chì Dầu: Điêu Khắc Nét (Ngẫu Nhiên Hóa)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Sculpt (Clone)" -msgstr "Khắc Nét Bút Sáp (Bản Sao)" +msgstr "Bút Chì Dầu: Điêu Khắc Nét (Rập Khuôn)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Weight Mode" -msgstr "Chế Độ Quyền Lượng Nét Bút Sáp" +msgstr "Bút Chì Dầu: Chế Độ Trọng Lượng Nét Vẽ" msgctxt "WindowManager" msgid "Grease Pencil Stroke Weight (Draw)" -msgstr "Quyền Lượng Nét Bút Sáp (Vẽ)" +msgstr "Bút Chì Dầu: Chế Độ Trọng Lượng Nét (Vẽ)" + + +msgctxt "WindowManager" +msgid "Grease Pencil Stroke Weight (Blur)" +msgstr "Trọng Lượng Nét Vẽ Bút Chì Dầu (Làm Nhòe Mờ)" + + +msgctxt "WindowManager" +msgid "Grease Pencil Stroke Weight (Average)" +msgstr "Trọng Lượng Nét Vẽ Bút Chì Dầu (Tính Trung Bình)" + + +msgctxt "WindowManager" +msgid "Grease Pencil Stroke Weight (Smear)" +msgstr "Trọng Lượng Nét Vẽ Bút Chì Dầu (Bôi Bẩn)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Vertex Mode" -msgstr "Chế Độ Đỉnh Nét Bút Sáp" +msgstr "Bút Chì Dầu: Chế Độ Điểm Đỉnh Nét" msgctxt "WindowManager" msgid "Grease Pencil Stroke Vertex (Draw)" -msgstr "Đỉnh Nét Bút Sáp (Vẽ)" +msgstr "Bút Chì Dầu: Điểm Đỉnh Nét (Vẽ)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Vertex (Blur)" -msgstr "Đỉnh Nét Bút Sáp (Mờ Hóa)" +msgstr "Bút Chì Dầu: Điểm Đỉnh Nét (Làm Nhòe Mờ)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Vertex (Average)" -msgstr "Đỉnh Nét Bút Sáp (Trung Bình)" +msgstr "Bút Chì Dầu: Điểm Đỉnh Nét (Tính Trung Bình)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Vertex (Smear)" -msgstr "Đỉnh Nét Bút Sáp (Bẩn)" +msgstr "Bút Chì Dầu: Điểm Đỉnh Nét (Bôi)" msgctxt "WindowManager" msgid "Grease Pencil Stroke Vertex (Replace)" -msgstr "Đỉnh Nét Bút Sáp (Thay Thế)" +msgstr "Bút Chì Dầu: Điểm Đỉnh Nét (Thay Thế)" msgctxt "WindowManager" msgid "Mask Editing" -msgstr "Biên Tập Mặt Nạ" +msgstr "Biên Soạn Màn Chắn Lọc" msgctxt "WindowManager" msgid "Frames" -msgstr "Bức Ảnh" +msgstr "Khung Hình" msgctxt "WindowManager" msgid "Markers" -msgstr "Ký Hiệu" +msgstr "Các Dấu Mốc" msgctxt "WindowManager" msgid "Animation" -msgstr "Hoạt Hình" +msgstr "Hoạt Họa" msgctxt "WindowManager" msgid "Animation Channels" -msgstr "Kênh Hoạt Hình" +msgstr "Kênh Hoạt Họa" msgctxt "WindowManager" msgid "View3D Gesture Circle" -msgstr "Vòng Tròn Cử Chỉ Màn 3D" +msgstr "Khung Nhìn 3D Cử Chỉ Hình Tròn" msgctxt "WindowManager" msgid "Add" -msgstr "Cộng" +msgstr "Thêm" msgctxt "WindowManager" msgid "Subtract" -msgstr "Trừ" +msgstr "Khấu Trừ" msgctxt "WindowManager" msgid "Size" -msgstr "Kích Cỡ" +msgstr "Kích Thước" msgctxt "WindowManager" msgid "Select" -msgstr "Chọn" +msgstr "Lựa Chọn" msgctxt "WindowManager" msgid "Deselect" -msgstr "Thả" +msgstr "Hủy Chọn" msgctxt "WindowManager" msgid "No Operation" -msgstr "Không Có Thao Tác" +msgstr "Không có Thao Tác" msgctxt "WindowManager" @@ -97934,17 +107907,17 @@ msgstr "Di Chuyển" msgctxt "WindowManager" msgid "Snap" -msgstr "Hút Dính" +msgstr "Bám Dính" msgctxt "WindowManager" msgid "Flip" -msgstr "Lật" +msgstr "Đảo Lật" msgctxt "WindowManager" msgid "Gesture Zoom Border" -msgstr "Cử Chỉ Phóng To Ranh Giới" +msgstr "Cử Chỉ Khoanh Vùng Thu-Phóng" msgctxt "WindowManager" @@ -97959,12 +107932,12 @@ msgstr "Ra" msgctxt "WindowManager" msgid "Gesture Box" -msgstr "Hộp Cử Chỉ" +msgstr "Cử Chỉ Hình Hộp" msgctxt "WindowManager" msgid "Standard Modal Map" -msgstr "Ánh Xạ Cách Thức Tiêu Chuẩn" +msgstr "Ánh Xạ Mô Thái Tiêu Chuẩn" msgctxt "WindowManager" @@ -97974,7 +107947,7 @@ msgstr "Áp Dụng" msgctxt "WindowManager" msgid "Transform Modal Map" -msgstr "Ánh Xạ Cách Thức Biến Hóa" +msgstr "Ánh Xạ Mô Thái của Biến Hóa" msgctxt "WindowManager" @@ -97994,17 +107967,17 @@ msgstr "Trục Z" msgctxt "WindowManager" msgid "X Plane" -msgstr "Mặt Phẳng X" +msgstr "Bình Diện X" msgctxt "WindowManager" msgid "Y Plane" -msgstr "Mặt Phẳng Y" +msgstr "Bình Diện Y" msgctxt "WindowManager" msgid "Z Plane" -msgstr "Mặt Phẳng Z" +msgstr "Bình Diện Z" msgctxt "WindowManager" @@ -98012,153 +107985,258 @@ msgid "Clear Constraints" msgstr "Xóa Ràng Buộc" +msgctxt "WindowManager" +msgid "Set Snap Base" +msgstr "Đặt Cơ Sở Bám Dính" + + +msgctxt "WindowManager" +msgid "Set Snap Base (Off)" +msgstr "Đặt Cơ Sở Bám Dính (Tắt)" + + msgctxt "WindowManager" msgid "Snap Invert" -msgstr "Đảo Nghịch Hút Dính" +msgstr "Đảo Nghịch Bám Dính" msgctxt "WindowManager" msgid "Snap Invert (Off)" -msgstr "Đảo Nghịch Hút Dính (Tắt)" +msgstr "Đảo Nghịch Bám Dính (Tắt)" msgctxt "WindowManager" msgid "Snap Toggle" -msgstr "Bật/Tắt Hút Dính" +msgstr "Bật/Tắt Bám Dính" msgctxt "WindowManager" msgid "Add Snap Point" -msgstr "Thêm Điểm Hút Dính" +msgstr "Thêm Điểm Bám Dính" msgctxt "WindowManager" msgid "Remove Last Snap Point" -msgstr "Xóa Điểm Hút Dính Cuối" +msgstr "Xóa Điểm Bám Dính Cuối Cùng" msgctxt "WindowManager" msgid "Numinput Increment Up" -msgstr "NgõVàoSố Tăng Lên" +msgstr "Số Nhập Gia Lượng Tăng Lên" msgctxt "WindowManager" msgid "Numinput Increment Down" -msgstr "NgõVàoSố Tăng Xuống" +msgstr "Số Nhập Gia Lượng Giảm Xuống" msgctxt "WindowManager" msgid "Increase Proportional Influence" -msgstr "Tăng Sự Ảnh Hưởng Tỉ Lệ" +msgstr "Gia Tăng Ảnh Hưởng Cân Đối" msgctxt "WindowManager" msgid "Decrease Proportional Influence" -msgstr "Giảm Sự Ảnh Hưởng Tỉ Lệ" +msgstr "Thuyên Giảm Ảnh Hưởng Cân Đối" msgctxt "WindowManager" msgid "Increase Max AutoIK Chain Length" -msgstr "Tăng Chiều Dài Cực Đại Của Chuỗi IKTựĐộng" +msgstr "Tăng Chiều Dài Dây Chuyền Động Học Ngược Tự Động Tối Đa" msgctxt "WindowManager" msgid "Decrease Max AutoIK Chain Length" -msgstr "Giảm Chiều Dài Cực Đại Của Chuỗi IKTựĐộng" +msgstr "Giảm Chiều Dài Dây Chuyền Động Học Ngược Tự Động Tối Đa" msgctxt "WindowManager" msgid "Adjust Proportional Influence" -msgstr "Chỉnh Tỉ Lệ Ảnh Hưởng" +msgstr "Điều Chỉnh Ảnh Hưởng Cân Đối" msgctxt "WindowManager" msgid "Toggle Direction for Node Auto-Offset" -msgstr "Bặt/tắt Hướng cho Tự Động Dịch Giao Điểm" +msgstr "Bật/Tắt Chiều Hướng cho Dịch Chuyển Nút Tự Động" + + +msgctxt "WindowManager" +msgid "Node Attachment" +msgstr "Đính Nút" + + +msgctxt "WindowManager" +msgid "Node Attachment (Off)" +msgstr "Đính Nút (Tắt)" + + +msgctxt "WindowManager" +msgid "Vert/Edge Slide" +msgstr "Trượt Điểm Đỉnh/Cạnh" msgctxt "WindowManager" msgid "Rotate" -msgstr "Xoay" +msgstr "Xoay Chiều" + + +msgctxt "WindowManager" +msgid "TrackBall" +msgstr "Hòn Bi Điều Khiển" msgctxt "WindowManager" msgid "Resize" -msgstr "Đổi Kích Cỡ" +msgstr "Đổi Kích Thước" + + +msgctxt "WindowManager" +msgid "Rotate Normals" +msgstr "Xoay Chiều các Pháp Tuyến" msgctxt "WindowManager" msgid "Automatic Constraint" -msgstr "Ràng buộc Tự Động" +msgstr "Ràng Buộc Tự Động" msgctxt "WindowManager" msgid "Automatic Constraint Plane" -msgstr "Mặt Phẳng Ràng Buộc Tự Động" +msgstr "Bình Diện Ràng Buộc Tự Động" msgctxt "WindowManager" msgid "Precision Mode" -msgstr "Chế Độ Độ Chính Xác" +msgstr "Chế Độ Chuẩn Xác" msgctxt "WindowManager" msgid "Eyedropper Modal Map" -msgstr "Ánh Xạ Cách Thức Ống Hút Giọt Nước" +msgstr "Ánh Xạ Mô Thái của Ống Nhỏ Mắt" msgctxt "WindowManager" msgid "Confirm Sampling" -msgstr "Xác Nhận Lấy Mẫu" +msgstr "Chấp Thuận Mẫu Vật" msgctxt "WindowManager" msgid "Start Sampling" -msgstr "Bắt Đầu Lấy Mẫu" +msgstr "Khởi Đầu Lấy Mẫu Vật" msgctxt "WindowManager" msgid "Reset Sampling" -msgstr "Đặt Lại Lấy Mẫu" +msgstr "Hoàn Lại Quá trình Lấy Mẫu Vật" msgctxt "WindowManager" msgid "Eyedropper ColorRamp PointSampling Map" -msgstr "ỐngHútGiọtNước DốcMàu ĐiểmMẫuVật ÁnhXạ" +msgstr "Ánh Xạ Mẫu Vật Chấm Điểm Dốc Màu của Ống Nhỏ Mắt" msgctxt "WindowManager" msgid "Sample a Point" -msgstr "Mẫu Một Điểm" +msgstr "Lấy Mẫu Vật một Điểm" + + +msgctxt "WindowManager" +msgid "Mesh Filter Modal Map" +msgstr "Ánh Xạ Mô Thái Bộ Lọc Khung Lưới" + + +msgid "You have been logged out" +msgstr "Bạn đã đăng xuất" + + +msgid "Logged in" +msgstr "Đã đăng nhập rồi" + + +msgid "Authentication token is valid" +msgstr "Mã xác thực là mã hợp lệ" + + +msgid "We do not know when your token expires, please validate it" +msgstr "Chúng tôi không biết khi nào mã xác thực của bạn hết hạn, xin vui lòng kiểm duyệt tính hợp lệ của mã nhé" + + +msgid "%s; you probably want to log out and log in again" +msgstr "%s; bạn nên đăng xuất và đăng nhập lại nhé" + + +msgid "Your login has expired! Log out and log in again to refresh it" +msgstr "Thông tin đăng nhập của bạn đã hết hạn rồi! Xin đăng xuất và đăng nhập lại để làm mới nó nhé" + + +msgid "Your token will expire %s. Please log out and log in again to refresh it" +msgstr "Mã xác thực của bạn sẽ hết hạn %s. Xin vui lòng đăng xuất và đăng nhập lại để làm mới nó nhé" + + +msgid "Your authentication token expires %s" +msgstr "Mã xác thực của bạn hết hạn %s" + + +msgid "You are logged in as %s" +msgstr "Bạn đã đăng nhập với tên %s" + + +msgid "You are logged in as %s at %s" +msgstr "Bạn đã đăng nhập với tên %s tại %s" + + +msgid "on {:%Y-%m-%d}" +msgstr "vào ngày {:%Y-%m-%d}" + + +msgid "in %i days" +msgstr "trong %i ngày" + + +msgid "in %i hours" +msgstr "trong %i tiếng đồng hồ" + + +msgid "within seconds" +msgstr "nội trong vài giây đồng hồ" + + +msgid "in %i minutes" +msgstr "trong %i phút" msgid "No selected keys, pasting over scene range" -msgstr "Chưa chọn được bức ảnh mẫu nào, đang dán trong phạm vi cảnh" +msgstr "Không có khung khóa nào được chọn cả, dán lên trên phạm vi của cảnh" + + +msgctxt "Operator" +msgid "Mirrored" +msgstr "Phản Chiếu Đối Xứng" msgid "Clipboard does not contain a valid matrix" -msgstr "Bảng dán không chứa một ma trận hợp lệ" +msgstr "Bộ nhớ tạm không có chứa ma trận hợp lệ nào cả" msgid "This mode requires auto-keying to work properly" -msgstr "Chế độ này yêu cầu bức ảnh mẫu tự động để hoạt động đúng" +msgstr "Chế độ này đòi hỏi tự động khung khóa hóa thì mới hoạt động bình thường được" msgid "No selected frames found" -msgstr "Chưa tìm bức ảnh nào được chọn" +msgstr "Không tìm thấy khung hình đã chọn nào cả" msgid "No selected keys, pasting over preview range" -msgstr "Chưa chọn bức ảnh mẫu nào, đang dán trong phạm vi dự khán" +msgstr "Không có khung khóa nào được chọn cả, dán trên phạm vi xem trước" msgid "These require auto-key:" -msgstr "Những cái này yêu cầu bức ảnh mẫu tự động:" +msgstr "Những cái này đòi hỏi tự động khung khóa hóa:" msgctxt "Operator" msgid "Paste to Selected Keys" -msgstr "Dán vào Bức Ảnh Mẫu Được Chọn" +msgstr "Dán vào các Khung Khóa đã Chọn" msgctxt "Operator" @@ -98166,52 +108244,116 @@ msgid "Paste and Bake" msgstr "Dán và Nướng" +msgid "Unable to mirror, no mirror object/bone configured" +msgstr "Không thể phản chiếu đối xứng, không thấy có đối tượng/xương phản chiếu đối xứng nào đã được cấu hình cả" + + +msgid "OSL support disabled in this build" +msgstr "Hỗ trợ cho OSL đã bị vô hiệu hóa trong bản xây dựng này" + + msgid "Denoising completed" -msgstr "Giảm huyên náo hoàn thành" +msgstr "Quá trình lọc nhiễu đã hoàn tất" msgid "Frame '%s' not found, animation must be complete" -msgstr "Không tìm được bức ảnh '%s', hoạt hình phải có toàn bộ" +msgstr "Không tìm thấy khung hình '%s'. Hoạt họa nhất định phải trọn vẹn" msgid "OSL shader compilation succeeded" -msgstr "Biên dịch bộ tô sắc OSL đã thành công" +msgstr "Sự biên dịch bộ tô bóng OSL đã thành công" msgid "OSL script compilation failed, see console for errors" -msgstr "Biên địch văn thảo OSL bị thất bại, xem sai lầm trong diện điều khiển" +msgstr "Sự biên dịch tập lệnh bộ tô bóng OSL bị thất bại. Xin xem các lỗi in ở bàn giao tiếp" msgid "No text or file specified in node, nothing to compile" -msgstr "Không xác định tập tin trong giao điểm, không có gì để biên dịch" +msgstr "Không có văn bản hoặc tập tin nào được xác định trong nút cả. Chẳng có gì để biên dịch" + + +msgid "OSL query failed to open %s" +msgstr "Truy vấn OSL không mở %s được" msgid "External shader script must have .osl or .oso extension, or be a module name" -msgstr "Văn thảo bộ tô sắc ngoại phải có đuôi .osl hay .oso, hay là một mô đun " +msgstr "Tập lệnh tô bóng bên ngoài phải có đuôi .osl hay .oso, hoặc là tên một mô-đun" msgid "Can't read OSO bytecode to store in node at %r" -msgstr "Không đọc được mã byte OSO để chứa trong giao điểm tại %r" +msgstr "Không thể đọc mã byte OSO (định dạng Open Shading Compiled Object: Đối Tượng được Biên Dịch của Tô Bóng Mở) để lưu trong nút tại %r" msgid "Failed to write .oso file next to external .osl file at " -msgstr "Lưu tập tin .oso kề tập tin ngoài .osl bị thất bại" +msgstr "Thất bại trong việc ghi tập tin .oso kế tiếp tập tin .osl, ở bên ngoài, tại " msgid "No compatible GPUs found for Cycles" -msgstr "Không tìm được GPU phù hợp cho Cycles" +msgstr "Không tìm thấy GPU nào tương thích với Cycles cả" + + +msgid "Requires NVIDIA GPU with compute capability %s" +msgstr "Đòi hỏi GPU NVIDIA có khả năng tính toán %s" + + +msgid "Requires AMD GPU with Vega or RDNA architecture" +msgstr "Yêu cầu GPU AMD với kiến trúc Vega hoặc RDNA" + + +msgid "and NVIDIA driver version %s or newer" +msgstr "và trình điều khiển NVIDIA phiên bản %s hoặc mới hơn" msgid "Requires Intel GPU with Xe-HPG architecture" -msgstr "Yêu cầu GPU Intel có kiến trúc Xe-HPG" +msgstr "Yêu cầu GPU Intel với kiến trúc Xe-HPG" + + +msgid "Requires Intel GPU with Xe-HPG architecture and" +msgstr "Đòi hỏi GPU Intel với kiến trúc Xe-HPG và" + + +msgid " - intel-level-zero-gpu or intel-compute-runtime version" +msgstr " - phiên bản intel-level-zero-gpu (bộ xử lý đồ họa cấp không intel) hoặc intel-compute-runtime (tính toán thời gian chạy intel)" + + +msgid " - oneAPI Level-Zero Loader" +msgstr " - Trình Nạp Cấp Không oneAPI" + + +msgid "and AMD Radeon Pro %s driver or newer" +msgstr "và trình điều khiển AMD Radeon Pro %s hoặc mới hơn" + + +msgid "and AMD driver version %s or newer" +msgstr "và phiên bản trình điều khiển AMD %s hoặc mới hơn" + + +msgid "and Windows driver version %s or newer" +msgstr "và phiên bản trình điều khiển Windows %s hoặc mới hơn" + + +msgid "Requires Apple Silicon with macOS %s or newer" +msgstr "Đòi hỏi Apple Silicon với macOS %s trở lên" + + +msgid "or AMD with macOS %s or newer" +msgstr "hoặc AMD với macOS %s hoặc mới hơn" + + +msgid " %s or newer" +msgstr " %s hoặc mới hơn" msgid "Noise Threshold" -msgstr "Ngưỡng Huyên Náo" +msgstr "Ngưỡng của Nhiễu" msgid "Start Sample" -msgstr "Mẫu Đầu" +msgstr "Lượng Mẫu Vật Khởi Đầu" + + +msgid "Distribution Type" +msgstr "Kiểu Phân Bổ" msgid "Multiplier" @@ -98219,15 +108361,15 @@ msgstr "Số Nhân" msgid "Dicing Rate Render" -msgstr "Kết Xuất Tốc Độ Cắt" +msgstr "Tỷ Lệ Phân Hóa Cho Kết Xuất" msgid "Offscreen Scale" -msgstr "Phóng To Ngoài Màn" +msgstr "Tỷ Lệ Ngoài Màn Hình" msgid "Step Rate Render" -msgstr "Kết Xuất Bước Tốc Độ" +msgstr "Tần Số Phân Bước Trong Kết Xuất" msgid "Direct Light" @@ -98239,27 +108381,27 @@ msgstr "Ánh Sáng Gián Tiếp" msgid "Reflective" -msgstr "Phản Xạ" +msgstr "Có Tính Phản Xạ" msgid "Refractive" -msgstr "Khúc Xạ" +msgstr "Có Tính Khúc Xạ" msgid "Rolling Shutter" -msgstr "Trập Lăn" +msgstr "Màn Trập Quét Mành" msgid "Roughness Threshold" -msgstr "Ngưỡng Độ Nhám" +msgstr "Giới Hạn Của Độ Ráp" msgid "Surfaces" -msgstr "Các Bề Mặt" +msgstr "Bề Mặt" msgid "Denoising Data" -msgstr "Dữ Liệu Bất Huyên Náo Hoá" +msgstr "Dữ Liệu Khử Nhiễu" msgid "Indexes" @@ -98267,35 +108409,35 @@ msgstr "Chỉ Số" msgid "Pipeline" -msgstr "Đường Ống" +msgstr "Quy Trình" msgid "Geometry Offset" -msgstr "Nới Hình Dạng" +msgstr "Dịch Chuyển Hình Học" msgid "Shading Offset" -msgstr "Nới Tô Sắc" +msgstr "Dịch Chuyển Bóng Tối" msgid "Show In" -msgstr "Hiện Trong" +msgstr "Hiển Thị Trong" msgid "Viewports" -msgstr "Các Màn Chiếu" +msgstr "Cổng Nhìn" msgid "Renders" -msgstr "Các Kết Xuất" +msgstr "Kết Xuất" msgid "No output node" -msgstr "Không có giao điểm ngõ ra" +msgstr "Không có nút xuất" msgid "Homogeneous" -msgstr "Đều Giống" +msgstr "Đồng Đều" msgid "BVH" @@ -98303,35 +108445,39 @@ msgstr "BVH" msgid "Module Debug" -msgstr "Sửa Lỗi Mô Đun" +msgstr "Gỡ Lỗi Mô-Đun" msgid "Viewport BVH" -msgstr "BVH Màn Chiếu" +msgstr "BVH Cổng Nhìn" msgid "Max Subdivision" -msgstr "Phân Hóa Tối Đa" +msgstr "Mức Phân Hóa Tối Đa" msgid "Texture Limit" -msgstr "Giới Hạn Chất Liệu" +msgstr "Giới Hạn Của Chất Liệu" msgid "Volume Resolution" -msgstr "Độ Phân Giải Thể Tích" +msgstr "Độ Phân Giải Của Thể Tích" msgid "Camera Culling" -msgstr "Hủy Diệt Máy Quay Phim" +msgstr "Loại Trừ trong Máy Quay Phim" msgid "Distance Culling" -msgstr "Hũy Diệt Khoảng Cách" +msgstr "Loại Trừ theo Khoảng Cách" + + +msgid "Max Samples" +msgstr "Số Mẫu Tối Đa" msgid "Min Samples" -msgstr "Mẫu Tối Thiểu" +msgstr "Lượng Mẫu Vật Tối Thiểu" msgid "Prefilter" @@ -98339,23 +108485,23 @@ msgstr "Bộ Lọc Trước" msgid "Curve Subdivisions" -msgstr "Phân Hóa Đường Cong" +msgstr "Mức Phân Hóa Đường Cong" msgid "AO Factor" -msgstr "Hệ Số Che Khuất Bao Quanh" +msgstr "Hệ Số Hấp Thụ Quang Xạ Môi Trường" msgid "Viewport Bounces" -msgstr "Nhồi Màn Chiếu" +msgstr "Lượng Bật Nẩy Cổng Nhìn" msgid "Render Bounces" -msgstr "Nhồi Kết Xuất" +msgstr "Kết Xuất các Bật Nảy" msgid "Incompatible output node" -msgstr "Giao điểm ngõ ra không thích hợp" +msgstr "Nút đầu ra không tương thích" msgid "Portal" @@ -98363,73 +108509,105 @@ msgstr "Cổng" msgid "Swizzle R" -msgstr "Đổi Chỗ R" +msgstr "Đảo R" msgid "Extrusion" -msgstr "Kéo Ra" +msgstr "Đẩy Trồi/Kéo Ra" msgid "Clear Image" -msgstr "Xóa Ảnh" +msgstr "Xóa Hình Ảnh" msgid "Cycles built without Embree support" -msgstr "Cycles được xây dựng thiếu hỗ trợ Embree" +msgstr "Cycles được xây dựng không có sự hỗ trợ cho Embree" msgid "CPU raytracing performance will be poor" -msgstr "Hiệu suất dò tia CPU sẽ không tốt" +msgstr "Hiệu suất dò tia bằng Bộ Xử Lý sẽ rất thấp" msgctxt "Operator" msgid "Assign" -msgstr "Chỉ Định" +msgstr "Ấn Định" msgctxt "Operator" msgid "Deselect" -msgstr "Thả" +msgstr "Hủy Chọn" msgid "Contributions" -msgstr "Gồm Góp" +msgstr "Đóng Góp" + + +msgid "Step Size Lightning" +msgstr "Kích Thước Bước của Sét Đánh" + + +msgid "Transparent Background" +msgstr "Nền Trong Suốt" + + +msgctxt "Operator" +msgid "Motion Capture (.bvh)" +msgstr "Nắm Bắt Chuyển Động (.bvh)" msgid "The BVH file does not contain frame duration in its MOTION section, assuming the BVH and Blender scene have the same frame rate" -msgstr "Tập tin BVH không có giai đoạn bức ảnh trong phần MOTION (CHUYỂN ĐỘNG), giả sư cảnh BVH và Blender có tốc độ bức ảnh bằng nhau" +msgstr "Phần MOTION (chuyển động) của tập tin BVH (Cây Phân Cấp Giới Hạn Thể Tích) không có thời lượng khung hình nào trong đó cả. Tạm giả định là cảnh trong BVH và trong Blender có cùng một tần số khung hình" msgid "Unable to update scene frame rate, as the BVH file contains a zero frame duration in its MOTION section" -msgstr "Không thể nâng cấp tốc bức ảnh của cảnh, vì tập tin BVH có giai đoạn = 0 trong phần MOTION (CHUYỂN ĐỘNG)" +msgstr "Không thể nâng cấp tần số khung hình của cảnh được, vì phần MOTION (chuyển động) của tập tin BVH (Bounding Volume Hierarchy: Cây Phân Cấp Giới Hạn Thể Tích) không có thời lượng khung hình nào trong đó cả" msgid "Unable to extend the scene duration, as the BVH file does not contain the number of frames in its MOTION section" -msgstr "Không thể kéo dài giai đoạn cảnh, vì tập tin BVH không có số lượng bức ảnh trong phần MOTION (CHUYỂN ĐỘNG)" +msgstr "Không thể nới dài thời lượng của cảnh được, vì phần MOTION (Chuyển Động) của tập tin BVH (Bounding Volume Hierarchy: Cây Phân Cấp Giới Hạn Thể Tích) không có thời lượng khung hình nào trong đó cả" msgid "Invalid target %r (must be 'ARMATURE' or 'OBJECT')" -msgstr "Mục tiêu không hợp lệ %r (phải là 'ARMATURE' ('CỐT') hay 'OBJECT' ('VẬT THỂ'))" +msgstr "Mục tiêu không hợp lệ %r (nhất định phải là 'KHUNG CỐT' hoặc 'ĐỐI TƯỢNG')" + + +msgctxt "Operator" +msgid "Cameras & Markers (.py)" +msgstr "Máy Quay Phim & các Dấu Mốc (.py)" + + +msgctxt "Operator" +msgid "Scalable Vector Graphics (.svg)" +msgstr "Đồ Họa Vectơ Có Thể Mở Rộng (.svg)" msgid "Unable to parse XML, %s:%s for file %r" -msgstr "Không thể phân tích XML, %s:%s cho tập tin %r" +msgstr "Không thể phân tích XML (Extensible Markup Language: Ngôn ngữ đánh dấu mở rộng), %s:%s cho tập tin %r" + + +msgctxt "Operator" +msgid "Images as Planes" +msgstr "Hình Ảnh như Bình Diện" msgid "Import Options:" -msgstr "Tùy Chọn Nhập:" +msgstr "Tùy Chọn về Nhập Khẩu:" msgid "Compositing Nodes:" -msgstr "Giao Điểm Ghép:" +msgstr "Các Nút Tổng Hợp:" msgid "Material Settings:" -msgstr "Cài Đặt Vật Liệu:" +msgstr "Sắp Đặt về Nguyên Vật Liệu:" + + +msgid "Material Type" +msgstr "Thể Loại Nguyên Vật Liệu" msgid "Texture Settings:" -msgstr "Cài Đặt Chất Liệu:" +msgstr "Sắp Đặt về Chất Liệu:" msgid "Position:" @@ -98437,7 +108615,7 @@ msgstr "Vị Trí:" msgid "Plane dimensions:" -msgstr "Kích thước mặt phẳng:" +msgstr "Kích Thước Bình Diện:" msgid "Orientation:" @@ -98445,23 +108623,39 @@ msgstr "Định Hướng:" msgid "Added {} Image Plane(s)" -msgstr "Được thêm {} Mặt Phẳng Ảnh" +msgstr "Đã Thêm {} Bình Diện Hình Ảnh" + + +msgid "'Opaque' does not support alpha" +msgstr "'Đục' chưa hỗ trợ alpha" msgid "%s is not supported" -msgstr "%s không được hỗ trợ" +msgstr "%s chưa được hỗ trợ" msgid "Cannot generate materials for unknown %s render engine" -msgstr "Không thể chế tạo vật liệu cho động cơ kết xuất %s lạ" +msgstr "Không thể sinh tạo nguyên vật liệu cho máy kết xuất %s chưa biết đến" msgid "Generating Cycles/EEVEE compatible material, but won't be visible with %s engine" -msgstr "Đang chế tạo vật liệu thích hợp với Cycles/EEVEE, nhưng không thể hiển thị với động cơ %s" +msgstr "Sinh tạo nguyên vật liệu tương thích cho Cycles/EEVEE, song không nhìn thấy được trong máy %s" + + +msgid "Limit to" +msgstr "Giới hạn trong" + + +msgid "%s could not be set out of Edit Mode, so cannot be exported" +msgstr "%s không thể đặt ngoài Chế Độ Biên Soạn được, nên không thể xuất khẩu" msgid "Mesh '%s' has polygons with more than 4 vertices, cannot compute/export tangent space for it" -msgstr "Mạng lưới '%s' có đa giác có hơn 4 đỉnh, không thể tính/xuất không gian tiếp tuyến cho nó" +msgstr "Khung lưới '%s' có một hoặc nhiều đa giác hơn 4 điểm đỉnh. Không thể tính toán/xuất khẩu không gian tiếp tuyến cho nó được" + + +msgid "%s in %s could not be set out of Edit Mode, so cannot be exported" +msgstr "%s trong %s không thể đặt ngoài Chế Độ Biên Soạn được, nên không thể xuất khẩu" msgid "ASCII FBX files are not supported %r" @@ -98469,25 +108663,73 @@ msgstr "Không hỗ trợ tập tin ASCII FBX %r" msgid "Version %r unsupported, must be %r or later" -msgstr "Không hỗ trợ phiên bản %r, chỉ %r trở sau" +msgstr "Không hỗ trợ phiên bản %r, phải là %r hoặc muộn hơn" msgid "No 'GlobalSettings' found in file %r" -msgstr "Không kiếm được 'GlobalSettings' (CàiĐặtToànCầu) trong tập tin %r" +msgstr "Không tìm thấy 'Sắp Đặt Toàn Cầu' trong tập tin %r" msgid "No 'Objects' found in file %r" -msgstr "Không kiếm được 'VậtThể' trong tập tin %r" +msgstr "Không tìm thấy 'Đối Tượng' trong tập tin %r" msgid "No 'Connections' found in file %r" -msgstr "Không kiếm được 'KếtNối' trong tập tin %r" +msgstr "Không tìm thấy 'Kết Nối' trong tập tin %r" msgid "Couldn't open file %r (%s)" msgstr "Không mở được tập tin %r (%s)" +msgid "Quantize Position" +msgstr "Lượng Tử Hóa Vị Trí" + + +msgid "Tex Coord" +msgstr "Tọa Độ Văn Bản" + + +msgid "Shader Editor Add-ons" +msgstr "Các Trình Bổ Sung cho Trình Biên Soạn Bộ Tô Bóng" + + +msgid "Material Variants" +msgstr "Biến Thể của Nguyên Vật Liệu" + + +msgid "Animation UI" +msgstr "Giao Diện Hoạt Họa" + + +msgid "Export only deformation bones is not possible when not sampling animation" +msgstr "Không thể nào chỉ xuất khẩu xương biến dạng khi không lấy mẫu hoạt họa" + + +msgid "Scene mode uses full bake mode:" +msgstr "Chế độ cảnh sử dụng chế độ nướng toàn phần:" + + +msgid "- sampling is active" +msgstr "- quá trình lấy mẫu vật đang hoạt động" + + +msgid "- baking all objects is active" +msgstr "- nướng toàn bộ các đối tượng đang hoạt động" + + +msgid "- Using scene frame range" +msgstr "- Sử dụng phạm vi khung hình của cảnh" + + +msgid "Track mode uses full bake mode:" +msgstr "Chế độ rãnh sử dụng chế độ nướng đầy đủ:" + + +msgid "Loading export settings failed. Removed corrupted settings" +msgstr "Quá trình nạp các cài đặt xuất khẩu đã bị thất bại. Đã xóa các cài đặt bị hư hoại đi rồi" + + msgctxt "Operator" msgid "Display Variant" msgstr "Hiển Thị Biến Thể" @@ -98495,22 +108737,26 @@ msgstr "Hiển Thị Biến Thể" msgctxt "Operator" msgid "Assign To Variant" -msgstr "Chỉ Định Đến Biến Thể" +msgstr "Ấn Định sang Biến Thể" msgctxt "Operator" msgid "Reset To Original" -msgstr "Đặt Lại Đến Ban Đầu" +msgstr "Hoàn Lại về Bản Gốc" msgctxt "Operator" msgid "Assign as Original" -msgstr "Chỉ định là Ban Đầu" +msgstr "Ấn Định sang Bản Gốc" msgctxt "Operator" msgid "Add Material Variant" -msgstr "Thêm Biến Thể Vật Liệu" +msgstr "Thêm Biến Thể Nguyên Vật Liệu" + + +msgid "No glTF Animation" +msgstr "Không Có Hoạt Họa glTF" msgid "Variant" @@ -98518,32 +108764,112 @@ msgstr "Biến Thể" msgid "Please Create a Variant First" -msgstr "Làm ơn Chế Tạo một Biến Thể Trước" +msgstr "Xin vui lòng Kiến Tạo một Biến Thể trước đi đã" msgctxt "Operator" msgid "Add a new Variant Slot" -msgstr "Thêm một Lhe Biến Thể mới" +msgstr "Thêm một Khe Biến Thể mới" + + +msgid "untitled" +msgstr "vô danh" + + +msgid "Exported: {!r}" +msgstr "Đã Xuất Khẩu: {!r}" msgid "Multiple selected objects. Only the active one will be evaluated" -msgstr "Được chọn nhiều vật thể. Chỉ sẽ đánh giá vật thể hoạt động" +msgstr "Nhiều đối tượng được chọn. Chỉ cái đang hoạt động sẽ được tính toán mà thôi" + + +msgid "Triangulated {} faces" +msgstr "Đã tam giác hóa {} các mặt" + + +msgid "Modified: {:+} vertices, {:+} edges, {:+} faces" +msgstr "Đã sửa đổi: {:+} điểm đỉnh, {:+} cạnh, {:+} các mặt" + + +msgid "Scaled by {}{}" +msgstr "Đã Đổi Tỷ Lệ theo {}{}" + + +msgid "Scaled by {}" +msgstr "Đã Đổi Tỷ Lệ theo {}" msgid "Object has zero volume" -msgstr "Thể tích vật thể bằng 0" +msgstr "Đối tượng không có thể tích" msgid "Object has zero bounds" -msgstr "Ranh giới vật thể là không" +msgstr "Đối tượng không có ranh giới" msgid "Report is out of date, re-run check" -msgstr "Biên bản lỗi thời, chạy lại và kiểm tra" +msgstr "Báo cáo đã lỗi thời, xin kiểm tra lại" + + +msgid "Skipping object {}. No faces selected" +msgstr "Bỏ qua đối tượng {}. Không có các mặt nào đã được chọn cả" msgid "Skipping some objects. No faces selected. See terminal" -msgstr "Bỏ qua vài vật thể. Không có mặt nào được chọn. Xem diện điều khiển" +msgstr "Bỏ qua một số đối tượng. Không có các mặt nào được chọn cả. Xin xem ở thiết bị đầu cuối" + + +msgid "Volume: {}³" +msgstr "Thể Tích: {}³" + + +msgid "Area: {}²" +msgstr "Diện tích: {}²" + + +msgid "Non Manifold Edges: {}" +msgstr "Cạnh Phi Đa Tạp: {}" + + +msgid "Bad Contiguous Edges: {}" +msgstr "Cạnh Tiếp Giáp Tồi: {}" + + +msgid "Intersect Face: {}" +msgstr "Mặt Giao Cắt: {}" + + +msgid "Zero Faces: {}" +msgstr "Không Có Các Mặt: {}" + + +msgid "Zero Edges: {}" +msgstr "Không Có Cạnh: {}" + + +msgid "Non-Flat Faces: {}" +msgstr "Các Mặt Không Phẳng: {}" + + +msgid "Thin Faces: {}" +msgstr "Các Mặt Mỏng: {}" + + +msgid "Sharp Edge: {}" +msgstr "Cạnh Sắc: {}" + + +msgid "Overhang Face: {}" +msgstr "Mặt Nhô Ra Lơ Lửng: {}" + + +msgid ", Clamping {}-Axis" +msgstr ", Hạn Định {}-Trục" + + +msgid "Align to XY: Skipping object {}. No faces selected" +msgstr "Căn chỉnh theo XY: Bỏ qua đối tượng {}. Không có các mặt nào đã được chọn cả" msgid "Statistics" @@ -98557,7 +108883,7 @@ msgstr "Thể Tích" msgctxt "Operator" msgid "Area" -msgstr "Diện tích" +msgstr "Diện Tích" msgid "Checks" @@ -98566,169 +108892,248 @@ msgstr "Kiểm Tra" msgctxt "Operator" msgid "Solid" -msgstr "Chất Rắn" +msgstr "Lập Thể" msgctxt "Operator" msgid "Intersections" -msgstr "Vùng Giao Cắt" +msgstr "Giao Cắt" msgctxt "Operator" msgid "Degenerate" -msgstr "Thoái Hóa" +msgstr "Suy Biến" msgctxt "Operator" msgid "Distorted" -msgstr "Méo Hóa" +msgstr "Biến Dạng" msgctxt "Operator" msgid "Edge Sharp" -msgstr "Cạnh Bén" +msgstr "Cạnh Sắc Nhọn" msgctxt "Operator" msgid "Overhang" -msgstr "Nhô Ra" +msgstr "Nhô Ra Lơ Lửng" msgctxt "Operator" msgid "Check All" -msgstr "Kiểm Tra Hết" +msgstr "Kiểm Tra Toàn Bộ" msgctxt "Operator" msgid "Make Manifold" -msgstr "Đa Tập Hóa" +msgstr "Đa Tạp Hóa" msgid "Scale To" -msgstr "Phóng To Đến" +msgstr "Đổi Tỷ Lệ Thành" msgctxt "Operator" msgid "Bounds" -msgstr "Ràng Giới" +msgstr "Ranh Giới" msgctxt "Operator" msgid "Align XY" -msgstr "Sắp Hàng XY" +msgstr "Căn Chỉnh XY" msgctxt "Operator" msgid "Export" -msgstr "Xuất" +msgstr "Xuất Khẩu" msgid "Result" -msgstr "Kết Qủa" +msgstr "Kết Quả" msgid "Select objects to scatter and a target object" -msgstr "Chọn các vật thể để rải ra và một vật thể mục đích" +msgstr "Chọn các đối tượng để phân tán rải rác và một đối tượng đích" msgctxt "Operator" msgid "Select Pose Bones" -msgstr "Chọn Xương Dạng Đứng" +msgstr "Chọn Xương Tư Thế" msgctxt "Operator" msgid "Deselect Pose Bones" -msgstr "Thả Xương Dạng Đứng" +msgstr "Hủy Chọn Xương Tư Thế" + + +msgid "The pose library moved." +msgstr "Thư viện tư thế đã di chuyển rồi." + + +msgid "Pose assets are now available" +msgstr "Các tài sản tư thế hiện nay đã có sẵn" + + +msgid "in the asset shelf." +msgstr "trong kệ tài sản." msgctxt "Operator" msgid "Apply Pose" -msgstr "Áp Dụng Dạng Đứng" +msgstr "Áp Dụng Tư Thế" + + +msgctxt "Operator" +msgid "Apply Pose Flipped" +msgstr "Áp Dụng Tư Thế Đảo Ngược" msgctxt "Operator" msgid "Blend Pose" -msgstr "Pha Trộn Dạng Đứng" +msgstr "Pha Trộn Tư Thế" + + +msgctxt "Operator" +msgid "Toggle Asset Shelf" +msgstr "Bật/Tắt Kệ Tài Sản" msgid "Action %s marked Fake User to prevent loss" -msgstr "Hành động %s được ghi dấu Người Dùng Giả để tránh bị xóa" +msgstr "Hành động %s đã được đánh dấu là có Người Dùng Giả để tránh bị xóa mất đi" msgid "Pose Asset copied, use Paste As New Asset in any Asset Browser to paste" -msgstr "Được chép Tích Sản Dạng Đứng, dùng Dán Như Tích Sản trong bất cứ Trình Duyệt nào để dán" +msgstr "Tài Sản Tư Thế đã được sao chép. Hãy sử dụng chức năng Dán Thành Tài Sản Mới trong bất kỳ Trình Duyệt Tài Sản nào để dán vào nhé" msgid "Pasted %d assets" -msgstr "Đã dán %d tích sản" +msgstr "Đã dán %d tài sản rồi" msgid "Converted %d poses to pose assets" -msgstr "Đã biến đổi %d dạng đứng thành tích sản dạng đứng" +msgstr "Đã chuyển đổi %d tư thế thành tài sản tư thế rồi" msgid "No keyframes were found for this pose" -msgstr "Không tìm được bức ảnh mẫu cho hình dạng này" +msgstr "Không có khung khóa nào tìm thấy được cho tư thế này cả" msgid "No animation data found to create asset from" -msgstr "Không tìm được dữ liệu hoạt hình để chế tạo tích sản" +msgstr "Không tìm thấy dữ liệu hoạt họa nào để kiến tạo tài sản từ đó được cả" msgid "Unexpected non-zero user count for the asset, please report this as a bug" -msgstr "Bớt ngờ số lượng người dùng bằng 0 cho tích sản, xin thông báo cái này là một sai lầm" +msgstr "Tài sản có số lượng người dùng khác 0 một cách bất ngờ. Xin vui lòng báo cáo hiện trạng lỗi lầm này của phần mềm" msgid "Did not find any assets on clipboard" -msgstr "Không tìm được tích sản nào trên bảng dán" +msgstr "Không tìm thấy bất kỳ tài sản nào trong bảng nháp hệ thống cả" + + +msgid "Selected asset %s could not be located inside the asset library" +msgstr "Không thể tìm thấy tài sản %s đã chọn bên trong thư viện tài sản" + + +msgid "Selected asset %s is not an Action" +msgstr "Tài sản đã chọn %s không phải là một Hành Động" msgid "Unable to convert to pose assets" -msgstr "Không thể biến đổi tích sản dạng đứng" +msgstr "Không thể chuyển đổi thành các tài sản tư thế được" + + +msgid "Selected bones from %s" +msgstr "Đã chọn các xương từ %s" + + +msgid "Deselected bones from %s" +msgstr "Đã hủy chọn các xương từ %s" + + +msgid "Action %r is not a legacy pose library" +msgstr "Hành động %r không phải là một thư viện tư thế lỗi thời" + + +msgctxt "Operator" +msgid "Clear Math Vis" +msgstr "Xóa Diễn Họa Toán Học" + + +msgid "No vars to display" +msgstr "Không có biến số nào để hiển thị cả" + + +msgid "Demo text \"%s\" created with %s file(s){:,d}" +msgstr "Văn bản trình diễn giới thiệu \"%s\" đã được tạo với %s tập tin{:,d}" + + +msgid "Search *.blend recursively" +msgstr "Tìm kiếm *.blend một cách đệ quy" + + +msgid "Writes: %s config text" +msgstr "Viết: văn bản cấu hình %s" + + +msgid "Generate Settings:" +msgstr "Sinh Tạo các Cài Đặt:" + + +msgid "Animate Settings:" +msgstr "Các Cài Đặt về Hoạt Họa:" + + +msgid "Render Settings:" +msgstr "Các Sắp Đặt về Kết Xuất:" + + +msgid "Can't load %s config, run: File -> Demo Mode (Setup)" +msgstr "Không thể tải cấu hình %s được, xin hãy chạy: Tập Tin -> Chế Độ Trình Diễn Giới Thiệu (Thiết Lập)" msgid "Demo Mode:" -msgstr "Chế Độ Ví Dụ:" +msgstr "Chế Độ Trình Diễn Giới Thiệu:" msgid "No configuration found with text or file: %s. Run File -> Demo Mode Setup" -msgstr "Không kiếm được cấu hình có văn bản hay tập tin: %s. Chạy Tập Tin -> Cài đặt Chế Độ Ví Dụ" +msgstr "Không tìm thấy cấu hình có văn bản hay tập tin: %s. Hãy thi hành Tập Tin -> Sắp Đặt Chế Độ Giới Thiệu" msgid "Save to PO File" -msgstr "Luu Vào Tập Tin PO" +msgstr "Lưu vào Tập Tin PO" msgid "Rebuild MO File" -msgstr "Xây Lại Tập Tin MO" +msgstr "Tái Dựng Tập Tin MO" msgid "Erase Local MO files" -msgstr "Xóa Tập Tin MO Địa Phương" +msgstr "Xóa các tập tin MO Cục Bộ" msgid "invoke() needs to be called before execute()" -msgstr "Cần kêu invoke() (cầu khẩn) trước execute() (thực hành)" +msgstr "invoke(), hay 'kích hoạt()', cần phải được gọi trước hàm execute(), hay 'thi hành()'" msgid " RNA Path: bpy.types." -msgstr " Đường Dẫn RNA: bpy.types." +msgstr " Đường Dẫn RNA: bpy.types." msgid " RNA Context: " -msgstr " Bối Cảnh RNA: " +msgstr " Ngữ Cảnh RNA: " msgid "Labels:" -msgstr "Nhãn:" +msgstr "Nhãn Hiệu:" msgid "Tool Tips:" -msgstr "Đề Thị Cụng Dụ:" +msgstr "Chú Giải Công Cụ:" msgid "Button Label:" -msgstr "Nhãn Nút:" +msgstr "Nhãn Nút Bấm:" msgid "RNA Label:" @@ -98736,77 +109141,81 @@ msgstr "Nhãn RNA:" msgid "Enum Item Label:" -msgstr "Nhãn Mặt Hàng Liệt Kê:" +msgstr "Nhãn Phần Tử Liệt Kê:" msgid "Button Tip:" -msgstr "Đề Thị Nút:" +msgstr "Chú Giải Nút Bấm:" msgid "RNA Tip:" -msgstr "Đề Thị RNA:" +msgstr "Chú Giải RNA:" msgid "Enum Item Tip:" -msgstr "Đề thị Mặt Hàn Liệt Kê:" +msgstr "Chú Giải Phần Tử Liệt Kê:" msgid "Could not write to po file ({})" -msgstr "Không được luư tập tin .po ({})" +msgstr "Không thể ghi tập tin po ({})" msgid "WARNING: preferences are lost when add-on is disabled, be sure to use \"Save Persistent\" if you want to keep your settings!" -msgstr "CẢNH BÁO: tùy chọn bị mất khi đồ kèm bị tắt, dùng \"Lưu Cố Chấp\" nếu bạn muốn giữ lại đặc tính của bạn!" +msgstr "Cảnh Cáo: Cài Đặt Sở Thích sẽ bị mất đi khi trình bổ sung bị vô hiệu hóa (tắt đi). Nếu bạn muốn duy trì các sắp đặt của mình thì nên sử dụng \"Lưu Ổn Định\" (Save Persistent)!" msgctxt "Operator" msgid "Save Persistent To..." -msgstr "Lưu Cố Chấp Tại..." +msgstr "Lưu Ổn Định Vào..." msgctxt "Operator" msgid "Load Persistent From..." -msgstr "Nhập Cố Chấp Từ..." +msgstr "Nạp Ổn Định Từ..." msgctxt "Operator" msgid "Load" -msgstr "Nhập" +msgstr "Nạp" msgid "No add-on module given!" -msgstr "Chưa cho mô đun đồ kèm chỉ định" +msgstr "Chưa thấy cung cấp mô-đun trình bổ sung nào cả!" msgid "Add-on '{}' not found!" -msgstr "Không kiếm được đồ kèm '{}'!" +msgstr "Không tìm thấy trình bổ sung '{}'!" + + +msgid "Info written to %s text datablock!" +msgstr "Thông tin đã được ghi vào khối dữ liệu văn bản %s rồi nhé!" msgid "Message extraction process failed!" -msgstr "Qúa trịnh rút tin nhắn bị thất bại!" +msgstr "Quá trình trích xuất thông điệp bị thất bại!" msgid "Could not init languages data!" -msgstr "Không được khởi động dữ liệu ngôn ngữ!" +msgstr "Không thể khởi động dữ liệu ngôn ngữ!" msgid "Please edit the preferences of the UI Translate add-on" -msgstr "Làm ơn chỉnh sửa các tùy chọn của đồ kèm Phiên Dịch Giao Diện" +msgstr "Làm ơn biên soạn cài đặt sở thích của trình bổ sung Phiên Dịch Giao Diện Người Dùng" msgctxt "Operator" msgid "Init Settings" -msgstr "Cài Đặt Khởi Động" +msgstr "Khởi Thủy các Cài Đặt" msgctxt "Operator" msgid "Reset Settings" -msgstr "Hoàn Lại Cài đặt" +msgstr "Hoàn Lại Sắp Đặt" msgctxt "Operator" msgid "Deselect All" -msgstr "Thả Hết" +msgstr "Hủy Chọn Toàn Bộ" msgctxt "Operator" @@ -98815,51 +109224,51 @@ msgstr "Thống Kê" msgid "Add-ons:" -msgstr "Đồ Kèm:" +msgstr "Trình Bổ Sung:" msgctxt "Operator" msgid "Refresh I18n Data..." -msgstr "Nạp Lại Đữ Liệu I18n" +msgstr "Làm Tươi Lại Dữ Liệu I18n..." msgctxt "Operator" msgid "Export PO..." -msgstr "Xuất PO..." +msgstr "Xuất Khẩu PO..." msgctxt "Operator" msgid "Import PO..." -msgstr "Nhấp PO..." +msgstr "Nhập Khẩu PO..." msgctxt "Operator" msgid "Invert Selection" -msgstr "Đảo Nghịch Sự Lựa Chọn" +msgstr "Đảo Nghịch Lựa Chọn" msgid "Positional" -msgstr "Vị Trí" +msgstr "Theo Vị Trí" msgid "Controllers" -msgstr "Đồ Điều Khiển" +msgstr "Bộ Điều Khiển" msgid "Custom Overlays" -msgstr "Lớp Che Tùy Chọn" +msgstr "Vẽ Lồng Tùy Chỉnh" msgid "Object Extras" -msgstr "Đồ Thêm Vật Thể" +msgstr "Đối Tượng Bổ Sung" msgid "Controller Style" -msgstr "Phong Cách Đồ Điều Khiển" +msgstr "Kiểu Cách của Bộ Điều Khiển" msgid "Gamepad" -msgstr "Đồ Bấm Đồ Chơi" +msgstr "Bộ Điều Khiển Trò Chơi" msgid "HP Reverb G2" @@ -98883,15 +109292,51 @@ msgstr "Ghi Chú:" msgid "Settings here may have a significant" -msgstr "Các cài đặt này có thể ảnh hưởng" +msgstr "Các sắp đặt ở đây có thể có" msgid "performance impact!" -msgstr "hiệu suất không ít!" +msgstr "tác động đến hiệu suất hoạt động đáng kể!" msgid "Built without VR/OpenXR features" -msgstr "Được xây dựng thiếu tính năng Sự Thật Ảo/OpenXR" +msgstr "Được xây dựng không có chức năng Thực Tế Ảo/OpenXR" + + +msgid "Start VR Session" +msgstr "Khởi Động Phiên Sử Dụng VR" + + +msgid "Stop VR Session" +msgstr "Ngừng Phiên Sử Dụng VR" + + +msgid "* Missing Paths *" +msgstr "* Thiếu Đường Dẫn *" + + +msgctxt "Operator" +msgid "Import..." +msgstr "Nhập khẩu..." + + +msgctxt "Operator" +msgid "Export..." +msgstr "Xuất Khẩu..." + + +msgctxt "Operator" +msgid "Restore" +msgstr "Khôi Phục" + + +msgctxt "WindowManager" +msgid "Add New" +msgstr "Thêm Mới" + + +msgid "%s (Global)" +msgstr "%s (Toàn Cầu)" msgctxt "Operator" @@ -98901,15 +109346,35 @@ msgstr "Mới" msgctxt "Operator" msgid "Edit Value" -msgstr "Biên Tập Giá Trị" +msgstr "Biên Soạn Giá Trị" msgid "API Defined" -msgstr "API Được Định Nghĩa" +msgstr "API Định Nghĩa" + + +msgid "Select with Mouse Button" +msgstr "Lựa Chọn bằng Nút Chuột" msgid "3D View" -msgstr "Màn 3D" +msgstr "Góc Nhìn 3D" + + +msgid "Grave Accent / Tilde Action" +msgstr "Hành Động của các Phím Dấu Huyền/Dấu Ngã" + + +msgid "Middle Mouse Action" +msgstr "Hành Động của Nút Chuột Giữa" + + +msgid "Alt Middle Mouse Drag Action" +msgstr "Alt Hành Động Kéo Rê Nút Chuột Giữa" + + +msgid "Activate Gizmo Event" +msgstr "Kích Hoạt Sự Kiện Gizmo" msgid "Torus" @@ -98917,371 +109382,443 @@ msgstr "Hình Xuyến" msgid "Removed %d empty and/or fake-user only Actions" -msgstr "Đã xóa %d Hành Động chỉ rỗng và/hoặc người dùng giả bộ" +msgstr "Xóa %d đối tượng trống rỗng và/hoặc duy Hành Động của người dùng giả mà thôi" msgid "Nothing to bake" -msgstr "Không có gì để nướng" +msgstr "Không có gì để nướng cả" msgid "Complete report available on '%s' text datablock" -msgstr "Toàn biên bản ở trên cực dữ liệu văn bản '%s'" +msgstr "Thông báo toàn vẹn hiện nằm trong khối dữ liệu văn bản '%s'" + + +msgid "Bone colors were synced; for %d bones this will not be visible due to pose bone color overrides" +msgstr "Màu xương đã được đồng bộ hóa; đối với xương %d, cái này sẽ không hiển thị do sự vượt quyền màu xương tư thế gây ra" + + +msgid "Go to pose mode to copy pose bone colors" +msgstr "Chuyển sang chế độ tư thế sao chép các màu xương tư thế" + + +msgid "Cannot do anything in mode %r" +msgstr "Không thể làm bất cứ cái gì ở chế độ %r cả" msgid "Could not find material or light using Shader Node Tree - %s" -msgstr "Không tìm được vật liệu hoặc đèn đang dùng Cây Giao Điểm Bộ Tô Sắc - %s" +msgstr "Dùng Cây Nút Tô Bóng nhưng không tìm thấy nguyên vật liệu hoặc nguồn ánh sáng - %s" msgid "Could not find scene using Compositor Node Tree - %s" -msgstr "Không tìm được cảnh đang dùng Cây Giao Điểm Bộ Ghép - %s" +msgstr "Dùng Cây Nút Tô Bóng nhưng không tìm thấy cảnh - %s" msgid "This asset is stored in the current blend file" -msgstr "Tích sản này được chứa trong tập tin blend hiện tại" +msgstr "Tài sản này đã được lưu trữ trong tập tin blend hiện tại" msgid "Unable to find any running process" -msgstr "Không thể tìm qúa trình nào đang chạy" +msgstr "Không tìm thấy bất kỳ quy trình nào hiện đang thi hành cả" msgid "Blender sub-process exited with error code %d" -msgstr "Hạ qúa trình Blender thoát với mã lỗi lầm %d" +msgstr "Quy trình phụ của Blender đã kết thúc với mã chỉ lỗi phần mềm là %d" msgid "Selection pair not found" -msgstr "Không tìm được đôi sự lựa chọn" +msgstr "Không tìm thấy cặp đôi lựa chọn" msgid "No single next item found" -msgstr "Không tìm được mặt hàng kề tiếp tục" +msgstr "Không thấy có đơn phần tử nào tiếp theo cả" msgid "Next element is hidden" -msgstr "Phần tở kề tiếp được ẩn" +msgstr "Phần tử tiếp theo đã bị ẩn giấu mất rồi" msgid "Last selected not found" -msgstr "Không tìm được đã chọn cuối cùng" +msgstr "Không tìm thấy cái được chọn cuối cùng" msgid "Identified %d problematic tracks" -msgstr "Đã phát hiện %d rãnh có vấn đề" +msgstr "Phát hiện thấy %d dấu giám sát có vấn đề" msgid "No usable tracks selected" -msgstr "Chưa được chọn rãnh nào có thể dùng" +msgstr "Không có giám sát nào khả dụng được cả" msgid "Motion Tracking constraint to be converted not found" -msgstr "Không tìm được ràng buộc đuổi theo chuyển động để biến đổi" +msgstr "Không tìm thấy ràng buộc Giám Sát Chuyển Động cần chuyển đổi nào cả" msgid "Movie clip to use tracking data from isn't set" -msgstr "Đoạn phim để sử dụng dữ liệu đuổi theo chưa được cài đặt" +msgstr "Chưa ấn định đoạn phim nào sử dụng để lấy dữ liệu giám sát từ đó ra" msgid "Motion Tracking object not found" -msgstr "Không tìm được vật thể Đuổi Theo Chuyển Động" +msgstr "Không tìm thấy đối tượng Giám Sát Chuyển Động" msgid "Some strings were fixed, don't forget to save the .blend file to keep those changes" -msgstr "Vài xâu được sửa lại, đừng quên lưu tập tin .blend để giữ các sự thay đổi" +msgstr "Một số chuỗi văn bản đã được sửa chữa, chớ quên lưu tập tin .blend để giữ lại các thay đổi" msgid "Previews generation process failed for file '%s'!" -msgstr "Qúa trình chế tạo dự khán bị thất bại cho tập tin '%s'!" +msgstr "Xem trước sự/chỗ/phần/vùng/bản/cái/mức/độ/tính/sự/phép phát sinh tạo/thế hệ/đời quá trình thất bại hầu cho/dành cho/đối với/để tập tin '%s'!" msgid "Previews clear process failed for file '%s'!" -msgstr "Qúa trình xóa dự khán bị thất bại cho tập tin '%s'!" +msgstr "Quá trình xóa xem trước tập tin '%s' bị thất bại!" + + +msgid "No active camera in the scene" +msgstr "Không có máy quay phim nào đang hoạt động trong cảnh cả" msgid "Unexpected modifier type: " -msgstr "Loại bộ điều chỉnh bất ngờ: " +msgstr "Thể loại bộ điều chỉnh không chấp nhận: " msgid "Target object not specified" -msgstr "Vật thể mục tiêu chưa được xác định" +msgstr "Đối tượng mục tiêu chưa được xác định" msgid "GeometryNodes" -msgstr "GiaoĐiểmHìnhDạng" +msgstr "Các Nút Hình Học" + + +msgid "Node group must have a geometry output" +msgstr "Nhóm nút nhất định phải có một đầu ra hình học nhé" msgid "Image path not set" -msgstr "Đường dẩn ảnh chưa được cài đặt" +msgstr "Đường dẫn hình ảnh chưa được ấn định" msgid "Image path %r not found, image may be packed or unsaved" -msgstr "Không tìm được đường dẫn ảnh '%r', có lẽ ảnh đã bị gói lại hay chưa được lưu" +msgstr "Không tìm thấy đường dẫn của hình ảnh %r. Hình ảnh có thể đã được đóng gói hoặc lưu lại rồi" msgid "Image is packed, unpack before editing" -msgstr "Ảnh đã bị gói lại, gỡ gói trước biên tập" +msgstr "Hình ảnh đã được đóng gói. Phải mở gói trước khi biên soạn" msgid "Could not make new image" -msgstr "Không thể tạo ảnh mới" +msgstr "Không thể tạo hình ảnh mới được" msgid "Could not find image '%s'" -msgstr "Không tìm được ảnh '%s'" +msgstr "Không tìm thấy hình ảnh '%s'" msgid "Image editor could not be launched, ensure that the path in User Preferences > File is valid, and Blender has rights to launch it" -msgstr "Không được khởi động trình biên soạn ảnh, làm chắc đường dẫn trong Tùy Chọn Người Dùng > Tập tin hợp lệ, và Blender có quyển để khởi động nó" +msgstr "Không thể khởi động trình biên soạn hình ảnh được. Hãy đảm bảo rằng đường dẫn trong Cài Đặt Sở Thích > Đường Dẫn Tập Tin là hợp lệ, và Blender có quyền thi hành nó" msgid "Context incorrect, image not found" -msgstr "Bối cảnh không đúng, không tìm được ảnh" +msgstr "Không đúng ngữ cảnh. Không tìm thấy hình ảnh" msgid "%d mesh(es) with no active UV layer, %d duplicates found in %d mesh(es), mirror may be incomplete" -msgstr "%d mạng lưới không có lớp UV hoạt động, tìm được %d bản sao trong %d mạng lưới, có lẽ gương bị thiếu" +msgstr "%d khung lưới không có tầng UV đang hoạt động, %d bản sao kép tìm thấy trong %d khung lưới, sự phảng quang phản chiếu đối xứng có thể sẽ không được hoàn hảo trọn vẹn" msgid "%d mesh(es) with no active UV layer" -msgstr "%d mạng lưới không có lớp UV hoạt động" +msgstr "%d khung lưới không có tầng UV đang hoạt động" msgid "%d duplicates found in %d mesh(es), mirror may be incomplete" -msgstr "Tìm được %d bàn sao trong %d mạng lưới, có lẽ gương bị thiếu" +msgstr "%d bản sao kép tìm thấy trong %d khung lưới, sự phảng quang phản chiếu đối xứng có thể sẽ không được hoàn hảo trọn vẹn" + + +msgid "Node has no attribute %s" +msgstr "Nút không có thuộc tính %s" msgid "No camera found" -msgstr "Không tìm được máy quay phim" +msgstr "Không tìm thấy có máy quay phim nào" msgid "Other object is not a mesh" -msgstr "Vật thể kia không phải là mạng lưới" +msgstr "Đối tượng kia không phải là khung lưới" msgid "Other object has no shape key" -msgstr "Vật thể kia không có một mẫu dạng" +msgstr "Đối tượng kia không có hình mẫu" msgid "Object: %s, Mesh: '%s' has no UVs" -msgstr "Vật Thê: %s, Mạng Lượi: '%s' không có UV" +msgstr "Đối Tượng: %s, Khung Lưới: '%s' không có UV" msgid "Active camera is not in this scene" -msgstr "Cảnh này không có máy quay phim hoạt động" +msgstr "Máy quay đang hoạt động không nằm trong cảnh này" msgid "Skipping '%s', not a mesh" -msgstr "Bỏ qua '%s', không phải là mạng lưới" +msgstr "Bỏ qua '%s', không phải là khung lưới" msgid "Skipping '%s', vertex count differs" -msgstr "Bỏ qua '%s', đếm số lượng đỉnh không giống" +msgstr "Bỏ qua '%s', số lượng điểm đỉnh khác hơn" msgid "Expected one other selected mesh object to copy from" -msgstr "Định có một mạng lưới khác được chọn để chép từ nó" +msgstr "Mong đợi sự tồn tại của một đối tượng khung lưới khác đã được chọn để sao chép từ đó sang" msgid "No animation data to convert on object: %r" -msgstr "Vật thể không có dữ liệu hoạt hình để biến đổi: %r" +msgstr "Đối tượng: %r không có dữ liệu hoạt họa để chuyển đổi thành" msgid "Modifiers cannot be added to object: " -msgstr "Không thể thêm bộ điều chỉnh cho vật thể: " +msgstr "Bộ điều chỉnh không thể cho thêm đối tượng vào: " msgid "Object '%r' already has '%r' F-Curve(s). Remove these before trying again" -msgstr "Vật thể '%r' đã có '%r' Cong-F rồi. Xóa các đường cong này trước thử lần nữa" +msgstr "Đối tượng '%r' đã có '%r' Đường Cong-F rồi. Xóa những cái này đi trước khi thử nghiệm lại một lần nữa" msgid "Object: %s, Mesh: '%s' has %d loops (for %d faces), expected %d" -msgstr "Vật thể: %s, Mạng lưới '%s' có %d vòng lặp (cho %d mặt), định có %d" +msgstr "Đối Tượng: %s, Khung Lưới: '%s' có %d vòng mạch (%d các mặt), số kỳ vọng là %d" msgid "Could not add a new UV map to object '%s' (Mesh '%s')" -msgstr "Không thêm được một bản đồ UV mới cho vật thể '%s' (Mạng Lưới '%s')" +msgstr "Không thể cho thêm một ánh xạ UV mới vào đối tượng '%s' (Khung Lưới '%s')" msgid "No objects with bound-box selected" -msgstr "Không có vật thể nào được hộp bao quanh được chọn" +msgstr "Không có đối tượng nào có khung hộp viền được chọn cả" msgid "Select at least one mesh object" -msgstr "Chọn một vật thể mạng lưới trở lên" +msgstr "Chọn ít nhất một đối tượng khung lưới" + + +msgid "Fur Material" +msgstr "Nguyên Vật Liệu Lông" + + +msgid "Mesh has no face area" +msgstr "Khung lưới không có diện tích Mặt" + + +msgid "Mesh UV map required" +msgstr "Đòi hỏi phải có ánh xạ UV của khung lưới" + + +msgid "Unable to apply \"Generate\" modifier" +msgstr "Không thể áp dụng bộ điều chỉnh \"Kiến Tạo\"" msgid "Active object is not a mesh" -msgstr "Vật thể hoạt động không phải là mạng lưới" +msgstr "Đối tượng đang hoạt động không phải là một khung lưới" msgid "Select two mesh objects" -msgstr "Chọn hai vật thể mạng lưới" +msgstr "Chọn hai khung lưới đối tượng" msgid "Built without Fluid modifier" -msgstr "Xây mà không có bộ điều chỉnh Chất Lỏng" +msgstr "Được xây dựng không có bộ điều chỉnh Chất Lỏng trong đó" msgid "Object %r already has a particle system" -msgstr "Vật thể %r đã có một hệ thống hạt rồi" +msgstr "Đối tượng %r đã có hệ thống hạt rồi" + + +msgid "Set Hair Curve Profile" +msgstr "Đặt Mặt Cắt Đường Cong Tóc" + + +msgid "Interpolate Hair Curves" +msgstr "Nội Suy Đường Cong Tóc" + + +msgid "Hair Curves Noise" +msgstr "Nhiễu Đường Cong Tóc" + + +msgid "Frizz Hair Curves" +msgstr "Đường Cong Tóc Xù" msgid "New Preset" -msgstr "Đặt Sẫn Mới" +msgstr "Sắp Đặt Sẵn Mới" msgid "Unknown file type: %r" -msgstr "Loại tập tin không biết: %r" +msgstr "Thể loại tập tin chưa biết đến: %r" msgid "Failed to create presets path" -msgstr "Tạo đường dẩn đặt sẵn đã bị thất bại" +msgstr "Việc kiến tạo đường dẫn sắp đặt sẵn bị thất bại" msgid "Unable to remove default presets" -msgstr "Không thể xóa đặt sẵn mặc định" +msgstr "Không thể xóa sắp đặt sẵn mặc định" msgid "Unable to remove preset: %r" -msgstr "Không thể xóa đặt sẵn: %r" +msgstr "Không thể xóa sắp đặt sẵn: %r" msgid "Failed to execute the preset: " -msgstr "Thực hành đặt sẵn bị thất bại" +msgstr "Thất bại trong việc thi hành sắp đặt sẵn: " msgid "No other objects selected" -msgstr "chưa được chọn vật thể nào khác" +msgstr "Không có đối tượng nào khác đã được chọn cả" msgid "File %r not found" -msgstr "Không tìm được tập tin %r" +msgstr "Không tìm thấy tập tin %r" msgid "" "Couldn't run external animation player with command %r\n" "%s" msgstr "" -"Không thể chạy bộ hát hoạt hình ngoại bộ dùng lệnh %r\n" +"Không thể thi hành máy chơi hoạt họa bên ngoài với lệnh %r\n" "%s" msgid "Added fade animation to %d %s" -msgstr "Thêm phai hoạt hình cho %d %s" +msgstr "Cho thêm hoạt họa phai mờ dần vào %d %s" msgid "Select 2 sound strips" -msgstr "Chọn 2 đoạn âm thanh" +msgstr "Chọn 2 dải âm thanh" msgid "The selected strips don't overlap" -msgstr "Các đoạn được chọn không lấn trên nhau" +msgstr "Các dải được chọn không đè gối lên nhau" msgid "No sequences selected" -msgstr "Chưa chọn trình tự nào" +msgstr "Không có trình tự nào đã được chọn cả" msgid "Current frame not within strip framerange" -msgstr "Bức ảnh hiện tại không ở trong phạm vi đoàn" +msgstr "Khung hình hiện tại không nằm trong khoảng khung hình của dải" + + +msgid "Provide text editor argument format in File Paths/Applications Preferences, see input field tool-tip for more information" +msgstr "Cung cấp định dạng đối số của trình biên soạn văn bản trong Cấu Hình Đường Dẫn Tập Tin/Ứng Dụng. Xin xem chú thích công cụ trường đầu vào để biết thêm thông tin nhé" + + +msgid "Text Editor Args Format must contain $filepath" +msgstr "Định Dạng Đối Số của Trình Biên Soạn Văn Bản phải có chứa $filepath (đường dẫn tập tin)" + + +msgid "Exception parsing template: %r" +msgstr "Lỗi ngoại lệ trong khi phân tích mẫu: %r" + + +msgid "Exception running external editor: %r" +msgstr "Lỗi ngoại lệ khi chạy trình biên soạn bên ngoài: %r" msgid "Reload Start-Up file to restore settings" -msgstr "Nhập lại tập tin Khởi Động để đặt lại những cài đặt" +msgstr "Nạp lại Tập Tin Khởi Động để phục hồi các sắp đặt" msgid "Filepath not set" -msgstr "Chưa đặt đường dẫn tập tin" +msgstr "Đường dẫn tập tin chưa được sắp đặt" msgid "Failed to get themes path" -msgstr "Lấy đường dẫn phong cách bị thất bại" +msgstr "Thất bại trong việc nạp đường dẫn đến các kiểu mẫu" msgid "Failed to get add-ons path" -msgstr "Lấy đường dẫn đồ kèm bị thất bại" +msgstr "Thất bại trong việc nạp đường dẫn đến các trình bổ sung" msgid "Modules Installed (%s) from %r into %r" -msgstr "Mô đun Đã Cài Đặt (%s) từ %r vào %r" +msgstr "Mô-Đun đã được Cài Đặt (%s) từ %r vào %r" msgid "Add-on path %r could not be found" -msgstr "Không thể tìm được đường dẫn đồ kèm %r" +msgstr "Không tìm thấy được đường dẫn đến trình bổ sung %r" msgid "Expected a zip-file %r" -msgstr "Định có một tập tin zip %r" +msgstr "Kỳ vọng một tập tin-zip %r" msgid "Template Installed (%s) from %r into %r" -msgstr "Bố Cục Mẫu Đã Cài Đặt (%s) từ %r vào %r" +msgstr "Bản mẫu đã được Cài Đặt (%s) từ %r vào %r" msgid "Failed to create Studio Light path" -msgstr "Tạo đường dẫn Đèn Xưởng đã bị thất bại" +msgstr "Thất bại trong việc kiến tạo đường dẫn đến Ánh Sáng Studio" msgid "StudioLight Installed %r into %r" -msgstr "Đèn Xưởng Đã Cài Đặt %r vào %r" +msgstr "Ánh Sáng Studio đã được Cài Đặt %r vào %r" msgid "Failed to get Studio Light path" -msgstr "Lấy đường dẫn Đèn Xưởng đã bị thất bại" +msgstr "Thất bại trong việc lấy đường dẫn đến Ánh Sáng Studio" msgid "Warning, file already exists. Overwrite existing file?" -msgstr "Cảnh báo, tập tin này tồn tại rồi. Ghi lưu trên tập tin tồn tại không?" +msgstr "Cảnh cáo, tập tin hiện đang tồn tại. Viết đè chồng lên tập tin hiện tại nhé?" msgid "Installing keymap failed: %s" -msgstr "Cài đặt ánh xạ phím bị thất bại: %s" +msgstr "Cài đặt bố trí phím đã bị thất bại: %s" msgid "This script was written Blender version %d.%d.%d and might not function (correctly), though it is enabled" -msgstr "Văn thảo được ghi bởi phiên bản Blender %d.%d.%d và có thể không hoạt động (đúng), nhưng nó được bật" +msgstr "Tập lệnh này đã được viết bằng phiên bản Blender %d.%d.%d và có khả năng sẽ không hoạt động (đúng đắn), mặc dù nó đã được bật (cho phép hoạt động)" msgid "File already installed to %r" -msgstr "Tập tin đã cài đặt vào %r rồi" +msgstr "Tập tin đã được cài đặt vào %r" msgid "Source file is in the add-on search path: %r" -msgstr "Tập tin nguồn đang ở trong đường dẫn tìm kiếm của đồ kèm: %r" +msgstr "Tập tin nguồn hiện đang nằm trong đường dẫn tìm kiếm trình bổ sung: %r" msgid "Remove Add-on: %r?" -msgstr "Xóa Đồ Kèm: %r?" +msgstr "Xóa Trình Bổ Sung: %r?" msgid "Path: %r" -msgstr "Đường Dẫn: %r" +msgstr "Đường dẫn: %r" msgid "Active face must be a quad" -msgstr "Mặt hoạt động phải là tư giác" +msgstr "Mặt đang hoạt động nhất định phải là một tứ giác" msgid "Active face not selected" -msgstr "Mặt hoạt động chưa được chọn" +msgstr "Mặt đang hoạt động chưa được chọn" msgid "No active face" -msgstr "Không có mặt hoạt động" +msgstr "Không thấy có Mặt đang hoạt động" msgid "No mesh object" -msgstr "Không có vật thể mạng lưới" +msgstr "Không thấy có đối tượng khung lưới" msgid "See OperatorList.txt text block" -msgstr "Xem cục văn bản DachSáchThaoTác.txt" +msgstr "Xin xem khối văn bản OperatorList.txt" msgid "Renamed %d of %d %s" -msgstr "Đã đặt lại tên cho %d của %d %s" +msgstr "Đổi tên %d của %d %s" msgid "Shortcuts" -msgstr "Phím Tắt" +msgstr "Đường Cắt Ngắn" msgctxt "Operator" @@ -99290,11 +109827,11 @@ msgstr "Mở..." msgid "Blender is free software" -msgstr "Blender là phầm mềm tự do" +msgstr "Blender là phần mềm tự do" msgid "Licensed under the GNU General Public License" -msgstr "Giấy phép Bằng Công Cộng Tổng Quát GNU" +msgstr "Đã được cấp phép chiểu theo Giấy Phép Công Chúng GNU" msgid "%s: %s" @@ -99302,69 +109839,92 @@ msgstr "%s: %s" msgid "Nothing to operate on: %s[ ].%s" -msgstr "Không có gì để thao tác: %s[ ].%s" +msgstr "Không có gì để thao tác với: %s[ ].%s" msgid "File path was not set" -msgstr "Chưa cài đặt đường dẫn tập tin" +msgstr "Đường dẫn tập tin chưa được lắp đặt" msgid "File '%s' not found" -msgstr "Không tìm được tập tin '%s'" +msgstr "Không tìm thấy tập tin '%s'" msgid "No reference available %r, Update info in 'rna_manual_reference.py' or callback to bpy.utils.manual_map()" -msgstr "Không có tham chiếu %r, Nâng cấp thông tin tron 'rna_manual_reference.py' hay kêu lại đến bpy.utils.manual_map()" +msgstr "Không có tham chiếu nào có thể sử dụng được %r. Hãy cập nhật thông tin trong 'rna_manual_reference.py' hoặc dùng hàm gọi lại về bpy.utils.manual_map()" msgid "Direct execution not supported" -msgstr "Không hỗ trợ thực hành trực tiếp" +msgstr "Không hỗ trợ sự thi hành trực tiếp" msgid "Cannot edit properties from override data" -msgstr "Không thể biên tập đặc tính từ dữ liệu vượt quyền" +msgstr "Không thể biên soạn các tính chất bắt nguồn từ dữ liệu vượt quyền" msgid "Data path not set" -msgstr "Chưa cài đặt đường dẫn dữ liệu" +msgstr "Đường dẫn dữ liệu chưa được lắp đặt" msgid "Properties from override data can not be edited" -msgstr "Không thể biên tập dặc tính từ dữ liệu vượt quyền" +msgstr "Không thể biên soạn các tính chất từ dữ liệu vượt quyền được" msgid "Cannot add properties to override data" -msgstr "Không thể thêm đặc tính vào dữ liệu vượt quyền" +msgstr "Không thể thêm tính chất vào dữ liệu vượt quyền" msgid "Cannot remove properties from override data" -msgstr "Không thể xóa đặc tính từ dữ liệu vượt quyền" +msgstr "Không thể xóa tính chất khỏi dữ liệu vượt quyền" msgid "Tool %r not found for space %r" -msgstr "Không tìm được dụng cụ %r cho không gian %r" +msgstr "Không tìm thấy công cụ %r cho không gian %r" + + +msgid "Import Existing Settings" +msgstr "Nhập Khẩu các Cài Đặt Hiện Có" + + +msgid "Create New Settings" +msgstr "Tạo các Cài Đặt Mới" msgid "Select With" -msgstr "Chọn bằng" +msgstr "Lựa Chọn Với" msgid "Spacebar" -msgstr "Thanh Dấu Cách" +msgstr "Dấu cách" msgctxt "Operator" msgid "Save New Settings" -msgstr "Lưu Cài Đặt Mới" +msgstr "Lưu các Sắp Đặt Mới" + + +msgctxt "Operator" +msgid "Continue" +msgstr "Tiếp Tục" msgid "Getting Started" -msgstr "Bắt Đầu Khởi Động" +msgstr "Khởi Đầu" + + +msgctxt "Operator" +msgid "Donate" +msgstr "Quyên Góp" + + +msgctxt "Operator" +msgid "What's New" +msgstr "Những Gì là Mới" msgctxt "Operator" msgid "Credits" -msgstr "Tác Giả" +msgstr "Bảng Công Trạng" msgctxt "Operator" @@ -99374,78 +109934,78 @@ msgstr "Giấy Phép" msgctxt "Operator" msgid "Blender Store" -msgstr "Chợ Blender" +msgstr "Cửa Hàng Blender" msgctxt "Operator" msgid "Blender Website" -msgstr "Nơi Trang Mạng Blender" +msgstr "Trang Mạng Blender" msgctxt "Operator" msgid "Link..." -msgstr "Liên Kết..." +msgstr "Kết Nối..." msgctxt "Operator" msgid "Append..." -msgstr "Kèm..." +msgstr "Bổ Sung Thêm..." msgid "Assign" -msgstr "Chỉ Định" +msgstr "Ấn định" msgid "Operator not found: bpy.ops.%s" -msgstr "Không tìm được thao tác: bpy.ops.%s" +msgstr "Không tìm thấy thao tác: bpy.ops.%s" msgid "Bug" -msgstr "Lỗi Lầm" +msgstr "Lỗi" msgid "Report a bug with pre-filled version information" -msgstr "Báo Cáo một lỗi lầm bằng thông tin được điền sẵn" +msgstr "Báo cáo lỗi với thông tin phiên bản điền trước" msgid "Add-on Bug" -msgstr "Đồ Kèm Lỗi Lầm" +msgstr "Lỗi Trình Bổ Sung" msgid "Report a bug in an add-on" -msgstr "Báo cáo một lỗi lầm trong một đồ kèm" +msgstr "Báo cáo lỗi trong một trình bổ sung" msgid "Release Notes" -msgstr "Lời Dẫn Phát Hành" +msgstr "Nhật Ký Phát Hành" msgid "Read about what's new in this version of Blender" -msgstr "Đọc về đồ mới trong phiên bản Blender này" +msgstr "Đọc về những tính năng mới trong phiên bản Blender này" msgid "User Manual" -msgstr "Sổ Tay Người Dùng" +msgstr "Hướng Dẫn Sử Dụng cho Người Dùng" msgid "The reference manual for this version of Blender" -msgstr "Sổ tay cho phiên bản Blender này" +msgstr "Hướng dẫn sử dụng tham chiếu cho phiên bản Blender này" msgid "Python API Reference" -msgstr "Sổ Tay API Python" +msgstr "Tài Liệu Tham Chiếu API của Python" msgid "The API reference manual for this version of Blender" -msgstr "Sổ tay API cho phiên bàn Blender này" +msgstr "Hướng dẫn sử dụng tham chiếu API cho phiên bản Blender này" msgid "Development Fund" -msgstr "Qũy Đóng Góp Phát Triển" +msgstr "Quỹ Xây Dựng" msgid "The donation program to support maintenance and improvements" -msgstr "Chương trình góp tiền cho tài trợ bảo dưỡng và phát triển" +msgstr "Chương trình quyên góp để hỗ trợ bảo trì và cải tiến" msgid "blender.org" @@ -99457,65 +110017,74 @@ msgstr "Trang web chính thức của Blender" msgid "Credits" -msgstr "Tác Giả" +msgstr "Bảng Công Trạng" msgid "Lists committers to Blender's source code" -msgstr "Các danh sách người góp mã nguồn cho Blender" +msgstr "Liệt kê các thành viên có quyền chuyển giao thay đổi vào kho mã nguồn của Blender" + + +msgid "Fallback Tool" +msgstr "Công Cụ Dự Bị" msgid "Mesh(es)" -msgstr "Mạng Lưới" +msgstr "Các Khung Lưới" msgid "Curve(s)" -msgstr "Đường Cong" +msgstr "Các Đường Cong" msgid "Metaball(s)" -msgstr "Siêu Cầu" +msgstr "Các Siêu Cầu" msgid "Volume(s)" -msgstr "Thể Tích" +msgstr "Các Thể Tích" msgid "Grease Pencil(s)" -msgstr "Bút Sáp" +msgstr "Các Bút Chì Dầu" msgid "Armature(s)" -msgstr "Cốt" +msgstr "Các Khung Cốt" msgid "Lattice(s)" -msgstr "Lưới Rào" +msgstr "Các Lưới Rào" msgid "Light(s)" -msgstr "Đèn" +msgstr "Các Nguồn Ánh Sáng" msgid "Light Probe(s)" -msgstr "Quang Kế" +msgstr "Các Bộ Thăm Dò Ánh Sáng" msgid "Camera(s)" -msgstr "Máy Quay Phim" +msgstr "Các Máy Quay Phim" msgid "Speaker(s)" -msgstr "Loa" +msgstr "Các Loa" + + +msgctxt "Operator" +msgid "See What's New..." +msgstr "Xem Những Gì Là Mới..." msgctxt "Operator" msgid "Manual" -msgstr "Sổ Tay" +msgstr "Bản Hướng Dẫn Sử Dụng" msgctxt "Operator" msgid "Tutorials" -msgstr "Bài Dẫn" +msgstr "Trợ Lý Học Tập" msgctxt "Operator" @@ -99525,27 +110094,27 @@ msgstr "Hỗ Trợ" msgctxt "Operator" msgid "User Communities" -msgstr "Công Cộng Người Dùng" +msgstr "Cộng Đồng Người Dùng" msgid "Non boolean value found: %s[ ].%s" -msgstr "Tìm được giá trị không phải là bool: %s[ ].%s" +msgstr "Tìm thấy giá trị với kiểu dữ liệu phi lôgic (không phải kiểu bool): %s[ ].%s" msgid "Python evaluation failed: " -msgstr "Tính toán Python bị thất bại:" +msgstr "Tính toán của Python bị thất bại: " msgid "Failed to assign value: " -msgstr "Đặt giá trị bị thất bại:" +msgstr "Thất bại trong việc ấn định giá trị: " msgid "Strip(s)" -msgstr "Đoạn" +msgstr "Các Dải Phim" msgid "Object(s)" -msgstr "Vật Thể" +msgstr "Các Đối Tượng" msgid "Characters" @@ -99553,11 +110122,15 @@ msgstr "Ký Tự" msgid "Strip From" -msgstr "Đoạn Từ" +msgstr "Tước Bỏ Từ" msgid "Rename %d %s" -msgstr "Đặt lại tên %d %s" +msgstr "Đổi tên %d %s" + + +msgid "Version: %s" +msgstr "Phiên Bản: %s" msgid "Date: %s %s" @@ -99565,31 +110138,40 @@ msgstr "Ngày: %s %s" msgid "Hash: %s" -msgstr "Băm: %s" +msgstr "Mã Băm: %s" msgid "Branch: %s" -msgstr "Chi Nhánh: %s" +msgstr "Phân Nhánh: %s" msgid "Node(s)" -msgstr "Giao Điểm" +msgstr "Các Nút" msgid "Collection(s)" -msgstr "Bộ Sưu Tập" +msgstr "Các Bộ Sưu Tập" msgid "Invalid regular expression (find): " -msgstr "Biểu thức chính quy không hợp lệ (tìm kiếm): " +msgstr "Biểu thức chính quy không hợp lệ (lùng tìm): " + + +msgctxt "Operator" +msgid "Load Blender %d.%d Settings" +msgstr "Tải các Cài Đặt Blender %d.%d" + + +msgid "Windowing Environment: %s" +msgstr "Môi Trường Cửa Sổ: %s" msgid "Type \"%s\" can not be found" -msgstr "Không tìm được loại \"%s\"" +msgstr "Không thể tìm thấy kiểu dữ liệu \"%s\"" msgid "Material(s)" -msgstr "Vật Liệu" +msgstr "Các Nguyên Vật Liệu" msgid "Invalid regular expression (replace): " @@ -99597,15 +110179,27 @@ msgstr "Biểu thức chính quy không hợp lệ (thay thế): " msgid "Bone(s)" -msgstr "Xương" +msgstr "Các Xương" + + +msgid "Action(s)" +msgstr "(Các) Hành Động" msgid "Edit Bone(s)" -msgstr "Biên Tập Xương" +msgstr "Các Xương Biên Soạn" msgid "Unknown" -msgstr "Lạ" +msgstr "Chưa Biết" + + +msgid "Switch Stereo View" +msgstr "Chuyển Chế Độ Xem Lập Thể" + + +msgid "Mix Vector" +msgstr "Hệ Số Hòa Trộn" msgid "Calculation Range" @@ -99614,19 +110208,19 @@ msgstr "Phạm Vi Tính Toán" msgctxt "Operator" msgid "Update All Paths" -msgstr "Nâng Cấp Hết Đường Dẫn" +msgstr "Cập Nhật Toàn Bộ các Đường Dẫn" msgid "Frame Numbers" -msgstr "Số Bức Ảnh" +msgstr "Số Khung Hình" msgid "Keyframe Numbers" -msgstr "Số Bức Ảnh Mẫu" +msgstr "Số Khung Khóa" msgid "Frame Range Before" -msgstr "Phạm Vi Bức Ảnh Trước" +msgstr "Phạm Vi Khung Hình Đứng Trước" msgid "After" @@ -99634,38 +110228,38 @@ msgstr "Sau" msgid "Cached Range" -msgstr "Phạm Vi Được Chứa" +msgstr "Phạm Vi lưu trong Bộ Nhớ Đệm" msgctxt "Operator" msgid "Update Path" -msgstr "Nâng Cấp Đường Dẫn" +msgstr "Cập Nhật Đường Dẫn" msgid "Nothing to show yet..." -msgstr "Không có gì để hiện..." +msgstr "Chưa có gì để hiển thị cả..." msgctxt "Operator" msgid "Calculate..." -msgstr "Tính..." +msgstr "Tính Toán..." msgid "+ Non-Grouped Keyframes" -msgstr "+ Mẫu Hóa Chưa-Nhóm Lại" +msgstr "+ Khung Khóa Ngoại Nhóm" msgid "Frame Range Start" -msgstr "Đầu Phạm Vi Bức Ảnh" +msgstr "Phạm Vi Khung Hình Bắt Đầu" msgid "Collection Mask" -msgstr "Mặt Nạ Sưu Tập" +msgstr "Chắn Lọc Bộ Sưu Tập" msgctxt "Operator" msgid "Add Object Constraint" -msgstr "Thêm Ràng Buộc Vật Thể" +msgstr "Thêm Ràng Buộc Đối Tượng" msgctxt "Operator" @@ -99675,31 +110269,40 @@ msgstr "Thêm Ràng Buộc Xương" msgctxt "Operator" msgid "Animate Path" -msgstr "Đường Hoạt Hình" +msgstr "Hoạt Họa Đường Dẫn" msgid "Order" -msgstr "Thứ Tự" +msgstr "Theo Thứ Tự" + + +msgctxt "Constraint" +msgid "Mix" +msgstr "Hòa Trộn" msgid "Clamp Region" -msgstr "Vùng Kẹp Lại" +msgstr "Hạn Định Vùng" msgid "Volume Min" -msgstr "Thể Tích Cực Tiểu" +msgstr "Thể Tích Tối Thiểu" msgid "Min/Max" -msgstr "Cực Tiểu/Đại" +msgstr "Tối Thiểu/Tối Đa" msgid "Extrapolate" -msgstr "Suy Ngoại" +msgstr "Ngoại Suy" msgid "Rotation Range" -msgstr "Phạm Vi Xoay" +msgstr "Phạm Vi Xoay Chiều" + + +msgid "Blender 2.6 doesn't support Python constraints yet" +msgstr "Blender 2.6 chưa hỗ trợ các ràng buộc Python nhé" msgctxt "Operator" @@ -99708,7 +110311,7 @@ msgstr "Thêm Xương Mục Tiêu" msgid "Z Min" -msgstr "Cực Tiểu Z" +msgstr "Tối Thiểu Z" msgid "X Source Axis" @@ -99724,19 +110327,23 @@ msgstr "Trục Nguồn Z" msgid "Align to Normal" -msgstr "Sắp Xếp đến Pháp Tuyến" +msgstr "Căn Chỉnh theo Pháp Tuyến" msgid "Pivot Offset" -msgstr "Dịch Điểm Tựa" +msgstr "Dịch Chuyển của Điểm Tựa" msgid "No target bones added" -msgstr "Không được thêm xương mục tiêu nào" +msgstr "Không có xương mục tiêu nào được thêm vào cả" msgid "Weight Position" -msgstr "Vị Trí Quyền Lượng" +msgstr "Trọng Lượng Vị Trí" + + +msgid "Bone Colors" +msgstr "Các Màu Xương" msgid "Axes" @@ -99745,23 +110352,23 @@ msgstr "Trục" msgctxt "Operator" msgid "Remove" -msgstr "Xóa" +msgstr "Xóa/Loại Bỏ" msgid "Damping Max" -msgstr "Tắt Dần Cực Đại" +msgstr "Giảm Chấn Tối Đa" msgid "Damping Epsilon" -msgstr "Epxilon Tắt Dần" +msgstr "Giảm Chấn Epsilon" msgid "Steps Min" -msgstr "Bước Tối Thiểu" +msgstr "Số Bước Tối Thiểu" msgid "Display Size X" -msgstr "Khổ Màn X" +msgstr "Kích Thước Hiển Thị X" msgid "Curve In X" @@ -99772,16 +110379,34 @@ msgid "Curve Out X" msgstr "Cong Ra X" +msgctxt "Armature" +msgid "Out" +msgstr "Ra" + + msgid "Start Handle" -msgstr "Tay Cầm Đầu" +msgstr "Tay Cầm Khởi Đầu" + + +msgctxt "Armature" +msgid "Ease" +msgstr "Chậm Rãi" msgid "End Handle" -msgstr "Tay Cầm Cuối" +msgstr "Tay Cầm Kết Thúc" + + +msgid "Bone Color" +msgstr "Màu Xương" + + +msgid "Pose Bone Color" +msgstr "Màu Xương Tư Thế" msgid "Lock IK X" -msgstr "Khóa X IK" +msgstr "Khóa IK X" msgid "Stiffness X" @@ -99789,19 +110414,23 @@ msgstr "Độ Cứng X" msgid "Envelope Distance" -msgstr "Khoảng Cách Bao Bì" +msgstr "Khoảng Cách của Phong Bao" msgid "Envelope Weight" -msgstr "Quyền Lượng Bao Bì" +msgstr "Trọng Lượng Phong Bao" msgid "Envelope Multiply" -msgstr "Nhân Bao Bì" +msgstr "Nhân Phong Bao" msgid "Radius Head" -msgstr "Bán Kính Đầu" +msgstr "Bán Kính của Đầu" + + +msgid "Not assigned to any bone collection." +msgstr "Chưa được ấn định cho bất kỳ bộ sưu tập xương nào cả." msgid "Override Transform" @@ -99809,24 +110438,24 @@ msgstr "Vượt Quyền Biến Hóa" msgid "Control Rotation" -msgstr "Điều Khiển Xoay" +msgstr "Điều Khiển Độ Xoay" msgid "Focus on Object" -msgstr "Tập Trung Đến Vật Thể" +msgstr "Tập Trung vào Đối Tượng" msgctxt "Operator" msgid "Add Image" -msgstr "Thêm Ảnh" +msgstr "Thêm Hình Ảnh" msgid "Passepartout" -msgstr "Hiện Lớp Che Tối" +msgstr "Khung Cắt Cảnh" msgid "Golden" -msgstr "Vàng" +msgstr "Tỷ Lệ Vàng" msgid "Triangle A" @@ -99838,15 +110467,15 @@ msgstr "Tam Giác B" msgid "Harmony" -msgstr "Điều Hòa" +msgstr "Hài Hoà" msgid "Pole Merge Angle Start" -msgstr "Góc Bắt Đầu Gồm Cột" +msgstr "Góc Độ Khởi Đầu Hợp Nhất về Cực" msgid "Focus on Bone" -msgstr "Tập Trung trên Xương" +msgstr "Tập Trung vào Xương" msgid "Not Set" @@ -99854,15 +110483,15 @@ msgstr "Chưa Đặt" msgid "Views Format:" -msgstr "Định Dạng Màn Chiếu:" +msgstr "Hình Thức Quan Sát:" msgid "Latitude Min" -msgstr "Vĩ Độ Cực Tiểu" +msgstr "Vĩ Tuyến Tối Thiểu" msgid "Longitude Min" -msgstr "Kinh Độ Cực Tiểu" +msgstr "Kinh Tuyến Tối Thiểu" msgid "K0" @@ -99870,19 +110499,19 @@ msgstr "K0" msgid "Resolution Preview U" -msgstr "Độ Phân Giải Dự Khán U" +msgstr "Độ Phân Giải Xem Trước U" msgid "Render U" -msgstr "Kết xuất U" +msgstr "Kết Xuất U" msgid "Factor Start" -msgstr "Hệ Số Bắt Đầu" +msgstr "Hệ Số Khởi Đầu" msgid "Mapping Start" -msgstr "Bắt Đầu Ánh Xạ" +msgstr "Ánh Xạ Khởi Đầu" msgid "Bold & Italic" @@ -99890,54 +110519,74 @@ msgstr "Đậm & Nghiêng" msgid "Small Caps Scale" -msgstr "Phóng To Chữ Hoa Nhỏ" +msgstr "Tỷ Lệ Chữ In Hoa Nhỏ" msgid "Character Spacing" -msgstr "Cách Giữa Ký Tự" +msgstr "Phân Khoảng của Ký Tự" msgid "Word Spacing" -msgstr "Cách Giữa Từ" +msgstr "Phân Khoảng giữa Từ" msgid "Line Spacing" -msgstr "Cách Giữa Nét" +msgstr "Phân Khoảng của Dòng" msgid "Offset X" -msgstr "Dịch X" +msgstr "Dịch Chuyển X" msgid "Endpoint" -msgstr "Điểm Đỉnh" +msgstr "Điểm Kết" msgid "Interpolation Tilt" -msgstr "Độ Ngiêng Suy Nội" +msgstr "Nội Suy Xoay Nghiêng" + + +msgctxt "Operator" +msgid "Bold" +msgstr "In Đậm" + + +msgctxt "Operator" +msgid "Italic" +msgstr "In nghiêng" + + +msgctxt "Operator" +msgid "Underline" +msgstr "Gạch Chân" + + +msgctxt "Operator" +msgid "Small Caps" +msgstr "Chữ Hoa Nhỏ" msgctxt "Operator" msgid "Custom..." -msgstr "Tùy Chọn..." +msgstr "Tùy Chỉnh..." msgid "Only Axis Aligned" -msgstr "Chỉ Sắp Xếp Với Trục" +msgstr "Duy Thẳng Hàng theo Trục" msgctxt "Operator" msgid "Lock All" -msgstr "Khóa Hết" +msgstr "Khóa Toàn Bộ" msgctxt "Operator" msgid "Unlock All" -msgstr "Mở Khóa Hết" +msgstr "Mở Khóa Toàn Bộ" msgid "Autolock Inactive Layers" -msgstr "Tự Động Khóa Lớp Không Hoạt Động" +msgstr "Tự Động Khóa Tầng Bất Hoạt" msgid "Before" @@ -99945,189 +110594,211 @@ msgstr "Trước" msgid "View in Render" -msgstr "Hiển thị trong Kết Xuất" +msgstr "Quan Sát trong Kết Xuất" msgid "Thickness Scale" -msgstr "Phóng To Bề Dày" +msgstr "Tỷ Lệ Độ Dày" msgctxt "Operator" msgid "Duplicate Empty Keyframes" -msgstr "Sao Chép Bức Ảnh Mẫu Trống Rỗng" +msgstr "Nhân Đôi các Khung Khóa Trống" msgctxt "Operator" msgid "Hide Others" -msgstr "Ẩn Khác" +msgstr "Ẩn Giấu những cái Khác" msgctxt "Operator" msgid "Merge All" -msgstr "Gồm Hết" +msgstr "Hợp Nhất Toàn Bộ" msgctxt "Operator" msgid "Copy Layer to Selected" -msgstr "Chép Lớp Đến Được Chọn" +msgstr "Sao Chép Tầng Lớp sang cái Đã Chọn" msgctxt "Operator" msgid "Copy All Layers to Selected" -msgstr "Chép Hết Lớp đến Được Chọn" +msgstr "Sao Chép Toàn Bộ các Tầng Lớp sang cái Đã Chọn" msgctxt "Operator" msgid "New Layer" -msgstr "Lớp Mới" +msgstr "Tầng Lớp Mới" msgctxt "Operator" msgid "Assign to Active Group" -msgstr "Chỉ Định Vào Nhóm Hoạt Động" +msgstr "Ấn Định vào Nhóm đang Hoạt Động" msgctxt "Operator" msgid "Remove from Active Group" -msgstr "Xóa Từ Nhóm Hoạt Động" +msgstr "Xóa khỏi Nhóm đang Hoạt Động" msgctxt "Operator" msgid "Select Points" -msgstr "Chọn Điểm" +msgstr "Chọn các Điểm" msgctxt "Operator" msgid "Deselect Points" -msgstr "Thả Điểm" +msgstr "Hủy Chọn các Điểm" msgid "Keyframes Before" -msgstr "Các Bức Ảnh Mẫu Trước" +msgstr "Số Khung Khóa Đứng Trước" msgid "Keyframes After" -msgstr "Các Bức Ảnh Mẫu Sau" +msgstr "Số Khung Khóa Đứng Sau" msgctxt "Operator" msgid "Remove Active Group" -msgstr "Xóa Nhóm Hoạt Động" +msgstr "Xóa Nhóm đang Hoạt Động" msgctxt "Operator" msgid "Remove All Groups" -msgstr "Xóa Hết Nhóm" +msgstr "Xóa Toàn Bộ các Nhóm" + + +msgctxt "Operator" +msgid "Add Group" +msgstr "Thêm Nhóm" msgid "Interpolation U" -msgstr "Suy Nội U" +msgstr "Nội Suy U" + + +msgid "Shadow Softness" +msgstr "Độ Mềm Mại của Bóng Tối" + + +msgid "Trace Distance" +msgstr "Khoảng Cách Dò Tia" msgid "Clipping Start" -msgstr "Bắt Đầu Cắt" +msgstr "Khởi Điểm của vùng Cắt Xén" msgid "Clipping Offset" -msgstr "Dịch Cắt" +msgstr "Dịch Chuyển của vùng Cắt Xén" + + +msgid "Capture Distance" +msgstr "Khoảng Cách Nắm Bắt" msgid "Bleed Bias" -msgstr "Thành Kiến Tràn" +msgstr "Thiên Lệch Rò Rỉ" msgid "Arrow Size" -msgstr "Kích Cỡ Mũi Tên" +msgstr "Kích Thước Mũi Tên" msgctxt "Operator" msgid "Lock Invert All" -msgstr "Đảo Nghịch Khóa Hết" +msgstr "Đảo Nghịch Khóa Toàn Bộ" msgctxt "Operator" msgid "Delete All Shape Keys" -msgstr "Xóa Hết Mẫu Dạng " +msgstr "Xóa Toàn Bộ các Hình Mẫu" msgctxt "Operator" msgid "Apply All Shape Keys" -msgstr "Áp Dụng Hết Mẫu Dạng" +msgstr "Áp Dụng Toàn Bộ các Hình Mẫu" msgctxt "Operator" msgid "Sort by Name" -msgstr "Sắp Xếp Bằng Tên" +msgstr "Sắp Xếp theo Tên" msgctxt "Operator" msgid "Sort by Bone Hierarchy" -msgstr "Sắp Xếp tùy Tầng Bậc Xương" +msgstr "Sắp Xếp theo Thứ Bậc của Xương" msgctxt "Operator" msgid "Mirror Vertex Group (Topology)" -msgstr "Nhóm Đỉnh Gương (Hình Dạng Học)" +msgstr "Phản Chiếu Đối Xứng Nhóm Điểm Đỉnh (Cấu Trúc Liên Kết)" msgctxt "Operator" msgid "Remove from All Groups" -msgstr "Xoá Từ Hết Nhóm" +msgstr "Xóa khỏi toàn bộ các nhóm" msgctxt "Operator" msgid "Clear Active Group" -msgstr "Xóa Nhóm Hoạt Động" +msgstr "Xóa Nhóm đang Hoạt Động" msgctxt "Operator" msgid "Delete All Unlocked Groups" -msgstr "Xóa Hết Nhóm Mở Khóa" +msgstr "Xóa Toàn bộ các Nhóm Không Khóa" msgctxt "Operator" msgid "Delete All Groups" -msgstr "Xóa Hết Nhóm" +msgstr "Xóa Toàn Bộ các Nhóm" msgctxt "Operator" msgid "New Shape from Mix" -msgstr "Hình Dạng Mới Từ Pha Trộn" +msgstr "Hình Dạng Mới Từ Hòa Trộn" msgctxt "Operator" msgid "Mirror Shape Key (Topology)" -msgstr "Mẫu Dạng Gương Lại (Hình Dạng Học)" +msgstr "Phản Chiếu Đối Xứng Hình Mẫu (Cấu Trúc Liên Kết)" msgctxt "Operator" msgid "Move to Top" -msgstr "Truyền Đến Trên Cùng" +msgstr "Chuyển Lên Đỉnh" msgctxt "Operator" msgid "Move to Bottom" -msgstr "Truyền Đến Dưới Cùng" +msgstr "Chuyển Xuống Đáy" msgid "Preserve" -msgstr "Giữ Nguyên" +msgstr "Bảo Tồn" msgid "Name collisions: " -msgstr "Các tên giống: " +msgstr "Tên trùng lặp: " msgid "Resolution Viewport" -msgstr "Độ Phân Giải Màn Chiếu" +msgstr "Độ Phân Giải của Cổng Nhìn" msgid "Influence Threshold" -msgstr "Ngưỡng Sự Ảnh Hưởng" +msgstr "Giới Hạn Tác Động" msgid "Update on Edit" -msgstr "Nâng cấp khi Biên Tập" +msgstr "Cập Nhật khi Biên Soạn" + + +msgctxt "Operator" +msgid "Search..." +msgstr "Tìm Kiếm..." msgid "Distance Reference" @@ -100143,40 +110814,40 @@ msgstr "Chi Tiết" msgid "Failed to load volume:" -msgstr "Nhập thể tích bị thất bại:" +msgstr "Thất bại trong việc nạp thể tích:" msgid "Negation" -msgstr "Trừ Hóa" +msgstr "Phản Định" msgid "Combination" -msgstr "Phối Hớp" +msgstr "Kết Hợp" msgid "Condition" -msgstr "Trạng Thái" +msgstr "Điều Kiện" msgid "Line Set Collection" -msgstr "Sưu Tập Tập Đường" +msgstr "Bộ Sưu Tập Bộ Đường Nét" msgid "Base Transparency" -msgstr "Trong Suốt Cơ Sở" +msgstr "Độ Trong Cơ Sở" msgid "Base Thickness" -msgstr "Chiều Dày Cơ Sở" +msgstr "Độ Dày Cơ Sở" msgid "Spacing Along Stroke" -msgstr "Cách Giữa Theo Nét" +msgstr "Phân Nhịp Dọc theo Nét Vẽ" msgctxt "Operator" msgid "Go to Linestyle Textures Properties" -msgstr "Đi Đến Đặc Tính Chất Liệu Phong Cách Nét" +msgstr "Tính Chất về Chất Liệu Phong cách Đường Nét" msgid "Priority" @@ -100184,19 +110855,19 @@ msgstr "Ưu Tiên" msgid "Select by" -msgstr "Chọn bằng" +msgstr "Chọn theo" msgid "Image Border" -msgstr "Ranh Giới Ảnh" +msgstr "Ranh Giới Hình Ảnh" msgid "Angle Min" -msgstr "Góc Cực Tiểu" +msgstr "Góc Độ Tối Thiểu" msgid "Curvature Min" -msgstr "Độ Cong Cực Tiểu" +msgstr "Tối Thiểu của Đường Cong" msgid "Draw:" @@ -100204,51 +110875,51 @@ msgstr "Vẽ:" msgid "Stroke Placement:" -msgstr "Vị Trí Đặt Nét:" +msgstr "Phương Pháp Đặt Nét Vẽ:" msgctxt "Operator" msgid "Selection to Grid" -msgstr "Sự Lựa Chọn Đến Đồ Thị" +msgstr "Lựa Chọn về Khung Lưới Đồ Thị" msgctxt "Operator" msgid "Cursor to Selected" -msgstr "Con Trỏ Đến Vật Thể Chọn" +msgstr "Con Trỏ về chỗ được Chọn" msgctxt "Operator" msgid "Cursor to World Origin" -msgstr "Con Trỏ Đến Gốc Thế Giới" +msgstr "Con Trỏ về Tọa Độ Gốc Thế Giới" msgctxt "Operator" msgid "Cursor to Grid" -msgstr "Con Trỏ Đến Đồ Thị" +msgstr "Con Trỏ về Khung Lưới Đồ Thị" msgctxt "Operator" msgid "Delete Active Keyframes (All Layers)" -msgstr "Xóa Bức Ảnh Mẫu Hoạt Động (Tất Cả Lớp)" +msgstr "Xóa các Khung Khóa đang Hoạt Động (Toàn Bộ các Tầng Lớp)" msgctxt "Operator" msgid "Delete Loose Points" -msgstr "Xoá Điểm Rời Ra" +msgstr "Xóa các Điểm Rời Rạc" msgctxt "Operator" msgid "Delete Duplicate Frames" -msgstr "Xoá Bức Ảnh Được Sao Chép" +msgstr "Xóa Khung Hình Trùng Lặp" msgctxt "Operator" msgid "Recalculate Geometry" -msgstr "Tính Lại Hình Dạng" +msgstr "Tính Toán Lại Hình Học" msgid "Show Only on Keyframed" -msgstr "Chỉ Hiện trên Có Bức Ảnh Mẫu" +msgstr "Duy Hiển Thị Nếu đã Khung Khóa Hóa" msgctxt "Operator" @@ -100262,27 +110933,27 @@ msgstr "Hiển Thị Con Trỏ" msgctxt "Operator" msgid "Selection to Cursor" -msgstr "Sự Lựa Chọn Đến Con Trỏ" +msgstr "Lựa Chọn đến Con Trỏ" msgctxt "Operator" msgid "Selection to Cursor (Keep Offset)" -msgstr "Sự Lựa Chọn đến Con Trỏ (Giữ Địch)" +msgstr "Lựa Chọn đến Con Trỏ (Duy Trì Dịch Chuyển)" msgctxt "Operator" msgid "Delete Active Keyframe (Active Layer)" -msgstr "Xóa Bức Ảnh Mẫu Hoạt Động (Lớp Hoạt Động)" +msgstr "Xóa Khung Khóa đang Hoạt Động (Tầng Lớp đang Hoạt Động)" msgctxt "Operator" msgid "Boundary Strokes" -msgstr "Nét Ranh Giới" +msgstr "Nét Viền Ranh Giới" msgctxt "Operator" msgid "Boundary Strokes all Frames" -msgstr "Nét Ranh Giới tất cả Bức Ảnh" +msgstr "Nét Viền Ranh Giới toàn bộ các Khung Hình" msgid "Data Source:" @@ -100290,19 +110961,19 @@ msgstr "Nguồn Dữ Liệu:" msgid "No annotation source" -msgstr "Không có nguồn lời ghi chú" +msgstr "Không có đối tượng nguồn để chú thích" msgid "No layers to add" -msgstr "Không có lớp để thêm" +msgstr "Không có tầng lớp nào để cho thêm vào cả" msgid "Channel Colors are disabled in Animation preferences" -msgstr "Màu kênh đã bị tắt trong tùy chọn Hoạt Hình" +msgstr "Các màu của kênh đã bị vô hiệu hóa (tắt đi) trong cài đặt sở thích về Hoạt Họa" msgid "Show Fill Color While Drawing" -msgstr "Hiện Màu Tô Đầy Khi Đang Vẽ" +msgstr "Hiển Thị Màu Tô Phủ Trong Khi Vẽ" msgid "Cursor Color" @@ -100310,7 +110981,7 @@ msgstr "Màu Con Trỏ" msgid "Lock Frame" -msgstr "Khóa Bức Ảnh" +msgstr "Khóa Khung Hình Lại" msgid "Inverse Color" @@ -100322,21 +110993,21 @@ msgstr "Không Khóa" msgid "Frame: %d (%s)" -msgstr "Bức Ảnh: %d (%s)" +msgstr "Khung Hình: %d (%s)" msgid "Stroke Color" -msgstr "Màu Nét" +msgstr "Màu Nét Vẽ" msgctxt "Operator" msgid "Re-Key Shape Points" -msgstr "Làm Lại Điểm Mẫu Dạng" +msgstr "Khóa Hóa Lại các Điểm của Hình Mẫu" msgctxt "Operator" msgid "Reset Feather Animation" -msgstr "Đặt Lại Hoạt Hình Phe Phẩy" +msgstr "Đặt Lại Hoạt Họa của Mép Nhòe" msgid "Parent:" @@ -100352,7 +111023,7 @@ msgstr "Mẫu Cong:" msgid "Parenting:" -msgstr "Làm Phụ Huynh:" +msgstr "Phụ Huynh Hóa:" msgctxt "Operator" @@ -100362,45 +111033,45 @@ msgstr "Phụ Huynh" msgctxt "Operator" msgid "Clear" -msgstr "Xóa" +msgstr "Xóa/Dọn Sạch" msgid "Animation:" -msgstr "Hoạt Hình:" +msgstr "Hoạt Họa:" msgctxt "Operator" msgid "Insert Key" -msgstr "Chèn Bức Ảnh Mẫu" +msgstr "Chèn Hình Mẫu" msgctxt "Operator" msgid "Clear Key" -msgstr "Màu Trong Suốt" +msgstr "Xóa Hình Mẫu" msgctxt "Operator" msgid "Square" -msgstr "Vuông" +msgstr "Vuông/Hình Vuông" msgid "Holes" -msgstr "Lỗ" +msgstr "Lỗ Hổng" msgctxt "Operator" msgid "Scale Feather" -msgstr "Phóng To Phe Phẩy" +msgstr "Đổi Tỷ Lệ Mép Nhòe" msgctxt "Operator" msgid "Hide Unselected" -msgstr "Ẩn Chưa Được Chọn" +msgstr "Ẩn Giấu cái Không được Chọn" msgctxt "Operator" msgid "All" -msgstr "Hết" +msgstr "Toàn Bộ" msgctxt "Operator" @@ -100414,77 +111085,87 @@ msgstr "Đảo Nghịch" msgid "Intersection" -msgstr "Vùng Giao Cắt" +msgstr "Giao Cắt" msgid "Material Mask" -msgstr "Mặt Nạ Vật Liệu" +msgstr "Chắn Lọc Nguyên Vật Liệu" msgid "Custom Occlusion" -msgstr "Che Khuất Tùy Chọn" +msgstr "Tùy Chỉnh Tính Hấp Thụ Quang Xạ" msgctxt "Operator" msgid "Lock Unselected" -msgstr "Khóa Không Được Chọn" +msgstr "Khóa cái Không Chọn" msgctxt "Operator" msgid "Lock Unused" -msgstr "Khóa Không Được Dùng" +msgstr "Khóa cái Không Sử Dụng" msgctxt "Operator" msgid "Convert Materials to Color Attribute" -msgstr "Biến Đổi Vật Liệu sang Đặc Điểm Màu" +msgstr "Chuyển Đổi Nguyên Vật Liệu sang Thuộc Tính Màu" msgctxt "Operator" msgid "Extract Palette from Color Attribute" -msgstr "Rút Bảng Màu từ Đặc Điểm Màu" +msgstr "Trích Xuất Bảng Màu từ Thuộc Tính Màu" msgctxt "Operator" msgid "Merge Similar" -msgstr "Gồm Giống" +msgstr "Hợp Nhất cái Tương Tự" msgctxt "Operator" msgid "Copy All Materials to Selected" -msgstr "Chép Hết Vật Liệu đến Được Chọn" +msgstr "Sao Chép Toàn Bộ các Nguyên Vật Liệu sang cái Đã Chọn" msgid "Flip Colors" -msgstr "Lật Màu" +msgstr "Đảo Màu" msgid "Clip Image" -msgstr "Cắt Ảnh" +msgstr "Không Nhắc Lại Hình ảnh" msgid "Tracking Axis" -msgstr "Trục Đuổi Theo" +msgstr "Trục Theo Dõi" msgid "Override Crease" -msgstr "Vượt Quyền Nhăn" +msgstr "Vượt Quyền Nếp Gấp" msgid "All Edges" -msgstr "Hết Cạnh" +msgstr "Toàn Bộ các Cạnh" msgid "Align to Vertex Normal" -msgstr "Sắp Xếp đến Pháp Tuyến Đỉnh" +msgstr "Căn Chỉnh theo Pháp Tuyến Điểm Đỉnh" msgid "Show Instancer" -msgstr "Hiện Bộ Thực Thể" +msgstr "Hiển Thị Thực Thể Hóa Viên" + + +msgctxt "Time" +msgid "Old" +msgstr "Cũ" + + +msgctxt "Time" +msgid "New" +msgstr "Mới" msgid "Date" -msgstr "Ngày Tháng" +msgstr "Ngày" msgid "Render Time" @@ -100492,95 +111173,104 @@ msgstr "Thời Gian Kết Xuất" msgid "Hostname" -msgstr "Tên Chủ" +msgstr "Tên Máy" msgid "Include Labels" -msgstr "Gồm Nhãn" +msgstr "Bao Gồm Nhãn Hiệu" msgid "Saving" -msgstr "Đang Lưu" +msgstr "Lưu" msgid "Max B-frames" -msgstr "Bức ảnh-B tối đa" +msgstr "Số Tối Đa Khung Hình-B" msgid "Strip Name" -msgstr "Tên Đoạn" +msgstr "Tên Dải" msgid "Buffer" -msgstr "Đệm" +msgstr "Bộ Đệm" msgid "Custom (%.4g fps)" -msgstr "Tùy Chọn (%.4g bức ảnh/giây)" +msgstr "Tùy chọn (%.4g khung hình/giây)" msgid "%.4g fps" -msgstr "%.4g bức ảnh/giây" +msgstr "%.4g khung hình/giây" msgid "Mask Mapping" -msgstr "Ánh Xạ Mặt Nạ" +msgstr "Ánh Xạ Màn Chắn Lọc" msgid "Pressure Masking" -msgstr "Mặt Nạ Áp Suất" +msgstr "Chắn Lọc bằng Áp Lực" msgid "Falloff Opacity" -msgstr "Độ Đục Của Sự Giảm" +msgstr "Độ Đục Suy Giảm Dần" msgid "Mesh Boundary" -msgstr "Ranh Giới Mạng Lưới" +msgstr "Ranh Giới Khung Lưới" msgid "Face Sets Boundary" -msgstr "Ranh Giới Tập Hợp Mặt" +msgstr "Ranh Giới Mặt Ấn Định" + + +msgid "Cavity (inverted)" +msgstr "Khe Hốc (Đảo Ngược)" msgid "Sample Bias" -msgstr "Thành Kiến Mẫu Vật" +msgstr "Mức Thiên Lệch của Mẫu Vật" msgid "Edge to Edge" -msgstr "Cạnh đến Cạnh" +msgstr "Cạnh Nọ đến Cạnh Kia" msgid "Texture Opacity" -msgstr "Độ Đục Chất Liệu" +msgstr "Độ Đục của Chất Liệu" msgid "Mask Texture Opacity" -msgstr "Độ Đục Chất Liệu Mặt Nạ" +msgstr "Độ Đục của Chất Liệu Màn Chắn Lọc" + + +msgctxt "Operator" +msgid "Create Mask" +msgstr "Kiến Tạo Màn Chắn Lọc" msgid "Thickness Profile" -msgstr "Mặt Cắt Cho Độ Dày" +msgstr "Mặt Cắt của Độ Dày" msgid "Use Thickness Profile" -msgstr "Dùng Mặt Cắt Cho Độ Dày" +msgstr "Sử Dụng Mặt Cắt cho Độ Dày" msgid "Source Clone Slot" -msgstr "Khe Bản Sao Nguồn" +msgstr "Khe Nguồn Rập Khuôn" msgid "Source Clone Image" -msgstr "Ảnh Bản Sao Nguồn" +msgstr "Hình Ảnh của Nguồn Rập Khuôn" msgid "Source Clone UV Map" -msgstr "Bản Đồ UV Bản Sao Nguồn" +msgstr "Ánh Xạ UV của Nguồn Rập Khuôn" msgid "Gradient Mapping" -msgstr "AÁnh Xạ Chuyển Sắc" +msgstr "Ánh Xạ Dốc Màu" msgid "Point Count" @@ -100588,57 +111278,57 @@ msgstr "Số Lượng Điểm" msgid "Mask Value" -msgstr "Giá Trị Mặt Nạ" +msgstr "Giá Trị Màn Chắn Lọc" msgid "Caps Type" -msgstr "Loại Nắp" +msgstr "Kiểu Nắp Đầu" msgid "CCW" -msgstr "Nghích Hướng Kim Đồng Hồ" +msgstr "Counter-Clock-Wise: Ngược Chiều Kim Đồng Hồ" msgid "CW" -msgstr "Hướng Kim Đồng Hồ" +msgstr "Thuận Chiều KĐH" msgid "Invert to Fill" -msgstr "Đảo Nghịch để Đầy" +msgstr "Lật Đảo để Lấp Đầy" msgid "Invert to Scrape" -msgstr "Đảo Nghịch để Cào" +msgstr "Lật Đảo để Cạo" msgctxt "Operator" msgid "Copy Active to Selected Objects" -msgstr "Chép Hoạt Động Đến Vật Thể Được Chọn" +msgstr "Sao Chép cái đang Hoạt Động sang Đối Tượng được Chọn" msgctxt "Operator" msgid "Copy All to Selected Objects" -msgstr "Chép Hết Đến Các Vật Thể Được Chọn" +msgstr "Sao Chép Toàn Bộ sang các Đối Tượng được Chọn" msgid "Quality Steps" -msgstr "Bước Chất Lượng" +msgstr "Số Bước về Chất Lượng" msgid "Pin Goal Strength" -msgstr "Sức Mục Đích Đinh:" +msgstr "Sức Mạnh của Mục Tiêu Đính Ghim" msgid "Air Drag" -msgstr "Lực Không Khí Cản" +msgstr "Lực Cản Không Khí" msgid "Density Target" -msgstr "Mục Tiêu Tỉ Trọng" +msgstr "Mật Độ Đích" msgid "Density Strength" -msgstr "Sức Tỉ Trọng" +msgstr "Độ Dày Đặc" msgid "Tangent Phase" @@ -100650,7 +111340,7 @@ msgstr "Ngẫu Nhiên Hóa Pha" msgid "Render As" -msgstr "Kết Xuất Như" +msgstr "Kết Xuất Là" msgid "Parent Particles" @@ -100662,15 +111352,15 @@ msgstr "Tọa Độ Toàn Cầu" msgid "Object Rotation" -msgstr "Xoay Vật Thể" +msgstr "Xoay Chiều của Đối Tượng" msgid "Object Scale" -msgstr "Phóng To Vật Thể" +msgstr "Tỷ Lệ của Đối Tượng" msgid "Display Amount" -msgstr "Số Lượng Hiển Thị" +msgstr "Lượng Hiển Thị" msgid "Render Amount" @@ -100678,60 +111368,60 @@ msgstr "Số Lượng Kết Xuất" msgid "Kink Type" -msgstr "Loại Thắt Nút" +msgstr "Kiểu Xoắn Vặn" msgid "Effector Amount" -msgstr "Mức Đồ Hiệu Ứng" +msgstr "Số Lượng Hiệu Ứng Viên" msgid "Roughness End" -msgstr "Độ nhám Đỉnh" +msgstr "Độ Ráp/Rối ở Đỉnh" msgid "Strand Shape" -msgstr "Hình Dạng Sợi Tóc" +msgstr "Hình Dạng Sợi" msgid "Diameter Root" -msgstr "Đường Kính Rễ" +msgstr "Đường Kính của Chân/Gốc" msgctxt "Operator" msgid "Convert to Curves" -msgstr "Biến Đổi sang Đường Cong" +msgstr "Chuyển Đổi thành Đường Cong" msgid "Lifetime Randomness" -msgstr "Sự Ngẫu Nhiên Tuổi Thọ" +msgstr "Ngẫu Nhiên Hóa Tuổi Thọ" msgid "Hair dynamics disabled" -msgstr "Động lý tóc được tắt" +msgstr "Năng động hóa tóc đã bị tắt" msgid "Multiply Mass with Size" -msgstr "Nhân Khối Lượng Với Kích Cỡ" +msgstr "Nhân Khối Lượng với Kích Thước" msgid "Show Emitter" -msgstr "Hiện Đồ Phát" +msgstr "Hiển Thị Phần Tử Phát Sinh" msgid "Fade Distance" -msgstr "Khoảng Cách Phai" +msgstr "Khoảng Cách Mờ Dần" msgid "Strand Steps" -msgstr "Bước Sợi" +msgstr "Số Bước của Sợi" msgid "Randomize Size" -msgstr "Nhiên Hóa Bước" +msgstr "Ngẫu Nhiên Hóa Kích Thước" msgid "Parting not available with virtual parents" -msgstr "Không thể chẻ khi có phụ huynh ảo" +msgstr "Phụ huynh ảo không thể chia ngôi" msgid "Randomize Amplitude" @@ -100743,15 +111433,15 @@ msgstr "Ngẫu Nhiên Hóa Trục" msgid "Settings used for fluid" -msgstr "Cài đặt được dùng cho chất lỏng" +msgstr "Sắp đặt sử dụng cho chất lỏng" msgid "Jittering Amount" -msgstr "Mức Hốt Hoảng" +msgstr "Lượng Biến Động" msgid "Scale Randomness" -msgstr "Ngẫu Nhiên Hóa Phóng To" +msgstr "Ngẫu Nhiên Hóa Kích Thước" msgid "Coordinate System" @@ -100760,61 +111450,61 @@ msgstr "Hệ Thống Tọa Độ" msgctxt "Operator" msgid "Delete Edit" -msgstr "Xoá Biên Tập" +msgstr "Xoá Biên Soạn" msgid "Use Timing" -msgstr "Dùng Thời Tự" +msgstr "Dùng Thời Định" msgid "Display percentage makes dynamics inaccurate without baking" -msgstr "Hiển thị phần trăm được làm động lý không chính xác mà không nướng" +msgstr "Hiển thị phần trăm làm cho động lý học trở nên không chính xác nếu không nướng" msgid "Iterations: %d .. %d (avg. %d)" -msgstr "Lặp Lặi: %d .. %d (trung bình %d)" +msgstr "Lặp Lại: %d .. %d (t.b. %d)" msgid "Error: %.5f .. %.5f (avg. %.5f)" -msgstr "Sai Lầm: %.5f .. %.5f (trung bình %.5f)" +msgstr "Lỗi: %.5f .. %.5f (t.b. %.5f)" msgid "Spacing: %g" -msgstr "Khoảng cách: %g" +msgstr "Phân Khoảng: %g" msgid "Not yet functional" -msgstr "Chưa được hoạt động" +msgstr "Chưa hoạt động" msgctxt "Operator" msgid "Connect All" -msgstr "Kết Nối Hết" +msgstr "Kết Nối Toàn Bộ" msgctxt "Operator" msgid "Disconnect All" -msgstr "Ngắt Hết" +msgstr "Ngắt Kết Nối Toàn Bộ" msgid "%d fluid particles for this frame" -msgstr "%d hạt chất lỏng cho bức ảnh này" +msgstr "%d hạt chất lỏng cho khung hình này" msgid "Speed Multiplier" -msgstr "Hệ Số Nhân Tốc Độ" +msgstr "Số Nhân cho Tốc Độ" msgid "Air Viscosity" -msgstr "Độ Nhớt Không Khí" +msgstr "Độ Nhớt Động Học của Không Khí" msgid "Max Spring Creation Length" -msgstr "Bề Dài Lò Xo Cực Đại Được Chế Tạo" +msgstr "Chiều Dài Tối Đa của Lực Đàn Hồi trong khi Kiến Tạo" msgid "Max Creation Diversion" -msgstr "Trệch Đi Cực Đại Được Chế Tạo" +msgstr "Mức Trệch Hướng Tối Đa trong khi Kiến Tạo" msgid "Check Surface Normals" @@ -100822,11 +111512,11 @@ msgstr "Kiểm Tra Pháp Tuyến Bề Mặt" msgid "Max Tension" -msgstr "Lực Căng Cực Đại" +msgstr "Mức Căng Thẳng Tối Đa" msgid "Max Compression" -msgstr "Nén Cực Đại" +msgstr "Mức Nén Tối Đa" msgid "Custom Volume" @@ -100834,23 +111524,23 @@ msgstr "Thể Tích Tùy Chọn" msgid "Pin Group" -msgstr "Nhóm Đinh" +msgstr "Nhóm Ghim Lại" msgid "Sewing" -msgstr "Mai" +msgstr "May Vá" msgid "Max Sewing Force" -msgstr "Lực Mai Cực Đại" +msgstr "Lực May Vá Tối Đa" msgid "Shrinking Factor" -msgstr "Hệ Số Thu Nhỏ" +msgstr "Hệ Số Co Lại" msgid "Dynamic Mesh" -msgstr "Mạng Lưới Động Lý" +msgstr "Khung Lưới Năng Động" msgid "Structural Group" @@ -100858,94 +111548,94 @@ msgstr "Nhóm Cấu Trúc" msgid "Shear Group" -msgstr "Nhóm Méo Hóa" +msgstr "Nhóm Xô Nghiêng" msgid "Max Shearing" -msgstr "Méo Hóa Cực Đại" +msgstr "Mức Xiêu Vẹo Tối Đa" msgid "Bending Group" -msgstr "Nhóm Bể Cong" +msgstr "Nhóm Uốn Cong" msgid "Max Bending" -msgstr "Bể Cong Cực Đại" +msgstr "Mức Uốn Cong Tối Đa" msgid "Shrinking Group" -msgstr "Nhóm Thu Nhỏ" +msgstr "Nhóm về Mức Co Lại" msgid "Max Shrinking" -msgstr "Thu Nhỏ Cực Đại" +msgstr "Mức Co Lại Tối Đa" msgid "Structural" -msgstr "Thuộc Cấu Trúc" +msgstr "Cấu Trúc" msgid "Noise Amount" -msgstr "Lượng Huyên Náo" +msgstr "Lượng Nhiễu Loạn" msgid "Min Distance" -msgstr "Khoảng Cách Cực Tiểu" +msgstr "Khoảng Cách Tối Thiểu" msgctxt "Operator" msgid "Current Cache to Bake" -msgstr "Đệm Chứa Hiện Tại Đến Nướng" +msgstr "Bộ Nhớ Đệm Hiện Tại thành Nướng" msgctxt "Operator" msgid "Delete All Bakes" -msgstr "Xóa Hết Nướng" +msgstr "Phóng Thích Toàn Bộ Dữ Liệu Nướng" msgctxt "Operator" msgid "Force Field" -msgstr "Lực Trường" +msgstr "Trường Lực" msgid "Use Library Path" -msgstr "Dùng Đường Dẫn Thư Viện" +msgstr "Sử dụng Đường Dẫn Thư Viện" msgid "Simulation Start" -msgstr "Bắt Đầu Mô Phỏng" +msgstr "Mô Phỏng Bắt Đầu Từ" msgctxt "Operator" msgid "Bake (Disk Cache mandatory)" -msgstr "Nướng (yêu cầu Đệm Chứa Đĩa)" +msgstr "Nướng (Bộ Nhớ Đệm Trên Đĩa là bắt buộc)" msgctxt "Operator" msgid "Calculate to Frame" -msgstr "Tính đến Bức Ảnh" +msgstr "Tính đến Khung Hình" msgctxt "Operator" msgid "Bake All Dynamics" -msgstr "Nướng Hết Động Lý" +msgstr "Nướng Toàn Bộ các Động Năng" msgctxt "Operator" msgid "Update All to Frame" -msgstr "Nâng Cấp Hết đến Bức Ảnh" +msgstr "Cập Nhật Toàn Bộ vào Khung Hình" msgid "Cache is disabled until the file is saved" -msgstr "Đệm chứa bị tắt đến khi tập tin được lưu" +msgstr "Bộ nhớ đệm sẽ bị tắt đi cho đến khi nào tập tin đã được lưu" msgid "Options are disabled until the file is saved" -msgstr "Tùy chọn bị tắt đến khi tập tin được lưu" +msgstr "Tùy chọn này được tắt đi cho đến khi tập tin đã được lưu" msgid "Linked object baking requires Disk Cache to be enabled" -msgstr "Nướng vật thể liên kết yêu cầu bật Đệm Chứa Đĩa" +msgstr "Phải bật Bộ Đệm Đĩa lên để nướng đối tượng kết nối" msgctxt "Operator" @@ -100955,12 +111645,12 @@ msgstr "Xóa Nướng" msgctxt "Operator" msgid "Bake Image Sequence" -msgstr "Trình Tự Ảnh Nướng" +msgstr "Nướng Chuỗi Hình Ảnh" msgctxt "Operator" msgid "Remove Canvas" -msgstr "Xoá Mặt Sơn" +msgstr "Xóa Mặt Khung Vẽ" msgid "Wetness" @@ -100968,65 +111658,65 @@ msgstr "Độ Ướt" msgid "Paintmap Layer" -msgstr "Lớp Bản Đồ Sơn" +msgstr "Tầng Ánh Xạ về Sơn" msgid "Wetmap Layer" -msgstr "Lớp Bản Đồ Ướt" +msgstr "Tầng Ánh Xạ về Độ Ướt" msgid "Effect Solid Radius" -msgstr "Bán Kính Rắn Hiệu Ứng" +msgstr "Bán Kính Sơn Đặc Kín" msgid "Use Particle's Radius" -msgstr "Dùng Bán Kính Hạt" +msgstr "Dùng Bán Kính của Hạt" msgctxt "Operator" msgid "Add Canvas" -msgstr "Thêm Mặt Sơn" +msgstr "Thêm Khung Vẽ" msgctxt "Operator" msgid "Remove Brush" -msgstr "Xoá Bút" +msgstr "Xóa Đầu Bút" msgid "Displace Type" -msgstr "Loại Dịch" +msgstr "Thể Loại Dời hình" msgid "Color Layer" -msgstr "Lớp Màu" +msgstr "Tầng Lớp Màu" msgid "Wave Clamp" -msgstr "Kẹp Lại Sóng" +msgstr "Hạn Chế Sóng" msgid "No collision settings available" -msgstr "Không có cài đặt va chạm" +msgstr "Không có sắp đặt về va đập để sử dụng" msgid "Use Min Angle" -msgstr "Dùng Góc Cực Tiểu" +msgstr "Sử Dụng Góc Độ Tối Thiểu" msgid "Use Max Angle" -msgstr "Dùng Góc Cực Đại" +msgstr "Sử Dụng Góc Độ Tối Đa" msgid "Field Absorption" -msgstr "Trường Hấp Thụ" +msgstr "Lượng Hấp Thụ Tác Động của Trường" msgid "Thickness Outer" -msgstr "Bề Dày Ngoài" +msgstr "Độ Dày Ngoại Vi" msgid "Clumping Amount" -msgstr "Mức Độ Dính Bó" +msgstr "Lượng Khóm Lại" msgid "Heat" @@ -101038,11 +111728,11 @@ msgstr "Tốc Độ Phản Ứng" msgid "Flame Smoke" -msgstr "Khói Ngón Lửa" +msgstr "Lượng Khói khi Lửa Cháy" msgid "Temperature Maximum" -msgstr "Nhiệt Độ Cực Đại" +msgstr "Nhiệt Độ Tối Đa" msgid "Particle Radius" @@ -101050,27 +111740,27 @@ msgstr "Bán Kính Hạt" msgid "Particles Maximum" -msgstr "Hạt Cực Đại" +msgstr "Số Hạt Tối Đa" msgid "Narrow Band Width" -msgstr "Vành Đai Bề Rộng Hẹp" +msgstr "Băng Tần Hẹp" msgid "Add Resolution" -msgstr "Thêm Độ Phân Giải" +msgstr "Độ Phân Giải Bổ Sung" msgid "Upres Factor" -msgstr "Hệ Số Tăng Độ Phân Giải" +msgstr "Hệ Số Gia Tăng Độ Phân Giải" msgid "Use Speed Vectors" -msgstr "Dùng Vectơ Vận Tốc" +msgstr "Sử Dụng Véctơ về Tốc Độ" msgid "Mesh Generator" -msgstr "Đồ Chế Tạo Mạng Lưới" +msgstr "Máy Sinh Tạo Khung Lưới" msgid "Bubbles" @@ -101078,31 +111768,31 @@ msgstr "Bong Bóng" msgid "Wave Crest Potential Maximum" -msgstr "Nặng Thế Của Đầu Ngọn Cực Đại" +msgstr "Lượng Ngọn Sóng Tối Đa" msgid "Trapped Air Potential Maximum" -msgstr "Nặng Thế Của Không Khí Nhốt Cực Đại" +msgstr "Lượng Bọt Nước Tối Đa" msgid "Kinetic Energy Potential Maximum" -msgstr "Dộng Nặng Thế Cực Đại" +msgstr "Động Năng Tối Đa" msgid "Particle Update Radius" -msgstr "Bán Kính Nâng Cấp Hạt" +msgstr "Bán Kính Cập Nhật Hạt" msgid "Wave Crest Particle Sampling" -msgstr "Mẫu Đầu Ngọn Sóng" +msgstr "Lượng Mẫu Vật cho Hạt trong Ngọn Sóng" msgid "Trapped Air Particle Sampling" -msgstr "Mẫu Hạt Nhốt Không Khí" +msgstr "Mẫu Vật cho Hạt về Bọt Nước" msgid "Particle Life Maximum" -msgstr "Tuổi Thọ Hạt Cực Đại" +msgstr "Tuổi Thọ Tối Đa của Hạt" msgid "Exponent" @@ -101110,23 +111800,23 @@ msgstr "Lũy Thừa" msgid "Surface Tension" -msgstr "Lực Kéo Bề Mặt" +msgstr "Mức Căng Thẳng của Bề Mặt" msgid "Velocity Source" -msgstr "Nguồn Vận Tốc" +msgstr "Nguồn Gây Xoáy Lốc" msgid "Is Resumable" -msgstr "Có Thể Khởi Động Lại" +msgstr "Có Khả Năng Phục Hồi và Tiếp Tục" msgid "Format Volumes" -msgstr "Thể Tích Định Dạng" +msgstr "Phân Định Dạng Thể Tích" msgid "Resolution Divisions" -msgstr "Phần Độ Phân Giải" +msgstr "Số Lần Chia Độ Phân Giải" msgid "CFL Number" @@ -101134,106 +111824,106 @@ msgstr "Số CFL" msgid "Timesteps Maximum" -msgstr "Bước Thời Gian Cực Đại" +msgstr "Số Phân Bước Thời Gian Tối Đa" msgid "Delete in Obstacle" -msgstr "Xóa trong Trở Ngại" +msgstr "Xóa Nội Bên Trong Chướng Ngại Vật" msgid "Smoothing Positive" -msgstr "Mịn Hóa Dương" +msgstr "Làm Mịn Dương" msgid "Concavity Upper" -msgstr "Lõm Cực Đại" +msgstr "Giới Hạn Trên cho Độ Lõm" msgid "Lower" -msgstr "Chữ Nhỏ" +msgstr "Thường/Dưới" msgid "Guide Parent" -msgstr "Phụ Huynh Hướng Dẫn" +msgstr "Phụ Huynh của Chỉ Dẫn" msgid "Compression Volumes" -msgstr "Thể Tích Nén" +msgstr "Nén Thể Tích" msgid "Precision Volumes" -msgstr "Thể Tích Chính Xác" +msgstr "Độ Chính Xác của Thể Tích" msgid "Enable Guides first! Defaulting to Fluid Velocity" -msgstr "Bật Đường Dẫn trưỡc! Đang dùng Vận Tốc Chất Lỏng cho mặc định" +msgstr "Bật Hướng Dẫn lên trước đã! Hiện tại sử dụng Tốc Lực của Chất Lỏng làm mặc định" msgid "Using Scene Gravity" -msgstr "Đang Dùng Hấp Dẫn Cảnh" +msgstr "Sử Dụng Trọng Lực của Cảnh" msgid "Empty Space" -msgstr "Không Gian Trống Rỗng" +msgstr "Không Gian Trống/Rỗng" msgid "Sampling Substeps" -msgstr "Mẫu Cho Hạ Bức Ảnh" +msgstr "Số Lần Lấy Mẫu Vật" msgctxt "Operator" msgid "Resume" -msgstr "Làm Tiếp" +msgstr "Phục Hồi và Tiếp Tục" msgctxt "Operator" msgid "Free" -msgstr "Xóa" +msgstr "Phóng thích/Thả/Tự Do/Miễn Phí" msgid "Surface Thickness" -msgstr "Bề Dày Bề Mặt" +msgstr "Độ Dày của Bề Mặt" msgid "Use Effector" -msgstr "Dùng Đồ Hiệu Ứng" +msgstr "Sử Dụng Hiệu Ứng Viên" msgctxt "Operator" msgid "Baking Noise - ESC to pause" -msgstr "Đang Nướng Huyên Náo - Bấm ESC để dừng lại" +msgstr "Nướng Nhiễu - ESC để tạm ngưng" msgctxt "Operator" msgid "Baking Mesh - ESC to pause" -msgstr "Đang Nướng Mạng Lượi - Bấm ESC để dừng lại" +msgstr "Nướng Khung Lưới - ESC để tạm ngưng" msgctxt "Operator" msgid "Baking Particles - ESC to pause" -msgstr "Đang Nướng Hạt - Bấm ESC để dừng lại" +msgstr "Nướng Hạt - ESC để tạm ngưng" msgctxt "Operator" msgid "Baking All - ESC to pause" -msgstr "Đang Nướng Hết - Bấm ESC để dừng lại" +msgstr "Nướng Toàn Bộ - ESC để tạm ngưng" msgid "Enable Grid Display to use range highlighting!" -msgstr "Bật Hiển Thị Đồ Thị để dùng tô sáng phạm vi" +msgstr "Bật Hiển Thị Khung Lưới Đồ Thị lên để sử dụng sự nêu bật phạm vi!" msgid "Range highlighting for flags is not available!" -msgstr "Không thể tô sáng phạm vi cho cờ" +msgstr "Nêu bật phạm vi cho các dấu cờ hiện tại không khả dụng!" msgctxt "Operator" msgid "Baking Data - ESC to pause" -msgstr "Đang Nướng Dữ Liệu - Bấm ESC để dừng lại" +msgstr "Nướng Dữ Liệu - ESC để tạm ngưng" msgid "Initial Temperature" -msgstr "Nhiệt Độ Khởi Động" +msgstr "Nhiệt Độ Khởi Đầu" msgid "Fuel" @@ -101241,28 +111931,40 @@ msgstr "Nhiên Liệu" msgid "Guide Mode" -msgstr "Chế Độ Hướng Dẫn" +msgstr "Chế Độ Chỉ Dẫn" msgctxt "Operator" msgid "Baking Guides - ESC to pause" -msgstr "Đang Nướng Đồ Dẫn - Bấm ESC để dừng lại" +msgstr "Nướng Hướng Dẫn - ESC để tạm ngưng" + + +msgid "Calculate Selected to Frame" +msgstr "Tính Toán cái Đã Chọn đến Khung Hình" + + +msgid "Bake Selected" +msgstr "Nướng cái Đã Chọn" + + +msgid "Calculate to Frame" +msgstr "Tính đến Khung Hình" msgid "Damping Translation" -msgstr "Dịch Tắt Dần" +msgstr "Giảm Chấn Dịch Chuyển" msgid "Velocity Linear" -msgstr "Vận Tốc Bậc Một" +msgstr "Vận Tốc Tuyến Tính" msgid "This object is part of a compound shape" -msgstr "Vật thể này là một bộ phận của hình dạng ghép" +msgstr "Đối tượng này là phần của một hình dạng tổng hợp đa phần tử" msgid "Second" -msgstr "Giây" +msgstr "Giây/Thứ Hai" msgid "X Stiffness" @@ -101278,61 +111980,69 @@ msgstr "Độ Cứng Z" msgid "X Lower" -msgstr "X Dưới" +msgstr "X Bên Dưới" msgid "Upper" -msgstr "Chữ Hoa" +msgstr "Chữ Hoa/Bên Trên" msgid "Z Lower" -msgstr "Z Dưới" +msgstr "Z Bên Dưới" msgid "Y Lower" -msgstr "Y Dưới" +msgstr "Y Bên Dưới" msgid "Calculation Type" -msgstr "Loại Tính Toán" +msgstr "Phương Pháp Tính Toán" msgid "Step Size Min" -msgstr "Kích Cỡ Bước Cực Tiểu" +msgstr "Số Bước Tối Thiểu" msgid "Auto-Step" -msgstr "Tự Động-Bước" +msgstr "Tự Động Tính Số Bước" msgid "Light Clamping" -msgstr "Kẹp Lại Ánh Sáng" +msgstr "Hạn Chế Ánh Sáng" + + +msgid "Refraction" +msgstr "Khúc Xạ" msgid "Cascade Size" -msgstr "Kích Cỡ Tầng" +msgstr "Kích Thước Tầng Chồng" + + +msgid "Pool Size" +msgstr "Kích Thước Bể" msgctxt "Operator" msgid "Bake Indirect Lighting" -msgstr "Nướng Ánh Sáng Gián Tiếp" +msgstr "Nướng Bố Trí Ánh Sáng Gián Tiếp" msgctxt "Operator" msgid "Delete Lighting Cache" -msgstr "Xóa Đệm Chứa Ánh Sáng" +msgstr "Xóa Bộ Đệm Nhớ về Ánh Sáng" msgid "Diffuse Occlusion" -msgstr "Hấp thụ Tán Xạ" +msgstr "Kích Thước của Bản Đồ Bóng Tối" msgid "Irradiance Size" -msgstr "Kích Cỡ Sự Rọi" +msgstr "Kích Thước của sự Tỏa Sáng" msgid "Max Child Particles" -msgstr "Hạt Con Cái Cực Đại" +msgstr "Số Hạt Con cái Tối Đa" msgid "Render Engine" @@ -101341,11 +112051,15 @@ msgstr "Động Cơ Kết Xuất" msgctxt "Operator" msgid "Bake Cubemap Only" -msgstr "Chỉ Nướng Bản Đồ Lập Phương" +msgstr "Duy Nướng Bản Đồ Lập Phương" + + +msgid "Shadow Resolution" +msgstr "Độ Phân Giải của Bóng Tối" msgid "General Override" -msgstr "Vượt Quyền Tổng Hoát" +msgstr "Vượt Quyền Chung Chung" msgid "Paths:" @@ -101353,40 +112067,44 @@ msgstr "Đường Dẫn:" msgid "Doppler Speed" -msgstr "Tốc Độ Đôple" +msgstr "Tốc Độ Doppler" + + +msgid "Simulation Range" +msgstr "Phạm Vi Mô Phỏng" msgid "Needed" -msgstr "Cần" +msgstr "Hình Tháp Nhọn" msgid "Visual" -msgstr "Thị Giác" +msgstr "Trực Quan" msgid "Active Set Override" -msgstr "Đặt Vượt Quyền Hoạt Động" +msgstr "Vượt Quyền Bộ đang Hoạt Động" msgid "Target ID-Block" -msgstr "Cục ID Mục Tiêu" +msgstr "Khối-ID Mục Tiêu" msgid "Array All Items" -msgstr "Mảng Hết Mặt Hàng" +msgstr "Mảng Hóa Toàn Bộ các Phần Tử" msgid "F-Curve Grouping" -msgstr "Nhóm Cong-F:" +msgstr "Nhóm Họp Đường Cong-F" msgctxt "Operator" msgid "Export to File" -msgstr "Xuất đến Tập Tin" +msgstr "Xuất Khẩu Ra Tập Tin" msgid "Minimum Size" -msgstr "Kích Cỡ Cực Tiểu" +msgstr "Kích Thước Tối Thiểu" msgid "Second Basis" @@ -101394,15 +112112,15 @@ msgstr "Cơ Sở Thứ Hai" msgid "Gaussian Filter" -msgstr "Bộ Lọc Gauss" +msgstr "Bộ lọc Gaus" msgid "Calculate" -msgstr "Tính" +msgstr "Tính Toán" msgid "Flip Axes" -msgstr "Lật Các Trục" +msgstr "Đảo Chiều các Trục" msgid "Dimension" @@ -101414,7 +112132,7 @@ msgstr "Thứ Ba" msgid "Fourth" -msgstr "Tứ Tư" +msgstr "Thứ Tư" msgid "Multiply R" @@ -101422,11 +112140,16 @@ msgstr "Nhân R" msgid "Enable the Color Ramp first" -msgstr "Trước bật Dốc Màu" +msgstr "Bật Dốc Màu trước đã" msgid "Tiles" -msgstr "Ô" +msgstr "Số Ô" + + +msgctxt "Amount" +msgid "Even" +msgstr "Đều Đặn" msgid "Odd" @@ -101438,15 +112161,15 @@ msgstr "Ánh Xạ X" msgid "Map" -msgstr "Bản Đồ" +msgstr "Ánh Xạ" msgid "Use for Rendering" -msgstr "Dùng cho Kết Xuất" +msgstr "Sử Dụng trong Kết Xuất" msgid "Conflicts with another render pass with the same name" -msgstr "Mâu thuẫn với một vòng kết xuất khác có cùng tên" +msgstr "Xung khắc với một lượt kết xuất khác có cùng tên gọi" msgid "Accurate Mode" @@ -101454,11 +112177,19 @@ msgstr "Chế Độ Chính Xác" msgid "Unknown add-ons" -msgstr "Đồ kèm không biết" +msgstr "Trình Bổ Sung Chưa Biết Đến" + + +msgid "category" +msgstr "hạng mục" + + +msgid "name" +msgstr "tên" msgid "Display Thin" -msgstr "Hiển Thị Mỏng" +msgstr "Hiển Thị Ngắn Gọn" msgid "B/W" @@ -101466,105 +112197,105 @@ msgstr "Trắng/Đen" msgid "Calibration" -msgstr "Chỉnh Chuẩn" +msgstr "Hiệu Chuẩn" msgctxt "Operator" msgid "Prefetch" -msgstr "Lấy Trước" +msgstr "Nạp Sẵn" msgctxt "Operator" msgid "Copy from Active Track" -msgstr "Chép Từ Rãnh Hoạt Động" +msgstr "Sao Chép Từ Giám Sát đang Hoạt Động" msgid "Track:" -msgstr "Rãnh:" +msgstr "Giám Sát:" msgid "Clear:" -msgstr "Xóa:" +msgstr "Làm Sạch:" msgid "Refine:" -msgstr "Chỉnh Lại:" +msgstr "Tinh Chỉnh:" msgid "Merge:" -msgstr "Gồm:" +msgstr "Hợp Nhất:" msgid "Tripod" -msgstr "Giá Ba Chân" +msgstr "Chân Máy Ảnh" msgid "Optical Center" -msgstr "Trung Tâm Thị Giác" +msgstr "Quang Tâm" msgid "Radial Distortion" -msgstr "Méo Hóa Bán Kính Tuyến" +msgstr "Biến Dạng Tỏa Tròn" msgid "Tangential Distortion" -msgstr "Méo Hóa Tiếp Tuyến" +msgstr "Biến Dạng Tiếp Tuyến" msgctxt "Operator" msgid "Solve Camera Motion" -msgstr "Giải Chuyển Động Máy Quay Phim" +msgstr "Lý Giải Chuyển Động của Máy Quay Phim" msgctxt "Operator" msgid "Solve Object Motion" -msgstr "Giải Chuyển Động Vật Thể" +msgstr "Lý Giải Chuyển Động của Đối Tượng" msgid "Pixel Aspect" -msgstr "Tỉ Số Điểm Ảnh" +msgstr "Tỷ Lệ Điểm Ảnh" msgid "Build Original:" -msgstr "Xây Ban Đầu:" +msgstr "Xây Dựng Nguyên Thủy:" msgid "Build Undistorted:" -msgstr "Xây Không Méo Hóa" +msgstr "Xây Dựng từ bản Chưa Biến Dạng:" msgctxt "Operator" msgid "Build Proxy / Timecode" -msgstr "Xây Đặi Lý / Mã Thời Gian" +msgstr "Kiến Tạo Đại Diện / Mã Thời Gian" msgctxt "Operator" msgid "Build Proxy" -msgstr "Xây Đại Lý" +msgstr "Kiến Tạo Đại Diện" msgid "Proxy Size" -msgstr "Kích Cỡ Đại Lý" +msgstr "Kích Thước Đại Diện" msgctxt "Operator" msgid "Backwards" -msgstr "Lùi" +msgstr "Ngược Chiều" msgctxt "Operator" msgid "Frame Backwards" -msgstr "Bức Ảnh Lùi" +msgstr "Lùi Từng Khung Hình Một" msgctxt "Operator" msgid "Forwards" -msgstr "Tới" +msgstr "Về Phía Trước" msgctxt "Operator" msgid "Frame Forwards" -msgstr "Bức Ảnh Tới" +msgstr "Tiến Từng Khung Hình Một" msgctxt "Operator" @@ -101579,59 +112310,59 @@ msgstr "Sau" msgctxt "Operator" msgid "Track Path" -msgstr "Đường Vết" +msgstr "Đường Giám Sát" msgctxt "Operator" msgid "Solution" -msgstr "Đồ Phân Giải" +msgstr "Giải Nghiệm" msgctxt "Operator" msgid "Copy Settings to Defaults" -msgstr "Sao Chép Cài Đặt vào Mặc Định" +msgstr "Sao Chép các Sắp Đặt thành Mặc định" msgctxt "Operator" msgid "Apply Default Settings" -msgstr "Áp Dụng Cài Đặt Mặc Định" +msgstr "Áp Dụng các Sắp Đặt Mặc Định" msgctxt "Operator" msgid "Location" -msgstr "Vị Trí" +msgstr "Địa Điểm/Vị Trí" msgctxt "Operator" msgid "Affine" -msgstr "Phỏng Xạ" +msgstr "Afin" msgctxt "Operator" msgid "Set Viewport Background" -msgstr "Đặt Nền Màn Chiếu" +msgstr "Đặt Nền cho Cổng Nhìn" msgctxt "Operator" msgid "Set Floor" -msgstr "Đặt Sàn" +msgstr "Đặt Sàn Nhà" msgid "Viewport Gizmos" -msgstr "Đồ Đạc Màn Chiếu" +msgstr "Gizmos của Cổng Nhìn" msgid "3D Markers" -msgstr "Ký Hiệu 3D" +msgstr "Dấu Mốc 3D" msgid "Display Aspect Ratio" -msgstr "Tỉ Số Hiển Thị" +msgstr "Tỷ Lệ Tương Quan Hiển Thị" msgctxt "Operator" msgid "Floor" -msgstr "Sàn" +msgstr "Nền Sàn" msgctxt "Operator" @@ -101650,28 +112381,32 @@ msgstr "Đặt Trục Y" msgid "No active track" -msgstr "Không có theo dõi hoạt động" +msgstr "Không có dấu giám sát nào đang hoạt động cả" + + +msgid "Custom Color Presets" +msgstr "Sắp Đặt Sẵn Màu Tùy Chỉnh" msgid "No active plane track" -msgstr "Không có theo dõi mặt phẳng hoạt động" +msgstr "Không có giám sát bình diện nào đang hoạt động cả" msgid "Tracks for Stabilization" -msgstr "Theo Dõi cho Ổn Định Hóa" +msgstr "Giám Sát cho sự Ổn Định Hóa" msgid "Tracks for Location" -msgstr "Theo Dõi Cho Vị Trí" +msgstr "Giám Sát cho Vị Trí" msgid "Timecode Index" -msgstr "Chỉ Số Mã Thời Gian" +msgstr "Chỉ Số của Mã Thời Gian" msgctxt "Operator" msgid "Set Wall" -msgstr "Đặt Tường" +msgstr "Đặt Bức Tường" msgctxt "Operator" @@ -101681,125 +112416,129 @@ msgstr "Đảo Nghịch" msgctxt "Operator" msgid "Show Tracks" -msgstr "Hiện Đường Vết" +msgstr "Hiển Thị các Giám Sát" msgid "Normalization" -msgstr "Đơn Vị Hóa" +msgstr "Bình Thường Hóa" msgid "Use Brute Force" -msgstr "Dùng Cưỡng Chế" +msgstr "Sử Dụng Tấn Công Vét Cạn" msgctxt "Operator" msgid "Match Previous" -msgstr "Giống Trước" +msgstr "Khớp với Trước Đây" msgctxt "Operator" msgid "Match Keyframe" -msgstr "Giống Bức Ảnh Mẫu Trước" +msgstr "Khớp với Khung Khóa" msgid "Tripod Solver" -msgstr "Trình Giải Nghiệm Ba Chân" +msgstr "Giải Nghiệm Chân Đế" msgctxt "Operator" msgid "Set Keyframe A" -msgstr "Đặt Bức Ảnh Mẫu A" +msgstr "Đặt Khung Khóa A" msgctxt "Operator" msgid "Set Keyframe B" -msgstr "Đặt Bức Ảnh Mẫu B" +msgstr "Đặt Khung Khóa B" + + +msgid "Average Error: %.2f px" +msgstr "Sai Số Trung Bình: %.2f điểm ảnh" msgid "Tracks for Rotation/Scale" -msgstr "Theo Dõi cho Xoay/Phóng To" +msgstr "Giám Sát cho Chiều Xoay/Tỷ Lệ" msgctxt "Operator" msgid "View Fit" -msgstr "Vừa Màn" +msgstr "Khít vừa Khung Nhìn" msgctxt "Operator" msgid "Enable Markers" -msgstr "Bật Các Ký Hiệu" +msgstr "Bật các Dấu Mốc" msgctxt "Operator" msgid "Unlock Tracks" -msgstr "Mở Theo Dõi Bị Khóa" +msgstr "Mở Khóa Giám Sát" msgctxt "Operator" msgid "Frame All Fit" -msgstr "Vừa Khung" +msgstr "Khít Vừa Khung Hình" msgid "Zoom %d:%d" -msgstr "Phóng To %d:%d" +msgstr "Thu-Phóng %d:%d" msgid "Solve error: %.2f px" -msgstr "Sai lầm: %.2f điểm ảnh" +msgstr "Mức sai số trong giải nghiệm: %.2f điểm ảnh" msgctxt "Operator" msgid "Copy as Script" -msgstr "Chép như Văn Thảo" +msgstr "Sao Chép thành Tập Lệnh" msgctxt "Operator" msgid "Autocomplete" -msgstr "Tự Động Hoàn Thành" +msgstr "Tự động Hoàn Chỉnh" msgctxt "Operator" msgid "Move to Previous Word" -msgstr "Di chuyển đến Từ Trước" +msgstr "Chuyển đến Từ Đứng Trước" msgctxt "Operator" msgid "Move to Next Word" -msgstr "Di chuyển đến Từ Tiếp" +msgstr "Chuyển đến Từ Tiếp Theo" msgctxt "Operator" msgid "Move to Line Begin" -msgstr "Di chuyển đến Đầu Dòng" +msgstr "Chuyển đến Đầu Dòng" msgctxt "Operator" msgid "Move to Line End" -msgstr "Di chuyển đến Cuối Dòng" +msgstr "Chuyển đến Cuối Dòng" msgctxt "Operator" msgid "Delete Previous Word" -msgstr "Xóa Từ Trước" +msgstr "Xóa Từ Đứng Trước" msgctxt "Operator" msgid "Delete Next Word" -msgstr "Xóa Từ Sau" +msgstr "Xóa Từ Tiếp Theo" msgctxt "Operator" msgid "Backward in History" -msgstr "Trở lại trong Lịch Sử" +msgstr "Quay Ngược Lại trong dòng Lịch Sử" msgctxt "Operator" msgid "Forward in History" -msgstr "Tiến tới trong Lịch Sử" +msgstr "Tiến về Trước trong dòng Lịch Sử" msgid "Filter by Type:" -msgstr "Lọc Bằng Loại:" +msgstr "Thanh Lọc theo Thể Loại:" msgid "Options:" @@ -101807,26 +112546,26 @@ msgstr "Tùy Chọn:" msgid "Snap To" -msgstr "Hút Dính Đến" +msgstr "Bám Dính Vào" msgid "Multi-Word Match Search" -msgstr "Tìm Kiếm Đa Từ Giống" +msgstr "Tìm Kiếm Khớp Nhiều Từ" msgctxt "Operator" msgid "Toggle Graph Editor" -msgstr "Bật/Tắt Trình Biên Soạn Biểu Đồ" +msgstr "Chuyển Sang Trình Biên Soạn Đồ Thị" msgctxt "Operator" msgid "Before Current Frame" -msgstr "Trước Bức Ảnh Hiện Tại" +msgstr "Trước khung hình hiện tại" msgctxt "Operator" msgid "After Current Frame" -msgstr "Sau Bức Ảnh Hiện Tại" +msgstr "Sau khung hình hiện tại" msgctxt "Operator" @@ -101841,136 +112580,136 @@ msgstr "Di Chuyển..." msgctxt "Operator" msgid "Snap" -msgstr "Hút Dính" +msgstr "Bám Dính" msgctxt "Operator" msgid "Keyframe Type" -msgstr "Loại Bức Ảnh Mẫu" +msgstr "Loại Khung Khóa" msgctxt "Operator" msgid "Handle Type" -msgstr "Loại Tay Cầm" +msgstr "Kiểu tay cầm" msgctxt "Operator" msgid "Interpolation Mode" -msgstr "Chế Độ Suy Nội" +msgstr "Chế Độ Nội Suy" msgctxt "Operator" msgid "Easing Mode" -msgstr "Chế Độ Xoa Dịu" +msgstr "Chế Độ Chậm Rãi" msgctxt "Operator" msgid "Discontinuity (Euler) Filter" -msgstr "Bộ Lọc Không Liên Tiếp (Euler)" +msgstr "Bộ Lọc sửa sự Gián Đoạn (Euler)" msgid "Grease Pencil Objects" -msgstr "Vật Thể Bút Sáp" +msgstr "Đối Tượng Bút Chì Dầu" msgctxt "Operator" msgid "Push Down" -msgstr "Đẩy Xuống" +msgstr "Đẩn Xuống" msgctxt "Operator" msgid "Stash" -msgstr "Cất Chứa" +msgstr "Cất Giấu" msgctxt "Operator" msgid "Box Select (Axis Range)" -msgstr "Chọn Kiểu Hộp (Pham Vị Trục)" +msgstr "Khoanh Vùng Lựa Chọn Hình Hộp (Phạm Vi Trục)" msgctxt "Operator" msgid "Columns on Selected Keys" -msgstr "Cột Cho Bức Ảnh Mẫu Được Chọn" +msgstr "Cả cột trên Khung Khóa được Chọn" msgctxt "Operator" msgid "Column on Current Frame" -msgstr "Cột Cho Bức Ảnh Hiện Tại" +msgstr "Cả cột trên Khung Hình Hiện Tại" msgctxt "Operator" msgid "Columns on Selected Markers" -msgstr "Cột Cho Ký Hiệu Được Chọn" +msgstr "Cả cột trên Dấu Mốc được Chọn" msgctxt "Operator" msgid "Between Selected Markers" -msgstr "Giữa Ký Hiệu Được Chọn" +msgstr "Nằm Giữa các Dấu Mốc Đã Chọn" msgctxt "Operator" msgid "Clean Channels" -msgstr "Làm Sạch Kênh" +msgstr "Dọn Dẹp các Kênh" msgctxt "Operator" msgid "Paste Flipped" -msgstr "Dán Kiểu Lật" +msgstr "Dán Đảo Chiều" msgctxt "Operator" msgid "Extend" -msgstr "Kéo Ra" +msgstr "Nới/Mở Rộng" msgctxt "Operator" msgid "Mute Channels" -msgstr "Tắt Tiếng Kênh" +msgstr "Giải Hoạt các Kênh" msgctxt "Operator" msgid "Unmute Channels" -msgstr "Bật Tiếng Kênh" +msgstr "Kích Hoạt các Kênh" msgctxt "Operator" msgid "Protect Channels" -msgstr "Bảo Vệ Kênh" +msgstr "Bảo Vệ các Kênh" msgctxt "Operator" msgid "Unprotect Channels" -msgstr "Không Bảo Vệ Kênh" +msgstr "Không Bảo Vệ các Kênh" msgctxt "Operator" msgid "Selection to Current Frame" -msgstr "Sự Lựa Chọn Đến Bức Ảnh Hiện Tại" +msgstr "Lựa Chọn tới Khung Hình Hiện Tại" msgctxt "Operator" msgid "Selection to Nearest Frame" -msgstr "Sự Lựa Chọn Đến Bức Ảnh Gần Nhất" +msgstr "Lựa Chọn tới Khung Hình Gần Nhất" msgctxt "Operator" msgid "Selection to Nearest Second" -msgstr "Sự Lựa Chọn Đến Giây Gần Nhất" +msgstr "Lựa Chọn tới Giây Đồng Hồ Gần Nhất" msgctxt "Operator" msgid "Selection to Nearest Marker" -msgstr "Sự Lựa Chọn Đến Ký Hiệu Gần Nhất" +msgstr "Lựa Chọn tới Dấu Mốc Gần Nhất" msgctxt "Operator" msgid "Hide Selected Curves" -msgstr "Ẩn Đường Cong Được Chọn" +msgstr "Ẩn Giấu các Đường Cong đã Chọn" msgctxt "Operator" msgid "Hide Unselected Curves" -msgstr "Ẩn Đường Cong Chưa Chọn" +msgstr "Ẩn Giấu Đường Cong Không Chọn" msgid "Recursions" @@ -101978,11 +112717,11 @@ msgstr "Đệ Quy" msgid "Sort By" -msgstr "Sắp xếp Bằng" +msgstr "Sắp Xếp Thứ Tự Theo" msgid "Folders" -msgstr "Hồ sơ" +msgstr "Thư Mục" msgctxt "Operator" @@ -101990,45 +112729,50 @@ msgid "Cleanup" msgstr "Dọn Dẹp" +msgctxt "Operator" +msgid "Clear Recent Items" +msgstr "Xóa Mục Gần Đây" + + msgctxt "Operator" msgid "Back" -msgstr "Sau" +msgstr "Quay Trở Lại" msgctxt "Operator" msgid "Forward" -msgstr "Tới" +msgstr "Hướng Trước" msgctxt "Operator" msgid "Go to Parent" -msgstr "Đi đến Phụ Huynh" +msgstr "Bước về Phụ Huynh" msgctxt "Operator" msgid "New Folder" -msgstr "Hồ Sơ Mới" +msgstr "Tạo Thư Mục Mới" msgid "Asset Details" -msgstr "Chi Tiết Tích Sản" +msgstr "Chi Tiết Tài Sản" msgctxt "Operator" msgid "Render Active Object" -msgstr "Kết Xuất Vật Thể Hoạt Động" +msgstr "Kết Xuất Đối Tượng đang Hoạt Động" msgid ".blend Files" -msgstr "Các Tập Tin .blend" +msgstr "Tập Tin .blend" msgid "Backup .blend Files" -msgstr "Dự Phòng Tập Tin .blend" +msgstr "Tập Tin .blend Dự Phòng" msgid "Image Files" -msgstr "Tập Tin Ảnh" +msgstr "Tập Tin Hình Ảnh" msgid "Movie Files" @@ -102036,11 +112780,11 @@ msgstr "Tập Tin Phim" msgid "Script Files" -msgstr "Tập Tin Văn Thảo" +msgstr "Tập Tin về Tập Lệnh" msgid "Font Files" -msgstr "Tập Tin Phông" +msgstr "Tập Tin Phông Chữ" msgid "Sound Files" @@ -102056,34 +112800,34 @@ msgstr "Tập Tin Thể Tích" msgid "Blender IDs" -msgstr "ID Blender" +msgstr "Chỉ Danh ID của Blender" msgctxt "Operator" msgid "Increase Number" -msgstr "Tăng Số" +msgstr "Tăng Số Lên" msgctxt "Operator" msgid "Decrease Number" -msgstr "Giảm Số" +msgstr "Giảm Số Xuống" msgid "No active asset" -msgstr "Không có tích sản hoạt động" +msgstr "Không có tài sản nào đang hoạt động cả" msgctxt "Operator" msgid "Clear Asset (Set Fake User)" -msgstr "Xoá Tích Sản (Đặt Người Dùng Giả)" +msgstr "Xóa Tài Sản (Đặt Người Dùng Giả)" msgid "Asset Catalog:" -msgstr "Danh Mục Tích Sản:" +msgstr "Danh Mục Tài Sản:" msgid "UUID" -msgstr "UUID" +msgstr "Định Danh Duy Nhất Toàn Cầu" msgid "Simple Name" @@ -102092,67 +112836,122 @@ msgstr "Tên Đơn Giản" msgctxt "Operator" msgid "Toggle Dope Sheet" -msgstr "Bật/Tắt Bảng Hoạt Hình" +msgstr "Chuyển Sang Bảng Hành Động" msgctxt "Operator" msgid "Box Select (Include Handles)" -msgstr "Chọn Kiểu Hộp (Gồm Tay Cầm)" +msgstr "Khoanh Vùng Chọn Hình Hộp (Bao Gồm cả Tay Cầm)" + + +msgctxt "Operator" +msgid "Select Key" +msgstr "Chọn Khóa" + + +msgctxt "Operator" +msgid "Ease" +msgstr "Nới Lỏng/Chậm Rãi" + + +msgctxt "Operator" +msgid "Blend Offset" +msgstr "Pha Trộn Dịch Chuyển" + + +msgctxt "Operator" +msgid "Blend to Ease" +msgstr "Pha Trộn để Nới Lỏng/Chậm Rãi" + + +msgctxt "Operator" +msgid "Push Pull" +msgstr "Đẩn Kéo" + + +msgctxt "Operator" +msgid "Shear Keys" +msgstr "Xô Nghiêng Khóa" + + +msgctxt "Operator" +msgid "Scale Average" +msgstr "Trung Bình Tỷ Lệ" + + +msgctxt "Operator" +msgid "Time Offset" +msgstr "Dịch Chuyển Thời Gian" + + +msgctxt "Operator" +msgid "Smooth (Gaussian)" +msgstr "Mịn (Gaussian)" + + +msgctxt "Operator" +msgid "Smooth (Legacy)" +msgstr "Mịn (Lỗi Thời)" + + +msgctxt "Operator" +msgid "Jump to Selected" +msgstr "Nhảy tới cái Được Chọn" msgctxt "Operator" msgid "Easing Type" -msgstr "Loại Xoa Dịu" +msgstr "Kiểu Chậm Rãi" msgctxt "Operator" msgid "Cursor to Selection" -msgstr "Con Trỏ Đến Sự Lựa Chọn" +msgstr "Con Trỏ sang Sự Lựa Chọn" msgctxt "Operator" msgid "Cursor Value to Selection" -msgstr "Giá Trị Con Trỏ Đến Sự Lựa Chọn" +msgstr "Giá Trị Con Trỏ sang chỗ Lựa Chọn" msgctxt "Operator" msgid "Decimate (Ratio)" -msgstr "Cắt Chẻ (Tỉ Số)" +msgstr "Tiêu Hao (Tỷ Lệ)" msgctxt "Operator" msgid "Selection to Cursor Value" -msgstr "Sự Lựa Chọn Đến Giá Trị Con Trỏ" +msgstr "Lựa Chọn tới Giá trị Con Trỏ" msgctxt "Operator" msgid "Flatten Handles" -msgstr "Bằng Phẳng Hóa Tay Cầm" +msgstr "Tay Cầm Dát Phẳng" msgctxt "Operator" msgid "Decimate (Allowed Change)" -msgstr "Cắt Chẻ (Được Đổi)" +msgstr "Tiêu Hao (Thay Đổi Cho Phép)" msgctxt "Operator" msgid "Less" -msgstr "Ít Hơn" +msgstr "Giảm" msgctxt "Operator" msgid "More" -msgstr "Nhiều Hơn" +msgstr "Tăng" msgctxt "Operator" msgid "Linked" -msgstr "Được Liên Kết" +msgstr "Kết Nối" msgctxt "Operator" msgid "Shortest Path" -msgstr "Đường Nhắn Nhất" +msgstr "Đường Ngắn Nhất" msgctxt "Image" @@ -102162,75 +112961,75 @@ msgstr "Mới" msgctxt "Operator" msgid "Save All Images" -msgstr "Lưu Hết Ảnh" +msgstr "Lưu Toàn Bộ các Hình Ảnh" msgctxt "Operator" msgid "Invert Image Colors" -msgstr "Đảo Nghịch Màu Ảnh" +msgstr "Đảo Nghịch Màu Hình Ảnh" msgctxt "Operator" msgid "At Center" -msgstr "Tại Trung Tâm" +msgstr "Tại Tâm" msgctxt "Operator" msgid "By Distance" -msgstr "Bằng Khoảng Cách" +msgstr "Theo Khoảng Cách" msgctxt "Operator" msgid "Selection" -msgstr "Sự Lựa Chọn" +msgstr "Lựa Chọn" msgid "Modified Edges" -msgstr "Cạnh Được Sửa Đổi" +msgstr "Cạnh đã được Sửa Đổi" msgid "Show Same Material" -msgstr "Hiện Cùng Vật Liệu" +msgstr "Hiển Thị Đồng Nguyên Vật Liệu" msgctxt "Operator" msgid "Render Slot Cycle Next" -msgstr "Khe Kết Xuất Chu Trình Tiếp" +msgstr "Luân Chuyển tới Khe Kết Xuất Tiếp Theo" msgctxt "Operator" msgid "Box Select Pinned" -msgstr "Chọn Kiểu Hộp Được Đóng Đinh" +msgstr "Khoanh Vùng Chọn Hình Hộp các Điểm đã Đính Ghim" msgctxt "Operator" msgid "Edit Externally" -msgstr "Biên Tập Ở Ngoài" +msgstr "Biên Soạn Ngoại Tuyến" msgctxt "Operator" msgid "Save As..." -msgstr "Luu Dạng..." +msgstr "Lưu Thành..." msgctxt "Operator" msgid "Extract Palette" -msgstr "Rút Bảng Màu" +msgstr "Trích Xuất Bảng Pha Màu" msgctxt "Operator" msgid "Generate Grease Pencil" -msgstr "Chế Tạo Bút Sáp" +msgstr "Sinh Tạo Bút Chì Dầu" msgctxt "Operator" msgid "Horizontally" -msgstr "Hướng Ngang" +msgstr "Theo Chiều Ngang" msgctxt "Operator" msgid "Vertically" -msgstr "Hướng Dọc" +msgstr "Theo Chiều Dọc" msgctxt "Operator" @@ -102245,62 +113044,67 @@ msgstr "Đảo Nghịch Kênh Lục" msgctxt "Operator" msgid "Invert Blue Channel" -msgstr "Đảo Nghịch Kênh Xanh" +msgstr "Đảo Nghịch Kênh Lam" msgctxt "Operator" msgid "Invert Alpha Channel" -msgstr "Đảo Nghịch Kênh Độ Đục" +msgstr "Đảo Nghịch Kênh Alpha" msgctxt "Operator" msgid "Selected to Pixels" -msgstr "Vột Thể Chọn Đến Điểm Ảnh" +msgstr "Cái được Chọn tới Điểm Ảnh" msgctxt "Operator" msgid "Selected to Cursor" -msgstr "Vật Thể Chọn Đến Con Trỏ" +msgstr "Cái được Chọn tới Con Trỏ" msgctxt "Operator" msgid "Selected to Cursor (Offset)" -msgstr "Vật Thể Chọn Đến Con Trỏ (Dịch)" +msgstr "Cái được Chọn tới Con Trỏ (Dịch Chuyển)`" msgctxt "Operator" msgid "Selected to Adjacent Unselected" -msgstr "Được Chọn Đến Kề Chưa Được Chọn" +msgstr "Cái được Chọn tới cái Chưa Được Chọn Kề Cạnh" msgctxt "Operator" msgid "Cursor to Pixels" -msgstr "Con Trỏ Đến Điểm Ảnh" +msgstr "Con Trỏ tới Điểm Ảnh" msgctxt "Operator" msgid "Cursor to Origin" -msgstr "Con Trỏ đến Gốc Tọa Độ" +msgstr "Con Trỏ về Tọa Độ Gốc" msgctxt "Operator" msgid "At Cursor" -msgstr "Tại Con Trỏ" +msgstr "Tại Vị Trí Con Trỏ" msgctxt "Operator" msgid "Unpin" -msgstr "Gỡ Đóng Đinh" +msgstr "Tháo Ghim" + + +msgctxt "Operator" +msgid "Invert Pins" +msgstr "Đảo Ngược Ghim" msgctxt "Operator" msgid "Clear Seam" -msgstr "Xóa Vết Sẹo" +msgstr "Xóa Đường Khâu" msgctxt "Operator" msgid "Vertex" -msgstr "Đỉnh" +msgstr "Điểm Đỉnh" msgctxt "Operator" @@ -102310,38 +113114,42 @@ msgstr "Cạnh" msgctxt "Operator" msgid "Face" -msgstr "Mạt" +msgstr "Mặt" msgctxt "Operator" msgid "Island" -msgstr "Đảo" +msgstr "Hải Đảo" msgctxt "Operator" msgid "Zoom 1:1" -msgstr "Phóng To 1:1" +msgstr "Thu Phóng 1:1" msgid "Image*" -msgstr "Ảnh*" +msgstr "Hình Ảnh*" msgid "Aspect Ratio" -msgstr "Tỉ Số Cạnh" +msgstr "Tỷ Lệ Tương Quan" msgid "Repeat Image" -msgstr "Lặp Lại Ảnh" +msgstr "Nhắc Lại Hình Ảnh" + + +msgid "Over Image" +msgstr "Trên Hình Ảnh" msgid "Fixed Subdivisions" -msgstr "Phân Hóa Đều Đặn" +msgstr "Mức Phân Chia Cố Định" msgctxt "Operator" msgid "Render Slot Cycle Previous" -msgstr "Khe Kết xuất Chu Trình Trước" +msgstr "Luân Chuyển về Khe Kết Xuất Trước" msgctxt "Operator" @@ -102351,12 +113159,12 @@ msgstr "Thay Thế..." msgctxt "Operator" msgid "Save a Copy..." -msgstr "Lưu Một Bản Sao..." +msgstr "Lưu một Bản Sao..." msgctxt "Operator" msgid "Pack" -msgstr "Gói Lại" +msgstr "Đóng Gói" msgctxt "Operator" @@ -102371,37 +113179,37 @@ msgstr "Trục Y" msgctxt "Operator" msgid "Unpack" -msgstr "Gỡ Gói" +msgstr "Mở Gói" msgctxt "Operator" msgid "Mirror X" -msgstr "Gương X" +msgstr "Phản Chiếu Đối Xứng X" msgctxt "Operator" msgid "Mirror Y" -msgstr "Gương Y" +msgstr "Phản Chiếu Đối Xứng Y" msgctxt "Operator" msgid "Toggle Selection" -msgstr "Bật/Tắt Sự Lựa Chọn" +msgstr "Bật/Tắt Lựa Chọn" msgctxt "Operator" msgid "Horizontal Split" -msgstr "Chẻ Ngang" +msgstr "Tách Phân theo Chiều Ngang" msgctxt "Operator" msgid "Vertical Split" -msgstr "Chẻ Dọc" +msgstr "Tách Phân theo Chiều Dọc" msgctxt "Operator" msgid "Toggle Fullscreen Area" -msgstr "Bật/Tắt Vùng Toàn Màn" +msgstr "Bật/Tắt Toàn Bộ Địa Phận Màn Hình" msgctxt "Operator" @@ -102416,63 +113224,88 @@ msgstr "Đổi Tên..." msgctxt "Operator" msgid "Track Ordering..." -msgstr "Thứ Tự Theo Dõi..." +msgstr "Sắp Xếp Trật Tự của Rãnh..." msgctxt "Operator" msgid "Stop Tweaking Strip Actions" -msgstr "Nghỉ Chỉnh Hành Động Đoạn" +msgstr "Ngừng Tinh Chỉnh Hành Động trong Dải" msgctxt "Operator" msgid "Stop Editing Stashed Action" -msgstr "Nghỉ Biên Tập Hành Động Cất Chứa" +msgstr "Ngừng Biên Soạn Hành Động đã Cất Giấu" msgctxt "Operator" msgid "Start Editing Stashed Action" -msgstr "Bắt Đầu Biên Tập Hành Động Cất Chứa" +msgstr "Bắt Đầu Biên Soạn Hành Động đã Cất Giấu" msgctxt "Operator" msgid "Start Tweaking Strip Actions (Full Stack)" -msgstr "Bắt Đầu Chỉnh Hành Động Đoạn (Toàn Xếp Đống)" +msgstr "Bắt Đầu Tinh Chỉnh các Hành Động của Dải (Toàn Bộ các Ngăn Xếp)" msgctxt "Operator" msgid "Start Tweaking Strip Actions (Lower Stack)" -msgstr "Bắt Đầu Chỉnh Hành Động Đoạn (Xếp Đống Dưới)" +msgstr "Bắt Đầu Tinh Chỉnh các Hành Động của Dải (Ngăn Xếp Dưới)" msgctxt "Operator" msgid "Join in New Frame" -msgstr "Tham gia trong Bức Ảnh Mới" +msgstr "Hội Nhập vào Khung Mới" msgctxt "Operator" msgid "Remove from Frame" -msgstr "Xóa Từ Bức Ảnh" +msgstr "Xóa khỏi Khung" + + +msgctxt "Operator" +msgid "Insert Into Group" +msgstr "Chèn Vào Nhóm" + + +msgctxt "Operator" +msgid "Mute" +msgstr "Giải Hoạt" + + +msgctxt "Operator" +msgid "Node Options" +msgstr "Tùy Chọn Nút" + + +msgctxt "Operator" +msgid "Unconnected Sockets" +msgstr "Ổ Cắm chưa Kết Nối" + + +msgctxt "Operator" +msgid "Collapse" +msgstr "Thu Lại" msgid "Projection X" -msgstr "Phép Chiếu X" +msgstr "Phóng Chiếu X" msgctxt "Operator" msgid "Fit" -msgstr "Vừa Hóa" +msgstr "Khít Vừa" msgid "Node Editor Overlays" -msgstr "Lớp Che Trình Biên Soạn Giao Điểm" +msgstr "Vẽ Lồng Trình Biên Soạn Nút" msgid "Wire Colors" -msgstr "Màu Sợi Dây" +msgstr "Hiện Màu Dây" msgid "Context Path" -msgstr "Đường Dẫn Bối Cảnh" +msgstr "Đường Dẫn Ngữ Cảnh" msgctxt "Operator" @@ -102482,88 +113315,130 @@ msgstr "Di Chuyển Nền" msgctxt "Operator" msgid "Fit Backdrop to Available Space" -msgstr "Vừa hóa Nền vào Không Gian Thì Có" +msgstr "Đặt Nền Khít vào Khoảng Không Gian Hiện Có" msgctxt "Operator" msgid "Activate Same Type Previous" -msgstr "Hoạt Động Cùng Loại Trước" +msgstr "Kích Hoạt Cùng Loại Nằm Trước" msgctxt "Operator" msgid "Activate Same Type Next" -msgstr "Hoạt Động Cùng Loại Tiếp" +msgstr "Kích Hoạt Cùng Loại Tiếp Theo" msgctxt "Operator" msgid "Make and Replace Links" -msgstr "Chế Tạo Và Thay Thế Các Thế Liên Kết" +msgstr "Tạo và Thay Thế Kết Nối" + + +msgctxt "Operator" +msgid "Node Preview" +msgstr "Xem Trước Nút" + + +msgctxt "Operator" +msgid "Select Grouped..." +msgstr "Chọn theo Nhóm..." + + +msgctxt "Operator" +msgid "Find..." +msgstr "Lùng Tìm…" + + +msgctxt "Operator" +msgid "Link to Viewer" +msgstr "Kết Nối với Nút Quan Sát" + + +msgctxt "Operator" +msgid "Exit Group" +msgstr "Thoát Khỏi Nhóm" msgctxt "Operator" msgid "Online Manual" -msgstr "Sách Dẫn Sử Dụng Trên Mạng" +msgstr "Hướng Dẫn Sử Dụng Trực Tuyến" msgid "Inputs:" -msgstr "Các Ngõ Vào:" +msgstr "Đầu Vào:" + + +msgid "Previews" +msgstr "Xem Trước" msgid "Timings" -msgstr "Thời Tự" +msgstr "Thời Gian" msgid "Named Attributes" -msgstr "Đặc Điểm Có Tên" +msgstr "Thuộc Tính được Đặt Tên" msgctxt "Operator" msgid "Backdrop Zoom In" -msgstr "Phóng Vào Nền" +msgstr "Phóng To Nền" msgctxt "Operator" msgid "Backdrop Zoom Out" -msgstr "Phóng Ra Nền" +msgstr "Thu Nhỏ Nền" msgid "Slot %d" msgstr "Khe %d" +msgid "Closed by Default" +msgstr "Đóng theo Mặc Định" + + +msgctxt "Operator" +msgid "Clear Viewer" +msgstr "Xóa Quan Sát" + + +msgid "Types" +msgstr "Thể Loại" + + msgctxt "Operator" msgid "Show One Level" -msgstr "Hiện Một Tầng" +msgstr "Hiển Thị Một Tầng" msgctxt "Operator" msgid "Isolate" -msgstr "Cô Lập" +msgstr "Cô Lập/cách ly/tách ra/ngắt/riêng biệt" msgctxt "Operator" msgid "Show" -msgstr "Hiện" +msgstr "Hiển Thị" msgctxt "Operator" msgid "Show All Inside" -msgstr "Hiện Hết Ở Trong" +msgstr "Hiển Thị Toàn Bộ Bên Trong" msgctxt "Operator" msgid "Hide All Inside" -msgstr "Ẩn Hết Ở Trong" +msgstr "Ẩn Giấu Toàn Bộ Bên Trong" msgctxt "Operator" msgid "Enable in Viewports" -msgstr "Bật trong Màn Chiếu" +msgstr "Bật trong Cổng Nhìn" msgctxt "Operator" msgid "Disable in Viewports" -msgstr "Tắt trong Màn Chiếu" +msgstr "Tắt trong Cổng Nhìn" msgctxt "Operator" @@ -102578,7 +113453,7 @@ msgstr "Tắt trong Kết Xuất" msgctxt "Operator" msgid "Instance to Scene" -msgstr "Thực Thể đến Cảnh" +msgstr "Thực Thể vào Cảnh" msgctxt "Operator" @@ -102588,28 +113463,28 @@ msgstr "Dữ Liệu ID" msgctxt "Operator" msgid "Paste Data-Blocks" -msgstr "Dán Cục Dữ Liệu" +msgstr "Dán Khối-Dữ Liệu" msgid "All View Layers" -msgstr "Hiển Hết Lớp Màn Chiếu" +msgstr "Toàn Bộ các Tầng Góc Nhìn" msgid "Object Contents" -msgstr "Nội Dung Vật Thể" +msgstr "Nội Dung của Đối Tượng" msgid "Object Children" -msgstr "Con Cái Vật Thể" +msgstr "Con Cái của Đối Tượng" msgid "Empties" -msgstr "Vật Thể Rỗng" +msgstr "Đối Tượng Trống Rỗng" msgctxt "Operator" msgid "Hide One Level" -msgstr "Ẩn Một Tầng" +msgstr "Ẩn Giấu Một Tầng" msgctxt "Collection" @@ -102619,50 +113494,50 @@ msgstr "Mới" msgctxt "Operator" msgid "Link to Scene" -msgstr "Liên Kết Với Cảnh" +msgstr "Kết Nối vào Cảnh" msgctxt "Operator" msgid "Make" -msgstr "Chế Tạo" +msgstr "Tạo" msgctxt "Operator" msgid "Troubleshoot" -msgstr "Tìm Kiếm Lỗi Lầm" +msgstr "Điều Tra và Xử Lý Sự Cố" msgid "Restriction Toggles" -msgstr "Hạn Chế Bật/Tắt" +msgstr "Bật/Tắt Hạn Chế" msgid "Sync Selection" -msgstr "Đồng Bộ Hóa Sự Lựa Chọn" +msgstr "Đồng Bộ Hóa Lựa Chọn" msgid "System Overrides" -msgstr "Đồ Vượt Quyền Hệ Thống" +msgstr "Những Vượt Quyền của Hệ Thống" msgid "Others" -msgstr "Khác" +msgstr "Những cái Khác" msgctxt "Operator" msgid "Purge" -msgstr "Đuổi Ra" +msgstr "Thanh Lọc" msgid "No Keying Set Active" -msgstr "Không Có Tập Bứa Ảnh Mẫu Nào Hoạt Động" +msgstr "Không có Bộ Khóa nào đang Hoạt Động cả" msgid "Sync with Outliner" -msgstr "Đồng Bộ với Mục Lục" +msgstr "Đồng Bộ Hóa với Mục lục" msgid "Lift:" -msgstr "Nâng:" +msgstr "Nâng vùng Tối Lên:" msgid "Gamma:" @@ -102670,29 +113545,29 @@ msgstr "Gama:" msgid "Gain:" -msgstr "Tăng Lượng:" +msgstr "Khuếch Đại:" msgid "Active Tools" -msgstr "Dụng Cụ Hoạt Động" +msgstr "Công Cụ đang Hoạt Động" msgid "Color Tags" -msgstr "Thẻ Màu" +msgstr "Thẻ Đánh Dấu Màu" msgid "Offsets" -msgstr "Dịch" +msgstr "Dịch chuyển" msgctxt "Operator" msgid "Set Frame Range to Strips" -msgstr "Đặt Phạm Vi Bức Ảnh đến các Đoạn" +msgstr "Đặt Phạm Vi Khung Hình theo Dải" msgctxt "Operator" msgid "Setup" -msgstr "Cài Đặt" +msgstr "Sắp Đặt" msgctxt "Operator" @@ -102702,22 +113577,22 @@ msgstr "Xây Dựng Lại" msgctxt "Operator" msgid "Refresh All" -msgstr "Nạp Lại Hết" +msgstr "Vẽ Lại Toàn Bộ" msgctxt "Operator" msgid "Sequence Render Animation" -msgstr "Kết Xuất Hoạt Hình Trình Tự" +msgstr "Kết Xuất Phân Đoạn Hoạt Họa trong Trình Tự" msgctxt "Operator" msgid "Toggle Sequencer/Preview" -msgstr "Bật/Tắt Bộ Trình Tự/Dự Khán" +msgstr "Bật/Tắt Trình Phối Hình/Xem Trước" msgctxt "Operator" msgid "Grouped" -msgstr "Được Nhóm Lại" +msgstr "Theo Nhóm" msgctxt "Operator" @@ -102727,22 +113602,22 @@ msgstr "Đường Dẫn/Tập Tin" msgctxt "Operator" msgid "Jump to Previous Strip" -msgstr "Nhảy Đến Đoạn Trước" +msgstr "Nhảy đến Dải Nằm Trước" msgctxt "Operator" msgid "Jump to Next Strip" -msgstr "Nhảy Đến Đoạn Tiếp" +msgstr "Nhảy đến Dải Tiếp Tới" msgctxt "Operator" msgid "Jump to Previous Strip (Center)" -msgstr "Nhảy Đến Đoạn Trước (Tâm)" +msgstr "Nhảy đến Dải Nằm Trước (Trung Tâm)" msgctxt "Operator" msgid "Jump to Next Strip (Center)" -msgstr "Nhảy Đến Đoạn Tiếp (Tâm)" +msgstr "Nhảy đến Dải Tiếp Tới (Trung Tâm)" msgctxt "Operator" @@ -102752,21 +113627,21 @@ msgstr "Phim" msgctxt "Operator" msgid "Image/Sequence" -msgstr "Ảnh/Trình Tự" +msgstr "Hình Ảnh/Trình Tự" msgctxt "Operator" msgid "Fade" -msgstr "Phai" +msgstr "Phai Mờ Dần" msgid "No Items Available" -msgstr "Không Có Mặt Hàng" +msgstr "Không Có Mục nào Hiện Hữu" msgctxt "Operator" msgid "Sound Crossfade" -msgstr "Phai Đổi Âm Thanh" +msgstr "Chuyển Tiếp Âm Thanh Mờ Dần" msgctxt "Operator" @@ -102776,16 +113651,26 @@ msgstr "Đổi Đường Dẫn/Tập Tin" msgctxt "Operator" msgid "Swap Data" -msgstr "Trao Đổi Dữ Liệu" +msgstr "Tráo Đổi Dữ Liệu" + + +msgctxt "Operator" +msgid "Delete Retiming Keys" +msgstr "Xóa các Khóa Tính Lại Thời Gian" + + +msgctxt "Operator" +msgid "Toggle Retiming Keys" +msgstr "Bật/Tắt các Khóa Tính Lại Thời Gian" msgctxt "Operator" msgid "Slip Strip Contents" -msgstr "Nội Dung Đoạn Phim Trượt" +msgstr "Xê Dịch Nội Dung Đoạn Phim" msgid "Anchor X" -msgstr "Dính X" +msgstr "X của Điểm Neo" msgid "%14s" @@ -102797,36 +113682,40 @@ msgstr "Vị Trí X" msgid "Convert to Float" -msgstr "Đổi Sang Số Thật" +msgstr "Đổi Thành Số Thực Float" msgid "Raw" -msgstr "Nguyen Thủy" +msgstr "Dạng Thô" + + +msgid "Preprocessed" +msgstr "Tiền Xử Lý" msgid "Storage" -msgstr "Kho Chứa" +msgstr "Lưu Giữ" msgctxt "Operator" msgid "Set Overlay Region" -msgstr "Chọn Vùng Che Trên" +msgstr "Đặt Địa Phận Vùng Vẽ Lồng" msgid "Muted Strips" -msgstr "Các Đoạn Đước Cắt Tiến" +msgstr "Dải đã Giải Hoạt" msgid "Snap to Strips" -msgstr "Hút Dính đến Đoạn" +msgstr "Bám Dính vào Dải" msgid "Offset:" -msgstr "Dịch:" +msgstr "Dịch Chuyển:" msgid "Power:" -msgstr "Lũy Thừa:" +msgstr "Công Suất/Năng Lượng/Sức Mạnh/Lũy Thừa:" msgid "Slope:" @@ -102835,30 +113724,30 @@ msgstr "Dốc:" msgctxt "Operator" msgid "Set Preview Range to Strips" -msgstr "Đặt Phạm Vi Dự Khán đến các Đoán" +msgstr "Đặt Phạm Vi Xem Trước theo Dải" msgid "Preview as Backdrop" -msgstr "Nền Chiếu Dự Khán" +msgstr "Xem Trước trên Phông Nền" msgid "Preview During Transform" -msgstr "Dự Khán Khi Biến Hóa" +msgstr "Xem Trước Trong Quá Trình Biến Hóa" msgctxt "Operator" msgid "Zoom" -msgstr "Phóng Vào" +msgstr "Thu-Phóng" msgctxt "Operator" msgid "Fit Preview in Window" -msgstr "Làm Dự Khán vừa Cửa Sổ" +msgstr "Đặt Khung Hình Xem Trước khít vừa Cửa Sổ" msgctxt "Operator" msgid "Sequence Render Image" -msgstr "Ảnh Kết Xuất Trình Tự" +msgstr "Hình Ảnh Kết Xuất của Trình Tự" msgctxt "Operator" @@ -102878,27 +113767,27 @@ msgstr "Phải" msgctxt "Operator" msgid "Both Neighbors" -msgstr "Cả Hai Kề" +msgstr "Cả Hai Hàng Xóm" msgctxt "Operator" msgid "Left Neighbor" -msgstr "Kề Trái" +msgstr "Lân Cận Bên Trái" msgctxt "Operator" msgid "Right Neighbor" -msgstr "Kề Phải" +msgstr "Lân Cận Bên Phải" msgctxt "Operator" msgid "Both Sides" -msgstr "Hai Bên" +msgstr "Cả Hai Bên" msgctxt "Operator" msgid "Side of Frame..." -msgstr "Phía của Bức Ảnh..." +msgstr "Vùng Bên của Khung Hình..." msgid "Handle" @@ -102912,12 +113801,12 @@ msgstr "Đoạn Phim..." msgctxt "Operator" msgid "Mask..." -msgstr "Mặt Nạ..." +msgstr "Màn Chắn Lọc..." msgctxt "Operator" msgid "Color" -msgstr "Màu" +msgstr "Màu Sắc" msgctxt "Operator" @@ -102927,7 +113816,7 @@ msgstr "Văn Bản" msgctxt "Operator" msgid "Adjustment Layer" -msgstr "Lớp Sửa Chỉnh" +msgstr "Tầng Điều Chỉnh" msgctxt "Operator" @@ -102937,22 +113826,22 @@ msgstr "Cảnh..." msgctxt "Operator" msgid "Cross" -msgstr "Chéo" +msgstr "Giao Hòa/Hình Thập Tự" msgctxt "Operator" msgid "Gamma Cross" -msgstr "Chéo Gama" +msgstr "Hòa Trộn Gamma" msgctxt "Operator" msgid "Wipe" -msgstr "Lau" +msgstr "Gạt" msgctxt "Operator" msgid "Multicam Selector" -msgstr "Đồ Chọn Đa Máy Quay Phim" +msgstr "Trình Chọn Đa Máy Quay" msgctxt "Operator" @@ -102962,27 +113851,27 @@ msgstr "Điều Khiển Tốc Độ" msgctxt "Operator" msgid "Glow" -msgstr "Hào Quang" +msgstr "Hừng Sáng" msgctxt "Operator" msgid "Gaussian Blur" -msgstr "Mờ Hóa Gauss" +msgstr "Nhòe Mờ Gaus" msgctxt "Operator" msgid "Reload Strips and Adjust Length" -msgstr "znhập Lại Đoạn Lại Và Chỉnh Bề Dài" +msgstr "Tái Nạp các Dải và Điều Chỉnh Chiều Dài" msgctxt "Operator" msgid "Mute Unselected Strips" -msgstr "Cắt Tiếng Các Đoạn Không Được Chọn" +msgstr "Giải Hoạt các Dải Chưa Chọn" msgctxt "Operator" msgid "Unmute Deselected Strips" -msgstr "Bật Tiếng Các Đoạn Chưa Chọn" +msgstr "Kích Hoạt các Dải Chưa Chọn" msgctxt "Operator" @@ -102992,48 +113881,48 @@ msgstr "Vị Trí" msgctxt "Operator" msgid "Rotation" -msgstr "Xoay" +msgstr "Xoay Chiều" msgctxt "Operator" msgid "All Transforms" -msgstr "Hết Biến Hóa" +msgstr "Toàn Bộ các Biến Hóa" msgctxt "Operator" msgid "Scale To Fit" -msgstr "Phóng To Cho Vừa" +msgstr "Đổi Tỷ Lệ để Khít Vừa" msgctxt "Operator" msgid "Scale to Fill" -msgstr "Phóng To cho Vừa" +msgstr "Đổi Tỷ Lệ để Phủ Kín" msgctxt "Operator" msgid "Stretch To Fill" -msgstr "Kéo Ra cho Vừa" +msgstr "Kéo Giãn để Phủ Kín" msgctxt "Operator" msgid "Copy Modifiers to Selection" -msgstr "Chép Cụ Sửa _ổi đến Sự Lựa Chọn" +msgstr "Sao Chép các Bộ Điều Chỉnh sang Phần Lựa Chọn" msgid "Default Fade" -msgstr "Phai Mặc Định" +msgstr "Phai Mờ Dần Mặc Định" msgid "Strip Offset Start" -msgstr "Bắt Đầu Dịch Đoạn" +msgstr "Dịch Chuyển Đầu Dải" msgid "Hold Offset Start" -msgstr "Giữ Bắt Đầu Dịch" +msgstr "Dịch Chuyển Cắt Đầu" msgid "Tracker" -msgstr "Bộ Theo Dõi" +msgstr "Dấu Giám Sát" msgid "Resolutions" @@ -103041,16 +113930,16 @@ msgstr "Độ Phân Giải" msgid "Fractional Preview Zoom" -msgstr "Phóng To Dự Khán Phân Số" +msgstr "Thu-Phóng Vùng Xem Trước theo Tỉ Lệ Phân Số" msgid "Show Separate Color Channels" -msgstr "Hiện Kênh Màu Riêng Nhau" +msgstr "Hiển Thị các Kênh Màu Riêng Biệt" msgctxt "Operator" msgid "Change Scene..." -msgstr "Đổi Cảnh..." +msgstr "Thay Đổi Cảnh..." msgctxt "Operator" @@ -103060,59 +113949,59 @@ msgstr "Đoạn Phim" msgctxt "Operator" msgid "Move/Extend from Current Frame" -msgstr "Di Chuyển/Kéo Ra từ Bức Ảnh Hiện Tại" +msgstr "Di Chuyển/Nới Rộng từ Khung Hình Hiện Tại" msgctxt "Operator" msgid "Hold Split" -msgstr "Giữ Chẻ" +msgstr "Tách Phân có Duy Trì" msgctxt "Operator" msgid "Delete Strip & Data" -msgstr "Xóa Đoạn & Dự Liệu" +msgstr "Xóa Dải & Dữ Liệu" msgctxt "Operator" msgid "Clear Fade" -msgstr "Xóa Phai" +msgstr "Xóa Phai Mờ Dần" msgctxt "Operator" msgid "Toggle Meta" -msgstr "Bật/Tắt Siêu" +msgstr "Bật/Tắt Siêu Dữ Liệu" msgid "Effect Fader" -msgstr "Bộ Phai Hiệu Ứng" +msgstr "Điều Chỉnh Hiệu Ứng Phai Mờ Dần" msgid "Original Frame Range" -msgstr "Phạm Vi Bức Ảnh Ban Đầu" +msgstr "Phạm Vi Khung Hình Gốc" msgid "Pan Angle" -msgstr "Góc Dời" +msgstr "Góc Độ Lia" msgid "Custom Proxy" -msgstr "Đại Lý Tùy Chọn" +msgstr "Tùy Chỉnh Đại Diện" msgid "Add Transition" -msgstr "Thêm Tiến Triển" +msgstr "Thêm Chuyển Cảnh" msgid "Unpack" -msgstr "Gỡ Gói" +msgstr "Mở Gói" msgid "Pack" -msgstr "Gói Lại" +msgstr "Đóng Gói" msgid "Original frame range: %d-%d (%d)" -msgstr "Phạm vi bức ảnh ban đầu: %d-%d (%d)" +msgstr "Phạm vi khung hình ban đầu: %d-%d (%d)" msgid "Source Channel" @@ -103120,24 +114009,28 @@ msgstr "Kênh Nguồn" msgid "Cut To" -msgstr "Cắt Đến" +msgstr "Cắt Tới" msgid "Two or more channels are needed below this strip" -msgstr "Cần có hai kênh trở lên ở dưới đoạn này" +msgstr "Cần hai kênh trở lên nằm dưới dải này" msgid "No active context" -msgstr "Không có bối cảnh hoạt động" +msgstr "Không có ngữ cảnh nào đang hoạt động cả" msgid "No active viewer node" -msgstr "Không có giao điểm màn chiếu hoạt động" +msgstr "Không có nút quan sát (viewer node) nào đang hoạt động cả" + + +msgid "Invalid id" +msgstr "Chỉ danh id không hợp lệ" msgctxt "Text" msgid "Wrap" -msgstr "Dòng Lại" +msgstr "Đảo Chiều" msgctxt "Text" @@ -103147,42 +114040,42 @@ msgstr "Mới" msgctxt "Operator" msgid "Word" -msgstr "Từ Ngữ" +msgstr "Từ" msgctxt "Operator" msgid "Find & Replace..." -msgstr "Tìm & Thay Thế…" +msgstr "Tìm Kiếm & Thay Thế..." msgctxt "Operator" msgid "Jump To..." -msgstr "Nhảy Đến..." +msgstr "Nhảy Tới..." msgctxt "Operator" msgid "Replace All" -msgstr "Thay Thế Hết" +msgstr "Thay Thế Toàn Bộ" msgctxt "Operator" msgid "Top" -msgstr "Trên" +msgstr "Đỉnh" msgctxt "Operator" msgid "Bottom" -msgstr "Dưới" +msgstr "Đáy" msgctxt "Operator" msgid "Line Begin" -msgstr "Bắt Đầu Dòng" +msgstr "Đầu Dòng" msgctxt "Operator" msgid "Line End" -msgstr "Kết Thúc Dòng" +msgstr "Cuối Dòng" msgctxt "Operator" @@ -103192,41 +114085,41 @@ msgstr "Dòng Trước" msgctxt "Operator" msgid "Next Line" -msgstr "Dòng Tiếp" +msgstr "Dòng Tiếp Theo" msgctxt "Operator" msgid "Previous Word" -msgstr "Từ Trước" +msgstr "Từ Đứng Trước" msgctxt "Operator" msgid "Next Word" -msgstr "Từ Tiếp" +msgstr "Từ Tiếp Theo" msgctxt "Operator" msgid "One Object" -msgstr "Một Vật Thể" +msgstr "Một Đối Tượng" msgctxt "Operator" msgid "One Object Per Line" -msgstr "Một Vật Thể Mỗi Hàng" +msgstr "Mỗi Dòng Một Đối Tượng" msgctxt "Operator" msgid "Move Line(s) Up" -msgstr "Di Chuyển (Các) Dòng Lên" +msgstr "Chuyển (các) Dòng Lên Trên" msgctxt "Operator" msgid "Move Line(s) Down" -msgstr "Di Chuyển (Các) Dòng Xuống" +msgstr "Chuyển (các) Dòng Xuống Dưới" msgid "Text: External" -msgstr "Văn Bản: Ngoại Bộ" +msgstr "Văn Bản: Ngoại Biên" msgid "Text: Internal" @@ -103234,7 +114127,7 @@ msgstr "Văn Bản: Nội Bộ" msgid "File: *%s (unsaved)" -msgstr "Tập Tin: *%s (chưa lưu)" +msgstr "Tập Tin: *%s (chưa được lưu)" msgid "File: %s" @@ -103243,81 +114136,81 @@ msgstr "Tập Tin: %s" msgctxt "Operator" msgid "Move Marker" -msgstr "Di Chuyển Ký Hiệu" +msgstr "Di Chuyển Dấu Mốc" msgctxt "Operator" msgid "Duplicate Marker" -msgstr "Bản Sao Ký Hiệu" +msgstr "Nhân Đôi Dấu Mốc" msgctxt "WindowManager" msgid "Keying" -msgstr "Tạo Bức Mẫu" +msgstr "Khóa Hóa" msgctxt "Operator" msgid "Jump to Previous Marker" -msgstr "Nhảy đến Ký Hiệu Trước" +msgstr "Nhảy về Dấu Mốc Trước" msgctxt "Operator" msgid "Jump to Next Marker" -msgstr "Nhảy đến Ký Hiệu Tiếp" +msgstr "Nhảy đến Dấu Mốc Tiếp Theo" msgctxt "Operator" msgid "Duplicate Marker to Scene..." -msgstr "Sao Chép Ký Hiệu đến Cảnh..." +msgstr "Nhân Đôi Dấu Mốc sang Cảnh..." msgctxt "Operator" msgid "Duplicate Marker to Scene" -msgstr "Sao Chép Ký Hiệu đến Cảnh" +msgstr "Nhân Đôi Dấu Mốc sang Cảnh" msgid "Scrubbing" -msgstr "Đang Kéo Đi" +msgstr "Rà Quét" msgid "Limit to Frame Range" -msgstr "Hạn Chế đến Phạm Vi Bức Ảnh" +msgstr "Hạn Chế trong Phạm Vi Khung Hình" msgid "Follow Current Frame" -msgstr "Theo Bức Ảnh Hiện Tại" +msgstr "Đi Theo Khung Hình Hiện Tại" msgid "Play In" -msgstr "Hát Trong" +msgstr "Chơi Trong" msgid "Active Editor" -msgstr "Trình Biên Soạn Hoạt Động" +msgstr "Trình Biên Soạn đang Hoạt Động" msgid "Properties Editor" -msgstr "Trình Biên Soạn Đặc Tính" +msgstr "Trình Biên Soạn Tính Chất" msgid "Only Active Keying Set" -msgstr "Chỉ Sưu Tập Bức Ảnh Mẫu Hoạt Động" +msgstr "Duy Bộ Khóa đang Hoạt Động" msgid "Layered Recording" -msgstr "Thâu Kiểu Lớp" +msgstr "Thu Ghi Phân Tầng" msgid " Operator" -msgstr " Thao Tác" +msgstr " Thao Tác" msgid "Drag:" -msgstr "Lực Kéo:" +msgstr "Kéo Rê:" msgid "Unable to find toolbar group" -msgstr "Không thể tìm được nhóm thanh dụng cụ" +msgstr "Không tìm thấy nhóm thanh công cụ" msgid "" @@ -103327,21 +114220,21 @@ msgid "" "• %s toggles fixed aspect" msgstr "" "%s\n" -"• %s bặt/tắt hút dính khi kéo.\n" -"• %s bật/tắt kéo từ trung tâm.\n" -"• %s bật/tắt tỉ số cạnh hằng số" +"• %s bật/tắt bám dính trong khi kéo rê.\n" +"• %s bật/tắt kéo rê từ trung tâm.\n" +"• %s bật/tắt tỷ lệ tương quan cố định" msgid "Depth:" -msgstr "Độ Sâu:" +msgstr "Chiều/Độ Sâu:" msgid "Taper Start" -msgstr "Bắt Đầu Nắp" +msgstr "Vuốt Thon Khởi Đầu" msgid "Weight: %.3f" -msgstr "Quyền Lượng: %.3f" +msgstr "Trọng lượng: %.3f" msgid "" @@ -103352,87 +114245,92 @@ msgid "" "• Ctrl while dragging to snap.\n" "• Shift while dragging to measure surface thickness" msgstr "" -"Đo khoảng cách vả góc.\n" -"• %s chỗ nào cho việc đo mới.\n" -"• Kéo khúc cây thước để đo một góc.\n" -"• %s để xóa cây thước hoạt động.\n" -"• Ctrl khi kéo để hút dính.\n" -"• Shift khi kéo để đo bề dày bề mặt\"" +"Đo lường khoảng cách và các góc.\n" +"• %s bất cứ chỗ nào/ở đâu cũng dành cho/đối với/để Tạo Mới Đo Lường.\n" +"• Lực Cản/Kéo Rê Thước Đo Phân Đoạn Để/Đến/Tới Đo Lường một Góc Độ.\n" +"• %s Để/Đến/Tới xóa/loại bỏ ¶ đang/Hoạt Động Thước Đo.\n" +"• Ctrl Trong khi Kéo Rê Để/Đến/Tới Bám Dính.\n" +"• Shift/Xê Dịch Trong khi Kéo Rê Để/Đến/Tới Đo Lường bề mặt Độ Dày" msgid "Annotation:" -msgstr "Lời Ghi Chú:" +msgstr "Chú Thích:" msgid "Style Start" -msgstr "Bắt Đầu Phong Cách" +msgstr "Phong cách Đầu" msgid "Gizmos:" -msgstr "Đô Đạc:" +msgstr "Dụng Cụ:" msgid "Miter Outer" -msgstr "Mũ Tế Ngoại" +msgstr "Góc Cắt Bên Ngoài" msgid "Intersections" -msgstr "Vùng Giao Cắt" +msgstr "Giao Cắt" msgid "Angle Snapping Increment" -msgstr "Bước Hút Dính Góc" +msgstr "Gia Lượng Bám Dính vào Góc Độ" msgid "Add cube to mesh interactively" -msgstr "Thêm hình lập phương vào mạng lưới kiểu thao tác" +msgstr "Thêm hình lập phương vào khung lưới một cách tương tác" msgid "Add cone to mesh interactively" -msgstr "Thêm hìng nón vào mạng lưới kiểu thao tác" +msgstr "Thêm hình nón vào khung lưới một cách tương tác" msgid "Add cylinder to mesh interactively" -msgstr "Thêm hình trụ vào mạng lưới kiểu thao tác" +msgstr "Thêm hình trụ vào khung lưới một cách tương tác" msgid "Add sphere to mesh interactively" -msgstr "Thêm hình cầu vào mạng lưới kiểu thao tác" +msgstr "Thêm hình cầu vào khung lưới một cách tương tác" msgctxt "Operator" msgid "Install Application Template..." -msgstr "Lắp Đặt Ứng Dụng Mẫu Bố Cục..." +msgstr "Cài Đặt Bản Mẫu Trình Ứng Dụng..." msgctxt "Operator" msgid "Unused Data-Blocks" -msgstr "Cục Dữ Liệu Không Dùng" +msgstr "Các Khối Dữ Liệu Không Sử Dụng Đến" msgctxt "Operator" msgid "Recursive Unused Data-Blocks" -msgstr "Cục Dữ Liệu Không Dùng Đệ Quy" +msgstr "Các Khối Dữ Liệu Không Sử Dụng Đến một cách Đệ Quy" msgctxt "Operator" msgid "Unused Linked Data-Blocks" -msgstr "Cục Dữ Liệu Được Liên Kết Chưa Dùng" +msgstr "Các Khối Dữ Liệu Kết Nối Không Sử Dụng Đến" msgctxt "Operator" msgid "Recursive Unused Linked Data-Blocks" -msgstr "Cục Dữ Liệu Được Liên Kết Đệ Quy Chưa Sử Dụng" +msgstr "Các Khối Dữ Liệu Kết Nối Không Sử Dụng Đến một cách Đệ Quy" msgctxt "Operator" msgid "Unused Local Data-Blocks" -msgstr "Cục Dữ Liệu Địa Phương Chưa Dùng" +msgstr "Các Khối Dữ Liệu Không Sử Dụng Đến" msgctxt "Operator" msgid "Recursive Unused Local Data-Blocks" -msgstr "Cục Dữ Liệu Địa Phương Đệ Quy Chưa Dùng" +msgstr "Các Khối Dữ Liệu Cục Bộ Không Sử Dụng Đến một cách Đệ Quy" + + +msgctxt "WindowManager" +msgid "New" +msgstr "Mới" msgctxt "Operator" @@ -103442,7 +114340,7 @@ msgstr "Thoát" msgctxt "Operator" msgid "Last Session" -msgstr "Phiên Chạy Cuối" +msgstr "Phiên Trước" msgctxt "Operator" @@ -103452,7 +114350,7 @@ msgstr "Tự Động Lưu..." msgctxt "Operator" msgid "Render Animation" -msgstr "Kết Xuất Hoạt Hình" +msgstr "Kết Xuất Hoạt Họa" msgctxt "Operator" @@ -103462,66 +114360,66 @@ msgstr "Kết Xuất Âm Thanh..." msgctxt "Operator" msgid "View Render" -msgstr "Hiện Kết Xuất" +msgstr "Xem Kết Xuất" msgctxt "Operator" msgid "View Animation" -msgstr "Hiện Hoạt Hình" +msgstr "Xem Hoạt Họa" msgctxt "Operator" msgid "Adjust Last Operation..." -msgstr "Chỉnh Thao Tác Cuối..." +msgstr "Điều Chỉnh Thao Tác Trước Đây..." msgctxt "Operator" msgid "Repeat History..." -msgstr "Lịch Sử Làm Lại..." +msgstr "Lịch Sử Nhắc Lại..." msgctxt "Operator" msgid "Menu Search..." -msgstr "Tìm Kiếm Danh Bạ..." +msgstr "Tìm Kiếm Trình Đơn..." msgctxt "Operator" msgid "Rename Active Item..." -msgstr "Đổi Tên Mặt Hàng Hoạt Động..." +msgstr "Đổi Tên Phần Tử đang Hoạt Động..." msgctxt "Operator" msgid "Batch Rename..." -msgstr "Đổi Tên Đợt..." +msgstr "Đổi Tên Hàng Loạt..." msgctxt "Operator" msgid "Preferences..." -msgstr "Tùy Chọn..." +msgstr "Cài Đặt Sở Thích..." msgctxt "Operator" msgid "Reorder to Front" -msgstr "Sắp Xếp đến Phía Trước" +msgstr "Đổi Trật Tự về Phía Trước" msgctxt "Operator" msgid "Reorder to Back" -msgstr "Sắp Xếp đến Phía Sau" +msgstr "Đổi Trật Tự về Phía Sau" msgctxt "Operator" msgid "Previous Workspace" -msgstr "Công Trường Trước" +msgstr "Không Gian Làm Việc Trước Đây" msgctxt "Operator" msgid "Next Workspace" -msgstr "Công Trường Tiếp" +msgstr "Không Gian Làm Việc Tiếp Theo" msgid "Marker Name" -msgstr "Tên Ký Hiệu" +msgstr "Tên Dấu Mốc" msgctxt "Operator" @@ -103529,6 +114427,11 @@ msgid "Back to Previous" msgstr "Trở Lại Trước" +msgctxt "Operator" +msgid "Save Incremental" +msgstr "Lưu Tịnh Tiến" + + msgctxt "Operator" msgid "Save Copy..." msgstr "Lưu Bản Sao..." @@ -103536,7 +114439,12 @@ msgstr "Lưu Bản Sao..." msgctxt "Operator" msgid "General" -msgstr "Tổng Quát" +msgstr "Chung Chung" + + +msgctxt "Operator" +msgid "Load Factory Blender Settings" +msgstr "Nạp Cài Đặt của Xưởng Sản Xuất Blender" msgctxt "Operator" @@ -103549,9 +114457,14 @@ msgid "Alembic (.abc)" msgstr "Alembic (.abc)" +msgctxt "Operator" +msgid "Universal Scene Description (.usd*)" +msgstr "Miêu Tả Cảnh Phổ Quát (.usd*)" + + msgctxt "Operator" msgid "SVG as Grease Pencil" -msgstr "SVG là Bút Sáp" +msgstr "SVG thành Bút Chì Dầu" msgctxt "Operator" @@ -103561,12 +114474,12 @@ msgstr "Wavefront (.obj)" msgctxt "Operator" msgid "STL (.stl) (experimental)" -msgstr "STL (.stl) (đồ thí nghiệm)" +msgstr "STL (.stl) (thí nghiệm)" msgctxt "Operator" msgid "Render Image" -msgstr "Kết Xuất Ảnh" +msgstr "Kết Xuất Hình Ảnh" msgctxt "Operator" @@ -103576,78 +114489,91 @@ msgstr "Tìm Kiếm Thao Tác..." msgctxt "Operator" msgid "Release Notes" -msgstr "Lời Dẫn Phiên Bàn Này" +msgstr "Nhật Ký Phát Hành" msgctxt "Operator" msgid "Report a Bug" -msgstr "Báo Cáo Sai Lầm" +msgstr "Báo Cáo Lỗi" msgid "Sequence Strip Name" -msgstr "Tên Đoạn Trình Tự" +msgstr "Tên của Dải Trình Tự" msgid "No active item" -msgstr "Không có mặt hàng hoạt động" +msgstr "Không có phần tử nào đang hoạt động cả" msgid "No active marker" -msgstr "Không có ký hiệu hoạt động" +msgstr "Không có dấu mốc nào đang hoạt động cả" msgctxt "Operator" msgid "Grease Pencil as SVG" -msgstr "Bút Sáp là SVG" +msgstr "Bút Chì Dầu thành SVG" msgctxt "Operator" msgid "Grease Pencil as PDF" -msgstr "Bút Sáp là PDF" +msgstr "Bút Chì Dầu thành PDF" msgctxt "Operator" msgid "Developer Documentation" -msgstr "Tài Liệu Người Phát Triển" +msgstr "Tài Liệu của Nhà Sản Xuất" msgctxt "Operator" msgid "Developer Community" -msgstr "Công Cộng Phát Triển" +msgstr "Cộng Đồng Lập Trình Viên" msgctxt "Operator" msgid "Python API Reference" -msgstr "Tham Khảo API Python" +msgstr "Tài Liệu Tham Chiếu API của Python" msgid "Node Label" -msgstr "Nhãn Giao Điểm" +msgstr "Nhãn của Nút" msgid "NLA Strip Name" -msgstr "Tên NLA Đoạn" +msgstr "Tên Dải NLA" + + +msgctxt "Operator" +msgid "Load Factory %s Settings" +msgstr "Nạp Cài Đặt %s của Xưởng Sản Xuất" msgid "Auto-Save Preferences" -msgstr "Tưđ Động Lưu Tùy Chọn" +msgstr "Tự Động Lưu các Cài Đặt Sở Thích" msgctxt "Operator" msgid "Revert to Saved Preferences" -msgstr "Hoàn Lại đến Tùy Chọn Được Lưu" +msgstr "Quay Trở Lại các Cài Đặt Sở Thích đã Lưu Trước Đây" msgid "Splash Screen" -msgstr "Ảnh Quảng Cáo" +msgstr "Màn Hình Chào Đón" msgid "User Tooltips" -msgstr "Đề Thị Người Dùng" +msgstr "Chú Thích Công Cụ Người Dùng" + + +msgid "Sort by Most Recent" +msgstr "Sắp Xếp theo trật tự Gần Đây Nhất" + + +msgid "Subpixel Anti-Aliasing" +msgstr "Khử Răng Cưa ở mức Điểm Ảnh Thứ" msgid "Hinting" -msgstr "Mẹo" +msgstr "Gợi Ý" msgid "New Data" @@ -103655,15 +114581,19 @@ msgstr "Dữ Liệu Mới" msgid "Render In" -msgstr "Kết Xuất Trong" +msgstr "Kết Xuất Bên Trong" msgid "Scene Statistics" -msgstr "Thống Kê Cảnh" +msgstr "Thống Kê về Cảnh" + + +msgid "Scene Duration" +msgstr "Thời Lượng Cảnh" msgid "System Memory" -msgstr "Bộ Nhớ Hệ Thống" +msgstr "Bộ Nhớ của Hệ Thống" msgid "Video Memory" @@ -103679,19 +114609,23 @@ msgstr "Tầng Đỉnh" msgid "Sub Level" -msgstr "Hạ Tầng" +msgstr "Tầng Dưới/Phụ" msgid "Link Materials To" -msgstr "Liên Kết Vật Liệu Đến" +msgstr "Kết Nối Nguyên Vật Liệu Với" msgid "Align To" -msgstr "Sắp Xếp Với" +msgstr "Căn Chỉnh Với" msgid "Instance Empty Size" -msgstr "Cỡ Rỗng Của Thực Thể" +msgstr "Kích Thước của Thực Thể Trống Rỗng" + + +msgid "Lock Adjust" +msgstr "Điều Chỉnh Khóa" msgid "Default Color" @@ -103699,47 +114633,59 @@ msgstr "Màu Mặc Định" msgid "Eraser Radius" -msgstr "Bán Kính Cục Gôm" +msgstr "Bán Kính của Đầu Tẩy" + + +msgid "Custom Gradient" +msgstr "Dốc Màu Tùy Chỉnh" + + +msgid "Auto-Offset" +msgstr "Tự Động Dịch Chuyển" + + +msgid "Preview Resolution" +msgstr "Xem Trước Độ Phân Giải" msgid "Sculpt Overlay Color" -msgstr "Khắc Màu Lớp Che" +msgstr "Màu Vẽ Lồng trong Điêu Khắc" msgid "Minimum Grid Spacing" -msgstr "Cách Đồ Thị Cực Tiểu" +msgstr "Phân Khoảng Khung Lưới Đồ Thị Tối Thiểu" msgid "Only Insert Needed" -msgstr "Chỉ Chèn Cần Thiết" +msgstr "Chèn Thêm Nếu Cần" msgid "Auto-Keyframing" -msgstr "Bức Ảnh Mẫu-Tự Động" +msgstr "Tự Động Khóa Hóa" msgid "Show Warning" -msgstr "Hiện Cảnh Báo" +msgstr "Hiển Thị Cảnh Báo" msgid "Only Insert Available" -msgstr "Chỉ Chèn Có Thể Dùng" +msgstr "Chỉ Chèn Thêm Nếu Có Sẵn" msgid "Enable in New Scenes" -msgstr "Bật trong Cảnh Mới" +msgstr "Kích Hoạt trong các Cảnh Mới" msgid "Unselected Opacity" -msgstr "Độ Đục Chưa Được Chọn" +msgstr "Độ Đục của cái Không được Chọn" msgid "Default Smoothing Mode" -msgstr "Chế Độ Mịn Hóa Mặc Định" +msgstr "Chế Độ Làm Mịn Mặc Định" msgid "Default Interpolation" -msgstr "Suy Nội Mặc Định" +msgstr "Nội Suy Mặc Định" msgid "Default Handles" @@ -103747,72 +114693,84 @@ msgstr "Tay Cầm Mặc Định" msgid "XYZ to RGB" -msgstr "XYZ đến RGB" +msgstr "XYZ sang RGB" msgid "Mixing Buffer" -msgstr "Đệm Pha Trộn" +msgstr "Bộ Đệm Pha Trộn" msgid "Sample Format" -msgstr "Định Dạng Mẫu Vật" +msgstr "Định dạng mẫu vật" msgid "Undo Memory Limit" -msgstr "Hủy Bước Giới Hạn Bộ Nhớ" +msgstr "Giới Hạn Bộ Nhớ Hoàn Tác" msgid "Console Scrollback Lines" -msgstr "Cuộn Lại Của Dòng Diện Điều Khiển" +msgstr "Số Dòng Cuộn Lại trong Bàn Giao Tiếp" msgid "Garbage Collection Rate" -msgstr "Tốc Độ Gồm Rác" +msgstr "Tần Số Thu Dọn Rác" msgid "Cache Limit" -msgstr "Giới Hạn Đệm Chứa" +msgstr "Giới Hạn Bộ Nhớ Đệm" msgid "Text Info Overlay" -msgstr "Lớp Che Trên Thông Tin Văn Bản" +msgstr "Vẽ Lồng Văn Bản Thông Tin" msgid "View Name" -msgstr "Hiện Tên" +msgstr "Tên Góc Nhìn" msgid "Playback Frame Rate (FPS)" -msgstr "Tốc Độ Hát Lại (Bức Ảnh/Giây)" +msgstr "Tỷ Lệ Khung Hình Chơi Lại (FPS)" + + +msgid "3D Viewport Axes" +msgstr "Các Trục Cổng Nhìn 3D" msgid "Smooth Wires" -msgstr "Sợi Dây Mịn" +msgstr "Đường Dây Mềm Mại" msgid "Limit Size" -msgstr "Hạn Chế Kích Cỡ" +msgstr "Giới Hạn Kích Thước" msgctxt "Operator" msgid "Install..." -msgstr "Lắp Đặt..." +msgstr "Cài Đặt..." + + +msgid "Shadow Width" +msgstr "Chiều Rộng Bóng Tối" msgid "Axis X" msgstr "Trục X" +msgid "View Align" +msgstr "Căn Chỉnh theo Góc Nhìn" + + msgid "Shadow Offset X" -msgstr "Dịch Bóng Tối X" +msgstr "Dịch Chuyển Bóng Tối Chiều X" msgid "Panel Title" -msgstr "Tựa Bảng" +msgstr "Tiêu Đề của Bảng" msgid "Widget Label" -msgstr "Nhãn Khiển Tố" +msgstr "Nhãn của Thành Tố Điều Khiển" msgid "Temporary Files" @@ -103820,116 +114778,167 @@ msgstr "Tập Tin Tạm Thời" msgid "Render Output" -msgstr "Ngõ Ra Kết Xuất" +msgstr "Đầu Ra của Kết Xuất" msgid "Render Cache" -msgstr "Đệm Chứa Kết Xuất" +msgstr "Bộ Đệm Nhớ của Kết Xuất" + + +msgid "Program" +msgstr "Chương Trình" + + +msgid "Arguments" +msgstr "Tham Số" msgid "I18n Branches" -msgstr "Các Nhánh I18n" +msgstr "Các Chi Nhánh Phiên Dịch I18n" msgid "Excluded Paths" -msgstr "Các Đường Dẫn Bị Loại Trừ" +msgstr "Đường Dẫn Loại Trừ Ra" + + +msgid "Auto-Save" +msgstr "Tự-Động Lưu" msgid "Timer (Minutes)" -msgstr "Đồng Hồ (Phút)" +msgstr "Đồng Hồ Bấm Giờ (Số Phút)" msgid "Default To" -msgstr "Mặc Định Đến" +msgstr "Mặc Định Là" msgid "Show Locations" -msgstr "Hiện Vị Trí" +msgstr "Hiển Thị Vị Trí" msgid "Double Click Speed" -msgstr "Tộc Độ Bấm Hai Lần" +msgstr "Tốc Độ Nháy Kép" msgid "Zoom Method" -msgstr "Phương Pháp Phóng Vào" +msgstr "Phương Pháp Thu-Phóng" msgid "Pan Sensitivity" -msgstr "Cảm Biến Dời Đi" +msgstr "Độ Mẫn Cảm với Hành Động Lia" msgid "Swap Y and Z Axes" -msgstr "Trao đổi Trục Y và Z" +msgstr "Tráo Đổi Trục Y và Z" msgid "Invert Axis Pan" -msgstr "Đảo Nghịch Dời Trục" +msgstr "Đảo Ngược Trục Lia" msgid "Invert Pan Axis" -msgstr "Đảo Nghịch Trục Dời" +msgstr "Đảo Nghịch Trục Lia" + + +msgid "The add-on to use extensions is disabled! See:" +msgstr "Trình bổ sung để sử dụng các tiện ích mở rộng đã bị tắt rồi! Xin xem:" msgid "No custom MatCaps configured" -msgstr "Chưa có vật liệu bắt nào tùy chọn được cấu hình" +msgstr "Không có MatCap tùy chỉnh nào được định cấu hình cả" msgid "No custom HDRIs configured" -msgstr "Chưa có HDRI nào tùy chọn được cấu hình" +msgstr "Không có HDRI tùy chỉnh nào được định cấu hình cả" msgid "No custom Studio Lights configured" -msgstr "Chưa có Đèn Xưởng nào tùy chọn được cấu hình" +msgstr "Không có Bố Trí Ánh Sáng Studio tùy chỉnh nào được định cấu hình cả" msgid "Use Light" -msgstr "Dùng Đèn" +msgstr "Sử Dụng Ánh Sáng" msgctxt "Operator" msgid "Save as Studio light" -msgstr "Lưu như Đèn Xưởng" +msgstr "Lưu Thành Ánh Sáng Studio" + + +msgctxt "Operator" +msgid "Load Factory Blender Preferences" +msgstr "Nạp Cài Đặt Sở Thích Blender của Xưởng Sản Xuất" + + +msgid "Microsoft Store installation" +msgstr "Cài đặt Microsoft Store" + + +msgid "Use Windows 'Default Apps' to associate with blend files" +msgstr "Sử dụng 'Ứng Dụng Mặc Định' của Windows để liên kết với các tập tin blend" + + +msgid "Open blend files with this Blender version" +msgstr "Mở các tập tin blend bằng phiên bản Blender này" + + +msgctxt "Operator" +msgid "Register" +msgstr "Đăng Ký" + + +msgctxt "Operator" +msgid "Unregister" +msgstr "Hủy Đăng Ký" + + +msgid "For All Users" +msgstr "Cho Toàn Bộ các Người Dùng" msgid "Player" -msgstr "Bộ Hát Lại" +msgstr "Máy Chơi Lại" msgid "Wheel" -msgstr "Nút Cuộn Vào" +msgstr "Bánh Xe" msgid "Invert Wheel Zoom Direction" -msgstr "Đảo Nghịch Hướng Phóng Nút Cuộn" +msgstr "Đảo Ngịch Hướng Thu-Phóng của Bánh Xe" msgid "Fly/Walk" -msgstr "Bay/Đi Bộ" +msgstr "Bay Lượn/Đi Bộ" msgid "Multiple add-ons with the same name found!" -msgstr "Tìm được vài đồ kèm có cùng tên!" +msgstr "Phát hiện thấy có nhiều trình bổ sung có tên giống nhau!" msgid "Delete one of each pair to resolve:" -msgstr "Xóa một cái của mỗi gặp đôi để giải duyết vấn đề:" +msgstr "Xóa một cái trong mỗi bộ đôi để giải quyết vấn đề:" msgid "Missing script files" -msgstr "Tập Tin văn thảo mất tích" +msgstr "Các tập tin về tập lệnh bị thất lạc" msgid "No custom %s configured" -msgstr "Chưa có %s tùy chọn được cấu hìnhs" +msgstr "Không có %s tùy chỉnh được cấu hình" msgid ":" msgstr ":" +msgid "Load Factory %s Preferences" +msgstr "Nạp Cài Đặt Sở Thích %s của Xưởng Sản Xuất" + + msgid "Color Set %d" -msgstr "Tập Hợp Màu %d" +msgstr "Bộ Màu Sắc %d" msgid "Color %d" @@ -103937,7 +114946,7 @@ msgstr "Màu %d" msgid "Description:" -msgstr "Mô Tả:" +msgstr "Miêu Tả:" msgid "Location:" @@ -103953,19 +114962,23 @@ msgstr "Tác Giả:" msgid "Version:" -msgstr "Phiên Bản" +msgstr "Phiên Bản:" msgid "Warning:" -msgstr "Cảnh Báo:" +msgstr "Cảnh Cáo:" msgid "Internet:" msgstr "Liên Mạng Thế Giới:" +msgid "User:" +msgstr "Người Dùng:" + + msgid "description" -msgstr "mô tả" +msgstr "miêu tả" msgid "location" @@ -103978,86 +114991,86 @@ msgstr "Tài Liệu" msgid "Preferences:" -msgstr "Tùy Chọn:" +msgstr "Cài Đặt Sở Thích:" msgid "Error (see console)" -msgstr "Sai Lầm (xem diện điều khiển)" +msgstr "Lỗi xảy ra (xem bàn giao tiếp)" msgctxt "Operator" msgid "Interactive Mirror" -msgstr "Gương Tương Tác" +msgstr "Tương Tác Phản Quang Phản Chiếu Đối Xứng" msgctxt "Operator" msgid "Selection to Active" -msgstr "Được Chọn đến Hoạt Động" +msgstr "Lựa Chọn vào cái đang Hoạt Động" msgctxt "Operator" msgid "Cursor to Active" -msgstr "Con Trỏ đến Hoạt Động" +msgstr "Con Trỏ sang cái đang Hoạt Động" msgctxt "Operator" msgid "Perspective/Orthographic" -msgstr "Chiếu Phối Cảnh/Trực Giao Cảnh" +msgstr "Phối Cảnh/Trực Giao" msgctxt "Operator" msgid "Viewport Render Image" -msgstr "Màn Chiếu - Kết Xuất Ảnh" +msgstr "Kết Xuất Hình Ảnh trong Cổng Nhìn" msgctxt "Operator" msgid "Viewport Render Keyframes" -msgstr "Màn Chiếu - Kết Xuất Bức Ảnh Mẫu" +msgstr "Những Khung Khóa Kết Xuất của Cổng Nhìn" msgctxt "Operator" msgid "Toggle Local View" -msgstr "Bật/Tắt Màn Địa Phương" +msgstr "Bật/Tắt Góc Nhìn Cục Bộ" msgctxt "Operator" msgid "Active Camera" -msgstr "Máy Quay Phim Hoạt Động" +msgstr "Máy Quay đang Hoạt Động" msgctxt "Operator" msgid "Orbit Opposite" -msgstr "Qũy Đạo Ngược" +msgstr "Quỹ Đạo Ngược Chiều" msgctxt "Operator" msgid "Zoom Region..." -msgstr "Phóng Vào Vùng..." +msgstr "Thu-Phóng trên Khu Vực..." msgctxt "Operator" msgid "Dolly View..." -msgstr "Trượt Màn..." +msgstr "Lướt Khung Nhìn..." msgctxt "Operator" msgid "Align Active Camera to View" -msgstr "Sắp Xếp Máy Quay Phim Hoạt Động với Màn" +msgstr "Căn Chỉnh Máy Quay Phim đang Hoạt Động vào Góc Nhìn" msgctxt "Operator" msgid "Align Active Camera to Selected" -msgstr "Sắp Xếp Máy Quay Phim Hoạt Động đến Được Chọn" +msgstr "Căn Chỉnh Máy Quay Phim đang Hoạt Động vào cái Được Chọn" msgctxt "Operator" msgid "Clipping Region..." -msgstr "Vùng Cắt..." +msgstr "Cắt Xén theo Vùng..." msgctxt "Operator" msgid "Render Region..." -msgstr "Vùng Kết Xuất..." +msgstr "Kết Xuất theo Vùng..." msgctxt "Operator" @@ -104067,27 +115080,27 @@ msgstr "Con Cái" msgctxt "Operator" msgid "Extend Parent" -msgstr "Kéo Ra Phụ Huynh" +msgstr "Nới Rộng Phụ Huynh" msgctxt "Operator" msgid "Extend Child" -msgstr "Kéo Ra Con Cái" +msgstr "Nới Rộng Con Cái" msgctxt "Operator" msgid "Select All by Type" -msgstr "Chọn Hết bằng Loại" +msgstr "Chọn Toàn Bộ theo Thể Loại" msgctxt "Operator" msgid "Select Active Camera" -msgstr "Chọn Máy Quay Phim Hoạt Động" +msgstr "Chọn Máy Quay Phim đang Hoạt Động" msgctxt "Operator" msgid "Select Pattern..." -msgstr "Chọn Gương Mẫu..." +msgstr "Chọn theo Kiểu Mẫu..." msgctxt "Operator" @@ -104097,92 +115110,117 @@ msgstr "Mục Tiêu Ràng Buộc" msgctxt "Operator" msgid "Roots" -msgstr "Rễ" +msgstr "Gốc" msgctxt "Operator" msgid "Tips" -msgstr "Đỉnh" +msgstr "Ngọn" msgctxt "Operator" msgid "Face Regions" -msgstr "Vùng Mặt" +msgstr "Các Vùng của Mặt" msgctxt "Operator" msgid "Loose Geometry" -msgstr "Hình Dạng Rời Ra" +msgstr "Hình Học Rời Rạc" msgctxt "Operator" msgid "Interior Faces" -msgstr "Mặt Nội" +msgstr "Các Mặt Bên Trong" msgctxt "Operator" msgid "Faces by Sides" -msgstr "Chọn Mặt Bằng Cạnh" +msgstr "Các Mặt Theo Số Cạnh" msgctxt "Operator" msgid "Ungrouped Vertices" -msgstr "Đỉnh Chưa Nhóm Lại" +msgstr "Điểm Đỉnh Chưa Nhóm" msgctxt "Operator" msgid "Next Active" -msgstr "Hoạt Động Tiếp" +msgstr "Cái Hoạt Động Tiếp Theo" msgctxt "Operator" msgid "Previous Active" -msgstr "Hoạt Động Trước" +msgstr "Cái Hoạt Động Trước Đây" msgctxt "Operator" msgid "Linked Flat Faces" -msgstr "Mặt Bằng Phẳng Được Liên Kết" +msgstr "Các Mặt Phẳng Bẹt Kết Nối" msgctxt "Operator" msgid "Side of Active" -msgstr "Cạnh Của Hoạt Động" +msgstr "Bên của cái đang Hoạt Động" + + +msgctxt "Operator" +msgid "By Attribute" +msgstr "Theo Thuộc Tính" msgctxt "Operator" msgid "Similar" -msgstr "Giống" +msgstr "Tương Tự" + + +msgctxt "Operator" +msgid "First" +msgstr "Đầu" + + +msgctxt "Operator" +msgid "Last" +msgstr "Cuối" msgctxt "Operator" msgid "Set Color Attribute" -msgstr "Đặt Đặc Điểm Màu" +msgstr "Đặt Thuộc Tính Màu" msgctxt "Operator" msgid "Levels" -msgstr "Tầng" +msgstr "Mức Độ/Số Tầng Bậc" + + +msgctxt "Operator" +msgid "Hue/Saturation/Value" +msgstr "Sắc Màu/Độ Bão Hòa/Giá Trị" + + +msgctxt "Operator" +msgid "Brightness/Contrast" +msgstr "Độ Sáng/Độ Tương Phản" msgctxt "Operator" msgid "Endpoints" -msgstr "Điểm Kết Thúc" +msgstr "Điểm Cuối" msgctxt "Operator" msgid "Grow" -msgstr "Lợn Lên" +msgstr "Phát Triển/Mọc Dài" msgctxt "Operator" msgid "Plane" -msgstr "Mặt Phẳng" +msgstr "Bình Diện" msgctxt "Operator" msgid "Cube" -msgstr "Lập Phương" +msgstr "Khối Lập Phương" msgctxt "Operator" @@ -104212,12 +115250,12 @@ msgstr "Hình Xuyến" msgctxt "Operator" msgid "Grid" -msgstr "Đồ Thị" +msgstr "Khung Lưới Đồ Thị" msgctxt "Operator" msgid "Monkey" -msgstr "Khỉ" +msgstr "Đầu Khỉ" msgctxt "Operator" @@ -104227,47 +115265,52 @@ msgstr "Bezier" msgctxt "Operator" msgid "Nurbs Curve" -msgstr "Cong NURBS" +msgstr "Đường Cong Nurbs" msgctxt "Operator" msgid "Nurbs Circle" -msgstr "Vòng Tròn NURBS" +msgstr "Vòng Tròn Nurbs" msgctxt "Operator" msgid "Path" -msgstr "Đường Cong" +msgstr "Đường Đi/Dẫn" msgctxt "Operator" msgid "Empty Hair" -msgstr "Tóc Rỗng" +msgstr "Tóc Trống Rỗng" + + +msgctxt "Operator" +msgid "Fur" +msgstr "Lông Lá" msgctxt "Operator" msgid "Nurbs Surface" -msgstr "Mặt NURBS" +msgstr "Bề Mặt Nurbs" msgctxt "Operator" msgid "Nurbs Cylinder" -msgstr "Hình Trụ NURBS" +msgstr "Hình Trụ Nurbs" msgctxt "Operator" msgid "Nurbs Sphere" -msgstr "Hình Cầu NURBS" +msgstr "Hình Cầu Nurbs" msgctxt "Operator" msgid "Nurbs Torus" -msgstr "Hình Xuyến NURBS" +msgstr "Hình Xuyến Nurbs" msgctxt "Operator" msgid "Single Bone" -msgstr "Một Xương" +msgstr "Đơn Xương" msgctxt "Operator" @@ -104277,12 +115320,12 @@ msgstr "Máy Quay Phim" msgctxt "Operator" msgid "Import OpenVDB..." -msgstr "Nhấp OpenVDB..." +msgstr "Nhập Khẩu OpenVDB..." msgctxt "Volume" msgid "Empty" -msgstr "Thể Tích Rỗng" +msgstr "Trống Rỗng" msgctxt "Operator" @@ -104297,27 +115340,27 @@ msgstr "Tham Chiếu" msgctxt "Operator" msgid "Background" -msgstr "Nền" +msgstr "Nền Sau" msgctxt "Operator" msgid "Make Local..." -msgstr "Làm Địa Phương..." +msgstr "Cục Bộ Hóa..." msgctxt "Operator" msgid "Delete Keyframes..." -msgstr "Xóa Bức Ảnh Mẫu…" +msgstr "Xóa các Khung Khóa..." msgctxt "Operator" msgid "Clear Keyframes..." -msgstr "Xóa Hết Bức Ảnh Mẫu..." +msgstr "Xóa Khung Khóa..." msgctxt "Operator" msgid "Change Keying Set..." -msgstr "Đổi Tập Bức Ảnh Mẫu..." +msgstr "Đổi Bộ Khóa..." msgctxt "Operator" @@ -104327,22 +115370,22 @@ msgstr "Nướng Hành Động..." msgctxt "Operator" msgid "Bake Mesh to Grease Pencil..." -msgstr "Nướng Mạng Lưới đến Bút Sáp..." +msgstr "Nướng Khung Lưới thành Bút Chì Dầu..." msgctxt "Operator" msgid "Bake Object Transform to Grease Pencil..." -msgstr "Nướng Biến Hóa Vật Thể đến Bút Sáp..." +msgstr "Nướng Biến Hóa của Đối Tượng thành Bút Chì Dầu..." msgctxt "Operator" msgid "Change Shape" -msgstr "Đổi Dạng" +msgstr "Đổi Hình Dạng" msgctxt "Operator" msgid "Copy from Active" -msgstr "Chép Từ Hoạt Động" +msgstr "Sao Chép từ cái đang Hoạt Động" msgctxt "Operator" @@ -104357,21 +115400,21 @@ msgstr "Kết Nối" msgctxt "Operator" msgid "Origin" -msgstr "Góc Tọa Độ" +msgstr "Tọa Độ Gốc" msgctxt "Operator" msgid "Rename Active Object..." -msgstr "Đổi Tên Vật Thể Hoạt Động..." +msgstr "Đổi Tên Đối Tượng đang Hoạt Động..." msgctxt "Operator" msgid "Flat" -msgstr "Bằng Phẳng" +msgstr "Phẳng Bẹt" msgid "Visual Transform" -msgstr "Biến Hóa Thị Giác" +msgstr "Biến Hóa Trực Quan" msgid "Parent Inverse" @@ -104380,42 +115423,46 @@ msgstr "Đảo Nghịch Phụ Huynh" msgctxt "Operator" msgid "Remove Unused Material Slots" -msgstr "Xóa Các Khe Vật Liệu Không Dùng" +msgstr "Xóa các khe chất liệu không sử dụng đến" msgctxt "Operator" msgid "Object" -msgstr "Vật Thể" +msgstr "Đối Tượng" msgctxt "Operator" msgid "Object & Data" -msgstr "Vật Thể & Dữ Liệu" +msgstr "Đối Tượng & Dữ Liệu" msgctxt "Operator" msgid "Object & Data & Materials" -msgstr "Vật Thể & Dữ Liệu & Vật Liệu" +msgstr "Đối Tượng & Dữ Liệu & Nguyên Vật Liệu" msgctxt "Operator" msgid "Materials" -msgstr "Vật Liệu" +msgstr "Nguyên Vật Liệu" msgctxt "Operator" msgid "Object Animation" -msgstr "Hoạt Hình Vật Thể" +msgstr "Hoạt họa của Đối Tượng" msgctxt "Operator" msgid "Object Data Animation" -msgstr "Hoạt Hình Dữ Liệu Vật Thể" +msgstr "Hoạt Họa Dữ Liệu của Đối Tượng" msgctxt "Operator" msgid "Copy UV Maps" -msgstr "Chép Bản Đồ UV" +msgstr "Sao Chép Ánh Xạ UV" + + +msgid "Sculpt Curves" +msgstr "Điêu Khắc Đường Cong" msgctxt "Operator" @@ -104425,47 +115472,47 @@ msgstr "Thêm Nhóm Mới" msgctxt "Operator" msgid "Lock Selected" -msgstr "Khóa Được Chọn" +msgstr "Khóa cái Được Chọn" msgctxt "Operator" msgid "Lock Only Selected" -msgstr "Khóa Chỉ Được Chọn" +msgstr "Duy Khóa cái Được Chọn" msgctxt "Operator" msgid "Lock Only Unselected" -msgstr "Khóa Chỉ Không Được Chọn" +msgstr "Duy Khóa cái Chưa Được Chọn" msgctxt "Operator" msgid "Unlock Selected" -msgstr "Mở Khóa Được Chọn" +msgstr "Tháo Khóa cái Được Chọn" msgctxt "Operator" msgid "Unlock Unselected" -msgstr "Mở Khóa Chưa Chọn" +msgstr "Tháo Khóa cái Chưa Được Chọn" msgctxt "Operator" msgid "Invert Locks" -msgstr "Đảo Nghịch Khóa" +msgstr "Đảo Ngược Khóa" msgctxt "Operator" msgid "Normalize All" -msgstr "Đơn Vị Hóa Hết" +msgstr "Bình Thường Hóa Toàn Bộ" msgctxt "Operator" msgid "Normalize" -msgstr "Đơn Vị Hóa" +msgstr "Bình Thường Hóa" msgctxt "Operator" msgid "Clean" -msgstr "Làm Sạch" +msgstr "Dọn Dẹp" msgctxt "Operator" @@ -104479,17 +115526,57 @@ msgstr "Tổng Giới Hạn" msgid "Locks" -msgstr "Ổ Khóa" +msgstr "Khóa" + + +msgctxt "Operator" +msgid "Sphere" +msgstr "Hình Cầu" + + +msgctxt "Operator" +msgid "Box Show" +msgstr "Hiện Hình Hộp" + + +msgctxt "Operator" +msgid "Toggle Visibility" +msgstr "Bật/Tắt Tầm Nhìn" + + +msgctxt "Operator" +msgid "Hide Active Face Set" +msgstr "Ẩn Giấu các Mặt Ấn Định đang Hoạt Động" msgctxt "Operator" msgid "Invert Visible" -msgstr "Đảo Nghịch Hiển Thị" +msgstr "Đảo Ngược Tính Hữu Hình" msgctxt "Operator" msgid "Hide Masked" -msgstr "Ẩn Được Mặt Nạ" +msgstr "Ẩn Giấu cái Đã Được Chắn Lọc" + + +msgctxt "Operator" +msgid "Box Add" +msgstr "Thêm Hình Hộp" + + +msgctxt "Operator" +msgid "Lasso Add" +msgstr "Thêm Thòng Lọng" + + +msgctxt "Operator" +msgid "Fair Positions" +msgstr "Làm Mịn Vị Trí" + + +msgctxt "Operator" +msgid "Fair Tangency" +msgstr "Làm Mịn Tiếp Tuyến" msgid "Set Pivot" @@ -104498,245 +115585,245 @@ msgstr "Đặt Điểm Tựa" msgctxt "Operator" msgid "Transfer Sculpt Mode" -msgstr "Truyền Chế Độ Khắc" +msgstr "Chế Độ Điêu Khắc Thuyên Chuyển" msgctxt "Operator" msgid "Convert to Particle System" -msgstr "Biến Hóa sang Hệ Thống Hạt" +msgstr "Chuyển Đổi thành Hệ Thống Hạt" msgctxt "Operator" msgid "Invert Mask" -msgstr "Đảo Nghịch Mặt Nạ" +msgstr "Đảo Nghịch Màn Chắn Lọc" msgctxt "Operator" msgid "Fill Mask" -msgstr "Tô Tràn Mặt Nạ" +msgstr "Tô Kín Màn Chắn Lọc" msgctxt "Operator" msgid "Clear Mask" -msgstr "Xóa Mặt nạ" +msgstr "Xóa Màn Chắn Lọc" msgctxt "Operator" msgid "Smooth Mask" -msgstr "Mịn Hóa Mặt Nạ" +msgstr "Làm Mịn Màn Chắn Lọc" msgctxt "Operator" msgid "Sharpen Mask" -msgstr "Bén Hóa Mặt Nạ" +msgstr "Sắc Cạnh Hóa Màn Chắn Lọc" msgctxt "Operator" msgid "Grow Mask" -msgstr "Mở Rộng Mặt Nạ" +msgstr "Tăng Diện Màn Chắn Lọc" msgctxt "Operator" msgid "Shrink Mask" -msgstr "Rút Nhỏ Mặt Nạ" +msgstr "Thu Nhỏ Diện Màn Chắn Lọc" msgctxt "Operator" msgid "Increase Contrast" -msgstr "Tăng Chênh Lệch" +msgstr "Tăng Mức Tương Phản" msgctxt "Operator" msgid "Decrease Contrast" -msgstr "Giảm Chênh Lệch" +msgstr "Giảm Mức Tương Phản" msgctxt "Operator" msgid "Expand Mask by Topology" -msgstr "Mở Rộng Mặt Nạ bằng Hình Dạng Học" +msgstr "Mở Rộng Màn Chắn Lọc theo Cấu Trúc Liên Kết" msgctxt "Operator" msgid "Expand Mask by Normals" -msgstr "Mở Rộng Mặt Nạ bằng Pháp Tuyến" +msgstr "Mở Rộng Màn Chắn Lọc theo Pháp Tuyến" msgctxt "Operator" msgid "Mask Slice and Fill Holes" -msgstr "Lát Mặt Nạ và Đầy Lỗ" +msgstr "Cắt Rời Vùng Chắn Lọc và Lấp Lỗ Hổng" msgctxt "Operator" msgid "Mask Slice to New Object" -msgstr "Lát Mặt Nạ thành Vật Thể Mới" +msgstr "Cắt Rời Vùng Chắn Lọc thành Đối Tượng Mới" msgctxt "Operator" msgid "Face Set from Masked" -msgstr "Tập Hợp Mặt Từ Có Đeo Mặt Nạ" +msgstr "Mặt Ấn Định từ Màn Chắn" msgctxt "Operator" msgid "Face Set from Visible" -msgstr "Tập Hợp Mặt Từ Hiển Thị" +msgstr "Mặt Ấn Định từ cái Hữu Hình" msgctxt "Operator" msgid "Face Set from Edit Mode Selection" -msgstr "Tập Hợp Mặt Từ Sự Lựa Chọn Của Chế Độ Biên Tập" +msgstr "Mặt Ấn Định từ Lựa Chọn của Chế Độ Biên Soạn" msgid "Initialize Face Sets" -msgstr "Khởi Động Tập Hợp Mặt" +msgstr "Khởi Tạo Mặt Ấn Định" msgctxt "Operator" msgid "Grow Face Set" -msgstr "Tăng Tập Hợp Mặt" +msgstr "Tăng Diện Mặt Ấn Định" msgctxt "Operator" msgid "Shrink Face Set" -msgstr "Thu Nhỏ Tập Hợp Mặt" +msgstr "Thu Nhỏ Mặt Ấn Định" msgctxt "Operator" msgid "Expand Face Set by Topology" -msgstr "Mở Rộng tập Hợp Mặt bằng Tô Pô Học" +msgstr "Mở Rộng các Mặt Ấn Định theo Cấu Trúc Liên Kết" msgctxt "Operator" msgid "Expand Active Face Set" -msgstr "Mở Rộng Tập Hợp Mặt Hoạt Động" +msgstr "Mở Rộng các Mặt Ấn Định đang Hoạt Động" msgctxt "Operator" msgid "Extract Face Set" -msgstr "Rút Tập Hợp Mặt" - - -msgctxt "Operator" -msgid "Invert Visible Face Sets" -msgstr "Đảo Nghịch Tập Hợp Mặt Hiển Thị" - - -msgctxt "Operator" -msgid "Show All Face Sets" -msgstr "Hiện Hết Tập Hợp Mặt" +msgstr "Trích Xuất Mặt Ấn Định" msgctxt "Operator" msgid "Randomize Colors" -msgstr "Ngẫu Nhiên Hóa Màu" +msgstr "Ngẫu Nhiên Hóa Màu Sắc" msgctxt "Operator" msgid "Pivot to Origin" -msgstr "Điểm Tựa đến Góc Tọa Độ" +msgstr "Tựa vào Tọa Độ Gốc" msgctxt "Operator" msgid "Pivot to Unmasked" -msgstr "Điểm Tựa đến Gỡ Mặt Nạ" +msgstr "Tựa vào Vùng Không Chắn Lọc" msgctxt "Operator" msgid "Pivot to Mask Border" -msgstr "Điểm Tựa đến Ranh Giới Mặt Nạ" +msgstr "Tựa vào Ranh Giới Vùng Chắn Lọc" msgctxt "Operator" msgid "Pivot to Active Vertex" -msgstr "Điểm Tựa đến Đỉnh Hoạt Động" +msgstr "Tựa vào Điểm Đỉnh đang Hoạt Động" msgctxt "Operator" msgid "Pivot to Surface Under Cursor" -msgstr "Điểm Tựa đến Bề Mặt Dưới Con Trỏ" +msgstr "Tựa vào Bề Mặt Nằm Dưới Con Trỏ" msgctxt "Operator" msgid "By Loose Parts" -msgstr "Bằng Bộ Phận Rời Ra" +msgstr "Theo Bộ Phận Rời Rạc" msgctxt "Operator" msgid "By Face Set Boundaries" -msgstr "Bằng Ranh Giới Tập Hợp Mặt" +msgstr "Theo Ranh Giới của Mặt Ấn Định" msgctxt "Operator" msgid "By Materials" -msgstr "Bằng Vật Liệu" +msgstr "Theo Nguyên Vật Liệu" msgctxt "Operator" msgid "By Normals" -msgstr "Bằng Pháp Tuyến" +msgstr "Theo Pháp Tuyến" msgctxt "Operator" msgid "By UV Seams" -msgstr "Bằng Vết Sẹo UV" +msgstr "Theo các Đường Khâu UV" msgctxt "Operator" msgid "By Edge Creases" -msgstr "Bằng Nhăn Cạnh" +msgstr "Theo các Nếp Gấp" msgctxt "Operator" msgid "By Edge Bevel Weight" -msgstr "Bằng Quyền Lượng Tròn Hóa Cạnh" +msgstr "Theo Trọng Lượng Bo Tròn Cạnh" msgctxt "Operator" msgid "By Sharp Edges" -msgstr "Bằng Cạnh Bén" +msgstr "Theo Cạnh Sắc Nhọn" msgctxt "Operator" msgid "Per Vertex" -msgstr "Từng Đỉnh" +msgstr "Mỗi Điểm Đỉnh" msgctxt "Operator" msgid "Per Face Set" -msgstr "Từng Tập Hợp Mặt" +msgstr "Mỗi Mặt Ấn Định" msgctxt "Operator" msgid "Per Loose Part" -msgstr "Từng Bộ Phận Rời Ra" +msgstr "Mỗi Phần Rời Rạc" + + +msgctxt "Operator" +msgid "Move to Bone Collection" +msgstr "Di Chuyển đến Bộ Sưu Tập Xương" msgid "Bone Settings" -msgstr "Cài Đặt Xương" +msgstr "Sắp Đặt của Xương" msgctxt "Operator" msgid "Reset Unkeyed" -msgstr "Đặt Lại Chưa Có Bức Ảnh Mẫu" +msgstr "Hoàn Lại về Trạng Thái Chưa Khóa Hóa" msgctxt "Operator" msgid "Calculate" -msgstr "Tính" +msgstr "Tính Toán" + + +msgctxt "Operator" +msgid "Assign to New Collection" +msgstr "Ấn Định vào Bộ Sưu Tập Mới" msgctxt "Operator" msgid "Add (with Targets)..." -msgstr "Thêm (với các Mục Tiêu)..." +msgstr "Thêm (với Mục Tiêu)..." msgctxt "Operator" msgid "Rename Active Bone..." -msgstr "Đổi Tên Xương Hoạt Động..." +msgstr "Đổi Tên Xương đang Hoạt Động..." msgctxt "Operator" msgid "Calculate Motion Paths" -msgstr "Tính Đường Chuyển Động" +msgstr "Tính Toán Đường Chuyển Động" msgctxt "Operator" @@ -104746,92 +115833,92 @@ msgstr "Xóa Đường Chuyển Động" msgctxt "Operator" msgid "Update Armature Motion Paths" -msgstr "Nâng Cấp Đường Chuyển Động Của Cốt" +msgstr "Cập Nhật Đường Chuyển Động của Khung Cốt" msgctxt "Operator" msgid "Update All Motion Paths" -msgstr "Nâng Cấp Hết Đường Chuyển Động" +msgstr "Cập Nhật Toàn Bộ các Đường Chuyển Động" msgctxt "Operator" msgid "Sort Elements..." -msgstr "Sắp Thứ Tự Phần Tử..." +msgstr "Sắp Thứ Tự các Phần Tử..." msgctxt "Operator" msgid "Extrude Vertices" -msgstr "Kéo Ra Đỉnh" +msgstr "Đẩy Trồi các Điểm Đỉnh" msgctxt "Operator" msgid "New Edge/Face from Vertices" -msgstr "Cạnh/Mặt Mới tử Các Đỉnh" +msgstr "Cạnh/Mặt Mới từ các Điểm Đỉnh" msgctxt "Operator" msgid "Connect Vertex Path" -msgstr "Kết Nối Đường Đỉnh" +msgstr "Kết Nối Đường Dẫn Điểm Đỉnh" msgctxt "Operator" msgid "Connect Vertex Pairs" -msgstr "Kết Nối Đỉnh Đôi" +msgstr "Kết Nối các Đôi Điểm Đỉnh" msgctxt "Operator" msgid "Rip Vertices" -msgstr "Xé Đỉnh" +msgstr "Xé Điểm Đỉnh" msgctxt "Operator" msgid "Rip Vertices and Fill" -msgstr "Xé Đỉnh và Tô Đầy" +msgstr "Xé Điểm Đỉnh và Phủ Kín" msgctxt "Operator" msgid "Rip Vertices and Extend" -msgstr "Xé Đỉnh và Kéo Ra" +msgstr "Xé Điểm Đỉnh và Chậm Rãi Ra" msgctxt "Operator" msgid "Slide Vertices" -msgstr "Trượt Đỉnh" +msgstr "Đẩy Trượt Điểm Đỉnh" msgctxt "Operator" msgid "Smooth Vertices (Laplacian)" -msgstr "Mịn Hóa Đỉnh (Laplace)" +msgstr "Làm Mịn Điểm Đỉnh (Laplacian)" msgctxt "Operator" msgid "Propagate to Shapes" -msgstr "Truyền đến Hình Dạng" +msgstr "Truyền Lan tới các Hình Dạng" msgctxt "Operator" msgid "Extrude Edges" -msgstr "Kéo Ra Cạnh" +msgstr "Đẩy Trồi Cạnh" msgctxt "Operator" msgid "Clear Sharp from Vertices" -msgstr "Xóa Bén Từ Đỉnh" +msgstr "Xóa Dấu Sắc Nhọn khỏi Điểm Đỉnh" msgctxt "Operator" msgid "Extrude Faces" -msgstr "Kéo Ra Mặt" +msgstr "Đẩy Trồi các Mặt" msgctxt "Operator" msgid "Extrude Faces Along Normals" -msgstr "Kéo Ra Mặt Theo Pháp Tuyến" +msgstr "Đẩy Trồi Các Mặt Dọc Theo Pháp Tuyến" msgctxt "Operator" msgid "Solidify Faces" -msgstr "Rắn Hóa Mặt" +msgstr "Đắp Dày Các Mặt" msgctxt "Operator" @@ -104841,52 +115928,52 @@ msgstr "Yếu" msgctxt "Operator" msgid "Medium" -msgstr "Trung bình" +msgstr "Trung Bình" msgctxt "Operator" msgid "Strong" -msgstr "Khỏe" +msgstr "Mạnh" msgctxt "Operator" msgid "Flip" -msgstr "Lật" +msgstr "Đảo Lật" msgctxt "Operator" msgid "Set from Faces" -msgstr "Đặt Từ Các Mặt" +msgstr "Đặt từ Các Mặt" msgctxt "Operator" msgid "Rotate..." -msgstr "Xoay..." +msgstr "Xoay Chiều..." msgctxt "Operator" msgid "Point to Target..." -msgstr "Điểm đến Mục Tiêu..." +msgstr "Hướng về phía Mục Tiêu..." msgctxt "Operator" msgid "Smooth Vectors" -msgstr "Mịn Hóa Vectơ" +msgstr "Làm Mịn các Véctơ" msgctxt "Operator" msgid "Smooth Faces" -msgstr "Mịn Hóa Mặt" +msgstr "Làm Mịn Các Mặt" msgctxt "Operator" msgid "Flat Faces" -msgstr "Mặt Bằng Phẳng" +msgstr "Các Mặt Phẳng Bẹt" msgctxt "Operator" msgid "Sharp Edges" -msgstr "Cạnh Bén" +msgstr "Cạnh Sắc" msgctxt "Operator" @@ -104896,99 +115983,114 @@ msgstr "Vòng Cạnh" msgctxt "Operator" msgid "Bones" -msgstr "Các Xương" +msgstr "Xương" msgctxt "Operator" msgid "Dissolve Bones" -msgstr "Hòa Tan Xương" +msgstr "Tiêu Hủy Xương" msgctxt "Operator" msgid "Fixed" -msgstr "Không Đổi" +msgstr "Cố Định/Bất Biến/Định Trước" msgctxt "Operator" msgid "Adaptive" -msgstr "Ứng Phó" +msgstr "Tùy Ứng" msgctxt "Operator" msgid "Trim" -msgstr "Cắt Bớt" +msgstr "Cắt Xén" + + +msgctxt "Operator" +msgid "Outline" +msgstr "Tạo Đường Viền" + + +msgctxt "GPencil" +msgid "Join" +msgstr "Kết Nối" msgctxt "Operator" msgid "Set as Active Material" -msgstr "Đặt là Vật Liệu Hoạt Động" +msgstr "Đặt làm Nguyên Liệu đang Hoạt Động" msgctxt "Operator" msgid "Arrange" -msgstr "Sắp Xếp" +msgstr "Bố Trí" msgctxt "Operator" msgid "Close" -msgstr "Gần" +msgstr "Đóng/Kín" msgctxt "Operator" msgid "Toggle Caps" -msgstr "Bật/Tắt Hoa/Nhỏ" +msgstr "Đổi Hình Đầu Nét" msgid "Scale Thickness" -msgstr "Phóng To Bề Dày Bề" +msgstr "Tỷ Lệ Hóa Độ Dày" msgctxt "Operator" msgid "Reset Fill Transform" -msgstr "Đặt Lại Biến Hóa Tô Đầy" +msgstr "Hoàn Lại Biến Hóa của Vùng Tô Kín" msgctxt "Operator" msgid "Insert Blank Keyframe (Active Layer)" -msgstr "Chèn Bức Ảnh Mẫu Rỗng (Lớp Hoạt Động)" +msgstr "Chèn Thêm Khung Khóa Trống (Tầng Lớp đang Hoạt Động)" msgctxt "Operator" msgid "Duplicate Active Keyframe (Active Layer)" -msgstr "Sao Chép Bức Ảnh Mẫu Hoạt Động (Lớp Hoạt Động)" +msgstr "Nhân Đôi Khung Khóa đang Hoạt Động (Tầng Lớp đang Hoạt Động)" msgctxt "Operator" msgid "View Selected" -msgstr "Chiếu Được Chọn" +msgstr "Hiển Thị cái Được Chọn" msgid "Show Gizmos" -msgstr "Hiện Đồ Đạc" +msgstr "Hiển Thị Gizmo" msgid "Toggle Overlays" -msgstr "Bật/Tắt Lớp Che" +msgstr "Bật/Tắt Lớp Vẽ Lồng" msgid "Local Camera" -msgstr "Máy Quay Phim Địa Phương" +msgstr "Máy Quay Phim Cục Bộ" msgid "Camera to View" -msgstr "Khóa Máy Quy Phim với Màn" +msgstr "Hướng Máy Quay Phim vào Góc Nhìn" msgid "Object Gizmos" -msgstr "Đồ Đạc Vật Thể" +msgstr "Gizmo Đối Tượng" msgid "Look At" -msgstr "Nhìn Đến" +msgstr "Nhìn Vào" msgid "Viewport Overlays" -msgstr "Các Lớp Che Màn" +msgstr "Vẽ Lồng của Cổng Nhìn" + + +msgctxt "View3D" +msgid "Floor" +msgstr "Nền Sàn" msgid "Text Info" @@ -104996,32 +116098,32 @@ msgstr "Thông Tin Văn Bản" msgid "Origins" -msgstr "Các Gốc Tọa Độ" +msgstr "Tọa Độ Gốc" msgid "Origins (All)" -msgstr "Các Gốc Tọa Độ (Hết)" +msgstr "Tọa Độ Gốc (Toàn Bộ)" + + +msgid "Mesh Edit Mode Overlays" +msgstr "Lớp Vẽ Lồng Chế Độ Biên Soạn Khung Lưới" msgid "Creases" -msgstr "Nhăn" +msgstr "Nếp Gấp" msgctxt "Plural" msgid "Sharp" -msgstr "Bén" +msgstr "Sắc Cạnh/Nhọn/Đột Ngột" msgid "Seams" -msgstr "Vết Sẹo" +msgstr "Đường Khâu" msgid "Vertex Group Weights" -msgstr "Quyền Lượng Nhóm Đỉnh" - - -msgid "Mesh Analysis" -msgstr "Phân Tích Mạng Lưới" +msgstr "Trọng Lượng của Nhóm Điểm Đỉnh" msgid "Face Angle" @@ -105029,19 +116131,63 @@ msgstr "Góc Mặt" msgid "Edge Marks" -msgstr "Ký Hiệu Cạnh" +msgstr "Dấu Chỉ Cạnh" + + +msgid "Curve Edit Mode Overlays" +msgstr "Lớp Vẽ Lồng Chế Độ Biên Soạn Đường Cong" + + +msgid "Sculpt Mode Overlays" +msgstr "Lớp Vẽ Lồng Chế Độ Điêu Khắc" + + +msgid "Curve Sculpt Overlays" +msgstr "Lớp Vẽ Lồng Điêu Khắc Đường Cong" msgid "Selection Opacity" -msgstr "Sự Lựa Chọn Độ Đục" +msgstr "Độ Đục của Lựa Chọn" + + +msgid "Cage Opacity" +msgstr "Độ Đục của Khung Lồng" + + +msgid "Armature Overlays" +msgstr "Lớp Vẽ Lồng Khung Cốt" + + +msgid "Texture Paint Overlays" +msgstr "Lớp Vẽ Lồng Sơn Chất Liệu" + + +msgid "Vertex Paint Overlays" +msgstr "Lớp Vẽ Lồng Sơn Điểm Đỉnh" + + +msgid "Weight Paint Overlays" +msgstr "Lớp Vẽ Lồng Sơn Trọng Lượng" msgid "Zero Weights" -msgstr "Quyền Lượng Không" +msgstr "Không Trọng Lượng" + + +msgid "Snap Individual Elements To" +msgstr "Bám Dính các Cá Nhân Phần Tử Vào" msgid "Fade Inactive Layers" -msgstr "Phai Lớp Không Hoạt Động" +msgstr "Phai Mờ Dần các Tầng Lớp Không Hoạt Động" + + +msgid "Brush Falloff" +msgstr "Suy Giảm Dần Đầu Bút" + + +msgid "Curve Falloff" +msgstr "Suy Giảm Dần Đường Cong" msgctxt "Operator" @@ -105051,22 +116197,22 @@ msgstr "Di Chuyển Không Gian Chất Liệu" msgctxt "Operator" msgid "Scale Texture Space" -msgstr "Phóng To Không Gian Chất Liệu" +msgstr "Đổi Tỷ Lệ Không Gian Chất Liệu" msgctxt "Operator" msgid "Align to Transform Orientation" -msgstr "Sắp Xếp Với Định Hướng Biến Hóa" +msgstr "Căn Chỉnh theo Định Hướng Biến Hóa" msgctxt "Operator" msgid "Project from View (Bounds)" -msgstr "Chiếu Đồ Từ Màn (Ranh Giới)" +msgstr "Phóng Chiếu từ Góc Nhìn (Ranh Giới)" msgctxt "Operator" msgid "Viewport Render Animation" -msgstr "Kết Xuất Hoạt Hình Màn Chiếu" +msgstr "Kết Xuất Hoạt Họa trong Cổng Nhìn" msgctxt "Operator" @@ -105081,47 +116227,62 @@ msgstr "Lăn Phải" msgctxt "Operator" msgid "Center Cursor and Frame All" -msgstr "Con Trỏ Đến Trung Tâm và Vừa Khung Hết" +msgstr "Trung Tâm Hóa Con Trỏ và Đóng Khung Toàn Bộ" msgctxt "Operator" msgid "Non Manifold" -msgstr "Vô Đa Tập" +msgstr "Phi Đa-Tạp" msgctxt "Operator" msgid "Edge Rings" -msgstr "Vành Cạnh" +msgstr "Vành Đai Cạnh" msgctxt "Operator" msgid "Previous Block" -msgstr "Cục Trước" +msgstr "Khối Trước Đây" msgctxt "Operator" msgid "Next Block" -msgstr "Cục Tiếp" +msgstr "Khối Tiếp Theo" msgctxt "Operator" msgid "Color Attribute" -msgstr "Đặc Điểm Màu" +msgstr "Thuộc Tính Màu" + + +msgctxt "Operator" +msgid "Empty" +msgstr "Trống Rỗng" + + +msgctxt "Operator" +msgid "Stroke" +msgstr "Nét Vẽ" + + +msgctxt "Operator" +msgid "Suzanne" +msgstr "Đầu Khỉ" msgctxt "Operator" msgid "Point Cloud" -msgstr "Mây Điểm" +msgstr "Mây Điểm Chấm" msgctxt "Operator" msgid "Grease Pencil" -msgstr "Bút Sáp" +msgstr "Bút Chì Dầu" msgctxt "Operator" msgid "Armature" -msgstr "Cốt" +msgstr "Khung Cốt" msgctxt "Operator" @@ -105131,17 +116292,17 @@ msgstr "Lưới Rào" msgctxt "Operator" msgid "Collection Instance..." -msgstr "Thực Thể Sưu Tập..." +msgstr "Thực Thể Bộ Sưu Tập..." msgctxt "Operator" msgid "No Collections to Instance" -msgstr "Không Có Sưu Tập để Thực Thể" +msgstr "Không Có Bộ Sưu Tập nào để Thực Thể Hóa cả" msgctxt "Operator" msgid "Collection Instance" -msgstr "Thực Thể Sưu Tập" +msgstr "Thực Thể Bộ Sưu Tập" msgctxt "Operator" @@ -105151,37 +116312,42 @@ msgstr "Xóa Toàn Cầu" msgctxt "Operator" msgid "Add Active" -msgstr "Thêm Hoạt Động" +msgstr "Thêm Hoạt Tính" msgctxt "Operator" msgid "Add Passive" -msgstr "Thêm Thụ Động" +msgstr "Thêm Thụ Động Tính" msgid "Location to Deltas" -msgstr "Vị Trí sang Lệch Lạc" +msgstr "Vị Trí sang Delta" msgid "Rotation to Deltas" -msgstr "Xoay sang Lệch Lạc" +msgstr "Xoay Chiều sang Delta" msgid "Scale to Deltas" -msgstr "Phóng To sang Lệch Lạc" +msgstr "Tỷ Lệ sang Delta" msgid "All Transforms to Deltas" -msgstr "Hết Biến Hóa sang Lệch Lạc" +msgstr "Toàn Bộ các Biến Hóa sang Delta" msgid "Visual Geometry to Mesh" -msgstr "Hình Dạng Hiện Đến Mạng Lưới" +msgstr "Hình Học Hình Dung thành Khung Lưới" + + +msgctxt "Operator" +msgid "Make Parent without Inverse (Keep Transform)" +msgstr "Đặt Phụ Huynh mà không Đảo Nghịch (Duy Trì Biến Hóa)" msgctxt "Operator" msgid "Limit Total Vertex Groups" -msgstr "Hạn Chế Tổng Nhóm Đỉnh" +msgstr "Giới Hạn Tổng của Nhóm Điểm Đỉnh" msgctxt "Operator" @@ -105191,52 +116357,65 @@ msgstr "Hệ Thống Hạt" msgctxt "Operator" msgid "Link Objects to Scene..." -msgstr "Liên Kết Vật Thể đến Cảnh…" +msgstr "Kết Nối Đối Tượng với Cảnh..." msgctxt "Operator" msgid "Hook to Selected Object Bone" -msgstr "Móc Đến Xương Vật Được Chọn" +msgstr "Móc vào Xương của Đối Tượng được Chọn" msgctxt "Operator" msgid "Transfer Weights" -msgstr "Truyền Quyền Lượng" +msgstr "Thuyên Chuyển Trọng Lượng" + + +msgctxt "Operator" +msgid "Sample Group" +msgstr "Lấy Mẫu Nhóm" msgctxt "Operator" msgid "Snap to Deformed Surface" -msgstr "Hút Dính đến Bề Mặt Bị Méo Hóa" +msgstr "Bám Dính vào Bề Mặt Biến Dạng" msgctxt "Operator" msgid "Snap to Nearest Surface" -msgstr "Hút Dính đến Bề Mặt Gần Nhất" +msgstr "Bám Dính vào Bề Mặt Gần Nhất" msgctxt "Operator" msgid "Paste Pose Flipped" -msgstr "Dán Dạng Đứng Được Lật" +msgstr "Dán Tư Thế Đảo Ngược" msgctxt "Operator" msgid "To Next Keyframe" -msgstr "Đến Bức Ảnh Mẫu Tiếp" +msgstr "Sang Khung Khóa Tiếp Tới" msgctxt "Operator" msgid "To Last Keyframe (Make Cyclic)" -msgstr "Đến Bức Ảnh Mẫu Cuối (Làm Chu Trình)" +msgstr "Đến Khung Khóa Cuối Cùng (Tuần Hoàn Hóa)" msgctxt "Operator" msgid "On Selected Keyframes" -msgstr "Tại Bức Ảnh Mẫu Được Chọn" +msgstr "Tại các Khung Khóa Đã Chọn" msgctxt "Operator" msgid "On Selected Markers" -msgstr "Trên Ký Hiệu Được Chọn" +msgstr "Tại các Dấu Mốc Đã Chọn" + + +msgid "- select bones to operate on first -" +msgstr "- lựa chọn xương để thao tác trên đó trước đã -" + + +msgid "All bone collections are read-only" +msgstr "Toàn bộ các bộ sưu tập xương đều ở chế độ duy-đọc mà thôi" msgctxt "Operator" @@ -105256,64 +116435,64 @@ msgstr "Tự Động Đặt Tên Trên/Dưới" msgctxt "Operator" msgid "Apply Selected as Rest Pose" -msgstr "Áp Dụng Dạng Đứng Làm Dạng Đứng Nghỉ" +msgstr "Áp Dụng cái được Chọn làm Tư Thế Nghỉ" msgctxt "Operator" msgid "Paste X-Flipped Pose" -msgstr "Dán Dạng Đứng Lật Hướng X" +msgstr "Dán Tư Thế Đảo-Lật Theo Trục X" msgctxt "Operator" msgid "Smooth Laplacian" -msgstr "Mịn Hóa LaPlace" +msgstr "Làm Mịn Laplacian" msgid "Mirror Vertices" -msgstr "Gương Đỉnh" +msgstr "Phản Chiếu Đối Xứng Điểm Đỉnh" msgid "Snap Vertices" -msgstr "Hút Dính Đỉnh" +msgstr "Bám Dính Điểm Đỉnh" msgid "UV Unwrap Faces" -msgstr "Mở Gói Mặt UV" +msgstr "Mở Gói UV cho Các Mặt" msgctxt "Operator" msgid "Bevel Vertices" -msgstr "Tròn Hóa Đỉnh" +msgstr "Bo Tròn Điểm Đỉnh" msgctxt "Operator" msgid "Bevel Edges" -msgstr "Tròn Hóa Cạnh" +msgstr "Bo Tròn Cạnh" msgctxt "Operator" msgid "Rotate Edge CW" -msgstr "Xoay Cạnh Cùng Hướng Đồng Hồ" +msgstr "Xoay Chiều Cạnh Thuận CKĐH" msgctxt "Operator" msgid "Rotate Edge CCW" -msgstr "Xoay Cạnh Nghịch Hướng Đồng Hồ" +msgstr "Xoay Chiều Cạnh Ngược CKĐH" msgctxt "Operator" msgid "Clear Sharp" -msgstr "Xóa Bén" +msgstr "Xóa Sắc Nhọn" msgctxt "Operator" msgid "Mark Sharp from Vertices" -msgstr "Ký Bén Từ Các Đỉnh" +msgstr "Đánh Dấu Sắc Nhọn từ các Điểm Đỉnh" msgctxt "Operator" msgid "Custom Normal" -msgstr "Pháp Tuyến Tùy Chọn" +msgstr "Pháp Tuyến Tùy Chỉnh" msgctxt "Operator" @@ -105323,42 +116502,52 @@ msgstr "Diện Tích Mặt" msgctxt "Operator" msgid "Corner Angle" -msgstr "Góc Cửa Góc Giác" +msgstr "Góc Độ của Đỉnh" msgctxt "Operator" msgid "Recalculate Outside" -msgstr "Tính Lại Phía Ngoài" +msgstr "Tính Lại Hướng Ra Ngoài" msgctxt "Operator" msgid "Recalculate Inside" -msgstr "Tính Lại Phía Trong" +msgstr "Tính Lại Hướng Vào Trong" + + +msgctxt "Operator" +msgid "Copy Vector" +msgstr "Sao Chép Vectơ" + + +msgctxt "Operator" +msgid "Paste Vector" +msgstr "Dán Vectơ" msgctxt "Operator" msgid "Reset Vectors" -msgstr "Hoàn Lại Vectơ" +msgstr "Hoàn Lại Véctơ" msgctxt "Operator" msgid "Smooth Edges" -msgstr "Mịn Hóa Cạnh" +msgstr "Làm Mịn Cạnh" msgctxt "Operator" msgid "Sharp Vertices" -msgstr "Bén Hóa Đỉnh" +msgstr "Làm Sắc Cạnh Điểm Đỉnh" msgctxt "Operator" msgid "Delete Segment" -msgstr "Xóa Khúc Đường" +msgstr "Xóa Phân Đoạn" msgctxt "Operator" msgid "Delete Point" -msgstr "Xoá Điểm" +msgstr "Xóa Điểm" msgctxt "Operator" @@ -105368,12 +116557,12 @@ msgstr "Bản Quyền" msgctxt "Operator" msgid "Registered Trademark" -msgstr "Hiệu Bảo Hộ" +msgstr "Dấu Thương Hiệu đã Đăng Ký" msgctxt "Operator" msgid "Degree Sign" -msgstr "Dấu Độ" +msgstr "Dấu về Độ Đo" msgctxt "Operator" @@ -105383,77 +116572,77 @@ msgstr "Dấu Nhân" msgctxt "Operator" msgid "Superscript 1" -msgstr "Hàng Cao 1" +msgstr "Chữ/Số Viết Trên 1" msgctxt "Operator" msgid "Superscript 2" -msgstr "Hàng Cao 2" +msgstr "Chữ/Số Viết Trên 2" msgctxt "Operator" msgid "Superscript 3" -msgstr "Hàng Cao 3" +msgstr "Chữ/Số Viết Trên 3" msgctxt "Operator" msgid "Double >>" -msgstr "Đôi >>" +msgstr "Dấu Kép >>" msgctxt "Operator" msgid "Double <<" -msgstr "Đôi <<" +msgstr "Dấu Kép <<" msgctxt "Operator" msgid "Promillage" -msgstr "Phần Ngàn" +msgstr "Dấu Phần Nghìn" msgctxt "Operator" msgid "Dutch Florin" -msgstr "Florin Hò Lan" +msgstr "Dấu Đồng Florin của Hòa-Lan" msgctxt "Operator" msgid "British Pound" -msgstr "Bản Anh" +msgstr "Dấu Đồng Bảng Anh" msgctxt "Operator" msgid "Japanese Yen" -msgstr "Yên Nhật" +msgstr "Dấu Đồng Yên Nhật" msgctxt "Operator" msgid "German S" -msgstr "S Đức" +msgstr "Chữ S Tiếng Đức" msgctxt "Operator" msgid "Spanish Question Mark" -msgstr "Dấu Hỏi Tây Ban Nhà" +msgstr "Dấu Hỏi Tây Ban Nha" msgctxt "Operator" msgid "Spanish Exclamation Mark" -msgstr "Dấu Cảm Lật" +msgstr "Dấu Chấm Than Tây Ban Nha" msgctxt "Operator" msgid "Decrease Kerning" -msgstr "Giảm Cách Giữa" +msgstr "Giảm Khoảng Cách Ký Tự" msgctxt "Operator" msgid "Increase Kerning" -msgstr "Tăng Cách Giữa" +msgstr "Tăng Khoảng Cách Ký Tự" msgctxt "Operator" msgid "Reset Kerning" -msgstr "Đặt Lại Cách Giữa" +msgstr "Hoàn Lại Khoảng Cách Ký Tự" msgctxt "Operator" @@ -105463,37 +116652,37 @@ msgstr "Ký Tự Trước" msgctxt "Operator" msgid "Next Character" -msgstr "Ký Tự Tiếp" +msgstr "Ký Tự Tiếp Theo" msgctxt "Operator" msgid "To Uppercase" -msgstr "Đến Chữ Hoa" +msgstr "Đổi Sang Chữ Hoa" msgctxt "Operator" msgid "To Lowercase" -msgstr "Đến Chữ Thường" +msgstr "Đổi Sang Chữ Thường" msgctxt "Operator" msgid "Toggle Bold" -msgstr "Bật/Tắt Đậm" +msgstr "Bật/Tắt Chữ Đậm" msgctxt "Operator" msgid "Toggle Italic" -msgstr "Bật/Tắt Nghiêng" +msgstr "Bật/Tắt Chữ Nghiêng" msgctxt "Operator" msgid "Toggle Underline" -msgstr "Bật/tắt Gạch Dưới" +msgstr "Bật/Tắt Gạch Chân" msgctxt "Operator" msgid "Toggle Small Caps" -msgstr "Bật/Tắt Chữ Hoa Nhỏ" +msgstr "Bật/Tắt Chữ In Hoa Nhỏ" msgctxt "Operator" @@ -105503,47 +116692,47 @@ msgstr "Đặt Lăn" msgctxt "Operator" msgid "With Empty Groups" -msgstr "Với Nhóm Rỗng" +msgstr "Với các Nhóm Trống Rỗng" msgctxt "Operator" msgid "With Automatic Weights" -msgstr "Với Quyầng Lượng Tự Động" +msgstr "Với Cân Trọng Tự Động" msgctxt "Operator" msgid "Paste by Layer" -msgstr "Dán tùy Lớp" +msgstr "Dán theo Tầng Lớp" msgctxt "Operator" msgid "Normalize Thickness" -msgstr "Đơn Vị Hóa Chiều Dày" +msgstr "Bình Thường Hóa Độ Dày" msgctxt "Operator" msgid "Normalize Opacity" -msgstr "Đơn Vị Hóa Độ Đục" +msgstr "Bình Thường Hóa Độ Đục" msgctxt "Operator" msgid "Insert Blank Keyframe (All Layers)" -msgstr "Chèn Bức Ảnh Mẫu Rỗng (Tất Cả Lớp)" +msgstr "Chèn Khung Khóa Trống Rỗng (Toàn Bộ các Tầng Lớp)" msgctxt "Operator" msgid "Duplicate Active Keyframe (All Layers)" -msgstr "Sao Chép Bức Ảnh Mẫu Hoạt Động (Tất Cả Lớp)" +msgstr "Nhân Đôi Khung Khóa đang Hoạt Động (Toàn Bộ các Tầng Lớp)" msgctxt "Operator" msgid "Hide Active Layer" -msgstr "Ẩn Lớp Hoạt Động" +msgstr "Ẩn Giấu Tầng đang Hoạt Động" msgctxt "Operator" msgid "Hide Inactive Layers" -msgstr "Ẩn Lớp Không Hoạt Động" +msgstr "Ẩn Giấu các Tầng Lớp Không Hoạt Động" msgid "Toggle X-Ray" @@ -105551,31 +116740,35 @@ msgstr "Bật/Tắt X-Quang" msgid "To 3D Cursor" -msgstr "Đến Con Trỏ 3D" +msgstr "Về Vị Trí của Con Trỏ 3D" + + +msgid "Compositor not supported on this platform" +msgstr "Trình tổng hợp không được hỗ trợ trên nền tảng này" msgid "Fade Inactive Geometry" -msgstr "Phai Hình Dạng Không Hoạt Động" +msgstr "Phai Mờ Dần Hình Học Không Hoạt Động" msgid "Marker Names" -msgstr "Tên Ký Hiệu" +msgstr "Tên của Dấu Mốc" msgid "Developer" -msgstr "Người Phát Triển" +msgstr "Lập Trình Viên" msgid "Fade Geometry" -msgstr "Phai Hình Dạng" +msgstr "Phai Mờ Dần Hình Học" msgid "Target Selection" -msgstr "Sự Lựa Chọn Mục Tiêu" +msgstr "Lựa Chọn Mục Tiêu" msgid "Exclude Non-Selectable" -msgstr "Trừ Loại Không Thể Chọn" +msgstr "Loại Trừ cái Không Thể Chọn" msgid "Reference Point" @@ -105583,51 +116776,69 @@ msgstr "Điểm Tham Chiếu" msgid "Only in Multiframe" -msgstr "Chỉ trong Đa Khung" +msgstr "Duy trong Đa Khung Hình" msgctxt "Operator" msgid "Reproject" -msgstr "Chiếu Lại" +msgstr "Tái Phóng Chiếu" msgid "Curve Shape" -msgstr "Dạng Cong-F" +msgstr "Hình Dạng Đường Cong" msgctxt "Operator" msgid "Frame Selected (Quad View)" -msgstr "Màn Được Chọn (Màn Hiện Tư)" +msgstr "Đóng Khung cái Được Chọn (Bốn Góc Nhìn)" msgctxt "Operator" msgid "Set Active Camera" -msgstr "Đặc Máy Quay Phim Hoạt Động" +msgstr "Đặt là Máy Quay Phim đang Hoạt Động" msgctxt "Operator" msgid "Assign Automatic from Bones" -msgstr "Tự Động Chỉ Định Từ Xương" +msgstr "Ấn Định Tự Động Từ các Xương" msgctxt "Operator" msgid "Assign from Bone Envelopes" -msgstr "Chỉ Định Từ Bao Bì Xương" +msgstr "Ấn Định từ các Phong Bao của Xương" + + +msgctxt "Operator" +msgid "Gradient (Linear)" +msgstr "Dốc Màu (Tuyến Tính)" + + +msgctxt "Operator" +msgid "Gradient (Radial)" +msgstr "Dốc Màu (Tỏa Tròn)" + + +msgid "Relax Topology" +msgstr "Thả Lỏng Cấu Trúc Liên Kết" + + +msgid "Erase Multires Displacement" +msgstr "Xóa Dịch Hình Đa Phân Giải" msgctxt "Operator" msgid "Randomize Vertices" -msgstr "Ngẫu Nhiên Hóa Các Đỉnh" +msgstr "Ngẫu Nhiên Hóa Điểm Đỉnh" msgctxt "Operator" msgid "Delete Vertices" -msgstr "Xóa Đỉnh" +msgstr "Xóa Điểm Đỉnh" msgctxt "Operator" msgid "New Face from Edges" -msgstr "Mặt Mới từ Cạnh" +msgstr "Tạo Mặt Mới từ các Cạnh" msgctxt "Operator" @@ -105637,38 +116848,38 @@ msgstr "Xoá Cạnh" msgctxt "Operator" msgid "Bridge Faces" -msgstr "Cầu Mặt" +msgstr "Cầu Nối các Mặt" msgctxt "Operator" msgid "Delete Faces" -msgstr "Xóa Mặt" +msgstr "Xóa Các Mặt" msgctxt "Operator" msgid "Clear Freestyle Edge" -msgstr "Xóa Cạnh Phong Cách Tự Do" +msgstr "Xóa Cạnh PCTD" msgctxt "Operator" msgid "Clear Freestyle Face" -msgstr "Xóa Mặt Phong Cách Tự Do" +msgstr "Xóa Mặt PCTD" msgid "Specular Lighting" -msgstr "Ánh Sáng Cao Quang" +msgstr "Bố Trí Ánh Sáng Tia Lóng Lánh" msgid "Include Active" -msgstr "Gồm Hoạt Động" +msgstr "Bao Gồm cái đang Hoạt Động" msgid "Include Edited" -msgstr "Gồm Được Biên Tập" +msgstr "Bao Gồm cái đã Chỉnh Sửa" msgid "Include Non-Edited" -msgstr "Gồm Chưa Biên Tập" +msgstr "Bao Gồm cái Không Chỉnh Sửa" msgid "Custom Location" @@ -105676,69 +116887,89 @@ msgstr "Vị Trí Tùy Chọn" msgid "Material Name" -msgstr "Tên Vật Liệu" +msgstr "Tên của Nguyên Vật Liệu" msgctxt "Operator" msgid "Dissolve Between" -msgstr "Hòa Tan Giữa" +msgstr "Tiêu Hủy Phần Trung Gian" msgctxt "Operator" msgid "Dissolve Unselected" -msgstr "Hòa Tan Chưa Được Chọn" +msgstr "Tiêu Hủy Phần Không Chọn" msgid "Scaling" -msgstr "Phóng To" +msgstr "Đổi Tỷ Lệ" msgctxt "Operator" msgid "Scale BBone" -msgstr "Phóng To Xương B" +msgstr "Đổi Tỷ Lệ Xương B" msgctxt "Operator" msgid "Adjust Focal Length" -msgstr "Chỉnh Quãng Tiêu Điểm" +msgstr "Điều Chỉnh Tiêu Cự" msgctxt "Operator" msgid "Camera Lens Scale" -msgstr "Phóng To Thấu Kính Máy Quay Phim" +msgstr "Tỷ Lệ Thấu Kính Máy Quay Phim" + + +msgid "Camera Lens Scale: %.3f" +msgstr "Tỷ Lệ Thấu Kính Máy Quay Phim: %.3f" msgctxt "Operator" msgid "Adjust Extrusion" -msgstr "Chỉnh Sự Kéo Dài" +msgstr "Điều Chỉnh Đẩy Trồi" + + +msgid "Extrude: %.3f" +msgstr "Đẩy Trồi: %.3f" msgctxt "Operator" msgid "Adjust Offset" -msgstr "Chỉnh Dịch" +msgstr "Điều Chỉnh Dịch Chuyển" + + +msgid "Offset: %.3f" +msgstr "Dịch Chuyển: %.3f" msgctxt "Operator" msgid "Remove from All" -msgstr "Xóa từ Hết" +msgstr "Xóa khỏi Toàn Bộ" msgid "Disable Studio Light Edit" -msgstr "Tắt Biên Tập Đèn Xưởng" +msgstr "Tắt Biên Soạn Ánh Sáng Studio" msgid "Object Location" -msgstr "Vị Trí Vật Thể" +msgstr "Vị Trí của Đối Tượng" msgctxt "Operator" msgid "Scale Envelope Distance" -msgstr "Phóng To Khoảng Cách Bao Bì" +msgstr "Đổi Tỷ Lệ Khoảng Cách Phong Bao" msgctxt "Operator" msgid "Scale Radius" -msgstr "Bán Kính Phóng To" +msgstr "Đổi Tỷ Lệ Bán Kính" + + +msgid "Camera Focal Length: %.1fmm" +msgstr "Tiêu Cự Máy Quay Phim: %.1fmm" + + +msgid "Camera Focal Length: %.1f°" +msgstr "Tiêu Cự Máy Quay Phim: %.1f°" msgctxt "Operator" @@ -105748,16 +116979,24 @@ msgstr "Khoảng Cách DOF (Chọn)" msgctxt "Operator" msgid "Adjust Focus Distance" -msgstr "Chỉnh Quãng Tiêu Điểm" +msgstr "Điều Chỉnh Khoảng Cách Tập Trung" + + +msgid "Focus Distance: %.3f" +msgstr "Khoảng Cách Tập Trung: %.3f" msgctxt "Operator" msgid "Adjust Empty Display Size" -msgstr "Chỉnh Cỡ Thước Hiển Thị Vật Thể Rỗng" +msgstr "Điều Chỉnh Kích Thước Hiển Thị Trống Rỗng" + + +msgid "Empty Display Size: %.3f" +msgstr "Kích Thước Hiển Thị Đối Tượng Rỗng: %.3f" msgid "Ridge" -msgstr "Dãy Đỉnh" +msgstr "Lằn Gợn" msgid "Valley" @@ -105765,22 +117004,50 @@ msgstr "Thung Lũng" msgid "No object selected, using cursor" -msgstr "Không có vật thể nào được chọn, đang dùng con trỏ" +msgstr "Không có đối tượng nào được chọn cả, sử dụng con trỏ" + + +msgid "Draw Grease Pencil" +msgstr "Vẽ Bút Chì Dầu" + + +msgid "Sculpt Grease Pencil" +msgstr "Điêu Khắc: Bút Chì Dầu" + + +msgid "Weight Grease Pencil" +msgstr "Cân Trọng Lượng Bút Chì Dầu" + + +msgid "Vertex Grease Pencil" +msgstr "Điểm Đỉnh Bút Chì Dầu" msgctxt "Operator" msgid "Adjust Light Power" -msgstr "Chỉnh Công Suất Đèn" +msgstr "Điều Chỉnh Công Suất Đèn Pha" + + +msgid "Light Power: %.3f" +msgstr "Công Suất Ánh Sáng: %.3f" msgctxt "Operator" msgid "Adjust Spot Light Size" -msgstr "Chỉnh Cỡ Thước Đèn Rơi" +msgstr "Điều Chỉnh Kích Thước Đèn Pha" + + +msgid "Spot Size: %.2f" +msgstr "Kích Thước Điểm: %.2f" msgctxt "Operator" msgid "Adjust Spot Light Blend" -msgstr "Chỉnh Pha Trộn Đèn Rơi" +msgstr "Điều Chỉnh Độ Pha Trộn Đèn Pha" + + +msgid "Spot Blend: %.2f" +msgstr "Pha Trộn Điểm: %.2f" msgctxt "Operator" @@ -105788,44 +117055,64 @@ msgid "Adjust Area Light X Size" msgstr "Chỉnh Cỡ Thước X Của Đèn Diện Tích" +msgid "Light Size X: %.3f" +msgstr "Kích Thước Đèn X: %.3f" + + msgctxt "Operator" msgid "Adjust Area Light Y Size" msgstr "Chỉnh Cỡ Thước Y Của Đèn Diện Tích" +msgid "Light Size Y: %.3f" +msgstr "Kích Thước Đèn Y: %.3f" + + msgctxt "Operator" msgid "Adjust Area Light Size" -msgstr "Chỉnh Cỡ Thước Của Đèn Diện Tích" +msgstr "Điều Chỉnh Kích Thước Đèn Diện Tích" + + +msgid "Light Size: %.3f" +msgstr "Kích Thước Ánh Sáng: %.3f" msgctxt "Operator" msgid "Adjust Light Radius" -msgstr "Chỉnh Bán Kính Đèn" +msgstr "Điều Chỉnh Bán Kính Ánh Sáng" + + +msgid "Light Radius: %.3f" +msgstr "Bán Kính Ánh Sáng: %.3f" msgctxt "Operator" msgid "Adjust Sun Light Angle" -msgstr "Chỉnh Góc Nắng Mặt Trời" +msgstr "Điều Chỉnh Góc Độ của Ánh Sáng Mặt Trời" + + +msgid "Light Angle: %.3f" +msgstr "Góc Độ Ánh Sáng: %.3f" msgid "Distance Min" -msgstr "Khoảng Cách Cực Tiểu" +msgstr "Khoảng Cách Tối Thiểu" msgid "Count Max" -msgstr "Tổng Số" +msgstr "Lượng Tối Đa" msgid "Layer:" -msgstr "Lớp:" +msgstr "Tầng:" msgid "Affect Only" -msgstr "Chỉ Ảnh Hưởng" +msgstr "Duy Tác Động" msgid "Locations" -msgstr "Các Vị Trí" +msgstr "Vị Trí" msgid "Parents" @@ -105833,7 +117120,7 @@ msgstr "Phụ Huynh" msgid "Refine Method" -msgstr "Phương Pháp Chỉnh Chi Tiết" +msgstr "Phương Pháp Tinh Chỉnh" msgid "Detailing" @@ -105842,28 +117129,28 @@ msgstr "Chi Tiết Hóa" msgctxt "Operator" msgid "Remesh" -msgstr "Mạng Lưới Lại" +msgstr "Kiến Tạo Lại Khung Lưới" msgid "Tile Offset" -msgstr "Dịch Ô" +msgstr "Dịch Chuyển Ô" msgid "Auto Normalize" -msgstr "Tự Động Đơn Vị Hóa" +msgstr "Tự Động Bình Thường Hóa" msgid "Lock-Relative" -msgstr "Khoa Tương Đối" +msgstr "Khóa Tương Đối" msgid "Multi-Paint" -msgstr "Đa-Sơn" +msgstr "Sơn Đồng Loạt" msgctxt "Operator" msgid "Quick Edit" -msgstr "Biên Tập Lẹ" +msgstr "Biên Soạn Nhanh" msgctxt "Operator" @@ -105873,15 +117160,15 @@ msgstr "Áp Dụng" msgctxt "Operator" msgid "Apply Camera Image" -msgstr "Áp Dụng Ảnh Máy Quay Phim" +msgstr "Áp Dụng Hình Ảnh Máy Quay Phim" msgid "Editing Type" -msgstr "Kiểu Biên Tập" +msgstr "Thể Biên Soạn" msgid "Strand Lengths" -msgstr "Bề Dài Sợi" +msgstr "Chiều Dài Sợi" msgid "Root Positions" @@ -105889,23 +117176,23 @@ msgstr "Vị Trí Gốc" msgid "Path Steps" -msgstr "Bước Đường Dẫn" +msgstr "Bước Đi của Đường Dẫn" msgid "No Brushes currently available" -msgstr "Hiện tại chưa có bút để dùng" +msgstr "Hiện tại chưa có Đầu Bút nào để sử dụng cả" msgid "UV Map Needed" -msgstr "Cần Bản Đồ UV" +msgstr "Cần có Ánh Xạ UV" msgid "Point cache must be baked" -msgstr "Phải nướng đệm chứa điểm" +msgstr "Bộ đệm điểm phải được nướng" msgid "in memory to enable editing!" -msgstr "trong bộ nhớ để bật biên tập" +msgstr "trong bộ nhớ thì mới được phép biên soạn!" msgid "Auto-Velocity" @@ -105918,67 +117205,76 @@ msgstr "Không Có Chất Liệu" msgctxt "Operator" msgid "Add UVs" -msgstr "Thêm UV" +msgstr "Thêm UVs" + + +msgctxt "GPencil" +msgid "Boundary" +msgstr "Ranh Giới" msgid "Ignore Transparent" -msgstr "Không Chú Ý Trong Suốt" +msgstr "Bỏ Qua Tính Trong Suốt" msgid "" -msgstr "" +msgstr "" msgid "" -msgstr "" +msgstr "" msgid "No F-Curve to add keyframes to" -msgstr "Không có Cong-F để thêm bức ảnh mẫu" +msgstr "Không có Đường Cong-F nào để thêm các khung khóa vào cả" msgid "No RNA pointer available to retrieve values for keyframing from" -msgstr "Không có con trỏ RNA để lấy lại giá trị cho bức ảnh mẫu" +msgstr "Không có con trỏ RNA nào khả dĩ để có thể lấy lại các giá trị dùng cho quá trình khung khóa hóa từ đó" msgid "No ID block and/or AnimData to delete keyframe from" -msgstr "Không có cục ID và/hay dữ liệu hoạt hình để xóa bức ảnh mẫu" +msgstr "Không có khối ID và/hoặc Dữ Liệu Hoạt Họa nào để xóa khung khóa khỏi nó cả" msgid "Could not insert %i keyframe(s) due to zero NLA influence, base value, or value remapping failed: %s.%s for indices [%s]" -msgstr "Không thể chèn %i bức ảnh mẫu vì sự ảnh hưởng của NLA bằng không, giá trị cơ sở, hoặc ánh xạ lại giá trị bị thất bại: %s.%s cho chỉ số [%s]" +msgstr "Không thể chèn thêm %i khung khóa do không có ảnh hưởng NLA nào. Giá trị cơ sở, hoặc giá trị tái ánh xạ, đã thất bại: %s.%s đối với chỉ số [%s]" msgid "Could not insert keyframe, as RNA path is invalid for the given ID (ID = %s, path = %s)" -msgstr "Không chèn được bức ảnh mẫu, vì đường dẫn RNA không hợp lệ cho ID (ID = %s, đường dẫn = %s)" +msgstr "Không thể cộng thêm khung khóa vào được, vì đường dẫn RNA là không hợp lệ đối với ID đã cho (ID = %s, đường dẫn = %s)" msgid "No ID block to insert keyframe in (path = %s)" -msgstr "Không có cục ID để chèn bức ảnh mẫu trong (đường dẫn = %s)" +msgstr "Không có khối ID nào để có thể cộng thêm khung khóa vào (đường dẫn = %s)" + + +msgid "'%s' on %s is not editable" +msgstr "'%s' trên %s không thể biên soạn được" msgid "Could not insert keyframe, as this type does not support animation data (ID = %s, path = %s)" -msgstr "Không chèn được bực ảnh mẫu, loại này không hỗ trợ dữ lệu hoạt hình (ID = %s, đường dẫn %s)" +msgstr "Không thể cộng thêm khung khóa vào được, vì thể loại này không hỗ trợ dữ liệu hoạt họa (ID = %s, đường dẫn %s)" msgid "Could not delete keyframe, as RNA path is invalid for the given ID (ID = %s, path = %s)" -msgstr "Không xóa được bức ảnh mẫu, vì đường dẫn RNA không hợp lệ cho ID (ID = %s, đường dẫn = %s)" +msgstr "Không thể xóa khung khóa được, vì đường dẫn RNA là không hợp lệ đối với ID đã cho (ID = %s, đường dẫn = %s)" msgid "No action to delete keyframes from for ID = %s" -msgstr "Không có hành động để xóa bức ảnh mẫu cho ID = %s" +msgstr "Không có hành động nào để xóa khung khóa khỏi nó đối với ID = %s" msgid "Not deleting keyframe for locked F-Curve '%s' for %s '%s'" -msgstr "Không xóa bức ảnh mẫu cho Cong-F bị khóa '%s' cho %s '%s'" +msgstr "Không xóa khung khóa vì Đường Cong-F đang bị khóa '%s' đối với %s '%s'" msgid "Could not clear keyframe, as RNA path is invalid for the given ID (ID = %s, path = %s)" -msgstr "Không xóa được bức ảnh mẫu, vì đường dẫn RNA không hợp lệ cho ID (ID = %s), đường dẫn = %s)" +msgstr "Không thể xóa khung khóa được, vì đường dẫn RNA với ID đã cho là không hợp lệ (ID = %s), đường dẫn = %s)" msgid "Not clearing all keyframes from locked F-Curve '%s' for %s '%s'" -msgstr "Không xóa hết bức ảnh mẫu từ Cong-F bị khóa '%s' cho %s '%s'" +msgstr "Không xóa được hết toàn bộ các khung khóa khỏi Đường Cong-F đang bị khóa '%s' đối với %s '%s'" msgid "User Library" @@ -105986,191 +117282,231 @@ msgstr "Thư Viện Người Dùng" msgid "Modifier requires original data, bad stack position" -msgstr "Bộ điều chỉnh yêu cầu dữ liệu ban đầu, vị trí xếp đống sai lầm" +msgstr "Bộ điều chỉnh yêu cầu dữ liệu gốc, vị trí ngăn xếp không hợp lệ" msgid "Not supported in dyntopo" -msgstr "Không hỗ trợ trong tô pô động lý" +msgstr "Chưa được hỗ trợ trong chế độ cấu trúc liên kết động" msgid "Not supported in sculpt mode" -msgstr "Không hỗ trợ trong chế độ khắc" +msgstr "Chưa được hỗ trợ trong chế độ điêu khắc" + + +msgid "No AnimData to set tmpact on" +msgstr "Không có dữ liệu hoạt họa (AnimData) nào để đặt hành động tạm thời (tmpact) được" msgid "No AnimData to set action on" -msgstr "Không có DữLiệuHoạtHình để đặt hành động" +msgstr "Không có AnimData (Dữ Liệu Hoạt Họa) nào để đặt hành động vào đó cả" msgid "Cannot change action, as it is still being edited in NLA" -msgstr "Không được đổi hành động, vì nó vẫn đang biên tập trong NLA" +msgstr "Không thể thay đổi hành động được, vì nó đang được biên soạn trong NLA" msgid "Could not set action '%s' onto ID '%s', as it does not have suitably rooted paths for this purpose" -msgstr "Không được đặt hành động '%s' vào ID '%s', vì nó không có đường rễ phù hợp cho công việc này" +msgstr "Không thể sắp đặt hành động '%s' vào ID '%s', vì nó không có các đường dẫn nền móng phù hợp cho mục đích này" msgid "KeyingSet" -msgstr "Tập Mẫu Dạng" +msgstr "Bộ Hình Mẫu" msgid ", cannot have single-frame paths" -msgstr ", không thể có đường một bức ảnh" +msgstr ", không thể có đường dẫn cho đơn nhất khung hình được" msgid "Motion path frame extents invalid for %s (%d to %d)%s" -msgstr "Phạm vi đường chuyển động không phù hợp cho %s (%d đến %d)%s" +msgstr "Phạm vi khung hình của đường chuyển động không phù hợp đối với %s (%d đến %d)%s" msgid "Documents" msgstr "Tài Liệu" +msgid "armatures" +msgstr "khung cốt" + + msgid "Attribute name can not be empty" -msgstr "Tên đặc điểm không thể trống rỗng" +msgstr "Thuộc tính không thể trống rỗng được" msgid "Attribute is not part of this geometry" -msgstr "Đặc điểm không phải là một phần của hình dạng này" +msgstr "Thuộc tính không phải là phần của hình học này" msgid "Attribute domain not supported by this geometry type" -msgstr "Đặc điểm không được hỗ trợ bởi loại hình dạng này" +msgstr "Phạm vi thuộc tính là phạm vi thể loại hình học này không hỗ trợ" msgid "The attribute name must not be empty" -msgstr "Tên đặc điểm không thể trống rỗng" +msgstr "Tên thuộc tính không được để trống" msgid "Attribute is required and can't be removed" -msgstr "Đặc điểm là đồ yêu cầu, không thể xóa nó" +msgstr "Đòi hỏi phải có thuộc tính. Không thể xóa bỏ được" + + +msgid "Layer '%s' could not be created" +msgstr "Không thể tạo tầng lớp '%s' được" + + +msgid "This attribute can not be accessed in a procedural context" +msgstr "Thuộc tính này không thể truy cập trong bối cảnh thủ tục được" msgid "Library file, loading empty scene" -msgstr "Tập Tin Thư Viện, đang nhập cảnh rỗng" +msgstr "Tập tin thư viện, nạp cảnh trống" msgid "Preferences saved" -msgstr "Đã lưu tùy chọn" +msgstr "Cài đặt sở thích đã được lưu rồi" msgid "Saving preferences failed" -msgstr "Lưu tùy chọn bị thất bại" +msgstr "Quá trình lưu cài đặt sở thích đã bị thất bại" msgid "Unable to create userpref path" -msgstr "Không thế chế tạo đường dẫn tùy chọn cho người dùng" +msgstr "Không thể kiến tạo đường dẫn theo cấu hình của người dùng" msgid "Unable to create app-template userpref path" -msgstr "Không thế chế tạo đường dẫn mẵu ứng dụng tùy chọn cho người dùng" +msgstr "Không thể kiến tạo đường dẫn userpref (theo cấu hình của người dùng) cho mẫu ứng dụng được" msgid "File written by newer Blender binary (%d.%d), expect loss of data!" -msgstr "Tập tin được lưu bằng Blender phiên bản mởi hơn (%d.%d), khẳng định mất dữ liệu!" +msgstr "Tập tin được ghi bằng bản Blender nhị phân mới hơn (%d.%d). Dự đoán việc mất mát dữ liệu sẽ xảy ra!" + + +msgid "File could not be read, critical data corruption detected" +msgstr "Không thể đọc tập tin được, phát hiện thấy dữ liệu quan trọng bị hư hoại" msgid "Loading failed: " -msgstr "Nhập bị thất bại:" +msgstr "Quá trình nạp bị thất bại: " + + +msgid "Loading \"%s\" failed: " +msgstr "Quá trình nạp “%s” đã bị thất bại: " msgid "Linked Data" -msgstr "Dữ Liệu Được Liên Kết" +msgstr "Dữ Liệu Kết Nối" msgid "Appended Data" -msgstr "Dữ Liệu Kèm" +msgstr "Dữ Liệu Bổ Sung" + + +msgid "Proxies have been removed from Blender (%d proxies were automatically converted to library overrides, %d proxies could not be converted and were cleared). Consider re-saving any library .blend file with the newest Blender version" +msgstr "Đại diện đã bị xóa khỏi Blender (%d đại diện đã được tự động chuyển đổi thành thư viện vượt quyền, %d đại diện không thể chuyển đổi và đã bị xóa đi). Hãy cân nhắc lưu lại bất kỳ tập tin .blend thư viện nào bằng phiên bản Blender mới nhất nhé" msgid "Linking or appending from a very old .blend file format (%d.%d), no animation conversion will be done! You may want to re-save your lib file with current Blender" -msgstr "Liên kết hay kèm từ một định dạng tập tin .blend rất xưa (%d.%d), sẽ không biến đổi hoạt hình! Có lẽ bạn sẽ muốn dùng Blender hiện tại để lưu lại tập tin thư viện của bạn " +msgstr "Định kết nối hay bổ sung thêm từ một định dạng tập tin .blend rất xưa cũ (%d.%d), sự chuyển đổi hoạt họa sẽ không được thi hành! Có thể, bạn nên dùng bản Blender hiện tại để lưu tập tin thư viện của mình thì hơn" msgid "Lib Reload: Replacing all references to old data-block '%s' by reloaded one failed, old one (%d remaining users) had to be kept and was renamed to '%s'" -msgstr "Nhập Lại Thư Viện: Đang thay thế hết tham chiếu đến cục dữ liệu cũ '%s' bằng một cục nhập lại bị thất bại, cục cũ (vẫn còn %d đối tượng đang dùng) cần giữ lại và được đặt tên mới: '%s'" +msgstr "Nạp lại Thư Viện: Quá trình thay thế toàn bộ các tham chiếu tới khối dữ liệu cũ '%s' bằng cái đã nạp lại bị thất bại, cái cũ (%d người dùng còn lại) phải được lưu tồn và được đổi tên thành: '%s'" msgid "Path '%s' not found" msgstr "Không được tìm đường dẫn '%s'" +msgid "No missing files" +msgstr "Không có tập tin nào bị thiếu cả" + + msgid "Could not open the directory '%s'" -msgstr "Không thể mở được thư mục '%s'" +msgstr "Không thể mở thư mục '%s' được" msgid "Could not find '%s' in '%s'" -msgstr "Không được kiếm '%s' trong '%s'" +msgstr "Không tìm thấy '%s' trong '%s'" msgid "Path '%s' cannot be made absolute" -msgstr "Đường dẫn '%s' không được làm tuyệt đối" +msgstr "Đường dẫn '%s' không thể đổi thành tuyệt đối được" msgid "Total files %d | Changed %d | Failed %d" -msgstr "Tổng số tập tin %d | Được đổi %d | Thất bại %d" +msgstr "Tổng số tập tin %d | Thay đổi %d | Thất bại %d" + + +msgid "Path '%s' cannot be made relative for %s '%s'" +msgstr "Đường dẫn '%s' không thể tương đối hóa cho %s '%s' được" + + +msgid "Path '%s' cannot be made absolute for %s '%s'" +msgstr "Đường dẫn '%s' không thể tuyệt đối hóa cho %s '%s' được" msgid "Can't initialize cloth" -msgstr "Không thể khởi động dải" +msgstr "Không thể khởi tạo vải vóc được" msgid "Null cloth object" -msgstr "Vật thể dải không" +msgstr "Đối tượng vải vóc Null (vô nghĩa)" msgid "Out of memory on allocating clmd->clothObject" -msgstr "Hết bộ nhớ khi giành bộ nhớ cho clmd->vậtThểDải" +msgstr "Bộ nhớ cạn kiệt khi cấp phát cho clmd->clothObject" msgid "Cannot build springs" -msgstr "Không thể xây dựng lò xo" +msgstr "Không thể xây dựng các lò xo" msgid "Out of memory on allocating clmd->clothObject->verts" -msgstr "Hết bộ nhớ khi giành bộ nhớ cho clmd->vậtThểDải->đỉnh" +msgstr "Bộ nhớ cạn kiệt khi cấp phát cho clmd->clothObject->verts" msgid "Out of memory on allocating clmd->clothObject->looptri" -msgstr "Hết bộ nhớ khi giành bộ nhớ cho clmd->vậtThểDải->tamGiácLặpLại" +msgstr "Bộ nhớ cạn kiệt khi cấp phát cho clmd->clothObject->looptri" msgid "Scene Collection" -msgstr "Sưu Tập Cảnh" +msgstr "Bộ Sưu Tập Cảnh" msgid "Collection %d" -msgstr "Sưu Tập %d" +msgstr "Bộ Sưu Tập %d" msgid "Const" -msgstr "Không Đổi" +msgstr "Hằng Số/Đồng Đều/Bất Biến" msgid "IK" -msgstr "IK (Động Lý Nghịch)" +msgstr "Động Học Ngược" msgid "Crazyspace transformation is only available for Mesh type of objects" -msgstr "Biến hóa không gian khùng điện chỉ được sử dụng cho vật thể loại Mạng Lưới" +msgstr "Phép biến hóa Crazyspace chỉ khả dụng cho thể loại đối tượng khung lưới (Mesh) mà thôi" msgid "Invalid vertex index %d (expected to be within 0 to %d range)" -msgstr "Chỉ số đỉnh không hợp lệ %d (định ở trong phạm vi 0 đến %d)" +msgstr "Chỉ số điểm đỉnh không hợp lệ %d (dự kiến là giá trị phải nằm trong phạm vi từ 0 đến %d)" msgid "At least two points required" -msgstr "Phải có hai điểm trở lên" +msgstr "Yêu cầu phải có ít nhất hai điểm" msgid "Must have more control points than Order" -msgstr "Phải có số lượng điểm kiểm soát hơn Bậc" +msgstr "Phải có nhiều điểm điều khiển hơn số Bậc (Order)" msgid "%d more %s row(s) needed for Bezier" -msgstr "cần %d thêm %s hàng cho Bezier" +msgstr "Cần %d thêm %s hàng cho đường cong Bezier" msgid "%d more point(s) needed for Bezier" -msgstr "cần %d thêm điểm cho Bezier" +msgstr "Cần thêm %d điểm cho đường cong Bezier" msgid "UVMap" @@ -106185,12 +117521,8 @@ msgid "Int" msgstr "Số Nguyên" -msgid "PreviewCol" -msgstr "Màu Dự Khán" - - msgid "TexturedCol" -msgstr "Màu Chất Liệu" +msgstr "MàuChấtLiệu" msgid "Recast" @@ -106206,15 +117538,11 @@ msgstr "Đỉnh-Mặt Đa Giác" msgid "ShapeKey" -msgstr "Mẫu Dạng" +msgstr "HìnhMẫu" msgid "OS Loop" -msgstr "Lặp Vòng OS" - - -msgid "PreviewLoopCol" -msgstr "Dự Khán Màu Vòng" +msgstr "Vòng Mạch Không Gian Gốc" msgid "Int8" @@ -106229,36 +117557,60 @@ msgid "Float2" msgstr "SốThật2" +msgid "Source and destination meshes do not have the same number of vertices, 'Topology' mapping cannot be used in this case" +msgstr "Khung lưới nguồn và khung lưới đích không có cùng một số điểm đỉnh, cho nên, không thể sử dụng ánh xạ ‘Cấu Trúc Liên Kết’ trong trường hợp này được" + + +msgid "Source mesh does not have any edges, none of the 'Edge' mappings can be used in this case" +msgstr "Khung lưới nguồn không có bất cứ một cạnh nào cả, do đó, trong trường hợp này, không thể áp dụng các ánh xạ ‘Cạnh’ được" + + +msgid "Source mesh does not have any faces, none of the 'Face' mappings can be used in this case" +msgstr "Khung lưới nguồn không có bất cứ một mặt nào cả, do đó, trong trường hợp này, không thể áp dụng các ánh xạ 'Mặt' được" + + msgid "Source or destination meshes do not have any vertices, cannot transfer vertex data" -msgstr "Mạng lưới nguồn và đích không có đỉnh nào, không thể truyền dữ liệu đỉnh" +msgstr "Khung lưới nguồn và đích không có bất cứ điểm đỉnh nào cả. Không thể thuyên chuyển dữ liệu điểm đỉnh được" + + +msgid "Source and destination meshes do not have the same number of edges, 'Topology' mapping cannot be used in this case" +msgstr "Khung lưới nguồn và khung lưới đích không có cùng một số góc cạnh, cho nên, không thể sử dụng ánh xạ ‘Cấu Trúc Liên Kết’ trong trường hợp này được" msgid "Source or destination meshes do not have any edges, cannot transfer edge data" -msgstr "Mạng lưới nguồn và đích không có cạnh nào, không thể truyền dữ liệu cạnh" +msgstr "Khung lưới nguồn và đích không có bất cứ cạnh nào cả. Không thể chuyển giao dữ liệu cạnh được" + + +msgid "Source and destination meshes do not have the same number of face corners, 'Topology' mapping cannot be used in this case" +msgstr "Khung lưới nguồn và khung lưới đích không có cùng một số góc mặt, cho nên, không thể sử dụng ánh xạ 'Cấu Trúc Liên Kết' trong trường hợp này được" msgid "Source or destination meshes do not have any faces, cannot transfer corner data" -msgstr "Mạng lưới nguồn và đích không có mặt nào, không thể truyền dữ liệu góc giác" +msgstr "Khung lưới nguồn và đích không có các mặt nào cả. Không thể thuyên chuyển dữ liệu về góc cạnh được" + + +msgid "Source and destination meshes do not have the same number of faces, 'Topology' mapping cannot be used in this case" +msgstr "Khung lưới nguồn và khung lưới đích không có cùng một số mặt, cho nên, không thể sử dụng ánh xạ 'Cấu Trúc Liên Kết' trong trường hợp này được" msgid "Source or destination meshes do not have any faces, cannot transfer face data" -msgstr "Mạng lưới nguồn và đích không có mặt nào, không thể truyền dữ liệu mặt" +msgstr "Khung lưới nguồn và đích không có bất cứ Mặt nào cả. Không thể thuyên chuyển dữ liệu Mặt được" msgid "Not enough free memory" -msgstr "Không đủ bộ nhớ trống" +msgstr "Không có đủ bộ nhớ trống" msgid "Canvas mesh not updated" -msgstr "Không được nâng cấp mặt sơn" +msgstr "Khung lưới khung vẽ chưa được cập nhật" msgid "Cannot bake non-'image sequence' formats" -msgstr "Không thể nướng hình dạng tập tin không phải là 'trình tự ảnh'" +msgstr "Không thể nướng các định dạng phi 'trình tự hình ảnh' được" msgid "No UV data on canvas" -msgstr "Không có dữ liệu UV trên mặt sơn" +msgstr "Không có dữ liệu UV trên khung vẽ" msgid "Invalid resolution" @@ -106266,11 +117618,11 @@ msgstr "Độ phân giải không hợp lệ" msgid "Image save failed: invalid surface" -msgstr "Lưu ảnh bị thất bại: bề mặt không hợp lệ" +msgstr "Lỗi xảy ra trong khi lưu hình ảnh: bề mặt không hợp lệ" msgid "Image save failed: not enough free memory" -msgstr "Lưu ảnh bị thất bại: không đủ bộ nhớ trống" +msgstr "Lỗi xảy ra trong khi lưu hình ảnh: lượng bộ nhớ còn trống không đủ" msgctxt "Brush" @@ -106280,23 +117632,47 @@ msgstr "Bề Mặt" msgctxt "Action" msgid "var" -msgstr "Biến" +msgstr "biến số" msgid "Generator" -msgstr "Đồ Chế Tạo" +msgstr "Hàm Sinh" msgid "Built-In Function" -msgstr "Hàm Số Sẵn" +msgstr "Hàm Tích Hợp" msgid "Stepped" -msgstr "Bước" +msgstr "Phân Bước/Bậc" + + +msgid "LineStyle" +msgstr "PhongCáchĐườngNét" + + +msgid "LineSet %i" +msgstr "Bộ Đường Nét %i" + + +msgid "LineSet" +msgstr "BộĐườngNét" + + +msgid "Spline Length node" +msgstr "Nút Chiều Dài Chốt Trục" + + +msgid "\"{}\" attribute from geometry" +msgstr "Thuộc tính \"{}\" từ hình học" msgid "ID / Index" -msgstr "ID / Chỉ Số" +msgstr "ID / Chỉ số" + + +msgid "\"{}\" from {}" +msgstr "\"{}\" từ {}" msgid "GP_Layer" @@ -106304,75 +117680,87 @@ msgstr "Lớp_GP" msgid "Cannot pack multiview images from raw data currently..." -msgstr "Hiện tại không thể gói lại ảnh đa màn từ dữ liệu không tổ chức..." +msgstr "Hiện tại không thể đóng gói các hình ảnh đa góc nhìn dùng dữ liệu thô được..." msgid "Cannot pack tiled images from raw data currently..." -msgstr "Hiện tại không thể gói lại ảnh ô đa màn từ dữ liệu không tổ chức..." +msgstr "Hiện tại không thể đóng gói hình ảnh xếp ô từ dữ liệu thô được ..." msgid "Did not write, no Multilayer Image" -msgstr "Chưa lưu, không có Ảnh Đa Lớp" +msgstr "Chưa ghi được, không có Hình Ảnh Đa Tầng Lớp" msgid "Did not write, unexpected error when saving stereo image" -msgstr "Chưa được lưu, có sai lầm bất nhờ khi lưu ảnh nhị kênh" +msgstr "Chưa ghi được, có lỗi bất ngờ xảy ra khi đang lưu ảnh lập thể" msgid "Could not write image: %s" -msgstr "Không lưu được ảnh: %s" +msgstr "Không ghi được hình ảnh: %s" msgid "When saving a tiled image, the path '%s' must contain a valid UDIM marker" -msgstr "Khi lưu một ảnh láp ô, đường dẫn '%s' phải có một ký dấu UDIM hợp lệ" +msgstr "Khi lưu hình ảnh xếp ô thì đường dẫn'%s' nhất định phải có chứa dấu hiệu UDIM hợp lệ" msgid "Error writing render result, %s (see console)" -msgstr "Sai lầm lưu kết qủa kết xuất, %s (xem diện điều khiển)" +msgstr "Lỗi xảy ra trong khi ghi kết quả kết xuất, %s (xem thông tin ở bàn giao tiếp)" msgid "Render error (%s) cannot save: '%s'" -msgstr "Sai lầm kết xuất (%s) không thể lưu: '%s'" +msgstr "Lỗi trong kết xuất (%s) không thể lưu: '%s'" msgid "Key %d" -msgstr "Bức Ảnh Mẫu %d" +msgstr "Khóa %d" msgid "Impossible to resync data-block %s and its dependencies, as its linked reference is missing" -msgstr "Không thể đồng bộ lại cục dữ liệu %s và những đồ nhờ nó, vì tham chiếu được liên kết bị thiếu" +msgstr "Không thể tái đồng bộ %s khối dữ liệu và các phụ thuộc của nó, vì thiếu mất tham chiếu liên kết" msgid "During resync of data-block %s, %d obsolete overrides were deleted, that had local changes defined by user" -msgstr "Khi đồng bộ lại của cục dữ liệu %s, đã xóa %d đồ vượt quyền lỗi thời đã có sự thay đổi địa phương được người dùng chỉ định" +msgstr "Trong quá trình tái đồng bộ khối dữ liệu %s, %d trường hợp vượt quyền đã lỗi thời, cũng bị xóa đi, song chúng lại có nhiều thay đổi cục bộ mà người dùng đã từng xác định" msgid "Data corruption: data-block '%s' is using itself as library override reference" -msgstr "Dữ liệu hư: cục dữ liệu '%s' đang dùng một mình nó cho làm tham chiếu cho đồ vượt quyền thư viện" +msgstr "Dữ liệu hư hoại: khối dữ liệu '%s' đang sử dụng bản thân mình làm tham chiếu vượt quyền thư viện" msgid "Data corruption: data-block '%s' is using another local data-block ('%s') as library override reference" -msgstr "Dữ liệu hư: cục dữ liệu '%s' đang dùng một cục dữ liệu địa phương ('%s') làm tham chiếu cho đồ vượt quyền thư viện" +msgstr "Dữ liệu hư hoại: khối dữ liệu '%s' đang sử dụng một khối dữ liệu địa phương khác ('%s') làm tham chiếu vượt quyền thư viện" + + +msgid "Light Linking for %s" +msgstr "Liên Kết Ánh Sáng cho %s" + + +msgid "Shadow Linking for %s" +msgstr "Liên Kết Bóng Tối cho %s" + + +msgid "Cannot unlink unsupported '%s' from light linking collection '%s'" +msgstr "Không thể hủy liên kết '%s' chưa được hỗ trợ khỏi bộ sưu tập liên kết ánh sáng '%s'" msgid "MaskLayer" -msgstr "LớpMặtNạ" +msgstr "Tầng Màn Chắn Lọc" msgid "Auto Smooth" -msgstr "Tự Động Mịn Hóa" +msgstr "Tự Động Làm Mịn" msgid "Tangent space can only be computed for tris/quads, aborting" -msgstr "Chỉ có thể tính không gian tiếp tuyến cho tam giác và tứ giác, đang hủy qúa trình" +msgstr "Chỉ có thể tính toán không gian tiếp tuyến cho tam giác và tứ giác mà thôi. Bỏ qua quá trình" msgid "Tangent space computation needs a UV Map, \"%s\" not found, aborting" -msgstr "Để tính không gian tiếp tuyến cần có bản đồ UV, không thể kiếm được \"%s\", đang hủy qúa trình" +msgstr "Tính toán không gian tiếp tuyến cần có Ánh Xạ UV, song không tìm thấy \"%s\". Hủy thao tác" msgid "Possible data loss when saving this file! %s modifier is deprecated (Object: %s)" -msgstr "Có thể mất dữ liệu khi lưu tập tin này! Bộ điều chỉnh %s là lỗi thời (Vật Thể: %s)" +msgstr "Có khả năng gây ra mất mát dữ liệu khi lưu tập tin này! Bộ điều chỉnh %s đã lỗi thời (Đối Tượng: %s)" msgid "NlaTrack" @@ -106380,19 +117768,19 @@ msgstr "RãnhNLA" msgid "NlaStrip" -msgstr "ĐoạnẢnhNLA" +msgstr "DảiNLA" msgid "[Action Stash]" -msgstr "[Hành Động Cất Chứa]" +msgstr "[Cất Giấu Hành Động]" msgid "Can't find object data of %s lib %s" -msgstr "Không thể tìm dữ liệu của %s thư viện %s" +msgstr "Không tìm thấy dữ liệu đối tượng của %s thư viện %s ở đâu cả" msgid "Object %s lost data" -msgstr "Vật thể %s mất dữ liệu" +msgstr "Đối tượng %s dữ liệu bị mất" msgid "Surf" @@ -106415,96 +117803,108 @@ msgid "LightProbe" msgstr "QuangKế" +msgid "GreasePencil" +msgstr "BútChìDầu" + + msgid "No new files have been packed" -msgstr "Không có tập tin nào mới được gói lại" +msgstr "Không có tập tin mới nào được đóng gói cả" msgid "Unable to pack file, source path '%s' not found" -msgstr "Không được gói lại tập tin, không kiếm được đường dẫn nguồn '%s'" +msgstr "Không thể đóng gói tập tin được. Không tìm thấy đường dẫn nguồn '%s'" + + +msgid "Unable to access the size of, source path '%s'" +msgstr "Không thể truy cập kích thước của đường dẫn nguồn '%s' được" + + +msgid "Unable to pack files over 2gb, source path '%s'" +msgstr "Không thể đóng gói tập tin cỡ trên 2gb được, đường dẫn nguồn là '%s'" msgid "Image '%s' skipped, packing movies or image sequences not supported" -msgstr "Đã bỏ qua ảnh '%s', vì không hỗ trợ gói phim, trình tự ảnh và ảnh" +msgstr "Hình ảnh '%s' bị bỏ qua, không hỗ trợ đóng gói phim hoặc chuỗi hình ảnh" msgid "Packed %d file(s)" -msgstr "Được gói lại %d tập tin" +msgstr "Đã đóng gói %d tập tin" msgid "Error creating file '%s'" -msgstr "Sai lầm chế tạo tập tin '%s'" +msgstr "Lỗi xảy ra trong khi kiến tạo tập tin '%s'" msgid "Error writing file '%s'" -msgstr "Sai lầm lưu tập tin '%s'" +msgstr "Lỗi xảy ra trong khi ghi tập tin '%s'" msgid "Saved packed file to: %s" -msgstr "Được lưu tập tin gói có tên: %s" +msgstr "Lưu tập tin được đóng gói vào: %s" msgid "Error restoring temp file (check files '%s' '%s')" -msgstr "Sai lầm hoàn lại tập tin tạm thời (kiểm tra tập tin '%s' '%s')" +msgstr "Lỗi xảy ra trong khi khôi phục lại tập tin tạm thời (kiểm tra các tập tin '%s' '%s')" msgid "Error deleting '%s' (ignored)" -msgstr "Sai lầm xóa '%s' (không quan tâm)" +msgstr "Lỗi xảy ra trong khi xóa '%s' (bỏ qua)" msgid "Use existing file (instead of packed): %s" -msgstr "Dùng tếp tồn tại (thay thế được gói lại): %s" +msgstr "Sử dụng tập tin đang tồn tại (thay vì tập tin được đóng gói): %s" msgid "Cannot pack absolute file: '%s'" -msgstr "Không thể gói lại tập tin tuyệt đối '%s'" +msgstr "Không thể đóng gói tập tin tuyệt đối: '%s'" msgid "Cannot unpack individual Library file, '%s'" -msgstr "Không thể gói lại tập tin Thư Viện riêng, '%s'" +msgstr "Không thể mở gói từng tập tin Thư Viện, '%s'" msgid "ParticleSystem" -msgstr "HệThốngHạt" +msgstr "Hệ Thống Hạt" msgid "ParticleSettings" -msgstr "CàiĐặtHạt" +msgstr "Sắp Đặt Hạt" msgid "%i frames found!" -msgstr "Kiếm được %i bức ảnh!" +msgstr "Tìm thấy %i khung hình!" msgid "%i points found!" -msgstr "Kiếm được %i điểm!" +msgstr "Tìm thấy %i điểm!" msgid "No valid data to read!" -msgstr "Không có dữ liệu hợp lệ để nhập" +msgstr "Không có dữ liệu nào hợp lệ để đọc cả!" msgid "%i cells + High Resolution cached" -msgstr "%i tế bào + Độ Phân Giải Cao Được chứa lại" +msgstr "%i tế bào + Độ Phân Giải Cao được ghi trong bộ nhớ đệm" msgid "%i cells cached" -msgstr "%i tế bào được chứa lại" +msgstr "%i tế bào được ghi trong bộ nhớ đệm" msgid "%i frames on disk" -msgstr "%i bức ảnh trong đĩa" +msgstr "%i khung hình trên đĩa" msgid "%s frames in memory (%s)" -msgstr "%s bức ảnh trong bộ nhớ (%s)" +msgstr "%s khung hình trong bộ nhớ (%s)" msgid "%s, cache is outdated!" -msgstr "%s, đệm chứa là lỗi thời!" +msgstr "%s, bộ nhớ đệm lỗi thời rồi!" msgid "%s, not exact since frame %i" -msgstr "%s, không chính xác từ bức ảnh %i" +msgstr "%s, không chính xác từ khung hình %i" msgid "Warning" @@ -106512,172 +117912,192 @@ msgstr "Cảnh Báo" msgid "Invalid Input Error" -msgstr "Sai Lầm Ngõ Vào Không Hợp Lệ" +msgstr "Lỗi Đầu Vào Bất Hợp Lệ" msgid "Invalid Context Error" -msgstr "Sai Lầm Bối Cảnh Không Hợp Lệ" +msgstr "Lỗi Ngữ Cảnh Bất Hợp Lệ" msgid "Out Of Memory Error" -msgstr "Hết Bộ Nhớ" +msgstr "Lỗi Bộ Nhớ Cạn Kiệt" msgid "Undefined Type" -msgstr "Loại Không Xác Định" +msgstr "Loại Bất Định" msgid "Can't add Rigid Body to non mesh object" -msgstr "Không thể kèm Thân Rắn với vật thể vô mạng lưới" +msgstr "Không thể thêm Thân Cứng vào đối tượng phi khung lưới" msgid "Can't create Rigid Body world" -msgstr "Không thể cheế tạo thế giới Thân Rắn" +msgstr "Không thể kiến tạo thế giới Thân Cứng" msgid "Compiled without Bullet physics engine" -msgstr "Được biên dịch thiếu động cơ vật lý Bullet (Đạn)" +msgstr "Được biên tập không có bộ máy vật lý Đạn Bắn" msgid "LIB: object lost from scene: '%s'" -msgstr "THƯ VIỆN: vật thể bị mất từ cảnh: '%s'" +msgstr "Thư Viện: đối tượng vắng mặt trong cảnh: '%s'" msgid "RenderView" -msgstr "MànKếtXuất" +msgstr "Góc Nhìn Kết Xuất" msgctxt "MovieClip" msgid "Plane Track" -msgstr "Theo Đõi Mặt Phẳng" +msgstr "Giám Sát Bình Diện" msgid "At least 8 common tracks on both keyframes are needed for reconstruction" -msgstr "Cần ít 8 đường vết tại cùng hai bức ảnh để có thể xây dựng lại" +msgstr "Cần ít nhất 8 dấu giám sát tương đồng trên cả hai khung khóa để phục hồi" msgid "Blender is compiled without motion tracking library" -msgstr "Blender được biên dịch thiếu thư viện theo dõi gõi chuyển động" +msgstr "Bản Blender được biên dịch này không có gắn thư viện giám sát di chuyển" msgid "Original Mode" -msgstr "Chế Độ Ban Đầu" +msgstr "Chế Độ Gốc" msgid "Could not load volume for writing" -msgstr "Không được nhập đĩa cho ghi thông tin" +msgstr "Không thể nạp thể tích vào hòng viết ra được" msgid "Could not write volume: %s" -msgstr "Không thể lưu vào đĩa: %s" +msgstr "Không thể viết tập tin: %s" + + +msgid "Could not write volume: Unknown error writing VDB file" +msgstr "Không thể viết ra ổ đĩa được: Lỗi không xác định khi ghi tập tin VDB" + + +msgid "workspaces" +msgstr "không gian làm việc" + + +msgid "worlds" +msgstr "thế giới" msgid "Cannot open or start AVI movie file" -msgstr "Không được mở hay bắt đầu tập tin phim AVI" +msgstr "Không thể mở hay khởi động tập tin phim AVI được" msgid "Error writing frame" -msgstr "Sai lầm lưu bức ảnh" +msgstr "Lỗi xảy ra trong khi ghi khung hình" msgid "No valid formats found" -msgstr "Không tìm được định dạng hợp lệ" - - -msgid "Can't allocate ffmpeg format context" -msgstr "Không thể tạo bố cảnh định dạng ffmpeg" +msgstr "Không tìm thấy định dạng hợp lệ nào cả" msgid "Render width has to be 720 pixels for DV!" -msgstr "Bề rộng kết xuất cần bằng 720 điểm ảnh cho DVI" +msgstr "Đối với DV, chiều rộng kết xuất phải bằng 720 điểm ảnh!" msgid "Render height has to be 480 pixels for DV-NTSC!" -msgstr "Bề cao kết xuất cần bằng 480 điểm ảnh cho DV-NTSC!" +msgstr "Đối với DV-NTSC, chiều cao kết xuất phải bằng 480 điểm ảnh!" msgid "Render height has to be 576 pixels for DV-PAL!" -msgstr "Bề cao kết xuất cần bằng 576 điểm ảnh cho DV-PAL" +msgstr "Đối với DV-PAL, chiều cao kết xuất phải bằng 576 điểm ảnh!" msgid "Error initializing video stream" -msgstr "Sai lam khởi động dòng video" +msgstr "Lỗi xảy ra trong khi khởi thủy luồng video" msgid "Error initializing audio stream" -msgstr "Sai lầm khởi động dòng âm thanh" +msgstr "Lỗi xảy ra trong khi khởi thủy luồng âm thanh" msgid "Could not open file for writing" -msgstr "Không được mở tếp cho ghi thông tin" +msgstr "Không thể mở tập tin để ghi thông tin được" msgid "Could not initialize streams, probably unsupported codec combination" -msgstr "Không được khởi động các dòng, có lẽ vì ghép mã hóa giải mã không phù hợp" +msgstr "Không thể khởi thủy các luồng. Có lẽ là vì tập hợp bộ hóa giải mã chưa được hỗ trợ" + + +msgid "Library database with null library data-block pointer!" +msgstr "Cơ sở dữ liệu thư viện với con trỏ khối dữ liệu thư viện NULL (trống rỗng)!" msgid "ID %s is in local database while being linked from library %s!" -msgstr "ID %s đang ở trong cơ sở dữ liệu địa phương khi đang liên kết từ thư viện %s!" +msgstr "ID %s nằm trong cơ sở dữ liệu địa phương trong khi được kết nối từ thư viện %s!" msgid "Library ID %s not found at expected path %s!" -msgstr "không tìm được thư viện ID %s tại đường dẫn %s!" +msgstr "Không tìm thấy ID thư viện %s tại đường dẫn dự kiến %s!" msgid "Library ID %s in library %s, this should not happen!" -msgstr "Thu viện ID %s đang ở trong thư viện %s, cái này nên không xảy ra!" +msgstr "Chỉ số ID thư viện %s trong thư viện %s, điều này không đúng!" + + +msgid "ID %s has null lib pointer while being in library %s!" +msgstr "ID %s có con trỏ thư viện null (rỗng, vô nghĩa) khi đang ở trong thư viện %s!" msgid "ID %s has mismatched lib pointer!" -msgstr "ID %s có con chỉ thư viện không đúng" +msgstr "ID %s có tham chiếu thư viện không xứng khớp!" msgid "ID %s not found in library %s anymore!" -msgstr "Không còn tìm được ID %s trong thư viện %s nữa" +msgstr "Không tìm thấy ID %s trong thư viện %s nữa!" msgid "ID %s uses shapekey %s, but its 'from' pointer is invalid (%p), fixing..." -msgstr "ID %s đang dùng mẫu dạng %s, nhưng con chỉ 'từ' của nó không hợp lệ (%p), đang sửa..." +msgstr "ID %s sử dụng hình mẫu %s, song điểm tham chiếu 'từ' (đâu) của nó không hợp lệ (%p), sửa lại..." msgid "Shapekey %s has an invalid 'from' pointer (%p), it will be deleted" -msgstr "Dạng mẫu %s có một con trỏ 'từ' không hợp lệ (%p), nó sẽ bị xóa" +msgstr "Hình mẫu %s có con trỏ 'từ' (from) (%p) không hợp lệ, nó sẽ bị xóa đi" + + +msgid "The file was saved by a newer version, open it with Blender %s or later" +msgstr "Tập tin vốn được lưu bằng phiên bản mới hơn, xin hãy mở tập tin bằng Blender %s hoặc phiên bản mới hơn nhé" msgid "insufficient content" -msgstr "không đú nội dung" +msgstr "nội dung không đầy đủ" msgid "unknown error reading file" -msgstr "sai lầm lạ khi đọc tập tin" +msgstr "lỗi không lường trước được xảy ra trong khi đang đọc tập tin" msgid "Unable to read" -msgstr "Không được đọc" +msgstr "Không thể đọc được" msgid "Unable to open" -msgstr "Không được mở" +msgstr "Không thể mở được" msgid "Library '%s', '%s' had multiple instances, save and reload!" -msgstr "Thư viện '%s', '%s' có nhiều thực thể, lưu và nhập lại" +msgstr "Thư viện '%s', '%s' có nhiều thực thể, lưu và nạp lại!" msgid "LIB: Data refers to main .blend file: '%s' from %s" -msgstr "THƯ VIỆN: Dữ liệu tham chiếu đến tập tin .blend chánh: '%s' từ '%s'" +msgstr "Thư Viện: Dữ liệu tham chiếu đến tập tin .blend chính: '%s' từ '%s'" msgid "LIB: %s: '%s' is directly linked from '%s' (parent '%s'), but is a non-linkable data type" -msgstr "THƯ VIỆN: %s: '%s' được liên kết trực tiếp từ '%s' (phụ huynh '%s'), nhưng là kiểu dữ liệu không thể liên kết" +msgstr "Thư Viện: %s: '%s' được kết nối trực tiếp từ '%s' (phụ huynh '%s'), nhưng là kiểu dữ liệu không thể kết nối được" msgid "LIB: %s: '%s' missing from '%s', parent '%s'" -msgstr "THƯ VIỆN: %s: '%s' thiếu từ '%s', phụ huynh '%s'" +msgstr "Thư Viện: %s: '%s' vắng mặt trong '%s', phụ huynh '%s'" msgid "Read packed library: '%s', parent '%s'" -msgstr "Đọc thư viện được gói lại: '%s', phụ huynh '%s'" +msgstr "Đọc thư viện đóng gói: '%s', phụ huynh '%s'" msgid "Read library: '%s', '%s', parent '%s'" @@ -106685,19 +118105,23 @@ msgstr "Đọc thư viện: '%s', '%s', phụ huynh '%s'" msgid "Cannot find lib '%s'" -msgstr "Không thể tìm thư viện '%s'" +msgstr "Không tìm thấy thư viện '%s'" msgid "Unable to open blend " -msgstr "Không được mở blend" +msgstr "Không mở được bản blend " + + +msgid "Critical blend-file corruption: Conflicts and/or otherwise invalid data-blocks names (see console for details)" +msgstr "Lỗi hư hoại tập tin blend nghiêm trọng xảy ra: Xung đột và/hoặc tên khối dữ liệu không hợp lệ (xin xem bảng điều khiển dòng lệnh để biết chi tiết)" msgid "Failed to read blend file '%s': %s" -msgstr "Đọc tập tin blend '%s': %s bị thất bại" +msgstr "Việc đọc tập tin blend '%s': %s bị thất bại" msgid "Failed to read blend file '%s', not a blend file" -msgstr "Đọc tập tin blend '%s' bị thất bại, không phải là tập tin .blend" +msgstr "Việc đọc tập tin blend '%s' bị thất bại, không phải là tập tin .blend" msgid "Unable to read '%s': %s" @@ -106705,7 +118129,7 @@ msgstr "Không thể đọc được '%s': %s" msgid "Unrecognized file format '%s'" -msgstr "Định dạng tập tin chưa biết đến '%s'" +msgstr "Định dạng tập tin không nhận biết '%s'" msgid "Unable to open '%s': %s" @@ -106716,20 +118140,32 @@ msgid "GP_Palette" msgstr "Bảng_BútSáp" +msgid "Non-Empty object '%s' cannot duplicate collection '%s' anymore in Blender 2.80 and later, removed instancing" +msgstr "Đối tượng Phi Trống Rỗng '%s' không thể nhân đôi bộ sưu tập '%s' trong Blender 2.80 trở lên nữa, đã loại bỏ thực thể hóa" + + msgid "Hidden %d" -msgstr "Được Ẩn %d" +msgstr "Ẩn Giấu %d" msgid "Eevee material conversion problem. Error in console" -msgstr "Vấn đề biến đổi vật liệu. Xem sai lầm trong diện điều khiển" +msgstr "Vấn đề về chuyển đổi nguyên vật liệu trong máy kết xuất Eevee. Xem thông báo về lỗi lầm trong cửa sổ bàn giao tiếp (console)" + + +msgid "Proxy lost from object %s lib %s" +msgstr "Đại diện bị mất từ đối tượng %s thư viện %s" + + +msgid "Proxy lost from object %s lib " +msgstr "Đại diện bị mất từ đối tượng %s thư viện " msgid "2D_Animation" -msgstr "HoạtHình_2D" +msgstr "Hoạt Họa 2D" msgid "Sculpting" -msgstr "Khắc" +msgstr "Điêu Khắc" msgid "VFX" @@ -106737,219 +118173,259 @@ msgstr "VFX (Hiệu Ứng Thị Giác)" msgid "Video_Editing" -msgstr "BiênTập_Video" +msgstr "Biên Soạn Video" msgid "Untitled" -msgstr "Vô Tựa" +msgstr "Vô Danh" msgid "Unable to make version backup: filename too short" -msgstr "Không chế tạo được phiên bản dự phòng: tên tập tin quá ngắn" +msgstr "Không thể tạo bản sao phiên bản để dự trữ được: tên tập tin ngắn quá" msgid "Unable to make version backup" -msgstr "Không chế tạo được đự phòng phiên bản" +msgstr "Không thể tạo bản sao phiên bản để dự trữ được" + + +msgid "Checking validity of current .blend file *BEFORE* save to disk" +msgstr "Kiểm tra tính hợp lệ của tập tin .blend hiện tại *TRƯỚC KHI* lưu vào đĩa" + + +msgid "Critical data corruption: Conflicts and/or otherwise invalid data-blocks names (see console for details)" +msgstr "Lỗi hư hoại dữ liệu nghiêm trọng xảy ra: Xung đột và/hoặc tên khối dữ liệu không hợp lệ (xem bảng điều khiển dòng lệnh để biết chi tiết)" msgid "Version backup failed (file saved with @)" -msgstr "Phiên bản dự phòng bị thất bại (tập tin lưu có @)" +msgstr "Việc tạo bản sao phiên bản để dự trữ bị thất bại (tập tin được lưu với @)" msgid "Cannot change old file (file saved with @)" -msgstr "Không thể đổi tập tin cũ (tập tin được lưu với @)" +msgstr "Không thể đổi tập tin cũ được (tập tin đã được lưu với @)" msgid "Cannot open file %s for writing: %s" -msgstr "Không mở được tập tin %s cho ghi: %s" +msgstr "Không mở được tập tin %s để ghi: %s" msgid "Zero normal given" -msgstr "Được cho pháp tuyến không" +msgstr "Không thấy có pháp tuyến nào được cung cấp cho cả" msgid "Select at least two edge loops" -msgstr "Chọn ít nhất hai vòng cạnh" +msgstr "Phải chọn ít nhất hai vòng cạnh mới được" msgid "Select an even number of loops to bridge pairs" -msgstr "Chọn vòng số lượng chẳn cho cầu nối đôi" +msgstr "Chọn một số vòng mạch là số chẵn để có thể cầu nối các đôi với nhau được" msgid "Selected loops must have equal edge counts" -msgstr "Chọn hai vòng có số lượng cạnh bằng nhau" +msgstr "Các vòng mạch đã chọn cần có số cạnh bằng nhau" msgid "Could not connect vertices" -msgstr "Không được kết nối đỉnh" +msgstr "Không thể kết nối các điểm đỉnh được" msgid "Select two edge loops or a single closed edge loop from which two edge loops can be calculated" -msgstr "Chọn hai vòng cạnh hay một vòng cạnh đóng có thể tính được hai vòng cạnh" +msgstr "Chọn hai vòng cạnh hoặc một đơn vòng cạnh đóng kín mà từ đó hai vòng cạnh có thể được tính toán" msgid "Closed loops unsupported" -msgstr "Không hỗ trợ vòng đóng" +msgstr "Không hỗ trợ vòng mạch kín" msgid "Loops are not connected by wire/boundary edges" -msgstr "Vóng không kết nối bằng cạnh sợi dây/ranh giới" +msgstr "Vòng mạch không kết nối với nhau bởi các cạnh lưới/ranh giới" msgid "Connecting edge loops overlap" -msgstr "Đang kết nối vòng cạnh lấn trên nhau" +msgstr "Kết nối các vòng cạnh đè gối lên nhau" msgid "Requires at least three vertices" -msgstr "Yêu cầu có ba đỉnh trở lên" +msgstr "Đòi hỏi ít nhất ba điểm đỉnh trở lên" msgid "No edge rings found" -msgstr "Không tìm được cạnh vành" +msgstr "Không tìm thấy vành đai cạnh nào cả" msgid "Edge-ring pair isn't connected" -msgstr "Đôi vành-cạnh chứa được kết nối" +msgstr "Đôi vành đai cạnh không kết nối với nhau" msgid "Edge-rings are not connected" -msgstr "Vành-cạnh chưa được kết nối" +msgstr "Các vành đai-cạnh không kết nối với nhau" msgid "color_index is invalid" -msgstr "chỉSố_màu không hợp lệ" +msgstr "chỉ số màu (color_index) không hợp lệ" msgid "Compositing | Tile %u-%u" -msgstr "Đang Ghép : Ô %u-%u" +msgstr "Tổng Hợp | Ô %u-%u" msgid "Compositing | Initializing execution" -msgstr "Đang Ghép | Khởi động thực thi" +msgstr "Tổng Hợp | Khởi thủy (init) thi hành" msgid "Compositing | Operation %i-%li" -msgstr "Đang Ghép | Thao tác %i-%li" +msgstr "Tổng Hợp | Thao Tác %i-%li" msgid "Compositing | Determining resolution" -msgstr "Đang Ghép | Đang quyết định độ phân giải" +msgstr "Tổng Hợp | Xác định độ phân giải" msgid "Compositing | De-initializing execution" -msgstr "Đang Ghép | Bớt khởi động thực thị" +msgstr "Tổng Hợp | Kết thúc khởi thuỷ (deinit) thi hành" msgid "Basic" msgstr "Cơ Bản" +msgid "Compiling Shaders (%d remaining)" +msgstr "Đang Biên Dịch các Bộ Tô Bóng (%d còn lại)" + + +msgid "Optimizing Shaders (%d remaining)" +msgstr "Đang Tối Ưu Hóa các Bộ Tô Bóng (%d còn lại)" + + msgid "Incompatible Light cache version, please bake again" -msgstr "Phiên bản đệm chứa Ánh Sáng không phù hợp, làm ơn nướng lần nữa" +msgstr "Phiên bản bộ đệm nhớ Ánh Sáng không tương thích, làm ơn nướng lại" msgid "Error: Light cache is too big for the GPU to be loaded" -msgstr "Sai lầm: Đệm chứa Ánh Sáng qúa to để nhập vào GPU" +msgstr "Lỗi: Bộ đệm nhớ ánh sáng quá lớn so với dung lượng mà GPU của bạn có thể nạp vào" msgid "Error: Light cache dimensions not supported by the GPU" -msgstr "Sai lầm: GPU không hỗ trợ cỡ thước của đệm chứa Ánh Sáng " +msgstr "Lỗi: Kích thước bộ đệm nhớ về ánh sáng không được bộ xử lý đồ họa hỗ trợ" msgid "Baking light cache" -msgstr "Đang nướng đệm chứa ánh sáng" +msgstr "Nướng bộ đệm nhớ ánh sáng" msgid "Error: LightCache is too large and will not be saved to disk" -msgstr "Sai lầm: Đệm chứa Ánh Sáng qúa to và sẽ không được lưu vào đĩa" +msgstr "Lỗi: Bộ Đệm Nhớ Ánh Sáng quá lớn và sẽ không được lưu vào đĩa" msgid "%d Ref. Cubemaps, %d Irr. Samples (%s in memory)" -msgstr "%d Bản Đồ Lập Phương Phản Xạ, %d Mẫu Vật Sự Rọi (%s trong bộ nhớ) " +msgstr "%d Bản Đồ Lập Phương Th.Chiếu, %d Mẫu Vật Chiếu Sáng (%s trong bộ nhớ)" msgid "No light cache in this scene" -msgstr "Không có đệm chứa trong cảnh này" +msgstr "Không có bộ đệm nhớ ánh sáng trong cảnh này" + + +msgid "Gpencil" +msgstr "BútChìDầu" msgid "GpencilMode" -msgstr "ChếĐộBútSắp" +msgstr "Chế Độ Bút Chì Dầu" msgid "UV/Image" -msgstr "UV/Ảnh" +msgstr "UV/Hình Ảnh" msgid "Select ID Debug" -msgstr "Chọn Sửa Lỗi Lầm ID" +msgstr "Chọn ID Điều Tra và Sửa Lỗi" msgid "Select ID" msgstr "Chọn ID" +msgid "Select-Next" +msgstr "Chọn-Tiếp theo" + + msgid "Workbench" msgstr "Bàn Công Việc" msgid "NLA Strip Controls" -msgstr "Đồ Điều Khiển Đoạn NLA" +msgstr "Các Điều Khiển cho Dải NLA" msgid "F-Curve visibility in Graph Editor" -msgstr "Sự hiển thị của Cong-F trong Trình Biên Soạn Biểu Đồ" +msgstr "Đường Cong-F hữu hình trong Trình Biên Soạn Đồ Thị" msgid "Grease Pencil layer is visible in the viewport" -msgstr "Lớp Bút Sáp đang hiển thị trong màn chiếu" +msgstr "Tầng Bút Chì Dầu hữu hình trong cổng nhìn" + + +msgid "Toggle visibility of Channels in Graph Editor for editing" +msgstr "Bật/tắt tầm nhìn của các Kênh trong Trình Biên Soạn Đồ Thị để chỉnh sửa" msgid "Display channel regardless of object selection" -msgstr "Hiển thị kênh không kể có vật thể nào được chọn" +msgstr "Kênh hiển thị bất kể lựa chọn đối tượng là gì" msgid "Enable F-Curve modifiers" -msgstr "Bật bộ điều chỉnh Cong-F" +msgstr "Bật các bộ điều chỉnh Đường Cong-F" msgid "Make channels grouped under this channel visible" -msgstr "Hiện các kênh bị nhóm lại với kênh này" +msgstr "Hiển thị các kênh đã nhóm trong kênh này" msgid "NLA Track is the only one evaluated in this animation data-block, with all others muted" -msgstr "Chỉ tính toán Rãnh NLA này trong cục dữ liệu hoạt hình này, với các rãnh khác bị tắt tiếng" +msgstr "Rãnh NLA là cái duy nhất được tính toán trong khối dữ liệu hoạt họa này, trong khi toàn bộ các rãnh khác bị chặn âm thanh" msgid "Editability of keyframes for this channel" -msgstr "Sự có thể biên tập của các bức ảnh mẫu cho kênh này" +msgstr "Khả năng biên soạn của các khung khóa cho kênh này" msgid "Editability of NLA Strips in this track" -msgstr "Sự có thể biên tập của các Đoạn NLA trong rãnh này" +msgstr "Khả năng biên soạn của Các Đoạn NLA trong rãnh này" msgid "Does F-Curve contribute to result" -msgstr "Cong-F có góp phần nào cho kết qủa hay không" +msgstr "Đường Cong-F có đóng góp phần mình vào kết quả hay không" msgid "Temporarily disable NLA stack evaluation (i.e. only the active action is evaluated)" -msgstr "Tạm thời tắt tính số xếp đống NLA (ví dụ chỉ tính số hành động hoạt động)" +msgstr "Tạm thời không cho phép ngăn xếp NLA ước tính nữa (tức là chỉ hành động đang hoạt động là được ước tính mà thôi)" + + +msgid "Show all keyframes during animation playback and enable all frames for editing (uncheck to use only the current keyframe during animation playback and editing)" +msgstr "Hiển thị toàn bộ các khung khóa trong khi chơi lại hoạt họa và cho phép biên soạn tất cả các khung hình (bỏ dấu kiểm để chỉ sử dụng khung khóa hiện tại trong khi chơi lại và biên soạn hoạt họa mà thôi)" msgid "Do channels contribute to result (toggle channel muting)" -msgstr "Các kênh có góp phần cho kết qủa hay không (bật/tắt cắt tiếng kênh)" +msgstr "Các kênh có đóng góp vào kết quả hay không (bật/tắt khả năng hoạt động của kênh)" msgid "Display action without any time remapping (when unpinned)" -msgstr "Hiển thị hành động mà không ánh xạ lại thời gian (khi gỡ đóng đinh)" +msgstr "Hiển thị hành động mà không sắp xếp lại bất cứ thời gian nào (khi bỏ đinh ghim)" msgid "Can't edit this property from a linked data-block" -msgstr "Không thể biên tập đặc tính này từ một cục dữ liệu được liên kết" +msgstr "Không thể biên soạn tính chất này từ một khối dữ liệu" + + +msgid "No channels to operate on" +msgstr "Không có kênh nào để thao tác cả" + + +msgid "No keyframes to focus on" +msgstr "Không có khung khóa nào để tập trung vào cả" msgid "Nothing selected" -msgstr "Chưa chọn cái gì" +msgstr "Chưa chọn cái gì cả" msgid "" @@ -106961,75 +118437,87 @@ msgstr "" msgid "Marker %.2f offset %s" -msgstr "Ký hiệu %.2f dịch %s" +msgstr "Dấu mốc %.2f dịch chuyển %s" msgid "Marker %d offset %s" -msgstr "Ký hiệu %d dịch %s" +msgstr "Dấu mốc %d dịch chuyển %s" msgid "Marker offset %s" -msgstr "Dịch ký hiệu %s" +msgstr "Dịch chuyển dấu mốc %s" msgid "Selecting the camera is only supported in object mode" -msgstr "Chỉ hỗ trợ chọn máy quay phim trong chế độ vật thể" +msgstr "Việc chọn máy quay phim chỉ được hỗ trợ trong chế độ đối tượng mà thôi" msgid "Scene not found" -msgstr "Không kiếm được cảnh " +msgstr "Không tìm thấy cảnh nào cả" msgid "Cannot re-link markers into the same scene" -msgstr "Không thể liên kết lại ký hiệu với cùng cảnh" +msgstr "Không thể tái kết nối các dấu mốc vào cùng cảnh được" msgid "Target scene has locked markers" -msgstr "Ký hiệu cảnh mục tiêu được khóa" +msgstr "Cảnh mục tiêu có các dấu mốc đã bị khóa lại" msgid "Select a camera to bind to a marker on this frame" -msgstr "Chọn một máy quy phim để trói mội ký hiệu trên bức ảnh này " +msgstr "Chọn một máy quay phim để kết buộc vào một dấu mốc trên khung hình này" + + +msgid "No markers are selected" +msgstr "Không có dấu mốc nào đã được chọn cả" + + +msgid "Markers are locked" +msgstr "Các dấu mốc đã bị khóa lại rồi" msgid "Start frame clamped to valid rendering range" -msgstr "Kẹp lại bức ảnh đầu vào phạm vi kết xuất hợp lệ" +msgstr "Hạn định khung hình đầu nội trong phạm vi kết xuất hợp lệ" msgid "End frame clamped to valid rendering range" -msgstr "Kẹp lại bức ảnh cuối vào phạm vi kết xuất hợp lệ" +msgstr "Hạn định khung hình cuối nội trong phạm vi kết xuất hợp lệ" msgid "Expected an animation area to be active" -msgstr "Định có một khu vực hoạt hình đang hoạt động" +msgstr "Dự kiến là một khu vực hoạt họa sẽ đi vào tình trạng hoạt động" msgid "Paste driver: no driver to paste" -msgstr "Dán điều vận: không có điều vận để dán" +msgstr "Dán điều vận: không có điều vận nào để dán được" msgid "No driver to copy variables from" -msgstr "Không có điều vận để chép biến" +msgstr "Không có điều vận nào để sao chép các biến số từ nó cả" msgid "Driver has no variables to copy" -msgstr "Điều vận chưa có biến để chép" +msgstr "Điều Vận chưa có biến số nào để có thể sao chép" + + +msgid "No driver variables in the internal clipboard to paste" +msgstr "Không có biến điều vận nào trong bảng nhớ tạm để dán cả" msgid "Cannot paste driver variables without a driver" -msgstr "Không thể dán biến điều vận nếu không có điều vận nào" +msgstr "Không thể dán các biến số điều vận nếu không có điều vận" msgid "Could not add driver, as RNA path is invalid for the given ID (ID = %s, path = %s)" -msgstr "Không được thêm điều vận, đường dẫn RNA không hợp lệ cho ID này (ID = %s, đường dẫn = %s)" +msgstr "Không thể thêm điều vận, vì đường dẫn RNA là không hợp lệ đối với ID đã cho này (ID = %s, đường dẫn = %s)" msgid "Could not find driver to copy, as RNA path is invalid for the given ID (ID = %s, path = %s)" -msgstr "Không kiếm đươc điều vận để chép, đường dẫn RNA không hợp lệ cho ID này (ID = %s, đường dẫn = %s)" +msgstr "Không tìm thấy điều vận nào để sao chép cả, vì đường dẫn RNA là không hợp lệ đối với ID đã cho này (ID = %s, đường dẫn = %s)" msgid "Could not paste driver, as RNA path is invalid for the given ID (ID = %s, path = %s)" -msgstr "Không dán được điều vận, vì đường dẫnRNA không hợp lệ cho ID này (ID = %s, đường dẫn = %s)" +msgstr "Không thể dán được điều vận, vì đường dẫn RNA là không hợp lệ đối với ID đã cho này (ID = %s, đường dẫn = %s)" msgid "Out" @@ -107037,7 +118525,7 @@ msgstr "Ra" msgid "" -msgstr "" +msgstr "" msgid "y = (Ax + B)" @@ -107049,7 +118537,7 @@ msgstr "✕ (Ax + B)" msgid "Add Control Point" -msgstr "Thêm Điểm Kiểm Soát" +msgstr "Thêm Điểm Điều Khiển" msgid "Delete Modifier" @@ -107057,479 +118545,651 @@ msgstr "Xóa Bộ Điều Chỉnh" msgid "Add a new control-point to the envelope on the current frame" -msgstr "Thêm một điểm kiểm soát mới cho bao bì trên bức ảnh hiện tại" +msgstr "Thêm điểm điều khiển mới vào phong bao trên khung hình hiện tại" msgid "Delete envelope control point" -msgstr "Xóa điểm kiểm soát bao bì" +msgstr "Xóa điểm điều khiển phong bao" msgid "Coefficient" -msgstr "Hệ Số" +msgstr "Hệ số" + + +msgid "Modifier requires original data" +msgstr "Bộ điều chỉnh yêu cầu dữ liệu gốc" + + +msgid "No RNA pointer available to retrieve values for this F-curve" +msgstr "Không có con trỏ RNA nào để truy xuất các giá trị cho Đường Cong-F này hết" msgid "No suitable context info for active keying set" -msgstr "Không có định nghĩa phù hợp cho tập bức ảnh mẫu đang hoạt động" +msgstr "Không có thông tin về ngữ cảnh phù hợp cho Bộ Khóa đang hoạt động" msgid "Keying set failed to insert any keyframes" -msgstr "Tập bức ảnh mẫu chèn bức ảnh mẫu không thành cộng" +msgstr "Bộ Khóa thất bại trong việc chèn thêm các khung khóa vào" msgid "Keying set failed to remove any keyframes" -msgstr "Tập bức ảnh mẫu không xóa được bức ảnh mẫu nào" +msgstr "Việc xóa bất cứ khung khóa nào trong bộ bị thất bại" msgid "This property cannot be animated as it will not get updated correctly" -msgstr "Không thể làm hoạt hình với đặc tính này vì không thể nâng cấp hợp lệ" +msgstr "Tính chất này không thể hoạt họa được vì nó sẽ không được cập nhật đúng đắn" msgid "Failed to resolve path to property, try manually specifying this using a Keying Set instead" -msgstr "Tìm đường dẫn đến đặc tính bị thất bại, bằng tay thử xác định Tập Bức Ảnh Mẫu này thay thế" +msgstr "Việc phân tích đường dẫn tới tính chất bị thất bại. Thay vì, xin hãy thử xác định cái này dùng một Bộ Khóa một cách thủ công" msgid "No active Keying Set" -msgstr "Không có Tập Bức Ảnh Mẫu hoạt động" +msgstr "Không có Bộ Khóa nào đang hoạt động cả" + + +msgid "Could not update flags for this F-curve, as RNA path is invalid for the given ID (ID = %s, path = %s)" +msgstr "Không thể nâng cấp được các cờ dành cho Đường Cong-F này, vì đường dẫn RNA là không hợp lệ đối với ID đã cho (ID = %s, đường dẫn = %s)" msgid "Keying set '%s' - successfully added %d keyframes" -msgstr "Tập bức ảnh mẫu '%s' - kèm thêm %d bức ảnh mẫu đã thành cộng" +msgstr "Bộ Khóa '%s' - đã thành công trong việc thêm %d khung khóa vào" msgid "Successfully added %d keyframes for keying set '%s'" -msgstr "Thành công kèm thêm %d bức ảnh mẫu cho tập bức ảnh mẫu '%s'" +msgstr "Đã thêm %d khung khóa vào Bộ Khóa '%s'" msgid "Successfully removed %d keyframes for keying set '%s'" -msgstr "Thành công xóa được %d bức ảnh mẫu cho tập bức ảnh mẫu '%s'" +msgstr "Đã xóa %d khung khóa khỏi Bộ Khóa '%s'" msgid "Not deleting keyframe for locked F-Curve '%s', object '%s'" -msgstr "Sẽ không xóa bức ảnh mẫu cho Cong-G bị khóa '%s', vật thể '%s'" +msgstr "Không xóa khung khóa khỏi Đường Cong-F đang bị khóa '%s', đối tượng '%s'" msgid "%d object(s) successfully had %d keyframes removed" -msgstr "đã thàng công xóa %d bức ảnh mẫu từ %d vật thể" +msgstr "%d đối tượng đã có %d khung khóa được xóa đi thành công" msgid "No keyframes removed from %d object(s)" -msgstr "Không xóa bức ảnh mẫu nào từ %d vật thể" +msgstr "Không có khung khóa nào được/bị xóa khỏi %d đối tượng" msgid "\"%s\" property cannot be animated" -msgstr "Đặc tính \"%s\" không thể làm hoạt hình" +msgstr "Tính chất \"%s\" không thể hoạt họa được" msgid "Button doesn't appear to have any property information attached (ptr.data = %p, prop = %p)" -msgstr "Nút không gắn với thông tin đặc tính nào (ptr.data = %p, prop = %p)" +msgstr "Nút bấm hình như không có thông tin tính chất nào gắn liền với nó (ptr.data = %p, prop = %p)" msgid "Not deleting keyframe for locked F-Curve for NLA Strip influence on %s - %s '%s'" -msgstr "Không xóa bức ảnh mẫu cho Cong-F bị khóa của sự ảnh hưởng Dãy NLA với %s - %s '%s'" +msgstr "Không xóa khung khóa đối với Đường Cong-F đã bị khóa vì ảnh hưởng của Dải NLA trên %s - %s '%s'" msgid "Keying set '%s' not found" -msgstr "Không tìm được tập bức ảnh mẫu '%s'" +msgstr "Không tìm thấy bộ khóa '%s'" msgid "No active Keying Set to remove" -msgstr "Không có Tập Bức Ảnh Mẫu hoạt động nào để xóa" +msgstr "Không có Bộ Khóa đang hoạt động nào để xóa cả" msgid "Cannot remove built in keying set" -msgstr "Không xóa được tập bức ảnh mẫu có sẵn" +msgstr "Không thể xóa Bộ Khóa gắn sẵn được" msgid "No active Keying Set to add empty path to" -msgstr "Không có Tập Bức Ảnh Mẫu hoạt động nào để thêm đường rỗng" +msgstr "Không có Bộ Khóa đang hoạt động nào để cho thêm đường dẫn trống vào" msgid "No active Keying Set to remove a path from" -msgstr "Không có Tập Bức Ảnh Mẫu hoạt động nào để xóa một đường dẫn" +msgstr "Không có Bộ Khóa đang hoạt động nào để xóa đường dẫn khỏi đó cả" msgid "No active Keying Set path to remove" -msgstr "Không có đường Tập Bức Ảnh Mẫu đang hoạt động để xóa" +msgstr "Không có đường dẫn của Bộ Khóa đang hoạt động nào để xóa đi cả" msgid "Cannot add property to built in keying set" -msgstr "Không thêm được đặc tính trong tập bức ảnh mẫu" +msgstr "Không thể thêm tính chất với Bộ Khóa gắn sẵn được" msgid "No active Keying Set to remove property from" -msgstr "Không có Tập Bức Ảnh Mẫu hoạt động nào để xóa đặc tính" +msgstr "Không có Bộ Khóa đang hoạt động nào để xóa tính chất khỏi đó cả" msgid "Cannot remove property from built in keying set" -msgstr "Không xóa được đặc tính từ tập bức ảnh mẫu được xây dựng" +msgstr "Không thể xóa tính chất trong Bộ Khóa gắn sẵn được" + + +msgid "Property removed from keying set" +msgstr "Tính chất đã bị xóa khỏi bộ khóa" msgid "Property added to Keying Set: '%s'" -msgstr "Đăc tính được thêm vào Tập Bức Ảnh Mẫu: '%s'" +msgstr "Tính chất đã được thêm vào Bộ Khóa: '%s'" msgid "Skipping path in keying set, as it has no ID (KS = '%s', path = '%s[%d]')" -msgstr "Bỏ qua đường trong tập bức ảnh mẫu, vì nó không có ID (KS = '%s', đường '%s[%d]')" +msgstr "Bỏ qua đường dẫn trong Bộ Khóa, vì nó không có ID (ks = '%s', đường dẫn '%s[%d]')" + + +msgid "Bone was added to a hidden collection '%s'" +msgstr "Xương đã được cho thêm vào bộ sưu tập ẩn khuất '%s' rồi" msgid "No region view3d available" -msgstr "Không có vùng màn 3D để dùng" +msgstr "Không thấy có vùng Khung Nhìn 3D (RegionView3D) nào có thể sử dụng được cả" msgid "No active bone set" -msgstr "Chưa đặt xương hoạt động" +msgstr "Không có xương nào đang hoạt động cả" msgid "No joints selected" -msgstr "Chưa chọn khớp nào" +msgstr "Không có khớp nối được chọn cả" msgid "Bones for different objects selected" -msgstr "Các xương cho vật thể khác nhau được chọn" +msgstr "Xương dành cho các đối tượng khác được chọn" msgid "Same bone selected..." -msgstr "Cùng xương được chọn..." +msgstr "Chọn cùng một xương rồi..." msgid "Operation requires an active bone" -msgstr "Thao tác yêu cầu một xương hoạt động" +msgstr "Thao tác yêu cầu một xương đang hoạt động" msgid "Too many points selected: %d" -msgstr "Đã chọn điểm qúa nhiều: %d" +msgstr "Quá nhiều điểm được chọn: %d" msgid "Aligned bone '%s' to parent" -msgstr "Sắp xếp xương '%s' với phụ huynh" +msgstr "Căn chỉnh xương '%s' với phụ huynh" msgid "%d bones aligned to bone '%s'" -msgstr "%d xương sắp xếp với xương '%s'" +msgstr "%d xương được căn chỉnh với xương '%s'" msgid "Active object is not a selected armature" -msgstr "Vật thể hoạt động không phải là cốt được chọn" +msgstr "Đối tượng đang hoạt động không phải là khung cốt được chọn" msgid "Separated bones" -msgstr "Xương Được Chẻ" +msgstr "Xương đã được phân tách" msgid "Unselectable bone in chain" -msgstr "Xương trong chuỗi không thể chọn được" +msgstr "Xương trong dây chuyền không thể lựa chọn được" + + +msgid "Bone collection with index %d not found on Armature %s" +msgstr "Không tìm thấy bộ sưu tập xương có chỉ số %d trên Khung Cốt %s cả" + + +msgid "Bone collection %s is not editable, maybe add an override on the armature?" +msgstr "Bộ sưu tập xương %s không thể biên soạn được, liệu có thể cho thêm một vượt quyền trên khung cốt hay không?" + + +msgid "No object found to operate on" +msgstr "Không tìm thấy đối tượng nào để thao tác trên đó cả" + + +msgid "Bone collections can only be added to an Armature" +msgstr "Các bộ sưu tập xương chỉ có thể được thêm vào một Khung Cốt mà thôi" + + +msgid "Cannot add bone collections to a linked Armature without an override" +msgstr "Không thể cho thêm bộ sưu tập xương vào Khung Cốt liên kết mà không vượt quyền nhé" + + +msgid "Bone collections can only be edited on an Armature" +msgstr "Các bộ sưu tập xương chỉ có thể được biên soạn trên một Khung Cốt mà thôi" + + +msgid "Armature has no active bone collection, select one first" +msgstr "Khung cốt không có bộ sưu tập xương nào là đang hoạt động cả, hãy chọn một cái trước đi đã" + + +msgid "Cannot edit bone collections that are linked from another blend file" +msgstr "Không thể biên soạn bộ sưu tập xương liên kết từ một tập tin blend khác đâu nhé" + + +msgid "Cannot edit bone collections on linked Armatures without override" +msgstr "Không thể biên soạn bộ sưu tập xương trên Khung Cốt liên kết mà không vượt quyền nhé" + + +msgid "Cannot (de)select bones on linked object, that would need an override" +msgstr "Không thể (hủy) lựa chọn xương trên đối tượng liên kết đâu. Cái đấy cần có một vượt quyền nhé" + + +msgid "No active bone collection" +msgstr "Không có bộ sưu tập xương nào đang hoạt động cả" + + +msgid "This needs a local Armature or an override" +msgstr "Cái này cần một khung Cốt cục bộ hoặc một vượt quyền nhé" + + +msgid "This operator only works in pose mode and armature edit mode" +msgstr "Thao tác này chỉ hoạt động trong chế độ tư thế và chế độ biên soạn khung cốt mà thôi" + + +msgid "No bones selected, nothing to assign to bone collection" +msgstr "Không có xương nào đã được chọn hết, chẳng có gì để ấn định cho bộ sưu tập xương cả" + + +msgid "All selected bones were already part of this collection" +msgstr "Toàn bộ các xương vốn được chọn đều đã là một phần của bộ sưu tập này rồi" + + +msgid "No bones selected, nothing to unassign from bone collection" +msgstr "Không có xương nào đã lựa chọn cả, chẳng có gì để tách khỏi bộ sưu tập xương hết" + + +msgid "None of the selected bones were assigned to this collection" +msgstr "Không có xương lựa chọn nào đã được ấn định cho bộ sưu tập này hết" + + +msgid "Missing bone name" +msgstr "Thiếu tên xương nhé" + + +msgid "No bone collection named '%s'" +msgstr "Không có bộ sưu tập xương nào được đặt tên là '%s' hết" + + +msgid "Cannot assign to linked bone collection %s" +msgstr "Không thể ấn định bộ sưu tập xương liên kết %s được" + + +msgid "Could not find bone '%s'" +msgstr "Không tìm thấy xương '%s'" + + +msgid "Bone '%s' was not assigned to collection '%s'" +msgstr "Xương '%s' chưa được ấn định cho bộ sưu tập '%s' đâu" msgid "Bone Heat Weighting: failed to find solution for one or more bones" -msgstr "Quyền Lượng Nhiệt Xương: Tìm nghiệm cho một hay trở lên xương đã thất bại" +msgstr "Đo Trọng Lượng bằng Nhiệt của Xương: thất bại trong việc tìm giải nghiệm cho một hoặc nhiều xương" msgid "Failed to find bind solution (increase precision?)" -msgstr "Tìm phương pháp gỉai nghiệm trói bị thất bại (tăng độ chính xác?)" +msgstr "Không tìm thấy giải pháp kết buộc (tăng độ chính xác lên chăng?)" + + +msgid "Clear motion paths of selected bones" +msgstr "Xóa đường chuyển động của các xương đã chọn" + + +msgid "Clear motion paths of all bones" +msgstr "Xóa đường chuyển động của toàn bộ các xương" msgid "Cannot pose libdata" -msgstr "Không đặt được dạng đứng của dữ liệu thư viện" +msgstr "Không thể sử dụng dữ liệu thư viện để thao tác tư thế" msgid "Pose lib is only for armatures in pose mode" -msgstr "Thư viện dạng đứng chỉ cho cốt trong chế độ dạng đứng" +msgstr "Thư viện tư thế chỉ dành cho các khung cốt trong chế độ tư thế mà thôi" + + +msgid "[Tab] - Show original pose" +msgstr "[Tab] - Hiển thị tư thế ban đầu" + + +msgid "[Tab] - Show blended pose" +msgstr "[Tab] - Hiển thị tư thế kết hợp" msgid "Internal pose library error, canceling operator" -msgstr "Lỗi lầm thư viện dạng đứng nội bộ, đang hủy thao tác" +msgstr "Lỗi nội bộ thư viện tư thế xảy ra. đang hủy thao tác" msgid "No active Keying Set to use" -msgstr "Không có Tập Bức Ảnh Mẫu Hoạt Động để dùng" +msgstr "Không có Bộ Khóa đang hoạt động nào để sử dụng cả" msgid "Use another Keying Set, as the active one depends on the currently selected items or cannot find any targets due to unsuitable context" -msgstr "Dùng Tập Bức Ảnh Mẫu khác, vì tập hoạt động đang nhờ các mặt hàng được chọn hay không tìm được mục tiêu nào vì bối cảnh không hợp lệ" +msgstr "Hãy dùng Bộ Khóa khác, vì bộ đang hoạt động phụ thuộc vào các phần tử đang được chọn, hoặc là vì không tìm thấy mục tiêu nào cả, do ở trong ngữ cảnh không thích hợp" msgid "Keying Set does not contain any paths" -msgstr "Tập Bức Ảnh Mẫu không chứa đường nào" +msgstr "Bộ Khóa không chứa đường dẫn nào cả" msgid "Push Pose" -msgstr "Đẩy Dạng Đứng" +msgstr "Tư Thế Cường Điệu" msgid "Relax Pose" -msgstr "Thả Dạng Đứng" +msgstr "Tư Thế Nghỉ" msgid "Blend to Neighbor" -msgstr "Pha Trộn đến Kề" +msgstr "Pha Trộn với Lân Cận" msgid "Sliding-Tool" -msgstr "Dụng Cụ Trượt" +msgstr "Công Cụ Trượt Đẩy" msgid "[X]/Y/Z axis only (X to clear)" -msgstr "Chỉ trục [X]/Y/Z (X để xóa)" +msgstr "Duy trục [X]/Y/Z mà thôi (X để xóa)" msgid "X/[Y]/Z axis only (Y to clear)" -msgstr "Chỉ trục X/[Y]/Z (Y để xóa)" +msgstr "Duy trục X/[Y]/Z mà thôi (Y để xóa)" msgid "X/Y/[Z] axis only (Z to clear)" -msgstr "Chỉ trục X/Y/[Z] (Z để xóa)" +msgstr "Duy trục X/Y/[Z] mà thôi (Z để xóa)" msgid "X/Y/Z = Axis Constraint" -msgstr "X/Y/Z = Ràng Buộc Trục" +msgstr "X/Y/Z = Ràng Buộc của Trục" msgid "[G]/R/S/B/C - Location only (G to clear) | %s" -msgstr "[G]/R/S/B/C - Chỉ vị trí (G để xóa) | %s" +msgstr "[G]/R/S/B/C - Duy vị trí (G để xóa) | %s" msgid "G/[R]/S/B/C - Rotation only (R to clear) | %s" -msgstr "G/[R]/S/B/C - Chỉ xoay (R để xóa) | %s" +msgstr "G/[R]/S/B/C - Duy xoay chiều (R để xóa) | %s" msgid "G/R/[S]/B/C - Scale only (S to clear) | %s" -msgstr "G/R/[S]/B/C - Chỉ phóng to (S để xóa) | %s" +msgstr "G/R/[S]/B/C - Duy đổi tỷ lệ (S để xóa) | %s" msgid "G/R/S/[B]/C - Bendy Bone properties only (B to clear) | %s" -msgstr "G/R/S/[B]/C - Chỉ đặc tính Xương Dẻo (B để xóa) | %s" +msgstr "G/R/S/[B]/C - Duy tính chất của Xương Dẻo (B để xóa) | %s" msgid "G/R/S/B/[C] - Custom Properties only (C to clear) | %s" -msgstr "G/R/S/B/[C] - Chỉ Đặc Tính Tự Tạo (C để xóa) | %s" +msgstr "G/R/S/B/[C] - Duy các Tính Chất Tùy Chỉnh mà thôi (C để xóa) | %s" msgid "G/R/S/B/C - Limit to Transform/Property Set" -msgstr "G/R/S/B/C - Hạn chế đến Đặt Biến Hóa/Đặc Tính" +msgstr "G/R/S/B/C - Giới hạn trong Bộ Biến Hóa/Tính Chất mà thôi" msgid "[H] - Toggle bone visibility" -msgstr "[H] - Bật/tắt hiển thị xương" +msgstr "[H] - Bật/Tắt tầm nhìn của xương" msgid "No keyframes to slide between" -msgstr "Không có bức ảnh mẫu để trượt giữa" +msgstr "Không có các khung khóa để có thể trượt đẩy giữa cái nọ và cái kia" msgid "No keyframed poses to propagate to" -msgstr "Không có dạng đứng có bức ảnh mẫu được truyền dẫn đến" +msgstr "Không có tư thế nào đã được khung khóa hóa để có thể tiến triển đến cả" msgid "Cannot apply pose to lib-linked armature" -msgstr "Không áp dụng được dạng đứng với cốt có thư viện liên kết" +msgstr "Không thể áp dụng tư thế vào khung cốt trong thư viện kết nối được" msgid "Actions on this armature will be destroyed by this new rest pose as the transforms stored are relative to the old rest pose" -msgstr "Hành động của cốt này sẽ bị phá bởi dạng đứng nghỉ mới này vì biến hóa của nó được chứa tương đối với dạng đứng nghỉ cũ" +msgstr "Hành động của khung cốt này sẽ bị hủy đi bởi tư thế nghỉ mới vì các biến hóa của nó được lưu trữ tương đối với tư thế nghỉ cũ" msgid "No pose to copy" -msgstr "Không có dạng đứng để chép" +msgstr "Không có tư thế nào để sao chép cả" + + +msgid "Copied pose to internal clipboard" +msgstr "Đã sao chép tư thế vào bộ nhớ tạm nội bộ" + + +msgid "Internal clipboard is empty" +msgstr "Bộ nhớ tạm nội bộ trống rỗng" + + +msgid "Internal clipboard is not from pose mode" +msgstr "Bộ nhớ tạm nội bộ không phải từ chế độ tư thế" + + +msgid "Internal clipboard has no pose" +msgstr "Bộ nhớ tạm nội bộ không có tư thế nào cả" msgid "Programming error: missing clear transform function or keying set name" -msgstr "Sai lầm lập trinh: thiếu hàm số biến hóa xóa hay tên tập bức ảnh mẫu rõ ràng" +msgstr "Lỗi lập trình: thiếu hàm xóa biến hóa (clear transform function) hoặc tên của bộ khóa (keying set)" + + +msgid "Asset loading is unfinished" +msgstr "Nạp tải tài sản chưa hoàn thành" + + +msgid "No asset found at path \"%s\"" +msgstr "Không tìm thấy tài sản nào tại đường dẫn \"%s\" hết" msgid "Data-block is not marked as asset" -msgstr "Cục dữ liệu chưa được ký hiệu là một tích sản" +msgstr "Khối dữ liệu không được đánh dấu là tài sản" msgid "No data-block selected that is marked as asset" -msgstr "Chưa chọn cục dữ liệu nào được ký hiệu là tích sản" +msgstr "Không có khối dữ liệu nào được chọn đã được đánh dấu là tài sản cả" msgid "Delete all asset metadata, turning the selected asset data-blocks back into normal data-blocks, and set Fake User to ensure the data-blocks will still be saved" -msgstr "Xóa hết siêu dữ liệu tích sản, biến đổi cục dữ liệu tích sản được chọn thành cục dữ liệu bình thường, và đặt Người Dùng Giả để làm chắc những cục dữ liệu sẽ được lưu" +msgstr "Xóa toàn bộ các siêu dữ liệu của tài sản, chuyển các khối dữ liệu tài sản đã chọn trở lại thành khối dữ liệu bình thường và đặt Người Dùng Giả để đảm bảo rằng các khối dữ liệu sẽ vẫn được lưu lại" msgid "Selected data-blocks are already assets (or do not support use as assets)" -msgstr "Các cục dữ liệu được chọn là tích sản rồi (hay không hỗ trợ sử dụng làm tích sản)" +msgstr "Khối dữ liệu được chọn hiện đã là tài sản rồi (hoặc không hỗ trợ việc sử dụng nó làm tài sản)" msgid "No data-blocks to create assets for found (or do not support use as assets)" -msgstr "Không tìm được cục dữ liệu đổ chế tạo tích sản (hay không hỗ trợ sử dụng làm tích sản)" +msgstr "Không tìm thấy có khối dữ liệu nào có thể kiến tạo tài sản được cả (hoặc không hỗ trợ việc sử dụng nó làm tài sản)" msgid "No asset data-blocks from the current file selected (assets must be stored in the current file to be able to edit or clear them)" -msgstr "Chưa chọn được cục dữ liệu tích sản nào từ tập tin hiện tại (phải chứa tích sản trong tập tin hiện tại cho có thể biên tập hay xóa chúng)" +msgstr "Không có khối dữ liệu tài sản nào trong tập tin hiện tại được chọn cả (tài sản phải được lưu trữ trong tập tin hiện tại để có thể chỉnh sửa hoặc xóa chúng đi)" msgid "No asset data-blocks selected/focused" -msgstr "Không có cục dữ liếu tích sản được chọn/tập trung" +msgstr "Không có khối dữ liệu tài sản nào đã được chọn/tập trung vào cả" msgid "Path is empty, cannot save" -msgstr "Đường dẫn rỗng, không thể lưu" +msgstr "Đường dẫn trống, không thể lưu được" msgid "Path too long, cannot save" -msgstr "Đường dẫn qúa dài, không thể lưu" +msgstr "Đường dẫn quá dài, không thể lưu được" msgid "Data-block '%s' is now an asset" -msgstr "Cục dữ liệu '%s' đã trở thành một tích sản" +msgstr "Khối dữ liệu '%s' bây giờ là một tài sản" msgid "%i data-blocks are now assets" -msgstr "%i cục dữ liệu đã trở thành tích sản" +msgstr "%i khối dữ liệu hiện giờ là tài sản" msgid "Data-block '%s' is not an asset anymore" -msgstr "Cục dữ liệu '%s' không phải còn là tích sản nữa" +msgstr "Khối dữ liệu '%s' hiện không phải là tài sản nữa" msgid "%i data-blocks are no assets anymore" -msgstr "%i cục dữ liệu không còn là tích sản" +msgstr "%i khối dữ liệu hiện không phải là tài sản nữa" msgid "Selected path is outside of the selected asset library" -msgstr "Đường dẫn được chọn ở ngoài thư viện tích sản được chọn" +msgstr "Đường dẫn đã chọn nằm ngoài thư viện tài sản đã chọn" msgid "Unable to copy bundle due to external dependency: \"%s\"" -msgstr "Không thể chép gói vì nó có nhờ đồ ngoài: \"%s\"" +msgstr "Không thể sao chép gói do phụ thuộc bên ngoài: \"%s\"" msgid "Unable to copy bundle due to %zu external dependencies; more details on the console" -msgstr "Không thể chép gói vì nó có nhờ %zu đồ ngoài; thêm chi tiết trên diện điều khiển" +msgstr "Không thể sao chép gói do %zu phụ thuộc bên ngoài; xem thêm chi tiết trong bảng điều khiển" + + +msgid "Asset catalogs cannot be edited in this asset library" +msgstr "Không thể biên soạn các danh mục tài sản trong thư viện tài sản này được" msgid "Cannot save asset catalogs before the Blender file is saved" -msgstr "Không thể lưu danh mục tích sản trước được lưu tập tin Blender" +msgstr "Không thể lưu các danh mục tài sản lại trước khi lưu tập tin Blender được" msgid "No changes to be saved" -msgstr "Không có biến đổi để lưu" +msgstr "Không có thay đổi nào để lưu cả" + + +msgid "No applicable assets found" +msgstr "Không tìm thấy tài sản nào có thể áp dụng được cả" + + +msgid "Toggle catalog visibility in the asset shelf" +msgstr "Bật/tắt hiển thị danh mục trong kệ tài sản" + + +msgid "Catalog Selector" +msgstr "Trình Lựa Chọn Danh Mục" + + +msgid "Select the asset library and the contained catalogs to display in the asset shelf" +msgstr "Chọn thư viện tài sản và các danh mục trong đó để hiển thị trong kệ tài sản" msgid "Unable to load %s from %s" -msgstr "Không thể nhập %s từ %s" +msgstr "Không thể nạp %s từ %s được" msgid "No point was selected" -msgstr "Chưa chọn một điểm nào" +msgstr "Không có điểm nào đã được chọn cả" msgid "Could not separate selected curve(s)" -msgstr "Không thể chẻ các đường cong được chọn" +msgstr "Không thể tách biệt (các) đường cong đã chọn ra được" + + +msgid "Cannot separate curves with shape keys" +msgstr "Không thể tách phân các đường cong có hình mẫu được" msgid "Cannot separate current selection" -msgstr "Không thể chẻ riêng sự lựa chọn hiện tại" +msgstr "Không thể tách rẽ lựa chọn hiện tại được" msgid "Cannot split current selection" -msgstr "Không thể chẻ sự lựa chọn hiện tại" +msgstr "Không thể tách phân lựa chọn hiện tại được" msgid "No points were selected" -msgstr "Chưa chọn điểm nào" +msgstr "Không có điểm nào đã được chọn cả" msgid "Could not make new segments" -msgstr "Không làm được khúc mới" +msgstr "Không thể tạo các phân đoạn mới" msgid "Too few selections to merge" -msgstr "Sự lựa chọn qúa ít để gồm" +msgstr "Số lựa chọn quá ít để có thể hợp nhất" msgid "Resolution does not match" -msgstr "Độ phân giải không giống" +msgstr "Độ phân giải không khớp" msgid "Cannot make segment" -msgstr "Không thể tạo đoạn thẩng" +msgstr "Không thể tạo đoạn thẳng" msgid "Cannot spin" -msgstr "Không thể quay" +msgstr "Không thể xoay tròn được" msgid "Cannot duplicate current selection" -msgstr "Không thể sao chép sự lựa chọn hiện tại" +msgstr "Không thể sao chép lựa chọn hiện tại" msgid "Only bezier curves are supported" -msgstr "Chỉ hỗ trợ cong Bezier" +msgstr "Chỉ hỗ trợ đường cong bézier mà thôi" msgid "Active object is not a selected curve" -msgstr "Vật thể hoạt động không phải là đường cong được chọn" +msgstr "Đối tượng đang hoạt động không phải là một đường cong được chọn" msgid "%d curve(s) could not be separated" -msgstr "%d đường cong không thể chẻ" +msgstr "%d đường cong không thể tách rời ra được" msgid "%d curves could not make segments" -msgstr "%d đường cong không thể tạo khúc" +msgstr "%d đường cong không thể tạo phân đoạn được" msgctxt "Curve" msgid "BezierCurve" -msgstr "CongBezier" +msgstr "Đường Cong Bezier" msgctxt "Curve" msgid "BezierCircle" -msgstr "VòngTrònBezier" +msgstr "Đường Tròn Bezier" msgctxt "Curve" msgid "CurvePath" -msgstr "ĐườngCong" +msgstr "Đường Dẫn Đường Cong" msgctxt "Curve" msgid "NurbsCurve" -msgstr "CongNurbs" +msgstr "Đường Cong Nurbs" msgctxt "Curve" msgid "NurbsCircle" -msgstr "VòngTrònNurbs" +msgstr "Hình Tròn Nurbs" msgctxt "Curve" msgid "NurbsPath" -msgstr "ĐườngNurbs" +msgstr "Đường Dẫn Nurbs" msgctxt "Curve" msgid "SurfCurve" -msgstr "CongBềMặt" +msgstr "Đường Cong Surf" msgctxt "Curve" msgid "SurfCircle" -msgstr "VòngTrònBềMặt" +msgstr "Hình Tròn Surf" msgctxt "Curve" msgid "SurfPatch" -msgstr "MiếnBềMặt" +msgstr "Mặt Phẳng Surf" msgctxt "Curve" msgid "SurfCylinder" -msgstr "HìnhTrụBềMặt" +msgstr "Hình Trụ Surf" msgctxt "Curve" msgid "SurfSphere" -msgstr "HìnhCầuBềMặt" +msgstr "Hình Cầu Surf" msgctxt "Curve" msgid "SurfTorus" -msgstr "HìnhXuyếnBềMặt" +msgstr "Hình Xuyến Surf" msgctxt "Curve" @@ -107538,315 +119198,371 @@ msgstr "Bề Mặt" msgid "Unable to access 3D viewport" -msgstr "Không thể truy cập màn chiếu 3D" +msgstr "Không thể truy cập cổng nhìn 3D" msgid "The \"stroke\" cannot be empty" -msgstr "\"nét\" không thể trống rỗng" +msgstr "\"nét vẽ\" không thể trống rỗng được" msgid "Unable to access depth buffer, using view plane" -msgstr "Không thể truy cập đệm độ sâu, sẽ dùng mặt phẳng chiếu" +msgstr "Không thể truy cập bộ đệm về độ sâu, phải sử dụng bình diện của góc nhìn" msgid "Surface(s) have no active point" -msgstr "Các bề mặt không có điểm hoạt động" +msgstr "Bề mặt không có điểm đang hoạt động" msgid "Curve(s) have no active point" -msgstr "Các đường cong không có điểm hoạt động" +msgstr "Đường cong không có điểm đang hoạt động" msgid "No control point selected" -msgstr "Chưa chọn điểm kiểm soát" +msgstr "CKhông có điểm điều khiển nào đã được chọn cả" msgid "Control point belongs to another spline" -msgstr "Điểm kiểm soát là của một mẫu cong khác" +msgstr "Điểm điều khiển trực thuộc một chốt trục khác" msgid "Text too long" -msgstr "Văn bản qúa dài" +msgstr "Văn bản quá dài" msgid "Clipboard too long" -msgstr "Bảng dán qúa dài" +msgstr "Bảng nhớ tạm (clipboard) quá dài" msgid "Incorrect context for running font unlink" -msgstr "Bối cảnh không đúng cho chạy gỡ liên kết phông" +msgstr "Ngữ cảnh để thao tác việc ngắt kết nối phông chữ không đúng" msgid "Failed to open file '%s'" -msgstr "Mở tập tin '%s' bị thất bại" +msgstr "Thất bại trong việc mở tập tin '%s'" msgid "File too long %s" -msgstr "Tập tin qúa dài %s" +msgstr "Tập tin quá dài %s" + + +msgid "No active attribute" +msgstr "Không có thuộc tính nào đang hoạt động cả" + + +msgid "Active string attribute not supported" +msgstr "Thuộc tính chuỗi ký tự string đang hoạt động chưa được hỗ trợ nhé" msgid "Some curves could not be converted because they were not attached to the surface" -msgstr "Vài đường cong không thể biến đổi gì chúng nó không dính với bề mặt" +msgstr "Không thể chuyển đổi một số đường cong vì chúng không gắn vào bề mặt" msgid "Curves do not have attachment information that can be used for deformation" -msgstr "Đường cong không có thông tin gắn được sử dụng cho méo hóa" +msgstr "Các đường cong không có thông tin kèm theo có thể sử dụng để biến dạng được" msgid "Could not snap some curves to the surface" -msgstr "Không thể hút dính vài đường cong đến bề mặt" +msgstr "Không thể bám dính một số đường cong lên bề mặt được" msgid "Curves must have a mesh surface object set" -msgstr "Đường cong phải có đặt một vật thể bề mặt mạng lưới" +msgstr "Các đường cong phải có một bộ đối tượng bề mặt khung lưới" msgid "Only available in point selection mode" -msgstr "Chỉ có thể dùng trong chế độ lựa chọn điểm" +msgstr "Chỉ khả dụng trong chế độ chọn điểm mà thôi" msgid "Cannot convert to the selected type" -msgstr "Không thể biến đổi thành loại được chọn" +msgstr "Không thể chuyển đổi sang thể loại đã chọn được" msgid "Operation is not allowed in edit mode" -msgstr "Không cho thao tác trong chế độ biên tập" +msgstr "Thao tác không được phép thi hành trong chế độ chỉnh sửa" + + +msgid "Non-Assets" +msgstr "Phi Tài Sản" + + +msgid "" +"Tool node group assets not assigned to a catalog.\n" +"Catalogs can be assigned in the Asset Browser" +msgstr "" +"Tài sản nhóm nút công cụ chưa được ấn định vào một danh mục nào cả.\n" +"Danh mục có thể được ấn định trong Trình Duyệt Tài Sản" + + +msgid "Asset is not a geometry node group" +msgstr "Tài sản không phải là một nhóm nút hình học" + + +msgid "Cannot evaluate node group" +msgstr "Không thể tính toán nhóm nút được" + + +msgid "Node group must have a group output node" +msgstr "Nhóm nút phải có nút đầu ra nhóm" msgid "Annotation Create Poly: LMB click to place next stroke vertex | ESC/Enter to end (or click outside this area)" -msgstr "Lời Ghi Chú Chế Tạo Đa Giác: bấm NCT để dán đỉnh nét tiếp theo | ESC/Enter để kết thúc (hay bấm ra ngoài khu vực này)" +msgstr "Chú Thích, Kiến Tạo Đa Giác: bấm NCT để đặt điểm tiếp theo của đường vẽ | ESC/Enter để kết thúc (hoặc bấm vào một điểm ở ngoài khu vực này)" msgid "Annotation Eraser: Hold and drag LMB or RMB to erase | ESC/Enter to end (or click outside this area)" -msgstr "Lời Ghi Chú Cục Gôm: Bấm giữ và kéo NCT hay NCP để bôi | ESC/Enter để kết thúc (hay bấm ra ngoài khu vực này)" +msgstr "Tẩy Xóa Chú Thích: Bấm giữ và kéo rê NCT hoặc NCP để xóa | bấm ESC/Enter để kết thúc (hoặc bấm vào một điểm ở ngoài khu vực này)" msgid "Annotation Line Draw: Hold and drag LMB to draw | ESC/Enter to end (or click outside this area)" -msgstr "Lời Ghi Chú Vẽ Đường: Bấm giữ và kéo NCT để vẽ | ESC/Enter cho kết thúc (hay bấm ra ngoài khu vực này)" +msgstr "Chú Thích, Vẽ Đường Thẳng: Bấm giữ và kéo rê NCT để vẽ | bấm ESC/Enter để kết thúc (hoặc bấm vào một điểm ở ngoài khu vực này)" msgid "Annotation Freehand Draw: Hold and drag LMB to draw | E/ESC/Enter to end (or click outside this area)" -msgstr "Lời Ghi Chú Vẽ Tự Do: Bấm và kéo NCT để vẽ | E/ESC/Enter cho kết thúc (hay bấm ra ngoài khu vực này)" +msgstr "Chú Thích, Vẽ Tự Do: Bấm và kéo rê NCT để vẽ | E/ESC/Enter cho kết thúc (hoặc bấm vào một điểm ở ngoài khu vực này)" msgid "Annotation Session: ESC/Enter to end (or click outside this area)" -msgstr "Phiên Chạy Lời Ghi Chú: Bấm ESC/Enter để kết thúc (hay bấm ra ngoài khu vực này)" +msgstr "Phiên Chú Thích: Bấm ESC/Enter để kết thúc (hoặc bấm vào một điểm ở ngoài khu vực này)" msgid "Cannot paint stroke" -msgstr "Không thể Sơn nét" +msgstr "Không thể sơn đường nét" msgid "Nothing to erase" -msgstr "Không có gì để bôi" +msgstr "Không có gì để xóa cả" msgid "Annotation operator is already active" -msgstr "Thao tác lới ghi chú đang hoạt động rồi" +msgstr "Thao Tác (phép toán) Chú Thích (Annotation operator) đã khởi động và đang hoạt động rồi" msgid "Failed to find Annotation data to draw into" -msgstr "Tìm dữ liệu Ghi Chú để vẽ vào đã thất bại" +msgstr "Không tìm thấy dữ liệu Chú Thích (Annotation data) nào để vẽ vào cả" msgid "Active region not set" -msgstr "Chưa được đặt vùng hoạt động" +msgstr "Chưa chỉ định vùng hoạt động" msgid "Skin_Light" -msgstr "Da_Sáng" +msgstr "Ánh Sáng Da" msgid "Skin_Shadow" -msgstr "Da_BóngTối" +msgstr "Bóng Tối Da" msgid "Eyes" -msgstr "Con_Mắt" +msgstr "Con Mắt" msgid "Pupils" -msgstr "Đồng_Tử" +msgstr "Tròng Mắt" msgid "Grey" -msgstr "Xám" +msgstr "Màu Ghi" msgid "Unable to add a new Armature modifier to object" -msgstr "Không được thêm một bộ điều chỉnh Cốt mới đến vật thể" +msgstr "Không thể thêm một bộ điều chỉnh Khung Cốt mới vào đối tượng" msgid "The existing Armature modifier is already using a different Armature object" -msgstr "Bộ điều chỉnh đang tồn tại đang dùng một vật thể Cốt khác rồi" +msgstr "Bộ điều chỉnh Khung Cốt hiện tại đã sử dụng một đối tượng Khung Cốt khác" + + +msgid "The grease pencil object needs an Armature modifier" +msgstr "Đối tượng bút chì dầu cần một bộ điều chỉnh Khung Cốt" + + +msgid "The Armature modifier is invalid" +msgstr "Bộ điều chỉnh Khung Cốt không hợp lệ" msgid "No Armature object in the view layer" -msgstr "Không có vật thể Cốt trong lớp màn chiếu" +msgstr "Không có đối tượng Khung Cốt trong Tầng Góc Nhìn" msgid "No Grease Pencil data to work on" -msgstr "Không có dữ liệu Bút Sáp để dùng" +msgstr "Không có dữ liệu Bút Chì Dầu để thao tác trên đó" msgid "Current Grease Pencil strokes have no valid timing data, most timing options will be hidden!" -msgstr "Nét Bút Sáp Hiện Tại không có thời tự hợp lệ, đa số tùy chọn thời tự sẽ bị ẩn!" +msgstr "Nét vẽ Bút Chì Dầu hiện tại không có dữ liệu thời gian hợp lệ, đại đa số các tùy chọn về thời gian sẽ bị ẩn giấu!" msgid "Object created" -msgstr "Vật thể được chế tạo" +msgstr "Đối tượng đã được kiến tạo" msgid "Nowhere for grease pencil data to go" -msgstr "Không có chỗ chứa dữ liệu bút sáp" +msgstr "Không có chỗ nào để dữ liệu Bút Chì Dầu di chuyển cả" msgid "Cannot delete locked layers" -msgstr "Không thể xóa lớp được khóa" +msgstr "Không thể xóa các tầng lớp đã bị khóa" msgid "No active layer to isolate" -msgstr "Không có lớp hoạt động để cô lập hóa" +msgstr "Không có tầng lớp nào đang hoạt động để cô lập cả" msgid "No layers to merge" -msgstr "Không có lớp để gồm" +msgstr "Không có các tầng lớp để hợp nhất được" msgid "No layers to flatten" -msgstr "Không có lớp để gồm" +msgstr "Không có tầng lớp nào để làm phẳng bẹt cả" msgid "Current Vertex Group is locked" -msgstr "Nhóm Đỉnh Hiện Tại bị khóa" +msgstr "Nhóm Điểm Đỉnh hiện tại đã bị khóa lại rồi" msgid "Apply all rotations before join objects" -msgstr "Áp dụng hết xoay trước nối lại vật thể" +msgstr "Áp dụng toàn bộ các xoay chiều trước khi hội nhập các đối tượng" msgid "Active object is not a selected grease pencil" -msgstr "Vật thể hoạt động không phải là một bút sáp được chọn" +msgstr "Đối tượng đang hoạt động không phải là một phần tử Bút Chì Dầu đã chọn" msgid "No active color to isolate" -msgstr "Không có màu hoạt động để cô lập hóa" +msgstr "Không có màu nào đang hoạt động để cô lập hóa được" msgid "No Grease Pencil data" -msgstr "Không có dữ liệu Bút Sáp" +msgstr "Không có dữ liệu Bút Chì Dầu" msgid "Unable to add a new Lattice modifier to object" -msgstr "Không thể thêm một bộ điều chỉnh Lưới Rào mới cho vật thể" +msgstr "Không thể thêm một bộ điều chỉnh Lưới Rào vào đối tượng" msgid "The existing Lattice modifier is already using a different Lattice object" -msgstr "Bộ điều chỉnh Lưới Rào đang tồn tại đang dùng một vật thể Lưới Rào khác rồi" +msgstr "Bộ điều chỉnh Lưới Rào hiện tại đã sử dụng một đối tượng Lưới Rào khác rồi" msgid "Unable to find layer to add" -msgstr "Không thể tìm được lớp để thêm" +msgstr "Không tìm thấy tầng lớp để cho thêm vào" msgid "Cannot add active layer as mask" -msgstr "Không thể thêm lớp làm mặt nạ" +msgstr "Không thể cho thêm tầng đang hoạt động vào để làm màn chắn lọc" msgid "Layer already added" -msgstr "Đã thêm lớp rồi" +msgstr "Tầng đã được cho thêm vào" msgid "Maximum number of masking layers reached" -msgstr "Đã tới số lượng lớp mặt nạ tối đa" +msgstr "Đã sử dụng đến số tầng màn chắn tối đa cho phép" msgid "Cannot change to non-existent layer (index = %d)" -msgstr "Không thể trao đổi đến lớp không tồn tại (chỉ số = %d)" +msgstr "Không thể đổi sang tầng lớp không tồn tại (chỉ số = %d)" msgid "Cannot change to non-existent material (index = %d)" -msgstr "Không thể đổi đến vật liệu không tồn tại (chỉ số = %d)" +msgstr "Không thể đổi sang nguyên vật liệu không tồn tại (chỉ số = %d)" msgid "No active GP data" -msgstr "Không có dữ liệu bút sáp hoạt động" +msgstr "Không có dữ liệu Bút Chì Dầu nào đang hoạt động cả" msgid "Not implemented!" -msgstr "Chưa được thành lập!" +msgstr "Chưa được thực hiện!" msgid "No strokes to paste, select and copy some points before trying again" -msgstr "Không có nét nào để dán, chọn và chép vài điểm trước thử lần nữa" +msgstr "Không có nét nào để dán. Hãy chọn và sao chép một số điểm trước đã, trước khi thử lại lần nữa" msgid "Can not paste strokes when active layer is hidden or locked" -msgstr "Không thể dán nét khi lớp hoạt động bị ẩn hay khóa" +msgstr "Không thể dán các nét vẽ khi tầng đang hoạt động bị ẩn giấu hoặc bị khóa" msgid "No grease pencil data" -msgstr "Không có dữ liệu bút sáp" +msgstr "Không thấy có dữ liệu Bút Chì Dầu" msgid "No active frame to delete" -msgstr "Không có bức ảnh hoạt động nào để xóa" +msgstr "Không có khung hình đang hoạt động để xóa" msgid "No active frame(s) to delete" -msgstr "Không có (các) bức ảnh hoạt động nào để xóa" +msgstr "Không có khung hình nào đang hoạt động để xóa cả" + + +msgid "Curve Edit mode not supported" +msgstr "Chế độ Biên Soạn Đường Cong chưa được hỗ trợ" msgid "Cannot separate an object with one layer only" -msgstr "Không thể chia riêng một vật thể chỉ có một lớp" +msgstr "Không thể phân tách một đối tượng chỉ có một tầng lớp mà thôi" msgid "No active area" -msgstr "Không có khu vực hoạt động" +msgstr "Không có vùng đang hoạt động" msgid "There is no layer number %d" -msgstr "Không có lớp số %d" +msgstr "Không có tầng lớp số %d" msgid "Too many strokes selected, only joined first %d strokes" -msgstr "Qúa nhiều nét được chọn, chỉ được kết nối %d nét đầu" +msgstr "Quá nhiều nét vẽ được chọn, chỉ hội nhập %d nét vẽ đầu tiên mà thôi" + + +msgid "Fill: ESC/RMB cancel, LMB Fill, Shift Draw on Back, MMB Adjust Extend, S: Switch Mode, D: Stroke Collision | %s %s (%.3f)" +msgstr "Tô Phủ Kín: ESC/NCP Hủy, NCT Tô phủ kín, Shift Vẽ trên Mặt Sau, NCG Điều Chỉnh Khoảng, S: Đổi Chế độ, D: Nét Vẽ Va Đập Nhau | %s %s (%.3f)" + + +msgid "Stroke: ON" +msgstr "Nét Vẽ: BẬT" + + +msgid "Stroke: OFF" +msgstr "Nét Vẽ: TẮT" msgid "Fill tool needs active material" -msgstr "Dụng cụ tô đầy cần vật liệu hoạt động." +msgstr "Công cụ phủ kín cần có nguyên vật liệu đang hoạt động" msgid "Unable to fill unclosed areas" -msgstr "Không thể tô đầy vùng chưa đóng" +msgstr "Không thể phủ kín các khu vực còn mở" msgid "No available frame for creating stroke" -msgstr "Không có bức ảnh nào có thể dùng cho chế tạo nét" +msgstr "Không có bức nào có thể dùng cho chế tạo nét" msgid "Active region not valid for filling operator" -msgstr "Vùng Hoạt Động không hợp lệ cho thao tác tô đầy" +msgstr "Vùng đang hoạt động không hợp lệ cho thao tác tô kín" msgid "GPencil Interpolation: " -msgstr "Suy Nội Bút Sáp:" +msgstr "Nội Suy Bút Chì Dầu: " msgid "ESC/RMB to cancel, Enter/LMB to confirm, WHEEL/MOVE to adjust factor" -msgstr "ESC/NCP để qủy, Enter/NCT để chấp nhận, NÚT CUỘN/DI CHUYỂN để chỉnh đổi hệ số" +msgstr "ESC/NCP (RMB) để hủy (cancel), Enter/NCT (LMB) để chấp nhận, BÁNH XE/DI CHUYỂN để điều chỉnh hệ số" msgid "Standard transitions between keyframes" -msgstr "Tiến triển tiêu chuẩn giữa các bức mẫu" +msgstr "Chuyển tiếp tiêu chuẩn giữa các khung khóa" msgid "Predefined inertial transitions, useful for motion graphics (from least to most \"dramatic\")" -msgstr "Tiến triển quán tính có đặt sẵn, tốt cho làm đồ họa chuyển động (từ ít đến nhiều động lý)" +msgstr "Chuyển tiếp quán tính định trước, hữu ích cho đồ họa chuyển động (từ ít nhất cho đến có \"kịch tính\" cao nhất)" msgid "Simple physics-inspired easing effects" -msgstr "Hiệu ứng xoa dịu được cảm hứng từ vật lý đơn giản-" +msgstr "Hiệu ứng chậm rãi đơn giản lấy cảm hứng từ vật lý" msgctxt "GPencil" @@ -107856,249 +119572,297 @@ msgstr "Nội Suy" msgctxt "GPencil" msgid "Easing (by strength)" -msgstr "Xoa Dịu (bằng sức)" +msgstr "Chậm Rãi (theo chiều dài)" msgctxt "GPencil" msgid "Dynamic Effects" -msgstr "Hiệu Ứng Động Lý" +msgstr "Các Hiệu Ứng Năng Động" msgid "Cannot find valid keyframes to interpolate (Breakdowns keyframes are not allowed)" -msgstr "/Không thể tìm bức ảnh mẫu hợp lệ để suy nội (không cho dùng hạ bức ảnh mẫu)" +msgstr "Không tìm thấy khung khóa hợp lệ nào để nội suy cả (không được phép sử dụng các khung khóa Phân Tích (Breakdowns keyframes))" msgid "Cannot interpolate in curve edit mode" -msgstr "Không thể suy nội trong chế độ biên tập" +msgstr "Không thể nội suy khi đang ở trong chế độ biên soạn đường cong" msgid "Custom interpolation curve does not exist" -msgstr "Đường cong suy nội tùy chọn không tồn tại" +msgstr "Đường cong nội suy tùy chỉnh không tồn tại" msgid "Expected current frame to be a breakdown" -msgstr "Định bức ảnh hiện tại là một bức ảnh giữa" +msgstr "Dự kiến rằng khung hình hiện tại là một khung phân tích" msgid "Nothing to merge" -msgstr "Không có gì để gồm" +msgstr "Không có gì để hợp nhất" msgid "Merged %d materials of %d" -msgstr "Đã gồm các vật liệu %d của %d" +msgstr "Hội nhập %d nguyên vật liệu của %d" msgid "No valid object selected" -msgstr "Chưa chọn vật thể nào hợp lệ" +msgstr "Không có đối tượng hợp lệ nào đã được chọn cả" msgid "Target object not a grease pencil, ignoring!" -msgstr "Vật thể mục tiêu không phải là bút sáp, đang bỏ qua!" +msgstr "Đối tượng mục tiêu không phải là một đối tượng bút chì dầu, bỏ qua!" msgid "Target object library-data, ignoring!" -msgstr "Vật thể mục tiêu là dữ liệu thư viện, đang bỏ qua!" +msgstr "Đối tượng mục tiêu dữ liệu-thư viện, bỏ qua!" msgid "Grease Pencil Erase Session: Hold and drag LMB or RMB to erase | ESC/Enter to end (or click outside this area)" -msgstr "Phiên Chạy Bôi Bút Sáp: Bấm giữ NCT hay NCP để xóa | bấm ESC/Enter để kết thúc" +msgstr "Phiên Xóa Bút Chì Dầu: Bấm và kéo rê NCT hay NCP để xóa | Bấm ESC/Enter để kết thúc (hoặc bấm vào một chỗ ở ngoài vùng này)" msgid "Grease Pencil Line Session: Hold and drag LMB to draw | ESC/Enter to end (or click outside this area)" -msgstr "Phiên Chạy Nét Bút Sáp: Bấm giữ NCT và kéo cho vẽ | bấm ESC/Enter cho kết thúc (hay bấm ra ngoài khu vực này)" +msgstr "Phiên Bút Chì Dầu Vẽ Đường Thẳng: Giữ và kéo rê NCT để vẽ |Bấm ESC/Enter để kết thúc (hoặc bấm vào một chỗ ở ngoài vùng này)" msgid "Grease Pencil Guides: LMB click and release to place reference point | Esc/RMB to cancel" -msgstr "Đường Hướng Dẫn Bút Sáp: bấm NCT và thả để đặt điểm tham chiếu | Esc/NCP để hủy" +msgstr "Hướng Dẫn về Bút Chì Dầu: Bấm và thả NCT (LMB) để đặt điểm tham chiếu | Esc/NTP (RMB) để hủy" msgid "Grease Pencil Freehand Session: Hold and drag LMB to draw | M key to flip guide | O key to move reference point" -msgstr "Phiên Chạy Bút Sáp Vẽ Tự Do: Bấm giữ và kéo NCP để vẽ | phím M để lật đường hướng dẫn | O để di chuyển điểm tham chiếu" +msgstr "Phiên Bút Chì Dầu Vẽ Tự Do: Bấm giữ NCT (LMB) và kéo rê để vẽ | phím M để đảo lật hướng dẫn | phím O để di chuyển điểm tham chiếu" msgid "Grease Pencil Freehand Session: Hold and drag LMB to draw" -msgstr "Phiên Chạy Vẽ Tự Do Bút Sáp: Bấm giữ và kéo NCT để vẽ" +msgstr "Phiên Bút Chì Dầu Vẽ Tay: Giữ xuống và kéo NCT để vẽ" msgid "Grease Pencil Session: ESC/Enter to end (or click outside this area)" -msgstr "Phiên Chạy Bút Sáp: Bấm ESC/Enter để kết thúc (hay bấm ra ngoài khu vực này)" +msgstr "Phiên Bút Chì Dầu: ESC/Enter để kết thúc (hoặc bấm chuột ở địa phận bên ngoài vùng này)" msgid "Active layer is locked or hidden" -msgstr "Lớp hoạt động bị khóa hay được ẩn" +msgstr "Tầng đang hoạt động bị khóa lại hoặc bị ẩn giấu" msgid "Nothing to erase or all layers locked" -msgstr "Không có gỉ để xóa hay tất cả lớp bị khóa" +msgstr "Không có gì để xóa cả, hoặc là toàn bộ các tầng lớp đều đã bị khóa lại" msgid "Grease Pencil operator is already active" -msgstr "Thao tác Sáp Bút đã hoạt động rồi" +msgstr "Thao Tác Bút Chì Dầu đã hoạt động rồi" msgid "Grease Pencil has no active paint tool" -msgstr "Bút Sáp không có dụng cụ sơn hoạt động" +msgstr "Bút Chì Dầu không có công cụ sơn nào đang hoạt động cả" + + +msgid "Line: ESC to cancel, LMB set origin, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to align, Alt to center, E: extrude, G: grab" +msgstr "Đường Nét: ESC hủy, NCT đặt gốc tọa độ, Enter/NCG chấp nhận, Bánh Xe/+- chỉnh số phân hóa, Shift căn chỉnh, Alt trung tâm, E: đẩy trồi, G: túm nắm" + + +msgid "Polyline: ESC to cancel, LMB to set, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to align, G: grab" +msgstr "Đường Đa Giác: ESC hủy, NCT đặt, Enter/NCG chấp nhận, Bánh Xe/+- chỉnh số phân hóa, Shift căn chỉnh, G: túm nắm" + + +msgid "Rectangle: ESC to cancel, LMB set origin, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to square, Alt to center, G: grab" +msgstr "Chữ Nhật: ESC hủy, NCT đặt gốc tọa độ, Enter/NCG chấp nhận, Bánh Xe/+- chỉnh số phân hóa, Shift vuông, Alt trung tâm, G: túm nắm" + + +msgid "Circle: ESC to cancel, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to square, Alt to center, G: grab" +msgstr "Vòng Tròn: ESC hủy, Enter/NCG chấp nhận, Bánh Xe/+- chỉnh số phân hóa, Shift vuông, Alt trung tâm, G: túm nắm" + + +msgid "Arc: ESC to cancel, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to square, Alt to center, M: Flip, E: extrude, G: grab" +msgstr "ĐCung: ESC hủy, Enter/NCG chấp nhận, Bánh Xe/+- chỉnh số phân hóa, Shift vuông, Alt trung tâm, M: đảo lật, E: đẩy trồi, G: túm nắm" + + +msgid "Curve: ESC to cancel, Enter/MMB to confirm, WHEEL/+- to adjust subdivision number, Shift to square, Alt to center, E: extrude, G: grab" +msgstr "ĐCong: ESC hủy, Enter/NCG chấp nhận, Bánh Xe/+- điểu chỉnh số phân hóa, Shift vuông, Alt trung tâm, E: đẩy trồi, G: túm nắm" msgid "Primitives can only be added in Draw or Edit modes" -msgstr "Chỉ được thêm vật thể cơ bản trong chế độ Vẽ hay Biên Tập" +msgstr "Những hình cơ bản chỉ có thể được thêm vào trong chế độ Vẽ hoặc Biên Soạn mà thôi" msgid "Primitives cannot be added as active layer is locked or hidden" -msgstr "Không thể thêm vật thể cơ bản khi lớp hoạt động bị khóa hay ẩn" +msgstr "Không thể thêm các hình cơ bản vì lớp đang hoạt động bị khóa lại hoặc bị ẩn giấu" msgid "GPencil Sculpt: %s Stroke | LMB to paint | RMB/Escape to Exit | Ctrl to Invert Action | Wheel Up/Down for Size | Shift-Wheel Up/Down for Strength" -msgstr "Khắc Bút Sáp: %s Nét | NCT cho vẽ | NCP/ESC cho thoát | Ctrl cho Đảo Nghịch Hành Động | Nút Cuộn Lên/Xuống cho Kích Cỡ | Shift-Nút Cuộn Lên/Xuống cho Sức" +msgstr "Điêu Khắc bằng Bút Chì Dầu: %s Nét Vẽ | NCT để sơn | NCP/Esc để thoát | Ctrl để Đảo Nghịch Hành Động | Xoay Bánh Xe Lên/Xuống để đổi kích thước | Shift-Xoay Bánh Xe Lên/Xuống để tăng/giảm sức mạnh" msgid "Copy some strokes to the clipboard before using the Clone brush to paste copies of them" -msgstr "Chép lại vài nét đến bảng dán trước dùng bút chép lại để dán bản sao của nó" +msgstr "Sao chép một số nét vẽ vào bảng nhớ tạm trước khi dùng chức năng Rập Khuôn đầu bút để dán các bản sao của chúng" msgid "Cannot sculpt while animation is playing" -msgstr "Không thể khắc khi đang hát hoạt hình" +msgstr "Không thể điêu khắc trong khi đang chơi hoạt họa" msgid "Select before some Vertex to use as a filter color" -msgstr "Chọn vài Đỉnh trước để dùng một bộ lọc màu" +msgstr "Chọn một vài điểm đỉnh trước đã để sử dụng làm một màu thanh lọc" msgid "Trace" -msgstr "Chép Trên" +msgstr "Dò Tia" msgid "No image empty selected" -msgstr "Chưa được chọn hình ảnh" +msgstr "Không có hình ảnh, trong dạng đối tượng trống rỗng, nào đã được chọn cả" msgid "No valid image format selected" -msgstr "Chưa được chọn định dạng ảnh hợp lệ" +msgstr "Không có định dạng hình ảnh hợp lệ nào được chọn cả" msgid "Confirm: Enter/LClick, Cancel: (Esc/RClick) %s" -msgstr "Xác Nhận: Enter/BấmTrái, Hủy: (Esc/BấmPhải) %s" +msgstr "Chấp thuận: Enter/NCT (LMB), Hủy: (Esc/NCP (RMB)) %s" msgid "Palette created" -msgstr "Được chế tạo Bảng Màu" +msgstr "Bảng pha màu đã được kiến tạo" msgid "Unable to find Vertex Information to create palette" -msgstr "Không thể tìm được Thông Tin dữ liệu cho chế tạo bảng màu" +msgstr "Không tìm thấy Thông Tin về Điểm Đỉnh để kiến tạo bảng pha màu" msgid "GPencil Vertex Paint: LMB to paint | RMB/Escape to Exit | Ctrl to Invert Action" -msgstr "Sơn Đỉnh Bút Sáp: NCT cho sơn | NCP/Escape để thoát | Ctrl để Đảo Nghịch Hành Động" +msgstr "Sơn Điểm Đỉnh Bút Chì Dầu: NCP (LMB) để sơn | NCP (LMB)/Escape để Thoát | Ctrl để Đảo Ngược Hành Động" msgid "Cannot Paint while play animation" -msgstr "Không Thể Sơn khi đang hát lại hoạt hình" +msgstr "Không thể sơn trong khi đang chơi hoạt họa" msgid "GPencil Weight Paint: LMB to paint | RMB/Escape to Exit" -msgstr "Bút Sáp: NCT cho sơn | NCP/Escape cho Thoát" +msgstr "Sơn Trọng Lượng Bút Chì Dầu: NCP (LMB) để sơn | NCP (LMB)/Escape để Thoát" + + +msgid "GPencil Weight Blur: LMB to blur | RMB/Escape to Exit" +msgstr "Bút Chì Dầu: NCT để sơn | NCP/Escape để Thoát" + + +msgid "GPencil Weight Average: LMB to set average | RMB/Escape to Exit" +msgstr "Bút Chì Dầu: Trọng Lượng Trung Bình - NCT để đặt mức trung bình | NCP/Escape để Thoát" + + +msgid "GPencil Weight Smear: LMB to smear | RMB/Escape to Exit" +msgstr "Bút Chì Dầu: Bôi Nhòe Trọng Lượng - NCT để bôi nhòe | NCP/Escape để Thoát" + + +msgid "Skin_light" +msgstr "Ánh_sáng_của_da" + + +msgid "Skin_shadow" +msgstr "Bóng_tối_của_da" msgid "Failed to set value" -msgstr "Đặt giá trị bị thất bại" +msgstr "Thất bại trong việc đặt giá trị" msgid "LMB: Stroke - Shift: Fill - Shift+Ctrl: Stroke + Fill" -msgstr "NCT: Nét - Shift: Tô Đầy - Shift_Ctrl: Nét + Tô Đầy" +msgstr "NCT: Nét Vẽ - Shift: Tô Kín - Shift+Ctrl: Nét Vẽ + Tô Kín" msgid "Error evaluating number, see Info editor for details" -msgstr "Sai lầm khi tính toán số, xem trình biên soạn Thông Tin cho chi tiết" +msgstr "Lỗi xảy ra trong khi tính toán con số. Xin xem trình biên soạn thông tin để biết thêm chi tiết" + + +msgid "Press a key" +msgstr "Nhấn một phím" msgid "Missing Panel: %s" -msgstr "Thiếu Bản: %s" +msgstr "Thiếu Bảng Điều Khiển: %s" msgid "Missing Menu: %s" -msgstr "Thiếu Danh Bạ: %s" +msgstr "Thiếu Trình Đơn: %s" msgid "Non-Keyboard Shortcut" -msgstr "Phím Tắt Vô Bàn Phím" +msgstr "Đường Tắt Không Dành Cho Bàn Phím" msgid "Pin" -msgstr "Đinh" +msgstr "Đính Ghim" msgid "Shift Left Mouse" -msgstr "Shift Chuột Trái" +msgstr "Shift + NCT" msgid "Only keyboard shortcuts can be edited that way, please use User Preferences otherwise" -msgstr "Chỉ phím tắt bàn phím có thể biên tập kiểu này, cho trường hợp khác làm ơn dùng Tùy Chọn Người Dùng" +msgstr "Chỉ các đường phím tắt là có thể được biên soạn theo cách này. Làm ơn sử dụng Cài Đặt Sở Thích của Người Dùng cho những trường hợp khác" msgctxt "Operator" msgid "Change Shortcut" -msgstr "Đổi Phím Tắt" +msgstr "Đổi Đường Tắt" msgctxt "Operator" msgid "Assign Shortcut" -msgstr "Chỉ Định Phím Tắt" +msgstr "Ấn Định Đường Tắt" msgctxt "Operator" msgid "Open File Externally" -msgstr "Mở Tập Tin Ở Ngoài" +msgstr "Mở Tập Tin Bên Ngoài" msgctxt "Operator" msgid "Open Location Externally" -msgstr "Mở Tập Tin Vị Trí Ngoài" +msgstr "Mở Địa Điểm Bên Ngoài" msgctxt "Operator" msgid "Replace Keyframes" -msgstr "Thay Thế Các Bức Ảnh Mẫu" +msgstr "Thay các Khung Khóa" msgctxt "Operator" msgid "Replace Single Keyframe" -msgstr "Thay Một Bức Ảnh Mẫu" +msgstr "Thay Đơn Khung Khóa" msgctxt "Operator" msgid "Delete Single Keyframe" -msgstr "Xóa Một Bức Ảnh Mẫu" +msgstr "Xóa Đơn Khung Khóa" msgctxt "Operator" msgid "Replace Keyframe" -msgstr "Thay Thế Bức Ảnh Mẫu" +msgstr "Thay Khung Khóa" msgctxt "Operator" msgid "Insert Single Keyframe" -msgstr "Chèn Một Bức Ảnh Mẫu" +msgstr "Chèn Thêm Đơn Khung Khóa" msgctxt "Operator" msgid "Clear Keyframes" -msgstr "Xóa Các Bức Ảnh Mẫu" +msgstr "Xóa các Khung Khóa" msgctxt "Operator" msgid "Clear Single Keyframes" -msgstr "Xóa Một Bức Ảnh Mẫu" +msgstr "Xóa các Khung Khóa Đơn" msgctxt "Operator" msgid "Delete Drivers" -msgstr "Xóa Các Điều Vận" +msgstr "Xóa các Điều Vận" msgctxt "Operator" msgid "Delete Single Driver" -msgstr "Xóa Một Điều Vận" +msgstr "Xóa Điều Vận Đơn Thân" msgctxt "Operator" @@ -108113,138 +119877,214 @@ msgstr "Mở Trình Biên Soạn Điều Vận" msgctxt "Operator" msgid "Add All to Keying Set" -msgstr "Thêm Hết Vào Tập Bức Ảnh Mẫu" +msgstr "Cộng Toàn Bộ vào Bộ Hình Mẫu" msgctxt "Operator" msgid "Add Single to Keying Set" -msgstr "Thêm Một Vào Tập Bức Ảnh Mẫu" +msgstr "Cộng Đơn Cái vào Bộ Hình Mẫu" msgctxt "Operator" msgid "Remove Overrides" -msgstr "Xóa Thay Thế" +msgstr "Xóa các Vượt Quyền" msgctxt "Operator" msgid "Remove Single Override" -msgstr "Xóa Một Cái Vượt Quyền" +msgstr "Xóa Đơn Vượt Quyền" msgctxt "Operator" msgid "Define Overrides" -msgstr "Chỉ Định Đồ Vượt Quyền" +msgstr "Định Nghĩa các Vượt Quyền" msgctxt "Operator" msgid "Define Single Override" -msgstr "Chỉ Định Một Cái Đồ Vượt Quyền" +msgstr "Định Nghĩa Đơn Vượt Quyền" msgctxt "Operator" msgid "Define Override" -msgstr "Định Nghĩa Đồ Vượt Quyền" +msgstr "Định Nghĩa Vượt Quyền" msgctxt "Operator" msgid "Reset All to Default Values" -msgstr "Đặt Lại Giá Trị Chuẩn Cho Hết" +msgstr "Hoàn Toàn Bộ về các Giá Trị Mặc Định" msgctxt "Operator" msgid "Reset Single to Default Value" -msgstr "Đặt Lại Giá Trị Chuẩn Cho Một Cái" +msgstr "Hoàn Đơn Cái về Giá Trị Mặc Định" msgctxt "Operator" msgid "Copy All to Selected" -msgstr "Chép Hết đến Được Chọn" +msgstr "Sao Chép Toàn Bộ đến cái được Chọn" msgctxt "Operator" msgid "Copy Single to Selected" -msgstr "Chép Một đến Được Chọn" +msgstr "Sao Chép Đơn Chiếc đến cái được Chọn" msgctxt "Operator" msgid "Copy Full Data Path" -msgstr "Chép Toàn Bộ Đường Dẫn Dữ Liệu" +msgstr "Sao Chép Đường Dẫn Dữ Liệu Đầy Đủ" msgctxt "Operator" msgid "Remove from Quick Favorites" -msgstr "Xóa từ Ưa Thích Tốc Hành" +msgstr "Xóa khỏi Trình Đơn Ưa Thích Nhanh" msgctxt "Operator" msgid "Add to Quick Favorites" -msgstr "Thêm Vào Ưa Thích Tốc Hành" +msgstr "Thêm vào Trình Đơn Ưa Thích Nhanh" msgctxt "Operator" msgid "Remove Shortcut" -msgstr "Xóa Phím Tắt" +msgstr "Xóa Đường Tắt" msgctxt "Operator" msgid "Online Python Reference" -msgstr "Tài Liệu Python Trên Mạng" +msgstr "Tham Chiếu Python Trực Tuyến" msgid "Drop %s on slot %d (replacing %s) of %s" -msgstr "Thả %s trên khe %d (thay thế cho %s) của %s" +msgstr "Thả %s vào khe %d (thay thế %s) của %s" msgid "Drop %s on slot %d (active slot) of %s" -msgstr "Thả %s trên khe %d (khe hoạt động) của %s" +msgstr "Thả %s vào khe %d (khe đang hoạt động) của %s" msgid "Drop %s on slot %d of %s" -msgstr "Thả %s trên khe %d của %s" +msgstr "Thả %s vào khe %d của %s" + + +msgid "Expected an array of numbers: [n, n, ...]" +msgstr "Kỳ vọng một mảng các số: [n, n, ...]" + + +msgid "Expected a number" +msgstr "Kỳ vọng một con số" + + +msgid "Paste expected 3 numbers, formatted: '[n, n, n]'" +msgstr "Đã dán 3 số kỳ vọng, định dạng là: '[n, n, n]'" + + +msgid "Paste expected 4 numbers, formatted: '[n, n, n, n]'" +msgstr "Đã dán 4 số kỳ vọng, định dạng là: ‘[n, n, n]’" + + +msgid "Unsupported key: Unknown" +msgstr "Khóa không hỗ trợ: Không xác định" + + +msgid "Unsupported key: CapsLock" +msgstr "Phím không hỗ trợ: CapsLock" + + +msgid "Can't edit driven number value, see driver editor for the driver setup" +msgstr "Không thể chỉnh sửa giá trị số đang điều vận được, xin hãy xem trình biên soạn điều vận để sắp đặt điều vận nhé" + + +msgid "Failed to find '%s'" +msgstr "Không thể tìm thấy '%s'" msgid "Menu Missing:" -msgstr "Thiếu Danh Bạ:" +msgstr "Thiếu Trình Đơn:" msgid "Animate property" -msgstr "Hoạt động đặc tính" +msgstr "Hoạt Họa Tính Chất" msgid "Active button is not from a script, cannot edit source" -msgstr "Nút hoạt động không có nguồn gốc từ một văn thảo, không thể biên tập mã nguồn" +msgstr "Nút đang hoạt động không có xuất xứ từ tập lệnh, không thể biên soạn mã nguồn được" msgid "Active button match cannot be found" -msgstr "Không tìm được nút hoạt động giống" +msgstr "Không tìm thấy nút nào đang hoạt động khớp với cả" msgid "Active button not found" -msgstr "Không được tìm nút hoạt động" +msgstr "Không tìm thấy nút bấm nào đang hoạt động cả" msgid "Please set your Preferences' 'Translation Branches Directory' path to a valid directory" -msgstr "Xin đặt đường dẫn 'Thư Mục Nhánh Phiên Dịch' trong Tùy Chọn Người Dùng đến một thư mục hợp lệ" +msgstr "Làm ơn Cài Đặt Sở Thích đường dẫn cho Thư Mục các Phân Nhánh Phiên Dịch (Translation Branches Directory) của bạn đến một thư mục hợp lệ" msgid "Could not compute a valid data path" -msgstr "Không thể tính một đường dẫn dữ liệu hợp lệ" +msgstr "Không thể tính toán được một đường dẫn dữ liệu hợp lệ" msgid "Failed to create the override operation" -msgstr "Chế tạo thao tác vượt quyền bị thất bại" +msgstr "Việc kiến tạo thao tác vượt quyền đã bị thất bại" msgid "Could not find operator '%s'! Please enable ui_translate add-on in the User Preferences" -msgstr "Không tìm được thao tác '%s'! Xin bật đồ kèm ui_translate trong Tùy Chọn Người Dùng" +msgstr "Không tìm thấy operator '%s'! Xin bật trình bổ sung ui_translate (phiên dịch giao diện) trong Cài Đặt Sở Thích của Người Dùng lên" msgid "No valid po found for language '%s' under %s" -msgstr "Không có tập tin .po hợp lệ cho ngôn ngữ '%s' trong %s" +msgstr "Không tìm thấy tập tin po hợp lệ nào cho ngôn ngữ '%s' trong %s" msgid "Hex" -msgstr "Thập Lục Phận" +msgstr "Hệ(16)" + + +msgid "Red:" +msgstr "Đỏ:" + + +msgid "Green:" +msgstr "Lục:" + + +msgid "Blue:" +msgstr "Lam:" + + +msgid "Hue:" +msgstr "Sắc Màu:" + + +msgid "Saturation:" +msgstr "Độ Bão Hòa:" + + +msgid "Lightness:" +msgstr "Độ Sáng:" + + +msgid "Hex:" +msgstr "Hệ(16):" + + +msgid "(Gamma corrected)" +msgstr "(Gamma đã chỉnh sửa)" + + +msgid "Red, Green, Blue" +msgstr "Đỏ, Lục, Lam" + + +msgid "Hue, Saturation, Lightness" +msgstr "Sắc, Độ Bão Hòa, Độ Sáng" + + +msgid "Color as hexadecimal values" +msgstr "Màu sắc theo giá trị thập lục phân" msgid "Lightness" @@ -108252,31 +120092,49 @@ msgstr "Độ Sáng" msgid "Hex triplet for color (#RRGGBB)" -msgstr "Số thập lục phận cho màu (#RRGGBB)" +msgstr "Bộ ba số thập lục phân dành cho màu sắc (#RRGGBB)" + + +msgctxt "Color" +msgid "Value:" +msgstr "Giá Trị:" + + +msgctxt "Color" +msgid "Value" +msgstr "Giá Trị" msgid "Redo" -msgstr "Làm Lại Bước" +msgstr "Tái Tác" + + +msgid "Press spacebar to search..." +msgstr "Nhấn phím cách để tìm kiếm..." + + +msgid "Type to search..." +msgstr "Gõ chữ để tìm kiếm..." msgid "Menu \"%s\" not found" -msgstr "Không tìm được Danh Ba \"%s\"" +msgstr "Không tìm thấy trình đơn \"%s\"" msgid "Panel \"%s\" not found" -msgstr "Không tìm được bảng \"%s\"" +msgstr "Không tìm thấy bảng \"%s\"" msgid "Unsupported context" -msgstr "Bối cảnh không được hỗ trợ" +msgstr "Ngữ cảnh chưa được hỗ trợ" msgid "Internal error!" -msgstr "Sai lầm nội bộ!" +msgstr "Lỗi lầm nội bộ xảy ra!" msgid "Shortcut: %s" -msgstr "Phím Tắt: %s" +msgstr "Đường Cắt Ngắn: %s" msgid "Python: %s" @@ -108284,11 +120142,11 @@ msgstr "Python: %s" msgid "Shortcut Cycle: %s" -msgstr "Chu Trình Phím Tắt: %s" +msgstr "Quay Vòng/Luân Chuyển Đường Cắt Ngắn: %s" msgid "(Shift-Click/Drag to select multiple)" -msgstr "(Shift-Bấm/Kéo để chọn nhiều)" +msgstr "(Shift-Bấm Chuột/Kéo để chọn nhiều)" msgid "Value: %s" @@ -108296,7 +120154,7 @@ msgstr "Giá Trị %s" msgid "Radians: %f" -msgstr "Rađian: %f" +msgstr "Rad: %f" msgid "Expression: %s" @@ -108317,60 +120175,104 @@ msgstr "Python: %s.%s" msgctxt "Operator" msgid "Click" -msgstr "Bấm" +msgstr "Bấm Chuột" msgctxt "Operator" msgid "Drag" -msgstr "Kéo Đi" +msgstr "Kéo Rê" + + +msgid "Move layer {} into {}" +msgstr "Di chuyển tầng lớp {} vào trong {}" + + +msgid "Move layer {} above {}" +msgstr "Di chuyển tầng lớp {} lên trên {}" + + +msgid "Move layer {} below {}" +msgstr "Di chuyển tầng lớp {} xuống dưới {}" + + +msgid "Add to linking collection" +msgstr "Thêm vào bộ sưu tập liên kết" + + +msgid "Add to linking collection before {}" +msgstr "Thêm vào bộ sưu tập liên kết trước {}" + + +msgid "Add to linking collection after {}" +msgstr "Thêm vào bộ sưu tập liên kết sau {}" msgid "Double click to rename" -msgstr "Bấm hai lần cho đổi tên" +msgstr "Nháy đúp chuột để đổi tên" msgid "Hide filtering options" -msgstr "Ẩn tùy chọn bộ lọc" +msgstr "Giấu các tùy chọn về thanh lọc" + + +msgid "Insert before socket" +msgstr "Chèn vào trước ổ cắm" + + +msgid "Insert after socket" +msgstr "Chèn vào sau ổ cắm" + + +msgid "Insert into panel" +msgstr "Chèn vào trong bảng" + + +msgid "Insert before panel" +msgstr "Chèn vào trước bảng" + + +msgid "Insert after panel" +msgstr "Chèn vào sau bảng" msgid "ID-Block:" -msgstr "Cục-ID" +msgstr "Khối-ID:" msgid "No Properties" -msgstr "Không Có Đặc Tính" +msgstr "Không Có Tính Chất" msgid "More..." -msgstr "Thêm..." +msgstr "Hơn nữa..." msgid "Move to First" -msgstr "Di chuyển đến Thứ Nhất" +msgstr "Di Chuyển về Đầu" msgid "Move to Last" -msgstr "Di Chuyển Đến Cuối" +msgstr "Di Chuyển về Cuối" msgid "Flip Color Ramp" -msgstr "Lật Dốc Màu" +msgstr "Đảo Chiều Dốc Màu" msgid "Distribute Stops from Left" -msgstr "Phân phối Bước Từ Phía Trái" +msgstr "Phân Tán các Điểm Dừng từ Bên Trái" msgid "Distribute Stops Evenly" -msgstr "Phân Phối Bước Đều" +msgstr "Phân Tán các Điểm Dừng Đồng Đều" msgid "Eyedropper" -msgstr "Ống Hút Giọt Nước" +msgstr "Ống Nhỏ Mắt" msgid "Reset Color Ramp" -msgstr "Đặt Lại Dốc Màu" +msgstr "Hoàn Lại Dốc Màu" msgid "Pos" @@ -108378,67 +120280,67 @@ msgstr "Vị Trí" msgid "Use Clipping" -msgstr "Dùng Cắt" +msgstr "Sử Dụng Cắt Xén" msgid "Min X:" -msgstr "X Cực Tiểu:" +msgstr "X Nhỏ Nhất:" msgid "Min Y:" -msgstr "Y Cực Tiểu:" +msgstr "Y Nhỏ Nhất:" msgid "Max X:" -msgstr "X Cực Đại:" +msgstr "X Lớn Nhất:" msgid "Max Y:" -msgstr "Y Cực Đại:" +msgstr "Y Lớn Nhất:" msgid "Reset View" -msgstr "Đặt Lại Màn" +msgstr "Hoàn Lại Khung Nhìn" msgid "Extend Horizontal" -msgstr "Kéo Ra Ngang" +msgstr "Mở Rộng Chiều Ngang" msgid "Extend Extrapolated" -msgstr "Kéo Ra Suy Ngoại" +msgstr "Mở Rộng Ngoại Suy" msgid "Reset Curve" -msgstr "Đặt Lại Đường Cong" +msgstr "Hoàn Lại Đường Cong" msgid "Support Loops" -msgstr "Lặp Vòng Đỡ" +msgstr "Hỗ Trợ Đường Vòng" msgid "Cornice Molding" -msgstr "Vật Đúc Vách" +msgstr "Khuôn Gờ (Cornice)" msgid "Crown Molding" -msgstr "Vật Đúc Ngọn" +msgstr "Khuôn Chóp (Crown)" msgid "Sort By:" -msgstr "Sắp Xếp Bằng:" +msgstr "Sắp Xếp Thứ Tự Theo:" msgid "Anim Player" -msgstr "Bộ Hát Hoạt Hình" +msgstr "Máy Chơi Hoạt Họa" msgid "Manual Scale" -msgstr "Phóng To Bằng Tay" +msgstr "Tỷ Lệ Thủ Công" msgid "Choose %s data-block to be assigned to this user" -msgstr "Chọn cục dữ liệu %s để chỉ định cho người dùng này" +msgstr "Chọn %s khối dữ liệu để ấn định cho người dùng này" msgid "" @@ -108450,223 +120352,263 @@ msgstr "" msgid "Indirect library data-block, cannot be made local, Shift + Click to create a library override hierarchy" -msgstr "Cục dữ liệu thư viện được liên kết trực tiếp, không thể địa phương hóa, Shift + Bấm để tạo một tầng bậc đồ vượt quyền cho thư viện" +msgstr "Khối dữ liệu thư viện gián tiếp, không thể cục bộ hóa được, Shift + Nhấp Chuột để kiến tạo một hệ thống thứ bậc vượt quyền thư viện" msgid "Direct linked library data-block, click to make local, Shift + Click to create a library override" -msgstr "Cục dữ liệu thư viện được liên kết trực tiếp, bấm cho địa phương hóa, Shift + Bấm để tạo một đồ vượt quyền thư viện" +msgstr "Khối dữ liệu thư viện kết nối trực tiếp, bấm chuột để cục bộ hóa, Shift + Bấm Chuột để kiến tạo một vượt quyền thư viện" + + +msgid "Library override of linked data-block, click to make fully local, Shift + Click to clear the library override and toggle if it can be edited" +msgstr "Vượt quyền thư viện khối dữ liệu kết nối, nhấp chuột để hoàn toàn cục bộ hóa, dùng tổ hợp Shift + Nhấp Chuột để xóa vượt quyền thư viện và chuyển đổi nếu có thể biên soạn được" msgid "Display number of users of this data (click to make a single-user copy)" -msgstr "Hiệm số lượng người dùng của dữ liệu này (bấm cho làm một bản sao đơn người dùng)" +msgstr "Hiển thị số lượng người dùng của dữ liệu này (bấm chuột để tạo một bản sao đơn người dùng)" msgid "Packed File, click to unpack" -msgstr "Tập Tin Đước Nhét , bấm để rỡ nhét" +msgstr "Tập Tin đã được Đóng Gói, bấm chuột để mở gói" msgid "Unlink data-block (Shift + Click to set users to zero, data will then not be saved)" -msgstr "Cắt liên kết của cục dữ liệu (Shift + Bấm để xóa hết người dùng, sau này sẽ không lưu dữ liệu của nó)" +msgstr "Ngắt kết nối của khối dữ liệu (Shift + Bấm chuột để đặt số người dùng = 0, dữ liệu sẽ không được lưu nữa)" msgid "Can't edit external library data" -msgstr "Không thể biên tập dữ lịệu thư viện ngoại bộ" +msgstr "Không thể biên soạn dữ liệu thư viện bên ngoài" msgid "Reset operator defaults" -msgstr "Đặt lại giá trị mặc định cho thao tác" +msgstr "Hoàn lại các giá trị mặc định của thao tác" msgid "Add a new color stop to the color ramp" -msgstr "Thêm một bước màu vào dốc màu" +msgstr "Thêm một mốc dừng màu mới vào dốc màu" msgid "Delete the active position" -msgstr "Xóa vị trí hoạt động" +msgstr "Xóa vị trí đang hoạt động" msgid "Choose active color stop" -msgstr "Chọn bước màu hoạt động" +msgstr "Chọn điểm đánh dấu màu đang hoạt động" msgid "Zoom in" -msgstr "Phóng Vào" +msgstr "Xem gần vào" msgid "Zoom out" -msgstr "Phóng Ra" +msgstr "Xem xa ra" msgid "Clipping Options" -msgstr "Tùy Chọn Cắt" +msgstr "Tùy Chọn về Cắt Xén" msgid "Delete points" -msgstr "Xoá Điểm" +msgstr "Xóa các điểm" msgid "Reset Black/White point and curves" -msgstr "Đặt lại điểm Đen/Trắng và các đường cong" +msgstr "Hoàn lại điểm Đen/Trắng và các đường cong" + + +msgid "Reapply and update the preset, removing changes" +msgstr "Tái áp dụng và cập nhật giá trị đặt sẵn, xóa các thay đổi đi" msgid "Reverse Path" -msgstr "Lật Hướng Đường" +msgstr "Đảo Ngược Đường Dẫn" msgid "Toggle Profile Clipping" -msgstr "Bặt/Tắt Cắt Mặt Cắt" +msgstr "Bật/Tắt khả năng Cắt Cụt Mặt Cắt" msgid "Stop this job" -msgstr "Nghỉ công việc này" +msgstr "Ngừng công việc này" msgid "Stop animation playback" -msgstr "Nghỉ hát lại hoạt hình" +msgstr "Ngừng chơi hoạt họa" + + +msgid "Click to open the info editor" +msgstr "Bấm để mở trình biên soạn thông tin" + + +msgid "Show in Info Log" +msgstr "Hiển Thị trong Nhật Ký Thông Tin" + + +msgid "" +"File saved by newer Blender\n" +"(%s), expect loss of data" +msgstr "" +"Tập tin được lưu bằng Blender mới hơn\n" +"(%s), dự kiến sẽ mất mát dữ liệu đấy nhé" + + +msgid "Only Alembic Procedurals supported" +msgstr "Duy hỗ trợ Thủ Tục Alembic mà thôi" msgid "The Cycles Alembic Procedural is only available with the experimental feature set" -msgstr "Alembic Thủ Tục Cycles chỉ có thể dùng khi bật tính năng thử nghiệm" +msgstr "Thủ tục Alembic của Cycles chỉ có sẵn để sử dụng trong bộ tính năng thử nghiệm mà thôi" msgid "The active render engine does not have an Alembic Procedural" -msgstr "Động cơ kết xuất hoạt động không có Alembic Thủ Tục" +msgstr "Động cơ kết xuất đang hoạt động không có Thủ Tục Alembic (Alembic Procedural)" msgid "Browse Scene to be linked" -msgstr "Trình duyệt Cảnh cho liên kết" +msgstr "Duyệt Cảnh sẽ được kết nối" msgid "Browse Object to be linked" -msgstr "Trình duyệt Vật thể cho liên kết" +msgstr "Duyệt Đối Tượng sẽ được kết nối" msgid "Browse Mesh Data to be linked" -msgstr "Trình duyệt Dữ Liệu Mạng Lưới cho liên kết" +msgstr "Duyệt Dữ Liệu về Khung Lưới sẽ được kết nối" msgid "Browse Curve Data to be linked" -msgstr "Trình duyệt Dữ Liệu Đường Cong cho liên kết" +msgstr "Duyệt Dữ Liệu về Đường Cong sẽ được kết nối" msgid "Browse Metaball Data to be linked" -msgstr "Trình duyệt Dữ Liệu Siêu Cầu cho liên kết" +msgstr "Duyệt Dữ Liệu về Siêu Cầu sẽ được kết nối" msgid "Browse Material to be linked" -msgstr "Trình duyệt Vật Liệu cho liên kết" +msgstr "Duyệt Thảo Nguyên Vật Liệu sẽ được kết nối" msgid "Browse Texture to be linked" -msgstr "Trình duyệt Chất Liệu cho liên kết" +msgstr "Duyệt Chất Liệu sẽ được kết nối" msgid "Browse Image to be linked" -msgstr "Trình duyệt Ảnh cho liên kết" +msgstr "Duyệt Hình Ảnh sẽ được kết nối" msgid "Browse Line Style Data to be linked" -msgstr "Trình duyệt Dữ Liệu Phong Cách Nét cho liên kết" +msgstr "Duyệt Dữ Liệu về Phong Cách Đường Nét sẽ được kết nối" msgid "Browse Lattice Data to be linked" -msgstr "Trình duyệt Dữ Liệu Lưới Rào cho liên kết" +msgstr "Duyệt Dữ Liệu về Lưới Rào sẽ được kết nối" msgid "Browse Light Data to be linked" -msgstr "Trình duyệt Dữ Liệu cho kết nối" +msgstr "Duyệt Dữ Liệu về Nguồn/Ánh Sáng sẽ được kết nối" msgid "Browse Camera Data to be linked" -msgstr "Trình duyệt Dữ Liệu Máy Quay Phim cho liên kết" +msgstr "Duyệt Dữ Liệu về Máy Quay Phim sẽ được kết nối" msgid "Browse World Settings to be linked" -msgstr "Trình duyệt Cài Đặt Thế Giới cho liên kết" +msgstr "Duyệt Sắp Đặt Thế Giới sẽ được kết nối" msgid "Choose Screen layout" -msgstr "Chọn Bố Trí Màn" +msgstr "Chọn bố trí về Màn Hình" msgid "Browse Text to be linked" -msgstr "Trình duyệt Văn Bản cho liên kết" +msgstr "Duyệt Văn Bản (Text) sẽ được kết nối" msgid "Browse Speaker Data to be linked" -msgstr "Trình duyệt Loa cho liên kết" +msgstr "Duyệt Dữ Liệu về Loa Phát Thanh (Speaker Data) sẽ được kết nối" msgid "Browse Sound to be linked" -msgstr "Trình duyệt Âm Thanh cho liên kết" +msgstr "Duyệt Âm Thanh sẽ được kết nối" msgid "Browse Armature data to be linked" -msgstr "Trình duyệt Dữ Liệu Cốt cho liên kết" +msgstr "Duyệt dữ liệu Khung Cốt sẽ được kết nối" msgid "Browse Action to be linked" -msgstr "Trình duyệt Hành Động cho liên kết" +msgstr "Duyệt Hành Động sẽ được kết nối" msgid "Browse Node Tree to be linked" -msgstr "Trình duyệt Cây giao Điểm cho liên kết" +msgstr "Duyệt Cây Nút sẽ được kết nối" msgid "Browse Brush to be linked" -msgstr "Trình duyệt Bút cho liên kết" +msgstr "Duyệt Đầu Bút sẽ được kết nối" msgid "Browse Particle Settings to be linked" -msgstr "Trình duyệt Cài Đặt Hạt cho liên kết" +msgstr "Duyệt các Sắp Đặt về Hạt sẽ được kết nối" msgid "Browse Grease Pencil Data to be linked" -msgstr "Trình duyệt Bút Sáp cho liên kết" +msgstr "Duyệt Khối Dữ Liệu Bút Chì Dầu sẽ được kết nối" msgid "Browse Movie Clip to be linked" -msgstr "Trình duyệt Đoạn Phim cho liên kết" +msgstr "Duyệt Đoạn Phim (Movie Clip) sẽ được kết nối" msgid "Browse Mask to be linked" -msgstr "Trình duyệt Mặt Nạ cho liên kết" +msgstr "Duyệt Màn Chắn Lọc sắp kết nối" msgid "Browse Palette Data to be linked" -msgstr "Trình duyệt Dữ Liệu Bảng cho liên kết" +msgstr "Duyệt Dữ Liệu về Bảng Pha Màu sắp kết nối" msgid "Browse Paint Curve Data to be linked" -msgstr "Trình duyệt Dữ Liệu Đường Cong Sơn cho liên kết" +msgstr "Duyệt Dữ Liệu về Đường Cong Sơn sắp kết nối" msgid "Browse Cache Files to be linked" -msgstr "Trình duyệt Tập Tin Đệm Chứa cho liên kết" +msgstr "Duyệt các Tập Tin về Bộ Nhớ Đệm sắp kết nối" msgid "Browse Workspace to be linked" -msgstr "Trình duyệt Công Trường cho liên kết" +msgstr "Duyệt Không Gian Làm Việc sắp kết nối" msgid "Browse LightProbe to be linked" -msgstr "Trình duyệt Ánh Sáng Kế cho liên kết" +msgstr "Duyệt Điểm Thăm Dò Ánh Sáng sắp kết nối" msgid "Browse Curves Data to be linked" -msgstr "Trình duyệt Dữ Liệu Đường Cong để liên kết" +msgstr "Duyệt thảo Dữ Liệu Đường Cong sẽ liên kết" msgid "Browse Point Cloud Data to be linked" -msgstr "Trình duyệt Dữ Liệu Điểm Mây cho được liên kết" +msgstr "Duyệt Dữ Liệu Mây Điểm Chấm sắp Kết Nối" msgid "Browse Volume Data to be linked" -msgstr "Trình duyệt Dữ Liệu Thể Tích cho được liên kết" +msgstr "Duyệt Thảo Dữ Liệu Thể Tích sắp Kết Nối" msgid "Browse ID data to be linked" -msgstr "Trình Duyệt Dữ Liệu ID cho liên kết" +msgstr "Duyệt dữ liệu ID sắp kết nối" + + +msgid "The data-block %s is not overridable" +msgstr "Khối dữ liệu %s không thể vượt quyền được" + + +msgid "The type of data-block %s is not yet implemented" +msgstr "Kiểu khối dữ liệu %s chưa được thực hiện" + + +msgid "The data-block %s could not be overridden" +msgstr "Khối dữ liệu %s không thể vượt quyền được" msgctxt "Object" @@ -108721,7 +120663,7 @@ msgstr "Mới" msgctxt "Screen" msgid "New" -msgstr "Mớn" +msgstr "Mới" msgctxt "Speaker" @@ -108794,48 +120736,57 @@ msgid "New" msgstr "Mới" +msgctxt "PaintCurve" +msgid "New" +msgstr "Mới" + + msgid "%d items" -msgstr "%d mặt hàng" +msgstr "%d phần tử" msgid "Manual Transform" -msgstr "Biến Hóa Bằng Tay" +msgstr "Biến Hóa Thủ Công" msgid "Scene Options" -msgstr "Tùy Chọn Cảnh" +msgstr "Tùy Chọn về Cảnh" msgid "Samples Transform" -msgstr "Biến Hóa Mẫu" +msgstr "Thử Biến Hóa" msgid "Close" -msgstr "Gần" +msgstr "Đóng/Kín" msgid "Only" -msgstr "Chỉ" +msgstr "Duy" msgid "Object Options" -msgstr "Tùy Chọn Vật Thể" +msgstr "Tùy Chọn về Đối Tượng" msgid "Use Schema" -msgstr "Dùng Kế Hoạch" +msgstr "Dùng Kế Hoạch Phân Hóa của Alembic" msgid "Method Quads" -msgstr "Phương Pháp Tư Giác" +msgstr "Phương Pháp Tứ Giác" msgid "No filepath given" -msgstr "Chưa cung cấp tên tập tin" +msgstr "Không có đường dẫn tập tin nào được cung cấp cả" msgid "Unable to determine ABC sequence length" -msgstr "Không thể tính bề dài trình tự ABC" +msgstr "Không thể xác định được chiều dài của trình tự ABC" + + +msgid "Could not add a layer to the cache file" +msgstr "Không thể thêm một tầng lớp vào tập tin bộ nhớ đệm được" msgid "Global Orientation" @@ -108843,95 +120794,99 @@ msgstr "Định Hướng Toàn Cầu" msgid "Texture Options" -msgstr "Tùy Chọn Chất Liệu" +msgstr "Các Tùy Chọn về Chất Liệu" msgid "Only Selected Map" -msgstr "Chỉ Bản Độ Được Chọn" +msgstr "Duy Bản Đồ được Chọn" msgid "Export Data Options" -msgstr "Tùy Chọn Xuất Dữ Liệu" +msgstr "Các Tùy Chọn về Xuất Khẩu Dữ Liệu" msgid "Armature Options" -msgstr "Tùy Chọn Cốt" +msgstr "Các Tùy Chọn về Khung Cốt" msgid "Collada Options" -msgstr "Tùy Chọn Collada" +msgstr "Các Tùy Chọn về Collada" msgid "Import Data Options" -msgstr "Tùy Chọn Nhập Dữ Liệu" +msgstr "Các Tùy Chọn về Nhập Khẩu Dữ Liệu" msgid "Can't create export file" -msgstr "Không thể chế tạo tập tin xuất" +msgstr "Không thể kiến tạo tập tin xuất khẩu" msgid "Can't overwrite export file" -msgstr "Không thể ghi lại tập tin xuất" +msgstr "Không thể viết đè lên tập tin xuất khẩu" msgid "No objects selected -- Created empty export file" -msgstr "Chưa được chọn vật thể nào -- Đã chế tạo tập tin xuất rỗng" +msgstr "Không có đối tượng nào được chọn cả -- Đã kiến tạo tập tin xuất khẩu rỗng" msgid "Error during export (see Console)" -msgstr "Sai lầm khi xuất (xem Diện Điều Khiển)" +msgstr "Lỗi trong khi xuất khẩu (xem Bàn Giao Tiếp)" msgid "Parsing errors in Document (see Blender Console)" -msgstr "Sai lầm phân tích ngữ pháp trong Tài Liệu (xem Diện Điều Khiển Blender)" +msgstr "Quá trình phân tích phát hiện lỗi trong Tài Liệu (xem Bàn Giao Tiếp của Blender)" msgid "Export Options" -msgstr "Tùy Chọn Xuất" +msgstr "Tùy Chọn về Xuất Khẩu" msgid "Unable to find valid 3D View area" -msgstr "Không thể tìm một khu vực Màn 3D hợp lệ" +msgstr "Không tìm thấy khu vực Góc Nhìn 3D nào hợp lệ cả" msgid "Unable to export SVG" -msgstr "Không thể xuất SVG" +msgstr "Không thể xuất khẩu SVG được" msgid "Unable to export PDF" -msgstr "Không thể xuất PDF" +msgstr "Không thể xuất khẩu PDF được" + + +msgid "Unable to import '%s'" +msgstr "Không thể nhập khẩu '%s'" msgid "Triangulated Mesh" -msgstr "Mạng Lưới Tam Giác Hóa" +msgstr "Khung Lưới Tam Giác Hóa" msgid "Curves as NURBS" -msgstr "Đường Cong sang NURBS" +msgstr "Đường Cong thành NURBS" msgid "PBR Extensions" -msgstr "Đồ Mở Rộng PBR" +msgstr "Các Định Dạng PBR" msgid "Grouping" -msgstr "Nhóm Hóa" +msgstr "Nhóm lại" msgid "Object Groups" -msgstr "Nhóm Vật Thể" +msgstr "Nhóm Đối Tượng" msgid "Material Groups" -msgstr "Nhóm Vật Liệu" +msgstr "Các Nhóm Nguyên Vật Liệu" msgid "Smooth Groups" -msgstr "Nhóm Mịn" +msgstr "Các Nhóm Mịn" msgid "Smooth Group Bitflags" -msgstr "Cờ Bit Nhóm Mịn" +msgstr "Cờ Bit của Nhóm Mịn" msgid "ASCII" @@ -108939,7 +120894,7 @@ msgstr "ASCII" msgid "File References" -msgstr "Tham Chiếu Tập" +msgstr "Tham Chiếu Tập Tin" msgid "Data Types" @@ -108947,26 +120902,26 @@ msgstr "Kiểu Dữ Liệu" msgid "Mesh Data" -msgstr "Mạng Lưới Dữ Liệu" +msgstr "Dữ Liệu Khung Lưới" msgid "No weights/vertex groups on object(s)" -msgstr "Chưa có quyền lượng/nhóm đỉnh trên các vật thể" +msgstr "Không có trọng lượng/nhóm điểm đỉnh nào trên (các) đối tượng cả" msgctxt "Mesh" msgid "Plane" -msgstr "Mặt Phẳng" +msgstr "Bình Diện" msgctxt "Mesh" msgid "Cube" -msgstr "Lập Phương" +msgstr "Khối Lập Phương" msgctxt "Mesh" msgid "Circle" -msgstr "Vòng Tròn" +msgstr "Hình/Vòng/Tròn" msgctxt "Mesh" @@ -108981,12 +120936,12 @@ msgstr "Hình Nón" msgctxt "Mesh" msgid "Grid" -msgstr "Đồ Thị" +msgstr "Khung Lưới Đồ Thị" msgctxt "Mesh" msgid "Suzanne" -msgstr "Đầu Kỷ" +msgstr "Suzanne (Đầu Khỉ)" msgctxt "Mesh" @@ -108996,31 +120951,35 @@ msgstr "Hình Cầu" msgctxt "Mesh" msgid "Icosphere" -msgstr "Hình Cầu Diện" +msgstr "Nhị Thập Diện Cầu" msgid "Miter Shape" -msgstr "Hình Dạng Mũ Tế" +msgstr "Hình Dạng của Góc Cắt" msgid "Intersection Type" -msgstr "Loại Vùng Giao Cắt" +msgstr "Kiểu Giao Cắt" + + +msgid "%s: Confirm, %s: Cancel, %s: Width Type (%s), %s: Width (%s), %s: Segments (%d), %s: Profile (%.3f), %s: Clamp Overlap (%s), %s: Affect (%s), %s: Outer Miter (%s), %s: Inner Miter (%s), %s: Harden Normals (%s), %s: Mark Seam (%s), %s: Mark Sharp (%s), %s: Profile Type (%s), %s: Intersection (%s)" +msgstr "%s: Xác nhận, %s: Hủy, %s: Loại Chiều Rộng (%s), %s: Chiều Rộng (%s), %s: Số Phân Đoạn (%d), %s: Mặt Cắt (%.3f), %s: Hạn định Chồng Gối (%s), %s: Ảnh Hưởng (%s), %s: Cắt Góc Ngoại (%s), %s: Cắt Góc Nội (%s), %s,: Cương Pháp Tuyến (%s), %s: Đánh Dấu Đường Khâu (%s), %s: Đánh Dấu Sắc Nét (%s), %s: Loại Mặt Cắt (%s ), %s: Giao Cắt Nhau (%s)" msgid "LMB: Click and drag to draw cut line" -msgstr "NCT: Bấm và kéo cho vẽ nét cắt" +msgstr "NCT: Bấm và kéo để vẽ đường cắt" msgid "LMB: Release to confirm cut line" -msgstr "NCT: Thả để chấp nhận cắt đường" +msgstr "NCT: Thả nút để chấp nhận đường cắt" msgid "Selected edges/faces required" -msgstr "Yên cầu được chọn cạnh/mặt" +msgstr "Đòi hỏi phải lựa chọn các cạnh/các mặt" msgid "Not a valid selection for extrude" -msgstr "Sự lựa chọn không hợp lệ cho kéo ra" +msgstr "Lựa chọn đẩy trồi không hợp lệ" msgid "Invalid/unset axis" @@ -109028,183 +120987,199 @@ msgstr "Trục không hợp lệ/chưa đặt" msgid "You have to select a string of connected vertices too" -msgstr "Bạn cần chọn một chuỗi đỉnh nối nhau nữa" +msgstr "Bạn cần phải lựa chọn một trình tự các điểm đỉnh kết nối nữa" msgid "Confirm: Enter/LClick, Cancel: (Esc/RClick), Thickness: %s, Depth (Ctrl to tweak): %s (%s), Outset (O): (%s), Boundary (B): (%s), Individual (I): (%s)" -msgstr "Chấp Nhận: Enter/Bấm Trái, Hủy: (Esc/Bấm Phải), Bề Rộng: %s, Đậ Sâu (Ctrl để chỉnh): %s (%s), Nới Ra (O): (%s), Ranh Giới (B): (%s), Độc Lập (I): (%s)" +msgstr "Phê Chuẩn: Enter/Bấm trái, Hủy: (Esc/Bấm phải), Độ dày: %s, Độ Sâu (Ctrl để hiệu chỉnh): %s (%s), Cắt Ngoài (O): (%s), Ranh giới (B): (%s), Cá nhân (I) (%s)" msgid "Compiled without GMP, using fast solver" -msgstr "Đã biên dịch thiếu GMP, đang dùng trình giải nghiệm nhanh" +msgstr "Được biên dịch không có sự hỗ trợ của GMP (GNU Multiple Precision Arithmetic Library: Thư viện đa độ chính xác số học), sử dụng bộ giải nghiệm tốc hành" msgid "No intersections found" -msgstr "Không kiếm được vùg giao cắt" +msgstr "Không tìm thấy các điểm giao cắt" msgid "%s: confirm, %s: cancel, %s: undo, %s: start/define cut, %s: close cut, %s: new cut, %s: midpoint snap (%s), %s: ignore snap (%s), %s: angle constraint %.2f(%.2f) (%s%s%s%s), %s: cut through (%s), %s: panning, %s%s%s: orientation lock (%s), %s: distance/angle measurements (%s), %s: x-ray (%s)" -msgstr "%s: chấp nhận, %s: hủy, %s: hủy bước, %s: bắt đầu/chỉ định cut, %s: kết thúc cắt, %s: cắt mới, %s: hút dính điểm trung (%s), %s: không quan tâm tra đổi (%s), %s: ràng buộc góc %.2f(%.2f) (%s%s%s%s), %s: cắt xuyên (%s), %s: dời, %s%s%s: khóa định hướng (%s), %s: đo khoảng cách/góc (%s), %s: x-quang (%s)" +msgstr "%s: xc.nhận, %s: hủy, %s: hn.tác, %s: b.đầu/xác đh đng.cắt, %s: đóng đng.cắt, %s: đng.cắt mới, %s: b.dính trung đm (%s), %s: bỏ qua b.dính (%s), %s: r.buộc góc %.2f(%.2f) (%s%s%s%s), %s: cắt xuyên (%s), %s: lia, %s%s%s: khóa đ.hướng (%s), %s: đ.lường góc/kh.cách (%s), %s: x-quang (%s)" msgid "Selected faces required" -msgstr "Yêu cầu chọn mặt" +msgstr "Đòi hỏi các mặt phải đã được chọn" msgid "No other selected objects have wire or boundary edges to use for projection" -msgstr "Không tìm được vật thể khác được chọn mà có cạnh dây hay ranh giới để dùng cho phép chiếu" +msgstr "Không có đối tượng khác đã được chọn nào có mạch lưới hoặc cạnh viền mép để sử dụng cho quá trình phóng chiếu" msgid "Select a ring to be cut, use mouse-wheel or page-up/down for number of cuts, hold Alt for smooth" -msgstr "Chọn một tổ chức song song để cắt, dùng nút cuộn chuột hay phím page up/down cho số lần cắt, bấm giữ Alt cho mịn" +msgstr "Chọn một mạch lưới để cắt, dùng bánh xe chuột hoặc nút Page-up/down để điều chỉnh số lượng mạch lưới cắt, giữ phím Alt xuống để chỉnh độ mịn" msgid "Number of Cuts: %s, Smooth: %s (Alt)" -msgstr "Số Lượng Cắt: %s, Mịn: %s (Alt)" +msgstr "Số Phân Đoạn: %s, Độ Mịn: %s (Alt)" msgid "Loop cut does not work well on deformed edit mesh display" -msgstr "Vòng cắt không hoạt động tốt với hiển thị biên tập mạng lưới bị méo hóa" +msgstr "Mạch lưới cắt không hoạt động bình thường khi hiển thị khung lưới biên soạn bị biến dạng" msgid "The geometry can not be extracted with dyntopo activated" -msgstr "Không thể rút ra hình dạng khi hình dạng học động lý đang hoạt động" +msgstr "Không thể trích xuất hình học trong khi cấu trúc động đã được kích hoạt" msgid "Path selection requires two matching elements to be selected" -msgstr "Chọn đường yêu cầu chọn hai phần tử giống hệt" +msgstr "Việc lựa chọn đường dẫn đòi hỏi hai phần tử xứng khớp đã được chọn rồi" msgid "Cannot rip selected faces" -msgstr "Không thể xé mặt được chọn" +msgstr "Không thể tách các mặt đã lựa chọn ra được" msgid "Cannot rip multiple disconnected vertices" -msgstr "Không thể xé đa đỉnh không kết nối nhau" +msgstr "Không thể tách tập thể các điểm đỉnh trong khi chúng không mắc nối với nhau được" msgid "Rip failed" -msgstr "Xé bị thất bại" +msgstr "Quá trình tách bị thất bại" msgid "Vertex select - Shift-Click for multiple modes, Ctrl-Click contracts selection" -msgstr "Lựa chọn đỉnh - Shift-Bấm cho nhiều chế độ, Ctrl-Bấm rút sự lựa chọn nhỏ" +msgstr "Lựa chọn điểm đỉnh - Shift+Bấm Chuột để sang chế độ chọn nhiều, Ctrl+Bấm Chuột để thu nhỏ vùng lựa chọn" msgid "Edge select - Shift-Click for multiple modes, Ctrl-Click expands/contracts selection depending on the current mode" -msgstr "Lựa chọn cạnh - Shift-Bấm cho nhiều chế độ, Ctrl-Bấm để mở rộng/rút nhỏ sự lựa chọn tùy chế đồ hiện tại" +msgstr "Lựa chọn cạnh - Shift+Bấm Chuột để sang chế độ chọn nhiều, Ctrl+Bấm Chuột để nới rộng/thu nhỏ vùng lựa chọn tùy thuộc vào chế độ hiện tại" msgid "Face select - Shift-Click for multiple modes, Ctrl-Click expands selection" -msgstr "Lựa chọn mặt - Shift-Bấm cho nhiều chế độ, Ctrl-Bấm rút sự lựa chọn nhỏ" +msgstr "Lựa chọn Mặt - Shift+Bấm Chuột để sang chế độ chọn nhiều, Ctrl+Bấm Chuột để nới rộng vùng lựa chọn" msgid "No face regions selected" -msgstr "Chưa chọn vùng mặt nào" +msgstr "Chưa lựa chọn vùng Mặt nào cả" msgid "No matching face regions found" -msgstr "Không tìm được vùng mặt giống" +msgstr "Không tìm thấy vùng Mặt xứng khớp nào cả" msgid "Mesh object(s) have no active vertex/edge/face" -msgstr "Vật thể thì không có đỉnh/cạnh/mặt hoạt động" +msgstr "(Các) đối tượng khung lưới không có điểm đỉnh/cạnh/Mặt nào đang hoạt động cả" msgid "Does not work in face selection mode" -msgstr "Không hoạt động trong chế độ sự lựa chọn mặt" +msgstr "Không hoạt động trong chế độ lựa chọn Mặt" msgid "This operator requires an active vertex (last selected)" -msgstr "Thao tác này yêu cầu một đỉnh hoạt động (được chọn cuối)" +msgstr "Operator này đòi hỏi một điểm đỉnh đang hoạt động (cái được chọn cuối cùng)" msgid "Must be in vertex selection mode" -msgstr "Phải ở trong chế độ sự lựa chọn" +msgstr "Phải ở trong chế độ lựa chọn điểm đỉnh" msgid "No weights/vertex groups on object" -msgstr "Chưa có quyền lượng/nhóm đỉnh trong vật thể" +msgstr "Không có trọng lượng/nhóm điểm đỉnh trong đối tượng" + + +msgid "There must be an active attribute" +msgstr "Phải có một thuộc tính ở tình trạng đang hoạt động nhé" + + +msgid "The active attribute must have a boolean type" +msgstr "Thuộc tính đang hoạt động phải có kiểu là boolean nhé" + + +msgid "The active attribute must be on the vertex, edge, or face domain" +msgstr "Thuộc tính đang hoạt động phải nằm trên phạm vi điểm đỉnh, cạnh hoặc mặt nhé" msgid "No face selected" -msgstr "Chưa chọn mặt nào" +msgstr "Không có Mặt nào đã được chọn cả" msgid "No edge selected" -msgstr "Chưa chọn cạnh nào" +msgstr "Không có cạnh nào đã được chọn cả" msgid "No vertex selected" -msgstr "Chưa chọn đỉnh nào" +msgstr "Không có điểm đỉnh nào đã được chọn cả" msgid "No vertex group among the selected vertices" -msgstr "Không có nhóm đỉnh nào trong các đỉnh được chọn" +msgstr "Không có nhóm điểm đỉnh nào trong số các điểm đỉnh đã chọn cả" msgid "%s: confirm, %s: cancel, %s: point to mouse (%s), %s: point to Pivot, %s: point to object origin, %s: reset normals, %s: set & point to 3D cursor, %s: select & point to mesh item, %s: invert normals (%s), %s: spherize (%s), %s: align (%s)" -msgstr "%s: chấp nhận, %s: hủy, %s: chỉ đến chuột (%s), %s: chỉ đến Điểm Tựa, %s: chỉ đến gốc tọa độ vật thể, %s: đặt lại pháp tuyến, %s: đặt và chỉ đến con trỏ 3D, %s: chọn và chỉ đến mặt hàng mạng lưới, %s: lật pháp tuyến (%s), %s: hình cầu hóa (%s), %s: sắp xếp (%s)" +msgstr "%s: chấp thuận, %s: hủy, %s: chỉ vào chuột (%s), %s: chỉ vào Điểm Tựa, %s: chỉ vào tọa độ gốc đối tượng, %s: hoàn lại pháp tuyến, %s: đặt & chỉ vào con trỏ 3D, %s: chọn & chỉ vào phần tử khung lưới, %s: đảo nghịch pháp tuyến (%s), %s: hình cầu hóa (%s), %s: căn chỉnh (%s)" msgid "Invalid selection order" -msgstr "Thứ tự sự lựa chọn không hợp lệ" +msgstr "Trật tự lựa chọn không hợp lệ" msgid "Select edges or face pairs for edge loops to rotate about" -msgstr "Chọn đôi cạnh hay mặt cho vòng cạnh có thể xoay quanh" +msgstr "Chọn các đôi cạnh hay Mặt để các vòng cạnh có thể xoay quanh" msgid "Could not find any selected edges that can be rotated" -msgstr "Không thể tìm mặt được chọn mà có thể xoay" +msgstr "Không tìm thấy bất cứ cạnh đã chọn nào có thể xoay chiều được" msgid "No selected vertex" -msgstr "Chưa chọn đỉnh nào" +msgstr "Không có điểm đỉnh nào được chọn" msgid "Mesh(es) do not have shape keys" -msgstr "Các mạng lưới không có mẫu dạng" +msgstr "Khung lưới không có hình mẫu (shape keys)" msgid "Active mesh does not have shape keys" -msgstr "Mạng lưới hoạt động không có mẫu dạng" +msgstr "Khung lưới đang hoạt động không có hình mẫu (shape keys)" msgid "No edges are selected to operate on" -msgstr "Chưa chọn cạnh nào để thao tác" +msgstr "Không có cạnh nào được chọn để thao tác cả" msgid "Mouse path too short" -msgstr "Đường chuột qúa nhắn" +msgstr "Đường dẫn cho chột quá ngắn" msgid "Selection not supported in object mode" -msgstr "Chế độ vật thể không hỗ trợ sự lựa chọn" +msgstr "Chọn lựa trong chế độ đối tượng chưa được hỗ trợ" msgid "No edges selected" -msgstr "Chưa chọn cạnh nào" +msgstr "Không có cạnh nào được chọn cả" msgid "No faces filled" -msgstr "Không làm đầy được mặt" +msgstr "Không có các mặt nào được phủ đầy cả" msgid "No active vertex group" -msgstr "Không có nhóm đỉnh hoạt động" +msgstr "Không có nhóm điểm đỉnh đang hoạt động" msgid "View not found, cannot sort by view axis" -msgstr "Không tìm được màn chiếu, không thể sắp thự tự bằng trục màn" +msgstr "Không tìm thấy góc nhìn nào cả. Không thể sắp xếp theo trục của góc nhìn" + + +msgid "Does not support Individual Origins as pivot" +msgstr "Không hỗ trợ điểm tựa dùng Tọa Độ Gốc Cá Nhân" msgid "Can only copy one custom normal, vertex normal or face normal" -msgstr "Chỉ có thể chép lại một pháp tuyến tùy chọn, pháp tuyến đỉnh, hay pháp tuyến mặt" +msgstr "Chỉ có thể sao chép một pháp tuyến tùy chọn, pháp tuyến điểm đỉnh hoặc pháp tuyến Mặt mà thôi" msgid "Removed: %d vertices, %d edges, %d faces" -msgstr "Đã xóa: %d đỉnh, %d cạnh, %d mặt" +msgstr "Xóa: %d điểm đỉnh, %d cạnh, %d các mặt" msgid "Unable to rotate %d edge(s)" @@ -109212,103 +121187,119 @@ msgstr "Không thể xoay %d cạnh" msgid "Removed %d vertice(s)" -msgstr "Đã xóa %d đỉnh" +msgstr "Đã xóa %d điểm đỉnh" msgid "%d already symmetrical, %d pairs mirrored, %d failed" -msgstr "%d đối xứng nhau rồi, %d đôi gương nhau rồi, %d thất bại" +msgstr "%d đã đối xứng rồi, %d đôi được phản chiếu đối xứng, %d thất bại" msgid "%d already symmetrical, %d pairs mirrored" -msgstr "%d đối xứng nhau rồi, %d đôi gương nhau rồi" +msgstr "%d đã đối xứng, %d đôi được phản chiếu đối xứng" msgid "Parse error in %s" -msgstr "Sai lầm ngữ pháp trong: %s" +msgstr "Lỗi phân tích cú pháp trong: %s" msgid "Cannot add vertices in edit mode" -msgstr "Không thể thêm đỉnh trong chế độ biên tập" +msgstr "Không thể thêm điểm đỉnh vào trong Chế Độ Biên Soạn" msgid "Cannot add edges in edit mode" -msgstr "Không thể thêm cạnh trong chế độ biên tập" +msgstr "Không thể thêm các cạnh vào trong Chế Độ Biên Soạn" msgid "Cannot add loops in edit mode" -msgstr "Không thể thêm lặp vòng trong chế độ biên tập" +msgstr "Không thể thêm mạnh lưới trong Chế Độ Biên Soạn" + + +msgid "Cannot add faces in edit mode" +msgstr "Không thể cho thêm các mặt vào trong chế độ biên soạn được" msgid "Cannot remove vertices in edit mode" -msgstr "Không thể xóa đỉnh trong chế độ biên tập" +msgstr "Không thể xóa các điểm đỉnh trong Chế Độ Biên Soạn" msgid "Cannot remove more vertices than the mesh contains" -msgstr "Không thể xóa số lượng đỉnh hơn thì có trong lưới" +msgstr "Không thể xóa số lượng điểm đỉnh nhiều hơn số có trong khung lưới" msgid "Cannot remove edges in edit mode" -msgstr "Không thể xóa cạnh trong chế độ biên tập" +msgstr "Không thể xóa các cạnh trong Chế Độ Biên Soạn" msgid "Cannot remove more edges than the mesh contains" -msgstr "Không thể xóa số lượng cạnh hơn thì có trong mạng lưới" +msgstr "Không thể xóa số lượng cạnh nhiều hơn số có trong khung lưới" msgid "Cannot remove loops in edit mode" -msgstr "Không thể xóa vòng lặp trong chế độ biên tập" +msgstr "Không thể xóa bỏ các mạch lưới trong chế độ biên soạn" msgid "Cannot remove more loops than the mesh contains" -msgstr "Không thể xóa số lượng vòng lặp hơn có trong mạng lưới" +msgstr "Không thể xóa bỏ số mạch lưới lớn hơn số lượng vốn có trong khung lưới" msgid "Cannot remove polys in edit mode" -msgstr "Không thể xóa đa giác trong chế độ biên tập" +msgstr "Không thể xóa bỏ các đa giác trong chế độ biên soạn" msgid "Cannot remove more polys than the mesh contains" -msgstr "Không thể xóa số lượng đa giác hơn có trong mạng lưới" +msgstr "Không thể xóa bỏ số lượng đa giác nhiều hơn số lượng vốn vốn có trong khung lưới" msgid "Cannot add more than %i UV maps" -msgstr "Không thể thêm hơn %i bản đồ UV" +msgstr "Không thể thêm nhiều hơn %i ánh xạ UV được" msgid "%d %s mirrored, %d failed" -msgstr "%d %s được gương lại, %d thất bại" +msgstr "%d %s được phản chiếu đối xứng, %d bị thất bại" msgid "%d %s mirrored" -msgstr "%d %s được gương lại" +msgstr "%d %s được phản chiếu đối xứng" msgid "Cannot join while in edit mode" -msgstr "Không thể kết nối trong chế độ biên tập" +msgstr "Không thể hội nhập trong khi đang ở trong Chế Độ Biên Soạn" msgid "Active object is not a selected mesh" -msgstr "Vật thể hoạt động không phải là mạng lưới được chọn" +msgstr "Đối tượng đang hoạt động không phải là một khung lưới đã được chọn" msgid "No mesh data to join" -msgstr "Không có dữ liệu mạng lưới để kết nối" +msgstr "Không có dữ liệu lưới để hội nhập" msgid "Selected meshes must have equal numbers of vertices" -msgstr "Mạng lưới được chọn phải có số lượng đỉnh bằng nhau" +msgstr "Khung lưới lựa chọn phải có số lượng điểm đỉnh bằng nhau" msgid "No additional selected meshes with equal vertex count to join" -msgstr "Không còn thêm mạng lưới được chọn có số lượng đỉnh bằng nhau để kết nối" +msgstr "Không còn khung lưới nào đã chọn có số lượng điểm đỉnh bằng nhau để hội nhập nữa" msgid "Joining results in %d vertices, limit is %ld" -msgstr "Đang kết nối kết qủa trong %d đỉnh, giới hạn là %ld" +msgstr "Sự hòa nhập đạt được kết quả là %d điểm đỉnh, giới hạn là %ld" + + +msgid "Loading Asset Libraries" +msgstr "Đang Nạp các Thư Viện Tài Sản" msgid "Unassigned" -msgstr "Chưa Được Chỉ Định:" +msgstr "Chưa Ấn Định" + + +msgid "" +"Modifier node group assets not assigned to a catalog.\n" +"Catalogs can be assigned in the Asset Browser" +msgstr "" +"Tài sản nhóm nút của bộ điều chỉnh chưa được ấn định vào một danh mục nào cả.\n" +"Danh mục có thể được ấn định trong Trình Duyệt Tài Sản nhé" msgid "SoundTrack" @@ -109317,7 +121308,7 @@ msgstr "RãnhÂmThanh" msgctxt "Light" msgid "LightProbe" -msgstr "ÁnhSángKế" +msgstr "ThămDòÁnhSáng" msgctxt "Object" @@ -109327,12 +121318,12 @@ msgstr "Lực" msgctxt "Object" msgid "Vortex" -msgstr "CơnLốc" +msgstr "Lốc Xoáy" msgctxt "Object" msgid "Magnet" -msgstr "NamChâm" +msgstr "Nam Châm" msgctxt "Object" @@ -109342,17 +121333,17 @@ msgstr "Gió" msgctxt "Object" msgid "CurveGuide" -msgstr "ĐườngCongDẫn" +msgstr "HướngĐạoTheoĐườngCong" msgctxt "Object" msgid "TextureField" -msgstr "TrườngHọaTiết" +msgstr "Trường Chất Liệu" msgctxt "Object" msgid "Harmonic" -msgstr "Điều Hòa" +msgstr "Giao Động Điều Hòa" msgctxt "Object" @@ -109372,17 +121363,17 @@ msgstr "Quần Thể" msgctxt "Object" msgid "Turbulence" -msgstr "Nhiễu Loạn" +msgstr "Hỗn Loạn" msgctxt "Object" msgid "Drag" -msgstr "Lực Cản" +msgstr "Lực Cản/Kéo Rê" msgctxt "Object" msgid "FluidField" -msgstr "TrườngChấtLỏng" +msgstr "Trườmg Chất Lỏng" msgctxt "Object" @@ -109392,150 +121383,154 @@ msgstr "Trường" msgctxt "GPencil" msgid "GPencil" -msgstr "BútSáp" +msgstr "Bút Chì Dầu" msgctxt "GPencil" msgid "Suzanne" -msgstr "Đầu Kỷ" +msgstr "Đầu Khỉ" msgctxt "GPencil" msgid "Stroke" -msgstr "Nét" +msgstr "Nét Vẽ" msgctxt "GPencil" msgid "LineArt" -msgstr "NghệThuậtĐườngNét" +msgstr "Mỹ Thuật Đường Nét" msgid "Cannot create editmode armature" -msgstr "Không thể chế tạo cốt chế độ biên tập" +msgstr "Không thể kiến tạo khung cốt ở chế độ biên soạn" msgid "Not implemented" -msgstr "Chưa được thành lập" +msgstr "Chưa được thực hiện" msgid "Converting some non-editable object/object data, enforcing 'Keep Original' option to True" -msgstr "Đang biến đổi một số dữ liệu của vật thể không thể biên tập, đang ép buộc tùy chọn 'Giữ Nguyên' cho Đúng" +msgstr "Đang chuyển đổi một số dữ liệu đối tượng không chỉnh sửa được hoặc dữ liệu đối tượng, tôn trọng hiệu lực của tùy chọn 'Duy Trì Bản Gốc' ở trạng thái Đúng (True)" msgid "Convert Surfaces to Grease Pencil is not supported" -msgstr "Không hỗ trợ biến đổi Bề Mặt sang Bút Sáp" +msgstr "Không hỗ trợ sự chuyển đổi các bề mặt thành Bút Chì Dầu" msgid "Object not found" -msgstr "Không tìm được vật thể" +msgstr "Không tìm thấy đối tượng" msgid "Object could not be duplicated" -msgstr "Không thể sao chép vật thể" +msgstr "Đối tượng không thể sao chép được" msgid "This data does not support joining in edit mode" -msgstr "Đữ liệu này không hỗ trợ kết nối lại trong chế độ biên tập" +msgstr "Dữ liệu này không hỗ trợ hội nhập trong Chế Độ Biên Soạn" msgid "Cannot edit external library data" -msgstr "Không thể biên tập dữ liệu thư viện ngoại bộ" +msgstr "Không thể biên soạn dữ liệu thư viện bên ngoài" msgid "This data does not support joining in this mode" -msgstr "Đữ liệu này không hỗ trợ kết nối lại trong chế độ biên tập" +msgstr "Dữ liệu này không hỗ trợ thao tác hội nhập trong chế độ này" msgid "Active object final transform has one or more zero scaled axes" -msgstr "Biến hóa cuối của vật thể hoạt động có một trở lên trục được phóng to" +msgstr "Biến hóa sau cùng của đối tượng đang hoạt động gây ra một hoặc nhiều trục tỷ lệ hóa thành 0" msgid "Cannot delete indirectly linked object '%s'" -msgstr "Không được xóa thư viện được liên kết với vật thể '%s' gián tiếp" +msgstr "Không thể xóa thư viện kết nối gián tiếp '%s'" msgid "Cannot delete object '%s' as it is used by override collections" -msgstr "Không thể xoá vật thể '%s' vì nó được dùng bởi sưu tập đồ vượt quyền" +msgstr "Không thể xóa đối tượng '%s' vì nó đang được sử dụng bởi các bộ sưu tập vượt quyền" msgid "Cannot delete object '%s' from scene '%s', indirectly used objects need at least one user" -msgstr "Không thể xóa vật thể '%s' từ cảnh '%s', vật thể được dùng gián tiếp cần ít nhất một người dùng" +msgstr "Không thể xóa đối tượng '%s' ra khỏi cảnh '%s'. Những đối tượng sử dụng gián tiếp cần có ít nhất một người dùng" msgid "Deleted %u object(s)" -msgstr "Được xóa %u vật thể" +msgstr "Xóa (các) đối tượng %u" msgid "Object '%s' has no evaluated curves data" -msgstr "Vật thể '%s' không có dữ liệu mạng lưới được tính toán" +msgstr "Đối tượng '%s' không có dữ liệu đường cong nào đã được tính toán cả" + + +msgid "Object '%s' has no evaluated mesh or curves data" +msgstr "Đối tượng '%s' không có dữ liệu đường cong hoặc khung lưới nào đã được tính toán cả" msgid "Cannot edit object '%s' as it is used by override collections" -msgstr "Không thể xoá vật thể '%s' vì nó được dùng bởi sưu tập đồ vượt quyền" +msgstr "Không thể chỉnh sửa đối tượng '%s' vì nó đang được sử dụng bởi các bộ sưu tập vượt quyền" msgid "No active mesh object" -msgstr "Không có vật thể mạng lưới hoạt động" +msgstr "Không có đối tượng khung lưới nào đang hoạt động cả" msgid "Baking of multires data only works with an active mesh object" -msgstr "Nướng dữ liệu đa phân giải chỉ được dùng với một vật thể mạng lưới hoạt động" +msgstr "Quá trình nướng dữ liệu đa phân giải chỉ làm việc với một đối tượng lưới đang hoạt động mà thôi" msgid "Multires data baking requires multi-resolution object" -msgstr "Nướng dữ liệu đa độ phân giải yêu cầu vật thể đa độ phân giải" +msgstr "Quá trình nướng dữ liệu đa phân giải đòi hỏi đối tượng đa phân giải" msgid "Mesh should be unwrapped before multires data baking" -msgstr "Nên gỡ gối mạng lưới trước nướng dữ liệu đa phân giải" +msgstr "Khung lưới cần phải được mở gói trước khi nướng dữ liệu đa phân giải" msgid "You should have active texture to use multires baker" -msgstr "Bạn nên có chất liệu hoạt động để dùng bộ nướng đa phân giải" +msgstr "Để sử dụng bộ nướng đa phân giải, bạn nên có chất liệu nào đó đang hoạt động mới được" msgid "Baking should happen to image with image buffer" -msgstr "Nướng nên xảy ra với ảnh trong đệm ảnh" +msgstr "Quá trình nướng cần hoạt động với hình ảnh có bộ đệm ảnh" msgid "Baking to unsupported image type" -msgstr "Nướng đến loại ảnh không được hỗ trợ" +msgstr "Thể loại ảnh để nướng thành chưa được hỗ trợ" msgid "No objects found to bake from" -msgstr "Không tìm được vật thể để dùng cho nướng" +msgstr "Không tìm thấy đối tượng nào để dùng cho quá trình nướng" msgid "Combined bake pass requires Emit, or a light pass with Direct or Indirect contributions enabled" -msgstr "Vòng nướng gồm yêu cầu vòng Phát Xạ, hay một vòng ánh sáng có bật góp phần Ánh Sáng Trực Tiếp hay Gián Tiếp" +msgstr "Lượt nướng kết hợp đòi hỏi sự đóng góp của Phát Xạ, hoặc sự đóng góp của một lượt về ánh sáng với Trực Tiếp hoặc Gián Tiếp" msgid "Bake pass requires Direct, Indirect, or Color contributions to be enabled" -msgstr "Vòng nướng yêu cầu có bật góp phần Ánh Sáng Trực Tiếp hay Gián Tiếp" +msgstr "Lượt nướng đòi hỏi sự đóng góp của ánh sáng Trực Tiếp, Gián Tiếp, hoặc Màu Sắc" msgid "No valid selected objects" -msgstr "Không được chọn vật thể hợp lệ" +msgstr "Không có đối tượng lựa chọn hợp lệ nào cả" msgid "No active image found, add a material or bake to an external file" -msgstr "Không tìm được ảnh hoạt động, chế tạo thêm vật liệu hay nướng vào tập tin ngoài" +msgstr "Không tìm thấy hình ảnh nào đang hoạt động cả. Hãy thêm nguyên vật liệu vào hoặc nướng ra một tập tin ở bên ngoài" msgid "No active image found, add a material or bake without the Split Materials option" -msgstr "Không tìm được ảnh hoạt động, chế tạo thêm một vật liệu hay nướng không dùng tùy chọn Chẻ Vật Liệu" +msgstr "Không tìm thấy hình ảnh nào đang hoạt động cả. Hãy thêm nguyên vật liệu vào hoặc nướng mà không dùng tùy chọn Phân Tách Nguyên Vật Liệu" msgid "Baking map saved to internal image, save it externally or pack it" -msgstr "Bản đồ nướng được lưu vào ảnh nội bộ, lưu nó ra ngoài hay gói lại nó" +msgstr "Ánh xạ nướng đã được lưu thành một hình ảnh nội bộ. Hãy lưu nó ra ngoài hay đóng gói nó lại" msgid "Color attribute baking is only supported for mesh objects" -msgstr "nướng đặc điểm màu chỉ được hỗ trợ cho vật thể mạng lưới" +msgstr "Nướng thuộc tính màu sắc chỉ được hỗ trợ cho các đối tượng khung lưới mà thôi" msgid "No active color attribute to bake to" -msgstr "Không có đặc điểm màu để nướng đến" +msgstr "Không có thuộc tính màu nào đang hoạt động để nướng sang cả" msgid "Current render engine does not support baking" @@ -109543,467 +121538,531 @@ msgstr "Động cơ kết xuất hiện tại không hỗ trợ nướng" msgid "No valid cage object" -msgstr "Không có vật thể lồng hợp kệ" +msgstr "Không có đối tượng lồng hợp kệ" msgid "Invalid cage object, the cage mesh must have the same number of faces as the active object" -msgstr "Vật thể lồng không hợp lệ, mạng lưới lồng phải có cùng số lượng mặt bằng vật thể hoạt động" +msgstr "Đối tượng lồng không hợp lệ, khung lưới lồng phải có cùng số lượng mặt phẳng với đối tượng đang hoạt động" msgid "Error handling selected objects" -msgstr "Sai lầm sắp xếp các vật thể được chọn" +msgstr "Lỗi xảy ra trong khi đang xử lý đối tượng được chọn" msgid "Object \"%s\" is not in view layer" -msgstr "Vật thể \"%s\" không ở trong một lớp màn chiếu" +msgstr "Đối tượng \"%s\" không nằm trong tầng góc nhìn" msgid "Object \"%s\" is not enabled for rendering" -msgstr "Vật thể \"%s\" không được bật để kết xuất" +msgstr "Đối tượng \"%s\" không được bật kết xuất" msgid "Object \"%s\" is not a mesh" -msgstr "Vật thể \"%s\" không phải là mạng lưới" +msgstr "Đối tượng \"%s\" không phải là khung lưới" msgid "No faces found in the object \"%s\"" -msgstr "Không tìm được mật nào trong vật thể \"%s\"" +msgstr "Không tìm thấy các mặt nào trong đối tượng \"%s\" cả" msgid "Mesh does not have an active color attribute \"%s\"" -msgstr "Mạng lưới không có một đặc điểm màu hoạt động \"%s\"" +msgstr "Khung lưới không có thuộc tính màu đang hoạt động \"%s\"" msgid "No active UV layer found in the object \"%s\"" -msgstr "Không tìm được lớp UV hoạt động nào trong vật thể \"%s\"" +msgstr "Không tìm thấy tầng UV nào đang hoạt động trong đối tượng \"%s\" cả" msgid "Circular dependency for image \"%s\" from object \"%s\"" -msgstr "Sự nhờ vòng tròn cho ảnh \"%s\" từ vật thể \"%s\"" +msgstr "Sự phụ thuộc tuần hoàn xảy ra đối với hình ảnh \"%s\" ở đối tượng \"%s\"" msgid "Uninitialized image \"%s\" from object \"%s\"" -msgstr "Ảnh \"%s\" chưa khời động từ vật thể \"%s\"" +msgstr "Hình ảnh \"%s\" chưa được khởi thủy ở đối tượng \"%s\"" msgid "No active image found in material \"%s\" (%d) for object \"%s\"" -msgstr "Không tìm được ảnh hoạt động nào trong vật liệu \"%s\" (%d) cho vật thể \"%s\"" +msgstr "Không tìm thấy ảnh đang hoạt động trong nguyên vật liệu \"%s\" (%d) cho đối tượng \"%s\"" msgid "No active image found in material slot (%d) for object \"%s\"" -msgstr "Không tìm được ảnh hoạt động nào trong khe vật liệu (%d) cho vật thể \"%s\"" +msgstr "Không tìm thấy hình ảnh đang hoạt động trong khe chất liệu (%d) cho đối tượng \"%s\"" msgid "Object \"%s\" is not a mesh or can't be converted to a mesh (Curve, Text, Surface or Metaball)" -msgstr "Vật thể \"%s\" không phải lả mạng lưới hay không thể đổi thành mạng lưới (Đường Cong, Văn Bản, Bề Mặt, hay Siêu Cầu)" +msgstr "Đối tượng \"%s\" không phải là một khung lưới, hoặc không thể chuyển đổi thành khung lưới được (Đường Cong, Văn Bản, Bề Mặt, hay Siêu Cầu)" msgid "Uninitialized image %s" -msgstr "Ảnh %s chưa khởi động" +msgstr "Hình ảnh %s chưa được chuẩn bị" msgid "Problem saving the bake map internally for object \"%s\"" -msgstr "Vấn đề lưu bản đồ nướng nội bộ cho vật thể \"%s\"" +msgstr "Có vấn đề nội bộ xảy ra trong khi lưu ánh xạ nướng cho đối tượng \"%s\"" msgid "Problem saving baked map in \"%s\"" -msgstr "Vấn đề lưu bản đồ nướng trong \"%s\"" +msgstr "Có vấn đề xảy ra trong khi lưu ánh xạ nướng vào \"%s\"" msgid "Baking map written to \"%s\"" -msgstr "Bản đồ nướng được lưu vào \"%s\"" +msgstr "Ánh xạ nướng được ghi vào \"%s\"" msgid "No UV layer named \"%s\" found in the object \"%s\"" -msgstr "Không tìm được lớp UV có tên \"%s\" trong vật thể \"%s\"" +msgstr "Không tìm thấy tầng UV có tên là \"%s\" trong đối tượng \"%s\"" msgid "Error baking from object \"%s\"" -msgstr "Sai lầm nướng vật thể \"%s\"" +msgstr "Lỗi xảy ra trong quá trình nướng đối tượng \"%s\"" msgid "Problem baking object \"%s\"" -msgstr "Vấn đề nướng vật thể \"%s\"" +msgstr "Có vấn đề xảy ra trong khi nướng đối tượng \"%s\"" + + +msgid "Bake directory of object %s, modifier %s is empty, setting default path" +msgstr "Thư mục nướng của đối tượng %s, bộ điều chỉnh %s là trống rỗng, đặt đường dẫn mặc định" + + +msgid "Path conflict: %d caches set to path %s" +msgstr "Xung đột trong đường dẫn xảy ra: %d bộ nhớ đệm đã được đặt vào đường dẫn %s" + + +msgid "Failed to remove metadata directory %s" +msgstr "Không xóa được thư mục siêu dữ liệu %s" + + +msgid "Failed to remove blobs directory %s" +msgstr "Không xóa được thư mục Viên Tròn (blobs) %s" + + +msgid "File has to be saved" +msgstr "Tập tin phải được lưu đã" msgid "Skipped some collections because of cycle detected" -msgstr "Đã bỏ qua vài sưu tập vì có phát hiện chu trình" +msgstr "Bỏ qua một số bộ sưu tập bởi vì đã phát hiện có sự tuần hoàn vòng tròn xảy ra" msgid "Active object contains no collections" -msgstr "Vật thể hoạt động không sở hữu sưu tập" +msgstr "Đối tượng đang hoạt động không có chứa bộ sưu tập nào cả" msgid "Could not add the collection because it is overridden" -msgstr "Không thể thêm vào sưu tập vì nó đang bị vượt quyền" +msgstr "Không thể thêm bộ sưu tập bởi vì nó đã được vượt quyền" msgid "Could not add the collection because it is linked" -msgstr "Không thể thêm vào sưu tập vì nó được liên kết." +msgstr "Không thể thêm bộ sưu tập bởi vì nó được kết nối" msgid "Could not add the collection because of dependency cycle detected" -msgstr "Không thể thêm sưu tập vì có phát hiện chu trình nhờ nhau" +msgstr "Không thể thêm bộ sưu tập bởi vì đã phát hiện ra có sự tuần hoàn vòng tròn xảy ra đối với các phần tử phụ thuộc" msgid "Cannot remove an object from a linked or library override collection" -msgstr "Không thể xóa một vật thể từ một sưu tập được kết nối hoặc đồ vượt quyền thư viện" +msgstr "Không thể xóa một đối tượng khỏi một bộ sưu tập liên kết hoặc một bộ sưu tập vượt quyền thư viện" msgid "Cannot unlink a library override collection which is not the root of its override hierarchy" -msgstr "Không thể gỡ kết nối của một sưu tập đồ vượt quyền không phải là rễ của tầng bậc đồ vượt quyền của nó" +msgstr "Không thể ngắt liên bộ sưu tập vượt quyền thư viện không phải là gốc của hệ thống thứ bậc vượt quyền của nó được" msgid "Add IK" -msgstr "Thêm IK" +msgstr "Thêm IK (Nghịch Động Học)" msgid "To Active Bone" -msgstr "Cho Xương Hoạt Động" +msgstr "Tới Xương đang Hoạt Động" msgid "To Active Object" -msgstr "Cho Vật Thể Hoạt Đông" +msgstr "Tới Đối Tượng đang Hoạt Động" msgid "To New Empty Object" -msgstr "Cho Vật Thể Rỗng Mới" +msgstr "Tới Đối Tượng Rỗng Mới" msgid "Without Targets" -msgstr "Không Có Mục Tiêu" +msgstr "Không có Mục Tiêu" msgid "Could not find constraint data for Child-Of Set Inverse" -msgstr "Không tìm được dữ liệu ràng buộc của Con Cái-Của Đặt Nghịch" +msgstr "Không tìm thấy dữ liệu ràng buộc cho thao tác Đảo Nghịch của Con Cái Của" msgid "Child Of constraint not found" -msgstr "Không tìm được được ràng buộc Con Cái Của" +msgstr "Không tìm thấy ràng buộc Con Cái Của" msgid "Follow Path constraint not found" -msgstr "Không tìm được ràng buộc Theo Đường Đi" +msgstr "Không tìm thấy Ràng Buộc Đường Dẫn" msgid "Path is already animated" -msgstr "Đường đi có hoạt hình rồi" +msgstr "Đường dẫn đã được hoạt họa rồi" msgid "Could not find constraint data for ObjectSolver Set Inverse" -msgstr "Không tìm được dữ liệu ràng buộc của TrìnhGiảiNghiệmVậtThể Đặt Đảo Nghịch" +msgstr "Không tìm thấy dữ liệu ràng buộc cho thao tác Đặt Đảo Ngược của Trình Giải Nghiệm Đối Tượng (ObjectSolver Set Inverse)" msgid "Applied constraint was not first, result may not be as expected" -msgstr "Ràng buộc được áp dụng không phải là thứ nhất, kết qủa có lẽ theo ý định" +msgstr "Ràng buộc được áp dụng không phải là cái đầu tiên. Kết quả có thể không được như mong đợi đâu nhé" msgid "No constraints for copying" -msgstr "Không có ràng buộc để chép" +msgstr "Không có ràng buộc nào để sao chép cả" msgid "No active bone with constraints for copying" -msgstr "Không có xương hoạt động có ràng buộc để chép" +msgstr "Không có xương đang hoạt động có ràng buộc cho chép" msgid "No active pose bone to add a constraint to" -msgstr "Không có xương hoạt động để thêm ràng buộc" +msgstr "Không có xương tư thế đang hoạt động nào để thêm ràng buộc vào cả" msgid "No active object to add constraint to" -msgstr "Không có vật thể hoạt động để thêm ràng buộc" +msgstr "Không có đối tượng đang hoạt động để thêm ràng buộc vào được" msgid "Must have an active bone to add IK constraint to" -msgstr "Phải có xương hoạt động để thêm ràng buộc IK" +msgstr "Phải có xương đang hoạt động mới có thể thêm ràng buộc IK vào được" msgid "Bone already has an IK constraint" -msgstr "Xương có ràng buộc IK rồi" +msgstr "Xương đã có ràng buộc IK (nghịch động học) rồi" msgid "Removed constraint: %s" -msgstr "Đã xóa ràng buộc: %s" +msgstr "Ràng buộc đã xóa: %s" msgid "Applied constraint: %s" -msgstr "Đã áp dụng ràng buộc: %s" +msgstr "Ràng buộc đã được áp dụng: %s" msgid "Copied constraint: %s" -msgstr "Đã chép ràng buộc: %s" +msgstr "Ràng buộc đã được sao chép: %s" msgid "Cannot edit library data" -msgstr "Không thể biên tập dữ liệu thư viện" +msgstr "Không thể biên soạn dữ liệu thư viện" msgid "Cannot edit constraints coming from linked data in a library override" -msgstr "Không thể biên tập ràng buộc đến từ dữ liệu được liên kết trong một đồ vượt quyền thư viện" +msgstr "Không thể biên soạn các ràng buộc đến từ dữ liệu kết nối nằm trong một trường hợp vượt quyền thư viện" msgid "No other bones are selected" -msgstr "Không có xương nào khác được chọn" +msgstr "Không có xương nào khác được chọn cả" msgid "No selected object to copy from" -msgstr "Không có vật thể được chọn để chép đồ từ nó" +msgstr "Không có đối tượng nào được chọn để sao chép từ đấy sang cả" msgid "No other objects are selected" -msgstr "Không có vật thể nào khác được chọn" +msgstr "Không có đối tượng nào khác được chọn cả" msgid "Transfer data layer(s) (weights, edge sharp, etc.) from selected meshes to active one" -msgstr "Truyền (các) lớp dữ liệu (quyền lượng, cạnh bén, v.v.) từ các mạng lưới hoạt động đến mạng lưới hoạt động" +msgstr "Thuyên chuyển các tầng dữ liệu (trọng lượng, độ sắc nhọn của cạnh, v.v.) từ khung lưới lựa chọn sang khung lưới đang hoạt động" msgid "Operator is frozen, changes to its settings won't take effect until you unfreeze it" -msgstr "Thao tác bị 'đóng băng', không thực hành sự thay đổi trước bạn 'tan băng' nó" +msgstr "Thao tác bị phong tỏa, các thay đổi trong sắp đặt của nó sẽ không có tác động gì trước khi bạn phóng thích nó đã" msgid "Skipping object '%s', linked or override data '%s' cannot be modified" -msgstr "Đang bỏ qua vật thể '%s', dữ liệu được liên kết hay thay hế '%s' không thể sửa đổi" +msgstr "Bỏ qua đối tượng '%s', dữ liệu kết nối hoặc vượt quyền '%s' không thể sửa đổi được" msgid "Skipping object '%s', data '%s' has already been processed with a previous object" -msgstr "Đang bỏ qua vật thể '%s', dữ liệu '%s' đã được xử lỳ bằng một vật thể trước" +msgstr "Bỏ qua đối tượng '%s', dữ liệu '%s' đã được xử lý với một đối tượng trước rồi" + + +msgid "Clear motion paths of selected objects" +msgstr "Xóa các đường chuyển động của các đối tượng đã được chọn" + + +msgid "Clear motion paths of all objects" +msgstr "Xóa các đường chuyển động của toàn bộ các đối tượng" msgid "Can't edit linked mesh or curve data" -msgstr "Không thể biên tập dữ liệu mạng lưới hay đường cong được liên kết" +msgstr "Không thể biên soạn khung lưới kết nối hoặc dữ liệu đường cong được" msgid "No collection selected" -msgstr "Chưa chọn sưu tập nào" +msgstr "Không có bộ sưu tập nào được chọn cả" msgid "Unexpected error, collection not found" -msgstr "Lỗi lầm bất ngờ. không tìm được sưu tập" +msgstr "Lỗi không lường trước được đã xảy ra, không tìm thấy bộ sưu tập" + + +msgid "Cannot add objects to a library override or linked collection" +msgstr "Không thể cho thêm đối tượng vào một vượt quyền thư viện hoặc bộ sưu tập liên kết được" msgid "No objects selected" -msgstr "Không chọn được vật thể nào" +msgstr "Không có đối tượng nào được chọn cả" msgid "%s already in %s" -msgstr "%s đang ở trong %s rồi" +msgstr "%s đã có trong %s" + + +msgid "%s linked to %s" +msgstr "%s được kết nối với %s" + + +msgid "Objects linked to %s" +msgstr "Các đối tượng được kết nối với %s" + + +msgid "%s moved to %s" +msgstr "%s đã chuyển đến %s" + + +msgid "Objects moved to %s" +msgstr "Các đối tượng được chuyển đến %s" msgid "Only one modifier of this type is allowed" -msgstr "Chỉ được dùng một bộ điều chỉnh của loại này" +msgstr "Chỉ cho phép một bộ điều chỉnh của thể loại này mà thôi" msgid "Cannot move modifier beyond the end of the stack" -msgstr "Không thể di chuyển bộ điều chỉnh ra ngoài kết thúc của xếp đống" +msgstr "Không thể di chuyển bộ điều chỉnh ra ngoài ngăn xếp cuối cùng" msgid "Modifier is disabled, skipping apply" -msgstr "Bộ điều chỉnh bị tắt, đang bỏ qua áp dụng" +msgstr "Bộ điều chỉnh bị vô hiệu hóa, bỏ qua áp dụng" msgid "Cannot apply modifier for this object type" -msgstr "Không thể áp dụng bộ điều chỉnh cho loại vật thể này" +msgstr "Không thể áp dụng bộ điều chỉnh đối với loại đối tượng này" msgid "Modifiers cannot be applied in paint, sculpt or edit mode" -msgstr "Không thể áp dụng bộ điều chỉnh trong chế độ sơn, khắc, hay biên tập" +msgstr "Không thể áp dụng các bộ điều chỉnh trong chế độ sơn, điêu khắc hoặc trong Chế Độ Biên Soạn" msgid "Modifiers cannot be applied to multi-user data" -msgstr "Không thể áp dụng bộ điều chỉnh với dữ liệu đa người dùng" +msgstr "Không thể áp dụng các bộ điều chỉnh vào dữ liệu đa người dùng" msgid "Applied modifier was not first, result may not be as expected" -msgstr "Bộ điều chỉnh áp dụng không phải là thứ nhất, kết qủa có lẽ không hợp ý" +msgstr "Bộ điều chỉnh được áp dụng không phải là cái đầu tiên, kết quả có thể sẽ không được như điều mong đợi" msgid "Modifiers cannot be added to object '%s'" -msgstr "Không thể thêm bộ điều chỉnh với vật thể '%s'" +msgstr "Không thể thêm bộ điều chỉnh vào đối tượng '%s'" msgid "Modifier '%s' not in object '%s'" -msgstr "Bộ điều chỉnh '%s' không có trong vật thể '%s'" +msgstr "Bộ điều chỉnh '%s' không nằm trong đối tượng '%s'" msgid "Removed modifier: %s" -msgstr "Được xóa cự sửa đổi: %s" +msgstr "Đã Xóa Bộ Điều Chỉnh: %s" msgid "Applied modifier: %s" -msgstr "Áp dụng bộ điều chỉnh: %s" +msgstr "Đã áp dụng bộ điều chỉnh: %s" msgid "Source object '%s' is not a grease pencil object" -msgstr "Vật thể nguồn '%s' không phải là vật thể bút sáp" +msgstr "Đối tượng nguồn '%s' không phải là một đối tượng bút chì dầu" msgid "Destination object '%s' is not a grease pencil object" -msgstr "Vật thể địch '%s' không phải là vật thể bút sáp" +msgstr "Đối tượng đích '%s' không phải là một đối tượng bút chì dầu" msgid "Cannot edit modifiers coming from linked data in a library override" -msgstr "Không thể biên tập bộ điều chỉnh từ dữ liệu được liên kết trong một đồ vượt quyền thư viện" +msgstr "Không thể biên soạn bộ điều chỉnh đến từ dữ liệu kết nối nằm trong một đối tượng vượt quyền thư viện" msgid "No supported objects were selected" -msgstr "Chưa được chọn vật thể nào được hỗ trợ" +msgstr "Không có đối tượng hỗ trợ nào đã được chọn cả" msgid "Requires selected vertices or active vertex group" -msgstr "Cần có các đỉnh được chọn hay nhóm đỉnh hoạt động" +msgstr "Đòi hỏi phải có các điểm đỉnh đã được chọn hoặc nhóm điểm đỉnh đang hoạt động" msgid "Armature has no active object bone" -msgstr "Cốt không có xương vật thể hoạt động" +msgstr "Khung Cốt không có xương đối tượng hoạt động" msgid "Cannot add hook with no other selected objects" -msgstr "Không thể thêm móc nếu không có vật thể khác được chọn" +msgstr "Không thể thêm móc/mắc/gài nếu không có đối tượng nào khác được chọn" msgid "Cannot add hook bone for a non armature object" -msgstr "Không thể thêm xương móc cho vật thể không phải là cốt" +msgstr "Không thể thêm xương móc/mắc/gài vào đối tượng không phải là khung cốt" msgid "Could not find hook modifier" -msgstr "Không tìm được bộ điều chỉnh móc" +msgstr "Không tìm thấy bộ điều chỉnh móc/mắc/gài" msgid "Unable to execute '%s', error changing modes" -msgstr "Không thể thực hành '%s', sai lầm đổi chế độ" +msgstr "Không thể thi hành '%s', lỗi xảy ra trong khi đổi chế độ" msgid "Apply modifier as a new shapekey and keep it in the stack" -msgstr "Áp dụng bộ điều chỉnh để làm một mẫu dạng và giữ nó trong xếp đống" +msgstr "Áp dụng bộ điều chỉnh thành hình mẫu mới, đồng thời duy trì nó trong ngăn xếp" msgid "Cannot move above a modifier requiring original data" -msgstr "Không thể di chuyển trên một bộ điều chỉnh cần dữ liệu ban đầu" +msgstr "Không thể di chuyển lên trên bộ điều chỉnh đòi hỏi dữ liệu gốc" msgid "Cannot move modifier beyond the start of the list" -msgstr "Không thể di chuyển bộ điều chỉnh ra ngoài bắt đầu của danh sách" +msgstr "Không thể di chuyển bộ điều chỉnh ra ngoài ngăn xếp đầu tiên của danh sách" msgid "Cannot move beyond a non-deforming modifier" -msgstr "Không thể di chuyển ngoài bộ điều chỉnh không méo hóa" +msgstr "Không thể di chuyển quá bộ điều chỉnh không có chức năng biến dạng" msgid "Cannot move modifier beyond the end of the list" -msgstr "Không thể di chuyển bộ điều chỉnh ra ngoài kết thúc của danh sách" +msgstr "Không thể di chuyển bộ điều chỉnh ra ngoài ngăn xếp cuối cùng của danh sách" + + +msgid "Evaluated geometry from modifier does not contain a mesh" +msgstr "Hình học đã tính toán đến từ bộ điều chỉnh không có chứa một khung lưới" msgid "Only deforming modifiers can be applied to shapes" -msgstr "Chỉ bộ điều chỉnh méo hóa có thể áp dụng với hình dạng" +msgstr "Chỉ những bộ điều chỉnh dùng để biến dạng mới có thể được áp dụng vào các hình dạng mà thôi" msgid "Modifier is disabled or returned error, skipping apply" -msgstr "Bộ điều chỉnh bị tắt hay có sai lầm, đang bỏ qua áp dụng nó" +msgstr "Bộ điều chỉnh hoặc là bị vô hiệu hóa, hoặc có lỗi xảy ra. Bỏ qua áp dụng" msgid "Modifier cannot be applied to a mesh with shape keys" -msgstr "Không thế áp dụng bộ điều chỉnh với mạng lưới có mẫu dạng" +msgstr "Không thế áp dụng bộ điều chỉnh với khung lưới có hình mẫu" msgid "Multires modifier returned error, skipping apply" -msgstr "Bộ điều chỉnh đa độ phân giải có sai lầm, đang bỏ qua áp dụng nó" +msgstr "Bộ điều chỉnh đa phân giải báo lỗi, bỏ qua áp dụng" + + +msgid "Cannot apply constructive modifiers on curve. Convert curve to mesh in order to apply" +msgstr "Không thể áp dụng bộ điều chỉnh mang tính xây dựng trên đường cong được. Chuyển đổi đường cong thành khung lưới để áp dụng nhé" msgid "Applied modifier only changed CV points, not tessellated/bevel vertices" -msgstr "Bộ điều chỉnh thì áp dụng chỉ đổi được điểm đỉnh đường cong, không phải đỉnh tam giác hóa/cạnh tròn" +msgstr "Bộ điều chỉnh được áp dụng chỉ biến đổi các Điểm Đỉnh của Đường Cong mà thôi, không tác động đến các điểm đỉnh phân lưới tổ ong/bo tròn/vát" msgid "Constructive modifiers cannot be applied" -msgstr "Không thể áp dụng bộ điều chỉnh xây dựng" +msgstr "Bộ điều chỉnh có tính xây dựng không thể áp dụng được" msgid "Evaluated geometry from modifier does not contain curves" -msgstr "hình dạng được tính toán từ bộ điều chỉnh không chứa đường cong nào" +msgstr "Hình học đã tính toán đến từ bộ điều chỉnh không chứa các đường cong" + + +msgid "Evaluated geometry from modifier does not contain a point cloud" +msgstr "Hình học đã tính toán đến từ bộ điều chỉnh không có chứa một đám mây điểm" msgid "Modifiers cannot be applied in edit mode" -msgstr "Không thể áp dụng bộ điều chỉnh trong chế độ biên tập" +msgstr "Không thể áp dụng bộ điều chỉnh trong Chế Độ Biên Soạn được" msgid "Constructive modifier cannot be applied to multi-res data in sculpt mode" -msgstr "Cụ xây dựng không thể áp dụng với dữ liệu đa phân giải trong chế độ khắc" +msgstr "Bộ điều chỉnh có tính xây dựng không thể áp dụng được vào dữ liệu đa phân giải trong chế độ điêu khắc" msgid "Reshape can work only with higher levels of subdivisions" -msgstr "Hình dạng lại chỉ được dùng với mức phân hóa cao hơn" +msgstr "Đổi hình dạng chỉ hoạt động với mức phân hóa cao hơn" msgid "Second selected mesh object required to copy shape from" -msgstr "Cần chọn vật thể thứ hai để làm nguồn chép hình dạng" +msgstr "Cần phải có đối tượng thứ hai đã được chọn để sao chép hình dạng từ đó" msgid "Objects do not have the same number of vertices" -msgstr "Số lượng đỉnh vật thể không giống nhau" +msgstr "Đối tượng không có số lượng điểm đỉnh tương đồng" msgid "No valid subdivisions found to rebuild a lower level" -msgstr "Đã không tìm được các phân hóa hợp lệ để xây dựng lại một tầng thấp hơn" +msgstr "Tìm thấy rằng sự phân chia là không hợp lệ đối với việc tái dựng các tầng thấp hơn" + + +msgid "No valid subdivisions found to rebuild lower levels" +msgstr "Không tìm thấy có sự phân hóa hợp lệ nào để tái dựng lại các cấp bậc thấp hơn được" msgid "Modifier is disabled" -msgstr "Bộ điều chỉnh bị tắt" +msgstr "Bộ điều chỉnh đã bị vô hiệu hóa" msgid "Object '%s' does not support %s modifiers" -msgstr "Vật thể '%s' không hỗ trợ cuđ sửa đổi %s" +msgstr "Đối tượng '%s' không hỗ trợ các bộ điều chỉnh %s" msgid "Modifier can only be added once to object '%s'" -msgstr "Chỉ có thể dùng bộ điều chỉnh một lần với vật thể '%s'" +msgstr "Bộ điều chỉnh chỉ có thể được thêm vào đối tượng '%s' một lần mà thôi" msgid "Copying modifier '%s' to object '%s' failed" -msgstr "Chép bộ điều chỉnh '%s' qua đến vậ thể '%s' bị thất bại" +msgstr "Việc sao chép bộ điều chỉnh '%s' sang đối tượng '%s' đã bị thất bại" msgid "Modifier '%s' was not copied to any objects" -msgstr "Bộ điều chỉnh '%s' không được chép đến bất cứ vật thể nàu" +msgstr "Bộ điều chỉnh '%s' đã không được sao chép sang bất cứ đối tượng nào cả" msgid "%d new levels rebuilt" -msgstr "%d tầng mới được xây dựng lại" +msgstr "%d tầng mới được tái dựng" msgid "Mesh '%s' has no skin vertex data" -msgstr "Mạng lưới '%s' không có dữ liệu đỉnh da" +msgstr "Khung lưới '%s' không có dữ liệu điểm đỉnh da" msgid "This modifier operation is not allowed from Edit mode" -msgstr "Không cho dùng thao tác bộ điều chỉnh này trong Chế Độ Biên Tập" +msgstr "Thao tác của bộ điều chỉnh này không được phép thi hành trong Chế Độ Biên Soạn" msgid "Modifiers cannot be applied on override data" -msgstr "Không thể áp dụng bộ điều chỉnh với dữ liệu vượt quyền" +msgstr "Bộ điều chỉnh không thể áp dụng được đối với dữ liệu vượt quyền (override data)" msgid "No selected object is active" -msgstr "Không có vật thể nào được chọn là vật thể hoạt động" +msgstr "Không có đối tượng được chọn nào là đang hoạt động cả" msgid "Object type of source object is not supported" -msgstr "Không hổ trợ loại vật thể của vật thể nguồn" +msgstr "Thể loại đối tượng của đối tượng nguồn hiện không được hỗ trợ" msgid "Set Parent To" -msgstr "Đặt Phụ Huynh Đến" +msgstr "Đặt Làm Phụ Huynh Cho" msgid "Object (Keep Transform)" -msgstr "Vật Thể (Giữ Nguyên Biến Hóa)" +msgstr "Đối Tượng (Giữ Nguyên Biến Hóa)" msgid "Object (Without Inverse)" -msgstr "Vật Thể (Không Có Đảo Nghịch)" +msgstr "Đối Tượng (Không Đảo Nghịch)" msgid "Object (Keep Transform Without Inverse)" -msgstr "Vật Thể (Giữ Biến Hóa Không Có Đảo Nghịch)" +msgstr "Đối Tượng (Giữ Nguyên Biến Hóa mà Không Đảo Nghịch)" msgid "Drop %s on %s (slot %d, replacing %s)" @@ -110014,120 +122073,164 @@ msgid "Drop %s on %s (slot %d)" msgstr "Thả %s trên %s (khe %d)" +msgid "Add modifier with node group \"%s\" on object \"%s\"" +msgstr "Cho thêm bộ điều chỉnh với nhóm nút \"%s\" trên đối tượng \"%s\"" + + msgid "Select either 1 or 3 vertices to parent to" -msgstr "Chọn 1 hay 3 đỉnh để làm phụ huynh" +msgstr "Chọn 1 hoặc 3 điểm đỉnh để phụ huynh chúng" msgid "Loop in parents" -msgstr "Lắp vòng trong phụ huynh" +msgstr "Lặp vòng phụ huynh" msgid "No active bone" -msgstr "Không có xương hoạt động" +msgstr "Không có xương nào đang hoạt động cả" msgid "Not enough vertices for vertex-parent" -msgstr "Không đủ đỉnh cho phụ huynh-đỉnh" +msgstr "Không có đủ số điểm đỉnh cho điểm đỉnh phụ huynh" msgid "Operation cannot be performed in edit mode" -msgstr "Thao tác không thể thực hành trong chế độ biên tập" +msgstr "Thao tác không thể thi hành được trong Chế Độ Biên Soạn" msgid "Could not find scene" -msgstr "Không tìm được cảnh" +msgstr "Không tìm thấy cảnh" msgid "Cannot link objects into the same scene" -msgstr "Không thể liên kết vật thể trong cùng cảnh" +msgstr "Không thể liên kết đối tượng vào cùng một cảnh" msgid "Cannot link objects into a linked scene" -msgstr "Không thể liên kết vật thể trong một cảnh được liên kết" +msgstr "Không thể liên kết đối tượng vào một cảnh kết nối" msgid "Skipped editing library object data" -msgstr "Đã bỏ qua biên tập dữ liệu vật thể thư viện" +msgstr "Bỏ qua việc biên soạn dữ liệu đối tượng của thư viện" msgid "Orphan library objects added to the current scene to avoid loss" -msgstr "Vật thể thư viện mồ côi được thêm vào cảnh hiện tại để không bị mất" +msgstr "Đối tượng thư viện mồ côi đã được thêm vào cảnh hiện tại để tránh mất mát" msgid "Cannot make library override from a local object" -msgstr "Không thể tạo vượt quyền thư viện từ một vật thể điạ phương" +msgstr "Không thể vượt quyền thư viện từ một đối tượng cục bộ" + + +msgid "The node group must have a geometry output socket" +msgstr "Nhóm nút phải có ổ cắm đầu ra hình học" + + +msgid "The first output must be a geometry socket" +msgstr "Đầu ra đầu tiên phải là một ổ cắm hình học" + + +msgid "Node group must be a geometry node tree" +msgstr "Nhóm nút phải là một cây nút hình học" + + +msgid "Could not add geometry nodes modifier" +msgstr "Không thể cho thêm bộ điều chỉnh nút hình học" msgid "Incorrect context for running object data unlink" -msgstr "Bối cảnh không đúng cho chạy gỡ liên kết dữ liệu vật thể" +msgstr "Ngữ cảnh không đúng để thi hành ngắt kết nối dữ liệu đối tượng" msgid "Can't unlink this object data" -msgstr "Không thể gỡ liên kết dữ liệu vật hể này" +msgstr "Không thể ngắt kết nối dữ liệu đối tượng này" msgid "Collection '%s' (instantiated by the active object) is not overridable" -msgstr "Không thể vượt quyền cho sưu Tập '%s' (được thực thể hóa bằng vật thể hoạt động)" +msgstr "Không thể vượt quyền bộ sưu tập '%s' (được thực thể hóa thành bởi đối tượng đang hoạt động) được" msgid "Could not find an overridable root hierarchy for object '%s'" -msgstr "Không thể tìm được tầng bậc rễ vượt quyền cho vật thể '%s'" +msgstr "Không tìm thấy hệ thống thứ bậc có thể vượt quyền cho đối tượng '%s'" + + +msgid "Too many potential root collections (%d) for the override hierarchy, please use the Outliner instead" +msgstr "Quá nhiều bộ sưu tập gốc(%d) có tiềm năng cho hệ thống thứ bậc vượt quyền, xin vui lòng sử dụng Mục Lục (Outliner) thay vì" msgid "Move the mouse to change the voxel size. CTRL: Relative Scale, SHIFT: Precision Mode, ENTER/LMB: Confirm Size, ESC/RMB: Cancel" -msgstr "Di chuyển chuột cho đổi cỡ thước thể tích tử. CTRL: Phóng To Tương Đối, SHIFT: Chế Độ Độ Chính Xác, ENTER/NCT: Xác Nhận Cỡ Thước, ESC/NCP: Hủy" +msgstr "Di chuyển chuột để thay đổi kích thước thể tích tử. CTRL: Tỷ Lệ Tương Đối, SHIFT: Chế Độ Chính Xác, ENTER / LMB: Xác Nhận Kích Thước, ESC / RMB: Hủy" msgid "Voxel remesher cannot run with a voxel size of 0.0" -msgstr "Bộ mạng lưới lại thể tích tử không thể chạy nếu có cỡ thước thể tích tử = 0.0" +msgstr "Trình kiến tạo lại thể tích tử không thể hoạt động khi kích thước của thể tích tử bằng 0,0" msgid "Voxel remesher failed to create mesh" -msgstr "Chế tạo mạng lưới bởi bộ mạng lưới lại thể tích tử bị thất bại" +msgstr "Trình kiến tạo lại thể tích tử thất bại trong việc kiến tạo khung lưới" + + +msgid "The remesher cannot work on linked or override data" +msgstr "Trình kiến tạo lại khung lưới không thể hoạt động trên dữ liệu đã được kết nối hoặc vượt quyền" msgid "The remesher cannot run from edit mode" -msgstr "Bộ mạng lưới lại không thể chạy trong chế độ biên tập" +msgstr "Trình kiến tạo lại khung lưới không thể hoạt động được trong chế độ biên soạn" msgid "The remesher cannot run with dyntopo activated" -msgstr "Bộ mạng lưới lại không thể chạy khi tô pô động lý đang hoạt động" +msgstr "Trình kiến tạo lại khung lưới không thể hoạt động được nếu cấu trúc động (dyntopo) được kích hoạt" msgid "The remesher cannot run with a Multires modifier in the modifier stack" -msgstr "Bộ mạng lưới lại không thể chạy khi có một bộ điều chỉnh Đa Độ Phân Giải trong xếp đống bộ điều chỉnh" +msgstr "Trình kiến tạo lại khung lưới không thể hoạt động khi bộ điều chỉnh Đa Phân Giải (Multires) cũng nằm trong ngăn xếp bộ điều chỉnh" + + +msgid "QuadriFlow: Remeshing canceled" +msgstr "Luồng Tứ Giác Hóa: Kiến tạo lại khung lưới" + + +msgid "QuadriFlow: The mesh needs to be manifold and have face normals that point in a consistent direction" +msgstr "Luồng Tứ Giác Hóa: Khung Lưới phải là đa tạp và có các pháp tuyến Mặt chỉ theo một hướng nhất quán" + + +msgid "QuadriFlow: Remeshing completed" +msgstr "Luồng Tứ Giác Hóa: Đã hoàn thành kiến tạo lại khung lưới" + + +msgid "QuadriFlow: Remeshing failed" +msgstr "Luồng Tứ Giác Hóa: Kiến tạo lại khung lưới bị thất bại" msgid "Select Collection" -msgstr "Chọn Sưu Tập" +msgstr "Lựa Chọn Bộ Sưu Tập" msgid "No active object" -msgstr "Không có vật thể hoạt động" +msgstr "Không có đối tượng đang hoạt động" msgid "Use another Keying Set, as the active one depends on the currently selected objects or cannot find any targets due to unsuitable context" -msgstr "Dùng một Tập Bứa Ảnh Mẫu khác, vì tập bức ảnh mẫu hoạt động nhờ các vật thể hiện tại được chọn hay không tìm được mục tiêu nào vì bối cảnh không phù hợp" +msgstr "Dùng một Bộ Hình Mẫu khác, vì cái đang hoạt động phụ thuộc vào những đối tượng hiện đang được chọn, hoặc do không thể tìm thấy một mục tiêu nào vì ngữ cảnh không phù hợp" msgid "Active object must be a light" -msgstr "Vật thể hoạt động phải là một cái đèn" +msgstr "Đối tượng đang hoạt động phải là một nguồn sáng/đèn" msgid "Only one Effect of this type is allowed" -msgstr "Chỉ cho một loại của Hiệu Ứng này" +msgstr "Chỉ duy một Hiệu Ứng thuộc thể loại này là được phép mà thôi" msgid "Cannot move effect beyond the end of the stack" -msgstr "Không thể di chuyển hiệu ứnh ra ngoài xếp đống" +msgstr "Không thể di chuyển ảnh hưởng ra ngoài ngăn xếp cuối cùng" msgid "Effect cannot be added to object '%s'" -msgstr "Không thể thêm hiệu ứng với vật thể '%s'" +msgstr "Hiệu ứng không thể thêm vào đối tượng '%s'" msgid "Effect '%s' not in object '%s'" -msgstr "Hiệu ứng '%s' không có trong vật thể '%s'" +msgstr "Hiệu ứng '%s' không có trong đối tượng '%s'" msgid "Removed effect: %s" @@ -110135,195 +122238,291 @@ msgstr "Đã xóa hiệu ứng: %s" msgid "Cannot edit shaderfxs in a library override" -msgstr "Không thể biên tập hiệu ứng bộ tô sắc trong một đồ vượt quyền thư viện" +msgstr "Không thể biên soạn shaderfxs trong một trường hợp vượt quyền thư viện được" msgid "Object type is not supported" -msgstr "Không hổ trợ loại vật thể" +msgstr "Thể loại đối tượng là loại không được hỗ trợ" msgid "Cannot edit library or override data" -msgstr "Không thể biên tập dữ liệu thư viện hoặc đồ vượt quyền" +msgstr "Không thể biên soạn dữ liệu thư viện hoặc dữ liệu vượt quyền" msgid "Cannot edit shaderfxs coming from linked data in a library override" -msgstr "Không thể biên tập hiệu ứng bộ tô sắc từ dữ liệu được liên kết trong một đồ vượt quyền thư viện" +msgstr "Không thể biên soạn shaderfxs đến từ dữ liệu kết nối trong một trường hợp vượt quyền thư viện được" msgid "Apply current visible shape to the object data, and delete all shape keys" -msgstr "Áp dùng hình dạng hiển thị hiện tại đến dữ liệu vật thể, và xóa hết mẫu dạng" +msgstr "Áp dụng hình dạng nhìn thấy được hiện tại cho dữ liệu đối tượng và xóa toàn bộ các hình mẫu đi" msgid "Objects have no data to transform" -msgstr "Vật thể không có dữ liệu cho biến hóa" +msgstr "Đối tượng không có dữ liệu để biến hóa" msgid "Cannot apply to a multi user armature" -msgstr "Không thể áp dụng với cốt đa người dùng" +msgstr "Không thể áp dụng vào khung cốt có nhiều người dùng" msgid "Grease Pencil Object does not support this set origin option" -msgstr "Vật Thể Bút Sáp không hỗ trợ tùy chọn cho đặt gốc tọa độ này" +msgstr "Đối Tượng Bút Chì Dầu không hỗ trợ tùy chọn đặt tọa độ gốc này" msgid "Curves Object does not support this set origin operation" -msgstr "Vật Thể Đường Cong không hỗ trợ tương tác cho đặt gốc tọa độ này" +msgstr "Đối Tượng Đường Cong không hỗ trợ thao tác đặt tọa độ gốc này" + + +msgid "Point cloud object does not support this set origin operation" +msgstr "Đối tượng đám mây điểm không hỗ trợ thao tác đặt tọa độ gốc này" + + +msgid "Text objects can only have their scale applied: \"%s\"" +msgstr "Các đối tượng văn bản thì chỉ có tỷ lệ của chúng là được áp dụng: \"%s\"" msgid "Can't apply to a GP data-block where all layers are parented: Object \"%s\", %s \"%s\", aborting" -msgstr "Không thể áp dụng với một cục dữ liệu bút sáp khi hết lớp có phụ huynh: Vật thể \"%s\", %s \"%s\", đang hủy" +msgstr "Không thể áp dụng vào khối dữ liệu Bút Chì Dầu nơi mà toàn bộ các tầng lớp đã được phụ huynh hóa: Đối Tượng \"%s\", %s \"%s\", quyết định bãi bỏ" msgid "Area Lights can only have scale applied: \"%s\"" -msgstr "Chỉ được áp dụng phóng to với Đèn Diện Tích: \"%s\"" +msgstr "Nguồn Sáng Diện Tích chỉ có thể áp dụng sự thay đổi về tỷ lệ: \"%s\"" msgid "%i object(s) not centered, %i changed:" -msgstr "%i vật thể không ở tại trung tâm, %i đã đổi:" +msgstr "%i đối tượng chưa được chỉnh về tâm, %i đã đổi:" msgid "|%i linked library object(s)" -msgstr "|%i vật thể thư viện được liên kết" +msgstr "|%i đối tượng thư viện kết nối" msgid "|%i multiuser armature object(s)" -msgstr "|%i vật thể cốt đa người dùng" +msgstr "|%i đối tượng khung cốt đa người dùng" + + +msgid "Lock all vertex groups of the active object" +msgstr "Khóa toàn bộ các nhóm điểm đỉnh của đối tượng đang hoạt động lại" + + +msgid "Lock selected vertex groups of the active object" +msgstr "Khóa các nhóm điểm đỉnh đã chọn của đối tượng đang hoạt động lại" + + +msgid "Lock unselected vertex groups of the active object" +msgstr "Khóa các nhóm đỉnh chưa được chọn của đối tượng đang hoạt động lại" + + +msgid "Lock selected and unlock unselected vertex groups of the active object" +msgstr "Khóa các nhóm đỉnh đã được chọn và mở khóa các nhóm đỉnh chưa được chọn của đối tượng đang hoạt động" + + +msgid "Unlock all vertex groups of the active object" +msgstr "Mở khóa toàn bộ các nhóm điểm đỉnh của đối tượng đang hoạt động" + + +msgid "Unlock selected vertex groups of the active object" +msgstr "Mở khóa các nhóm đỉnh đã chọn của đối tượng hoạt động" + + +msgid "Unlock unselected vertex groups of the active object" +msgstr "Mở khóa các nhóm điểm đỉnh chưa chọn của đối tượng đang hoạt động" + + +msgid "Unlock selected and lock unselected vertex groups of the active object" +msgstr "Mở khóa các nhóm điểm đỉnh đã được chọn và khóa các nhóm điểm đỉnh không được chọn của đối tượng đang hoạt động" + + +msgid "Toggle locks of all vertex groups of the active object" +msgstr "Bật/tắt khóa toàn bộ các nhóm điểm đỉnh của đối tượng hoạt động" + + +msgid "Toggle locks of selected vertex groups of the active object" +msgstr "Bật/tắt khóa các nhóm điểm đỉnh đã chọn của đối tượng hoạt động" + + +msgid "Toggle locks of unselected vertex groups of the active object" +msgstr "Bật/tắt khóa các nhóm điểm đỉnh chưa chọn của đối tượng hoạt động" + + +msgid "Toggle locks of all and invert unselected vertex groups of the active object" +msgstr "Bật/tắt khóa toàn bộ và đảo ngược các nhóm đỉnh không được chọn của đối tượng đang hoạt động" + + +msgid "Invert locks of all vertex groups of the active object" +msgstr "Đảo ngược khóa toàn bộ các nhóm điểm đỉnh của đối tượng đang hoạt động" + + +msgid "Invert locks of selected vertex groups of the active object" +msgstr "Đảo ngược khóa các nhóm điểm đỉnh đã chọn của đối tượng đang hoạt động" + + +msgid "Invert locks of unselected vertex groups of the active object" +msgstr "Đảo ngược khóa các nhóm đỉnh chưa chọn của đối tượng đang hoạt động" msgid "No vertex groups to operate on" -msgstr "Không có nhóm đỉnh để tác dụng" +msgstr "Không có nhóm điểm đỉnh nào để tiến hành cả" msgid "All groups are locked" -msgstr "Hết nhóm được khóa" +msgstr "Toàn bộ các nhóm đều bị khóa" msgid "Editmode lattice is not supported yet" -msgstr "Chưa hỗ trợ chế độ biên tập lưới rào" +msgstr "Chưa hỗ trợ lưới rào trong Chế Độ Biên Soạn" msgid "Invalid vertex group index" -msgstr "Chỉ số nhóm đỉnh không hợp lệ" +msgstr "Chỉ số nhóm điểm đỉnh không hợp lệ" msgid "Vertex group is locked" -msgstr "Nhóm đỉnh bị khóa" +msgstr "Nhóm điểm đỉnh bị khóa rồi" msgid "%d vertex weights limited" -msgstr "Được hạn chế %d quyền lượng đỉnh" +msgstr "Hạn định %d trọng lượng điểm đỉnh" msgid "Copy vertex groups to selected: %d done, %d failed (object data must support vertex groups and have matching indices)" -msgstr "Chép nhóm đỉnh đến được chọn: %d xong, %d thất bại (dữ liệu vật thể phải hỗ trợ nhóm đỉnh và có chỉ số giống)" +msgstr "Sao chép các nhóm điểm đỉnh sang các được chọn: %d làm xong, %d thất bại (dữ liệu đối tượng nhất định phải hỗ trợ các nhóm điểm đỉnh và phải có chỉ số xứng khớp mới được)" msgid "No active editable object" -msgstr "Không có vật thể có thể biên tập" +msgstr "Không có đối tượng có thể biên soạn nào đang hoạt động cả" msgid "Object type does not support vertex groups" -msgstr "Loại vật thể không hỗ trợ nhóm đỉnh" +msgstr "Thể loại đối tượng không hỗ trợ nhóm điểm đỉnh" msgid "Object type \"%s\" does not have editable data" -msgstr "Loại vật thể \"%s\" không có dữ liệu có thể biên tập" +msgstr "Thể loại đối tượng \"%s\" không có dữ liệu có thể chỉnh sửa được" msgid "Object has no vertex groups" -msgstr "Vật thể không có nhóm đỉnh" +msgstr "Đối tượng không có nhóm điểm đỉnh" msgid "Vertex select needs to be enabled in weight paint mode" -msgstr "Cần bật chọn đỉnh trong chế độ sơn quyền lượng" +msgstr "Cần phải bật khả năng lựa chọn điểm đỉnh trong chế độ sơn trọng lượng lên" + + +msgid "The active vertex group is locked" +msgstr "Nhóm điểm đỉnh đang hoạt động đã bị khóa lại rồi" msgid "Volume \"%s\" failed to load: %s" -msgstr "Nhập thể tích \"%s\" bị thất bại: %s" +msgstr "Thể tích \"%s\" không nạp được: %s" msgid "Volume \"%s\" contains points, only voxel grids are supported" -msgstr "Thể tích \"%s\" có chứa điểm, chỉ hỗ trợ đồ thị thể tích tử" +msgstr "Thể tích \"%s\" có chứa nhiều điểm chấm. Duy các khung lưới đồ thị thể tích tử là được hỗ trợ mà thôi" msgid "No frames to bake" -msgstr "Không có bức ảnh để nướng" +msgstr "Không có khung hình nào để nướng cả" msgid "Bake failed: no Dynamic Paint modifier found" -msgstr "Nướng thất bại: không tìm được bộ điều chỉnh Sơn Động Lý" +msgstr "Quá trình nướng đã bị thất bại: không tìm thấy bộ điều chỉnh Sơn Động Lực nào cả" msgid "Bake failed: invalid canvas" -msgstr "Nướng bị thất bại: mặt sơn không hợp lệ" +msgstr "Quá trình nướng đã bị thất bại: khung vẽ không hợp lệ" + + +msgid "Baking canceled!" +msgstr "Quá trình nướng bị hủy bỏ!" + + +msgid "DynamicPaint: Bake complete! (%.2f)" +msgstr "Sơn Động Lực: Nướng hoàn thành! (%.2f)" + + +msgid "DynamicPaint: Bake failed: %s" +msgstr "Sơn Động Lực: Nướng thất bại: %s" msgid "Removed %d double particle(s)" -msgstr "Đã xóa %d hạt đôi" +msgstr "Đã xóa %d hạt trùng hợp (đôi) (double particles)" msgid "No hair connected (can't connect hair if particle system modifier is disabled)" -msgstr "Không có tóc kết nối (không thể kết nối tốc nếu bộ điều chỉnh hệ thống hạt bị tắt)" +msgstr "Không có tóc nào được kết nối cả (không thể kết nối tóc nếu bộ điều chỉnh hệ thống hạt bị tắt)" msgid "Copy particle systems to selected: %d done, %d failed" -msgstr "Chép hệ thống hạt đến được chọn: %d xong, %d thất bại" +msgstr "Sao chép hệ thống hạt đến cái được chọn: %d hoàn thành, %d thất bại" msgid "Bake failed: no Fluid modifier found" -msgstr "Nướng thất bại: không tìm được bộ điều chỉnh Chất Lỏng" +msgstr "Quá trình nướng bị thất bại: không thấy có bộ điều chỉnh về Chất Lỏng (Fluid modifier)" msgid "Bake failed: invalid domain" -msgstr "Nướng bị thất bại: phạm vi không hợp lệ" +msgstr "Quá trình nướng bị thất bại: phạm vi định nghĩa (domain) không hợp lệ" msgid "Bake free failed: no Fluid modifier found" -msgstr "Xóa nướng thất bại: không tìm được bộ điều chỉnh Chất Lỏng" +msgstr "Phóng thích nướng bị thất bại: không thấy có bộ điều chỉnh về Chất Lỏng (Fluid modifier)" msgid "Bake free failed: invalid domain" -msgstr "Xóa nướng thất bại: phạm vi không hợp lệ" +msgstr "Phóng thích nướng bị thất bại: phạm vi định nghĩa (domain) không hợp lệ" msgid "Bake free failed: pending bake jobs found" -msgstr "Xóa nướng thất bại: đã phát hiện còn có công trình nướng" +msgstr "Phóng thích nướng bị thất bại: phát hiện thấy có một số qui trình nướng còn đang cần được giải quyết" msgid "Fluid: Empty cache path, reset to default '%s'" -msgstr "Chất Lỏng: Đường dẫn đệm chứa rỗng, đặt lại đến mặc định '%s'" +msgstr "Chất Lỏng: Không có đường dẫn bộ nhớ đệm vì nó trống rỗng. Hoàn lại về sắp đặt mặc định '%s'" msgid "Fluid: Could not create cache directory '%s', reset to default '%s'" -msgstr "Chất Lỏng: Không thể chế tạo đường dẫn đệm chứa '%s', đặt lại đến mặc định '%s'" +msgstr "Chất Lỏng: Không thể kiến tạo thư mục bộ nhớ đệm '%s'. Hoàn lại về sắp đặt mặc định '%s'" msgid "Fluid: Could not use default cache directory '%s', please define a valid cache path manually" -msgstr "Chất Lỏng: không được dùng đường dẫn đệm chứa mặc định '%s', làm ơn chỉ định một đường dẫn hợp lệ trực tiếp" +msgstr "Chất Lỏng: Không thể sử dụng thư mục bộ nhớ đệm mặc định '%s' được, làm ơn thủ công chỉ định một đường dẫn đến bộ nhớ đệm hợp lệ" + + +msgid "Fluid: %s complete! (%.2f)" +msgstr "Chất lỏng: %s hoàn tất! (%.2f)" + + +msgid "Fluid: %s failed: %s" +msgstr "Chất lỏng: %s thất bại: %s" + + +msgid "Fluid: %s canceled!" +msgstr "Chất lỏng: %s hủy bỏ!" msgid "Library override data-blocks only support Disk Cache storage" -msgstr "Cục dữ liệu vượt quyền thư viện chỉ hỗ trợ Đệm Chứa Đĩa" +msgstr "Các khối dữ liệu vượt quyền thư viện chỉ hỗ trợ lưu giữ Bộ Nhớ Đệm Trên Đĩa mà thôi" msgid "Linked data-blocks do not allow editing caches" -msgstr "Cục dữ liệu được liên kết không cho biên tập đệm chứa" +msgstr "Các khối dữ liệu kết nối đều sẽ không cho phép biên soạn bộ nhớ đệm" msgid "Linked or library override data-blocks do not allow adding or removing caches" -msgstr "Cục dữ liệu được liên kết hoặc cục dữ liệu vượt quyền thư viện không cho biên tập đệm chứa" +msgstr "Các khối dữ liệu kết nối hoặc vượt quyền thư viện đều không cho phép cho thêm vào hoặc xóa bỏ bộ nhớ đệm" msgid "No Rigid Body World to add Rigid Body Constraint to" -msgstr "Không có Thế Giới Thân Rắn để thêm Ràng Buộc Thân Rắn" +msgstr "Không có Thế Giới Thân Cứng nào để thêm Ràng Buộc Thân Cứng vào cả" msgid "Object has no Rigid Body Constraint to remove" -msgstr "Vật thể không có Ràng Buộc Thân Rắn để xóa" +msgstr "Đối tượng không có Ràng Buộc Thân Cứng nào để xóa cả" msgid "Object '%s' already has a Rigid Body Constraint" -msgstr "Vật thể '%s' đã có Ràng Buộc Thân Rắn rồi" +msgstr "Đối tượng '%s' đã có Ràng Buộc Thân Cứng rồi" msgid "Acrylic" @@ -110331,7 +122530,7 @@ msgstr "Acrilic" msgid "Asphalt (Crushed)" -msgstr "Nhựa Đường (Đạp)" +msgstr "Nhựa Đường (Đập Vụn)" msgid "Bark" @@ -110339,15 +122538,15 @@ msgstr "Vỏ Cây" msgid "Beans (Cocoa)" -msgstr "Đậu SôCôLa" +msgstr "Đậu (Cacao)" msgid "Beans (Soy)" -msgstr "Đậu Nạnh" +msgstr "Đậu Nành" msgid "Brick (Pressed)" -msgstr "Gạch (Ém)" +msgstr "Gạch (Nén)" msgid "Brick (Common)" @@ -110359,19 +122558,19 @@ msgstr "Gạch (Mềm)" msgid "Brass" -msgstr "Đồng Vàng" +msgstr "Đồng Thau" msgid "Bronze" -msgstr "Đầng" +msgstr "Đồng Thiếc" msgid "Carbon (Solid)" -msgstr "Cacbon (Rắn)" +msgstr "Các-bon (Đặc)" msgid "Cardboard" -msgstr "Hộp Giấy" +msgstr "Bìa Các-Tông" msgid "Cast Iron" @@ -110383,7 +122582,7 @@ msgstr "Xi Măng" msgid "Chalk (Solid)" -msgstr "Phắn (Rắn)" +msgstr "Phấn (Đặc)" msgid "Coffee (Fresh/Roast)" @@ -110391,7 +122590,7 @@ msgstr "Cà Phê (Tươi/Nướng)" msgid "Concrete" -msgstr "BêTong" +msgstr "Bê Tông" msgid "Charcoal" @@ -110407,15 +122606,15 @@ msgstr "Đồng Đỏ" msgid "Garbage" -msgstr "Rắc" +msgstr "Vụn Vặt" msgid "Glass (Broken)" -msgstr "Thủy Tinh (Bể)" +msgstr "Thủy Tinh (Vỡ)" msgid "Glass (Solid)" -msgstr "Thủy Tinh (Rắn)" +msgstr "Thủy Tinh (Đặc)" msgid "Gold" @@ -110423,23 +122622,23 @@ msgstr "Vàng" msgid "Granite (Broken)" -msgstr "Hoa Cương (Bể)" +msgstr "Đá Hoa Cương (Vỡ)" msgid "Granite (Solid)" -msgstr "Hoa Cương (Rắn)" +msgstr "Đá Hoa Cương (Đặc)" msgid "Gravel" -msgstr "Sỏi" +msgstr "Đá Răm" msgid "Ice (Crushed)" -msgstr "Nước Đá (Đạp)" +msgstr "Nước Đá (Đập Vụn)" msgid "Ice (Solid)" -msgstr "Nước Đá (Rắn)" +msgstr "Nước Đá (Đặc)" msgid "Iron" @@ -110451,19 +122650,19 @@ msgstr "Chì" msgid "Limestone (Broken)" -msgstr "Đá Vôi (Bể)" +msgstr "Đá Vôi (Vỡ)" msgid "Limestone (Solid)" -msgstr "Đá Vôi (Rắn)" +msgstr "Đá Vôi (Đặc)" msgid "Marble (Broken)" -msgstr "Đá Hoa (Bể)" +msgstr "Đá Hoa (Vỡ)" msgid "Marble (Solid)" -msgstr "Đá Hoa (Rắn)" +msgstr "Đá Hoa (Đặc)" msgid "Paper" @@ -110471,19 +122670,19 @@ msgstr "Giấy" msgid "Peanuts (Shelled)" -msgstr "Đạu Phọng (Lột Vỏ)" +msgstr "Lạc (Có Vỏ)" msgid "Peanuts (Not Shelled)" -msgstr "Đạu Phọng (Không Lột Vỏ)" +msgstr "Lạc (Bóc Vỏ)" msgid "Plaster" -msgstr "Nhựa" +msgstr "Thạch Cao" msgid "Polystyrene" -msgstr "Polystyren" +msgstr "Politiron" msgid "Rubber" @@ -110495,7 +122694,7 @@ msgstr "Bạc" msgid "Steel" -msgstr "Thếp" +msgstr "Thép" msgid "Stone" @@ -110503,7 +122702,7 @@ msgstr "Đá" msgid "Stone (Crushed)" -msgstr "Đá (Đạp)" +msgstr "Đá (Đập Vụn)" msgid "Timber" @@ -110511,35 +122710,59 @@ msgstr "Gỗ" msgid "Object has no Rigid Body settings to remove" -msgstr "Vật thể không có cài đặt Thân Rắn để xóa" +msgstr "Đối tượng không có sắp đặt về Thân Cứng để xóa" msgid "No Rigid Body World to remove" -msgstr "Không có Thế Giới thân Rắn để xóa" +msgstr "Không có Thế Giới Thân Cứng để xóa" msgid "No Rigid Body World to export" -msgstr "Không có Thế Giới Thân Rắn để xuất" +msgstr "Không có Thế Giới Thân Cứng để xuất khẩu" msgid "Rigid Body World has no associated physics data to export" -msgstr "Thế Giới Thân Rắn không có dữ liệu vật lý liên quan để xuất" +msgstr "Thế Giới Thân Cứng không có dữ liệu vật lý liên quan để xuất khẩu" + + +msgid "3D Local View " +msgstr "Góc Nhìn Cục Bộ 3D " + + +msgid "3D View " +msgstr "Góc Nhìn 3D " + + +msgid "Frame:" +msgstr "Khung Hình:" + + +msgid "Time:" +msgstr "Thời gian:" + + +msgid "Mem:%.2fM (Peak %.2fM)" +msgstr "BộNhớ:%.2fM, (Đỉnh %.2fM)" + + +msgid "Mem:%.2fM, Peak: %.2fM" +msgstr "BộNhớ:%.2fM, Đỉnh: %.2fM" msgid "Cannot write a single file with an animation format selected" -msgstr "Không thể lưu một tập tin với một định dạng hoạt hình được chọn" +msgstr "Không thể ghi tập tin với định dạng hoạt họa đã chọn" msgid "Render the viewport for the animation range of this scene, but only render keyframes of selected objects" -msgstr "Kết xuất màn chiếu cho phạm vi hoạt hình của cảnh này, nhưng chi kết xuất bức ảnh mẫu của vật thể được chọn" +msgstr "Kết xuất cổng nhìn cho phạm vi hoạt họa của cảnh này, nhưng chỉ kết xuất các khung khóa của các đối tượng đã chọn mà thôi" msgid "Render the viewport for the animation range of this scene" -msgstr "Kết xuất màn chiếu cho phạm vi hoạt hình của cảnh này" +msgstr "Kết xuất cổng nhìn cho phạm vi hoạt họa của cảnh này" msgid "Cannot use OpenGL render in background mode (no opengl context)" -msgstr "Không thể dùng kết xuất OpenGL trong chế độ chạy trong phía sau (không có bối cảnh OpenGL)" +msgstr "Không thể sử dụng kết xuất OpenGL trong chế độ chạy ngầm (không có ngữ cảnh OpenGL)" msgid "Scene has no camera" @@ -110547,67 +122770,87 @@ msgstr "Cảnh không có máy quay phim" msgid "Movie format unsupported" -msgstr "Định dạng phim không được hỗ trợ" +msgstr "Định dạng phim chưa được hỗ trợ" msgid "Failed to create OpenGL off-screen buffer, %s" -msgstr "Chế tạo đệm OpenGL ngoài màn bị thất bại, %s" +msgstr "Không kiến tạo bộ đệm OpenGL ngoại màn hình được, %s" msgid "Write error: cannot save %s" -msgstr "Sai lầm ghi: không thể lưu %s" +msgstr "Lỗi trong khi ghi: không lưu %s được" msgid "Skipping existing frame \"%s\"" -msgstr "Đang bỏ qua bức ảnh tồn tại \"%s\"" +msgstr "Bỏ qua khung hình hiện tại \"%s\"" + + +msgid "No active object, unable to apply the Action before rendering" +msgstr "Không có đối tượng nào đang hoạt động cả. Không thể áp dụng Hành Động trước khi kết xuất được" + + +msgid "Object %s has no pose, unable to apply the Action before rendering" +msgstr "Đối tượng %s không có tư thế nào cả. Không thể áp dụng Hành Động trước khi kết xuất" msgid "Unable to remove material slot in edit mode" -msgstr "Không thể xóa khe vật liệu trong chế độ biên tập" +msgstr "Không thể xóa khe nguyên vật liệu trong Chế Độ Biên Soạn" msgid "Lightcache cannot allocate resources" -msgstr "Đệm chứa ánh sáng không thể giàng được tài nguyên" +msgstr "Bộ đệm nhớ ánh sáng không thể phân phối tài nguyên" msgid "No active lineset and associated line style to manipulate the modifier" -msgstr "Không có tập đường hoạt động và phong cách đường liên quan để vận dụng bộ điều chỉnh" +msgstr "Không có bộ đường nét nào đang hoạt động và không có phong cách đường nét nào liên quan với nó để điều khiển bộ điều chỉnh được" msgid "The active lineset does not have a line style (indicating data corruption)" -msgstr "Tập đường hoạt động không có phong cách đường (nghĩa là dữ liệu bị hư)" +msgstr "Bộ đường nét đang hoạt động không có phong cách đường nét (ám chỉ dữ liệu bị hư hoại)" msgid "No active lineset to add a new line style to" -msgstr "Không có tập đường hoạt động để thêm một phong cách đường mới" +msgstr "Không có bộ đường nét nào đang hoạt động để có thể cho thêm một phong cách đường nét mới vào" msgid "Unknown line color modifier type" -msgstr "Loại bộ điều chỉnh màu đường lạ" +msgstr "Thể loại bộ điều chỉnh màu sắc của đường nét chưa được biết đến" msgid "Unknown alpha transparency modifier type" -msgstr "Loại bộ điều chỉnh độ đục chưa biết đến" +msgstr "Thể loại bộ điều chỉnh độ trong suốt của alpha chưa được biết đến" msgid "Unknown line thickness modifier type" -msgstr "Loại bộ điều chỉnh bề dày nét chưa biết đến" +msgstr "Thể loại bộ điều chỉnh độ dày đường nét chưa được biết đến" msgid "Unknown stroke geometry modifier type" -msgstr "Loại bộ điều chỉnh hình dạng chưa biết đến" +msgstr "Thể loại bộ điều chỉnh hình học của nét vẽ chưa được biết đến" msgid "The object the data pointer refers to is not a valid modifier" -msgstr "Con trỏ dữ liệu tham chiếu đến vật thể lả bộ điều chỉnh không hợp lệ" +msgstr "Đối tượng mà con trỏ dữ liệu tham chiếu đến không phải là một bộ điều chỉnh hợp lệ" msgid "No active line style in the current scene" -msgstr "Không có phong cách nét hoạt động trong cảnh hiện tại" +msgstr "Không có phong cách đường nét nào đang hoạt động trong cảnh hiện tại cả" + + +msgid "Copied material to internal clipboard" +msgstr "Đã sao chép nguyên vật liệu vào bảng nhớ tạm nội bộ rồi" + + +msgid "Cannot paste without a material" +msgstr "Không thể dán mà không có nguyên vật liệu nào cả" + + +msgid "Internal clipboard is not from a material" +msgstr "Bảng nhớ tạm nội bộ không phải là từ một nguyên vật liệu" msgid "Removed %d slots" -msgstr "Được xóa %d khe" +msgstr "Đã xóa %d khe" msgid "Blender Render" @@ -110615,155 +122858,163 @@ msgstr "Kết Xuất Blender" msgid "Failed to open window!" -msgstr "Mở cửa sổ bị thất bại!" +msgstr "Không mở cửa sổ được!" msgid "View layer '%s' could not be removed from scene '%s'" -msgstr "Lớp màn '%s' không thể xóa từ cảnh '%s'" +msgstr "Không thể xóa tầng lớp góc nhìn '%s' khỏi cảnh '%s'" + + +msgid "A narrow vertical area interferes with this operation" +msgstr "Một diện tích chiều dọc, hẹp, can thiệp cản trở hoạt động này" + + +msgid "A narrow horizontal area interferes with this operation" +msgstr "Một diện tích chiều ngang, hẹp, can thiệp cản trở hoạt động này" msgid "Join Areas" -msgstr "Kết Nối Khu Vực" +msgstr "Hội Nhập Khu Vực" msgid "Swap Areas" -msgstr "Trao Đổi Khu Vực" +msgstr "Tráo Đổi Khu Vực" msgid "Restore Areas" -msgstr "Hoàn Lại Khu Vực" +msgstr "Khôi Phục các Khu Vực" msgid "Maximize Area" -msgstr "Toàn Màn Khu Vực" +msgstr "Tối Đa Hóa Diện Tích" msgid "Full Screen Area" -msgstr "Khu Vực Toàn Màn" +msgstr "Diện Tích Toàn Màn Hình" msgid "Show Header" -msgstr "Hiện Phần Đầu" +msgstr "Hiển Thị Tiêu Đề" msgid "Show Tool Settings" -msgstr "Hiện Cài Đặt Dụng Cụ" +msgstr "Hiển Thị các Cài Đặt của Công Cụ" msgid "Show Footer" -msgstr "Hiện Phần Chân" +msgstr "Hiển Thị Chân Trang" msgid "Flip to Right" -msgstr "Lật Đến Phải" +msgstr "Lật sang Phải" msgid "Flip to Left" -msgstr "Lật Đến Trái" +msgstr "Lật sang Trái" msgid "Flip to Top" -msgstr "Lật Đến Trên" +msgstr "Đảo lên Trên Đỉnh" msgid "Flip to Bottom" -msgstr "Lật Đến Dưới" +msgstr "Đảo xuống Dưới Đáy" msgid "Blender Preferences" -msgstr "Tùy Chọn Blender" +msgstr "Cài đặt sở thích của Blender" msgid "Blender Drivers Editor" -msgstr "Trình Biên Soạn Điều Vận" +msgstr "Trình Biên Soạn các Điều Vận của Blender" msgid "Blender Info Log" -msgstr "Nhật Ký Dữ Liệu Blender" +msgstr "Nhật Ký Thông Tin của Blender" msgid "Area not found in the active screen" -msgstr "Không tìm được khu vực trong màn hoạt động" +msgstr "Không tìm thấy khu vực trong màn hình hiện đang hoạt động" msgid "Unable to close area" -msgstr "Không thể đóng khu vực" +msgstr "Không thể đóng khu vực lại được" msgid "Can only scale region size from an action zone" -msgstr "Chỉ có thể phóng to kích cỡ vùng từ khu vực hoạt động" +msgstr "Chỉ có thể đổi tỷ lệ kích thước của vùng từ địa phận hành động mà thôi" msgid "No more keyframes to jump to in this direction" -msgstr "Không còn bức ảnh mẫu nữa cho nhảy hướng này" +msgstr "Không còn khung khóa nào để nhảy tới theo hướng này" msgid "No more markers to jump to in this direction" -msgstr "Không còn ký hiệu nữa cho nhảy hướng này" +msgstr "Không còn dấu mốc nào để nhảy tới theo hướng này" msgid "Only window region can be 4-split" -msgstr "Chỉ vùng cửa sổ có thể được chẻ thành màn tư" +msgstr "Duy vùng/khu vực cửa sổ là có thể phân làm 4 mà thôi" msgid "Only last region can be 4-split" -msgstr "Chỉ vùng cuối có thể chẻ thành màn tư" +msgstr "Duy vùng/khu vực sau/cuối cùng là có thể phân làm 4 mà thôi" msgid "No fullscreen areas were found" -msgstr "Không tìm được khu vực toàn man`" +msgstr "Không tìm thấy những vùng toàn màn hình" msgid "Removed amount of editors: %d" -msgstr "Xóa được số lượng của trình biên soạn: %d" +msgstr "Lượng các bộ biện soạn đã xóa: %d" msgid "Only supported in object mode" -msgstr "Chỉ được hỗ trợ trong chế độ vật thể" +msgstr "Chỉ được hỗ trợ ở chế độ đối tượng mà thôi" msgid "expected a view3d region" -msgstr "định có một vùng màn 3D" +msgstr "dự kiến phải có một vùng khung nhìn 3D" msgid "expected a timeline/animation area to be active" -msgstr "Định có vùng thời biểu/hoạt hình được hoạt động" +msgstr "dự kiến phải có một khoảng lịch trình thời gian/hoạt họa đang hoạt động" msgid "Context missing active object" -msgstr "Bối cảnh đang thiếu vật thể hoạt động" +msgstr "Ngữ cảnh thiếu đối tượng đang hoạt động" msgid "Cannot edit library linked or non-editable override object" -msgstr "Không thể biên tập thư viện được liên kết hoặc vật thể đồ vượt quyền không thể biên tập" +msgstr "Không thể biên soạn thư viện liên kết hoặc không thể chỉnh sửa được" msgid "Cannot edit hidden object" -msgstr "Không thể biên tập vật thể ẩn" +msgstr "Không thể biên soạn đối tượng ẩn giấu được" msgid "expected a view3d region & editmesh" -msgstr "định có vùng màn 3D & biên tập mạng lưới" +msgstr "dự kiến phải có một vùng khung nhìn 3D và khung lưới biên soạn" msgid "No object, or not exclusively in pose mode" -msgstr "Không có vật thể, hoặc không riêng tư trong chế độ dạng đứng" +msgstr "Không có đối tượng, hoặc không chuyên biệt ở trong chế độ tư thế" msgid "Object is a local library override" -msgstr "Vật thể là một đồ vượt quyền thư viện địa phương" +msgstr "Đối tượng là một trường hợp vượt quyền thư viện cục bộ" msgid "expected a view3d region & editcurve" -msgstr "định có một vùng màn 3D & biên tập đường cong" +msgstr "dự kiến phải có một vùng khung nhìn 3D và đường cong biên soạn" msgid "Toggling regions in the Top-bar is not allowed" -msgstr "Không cho bật/tắt vùng trong Thanh Trên" +msgstr "Không được phép bật/tắt các vùng trong thanh đỉnh (Top-bar)" msgid "Flipping regions in the Top-bar is not allowed" -msgstr "Không cho lật vùng trong Thanh Trên" +msgstr "Không được phép đảo lật các vùng trong thanh Tiêu Đề" msgid "Missing: %s" @@ -110775,144 +123026,180 @@ msgstr "Thiếu: %s.%s" msgid "No menu items found" -msgstr "Không tìm được mặt hàng danh bạ" +msgstr "Không tìm thấy trình mục" msgid "Right click on buttons to add them to this menu" -msgstr "Bấm phải trên các nút để thêm danh bạ này" +msgstr "Bấm chuột phải vào các nút để thêm chúng vào trình đơn này" msgid "Quick Favorites" -msgstr "Thích Nhất Tốc Hành" +msgstr "Trình Đơn Ưa Thích Nhanh" + + +msgid "screen" +msgstr "màn hình" msgctxt "Operator" msgid "Duplicate Current" -msgstr "Sao Chép Hiện Tại" +msgstr "Nhân Đôi cái Hiện Tại" msgid "Original surface mesh is empty" -msgstr "Mạng lưới bề mặt ban đầu là trống rỗng" +msgstr "Bề mặt gốc của khung lưới trống rỗng" msgid "Evaluated surface mesh is empty" -msgstr "Bề mặt được tính toán là trống rỗng" +msgstr "Bề mặt tính toán của khung lưới trống rỗng" msgid "Missing surface mesh" -msgstr "Thiếu mạng lưới bề mặt" +msgstr "Thiếu bề mặt khung lưới" msgid "Missing UV map for attaching curves on original surface" -msgstr "Thiếu bản đồ UV cho gắn đường cong trên bề mặt ban đầu" +msgstr "Thiếu ánh xạ UV để gắn các đường cong lên bề mặt ban đầu" msgid "Missing UV map for attaching curves on evaluated surface" -msgstr "Thiếu bản đồ UV cho gắn đường cong trên bề mặt được tính toán" +msgstr "Thiếu ánh xạ UV để gắn các đường cong lên bề mặt tính toán" msgid "Invalid UV map: UV islands must not overlap" -msgstr "Bản đồ UV không hợp lệ: các hòn đảo UV không thể nằm trên nhau" +msgstr "Ánh xạ UV không hợp lệ: Các hải đảo UV không được chồng gối lên nhau" + + +msgid "Cursor must be over the surface mesh" +msgstr "Con trỏ phải nằm trên khung lưới bề mặt" msgid "Curves do not have surface attachment information" -msgstr "Đường cong không có thông tin cho sự gắn trên bề mặt" +msgstr "Đường cong không có thông tin về bám dính vào bề mặt" msgid "UV map or surface attachment is invalid" -msgstr "Bản đồ UV hay sự gắn trên bề mặt không hợp lệ" +msgstr "Ánh xạ UV hoặc bề mặt đính kèm bất hợp lệ" + + +msgid "PaintCurve" +msgstr "ĐườngCongSơn" msgid "Sample color for %s" -msgstr "Lấy mẫu vật màu cho %s" +msgstr "Lấy mẫu vật về màu sắc cho %s" msgid "Brush. Use Left Click to sample for palette instead" -msgstr "Bút. Dùng Bấm Trái để lấy mẫu vật cho bảng màu thay thế" +msgstr "Đầu bút. Dùng Nút Chuột Trái để lấy mẫu vật cho bảng pha màu nhé" msgid "Palette. Use Left Click to sample more colors" -msgstr "Bảng Màu. Dùng Bấm Trái để lấy thêm mẫu vật màu" +msgstr "Bảng màu. Dùng Nút Chuột Trái để lấy thêm mẫu vật về màu sắc" msgid "Packed MultiLayer files cannot be painted" -msgstr "Không thể sơn tập tin Đa Lớp Gói Lại" +msgstr "Không thể sơn các tập tin đóng gói đa tầng được" msgid "Image requires 4 color channels to paint" -msgstr "Ảnh cần có 4 kênh màu để sơn" +msgstr "Hình ảnh cần có 4 kênh màu để sơn" msgid "Image requires 4 color channels to paint: %s" -msgstr "Ảnh cần có 4 kênh màu để sơn: %s" +msgstr "Hình ảnh cần có 4 kênh màu để sơn: %s" msgid "Packed MultiLayer files cannot be painted: %s" -msgstr "Không thể sơn tập tin Đa Lớp Gói Lại: %s " +msgstr "Không thể sơn các tập tin đóng gói đa tầng: %s" + + +msgid " UVs," +msgstr " Các UV," + + +msgid " Materials," +msgstr " Vật Liệu," + + +msgid " Stencil," +msgstr " Khuôn Tô," msgid "Image could not be found" -msgstr "Không tìm được ảnh" +msgstr "Không tìm thấy hình ảnh" msgid "Image data could not be found" -msgstr "Không tìm được dữ liệu ảnh" +msgstr "Không tìm thấy dữ liệu hình ảnh" msgid "Image project data invalid" -msgstr "Dữ liệu phhép chiếu ảnh không hợp lệ" +msgstr "Dữ liệu của hình ảnh phóng chiếu không hợp lệ" msgid "No active camera set" -msgstr "Chưa đặt máy quay phim hoạt động" +msgstr "Chưa đặt máy quay phim nào hoạt động cả" msgid "Could not get valid evaluated mesh" -msgstr "Không thế lấy được mạng lưới được tính toán hợp lệ" +msgstr "Không thể đạt được khung lưới tính toán hợp lệ" msgid "No 3D viewport found to create image from" -msgstr "Không tìm được màn chiếu để chế tạo ảnh" +msgstr "Không tìm thấy cổng nhìn 3D nào để sử dụng nó kiến tạo hình ảnh được cả" msgid "Failed to create OpenGL off-screen buffer: %s" -msgstr "Chế tạo đệm OpenGL ngoài màn bị thất bại: %s" +msgstr "Không kiến tạo được bộ đệm OpenGL ngoại màn hình: %s" msgid "Missing%s%s%s%s detected!" -msgstr "Phát hiện thiếu %s%s%s%s!" +msgstr "Phát hiện thấy thiếu %s%s%s%s!" msgid "The modifier used does not support deformed locations" -msgstr "Bộ điều chỉnh đang dùng không hỗ trợ vị trí bị méo hóa" +msgstr "Bộ điều chỉnh sử dụng không hỗ trợ các vị trí bị biến dạng" + + +msgid "No vertex group data" +msgstr "Không có dữ liệu nhóm điểm đỉnh nào cả" + + +msgid "No vertex groups found" +msgstr "Không tìm thấy nhóm điểm đỉnh nào cả" msgid "Active group is locked, aborting" -msgstr "Nhóm hoạt động bị khóa, đang hủy" +msgstr "Nhóm đang hoạt động bị khóa. Bãi bỏ" msgid "No active vertex group for painting, aborting" -msgstr "Không có nhóm đỉnh hoạt động để sơn, đang hủy" +msgstr "Không có nhóm điểm đỉnh nào đang hoạt động để có thể sơn. Bãi bỏ" msgid "Mirror group is locked, aborting" -msgstr "Nhóm gương bị khóa, đang hủy" +msgstr "Nhóm phản chiếu đối xứng bị khóa. Bãi bỏ" msgid "Multipaint group is locked, aborting" -msgstr "Nhóm đa sơn bị khóa, đang hủy" +msgstr "Nhóm đa sơn bị khóa. Bãi bỏ" msgid "Not supported in dynamic topology mode" -msgstr "Không hỗ trợ trong chế độ tô pô động lý" +msgstr "Chưa được hỗ trợ trong chế độ cấu trúc liên kết động" msgid "Not supported in multiresolution mode" -msgstr "Không hỗ trợ trong chế độ đa độ phân giải" +msgstr "Chưa được hỗ trợ trong chế độ đa độ phân giải" msgid "Click on the mesh to set the detail" -msgstr "Bấm trên mạng lưới để đặt chi tiết" +msgstr "Bấm vào khung lưới để đặt chi tiết" + + +msgid "Move the mouse to change the dyntopo detail size. LMB: confirm size, ESC/RMB: cancel, SHIFT: precision mode, CTRL: sample detail size" +msgstr "Di chuyển chuột để thay đổi kích thước chi tiết cấu trúc động. NCT: xác nhận kích thước, ESC/NCP: hủy, SHIFT: chế độ chính xác, CTRL: lấy mẫu kích thước chi tiết" msgid "Warning!" @@ -110920,27 +123207,39 @@ msgstr "Cảnh Báo!" msgid "OK" -msgstr "Được" +msgstr "Chấp Nhận" + + +msgid "Attribute Data Detected" +msgstr "Phát Hiện thấy Dữ Liệu Thuộc Tính" + + +msgid "Dyntopo will not preserve colors, UVs, or other attributes" +msgstr "Liên Kết Cấu Trúc Động sẽ không bảo tồn màu sắc, UV, hay các thuộc tính khác đâu" msgid "Generative Modifiers Detected!" -msgstr "Được Phát Hiện Bộ Điều Chỉnh Chế Tạo!" +msgstr "Phát Hiện Thấy Có Các Bộ Điều Chỉnh Có Khả Năng Sinh Tạo!" msgid "Keeping the modifiers will increase polycount when returning to object mode" -msgstr "Giữ các bộ điều chỉnh sẽ tăng lượng da giác khi trở lại chế độ vật thể" +msgstr "Việc duy trì các bộ điều chỉnh sẽ làm tăng lượng đa giác khi quay trở lại chế độ đối tượng" msgid "Active brush does not contain any texture to distort the expand boundary" -msgstr "Bút hoạt động không chứa một chất liệu nào để méo hóa ranh giới mở rộng" +msgstr "Đầu bút đang hoạt động không có chất liệu nào để biến dạng ranh giới mở rộng" msgid "Texture mapping not set to 3D, results may be unpredictable" -msgstr "Ánh xạ chất liệu chưa được đặt 2D, có lẽ kết qủa không thể dự đoán" +msgstr "Ánh xạ chất liệu không được đặt là 3D. Kết quả có thể là bất định" + + +msgid "%s: Confirm, %s: Cancel" +msgstr "%s: Xác Nhận, %s: Hủy" msgid "non-triangle face" -msgstr "mặt vô tam giác" +msgstr "mặt phi tam giác" msgid "multi-res modifier" @@ -110948,7 +123247,7 @@ msgstr "bộ điều chỉnh đa phân giải" msgid "vertex data" -msgstr "dữ liệu đỉnh" +msgstr "dữ liệu điểm đỉnh" msgid "edge data" @@ -110956,107 +123255,123 @@ msgstr "dữ liệu cạnh" msgid "face data" -msgstr "dữ liệu mặt" +msgstr "dữ liệu Mặt" msgid "constructive modifier" -msgstr "bộ điều chỉnh xây dựng" +msgstr "bộ điều chỉnh có tính xây dựng" msgid "Object has non-uniform scale, sculpting may be unpredictable" -msgstr "Vật thể có phóng to không đều, khắc có thế không theo dự đoán" +msgstr "Đối tượng có tỷ lệ không đồng nhất, điêu khắc có thể cho kết quả bất định" msgid "Object has negative scale, sculpting may be unpredictable" -msgstr "Vật thể có phóng to âm, khắc có thế không theo dự đoán" +msgstr "Đối tượng có tỷ lệ âm, việc điêu khắc có thể trở nên bất thường" + + +msgid "No active brush" +msgstr "Không có đầu bút nào đang hoạt động cả" msgid "Dynamic Topology found: %s, disabled" -msgstr "Tìm được Hình Thể Động Lý: %s, bị tắt" +msgstr "Tìm thấy Liên Kết Cấu Trúc Động: %s, đã vô hiệu hóa" msgid "Compiled without sound support" -msgstr "Được biên dịch thiếu hỗ trợ âm thanh" +msgstr "Được biên dịch không có sự hỗ trợ về âm thanh" msgid "AutoPack is enabled, so image will be packed again on file save" -msgstr "Đã bật Tự Động Gói Lại, cho nên ảnh sẽ được gói lại trong tập tin nữa" +msgstr "Đã bật Tự Động Đóng Gói để hình ảnh sẽ được gói một lần nữa vào trong tập tin khi lưu" msgid "Active F-Curve" -msgstr "Cong-F Hoạt Động" +msgstr "Đường Cong-F đang Hoạt Động" msgid "Active Keyframe" -msgstr "Bức Ảnh Hoạt Động" +msgstr "Khung Khóa đang Hoạt Động" msgid "Action must have at least one keyframe or F-Modifier" -msgstr "Hành động phải có ít nhất một bức ảnh mẫu hay Bộ Điều Chỉnh-F" +msgstr "Hành động phải có ít nhất một khung khóa hoặc một Bộ Điều Chỉnh-F" msgid "Action has already been stashed" -msgstr "Hành động được cất chứa rồi" +msgstr "Hành động đã được cất giấu" msgid "Could not find current NLA Track" -msgstr "Không tìm được rãnh NLA hiện tại" +msgstr "Không tìm thấy Rãnh NLA hiện tại" msgid "Internal Error: Could not find Animation Data/NLA Stack to use" -msgstr "Sai Lầm Nội Bộ: Không tìm được Dữ Liệu Hoạt Hình/Xếp Đống NLA để dùng" +msgstr "Lỗi Nội Bộ: Không tìm thấy Dữ Liệu Hoạt Họa/Ngăn Xếp NLA để sử dụng" msgid "Action '%s' will not be saved, create Fake User or Stash in NLA Stack to retain" -msgstr "Sẽ không lưu hành động '%s', chế tạo Người Dùng Giả hay Cất Chứa trong Xếp Đống NLA cho duy trì" +msgstr "Hành động '%s' sẽ không được lưu. Duy trì nó bằng cách kiến tạo Người Dùng Giả hoặc Cất Giấu (stash) nó trong ngăn xếp NLA" + + +msgid "No keyframes copied to the internal clipboard" +msgstr "Không có khung khóa nào đã được sao chép vào bảng nhớ tạm nội bộ cả" msgid "Keyframe pasting is not available for mask mode" -msgstr "Không thể dán bức ảnh trong chế độ mặt nạ" +msgstr "Không thể dán khung khóa trong chế độ màn chắn lọc" + + +msgid "No data in the internal clipboard to paste" +msgstr "Không có dữ liệu trong khay nhớ tạm nội bộ để dán" msgid "Keyframe pasting is not available for grease pencil or mask mode" -msgstr "Không thể dán bức ảnh trong chế độ bút sáp hay mặt nạ" +msgstr "Không được phép dán khung khóa trong chế độ Bút Chì Dầu hay màn chắn lọc" msgid "No selected F-Curves to paste into" -msgstr "Chưa chọn Cong-F nào để dán vào" +msgstr "Không có Đường Cong-F nào được chọn để có thể dán vào đó được" msgid "Insert Keyframes is not yet implemented for this mode" -msgstr "Chén Bức Ảnh Mẫu chưa được thức hành cho chế độ này" +msgstr "Chèn Khung Khóa chưa được thực hiện cho chế độ này" msgid "Not implemented for Masks" -msgstr "Chưa được thành lập cho Mặt Nạ" +msgstr "Chưa được thực hiện cho Màn Chắn Lọc" + + +msgid "Cannot activate a file selector dialog, one already open" +msgstr "Không thể kích hoạt hộp thoại chọn tập tin được, một hộp thoại đã được mở rồi" msgid "Texture Field" -msgstr "Trường Chất Liệu" +msgstr "Trường Lực Chất Liệu" msgid "Brush Mask" -msgstr "Mặt Nạ Bút" +msgstr "Màn Chắn Lọc Đầu Bút" msgid "No textures in context" -msgstr "Không có chất liệu trong bối cảnh" +msgstr "Không có chất liệu nào trong ngữ cảnh này cả" msgid "Show texture in texture tab" -msgstr "Hiện chất liệu trong nhãn chất liệu" +msgstr "Hiển thị chất liệu trong mục chất liệu" msgid "No (unpinned) Properties Editor found to display texture in" -msgstr "Không tìm được Trình Biên Soạn Đặc Tính nào (chưa đinh ghìm) để hiển thị chất liệu phía trong" +msgstr "Không tìm được Bộ Biên Tập Đặc Tính nào (chưa đinh ghìm) để hiển thị họa tiết phía trong" msgid "No texture user found" -msgstr "Không tìm được người dùng chất liệu" +msgstr "Không tìm thấy người nào dùng chất liệu cả" msgid "Fields" -msgstr "Các Trường" +msgstr "Trường" msgid "File Path:" @@ -111076,67 +123391,67 @@ msgstr "Y:" msgid "Pattern Area:" -msgstr "Khu Vực Gương Mẫu:" +msgstr "Khu Vực Mẫu:" msgid "Width:" -msgstr "Bề Rộng:" +msgstr "Chiều Rộng:" msgid "Height:" -msgstr "Bề Cao:" +msgstr "Chiều Cao:" msgid "Search Area:" -msgstr "Khu Vực Tìm Kiếm:" +msgstr "Vùng Lùng Tìm:" msgid "Marker is disabled at current frame" -msgstr "Ký hiệu tại bức ảnh hiện tại bị tắt" +msgstr "Dấu mốc không hoạt động tại khung hình hiện tại" msgid "Marker is enabled at current frame" -msgstr "Ký hiệu tại bức ảnh hiện tại được bật" +msgstr "Dấu mốc hoạt động tại khung hình hiện tại" msgid "X-position of marker at frame in screen coordinates" -msgstr "Vị trí X của ký hiệu tại bức ảnh bằng tọa độ màn" +msgstr "Vị trí-X của dấu mốc tại khung hình trong tọa độ màn hình" msgid "Y-position of marker at frame in screen coordinates" -msgstr "Vị trí Y của ký hiệu tại bức ảnh bằng tọa độ màn" +msgstr "Vị trí-Y của dấu mốc tại khung hình trong tọa độ màn hình" msgid "X-offset to parenting point" -msgstr "Dịch X đến điểm phụ huynh" +msgstr "Dịch chuyển-X khỏi điểm gốc" msgid "Y-offset to parenting point" -msgstr "Dịch Y đến điểm phụ huynh" +msgstr "Dịch chuyển-Y khỏi điểm gốc" msgid "Width of marker's pattern in screen coordinates" -msgstr "Bề rộng của gương mẫu ký hiệu bằng tọa độ màn" +msgstr "Chiều rộng vùng hình mẫu để nhận dạng của dấu mốc trong tọa độ màn hình" msgid "Height of marker's pattern in screen coordinates" -msgstr "Bề cao của gương mẫu ký hiệu bằng tọa độ màn" +msgstr "Chiều cao vùng mẫu hình để nhận dạng của dấu mốc trong tọa độ màn hình" msgid "X-position of search at frame relative to marker's position" -msgstr "Vị trí X tìm kiếm tại bức ảnh tương đối với vị trí của ký hiệu" +msgstr "Vị trí-X của vùng lùng tìm tại khung hình tương đối với vị trí của dấu mốc" msgid "Y-position of search at frame relative to marker's position" -msgstr "Vị trí Y tìm kiếm tại bức ảnh tương đối với vị trí của ký hiệu" +msgstr "Vị trí-Y của vùng lùng tìm tại khung hình tương đối với vị trí của dấu mốc" msgid "Width of marker's search in screen coordinates" -msgstr "Bề rộng tìm kiếm của ký hiệu trong tọa độ màn" +msgstr "Chiều rộng vùng lùng tìm của dấu mốc trong tọa độ màn hình" msgid "Height of marker's search in screen coordinates" -msgstr "Bề cao tìm kiếm của ký hiệu trong tọa độ màn" +msgstr "Chiều cao vùng lùng tìm của dấu mốc trong tọa độ màn hình" msgid "%d x %d" @@ -111144,15 +123459,15 @@ msgstr "%d x %d" msgid ", %d float channel(s)" -msgstr ", %d (các) kênh số thật" +msgstr ", %d (các) kênh float (số thực)" msgid ", RGBA float" -msgstr ", RGBA số thật" +msgstr ", RGBA float (số thực)" msgid ", RGB float" -msgstr ", RGB số thật" +msgstr ", RGB float (số thực)" msgid ", RGBA byte" @@ -111164,27 +123479,27 @@ msgstr ", RGB byte" msgid ", %.2f fps" -msgstr ", %.2f bức ảnh/giây" +msgstr ", %.2f khung hình/giây" msgid ", failed to load" -msgstr ", đọc bị thất bại" +msgstr ", không thể nạp được" msgid "Frame: %d / %d" -msgstr "Bức Ảnh: %d / %d" +msgstr "Khung Hình: %d / %d" msgid "Frame: - / %d" -msgstr "Bức Ảnh: - / %d" +msgstr "Khung Hình: - / %d" msgid "unsupported movie clip format" -msgstr "định dạng đoạn phim không được hỗ trợ" +msgstr "định dạng của đoạn phim chưa được hỗ trợ" msgid "No files selected to be opened" -msgstr "Chưa có tập tin để mở" +msgstr "Chưa có tập tin nào được chọn để mở hết" msgid "Cannot read '%s': %s" @@ -111192,95 +123507,123 @@ msgstr "Không thể đọc '%s' : %s" msgid "Use LMB click to define location where place the marker" -msgstr "Dùng NCT để xác định vị trí dán ký hiệu" +msgstr "Dùng cái bấm của NCT để xác định vị trí, nơi đặt dấu mốc" msgid "No active track to join to" -msgstr "Không có theo dõi hoạt động để kết nối" +msgstr "Không có dấu giám sát đang hoạt động nào để hội nhập vào cả" msgid "Object used for camera tracking cannot be deleted" -msgstr "Không thể xóa vật thể dùng để theo dõi máy quay phim" +msgstr "Không thể xóa đối tượng dùng để giám sát máy quay phim" msgid "Feature detection requires valid clip frame" -msgstr "Phát hiện đặc trưng yêu cầu có đoạn phim hợp lệ" +msgstr "Phát hiện hình thể đòi hỏi khung hình của phim hợp lệ" msgid "At least one track with bundle should be selected to define origin position" -msgstr "Nên chọn ít nhất một đường vết với gói để chỉ định vị trí gốc tọa độ" +msgstr "Nên chọn ít nhất một dấu giám sát có nhóm điểm để xác định vị trí tọa độ gốc" msgid "No object to apply orientation on" -msgstr "Không có vật thể cho áp dụng định hướng" +msgstr "Không có đối tượng để áp dụng định hướng vào" msgid "Three tracks with bundles are needed to orient the floor" -msgstr "Cần ba đường vết với gói để chỉ định định hướng của sàn" +msgstr "Cần ba dấu giám sát có nhóm điểm để xác định định hướng của sàn" msgid "Single track with bundle should be selected to define axis" -msgstr "Nên chọn một đường vết với gói để chỉ định trục" +msgstr "Nên chọn một dấu giám sát có nhóm điểm để xác định trục" msgid "Two tracks with bundles should be selected to set scale" -msgstr "Nên chọn hai đường vết với gói để chỉ định phóng to" +msgstr "Nên chọn hai dấu giám sát có nhóm điểm để đặt tỷ lệ" msgid "Need at least 4 selected point tracks to create a plane" -msgstr "Cần chọn ít nhất 4 điểm đường vết trở lên để tạo một mặt phẳng" +msgstr "Cần phải lựa chọn ít nhất 4 điểm giám sát để kiến tạo một bình diện" msgid "Some data failed to reconstruct (see console for details)" -msgstr "Xây đựng lại một phần của dữ liệu bị thất bại (xem diện điều khiển cho chi tiết)" +msgstr "Một số dữ liệu không tái dựng được (xem bàn giao tiếp để biết thêm chi tiết)" msgid "Average re-projection error: %.2f px" -msgstr "Sai lầm phép chiếu lại trung bình: %.2f điểm ảnh" +msgstr "Sai số tái phóng chiếu trung bình: %.2f điểm ảnh" msgid "Track the selected markers backward for the entire clip" -msgstr "Theo dõi lùi các dấu được chọn cho toàn bộ đoạn" +msgstr "Giám sát các dấu mốc đã chọn ngược trở lại cho toàn bộ đoạn phim" msgid "Track the selected markers backward by one frame" -msgstr "Theo dõi lùi các dấu được chọn một bức ảnh" +msgstr "Giám sát các dấu mốc đã chọn ngược trở lại một khung hình" msgid "Track the selected markers forward for the entire clip" -msgstr "Theo dõi tới các dấu được chọn cho toàn bộ đoạn" +msgstr "Giám sát các dấu mốc đã chọn về phía trước cho toàn bộ đoạn phim" msgid "Track the selected markers forward by one frame" -msgstr "Theo dõi tới các dấu được chọn một bức ảnh" +msgstr "Giám sát các dấu mốc đã chọn về phía trước một khung hình" + + +msgid "New lines unsupported, call this operator multiple times" +msgstr "Dòng mới chưa được hỗ trợ, hãy gọi thao tác này nhiều lần nhé" + + +msgid "Catalog cannot be dropped into itself" +msgstr "Danh mục không thể được thả vào chính bản thân nó được" + + +msgid "Catalog is already placed inside this catalog" +msgstr "Danh mục đã được đặt ở bên trong danh mục này rồi" + + +msgid "Move catalog {} into {}" +msgstr "Di chuyển danh mục {} vào trong {}" msgid "Move assets to catalog" -msgstr "Di chuyển tích sản vào danh mục" +msgstr "Di chuyển tài sản vào danh mục" msgid "Move asset to catalog" -msgstr "Di chuyển đến danh mục" +msgstr "Di chuyển tài sản vào danh mục" msgid "Only assets from this current file can be moved between catalogs" -msgstr "Chỉ tích sản của tập tin hiện tại có thể di chuyển giữa danh mục" +msgstr "Chỉ có thể di chuyển các nội dung từ tập tin hiện tại này giữa các danh mục mà thôi" + + +msgid "Catalogs cannot be edited in this asset library" +msgstr "Không thể biên soạn danh mục trong thư viện tài sản này được" + + +msgid "Catalog is already placed at the highest level" +msgstr "Danh mục đã được đặt ở cấp bậc cao nhất" + + +msgid "Move catalog {} to the top level of the tree" +msgstr "Di chuyển danh mục {} lên cấp bậc cao nhất của cấu trúc cây" msgid "Move assets out of any catalog" -msgstr "Di chuyển tích sản ra khỏi bất cứ danh mục nào" +msgstr "Di chuyển tài sản ra khỏi danh mục nào đó" msgid "Move asset out of any catalog" -msgstr "Di chuyển tích sản ra khỏi bất cứ danh mục nào" +msgstr "Di chuyển tài sản ra khỏi danh mục nào đó" msgid "Today" -msgstr "Ngày nay" +msgstr "Hôm Nay" msgid "Yesterday" -msgstr "Hôm qua" +msgstr "Hôm Qua" msgid "File path" @@ -111288,15 +123631,27 @@ msgstr "Đường dẫn tập tin" msgid "Path to asset library does not exist:" -msgstr "Đường dẫn đến thư viện tích sản không tồn tại:" +msgstr "Đường dẫn đến thư viện tài sản không tồn tại:" msgid "" "Asset Libraries are local directories that can contain .blend files with assets inside.\n" "Manage Asset Libraries from the File Paths section in Preferences" msgstr "" -"Thư Viện Tích Sản là thư mục địa phương có thể chứa tập tin .blend có tích sản ở trong.\n" -"Quản lý những Thư Viện Tích Sản từ phần Đường Dẫn trong Tùy Chọn" +"Thư Viện Tài Sản là thư mục địa phương, có thể chứa các tập tin .blend có tài sản bên trong chúng.\n" +"Chúng ta có thể quản lý các Thư Viện Tài Sản ở phần Đường Dẫn Tập Tin trong Cài Đặt Sở Thích của phần mềm" + + +msgid "Unreadable Blender library file:" +msgstr "Tập tin thư viện Blender không thể đọc được:" + + +msgid "Could not rename: %s" +msgstr "Không thể đổi tên: %s" + + +msgid "Unable to create configuration directory to write bookmarks" +msgstr "Không thể kiến tạo thư mục cấu hình để ghi các dấu trang được" msgid "File does not exist" @@ -111304,23 +123659,39 @@ msgstr "Tập tin không tồn tại" msgid "No parent directory given" -msgstr "Chưa xác định thư mục phụ huynh" +msgstr "Chưa được cung cấp thư mục phụ huynh" msgid "Could not create new folder name" -msgstr "Không chế tạo được tên hồ sơ mới" +msgstr "Không kiến tạo được tên thư mục mới" + + +msgid "Unable to open or write bookmark file \"%s\"" +msgstr "Không thể mở hoặc ghi tập tin đánh dấu trang \"%s\" được" + + +msgid "Failure to perform external file operation on \"%s\"" +msgstr "Thất bại trong việc thao tác tập tin bên ngoài trên \"%s\"" msgid "'%s' given path is OS-invalid, creating '%s' path instead" -msgstr "Đường dẫn '%s' không hợp lệ hệ điều hành, đang chế tạo đường dẫn '%s' thay thế" +msgstr "Đường dẫn đã cho '%s' không hợp lệ với Hệ Điều Hành. Thay vào đó, kiến tạo đường dẫn '%s'" msgid "Could not create new folder: %s" -msgstr "Không chế tạo được hồ sơ mới: %s" +msgstr "Không kiến tạo được thư mục mới: %s" msgid "Could not delete file or directory: %s" -msgstr "Không xóa được tập tin hay thư mục: %s" +msgstr "Không xóa được tập tin hoặc thư mục: %s" + + +msgid "More than one item is selected" +msgstr "Nhiều mục, hơn một cái, đã được chọn" + + +msgid "No items are selected" +msgstr "Chưa có mục nào được chọn cả" msgid "Cancel" @@ -111328,7 +123699,7 @@ msgstr "Hủy" msgid "File name, overwrite existing" -msgstr "Tên tập tin, ghi lại trên tập tin tồn tại" +msgstr "Tên tập tin, viết đè lên cái hiện có" msgid "File name" @@ -111336,11 +123707,11 @@ msgstr "Tên tập tin" msgid "Asset Catalogs" -msgstr "Danh Mục Tích Sản" +msgstr "Danh Mục Tài Sản" msgid "Date Modified" -msgstr "Ngày Tháng Được Sửa Đổi" +msgstr "Ngày Thay Đổi" msgid "Home" @@ -111348,11 +123719,11 @@ msgstr "Nhà" msgid "Desktop" -msgstr "Mặt Trên Bàn" +msgstr "Màn Hình Làm Việc" msgid "Downloads" -msgstr "Tải Xuống" +msgstr "Bản Tải Về" msgid "Music" @@ -111376,31 +123747,35 @@ msgstr "Phim" msgid "Cursor X" -msgstr "X Con Trỏ" +msgstr "Con Trỏ X" msgid "Cursor to Selection" -msgstr "Con Trỏ Đến Sự Lựa Chọn" +msgstr "Con Trỏ sang Sự Lựa Chọn" msgid "Cursor Value to Selection" -msgstr "Giá Trị Con Trỏ Đến Sự Lựa Chọn" +msgstr "Giá Trị Con Trỏ sang chỗ Lựa Chọn" + + +msgid "Handle Smoothing" +msgstr "Làm Mịn Tay Cầm" msgid "Interpolation:" -msgstr "Suy Nội:" +msgstr "Nội Suy:" msgid "None for Enum/Boolean" -msgstr "Không Có Cho Liệt Kê/Bool" +msgstr "Không đối với Enum/Boolean" msgid "Key Frame" -msgstr "Bức Ảnh Mẫu" +msgstr "Khung Khóa" msgid "Prop:" -msgstr "Đặc Tính:" +msgstr "Tính Chất:" msgid "Driver Value:" @@ -111412,7 +123787,7 @@ msgstr "Biểu Thức:" msgid "Add Input Variable" -msgstr "Thêm Biến Số Ngõ Vào" +msgstr "Thêm Biến Số Đầu Vào" msgid "Value:" @@ -111420,123 +123795,131 @@ msgstr "Giá Trị:" msgid "Update Dependencies" -msgstr "Nâng Cấp Đồ Nhờ" +msgstr "Cập Nhật các Phụ Thuộc" msgid "Driven Property:" -msgstr "Đặc Tính Được Dắt:" +msgstr "Tính Chất Điều Vận:" + + +msgid "Driver:" +msgstr "Điều Vận:" msgid "Show in Drivers Editor" -msgstr "Cho xem Điều Vận trong Trình Biên Soạn" +msgstr "Hiển Thị Trình Biên Soạn Điều Vận" msgid "F-Curve only has F-Modifiers" -msgstr "Cong-F chỉ có Bộ Điều Chỉnh-F" +msgstr "Đường Cong-F chỉ có Bộ Điều Chỉnh-F" msgid "See Modifiers panel below" -msgstr "Xem bảng Bộ Điều Chỉnh ở dưới" +msgstr "Xem bảng các Bộ Điều Chỉnh ở dưới" msgid "F-Curve doesn't have any keyframes as it only contains sampled points" -msgstr "Cong-F không có bức ảnh mẫu vì nó chỉ chứa điểm mẫu vật" +msgstr "Đường Cong-F không có khung khóa nào vì nó chỉ có chứa các điểm lấy mẫu vật" msgid "No active keyframe on F-Curve" -msgstr "Không có bức ảnh mẫu hoạt động trên Cong-F" +msgstr "Không có khung khóa nào đang hoạt động trên Đường Cong-F cả" msgid "It cannot be left blank" -msgstr "Không thể bỏ nó trống" +msgstr "Nó không thể để trống rỗng được" msgid "It cannot start with a number" -msgstr "Nó không thể bắt đầu bởi kỳ tự số cái" +msgstr "Nó không thể bắt đầu bằng một con số được" msgid "It cannot start with a special character, including '$', '@', '!', '~', '+', '-', '_', '.', or ' '" -msgstr "Nó không thể bắt đầu bởi ký tự đặc biệt như '$', '@', '!', '~', '+', '-', '_', '.', or ' '" +msgstr "Nó không thể bắt đầu bằng một ký tự đặc biệt, như: '$', '@', '!', '~', '+', '-', '_', '.', hoặc ' ' được" msgid "It cannot contain spaces (e.g. 'a space')" -msgstr "Nó không thể chứa dấu cách (ví dụ 'dấu cách')" +msgstr "Nó không thể chứa các dấu cách (ví dụ: 'một dấu cách trống') được" msgid "It cannot contain dots (e.g. 'a.dot')" -msgstr "Nó không thể chứa dấu chấm (ví dụ 'dấu.chấm')" +msgstr "Nó không thể chứa các dấu chấm (ví dụ: 'a.dot') được" msgid "It cannot contain special (non-alphabetical/numeric) characters" -msgstr "Nó không thể chứa ký tự đặc biệt (không phải là chữ cái hay số cái ASCII)" +msgstr "Nó không thể chứa các ký tự đặc biệt (không nằm trong bảng chữ cái, hoặc không phải là chữ số)" msgid "It cannot be a reserved keyword in Python" -msgstr "Nó không thể là từ giàng của Python" +msgstr "Nó không thể là một từ dành riêng trong Python được" + + +msgid "Let the driver determine this property's value" +msgstr "Hãy để cho bộ điều vận xác định giá trị của tính chất này" msgid "ERROR: Invalid Python expression" -msgstr "SAI LẦM: Biểu thức Python không hợp lệ" +msgstr "Lỗi: Biểu thức Python không hợp lệ" msgid "Python restricted for security" -msgstr "Đã hạn chế python cho an ninh" +msgstr "Python đã bị hạn chế (không được phép hoạt động) vì lý do bảo an" msgid "Slow Python expression" -msgstr "Biểu thức Python chậm" +msgstr "Biểu thức Python chậm trễ" msgid "WARNING: Driver expression may not work correctly" -msgstr "CẢNH BÁO: Biểu thức điều vận có thể không hoạt động đúng" +msgstr "CẢNH BÁO: Biểu thức điều vận có thể sẽ không hoạt động đúng đắn" msgid "TIP: Use variables instead of bpy.data paths (see below)" -msgstr "KHUYẾN: Dùng biến số thay đường dẫn bpy.data (xem phía dưới)" +msgstr "KHUYÊN: Dùng các biến số thay vì các đường dẫn trong bpy.data (xem dưới đây)" msgid "TIP: bpy.context is not safe for renderfarm usage" -msgstr "KHUYẾN: dùng bpy.context không an toàn cho nông trại kết xuất" +msgstr "KHUYÊN: bpy.context không an toàn cho việc sử dụng với trại kết xuất" msgid "ERROR: Invalid target channel(s)" -msgstr "SAI LẦM: Kênh mục tiêu không hợp lệ" +msgstr "Lỗi: Kênh mục tiêu không hợp lệ" msgid "ERROR: Driver is useless without any inputs" -msgstr "SAI LẦM: Điều Vận là đồ vô dụng nếu không có ngõ vào" +msgstr "Lỗi: Điều vận sẽ là vô dụng nếu không có các đầu vào" msgid "TIP: Use F-Curves for procedural animation instead" -msgstr "KHUYÊN: Dùng Cong-F cho hoạt hình thủ tục thay thế" +msgstr "KHUYÊN: Nên sử dụng các Đường Cong-F đối với thủ tục hoạt họa thì hơn" msgid "F-Modifiers can generate curves for those too" -msgstr "Bộ Điều Chỉnh-F cũng có thể chế tạo đường cong cho chúng nó nữa" +msgstr "Các Bộ Điều Chỉnh-F cũng có thể sinh tạo các đường cong cho những cái đó nữa" msgid "Add a Driver Variable to keep track of an input used by the driver" -msgstr "Thêm một Biến Số Điều Vận để đuổi theo một ngõ vào điều vận được dùng" +msgstr "Thêm một Biến Điều Vận (Driver Variable) để theo dõi đầu vào mà điều vận sử dụng" msgid "Invalid variable name, click here for details" -msgstr "Tên biến số không hợp lệ, bấm đây cho xem chi tiết" +msgstr "Tên ẩn số không hợp lệ, bấm vào đây để xem chi tiết" msgid "Delete target variable" -msgstr "Xóa biến mục tiêu" +msgstr "Xóa biến số mục tiêu" msgid "Force updates of dependencies - Only use this if drivers are not updating correctly" -msgstr "Bắt buộc nâng cấp đồ nhờ - Chỉ dùng này nếu điều vận không nâng cấp đúng kiểu" +msgstr "Bắt cập nhật các phụ thuộc - Chỉ sử dụng cái này nếu các điều vận không cập nhật đúng đắn" msgid "Driven Property" -msgstr "Đặc Tính Được Dắt" +msgstr "Tính Chất Điều Vận" msgid "Add/Edit Driver" -msgstr "Thêm/Biên Tập Điều Vận" +msgstr "Thêm/Biên Soạn Điều Vận" msgctxt "Operator" @@ -111545,59 +123928,63 @@ msgstr "Tên Ẩn Số Không Hợp Lệ" msgid "" -msgstr "" +msgstr "" msgid "No active F-Curve to add a keyframe to. Select an editable F-Curve first" -msgstr "Không có Cong-F hoạt động để thêm một bức ảnh mẫu. Trước chọn một Cong-F có thể biên tập" +msgstr "Không có Đường Cong-F nào đang hoạt động để thêm một khung khóa vào. Hãy chọn một Đường Cong-F có thể biên soạn được trước đã" msgid "No selected F-Curves to add keyframes to" -msgstr "Không có Cong-F để kèm bức ảnh mẫu" +msgstr "Không có Đường Cong-F đã chọn nào để có thể thêm các khung khóa vào được" msgid "No channels to add keyframes to" -msgstr "Không có kênh để thêm bức ảnh mẫu" +msgstr "Không có kênh nào để thêm khung khóa vào được" msgid "Keyframes cannot be added to sampled F-Curves" -msgstr "Không thể thêm bức ảnh mẫu cho Cong-F kiểu mẫu vật" +msgstr "Không thể thêm khung khóa vào Đường Cong-F đã lấy mẫu vật" msgid "Active F-Curve is not editable" -msgstr "Không thể biên tập Cong-F hoạt động" +msgstr "Không thể biên soạn Đường Cong-F đang hoạt động" msgid "Remove F-Modifiers from F-Curve to add keyframes" -msgstr "Xóa Cụ Sửa Đối-F từ Cong-F để có thể thêm bức ảnh mẫu" +msgstr "Xóa các Bộ Điều Chỉnh-F khỏi Đường Cong-F để thêm các khung khóa" msgid "Unsupported audio format" -msgstr "Định dạng âm thanh không được hỗ trợ" +msgstr "Định dạng âm thanh chưa được hỗ trợ" msgid "No Euler Rotation F-Curves to fix up" -msgstr "Không có Cong-F Xoay Euler để chỉnh sửa" +msgstr "Không có Đường Cong-F cho sự xoay chiều Euler để chỉnh sửa" msgid "No Euler Rotations could be corrected" -msgstr "Không sửa được các Xoay Euler" +msgstr "Không có Xoay Chiều Euler nào có thể chỉnh sửa được cả" msgid "No Euler Rotations could be corrected, ensure each rotation has keys for all components, and that F-Curves for these are in consecutive XYZ order and selected" -msgstr "Không thể sửa Xoay Euler, làm chắc chắn mỗi xoay có bức ảnh mẫu cho hết thành phần, và Cong-F của chúng nó có thứ tự XYZ và được chọn rồi" +msgstr "Không thể chỉnh sửa sự xoay chiều Euler. Phải chắc chắn là mỗi sự xoay chiều đề có khung khóa cho toàn bộ các thành phần, Đường Cong-F cho chúng có thứ tự XYZ tuần tự và đã được chọn rồi" msgid "The rotation channel was filtered" -msgstr "Đã bộ lọc kênh xoay" +msgstr "Kênh xoay chiều đã được thanh lọc" + + +msgid "No control points are selected" +msgstr "Không có điểm điều khiển nào đã được chọn cả" msgid "Modifier could not be added (see console for details)" -msgstr "Không thể thêm Bộ Điều Chỉnh (xem diện điều khiển cho chi tiết)" +msgstr "Không thể thêm bộ điều chỉnh (xem thông tin ở bàn giao tiếp để biết chi tiết)" msgid "No F-Modifiers available to be copied" -msgstr "Không có Bộ Điều Chỉnh-F để chép" +msgstr "Không có Bộ Điều Chỉnh-F để sao chép" msgid "No F-Modifiers to paste" @@ -111605,43 +123992,71 @@ msgstr "Không có Bộ Điều Chỉnh-F để dán" msgid "File not found '%s'" -msgstr "Không tìm được tập tin '%s'" +msgstr "Không tìm thấy tập tin '%s'" msgid "Euler Rotation F-Curve has invalid index (ID='%s', Path='%s', Index=%d)" -msgstr "Cong-F Xoay Euler có chỉ số không hợp lệ (ID='%s', Đường='%s', Chỉ số=%d)" +msgstr "Đường Cong-F về Xoay Chiều Euler có chỉ số không hợp lệ (ID='%s', Đường dẫn='%s', Chỉ số=%d)" msgid "Missing %s%s%s component(s) of euler rotation for ID='%s' and RNA-Path='%s'" -msgstr "Thiếu thành phần %s%s%s của xoay Euler cho ID='%s' và Đường Dẫn-RNA'%s'=" +msgstr "Thiếu thành phần %s%s%s trong xoay chiều Euler đối với ID='%s' và Đường dẫn RNA'%s'=" msgid "XYZ rotations not equally keyed for ID='%s' and RNA-Path='%s'" -msgstr "Xoay XYZ không được bức ảnh mẫu đều đặn cho ID='%s' và Đường Dẫn-RNA='%s'" +msgstr "Các xoay chiều XYZ không được khóa hóa một cách tương đồng đối với Chỉ Danh ID='%s' và RNA-Path='%s'" msgid "%d of %d rotation channels were filtered (see the Info window for details)" -msgstr "Đã bộ lọc %d của %d kênh xoay (xem cửa sổ Thông Tin cho chi tiết)" +msgstr "%d của %d các kênh xoay chiều đã được thanh lọc (xin xem Cửa sổ thông tin để biết thêm chi tiết)" msgid "All %d rotation channels were filtered" -msgstr "Đã bộ lọc hết %d kênh xoay" +msgstr "Toàn thể %d kênh xoay chiều đã được thanh lọc" + + +msgid "No drivers deleted" +msgstr "Không có trình điều vận nào bị xóa cả" + + +msgid "Deleted %u drivers" +msgstr "Đã xóa %u trình điều vận" msgid "Decimate Keyframes" -msgstr "Cắt Chẻ Bức Ảnh Mẫu" +msgstr "Tiêu Hao Khung Khóa" msgid "Decimate F-Curves by specifying how much they can deviate from the original curve" -msgstr "Cắt chẻ Cong-F bằng chỉ định mức độ chênh lệch từ đường cong nguyên bản" +msgstr "Tiêu hao Đường Cong-F bằng cách chỉ định lượng thiên lệch mà chúng có thể di chuyển khỏi đường cong ban đầu là bao nhiêu" + + +msgid "Shear Keys" +msgstr "Xô Nghiêng Khóa" + + +msgid "Cannot find keys to operate on" +msgstr "Không tìm thấy khung khóa để thao tác cả" + + +msgid "Decimate: Skipping non linear/bezier keyframes!" +msgstr "Tiêu Hao: Bỏ qua các khung khóa phi tuyến tính/bezier!" + + +msgid "You need at least 2 keys to the right side of the selection" +msgstr "Bạn cần có ít nhất 2 phím ở bên phải của lựa chọn" + + +msgid "You need at least 2 keys to the left side of the selection" +msgstr "Bạn cần ít nhất 2 khóa ở bên trái của lựa chọn" msgid "There is no animation data to operate on" -msgstr "Không có dữ liệu hoạt hình để tương tác" +msgstr "Không có dữ liệu hoạt họa nào để thao tác trên đó cả" msgid "Discard" -msgstr "Bỏ" +msgstr "Loại Bỏ" msgid "Select Slot" @@ -111649,103 +124064,107 @@ msgstr "Chọn Khe" msgid "Select Layer" -msgstr "Chọn Lớp" +msgstr "Chọn Tầng" msgid "Select Pass" -msgstr "Chọn Vòng" +msgstr "Chọn Lượt" msgid "Select View" -msgstr "Chọn Màn" +msgstr "Chọn Góc Nhìn" msgid "Hard coded Non-Linear, Gamma:1.7" -msgstr "Trong mã nguồn Không Bậc Một, Gama:1.7" +msgstr "Gamma:1.7, Phi Tuyến Tính gắn cố định" msgid "Can't Load Image" -msgstr "Không Thể Nhập Ảnh" +msgstr "Không Nạp được Hình Ảnh" msgid "%d float channel(s)" -msgstr "%d kênh số thật" +msgstr "%d kênh số thực" msgid " RGBA float" -msgstr "RGBA số thật" +msgstr " Số thực RGBA" msgid " RGB float" -msgstr "RGB số thật" +msgstr " Số thực RGB" msgid " RGBA byte" -msgstr "RGBA byte" +msgstr " byte RGBA" msgid " RGB byte" -msgstr "RGB byte" +msgstr " byte RGB" msgid "Frame %d / %d" -msgstr "Bức Ảnh %d / %d" +msgstr "Khung Hình %d / %d" msgid "Frame %d: %s" -msgstr "Bức Ảnh %d: %s" +msgstr "Khung Hình %d: %s" msgid "Frame %d" -msgstr "Bức Ảnh %d" +msgstr "Khung Hình %d" msgid "unsupported image format" -msgstr "định dạng ảnh không được hỗ trợ" +msgstr "định dạng hình ảnh chưa hỗ trợ" msgid "Can only save sequence on image sequences" -msgstr "Chỉ có thể lưu trình tự trong trình tự ảnh" +msgstr "Chỉ có thể lưu trình tự trong trình tự hình ảnh mà thôi" msgid "Cannot save multilayer sequences" -msgstr "Không thể lưu trình ảnh da lớp" +msgstr "Không thể lưu các trình tự hình ảnh đa tầng lớp" msgid "No images have been changed" -msgstr "Chưa đổi ảnh nào" +msgstr "Không có hình ảnh nào đã bị thay đổi cả" + + +msgid "Images cannot be copied while rendering" +msgstr "Không thể sao chép các hình ảnh trong khi kết xuất được" msgid "Packing movies or image sequences not supported" -msgstr "Không hỗ trợ gói lại phim, trình tự ảnh" +msgstr "Không hỗ trợ đóng gói phim hoặc chuỗi hình ảnh" msgid "Unpacking movies or image sequences not supported" -msgstr "Không hỗ trợ gỡ gói phim, hoặc trình tự ảnh" +msgstr "Không hỗ trợ giải nén phim hoặc chuỗi hình ảnh" msgid "Invalid UDIM index range was specified" -msgstr "Đã xác định phạm vi cho chỉ số UDIM không hợp lệ" +msgstr "Phạm vi chỉ số UDIM xác định là bất hợp lệ" msgid "No UDIM tiles were created" -msgstr "Không có chế tạo tựa UDIM nào" +msgstr "Không có ô UDIM nào được kiến tạo cả" msgid "Packed to memory image \"%s\"" -msgstr "Đã gói vào ảnh bộ nhớ \"%s\"" +msgstr "Đóng gói vào hình ảnh trong bộ nhớ \"%s\"" msgid "Cannot save image, path \"%s\" is not writable" -msgstr "Không thể lưu được ảnh, không thể ghi đường dẫn \"%s\"" +msgstr "Không thể lưu hình ảnh, đường dẫn đến \"%s\" không phải là đường có thể viết được" msgid "Saved image \"%s\"" -msgstr "Đã Lưu Ảnh \"%s\"" +msgstr "Đã lưu hình ảnh '%s'\"" msgid "%d image(s) will be saved in %s" -msgstr "sẽ lưu %d tấm ảnh trong %s" +msgstr "sẽ lưu %d hình ảnh vào %s" msgid "Saved %s" @@ -111753,67 +124172,75 @@ msgstr "Đã Lưu %s" msgid "Packed library image can't be saved: \"%s\" from \"%s\"" -msgstr "Không thể lưu ảnh gói lại trong thư viện: \"%s\" từ \"%s\"" +msgstr "Hình ảnh thư viện đóng gói không thể lưu được: \"%s\" từ \"%s\"" msgid "Image can't be saved, use a different file format: \"%s\"" -msgstr "Không thể lưu ảnh, dùng một định dạng tập tin khác: \"%s\"" +msgstr "Hình ảnh không thể lưu được. Hãy sử dụng một định dạng tập tin khác: \"%s\"" msgid "Multiple images can't be saved to an identical path: \"%s\"" -msgstr "Nhiều ảnh không thể lưu vào một đường dẫn giống nhau: \"%s\"" +msgstr "Lưu nhiều hình ảnh vào cùng một đường dẫn: \"%s\" là điều không thể làm được" msgid "Image can't be saved, no valid file path: \"%s\"" -msgstr "Không thể lưu ảnh, không có đường dẫn tập tin hợp lệ: \"%s\"" +msgstr "Hình ảnh không thể lưu được. Đường dẫn: \"%s\" không hợp lệ" msgid "can't save image while rendering" -msgstr "Không thể lưu ảnh khi đang kết xuất" +msgstr "không thể lưu hình ảnh trong khi đang kết xuất" + + +msgid "No images available" +msgstr "Không có hình ảnh nào có sẵn được sử dụng cả" + + +msgid "No compatible images are on the clipboard" +msgstr "Không có hình ảnh tương thích nào trong bộ nhớ tạm" msgid "Unpack 1 File" -msgstr "Gỡ Gói 1 Tập Tin" +msgstr "Tháo Gỡ 1 Tập Tin" msgid "Unpack %d Files" -msgstr "Gỡ Gói %d Tập Tin" +msgstr "Tháo Gỡ %d Tập Tin" msgid "No packed files to unpack" -msgstr "Không có tập tin được gói lại cho gỡ gói" +msgstr "Không thấy có các tập tin đóng gói để tháo gỡ" msgid "No packed file" -msgstr "Không có tếp được gói lại" +msgstr "Không thấy có tập tin đóng gói" msgid "Cannot set relative paths with an unsaved blend file" -msgstr "Không thể đặt đường dẫn tương đối với tập tin .blend chưa lưu" +msgstr "Không thể đặt đường dẫn tương đối với một tập tin .blend chưa được lưu" msgid "Cannot set absolute paths with an unsaved blend file" -msgstr "Không thể đặt đường dẫn tuyệt đối với tập tin .blend chưa lưu" +msgstr "Không thể đặt đường dẫn tuyệt đối với một tập tin .blend chưa được lưu" msgid "Joints" -msgstr "Khớp" +msgstr "Khớp Nối" msgid "(Key) " -msgstr "(Mẫu)" +msgstr "(Khóa) " msgid "Verts:%s/%s | Edges:%s/%s | Faces:%s/%s | Tris:%s" -msgstr "Đỉnh:%s/%s | Cạnh:%s/%s | Mặt:%s/%s | TamGiác:%s" +msgstr "Đỉnh:%s/%s | Cạnh:%s/%s | B.Mặt:%s/%s | T.Giác:%s" msgid "Joints:%s/%s | Bones:%s/%s" -msgstr "Khớp:%s/%s | Xương:%s/%s" +msgstr "KhNối:%s/%s | Xương:%s/%s" msgid "Verts:%s/%s" -msgstr "Đỉnh:%s/%s" +msgstr "Điểm Đỉnh:%s/%s" msgid "Bones:%s/%s" @@ -111821,203 +124248,255 @@ msgstr "Xương:%s/%s" msgid "Layers:%s | Frames:%s | Strokes:%s | Points:%s" -msgstr "Lớp:%s | Bức Ảnh:%s | Nét:%s | Điểm:%s" +msgstr "TLớp:%s | KhHình:%s | Nét Vẽ:%s | Điểm:%s" msgid "Verts:%s | Tris:%s" -msgstr "Đỉnh:%s | TamGiác:%s" +msgstr "Đỉnh:%s | TGiác:%s" + + +msgid "Verts:%s | Faces:%s" +msgstr "Đỉnh:%s | Mặt:%s" msgid "Verts:%s | Faces:%s | Tris:%s" -msgstr "Đỉnh:%s | Mặt:%s | TamGiác:%s" +msgstr "Điểm đỉnh:%s | Các mặt:%s | Tam giác:%s" msgid " | Objects:%s/%s" -msgstr " | VậtThể:%s/%s" +msgstr " | Đối tượng:%s/%s" + + +msgid "Duration: %s (Frame %i/%i)" +msgstr "Thời lượng: %s (Khung Hình %i/%i)" msgid "Memory: %s" -msgstr "BộNhớ: %s" +msgstr "Bộ Nhớ: %s" msgid "VRAM: %.1f/%.1f GiB" -msgstr "VRAM: %.1f/%.1f GiB" +msgstr "Bộ Nhớ Video: %.1f/%.1f GiB" msgid "VRAM: %.1f GiB Free" -msgstr "VRAM %.1f GiB Rỗng" +msgstr "Bộ Nhớ Video: %.1f GiB Khả Dụng" msgid "Sync Length" -msgstr "Bề Dài Đồng Bộ" +msgstr "Đồng Bộ Hóa Độ Dài" msgid "Now" -msgstr "Bây Giờ" +msgstr "Ngay Bây Giờ" msgid "Playback Scale" -msgstr "Phóng To Hát Lại" +msgstr "Đổi Tỷ Lệ Chơi Lại" msgid "Active Strip Name" -msgstr "Tên Đoạn Hoạt Động" +msgstr "Tên Dải đang Hoạt Động" msgid "No AnimData blocks to enter tweak mode for" -msgstr "Không có cục Dữ Liệu Hoạt Hình để vào chế độ chỉnh" +msgstr "Không có khối dữ liệu hành động nào để bước vào chế độ hiệu chỉnh cả" msgid "No active strip(s) to enter tweak mode on" -msgstr "Không có đoạn hoạt động để vào chế độ chỉnh" +msgstr "Không có dải phim nào đang hoạt động để bước vào chế độ hiệu chỉnh cả" msgid "No AnimData blocks in tweak mode to exit from" -msgstr "Không có cục Dữ Liệu Hoạt Hình trong chế độ chỉnh để thoát" +msgstr "Không có khối Dữ Liệu Hoạt Họa nào trong chế độ hiệu chỉnh để thoát ra cả" msgid "No active track(s) to add strip to, select an existing track or add one before trying again" -msgstr "Không có rãnh nào hoạt động để thêm đoạn, chọn một rãnh tồn tại hay tạo một rãnh trước thử làm nữa" +msgstr "Không có rãnh nào đang hoạt động để thêm dải phim vào cả, chọn một rãnh hiện tồn tại, hoặc cho thêm một rãnh mới trước khi thử lại nhé" msgid "No valid action to add" -msgstr "Không có hành động hợp lệ để thêm" +msgstr "Không có hành động hợp lệ nào để thêm vào cả" msgid "Needs at least a pair of adjacent selected strips with a gap between them" -msgstr "Cần ít nhất hai đoạn kề nhau có cách hở giữa" +msgstr "Cần ít nhất hai dải chọn nằm kề nhau với một kẽ hở ở giữa chúng" + + +msgid "Cannot swap selected strips because they will overlap each other in their new places" +msgstr "Không thể hoán đổi các dải đã chọn vì chúng sẽ chồng lên nhau ở vị trí mới của chúng được" msgid "Cannot swap selected strips as they will not be able to fit in their new places" -msgstr "Không thể trao đổi các đoạn được chọn vì chúng nó không vừa chỗ mới của chúng nó" +msgstr "Không thể tráo đổi các dải đã chọn vì chúng không khít vừa chỗ mới của chúng được" msgid "Action '%s' does not specify what data-blocks it can be used on (try setting the 'ID Root Type' setting from the data-blocks editor for this action to avoid future problems)" -msgstr "Hành động '%s' không xác định nó có thể dùng với cục dữ liệu nào (thử đặt cài đặt 'ID Loại Rễ' trong Trình Biên Soạn Cục Dữ Liệu cho hành động này để tránh vấn đề trong tương lại)" +msgstr "Hành động '%s' không xác định khối dữ liệu nào nó có thể sử dụng (thử đặt 'ID Root Type' (Loại Gốc ID) trong trình biên soạn khối dữ liệu hành động này để tránh những vấn đề trong tương lai)" msgid "Could not add action '%s' as it cannot be used relative to ID-blocks of type '%s'" -msgstr "Không thể thêm hành động '%s' vì không thể dùng nó tương đối với cục ID có loại '%s'" +msgstr "Không thể thêm hành động '%s' vì nó không thể được sử dụng tương đối với khối ID loại '%s'" msgid "Too many clusters of strips selected in NLA Track (%s): needs exactly 2 to be selected" -msgstr "Được chọn số lượng chùm đoạn qúa nhiều trong Rãnh NLA (%s): chỉ chọn được chính xác 2 đoạn" +msgstr "Số cụm các đoạn được chọn trong các Rãnh NLA (%s) quá nhiều: cần phải chọn đúng 2 đoạn mà thôi" msgid "Too few clusters of strips selected in NLA Track (%s): needs exactly 2 to be selected" -msgstr "Được chọn số lượng chùm đoạn qúa ít trong Rãnh NLA (%s): chỉ chọn được chính xác 2 đoạn" +msgstr "Số cụm các đoạn được chọn trong Rãnh NLA (%s) quá ít: cần phải chọn đúng 2 đoạn" msgid "Cannot swap '%s' and '%s' as one or both will not be able to fit in their new places" -msgstr "Không thể trao đổi '%s' và '%s' vì một hay cả hai không vừa chỗ mới của chúng nó" +msgstr "Không thể hoán đổi '%s' và '%s' vì một hay cả hai sẽ không thể nào khít vừa chỗ mới của chúng" msgid "Modifier could not be added to (%s : %s) (see console for details)" -msgstr "Không thể thêm bộ điều chỉnh cho (%s : %s) (xem chi tiết trong diện điều khiển)" +msgstr "Không thể thêm bộ điều chỉnh vào (%s : %s) (xem chi tiết trong bàn giao tiếp)" msgid "No active AnimData block to use (select a data-block expander first or set the appropriate flags on an AnimData block)" -msgstr "Không có cục Dữ Liệu Hoạt Hình hoạt động để dùng (trước chọn một bộ mở rộng cục dữ liệu hay đặt các cờ cần trong một cục Dữ Liệu Hoạt Hình)" +msgstr "Không có khối Dữ Liệu Hoạt Họa nào đang hoạt động để sử dụng (chọn một trình mở rộng khối dữ liệu trước đã, hoặc sắp đặt các dấu cờ (flags) thích đáng cho một khối Dữ Liệu Hoạt Họa)" msgid "Internal Error - AnimData block is not valid" -msgstr "Sai Lầm Nội Bộ - Cục Dữ Liệu Hoạt Hình không hợp lệ" +msgstr "Lỗi nội bộ xảy ra - khối Dữ Liệu Hoạt Họa (AnimData) không hợp lệ" msgid "Cannot push down actions while tweaking a strip's action, exit tweak mode first" -msgstr "Không thể đẩy xuống hành động khi đang chỉnh hành động của một đoạn, hãy thoát chế độ chỉnh trước" +msgstr "Không thể đẩy các hành động xuống trong khi đang hiệu chỉnh hành động của một đoạn phim, hãy thoát khỏi chế độ hiệu chỉnh trước đã" msgid "No active action to push down" -msgstr "Không có hành động hoạt động để đẩy xuống" +msgstr "Không có hành động đang hoạt động nào để đẩy xuống" msgid "Select an existing NLA Track or an empty action line first" -msgstr "Chọn một Rãnh NLA tồn tại hay một dòng hành động rỗng trước" +msgstr "Chọn một Rãnh NLA hiện tồn tại hoặc một dòng hành động trống trước đã" + + +msgid "" +"Node group assets not assigned to a catalog.\n" +"Catalogs can be assigned in the Asset Browser" +msgstr "" +"Tài sản nhóm nút chưa được ấn định vào một danh mục nào cả.\n" +"Danh mục có thể được ấn định trong Trình Duyệt Tài Sản" + + +msgid "The internal clipboard is empty" +msgstr "Bộ nhớ tạm nội bộ trống rỗng" msgid "Some nodes references could not be restored, will be left empty" -msgstr "Vài tham chiếu giao điểm không thể hoàn lại, sẽ bị bỏ trống" +msgstr "Một số tham chiếu của các nút không thể khôi phục lại được, sẽ để trống" + + +msgid "Cannot add node %s into node tree %s: %s" +msgstr "Không thể cho thêm nút %s vào cây nút %s: %s được" msgid "Cannot add node %s into node tree %s" -msgstr "Không thêm giao điểm %s vào cây giao điểm %s" +msgstr "Không thể cho thêm nút %s vào cây nút %s được" msgid "Label Size" -msgstr "Cỡ Nhãn" +msgstr "Kích Thước Nhãn" msgid "Frame: %d" -msgstr "Bức Ảnh: %d" +msgstr "Khung: %d" msgid "Matte Objects:" -msgstr "Vật Thể Mặt Nạ Mã:" +msgstr "Đối Tượng Lớp Vẽ Lồng:" msgid "Add Crypto Layer" -msgstr "Thêm Lớp Mặt Nạ Mã" +msgstr "Thêm Tầng Bí Mật" msgid "Remove Crypto Layer" -msgstr "Xóa Lớp Mặt Nạ Mã" +msgstr "Xóa Tầng Bí Mật" msgid "Matte ID:" -msgstr "ID Mặt Nạ Mã:" +msgstr "ID của Lớp Vẽ Lồng (Matte):" msgid "Squash" -msgstr "Nhẹp" +msgstr "Nén Ép" msgid "Undefined Socket Type" -msgstr "Loại Ổ Cắm Không Xác Định" +msgstr "Thể Loại Ổ Cắm Chưa Xác Định" msgid "Could not determine type of group node" -msgstr "Không thể quyết định loại của nhóm điểm" +msgstr "Không thể xác định loại nút nhóm" msgid "Could not add node group" -msgstr "Không thể thêm nhóm giao điểm" +msgstr "Không thể thêm một nhóm nút" msgid "Could not add node object" -msgstr "Không thể thêm vật thể giao điểm" +msgstr "Không thể thêm đối tượng nút" msgid "Could not add node collection" -msgstr "Không thể thêm sưu tập giao điểm" +msgstr "Không thể thêm bộ sưu tập nút" msgid "Could not find node collection socket" -msgstr "Không thể tìm ổ cắm sưu tập giao điểm" +msgstr "Không thể tìm thấy ổ cắm của bộ sưu tập nút" msgid "Could not add an image node" -msgstr "Không thể thêm giao điểm ảnh" +msgstr "Không thể thêm một nút hình ảnh" msgid "Could not add a mask node" -msgstr "Không thể thêm giao điểm mặt nạ" +msgstr "Không thể thêm nút màn chắn lọc" + + +msgid "Could not add material" +msgstr "Không thể thêm nguyên vật liệu" msgid "" "Can not add node group '%s' to '%s':\n" " %s" msgstr "" -"Không thể thêm nhóm giao điểm '%s' đến '%s':\n" +"Không thể thêm nhóm nút '%s' vào '%s':\n" " %s" msgid "Can not add node group '%s' to '%s'" -msgstr "Không thể thêm nhóm giao điểm '%s' đến '%s'" +msgstr "Không thể thêm nhóm nút '%s' vào '%s'" msgid "Node tree type %s undefined" -msgstr "Cây giao điểm %s chưa được xác định" +msgstr "Thể loại cây nút %s là thể loại chưa xác định" + + +msgid "Adding node groups isn't supported for custom (Python defined) node trees" +msgstr "Việc cho thêm các nhóm nút vào hiện chưa được hỗ trợ đối với các cây nút tùy chỉnh (xác định bởi Python)" + + +msgid "{} (String)" +msgstr "{} (Chuỗi Ký Tự)" + + +msgid "{} (Integer)" +msgstr "{} (Số Nguyên)" + + +msgid "{} (Float)" +msgstr "{} (Số Thực Dấu Phẩy Động)" + + +msgid "({}, {}, {}, {}) (Color)" +msgstr "({}, {}, {}, {}) (Màu)" msgid "True" @@ -112028,20 +124507,56 @@ msgid "False" msgstr "Sai" +msgid "Value has not been logged" +msgstr "Giá trị chưa được ghi nhật ký" + + +msgid "Integer field based on:" +msgstr "Trường số nguyên dựa trên:" + + +msgid "Float field based on:" +msgstr "Trường số thực dấu phẩy động dựa trên:" + + +msgid "Vector field based on:" +msgstr "Trường vectơ dựa trên:" + + +msgid "Boolean field based on:" +msgstr "Trường Boolean dựa trên:" + + +msgid "String field based on:" +msgstr "Trường chuỗi ký tự dựa trên:" + + +msgid "Color field based on:" +msgstr "Trường màu sắc dựa trên:" + + +msgid "Rotation field based on:" +msgstr "Trường xoay chiều dựa trên:" + + msgid "Empty Geometry" -msgstr "Hình Dạng Trống Rỗng" +msgstr "Hình Học Trống" msgid "Geometry:" -msgstr "Hình Dạng:" +msgstr "Hình Học:" msgid "• Mesh: %s vertices, %s edges, %s faces" -msgstr "• Mạng lưới: %s đỉnh, %s cạnh, %s mặt" +msgstr "• Khung Lưới: %s điểm đỉnh, %s cạnh, %s các mặt" msgid "• Point Cloud: %s points" -msgstr "• Mây Điểm: %s điểm" +msgstr "• Đám Mây Điểm: %s điểm" + + +msgid "• Curve: %s points, %s splines" +msgstr "• Đường Cong: %s điểm, %s chốt trục" msgid "• Instances: %s" @@ -112049,15 +124564,15 @@ msgstr "• Thực Thể: %s" msgid "• Volume" -msgstr "• Thể Tích" +msgstr "• Thể Tích/Khối" msgid "• Edit Curves: %s, %s" -msgstr "• Biên Tập Đường Cong: %s, %s" +msgstr "• Biên Soạn Đường Cong: %s, %s" msgid "positions" -msgstr "các vị Trí" +msgstr "vị trí" msgid "no positions" @@ -112065,7 +124580,7 @@ msgstr "không có vị trí" msgid "matrices" -msgstr "các mă trận" +msgstr "các ma trận" msgid "no matrices" @@ -112073,15 +124588,19 @@ msgstr "không có ma trận" msgid "Supported: All Types" -msgstr "Được Hỗ Trợ: Hết Loại" +msgstr "Hỗ Trợ: Toàn Bộ các Thể Loại" msgid "Supported: " -msgstr "Được Hỗ Trợ: " +msgstr "Hỗ Trợ: " + + +msgid "Unknown socket value. Either the socket was not used or its value was not logged during the last evaluation" +msgstr "Giá trị ổ cắm chưa biết đến. Hoặc là ổ cắm không được sử dụng, hoặc giá trị của nó không được ghi lại, trong lần tính toán sau cùng" msgid "Accessed named attributes:" -msgstr "Đặc điểm có tên được đến:" +msgstr "Các thuộc tính được đặt tên đã truy cập:" msgid "read" @@ -112089,186 +124608,210 @@ msgstr "đọc" msgid "write" -msgstr "ghi" +msgstr "viết" msgid "remove" -msgstr "xóa" +msgstr "xóa/loại bỏ" msgid "Attributes with these names used within the group may conflict with existing attributes" -msgstr "Đặc điểm có các tên này được dùng trong nhóm có thể tạo mẫu thuận với đặc điểm đang tồn tại" +msgstr "Các thuộc tính được đặt tên này được sử dụng nội trong nhóm có thể xung đột với các thuộc tính hiện có" + + +msgid " Named Attribute" +msgstr " Thuộc Tính được Đặt Tên" + + +msgid " Named Attributes" +msgstr " Thuộc Tính được Đặt Tên" msgid "The execution time from the node tree's latest evaluation. For frame and group nodes, the time for all sub-nodes" -msgstr "Thời gian thị hành từ thời tính toán của cây giao điểm cuối cùng. Cho giao điểm khung và nhóm, là thời gian cho tất cả hạ giao điểm" +msgstr "Thời gian thực hiện từ lần đánh giá gần đây nhất của cây nút. Đối với các nút khung hình và nút nhóm là thời gian cho toàn bộ các nút thứ" msgid "Text not used by any node, no update done" -msgstr "Không có giao điểm nào dùng văn bản này, không nâng cấp" +msgstr "Văn bản không được bất cứ một nút nào sử dụng cả. Bỏ qua quá trình cập nhật" msgid "Not inside node group" -msgstr "Không ở trong nhóm giao điểm" +msgstr "Không nằm bên trong nhóm nút" msgid "Cannot separate nodes" -msgstr "Không thể chẻ các giao điểm" +msgstr "Không thể phân rẽ các nút được" msgid "" "Can not add node '%s' in a group:\n" " %s" msgstr "" -"Không thể thêm giao điểm '%s' trong một nhóm:\n" +"Không thể thêm nút '%s' trong một nhóm:\n" " %s" msgid "Can not add node '%s' in a group" -msgstr "Không thể thêm giao điểm '%s' trong nhóm" +msgstr "Không thể thêm nút '%s' trong một nhóm" + + +msgid "Can not add zone input node '%s' to a group without its paired output '%s'" +msgstr "Không thể cho thêm nút đầu vào của vùng '%s' vào một nhóm mà không có đầu ra ghép đôi của nó '%s'" + + +msgid "Can not add zone output node '%s' to a group without its paired input '%s'" +msgstr "Không thể cho thêm nút đầu ra của vùng '%s' vào một nhóm mà không có đầu vào ghép đôi của nó '%s'" + + +msgid "Can not insert group '%s' in '%s'" +msgstr "Không thể chèn thêm nhóm '%s' vào '%s' được" msgid "Disconnect" -msgstr "Ngắt" +msgstr "Ngắt mạch" msgid "Dependency Loop" -msgstr "Lặp Vòng Ngờ Nhau" +msgstr "Sự Phụ Thuộc bị Luẩn Quẩn trong vòng Tuần Hoàn" msgid "Add node to input" -msgstr "Thêm giao điểm vào ngõ vào" +msgstr "Thêm nút cho đầu vào" msgid "Remove nodes connected to the input" -msgstr "Xoá các giao điểm kết nối với ngõ vào" +msgstr "Xóa các nút liên kết với đầu vào" msgid "Disconnect nodes connected to the input" -msgstr "Ngắt giao điểm kết nối với ngõ vào" +msgstr "Ngắt các nút liên kết với đầu vào" msgid "More than one collection is selected" -msgstr "Được chọn hơn một sưu tập" +msgstr "Hơn một bộ sưu tập đã được chọn" msgid "Can't add a new collection to linked/override scene" -msgstr "Không thể thêm một sưu tập mới vào cảnh được liên kết/vượt quyền" +msgstr "Không thể thêm một bộ sưu tập mới vào cảnh kết nối/vượt quyền" msgid "No active collection" -msgstr "Không có sưu tập hoạt động" +msgstr "Không có bộ sưu tập nào đang hoạt động cả" msgid "Can't duplicate the master collection" -msgstr "Không thể sao chép sưu tập chủ" +msgstr "Không thể sao chép bộ sưu tập chủ" msgid "Could not find a valid parent collection for the new duplicate, it won't be linked to any view layer" -msgstr "Không tìm được một sưu tập phụ huynh hợp lệ cho bản sao, nó sẽ không được liên kết với bất cứ lớp nào" +msgstr "Không tìm thấy một bộ sưu tập phụ huynh nào hợp lệ cho bản sao mới cả. Nó sẽ không được kết nối với bất cứ một Tầng Góc Nhìn nào hết" msgid "Cannot add a collection to a linked/override collection/scene" -msgstr "Không thể thêm một sưu tập vào một sưu tập/cảnh được liên kết/vượt quyền" +msgstr "Không thể thêm một bộ sưu tập vào một cảnh/bộ sưu tập kết nối/vượt quyền" msgid "Can't add a color tag to a linked collection" -msgstr "Không thể thêm một nhẵn màu vào một sưu tập được liên kết" +msgstr "Không thể thêm một nhãn màu vào một bộ sưu tập kết nối" msgid "Cannot delete collection '%s', it is either a linked one used by other linked scenes/collections, or a library override one" -msgstr "Không thể xóa sưu tập '%s', nó được kết nối với những cảnh/sưu tập khác, hoặc một sưu tập đồ vượt quyền cho thư viện" +msgstr "Không thể xóa bộ sưu tập '%s' được vì nó hoặc là một vật kết nối sử dụng bởi các cảnh / bộ sưu tập liên kết khác, hoặc là một thư viện vượt quyền" msgid "Reorder" -msgstr "Sắp Xếp Lại" +msgstr "Sắp Xếp Lại Trật Tự" msgid "Copy to bone" -msgstr "Chép đến xương" +msgstr "Sao chép sang xương" msgid "Copy to object" -msgstr "Chép đến vật thể" +msgstr "Sao chép sang đối tượng" msgid "Link all to bone" -msgstr "Liên kết đến hết xương" +msgstr "Kết nối toàn bộ với xương" msgid "Link all to object" -msgstr "Liên kết đến hết vật thể" +msgstr "Kết nối toàn bộ với đối tượng" msgid "Link before collection" -msgstr "Liên kết trước thành sưu tập" +msgstr "Kết nối trước bộ sưu tập" msgid "Move before collection" -msgstr "Di chuyển trước thành sưu tập" +msgstr "Di chuyển về đứng trước bộ sưu tập" msgid "Link between collections" -msgstr "Liên kết giữa sưu tập" +msgstr "Kết nối giữa các bộ sưu tập" msgid "Move between collections" -msgstr "Truyền giữa sưu tập" +msgstr "Di chuyển giữa các bộ sưu tập" msgid "Link after collection" -msgstr "Liên kết sau thành sưu tập" +msgstr "Kết nối sau bộ sưu tập" msgid "Move after collection" -msgstr "Truyền đến phía sau sưu tập" +msgstr "Chuyển về đứng sau bộ sưu tập" msgid "Link inside collection" -msgstr "Liên kết trong sưu tập" +msgstr "Liên kết bên trong bộ sưu tập" msgid "Move inside collection (Ctrl to link, Shift to parent)" -msgstr "Truyền trong sưu tập (Ctrl để liên kết, Shift để làm phụ huynh)" +msgstr "Di chuyển vào trong bộ sưu tập (Ctrl để kết nối, Shift để phụ huynh hóa)" msgid "Move inside collection (Ctrl to link)" -msgstr "Di chuyển trong sưu tập (Ctrl để liên kết)" +msgstr "Di chuyển vào trong bộ sưu tập (Ctrl để kết nối)" msgid "Can't edit library linked or non-editable override object(s)" -msgstr "Không thể biện tập vật thể được thư viện liên kết hay vượt quyền không thể biên tập" +msgstr "Không thể biên soạn thư viện liên kết hoặc (các) đối tượng vượt quyền không thể chỉnh sửa được" msgid "Use view layer for rendering" -msgstr "Dùng lớp màn để kết xuất" +msgstr "Dùng Tầng Góc Nhìn để kết xuất" msgid "" "Temporarily hide in viewport\n" "* Shift to set children" msgstr "" -"Tạm thời ẩn trong màn chiếu\n" +"Tạm thời ẩn giấu trong cổng nhìn\n" "* Shift để đặt con cái" msgid "" "Disable selection in viewport\n" "* Shift to set children" -msgstr "Tắt sự lựa chọn trong màn chiếu* Shift để đặt con cái" +msgstr "" +"Vô hiệu hóa lựa chọn trong cổng nhìn\n" +"* Shift để đặt con cái" msgid "" "Globally disable in viewports\n" "* Shift to set children" -msgstr "Tắt trong hết màn chiếu* Shift để đặt con cái" +msgstr "" +"Vô hiệu hóa toàn cầu trong cổng nhìn\n" +"* Shift để đặt con cái" msgid "" "Globally disable in renders\n" "* Shift to set children" msgstr "" -"Tắt trong hết kết xuất\n" +"Vô hiệu hóa toàn cầu trong kết xuất\n" "* Shift để đặt con cái" @@ -112276,7 +124819,7 @@ msgid "" "Restrict visibility in the 3D View\n" "* Shift to set children" msgstr "" -"Hạn chế hiển thị trong màn chiếu 3D\n" +"Hạn chế tính hữu hình trong khung nhìn 3D\n" "* Shift để đặt con cái" @@ -112284,110 +124827,152 @@ msgid "" "Restrict selection in the 3D View\n" "* Shift to set children" msgstr "" -"Hạn chế sự lựa chọn trong màn chiếu 3D\n" +"Hạn chế lựa chọn trong khung nhìn 3D\n" "* Shift để đặt con cái" msgid "Restrict visibility in the 3D View" -msgstr "Hạn chế hiển thị trong màn 3D" +msgstr "Hạn chế tính hữu hình trong Góc Nhìn 3D" msgid "Restrict editing of strokes and keyframes in this layer" -msgstr "Hạn chế biên tập nét và bức ảnh mẫu trong lớp này" +msgstr "Hạn chế biên soạn nét vẽ và khung hình trong tầng lớp này" msgid "" "Temporarily hide in viewport\n" "* Ctrl to isolate collection\n" "* Shift to set inside collections and objects" -msgstr "Tạm thời ẩn trong màn chiếu* Ctrl để cô lập sưu tập* Shift để đặt trong sưu tập và vật thể" +msgstr "" +"Tạm thời ẩn giấu trong cổng nhìn\n" +"* Ctrl để cô lập bộ sưu tập\n" +"* Shift để đặt bên trong các bộ sưu tập và các đối tượng" msgid "" "Mask out objects in collection from view layer\n" "* Ctrl to isolate collection\n" "* Shift to set inside collections" -msgstr "Dùng mặt nạ để trừ loại vật thể trong sưu tập từ lớp hiển thị* Ctrl để cô lập sưu tập* Shift để đặt trong sưu tập và vật thể" +msgstr "" +"Lọc chọn các đối tượng ra trong bộ sưu tập ra trong tầng góc nhìn\n" +"* Ctrl để cô lập bộ sưu tập\n" +"* Shift để đặt bên trong bộ sưu tập" msgid "" "Objects in collection only contribute indirectly (through shadows and reflections) in the view layer\n" "* Ctrl to isolate collection\n" "* Shift to set inside collections" -msgstr "Vật thể trong sưu tập chỉ góp phần kiểu gián tiếp (bằng bóng tối và phản xạ) trong lớp hiển thị* Ctrl để cô lập sưu tập* Shift để đặt trong sưu tập và vật thể" +msgstr "" +"Các đối tượng trong bộ sưu tập chỉ đóng góp gián tiếp (thông qua bóng tối và ánh phản quang) mà thôi trong tầng góc nhìn\n" +"* Ctrl để cô lập bộ sưu tập\n" +"* Shift để sắp đặt bên trong bộ sưu tập" msgid "" "Globally disable in viewports\n" "* Ctrl to isolate collection\n" "* Shift to set inside collections and objects" -msgstr "Tắt trong hết màn chiếu* Ctrl để cô lập sưu tập* Shift để đặt trong sưu tập và vật thể" +msgstr "" +"Vô hiệu hóa toàn cầu trong cổng nhìn\n" +"* Ctrl để cô lập bộ sưu tập\n" +"* Shift để đặt bên trong bộ sưu tập và đối tượng" msgid "" "Globally disable in renders\n" "* Ctrl to isolate collection\n" "* Shift to set inside collections and objects" -msgstr "Tắt trong hết kết xuất* Ctrl để cô lập sưu tập* Shift để đặt trong sưu tập và vật thể" +msgstr "" +"Vô hiệu hóa toàn cầu trong kết xuất\n" +"* Ctrl để cô lập bộ sưu tập\n" +"* Shift để đặt bên trong bộ sưu tập và đối tượng" msgid "" "Disable selection in viewport\n" "* Ctrl to isolate collection\n" "* Shift to set inside collections and objects" -msgstr "Tắt sự lựa chọn trong màn chiếu* Ctrl để cô lập sưu tập* Shift để đặt trong sưu tập và vật thể" +msgstr "" +"Vô hiệu hóa lựa chọn trong cổng nhìn\n" +"* Ctrl để cô lập bộ sưu tập\n" +"* Shift để đặt bên trong bộ sưu tập và đối tượng" msgid "Number of users of this data-block" -msgstr "Số lượng người dùng của cục dữ liệu này" +msgstr "Số lượng người dùng của khối dữ liệu này" msgid "Data-block will be retained using a fake user" -msgstr "Sẽ giử lại cục dữ liệu bằng dùng một người dùng giả" +msgstr "Khối dữ liệu sẽ được giữ lại bằng một người dùng giả" msgid "Data-block has no users and will be deleted" -msgstr "Cục dữ liệu không có người dùng và sẽ bị xóa" +msgstr "Khối dữ liệu không có người dùng và sẽ bị xóa đi" msgid "Change the object in the current mode" -msgstr "Đổi vật thể trong chế độ hiện tại" +msgstr "Đổi đối tượng trong chế độ hiện tại" msgid "Remove from the current mode" -msgstr "Xóa từ chế độ hiện tại" +msgstr "Xóa khỏi chế độ hiện tại" msgid "" "Change the object in the current mode\n" "* Ctrl to add to the current mode" msgstr "" -"Đổi vật thể trong chế độ hiện tại\n" -"* Ctrl để thêm vào chế độ hịan tại" +"Đổi đối tượng trong chế độ hiện tại\n" +"* Ctrl để thêm vào chế độ hiện tại" msgid "Can't edit library or non-editable override data" -msgstr "Không thể biên tập dữ liệu thư viện hoặc đồ vượt quyền không thể biên tập" +msgstr "Không thể biên soạn thư viện hoặc dữ liệu vượt quyền không thể chỉnh sửa được" msgid "Library path '%s' does not exist, correct this before saving" -msgstr "Đường dẫn '%s' không tồn tại, sửa này trước lưu" +msgstr "Đường dẫn '%s' không tồn tại, xin sửa lại khi trước lưu" msgid "Library path '%s' is now valid, please reload the library" -msgstr "Đường dẫn thư viện '%s' hợp lệ rồi, xin nhập lại thư viện" +msgstr "Đường dẫn thư viện '%s' đã hợp lệ rồi, xin tái nạp thư viện" + + +msgid "Purging %d unused data-blocks (" +msgstr "Đang tước bỏ %d khối dữ liệu không sử dụng đến (" msgid "). Click here to proceed..." -msgstr "). Bấm đầy để làm tiếp theo..." +msgstr "). Bấm vào đây để thi hành..." + + +msgid "Not an editable name" +msgstr "Không phải là một tên có thể chỉnh sửa được" + + +msgid "Sequence names are not editable from the Outliner" +msgstr "Không thể chỉnh sửa các tên trình tự trong Mục Lục được" + + +msgid "External library data is not editable" +msgstr "Dữ liệu thư viện bên ngoài không thể chỉnh sửa được" + + +msgid "Overridden data-blocks names are not editable" +msgstr "Tên khối dữ liệu đã vượt quyền không thể chỉnh sửa được" + + +msgid "Library path is not editable, use the Relocate operation" +msgstr "Không thể biên soạn đường dẫn thư viện được, xin hãy sử dụng thao tác Đổi Vị Trí (Relocate) nhé" msgid "No active item to rename" -msgstr "Không có mặt hàng hoạt động để đổi tên" +msgstr "Không có phần tử nào đang hoạt động để có thể đổi tên cả" msgid "No selected data-blocks to copy" -msgstr "Không có cục dữ liệu được chọn để chép" +msgstr "Không có khối dữ liệu nào đã được chọn để sao chép cả" msgid "No data to paste" @@ -112395,279 +124980,335 @@ msgstr "Không có dữ liệu để dán" msgid "Operation requires an active keying set" -msgstr "Thao tác yên cầu một tập bức ảnh mẫu hoạt động" +msgstr "Thao tác yêu cầu một bộ khóa đang ở chế độ hoạt động" msgid "No orphaned data-blocks to purge" -msgstr "Không có cục dữ liệu mồ côi để xóa" +msgstr "Không thấy có khối dữ liệu nào mồ côi để thanh tẩy cả" msgid "Cannot delete library override id '%s', it is part of an override hierarchy" -msgstr "Không thể xóa đồ vượt quyền cho thư viện có '%s', nó là phần của một tầng bậc vượt quyền" +msgstr "Không thể xóa id vượt quyền thư viện '%s' được vì nó là một phần của hệ thống thứ bậc vượt quyền" msgid "Cannot delete indirectly linked library '%s'" -msgstr "Không thể xoá thư viện '%s' được liên kết gián tiếp" +msgstr "Không thể xóa thư viện kết nối gián tiếp '%s'" msgid "Cannot delete indirectly linked id '%s'" -msgstr "Không thể xoá id '%s' liên kết gián tiếp" +msgstr "Không thể xóa id kết nối gián tiếp '%s'" msgid "Cannot delete id '%s', indirectly used data-blocks need at least one user" -msgstr "Không thể xoá id '%s', cục dữ liệu được dùng gián tiếp cần ít nhất một người dùng" +msgstr "Không thể xóa id '%s' được. Việc sử dụng các khối dữ liệu gián tiếp cần có ít nhất một người dùng" msgid "Cannot delete currently visible workspace id '%s'" -msgstr "Không thể xóa công trường hiển thị hiện tại id %s" +msgstr "Không thể xóa id của không gian làm việc nhìn thấy được '%s'" msgid "Invalid old/new ID pair ('%s' / '%s')" -msgstr "Gặp ID cũ/mới không hợp lệ ('%s' / '%s')" +msgstr "Đôi chỉ danh ID cũ/mới không hợp lệ ('%s' / '%s')" msgid "Old ID '%s' is linked from a library, indirect usages of this data-block will not be remapped" -msgstr "ID cũ '%s' được liên kết từ một thư viện, nếu dùng cục dữ liệu này kiểu gián tiếp nó sẽ không được ánh xạ lại" +msgstr "Chỉ danh ID cũ '%s' được kết nối từ một thư viện, sự sử dụng gián tiếp khối dữ liệu này sẽ không được tái ánh xạ" msgid "Copied %d selected data-block(s)" -msgstr "Đã chép lại %d cục dữ liệu được chọn" +msgstr "Đã sao chép %d đối tượng được chọn" msgid "%d data-block(s) pasted" -msgstr "Đã dán %d cục dữ liệu" +msgstr "%d khối dữ liệu đã được dán" msgid "Cannot relocate indirectly linked library '%s'" -msgstr "Không thể di chuyển thư viện được liên kết gián tiếp '%s'" +msgstr "Không thể di chuyển thư viện kết nối gián tiếp '%s'" msgid "Deleted %d data-block(s)" -msgstr "Đã xóa %d cục dữ liệu" +msgstr "Đã xóa %d khối dữ liệu" msgid "Cannot pose non-editable data" -msgstr "Không thể đặt dạng đứng cho dữ liệu không thể biên tập" +msgstr "Không thể tạo tư thế với khối dữ liệu không thể chỉnh sửa được" msgid "Not yet implemented" -msgstr "Chưa được thực hành" +msgstr "Chưa thực hiện" + + +msgid "Cannot unlink action '%s'. It's not clear which object or object-data it should be unlinked from, there's no object or object-data as parent in the Outliner tree" +msgstr "Không thể ngắt kết nối hành động '%s' được. Vì không rõ là nó cần ngắt liên kết khỏi đối tượng hoặc dữ liệu đối tượng nào hết, hiện nay không có đối tượng hoặc dữ liệu đối tượng nào là phụ huynh trong cây Mục Lục cả" msgid "Cannot unlink material '%s'. It's not clear which object or object-data it should be unlinked from, there's no object or object-data as parent in the Outliner tree" -msgstr "Không thể gỡ vật liệu '%s'. Không rõ vặt thể nào hoặc dữ liệu vật thể nào nên được gỡ từ nó, không có vật thể nào hoặc dữ liệu vật thể nào là phụ huynh trong cây Mục Lục" +msgstr "Không thể ngắt kết nối nguyên vật liệu '%s' được. Không rõ đối tượng hoặc dữ liệu đối tượng nào là cái nên được ngắt liên kết cả, vì không có đối tượng hoặc dữ liệu đối tượng nào là phụ huynh trong cây Mục Lục (Outliner) cả" + + +msgid "Cannot unlink texture '%s'. It's not clear which freestyle line style it should be unlinked from, there's no freestyle line style as parent in the Outliner tree" +msgstr "Không thể ngắt kết nối chất liệu '%s'. Không rõ là nó nên ngắt liên kết khỏi kiểu đường nét tự do nào nữa, hiện nay không có kiểu đường nét tự do nào làm phụ huynh trong cây Mục Lục cả" + + +msgid "Cannot unlink collection '%s'. It's not clear which scene, collection or instance empties it should be unlinked from, there's no scene, collection or instance empties as parent in the Outliner tree" +msgstr "Không thể ngắt kết nối bộ sưu tập '%s' được. Không rõ là cảnh, bộ sưu tập hoặc thực thể trống rỗng nào nó cần phải ngắt liên kết khỏi nữa, hiện nay không có cảnh, bộ sưu tập hoặc thực thể trống rỗng nào với tư cách là phụ huynh trong cây Mục Lục cả" + + +msgid "Cannot unlink collection '%s' parented to another linked collection '%s'" +msgstr "Không thể hủy liên kết bộ sưu tập '%s' cái đã được phụ huynh hóa với bộ sưu tập liên kết khác '%s'" + + +msgid "Cannot unlink object '%s' parented to another linked object '%s'" +msgstr "Không thể ngắt kết nối đối tượng '%s' đã được phụ huynh hóa với một đối tượng kết nối khác '%s'" + + +msgid "Cannot unlink object '%s' from linked collection or scene '%s'" +msgstr "Không thể ngắt kết nối đối tượng '%s' khỏi bộ sưu tập hoặc cảnh đã liên kết '%s'" + + +msgid "Cannot unlink world '%s'. It's not clear which scene it should be unlinked from, there's no scene as parent in the Outliner tree" +msgstr "Không thể ngắt liên kết thế giới '%s'. Không rõ là nó nên ngắt liên kết khỏi cảnh nào, hiện không có cảnh nào là phụ huynh trong cây Mục Lục cả" + + +msgid "Could not create library override from data-block '%s', as it is not overridable" +msgstr "Không thể tạo vượt quyền thư viện từ khối dữ liệu '%s' được, vì nó không thể vượt quyền được" msgid "Invalid anchor ('%s') found, needed to create library override from data-block '%s'" -msgstr "Đã tìm neo không hợp lệ ('%s'), cần để chế tạo đồ vượt quyền cho thư viện từ cục dữ liệu '%s'" +msgstr "Đã tìm thấy neo chốt bất hợp lệ ('%s'). Cần phải kiến tạo vượt quyền thư viện từ khối dữ liệu '%s'" msgid "Could not create library override from data-block '%s', one of its parents is not overridable ('%s')" -msgstr "Không thể chế tạo đồ vượt quyền thư viện từ cục dữ liệu '%s', không thể vượt quyền được một phụ huynh của nó ('%s')" +msgstr "Không thể kiến tạo trường hợp vượt quyền thư viện từ khối dữ liệu '%s' được, một trong những phụ huynh của nó là trường hợp không thể vượt quyền ('%s')" msgid "Invalid hierarchy root ('%s') found, needed to create library override from data-block '%s'" -msgstr "Đã tìm rễ tầng bậc không hợp lệ ('%s'), cần để chế tạo đồ vượt quyền cho thư viện từ cục dữ liệu '%s'" +msgstr "Đã tìm thấy gốc thứ bậc bất hợp lệ ('%s'). Cần phải kiến tạo vượt quyền thư viện từ khối dữ liệu '%s'" msgid "Could not create library override from one or more of the selected data-blocks" -msgstr "Không thể chế tạo được đồ vượt quyền thư viện từ một hay nhiều hơn dữ liệu được chọn" +msgstr "Không thể kiến tạo trường hợp vượt quyền thư viện từ một hoặc nhiều khối dữ liệu lựa chọn" + + +msgid "Cannot clear embedded library override '%s', only overrides of real data-blocks can be directly cleared" +msgstr "Không thể xóa vượt quyền thư viện nhúng sẵn '%s' được, chỉ có thể xóa trực tiếp những vượt quyền khối dữ liệu thực mà thôi" + + +msgid "Cannot clear linked library override '%s', only local overrides can be directly cleared" +msgstr "Không thể xóa vượt quyền thư viện liên kết '%s' được, chỉ có thể vượt quyền cục bộ mà thôi" msgid "No Library Overrides" -msgstr "Không Có Đồ Vượt Quyền Thư Viện" +msgstr "Không Có Vượt Quyền Thư Viện" msgid "Contains linked library overrides that need to be resynced, updating the library is recommended" -msgstr "Đang chứa đồ vượt quyền thư viện được liên kết cần đồng bộ lại, khuyến nên nâng cấp thư viện" +msgstr "Có chứa các vượt quyền thư viện kết nối cần được đồng bộ hóa lại. Đề nghị nên cập nhật thư viện" msgid "Missing library" -msgstr "Thư Viện Bị Mất" +msgstr "Thiếu thư viện" msgid "This override data-block is not needed anymore, but was detected as user-edited" -msgstr "Cục dữ liệu vượt quyền này không cần nữa, nhưng được phát hiện đã có người dùng chỉnh sửa" +msgstr "Khối dữ liệu vượt quyền này không còn cần đến nữa, song nó được phát hiện là đã được người dùng chỉnh sửa rồi" msgid "This override data-block is unused" -msgstr "Cục dữ liệu vượt quyền này chưa được duông" +msgstr "Khối dữ liệu vượt quyền này là khối không sử dụng đến" msgid "This override property does not exist in current data, it will be removed on next .blend file save" -msgstr "Cục dữ liệu vượt quyền này không tồn tại trong dữ liệu hiện tại, nó sẽ bị xóa lần tiếp lưu tập tin .blend" +msgstr "Thuộc tính vượt quyền này không tồn tại trong dữ liệu hiện tại. Nó sẽ bị xóa đi trong lần lưu tập tin .blend sắp tới" msgid "Added through override" -msgstr "Được thêm bằng vượt quyền" +msgstr "Cho thêm thông qua vượt quyền" + + +msgid "Protected from override" +msgstr "Được bảo vệ khỏi sự vượt quyền" + + +msgid "Additive override" +msgstr "Vượt Quyền Cộng" + + +msgid "Subtractive override" +msgstr "Vượt Quyền Trừ" + + +msgid "Multiplicative override" +msgstr "Vượt Quyền Nhân" msgid "(empty)" -msgstr "(rỗng)" +msgstr "(trống/rỗng)" msgid "Strip None" -msgstr "Không Đoạn" +msgstr "Đoạn Phim Trống/Rỗng" msgid "Can't reload with running modal operators" -msgstr "Không nhập lại được khi đang chạy thao tác cách thức" +msgstr "Không thể tái nạp với các thao tác mô thái đang chạy được" msgid "Add a crossfade transition to the sequencer" -msgstr "Thêm một truyền phai vào bộ trình tự" +msgstr "Thêm một dải chuyển cảnh nhòe mờ cắt ngang vào trình phối hình" msgid "Add an add effect strip to the sequencer" -msgstr "Thêm một đoạn hiệu ứng cộng vào bộ trình tự" +msgstr "Thêm một dải hiệu ứng thêm vào trình phối hình" msgid "Add a subtract effect strip to the sequencer" -msgstr "Thêm một đoạn hiệu ứng trừ vào bộ trình tự" +msgstr "Thêm một dải hiệu ứng khấu trừ vào trình phối hình" msgid "Add an alpha over effect strip to the sequencer" -msgstr "Thêm một đoạn hiệu ứng độ đục trên vào bộ trình tự" +msgstr "Thêm một dải hiệu ứng alpha trên vào trình phối hình" msgid "Add an alpha under effect strip to the sequencer" -msgstr "Thêm một đoạn hiệu ứng độ đục dưới vào bộ trình tự" +msgstr "Thêm một dải hiệu ứng alpha dưới vào trình phối hình" msgid "Add a gamma cross transition to the sequencer" -msgstr "Thêm một truyền phai gama vào bộ trình tự" +msgstr "Thêm một dải chuyển cảnh cắt ngang gamma vào trình phối hình" msgid "Add a multiply effect strip to the sequencer" -msgstr "Thêm một đoạn hiệu ứng nhân vào bộ trình tự" +msgstr "Thêm một dải hiệu ứng nhân lên vào trình phối hình" msgid "Add an alpha over drop effect strip to the sequencer" -msgstr "Thêm một đoạn hiệu ứng thả xuồng độ đục trên vào bộ trình tự" +msgstr "Thêm một dải hiệu ứng thả trên alpha vào trình phối hình" msgid "Add a wipe transition to the sequencer" -msgstr "Thêm một truyền lau bộ trình tự" +msgstr "Thêm một chuyển cảnh gạt vào trình phối hình" msgid "Add a glow effect strip to the sequencer" -msgstr "Thêm một hiệu ứng hào quang vào bộ trình tự" +msgstr "Thêm một dải hiệu ứng hừng sáng vào trình phối hình" msgid "Add a transform effect strip to the sequencer" -msgstr "Thêm một hiệu ứng biến hóa vào bộ trình tự" +msgstr "Thêm một dải hiệu ứng biến dạng vào trình phối hình" msgid "Add a color strip to the sequencer" -msgstr "Thêm một đoạn màu sắc vào bộ trình tự" +msgstr "Thêm một dải màu sắc vào trình phối hình" msgid "Add a speed effect strip to the sequencer" -msgstr "Thêm một hiệu ứng tốc độ vào bộ trình tự" +msgstr "Thêm một dải hiệu ứng tốc độ vào trình phối hình" msgid "Add a multicam selector effect strip to the sequencer" -msgstr "Thêm một đoạn hiệu ứng chọn đa máy quay phim vào bộ trình tự" +msgstr "Thêm một dải hiệu ứng cần chọn đa máy quay vào trình phối hình" msgid "Add an adjustment layer effect strip to the sequencer" -msgstr "Thêm một đoạn hiệu ứng lớp chỉnh vào bộ trình tự" +msgstr "Thêm một dải hiệu ứng tầng lớp điều chỉnh vào trình phối hình" msgid "Add a gaussian blur effect strip to the sequencer" -msgstr "Thêm một đoạn hiệu ứng mờ hóa Gauss vào bộ trình tự" +msgstr "Thêm một dải hiệu ứng nhòe mờ gauss vào trình phối hình" msgid "Add a text strip to the sequencer" -msgstr "Thêm một đoạn văn bản vào bộ trình tự" +msgstr "Thêm một dải văn bản vào trình phối hình" msgid "Add a color mix effect strip to the sequencer" -msgstr "Thêm một đoạn hiệu ứng pha trộn màu sắc vào bộ trình tự" +msgstr "Thêm một dải hiệu ứng hòa trộn màu sắc vào trình phối hình" msgid "Movie clip not found" -msgstr "Không tìm được đoạn phim" +msgstr "Không tìm thấy đoạn phim" msgid "Mask not found" -msgstr "Mặt nạ không tìm được" +msgstr "Không tìm thấy Màn Chắn Lọc" msgid "File '%s' could not be loaded" -msgstr "Không được nhập tập tin '%s'" - - -msgid "Slip offset: %s" -msgstr "Dịch trượt: %s" - - -msgid "Slip offset: %d" -msgstr "Dịch trượt: %d" - - -msgid "Cannot apply effects to audio sequence strips" -msgstr "Không áp dụng được hiệu ứng với đoạn trình tự âm thanh" - - -msgid "Cannot apply effect to more than 3 sequence strips" -msgstr "Không thể áp dụng hiệu ứng cho hơn ba đoạn trình tự" - - -msgid "At least one selected sequence strip is needed" -msgstr "Cần chọn ít nhất một đoạn trình tự" - - -msgid "2 selected sequence strips are needed" -msgstr "Cần chọn hai đoạn trình tự" - - -msgid "TODO: in what cases does this happen?" -msgstr "CẦN LÀM: vấn đề này xuất hiện cho trường hợp nào?" - - -msgid "Cannot reassign inputs: strip has no inputs" -msgstr "Không thể công phân lại ngõ vào: đoạn không có ngõ vào nào" - - -msgid "Cannot reassign inputs: recursion detected" -msgstr "Không thể chỉ định lại các ngõ vào: đã phát hiện đệ quy" - - -msgid "No valid inputs to swap" -msgstr "Không có ngõ vào hợp lệ để trao đổi" +msgstr "Tập tin '%s' không thể nạp được" msgid "Please select all related strips" -msgstr "Làm ơn chọn tất cả đoạn liên quan" +msgstr "Làm ơn chọn toàn bộ các dải liên quan" msgid "No strips to paste" -msgstr "Không có đoạn để dán" +msgstr "Không có dải phim nào để dán cả" + + +msgid "Slip offset: %s" +msgstr "Dịch chuyển trượt đẩy: %s" + + +msgid "Slip offset: %d" +msgstr "Dịch chuyển trượt đẩy: %d" + + +msgid "Cannot apply effects to audio sequence strips" +msgstr "Không thể áp dụng các hiệu ứng vào các dải âm thanh" + + +msgid "Cannot apply effect to more than 3 sequence strips" +msgstr "Không thể áp dụng hiệu ứng cho hơn 3 dải trình tự" + + +msgid "At least one selected sequence strip is needed" +msgstr "Cần ít nhất một dải trình tự được chọn" + + +msgid "2 selected sequence strips are needed" +msgstr "Cần phải chọn 2 dải trình tự" + + +msgid "TODO: in what cases does this happen?" +msgstr "Cần Làm: vấn đề này xảy ra trong những trường hợp nào?" + + +msgid "Cannot reassign inputs: strip has no inputs" +msgstr "Không thể đổi ấn định đầu vào: dải không có đầu vào" + + +msgid "Cannot reassign inputs: recursion detected" +msgstr "Không thể đổi ấn định đầu vào: phát hiện thấy có sự hồi quy xảy ra" + + +msgid "No valid inputs to swap" +msgstr "Không có nguồn hợp lệ để hoán đổi" msgid "Please select two strips" -msgstr "Làm ơn chọn hai đoạn" +msgstr "Làm ơn chọn hai dải" msgid "One of the effect inputs is unset, cannot swap" -msgstr "Một ngõ vào hiệu ứng chưa được đặt, không thể trao đổi" +msgstr "Trong trong những đầu vào của hiệu ứng chưa được đặt, không thể hoán đổi" msgid "New effect needs more input strips" -msgstr "Hiệu ứng mới cần đoạn ngõ vào nhiều hơn" +msgstr "Hiệu ứng mới cần được cung cấp nhiều dải phim hơn" msgid "Can't create subtitle file" -msgstr "Không thể chế tạo tập tin phụ đề" +msgstr "Không kiến tạo được tập phụ đề" msgid "No subtitles (text strips) to export" -msgstr "Không có phụ để (đoạn chữ) để xuất" +msgstr "Không có phụ đề (các dòng văn bản) để xuất khẩu" msgid "Select one or more strips" -msgstr "Chọn một hay một cái trở lên đoạn" +msgstr "Chọn một hoặc nhiều dải" msgid "Can't set a negative range" @@ -112675,23 +125316,55 @@ msgstr "Không thể đặt phạm vi số âm" msgid "Proxy is not enabled for %s, skipping" -msgstr "Chưa bật đại lý cho %s, đang bỏ qua" +msgstr "Chưa bật đại diện cho %s, bỏ qua" msgid "Resolution is not selected for %s, skipping" -msgstr "Chựa chọn độ phân giải cho %s, đang bỏ qua" +msgstr "Chưa chọn độ phân giải cho %s, bỏ qua" msgid "Overwrite is not checked for %s, skipping" -msgstr "Chưa bậc ghi lại lên trên cho %s, đang bỏ qua" +msgstr "Khả năng viết đè chưa được đánh dấu kiểm cho %s, bỏ qua" msgid "Select movie or image strips" -msgstr "Chọn phim hay đoạn dãy ảnh" +msgstr "Chọn các dải phim hoặc hình ảnh" + + +msgid "Can not create key inside of speed transition" +msgstr "Không thể tạo khóa bên trong quá trình chuyển đổi tốc độ" + + +msgid "Can not create freeze frame" +msgstr "Không thể tạo khung hình đóng băng được" + + +msgid "Can not create transition" +msgstr "Không thể tạo chuyển tiếp được" + + +msgid "Retiming key must be selected" +msgstr "Khóa tính lại thời gian nhất định phải được chọn đã" + + +msgid "No keys or strips selected" +msgstr "Không có phím hoặc dải nào được chọn cả" + + +msgid "This strip type can not be retimed" +msgstr "Thể loại dải này không thể tính lại thời gian được" msgid "No active sequence!" -msgstr "Không có trình tự hoạt động!" +msgstr "Không có trình tự nào đang hoạt động cả!" + + +msgid "Rows:" +msgstr "Số Hàng:" + + +msgid "Columns:" +msgstr "Số Cột:" msgid "Class" @@ -112703,7 +125376,7 @@ msgstr "Thể Tích Sương Mù" msgid "Level Set" -msgstr "Tập Tầng" +msgstr "Tập Mức" msgid "" @@ -112711,67 +125384,83 @@ msgid "" "%3d %3d %3d %3d" msgstr "" "Màu Byte (sRGB mã hóa):\n" -"%3d %3d %3d %3d" +"%3d %3d %3d %3d" msgid "Data Set" msgstr "Tập Dữ Liệu" +msgid "Unsupported column type" +msgstr "Thể loại cột chưa được hỗ trợ" + + msgid "File Modified Outside and Inside Blender" -msgstr "Tập Tin Được Sửa Đổi Ở Ngoài Và Trong Blender" +msgstr "Tập Tin bị Thay Đổi cả ở Bên Ngoài và Bên Trong Blender" msgid "Reload from disk (ignore local changes)" -msgstr "Nhập lại từ đĩa (không quan tâm sửa đổi địa phương)" +msgstr "Nạp lại từ đĩa (bỏ qua các thay đổi địa phương)" msgid "Save to disk (ignore outside changes)" -msgstr "Lưu vào đĩa (không quan tâm sửa đổi ở ngoài)" +msgstr "Lưu ra đĩa (bỏ qua các thay đổi bên ngoài)" msgid "Make text internal (separate copy)" -msgstr "Làm văn bản nội bộ (chép riêng)" +msgstr "Lưu văn bản nội bộ (tạo bản sao riêng)" msgid "File Modified Outside Blender" -msgstr "Tập Tin Được Sửa Đổi Ở Ngoài Blender" +msgstr "Tập Tin Bị Đổi Bên Ngoài Blender" msgid "Reload from disk" -msgstr "Nhập lại từ đĩa" +msgstr "Nạp lại từ đĩa" msgid "File Deleted Outside Blender" -msgstr "Tập Tin Ở Ngoài Blender Bị Xóa" +msgstr "Tập Tin Bị Xóa Bên Ngoài Blender" msgid "Make text internal" -msgstr "Làm văn bản nội bộ" +msgstr "Lưu văn bản nội bộ" msgid "Recreate file" -msgstr "Chế tạo lại tập tin" +msgstr "Tái kiến tạo tập tin" msgid "unknown error writing file" -msgstr "sai lầm lạ khi lưu tập tin" +msgstr "lỗi không lường trước được đã xảy ra trong khi ghi tập tin" + + +msgid "unknown error statting file" +msgstr "lỗi không xác định xảy ra khi thống kê tập tin" msgid "This text has not been saved" -msgstr "Văn bản này chưa được lưu" +msgstr "Văn bản này chưa được lưu lại" msgid "Could not reopen file" -msgstr "Không thể mở lại tập tin" +msgstr "Không thể tái mở tập tin" msgid "Python disabled in this build" -msgstr "Python bị tắt trong xây dựng này" +msgstr "Python bị tắt trong phiên bản này" + + +msgid "File path property not set" +msgstr "Tính chất đường dẫn tập tin chưa được đặt" + + +msgid "No file path for \"%s\"" +msgstr "Không có đường dẫn tập tin nào cho \"%s\" cả" msgid "Cannot save text file, path \"%s\" is not writable" -msgstr "Không thể lưu tập tin văn bản, không thể ghi vào \"%s\"" +msgstr "Không thể lưu tập tin văn bản, đường dẫn đến \"%s\" là đường không thể viết được" msgid "Unable to save '%s': %s" @@ -112779,19 +125468,23 @@ msgstr "Không lưu được '%s': %s" msgid "Saved text \"%s\"" -msgstr "Đã Lưu văn bản \"%s\"" +msgstr "Văn bản đã lưu '%s'\"" msgid "Unable to stat '%s': %s" -msgstr "Không thống kê được '%s': %s" +msgstr "Không thể thống kê '%s': %s" msgid "Text not found: %s" -msgstr "Không tìm được văn bản: %s" +msgstr "Không tìm thấy văn bản: %s" + + +msgid "See '%s' in the external editor" +msgstr "Xem '%s' trong trình biên soạn bên ngoài" msgid "File '%s' cannot be opened" -msgstr "Không được mở tập tin '%s'" +msgstr "Không thể mở tập tin '%s' được" msgid "See '%s' in the text editor" @@ -112803,35 +125496,63 @@ msgstr "Không Có Tập Tin Gần Đây" msgid "Open Recent" -msgstr "Mở Gần Đây" +msgstr "Mở Tập Tin Gần Đây" msgid "Undo History" -msgstr "Lịch Sử Hủy Bước" +msgstr "Lịch Sử Hoàn Tác" + + +msgid "Registration not possible from Microsoft Store installations" +msgstr "Không thể đăng ký từ bản cài đặt Microsoft Store được" msgid "File association registered" -msgstr "Liên quan tập tin được đăng ký" +msgstr "Liên kết tập tin đã được đăng ký" msgid "Unable to register file association" -msgstr "Không thể đăng ký liên quan tập tin" +msgstr "Không thể đăng ký liên kết của tập tin" + + +msgid "Unregistration not possible from Microsoft Store installations" +msgstr "Không thể hủy đăng ký từ các bản cài đặt Microsoft Store được" + + +msgid "File association unregistered" +msgstr "Liên hệ tập tin chưa được đăng ký" + + +msgid "Unable to unregister file association" +msgstr "Không thể hủy đăng ký liên hệ tập tin được" + + +msgid "There is no asset library to remove" +msgstr "Không có thư viện tài sản nào để xóa đi cả" + + +msgid "There is no extension repository to remove" +msgstr "Không có kho lưu trữ tiện ích mở rộng để xóa" + + +msgid "Not available for Microsoft Store installations" +msgstr "Không có sẵn để cài đặt Microsoft Store" msgid "Windows-only operator" -msgstr "Thao tác chỉ cho Windows" +msgstr "Thao tác chỉ dành cho Windows" msgid "Create object instance from object-data" -msgstr "Chế tạo thực thể vật thể từ dữ liệu-vật thể" +msgstr "Thực thể hóa đối tượng từ dữ liệu-đối tượng" msgid "Control Point:" -msgstr "Điểm Kiểm Soát:" +msgstr "Điểm Điều Khiển:" msgid "Vertex:" -msgstr "Đỉnh:" +msgstr "Điểm Đỉnh:" msgid "Median:" @@ -112847,27 +125568,27 @@ msgstr "Quyền Lượng:" msgid "Vertex Data:" -msgstr "Dữ Liệu Đỉnh:" +msgstr "Dữ Liệu Điểm Đỉnh:" msgid "Vertices Data:" -msgstr "Dữ Liệu Đỉnh:" +msgstr "Dữ Liệu Điểm Đỉnh:" msgid "Bevel Weight:" -msgstr "Quyền Lượng Cạnh Tròn:" +msgstr "Trọng Lượng Bo Cạnh:" msgid "Mean Bevel Weight:" -msgstr "Quyền Lượng Xiên Trung Bình:" +msgstr "Trọng Lượng Bo Cạnh Trung Bình:" msgid "Vertex Crease:" -msgstr "Nhăn Đỉnh:" +msgstr "Nếp Gấp của Điểm Đỉnh:" msgid "Mean Vertex Crease:" -msgstr "Nhăn Trung Bình:" +msgstr "Nếp Gấp Điểm Đỉnh Trung Bình:" msgid "Radius X:" @@ -112895,15 +125616,15 @@ msgstr "Dữ Liệu Cạnh:" msgid "Crease:" -msgstr "Nhăn:" +msgstr "Miết Cạnh:" msgid "Mean Crease:" -msgstr "Nhăn Trung Bình:" +msgstr "Nếp Gấp Trung Bình:" msgid "Weight:" -msgstr "Quyền Lượng:" +msgstr "Trọng Lượng:" msgid "Radius:" @@ -112911,11 +125632,11 @@ msgstr "Bán Kính:" msgid "Tilt:" -msgstr "Nghiêng:" +msgstr "Xoay Nghiêng:" msgid "Mean Weight:" -msgstr "Quyền Lượng Trung Bình:" +msgstr "Trọng Lượng Trung Bình:" msgid "Mean Radius:" @@ -112923,11 +125644,11 @@ msgstr "Bán Kính Trung Bình:" msgid "Mean Tilt:" -msgstr "Nghiên Trung Bình:" +msgstr "Xoay Nghiêng Trung Bình:" msgid "Dimensions:" -msgstr "Kích thước:" +msgstr "Kích Thước:" msgid "4L" @@ -112935,7 +125656,7 @@ msgstr "4L" msgid "No Bone Active" -msgstr "Không Có Xương Nào Hoạt Động" +msgstr "Không Có Xương đang Hoạt Động" msgid "Radius (Parent)" @@ -112943,319 +125664,331 @@ msgstr "Bán Kính (Phụ Huynh)" msgid "Size:" -msgstr "Kích Cỡ:" +msgstr "Kích Thước:" msgid "Displays global values" -msgstr "Hiển thị giá trị toàn cầu" +msgstr "Hiển thị các giá trị toàn cầu" msgid "Displays local values" -msgstr "Hiển thị giá trị địa phương" +msgstr "Hiển thị các giá trị địa phương" msgid "Vertex weight used by Bevel modifier" -msgstr "Quyền lượng đỉnh của bộ điều chỉnh Xiên" +msgstr "Trọng lượng điểm đỉnh sử dụng bởi bộ điều chỉnh Bo Cạnh" msgid "Weight used by the Subdivision Surface modifier" -msgstr "Quyền lượng của bộ điều chỉnh Phân Hóa Bề Mặt" +msgstr "Trọng lượng sử dụng bởi bộ điều chỉnh Bề Mặt Phân Hóa" msgid "X radius used by Skin modifier" -msgstr "Bán kính X của bộ điều chỉnh Da" +msgstr "Bán kính X sử dụng bởi bộ điều chỉnh Da" msgid "Y radius used by Skin modifier" -msgstr "Bán kính Y của bộ điều chỉnh Da" +msgstr "Bán kính Y sử dụng bởi bộ điều chỉnh Da" msgid "Edge weight used by Bevel modifier" -msgstr "Quyền lượng cạnh của bộ điều chỉnh Xiên" +msgstr "Trọng lượng cạnh sử dụng bởi bộ điều chỉnh Bo Cạnh" msgid "Weight used for Soft Body Goal" -msgstr "Quyền lượng của Mục Đích Thân Mềm" +msgstr "Trọng lượng sử dụng cho Mục Tiêu của Thân Mềm" msgid "Radius of curve control points" -msgstr "Bán kính của điểm kiểm soát đường cong" +msgstr "Bán kính các điểm điều khiển của đường cong" msgid "Tilt of curve control points" -msgstr "Nghiêng của điểm kiểm soát đường cong" +msgstr "Xoay nghiêng các điểm điều khiển của đường cong" msgid "Normalize weights of active vertex (if affected groups are unlocked)" -msgstr "Đơn vị hóa quyền lượng của đỉnh hoạt động (nếu nhóm được ảnh hưởng không bị khóa)" +msgstr "Bình thường hóa trọng lượng của điểm đỉnh đang hoạt động (nếu các nhóm ảnh hưởng không bị khóa)" msgid "Copy active vertex to other selected vertices (if affected groups are unlocked)" -msgstr "Chép đỉnh hoạt động đến các đỉnh khác được chọn (nếu nhóm được ảnh hưởng không bị khóa)" +msgstr "Sao chép điểm đỉnh đang hoạt động sang các điểm đỉnh đã chọn khác (nếu các nhóm ảnh hưởng không bị khóa)" msgid "Vertex Weights" -msgstr "Quyền Lượng Đỉnh" +msgstr "Trọng Lượng Điểm Đỉnh" msgid "No active object found" -msgstr "Không tìm được vật thể hoạt động" +msgstr "Không tìm thấy đối tượng nào đang hoạt động cả" msgid "Front Orthographic" -msgstr "Trực Giao Phía Trước" +msgstr "Trực Giao Trước" msgid "Front Perspective" -msgstr "Chiếu Phối Cảnh Phiá Trước" +msgstr "Phối Cảnh Trước" msgid "Back Orthographic" -msgstr "Trực Giao Phía Sau" +msgstr "Trực Giao Sau" msgid "Back Perspective" -msgstr "Chiếu Phối Cảnh Phía Trên" +msgstr "Phối Cảnh Sau" msgid "Top Orthographic" -msgstr "Trực Giao Phia Trên" +msgstr "Trực Giao Đỉnh" msgid "Top Perspective" -msgstr "Chiếu Phối Cảnh Phía Trên" +msgstr "Phối Cảnh Đỉnh" msgid "Bottom Orthographic" -msgstr "Trực Giao Phía Dưới" +msgstr "Trực Giao Đáy" msgid "Bottom Perspective" -msgstr "Chiếu Phối Cảnh Phía Dưới" +msgstr "Phối Cảnh Đáy" msgid "Right Orthographic" -msgstr "Trực Giao Phiá Phải" +msgstr "Trực Giao Bên Phải" msgid "Right Perspective" -msgstr "Chiếu Phối Cảnh Phía Phải" +msgstr "Phối Cảnh Bên Phải" msgid "Left Orthographic" -msgstr "Trực Giao Phía Trái" +msgstr "Trực Giao Bên Trái" msgid "Left Perspective" -msgstr "Chiếu Phối Cảnh Phiá Trái" +msgstr "Phối Cảnh Bên Trái" msgid "Camera Perspective" -msgstr "Máy Quay Phim - Chiếu Phối Cảnh" +msgstr "Máy Quay Phim Phối Cảnh" msgid "Camera Orthographic" -msgstr "Máy Quay Phim - Trực Giao" +msgstr "Máy Quay Phim Trực Giao" msgid "Camera Panoramic" -msgstr "Máy Quay Phim - Toàn Cảnh" +msgstr "Máy Quay Phim Màn Ảnh Rộng" msgid "Object as Camera" -msgstr "Vật Thể Như Máy Quay Phim" +msgstr "Đối Tượng làm Máy Quay Phim" msgid "User Orthographic" -msgstr "Người Dùng Trực Giao" +msgstr "Trực Giao của Người Dùng" msgid "User Perspective" -msgstr "Người Dùng Chiếu Phối Cảnh" +msgstr "Phối Cảnh của Người Dùng" msgid " (Local)" -msgstr " (Địa Phương)" +msgstr " (Cục Bộ)" msgid " (Clipped)" -msgstr " (Bị Cắt)" +msgstr " (Cắt Xén)" + + +msgid " (Viewer)" +msgstr " (Bộ Quan Sát)" + + +msgid "fps: %.2f" +msgstr "hình/giây: %.2f" + + +msgid "fps: %i" +msgstr "hình/giây: %i" msgid "X-Ray not available in current mode" -msgstr "Không được dùng X-Quang trong chế độ hiện tại" +msgstr "X-Quang không hoạt động trong chế độ hiện tại" msgid "Cannot remove background image %d from camera '%s', as it is from the linked reference data" -msgstr "Không thể xóa ảnh nền %d từ máy quay phim '%s', gì nó từ dữ liệu tham chiếu được liên kết" +msgstr "Không thể xóa hình nền %d khỏi máy ảnh '%s', vì nó là từ dữ liệu tham chiếu liên kết" msgid "Gizmos hidden in this view" -msgstr "Đồ đạc được ẩn trong màn này" +msgstr "Gizmos bị ẩn giấu trong góc nhìn này" msgid "Cannot navigate a camera from an external library or non-editable override" -msgstr "Không thể chuyển hướng một máy quay phim từ một thư viện ngoài hoặc đồ vượt quyền không thể biên tập" +msgstr "Không thể điều hướng máy ảnh từ thư viện bên ngoài hoặc sự vượt quyền không thể chỉnh sửa được" msgid "Cannot fly when the view offset is locked" -msgstr "Không thể bay khi dịch màn chiếu bị khóa" +msgstr "Không thể bay lượn khi dịch chuyển góc nhìn bị khóa" msgid "Cannot fly an object with constraints" -msgstr "Không thể lái vật thể bay bằng ràng buộc" +msgstr "Không thể cho đối tượng có các ràng buộc bay được" msgid "Cannot dolly when the view offset is locked" -msgstr "Không thể trượt khi dịch màn chiếu bị khóa" +msgstr "Không thể lướt được khi dịch chuyển góc nhìn bị khóa" msgid "Cannot navigate when the view offset is locked" -msgstr "Không thể chuyển hướng khi dịch màn bị khóa" +msgstr "Không thể di chuyển khi dịch chuyển của góc nhìn bị khóa" msgid "Cannot navigate an object with constraints" -msgstr "Không thể chuyển hướng một vật thể có ràng buộc" +msgstr "Không thể điều hành một đối tượng có các ràng buộc" msgid "Depth too large" -msgstr "Độ sâu qúa lớn" +msgstr "Độ sâu quá lớn" msgid "No objects to paste" -msgstr "Không có vật thể để dán" +msgstr "Không có đối tượng nào để dán cả" msgid "Copied %d selected object(s)" -msgstr "Đã chép lại %d vật thể được chọn" +msgstr "Đã sao chép %d đối tượng được chọn" msgid "%d object(s) pasted" -msgstr "Đã dán %d vật thể" +msgstr "%d đối tượng đã được dán" msgid "No active element found!" -msgstr "Không tìm được phần tử hoạt động nào!" +msgstr "Không tìm thấy yếu tố đang hoạt động nào!" msgid "No active camera" -msgstr "Không có máy quay phim hoạt động" +msgstr "Không có máy quay phim đang hoạt động" msgid "No more than 16 local views" -msgstr "Không cho hơn 16 màn địa phương" +msgstr "Không thể có hơn 16 Góc Nhìn Cục Bộ được" msgid "No object selected" -msgstr "Không chọn được vật thể nào" +msgstr "Không có đối tượng nào đã được chọn cả" msgid "Auto Keying On" -msgstr "Bật Bức Ảnh Mẫu Tự Động" +msgstr "Bật Khung Khóa Tự Động" msgid "along X" -msgstr "hướng X" +msgstr "theo trục X" msgid "along %s X" -msgstr "hươứng %s X" +msgstr "theo trục X %s" msgid "along Y" -msgstr "hướng Y" +msgstr "theo trục Y" msgid "along %s Y" -msgstr "hướng %s Y" +msgstr "theo trục Y %s" msgid "along Z" -msgstr "hướng Z" +msgstr "theo trục Z" msgid "along %s Z" -msgstr "hướng %s Z" +msgstr "theo trục Z %s" msgid "locking %s X" -msgstr "đang khóa %s X" +msgstr "khóa trục X %s" msgid "locking %s Y" -msgstr "đang khóa %s Y" +msgstr "khóa trục Y %s" msgid "locking %s Z" -msgstr "đang khóa %s Z" +msgstr "khóa trục Z %s" msgid "along local Z" -msgstr "hướng Z địa phương" +msgstr "theo trục Z địa phương" msgid " along Y axis" -msgstr "hướng trục Y" +msgstr " quanh trục Y" msgid " along X axis" -msgstr "hướng trục X" +msgstr " quanh trục X" msgid " locking %s X axis" -msgstr "đang khóa %s trục X" +msgstr " khóa trục X %s" msgid " along %s X axis" -msgstr "hướng %s trục X" +msgstr " quanh trục X %s" msgid " locking %s Y axis" -msgstr "đang khóa %s trục Y" +msgstr " khóa trục Y %s" msgid " along %s Y axis" -msgstr "hướng %s trục Y" +msgstr " quanh trục Y %s" msgid " locking %s Z axis" -msgstr "đang khóa %s trục Z" +msgstr " khóa trục Z %s" msgid " along %s Z axis" -msgstr "hướng %s trục Z" +msgstr " quanh trục Z %s" msgid "Cannot change Pose when 'Rest Position' is enabled" -msgstr "Không thể đổi Dạng Đứng khi bật 'Dạng Đứng Nghỉ'" +msgstr "Không thể đổi Tư Thế khi 'Tư Thế Nghỉ' được bật" msgid "Bone selection count error" -msgstr "Sai lầm đém xương sự lựa chọn" +msgstr "Lỗi trong số đếm lựa chọn xương xảy ra" msgid "Linked data can't text-space transform" -msgstr "Dữ liệu liên kết không thể biến hóa kiểu văn bản-không gian" +msgstr "Dữ liệu kết nối không thể biến hóa được trong không gian chất liệu" msgid "Unsupported object type for text-space transform" -msgstr "Loại vật thể không hỗ trợ cho biến hóa văn bàn-không gian" +msgstr "Thể loại đối tượng chưa được hỗ trợ để biến hóa trong không gian chất liệu" msgid "(Sharp)" -msgstr "(Bén)" +msgstr "(Đột Ngột)" msgid "(Smooth)" -msgstr "(Mịn)" +msgstr "(Mềm Mại)" msgid "(Root)" -msgstr "(Căn)" +msgstr "(Phép Căn)" msgid "(Linear)" -msgstr "(Bậc Một)" +msgstr "(Tuyến Tính)" msgid "(Constant)" @@ -113271,39 +126004,39 @@ msgstr "(Ngẫu Nhiên)" msgid "(InvSquare)" -msgstr "(Nghịch Biến Bậc Hai)" +msgstr "(Đảo Nghịch Bậc Hai)" msgid "Rotation: %s %s %s" -msgstr "Xoay: %s %s %s" +msgstr "Xoay chiều: %s %s %s" msgid "Rotation: %.2f%s %s" -msgstr "Xoay: %.2f%s %s" +msgstr "Xoay chiều: %.2f%s %s" msgid " Proportional size: %.2f" -msgstr " Kích cỡ đồng biến: %.2f" +msgstr " Kích thước cân đối: %.2f" msgid "Scale: %s%s %s" -msgstr "Phóng To: %s%s %s" +msgstr "Tỷ Lệ: %s%s %s" msgid "Scale: %s : %s%s %s" -msgstr "Phóng To: %s %s%s %s" +msgstr "Tỷ Lệ: %s %s%s %s" msgid "Scale: %s : %s : %s%s %s" -msgstr "Phóng To: %s : %s : %s%s %s" +msgstr "Tỷ Lệ: %s : %s : %s%s %s" msgid "Scale X: %s Y: %s%s %s" -msgstr "Phóng To X: %s Y: %s%s %s" +msgstr "Tỷ Lệ X: %s Y: %s%s %s" msgid "Scale X: %s Y: %s Z: %s%s %s" -msgstr "Phóng to X: %s Y: %s Z: %s%s %s" +msgstr "Tỷ Lệ X: %s Y: %s Z: %s%s %s" msgid "Time: +%s %s" @@ -113323,31 +126056,31 @@ msgstr "Thời Gian: %.3f %s" msgid "ScaleB: %s%s %s" -msgstr "Phóng To B: %s%s %s" +msgstr "Tỷ Lệ B: %s%s %s" msgid "ScaleB: %s : %s : %s%s %s" -msgstr "Phóng To B: %s : %s : %s%s %s" +msgstr "Tỷ Lệ B: %s : %s : %s%s %s" msgid "ScaleB X: %s Y: %s Z: %s%s %s" -msgstr "Phóng To B X: %s Y: %s Z: %s%s %s" +msgstr "Tỷ Lệ B X: %s Y: %s Z: %s%s %s" msgid "Bend Angle: %s Radius: %s Alt, Clamp %s" -msgstr "Góc Bể Cong: %s Bán Kính: %s Alt, Kẹp Lại %s" +msgstr "Góc Uốn Cong: %s Bán Kính: %s Alt, Hạn Định %s" msgid "Bend Angle: %.3f Radius: %.4f, Alt, Clamp %s" -msgstr "Góc Bể Cong: %.3f Bán Kính: %.4f Alt, Kẹp Lại %s" +msgstr "Góc Uốn Cong: %.3f Bán Kính: %.4f Alt, Hạn Định %s" msgid "Envelope: %s" -msgstr "Bao Bì: %s" +msgstr "Phong Bì: %s" msgid "Envelope: %3f" -msgstr "Bao Bì: %3f" +msgstr "Phong Bì: %3f" msgid "Roll: %s" @@ -113359,19 +126092,19 @@ msgstr "Lăn: %.2f" msgid "Shrink/Fatten: %s" -msgstr "Thu Nhỏ/Phình Ra: %s" +msgstr "Thu Nhỏ/Phình To: %s" msgid "Shrink/Fatten: %3f" -msgstr "Thu Nhỏ/Phình Ra: %3f" +msgstr "Thu Nhỏ/Phình To: %3f" msgid "Sequence Slide: %s%s" -msgstr "Trượt Trình Tự: %s%s" +msgstr "Đẩy Trượt Trình Tự Hình Ảnh: %s%s" msgid "Edge Slide: " -msgstr "Trượt Cạnh: " +msgstr "Đẩy Trượt Cạnh: " msgid "(E)ven: %s, " @@ -113379,11 +126112,11 @@ msgstr "(E) Đều: %s, " msgid "(F)lipped: %s, " -msgstr "(L) Lật: %s, " +msgstr "(F) Đảo Lật: %s, " msgid "Alt or (C)lamp: %s" -msgstr "Alt hay (C) Kẹp Lại: %s" +msgstr "Alt hay (C) hạn định: %s" msgid "Opacity: %s" @@ -113395,55 +126128,59 @@ msgstr "Độ Đục: %3f" msgid "Feather Shrink/Fatten: %s" -msgstr "Phe Phẩy Thu Nhỏ/Phình Ra: %s" +msgstr "Thu Nhỏ/Phình To Mép Nhòe: %s" msgid "Feather Shrink/Fatten: %3f" -msgstr "Phe Phẩy Thu Nhỏ/Phình Ra: %3f" +msgstr "Thu Nhỏ/Phình To Mép Nhòe: %3f" msgid "Mirror%s" -msgstr "Gương%s" +msgstr "Phản Chiếu Đối Xứng%s" msgid "Select a mirror axis (X, Y)" -msgstr "Chon trục gương (X, Y)" +msgstr "Chon trục phản chiếu đối xứng (X, Y)" msgid "Select a mirror axis (X, Y, Z)" -msgstr "Chon trục gương (X, Y, Z)" +msgstr "Chon trục phản chiếu đối xứng (X, Y, Z)" msgid "Push/Pull: %s%s %s" -msgstr "Đẩy/Kéo: %s%s %s" +msgstr "Đẩn/Kéo: %s%s %s" msgid "Push/Pull: %.4f%s %s" -msgstr "Đẩy/Kéo: %.4f%s %s" +msgstr "Đẩn/Kéo: %.4f%s %s" msgid "Rotation is not supported in the Dope Sheet Editor" -msgstr "Xoay không được hỗ trợ trong Bảng Hoạt Hình" +msgstr "Không hỗ trợ xoay chiều trong Bảng Hành Động" msgid "Shear: %s %s" -msgstr "Méo Mó: %s %s" +msgstr "Xiêu Vẹo: %s %s" msgid "Shear: %.3f %s (Press X or Y to set shear axis)" -msgstr "Méo Mó: %.3f %s (Bấm X hay Y để đặt trục méo mó)" +msgstr "Xiêu Vẹo: %.3f %s (bấm X hay Y để đặt trục làm xiêu vẹo)" msgid "Shrink/Fatten: " -msgstr "Thu Nhỏ/Phình Ra: " +msgstr "Thu Nhỏ/Phình To: " msgid " or Alt) Even Thickness %s" -msgstr " hay Alt) Bề Dày Đều %s" +msgstr " hoặc Alt) Độ Dày Đồng Đều %s" + + +msgid "'Shrink/Fatten' meshes is only supported in edit mode" +msgstr "'Thu Nhỏ/Phình To' khung lưới chỉ được hỗ trợ trong chế độ biên soạn mà thôi" msgid "ScaleX: %s" -msgstr "Phóng To X: %s" +msgstr "Tỷ Lệ X: %s" msgid "TimeSlide: %s" @@ -113451,7 +126188,7 @@ msgstr "Trượt Thời Gian: %s" msgid "DeltaX: %s" -msgstr "Lệch Lạc X: %s" +msgstr "Delta X: %s" msgid "To Sphere: %s %s" @@ -113463,15 +126200,15 @@ msgstr "Đến Hình Cầu: %.4f %s" msgid "Trackball: %s %s %s" -msgstr "Trái Banh Điều Khiển: %s %s %s" +msgstr "Hòn Bi Điều Khiển: %s %s %s" msgid "Trackball: %.2f %.2f %s" -msgstr "Trái Banh Điều Khiển: %.2f %.2f %s" +msgstr "Hòn Bi Điều Khiển: %.2f %.2f %s" msgid "Auto IK Length: %d" -msgstr "IK Tự Động-Chiều Dài: %d" +msgstr "Tự Động Độ Dài của IK: %d" msgid "right" @@ -113482,20 +126219,24 @@ msgid "left" msgstr "trái" +msgid "Auto-offset direction: %s" +msgstr "Tự động dịch chuyển chiều hướng: %s" + + msgid "Use 'Time_Translate' transform mode instead of 'Translation' mode for translating keyframes in Dope Sheet Editor" -msgstr "Dùng chế độ biến hóa 'Dịch_ThờiGian' thay thế chế độ 'Dịch' cho dịch bức ảnh mẫu trong Trình Biên Soạn Bảng Hoạt Hình" +msgstr "Dùng chế độ biến hóa 'Dịch_Chuyển_Thời_Gian' thay vì chế độ 'Dịch Chuyển' để dịch chuyển khung khóa trong Trình Biên Soạn Biên Bảng Hành Động" msgid "Vertex Slide: " -msgstr "Trượt Đỉnh: " +msgstr "Trượt Đẩy Điểm Đỉnh: " msgid "Create Orientation's 'use' parameter only valid in a 3DView context" -msgstr "Tham số 'sử dụng' của Chế Tạo Định Hướng chỉ hợp lệ trong một bối cảnh Màn 3D" +msgstr "Tham số 'sử dụng' trong 'Kiến Tạo Định Hướng' chỉ có giá trị trong ngữ cảnh Khung Nhìn 3D (3DView) thôi" msgid "Unable to create orientation" -msgstr "Không thể chế tạo định hướng" +msgstr "Không thể kiến tạo định hướng" msgid "global" @@ -113503,7 +126244,7 @@ msgstr "toàn cầu" msgid "gimbal" -msgstr "các đăng" +msgstr "trục vạn năng" msgid "normal" @@ -113515,56 +126256,68 @@ msgstr "địa phương" msgid "view" -msgstr "màn" +msgstr "góc nhìn" msgid "cursor" msgstr "con trỏ" +msgid "parent" +msgstr "phụ huynh" + + msgid "custom" msgstr "tùy chọn" msgctxt "Scene" msgid "Space" -msgstr "Không Gian" +msgstr "Phân Khoảng Cách/Trống/Không Gian" msgid "Cannot use zero-length bone" -msgstr "Không thể dùng xương có bề dài = 0" +msgstr "Không thể dùng xương có chiều dài = 0" msgid "Cannot use zero-length curve" -msgstr "Không thể dùng đường cong có bề dài = 0" +msgstr "Không thể sử dụng đường cong có chiều dài = 0" msgid "Cannot use vertex with zero-length normal" -msgstr "Không thể dùng đỉnh có pháp tuyến độ dài = 0" +msgstr "Không thể sử dụng điểm đỉnh có pháp tuyến với độ dài = 0" msgid "Cannot use zero-length edge" -msgstr "Không thể dùng cạnh có bề dài = 0" +msgstr "Không thể sử dụng cạnh có chiều dài = 0" msgid "Cannot use zero-area face" -msgstr "Không thể dùng mặt có điện tích = 0" +msgstr "Không thể sử dụng Mặt có diện tích = 0" + + +msgid "Checking validity of current .blend file *BEFORE* undo step" +msgstr "Kiểm tra tính hợp lệ của tập tin .blend hiện tại *TRƯỚC* bước hoàn tác" + + +msgid "Checking validity of current .blend file *AFTER* undo step" +msgstr "Kiểm tra tính hợp lệ của tập tin .blend hiện tại *SAU* bước hoàn tác" msgid "Undo disabled at startup in background-mode (call `ed.undo_push()` to explicitly initialize the undo-system)" -msgstr "Tắt hủy bước khi khởi động trong chế độ nền (kêu `ed.undo_push()` để trực tiếp khởi động hệ thống hủy bước)" +msgstr "Tắt tính năng hủy bước khi khởi động trong chế độ nền (gọi `ed.undo_push()` để trực tiếp khởi động hệ thống hủy bước)" msgid "[E] - Disable overshoot" -msgstr "[E] - Tắt Huốt Đi" +msgstr "[E] - Tắt cường điệu hóa" msgid "[E] - Enable overshoot" -msgstr "[E] - Bật Huốt Đi" +msgstr "[E] - Bật cường điệu hóa" msgid "Overshoot disabled" -msgstr "Đã tắt huốt đi" +msgstr "Cường điệu hóa bị tắt mất rồi" msgid "[Shift] - Precision active" @@ -113575,12 +126328,20 @@ msgid "Shift - Hold for precision" msgstr "Shift - Bấm cho độ chính xác" +msgid " | [Ctrl] - Increments active" +msgstr " | [Ctrl] - Tăng tiến hoạt động" + + +msgid " | Ctrl - Hold for 10% increments" +msgstr " | [Ctrl] - Giữ để tăng tiến 10%" + + msgid "Unpack File" -msgstr "Gỡ Gói Tập Tin" +msgstr "Mở Gói Tập Tin" msgid "Create %s" -msgstr "Chế Tạo %s" +msgstr "Kiến Tạo %s" msgid "Use %s (identical)" @@ -113588,111 +126349,156 @@ msgstr "Dùng %s (giống hệt)" msgid "Use %s (differs)" -msgstr "Dùng %s (khác)" +msgstr "Dùng %s (khác biệt)" msgid "Overwrite %s" -msgstr "Ghi lên %s" +msgstr "Viết Đè Lên %s" + + +msgid "Failed to set preview: no ID in context (incorrect context?)" +msgstr "Không thể đặt xem trước: không có ID trong ngữ cảnh (có phải ngữ cảnh là không chính xác chăng?)" msgid "Incorrect context for running data-block fake user toggling" -msgstr "Bối cảnh không hợp lệ để chạy bật/tắt người dùng giả cho cục dữ liệu" +msgstr "Ngữ cảnh bật/tắt người dùng giả cho khối dữ liệu đang thi hành là ngữ cảnh không đúng" msgid "Data-block type does not support fake user" -msgstr "Loại cục dữ liệu này không hỗ trợ người dùng giả" +msgstr "Kiểu khối dữ liệu không hỗ trợ người dùng giả" msgid "Can't edit previews of overridden library data" -msgstr "Không thể biên tập dự khán của dữ liệu thư viện được vượt quyền" +msgstr "Không thể biên soạn các xem trước của dữ liệu thư viện đã vượt quyền" msgid "Data-block does not support previews" -msgstr "Cúc dữ liệu không hỗ trợ dự khán" +msgstr "Khối dữ liệu không hỗ trợ xem trước" msgid "Can't generate automatic preview for node group" -msgstr "Không thể chế tạo một dự khán tự động cho nhóm giao điểm" +msgstr "Không thể tạo bản xem trước tự động cho nhóm nút" msgid "Numeric input evaluation" -msgstr "Tính toán ngõ vào số" +msgstr "Ước tính giá trị số cung cấp ở đầu vào" + + +msgctxt "Operator" +msgid "Select (Extend)" +msgstr "Chọn (Mở rộng)" + + +msgctxt "Operator" +msgid "Select (Deselect)" +msgstr "Chọn (Hủy Chọn)" + + +msgctxt "Operator" +msgid "Select (Toggle)" +msgstr "Chọn (Bật/Tắt)" + + +msgctxt "Operator" +msgid "Circle Select (Extend)" +msgstr "Lựa Chọn bằng Vòng Tròn (Mở Rộng)" + + +msgctxt "Operator" +msgid "Circle Select (Deselect)" +msgstr "Lựa Chọn bằng Vòng Tròn (Hủy Chọn)" msgid "UV Vertex" -msgstr "Đỉnh UV" +msgstr "Điểm Đỉnh UV" + + +msgid "Skipped %d of %d island(s), geometry was too complicated to detect a match" +msgstr "Bỏ qua %d/%d hải đảo, hình học quá phức tạp trong quá trình phát hiện một trường hợp khớp giống" msgid "Cannot split selection when sync selection is enabled" -msgstr "Không thể chẻ sự lưạ chọn khi bật sự lựa chọn đồng bộ" +msgstr "Không thể phân tách lựa chọn khi 'đồng bộ hóa lựa chọn' (sync selection) được bật" msgid "Pinned vertices can be selected in Vertex Mode only" -msgstr "Đỉnh được đinh ghim chỉ được chọn trong Chế Độ Đỉnh" +msgstr "Chỉ có thể chọn các điểm đỉnh đã được ghim xuống trong Chế Độ Điểm Đỉnh mà thôi" msgid "Mode(TAB) %s, (S)nap %s, (M)idpoints %s, (L)imit %.2f (Alt Wheel adjust) %s, Switch (I)sland, shift select vertices" -msgstr "Chế Độ (TAB) %s, (S) Hút Dính %s, (M) Trung Điểm %s, (L) Giới Hạn %.2f (Alt Nút Cuộn để chỉnh) %s, Trao Đổi (I) Đạo, dịch đỉnh được chọn" +msgstr "Chế độ (TAB) %s, (S) Bám vào %s, (M) Trung điểm %s, (L) Giới hạn %.2f (Alt + Bánh Xe để chỉnh sửa) %s, (I) Đổi hải đảo, Shift chọn các điểm đỉnh" + + +msgid "Could not initialize stitching on any selected object" +msgstr "Không thể khởi thủy khâu đính trên bất kỳ đối tượng đã được chọn nào cả" + + +msgid "Stitching only works with less than %i objects selected (%u selected)" +msgstr "Khâu đính chỉ hoạt động với số đối tượng được chọn ít hơn %i mà thôi (%u đã được chọn)" + + +msgid "Lock Method" +msgstr "Phương Pháp Khóa" msgid "Minimize Stretch. Blend %.2f" -msgstr "Làm Nhỏ Kéo Ra. Pha trộn %.2f" +msgstr "Hạn Chế Kéo Dãn. Biến Đổi %.2f" msgid "Press + and -, or scroll wheel to set blending" -msgstr "Bấm + và -, hay nút cuộn để đặt pha trộn" +msgstr "Bấm nút + và -, hoặc lăn bánh xe để đặt mức biến đổi" msgid "Object has non-uniform scale, unwrap will operate on a non-scaled version of the mesh" -msgstr "Vật thể bị phóng to không đều, mở gói sẽ thao tác với phiên bản mạng lưới không phóng to" +msgstr "Đối tượng có tỷ lệ không đồng nhất, quá trình mở gói sẽ thi hành với phiên bản khung lưới chưa đổi tỷ lệ" msgid "Object has negative scale, unwrap will operate on a non-flipped version of the mesh" -msgstr "Vật thể bị phóng to âm, mở gói sẽ thao tác với phiên bản mạng lưới không lật" +msgstr "Đối tượng có tỷ lệ âm, quá trình mở gói sẽ thao tác với phiên bản khung lưới chưa lật đổi" msgid "Subdivision Surface modifier needs to be first to work with unwrap" -msgstr "Bộ điều chỉnh Phân Hóa Bề Mặt phải ở dầu tiên để áp dụng với mở gói" +msgstr "Bộ điều chỉnh Bề Mặt Phân Hóa phải ở vị trí đầu tiên để có thể làm việc được với quá trình mở gói" msgid "Unwrap could not solve any island(s), edge seams may need to be added" -msgstr "Mở gói không thể giải nghiệm với hon đảo nào, có lẽ cần kèm vết sẹo cạnh" +msgstr "Gỡ gói không thể giải nghiệm với bất cứ hải đảo nào, có thể cần phải cho thêm các cạnh đường khâu vào" msgid "Unwrap failed to solve %d of %d island(s), edge seams may need to be added" -msgstr "Mở gói bị thất bại khi giải nghiệm %d của %d hon đảo, có lẽ cần kèm vết sẹo cạnh" +msgstr "Gỡ gói bị thất bại khi giải nghiệm %d trong số %d hải đảo, có thể cần phải cho thêm các cạnh đường khâu vào" msgid "Freestyle: Mesh loading" -msgstr "Phong Cách Tự Do: Đang đọc mạng lưới" +msgstr "PCTD: đang nạp khung lưới" msgid "Freestyle: View map creation" -msgstr "Phong Cách Tự Do: Hiển thị chế tạo bản đồ" +msgstr "PCTD: Xem sự kiến tạo ánh xạ" msgid "Freestyle: Stroke rendering" -msgstr "Phong Cách Tự Do: Kết xuất nét" +msgstr "PCTD: Kết xuất đường nét" msgid "Bind To" -msgstr "Trói Đến" +msgstr "Kết Buộc Vào" msgid "Bone Envelopes" -msgstr "Bao Bì Xương" +msgstr "Phong Bao của Xương" msgid "Weight Output" -msgstr "Ngõ Ra Quyền Lượng" +msgstr "Trọng Lượng Đầu Ra" msgid "Random Offset Start" -msgstr "Bắt Đầu Nới Ngẫu Nhiên" +msgstr "Dịch Chuyển Đầu Ngẫu Nhiên" msgid "Random Offset End" -msgstr "Kết Thúc Nới Ngẫu Nhiên" +msgstr "Dịch Chuyển Cuối Ngẫu Nhiên" msgid "Curvature" @@ -113700,135 +126506,156 @@ msgstr "Độ Cong" msgid "Random Offsets" -msgstr "Dịch Ngẫu Nhiên" +msgstr "Dịch Chuyển Ngẫu Nhiên" msgid "Illumination Filtering" -msgstr "Bộ Lọc Sự Rọi Sáng" +msgstr "Thanh Lọc theo Cách Chiếu Sáng" msgid "Create" -msgstr "Chế Tạo" +msgstr "Kiến Tạo" msgid "Crease (Angle Cached)" -msgstr "Nhăn (Được Chứa Góc)" +msgstr "Nếp Gấp (Góc lưu trong Bộ Nhớ Đệm)" msgid "Material Borders" -msgstr "Biên Giới Vật Liệu" +msgstr "Ranh Giới Nguyên Vật Liệu" msgid "Light Contour" -msgstr "Nét Đồng Mức Ánh Sánh" +msgstr "Đường Viền Công Tua Ánh Sáng" msgid "Type overlapping cached" -msgstr "Loại lấn lên được chứa" +msgstr "Kiểu chồng gối ghi trong bộ đệm nhớ" msgid "Allow Overlapping Types" -msgstr "Cho Loại Lấn Trên" +msgstr "Cho Phép các Kiểu Chồng Đè Lên Nhau" msgid "Custom Camera" -msgstr "Máy Quay Phim Tùy Chọn" +msgstr "Máy Quay Phim Tùy Chỉnh" msgid "Overlapping Edges As Contour" -msgstr "Cạnh lấn lên nhau là đường Đồng Mức" +msgstr "Các Cạnh Chồng Đè thành Đường Công-Tua" msgid "Crease On Smooth" -msgstr "Nhăn Trên Mịn" +msgstr "Nếp Gấp trên các cạnh Mịn Màng" msgid "Crease On Sharp" -msgstr "Nhăn Trên Bén" +msgstr "Nếp Gấp trên các cạnh Sắc Nét" msgid "Force Backface Culling" -msgstr "Ép Buộc Hủy Diệt Mặt Sau" +msgstr "Ép Buộc Loại Bỏ Mặt Trái" msgid "Collection Masks" -msgstr "Mặt Nạ Sưu Tập" +msgstr "Các Màn Chắn Lọc Bộ Sưu Tập" msgid "Face Mark Filtering" -msgstr "Lọc Dấu Mặt Nạ" +msgstr "Thanh Lọc Dấu Chỉ Mặt" msgid "Loose Edges As Contour" -msgstr "Cạnh Rời Ra Làm Nét Đồng Mức" +msgstr "Các Cạnh Rời Rạc làm Đường Viền Công Tua" msgid "Geometry Space" -msgstr "Không Gian Hình Dạng" +msgstr "Không Gian Hình Học" msgid "Geometry Threshold" -msgstr "Ngưỡng Hình Dạng" +msgstr "Ngưỡng Hình Học" msgid "Filter Source" -msgstr "Nguồn Bộ Lọc" +msgstr "Thanh Lọc Nguồn" msgid "Continue Without Clearing" -msgstr "Làm Tiếp Tục Nhưng Không Xóa" +msgstr "Tiếp Tục, Không Xóa Sạch Đi" msgid "Depth Offset" -msgstr "Nới Độ Sâu" +msgstr "Dịch Chuyển về Chiều Sâu" msgid "Towards Custom Camera" -msgstr "Máy Quay Phim Tùy Chỉ Tới" +msgstr "Hướng Tới Máy Quay Phim Tùy Chỉnh" msgid "Cached from the first line art modifier" -msgstr "Được chứa lại từ bộ điều chỉnh nghệ thuật đường đầu tiên" +msgstr "Được lưu trong bộ đệm nhớ từ bộ điều chỉnh mỹ thuật đường nét đầu tiên" msgid "Object is not in front" -msgstr "Vật thể ở phía trước" +msgstr "Đối tượng không nằm ở phía trước" msgid "Modifier has baked data" -msgstr "Bộ điều chỉnh có dữ liệu đã nướng" +msgstr "Bộ điều chỉnh có dữ liệu đã được nướng" msgid "Object is shown in front" -msgstr "Vật thể được hiện phía trước" +msgstr "Các đối tượng sẽ được hiển thị ở đằng trước" + + +msgctxt "GPencil" +msgid "Cast Shadow" +msgstr "Bóng Tối Ngả Xuống" msgid "Edge Types" -msgstr "Loại Cạnh" +msgstr "Thể Loại Cạnh" msgid "Light Reference" -msgstr "Tham Chiếu Đèn" +msgstr "Nguồn Sáng Tham Chiếu" msgid "Geometry Processing" -msgstr "Qúa Trình Hình Dạng" +msgstr "Xử Lý Hình Học" msgid "Vertex Weight Transfer" -msgstr "Truyền Quyền Lượng Đỉnh" +msgstr "Thuyên Chuyển Trọng Lượng Điểm Đỉnh" msgid "Composition" -msgstr "Ghép Ảnh" +msgstr "Tổng Hợp" msgid "MultipleStrokes" msgstr "Nhiều Nét" +msgid "Stroke Step" +msgstr "Bước Nét Vẽ" + + +msgid "Material Step" +msgstr "Bước Nguyên Vật Liệu" + + +msgid "Layer Step" +msgstr "Bước Tầng Lớp" + + +msgid "Outline requires an active camera" +msgstr "Mục lục đòi hỏi phải có một máy quay phim đang hoạt động" + + msgid "Stroke Fit Method" -msgstr "Phương Pháp Vừa Hóa Nét" +msgstr "Phương Pháp Khít Nét Vẽ" msgid "TextureMapping" @@ -113840,11 +126667,99 @@ msgstr "DịchThờiGian" msgid "External library data" -msgstr "Dữ lịệu thư viện ngoại bộ" +msgstr "Dữ liệu thư viện bên ngoài" msgid "All line art objects are now cleared" -msgstr "Đã xóa hết vật thể đường nét" +msgstr "Toàn bộ các đối tượng mỹ thuật đường nét hiện đã được xóa sạch cả rồi" + + +msgid "No active object or active object isn't a GPencil object" +msgstr "Không có đối tượng nào đang hoạt động cả, hoặc đối tượng đang hoạt động không phải là một đối tượng Bút Chì Dầu" + + +msgid "Object type mismatch, Alembic object path pointed to Camera when importing, but not any more" +msgstr "Kiểu đối tượng không xứng khớp, đường dẫn đối tượng Alembic trỏ vào Camera khi nhập khẩu, song không còn như thế nữa" + + +msgid "Object type mismatch, Alembic object path points to Camera" +msgstr "Kiểu đối tượng không xứng khớp, đường dẫn đối tượng Alembic trỏ vào Máy Quay Phim (Camera)" + + +msgid "Object type mismatch, Alembic object path pointed to Curves when importing, but not any more" +msgstr "Kiểu đối tượng không xứng khớp, đường dẫn đối tượng Alembic trỏ vào Đường Cong (Curves) khi nhập khẩu, song không còn như thế nữa" + + +msgid "Object type mismatch, Alembic object path points to Curves" +msgstr "Kiểu đối tượng không xứng khớp, đường dẫn đối tượng Alembic trỏ vào Đường Cong" + + +msgid "Error reading curve sample; more detail on the console" +msgstr "Lỗi đọc mẫu vật xảy ra; xin xem chi tiết hơn trên bảng điều khiển dòng lệnh nhé" + + +msgid "Object type mismatch, Alembic object path pointed to PolyMesh when importing, but not any more" +msgstr "Kiểu đối tượng không xứng khớp, đường dẫn đối tượng Alembic trỏ vào PolyMesh khi nhập khẩu, song không còn như thế nữa" + + +msgid "Object type mismatch, Alembic object path points to PolyMesh" +msgstr "Kiểu đối tượng không xứng khớp, đường dẫn đối tượng Alembic trỏ vào PolyMesh" + + +msgid "Error reading mesh sample; more detail on the console" +msgstr "Lỗi đọc mẫu vật khung lưới xảy ra; xin xem chi tiết hơn trên bảng điều khiển dòng lệnh" + + +msgid "Invalid mesh; more detail on the console" +msgstr "Khung lưới không hợp lệ; xin xem chi tiết hơn trên bảng điều khiển dòng lệnh" + + +msgid "Topology has changed, perhaps by triangulating the mesh. Only vertices will be read!" +msgstr "Cấu trúc liên kết đã thay đổi, có lẽ là do tam giác hóa khung lưới. Duy các điểm đỉnh là sẽ được đọc mà thôi!" + + +msgid "Object type mismatch, Alembic object path pointed to SubD when importing, but not any more" +msgstr "Kiểu đối tượng không xứng khớp, đường dẫn đối tượng Alembic trỏ vào SubD khi nhập khẩu, song không còn như thế nữa" + + +msgid "Object type mismatch, Alembic object path points to SubD" +msgstr "Kiểu đối tượng không xứng khớp, đường dẫn đối tượng Alembic trỏ vào SubD" + + +msgid "Object type mismatch, Alembic object path pointed to NURBS when importing, but not any more" +msgstr "Kiểu đối tượng không xứng khớp, đường dẫn đối tượng Alembic trỏ vào NURBS khi nhập khẩu, song không còn như thế nữa" + + +msgid "Object type mismatch, Alembic object path points to NURBS" +msgstr "Thể loại đối tượng không xứng khớp, đường dẫn đối tượng Alembic trỏ vào NURBS nhé" + + +msgid "Object type mismatch, Alembic object path pointed to Points when importing, but not any more" +msgstr "Thể loại đối tượng không xứng khớp, đường dẫn đối tượng Alembic trỏ vào các Điểm (Points) khi nhập khẩu, song không còn như thế nữa" + + +msgid "Object type mismatch, Alembic object path points to Points" +msgstr "Thể loại đối tượng không xứng khớp, đường dẫn đối tượng Alembic trỏ và các Điểm (Points)" + + +msgid "Error reading points sample; more detail on the console" +msgstr "Lỗi đọc các điểm của mẫu vật xảy ra; xin xem chi tiết hơn trên bảng điều khiển dòng lệnh nhé" + + +msgid "Object type mismatch, Alembic object path pointed to XForm when importing, but not any more" +msgstr "Thể loại đối tượng không xứng khớp, đường dẫn đối tượng Alembic trỏ vào XForm khi nhập khẩu, song không còn là như thế nữa" + + +msgid "Object type mismatch, Alembic object path points to XForm" +msgstr "Thể loại đối tượng không xứng khớp, đường dẫn đối tượng Alembic trỏ vào XForm" + + +msgid "Invalid object: verify object path" +msgstr "Đối tượng bất hợp lệ: xác minh đường dẫn đối tượng" + + +msgid "Could not open Alembic archive for reading, see console for detail" +msgstr "Không thể mở kho lưu trữ Alembic để đọc, xin xem cửa sổ bàn giao tiếp để biết chi tiết" msgctxt "Action" @@ -113852,252 +126767,592 @@ msgid "Group" msgstr "Nhóm" +msgid "PLY Importer: failed importing, unknown error" +msgstr "Trình Nhập Khẩu PLY: quá trình nhập khẩu bị thất bại, lỗi xảy ra không xác định được" + + +msgid "PLY Importer: failed importing, no vertices" +msgstr "Trình Nhập Khẩu PLY: quá trình nhập khẩu bị thất bại, không có điểm đỉnh" + + +msgid "PLY Importer: %s: %s" +msgstr "Trình Nhập Khẩu PLY: %s: %s" + + +msgid "%s: Couldn't determine package-relative file name from path %s" +msgstr "%s: Không thể xác định tên tập tin liên quan từ đường dẫn %s" + + +msgid "%s: Couldn't copy file %s to %s" +msgstr "%s: Không thể sao chép tập tin %s sang %s" + + +msgid "%s: Couldn't split UDIM pattern %s" +msgstr "%s: Không thể tách phân mẫu UDIM %s" + + +msgid "%s: Will not overwrite existing asset %s" +msgstr "%s: Sẽ không viết đè nội dung hiện có %s" + + +msgid "%s: Can't resolve path %s" +msgstr "%s: Không thể lý giải được đường dẫn %s được" + + +msgid "%s: Can't resolve path %s for writing" +msgstr "%s: Không thể lý giải đường dẫn %s để viết được" + + +msgid "%s: Can't copy %s. The source and destination paths are the same" +msgstr "%s: Không thể sao chép %s. Đường dẫn nguồn và đích giống nhau" + + +msgid "%s: Can't write to asset %s: %s" +msgstr "%s: Không thể viết vào tài sản %s: %s" + + +msgid "%s: Can't open source asset %s" +msgstr "%s: Không thể mở tài sản nguồn %s được" + + +msgid "%s: Will not copy zero size source asset %s" +msgstr "%s: Sẽ không sao chép nội dung nguồn có kích thước bằng 0 %s" + + +msgid "%s: Null buffer for source asset %s" +msgstr "%s: Bộ đệm rỗng (Null: bất khả định) cho tài sản nguồn %s" + + +msgid "%s: Can't open destination asset %s for writing" +msgstr "%s: Không thể mở nội dung đích %s để viết được" + + +msgid "%s: Error writing to destination asset %s" +msgstr "%s: Lỗi xảy ra trong khi viết vào tài sản đích %s" + + +msgid "%s: Couldn't close destination asset %s" +msgstr "%s: Không thể đóng tài sản đích %s lại được" + + +msgid "%s: Texture import directory path empty, couldn't import %s" +msgstr "%s: Đường dẫn thư mục nhập khẩu chất liệu trống rỗng, không thể nhập khẩu %s được" + + +msgid "%s: import directory is relative but the blend file path is empty. Please save the blend file before importing the USD or provide an absolute import directory path. Can't import %s" +msgstr "%s: thư mục nhập khẩu là tương đối, song đường dẫn tập tin blend lại trống rỗng. Xin vui lòng lưu tập tin blend lại trước khi nhập khẩu USD nhé, hoặc cung cấp đường dẫn thư mục nhập tuyệt đối. Không thể nhập khẩu %s được" + + +msgid "%s: Couldn't create texture import directory %s" +msgstr "%s: Không thể kiến tạo thư mục nhập khẩu chất liệu %s" + + +msgid "USD Export: Unable to delete existing usdz file %s" +msgstr "Xuất Khẩu USD: Không thể xóa tập tin usdz hiện có %s" + + +msgid "USD Export: Couldn't move new usdz file from temporary location %s to %s" +msgstr "Xuất Khẩu USD: Không thể di chuyển tập tin usdz mới từ vị trí tạm thời %s sang %s" + + +msgid "USD Export: unable to find suitable USD plugin to write %s" +msgstr "Xuất Khẩu USD: Không tìm thấy trình cắm USD phù hợp để viết %s" + + +msgid "USD Export: invalid path string '%s': %s" +msgstr "Xuất Khẩu USD: chuỗi ký tự đường dẫn không hợp lệ '%s': %s" + + +msgid "USD Export: path '%s' is not an absolute path" +msgstr "Xuất Khẩu USD: đường dẫn '%s' không phải là đường dẫn tuyệt đối" + + +msgid "USD Export: path string '%s' is not a prim path" +msgstr "Xuất Khẩu USD: chuỗi ký tự đường dẫn '%s' không phải là một đường dẫn đến cấu trúc cơ bản (prim)" + + +msgid "Could not open USD archive for reading, see console for detail" +msgstr "Không thể mở kho lưu trữ USD để đọc, xin xem bàn giao tiếp để biết chi tiết" + + +msgid "USD Import: unable to open stage to read %s" +msgstr "Nhập Khẩu USD: không thể mở sân khấu (stage) để đọc %s" + + +msgid "An exception occurred invoking USD hook '%s'. Please see the console for details" +msgstr "Lỗi ngoại lệ đã xảy ra khi gọi móc USD hook '%s'. Xin vui lòng xem bảng điều khiển dòng lệnh để biết thêm chi tiết" + + +msgid "An exception occurred invoking USD hook '%s'" +msgstr "Lỗi ngoại lệ đã xảy ra khi gọi móc USD hook ‘%s’" + + +msgid "Unsupported type %s for mesh data" +msgstr "Kiểu %s chưa được hỗ trợ cho dữ liệu khung lưới" + + +msgid "Unsupported domain for mesh data type %s" +msgstr "Phạm vi chưa được hỗ trợ cho kiểu dữ liệu khung lưới %s nhé" + + +msgid "Unable to get array values for primvar %s" +msgstr "Không thể lấy giá trị mảng cho biến số cấu trúc cơ bản (primvar) %s" + + +msgid "USD Import: can't cast attribute '%s' to array" +msgstr "Nhập USD: không thể ép kiểu thuộc tính '%s' vào mảng được" + + +msgid "USD Import: color attribute value '%s' count inconsistent with interpolation type" +msgstr "Nhập Khẩu USD: giá trị thuộc tính màu '%s' tính bất đồng với thể loại nội suy" + + +msgid "USD Import: couldn't add color attribute '%s'" +msgstr "Nhập Khẩu USD: không thể cộng thêm thuộc tính màu '%s' được" + + +msgid "USD Import: UV attribute value '%s' count inconsistent with interpolation type" +msgstr "Nhập USD: số lượng giá trị thuộc tính UV '%s' không nhất quán với kiểu nội suy" + + +msgid "USD Import: couldn't add UV attribute '%s'" +msgstr "Nhập USD: không thể cho thêm thuộc tính UV '%s' vào được" + + +msgid "Generic primvar %s: invalid type %s" +msgstr "Biến số cấu trúc cơ bản phổ thông %s: kiểu bất hợp lệ %s" + + +msgid "Skipping primvar %s, mesh %s -- no value" +msgstr "Bỏ qua biến số cấu trúc cơ bản (primvar) %s, khung lưới %s nhé — không có giá trị" + + +msgid "%s: Couldn't compute geom bind transform for %s" +msgstr "%s: Không thể tính toán biến hóa kết buộc hình học cho %s được" + + +msgid "Unhandled Gprim type: %s (%s)" +msgstr "Thể loại Gprim (hình học cơ bản) chưa được xử lý: %s (%s)" + + +msgid "%s: Couldn't find armature object corresponding to USD skeleton %s" +msgstr "%s: Không tìm thấy đối tượng khung cốt nào tương ứng với khung xương USD %s cả" + + +msgid "%s: Couldn't get world bind transforms for skeleton %s" +msgstr "%s: Không thể lấy các biến hóa kết buộc thế giới cho bộ khung xương %s được" + + +msgid "%s: Number of bind transforms doesn't match the number of joints for skeleton %s" +msgstr "%s: Số lượng biến hóa kết buộc không khớp với số lượng khớp nối của bộ khung xương %s" + + +msgid "%s: Couldn't get blendshape targets for prim %s" +msgstr "%s: Không thể lấy mục tiêu hình dạng pha trộn (blendshape) mục tiêu cho cấu trúc cơ bản %s được" + + +msgid "%s: Number of blendshapes doesn't match number of blendshape targets for prim %s" +msgstr "%s: Số lượng hình dạng pha trộn không khớp với số lượng mục tiêu hình dạng pha trộn cho cấu trúc cơ bản %s" + + +msgid "%s: Couldn't get stage for prim %s" +msgstr "%s: Không thể lấy sân khấu cho cấu trúc cơ bản %s được" + + +msgid "%s: Couldn't get offsets for blend shape %s" +msgstr "%s: Không thể lấy dịch chuyển cho hình pha trộn %s được" + + +msgid "%s: No offsets for blend shape %s" +msgstr "%s: Hình pha trộn %s không có dịch chuyển" + + +msgid "%s: Number of offsets greater than number of mesh vertices for blend shape %s" +msgstr "%s: Số lượng dịch chuyển lớn hơn số điểm đỉnh khung lưới của hình dạng pha trộn %s" + + +msgid "%s: Couldn't query skeleton %s" +msgstr "%s: Không thể truy vấn bộ khung xương %s được" + + +msgid "%s: Topology and joint order size mismatch for skeleton %s" +msgstr "%s: Cấu trúc liên kết và kích thước thứ tự khớp nối không xứng khớp với bộ khung xương %s" + + +msgid "%s: Couldn't add bone for joint %s" +msgstr "%s: Không thể cho thêm xương vào khớp nối %s được" + + +msgid "%s: Mismatch in bone and joint counts for skeleton %s" +msgstr "%s: Bất tương đồng xảy ra giữa số lượng xương và số khớp nối đối với bộ khung xương %s" + + +msgid "%s: Mismatch in bind xforms and joint counts for skeleton %s" +msgstr "%s: Bất tương đồng xảy ra trong kết buộc xforms và số khớp nối cho bộ khung xương %s" + + +msgid "USD Skeleton Import: bone matrices with negative determinants detected in prim %s. Such matrices may indicate negative scales, possibly due to mirroring operations, and can't currently be converted to Blender's bone representation. The skeletal animation won't be imported" +msgstr "Nhập Khẩu Bộ Xương USD: phát hiện thấy có ma trận xương với định thức âm trong cấu trúc cơ bản (phim) %s. Các ma trận như vậy có thể biểu thị tỷ lệ âm, có khả năng là do các thao tác phản chiếu đối xứng gây ra và hiện nay không thể chuyển đổi sang đại diện xương của Blender được. Hoạt họa của bộ xương sẽ không được nhập khẩu đâu nhé" + + +msgid "%s: Joint weights and joint indices element size mismatch for prim %s" +msgstr "%s: Kích thước phần tử của trọng lượng khớp xương và chỉ số khớp xương không xứng khớp nối với cấu trúc cơ bản %s" + + +msgid "%s: Joint weights and joint indices size mismatch for prim %s" +msgstr "%s: Trọng lượng khớp nối và kích thước chỉ số khớp nối không xứng khớp nối đối với cấu trúc cơ bản %s" + + +msgid "%s: Unexpected joint weights interpolation type %s for prim %s" +msgstr "%s: Kiểu nội suy trọng lượng khớp nối ngoài mong đợi %s đối với cấu trúc cơ bản %s" + + +msgid "%s: Joint weights of unexpected size for vertex interpolation for prim %s" +msgstr "%s: Trọng số khớp nối có kích thước không mong muốn trong phép nội suy đỉnh đối với cấu trúc cơ bản %s" + + +msgid "%s: Joint weights of unexpected size for constant interpolation for prim %s" +msgstr "%s: Trọng lượng khớp nối có kích thước không mong muốn trong phép nội suy bất biến đối với cấu trúc cơ bản %s" + + +msgid "%s: Error creating deform group data for mesh %s" +msgstr "%s: Lỗi khi tạo dữ liệu nhóm biến dạng cho khung lưới %s" + + +msgid "USD Export: no bounds could be computed for %s" +msgstr "Xuất Khẩu USD: không thể tính ranh giới cho %s" + + +msgid "Curve width size not supported for USD interpolation" +msgstr "Kích thước chiều rộng đường cong chưa được hỗ trợ cho nội suy USD" + + +msgid "Cannot export mixed curve types in the same Curves object" +msgstr "Không thể xuất nhiều kiểu đường cong hỗn hợp trong cùng một đối tượng Đường Cong được" + + +msgid "Cannot export mixed cyclic and non-cyclic curves in the same Curves object" +msgstr "Không thể xuất các đường cong tuần hoàn và không tuần hoàn hỗn hợp với nhau trong cùng một đối tượng Đường Cong được" + + +msgid "USD does not support animating curve types. The curve type changes from %s to %s on frame %f" +msgstr "USD không hỗ trợ các loại đường cong hoạt họa. Kiểu đường cong thay đổi từ %s sang %s trên khung hình %f" + + +msgid "USD export: couldn't export in-memory texture to %s" +msgstr "Xuất Khẩu USD: không thể xuất khẩu chất liệu trong bộ nhớ sang %s được" + + +msgid "USD export: could not copy texture tile from %s to %s" +msgstr "Xuất USD: không thể sao chép ô chất liệu từ %s sang %s được" + + +msgid "USD export: could not copy texture from %s to %s" +msgstr "Xuất USD: không thể sao chép chất liệu từ %s sang %s" + + +msgid "Unsupported type for mesh data" +msgstr "Thể loại chưa được hỗ trợ cho dữ liệu khung lưới" + + +msgid "Mesh %s, Attribute %s cannot be converted to USD" +msgstr "Khung Lưới %s, Thuộc Tính %s không thể chuyển đổi sang USD được" + + +msgid "USD Export: failed to resolve .vdb file for object: %s" +msgstr "Xuất Khẩu USD: không thể phân giải tập tin .vdb cho đối tượng: %s" + + +msgid "USD Export: couldn't construct relative file path for .vdb file, absolute path will be used instead" +msgstr "Xuất Khẩu USD: không thể xây dựng đường dẫn tập tin tương đối cho tập tin .vdb được, sẽ sử dụng đường dẫn tuyệt đối thay vì" + + +msgid "Asset data can only be assigned to assets. Use asset_mark() to mark as an asset" +msgstr "Dữ liệu tài sản chỉ có thể được ấn định cho các tài sản mà thôi. Sử dụng hàm đánh dấu tài sản (assets_mark()) để đánh dấu là một tài sản nhé" + + +msgid "Asset data cannot be None" +msgstr "Dữ liệu tài sản không thể là Không Có (None) được" + + msgid "Override template experimental feature is disabled" -msgstr "Đặc tính thử nghiệm bố cục mẫu vượt quyền đã tắt rồi" +msgstr "Tính năng thử nghiệm mẫu vượt quyền đã bị vô hiệu hóa (tắt đi)" msgid "Unable to create override template for linked data-blocks" -msgstr "Không thể chế tạo bố cục mẫu đồ vượt quyền cho cục dữ liệu được liên kết" +msgstr "Không thể kiến tạo bản mẫu vượt quyền cho các khối dữ liệu kết nối được" msgid "Unable to create override template for overridden data-blocks" -msgstr "Không thể chế tạo bố cục mẫu vượt quyền cho cục dữ liệu được vượt quyền" +msgstr "Không thể kiến tạo bản mẫu vượt quyền cho các khối dữ liệu vượt quyền được" msgid "No new override property created, property already exists" -msgstr "Đã không chế tạo đặc tính mới vì đặc tính đã tồn tại rồi" +msgstr "Không có tính chất vượt quyền mới nào được kiến tạo cả. Tính chất vốn đã tồn tại rồi" msgid "Override property cannot be removed" -msgstr "Không thể xóa đồ vượt quyền cho đắc tính" +msgstr "Không thể xóa tính chất vượt quyền được" msgid "No new override operation created, operation already exists" -msgstr "Đã không chế tạo thao tác mới vì thao tác đã tồn tại rồi" +msgstr "Không có thao tác vượt quyền mới nào được kiến tạo cả. Thao tác vốn đã tồn tại rồi" msgid "Override operation cannot be removed" -msgstr "Không thể xóa thao tác vượt quyền" +msgstr "Không thể xóa thao tác Vượt Quyền được" msgid "Index out of range" -msgstr "Chỉ số ra ngoài phạm vi" +msgstr "Chỉ số nằm ngoài phạm vi" msgid "No material to removed" -msgstr "Không có vật liệu để xóa" +msgstr "Không có nguyên vật liệu để xóa" msgid "Registering id property class: '%s' is too long, maximum length is %d" -msgstr "Đăng ký lớp đặc tính id: '%s' quá dài, bề dài tối đa là %d" +msgstr "Lớp tính chất ID đang đăng ký: '%s' quá dài, chiều dài tối đa là %d" + + +msgid "'%s' is of a type that cannot be an asset" +msgstr "'%s' là thể loại không thể là tài sản được" msgid "ID '%s' isn't an override" -msgstr "ID '%s' không phải là đồ vượt quyền" +msgstr "ID '%s' này không phải là một phần tử vượt quyền" msgid "ID '%s' is linked, cannot edit its overrides" -msgstr "ID '%s' được liên kết, không thể biên tập đồ vượt quyền của nó" +msgstr "ID '%s' đã kết nối rồi, không thể chỉnh sửa những vượt quyền của nó được" msgid "%s is not compatible with %s 'refresh' options" -msgstr "%s không phù hợp vởi tùy chọn %s 'hoàn lại'" +msgstr "%s không tương hợp với tùy chọn 'làm tươi lại' (refresh) %s" msgid "This property is for internal use only and can't be edited" -msgstr "Đặc tính này chỉ cho sử dụng nội bộ và không thể biên tập" +msgstr "Tính chất này để sử dụng nội bộ mà thôi và không thể biên soạn được" msgid "Can't edit this property from an override data-block" -msgstr "Không thể biên tập đặc tính này từ một cục dữ liệu vượt quyền" +msgstr "Không thể biên soạn tính chất này từ một khối dữ liệu vượt quyền" msgid "Can't edit this property from a system override data-block" -msgstr "Không thể biên tập đặc tính này từ một cục dữ liệu đồ vượt quyền hệ thống" +msgstr "Không thể chỉnh sửa thuộc tính này từ khối dữ liệu vượt quyền hệ thống được" + + +msgid "Only boolean, int, float, and enum properties supported" +msgstr "Chỉ hỗ trợ các tính chất boolean, int, float và enum mà thôi" + + +msgid "Only boolean, int, and float properties supported" +msgstr "Chỉ hỗ trợ các tính chất boolean, int và float mà thôi" msgid "'%s' does not contain '%s' with prefix and suffix" -msgstr "'%s' không chứa '%s' với đầu và đuôi" +msgstr "'%s' không có chứa '%s' với tiền tố và hậu tố" msgid "'%s' doesn't have upper case alpha-numeric prefix" -msgstr "'%s' không có đuôi chữ hoa-số cái" +msgstr "'%s' không có tiền tố là chữ hoặc số và ở dạng chữ in" msgid "'%s' doesn't have an alpha-numeric suffix" -msgstr "'%s' không có đuôi chữ-số cái" +msgstr "'%s' không có hậu tố là chữ hoặc số" msgid "%s: expected %s type, not %s" -msgstr "%s: đã định loại %s, không phải %s" +msgstr "%s: mong đợi kiểu %s , chứ không phải %s" msgid "%s: expected ID type, not %s" -msgstr "%s: đã định có loại ID, không phải %s." +msgstr "%s: mong đợi kiểu nhận dạng ID, chứ không phải %s" msgid "Array length mismatch (expected %d, got %d)" -msgstr "Bề dài mảng không đúng (định = %d, thật = %d)" +msgstr "Chiều dài của mảng không khớp (dự kiến là %d, hiện có %d)" msgid "Property named '%s' not found" -msgstr "Không tìm được đặc tính tên '%s'" +msgstr "Không tìm thấy tính chất có tên là '%s'" msgid "Array length mismatch (got %d, expected more)" -msgstr "Bề dài mảng không đúng (thật = %d, định có nhiều hơn)" +msgstr "Chiều dài của mảng không khớp (hiện có %d, dự kiến là hơn)" msgid "F-Curve data path empty, invalid argument" -msgstr "Đường dẫn dữ iệu Cong-F rỗng, không hợp lệ" +msgstr "Đường dẫn dữ liệu của Đường Cong-F trống rỗng, đối số không hợp lệ" msgid "Action group '%s' not found in action '%s'" -msgstr "Không tìm được nhóm Hành Động '%s' trong hành động '%s'" +msgstr "Không tìm thấy nhóm hành động '%s' trong hành động '%s'" msgid "F-Curve '%s[%d]' already exists in action '%s'" -msgstr "Cong-F '%s[%d]' có rồi trong hành động '%s'" +msgstr "Đường Cong-F '%s[%d]' đã tồn tại trong hành động '%s'" msgid "F-Curve's action group '%s' not found in action '%s'" -msgstr "Nhóm '%s' hành động của Cong-F không tìm được trong hành động '%s'" +msgstr "Không tìm thấy nhóm hành động của Đường Cong-F '%s' trong hành động '%s'" msgid "F-Curve not found in action '%s'" -msgstr "Không tìm được Cong-F trong hành động '%s'" +msgstr "Không tìm thấy Đường Cong-F trong hành động '%s'" msgid "Timeline marker '%s' not found in action '%s'" -msgstr "Không tìm được ký hiệu thời lịch '%s' trong hành động '%s'" +msgstr "Không tìm thấy dấu mốc lịch thời gian '%s' trong hành động '%s'" msgid "Only armature objects are supported" -msgstr "Chỉ vật thể cốt được hỗ trợ" +msgstr "Duy các khung lưới khung cốt là được hỗ trợ mà thôi" msgid "Keying set path could not be added" -msgstr "Không thêm được đường dẫn tập mẫu" +msgstr "Không thêm được đường dẫn bộ hình mẫu" msgid "Keying set path could not be removed" -msgstr "Không xóa được đường dẫn tập mẫu" +msgstr "Không xóa được đường dẫn của bộ hình mẫu" msgid "Keying set paths could not be removed" -msgstr "Không xóa được các đường dẫn tập mẫu" +msgstr "Không xóa được các đường dẫn của bộ hình mẫu" msgid "No valid driver data to create copy of" -msgstr "Không có dữ liệu điều vận hợp lệ để chép" +msgstr "Không có dữ liệu về điều vận hợp lệ nào để kiến tạo bản sao cả" msgid "Driver not found in this animation data" -msgstr "Không tìm được điều vận trong dữ liệu hoạt hình này" +msgstr "Không tìm thấy điều vận nào trong dữ liệu hoạt họa này" + + +msgid "%s '%s' is too long, maximum length is %d" +msgstr "%s '%s' quá dài, độ dài tối đa là %d" msgid "NlaTrack '%s' cannot be removed" -msgstr "Không thể xóa RãnhNLA '%s'" +msgstr "Không thể xóa rãnh NLA '%s' được" msgid "Driver '%s[%d]' already exists" -msgstr "Điều vận '%s[%d]' tồn tại rồi" +msgstr "Trình Điều Vận '%s[%d]' đã tồn tại" msgid "Invalid context for keying set" -msgstr "Bối cảnh không hợp lệ cho tập bức ảnh mẫu" +msgstr "Ngữ cảnh không hợp lệ cho bộ khóa" msgid "Incomplete built-in keying set, appears to be missing type info" -msgstr "Tập bức ảnh mẫu không toàn bộ, hình như thiếu thông tin loại" +msgstr "Bộ khóa gắn sẵn không đầy đủ, hình như thiếu thông tin về thể loại" msgid "Armature '%s' not in edit mode, cannot add an editbone" -msgstr "Cốt '%s' không ở trong chế độ biên tập, không thể kèm thêm một xương biên tập" +msgstr "Khung Cốt '%s' không ở trong Chế Độ Biên Soạn, không thể thêm một xương biên soạn" msgid "Armature '%s' not in edit mode, cannot remove an editbone" -msgstr "Cốt '%s' không ở trong chế độ biên tập, không thể xóa một xương biên tập" +msgstr "Khung Cốt '%s' không ở trong Chế Độ Biên Soạn, không thể xóa một xương biên soạn" msgid "Armature '%s' does not contain bone '%s'" -msgstr "Cốt '%s' không có xương '%s'" +msgstr "Khung Cốt '%s' không có chứa xương '%s'" + + +msgid "Cannot move collection from index '%d' to '%d'" +msgstr "Không thể di chuyển bộ sưu tập từ chỉ số '%d' sang '%d' được" + + +msgid "Invalid color palette index: %d" +msgstr "Chỉ số bảng màu không hợp lệ: %d" + + +msgid "%s is not supported, pass a Bone, PoseBone, or EditBone" +msgstr "%s chưa được hỗ trợ, xin hãy đưa Xương, Xương Tư Thế hoặc Xương Biên Soạn vào nhé" msgid "Tag '%s' already present for given asset" -msgstr "Thẻ '%s' đang tồn tại rồi cho tích sản" +msgstr "Dấu nhãn '%s' đã tồn tại trong tài sản đã cho" msgid "Tag '%s' not found in given asset" -msgstr "Không tìm được thẻ '%s' trong tích sản đã cấp" +msgstr "Không tìm thấy dấu nhãn '%s' trong tài sản đã cho" msgid "Cannot modify name of required geometry attribute" -msgstr "Không thể đổi tên của đặc điểm hình dạng yêu cầu" +msgstr "Không thể sửa đổi tên của thuộc tính hình học đòi hỏi" + + +msgid "Attribute per point/vertex" +msgstr "Thuộc tính trên mỗi điểm/điểm đỉnh" msgid "Layer '%s' not found in object '%s'" -msgstr "Không tìm được lớp '%s' trong vật thể '%s'" +msgstr "Không tìm thấy tầng lớp '%s' trong đối tượng '%s'" msgid "Cannot add a layer to CacheFile '%s'" -msgstr "Không thể thêm một lớp vào TậpTinĐệmChứa '%s'" +msgstr "Không thể cho thêm một tầng lớp vào Tập Tin Bộ Nhớ Đệm (CacheFile) '%s' được" msgid "Background image cannot be removed" -msgstr "Không thể xóa ảnh nền" +msgstr "Hình ảnh nền không thể xóa được" msgid "Collection '%s' is not an original ID" -msgstr "Sưu tập '%s' khêng phải là ID ban đầu" +msgstr "Bộ sưu tập '%s' không phải là một ID gốc" msgid "Could not (un)link the object '%s' because the collection '%s' is overridden" -msgstr "Không thể (gỡ) liên kết cho vật thể '%s' vì sưu tập '%s' được vượt quyền." +msgstr "Không thể (ngắt) kết nối đối tượng '%s' vì bộ sưu tập '%s' đã bị vượt quyền rồi" msgid "Could not (un)link the object '%s' because the collection '%s' is linked" -msgstr "Không thể (gỡ) liên kết cho vật thể '%s' vì sưu tập '%s' được liên kết." +msgstr "Không thể (ngắt) kết nối đối tượng '%s' vì bộ sưu tập '%s' đã được kết nối" msgid "Object '%s' already in collection '%s'" -msgstr "Vật thể '%s' đã có trong sưu tập '%s' rồi" +msgstr "Đối tượng '%s' đã tồn tại trong bộ sưu tập '%s' rồi" msgid "Object '%s' not in collection '%s'" -msgstr "Vật thể '%s' chưa có trong sưu tập '%s'" +msgstr "Đối tượng '%s' không tồn tại trong bộ sưu tập '%s'" msgid "Could not (un)link the collection '%s' because the collection '%s' is overridden" -msgstr "Không thể (gỡ) liên kết cho sưu tập '%s' vì sưu tập '%s' bị vượt quyền." +msgstr "Không thể (ngắt) kết nối bộ sưu tập '%s' vì bộ sưu tập '%s' đã bị vượt quyền rồi" msgid "Could not (un)link the collection '%s' because the collection '%s' is linked" -msgstr "Không thể (gỡ) liên kết cho sưu tập '%s' vì sưu tập '%s' được liên kết." +msgstr "Không thể (ngắt) kết nối bộ sưu tập '%s' vì bộ sưu tập '%s' đã kết nối rồi" msgid "Collection '%s' already in collection '%s'" -msgstr "Sưu tập '%s' đã có trong sưu tập '%s'" +msgstr "Bộ sưu tập '%s' đã nằm trong bộ sưu tập '%s' rồi" msgid "Collection '%s' not in collection '%s'" -msgstr "Sưu tập '%s' chưa có trong sưu tập '%s'" +msgstr "Bộ sưu tập '%s' không nằm trong bộ sưu tập '%s'" msgid "Element not found in element collection or last element" -msgstr "Không tìm được phần tử trong sưu tập phần tử hay phần tử cuối" +msgstr "Hoặc là không tìm thấy yếu tố trong bộ sưu tập các phần tử hoặc nó là yếu tố cuối cùng" msgid "Unable to remove curve point" -msgstr "Không thể xóa được điểm đường cong" +msgstr "Không thể xóa điểm trên đường cong" msgid "CurveMapping does not own CurveMap" -msgstr "BộBảnĐồĐườngCong không sở hữu BảnĐồĐườngCong" +msgstr "Ánh Xạ Đường Cong không sở hữu CurveMap" msgid "Unable to add element to colorband (limit %d)" -msgstr "Không thêm được phần tử vào chuyển sắc (giới hạn %d)" +msgstr "Không thể thêm phần tử vào dải màu được (giới hạn %d)" msgid "Relationship" @@ -114105,101 +127360,285 @@ msgstr "Quan Hệ" msgid "Target is not in the constraint target list" -msgstr "Mục tiêu không có trong danh sách mục tiêu ràng buộc" +msgstr "Mục tiêu không nằm trong danh sách mục tiêu của ràng buộc" msgctxt "Action" msgid "Easing (by strength)" -msgstr "Xoa Dịu (bằng sức)" +msgstr "Chậm Rãi (theo chiều dài)" msgctxt "Action" msgid "Dynamic Effects" -msgstr "Hiệu Ứng Động Lý" +msgstr "Các Hiệu Ứng Năng Động" msgid "Bezier spline cannot have points added" -msgstr "Không thể thêm điểm cho mẫu cong Bezier" +msgstr "Không thể thêm điểm vào chốt trục Bézier" msgid "Only Bezier splines can be added" -msgstr "Chỉ có thể thêm mẫu cong Bezier" +msgstr "Chỉ có thể thêm chốt trục Bézier mà thôi" msgid "Curve '%s' does not contain spline given" -msgstr "Đường cong '%s' không chứa mẫu cong được xác định" +msgstr "Đường cong '%s' không có chứa chốt trục đã cho" msgid "Unable to remove path point" -msgstr "Không thể xóa điểm đường" +msgstr "Không thể loại bỏ điểm của đường dẫn" msgid "CurveProfile table not initialized, call initialize()" -msgstr "Bảng MặtCắtĐườngCong chưa được khởi động, kêu initialize() (khởiĐộng())" +msgstr "Bảng Mặt Cắt Đường Cong (CurveProfile) chưa được khởi thủy. Hãy gọi hàm initialize()" + + +msgid "Curve sizes must be greater than zero" +msgstr "Kích thước đường cong phải lớn hơn 0" msgid "Dependency graph update requested during evaluation" -msgstr "Đã nhận được lệnh nâng cấp biểu đồ nhờ trong khi đang tính toán" +msgstr "Có yêu cầu đòi hỏi cập nhật đồ thị phụ thuộc trong quá trình tính toán" msgid "Variable does not exist in this driver" -msgstr "Biến số không có trong điều vận này" +msgstr "Biến số không tồn tại trong điều vận này" msgid "Keyframe not in F-Curve" -msgstr "Bức ảnh mẫu không có trong Cong-F" +msgstr "Khung khóa không nằm trong Đường Cong-F" msgid "Control point not in Envelope F-Modifier" -msgstr "Điểm kiểm soát không có trong Cụ sưa Đổi Bao Bì" +msgstr "Điểm điều khiển không nằm trong Bộ Điều Chỉnh Phong Bao" msgid "F-Curve modifier '%s' not found in F-Curve" -msgstr "Không tìm được bộ điều chỉnh Cong-F '%s' trong Cong-F" +msgstr "Không tìm thấy bộ điều chỉnh Đường Cong-F '%s' trong Đường Cong-F" msgid "Already a control point at frame %.6f" -msgstr "Có một điểm kiểm soát tại bức ảnh %.6f rồi" +msgstr "Có điểm điều khiển tại khung hình %.6f rồi" + + +msgid "F-Curve already has sample points" +msgstr "Đường cong-F đã có các điểm mẫu vật rồi" + + +msgid "F-Curve has no keyframes" +msgstr "Đường cong-F không có khung khóa" + + +msgid "F-Curve already has keyframes" +msgstr "Đường cong-F vốn đã có khung khóa rồi" + + +msgid "F-Curve has no sample points" +msgstr "Đường cong-F không có điểm lấy mẫu" msgid "Invalid frame range (%d - %d)" -msgstr "Phạm vi bức ảnh không hợp lệ: (%d-%d)" +msgstr "Phạm vi khung hình không hợp lệ: (%d-%d)" + + +msgid "Binary Object" +msgstr "Đối Tượng Nhị Phân" + + +msgid "Binary object file format (.bobj.gz)" +msgstr "Định dạng tập tin đối tượng nhị phân (.bobj.gz)" + + +msgid "Object file format (.obj)" +msgstr "Định dạng tập tin đối tượng (.obj)" + + +msgid "Uni Cache" +msgstr "Bộ Nhớ Đệm Uni" + + +msgid "Uni file format (.uni)" +msgstr "Định dạng tập tin uni (.uni)" + + +msgid "OpenVDB file format (.vdb)" +msgstr "Định dạng tập tin OpenVDB (.vdb)" + + +msgid "Raw Cache" +msgstr "Bộ Nhớ Đệm Thô" + + +msgid "Raw file format (.raw)" +msgstr "Định dạng tập tin thô (.raw)" + + +msgid "Uni file format" +msgstr "Định dạng tập tin Uni" + + +msgid "Pressure field of the fluid domain" +msgstr "Trường áp suất của phạm vi chất lỏng" + + +msgid "X Velocity" +msgstr "Vận Tốc X" + + +msgid "X component of the velocity field" +msgstr "Phần tử X của trường vận tốc" + + +msgid "Y Velocity" +msgstr "Vận Tốc Y" + + +msgid "Y component of the velocity field" +msgstr "Phần tử Y của trường vận tốc" + + +msgid "Z Velocity" +msgstr "Vận Tốc Z" + + +msgid "Z component of the velocity field" +msgstr "Phần tử Z của trường vận tốc" + + +msgid "X Force" +msgstr "Lực X" + + +msgid "X component of the force field" +msgstr "Phần tử X của trường lực" + + +msgid "Y Force" +msgstr "Lực Y" + + +msgid "Y component of the force field" +msgstr "Phần tử Y của trường lực" + + +msgid "Z Force" +msgstr "Lực Z" + + +msgid "Z component of the force field" +msgstr "Phần tử Z của trường lực" + + +msgid "Red component of the color field" +msgstr "Kênh đỏ của trường màu" + + +msgid "Green component of the color field" +msgstr "Kênh lục của trường màu" + + +msgid "Blue component of the color field" +msgstr "Kênh lam của trường màu" + + +msgid "Quantity of soot in the fluid" +msgstr "Lượng bồ hóng trong chất lỏng" msgid "Flame" -msgstr "Ngón Lửa" +msgstr "Lửa" + + +msgid "Flame field" +msgstr "Trường lửa" + + +msgid "Fuel field" +msgstr "Trường nhiên liệu" + + +msgid "Temperature of the fluid" +msgstr "Nhiệt độ của chất lỏng" + + +msgid "Fluid Level Set" +msgstr "Tập Mức Chất Lỏng" + + +msgid "Level set representation of the fluid" +msgstr "Đại diện tập mức của chất lỏng" + + +msgid "Inflow Level Set" +msgstr "Tập Mức Luồng Chảy Vào" + + +msgid "Level set representation of the inflow" +msgstr "Đại diện tập mức của luồng chảy vào" + + +msgid "Outflow Level Set" +msgstr "Tập Mức Luồng Thoát Ra" + + +msgid "Level set representation of the outflow" +msgstr "Đại diện tập mức của luồng thoát ra" + + +msgid "Obstacle Level Set" +msgstr "Tập Mức Chướng Ngại Vật" + + +msgid "Level set representation of the obstacles" +msgstr "Đại diện tập mức của các chướng ngại vật" + + +msgid "Mini" +msgstr "Nhỏ" + + +msgid "Mini float (Use 8 bit where possible, otherwise use 16 bit)" +msgstr "Số thực nhỏ (Sử dụng 8 bit nếu có thể, nếu không thì sử dụng 16 bit)" + + +msgid "Emit fluid from mesh surface or volume" +msgstr "Phát ra chất lỏng từ bề mặt khung lưới hoặc thể tích" + + +msgid "Emit smoke from particles" +msgstr "Phát ra khói từ các hạt" msgid "GPencilStrokePoints.pop: index out of range" -msgstr "GPencilStrokePoints.pop: chỉ số ngoài phạm vi" +msgstr "GPencilStrokePoints.pop: chỉ số nằm ngoài phạm vi cho phép" msgid "Groups: No groups for this stroke" -msgstr "Các Nhóm: Không có nhóm nào cho nét này" +msgstr "Nhóm: Không có nhóm nào cho nét vẽ này cả" msgid "GPencilStrokePoints: index out of range" -msgstr "ĐiểmNétBútSáp: chỉ số ngoài phạm vi" +msgstr "GPencilStrokePoints: chỉ số nằm ngoài phạm vi cho phép" msgid "Stroke not found in grease pencil frame" -msgstr "Không tìm được nét trong bức ảnh bút sáp" +msgstr "Không tìm thấy nét vẽ trong khung hình Bút Chì Dầu" msgid "Frame not found in grease pencil layer" -msgstr "Không được tìm bức ảnh trong lớp bút sáp" +msgstr "Không tìm thấy khung hình trong tầng của Bút Chì Dầu" msgid "Layer not found in grease pencil data" -msgstr "Không tìm được lớp trong dữ liệu bút sáp" +msgstr "Không tìm thấy tầng lớp trong dữ liệu Bút Chì Dầu" msgid "Mask not found in mask list" -msgstr "Không tìm được mặt nạ trong danh sách mặt nạ" +msgstr "Không tìm thấy Màn Chắn Lọc trong danh sách màn chắn lọc" msgid "Frame already exists on this frame number %d" -msgstr "Có bức ảnh trong số bức ảnh này %d rồi" +msgstr "Tại khung hình số %d này đã có khung hình tồn tại rồi" msgid "Modify" @@ -114211,416 +127650,553 @@ msgstr "Không thể chỉ định vật liệu '%s', nó cần bút sáp đư msgid "Image not packed" -msgstr "Ảnh chưa gói lái" +msgstr "Hình ảnh chưa được đóng gói" msgid "Could not save packed file to disk as '%s'" -msgstr "Không được lưu tập tin gói lại vào ổ cứng dùng tên '%s'" +msgstr "Không thể lưu tập tin đã đóng gói ra đĩa là '%s'" msgid "Image '%s' could not be saved to '%s'" -msgstr "Không thể lưu ảnh '%s' vào '%s'" +msgstr "Không thể lưu hình ảnh '%s' vào '%s'" msgid "Image '%s' does not have any image data" -msgstr "Ảnh '%s' không có dữ liệu ảnh" +msgstr "Hình ảnh '%s' không có dữ liệu ảnh" msgid "Failed to load image texture '%s'" -msgstr "Nhập chất liệu ảnh '%s' bị thất bại" +msgstr "Thất bại trong quá trình nạp hình ảnh chất liệu '%s'" msgctxt "Key" msgid "Key" -msgstr "Màu Trong Suốt" +msgstr "Khóa" msgid "ViewLayer '%s' does not contain object '%s'" -msgstr "LớpMàn '%s' không chứa vật thể '%s'" +msgstr "Tầng góc nhìn '%s' không có chứa đối tượng '%s' (đối tượng không nằm trong tầng góc nhìn)" + + +msgid "AOV not found in view-layer '%s'" +msgstr "Không tìm thấy AOV trong tầng góc nhìn '%s'" msgid "Failed to add the color modifier" -msgstr "Thêm bộ điều chỉnh màu bị thất bại" +msgstr "Quá trình thêm bộ điều chỉnh màu sắc bị thất bại" msgid "Failed to add the alpha modifier" -msgstr "Thêm bộ điều chỉnh độ đục bị thất bại" +msgstr "Quá trình thêm bộ điều chỉnh alpha bị thất bại" msgid "Failed to add the thickness modifier" -msgstr "Thêm bộ điều chỉnh bề dày bị thất bại" +msgstr "Quá trình thêm bộ điều chỉnh độ dày bị thất bại" msgid "Failed to add the geometry modifier" -msgstr "Thêm bộ điều chỉnh hình dạng bị thất bại" +msgstr "Quá trình thêm bộ điều chỉnh hình học bị thất bại" msgid "Color modifier '%s' could not be removed" -msgstr "Không xóa được bộ điều chỉnh màu '%s'" +msgstr "Không thể xóa bộ điều chỉnh màu sắc '%s'" msgid "Alpha modifier '%s' could not be removed" -msgstr "Không xóa được bộ điều chỉnh độ đục '%s'" +msgstr "Không thể xóa bộ điều chỉnh alpha '%s'" msgid "Thickness modifier '%s' could not be removed" -msgstr "Không xóa được bộ điều chỉnh bề dày '%s'" +msgstr "Không thể xóa bộ điều chỉnh độ dày '%s'" msgid "Geometry modifier '%s' could not be removed" -msgstr "Không xóa được bộ điều chỉnh hình dạng '%s'" +msgstr "Không thể xóa bộ điều chỉnh hình học '%s'" msgid "unsupported font format" -msgstr "định dạng phông không được hỗ trợ" +msgstr "định dạnh phông chưa được hỗ trợ" msgid "unable to load text" -msgstr "không được nhập văn bản" +msgstr "không nạp được văn bản" msgid "unable to load movie clip" -msgstr "không thể nhập đoạn phim" +msgstr "không nạp được đoạn phim" msgid "Can not create object in main database with an evaluated data data-block" -msgstr "Không thể chế tạo vật thể trong cơ sở dữ liệu chánh với một cục dữ liệu được tính toán" +msgstr "Không thể kiến tạo đối tượng trong cơ sở dữ liệu với khối dữ liệu của dữ liệu dự tính" msgid "Object does not have geometry data" -msgstr "Vật thể không có dữ liệu hình dạng" +msgstr "Đối tượng không có dữ liệu hình học" msgid "%s '%s' is outside of main database and can not be removed from it" -msgstr "%s '%s' đang ở ngoài cơ sở dữ liệu chánh và không thể được xóa từ cơ sở dữ liệu" +msgstr "%s '%s' nằm ngoài cơ sở dữ liệu chính và không thể xóa bỏ khỏi nó được" msgid "%s '%s' must have zero users to be removed, found %d (try with do_unlink=True parameter)" -msgstr "%s '%s' yêu cầu không có ai dùng để xóa nó, tìm được %d lần đang dùng (thử tham số do_unlink=True)" +msgstr "%s '%s' nhất định phải không có người dùng nào mới có thể xóa được, song tìm thấy %d (thử đặt tham số do_unlink=True (Đúng) nhé)" msgid "Scene '%s' is the last local one, cannot be removed" -msgstr "Cảnh '%s' là cảnh cuối, cảnh địa phương, không thể xóa" +msgstr "Cảnh '%s' là cảnh nội tại cuối cùng, không thể xóa được" msgid "ID type '%s' is not valid for an object" -msgstr "Loại ID '%s' không hợp lệ cho một vật thể" +msgstr "Loại ID '%s' là loại không hợp lệ cho một đối tượng" msgid "Mask layer not found for given spline" -msgstr "Không tìm được lớp mặt nạ cho mẫu cong được xác định" +msgstr "Không tìm thấy tầng Màn Chắn Lọc cho chốt trục đã cho" msgid "Point is not found in given spline" -msgstr "Không tìm được điểm cho mẫu cong được xác định" +msgstr "Không tìm thấy điểm (point) trên chốt trục đã cho" msgid "Mask layer '%s' not found in mask '%s'" -msgstr "Không tìm được lớp mặt nạ '%s' trong mặt nạ '%s'" +msgstr "Không tìm thấy tầng Màn Chắn Lọc '%s' trong màn chắn lọc '%s'" msgid "Mask layer '%s' does not contain spline given" -msgstr "Lớp mặt nạ '%s' không có mẫu cong được xác định" +msgstr "Tầng Màn Chắn Lọc '%s' không chứa chốt trục đã cho" msgid "Mtex not found for this type" -msgstr "Không tìm được chất liệu mặt nạ cho loại này" +msgstr "Không tìm thấy Mtex (kết nối giữa nguyên/chất liệu) cho loại này" msgid "Maximum number of textures added %d" -msgstr "Số lượng tối đa cho chất liệu được thêm %d " +msgstr "Số lượng chất liệu tối đa %d đã được thêm vào rồi" msgid "Index %d is invalid" msgstr "Chỉ số %d không hợp lệ" +msgid "UV map '%s' not found" +msgstr "Không tìm thấy ánh xạ UV '%s'" + + msgid "Number of custom normals is not number of loops (%f / %d)" -msgstr "Số lượng pháp tuyến tùy chọn khác số lượng vòng (%f / %d)" +msgstr "Số lượng pháp tuyến tùy chỉnh khác với số lượng vòng lặp (%f / %d)" msgid "Number of custom normals is not number of vertices (%f / %d)" -msgstr "Số lượng pháp tuyến tùy chọn khác số lượng đỉnh (%f / %d)" +msgstr "Số pháp tuyến tùy chỉnh khác với số lượng điểm đỉnh (%f / %d)" msgid "Metaball '%s' does not contain spline given" -msgstr "Siêu cầu '%s; không có mẫu cong được xác định" +msgstr "Siêu cầu '%s; không chứa chốt trục đã cho" msgid "Negative vertex index in vertex_indices_set" -msgstr "Chỉ số đỉnh có giá trị âm trong tập_chỉ_số_đỉnh" +msgstr "Chỉ số điểm đỉnh âm trong bộ_chỉ số_điểm đỉnh (vertex_indices_set)" msgid "Duplicate index %d in vertex_indices_set" -msgstr "Sao chép chỉ số %d trong tập_chỉ_số_đỉnh" +msgstr "Nhân đôi chỉ số %d trong bộ_chỉ số_điểm đỉnh (vertex_indices_set)" msgid "Unable to create new strip" -msgstr "Không thể chế tạo một đoạn mới" +msgstr "Không thể kiến tạo một dải mới" msgid "Unable to add strip (the track does not have any space to accommodate this new strip)" -msgstr "Không thể thêm đoạn (rãnh không có chỗ rỗng cho chứa đoạn mới này)" +msgstr "Không thể thêm dải vào (rãnh không còn chỗ trống để chứa dải mới này)" msgid "NLA strip '%s' not found in track '%s'" -msgstr "Không tìm được đoạn NLA '%s' trong rãnh '%s'" +msgstr "Không tìm thấy Dải NLA '%s' trong rãnh '%s'" msgid "Registering node socket class: '%s' is too long, maximum length is %d" -msgstr "Đăng ký lớp ổ cắm giao điểm: '%s' quá dài, bề dài tối đa là %d" +msgstr "Lớp ổ cắm của nút (node socket) đang đăng ký: '%s' quá dài, chiều dài tối đa là %d" + + +msgid "Parent is not part of the interface" +msgstr "Phụ huynh không phải là một phần của giao diện" + + +msgid "Unknown socket type" +msgstr "Kiểu ổ cắm chưa xác định" + + +msgid "Could not find supported socket type" +msgstr "Không thể tìm thấy kiểu ổ cắm vốn được hỗ trợ" msgid "Unable to create socket" -msgstr "Không thể chế tạo ổ cắm" +msgstr "Không thể kiến tạo ổ cắm" + + +msgid "Parent panel does not allow child panels" +msgstr "Bảng chính không cho phép các bảng con" + + +msgid "Unable to create panel" +msgstr "Không thể tạo bảng điều khiển được" + + +msgid "Unable to copy item" +msgstr "Không thể sao chép mục được" + + +msgid "CustomGroup" +msgstr "Nhóm Tùy Chỉnh" + + +msgid "Custom Group Node" +msgstr "Nút Nhóm Tùy Chỉnh" + + +msgid "UNDEFINED" +msgstr "KHÔNG XÁC ĐỊNH" + + +msgctxt "NodeTree" +msgid "Functions" +msgstr "Các Hàm" + + +msgctxt "NodeTree" +msgid "Comparison" +msgstr "So Sánh" + + +msgctxt "NodeTree" +msgid "Rounding" +msgstr "Làm Tròn" + + +msgctxt "NodeTree" +msgid "Trigonometric" +msgstr "Lượng Giác" + + +msgctxt "NodeTree" +msgid "Conversion" +msgstr "Chuyển Đổi" msgid "Same input/output direction of sockets" -msgstr "Ổ cắm có cùng hướng ngõ vào/ngõ ra" +msgstr "Đầu vào/đầu ra của ổ cắm có cùng chiều hướng" msgid "Unable to locate link in node tree" -msgstr "Không tìm được liên kết trong cây giao điểm" +msgstr "Không tìm thấy kết nối trong cây nút" + + +msgid "Cannot add socket to built-in node" +msgstr "Không thể cho thêm ổ cắm vào nút tích hợp được" + + +msgid "Unable to remove socket from built-in node" +msgstr "Không thể xóa ổ cắm khỏi nút tích hợp được" + + +msgid "Unable to remove sockets from built-in node" +msgstr "Không thể xóa ổ cắm khỏi nút tích hợp được" + + +msgid "Unable to move sockets in built-in node" +msgstr "Không thể di chuyển ổ cắm trong nút tích hợp được" + + +msgid "Registering node tree class: '%s' is too long, maximum length is %d" +msgstr "Lớp cây nút đang đăng ký: '%s' quá dài, chiều dài tối đa là %d" + + +msgid "Registering node tree class: '%s', bl_idname '%s' could not be unregistered" +msgstr "Đang đăng ký lớp cây nút: '%s', bl_idname '%s' không thể hủy đăng ký được" msgid "Node tree '%s' has undefined type %s" -msgstr "Cây giao điểm '%s' có loại chưa được chỉ định '%s'" +msgstr "Cây nút '%s' có thể loại chưa được xác định '%s'" msgid "Node type %s undefined" -msgstr "Loại giao điểm %s chưa được xác định" +msgstr "Thể loại nút %s chưa được xác định" msgid "" "Cannot add node of type %s to node tree '%s'\n" " %s" msgstr "" -"Không thể thêm giao điểm loại %s vào cây giao điểm '%s'\n" +"Không thể thêm nút với thể loại %s vào cây nút '%s'\n" " %s" msgid "Cannot add node of type %s to node tree '%s'" -msgstr "Không thêm được giao điểm loại %s vào cây giao điểm '%s'" +msgstr "Không thể thêm nút với thể loại %s vào cây nút '%s'" msgid "Unable to locate node '%s' in node tree" -msgstr "Không tìm được giao điểm '%s' trong cây giao điểm" +msgstr "Không tìm thấy nút '%s' trong cây nút" + + +msgid "Registering node class: '%s' is too long, maximum length is %d" +msgstr "Lớp nút đang đăng ký: '%s' quá dài, chiều dài tối đa là %d" + + +msgid "Registering node class: '%s', bl_idname '%s' is a builtin node" +msgstr "Lớp nút đang đăng ký: '%s', bl_idname '%s' là nút dựng sẵn" + + +msgid "Registering node class: '%s', bl_idname '%s' could not be unregistered" +msgstr "Đang đăng ký lớp nút: '%s', bl_idname '%s' không thể hủy đăng ký được" msgid "Unable to locate socket '%s' in node" -msgstr "Không tìm được ổ cắm '%s' trong giao điểm" +msgstr "Không tìm thấy ổ cắm '%s' trong nút" + + +msgid "Can't pair zone input node %s with %s because it does not have the same zone type" +msgstr "Không thể ghép nối vùng của nút đầu vào %s với %s vì nút này không có cùng kiểu vùng" + + +msgid "The output node %s is already paired with %s" +msgstr "Nút đầu ra %s đã được ghép nối với %s" + + +msgid "Unable to locate item '%s' in node" +msgstr "Không thể định vị mục '%s' trong nút" msgid "Can only assign evaluated data to evaluated object, or original data to original object" -msgstr "Chỉ có thể chỉ định dữ liệu được tịnh toán đến vật thể được tính toán, hoặc đến dữ liệu ban đầu đến vật thể ban đầu" +msgstr "Chỉ có thể ấn định dữ liệu đã tính toán vào đối tượng đã dự tính, hoặc dữ liệu gốc vào đối tượng nguồn mà thôi" msgid "Only empty objects support collection instances" -msgstr "Chỉ vật thể rỗng được hỗ trợ thực thể sưu tập" +msgstr "Chỉ có các đối tượng rỗng là hỗ trợ các thực thể bộ sưu tập mà thôi" + + +msgid "Cannot set instance-collection as object belongs in collection being instanced, thus causing a cycle" +msgstr "Không thể đặt bộ sưu tập thực thể được là vì đối tượng trực thuộc bộ sưu tập hiện nay đang được thực thể hóa, do đó mà gây ra một chu kỳ tuần hoàn lặp lại" msgid "VertexGroup.add(): cannot be called while object is in edit mode" -msgstr "VertexGroup.add(): không thể dùng khi vật thể trong chế độ biên tập" +msgstr "Vertexgroup.add(): không thể thi hành trong khi đối tượng đang ở trong Chế Độ Biên Soạn" msgid "VertexGroup.remove(): cannot be called while object is in edit mode" -msgstr "VertexGroup.remove(): không thể dùng khi vật thể trong chế độ biên tập" +msgstr "Vertexgroup.remove(): không thể thi hành trong khi đối tượng đang ở trong Chế Độ Biên Soạn" msgid "Vertex not in group" -msgstr "Đỉnh không ở trong nhóm" +msgstr "Điểm đỉnh không nằm trong nhóm" msgid "VertexGroup '%s' not found in object '%s'" -msgstr "Không tìm được nhóm đỉnh '%s' trong vật thể '%s'" +msgstr "Không tìm thấy nhóm điểm đỉnh '%s' trong đối tượng '%s'" msgid "Constraint '%s' not found in object '%s'" -msgstr "Không tìm được ràng buộc '%s' trong vật thể '%s'" +msgstr "Không tìm thấy ràng buộc '%s' trong đối tượng '%s'" msgid "Could not move constraint from index '%d' to '%d'" -msgstr "Không di chuyển được ràng buộc từ chỉ số '%d' đến '%d'" +msgstr "Không thể di chuyển ràng buộc từ chỉ số '%d' sang '%d'" + + +msgid "Invalid original modifier index '%d'" +msgstr "Chỉ số bộ điều chỉnh gốc không hợp lệ '%d'" msgid "Modifier \"%s\" is not in the object's modifier list" -msgstr "Bộ điều chỉnh \"%s\" không ở trong danh sách bộ điều chỉnh của vật thể" +msgstr "Bộ điều chỉnh \"%s\" không nằm trong danh sách các bộ điều chỉnh của đối tượng" msgid "%s is not supported for '%s' objects" -msgstr "%s không được hỗ trợ cho vật thể '%s'" +msgstr "%s không được hỗ trợ đối với các đối tượng '%s'" msgid "DeformGroup '%s' not in object '%s'" -msgstr "NhómMéo '%s' không ở trong vật thể '%s'" +msgstr "Nhóm Biến Dạng (DeformGroup) '%s' không nằm trong đối tượng '%s'" msgid "Viewport not in local view" -msgstr "Màn chiếu không ở trong màn địa phương" +msgstr "Cổng nhìn không nằm trong Góc Nhìn Cục Bộ" msgid "Object is not a curve or a text" -msgstr "Vật thể không phải là đường cong hay một văn bản" +msgstr "Đối tượng không phải là đường cong hay văn bản" msgid "Invalid depsgraph" -msgstr "Sở đồ nhờ không hợp lệ" +msgstr "Đồ thị phụ thuộc không hợp lệ" msgid "ShapeKey not found" -msgstr "Không thể tìm MẫuDạng" +msgstr "Không tìm thấy Hình Mẫu" msgid "Could not remove ShapeKey" -msgstr "Không thể xóa MẫuDạng" +msgstr "Không thể xóa Hình Mẫu" msgid "Object should be of mesh type" -msgstr "Vật thể nên là loại mạng lưới" +msgstr "Đối tượng phải là loại khung lưới" msgid "No vertex groups assigned to mesh" -msgstr "Chưa chỉ định nhóm đỉnh nào cho mạng lưới" +msgstr "Chưa ấn định nhóm điểm đỉnh nào cho khung lưới" msgid "Bad assignment mode" -msgstr "Chế độ chỉ định không tốt" +msgstr "Chế độ ấn định không hợp lệ" msgid "Bad vertex index in list" -msgstr "Có chỉ số đỉnh không tốt trong danh sách" +msgstr "Chỉ số điểm đỉnh không hợp lệ tồn tại trong danh sách" msgid "Object '%s' can't be selected because it is not in View Layer '%s'!" -msgstr "Không thể chọn vật thể '%s' vì nó không ở trong Màn Hiển Thị '%s'!" +msgstr "Đối tượng '%s' không thể chọn được bởi vì nó không nằm trong Tầng Góc Nhìn (View Layer) '%s'!" msgid "Object '%s' can't be hidden because it is not in View Layer '%s'!" -msgstr "Không thể giấu vật thể '%s' vì nó không ở trong Màn Hiển Thị '%s'!" +msgstr "Đối tượng '%s' không thể ẩn giấu được vì nó không nằm trong Tầng Góc Nhìn (View Layer) '%s'!" msgid "Object %s not in view layer %s" -msgstr "Vật thể %s không ở trong lớp hiển thị %s" +msgstr "Đối tượng %s không nằm trong Tầng Góc Nhìn %s" msgid "'from_space' '%s' is invalid when no pose bone is given!" -msgstr "'from_space' '%s' không hợp lệ khi chưa xác định xương dạng đứng nào!" +msgstr "'from_space' '%s' không hợp lệ khi chưa được cung cấp xương tư thế nào!" msgid "'to_space' '%s' is invalid when no pose bone is given!" -msgstr "'to_space' '%s' không hợp lệ khi chưa xác định xương dạng đứng nào!" +msgstr "'to_space' '%s' không hợp lệ khi chưa được cung cấp xương tư thế nào!" msgid "'from_space' '%s' is invalid when no custom space is given!" -msgstr "'from_space' '%s' không hợp lệ khi chưa cấp không gian tùy chọn nào!" +msgstr "'from_space' '%s' là không hợp lệ khi không có không gian tùy chỉnh nào được cung cấp cho cả!" msgid "'to_space' '%s' is invalid when no custom space is given!" -msgstr "'to_space' '%s' không hợp lệ khi chưa cấp không gian tùy chọn nào!" +msgstr "'to_space' '%s' là không hợp lệ khi không có không gian tùy chỉnh nào được cung cấp cho cả!" msgid "Object '%s' does not support shapes" -msgstr "Vật thể '%s' không hỗ trợ mẫu dạng" +msgstr "Đối tượng '%s' không hỗ trợ các hình dạng" msgid "Object '%s' has no evaluated mesh data" -msgstr "Vật thể '%s' không có dữ liệu mạng lưới được tính toán" +msgstr "Đối tượng '%s' không có dữ liệu khung lưới đã tính toán" msgid "Object '%s' could not create internal data for finding nearest point" -msgstr "Vật thể '%s' không được chế tạo dữ liệu nội bộ để tìm kiếm điểm gần nhất" +msgstr "Đối tượng '%s' không kiến tạo được dữ liệu nội bộ dùng để lùng tìm điểm gần nhất" msgid "Object '%s' is not valid for this operation! Only curves are supported" -msgstr "Vật thể '%s' không hợp lệ cho thao tác này! Chỉ được hỗ trợ đường cong" +msgstr "Đối tượng '%s' là một đối tượng không hợp lệ đối với thao tác này! Chỉ có các đường cong là được hỗ trợ mà thôi" msgid "Palette '%s' does not contain color given" -msgstr "Bảng màu '%s' không chứa màu được xác định" +msgstr "Bảng màu '%s' không có chứa màu đã cho" + + +msgid "Invalid target!" +msgstr "Mục tiêu không hợp lệ!" msgid "uv_on_emitter() requires a modifier from an evaluated object" -msgstr "uv_on_emitter() yêu cầu có một bộ điều chỉnh từ một vật thể được tính toán" +msgstr "uv_on_emitter() đòi hỏi bộ điều chỉnh từ một đối tượng đã tính toán" msgid "Mesh has no UV data" -msgstr "Mạng lưới không có dữ liệu UV" +msgstr "Khung lưới không có dữ liệu UV" msgid "Object was not yet evaluated" -msgstr "Chưa được tính toán vật thể" +msgstr "Đối tượng chưa được tính toán" msgid "Mesh has no VCol data" -msgstr "Mạng lưới không có dữ liệu màu đỉnh" +msgstr "Khung lưới không có dữ liệu màu điểm đỉnh (VCol)" msgid "Cannot edit bone groups for library overrides" -msgstr "Không thể biên tập nhóm xương cho đồ vượt quyền cho thư viện" +msgstr "Không thể chỉnh sửa nhóm xương dành cho vượt quyền thư viện được" msgid "Constraint '%s' not found in pose bone '%s'" -msgstr "Không tìm được ràng buộc '%s' trong xương dạng đứng '%s'" +msgstr "Không tìm thấy ràng buộc '%s' trong xương tư thế '%s'" msgid "Bone '%s' is not a B-Bone!" -msgstr "Xương '%s' không phải là Xương-B!" +msgstr "Xương '%s' không phải là Xương-Dẻo!" + + +msgid "Bone '%s' has out of date B-Bone segment data - depsgraph update required!" +msgstr "Xương '%s' có dữ liệu phân đoạn Xương-Dẻo đã lỗi thời - cần phải cập nhật đồ thị nhé!" msgid "Invalid index %d for B-Bone segments of '%s'!" -msgstr "Chỉ số %d không hợp lệ cho khúc Xương-B của '%s'!" +msgstr "Chỉ số bất hợp lệ %d cho các phân đoạn Xương-Dẻo của '%s'!" msgid "A non convex collision shape was passed to the function, use only convex collision shapes" -msgstr "Đã gởi một hình dạng vô lõm cho hàm số, chỉ được dùng hình dạng lõm" +msgstr "Một hình va đập không lồi đã được giao cho hàm số, chỉ sử dụng các hình va đập lồi mà thôi" msgid "Rigidbody world was not properly initialized, need to step the simulation first" -msgstr "Chưa khởi động thế giới thân rắn đúng, cần bước mô phỏng trước" +msgstr "Thế giới thân cứng chưa được khởi thủy đúng đắn, cần khởi bước mô phỏng trước đã" + + +msgid "Use the scene orientation" +msgstr "Sử dụng định hướng của cảnh" msgid "Keying set could not be added" -msgstr "Không thêm được tập bức ảnh mẫu" +msgstr "Không thể thêm bộ hình mẫu" msgid "Style module could not be removed" -msgstr "Không xóa được mô đun phong cách" +msgstr "Không thể xóa được mô-đun phong cách" msgid "View Layer '%s' not found in scene '%s'" -msgstr "Không tìm được Lớp Màn Chiếu '%s' trong cảnh '%s'" +msgstr "Không tìm thấy Tầng Góc Nhìn '%s' trong cảnh '%s'" msgid "Render view '%s' could not be removed from scene '%s'" -msgstr "Không xóa được màn kết xuất '%s' không thể xóa từ cảnh '%s'" +msgstr "Không thể xóa được khung nhìn kết xuất '%s' khỏi cảnh '%s'" msgid "Timeline marker '%s' not found in scene '%s'" -msgstr "Không tìm được ký hiệu thời biểu '%s' trong cảnh '%s'" +msgstr "Không tìm được dấu mốc lịch trình thời gian '%s' trong cảnh '%s'" msgid "Line set '%s' could not be removed" -msgstr "Không xóa được tập nét '%s'" +msgstr "Không xóa được bộ đường nét '%s'" msgid "Style module '%s' could not be removed" -msgstr "Không xóa được mô đun phong cách '%s'" +msgstr "Không thể xóa được mô-đun phong cách '%s'" msgid "Sequence type must be 'META'" -msgstr "Loại trình tự phải là 'META'" +msgstr "Thể loại trình tự phải là 'META' mới được" msgid "Sequence type does not support modifiers" -msgstr "Loại trình tự không hổ trợ bộ điều chỉnh" +msgstr "Thể loại dải phim không được bộ điều chỉnh hỗ trợ" msgid "Modifier was not found in the stack" -msgstr "Không tìm được bộ điều chỉnh trong xếp đồng" +msgstr "Không tìm thấy bộ điều chỉnh nào trong ngăn xếp cả" msgid "Recursion detected, can not use this strip" -msgstr "Đã phát hiện đệ quy, không thể dùng đoạn này" +msgstr "Phát hiện thấy có sự hồi quy, không thể sử dụng dải này được" msgid "Sequences.new_sound: unable to open sound file" @@ -114628,123 +128204,175 @@ msgstr "Sequences.new_image: không mở được tập tin âm thanh" msgid "Blender compiled without Audaspace support" -msgstr "Biên dịch Blender thiếu hỗ trợ cho Audaspace" +msgstr "Bản Blender này vốn được biên dịch không có sự hỗ trợ Audaspace" msgid "Sequences.new_effect: end frame not set" -msgstr "Sequences.new_effect: chưa đặt được bức ảnh cuối" +msgstr "Sequences.new_effect: khung hình cuối chưa đặt" msgid "Sequences.new_effect: effect takes 1 input sequence" -msgstr "Sequences.new_effect: hiệu ứng cần 1 trình tự ngõ vào" +msgstr "Sequences.new_effect: hiệu ứng cần được cung cấp 1 trình tự" msgid "Sequences.new_effect: effect takes 2 input sequences" -msgstr "Sequences.new_effect: hiệu ứng cần 2 trình tự ngõ vào" +msgstr "Sequences.new_effect: hiệu ứng cần được cung cấp 2 trình tự" msgid "Sequences.new_effect: effect takes 3 input sequences" -msgstr "Sequences.new_effect: hiệu ứng cần 3 trình tự ngõ vào" +msgstr "Sequences.new_effect: hiệu ứng cần được cung cấp 3 trình tự" msgid "SequenceElements.pop: cannot pop the last element" -msgstr "SequenceElements.pop: không bỏ được phần từ cuối" +msgstr "Sequenceelements.pop: không thể xóa phần tử cuối cùng được" msgid "SequenceElements.pop: index out of range" -msgstr "SequenceElements.pop: chỉ số ngoài phạm vi" +msgstr "Sequenceelements.pop: chỉ số nằm ngoài phạm vi" msgid "Sequences.new_effect: effect expects more than 3 inputs (%d, should never happen!)" -msgstr "Sequences.new_effect: hiệu ứng cần hơn ba ngõ vào (%d, nên không bao giờ xảy ra!)" +msgstr "Sequences.new_effect: hiệu ứng cần 3 nguồn cung cấp hoặc hơn (%d, đáng ra không bao giờ xảy ra!)" msgid "Sequence '%s' not in scene '%s'" -msgstr "Trình tự '%s' không ở trong cảnh '%s'" +msgstr "Dãy '%s' không ở trong cảnh '%s'" msgid "Sound not packed" -msgstr "Âm thanh chưa được gói lại" +msgstr "Âm thanh chưa được đóng gói" msgid "Scripting" -msgstr "Soạn Văn Thảo" +msgstr "Viết Tập Lệnh" msgid "'show_locked_time' is not supported for the '%s' editor" -msgstr "'show_locked_time' (hiện thời gian được khóa) không được hỗ trợ trong trình biên soạn '%s'" +msgstr "Chức năng 'show_locked_time' (hiển thị thời gian khóa) không được hỗ trợ cho trình biên soạn '%s'" + + +msgid "Track '%s' is not found in the tracking object %s" +msgstr "Không tìm thấy giám sát '%s' trong đối tượng theo dõi %s" + + +msgid "Plane track '%s' is not found in the tracking object %s" +msgstr "Không tìm thấy giám sát bình diện '%s' trong đối tượng theo dõi %s" msgid "MovieTracking '%s' cannot be removed" -msgstr "Không thể xóa TheoDỏiPhim '%s'" +msgstr "Giám Sát Phim '%s' không thể xóa được" + + +msgid "Registering panel class:" +msgstr "Đăng ký lớp bảng:" msgid "Region not found in space type" -msgstr "Không tìm được vùng trong loại không gian" +msgstr "Vùng không tìm thấy trong thể loại không gian" + + +msgid "%s '%s' has category '%s'" +msgstr "%s '%s' có hạng mục '%s'" + + +msgid "%s '%s', bl_idname '%s' could not be unregistered" +msgstr "%s '%s', bl_idname '%s' không thể hủy đăng ký" + + +msgid "%s parent '%s' for '%s' not found" +msgstr "%s phụ huynh '%s' cho '%s' không tìm thấy" + + +msgid "Registering asset shelf class: '%s' is too long, maximum length is %d" +msgstr "Kệ tài sản đang đăng ký: '%s' là quá dài, độ dài tối đa là %d" + + +msgid "Script directory not found" +msgstr "Không tìm thấy thư mục tập lệnh" + + +msgid "Extension repository not found" +msgstr "Không tìm thấy kho lưu trữ tiện ích mở rộng" msgid "Add-on is no longer valid" -msgstr "Đồ kèm không hợp lệ nữa" +msgstr "Trình bổ sung không còn hợp lệ nữa" msgid "Excluded path is no longer valid" -msgstr "Đường dẫn bị trừ không còn hợp lệ" +msgstr "Đường dẫn loại trừ không còn hợp lệ nữa" msgid "Font not packed" -msgstr "Phông chưa được gói lại" +msgstr "Phông chưa được đóng gói" + + +msgid "Could not find grid with name %s" +msgstr "Không tìm thấy khung lưới đồ thị có cá tên là %s được" + + +msgid "No active window in context!" +msgstr "Không có cửa sổ đang hoạt động nào trong ngữ cảnh cả!" msgid "Not a non-modal keymap" -msgstr "Không phải là ánh xạ phím không cách thức" +msgstr "Không phải là ấn định phím phi mô thái (non-modal)" msgid "Can not mix modal/non-modal items" -msgstr "Không thể pha trộn mặt hàng cách thức/không cách thức" +msgstr "Không thể trộn lẫn các đối tượng mô-thái/phi mô-thái với nhau được" msgid "Not a modal keymap" -msgstr "Không phài là ánh xạ phím cách thức" +msgstr "Không phải là một ấn định phím mô thái (modal)" msgid "Property value not in enumeration" -msgstr "Đặc tính không ở trong liệt kê" +msgstr "Giá trị tính chất không nằm trong bảng liệt kê (enumeration)" msgid "Not running with '--enable-event-simulate' enabled" -msgstr "Không chạy có bật '--enable-event-simulate' ('--bật-mô-phỏng-sự-kiện')" +msgstr "Không được thi hành với '--enable-event-simulate' (cho phép mô phỏng sự kiện) hoạt động" msgid "Value: only 'PRESS/RELEASE/NOTHING' are supported" -msgstr "Giá trị: chỉ 'BẤM/THẢ/KHÔNG CÓ GÌ' được hỗ trợ" +msgstr "Giá trị: chỉ hỗ trợ 'BẤM/THẢ/KHÔNG CÓ GÌ' (PRESS/RELEASE/NOTHING) mà thôi" msgid "Value: must be 'PRESS/RELEASE' for keyboard/buttons" -msgstr "Giá trị: phải là 'BẤM/THẢ' cho bàn phím/nút" +msgstr "Giá trị: nhận định phải là 'BẤM/THẢ' (PRESS/RELEASE) đối với các nút bàn phím/nút bấm" msgid "Value: must be 'NOTHING' for motion" -msgstr "giá trị: phải là 'KHÔNG CÓ GÌ' cho chuyển động" +msgstr "Giá trị: nhận định phải là 'KHÔNG CÓ GÌ' (NOTHING) đối với chuyển động" msgid "Value: must be 'PRESS' when unicode is set" -msgstr "Giá trị: phải là 'BẤM' khi đặt unicode " +msgstr "Giá trị: nhất định phải là 'BẤM' (PRESS) khi sử dụng (bật) unicode" msgid "Only a single character supported" -msgstr "Chỉ hỗ trợ một ký tự" +msgstr "Chỉ hỗ trợ một đơn ký tự" msgid "Gizmo group type '%s' not found!" -msgstr "Không tìm được đồ đạc loại '%s'" +msgstr "Không tìm thấy thể loại nhóm Gizmo '%s'!" msgid "Gizmo group '%s' has 'PERSISTENT' option set!" -msgstr "Nhóm đồ đạc '%s' được đặt tùy chọn 'CÔ_CHẤP'" +msgstr "Nhóm Gizmo '%s' có tùy chọn 'ỔN ĐỊNH' (PERSISTENT) được bật (sử dụng/hoạt động)!" + + +msgid "KeyMapItem '%s' not found in KeyMap '%s'" +msgstr "Không tìm thấy Chi Mục Bố Trí Bàn Phím '%s' trong Cấu Hình Bàn Phím '%s'" msgid "Modal key-maps not supported for add-on key-config" -msgstr "Không hỗ trợ ánh xạ phím cách thức cho cấu hình phím của đồ kèm" +msgstr "Đối với cấu hình phím cho trình bổ sung, bố trí phím mô thái sẽ không được hỗ trợ" + + +msgid "KeyMap '%s' not found in KeyConfig '%s'" +msgstr "Không tìm thấy Bố Trí Bàn Phím '%s' trong Cấu Hình Bàn Phím '%s'" msgid "KeyConfig '%s' cannot be removed" @@ -114752,35 +128380,39 @@ msgstr "Không thể xóa Cấu Hình Phím '%s'" msgid "GizmoType '%s' not known" -msgstr "Chưa biết đến LoạiĐồĐạc '%s'" +msgstr "Không nhận ra thể loại Gizmo '%s'" msgid "GizmoType '%s' is for a 3D gizmo-group. The 'draw_select' callback is set where only 'test_select' will be used" -msgstr "LoạiĐồĐạc '%s' được dùng cho một nhóm đồ đạc 3D. Kêu lại 'draw_select' được đặt khi chỉ được dùng 'test_select'" +msgstr "GizmoType (kiểu Gizmo) '%s' là dành cho nhóm-gizmo 3D. Hàm gọi lại 'draw_select' cần phải được đặt ở nơi mà 'test_select' sẽ được sử dụng" + + +msgid "%s area type does not support gizmos" +msgstr "%s thể loại khu vực không hỗ trợ các gizmo" msgid "Gizmo target property '%s.%s' not found" -msgstr "Đặc tính mục tiêu đồ đạc '%s.%s' không tìm được" +msgstr "Không tìm thấy tính chất mục tiêu Gizmo '%s.%s'" msgid "Property '%s.%s' not found" -msgstr "Đặc tính '%s.%s' không tìm được" +msgstr "Không tìm thấy tính chất '%s.%s'" msgid "Gizmo target '%s.%s' expects '%s', '%s.%s' is '%s'" -msgstr "Mục tiêu đồ đạc '%s.%s' định '%s', '%s.%s' là '%s'" +msgstr "Mục tiêu Gizmo '%s.%s' mong chờ là '%s', '%s.%s' là '%s'" msgid "Gizmo target property '%s.%s' expects an array of length %d, found %d" -msgstr "Mục tiêu đồ đạc '%s.%s' định có mảng dài = %d, tìm được %d" +msgstr "Tính chất mục tiêu Gizmo '%s.%s' mong chờ một mảng với chiều dài %d, song tìm được là %d" msgid "Gizmo target property '%s.%s' expects an array of length %d" -msgstr "Mục tiêu đồ đạc '%s.%s' định có mảng dài = %d" +msgstr "Tính chất mục tiêu Gizmo '%s.%s' mong chờ một mảng với chiều dài %d" msgid "Gizmo target property '%s.%s', index %d must be below %d" -msgstr "Mục tiêu đồ đạc '%s.%s', chỉ số %d phải nhỏ hơn %d" +msgstr "Tính chất mục tiêu Gizmo '%s.%s', chỉ số %d phải thấp hơn %d" msgid "%s '%s'" @@ -114788,115 +128420,115 @@ msgstr "%s '%s'" msgid "wmOwnerID '%s' not in workspace '%s'" -msgstr "wmOwnerID '%s' không ở trong công trường '%s'" +msgstr "wmOwnerID (Định danh của chủ sở hữu WM) '%s' không nằm trong không gian làm việc '%s'" msgid "Operator '%s' not found!" -msgstr "Thao tác '%s' không tìm được!" +msgstr "Không tìm thấy thao tác '%s'!" msgid "Gizmo group '%s' not found!" -msgstr "Nhóm đồ đạc '%s' không tìm được!" +msgstr "Không tìm thấy nhóm Gizmo '%s'!" msgid "ActionMapBinding '%s' cannot be removed from '%s'" -msgstr "Không thể xóa SựTróiÁnhXạHànhĐộng '%s' từ '%s'" +msgstr "ActionMapBinding '%s' không thể bị xóa khỏi '%s' được" msgid "ActionMapItem '%s' cannot be removed from '%s'" -msgstr "Không thể xóa MặtHàngÁnhXạHànhĐộng '%s' từ '%s'" +msgstr "ActionMapItem '%s' không thể bị xóa khỏi '%s' được" msgid "ActionMap '%s' cannot be removed" -msgstr "Không thể xóa ÁnhXạHànhĐộng '%s'" +msgstr "ActionMap '%s không thể xóa được" msgid "First and Last Copies" -msgstr "Bảo sao đầu và cuối" +msgstr "Các Bản Sao Đầu và Cuối" msgid "Offset U" -msgstr "Dịch U" +msgstr "Dịch Chuyển U" msgid "Cap Start" -msgstr "Nắp Bắt Đầu" +msgstr "Nắp Đầu" msgid "The offset is too small, we cannot generate the amount of geometry it would require" -msgstr "Dịch rất nhỏ, không thể chế tạo số lượng hình dạng nó sẽ cần" +msgstr "Mức dịch chuyển quá nhỏ, chúng ta không thể tạo ra lượng hình học mà nó yêu cầu được" msgid "The amount of copies is too high, we cannot generate the amount of geometry it would require" -msgstr "Số lượng sao chép qúa cao, không thể chế tạo số lượng hình dạng nó sẽ cần" +msgstr "Số lượng bản sao quá cao, chúng ta không thể tạo ra số lượng hình học mà nó yêu cầu được" msgid "Cannot execute, intersect only available using exact solver" -msgstr "Không thể thực hành, giao cắt chỉ được dùng trình giải nghiệm chính xác" +msgstr "Không thể thực thi, sự giao cắt chỉ cho phép khi sử dụng bộ giải nghiệm chính xác mà thôi" msgid "Cannot execute, fast solver and empty collection" -msgstr "Không thể thực hành, trình giải nghiệm nhanh và sưu tập trống rỗng" +msgstr "Không thể thực thi, trình giải nghiệm nhanh và bộ sưu tập trống rỗng" msgid "Cannot execute, the selected collection contains non mesh objects" -msgstr "Không thể thực hành, sưu tập đã chọn đang chứa vật thể không phải là mạng lưới" +msgstr "Không thể thực thi, bộ sưu tập lựa chọn có chứa các đối tượng không phải là khung lưới" msgid "Cannot execute boolean operation" -msgstr "Không thể thực hành thao tác bool" +msgstr "Không thể thi hành phép toán bool được" msgid "Solver Options" -msgstr "Tùy Chọn Trình Giải Nghiệm" +msgstr "Các Tùy Chọn của Trình Giải Nghiệm" msgid "Settings are inside the Physics tab" -msgstr "Cài đặt ở trong nhãn Vật Lý" +msgstr "Các sắp đặt đều nằm ở trong mục Vật Lý" msgid "Unbind" -msgstr "Gỡ Trói" +msgstr "Tháo Kết Buộc" msgid "Bind" -msgstr "Trói Lại" +msgstr "Kết Buộc" msgid "CorrectiveSmooth" -msgstr "MịnChỉnhSửa" +msgstr "LàmMịnChỉnhSửa" msgid "Attempt to bind from inactive dependency graph" -msgstr "Thử trói từ biểu đồ phụ thuộc không hoạt động" +msgstr "Thử kết buộc từ đồ thị phụ thuộc không hoạt động" msgid "Bind data required" -msgstr "Yêu cầu dữ liệu trói" +msgstr "Đòi hỏi phải có dữ liệu kết buộc" msgid "Bind vertex count mismatch: %u to %u" -msgstr "Số lượng đỉnh trói không giống: %u so %u" +msgstr "Số điểm đỉnh kết buộc không tương đồng: %u thành %u" msgid "Object is not a mesh" -msgstr "Vật thể không phải là mạng lưới" +msgstr "Đối tượng không phải là một khung lưới" msgid "Original vertex count mismatch: %u to %u" -msgstr "Số lượng đỉnh ban đầu không giống: %u so %u" +msgstr "Số lượng điểm đỉnh gốc không tương đồng: %u thành %u" msgid "Curve Object" -msgstr "Vật Thể Đường Cong" +msgstr "Đối Tượng Đường Cong" msgid "Generate Data Layers" -msgstr "Chế Tạo Lớp Dữ Liệu" +msgstr "Sinh Tạo Tầng Dữ Liệu" msgid "Layer Mapping" -msgstr "Ánh Xạ Lớp" +msgstr "Ánh Xạ Tầng Lớp" msgid "DataTransfer" @@ -114904,47 +128536,47 @@ msgstr "TruyềnDữLiệu" msgid "Topology Mapping" -msgstr "Ánh Xạ Tô Pô" +msgstr "Ánh Xạ Cấu Trúc Liên Kết" msgid "Face Count: %d" -msgstr "Dân Số Mặt: %d" +msgstr "Số Lượng Mặt: %d" msgid "Modifier requires more than 3 input faces" -msgstr "Bộ điều chỉnh yêu cầu ngõ vào 3 mặt trở lên" +msgstr "Bộ điều chỉnh đòi hỏi hơn 3 các mặt cung cấp ở đầu vào" msgid "EdgeSplit" -msgstr "ChẻCạnh" +msgstr "PhânTáchCạnh" msgid "Refresh" -msgstr "Nạp Lại" +msgstr "Làm Tươi Lại" msgid "Recenter" -msgstr "Đặt Lại Trung Tâm" +msgstr "Tái Trung Tâm Hóa" msgid "LaplacianDeform" -msgstr "MéoHóaLaplace" +msgstr "BiếnDạngLaplace" msgid "Vertices changed from %d to %d" -msgstr "Đỉnh đã đổi từ %d đến %d" +msgstr "Số điểm đỉnh thay đổi, từ %d thành %d" msgid "Edges changed from %d to %d" -msgstr "Cảnh đã đổi từ %d đến %d" +msgstr "Số cạnh thay đổi, từ %d thành %d" msgid "Vertex group '%s' is not valid, or maybe empty" -msgstr "Nhóm đỉnh '%s' không hợp lệ, hoặc có lẽ trống" +msgstr "Nhóm điểm đỉnh '%s' hoặc là không hợp lệ, hoặc là trống rỗng" msgid "The system did not find a solution" -msgstr "Hệ thống không tìm được một giải nghiệm" +msgstr "Hệ thống không tìm được giải nghiệm nào cả" msgid "LaplacianSmooth" @@ -114952,7 +128584,7 @@ msgstr "MịnHóaLaplace" msgid "Compiled without OpenVDB" -msgstr "Đã biên dịch thiếu OpenVDB" +msgstr "Biên dịch không có OpenVDB" msgid "MeshCache" @@ -114960,71 +128592,116 @@ msgstr "ĐệmChứaMạngLưới" msgid "'Integrate' only valid for Mesh objects" -msgstr "'Gồm' chỉ hợp lệ cho vật thể Mạng Lưới" +msgstr "'Tích hợp' chỉ hợp lệ đối với các đối tượng Khung Lưới mà thôi" msgid "'Integrate' original mesh vertex mismatch" -msgstr "'Gồm' đỉnh mạng lưới ban đầu không giống" +msgstr "'Tích hợp' điểm đỉnh lưới gốc không ăn khớp" msgid "'Integrate' requires faces" -msgstr "'Gồm' yêu cầu có mặt" +msgstr "'Tích hợp' đòi hỏi một số các mặt" msgid "Time Remapping" -msgstr "Ánh Xạ Lại Thời Gian" +msgstr "Bố Trí Lại Thời Gian" msgid "Axis Mapping" msgstr "Ánh Xạ Trục" +msgid "Missing header" +msgstr "Thiếu tiêu đề" + + +msgid "Vertex count mismatch" +msgstr "Số điểm đỉnh không khớp" + + +msgid "Invalid frame total" +msgstr "Tổng số khung hình không hợp lệ" + + +msgid "Timestamp read failed" +msgstr "Không đọc được dấu thời gian" + + +msgid "Header seek failed" +msgstr "Không tìm kiếm được tiêu đề" + + +msgid "Failed to seek frame" +msgstr "Không thể tìm kiếm khung hình" + + +msgid "Failed to read frame" +msgstr "Không đọc được khung hình" + + +msgid "Vertex coordinate read failed" +msgstr "Không đọc được tọa độ điểm đỉnh" + + +msgid "Unknown error opening file" +msgstr "Lỗi mở tập tin không xác định được" + + +msgid "Invalid header" +msgstr "Tiêu đề không hợp lệ" + + msgid "MeshDeform" -msgstr "MéoHóaMạngLưới" +msgstr "BiếnDạngKhungLưới" msgid "Cannot get mesh from cage object" -msgstr "Không thhể lấy mạng lưới từ vật thể lồng" +msgstr "Không thể lấy khung lưới ra từ đối tượng lồng được" msgid "Cage vertices changed from %d to %d" -msgstr "Đỉnh lồng được đổi từ %d đến %d" +msgstr "Các điểm đỉnh của lồng thay đổi từ %d thành %d" msgid "Bind data missing" -msgstr "Dữ liệu trói bị thiếu" +msgstr "Dữ liệu kết buộc bị thiếu" msgid "MeshSequenceCache" -msgstr "ĐệmChứaTrìnhTựMạngLưới" +msgstr "ĐệmTrìnhTựKhungLưới" msgid "Could not create reader for file %s" -msgstr "Không chế tạo được bộ đọc cho tập tin: %s" +msgstr "Không thể kiến tạo trình đọc cho tập tin %s được" msgid "Bisect" -msgstr "Cắt thành hai" +msgstr "Phân Đôi" msgid "Flip UDIM" -msgstr "Lật UDIM" +msgstr "Đảo Chiều UDIM" + + +msgctxt "Mesh" +msgid "Clipping" +msgstr "Cắt Xén" msgid "Level Viewport" -msgstr "Màn Chiếu Tầng" +msgstr "Mức Cổng Nhìn" msgid "Unsubdivide" -msgstr "Tóp Lại Phân Hóa" +msgstr "Hủy Phân Chia" msgid "Delete Higher" -msgstr "Xóa Cao Hơn" +msgstr "Xóa Mức Cao Hơn" msgid "Reshape" -msgstr "Hình Dạng Lại" +msgstr "Đổi Hình Dạng" msgid "Apply Base" @@ -115032,59 +128709,59 @@ msgstr "Áp Dụng Cơ Sở" msgid "Rebuild Subdivisions" -msgstr "Xây Dựng Phân Hóa" +msgstr "Tái Dựng Mức Phân Hóa" msgid "Pack External" -msgstr "Gói Ngoại Bộ" +msgstr "Đóng Gói Bên Ngoài" msgid "Save External..." -msgstr "Lưu Ngoại Bộ..." +msgstr "Lưu Ra Bên Ngoài..." msgid "Multires" -msgstr "Đa Độ Phân Giải" +msgstr "Đa Phân Giải" msgid "Disabled, built without OpenSubdiv" -msgstr "Đã tắt, đã xây dựng thiếu OpenSubdiv" +msgstr "Tắt (giải hoạt), không được xây dựng với OpenSubdiv" msgid "No named attributes used" -msgstr "Không có đặc điểm có được sử dụng" +msgstr "Không có thuộc tính được đặt tên nào được sử dụng" msgid "No group output attributes connected" -msgstr "Không có đặc điểm ngõ ra nhóm được két nối" +msgstr "Không có nhóm thuộc tính đầu ra nào kết nối cả" msgid "Output Attributes" -msgstr "Đăc Điểm Ngõ Ra" +msgstr "Thuộc Tính Xuất ở Đầu Ra" msgid "Internal Dependencies" -msgstr "Đồ Nhờ Nội Dung" +msgstr "Những Phụ Thuộc Nội Bộ" msgid "Missing property for input socket \"%s\"" -msgstr "Thiếu đặt tính cho ổ cằm ngõ vào \"%s\"" +msgstr "Thiếu tính chất cho ổ cắm đầu vào \"%s\"" msgid "Property type does not match input socket \"(%s)\"" -msgstr "Loại đặt tính không giống đổ cắm ngõ vào \"(%s)\"" +msgstr "Thể loại tính chất không khớp với ổ cắm đầu vào \"(%s)\"" msgid "Node group's geometry input must be the first" -msgstr "Ngõ vào cho hình dạng của nhóm đỉnh phải là thứ nhất" +msgstr "Đầu vào hình học của nhóm nút phải là đầu vào trước tiên" msgid "Node group must have an output socket" -msgstr "Nhóm đỉnh phải có một ổ cắm ngõ ra" +msgstr "Nhóm nút phải có ổ cắm đầu ra" msgid "Node group's first output must be a geometry" -msgstr "Ngõ ra thứ nhất của nhóm đỉnh phải là hình dạng" +msgstr "Đầu ra đầu tiên của nhóm nút phải là một hình học" msgid "NormalEdit" @@ -115092,11 +128769,11 @@ msgstr "BiênTậpPhápTuyến" msgid "Invalid target settings" -msgstr "Cài đặt mục tiêu không hợp lệ" +msgstr "Sắp đặt mục tiêu không hợp lệ" msgid "Coverage" -msgstr "Sự Che Khuất" +msgstr "Diện Tích Bao Phủ" msgid "Delete Bake" @@ -115104,15 +128781,20 @@ msgstr "Xóa Nướng" msgid "Built without Ocean modifier" -msgstr "Xây dựng thiếu bộ điều chỉnh Đại Dương" +msgstr "Phiên bản được tạo dựng không có Bộ Điều Chỉnh Mô Phỏng Đại Dương" + + +msgctxt "Mesh" +msgid "Spray" +msgstr "Bụi Nước" msgid "Failed to allocate memory" -msgstr "Giành bộ nhớ bị thất bại" +msgstr "Không thể phân bổ bộ nhớ được" msgid "Create Instances" -msgstr "Chế Tạo Thực Thể" +msgstr "Kiến Tạo Thực Thể" msgid "Coordinate Space" @@ -115120,7 +128802,7 @@ msgstr "Không Gian Tọa Độ" msgid "Create Along Paths" -msgstr "Chế Tạo Theo Đường Đi" +msgstr "Kiến Tạo Dọc Theo Đường Dẫn" msgid "ParticleInstance" @@ -115128,112 +128810,121 @@ msgstr "ThựcThểHạt" msgid "Settings are in the particle tab" -msgstr "Cài đặt ở trong nhãn hạt" +msgstr "Các sắp đặt đều nằm ở trong mục Hạt" msgctxt "Operator" msgid "Convert to Mesh" -msgstr "Biến Đổi sang Mạng Lưới" +msgstr "Chuyển Đổi thành Khung Lưới" msgid "Built without Remesh modifier" -msgstr "Xây mà không có bộ điều chỉnh Làm Mạng Lưới Lại" +msgstr "Phiên bản được tạo dựng không có Bộ Điều Chỉnh Kiến Tạo Lại Khung Lưới" msgid "Axis Object" -msgstr "Vật Thể Trục" +msgstr "Đối Tượng Trục" msgid "Steps Viewport" -msgstr "Màn Chiếu Bước" +msgstr "Số Bước ở Cổng Nhìn" msgid "Stretch UVs" -msgstr "Kéo Dài UV" +msgstr "Co Kéo các UV" msgid "SimpleDeform" -msgstr "MéoHóaĐơnGiản" +msgstr "BiếnDạngĐơnGiản" msgid "Create Armature" -msgstr "Chế Tạo Cốt" +msgstr "Kiến Tạo Khung Cốt" msgid "Mark Loose" -msgstr "Ký Rời Ra" +msgstr "Đánh Dấu là Lỏng Lẻo" msgid "Clear Loose" -msgstr "Xóa Rời Ra" +msgstr "Xóa Dấu Lỏng Lẻo" msgid "Mark Root" -msgstr "Ký Dấu Rễ" +msgstr "Đánh Dấu Là Gốc" msgid "Equalize Radii" -msgstr "Giống Hóa Các Bạn Kính" +msgstr "Cân Bằng Bán Kính" msgid "No valid root vertex found (you need one per mesh island you want to skin)" -msgstr "Không tìm được đỉnh rễ nào hợp lệ (nó cần một cái cho mỗi hòn đảo mạng lưới trong bạn muốn da hóa)" +msgstr "Không tìm thấy điểm đỉnh gốc hợp lệ (bạn cần phải có một cái mỗi hải đảo khung lưới mà bạn muốn bọc da)" msgid "Hull error" -msgstr "Lỗi lầm vỏ" +msgstr "Lỗi vỏ bọc" msgid "Crease Inner" -msgstr "Nhăn Nội" +msgstr "Miết Cạnh Bên Trong" msgid "Outer" -msgstr "Ngoại" +msgstr "Bên Ngoài" msgid "Shell" msgstr "Vỏ" +msgctxt "Mesh" +msgid "Rim" +msgstr "Vành Mép" + + msgid "Thickness Clamp" -msgstr "Kẹp Lại Chiều Dày" +msgstr "Hạn Định Độ Dày" msgid "Output Vertex Groups" -msgstr "Nhóm Đỉnh Ngõ Ra" +msgstr "Nhóm Điểm Đỉnh Đầu Ra" msgid "Internal Error: edges array wrong size: %u instead of %u" -msgstr "Lỗi Lầm Nội Bộ: chiều dài mảng cạnh không đúng: %u thay thế %u" +msgstr "Lỗi Nội Bộ: kích thước mảng cạnh không đúng: %u thay vì %u" + + +msgid "Internal Error: faces array wrong size: %u instead of %u" +msgstr "Lỗi Nội Bộ: mảng các mặt có kích thước sai: %u thay vì %u" msgid "Internal Error: loops array wrong size: %u instead of %u" -msgstr "Lỗi Lầm Nội Bộ: chiều dài mảng lặp vòng không đúng: %u thay thế %u" +msgstr "Lỗi Nội Bộ: kích thước của mảng vòng mạch không đúng: %u thay vì %u" msgid "Adaptive Subdivision" -msgstr "Phân Hóa Ứng Phó" +msgstr "Phân Hóa Tùy Ứng" msgid "Levels Viewport" -msgstr "Màn Chiếu Tầng" +msgstr "Mức Cổng Nhìn" msgid "Final Scale: Render %.2f px, Viewport %.2f px" -msgstr "Phóng To Cuối: Kết Xuất %.2f điểm ảnh, Màn Chiếu %.2f điểm ảnh" +msgstr "Tỷ lệ cuối cùng: Kết Xuất %.2f điểm ảnh, Cổng Nhìn %.2f điểm ảnh" msgid "SurfaceDeform" -msgstr "MéoHóaBềMặt" +msgstr "BiếnDạngBềMặt" msgid "Out of memory" -msgstr "Hết bộ nhớ" +msgstr "Bộ nhớ cạn kiệt" msgid "Target has edges with more than two polygons" -msgstr "Mục tiêu có cạnh có hơn hai đa giác" +msgstr "Mục tiêu có các cạnh với hơn hai đa giác" msgid "Target contains concave polygons" @@ -115241,7 +128932,7 @@ msgstr "Mục tiêu có đa giác lõm" msgid "Target contains overlapping vertices" -msgstr "Mục tiêu có đỉnh lấn trên nhau" +msgstr "Mục tiêu có đa giác chồng chéo lên nhau" msgid "Target contains invalid polygons" @@ -115249,45 +128940,49 @@ msgstr "Mục tiêu có đa giác không hợp lệ" msgid "No vertices were bound" -msgstr "Không có đỉnh nào được trói lại" +msgstr "Không có điểm đỉnh nào đã kết buộc cả" msgid "No valid target mesh" -msgstr "Không có mạng lưới mục tiêu hợp lệ" +msgstr "Không có khung lưới đích hợp lệ" msgid "Attempt to unbind from inactive dependency graph" -msgstr "Thử gỡ trói từ biểu đồ phụ thuộc không hoạt động" +msgstr "Cố Gắng tháo kết buộc từ đồ thị phụ thuộc không hoạt động" msgid "Vertices changed from %u to %u" -msgstr "Đỉnh đã đổi từ %u đến %u" +msgstr "Số điểm đỉnh đã thay đổi từ %u thành %u" msgid "Target polygons changed from %u to %u" -msgstr "Đa giác mục tiêu đã đổi từ %u đến %u" +msgstr "Số đa giác mục tiêu đã thay đổi từ %u thành %u" msgid "Target vertices changed from %u to %u" -msgstr "Đỉnh mục tiêu đã đổi từ %u đến %u" +msgstr "Số điểm đỉnh mục tiêu đã thay đổi từ %u thành %u" + + +msgid "This modifier can only deform filled curve/surface, not the control points" +msgstr "Bộ điều chỉnh này chỉ có thể biến dạng đường cong/bề mặt đã phủ kín mà thôi, chứ không thể làm với các điểm điều khiển được" msgid "This modifier can only deform control points, not the filled curve/surface" -msgstr "Bộ điều chỉnh này chỉ được méo điểm kiểm soát, không phải đường congy/bề mặt được đầy lại" +msgstr "Bộ điều chỉnh này chỉ có thể biến dạng các điểm điều khiển mà thôi, không thể làm đối với đường cong/bề mặt đã phủ kín được" msgctxt "Operator" msgid "Apply as Shape Key" -msgstr "Áp dụng như Mẫu Dạng" +msgstr "Áp Dụng thành Hình Mẫu" msgctxt "Operator" msgid "Save as Shape Key" -msgstr "Lưu như Mẫu Dạng" +msgstr "Lưu thành Hình Mẫu" msgid "UVProject" -msgstr "ChiếuUV" +msgstr "Phóng Chiếu UV" msgid "Axis U" @@ -115295,15 +128990,15 @@ msgstr "Trục U" msgid "UVWarp" -msgstr "MéoHóaUV" +msgstr "Kéo UV" msgid "Cannot find '%s' grid" -msgstr "Không thể tìm được đồ thị '%s'" +msgstr "Không tìm thấy khung lưới đồ thị '%s'" msgid "Could not generate mesh from grid" -msgstr "Không thể chế tạo mạng lưới từ đồ thị" +msgstr "Không thể sinh tạo khung lưới từ khung lưới đồ thị được" msgid "Motion" @@ -115311,175 +129006,183 @@ msgstr "Chuyển Động" msgid "Along Normals" -msgstr "Theo Pháp Tuyến" +msgstr "Dọc Theo Pháp Tuyến" msgid "Life" -msgstr "Sống" +msgstr "Tuổi Thọ" msgid "Start Position" -msgstr "Vi Trí Bắt Đầu" +msgstr "Vị Trí Khởi Đầu X" msgid "WeightedNormal" -msgstr "PhápTuyếnCóQuyềnLượng" +msgstr "PhápTuyếnCânTrọng" msgid "Global Influence:" -msgstr "Sự Ảnh Hưởng Toàn Cầu:" +msgstr "Ảnh Hưởng Toàn Cầu:" msgid "VertexWeightEdit" -msgstr "BiênTậpQuyềnLượnngĐỉnh" +msgstr "BiênSoạnTrọngLượngĐiểmĐỉnh" msgid "VertexWeightMix" -msgstr "PhaTrộnQuyềnLượngĐỉnh" +msgstr "HòaTrộnTrọngLượngĐiểmĐỉnh" msgid "VertexWeightProximity" -msgstr "CáchGầnQuyềnLượngĐỉnh" +msgstr "MứcLânCậnTrọngLượngĐiểmĐỉnh" msgid "Replace Original" -msgstr "Thay Thế Nguồn Gốc" +msgstr "Thay Thế Bản Gốc" msgid "Crease Edges" -msgstr "Nhăn Cạnh" +msgstr "Miết Nếp Gấp của Cạnh" msgid "Matte" -msgstr "Lớp Che" +msgstr "Lớp Vẽ Lồng" msgid "Not a compositor node tree" -msgstr "Không phải là cây giao điểm của bộ ghép" +msgstr "Không phải là cây nút tổng hợp" msgid "Fac" -msgstr "Phân Số" +msgstr "Hệ Số" msgid "Determinator" -msgstr "Định Thức" +msgstr "Định Vị" msgid "Bounding box" -msgstr "Hộp bao quanh" +msgstr "Khung Hộp Viền" msgid "Color Space:" -msgstr "Không Gian Màu:" +msgstr "Không Gian Màu Sắc:" msgid "Key Channel:" -msgstr "Kênh Màu Trốn:" +msgstr "Kênh Khóa:" msgid "Limiting Channel:" -msgstr "Kênh Hạn Chế:" +msgstr "Kênh để Hạn Chế:" msgid "Key Color" -msgstr "Màu Trống" +msgstr "Màu Khóa" msgid "Despill Channel:" -msgstr "Dẹp Tràn Kênh:" +msgstr "Kênh Chống Tràn Vãi:" msgid "Master" -msgstr "Chủ" +msgstr "Chính" msgid "Highlights" -msgstr "Nổi Bật" +msgstr "Các Điểm Nhấn" msgid "Midtones" -msgstr "Độ Sáng Giữa" +msgstr "Trung Độ" msgid "Upper Left" -msgstr "Phía Trái Trên" +msgstr "Trên Trái" msgid "Upper Right" -msgstr "Phía Trái Trên" +msgstr "Trên Phải" msgid "Lower Left" -msgstr "Phía Trái Dưới" +msgstr "Dưới Trái" msgid "Lower Right" -msgstr "Phía Phải Dưới" +msgstr "Dưới Phải" msgid "The node tree must be the compositing node tree of any scene in the file" -msgstr "Cây giao điểm phải là cây giao điểm ghép của bất cứ cảnh nào trong tập tin" +msgstr "Cây nút phải là cây nút tổng hợp của bất kỳ cảnh nào trong tập tin" msgid "Pick" msgstr "Chọn" +msgid "Node not supported in the Viewport compositor" +msgstr "Nút vẫn chưa được hỗ trợ trong tổng hợp Cổng Chiếu" + + msgid "Bokeh Type:" -msgstr "Loại Tản Cảnh:" +msgstr "Loại Nhòe Bokeh:" msgid "Disabled, built without OpenImageDenoise" -msgstr "Đã tắt, đã xây dựng thiếu OpenImageDenoise" +msgstr "Bị tắt rồi, bản này không được xây dựng với chức năng Giảm Nhiễu Hình Ảnh Mở (OpenImageDenoise)" msgid "Disabled, CPU with SSE4.1 is required" -msgstr "Đã tắt, yêu cầu CPU có SSE4.1" +msgstr "Bị tắt rồi. Cần phải có bộ xử lý (CPU) với SSE4.1 (Streaming Single Instruction, Multiple Data Extensions 4) mới được" msgid "Prefilter:" -msgstr "Bộ Lọc Trước:" +msgstr "Bộ lọc xử lý trước:" msgid "Image 1" -msgstr "Ảnh 1" +msgstr "Hình Ảnh 1" msgid "Image 2" -msgstr "Ảnh 2" +msgstr "Hình Ảnh 2" msgid "Center:" -msgstr "Trung Tâm:" +msgstr "Tâm:" msgid "Inner Edge:" -msgstr "Cạnh Nội" +msgstr "Cạnh Trong:" msgid "Buffer Edge:" -msgstr "Cạnh Đệm:" +msgstr "Cạnh của Vùng Đệm:" msgid "Inner Mask" -msgstr "Mặt Nạ Nội" +msgstr "Màn Chắn Lọc Nội" msgid "Outer Mask" -msgstr "Mặt Nạ Ngoại" +msgstr "Màn Chắn Lọc Ngoại" msgid "ID value" msgstr "Giá trị ID" +msgid "Render passes not supported in the Viewport compositor" +msgstr "Các lượt kết xuất vẫn chưa được hỗ trợ trong tổng hợp Cổng Chiếu" + + msgid "Garbage Matte" -msgstr "Mặt Nạ Rác" +msgstr "Lớp Vẽ Lồng Loại Bỏ" msgid "Core Matte" -msgstr "Mặt Nạ Chánh" +msgstr "Lớp Vẽ Lồng Cốt Lõi" msgid "Dispersion" @@ -115491,31 +129194,31 @@ msgstr "Độ Lệch Chuẩn" msgid "From Min" -msgstr "Từ Cực Tiểu" +msgstr "Từ Tối Thiểu" msgid "From Max" -msgstr "Từ Cực Đại" +msgstr "Từ Tối Đa" msgid "To Min" -msgstr "Đến Cực Tiểu" +msgstr "Đến Tối Thiểu" msgid "To Max" -msgstr "Đến Cực Đại" +msgstr "Đến Tối Đa" msgid "Offset Y" -msgstr "Nới Y" +msgstr "Dịch Chuyển Y" msgid "Undistortion" -msgstr "Vô Méo Hóa" +msgstr "Không Biến Dạng" msgid "Dot" -msgstr "Dấu Chấm" +msgstr "Tích Vô Hướng" msgid "Path:" @@ -115527,11 +129230,11 @@ msgstr "Đường Dẫn Cơ Sở:" msgid "Add Input" -msgstr "Cộng Ngõ Vào" +msgstr "Thêm Đầu Vào" msgid "File Subpath:" -msgstr "Đường Hạ Đường Dẫn:" +msgstr "Đường Dẫn Thành Phần của Tập Tin:" msgid "Format:" @@ -115539,15 +129242,15 @@ msgstr "Định Dạng:" msgid "Degr" -msgstr "Độ" +msgstr "Góc Độ" msgid "Cb" -msgstr "Cb" +msgstr "Kênh Cb" msgid "Cr" -msgstr "Cr" +msgstr "Kênh Cr" msgid "Val" @@ -115559,7 +129262,7 @@ msgstr "Tốc Độ:" msgid "Not a geometry node tree" -msgstr "Không phải là cây giao điểm hình dạng" +msgstr "Không phải là một cây nút hình học" msgid "Line Break" @@ -115567,15 +129270,15 @@ msgstr "Ngắt Dòng" msgid "The string to find in the input string" -msgstr "Xâu cho tìm trong xâu ngõ vào" +msgstr "Chuỗi văn bản cung cấp ở đầu vào cần tìm" msgid "The string to replace each match with" -msgstr "Xâu cho thay thế cho đồng thứ được tìm" +msgstr "Chuỗi văn bản để thay thế những phần xứng khớp" msgid "Rotate By" -msgstr "Xoay Góc" +msgstr "Độ Xoay Chiều" msgid "Decimals" @@ -115583,87 +129286,147 @@ msgstr "Số Thập Phân" msgid "Geometry Node Editor" -msgstr "Trình Biên Soạn Giao Điểm Hình Dạng" +msgstr "Trình Biên Soạn Nút Hình Học" + + +msgid "Node must be run as tool" +msgstr "Nút phải được chạy dưới dạng công cụ" msgid "Leading" -msgstr "Dẫn Đường" +msgstr "Tiền Dẫn" msgid "Trailing" -msgstr "Theo Dõi" +msgstr "Hậu Dẫn" + + +msgid "The values to be accumulated" +msgstr "Các giá trị sẽ được tích lũy" + + +msgid "The running total of values in the corresponding group, starting at the first value" +msgstr "Tổng giá trị thu thập trong nhóm tương ứng, bắt đầu từ giá trị đầu tiên" + + +msgid "The running total of values in the corresponding group, starting at zero" +msgstr "Tổng giá trị thu thập trong nhóm tương ứng, bắt đầu từ 0" + + +msgid "The total of all of the values in the corresponding group" +msgstr "Tổng số của toàn bộ các giá trị trong nhóm tương ứng" + + +msgid "Group ID" +msgstr "ID của Nhóm" msgid "An index used to group values together for multiple separate accumulations" -msgstr "Một chỉ số sử dụng cho nhóm hóa giá trị cho nhiều tích trữ riêng tự" +msgstr "Một chỉ số sử dụng để nhóm các giá trị lại với nhau cho nhiều lần tích lũy riêng biệt" msgid "The attribute output can not be used without the geometry output" -msgstr "Ngõ ra đặc điểm không thể dùng thiếu ngõ ra hình dạng" +msgstr "Không thể sử dụng đầu ra thuộc tính nếu không có đầu ra hình học" + + +msgid "Edge Count" +msgstr "Số Cạnh" + + +msgid "Face Corner Count" +msgstr "Số Góc Mặt" + + +msgid "Spline Count" +msgstr "Số Lượng Chốt Trục" + + +msgid "Instance Count" +msgstr "Số Lượng Thực Thể" + + +msgid "How many times to blur the values for all elements" +msgstr "Số lần làm nhòe mờ các giá trị cho tất cả các phần tử" + + +msgid "Relative mix weight of neighboring elements" +msgstr "Trọng lượng hòa trộn tương đối của các phần tử lân cận" msgid "Disabled, Blender was compiled without GMP" -msgstr "Đã tắt, Blender được biên dịch thiếu GMP" +msgstr "Vô hiệu hóa (Tắt), bản Blender này vốn được biên dịch không có GMP trong đó" msgid "Mesh 1" -msgstr "Mạng Lưới 1" +msgstr "Khung Lưới 1" msgid "Mesh 2" -msgstr "Mạng Lưới 2" +msgstr "Khung Lưới 2" msgid "Intersecting Edges" -msgstr "Cạnh Đang Giao Cắt" +msgstr "Các Cạnh Giao Cắt" + + +msgid "Collection contains current object" +msgstr "Bộ sưu tập chứa đối tượng hiện tại" msgid "Separate Children" -msgstr "Chẻ Con Cái" +msgstr "Tách Phân Con Em" msgid "Reset Children" -msgstr "Đặt Lại Con Cái" +msgstr "Hoàn Lại Con Em" msgid "Output each child of the collection as a separate instance, sorted alphabetically" -msgstr "Ngõ ra của mỗi con cái của sưu tập là một thực thể riêng, sắp xếp theo thứ tự chữ cái" +msgstr "Xuất ra mỗi con em của bộ sưu tập dưới dạng một thực thể riêng biệt, sắp xếp theo thứ tự bảng chữ cái" msgid "Reset the transforms of every child instance in the output. Only used when Separate Children is enabled" -msgstr "Đặt lại biến hóa từng thực thể con cái trong trong ngõ ra. Chỉ dùng khi bật Con Cái Riêng" +msgstr "Hoàn lại sự biến hóa của mọi thực thể con em trong đầu ra. Chỉ được sử dụng khi Tách Phân Con Em được kích hoạt (bật lên) mà thôi" msgid "Disabled, Blender was compiled without Bullet" -msgstr "Đã tắt, Blender được biên dịch thiếu Bullet" +msgstr "Vô hiệu hóa (Tắt), bản Blender này vốn được biên dịch không có Đạn Bắn (Bullet)" msgid "Start Size" -msgstr "Kích Cỡ Bắt Đầu" +msgstr "Kích Thước Khởi Đầu" msgid "End Size" -msgstr "Kích Cỡ Cuối" +msgstr "Kích Thước Kết Thúc" msgid "The amount of points to select from the start of each spline" -msgstr "Số lượng điểm để chọn từ đầu của mỗi mẫu cong" +msgstr "Số lượng điểm cần lựa chọn từ đầu mỗi chốt trục" msgid "The amount of points to select from the end of each spline" -msgstr "Số lượng điểm để chọn từ cuối của mỗi mẫu cong" +msgstr "Số lượng điểm cần chọn từ đuôi mỗi chốt trục" msgid "The selection from the start and end of the splines based on the input sizes" -msgstr "Sự lựa chọn từ đầu và cuối của các mẫu cong tùy kích cỡ của ngõ vào" +msgstr "Khoảng lựa chọn từ đầu và cuối chốt trục dựa trên kích thước đầu vào" + + +msgid "Endpoint Selection node" +msgstr "Nút Lựa Chọn Điểm Cuối" msgid "Limit Radius" -msgstr "Bán Kính Giới Hạn" +msgstr "Giới Hạn Bán Kính" msgid "Limit the maximum value of the radius in order to avoid overlapping fillets" -msgstr "Hạn chế giá trị cực đại của bán kính để tránh mép lấn trên nhau" +msgstr "Giới hạn giá trị tối đa của bán kính để tránh các miếng phi lê chồng gối lên nhau" + + +msgid "Handle Type Selection node" +msgstr "Nút Lựa Chọn Thể Loại Tay Cầm" msgid "Start Angle" @@ -115675,83 +129438,83 @@ msgstr "Góc Quét" msgid "Connect Center" -msgstr "Kết Nối Trung Tâm" +msgstr "Nối Tâm" msgid "Invert Arc" -msgstr "Đảo Nghịch Hình Cung" +msgstr "Vòng Cung Đảo Ngược" msgid "The number of points on the arc" -msgstr "Số lượng điểm trên hình cung" +msgstr "Số điểm trên vòng cung" msgid "Position of the first control point" -msgstr "Vị trí của điểm kiểm soát thứ nhất" +msgstr "Vị trí của điểm điều khiển đầu tiên" msgid "Position of the middle control point" -msgstr "Vị trí của điểm kiểm soát trung điểm" +msgstr "Vị trí của điểm điều khiển giữa" msgid "Position of the last control point" -msgstr "Vị trí của điểm kiểm soát cuối cùng" +msgstr "Vị trí của điểm điều khiển cuối cùng" msgid "Distance of the points from the origin" -msgstr "Khoảng cách của các điểm từ gốc tọa độ" +msgstr "Khoảng cách của các điểm từ điểm tọa độ gốc" msgid "Starting angle of the arc" -msgstr "Góc bắt đầu của hình cung" +msgstr "Góc bắt đầu của vòng cung" msgid "Length of the arc" -msgstr "Độ dài của hình cung" +msgstr "Chiều dài của vòng cung" msgid "Offset angle of the arc" -msgstr "Góc nới của hình cung" +msgstr "Góc độ dịch chuyển của vòng cung" msgid "Connect the arc at the center" -msgstr "Kết nối hình cung tại trung tâm" +msgstr "Nối với tâm của vòng cung" msgid "Invert and draw opposite arc" -msgstr "Đảo nghịch và vẽ hình cung đối diện" +msgstr "Đảo ngược và vẽ vòng cung ngược lại" msgid "The center of the circle described by the three points" -msgstr "Trung tâm của vòng tròn được xác định bằng ba điểm" +msgstr "Tâm của vòng tròn được miêu tả bởi ba điểm" msgid "The normal direction of the plane described by the three points, pointing towards the positive Z axis" -msgstr "Hướng của pháp tuyến của mặt phẳng được xác định bằng ba điểm, chỉ đến trục Z dương" +msgstr "Chiều hướng pháp tuyến của bình diện được miêu tả bởi ba điểm, hướng về phía trục Z dương" msgid "The radius of the circle described by the three points" -msgstr "Bán kính của vòng tròn được xác định bằng ba điểm" +msgstr "Bán kính của hình tròn được miêu tả bởi ba điểm" msgid "The number of evaluated points on the curve" -msgstr "Số lượng điểm được tính toán trong đường cong" +msgstr "Số điểm được tính toán trên đường cong" msgid "Position of the start control point of the curve" -msgstr "Vị trí của điểm kiểm soát bắt đầu của đường cong" +msgstr "Vị trí của điểm điều khiển khởi đầu của đường cong" msgid "Position of the start handle used to define the shape of the curve. In Offset mode, relative to Start point" -msgstr "Vị trí của tay cầm bắt đầu sử dụng cho xác định hình dạng của đường cong. Trong chế độ Nới, tương đối từ điểm Bắt Đầu" +msgstr "Vị trí của tay cầm khởi đầu được sử dụng để xác định hình dạng của đường cong. Ở chế độ Dịch Chuyển thì tương đối với Điểm khởi đầu" msgid "Position of the end handle used to define the shape of the curve. In Offset mode, relative to End point" -msgstr "Vị trí của tay cầm kết thúc sử dụng cho xác định hình dạng của đường cong. Trong chế độ Nới, tương đối từ điểm Kết Thúc" +msgstr "Vị trí của tay cầm cuối được sử dụng để xác định hình dạng của đường cong. Ở chế độ Dịch Chuyển thì tương đối với Điểm kết thúc" msgid "Position of the end control point of the curve" -msgstr "Vị trí của điểm kiểm soát cuối cùng của đường cong" +msgstr "Vị trí của điểm điều khiển cuối của đường cong" msgid "Point 1" @@ -115767,19 +129530,19 @@ msgstr "Điểm 3" msgid "Number of points on the circle" -msgstr "Số lượng điểm trên vòng tròn" +msgstr "Số điểm trên vòng tròn" msgid "One of the three points on the circle. The point order determines the circle's direction" -msgstr "Một của ba điểm trên vòng tròng. Thứ tự điểm sẽ xác định hướng của vòng tròn" +msgstr "Một trong ba điểm trên đường tròn. Thứ tự của điểm sẽ xác định chiều hướng của đường tròn" msgid "Position of the second control point" -msgstr "Vị trí của điểm kiểm soát thứ hai" +msgstr "Vị trí của điểm điều khiển thứ hai" msgid "Direction the line is going in. The length of this vector does not matter" -msgstr "Hướng chỉ của đường. Độ dài của vectơ này không quan trọng" +msgstr "Chiều hướng mà đường này đang đi vào. Độ dài của vectơ này không quan trọng" msgid "Distance between the two points" @@ -115787,23 +129550,23 @@ msgstr "Khoảng cách giữa hai điểm" msgid "The number of edges on the curve" -msgstr "Số lượng cạnh trong đường cong" +msgstr "Số cạnh trên đường cong" msgid "Bottom Width" -msgstr "Chiều Rộng Phía Dưới" +msgstr "Chiều Rộng Đáy" msgid "Top Width" -msgstr "Chiều Rộng Phía Trên" +msgstr "Chiều Rộng Đỉnh" msgid "Bottom Height" -msgstr "Chiều Cao Cạnh Dưới" +msgstr "Chiều Cao Đáy" msgid "Top Height" -msgstr "Chiều Cao Cạnh Trên" +msgstr "Chiều Cao Đỉnh" msgid "Point 4" @@ -115811,15 +129574,15 @@ msgstr "Điểm 4" msgid "The X axis size of the shape" -msgstr "Cỡ thước của trục Y của hình dạng" +msgstr "Kích thước trục X của hình dạng" msgid "The Y axis size of the shape" -msgstr "Cỡ thước của trục Y của hình dạng" +msgstr "Kích thước trục Y của hình dạng" msgid "For Parallelogram, the relative X difference between the top and bottom edges. For Trapezoid, the amount to move the top edge in the positive X axis" -msgstr "Cho Hình Bình Hành, chênh lệch X tương đối giữa cạnh trên và dưới. Cho Hình Thang, cách di chuyển cạnh trên hướng dương trục X." +msgstr "Đối với Hình Bình Hành thì là hiệu số X tương đối giữa các cạnh trên và dưới. Đối với Hình Thang thì lượng di chuyển cạnh trên theo trục X dương" msgid "The distance between the bottom point and the X axis" @@ -115831,295 +129594,521 @@ msgstr "Khoảng cách giữa điểm trên cùng và trục X" msgid "The exact location of the point to use" -msgstr "Vị trí chính xác của điểm để dùng" +msgstr "Vị trí chính xác của điểm sẽ sử dụng" msgid "Start Radius" -msgstr "Bán Kính Bắt Đầu" +msgstr "Bán Kính Khởi Đầu" msgid "End Radius" -msgstr "Bạn Kính Kết Thúc" +msgstr "Bán Kính Kết Thúc" + + +msgctxt "NodeTree" +msgid "Rotations" +msgstr "Số Vòng Xoay" msgid "Number of points in one rotation of the spiral" -msgstr "Số lượng điểm trong một xoay của hình ốc" +msgstr "Số điểm trong một lần quay của xoắn ốc" msgid "Number of times the spiral makes a full rotation" -msgstr "Số lần hình ốc được xoay" +msgstr "Số lần xoắn ốc thực hiện một vòng quay hoàn chỉnh" msgid "Horizontal Distance from the Z axis at the start of the spiral" -msgstr "Khoảng Cách ngang từ trục Z tại bắt đầu của hình ốc" +msgstr "Khoảng Cách Ngang từ trục Z tại điểm khởi đầu của xoắn ốc" msgid "Horizontal Distance from the Z axis at the end of the spiral" -msgstr "Khoảng Cách ngang từ trục Z tại kết thúc của hình ốc" +msgstr "Khoảng Cách Ngang từ trục Z ở cuối đường xoắn ốc" msgid "The height perpendicular to the base of the spiral" -msgstr "Chiều cao vuông góc vớu đấy của hình ốc" +msgstr "Chiều cao vuông góc với đáy của hình xoắn ốc" msgid "Switch the direction from clockwise to counterclockwise" -msgstr "Lật hướng từ hướng kim đồng hồ thành nghịch hướng kim đồng hồ" +msgstr "Chuyển hướng từ thuận chiều kim đồng hồ sang ngược chiều kim đồng hồ" msgid "Inner Radius" -msgstr "Bán Kính Nội" +msgstr "Bán Kính Trong" msgid "Outer Radius" -msgstr "Bán Kính Ngoại" +msgstr "Bán Kính Ngoài" msgid "Outer Points" -msgstr "Điểm Ngoại" +msgstr "Điểm Bên Ngoài" msgid "Number of points on each of the circles" -msgstr "Số lượng điểm từng vòng tròn" +msgstr "Số điểm trên mỗi vòng tròn" msgid "Radius of the inner circle; can be larger than outer radius" -msgstr "Bán kính của vòng tròn nội; có thể lớn hơn bán kính ngoại" +msgstr "Bán kính của đường tròn bên trong; có thể lớn hơn bán kính bên ngoài" msgid "Radius of the outer circle; can be smaller than inner radius" -msgstr "Bán kính của vòng tròn ngoại; có thể nhỏ hơn bán kính nội" +msgstr "Bán kính của đường tròn bên ngoài; có thể nhỏ hơn bán kính bên trong" msgid "The counterclockwise rotation of the inner set of points" -msgstr "Xoay nghịch hướng kim đồng hồ của các điểm nội" +msgstr "Xoay chiều ngược chiều kim đồng hồ của tập hợp các điểm bên trong" msgid "An attribute field with a selection of the outer points" -msgstr "Trường đặc điểm có một sự lựa chọn của điểm ngoại" +msgstr "Một trường thuộc tính với lựa chọn các điểm bên ngoài" + + +msgid "Curve Index" +msgstr "Chỉ Số Đường Cong" msgid "Input curves do not have Bezier type" -msgstr "Đường cong ngõ vào không phải kiểu Bezier" +msgstr "Các đường cong đầu vào không có kiểu Bezier" msgid "For points, the portion of the spline's total length at the control point. For Splines, the factor of that spline within the entire curve" -msgstr "Cho điểm, phần của toàn chiều dài của mẫu cong tại điểm kiểm soát. Cho mẫu cong, hệ số của mẫu cong đó trong toàn bộ đường cong " +msgstr "Đối với các điểm thì là phần của tổng chiều dài của chốt trục tại điểm điều khiển. Đối với Chốt Trục thì là hệ số của chốt trục đó nội trong toàn bộ đường cong" msgid "For points, the distance along the control point's spline, For splines, the distance along the entire curve" -msgstr "Cho điểm, là khoảng cách theo mẫu cong của điểm kiểm soát. Cho mẫu cong, khoảng cách của toàn bộ mẫu cong" +msgstr "Đối với các điểm thì là khoảng cách dọc theo chốt trục của điểm điều khiển. Đối với chốt trục thì là khoảng cách dọc theo toàn bộ đường cong" msgid "Each control point's index on its spline" -msgstr "Chỉ số từng đỉnh trên mẫu cong của nó" +msgstr "Chỉ số của mỗi điểm điều khiển trên chốt trục của nó" + + +msgid "Spline Parameter node" +msgstr "Nút Tham Số Chốt Trục" + + +msgid "Curve Length node" +msgstr "Nút Chiều Dài Đường Cong" + + +msgid "Spline Index" +msgstr "Chỉ Số Chốt Trục" msgid "Cuts" -msgstr "Cắt" +msgstr "Số Đoạn Cắt" msgid "The number of control points to create on the segment following each point" -msgstr "Số lượng điểm kiểm soát để chế tạo khúc sau mỗi điểm" +msgstr "Số lượng điểm điều khiển cần kiến tạo trên phân đoạn sau mỗi điểm" msgid "Profile Curve" -msgstr "Đường Cong Mặt Cắt" +msgstr "Mặt Cắt Đường Cong" msgid "If the profile spline is cyclic, fill the ends of the generated mesh with N-gons" -msgstr "Nếu mẫu cong mặt cắt có chu trình, tô đầy kết thúc của mạng lưới được chế tạo bằng N-giác" +msgstr "Nếu mặt cắt chốt trục là hình tròn thì phủ kín các đầu của khung lưới sinh tạo ra với các đa giác (N-gons)" + + +msgid "Index in Curve" +msgstr "Chỉ Số trong Đường Cong" + + +msgid "The control point to retrieve data from" +msgstr "Điểm điều khiển để trích xuất dữ liệu từ đó ra" + + +msgid "The curve the control point is part of" +msgstr "Đường cong mà điểm điều khiển là một phần của nó" + + +msgid "How far along the control point is along its curve" +msgstr "Khoảng cách điểm điều khiển nằm là bao xa trên đường cong của nó" + + +msgid "Point Curve Index" +msgstr "Chỉ Số Đường Cong Điểm" + + +msgid "Point Index in Curve" +msgstr "Chỉ Số Điểm trong Đường Cong" + + +msgid "Sort Index" +msgstr "Chỉ Số Sắp Xếp" + + +msgid "The curve to retrieve data from. Defaults to the curve from the context" +msgstr "Đường cong để trích xuất dữ liệu từ đó ra. Mặc định sử dụng đường cong từ bối cảnh" + + +msgid "Values used to sort the curve's points. Uses indices by default" +msgstr "Các giá trị sử dụng để sắp xếp các điểm của đường cong. Theo mặc định thì dùng các chỉ số" + + +msgid "Which of the sorted points to output" +msgstr "Điểm đã sắp xếp nào sẽ xuất ra" + + +msgid "A point of the curve, chosen by the sort index" +msgstr "Một điểm của đường cong, được chọn theo chỉ số sắp xếp" + + +msgid "The number of points in the curve" +msgstr "Số điểm trong đường cong" + + +msgid "Point of Curve" +msgstr "Điểm của Đường Cong" + + +msgid "Curve Point Count" +msgstr "Số Điểm của Đường Cong" msgid "Start (Factor)" -msgstr "Bắt Đầu (Hệ Số)" +msgstr "Khởi đầu (Hệ số)" msgid "End (Factor)" -msgstr "Kết Thúc (Hệ Số)" +msgstr "Kết thúc (Hệ số)" msgid "Start (Length)" -msgstr "Bắt Đầu (Chiều Dài)" +msgstr "Khởi đầu (Độ dài)" msgid "End (Length)" -msgstr "Kết Thúc (Chiều Dài)" +msgstr "Kết thúc (Độ dài)" msgid "Node only works for curves objects" -msgstr "Giao điểm chỉ hoạt động với vật thể đường cong" +msgstr "Nút chỉ hoạt động với các đối tượng đường cong mà thôi" msgid "Surface UV map not defined" -msgstr "Chưa định nghĩa bản đồ UV cho bề mặt" +msgstr "Ánh xạ UV của bề mặt chưa được xác định" msgid "Curves not attached to a surface" -msgstr "Đường cong không gắn trên một bề mặt" +msgstr "Đường cong không gắn mình với một bề mặt" msgid "Surface has no mesh" -msgstr "Bề mặt không có mạng lưới" +msgstr "Bề mặt không có khung lưới" + + +msgid "Evaluated surface missing UV map: \"{}\"" +msgstr "Bề mặt tính toán thiếu ánh xạ UV: \"{}\"" + + +msgid "Original surface missing UV map: \"{}\"" +msgstr "Bề mặt gốc thiếu ánh xạ UV: \"{}\"" msgid "Evaluated surface missing attribute: \"rest_position\"" -msgstr "Bề mặt được tính toán đang thiếu đặc điểm: \"vịTrí_nghỉNgơi\"" +msgstr "Bề mặt tính toán thiếu thuộc tính: rest_position (vị trí nghỉ)" msgid "Curves are not attached to any UV map" -msgstr "Đường cong không gắn với bản đồ UV nào" +msgstr "Đường cong không được gắn với bất kỳ ánh xạ UV nào cả" + + +msgid "Invalid surface UVs on {} curves" +msgstr "UV bề mặt không hợp lệ trên đường cong {}" msgid "The parts of the geometry to be deleted" -msgstr "Các bộ phận của hình dạng để xóa" +msgstr "Các phần của hình học sẽ bị xóa đi" msgid "Disabled, Blender was compiled without OpenVDB" -msgstr "Đã tắt, Blender được biên dịch thiếu OpenVDB" +msgstr "Vô hiệu hóa (tắt), bản Blender này vốn được biên dịch không có OpenVDB" + + +msgid "Number of points to sample per unit volume" +msgstr "Số điểm để lấy mẫu mỗi thể tích đơn vị" + + +msgid "Seed used by the random number generator to generate random points" +msgstr "Mầm sử dụng bởi trình tạo ngẫu số để sinh tạo các điểm ngẫu nhiên" + + +msgid "Spacing between grid points" +msgstr "Phân khoảng giữa các điểm khung lưới đồ thị" + + +msgid "Minimum density of a volume cell to contain a grid point" +msgstr "Mật độ tối thiểu của một tế bào thể tích để chứa đựng một điểm khung lưới đồ thị" msgid "Density Max" -msgstr "Tỉ Trọng Cực Đại" +msgstr "Mật Độ Tối Đa" + + +msgid "Keep non-manifold boundaries of the input mesh in place by avoiding the dual transformation there" +msgstr "Giữ nguyên các ranh giới phi đa tạp của khung lưới đầu vào bằng cách tránh né biến hóa kép ở đó" msgid "Duplicate Index" -msgstr "Sao Chép Chỉ Số" +msgstr "Chỉ Số Bản Nhân Đôi" msgid "The number of duplicates to create for each element" -msgstr "Số lượng sao chép để chế tạo cho mỗi phần tử" +msgstr "Số lượng bản sao cần kiến tạo cho mỗi phần tử" msgid "The duplicated geometry, not including the original geometry" -msgstr "Hình dạng sao chép, không gồm hình dạng ban đầu" +msgstr "Hình học sao chép, không bao gồm hình học ban đầu" msgid "The indices of the duplicates for each element" -msgstr "Chỉ số của những sao chép cho mỗi phần tử" +msgstr "Chỉ số của các bản sao cho mỗi phần tử" msgid "Start Vertices" -msgstr "Đỉnh Bắt Đầu" +msgstr "Điểm Đỉnh Đầu" msgid "Next Vertex Index" -msgstr "Chỉ Số Đỉnh Tiếp" +msgstr "Chỉ Số Điểm Đỉnh Tiếp Theo" + + +msgid "Boundary Edges" +msgstr "Cạnh Ranh Giới" + + +msgid "Face Group ID" +msgstr "ID Nhóm của Mặt" + + +msgid "Edges used to split faces into separate groups" +msgstr "Các cạnh sử dụng để tách phân các mặt thành các nhóm riêng biệt" + + +msgid "Index of the face group inside each boundary edge region" +msgstr "Chỉ số của nhóm Mặt nội bên trong mỗi vùng cạnh biên giới" msgid "Offset Scale" -msgstr "Phóng To Nới" +msgstr "Dịch Chuyển Tỷ Lệ" + + +msgid "Has Alpha" +msgstr "Có Alpha Hay Không" + + +msgid "Frame Count" +msgstr "Số Khung Hình" + + +msgid "Which frame to use for videos. Note that different frames in videos can have different resolutions" +msgstr "Khung hình nào sẽ được sử dụng cho video đây. Lưu ý rằng các khung hình khác nhau trong video có thể có độ phân giải khác nhau nữa" + + +msgid "Whether the image has an alpha channel" +msgstr "Hình ảnh có kênh alpha hay không" + + +msgid "The number of animation frames. If a single image, then 1" +msgstr "Số khung hình hoạt họa. Nếu là một hình ảnh duy nhất, thì chỉ là 1" + + +msgid "Animation playback speed in frames per second. If a single image, then 0" +msgstr "Tốc độ chơi lại hoạt họa, tính bằng số khung hình/giây. Nếu chỉ một hình ảnh duy nhất, thì là 0" + + +msgid "Texture coordinates from 0 to 1" +msgstr "Tọa độ chất liệu từ 0 đến 1" + + +msgid "Has Neighbor" +msgstr "Có Hàng Xóm" + + +msgid "Index of nearest element" +msgstr "Chỉ số của phần tử gần nhất" msgid "Output the handle positions relative to the corresponding control point instead of in the local space of the geometry" -msgstr "Xuất vị trí của các tay cầm tương đối với điểm kiểm soát tương tự thay thế trong không gian địa phương của hình dạng" +msgstr "Cung cấp vị trí của tay cầm liên quan đến điểm điều khiển tương ứng thay vì trong không gian cục bộ của hình học" msgid "The values from the \"id\" attribute on points, or the index if that attribute does not exist" -msgstr "Các giá trị từ đặc điểm \"id\" của các điễm, hoặc chỉ số nếu đặc điểm đó không tồn tại" +msgstr "Các giá trị từ thuộc tính \"id\" trên điểm, hoặc chỉ số nếu thuộc tính đó không tồn tại" msgid "Unsigned Angle" -msgstr "Góc Không Dấu" +msgstr "Góc Số Dương" msgid "Signed Angle" -msgstr "Góc Có Dấu" +msgstr "Góc Độ Có Dấu (Số Âm/Dương)" + + +msgid "The shortest angle in radians between two faces where they meet at an edge. Flat edges and Non-manifold edges have an angle of zero. Computing this value is faster than the signed angle" +msgstr "Góc ngắn nhất tính bằng radian giữa hai mặt nơi chúng gặp nhau ở một cạnh. Các cạnh phẳng và các cạnh phi đa tạp có góc bằng 0. Tính toán giá trị này nhanh hơn góc âm/dương" + + +msgid "The signed angle in radians between two faces where they meet at an edge. Flat edges and Non-manifold edges have an angle of zero. Concave angles are positive and convex angles are negative. Computing this value is slower than the unsigned angle" +msgstr "Góc số âm/dương tính bằng radian giữa hai mặt nơi chúng gặp nhau ở một cạnh. Các cạnh phẳng và các cạnh phi đa tạp có góc bằng 0. Góc lõm là dương và góc lồi là âm. Tính toán giá trị này chậm hơn góc số dương" + + +msgid "Unsigned Angle Field" +msgstr "Góc Số Dương" + + +msgid "Signed Angle Field" +msgstr "Trường Góc số Âm/Dương" msgid "The number of faces that use each edge as one of their sides" -msgstr "Số lượng mặt sử dụng mỗi cạnh để làm một cạnh của chúng nó" +msgstr "Số các mặt sử dụng mỗi cạnh làm một trong các cạnh của chúng" + + +msgid "Edge Neighbor Count Field" +msgstr "Trường Số Hàng Xóm của Cạnh" msgid "Vertex Index 1" -msgstr "Chỉ số đỉnh 1" +msgstr "Chỉ Số Điểm Đỉnh 1" msgid "Vertex Index 2" -msgstr "Chỉ số đỉnh 2" +msgstr "Chỉ Số Điểm Đỉnh 2" msgid "Position 1" -msgstr "Vị Trí 1" +msgstr "Vị trí 1" msgid "Position 2" -msgstr "Vị Trí 2" +msgstr "Vị trí 2" msgid "The index of the first vertex in the edge" -msgstr "Chỉ số của đỉnh thứ nhất trong cạnh" +msgstr "Chỉ số của điểm đỉnh đầu tiên trong cạnh" msgid "The index of the second vertex in the edge" -msgstr "Chỉ số của đỉnh thứ hai trong cạnh" +msgstr "Chỉ số của điểm đỉnh thứ hai trong cạnh" msgid "The position of the first vertex in the edge" -msgstr "Vị trí của đỉnh thứ nhất trong cạnh" +msgstr "Vị trí của đỉnh đầu tiên trong cạnh" msgid "The position of the second vertex in the edge" -msgstr "Vị trí của đỉnh thứ hai trong cạnh" +msgstr "Vị trí của điểm đỉnh thứ hai trong cạnh" + + +msgid "Edge Vertices Field" +msgstr "Trường Số Điểm Đỉnh của Cạnh" + + +msgid "Edge Position Field" +msgstr "Trường Vị Trí Cạnh" + + +msgctxt "Amount" +msgid "Area" +msgstr "Diện Tích" msgid "The surface area of each of the mesh's faces" -msgstr "Diện tích bề mặt từng mặt của mạng lưới" +msgstr "Diện tích các mặt của mỗi các mặt khung lưới" + + +msgid "Face Area Field" +msgstr "Trường Diện Tích Mặt" msgid "The distance a point can be from the surface before the face is no longer considered planar" -msgstr "Khoảng cách xa của một điểm từ bề mặt để chấp nhận mặt không phải là mặt phẳng" +msgstr "Khoảng cách mà một điểm có thể nằm tại, từ Mặt, trước khi Mặt không còn được cân nhắc là phẳng nữa" msgid "Vertex Count" -msgstr "Số Lượng Đỉnh" +msgstr "Số Điểm Đỉnh" msgid "Number of edges or points in the face" -msgstr "Số lượng cạnh hay điểm trong bề mặt" +msgstr "Số cạnh hoặc số điểm trong Mặt" msgid "Number of faces which share an edge with the face" -msgstr "Số lượng mặt chia sẻ một cảnh trong mặt" +msgstr "Số Mặt có chung một cạnh với Mặt" + + +msgid "Face Neighbor Count Field" +msgstr "Trường Số Mặt Lân Cận" + + +msgid "Vertex Count Field" +msgstr "Trường Số Điểm Đỉnh" msgid "Island Index" -msgstr "Chỉ Số Hòn Đảo" +msgstr "Chỉ Số Hải Đảo" msgid "Island Count" -msgstr "Số Lượng Hòn Đảo" +msgstr "Số Hải Đảo" msgid "The index of the each vertex's island. Indices are based on the lowest vertex index contained in each island" -msgstr "Chỉ số hòn đảo của mỗi đỉnh. Chỉ số tùy chỉ số thấp nhất được chứa trong mỗi hòn đảo" +msgstr "Chỉ số mỗi hải đảo của điểm đỉnh. Các chỉ số dựa trên chỉ số đỉnh thấp nhất nằm trong mỗi hải đảo" msgid "The total number of mesh islands" -msgstr "Tổng số hòn đảo mạng lưới" +msgstr "Tổng số hải đảo khung lưới" msgid "The number of vertices connected to this vertex with an edge, equal to the number of connected edges" -msgstr "Số lượng đỉnh được kết nối với một cảnh, bằng số lượng cạnh được kết nối" +msgstr "Số điểm đỉnh kết nối điểm đỉnh này với một cạnh, tương đương với số cạnh liên thông" msgid "Number of faces that contain the vertex" -msgstr "Số lượng mặt chứa đỉnh" +msgstr "Số các mặt cùng sử dụng một điểm đỉnh" + + +msgid "Vertex Face Count Field" +msgstr "Trường Số Mặt của Điểm Đỉnh" msgid "End Vertex" -msgstr "Đỉnh Kết Thúc" +msgstr "Điểm Đỉnh Cuối" msgid "Edge Cost" -msgstr "Giá Cạnh" +msgstr "Chi Phí Cạnh" msgid "Total Cost" -msgstr "Tổng Giá" +msgstr "Tổng Chi Phí" + + +msgid "Shortest Edge Paths Next Vertex Field" +msgstr "Trường Điểm Đỉnh Tiếp Theo của Đường Dẫn Cạnh Ngắn Nhất" + + +msgid "Shortest Edge Paths Cost Field" +msgstr "Trường Chi Phí của Đường Dẫn Cạnh Ngắn Nhất" + + +msgid "Spline Point Count" +msgstr "Số Điểm Chốt Trục" + + +msgid "Tangent node" +msgstr "Nút tiếp tuyến" msgid "Realized geometry is not used when pick instances is true" -msgstr "Hình dạng đã hình thành không được dùng khi chọn thực thể là đúng" +msgstr "Hình học hiện thực hóa sẽ không được sử dụng khi tùy chọn Chọn Thực Thể được bật lên (Đúng)" msgid "Pick Instance" @@ -116131,131 +130120,211 @@ msgstr "Chỉ Số Thực Thể" msgid "Points to instance on" -msgstr "Điểm cho thực thể trên nó" +msgstr "Các điểm để thực thể hóa trên đó" msgid "Geometry that is instanced on the points" -msgstr "Hình dạng được hình thành trên các điểm" +msgstr "Hình học được thực thể hóa trên các điểm" msgid "Choose instances from the \"Instance\" input at each point instead of instancing the entire geometry" -msgstr "Chọn thực thể từ ngõ vào \"Thực Thể\" tại mỗi điểm thay thế thực thể hóa toàn bộ hình dạng" +msgstr "Chọn các thực thể từ đầu vào \"Thực thể\" tại mỗi điểm đầu vào thay vì thực thể hóa toàn bộ hình học" + + +msgid "Index of the instance used for each point. This is only used when Pick Instances is on. By default the point index is used" +msgstr "Chỉ số của thực thể sử dụng cho mỗi một điểm. Cái này chỉ được sử dụng khi Chọn Thực Thể được bật lên mà thôi. Theo mặc định thì chỉ số của điểm sẽ được sử dụng" msgid "Rotation of the instances" -msgstr "Xoay của các thực thể" +msgstr "Xoay chiều của các thực thể" msgid "Scale of the instances" -msgstr "Phóng to của các thực thể" +msgstr "Tỷ lệ của các thực thể" + + +msgid "Guide Curves" +msgstr "Đường Cong Hướng Dẫn" + + +msgid "Guide Up" +msgstr "Phương Trên của Hướng Dẫn" + + +msgid "Guide Group ID" +msgstr "ID Nhóm của Hướng Dẫn" + + +msgid "Point Up" +msgstr "Điểm Hướng Lên Trên" + + +msgid "Point Group ID" +msgstr "ID Nhóm của Điểm" + + +msgid "Max Neighbors" +msgstr "Số Hàng Xóm Tối Đa" + + +msgid "Closest Index" +msgstr "Chỉ Số Gần Nhất" + + +msgid "Closest Weight" +msgstr "Trọng Lượng Gần Nhất" + + +msgid "Base curves that new curves are interpolated between" +msgstr "Các đường cong cơ sở mà các đường cong mới sẽ được nội suy giữa chúng" + + +msgid "Optional up vector that is typically a surface normal" +msgstr "Vectơ hướng lên trên bổ sung, thường là pháp tuyến của bề mặt" + + +msgid "Splits guides into separate groups. New curves interpolate existing curves from a single group" +msgstr "Tách các hướng dẫn thành các nhóm riêng biệt. Các đường cong mới nội suy các đường cong hiện có từ một đơn nhóm" + + +msgid "First control point positions for new interpolated curves" +msgstr "Vị trí điểm điều khiển đầu tiên cho các đường cong nội suy mới" + + +msgid "The curve group to interpolate in" +msgstr "Nhóm đường cong để nội suy trong đó" + + +msgid "Maximum amount of close guide curves that are taken into account for interpolation" +msgstr "Số đường cong hướng dẫn nằm gần tối đa được tính đến cho nội suy" + + +msgid "Index of the closest guide curve for each generated curve" +msgstr "Chỉ số của đường cong hướng dẫn nằm gần nhất cho mỗi đường cong được sinh tạo ra" + + +msgid "Weight of the closest guide curve for each generated curve" +msgstr "Trọng lượng của đường cong hướng dẫn gần nhất cho mỗi đường cong được sinh tạo ra" msgid "Old" msgstr "Cũ" +msgid "Material Selection node" +msgstr "Nút Lựa Chọn Vật Liệu" + + +msgid "An identifier for the group of each face. All contiguous faces with the same value are in the same region" +msgstr "Một chỉ danh cho nhóm của mỗi Mặt. Tất cả các Mặt tiếp nối, có cùng giá trị, đều nằm trong cùng một vùng" + + +msgid "The edges that lie on the boundaries between the different face groups" +msgstr "Các cạnh nằm trên vùng ranh giới giữa các nhóm Mặt khác nhau" + + msgid "Vertices must be at least 3" -msgstr "Phải có 3 đỉnh trở lên" +msgstr "Số điểm đỉnh nhất định phải ít nhất là 3" msgid "Number of vertices on the circle" -msgstr "Số lượng đỉnh cho chu vi vòng tròn" +msgstr "Số điểm đỉnh trên hình tròn" msgid "Distance of the vertices from the origin" -msgstr "Khoảng cách của đỉnh từ gốc tọa độ" +msgstr "Khoảng cách của các điểm đỉnh từ tọa độ gốc" msgid "Side Segments must be at least 1" -msgstr "Khúc bên hồng phải có 1 khúc trở lên" +msgstr "Số Phân Đoạn của Cạnh nhất định phải ít nhất là 1" msgid "Fill Segments must be at least 1" -msgstr "Đầy Khúc phải có 1 khúc trở lên" +msgstr "Số phân vòng bịt đầu nhất định phải ít nhất là 1" msgid "Side Segments" -msgstr "Khúc Bên Hong" +msgstr "Số Phân Đoạn của Cạnh" msgid "Fill Segments" -msgstr "Khúc Đầy" +msgstr "Số Phân Vòng Bịt Đầu" msgid "Radius Top" -msgstr "Bán kính Trên" +msgstr "Bán Kính Đỉnh" msgid "Radius Bottom" -msgstr "Bán kính Dưới" +msgstr "Bán Kính Đáy" msgid "Number of points on the circle at the top and bottom" -msgstr "Số lượng điểm trên vòng tròn trên và dưới" +msgstr "Số điểm trên vòng tròn ở trên cùng và dưới cùng" msgid "The number of edges running vertically along the side of the cone" -msgstr "Số lượng cạnh hướng dọc quanh cạnh của hình nón" +msgstr "Số cạnh chạy dọc theo mặt bên của hình nón" msgid "Number of concentric rings used to fill the round face" -msgstr "Số lượng vàng đồng tâm sử dụng cho đầy lại mặt tròn" +msgstr "Số vòng đồng tâm được sử dụng để phủ kín Mặt tròn" msgid "Radius of the top circle of the cone" -msgstr "Bán kính cho vòng tròn trên của hình nón" +msgstr "Bán kính của đường tròn đỉnh của hình nón" msgid "Radius of the bottom circle of the cone" -msgstr "Bán kính cho vòng tròn dưới của hình nón" +msgstr "Bán kính của đường tròn đáy của hình nón" msgid "Height of the generated cone" -msgstr "Chiều cao của hình nón được chế tạo" +msgstr "Chiều cao của hình nón sinh tạo" msgid "Vertices must be at least 1" -msgstr "Phải có 1 đỉnh trở lên" +msgstr "Phải có ít nhất 1 điểm đỉnh" msgid "Vertices X" -msgstr "Các Đỉnh X" +msgstr "Điểm Đỉnh X" msgid "Vertices Y" -msgstr "Các Đỉnh Y" +msgstr "Điểm Đỉnh Y" msgid "Vertices Z" -msgstr "Các Đỉnh Z" +msgstr "Điểm Đỉnh Z" msgid "Side length along each axis" -msgstr "Chiều dài của cạnh cho hướng mỗi trục" +msgstr "Chiều dài cạnh dọc theo mỗi trục" msgid "Number of vertices for the X side of the shape" -msgstr "Số lượng đỉnh cho cạnh X của hình dạng" +msgstr "Số điểm đỉnh cho cạnh X của hình dạng" msgid "Number of vertices for the Y side of the shape" -msgstr "Số lượng đỉnh cho cạnh Y của hình dạng" +msgstr "Số điểm đỉnh cho cạnh Y của hình dạng" msgid "Number of vertices for the Z side of the shape" -msgstr "Số lượng đỉnh cho cạnh Z của hình dạng" +msgstr "Số điểm đỉnh cho cạnh Z của hình dạng" msgid "The number of vertices on the top and bottom circles" -msgstr "Số lượng đỉnh cho vòng tròn trên và dưới" +msgstr "Số điểm đỉnh trên đường tròn trên cùng và dưới cùng" msgid "The number of rectangular segments along each side" -msgstr "Số lượng khúc hình chữ nhật từng cạnh" +msgstr "Số phân đoạn hình chữ nhật dọc theo mỗi cạnh" msgid "The number of concentric rings used to fill the round faces" -msgstr "Số lượng vành đồng tâm sử dụng cho đầy lại các mặt tròn" +msgstr "Số lượng các vòng đồng tâm được sử dụng để phủ kín các mặt tròn" msgid "The radius of the cylinder" @@ -116267,31 +130336,31 @@ msgstr "Chiều cao của hình trụ" msgid "Side length of the plane in the X direction" -msgstr "Chiều dài cạnh của mặt phẳng hướng X" +msgstr "Chiều dài cạnh của bình diện theo hướng X" msgid "Side length of the plane in the Y direction" -msgstr "Chiều dài cạnh của mặt phẳng hướng Y" +msgstr "Chiều dài cạnh của bình diện theo hướng Y" msgid "Number of vertices in the X direction" -msgstr "Số lượng đỉnh hướng X" +msgstr "Số lượng điểm đỉnh trong hướng X" msgid "Number of vertices in the Y direction" -msgstr "Số lượng đỉnh hướng Y" +msgstr "Số lượng điểm đỉnh trong hướng Y" msgid "Distance from the generated points to the origin" -msgstr "Khoảng cách từ các điểm được chế tạo đến gốc tọa độ" +msgstr "Khoảng cách từ các điểm sinh tạo đến tọa độ gốc" msgid "Number of subdivisions on top of the basic icosahedron" -msgstr "Số lần phân hóa hơn nhị thập diện cơ bản" +msgstr "Lượng phân chia trên đỉnh của khối nhì thập diện cơ bản" msgid "Start Location" -msgstr "Vị Trí Bắt Đầu" +msgstr "Vị Trí Khởi Đầu" msgid "End Location" @@ -116299,27 +130368,27 @@ msgstr "Vị Trí Kết Thúc" msgid "Number of vertices on the line" -msgstr "Số lượng đỉnh trên đường" +msgstr "Số điểm đỉnh trên đường" msgid "Length of each individual edge" -msgstr "Chiều dài của mỗi cạnh" +msgstr "Chiều dài của mỗi cá nhân cạnh" msgid "Position of the first vertex" -msgstr "Vị trí của đỉnh đầu" +msgstr "Vị trí của điểm đỉnh đầu tiên" msgid "In offset mode, the distance between each socket on each axis. In end points mode, the position of the final vertex" -msgstr "Trong chế độ nới, khoảng cách giữa mỗi ổ cằm từng trục. Trong chế độ điểm kết thúc, vị trí của đỉnh cuối" +msgstr "Trong chế độ dịch chuyển thì là khoảng cách giữa mỗi ổ cắm trên mỗi trục. Trong chế độ điểm cuối thì là vị trí của đỉnh cuối cùng" msgid "Segments must be at least 3" -msgstr "Khúc phải là 3 trở lên" +msgstr "Số phân đoạn phải có ít nhất là 3" msgid "Rings must be at least 3" -msgstr "Vành phải là 3 trở lên" +msgstr "Số vành nhẫn phải có ít nhất là 3" msgid "Horizontal resolution of the sphere" @@ -116327,115 +130396,387 @@ msgstr "Độ phân giải ngang của hình cầu" msgid "The number of horizontal rings" -msgstr "Số lượng vành ngang" +msgstr "Số vòng chiều ngang" msgid "Disabled, Blender was compiled without OpenSubdiv" -msgstr "Đã tắt, Blender được biên dịch thiếu OpenSubdiv" +msgstr "Vô hiệu hóa (tắt), bản Blender này vốn được biên dịch không có OpenSubdiv" + + +msgid "Corner Index" +msgstr "Chỉ Số Góc" + + +msgid "The edge to retrieve data from. Defaults to the edge from the context" +msgstr "Cạnh để lấy dữ liệu từ đó ra. Mặc định là cạnh từ ngữ cảnh" + + +msgid "Values that sort the corners attached to the edge" +msgstr "Các giá trị sắp xếp thứ tự các góc gắn vào cạnh" + + +msgid "Which of the sorted corners to output" +msgstr "Xuất góc nào vốn được sắp xếp thứ tự đây" + + +msgid "A corner of the input edge in its face's winding order, chosen by the sort index" +msgstr "Một góc của cạnh đầu vào theo thứ tự xoay vòng mặt của nó, được chọn theo thứ tự chỉ số sắp xếp" + + +msgid "The number of faces or corners connected to each edge" +msgstr "Số mặt hoặc góc nối với mỗi cạnh" + + +msgid "Corner of Edge" +msgstr "Góc của Cạnh" + + +msgid "Edge Corner Count" +msgstr "Số Góc của Cạnh" + + +msgid "The face to retrieve data from. Defaults to the face from the context" +msgstr "Mặt để trích xuất dữ liệu ra. Mặc định là Mặt từ bối cảnh" + + +msgid "Values used to sort the face's corners. Uses indices by default" +msgstr "Các giá trị sử dụng để sắp xếp những góc của Mặt. Sử dụng chỉ số theo mặc định" + + +msgid "A corner of the face, chosen by the sort index" +msgstr "Một góc của Mặt, đã được chọn theo chỉ số sắp xếp" + + +msgid "The number of corners in the face" +msgstr "Số góc trong Mặt" + + +msgid "Corner of Face" +msgstr "Góc của Mặt" + + +msgid "Vertex Index" +msgstr "Chỉ Số Điểm Đỉnh" + + +msgid "The vertex to retrieve data from. Defaults to the vertex from the context" +msgstr "Điểm đỉnh để lấy dữ liệu từ đó ra. Mặc định là dùng điểm đỉnh từ ngữ cảnh" + + +msgid "Values used to sort corners attached to the vertex. Uses indices by default" +msgstr "Các giá trị sử dụng để sắp xếp các góc vốn đã gắn với điểm đỉnh. Sử dụng các chỉ số theo mặc định" + + +msgid "A corner connected to the face, chosen by the sort index" +msgstr "Một góc kết nối với Mặt, được chọn theo chỉ số sắp xếp" + + +msgid "The number of faces or corners connected to each vertex" +msgstr "Số các mặt hoặc góc kết nối với mỗi điểm đỉnh" + + +msgid "Corner of Vertex" +msgstr "Góc của Điểm Đỉnh" + + +msgid "Vertex Corner Count" +msgstr "Số Góc của Điểm Đỉnh" + + +msgid "Next Edge Index" +msgstr "Chỉ Số Cạnh Tiếp Theo" + + +msgid "Previous Edge Index" +msgstr "Chỉ Số Cạnh Trước" + + +msgid "The corner to retrieve data from. Defaults to the corner from the context" +msgstr "Góc để trích xuất dữ liệu từ đó ra. Mặc định là sử dụng góc từ ngữ cảnh" + + +msgid "The edge after the corner in the face, in the direction of increasing indices" +msgstr "Các cạnh đứng sau góc trong Mặt, theo hướng chỉ số tăng lên" + + +msgid "The edge before the corner in the face, in the direction of decreasing indices" +msgstr "Cạnh đứng trước góc trong Mặt, theo hướng giảm dần của chỉ số" + + +msgid "Corner Next Edge" +msgstr "Góc Cạnh Tiếp Theo" + + +msgid "Corner Previous Edge" +msgstr "Góc Cạnh Trước" + + +msgid "Values used to sort the edges connected to the vertex. Uses indices by default" +msgstr "Các giá trị sử dụng để sắp xếp các cạnh kết nối với điểm đỉnh. Theo mặc định, sử dụng chỉ số" + + +msgid "Which of the sorted edges to output" +msgstr "Xuất những cạnh nào đã được sắp xếp theo thứ tự đây" + + +msgid "An edge connected to the face, chosen by the sort index" +msgstr "Một cạnh kết nối với Mặt, được chọn theo chỉ số sắp xếp" + + +msgid "The number of edges connected to each vertex" +msgstr "Số cạnh kết nối với mỗi điểm đỉnh" + + +msgid "Edge of Vertex" +msgstr "Cạnh của Điểm Đỉnh" + + +msgid "Corner Face Index" +msgstr "Chỉ Số Mặt của Góc" + + +msgid "Index in Face" +msgstr "Chỉ Số trong Mặt" + + +msgid "The index of the face the corner is a part of" +msgstr "Chỉ số của Mặt mà góc là một phần của nó" + + +msgid "The index of the corner starting from the first corner in the face" +msgstr "Chỉ số của góc, bắt đầu từ góc đầu tiên trong Mặt" + + +msgid "Corner Index In Face" +msgstr "Chỉ Số Góc trong Mặt" + + +msgid "The number of corners to move around the face before finding the result, circling around the start of the face if necessary" +msgstr "Số góc di chuyển xung quanh Mặt trước khi tìm được kết quả, đi vòng quanh đầu Mặt nếu cần" + + +msgid "The index of the offset corner" +msgstr "Chỉ số của góc dịch chuyển" + + +msgid "The vertex the corner is attached to" +msgstr "Điểm đỉnh của góc bao trùm" + + +msgid "Corner Vertex" +msgstr "Điểm Đỉnh của Góc" msgid "Geometry cannot be retrieved from the modifier object" -msgstr "Hình dạng không thể rút từ vật thể bộ điều chỉnh" +msgstr "Không thể trích xuất hình học được từ đối tượng bộ điều chỉnh được" msgid "As Instance" -msgstr "Như Thực Thể" +msgstr "Làm Thực Thể" msgid "Output the entire object as single instance. This allows instancing non-geometry object types" -msgstr "Xuất toàn bộ vật thể bằng một thực thể. Cai này cho thực thể hóa các loại vật thể không phải là hình dạng" +msgstr "Xuất toàn bộ đối tượng dưới dạng một thực thể. Việc làm này cho phép thực thể hóa các thể loại đối tượng phi hình học" + + +msgid "Is Valid Offset" +msgstr "Dịch Chuyển Hợp Lệ hay Không" + + +msgid "The index of the control point to evaluate. Defaults to the current index" +msgstr "Chỉ số của điểm điều khiển để tính toán. Sử dụng chỉ số hiện tại làm mặc định" + + +msgid "The number of control points along the curve to traverse" +msgstr "Số điểm điều khiển dọc theo đường cong cần đi qua" + + +msgid "Whether the input control point plus the offset is a valid index of the original curve" +msgstr "Liệu điểm điều khiển đầu vào, cùng với dịch chuyển, có phải là chỉ số hợp lệ của đường cong ban đầu hay không" + + +msgid "The index of the control point plus the offset within the entire curves data-block" +msgstr "Chỉ số của điểm điều khiển, cộng với dịch chuyển, nội trong toàn bộ khối dữ liệu đường cong" + + +msgid "Offset Valid" +msgstr "Dịch Chuyển Hợp Lệ" msgid "The number of points to create" -msgstr "Số lượng điểm để chế tạo" +msgstr "Số điểm để kiến tạo" msgid "The positions of the new points" -msgstr "Vị trí của điểm mới" +msgstr "Vị trí của các điểm mới" msgid "The radii of the new points" -msgstr "Bán kính của điểm mới" +msgstr "Bán kính của các điểm mới" + + +msgid "Curve Group ID" +msgstr "ID Nhóm Đường Cong" + + +msgid "Points to generate curves from" +msgstr "Các điểm để sinh tạo ra đường cong" + + +msgid "A curve is created for every distinct group ID. All points with the same ID are put into the same curve" +msgstr "Một đường cong được tạo ra cho mỗi ID nhóm biệt lập. Toàn bộ các điểm có cùng ID đều sẽ được đưa vào cùng một đường cong" + + +msgid "Determines the order of points in each curve" +msgstr "Xác định thứ tự của các điểm trên mỗi đường cong" msgid "Source Position" -msgstr "Vị Trí Nguồn" +msgstr "Vị trí Nguồn" msgid "The target mesh must have faces" -msgstr "Mạng lưới mục tiêu phải có mặt" +msgstr "Khung lưới mục tiêu phải có một số các mặt" msgid "Is Hit" -msgstr "Là Trúng" +msgstr "Có Bắn Trúng Không" msgid "Hit Position" -msgstr "Vị Trí Trúng" +msgstr "Vị Trí Điểm Bắn Trúng" msgid "Hit Normal" -msgstr "Pháp Tuyến Trúng" +msgstr "Pháp Tuyến Điểm Bắn Trúng" msgid "Hit Distance" -msgstr "Khoảng Cách Trúng" +msgstr "Khoảng Cách Điểm Bắn Trúng" + + +msgid "Attribute does not exist: \"{}\"" +msgstr "Thuộc tính không tồn tại: \"{}\"" + + +msgid "Cannot delete built-in attribute: \"{}\"" +msgstr "Không thể xóa thuộc tính tích hợp: \"{}\"" + + +msgid "Which element to retrieve a value from on the geometry" +msgstr "Phần tử nào trên hình học để trích xuất một giá trị ra" msgid "The source geometry must contain a mesh or a point cloud" -msgstr "Hình dạng nguồn gốc phải có một mạng lưới hay mây điểm" +msgstr "Hình học nguồn phải chứa một khung lưới hoặc một đám mây điểm" + + +msgid "Sample Position" +msgstr "Vị Trí Lấy Mẫu" msgid "The source mesh must have faces" -msgstr "Hình dạng nguồn gốc phải có mặt" +msgstr "Khung lưới nguồn phải có các mặt" + + +msgid "Source UV Map" +msgstr "Ánh Xạ UV Nguồn" + + +msgid "Sample UV" +msgstr "Lấy Mẫu UV" + + +msgid "Is Valid" +msgstr "Hợp Lệ hay Không" + + +msgid "The mesh UV map to sample. Should not have overlapping faces" +msgstr "Ánh xạ UV của khung lưới để lấy mẫu. Không được có các mặt chồng gối lên nhau" + + +msgid "The coordinates to sample within the UV map" +msgstr "Các tọa độ để lấy mẫu nội trong ánh xạ UV" + + +msgid "Whether the node could find a single face to sample at the UV coordinate" +msgstr "Liệu nút có thể tìm thấy một đơn Mặt để lấy mẫu tại tọa độ UV hay không" msgid "Origin of the scaling for each element. If multiple elements are connected, their center is averaged" -msgstr "Gốc tọa độ cho phóng to mỗi phần tử. Nếu đa phần tử được kết nối, trung tâm của chúng nó được trung bình hóa" +msgstr "Tọa độ gốc để đổi tỷ lệ cho mỗi phần tử. Nếu nhiều phần tử được kết nối, thì tâm của chúng sẽ được tính trung bình" msgid "Direction in which to scale the element" -msgstr "Hướng để phóng to phần tử" +msgstr "Chiều hướng để đổi tỷ lệ phần tử" msgid "The parts of the geometry that go into the first output" -msgstr "Bộ phận của hình dạng đi vào ngõ ra thứ nhất" +msgstr "Các phần của hình học đi vào đầu ra đầu tiên" msgid "The parts of the geometry in the selection" -msgstr "Bộ phận của hình dạng có trong sự lựa chọn" +msgstr "Các phần của hình học nằm trong lựa chọn" msgid "The parts of the geometry not in the selection" -msgstr "Bộ phận của hình dạng không có trong sự lựa chọn" +msgstr "Các phần của hình học không nằm trong lựa chọn" + + +msgid "Mesh has no faces for material assignment" +msgstr "Khung lưới không có các mặt nào để ấn định chất liệu cả" msgid "Volumes only support a single material; selection input can not be a field" -msgstr "Thể tích chỉ hỗ trợ một vật liệu; sự lựa chọn ngõ vào không thể là trường" +msgstr "Thể tích chỉ hỗ trợ một nguyên vật liệu duy nhất; đầu vào lựa chọn không thể là một trường được" msgid "Point clouds only support a single material; selection input can not be a field" -msgstr "Mây điểm chỉ hỗ trợ một vật liệu; sự lựa chọn ngõ vào không thể là trường" +msgstr "Các đám mây điểm chỉ hỗ trợ một nguyên vật liệu duy nhất; đầu vào lựa chọn không thể là một trường được" msgid "Curves only support a single material; selection input can not be a field" -msgstr "Đường cong chỉ hỗ trợ một vật liệu; sự lựa chọn ngõ vào không thể là trường" +msgstr "Các đường cong chỉ hỗ trợ một nguyên vật liệu duy nhất; đầu vào lựa chọn không thể là một trường được" msgid "Shade Smooth" -msgstr "Tô Sắc Mịn" +msgstr "Tô Bóng Mịn Màng" + + +msgid "Delta Time" +msgstr "Thời Gian Delta" + + +msgid "Baked %d - %d" +msgstr "Nướng %d - %d" + + +msgid "Frames %d - %d" +msgstr "Khung Hình %d - %d" + + +msgid "Skip" +msgstr "Bỏ Qua" + + +msgid "Forward the output of the simulation input node directly to the output node and ignore the nodes in the simulation zone" +msgstr "Chuyển trực tiếp đầu ra của nút đầu vào mô phỏng đến nút đầu ra và bỏ qua các nút trong vùng mô phỏng" + + +msgid "Failed to write to attribute \"{}\" with domain \"{}\" and type \"{}\"" +msgstr "Không thể viết vào thuộc tính \"{}\" với phạm vi \"{}\" và kiểu \"{}\"" msgid "Delimiter" -msgstr "Dấu Tách" +msgstr "Dấu Phân Cách" msgid "Strings" -msgstr "Xâu" +msgstr "Chuỗi Ký Tự" msgid "Font not specified" -msgstr "Phông chưa được chỉ định" +msgstr "Phông chữ chưa được chỉ định" msgid "Text Box Width" @@ -116451,35 +130792,55 @@ msgstr "Thực Thể Đường Cong" msgid "Remainder" -msgstr "Dư" +msgstr "Phần Còn Lại" msgid "Edge Crease" -msgstr "Cạnh Nhăn" +msgstr "Miết Nếp Gấp" + + +msgid "The location of the scene's 3D cursor, in the local space of the modified object" +msgstr "Vị trí con trỏ 3D của cảnh, trong không gian cục bộ của đối tượng sửa đổi" + + +msgid "The rotation of the scene's 3D cursor, in the local space of the modified object" +msgstr "Xoay chiều con trỏ 3D của cảnh, trong không gian cục bộ của đối tượng sửa đổi" + + +msgid "Operator Selection" +msgstr "Lựa Chọn Thao Tác" msgid "Volume scale is lower than permitted by OpenVDB" -msgstr "Phóng to thể tích nhỏ hơn mức OpenVDB cho phép dùng" +msgstr "Tỷ lệ thể tích thấp hơn mức OpenVDB cho phép" msgid "Faces to consider when packing islands" -msgstr "Các mặt cho tính toán khi ém hòn đảo" +msgstr "Các mặt cần cân nhắc khi đóng gói các hải đảo" msgid "Rotate islands for best fit" -msgstr "Xoay đảo cho vừa nhất" +msgstr "Xoay chiều hải đảo để khít vừa nhất" + + +msgid "Pack UV Islands Field" +msgstr "Trường Đóng Gói các Hải Đảo UV" msgid "Faces to participate in the unwrap operation" -msgstr "Các mặt cho tham gia trong thao tác mở gói" +msgstr "Các mặt tham gia vào thủ tục mở gói" msgid "Edges to mark where the mesh is \"cut\" for the purposes of unwrapping" -msgstr "Các cạnh cho ký dấu chỗ trên mạng lưới để \"cắt\" khi mở gói" +msgstr "Các cạnh để đánh dấu vị trí lưới được \"cắt\" nhằm mục đích mở gói" msgid "UV coordinates between 0 and 1 for each face corner in the selected faces" -msgstr "Tọa độ UV giữa 0 đến 1 cho mỗi " +msgstr "Tọa độ UV từ 0 đến 1 cho mỗi góc Mặt trong các mặt đã chọn" + + +msgid "UV Unwrap Field" +msgstr "Trường Mở Gói UV" msgid "Resolution must be greater than 1" @@ -116487,187 +130848,379 @@ msgstr "Độ phân giải phải lớn hơn 1" msgid "Bounding box volume must be greater than 0" -msgstr "Thể tích của hộp bao quanh phải lớn hơn 0" +msgstr "Thể tích hình hộp viền phải lớn hơn 0" msgid "Volume density per voxel" -msgstr "Tỉ trọng thể tích từng thể tích tử" +msgstr "Tỷ trọng thể tích cho mỗi thể tích tử" msgid "Value for voxels outside of the cube" -msgstr "Giá trị cho những thể tích tử ở ngoài hình lập phương" +msgstr "Giá trị cho các thể tích tử bên ngoài khối lập phương" msgid "Minimum boundary of volume" -msgstr "Ranh giới cực tiểu của thể tích" +msgstr "Ranh giới tối thiểu của thể tích" msgid "Maximum boundary of volume" -msgstr "Ranh giới cực đại của thể tích" +msgstr "Ranh giới tối đa của thể tích" msgid "Number of voxels in the X axis" -msgstr "Số lượng thể tích tử trên trục X" +msgstr "Số thể tích tử trong trục X" msgid "Number of voxels in the Y axis" -msgstr "Số lượng thể tích tử trong trục Y" +msgstr "Số thể tích tử trong trục Y" msgid "Number of voxels in the Z axis" -msgstr "Số lượng thể tích tử trong trục Z" +msgstr "Số thể tích tử trong trục Z" msgid "Values larger than the threshold are inside the generated mesh" -msgstr "Giá trị lớn hơn ngưỡng được chế tạo trong mạng lưới" +msgstr "Các giá trị lớn hơn ngưỡng nằm sẽ nằm trong khung lưới sinh tạo" + + +msgid "{} node" +msgstr "nút {}" + + +msgid "Group '{}' ({})" +msgstr "Nhóm '{}' ({})" + + +msgid "Inspection index is out of range" +msgstr "Chỉ số điều tra nằm ngoài phạm vi" msgid "Missing Data-Block" -msgstr "Cục Dữ Liệu Thiếu" +msgstr "Thiếu Khối Dữ Liệu" msgid "Nesting a node group inside of itself is not allowed" -msgstr "Không cho đệ quy một nhóm định phía trong một mình" +msgstr "Không được phép lồng một nhóm nút bên trong bản thân nó" + + +msgid "Node group has different type" +msgstr "Nhóm nút có kiểu/thể loại khác" msgid "Instances in input geometry are ignored" -msgstr "Các thực thể trong hình dạng ngõ vào đã bị không quan tâm" +msgstr "Bỏ qua các thực thể trong hình học cung cấp ở đầu vào" msgid "Realized data in input geometry is ignored" -msgstr "Dữ liệu hình thành trong hình dạng ngõ vào đã bị không quan tâm" +msgstr "Bỏ qua dữ liệu hiện thực hóa trong hình học cung cấp ở đầu vào" msgid "Input geometry has unsupported type: " -msgstr "Hình dạng ngõ vào có loại không hỗ trợ:" +msgstr "Hình học cung cấp ở đầu vào có chứa thể loại/kiểu chưa được hỗ trợ: " msgid "Undefined Node Tree Type" -msgstr "Loại Cây Giao Điểm Chưa Xác Định" +msgstr "Thể Loại Nút Cây Chưa Xác Định Rõ Ràng" + + +msgid "Addend" +msgstr "Số Cộng" msgid "Shader Editor" -msgstr "Bộ Biên Bộ Tô Sắc" +msgstr "Trình Biên Soạn Bộ Tô Bóng" msgid "Not a shader node tree" -msgstr "Không phải là cây giao điểm tô sắc" +msgstr "Không phải là cây nút tô bóng" msgid "Not a shader or geometry node tree" -msgstr "Không phải là cây giao điểm tô sắc hay hình dạng" +msgstr "Không phải một cây nút tô bóng hoặc hình học" msgid "AO" -msgstr "Che Khuất Bao Quanh" +msgstr "THTMT" msgid "BSDF" -msgstr "BSDF" +msgstr "Bidirectional Scattering Distribution Function: Hàm Phân Bổ Tán Xạ Hai Chiều" msgid "IOR" -msgstr "Chiết Suất" +msgstr "Chỉ Số Khúc Xạ" msgid "Anisotropy" -msgstr "Độ Dị Hướng" +msgstr "Dị Hướng" msgid "RoughnessU" -msgstr "ĐộNhámU" +msgstr "Độ Nhám U" msgid "RoughnessV" -msgstr "ĐộNhámV" +msgstr "Độ Nhám V" msgid "Melanin" -msgstr "Hắt Tố" +msgstr "Mêlanin" msgid "Melanin Redness" -msgstr "Độ Đỏ Hắt Tố" +msgstr "Độ Đỏ của Mêlanin" msgid "Radial Roughness" -msgstr "Độ Nhám Bán Kính Tuyến" +msgstr "Độ Nhám Tỏa Tròn" msgid "Coat" -msgstr "Lớp" +msgstr "Lớp Tráng Bóng" msgid "Random Color" -msgstr "Màu Ngẫu Nhiên" +msgstr "Ngẫu Nhiên Hóa Màu Sắc" msgid "Random Roughness" -msgstr "Độ Nhám Ngẫu Nhiên" +msgstr "Ngẫu Nhiên Hóa Độ Nhám" + + +msgid "Secondary Reflection" +msgstr "Phản Quang Thứ Hai" + + +msgid "The RGB color of the strand. Only used in Direct Coloring" +msgstr "Màu RGB của sợi. Chỉ được sử dụng trong Tô Màu Trực Tiếp m" + + +msgid "Hair pigment. Specify its absolute quantity between 0 and 1" +msgstr "Sắc tố của tóc. Chỉ định số lượng tuyệt đối của nó trong khoảng từ 0 đến 1" + + +msgid "Fraction of pheomelanin in melanin, gives yellowish to reddish color, as opposed to the brownish to black color of eumelanin" +msgstr "Một phần pheomelanin trong melanin tạo ra màu từ vàng đến đỏ, trái ngược với màu nâu đến đen của eumelanin" + + +msgid "Additional color used for dyeing the hair" +msgstr "Màu bổ sung dùng để nhuộm tóc" + + +msgid "Specifies energy absorption per unit length as light passes through the hair. A higher value leads to a darker color" +msgstr "Chỉ định mức hấp thụ năng lượng trên mỗi đơn vị chiều dài khi ánh sáng truyền qua tóc. Giá trị cao hơn dẫn đến màu tối hơn" + + +msgid "The ratio of the minor axis to the major axis of an elliptical cross-section. Recommended values are 0.8~1 for Asian hair, 0.65~0.9 for Caucasian hair, 0.5~0.65 for African hair. The major axis is aligned with the curve normal, which is not supported in particle hair" +msgstr "Tỷ số giữa trục nhỏ và trục lớn của mặt cắt hình elip. Giá trị đề cử là 0.8~1 đối với tóc người châu Á, 0.65~0.9 đối với tóc người da trắng, 0.5~0.65 đối với tóc người châu Phi. Trục chính được căn chỉnh theo pháp tuyến đường cong, tức cái không được hỗ trợ trong tóc lông dùng hệ thống hạt" + + +msgid "Hair roughness. A low value leads to a metallic look" +msgstr "Độ thô ráp của tóc. Giá trị thấp dẫn đến diện mạo giống kim loại" + + +msgid "Simulate a shiny coat by reducing the roughness to the given factor only for the first light bounce (diffuse). Range [0, 1] is equivalent to a reduction of [0%, 100%] of the original roughness" +msgstr "Mô phỏng một lớp sơn tráng bóng bằng cách giảm độ nhám xuống thành hệ số đã cho duy trong lần bật nẩy ánh sáng đầu tiên (khuếch tán). Phạm vi [0, 1] tương đương với mức giảm [0%, 100%] độ nhám ban đầu" + + +msgid "Index of refraction determines how much the ray is bent. At 1.0 rays pass straight through like in a transparent material; higher values cause larger deflection in angle. Default value is 1.55 (the IOR of keratin)" +msgstr "Chỉ số khúc xạ xác định độ cong của tia. Ở mức 1.0 tia xạ truyền xuyên thẳng qua như trong vật liệu trong suốt vậy; giá trị cao hơn sẽ gây ra độ lệch góc lớn hơn. Giá trị mặc định là 1.55 (Chỉ số khúc xạ của keratin)" + + +msgid "The tilt angle of the cuticle scales (the outermost part of the hair). They are always tilted towards the hair root. The value is usually between 2 and 4 for human hair" +msgstr "Góc nghiêng của vảy cá biểu bì (phần ngoài cùng của tóc). Chúng luôn nghiêng về phía chân tóc. Giá trị thường nằm trong khoảng từ 2 đến 4 đối với tóc người" + + +msgid "Vary the melanin concentration for each strand" +msgstr "Thay đổi nồng độ melanin cho từng sợi một" + + +msgid "Vary roughness values for each strand" +msgstr "Thay đổi giá trị độ nhám cho từng sợi một" + + +msgid "Optional factor for modulating the first light bounce off the hair surface. The color of this component is always white. Keep this 1.0 for physical correctness" +msgstr "Hệ số tùy chọn để điều chỉnh ánh sáng đầu tiên phản chiếu lại trên bề mặt của tóc. Màu sắc của thành phần này luôn là màu trắng. Giữ nguyên 1.0 này để đảm bảo tính chính xác về mặt vật lý" + + +msgid "Optional factor for modulating the transmission component. Picks up the color of the pigment inside the hair. Keep this 1.0 for physical correctness" +msgstr "Hệ số tùy chọn để điều biến phần tử truyền xạ. Lấy màu của sắc tố bên trong tóc. Giữ nguyên 1.0 này để đảm bảo tính chính xác về mặt vật lý" + + +msgid "Optional factor for modulating the component which is transmitted into the hair, reflected off the backside of the hair and then transmitted out of the hair. This component is oriented approximately around the incoming direction, and picks up the color of the pigment inside the hair. Keep this 1.0 for physical correctness" +msgstr "Hệ số tùy chọn để điều biến phần tử truyền xạ vào tóc, phản chiếu lại từ mặt sau của tóc và sau đó truyền ra khỏi tóc. Thành phần này được định hướng quanh chiều hướng đi vào và lấy màu của sắc tố bên trong tóc. Giữ nguyên giá trình 1.0 này để đảm bảo tính chính xác về mặt vật lý" + + +msgid "Subsurface Weight" +msgstr "Trọng Lượng của Lớp Dưới Bề Mặt" msgid "Subsurface Radius" -msgstr "Bán Kính Hạ Bề Mặt" +msgstr "Bán Kính của Lớp Dưới Bề Mặt" + + +msgid "Subsurface Scale" +msgstr "Tỷ Lệ của Lớp Dưới Bề Mặt" msgid "Subsurface IOR" -msgstr "Chiết Suất Hạ Mặt" +msgstr "Chỉ Số Khúc Xạ Dưới Bề Mặt" msgid "Subsurface Anisotropy" -msgstr "Dị Hướng Hạ Mặt" +msgstr "Dị Hướng Dưới Bề Mặt" msgid "Anisotropic Rotation" -msgstr "Xoay Dị Hướng" +msgstr "Xoay Chiều Dị Hướng" + + +msgid "Transmission Weight" +msgstr "Trọng Lượng Truyền Xạ" + + +msgid "Coat Weight" +msgstr "Trọng Lượng của Lớp Tráng" + + +msgid "Coat Roughness" +msgstr "Độ Nhám của Lớp Tráng" + + +msgid "Coat IOR" +msgstr "Chỉ Số Khúc Xạ của Lớp Tráng" + + +msgid "Coat Normal" +msgstr "Pháp Tuyến của Lớp Tráng" + + +msgid "Sheen Weight" +msgstr "Trọng Lượng của Ánh Bóng Loáng" + + +msgid "Sheen Roughness" +msgstr "Độ Nhám của Ánh Bóng Loáng" msgid "Emission Color" -msgstr "Màu Phát Xạ" +msgstr "Màu Phát Sáng" msgid "Emission Strength" -msgstr "Sức Phát Xạ" +msgstr "Cường Độ Phát Sáng" + + +msgctxt "NodeTree" +msgid "Specular Tint" +msgstr "Màu Nhuốm của Ánh Lóng Lánh" + + +msgctxt "NodeTree" +msgid "Coat Tint" +msgstr "Màu Nhuốm của Lớp Tráng" + + +msgctxt "NodeTree" +msgid "Sheen Tint" +msgstr "Màu Nhuốm của Ánh Bóng Loáng" + + +msgid "Blend between diffuse surface and subsurface scattering. Typically should be zero or one (either fully diffuse or subsurface)" +msgstr "Pha trộn giữa tán xạ khuếch tán bề mặt và tán xạ dưới bề mặt. Thông thường thì phải bằng 0 hoặc 1 (hoặc là khuếch tán hoàn toàn, hoặc là dưới bề mặt)" + + +msgid "Scattering radius to use for subsurface component (multiplied with Scale)" +msgstr "Bán kính tán xạ sử dụng cho phần tử dưới bề mặt (nhân với Tỷ Lệ)" + + +msgid "Scale of the subsurface scattering (multiplied with Radius)" +msgstr "Tỷ lệ tán xạ dưới bề mặt (nhân với Bán Kính)" + + +msgid "Index of refraction used for rays that enter the subsurface component" +msgstr "Chỉ số khúc xạ sử dụng cho các tia xâm nhập phần tử dưới bề mặt" + + +msgid "Adjustment to the IOR to increase or decrease specular intensity (0.5 means no adjustment, 0 removes all reflections, 1 doubles them at normal incidence)" +msgstr "Điều chỉnh chỉ số khúc xạ để tăng hoặc giảm cường độ của ánh lóng lánh (0.5 nghĩa là không điều chỉnh, 0 loại bỏ tất cả các phản xạ, 1 nhân đôi chúng tại pháp tuyến điểm rơi vào)" + + +msgid "Blend between transmission and other base layer components" +msgstr "Sự pha trộn giữa sự truyền xạ và các thành phần tầng lớp cơ sở khác" + + +msgid "Controls the intensity of the coat layer, both the reflection and the tinting. Typically should be zero or one for physically-based materials" +msgstr "Điều khiển cường độ của lớp tráng, cả độ phản chiếu và màu nhuốm. Thông thường thì giá trị này phải bằng 0, hoặc là 1 đối với các nguyên vật liệu có cơ sở vật lý (thực)" + + +msgid "The roughness of the coat layer" +msgstr "Độ nhám của lớp tráng" + + +msgid "The index of refraction of the coat layer (affects its reflectivity as well as the falloff of coat tinting)" +msgstr "Chỉ số khúc xạ của lớp tráng (ảnh hưởng đến độ phản xạ của nó cũng như độ suy giảm dần của màu nhuốm lớp tráng)" + + +msgid "Adds a colored tint to the coat layer by modeling absorption in the layer. Saturation increases at shallower angles, as the light travels farther through the medium (depending on the Coat IOR)" +msgstr "Thêm màu nhuốm vào lớp tráng bằng cách mô hình hóa sự hấp thụ trong tầng lớp. Độ bão hòa tăng lên ở các góc nông hơn, khi ánh sáng truyền đi xa hơn vào trong môi trường (tùy thuộc vào Chỉ Số Khúc Xạ của Lớp Tráng)" + + +msgid "IOR Level" +msgstr "Cấp Độ Chỉ Số Khúc Xạ" + + +msgctxt "NodeTree" +msgid "Tint" +msgstr "Màu Nhuốm" + + +msgid "Subsurface" +msgstr "Dưới Bề Mặt" + + +msgid "Sheen" +msgstr "Nước Láng Bóng" msgid "View Vector" -msgstr "Vectơ Màn" +msgstr "Véctơ của Điểm Nhìn" msgid "View Z Depth" -msgstr "Độ Sâu Z Màn" +msgstr "Độ Sâu Z từ Điểm Nhìn" msgid "View Distance" -msgstr "Tấm Nhìn" +msgstr "Khoảng Cách từ Điểm Nhìn" msgid "Emissive Color" -msgstr "Màu Phát Xạ" +msgstr "Màu Phát" msgid "Transparency" -msgstr "Trong Suốt" +msgstr "Độ Trong" msgid "Clear Coat" -msgstr "Lớp Trong Suốt" +msgstr "Lớp Tráng Bóng Trong" msgid "Clear Coat Roughness" -msgstr "Độ Nhám Lớp Trong Suốt" +msgstr "Độ Nhám của Lớp Tráng Bóng Trong" msgid "Clear Coat Normal" -msgstr "Pháp Tuyến Lớp Trong Suốt" +msgstr "Pháp Tuyến của Lớp Tráng Bóng Trong" msgid "True Normal" -msgstr "Pháp Thuyến Thật" +msgstr "Pháp Tuyến Thực" msgid "Incoming" -msgstr "Ngõ Vào" +msgstr "Hướng Nhìn Vào" msgid "Parametric" @@ -116675,7 +131228,7 @@ msgstr "Tham Số" msgid "Backfacing" -msgstr "Chỉ Phía Sau" +msgstr "Trở Mặt" msgid "Pointiness" @@ -116683,7 +131236,7 @@ msgstr "Độ Nhọn" msgid "Random Per Island" -msgstr "Ngẫu Nhiên Từng Đảo" +msgstr "Ngẫu Nhiên Hóa Từng Hải Đảo Một" msgid "Is Strand" @@ -116691,15 +131244,15 @@ msgstr "Là Sợi" msgid "Intercept" -msgstr "Điểm Cắt" +msgstr "Điểm Giao Cắt" msgid "Tangent Normal" -msgstr "Tiếp Tuyến - Pháp Tuyến" +msgstr "Pháp Tiếp Tuyến" msgid "Facing" -msgstr "Chỉ Hướng" +msgstr "Đối Mặt" msgid "Is Camera Ray" @@ -116711,15 +131264,15 @@ msgstr "Là Tia Bóng Tối" msgid "Is Diffuse Ray" -msgstr "Là Tia Tán Xạ" +msgstr "Là Tia Khuếch Tán" msgid "Is Glossy Ray" -msgstr "Là Tia Bóng Loáng" +msgstr "Là Tia Bóng Bẩy" msgid "Is Singular Ray" -msgstr "Là Tia Kỳ Dị" +msgstr "Là Tia Lập Dị" msgid "Is Reflection Ray" @@ -116727,55 +131280,59 @@ msgstr "Là Tia Phản Xạ" msgid "Is Transmission Ray" -msgstr "Là Tia Truyền" +msgstr "Là Tia Lan Truyền" msgid "Ray Depth" -msgstr "Độ Sâu Tia" +msgstr "Độ Sâu của Tia" msgid "Diffuse Depth" -msgstr "Độ Sâu Tán Xạ" +msgstr "Độ Sâu của Khuếch Tán" msgid "Glossy Depth" -msgstr "Độ Sâu Bóng Loáng" +msgstr "Độ Sâu của Ánh Bóng Bẩy" msgid "Transparent Depth" -msgstr "Độ Sâu Trong Suốt" +msgstr "Độ Sâu của Độ Trong" msgid "Transmission Depth" -msgstr "Độ Sâu Truyền" +msgstr "Độ Sâu Lan Truyền" + + +msgid "Factor (Non-Uniform)" +msgstr "Hệ số (Không đồng nhất)" msgid "Color1" -msgstr "Màu 1" +msgstr "Màu1" msgid "Color2" -msgstr "Màu 2" +msgstr "Màu2" msgid "Object Index" -msgstr "Chỉ Số Vật Thể" +msgstr "Chỉ Số Đối Tượng" msgid "Color Fac" -msgstr "Hệ Số Màu" +msgstr "Hệ Số Màu Sắc" msgid "Alpha Fac" -msgstr "Hệ Số Độ Đục" +msgstr "Hệ Số Alpha" msgid "Age" -msgstr "Tuổi" +msgstr "Tuổi thọ" msgid "BSSRDF" -msgstr "BSSRDF" +msgstr "Bidirectional Scattering Surface Reflectance Distribution Function: Hàm Phân Phối Phản Xạ Bề Mặt Tán Xạ Hai Chiều" msgid "Mortar" @@ -116783,7 +131340,7 @@ msgstr "Vữa" msgid "Mortar Size" -msgstr "Cỡ Vữa" +msgstr "Kích Thước Vữa" msgid "Mortar Smooth" @@ -116791,67 +131348,91 @@ msgstr "Vữa Mịn" msgid "Brick Width" -msgstr "Chiều Rộng Gạch" +msgstr "Chiều Rộng của Gạch" msgid "Row Height" -msgstr "Chiều Cao Hàng" +msgstr "Chiều Cao của Hàng" + + +msgid "The scale of a Perlin noise octave relative to that of the previous octave" +msgstr "Tỷ lệ của quãng tám nhiễu Perlin so với quãng tám trước đó" + + +msgid "Sun disc not available in EEVEE" +msgstr "Đĩa mặt trời không có trong EEVEE" + + +msgid "The number of Voronoi layers to sum" +msgstr "Số tầng lớp Voronoi để tính tổng" + + +msgid "The influence of a Voronoi layer relative to that of the previous layer" +msgstr "Ảnh hưởng của tầng lớp Voronoi tương đối với tầng lớp trước" + + +msgid "The scale of a Voronoi layer relative to that of the previous layer" +msgstr "Tỷ lệ của tầng lớp Voronoi tương đối với tầng lớp trước đó" msgid "Detail Scale" -msgstr "Phóng To Chi Tiết" +msgstr "Tỷ Lệ Chi Tiết" msgid "Detail Roughness" -msgstr "Độ Nhám Chi Tiết" +msgstr "Mức Rối của Chi Tiết" + + +msgid "Incident" +msgstr "Liên Thuộc" msgid "No mesh in active object" -msgstr "Không có mạng lưới trong vật thể hoạt động" +msgstr "Không có khung lưới nào trong đối tượng đang hoạt động cả" msgid "Density Attribute" -msgstr "Đặc Điểm Tỉ Trọng" +msgstr "Thuộc Tính Mật Độ" msgid "Absorption Color" -msgstr "Màu Hấp Thụ" +msgstr "Màu của sự Hấp Thụ" msgid "Blackbody Intensity" -msgstr "Cường Độ Vật Thể Đen" +msgstr "Cường Độ Sáng của Vật Đen" msgid "Blackbody Tint" -msgstr "Màu Vật Thể Đen" +msgstr "Sắc Thái Màu Nhiệt Độ của Vật Đen" msgid "Temperature Attribute" -msgstr "Đặc Điểm Nhiệt Độ" +msgstr "Thuộc Tính về Nhiệt Độ" msgid "Patterns" -msgstr "Gương Mẫu" +msgstr "Hoa Văn" msgid "Texture Node Editor" -msgstr "Trình Biên Soạn Giao Điểm Chất Liệu" +msgstr "Trình Biên Soạn Nút Chất Liệu" msgid "Not a texture node tree" -msgstr "Không phải là cây giao điểm chất liệu" +msgstr "Không phải là một cây nút chất liệu" msgid "Bricks 1" -msgstr "Các Gạch 1" +msgstr "Gạch 1" msgid "Bricks 2" -msgstr "Các Gạch 2" +msgstr "Gạch 2" msgid "Coordinate 1" -msgstr "Tọa Độ 2" +msgstr "Tọa Độ 1" msgid "Coordinate 2" @@ -116875,7 +131456,7 @@ msgstr "W4" msgid "iScale" -msgstr "Phóng To" +msgstr "tỷLệ_i" msgid "" @@ -116883,7 +131464,7 @@ msgid "" "Location: %s:%d" msgstr "" "%s: %.*s\n" -"Vị Trí: %s:%d" +"Địa điểm: %s:%d" msgid "%s: %.*s" @@ -116895,23 +131476,23 @@ msgstr "Không tìm được đường dẫn (%s)" msgid "Can not initialize the GPU" -msgstr "Không thể khởi động GPU" +msgstr "Không thể khởi thủy GPU được" msgid "Failed allocate render result, out of memory" -msgstr "Thất bại giành bộ nhớ cho kết qủa kết xuất, hết bộ nhớ" +msgstr "Không thể phân phối bộ nhớ cho kết quả kết xuất, bộ nhớ bị cạn kiệt" msgid "Fra:%d Mem:%.2fM (Peak %.2fM) " -msgstr "BứcẢnh:%d BộNhớ%.2fM (TốcĐỉnh %.2fM) :" +msgstr "Khung Hình:%d Bộ Nhớ:%.2fM (Cao Nhất %.2fM) " msgid "| Time:%s | " -msgstr "| ThờiGian:%s | " +msgstr "| Thời Gian:%s | " msgid "Image too small" -msgstr "Ảnh qúa nhỏ" +msgstr "Hình ảnh quá nhỏ" msgid "Cannot render, no camera" @@ -116919,61 +131500,81 @@ msgstr "Không thể kết xuất, không có máy quay phim" msgid "No border area selected" -msgstr "Cho chọn được khu vực ranh giới" +msgstr "Không có khu vực ranh giới nào được chọn cả" msgid "Border rendering is not supported by sequencer" -msgstr "Bộ trình tự không hỗ trợ kết xuất ranh giới" +msgstr "Trình Phối Hình không hỗ trợ kết xuất trong Đường Ranh Giới" msgid "No node tree in scene" -msgstr "Không có cây giao điểm trong cảnh" +msgstr "Không có cây nút trong cảnh" msgid "No render output node in scene" -msgstr "Không có giao điểm xuất kết suất trong cảnh" +msgstr "Không có nút đầu ra kết xuất nào trong cảnh cả" msgid "All render layers are disabled" -msgstr "Hết lớp kết xuất bị tắt rồi" +msgstr "Toàn bộ các tầng kết xuất đều bị tắt" msgid "No frames rendered, skipped to not overwrite" -msgstr "Không có bức ảnh nào được kết xuất, đã bỏ qua cho không ghi lên trên" +msgstr "Không có khung hình nào được kết xuất cả, bỏ qua và nhảy sang không viết đè" + + +msgid "No camera found in scene \"%s\" (used in compositing of scene \"%s\")" +msgstr "Không tìm thấy máy quay phim nào trong cảnh \"%s\" cả (sử dụng trong quá trình tổng hợp cảnh \"%s\")" + + +msgid "No camera found in scene \"%s\"" +msgstr "Không tìm thấy máy quay phim nào trong cảnh \"%s\" cả" msgid "Camera \"%s\" is not a multi-view camera" -msgstr "Máy quay phim \"%s\" không phải lả máy quay phim đa màn" +msgstr "Máy quay phim \"%s\" không phải là máy quay đa góc nhìn" msgid "No active view found in scene \"%s\"" -msgstr "Không có màn hoạt động trong cảnh \"%s\"" +msgstr "Không tìm thấy góc nhìn nào đang hoạt động trong cảnh \"%s\"" msgid "%s: no Combined pass found in the render layer '%s'" -msgstr "%s: không tìm được vòng Gồm trong lớp kết xuất '%s'" +msgstr "%s: không tìm được Lượt Tổng Hợp trong tầng kết xuất '%s'" msgid "%s: failed to allocate clip buffer '%s'" -msgstr "%s: giành bộ nhớ cho đệm đoạn phim '%s' bị thất bại" +msgstr "%s: không thể phân bổ bộ nhớ để làm bộ đệm cho đoạn phim '%s'" msgid "%s: incorrect dimensions for partial copy '%s'" -msgstr "%s: kích thước không đúng cho chép miến của '%s'" +msgstr "%s: kích thước không hợp lệ cho bản sao cục bộ '%s'" msgid "%s: failed to load '%s'" -msgstr "%s: nhập '%s' bị thất bại" +msgstr "%s: không nạp được '%s'" + + +msgid "Reading render result: dimensions don't match, expected %dx%d" +msgstr "Đọc kết quả kết xuất: kích thước không khớp, dự kiến là %dx%d" + + +msgid "Reading render result: expected channel \"%s.%s\" or \"%s\" not found" +msgstr "Đọc kết quả kết xuất: không tìm thấy kênh \"%s.%s\" hoặc \"%s\" dự kiến" + + +msgid "Reading render result: expected channel \"%s.%s\" not found" +msgstr "Đọc kết quả kết xuất: không tìm thấy kênh \"%s.%s\" dự kiến" msgctxt "Sequence" msgid "Color Balance" -msgstr "Thăng Bằng Màu" +msgstr "Cân Bằng Màu" msgctxt "Sequence" msgid "White Balance" -msgstr "Thăng Bằng Trắng" +msgstr "Cân Bằng Trắng" msgctxt "Sequence" @@ -116983,68 +131584,103 @@ msgstr "Đường Cong" msgctxt "Sequence" msgid "Hue Correct" -msgstr "Chỉnh Màu Sấc" +msgstr "Chỉnh Sắc Màu" + + +msgctxt "Sequence" +msgid "Brightness/Contrast" +msgstr "Độ Sáng/Độ Tương Phản" msgctxt "Sequence" msgid "Tonemap" -msgstr "Ánh Xạ Đồ Xám" +msgstr "Điều Chỉnh Sắc Thái" + + +msgctxt "Sequence" +msgid "Equalizer" +msgstr "Bộ Điều Chỉnh Cân Bằng" msgid "Strips must be the same length" -msgstr "Đoạn bề dài bằng nhau" +msgstr "Các đoạn phim phải có chiều dài bằng nhau" msgid "Strips were not compatible" -msgstr "Đoạn không thích hợp với nhau" +msgstr "Các đoạn phim không tương thích" msgid "Strips must have the same number of inputs" -msgstr "Đoạn phải có cùng số lượng ngõ vào" +msgstr "Các đoạn phim cần phải có số lượng đầu vào giống nhau" msgid "Can not move strip to non-meta strip" -msgstr "Không thể di chuyển đoạn đến đoạn không phải là siêu đoạn" +msgstr "Không thể di chuyển dải đến đoạn không phải là siêu dải" msgid "Strip can not be moved into itself" -msgstr "Không thể di chuyển đoạn vào một mình" +msgstr "Dải không thể di chuyển vào bản thân nó được" msgid "Moved strip is already inside provided meta strip" -msgstr "Đoạn đã di chuyển đang ở trong siêu đoạn được cung cấp" +msgstr "Dải di chuyển đã nằm bên trong siêu dải cung cấp" msgid "Moved strip is parent of provided meta strip" -msgstr "Đoạn đã di chuyển là phụ huynh của siêu đoạn được cung cấp" +msgstr "Dải di chuyển là phụ huynh của siêu dải cung cấp" msgid "Can not move strip to different scene" -msgstr "Không thể di chuyển đoạn đến đoạn khác" +msgstr "Không thể di chuyển dải đến cảnh khác được" msgid "Recursion detected in video sequencer. Strip %s at frame %d will not be rendered" -msgstr "Được phát hiện đệ quy trong bột trình tự video. Sẽ không kết xuất đoạn %s tại bức ảnh %d" +msgstr "Phát hiện thấy có sự hồi quy trong Trình Phối Hình. Dải %s tại khung hình %d sẽ được kết xuất" + + +msgctxt "Sequence" +msgid "Audio" +msgstr "Âm Thanh" + + +msgctxt "Sequence" +msgid "Sub" +msgstr "Trừ" + + +msgctxt "Sequence" +msgid "Mul" +msgstr "Nhân" + + +msgctxt "Sequence" +msgid "Multicam" +msgstr "Đa Máy Quay" + + +msgctxt "Sequence" +msgid "Adjustment" +msgstr "Điều Chỉnh" msgid "Colorize" -msgstr "Màu Sắc Hóa" +msgstr "Tô Màu" msgid "Glow" -msgstr "Hào Quang" +msgstr "Hừng Sáng" msgid "Blur X" -msgstr "Mờ X" +msgstr "Làm Nhòe Mờ X" msgid "Rim" -msgstr "Rìa" +msgstr "Mép/Vành Mép" msgid "Object Pivot" -msgstr "Điểm Tựa Vật Thể" +msgstr "Tựa vào Đối Tượng" msgid "Wave Effect" @@ -117052,31 +131688,43 @@ msgstr "Hiệu Ứng Sóng" msgid "Swirl" -msgstr "Xoắn" +msgstr "Xoáy Lốc" msgid "WaveDistortion" -msgstr "MéoHóaSóng" +msgstr "BiếnDạngSóng" + + +msgid "window_managers" +msgstr "trình quản lý cửa sổ" + + +msgid "Region could not be drawn!" +msgstr "Không thể vẽ vùng được!" msgid "Input pending " -msgstr "Ngõ vào đang xử lý " +msgstr "Đầu vào đang chờ " msgid "Blender File View" -msgstr "Màn Tập Tin Blender" +msgstr "Duyệt Tập Tin" msgid "Missing 'window' in context" -msgstr "Thiếu 'cửa sổ' trong bối cảnh" +msgstr "Thiếu 'cửa sổ' trong ngữ cảnh" msgid "Trusted Source [Untrusted Path]" -msgstr "Nguồn Tin Tưởng [Đường Dẫn Không Tin]" +msgstr "Nguồn Tin Cậy được [Đường Dẫn Không Tin Cậy được]" msgid "Allow Execution" -msgstr "Cho Thức Hành" +msgstr "Cho Phép Thi Hành" + + +msgid "Save As..." +msgstr "Lưu Thành..." msgid "Don't Save" @@ -117084,135 +131732,187 @@ msgstr "Không Lưu" msgid "unable to open the file" -msgstr "không thể mở tập tin" +msgstr "không thể mở được tập tin" msgid "File Not Found" -msgstr "Không Tìm Được Tập Tin" +msgstr "Không Tìm Thấy Tập Tin" msgid "Modified" -msgstr "Đã Sửa Đổi" +msgstr "Đã bị Sửa Đổi" msgid "Save the current file in the desired location but do not make the saved file active" -msgstr "Lưu tập tin hiện tại trong vị trí ưa thích nhưng không làm tập tin được lưu sang hoạt động" +msgstr "Lưu tập tin hiện tại vào vị trí mong muốn song không đặt tập tin đã lưu lại là tập tin đang hoạt động" msgid "For security reasons, automatic execution of Python scripts in this file was disabled:" -msgstr "Vì lý do an ninh, đã tắt tự động thực hành văn thảo Python trong tập tin này:" +msgstr "Vì những nguyên nhân bảo an, sự thi hành tự động của các tập lệnh Python của tập tin này bị tắt đi:" msgid "This may lead to unexpected behavior" -msgstr "Này có thể làm hành vi bắt ngờ" +msgstr "Điều này có thể dẫn đến sự hành xử bất ngờ" msgid "Permanently allow execution of scripts" -msgstr "Vĩnh Cữu cho thực hành văn thảo" +msgstr "Luôn luôn cho phép các tập lệnh thi hành" msgid "Reload file with execution of Python scripts enabled" -msgstr "Nhập lại tập tin và bật thực hành văn thảo Python" +msgstr "Tái nạp tập tin với sự cho phép thi hành các tập lệnh Python được bật lên" msgid "Enable scripts" -msgstr "Bật văn thảo" +msgstr "Cho phép các tập lệnh" msgid "Continue using file without Python scripts" -msgstr "Sử dụng tập tin tiếp tục mà không có văn thảo Python" +msgstr "Tiếp tục sử dụng tập tin tuy không có các tập lệnh Python" + + +msgid "This file was saved by a newer version of Blender (%s)" +msgstr "Tập tin này vốn được lưu bằng phiên bản Blender mới hơn (%s)" + + +msgid "Saving it with this Blender (%s) may cause loss of data" +msgstr "Việc lưu nó bằng bản Blender này (%s) có thể gây ra tình trạng mất dữ liệu" + + +msgid "Overwrite file with an older Blender version?" +msgstr "Ghi đè tập tin bằng phiên bản Blender cũ hơn nhé?" msgid "Save changes before closing?" -msgstr "Lưu sự thay đổi trước đóng?" +msgstr "Có lưu các thay đổi trước khi đóng không?" msgid "Unable to create user config path" -msgstr "Không thể chế tạo đường dẫn cấu hình người dùng" +msgstr "Không thể kiến tạo đường dẫn theo cấu hình của người dùng" msgid "Startup file saved" -msgstr "Tập tin khởi động đã lưu rồi" +msgstr "Tập tin khởi động đã được lưu" msgid "Context window not set" -msgstr "Bối cảnh cửa sổ chưa đặt" +msgstr "Ngữ Cảnh cửa sổ chưa được sắp đặt" msgid "Unable to save an unsaved file with an empty or unset \"filepath\" property" -msgstr "Không thể lưu một tập tin chưa được lưu mà có một đặc tính \"filepath\" trống hay chưa đặt" +msgstr "Không thể lưu tập tin chưa lưu có thuộc tính \"đường dẫn tập tin\" bỏ trống hoặc chưa được đặt" + + +msgid "Unable to find an available incremented file name" +msgstr "Không tìm thấy tên tập tin tăng tiến có sẵn nào cả" msgid "Engine '%s' not available for scene '%s' (an add-on may need to be installed or enabled)" -msgstr "Không có động cơ '%s' cho cảnh '%s' (có lẽ cần lắp đặt độ kèm hay bật nó)" +msgstr "Không có động cơ/máy '%s' để dùng cho cảnh '%s' (có thể cần phải cài đặt hoặc cho bật một trình bổ sung nào đó)" + + +msgid "Library \"%s\" needs overrides resync" +msgstr "Thư viện “%s” cần phải tái đồng bộ các trường hợp vượt quyền" msgid "%d libraries and %d linked data-blocks are missing (including %d ObjectData and %d Proxies), please check the Info and Outliner editors for details" -msgstr "Thiếu %d thư viện và %d cục dữ liệu được liên kết (gồm %d DữLiệuVậtThể và %d ĐạiLý), xin kiểm tra trình biên soạn Thông Tin và Mục Lục cho xem chi tiết" +msgstr "không tìm thấy %d thư viện và %d khối dữ liệu liên kết (bao gồm %d Dữ Liệu Đối Tượng và %d Đại Diện), xin vui lòng kiểm tra trình biên soạn Thông Tin và Mục Lục để biết thêm chi tiết" msgid "%d libraries have overrides needing resync (auto resynced in %.0fm%.2fs), please check the Info editor for details" -msgstr "%d thư viện có đồ vượt quyền cần đồng bộ hóa (tự động đồng bộ hóa trong %.0fphút%.2fgiây), làm ơn kiểm tra trình biên soạn Thông Tin và Mục Lục cho chi tiết" +msgstr "%d thư viện có một số vượt quyền trong đó, cần phải tái đồng bộ (tự động tái đồng bộ trong %.0fm%.2fs), xin vui lòng kiểm tra trình biên soạn Thông Tin để biết thêm chi tiết" msgid "%d sequence strips were not read because they were in a channel larger than %d" -msgstr "%d đoạn trình tự không nhập được vì chúng nó ở trong một kênh lớn hơn %d" +msgstr "%d dải trình tự không được đọc, vì chúng ở trong một kênh lớn hơn %d" + + +msgid "Cannot read file \"%s\": %s" +msgstr "Không đọc được tập tin '%s': %s" + + +msgid "File format is not supported in file \"%s\"" +msgstr "Định dạng tập tin không hỗ trợ trong tập tin '%s'" + + +msgid "File path \"%s\" invalid" +msgstr "Đường dẫn tập tin '%s' không hợp lệ" + + +msgid "Unknown error loading \"%s\"" +msgstr "Lỗi không ngờ đã xảy ra trong khi nạp '%s'" + + +msgid "Application Template \"%s\" not found" +msgstr "Không tìm thấy Mẫu Ứng Dụng '%s'" + + +msgid "Could not read \"%s\"" +msgstr "Không đọc được “%s”" msgid "Cannot overwrite used library '%.240s'" -msgstr "Không thể ghi lại trên thư viện được dùng '%.240s'" +msgstr "Không thể viết đè lên thư viện đang sử dụng '%.240s'" + + +msgid "Cannot save blend file, path \"%s\" is not writable" +msgstr "Không thể lưu tập tin blend, đường dẫn '%s' không thể viết được" msgid "Saved \"%s\"" msgstr "Đã Lưu \"%s\"" +msgid "Can't read alternative start-up file: \"%s\"" +msgstr "Không đọc được tập tin khởi động thay thế: '%s'" + + msgid "Not a library" -msgstr "Không phải là thư viện" +msgstr "Không phải là một thư viện" msgid "Nothing indicated" -msgstr "Không chỉ định gì cả" +msgstr "Không thấy có gì biểu thị cả (sau khi thử tái định vị thư viện)" msgid "Can't append data-block '%s' of type '%s'" -msgstr "Không thể kèm cục dữ liệu '%s'loại '%s'" +msgstr "Không thể bổ sung khối dữ liệu '%s' thuộc loại '%s'" msgid "Can't link data-block '%s' of type '%s'" -msgstr "Không thể liên kết cục dữ liệu '%s' loại '%s'" +msgstr "Không thể kết nối khối dữ liệu '%s' thuộc loại '%s'" msgid "'%s': cannot use current file as library" -msgstr "'%s': không thể dùng tập tin hiện tại để làm thư viện" +msgstr "'%s': không thể sử dụng tập tin hiện tại để làm thư viện" msgid "'%s': nothing indicated" -msgstr "'%s': không chỉ định gì cả" +msgstr "'%s': không có gì biểu thị cả" msgid "'%s': not a library" -msgstr "'%s': không phải là thư viện" +msgstr "'%s': không phải là một thư viện" msgid "Scene '%s' is linked, instantiation of objects is disabled" -msgstr "Cảnh '%s' được liên kết, thực thể hóa vật thể đã bị tắt" +msgstr "Cảnh '%s' là cảnh được kết nối, vì thế khả năng khởi tạo đối tượng bị vô hiệu hóa (tắt đi)" msgid "'%s' is not a valid library filepath" -msgstr "Đường dẫn thư viện '%s' không hợp lệ" +msgstr "'%s' là đường dẫn tập tin thư viện không hợp lệ" msgid "Trying to reload library '%s' from invalid path '%s'" -msgstr "Đang thử nhập lại thư viện '%s' từ đường dẫn không hợp lệ '%s'" +msgstr "Đang thử đọc lại thư viện '%s' từ đường dẫn không hợp lệ '%s'" msgid "Trying to reload or relocate library '%s' to invalid path '%s'" -msgstr "TĐang thử nhập lại hay di chuyển thư viện '%s' đến đường vẫn không hợp lệ '%s'" +msgstr "Thử đọc lại hoặc thử tìm lại thư viện '%s' tới đường dẫn không hợp lệ '%s'" msgid "Cannot relocate library '%s' to current blend file '%s'" -msgstr "Không thể di chuyển thư viện '%s' đến tập tin .blend hiện tại '%s'" +msgstr "Không thể định vị thư viện '%s' cho tập tin blend hiện tại '%s'" msgid "Win" @@ -117220,7 +131920,7 @@ msgstr "CửaSổ" msgid "OS" -msgstr "HệĐiềuHành" +msgstr "Hệ Điều Hành" msgid "Bksp" @@ -117232,7 +131932,11 @@ msgstr "Esc" msgid "dbl-" -msgstr "dbl-" +msgstr "nháy kép-" + + +msgid "drag-" +msgstr "kéo rê-" msgid "ON" @@ -117248,76 +131952,76 @@ msgstr "Được Không?" msgid "unsupported format" -msgstr "định dạng không được hỗ trợ" +msgstr "định dạng chưa hỗ trợ" msgid "Toggle System Console" -msgstr "Bật/Tắt Diện Điều Khiển Của Hệ Thống" +msgstr "Bật/Tắt Bàn Giao Tiếp của Hệ Thống" msgctxt "Operator" msgid "Toggle System Console" -msgstr "Bật/Tắt Diện Điều Khiển Của Hệ Thống" +msgstr "Bật/Tắt Bàn Giao Tiếp của Hệ Thống" msgid "No operator in context" -msgstr "Không có thao tác trong bối cảnh" +msgstr "Không có Operator nào trong ngữ cảnh cả" msgid "Property cannot be both boolean and float" -msgstr "Đặc tính không thể làm bool và số thật một lượt" +msgstr "Tính chất không thể là cả hai: bool và số thực (float), cùng một lúc được" msgid "Pointer from path image_id is not an ID" -msgstr "Con chỉ từ đường dẫn image_id không phải là một ID" +msgstr "Con trỏ từ đường dẫn image_id không phải là một ID" msgid "Property must be an integer or a float" -msgstr "Đặc tính phải là số nguyên hay số thật" +msgstr "Tính chất phải là số nguyên (integer) hay số thực (float)" msgid "Property must be a none, distance, factor, percentage, angle, or pixel" -msgstr "Đặc tính phải là một cái rỗng, khoảng cách, hệ số, phần trăm, góc, hay điểm ảnh" +msgstr "Tính chất phải là không có (none), khoảng cách, hệ số, phần trăm, góc độ, hoặc điểm ảnh" msgid "Registering operator class: '%s', invalid bl_idname '%s', at position %d" -msgstr "Đang đăng ký lớp thao tác: '%s', bl_idname '%s' không hợp lệ, tại vị trí %d" +msgstr "Lớp thao tác (operator) đang đăng ký: '%s', bl_idname (tên chỉ danh trong Blender) không hợp lệ '%s', tại vị trí %d" msgid "Registering operator class: '%s', invalid bl_idname '%s', is too long, maximum length is %d" -msgstr "Đang đăng ký lớp thao tác: '%s', bl_idname '%s' không hợp lệ, quá dài, bề dài tối đa là %d " +msgstr "Lớp thao tác (operator) đang đăng ký: '%s', bl_idname (tên chỉ danh trong Blender) không hợp lệ '%s', quá dài, chiều dài tối đa là %d" msgid "Registering operator class: '%s', invalid bl_idname '%s', must contain 1 '.' character" -msgstr "Đang đăng ký lớp thao tác: '%s', bl_idname '%s' không hợp lệ, phải có một ký tự '.'" +msgstr "Lớp thao tác (operator) đang đăng ký: '%s', bl_idname (tên chỉ danh trong Blender) không hợp lệ '%s', phải có ít nhất một dấu chấm '.'" msgid "Cannot read %s '%s': %s" -msgstr "Không thể đọc được %s '%s': %s" +msgstr "Không đọc được %s '%s': %s" msgid "%s '%s' not found" -msgstr "%s '%s' không tìm được" +msgstr "không tìm thấy '%s '%s'" msgid "%s not found" -msgstr "%s không tìm được" +msgstr "Không tìm thấy %s" msgid "Operator '%s' does not have register enabled, incorrect invoke function" -msgstr "Thao tác '%s' chưa được bật đăng ký, hàm số thực hành sai rồi" +msgstr "Thao tác '%s' chưa cho bật đăng ký (register). Hàm kích hoạt (invoke) sai mất rồi" msgid "Operator '%s' does not have undo enabled, incorrect invoke function" -msgstr "Thao tác '%s' chưa được bật hủy bước, hàm số thực hành sai rồi" +msgstr "Thao tác '%s' chưa cho bật chức năng hoàn tác (undo), hàm kích hoạt (invoke) sai" msgid "Operator redo '%s' does not have register enabled, incorrect invoke function" -msgstr "Thao tác hủy bước '%s' chựa được bật đăng ký, hàm số thực hành sai rồi" +msgstr "Thao tác tái thực hiện (redo) '%s' chưa cho bật đăng ký (register), hàm kích hoạt (invoke) sai" msgid "Operator redo '%s': wrong context" -msgstr "Thao tác làm lại bước '%s': bối cảnh sai rồi" +msgstr "Thao tác tái thực hiện (redo) '%s': sai ngữ cảnh" msgid "Could not resolve path '%s'" @@ -117325,74 +132029,116 @@ msgstr "Không tìm được đường dẫn '%s'" msgid "Property from path '%s' is not a float" -msgstr "Đăc tính từ đường dẫn '%s' không phải là số thật" +msgstr "Tính chất từ đường dẫn '%s' không phải là một số thực (float)" msgid "Property from path '%s' has length %d instead of %d" -msgstr "Đăc tính từ đường dẫn '%s' có độ dài %d thay thế %d" +msgstr "Tính chất từ đường dẫn '%s' có độ dài %d thay vì %d" + + +msgid "%d × %s: %.4f ms, average: %.8f ms" +msgstr "%d × %s: %.4f mili giây, trung bình: %.8f mili giây" msgctxt "WindowManager" msgid "Limited Platform Support" -msgstr "Sự Hỗ Trợ Của Dòng Bị Hạn Chế" +msgstr "Sự Hỗ Trợ Nền Tảng (hệ điều hành) có Giới Hạn" msgctxt "WindowManager" msgid "Your graphics card or driver has limited support. It may work, but with issues." -msgstr "Mạch đồ họa hay điều vận chỉ hỗ trợ một phần. Có lẽ nó chạy nhưng có vấn đề" +msgstr "Sự hỗ trợ cho thẻ đồ họa hoặc trình điều vận của bạn có giới hạn (phần mềm không hoạt động tốt với nó). Nó có thể hoạt động, song sẽ có vấn đề." msgctxt "WindowManager" msgid "Newer graphics drivers may be available to improve Blender support." -msgstr "Có lẽ có điều vận mới hơn có thể hỗ trợ Blender tốt hơn" +msgstr "Có thể trình điều vận thẻ đồ họa mới hơn tồn tại và cải thiện tính năng hỗ trợ của Blender." msgctxt "WindowManager" msgid "Graphics card:" -msgstr "Mạch Đồ Họa:" +msgstr "Thẻ đồ họa:" msgctxt "WindowManager" msgid "Platform Unsupported" -msgstr "Không Hỗ Trợ Dòng" +msgstr "Không hỗ trợ nền tảng/hệ điều hành hiện có" + + +msgctxt "WindowManager" +msgid "Your graphics card or macOS version is not supported" +msgstr "Thẻ đồ họa hoặc phiên bản macOS của bạn không được hỗ trợ" + + +msgctxt "WindowManager" +msgid "Upgrading to the latest macOS version may improve Blender support" +msgstr "Nâng cấp lên phiên bản macOS mới nhất có thể cải thiện khả năng hỗ trợ Blender" msgctxt "WindowManager" msgid "Your graphics card or driver is not supported." -msgstr "Mạch đồ họa hay điều vận của bạn không được hỗ trợ" +msgstr "Không hỗ trợ thẻ đồ họa hoặc trình điều vận của bạn." msgctxt "WindowManager" msgid "The program will now close." -msgstr "Bây giờ chương trình sẽ đóng" +msgstr "Phần mềm bây giờ sẽ đóng lại/ngưng hoạt động." msgid "Failed to create a window without quad-buffer support, you may experience flickering" -msgstr "Chế tạo một cửa sổ tư đệm bị thất bại, bạn có thể thấy ảnh nhảy chấp" +msgstr "Không thể kiến tạo một cửa sổ không hỗ trợ bốn bộ đệm, bạn có thể thấy màn hình nhấp nháy" msgid "Failed to switch to Time Sequential mode when in fullscreen" -msgstr "Đổi sang chế độ Trình Tự Thời Gian bị thất bại khi dùng toàn màn" +msgstr "Đã thất bại trong việc chuyển sang chế độ Phân Cực khi còn trong chế độ toàn màn hình" msgid "Quad-buffer window successfully created" -msgstr "Thành công chế tạo cửa sổ có tư đệm" +msgstr "Kiến tạo cửa sổ bốn bộ đệm thành công" msgid "Quad-buffer not supported by the system" -msgstr "Hệ thống không hỗ trợ tư đệm" +msgstr "Hệ thống không hỗ trợ bốn bộ đệm" msgid "Failed to create a window compatible with the time sequential display method" -msgstr "Bị thất bại chế tạo một cửa sổ thích hợp với phương pháp hiển thị trình tự tự thời gian" +msgstr "Đã thất bại trong việc kiến tạo một cửa sổ tương thích với phương pháp chiếu phân cực" msgid "Stereo 3D Mode requires the window to be fullscreen" -msgstr "Chế Độ Nhị Kênh 3D yêu cầu cửa sổ toàn màn" +msgstr "Chế Độ Lập Thể 3D yêu cầu cửa sổ được mở trên toàn màn hình" + + +msgid "(Unsaved)" +msgstr "(Chưa lưu)" + + +msgid " (Recovered)" +msgstr " (Đã phục hồi)" + + +msgid "Python script uses OpenGL for drawing" +msgstr "Tập lệnh Python sử dụng OpenGL để vẽ" + + +msgid "One of the add-ons or scripts is using OpenGL and will not work correct on Metal" +msgstr "Một trong những tiện ích bổ sung hoặc tập lệnh hiện đang sử dụng OpenGL và sẽ không hoạt động bình thường trên Metal" + + +msgid "Please contact the developer of the add-on to migrate to use 'gpu' module" +msgstr "Xin vui lòng liên hệ với nhà phát triển tiện ích bổ sung để chuyển sang sử dụng mô-đun 'gpu'" + + +msgid "See system tab in preferences to switch to OpenGL backend" +msgstr "Xin xem thẻ hệ thống trong cài đặt sở thích để chuyển sang nền phụ trợ OpenGL" + + +msgid "One of the add-ons or scripts is using OpenGL and will not work correct on Metal. Please contact the developer of the add-on to migrate to use 'gpu' module" +msgstr "Một trong những tiện ích bổ sung hoặc tập lệnh hiện đang sử dụng OpenGL và sẽ không hoạt động chính xác trên Metal. Xin vui lòng liên hệ với nhà phát triển tiện ích bổ sung để chuyển sang sử dụng mô-đun 'gpu' nhé" msgid "Failed to create window" -msgstr "Mở cửa sổ bị thất bại" +msgstr "Đã thất bại trong việc kiến tạo cửa sổ" msgid "1 inch" @@ -117448,15 +132194,15 @@ msgstr "Tương Tự 65mm" msgid "Analog IMAX" -msgstr "Analog IMAX" +msgstr "Tương Tự IMAX" msgid "Analog Super 16" -msgstr "Analog Siêu 16" +msgstr "Tương Tự Siêu 16" msgid "Analog Super 35" -msgstr "Analog Siêu 35" +msgstr "Tương Tự Siêu 35" msgid "Arri Alexa 65" @@ -117496,7 +132242,7 @@ msgstr "Toàn Khung" msgid "MFT" -msgstr "MFT" +msgstr "Hệ Thống Micro 4/3: Micro Four Thirds" msgid "Medium-format (Hasselblad)" @@ -117520,31 +132266,31 @@ msgstr "RED Monstro 8K" msgid "Cotton" -msgstr "Bông Gọn" +msgstr "Vải Bông" msgid "Denim" -msgstr "Vải Bông Chéo" +msgstr "Vải Jean" msgid "Leather" -msgstr "Dây Da" +msgstr "Da Thuộc" msgid "Silk" -msgstr "Tơ Lụa" +msgstr "Lụa" msgid "Fast Global Illumination" -msgstr "Sự Rọi Sáng Toàn Cầu Nhanh" +msgstr "Chiếu Sáng Toàn Cầu Nhanh" msgid "Full Global Illumination" -msgstr "Sự Rọi Sáng Toàn Cầu Toàn Bộ" +msgstr "Chiếu Sáng Toàn Cầu Toàn Phần" msgid "Limited Global Illumination" -msgstr "Sự Rọi Sáng Toàn Cầu Bị Hạn Chế" +msgstr "Chiếu Sáng Toàn Cầu Hạn Chế" msgid "Faster Render" @@ -117552,11 +132298,11 @@ msgstr "Kết Xuất Nhanh Hơn" msgid "Lower Memory" -msgstr "Giảm Bớt Bộ Nhớ" +msgstr "Bộ Nhớ Ít Hơn" msgid "DVD (note: this changes render resolution)" -msgstr "DVD (lưu ý: cái này sẽ đổi độ phân giải)" +msgstr "DVD (lưu ý: tùy chọn này thay đổi độ phân giải kết xuất)" msgid "H264 in MP4" @@ -117568,7 +132314,7 @@ msgstr "H264 trong Matroska" msgid "H264 in Matroska for scrubbing" -msgstr "H264 trong Matroska cho kéo tới lùi" +msgstr "H264 trong Matroska để rà quét" msgid "Ogg Theora" @@ -117596,15 +132342,15 @@ msgstr "Nước" msgid "Fill Only" -msgstr "Chỉ Tô" +msgstr "Duy Vùng Tô Phủ Kín" msgid "Stroke Only" -msgstr "Chỉ Nét" +msgstr "Duy Nét Vẽ" msgid "Stroke and Fill" -msgstr "Nét & Tô" +msgstr "Nét Vẽ và Vùng Tô Kín" msgid "Blender 27x" @@ -117612,23 +132358,23 @@ msgstr "Blender 27x" msgid "Industry Compatible" -msgstr "Phụ Hợp Công Nghệ" +msgstr "Tương Thích Công Nghiệp" msgid "blender default" -msgstr "mặc định blender" +msgstr "blender mặc định" msgid "industry compatible data" -msgstr "dữ liệu phụ hợp công nghệ" +msgstr "dữ liệu tương thích công nghiệp" msgid "sl+open sim rigged" -msgstr "sl+mở môPhỏng cóCốt" +msgstr "sl+mở môphỏng đãgiàndựng" msgid "sl+open sim static" -msgstr "sl+mở sim tĩnh" +msgstr "sl+mở môphỏng tĩnh" msgid "4K DCI 2160p" @@ -117700,7 +132446,7 @@ msgstr "4:3 trong 16:9" msgid "Blurry Footage" -msgstr "Phim Mờ" +msgstr "Đoạn Phim Nhòe Mờ" msgid "Fast Motion" @@ -117708,19 +132454,323 @@ msgstr "Chuyển Động Nhanh" msgid "Far Plane" -msgstr "Mặt Phẳng Xa" +msgstr "Bình Diện Xa" msgid "Near Plane" -msgstr "Mặt Phẳng Gần" +msgstr "Bình Diện Gần" + + +msgctxt "WorkSpace" +msgid "2D Animation" +msgstr "Hoạt Họa 2D" + + +msgctxt "WorkSpace" +msgid "2D Full Canvas" +msgstr "Toàn Bộ Khung Vẽ 2D" + + +msgctxt "WorkSpace" +msgid "Animation" +msgstr "Hoạt Họa" + + +msgctxt "WorkSpace" +msgid "Compositing" +msgstr "Tổng Hợp" + + +msgctxt "WorkSpace" +msgid "Geometry Nodes" +msgstr "Các Nút Hình Học" + + +msgctxt "WorkSpace" +msgid "Layout" +msgstr "Bố Trí" + + +msgctxt "WorkSpace" +msgid "Masking" +msgstr "Chắn Lọc" + + +msgctxt "WorkSpace" +msgid "Modeling" +msgstr "Mô Hình Hóa" + + +msgctxt "WorkSpace" +msgid "Motion Tracking" +msgstr "Giám Sát Chuyển Động" + + +msgctxt "WorkSpace" +msgid "Rendering" +msgstr "Kết xuất" + + +msgctxt "WorkSpace" +msgid "Scripting" +msgstr "Viết Tập Lệnh" + + +msgctxt "WorkSpace" +msgid "Sculpting" +msgstr "Điêu Khắc" + + +msgctxt "WorkSpace" +msgid "Shading" +msgstr "Tô Bóng" + + +msgctxt "WorkSpace" +msgid "Texture Paint" +msgstr "Sơn Chất Liệu" + + +msgctxt "WorkSpace" +msgid "UV Editing" +msgstr "Biên Soạn UV" + + +msgctxt "WorkSpace" +msgid "Video Editing" +msgstr "Biên Soạn Video" + + +msgid "Math Vis (Console)" +msgstr "Diễn Họa Toán Học (Bàn Giao Tiếp)" + + +msgid "Properties: Scene > Math Vis Console and Python Console: Menu" +msgstr "Các tính chất: Cảnh > Bàn Giao Tiếp Diễn Họa Toán Học và Bàn Giao Tiếp Python: Trình Đơn" + + +msgid "Display console defined mathutils variables in the 3D view" +msgstr "Hiển thị các biến mathutils (công cụ toán học) do bàn giao tiếp xác định trong góc nhìn 3D" + + +msgid "VR Scene Inspection" +msgstr "Kiểm Tra Cảnh Thực Tế Ảo" + + +msgid "3D View > Sidebar > VR" +msgstr "Cổng Nhìn 3D > Thanh Bên > Thực Tế Ảo" + + +msgid "View the viewport with virtual reality glasses (head-mounted displays)" +msgstr "Quan sát cổng nhìn với kính thực tế ảo (các bộ hiển thị đeo ở đầu)" + + +msgid "This is an early, limited preview of in development VR support for Blender." +msgstr "Đây là bản xem trước trước, giới hạn, về hỗ trợ VR đang phát triển cho Blender." + + +msgid "Copy Global Transform" +msgstr "Sao Chép Biến Hóa Toàn Cầu" + + +msgid "N-panel in the 3D Viewport" +msgstr "Bảng-N trong Cổng Nhìn 3D" + + +msgid "Asset Browser -> Animations, and 3D Viewport -> Animation panel" +msgstr "Trình Duyệt Thảo Tài Sản -> Hoạt họa và Cổng Nhìn 3D -> bảng Hoạt Họa" + + +msgid "Pose Library based on the asset system." +msgstr "Thư Viện Tư Thế dựa trên hệ thống tài sản." + + +msgid "BioVision Motion Capture (BVH) format" +msgstr "Định dạng Nắm Bắt Chuyển Động (BVH) của BioVision" + + +msgid "File > Import-Export" +msgstr "`Tập Tin > Nhập-Xuất Khẩu" + + +msgid "Import-Export BVH from armature objects" +msgstr "Nhập-Xuất Khẩu BVH từ các đối tượng khung cốt" + + +msgid "Export Camera Animation" +msgstr "Xuất Khẩu Hoạt Họa của Máy Quay Phim" + + +msgid "File > Export > Cameras & Markers (.py)" +msgstr "Tập Tin > Xuất Khẩu > Máy Quay Phim & các Dấu Mốc (.py)" + + +msgid "Export Cameras & Markers (.py)" +msgstr "Xuất Khẩu Máy Quay Phim & các Dấu Mốc (.py)" + + +msgid "FBX format" +msgstr "Định dạng FBX" + + +msgid "FBX IO meshes, UVs, vertex colors, materials, textures, cameras, lamps and actions" +msgstr "Khung lưới, UV, màu điểm đỉnh, nguyên vật liệu, chất liệu, máy quay phim, đèn và hành động của FBX IO" + + +msgid "Import Images as Planes" +msgstr "Nhập Khẩu Hình Ảnh như Bình Diện" + + +msgid "File > Import > Images as Planes or Add > Image > Images as Planes" +msgstr "Tập tin > Nhập Khẩu > Hình Ảnh như Bình Diện hoặc Thêm > Hình ảnh > Hình Ảnh như Bình Diện" + + +msgid "Imports images and creates planes with the appropriate aspect ratio. The images are mapped to the planes." +msgstr "Nhập khẩu hình ảnh và kiến tạo các mặt phẳng với tỷ lệ tương quan tương thích. Các hình ảnh sẽ được ánh xạ vào các mặt phẳng." + + +msgid "NewTek MDD format" +msgstr "Định dạng MDD của NewTek" + + +msgid "Import-Export MDD as mesh shape keys" +msgstr "Nhập-Xuất khẩu MDD dưới dạng các khung lưới hình mẫu" + + +msgid "STL format" +msgstr "Định dạng STL" + + +msgid "Import-Export STL files" +msgstr "Nhập-Xuất khẩu các tập tin STL" + + +msgid "Scalable Vector Graphics (SVG) 1.1 format" +msgstr "Định Dạng Đồ Họa Véc Tơ Có Thể Mở Rộng (SVG) 1.1" + + +msgid "File > Import > Scalable Vector Graphics (.svg)" +msgstr "Tập Tin > Nhập Khẩu > Scalable Vector Graphics (.svg)" + + +msgid "Import SVG as curves" +msgstr "Nhập Khẩu SVG thành đường cong" + + +msgid "UV Layout" +msgstr "Bố Trí UV" + + +msgid "UV Editor > UV > Export UV Layout" +msgstr "Trình Biên Soạn UV > UV > Xuất Khẩu Bố Trí UV" + + +msgid "Export the UV layout as a 2D graphic" +msgstr "Xuất Khẩu Bố Trí UV thành đồ họa 2D" + + +msgid "glTF 2.0 format" +msgstr "định dạng glTF 2.0" + + +msgid "Import-Export as glTF 2.0" +msgstr "Xuất-Nhập khẩu dưới dạng glTF 2.0" + + +msgid "3D-Print Toolbox" +msgstr "Hộp Công Cụ In Ấn 3D" + + +msgid "3D View > Sidebar" +msgstr "Góc Nhìn 3D > Thanh Bên" + + +msgid "Utilities for 3D printing" +msgstr "Các tiện ích cho in ấn 3D" + + +msgid "Scatter Objects" +msgstr "Phân Tán Đối Tượng Rải Rác" + + +msgid "Distribute object instances on another object." +msgstr "Phân bổ các thực thể đối tượng trên một đối tượng khác." + + +msgid "Cycles Render Engine" +msgstr "Máy Kết Xuất Cycles" + + +msgid "Cycles renderer integration" +msgstr "Tích hợp máy kết xuất Cycles" + + +msgid "Freestyle SVG Exporter" +msgstr "Trình Xuất Khẩu Phong Cách Tự Do ra Định Dạng SVG" + + +msgid "Properties > Render > Freestyle SVG Export" +msgstr "Tính Chất > Kết Xuất > Xuất Khẩu Phong Cách Tự Do ra Định Dạng SVG" + + +msgid "Exports Freestyle's stylized edges in SVG format" +msgstr "Xuất Khẩu các cạnh Phong Cách Tự Do ra định dạng SVG" + + +msgid "Hydra Storm render engine" +msgstr "Động cơ kết xuất Hydra Storm" + + +msgid "USD's high performance rasterizing renderer" +msgstr "Trình kết xuất điểm ảnh hóa hiệu suất cao của USD" + + +msgid "Blender ID authentication" +msgstr "Xác Thực Danh Tính Blender" + + +msgid "Add-on preferences" +msgstr "Cài đặt sở thích trình bổ sung" + + +msgid "Stores your Blender ID credentials for usage with other add-ons" +msgstr "Lưu trữ thông tin đăng nhập Blender ID của bạn để sử dụng với các trình bổ sung khác" + + +msgid "Demo Mode" +msgstr "Chế Độ Trình Diễn Giới Thiệu" + + +msgid "File > Demo Menu" +msgstr "Tập Tin > Trình Đơn Trình Diễn Giới Thiệu" + + +msgid "Demo mode lets you select multiple blend files and loop over them." +msgstr "Chế độ trình diễn giới thiệu cho phép bạn chọn nhiều tập tin blend và nhắc đi nhắc lại chúng một cách tuần hoàn." + + +msgid "Manage UI translations" +msgstr "Quản Lý các Bản Phiên Dịch Giao Diện Người Dùng" + + +msgid "Main \"File\" menu, text editor, any UI control" +msgstr "Trình đơn \"Tập Tin\" chính, trình biên soạn văn bản, bất cứ điều khiển giao diện người dùng nào" + + +msgid "Allows managing UI translations directly from Blender (update main .po files, update scripts' translations, etc.)" +msgstr "Cho phép quản lý bản dịch giao diện người dùng trực tiếp từ Blender (cập nhật các tập tin .po chính, cập nhật các bản dịch của các tập lệnh, v.v.)" + + +msgid "Still in development, not all features are fully implemented yet!" +msgstr "Vẫn đang trong quá trình phát triển, không phải toàn bộ các tính năng đều được thực hiện đầy đủ!" msgid "All Add-ons" -msgstr "Hết Đồ Kèm" +msgstr "Toàn Bộ các Trình Bổ Sung" msgid "All Add-ons Installed by User" -msgstr "Hết Đồ Kèm Người Dùng được Lắp Đặt" +msgstr "Toàn Bộ các Trình Bổ Sung do người dùng cài đặt" msgid "Add Curve" @@ -117728,19 +132778,23 @@ msgstr "Thêm Đường Cong" msgid "Add Mesh" -msgstr "Thêm Mạng Lưới" +msgstr "Thêm Khung Lưới" + + +msgid "Baking" +msgstr "Nướng" msgid "Import-Export" -msgstr "Nhập-Xuất" +msgstr "Nhập-Xuất Khẩu" msgid "Rigging" -msgstr "Giàn" +msgstr "Dàn Dựng" msgid "Video Tools" -msgstr "Dụng Cụ Video" +msgstr "Công Cụ về Phim Video" msgid "English (English)" @@ -117751,6 +132805,10 @@ msgid "Japanese (日本語)" msgstr "Tiếng Nhật (日本語)" +msgid "Dutch (Nederlands)" +msgstr "Tiếng Hà Lan (Nederlands)" + + msgid "Italian (Italiano)" msgstr "Tiếng Ý (Italiano)" @@ -117764,7 +132822,7 @@ msgstr "Tiếng Phần Lan (Suomi)" msgid "Swedish (Svenska)" -msgstr "Tiếng Thủy Điện (Svenska)" +msgstr "Tiếng Thụy Điển (Svenska)" msgid "French (Français)" @@ -117776,7 +132834,7 @@ msgstr "Tiếng Tây Ban Nha (Español)" msgid "Catalan (Català)" -msgstr "Tiếng Catala (Català)" +msgstr "Tiếng Catalunya (Català)" msgid "Portuguese (Português)" @@ -117784,11 +132842,11 @@ msgstr "Tiếng Bồ Đào Nha (Português)" msgid "Simplified Chinese (简体中文)" -msgstr "Tiếng Hoa (简体中文)" +msgstr "Tiếng Trung Giản Thể (简体中文)" msgid "Traditional Chinese (繁體中文)" -msgstr "Tiếng Hoa (繁體中文)" +msgstr "Tiếng Trung Phồn Thể (繁體中文)" msgid "Russian (Русский)" @@ -117803,6 +132861,10 @@ msgid "Serbian (Српски)" msgstr "Tiếng Serbia (Српски)" +msgid "Ukrainian (Українська)" +msgstr "Tiếng Ukraina (Українська)" + + msgid "Polish (Polski)" msgstr "Tiếng Ba Lan (Polski)" @@ -117824,15 +132886,15 @@ msgstr "Tiếng Hy Lạp (Ελληνικά)" msgid "Korean (한국어)" -msgstr "Tiếng Hàn (한국어)" +msgstr "Tiếng Hàn Quốc (한국어)" msgid "Nepali (नेपाली)" -msgstr "Tiếng Nepali (नेपाली)" +msgstr "Tiếng Nepal (नेपाली)" msgid "Persian (ﯽﺳﺭﺎﻓ)" -msgstr "Tiếng Iran (ﯽﺳﺭﺎﻓ)" +msgstr "Tiếng Ba Tư (ﯽﺳﺭﺎﻓ)" msgid "Indonesian (Bahasa indonesia)" @@ -117856,15 +132918,19 @@ msgstr "Tiếng Hungary (Magyar)" msgid "Brazilian Portuguese (Português do Brasil)" -msgstr "Tiếng Bồ Đàu Nha Braxin (Português do Brasil)" +msgstr "Tiếng Bồ Đào Nha Brasil (Português do Brasil)" msgid "Hebrew (תירִבְעִ)" -msgstr "Tiếng Do Thái (תירִבְעִ)" +msgstr "Tiếng Hê-Bơ-Rơ (תירִבְעִ)" + + +msgid "Estonian (Eesti keel)" +msgstr "Tiếng Estonia (Eesti keel)" msgid "Esperanto (Esperanto)" -msgstr "Tiếng Quốc Tế Ngữ (Esperanto)" +msgstr "Quốc Tế Ngữ (Esperanto)" msgid "Amharic (አማርኛ)" @@ -117879,24 +132945,32 @@ msgid "Uzbek Cyrillic (Ўзбек)" msgstr "Tiếng Uzbek (Ўзбек)" +msgid "Hindi (हिन्दी)" +msgstr "Tiếng Hindi (हिन्दी)" + + +msgid "Vietnamese (Tiếng Việt)" +msgstr "Tiếng Việt" + + msgid "Basque (Euskara)" msgstr "Tiếng Euskara (Euskara)" msgid "Hausa (Hausa)" -msgstr "Tiếng Hausa" +msgstr "Tiếng Hausa (Hausa)" msgid "Abkhaz (Аԥсуа бызшәа)" -msgstr "Tiếng Abkhaz (Аԥсуа бызшәа)" +msgstr "Tiếng Áp-kha (Аԥсуа бызшәа)" msgid "Thai (ภาษาไทย)" -msgstr "Tiếng Thái (ภาษาไทย)" +msgstr "Tiếng Thái Lan (ภาษาไทย)" msgid "Slovak (Slovenčina)" -msgstr "Tiếng Slovakia (Slovenčina)" +msgstr "Tiếng Xlô-vak (Slovenčina)" msgid "Georgian (ქართული)" @@ -117908,9 +132982,213 @@ msgstr "Hoàn Thành" msgid "In Progress" -msgstr "Đang Tiến Triển" +msgstr "Đang Xúc Tiến" msgid "Starting" -msgstr "Đang Bắt Đầu" +msgstr "Đang Khởi Đầu" + + +msgid "Generation" +msgstr "Sinh Tạo" + + +msgid "Utility" +msgstr "Tiện Ích" + + +msgid "Attach Hair Curves to Surface" +msgstr "Đính Đường Cong Tóc Lên Bề Mặt" + + +msgid "Attaches hair curves to a surface mesh" +msgstr "Đính đường cong tóc lên một bề mặt" + + +msgid "Blend Hair Curves" +msgstr "Đường Cong Tóc Blender" + + +msgid "Blends shape between multiple hair curves in a certain radius" +msgstr "Pha trộn hình dạng giữa nhiều đường cong tóc trong một bán kính nhất định" + + +msgid "Braid Hair Curves" +msgstr "Đường Cong Tết Tóc" + + +msgid "Deforms existing hair curves into braids using guide curves" +msgstr "Biến dạng các đường cong tóc hiện có thành các bím tóc bằng các đường cong hướng dẫn" + + +msgid "Clump Hair Curves" +msgstr "Khóm các Đường Cong Tóc Lại" + + +msgid "Clumps together existing hair curves using guide curves" +msgstr "Khóm các đường cong tóc hiện có với nhau lại bằng các đường cong hướng dẫn" + + +msgid "Create Guide Index Map" +msgstr "Tạo Ánh Xạ Chỉ Số Hướng Dẫn" + + +msgid "Creates an attribute that maps each curve to its nearest guide via index" +msgstr "Tạo một thuộc tính ánh xạ từng đường cong tới hướng dẫn gần nhất của nó thông qua chỉ số" + + +msgid "Curl Hair Curves" +msgstr "Đường Cong Tóc Xoăn Lọn" + + +msgid "Deforms existing hair curves into curls using guide curves" +msgstr "Biến dạng các đường cong tóc hiện có thành các lọn tóc bằng các đường cong hướng dẫn" + + +msgid "Curve Info" +msgstr "Thông Tin Đường Cong" + + +msgid "Reads information about each curve" +msgstr "Đọc thông tin về từng đường cong một" + + +msgid "Curve Root" +msgstr "Gốc Đường Cong" + + +msgid "Reads information about each curve's root point" +msgstr "Đọc thông tin về điểm gốc của mỗi đường cong" + + +msgid "Curve Segment" +msgstr "Phân Đoạn Đường Cong" + + +msgid "Reads information each point's previous curve segment" +msgstr "Đọc thông tin phân đoạn đường cong trước của mỗi điểm" + + +msgid "Curve Tip" +msgstr "Đỉnh Đường Cong" + + +msgid "Reads information about each curve's tip point" +msgstr "Đọc thông tin về điểm ngọn của mỗi đường cong" + + +msgid "Displace Hair Curves" +msgstr "Dịch chuyển các đường cong tóc" + + +msgid "Displaces hair curves by a vector based on various options" +msgstr "Dịch chuyển các đường cong tóc bằng một véctơ dựa trên các tùy chọn khác nhau" + + +msgid "Duplicate Hair Curves" +msgstr "Nhân Đôi Đường Cong Tóc" + + +msgid "Duplicates hair curves a certain number of times within a radius" +msgstr "Nhân đôi đường cong tóc một số lần nhất định nội trong bán kính" + + +msgid "Deforms hair curves using a random vector per point to frizz them" +msgstr "Làm biến dạng các đường cong tóc bằng cách sử dụng một véctơ ngẫu nhiên trên mỗi điểm để làm xù chúng lên" + + +msgid "Generate Hair Curves" +msgstr "Sinh Tạo Đường Cong Tóc" + + +msgid "Generates new hair curves on a surface mesh" +msgstr "Sinh tạo các đường cong tóc mới trên khung lưới bề mặt" + + +msgid "Hair Attachment Info" +msgstr "Thông Tin Đính Tóc" + + +msgid "Reads attachment information regarding a surface mesh" +msgstr "Đọc thông tin đính kèm liên quan đến khung lưới bề mặt" + + +msgid "Deforms hair curves using a noise texture" +msgstr "Làm biến dạng các đường cong tóc bằng cách sử dụng chất liệu nhiễu" + + +msgid "Interpolates existing guide curves on a surface mesh" +msgstr "Nội suy các đường cong hướng dẫn hiện có trên khung lưới bề mặt" + + +msgid "Redistribute Curve Points" +msgstr "Phân Phối Lại các Điểm Đường Cong" + + +msgid "Redistributes existing control points evenly along each curve" +msgstr "Phân phối lại các điểm kiểm soát hiện có dọc theo mỗi đường cong" + + +msgid "Restore Curve Segment Length" +msgstr "Khôi Phục Độ Dài Phân Đoạn Đường Cong" + + +msgid "Restores the length of each curve segment using a previous state after deformation" +msgstr "Khôi phục độ dài của từng phân đoạn đường cong sử dụng trạng thái trước sau khi biến dạng" + + +msgid "Roll Hair Curves" +msgstr "Cuộn các Đường Cong Tóc" + + +msgid "Rolls up hair curves starting from their tips" +msgstr "Cuộn các đường cong tóc lên bắt đầu từ đỉnh của chúng" + + +msgid "Rotate Hair Curves" +msgstr "Xoay Chiều Đường Cong Tóc" + + +msgid "Rotates each hair curve around an axis" +msgstr "Xoay chiều từng đường cong tóc quanh một trục" + + +msgid "Sets the radius attribute of hair curves according to a profile shape" +msgstr "Đặt thuộc tính bán kính của đường cong tóc theo hình dạng mặt cắt" + + +msgid "Shrinkwrap Hair Curves" +msgstr "Co-Bọc Đường Cong Tóc" + + +msgid "Shrinkwraps hair curves to a mesh surface from below and optionally from above" +msgstr "Co-Bọc các đường cong tóc thành bề mặt khung lưới từ bên dưới và từ bên trên nếu muốn" + + +msgid "Smooth Hair Curves" +msgstr "Làm Mịn Đường Cong" + + +msgid "Smoothes the shape of hair curves" +msgstr "Làm mịn hình dạng đường cong của tóc" + + +msgid "Straighten Hair Curves" +msgstr "Nắn Thẳng Đường Cong Tóc" + + +msgid "Straightens hair curves between root and tip" +msgstr "Duỗi thẳng các đường cong của tóc từ gốc đến ngọn" + + +msgid "Trim Hair Curves" +msgstr "Cắt Xén Đường Cong Tóc" + + +msgid "Trims or scales hair curves to a certain length" +msgstr "Cắt xén hoặc đổi tỷ lệ các đường cong tóc theo một độ dài nhất định" + + +msgid "Smooth by Angle" +msgstr "Làm Mịn theo Góc" diff --git a/locale/po/zh_HANS.po b/locale/po/zh_HANS.po index 7a0e607fa05..c0e967fc676 100644 --- a/locale/po/zh_HANS.po +++ b/locale/po/zh_HANS.po @@ -1,11 +1,11 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" -"PO-Revision-Date: 2023-11-30 09:34+0000\n" -"Last-Translator: Ye Gui \n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" +"PO-Revision-Date: 2023-12-11 10:34+0000\n" +"Last-Translator: Huanghai \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_HANS\n" "MIME-Version: 1.0\n" @@ -18,7 +18,7 @@ msgstr "" msgid "Shader AOV" -msgstr "着色AOV" +msgstr "着色器 AOV" msgid "Valid" @@ -50,7 +50,7 @@ msgstr "颜色" msgid "Value" -msgstr "值(明度)" +msgstr "值" msgid "List of AOVs" @@ -345,14 +345,34 @@ msgid "Optimize all kernels. Fastest rendering, may result in extra background C msgstr "优化所有内核。渲染速度最快,可能会导致额外的后台 CPU占用" +msgid "MetalRT" +msgstr "MetalRT" + + +msgid "MetalRT for ray tracing uses less memory for scenes which use curves extensively, and can give better performance in specific cases" +msgstr "用于光线追踪的 MetalRT 在大量使用曲线的场景中使用较少的内存,并且可以在特定情况下提供更好的性能" + + +msgid "Disable MetalRT (uses BVH2 layout for intersection queries)" +msgstr "禁用 MetalRT(使用 BVH2 布局进行相交查询)" + + msgid "On" msgstr "开启" +msgid "Enable MetalRT for intersection queries" +msgstr "为相交查询启用 MetalRT" + + msgid "Auto" msgstr "自动" +msgid "Automatically pick the fastest intersection method" +msgstr "自动选择最快的相交方法" + + msgid "Distribute memory across devices" msgstr "跨设备分配内存" @@ -362,15 +382,19 @@ msgstr "通过在互连的设备(例如通过 NVLink)之间分配内存,而不 msgid "HIP RT (Experimental)" -msgstr "MetalRT (试验特性)" +msgstr "HIP光追 (试验性)" msgid "HIP RT enables AMD hardware ray tracing on RDNA2 and above, with shader fallback on older cards. This feature is experimental and some scenes may render incorrectly" -msgstr "可在具有 RDNA2 及以上版本的显卡上启用 AMD 硬件光线追踪功能,并可在旧显卡上使用着色器回退功能。此功能为试验性功能,某些场景可能会出现渲染不正确的情况" +msgstr "HIP光追可在 RDNA2 及以上版本的显卡上启用 AMD 硬件光线追踪功能,并可在旧显卡上使用着色器回退功能。此功能为试验性功能,某些场景可能会出现渲染不正确的情况" + + +msgid "Embree on GPU" +msgstr "GPU上启用Embree光追" msgid "Embree on GPU enables the use of hardware ray tracing on Intel GPUs, providing better overall performance" -msgstr "Embree on GPU 可在英特尔图形处理器上使用硬件光线追踪技术,从而提供更好的整体性能" +msgstr "'GPU上启用Embree光追'可在Intel的GPU上使用硬件进行光线追踪,从而提供更好的整体性能" msgid "KHR_materials_variants_ui" @@ -393,6 +417,10 @@ msgid "Fribidi Library" msgstr "Fribidi 库文件" +msgid "The FriBidi C compiled library (.so under Linux, .dll under windows...), you’ll likely have to edit it if you’re under Windows, e.g. using the one included in Blender libraries repository" +msgstr "FriBidi C 语言编译库 (Linux 系统下为 .so, Windows 系统下为 .dll ...), 若在 Windows 系统下则可能需要编辑此库,例如当使用包含在Blender存储库中的库文件时" + + msgid "Translation Root" msgstr "翻译根目录" @@ -558,7 +586,7 @@ msgstr "调整模式动作存储" msgid "Slot to temporarily hold the main action while in tweak mode" -msgstr "用于在调整模式下暂时保留主要动作的槽位" +msgstr "用于在调整模式下暂时保留主要操作的插槽" msgid "Drivers" @@ -1154,18 +1182,38 @@ msgstr "资产的自定义标签(名称令牌),用于筛选和通用资产管 msgid "Asset Representation" -msgstr "资产代理" +msgstr "代理资产" msgid "Information about an entity that makes it possible for the asset system to deal with the entity as asset" msgstr "关于实体的信息,使资产系统能够将该实体作为资产处理" +msgid "Full Library Path" +msgstr "完整的库路径" + + +msgid "Absolute path to the .blend file containing this asset" +msgstr "包含该资源的 .blend 文件的绝对路径" + + +msgid "Full Path" +msgstr "完整路径" + + +msgid "Absolute path to the .blend file containing this asset extended with the path of the asset inside the file" +msgstr "包含此资产的 .blend 文件的绝对路径,使用文件内资产的路径进行扩展" + + msgctxt "ID" msgid "Data-block Type" msgstr "数据块类型" +msgid "The type of the data-block, if the asset represents one ('NONE' otherwise)" +msgstr "数据块的类型,如果资产代表一个(否则为“NONE”)" + + msgctxt "ID" msgid "Action" msgstr "动作" @@ -1216,6 +1264,11 @@ msgid "Grease Pencil" msgstr "蜡笔" +msgctxt "ID" +msgid "Grease Pencil v3" +msgstr "蜡笔V3版" + + msgctxt "ID" msgid "Image" msgstr "图像" @@ -1311,6 +1364,11 @@ msgid "Scene" msgstr "场景" +msgctxt "ID" +msgid "Screen" +msgstr "屏幕" + + msgctxt "ID" msgid "Sound" msgstr "声音" @@ -1359,26 +1417,50 @@ msgid "Asset Metadata" msgstr "资产元数据" +msgid "Additional information about the asset" +msgstr "有关资产的附加信息" + + msgid "Asset Shelf" -msgstr "资产工具箱" +msgstr "资产架" msgid "Regions for quick access to assets" -msgstr "快速访问资产区域" +msgstr "用于快速访问资产的区域" msgid "Asset Library" msgstr "资产库" +msgid "Choose the asset library to display assets from" +msgstr "添加要显示的资产库" + + msgid "All" msgstr "全部" +msgid "Show assets from all of the listed asset libraries" +msgstr "显示资产库中的所有资产" + + msgid "Current File" msgstr "当前文件" +msgid "Show the assets currently available in this Blender session" +msgstr "显示此 Blender 会话中当前可用的资产" + + +msgid "Essentials" +msgstr "基本的" + + +msgid "Show the basic building blocks and utilities coming with Blender" +msgstr "显示 Blender 附带的基本构建和实用程序" + + msgid "Custom" msgstr "自定义" @@ -1400,11 +1482,11 @@ msgstr "资产架类型选项" msgid "No Asset Dragging" -msgstr "无拖动的资产" +msgstr "禁用资产拖放" msgid "Disable the default asset dragging on drag events. Useful for implementing custom dragging via custom key-map items" -msgstr "在拖动事件中禁用默认的资产拖动。有助于通过自定义快捷键实现自定义拖动" +msgstr "在拖动中禁用默认的资产拖动。有助于通过自定义快捷键实现自定义拖动" msgid "Space Type" @@ -1420,7 +1502,7 @@ msgstr "预览大小" msgid "Size of the asset preview thumbnails in pixels" -msgstr "资产预览缩略图的像素大小" +msgstr "资产预览缩略图尺寸(像素)" msgid "Display Filter" @@ -1436,7 +1518,7 @@ msgstr "显示名称" msgid "Show the asset name together with the preview. Otherwise only the preview will be visible" -msgstr "在预览中显示资产名称,否则只显示预览" +msgstr "同时显示资产名称和预览,否则只显示预览" msgid "Asset Tag" @@ -1459,6 +1541,14 @@ msgid "Collection of custom asset tags" msgstr "自定义资产标签的集合" +msgid "Asset Weak Reference" +msgstr "资产弱参考" + + +msgid "Weak reference to some asset" +msgstr "一些资产的弱参考" + + msgid "Geometry attribute" msgstr "几何属性" @@ -1540,11 +1630,11 @@ msgstr "更小的整型,取值范围为 -128 到 127" msgid "2D Integer Vector" -msgstr "二维整数矢量" +msgstr "二维整数向量" msgid "32-bit signed integer vector" -msgstr "32位有符号整数矢量" +msgstr "32-bit有符号整数向量" msgid "Quaternion" @@ -1615,6 +1705,10 @@ msgid "Layer" msgstr "层" +msgid "Attribute on Grease Pencil layer" +msgstr "蜡笔图层的属性" + + msgid "Is Internal" msgstr "是内部" @@ -1623,6 +1717,14 @@ msgid "The attribute is meant for internal use by Blender" msgstr "该属性供Blender内部使用" +msgid "Is Required" +msgstr "是必须的" + + +msgid "Whether the attribute can be removed or renamed" +msgstr "属性是否可以删除或重命名" + + msgid "Name of the Attribute" msgstr "属性名称" @@ -1688,7 +1790,7 @@ msgstr "二维整型矢量属性" msgid "Geometry attribute that stores 2D integer vectors" -msgstr "存储二维整型矢量的几何属性" +msgstr "存储2D整数矢量的几何属性" msgid "Integer Attribute" @@ -2291,6 +2393,14 @@ msgid "Grease Pencil data-blocks" msgstr "蜡笔数据块" +msgid "Grease Pencil v3" +msgstr "蜡笔 V3" + + +msgid "Grease Pencil v3 data-blocks" +msgstr "蜡笔v3数据块" + + msgid "Hair Curves" msgstr "毛发曲线" @@ -2524,7 +2634,7 @@ msgstr ".blend 文件保存的文件格式版本" msgid "Volumes" -msgstr "体积(卷标)" +msgstr "体积" msgid "Volume data-blocks" @@ -3012,7 +3122,7 @@ msgstr "避免与其他物体的碰撞" msgid "Deflectors" -msgstr "偏转" +msgstr "导流板" msgid "Avoid collision with deflector objects" @@ -3477,14 +3587,30 @@ msgid "Multiply B-Bone Scale In channels by the local scale values of the start msgstr "将柔性骨骼首端缩放通道乘以起始控制柄的局部缩放值。这是在缩放缓动选项后执行的,且不受其影响" +msgid "B-Bone Vertex Mapping Mode" +msgstr "柔性骨骼顶点映射模式" + + +msgid "Selects how the vertices are mapped to B-Bone segments based on their position" +msgstr "选择如何根据顶点的位置将顶点映射到柔性骨骼段" + + msgid "Straight" msgstr "直通型" +msgid "Fast mapping that is good for most situations, but ignores the rest pose curvature of the B-Bone" +msgstr "快速映射适用于大多数情况,但是忽略了柔性骨骼的静止姿态的曲率" + + msgid "Curved" msgstr "曲线化" +msgid "Slower mapping that gives better deformation for B-Bones that are sharply curved in rest pose" +msgstr "在静置姿态下的柔性骨骼有尖锐的弯曲,则较慢的映射可以获得更好的变形效果" + + msgid "Roll In" msgstr "滚入" @@ -3797,12 +3923,36 @@ msgid "Bones" msgstr "骨骼" +msgid "Bones assigned to this bone collection. In armature edit mode this will always return an empty list of bones, as the bone collection memberships are only synchronized when exiting edit mode" +msgstr "骨骼被分配到此骨骼集合,在骨架编辑模式下此将永远返回一个空的骨骼列表,因为骨骼集合成员资格仅在退出编辑模式时同步" + + +msgid "Is Editable" +msgstr "可编辑的" + + +msgid "This collection is owned by a local Armature, or was added via a library override in the current blend file" +msgstr "此集合已由一个本地骨架拥有,或者经由当前blend文件的库重写添加" + + +msgid "Is Local Override" +msgstr "已本地覆盖" + + +msgid "This collection was added via a library override in the current blend file" +msgstr "此集合经由此Blend文件库重写添加" + + msgid "Visible" msgstr "可见" msgid "Bones in this collection will be visible in pose/object mode" -msgstr "此集合中的骨骼将在姿势/物体模式下可见" +msgstr "该集合中的骨骼将只在姿势/物体模式下可见" + + +msgid "Unique within the Armature" +msgstr "骨架内唯一" msgid "Bone Collection Memberships" @@ -3825,20 +3975,44 @@ msgid "Active Collection" msgstr "活动集合" +msgid "Armature's active bone collection" +msgstr "骨架的活动骨骼集合" + + msgid "Active Collection Index" -msgstr "活动集合的索引值" +msgstr "活动集合索引" msgid "The index of the Armature's active bone collection; -1 when there is no active collection" -msgstr "骨架所在活动骨骼集合的索引值,当没有活动集合时为-1" +msgstr "骨架的活动骨骼集合的索引,当没有活动集合时为-1" + + +msgid "Active Collection Name" +msgstr "活动集合名称" + + +msgid "The name of the Armature's active bone collection; empty when there is no active collection" +msgstr "骨架的活动骨骼集合的名称; 当没有活动集合时为空" msgid "Theme color or custom color of a bone" -msgstr "骨骼的主题颜色或自定义颜色" +msgstr "骨骼的主题色或自定义颜色" msgid "The custom bone colors, used when palette is 'CUSTOM'" -msgstr "当启用调色板的 \"自定义\"后的自定义骨骼颜色" +msgstr "自定义骨骼颜色(如果调色板为 \"自定义\")" + + +msgid "Use Custom Color" +msgstr "使用自定义颜色" + + +msgid "A color palette is user-defined, instead of using a theme-defined one" +msgstr "用户定义的调色板,代替主题定义的调色板" + + +msgid "Color palette to use" +msgstr "使用的色板" msgid "Bool Attribute Value" @@ -4157,10 +4331,25 @@ msgid "Use always Vertex Color mode" msgstr "始终使用顶点色模式" +msgctxt "GPencil" +msgid "Caps Type" +msgstr "端点类型" + + msgid "The shape of the start and end of the stroke" msgstr "笔画首末两端的形状" +msgctxt "GPencil" +msgid "Round" +msgstr "圆头" + + +msgctxt "GPencil" +msgid "Flat" +msgstr "平头" + + msgid "Curve Jitter" msgstr "曲线抖动" @@ -4178,7 +4367,7 @@ msgstr "用于调制效果的曲线" msgid "Curve Sensitivity" -msgstr "曲线敏感度" +msgstr "曲线灵敏度" msgid "Curve used for the sensitivity" @@ -4190,7 +4379,7 @@ msgstr "曲线强度" msgid "Curve used for the strength" -msgstr "用于强度的曲线" +msgstr "强度的调整曲线" msgid "Dilate/Contract" @@ -4198,7 +4387,7 @@ msgstr "膨胀/收缩" msgid "Number of pixels to expand or contract fill area" -msgstr "扩展或收缩填充区域的像素数" +msgstr "填充膨胀或收缩区域的像素数" msgid "Direction" @@ -4222,7 +4411,7 @@ msgstr "消融" msgid "Erase strokes, fading their points strength and thickness" -msgstr "擦除笔画,淡入点强度和宽度" +msgstr "擦除笔画,淡化点强度和粗细" msgid "Erase stroke points" @@ -4234,7 +4423,7 @@ msgstr "笔画" msgid "Erase entire strokes" -msgstr "擦除整个笔迹" +msgstr "擦除整个笔画" msgid "Affect Stroke Strength" @@ -4449,6 +4638,56 @@ msgid "Eraser Stroke" msgstr "擦除笔画" +msgctxt "GPencil" +msgid "Grease Pencil Icon" +msgstr "蜡笔图标" + + +msgctxt "GPencil" +msgid "Smooth" +msgstr "平滑" + + +msgctxt "GPencil" +msgid "Thickness" +msgstr "粗细" + + +msgctxt "GPencil" +msgid "Strength" +msgstr "强度/力度" + + +msgctxt "GPencil" +msgid "Randomize" +msgstr "随机" + + +msgctxt "GPencil" +msgid "Grab" +msgstr "抓起" + + +msgctxt "GPencil" +msgid "Push" +msgstr "推" + + +msgctxt "GPencil" +msgid "Twist" +msgstr "扭曲" + + +msgctxt "GPencil" +msgid "Pinch" +msgstr "夹捏" + + +msgctxt "GPencil" +msgid "Clone" +msgstr "克隆" + + msgid "Draw" msgstr "绘制" @@ -4502,6 +4741,11 @@ msgid "Jitter factor for new strokes" msgstr "新笔画的跳动值" +msgctxt "Amount" +msgid "Smooth" +msgstr "平滑" + + msgid "Amount of smoothing to apply after finish newly created strokes, to reduce jitter/noise" msgstr "当新笔画创建后进行平滑处理,重新计算跳动/噪波" @@ -4610,6 +4854,10 @@ msgid "Active Layer" msgstr "活动层" +msgid "Only edit the active layer of the object" +msgstr "只编辑对象的激活图层" + + msgid "Strokes Collision" msgstr "笔画碰撞" @@ -4674,6 +4922,14 @@ msgid "Use tablet pressure for jitter" msgstr "对抖动使用数位板压力" +msgid "Keep caps" +msgstr "维持端点" + + +msgid "Keep the caps as they are and don't flatten them when erasing" +msgstr "擦除时边缘不会变平,仍保持原本的端点形状" + + msgid "Pin Material" msgstr "钉固材质" @@ -4707,7 +4963,7 @@ msgstr "轮廓" msgid "Convert stroke to perimeter" -msgstr "将笔画转换为周长" +msgstr "将笔画转换为描边线" msgid "Use Post-Process Settings" @@ -4862,6 +5118,11 @@ msgid "Path of an object inside of an Alembic archive" msgstr "Alembic存档中物体的路径" +msgctxt "File browser" +msgid "Path" +msgstr "路径" + + msgid "Object path" msgstr "物体路径" @@ -5366,7 +5627,7 @@ msgstr "弯曲计算的物理模型" msgid "Angular" -msgstr "棱角" +msgstr "角度" msgid "Cloth model with angular bending springs" @@ -5713,6 +5974,10 @@ msgid "Vertex group for fine control over the internal spring stiffness" msgstr "用于精细控制内部弹簧刚度的顶点组" +msgid "Pin Vertex Group" +msgstr "钉固顶点组" + + msgid "Vertex Group for pinning of vertices" msgstr "用于钉固顶点的顶点组" @@ -5853,6 +6118,22 @@ msgid "The inputs are invalid, or the algorithm has been improperly called" msgstr "输入无效,或者算法调用不正确" +msgid "Collection Child" +msgstr "集合子集" + + +msgid "Child collection with its collection related settings" +msgstr "子集合及其集合的相关设置" + + +msgid "Light Linking" +msgstr "灯光链接" + + +msgid "Light linking settings of the collection object" +msgstr "集合物体的灯光链接设置" + + msgid "Collection Children" msgstr "子集集合" @@ -5861,6 +6142,22 @@ msgid "Collection of child collections" msgstr "子集合的集合" +msgid "Collection Light Linking" +msgstr "灯光链接集合" + + +msgid "Light linking settings of objects and children collections of a collection" +msgstr "物体和集合的子集合灯光链接设置" + + +msgid "Link State" +msgstr "链接状态" + + +msgid "Light or shadow receiving state of the object or collection" +msgstr "物体或集合的灯光或阴影接受的状态" + + msgid "Include" msgstr "包括" @@ -5869,6 +6166,18 @@ msgid "Exclude" msgstr "排除" +msgid "Collection Object" +msgstr "集合物体" + + +msgid "Object of a collection with its collection related settings" +msgstr "一个集合的物体和集合的相关设置" + + +msgid "Light linking settings of the collection" +msgstr "集合的灯光链接设置" + + msgid "Collection Objects" msgstr "物体集合" @@ -6033,8 +6342,72 @@ msgid "Color space in the image file, to convert to and from when saving and loa msgstr "图像文件中的颜色空间,用于在保存和加载图像时转换" +msgid "ACES2065-1" +msgstr "ACES2065-1" + + +msgid "Linear AP0 with ACES white point" +msgstr "线性 AP0 和 ACES 白点" + + +msgid "ACEScg" +msgstr "ACEScg" + + +msgid "Linear AP1 with ACES white point" +msgstr "线性 AP1 和 ACES 白点" + + +msgid "AgX Base Display P3" +msgstr "基于Display P3 色域的AgX" + + +msgid "AgX Base Image Encoding for Display P3 Display" +msgstr "基于Display P3色域的图像编码的AgX" + + +msgid "AgX Base Rec.1886" +msgstr "基于Rec.1886的AgX" + + +msgid "AgX Base Image Encoding for Rec.1886 Display" +msgstr "基于Rec.1886色域的图像编码的AgX" + + +msgid "AgX Base Rec.2020" +msgstr "基于Rec.2020色域的AgX" + + +msgid "AgX Base Image Encoding for BT.2020 Display" +msgstr "基于BT.2020色域图像编码的AgX" + + +msgid "AgX Base sRGB" +msgstr "基于sRGB色域的AgX" + + +msgid "AgX Base Image Encoding for sRGB Display" +msgstr "基于sRGB色域图像编码的AgX" + + +msgid "AgX Log" +msgstr "AgX Log" + + +msgid "Log Encoding with Chroma inset and rotation, and with 25 Stops of Dynamic Range" +msgstr "与带有色度插入和旋转的Log 编码,并且具有25个档次的动态范围" + + +msgid "Display P3" +msgstr "P3色域显示" + + +msgid "Apple's Display P3 with sRGB compound (piece-wise) encoding transfer function, common on Mac devices" +msgstr "苹果的Display P3色域带有sRGB分段函数的色彩编码传输功能,常见于Mac设备" + + msgid "Filmic Log" -msgstr "电影日志" +msgstr "Filmic Log" msgid "Log based filmic shaper with 16.5 stops of latitude, and 25 stops of dynamic range" @@ -6049,10 +6422,82 @@ msgid "sRGB display space with Filmic view transform" msgstr "带有Filmic视图变换的sRGB显示空间" +msgid "Linear CIE-XYZ D65" +msgstr "线性 CIE-XYZ D65" + + +msgid "1931 CIE XYZ with adapted illuminant D65 white point" +msgstr "带有D65光源白点适应的 1931 CIE XYZ" + + +msgid "Linear CIE-XYZ E" +msgstr "线性 CIE-XYZ E" + + +msgid "1931 CIE XYZ standard with assumed illuminant E white point" +msgstr "假定为能E光源白点下的标准1931 CIE XYZ" + + +msgid "Linear DCI-P3 D65" +msgstr "线性 DCI-P3 D65" + + +msgid "Linear DCI-P3 with illuminant D65 white point" +msgstr "光源为 D65白点下的线性 DCI-P3" + + +msgid "Linear FilmLight E-Gamut" +msgstr "线性 FilmLight E-Gamut( 色域)" + + +msgid "Linear E-Gamut with illuminant D65 white point" +msgstr "具有 D65 白点光源的线性 E-Gamut(色域)" + + +msgid "Linear Rec.2020" +msgstr "线性 Rec.2020" + + +msgid "Linear BT.2020 with illuminant D65 white point" +msgstr "线性 BT.2020,光源为 D65 白点" + + +msgid "Linear Rec.709" +msgstr "线性 Rec.709" + + +msgid "Linear BT.709 with illuminant D65 white point" +msgstr "线性 BT.709,光源为 D65 白点" + + msgid "Non-Color" msgstr "非彩色" +msgid "Generic data that is not color, will not apply any color transform (e.g. normal maps)" +msgstr "非色彩常规数据,不会对该数据使用任何色彩变换(例如法线贴图)" + + +msgid "Rec.1886" +msgstr "Rec.1886" + + +msgid "BT.1886 2.4 Exponent EOTF Display, commonly used for TVs" +msgstr "BT.1886 2.4 指数 EOTF 显示,常用于电视" + + +msgid "Rec.2020" +msgstr "Rec.2020" + + +msgid "BT.2020 2.4 Exponent EOTF Display" +msgstr "BT.2020 2.4 指数 EOTF 显示" + + +msgid "sRGB IEC 61966-2-1 compound (piece-wise) encoding" +msgstr "sRGB IEC 61966-2-1 分段函数编码" + + msgid "Do not perform any color transform on load, treat colors as in scene linear space already" msgstr "不要在加载时执行任何色彩转换, 已将颜色视为场景线性空间中的颜色" @@ -6113,6 +6558,14 @@ msgid "Use RGB curved for pre-display transformation" msgstr "使用RGB曲线预显示变换" +msgid "High Dynamic Range" +msgstr "高动态范围(HDR)" + + +msgid "Enable high dynamic range display in rendered viewport, uncapping display brightness. This requires a monitor with HDR support and a view transform designed for HDR. 'Filmic' and 'AgX' do not generate HDR colors" +msgstr "在渲染的视口中启用高动态范围显示,取消显示亮度,这需要一个支持HDR的显示器和为HDR设计的视图变换,Filmic和AgX不生成HDR颜色" + + msgid "View Transform" msgstr "查看变换" @@ -8590,6 +9043,10 @@ msgid "Map To" msgstr "映射至" +msgid "The transformation type to affect on the constrained object" +msgstr "要影响约束对象的转换类型" + + msgid "Map To X From" msgstr "映射到 X 源" @@ -8978,10 +9435,30 @@ msgid "Plane for projected stroke" msgstr "投射笔画的平面" +msgid "Normal to Surface" +msgstr "法线至表面" + + +msgid "Draw in a plane perpendicular to the surface" +msgstr "在垂直于曲面的平面中绘制" + + +msgid "Tangent to Surface" +msgstr "切向到表面" + + +msgid "Draw in the surface plane" +msgstr "在曲面的平面上绘制" + + msgid "View" msgstr "视图" +msgid "Draw in a plane aligned to the viewport" +msgstr "在与视口对齐的平面中绘制" + + msgid "Detect Corners" msgstr "侦测拐角" @@ -9812,6 +10289,10 @@ msgid "Simple Expression" msgstr "简单表达式" +msgid "The scripted expression can be evaluated without using the full Python interpreter" +msgstr "脚本化表达式可以在不使用完整 Python 解释器的情况下进行计算" + + msgid "Invalid" msgstr "非法输入" @@ -10097,10 +10578,30 @@ msgid "The particle system to paint with" msgstr "要进行绘画的粒子系统" +msgctxt "Brush" +msgid "Falloff" +msgstr "衰减" + + msgid "Proximity falloff type" msgstr "邻近衰减类型" +msgctxt "Brush" +msgid "Smooth" +msgstr "平滑" + + +msgctxt "Brush" +msgid "Constant" +msgstr "常值" + + +msgctxt "Brush" +msgid "Color Ramp" +msgstr "颜色渐变" + + msgid "Ray Direction" msgstr "光线方向" @@ -10253,6 +10754,31 @@ msgid "Multiplier for wave influence of this brush" msgstr "用此笔刷的波形影响量倍值" +msgctxt "Simulation" +msgid "Wave Type" +msgstr "波纹类型" + + +msgctxt "Simulation" +msgid "Depth Change" +msgstr "改变深度" + + +msgctxt "Simulation" +msgid "Obstacle" +msgstr "障碍" + + +msgctxt "Simulation" +msgid "Force" +msgstr "力" + + +msgctxt "Simulation" +msgid "Reflect Only" +msgstr "仅反射" + + msgid "Canvas Settings" msgstr "画布设置" @@ -10521,6 +11047,10 @@ msgid "Anti-Aliasing" msgstr "抗锯齿" +msgid "Use 5× multisampling to smooth paint edges" +msgstr "使用 5 级多重采样以平滑绘制边缘" + + msgid "Enable to make surface changes disappear over time" msgstr "启用后, 可使表层的变化随时间消失" @@ -10661,6 +11191,10 @@ msgid "Active Point Cache Index" msgstr "活动点缓存编号" +msgid "EQCurveMappingData" +msgstr "EQ曲线映射数据" + + msgid "Curve Mapping" msgstr "曲线映射" @@ -11189,6 +11723,10 @@ msgid "Sample Rate" msgstr "采样率" +msgid "Audio sample rate (samples/s)" +msgstr "音频采样率(采样次数/秒)" + + msgctxt "Sound" msgid "Volume" msgstr "音量" @@ -11231,7 +11769,7 @@ msgstr "DV" msgid "FFmpeg video codec #1" -msgstr "FFmpeg video codec #1" +msgstr "FFmpeg 视频编码 #1" msgid "Flash Video" @@ -11514,6 +12052,10 @@ msgid "Enable F-Curve modifier evaluation" msgstr "启用函数曲线修改器解算" +msgid "F-Curve Modifier name" +msgstr "函数曲线修改器名称" + + msgid "F-Curve Modifier's panel is expanded in UI" msgstr "在 UI 中展开函数曲线修改器面板" @@ -11616,7 +12158,7 @@ msgstr "循环函数修改器" msgid "Repeat the values of the modified F-Curve" -msgstr "重复已修改的函数曲线值" +msgstr "已修改的函数曲线的循环值" msgid "After Cycles" @@ -11796,7 +12338,7 @@ msgstr "偏移值的常数参量" msgid "Generator F-Modifier" -msgstr "生成器 曲线修改器" +msgstr "生成器 曲线修改器" msgid "Deterministically generate values for the modified F-Curve" @@ -11832,7 +12374,7 @@ msgstr "多项式中'x'的最高幂次值 (系数值 -1)" msgid "Limit F-Modifier" -msgstr "值限定 曲线修改器" +msgstr "值限定 曲线修改器" msgid "Limit the time/value ranges of the modified F-Curve" @@ -11884,7 +12426,7 @@ msgstr "在已修改的函数曲线上执行用户指定的操作" msgid "Stepped Interpolation F-Modifier" -msgstr "步进插值 曲线修改器" +msgstr "步进插值 曲线修改器" msgid "Hold each interpolated value from the F-Curve for several frames without changing the timing" @@ -11975,6 +12517,10 @@ msgid "Maximum distance for the field to work" msgstr "场的有效工作最大距离" +msgid "Minimum distance for the field's falloff" +msgstr "场衰减的最小距离" + + msgid "Falloff Power" msgstr "衰减力度" @@ -12047,10 +12593,50 @@ msgid "Adjust the offset to the beginning/end" msgstr "根据首位调整偏移量" +msgctxt "ParticleSettings" +msgid "Kink" +msgstr "扭结" + + msgid "Type of periodic offset on the curve" msgstr "曲线的周期偏移类型" +msgctxt "ParticleSettings" +msgid "None" +msgstr "无" + + +msgctxt "ParticleSettings" +msgid "Braid" +msgstr "编织" + + +msgctxt "ParticleSettings" +msgid "Curl" +msgstr "卷曲" + + +msgctxt "ParticleSettings" +msgid "Radial" +msgstr "径向" + + +msgctxt "ParticleSettings" +msgid "Roll" +msgstr "扭转" + + +msgctxt "ParticleSettings" +msgid "Rotation" +msgstr "旋转" + + +msgctxt "ParticleSettings" +msgid "Wave" +msgstr "波浪" + + msgid "The distance from which particles are affected fully" msgstr "粒子受完全影响的间距" @@ -12115,6 +12701,10 @@ msgid "Minimum Radial Distance" msgstr "最小半径距离" +msgid "Minimum radial distance for the field's falloff" +msgstr "场衰减的最小半径" + + msgid "Rest Length" msgstr "静止长度" @@ -12315,10 +12905,18 @@ msgid "Use Min" msgstr "使用最小值" +msgid "Use a minimum distance for the field's falloff" +msgstr "场衰减的最小距离" + + msgid "Multiple Springs" msgstr "多重弹性" +msgid "Every point is affected by multiple springs" +msgstr "每一个点均受多重弹力的作用" + + msgid "Use Coordinates" msgstr "使用坐标轴" @@ -12331,6 +12929,10 @@ msgid "Use a maximum radial distance for the field to work" msgstr "场工作的最大半径距离" +msgid "Use a minimum radial distance for the field's falloff" +msgstr "为场的衰减使用最小半径距离" + + msgid "Root Texture Coordinates" msgstr "纹理根坐标系" @@ -12543,6 +13145,18 @@ msgid "Whether this path is saved in bookmarks, or generated from OS" msgstr "是否此路径保存于书签, 或从操作系统生成" +msgid "File Extensions" +msgstr "文件扩展名" + + +msgid "Operator" +msgstr "操作项" + + +msgid "Label" +msgstr "标签" + + msgid "File Select Entry" msgstr "文件选择条目" @@ -12627,6 +13241,10 @@ msgid "Show scenes" msgstr "显示场景" +msgid "Show materials, node-trees, textures and Freestyle's line-styles" +msgstr "显示材质,节点树,纹理和Freestyle的线条样式" + + msgid "Directory" msgstr "文件夹" @@ -12639,10 +13257,34 @@ msgid "Display Size" msgstr "显示尺寸" +msgid "Change the size of thumbnails" +msgstr "更改缩略图尺寸" + + +msgid "Change the size of thumbnails in discrete steps" +msgstr "按照步进形式更改缩略图尺寸" + + +msgid "Tiny" +msgstr "细" + + +msgid "Small" +msgstr "小" + + msgid "Medium" msgstr "中等" +msgid "Big" +msgstr "大" + + +msgid "Large" +msgstr "巨大" + + msgid "Display Mode" msgstr "显示模式" @@ -12695,6 +13337,14 @@ msgid "Filter ID Types" msgstr "过滤ID类型" +msgid "Name or Tag Filter" +msgstr "名称或者标签过滤" + + +msgid "Filter by name or tag, supports '*' wildcard" +msgstr "按照名称或标签过滤,支持通配符'*'" + + msgid "Recursion" msgstr "级联" @@ -12768,7 +13418,7 @@ msgstr "按文件首字母排序" msgid "Extension" -msgstr "扩展(名)" +msgstr "扩展名" msgid "Sort the file list by extension/type" @@ -12903,6 +13553,10 @@ msgid "Library Browser" msgstr "库浏览器" +msgid "Whether we may browse Blender files' content or not" +msgstr "是否可浏览 blender 文件的内容" + + msgid "Reverse Sorting" msgstr "反向排序" @@ -14309,7 +14963,7 @@ msgstr "将上一帧的速度与当前帧中的新速度进行比较,并保留 msgid "Override" -msgstr "重写" +msgstr "覆盖" msgid "Always write new guide velocities for every frame (each frame only contains current velocities from guiding objects)" @@ -14460,6 +15114,10 @@ msgid "Controls fluid emission from the mesh surface (higher value results in em msgstr "控制从网格表面排出的流体(值越高,发射的离网格表面越远" +msgid "Temperature Difference" +msgstr "温差" + + msgid "Temperature difference to ambient temperature" msgstr "环境温差" @@ -15804,10 +16462,20 @@ msgid "Temporary data for Edit Curve" msgstr "编辑曲线的临时数据" +msgctxt "GPencil" +msgid "End Cap" +msgstr "末端封盖" + + msgid "Stroke end extreme cap style" msgstr "笔画末端风格" +msgctxt "GPencil" +msgid "Rounded" +msgstr "圆形" + + msgid "Amount of gradient along section of stroke" msgstr "沿描边部分的渐变量" @@ -15856,6 +16524,11 @@ msgid "Index of selection used for interpolation" msgstr "用于插值的选中项编号" +msgctxt "GPencil" +msgid "Start Cap" +msgstr "起始封盖" + + msgid "Stroke start extreme cap style" msgstr "笔画开端风格" @@ -15982,15 +16655,15 @@ msgstr "第三个三角顶点索引" msgctxt "Operator" msgid "Gizmo" -msgstr "Gizmo" +msgstr "操控器" msgid "Collection of gizmos" -msgstr "Gizmos集合" +msgstr "操控器集合" msgid "Gizmo group this gizmo is a member of" -msgstr "该Gizmo所属的Gizmo组" +msgstr "该操控器所属的操控器组" msgid "Hide Keymap" @@ -15998,7 +16671,7 @@ msgstr "隐藏键位映射" msgid "Ignore the key-map for this gizmo" -msgstr "忽略该Gizmo的键位映射" +msgstr "忽略该操控器的键位映射" msgid "Hide Select" @@ -16106,12 +16779,12 @@ msgstr "使用工具提示" msgid "Use tooltips when hovering over this gizmo" -msgstr "悬停在该Gizmo上时使用工具提示" +msgstr "悬停在该操控器上时使用工具提示" msgctxt "Operator" msgid "GizmoGroup" -msgstr "Gizmo群组" +msgstr "操控器组" msgid "Storage of an operator being executed, or registered after execution" @@ -16175,7 +16848,7 @@ msgstr "使用回退工具键盘映射" msgid "Add fallback tools keymap to this gizmo type" -msgstr "将回退工具键盘映射添加到此gizmo类型" +msgstr "将回退工具键盘映射添加到此操控器类型" msgid "VR Redraws" @@ -16183,7 +16856,7 @@ msgstr "VR重绘" msgid "The gizmos are made for use with virtual reality sessions and require special redraw management" -msgstr "Gizmos 用于虚拟现实会话,需要特殊的重绘管理" +msgstr "用于虚拟现实会话的操控器,需要特殊的重绘管理" msgid "Region Type" @@ -16218,6 +16891,10 @@ msgid "Tool Properties" msgstr "工具属性" +msgid "Asset Shelf Header" +msgstr "资产架标题栏" + + msgid "Floating Region" msgstr "浮动区域" @@ -16247,11 +16924,11 @@ msgstr "面板将要使用的空间" msgid "Gizmos" -msgstr "Gizmo" +msgstr "操控器" msgid "List of gizmos in the Gizmo Map" -msgstr "Gizmo映射中的Gizmo列表" +msgstr "操控器映射中的操控器列表" msgid "Has Reports" @@ -16259,7 +16936,7 @@ msgstr "有报告" msgid "GizmoGroup has a set of reports (warnings and errors) from last execution" -msgstr "Gizmo群组有最后一次执行的一组报告(警告和错误)" +msgstr "操控器组有最后一次执行的一组报告(警告和错误)" msgid "VR Controller Poses Indicator" @@ -16275,15 +16952,19 @@ msgstr "VR 查看器姿势指示器" msgid "Gizmo Group Properties" -msgstr "Gizmo组属性" +msgstr "操控器组属性" msgid "Input properties of a Gizmo Group" -msgstr "Gizmo组输入属性" +msgstr "操控器组输入属性" msgid "Gizmo Properties" -msgstr "Gizmo属性" +msgstr "操控器属性" + + +msgid "Input properties of a Gizmo" +msgstr "操控器输入属性" msgid "Modifier affecting the Grease Pencil object" @@ -16914,6 +17595,10 @@ msgid "Create dot-dash effect for strokes" msgstr "为笔画创建点划线效果" +msgid "Offset into each stroke before the beginning of the dashed segment generation" +msgstr "在虚线段生成开始前,偏移到每个笔画中" + + msgid "Active Dash Segment Index" msgstr "活动虚线段编号" @@ -17436,6 +18121,10 @@ msgid "Move strokes slightly towards the camera to avoid clipping while preserve msgstr "稍微向摄像机移动笔画以避免剪切,同时保持视图的深度" +msgid "Grease Pencil layer to which assign the generated strokes" +msgstr "指定给生成笔画的蜡笔层" + + msgid "Grease Pencil material assigned to the generated strokes" msgstr "指定给生成笔画的蜡笔材质" @@ -17584,6 +18273,10 @@ msgid "Image Boundary Trimming" msgstr "图像边界修剪" +msgid "Trim all edges right at the boundary of image (including overscan region)" +msgstr "修剪图像边界上的所有边线(包括过扫描区域)" + + msgid "Use Intersection" msgstr "使用交集" @@ -18564,6 +19257,34 @@ msgid "Grid scale" msgstr "栅格比例" +msgid "Collection of related drawings" +msgstr "相关绘制的集合" + + +msgid "Set layer visibility" +msgstr "设置层的可见性" + + +msgid "Grease Pencil Layer Group" +msgstr "蜡笔图层组" + + +msgid "Group of Grease Pencil layers" +msgstr "蜡笔层的组" + + +msgid "Set layer group visibility" +msgstr "设置层组可见性" + + +msgid "Protect group from further editing and/or frame changes" +msgstr "保护图层不受后续编辑 与 / 或 帧变动的影响" + + +msgid "Group name" +msgstr "组名称" + + msgid "Grease Pencil Layers" msgstr "蜡笔图层" @@ -18608,6 +19329,10 @@ msgid "Active index in layer mask array" msgstr "层遮罩数组中的活动编号" +msgid "Collection of Grease Pencil layers" +msgstr "蜡笔图层集合" + + msgid "Active Grease Pencil layer" msgstr "活动蜡笔图层" @@ -18676,6 +19401,10 @@ msgid "Additional data for an asset data-block" msgstr "资产数据块的其他数据" +msgid "Type identifier of this data-block" +msgstr "此数据块的类型标识符" + + msgid "Brush" msgstr "笔刷" @@ -18780,6 +19509,14 @@ msgid "Is this ID block linked indirectly" msgstr "此 ID 块是否为间接关联" +msgid "Missing Data" +msgstr "数据缺失" + + +msgid "This data-block is a place-holder for missing linked data (i.e. it is [an override of] a linked data that could not be found anymore)" +msgstr "该数据块是丢失链接数据的占位符(比如,它是不能再被找到的[一个覆盖的]一个链接的数据)" + + msgid "Runtime Data" msgstr "运行时数据" @@ -18800,6 +19537,10 @@ msgid "Weak reference to a data-block in another library .blend file (used to re msgstr "弱引用另一个库blend 文件中的数据块。(用于重复使用已经追加的数据, 而非追加新副本)" +msgid "Unique data-block ID name (within a same type and library)" +msgstr "唯一的数据块 ID 名称(在相同的类型和库中)" + + msgid "Full Name" msgstr "全名" @@ -18953,6 +19694,10 @@ msgid "The position for the axes on the bone. Increasing the value moves it clos msgstr "骨骼上轴的位置。调高该值使其更接近尖端,调低将移至更靠近根部" +msgid "Bone Collections" +msgstr "骨骼集合" + + msgid "Octahedral" msgstr "八面锥" @@ -19045,6 +19790,14 @@ msgid "Display bone axes" msgstr "显示骨骼轴线" +msgid "Display Bone Colors" +msgstr "显示骨骼颜色" + + +msgid "Display bone colors" +msgstr "显示骨骼颜色" + + msgid "Display Custom Bone Shapes" msgstr "绘制自定义骨骼形状" @@ -19273,10 +20026,40 @@ msgid "Gaussian" msgstr "高斯" +msgctxt "Brush" +msgid "Deformation" +msgstr "塑形" + + msgid "Deformation type that is used in the brush" msgstr "笔刷中使用的变形类型" +msgctxt "Brush" +msgid "Bend" +msgstr "弯曲" + + +msgctxt "Brush" +msgid "Expand" +msgstr "扩展" + + +msgctxt "Brush" +msgid "Inflate" +msgstr "膨胀" + + +msgctxt "Brush" +msgid "Grab" +msgstr "抓起" + + +msgctxt "Brush" +msgid "Twist" +msgstr "扭曲" + + msgid "Boundary Falloff" msgstr "边界衰减" @@ -19564,6 +20347,61 @@ msgid "Curves Sculpt Settings" msgstr "曲线雕刻设置" +msgctxt "Curves" +msgid "Curves Sculpt Tool" +msgstr "曲线雕刻工具" + + +msgctxt "Curves" +msgid "Paint Selection" +msgstr "绘制选择" + + +msgctxt "Curves" +msgid "Add" +msgstr "添加" + + +msgctxt "Curves" +msgid "Delete" +msgstr "删除" + + +msgctxt "Curves" +msgid "Density" +msgstr "密度" + + +msgctxt "Curves" +msgid "Comb" +msgstr "梳理" + + +msgctxt "Curves" +msgid "Snake Hook" +msgstr "蛇形钩" + + +msgctxt "Curves" +msgid "Grow / Shrink" +msgstr "生长/收缩" + + +msgctxt "Curves" +msgid "Pinch" +msgstr "夹捏" + + +msgctxt "Curves" +msgid "Puff" +msgstr "蓬松" + + +msgctxt "Curves" +msgid "Slide" +msgstr "滑移" + + msgid "Dash Ratio" msgstr "虚线比" @@ -19612,6 +20450,21 @@ msgid "Maximum distance to search for disconnected loose parts in the mesh" msgstr "在网格中查找断开的松散元素的最大距离" +msgctxt "Brush" +msgid "Bi-Scale Grab" +msgstr "双比例抓起" + + +msgctxt "Brush" +msgid "Tri-Scale Grab" +msgstr "三比例抓起" + + +msgctxt "Brush" +msgid "Scale" +msgstr "缩放" + + msgid "Poisson ratio for elastic deformation. Higher values preserve volume more, but also lead to more bulging" msgstr "弹性变形的泊松比。值越高,保留体积越多,但也会导致更多的膨胀" @@ -19656,6 +20509,11 @@ msgid "Amount of paint that is applied per stroke sample" msgstr "每个笔画采样应用的颜料量" +msgctxt "GPencil" +msgid "Grease Pencil Sculpt Paint Tool" +msgstr "蜡笔雕刻绘制工具" + + msgid "Smooth stroke points" msgstr "平滑笔画控制点" @@ -19688,22 +20546,51 @@ msgid "Pull points towards the midpoint of the brush" msgstr "将点拉向笔刷的中点" +msgid "Paste copies of the strokes stored on the internal clipboard" +msgstr "粘贴存储在剪贴板上的笔画副本" + + msgid "Gpencil Settings" msgstr "蜡笔设置" +msgctxt "Brush" +msgid "Grease Pencil Draw Tool" +msgstr "蜡笔绘制工具" + + +msgctxt "Brush" +msgid "Draw" +msgstr "绘制" + + msgid "The brush is of type used for drawing strokes" msgstr "用于绘制描边笔刷的类型" +msgctxt "Brush" +msgid "Fill" +msgstr "填充" + + msgid "The brush is of type used for filling areas" msgstr "用于填充区域笔刷的类型" +msgctxt "Brush" +msgid "Erase" +msgstr "擦除" + + msgid "The brush is used for erasing strokes" msgstr "用于擦除笔画笔刷" +msgctxt "Brush" +msgid "Tint" +msgstr "染色" + + msgid "The brush is of type used for tinting strokes" msgstr "用于笔画染色的笔刷的类型" @@ -19712,10 +20599,46 @@ msgid "Grease Pencil Vertex Paint Tool" msgstr "蜡笔顶点绘制工具" +msgid "Paint a color on stroke points" +msgstr "在笔画点上绘制颜色" + + +msgid "Smooth out the colors of adjacent stroke points" +msgstr "平滑相邻笔画点的颜色" + + +msgid "Smooth out colors with the average color under the brush" +msgstr "用画笔下的平均颜色来平滑颜色" + + +msgid "Smudge colors by grabbing and dragging them" +msgstr "通过抓取和拖动颜色来涂抹颜色" + + +msgid "Replace the color of stroke points that already have a color applied" +msgstr "替换已应用颜色的描边点的颜色" + + msgid "Grease Pencil Weight Paint Tool" msgstr "蜡笔权重绘制工具" +msgid "Paint weight in active vertex group" +msgstr "活动顶点组绘制权重" + + +msgid "Blur weight in active vertex group" +msgstr "活动顶点组模糊权重" + + +msgid "Average weight in active vertex group" +msgstr "活动顶点组平均权重" + + +msgid "Smear weight in active vertex group" +msgstr "活动顶点组涂抹权重" + + msgid "Gradient Spacing" msgstr "渐变间隔" @@ -19760,6 +20683,31 @@ msgid "File path to brush icon" msgstr "笔刷图标的文件路径" +msgctxt "Brush" +msgid "Image Paint Tool" +msgstr "图像绘制工具" + + +msgctxt "Brush" +msgid "Soften" +msgstr "柔化" + + +msgctxt "Brush" +msgid "Smear" +msgstr "涂抹" + + +msgctxt "Brush" +msgid "Clone" +msgstr "克隆" + + +msgctxt "Brush" +msgid "Mask" +msgstr "遮罩" + + msgid "Invert Pressure for Density" msgstr "反转压力对密度的作用" @@ -19856,6 +20804,21 @@ msgid "Mask Texture Slot" msgstr "遮罩纹理槽" +msgctxt "Mask" +msgid "Mask Tool" +msgstr "遮罩工具" + + +msgctxt "Mask" +msgid "Draw" +msgstr "绘制" + + +msgctxt "Mask" +msgid "Smooth" +msgstr "平滑" + + msgid "Plane Angle" msgstr "平面角度" @@ -20008,6 +20971,136 @@ msgid "Z Plane" msgstr "Z 平面" +msgctxt "Brush" +msgid "Sculpt Tool" +msgstr "雕刻工具" + + +msgctxt "Brush" +msgid "Draw Sharp" +msgstr "绘制锐边" + + +msgctxt "Brush" +msgid "Clay" +msgstr "黏塑" + + +msgctxt "Brush" +msgid "Clay Strips" +msgstr "黏条" + + +msgctxt "Brush" +msgid "Clay Thumb" +msgstr "指推" + + +msgctxt "Brush" +msgid "Layer" +msgstr "层" + + +msgctxt "Brush" +msgid "Blob" +msgstr "球体" + + +msgctxt "Brush" +msgid "Crease" +msgstr "折痕" + + +msgctxt "Brush" +msgid "Flatten" +msgstr "平化" + + +msgctxt "Brush" +msgid "Scrape" +msgstr "刮削" + + +msgctxt "Brush" +msgid "Multi-plane Scrape" +msgstr "多面刮削" + + +msgctxt "Brush" +msgid "Pinch" +msgstr "夹捏" + + +msgctxt "Brush" +msgid "Elastic Deform" +msgstr "弹性形变" + + +msgctxt "Brush" +msgid "Snake Hook" +msgstr "蛇形钩" + + +msgctxt "Brush" +msgid "Thumb" +msgstr "拇指" + + +msgctxt "Brush" +msgid "Pose" +msgstr "姿态" + + +msgctxt "Brush" +msgid "Nudge" +msgstr "推移" + + +msgctxt "Brush" +msgid "Rotate" +msgstr "旋转" + + +msgctxt "Brush" +msgid "Slide Relax" +msgstr "滑动松弛" + + +msgctxt "Brush" +msgid "Boundary" +msgstr "边界" + + +msgctxt "Brush" +msgid "Cloth" +msgstr "布料" + + +msgctxt "Brush" +msgid "Simplify" +msgstr "简化" + + +msgctxt "Brush" +msgid "Draw Face Sets" +msgstr "绘制面组" + + +msgctxt "Brush" +msgid "Multires Displacement Eraser" +msgstr "多精度置换橡皮擦" + + +msgctxt "Brush" +msgid "Multires Displacement Smear" +msgstr "多精度置换涂抹" + + +msgctxt "Brush" +msgid "Paint" +msgstr "喷绘" + + msgid "Secondary Color" msgstr "二次色" @@ -20552,6 +21645,10 @@ msgid "Use Plane Trim" msgstr "使用平面裁切" +msgid "Limit the distance from the offset plane that a vertex can be affected" +msgstr "限制顶点可能受到影响的偏移平面的距离" + + msgid "Keep Anchor Point" msgstr "保留锚点" @@ -21299,6 +22396,14 @@ msgid "Collections that are immediate children of this collection" msgstr "此集合的直系子级的集合" +msgid "Children collections their parent-collection-specific settings" +msgstr "子集合及其父集合特定的设置" + + +msgid "Objects of the collection with their parent-collection-specific settings" +msgstr "集合的对象及其父集合特定的设置" + + msgid "Collection Color" msgstr "集合颜色" @@ -21520,7 +22625,7 @@ msgstr "确定如何构建曲线的倒角几何体" msgid "Round" -msgstr "圆(四舍五入)" +msgstr "圆形" msgid "Use circle for the section of the curve's bevel geometry" @@ -21748,11 +22853,11 @@ msgstr "曲线形变选项: 使用网格边界钳制形变" msgid "Fill Caps" -msgstr "封盖" +msgstr "填充封盖" msgid "Fill caps for beveled curves" -msgstr "为倒角曲线封盖" +msgstr "为倒角的曲线封盖" msgid "Map Taper" @@ -21779,6 +22884,18 @@ msgid "Follow" msgstr "跟随" +msgid "Make curve path children rotate along the path" +msgstr "使曲线路径的子物体沿路径旋转" + + +msgid "Option for paths and curve-deform: apply the curve radius to objects following it and to deformed objects" +msgstr "路径及曲线形变的选项: 将曲线半径应用到跟随它并进行形变的路径上" + + +msgid "Option for curve-deform: make deformed child stretch along entire path" +msgstr "曲线形变选项:使发生形变的子物体沿整条路径拉伸" + + msgid "Surface Curve" msgstr "曲面曲线" @@ -21931,6 +23048,42 @@ msgid "Text Selected" msgstr "选择的文本" +msgid "Whether there is any text selected" +msgstr "是否有选中的文字" + + +msgid "Selected Bold" +msgstr "选中的粗体" + + +msgid "Whether the selected text is bold" +msgstr "所选文本是否为粗体" + + +msgid "Selected Italic" +msgstr "选中的斜体" + + +msgid "Whether the selected text is italics" +msgstr "所选文本是否为斜体" + + +msgid "Selected Small Caps" +msgstr "选中的小型大写" + + +msgid "Whether the selected text is small caps" +msgstr "所选文本是否为小型大写" + + +msgid "Selected Underline" +msgstr "选定的下划线" + + +msgid "Whether the selected text is underlined" +msgstr "所选文本是否带下划线" + + msgid "X Offset" msgstr "X 向偏移" @@ -21972,7 +23125,7 @@ msgstr "按比例缩小文本以适应文本框" msgid "Truncate" -msgstr "截短" +msgstr "截断" msgid "Truncate the text that would go outside the text boxes" @@ -22979,6 +24132,18 @@ msgid "Grease Pencil data-block" msgstr "蜡笔数据块" +msgid "Layer Groups" +msgstr "图层组" + + +msgid "Grease Pencil layer groups" +msgstr "蜡笔层组" + + +msgid "Grease Pencil layers" +msgstr "蜡笔图层" + + msgid "Image data-block referencing an external or packed image" msgstr "引用自外部图像或已打包图像的图像数据块" @@ -23116,7 +24281,7 @@ msgstr "输出图像为 DPX 文件格式" msgid "OpenEXR MultiLayer" -msgstr "OpenEXR MultiLayer" +msgstr "多层的OpenEXR" msgid "Output image in multilayer OpenEXR format" @@ -23531,14 +24696,26 @@ msgid "U" msgstr "U" +msgid "Points in U direction (cannot be changed when there are shape keys)" +msgstr "U方向的点 (当存在形态键时无法更改)" + + msgid "V" msgstr "V" +msgid "Points in V direction (cannot be changed when there are shape keys)" +msgstr "V方向的点 (当存在形态键时无法更改)" + + msgid "W" msgstr "W" +msgid "Points in W direction (cannot be changed when there are shape keys)" +msgstr "W方向的点 (当存在形态键时无法更改)" + + msgid "Only display and take into account the outer vertices" msgstr "仅显示,且仅考虑外围点" @@ -23555,6 +24732,14 @@ msgid "Path to the library .blend file" msgstr ". blend 库文件路径" +msgid "Library Overrides Need resync" +msgstr "库重写需要重新同步" + + +msgid "True if this library contains library overrides that are linked in current blendfile, and that had to be recursively resynced on load (it is recommended to open and re-save that library blendfile then)" +msgstr "如果此库包含在当前blend文件中链接的库重写,并且必须在加载时递归地重新同步(建议打开并重新保存该库 Blend文件),则为 True(真)" + + msgid "Version of Blender the library .blend was saved with" msgstr "保存该.blend文件的Blender程序版本" @@ -23746,6 +24931,14 @@ msgid "Light size for ray shadow sampling (Raytraced shadows)" msgstr "用于光线阴影采样的光源尺寸 (光线追踪的阴影)" +msgid "Shadow Softness Factor" +msgstr "阴影柔和系数" + + +msgid "Scale light shape for smaller penumbra" +msgstr "缩放灯光形状控制半影大小" + + msgid "Shape of the area Light" msgstr "面灯光的形状" @@ -23846,6 +25039,10 @@ msgid "Angular diameter of the Sun as seen from the Earth" msgstr "模拟从地球上看到日光的角直径" +msgid "Sunlight strength in watts per meter squared (W/m²)" +msgstr "阳光强度,瓦特/平方米 (W/m^2)" + + msgid "Cascade Count" msgstr "层叠数" @@ -23878,6 +25075,14 @@ msgid "End distance of the cascaded shadow map (only in perspective view)" msgstr "层叠阴影贴图的最大距离(仅用于正交视图)" +msgid "Shadow Tracing Max Distance" +msgstr "阴影追踪的最大距离" + + +msgid "Maximum distance a shadow map tracing ray can travel" +msgstr "阴影贴图追踪光线可以行进的最大距离" + + msgid "Light Probe data-block for lighting capture objects" msgstr "光线采集物体的光照探头数据块" @@ -23890,34 +25095,154 @@ msgid "Probe clip start, below which objects will not appear in reflections" msgstr "探头裁剪起点,小于这个位置的物体将不会出现在反射中" +msgid "Display Data Size" +msgstr "显示数据尺寸" + + +msgid "Viewport display size of the sampled data" +msgstr "采样的数据在视口中显示的尺寸" + + msgid "Control how fast the probe influence decreases" msgstr "控制光照探头影响衰减的速率" +msgid "Bake Samples" +msgstr "烘焙采样" + + +msgid "Number of ray directions to evaluate when baking" +msgstr "烘焙时要评估的光线方向数" + + +msgid "Capture Emission" +msgstr "捕获发光体" + + +msgid "Bake emissive surfaces for more accurate lighting" +msgstr "烘焙发光表面以获得更准确的照明" + + +msgid "Capture Indirect" +msgstr "捕获间接光" + + +msgid "Bake light bounces from light sources for more accurate lighting" +msgstr "烘焙来从光源光线反弹的光,以得到更准确的照明" + + +msgid "Capture World" +msgstr "捕获世界环境" + + +msgid "Bake incoming light from the world, instead of just the visibility, for more accurate lighting, but lose correct blending to surrounding irradiance volumes" +msgstr "烘焙来自世界的入射光,而不仅仅是可见性,以获得更准确的照明,但会失去与周围辐射体积的正确混合" + + msgid "Clamp Direct" msgstr "钳制直接光" +msgid "Clamp the direct lighting intensity to reduce noise (0 to disable)" +msgstr "钳制直接光的强度以降低噪点 (0为禁用)" + + msgid "Clamp Indirect" msgstr "钳制间接光" +msgid "Clamp the indirect lighting intensity to reduce noise (0 to disable)" +msgstr "钳制间接光的强度以降低噪点 (0为禁用)" + + +msgid "Dilation Radius" +msgstr "扩张半径" + + +msgid "Radius in grid sample to search valid grid samples to copy into invalid grid samples" +msgstr "搜索有效的网格采样以复制到无效的网格采样中的网格采样的半径" + + +msgid "Dilation Threshold" +msgstr "扩张阈值" + + +msgid "Ratio of front-facing surface hits under which a grid sample will reuse neighbors grid sample lighting" +msgstr "前向面的命中比率在此比率下,网格采样将重新使用相邻网格采样的光照" + + +msgid "Capture Escape Bias" +msgstr "捕获逃脱偏移" + + +msgid "Moves capture points outside objects" +msgstr "将捕获点移动到对象之外" + + +msgid "Facing Bias" +msgstr "朝向偏移" + + msgid "Smoother irradiance interpolation but introduce light bleeding" msgstr "更平滑的辐射插值, 但引入光会渗出" +msgid "Normal Bias" +msgstr "法向偏移" + + +msgid "Offset sampling of the irradiance grid in the surface normal direction to reduce light bleeding" +msgstr "在表面法线方向上对辐射网格进行偏移采样,以减少漏光" + + msgid "Resolution X" msgstr "分辨率 X" +msgid "Number of samples along the x axis of the volume" +msgstr "x轴向体积的采样数量" + + msgid "Resolution Y" msgstr "分辨率 Y" +msgid "Number of samples along the y axis of the volume" +msgstr "y轴向体积的采样数量" + + msgid "Resolution Z" msgstr "分辨率 Z" +msgid "Number of samples along the z axis of the volume" +msgstr "z轴向体积的采样数量" + + +msgid "Capture Surface Bias" +msgstr "捕获表面偏移" + + +msgid "Moves capture points position away from surfaces to avoid artifacts" +msgstr "将捕获点的位置移离曲面以避免伪影" + + +msgid "Validity Threshold" +msgstr "有效性阈值" + + +msgid "Ratio of front-facing surface hits under which a grid sample will not be considered for lighting" +msgstr "不考虑栅格采样进行照明的前向表面命中率" + + +msgid "View Bias" +msgstr "视图偏移" + + +msgid "Offset sampling of the irradiance grid in the viewing direction to reduce light bleeding" +msgstr "将辐射网格在视线方向进行偏移采样,以减少漏光" + + msgid "Influence Distance" msgstr "影响距离" @@ -23962,6 +25287,14 @@ msgid "Show the clipping distances in the 3D view" msgstr "3D 视图的裁切距离" +msgid "Display Data (Deprecated)" +msgstr "显示数据 (过时)" + + +msgid "Deprecated, use use_data_display instead" +msgstr "过时了,使用use_data_display代替" + + msgid "Show the influence volume in the 3D view" msgstr "在3D视图中显示影响体积" @@ -23974,10 +25307,30 @@ msgid "Show the parallax correction volume in the 3D view" msgstr "在3D视图中显示视差修正体积" +msgid "Surfel Density" +msgstr "面元密度" + + +msgid "Number of surfels per unit distance (higher values improve quality)" +msgstr "每单位距离的面元数量(值越高,质量越高)" + + msgid "Type of light probe" msgstr "光照探头类型" +msgid "Light probe that captures precise lighting from all directions at a single point in space" +msgstr "可在空间中的单个点捕获来自所有方向的精确照明的光照探头" + + +msgid "Light probe that captures incoming light from a single direction on a plane" +msgstr "捕捉平面上单个方向入射光的光照探头" + + +msgid "Light probe that captures low frequency lighting inside a volume" +msgstr "捕获体积内的低频照明的光照探头" + + msgid "Use Custom Parallax" msgstr "使用自定义视差" @@ -23986,6 +25339,14 @@ msgid "Enable custom settings for the parallax correction volume" msgstr "启用视差修正体积的自定义设置" +msgid "Display Data" +msgstr "显示数据" + + +msgid "Display sampled data in the viewport to debug captured light" +msgstr "在视口中显示采样数据以调试捕获的灯光" + + msgid "Visibility Bleed Bias" msgstr "出血偏移可见性" @@ -24050,22 +25411,47 @@ msgid "A pixel is rendered only if its alpha value is above this threshold" msgstr "仅当像素的Alpha值高于此阈值时才渲染像素" +msgctxt "Material" +msgid "Blend Mode" +msgstr "混合模式" + + msgid "Blend Mode for Transparent Faces" msgstr "透明面的混合模式" +msgctxt "Material" +msgid "Opaque" +msgstr "不透明" + + msgid "Render surface without transparency" msgstr "渲染不带透明的表面" +msgctxt "Material" +msgid "Alpha Clip" +msgstr "Alpha钳制" + + msgid "Use the alpha threshold to clip the visibility (binary visibility)" msgstr "使用Alpha阈值决定可见性(二元可见性)" +msgctxt "Material" +msgid "Alpha Hashed" +msgstr "Alpha Hashed" + + msgid "Use noise to dither the binary visibility (works well with multi-samples)" msgstr "使用噪波方式丰富二元可见性(高采样量下效果好)" +msgctxt "Material" +msgid "Alpha Blend" +msgstr "Alpha 混合" + + msgid "Render polygon transparent, depending on alpha channel of the texture" msgstr "渲染多边形透明度, 视纹理的 Alpha 通道而定" @@ -24134,6 +25520,14 @@ msgid "True if this material has grease pencil data" msgstr "当此材质拥有蜡笔的数据时为真" +msgid "Light Probe Volume Single Sided" +msgstr "体积单面的光照探头" + + +msgid "Consider material single sided for light probe volume capture. Additionally helps rejecting probes inside the object to avoid light leaks" +msgstr "考虑使用单面材料进行光探测体积捕获。此外,还有助于排除物体内部的探头,以避免漏光" + + msgid "Line Color" msgstr "线条色彩" @@ -24158,6 +25552,14 @@ msgid "Line art settings for material" msgstr "用于材质的线条画设置" +msgid "Max Vertex Displacement" +msgstr "最大顶点置换" + + +msgid "The max distance a vertex can be displaced. Displacements over this threshold may cause visibility issues" +msgstr "顶点可以置换的最大距离,超过此阈值的位移可能会导致可见性问题" + + msgid "Metallic" msgstr "金属度" @@ -24190,30 +25592,70 @@ msgid "Index number for the \"Material Index\" render pass" msgstr "用于材质编号渲染通道的编号数值" +msgctxt "Material" +msgid "Preview Render Type" +msgstr "预渲染类型" + + msgid "Type of preview render" msgstr "渲染预览类型" +msgctxt "Material" +msgid "Flat" +msgstr "平展" + + msgid "Flat XY plane" msgstr "XY 平面" +msgctxt "Material" +msgid "Sphere" +msgstr "球状" + + +msgctxt "Material" msgid "Cube" msgstr "立方体" +msgid "Cube" +msgstr "立方体" + + +msgctxt "Material" +msgid "Hair" +msgstr "毛发" + + msgid "Hair strands" msgstr "发股" +msgctxt "Material" +msgid "Shader Ball" +msgstr "着色球" + + msgid "Shader ball" msgstr "着色球" +msgctxt "Material" msgid "Cloth" msgstr "布料" +msgid "Cloth" +msgstr "布料" + + +msgctxt "Material" +msgid "Fluid" +msgstr "流体" + + msgid "Refraction Depth" msgstr "折射深度" @@ -24286,6 +25728,30 @@ msgid "How intense (bright) the specular reflection is" msgstr "高光反射的强度 (亮度)" +msgid "Surface Render Method" +msgstr "表面渲染方式" + + +msgid "Controls the blending and the compatibility with certain features" +msgstr "控制混合以及与某些功能的兼容性" + + +msgid "Dithered" +msgstr "抖动" + + +msgid "Allows for grayscale hashed transparency, and compatible with render passes and raytracing. Also known as deferred rendering" +msgstr "允许灰度Hashed透明,并与渲染通道和光线追踪兼容,也可称为延迟渲染" + + +msgid "Blended" +msgstr "混合的" + + +msgid "Allows for colored transparency, but incompatible with render passes and raytracing. Also known as forward rendering" +msgstr "允许彩色的透明,但与渲染通道和光线追踪不兼容。也称为前向渲染" + + msgid "Texture Slot Images" msgstr "纹理槽图像" @@ -24306,6 +25772,14 @@ msgid "Use back face culling to hide the back side of faces" msgstr "使用背面剔除, 将背侧的面隐藏" +msgid "Shadow Backface Culling" +msgstr "阴影背面剔除" + + +msgid "Use back face culling when casting shadows" +msgstr "投射阴影时使用背面剔除" + + msgid "Use shader nodes to render the material" msgstr "使用着色器节点渲染材质" @@ -24318,6 +25792,14 @@ msgid "Use the current world background to light the preview render" msgstr "使用当前世界背景给预览渲染作为光照" +msgid "Raytrace Refraction" +msgstr "光追折射" + + +msgid "Use raytracing to determine refracted color instead of using only light probes. This prevents the surface from contributing to the lighting of surfaces not using this setting" +msgstr "使用光线跟踪来确定折射的颜色,而不是仅使用光探测器,这样可以防止曲面对未使用此设置的曲面的照明产生影响" + + msgid "Subsurface Translucency" msgstr "次表面半透明" @@ -24334,18 +25816,42 @@ msgid "Use transparent shadows for this material if it contains a Transparent BS msgstr "如果此材质包含透明BSDF就使用透明阴影,禁用会加速渲染但不会有准确的阴影" +msgid "Volume Intersection Method" +msgstr "体积相交方法" + + +msgid "Determines which inner part of the mesh will produce volumetric effect" +msgstr "确定网格的哪个内部将产生体积效应" + + msgid "Fast" msgstr "快速" +msgid "Each face is considered as a medium interface. Gives correct results for manifold geometry that contains no inner parts" +msgstr "每个面都被视为一个中等界面,给未包含内部元素的开放(流行)几何体提供正确的结果" + + msgid "Accurate" msgstr "精确" +msgid "Faces are considered as medium interface only when they have different consecutive facing. Gives correct results as long as the max ray depth is not exceeded. Have significant memory overhead compared to the fast method" +msgstr "当面具有不同的连续面时,它们才被视为中等界面。只要不超过最大光线深度,就会给出正确的结果。与快速方法相比,具有显著的内存消耗" + + msgid "Mesh data-block defining geometric surfaces" msgstr "定义几何体表面的网格数据块" +msgid "Corner Normals" +msgstr "拐角法线" + + +msgid "The \"slit\" normal direction of each face corner, influenced by vertex normals, sharp faces, sharp edges, and custom normals. May be empty" +msgstr "每个面角的“狭缝”法线方向,受顶点法线、锐面、锐边和自定义法线的影响,可能是空的" + + msgid "Edges" msgstr "边" @@ -24362,6 +25868,14 @@ msgid "True if there are custom split normals data in this mesh" msgstr "若网格中存在自定义拆分法线则为真" +msgid "Triangle Faces" +msgstr "三角面" + + +msgid "The face index for each loop triangle" +msgstr "每个循环三角形的面索引" + + msgid "Loop Triangles" msgstr "循环三角面" @@ -24374,6 +25888,18 @@ msgid "Loops" msgstr "循环" +msgid "Loops of the mesh (face corners)" +msgstr "网格的循环(面拐角)" + + +msgid "Normal Domain" +msgstr "法线域" + + +msgid "The attribute domain that gives enough information to represent the mesh's normals" +msgstr "提供足够信息来表示网格法线的属性域" + + msgid "Corner" msgstr "拐角" @@ -24382,6 +25908,10 @@ msgid "Polygon Normals" msgstr "多边形法向" +msgid "The normal direction of each face, defined by the winding order and position of its vertices" +msgstr "每个多边形的法向,由其顶点的缠绕顺序和位置定义" + + msgid "Polygons" msgstr "多边形" @@ -24518,6 +26048,18 @@ msgid "Fix Poles" msgstr "修复极点" +msgid "Produces fewer poles and a better topology flow" +msgstr "产生更少的极点,更好的拓扑" + + +msgid "Preserve Attributes" +msgstr "保留属性" + + +msgid "Transfer all attributes to the new mesh" +msgstr "将所有属性传输到新网格" + + msgid "Projects the mesh to preserve the volume and details of the original mesh" msgstr "投射网格以保留原始网格的体积和细节" @@ -24586,6 +26128,10 @@ msgid "Vertices of the mesh" msgstr "网格的顶点" +msgid "Metaball data-block to define blobby surfaces" +msgstr "融球数据块来定义球团的曲面" + + msgid "Metaball elements" msgstr "融球元素" @@ -24598,6 +26144,10 @@ msgid "Polygonization resolution in rendering" msgstr "渲染过程中的多边形化精度" +msgid "Viewport Size" +msgstr "视图尺寸" + + msgid "Polygonization resolution in the 3D viewport" msgstr "3D 视图中的多边形化精度" @@ -24702,10 +26252,6 @@ msgid "Node tree consisting of linked nodes used for shading, textures and compo msgstr "节点树, 包含用于着色、纹理及合成的所链接节点" -msgid "Label" -msgstr "标签" - - msgid "The node tree label" msgstr "节点树标签" @@ -24718,6 +26264,10 @@ msgid "Interface" msgstr "界面" +msgid "Interface declaration for this node tree" +msgstr "该节点树的接口声明" + + msgid "Links" msgstr "链接" @@ -24738,6 +26288,10 @@ msgid "Undefined type of nodes (can happen e.g. when a linked node tree goes mis msgstr "未定义的节点类型(比如,当相连的节点树丢失时可能出现)" +msgid "Custom nodes" +msgstr "自定义节点" + + msgid "Shader" msgstr "着色器" @@ -24778,6 +26332,54 @@ msgid "Max size of a tile (smaller values gives better distribution of multiple msgstr "分块最大尺寸 (较小值可获得更好的多线程分配, 但较消耗系统资源)" +msgid "32×32" +msgstr "32x32" + + +msgid "Chunksize of 32×32" +msgstr "块尺寸32x32" + + +msgid "64×64" +msgstr "64x64" + + +msgid "Chunksize of 64×64" +msgstr "块尺寸64x64" + + +msgid "128×128" +msgstr "128x128" + + +msgid "Chunksize of 128×128" +msgstr "块尺寸 128x128" + + +msgid "256×256" +msgstr "256x256" + + +msgid "Chunksize of 256×256" +msgstr "块尺寸256x256" + + +msgid "512×512" +msgstr "512x512" + + +msgid "Chunksize of 512×512" +msgstr "块尺寸512x512" + + +msgid "1024×1024" +msgstr "1024x1024" + + +msgid "Chunksize of 1024×1024" +msgstr "块尺寸1024x1024" + + msgid "Edit Quality" msgstr "编辑品质" @@ -24830,6 +26432,26 @@ msgid "Composites full image result as fast as possible" msgstr "尽可能快地合成完整图像结果" +msgid "GPU" +msgstr "GPU" + + +msgid "Use GPU accelerated compositing with more limited functionality" +msgstr "使用 GPU 加速合成,但功能更有限制" + + +msgid "The precision of compositor intermediate result" +msgstr "合成器结果的精度" + + +msgid "Full precision for final renders, half precision otherwise" +msgstr "全部(完全)精度用于最终渲染,否则为半精度" + + +msgid "Full precision" +msgstr "全精度" + + msgid "Render Quality" msgstr "渲染品质" @@ -24882,18 +26504,50 @@ msgid "Edit" msgstr "编辑" +msgid "The node group is used in edit mode" +msgstr "该节点组在编辑模式下使用" + + +msgid "The node group is used in object mode" +msgstr "该节点组用于物体模式" + + msgid "Sculpt" msgstr "雕刻" +msgid "The node group is used in sculpt mode" +msgstr "该节点组用于雕刻模式" + + msgid "Modifier" msgstr "修改器" +msgid "The node group is used as a geometry modifier" +msgstr "该节点组作为几何体修改器使用" + + msgid "Tool" msgstr "工具" +msgid "The node group is used as a tool" +msgstr "该节点组作为一个工具使用" + + +msgid "The node group is used for curves" +msgstr "该节点组用于曲线" + + +msgid "The node group is used for meshes" +msgstr "该节点组用于网格" + + +msgid "The node group is used for point clouds" +msgstr "该节点组用于点云" + + msgid "Shader Node Tree" msgstr "着色器节点树" @@ -24966,6 +26620,10 @@ msgid "Settings for using the object as a collider in physics simulation" msgstr "在物理模拟中将物体用于碰撞体的设置" +msgid "Object color and alpha, used when the Object Color mode is enabled" +msgstr "物体颜色与alpha, 当物体颜色模式被激活时可用" + + msgid "Constraints" msgstr "约束" @@ -25158,10 +26816,30 @@ msgid "Origin offset distance" msgstr "原点偏移距离" +msgctxt "Image" +msgid "Empty Image Side" +msgstr "空图像边" + + msgid "Show front/back side" msgstr "显示前/后侧" +msgctxt "Image" +msgid "Both" +msgstr "两者" + + +msgctxt "Image" +msgid "Front" +msgstr "前" + + +msgctxt "Image" +msgid "Back" +msgstr "后" + + msgid "Settings for using the object as a field in physics simulation" msgstr "在物理模拟时, 将物体用作某个场的设置" @@ -25174,6 +26852,30 @@ msgid "Modifiers affecting the data of the grease pencil object" msgstr "影响蜡笔物体数据的修改器" +msgid "Disable in Planar Light Probes" +msgstr "在平面光照探头中禁用" + + +msgid "Globally disable in planar light probes" +msgstr "平面光照探头全局禁用" + + +msgid "Disable in Spherical Light Probes" +msgstr "在球形光照探头中禁用" + + +msgid "Globally disable in spherical light probes" +msgstr "球形光照探头全局禁用" + + +msgid "Disable in Volume Probes" +msgstr "在体积光照探头中禁用" + + +msgid "Globally disable in volume probes" +msgstr "体积光照探头全局禁用" + + msgid "Instance Collection" msgstr "实例集合" @@ -25246,6 +26948,10 @@ msgid "Only render shadows and reflections on this object, for compositing rende msgstr "仅在此物体上渲染阴影和反射,用于合成渲染成真实的素材。具有此设置的物体被认为已经存在于素材中,没有此设置的物体作为合成物体被合成到其中" +msgid "Light linking settings" +msgstr "灯光链接设置" + + msgid "Lightgroup" msgstr "灯光组" @@ -25622,6 +27328,10 @@ msgid "Shape Key Lock" msgstr "形态键锁定" +msgid "Only show the active shape key at full value" +msgstr "在全值下只显示激活的形态键" + + msgid "Display Texture Space" msgstr "显示纹理空间" @@ -25738,6 +27448,18 @@ msgid "Shape Key Edit Mode" msgstr "形态键编辑模式" +msgid "Display shape keys in edit mode (for meshes only)" +msgstr "在编辑模式下显示形态键 (仅用于网格物体)" + + +msgid "Use Simulation Cache" +msgstr "使用模拟缓存" + + +msgid "Cache frames during simulation nodes playback" +msgstr "在模拟节点回放期间缓存帧" + + msgid "Vertex Groups" msgstr "顶点组" @@ -25854,6 +27576,10 @@ msgid "Global Z" msgstr "全局 Z" +msgid "Affect Children" +msgstr "影响子粒子" + + msgid "Apply effectors to children" msgstr "为子粒子应用效果器" @@ -26230,6 +27956,16 @@ msgid "Type of periodic offset on the path" msgstr "路径中的周期性偏移类型" +msgctxt "ParticleSettings" +msgid "Nothing" +msgstr "无" + + +msgctxt "ParticleSettings" +msgid "Spiral" +msgstr "螺旋" + + msgid "Amplitude Clump" msgstr "振幅簇" @@ -26511,7 +28247,7 @@ msgstr "尺寸1" msgid "Size of location dependent roughness" -msgstr "视位置而定的坯面尺寸" +msgstr "位置相关粗糙度的大小" msgid "Roughness 2" @@ -26519,7 +28255,7 @@ msgstr "表面糙度 2" msgid "Amount of random roughness" -msgstr "随机粗糙程度" +msgstr "随机粗糙度" msgid "Size 2" @@ -26527,11 +28263,11 @@ msgstr "尺寸2" msgid "Size of random roughness" -msgstr "随机坯面尺寸" +msgstr "随机粗糙度尺寸" msgid "Amount of particles left untouched by random roughness" -msgstr "未受随机坯面影响的粒子数量" +msgstr "未受随机粗糙度影响的粒子数量" msgid "Roughness Curve" @@ -27075,10 +28811,22 @@ msgid "Settings of device saved image would be displayed on" msgstr "选择显示渲染图像的位置" +msgid "EEVEE" +msgstr "EEVEE" + + +msgid "EEVEE settings for the scene" +msgstr "场景的EEVEE设置" + + msgid "Current Frame" msgstr "当前帧" +msgid "Current frame, to update animation data from Python frame_set() instead" +msgstr "当前帧, 通过 python 脚本的 frame_set() 更新动画数据" + + msgid "Current Frame Final" msgstr "最终当前帧" @@ -27135,6 +28883,22 @@ msgid "Grease Pencil settings for the scene" msgstr "场景的蜡笔设置" +msgid "Hydra" +msgstr "Hydra" + + +msgid "Hydra settings for the scene" +msgstr "场景的Hydra设置" + + +msgid "Hydra Storm" +msgstr "Hydra Storm" + + +msgid "Hydra Storm properties" +msgstr "Hydra Storm 属性" + + msgid "NLA Tweak Mode" msgstr "NLA 调节模式" @@ -27199,6 +28963,22 @@ msgid "Show current scene subframe and allow set it using interface tools" msgstr "显示当前场景的子帧,并允许使用界面工具对其进行调整" +msgid "Simulation Frame End" +msgstr "模拟的结束帧" + + +msgid "Frame at which simulations end" +msgstr "模拟结束的帧" + + +msgid "Simulation Frame Start" +msgstr "模拟起始帧" + + +msgid "Frame at which simulations start" +msgstr "模拟的起始帧位置" + + msgid "Sync Mode" msgstr "同步模式" @@ -27271,6 +29051,14 @@ msgid "Play audio from Sequence Editor while scrubbing" msgstr "在滑动标记时播放序列编辑器中的声音" +msgid "Custom Simulation Range" +msgstr "自定义计算范围" + + +msgid "Use a simulation range that is different from the scene range for simulation nodes that don't override the frame range themselves" +msgstr "对于不覆盖帧范围本身的模拟节点,请使用与场景范围不同的模拟范围" + + msgid "Global Gravity" msgstr "全局重力" @@ -27312,7 +29100,7 @@ msgstr "保存前应用到图像上的色彩管理选项" msgid "Use Controller Actions" -msgstr "使用控制器动作" +msgstr "使用操控器动作" msgid "Enable default VR controller actions, including controller poses and haptics" @@ -27428,6 +29216,10 @@ msgid "Sequencer Editors" msgstr "序列编辑器" +msgid "Spreadsheet Editors" +msgstr "电子表格编辑器" + + msgid "Top-Left 3D Editor" msgstr "左上角的 3D 编辑器" @@ -27464,6 +29256,10 @@ msgid "Sound sample file used by this Sound data-block" msgstr "供声音数据块所使用的声音采样文件" +msgid "Sample rate of the audio in Hz" +msgstr "音频采样率(单位Hz)" + + msgid "Caching" msgstr "缓存" @@ -27637,6 +29433,11 @@ msgid "Text file is in memory, without a corresponding file on disk" msgstr "文本文件存在于缓存中, 无需对应磁盘上的文件" +msgctxt "Text" +msgid "Modified" +msgstr "修改的" + + msgid "Text file on disk is different than the one in memory" msgstr "磁盘上的文本文件与内存中的不同" @@ -28417,7 +30218,7 @@ msgstr "混合式多重分形" msgid "Use Perlin noise as a basis, with extended controls" -msgstr "使用佩尔林噪波作为基型, 可进行附加控制" +msgstr "使用Perlin噪波作为基型, 可进行附加控制" msgid "fBM" @@ -28533,7 +30334,7 @@ msgstr "实际间隔" msgid "sqrt(x*x+y*y+z*z)" -msgstr "sqrt(x*x+y*y+z*z)" +msgstr "开方(x*x+y*y+z*z)" msgid "Distance Squared" @@ -28729,7 +30530,7 @@ msgstr "循环序列中的帧" msgid "Ping-Pong" -msgstr "Ping-Pong" +msgstr "乒–乓" msgid "Repeat the frames, reversing the playback direction every other cycle" @@ -28781,7 +30582,7 @@ msgstr "类别" msgid "Filter add-ons by category" -msgstr "以目录筛选插件" +msgstr "以分类筛选插件" msgid "Filter by add-on name, author & category" @@ -28812,6 +30613,14 @@ msgid "Maintained by community developers" msgstr "由社区开发者进行维护" +msgid "Testing" +msgstr "测试" + + +msgid "Newly contributed scripts (excluded from release builds)" +msgstr "新贡献的脚本(从发布版本中排除)" + + msgid "Asset Blend Path" msgstr "资产blend路径" @@ -28984,6 +30793,10 @@ msgid "Node tree for node based worlds" msgstr "世界节点的节点树" +msgid "Resolution when baked to a texture" +msgstr "烘焙到纹理时的分辨率" + + msgid "Use shader nodes to render the world" msgstr "使用着色器节点渲染世界" @@ -29076,6 +30889,10 @@ msgid "Description of an override operation over an overridden property" msgstr "覆写属性的重写操作的描述" +msgid "Status flags" +msgstr "状态标志" + + msgid "Mandatory" msgstr "强制性" @@ -29088,6 +30905,22 @@ msgid "Prevents the user from modifying that override operation (NOT USED)" msgstr "防止用户修改该重写操作(未使用)" +msgid "Match Reference" +msgstr "匹配参考" + + +msgid "The ID pointer overridden by this operation is expected to match the reference hierarchy" +msgstr "此操作重写的ID指针应与引用层次结构匹配" + + +msgid "ID Item Use ID Pointer" +msgstr "ID 项使用 ID 指针" + + +msgid "RNA collections of IDs only, the reference to the item also uses the ID pointer itself, not only its name" +msgstr "仅用于ID的RNA集合,对项目的引用也使用 ID 指针本身,而不仅仅是其名称" + + msgid "Operation" msgstr "操作" @@ -29124,18 +30957,42 @@ msgid "Insert After" msgstr "在之后插入" +msgid "Insert a new item into collection after the one referenced in subitem_reference_name/_id or _index" +msgstr "一个参考的若在subitem_reference_name/_id 或者 _index中,集合插入一个新的条目" + + msgid "Insert Before" msgstr "在之前插入" +msgid "Insert a new item into collection before the one referenced in subitem_reference_name/_id or _index (NOT USED)" +msgstr "一个参考的若在subitem_reference_name/_id 或者 _index (NOT USED)中,集合插入一个新的条目" + + +msgid "Subitem Local ID" +msgstr "子条目自身编号" + + +msgid "Collection of IDs only, used to disambiguate between potential IDs with same name from different libraries" +msgstr "仅用于ID的集合,用于消除来自不同库的相同名称,可能会有ID之间的歧义" + + msgid "Subitem Local Index" msgstr "子条目自身编号" +msgid "Used to handle changes into collection" +msgstr "用于控制集合的更改" + + msgid "Subitem Local Name" msgstr "子条目自身名称" +msgid "Subitem Reference ID" +msgstr "子条目引用编号" + + msgid "Subitem Reference Index" msgstr "子条目引用编号" @@ -29253,7 +31110,7 @@ msgstr "解算器" msgid "Solving method selection: automatic damping or manual damping" -msgstr "解算方法选择: 自动衰减或手动衰减" +msgstr "解算方法选择: 自动衰减或手动衰减" msgid "SDLS" @@ -29296,6 +31153,14 @@ msgid "Lower bound for timestep in second in case of automatic substeps" msgstr "时步下限 (单位为'秒'), 用于自动分步" +msgid "Translate Roots" +msgstr "移动根骨" + + +msgid "Translate root (i.e. parentless) bones to the armature origin" +msgstr "将根骨骼(比如没有父级)平移到骨架原点" + + msgid "Auto Step" msgstr "自动步长" @@ -29456,6 +31321,10 @@ msgid "File format expects linear color space" msgstr "文件格式需要线性色彩空间" +msgid "Codec settings for JPEG 2000" +msgstr "JPEG 2000的编码设置" + + msgid "JP2" msgstr "JP2" @@ -29504,10 +31373,18 @@ msgid "Cinema (48)" msgstr "Cinema (48)" +msgid "Use OpenJPEG Cinema Preset (48fps)" +msgstr "使用 OpenJPEG Cinema 预设 (48fps)" + + msgid "Cinema" msgstr "Cinema" +msgid "Use OpenJPEG Cinema Preset" +msgstr "使用 OpenJPEG Cinema 预设" + + msgid "YCC" msgstr "YCC" @@ -29528,6 +31405,10 @@ msgid "Multi-View" msgstr "多视图" +msgid "Single file with all the views" +msgstr "包含所有视图的单个文件" + + msgid "Tile Number" msgstr "分块号" @@ -29652,6 +31533,22 @@ msgid "Cycle the images in the movie" msgstr "在影片中循环图像" +msgid "Index Switch Item" +msgstr "切换条目的索引" + + +msgid "Consistent identifier used for the item" +msgstr "用于条目的一致标识符" + + +msgid "2D Integer Vector Attribute Value" +msgstr "2D 整数矢量属性值" + + +msgid "2D value in geometry attribute" +msgstr "几何属性中的2D值" + + msgid "Integer Attribute Value" msgstr "整型属性值" @@ -30704,21 +32601,37 @@ msgid "Media Play/Pause" msgstr "媒体 播放/暂停" +msgid "⏯" +msgstr "⏯" + + msgctxt "UI_Events_KeyMaps" msgid "Media Stop" msgstr "媒体停止" +msgid "⏹" +msgstr "⏹" + + msgctxt "UI_Events_KeyMaps" msgid "Media First" msgstr "媒体开始" +msgid "⏮" +msgstr "⏮" + + msgctxt "UI_Events_KeyMaps" msgid "Media Last" msgstr "媒体结束" +msgid "⏭" +msgstr "⏭" + + msgctxt "UI_Events_KeyMaps" msgid "Text Input" msgstr "文本输入" @@ -30888,7 +32801,7 @@ msgstr "NdofBack" msgctxt "UI_Events_KeyMaps" msgid "NDOF Isometric 1" -msgstr "NDOF Isometric 1" +msgstr "NDOF 等距 1" msgid "NdofIso1" @@ -32608,6 +34521,11 @@ msgid "Scale of the spatial noise" msgstr "空间噪波比例" +msgctxt "FreestyleLineStyle" +msgid "Smooth" +msgstr "平滑" + + msgid "If true, the spatial noise is smooth" msgstr "若启用, 则平滑显示空间噪波" @@ -32957,10 +34875,20 @@ msgid "Single spline used for defining mask shape" msgstr "选择用于编辑的路径控制点" +msgctxt "Mask" +msgid "Feather Offset" +msgstr "羽化偏移" + + msgid "The method used for calculating the feather offset" msgstr "用于计算效果作用力的方向" +msgctxt "Mask" +msgid "Even" +msgstr "均匀" + + msgid "Calculate even feather offset" msgstr "计算羽化偏移" @@ -32977,6 +34905,11 @@ msgid "Make this spline a closed loop" msgstr "使该样条成为闭合的循环" +msgctxt "Mask" +msgid "Fill" +msgstr "填充" + + msgid "Make this spline filled" msgstr "将样条封闭" @@ -33105,18 +35038,38 @@ msgid "Color for filling region bounded by each stroke" msgstr "由各笔画限定人填充区域的颜色" +msgctxt "GPencil" +msgid "Fill Style" +msgstr "填充样式" + + msgid "Select style used to fill strokes" msgstr "选择用于填充笔画的样式" +msgctxt "GPencil" +msgid "Solid" +msgstr "实体" + + msgid "Fill area with solid color" msgstr "实色填充区域" +msgctxt "GPencil" +msgid "Gradient" +msgstr "渐变" + + msgid "Fill area with gradient color" msgstr "使用渐变色填充区域" +msgctxt "GPencil" +msgid "Texture" +msgstr "纹理" + + msgid "Fill area with image texture" msgstr "用图像纹理填充区域" @@ -33234,6 +35187,11 @@ msgid "Show stroke lines of this material" msgstr "显示此材质的笔画线" +msgctxt "GPencil" +msgid "Stroke Style" +msgstr "笔画样式" + + msgid "Select style used to draw strokes" msgstr "选择用于绘制笔画的样式" @@ -33310,6 +35268,10 @@ msgid "Editor menu containing buttons" msgstr "包含按钮的编辑器菜单" +msgid "Bone Collection Specials" +msgstr "骨骼集合专用项" + + msgid "Asset" msgstr "资源" @@ -33408,6 +35370,14 @@ msgid "Add Attribute" msgstr "添加属性" +msgid "Light Linking Specials" +msgstr "灯光链接专用项" + + +msgid "Shadow Linking Specials" +msgstr "阴影链接专用项" + + msgid "Channel" msgstr "通道" @@ -33424,6 +35394,10 @@ msgid "Bookmarks Specials" msgstr "书签专用项" +msgid "Recent Items Specials" +msgstr "最近条目专用项" + + msgid "Files" msgstr "文件" @@ -33452,6 +35426,10 @@ msgid "Move to Layer" msgstr "移动到层" +msgid "Add Extra" +msgstr "添加额外" + + msgid "Select Linked" msgstr "选择相连元素" @@ -33498,6 +35476,10 @@ msgid "Vertex Group Specials" msgstr "特殊顶点组" +msgid "NLA" +msgstr "NLA" + + msgid "Strip" msgstr "片段" @@ -33514,8 +35496,12 @@ msgid "Primitives" msgstr "基本体" +msgid "Adjust" +msgstr "校正" + + msgid "Keying" -msgstr "抠像(插帧)" +msgstr "抠像" msgid "Tracking" @@ -33563,6 +35549,10 @@ msgid "Node Color Specials" msgstr "指定节点颜色" +msgid "Node Tree Interface Specials" +msgstr "节点树界面专用项" + + msgid "Add Modifier" msgstr "添加修改器" @@ -33616,6 +35606,15 @@ msgid "Navigation" msgstr "视图切换" +msgid "Sequencer Preview" +msgstr "序列编辑器预览" + + +msgctxt "Operator" +msgid "Retiming" +msgstr "重定时" + + msgid "Select Channel" msgstr "选择通道" @@ -33636,6 +35635,10 @@ msgid "Movie Strip" msgstr "影片片段" +msgid "Retiming" +msgstr "重定时" + + msgid "Cache" msgstr "缓存" @@ -33940,6 +35943,10 @@ msgid "Operator Presets" msgstr "操作项预设" +msgid "Region Toggle" +msgstr "区域切换" + + msgid "Splash" msgstr "显示欢迎画面" @@ -34016,10 +36023,18 @@ msgid "Bitangent" msgstr "双切向" +msgid "Bitangent vector of this vertex for this face (must be computed beforehand using calc_tangents, use it only if really needed, slower access than bitangent_sign)" +msgstr "用于此多边形的此顶点的双切向矢量 (必须使用 calc_tangents 执行预计算, *仅在需要时使用*, 存取速度慢于 bitangent_sign)" + + msgid "Bitangent Sign" msgstr "双切向标记" +msgid "Sign of the bitangent vector of this vertex for this face (must be computed beforehand using calc_tangents, bitangent = bitangent_sign * cross(normal, tangent))" +msgstr "此多边形的顶点的双切向矢量标记 (必须使用 calc_tangents 执行预计算, bitangent = bitangent_sign * cross(normal, tangent))" + + msgid "Edge index" msgstr "边线编号" @@ -34028,6 +36043,14 @@ msgid "Index of this loop" msgstr "此循环结构的顶点编号" +msgid "The normal direction of the face corner, taking into account sharp faces, sharp edges, and custom normal data" +msgstr "面拐角的法线方向,考虑锐面、锐边和自定义法线数据" + + +msgid "Local space unit length tangent vector of this vertex for this face (must be computed beforehand using calc_tangents)" +msgstr "此多边形的词顶点的局部空间单位长度的切向裂解矢量 (必须使用 calc_tangents 执行预计算)" + + msgid "Vertex index" msgstr "顶点编号" @@ -34108,10 +36131,18 @@ msgid "Polygon" msgstr "多边形" +msgid "Index of mesh face that the triangle is a part of" +msgstr "三角形所属的网格面的编号" + + msgid "Split Normals" msgstr "翻转法线" +msgid "Local space unit length split normal vectors of the face corners of this triangle" +msgstr "此三角形的局部空间单位长度的法向矢量" + + msgid "Indices of triangle vertices" msgstr "三角面顶点编号" @@ -34148,22 +36179,50 @@ msgid "Polygon Area" msgstr "多边形区域" +msgid "Read only area of this face" +msgstr "只读取此面的区域(面积)" + + msgid "Polygon Center" msgstr "多边形中心" +msgid "Center of this face" +msgstr "该面中心" + + +msgid "Index of this face" +msgstr "该面的编号" + + msgid "Loop Start" msgstr "循环起点" +msgid "Index of the first loop of this face" +msgstr "此面的首个循环编号" + + msgid "Loop Total" msgstr "总循环数" +msgid "Number of loops used by this face" +msgstr "该面使用的循环数量" + + +msgid "Material slot index of this face" +msgstr "该面的材质槽编号" + + msgid "Polygon Normal" msgstr "多边形法线" +msgid "Local space unit length normal vector for this face" +msgstr "此三角形的局部空间单位长度的法向矢量" + + msgid "Freestyle Face Mark" msgstr "Freestyle 面标记" @@ -34184,6 +36243,10 @@ msgid "Active Polygon" msgstr "活动多边形" +msgid "The active face for this mesh" +msgstr "此网格的活动面" + + msgid "Skin Vertex" msgstr "蒙皮顶点" @@ -34244,6 +36307,14 @@ msgid "Overhang Min" msgstr "最小悬垂" +msgid "Sharpness Max" +msgstr "最大锐度" + + +msgid "Sharpness Min" +msgstr "最小锐度" + + msgid "Thickness Max" msgstr "最打厚度" @@ -34448,6 +36519,10 @@ msgid "Stiffness defines how much of the element to fill" msgstr "刚度定义了元素的充实程度" +msgid "Metaball type" +msgstr "融球类型" + + msgid "Ball" msgstr "球" @@ -35504,6 +37579,10 @@ msgid "Lambda Factor" msgstr "Lambda 系数" +msgid "Smooth effect factor" +msgstr "平滑效果系数" + + msgid "Bind current shape" msgstr "绑定当前形状" @@ -35672,6 +37751,10 @@ msgid "Poly Data Types" msgstr "多边形数据类型" +msgid "Which face data layers to transfer" +msgstr "要传输的面数据层" + + msgid "Transfer flat/smooth mark" msgstr "传递平直/光滑标记" @@ -35840,14 +37923,26 @@ msgid "Nearest Corner of Nearest Face" msgstr "最近面的最近拐角" +msgid "Copy from nearest corner of nearest face" +msgstr "从最近面的最近拐角复制" + + msgid "Nearest Face Interpolated" msgstr "最近的面插值" +msgid "Copy from interpolated corners of the nearest source face" +msgstr "从最近源面的插值拐角复制" + + msgid "Projected Face Interpolated" msgstr "投影面插值" +msgid "Copy from interpolated corners of the source face hit by corner normal projection" +msgstr "从拐角法线投影命中的源面的插值拐角进行复制" + + msgid "Max Distance" msgstr "最大距离" @@ -35920,10 +38015,18 @@ msgid "Nearest Face" msgstr "最近的面" +msgid "Copy from nearest face (using center points)" +msgstr "从最近的面复制(使用中心点)" + + msgid "Best Normal-Matching" msgstr "最匹配法向" +msgid "Copy from source face which normal is the closest to destination one" +msgstr "从法线最接近目标面的源面复制" + + msgid "Interpolate all source polygons intersected by the projection of destination one along its own normal" msgstr "沿目标法向与目标物体的投影相交的所有源多边形进行插值" @@ -36252,6 +38355,21 @@ msgid "Dynamic Paint modifier" msgstr "动态绘画修改器" +msgctxt "Simulation" +msgid "Type" +msgstr "类型" + + +msgctxt "Simulation" +msgid "Canvas" +msgstr "画布" + + +msgctxt "Simulation" +msgid "Brush" +msgstr "笔刷" + + msgid "EdgeSplit Modifier" msgstr "锐边修改器" @@ -36616,6 +38734,10 @@ msgid "Interior Band Width" msgstr "内部带宽" +msgid "Width of the gradient inside of the mesh" +msgstr "网格内部渐变的宽度" + + msgid "Resolution Mode" msgstr "分辨率模式" @@ -36904,6 +39026,18 @@ msgid "Node group that controls what this modifier does" msgstr "控制此修改器功用的节点组" +msgid "Show Node Group" +msgstr "阴影节点组" + + +msgid "Simulation Bake Directory" +msgstr "模拟烘焙的目录" + + +msgid "Location on disk where the bake data is stored" +msgstr "磁盘上存储烘焙数据的位置" + + msgid "Normal Edit Modifier" msgstr "法向编辑修改器" @@ -37553,6 +39687,11 @@ msgid "Deform around local axis" msgstr "沿局部轴向形变" +msgctxt "Operator" +msgid "Mode" +msgstr "模式" + + msgctxt "Operator" msgid "Twist" msgstr "扭曲" @@ -37571,10 +39710,20 @@ msgid "Bend the mesh over the Z axis of the modifier space" msgstr "沿修改器空间的 Z 轴执行网格弯曲" +msgctxt "Operator" +msgid "Taper" +msgstr "锥化" + + msgid "Linearly scale along Z axis of the modifier space" msgstr "沿修改器空间的 Z 轴执行线性缩放" +msgctxt "Operator" +msgid "Stretch" +msgstr "拉伸" + + msgid "Stretch the object along the Z axis of the modifier space" msgstr "沿修改器坐标空间的 Z 轴进行拉伸" @@ -37715,6 +39864,11 @@ msgid "Offset material index of generated rim faces" msgstr "所生成凸面的偏移材质编号" +msgctxt "Mesh" +msgid "Boundary Shape" +msgstr "边界形状" + + msgid "Selects the boundary adjustment algorithm" msgstr "选择边界调整算法" @@ -37728,10 +39882,20 @@ msgid "No shape correction" msgstr "无形状校正" +msgctxt "Mesh" +msgid "Round" +msgstr "圆形" + + msgid "Round open perimeter shape" msgstr "对开放边缘形状倒圆角" +msgctxt "Mesh" +msgid "Flat" +msgstr "平展" + + msgid "Flat open perimeter shape" msgstr "平整开放边缘形状" @@ -37832,6 +39996,10 @@ msgid "Flat Faces" msgstr "平直面" +msgid "Make faces use the minimal vertex weight assigned to their vertices (ensures new faces remain parallel to their original ones, slow, disable when not needed)" +msgstr "让面使用顶点中最小的顶点权重(保证新的面与已有的面平行,较慢,不需要时可禁用)" + + msgid "Flip Normals" msgstr "翻转法线" @@ -38631,6 +40799,10 @@ msgid "Y coordinate of the start position" msgstr "起始位置的 Y 坐标" +msgid "Either the starting frame (for positive speed) or ending frame (for negative speed)" +msgstr "起始帧(表示正速度)或终止帧(表示负速度)" + + msgid "Cyclic wave effect" msgstr "周期性的波浪效果" @@ -40200,6 +42372,14 @@ msgid "F-Curves for controlling the strip's influence and timing" msgstr "用于操控片段的影响与时序的函数曲线" +msgid "End Frame (raw value)" +msgstr "结束帧(原始值)" + + +msgid "Same as frame_end, except that any value can be set, including ones that create an invalid state" +msgstr "与frame_end相同,除了可以设置任何值,包括创建无效状态的值" + + msgid "End Frame (manipulated from UI)" msgstr "结束帧(从 UI 操作)" @@ -40208,6 +42388,14 @@ msgid "End frame of the NLA strip. Note: changing this value also updates the va msgstr "NLA 片段的结束帧。注意:更改此值也会更新片段重复或其动作结束帧的值。如果只应更改结束帧,请参阅“frame_end”属性" +msgid "Start Frame (raw value)" +msgstr "起始帧 (raw value)" + + +msgid "Same as frame_start, except that any value can be set, including ones that create an invalid state" +msgstr "与frame_start相同,除了可以设置任何值,包括创建无效状态的值" + + msgid "Start Frame (manipulated from UI)" msgstr "起始帧(从 UI 操作)" @@ -40478,7 +42666,7 @@ msgstr "在视图纹理着色模式下显示节点" msgid "Node type (deprecated, use bl_static_type or bl_idname for the actual identifier string)" -msgstr "节点类型 (不建议使用此项, 建议为实际的标识符字串使用 bl_static_type 或 bl_idname)" +msgstr "节点类型 (不建议使用此项, 建议为实际的标识符字串使用 bl_static_type 或 bl_idname)" msgid "Use custom color for the node" @@ -40502,7 +42690,7 @@ msgstr "合成器节点" msgid "Alpha Over" -msgstr "Alpha 上叠" +msgstr "Alpha上叠" msgid "Convert Premultiplied" @@ -40557,6 +42745,51 @@ msgid "Relative Size Y" msgstr "Y 向相对尺寸" +msgctxt "NodeTree" +msgid "Filter Type" +msgstr "滤镜类型" + + +msgctxt "NodeTree" +msgid "Flat" +msgstr "平展模糊" + + +msgctxt "NodeTree" +msgid "Tent" +msgstr "Tent(帐篷模糊)" + + +msgctxt "NodeTree" +msgid "Quadratic" +msgstr "二次模糊" + + +msgctxt "NodeTree" +msgid "Cubic" +msgstr "立方模糊" + + +msgctxt "NodeTree" +msgid "Gaussian" +msgstr "高斯模糊" + + +msgctxt "NodeTree" +msgid "Fast Gaussian" +msgstr "快速高斯模糊" + + +msgctxt "NodeTree" +msgid "Catrom" +msgstr "catmull-rom模糊" + + +msgctxt "NodeTree" +msgid "Mitch" +msgstr "Mitch模糊" + + msgid "Bokeh" msgstr "散景" @@ -40673,6 +42906,10 @@ msgid "Y position of the middle of the box" msgstr "矩形盒中心的 Y 位置" +msgid "Brightness/Contrast" +msgstr "亮度 / 对比度" + + msgid "Keep output image premultiplied alpha" msgstr "保留输出图像预乘alpha" @@ -40754,7 +42991,7 @@ msgstr "Alpha 衰减" msgid "Lift" -msgstr "Lift" +msgstr "提升" msgid "Alpha lift" @@ -40790,11 +43027,11 @@ msgstr "校正规则" msgid "Lift/Gamma/Gain" -msgstr "Lift/Gamma/Gain" +msgstr "提升/伽玛/增益" msgid "Offset/Power/Slope (ASC-CDL)" -msgstr "Offset/Power/Slope (ASC-CDL)" +msgstr "偏移/能量/斜率 (ASC-CDL)" msgid "ASC-CDL standard color correction" @@ -41173,6 +43410,10 @@ msgid "Colors are treated alpha premultiplied, or colors output straight (alpha msgstr "经预乘Alpha处理的颜色, 或输出为直接alpha的颜色 (alpha值设为1)" +msgid "Convert Colorspace" +msgstr "转换颜色空间" + + msgid "From" msgstr "从" @@ -41466,7 +43707,7 @@ msgstr "处理 HDR 图像" msgid "Despeckle" -msgstr "去噪" +msgstr "去斑" msgid "Threshold for detecting pixels to despeckle" @@ -41501,6 +43742,11 @@ msgid "Distance to grow/shrink (number of iterations)" msgstr "扩张/收缩的距离 (迭代次数)" +msgctxt "Image" +msgid "Edge" +msgstr "边" + + msgid "Edge to inset" msgstr "插入的边线" @@ -41717,6 +43963,10 @@ msgid "Hue Correct" msgstr "色相校正" +msgid "Hue/Saturation/Value" +msgstr "色相/饱和度/明度" + + msgid "ID Mask" msgstr "ID 遮罩" @@ -41745,6 +43995,10 @@ msgid "Distance to inpaint (number of iterations)" msgstr "瑕疵修复间隔 (迭代次数)" +msgid "Invert Color" +msgstr "反色" + + msgid "Post Blur" msgstr "后期模糊" @@ -41838,14 +44092,50 @@ msgid "Tracking Object" msgstr "追踪物体" +msgid "Kuwahara" +msgstr "Kuwahara" + + msgid "Eccentricity" msgstr "偏移" +msgid "Controls how directional the filter is. 0 means the filter is completely omnidirectional while 2 means it is maximally directed along the edges of the image" +msgstr "控制滤镜方向,0表示滤镜完全全向,2表示它最大地沿着图像的边缘定向" + + +msgid "Controls the sharpness of the filter. 0 means completely smooth while 1 means completely sharp" +msgstr "控制滤镜的锐度, 0 表示完全平滑,1 表示完全锐利" + + +msgid "Uniformity" +msgstr "一致性" + + +msgid "Controls the uniformity of the direction of the filter. Higher values produces more uniform directions" +msgstr "控制滤镜方向的均匀性, 值越高,方向越平均" + + +msgid "Variation of Kuwahara filter to use" +msgstr "使用Kuwahara 滤镜的形式" + + +msgid "Classic" +msgstr "经典" + + +msgid "Fast but less accurate variation" +msgstr "快速但变化不太精确" + + msgid "Anisotropic" msgstr "各向异性过滤" +msgid "Accurate but slower variation" +msgstr "准确但是慢" + + msgid "Lens Distortion" msgstr "镜头畸变" @@ -42180,7 +44470,7 @@ msgstr "大于或等于 A 的最小整数" msgctxt "NodeTree" msgid "Truncate" -msgstr "截短" +msgstr "截断" msgid "The integer part of A, removing fractional digits" @@ -42196,6 +44486,24 @@ msgid "The fraction part of A" msgstr "A的分数部分" +msgctxt "NodeTree" +msgid "Truncated Modulo" +msgstr "截断模数" + + +msgid "The remainder of truncated division using fmod(A,B)" +msgstr "使用 fmod(A,B) 进行截断除法的余数" + + +msgctxt "NodeTree" +msgid "Floored Modulo" +msgstr "向下取模" + + +msgid "The remainder of floored division" +msgstr "向下取整的余数" + + msgctxt "NodeTree" msgid "Wrap" msgstr "循环" @@ -42216,7 +44524,7 @@ msgstr "吸附到增量,snap(A,B)" msgctxt "NodeTree" msgid "Ping-Pong" -msgstr "Ping-Pong" +msgstr "乒–乓" msgid "Wraps a value and reverses every other cycle (A,B)" @@ -42412,7 +44720,7 @@ msgstr "将预乘型转换为直通型" msgid "RGB to BW" -msgstr "RGB -> BW" +msgstr "去色" msgid "Render Layers" @@ -42520,7 +44828,7 @@ msgstr "切换" msgid "Off: first socket, On: second socket" -msgstr "关闭: 第一个接口, 开启: 第二个接口" +msgstr "关闭:第一个接口, 开启:第二个接口" msgid "Switch View" @@ -42583,10 +44891,18 @@ msgid "R/D Photoreceptor" msgstr "R/D 感光器" +msgid "More advanced algorithm based on eye physiology, by Reinhard and Devlin" +msgstr "基于眼睛生理学的更先进算法,作者:Reinhard 和 Devlin" + + msgid "Rh Simple" msgstr "Rh 单相" +msgid "Simpler photographic algorithm by Reinhard" +msgstr "Reinhard 更简单的摄影算法" + + msgid "Track Position" msgstr "追踪位置" @@ -42803,6 +45119,10 @@ msgid "Rotate around the local Z axis" msgstr "绕局部 Z轴旋转" +msgid "Axis Angle to Rotation" +msgstr "轴旋转角度" + + msgid "Boolean Math" msgstr "布尔运算" @@ -42848,7 +45168,7 @@ msgstr "相等" msgid "True when both inputs are equal (exclusive nor)" -msgstr "当两个输入相等时为真(同门)" +msgstr "当两个输入相等时为真(同或)" msgid "Not Equal" @@ -43089,6 +45409,10 @@ msgid "Instances of objects or collections" msgstr "物体或集合的实例" +msgid "Grease Pencil component containing layers and curves data" +msgstr "包含图层和曲线数据的蜡笔组件" + + msgid "Attribute Statistic" msgstr "属性统计" @@ -43549,10 +45873,18 @@ msgid "Edge Paths to Curves" msgstr "边路径到曲线" +msgid "Output curves following paths across mesh edges" +msgstr "沿着网格边线的路径输出曲线" + + msgid "Edge Paths to Selection" msgstr "边路径到选中项" +msgid "Output a selection of edges by following paths across mesh edges" +msgstr "通过沿网格边上的路径输出所选边" + + msgid "Edges of Corner" msgstr "拐角边" @@ -43698,6 +46030,22 @@ msgid "Cubic interpolation" msgstr "三次插值" +msgid "Index of Nearest" +msgstr "最近编号" + + +msgid "Find the nearest element in a group. Similar to the \"Sample Nearest\" node" +msgstr "在组中查找最近的元素,类似于“采样最近”节点" + + +msgid "Index Switch" +msgstr "编号切换" + + +msgid "Choose between an arbitrary number of values with an index" +msgstr "在任意数量的编号之间进行切换选择" + + msgid "Curve Handle Positions" msgstr "曲线控制柄位置" @@ -43822,6 +46170,14 @@ msgid "The data type used to read the attribute values" msgstr "用于读取属性值的数据类型" +msgid "Named Layer Selection" +msgstr "指定图层选择" + + +msgid "Output a selection of a grease pencil layer" +msgstr "输出蜡笔图层的选集" + + msgid "Retrieve a unit length vector indicating the direction pointing away from the geometry at each element" msgstr "检索单位长度矢量,指示指向远离几何体的每个元素的方向" @@ -43842,6 +46198,10 @@ msgid "Shortest Edge Paths" msgstr "最短边路径" +msgid "Find the shortest paths along mesh edges to selected end vertices, with customizable cost per edge" +msgstr "沿网格边查找选定的结束顶点的最短路径,可自定义每条边的评估" + + msgid "Is Spline Cyclic" msgstr "是否闭合样条线" @@ -44118,6 +46478,10 @@ msgid "Retrieve a point index within a curve" msgstr "检索点在曲线内的编号" +msgid "Split all points to curve by its group ID and reorder by weight" +msgstr "按组 ID 将所有点拆分为曲线,并按权重重新排序" + + msgid "Points to Vertices" msgstr "点 -> 顶点" @@ -44206,6 +46570,18 @@ msgid "Delete an attribute with a specified name from a geometry. Typically used msgstr "从几何体中删除具有指定名称的属性。通常用于优化性能" +msgid "Repeat Input" +msgstr "重复输入" + + +msgid "Zone output node that this input node is paired with" +msgstr "区域输出节点,此输入节点已配对" + + +msgid "Iteration index that is used by inspection features like the viewer node or socket inspection" +msgstr "检查功能使用的迭代索引,如查看器节点或接口检查" + + msgid "Replace Material" msgstr "替换材质" @@ -44298,6 +46674,10 @@ msgid "Sample Nearest" msgstr "采样最近" +msgid "Find the element of a geometry closest to a position. Similar to the \"Index of Nearest\" node" +msgstr "查找最接近某个位置的几何元素,类似于“最近编号”节点" + + msgid "Sample Nearest Surface" msgstr "采样最近的表面" @@ -44498,6 +46878,18 @@ msgid "Control how many evaluated points should be generated on every curve segm msgstr "控制每个曲线段上应生成多少个评估点" +msgid "Simulation Input" +msgstr "模拟输入" + + +msgid "Input data for the simulation zone" +msgstr "用于模拟区域的输入数据" + + +msgid "Simulation Output" +msgstr "模拟输出" + + msgid "Spline Length" msgstr "样条线长度" @@ -44522,6 +46914,14 @@ msgid "Duplicate mesh edges and break connections with the surrounding faces" msgstr "复制网格边,并断开与周围面的连接" +msgid "Split to Instances" +msgstr "拆分为实例" + + +msgid "Create separate geometries containing the elements from the same group" +msgstr "创建包含来自相同组元素的分离几何体" + + msgid "Store Named Attribute" msgstr "存储已命名属性" @@ -44630,10 +47030,42 @@ msgid "Switch between two inputs" msgstr "在两个输入之间切换" +msgid "The scene's 3D cursor location and rotation" +msgstr "场景3D光标的位置和旋转" + + +msgid "Face Set" +msgstr "面组" + + +msgid "Each face's sculpt face set value" +msgstr "每个面的雕刻面组的值" + + msgid "Selection" msgstr "选中项" +msgid "User selection of the edited geometry, for tool execution" +msgstr "用户选择编辑的几何图形,用于工具执行" + + +msgid "Set Face Set" +msgstr "设置面组" + + +msgid "Set sculpt face set values for faces" +msgstr "设置面的雕刻面组的值" + + +msgid "Set Selection" +msgstr "设置选择" + + +msgid "Set selection of the edited geometry, for tool execution" +msgstr "设置已编辑几何体的选择,用于工具执行" + + msgid "Transform Geometry" msgstr "变换几何体" @@ -44927,6 +47359,10 @@ msgid "Multiscatter GGX" msgstr "多重散射GGX" +msgid "GGX with additional correction to account for multiple scattering, preserve energy and prevent unexpected darkening at high roughness" +msgstr "GGX 结合多重散射的额外修正,节省能量并防止在高粗糙度下意外变暗" + + msgid "Diffuse BSDF" msgstr "漫射 BSDF" @@ -44975,6 +47411,30 @@ msgid "Physically-based, easy-to-use shader for rendering hair and fur" msgstr "基于物理、易于使用的着色器,用于渲染头发和皮毛" +msgid "Scattering model" +msgstr "散射模型" + + +msgid "Select from Chiang or Huang model" +msgstr "选择Chiang 或者Huang模型" + + +msgid "Chiang" +msgstr "Chiang" + + +msgid "Near-field hair scattering model by Chiang et al. 2016, suitable for close-up looks, but is more noisy when viewing from a distance" +msgstr "Chiang等人在2016年提出的近场毛发散射模型,适合近距离观察,但远距离观察时噪点较多" + + +msgid "Huang" +msgstr "Huang" + + +msgid "Far-field hair scattering model by Huang et al. 2022, suitable for viewing from a distance, supports elliptical cross-sections and has more precise highlight in forward scattering directions" +msgstr "Huang 等人在2022年提出的远场毛发散射模型 ,适合远距离观察,支持椭圆截面,在前向散射方向有更精确的高光" + + msgid "Color Parametrization" msgstr "颜色参数化" @@ -45039,6 +47499,10 @@ msgid "Volumetric approximation to physically based volume scattering, using the msgstr "使用指定散射半径,对基于物理的体积散射的体积近似" +msgid "Random Walk (Skin)" +msgstr "随机游走(皮肤)" + + msgid "Refraction BSDF" msgstr "折射 BSDF" @@ -45047,6 +47511,10 @@ msgid "Glossy refraction with sharp or microfacet distribution, typically used f msgstr "具有锐利或微有面元分布的光面折射,通常用于透光的材质" +msgid "Sheen BSDF" +msgstr "边缘光泽 BSDF" + + msgid "" "Reflection for materials such as cloth.\n" "Typically mixed with other shaders (such as a Diffuse Shader) and is not particularly useful on its own" @@ -45055,6 +47523,26 @@ msgstr "" "通常与其他着色器(如漫反射着色器)混合使用,单独使用并不是特别有用" +msgid "Sheen shading model" +msgstr "边缘光泽着色模型" + + +msgid "Ashikhmin" +msgstr "Ashikhmin" + + +msgid "Classic Ashikhmin velvet (legacy model)" +msgstr "经典Ashikhmin天鹅绒(旧版模型)" + + +msgid "Microfiber" +msgstr "Microfiber(超细纤维)" + + +msgid "Microflake-based model of multiple scattering between normal-oriented fibers" +msgstr "基于Microflake的法线取向纤维间多重散射模型" + + msgid "Toon BSDF" msgstr "卡通 BSDF" @@ -45192,7 +47680,7 @@ msgstr "与原理化BSDF 节点类似,但使用镜面反射工作流而非金 msgid "Emission" -msgstr "自发光(发射)" +msgstr "自发光" msgid "Lambertian emission shader" @@ -45244,7 +47732,7 @@ msgstr "在 HSV 颜色模型中应用颜色变换" msgid "Invert a color, producing a negative" -msgstr "反转颜色,产生负片" +msgstr "反转颜色,产生负片效果" msgid "Layer Weight" @@ -45491,6 +47979,10 @@ msgid "Use shaders for all renderers and viewports, unless there exists a more s msgstr "对所有渲染器和视口使用着色器,除非存在更具体的输出" +msgid "Use shaders for EEVEE renderer" +msgstr "为EEVEE渲染器使用此着色器" + + msgid "Cycles" msgstr "Cycles" @@ -45547,6 +48039,14 @@ msgid "Convert a color's luminance to a grayscale value" msgstr "将颜色的亮度转换为灰度值" +msgid "" +"Generate an OSL shader from a file or text data-block.\n" +"Note: OSL shaders are not supported on all GPU backends" +msgstr "" +"从文件或文本数据块生成 OSL 着色器。\n" +"注意:GPU 不支持 OSL 着色器" + + msgid "Bytecode" msgstr "字节码" @@ -45619,6 +48119,14 @@ msgid "Shader to RGB" msgstr "Shader --> RGB" +msgid "" +"Convert rendering effect (such as light and shadow) to color. Typically used for non-photorealistic rendering, to apply additional effects on the output of BSDFs.\n" +"Note: only supported in EEVEE" +msgstr "" +"将渲染效果(如光和阴影)转换为颜色。通常用于非照片级真实感渲染,以对 BSDF 的输出应用其他效果。\n" +"注意:仅支持 EEVEE" + + msgid "Squeeze Value" msgstr "挤压值" @@ -45807,6 +48315,11 @@ msgid "Sample an image file as a texture" msgstr "将图像文件作为纹理进行采样" +msgctxt "Image" +msgid "Projection" +msgstr "投影" + + msgid "Method to project 2D image on object with a 3D texture vector" msgstr "使用3D纹理矢量向物体投射2D图像的方法" @@ -45819,10 +48332,20 @@ msgid "Image is projected using different components for each side of the object msgstr "使用不同的组件向物体空间边界框的各个面投射图像" +msgctxt "Image" +msgid "Sphere" +msgstr "球状" + + msgid "Image is projected spherically using the Z axis as central" msgstr "使用Z轴作为中心对图像进行球形投射" +msgctxt "Image" +msgid "Tube" +msgstr "管形" + + msgid "Image is projected from the tube using the Z axis as central" msgstr "使用Z轴作为中心,将图像从圆柱形进行投影" @@ -45867,6 +48390,14 @@ msgid "Use the 4D vector (X, Y, Z, W) as input" msgstr "使用四维矢量 (X, Y, Z, W) 作为输入" +msgid "Normalize outputs to 0.0 to 1.0 range" +msgstr "将输出规格化为 0.0 到 1.0 之间" + + +msgid "Type of the Noise texture" +msgstr "噪波纹理类型" + + msgid "More uneven result (varies with location), more similar to a real terrain" msgstr "更不均匀的结果(随位置变化),更类似于真实地形" @@ -45879,6 +48410,10 @@ msgid "Create peaks and valleys with different roughness values" msgstr "创建具有不同粗糙度值的峰和谷" +msgid "The standard fractal Perlin noise" +msgstr "标准分形噪声" + + msgid "Similar to Hybrid Multifractal creates a heterogeneous terrain, but with the likeness of river channels" msgstr "类似于混合式多重分形,可创建异质的地形,但具有河道的相似性" @@ -46195,6 +48730,10 @@ msgid "Computes the radius of the n-sphere inscribed in the voronoi cell" msgstr "计算在沃罗诺伊单元中刻入的 n 球体的半径" +msgid "Normalize output Distance to 0.0 to 1.0 range" +msgstr "将输出距离规格化为 0.0 至 1.0 之间" + + msgid "Wave Texture" msgstr "波浪纹理" @@ -46327,6 +48866,10 @@ msgid "World space vector displacement mapping" msgstr "世界空间矢量转换映射" +msgid "Vector Math" +msgstr "矢量运算" + + msgid "Perform vector math operation" msgstr "执行矢量数学运算" @@ -46339,42 +48882,92 @@ msgid "Entry-wise divide" msgstr "逐项相除" +msgctxt "NodeTree" +msgid "Cross Product" +msgstr "叉乘" + + msgid "A cross B" msgstr "A叉乘B" +msgctxt "NodeTree" +msgid "Project" +msgstr "投影" + + msgid "Project A onto B" msgstr "A投影至B" +msgctxt "NodeTree" +msgid "Reflect" +msgstr "反射" + + msgid "Reflect A around the normal B. B doesn't need to be normalized" msgstr "沿向量B反射向量A,B不需要归一化" +msgctxt "NodeTree" +msgid "Refract" +msgstr "折射" + + msgid "For a given incident vector A, surface normal B and ratio of indices of refraction, Ior, refract returns the refraction vector, R" msgstr "对于给定的入射向量A、表面法向 B 和折射率 Ior,折射返回折射向量R" +msgctxt "NodeTree" +msgid "Faceforward" +msgstr "面朝前" + + msgid "Orients a vector A to point away from a surface B as defined by its normal C. Returns (dot(B, C) < 0) ? A : -A" msgstr "Orients a vector A to point away from a surface B as defined by its normal C. 返回 (dot(B, C) < 0) ? A : -A" +msgctxt "NodeTree" +msgid "Dot Product" +msgstr "点乘" + + msgid "A dot B" msgstr "A点乘B" +msgctxt "NodeTree" +msgid "Distance" +msgstr "距离" + + msgid "Distance between A and B" msgstr "A与B的间距" +msgctxt "NodeTree" +msgid "Length" +msgstr "长度" + + msgid "Length of A" msgstr "A的长度" +msgctxt "NodeTree" +msgid "Scale" +msgstr "缩放" + + msgid "A multiplied by Scale" msgstr "A以比例" +msgctxt "NodeTree" +msgid "Normalize" +msgstr "规格化" + + msgid "Normalize A" msgstr "规格化A" @@ -46556,6 +49149,11 @@ msgstr "" "注意:由于网格在由 Cycles 处理之前会进行三角化,因此拓扑将始终显示为三角化" +msgctxt "Unit" +msgid "Pixel Size" +msgstr "像素尺寸" + + msgid "Use screen pixel size instead of world units" msgstr "使用屏幕像素大小而非世界单位" @@ -46600,6 +49198,18 @@ msgid "Value to Normal" msgstr "值转法线" +msgid "Collection of repeat items" +msgstr "重复条目的集合" + + +msgid "Collection of simulation items" +msgstr "模拟条目的集合" + + +msgid "Collection of index_switch items" +msgstr "'编号切换 ' 条目的集合" + + msgid "Node Inputs" msgstr "节点输入" @@ -46736,6 +49346,14 @@ msgid "Label to display for the socket type in the UI" msgstr "用于显示UI中接口类型的标签" +msgid "Subtype Label" +msgstr "子类型标签" + + +msgid "Label to display for the socket subtype in the UI" +msgstr "界面上接口子类型的标签" + + msgid "Tooltip" msgstr "工具提示" @@ -46920,6 +49538,14 @@ msgid "Object socket of a node" msgstr "一个节点的物体接口" +msgid "Rotation Node Socket" +msgstr "节点接口旋转" + + +msgid "Rotation value socket of a node" +msgstr "节点接口的旋转值" + + msgid "Shader Node Socket" msgstr "着色器节点接口" @@ -46960,6 +49586,90 @@ msgid "Virtual socket of a node" msgstr "节点的虚拟接口" +msgid "Node Tree Interface" +msgstr "节点树界面" + + +msgid "Declaration of sockets and ui panels of a node group" +msgstr "接口和节点组的界面面板的声明" + + +msgid "Active item" +msgstr "活动项" + + +msgid "Active Index" +msgstr "活动编号" + + +msgid "Items in the node interface" +msgstr "节点界面中的条目" + + +msgid "Node Tree Interface Item" +msgstr "节点树界面条目" + + +msgid "Item in a node tree interface" +msgstr "节点树界面中的条目" + + +msgid "Global index of the item among all items in the interface" +msgstr "该条目在界面所有条目中的全局索引" + + +msgid "Item Type" +msgstr "条目类型" + + +msgid "Type of interface item" +msgstr "界面条目的类型" + + +msgid "Socket" +msgstr "接口" + + +msgid "Panel that contains the item" +msgstr "包含该条目的面板" + + +msgid "Position of the item in its parent panel" +msgstr "该项目在其父级面板中的位置" + + +msgid "Declaration of a node panel" +msgstr "节点面板的声明" + + +msgid "Default Closed" +msgstr "默认关闭" + + +msgid "Panel is closed by default on new nodes" +msgstr "默认情况下,面板在新节点上处于关闭状态" + + +msgid "Panel description" +msgstr "面板描述" + + +msgid "Items in the node panel" +msgstr "节点面板中的条目" + + +msgid "Panel name" +msgstr "面板名称" + + +msgid "Node Tree Interface Socket" +msgstr "节点树界面接口" + + +msgid "Declaration of a node socket" +msgstr "节点接口声明" + + msgid "Attribute Domain" msgstr "属性域" @@ -46968,6 +49678,14 @@ msgid "Attribute domain used by the geometry nodes modifier to create an attribu msgstr "几何节点修改器用于创建属性输出的属性域" +msgid "Socket Type Name" +msgstr "接口类型名称" + + +msgid "Name of the socket type" +msgstr "接口类型的名称" + + msgid "Default Attribute" msgstr "默认属性" @@ -46976,6 +49694,26 @@ msgid "The attribute name used by default when the node group is used by a geome msgstr "几何节点修改器使用节点组时默认使用的属性名称" +msgid "Default Input" +msgstr "默认输入" + + +msgid "Input to use when the socket is unconnected. Requires \"Hide Value\"" +msgstr "接口未连接时使用的输入接口,需要“隐藏值”" + + +msgid "Socket description" +msgstr "接口描述" + + +msgid "Single Value" +msgstr "单项值" + + +msgid "Only allow single value inputs rather than fields" +msgstr "只允许单值输入,不允许场" + + msgid "Hide in Modifier" msgstr "在修改器中隐藏" @@ -46988,14 +49726,38 @@ msgid "Hide the socket input value even when the socket is not connected" msgstr "即使接口未连接,也隐藏接口输入值" +msgid "Input/Output Type" +msgstr "输入/输出类型" + + +msgid "Input or output socket type" +msgstr "输入或输出接口类型" + + +msgid "Generate a input node socket" +msgstr "创建一个输入节点接口" + + +msgid "Generate a output node socket" +msgstr "创建一个输出节点接口" + + msgid "Layer Selection" msgstr "层选择" +msgid "Take Grease Pencil Layer or Layer Group as selection field" +msgstr "将蜡笔层或者层组作为一个选择集" + + msgid "Socket Type" msgstr "接口类型" +msgid "Type of the socket generated by this interface item" +msgstr "通过界面条目创建的接口类型" + + msgid "Boolean Node Socket Interface" msgstr "布尔节点接口界面" @@ -47024,6 +49786,10 @@ msgid "Subtype" msgstr "子类型" +msgid "Subtype of the default value" +msgstr "默认值的子类型" + + msgid "Geometry Node Socket Interface" msgstr "几何节点接口" @@ -47044,6 +49810,10 @@ msgid "Object Node Socket Interface" msgstr "物体节点接口" +msgid "Rotation Node Socket Interface" +msgstr "旋转节点接口界面" + + msgid "Shader Node Socket Interface" msgstr "着色器型节点接口" @@ -47084,6 +49854,42 @@ msgid "Active node in this tree" msgstr "该节点树中的活动节点" +msgid "Nodes Modifier Bake" +msgstr "节点修改器烘焙" + + +msgid "Frame where the baking ends" +msgstr "烘焙结束的帧" + + +msgid "Frame where the baking starts" +msgstr "烘焙起始的帧" + + +msgid "Custom Path" +msgstr "自定义路径" + + +msgid "Specify a path where the baked data should be stored manually" +msgstr "自定义一个保存烘焙数据的路径" + + +msgid "Custom Simulation Frame Range" +msgstr "自定义模拟帧范围" + + +msgid "Override the simulation frame range from the scene" +msgstr "覆盖场景中的模拟帧范围" + + +msgid "Bakes" +msgstr "烘焙" + + +msgid "Bake data for every bake node" +msgstr "烘焙每个烘焙节点的数据" + + msgid "Object Base" msgstr "物体基础" @@ -47128,6 +49934,22 @@ msgid "Collection of object grease pencil modifiers" msgstr "物体蜡笔修改器集合" +msgid "Object Light Linking" +msgstr "物体灯光链接" + + +msgid "Collection which defines objects which block light from this emitter" +msgstr "定义阻挡来自此自发光体的光线物体集合" + + +msgid "Receiver Collection" +msgstr "接收者集合" + + +msgid "Collection which defines light linking relation of this emitter" +msgstr "定义该自发光体的光链接关系集合" + + msgid "Object Line Art" msgstr "物体线条画" @@ -47244,6 +50066,11 @@ msgid "Input properties of an operator" msgstr "操作的输入属性" +msgctxt "Operator" +msgid "Bake Keyframes" +msgstr "烘焙关键帧" + + msgid "Add keyframes on every frame between the selected keyframes" msgstr "为所选关键帧之间的每一帧插入关键帧" @@ -47315,6 +50142,10 @@ msgid "Copy Keyframes" msgstr "拷贝关键帧" +msgid "Copy selected keyframes to the internal clipboard" +msgstr "将所选关键帧复制到内部剪贴板" + + msgctxt "Operator" msgid "Delete Keyframes" msgstr "删除关键帧" @@ -47539,6 +50370,10 @@ msgid "Paste Keyframes" msgstr "粘贴关键帧" +msgid "Paste keyframes from the internal clipboard for the selected channels, starting on the current frame" +msgstr "当前帧开始,从内部剪贴板为选定通道粘贴关键帧" + + msgid "Flipped" msgstr "翻转" @@ -47980,6 +50815,10 @@ msgid "Extend Range" msgstr "扩展范围" +msgid "Selection of active channel to clicked channel" +msgstr "从活动通道选择点击的通道" + + msgctxt "Operator" msgid "Collapse Channels" msgstr "收起通道" @@ -48141,6 +50980,15 @@ msgid "Remove selected F-Curves from their current groups" msgstr "将选中的函数曲线从其当前所在组中移除" +msgctxt "Operator" +msgid "Frame Selected Channels" +msgstr "框显选择的通道" + + +msgid "Reset viewable area to show the selected channels" +msgstr "重置可视区域以显示所选通道" + + msgctxt "Operator" msgid "Clear Useless Actions" msgstr "清空无用动作" @@ -48278,6 +51126,10 @@ msgid "Insert Keyframe" msgstr "插入关键帧" +msgid "Insert keyframes on the current frame using either the active keying set, or the user preferences if no keying set is active" +msgstr "使用活动帧插集在当前帧上插入关键帧,如果没有帧插集处于激活状态,则使用用户首选项插入关键帧" + + msgctxt "Operator" msgid "Insert Keyframe (Buttons)" msgstr "插入关键帧(按钮)" @@ -48336,10 +51188,18 @@ msgid "Export Keying Set..." msgstr "导出插帧集..." +msgid "Export Keying Set to a Python script" +msgstr "将插帧集导出为 Python 脚本" + + msgid "Filter folders" msgstr "过滤文件夹" +msgid "Filter Python" +msgstr "过滤 Python" + + msgid "Filter text" msgstr "过滤文本文件" @@ -48398,6 +51258,10 @@ msgid "Paste Driver" msgstr "粘贴驱动器" +msgid "Paste the driver in the internal clipboard to the highlighted button" +msgstr "将内置剪贴板中的驱动器粘贴到高亮显示的按钮上" + + msgctxt "Operator" msgid "Clear Preview Range" msgstr "清空预览范围" @@ -48446,6 +51310,27 @@ msgstr "" "警告: 仅使用一次" +msgctxt "Operator" +msgid "View In Graph Editor" +msgstr "在曲线编辑内显示" + + +msgid "Frame the property under the cursor in the Graph Editor" +msgstr "框显曲线编辑器中当前游标下的属性" + + +msgid "Show All" +msgstr "显示全部" + + +msgid "Frame the whole array property instead of only the index under the cursor" +msgstr "框显整个阵列内容代替只显示游标下的条目" + + +msgid "Isolate" +msgstr "隔离" + + msgctxt "Operator" msgid "Align Bones" msgstr "对齐骨骼" @@ -48455,6 +51340,23 @@ msgid "Align selected bones to the active bone (or to their parent)" msgstr "对齐所选骨骼到激活骨骼(或其父级)" +msgctxt "Operator" +msgid "Assign to Collection" +msgstr "分配到集合" + + +msgid "Assign bones to a collection" +msgstr "分配骨骼到集合" + + +msgid "The bone collection to move the selected bones to" +msgstr "将选定骨骼移动到的骨骼集合" + + +msgid "Name of the newly added bone collection" +msgstr "新增骨骼集合的名称" + + msgctxt "Operator" msgid "Auto-Name by Axis" msgstr "根据轴向自动命名" @@ -48464,6 +51366,10 @@ msgid "Automatically renames the selected bones according to which side of the t msgstr "根据其倾向的目标轴向自动重命名所选骨骼" +msgid "Axis to tag names with" +msgstr "轴向标记名称" + + msgid "X-Axis" msgstr "X 轴" @@ -48571,15 +51477,132 @@ msgid "Create a new bone going from the last selected joint to the mouse positio msgstr "在上一所选关节与鼠标坐标之间创建一段新骨骼" +msgctxt "Operator" +msgid "Add Bone Collection" +msgstr "添加骨骼集合" + + +msgid "Add a new bone collection" +msgstr "添加一个新的骨骼集合" + + +msgctxt "Operator" +msgid "Add Selected Bones to Collection" +msgstr "添加选中的骨骼到集合" + + +msgid "Add selected bones to the chosen bone collection" +msgstr "添加选中的骨骼到选择的骨骼集合" + + +msgid "Bone Collection" +msgstr "骨骼集合" + + +msgid "Name of the bone collection to assign this bone to; empty to assign to the active bone collection" +msgstr "分配给此骨骼的骨骼集合名字;为空以指定给活动骨骼集合" + + +msgctxt "Operator" +msgid "Deselect Bone Collection" +msgstr "取消选择骨骼集合" + + +msgid "Deselect bones of active Bone Collection" +msgstr "取消选择活动骨骼集合的骨骼" + + +msgctxt "Operator" +msgid "Move Bone Collection" +msgstr "移动骨骼集合" + + +msgid "Change position of active Bone Collection in list of Bone collections" +msgstr "更改活动骨骼集合在骨骼集合列表中的位置" + + +msgid "Direction to move the active Bone Collection towards" +msgstr "活动骨骼集合移动的方向" + + +msgctxt "Operator" +msgid "Remove Bone Collection" +msgstr "移除骨骼集合" + + +msgid "Remove the active bone collection" +msgstr "移除活动骨骼集合" + + +msgctxt "Operator" +msgid "Select Bones of Bone Collection" +msgstr "选择骨骼集合的骨骼" + + +msgid "Select bones in active Bone Collection" +msgstr "选择活动骨骼集合中的骨骼" + + msgctxt "Operator" msgid "Show All" msgstr "显示全部" +msgid "Show all bone collections" +msgstr "显示全部骨骼集合" + + +msgctxt "Operator" +msgid "Solo Visibility" +msgstr "单独显示" + + +msgid "Hide all other bone collections and show the active one" +msgstr "隐藏其它全部骨骼集合,只显示当前激活项" + + +msgctxt "Operator" +msgid "Remove Selected from Bone collections" +msgstr "从骨骼集合中移除选择体" + + +msgid "Remove selected bones from the active bone collection" +msgstr "从活动骨骼集合中移除选中的骨骼" + + +msgid "Name of the bone collection to unassign this bone from; empty to unassign from the active bone collection" +msgstr "要解除分配此骨骼的骨骼集合的名称;空为从活动骨骼集合解除分配" + + +msgid "Unassign the bone from this bone collection" +msgstr "从此骨骼集合解除分配骨骼" + + +msgid "Name of the bone to unassign from the collection; empty to use the active bone" +msgstr "要从集合中解除分配的骨骼的名称;空为使用活动骨骼" + + +msgctxt "Operator" +msgid "Copy Colors to Selected" +msgstr "复制颜色到选中的骨骼" + + +msgid "Copy the bone color of the active bone to all selected bones" +msgstr "复制活动骨骼颜色到全部选中的骨骼" + + +msgid "Copy Bone colors from the active bone to all selected bones" +msgstr "复制激活骨骼的骨骼颜色刀全部选中的骨骼" + + msgid "Pose Bone" msgstr "姿态骨骼" +msgid "Copy Pose Bone colors from the active pose bone to all selected pose bones" +msgstr "拷贝活动姿态骨骼的姿态骨骼颜色到全部选中的姿态骨骼" + + msgctxt "Operator" msgid "Delete Selected Bone(s)" msgstr "删除所选骨骼" @@ -48705,6 +51728,10 @@ msgid "Move to Collection" msgstr "移动到集合" +msgid "Move bones to a collection" +msgstr "移动骨骼到一个集合" + + msgctxt "Operator" msgid "Clear Parent" msgstr "清空父级" @@ -49034,6 +52061,10 @@ msgid "Filter OBJ files" msgstr "过滤OBJ文件" +msgid "Filter Python files" +msgstr "过滤 Python 文件" + + msgid "Filter sound files" msgstr "过滤声音文件" @@ -49149,6 +52180,15 @@ msgid "Ensure the data-block is saved, even when it is no longer marked as asset msgstr "确保数据块被保存,即使它不再标记为资产" +msgctxt "Operator" +msgid "Clear Single Asset" +msgstr "清理单个资产" + + +msgid "Delete all asset metadata and turn the asset data-block back into a normal data-block" +msgstr "删除所有资产元数据,将选定的资产数据块重新转换为普通数据块" + + msgctxt "Operator" msgid "Refresh Asset Library" msgstr "刷新资产库" @@ -49167,6 +52207,15 @@ msgid "Enable easier reuse of selected data-blocks through the Asset Browser, wi msgstr "借助可自定义的元数据(如预览、描述和标记),通过资产浏览器更轻松地重用选定的数据块" +msgctxt "Operator" +msgid "Mark as Single Asset" +msgstr "标记为单个资产" + + +msgid "Enable easier reuse of a data-block through the Asset Browser, with the help of customizable metadata (like previews, descriptions and tags)" +msgstr "借助可自定义的元数据(如预览、描述和标记),通过资产浏览器更轻松地重新使用选定的数据块" + + msgctxt "Operator" msgid "Open Blend File" msgstr "打开Blender文件" @@ -49658,6 +52707,14 @@ msgid "Clean tracks with high error values or few frames" msgstr "清理高误差或低帧数的轨迹" +msgid "Affect tracks which have a larger reprojection error" +msgstr "影响重投影误差较大的轨迹" + + +msgid "Affect tracks which are tracked less than the specified number of frames" +msgstr "影响少于指定帧数的跟踪轨迹" + + msgctxt "Operator" msgid "Clear Solution" msgstr "清空解算" @@ -49726,6 +52783,10 @@ msgid "Copy Tracks" msgstr "复制轨迹" +msgid "Copy the selected tracks to the internal clipboard" +msgstr "将所选轨迹复制到内置剪贴板" + + msgctxt "Operator" msgid "Create Plane Track" msgstr "创建平面追踪" @@ -50112,6 +53173,10 @@ msgid "Paste Tracks" msgstr "粘贴轨道" +msgid "Paste tracks from the internal clipboard" +msgstr "从内置剪贴板中粘贴轨迹" + + msgctxt "Operator" msgid "Prefetch Frames" msgstr "预读取帧" @@ -50255,6 +53320,10 @@ msgid "Set Axis" msgstr "设置轴" +msgid "Set the direction of a scene axis by rotating the camera (or its parent if present). This assumes that the selected track lies on a real axis connecting it to the origin" +msgstr "通过旋转摄影机(或其父摄影机(如果存在))来设置场景轴的方向,假设选定轨迹位于将其连接到原点的真实轴上" + + msgid "Axis to use to align bundle along" msgstr "点束的定位参照轴" @@ -50564,11 +53633,11 @@ msgstr "边框适应到视图区域" msgctxt "Operator" msgid "Center View to Cursor" -msgstr "视图中心对齐光标" +msgstr "视图中心对齐游标" msgid "Center the view so that the cursor is in the middle of the view" -msgstr "将视角居中, 使用光标位置作为视图中心" +msgstr "将视角居中, 使用游标位置作为视图中心" msgctxt "Operator" @@ -50784,6 +53853,14 @@ msgid "Copy selected text to clipboard" msgstr "将所选文本复制到剪贴板" +msgid "Delete Selection" +msgstr "删除选择" + + +msgid "Whether to delete the selection after copying" +msgstr "复制后是否删除所选内容" + + msgctxt "Operator" msgid "Copy to Clipboard (as Script)" msgstr "复制到剪贴板 (作为脚本)" @@ -50827,6 +53904,10 @@ msgid "Console Execute" msgstr "控制台执行" +msgid "Execute the current console line as a Python expression" +msgstr "将当前控制台行命令作为Python表达式执行" + + msgctxt "Operator" msgid "History Append" msgstr "历史追加" @@ -50901,6 +53982,11 @@ msgid "Set the current language for this console" msgstr "为控制台设置当前语言" +msgctxt "Python console" +msgid "Language" +msgstr "语言" + + msgctxt "Operator" msgid "Move Cursor" msgstr "移动光标" @@ -50910,6 +53996,10 @@ msgid "Move cursor position" msgstr "移动光标的位置" +msgid "Whether to select while moving" +msgstr "移动时是否选择" + + msgid "Where to move cursor to" msgstr "光标的目标移动位置" @@ -50931,6 +54021,10 @@ msgid "Paste text from clipboard" msgstr "从剪贴板粘贴文本" +msgid "Paste text selected elsewhere rather than copied (X11/Wayland only)" +msgstr "将选定的文本粘贴到其他位置而不是复制 (仅用于X11/Wayland)" + + msgctxt "Operator" msgid "Scrollback Append" msgstr "回滚追加" @@ -50948,6 +54042,10 @@ msgid "Information" msgstr "信息" +msgid "Select all the text" +msgstr "选择全部文本" + + msgctxt "Operator" msgid "Set Selection" msgstr "设置选择" @@ -51211,14 +54309,43 @@ msgid "(De)select all control points" msgstr "(不)全选全部控制点" +msgctxt "Operator" +msgid "Select Ends" +msgstr "选择末点" + + msgid "Select end points of curves" msgstr "选取曲线的端点" +msgid "Amount Back" +msgstr "背面数量" + + +msgid "Number of points to select from the back" +msgstr "要从背面选择的点数" + + +msgid "Amount Front" +msgstr "前面数量" + + +msgid "Number of points to select from the front" +msgstr "要从前面选择的点数" + + +msgid "Shrink the selection by one point" +msgstr "将选择缩小一点" + + msgid "Select all points in curves with any point selection" msgstr "使用任意点选择曲线中的所有点" +msgid "Grow the selection by one point" +msgstr "将选择增加一点" + + msgctxt "Operator" msgid "Select Random" msgstr "随机选择" @@ -52751,6 +55878,14 @@ msgid "-Z Axis" msgstr "-Z 轴" +msgid "Prioritize Active Color" +msgstr "活动颜色优先级" + + +msgid "Make sure active color will be exported first. Could be important since some other software can discard other color attributes besides the first one" +msgstr "确保活动颜色将首先导出,这很重要,因为一些其他软件可能会丢弃除第一个颜色属性之外的其他颜色属性" + + msgid "Secondary Bone Axis" msgstr "次骨骼轴向" @@ -52856,10 +55991,30 @@ msgid "Export scene as glTF 2.0 file" msgstr "导出场景为glTF 2.0文件" +msgid "Filter Actions" +msgstr "过滤动作" + + +msgid "Filter Actions to be exported" +msgstr "过滤将被导出的动作" + + msgid "Include All Bone Influences" msgstr "包含全部骨骼影响" +msgid "Allow export of all joint vertex influences. Models may appear incorrectly in many viewers" +msgstr "允许导出所有关节顶点影响的内容,在许多查看器中可能出现错误" + + +msgid "Split Animation by Object" +msgstr "按物体分割动画" + + +msgid "Export Scene as seen in Viewport, But split animation by Object" +msgstr "导出在视口中看到的场景,但按对象分割动画" + + msgid "Export all Armature Actions" msgstr "导出所有骨架动作" @@ -52868,6 +56023,42 @@ msgid "Export all actions, bound to a single armature. WARNING: Option does not msgstr "导出绑定到单个骨架的所有动作。警告:选项不支持导出包含多个骨架" +msgid "Set all glTF Animation starting at 0" +msgstr "设置所有glTF动画起始位置在0" + + +msgid "Set all glTF animation starting at 0.0s. Can be useful for looping animations" +msgstr "将所有glTF动画从0.0s开始设置,这对循环动画很有用" + + +msgid "Animation mode" +msgstr "动画模式" + + +msgid "Export Animation mode" +msgstr "导出动画的模式" + + +msgid "Export actions (actives and on NLA tracks) as separate animations" +msgstr "将动作(活动的和NLA轨迹上的动作)导出为单独的动画" + + +msgid "Active actions merged" +msgstr "合并的活动动作" + + +msgid "All the currently assigned actions become one glTF animation" +msgstr "所有当前分配的动作都成为一个glTF动画" + + +msgid "Export individual NLA Tracks as separate animation" +msgstr "将单个NLA轨道导出为单独的动画" + + +msgid "Export baked scene as a single animation" +msgstr "将烘焙过的场景导出为单个动画" + + msgid "Exports active actions and NLA tracks as glTF animations" msgstr "导出活动的动作和NLA轨道作为 glTF 动画" @@ -52876,18 +56067,46 @@ msgid "Apply modifiers (excluding Armatures) to mesh objects -WARNING: prevents msgstr "应用修改器到网格物体(除骨架外) - 警告: 禁止导出形态键" +msgid "Remove Armature Object" +msgstr "移除骨架物体" + + +msgid "Remove Armature object if possible. If Armature has multiple root bones, object will not be removed" +msgstr "如果可以,将移除骨架物体,如果骨架拥有多个根骨骼,物体将被移除" + + msgid "Export Attributes (when starting with underscore)" msgstr "导出属性(以下划线开头时)" +msgid "Bake All Objects Animations" +msgstr "烘焙全部物体动画" + + +msgid "Force exporting animation on every object. Can be useful when using constraints or driver. Also useful when exporting only selection" +msgstr "强制导出每个物体上的动画,当使用约束或者驱动器会比较有用,导出选择内容时也比较有用哟(^U^)ノ" + + msgid "Export cameras" msgstr "导出摄像机" +msgid "Keep for compatibility only" +msgstr "仅保持兼容性" + + msgid "Legal rights and conditions for the model" msgstr "模型的法律权限和条款" +msgid "Use Current Frame as Object Rest Transformations" +msgstr "使用当前帧作为物体静置状态的变换" + + +msgid "Export the scene in the current animation frame. When off, frame 0 is used as rest transformations for objects" +msgstr "导出当前动画帧中的场景。禁用时,第0帧用作物体的静置变换" + + msgid "Export Deformation Bones Only" msgstr "仅导出变形骨骼" @@ -52908,6 +56127,10 @@ msgid "Generic quantization bits" msgstr "一般量化位" +msgid "Quantization bits for generic values like weights or joints (0 = no quantization)" +msgstr "权重或关节等通用值的量化位数(0=无量化)" + + msgid "Draco mesh compression" msgstr "Draco网格压缩" @@ -52960,6 +56183,10 @@ msgid "Apply sampling to all animations" msgstr "应用采样到所有动画" +msgid "Output format. Binary is most efficient, but JSON may be easier to edit later" +msgstr "输出格式,二进制是最有效的,但JSON以后可能更容易编辑" + + msgid "glTF Binary (.glb)" msgstr "glTF二进制(.glb)" @@ -52984,10 +56211,62 @@ msgid "Clips animations to selected playback range" msgstr "钳制动画到所选播放范围" +msgid "Geometry Nodes Instances (Experimental)" +msgstr "几何节点实例(实验性)" + + +msgid "Export Geometry nodes instance meshes" +msgstr "导出几何节点的实例网格" + + +msgid "GPU Instances" +msgstr "GPU实例" + + +msgid "Export using EXT_mesh_gpu_instancing. Limited to children of a given Empty. Multiple materials might be omitted" +msgstr "使用EXT_mesh_gpu_instancing导出,仅限于空物体子级,多维材质可能会被忽略" + + +msgid "Flatten Bone Hierarchy" +msgstr "展平骨骼层级" + + +msgid "Flatten Bone Hierarchy. Useful in case of non decomposable transformation matrix" +msgstr "展平骨骼层次,在不可分解变换矩阵的情况下有用" + + +msgid "Flatten Object Hierarchy" +msgstr "展平物体层级" + + +msgid "Flatten Object Hierarchy. Useful in case of non decomposable transformation matrix" +msgstr "展平对象层次,在不可分解变换矩阵的情况下有用" + + +msgid "Full Collection Hierarchy" +msgstr "完整的集合层次结构" + + +msgid "Export full hierarchy, including intermediate collections" +msgstr "导出完整的层次结构,包括中间集合" + + +msgid "Create WebP" +msgstr "创建WebP" + + +msgid "Creates WebP textures for every texture. For already WebP textures, nothing happens" +msgstr "为每个纹理创建WebP纹理,对于已经存在的WebP纹理,不作处理" + + msgid "Output format for images. PNG is lossless and generally preferred, but JPEG might be preferable for web applications due to the smaller file size. Alternatively they can be omitted if they are not needed" msgstr "图像的输出格式. PNG是无损的,通常是首选,但由于文件较小,JPEG可能更适合Web应用。另外,如无需要可忽略该项" +msgid "Save PNGs as PNGs, JPEGs as JPEGs, WebPs as WebPs. For other formats, use PNG" +msgstr "保存PNG为PNG,保存JPEG为 JPEG,保存WebP为 WebP,如其它格式,则保存为PNG" + + msgid "JPEG Format (.jpg)" msgstr "JPEG格式 (.jpg)" @@ -52996,10 +56275,34 @@ msgid "Save images as JPEGs. (Images that need alpha are saved as PNGs though.) msgstr "将图像另存为 JPEG。(需要alpha 的图像保存为 PNG。)注意可能带来的品质损失" +msgid "WebP Format" +msgstr "WebP格式" + + +msgid "Save images as WebPs as main image (no fallback)" +msgstr "将图像另存为WebP作为主图像(不可回退)" + + msgid "Don't export images" msgstr "不导出图像" +msgid "Image quality" +msgstr "图像品质" + + +msgid "Quality of image export" +msgstr "图像导出的品质" + + +msgid "WebP fallback" +msgstr "WebP回退" + + +msgid "For all WebP textures, create a PNG fallback texture" +msgstr "为所有WebP纹理,创建一个PNG回退纹理" + + msgid "Lighting Mode" msgstr "光照模式" @@ -53028,6 +56331,14 @@ msgid "Blender lighting strengths with no conversion" msgstr "无需转换的Blender灯光强度" +msgid "Bone Influences" +msgstr "骨骼影响度" + + +msgid "Choose how many Bone influences to export" +msgstr "选择要导出的骨骼影响数量" + + msgid "JPEG quality" msgstr "JPEG 品质" @@ -53076,6 +56387,14 @@ msgid "Export shape keys (morph targets)" msgstr "导出所有的形态键(形变目标)" +msgid "Shape Key Animations" +msgstr "形态键动画" + + +msgid "Export shape keys animations (morph targets)" +msgstr "导出所有的形态键动画(形变目标)" + + msgid "Shape Key Normals" msgstr "形态键法向" @@ -53084,6 +56403,14 @@ msgid "Export vertex normals with shape keys (morph targets)" msgstr "导出带形态键的顶点法线 (变形目标)" +msgid "Reset shape keys between actions" +msgstr "重置动作之间的 形态关键帧" + + +msgid "Reset shape keys between each action exported. This is needed when some SK channels are not keyed on some animations" +msgstr "在每个动作被导出之间重置形态键,当一些SK通道没有关键帧动画是比较有用的" + + msgid "Shape Key Tangents" msgstr "形态键切向" @@ -53092,6 +56419,34 @@ msgid "Export vertex tangents with shape keys (morph targets)" msgstr "导出带形态键的顶点切向 (变形目标)" +msgid "Negative Frames" +msgstr "负数帧" + + +msgid "Negative Frames are slid or cropped" +msgstr "框外的将被裁剪" + + +msgid "Slide" +msgstr "滑移" + + +msgid "Slide animation to start at frame 0" +msgstr "滑动动画到起始位置帧0" + + +msgid "Keep only frames above frame 0" +msgstr "仅需要第0帧以上的帧" + + +msgid "Group by NLA Track" +msgstr "通过NLA轨道打组" + + +msgid "When on, multiple actions become part of the same glTF animation if they're pushed onto NLA tracks with the same name. When off, all the currently assigned actions become one glTF animation" +msgstr "启用该项后,如果多个动作被推到具有相同名称的NLA轨道上,则它们将成为同一glTF动画的一部分。禁用该项后,所有当前指定的动作将成为一个glTF动画" + + msgid "Merged Animation Name" msgstr "合并的动画名称" @@ -53104,10 +56459,30 @@ msgid "Export vertex normals with meshes" msgstr "随网格导出顶点法向" +msgid "Force keeping channels for bones" +msgstr "强制保持骨骼通道" + + +msgid "If all keyframes are identical in a rig, force keeping the minimal animation. When off, all possible channels for the bones will be exported, even if empty (minimal animation, 2 keyframes)" +msgstr "如果绑定中的所有关键帧都相同,则强制保持最小动画。禁用该项后,骨骼的所有可能通道都将导出,即使为空(最少2个关键帧的动画)" + + +msgid "Force keeping channel for objects" +msgstr "强制保持物体通道" + + +msgid "If all keyframes are identical for object transformations, force keeping the minimal animation" +msgstr "如果物体变换的所有关键帧都相同,则强制保持最小动画" + + msgid "Optimize Animation Size" msgstr "优化动画大小" +msgid "Reduce exported file size by removing duplicate keyframes" +msgstr "通过删除重复的关键帧来减小导出的文件大小" + + msgid "Export original PBR Specular" msgstr "导出原始 PBR 镜面反射" @@ -53124,6 +56499,22 @@ msgid "Reset pose bones between each action exported. This is needed when some b msgstr "重置被导出动作之间的姿态骨骼。当某些骨骼在某些动画上未插帧时,这是必需的" +msgid "Use Rest Position Armature" +msgstr "使用静置姿态骨架" + + +msgid "Export armatures using rest position as joints' rest pose. When off, current frame pose is used as rest pose" +msgstr "使用静置位置作为静止关节姿态导出骨架。禁用时,当前帧的姿态用作静置姿态" + + +msgid "Shared Accessors" +msgstr "共享数据的物体" + + +msgid "Export Primitives using shared accessors for attributes" +msgstr "对于共享属性数据的只导出基础体" + + msgid "Skinning" msgstr "蒙皮" @@ -53148,6 +56539,34 @@ msgid "Folder to place texture files in. Relative to the .gltf file" msgstr "用于放置纹理文件的文件夹。相对于 .gltf 文件" +msgid "Omitting Sparse Accessor if data is empty" +msgstr "如果数据为空,省略稀疏访问器" + + +msgid "Use Sparse Accessor if better" +msgstr "使用稀疏访问器如果更好的话" + + +msgid "Try using Sparse Accessor if it saves space" +msgstr "如果它保存空间那么尝试使用稀疏访问器" + + +msgid "Unused images" +msgstr "未使用的图像" + + +msgid "Export images not assigned to any material" +msgstr "导出任何材质都未使用的图像" + + +msgid "Prepare Unused textures" +msgstr "准备未使用的图像" + + +msgid "Export image texture nodes not assigned to any material. This feature is not standard and needs an external extension to be included in the glTF file" +msgstr "导出未分配给任何材质的图像纹理节点,此功能不是标准功能,需要外部扩展包含在 glTF 文件中" + + msgid "+Y Up" msgstr "+Y 向上" @@ -53428,14 +56847,123 @@ msgid "Execute selected file" msgstr "执行选择文件" +msgctxt "Operator" +msgid "External File Operation" +msgstr "外部文件操作" + + +msgid "Perform external operation on a file or folder" +msgstr "对文件或文件夹执行外部操作" + + +msgid "File or folder path" +msgstr "文件或文件夹路径" + + +msgid "Operation to perform on the file or path" +msgstr "要对文件或路径执行的操作" + + +msgid "Open the file" +msgstr "打开文件" + + +msgid "Open Folder" +msgstr "打开文件夹" + + +msgid "Open the folder" +msgstr "打开文件夹" + + +msgid "Edit the file" +msgstr "编辑文件" + + +msgid "Create a new file of this type" +msgstr "新建此类型的文件" + + +msgid "Find File" +msgstr "查找文件" + + +msgid "Search for files of this type" +msgstr "搜索此类型的文件" + + msgid "Show" msgstr "显示" +msgid "Show this file" +msgstr "显示这个文件" + + msgid "Play" msgstr "播放" +msgid "Play this file" +msgstr "播放此文件" + + +msgid "Browse" +msgstr "浏览" + + +msgid "Browse this file" +msgstr "浏览此文件" + + +msgid "Preview this file" +msgstr "预览此文件" + + +msgid "Print" +msgstr "打印" + + +msgid "Print this file" +msgstr "打印此文件" + + +msgid "Install" +msgstr "安装" + + +msgid "Install this file" +msgstr "安装此文件" + + +msgid "Run As User" +msgstr "用户身份运行" + + +msgid "Run as specific user" +msgstr "以特定用户身份运行" + + +msgid "Show OS Properties for this item" +msgstr "显示此项的操作系统属性" + + +msgid "Find in Folder" +msgstr "在文件夹中查找" + + +msgid "Search for items in this folder" +msgstr "搜索此文件夹中的项目" + + +msgid "Command Prompt Here" +msgstr "在此命令提示符" + + +msgid "Open a command prompt here" +msgstr "在此处打开命令提示符" + + msgctxt "Operator" msgid "Increment Number in Filename" msgstr "文件名中的自动递增编号" @@ -53543,6 +57071,11 @@ msgid "Store all data-blocks linked from other .blend files in the current .blen msgstr "将从当前.blend文件中关联的所有数据块存储在当前.blend文件中。库引用已保留,因此可以再次解包关联的数据块" +msgctxt "Operator" +msgid "Parent Directory" +msgstr "父级目录" + + msgid "Move to parent directory" msgstr "移动到父级目录" @@ -53982,6 +57515,14 @@ msgid "Move cursor to position type" msgstr "将光标移动到定位类型" +msgid "Text Begin" +msgstr "文本起始" + + +msgid "Text End" +msgstr "文本末尾" + + msgid "Previous Line" msgstr "上一行" @@ -54028,6 +57569,10 @@ msgid "Select word under cursor" msgstr "选定光标位置的文字" +msgid "Set cursor selection" +msgstr "设置光标选择" + + msgctxt "Operator" msgid "Set Style" msgstr "设置样式" @@ -54246,10 +57791,31 @@ msgid "Name of color attribute" msgstr "颜色属性的名称" +msgctxt "Operator" +msgid "Run Node Group" +msgstr "运行节点组" + + +msgid "Execute a node group on geometry" +msgstr "在几何体上执行节点组" + + +msgid "Asset Library Identifier" +msgstr "资产库标识符" + + +msgid "Asset Library Type" +msgstr "资产库类型" + + msgid "Name of the data-block to use by the operator" msgstr "操作要使用的数据块的名称" +msgid "Relative Asset Identifier" +msgstr "相对资产标识符" + + msgid "Session UUID" msgstr "会话UUID" @@ -54258,22 +57824,35 @@ msgid "Session UUID of the data-block to use by the operator" msgstr "操作要使用的数据块的会话 UUID" +msgctxt "Operator" +msgid "Set Geometry Randomization" +msgstr "设置几何体随机化" + + +msgid "Toggle geometry randomization for debugging purposes" +msgstr "切换几何体随机化以进行调试" + + +msgid "Randomize the order of geometry elements (e.g. vertices or edges) after some operations where there are no guarantees about the order. This avoids accidentally depending on something that may change in the future" +msgstr "在无法保证顺序的某些操作之后,随机化几何元素(例如顶点或边)的顺序。这样可以避免意外地依赖于将来可能更改的内容" + + msgctxt "Operator" msgid "Gizmo Select" -msgstr "Gizmo选择" +msgstr "操控器选择" msgid "Select the currently highlighted gizmo" -msgstr "选择当前高亮gizmo" +msgstr "选择当前高亮操控器" msgctxt "Operator" msgid "Gizmo Tweak" -msgstr "Gizmo调整" +msgstr "操控器调整" msgid "Tweak the active gizmo" -msgstr "调整活动的Gizmo" +msgstr "调整活动的操控器" msgctxt "Operator" @@ -54606,7 +58185,7 @@ msgstr "间隔随机性" msgid "Custom Gap mode: Number of frames that gap lengths can vary" -msgstr "自定义间隔模式: 间隔长度的帧数差异量" +msgstr "自定义间隔模式:间隔长度的帧数差异量" msgid "Radius Factor" @@ -54618,7 +58197,7 @@ msgstr "多个点的半径倍值 (由笔画宽度决定)" msgid "Custom Gap mode: Random generator seed" -msgstr "自定义间隔模式: 随机生成器的种" +msgstr "自定义间隔模式:随机生成器的种" msgid "The start frame of the path control curve" @@ -55599,6 +59178,14 @@ msgid "Create predefined grease pencil stroke box shapes" msgstr "创建预定义蜡笔笔画盒形状" +msgid "Number of points per segment" +msgstr "每个线段的点数" + + +msgid "Number of subdivisions per segment" +msgstr "每个线段的细分数" + + msgid "Type of shape" msgstr "形状类型" @@ -56030,7 +59617,7 @@ msgstr "选中线段并切除" msgid "Flat Caps" -msgstr "平封盖" +msgstr "平端点" msgctxt "Operator" @@ -56038,6 +59625,10 @@ msgid "Set Cyclical State" msgstr "设置闭合状态" +msgid "Close or open the selected stroke adding a segment from last to first point" +msgstr "末点到起始点是否添加线段连接的开关" + + msgid "Create Geometry" msgstr "创建几何体" @@ -56245,6 +59836,11 @@ msgid "Front" msgstr "前视图" +msgctxt "View3D" +msgid "Side" +msgstr "边" + + msgctxt "View3D" msgid "Top" msgstr "顶视图" @@ -56686,6 +60282,10 @@ msgid "Stroke Weight Paint" msgstr "笔画权重绘制" +msgid "Draw weight on stroke points" +msgstr "在笔画点上绘制权重" + + msgctxt "Operator" msgid "Weight Paint Sample Weight" msgstr "权重绘制采样值" @@ -56695,6 +60295,15 @@ msgid "Use the mouse to sample a weight in the 3D view" msgstr "使用鼠标在 3D 视图中拾取权重" +msgctxt "Operator" +msgid "Weight Paint Toggle Direction" +msgstr "权重喷绘切换方向" + + +msgid "Toggle Add/Subtract for the weight paint draw tool" +msgstr "切换权重绘制工具的 加/减" + + msgctxt "Operator" msgid "Strokes Weight Mode Toggle" msgstr "笔画权重模式切换" @@ -56704,6 +60313,19 @@ msgid "Enter/Exit weight paint mode for Grease Pencil strokes" msgstr "进入/退出蜡笔笔画的权重喷绘模式" +msgctxt "Operator" +msgid "Blend Offset Keyframes" +msgstr "混合偏移关键帧" + + +msgid "Shift selected keys to the value of the neighboring keys as a block" +msgstr "选择的关键帧的值切换为临近关键帧的值作为一个区块" + + +msgid "Control which key to offset towards and how far" +msgstr "控制关键帧向前偏移和多远" + + msgctxt "Operator" msgid "Blend to Default Value" msgstr "混合到默认值" @@ -56717,6 +60339,19 @@ msgid "How much to blend to the default value" msgstr "混合到默认值的程度" +msgctxt "Operator" +msgid "Blend to Ease Keyframes" +msgstr "混合缓动关键帧" + + +msgid "Blends keyframes from current state to an ease-in or ease-out curve" +msgstr "将关键帧从当前状态混合到渐入或者渐出曲线" + + +msgid "Favor either original data or ease curve" +msgstr "支持原始数据或缓动曲线" + + msgctxt "Operator" msgid "Blend to Neighbor" msgstr "混合至邻帧" @@ -56726,6 +60361,10 @@ msgid "Blend selected keyframes to their left or right neighbor" msgstr "将所选关键帧混合到其左右邻帧" +msgid "The blend factor with 0 being the current frame" +msgstr "混合系数,0为当前帧开始" + + msgctxt "Operator" msgid "Breakdown" msgstr "间断" @@ -56739,6 +60378,51 @@ msgid "Favor either the left or the right key" msgstr "偏爱左侧帧或右侧帧" +msgctxt "Operator" +msgid "Butterworth Smooth" +msgstr "Butterworth平滑" + + +msgid "Smooth an F-Curve while maintaining the general shape of the curve" +msgstr "平滑函数曲线,同时保持曲线的形状" + + +msgid "How much to blend to the smoothed curve" +msgstr "混合多少到平滑曲线" + + +msgid "Blend In/Out" +msgstr "淡入/淡出" + + +msgid "Linearly blend the smooth data to the border frames of the selection" +msgstr "将平滑数据线性混合到选区的边框" + + +msgid "Frequency Cutoff (Hz)" +msgstr "截止频率(Hz)" + + +msgid "Lower values give a smoother curve" +msgstr "值越低曲线越平滑" + + +msgid "Filter Order" +msgstr "规律排序" + + +msgid "Higher values produce a harder frequency cutoff" +msgstr "值越高,频率截止越硬" + + +msgid "Samples per Frame" +msgstr "每帧采样" + + +msgid "How many samples to calculate per frame, helps with subframe data" +msgstr "每帧要计算多少采样,有助于处理子帧数据" + + msgctxt "Operator" msgid "Click-Insert Keyframes" msgstr "单击插入关键帧" @@ -56959,14 +60643,31 @@ msgid "Place the cursor on the midpoint of selected keyframes" msgstr "将光标置于所选多个关键帧的中点处" +msgctxt "Operator" +msgid "Gaussian Smooth" +msgstr "高斯平滑" + + +msgid "Smooth the curve using a Gaussian filter" +msgstr "使用高斯滤波器平滑曲线" + + msgid "Filter Width" msgstr "过滤宽度" +msgid "How far to each side the operator will average the key values" +msgstr "每个边的操作有多远,来平均关键帧值" + + msgid "Sigma" msgstr "西格玛" +msgid "The shape of the gaussian distribution, lower values make it sharper" +msgstr "高斯分布的形状,值越低,越锐利" + + msgctxt "Operator" msgid "Clear Ghost Curves" msgstr "清除残影曲线" @@ -57006,6 +60707,14 @@ msgid "Insert a keyframe on selected F-Curves using each curve's current value" msgstr "使用各曲线的当前值在所选函数曲线上插入一个关键帧" +msgid "Only Active F-Curve" +msgstr "仅活动函数曲线" + + +msgid "Insert a keyframe on the active F-Curve using the curve's current value" +msgstr "在活动的函数曲线上使用曲线当前值插入关键帧" + + msgid "Active Channels at Cursor" msgstr "光标位置的活动通道" @@ -57035,6 +60744,28 @@ msgid "Next Keyframe" msgstr "下一关键帧" +msgctxt "Operator" +msgid "Keys to Samples" +msgstr "关键帧到采样" + + +msgid "Convert selected channels to an uneditable set of samples to save storage space" +msgstr "将所选通道转换为一组不可编辑的采样以节省存储空间" + + +msgctxt "Operator" +msgid "Match Slope" +msgstr "匹配坡度" + + +msgid "Blend selected keys to the slope of neighboring ones" +msgstr "将所选关键帧混合到相邻关键帧的坡度" + + +msgid "Defines which keys to use as slope and how much to blend towards them" +msgstr "定义哪些关键帧用来作为坡度以及向它们混合多少关键帧" + + msgid "By Values Over Cursor Value" msgstr "按照游标的Y值" @@ -57051,10 +60782,63 @@ msgid "Flip times of selected keyframes, effectively reversing the order they ap msgstr "根据选择的镜像线翻转选择的关键帧" +msgid "Paste keys with a value offset" +msgstr "粘贴带有偏移值的关键帧" + + +msgid "Left Key" +msgstr "左方向键" + + +msgid "Paste keys with the first key matching the key left of the cursor" +msgstr "粘贴关键帧,第一帧和游标左边关键帧匹配" + + +msgid "Right Key" +msgstr "右方向键" + + +msgid "Paste keys with the last key matching the key right of the cursor" +msgstr "粘贴关键帧,最后一帧和游标右边关键帧匹配" + + +msgid "Current Frame Value" +msgstr "当前帧" + + +msgid "Paste keys relative to the value of the curve under the cursor" +msgstr "粘贴关键帧,相对于当前光标下曲线值" + + +msgid "Cursor Value" +msgstr "游标值" + + +msgid "Paste keys relative to the Y-Position of the cursor" +msgstr "粘贴关键帧,相对于游标的Y坐标值" + + +msgid "Paste keys with the same value as they were copied" +msgstr "粘贴关键帧,使用它们拷贝的相同值" + + msgid "Set Preview Range based on range of selected keyframes" msgstr "根据选择的关键帧范围设置预览区间" +msgctxt "Operator" +msgid "Push Pull Keyframes" +msgstr "推拉关键帧" + + +msgid "Exaggerate or minimize the value of the selected keys" +msgstr "扩大或者缩小选择的关键帧值" + + +msgid "Control how far to push or pull the keys" +msgstr "控制关键帧推拉的距离" + + msgctxt "Operator" msgid "Reveal Curves" msgstr "显示曲线" @@ -57064,6 +60848,32 @@ msgid "Make previously hidden curves visible again in Graph Editor view" msgstr "使以前隐藏的曲线在“曲线编辑器”视图中再次可见" +msgctxt "Operator" +msgid "Samples to Keys" +msgstr "采样到关键帧" + + +msgid "Convert selected channels from samples to keyframes" +msgstr "转换选择的通道的采样到关键帧" + + +msgctxt "Operator" +msgid "Scale Average Keyframes" +msgstr "缩放平均关键帧" + + +msgid "Scale selected key values by their combined average" +msgstr "按它们组合的平均值缩放选定的关键帧" + + +msgid "Scale Factor" +msgstr "缩放系数" + + +msgid "The scale factor applied to the curve segments" +msgstr "应用于曲线段的缩放系数" + + msgid "Are handles tested individually against the selection criteria" msgstr "是否与甄选标准作单独的测试" @@ -57076,6 +60886,51 @@ msgid "Allow selecting all the keyframes of a curve by selecting the curve itsel msgstr "允许通过选择曲线本身来选择曲线的所有关键帧" +msgid "For selected keyframes, select/deselect any combination of the key itself and its handles" +msgstr "对于选定的关键帧,选择/取消选择关键帧本身及其控制柄的任意组合" + + +msgid "Effect on the key itself" +msgstr "影响关键帧本身" + + +msgctxt "Operator" +msgid "Shear Keyframes" +msgstr "切变关键帧" + + +msgid "Affect the value of the keys linearly, keeping the same relationship between them using either the left or the right key as reference" +msgstr "线性地影响关键点的值,,参考线左边或者右边的关键帧同样有效(快捷键D)" + + +msgid "Which end of the segment to use as a reference to shear from" +msgstr "使用哪一端作为切变基准" + + +msgid "From Left" +msgstr "从左边" + + +msgid "Shear the keys using the left key as reference" +msgstr "切变关键帧使用参考左边的关键帧" + + +msgid "From Right" +msgstr "从右边" + + +msgid "Shear the keys using the right key as reference" +msgstr "切变关键帧使用参考线右边的关键帧" + + +msgid "Shear Factor" +msgstr "切变系数" + + +msgid "The amount of shear to apply" +msgstr "应用切变的数量" + + msgctxt "Operator" msgid "Smooth Keys" msgstr "平滑关键帧" @@ -57114,6 +60969,15 @@ msgid "Place the cursor value on the average value of selected keyframes" msgstr "将光标置于所选关键帧的平均帧值" +msgctxt "Operator" +msgid "Sound to Samples" +msgstr "音频到采样" + + +msgid "Bakes a sound wave to samples on selected channels" +msgstr "在选择的通道内烘焙一个音频声波到采样" + + msgid "Attack Time" msgstr "起音时间" @@ -57150,6 +61014,14 @@ msgid "The output is a square curve (negative values always result in -1, and po msgstr "输出项为一个方形曲线 (负值始终得出结果 -1, 正值始终会得出结果 1)" +msgid "Shifts the value of selected keys in time" +msgstr "及时切换选定关键点的值" + + +msgid "How far in frames to offset the animation" +msgstr "偏移动画的帧距离" + + msgid "Reset viewable area to show selected keyframe range" msgstr "重置可视区域并显示选定关键帧的范围" @@ -57174,14 +61046,97 @@ msgid "Switch brush to smooth mode for duration of stroke" msgstr "在画笔持续时间内将笔刷切换到平滑模式" +msgctxt "Operator" +msgid "Set Curve Caps" +msgstr "设置曲线端点" + + +msgid "Change curve caps mode (rounded or flat)" +msgstr "修改笔画端点的模式(圆形或扁平)" + + +msgid "Rounded" +msgstr "圆形" + + msgid "Flat" msgstr "平展" +msgid "Toggle Start" +msgstr "切换起始" + + +msgid "Toggle End" +msgstr "切换末尾" + + +msgid "Delete selected strokes or points" +msgstr "删除选中的笔画或者点" + + +msgctxt "Operator" +msgid "Delete Frame" +msgstr "删除帧" + + +msgid "Delete Grease Pencil Frame(s)" +msgstr "删除蜡笔帧" + + +msgid "Deletes current frame in the active layer" +msgstr "删除活动层中的当前帧" + + msgid "Duplicate" msgstr "复制" +msgid "Insert a blank frame on the current scene frame" +msgstr "在当前场景帧上插入空白帧" + + +msgid "Insert a blank frame in all editable layers" +msgstr "在所有可编辑层中插入一个空白帧" + + +msgid "Add a new Grease Pencil layer in the active object" +msgstr "在活动对象中添加新的蜡笔层" + + +msgid "Add a new Grease Pencil layer group in the active object" +msgstr "在活动对象中添加新的蜡笔层组" + + +msgid "Above" +msgstr "之上" + + +msgid "Below" +msgstr "之下" + + +msgid "Hide inactive materials instead of the active one" +msgstr "隐藏非活动材质代替活动材质" + + +msgid "Lock and hide any material not used" +msgstr "锁定并隐藏任何未使用的材质" + + +msgctxt "Operator" +msgid "Select Alternate" +msgstr "选择交替" + + +msgid "Amount Start" +msgstr "起始数量" + + +msgid "Selects random points from the current strokes selection" +msgstr "从当前笔画选择中选择随机点" + + msgctxt "Operator" msgid "Select Mode" msgstr "选择模式" @@ -57199,6 +61154,18 @@ msgid "Select all stroke points between other strokes" msgstr "选择其他笔画之间的所有笔画点" +msgid "Set all stroke points to same opacity" +msgstr "设置所有笔画点为相同透明度" + + +msgid "Set all stroke points to same thickness" +msgstr "设置所有笔画点为相同粗细" + + +msgid "Smooth Endpoints" +msgstr "平滑末尾点" + + msgctxt "Operator" msgid "Add Render Slot" msgstr "添加渲染槽" @@ -57226,6 +61193,14 @@ msgid "Clear the currently selected render slot" msgstr "清除当前选中渲染槽" +msgid "Copy the image to the clipboard" +msgstr "拷贝图像到剪贴板" + + +msgid "Paste new image from the clipboard" +msgstr "从剪贴板粘贴新图像" + + msgctxt "Operator" msgid "Set Curves Point" msgstr "设置曲线控制点" @@ -57984,7 +61959,7 @@ msgstr "缩放到摄像机框架" msgid "Dpi" -msgstr "Dpi" +msgstr "DPI" msgid "Use definition of the image as dots per inch" @@ -58186,6 +62161,10 @@ msgid "Heuristic for placing bones. Tries to make bones pretty" msgstr "启发式放置骨骼, 尽量使骨骼变得漂亮" +msgid "Blender (best for import/export round trip)" +msgstr "Blender(在Blender内往返导入导出的最好选择)" + + msgid "Temperance (average)" msgstr "克制(平均)" @@ -58230,6 +62209,10 @@ msgid "Flat Shading" msgstr "平直着色" +msgid "If a texture exists in WebP format, loads the WebP texture instead of the fallback PNG/JPEG one" +msgstr "果纹理以WebP格式存在,则加载WebP纹理,而不是回退的PNG/JPEG纹理" + + msgid "Log Level" msgstr "日志级别" @@ -58420,6 +62403,11 @@ msgid "Duplicate selected time marker(s)" msgstr "复制所选的时间标记" +msgctxt "Operator" +msgid "Copy Markers to Scene" +msgstr "拷贝标记到场景" + + msgid "Copy selected markers to another scene" msgstr "将所选标记复制到另一场景" @@ -58591,6 +62579,10 @@ msgid "Set Restrict View" msgstr "设置显示限制" +msgid "Temporarily hide mask layers" +msgstr "临时隐藏遮罩层" + + msgctxt "Operator" msgid "Move Layer" msgstr "移动层" @@ -59136,19 +63128,11 @@ msgid "Reverse Colors" msgstr "反相颜色" -msgid "Flip direction of vertex colors inside faces" -msgstr "翻转面内侧的顶点色方向" - - msgctxt "Operator" msgid "Rotate Colors" msgstr "旋转顶点着色" -msgid "Rotate color attributes inside faces" -msgstr "旋转面内侧的颜色属性" - - msgid "Counter Clockwise" msgstr "逆时针" @@ -60310,10 +64294,18 @@ msgid "Copy Normal" msgstr "复制法向" +msgid "Copy normal to the internal clipboard" +msgstr "正常法线到内部剪贴板" + + msgid "Paste Normal" msgstr "粘贴法向" +msgid "Paste normal from the internal clipboard" +msgstr "从内部剪贴板粘贴法线" + + msgid "Add Normal" msgstr "添加法向" @@ -60697,7 +64689,7 @@ msgstr "添加猴头" msgid "Construct a Suzanne mesh" -msgstr "创建一个猴头网格" +msgstr "创建一个名叫苏珊娜的猴头网格" msgctxt "Operator" @@ -61122,6 +65114,10 @@ msgid "Aligned Axis" msgstr "对齐轴" +msgid "Select elements based on the active boolean attribute" +msgstr "基于活动布尔属性选择元素" + + msgctxt "Operator" msgid "Select Faces by Sides" msgstr "按边数选面" @@ -61961,6 +65957,22 @@ msgid "Bake object transformations" msgstr "烘焙物体变换" +msgid "Which channels to bake" +msgstr "烘焙哪个通道" + + +msgid "Bake location channels" +msgstr "烘焙位置通道" + + +msgid "Bake rotation channels" +msgstr "烘焙旋转通道" + + +msgid "Bake scale channels" +msgstr "烘焙缩放通道" + + msgid "Clean Curves" msgstr "清除曲线" @@ -62302,6 +66314,10 @@ msgid "Add an existing node group to the current node editor" msgstr "向当前节点编辑器添加现有节点组" +msgid "Show the datablock selector in the node" +msgstr "在节点中显示数据块选择器" + + msgctxt "Operator" msgid "Add Node Group Asset" msgstr "添加节点组资产" @@ -62354,6 +66370,19 @@ msgid "Add an object info node to the current node editor" msgstr "向当前节点编辑器添加物体信息节点" +msgctxt "Operator" +msgid "Add Repeat Zone" +msgstr "添加重复区" + + +msgid "Add a repeat zone that allows executing nodes a dynamic number of times" +msgstr "添加一个重复区,允许多次运行节点" + + +msgid "Offset of nodes from the cursor when added" +msgstr "添加时节点时与游标的偏移量" + + msgctxt "Operator" msgid "Add Reroute" msgstr "添加转接点" @@ -62363,6 +66392,15 @@ msgid "Add a reroute node" msgstr "添加一个转接点节点" +msgctxt "Operator" +msgid "Add Simulation Zone" +msgstr "添加模拟区" + + +msgid "Add simulation zone input and output nodes to the active tree" +msgstr "添加一个带输入和输出节点的模拟区" + + msgctxt "Operator" msgid "Attach Nodes" msgstr "连接节点" @@ -62629,6 +66667,19 @@ msgid "Toggle hiding of selected nodes" msgstr "切换隐藏的已选节点" +msgctxt "Operator" +msgid "Add Item" +msgstr "添加项目" + + +msgid "Add an item to the index switch" +msgstr "给编号切换添加一个条目" + + +msgid "Remove an item from the index switch" +msgstr "从编号切换移除一个条目" + + msgctxt "Operator" msgid "Insert Offset" msgstr "插入偏移" @@ -62638,6 +66689,27 @@ msgid "Automatically offset nodes on insertion" msgstr "插入时自动偏移节点" +msgid "Add a copy of the active item to the interface" +msgstr "在界面上添加一个激活条目的副本" + + +msgctxt "Operator" +msgid "New Item" +msgstr "新建条目" + + +msgid "Add a new item to the interface" +msgstr "给界面添加一个新的条目" + + +msgid "Type of the item to create" +msgstr "创建条目的类型" + + +msgid "Remove active item from the interface" +msgstr "从界面上移除活动的条目" + + msgctxt "Operator" msgid "Join Nodes" msgstr "合并节点" @@ -62792,6 +66864,10 @@ msgid "Create a new geometry node group and assign it to the active modifier" msgstr "创建新的几何节点组,并为其指定活动修改器" +msgid "Create a new geometry node group for a tool" +msgstr "给一个工具创建一个新的几何节点组" + + msgctxt "Operator" msgid "New Geometry Node Modifier" msgstr "新建几何节点修改器" @@ -62898,6 +66974,28 @@ msgid "Render current scene, when input node's layer has been changed" msgstr "渲染当前场景, 前提是输入节点层没有被改变时" +msgctxt "Operator" +msgid "Add Repeat Item" +msgstr "添加重复条目" + + +msgid "Add a repeat item to the repeat zone" +msgstr "给重复区添加一个重复条目" + + +msgctxt "Operator" +msgid "Move Repeat Item" +msgstr "移动重复条目" + + +msgid "Move a repeat item up or down in the list" +msgstr "在列表中上下移动一个重复条目" + + +msgid "Remove a repeat item from the repeat zone" +msgstr "从重复区移除一个重复条目" + + msgctxt "Operator" msgid "Resize Node" msgstr "缩放节点" @@ -62996,6 +67094,33 @@ msgid "Update shader script node with new sockets and options from the script" msgstr "用新的插槽和脚本提供的选项更新着色器脚本节点" +msgctxt "Operator" +msgid "Add State Item" +msgstr "添加状态条目" + + +msgid "Add a state item to the simulation zone" +msgstr "给模拟区添加一个状态条目" + + +msgctxt "Operator" +msgid "Move State Item" +msgstr "移动状态条目" + + +msgid "Move a simulation state item up or down in the list" +msgstr "上下移动列表中模拟区的状态条目" + + +msgctxt "Operator" +msgid "Remove State Item" +msgstr "移除状态条目" + + +msgid "Remove a state item from the simulation zone" +msgstr "从模拟区内移除一个状态条目" + + msgctxt "Operator" msgid "Update Views" msgstr "更新视图" @@ -63378,10 +67503,18 @@ msgid "Curve from Mesh or Text objects" msgstr "网格/文本物体 -> 曲线" +msgid "Point Cloud from Mesh objects" +msgstr "网格物体转点云" + + msgid "Curves from evaluated curve data" msgstr "来自已解算曲线数据的曲线" +msgid "Grease Pencil v3 from Grease Pencil" +msgstr "蜡笔转蜡笔v3" + + msgctxt "Operator" msgid "Copy Global Transform" msgstr "复制全局变换" @@ -63534,6 +67667,10 @@ msgid "Session UUID of the geometry node group being dropped" msgstr "要删除的几何节点组的会话 UUID" +msgid "Show the datablock selector in the modifier" +msgstr "显示修改器中数据块选择器" + + msgctxt "Operator" msgid "Add Empty Image/Drop Image to Empty" msgstr "添加空图像 / 将图像拖拽到空物体中" @@ -63661,6 +67798,10 @@ msgid "Switch between an attribute and a single value to define the data for eve msgstr "在属性和单个值之间切换以定义每个元素的数据" +msgid "Move inputs and outputs from in the modifier to a new node group" +msgstr "将修改器中的输入和输出移动到新节点组" + + msgctxt "Operator" msgid "Add Grease Pencil" msgstr "添加蜡笔" @@ -63687,7 +67828,7 @@ msgstr "猴头" msgid "Construct a Suzanne grease pencil object" -msgstr "构建一个蜡笔猴头物体" +msgstr "构建一个名叫苏珊娜的猴头蜡笔物体" msgid "Scene Line Art" @@ -64025,6 +68166,84 @@ msgid "Add a light object to the scene" msgstr "向场景中添加灯光物体" +msgctxt "Operator" +msgid "New Light Linking Collection" +msgstr "新的灯光链接集合" + + +msgid "Create new light linking collection used by the active emitter" +msgstr "使用活动的发光体创建新的灯光链接集合" + + +msgctxt "Operator" +msgid "Link Blockers to Emitter" +msgstr "链接阻断器到发光体" + + +msgid "Light link selected blockers to the active emitter object" +msgstr "灯光将选定的阻断器链接到活动的发光体" + + +msgid "State of the shadow linking" +msgstr "阴影链接的状态" + + +msgid "Include selected blockers to cast shadows from the active emitter" +msgstr "包括选定的阻断器从活动发光体投射阴影" + + +msgid "Exclude selected blockers from casting shadows from the active emitter" +msgstr "排出选定的阻断器从活动发光体投射阴影" + + +msgctxt "Operator" +msgid "Select Light Linking Blockers" +msgstr "选择灯光链接阻断器" + + +msgid "Select all objects which block light from this emitter" +msgstr "选择所有从此发光体阻断灯光的物体" + + +msgctxt "Operator" +msgid "Link Receivers to Emitter" +msgstr "链接接收器到发光体" + + +msgid "Light link selected receivers to the active emitter object" +msgstr "灯光链接选择的接收器到活动的发光体" + + +msgid "State of the light linking" +msgstr "灯光链接状态" + + +msgid "Include selected receivers to receive light from the active emitter" +msgstr "包括 选中的接收器来接收来自活动发光体的光" + + +msgid "Exclude selected receivers from receiving light from the active emitter" +msgstr "排除选定的接收器接收来自活动发光体的光" + + +msgctxt "Operator" +msgid "Select Light Linking Receivers" +msgstr "选择灯光链接接收器" + + +msgid "Select all objects which receive light from this emitter" +msgstr "选择从该发光体接收光的所有对象" + + +msgctxt "Operator" +msgid "Remove From Light Linking Collection" +msgstr "从灯光链接集合中移除" + + +msgid "Remove this object or collection from the light linking collection" +msgstr "从灯光链接集合中删除该对象或集合" + + msgctxt "Operator" msgid "Add Light Probe" msgstr "添加光照探头" @@ -64039,6 +68258,10 @@ msgid "Bake Light Cache" msgstr "烘焙光照缓存" +msgid "Bake irradiance volume light cache" +msgstr "烘焙辐射体积光缓存" + + msgid "Delay in millisecond before baking starts" msgstr "烘焙开始前延迟一毫秒" @@ -64051,10 +68274,22 @@ msgid "Subset of probes to update" msgstr "要更新的探头子集" +msgid "Bake all light probe volumes" +msgstr "烘焙全部体积光照探头" + + msgid "Selected Only" msgstr "仅选中" +msgid "Only bake selected light probe volumes" +msgstr "仅烘焙选中的体积光照探头" + + +msgid "Only bake the active light probe volume" +msgstr "仅烘焙活动的体积光照探头" + + msgctxt "Operator" msgid "Delete Light Cache" msgstr "删除光照缓存" @@ -64068,6 +68303,18 @@ msgid "All Light Probes" msgstr "全部光照探头" +msgid "Delete all light probes' baked lighting data" +msgstr "删除全部光照探头烘焙灯光数据" + + +msgid "Only delete selected light probes' baked lighting data" +msgstr "只删除选中的光照探头的烘焙灯光数据" + + +msgid "Only delete the active light probe's baked lighting data" +msgstr "仅删除活动的光照探头烘焙灯光数据" + + msgctxt "Operator" msgid "Bake Line Art" msgstr "烘焙线条画" @@ -64827,6 +69074,18 @@ msgid "Paste onto all frames between the first and last selected key, creating n msgstr "粘贴到第一个和最后一个选定关键帧之间的所有帧上,如有必要,可创建新的关键帧" +msgid "Coordinate axis used to mirror the location part of the transform" +msgstr "用于镜像变换位置的坐标轴" + + +msgid "Coordinate axis used to mirror the rotation part of the transform" +msgstr "用于镜像旋转部分的坐标轴" + + +msgid "When pasting, mirror the transform relative to a specific object or bone" +msgstr "当粘贴时,镜像变换相对于一个特定的物体或者骨骼" + + msgctxt "Operator" msgid "Calculate Object Motion Paths" msgstr "计算物体运动路径" @@ -65008,6 +69267,14 @@ msgid "Quick Fur" msgstr "快速毛发" +msgid "Apply Hair Guides" +msgstr "应用头发引导线" + + +msgid "Frizz" +msgstr "毛糙弯曲" + + msgctxt "Operator" msgid "Quick Liquid" msgstr "快速液体" @@ -65286,6 +69553,19 @@ msgid "Render and display faces smooth, using interpolated Vertex Normals" msgstr "渲染并显示光滑面(使用插值后的顶点法向)" +msgctxt "Operator" +msgid "Shade Smooth by Angle" +msgstr "通过角度平滑着色" + + +msgid "Set the sharpness of mesh edges based on the angle between the neighboring faces" +msgstr "基于相邻面之间的角度设置网格边的锐度" + + +msgid "Maximum angle between face normals that will be considered as smooth" +msgstr "将被视为平滑的面法线之间的最大角度" + + msgctxt "Operator" msgid "Add Effect" msgstr "添加效果" @@ -65548,6 +69828,65 @@ msgid "Clamp the transformation to the distance each vertex moves in the origina msgstr "钳制变换时原形状各点间的移动距离" +msgid "Bake simulations in geometry nodes modifiers" +msgstr "烘焙几何节点修改器模拟结果" + + +msgid "Bake cache on all selected objects" +msgstr "所有选择物体烘焙缓存" + + +msgctxt "Operator" +msgid "Bake Single Simulation Zone" +msgstr "烘焙单个模拟区" + + +msgid "Bake a single simulation zone" +msgstr "烘焙单个模拟区" + + +msgid "Nested node id of the node to bake" +msgstr "嵌套节点的节点编号来烘焙" + + +msgid "Name of the modifier that contains the node to bake" +msgstr "包含要烘焙的节点的修改器的名称" + + +msgid "Calculate simulations in geometry nodes modifiers from the start to current frame" +msgstr "从开始到当前帧的几何体节点修改器中计算模拟" + + +msgid "Calculate all selected objects instead of just the active object" +msgstr "计算所有选定对象,而不是仅计算活动对象" + + +msgctxt "Operator" +msgid "Delete Cached Simulation" +msgstr "删除缓存的模拟" + + +msgid "Delete cached/baked simulations in geometry nodes modifiers" +msgstr "删除几何节点修改器中缓存/烘焙的模拟" + + +msgctxt "Operator" +msgid "Delete Single Cached Simulation" +msgstr "删除单个缓存模拟" + + +msgid "Delete simulation data of a single simulation zone" +msgstr "删除单个模拟区的模拟数据" + + +msgid "Nested node id of the bake to delete" +msgstr "要删除的烘焙的嵌套节点 ID" + + +msgid "Name of the modifier that contains the node" +msgstr "包含节点的修改器名称" + + msgctxt "Operator" msgid "Skin Armature Create" msgstr "创建骨架皮肤" @@ -66550,6 +70889,10 @@ msgid "Outliner ID Data Copy" msgstr "大纲 ID 数据复制" +msgid "Copy the selected data-blocks to the internal clipboard" +msgstr "将选定的数据块复制到内部剪贴板" + + msgctxt "Operator" msgid "Delete Data-Block" msgstr "删除数据块" @@ -66613,6 +70956,10 @@ msgid "Outliner ID Data Paste" msgstr "大纲 ID 数据粘贴" +msgid "Paste data-blocks from the internal clipboard" +msgstr "从内部剪贴板粘贴数据块" + + msgctxt "Operator" msgid "Outliner ID Data Remap" msgstr "大纲 ID 数据重映射" @@ -67155,6 +71502,10 @@ msgid "Material layer type of new paint slot" msgstr "新绘制槽的材质层类型" +msgid "Specular IOR Level" +msgstr "高光IOR" + + msgctxt "Operator" msgid "Swap Colors" msgstr "切换颜色" @@ -67214,6 +71565,14 @@ msgid "Hide selected faces" msgstr "隐藏所选面" +msgid "Deselect Faces connected to existing selection" +msgstr "取消选择连接到现有选择的面" + + +msgid "Also deselect faces that only touch on a corner" +msgstr "同时取消选择仅接触拐角的面" + + msgid "Select linked faces" msgstr "选择相连面" @@ -67227,6 +71586,18 @@ msgid "Select linked faces under the cursor" msgstr "选择光标下的相连面" +msgid "If false, faces will be deselected" +msgstr "如果为否,面将被取消选择" + + +msgid "Select Faces connected to existing selection" +msgstr "选择连接到现有选择的面" + + +msgid "Also select faces that only touch on a corner" +msgstr "同时选择仅接触拐角的面" + + msgctxt "Operator" msgid "Reveal Faces/Vertices" msgstr "显示面/顶点" @@ -67532,6 +71903,10 @@ msgid "Fill the active vertex color layer with the current paint color" msgstr "使用当前绘制颜色填充活动顶点色层" +msgid "Set color completely opaque instead of reusing existing alpha" +msgstr "将颜色设置为完全不透明,替代重复使用现有的alpha" + + msgctxt "Operator" msgid "Smooth Vertex Colors" msgstr "平滑顶点色" @@ -68521,6 +72896,14 @@ msgid "Select all visible bones grouped by similar properties" msgstr "选择所有属性相似的可见骨骼" +msgid "Same collections as the active bone" +msgstr "与活动骨骼相同的集合" + + +msgid "Same color as the active bone" +msgstr "与活动骨骼颜色相同" + + msgid "All bones affected by active Keying Set" msgstr "受插帧集影响的全部骨骼" @@ -68718,6 +73101,24 @@ msgid "Copy settings from previous version" msgstr "复制之前版本的设置" +msgctxt "Operator" +msgid "Add Extension Repository" +msgstr "添加扩展存储库" + + +msgid "Add a directory to be used as a local extension repository" +msgstr "添加用作本地扩展存储库的目录" + + +msgctxt "Operator" +msgid "Remove Extension Repository" +msgstr "删除扩展存储库" + + +msgid "Remove an extension repository" +msgstr "删除一个扩展存储库" + + msgctxt "Operator" msgid "Activate Keyconfig" msgstr "激活键配置" @@ -68905,6 +73306,10 @@ msgid "Remove existing theme file if exists" msgstr "如果主题文件存在则移除" +msgid "Remove this installation's associations with .blend files" +msgstr "删除.blend文件的安装关联" + + msgctxt "Operator" msgid "Add New Cache" msgstr "添加新缓存" @@ -69438,6 +73843,10 @@ msgid "Fill Range by Selection" msgstr "按选中项填充范围" +msgid "Fill the Range Min/Max entries by the min/max distance between selected mesh objects and the source object (either a user-specified object or the active camera)" +msgstr "根据所选网格对象和源对象之间的最小/最大距离,填充范围最小/最大条目" + + msgid "Name of the modifier to work on" msgstr "工作中的修改器名称" @@ -69481,6 +73890,10 @@ msgid "Copy Line Set" msgstr "复制线条集合" +msgid "Copy the active line set to the internal clipboard" +msgstr "将活动线条集复制到内部剪贴板" + + msgctxt "Operator" msgid "Move Line Set" msgstr "移动线条集合" @@ -69604,6 +74017,10 @@ msgid "Add a line thickness modifier to the line style associated with the activ msgstr "给激活的线条集添加一个线条粗细修改器" +msgid "Refresh list of actions" +msgstr "刷新动作列表" + + msgctxt "Operator" msgid "Add Grease Pencil Brush Preset" msgstr "添加蜡笔笔刷预设" @@ -70383,6 +74800,10 @@ msgid "Apply force in the Z axis" msgstr "力作用在Z轴向" +msgid "How many times to repeat the filter" +msgstr "重复滤镜多少次" + + msgid "Orientation of the axis to limit the filter force" msgstr "限制滤镜力场的轴向方位" @@ -70399,6 +74820,10 @@ msgid "Use the view axis to limit the force and set the gravity direction" msgstr "使用视图轴向限制力并设置重力方向" +msgid "Starting Mouse" +msgstr "启动鼠标" + + msgid "Filter strength" msgstr "过滤强度" @@ -70707,10 +75132,6 @@ msgid "Modify Hidden" msgstr "修改隐藏" -msgid "Apply the edit operation to hidden Face Sets" -msgstr "将编辑操作应用于隐藏的面集" - - msgctxt "Operator" msgid "Face Set Lasso Gesture" msgstr "面组套索手势" @@ -70974,10 +75395,6 @@ msgid "Use settings from here" msgstr "使用此处的设置" -msgid "Operator" -msgstr "操作项" - - msgid "Use settings from operator properties" msgstr "使用来自操作项属性的设置" @@ -71371,6 +75788,14 @@ msgid "The effect inputs to swap" msgstr "交换特效输入" +msgid "B → C" +msgstr "B → C" + + +msgid "A → C" +msgstr "A → C" + + msgctxt "Operator" msgid "Change Effect Type" msgstr "改变特效类型" @@ -71977,6 +76402,56 @@ msgid "Set render size and aspect from active sequence" msgstr "按照活动序列设置渲染的尺寸及宽高比" +msgctxt "Operator" +msgid "Add Freeze Frame" +msgstr "添加冻结帧" + + +msgid "Add freeze frame" +msgstr "添加冻结帧" + + +msgid "Duration of freeze frame segment" +msgstr "冻结帧区段的持续时间" + + +msgctxt "Operator" +msgid "Add Retiming Key" +msgstr "添加重定时关键帧" + + +msgid "Add retiming Key" +msgstr "添加重定时关键帧" + + +msgid "Timeline Frame" +msgstr "时间区间" + + +msgid "Frame where key will be added" +msgstr "添加关键帧的区间" + + +msgid "Reset strip retiming" +msgstr "重置片段的重定时" + + +msgid "Set speed of retimed segment" +msgstr "设定重定时的片段速度" + + +msgid "New speed of retimed segment" +msgstr "重定时区间的新速度" + + +msgid "Show retiming keys in selected strips" +msgstr "在选中的片段中显示重定时关键帧" + + +msgid "Add smooth transition between 2 retimed segments" +msgstr "在两个重定时的区间内添加平滑变换" + + msgid "Use mouse to sample color in current frame" msgstr "在当前图像中使用鼠标来采样" @@ -72130,7 +76605,7 @@ msgstr "选择控制柄" msgid "Select gizmo handles on the sides of the selected strip" -msgstr "选择所选片段两侧的gizmo控制柄" +msgstr "选择所选片段两侧的操控器控制柄" msgid "The side of the handle that is selected" @@ -72356,6 +76831,35 @@ msgid "Append active modifiers to selected strips" msgstr "向选中的片段追加活动修改器" +msgctxt "Operator" +msgid "Redefine Equalizer Graphs" +msgstr "重置均衡器图" + + +msgid "Redefine equalizer graphs" +msgstr "重置均衡器图" + + +msgid "Unique" +msgstr "唯一" + + +msgid "One unique graphical definition" +msgstr "一个唯一的图形定义" + + +msgid "Graphical definition in 2 sections" +msgstr "两个部分的图形定义" + + +msgid "Triplet" +msgstr "三连" + + +msgid "Graphical definition in 3 sections" +msgstr "三个部分的图形定义" + + msgctxt "Operator" msgid "Move Strip Modifier" msgstr "删除片段修改器" @@ -72546,7 +77050,7 @@ msgstr "高级音频编码" msgid "Dolby Digital ATRAC 3" -msgstr "Dolby Digital ATRAC 3" +msgstr "杜比数字 ATRAC 3" msgid "Free Lossless Audio Codec" @@ -72554,11 +77058,11 @@ msgstr "自由无损音频编码器" msgid "MPEG-1 Audio Layer II" -msgstr "MPEG-1 Audio Layer II" +msgstr "MPEG-1 音频层 II" msgid "MPEG-2 Audio Layer III" -msgstr "MPEG-2 Audio Layer III" +msgstr "MPEG-2 音频层 III" msgid "Pulse Code Modulation (RAW)" @@ -72836,6 +77340,11 @@ msgid "Copy the texture settings and nodes" msgstr "复制纹理设置与节点" +msgctxt "Operator" +msgid "Add Text Editor Preset" +msgstr "添加文本编辑器预设" + + msgctxt "Operator" msgid "Text Auto Complete" msgstr "文本自动补全" @@ -72940,10 +77449,23 @@ msgid "Line number to jump to" msgstr "要跳转到的行号" +msgctxt "Operator" +msgid "Jump to File at Point" +msgstr "在光标的位置跳至文件" + + +msgid "Jump to a file for the text editor" +msgstr "文本编辑器跳转至一个文件" + + msgid "Column" msgstr "列" +msgid "Column to jump to" +msgstr "要跳转到的列" + + msgctxt "Operator" msgid "Line Number" msgstr "行号" @@ -73387,7 +77909,7 @@ msgstr "目标: 包括活动" msgctxt "Operator" msgid "Transform from Gizmo" -msgstr "从Gizmo变换" +msgstr "从操控器变换" msgid "Mirror selected items around one or more axes" @@ -74077,6 +78599,15 @@ msgid "Update given add-on's translation data (found as a py tuple in the add-on msgstr "更新指定的插件数据(作为插件源代码的一个 py 元组来查找)" +msgctxt "Operator" +msgid "Clean up I18n Work Repository" +msgstr "清理I18n工作存储库" + + +msgid "Clean up i18n working repository (po files)" +msgstr "清理I18n工作存储库 (po文件)" + + msgctxt "Operator" msgid "Edit Translation Update Mo" msgstr "编辑翻译并更新至MO" @@ -74108,6 +78639,15 @@ msgid "Save translations' settings in a persistent JSon file" msgstr "将翻译设置保存为连续的 JSon 文件" +msgctxt "Operator" +msgid "Update I18n Blender Repository" +msgstr "更新 I18n Blender存储库" + + +msgid "Update i18n data (po files) in Blender source code repository" +msgstr "在Blender源代码库中更新i18n数据(po文件)" + + msgctxt "Operator" msgid "Init I18n Update Settings" msgstr "初始化i18n更新设置" @@ -74143,6 +78683,15 @@ msgid "Create or extend a 'i18n_info.txt' Text datablock" msgstr "创建或扩展 'i18n_info.txt' 文本数据块" +msgctxt "Operator" +msgid "Update I18n Work Repository" +msgstr "更新 I18n 工作存储库" + + +msgid "Update i18n working repository (po files)" +msgstr "更新 i18n 存储库 (po 文件)" + + msgid "Skip POT" msgstr "跳过 POT" @@ -74254,6 +78803,10 @@ msgid "Clear the property and use default or generated value in operators" msgstr "清除属性并使用默认或者创建的值来运算" +msgid "Drag and drop onto a data-set or item within the data-set" +msgstr "拖放到数据集或数据集中的条目上" + + msgctxt "Operator" msgid "Rename View Item" msgstr "重命名视图条目" @@ -74280,14 +78833,30 @@ msgid "Straighten X" msgstr "X 向拉直" +msgid "Align UV vertices, moving them horizontally to the line defined by the endpoints" +msgstr "对齐 UV 顶点,将它们水平移动到端点定义的线" + + msgid "Straighten Y" msgstr "Y 向拉直" +msgid "Align UV vertices, moving them vertically to the line defined by the endpoints" +msgstr "对齐 UV 顶点,将它们垂直移动到由端点定义的线" + + msgid "Align Auto" msgstr "自动对齐" +msgid "Align UV vertices on a vertical line" +msgstr "将 UV 顶点对齐在垂直线上" + + +msgid "Align UV vertices on a horizontal line" +msgstr "在水平线上对齐 UV 顶点" + + msgctxt "Operator" msgid "Align Rotation" msgstr "对齐旋转" @@ -74457,6 +79026,10 @@ msgid "Radius of the sphere or cylinder" msgstr "球体或圆柱的半径" +msgid "Separate projections by islands isolated by seams" +msgstr "通过由接缝隔离的孤岛分离投影" + + msgctxt "Operator" msgid "Export UV Layout" msgstr "导出 UV 布局图" @@ -74474,6 +79047,26 @@ msgid "Export all UVs in this mesh (not just visible ones)" msgstr "输出当前网格的所有 UV (不只是可视)" +msgid "Choose whether to export only the [0, 1] range, or all UV tiles" +msgstr "选择是导出[0, 1] 区间还是全部平铺UV" + + +msgid "Export only UVs in the [0, 1] range" +msgstr "只导出[0, 1]之间的UV" + + +msgid "Export tiles in the UDIM numbering scheme: 1001 + u_tile + 10*v_tile" +msgstr "导出平铺的UDIM数字形式:1001 + u_tile + 10*v_tile" + + +msgid "UVTILE" +msgstr "UV平铺" + + +msgid "Export tiles in the UVTILE numbering scheme: u(u_tile + 1)_v(v_tile + 1)" +msgstr "导出平铺的UVTILE,数字形式: u(u_tile + 1)_v(v_tile + 1)" + + msgid "File format to export the UV layout to" msgstr "UV 布局图的导出文件格式" @@ -74662,6 +79255,78 @@ msgid "Specify a precise fraction of final UV output" msgstr "指定最终UV输出的精确比例" +msgid "Merge Overlapping" +msgstr "合并重叠" + + +msgid "Overlapping islands stick together" +msgstr "重叠的孤岛粘在一起" + + +msgid "Lock Pinned Islands" +msgstr "锁定钉固的孤岛" + + +msgid "Constrain islands containing any pinned UV's" +msgstr "约束包含任何固定UV的孤岛" + + +msgid "Pinned islands won't rescale" +msgstr "钉固的孤岛将不可缩放" + + +msgid "Pinned islands won't rotate" +msgstr "钉固的孤岛将不可旋转" + + +msgid "Pinned islands will translate only" +msgstr "钉固的孤岛将只能平移" + + +msgid "Pinned islands are locked in place" +msgstr "钉固的孤岛被锁定在位置上" + + +msgid "Rotate islands to improve layout" +msgstr "旋转孤岛以便改良布局" + + +msgid "Axis-aligned" +msgstr "轴对齐" + + +msgid "Rotated to a minimal rectangle, either vertical or horizontal" +msgstr "旋转到最小矩形,垂直或水平" + + +msgid "Only 90 degree rotations are allowed" +msgstr "只允许 90 度旋转" + + +msgid "Any angle is allowed for rotation" +msgstr "允许任意角度旋转" + + +msgid "Scale islands to fill unit square" +msgstr "缩放孤岛以填充单位正方形" + + +msgid "Exact Shape (Concave)" +msgstr "精确外形(凹形)" + + +msgid "Uses exact geometry" +msgstr "使用精确的几何形状" + + +msgid "Uses convex hull" +msgstr "使用凸壳外形" + + +msgid "Uses bounding boxes" +msgstr "使用边界框" + + msgid "Pack to" msgstr "拼排至" @@ -74682,6 +79347,14 @@ msgid "Pack islands to active UDIM image tile or UDIM grid tile where 2D cursor msgstr "将孤岛拼排到2D游标位置的活动UDIM图像分块或 UDIM 网格分块" +msgid "Original bounding box" +msgstr "原始边界框" + + +msgid "Pack to starting bounding box of islands" +msgstr "打包到孤岛的起始边界框" + + msgctxt "Operator" msgid "Paste UVs" msgstr "粘贴UV" @@ -74902,6 +79575,16 @@ msgid "Select similar UVs by property types" msgstr "按属性类型选择相似的 UV" +msgctxt "Mesh" +msgid "Area 3D" +msgstr "区域3D" + + +msgctxt "Mesh" +msgid "Amount of Faces in Island" +msgstr "孤岛中的面数" + + msgctxt "Operator" msgid "Select Split" msgstr "拆分选中项" @@ -75500,6 +80183,10 @@ msgid "Paste Objects" msgstr "粘贴物体" +msgid "Paste objects from the internal clipboard" +msgstr "从内部剪贴板粘贴物体" + + msgid "Put pasted objects in the active collection" msgstr "将被粘贴物体放置到活动集合中" @@ -75691,11 +80378,11 @@ msgstr "透明场景显示。允许通条目选择" msgctxt "Operator" msgid "Transform Gizmo Set" -msgstr "变换Gizmo设置" +msgstr "变换操控器设置" msgid "Set the current transform gizmo" -msgstr "设置当前变换Gizmo" +msgstr "设置当前变换操控器" msgctxt "Operator" @@ -76317,6 +81004,10 @@ msgid "Select new objects" msgstr "选择新物体" +msgid "Don't add asset meta-data or tags from the original data-block" +msgstr "不要从原始数据块添加资产元数据或标记" + + msgid "Re-Use Local Data" msgstr "重新使用本地数据" @@ -76769,7 +81460,7 @@ msgstr "寻找最匹配的骨骼链,并确保链上的骨骼连接起来" msgid "Fix Leaf Bones" -msgstr "Fix Leaf Bones" +msgstr "修正叶骨" msgid "Fix Orientation of Leaf Bones (Collada does only support Joints)" @@ -77375,6 +82066,10 @@ msgid "Export Materials with PBR Extensions" msgstr "使用 PBR 扩展导出材质" +msgid "Export MTL library using PBR extensions (roughness, metallic, sheen, coat, anisotropy, transmission)" +msgstr "使用PBR扩展导出MTL库(糙度、金属、边缘光泽、涂层、各向异性、透射)" + + msgid "Export Selected Objects" msgstr "导出选中的物体" @@ -77396,7 +82091,7 @@ msgstr "导出三角化网格" msgid "All ngons with four or more vertices will be triangulated. Meshes in the scene will not be affected. Behaves like Triangulate Modifier with ngon-method: \"Beauty\", quad-method: \"Shortest Diagonal\", min vertices: 4" -msgstr "所有具有四个或更多顶点的多边形都将进行三角化。场景中的网格将不受影响。行为类似于三角化修改器,多边形方法:\"布线优化\",四边面拆分方法:\"最短对角线\",最小顶点:4" +msgstr "所有具有四个或更多顶点的多边形都将进行三角化。场景中的网格将不受影响。行为类似于三角化修改器,多边形方法:\"布线优化\",四边面拆分方法:\"最短对角线\",最少顶点:4" msgid "Export Vertex Groups" @@ -77578,6 +82273,26 @@ msgid "Export PLY" msgstr "导出PLY" +msgid "ASCII Format" +msgstr "ASCII 格式" + + +msgid "Export file in ASCII format, export as binary otherwise" +msgstr "以 ASCII 格式导出文件,否则导出为二进制文件" + + +msgid "Vertex colors in the file are in sRGB color space" +msgstr "文件中的顶点颜色基于 sRGB 颜色空间" + + +msgid "Vertex colors in the file are in linear color space" +msgstr "文件中的顶点颜色位于线性颜色空间中" + + +msgid "Export specific vertex normals if available, export calculated normals otherwise" +msgstr "出特定顶点法线(如果可用),否则导出计算的法线" + + msgctxt "Operator" msgid "Import PLY" msgstr "导入PLY" @@ -77813,6 +82528,10 @@ msgid "A string value" msgstr "字符串值" +msgid "A data-block value" +msgstr "一个数据块值" + + msgid "Soft Max" msgstr "软限制最大值" @@ -78164,6 +82883,10 @@ msgid "Exit Blender after saving" msgstr "保存后退出Blender" +msgid "Save the current Blender file with a numerically incremented name that does not overwrite any existing files" +msgstr "使用数字递增的名称保存当前Blender文件,该名称不会覆盖任何现有文件" + + msgctxt "Operator" msgid "Save Preferences" msgstr "保存用户设置" @@ -78191,6 +82914,18 @@ msgid "Pop-up a search over all available operators in current context" msgstr "弹出搜索框,查找当前上下文所有可用操作" +msgid "Initial Query" +msgstr "初始查询" + + +msgid "Query to insert into the search box" +msgstr "到搜索框中的查询" + + +msgid "Menu to search in" +msgstr "要搜索的菜单" + + msgctxt "Operator" msgid "Set Stereo 3D" msgstr "设置立体3D" @@ -78306,6 +83041,14 @@ msgid "Open a window with information about Blender" msgstr "打开一个窗口,显示有关Blender的信息" +msgid "Batch Export" +msgstr "批量导出" + + +msgid "Export each object to a separate file" +msgstr "导出每个物体为单独分离的文件" + + msgid "Import an STL file as an object" msgstr "导入STL文件为物体" @@ -78438,6 +83181,10 @@ msgid "Export viewport settings of materials as USD preview materials, and expor msgstr "将材质的视图设置导出为 USD 预览材质,并将材质指定导出为几何体子集" +msgid "Include mesh color attributes in the export" +msgstr "导出时包含网格颜色属性" + + msgid "Include normals of exported meshes in the export" msgstr "在导出中包含被导出网格的法向" @@ -78474,6 +83221,14 @@ msgid "Use relative paths to reference external files (i.e. textures, volumes) i msgstr "使用相对路径引用USD格式外部文件(即纹理、体积),否则使用绝对路径" +msgid "Root Prim" +msgstr "根基图元" + + +msgid "If set, add a transform primitive with the given path to the stage as the parent of all exported data" +msgstr "如果设置,添加一个给定路径的变换图元作为所有导出数据的父级" + + msgid "Only export selected objects. Unselected parents of selected objects are exported as empty transform" msgstr "仅导出选中的物体。所选物体的未选定父级将导出为空变换" @@ -78576,7 +83331,7 @@ msgstr "导入USD预览" msgid "Convert UsdPreviewSurface shaders to Principled BSDF shader networks" -msgstr "将 UsdPreview 表面着色器转换为有原则的 BSDF 着色器网络" +msgstr "将USD预览表面着色器转换为原理化BSDF着色器网络" msgid "Visible Primitives Only" @@ -78623,6 +83378,14 @@ msgid "Path Mask" msgstr "路径遮罩" +msgid "Import only the primitive at the given path and its descendants. Multiple paths may be specified in a list delimited by commas or semicolons" +msgstr "只导入给定路径的图元及其子级,可以在列表中用逗号或分号分隔指定多个路径" + + +msgid "Read USD Primvars as mesh attributes" +msgstr "读取USD Primvars作为网格属性" + + msgid "Read mesh color attributes" msgstr "读取网格颜色属性" @@ -79568,14 +84331,6 @@ msgid "Panel containing UI elements" msgstr "面板包含用户界面元素" -msgid "Refraction" -msgstr "折射" - - -msgid "Denoising" -msgstr "降噪" - - msgid "Light Groups" msgstr "灯光组" @@ -79596,6 +84351,10 @@ msgid "Viewport Sampling Presets" msgstr "视图采样预设" +msgid "Physical light sources" +msgstr "物理光源" + + msgid "Film" msgstr "胶片" @@ -79757,6 +84516,10 @@ msgid "Shadow Terminator" msgstr "阴影分界线" +msgid "Shadow Linking" +msgstr "阴影链接" + + msgid "Ray Visibility" msgstr "射线可见性" @@ -79923,7 +84686,7 @@ msgstr "最近打开的文件" msgctxt "File browser" msgid "Volumes" -msgstr "体积 (卷标)" +msgstr "卷标" msgid "Directory Path" @@ -79938,6 +84701,22 @@ msgid "Fluid Presets" msgstr "流体预设" +msgid "Rest & Ranges" +msgstr "静置和范围" + + +msgid "Sampling Animations" +msgstr "采样动画" + + +msgid "Scene Graph" +msgstr "场景结构" + + +msgid "Unused Textures & Images" +msgstr "未使用的纹理和图像" + + msgid "Exporter Extensions" msgstr "导出器扩展" @@ -79955,7 +84734,7 @@ msgstr "叠加" msgid "Guides" -msgstr "辅助(引导)" +msgstr "引导" msgid "UV Editing" @@ -80194,7 +84973,7 @@ msgstr "糙度" msgctxt "ParticleSettings" msgid "Emission" -msgstr "自发光(发射)" +msgstr "发射" msgid "Field Weights" @@ -80234,7 +85013,7 @@ msgstr "毛发形状" msgid "Battle" -msgstr "战场" +msgstr "战斗" msgid "Misc" @@ -80393,6 +85172,22 @@ msgid "Indirect Lighting" msgstr "间接光照明" +msgid "Denoising" +msgstr "降噪" + + +msgid "Horizon Scan" +msgstr "水平扫描" + + +msgid "Raytracing" +msgstr "光追" + + +msgid "Screen Tracing" +msgstr "屏幕追踪" + + msgid "Shadows" msgstr "阴影" @@ -80425,10 +85220,18 @@ msgid "Video" msgstr "视频" +msgid "FFmpeg Presets" +msgstr "FFmpeg预设" + + msgid "Format Presets" msgstr "格式预设" +msgid "Hydra Debug" +msgstr "Hydra调试" + + msgid "Views" msgstr "视图" @@ -80556,6 +85359,10 @@ msgid "Prototypes" msgstr "原型" +msgid "Extension Repositories" +msgstr "扩展存储库" + + msgid "Applications" msgstr "应用" @@ -80568,6 +85375,10 @@ msgid "Development" msgstr "开发" +msgid "Script Directories" +msgstr "脚本目录" + + msgid "Tablet" msgstr "数位板" @@ -80665,6 +85476,10 @@ msgid "Operating System Settings" msgstr "操作系统设置" +msgid "Text Editor Presets" +msgstr "文本编辑器预设" + + msgid "Bone Color Sets" msgstr "骨骼配色集" @@ -80685,8 +85500,12 @@ msgid "Collection Colors" msgstr "集合颜色" +msgid "Dope Sheet/Timeline" +msgstr "动画摄影表/时间线" + + msgid "Axis & Gizmo Colors" -msgstr "轴 & Gizmo颜色" +msgstr "轴 & 操控器颜色" msgid "Icon Colors" @@ -80769,6 +85588,10 @@ msgid "Global Transform" msgstr "全局变换" +msgid "Mirror Options" +msgstr "镜像选项" + + msgid "Curves Sculpt Add Curve Options" msgstr "曲线雕刻 添加曲线选项" @@ -80777,6 +85600,10 @@ msgid "Curves Grow/Shrink Scaling" msgstr "曲线生长/收缩缩放" +msgid "Curves Sculpt Parameter Falloff" +msgstr "曲线雕刻衰减参数" + + msgid "Brush Presets" msgstr "笔刷预设" @@ -80976,7 +85803,7 @@ msgstr "使毛发挺立" msgid "Cut hairs" -msgstr "切割毛发" +msgstr "剪发" msgctxt "Operator" @@ -80990,7 +85817,7 @@ msgstr "毛发粒子权重" msgctxt "Operator" msgid "Draw Sharp" -msgstr "显示锐边" +msgstr "绘制锐边" msgctxt "Operator" @@ -82447,6 +87274,10 @@ msgid "Channel Matrix" msgstr "通道矩阵" +msgid "4×4 matrix of the bone's location/rotation/scale channels (including animation and drivers) and the effect of bone constraints" +msgstr "骨骼的位置/旋转/缩放通道的4x4矩阵(包含动画和驱动器),以及骨骼约束的效果" + + msgid "Parent of this pose bone" msgstr "此姿态骨骼的父系" @@ -82591,6 +87422,14 @@ msgid "Save preferences on exit when modified (unless factory settings have been msgstr "在退出时保存偏好设置修改(除非已加载初始设置)" +msgid "Recent Searches" +msgstr "最近搜索" + + +msgid "Sort the recently searched items at the top" +msgstr "最近搜索的项目在排序中置顶" + + msgid "Version of Blender the userpref.blend was saved with" msgstr "保存该userpref.blend文件的Blender程序版本" @@ -82695,6 +87534,14 @@ msgid "Pixels moved by mouse per axis when drawing stroke" msgstr "使用鼠标绘制时笔画在各轴向上的移动像素" +msgid "Default Key Channels" +msgstr "默认关键帧通道" + + +msgid "Which channels to insert keys at when no keying set is active" +msgstr "当没有激活帧插集时,要在哪些通道插入关键帧" + + msgid "New Handles Type" msgstr "新的控制柄类型" @@ -82728,6 +87575,14 @@ msgid "Minimum distance between nodes for Auto-offsetting nodes" msgstr "节点间自动偏移的最小距离" +msgid "Node Preview Resolution" +msgstr "节点预览分辨率" + + +msgid "Resolution used for Shader node previews (should be changed for performance convenience)" +msgstr "用于着色器节点预览的分辨率(可以根据性能进行更改)" + + msgid "Auto-offset" msgstr "自动偏移" @@ -82968,6 +87823,10 @@ msgid "Enter edit mode automatically after adding a new object" msgstr "添加一个新物体后自动进入其编辑模式" +msgid "F-Curve High Quality Drawing" +msgstr "函数曲线高质量绘制" + + msgid "Global Undo" msgstr "全局撤销" @@ -83072,6 +87931,14 @@ msgid "Enable Cycles debugging options for developers" msgstr "为开发人员启用Cycles调试选项" +msgid "EEVEE Debug" +msgstr "EEVEE 调试" + + +msgid "Experimental Compositors" +msgstr "实验性的合成器" + + msgid "Extended Asset Browser" msgstr "扩展资产浏览器" @@ -83080,6 +87947,14 @@ msgid "Enable Asset Browser editor and operators to manage regular data-blocks a msgstr "启用资产浏览器编辑器和操作将数据块作为资产管理,而非仅姿态" +msgid "Enables extension repositories, accessible from the \"Extension Repositories\" panel in the \"File Paths\" section of the preferences. These paths are exposed as add-ons, package management is not yet integrated" +msgstr "启用扩展存储库,可从偏好设置的“文件路径”部分的“扩展存储库”面板进行访问。这些路径作为附加插件公开,包的管理尚未集成" + + +msgid "Enable the new grease pencil 3.0 codebase" +msgstr "启用新的蜡笔3.0代码库" + + msgid "New Curves Tools" msgstr "新曲线工具" @@ -83124,6 +87999,10 @@ msgid "Support for pen tablet tilt events in Sculpt Mode" msgstr "在雕刻模式下支持数位板倾斜事件" +msgid "Enables previews in the shader node editor" +msgstr "在着色器节点编辑器中启用预览" + + msgid "Undo Legacy" msgstr "撤消(旧版)" @@ -83136,6 +88015,18 @@ msgid "Enable viewport debugging options for developers in the overlays pop-over msgstr "在叠加弹出窗口中为开发人员启用视口调试选项" +msgid "Index of the asset library being edited in the Preferences UI" +msgstr "偏好设置界面中资产库编号" + + +msgid "Active Extension Repository" +msgstr "活动的扩展存储库" + + +msgid "Index of the extensions repository being edited in the Preferences UI" +msgstr "在偏好设置界面中编辑的扩展存储库的索引" + + msgid "Animation Player" msgstr "动画播放器" @@ -83332,6 +88223,32 @@ msgid "The directory for storing temporary save files" msgstr "配置临时文件的保存路径" +msgid "" +"Command to launch the text editor, either a full path or a command in $PATH.\n" +"Use the internal editor when left blank" +msgstr "" +"命令启动文本编辑器,可以是完整路径,也可以是$PATH中的命令\n" +"留空时使用内部编辑器" + + +msgid "" +"Defines the specific format of the arguments with which the text editor opens files. The supported expansions are as follows:\n" +"\n" +"$filepath The absolute path of the file.\n" +"$line The line to open at (Optional).\n" +"$column The column to open from the beginning of the line (Optional).\n" +"$line0 & column0 start at zero.\n" +"Example: -f $filepath -l $line -c $column" +msgstr "" +"定义打开文件时文本编辑器所需参数的特定格式。支持的扩展如下:\n" +"\n" +"$filepath 文件的绝对路径。\n" +"$line 打开时的行(可选)。\n" +"$column 从行的开头打开到列(可选)。\n" +"$line0 & $column0 从零开始。\n" +"示例:-f $filepath -l $line -c $column" + + msgid "The default directory to search for textures" msgstr "默认纹理查找目录" @@ -83816,6 +88733,22 @@ msgid "Quality of anisotropic filtering" msgstr "各向异性过滤的质量" +msgid "2×" +msgstr "2×" + + +msgid "4×" +msgstr "4×" + + +msgid "8×" +msgstr "8×" + + +msgid "16×" +msgstr "16×" + + msgid "Audio Device" msgstr "音频设备" @@ -84068,6 +89001,14 @@ msgid "Use GLSL shaders for display transform and display image with 2D texture" msgstr "使用GLSL着色器显示变换并使用二维纹理显示图像" +msgid "Is Microsoft Store Install" +msgstr "微软商店安装" + + +msgid "Whether this blender installation is a sandboxed Microsoft Store version" +msgstr "此 Blender 安装是否为微软商店的沙盒版本" + + msgid "Legacy Compute Device Type" msgstr "传统计算设备类型" @@ -84092,6 +89033,14 @@ msgid "Memory cache limit (in megabytes)" msgstr "内存缓存限值(MB)" +msgid "Register for All Users" +msgstr "为所有用户注册" + + +msgid "Make this Blender version open blend files for all users. Requires elevated privileges" +msgstr "使此 Blender 版本对所有用户注册 blend文件,需要提升权限" + + msgid "Maximum number of lines to store for the console buffer" msgstr "用于存储控制台缓存的最大行数" @@ -84437,19 +89386,19 @@ msgstr "界面等宽字体路径" msgid "Gizmo Size" -msgstr "Gizmo大小" +msgstr "操控器大小" msgid "Diameter of the gizmo" -msgstr "Gizmo直径" +msgstr "操控器直径" msgid "Navigate Gizmo Size" -msgstr "漫游Gizmo大小" +msgstr "漫游操控器尺寸" msgid "The Navigate Gizmo size" -msgstr "漫游Gizmo大小" +msgstr "漫游操控器尺寸" msgid "Header Position" @@ -84576,6 +89525,10 @@ msgid "Tap Key Timeout" msgstr "击键超时" +msgid "The number of frames to use for calculating FPS average. Zero to calculate this automatically, where the number of samples matches the target FPS" +msgstr "用于计算平均帧率的帧数,设置为零将自动设置,其中样本数量与目标帧率匹配" + + msgid "Render Display Type" msgstr "渲染显示类型" @@ -84745,7 +89698,7 @@ msgstr "轻微" msgid "Minimal Info" -msgstr "最少信息" +msgstr "最小信息" msgid "Most compact representation, uses '+' as separator for sub-second frame numbers, with left and right truncation of the timecode as necessary" @@ -84812,6 +89765,14 @@ msgid "Changes the size of the fonts and widgets in the interface" msgstr "修改界面中字体和按钮的大小" +msgid "" +"Enable a fresnel effect on edit mesh overlays.\n" +"It improves shape readability of very dense meshes, but increases eye fatigue when modeling lower poly" +msgstr "" +"编辑网格叠加层开启菲涅尔效果.\n" +"对于非常浓密的网格提升形状可读性, 但在低模下会增加视觉疲劳" + + msgid "Open menu buttons and pulldowns automatically when the mouse is hovering" msgstr "鼠标经过即开启菜单或下拉菜单" @@ -84832,14 +89793,16 @@ msgid "Smooth jagged edges of user interface text" msgstr "平滑用户界面文本的锯齿状边缘" +msgid "Render text for optimal horizontal placement" +msgstr "以实现最佳水平放置渲染文本" + + msgid "Translate Interface" msgstr "翻译界面" msgid "Translate all labels in menus, buttons and panels (note that this might make it hard to follow tutorials or the manual)" -msgstr "" -"翻译所有菜单,按钮和面板的标签(汉化提示:因存在很多一词多义的地方,翻译可能会用括号同时提示,\n" -"也可能出现比较折中的中文单词,对于某些界面的未汉化部分,可能是程序问题并非没有汉化)" +msgstr "翻译菜单、按钮和面板中的所有标签(请注意,这可能会使学习教程或手册变得困难)" msgid "Translate New Names" @@ -84914,10 +89877,178 @@ msgid "Color range used for weight visualization in weight painting mode" msgstr "设置用于权重绘制的色彩区间" +msgid "Primitive Boolean" +msgstr "基元布尔" + + +msgid "RNA wrapped boolean" +msgstr "RNA包裹的布尔" + + +msgid "Primitive Float" +msgstr "基元浮点" + + +msgid "RNA wrapped float" +msgstr "RNA包裹的浮点" + + +msgid "Primitive Int" +msgstr "基元整数" + + +msgid "RNA wrapped int" +msgstr "RNA包裹的整数" + + +msgid "String Value" +msgstr "字符串值" + + +msgid "RNA wrapped string" +msgstr "RNA包裹的字符串" + + +msgid "Property Definition" +msgstr "属性定义" + + +msgid "RNA property definition" +msgstr "RNA属性定义" + + +msgid "Description of the property for tooltips" +msgstr "工具提示的属性说明" + + +msgid "Animatable" +msgstr "可动画" + + +msgid "Property is animatable through RNA" +msgstr "属性可通过RNA进行动画化" + + +msgid "Optional Argument" +msgstr "可选参数" + + +msgid "True when the property is optional in a Python function implementing an RNA function" +msgstr "当该属性在实现RNA函数的Python函数中是可选的时为True(真)" + + +msgid "Enum Flag" +msgstr "枚举标志" + + +msgid "True when multiple enums" +msgstr "当有多个枚举时为True(真)" + + +msgid "True when the property is hidden" +msgstr "当属性被隐藏时为True(真)" + + +msgid "Library Editable" +msgstr "库可编辑" + + +msgid "Property is editable from linked instances (changes not saved)" +msgstr "属性可以从链接的实例进行编辑(未保存更改)" + + +msgid "Never None" +msgstr "从未无" + + +msgid "True when this value can't be set to None" +msgstr "该值不能设置为“无”时为True(真)" + + +msgid "True when this property is an output value from an RNA function" +msgstr "当此属性为RNA函数的输出的值时为True(真)" + + +msgid "Property is overridable through RNA" +msgstr "属性为通过RNA可覆盖" + + +msgid "Property is a filename, filepath or directory output" +msgstr "属性是文件名、文件路径或目录输出" + + +msgid "Read Only" +msgstr "只读" + + +msgid "Property is editable through RNA" +msgstr "属性为通过RNA可编辑" + + +msgid "Property is registered as part of type registration" +msgstr "属性作为类型注册的一部分进行注册" + + +msgid "Registered Optionally" +msgstr "注册可选" + + +msgid "Property is optionally registered as part of type registration" +msgstr "属性可以选择注册为类型注册的一部分" + + +msgid "Required" +msgstr "必需的" + + +msgid "False when this property is an optional argument in an RNA function" +msgstr "当此属性是RNA函数中的可选参数时为False(假)" + + +msgid "Property has been dynamically created at runtime" +msgstr "属性已在运行时动态创建" + + +msgid "Skip Save" +msgstr "跳过保存" + + +msgid "True when the property is not saved in presets" +msgstr "属性未被保存至预设时为True(真)" + + msgid "Base" msgstr "基础(基数)" +msgid "Struct definition used for properties assigned to this item" +msgstr "用于分配给此项的属性的结构定义" + + +msgid "Semantic interpretation of the property" +msgstr "属性的语义解释" + + +msgid "A string that is displayed hidden ('********')" +msgstr "隐藏的字符串显示方式 ('********')" + + +msgid "Time (Scene Relative)" +msgstr "时间(相对于场景)" + + +msgid "Time specified in frames, converted to seconds based on scene frame rate" +msgstr "以帧为单位指定的时间,根据场景帧速率转换为秒" + + +msgid "Time (Absolute)" +msgstr "时间(绝对)" + + +msgid "Time specified in seconds, independent of the scene" +msgstr "时间以秒为单位指定,与场景无关" + + msgid "Temperature" msgstr "温度" @@ -84926,6 +90057,22 @@ msgid "XYZ" msgstr "XYZ" +msgid "Layer Member" +msgstr "层成员" + + +msgid "Subset of tags (defined in parent struct) that are set for this property" +msgstr "为此属性设置的标签子集(在父结构中定义)" + + +msgid "Translation context of the property's name" +msgstr "属性名称的翻译语境" + + +msgid "Type of units for this property" +msgstr "此属性的单位类型" + + msgid "ID Property Group" msgstr "ID 属性组" @@ -85142,6 +90289,14 @@ msgid "When using volume rendering, assume volume has the same density everywher msgstr "当使用体积渲染时, 假定体内各处密度相同, 可提升渲染速度" +msgid "Bump Map Correction" +msgstr "凹凸贴图校正" + + +msgid "Apply corrections to solve shadow terminator artifacts caused by bump mapping" +msgstr "矫正当使用凹凸贴图时阴影交界线的失真" + + msgid "Volume Interpolation" msgstr "体积插值" @@ -85183,7 +90338,7 @@ msgstr "步进速率" msgid "Scale the distance between volume shader samples when rendering the volume (lower values give more accurate and detailed results, but also increased render time)" -msgstr "渲染体积材质时,体积着色器采样间的距离。数值越小,精度越高,细节越多,但是会增加渲染时间。" +msgstr "渲染体积材质时,体积着色器采样间的距离。数值越小,精度越高,细节越多,但是会增加渲染时间" msgid "AO Distance" @@ -85698,6 +90853,34 @@ msgid "Maximum number of glossy reflection bounces, bounded by total maximum" msgstr "最大高光反射反弹次数, 按最大总数执行反弹" +msgid "Directional Sampling Type" +msgstr "定向采样类型" + + +msgid "Type of the directional sampling used for guiding" +msgstr "用于引导的定向采样类型" + + +msgid "Diffuse Product MIS" +msgstr "漫反射乘积 MIS" + + +msgid "Guided diffuse BSDF component based on the incoming light distribution and the cosine product (closed form product)" +msgstr "基于入射光分布和余弦乘积(闭合形式乘积),指引漫反射BSDF组件" + + +msgid "Perform RIS sampling to guided based on the product of the incoming light distribution and the BSDF" +msgstr "根据入射光分布和BSDF的乘积进行RIS采样引导" + + +msgid "Roughness-based" +msgstr "基于粗糙度" + + +msgid "Adjust the guiding probability based on the roughness of the material components" +msgstr "根据材质组件的粗糙度调整引导概率" + + msgid "Guiding Distribution Type" msgstr "引导分布类型" @@ -85730,6 +90913,14 @@ msgid "Use von Mises-Fisher models as directional distribution" msgstr "使用von Mises-Fisher 模型作为定向分布" +msgid "Guiding Roughness Threshold" +msgstr "导向糙度阈值" + + +msgid "The minimal roughness value of a material to apply guiding" +msgstr "应用于引导的材质的最小粗糙度值" + + msgid "Training Samples" msgstr "训练采样" @@ -86571,7 +91762,7 @@ msgstr "操作项文件列表元素" msgid "Name of a file or directory within a file list" -msgstr "文件名 或文件列表中的目录" +msgstr "文件列表中的文件名或目录名" msgid "Operator Mouse Path" @@ -86618,12 +91809,52 @@ msgid "Tilt Y" msgstr "Y 向倾斜" +msgid "Max Lights" +msgstr "最多灯光" + + +msgid "Limit maximum number of lights" +msgstr "限制灯光的最大数量" + + +msgid "Tiny Prim Culling" +msgstr "微小图元剔除" + + +msgid "Hide small geometry primitives to improve performance" +msgstr "隐藏小的几何图元以提高性能" + + +msgid "Max Texture Memory Per Field" +msgstr "每个场的最大纹理内存" + + +msgid "Maximum memory for a volume field texture in Mb (unless overridden by field prim)" +msgstr "体积场纹理的最大内存(Mb)(除非被场图元覆盖)" + + +msgid "Volume Raymarching Step Size" +msgstr "体积光线行进步长" + + +msgid "Step size when raymarching volume" +msgstr "体积光线行进的步长" + + +msgid "Volume Raymarching Step Size Lighting" +msgstr "体积光线行进步长照明" + + +msgid "Step size when raymarching volume for lighting computation" +msgstr "光线行进体积用于照明计算时的步长" + + msgid "Implements the properties for the SVG exporter" msgstr "实现SVG导出器的属性" msgid "Line Join" -msgstr "线条连接" +msgstr "线条合并" msgid "Miter" @@ -86798,14 +92029,86 @@ msgid "Property that stores arbitrary, user defined properties" msgstr "用于存储由用户定义的任意属性" +msgid "Blur the resolved radiance using a bilateral filter" +msgstr "使用双边滤波器模糊已解析的辐射度" + + +msgid "Reuse neighbor pixels' rays" +msgstr "重用临近像素的光线" + + +msgid "Temporal Accumulation" +msgstr "时序累积" + + +msgid "Accumulate samples by reprojecting last tracing results" +msgstr "通过重现上次追踪结果积累采样" + + +msgid "1 rpp" +msgstr "1 rpp" + + +msgid "1 ray per pixel" +msgstr "每个像素 1 单位射线" + + +msgid "1/4 rpp" +msgstr "1/4 rpp" + + +msgid "1 ray for every 4 pixels" +msgstr "每4个像素1单位射线" + + +msgid "1/16 rpp" +msgstr "1/16 rpp" + + +msgid "1 ray for every 16 pixels" +msgstr "每16个像素1单位射线" + + +msgid "Screen-Trace Max Roughness" +msgstr "屏幕追踪最大粗糙度" + + +msgid "Maximum roughness to use the tracing pipeline for. Higher roughness surfaces will use horizon scan. A value of 1 will disable horizon scan" +msgstr "使用光追的最大糙度,越高的粗糙表面将使用“水平扫描”,值为1表示禁用“水平扫描”" + + msgid "Precision of the screen space ray-tracing" msgstr "屏幕空间光线追踪精度" +msgid "Surface thickness used to detect intersection when using screen-tracing" +msgstr "使用屏幕追踪时,用于检测交叉点的表面厚度" + + +msgid "Enable noise reduction techniques for raytraced effects" +msgstr "启用光线追踪降噪" + + +msgid "Read-only Integer" +msgstr "只读的整数" + + msgid "Region in a subdivided screen area" msgstr "细分屏幕区内的区域" +msgid "Active Panel Category" +msgstr "激活面板分类" + + +msgid "The current active panel category, may be Null if the region does not support this feature (NOTE: these categories are generated at runtime, so list may be empty at initialization, before any drawing took place)" +msgstr "如果区域不支持此功能,则当前活动面板类别可能为Null(注意:这些类别是在运行时生成的,因此在进行任何绘图之前,列表在初始化时可能为空)" + + +msgid "This region does not support panel categories" +msgstr "此区域不支持面板分类" + + msgid "Alignment of the region within the area" msgstr "区域内的区块对齐" @@ -86978,6 +92281,10 @@ msgid "Current window matrix" msgstr "当前窗口矩阵" +msgid "Base class from USD Hydra based renderers" +msgstr "基于USD Hydra的渲染器的基类" + + msgid "View layer name" msgstr "视图层名称" @@ -87371,6 +92678,10 @@ msgid "Automatic pixel size, depends on the user interface scale" msgstr "依照用户界面缩放值自动调整像素尺寸" +msgid "1×" +msgstr "1×" + + msgid "Render at full resolution" msgstr "全分辨率渲染" @@ -87607,10 +92918,6 @@ msgid "Crop the rendered frame to the defined render region size" msgstr "裁切渲染帧至定义的渲染框尺寸" -msgid "File Extensions" -msgstr "文件扩展名" - - msgid "Add the file format extensions to the rendered file name (eg: filename + .jpg)" msgstr "为渲染文件添加扩展名(例如:文件名.jpg)" @@ -87875,6 +93182,22 @@ msgid "Active index in render view array" msgstr "渲染视图阵列中的活动编号" +msgid "Color of the corresponding socket type in the node editor" +msgstr "节点编辑器中相应接口类型的颜色" + + +msgid "Retiming Key" +msgstr "重定时关键帧" + + +msgid "Key mapped to particular frame that can be moved to change playback speed" +msgstr "映射到可以移动以更改播放速度的特定帧的关键帧" + + +msgid "Position of retiming key in timeline" +msgstr "重定时关键帧在时间轴中的位置" + + msgid "Constraint influencing Objects inside Rigid Body Simulation" msgstr "在刚体模拟中对影响物体进行约束" @@ -88608,7 +93931,7 @@ msgstr "初始静止长度" msgid "Use the initial length as spring rest length instead of 2 * particle size" -msgstr "将初始长度用作弹簧的静止长度, 而不是 2 * 粒子大小" +msgstr "将初始长度用作弹簧的静止长度, 而不是2倍粒子大小" msgid "Use viscoelastic springs instead of Hooke's springs" @@ -88827,6 +94150,10 @@ msgid "Size of the irradiance sample spheres to debug captured light" msgstr "用于调试捕获的光的辐射采样球的尺寸" +msgid "Size of the irradiance pool, a bigger pool size allows for more irradiance grid in the scene but might not fit into GPU memory and decrease performance" +msgstr "辐射池的大小,池越大场景中的辐照度网格就越多,但可能不适合GPU显存并会降低性能" + + msgid "16 MB" msgstr "16 MB" @@ -88911,6 +94238,18 @@ msgid "Precision of the horizon search" msgstr "水平搜索的精度" +msgid "Bias the horizon angles to reduce self intersection artifacts" +msgstr "偏移地平线角度以减少自相交伪影" + + +msgid "Precision of the horizon scan" +msgstr "水平扫描的精度" + + +msgid "Constant thickness of the surfaces considered when doing horizon scan and by extension ambient occlusion" +msgstr "进行水平扫描和扩展环境遮挡时考虑的表面的恒定厚度" + + msgid "Light Threshold" msgstr "光照阈值" @@ -88947,6 +94286,26 @@ msgid "Percentage of render size to add as overscan to the internal render buffe msgstr "作为过扫描而加入到内部渲染缓存的渲染尺寸的百分比" +msgid "Select the tracing method used to find scene-ray intersections" +msgstr "选择用于查找场景光线交叉的追踪方法" + + +msgid "No intersection with scene geometry" +msgstr "与场景几何体不相交" + + +msgid "Raytrace against the depth buffer" +msgstr "针对深度缓冲的光线跟踪" + + +msgid "Reflection Trace Options" +msgstr "反射追踪选项" + + +msgid "EEVEE settings for tracing reflections" +msgstr "用于追踪反射的EEVEE设置" + + msgid "Directional Shadows Resolution" msgstr "定向阴影精度" @@ -88963,6 +94322,26 @@ msgid "Size of point and area light shadow maps" msgstr "点光源和面光源的阴影映射尺寸" +msgid "Size of the shadow pool, a bigger pool size allows for more shadows in the scene but might not fit into GPU memory" +msgstr "阴影池的大小,较大的池允许场景中有更多的阴影,但可能不适合GPU内存" + + +msgid "Shadow Ray Count" +msgstr "阴影光线数量" + + +msgid "Amount of shadow ray to trace for each light" +msgstr "每个灯光要追踪的阴影光线数量" + + +msgid "Shadow Step Count" +msgstr "阴影步数" + + +msgid "Amount of shadow map sample per shadow ray" +msgstr "每个阴影光线的阴影贴图采样量" + + msgid "Edge Fading" msgstr "边衰减" @@ -89123,6 +94502,14 @@ msgid "Maximum light contribution, reducing noise" msgstr "最大的光照作用以降低噪点" +msgid "Volume Max Ray Depth" +msgstr "体积最大光线深度" + + +msgid "Maximum surface intersection count used by the accurate volume intersection method. Will create artifact if it is exceeded" +msgstr "精确体积相交方法使用的最大曲面相交计数。如果超过,将出现伪影" + + msgid "Exponential Sampling" msgstr "指数型采样" @@ -89175,6 +94562,30 @@ msgid "Threshold for edge detection algorithm (higher values might over-blur som msgstr "边缘检测算法的阈值(调高数值可能会模糊图像的某些部分)" +msgid "Scene Hydra" +msgstr "场景Hydra" + + +msgid "Scene Hydra render engine settings" +msgstr "场景Hydra 渲染引擎设置" + + +msgid "How to export the Blender scene to the Hydra render engine" +msgstr "如何将Blender场景导出到Hydra渲染引擎" + + +msgid "Fast interactive editing through native Hydra integration" +msgstr "通过原生Hydra集成实现快速交互式编辑" + + +msgid "USD" +msgstr "USD" + + +msgid "Export scene through USD file, for accurate comparison with USD file export" +msgstr "通过USD文件导出场景,以便与USD文件导出进行准确比较" + + msgid "Scene Objects" msgstr "场景物体" @@ -89259,6 +94670,10 @@ msgid "YCbCr (ITU 709)" msgstr "YCbCr (ITU 709)" +msgid "Identifier for the Python scripts directory" +msgstr "Python脚本目录的标识符" + + msgid "Sequence strip in the sequence editor" msgstr "序列编辑器中的序列片段" @@ -89359,6 +94774,14 @@ msgid "Right Handle Selected" msgstr "选择右控制柄" +msgid "Show Retiming Keys" +msgstr "显示重定时关键帧" + + +msgid "Show retiming keys, so they can be moved" +msgstr "显示重定时关键帧,就可以移动它们了" + + msgctxt "Sequence" msgid "Image" msgstr "图像" @@ -89472,6 +94895,10 @@ msgid "Adjust the intensity of the input's color" msgstr "调整输入颜色的强度" +msgid "Multiply alpha along with color channels" +msgstr "将alpha与颜色通道相乘" + + msgid "Strobe" msgstr "闪烁" @@ -89886,6 +95313,10 @@ msgid "Direction" msgstr "方向" +msgid "Whether to fade in or out" +msgstr "是否淡入/淡出" + + msgctxt "Sequence" msgid "Out" msgstr "出" @@ -89989,6 +95420,10 @@ msgid "Sequence strip to load a video" msgstr "加载视频的序列片段" +msgid "Retiming Keys" +msgstr "重定时关键帧" + + msgid "Stream Index" msgstr "流编号" @@ -90229,6 +95664,10 @@ msgid "Store proxies using project directory" msgstr "使用项目目录存储代理" +msgid "Retiming Key Selection Status" +msgstr "重定时关键帧选择状态" + + msgid "Top-level strips only" msgstr "仅顶级片段" @@ -90413,6 +95852,10 @@ msgid "White Balance" msgstr "白平衡" +msgid "Sound Equalizer" +msgstr "声音均衡器" + + msgid "Bright/contrast modifier data for sequence strip" msgstr "序列片段的代理参数" @@ -90453,6 +95896,14 @@ msgid "Tone mapping algorithm" msgstr "色调映射算法" +msgid "Equalize audio" +msgstr "均衡音频" + + +msgid "Graphical definition equalization" +msgstr "图形定义均衡度" + + msgid "White balance modifier for sequence strip" msgstr "序列片段的白平衡修改器" @@ -90641,6 +96092,10 @@ msgid "Display strip in/out offsets" msgstr "显示片段淡入淡出的偏移量" +msgid "Display retiming keys on top of strips" +msgstr "在片段顶部显示重定时关键帧" + + msgid "Show Source" msgstr "显示源" @@ -91181,6 +96636,10 @@ msgid "Point in a shape key" msgstr "指向一个形态键" +msgid "Attribute domain where the attribute is stored in the simulation state" +msgstr "模拟状态中存储属性的属性域" + + msgid "Soft body simulation settings for an object" msgstr "对物体的软体模拟设置" @@ -91668,15 +97127,15 @@ msgstr "为曲线编辑器的显示过滤器" msgid "Show Gizmo" -msgstr "显示Gizmo" +msgstr "显示操控器" msgid "Show gizmos of all types" -msgstr "显示所有类型Gizmo" +msgstr "显示所有类型操控器" msgid "Navigate Gizmo" -msgstr "漫游Gizmo" +msgstr "漫游操控器" msgid "Viewport navigation gizmo" @@ -91906,6 +97365,10 @@ msgid "Show the active object's Rigid Body cache" msgstr "显示活动物体的烟雾模拟缓存" +msgid "Show the active object's simulation nodes cache and bake data" +msgstr "显示活动对象的模拟节点缓存和烘焙数据" + + msgid "Show the active object's smoke cache" msgstr "显示活动物体的烟雾模拟缓存" @@ -92490,11 +97953,28 @@ msgid "Node tree being displayed and edited" msgstr "正在显示和编辑的节点树" +msgid "Node group to edit as node tool" +msgstr "作为节点工具进行编辑的节点组" + + +msgctxt "ID" +msgid "Modifier" +msgstr "修改器" + + +msgid "Edit node group from active object's active modifier" +msgstr "从活动对象的活动修改器编辑节点组" + + msgctxt "ID" msgid "Tool" msgstr "工具" +msgid "Edit any geometry node group for use as an operator" +msgstr "编辑任何几何节点组以用作运算操作" + + msgid "Data-block whose nodes are being edited" msgstr "正被编辑节点的数据块" @@ -92552,6 +98032,14 @@ msgid "Use active Viewer Node output as backdrop for compositing nodes" msgstr "在背景上显示激活的视图节点输出" +msgid "Supports Previews" +msgstr "支持预览" + + +msgid "Whether the node editor's type supports displaying node previews" +msgstr "节点编辑器类型是否支持显示节点预览" + + msgctxt "ID" msgid "Texture Type" msgstr "纹理类型" @@ -93130,19 +98618,19 @@ msgstr "显示为帧数而非秒数" msgid "Context Gizmo" -msgstr "Gizmo上下文" +msgstr "操控器上下文" msgid "Context sensitive gizmos for the active item" -msgstr "活动项目的上下文相关小控件" +msgstr "活动项的上下文相关操控器" msgid "Tool Gizmo" -msgstr "Gizmo工具" +msgstr "工具操控器" msgid "Active tool gizmo" -msgstr "激活Gizmo工具" +msgstr "活动工具操控器" msgid "Show Overexposed" @@ -93546,7 +99034,7 @@ msgstr "显示摄像机焦距" msgid "Gizmo to adjust camera focus distance (depends on limits display)" -msgstr "调节摄像机对焦距离的操纵杆(必须视图显示内的限制打开)" +msgstr "调节摄像机对焦距离的操控器(必须视图显示内的限制打开)" msgid "Show Camera Lens" @@ -93554,7 +99042,7 @@ msgstr "显示摄像机镜头" msgid "Gizmo to adjust camera focal length or orthographic scale" -msgstr "用于调整摄像机焦距长度或正交缩放的Gizmo" +msgstr "用于调整摄像机焦距长度或正交缩放的操控器" msgid "Show Empty Force Field" @@ -93562,7 +99050,7 @@ msgstr "显示空物体力场" msgid "Gizmo to adjust the force field" -msgstr "调整力场的Gizmo" +msgstr "调整力场的操控器" msgid "Show Empty Image" @@ -93570,7 +99058,7 @@ msgstr "显示空白图像" msgid "Gizmo to adjust image size and position" -msgstr "调节图像尺寸和位置的操纵杆" +msgstr "调节图像尺寸和位置的操控器" msgid "Show Light Look-At" @@ -93578,7 +99066,7 @@ msgstr "显示灯光朝向" msgid "Gizmo to adjust the direction of the light" -msgstr "调节灯光方向的操纵杆" +msgstr "调节灯光方向的操控器" msgid "Show Light Size" @@ -93586,7 +99074,7 @@ msgstr "显示灯光尺寸" msgid "Gizmo to adjust spot and area size" -msgstr "调节聚光灯和面光源尺寸的操纵杆" +msgstr "调节聚光灯和面光源尺寸的操控器" msgid "Show Object Rotation" @@ -93594,7 +99082,7 @@ msgstr "显示物体旋转" msgid "Gizmo to adjust rotation" -msgstr "调整旋转的Gizmo" +msgstr "调整旋转的操控器" msgid "Show Object Scale" @@ -93602,7 +99090,7 @@ msgstr "显示物体缩放" msgid "Gizmo to adjust scale" -msgstr "调整缩放的Gizmo" +msgstr "调整缩放的操控器" msgid "Show Object Location" @@ -93610,7 +99098,127 @@ msgstr "显示物体位置" msgid "Gizmo to adjust location" -msgstr "调整位置的Gizmo" +msgstr "调整位置的操控器" + + +msgid "Allow selection of armatures" +msgstr "允许骨架可选" + + +msgid "Allow selection of cameras" +msgstr "允许相机可选" + + +msgid "Allow selection of curves" +msgstr "允许曲线可选" + + +msgid "Allow selection of hair curves" +msgstr "允许头发曲线可选" + + +msgid "Allow selection of empties" +msgstr "允许空物体可选" + + +msgid "Allow selection of text objects" +msgstr "允许文本物体可选" + + +msgid "Allow selection of grease pencil objects" +msgstr "允许蜡笔物体可选" + + +msgid "Allow selection of lattices" +msgstr "允许晶格可选" + + +msgid "Allow selection of lights" +msgstr "允许灯光可选" + + +msgid "Allow selection of light probes" +msgstr "允许光照探头可选" + + +msgid "Allow selection of mesh objects" +msgstr "允许网格物体可选" + + +msgid "Allow selection of metaballs" +msgstr "允许融球可选" + + +msgid "Allow selection of point clouds" +msgstr "允许点云可选" + + +msgid "Allow selection of speakers" +msgstr "允许扬声器可选" + + +msgid "Allow selection of surfaces" +msgstr "允许曲面可选" + + +msgid "Allow selection of volumes" +msgstr "允许体积可选" + + +msgid "Show armatures" +msgstr "显示骨架" + + +msgid "Show cameras" +msgstr "显示摄像机" + + +msgid "Show curves" +msgstr "显示曲线" + + +msgid "Show hair curves" +msgstr "显示头发曲线" + + +msgid "Show empties" +msgstr "显示空物体" + + +msgid "Show text objects" +msgstr "显示文本物体" + + +msgid "Show lattices" +msgstr "显示晶格" + + +msgid "Show lights" +msgstr "显示灯光" + + +msgid "Show light probes" +msgstr "显示光照探头" + + +msgid "Show metaballs" +msgstr "显示融球" + + +msgid "Show point clouds" +msgstr "显示点云" + + +msgid "Show speakers" +msgstr "显示扬声器" + + +msgid "Show surfaces" +msgstr "显示曲面" + + +msgid "Show volumes" +msgstr "显示体积" msgid "Show Reconstruction" @@ -93618,7 +99226,7 @@ msgstr "显示重建" msgid "Display reconstruction data from active movie clip" -msgstr "显示基于活动活影片剪辑的重建数据" +msgstr "显示重建数据,基于活动的影片剪辑" msgid "Show the left and right cameras" @@ -93729,6 +99337,18 @@ msgid "Get the node tree path as a string" msgstr "获取文本格式的节点树路径" +msgid "Preview shape used by the node previews" +msgstr "预览形状,用于节点预览" + + +msgid "Use the default flat previews" +msgstr "使用默认的平面预览" + + +msgid "Use the material preview scene for the node previews" +msgstr "使用材质预览场景进行节点预览" + + msgid "Show Tree Path" msgstr "显示树路径" @@ -93749,6 +99369,10 @@ msgid "Display overlays like colored or dashed wires" msgstr "显示覆盖层为彩色或虚线线框" +msgid "Display each node's preview if node is toggled" +msgstr "如果切换节点,则显示每个节点的预览" + + msgid "Show Timing" msgstr "显示时序" @@ -94055,6 +99679,10 @@ msgid "Endpoint V" msgstr "末端点 V" +msgid "Make this nurbs surface meet the endpoints in the V direction" +msgstr "使此NURBS曲线或曲面与V向上的端点相遇" + + msgid "Smooth the normals of the surface or beveled curve" msgstr "平滑曲面或倒角曲线的法线" @@ -94718,6 +100346,10 @@ msgid "Active Theme Area" msgstr "激活的主题区域" +msgid "Theme Asset Shelf Color" +msgstr "主题资产架颜色" + + msgid "Theme Bone Color Set" msgstr "色彩化骨骼主题设置" @@ -95110,6 +100742,10 @@ msgid "Theme settings for Font" msgstr "字体的主题设置" +msgid "Weight of the characters. 100-900, 400 is normal" +msgstr "字符的粗细,100-900, 400为常规" + + msgid "Font size in points" msgstr "字号,以点数表示" @@ -95246,6 +100882,10 @@ msgid "Edge Select" msgstr "选择边" +msgid "Edge Width" +msgstr "边线宽度" + + msgid "Active Vertex/Edge/Face" msgstr "活动点/边/面" @@ -95262,6 +100902,14 @@ msgid "Face Orientation Front" msgstr "面朝向前" +msgid "Face Mode Selection" +msgstr "面模式选择" + + +msgid "Face Retopology" +msgstr "面重新拓扑" + + msgid "Face Dot Size" msgstr "面的点尺寸" @@ -95458,6 +101106,10 @@ msgid "Nonlinear Animation Channel" msgstr "非线性动画通道" +msgid "Sub-channel" +msgstr "子通道" + + msgid "Meta Strips" msgstr "复合片段" @@ -95618,6 +101270,10 @@ msgid "Pattern Node" msgstr "图案节点" +msgid "Repeat Zone" +msgstr "重复区" + + msgid "Script Node" msgstr "脚本节点" @@ -95931,11 +101587,11 @@ msgstr "编辑器轮廓及其圆角的颜色" msgid "Gizmo A" -msgstr "Gizmo A" +msgstr "操控器 A" msgid "Gizmo B" -msgstr "Gizmo B" +msgstr "操控器 B" msgid "Gizmo Highlight" @@ -95943,15 +101599,15 @@ msgstr "Gizmo高亮" msgid "Gizmo Primary" -msgstr "Gizmo主要" +msgstr "主要操控器" msgid "Gizmo Secondary" -msgstr "Gizmo次要" +msgstr "次要操控器" msgid "Gizmo View Align" -msgstr "Gizmo视图对齐" +msgstr "操控器视图对齐" msgid "Icon Alpha" @@ -96134,6 +101790,10 @@ msgid "Theme settings for the 3D viewport" msgstr "用于 3D 视图的主题设置" +msgid "Settings for asset shelf" +msgstr "资产架设置" + + msgid "Bone Locked Weight" msgstr "骨骼锁定权重" @@ -96142,14 +101802,26 @@ msgid "Shade for bones corresponding to a locked weight group during painting" msgstr "在涂抹过程中,与锁定的权重组对应骨骼的着色方式" +msgid "Outline color of selected pose bones" +msgstr "选定的姿态骨骼的轮廓颜色" + + msgid "Bone Pose Active" msgstr "激活的骨骼姿势" +msgid "Outline color of active pose bones" +msgstr "活动的姿态骨骼轮廓颜色" + + msgid "Bone Solid" msgstr "骨骼实体" +msgid "Default color of the solid shapes of bones" +msgstr "骨骼实体形状的默认颜色" + + msgid "Bundle Solid" msgstr "束实色" @@ -96399,6 +102071,10 @@ msgid "Time since last step in seconds" msgstr "以秒显示最后一步的时间" +msgid "Time since the timer started seconds" +msgstr "自计时器启动以来的时间(秒)" + + msgid "Time Step" msgstr "时间步长" @@ -96632,6 +102308,14 @@ msgid "Snap Element" msgstr "吸附元素" +msgid "Type of element for the 'Snap With' to snap to" +msgstr "‘吸附至’的类型元素吸附到" + + +msgid "Type of element for individual transformed elements to snap to" +msgstr "独立元素吸附类型吸附至" + + msgid "Snap to" msgstr "吸附至" @@ -96804,6 +102488,14 @@ msgid "When creating new strokes, the weight data is added according to the curr msgstr "启用后,将根据当前顶点组和权重添加新笔画权重数据。如果未选择顶点组,则不添加权重" +msgid "Multi-frame Editing" +msgstr "多帧编辑" + + +msgid "Enable multi-frame editing" +msgstr "允许多帧编辑" + + msgid "Cycle-Aware Keying" msgstr "循环感知插帧" @@ -96916,6 +102608,10 @@ msgid "Align rotation with the snapping target" msgstr "根据吸附对象进行旋转对齐" +msgid "Enable snapping when transforming keyframes" +msgstr "变换关键帧时启用捕捉" + + msgid "Exclude back facing geometry from snapping" msgstr "从吸附中排除背面朝向的几何元素" @@ -96992,6 +102688,10 @@ msgid "Snap to strip edges or current frame" msgstr "吸附到片段边缘或当前帧" +msgid "Absolute time alignment when transforming keyframes" +msgstr "变换关键帧时,绝对时间对齐" + + msgid "Snap to Same Target" msgstr "吸附至相同目标" @@ -97343,6 +103043,14 @@ msgid "Reverse the order of shown items" msgstr "倒转显示条目的顺序" +msgid "USD Hook" +msgstr "USD钩子" + + +msgid "Defines callback functions to extend USD IO" +msgstr "定义回调函数以扩展USD IO" + + msgid "UV Map Layers" msgstr "UV 贴图层" @@ -97495,6 +103203,14 @@ msgid "Settings to define a reusable library for Asset Browsers to use" msgstr "用于定义资产浏览器使用的可重用库的设置" +msgid "Default Import Method" +msgstr "默认导入方法" + + +msgid "Determine how the asset will be imported, unless overridden by the Asset Browser" +msgstr "确定资产的导入方式,除非被资产浏览器覆盖" + + msgid "Identifier (not necessarily unique) for the asset library" msgstr "资产库的标识符(不一定是唯一的)" @@ -97503,6 +103219,38 @@ msgid "Path to a directory with .blend files to use as an asset library" msgstr "包含 .blend 文件的目录的路径,用作资产库" +msgid "Use relative path when linking assets from this asset library" +msgstr "链接此资源库中的资源时使用相对路径" + + +msgid "Settings to define an extension repository" +msgstr "定义扩展存储库的设置" + + +msgid "The local directory containing extensions" +msgstr "包含扩展的本地目录" + + +msgid "Unique repository name" +msgstr "唯一的存储库名称" + + +msgid "Remote URL or path for extension repository" +msgstr "扩展存储库的远程 URL 或路径" + + +msgid "Store packages in local cache, otherwise downloaded package files are immediately deleted after installation" +msgstr "将软件包存储在本地缓存中,否则下载的软件包文件在安装后会立即被删除" + + +msgid "User Extension Repositories" +msgstr "用户扩展存储库" + + +msgid "Collection of user extension repositories" +msgstr "用户扩展存储库的集合" + + msgid "Solid Light" msgstr "实体灯光" @@ -97659,6 +103407,18 @@ msgid "Display size for normals in the 3D view" msgstr "在3D视图中显示法线的尺寸" +msgid "Retopology Offset" +msgstr "重新拓扑偏移" + + +msgid "Offset used to draw edit mesh in front of other geometry" +msgstr "用于在其他几何体前面绘制编辑网格的偏移量" + + +msgid "Opacity of the cage overlay in curves sculpt mode" +msgstr "曲线雕刻模式下罩体叠加层的不透明度" + + msgid "Sculpt Face Sets Opacity" msgstr "雕刻面组不透明度" @@ -97843,6 +103603,14 @@ msgid "Display Freestyle face marks, used with the Freestyle renderer" msgstr "显示 Freestyle 的标记面, 用于 Freestyle 渲染器" +msgid "Light Colors" +msgstr "灯光颜色" + + +msgid "Show light colors" +msgstr "显示灯光的颜色" + + msgid "HDRI Preview" msgstr "HDRI 预览" @@ -97892,7 +103660,7 @@ msgstr "在非线框模式下, 显示所选物体的轮廓线" msgid "Display overlays like gizmos and outlines" -msgstr "显示叠加层, 如 gizmos 和轮廓线" +msgstr "显示叠加层, 如操控器和轮廓线" msgid "Show Wire" @@ -97911,6 +103679,14 @@ msgid "Show dashed lines indicating parent or constraint relationships" msgstr "使用虚线显示父子和约束关系" +msgid "Hide the solid mesh and offset the overlay towards the view. Selection is occluded by inactive geometry, unless X-Ray is enabled" +msgstr "隐藏实体网格并将叠加层向视图偏移。除非启用透视模式,否则选定内容会被非活动几何体遮挡" + + +msgid "Show original curves that are currently being edited" +msgstr "显示当前正在编辑的原始曲线" + + msgid "Sculpt Show Face Sets" msgstr "雕刻显示面组" @@ -97931,8 +103707,8 @@ msgid "Display scene statistics overlay text" msgstr "显示场景统计信息文本" -msgid "Stat Vis" -msgstr "统计信息" +msgid "Mesh Analysis" +msgstr "网格分析" msgid "Display statistical information about the mesh" @@ -98482,6 +104258,14 @@ msgid "Theme" msgstr "主题" +msgid "Show scene wireframes with the theme's wire color" +msgstr "显示具有主题线颜色的场景线框" + + +msgid "Show object color on wireframe" +msgstr "在线框上显示物体颜色" + + msgid "X-Ray Alpha" msgstr "透视Alpha" @@ -98530,6 +104314,10 @@ msgid "Dependencies in the scene data" msgstr "场景数据中的依赖" +msgid "EEVEE Settings" +msgstr "EEVEE设置" + + msgid "Root of collections hierarchy of this view layer, its 'collection' pointer property is the same as the scene's master collection" msgstr "此视图层的集合层次结构的根级,其\"集合\"指针属性与场景的主集合相同" @@ -98610,6 +104398,10 @@ msgid "Deliver bloom pass" msgstr "传递辉光通道" +msgid "Deliver alpha blended surfaces in a separate pass" +msgstr "将 alpha 混合表面在单独的渲染通道中呈现" + + msgid "Deliver volume direct light pass" msgstr "传递体积直接光通道" @@ -98630,6 +104422,14 @@ msgid "Type of the path element" msgstr "路径元素的类型" +msgid "Name that can be displayed in the UI for this element" +msgstr "用于此元素的在界面上可显示的名称" + + +msgid "Repeat Output Node ID" +msgstr "重复输出节点 ID" + + msgid "Volume Display" msgstr "体积显示" @@ -99279,10 +105079,6 @@ msgid "Vector2D" msgstr "二维矢量" -msgid "2D float vector action, representing a thumbstick or trackpad" -msgstr "二维浮点矢量动作,表示拇指棒或触控板" - - msgid "3D pose action, representing a controller's location and rotation" msgstr "3D姿势动作,表示控制器的位置和旋转" @@ -99620,11 +105416,11 @@ msgstr "工作区界面标签" msgid "Activate Gizmo" -msgstr "激活Gizmo" +msgstr "激活操控器" msgid "Activation event for gizmos that support drag motion" -msgstr "支持拖动运动的小控件的激活事件" +msgstr "激活操控器事件,支持拖拽操作" msgid "Press causes immediate activation, preventing click being passed to the tool" @@ -99733,6 +105529,10 @@ msgid "Alt Click Tool Prompt" msgstr "Alt点击工具提示" +msgid "Tapping Alt (without pressing any other keys) shows a prompt in the status-bar, prompting a second keystroke to activate the tool" +msgstr "点击 Alt(不按任何其他键)会在状态栏中显示提示,提示第二次击键以激活该工具" + + msgid "Alt Cursor Access" msgstr "Alt 光标访问" @@ -99745,6 +105545,14 @@ msgstr "" "使用“Alt”键时,与输入首选项“模拟3键鼠标”不兼容" +msgid "Transform Navigation with Alt" +msgstr "用Alt导航变换" + + +msgid "During transformations, use Alt to navigate in the 3D View. Note that if disabled, hotkeys for Proportional Editing, Automatic Constraints, and Auto IK Chain Length will require holding Alt" +msgstr "在变换操作期间,使用Alt来控制3D视图,注意,如果禁用此项,“衰减编辑”、“自动约束”和“自动IK链长度”的快捷键则需要按住Alt键" + + msgid "Alt Tool Access" msgstr "Alt 工具访问" @@ -99753,7 +105561,7 @@ msgid "" "Hold Alt to use the active tool when the gizmo would normally be required\n" "Incompatible with the input preference \"Emulate 3 Button Mouse\" when the \"Alt\" key is used" msgstr "" -"按住 Alt 可在通常需要gizmo时使用活动工具\n" +"按住 Alt 可在通常需要操控器时使用活动工具\n" "使用“Alt”键时,与输入首选项“模拟3键鼠标”不兼容" @@ -99785,12 +105593,20 @@ msgstr "" "• 在3D 视图中点击波浪号进行第一人称导航,拖动选择视图轴向" +msgid "Region Toggle Pie" +msgstr "区域切换饼菜单" + + +msgid "N-key opens a pie menu to toggle regions" +msgstr "N键打开一个饼菜单来开关区域" + + msgid "Select All Toggles" msgstr "全选切换" msgid "Causes select-all ('A' key) to de-select in the case a selection exists" -msgstr "导致全选 (“A”键) 在存在选中项的情况下取消选择" +msgstr "全选 (“A”键) 到全不选的过程,开启为单击,关闭为双击" msgid "Extra Shading Pie Menu Items" @@ -99850,7 +105666,7 @@ msgstr "视图操作(对于没有数字键盘的键盘很有用)" msgid "Control transform gizmos" -msgstr "控制变换Gizmo" +msgstr "控制变换操控器" msgctxt "WindowManager" @@ -100698,6 +106514,11 @@ msgid "Down" msgstr "下" +msgctxt "WindowManager" +msgid "Local Down" +msgstr "本地向下" + + msgctxt "WindowManager" msgid "Stop Move Forward" msgstr "停止向前移动" @@ -100713,11 +106534,6 @@ msgid "Stop Move Left" msgstr "停止向左移动" -msgctxt "WindowManager" -msgid "Stop Mode Right" -msgstr "停止向右移动" - - msgctxt "WindowManager" msgid "Teleport" msgstr "传送" @@ -100805,6 +106621,24 @@ msgid "Z axis correction" msgstr "Z轴校正" +msgctxt "WindowManager" +msgid "Increase Jump Height" +msgstr "增加跳跃高度" + + +msgid "Increase jump height" +msgstr "增加跳跃高度" + + +msgctxt "WindowManager" +msgid "Decrease Jump Height" +msgstr "降低跳跃高度" + + +msgid "Decrease jump height" +msgstr "降低跳跃高度" + + msgctxt "WindowManager" msgid "View3D Fly Modal" msgstr "3D 视图飞行模态" @@ -101453,6 +107287,16 @@ msgid "Clear Constraints" msgstr "清除约束" +msgctxt "WindowManager" +msgid "Set Snap Base" +msgstr "设置吸附基准" + + +msgctxt "WindowManager" +msgid "Set Snap Base (Off)" +msgstr "设置吸附基准(关)" + + msgctxt "WindowManager" msgid "Snap Invert" msgstr "吸附反转" @@ -101478,6 +107322,16 @@ msgid "Remove Last Snap Point" msgstr "删除上一个吸附点" +msgctxt "WindowManager" +msgid "Numinput Increment Up" +msgstr "数字按键输入向上递增" + + +msgctxt "WindowManager" +msgid "Numinput Increment Down" +msgstr "数字按键输入乡下递减" + + msgctxt "WindowManager" msgid "Increase Proportional Influence" msgstr "增加衰减编辑影响" @@ -101573,6 +107427,71 @@ msgid "Sample a Point" msgstr "采样点" +msgctxt "WindowManager" +msgid "Mesh Filter Modal Map" +msgstr "网格滤波模态映射" + + +msgid "You have been logged out" +msgstr "您已注销" + + +msgid "Logged in" +msgstr "登入" + + +msgid "Authentication token is valid" +msgstr "认证令牌有效" + + +msgid "We do not know when your token expires, please validate it" +msgstr "我们不知道您的令牌何时到期,请验证它" + + +msgid "%s; you probably want to log out and log in again" +msgstr "%s; 你可能想注销然后再登录" + + +msgid "Your login has expired! Log out and log in again to refresh it" +msgstr "您的登录已过期!注销并再次登录以刷新" + + +msgid "Your token will expire %s. Please log out and log in again to refresh it" +msgstr "您的令牌将在 %s 过期。请注销并重新登录以刷新" + + +msgid "Your authentication token expires %s" +msgstr "您的身份验证令牌过期 %s" + + +msgid "You are logged in as %s" +msgstr "您以 %s 身份登录" + + +msgid "You are logged in as %s at %s" +msgstr "您以 %s 的身份登录到 %s" + + +msgid "on {:%Y-%m-%d}" +msgstr "于{:%Y-%m-%d}" + + +msgid "in %i days" +msgstr "在 %i 天内" + + +msgid "in %i hours" +msgstr "在 %i 小时内" + + +msgid "within seconds" +msgstr "在几秒钟内" + + +msgid "in %i minutes" +msgstr "在 %i 分钟内" + + msgid "No selected keys, pasting over scene range" msgstr "无选中的关键帧,在场景范围内粘贴" @@ -101607,6 +107526,10 @@ msgid "Paste and Bake" msgstr "粘贴并烘焙" +msgid "Unable to mirror, no mirror object/bone configured" +msgstr "无法镜像,未配置镜像物体或骨骼" + + msgid "Denoising completed" msgstr "降噪已完成" @@ -101627,6 +107550,10 @@ msgid "No text or file specified in node, nothing to compile" msgstr "未在节点中指定文本或文件, 无可编译对象" +msgid "OSL query failed to open %s" +msgstr "OSL查询无法打开 %s" + + msgid "External shader script must have .osl or .oso extension, or be a module name" msgstr "外部着色器脚本扩展名须为 .osl 或 .oso, 或模块名" @@ -101659,6 +107586,10 @@ msgid "Requires Intel GPU with Xe-HPG architecture and" msgstr "需要Xe-HPG 架构的英特尔 GPU 以及" +msgid " - intel-level-zero-gpu or intel-compute-runtime version" +msgstr " - intel-level-zero-gpu 或 intel-compute-runtime 版本" + + msgid " - oneAPI Level-Zero Loader" msgstr " - oneAPI Level-Zero 加载器" @@ -101683,6 +107614,10 @@ msgid "or AMD with macOS %s or newer" msgstr "或者AMD搭配 macOS %s 或更新版本" +msgid " %s or newer" +msgstr " %s 或者更新的" + + msgid "Noise Threshold" msgstr "噪波阈值" @@ -101881,6 +107816,15 @@ msgid "Contributions" msgstr "贡献" +msgid "Transparent Background" +msgstr "透明背景" + + +msgctxt "Operator" +msgid "Motion Capture (.bvh)" +msgstr "运动捕捉 (.bvh)" + + msgid "The BVH file does not contain frame duration in its MOTION section, assuming the BVH and Blender scene have the same frame rate" msgstr "BVH文件动画部分未包含帧时长,BVH和Blender场景采用相同帧率" @@ -101955,6 +107899,10 @@ msgid "%s is not supported" msgstr "%s 不被支持" +msgid "Please select at least one image" +msgstr "请至少选择一个图像" + + msgid "Cannot generate materials for unknown %s render engine" msgstr "未知渲染引擎 %s 无法创建材质" @@ -101963,14 +107911,32 @@ msgid "Generating Cycles/EEVEE compatible material, but won't be visible with %s msgstr "创建Cycles/EEVEE适配材质,但无法在 %s 引擎中可见" +msgctxt "Operator" +msgid "Stl (.stl)" +msgstr "Stl (.stl)" + + +msgctxt "Operator" +msgid "FBX (.fbx)" +msgstr "FBX (.fbx)" + + msgid "Limit to" msgstr "限制到" +msgid "%s could not be set out of Edit Mode, so cannot be exported" +msgstr "%s 无法从编辑模式退出,因此无法导出" + + msgid "Mesh '%s' has polygons with more than 4 vertices, cannot compute/export tangent space for it" msgstr "网格 '%s' 包含具有 4 个以上顶点的多边形,无法为其计算/导出切向空间" +msgid "%s in %s could not be set out of Edit Mode, so cannot be exported" +msgstr "%s 中的 %s 无法从编辑模式退出,因此无法导出" + + msgid "ASCII FBX files are not supported %r" msgstr "ASCII FBX文件不被支持 %r" @@ -101995,6 +107961,43 @@ msgid "Couldn't open file %r (%s)" msgstr "打开 %r (%s) 文件失败" +msgctxt "Operator" +msgid "glTF 2.0 (.glb/.gltf)" +msgstr "glTF 2.0 (.glb/.gltf)" + + +msgid "Quantize Position" +msgstr "量化位置" + + +msgid "Export only deformation bones is not possible when not sampling animation" +msgstr "当没有采样动画时,导出\"仅导出形变骨骼\"不可用" + + +msgid "Scene mode uses full bake mode:" +msgstr "场景模式采用全烘焙模式:" + + +msgid "- sampling is active" +msgstr "- 采样激活" + + +msgid "- baking all objects is active" +msgstr "- 烘焙所有物体激活" + + +msgid "- Using scene frame range" +msgstr "- 使用场景帧范围" + + +msgid "Track mode uses full bake mode:" +msgstr "轨道模式使用全烘焙模式:" + + +msgid "Loading export settings failed. Removed corrupted settings" +msgstr "加载导出设置失败。 删除了损坏的设置" + + msgctxt "Operator" msgid "Display Variant" msgstr "显示变量" @@ -102020,6 +108023,14 @@ msgid "Add Material Variant" msgstr "添加材质变量" +msgid "No glTF Animation" +msgstr "无 glTF 动画" + + +msgid "No Actions in .blend file" +msgstr ".blend文件内没有动作" + + msgid "Variant" msgstr "变量" @@ -102033,6 +108044,11 @@ msgid "Add a new Variant Slot" msgstr "添加新的变量槽" +msgctxt "Operator" +msgid "Lightwave Point Cache (.mdd)" +msgstr "Lightwave 顶点缓存 (.mdd)" + + msgid "untitled" msgstr "无标题" @@ -102228,6 +108244,18 @@ msgid "Deselect Pose Bones" msgstr "删除姿态骨骼" +msgid "The pose library moved." +msgstr "姿态库移动了。" + + +msgid "Pose assets are now available" +msgstr "姿势资产现已可用" + + +msgid "in the asset shelf." +msgstr "在资产架上。" + + msgctxt "Operator" msgid "Apply Pose" msgstr "应用姿态" @@ -102243,6 +108271,11 @@ msgid "Blend Pose" msgstr "混合姿态" +msgctxt "Operator" +msgid "Toggle Asset Shelf" +msgstr "切换资产架" + + msgid "Action %s marked Fake User to prevent loss" msgstr "动作 %s 已标记伪用户已防止丢失" @@ -102299,6 +108332,38 @@ msgid "Action %r is not a legacy pose library" msgstr "动作 %r 不是旧版姿态库" +msgid "No vars to display" +msgstr "没有可显示的变量" + + +msgid "Demo text \"%s\" created with %s file(s){:,d}" +msgstr "使用 %s 文件创建的演示文本“%s”{:,d}" + + +msgid "Search *.blend recursively" +msgstr "递归搜索 *.blend" + + +msgid "Writes: %s config text" +msgstr "写入:%s 配置文本" + + +msgid "Generate Settings:" +msgstr "常规设置:" + + +msgid "Animate Settings:" +msgstr "动画设置:" + + +msgid "Render Settings:" +msgstr "渲染设置:" + + +msgid "Can't load %s config, run: File -> Demo Mode (Setup)" +msgstr "无法加载 %s 配置,请运行:文件 -> 演示模式(设置)" + + msgid "Demo Mode:" msgstr "演示模式:" @@ -102394,6 +108459,10 @@ msgid "Add-on '{}' not found!" msgstr "未找到 '{}' 插件!" +msgid "Info written to %s text datablock!" +msgstr "信息已写入 %s 文本数据块!" + + msgid "Message extraction process failed!" msgstr "词条提取过程失败!" @@ -102421,6 +108490,21 @@ msgid "Deselect All" msgstr "全部弃选" +msgctxt "Operator" +msgid "Update Work Repository" +msgstr "更新工作存储库" + + +msgctxt "Operator" +msgid "Clean up Work Repository" +msgstr "清理工作存储库" + + +msgctxt "Operator" +msgid "Update Blender Repository" +msgstr "更新Blender 存储库" + + msgctxt "Operator" msgid "Statistics" msgstr "统计信息" @@ -102569,7 +108653,7 @@ msgstr "Alt+鼠标中键拖动操作" msgid "Activate Gizmo Event" -msgstr "激活Gizmo事件" +msgstr "激活操控器事件" msgid "Torus" @@ -102588,6 +108672,18 @@ msgid "Complete report available on '%s' text datablock" msgstr "完整报告见 '%s' 文本数据块" +msgid "Bone colors were synced; for %d bones this will not be visible due to pose bone color overrides" +msgstr "同步的骨骼颜色; 对于 %d 个骨骼,由于姿态骨骼颜色覆盖,将不可见" + + +msgid "Go to pose mode to copy pose bone colors" +msgstr "进入姿态模式复制姿态骨骼颜色" + + +msgid "Cannot do anything in mode %r" +msgstr "在模式 %r 下无法执行任何操作" + + msgid "Could not find material or light using Shader Node Tree - %s" msgstr "找不到使用着色器节点树的材质或光 - %s" @@ -102708,6 +108804,10 @@ msgid "%d duplicates found in %d mesh(es), mirror may be incomplete" msgstr "%d 个副本被发现位于 %d 个网格中,镜像可能不完整" +msgid "Node has no attribute %s" +msgstr "节点没有属性 %s" + + msgid "No camera found" msgstr "未找到摄像机" @@ -102768,6 +108868,14 @@ msgid "Select at least one mesh object" msgstr "至少选择一个网格物体" +msgid "Mesh UV map required" +msgstr "需要网格UV映射" + + +msgid "Unable to apply \"Generate\" modifier" +msgstr "无法应用\"生成\"类修改器" + + msgid "Active object is not a mesh" msgstr "活动物体不是网格物体" @@ -102784,6 +108892,22 @@ msgid "Object %r already has a particle system" msgstr "物体 %r 已具有粒子系统" +msgid "Set Hair Curve Profile" +msgstr "设置头发曲线轮廓" + + +msgid "Interpolate Hair Curves" +msgstr "插值头发曲线" + + +msgid "Hair Curves Noise" +msgstr "头发曲线噪波" + + +msgid "Frizz Hair Curves" +msgstr "卷毛曲线" + + msgid "New Preset" msgstr "新建预设" @@ -102844,6 +108968,22 @@ msgid "Current frame not within strip framerange" msgstr "当前帧不在片段帧范围内" +msgid "Provide text editor argument format in File Paths/Applications Preferences, see input field tool-tip for more information" +msgstr "在“文件路径/应用程序首选项”中提供文本编辑器参数格式,有关详细信息,请参阅输入字段工具提示" + + +msgid "Text Editor Args Format must contain $filepath" +msgstr "文本编辑器参数格式必须包含 $filepath" + + +msgid "Exception parsing template: %r" +msgstr "分析模板时出现异常:%r" + + +msgid "Exception running external editor: %r" +msgstr "运行外部编辑器时出现异常:%r" + + msgid "Reload Start-Up file to restore settings" msgstr "重新加载启动文件以还原设置" @@ -103005,6 +109145,10 @@ msgid "Tool %r not found for space %r" msgstr "未找到工具 %r 自空间 %r" +msgid "Import Existing Settings" +msgstr "导入现有设置" + + msgid "Select With" msgstr "选择方式" @@ -103022,6 +109166,11 @@ msgid "Getting Started" msgstr "入门" +msgctxt "Operator" +msgid "What's New" +msgstr "新增内容" + + msgctxt "Operator" msgid "Credits" msgstr "贡献者名单" @@ -103172,6 +109321,11 @@ msgid "Speaker(s)" msgstr "扬声器" +msgctxt "Operator" +msgid "See What's New..." +msgstr "查看更新内容..." + + msgctxt "Operator" msgid "Manual" msgstr "手册" @@ -103224,6 +109378,10 @@ msgid "Rename %d %s" msgstr "重命名 %d %s" +msgid "Version: %s" +msgstr "版本: %s" + + msgid "Date: %s %s" msgstr "日期: %s %s" @@ -103284,6 +109442,10 @@ msgid "Unknown" msgstr "未知" +msgid "Switch Stereo View" +msgstr "切换立体视图" + + msgid "Mix Vector" msgstr "混合矢量" @@ -103494,6 +109656,10 @@ msgid "Radius Head" msgstr "头部半径" +msgid "Not assigned to any bone collection." +msgstr "未指定给任何骨骼集合." + + msgid "Override Transform" msgstr "重写变换" @@ -103580,7 +109746,7 @@ msgstr "粗体&斜体" msgid "Small Caps Scale" -msgstr "小写缩放" +msgstr "小型大写缩放" msgid "Character Spacing" @@ -103607,6 +109773,11 @@ msgid "Interpolation Tilt" msgstr "倾斜插值" +msgctxt "Operator" +msgid "Small Caps" +msgstr "小型大写" + + msgctxt "Operator" msgid "Custom..." msgstr "自定义..." @@ -103820,6 +109991,11 @@ msgid "Update on Edit" msgstr "编辑时更新" +msgctxt "Operator" +msgid "Search..." +msgstr "搜索..." + + msgid "Distance Reference" msgstr "距离参照" @@ -104115,6 +110291,14 @@ msgid "Custom Occlusion" msgstr "自定义遮挡" +msgid "Unsupported displacement method" +msgstr "未支持的置换方式" + + +msgid "Raytraced Refraction" +msgstr "光线追踪折射" + + msgctxt "Operator" msgid "Lock Unselected" msgstr "未选中项" @@ -105008,10 +111192,22 @@ msgid "Light Clamping" msgstr "灯光钳制" +msgid "Refraction" +msgstr "折射" + + msgid "Cascade Size" msgstr "级联大小" +msgid "Pool Size" +msgstr "池大小" + + +msgid "Temporal Reprojection" +msgstr "时序重投影" + + msgctxt "Operator" msgid "Bake Indirect Lighting" msgstr "烘焙间接光照明" @@ -105329,7 +111525,7 @@ msgstr "设置基面" msgid "Viewport Gizmos" -msgstr "视图Gizmo" +msgstr "视图控制器" msgid "3D Markers" @@ -105705,6 +111901,11 @@ msgid "Cleanup" msgstr "清理" +msgctxt "Operator" +msgid "Clear Recent Items" +msgstr "清除近期项目" + + msgctxt "Operator" msgid "Back" msgstr "后视图" @@ -105820,6 +112021,16 @@ msgid "Ease" msgstr "缓动" +msgctxt "Operator" +msgid "Smooth (Gaussian)" +msgstr "平滑(高斯)" + + +msgctxt "Operator" +msgid "Smooth (Legacy)" +msgstr "平滑(旧版)" + + msgctxt "Operator" msgid "Easing Type" msgstr "缓动类型" @@ -106310,6 +112521,10 @@ msgid "Slot %d" msgstr "槽 %d" +msgid "Closed by Default" +msgstr "默认关闭" + + msgctxt "Operator" msgid "Clear Viewer" msgstr "清除预览器" @@ -106563,6 +112778,16 @@ msgid "Swap Data" msgstr "交换数据" +msgctxt "Operator" +msgid "Delete Retiming Keys" +msgstr "删除重定时关键帧" + + +msgctxt "Operator" +msgid "Toggle Retiming Keys" +msgstr "切换重定时关键帧" + + msgctxt "Operator" msgid "Slip Strip Contents" msgstr "滑动片段内容" @@ -106903,6 +113128,18 @@ msgid "Original frame range: %d-%d (%d)" msgstr "原始帧范围: %d-%d (%d)" +msgid "%.2f" +msgstr "%.2f" + + +msgid "Hz" +msgstr "Hz" + + +msgid "dB" +msgstr "dB" + + msgid "Source Channel" msgstr "源通道" @@ -107045,7 +113282,7 @@ msgstr "复制标记" msgctxt "WindowManager" msgid "Keying" -msgstr "抠像(插帧)" +msgstr "插帧" msgctxt "Operator" @@ -107161,7 +113398,7 @@ msgstr "样式起始" msgid "Gizmos:" -msgstr "Gizmo:" +msgstr "操控器:" msgid "Miter Outer" @@ -107326,6 +113563,11 @@ msgid "Back to Previous" msgstr "返回前一视图" +msgctxt "Operator" +msgid "Save Incremental" +msgstr "增量保存" + + msgctxt "Operator" msgid "Save Copy..." msgstr "保存副本..." @@ -107366,6 +113608,11 @@ msgid "Wavefront (.obj)" msgstr "Wavefront (.obj)" +msgctxt "Operator" +msgid "Stanford PLY (.ply)" +msgstr "斯坦福PLY (.ply)" + + msgctxt "Operator" msgid "STL (.stl) (experimental)" msgstr "STL (.stl) (试验)" @@ -107458,6 +113705,10 @@ msgid "User Tooltips" msgstr "使用工具提示" +msgid "Sort by Most Recent" +msgstr "按最近的排序" + + msgid "Hinting" msgstr "微调" @@ -107514,6 +113765,10 @@ msgid "Eraser Radius" msgstr "擦除半径" +msgid "Custom Gradient" +msgstr "自定义渐变" + + msgid "Sculpt Overlay Color" msgstr "雕刻叠加颜色" @@ -107571,7 +113826,7 @@ msgstr "采样格式" msgid "Undo Memory Limit" -msgstr "取消内存限制" +msgstr "撤销内存限制" msgid "Console Scrollback Lines" @@ -107615,6 +113870,15 @@ msgid "Axis X" msgstr "轴 X" +msgid "View Align" +msgstr "视图对齐" + + +msgctxt "Text" +msgid "Weight" +msgstr "权重" + + msgid "Shadow Offset X" msgstr "阴影偏移 X" @@ -107639,6 +113903,14 @@ msgid "Render Cache" msgstr "渲染缓存" +msgid "Program" +msgstr "程序" + + +msgid "Arguments" +msgstr "参数" + + msgid "I18n Branches" msgstr "国际化(i18n) 分支" @@ -107683,6 +113955,10 @@ msgid "Invert Pan Axis" msgstr "反转平移轴向" +msgid "The add-on to use extensions is disabled! See:" +msgstr "使用扩展的插件已禁用!请参阅:" + + msgid "No custom MatCaps configured" msgstr "无自定义材质快照配置" @@ -107709,6 +113985,32 @@ msgid "Load Factory Blender Preferences" msgstr "加载初始Blender偏好设置" +msgid "Microsoft Store installation" +msgstr "微软应用商店安装" + + +msgid "Use Windows 'Default Apps' to associate with blend files" +msgstr "使用Windows“默认应用程序”与blend文件关联" + + +msgid "Open blend files with this Blender version" +msgstr "使用该版本的 Blender 打开 blend 文件" + + +msgctxt "Operator" +msgid "Register" +msgstr "注册" + + +msgctxt "Operator" +msgid "Unregister" +msgstr "注销" + + +msgid "For All Users" +msgstr "用于所有用户" + + msgid "Player" msgstr "播放器" @@ -107785,6 +114087,10 @@ msgid "Internet:" msgstr "互联网:" +msgid "User:" +msgstr "用户:" + + msgid "description" msgstr "描述" @@ -108066,6 +114372,11 @@ msgid "Empty Hair" msgstr "空白毛发" +msgctxt "Operator" +msgid "Fur" +msgstr "皮毛" + + msgctxt "Operator" msgid "Nurbs Surface" msgstr "NURBS 曲面" @@ -108126,6 +114437,11 @@ msgid "Make Local..." msgstr "转为本地项..." +msgctxt "Operator" +msgid "Insert Keyframe with Keying Set" +msgstr "使用插帧集插入关键帧" + + msgctxt "Operator" msgid "Delete Keyframes..." msgstr "删除关键帧..." @@ -108307,6 +114623,11 @@ msgid "Locks" msgstr "锁定" +msgctxt "Operator" +msgid "Box Show" +msgstr "方形显示" + + msgctxt "Operator" msgid "Invert Visible" msgstr "反转可见" @@ -108317,6 +114638,16 @@ msgid "Hide Masked" msgstr "隐藏遮罩作用项" +msgctxt "Operator" +msgid "Box Add" +msgstr "方形添加" + + +msgctxt "Operator" +msgid "Lasso Add" +msgstr "套索添加" + + msgid "Set Pivot" msgstr "设置轴心点" @@ -108440,16 +114771,6 @@ msgid "Extract Face Set" msgstr "提取面组" -msgctxt "Operator" -msgid "Invert Visible Face Sets" -msgstr "反转可见面组" - - -msgctxt "Operator" -msgid "Show All Face Sets" -msgstr "显示全部面组" - - msgctxt "Operator" msgid "Randomize Colors" msgstr "随机化颜色" @@ -108766,7 +115087,7 @@ msgstr "闭合" msgctxt "Operator" msgid "Toggle Caps" -msgstr "切换封顶类型" +msgstr "切换封盖类型" msgid "Scale Thickness" @@ -108788,13 +115109,18 @@ msgid "Duplicate Active Keyframe (Active Layer)" msgstr "复制活动层的活动帧" +msgctxt "Operator" +msgid "Set Caps" +msgstr "设置端点" + + msgctxt "Operator" msgid "View Selected" msgstr "查看所选" msgid "Show Gizmos" -msgstr "显示Gizmo" +msgstr "显示控制器" msgid "Toggle Overlays" @@ -108810,7 +115136,7 @@ msgstr "锁定摄像机到视图方位" msgid "Object Gizmos" -msgstr "物体Gizmo" +msgstr "物体操控器" msgid "Look At" @@ -108855,30 +115181,62 @@ msgid "Vertex Group Weights" msgstr "顶点组权重" -msgid "Mesh Analysis" -msgstr "网格分析" - - msgid "Face Angle" -msgstr "面内角" +msgstr "面拐角" msgid "Edge Marks" msgstr "边标记" +msgid "Sculpt Mode Overlays" +msgstr "雕刻模式叠加层" + + +msgid "Curve Sculpt Overlays" +msgstr "曲线雕刻叠加层" + + msgid "Selection Opacity" msgstr "选中项不透明度" +msgid "Cage Opacity" +msgstr "罩体透明度" + + +msgid "Armature Overlays" +msgstr "骨架叠加层" + + +msgid "Texture Paint Overlays" +msgstr "纹理绘制叠加层" + + +msgid "Vertex Paint Overlays" +msgstr "顶点绘制叠加层" + + +msgid "Weight Paint Overlays" +msgstr "权重绘制叠加层" + + msgid "Zero Weights" msgstr "零权重" +msgid "Snap Individual Elements To" +msgstr "吸附独立元素至" + + msgid "Fade Inactive Layers" msgstr "淡化非活动层" +msgid "Curve Falloff" +msgstr "曲线衰减" + + msgctxt "Operator" msgid "Move Texture Space" msgstr "移动纹理空间" @@ -108944,6 +115302,11 @@ msgid "Color Attribute" msgstr "颜色属性" +msgctxt "Operator" +msgid "Suzanne" +msgstr "苏珊娜" + + msgctxt "Operator" msgid "Point Cloud" msgstr "点云" @@ -109074,6 +115437,14 @@ msgid "On Selected Markers" msgstr "在所选标记处" +msgid "- select bones to operate on first -" +msgstr "-首先选择要操作的骨骼-" + + +msgid "All bone collections are read-only" +msgstr "所有骨骼集合都是只读的" + + msgctxt "Operator" msgid "Auto-Name Left/Right" msgstr "左/右自动命名" @@ -109328,7 +115699,7 @@ msgstr "下划线" msgctxt "Operator" msgid "Toggle Small Caps" -msgstr "小型大写" +msgstr "切换小型大写" msgctxt "Operator" @@ -109454,6 +115825,16 @@ msgid "Assign from Bone Envelopes" msgstr "按骨骼封套指定" +msgctxt "Operator" +msgid "Gradient (Linear)" +msgstr "渐变(线性)" + + +msgctxt "Operator" +msgid "Gradient (Radial)" +msgstr "渐变(径向)" + + msgctxt "Operator" msgid "Randomize Vertices" msgstr "顶点随机化" @@ -109872,6 +116253,10 @@ msgid "No ID block to insert keyframe in (path = %s)" msgstr "无可供插入关键帧的 ID 块 (路径 = %s)" +msgid "'%s' on %s is not editable" +msgstr "%s 的 '%s' 不可编辑" + + msgid "Could not insert keyframe, as this type does not support animation data (ID = %s, path = %s)" msgstr "无法插入关键,因为此类型不支持动画数据 (ID = %s, 路径 = %s)" @@ -109896,6 +116281,18 @@ msgid "Not clearing all keyframes from locked F-Curve '%s' for %s '%s'" msgstr "不清除 %s '%s' 锁定的函数曲线 '%s' 的全部关键帧" +msgid "Could not insert keyframe, as this type does not support animation data (ID = %s)" +msgstr "无法插入关键帧,因为此类型不支持动画数据(ID = %s)" + + +msgid "Failed to insert any keys" +msgstr "未能插入任何关键帧" + + +msgid "Named Layer node" +msgstr "命名的层节点" + + msgid "User Library" msgstr "用户库" @@ -109960,6 +116357,10 @@ msgid "Attribute is required and can't be removed" msgstr "属性是必需的,且无法删除" +msgid "This attribute can not be accessed in a procedural context" +msgstr "无法在程序性上下文中访问此属性" + + msgid "Library file, loading empty scene" msgstr "库文件,加载空场景" @@ -109984,6 +116385,10 @@ msgid "File written by newer Blender binary (%d.%d), expect loss of data!" msgstr "文件由较新版本的 Blender 二进制程序 (%d.%d) 生成, 可能会造成数据丢失!" +msgid "File could not be read, critical data corruption detected" +msgstr "无法读取文件,检测到关键数据损坏" + + msgid "Loading failed: " msgstr "加载失败: " @@ -110025,13 +116430,21 @@ msgstr "'%s' 无法在 '%s' 中找到" msgid "Path '%s' cannot be made absolute" -msgstr "无法产生绝对路径 '%s'" +msgstr "路径 '%s' 不能设为绝对路径" msgid "Total files %d | Changed %d | Failed %d" msgstr "文件总数 %d | 更改 %d 项 | 失败 %d 项" +msgid "Path '%s' cannot be made relative for %s '%s'" +msgstr "路径'%s'不能成为 %s '%s'的相对路径" + + +msgid "Path '%s' cannot be made absolute for %s '%s'" +msgstr "路径 '%s' 不能成为%s '%s'绝对路径" + + msgid "Can't initialize cloth" msgstr "无法初始化布料" @@ -110096,6 +116509,10 @@ msgid "%d more point(s) needed for Bezier" msgstr "对于贝塞尔还需要%d 点" +msgid "hair_curves" +msgstr "毛发曲线" + + msgid "UVMap" msgstr "UV 贴图" @@ -110108,10 +116525,6 @@ msgid "Int" msgstr "整型" -msgid "PreviewCol" -msgstr "预览色" - - msgid "TexturedCol" msgstr "纹理色" @@ -110136,10 +116549,6 @@ msgid "OS Loop" msgstr "OS Loop" -msgid "PreviewLoopCol" -msgstr "预览 LoopCol" - - msgid "Int8" msgstr "Int8" @@ -110218,10 +116627,22 @@ msgid "Stepped" msgstr "阶化" +msgid "LineSet %i" +msgstr "线条集 %i" + + +msgid "\"{}\" attribute from geometry" +msgstr "来自几何体的\"{}\" 属性" + + msgid "ID / Index" msgstr "ID/编号" +msgid "\"{}\" from {}" +msgstr "\"{}\" 来自 {}" + + msgid "GP_Layer" msgstr "蜡笔层" @@ -110278,6 +116699,26 @@ msgid "Data corruption: data-block '%s' is using another local data-block ('%s') msgstr "数据损坏: 数据块 '%s' 正在使用另一个本地数据块 ('%s') 作为库重写引用" +msgid "libraries" +msgstr "库" + + +msgid "lights" +msgstr "灯" + + +msgid "Light Linking for %s" +msgstr "%s的灯光链接" + + +msgid "Shadow Linking for %s" +msgstr "%s的阴影链接" + + +msgid "Cannot unlink unsupported '%s' from light linking collection '%s'" +msgstr "'%s' 来自灯光链接集合 '%s',不支持解除链接" + + msgid "MaskLayer" msgstr "遮罩层" @@ -110286,6 +116727,18 @@ msgid "Auto Smooth" msgstr "自动光滑" +msgid "Socket_1" +msgstr "接口_1" + + +msgid "Input_1_use_attribute" +msgstr "Input_1_use_attribute" + + +msgid "Input_1_attribute_name" +msgstr "Input_1_attribute_name" + + msgid "Tangent space can only be computed for tris/quads, aborting" msgstr "切向空间只能只算三角/四边形,中止" @@ -110295,7 +116748,7 @@ msgstr "切向空间计算需要一个UV贴图, \"%s\" 未找到, 中止" msgid "Possible data loss when saving this file! %s modifier is deprecated (Object: %s)" -msgstr "保存此文件时可能丢失数据!%s 修改器已弃用(物体:%s)。" +msgstr "保存此文件时可能丢失数据!%s 修改器已弃用(物体:%s)" msgid "NlaTrack" @@ -110346,6 +116799,10 @@ msgid "Unable to pack file, source path '%s' not found" msgstr "无法打包文件,找不到资源路径 '%s'" +msgid "Unable to access the size of, source path '%s'" +msgstr "无法访问大小,源路径 '%s'" + + msgid "Image '%s' skipped, packing movies or image sequences not supported" msgstr "图像 '%s' 被忽略掉,不支持打包电影或图像序列" @@ -110371,7 +116828,7 @@ msgstr "重置临时文件时出错(请检查文件 '%s' '%s')" msgid "Error deleting '%s' (ignored)" -msgstr "删除 '%s' 时出错(忽略)" +msgstr "删除 '%s' 时出错(忽略)" msgid "Use existing file (instead of packed): %s" @@ -110463,7 +116920,7 @@ msgstr "使用Bullet物理引擎编译" msgid "LIB: object lost from scene: '%s'" -msgstr "库错误: 场景中丢失物体: '%s'" +msgstr "库错误: 场景中丢失物体:'%s'" msgid "RenderView" @@ -110495,6 +116952,10 @@ msgid "Could not write volume: %s" msgstr "无法写入体积: %s" +msgid "Could not write volume: Unknown error writing VDB file" +msgstr "无法写入体积:写入VDB文件时发生未知错误" + + msgid "Cannot open or start AVI movie file" msgstr "无法打开或者播放 AVI 视频文件" @@ -110507,10 +116968,6 @@ msgid "No valid formats found" msgstr "没有找到可用的格式" -msgid "Can't allocate ffmpeg format context" -msgstr "无法分配ffmpeg格式上下文" - - msgid "Render width has to be 720 pixels for DV!" msgstr "对于 DV 的渲染宽度需要设置为 720 像素!" @@ -110575,6 +117032,10 @@ msgid "Shapekey %s has an invalid 'from' pointer (%p), it will be deleted" msgstr "形态键 %s 有一个无效的 'from' 指针 (%p),它将被删除" +msgid "The file was saved by a newer version, open it with Blender %s or later" +msgstr "文件由较新版本保存,请使用Blender %s 或更高版本打开它" + + msgid "insufficient content" msgstr "不充分的内容" @@ -110592,11 +117053,11 @@ msgstr "无法打开文件" msgid "Library '%s', '%s' had multiple instances, save and reload!" -msgstr "库 '%s', '%s' 拥有多个实例, 保存并重新加载!" +msgstr "'%s', '%s' 库拥有多个实例, 保存并重新加载!" msgid "LIB: Data refers to main .blend file: '%s' from %s" -msgstr "库错误: 数据指向主 .blend文件 : %s 中的 '%s'" +msgstr "库错误: 数据指向主 .blend文件 : %s 中的 '%s'" msgid "LIB: %s: '%s' is directly linked from '%s' (parent '%s'), but is a non-linkable data type" @@ -110623,6 +117084,10 @@ msgid "Unable to open blend " msgstr "无法打开文件 " +msgid "Critical blend-file corruption: Conflicts and/or otherwise invalid data-blocks names (see console for details)" +msgstr "严重的blend文件损坏:存在冲突和/或其他无效的数据块名称(详细信息请查看控制台)" + + msgid "Failed to read blend file '%s': %s" msgstr "读取文件失败 '%s', %s" @@ -110684,13 +117149,17 @@ msgstr "未命名" msgid "Unable to make version backup: filename too short" -msgstr "无法产生版本备份: 文件名过短" +msgstr "无法产生版本备份: 文件名过短" msgid "Unable to make version backup" msgstr "无法产生版本备份" +msgid "Critical data corruption: Conflicts and/or otherwise invalid data-blocks names (see console for details)" +msgstr "严重的数据损坏:存在冲突和/或其他无效的数据块名称(详细信息请查看控制台)" + + msgid "Version backup failed (file saved with @)" msgstr "版本备份失败 (文件以@保存)" @@ -110787,6 +117256,10 @@ msgid "Compiling Shaders (%d remaining)" msgstr "编译着色器中 (剩余 %d)" +msgid "EEVEE (Legacy)" +msgstr "EEVEE (旧版)" + + msgid "Incompatible Light cache version, please bake again" msgstr "不兼容的灯光缓存版本,请再次烘焙" @@ -110899,10 +117372,26 @@ msgid "Can't edit this property from a linked data-block" msgstr "无法从外链的数据块编辑此属性" +msgid "No keyframes to focus on" +msgstr "没有要聚焦的关键帧" + + msgid "Nothing selected" msgstr "未选中任何项" +msgid "No open Graph Editor window found" +msgstr "找不到开启的“曲线编辑器”窗口" + + +msgid "Cannot create the Animation Context" +msgstr "无法创建动画上下文" + + +msgid "F-Curves have no valid size" +msgstr "函数曲线没有有效的大小" + + msgid "" msgstr "<无效>" @@ -110964,7 +117453,7 @@ msgstr "期望一个活动的动画区域" msgid "Paste driver: no driver to paste" -msgstr "粘贴驱动: 无可粘贴的驱动" +msgstr "粘贴驱动器: 无可粘贴的驱动器" msgid "No driver to copy variables from" @@ -111059,6 +117548,10 @@ msgid "Successfully added %d keyframes for keying set '%s'" msgstr "已成功将 %d 个关键帧添加到插帧集 '%s' 中" +msgid "'%s' is not editable" +msgstr "'%s' 不可编辑" + + msgid "Successfully removed %d keyframes for keying set '%s'" msgstr "已成功将 %d 个关键帧从插帧集 '%s' 中移除" @@ -111132,7 +117625,11 @@ msgstr "添加到插帧集中的属性: '%s'" msgid "Skipping path in keying set, as it has no ID (KS = '%s', path = '%s[%d]')" -msgstr "在配置中略过路径, 因为这里丢失ID (KS = '%s', 路径 = '%s[%d]')" +msgstr "跳过帧插集路径, 因为没有ID (KS = '%s', 路径 = '%s[%d]')" + + +msgid "Bone was added to a hidden collection '%s'" +msgstr "骨骼已添加到隐藏集合'%s'" msgid "No region view3d available" @@ -111183,6 +117680,74 @@ msgid "Unselectable bone in chain" msgstr "链中不可选择的骨骼" +msgid "Bone collection %s is not editable, maybe add an override on the armature?" +msgstr "骨骼集合 %s 不可编辑,是否可以在骨架上添加覆盖?" + + +msgid "Bone collections can only be added to an Armature" +msgstr "骨骼集合只能被添加于骨架" + + +msgid "Cannot add bone collections to a linked Armature without an override" +msgstr "无法向链接的骨架添加骨骼集合,除非进行覆盖操作" + + +msgid "Bone collections can only be edited on an Armature" +msgstr "骨骼集合只能在骨架上方可编辑" + + +msgid "Armature has no active bone collection, select one first" +msgstr "骨架没有活动的骨骼集合,请先选择一个" + + +msgid "Cannot edit bone collections that are linked from another blend file" +msgstr "无法编辑从其他blend文件链接的骨骼集合" + + +msgid "Cannot (de)select bones on linked object, that would need an override" +msgstr "无法在链接对象上选择/取消选择骨骼,这将需要覆盖" + + +msgid "This needs a local Armature or an override" +msgstr "这需要一个本地骨架或者一个覆盖" + + +msgid "This operator only works in pose mode and armature edit mode" +msgstr "此操作近适用于姿态模式和骨架编辑模式" + + +msgid "No bones selected, nothing to assign to bone collection" +msgstr "无选中的骨骼,没有东西可分配于骨骼集合" + + +msgid "All selected bones were already part of this collection" +msgstr "所有选定的骨骼都已是此集合的一部分" + + +msgid "No bones selected, nothing to unassign from bone collection" +msgstr "未选择骨骼,没有要从骨骼集合取消分配的内容" + + +msgid "None of the selected bones were assigned to this collection" +msgstr "没有选择的骨骼被分配到此集合中" + + +msgid "Missing bone name" +msgstr "缺少骨骼名称" + + +msgid "No bone collection named '%s'" +msgstr "没有名为 '%s' 的骨骼集合" + + +msgid "Cannot assign to linked bone collection %s" +msgstr "不能分配给链接的骨骼集合 %s" + + +msgid "Bone '%s' was not assigned to collection '%s'" +msgstr "骨骼 '%s' 未分配给集合 '%s'" + + msgid "Bone Heat Weighting: failed to find solution for one or more bones" msgstr "骨骼热权重: 为一个或多个骨骼解算时出错(请检查模型重叠点与缩放,或是缩放模型到一个合适的大小并再次尝试)" @@ -111204,7 +117769,7 @@ msgstr "无法调整库数据" msgid "Pose lib is only for armatures in pose mode" -msgstr "姿势库仅在姿势模式中对骨骼适用" +msgstr "姿态库仅在姿态模式中对骨骼适用" msgid "[Tab] - Show original pose" @@ -111311,10 +117876,30 @@ msgid "No pose to copy" msgstr "没有姿势供复制" +msgid "Copied pose to internal clipboard" +msgstr "拷贝到内部剪贴板的姿态" + + +msgid "Internal clipboard is not from pose mode" +msgstr "内部剪贴板数据不是姿态模式" + + +msgid "Internal clipboard has no pose" +msgstr "内部剪贴板没有姿态数据" + + msgid "Programming error: missing clear transform function or keying set name" msgstr "程序错误:缺失清除变换的功能或帧设置名称" +msgid "Asset loading is unfinished" +msgstr "资产加载未完成" + + +msgid "No asset found at path \"%s\"" +msgstr "路径 \"%s\" 中未找到资产" + + msgid "Data-block is not marked as asset" msgstr "数据块未被标记为资产" @@ -111391,6 +117976,22 @@ msgid "No changes to be saved" msgstr "无需保存更改" +msgid "No applicable assets found" +msgstr "未找到适用的资产" + + +msgid "Toggle catalog visibility in the asset shelf" +msgstr "在资产架中切换分类可见性" + + +msgid "Catalog Selector" +msgstr "分类选择" + + +msgid "Select the asset library and the contained catalogs to display in the asset shelf" +msgstr "选择要显示在资产架中的资产库及分类" + + msgid "Unable to load %s from %s" msgstr "无法加载 %s 来自 %s" @@ -111568,6 +118169,14 @@ msgid "File too long %s" msgstr "文件过长 %s" +msgid "No active attribute" +msgstr "没有活动属性" + + +msgid "Active string attribute not supported" +msgstr "不支持活动字符串属性" + + msgid "Some curves could not be converted because they were not attached to the surface" msgstr "某些曲线无法转换,因为其未附着在表面上" @@ -111596,6 +118205,22 @@ msgid "Operation is not allowed in edit mode" msgstr "禁止从编辑模式使用该操作" +msgid "Non-Assets" +msgstr "无资产" + + +msgid "" +"Tool node group assets not assigned to a catalog.\n" +"Catalogs can be assigned in the Asset Browser" +msgstr "" +"工具节点组资产未被分配至一个分类.\n" +"刻在资产浏览器中分配分类" + + +msgid "Asset is not a geometry node group" +msgstr "资产不是一个几何节点组" + + msgid "Cannot evaluate node group" msgstr "无法解算节点组" @@ -111604,6 +118229,10 @@ msgid "Node group must have a group output node" msgstr "节点组必须具有组输出节点" +msgid "Data-block inputs are unsupported" +msgstr "数据块输入不被支持" + + msgid "Annotation Create Poly: LMB click to place next stroke vertex | ESC/Enter to end (or click outside this area)" msgstr "标注创建多边形:鼠标左键点击放置下一个笔画点 | ESC/回车 结束操作 (或者在区域外单击)" @@ -111672,6 +118301,10 @@ msgid "The existing Armature modifier is already using a different Armature obje msgstr "现有的骨架修改器已经用于别的骨架物体" +msgid "The Armature modifier is invalid" +msgstr "骨架修改器无效" + + msgid "No Armature object in the view layer" msgstr "视图图层中没有骨架物体" @@ -112019,6 +118652,10 @@ msgid "Error evaluating number, see Info editor for details" msgstr "计算数字错误,详细信息见信息编辑器" +msgid "Press a key" +msgstr "按下一个键" + + msgid "Missing Panel: %s" msgstr "面板丢失: %s" @@ -112027,6 +118664,11 @@ msgid "Missing Menu: %s" msgstr "按钮丢失: %s" +msgctxt "WindowManager" +msgid "Search" +msgstr "搜索" + + msgid "Non-Keyboard Shortcut" msgstr "无键盘快捷键" @@ -112198,6 +118840,46 @@ msgid "Online Python Reference" msgstr "在线 Python 参考" +msgid "Drop %s on slot %d (replacing %s) of %s" +msgstr "拖拽%s 至槽%d (替换%s)隶属于%s" + + +msgid "Drop %s on slot %d (active slot) of %s" +msgstr "拖拽 %s 至槽 %d (活动槽) ( %s的)" + + +msgid "Drop %s on slot %d of %s" +msgstr "拖拽 %s 至槽 %d ( %s的)" + + +msgid "Expected an array of numbers: [n, n, ...]" +msgstr "应为数字数组: [n, n, ...]" + + +msgid "Expected a number" +msgstr "应为一个数字" + + +msgid "Paste expected 3 numbers, formatted: '[n, n, n]'" +msgstr "应粘贴3个数字,格式: '[n, n, n]'" + + +msgid "Paste expected 4 numbers, formatted: '[n, n, n, n]'" +msgstr "应粘贴四个数字,格式: '[n, n, n, n]'" + + +msgid "Unsupported key: Unknown" +msgstr "不支持的按键: 未知" + + +msgid "Unsupported key: CapsLock" +msgstr "不支持的按键:大写锁定(CapsLock)" + + +msgid "Can't edit driven number value, see driver editor for the driver setup" +msgstr "无法编辑驱动程序数值,请参阅驱动程序编辑器了解驱动程序设置" + + msgid "Menu Missing:" msgstr "菜单丢失:" @@ -112274,6 +118956,10 @@ msgid "Hex:" msgstr "Hex:" +msgid "Color as hexadecimal values" +msgstr "颜色为十六进制值" + + msgid "Lightness" msgstr "低亮度" @@ -112282,10 +118968,23 @@ msgid "Hex triplet for color (#RRGGBB)" msgstr "用于颜色的 Hex 三元组形式 (#RRGGBB)" +msgctxt "Color" +msgid "Value" +msgstr "明度" + + msgid "Redo" msgstr "重做" +msgid "Press spacebar to search..." +msgstr "按下空格键以开始搜索..." + + +msgid "Type to search..." +msgstr "输入以搜索..." + + msgid "Menu \"%s\" not found" msgstr "未找到菜单 \"%s\"" @@ -112352,6 +119051,26 @@ msgid "Drag" msgstr "拖拽" +msgid "Move layer {} into {}" +msgstr "移动层 {} 进 {}" + + +msgid "Move layer {} above {}" +msgstr "移动层 {} 到 {} 之上" + + +msgid "Move layer {} below {}" +msgstr "移动层 {} 到 {} 之下" + + +msgid "Add to linking collection before {}" +msgstr "在 {} 之前添加链接的集合" + + +msgid "Add to linking collection after {}" +msgstr "在 {}之后添加链接的集合" + + msgid "Double click to rename" msgstr "双击以重命名" @@ -112360,6 +119079,18 @@ msgid "Hide filtering options" msgstr "隐藏过滤选项" +msgid "Insert before socket" +msgstr "接口前插入" + + +msgid "Insert after socket" +msgstr "接口后插入" + + +msgid "Insert after panel" +msgstr "面板后插入" + + msgid "ID-Block:" msgstr "ID 块:" @@ -112560,10 +119291,26 @@ msgid "Stop animation playback" msgstr "停止动画播放" +msgid "Click to open the info editor" +msgstr "单击打开信息编辑器" + + msgid "Show in Info Log" msgstr "在信息日志中显示" +msgid "" +"File saved by newer Blender\n" +"(%s), expect loss of data" +msgstr "" +"文件为更新的blender保存\n" +"(%s),可能会数据丢失" + + +msgid "Only Alembic Procedurals supported" +msgstr "仅Alembic 程序化支持" + + msgid "The Cycles Alembic Procedural is only available with the experimental feature set" msgstr "Cycles Alembic 仅对实验特性组可用" @@ -112708,6 +119455,18 @@ msgid "Browse ID data to be linked" msgstr "浏览要关联的 ID 数据" +msgid "The data-block %s is not overridable" +msgstr "数据块 %s 不可覆盖" + + +msgid "The type of data-block %s is not yet implemented" +msgstr "数据块 %s 的类型尚未有效" + + +msgid "The data-block %s could not be overridden" +msgstr "数据块 %s 不能被覆写" + + msgctxt "Object" msgid "New" msgstr "新建" @@ -112877,6 +119636,10 @@ msgid "Unable to determine ABC sequence length" msgstr "无法确定ABC片段长度" +msgid "Could not add a layer to the cache file" +msgstr "无法将层添加到缓存文件" + + msgid "Global Orientation" msgstr "全局坐标系" @@ -113029,7 +119792,7 @@ msgstr "栅格" msgctxt "Mesh" msgid "Suzanne" -msgstr "猴头" +msgstr "苏珊娜" msgctxt "Mesh" @@ -113174,6 +119937,18 @@ msgid "No weights/vertex groups on object" msgstr "物体未包含权重组 / 顶点组" +msgid "There must be an active attribute" +msgstr "必须要有一个活动属性" + + +msgid "The active attribute must have a boolean type" +msgstr "活动属性必须要有一个布尔类型" + + +msgid "The active attribute must be on the vertex, edge, or face domain" +msgstr "活动属性必需基于顶点,边,面域" + + msgid "No face selected" msgstr "无选中面" @@ -113366,10 +120141,33 @@ msgid "Unassigned" msgstr "未分配" +msgid "" +"Modifier node group assets not assigned to a catalog.\n" +"Catalogs can be assigned in the Asset Browser" +msgstr "" +"未分配给分类的修改器节点组资产.\n" +"分类可以在资产浏览器中指定" + + msgid "SoundTrack" msgstr "声轨" +msgctxt "Light" +msgid "Volume" +msgstr "体积" + + +msgctxt "Light" +msgid "Plane" +msgstr "平面" + + +msgctxt "Light" +msgid "Sphere" +msgstr "球形" + + msgctxt "Light" msgid "LightProbe" msgstr "光照探头" @@ -113452,7 +120250,7 @@ msgstr "蜡笔" msgctxt "GPencil" msgid "Suzanne" -msgstr "猴头" +msgstr "苏珊娜" msgctxt "GPencil" @@ -113685,6 +120483,22 @@ msgid "Problem baking object \"%s\"" msgstr "烘焙物体 \"%s\" 时出现问题" +msgid "Bake directory of object %s, modifier %s is empty, setting default path" +msgstr "对象 %s 的烘焙目录,修改器 %s 为空,设置默认路径" + + +msgid "Path conflict: %d caches set to path %s" +msgstr "路径冲突:%d 缓存设置路径 %s" + + +msgid "Failed to remove metadata directory %s" +msgstr "删除元数据目录 %s失败" + + +msgid "Failed to remove blobs directory %s" +msgstr "无法删除blobs目录%s" + + msgid "Skipped some collections because of cycle detected" msgstr "由于循环检测而忽略部分集合" @@ -113954,7 +120768,11 @@ msgstr "未能找到钩挂修改器" msgid "Unable to execute '%s', error changing modes" -msgstr "无法执行 '%s', 改变模式时出错" +msgstr "无法执行 '%s', 改变模式时出错" + + +msgid "Unable to execute, %s object is linked" +msgstr "无法运行,%s 对象已经链接" msgid "Apply modifier as a new shapekey and keep it in the stack" @@ -114189,6 +121007,10 @@ msgid "Could not find an overridable root hierarchy for object '%s'" msgstr "找不到物体 '%s' 的可重写根层级" +msgid "Too many potential root collections (%d) for the override hierarchy, please use the Outliner instead" +msgstr "可能太多的根集合 (%d) 用于覆盖层级,请改用大纲视图" + + msgid "Move the mouse to change the voxel size. CTRL: Relative Scale, SHIFT: Precision Mode, ENTER/LMB: Confirm Size, ESC/RMB: Cancel" msgstr "移动鼠标以更改体素大小。CTRL: 相对比例,SHIFT: 精度模式,回车/LMB: 确认尺寸,ESC/RMB: 取消" @@ -114217,6 +121039,14 @@ msgid "The remesher cannot run with a Multires modifier in the modifier stack" msgstr "网格重构不能与多级精度修改器同时使用" +msgid "QuadriFlow: The mesh needs to be manifold and have face normals that point in a consistent direction" +msgstr "QuadriFlow: 网格必须是流形,并且具有指向一致方向的面法线" + + +msgid "QuadriFlow: Remeshing completed" +msgstr "QuadriFlow: 重构网格完成" + + msgid "Select Collection" msgstr "选择集合" @@ -114317,6 +121147,18 @@ msgid "|%i multiuser armature object(s)" msgstr "|%i 多用户的骨骼物体" +msgid "Lock selected and unlock unselected vertex groups of the active object" +msgstr "锁定活动对象的选定顶点组和解锁未选定顶点组" + + +msgid "Unlock selected and lock unselected vertex groups of the active object" +msgstr "解锁活动对象的选定顶点组和锁定未选定顶点组" + + +msgid "Toggle locks of all and invert unselected vertex groups of the active object" +msgstr "切换所有锁定并反转活动对象的未选定顶点组" + + msgid "No vertex groups to operate on" msgstr "无可供操作的顶点组" @@ -114389,6 +121231,18 @@ msgid "Bake failed: invalid canvas" msgstr "烘焙失败:非法绘制" +msgid "Baking canceled!" +msgstr "烘焙被取消!" + + +msgid "DynamicPaint: Bake complete! (%.2f)" +msgstr "动态绘画:烘焙结束! (%.2f)" + + +msgid "DynamicPaint: Bake failed: %s" +msgstr "动态绘画:烘焙失败: %s" + + msgid "Removed %d double particle(s)" msgstr "移除了 %d 个重叠粒子" @@ -114433,6 +121287,18 @@ msgid "Fluid: Could not use default cache directory '%s', please define a valid msgstr "流体: 无法使用默认缓存目录 '%s', 请手动指定一个有效缓存路径" +msgid "Fluid: %s complete! (%.2f)" +msgstr "流体: %s 完成! (%.2f)" + + +msgid "Fluid: %s failed: %s" +msgstr "流体: %s 失败: %s" + + +msgid "Fluid: %s canceled!" +msgstr "流体: %s 被取消!" + + msgid "Library override data-blocks only support Disk Cache storage" msgstr "库重写数据块仅支持磁盘缓存存储" @@ -114657,6 +121523,30 @@ msgid "Rigid Body World has no associated physics data to export" msgstr "刚体世界环境没有可供导出的关联物理数据" +msgid "3D Local View " +msgstr "3D局部视图 " + + +msgid "3D View " +msgstr "3D 视图 " + + +msgid "Frame:" +msgstr "帧:" + + +msgid "Time:" +msgstr "时间:" + + +msgid "Mem:%.2fM (Peak %.2fM)" +msgstr "| 内存: %.2fM (峰值: %.2fM)" + + +msgid "Mem:%.2fM, Peak: %.2fM" +msgstr "| 内存: %.2fM, 峰值: %.2fM" + + msgid "Cannot write a single file with an animation format selected" msgstr "无法在选中一个动画格式时写入文件" @@ -114693,6 +121583,14 @@ msgid "Skipping existing frame \"%s\"" msgstr "跳过已有帧 \"%s\"" +msgid "No active object, unable to apply the Action before rendering" +msgstr "没有活动物体,渲染前不能应用动作" + + +msgid "Object %s has no pose, unable to apply the Action before rendering" +msgstr "物体 %s 没有姿态,渲染前不能应用动作" + + msgid "Unable to remove material slot in edit mode" msgstr "无法在编辑模式下移除材质槽" @@ -114737,6 +121635,18 @@ msgid "No active line style in the current scene" msgstr "当前场景中没有活动的线样式" +msgid "Copied material to internal clipboard" +msgstr "拷贝到内部剪贴板的材质" + + +msgid "Cannot paste without a material" +msgstr "没有材质可粘贴" + + +msgid "Internal clipboard is not from a material" +msgstr "内部剪贴板没有材质数据" + + msgid "Removed %d slots" msgstr "删除 %d 个槽" @@ -114753,6 +121663,14 @@ msgid "View layer '%s' could not be removed from scene '%s'" msgstr "无法将视图层 '%s' 从场景 '%s' 中移除" +msgid "A narrow vertical area interferes with this operation" +msgstr "狭窄的垂直区域会干扰此操作" + + +msgid "A narrow horizontal area interferes with this operation" +msgstr "狭窄的水平区域会干扰此操作" + + msgid "Join Areas" msgstr "合并区域" @@ -114950,6 +121868,10 @@ msgid "Invalid UV map: UV islands must not overlap" msgstr "无效的 UV 贴图:UV孤岛不得重叠" +msgid "Cursor must be over the surface mesh" +msgstr "光标必须位于网格表面上" + + msgid "Curves do not have surface attachment information" msgstr "曲线没有表面的附着信息" @@ -114986,6 +121908,18 @@ msgid "Packed MultiLayer files cannot be painted: %s" msgstr "无法绘制打包的多图层文件: %s" +msgid " UVs," +msgstr " UVs," + + +msgid " Materials," +msgstr " 材质," + + +msgid " Stencil," +msgstr " 镂版," + + msgid "Image could not be found" msgstr "未能找到图像" @@ -115022,6 +121956,10 @@ msgid "The modifier used does not support deformed locations" msgstr "使用的修改器不支持外形位置" +msgid "No vertex group data" +msgstr "没有顶点组数据" + + msgid "Active group is locked, aborting" msgstr "活动组被锁定, 操作终止" @@ -115082,6 +122020,10 @@ msgid "Texture mapping not set to 3D, results may be unpredictable" msgstr "纹理映射未设置为3D,结果可能不可预知" +msgid "%s: Confirm, %s: Cancel" +msgstr "%s: 确认, %s: 取消" + + msgid "non-triangle face" msgstr "非三角面" @@ -115158,10 +122100,18 @@ msgid "Action '%s' will not be saved, create Fake User or Stash in NLA Stack to msgstr "动作 '%s' 将不被保存, 创建一个假用户或者存放在NLA堆栈中来保留" +msgid "No keyframes copied to the internal clipboard" +msgstr "没有关键帧被拷贝至剪贴板" + + msgid "Keyframe pasting is not available for mask mode" msgstr "在遮罩模式下无法使用关键帧粘贴" +msgid "No data in the internal clipboard to paste" +msgstr "内部剪贴板没有数据用于粘贴" + + msgid "Keyframe pasting is not available for grease pencil or mask mode" msgstr "在铅笔或遮罩模式下无法使用关键帧粘贴" @@ -115406,6 +122356,18 @@ msgid "Track the selected markers forward by one frame" msgstr "向前追踪一帧选定的标记" +msgid "New lines unsupported, call this operator multiple times" +msgstr "不支持新行,调用此操作多次" + + +msgid "Catalog is already placed inside this catalog" +msgstr "分类准备替换内部的分类" + + +msgid "Move catalog {} into {}" +msgstr "移动分类 {} 进 {}" + + msgid "Move assets to catalog" msgstr "将资产移动到目录" @@ -115418,6 +122380,10 @@ msgid "Only assets from this current file can be moved between catalogs" msgstr "只有来自当前文件中的资产才能在目录之间移动" +msgid "Catalog is already placed at the highest level" +msgstr "分类准备放置于最高层级" + + msgid "Move assets out of any catalog" msgstr "将资产从任何目录中移出" @@ -115450,6 +122416,10 @@ msgstr "" "从偏好设置中的文件路径部分管理资产库" +msgid "Unreadable Blender library file:" +msgstr "不可读Blender 库文件:" + + msgid "Unable to create configuration directory to write bookmarks" msgstr "无法创建配置目录来写入书签" @@ -115470,6 +122440,10 @@ msgid "Unable to open or write bookmark file \"%s\"" msgstr "无法打开或写入书签文件 \"%s\"" +msgid "Failure to perform external file operation on \"%s\"" +msgstr "无法对执行外部文件操作 \"%s\"" + + msgid "'%s' given path is OS-invalid, creating '%s' path instead" msgstr "'%s' 给定路径 OS-无效, 创建 '%s' 路径代替" @@ -115671,7 +122645,7 @@ msgstr "提示:bpy.context 对于渲染农场用途是不安全的" msgid "ERROR: Invalid target channel(s)" -msgstr "错误: 目标通道无效" +msgstr "错误: 目标通道无效" msgid "ERROR: Driver is useless without any inputs" @@ -115792,7 +122766,7 @@ msgstr "缺少ID='%s'和RNA-Path='%s'的欧拉尔旋转的%s%s%s 分量" msgid "XYZ rotations not equally keyed for ID='%s' and RNA-Path='%s'" -msgstr "XYZ 旋转不等于为 ID= '%s' 和 RNA-Path='%s' 插帧。" +msgstr "XYZ 旋转不等于为 ID= '%s' 和 RNA-Path='%s' 插帧" msgid "%d of %d rotation channels were filtered (see the Info window for details)" @@ -115803,6 +122777,14 @@ msgid "All %d rotation channels were filtered" msgstr "已过滤全部的 %d 个旋转通道" +msgid "No drivers deleted" +msgstr "无驱动器删除" + + +msgid "Deleted %u drivers" +msgstr "删除 %u 驱动器" + + msgid "Decimate Keyframes" msgstr "精简关键帧" @@ -115811,6 +122793,22 @@ msgid "Decimate F-Curves by specifying how much they can deviate from the origin msgstr "通过指定函数曲线与原始曲线的偏差程度来精简函数曲线" +msgid "Cannot find keys to operate on" +msgstr "找不到要操作的关键帧" + + +msgid "Decimate: Skipping non linear/bezier keyframes!" +msgstr "决定性:跳过非线性/贝塞尔关键帧!" + + +msgid "You need at least 2 keys to the right side of the selection" +msgstr "选择部分右侧至少需要2个关键帧" + + +msgid "You need at least 2 keys to the left side of the selection" +msgstr "选择部分左侧至少需要2个关键帧" + + msgid "There is no animation data to operate on" msgstr "没有要操作的动画数据" @@ -115895,6 +122893,10 @@ msgid "No images have been changed" msgstr "没有图像被更改" +msgid "Images cannot be copied while rendering" +msgstr "渲染时图像不能拷贝" + + msgid "Packing movies or image sequences not supported" msgstr "不支持打包影片或图像序列" @@ -115951,6 +122953,10 @@ msgid "can't save image while rendering" msgstr "渲染时无法保存图像" +msgid "No compatible images are on the clipboard" +msgstr "剪贴板上没有兼容的图像" + + msgid "Unpack 1 File" msgstr "解包 1 个文件" @@ -116007,6 +123013,10 @@ msgid "Verts:%s | Tris:%s" msgstr "顶点:%s | 三角面:%s" +msgid "Verts:%s | Faces:%s" +msgstr "顶点:%s | 面:%s" + + msgid "Verts:%s | Faces:%s | Tris:%s" msgstr "顶点:%s | 面:%s | 三角面:%s" @@ -116015,6 +123025,10 @@ msgid " | Objects:%s/%s" msgstr " | 物体:%s/%s" +msgid "Duration: %s (Frame %i/%i)" +msgstr "时长: %s (帧 %i/%i)" + + msgid "Memory: %s" msgstr "内存: %s" @@ -116115,6 +123129,18 @@ msgid "Select an existing NLA Track or an empty action line first" msgstr "先选中一个已有的 NLA 轨道或一个空动作行" +msgid "" +"Node group assets not assigned to a catalog.\n" +"Catalogs can be assigned in the Asset Browser" +msgstr "" +"节点组资产未分配到分类.\n" +"分类可以在资产浏览器中分配" + + +msgid "The internal clipboard is empty" +msgstr "内部剪贴板是空的" + + msgid "Some nodes references could not be restored, will be left empty" msgstr "一些节点引用无法被重置, 将被留空" @@ -116187,6 +123213,10 @@ msgid "Could not add a mask node" msgstr "无法添加一个遮罩节点" +msgid "Could not add material" +msgstr "无法添加材质" + + msgid "" "Can not add node group '%s' to '%s':\n" " %s" @@ -116207,6 +123237,30 @@ msgid "Adding node groups isn't supported for custom (Python defined) node trees msgstr "自定义(Python 定义)节点树不支持添加节点组" +msgid "{} (String)" +msgstr "{} (字符串)" + + +msgid "{} (Integer)" +msgstr "{} (整数)" + + +msgid "{} (Float)" +msgstr "{} (浮点)" + + +msgid "({}, {}, {}) (Vector)" +msgstr "({}, {}, {}) (矢量)" + + +msgid "({}, {}, {}, {}) (Color)" +msgstr "({}, {}, {}, {}) (颜色)" + + +msgid "{} (Boolean)" +msgstr "{} (布尔)" + + msgid "True" msgstr "真" @@ -116215,6 +123269,42 @@ msgid "False" msgstr "假" +msgid "Value has not been logged" +msgstr "尚未记录值" + + +msgid "Integer field based on:" +msgstr "整数字段基于:" + + +msgid "Float field based on:" +msgstr "浮点字段基于:" + + +msgid "Vector field based on:" +msgstr "矢量字段基于:" + + +msgid "Boolean field based on:" +msgstr "布尔字段基于:" + + +msgid "String field based on:" +msgstr "字符串字段基于:" + + +msgid "Color field based on:" +msgstr "颜色字段基于:" + + +msgid "Rotation field based on:" +msgstr "旋转字段基于:" + + +msgid "• {}" +msgstr "• {}" + + msgid "Empty Geometry" msgstr "空几何体" @@ -116263,6 +123353,10 @@ msgid "no matrices" msgstr "无矩阵" +msgid "• Grease Pencil: %s layers" +msgstr "• 蜡笔: %s 层" + + msgid "Supported: All Types" msgstr "支持: 全部类型" @@ -116279,6 +123373,10 @@ msgid "Accessed named attributes:" msgstr "已访问的命名属性:" +msgid " • \"{}\": " +msgstr " • \"{}\": " + + msgid "read" msgstr "读取" @@ -116295,6 +123393,14 @@ msgid "Attributes with these names used within the group may conflict with exist msgstr "组内使用这些名称的属性可能与现有属性冲突" +msgid " Named Attribute" +msgstr " 已命名属性" + + +msgid " Named Attributes" +msgstr " 已命名属性" + + msgid "The execution time from the node tree's latest evaluation. For frame and group nodes, the time for all sub-nodes" msgstr "节点树最新解算的执行时间。对于帧和组节点,指所有子节点的时间" @@ -116323,6 +123429,14 @@ msgid "Can not add node '%s' in a group" msgstr "无法在组中添加节点 '%s'" +msgid "Can not add zone input node '%s' to a group without its paired output '%s'" +msgstr "无法添加区域输入节点'%s' 到组,没有配对输出 '%s'" + + +msgid "Can not add zone output node '%s' to a group without its paired input '%s'" +msgstr "无法添加区域输出节点'%s' 到组,没有配对输入 '%s'" + + msgid "Can not insert group '%s' in '%s'" msgstr "无法插入节点组 '%s' 至 '%s'" @@ -116599,10 +123713,30 @@ msgid "Library path '%s' is now valid, please reload the library" msgstr "库路径 '%s' 不可用, 请重新加载库" +msgid "Purging %d unused data-blocks (" +msgstr "清除 %d 未使用的数据块 (" + + msgid "). Click here to proceed..." msgstr "). 点击此处继续..." +msgid "Not an editable name" +msgstr "不是一个可编辑名称" + + +msgid "Sequence names are not editable from the Outliner" +msgstr "大纲序列名称不可编辑" + + +msgid "External library data is not editable" +msgstr "外部库的数据不可编辑" + + +msgid "Overridden data-blocks names are not editable" +msgstr "覆盖的数据块名称不可编辑" + + msgid "No active item to rename" msgstr "无活动项可供重命名" @@ -116703,6 +123837,10 @@ msgid "Cannot unlink world '%s'. It's not clear which scene it should be unlinke msgstr "无法取消关联世界 '%s'。不清楚它应该从哪个场景取消关联,大纲视图树中没有作为父场景的场景" +msgid "Could not create library override from data-block '%s', as it is not overridable" +msgstr "无法从数据块 '%s' 创建库重写,因为它不可重写" + + msgid "Invalid anchor ('%s') found, needed to create library override from data-block '%s'" msgstr "找到无效的锚点 ('%s') ,需要从数据块 '%s' 创建库重写" @@ -116719,6 +123857,14 @@ msgid "Could not create library override from one or more of the selected data-b msgstr "无法从一个或多个选定的数据块创建库重写" +msgid "Cannot clear embedded library override '%s', only overrides of real data-blocks can be directly cleared" +msgstr "无法清除嵌入式库重写 '%s',只能直接清除真实数据块的重写" + + +msgid "Cannot clear linked library override '%s', only local overrides can be directly cleared" +msgstr "无法清除链接的库重写 '%s', 只能直接删除真实数据块的重写" + + msgid "No Library Overrides" msgstr "无库重写" @@ -116747,6 +123893,22 @@ msgid "Added through override" msgstr "通过重写添加" +msgid "Protected from override" +msgstr "重写保护" + + +msgid "Additive override" +msgstr "加法覆盖" + + +msgid "Subtractive override" +msgstr "减法覆盖" + + +msgid "Multiplicative override" +msgstr "乘法覆盖" + + msgid "(empty)" msgstr "(空)" @@ -116843,6 +124005,14 @@ msgid "File '%s' could not be loaded" msgstr "无法加载 '%s' 文件" +msgid "Please select all related strips" +msgstr "请选择所有关联片段" + + +msgid "No strips to paste" +msgstr "没有可供粘贴的片段" + + msgid "Slip offset: %s" msgstr "滑动偏移: %s" @@ -116883,14 +124053,6 @@ msgid "No valid inputs to swap" msgstr "没有可供互换的有效输入项" -msgid "Please select all related strips" -msgstr "请选择所有关联片段" - - -msgid "No strips to paste" -msgstr "没有可供粘贴的片段" - - msgid "Please select two strips" msgstr "请选择两个片段" @@ -116935,10 +124097,46 @@ msgid "Select movie or image strips" msgstr "选择影片或图像片段" +msgid "Can not create key inside of speed transition" +msgstr "无法在速度转换内部创建关键帧" + + +msgid "Can not create freeze frame" +msgstr "无法创建冻结帧" + + +msgid "Can not create transition from first or last key" +msgstr "无法从第一个关键帧或最后一个关键帧创建转换" + + +msgid "Can not create transition" +msgstr "无法创建转换" + + +msgid "Retiming key must be selected" +msgstr "重定时关键帧必须被选中" + + +msgid "No keys or strips selected" +msgstr "没有关键帧或者片段选中" + + +msgid "This strip type can not be retimed" +msgstr "此片段类型无法重定时" + + msgid "No active sequence!" msgstr "没有活动的序列!" +msgid "Rows:" +msgstr "排:" + + +msgid "Columns:" +msgstr "列:" + + msgid "Class" msgstr "类" @@ -117015,6 +124213,10 @@ msgid "Python disabled in this build" msgstr "Python 在本版本中被禁用" +msgid "No file path for \"%s\"" +msgstr "\"%s\"没有文件路径" + + msgid "Cannot save text file, path \"%s\" is not writable" msgstr "无法保存文本文件,路径 \"%s\" 不可写入" @@ -117055,6 +124257,10 @@ msgid "Undo History" msgstr "重做历史" +msgid "Registration not possible from Microsoft Store installations" +msgstr "无法从Microsoft应用商店安装进行注册" + + msgid "File association registered" msgstr "文件关联已注册" @@ -117063,6 +124269,22 @@ msgid "Unable to register file association" msgstr "无法注册文件关联" +msgid "Unregistration not possible from Microsoft Store installations" +msgstr "无法从Microsoft应用商店安装中注销" + + +msgid "There is no asset library to remove" +msgstr "没有要删除的资产库" + + +msgid "There is no extension repository to remove" +msgstr "没有要删除的扩展存储库" + + +msgid "Not available for Microsoft Store installations" +msgstr "不可用于Microsoft应用商店安装" + + msgid "Windows-only operator" msgstr "操作仅支持Windows" @@ -117344,7 +124566,7 @@ msgstr "此模式下透视不可用(请切换到实体或线框着色模式)" msgid "Gizmos hidden in this view" -msgstr "在该视图中隐藏Gizmo" +msgstr "在该视图中隐藏操控器" msgid "Cannot navigate a camera from an external library or non-editable override" @@ -117576,15 +124798,15 @@ msgstr "时间: %.3f %s" msgid "ScaleB: %s%s %s" -msgstr "ScaleB: %s%s %s" +msgstr "缩放B: %s%s %s" msgid "ScaleB: %s : %s : %s%s %s" -msgstr "ScaleB: %s : %s : %s%s %s" +msgstr "缩放B: %s : %s : %s%s %s" msgid "ScaleB X: %s Y: %s Z: %s%s %s" -msgstr "ScaleB X: %s Y: %s Z: %s%s %s" +msgstr "缩放B X: %s Y: %s Z: %s%s %s" msgid "Bend Angle: %s Radius: %s Alt, Clamp %s" @@ -117695,6 +124917,10 @@ msgid " or Alt) Even Thickness %s" msgstr " 或 Alt) 均匀厚度 %s" +msgid "'Shrink/Fatten' meshes is only supported in edit mode" +msgstr "\"推/拉\"网格仅在编辑模式可用" + + msgid "ScaleX: %s" msgstr "X 向缩放: %s" @@ -117735,6 +124961,10 @@ msgid "left" msgstr "左" +msgid "Auto-offset direction: %s" +msgstr "自动偏移方向: %s" + + msgid "Use 'Time_Translate' transform mode instead of 'Translation' mode for translating keyframes in Dope Sheet Editor" msgstr "在摄影表编辑器中,使用“时间变换”变换模式来代替“转换”模式来变换关键帧" @@ -117856,6 +125086,10 @@ msgid "Overwrite %s" msgstr "覆盖 %s" +msgid "Failed to set preview: no ID in context (incorrect context?)" +msgstr "设置预览失败: 上下文中没有ID(上下文错误?)" + + msgid "Incorrect context for running data-block fake user toggling" msgstr "运行数据块伪用户切换的上下文不正确" @@ -117909,6 +125143,10 @@ msgid "UV Vertex" msgstr "UV 顶点" +msgid "Skipped %d of %d island(s), geometry was too complicated to detect a match" +msgstr "跳过 %d 孤岛的 %d , 几何体过于复杂无法获得匹配" + + msgid "Cannot split selection when sync selection is enabled" msgstr "当同步开启时无法进行分离" @@ -118126,6 +125364,10 @@ msgid "MultipleStrokes" msgstr "多个笔画" +msgid "Layer Step" +msgstr "层步进" + + msgid "Outline requires an active camera" msgstr "轮廓需要活动相机" @@ -118150,11 +125392,355 @@ msgid "All line art objects are now cleared" msgstr "已清除全部线条画物体" +msgid "No active object or active object isn't a GPencil object" +msgstr "没有活动物体或者活动物体并非一个蜡笔物体" + + +msgid "Object type mismatch, Alembic object path pointed to Camera when importing, but not any more" +msgstr "物体类型不匹配,导入时Alembic物体路径指向了相机,但不再会有" + + +msgid "Object type mismatch, Alembic object path points to Camera" +msgstr "物体类型不匹配,Alembic物体路径指向了相机" + + +msgid "Object type mismatch, Alembic object path pointed to Curves when importing, but not any more" +msgstr "物体类型不匹配,导入时Alembic物体路径指向曲线,但不再发生" + + +msgid "Object type mismatch, Alembic object path points to Curves" +msgstr "物体类型不匹配,Alembic物体路径指向了曲线" + + +msgid "Error reading curve sample; more detail on the console" +msgstr "曲线采样读取错误; 更多信息在控制台" + + +msgid "Object type mismatch, Alembic object path pointed to PolyMesh when importing, but not any more" +msgstr "错误类型不匹配,导入时Alembic对象路径指向PolyMesh,但现在不再如此" + + +msgid "Object type mismatch, Alembic object path points to PolyMesh" +msgstr "物体类型不匹配,Alembic物体路径指向 PolyMesh" + + +msgid "Error reading mesh sample; more detail on the console" +msgstr "读取网格采样时出错;控制台查看更多细节" + + +msgid "Invalid mesh; more detail on the console" +msgstr "无效网格;控制台查看更多细节" + + +msgid "Topology has changed, perhaps by triangulating the mesh. Only vertices will be read!" +msgstr "拓扑结构发生了变化,可能是网格进行三角化了,将只读取顶点!" + + +msgid "Object type mismatch, Alembic object path pointed to SubD when importing, but not any more" +msgstr "对象类型不匹配,导入时Alembic对象路径指向SubD,但不再指向" + + +msgid "Object type mismatch, Alembic object path points to SubD" +msgstr "对象类型不匹配,Alembic对象路径指向SubD" + + +msgid "Object type mismatch, Alembic object path pointed to NURBS when importing, but not any more" +msgstr "对象类型不匹配,导入时Alembic对象路径指向NURBS,但不再指向" + + +msgid "Object type mismatch, Alembic object path points to NURBS" +msgstr "对象类型不匹配,Alembic对象路径指向NURBS" + + +msgid "Object type mismatch, Alembic object path pointed to Points when importing, but not any more" +msgstr "对象类型不匹配,导入时Alembic对象路径指向点,但不再指向点" + + +msgid "Object type mismatch, Alembic object path points to Points" +msgstr "对象类型不匹配,Alembic对象路径指向“点”" + + +msgid "Error reading points sample; more detail on the console" +msgstr "点采样读取错误;控制台查看更多细节" + + +msgid "Object type mismatch, Alembic object path pointed to XForm when importing, but not any more" +msgstr "对象类型不匹配,导入时Alembic对象路径指向XForm,但不再指向" + + +msgid "Object type mismatch, Alembic object path points to XForm" +msgstr "对象类型不匹配,Alembic对象路径指向XForm" + + +msgid "Invalid object: verify object path" +msgstr "无效对象:验证对象路径" + + +msgid "Could not open Alembic archive for reading, see console for detail" +msgstr "无法打开Alembic存档进行读取,有关详细信息,请参阅控制台" + + msgctxt "Action" msgid "Group" msgstr "群组" +msgid "PLY Importer: failed importing, unknown error" +msgstr "PLY 导入: 导入失败, 未知错误" + + +msgid "PLY Importer: failed importing, no vertices" +msgstr "PLY 导入: 导入失败, 没有顶点" + + +msgid "PLY Importer: %s: %s" +msgstr "PLY 导入: %s: %s" + + +msgid "%s: Couldn't determine package-relative file name from path %s" +msgstr "%s: 无法从路径 %s 确定包的相对文件名" + + +msgid "%s: Couldn't copy file %s to %s" +msgstr "%s: 无法拷贝文件 %s 到 %s" + + +msgid "%s: Couldn't split UDIM pattern %s" +msgstr "%s: 不能分离 UDIM 样式 %s" + + +msgid "%s: Will not overwrite existing asset %s" +msgstr "%s: 不会覆盖存在的资产 %s" + + +msgid "%s: Can't resolve path %s" +msgstr "%s: 无法解析路径 %s" + + +msgid "%s: Can't resolve path %s for writing" +msgstr "%s: 无法解析路径 %s 用于写入" + + +msgid "%s: Can't copy %s. The source and destination paths are the same" +msgstr "%s: 无法拷贝 %s. 源路径和目标路径相同" + + +msgid "%s: Can't write to asset %s: %s" +msgstr "%s:无法写入资产 %s: %s" + + +msgid "%s: Can't open source asset %s" +msgstr "%s: 无法打开源资产 %s" + + +msgid "%s: Will not copy zero size source asset %s" +msgstr "%s: 不会拷贝零大小的源资产 %s" + + +msgid "%s: Null buffer for source asset %s" +msgstr "%s: 源资产 %s 的缓冲区为空" + + +msgid "%s: Can't open destination asset %s for writing" +msgstr "%s: 无法打开目标资产 %s 用于写入" + + +msgid "%s: Error writing to destination asset %s" +msgstr "%s: 错误写入目标资产 %s" + + +msgid "%s: Couldn't close destination asset %s" +msgstr "%s: 不能关闭目标资产 %s" + + +msgid "%s: Texture import directory path empty, couldn't import %s" +msgstr "%s: 纹理导入目录路径为空, 无法导入 %s" + + +msgid "%s: import directory is relative but the blend file path is empty. Please save the blend file before importing the USD or provide an absolute import directory path. Can't import %s" +msgstr "%s: 导入目录是相对的,但blend文件路径为空,请在导入USD之前保存blend文件,或提供绝对的导入目录路径,无法导入 %s" + + +msgid "%s: Couldn't create texture import directory %s" +msgstr "%s: 无法创建纹理导入目录 %s" + + +msgid "USD Export: Unable to delete existing usdz file %s" +msgstr "USD 导出: 不能删除已存在的usdz文件 %s" + + +msgid "USD Export: Couldn't move new usdz file from temporary location %s to %s" +msgstr "USD 导出: 无法移动新的usdz文件从临时位置 %s 到 %s" + + +msgid "USD Export: unable to find suitable USD plugin to write %s" +msgstr "USD 导出: 无法找到合适的USD插件用于写入 %s" + + +msgid "USD Export: invalid path string '%s': %s" +msgstr "USD 导出: 无效路径字符 '%s': %s" + + +msgid "USD Export: path '%s' is not an absolute path" +msgstr "USD 导出: 路径 '%s' 不是一个绝对路径" + + +msgid "USD Export: path string '%s' is not a prim path" +msgstr "USD导出: 路径字符串 '%s' 不是原始路径" + + +msgid "Could not open USD archive for reading, see console for detail" +msgstr "无法打开USD存档,有关详细信息,请参阅控制台" + + +msgid "USD Import: unable to open stage to read %s" +msgstr "USD导入: 无法打开舞台进行读取 %s" + + +msgid "An exception occurred invoking USD hook '%s'. Please see the console for details" +msgstr "调用USD钩子 '%s'时发生异常。有关详细信息,请参阅控制台" + + +msgid "An exception occurred invoking USD hook '%s'" +msgstr "调用USD钩子 '%s'时发生异常" + + +msgid "Unsupported type %s for mesh data" +msgstr "网格数据不支持的类型 %s" + + +msgid "Unsupported domain for mesh data type %s" +msgstr "网格数据类型 %s 的不支持的域" + + +msgid "Unable to get array values for primvar %s" +msgstr "无法获取图元 %s 的数组值" + + +msgid "USD Import: can't cast attribute '%s' to array" +msgstr "USD 导入: 法将属性 '%s' 强制转换为数组" + + +msgid "USD Import: color attribute value '%s' count inconsistent with interpolation type" +msgstr "USD 导入: 颜色属性值'%s' 计数与插值类型不一致" + + +msgid "USD Import: couldn't add color attribute '%s'" +msgstr "USD 导入:颜色属性 '%s' 无法添加" + + +msgid "USD Import: UV attribute value '%s' count inconsistent with interpolation type" +msgstr "USD 导入: UV属性值'%s' 数与插值类型不一致" + + +msgid "USD Import: couldn't add UV attribute '%s'" +msgstr "USD 导入:无法添加UV属性 '%s'" + + +msgid "Generic primvar %s: invalid type %s" +msgstr "泛型 primvar %s: 无效的类型 %s" + + +msgid "Skipping primvar %s, mesh %s -- no value" +msgstr "跳过 primvar %s,网格 %s -- 无数据" + + +msgid "%s: Couldn't compute geom bind transform for %s" +msgstr "%s: 无法计算 %s 的几何变换" + + +msgid "Unhandled Gprim type: %s (%s)" +msgstr "未处理的 Gprim 类型:%s (%s)" + + +msgid "%s: Couldn't find armature object corresponding to USD skeleton %s" +msgstr "%s: 找不到与 USD 骨架 %s 对应的骨架对象" + + +msgid "%s: Couldn't get offsets for blend shape %s" +msgstr "%s: 无法获取混合形状 %s 的偏移量" + + +msgid "%s: No offsets for blend shape %s" +msgstr "%s:混合形状 %s 无偏移量" + + +msgid "%s: Number of offsets greater than number of mesh vertices for blend shape %s" +msgstr "%s:混合形状 %s 的偏移量大于网格顶点数" + + +msgid "%s: Couldn't query skeleton %s" +msgstr "%s:无法查询到 %s 骨架" + + +msgid "%s: Topology and joint order size mismatch for skeleton %s" +msgstr "%s:骨架 %s 的拓扑和关节顺序大小不匹配" + + +msgid "%s: Couldn't add bone for joint %s" +msgstr "%s:无法为关节 %s 添加骨骼" + + +msgid "%s: Mismatch in bone and joint counts for skeleton %s" +msgstr "%s:骨骼 %s 的骨骼和关节数不匹配" + + +msgid "%s: Mismatch in bind xforms and joint counts for skeleton %s" +msgstr "%s:绑定 xform 和骨架 %s 的关节数不匹配" + + +msgid "%s: Error creating deform group data for mesh %s" +msgstr "%s: 为网格物体 %s 创建变形组数据时出错" + + +msgid "USD Export: no bounds could be computed for %s" +msgstr "USD 导出器:无法计算 %s 的边界" + + +msgid "Curve width size not supported for USD interpolation" +msgstr "USD 插值不支持曲线宽度大小" + + +msgid "Cannot export mixed curve types in the same Curves object" +msgstr "在相同曲线物体中无法导出不同的曲线类型" + + +msgid "USD export: couldn't export in-memory texture to %s" +msgstr "USD 导出器:无法将内存中纹理导出到 %s" + + +msgid "USD export: could not copy texture tile from %s to %s" +msgstr "USD 导出器:无法将纹理图块从 %s 复制到 %s" + + +msgid "USD export: could not copy texture from %s to %s" +msgstr "USD导出器:纹理无法从 %s 复制到 %s" + + +msgid "Unsupported type for mesh data" +msgstr "不支持的网络数据类型" + + +msgid "Mesh %s, Attribute %s cannot be converted to USD" +msgstr "网格 %s, 属性 %s 无法转换为USD" + + +msgid "USD Export: failed to resolve .vdb file for object: %s" +msgstr "USD 导出器: 无法解析对象 %s 的 .vdb 文件" + + +msgid "USD Export: couldn't construct relative file path for .vdb file, absolute path will be used instead" +msgstr "USD 导出器:无法为 .vdb 文件创建相对文件路径,将改用绝对路径" + + +msgid "Asset data can only be assigned to assets. Use asset_mark() to mark as an asset" +msgstr "资产数据只能分配给资产。请使用 asset_mark() 标记为资产" + + +msgid "Asset data cannot be None" +msgstr "资产数据不能为空" + + msgid "Override template experimental feature is disabled" msgstr "已禁用覆写模板实验功能" @@ -118195,6 +125781,10 @@ msgid "Registering id property class: '%s' is too long, maximum length is %d" msgstr "注册 ID 属性类: '%s' 太长, 最大的长度是 %d" +msgid "'%s' is of a type that cannot be an asset" +msgstr "'%s' 类型不能用作资产" + + msgid "ID '%s' isn't an override" msgstr "ID '%s' 不是重写" @@ -118203,8 +125793,12 @@ msgid "ID '%s' is linked, cannot edit its overrides" msgstr "ID '%s' 已关联,无法编辑其重写" +msgid "Data-block '%s' is not a library override, or not part of a library override hierarchy" +msgstr "数据块 '%s' 不是库重写,也不是库重写层次结构的一部分" + + msgid "%s is not compatible with %s 'refresh' options" -msgstr "%s 和 %s '刷新'选项不兼容" +msgstr "%s 与 %s 的“刷新”选项不兼容" msgid "This property is for internal use only and can't be edited" @@ -118307,6 +125901,14 @@ msgid "Driver not found in this animation data" msgstr "未能在该动画数据中找到驱动器" +msgid "%s '%s' is too long, maximum length is %d" +msgstr "%s '%s' 太长,最大长度为 %d" + + +msgid "%s '%s', bl_idname '%s' %s" +msgstr "%s '%s', bl_idname '%s' %s" + + msgid "NlaTrack '%s' cannot be removed" msgstr "无法移除 NLA 轨道 '%s'" @@ -118335,6 +125937,18 @@ msgid "Armature '%s' does not contain bone '%s'" msgstr "骨架 '%s' 未包含骨骼 '%s'" +msgid "`Collection.bones` is not available in armature edit mode" +msgstr "`Collection.bones` 在骨架编辑模式下不可用" + + +msgid "Invalid color palette index: %d" +msgstr "调色板索引无效: %d" + + +msgid "%s is not supported, pass a Bone, PoseBone, or EditBone" +msgstr "不支持 %s,请传递 Bone、PoseBone 或 EditBone" + + msgid "Tag '%s' already present for given asset" msgstr "标签 '%s' 资产用作表示已有资产" @@ -118453,6 +126067,10 @@ msgid "CurveProfile table not initialized, call initialize()" msgstr "曲线轮廓表未初始化,调用 initialize()" +msgid "Curve sizes must be greater than zero" +msgstr "曲线大小必须大于零" + + msgid "Dependency graph update requested during evaluation" msgstr "解算期间需更新依赖关系图" @@ -118722,6 +126340,10 @@ msgid "ViewLayer '%s' does not contain object '%s'" msgstr "视图层 '%s' 不包含对象 '%s'" +msgid "AOV not found in view-layer '%s'" +msgstr "在视图层 '%s' 中找不到 AOV" + + msgid "Failed to add the color modifier" msgstr "添加色彩修改器失败" @@ -118858,10 +126480,46 @@ msgid "Registering node socket class: '%s' is too long, maximum length is %d" msgstr "注册节点插口类: '%s' 过长, 最大长度为 %d" +msgid "The node socket's default value" +msgstr "节点连接端口的默认值" + + +msgid "The index from the context" +msgstr "上下文中的索引" + + +msgid "The \"id\" attribute if available, otherwise the index" +msgstr "“id”属性(如果可用),否则为索引" + + +msgid "The geometry's normal direction" +msgstr "几何图形的法线方向" + + +msgid "The position from the context" +msgstr "上下文中的位置" + + +msgid "Parent is not part of the interface" +msgstr "父级不是接口的一部分" + + +msgid "Unknown socket type" +msgstr "未知接口类型" + + +msgid "Could not find supported socket type" +msgstr "不能找到支持的连接接口类型" + + msgid "Unable to create socket" msgstr "无法创建接口" +msgid "Parent panel does not allow child panels" +msgstr "父面板不允许有子面板" + + msgid "CustomGroup" msgstr "自定义组" @@ -118898,6 +126556,14 @@ msgid "Unable to move sockets in built-in node" msgstr "无法移动内置节点中的接口" +msgid "Unable to create item with this socket type" +msgstr "无法创建具有此连接接口类型的项" + + +msgid "Registering node tree class: '%s', bl_idname '%s' could not be unregistered" +msgstr "注册节点树类:“%s”,bl_idname “%s” 无法取消注册" + + msgid "Node tree '%s' has undefined type %s" msgstr "节点树 '%s' 包含未定义的类型 '%s'" @@ -118922,10 +126588,22 @@ msgid "Unable to locate node '%s' in node tree" msgstr "无法在节点树中找到节点 '%s'" +msgid "Registering node class: '%s', bl_idname '%s' is a builtin node" +msgstr "注册节点类:'%s',bl_idname 为 '%s' 是内置节点" + + +msgid "Registering node class: '%s', bl_idname '%s' could not be unregistered" +msgstr "注册节点类:'%s',bl_idname '%s' 无法取消注册" + + msgid "Unable to locate socket '%s' in node" msgstr "无法在节点上找到接口 '%s'" +msgid "The output node %s is already paired with %s" +msgstr "输出节点 %s 已与 %s 配对" + + msgid "Can only assign evaluated data to evaluated object, or original data to original object" msgstr "只能将评估的数据分配给评估对象,或将原始数据分配给原始对象" @@ -119062,6 +126740,10 @@ msgid "Palette '%s' does not contain color given" msgstr "调色板 '%s' 不包含给定颜色" +msgid "Invalid target!" +msgstr "无效目标!" + + msgid "uv_on_emitter() requires a modifier from an evaluated object" msgstr "uv_on_emitter() 需要一个来自被解算物体的修改器" @@ -119214,10 +126896,30 @@ msgid "MovieTracking '%s' cannot be removed" msgstr "无法移除影片追踪 %s" +msgid "Registering panel class:" +msgstr "注册面板类:" + + msgid "Region not found in space type" msgstr "空间类型里找不到区域" +msgid "%s '%s' has category '%s'" +msgstr "%s '%s' 具有 '%s' 类别" + + +msgid "%s '%s', bl_idname '%s' could not be unregistered" +msgstr "%s '%s',无法取消注册bl_idname为'%s'的类" + + +msgid "Script directory not found" +msgstr "未找到脚本目录" + + +msgid "Extension repository not found" +msgstr "未找到扩展存储库" + + msgid "Add-on is no longer valid" msgstr "插件已失效" @@ -119230,6 +126932,14 @@ msgid "Font not packed" msgstr "未打包字体" +msgid "Could not find grid with name %s" +msgstr "无法找到%s 的网格" + + +msgid "No active window in context!" +msgstr "上下文中没有活动窗口!" + + msgid "Not a non-modal keymap" msgstr "不是非模态的键映射" @@ -119271,11 +126981,11 @@ msgstr "仅支持单个字符" msgid "Gizmo group type '%s' not found!" -msgstr "未找到Gizmo组类型 '%s'!" +msgstr "未找到操控器组类型 '%s'!" msgid "Gizmo group '%s' has 'PERSISTENT' option set!" -msgstr "Gizmo组 '%s' 已设置了'持久化'选项!" +msgstr "操控器组 '%s' 已设置了'持久化'选项!" msgid "Modal key-maps not supported for add-on key-config" @@ -119287,15 +126997,27 @@ msgstr "无法移除键配置 %s" msgid "GizmoType '%s' not known" -msgstr "未知Gizmo类型 '%s'" +msgstr "未知操控器类型 '%s'" msgid "GizmoType '%s' is for a 3D gizmo-group. The 'draw_select' callback is set where only 'test_select' will be used" -msgstr "Gizmo类型 '%s' 用于三维gizmo组. 在将用到 'test_select' 的位置设置了 'draw_select' 回调" +msgstr "操控器类型 '%s' 用于三维gizmo组. 在将用到 'test_select' 的位置设置了 'draw_select' 回调" + + +msgid "%s area type does not support gizmos" +msgstr "%s 区域类型不支持操控器" + + +msgid "Unknown operator" +msgstr "未知操作符" + + +msgid "Operator missing srna" +msgstr "srna中丢失操作符" msgid "Gizmo target property '%s.%s' not found" -msgstr "未找到Gizmo目标属性 '%s.%s'" +msgstr "未找到操控器目标属性 '%s.%s'" msgid "Property '%s.%s' not found" @@ -119303,19 +127025,19 @@ msgstr "未找到属性 '%s.%s'" msgid "Gizmo target '%s.%s' expects '%s', '%s.%s' is '%s'" -msgstr "Gizmo目标 '%s.%s' 预期 '%s', '%s.%s' 是 '%s'" +msgstr "操控器目标 '%s.%s' 预期 '%s', '%s.%s' 是 '%s'" msgid "Gizmo target property '%s.%s' expects an array of length %d, found %d" -msgstr "Gizmo目标属性 '%s.%s' 需要长度为 %d 的数组, 已找到 %d" +msgstr "操控器目标属性 '%s.%s' 需要长度为 %d 的数组, 已找到 %d" msgid "Gizmo target property '%s.%s' expects an array of length %d" -msgstr "Gizmo目标属性 '%s.%s' 需要长度为 %d 的数组" +msgstr "操控器目标属性 '%s.%s' 需要长度为 %d 的数组" msgid "Gizmo target property '%s.%s', index %d must be below %d" -msgstr "Gizmo 目标属性 '%s.%s', 索引 %d 必须在 %d 之下" +msgstr "操控器目标属性 '%s.%s', 索引 %d 必须在 %d 之下" msgid "%s '%s'" @@ -119331,7 +127053,7 @@ msgstr "未找到操作 '%s'!" msgid "Gizmo group '%s' not found!" -msgstr "未找到Gizmo组 '%s'!" +msgstr "未找到操控器组 '%s'!" msgid "ActionMapBinding '%s' cannot be removed from '%s'" @@ -119510,6 +127232,26 @@ msgid "Axis Mapping" msgstr "轴向映射" +msgid "Vertex count mismatch" +msgstr "顶点数不匹配" + + +msgid "Invalid frame total" +msgstr "帧总数无效" + + +msgid "Timestamp read failed" +msgstr "时间戳读取失败" + + +msgid "Failed to read frame" +msgstr "读取帧错误" + + +msgid "Vertex coordinate read failed" +msgstr "顶点坐标读取错误" + + msgid "MeshDeform" msgstr "网格形变" @@ -120183,6 +127925,10 @@ msgid "Intersecting Edges" msgstr "相交边" +msgid "Collection contains current object" +msgstr "集合包含当前对象" + + msgid "Separate Children" msgstr "分离子级" @@ -120675,6 +128421,10 @@ msgid "Animation playback speed in frames per second. If a single image, then 0" msgstr "动画播放速度,单位: 帧/秒。如果是单个图像,则为 0" +msgid "Texture coordinates from 0 to 1" +msgstr "纹理坐标从 0 到 1" + + msgid "Output the handle positions relative to the corresponding control point instead of in the local space of the geometry" msgstr "输出相对对应控制点的控制柄位置,而非相对几何体局部空间的位置" @@ -120727,6 +128477,10 @@ msgid "The position of the second vertex in the edge" msgstr "边上第二个顶点的位置" +msgid "Edge Position Field" +msgstr "边位置错误" + + msgid "The surface area of each of the mesh's faces" msgstr "每个网格面的表面积" @@ -120783,6 +128537,10 @@ msgid "Total Cost" msgstr "总成本" +msgid "Tangent node" +msgstr "切线节点" + + msgid "Realized geometry is not used when pick instances is true" msgstr "当选择实例为真时,不使用已实现的几何体" @@ -121139,6 +128897,14 @@ msgid "The edge before the corner in the face, in the direction of decreasing in msgstr "在编号下降方向,面上的拐角之前的边" +msgid "Corner Next Edge" +msgstr "转角的下一边线" + + +msgid "Corner Previous Edge" +msgstr "转角的上一边线" + + msgid "Values used to sort the edges connected to the vertex. Uses indices by default" msgstr "用于对与顶点相连的边进行排序的值。默认使用编号" @@ -121223,6 +128989,10 @@ msgid "The radii of the new points" msgstr "新点的半径" +msgid "Points to generate curves from" +msgstr "生成曲线的点" + + msgid "Source Position" msgstr "源位置" @@ -121247,6 +129017,14 @@ msgid "Hit Distance" msgstr "命中距离" +msgid "Attribute does not exist: \"{}\"" +msgstr "属性不存在:\"{}\"" + + +msgid "Cannot delete built-in attribute: \"{}\"" +msgstr "无法删除内置属性:\"{}\"" + + msgid "Which element to retrieve a value from on the geometry" msgstr "从几何体上检索值的元素" @@ -121327,6 +129105,18 @@ msgid "Shade Smooth" msgstr "平滑着色" +msgid "Baked %d - %d" +msgstr "烘焙 %d - %d" + + +msgid "All geometry groups as separate instances" +msgstr "把所有几何节点组拆分为单独的实例" + + +msgid "The group ID of each group instance" +msgstr "每个组实例的组 ID" + + msgid "Delimiter" msgstr "分隔符" @@ -121352,7 +129142,7 @@ msgstr "曲线实例" msgid "Remainder" -msgstr "余数" +msgstr "其余" msgid "Edge Crease" @@ -121364,7 +129154,7 @@ msgstr "体积缩放低于 OpenVDB的允许值" msgid "Faces to consider when packing islands" -msgstr "拼排孤岛时要考虑的面。" +msgstr "拼排孤岛时要考虑的面" msgid "Rotate islands for best fit" @@ -121423,6 +129213,10 @@ msgid "Values larger than the threshold are inside the generated mesh" msgstr "大于阈值的值位于生成的网格内" +msgid "{} node" +msgstr "{}节点" + + msgid "Missing Data-Block" msgstr "缺失数据块" @@ -121451,6 +129245,10 @@ msgid "Undefined Node Tree Type" msgstr "尚未定义的节点树类型" +msgid "Addend" +msgstr "加数" + + msgid "Shader Editor" msgstr "着色器编辑器" @@ -121511,10 +129309,46 @@ msgid "Random Roughness" msgstr "随机粗糙度" +msgid "Secondary Reflection" +msgstr "二次反射" + + +msgid "Hair pigment. Specify its absolute quantity between 0 and 1" +msgstr "头发色素。指定其介于0和1之间的绝对量" + + +msgid "Additional color used for dyeing the hair" +msgstr "用于染发的附加颜色" + + +msgid "Specifies energy absorption per unit length as light passes through the hair. A higher value leads to a darker color" +msgstr "指定光穿过头发时每单位长度的能量吸收。值越高,颜色越深" + + +msgid "Hair roughness. A low value leads to a metallic look" +msgstr "头发糙度,低值会产生金属外观" + + +msgid "Vary the melanin concentration for each strand" +msgstr "改变每根线的黑色素浓度" + + +msgid "Vary roughness values for each strand" +msgstr "每条线的粗糙度值各不相同" + + +msgid "Subsurface Weight" +msgstr "次表面权重" + + msgid "Subsurface Radius" msgstr "次表面半径" +msgid "Subsurface Scale" +msgstr "次表面缩放" + + msgid "Subsurface IOR" msgstr "次表面IOR" @@ -121527,6 +129361,34 @@ msgid "Anisotropic Rotation" msgstr "各向异性旋转" +msgid "Transmission Weight" +msgstr "透射权重" + + +msgid "Coat Weight" +msgstr "涂层权重" + + +msgid "Coat Roughness" +msgstr "涂层糙度" + + +msgid "Coat IOR" +msgstr "涂层 IOR" + + +msgid "Coat Normal" +msgstr "涂层法向" + + +msgid "Sheen Weight" +msgstr "边缘光泽权重" + + +msgid "Sheen Roughness" +msgstr "边缘光泽糙度" + + msgid "Emission Color" msgstr "自发光颜色" @@ -121535,6 +129397,58 @@ msgid "Emission Strength" msgstr "自发光强度" +msgctxt "NodeTree" +msgid "Specular Tint" +msgstr "高光染色" + + +msgctxt "NodeTree" +msgid "Coat Tint" +msgstr "涂层染色" + + +msgctxt "NodeTree" +msgid "Sheen Tint" +msgstr "边缘光泽染色" + + +msgid "Blend between diffuse surface and subsurface scattering. Typically should be zero or one (either fully diffuse or subsurface)" +msgstr "漫反射表面和次表面散射之间的混合。 通常应为0或1(完全漫反射或次表面)" + + +msgid "Scattering radius to use for subsurface component (multiplied with Scale)" +msgstr "用于次表面的散射半径(乘以缩放值)" + + +msgid "Scale of the subsurface scattering (multiplied with Radius)" +msgstr "次表面散射的缩放值(乘以半径)" + + +msgid "Index of refraction used for rays that enter the subsurface component" +msgstr "用于进入次表面的光线的折射率" + + +msgid "The roughness of the coat layer" +msgstr "涂层糙度" + + +msgid "IOR Level" +msgstr "折射率等级" + + +msgctxt "NodeTree" +msgid "Tint" +msgstr "染色" + + +msgid "Subsurface" +msgstr "次表面" + + +msgid "Sheen" +msgstr "边缘光泽" + + msgid "View Vector" msgstr "视图矢量" @@ -121732,7 +129646,7 @@ msgstr "黑体强度" msgid "Blackbody Tint" -msgstr "黑体色调" +msgstr "黑体染色" msgid "Temperature Attribute" @@ -122274,6 +130188,11 @@ msgid "Platform Unsupported" msgstr "不受支持的平台" +msgctxt "WindowManager" +msgid "Your graphics card or macOS version is not supported" +msgstr "您的显卡或者macOS版本不被支持" + + msgctxt "WindowManager" msgid "Your graphics card or driver is not supported." msgstr "不支持您的显卡或驱动程序." @@ -122308,6 +130227,10 @@ msgid "Stereo 3D Mode requires the window to be fullscreen" msgstr "立体 3D 模式,要求窗口为全屏" +msgid "(Unsaved)" +msgstr "(未保存)" + + msgid "Python script uses OpenGL for drawing" msgstr "Python 脚本使用 OpenGL 进行绘图" @@ -122888,6 +130811,14 @@ msgid "Exports Freestyle's stylized edges in SVG format" msgstr "导出Freestyle的SVG格式的风格化边" +msgid "Hydra Storm render engine" +msgstr "Hydra Storm 渲染引擎" + + +msgid "USD's high performance rasterizing renderer" +msgstr "USD 的高性能光栅化渲染器" + + msgid "Blender ID authentication" msgstr "Blender ID 身份认证" @@ -122924,6 +130855,10 @@ msgid "Allows managing UI translations directly from Blender (update main .po fi msgstr "允许直接从Blender管理UI翻译(更新主 .po 文件, 更新脚本的翻译, 等等.)" +msgid "Still in development, not all features are fully implemented yet!" +msgstr "仍在开发中,并非所有功能都已完全实现!" + + msgid "All Add-ons" msgstr "全部插件" @@ -122940,6 +130875,10 @@ msgid "Add Mesh" msgstr "添加网格" +msgid "Baking" +msgstr "烘焙" + + msgid "Import-Export" msgstr "导入 - 导出" @@ -122960,6 +130899,10 @@ msgid "Japanese (日本語)" msgstr "日文 (日本語)" +msgid "Dutch (Nederlands)" +msgstr "荷兰文 (Nederlands)" + + msgid "Italian (Italiano)" msgstr "意大利文 (Italiano)" @@ -122988,6 +130931,10 @@ msgid "Catalan (Català)" msgstr "加泰罗尼亚文 (Català)" +msgid "Czech (Čeština)" +msgstr "捷克语 (Čeština)" + + msgid "Portuguese (Português)" msgstr "葡萄牙文 (Português)" @@ -123076,6 +131023,10 @@ msgid "Hebrew (תירִבְעִ)" msgstr "希伯来 (תירִבְעִ)" +msgid "Estonian (Eesti keel)" +msgstr "爱沙尼亚语 (Eestlane)" + + msgid "Esperanto (Esperanto)" msgstr "世界语 (Esperanto)" @@ -123092,6 +131043,14 @@ msgid "Uzbek Cyrillic (Ўзбек)" msgstr "乌兹别克 西里尔文 (Ўзбек)" +msgid "Hindi (हिन्दी)" +msgstr "印地语 (मानक हिन्दी)" + + +msgid "Vietnamese (Tiếng Việt)" +msgstr "越南语 (tiếng Việt)" + + msgid "Basque (Euskara)" msgstr "巴斯克语 (Euskara)" @@ -123100,6 +131059,10 @@ msgid "Hausa (Hausa)" msgstr "豪撒语 (Hausa)" +msgid "Kazakh (Қазақша)" +msgstr "哈萨克语 (қазақша)" + + msgid "Abkhaz (Аԥсуа бызшәа)" msgstr "阿伯卡茨语 (Аԥсуа бызшәа)" @@ -123116,6 +131079,18 @@ msgid "Georgian (ქართული)" msgstr "格鲁吉亚语 (ქართული)" +msgid "Tamil (தமிழ்)" +msgstr "泰米尔语 (தமிழ்)" + + +msgid "Khmer (ខ្មែរ)" +msgstr "高棉语(ខ្មែរ)" + + +msgid "Swahili (Kiswahili)" +msgstr "斯瓦希利语(Kiswahili)" + + msgid "Complete" msgstr "较完善" @@ -123128,6 +131103,370 @@ msgid "Starting" msgstr "未完善" +msgid "Generation" +msgstr "生成器" + + +msgid "Utility" +msgstr "实用工具" + + +msgid "Attach Hair Curves to Surface" +msgstr "头发曲线附着表面" + + +msgid "Attaches hair curves to a surface mesh" +msgstr "将头发曲线附着于网格物体表面" + + +msgid "Surface Geometry to attach hair curves to" +msgstr "头发曲线附加到的曲面几何体" + + +msgid "Blend Hair Curves" +msgstr "弯曲头发曲线" + + +msgid "Braid Hair Curves" +msgstr "编织头发曲线" + + +msgid "Deforms existing hair curves into braids using guide curves" +msgstr "使用引导曲线将现有头发曲线变形为辫子" + + +msgid "Thickness of each strand of hair" +msgstr "每条头发的粗细" + + +msgid "Hair Tie" +msgstr "发圈" + + +msgid "Geometry used for the hair tie instance (priority)" +msgstr "用于头发扎带实例的几何体(优先级)" + + +msgid "Object used for the hair tie instance" +msgstr "用于发圈实例的对象" + + +msgid "Hair Tie Scale" +msgstr "发圈缩放" + + +msgid "Scale of the hair tie instance" +msgstr "发圈实例的缩放" + + +msgid "Clump Hair Curves" +msgstr "束发曲线" + + +msgid "Curl Hair Curves" +msgstr "卷发曲线" + + +msgid "Deforms existing hair curves into curls using guide curves" +msgstr "使用引导曲线将现有头发曲线变形为卷发" + + +msgid "Curve Info" +msgstr "曲线信息" + + +msgid "Surface UV" +msgstr "表面UV 贴图" + + +msgid "Segment Length" +msgstr "每段长度" + + +msgid "Displace Hair Curves" +msgstr "置换毛发曲线" + + +msgid "Displaces hair curves by a vector based on various options" +msgstr "基于各种选项通过向量置换头发曲线" + + +msgid "Duplicate Hair Curves" +msgstr "复制毛发曲线" + + +msgid "Offset Vector" +msgstr "偏移向量" + + +msgid "Generate Hair Curves" +msgstr "生成头发曲线" + + +msgid "Generates new hair curves on a surface mesh" +msgstr "在曲面网格上生成新的头发曲线" + + +msgid "Length of the generated hair curves" +msgstr "生成的头发曲线的长度" + + +msgid "Hair Material" +msgstr "头发材质" + + +msgid "Material of the generated hair curves" +msgstr "生成毛发曲线的材质" + + +msgid "Amount of control points of the generated hair curves" +msgstr "生成的毛发曲线的控制点数量" + + +msgid "Poisson Disk Distribution" +msgstr "泊松盘分布" + + +msgid "Surface density of generated hair curves" +msgstr "生成的头发曲线的表面密度" + + +msgid "Hair Attachment Info" +msgstr "头发附加信息" + + +msgid "Attachment UV" +msgstr "附加UV" + + +msgid "Surface attachment UV coordinate stored on each curve" +msgstr "存储在每条曲线上的曲面UV坐标" + + +msgid "Attachment is Valid" +msgstr "附加无效" + + +msgid "Deforms hair curves using a noise texture" +msgstr "使用噪波纹理变形头发曲线" + + +msgid "Scale along Curve" +msgstr "沿曲线缩放" + + +msgid "Follow Surface Normal" +msgstr "沿曲面法线方向" + + +msgid "Redistribute Curve Points" +msgstr "重新分布曲线点" + + +msgid "Redistributes existing control points evenly along each curve" +msgstr "沿每条曲线均匀地重新分布现有控制点" + + +msgid "Restore Curve Segment Length" +msgstr "恢复曲线段长度" + + +msgid "Only affect selected elements" +msgstr "仅影响选择元素部分" + + +msgid "Roll Hair Curves" +msgstr "卷曲头发曲线" + + +msgid "Rolls up hair curves starting from their tips" +msgstr "从发尖开始卷起头发曲线" + + +msgid "Roll Direction" +msgstr "旋转方向" + + +msgid "Axis around which each curve is rolled" +msgstr "每条曲线的旋转轴" + + +msgid "Rotate Hair Curves" +msgstr "旋转毛发曲线" + + +msgid "Rotates each hair curve around an axis" +msgstr "沿特定轴旋转每条毛发曲线" + + +msgid "Factor to influence the rotation angle" +msgstr "旋转角度系数" + + +msgid "Rotation Axis (Default: Tangent at root)" +msgstr "旋转轴(默认为发根的切线方向)" + + +msgid "Random offset to the rotation angle per Curve" +msgstr "每条曲线旋转角度的随机偏移量" + + +msgid "Lock Ends" +msgstr "锁定发稍" + + +msgid "Lock rotation to the axis between the curve ends" +msgstr "将旋转锁定在曲线两端之间的轴线上" + + +msgid "Sets the radius attribute of hair curves according to a profile shape" +msgstr "根据轮廓形状设置头发曲线的半径" + + +msgid "Replace Radius" +msgstr "替换半径" + + +msgid "Replace the original radius" +msgstr "替换原始半径" + + +msgid "Base radius to be set if 'Replace Radius' is enabled" +msgstr "若启用【替换半径】,需设置基准半径" + + +msgid "Shape of the radius along the curve" +msgstr "沿曲线半径的形状" + + +msgid "Factor of the radius at the minimum" +msgstr "最小半径系数" + + +msgid "Factor of the radius at the maximum" +msgstr "最大半径系数" + + +msgid "Shrinkwrap Hair Curves" +msgstr "收缩包裹毛发曲线" + + +msgid "Surface geometry used for shrinkwrap" +msgstr "用于缩裹的表面几何体" + + +msgid "Surface object used for shrinkwrap" +msgstr "用于收缩包裹的表面对象" + + +msgid "Offset Distance" +msgstr "偏移距离" + + +msgid "Distance from the surface used for shrinkwrap" +msgstr "与收缩膜表面的距离" + + +msgid "Blend shrinkwrap for points above the surface" +msgstr "混合缩裹表面上的点" + + +msgid "Smoothing Steps" +msgstr "平滑步数" + + +msgid "Amount of steps of smoothing applied after shwrinkwrap" +msgstr "缩裹后应用的平滑步数" + + +msgid "Lock Roots" +msgstr "锁定发根" + + +msgid "Lock the position of root points" +msgstr "锁定发根点位置" + + +msgid "Smooth Hair Curves" +msgstr "平滑头发曲线" + + +msgid "Smoothes the shape of hair curves" +msgstr "平滑头发曲线的形状" + + +msgid "Amount of smoothing" +msgstr "平滑量" + + +msgid "Amount of smoothing steps" +msgstr "平滑步数" + + +msgid "Weight used for smoothing" +msgstr "用于平滑的权重" + + +msgid "Lock tip position when smoothing" +msgstr "平滑时锁定尖端位置" + + +msgid "Straighten Hair Curves" +msgstr "拉直头发曲线" + + +msgid "Straightens hair curves between root and tip" +msgstr "拉直发根和发梢之间的头发曲线" + + +msgid "Amount of straightening" +msgstr "拉直量" + + +msgid "Trim Hair Curves" +msgstr "修剪头发曲线" + + msgid "Trims or scales hair curves to a certain length" msgstr "将毛发曲线修剪或缩放至一定长度" + +msgid "Scale each curve uniformly to reach the target length" +msgstr "均匀缩放每条曲线到特定长度" + + +msgid "Multiply the original length by a factor" +msgstr "将原始长度乘以一个系数" + + +msgid "Replace Length" +msgstr "替换长度" + + +msgid "Use the length input to fully replace the original length" +msgstr "使用输入的长度完全替换原始长度" + + +msgid "Target length for the operation" +msgstr "目标长度" + + +msgid "Mask to blend overall effect" +msgstr "整体效果遮罩" + + +msgid "Trim hair curves randomly up to a certain amount" +msgstr "将头发曲线随机修剪到一定数量" + + +msgid "Smooth by Angle" +msgstr "通过角度平滑" + + +msgid "Maximum face angle for smooth edges" +msgstr "平滑边的最大面角度" + + +msgid "Ignore Sharpness" +msgstr "忽略锐度" + diff --git a/locale/po/zh_HANT.po b/locale/po/zh_HANT.po index ef9a5b900c0..7c57a280824 100644 --- a/locale/po/zh_HANT.po +++ b/locale/po/zh_HANT.po @@ -1,11 +1,11 @@ msgid "" msgstr "" -"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n" +"Project-Id-Version: Blender 4.1.0 Alpha (b'274dc815eb35')\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-04 11:06:00\n" -"PO-Revision-Date: 2023-11-23 11:54+0000\n" -"Last-Translator: 楊 景貴 \n" +"POT-Creation-Date: 2023-12-11 11:18:04\n" +"PO-Revision-Date: 2023-12-10 08:57+0000\n" +"Last-Translator: luxem \n" "Language-Team: Chinese (Traditional) \n" "Language: zh_HANT\n" "MIME-Version: 1.0\n" @@ -204,7 +204,7 @@ msgstr "靜音" msgid "Action group is muted" -msgstr "動作群組已靜音" +msgstr "動作群組已被靜音" msgid "Select" @@ -312,13 +312,17 @@ msgstr "用於計算的裝置 (以 Cycles 算繪)" msgid "Kernel Optimization" -msgstr "內核心最佳化" +msgstr "操作核心優化" msgid "Off" msgstr "關" +msgid "Disable kernel optimization. Slowest rendering, no extra background CPU usage" +msgstr "停用核心優化。最慢的渲染,不增加額外的後台CPU使用。" + + msgid "Full" msgstr "完整" @@ -9618,6 +9622,18 @@ msgid "Whether this path is saved in bookmarks, or generated from OS" msgstr "此路徑是否儲存於書籤、或是從作業系統生成" +msgid "File Extensions" +msgstr "副檔名" + + +msgid "Operator" +msgstr "操作器" + + +msgid "Label" +msgstr "標籤" + + msgid "Icon ID" msgstr "圖示 ID" @@ -14653,10 +14669,6 @@ msgid "Node tree consisting of linked nodes used for shading, textures and compo msgstr "由連結的節點組成的節點樹,用於著色、紋理、合成" -msgid "Label" -msgstr "標籤" - - msgid "The node tree label" msgstr "節點樹標籤" @@ -32435,10 +32447,6 @@ msgid "Reverse Colors" msgstr "反轉色彩" -msgid "Flip direction of vertex colors inside faces" -msgstr "翻轉面內部的底點色彩方向" - - msgctxt "Operator" msgid "Rotate Colors" msgstr "旋轉色彩" @@ -39089,10 +39097,6 @@ msgid "Cavity (Inverted)" msgstr "坑腔 ( 反轉 )" -msgid "Operator" -msgstr "操作器" - - msgid "Relax Face Sets" msgstr "放鬆面集" @@ -43205,10 +43209,6 @@ msgid "Palette Color" msgstr "色版色彩" -msgid "Refraction" -msgstr "折射" - - msgid "Integrator Presets" msgstr "整合器預置" @@ -46925,10 +46925,6 @@ msgid "Process the render result through the compositing pipeline, if compositin msgstr "如果有啟用合成節點的話,透過合成導管處理算繪結果" -msgid "File Extensions" -msgstr "副檔名" - - msgid "Add the file format extensions to the rendered file name (eg: filename + .jpg)" msgstr "為算繪的檔案添加副檔名 (例如:檔案名稱 + .jpg)" @@ -47601,14 +47597,6 @@ msgid "Factor for ambient occlusion blending" msgstr "周遭遮擋其混合的係數" -msgid "Refraction Trace Options" -msgstr "折射追蹤選項" - - -msgid "EEVEE settings for tracing refractions" -msgstr "EEVEE 中用於追蹤折射的設定" - - msgid "Screen Space Refractions" msgstr "螢幕空間折射" @@ -52379,8 +52367,8 @@ msgid "Display vertex-per-face normals as lines" msgstr "將每面頂點的法線以線條顯示" -msgid "Stat Vis" -msgstr "統計顯示" +msgid "Mesh Analysis" +msgstr "網格分析" msgid "Display statistical information about the mesh" @@ -53817,6 +53805,10 @@ msgid "Auto-Step" msgstr "自動步進" +msgid "Refraction" +msgstr "折射" + + msgid "Paths:" msgstr "路徑:" @@ -55149,16 +55141,6 @@ msgid "Extract Face Set" msgstr "擷取面集" -msgctxt "Operator" -msgid "Invert Visible Face Sets" -msgstr "反轉可見面集" - - -msgctxt "Operator" -msgid "Show All Face Sets" -msgstr "顯示所有面集" - - msgctxt "Operator" msgid "Randomize Colors" msgstr "亂數重設面集色彩" @@ -55296,10 +55278,6 @@ msgid "Seams" msgstr "縫線" -msgid "Mesh Analysis" -msgstr "網格分析" - - msgid "Edge Marks" msgstr "邊線標記" @@ -58423,6 +58401,10 @@ msgid "File '%s' could not be loaded" msgstr "無法載入檔案「%s」" +msgid "Please select all related strips" +msgstr "請選取所有相關的片段" + + msgid "Cannot apply effects to audio sequence strips" msgstr "無法將效果套用至音訊序段片段" @@ -58447,10 +58429,6 @@ msgid "No valid inputs to swap" msgstr "無有效輸入可供交換" -msgid "Please select all related strips" -msgstr "請選取所有相關的片段" - - msgid "Please select two strips" msgstr "請選取兩個片段" diff --git a/release/datafiles/preview_grease_pencil.blend b/release/datafiles/preview_grease_pencil.blend index 46c90d8af08..2c0494eb28c 100644 Binary files a/release/datafiles/preview_grease_pencil.blend and b/release/datafiles/preview_grease_pencil.blend differ diff --git a/release/datafiles/preview_grease_pencil_legacy.blend b/release/datafiles/preview_grease_pencil_legacy.blend new file mode 100644 index 00000000000..46c90d8af08 Binary files /dev/null and b/release/datafiles/preview_grease_pencil_legacy.blend differ diff --git a/release/datafiles/userdef/userdef_default.c b/release/datafiles/userdef/userdef_default.c index 1cc3e7c59cb..2fd273fa29f 100644 --- a/release/datafiles/userdef/userdef_default.c +++ b/release/datafiles/userdef/userdef_default.c @@ -165,7 +165,8 @@ const UserDef U_default = { .glalphaclip = 0.004, .autokey_mode = (AUTOKEY_MODE_NORMAL & ~AUTOKEY_ON), .autokey_flag = AUTOKEY_FLAG_XYZ2RGB, - .key_insert_channels = USER_ANIM_KEY_CHANNEL_LOCATION, + .key_insert_channels = (USER_ANIM_KEY_CHANNEL_LOCATION | USER_ANIM_KEY_CHANNEL_ROTATION | + USER_ANIM_KEY_CHANNEL_SCALE | USER_ANIM_KEY_CHANNEL_CUSTOM_PROPERTIES), .animation_flag = USER_ANIM_HIGH_QUALITY_DRAWING, .text_render = 0, .navigation_mode = VIEW_NAVIGATION_WALK, diff --git a/release/license/MPL-2.0.txt b/release/license/MPL-2.0.txt new file mode 100644 index 00000000000..a612ad9813b --- /dev/null +++ b/release/license/MPL-2.0.txt @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/scripts/modules/bl_i18n_utils/settings.py b/scripts/modules/bl_i18n_utils/settings.py index 605fe38553d..a207584ecf2 100644 --- a/scripts/modules/bl_i18n_utils/settings.py +++ b/scripts/modules/bl_i18n_utils/settings.py @@ -105,7 +105,7 @@ IMPORT_MIN_LEVEL = 0.0 # Languages in the working repository that should not be imported in the Blender one currently... IMPORT_LANGUAGES_SKIP = { - 'am_ET', 'et_EE', 'ro_RO', 'uz_UZ@latin', 'uz_UZ@cyrillic', 'kk_KZ', 'be', + 'am_ET', 'et_EE', 'ro_RO', 'uz_UZ@latin', 'uz_UZ@cyrillic', 'kk_KZ', } # Languages that need RTL pre-processing. diff --git a/scripts/presets/keyconfig/keymap_data/blender_default.py b/scripts/presets/keyconfig/keymap_data/blender_default.py index ebd478ea9e2..c1514c6d649 100644 --- a/scripts/presets/keyconfig/keymap_data/blender_default.py +++ b/scripts/presets/keyconfig/keymap_data/blender_default.py @@ -6075,8 +6075,7 @@ def km_edit_curves(params): ("curves.set_selection_domain", {"type": 'ONE', "value": 'PRESS'}, {"properties": [("domain", 'POINT')]}), ("curves.set_selection_domain", {"type": 'TWO', "value": 'PRESS'}, {"properties": [("domain", 'CURVE')]}), - ("curves.disable_selection", {"type": 'ONE', "value": 'PRESS', "alt": True}, None), - ("curves.disable_selection", {"type": 'TWO', "value": 'PRESS', "alt": True}, None), + ("curves.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None), *_template_items_select_actions(params, "curves.select_all"), ("curves.select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None), ("curves.delete", {"type": 'X', "value": 'PRESS'}, None), @@ -7725,6 +7724,18 @@ def km_3d_view_tool_edit_curve_draw(params): ) +def km_3d_view_tool_edit_curves_draw(params): + return ( + "3D View Tool: Edit Curves, Draw", + {"space_type": 'VIEW_3D', "region_type": 'WINDOW'}, + {"items": [ + # No need for `tool_modifier` since this takes all input. + ("curves.draw", {"type": params.tool_mouse, "value": 'PRESS'}, + {"properties": [("wait_for_input", False)]}), + ]}, + ) + + def km_3d_view_tool_edit_curve_pen(params): return ( "3D View Tool: Edit Curve, Curve Pen", @@ -8666,6 +8677,7 @@ def generate_keymaps(params=None): km_3d_view_tool_edit_curve_randomize(params), km_3d_view_tool_edit_curve_extrude(params), km_3d_view_tool_edit_curve_extrude_to_cursor(params), + km_3d_view_tool_edit_curves_draw(params), km_3d_view_tool_sculpt_box_hide(params), km_3d_view_tool_sculpt_box_mask(params), km_3d_view_tool_sculpt_lasso_mask(params), diff --git a/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py b/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py index 7ac0e506ff6..bd6a971b934 100644 --- a/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py +++ b/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py @@ -4117,8 +4117,7 @@ def km_curves(params): # Selection Modes ("curves.set_selection_domain", {"type": 'ONE', "value": 'PRESS'}, {"properties": [("domain", 'POINT')]}), ("curves.set_selection_domain", {"type": 'TWO', "value": 'PRESS'}, {"properties": [("domain", 'CURVE')]}), - ("curves.disable_selection", {"type": 'ONE', "value": 'PRESS', "alt": True}, None), - ("curves.disable_selection", {"type": 'TWO', "value": 'PRESS', "alt": True}, None), + ("curves.duplicate_move", {"type": 'D', "value": 'PRESS', "ctrl": True}, None), # Selection Operators ("curves.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'SELECT')]}), ("curves.select_all", {"type": 'A', "value": 'PRESS', "shift": True, diff --git a/scripts/startup/bl_operators/anim.py b/scripts/startup/bl_operators/anim.py index 8e2c4052b93..6156a96761b 100644 --- a/scripts/startup/bl_operators/anim.py +++ b/scripts/startup/bl_operators/anim.py @@ -201,7 +201,7 @@ class NLA_OT_bake(Operator): ) step: IntProperty( name="Frame Step", - description="Frame Step", + description="Number of frames to skip forward while baking each frame", min=1, max=120, default=1, ) @@ -254,7 +254,7 @@ class NLA_OT_bake(Operator): ('LOCATION', "Location", "Bake location channels"), ('ROTATION', "Rotation", "Bake rotation channels"), ('SCALE', "Scale", "Bake scale channels"), - ('BBONE', "B-Bone", "Bake b-bone channels"), + ('BBONE', "B-Bone", "Bake B-Bone channels"), ), default={'LOCATION', 'ROTATION', 'SCALE', 'BBONE'}, ) diff --git a/scripts/startup/bl_operators/userpref.py b/scripts/startup/bl_operators/userpref.py index 58827bb1a43..2c22fce602c 100644 --- a/scripts/startup/bl_operators/userpref.py +++ b/scripts/startup/bl_operators/userpref.py @@ -1099,13 +1099,9 @@ class PREFERENCES_OT_studiolight_uninstall(Operator): prefs = context.preferences for studio_light in prefs.studio_lights: if studio_light.index == self.index: - for filepath in ( - studio_light.path, - studio_light.path_irr_cache, - studio_light.path_sh_cache, - ): - if filepath and os.path.exists(filepath): - os.unlink(filepath) + filepath = studio_light.path + if filepath and os.path.exists(filepath): + os.unlink(filepath) prefs.studio_lights.remove(studio_light) return {'FINISHED'} return {'CANCELLED'} diff --git a/scripts/startup/bl_ui/node_add_menu_geometry.py b/scripts/startup/bl_ui/node_add_menu_geometry.py index 0c3a73ea7da..1647997580b 100644 --- a/scripts/startup/bl_ui/node_add_menu_geometry.py +++ b/scripts/startup/bl_ui/node_add_menu_geometry.py @@ -33,6 +33,7 @@ class NODE_MT_geometry_node_GEO_COLOR(Menu): def draw(self, _context): layout = self.layout + node_add_menu.add_node_type(layout, "ShaderNodeBlackbody") node_add_menu.add_node_type(layout, "ShaderNodeValToRGB") node_add_menu.add_node_type(layout, "ShaderNodeRGBCurve") layout.separator() @@ -283,6 +284,7 @@ class NODE_MT_geometry_node_GEO_INPUT_SCENE(Menu): layout = self.layout if context.space_data.geometry_nodes_type == 'TOOL': node_add_menu.add_node_type(layout, "GeometryNodeTool3DCursor") + node_add_menu.add_node_type(layout, "GeometryNodeInputActiveCamera") node_add_menu.add_node_type(layout, "GeometryNodeCollectionInfo") node_add_menu.add_node_type(layout, "GeometryNodeImageInfo") node_add_menu.add_node_type(layout, "GeometryNodeIsViewport") diff --git a/scripts/startup/bl_ui/properties_render.py b/scripts/startup/bl_ui/properties_render.py index 6894aed785c..61a6aef84af 100644 --- a/scripts/startup/bl_ui/properties_render.py +++ b/scripts/startup/bl_ui/properties_render.py @@ -467,7 +467,7 @@ class RENDER_PT_eevee_next_volumes(RenderButtonsPanel, Panel): class RENDER_PT_eevee_next_volumes_lighting(RenderButtonsPanel, Panel): - bl_label = "Volumes Lighting" + bl_label = "Volume Lighting" bl_parent_id = "RENDER_PT_eevee_next_volumes" COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'} @@ -482,7 +482,7 @@ class RENDER_PT_eevee_next_volumes_lighting(RenderButtonsPanel, Panel): class RENDER_PT_eevee_next_volumes_shadows(RenderButtonsPanel, Panel): - bl_label = "Volumes Shadows" + bl_label = "Volume Shadows" bl_parent_id = "RENDER_PT_eevee_next_volumes" COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'} @@ -572,11 +572,36 @@ class RENDER_PT_eevee_next_raytracing(RenderButtonsPanel, Panel): props = scene.eevee layout.prop(props, "ray_tracing_method", text="Method") - layout.prop(props, "ray_split_settings", text="Settings", expand=True) + + options = context.scene.eevee.ray_tracing_options + + layout.prop(options, "resolution_scale") + layout.prop(options, "sample_clamp") -class EeveeRaytracingOptionsPanel(RenderButtonsPanel, Panel): - bl_label = "Reflection" +class RENDER_PT_eevee_next_screen_trace(RenderButtonsPanel, Panel): + bl_label = "Screen Tracing" + bl_options = {'DEFAULT_CLOSED'} + bl_parent_id = "RENDER_PT_eevee_next_raytracing" + COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'} + + @classmethod + def poll(cls, context): + use_screen_trace = (context.scene.eevee.ray_tracing_method == 'SCREEN') + return (context.engine in cls.COMPAT_ENGINES) and use_screen_trace + + def draw(self, context): + layout = self.layout + layout.use_property_split = True + props = context.scene.eevee.ray_tracing_options + + layout.prop(props, "screen_trace_quality", text="Precision") + layout.prop(props, "screen_trace_thickness", text="Thickness") + layout.prop(props, "screen_trace_max_roughness", text="Max Roughness") + + +class RENDER_PT_eevee_next_denoise(RenderButtonsPanel, Panel): + bl_label = "Denoising" bl_options = {'DEFAULT_CLOSED'} bl_parent_id = "RENDER_PT_eevee_next_raytracing" COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'} @@ -585,48 +610,14 @@ class EeveeRaytracingOptionsPanel(RenderButtonsPanel, Panel): def poll(cls, context): return (context.engine in cls.COMPAT_ENGINES) - def draw_internal(self, context, props): - layout = self.layout - layout.use_property_split = True - - layout.prop(props, "resolution_scale") - layout.prop(props, "sample_clamp") - - -class EeveeRaytracingScreenOption(RenderButtonsPanel, Panel): - bl_label = "Screen Tracing" - bl_options = {'DEFAULT_CLOSED'} - COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'} - - @classmethod - def poll(cls, context): - use_screen_trace = (context.scene.eevee.ray_tracing_method == 'SCREEN') - return (context.engine in cls.COMPAT_ENGINES) and use_screen_trace - - def draw_internal(self, props): - layout = self.layout - layout.use_property_split = True - - layout.prop(props, "screen_trace_quality", text="Precision") - layout.prop(props, "screen_trace_thickness", text="Thickness") - layout.prop(props, "screen_trace_max_roughness", text="Max Roughness") - - -class EeveeRaytracingDenoisePanel(RenderButtonsPanel, Panel): - bl_label = "Denoising" - bl_options = {'DEFAULT_CLOSED'} - COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'} - - @classmethod - def poll(cls, context): - return (context.engine in cls.COMPAT_ENGINES) - - def draw_header_internal(self, props): + def draw_header(self, context): + props = context.scene.eevee.ray_tracing_options self.layout.prop(props, "use_denoise", text="") - def draw_internal(self, props): + def draw(self, context): layout = self.layout layout.use_property_split = True + props = context.scene.eevee.ray_tracing_options col = layout.column() col.active = props.use_denoise @@ -641,97 +632,6 @@ class EeveeRaytracingDenoisePanel(RenderButtonsPanel, Panel): col.prop(props, "denoise_bilateral") -class RENDER_PT_eevee_next_raytracing_reflection(EeveeRaytracingOptionsPanel): - # NOTE: Label is drawn by draw_header - bl_label = "" - bl_parent_id = "RENDER_PT_eevee_next_raytracing" - - def draw_header(self, context): - layout = self.layout - if context.scene.eevee.ray_split_settings == 'UNIFIED': - layout.label(text="Reflection / Refraction / Diffuse") - else: - layout.label(text="Reflection") - - def draw(self, context): - self.draw_internal(context, context.scene.eevee.reflection_options) - - -class RENDER_PT_eevee_next_screen_trace_reflection(EeveeRaytracingScreenOption): - bl_parent_id = "RENDER_PT_eevee_next_raytracing_reflection" - - def draw(self, context): - self.draw_internal(context.scene.eevee.reflection_options) - - -class RENDER_PT_eevee_next_denoise_reflection(EeveeRaytracingDenoisePanel): - bl_parent_id = "RENDER_PT_eevee_next_raytracing_reflection" - - def draw_header(self, context): - self.draw_header_internal(context.scene.eevee.reflection_options) - - def draw(self, context): - self.draw_internal(context.scene.eevee.reflection_options) - - -class RENDER_PT_eevee_next_raytracing_refraction(EeveeRaytracingOptionsPanel): - bl_label = "Refraction" - bl_parent_id = "RENDER_PT_eevee_next_raytracing" - - @classmethod - def poll(cls, context): - return (context.scene.eevee.ray_split_settings == 'SPLIT') - - def draw(self, context): - self.draw_internal(context, context.scene.eevee.refraction_options) - - -class RENDER_PT_eevee_next_screen_trace_refraction(EeveeRaytracingScreenOption): - bl_parent_id = "RENDER_PT_eevee_next_raytracing_refraction" - - def draw(self, context): - self.draw_internal(context.scene.eevee.refraction_options) - - -class RENDER_PT_eevee_next_denoise_refraction(EeveeRaytracingDenoisePanel): - bl_parent_id = "RENDER_PT_eevee_next_raytracing_refraction" - - def draw_header(self, context): - self.draw_header_internal(context.scene.eevee.refraction_options) - - def draw(self, context): - self.draw_internal(context.scene.eevee.refraction_options) - - -class RENDER_PT_eevee_next_raytracing_diffuse(EeveeRaytracingOptionsPanel): - bl_label = "Diffuse" - bl_parent_id = "RENDER_PT_eevee_next_raytracing" - - @classmethod - def poll(cls, context): - return (context.scene.eevee.ray_split_settings == 'SPLIT') - - def draw(self, context): - self.draw_internal(context, context.scene.eevee.diffuse_options) - - -class RENDER_PT_eevee_next_screen_trace_diffuse(EeveeRaytracingScreenOption): - bl_parent_id = "RENDER_PT_eevee_next_raytracing_diffuse" - - def draw(self, context): - self.draw_internal(context.scene.eevee.diffuse_options) - - -class RENDER_PT_eevee_next_denoise_diffuse(EeveeRaytracingDenoisePanel): - bl_parent_id = "RENDER_PT_eevee_next_raytracing_diffuse" - - def draw_header(self, context): - self.draw_header_internal(context.scene.eevee.diffuse_options) - - def draw(self, context): - self.draw_internal(context.scene.eevee.diffuse_options) - - class RENDER_PT_eevee_shadows(RenderButtonsPanel, Panel): bl_label = "Shadows" bl_options = {'DEFAULT_CLOSED'} @@ -1262,6 +1162,9 @@ class RENDER_PT_simplify_viewport(RenderButtonsPanel, Panel): col = flow.column() col.prop(rd, "simplify_shadows", text="Shadow Resolution") + col = flow.column() + col.prop(rd, "use_simplify_normals", text="Normals") + class RENDER_PT_simplify_render(RenderButtonsPanel, Panel): bl_label = "Render" @@ -1341,15 +1244,8 @@ classes = ( RENDER_PT_eevee_screen_space_reflections, RENDER_PT_eevee_next_horizon_scan, RENDER_PT_eevee_next_raytracing, - RENDER_PT_eevee_next_raytracing_reflection, - RENDER_PT_eevee_next_raytracing_refraction, - RENDER_PT_eevee_next_raytracing_diffuse, - RENDER_PT_eevee_next_screen_trace_reflection, - RENDER_PT_eevee_next_screen_trace_refraction, - RENDER_PT_eevee_next_screen_trace_diffuse, - RENDER_PT_eevee_next_denoise_reflection, - RENDER_PT_eevee_next_denoise_refraction, - RENDER_PT_eevee_next_denoise_diffuse, + RENDER_PT_eevee_next_screen_trace, + RENDER_PT_eevee_next_denoise, RENDER_PT_eevee_motion_blur, RENDER_PT_eevee_volumetric, RENDER_PT_eevee_volumetric_lighting, diff --git a/scripts/startup/bl_ui/space_dopesheet.py b/scripts/startup/bl_ui/space_dopesheet.py index ef102f9dd47..253814c9881 100644 --- a/scripts/startup/bl_ui/space_dopesheet.py +++ b/scripts/startup/bl_ui/space_dopesheet.py @@ -732,7 +732,7 @@ class DOPESHEET_MT_context_menu(Menu): class DOPESHEET_MT_channel_context_menu(Menu): - bl_label = "Dope Sheet Channel" + bl_label = "Channel" def draw(self, context): layout = self.layout diff --git a/scripts/startup/bl_ui/space_graph.py b/scripts/startup/bl_ui/space_graph.py index 21c0c1c5e12..1334550b752 100644 --- a/scripts/startup/bl_ui/space_graph.py +++ b/scripts/startup/bl_ui/space_graph.py @@ -295,6 +295,7 @@ class GRAPH_MT_channel(Menu): layout.operator("graph.keys_to_samples") layout.operator("graph.samples_to_keys") layout.operator("graph.sound_to_samples") + layout.operator("anim.channels_bake") layout.separator() layout.operator("graph.euler_filter", text="Discontinuity (Euler) Filter") diff --git a/scripts/startup/bl_ui/space_image.py b/scripts/startup/bl_ui/space_image.py index d4800885298..4658fdd0857 100644 --- a/scripts/startup/bl_ui/space_image.py +++ b/scripts/startup/bl_ui/space_image.py @@ -754,7 +754,10 @@ class IMAGE_HT_header(Header): # Snap. snap_uv_element = tool_settings.snap_uv_element - act_snap_uv_element = tool_settings.bl_rna.properties["snap_uv_element"].enum_items[snap_uv_element] + try: + act_snap_icon = tool_settings.bl_rna.properties["snap_uv_element"].enum_items[snap_uv_element].icon + except KeyError: + act_snap_icon = 'NONE' row = layout.row(align=True) row.prop(tool_settings, "use_snap_uv", text="") @@ -762,7 +765,7 @@ class IMAGE_HT_header(Header): sub = row.row(align=True) sub.popover( panel="IMAGE_PT_snapping", - icon=act_snap_uv_element.icon, + icon=act_snap_icon, text="", ) diff --git a/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/scripts/startup/bl_ui/space_toolsystem_toolbar.py index a3ff89dd900..c12ef7336cd 100644 --- a/scripts/startup/bl_ui/space_toolsystem_toolbar.py +++ b/scripts/startup/bl_ui/space_toolsystem_toolbar.py @@ -1148,65 +1148,66 @@ class _defs_edit_mesh: ) +def curve_draw_settings(context, layout, _tool, *, extra=False): + # Tool settings initialize operator options. + tool_settings = context.tool_settings + cps = tool_settings.curve_paint_settings + region_type = context.region.type + + if region_type == 'TOOL_HEADER': + if not extra: + layout.prop(cps, "curve_type", text="") + layout.prop(cps, "depth_mode", expand=True) + layout.popover("TOPBAR_PT_tool_settings_extra", text="...") + return + + layout.use_property_split = True + layout.use_property_decorate = False + + if region_type != 'TOOL_HEADER': + layout.prop(cps, "curve_type") + layout.separator() + if cps.curve_type == 'BEZIER': + layout.prop(cps, "fit_method") + layout.prop(cps, "error_threshold") + if region_type != 'TOOL_HEADER': + row = layout.row(heading="Detect Corners", align=True) + else: + row = layout.row(heading="Corners", align=True) + row.prop(cps, "use_corners_detect", text="") + sub = row.row(align=True) + sub.active = cps.use_corners_detect + sub.prop(cps, "corner_angle", text="") + layout.separator() + + col = layout.column(align=True) + col.prop(cps, "radius_taper_start", text="Taper Start", slider=True) + col.prop(cps, "radius_taper_end", text="End", slider=True) + col = layout.column(align=True) + col.prop(cps, "radius_min", text="Radius Min") + col.prop(cps, "radius_max", text="Max") + col.prop(cps, "use_pressure_radius") + + if region_type != 'TOOL_HEADER' or cps.depth_mode == 'SURFACE': + layout.separator() + + if region_type != 'TOOL_HEADER': + row = layout.row() + row.prop(cps, "depth_mode", expand=True) + if cps.depth_mode == 'SURFACE': + col = layout.column() + col.prop(cps, "surface_offset") + col.prop(cps, "use_offset_absolute") + col.prop(cps, "use_stroke_endpoints") + if cps.use_stroke_endpoints: + colsub = layout.column(align=True) + colsub.prop(cps, "surface_plane") + + class _defs_edit_curve: @ToolDef.from_fn def draw(): - def draw_settings(context, layout, _tool, *, extra=False): - # Tool settings initialize operator options. - tool_settings = context.tool_settings - cps = tool_settings.curve_paint_settings - region_type = context.region.type - - if region_type == 'TOOL_HEADER': - if not extra: - layout.prop(cps, "curve_type", text="") - layout.prop(cps, "depth_mode", expand=True) - layout.popover("TOPBAR_PT_tool_settings_extra", text="...") - return - - layout.use_property_split = True - layout.use_property_decorate = False - - if region_type != 'TOOL_HEADER': - layout.prop(cps, "curve_type") - layout.separator() - if cps.curve_type == 'BEZIER': - layout.prop(cps, "fit_method") - layout.prop(cps, "error_threshold") - if region_type != 'TOOL_HEADER': - row = layout.row(heading="Detect Corners", align=True) - else: - row = layout.row(heading="Corners", align=True) - row.prop(cps, "use_corners_detect", text="") - sub = row.row(align=True) - sub.active = cps.use_corners_detect - sub.prop(cps, "corner_angle", text="") - layout.separator() - - col = layout.column(align=True) - col.prop(cps, "radius_taper_start", text="Taper Start", slider=True) - col.prop(cps, "radius_taper_end", text="End", slider=True) - col = layout.column(align=True) - col.prop(cps, "radius_min", text="Radius Min") - col.prop(cps, "radius_max", text="Max") - col.prop(cps, "use_pressure_radius") - - if region_type != 'TOOL_HEADER' or cps.depth_mode == 'SURFACE': - layout.separator() - - if region_type != 'TOOL_HEADER': - row = layout.row() - row.prop(cps, "depth_mode", expand=True) - if cps.depth_mode == 'SURFACE': - col = layout.column() - col.prop(cps, "surface_offset") - col.prop(cps, "use_offset_absolute") - col.prop(cps, "use_stroke_endpoints") - if cps.use_stroke_endpoints: - colsub = layout.column(align=True) - colsub.prop(cps, "surface_plane") - return dict( idname="builtin.draw", label="Draw", @@ -1214,7 +1215,7 @@ class _defs_edit_curve: icon="ops.curve.draw", widget=None, keymap=(), - draw_settings=draw_settings, + draw_settings=curve_draw_settings, ) @ToolDef.from_fn @@ -1295,6 +1296,29 @@ class _defs_edit_curve: ) +class _defs_edit_curves: + + @ToolDef.from_fn + def draw(): + def curve_draw(context, layout, tool, *, extra=False): + curve_draw_settings(context, layout, tool, extra=extra) + + if extra: + props = tool.operator_properties("curves.draw") + col = layout.column(align=True) + col.prop(props, "is_curve_2d", text="Curve 2D") + + return dict( + idname="builtin.draw", + label="Draw", + cursor='PAINT_BRUSH', + icon="ops.curve.draw", + widget=None, + keymap=(), + draw_settings=curve_draw, + ) + + class _defs_edit_text: @ToolDef.from_fn @@ -3003,6 +3027,7 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel): *_tools_default, None, _defs_edit_curve.curve_radius, + _defs_edit_curves.draw, ], 'EDIT_SURFACE': [ *_tools_default, diff --git a/scripts/startup/bl_ui/space_view3d.py b/scripts/startup/bl_ui/space_view3d.py index 920a9e7e714..38ed4b37ebe 100644 --- a/scripts/startup/bl_ui/space_view3d.py +++ b/scripts/startup/bl_ui/space_view3d.py @@ -5775,7 +5775,7 @@ class VIEW3D_MT_edit_greasepencil_animation(Menu): def draw(self, context): layout = self.layout layout.operator("grease_pencil.insert_blank_frame", text="Insert Blank Keyframe (Active Layer)") - layout.operator("grease_pencil.insert_blank_frame", text="Insert Blank Keyframe (All Layer)").all_layers = True + layout.operator("grease_pencil.insert_blank_frame", text="Insert Blank Keyframe (All Layers)").all_layers = True class VIEW3D_MT_edit_gpencil_transform(Menu): @@ -5891,6 +5891,8 @@ class VIEW3D_MT_edit_curves(Menu): layout.menu("VIEW3D_MT_transform") layout.separator() + layout.operator("curves.duplicate_move") + layout.separator() layout.operator("curves.attribute_set") layout.operator("curves.delete") layout.template_node_operator_asset_menu_items(catalog_path=self.bl_label) @@ -7161,7 +7163,7 @@ class VIEW3D_PT_overlay_edit_mesh_shading(Panel): statvis_active = not xray row = col.row() row.active = statvis_active - row.prop(overlay, "show_statvis", text="Mesh Analysis") + row.prop(overlay, "show_statvis") if overlay.show_statvis: col = col.column() col.active = statvis_active diff --git a/scripts/templates_py/image_processing.py b/scripts/templates_py/image_processing.py index ab14436ad8e..06a84085f12 100644 --- a/scripts/templates_py/image_processing.py +++ b/scripts/templates_py/image_processing.py @@ -1,4 +1,4 @@ -# This sample shows the an efficient way of doing image processing +# This sample shows an efficient way of doing image processing # over Blender's images using Python. import bpy @@ -19,7 +19,7 @@ pixel_data = np.zeros((w, h, 4), 'f') input_image.pixels.foreach_get(pixel_data.ravel()) # Do whatever image processing you want using numpy here: -# Example 1: Inverse red green and blue channels. +# Example 1: Invert red green and blue channels. pixel_data[:, :, :3] = 1.0 - pixel_data[:, :, :3] # Example 2: Change gamma on the red channel. pixel_data[:, :, 0] = np.power(pixel_data[:, :, 0], 1.5) diff --git a/source/blender/animrig/ANIM_animdata.hh b/source/blender/animrig/ANIM_animdata.hh index 5132a058dd1..fe9eb4e3da1 100644 --- a/source/blender/animrig/ANIM_animdata.hh +++ b/source/blender/animrig/ANIM_animdata.hh @@ -8,12 +8,22 @@ * \brief Functions to work with AnimData. */ +struct ID; +struct Main; + struct bAnimContext; struct AnimData; struct FCurve; +struct bAction; namespace blender::animrig { +/** + * Get (or add relevant data to be able to do so) the Active Action for the given + * Animation Data block, given an ID block where the Animation Data should reside. + */ +bAction *id_action_ensure(Main *bmain, ID *id); + /** * Delete the F-Curve from the given AnimData block (if possible), * as appropriate according to animation context. diff --git a/source/blender/animrig/ANIM_keyframing.hh b/source/blender/animrig/ANIM_keyframing.hh index 7a100805a71..a3738d3a495 100644 --- a/source/blender/animrig/ANIM_keyframing.hh +++ b/source/blender/animrig/ANIM_keyframing.hh @@ -32,6 +32,9 @@ namespace blender::animrig { /** \name Key-Framing Management * \{ */ +/* Set the FCurve flag based on the property type of `prop`. */ +void update_autoflags_fcurve_direct(FCurve *fcu, PropertyRNA *prop); + /** * \brief Main Insert Key-framing API call. * @@ -139,13 +142,10 @@ bool is_autokey_flag(const Scene *scene, eKeyInsert_Flag flag); */ bool autokeyframe_cfra_can_key(const Scene *scene, ID *id); -void autokeyframe_object( - bContext *C, Scene *scene, ViewLayer *view_layer, Object *ob, eTfmMode tmode); +void autokeyframe_object(bContext *C, Scene *scene, Object *ob); /** * Auto-keyframing feature - for objects * - * \param tmode: A transform mode. - * * \note Context may not always be available, * so must check before using it as it's a luxury for a few cases. */ @@ -154,14 +154,12 @@ bool autokeyframe_pchan(bContext *C, Scene *scene, Object *ob, bPoseChannel *pch /** * Auto-keyframing feature - for poses/pose-channels * - * \param tmode: A transform mode. - * * targetless_ik: has targetless ik been done on any channels? * * \note Context may not always be available, * so must check before using it as it's a luxury for a few cases. */ -void autokeyframe_pose(bContext *C, Scene *scene, Object *ob, int tmode, short targetless_ik); +void autokeyframe_pose(bContext *C, Scene *scene, Object *ob, short targetless_ik); /** * Use for auto-key-framing. * \param only_if_property_keyed: if true, auto-key-framing only creates keyframes on already keyed @@ -190,7 +188,7 @@ int insert_key_action(Main *bmain, PointerRNA *ptr, const std::string &rna_path, float frame, - const Span values, + Span values, eInsertKeyFlags insert_key_flag, eBezTriple_KeyframeType key_type); diff --git a/source/blender/animrig/intern/animdata.cc b/source/blender/animrig/intern/animdata.cc index 0277f667e3c..869f16c9188 100644 --- a/source/blender/animrig/intern/animdata.cc +++ b/source/blender/animrig/intern/animdata.cc @@ -8,9 +8,13 @@ #include "ANIM_animdata.hh" #include "BKE_action.h" +#include "BKE_anim_data.h" #include "BKE_fcurve.h" #include "BKE_lib_id.h" #include "BLI_listbase.h" +#include "BLI_string.h" +#include "DEG_depsgraph.hh" +#include "DEG_depsgraph_build.hh" #include "DNA_anim_types.h" #include "ED_anim_api.hh" @@ -20,6 +24,47 @@ namespace blender::animrig { /** \name Public F-Curves API * \{ */ +bAction *id_action_ensure(Main *bmain, ID *id) +{ + AnimData *adt; + + /* init animdata if none available yet */ + adt = BKE_animdata_from_id(id); + if (adt == nullptr) { + adt = BKE_animdata_ensure_id(id); + } + if (adt == nullptr) { + /* if still none (as not allowed to add, or ID doesn't have animdata for some reason) */ + printf("ERROR: Couldn't add AnimData (ID = %s)\n", (id) ? (id->name) : ""); + return nullptr; + } + + /* init action if none available yet */ + /* TODO: need some wizardry to handle NLA stuff correct */ + if (adt->action == nullptr) { + /* init action name from name of ID block */ + char actname[sizeof(id->name) - 2]; + SNPRINTF(actname, "%sAction", id->name + 2); + + /* create action */ + adt->action = BKE_action_add(bmain, actname); + + /* set ID-type from ID-block that this is going to be assigned to + * so that users can't accidentally break actions by assigning them + * to the wrong places + */ + BKE_animdata_action_ensure_idroot(id, adt->action); + + /* Tag depsgraph to be rebuilt to include time dependency. */ + DEG_relations_tag_update(bmain); + } + + DEG_id_tag_update(&adt->action->id, ID_RECALC_ANIMATION_NO_FLUSH); + + /* return the action */ + return adt->action; +} + void animdata_fcurve_delete(bAnimContext *ac, AnimData *adt, FCurve *fcu) { /* - If no AnimData, we've got nowhere to remove the F-Curve from diff --git a/source/blender/animrig/intern/fcurve.cc b/source/blender/animrig/intern/fcurve.cc index ce400441fab..0701d277c78 100644 --- a/source/blender/animrig/intern/fcurve.cc +++ b/source/blender/animrig/intern/fcurve.cc @@ -14,7 +14,6 @@ #include "BKE_fcurve.h" #include "BLI_math_vector_types.hh" #include "DNA_anim_types.h" -#include "ED_anim_api.hh" #include "MEM_guardedalloc.h" namespace blender::animrig { @@ -240,8 +239,8 @@ void initialize_bezt(BezTriple *beztr, beztr->ipo = BEZT_IPO_LIN; } - /* Set keyframe type value (supplied), which should come from the scene - * settings in most cases. */ + /* Set keyframe type value (supplied), + * which should come from the scene settings in most cases. */ BEZKEYTYPE(beztr) = settings.keyframe_type; /* Set default values for "easing" interpolation mode settings. diff --git a/source/blender/animrig/intern/keyframing.cc b/source/blender/animrig/intern/keyframing.cc index 82860f226c7..de86f61d97f 100644 --- a/source/blender/animrig/intern/keyframing.cc +++ b/source/blender/animrig/intern/keyframing.cc @@ -45,6 +45,28 @@ namespace blender::animrig { +void update_autoflags_fcurve_direct(FCurve *fcu, PropertyRNA *prop) +{ + /* Set additional flags for the F-Curve (i.e. only integer values). */ + fcu->flag &= ~(FCURVE_INT_VALUES | FCURVE_DISCRETE_VALUES); + switch (RNA_property_type(prop)) { + case PROP_FLOAT: + /* Do nothing. */ + break; + case PROP_INT: + /* Do integer (only 'whole' numbers) interpolation between all points. */ + fcu->flag |= FCURVE_INT_VALUES; + break; + default: + /* Do 'discrete' (i.e. enum, boolean values which cannot take any intermediate + * values at all) interpolation between all points. + * - however, we must also ensure that evaluated values are only integers still. + */ + fcu->flag |= (FCURVE_DISCRETE_VALUES | FCURVE_INT_VALUES); + break; + } +} + /** Used to make curves newly added to a cyclic Action cycle with the correct period. */ static void make_new_fcurve_cyclic(const bAction *act, FCurve *fcu) { @@ -514,7 +536,7 @@ int insert_keyframe(Main *bmain, /* If no action is provided, keyframe to the default one attached to this ID-block. */ if (act == nullptr) { - act = ED_id_action_ensure(bmain, id); + act = id_action_ensure(bmain, id); if (act == nullptr) { BKE_reportf(reports, RPT_ERROR, @@ -914,7 +936,7 @@ void insert_key_rna(PointerRNA *rna_pointer, ReportList *reports) { ID *id = rna_pointer->owner_id; - bAction *action = ED_id_action_ensure(bmain, id); + bAction *action = id_action_ensure(bmain, id); if (action == nullptr) { BKE_reportf(reports, RPT_ERROR, diff --git a/source/blender/animrig/intern/keyframing_auto.cc b/source/blender/animrig/intern/keyframing_auto.cc index 41ff1b4296a..79a293a79e0 100644 --- a/source/blender/animrig/intern/keyframing_auto.cc +++ b/source/blender/animrig/intern/keyframing_auto.cc @@ -82,10 +82,20 @@ bool autokeyframe_cfra_can_key(const Scene *scene, ID *id) return true; } -void autokeyframe_object( - bContext *C, Scene *scene, ViewLayer *view_layer, Object *ob, const eTfmMode tmode) +static std::string get_rotation_mode_path(const eRotationModes rotmode) +{ + switch (rotmode) { + case ROT_MODE_QUAT: + return "rotation_quaternion"; + case ROT_MODE_AXISANGLE: + return "rotation_axis_angle"; + default: + return "rotation_euler"; + } +} + +void autokeyframe_object(bContext *C, Scene *scene, Object *ob) { - /* TODO: this should probably be done per channel instead. */ ID *id = &ob->id; if (!autokeyframe_cfra_can_key(scene, id)) { return; @@ -96,10 +106,9 @@ void autokeyframe_object( Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); const AnimationEvalContext anim_eval_context = BKE_animsys_eval_context_construct( depsgraph, BKE_scene_frame_get(scene)); - eInsertKeyFlags flag = eInsertKeyFlags(0); /* Get flags used for inserting keyframes. */ - flag = ANIM_get_keyframing_flags(scene, true); + const eInsertKeyFlags flag = ANIM_get_keyframing_flags(scene, true); /* Add data-source override for the object. */ blender::Vector sources; @@ -112,9 +121,10 @@ void autokeyframe_object( */ ANIM_apply_keyingset( C, &sources, active_ks, MODIFYKEY_MODE_INSERT, anim_eval_context.eval_time); + return; } - else if (is_autokey_flag(scene, AUTOKEY_FLAG_INSERTAVAILABLE)) { + if (is_autokey_flag(scene, AUTOKEY_FLAG_INSERTAVAILABLE)) { /* Only key on available channels. */ AnimData *adt = ob->adt; ToolSettings *ts = scene->toolsettings; @@ -134,64 +144,22 @@ void autokeyframe_object( flag); } } + return; } - else if (is_autokey_flag(scene, AUTOKEY_FLAG_INSERTNEEDED)) { - bool do_loc = false, do_rot = false, do_scale = false; + const float scene_frame = BKE_scene_frame_get(scene); + std::string rotation_rna_path = get_rotation_mode_path(eRotationModes(ob->rotmode)); + Vector rna_paths = {"location", rotation_rna_path, "scale"}; + Main *bmain = CTX_data_main(C); - /* Filter the conditions when this happens (assume that curarea->spacetype==SPACE_VIE3D). */ - if (tmode == TFM_TRANSLATION) { - do_loc = true; - } - else if (ELEM(tmode, TFM_ROTATION, TFM_TRACKBALL)) { - if (scene->toolsettings->transform_pivot_point == V3D_AROUND_ACTIVE) { - BKE_view_layer_synced_ensure(scene, view_layer); - if (ob != BKE_view_layer_active_object_get(view_layer)) { - do_loc = true; - } - } - else if (scene->toolsettings->transform_pivot_point == V3D_AROUND_CURSOR) { - do_loc = true; - } - - if ((scene->toolsettings->transform_flag & SCE_XFORM_AXIS_ALIGN) == 0) { - do_rot = true; - } - } - else if (tmode == TFM_RESIZE) { - if (scene->toolsettings->transform_pivot_point == V3D_AROUND_ACTIVE) { - BKE_view_layer_synced_ensure(scene, view_layer); - if (ob != BKE_view_layer_active_object_get(view_layer)) { - do_loc = true; - } - } - else if (scene->toolsettings->transform_pivot_point == V3D_AROUND_CURSOR) { - do_loc = true; - } - - if ((scene->toolsettings->transform_flag & SCE_XFORM_AXIS_ALIGN) == 0) { - do_scale = true; - } - } - - if (do_loc) { - KeyingSet *ks = ANIM_builtin_keyingset_get_named(ANIM_KS_LOCATION_ID); - ANIM_apply_keyingset(C, &sources, ks, MODIFYKEY_MODE_INSERT, anim_eval_context.eval_time); - } - if (do_rot) { - KeyingSet *ks = ANIM_builtin_keyingset_get_named(ANIM_KS_ROTATION_ID); - ANIM_apply_keyingset(C, &sources, ks, MODIFYKEY_MODE_INSERT, anim_eval_context.eval_time); - } - if (do_scale) { - KeyingSet *ks = ANIM_builtin_keyingset_get_named(ANIM_KS_SCALING_ID); - ANIM_apply_keyingset(C, &sources, ks, MODIFYKEY_MODE_INSERT, anim_eval_context.eval_time); - } - } - - /* Insert keyframe in all (transform) channels. */ - else { - KeyingSet *ks = ANIM_builtin_keyingset_get_named(ANIM_KS_LOC_ROT_SCALE_ID); - ANIM_apply_keyingset(C, &sources, ks, MODIFYKEY_MODE_INSERT, anim_eval_context.eval_time); + for (PointerRNA ptr : sources) { + insert_key_rna(&ptr, + rna_paths.as_span(), + scene_frame, + flag, + eBezTriple_KeyframeType(scene->toolsettings->keyframe_type), + bmain, + reports); } } @@ -231,7 +199,7 @@ bool autokeyframe_pchan(bContext *C, Scene *scene, Object *ob, bPoseChannel *pch return true; } -void autokeyframe_pose(bContext *C, Scene *scene, Object *ob, int tmode, short targetless_ik) +void autokeyframe_pose(bContext *C, Scene *scene, Object *ob, short targetless_ik) { Main *bmain = CTX_data_main(C); ID *id = &ob->id; @@ -247,16 +215,16 @@ void autokeyframe_pose(bContext *C, Scene *scene, Object *ob, int tmode, short t ToolSettings *ts = scene->toolsettings; KeyingSet *active_ks = ANIM_scene_get_active_keyingset(scene); Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); - const AnimationEvalContext anim_eval_context = BKE_animsys_eval_context_construct( - depsgraph, BKE_scene_frame_get(scene)); - eInsertKeyFlags flag = eInsertKeyFlags(0); + const float scene_frame = BKE_scene_frame_get(scene); + const AnimationEvalContext anim_eval_context = BKE_animsys_eval_context_construct(depsgraph, + scene_frame); /* flag is initialized from UserPref keyframing settings * - special exception for targetless IK - INSERTKEY_MATRIX keyframes should get * visual keyframes even if flag not set, as it's not that useful otherwise * (for quick animation recording) */ - flag = ANIM_get_keyframing_flags(scene, true); + eInsertKeyFlags flag = ANIM_get_keyframing_flags(scene, true); if (targetless_ik) { flag |= INSERTKEY_MATRIX; @@ -278,87 +246,51 @@ void autokeyframe_pose(bContext *C, Scene *scene, Object *ob, int tmode, short t /* Run the active Keying Set on the current data-source. */ ANIM_apply_keyingset( C, &sources, active_ks, MODIFYKEY_MODE_INSERT, anim_eval_context.eval_time); + continue; } + /* only insert into available channels? */ - else if (blender::animrig::is_autokey_flag(scene, AUTOKEY_FLAG_INSERTAVAILABLE)) { - if (act) { - LISTBASE_FOREACH (FCurve *, fcu, &act->curves) { - /* only insert keyframes for this F-Curve if it affects the current bone */ - char pchan_name[sizeof(pchan->name)]; - if (!BLI_str_quoted_substr(fcu->rna_path, "bones[", pchan_name, sizeof(pchan_name))) { - continue; - } + if (blender::animrig::is_autokey_flag(scene, AUTOKEY_FLAG_INSERTAVAILABLE)) { + if (!act) { + continue; + } + LISTBASE_FOREACH (FCurve *, fcu, &act->curves) { + /* only insert keyframes for this F-Curve if it affects the current bone */ + char pchan_name[sizeof(pchan->name)]; + if (!BLI_str_quoted_substr(fcu->rna_path, "bones[", pchan_name, sizeof(pchan_name))) { + continue; + } - /* only if bone name matches too... - * NOTE: this will do constraints too, but those are ok to do here too? - */ - if (STREQ(pchan_name, pchan->name)) { - blender::animrig::insert_keyframe(bmain, - reports, - id, - act, - ((fcu->grp) ? (fcu->grp->name) : (nullptr)), - fcu->rna_path, - fcu->array_index, - &anim_eval_context, - eBezTriple_KeyframeType(ts->keyframe_type), - flag); - } + /* only if bone name matches too... + * NOTE: this will do constraints too, but those are ok to do here too? + */ + if (STREQ(pchan_name, pchan->name)) { + blender::animrig::insert_keyframe(bmain, + reports, + id, + act, + ((fcu->grp) ? (fcu->grp->name) : (nullptr)), + fcu->rna_path, + fcu->array_index, + &anim_eval_context, + eBezTriple_KeyframeType(ts->keyframe_type), + flag); } } + continue; } - /* only insert keyframe if needed? */ - else if (blender::animrig::is_autokey_flag(scene, AUTOKEY_FLAG_INSERTNEEDED)) { - bool do_loc = false, do_rot = false, do_scale = false; - /* Filter the conditions when this happens - * (assume that 'curarea->spacetype == SPACE_VIEW3D'). */ - if (tmode == TFM_TRANSLATION) { - if (targetless_ik) { - do_rot = true; - } - else { - do_loc = true; - } - } - else if (ELEM(tmode, TFM_ROTATION, TFM_TRACKBALL)) { - if (ELEM(scene->toolsettings->transform_pivot_point, V3D_AROUND_CURSOR, V3D_AROUND_ACTIVE)) - { - do_loc = true; - } - - if ((scene->toolsettings->transform_flag & SCE_XFORM_AXIS_ALIGN) == 0) { - do_rot = true; - } - } - else if (tmode == TFM_RESIZE) { - if (ELEM(scene->toolsettings->transform_pivot_point, V3D_AROUND_CURSOR, V3D_AROUND_ACTIVE)) - { - do_loc = true; - } - - if ((scene->toolsettings->transform_flag & SCE_XFORM_AXIS_ALIGN) == 0) { - do_scale = true; - } - } - - if (do_loc) { - KeyingSet *ks = ANIM_builtin_keyingset_get_named(ANIM_KS_LOCATION_ID); - ANIM_apply_keyingset(C, &sources, ks, MODIFYKEY_MODE_INSERT, anim_eval_context.eval_time); - } - if (do_rot) { - KeyingSet *ks = ANIM_builtin_keyingset_get_named(ANIM_KS_ROTATION_ID); - ANIM_apply_keyingset(C, &sources, ks, MODIFYKEY_MODE_INSERT, anim_eval_context.eval_time); - } - if (do_scale) { - KeyingSet *ks = ANIM_builtin_keyingset_get_named(ANIM_KS_SCALING_ID); - ANIM_apply_keyingset(C, &sources, ks, MODIFYKEY_MODE_INSERT, anim_eval_context.eval_time); - } - } - /* insert keyframe in all (transform) channels */ - else { - KeyingSet *ks = ANIM_builtin_keyingset_get_named(ANIM_KS_LOC_ROT_SCALE_ID); - ANIM_apply_keyingset(C, &sources, ks, MODIFYKEY_MODE_INSERT, anim_eval_context.eval_time); + Main *bmain = CTX_data_main(C); + std::string rotation_rna_path = get_rotation_mode_path(eRotationModes(pchan->rotmode)); + Vector rna_paths = {"location", rotation_rna_path, "scale"}; + for (PointerRNA &ptr : sources) { + insert_key_rna(&ptr, + rna_paths, + scene_frame, + flag, + eBezTriple_KeyframeType(scene->toolsettings->keyframe_type), + bmain, + reports); } } } diff --git a/source/blender/asset_system/intern/asset_identifier.cc b/source/blender/asset_system/intern/asset_identifier.cc index a6442eb080a..4b0dae698bc 100644 --- a/source/blender/asset_system/intern/asset_identifier.cc +++ b/source/blender/asset_system/intern/asset_identifier.cc @@ -8,7 +8,7 @@ #include -#include "BKE_blendfile.h" +#include "BKE_blendfile.hh" #include "BLI_path_util.h" diff --git a/source/blender/blenfont/intern/blf.cc b/source/blender/blenfont/intern/blf.cc index 61c8a84234f..87d1234fb0b 100644 --- a/source/blender/blenfont/intern/blf.cc +++ b/source/blender/blenfont/intern/blf.cc @@ -130,7 +130,7 @@ static int blf_search_by_filepath(const char *filepath) { for (int i = 0; i < BLF_MAX_FONT; i++) { const FontBLF *font = global_font[i]; - if (font && (BLI_path_cmp(font->filepath, filepath) == 0)) { + if (font && font->filepath && (BLI_path_cmp(font->filepath, filepath) == 0)) { return i; } } diff --git a/source/blender/blenfont/intern/blf_font.cc b/source/blender/blenfont/intern/blf_font.cc index 4044933efc3..7a020eb216a 100644 --- a/source/blender/blenfont/intern/blf_font.cc +++ b/source/blender/blenfont/intern/blf_font.cc @@ -769,7 +769,7 @@ size_t blf_font_width_to_rstrlen( i_tmp = i; g = blf_glyph_from_utf8_and_step(font, gc, nullptr, str, str_len, &i_tmp, nullptr); - for (width_new = pen_x = 0; (s != nullptr); + for (width_new = pen_x = 0; (s != nullptr && i > 0); i = i_prev, s = s_prev, g = g_prev, g_prev = nullptr, width_new = pen_x) { s_prev = BLI_str_find_prev_char_utf8(s, str); diff --git a/source/blender/blenkernel/BKE_attribute.hh b/source/blender/blenkernel/BKE_attribute.hh index 930153caf6d..e86f749e319 100644 --- a/source/blender/blenkernel/BKE_attribute.hh +++ b/source/blender/blenkernel/BKE_attribute.hh @@ -874,7 +874,7 @@ void gather_attributes(AttributeAccessor src_attributes, eAttrDomain domain, const AnonymousAttributePropagationInfo &propagation_info, const Set &skip, - const Span indices, + Span indices, MutableAttributeAccessor dst_attributes); /** diff --git a/source/blender/blenkernel/BKE_blendfile.h b/source/blender/blenkernel/BKE_blendfile.hh similarity index 52% rename from source/blender/blenkernel/BKE_blendfile.h rename to source/blender/blenkernel/BKE_blendfile.hh index b6db0ec67f4..7eb3eb68927 100644 --- a/source/blender/blenkernel/BKE_blendfile.h +++ b/source/blender/blenkernel/BKE_blendfile.hh @@ -7,10 +7,7 @@ * \ingroup bke */ -#ifdef __cplusplus -extern "C" { -#endif - +struct bContext; struct BlendFileData; struct BlendFileReadParams; struct BlendFileReadReport; @@ -20,7 +17,7 @@ struct Main; struct MemFile; struct ReportList; struct UserDef; -struct bContext; +struct WorkspaceConfigFileData; /** * Check whether given path ends with a blend file compatible extension @@ -63,38 +60,38 @@ bool BKE_blendfile_is_readable(const char *path, struct ReportList *reports); * This is done in a separate step so the caller may perform actions after it is known the file * loaded correctly but before the file replaces the existing blend file contents. */ -void BKE_blendfile_read_setup_readfile(struct bContext *C, - struct BlendFileData *bfd, - const struct BlendFileReadParams *params, - struct BlendFileReadWMSetupData *wm_setup_data, - struct BlendFileReadReport *reports, +void BKE_blendfile_read_setup_readfile(bContext *C, + BlendFileData *bfd, + const BlendFileReadParams *params, + BlendFileReadWMSetupData *wm_setup_data, + BlendFileReadReport *reports, bool startup_update_defaults, const char *startup_app_template); /** * Simpler version of #BKE_blendfile_read_setup_readfile used when reading undo steps from * memfile. */ -void BKE_blendfile_read_setup_undo(struct bContext *C, - struct BlendFileData *bfd, - const struct BlendFileReadParams *params, - struct BlendFileReadReport *reports); +void BKE_blendfile_read_setup_undo(bContext *C, + BlendFileData *bfd, + const BlendFileReadParams *params, + BlendFileReadReport *reports); /** * \return Blend file data, this must be passed to * #BKE_blendfile_read_setup_readfile/#BKE_blendfile_read_setup_undo when non-NULL. */ -struct BlendFileData *BKE_blendfile_read(const char *filepath, - const struct BlendFileReadParams *params, - struct BlendFileReadReport *reports); +BlendFileData *BKE_blendfile_read(const char *filepath, + const BlendFileReadParams *params, + BlendFileReadReport *reports); /** * \return Blend file data, this must be passed to * #BKE_blendfile_read_setup_readfile/#BKE_blendfile_read_setup_undo when non-NULL. */ -struct BlendFileData *BKE_blendfile_read_from_memory(const void *filebuf, - int filelength, - const struct BlendFileReadParams *params, - struct ReportList *reports); +BlendFileData *BKE_blendfile_read_from_memory(const void *filebuf, + int filelength, + const BlendFileReadParams *params, + ReportList *reports); /** * \return Blend file data, this must be passed to @@ -102,30 +99,30 @@ struct BlendFileData *BKE_blendfile_read_from_memory(const void *filebuf, * * \note `memfile` is the undo buffer. */ -struct BlendFileData *BKE_blendfile_read_from_memfile(struct Main *bmain, - struct MemFile *memfile, - const struct BlendFileReadParams *params, - struct ReportList *reports); +BlendFileData *BKE_blendfile_read_from_memfile(Main *bmain, + MemFile *memfile, + const BlendFileReadParams *params, + ReportList *reports); /** * Utility to make a file 'empty' used for startup to optionally give an empty file. * Handy for tests. */ -void BKE_blendfile_read_make_empty(struct bContext *C); +void BKE_blendfile_read_make_empty(bContext *C); /** * Only read the #UserDef from a .blend. */ -struct UserDef *BKE_blendfile_userdef_read(const char *filepath, struct ReportList *reports); -struct UserDef *BKE_blendfile_userdef_read_from_memory(const void *filebuf, - int filelength, - struct ReportList *reports); -struct UserDef *BKE_blendfile_userdef_from_defaults(void); +UserDef *BKE_blendfile_userdef_read(const char *filepath, ReportList *reports); +UserDef *BKE_blendfile_userdef_read_from_memory(const void *filebuf, + int filelength, + ReportList *reports); +UserDef *BKE_blendfile_userdef_from_defaults(void); /** * Only write the #UserDef in a `.blend`. * \return success. */ -bool BKE_blendfile_userdef_write(const char *filepath, struct ReportList *reports); +bool BKE_blendfile_userdef_write(const char *filepath, ReportList *reports); /** * Only write the #UserDef in a `.blend`, merging with the existing blend file. * \return success. @@ -133,34 +130,25 @@ bool BKE_blendfile_userdef_write(const char *filepath, struct ReportList *report * \note In the future we should re-evaluate user preferences, * possibly splitting out system/hardware specific preferences. */ -bool BKE_blendfile_userdef_write_app_template(const char *filepath, struct ReportList *reports); +bool BKE_blendfile_userdef_write_app_template(const char *filepath, ReportList *reports); -bool BKE_blendfile_userdef_write_all(struct ReportList *reports); +bool BKE_blendfile_userdef_write_all(ReportList *reports); -struct WorkspaceConfigFileData *BKE_blendfile_workspace_config_read(const char *filepath, - const void *filebuf, - int filelength, - struct ReportList *reports); -bool BKE_blendfile_workspace_config_write(struct Main *bmain, - const char *filepath, - struct ReportList *reports); -void BKE_blendfile_workspace_config_data_free(struct WorkspaceConfigFileData *workspace_config); +WorkspaceConfigFileData *BKE_blendfile_workspace_config_read(const char *filepath, + const void *filebuf, + int filelength, + ReportList *reports); +bool BKE_blendfile_workspace_config_write(Main *bmain, const char *filepath, ReportList *reports); +void BKE_blendfile_workspace_config_data_free(WorkspaceConfigFileData *workspace_config); /* Partial blend file writing. */ -void BKE_blendfile_write_partial_tag_ID(struct ID *id, bool set); -void BKE_blendfile_write_partial_begin(struct Main *bmain_src); +void BKE_blendfile_write_partial_tag_ID(ID *id, bool set); +void BKE_blendfile_write_partial_begin(Main *bmain_src); /** * \param remap_mode: Choose the kind of path remapping or none #eBLO_WritePathRemap. * \return Success. */ -bool BKE_blendfile_write_partial(struct Main *bmain_src, - const char *filepath, - int write_flags, - int remap_mode, - struct ReportList *reports); -void BKE_blendfile_write_partial_end(struct Main *bmain_src); - -#ifdef __cplusplus -} -#endif +bool BKE_blendfile_write_partial( + Main *bmain_src, const char *filepath, int write_flags, int remap_mode, ReportList *reports); +void BKE_blendfile_write_partial_end(Main *bmain_src); diff --git a/source/blender/blenkernel/BKE_blendfile_link_append.h b/source/blender/blenkernel/BKE_blendfile_link_append.hh similarity index 74% rename from source/blender/blenkernel/BKE_blendfile_link_append.h rename to source/blender/blenkernel/BKE_blendfile_link_append.hh index a9e6e7348c2..d8c586f08d2 100644 --- a/source/blender/blenkernel/BKE_blendfile_link_append.h +++ b/source/blender/blenkernel/BKE_blendfile_link_append.hh @@ -7,10 +7,6 @@ * \ingroup bke */ -#ifdef __cplusplus -extern "C" { -#endif - struct BlendHandle; struct ID; struct Library; @@ -23,12 +19,11 @@ typedef struct BlendfileLinkAppendContextItem BlendfileLinkAppendContextItem; /** * Allocate and initialize a new context to link/append data-blocks. */ -BlendfileLinkAppendContext *BKE_blendfile_link_append_context_new( - struct LibraryLink_Params *params); +BlendfileLinkAppendContext *BKE_blendfile_link_append_context_new(LibraryLink_Params *params); /** * Free a link/append context. */ -void BKE_blendfile_link_append_context_free(struct BlendfileLinkAppendContext *lapp_context); +void BKE_blendfile_link_append_context_free(BlendfileLinkAppendContext *lapp_context); /** * Set or clear flags in given \a lapp_context. * @@ -37,7 +32,7 @@ void BKE_blendfile_link_append_context_free(struct BlendfileLinkAppendContext *l * - #eBLOLibLinkFlags * from `BLO_readfile.h`. * \param do_set: Set the given \a flag if true, clear it otherwise. */ -void BKE_blendfile_link_append_context_flag_set(struct BlendfileLinkAppendContext *lapp_context, +void BKE_blendfile_link_append_context_flag_set(BlendfileLinkAppendContext *lapp_context, int flag, bool do_set); @@ -48,12 +43,10 @@ void BKE_blendfile_link_append_context_flag_set(struct BlendfileLinkAppendContex * cannot be linked in BKE code. */ void BKE_blendfile_link_append_context_embedded_blendfile_set( - struct BlendfileLinkAppendContext *lapp_context, - const void *blendfile_mem, - int blendfile_memsize); + BlendfileLinkAppendContext *lapp_context, const void *blendfile_mem, int blendfile_memsize); /** Clear reference to Blender's embedded startup file into the context. */ void BKE_blendfile_link_append_context_embedded_blendfile_clear( - struct BlendfileLinkAppendContext *lapp_context); + BlendfileLinkAppendContext *lapp_context); /** * Add a new source library to search for items to be linked to the given link/append context. @@ -66,9 +59,9 @@ void BKE_blendfile_link_append_context_embedded_blendfile_clear( * \note *Never* call #BKE_blendfile_link_append_context_library_add() * after having added some items. */ -void BKE_blendfile_link_append_context_library_add(struct BlendfileLinkAppendContext *lapp_context, +void BKE_blendfile_link_append_context_library_add(BlendfileLinkAppendContext *lapp_context, const char *libname, - struct BlendHandle *blo_handle); + BlendHandle *blo_handle); /** * Add a new item (data-block name and `idcode`) to be searched and linked/appended from libraries * associated to the given context. @@ -79,11 +72,8 @@ void BKE_blendfile_link_append_context_library_add(struct BlendfileLinkAppendCon * #BKE_blendfile_link_append_context_item_library_index_enable to enable the added item for all * added library sources. */ -struct BlendfileLinkAppendContextItem *BKE_blendfile_link_append_context_item_add( - struct BlendfileLinkAppendContext *lapp_context, - const char *idname, - short idcode, - void *userdata); +BlendfileLinkAppendContextItem *BKE_blendfile_link_append_context_item_add( + BlendfileLinkAppendContext *lapp_context, const char *idname, short idcode, void *userdata); #define BLENDFILE_LINK_APPEND_INVALID -1 /** @@ -101,8 +91,8 @@ struct BlendfileLinkAppendContextItem *BKE_blendfile_link_append_context_item_ad * it could not open the .blend file. */ int BKE_blendfile_link_append_context_item_idtypes_from_library_add( - struct BlendfileLinkAppendContext *lapp_context, - struct ReportList *reports, + BlendfileLinkAppendContext *lapp_context, + ReportList *reports, uint64_t id_types_filter, int library_index); @@ -111,24 +101,24 @@ int BKE_blendfile_link_append_context_item_idtypes_from_library_add( * context. */ void BKE_blendfile_link_append_context_item_library_index_enable( - struct BlendfileLinkAppendContext *lapp_context, - struct BlendfileLinkAppendContextItem *item, + BlendfileLinkAppendContext *lapp_context, + BlendfileLinkAppendContextItem *item, int library_index); /** * Check if given link/append context is empty (has no items to process) or not. */ -bool BKE_blendfile_link_append_context_is_empty(struct BlendfileLinkAppendContext *lapp_context); +bool BKE_blendfile_link_append_context_is_empty(BlendfileLinkAppendContext *lapp_context); -void *BKE_blendfile_link_append_context_item_userdata_get( - struct BlendfileLinkAppendContext *lapp_context, struct BlendfileLinkAppendContextItem *item); -struct ID *BKE_blendfile_link_append_context_item_newid_get( - struct BlendfileLinkAppendContext *lapp_context, struct BlendfileLinkAppendContextItem *item); -struct ID *BKE_blendfile_link_append_context_item_liboverrideid_get( - struct BlendfileLinkAppendContext *lapp_context, struct BlendfileLinkAppendContextItem *item); -short BKE_blendfile_link_append_context_item_idcode_get( - struct BlendfileLinkAppendContext *lapp_context, struct BlendfileLinkAppendContextItem *item); +void *BKE_blendfile_link_append_context_item_userdata_get(BlendfileLinkAppendContext *lapp_context, + BlendfileLinkAppendContextItem *item); +ID *BKE_blendfile_link_append_context_item_newid_get(BlendfileLinkAppendContext *lapp_context, + BlendfileLinkAppendContextItem *item); +ID *BKE_blendfile_link_append_context_item_liboverrideid_get( + BlendfileLinkAppendContext *lapp_context, BlendfileLinkAppendContextItem *item); +short BKE_blendfile_link_append_context_item_idcode_get(BlendfileLinkAppendContext *lapp_context, + BlendfileLinkAppendContextItem *item); -typedef enum eBlendfileLinkAppendForeachItemFlag { +enum eBlendfileLinkAppendForeachItemFlag { /** Loop over directly linked items (i.e. those explicitly defined by user code). */ BKE_BLENDFILE_LINK_APPEND_FOREACH_ITEM_FLAG_DO_DIRECT = 1 << 0, /** Loop over indirectly linked items (i.e. those defined by internal code, as dependencies of @@ -137,7 +127,7 @@ typedef enum eBlendfileLinkAppendForeachItemFlag { * IMPORTANT: Those 'indirect' items currently may not cover **all** indirectly linked data. * See comments in #foreach_libblock_link_append_callback. */ BKE_BLENDFILE_LINK_APPEND_FOREACH_ITEM_FLAG_DO_INDIRECT = 1 << 1, -} eBlendfileLinkAppendForeachItemFlag; +}; /** * Callback called by #BKE_blendfile_link_append_context_item_foreach over each (or a subset of * each) of the items in given #BlendfileLinkAppendContext. @@ -147,8 +137,8 @@ typedef enum eBlendfileLinkAppendForeachItemFlag { * \return `true` if iteration should continue, `false` otherwise. */ typedef bool (*BKE_BlendfileLinkAppendContexteItemFunction)( - struct BlendfileLinkAppendContext *lapp_context, - struct BlendfileLinkAppendContextItem *item, + BlendfileLinkAppendContext *lapp_context, + BlendfileLinkAppendContextItem *item, void *userdata); /** * Iterate over all (or a subset) of the items listed in given #BlendfileLinkAppendContext, @@ -159,7 +149,7 @@ typedef bool (*BKE_BlendfileLinkAppendContexteItemFunction)( * \param userdata: An opaque void pointer passed to the `callback_function`. */ void BKE_blendfile_link_append_context_item_foreach( - struct BlendfileLinkAppendContext *lapp_context, + BlendfileLinkAppendContext *lapp_context, BKE_BlendfileLinkAppendContexteItemFunction callback_function, eBlendfileLinkAppendForeachItemFlag flag, void *userdata); @@ -171,18 +161,16 @@ void BKE_blendfile_link_append_context_item_foreach( * The IDs processed by this functions are the one that have been linked by a previous call to * #BKE_blendfile_link on the same `lapp_context`. */ -void BKE_blendfile_append(struct BlendfileLinkAppendContext *lapp_context, - struct ReportList *reports); +void BKE_blendfile_append(BlendfileLinkAppendContext *lapp_context, ReportList *reports); /** * Perform linking operation on all items added to given `lapp_context`. */ -void BKE_blendfile_link(struct BlendfileLinkAppendContext *lapp_context, - struct ReportList *reports); +void BKE_blendfile_link(BlendfileLinkAppendContext *lapp_context, ReportList *reports); /** * Options controlling the behavior of liboverrides creation. */ -typedef enum eBKELibLinkOverride { +enum eBKELibLinkOverride { BKE_LIBLINK_OVERRIDE_INIT = 0, /** @@ -193,14 +181,14 @@ typedef enum eBKELibLinkOverride { */ BKE_LIBLINK_OVERRIDE_USE_EXISTING_LIBOVERRIDES = 1 << 0, /** - * Create (or return an existing) runtime liboverride, instead of a regular saved-in-blendfiles + * Create (or return an existing) runtime liboverride, instead of a regular saved-in-blend-files * one. See also the #LIB_TAG_RUNTIME tag of IDs in DNA_ID.h. * * \note Typically, usage of this flag implies that no linked IDs are instantiated, such that * their usages remain indirect. */ BKE_LIBLINK_OVERRIDE_CREATE_RUNTIME = 1 << 1, -} eBKELibLinkOverride; +}; /** * Create (or find existing) liboverrides from linked data. @@ -214,9 +202,9 @@ typedef enum eBKELibLinkOverride { * of dependencies or hierarchies. It is not expected to be directly exposed to users in its * current state, but rather as a helper for specific use-cases like 'presets assets' handling. */ -void BKE_blendfile_override(struct BlendfileLinkAppendContext *lapp_context, +void BKE_blendfile_override(BlendfileLinkAppendContext *lapp_context, const eBKELibLinkOverride flags, - struct ReportList *reports); + ReportList *reports); /** * Try to relocate all linked IDs added to `lapp_context`, belonging to the given `library`. @@ -240,11 +228,7 @@ void BKE_blendfile_override(struct BlendfileLinkAppendContext *lapp_context, * NOTE: content of `lapp_context` after execution of that function should not be assumed valid * anymore, and should immediately be freed. */ -void BKE_blendfile_library_relocate(struct BlendfileLinkAppendContext *lapp_context, - struct ReportList *reports, - struct Library *library, +void BKE_blendfile_library_relocate(BlendfileLinkAppendContext *lapp_context, + ReportList *reports, + Library *library, bool do_reload); - -#ifdef __cplusplus -} -#endif diff --git a/source/blender/blenkernel/BKE_bvhutils.hh b/source/blender/blenkernel/BKE_bvhutils.hh index 2faf95dd648..29e65723201 100644 --- a/source/blender/blenkernel/BKE_bvhutils.hh +++ b/source/blender/blenkernel/BKE_bvhutils.hh @@ -65,15 +65,15 @@ enum BVHCacheType { BVHTREE_FROM_VERTS, BVHTREE_FROM_EDGES, BVHTREE_FROM_FACES, - BVHTREE_FROM_LOOPTRI, - BVHTREE_FROM_LOOPTRI_NO_HIDDEN, + BVHTREE_FROM_LOOPTRIS, + BVHTREE_FROM_LOOPTRIS_NO_HIDDEN, BVHTREE_FROM_LOOSEVERTS, BVHTREE_FROM_LOOSEEDGES, BVHTREE_FROM_EM_LOOSEVERTS, BVHTREE_FROM_EM_EDGES, - BVHTREE_FROM_EM_LOOPTRI, + BVHTREE_FROM_EM_LOOPTRIS, /* Keep `BVHTREE_MAX_ITEM` as last item. */ BVHTREE_MAX_ITEM, @@ -98,7 +98,7 @@ BVHTree *bvhtree_from_editmesh_verts( */ BVHTree *bvhtree_from_editmesh_verts_ex(BVHTreeFromEditMesh *data, BMEditMesh *em, - blender::BitSpan mask, + blender::BitSpan verts_mask, int verts_num_active, float epsilon, int tree_type, @@ -109,7 +109,7 @@ BVHTree *bvhtree_from_editmesh_verts_ex(BVHTreeFromEditMesh *data, * \param vert_allocated: if true, vert freeing will be done when freeing data. * \param verts_mask: if not null, true elements give which vert to add to BVH-tree. * \param verts_num_active: if >= 0, number of active verts to add to BVH-tree - * (else will be computed from mask). + * (else will be computed from `verts_mask`). */ BVHTree *bvhtree_from_mesh_verts_ex(BVHTreeFromMesh *data, blender::Span vert_positions, @@ -139,7 +139,7 @@ BVHTree *bvhtree_from_editmesh_edges_ex(BVHTreeFromEditMesh *data, * \param edge, edge_allocated: if true, elem freeing will be done when freeing data. * \param edges_mask: if not null, true elements give which vert to add to BVH-tree. * \param edges_num_active: if >= 0, number of active edges to add to BVH-tree - * (else will be computed from mask). + * (else will be computed from `edges_mask`). */ BVHTree *bvhtree_from_mesh_edges_ex(BVHTreeFromMesh *data, blender::Span vert_positions, @@ -150,32 +150,32 @@ BVHTree *bvhtree_from_mesh_edges_ex(BVHTreeFromMesh *data, int tree_type, int axis); -BVHTree *bvhtree_from_editmesh_looptri( +BVHTree *bvhtree_from_editmesh_looptris( BVHTreeFromEditMesh *data, BMEditMesh *em, float epsilon, int tree_type, int axis); /** - * Builds a BVH-tree where nodes are the `looptri` faces of the given `bm`. + * Builds a BVH-tree where nodes are triangles faces (#MLoopTri) of the given `bm`. */ -BVHTree *bvhtree_from_editmesh_looptri_ex(BVHTreeFromEditMesh *data, - BMEditMesh *em, - blender::BitSpan mask, - int looptri_num_active, - float epsilon, - int tree_type, - int axis); +BVHTree *bvhtree_from_editmesh_looptris_ex(BVHTreeFromEditMesh *data, + BMEditMesh *em, + blender::BitSpan looptris_mask, + int looptris_num_active, + float epsilon, + int tree_type, + int axis); /** - * Builds a BVH-tree where nodes are the looptri faces of the given mesh. + * Builds a BVH-tree where nodes are the triangle faces (#MLoopTri) of the given mesh. */ -BVHTree *bvhtree_from_mesh_looptri_ex(BVHTreeFromMesh *data, - blender::Span vert_positions, - blender::Span corner_verts, - blender::Span looptris, - blender::BitSpan mask, - int looptri_num_active, - float epsilon, - int tree_type, - int axis); +BVHTree *bvhtree_from_mesh_looptris_ex(BVHTreeFromMesh *data, + blender::Span vert_positions, + blender::Span corner_verts, + blender::Span looptris, + blender::BitSpan looptris_mask, + int looptris_num_active, + float epsilon, + int tree_type, + int axis); /** * Builds or queries a BVH-cache for the cache BVH-tree of the request type. diff --git a/source/blender/blenkernel/BKE_editmesh.hh b/source/blender/blenkernel/BKE_editmesh.hh index a4303fb8d50..5da09d2227d 100644 --- a/source/blender/blenkernel/BKE_editmesh.hh +++ b/source/blender/blenkernel/BKE_editmesh.hh @@ -67,23 +67,23 @@ struct BMEditMesh { /* editmesh.cc */ -void BKE_editmesh_looptri_calc_ex(BMEditMesh *em, const BMeshCalcTessellation_Params *params); -void BKE_editmesh_looptri_calc(BMEditMesh *em); -void BKE_editmesh_looptri_calc_with_partial_ex(BMEditMesh *em, - BMPartialUpdate *bmpinfo, - const BMeshCalcTessellation_Params *params); -void BKE_editmesh_looptri_calc_with_partial(BMEditMesh *em, BMPartialUpdate *bmpinfo); -void BKE_editmesh_looptri_and_normals_calc_with_partial(BMEditMesh *em, BMPartialUpdate *bmpinfo); +void BKE_editmesh_looptris_calc_ex(BMEditMesh *em, const BMeshCalcTessellation_Params *params); +void BKE_editmesh_looptris_calc(BMEditMesh *em); +void BKE_editmesh_looptris_calc_with_partial_ex(BMEditMesh *em, + BMPartialUpdate *bmpinfo, + const BMeshCalcTessellation_Params *params); +void BKE_editmesh_looptris_calc_with_partial(BMEditMesh *em, BMPartialUpdate *bmpinfo); +void BKE_editmesh_looptris_and_normals_calc_with_partial(BMEditMesh *em, BMPartialUpdate *bmpinfo); /** * Performing the face normal calculation at the same time as tessellation * gives a reasonable performance boost (approx ~20% faster). */ -void BKE_editmesh_looptri_and_normals_calc(BMEditMesh *em); +void BKE_editmesh_looptris_and_normals_calc(BMEditMesh *em); /** * \note The caller is responsible for ensuring triangulation data, - * typically by calling #BKE_editmesh_looptri_calc. + * typically by calling #BKE_editmesh_looptris_calc. */ BMEditMesh *BKE_editmesh_create(BMesh *bm); BMEditMesh *BKE_editmesh_copy(BMEditMesh *em); diff --git a/source/blender/blenkernel/BKE_editmesh_bvh.h b/source/blender/blenkernel/BKE_editmesh_bvh.h index 80443ca7e05..16c4fdf7add 100644 --- a/source/blender/blenkernel/BKE_editmesh_bvh.h +++ b/source/blender/blenkernel/BKE_editmesh_bvh.h @@ -70,14 +70,14 @@ struct BMVert *BKE_bmbvh_find_vert_closest(BMBVHTree *tree, const float co[3], f struct BMFace *BKE_bmbvh_find_face_closest(BMBVHTree *tree, const float co[3], float dist_max); /** - * Overlap indices reference the looptri's. + * Overlap indices reference the looptris. */ struct BVHTreeOverlap *BKE_bmbvh_overlap(const BMBVHTree *bmtree_a, const BMBVHTree *bmtree_b, unsigned int *r_overlap_tot); /** - * Overlap indices reference the looptri's. + * Overlap indices reference the looptris. */ struct BVHTreeOverlap *BKE_bmbvh_overlap_self(const BMBVHTree *bmtree, unsigned int *r_overlap_tot); diff --git a/source/blender/blenkernel/BKE_fcurve.h b/source/blender/blenkernel/BKE_fcurve.h index 026680e6df1..ff4ab3a0d76 100644 --- a/source/blender/blenkernel/BKE_fcurve.h +++ b/source/blender/blenkernel/BKE_fcurve.h @@ -8,6 +8,7 @@ * \ingroup bke */ +#include "BLI_math_vector_types.hh" #include "DNA_curve_types.h" #ifdef __cplusplus @@ -483,11 +484,31 @@ bool BKE_fcurve_bezt_subdivide_handles(struct BezTriple *bezt, */ void BKE_fcurve_bezt_shrink(struct FCurve *fcu, int new_totvert); +/** + * Merge the two given BezTriple arrays `a` and `b` into a newly allocated BezTriple array of size + * `r_merged_size`. In case of keys on identical frames, `a` takes precedence. + * Does not free `a` or `b`. + * Assumes that both arrays are sorted for the x-position. + * Has a complexity of O(N) with respect to the length of `size_a` + `size_b`. + * + * \return The merged BezTriple array of length `r_merged_size`. + */ +BezTriple *BKE_bezier_array_merge( + const BezTriple *a, int size_a, const BezTriple *b, int size_b, int *r_merged_size); + /** * Delete a keyframe from an F-curve at a specific index. */ void BKE_fcurve_delete_key(struct FCurve *fcu, int index); +/** Delete an index range of keyframes from an F-curve. This is more performant than individually + * removing keys. + * Has a complexity of O(N) with respect to number of keys in `fcu`. + * + * \param index_range is right exclusive. + */ +void BKE_fcurve_delete_keys(FCurve *fcu, blender::uint2 index_range); + /** * Delete selected keyframes from an F-curve. */ diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh index 0eb573777da..814fd302a71 100644 --- a/source/blender/blenkernel/BKE_geometry_set.hh +++ b/source/blender/blenkernel/BKE_geometry_set.hh @@ -186,12 +186,12 @@ struct GeometrySet { /** * Remove all geometry components with types that are not in the provided list. */ - void keep_only(const Span component_types); + void keep_only(Span component_types); /** * Keeps the provided geometry types, but also instances and edit data. * Instances must not be removed while using #modify_geometry_sets. */ - void keep_only_during_modify(const Span component_types); + void keep_only_during_modify(Span component_types); void remove_geometry_during_modify(); void add(const GeometryComponent &component); diff --git a/source/blender/blenkernel/BKE_grease_pencil.hh b/source/blender/blenkernel/BKE_grease_pencil.hh index 467272bb1bf..dfc0e363196 100644 --- a/source/blender/blenkernel/BKE_grease_pencil.hh +++ b/source/blender/blenkernel/BKE_grease_pencil.hh @@ -656,7 +656,7 @@ inline TreeNode &Layer::as_node() TREENODE_COMMON_METHODS_FORWARD_IMPL(Layer); inline bool Layer::is_empty() const { - return (this->frames().size() == 0); + return (this->frames().is_empty()); } inline LayerGroup &Layer::parent_group() const { diff --git a/source/blender/blenkernel/BKE_idprop.h b/source/blender/blenkernel/BKE_idprop.h index 9f5c8ec959c..f86d82b082c 100644 --- a/source/blender/blenkernel/BKE_idprop.h +++ b/source/blender/blenkernel/BKE_idprop.h @@ -21,6 +21,7 @@ struct BlendWriter; struct ID; struct IDProperty; struct IDPropertyUIData; +struct IDPropertyUIDataEnumItem; struct Library; typedef union IDPropertyTemplate { @@ -94,6 +95,14 @@ void IDP_AssignStringMaxSize(struct IDProperty *prop, const char *st, size_t st_ void IDP_AssignString(struct IDProperty *prop, const char *st) ATTR_NONNULL(); void IDP_FreeString(struct IDProperty *prop) ATTR_NONNULL(); +/*-------- Enum Type -------*/ + +const struct IDPropertyUIDataEnumItem *IDP_EnumItemFind(const struct IDProperty *prop); + +bool IDP_EnumItemsValidate(const struct IDPropertyUIDataEnumItem *items, + int items_num, + void (*error_fn)(const char *)); + /*-------- ID Type -------*/ typedef void (*IDPWalkFunc)(void *user_data, struct IDProperty *idp); diff --git a/source/blender/blenkernel/BKE_image_save.h b/source/blender/blenkernel/BKE_image_save.h index f6337a82bcd..355c4abbbf5 100644 --- a/source/blender/blenkernel/BKE_image_save.h +++ b/source/blender/blenkernel/BKE_image_save.h @@ -74,12 +74,15 @@ bool BKE_image_render_write_exr(struct ReportList *reports, /** * \param filepath_basis: May be used as-is, or used as a basis for multi-view images. + * \param format: The image format to use for saving, if null, the scene format will be used. */ bool BKE_image_render_write(struct ReportList *reports, struct RenderResult *rr, const struct Scene *scene, const bool stamp, - const char *filepath_basis); + const char *filepath_basis, + const struct ImageFormatData *format = nullptr, + bool save_as_render = true); #ifdef __cplusplus } diff --git a/source/blender/blenkernel/BKE_lib_query.h b/source/blender/blenkernel/BKE_lib_query.h index e2678c78d9e..abc3cd00842 100644 --- a/source/blender/blenkernel/BKE_lib_query.h +++ b/source/blender/blenkernel/BKE_lib_query.h @@ -70,12 +70,6 @@ enum { * How to handle that kind of cases totally depends on what caller code is doing... */ IDWALK_CB_LOOPBACK = (1 << 6), - /** That ID is used as library override's reference by its owner. */ - IDWALK_CB_OVERRIDE_LIBRARY_REFERENCE = (1 << 7), - - /** That ID pointer is not overridable. */ - IDWALK_CB_OVERRIDE_LIBRARY_NOT_OVERRIDABLE = (1 << 8), - /** * Indicates that this is an internal runtime ID pointer, like e.g. `ID.newid` or `ID.original`. * \note Those should be ignored in most cases, and won't be processed/generated anyway unless @@ -105,6 +99,16 @@ enum { * Callback is responsible to deal accordingly with #ID.us if needed. */ IDWALK_CB_USER_ONE = (1 << 12), + + /** This ID is used as library override's reference by its owner. */ + IDWALK_CB_OVERRIDE_LIBRARY_REFERENCE = (1 << 16), + + /** This ID pointer is not overridable. */ + IDWALK_CB_OVERRIDE_LIBRARY_NOT_OVERRIDABLE = (1 << 17), + + /** This ID pointer is expected to be overridden by default, in liboverride hierarchy context. */ + IDWALK_CB_OVERRIDE_LIBRARY_HIERARCHY_DEFAULT = (1 << 18), + }; enum { diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index e8ce2d23397..ebf4035051e 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -14,8 +14,6 @@ #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" -#include "BKE_customdata.hh" - struct BMesh; struct BMeshCreateParams; struct BMeshFromMeshParams; @@ -36,10 +34,6 @@ struct Mesh; struct Object; struct Scene; -#ifdef __cplusplus -extern "C" { -#endif - /* TODO: Move to `BKE_mesh_types.hh` when possible. */ typedef enum eMeshBatchDirtyMode { BKE_MESH_BATCH_DIRTY_ALL = 0, @@ -50,39 +44,6 @@ typedef enum eMeshBatchDirtyMode { BKE_MESH_BATCH_DIRTY_UVEDIT_SELECT, } eMeshBatchDirtyMode; -/* mesh_runtime.cc */ - -/** - * Call after changing vertex positions to tag lazily calculated caches for recomputation. - */ -void BKE_mesh_tag_positions_changed(struct Mesh *mesh); - -/** - * The same as #BKE_mesh_tag_positions_changed but doesn't tag normals dirty, instead expecting - * them to be updated separately. - */ -void BKE_mesh_tag_positions_changed_no_normals(struct Mesh *mesh); - -/** - * Call after moving every mesh vertex by the same translation. - */ -void BKE_mesh_tag_positions_changed_uniformly(struct Mesh *mesh); - -void BKE_mesh_tag_topology_changed(struct Mesh *mesh); - -/** - * Call when new edges and vertices have been created but positions and faces haven't changed. - */ -void BKE_mesh_tag_edges_split(struct Mesh *mesh); - -/** Call when changing "sharp_face" or "sharp_edge" data. */ -void BKE_mesh_tag_sharpness_changed(struct Mesh *mesh); - -/** - * Call when face vertex order has changed but positions and faces haven't changed - */ -void BKE_mesh_tag_face_winding_changed(struct Mesh *mesh); - /* `mesh.cc` */ struct BMesh *BKE_mesh_to_bmesh_ex(const struct Mesh *mesh, @@ -211,8 +172,6 @@ void BKE_mesh_material_index_remove(struct Mesh *mesh, short index); bool BKE_mesh_material_index_used(struct Mesh *mesh, short index); void BKE_mesh_material_index_clear(struct Mesh *mesh); void BKE_mesh_material_remap(struct Mesh *mesh, const unsigned int *remap, unsigned int remap_len); -void BKE_mesh_smooth_flag_set(struct Mesh *mesh, bool use_smooth); -void BKE_mesh_sharp_edges_set_from_angle(struct Mesh *mesh, float angle); void BKE_mesh_texspace_calc(struct Mesh *mesh); void BKE_mesh_texspace_ensure(struct Mesh *mesh); @@ -451,8 +410,8 @@ bool BKE_mesh_center_of_volume(const struct Mesh *mesh, float r_cent[3]); */ void BKE_mesh_calc_volume(const float (*vert_positions)[3], int mverts_num, - const struct MLoopTri *mlooptri, - int looptri_num, + const struct MLoopTri *looptris, + int looptris_num, const int *corner_verts, float *r_volume, float r_center[3]); @@ -596,48 +555,4 @@ void BKE_mesh_debug_print(const struct Mesh *mesh) ATTR_NONNULL(1); /** \name Inline Mesh Data Access * \{ */ -/** - * \return The material index for each face. May be null. - * \note In C++ code, prefer using the attribute API (#AttributeAccessor). - */ -BLI_INLINE const int *BKE_mesh_material_indices(const Mesh *mesh) -{ - return (const int *)CustomData_get_layer_named( - &mesh->face_data, CD_PROP_INT32, "material_index"); -} - -/** - * \return The material index for each face. Create the layer if it doesn't exist. - * \note In C++ code, prefer using the attribute API (#MutableAttributeAccessor). - */ -BLI_INLINE int *BKE_mesh_material_indices_for_write(Mesh *mesh) -{ - int *indices = (int *)CustomData_get_layer_named_for_write( - &mesh->face_data, CD_PROP_INT32, "material_index", mesh->faces_num); - if (indices) { - return indices; - } - return (int *)CustomData_add_layer_named( - &mesh->face_data, CD_PROP_INT32, CD_SET_DEFAULT, mesh->faces_num, "material_index"); -} - -BLI_INLINE const MDeformVert *BKE_mesh_deform_verts(const Mesh *mesh) -{ - return (const MDeformVert *)CustomData_get_layer(&mesh->vert_data, CD_MDEFORMVERT); -} -BLI_INLINE MDeformVert *BKE_mesh_deform_verts_for_write(Mesh *mesh) -{ - MDeformVert *dvert = (MDeformVert *)CustomData_get_layer_for_write( - &mesh->vert_data, CD_MDEFORMVERT, mesh->totvert); - if (dvert) { - return dvert; - } - return (MDeformVert *)CustomData_add_layer( - &mesh->vert_data, CD_MDEFORMVERT, CD_SET_DEFAULT, mesh->totvert); -} - -#ifdef __cplusplus -} -#endif - /** \} */ diff --git a/source/blender/blenkernel/BKE_mesh.hh b/source/blender/blenkernel/BKE_mesh.hh index 9eb5bc39d10..f7424c7127e 100644 --- a/source/blender/blenkernel/BKE_mesh.hh +++ b/source/blender/blenkernel/BKE_mesh.hh @@ -8,7 +8,14 @@ * \ingroup bke */ -#include "BLI_index_mask.hh" +namespace blender { +namespace index_mask { +class IndexMask; +} +using index_mask::IndexMask; +} // namespace blender + +#include "BLI_offset_indices.hh" #include "BKE_mesh.h" #include "BKE_mesh_types.hh" @@ -48,7 +55,7 @@ void looptris_calc_face_indices(OffsetIndices faces, MutableSpan loopt int3 looptri_get_real_edges(Span edges, Span corner_verts, Span corner_edges, - const MLoopTri &tri); + const MLoopTri <); /** Calculate the average position of the vertices in the face. */ float3 face_center_calc(Span vert_positions, Span face_verts); @@ -155,6 +162,8 @@ short2 lnor_space_custom_normal_to_data(const CornerNormalSpace &lnor_space, * * \param sharp_edges: Optional array of sharp edge tags, used to split the evaluated normals on * each side of the edge. + * \param sharp_faces: Optional array of sharp face tags, used to split the evaluated normals on + * the face's edges. * \param r_lnors_spacearr: Optional return data filled with information about the custom * normals spaces for each grouped fan of face corners. */ @@ -166,12 +175,15 @@ void normals_calc_loop(Span vert_positions, Span loop_to_face_map, Span vert_normals, Span face_normals, - const bool *sharp_edges, - const bool *sharp_faces, + Span sharp_edges, + Span sharp_faces, const short2 *clnors_data, CornerNormalSpaceArray *r_lnors_spacearr, MutableSpan r_loop_normals); +/** + * \param sharp_faces: Optional array used to mark specific faces for sharp shading. + */ void normals_loop_custom_set(Span vert_positions, Span edges, OffsetIndices faces, @@ -179,11 +191,14 @@ void normals_loop_custom_set(Span vert_positions, Span corner_edges, Span vert_normals, Span face_normals, - const bool *sharp_faces, + Span sharp_faces, MutableSpan sharp_edges, MutableSpan r_custom_loop_normals, MutableSpan r_clnors_data); +/** + * \param sharp_faces: Optional array used to mark specific faces for sharp shading. + */ void normals_loop_custom_set_from_verts(Span vert_positions, Span edges, OffsetIndices faces, @@ -191,7 +206,7 @@ void normals_loop_custom_set_from_verts(Span vert_positions, Span corner_edges, Span vert_normals, Span face_normals, - const bool *sharp_faces, + Span sharp_faces, MutableSpan sharp_edges, MutableSpan r_custom_vert_normals, MutableSpan r_clnors_data); @@ -209,7 +224,7 @@ void edges_sharp_from_angle_set(OffsetIndices faces, Span corner_edges, Span face_normals, Span loop_to_face, - const bool *sharp_faces, + Span sharp_faces, const float split_angle, MutableSpan sharp_edges); @@ -297,6 +312,9 @@ void mesh_vert_normals_assign(Mesh &mesh, Span vert_normals); /** Set mesh vertex normals to known-correct values, avoiding future lazy computation. */ void mesh_vert_normals_assign(Mesh &mesh, Vector vert_normals); +void mesh_smooth_set(Mesh &mesh, bool use_smooth); +void mesh_sharp_edges_set_from_angle(Mesh &mesh, float angle); + /** Make edge and face visibility consistent with vertices. */ void mesh_hide_vert_flush(Mesh &mesh); /** Make vertex and edge visibility consistent with faces. */ @@ -310,86 +328,3 @@ void mesh_select_edge_flush(Mesh &mesh); void mesh_select_face_flush(Mesh &mesh); } // namespace blender::bke - -/* -------------------------------------------------------------------- */ -/** \name Inline Mesh Data Access - * \{ */ - -inline blender::Span Mesh::vert_positions() const -{ - return {static_cast( - CustomData_get_layer_named(&this->vert_data, CD_PROP_FLOAT3, "position")), - this->totvert}; -} -inline blender::MutableSpan Mesh::vert_positions_for_write() -{ - return {static_cast(CustomData_get_layer_named_for_write( - &this->vert_data, CD_PROP_FLOAT3, "position", this->totvert)), - this->totvert}; -} - -inline blender::Span Mesh::edges() const -{ - return {static_cast( - CustomData_get_layer_named(&this->edge_data, CD_PROP_INT32_2D, ".edge_verts")), - this->totedge}; -} -inline blender::MutableSpan Mesh::edges_for_write() -{ - return {static_cast(CustomData_get_layer_named_for_write( - &this->edge_data, CD_PROP_INT32_2D, ".edge_verts", this->totedge)), - this->totedge}; -} - -inline blender::OffsetIndices Mesh::faces() const -{ - return blender::Span(this->face_offset_indices, this->faces_num + 1); -} -inline blender::Span Mesh::face_offsets() const -{ - if (this->faces_num == 0) { - return {}; - } - return {this->face_offset_indices, this->faces_num + 1}; -} - -inline blender::Span Mesh::corner_verts() const -{ - return {static_cast( - CustomData_get_layer_named(&this->loop_data, CD_PROP_INT32, ".corner_vert")), - this->totloop}; -} -inline blender::MutableSpan Mesh::corner_verts_for_write() -{ - return {static_cast(CustomData_get_layer_named_for_write( - &this->loop_data, CD_PROP_INT32, ".corner_vert", this->totloop)), - this->totloop}; -} - -inline blender::Span Mesh::corner_edges() const -{ - return {static_cast( - CustomData_get_layer_named(&this->loop_data, CD_PROP_INT32, ".corner_edge")), - this->totloop}; -} -inline blender::MutableSpan Mesh::corner_edges_for_write() -{ - return {static_cast(CustomData_get_layer_named_for_write( - &this->loop_data, CD_PROP_INT32, ".corner_edge", this->totloop)), - this->totloop}; -} - -inline blender::Span Mesh::deform_verts() const -{ - const MDeformVert *dverts = BKE_mesh_deform_verts(this); - if (!dverts) { - return {}; - } - return {dverts, this->totvert}; -} -inline blender::MutableSpan Mesh::deform_verts_for_write() -{ - return {BKE_mesh_deform_verts_for_write(this), this->totvert}; -} - -/** \} */ diff --git a/source/blender/blenkernel/BKE_mesh_mapping.hh b/source/blender/blenkernel/BKE_mesh_mapping.hh index 5c7d0220378..1a91e304761 100644 --- a/source/blender/blenkernel/BKE_mesh_mapping.hh +++ b/source/blender/blenkernel/BKE_mesh_mapping.hh @@ -119,8 +119,8 @@ void BKE_mesh_uv_vert_map_free(UvVertMap *vmap); void BKE_mesh_vert_looptri_map_create(MeshElemMap **r_map, int **r_mem, int totvert, - const MLoopTri *mlooptri, - int totlooptri, + const MLoopTri *looptris, + int totlooptris, const int *corner_verts, int totloop); /** @@ -140,14 +140,14 @@ void BKE_mesh_vert_looptri_map_create(MeshElemMap **r_map, void BKE_mesh_origindex_map_create( MeshElemMap **r_map, int **r_mem, int totsource, const int *final_origindex, int totfinal); /** - * A version of #BKE_mesh_origindex_map_create that takes a looptri array. - * Making a face -> looptri map. + * A version of #BKE_mesh_origindex_map_create that takes a #MLoopTri array. + * Making a face -> #MLoopTri map. */ void BKE_mesh_origindex_map_create_looptri(MeshElemMap **r_map, int **r_mem, blender::OffsetIndices faces, const int *looptri_faces, - int looptri_num); + int looptris_num); /* islands */ @@ -248,6 +248,8 @@ bool BKE_mesh_calc_islands_loop_face_uvmap(float (*vert_positions)[3], /** * Calculate smooth groups from sharp edges. * + * \param sharp_edges: Optional (possibly empty) span. + * \param sharp_faces: Optional (possibly empty) span. * \param r_totgroup: The total number of groups, 1 or more. * \return Polygon aligned array of group index values (bitflags if use_bitflags is true), * starting at 1 (0 being used as 'invalid' flag). @@ -256,12 +258,12 @@ bool BKE_mesh_calc_islands_loop_face_uvmap(float (*vert_positions)[3], int *BKE_mesh_calc_smoothgroups(int edges_num, blender::OffsetIndices faces, blender::Span corner_edges, - const bool *sharp_edges, - const bool *sharp_faces, + blender::Span sharp_edges, + blender::Span sharp_faces, int *r_totgroup, bool use_bitflags); -/* use on looptri vertex values */ +/* Use on #MLoopTri vertex values. */ #define BKE_MESH_TESSTRI_VINDEX_ORDER(_tri, _v) \ ((CHECK_TYPE_ANY( \ _tri, unsigned int *, int *, int[3], const unsigned int *, const int *, const int[3]), \ diff --git a/source/blender/blenkernel/BKE_mesh_runtime.hh b/source/blender/blenkernel/BKE_mesh_runtime.hh index 4bc1eaab8f3..cb915886092 100644 --- a/source/blender/blenkernel/BKE_mesh_runtime.hh +++ b/source/blender/blenkernel/BKE_mesh_runtime.hh @@ -21,7 +21,7 @@ struct Object; struct Scene; /** Return the number of derived triangles (looptris). */ -int BKE_mesh_runtime_looptri_len(const Mesh *mesh); +int BKE_mesh_runtime_looptris_len(const Mesh *mesh); void BKE_mesh_runtime_ensure_edit_data(Mesh *mesh); @@ -31,7 +31,7 @@ void BKE_mesh_runtime_ensure_edit_data(Mesh *mesh); * directly or making other large changes to topology. It does not need to be called on new meshes. * * For "smaller" changes to meshes like updating positions, consider calling a more specific update - * function like #BKE_mesh_tag_positions_changed. + * function like #Mesh::tag_positions_changed(). * * Also note that some derived caches like #CD_TANGENT are stored directly in #CustomData. */ @@ -48,10 +48,10 @@ void BKE_mesh_runtime_clear_cache(Mesh *mesh); /** * Convert triangles encoded as face corner indices to triangles encoded as vertex indices. */ -void BKE_mesh_runtime_verttri_from_looptri(MVertTri *r_verttri, - const int *corner_verts, - const MLoopTri *looptri, - int looptri_num); +void BKE_mesh_runtime_verttris_from_looptris(MVertTri *r_verttri, + const int *corner_verts, + const MLoopTri *looptris, + int looptris_num); /* NOTE: the functions below are defined in DerivedMesh.cc, and are intended to be moved * to a more suitable location when that file is removed. diff --git a/source/blender/blenkernel/BKE_mesh_sample.hh b/source/blender/blenkernel/BKE_mesh_sample.hh index baf710b0db1..ec1824de934 100644 --- a/source/blender/blenkernel/BKE_mesh_sample.hh +++ b/source/blender/blenkernel/BKE_mesh_sample.hh @@ -114,29 +114,29 @@ int sample_surface_points_projected( float3 compute_bary_coord_in_triangle(Span vert_positions, Span corner_verts, - const MLoopTri &looptri, + const MLoopTri <, const float3 &position); template inline T sample_corner_attribute_with_bary_coords(const float3 &bary_weights, - const MLoopTri &looptri, + const MLoopTri <, const Span corner_attribute) { return attribute_math::mix3(bary_weights, - corner_attribute[looptri.tri[0]], - corner_attribute[looptri.tri[1]], - corner_attribute[looptri.tri[2]]); + corner_attribute[lt.tri[0]], + corner_attribute[lt.tri[1]], + corner_attribute[lt.tri[2]]); } template inline T sample_corner_attribute_with_bary_coords(const float3 &bary_weights, - const MLoopTri &looptri, + const MLoopTri <, const VArray &corner_attribute) { return attribute_math::mix3(bary_weights, - corner_attribute[looptri.tri[0]], - corner_attribute[looptri.tri[1]], - corner_attribute[looptri.tri[2]]); + corner_attribute[lt.tri[0]], + corner_attribute[lt.tri[1]], + corner_attribute[lt.tri[2]]); } /** diff --git a/source/blender/blenkernel/BKE_mesh_tangent.hh b/source/blender/blenkernel/BKE_mesh_tangent.hh index 59929f1b60f..be17bf205cd 100644 --- a/source/blender/blenkernel/BKE_mesh_tangent.hh +++ b/source/blender/blenkernel/BKE_mesh_tangent.hh @@ -48,10 +48,10 @@ void BKE_mesh_calc_loop_tangent_single(Mesh *mesh, void BKE_mesh_calc_loop_tangent_ex(const float (*vert_positions)[3], blender::OffsetIndices faces, const int *corner_verts, - const MLoopTri *looptri, + const MLoopTri *looptris, const int *looptri_faces, - uint looptri_len, - const bool *sharp_faces, + uint looptris_len, + const blender::Span sharp_faces, CustomData *loopdata, bool calc_active_tangent, diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index e59fc9b6ed4..416a143447f 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -1096,10 +1096,6 @@ void BKE_nodetree_remove_layer_n(struct bNodeTree *ntree, struct Scene *scene, i #define CMP_CHAN_RGB 1 #define CMP_CHAN_A 2 -/* Cryptomatte source. */ -#define CMP_CRYPTOMATTE_SRC_RENDER 0 -#define CMP_CRYPTOMATTE_SRC_IMAGE 1 - /* Default SMAA configuration values. */ #define CMP_DEFAULT_SMAA_THRESHOLD 1.0f #define CMP_DEFAULT_SMAA_CONTRAST_LIMIT 0.2f @@ -1325,6 +1321,7 @@ void BKE_nodetree_remove_layer_n(struct bNodeTree *ntree, struct Scene *scene, i #define GEO_NODE_SPLIT_TO_INSTANCES 2116 #define GEO_NODE_INPUT_NAMED_LAYER_SELECTION 2117 #define GEO_NODE_INDEX_SWITCH 2118 +#define GEO_NODE_INPUT_ACTIVE_CAMERA 2119 /** \} */ diff --git a/source/blender/blenkernel/BKE_node_socket_value.hh b/source/blender/blenkernel/BKE_node_socket_value.hh index 516d12714a7..25eed208dc2 100644 --- a/source/blender/blenkernel/BKE_node_socket_value.hh +++ b/source/blender/blenkernel/BKE_node_socket_value.hh @@ -18,25 +18,23 @@ namespace blender::bke { * Utility class that wraps a single value and a field, to simplify accessing both of the types. * \{ */ -template struct ValueOrField { - using Field = fn::Field; - +template struct SocketValueVariant { /** Value that is used when the field is empty. */ T value{}; - Field field; + fn::Field field; - ValueOrField() = default; + SocketValueVariant() = default; - ValueOrField(T value) : value(std::move(value)) {} + SocketValueVariant(T value) : value(std::move(value)) {} - ValueOrField(Field field) : field(std::move(field)) {} + SocketValueVariant(fn::Field field) : field(std::move(field)) {} bool is_field() const { return bool(this->field); } - Field as_field() const + fn::Field as_field() const { if (this->field) { return this->field; @@ -53,13 +51,13 @@ template struct ValueOrField { return this->value; } - friend std::ostream &operator<<(std::ostream &stream, const ValueOrField &value_or_field) + friend std::ostream &operator<<(std::ostream &stream, const SocketValueVariant &value_variant) { - if (value_or_field.field) { - stream << "ValueOrField"; + if (value_variant.field) { + stream << "SocketValueVariant"; } else { - stream << value_or_field.value; + stream << value_variant.value; } return stream; } diff --git a/source/blender/blenkernel/BKE_node_socket_value_cpp_type.hh b/source/blender/blenkernel/BKE_node_socket_value_cpp_type.hh index 57ba21b3627..5c8d100b5e9 100644 --- a/source/blender/blenkernel/BKE_node_socket_value_cpp_type.hh +++ b/source/blender/blenkernel/BKE_node_socket_value_cpp_type.hh @@ -17,24 +17,24 @@ namespace blender::bke { /* -------------------------------------------------------------------- */ /** \name Socket Value CPP Type Class * - * Contains information about how to deal with a `ValueOrField` generically. + * Contains information about how to deal with a `SocketValueVariant` generically. * \{ */ -class ValueOrFieldCPPType { +class SocketValueVariantCPPType { private: void (*construct_from_value_)(void *dst, const void *value); void (*construct_from_field_)(void *dst, fn::GField field); - const fn::GField *(*get_field_ptr_)(const void *value_or_field); - bool (*is_field_)(const void *value_or_field); - fn::GField (*as_field_)(const void *value_or_field); + const fn::GField *(*get_field_ptr_)(const void *value_variant); + bool (*is_field_)(const void *value_variant); + fn::GField (*as_field_)(const void *value_variant); public: - /** The #ValueOrField itself. */ + /** The #SocketValueVariant itself. */ const CPPType &self; /** The type stored in the field. */ const CPPType &value; - template ValueOrFieldCPPType(TypeTag /*value_type*/); + template SocketValueVariantCPPType(TypeTag /*value_type*/); void construct_from_value(void *dst, const void *value) const { @@ -46,76 +46,76 @@ class ValueOrFieldCPPType { construct_from_field_(dst, field); } - const void *get_value_ptr(const void *value_or_field) const + const void *get_value_ptr(const void *value_variant) const { - static_assert(offsetof(ValueOrField, value) == 0); - return value_or_field; + static_assert(offsetof(SocketValueVariant, value) == 0); + return value_variant; } - void *get_value_ptr(void *value_or_field) const + void *get_value_ptr(void *value_variant) const { - static_assert(offsetof(ValueOrField, value) == 0); - return value_or_field; + static_assert(offsetof(SocketValueVariant, value) == 0); + return value_variant; } - const fn::GField *get_field_ptr(const void *value_or_field) const + const fn::GField *get_field_ptr(const void *value_variant) const { - return get_field_ptr_(value_or_field); + return get_field_ptr_(value_variant); } - bool is_field(const void *value_or_field) const + bool is_field(const void *value_variant) const { - return is_field_(value_or_field); + return is_field_(value_variant); } - fn::GField as_field(const void *value_or_field) const + fn::GField as_field(const void *value_variant) const { - return as_field_(value_or_field); + return as_field_(value_variant); } /** - * Try to find the #ValueOrFieldCPPType that corresponds to a #CPPType. + * Try to find the #SocketValueVariantCPPType that corresponds to a #CPPType. */ - static const ValueOrFieldCPPType *get_from_self(const CPPType &self); + static const SocketValueVariantCPPType *get_from_self(const CPPType &self); /** - * Try to find the #ValueOrFieldCPPType that wraps a #ValueOrField containing the given value - * type. This only works when the type has been created with #FN_FIELD_CPP_TYPE_MAKE. + * Try to find the #SocketValueVariantCPPType that wraps a #SocketValueVariant containing the + * given value type. This only works when the type has been created with #FN_FIELD_CPP_TYPE_MAKE. */ - static const ValueOrFieldCPPType *get_from_value(const CPPType &value); + static const SocketValueVariantCPPType *get_from_value(const CPPType &value); - template static const ValueOrFieldCPPType &get() + template static const SocketValueVariantCPPType &get() { - static const ValueOrFieldCPPType &type = - ValueOrFieldCPPType::get_impl>(); + static const SocketValueVariantCPPType &type = + SocketValueVariantCPPType::get_impl>(); return type; } private: - template static const ValueOrFieldCPPType &get_impl(); + template static const SocketValueVariantCPPType &get_impl(); void register_self(); }; template -inline ValueOrFieldCPPType::ValueOrFieldCPPType(TypeTag /*value_type*/) - : self(CPPType::get>()), value(CPPType::get()) +inline SocketValueVariantCPPType::SocketValueVariantCPPType(TypeTag /*value_type*/) + : self(CPPType::get>()), value(CPPType::get()) { using T = ValueType; - construct_from_value_ = [](void *dst, const void *value_or_field) { - new (dst) ValueOrField(*(const T *)value_or_field); + construct_from_value_ = [](void *dst, const void *value) { + new (dst) SocketValueVariant(*(const T *)value); }; construct_from_field_ = [](void *dst, fn::GField field) { - new (dst) ValueOrField(fn::Field(std::move(field))); + new (dst) SocketValueVariant(fn::Field(std::move(field))); }; - get_field_ptr_ = [](const void *value_or_field) -> const fn::GField * { - return &((ValueOrField *)value_or_field)->field; + get_field_ptr_ = [](const void *value_variant) -> const fn::GField * { + return &((SocketValueVariant *)value_variant)->field; }; - is_field_ = [](const void *value_or_field) { - return ((ValueOrField *)value_or_field)->is_field(); + is_field_ = [](const void *value_variant) { + return ((SocketValueVariant *)value_variant)->is_field(); }; - as_field_ = [](const void *value_or_field) -> fn::GField { - return ((ValueOrField *)value_or_field)->as_field(); + as_field_ = [](const void *value_variant) -> fn::GField { + return ((SocketValueVariant *)value_variant)->as_field(); }; this->register_self(); } @@ -125,18 +125,19 @@ inline ValueOrFieldCPPType::ValueOrFieldCPPType(TypeTag /*value_type* } // namespace blender::bke /** - * Create a new #ValueOrFieldCPPType that can be accessed through `ValueOrFieldCPPType::get()`. + * Create a new #SocketValueVariantCPPType that can be accessed through + * `SocketValueVariantCPPType::get()`. */ #define SOCKET_VALUE_CPP_TYPE_MAKE(VALUE_TYPE) \ - BLI_CPP_TYPE_MAKE(blender::bke::ValueOrField, CPPTypeFlags::Printable) \ + BLI_CPP_TYPE_MAKE(blender::bke::SocketValueVariant, CPPTypeFlags::Printable) \ template<> \ - const blender::bke::ValueOrFieldCPPType & \ - blender::bke::ValueOrFieldCPPType::get_impl() \ + const blender::bke::SocketValueVariantCPPType & \ + blender::bke::SocketValueVariantCPPType::get_impl() \ { \ - static blender::bke::ValueOrFieldCPPType type{blender::TypeTag{}}; \ + static blender::bke::SocketValueVariantCPPType type{blender::TypeTag{}}; \ return type; \ } -/** Register a #ValueOrFieldCPPType created with #FN_FIELD_CPP_TYPE_MAKE. */ +/** Register a #SocketValueVariantCPPType created with #FN_FIELD_CPP_TYPE_MAKE. */ #define SOCKET_VALUE_CPP_TYPE_REGISTER(VALUE_TYPE) \ - blender::bke::ValueOrFieldCPPType::get() + blender::bke::SocketValueVariantCPPType::get() diff --git a/source/blender/blenkernel/BKE_object.hh b/source/blender/blenkernel/BKE_object.hh index db484ffc7fc..493bf63b354 100644 --- a/source/blender/blenkernel/BKE_object.hh +++ b/source/blender/blenkernel/BKE_object.hh @@ -339,10 +339,7 @@ void BKE_object_where_is_calc_mat4(Object *ob, float r_obmat[4][4]); /* Possibly belong in own module? */ -BoundBox *BKE_boundbox_alloc_unit(); void BKE_boundbox_init_from_minmax(BoundBox *bb, const float min[3], const float max[3]); -void BKE_boundbox_calc_center_aabb(const BoundBox *bb, float r_cent[3]); -void BKE_boundbox_calc_size_aabb(const BoundBox *bb, float r_size[3]); void BKE_boundbox_minmax(const BoundBox *bb, const float obmat[4][4], float r_min[3], diff --git a/source/blender/blenkernel/BKE_paint.hh b/source/blender/blenkernel/BKE_paint.hh index 43451f9c750..59e12247d89 100644 --- a/source/blender/blenkernel/BKE_paint.hh +++ b/source/blender/blenkernel/BKE_paint.hh @@ -809,27 +809,6 @@ BLI_INLINE void *BKE_sculpt_vertex_attr_get(const PBVHVertRef vertex, const Scul return NULL; } -BLI_INLINE void *BKE_sculpt_face_attr_get(const PBVHFaceRef vertex, const SculptAttribute *attr) -{ - if (attr->data) { - char *p = (char *)attr->data; - int idx = (int)vertex.i; - - if (attr->data_for_bmesh) { - BMElem *v = (BMElem *)vertex.i; - idx = v->head.index; - } - - return p + attr->elem_size * (int)idx; - } - else { - BMElem *v = (BMElem *)vertex.i; - return BM_ELEM_CD_GET_VOID_P(v, attr->bmesh_cd_offset); - } - - return NULL; -} - /** * Create new color layer on object if it doesn't have one and if experimental feature set has * sculpt vertex color enabled. Returns truth if new layer has been added, false otherwise. diff --git a/source/blender/blenkernel/BKE_pbvh.hh b/source/blender/blenkernel/BKE_pbvh.hh index 6a9a0858b0f..15b184db036 100644 --- a/source/blender/blenkernel/BKE_pbvh.hh +++ b/source/blender/blenkernel/BKE_pbvh.hh @@ -65,20 +65,6 @@ struct PBVHVertRef { PBVH_REF_CXX_METHODS(PBVHVertRef) }; -/* NOTE: edges in PBVH_GRIDS are always pulled from the base mesh. */ -struct PBVHEdgeRef { - intptr_t i; - - PBVH_REF_CXX_METHODS(PBVHVertRef) -}; - -/* NOTE: faces in PBVH_GRIDS are always puled from the base mesh. */ -struct PBVHFaceRef { - intptr_t i; - - PBVH_REF_CXX_METHODS(PBVHVertRef) -}; - #define PBVH_REF_NONE -1LL /* Public members of PBVH, used for inlined functions. */ diff --git a/source/blender/blenkernel/BKE_pbvh_api.hh b/source/blender/blenkernel/BKE_pbvh_api.hh index 7a454983b04..fd47624d961 100644 --- a/source/blender/blenkernel/BKE_pbvh_api.hh +++ b/source/blender/blenkernel/BKE_pbvh_api.hh @@ -111,18 +111,6 @@ BLI_INLINE PBVHVertRef BKE_pbvh_make_vref(intptr_t i) return ret; } -BLI_INLINE PBVHEdgeRef BKE_pbvh_make_eref(intptr_t i) -{ - PBVHEdgeRef ret = {i}; - return ret; -} - -BLI_INLINE PBVHFaceRef BKE_pbvh_make_fref(intptr_t i) -{ - PBVHFaceRef ret = {i}; - return ret; -} - BLI_INLINE int BKE_pbvh_vertex_to_index(PBVH *pbvh, PBVHVertRef v) { return (BKE_pbvh_type(pbvh) == PBVH_BMESH && v.i != PBVH_REF_NONE ? @@ -143,46 +131,6 @@ BLI_INLINE PBVHVertRef BKE_pbvh_index_to_vertex(PBVH *pbvh, int index) return BKE_pbvh_make_vref(PBVH_REF_NONE); } -BLI_INLINE int BKE_pbvh_edge_to_index(PBVH *pbvh, PBVHEdgeRef e) -{ - return (BKE_pbvh_type(pbvh) == PBVH_BMESH && e.i != PBVH_REF_NONE ? - BM_elem_index_get((BMEdge *)(e.i)) : - (e.i)); -} - -BLI_INLINE PBVHEdgeRef BKE_pbvh_index_to_edge(PBVH *pbvh, int index) -{ - switch (BKE_pbvh_type(pbvh)) { - case PBVH_FACES: - case PBVH_GRIDS: - return BKE_pbvh_make_eref(index); - case PBVH_BMESH: - return BKE_pbvh_make_eref((intptr_t)BKE_pbvh_get_bmesh(pbvh)->etable[index]); - } - - return BKE_pbvh_make_eref(PBVH_REF_NONE); -} - -BLI_INLINE int BKE_pbvh_face_to_index(PBVH *pbvh, PBVHFaceRef f) -{ - return (BKE_pbvh_type(pbvh) == PBVH_BMESH && f.i != PBVH_REF_NONE ? - BM_elem_index_get((BMFace *)(f.i)) : - (f.i)); -} - -BLI_INLINE PBVHFaceRef BKE_pbvh_index_to_face(PBVH *pbvh, int index) -{ - switch (BKE_pbvh_type(pbvh)) { - case PBVH_FACES: - case PBVH_GRIDS: - return BKE_pbvh_make_fref(index); - case PBVH_BMESH: - return BKE_pbvh_make_fref((intptr_t)BKE_pbvh_get_bmesh(pbvh)->ftable[index]); - } - - return BKE_pbvh_make_fref(PBVH_REF_NONE); -} - /* Callbacks */ /** @@ -193,24 +141,23 @@ using BKE_pbvh_HitCallback = void (*)(PBVHNode *node, void *data); using BKE_pbvh_HitOccludedCallback = void (*)(PBVHNode *node, void *data, float *tmin); using BKE_pbvh_SearchNearestCallback = void (*)(PBVHNode *node, void *data, float *tmin); -/* Building */ - -PBVH *BKE_pbvh_new(PBVHType type); +namespace blender::bke::pbvh { /** * Do a full rebuild with on Mesh data structure. */ -void BKE_pbvh_build_mesh(PBVH *pbvh, Mesh *mesh); -void BKE_pbvh_update_mesh_pointers(PBVH *pbvh, Mesh *mesh); +PBVH *build_mesh(Mesh *mesh); +void update_mesh_pointers(PBVH *pbvh, Mesh *mesh); /** * Do a full rebuild with on Grids data structure. */ -void BKE_pbvh_build_grids(PBVH *pbvh, const CCGKey *key, Mesh *mesh, SubdivCCG *subdiv_ccg); +PBVH *build_grids(const CCGKey *key, Mesh *mesh, SubdivCCG *subdiv_ccg); /** * Build a PBVH from a BMesh. */ -void BKE_pbvh_build_bmesh( - PBVH *pbvh, BMesh *bm, BMLog *log, int cd_vert_node_offset, int cd_face_node_offset); +PBVH *build_bmesh(BMesh *bm, BMLog *log, int cd_vert_node_offset, int cd_face_node_offset); + +} // namespace blender::bke::pbvh void BKE_pbvh_update_bmesh_offsets(PBVH *pbvh, int cd_vert_node_offset, int cd_face_node_offset); @@ -244,7 +191,7 @@ bool BKE_pbvh_node_raycast(PBVH *pbvh, float (*origco)[3], bool use_origco, blender::Span corner_verts, - const bool *hide_poly, + blender::Span hide_poly, const float ray_start[3], const float ray_normal[3], IsectRayPrecalc *isect_precalc, @@ -284,7 +231,7 @@ bool BKE_pbvh_node_find_nearest_to_ray(PBVH *pbvh, float (*origco)[3], bool use_origco, blender::Span corner_verts, - const bool *hide_poly, + blender::Span hide_poly, const float ray_start[3], const float ray_normal[3], float *depth, @@ -314,14 +261,17 @@ blender::Bounds BKE_pbvh_bounding_box(const PBVH *pbvh); void BKE_pbvh_sync_visibility_from_verts(PBVH *pbvh, Mesh *mesh); +namespace blender::bke::pbvh { + /** * Returns the number of visible quads in the nodes' grids. */ -int BKE_pbvh_count_grid_quads(const blender::BitGroupVector<> &grid_visibility, - const int *grid_indices, - int totgrid, - int gridsize, - int display_gridsize); +int count_grid_quads(const BitGroupVector<> &grid_visibility, + Span grid_indices, + int gridsize, + int display_gridsize); + +} // namespace blender::bke::pbvh /** * Multi-res level, only valid for type == #PBVH_GRIDS. @@ -376,18 +326,27 @@ void BKE_pbvh_vert_tag_update_normal(PBVH *pbvh, PBVHVertRef vertex); blender::Span BKE_pbvh_node_get_grid_indices(const PBVHNode &node); -void BKE_pbvh_node_num_verts(const PBVH *pbvh, - const PBVHNode *node, - int *r_uniquevert, - int *r_totvert); int BKE_pbvh_node_num_unique_verts(const PBVH &pbvh, const PBVHNode &node); blender::Span BKE_pbvh_node_get_vert_indices(const PBVHNode *node); blender::Span BKE_pbvh_node_get_unique_vert_indices(const PBVHNode *node); -void BKE_pbvh_node_get_loops(const PBVHNode *node, const int **r_loop_indices); +blender::Span BKE_pbvh_node_get_loops(const PBVHNode *node); + +namespace blender::bke::pbvh { + +/** + * Gather the indices of all faces (not triangles) used by the node. + * For convenience, pass a reference to the data in the result. + */ +Span node_face_indices_calc_mesh(const PBVH &pbvh, const PBVHNode &node, Vector &faces); + +/** + * Gather the indices of all base mesh faces in the node. + * For convenience, pass a reference to the data in the result. + */ +Span node_face_indices_calc_grids(const PBVH &pbvh, const PBVHNode &node, Vector &faces); + +} // namespace blender::bke::pbvh -void BKE_pbvh_node_calc_face_indices(const PBVH &pbvh, - const PBVHNode &node, - blender::Vector &faces); blender::Vector BKE_pbvh_node_calc_face_indices(const PBVH &pbvh, const PBVHNode &node); /* Get number of faces in the mesh; for PBVH_GRIDS the @@ -422,13 +381,13 @@ const blender::Set &BKE_pbvh_bmesh_node_faces(PBVHNode *node); void BKE_pbvh_bmesh_node_save_orig(BMesh *bm, BMLog *log, PBVHNode *node, bool use_original); void BKE_pbvh_bmesh_after_stroke(PBVH *pbvh); -/* Update Bounding Box/Redraw and clear flags. */ +namespace blender::bke::pbvh { +void update_bounds(PBVH &pbvh, int flags); +void update_mask(PBVH &pbvh); +void update_visibility(PBVH &pbvh); +void update_normals(PBVH &pbvh, SubdivCCG *subdiv_ccg); +} // namespace blender::bke::pbvh -void BKE_pbvh_update_bounds(PBVH *pbvh, int flags); -void BKE_pbvh_update_mask(PBVH *pbvh); -void BKE_pbvh_update_vertex_data(PBVH *pbvh, int flags); -void BKE_pbvh_update_visibility(PBVH *pbvh); -void BKE_pbvh_update_normals(PBVH *pbvh, SubdivCCG *subdiv_ccg); blender::Bounds BKE_pbvh_redraw_BB(PBVH *pbvh); blender::IndexMask BKE_pbvh_get_grid_updates(const PBVH *pbvh, blender::Span nodes, @@ -593,19 +552,10 @@ void BKE_pbvh_node_get_bm_orco_data(PBVHNode *node, */ bool BKE_pbvh_node_has_vert_with_normal_update_tag(PBVH *pbvh, PBVHNode *node); -// void BKE_pbvh_node_BB_reset(PBVHNode *node); -// void BKE_pbvh_node_BB_expand(PBVHNode *node, float co[3]); - bool pbvh_has_mask(const PBVH *pbvh); bool pbvh_has_face_sets(PBVH *pbvh); -/* Parallelization. */ - -void BKE_pbvh_parallel_range_settings(TaskParallelSettings *settings, - bool use_threading, - int totnode); - blender::Span BKE_pbvh_get_vert_positions(const PBVH *pbvh); blender::MutableSpan BKE_pbvh_get_vert_positions(PBVH *pbvh); blender::Span BKE_pbvh_get_vert_normals(const PBVH *pbvh); @@ -633,9 +583,6 @@ void BKE_pbvh_store_colors_vertex(PBVH *pbvh, bool BKE_pbvh_is_drawing(const PBVH *pbvh); -/* Do not call in PBVH_GRIDS mode */ -void BKE_pbvh_node_num_loops(PBVH *pbvh, PBVHNode *node, int *r_totloop); - void BKE_pbvh_update_active_vcol(PBVH *pbvh, Mesh *mesh); void BKE_pbvh_vertex_color_set(PBVH *pbvh, PBVHVertRef vertex, const float color[4]); diff --git a/source/blender/blenkernel/BKE_pbvh_pixels.hh b/source/blender/blenkernel/BKE_pbvh_pixels.hh index 0e4e37604fd..5ca3f17a1e3 100644 --- a/source/blender/blenkernel/BKE_pbvh_pixels.hh +++ b/source/blender/blenkernel/BKE_pbvh_pixels.hh @@ -200,7 +200,7 @@ struct NodeData { { undo_regions.clear(); for (UDIMTilePixels &tile : tiles) { - if (tile.pixel_rows.size() == 0) { + if (tile.pixel_rows.is_empty()) { continue; } diff --git a/source/blender/blenkernel/BKE_studiolight.h b/source/blender/blenkernel/BKE_studiolight.h index b8cd8bbea40..275d1a01520 100644 --- a/source/blender/blenkernel/BKE_studiolight.h +++ b/source/blender/blenkernel/BKE_studiolight.h @@ -22,18 +22,6 @@ extern "C" { struct ImBuf; -/* - * These defines are the indexes in the StudioLight.diffuse_light - * X_POS means the light that is traveling towards the positive X - * So Light direction. - */ -#define STUDIOLIGHT_X_POS 0 -#define STUDIOLIGHT_X_NEG 1 -#define STUDIOLIGHT_Y_POS 2 -#define STUDIOLIGHT_Y_NEG 3 -#define STUDIOLIGHT_Z_POS 4 -#define STUDIOLIGHT_Z_NEG 5 - #define STUDIOLIGHT_ICON_ID_TYPE_RADIANCE (1 << 0) #define STUDIOLIGHT_ICON_ID_TYPE_IRRADIANCE (1 << 1) #define STUDIOLIGHT_ICON_ID_TYPE_MATCAP (1 << 2) @@ -43,42 +31,25 @@ struct ImBuf; #define STUDIOLIGHT_ICON_SIZE 96 -/* Only 1 - 5 is supported */ -#define STUDIOLIGHT_SH_BANDS 2 - -#define STUDIOLIGHT_SH_COEFS_LEN (STUDIOLIGHT_SH_BANDS * STUDIOLIGHT_SH_BANDS) - -#if STUDIOLIGHT_SH_BANDS > 3 -/* Bypass L3 */ -# define STUDIOLIGHT_SH_EFFECTIVE_COEFS_LEN (STUDIOLIGHT_SH_COEFS_LEN - 7) -#else -# define STUDIOLIGHT_SH_EFFECTIVE_COEFS_LEN STUDIOLIGHT_SH_COEFS_LEN -#endif - struct GPUTexture; struct StudioLight; /** #StudioLight.flag */ enum StudioLightFlag { - STUDIOLIGHT_SPHERICAL_HARMONICS_COEFFICIENTS_CALCULATED = (1 << 0), - /* STUDIOLIGHT_LIGHT_DIRECTION_CALCULATED = (1 << 1), */ - STUDIOLIGHT_INTERNAL = (1 << 2), - STUDIOLIGHT_EXTERNAL_FILE = (1 << 3), - STUDIOLIGHT_TYPE_STUDIO = (1 << 4), - STUDIOLIGHT_TYPE_WORLD = (1 << 5), - STUDIOLIGHT_TYPE_MATCAP = (1 << 6), - STUDIOLIGHT_EXTERNAL_IMAGE_LOADED = (1 << 7), - STUDIOLIGHT_EQUIRECT_IRRADIANCE_IMAGE_CALCULATED = (1 << 8), - STUDIOLIGHT_EQUIRECT_RADIANCE_GPUTEXTURE = (1 << 9), - STUDIOLIGHT_EQUIRECT_IRRADIANCE_GPUTEXTURE = (1 << 10), - STUDIOLIGHT_RADIANCE_BUFFERS_CALCULATED = (1 << 11), - STUDIOLIGHT_USER_DEFINED = (1 << 12), - STUDIOLIGHT_UI_EXPANDED = (1 << 13), + STUDIOLIGHT_INTERNAL = (1 << 0), + STUDIOLIGHT_EXTERNAL_FILE = (1 << 1), + STUDIOLIGHT_TYPE_STUDIO = (1 << 2), + STUDIOLIGHT_TYPE_WORLD = (1 << 3), + STUDIOLIGHT_TYPE_MATCAP = (1 << 4), + STUDIOLIGHT_EXTERNAL_IMAGE_LOADED = (1 << 5), + /** GPU Texture used for lookdev mode. */ + STUDIOLIGHT_EQUIRECT_RADIANCE_GPUTEXTURE = (1 << 6), + STUDIOLIGHT_USER_DEFINED = (1 << 7), - STUDIOLIGHT_MATCAP_DIFFUSE_GPUTEXTURE = (1 << 14), - STUDIOLIGHT_MATCAP_SPECULAR_GPUTEXTURE = (1 << 15), + STUDIOLIGHT_MATCAP_DIFFUSE_GPUTEXTURE = (1 << 8), + STUDIOLIGHT_MATCAP_SPECULAR_GPUTEXTURE = (1 << 9), /* Is set for studio lights and matcaps with specular highlight pass. */ - STUDIOLIGHT_SPECULAR_HIGHLIGHT_PASS = (1 << 16), + STUDIOLIGHT_SPECULAR_HIGHLIGHT_PASS = (1 << 10), }; #define STUDIOLIGHT_FLAG_ALL (STUDIOLIGHT_INTERNAL | STUDIOLIGHT_EXTERNAL_FILE) @@ -101,21 +72,14 @@ typedef struct StudioLight { int flag; char name[FILE_MAXFILE]; char filepath[FILE_MAX]; - char *path_irr_cache; - char *path_sh_cache; int icon_id_irradiance; int icon_id_radiance; int icon_id_matcap; int icon_id_matcap_flipped; - float spherical_harmonics_coefs[STUDIOLIGHT_SH_EFFECTIVE_COEFS_LEN][3]; - float light_direction[3]; StudioLightImage matcap_diffuse; StudioLightImage matcap_specular; struct ImBuf *equirect_radiance_buffer; - struct ImBuf *equirect_irradiance_buffer; - struct ImBuf *radiance_cubemap_buffers[6]; struct GPUTexture *equirect_radiance_gputexture; - struct GPUTexture *equirect_irradiance_gputexture; SolidLight light[STUDIOLIGHT_MAX_LIGHT]; float light_ambient[3]; diff --git a/source/blender/blenkernel/BKE_subdiv_ccg.hh b/source/blender/blenkernel/BKE_subdiv_ccg.hh index 513e1d4d1ac..42673f5e81f 100644 --- a/source/blender/blenkernel/BKE_subdiv_ccg.hh +++ b/source/blender/blenkernel/BKE_subdiv_ccg.hh @@ -10,6 +10,13 @@ #include +namespace blender { +namespace index_mask { +class IndexMask; +} +using index_mask::IndexMask; +} // namespace blender + #include "BLI_array.hh" #include "BLI_bit_group_vector.hh" #include "BLI_offset_indices.hh" diff --git a/source/blender/blenkernel/BKE_volume_to_mesh.hh b/source/blender/blenkernel/BKE_volume_to_mesh.hh index 5cdf3a44212..c730da46487 100644 --- a/source/blender/blenkernel/BKE_volume_to_mesh.hh +++ b/source/blender/blenkernel/BKE_volume_to_mesh.hh @@ -58,9 +58,9 @@ struct OpenVDBMeshData volume_to_mesh_data(const openvdb::GridBase &grid, * This can be used to add mesh data from a grid into an existing mesh rather than merging multiple * meshes later on. */ -void fill_mesh_from_openvdb_data(const Span vdb_verts, - const Span vdb_tris, - const Span vdb_quads, +void fill_mesh_from_openvdb_data(Span vdb_verts, + Span vdb_tris, + Span vdb_quads, int vert_offset, int face_offset, int loop_offset, diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index 92645ae1d65..435266ec0b6 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -341,8 +341,8 @@ set(SRC BKE_blender_undo.h BKE_blender_user_menu.h BKE_blender_version.h - BKE_blendfile.h - BKE_blendfile_link_append.h + BKE_blendfile.hh + BKE_blendfile_link_append.hh BKE_boids.h BKE_bpath.h BKE_brush.hh diff --git a/source/blender/blenkernel/intern/DerivedMesh.cc b/source/blender/blenkernel/intern/DerivedMesh.cc index a76ff71c782..81bb7628da5 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.cc +++ b/source/blender/blenkernel/intern/DerivedMesh.cc @@ -393,7 +393,7 @@ static Mesh *create_orco_mesh(Object *ob, Mesh *mesh, BMEditMesh *em, int layer) if (orco) { orco_mesh->vert_positions_for_write().copy_from( {reinterpret_cast(orco), orco_mesh->totvert}); - BKE_mesh_tag_positions_changed(orco_mesh); + orco_mesh->tag_positions_changed(); if (free) { MEM_freeN(orco); } @@ -1161,7 +1161,7 @@ static void editbmesh_calc_modifiers(Depsgraph *depsgraph, else { BKE_mesh_wrapper_ensure_mdata(mesh_final); BKE_modifier_deform_verts(md, &mectx, mesh_final, mesh_final->vert_positions_for_write()); - BKE_mesh_tag_positions_changed(mesh_final); + mesh_final->tag_positions_changed(); } } else { diff --git a/source/blender/blenkernel/intern/armature.cc b/source/blender/blenkernel/intern/armature.cc index 595a2142b55..af782a5413b 100644 --- a/source/blender/blenkernel/intern/armature.cc +++ b/source/blender/blenkernel/intern/armature.cc @@ -320,8 +320,8 @@ static void armature_blend_write(BlendWriter *writer, ID *id, const void *id_add arm->collection_array[i]->next = arm->collection_array[i + 1]; arm->collection_array[i + 1]->prev = arm->collection_array[i]; } - arm->collections.first = arm->collection_array[0]; - arm->collections.last = arm->collection_array[arm->collection_array_num - 1]; + arm->collections_legacy.first = arm->collection_array[0]; + arm->collections_legacy.last = arm->collection_array[arm->collection_array_num - 1]; arm->collection_array = nullptr; } @@ -333,7 +333,7 @@ static void armature_blend_write(BlendWriter *writer, ID *id, const void *id_add write_bone(writer, bone); } - LISTBASE_FOREACH (BoneCollection *, bcoll, &arm->collections) { + LISTBASE_FOREACH (BoneCollection *, bcoll, &arm->collections_legacy) { write_bone_collection(writer, bcoll); } @@ -343,7 +343,7 @@ static void armature_blend_write(BlendWriter *writer, ID *id, const void *id_add arm->collection_array[i]->next = nullptr; arm->collection_array[i + 1]->prev = nullptr; } - BLI_listbase_clear(&arm->collections); + BLI_listbase_clear(&arm->collections_legacy); arm->runtime = runtime_backup; } @@ -382,13 +382,13 @@ static void direct_link_bone_collection(BlendDataReader *reader, BoneCollection static void read_bone_collections(BlendDataReader *reader, bArmature *arm) { /* Read as listbase, but convert to an array on the armature. */ - BLO_read_list(reader, &arm->collections); - arm->collection_array_num = BLI_listbase_count(&arm->collections); + BLO_read_list(reader, &arm->collections_legacy); + arm->collection_array_num = BLI_listbase_count(&arm->collections_legacy); arm->collection_array = (BoneCollection **)MEM_malloc_arrayN( arm->collection_array_num, sizeof(BoneCollection *), __func__); { int i; - LISTBASE_FOREACH_INDEX (BoneCollection *, bcoll, &arm->collections, i) { + LISTBASE_FOREACH_INDEX (BoneCollection *, bcoll, &arm->collections_legacy, i) { arm->collection_array[i] = bcoll; } } @@ -399,7 +399,7 @@ static void read_bone_collections(BlendDataReader *reader, bArmature *arm) arm->collection_array[i]->next = nullptr; arm->collection_array[i + 1]->prev = nullptr; } - BLI_listbase_clear(&arm->collections); + BLI_listbase_clear(&arm->collections_legacy); /* Bone collections added via an override can be edited, but ones that already exist in another diff --git a/source/blender/blenkernel/intern/armature_deform.cc b/source/blender/blenkernel/intern/armature_deform.cc index 5c958fbcf20..526a8195376 100644 --- a/source/blender/blenkernel/intern/armature_deform.cc +++ b/source/blender/blenkernel/intern/armature_deform.cc @@ -520,7 +520,7 @@ static void armature_deform_coords_impl(const Object *ob_arm, target_data_id = me_target == nullptr ? (const ID *)ob_target->data : &me_target->id; if (em_target == nullptr) { const Mesh *mesh = (const Mesh *)target_data_id; - dverts = BKE_mesh_deform_verts(mesh); + dverts = mesh->deform_verts().data(); if (dverts) { dverts_len = mesh->totvert; } @@ -555,7 +555,7 @@ static void armature_deform_coords_impl(const Object *ob_arm, use_dverts = (cd_dvert_offset != -1); } else if (me_target) { - use_dverts = (BKE_mesh_deform_verts(me_target) != nullptr); + use_dverts = !me_target->deform_verts().is_empty(); } else if (dverts) { use_dverts = true; diff --git a/source/blender/blenkernel/intern/bake_items_socket.cc b/source/blender/blenkernel/intern/bake_items_socket.cc index 8f6969261f7..fad08ceeb87 100644 --- a/source/blender/blenkernel/intern/bake_items_socket.cc +++ b/source/blender/blenkernel/intern/bake_items_socket.cc @@ -48,8 +48,8 @@ Array> move_socket_values_to_bake_items(const Span &value = *static_cast *>( - socket_value); + const SocketValueVariant &value = + *static_cast *>(socket_value); bake_items[i] = std::make_unique(value.as_value()); break; } @@ -60,14 +60,15 @@ Array> move_socket_values_to_bake_items(const Span(base_type, value); break; } - const fn::GField &field = *value_or_field_type.get_field_ptr(socket_value); + const fn::GField &field = *value_variant_type.get_field_ptr(socket_value); if (!field.node().depends_on_input()) { BUFFER_FOR_CPP_TYPE_VALUE(base_type, value); fn::evaluate_constant_field(field, value); @@ -144,11 +145,12 @@ Array> move_socket_values_to_bake_items(const Span(&bake_item)) { if (item->type() == base_type) { - value_or_field_type.construct_from_value(r_value, item->value()); + value_variant_type.construct_from_value(r_value, item->value()); return true; } return false; @@ -158,7 +160,7 @@ Array> move_socket_values_to_bake_items(const Spananonymous_id(); fn::GField field{attribute_field}; - value_or_field_type.construct_from_field(r_value, std::move(field)); + value_variant_type.construct_from_field(r_value, std::move(field)); r_attribute_map.add(item->name(), attribute_id); return true; } @@ -166,7 +168,7 @@ Array> move_socket_values_to_bake_items(const Span(&bake_item)) { - new (r_value) ValueOrField(item->value()); + new (r_value) SocketValueVariant(item->value()); return true; } return false; diff --git a/source/blender/blenkernel/intern/blender.cc b/source/blender/blenkernel/intern/blender.cc index dbfbde97c2f..ac2c138179c 100644 --- a/source/blender/blenkernel/intern/blender.cc +++ b/source/blender/blenkernel/intern/blender.cc @@ -25,7 +25,7 @@ #include "BKE_blender.h" /* own include */ #include "BKE_blender_user_menu.h" #include "BKE_blender_version.h" /* own include */ -#include "BKE_blendfile.h" +#include "BKE_blendfile.hh" #include "BKE_brush.hh" #include "BKE_cachefile.h" #include "BKE_callbacks.h" diff --git a/source/blender/blenkernel/intern/blender_copybuffer.cc b/source/blender/blenkernel/intern/blender_copybuffer.cc index c178d576d44..74c7a681a2c 100644 --- a/source/blender/blenkernel/intern/blender_copybuffer.cc +++ b/source/blender/blenkernel/intern/blender_copybuffer.cc @@ -25,8 +25,8 @@ #include "IMB_moviecache.h" #include "BKE_blender_copybuffer.h" /* own include */ -#include "BKE_blendfile.h" -#include "BKE_blendfile_link_append.h" +#include "BKE_blendfile.hh" +#include "BKE_blendfile_link_append.hh" #include "BKE_context.hh" #include "BKE_global.h" #include "BKE_layer.h" diff --git a/source/blender/blenkernel/intern/blender_undo.cc b/source/blender/blenkernel/intern/blender_undo.cc index f6e435c7abc..049335c5408 100644 --- a/source/blender/blenkernel/intern/blender_undo.cc +++ b/source/blender/blenkernel/intern/blender_undo.cc @@ -32,7 +32,7 @@ #include "BKE_appdir.h" #include "BKE_blender_undo.h" /* own include */ -#include "BKE_blendfile.h" +#include "BKE_blendfile.hh" #include "BKE_context.hh" #include "BKE_global.h" #include "BKE_main.hh" diff --git a/source/blender/blenkernel/intern/blendfile.cc b/source/blender/blenkernel/intern/blendfile.cc index ae2cbf6ad26..b53875cf82f 100644 --- a/source/blender/blenkernel/intern/blendfile.cc +++ b/source/blender/blenkernel/intern/blendfile.cc @@ -34,7 +34,7 @@ #include "BKE_appdir.h" #include "BKE_blender.h" #include "BKE_blender_version.h" -#include "BKE_blendfile.h" +#include "BKE_blendfile.hh" #include "BKE_bpath.h" #include "BKE_colorband.h" #include "BKE_context.hh" diff --git a/source/blender/blenkernel/intern/blendfile_link_append.cc b/source/blender/blenkernel/intern/blendfile_link_append.cc index 5f221417a26..c8cde149366 100644 --- a/source/blender/blenkernel/intern/blendfile_link_append.cc +++ b/source/blender/blenkernel/intern/blendfile_link_append.cc @@ -50,7 +50,7 @@ #include "BKE_rigidbody.h" #include "BKE_scene.h" -#include "BKE_blendfile_link_append.h" +#include "BKE_blendfile_link_append.hh" #include "BLO_readfile.h" #include "BLO_writefile.hh" diff --git a/source/blender/blenkernel/intern/bvhutils.cc b/source/blender/blenkernel/intern/bvhutils.cc index 7ba97117711..187fedcdc4c 100644 --- a/source/blender/blenkernel/intern/bvhutils.cc +++ b/source/blender/blenkernel/intern/bvhutils.cc @@ -269,10 +269,10 @@ static void mesh_faces_nearest_point(void *userdata, } while (t2); } /* copy of function above */ -static void mesh_looptri_nearest_point(void *userdata, - int index, - const float co[3], - BVHTreeNearest *nearest) +static void mesh_looptris_nearest_point(void *userdata, + int index, + const float co[3], + BVHTreeNearest *nearest) { const BVHTreeFromMesh *data = (BVHTreeFromMesh *)userdata; const MLoopTri *lt = &data->looptris[index]; @@ -294,10 +294,10 @@ static void mesh_looptri_nearest_point(void *userdata, } } /* Copy of function above (warning, should de-duplicate with `editmesh_bvh.cc`). */ -static void editmesh_looptri_nearest_point(void *userdata, - int index, - const float co[3], - BVHTreeNearest *nearest) +static void editmesh_looptris_nearest_point(void *userdata, + int index, + const float co[3], + BVHTreeNearest *nearest) { BMEditMesh *em = static_cast(userdata); const BMLoop **ltri = (const BMLoop **)em->looptris[index]; @@ -366,10 +366,10 @@ static void mesh_faces_spherecast(void *userdata, } while (t2); } /* copy of function above */ -static void mesh_looptri_spherecast(void *userdata, - int index, - const BVHTreeRay *ray, - BVHTreeRayHit *hit) +static void mesh_looptris_spherecast(void *userdata, + int index, + const BVHTreeRay *ray, + BVHTreeRayHit *hit) { const BVHTreeFromMesh *data = (BVHTreeFromMesh *)userdata; const Span positions = data->vert_positions; @@ -397,10 +397,10 @@ static void mesh_looptri_spherecast(void *userdata, } } /* Copy of function above (warning, should de-duplicate with `editmesh_bvh.cc`). */ -static void editmesh_looptri_spherecast(void *userdata, - int index, - const BVHTreeRay *ray, - BVHTreeRayHit *hit) +static void editmesh_looptris_spherecast(void *userdata, + int index, + const BVHTreeRay *ray, + BVHTreeRayHit *hit) { BMEditMesh *em = static_cast(userdata); const BMLoop **ltri = (const BMLoop **)em->looptris[index]; @@ -609,14 +609,14 @@ static void bvhtree_from_mesh_setup_data(BVHTree *tree, r_data->nearest_callback = mesh_faces_nearest_point; r_data->raycast_callback = mesh_faces_spherecast; break; - case BVHTREE_FROM_LOOPTRI: - case BVHTREE_FROM_LOOPTRI_NO_HIDDEN: - r_data->nearest_callback = mesh_looptri_nearest_point; - r_data->raycast_callback = mesh_looptri_spherecast; + case BVHTREE_FROM_LOOPTRIS: + case BVHTREE_FROM_LOOPTRIS_NO_HIDDEN: + r_data->nearest_callback = mesh_looptris_nearest_point; + r_data->raycast_callback = mesh_looptris_spherecast; break; case BVHTREE_FROM_EM_LOOSEVERTS: case BVHTREE_FROM_EM_EDGES: - case BVHTREE_FROM_EM_LOOPTRI: + case BVHTREE_FROM_EM_LOOPTRIS: case BVHTREE_MAX_ITEM: BLI_assert(false); break; @@ -640,9 +640,9 @@ static void bvhtree_from_editmesh_setup_data(BVHTree *tree, r_data->nearest_callback = nullptr; /* TODO */ r_data->raycast_callback = nullptr; /* TODO */ break; - case BVHTREE_FROM_EM_LOOPTRI: - r_data->nearest_callback = editmesh_looptri_nearest_point; - r_data->raycast_callback = editmesh_looptri_spherecast; + case BVHTREE_FROM_EM_LOOPTRIS: + r_data->nearest_callback = editmesh_looptris_nearest_point; + r_data->raycast_callback = editmesh_looptris_spherecast; break; case BVHTREE_FROM_VERTS: @@ -650,8 +650,8 @@ static void bvhtree_from_editmesh_setup_data(BVHTree *tree, case BVHTREE_FROM_EDGES: case BVHTREE_FROM_LOOSEEDGES: case BVHTREE_FROM_FACES: - case BVHTREE_FROM_LOOPTRI: - case BVHTREE_FROM_LOOPTRI_NO_HIDDEN: + case BVHTREE_FROM_LOOPTRIS: + case BVHTREE_FROM_LOOPTRIS_NO_HIDDEN: case BVHTREE_MAX_ITEM: BLI_assert(false); break; @@ -943,16 +943,16 @@ static BVHTree *bvhtree_from_mesh_faces_create_tree(float epsilon, /** \name LoopTri Face Builder * \{ */ -static BVHTree *bvhtree_from_editmesh_looptri_create_tree(float epsilon, - int tree_type, - int axis, - BMEditMesh *em, - const BitSpan looptri_mask, - int looptri_num_active) +static BVHTree *bvhtree_from_editmesh_looptris_create_tree(float epsilon, + int tree_type, + int axis, + BMEditMesh *em, + const BitSpan looptris_mask, + int looptris_num_active) { - const int looptri_num = em->tottri; + const int looptris_num = em->tottri; - BVHTree *tree = bvhtree_new_common(epsilon, tree_type, axis, looptri_num, looptri_num_active); + BVHTree *tree = bvhtree_new_common(epsilon, tree_type, axis, looptris_num, looptris_num_active); if (!tree) { return nullptr; } @@ -963,9 +963,9 @@ static BVHTree *bvhtree_from_editmesh_looptri_create_tree(float epsilon, * and/or selected. Even if the faces themselves are not selected for the snapped * transform, having a vertex selected means the face (and thus it's tessellated * triangles) will be moving and will not be a good snap targets. */ - for (int i = 0; i < looptri_num; i++) { + for (int i = 0; i < looptris_num; i++) { const BMLoop **ltri = looptris[i]; - bool insert = !looptri_mask.is_empty() ? looptri_mask[i] : true; + bool insert = !looptris_mask.is_empty() ? looptris_mask[i] : true; if (insert) { /* No reason found to block hit-testing the triangle for snap, so insert it now. */ @@ -977,26 +977,26 @@ static BVHTree *bvhtree_from_editmesh_looptri_create_tree(float epsilon, BLI_bvhtree_insert(tree, i, co[0], 3); } } - BLI_assert(BLI_bvhtree_get_len(tree) == looptri_num_active); + BLI_assert(BLI_bvhtree_get_len(tree) == looptris_num_active); return tree; } -static BVHTree *bvhtree_from_mesh_looptri_create_tree(float epsilon, - int tree_type, - int axis, - const Span positions, - const Span corner_verts, - const Span looptris, - const BitSpan looptri_mask, - int looptri_num_active) +static BVHTree *bvhtree_from_mesh_looptris_create_tree(float epsilon, + int tree_type, + int axis, + const Span positions, + const Span corner_verts, + const Span looptris, + const BitSpan looptris_mask, + int looptris_num_active) { if (positions.is_empty()) { return nullptr; } BVHTree *tree = bvhtree_new_common( - epsilon, tree_type, axis, looptris.size(), looptri_num_active); + epsilon, tree_type, axis, looptris.size(), looptris_num_active); if (!tree) { return nullptr; @@ -1004,7 +1004,7 @@ static BVHTree *bvhtree_from_mesh_looptri_create_tree(float epsilon, for (const int i : looptris.index_range()) { float co[3][3]; - if (!looptri_mask.is_empty() && !looptri_mask[i]) { + if (!looptris_mask.is_empty() && !looptris_mask[i]) { continue; } @@ -1015,79 +1015,79 @@ static BVHTree *bvhtree_from_mesh_looptri_create_tree(float epsilon, BLI_bvhtree_insert(tree, i, co[0], 3); } - BLI_assert(BLI_bvhtree_get_len(tree) == looptri_num_active); + BLI_assert(BLI_bvhtree_get_len(tree) == looptris_num_active); return tree; } -BVHTree *bvhtree_from_editmesh_looptri_ex(BVHTreeFromEditMesh *data, - BMEditMesh *em, - const BitSpan looptri_mask, - int looptri_num_active, - float epsilon, - int tree_type, - int axis) +BVHTree *bvhtree_from_editmesh_looptris_ex(BVHTreeFromEditMesh *data, + BMEditMesh *em, + const BitSpan looptris_mask, + int looptris_num_active, + float epsilon, + int tree_type, + int axis) { /* BMESH specific check that we have tessfaces, * we _could_ tessellate here but rather not - campbell */ - BVHTree *tree = bvhtree_from_editmesh_looptri_create_tree( - epsilon, tree_type, axis, em, looptri_mask, looptri_num_active); + BVHTree *tree = bvhtree_from_editmesh_looptris_create_tree( + epsilon, tree_type, axis, em, looptris_mask, looptris_num_active); bvhtree_balance(tree, false); if (data) { - bvhtree_from_editmesh_setup_data(tree, BVHTREE_FROM_EM_LOOPTRI, data); + bvhtree_from_editmesh_setup_data(tree, BVHTREE_FROM_EM_LOOPTRIS, data); } return tree; } -BVHTree *bvhtree_from_editmesh_looptri( +BVHTree *bvhtree_from_editmesh_looptris( BVHTreeFromEditMesh *data, BMEditMesh *em, float epsilon, int tree_type, int axis) { - return bvhtree_from_editmesh_looptri_ex(data, em, {}, -1, epsilon, tree_type, axis); + return bvhtree_from_editmesh_looptris_ex(data, em, {}, -1, epsilon, tree_type, axis); } -BVHTree *bvhtree_from_mesh_looptri_ex(BVHTreeFromMesh *data, - const Span vert_positions, - const Span corner_verts, - const Span looptris, - const BitSpan looptri_mask, - int looptri_num_active, - float epsilon, - int tree_type, - int axis) +BVHTree *bvhtree_from_mesh_looptris_ex(BVHTreeFromMesh *data, + const Span vert_positions, + const Span corner_verts, + const Span looptris, + const BitSpan looptris_mask, + int looptris_num_active, + float epsilon, + int tree_type, + int axis) { - BVHTree *tree = bvhtree_from_mesh_looptri_create_tree(epsilon, - tree_type, - axis, - vert_positions, - corner_verts, - looptris, - looptri_mask, - looptri_num_active); + BVHTree *tree = bvhtree_from_mesh_looptris_create_tree(epsilon, + tree_type, + axis, + vert_positions, + corner_verts, + looptris, + looptris_mask, + looptris_num_active); bvhtree_balance(tree, false); if (data) { /* Setup BVHTreeFromMesh */ bvhtree_from_mesh_setup_data( - tree, BVHTREE_FROM_LOOPTRI, vert_positions, {}, corner_verts, looptris, nullptr, data); + tree, BVHTREE_FROM_LOOPTRIS, vert_positions, {}, corner_verts, looptris, nullptr, data); } return tree; } -static BitVector<> looptri_no_hidden_map_get(const blender::OffsetIndices faces, - const VArray &hide_poly, - const int looptri_len, - int *r_looptri_active_len) +static BitVector<> looptris_no_hidden_map_get(const blender::OffsetIndices faces, + const VArray &hide_poly, + const int looptris_len, + int *r_looptris_active_len) { if (hide_poly.is_single() && !hide_poly.get_internal_single()) { return {}; } - BitVector<> looptri_mask(looptri_len); + BitVector<> looptris_mask(looptris_len); - int looptri_no_hidden_len = 0; + int looptris_no_hidden_len = 0; int looptri_index = 0; for (const int64_t i : faces.index_range()) { const int triangles_num = blender::bke::mesh::face_triangles_num(faces[i].size()); @@ -1097,16 +1097,16 @@ static BitVector<> looptri_no_hidden_map_get(const blender::OffsetIndices f else { for (const int i : IndexRange(triangles_num)) { UNUSED_VARS(i); - looptri_mask[looptri_index].set(); + looptris_mask[looptri_index].set(); looptri_index++; - looptri_no_hidden_len++; + looptris_no_hidden_len++; } } } - *r_looptri_active_len = looptri_no_hidden_len; + *r_looptris_active_len = looptris_no_hidden_len; - return looptri_mask; + return looptris_mask; } BVHTree *BKE_bvhtree_from_mesh_get(BVHTreeFromMesh *data, @@ -1117,7 +1117,7 @@ BVHTree *BKE_bvhtree_from_mesh_get(BVHTreeFromMesh *data, BVHCache **bvh_cache_p = (BVHCache **)&mesh->runtime->bvh_cache; Span looptris; - if (ELEM(bvh_cache_type, BVHTREE_FROM_LOOPTRI, BVHTREE_FROM_LOOPTRI_NO_HIDDEN)) { + if (ELEM(bvh_cache_type, BVHTREE_FROM_LOOPTRIS, BVHTREE_FROM_LOOPTRIS_NO_HIDDEN)) { looptris = mesh->looptris(); } @@ -1183,26 +1183,26 @@ BVHTree *BKE_bvhtree_from_mesh_get(BVHTreeFromMesh *data, -1); break; } - case BVHTREE_FROM_LOOPTRI_NO_HIDDEN: { + case BVHTREE_FROM_LOOPTRIS_NO_HIDDEN: { blender::bke::AttributeAccessor attributes = mesh->attributes(); int mask_bits_act_len = -1; - const BitVector<> mask = looptri_no_hidden_map_get( + const BitVector<> mask = looptris_no_hidden_map_get( mesh->faces(), *attributes.lookup_or_default(".hide_poly", ATTR_DOMAIN_FACE, false), looptris.size(), &mask_bits_act_len); - data->tree = bvhtree_from_mesh_looptri_create_tree( + data->tree = bvhtree_from_mesh_looptris_create_tree( 0.0f, tree_type, 6, positions, corner_verts, looptris, mask, mask_bits_act_len); break; } - case BVHTREE_FROM_LOOPTRI: { - data->tree = bvhtree_from_mesh_looptri_create_tree( + case BVHTREE_FROM_LOOPTRIS: { + data->tree = bvhtree_from_mesh_looptris_create_tree( 0.0f, tree_type, 6, positions, corner_verts, looptris, {}, -1); break; } case BVHTREE_FROM_EM_LOOSEVERTS: case BVHTREE_FROM_EM_EDGES: - case BVHTREE_FROM_EM_LOOPTRI: + case BVHTREE_FROM_EM_LOOPTRIS: case BVHTREE_MAX_ITEM: BLI_assert_unreachable(); break; @@ -1281,14 +1281,14 @@ BVHTree *BKE_bvhtree_from_editmesh_get(BVHTreeFromEditMesh *data, case BVHTREE_FROM_EM_EDGES: data->tree = bvhtree_from_editmesh_edges_create_tree(0.0f, tree_type, 6, em, {}, -1); break; - case BVHTREE_FROM_EM_LOOPTRI: - data->tree = bvhtree_from_editmesh_looptri_create_tree(0.0f, tree_type, 6, em, {}, -1); + case BVHTREE_FROM_EM_LOOPTRIS: + data->tree = bvhtree_from_editmesh_looptris_create_tree(0.0f, tree_type, 6, em, {}, -1); break; case BVHTREE_FROM_VERTS: case BVHTREE_FROM_EDGES: case BVHTREE_FROM_FACES: - case BVHTREE_FROM_LOOPTRI: - case BVHTREE_FROM_LOOPTRI_NO_HIDDEN: + case BVHTREE_FROM_LOOPTRIS: + case BVHTREE_FROM_LOOPTRIS_NO_HIDDEN: case BVHTREE_FROM_LOOSEVERTS: case BVHTREE_FROM_LOOSEEDGES: case BVHTREE_MAX_ITEM: diff --git a/source/blender/blenkernel/intern/cloth.cc b/source/blender/blenkernel/intern/cloth.cc index 28b4d7a6736..eecb158c07e 100644 --- a/source/blender/blenkernel/intern/cloth.cc +++ b/source/blender/blenkernel/intern/cloth.cc @@ -728,7 +728,7 @@ static bool cloth_from_object( clmd->clothObject->old_solver_type = 255; } else { - BKE_modifier_set_error(ob, &(clmd->modifier), "Out of memory on allocating clmd->clothObject"); + BKE_modifier_set_error(ob, &(clmd->modifier), "Out of memory on allocating cloth object"); return false; } @@ -835,9 +835,7 @@ static void cloth_from_mesh(ClothModifierData *clmd, const Object *ob, Mesh *mes clmd->clothObject->verts = MEM_cnew_array(clmd->clothObject->mvert_num, __func__); if (clmd->clothObject->verts == nullptr) { cloth_free_modifier(clmd); - BKE_modifier_set_error( - ob, &(clmd->modifier), "Out of memory on allocating clmd->clothObject->verts"); - printf("cloth_free_modifier clmd->clothObject->verts\n"); + BKE_modifier_set_error(ob, &(clmd->modifier), "Out of memory on allocating vertices"); return; } @@ -853,12 +851,10 @@ static void cloth_from_mesh(ClothModifierData *clmd, const Object *ob, Mesh *mes MEM_malloc_arrayN(looptris.size(), sizeof(MVertTri), __func__)); if (clmd->clothObject->tri == nullptr) { cloth_free_modifier(clmd); - BKE_modifier_set_error( - ob, &(clmd->modifier), "Out of memory on allocating clmd->clothObject->looptri"); - printf("cloth_free_modifier clmd->clothObject->looptri\n"); + BKE_modifier_set_error(ob, &(clmd->modifier), "Out of memory on allocating triangles"); return; } - BKE_mesh_runtime_verttri_from_looptri( + BKE_mesh_runtime_verttris_from_looptris( clmd->clothObject->tri, corner_verts.data(), looptris.data(), looptris.size()); clmd->clothObject->edges = mesh->edges().data(); @@ -1173,7 +1169,7 @@ static Mesh *cloth_make_rest_mesh(ClothModifierData *clmd, Mesh *mesh) for (const int i : positions.index_range()) { positions[i] = verts[i].xrest; } - BKE_mesh_tag_positions_changed(new_mesh); + new_mesh->tag_positions_changed(); return new_mesh; } @@ -1517,7 +1513,7 @@ static bool cloth_build_springs(ClothModifierData *clmd, Mesh *mesh) } Set existing_vert_pairs; - BKE_bvhtree_from_mesh_get(&treedata, tmp_mesh ? tmp_mesh : mesh, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&treedata, tmp_mesh ? tmp_mesh : mesh, BVHTREE_FROM_LOOPTRIS, 2); rng = BLI_rng_new_srandom(0); const blender::Span vert_normals = tmp_mesh ? tmp_mesh->vert_normals() : diff --git a/source/blender/blenkernel/intern/collection.cc b/source/blender/blenkernel/intern/collection.cc index 709dfeecd36..baba0e1af2f 100644 --- a/source/blender/blenkernel/intern/collection.cc +++ b/source/blender/blenkernel/intern/collection.cc @@ -185,7 +185,8 @@ static void collection_foreach_id(ID *id, LibraryForeachIDData *data) LISTBASE_FOREACH (CollectionObject *, cob, &collection->gobject) { Object *cob_ob_old = cob->ob; - BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, cob->ob, IDWALK_CB_USER); + BKE_LIB_FOREACHID_PROCESS_IDSUPER( + data, cob->ob, IDWALK_CB_USER | IDWALK_CB_OVERRIDE_LIBRARY_HIERARCHY_DEFAULT); if (collection->runtime.gobject_hash) { /* If the remapping does not create inconsistent data (nullptr object pointer or duplicate @@ -200,8 +201,10 @@ static void collection_foreach_id(ID *id, LibraryForeachIDData *data) } } LISTBASE_FOREACH (CollectionChild *, child, &collection->children) { - BKE_LIB_FOREACHID_PROCESS_IDSUPER( - data, child->collection, IDWALK_CB_NEVER_SELF | IDWALK_CB_USER); + BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, + child->collection, + IDWALK_CB_NEVER_SELF | IDWALK_CB_USER | + IDWALK_CB_OVERRIDE_LIBRARY_HIERARCHY_DEFAULT); } LISTBASE_FOREACH (CollectionParent *, parent, &collection->runtime.parents) { /* XXX This is very weak. The whole idea of keeping pointers to private IDs is very bad diff --git a/source/blender/blenkernel/intern/constraint.cc b/source/blender/blenkernel/intern/constraint.cc index 170cd3ad57e..9cd89b73120 100644 --- a/source/blender/blenkernel/intern/constraint.cc +++ b/source/blender/blenkernel/intern/constraint.cc @@ -5077,7 +5077,7 @@ static void followtrack_project_to_depth_object_if_needed(FollowTrackContext *co normalize_v3(ray_direction); BVHTreeFromMesh tree_data = NULL_BVHTreeFromMesh; - BKE_bvhtree_from_mesh_get(&tree_data, depth_mesh, BVHTREE_FROM_LOOPTRI, 4); + BKE_bvhtree_from_mesh_get(&tree_data, depth_mesh, BVHTREE_FROM_LOOPTRIS, 4); BVHTreeRayHit hit; hit.dist = BVH_RAYCAST_DIST_MAX; diff --git a/source/blender/blenkernel/intern/cpp_types.cc b/source/blender/blenkernel/intern/cpp_types.cc index 310dba84d6b..98127bfcc7e 100644 --- a/source/blender/blenkernel/intern/cpp_types.cc +++ b/source/blender/blenkernel/intern/cpp_types.cc @@ -70,7 +70,7 @@ SOCKET_VALUE_CPP_TYPE_MAKE(int32_t); SOCKET_VALUE_CPP_TYPE_MAKE(blender::int2); SOCKET_VALUE_CPP_TYPE_MAKE(std::string); -BLI_VECTOR_CPP_TYPE_MAKE(blender::bke::ValueOrField); +BLI_VECTOR_CPP_TYPE_MAKE(blender::bke::SocketValueVariant); void FN_register_cpp_types() { @@ -86,5 +86,5 @@ void FN_register_cpp_types() SOCKET_VALUE_CPP_TYPE_REGISTER(blender::int2); SOCKET_VALUE_CPP_TYPE_REGISTER(std::string); - BLI_VECTOR_CPP_TYPE_REGISTER(blender::bke::ValueOrField); + BLI_VECTOR_CPP_TYPE_REGISTER(blender::bke::SocketValueVariant); } diff --git a/source/blender/blenkernel/intern/data_transfer.cc b/source/blender/blenkernel/intern/data_transfer.cc index da88ac15a2f..b4ff8d1c13b 100644 --- a/source/blender/blenkernel/intern/data_transfer.cc +++ b/source/blender/blenkernel/intern/data_transfer.cc @@ -378,8 +378,7 @@ static void data_transfer_dtdata_type_postprocess(Mesh *me_dst, bke::MutableAttributeAccessor attributes = me_dst->attributes_for_write(); bke::SpanAttributeWriter sharp_edges = attributes.lookup_or_add_for_write_span( "sharp_edge", ATTR_DOMAIN_EDGE); - const bool *sharp_faces = static_cast( - CustomData_get_layer_named(&me_dst->face_data, CD_PROP_BOOL, "sharp_face")); + const VArraySpan sharp_faces = *attributes.lookup("sharp_face", ATTR_DOMAIN_FACE); /* Note loop_nors_dst contains our custom normals as transferred from source... */ blender::bke::mesh::normals_loop_custom_set(me_dst->vert_positions(), me_dst->edges(), diff --git a/source/blender/blenkernel/intern/displist.cc b/source/blender/blenkernel/intern/displist.cc index 68d4d8513f3..a54b1097535 100644 --- a/source/blender/blenkernel/intern/displist.cc +++ b/source/blender/blenkernel/intern/displist.cc @@ -744,7 +744,7 @@ static blender::bke::GeometrySet curve_calc_modifiers_post(Depsgraph *depsgraph, if (mti->type == ModifierTypeType::OnlyDeform) { mti->deform_verts(md, &mectx_deform, mesh, mesh->vert_positions_for_write()); - BKE_mesh_tag_positions_changed(mesh); + mesh->tag_positions_changed(); } else { Mesh *output_mesh = mti->modify_mesh(md, &mectx_apply, mesh); diff --git a/source/blender/blenkernel/intern/dynamicpaint.cc b/source/blender/blenkernel/intern/dynamicpaint.cc index 94990c79774..f6c508abd7c 100644 --- a/source/blender/blenkernel/intern/dynamicpaint.cc +++ b/source/blender/blenkernel/intern/dynamicpaint.cc @@ -141,7 +141,7 @@ struct Bounds3D { bool valid; }; -struct VolumeGrid { +struct DynamicPaintVolumeGrid { int dim[3]; /** whole grid bounds */ Bounds3D grid_bounds; @@ -196,7 +196,7 @@ struct PaintBakeData { double average_dist; /* space partitioning */ /** space partitioning grid to optimize brush checks */ - VolumeGrid *grid; + DynamicPaintVolumeGrid *grid; /* velocity and movement */ /** speed vector in global space movement per frame, if required */ @@ -625,7 +625,7 @@ static float getSurfaceDimension(PaintSurfaceData *sData) static void freeGrid(PaintSurfaceData *data) { PaintBakeData *bData = data->bData; - VolumeGrid *grid = bData->grid; + DynamicPaintVolumeGrid *grid = bData->grid; if (grid->bounds) { MEM_freeN(grid->bounds); @@ -671,7 +671,7 @@ static void grid_cell_points_cb_ex(void *__restrict userdata, const TaskParallelTLS *__restrict tls) { PaintBakeData *bData = static_cast(userdata); - VolumeGrid *grid = bData->grid; + DynamicPaintVolumeGrid *grid = bData->grid; int *temp_t_index = grid->temp_t_index; int *s_num = static_cast(tls->userdata_chunk); @@ -692,7 +692,7 @@ static void grid_cell_points_reduce(const void *__restrict userdata, void *__restrict chunk) { const PaintBakeData *bData = static_cast(userdata); - const VolumeGrid *grid = bData->grid; + const DynamicPaintVolumeGrid *grid = bData->grid; const int grid_cells = grid->dim[0] * grid->dim[1] * grid->dim[2]; int *join_s_num = static_cast(chunk_join); @@ -709,7 +709,7 @@ static void grid_cell_bounds_cb(void *__restrict userdata, const TaskParallelTLS *__restrict /*tls*/) { PaintBakeData *bData = static_cast(userdata); - VolumeGrid *grid = bData->grid; + DynamicPaintVolumeGrid *grid = bData->grid; float *dim = bData->dim; int *grid_dim = grid->dim; @@ -731,7 +731,7 @@ static void surfaceGenerateGrid(DynamicPaintSurface *surface) { PaintSurfaceData *sData = surface->data; PaintBakeData *bData = sData->bData; - VolumeGrid *grid; + DynamicPaintVolumeGrid *grid; int grid_cells, axis = 3; int *temp_t_index = nullptr; int *temp_s_num = nullptr; @@ -740,7 +740,7 @@ static void surfaceGenerateGrid(DynamicPaintSurface *surface) freeGrid(sData); } - bData->grid = MEM_cnew(__func__); + bData->grid = MEM_cnew(__func__); grid = bData->grid; { @@ -2042,13 +2042,13 @@ static Mesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData *pmd, Object * settings.use_threading = (sData->total_points > 1000); BLI_task_parallel_range( 0, sData->total_points, &data, dynamic_paint_apply_surface_wave_cb, &settings); - BKE_mesh_tag_positions_changed(result); + result->tag_positions_changed(); } /* displace */ if (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE) { dynamicPaint_applySurfaceDisplace(surface, result); - BKE_mesh_tag_positions_changed(result); + result->tag_positions_changed(); } } } @@ -2403,10 +2403,10 @@ static void dynamic_paint_create_uv_surface_neighbor_cb(void *__restrict userdat #undef JITTER_SAMPLES -static float dist_squared_to_looptri_uv_edges(const blender::Span looptris, - const float (*mloopuv)[2], - int tri_index, - const float point[2]) +static float dist_squared_to_looptris_uv_edges(const blender::Span looptris, + const float (*mloopuv)[2], + int tri_index, + const float point[2]) { BLI_assert(tri_index >= 0); @@ -2568,7 +2568,7 @@ static void dynamic_paint_find_island_border(const DynamicPaintCreateUVSurfaceDa const int vert1 = corner_verts[loop_idx[(edge_idx + 1) % 3]]; /* Use a pre-computed vert-to-looptri mapping, - * speeds up things a lot compared to looping over all looptri. */ + * speeds up things a lot compared to looping over all looptris. */ const MeshElemMap *map = &bdata->vert_to_looptri_map[vert0]; bool found_other = false; @@ -2687,7 +2687,7 @@ static void dynamic_paint_find_island_border(const DynamicPaintCreateUVSurfaceDa const float final_pt[2] = {((final_index % w) + 0.5f) / w, ((final_index / w) + 0.5f) / h}; const float threshold = square_f(0.7f) / (w * h); - if (dist_squared_to_looptri_uv_edges(looptris, mloopuv, final_tri_index, final_pt) > + if (dist_squared_to_looptris_uv_edges(looptris, mloopuv, final_tri_index, final_pt) > threshold) { continue; } @@ -3950,7 +3950,7 @@ static void dynamic_paint_paint_mesh_cell_point_cb_ex(void *__restrict userdata, const DynamicPaintSurface *surface = data->surface; const PaintSurfaceData *sData = surface->data; const PaintBakeData *bData = sData->bData; - VolumeGrid *grid = bData->grid; + DynamicPaintVolumeGrid *grid = bData->grid; const DynamicPaintBrushSettings *brush = data->brush; @@ -4304,7 +4304,7 @@ static bool dynamicPaint_paintMesh(Depsgraph *depsgraph, int numOfVerts; int ii; Bounds3D mesh_bb = {{0}}; - VolumeGrid *grid = bData->grid; + DynamicPaintVolumeGrid *grid = bData->grid; mesh = BKE_mesh_copy_for_eval(brush_mesh); blender::MutableSpan positions = mesh->vert_positions_for_write(); @@ -4342,7 +4342,7 @@ static bool dynamicPaint_paintMesh(Depsgraph *depsgraph, /* check bounding box collision */ if (grid && meshBrush_boundsIntersect(&grid->grid_bounds, &mesh_bb, brush, brush_radius)) { /* Build a bvh tree from transformed vertices */ - if (BKE_bvhtree_from_mesh_get(&treeData, mesh, BVHTREE_FROM_LOOPTRI, 4)) { + if (BKE_bvhtree_from_mesh_get(&treeData, mesh, BVHTREE_FROM_LOOPTRIS, 4)) { int c_index; int total_cells = grid->dim[0] * grid->dim[1] * grid->dim[2]; @@ -4407,7 +4407,7 @@ static void dynamic_paint_paint_particle_cell_point_cb_ex( const DynamicPaintSurface *surface = data->surface; const PaintSurfaceData *sData = surface->data; const PaintBakeData *bData = sData->bData; - VolumeGrid *grid = bData->grid; + DynamicPaintVolumeGrid *grid = bData->grid; const DynamicPaintBrushSettings *brush = data->brush; @@ -4584,7 +4584,7 @@ static bool dynamicPaint_paintParticles(DynamicPaintSurface *surface, ParticleSettings *part = psys->part; PaintSurfaceData *sData = surface->data; PaintBakeData *bData = sData->bData; - VolumeGrid *grid = bData->grid; + DynamicPaintVolumeGrid *grid = bData->grid; KDTree_3d *tree; int particlesAdded = 0; diff --git a/source/blender/blenkernel/intern/editmesh.cc b/source/blender/blenkernel/intern/editmesh.cc index 11a69e5ea6a..191ea59068f 100644 --- a/source/blender/blenkernel/intern/editmesh.cc +++ b/source/blender/blenkernel/intern/editmesh.cc @@ -111,31 +111,31 @@ static void editmesh_tessface_calc_intern(BMEditMesh *em, BM_mesh_calc_tessellation_ex(em->bm, em->looptris, params); } -void BKE_editmesh_looptri_calc_ex(BMEditMesh *em, const BMeshCalcTessellation_Params *params) +void BKE_editmesh_looptris_calc_ex(BMEditMesh *em, const BMeshCalcTessellation_Params *params) { editmesh_tessface_calc_intern(em, params); } -void BKE_editmesh_looptri_calc(BMEditMesh *em) +void BKE_editmesh_looptris_calc(BMEditMesh *em) { BMeshCalcTessellation_Params params{}; params.face_normals = false; - BKE_editmesh_looptri_calc_ex(em, ¶ms); + BKE_editmesh_looptris_calc_ex(em, ¶ms); } -void BKE_editmesh_looptri_and_normals_calc(BMEditMesh *em) +void BKE_editmesh_looptris_and_normals_calc(BMEditMesh *em) { - BMeshCalcTessellation_Params looptri_params{}; - looptri_params.face_normals = true; - BKE_editmesh_looptri_calc_ex(em, &looptri_params); + BMeshCalcTessellation_Params looptris_params{}; + looptris_params.face_normals = true; + BKE_editmesh_looptris_calc_ex(em, &looptris_params); BMeshNormalsUpdate_Params normals_params{}; normals_params.face_normals = false; BM_mesh_normals_update_ex(em->bm, &normals_params); } -void BKE_editmesh_looptri_calc_with_partial_ex(BMEditMesh *em, - BMPartialUpdate *bmpinfo, - const BMeshCalcTessellation_Params *params) +void BKE_editmesh_looptris_calc_with_partial_ex(BMEditMesh *em, + BMPartialUpdate *bmpinfo, + const BMeshCalcTessellation_Params *params) { BLI_assert(em->tottri == poly_to_tri_count(em->bm->totface, em->bm->totloop)); BLI_assert(em->looptris != nullptr); @@ -143,18 +143,18 @@ void BKE_editmesh_looptri_calc_with_partial_ex(BMEditMesh *em, BM_mesh_calc_tessellation_with_partial_ex(em->bm, em->looptris, bmpinfo, params); } -void BKE_editmesh_looptri_calc_with_partial(BMEditMesh *em, BMPartialUpdate *bmpinfo) +void BKE_editmesh_looptris_calc_with_partial(BMEditMesh *em, BMPartialUpdate *bmpinfo) { - BMeshCalcTessellation_Params looptri_params{}; - looptri_params.face_normals = false; - BKE_editmesh_looptri_calc_with_partial_ex(em, bmpinfo, &looptri_params); + BMeshCalcTessellation_Params looptris_params{}; + looptris_params.face_normals = false; + BKE_editmesh_looptris_calc_with_partial_ex(em, bmpinfo, &looptris_params); } -void BKE_editmesh_looptri_and_normals_calc_with_partial(BMEditMesh *em, BMPartialUpdate *bmpinfo) +void BKE_editmesh_looptris_and_normals_calc_with_partial(BMEditMesh *em, BMPartialUpdate *bmpinfo) { - BMeshCalcTessellation_Params looptri_params{}; - looptri_params.face_normals = true; - BKE_editmesh_looptri_calc_with_partial_ex(em, bmpinfo, &looptri_params); + BMeshCalcTessellation_Params looptris_params{}; + looptris_params.face_normals = true; + BKE_editmesh_looptris_calc_with_partial_ex(em, bmpinfo, &looptris_params); BMeshNormalsUpdate_Params normals_params{}; normals_params.face_normals = false; BM_mesh_normals_update_with_partial_ex(em->bm, bmpinfo, &normals_params); diff --git a/source/blender/blenkernel/intern/editmesh_bvh.cc b/source/blender/blenkernel/intern/editmesh_bvh.cc index 1beae3c2165..9b8071f41a5 100644 --- a/source/blender/blenkernel/intern/editmesh_bvh.cc +++ b/source/blender/blenkernel/intern/editmesh_bvh.cc @@ -58,7 +58,7 @@ BMBVHTree *BKE_bmbvh_new_ex(BMesh *bm, BMFace *f_test, *f_test_prev; bool test_fn_ret; - /* BKE_editmesh_looptri_calc() must be called already */ + /* BKE_editmesh_looptris_calc() must be called already */ BLI_assert(looptris_tot != 0 || bm->totface == 0); if (cos_cage) { diff --git a/source/blender/blenkernel/intern/editmesh_tangent.cc b/source/blender/blenkernel/intern/editmesh_tangent.cc index 667c5eaf41e..0dd54ef5660 100644 --- a/source/blender/blenkernel/intern/editmesh_tangent.cc +++ b/source/blender/blenkernel/intern/editmesh_tangent.cc @@ -29,7 +29,7 @@ /** \name Tangent Space Calculation * \{ */ -/* Necessary complexity to handle looptri's as quads for correct tangents */ +/* Necessary complexity to handle looptris as quads for correct tangents. */ #define USE_LOOPTRI_DETECT_QUADS struct SGLSLEditMeshToTangent { @@ -137,7 +137,7 @@ struct SGLSLEditMeshToTangent { int numTessFaces; #ifdef USE_LOOPTRI_DETECT_QUADS - /* map from 'fake' face index to looptri, + /* map from 'fake' face index to looptris, * quads will point to the first looptri of the quad */ const int *face_as_quad_map; int num_face_as_quad_map; @@ -224,7 +224,7 @@ void BKE_editmesh_loop_tangent_calc(BMEditMesh *em, face_as_quad_map[i] = j; /* step over all quads */ if (em->looptris[j][0]->f->len == 4) { - j++; /* skips the nest looptri */ + j++; /* Skips the next looptri. */ } } num_face_as_quad_map = i; diff --git a/source/blender/blenkernel/intern/fcurve.cc b/source/blender/blenkernel/intern/fcurve.cc index c61cb84715a..8a54ffaa298 100644 --- a/source/blender/blenkernel/intern/fcurve.cc +++ b/source/blender/blenkernel/intern/fcurve.cc @@ -22,6 +22,7 @@ #include "BLI_easing.h" #include "BLI_ghash.h" #include "BLI_math_vector.h" +#include "BLI_math_vector_types.hh" #include "BLI_sort_utils.h" #include "BLI_string_utils.hh" @@ -1705,6 +1706,81 @@ void BKE_fcurve_delete_key(FCurve *fcu, int index) } } +void BKE_fcurve_delete_keys(FCurve *fcu, blender::uint2 index_range) +{ + BLI_assert(fcu != nullptr); + BLI_assert(fcu->bezt != nullptr); + BLI_assert(index_range[1] > index_range[0]); + BLI_assert(index_range[1] <= fcu->totvert); + + const int removed_index_count = index_range[1] - index_range[0]; + memmove(&fcu->bezt[index_range[0]], + &fcu->bezt[index_range[1]], + sizeof(BezTriple) * (fcu->totvert - index_range[1])); + fcu->totvert -= removed_index_count; + + if (fcu->totvert == 0) { + fcurve_bezt_free(fcu); + } +} + +BezTriple *BKE_bezier_array_merge( + const BezTriple *a, const int size_a, const BezTriple *b, const int size_b, int *r_merged_size) +{ + BezTriple *large_array = static_cast( + MEM_callocN((size_a + size_b) * sizeof(BezTriple), "beztriple")); + + int iterator_a = 0; + int iterator_b = 0; + *r_merged_size = 0; + + /* For comparing if keyframes are at the same x-value. */ + const int max_ulps = 32; + + while (iterator_a < size_a || iterator_b < size_b) { + if (iterator_a >= size_a) { + const int remaining_keys = size_b - iterator_b; + memcpy(&large_array[*r_merged_size], &b[iterator_b], sizeof(BezTriple) * remaining_keys); + (*r_merged_size) += remaining_keys; + break; + } + if (iterator_b >= size_b) { + const int remaining_keys = size_a - iterator_a; + memcpy(&large_array[*r_merged_size], &a[iterator_a], sizeof(BezTriple) * remaining_keys); + (*r_merged_size) += remaining_keys; + break; + } + + if (compare_ff_relative( + a[iterator_a].vec[1][0], b[iterator_b].vec[1][0], BEZT_BINARYSEARCH_THRESH, max_ulps)) + { + memcpy(&large_array[*r_merged_size], &a[iterator_a], sizeof(BezTriple)); + iterator_a++; + iterator_b++; + } + else if (a[iterator_a].vec[1][0] < b[iterator_b].vec[1][0]) { + memcpy(&large_array[*r_merged_size], &a[iterator_a], sizeof(BezTriple)); + iterator_a++; + } + else { + memcpy(&large_array[*r_merged_size], &b[iterator_b], sizeof(BezTriple)); + iterator_b++; + } + (*r_merged_size)++; + } + + BezTriple *minimal_array; + if (*r_merged_size < size_a + size_b) { + minimal_array = static_cast( + MEM_reallocN(large_array, sizeof(BezTriple) * (*r_merged_size))); + } + else { + minimal_array = large_array; + } + + return minimal_array; +} + bool BKE_fcurve_delete_keys_selected(FCurve *fcu) { if (fcu->bezt == nullptr) { /* ignore baked curves */ diff --git a/source/blender/blenkernel/intern/file_handler.cc b/source/blender/blenkernel/intern/file_handler.cc index 5416f01b8c3..a082a11bdef 100644 --- a/source/blender/blenkernel/intern/file_handler.cc +++ b/source/blender/blenkernel/intern/file_handler.cc @@ -32,7 +32,7 @@ FileHandlerType *BKE_file_handler_find(const char *name) void BKE_file_handler_add(std::unique_ptr file_handler) { - BLI_assert(BKE_file_handler_find(file_handler->idname) != nullptr); + BLI_assert(BKE_file_handler_find(file_handler->idname) == nullptr); /** Load all extensions from the string list into the list. */ const char char_separator = ';'; diff --git a/source/blender/blenkernel/intern/fluid.cc b/source/blender/blenkernel/intern/fluid.cc index 96ed9c17a87..dedd534a11b 100644 --- a/source/blender/blenkernel/intern/fluid.cc +++ b/source/blender/blenkernel/intern/fluid.cc @@ -852,7 +852,7 @@ BLI_INLINE void apply_effector_fields(FluidEffectorSettings * /*fes*/, static void update_velocities(FluidEffectorSettings *fes, const blender::Span vert_positions, const int *corner_verts, - const MLoopTri *mlooptri, + const MLoopTri *looptris, float *velocity_map, int index, BVHTreeFromMesh *tree_data, @@ -876,12 +876,12 @@ static void update_velocities(FluidEffectorSettings *fes, tree_data->tree, ray_start, &nearest, tree_data->nearest_callback, tree_data) != -1) { float weights[3]; - int v1, v2, v3, f_index = nearest.index; + int v1, v2, v3, lt_index = nearest.index; /* Calculate barycentric weights for nearest point. */ - v1 = corner_verts[mlooptri[f_index].tri[0]]; - v2 = corner_verts[mlooptri[f_index].tri[1]]; - v3 = corner_verts[mlooptri[f_index].tri[2]]; + v1 = corner_verts[looptris[lt_index].tri[0]]; + v2 = corner_verts[looptris[lt_index].tri[1]]; + v3 = corner_verts[looptris[lt_index].tri[2]]; interp_weights_tri_v3( weights, vert_positions[v1], vert_positions[v2], vert_positions[v3], nearest.co); @@ -1080,7 +1080,7 @@ static void obstacles_from_mesh(Object *coll_ob, /* Skip effector sampling loop if object has disabled effector. */ bool use_effector = fes->flags & FLUID_EFFECTOR_USE_EFFEC; - if (use_effector && BKE_bvhtree_from_mesh_get(&tree_data, mesh, BVHTREE_FROM_LOOPTRI, 4)) { + if (use_effector && BKE_bvhtree_from_mesh_get(&tree_data, mesh, BVHTREE_FROM_LOOPTRIS, 4)) { ObstaclesFromDMData data{}; data.fes = fes; @@ -1801,7 +1801,7 @@ static void sample_mesh(FluidFlowSettings *ffs, blender::Span vert_positions, const blender::Span vert_normals, const int *corner_verts, - const MLoopTri *mlooptri, + const MLoopTri *looptris, const float (*mloopuv)[2], float *influence_map, float *velocity_map, @@ -1882,13 +1882,13 @@ static void sample_mesh(FluidFlowSettings *ffs, tree_data->tree, ray_start, &nearest, tree_data->nearest_callback, tree_data) != -1) { float weights[3]; - int v1, v2, v3, f_index = nearest.index; + int v1, v2, v3, lt_index = nearest.index; float hit_normal[3]; /* Calculate barycentric weights for nearest point. */ - v1 = corner_verts[mlooptri[f_index].tri[0]]; - v2 = corner_verts[mlooptri[f_index].tri[1]]; - v3 = corner_verts[mlooptri[f_index].tri[2]]; + v1 = corner_verts[looptris[lt_index].tri[0]]; + v2 = corner_verts[looptris[lt_index].tri[1]]; + v3 = corner_verts[looptris[lt_index].tri[2]]; interp_weights_tri_v3( weights, vert_positions[v1], vert_positions[v2], vert_positions[v3], nearest.co); @@ -1925,9 +1925,9 @@ static void sample_mesh(FluidFlowSettings *ffs, } else if (mloopuv) { const float *uv[3]; - uv[0] = mloopuv[mlooptri[f_index].tri[0]]; - uv[1] = mloopuv[mlooptri[f_index].tri[1]]; - uv[2] = mloopuv[mlooptri[f_index].tri[2]]; + uv[0] = mloopuv[looptris[lt_index].tri[0]]; + uv[1] = mloopuv[looptris[lt_index].tri[1]]; + uv[2] = mloopuv[looptris[lt_index].tri[2]]; interp_v2_v2v2v2(tex_co, UNPACK3(uv), weights); @@ -2085,7 +2085,7 @@ static void emit_from_mesh( const blender::Span corner_verts = mesh->corner_verts(); const blender::Span looptris = mesh->looptris(); const int numverts = mesh->totvert; - const MDeformVert *dvert = BKE_mesh_deform_verts(mesh); + const MDeformVert *dvert = mesh->deform_verts().data(); const float(*mloopuv)[2] = static_cast( CustomData_get_layer_named(&mesh->loop_data, CD_PROP_FLOAT2, ffs->uvlayer_name)); @@ -2127,7 +2127,7 @@ static void emit_from_mesh( /* Calculate emission map bounds. */ bb_boundInsert(bb, positions[i]); } - BKE_mesh_tag_positions_changed(mesh); + mesh->tag_positions_changed(); mul_m4_v3(flow_ob->object_to_world, flow_center); manta_pos_to_cell(fds, flow_center); @@ -2146,7 +2146,7 @@ static void emit_from_mesh( /* Skip flow sampling loop if object has disabled flow. */ bool use_flow = ffs->flags & FLUID_FLOW_USE_INFLOW; - if (use_flow && BKE_bvhtree_from_mesh_get(&tree_data, mesh, BVHTREE_FROM_LOOPTRI, 4)) { + if (use_flow && BKE_bvhtree_from_mesh_get(&tree_data, mesh, BVHTREE_FROM_LOOPTRIS, 4)) { EmitFromDMData data{}; data.fds = fds; @@ -3219,14 +3219,17 @@ static Mesh *create_liquid_geometry(FluidDomainSettings *fds, Mesh *orgmesh, Object *ob) { + using namespace blender; Mesh *mesh; float min[3]; float max[3]; float size[3]; float cell_size_scaled[3]; - const int *orig_material_indices = BKE_mesh_material_indices(orgmesh); - const short mp_mat_nr = orig_material_indices ? orig_material_indices[0] : 0; + const bke::AttributeAccessor orig_attributes = orgmesh->attributes(); + const VArraySpan orig_material_indices = *orig_attributes.lookup("material_index", + ATTR_DOMAIN_FACE); + const short mp_mat_nr = orig_material_indices.is_empty() ? 0 : orig_material_indices[0]; int i; int num_verts, num_faces; @@ -3258,7 +3261,7 @@ static Mesh *create_liquid_geometry(FluidDomainSettings *fds, const bool is_sharp = orgmesh->attributes() .lookup_or_default("sharp_face", ATTR_DOMAIN_FACE, false) .varray[0]; - BKE_mesh_smooth_flag_set(mesh, !is_sharp); + bke::mesh_smooth_set(*mesh, !is_sharp); /* Get size (dimension) but considering scaling. */ copy_v3_v3(cell_size_scaled, fds->cell_size); @@ -3341,12 +3344,14 @@ static Mesh *create_liquid_geometry(FluidDomainSettings *fds, } } - int *material_indices = BKE_mesh_material_indices_for_write(mesh); + bke::MutableAttributeAccessor attributes = mesh->attributes_for_write(); + bke::SpanAttributeWriter material_indices = attributes.lookup_or_add_for_write_span( + "material_index", ATTR_DOMAIN_FACE); /* Loop for triangles. */ for (const int i : face_offsets.index_range().drop_back(1)) { /* Initialize from existing face. */ - material_indices[i] = mp_mat_nr; + material_indices.span[i] = mp_mat_nr; face_offsets[i] = i * 3; @@ -3362,6 +3367,8 @@ static Mesh *create_liquid_geometry(FluidDomainSettings *fds, # endif } + material_indices.finish(); + BKE_mesh_calc_edges(mesh, false, false); return mesh; diff --git a/source/blender/blenkernel/intern/geometry_component_mesh.cc b/source/blender/blenkernel/intern/geometry_component_mesh.cc index 2734e2b5b1d..c2061400d11 100644 --- a/source/blender/blenkernel/intern/geometry_component_mesh.cc +++ b/source/blender/blenkernel/intern/geometry_component_mesh.cc @@ -776,7 +776,7 @@ static GVArray adapt_mesh_attribute_domain(const Mesh &mesh, if (!varray) { return {}; } - if (varray.size() == 0) { + if (varray.is_empty()) { return {}; } if (from_domain == to_domain) { @@ -854,14 +854,14 @@ static void tag_component_positions_changed(void *owner) { Mesh *mesh = static_cast(owner); if (mesh != nullptr) { - BKE_mesh_tag_positions_changed(mesh); + mesh->tag_positions_changed(); } } static void tag_component_sharpness_changed(void *owner) { if (Mesh *mesh = static_cast(owner)) { - BKE_mesh_tag_sharpness_changed(mesh); + mesh->tag_sharpness_changed(); } } diff --git a/source/blender/blenkernel/intern/grease_pencil.cc b/source/blender/blenkernel/intern/grease_pencil.cc index b8bb5411b8f..736fa24d815 100644 --- a/source/blender/blenkernel/intern/grease_pencil.cc +++ b/source/blender/blenkernel/intern/grease_pencil.cc @@ -771,7 +771,7 @@ FramesMapKey Layer::frame_key_at(const int frame_number) const { Span sorted_keys = this->sorted_keys(); /* No keyframes, return no drawing. */ - if (sorted_keys.size() == 0) { + if (sorted_keys.is_empty()) { return -1; } /* Before the first drawing, return no drawing. */ @@ -1661,7 +1661,7 @@ static void remove_drawings_unchecked(GreasePencil &grease_pencil, Span sorted_indices_to_remove) { using namespace blender::bke::greasepencil; - if (grease_pencil.drawing_array_num == 0 || sorted_indices_to_remove.size() == 0) { + if (grease_pencil.drawing_array_num == 0 || sorted_indices_to_remove.is_empty()) { return; } const int64_t drawings_to_remove = sorted_indices_to_remove.size(); diff --git a/source/blender/blenkernel/intern/grease_pencil_convert_legacy.cc b/source/blender/blenkernel/intern/grease_pencil_convert_legacy.cc index 058cee519e8..2b1cf683e12 100644 --- a/source/blender/blenkernel/intern/grease_pencil_convert_legacy.cc +++ b/source/blender/blenkernel/intern/grease_pencil_convert_legacy.cc @@ -112,7 +112,7 @@ void legacy_gpencil_frame_to_grease_pencil_drawing(const bGPDframe &gpf, /* Write point attributes. */ IndexRange stroke_points_range = points_by_curve[stroke_i]; - if (stroke_points_range.size() == 0) { + if (stroke_points_range.is_empty()) { continue; } diff --git a/source/blender/blenkernel/intern/idprop.cc b/source/blender/blenkernel/intern/idprop.cc index 7ce44bf2232..29692a0914c 100644 --- a/source/blender/blenkernel/intern/idprop.cc +++ b/source/blender/blenkernel/intern/idprop.cc @@ -13,9 +13,12 @@ #include #include +#include + #include "BLI_endian_switch.h" #include "BLI_listbase.h" #include "BLI_math_base.h" +#include "BLI_set.hh" #include "BLI_string.h" #include "BLI_utildefines.h" @@ -275,6 +278,14 @@ IDPropertyUIData *IDP_ui_data_copy(const IDProperty *prop) const IDPropertyUIDataInt *src = (const IDPropertyUIDataInt *)prop->ui_data; IDPropertyUIDataInt *dst = (IDPropertyUIDataInt *)dst_ui_data; dst->default_array = static_cast(MEM_dupallocN(src->default_array)); + dst->enum_items = static_cast(MEM_dupallocN(src->enum_items)); + for (const int64_t i : blender::IndexRange(src->enum_items_num)) { + const IDPropertyUIDataEnumItem &src_item = src->enum_items[i]; + IDPropertyUIDataEnumItem &dst_item = dst->enum_items[i]; + dst_item.identifier = BLI_strdup(src_item.identifier); + dst_item.name = BLI_strdup_null(src_item.name); + dst_item.description = BLI_strdup_null(src_item.description); + } break; } case IDP_UI_DATA_TYPE_BOOLEAN: { @@ -425,6 +436,78 @@ void IDP_FreeString(IDProperty *prop) MEM_freeN(prop->data.pointer); } } +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Enum Type (IDProperty Enum API) + * \{ */ + +static void IDP_int_ui_data_free_enum_items(IDPropertyUIDataInt *ui_data) +{ + for (const int64_t i : blender::IndexRange(ui_data->enum_items_num)) { + IDPropertyUIDataEnumItem &item = ui_data->enum_items[i]; + MEM_SAFE_FREE(item.identifier); + MEM_SAFE_FREE(item.name); + MEM_SAFE_FREE(item.description); + } + MEM_SAFE_FREE(ui_data->enum_items); +} + +const IDPropertyUIDataEnumItem *IDP_EnumItemFind(const IDProperty *prop) +{ + BLI_assert(prop->type == IDP_INT); + const IDPropertyUIDataInt *ui_data = reinterpret_cast( + prop->ui_data); + + const int value = IDP_Int(prop); + for (const IDPropertyUIDataEnumItem &item : + blender::Span(ui_data->enum_items, ui_data->enum_items_num)) + { + if (item.value == value) { + return &item; + } + } + return nullptr; +} + +bool IDP_EnumItemsValidate(const IDPropertyUIDataEnumItem *items, + const int items_num, + void (*error_fn)(const char *)) +{ + blender::Set used_values; + blender::Set used_identifiers; + used_values.reserve(items_num); + used_identifiers.reserve(items_num); + + bool is_valid = true; + for (const int64_t i : blender::IndexRange(items_num)) { + const IDPropertyUIDataEnumItem &item = items[i]; + if (item.identifier == nullptr || item.identifier[0] == '\0') { + if (error_fn) { + const std::string msg = "Item identifier is empty"; + error_fn(msg.c_str()); + } + is_valid = false; + } + if (!used_identifiers.add(item.identifier)) { + if (error_fn) { + const std::string msg = fmt::format("Item identifier '{}' is already used", + item.identifier); + error_fn(msg.c_str()); + } + is_valid = false; + } + if (!used_values.add(item.value)) { + if (error_fn) { + const std::string msg = fmt::format( + "Item value {} for item '{}' is already used", item.value, item.identifier); + error_fn(msg.c_str()); + } + is_valid = false; + } + } + return is_valid; +} /** \} */ @@ -1017,6 +1100,9 @@ void IDP_ui_data_free_unique_contents(IDPropertyUIData *ui_data, if (ui_data_int->default_array != other_int->default_array) { MEM_SAFE_FREE(ui_data_int->default_array); } + if (ui_data_int->enum_items != other_int->enum_items) { + IDP_int_ui_data_free_enum_items(ui_data_int); + } break; } case IDP_UI_DATA_TYPE_BOOLEAN: { @@ -1055,6 +1141,7 @@ void IDP_ui_data_free(IDProperty *prop) case IDP_UI_DATA_TYPE_INT: { IDPropertyUIDataInt *ui_data_int = (IDPropertyUIDataInt *)prop->ui_data; MEM_SAFE_FREE(ui_data_int->default_array); + IDP_int_ui_data_free_enum_items(ui_data_int); break; } case IDP_UI_DATA_TYPE_BOOLEAN: { @@ -1198,6 +1285,14 @@ static void write_ui_data(const IDProperty *prop, BlendWriter *writer) BLO_write_int32_array( writer, uint(ui_data_int->default_array_len), (int32_t *)ui_data_int->default_array); } + BLO_write_struct_array( + writer, IDPropertyUIDataEnumItem, ui_data_int->enum_items_num, ui_data_int->enum_items); + for (const int64_t i : blender::IndexRange(ui_data_int->enum_items_num)) { + IDPropertyUIDataEnumItem &item = ui_data_int->enum_items[i]; + BLO_write_string(writer, item.identifier); + BLO_write_string(writer, item.name); + BLO_write_string(writer, item.description); + } BLO_write_struct(writer, IDPropertyUIDataInt, ui_data); break; } @@ -1325,6 +1420,13 @@ static void read_ui_data(IDProperty *prop, BlendDataReader *reader) BLO_read_int32_array( reader, ui_data_int->default_array_len, (int **)&ui_data_int->default_array); } + BLO_read_data_address(reader, &ui_data_int->enum_items); + for (const int64_t i : blender::IndexRange(ui_data_int->enum_items_num)) { + IDPropertyUIDataEnumItem &item = ui_data_int->enum_items[i]; + BLO_read_data_address(reader, &item.identifier); + BLO_read_data_address(reader, &item.name); + BLO_read_data_address(reader, &item.description); + } break; } case IDP_UI_DATA_TYPE_BOOLEAN: { diff --git a/source/blender/blenkernel/intern/idprop_serialize.cc b/source/blender/blenkernel/intern/idprop_serialize.cc index 6675114c60f..c2a52f1733a 100644 --- a/source/blender/blenkernel/intern/idprop_serialize.cc +++ b/source/blender/blenkernel/intern/idprop_serialize.cc @@ -140,6 +140,11 @@ struct DictionaryEntryParser { return get_double(IDP_KEY_VALUE); } + std::optional get_enum_value() const + { + return get_enum(IDP_KEY_VALUE); + } + const ArrayValue *get_array_value() const { return get_array(IDP_KEY_VALUE); @@ -206,6 +211,21 @@ struct DictionaryEntryParser { return value->as_int_value()->value(); } + std::optional get_enum(StringRef key) const + { + const DictionaryValue::LookupValue *value_ptr = lookup.lookup_ptr(key); + if (value_ptr == nullptr) { + return std::nullopt; + } + const DictionaryValue::LookupValue &value = *value_ptr; + + if (value->type() != eValueType::Int) { + return std::nullopt; + } + + return value->as_int_value()->value(); + } + std::optional get_double(StringRef key) const { const DictionaryValue::LookupValue *value_ptr = lookup.lookup_ptr(key); diff --git a/source/blender/blenkernel/intern/idprop_utils.cc b/source/blender/blenkernel/intern/idprop_utils.cc index 7d65643226b..712294f82ff 100644 --- a/source/blender/blenkernel/intern/idprop_utils.cc +++ b/source/blender/blenkernel/intern/idprop_utils.cc @@ -100,6 +100,9 @@ static void idp_repr_fn_recursive(ReprState *state, const IDProperty *prop) break; } case IDP_INT: { + if (const IDPropertyUIDataEnumItem *item = IDP_EnumItemFind(prop)) { + STR_APPEND_FMT("%s", item->name); + } STR_APPEND_FMT("%d", IDP_Int(prop)); break; } diff --git a/source/blender/blenkernel/intern/image.cc b/source/blender/blenkernel/intern/image.cc index 006a87d7c2a..ef779bf7cf8 100644 --- a/source/blender/blenkernel/intern/image.cc +++ b/source/blender/blenkernel/intern/image.cc @@ -96,6 +96,8 @@ #include "DEG_depsgraph.hh" #include "DEG_depsgraph_query.hh" +#include "DRW_engine.h" + #include "BLO_read_write.hh" /* for image user iteration */ @@ -180,6 +182,7 @@ static void image_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, cons } BLI_listbase_clear(&image_dst->anims); + BLI_listbase_clear(reinterpret_cast(&image_dst->drawdata)); BLI_duplicatelist(&image_dst->tiles, &image_src->tiles); @@ -223,6 +226,7 @@ static void image_free_data(ID *id) BKE_previewimg_free(&image->preview); BLI_freelistN(&image->tiles); + DRW_drawdata_free(id); image_runtime_free_data(image); } diff --git a/source/blender/blenkernel/intern/image_save.cc b/source/blender/blenkernel/intern/image_save.cc index b97a17e2434..ed15ca8ef53 100644 --- a/source/blender/blenkernel/intern/image_save.cc +++ b/source/blender/blenkernel/intern/image_save.cc @@ -785,6 +785,7 @@ bool BKE_image_render_write_exr(ReportList *reports, /* Other render layers. */ int nr = (rr->have_combined) ? 1 : 0; + const bool has_multiple_layers = BLI_listbase_count_at_most(&rr->layers, 2) > 1; LISTBASE_FOREACH (RenderLayer *, rl, &rr->layers) { /* Skip other render layers if requested. */ if (!multi_layer && nr != layer) { @@ -830,8 +831,18 @@ bool BKE_image_render_write_exr(ReportList *reports, char layname[EXR_PASS_MAXNAME]; if (multi_layer) { - RE_render_result_full_channel_name(passname, nullptr, rp->name, nullptr, rp->chan_id, a); - STRNCPY(layname, rl->name); + /* A single unnamed layer indicates that the pass name should be used as the layer name, + * while the pass name should be the channel ID. */ + if (!has_multiple_layers && rl->name[0] == '\0') { + passname[0] = rp->chan_id[a]; + passname[1] = '\0'; + STRNCPY(layname, rp->name); + } + else { + RE_render_result_full_channel_name( + passname, nullptr, rp->name, nullptr, rp->chan_id, a); + STRNCPY(layname, rl->name); + } } else { passname[0] = rp->chan_id[a]; @@ -920,7 +931,9 @@ bool BKE_image_render_write(ReportList *reports, RenderResult *rr, const Scene *scene, const bool stamp, - const char *filepath_basis) + const char *filepath_basis, + const ImageFormatData *format, + bool save_as_render) { bool ok = true; @@ -929,7 +942,7 @@ bool BKE_image_render_write(ReportList *reports, } ImageFormatData image_format; - BKE_image_format_init_for_write(&image_format, scene, nullptr); + BKE_image_format_init_for_write(&image_format, scene, format); const bool is_mono = BLI_listbase_count_at_most(&rr->views, 2) < 2; const bool is_exr_rr = ELEM( @@ -938,7 +951,8 @@ bool BKE_image_render_write(ReportList *reports, const float dither = scene->r.dither_intensity; if (image_format.views_format == R_IMF_VIEWS_MULTIVIEW && is_exr_rr) { - ok = BKE_image_render_write_exr(reports, rr, filepath_basis, &image_format, true, nullptr, -1); + ok = BKE_image_render_write_exr( + reports, rr, filepath_basis, &image_format, save_as_render, nullptr, -1); image_render_print_save_message(reports, filepath_basis, ok, errno); } @@ -956,7 +970,8 @@ bool BKE_image_render_write(ReportList *reports, } if (is_exr_rr) { - ok = BKE_image_render_write_exr(reports, rr, filepath, &image_format, true, rv->name, -1); + ok = BKE_image_render_write_exr( + reports, rr, filepath, &image_format, save_as_render, rv->name, -1); image_render_print_save_message(reports, filepath, ok, errno); /* optional preview images for exr */ @@ -971,7 +986,7 @@ bool BKE_image_render_write(ReportList *reports, ImBuf *ibuf = RE_render_result_rect_to_ibuf(rr, &image_format, dither, view_id); ibuf->planes = 24; - IMB_colormanagement_imbuf_for_write(ibuf, true, false, &image_format); + IMB_colormanagement_imbuf_for_write(ibuf, save_as_render, false, &image_format); ok = image_render_write_stamp_test( reports, scene, rr, ibuf, filepath, &image_format, stamp); @@ -982,7 +997,7 @@ bool BKE_image_render_write(ReportList *reports, else { ImBuf *ibuf = RE_render_result_rect_to_ibuf(rr, &image_format, dither, view_id); - IMB_colormanagement_imbuf_for_write(ibuf, true, false, &image_format); + IMB_colormanagement_imbuf_for_write(ibuf, save_as_render, false, &image_format); ok = image_render_write_stamp_test( reports, scene, rr, ibuf, filepath, &image_format, stamp); @@ -1009,7 +1024,7 @@ bool BKE_image_render_write(ReportList *reports, for (i = 0; i < 2; i++) { int view_id = BLI_findstringindex(&rr->views, names[i], offsetof(RenderView, name)); ibuf_arr[i] = RE_render_result_rect_to_ibuf(rr, &image_format, dither, view_id); - IMB_colormanagement_imbuf_for_write(ibuf_arr[i], true, false, &image_format); + IMB_colormanagement_imbuf_for_write(ibuf_arr[i], save_as_render, false, &image_format); } ibuf_arr[2] = IMB_stereo3d_ImBuf(&image_format, ibuf_arr[0], ibuf_arr[1]); diff --git a/source/blender/blenkernel/intern/key.cc b/source/blender/blenkernel/intern/key.cc index 16d3ba95be5..babba29987e 100644 --- a/source/blender/blenkernel/intern/key.cc +++ b/source/blender/blenkernel/intern/key.cc @@ -24,6 +24,7 @@ /* Allow using deprecated functionality for .blend file I/O. */ #define DNA_DEPRECATED_ALLOW +#include "BKE_attribute.hh" #include "DNA_ID.h" #include "DNA_anim_types.h" #include "DNA_key_types.h" @@ -1273,7 +1274,7 @@ static float *get_weights_array(Object *ob, char *vgroup, WeightsArrayCache *cac /* gather dvert and totvert */ if (ob->type == OB_MESH) { Mesh *mesh = static_cast(ob->data); - dvert = BKE_mesh_deform_verts(mesh); + dvert = mesh->deform_verts().data(); totvert = mesh->totvert; if (mesh->edit_mesh && mesh->edit_mesh->bm->totvert == totvert) { @@ -1606,7 +1607,7 @@ float *BKE_key_evaluate_object_ex( const int totvert = min_ii(tot, mesh->totvert); mesh->vert_positions_for_write().take_front(totvert).copy_from( {reinterpret_cast(out), totvert}); - BKE_mesh_tag_positions_changed(mesh); + mesh->tag_positions_changed(); break; } case ID_LT: { @@ -2224,6 +2225,7 @@ void BKE_keyblock_mesh_calc_normals(const KeyBlock *kb, float (*r_face_normals)[3], float (*r_loop_normals)[3]) { + using namespace blender; if (r_vert_normals == nullptr && r_face_normals == nullptr && r_loop_normals == nullptr) { return; } @@ -2274,10 +2276,9 @@ void BKE_keyblock_mesh_calc_normals(const KeyBlock *kb, if (loop_normals_needed) { const blender::short2 *clnors = static_cast( CustomData_get_layer(&mesh->loop_data, CD_CUSTOMLOOPNORMAL)); - const bool *sharp_edges = static_cast( - CustomData_get_layer_named(&mesh->edge_data, CD_PROP_BOOL, "sharp_edge")); - const bool *sharp_faces = static_cast( - CustomData_get_layer_named(&mesh->face_data, CD_PROP_BOOL, "sharp_face")); + const bke::AttributeAccessor attributes = mesh->attributes(); + const VArraySpan sharp_edges = *attributes.lookup("sharp_edge", ATTR_DOMAIN_EDGE); + const VArraySpan sharp_faces = *attributes.lookup("sharp_face", ATTR_DOMAIN_FACE); blender::bke::mesh::normals_calc_loop( positions, edges, diff --git a/source/blender/blenkernel/intern/lattice_deform.cc b/source/blender/blenkernel/intern/lattice_deform.cc index 71d87db65ed..51c55833e74 100644 --- a/source/blender/blenkernel/intern/lattice_deform.cc +++ b/source/blender/blenkernel/intern/lattice_deform.cc @@ -372,7 +372,7 @@ static void lattice_deform_coords_impl(const Object *ob_lattice, dvert = ((Lattice *)ob_target->data)->dvert; } else { - dvert = BKE_mesh_deform_verts((Mesh *)ob_target->data); + dvert = ((Mesh *)ob_target->data)->deform_verts().data(); } } } diff --git a/source/blender/blenkernel/intern/layer.cc b/source/blender/blenkernel/intern/layer.cc index 6c0c9bc7c94..9c09cb0838c 100644 --- a/source/blender/blenkernel/intern/layer.cc +++ b/source/blender/blenkernel/intern/layer.cc @@ -403,6 +403,9 @@ Base *BKE_view_layer_base_find(ViewLayer *view_layer, Object *ob) void BKE_view_layer_base_deselect_all(const Scene *scene, ViewLayer *view_layer) { + BLI_assert(scene); + BLI_assert(view_layer); + BKE_view_layer_synced_ensure(scene, view_layer); LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) { base->flag &= ~BASE_SELECTED; @@ -987,6 +990,9 @@ void BKE_view_layer_need_resync_tag(ViewLayer *view_layer) void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer) { + BLI_assert(scene); + BLI_assert(view_layer); + if (view_layer->flag & VIEW_LAYER_OUT_OF_SYNC) { BKE_layer_collection_sync(scene, view_layer); view_layer->flag &= ~VIEW_LAYER_OUT_OF_SYNC; diff --git a/source/blender/blenkernel/intern/lib_override.cc b/source/blender/blenkernel/intern/lib_override.cc index 74ee59f8f5d..215759a8e50 100644 --- a/source/blender/blenkernel/intern/lib_override.cc +++ b/source/blender/blenkernel/intern/lib_override.cc @@ -790,6 +790,46 @@ struct LibOverrideGroupTagData { uint tag; uint missing_tag; + /** + * A set of all IDs belonging to the reference linked hierarchy that is being overridden. + * + * NOTE: This is needed only for partial resync, when only part of the liboverridden hierarchy is + * re-generated, since some IDs in that sub-hierarchy may not be detected as needing to be + * overridden, while they would when considering the whole hierarchy. */ + blender::Set linked_ids_hierarchy_default_override; + bool do_create_linked_overrides_set; + + /** Helpers to mark or unmark an ID as part of the processed (reference of) liboverride + * hierarchy. + * + * \return `true` if the given ID is tagged as missing linked data, `false` otherwise. */ + bool id_tag_set(ID *id, const bool is_missing) + { + if (do_create_linked_overrides_set) { + linked_ids_hierarchy_default_override.add(id); + } + else if (is_missing) { + id->tag |= missing_tag; + } + else { + id->tag |= tag; + } + return is_missing; + } + bool id_tag_clear(ID *id, const bool is_missing) + { + if (do_create_linked_overrides_set) { + linked_ids_hierarchy_default_override.remove(id); + } + else if (is_missing) { + id->tag &= ~missing_tag; + } + else { + id->tag &= ~tag; + } + return is_missing; + } + /* Mapping linked objects to all their instantiating collections (as a linked list). * Avoids calling #BKE_collection_object_find over and over, this function is very expansive. */ GHash *linked_object_to_instantiating_collections; @@ -797,6 +837,7 @@ struct LibOverrideGroupTagData { void clear(void) { + linked_ids_hierarchy_default_override.clear(); BLI_ghash_free(linked_object_to_instantiating_collections, nullptr, nullptr); BLI_memarena_free(mem_arena); @@ -967,8 +1008,6 @@ static void lib_override_linked_group_tag_recursive(LibOverrideGroupTagData *dat ID *id_owner = data->root_get(); BLI_assert(ID_IS_LINKED(id_owner)); BLI_assert(!data->is_override); - const uint tag = data->tag; - const uint missing_tag = data->missing_tag; MainIDRelationsEntry *entry = static_cast( BLI_ghash_lookup(bmain->relations->relations_from_pointers, id_owner)); @@ -1000,21 +1039,21 @@ static void lib_override_linked_group_tag_recursive(LibOverrideGroupTagData *dat } BLI_assert(ID_IS_LINKED(to_id)); - /* We tag all collections and objects for override. And we also tag all other data-blocks which - * would use one of those. + /* Only tag ID if their usages is tagged as requiring liboverride by default, and the owner is + * already tagged for liboverride. + * + * NOTE: 'in-between' IDs are handled as a separate step, typically by calling + * #lib_override_hierarchy_dependencies_recursive_tag. * NOTE: missing IDs (aka placeholders) are never overridden. */ - if (ELEM(GS(to_id->name), ID_OB, ID_GR)) { - if (to_id->tag & LIB_TAG_MISSING) { - to_id->tag |= missing_tag; - } - else { - to_id->tag |= tag; + if ((to_id_entry->usage_flag & IDWALK_CB_OVERRIDE_LIBRARY_HIERARCHY_DEFAULT) != 0 || + data->linked_ids_hierarchy_default_override.contains(to_id)) + { + if (!data->id_tag_set(to_id, bool(to_id->tag & LIB_TAG_MISSING))) { + /* Only recursively process the dependencies if the owner is tagged for liboverride. */ + data->root_set(to_id); + lib_override_linked_group_tag_recursive(data); } } - - /* Recursively process the dependencies. */ - data->root_set(to_id); - lib_override_linked_group_tag_recursive(data); } data->root_set(id_owner); } @@ -1035,7 +1074,9 @@ static bool lib_override_linked_group_tag_collections_keep_tagged_check_recursiv if (object == nullptr) { continue; } - if ((object->id.tag & data->tag) != 0) { + if ((object->id.tag & data->tag) != 0 || + data->linked_ids_hierarchy_default_override.contains(&object->id)) + { return true; } } @@ -1066,13 +1107,16 @@ static void lib_override_linked_group_tag_clear_boneshapes_objects(LibOverrideGr if (ob->id.lib != id_root->lib) { continue; } - if (ob->type == OB_ARMATURE && ob->pose != nullptr && (ob->id.tag & data->tag)) { + if (ob->type == OB_ARMATURE && ob->pose != nullptr && + ((ob->id.tag & data->tag) || + data->linked_ids_hierarchy_default_override.contains(&ob->id))) + { for (bPoseChannel *pchan = static_cast(ob->pose->chanbase.first); pchan != nullptr; pchan = pchan->next) { if (pchan->custom != nullptr && &pchan->custom->id != id_root) { - pchan->custom->id.tag &= ~data->tag; + data->id_tag_clear(&pchan->custom->id, bool(pchan->custom->id.tag & LIB_TAG_MISSING)); } } } @@ -1081,14 +1125,15 @@ static void lib_override_linked_group_tag_clear_boneshapes_objects(LibOverrideGr /* Remove (untag) collections if they do not own any tagged object (either themselves, or in * their children collections). */ LISTBASE_FOREACH (Collection *, collection, &bmain->collections) { - if ((collection->id.tag & data->tag) == 0 || &collection->id == id_root || - collection->id.lib != id_root->lib) + if (!((collection->id.tag & data->tag) != 0 || + data->linked_ids_hierarchy_default_override.contains(&collection->id)) || + &collection->id == id_root || collection->id.lib != id_root->lib) { continue; } if (!lib_override_linked_group_tag_collections_keep_tagged_check_recursive(data, collection)) { - collection->id.tag &= ~data->tag; + data->id_tag_clear(&collection->id, bool(collection->id.tag & LIB_TAG_MISSING)); } } } @@ -1100,13 +1145,15 @@ static void lib_override_linked_group_tag_clear_boneshapes_objects(LibOverrideGr * Note that you will then need to call #lib_override_hierarchy_dependencies_recursive_tag to * complete tagging of all dependencies within the override group. * - * We currently only consider Collections and Objects (that are not used as bone shapes) as valid - * boundary IDs to define an override group. + * We currently only consider IDs which usages are marked as to be overridden by default (i.e. + * tagged with #IDWALK_CB_OVERRIDE_LIBRARY_HIERARCHY_DEFAULT) as valid boundary IDs to define an + * override group. */ static void lib_override_linked_group_tag(LibOverrideGroupTagData *data) { Main *bmain = data->bmain; ID *id_root = data->root_get(); + ID *hierarchy_root_id = data->hierarchy_root_get(); const bool is_resync = data->is_resync; BLI_assert(!data->is_override); @@ -1115,13 +1162,49 @@ static void lib_override_linked_group_tag(LibOverrideGroupTagData *data) return; } - /* Tag all collections and objects recursively. */ + /* In case this code only process part of the whole hierarchy, it first needs to process the + * whole linked hierarchy to know which IDs should be overridden anyway, even though in the more + * limited sub-hierarchy scope they would not be. This is critical for partial resync to work + * properly. + * + * NOTE: Regenerating that Set for every processed sub-hierarchy is not optimal. This is done + * that way for now to limit the scope of these changes. Better handling is considered a TODO for + * later (as part of a general refactoring/modernization of this whole code area). */ + + const bool use_linked_overrides_set = hierarchy_root_id && + hierarchy_root_id->lib == id_root->lib && + hierarchy_root_id != id_root; + + BLI_assert(data->do_create_linked_overrides_set == false); + if (use_linked_overrides_set) { + BLI_assert(data->linked_ids_hierarchy_default_override.is_empty()); + data->linked_ids_hierarchy_default_override.add(id_root); + data->linked_ids_hierarchy_default_override.add(hierarchy_root_id); + data->do_create_linked_overrides_set = true; + + /* Store recursively all IDs in the hierarchy which should be liboverridden by default. */ + data->root_set(hierarchy_root_id); + lib_override_linked_group_tag_recursive(data); + + /* Do not override objects used as bone shapes, nor their collections if possible. */ + lib_override_linked_group_tag_clear_boneshapes_objects(data); + + BKE_main_relations_tag_set(bmain, MAINIDRELATIONS_ENTRY_TAGS_PROCESSED, false); + data->root_set(id_root); + data->do_create_linked_overrides_set = false; + } + + /* Tag recursively all IDs in the hierarchy which should be liboverridden by default. */ id_root->tag |= data->tag; lib_override_linked_group_tag_recursive(data); /* Do not override objects used as bone shapes, nor their collections if possible. */ lib_override_linked_group_tag_clear_boneshapes_objects(data); + if (use_linked_overrides_set) { + data->linked_ids_hierarchy_default_override.clear(); + } + /* For each object tagged for override, ensure we get at least one local or liboverride * collection to host it. Avoids getting a bunch of random object in the scene's master * collection when all objects' dependencies are not properly 'packed' into a single root @@ -1162,7 +1245,9 @@ static void lib_override_linked_group_tag(LibOverrideGroupTagData *data) * else to be done here. */ break; } - if (instantiating_collection->id.tag & data->tag) { + if (instantiating_collection->id.tag & data->tag || + data->linked_ids_hierarchy_default_override.contains(&instantiating_collection->id)) + { /* There is a linked collection instantiating the linked object to override, * already tagged to be overridden, nothing else to be done here. */ break; @@ -1174,12 +1259,9 @@ static void lib_override_linked_group_tag(LibOverrideGroupTagData *data) if (instantiating_collection == nullptr && instantiating_collection_override_candidate != nullptr) { - if (instantiating_collection_override_candidate->id.tag & LIB_TAG_MISSING) { - instantiating_collection_override_candidate->id.tag |= data->missing_tag; - } - else { - instantiating_collection_override_candidate->id.tag |= data->tag; - } + data->id_tag_set( + &instantiating_collection_override_candidate->id, + bool(instantiating_collection_override_candidate->id.tag & LIB_TAG_MISSING)); } } } @@ -1191,6 +1273,7 @@ static void lib_override_overrides_group_tag_recursive(LibOverrideGroupTagData * ID *id_owner = data->root_get(); BLI_assert(ID_IS_OVERRIDE_LIBRARY(id_owner)); BLI_assert(data->is_override); + BLI_assert(data->do_create_linked_overrides_set == false); ID *id_hierarchy_root = data->hierarchy_root_get(); @@ -1200,9 +1283,6 @@ static void lib_override_overrides_group_tag_recursive(LibOverrideGroupTagData * return; } - const uint tag = data->tag; - const uint missing_tag = data->missing_tag; - MainIDRelationsEntry *entry = static_cast( BLI_ghash_lookup(bmain->relations->relations_from_pointers, id_owner)); BLI_assert(entry != nullptr); @@ -1247,12 +1327,7 @@ static void lib_override_overrides_group_tag_recursive(LibOverrideGroupTagData * continue; } - if (to_id_reference->tag & LIB_TAG_MISSING) { - to_id->tag |= missing_tag; - } - else { - to_id->tag |= tag; - } + data->id_tag_set(to_id, bool(to_id_reference->tag & LIB_TAG_MISSING)); /* Recursively process the dependencies. */ data->root_set(to_id); @@ -1267,18 +1342,14 @@ static void lib_override_overrides_group_tag(LibOverrideGroupTagData *data) ID *id_root = data->root_get(); BLI_assert(ID_IS_OVERRIDE_LIBRARY_REAL(id_root)); BLI_assert(data->is_override); + BLI_assert(data->do_create_linked_overrides_set == false); ID *id_hierarchy_root = data->hierarchy_root_get(); BLI_assert(id_hierarchy_root != nullptr); BLI_assert(ID_IS_OVERRIDE_LIBRARY_REAL(id_hierarchy_root)); UNUSED_VARS_NDEBUG(id_hierarchy_root); - if (id_root->override_library->reference->tag & LIB_TAG_MISSING) { - id_root->tag |= data->missing_tag; - } - else { - id_root->tag |= data->tag; - } + data->id_tag_set(id_root, bool(id_root->override_library->reference->tag & LIB_TAG_MISSING)); /* Tag all local overrides in id_root's group. */ lib_override_overrides_group_tag_recursive(data); @@ -1301,6 +1372,7 @@ static bool lib_override_library_create_do(Main *bmain, data.is_resync = false; data.root_set(id_root_reference); + data.hierarchy_root_set(id_hierarchy_root_reference); lib_override_group_tag_data_object_to_collection_init(&data); lib_override_linked_group_tag(&data); @@ -1908,7 +1980,6 @@ static void lib_override_library_remap(Main *bmain, if (id_override_old == nullptr) { continue; } - BKE_id_remapper_add(remapper, id_override_old, id_override_new); } } @@ -2115,6 +2186,8 @@ static bool lib_override_library_resync(Main *bmain, BKE_main_relations_tag_set(bmain, MAINIDRELATIONS_ENTRY_TAGS_PROCESSED, false); data.is_override = false; data.root_set(id_resync_root->override_library->reference); + data.hierarchy_root_set( + id_resync_root->override_library->hierarchy_root->override_library->reference); lib_override_linked_group_tag(&data); BKE_main_relations_tag_set(bmain, MAINIDRELATIONS_ENTRY_TAGS_PROCESSED, false); @@ -2215,6 +2288,7 @@ static bool lib_override_library_resync(Main *bmain, BKE_main_relations_tag_set(bmain, MAINIDRELATIONS_ENTRY_TAGS_PROCESSED, false); data.is_override = true; data.root_set(id_root); + data.hierarchy_root_set(id_root->override_library->hierarchy_root); lib_override_overrides_group_tag(&data); BKE_main_relations_free(bmain); diff --git a/source/blender/blenkernel/intern/main.cc b/source/blender/blenkernel/intern/main.cc index d609e862e1c..10550ab24e0 100644 --- a/source/blender/blenkernel/intern/main.cc +++ b/source/blender/blenkernel/intern/main.cc @@ -411,8 +411,8 @@ void BKE_main_merge(Main *bmain_dst, Main **r_bmain_src, MainMergeReport &report reports.reports, RPT_INFO, "Merged %d IDs from '%s' Main into '%s' Main; %d IDs and %d Libraries already existed as " - "part of the destination Main, and %d IDs missing from desination Main, were freed together " - "with the source Main", + "part of the destination Main, and %d IDs missing from destination Main, were freed " + "together with the source Main", reports.num_merged_ids, bmain_src->filepath, bmain_dst->filepath, diff --git a/source/blender/blenkernel/intern/mball.cc b/source/blender/blenkernel/intern/mball.cc index 73dac466ad8..c4da02c36ed 100644 --- a/source/blender/blenkernel/intern/mball.cc +++ b/source/blender/blenkernel/intern/mball.cc @@ -652,7 +652,7 @@ void BKE_mball_data_update(Depsgraph *depsgraph, Scene *scene, Object *ob) 0, nullptr, 1.0f); - BKE_mesh_tag_positions_changed(mesh); + mesh->tag_positions_changed(); } ob->runtime->geometry_set_eval = new GeometrySet(GeometrySet::from_mesh(mesh)); diff --git a/source/blender/blenkernel/intern/mesh.cc b/source/blender/blenkernel/intern/mesh.cc index b3948d0e08e..c864d19fe5f 100644 --- a/source/blender/blenkernel/intern/mesh.cc +++ b/source/blender/blenkernel/intern/mesh.cc @@ -70,7 +70,9 @@ #include "BLO_read_write.hh" using blender::float3; +using blender::int2; using blender::MutableSpan; +using blender::OffsetIndices; using blender::Span; using blender::StringRef; using blender::VArray; @@ -545,6 +547,43 @@ void BKE_mesh_face_offsets_ensure_alloc(Mesh *mesh) mesh->face_offset_indices[mesh->faces_num] = mesh->totloop; } +Span Mesh::vert_positions() const +{ + return {static_cast( + CustomData_get_layer_named(&this->vert_data, CD_PROP_FLOAT3, "position")), + this->totvert}; +} +MutableSpan Mesh::vert_positions_for_write() +{ + return {static_cast(CustomData_get_layer_named_for_write( + &this->vert_data, CD_PROP_FLOAT3, "position", this->totvert)), + this->totvert}; +} + +Span Mesh::edges() const +{ + return {static_cast( + CustomData_get_layer_named(&this->edge_data, CD_PROP_INT32_2D, ".edge_verts")), + this->totedge}; +} +MutableSpan Mesh::edges_for_write() +{ + return {static_cast(CustomData_get_layer_named_for_write( + &this->edge_data, CD_PROP_INT32_2D, ".edge_verts", this->totedge)), + this->totedge}; +} + +OffsetIndices Mesh::faces() const +{ + return Span(this->face_offset_indices, this->faces_num + 1); +} +Span Mesh::face_offsets() const +{ + if (this->faces_num == 0) { + return {}; + } + return {this->face_offset_indices, this->faces_num + 1}; +} MutableSpan Mesh::face_offsets_for_write() { if (this->faces_num == 0) { @@ -555,6 +594,53 @@ MutableSpan Mesh::face_offsets_for_write() return {this->face_offset_indices, this->faces_num + 1}; } +Span Mesh::corner_verts() const +{ + return {static_cast( + CustomData_get_layer_named(&this->loop_data, CD_PROP_INT32, ".corner_vert")), + this->totloop}; +} +MutableSpan Mesh::corner_verts_for_write() +{ + return {static_cast(CustomData_get_layer_named_for_write( + &this->loop_data, CD_PROP_INT32, ".corner_vert", this->totloop)), + this->totloop}; +} + +Span Mesh::corner_edges() const +{ + return {static_cast( + CustomData_get_layer_named(&this->loop_data, CD_PROP_INT32, ".corner_edge")), + this->totloop}; +} +MutableSpan Mesh::corner_edges_for_write() +{ + return {static_cast(CustomData_get_layer_named_for_write( + &this->loop_data, CD_PROP_INT32, ".corner_edge", this->totloop)), + this->totloop}; +} + +Span Mesh::deform_verts() const +{ + const MDeformVert *dverts = static_cast( + CustomData_get_layer(&this->vert_data, CD_MDEFORMVERT)); + if (!dverts) { + return {}; + } + return {dverts, this->totvert}; +} +MutableSpan Mesh::deform_verts_for_write() +{ + MDeformVert *dvert = static_cast( + CustomData_get_layer_for_write(&this->vert_data, CD_MDEFORMVERT, this->totvert)); + if (dvert) { + return {dvert, this->totvert}; + } + return {static_cast(CustomData_add_layer( + &this->vert_data, CD_MDEFORMVERT, CD_SET_DEFAULT, this->totvert)), + this->totvert}; +} + static void mesh_ensure_cdlayers_primary(Mesh &mesh) { blender::bke::MutableAttributeAccessor attributes = mesh.attributes_for_write(); @@ -1035,11 +1121,11 @@ void BKE_mesh_material_remap(Mesh *mesh, const uint *remap, uint remap_len) #undef MAT_NR_REMAP } -void BKE_mesh_smooth_flag_set(Mesh *mesh, const bool use_smooth) +namespace blender::bke { + +void mesh_smooth_set(Mesh &mesh, const bool use_smooth) { - using namespace blender; - using namespace blender::bke; - MutableAttributeAccessor attributes = mesh->attributes_for_write(); + MutableAttributeAccessor attributes = mesh.attributes_for_write(); if (use_smooth) { attributes.remove("sharp_edge"); attributes.remove("sharp_face"); @@ -1053,35 +1139,34 @@ void BKE_mesh_smooth_flag_set(Mesh *mesh, const bool use_smooth) } } -void BKE_mesh_sharp_edges_set_from_angle(Mesh *mesh, const float angle) +void mesh_sharp_edges_set_from_angle(Mesh &mesh, const float angle) { - using namespace blender; - using namespace blender::bke; - bke::MutableAttributeAccessor attributes = mesh->attributes_for_write(); + MutableAttributeAccessor attributes = mesh.attributes_for_write(); if (angle >= M_PI) { attributes.remove("sharp_edge"); attributes.remove("sharp_face"); return; } if (angle == 0.0f) { - BKE_mesh_smooth_flag_set(mesh, false); + mesh_smooth_set(mesh, false); return; } - bke::SpanAttributeWriter sharp_edges = attributes.lookup_or_add_for_write_span( + SpanAttributeWriter sharp_edges = attributes.lookup_or_add_for_write_span( "sharp_edge", ATTR_DOMAIN_EDGE); - const bool *sharp_faces = static_cast( - CustomData_get_layer_named(&mesh->face_data, CD_PROP_BOOL, "sharp_face")); - bke::mesh::edges_sharp_from_angle_set(mesh->faces(), - mesh->corner_verts(), - mesh->corner_edges(), - mesh->face_normals(), - mesh->corner_to_face_map(), - sharp_faces, - angle, - sharp_edges.span); + const VArraySpan sharp_faces = *attributes.lookup("sharp_face", ATTR_DOMAIN_FACE); + mesh::edges_sharp_from_angle_set(mesh.faces(), + mesh.corner_verts(), + mesh.corner_edges(), + mesh.face_normals(), + mesh.corner_to_face_map(), + sharp_faces, + angle, + sharp_edges.span); sharp_edges.finish(); } +} // namespace blender::bke + std::optional> Mesh::bounds_min_max() const { using namespace blender; @@ -1125,7 +1210,7 @@ void BKE_mesh_transform(Mesh *mesh, const float mat[4][4], bool do_keys) } } - BKE_mesh_tag_positions_changed(mesh); + mesh->tag_positions_changed(); } static void translate_positions(MutableSpan positions, const float3 &translation) @@ -1157,7 +1242,7 @@ void BKE_mesh_translate(Mesh *mesh, const float offset[3], const bool do_keys) } } - BKE_mesh_tag_positions_changed_uniformly(mesh); + mesh->tag_positions_changed_uniformly(); if (bounds) { bounds->min += offset; diff --git a/source/blender/blenkernel/intern/mesh_boolean_convert.cc b/source/blender/blenkernel/intern/mesh_boolean_convert.cc index 21206818757..b651ba4848f 100644 --- a/source/blender/blenkernel/intern/mesh_boolean_convert.cc +++ b/source/blender/blenkernel/intern/mesh_boolean_convert.cc @@ -817,7 +817,7 @@ Mesh *direct_mesh_boolean(Span meshes, { #ifdef WITH_GMP BLI_assert(transforms.is_empty() || meshes.size() == transforms.size()); - BLI_assert(material_remaps.size() == 0 || material_remaps.size() == meshes.size()); + BLI_assert(material_remaps.is_empty() || material_remaps.size() == meshes.size()); if (meshes.size() <= 0) { return nullptr; } diff --git a/source/blender/blenkernel/intern/mesh_evaluate.cc b/source/blender/blenkernel/intern/mesh_evaluate.cc index 1bd761328a4..36db624d7dc 100644 --- a/source/blender/blenkernel/intern/mesh_evaluate.cc +++ b/source/blender/blenkernel/intern/mesh_evaluate.cc @@ -359,22 +359,22 @@ bool BKE_mesh_center_of_volume(const Mesh *mesh, float r_cent[3]) static bool mesh_calc_center_centroid_ex(const float (*positions)[3], int /*mverts_num*/, - const MLoopTri *looptri, - int looptri_num, + const MLoopTri *looptris, + int looptris_num, const int *corner_verts, float r_center[3]) { zero_v3(r_center); - if (looptri_num == 0) { + if (looptris_num == 0) { return false; } float totweight = 0.0f; const MLoopTri *lt; int i; - for (i = 0, lt = looptri; i < looptri_num; i++, lt++) { + for (i = 0, lt = looptris; i < looptris_num; i++, lt++) { const float *v1 = positions[corner_verts[lt->tri[0]]]; const float *v2 = positions[corner_verts[lt->tri[1]]]; const float *v3 = positions[corner_verts[lt->tri[2]]]; @@ -397,8 +397,8 @@ static bool mesh_calc_center_centroid_ex(const float (*positions)[3], void BKE_mesh_calc_volume(const float (*vert_positions)[3], const int mverts_num, - const MLoopTri *looptri, - const int looptri_num, + const MLoopTri *looptris, + const int looptris_num, const int *corner_verts, float *r_volume, float r_center[3]) @@ -415,19 +415,19 @@ void BKE_mesh_calc_volume(const float (*vert_positions)[3], zero_v3(r_center); } - if (looptri_num == 0) { + if (looptris_num == 0) { return; } if (!mesh_calc_center_centroid_ex( - vert_positions, mverts_num, looptri, looptri_num, corner_verts, center)) + vert_positions, mverts_num, looptris, looptris_num, corner_verts, center)) { return; } totvol = 0.0f; - for (i = 0, lt = looptri; i < looptri_num; i++, lt++) { + for (i = 0, lt = looptris; i < looptris_num; i++, lt++) { const float *v1 = vert_positions[corner_verts[lt->tri[0]]]; const float *v2 = vert_positions[corner_verts[lt->tri[1]]]; const float *v3 = vert_positions[corner_verts[lt->tri[2]]]; diff --git a/source/blender/blenkernel/intern/mesh_flip_faces.cc b/source/blender/blenkernel/intern/mesh_flip_faces.cc index cb188aa61b8..ab2ce5e46c4 100644 --- a/source/blender/blenkernel/intern/mesh_flip_faces.cc +++ b/source/blender/blenkernel/intern/mesh_flip_faces.cc @@ -92,7 +92,7 @@ void mesh_flip_faces(Mesh &mesh, const IndexMask &selection) return true; }); - BKE_mesh_tag_face_winding_changed(&mesh); + mesh.tag_face_winding_changed(); } } // namespace blender::bke diff --git a/source/blender/blenkernel/intern/mesh_legacy_convert.cc b/source/blender/blenkernel/intern/mesh_legacy_convert.cc index 4b7d466332b..7cd36e05206 100644 --- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc +++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc @@ -245,7 +245,7 @@ void BKE_mesh_calc_edges_legacy(Mesh *mesh) &mesh->edge_data, CD_MEDGE, edges, totedge, nullptr); mesh->totedge = totedge; - BKE_mesh_tag_topology_changed(mesh); + mesh->tag_topology_changed(); BKE_mesh_strip_loose_faces(mesh); } @@ -1008,7 +1008,7 @@ static int mesh_tessface_calc(Mesh &mesh, /* We abuse #MFace.edcode to tag quad faces. See below for details. */ #define TESSFACE_IS_QUAD 1 - const int looptri_num = poly_to_tri_count(faces_num, totloop); + const int looptris_num = poly_to_tri_count(faces_num, totloop); MFace *mface, *mf; MemArena *arena = nullptr; @@ -1028,9 +1028,9 @@ static int mesh_tessface_calc(Mesh &mesh, * if all faces are triangles it will be correct, `quads == 2x` allocations. */ /* Take care since memory is _not_ zeroed so be sure to initialize each field. */ mface_to_poly_map = (int *)MEM_malloc_arrayN( - size_t(looptri_num), sizeof(*mface_to_poly_map), __func__); - mface = (MFace *)MEM_malloc_arrayN(size_t(looptri_num), sizeof(*mface), __func__); - lindices = (uint(*)[4])MEM_malloc_arrayN(size_t(looptri_num), sizeof(*lindices), __func__); + size_t(looptris_num), sizeof(*mface_to_poly_map), __func__); + mface = (MFace *)MEM_malloc_arrayN(size_t(looptris_num), sizeof(*mface), __func__); + lindices = (uint(*)[4])MEM_malloc_arrayN(size_t(looptris_num), sizeof(*lindices), __func__); mface_index = 0; for (poly_index = 0; poly_index < faces_num; poly_index++) { @@ -1187,10 +1187,10 @@ static int mesh_tessface_calc(Mesh &mesh, CustomData_free(fdata_legacy, totface); totface = mface_index; - BLI_assert(totface <= looptri_num); + BLI_assert(totface <= looptris_num); /* Not essential but without this we store over-allocated memory in the #CustomData layers. */ - if (LIKELY(looptri_num != totface)) { + if (LIKELY(looptris_num != totface)) { mface = (MFace *)MEM_reallocN(mface, sizeof(*mface) * size_t(totface)); mface_to_poly_map = (int *)MEM_reallocN(mface_to_poly_map, sizeof(*mface_to_poly_map) * size_t(totface)); diff --git a/source/blender/blenkernel/intern/mesh_mapping.cc b/source/blender/blenkernel/intern/mesh_mapping.cc index 2821495ceab..3b7e41ea9ca 100644 --- a/source/blender/blenkernel/intern/mesh_mapping.cc +++ b/source/blender/blenkernel/intern/mesh_mapping.cc @@ -191,21 +191,21 @@ void BKE_mesh_uv_vert_map_free(UvVertMap *vmap) void BKE_mesh_vert_looptri_map_create(MeshElemMap **r_map, int **r_mem, const int totvert, - const MLoopTri *mlooptri, - const int totlooptri, + const MLoopTri *looptris, + const int totlooptris, const int *corner_verts, const int /*totloop*/) { MeshElemMap *map = MEM_cnew_array(size_t(totvert), __func__); - int *indices = static_cast(MEM_mallocN(sizeof(int) * size_t(totlooptri) * 3, __func__)); + int *indices = static_cast(MEM_mallocN(sizeof(int) * size_t(totlooptris) * 3, __func__)); int *index_step; - const MLoopTri *mlt; + const MLoopTri *lt; int i; /* count face users */ - for (i = 0, mlt = mlooptri; i < totlooptri; mlt++, i++) { + for (i = 0, lt = looptris; i < totlooptris; lt++, i++) { for (int j = 3; j--;) { - map[corner_verts[mlt->tri[j]]].count++; + map[corner_verts[lt->tri[j]]].count++; } } @@ -220,9 +220,9 @@ void BKE_mesh_vert_looptri_map_create(MeshElemMap **r_map, } /* assign looptri-edge users */ - for (i = 0, mlt = mlooptri; i < totlooptri; mlt++, i++) { + for (i = 0, lt = looptris; i < totlooptris; lt++, i++) { for (int j = 3; j--;) { - MeshElemMap *map_ele = &map[corner_verts[mlt->tri[j]]]; + MeshElemMap *map_ele = &map[corner_verts[lt->tri[j]]]; map_ele->indices[map_ele->count++] = i; } } @@ -276,10 +276,10 @@ void BKE_mesh_origindex_map_create_looptri(MeshElemMap **r_map, int **r_mem, const blender::OffsetIndices faces, const int *looptri_faces, - const int looptri_num) + const int looptris_num) { MeshElemMap *map = MEM_cnew_array(size_t(faces.size()), __func__); - int *indices = static_cast(MEM_mallocN(sizeof(int) * size_t(looptri_num), __func__)); + int *indices = static_cast(MEM_mallocN(sizeof(int) * size_t(looptris_num), __func__)); int *index_step; /* create offsets */ @@ -290,7 +290,7 @@ void BKE_mesh_origindex_map_create_looptri(MeshElemMap **r_map, } /* Assign face-tessellation users. */ - for (int i = 0; i < looptri_num; i++) { + for (int i = 0; i < looptris_num; i++) { MeshElemMap *map_ele = &map[looptri_faces[i]]; map_ele->indices[map_ele->count++] = i; } @@ -506,7 +506,7 @@ static void face_edge_loop_islands_calc(const int totedge, int tot_group = 0; bool group_id_overflow = false; - if (faces.size() == 0) { + if (faces.is_empty()) { *r_totgroup = 0; *r_face_groups = nullptr; if (r_edge_borders) { @@ -663,14 +663,14 @@ static void face_edge_loop_islands_calc(const int totedge, int *BKE_mesh_calc_smoothgroups(int edges_num, const blender::OffsetIndices faces, const blender::Span corner_edges, - const bool *sharp_edges, - const bool *sharp_faces, + const blender::Span sharp_edges, + const blender::Span sharp_faces, int *r_totgroup, bool use_bitflags) { int *face_groups = nullptr; - auto face_is_smooth = [&](const int i) { return !(sharp_faces && sharp_faces[i]); }; + auto face_is_smooth = [&](const int i) { return sharp_faces.is_empty() || !sharp_faces[i]; }; auto face_is_island_boundary_smooth = [&](const int face_index, const int /*loop_index*/, @@ -679,7 +679,7 @@ int *BKE_mesh_calc_smoothgroups(int edges_num, const blender::Span edge_face_map_elem) { /* Edge is sharp if one of its faces is flat, or edge itself is sharp, * or edge is not used by exactly two faces. */ - if (face_is_smooth(face_index) && !(sharp_edges && sharp_edges[edge_index]) && + if (face_is_smooth(face_index) && !(!sharp_edges.is_empty() && sharp_edges[edge_index]) && (edge_user_count == 2)) { /* In that case, edge appears to be smooth, but we need to check its other face too. */ diff --git a/source/blender/blenkernel/intern/mesh_mirror.cc b/source/blender/blenkernel/intern/mesh_mirror.cc index 1dfff039083..0df49c330cb 100644 --- a/source/blender/blenkernel/intern/mesh_mirror.cc +++ b/source/blender/blenkernel/intern/mesh_mirror.cc @@ -124,6 +124,7 @@ Mesh *BKE_mesh_mirror_apply_mirror_on_axis_for_modifier(MirrorModifierData *mmd, int **r_vert_merge_map, int *r_vert_merge_map_len) { + using namespace blender; const float tolerance_sq = mmd->tolerance * mmd->tolerance; const bool do_vtargetmap = (mmd->flag & MOD_MIR_NO_MERGE) == 0 && r_vert_merge_map != nullptr; @@ -405,11 +406,9 @@ Mesh *BKE_mesh_mirror_apply_mirror_on_axis_for_modifier(MirrorModifierData *mmd, transpose_m4(mtx_nor); /* calculate custom normals into loop_normals, then mirror first half into second half */ - - const bool *sharp_edges = static_cast( - CustomData_get_layer_named(&result->edge_data, CD_PROP_BOOL, "sharp_edge")); - const bool *sharp_faces = static_cast( - CustomData_get_layer_named(&result->face_data, CD_PROP_BOOL, "sharp_face")); + const bke::AttributeAccessor attributes = result->attributes(); + const VArraySpan sharp_edges = *attributes.lookup("sharp_edge", ATTR_DOMAIN_EDGE); + const VArraySpan sharp_faces = *attributes.lookup("sharp_face", ATTR_DOMAIN_FACE); blender::bke::mesh::normals_calc_loop(result->vert_positions(), result_edges, result_faces, @@ -448,7 +447,7 @@ Mesh *BKE_mesh_mirror_apply_mirror_on_axis_for_modifier(MirrorModifierData *mmd, /* handle vgroup stuff */ if (BKE_object_supports_vertex_groups(ob)) { if ((mmd->flag & MOD_MIR_VGROUP) && CustomData_has_layer(&result->vert_data, CD_MDEFORMVERT)) { - MDeformVert *dvert = BKE_mesh_deform_verts_for_write(result) + src_verts_num; + MDeformVert *dvert = result->deform_verts_for_write().data() + src_verts_num; int flip_map_len = 0; int *flip_map = BKE_object_defgroup_flip_map(ob, false, &flip_map_len); if (flip_map) { diff --git a/source/blender/blenkernel/intern/mesh_normals.cc b/source/blender/blenkernel/intern/mesh_normals.cc index 63d62756d29..2833fc66f00 100644 --- a/source/blender/blenkernel/intern/mesh_normals.cc +++ b/source/blender/blenkernel/intern/mesh_normals.cc @@ -291,10 +291,9 @@ blender::Span Mesh::corner_normals() const break; } case MeshNormalDomain::Corner: { - const bool *sharp_edges = static_cast( - CustomData_get_layer_named(&this->edge_data, CD_PROP_BOOL, "sharp_edge")); - const bool *sharp_faces = static_cast( - CustomData_get_layer_named(&this->face_data, CD_PROP_BOOL, "sharp_face")); + const AttributeAccessor attributes = this->attributes(); + const VArraySpan sharp_edges = *attributes.lookup("sharp_edge", ATTR_DOMAIN_EDGE); + const VArraySpan sharp_faces = *attributes.lookup("sharp_face", ATTR_DOMAIN_FACE); const short2 *custom_normals = static_cast( CustomData_get_layer(&this->loop_data, CD_CUSTOMLOOPNORMAL)); mesh::normals_calc_loop(this->vert_positions(), @@ -781,7 +780,7 @@ void edges_sharp_from_angle_set(const OffsetIndices faces, const Span corner_edges, const Span face_normals, const Span loop_to_face, - const bool *sharp_faces, + const Span sharp_faces, const float split_angle, MutableSpan sharp_edges) { @@ -798,7 +797,7 @@ void edges_sharp_from_angle_set(const OffsetIndices faces, corner_edges, loop_to_face, face_normals, - Span(sharp_faces, sharp_faces ? faces.size() : 0), + sharp_faces, sharp_edges, true, split_angle, @@ -1190,8 +1189,8 @@ void normals_calc_loop(const Span vert_positions, const Span loop_to_face_map, const Span vert_normals, const Span face_normals, - const bool *sharp_edges, - const bool *sharp_faces, + const Span sharp_edges, + const Span sharp_faces, const short2 *clnors_data, CornerNormalSpaceArray *r_lnors_spacearr, MutableSpan r_loop_normals) @@ -1244,12 +1243,7 @@ void normals_calc_loop(const Span vert_positions, /* This first loop check which edges are actually smooth, and compute edge vectors. */ build_edge_to_loop_map_with_flip_and_sharp( - faces, - corner_verts, - corner_edges, - Span(sharp_faces, sharp_faces ? faces.size() : 0), - Span(sharp_edges, sharp_edges ? edges.size() : 0), - edge_to_loops); + faces, corner_verts, corner_edges, sharp_faces, sharp_edges, edge_to_loops); Vector single_corners; Vector fan_corners; @@ -1301,7 +1295,7 @@ static void mesh_normals_loop_custom_set(Span positions, Span corner_edges, Span vert_normals, Span face_normals, - const bool *sharp_faces, + const Span sharp_faces, const bool use_vertices, MutableSpan r_custom_loop_normals, MutableSpan sharp_edges, @@ -1327,7 +1321,7 @@ static void mesh_normals_loop_custom_set(Span positions, loop_to_face, vert_normals, face_normals, - sharp_edges.data(), + sharp_edges, sharp_faces, r_clnors_data.data(), &lnors_spacearr, @@ -1448,7 +1442,7 @@ static void mesh_normals_loop_custom_set(Span positions, loop_to_face, vert_normals, face_normals, - sharp_edges.data(), + sharp_edges, sharp_faces, r_clnors_data.data(), &lnors_spacearr, @@ -1506,7 +1500,7 @@ void normals_loop_custom_set(const Span vert_positions, const Span corner_edges, const Span vert_normals, const Span face_normals, - const bool *sharp_faces, + const Span sharp_faces, MutableSpan sharp_edges, MutableSpan r_custom_loop_normals, MutableSpan r_clnors_data) @@ -1532,7 +1526,7 @@ void normals_loop_custom_set_from_verts(const Span vert_positions, const Span corner_edges, const Span vert_normals, const Span face_normals, - const bool *sharp_faces, + const Span sharp_faces, MutableSpan sharp_edges, MutableSpan r_custom_vert_normals, MutableSpan r_clnors_data) @@ -1565,8 +1559,7 @@ static void mesh_set_custom_normals(Mesh *mesh, float (*r_custom_nors)[3], const MutableAttributeAccessor attributes = mesh->attributes_for_write(); SpanAttributeWriter sharp_edges = attributes.lookup_or_add_for_write_span( "sharp_edge", ATTR_DOMAIN_EDGE); - const bool *sharp_faces = static_cast( - CustomData_get_layer_named(&mesh->face_data, CD_PROP_BOOL, "sharp_face")); + const VArraySpan sharp_faces = *attributes.lookup("sharp_face", ATTR_DOMAIN_FACE); mesh_normals_loop_custom_set( mesh->vert_positions(), diff --git a/source/blender/blenkernel/intern/mesh_remap.cc b/source/blender/blenkernel/intern/mesh_remap.cc index 5e022077850..c7f064a28ba 100644 --- a/source/blender/blenkernel/intern/mesh_remap.cc +++ b/source/blender/blenkernel/intern/mesh_remap.cc @@ -568,7 +568,7 @@ void BKE_mesh_remap_calc_verts_from_mesh(const int mode, float *weights = static_cast( MEM_mallocN(sizeof(*weights) * tmp_buff_size, __func__)); - BKE_bvhtree_from_mesh_get(&treedata, me_src, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&treedata, me_src, BVHTREE_FROM_LOOPTRIS, 2); if (mode == MREMAP_MODE_VERT_POLYINTERP_VNORPROJ) { for (i = 0; i < numverts_dst; i++) { @@ -860,7 +860,7 @@ void BKE_mesh_remap_calc_edges_from_mesh(const int mode, const blender::Span positions_src = me_src->vert_positions(); const blender::Span looptri_faces = me_src->looptri_faces(); - BKE_bvhtree_from_mesh_get(&treedata, me_src, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&treedata, me_src, BVHTREE_FROM_LOOPTRIS, 2); for (i = 0; i < numedges_dst; i++) { interp_v3_v3v3(tmp_co, @@ -1444,32 +1444,32 @@ void BKE_mesh_remap_calc_loops_from_mesh(const int mode, if (use_islands) { looptris_src = me_src->looptris(); looptri_faces_src = me_src->looptri_faces(); - blender::BitVector<> looptri_active(looptris_src.size()); + blender::BitVector<> looptris_active(looptris_src.size()); for (tindex = 0; tindex < num_trees; tindex++) { - int num_looptri_active = 0; - looptri_active.fill(false); + int looptris_num_active = 0; + looptris_active.fill(false); for (const int64_t i : looptris_src.index_range()) { const blender::IndexRange face = faces_src[looptri_faces_src[i]]; if (island_store.items_to_islands[face.start()] == tindex) { - looptri_active[i].set(); - num_looptri_active++; + looptris_active[i].set(); + looptris_num_active++; } } - bvhtree_from_mesh_looptri_ex(&treedata[tindex], - positions_src, - corner_verts_src, - looptris_src, - looptri_active, - num_looptri_active, - 0.0, - 2, - 6); + bvhtree_from_mesh_looptris_ex(&treedata[tindex], + positions_src, + corner_verts_src, + looptris_src, + looptris_active, + looptris_num_active, + 0.0, + 2, + 6); } } else { BLI_assert(num_trees == 1); - BKE_bvhtree_from_mesh_get(&treedata[0], me_src, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&treedata[0], me_src, BVHTREE_FROM_LOOPTRIS, 2); } } @@ -2069,7 +2069,7 @@ void BKE_mesh_remap_calc_faces_from_mesh(const int mode, float hit_dist; const blender::Span looptri_faces = me_src->looptri_faces(); - BKE_bvhtree_from_mesh_get(&treedata, me_src, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&treedata, me_src, BVHTREE_FROM_LOOPTRIS, 2); if (mode == MREMAP_MODE_POLY_NEAREST) { nearest.index = -1; diff --git a/source/blender/blenkernel/intern/mesh_remesh_voxel.cc b/source/blender/blenkernel/intern/mesh_remesh_voxel.cc index a9c95ee1b5b..676e298acf0 100644 --- a/source/blender/blenkernel/intern/mesh_remesh_voxel.cc +++ b/source/blender/blenkernel/intern/mesh_remesh_voxel.cc @@ -73,7 +73,7 @@ static Mesh *remesh_quadriflow(const Mesh *input_mesh, /* Gather the required data for export to the internal quadriflow mesh format. */ Array verttri(looptris.size()); - BKE_mesh_runtime_verttri_from_looptri( + BKE_mesh_runtime_verttris_from_looptris( verttri.data(), input_corner_verts.data(), looptris.data(), looptris.size()); const int totfaces = looptris.size(); @@ -199,10 +199,9 @@ static openvdb::FloatGrid::Ptr remesh_voxel_level_set_create(const Mesh *mesh, } for (const int i : IndexRange(looptris.size())) { - const MLoopTri &loop_tri = looptris[i]; - triangles[i] = openvdb::Vec3I(corner_verts[loop_tri.tri[0]], - corner_verts[loop_tri.tri[1]], - corner_verts[loop_tri.tri[2]]); + const MLoopTri < = looptris[i]; + triangles[i] = openvdb::Vec3I( + corner_verts[lt.tri[0]], corner_verts[lt.tri[1]], corner_verts[lt.tri[2]]); } openvdb::math::Transform::Ptr transform = openvdb::math::Transform::createLinearTransform( @@ -324,7 +323,7 @@ static void find_nearest_tris_parallel(const Span positions, static void find_nearest_verts(const Span positions, const Span corner_verts, - const Span src_tris, + const Span src_looptris, const Span dst_positions, const Span nearest_vert_tris, MutableSpan nearest_verts) @@ -332,16 +331,16 @@ static void find_nearest_verts(const Span positions, threading::parallel_for(dst_positions.index_range(), 512, [&](const IndexRange range) { for (const int dst_vert : range) { const float3 &dst_position = dst_positions[dst_vert]; - const MLoopTri &src_tri = src_tris[nearest_vert_tris[dst_vert]]; + const MLoopTri &src_lt = src_looptris[nearest_vert_tris[dst_vert]]; std::array distances; for (const int i : IndexRange(3)) { - const int src_vert = corner_verts[src_tri.tri[i]]; + const int src_vert = corner_verts[src_lt.tri[i]]; distances[i] = math::distance_squared(positions[src_vert], dst_position); } const int min = std::min_element(distances.begin(), distances.end()) - distances.begin(); - nearest_verts[dst_vert] = corner_verts[src_tri.tri[min]]; + nearest_verts[dst_vert] = corner_verts[src_lt.tri[min]]; } }); } @@ -516,7 +515,7 @@ void mesh_remesh_reproject_attributes(const Mesh &src, Mesh &dst) const Span src_positions = src.vert_positions(); const OffsetIndices src_faces = src.faces(); const Span src_corner_verts = src.corner_verts(); - const Span src_tris = src.looptris(); + const Span src_looptris = src.looptris(); /* The main idea in the following code is to trade some complexity in sampling for the benefit of * only using and building a single BVH tree. Since sculpt mode doesn't generally deal with loose @@ -530,7 +529,7 @@ void mesh_remesh_reproject_attributes(const Mesh &src, Mesh &dst) * possibly improved performance from lower cache usage in the "complex" sampling part of the * algorithm and the copying itself. */ BVHTreeFromMesh bvhtree{}; - BKE_bvhtree_from_mesh_get(&bvhtree, &src, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&bvhtree, &src, BVHTREE_FROM_LOOPTRIS, 2); const Span dst_positions = dst.vert_positions(); const OffsetIndices dst_faces = dst.faces(); @@ -545,7 +544,7 @@ void mesh_remesh_reproject_attributes(const Mesh &src, Mesh &dst) if (!point_ids.is_empty()) { Array map(dst.totvert); find_nearest_verts( - src_positions, src_corner_verts, src_tris, dst_positions, vert_nearest_tris, map); + src_positions, src_corner_verts, src_looptris, dst_positions, vert_nearest_tris, map); gather_attributes(point_ids, src_attributes, ATTR_DOMAIN_POINT, map, dst_attributes); } diff --git a/source/blender/blenkernel/intern/mesh_runtime.cc b/source/blender/blenkernel/intern/mesh_runtime.cc index 5c239b9ad46..b5a2b754770 100644 --- a/source/blender/blenkernel/intern/mesh_runtime.cc +++ b/source/blender/blenkernel/intern/mesh_runtime.cc @@ -20,6 +20,7 @@ #include "BLI_timeit.hh" #include "BKE_bvhutils.hh" +#include "BKE_customdata.hh" #include "BKE_editmesh_cache.hh" #include "BKE_lib_id.h" #include "BKE_mesh.hh" @@ -261,21 +262,21 @@ blender::Span Mesh::looptri_faces() const return this->runtime->looptri_faces_cache.data(); } -int BKE_mesh_runtime_looptri_len(const Mesh *mesh) +int BKE_mesh_runtime_looptris_len(const Mesh *mesh) { /* Allow returning the size without calculating the cache. */ return poly_to_tri_count(mesh->faces_num, mesh->totloop); } -void BKE_mesh_runtime_verttri_from_looptri(MVertTri *r_verttri, - const int *corner_verts, - const MLoopTri *looptri, - int looptri_num) +void BKE_mesh_runtime_verttris_from_looptris(MVertTri *r_verttri, + const int *corner_verts, + const MLoopTri *looptris, + int looptris_num) { - for (int i = 0; i < looptri_num; i++) { - r_verttri[i].tri[0] = corner_verts[looptri[i].tri[0]]; - r_verttri[i].tri[1] = corner_verts[looptri[i].tri[1]]; - r_verttri[i].tri[2] = corner_verts[looptri[i].tri[2]]; + for (int i = 0; i < looptris_num; i++) { + r_verttri[i].tri[0] = corner_verts[looptris[i].tri[0]]; + r_verttri[i].tri[1] = corner_verts[looptris[i].tri[1]]; + r_verttri[i].tri[2] = corner_verts[looptris[i].tri[2]]; } } @@ -318,73 +319,73 @@ void BKE_mesh_runtime_clear_geometry(Mesh *mesh) mesh->flag &= ~ME_NO_OVERLAPPING_TOPOLOGY; } -void BKE_mesh_tag_edges_split(Mesh *mesh) +void Mesh::tag_edges_split() { /* Triangulation didn't change because vertex positions and loop vertex indices didn't change. */ - free_bvh_cache(*mesh->runtime); - mesh->runtime->vert_normals_cache.tag_dirty(); - mesh->runtime->subdiv_ccg.reset(); - mesh->runtime->vert_to_face_offset_cache.tag_dirty(); - mesh->runtime->vert_to_face_map_cache.tag_dirty(); - mesh->runtime->vert_to_corner_map_cache.tag_dirty(); - if (mesh->runtime->loose_edges_cache.is_cached() && - mesh->runtime->loose_edges_cache.data().count != 0) + free_bvh_cache(*this->runtime); + this->runtime->vert_normals_cache.tag_dirty(); + this->runtime->subdiv_ccg.reset(); + this->runtime->vert_to_face_offset_cache.tag_dirty(); + this->runtime->vert_to_face_map_cache.tag_dirty(); + this->runtime->vert_to_corner_map_cache.tag_dirty(); + if (this->runtime->loose_edges_cache.is_cached() && + this->runtime->loose_edges_cache.data().count != 0) { - mesh->runtime->loose_edges_cache.tag_dirty(); + this->runtime->loose_edges_cache.tag_dirty(); } - if (mesh->runtime->loose_verts_cache.is_cached() && - mesh->runtime->loose_verts_cache.data().count != 0) + if (this->runtime->loose_verts_cache.is_cached() && + this->runtime->loose_verts_cache.data().count != 0) { - mesh->runtime->loose_verts_cache.tag_dirty(); + this->runtime->loose_verts_cache.tag_dirty(); } - if (mesh->runtime->verts_no_face_cache.is_cached() && - mesh->runtime->verts_no_face_cache.data().count != 0) + if (this->runtime->verts_no_face_cache.is_cached() && + this->runtime->verts_no_face_cache.data().count != 0) { - mesh->runtime->verts_no_face_cache.tag_dirty(); + this->runtime->verts_no_face_cache.tag_dirty(); } - mesh->runtime->subsurf_face_dot_tags.clear_and_shrink(); - mesh->runtime->subsurf_optimal_display_edges.clear_and_shrink(); - mesh->runtime->shrinkwrap_data.reset(); + this->runtime->subsurf_face_dot_tags.clear_and_shrink(); + this->runtime->subsurf_optimal_display_edges.clear_and_shrink(); + this->runtime->shrinkwrap_data.reset(); } -void BKE_mesh_tag_sharpness_changed(Mesh *mesh) +void Mesh::tag_sharpness_changed() { - mesh->runtime->corner_normals_cache.tag_dirty(); + this->runtime->corner_normals_cache.tag_dirty(); } -void BKE_mesh_tag_face_winding_changed(Mesh *mesh) +void Mesh::tag_face_winding_changed() { - mesh->runtime->vert_normals_cache.tag_dirty(); - mesh->runtime->face_normals_cache.tag_dirty(); - mesh->runtime->corner_normals_cache.tag_dirty(); - mesh->runtime->vert_to_corner_map_cache.tag_dirty(); + this->runtime->vert_normals_cache.tag_dirty(); + this->runtime->face_normals_cache.tag_dirty(); + this->runtime->corner_normals_cache.tag_dirty(); + this->runtime->vert_to_corner_map_cache.tag_dirty(); } -void BKE_mesh_tag_positions_changed(Mesh *mesh) +void Mesh::tag_positions_changed() { - mesh->runtime->vert_normals_cache.tag_dirty(); - mesh->runtime->face_normals_cache.tag_dirty(); - mesh->runtime->corner_normals_cache.tag_dirty(); - BKE_mesh_tag_positions_changed_no_normals(mesh); + this->runtime->vert_normals_cache.tag_dirty(); + this->runtime->face_normals_cache.tag_dirty(); + this->runtime->corner_normals_cache.tag_dirty(); + this->tag_positions_changed_no_normals(); } -void BKE_mesh_tag_positions_changed_no_normals(Mesh *mesh) +void Mesh::tag_positions_changed_no_normals() { - free_bvh_cache(*mesh->runtime); - mesh->runtime->looptris_cache.tag_dirty(); - mesh->runtime->bounds_cache.tag_dirty(); + free_bvh_cache(*this->runtime); + this->runtime->looptris_cache.tag_dirty(); + this->runtime->bounds_cache.tag_dirty(); } -void BKE_mesh_tag_positions_changed_uniformly(Mesh *mesh) +void Mesh::tag_positions_changed_uniformly() { /* The normals and triangulation didn't change, since all verts moved by the same amount. */ - free_bvh_cache(*mesh->runtime); - mesh->runtime->bounds_cache.tag_dirty(); + free_bvh_cache(*this->runtime); + this->runtime->bounds_cache.tag_dirty(); } -void BKE_mesh_tag_topology_changed(Mesh *mesh) +void Mesh::tag_topology_changed() { - BKE_mesh_runtime_clear_geometry(mesh); + BKE_mesh_runtime_clear_geometry(this); } /** \} */ diff --git a/source/blender/blenkernel/intern/mesh_sample.cc b/source/blender/blenkernel/intern/mesh_sample.cc index aff8b9ff8fb..e8aeaf297b6 100644 --- a/source/blender/blenkernel/intern/mesh_sample.cc +++ b/source/blender/blenkernel/intern/mesh_sample.cc @@ -27,11 +27,11 @@ BLI_NOINLINE static void sample_point_attribute(const Span corner_verts, const MutableSpan dst) { mask.foreach_index([&](const int i) { - const MLoopTri &tri = looptris[looptri_indices[i]]; + const MLoopTri < = looptris[looptri_indices[i]]; dst[i] = attribute_math::mix3(bary_coords[i], - src[corner_verts[tri.tri[0]]], - src[corner_verts[tri.tri[1]]], - src[corner_verts[tri.tri[2]]]); + src[corner_verts[lt.tri[0]]], + src[corner_verts[lt.tri[1]]], + src[corner_verts[lt.tri[2]]]); }); } @@ -44,11 +44,11 @@ void sample_point_normals(const Span corner_verts, const MutableSpan dst) { mask.foreach_index([&](const int i) { - const MLoopTri &tri = looptris[looptri_indices[i]]; + const MLoopTri < = looptris[looptri_indices[i]]; const float3 value = attribute_math::mix3(bary_coords[i], - src[corner_verts[tri.tri[0]]], - src[corner_verts[tri.tri[1]]], - src[corner_verts[tri.tri[2]]]); + src[corner_verts[lt.tri[0]]], + src[corner_verts[lt.tri[1]]], + src[corner_verts[lt.tri[2]]]); dst[i] = math::normalize(value); }); } @@ -91,8 +91,8 @@ BLI_NOINLINE static void sample_corner_attribute(const Span looptris, return; } } - const MLoopTri &tri = looptris[looptri_indices[i]]; - dst[i] = sample_corner_attribute_with_bary_coords(bary_coords[i], tri, src); + const MLoopTri < = looptris[looptri_indices[i]]; + dst[i] = sample_corner_attribute_with_bary_coords(bary_coords[i], lt, src); }); } @@ -104,8 +104,8 @@ void sample_corner_normals(const Span looptris, const MutableSpan dst) { mask.foreach_index([&](const int i) { - const MLoopTri &tri = looptris[looptri_indices[i]]; - const float3 value = sample_corner_attribute_with_bary_coords(bary_coords[i], tri, src); + const MLoopTri < = looptris[looptri_indices[i]]; + const float3 value = sample_corner_attribute_with_bary_coords(bary_coords[i], lt, src); dst[i] = math::normalize(value); }); } @@ -172,9 +172,9 @@ static void sample_barycentric_weights(const Span vert_positions, return; } } - const MLoopTri &tri = looptris[looptri_indices[i]]; + const MLoopTri < = looptris[looptri_indices[i]]; bary_coords[i] = compute_bary_coord_in_triangle( - vert_positions, corner_verts, tri, sample_positions[i]); + vert_positions, corner_verts, lt, sample_positions[i]); }); } @@ -194,11 +194,11 @@ static void sample_nearest_weights(const Span vert_positions, return; } } - const MLoopTri &tri = looptris[looptri_indices[i]]; + const MLoopTri < = looptris[looptri_indices[i]]; bary_coords[i] = MIN3_PAIR( - math::distance_squared(sample_positions[i], vert_positions[corner_verts[tri.tri[0]]]), - math::distance_squared(sample_positions[i], vert_positions[corner_verts[tri.tri[1]]]), - math::distance_squared(sample_positions[i], vert_positions[corner_verts[tri.tri[2]]]), + math::distance_squared(sample_positions[i], vert_positions[corner_verts[lt.tri[0]]]), + math::distance_squared(sample_positions[i], vert_positions[corner_verts[lt.tri[1]]]), + math::distance_squared(sample_positions[i], vert_positions[corner_verts[lt.tri[2]]]), float3(1, 0, 0), float3(0, 1, 0), float3(0, 0, 1)); @@ -227,11 +227,11 @@ int sample_surface_points_spherical(RandomNumberGenerator &rng, const int old_num = r_bary_coords.size(); for (const int looptri_index : looptri_indices_to_sample) { - const MLoopTri &looptri = looptris[looptri_index]; + const MLoopTri < = looptris[looptri_index]; - const float3 &v0 = positions[corner_verts[looptri.tri[0]]]; - const float3 &v1 = positions[corner_verts[looptri.tri[1]]]; - const float3 &v2 = positions[corner_verts[looptri.tri[2]]]; + const float3 &v0 = positions[corner_verts[lt.tri[0]]]; + const float3 &v1 = positions[corner_verts[lt.tri[1]]]; + const float3 &v2 = positions[corner_verts[lt.tri[2]]]; const float looptri_area = area_tri_v3(v0, v1, v2); @@ -367,12 +367,12 @@ int sample_surface_points_projected( float3 compute_bary_coord_in_triangle(const Span vert_positions, const Span corner_verts, - const MLoopTri &looptri, + const MLoopTri <, const float3 &position) { - const float3 &v0 = vert_positions[corner_verts[looptri.tri[0]]]; - const float3 &v1 = vert_positions[corner_verts[looptri.tri[1]]]; - const float3 &v2 = vert_positions[corner_verts[looptri.tri[2]]]; + const float3 &v0 = vert_positions[corner_verts[lt.tri[0]]]; + const float3 &v1 = vert_positions[corner_verts[lt.tri[1]]]; + const float3 &v2 = vert_positions[corner_verts[lt.tri[2]]]; float3 bary_coords; interp_weights_tri_v3(bary_coords, v0, v1, v2, position); return bary_coords; diff --git a/source/blender/blenkernel/intern/mesh_tangent.cc b/source/blender/blenkernel/intern/mesh_tangent.cc index 51f19234d93..f1d53964304 100644 --- a/source/blender/blenkernel/intern/mesh_tangent.cc +++ b/source/blender/blenkernel/intern/mesh_tangent.cc @@ -156,7 +156,7 @@ void BKE_mesh_calc_loop_tangent_single(Mesh *mesh, /** \name Mesh Tangent Calculations (All Layers) * \{ */ -/* Necessary complexity to handle looptri's as quads for correct tangents */ +/* Necessary complexity to handle looptris as quads for correct tangents. */ #define USE_LOOPTRI_DETECT_QUADS struct SGLSLMeshToTangent { @@ -189,7 +189,7 @@ struct SGLSLMeshToTangent { { #ifdef USE_LOOPTRI_DETECT_QUADS if (face_as_quad_map) { - lt = looptri[face_as_quad_map[face_num]]; + lt = looptris[face_as_quad_map[face_num]]; face_index = looptri_faces[face_as_quad_map[face_num]]; if (faces[face_index].size() == 4) { return uint(faces[face_index][vert_num]); @@ -197,11 +197,11 @@ struct SGLSLMeshToTangent { /* fall through to regular triangle */ } else { - lt = looptri[face_num]; + lt = looptris[face_num]; face_index = looptri_faces[face_num]; } #else - lt = &looptri[face_num]; + lt = &looptris[face_num]; #endif return lt.tri[vert_num]; } @@ -237,7 +237,7 @@ struct SGLSLMeshToTangent { if (precomputedLoopNormals) { return mikk::float3(precomputedLoopNormals[loop_index]); } - if (sharp_faces && sharp_faces[face_index]) { /* flat */ + if (!sharp_faces.is_empty() && sharp_faces[face_index]) { /* flat */ if (precomputedFaceNormals) { return mikk::float3(precomputedFaceNormals[face_index]); } @@ -275,7 +275,7 @@ struct SGLSLMeshToTangent { const float (*precomputedFaceNormals)[3]; const float (*precomputedLoopNormals)[3]; - const MLoopTri *looptri; + const MLoopTri *looptris; const int *looptri_faces; const float2 *mloopuv; /* texture coordinates */ blender::OffsetIndices faces; @@ -284,12 +284,12 @@ struct SGLSLMeshToTangent { const float (*vert_normals)[3]; const float (*orco)[3]; float (*tangent)[4]; /* destination */ - const bool *sharp_faces; + blender::Span sharp_faces; int numTessFaces; #ifdef USE_LOOPTRI_DETECT_QUADS - /* map from 'fake' face index to looptri, - * quads will point to the first looptri of the quad */ + /* map from 'fake' face index to looptris, + * quads will point to the first looptris of the quad */ const int *face_as_quad_map; int num_face_as_quad_map; #endif @@ -394,10 +394,10 @@ void BKE_mesh_calc_loop_tangent_step_0(const CustomData *loopData, void BKE_mesh_calc_loop_tangent_ex(const float (*vert_positions)[3], const blender::OffsetIndices faces, const int *corner_verts, - const MLoopTri *looptri, + const MLoopTri *looptris, const int *looptri_faces, - const uint looptri_len, - const bool *sharp_faces, + const uint looptris_len, + const blender::Span sharp_faces, CustomData *loopdata, bool calc_active_tangent, @@ -461,28 +461,28 @@ void BKE_mesh_calc_loop_tangent_ex(const float (*vert_positions)[3], int *face_as_quad_map = nullptr; /* map faces to quads */ - if (looptri_len != uint(faces.size())) { + if (looptris_len != uint(faces.size())) { /* Over allocate, since we don't know how many ngon or quads we have. */ - /* map fake face index to looptri */ - face_as_quad_map = static_cast(MEM_mallocN(sizeof(int) * looptri_len, __func__)); + /* Map fake face index to looptris. */ + face_as_quad_map = static_cast(MEM_mallocN(sizeof(int) * looptris_len, __func__)); int k, j; - for (k = 0, j = 0; j < int(looptri_len); k++, j++) { + for (k = 0, j = 0; j < int(looptris_len); k++, j++) { face_as_quad_map[k] = j; /* step over all quads */ if (faces[looptri_faces[j]].size() == 4) { - j++; /* skips the nest looptri */ + j++; /* Skips the next looptri. */ } } num_face_as_quad_map = k; } else { - num_face_as_quad_map = int(looptri_len); + num_face_as_quad_map = int(looptris_len); } #endif /* Calculation */ - if (looptri_len != 0) { + if (looptris_len != 0) { TaskPool *task_pool = BLI_task_pool_create(nullptr, TASK_PRIORITY_HIGH); tangent_mask_curr = 0; @@ -493,7 +493,7 @@ void BKE_mesh_calc_loop_tangent_ex(const float (*vert_positions)[3], int index = CustomData_get_layer_index_n(loopdata_out, CD_TANGENT, n); BLI_assert(n < MAX_MTFACE); SGLSLMeshToTangent *mesh2tangent = &data_array[n]; - mesh2tangent->numTessFaces = int(looptri_len); + mesh2tangent->numTessFaces = int(looptris_len); #ifdef USE_LOOPTRI_DETECT_QUADS mesh2tangent->face_as_quad_map = face_as_quad_map; mesh2tangent->num_face_as_quad_map = num_face_as_quad_map; @@ -502,7 +502,7 @@ void BKE_mesh_calc_loop_tangent_ex(const float (*vert_positions)[3], mesh2tangent->vert_normals = vert_normals; mesh2tangent->faces = faces; mesh2tangent->corner_verts = corner_verts; - mesh2tangent->looptri = looptri; + mesh2tangent->looptris = looptris; mesh2tangent->looptri_faces = looptri_faces; mesh2tangent->sharp_faces = sharp_faces; /* NOTE: we assume we do have tessellated loop normals at this point @@ -581,7 +581,11 @@ void BKE_mesh_calc_loop_tangents(Mesh *me_eval, int tangent_names_len) { /* TODO(@ideasman42): store in Mesh.runtime to avoid recalculation. */ + using namespace blender; + using namespace blender::bke; const blender::Span looptris = me_eval->looptris(); + const bke::AttributeAccessor attributes = me_eval->attributes(); + const VArraySpan sharp_face = *attributes.lookup("sharp_face", ATTR_DOMAIN_FACE); short tangent_mask = 0; BKE_mesh_calc_loop_tangent_ex( reinterpret_cast(me_eval->vert_positions().data()), @@ -590,8 +594,7 @@ void BKE_mesh_calc_loop_tangents(Mesh *me_eval, looptris.data(), me_eval->looptri_faces().data(), uint(looptris.size()), - static_cast( - CustomData_get_layer_named(&me_eval->face_data, CD_PROP_BOOL, "sharp_face")), + sharp_face, &me_eval->loop_data, calc_active_tangent, tangent_names, diff --git a/source/blender/blenkernel/intern/mesh_tessellate.cc b/source/blender/blenkernel/intern/mesh_tessellate.cc index f2f3e047b90..e733cd07c76 100644 --- a/source/blender/blenkernel/intern/mesh_tessellate.cc +++ b/source/blender/blenkernel/intern/mesh_tessellate.cc @@ -42,7 +42,7 @@ BLI_INLINE void mesh_calc_tessellation_for_face_impl(const Span corner_vert const blender::OffsetIndices faces, const Span positions, uint face_index, - MLoopTri *mlt, + MLoopTri *lt, MemArena **pf_arena_p, const bool face_normal, const float normal_precalc[3]) @@ -51,9 +51,9 @@ BLI_INLINE void mesh_calc_tessellation_for_face_impl(const Span corner_vert const uint mp_totloop = uint(faces[face_index].size()); auto create_tri = [&](uint i1, uint i2, uint i3) { - mlt->tri[0] = mp_loopstart + i1; - mlt->tri[1] = mp_loopstart + i2; - mlt->tri[2] = mp_loopstart + i3; + lt->tri[0] = mp_loopstart + i1; + lt->tri[1] = mp_loopstart + i2; + lt->tri[2] = mp_loopstart + i3; }; switch (mp_totloop) { @@ -63,17 +63,17 @@ BLI_INLINE void mesh_calc_tessellation_for_face_impl(const Span corner_vert } case 4: { create_tri(0, 1, 2); - MLoopTri *mlt_a = mlt++; + MLoopTri *lt_a = lt++; create_tri(0, 2, 3); - MLoopTri *mlt_b = mlt; - if (UNLIKELY(is_quad_flip_v3_first_third_fast(positions[corner_verts[mlt_a->tri[0]]], - positions[corner_verts[mlt_a->tri[1]]], - positions[corner_verts[mlt_a->tri[2]]], - positions[corner_verts[mlt_b->tri[2]]]))) + MLoopTri *lt_b = lt; + if (UNLIKELY(is_quad_flip_v3_first_third_fast(positions[corner_verts[lt_a->tri[0]]], + positions[corner_verts[lt_a->tri[1]]], + positions[corner_verts[lt_a->tri[2]]], + positions[corner_verts[lt_b->tri[2]]]))) { /* Flip out of degenerate 0-2 state. */ - mlt_a->tri[2] = mlt_b->tri[2]; - mlt_b->tri[0] = mlt_a->tri[1]; + lt_a->tri[2] = lt_b->tri[2]; + lt_b->tri[0] = lt_a->tri[1]; } break; } @@ -122,7 +122,7 @@ BLI_INLINE void mesh_calc_tessellation_for_face_impl(const Span corner_vert BLI_polyfill_calc_arena(projverts, mp_totloop, 1, tris, pf_arena); /* Apply fill. */ - for (uint j = 0; j < totfilltri; j++, mlt++) { + for (uint j = 0; j < totfilltri; j++, lt++) { const uint *tri = tris[j]; create_tri(tri[0], tri[1], tri[2]); } @@ -139,30 +139,30 @@ static void mesh_calc_tessellation_for_face(const Span corner_verts, const blender::OffsetIndices faces, const Span positions, uint face_index, - MLoopTri *mlt, + MLoopTri *lt, MemArena **pf_arena_p) { mesh_calc_tessellation_for_face_impl( - corner_verts, faces, positions, face_index, mlt, pf_arena_p, false, nullptr); + corner_verts, faces, positions, face_index, lt, pf_arena_p, false, nullptr); } static void mesh_calc_tessellation_for_face_with_normal(const Span corner_verts, const blender::OffsetIndices faces, const Span positions, uint face_index, - MLoopTri *mlt, + MLoopTri *lt, MemArena **pf_arena_p, const float normal_precalc[3]) { mesh_calc_tessellation_for_face_impl( - corner_verts, faces, positions, face_index, mlt, pf_arena_p, true, normal_precalc); + corner_verts, faces, positions, face_index, lt, pf_arena_p, true, normal_precalc); } -static void mesh_recalc_looptri__single_threaded(const Span corner_verts, - const blender::OffsetIndices faces, - const Span positions, - MLoopTri *mlooptri, - const float (*face_normals)[3]) +static void mesh_recalc_looptris__single_threaded(const Span corner_verts, + const blender::OffsetIndices faces, + const Span positions, + MLoopTri *looptris, + const float (*face_normals)[3]) { MemArena *pf_arena = nullptr; uint looptri_i = 0; @@ -173,7 +173,7 @@ static void mesh_recalc_looptri__single_threaded(const Span corner_verts, faces, positions, uint(i), - &mlooptri[looptri_i], + &looptris[looptri_i], &pf_arena, face_normals[i]); looptri_i += uint(faces[i].size() - 2); @@ -182,7 +182,7 @@ static void mesh_recalc_looptri__single_threaded(const Span corner_verts, else { for (const int64_t i : faces.index_range()) { mesh_calc_tessellation_for_face( - corner_verts, faces, positions, uint(i), &mlooptri[looptri_i], &pf_arena); + corner_verts, faces, positions, uint(i), &looptris[looptri_i], &pf_arena); looptri_i += uint(faces[i].size() - 2); } } @@ -200,7 +200,7 @@ struct TessellationUserData { Span positions; /** Output array. */ - MutableSpan mlooptri; + MutableSpan looptris; /** Optional pre-calculated face normals array. */ const float (*face_normals)[3]; @@ -221,7 +221,7 @@ static void mesh_calc_tessellation_for_face_fn(void *__restrict userdata, data->faces, data->positions, uint(index), - &data->mlooptri[looptri_i], + &data->looptris[looptri_i], &tls_data->pf_arena, false, nullptr); @@ -238,7 +238,7 @@ static void mesh_calc_tessellation_for_face_with_normal_fn(void *__restrict user data->faces, data->positions, uint(index), - &data->mlooptri[looptri_i], + &data->looptris[looptri_i], &tls_data->pf_arena, true, data->face_normals[index]); @@ -260,11 +260,12 @@ static void looptris_calc_all(const Span positions, MutableSpan looptris) { if (corner_verts.size() < MESH_FACE_TESSELLATE_THREADED_LIMIT) { - mesh_recalc_looptri__single_threaded(corner_verts, - faces, - positions, - looptris.data(), - reinterpret_cast(face_normals.data())); + mesh_recalc_looptris__single_threaded( + corner_verts, + faces, + positions, + looptris.data(), + reinterpret_cast(face_normals.data())); return; } TessellationUserTLS tls_data_dummy = {nullptr}; @@ -273,7 +274,7 @@ static void looptris_calc_all(const Span positions, data.corner_verts = corner_verts; data.faces = faces; data.positions = positions; - data.mlooptri = looptris; + data.looptris = looptris; data.face_normals = reinterpret_cast(face_normals.data()); TaskParallelSettings settings; @@ -318,7 +319,7 @@ void looptris_calc_with_normals(const Span vert_positions, const Span face_normals, MutableSpan looptris) { - BLI_assert(!face_normals.is_empty() || faces.size() == 0); + BLI_assert(!face_normals.is_empty() || faces.is_empty()); looptris_calc_all(vert_positions, faces, corner_verts, face_normals, looptris); } @@ -327,12 +328,12 @@ void looptris_calc_with_normals(const Span vert_positions, int3 looptri_get_real_edges(const Span edges, const Span corner_verts, const Span corner_edges, - const MLoopTri &tri) + const MLoopTri <) { int3 real_edges; for (int i = 2, i_next = 0; i_next < 3; i = i_next++) { - const int corner_1 = int(tri.tri[i]); - const int corner_2 = int(tri.tri[i_next]); + const int corner_1 = int(lt.tri[i]); + const int corner_2 = int(lt.tri[i_next]); const int vert_1 = corner_verts[corner_1]; const int vert_2 = corner_verts[corner_2]; const int edge_i = corner_edges[corner_1]; diff --git a/source/blender/blenkernel/intern/mesh_wrapper.cc b/source/blender/blenkernel/intern/mesh_wrapper.cc index ba7952c89be..242c523befa 100644 --- a/source/blender/blenkernel/intern/mesh_wrapper.cc +++ b/source/blender/blenkernel/intern/mesh_wrapper.cc @@ -193,7 +193,7 @@ void BKE_mesh_wrapper_tag_positions_changed(Mesh *mesh) break; case ME_WRAPPER_TYPE_MDATA: case ME_WRAPPER_TYPE_SUBD: - BKE_mesh_tag_positions_changed(mesh); + mesh->tag_positions_changed(); break; } } diff --git a/source/blender/blenkernel/intern/modifier.cc b/source/blender/blenkernel/intern/modifier.cc index 609e88a2584..93dac9c69f4 100644 --- a/source/blender/blenkernel/intern/modifier.cc +++ b/source/blender/blenkernel/intern/modifier.cc @@ -943,7 +943,7 @@ void BKE_modifier_deform_verts(ModifierData *md, } mti->deform_verts(md, ctx, mesh, positions); if (mesh) { - BKE_mesh_tag_positions_changed(mesh); + mesh->tag_positions_changed(); } } diff --git a/source/blender/blenkernel/intern/multires_reshape_apply_base.cc b/source/blender/blenkernel/intern/multires_reshape_apply_base.cc index eba1a6ec99d..52193f4df57 100644 --- a/source/blender/blenkernel/intern/multires_reshape_apply_base.cc +++ b/source/blender/blenkernel/intern/multires_reshape_apply_base.cc @@ -142,7 +142,7 @@ void multires_reshape_apply_base_refit_base_mesh(MultiresReshapeContext *reshape /* Vertices were moved around, need to update normals after all the vertices are updated * Probably this is possible to do in the loop above, but this is rather tricky because * we don't know all needed vertices' coordinates there yet. */ - BKE_mesh_tag_positions_changed(base_mesh); + base_mesh->tag_positions_changed(); } void multires_reshape_apply_base_refine_from_base(MultiresReshapeContext *reshape_context) diff --git a/source/blender/blenkernel/intern/multires_reshape_smooth.cc b/source/blender/blenkernel/intern/multires_reshape_smooth.cc index a33669ffe6d..09f81e8aff6 100644 --- a/source/blender/blenkernel/intern/multires_reshape_smooth.cc +++ b/source/blender/blenkernel/intern/multires_reshape_smooth.cc @@ -27,9 +27,9 @@ #include "BKE_subdiv_foreach.hh" #include "BKE_subdiv_mesh.hh" -#include "opensubdiv_converter_capi.h" -#include "opensubdiv_evaluator_capi.h" -#include "opensubdiv_topology_refiner_capi.h" +#include "opensubdiv_converter_capi.hh" +#include "opensubdiv_evaluator_capi.hh" +#include "opensubdiv_topology_refiner_capi.hh" #include "atomic_ops.h" #include "subdiv_converter.hh" diff --git a/source/blender/blenkernel/intern/multires_versioning.cc b/source/blender/blenkernel/intern/multires_versioning.cc index 3d9e454765f..aa4e448246f 100644 --- a/source/blender/blenkernel/intern/multires_versioning.cc +++ b/source/blender/blenkernel/intern/multires_versioning.cc @@ -16,7 +16,7 @@ #include "BKE_subdiv_eval.hh" #include "multires_reshape.hh" -#include "opensubdiv_converter_capi.h" +#include "opensubdiv_converter_capi.hh" #include "subdiv_converter.hh" static float simple_to_catmull_clark_get_edge_sharpness(const OpenSubdiv_Converter * /*converter*/, diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index d7f0b1e9076..d04773fc8a4 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -2432,7 +2432,11 @@ bNode *nodeAddNode(const bContext *C, bNodeTree *ntree, const char *idname) BKE_ntree_update_tag_node_new(ntree, node); - if (ELEM(node->type, GEO_NODE_INPUT_SCENE_TIME, GEO_NODE_SELF_OBJECT, GEO_NODE_SIMULATION_INPUT)) + if (ELEM(node->type, + GEO_NODE_INPUT_SCENE_TIME, + GEO_NODE_INPUT_ACTIVE_CAMERA, + GEO_NODE_SELF_OBJECT, + GEO_NODE_SIMULATION_INPUT)) { DEG_relations_tag_update(CTX_data_main(C)); } diff --git a/source/blender/blenkernel/intern/node_socket_value_cpp_type.cc b/source/blender/blenkernel/intern/node_socket_value_cpp_type.cc index ae237d66999..6ee29d3acd7 100644 --- a/source/blender/blenkernel/intern/node_socket_value_cpp_type.cc +++ b/source/blender/blenkernel/intern/node_socket_value_cpp_type.cc @@ -12,32 +12,32 @@ namespace blender::bke { static auto &get_from_self_map() { - static Map map; + static Map map; return map; } static auto &get_from_value_map() { - static Map map; + static Map map; return map; } -void ValueOrFieldCPPType::register_self() +void SocketValueVariantCPPType::register_self() { get_from_value_map().add_new(&this->value, this); get_from_self_map().add_new(&this->self, this); } -const ValueOrFieldCPPType *ValueOrFieldCPPType::get_from_self(const CPPType &self) +const SocketValueVariantCPPType *SocketValueVariantCPPType::get_from_self(const CPPType &self) { - const ValueOrFieldCPPType *type = get_from_self_map().lookup_default(&self, nullptr); + const SocketValueVariantCPPType *type = get_from_self_map().lookup_default(&self, nullptr); BLI_assert(type == nullptr || type->self == self); return type; } -const ValueOrFieldCPPType *ValueOrFieldCPPType::get_from_value(const CPPType &value) +const SocketValueVariantCPPType *SocketValueVariantCPPType::get_from_value(const CPPType &value) { - const ValueOrFieldCPPType *type = get_from_value_map().lookup_default(&value, nullptr); + const SocketValueVariantCPPType *type = get_from_value_map().lookup_default(&value, nullptr); BLI_assert(type == nullptr || type->value == value); return type; } diff --git a/source/blender/blenkernel/intern/object.cc b/source/blender/blenkernel/intern/object.cc index 137d7417b0d..7bb7b42dd34 100644 --- a/source/blender/blenkernel/intern/object.cc +++ b/source/blender/blenkernel/intern/object.cc @@ -411,7 +411,8 @@ static void object_foreach_id(ID *id, LibraryForeachIDData *data) } } - BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, object->parent, IDWALK_CB_NEVER_SELF); + BKE_LIB_FOREACHID_PROCESS_IDSUPER( + data, object->parent, IDWALK_CB_NEVER_SELF | IDWALK_CB_OVERRIDE_LIBRARY_HIERARCHY_DEFAULT); BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, object->track, IDWALK_CB_NEVER_SELF); for (int i = 0; i < object->totcol; i++) { @@ -3514,13 +3515,6 @@ void BKE_object_apply_parent_inverse(Object *ob) /** \name Object Bounding Box API * \{ */ -BoundBox *BKE_boundbox_alloc_unit() -{ - BoundBox *bb = MEM_cnew(__func__); - BKE_boundbox_init_from_minmax(bb, float3(-1), float3(1)); - return bb; -} - void BKE_boundbox_init_from_minmax(BoundBox *bb, const float min[3], const float max[3]) { bb->vec[0][0] = bb->vec[1][0] = bb->vec[2][0] = bb->vec[3][0] = min[0]; @@ -3533,20 +3527,6 @@ void BKE_boundbox_init_from_minmax(BoundBox *bb, const float min[3], const float bb->vec[1][2] = bb->vec[2][2] = bb->vec[5][2] = bb->vec[6][2] = max[2]; } -void BKE_boundbox_calc_center_aabb(const BoundBox *bb, float r_cent[3]) -{ - r_cent[0] = 0.5f * (bb->vec[0][0] + bb->vec[4][0]); - r_cent[1] = 0.5f * (bb->vec[0][1] + bb->vec[2][1]); - r_cent[2] = 0.5f * (bb->vec[0][2] + bb->vec[1][2]); -} - -void BKE_boundbox_calc_size_aabb(const BoundBox *bb, float r_size[3]) -{ - r_size[0] = 0.5f * fabsf(bb->vec[0][0] - bb->vec[4][0]); - r_size[1] = 0.5f * fabsf(bb->vec[0][1] - bb->vec[2][1]); - r_size[2] = 0.5f * fabsf(bb->vec[0][2] - bb->vec[1][2]); -} - void BKE_boundbox_minmax(const BoundBox *bb, const float obmat[4][4], float r_min[3], @@ -3676,8 +3656,10 @@ void BKE_object_minmax(Object *ob, float r_min[3], float r_max[3]) { using namespace blender; if (const std::optional> bounds = BKE_object_boundbox_get(ob)) { - copy_v3_v3(r_min, math::transform_point(float4x4(ob->object_to_world), bounds->min)); - copy_v3_v3(r_max, math::transform_point(float4x4(ob->object_to_world), bounds->max)); + minmax_v3v3_v3( + r_min, r_max, math::transform_point(float4x4(ob->object_to_world), bounds->min)); + minmax_v3v3_v3( + r_min, r_max, math::transform_point(float4x4(ob->object_to_world), bounds->max)); return; } float3 size = ob->scale; diff --git a/source/blender/blenkernel/intern/object_deform.cc b/source/blender/blenkernel/intern/object_deform.cc index b1a3c1e4691..0c735487517 100644 --- a/source/blender/blenkernel/intern/object_deform.cc +++ b/source/blender/blenkernel/intern/object_deform.cc @@ -112,7 +112,7 @@ bDeformGroup *BKE_object_defgroup_add(Object *ob) MDeformVert *BKE_object_defgroup_data_create(ID *id) { if (GS(id->name) == ID_ME) { - return BKE_mesh_deform_verts_for_write((Mesh *)id); + return ((Mesh *)id)->deform_verts_for_write().data(); } if (GS(id->name) == ID_LT) { Lattice *lt = (Lattice *)id; @@ -160,12 +160,12 @@ bool BKE_object_defgroup_clear(Object *ob, bDeformGroup *dg, const bool use_sele } } else { - if (BKE_mesh_deform_verts(mesh)) { + if (!mesh->deform_verts().data()) { const bool *select_vert = (const bool *)CustomData_get_layer_named( &mesh->vert_data, CD_PROP_BOOL, ".select_vert"); int i; - dv = BKE_mesh_deform_verts_for_write(mesh); + dv = mesh->deform_verts_for_write().data(); for (i = 0; i < mesh->totvert; i++, dv++) { if (dv->dw && (!use_selection || (select_vert && select_vert[i]))) { @@ -496,7 +496,7 @@ bool BKE_object_defgroup_array_get(ID *id, MDeformVert **dvert_arr, int *dvert_t switch (GS(id->name)) { case ID_ME: { Mesh *mesh = (Mesh *)id; - *dvert_arr = BKE_mesh_deform_verts_for_write(mesh); + *dvert_arr = mesh->deform_verts_for_write().data(); *dvert_tot = mesh->totvert; return true; } diff --git a/source/blender/blenkernel/intern/paint.cc b/source/blender/blenkernel/intern/paint.cc index 744d3655478..9bd5f3fd2e0 100644 --- a/source/blender/blenkernel/intern/paint.cc +++ b/source/blender/blenkernel/intern/paint.cc @@ -2106,26 +2106,22 @@ void BKE_sculpt_sync_face_visibility_to_grids(Mesh *mesh, SubdivCCG *subdiv_ccg) }); } +namespace blender::bke { + static PBVH *build_pbvh_for_dynamic_topology(Object *ob) { - PBVH *pbvh = ob->sculpt->pbvh = BKE_pbvh_new(PBVH_BMESH); - sculptsession_bmesh_add_layers(ob); - BKE_pbvh_build_bmesh(pbvh, - ob->sculpt->bm, - ob->sculpt->bm_log, - ob->sculpt->attrs.dyntopo_node_id_vertex->bmesh_cd_offset, - ob->sculpt->attrs.dyntopo_node_id_face->bmesh_cd_offset); - return pbvh; + return pbvh::build_bmesh(ob->sculpt->bm, + ob->sculpt->bm_log, + ob->sculpt->attrs.dyntopo_node_id_vertex->bmesh_cd_offset, + ob->sculpt->attrs.dyntopo_node_id_face->bmesh_cd_offset); } static PBVH *build_pbvh_from_regular_mesh(Object *ob, Mesh *me_eval_deform) { Mesh *mesh = BKE_object_get_original_mesh(ob); - PBVH *pbvh = BKE_pbvh_new(PBVH_FACES); - - BKE_pbvh_build_mesh(pbvh, mesh); + PBVH *pbvh = pbvh::build_mesh(mesh); const bool is_deformed = check_sculpt_object_deformed(ob, true); if (is_deformed && me_eval_deform != nullptr) { @@ -2138,17 +2134,17 @@ static PBVH *build_pbvh_from_regular_mesh(Object *ob, Mesh *me_eval_deform) static PBVH *build_pbvh_from_ccg(Object *ob, SubdivCCG *subdiv_ccg) { const CCGKey key = BKE_subdiv_ccg_key_top_level(*subdiv_ccg); - PBVH *pbvh = BKE_pbvh_new(PBVH_GRIDS); - Mesh *base_mesh = BKE_mesh_from_object(ob); BKE_sculpt_sync_face_visibility_to_grids(base_mesh, subdiv_ccg); - BKE_pbvh_build_grids(pbvh, &key, base_mesh, subdiv_ccg); - return pbvh; + return pbvh::build_grids(&key, base_mesh, subdiv_ccg); } +} // namespace blender::bke + PBVH *BKE_sculpt_object_pbvh_ensure(Depsgraph *depsgraph, Object *ob) { + using namespace blender::bke; if (ob->sculpt == nullptr) { return nullptr; } @@ -2160,7 +2156,7 @@ PBVH *BKE_sculpt_object_pbvh_ensure(Depsgraph *depsgraph, Object *ob) const PBVHType pbvh_type = BKE_pbvh_type(pbvh); switch (pbvh_type) { case PBVH_FACES: { - BKE_pbvh_update_mesh_pointers(pbvh, BKE_object_get_original_mesh(ob)); + pbvh::update_mesh_pointers(pbvh, BKE_object_get_original_mesh(ob)); break; } case PBVH_GRIDS: { @@ -2264,16 +2260,13 @@ void BKE_paint_face_set_overlay_color_get(const int face_set, const int seed, uc int BKE_sculptsession_vertex_count(const SculptSession *ss) { - switch (BKE_pbvh_type(ss->pbvh)) { - case PBVH_FACES: - return ss->totvert; - case PBVH_BMESH: - return BM_mesh_elem_count(ss->bm, BM_VERT); - case PBVH_GRIDS: - return BKE_pbvh_get_grid_num_verts(ss->pbvh); + if (ss->bm) { + return ss->bm->totvert; } - - return 0; + if (ss->subdiv_ccg) { + return ss->subdiv_ccg->grids.size() * BKE_subdiv_ccg_key_top_level(*ss->subdiv_ccg).grid_area; + } + return ss->totvert; } /** @@ -2390,79 +2383,67 @@ static bool sculpt_attribute_create(SculptSession *ss, out->simple_array = false; - switch (BKE_pbvh_type(ss->pbvh)) { - case PBVH_BMESH: { - CustomData *cdata = nullptr; - out->data_for_bmesh = true; + if (BMesh *bm = ss->bm) { + CustomData *cdata = nullptr; + out->data_for_bmesh = true; - switch (domain) { - case ATTR_DOMAIN_POINT: - cdata = &ss->bm->vdata; - break; - case ATTR_DOMAIN_FACE: - cdata = &ss->bm->pdata; - break; - default: - out->used = false; - return false; - } - - BLI_assert(CustomData_get_named_layer_index(cdata, proptype, name) == -1); - - BM_data_layer_add_named(ss->bm, cdata, proptype, name); - int index = CustomData_get_named_layer_index(cdata, proptype, name); - - if (!permanent) { - cdata->layers[index].flag |= CD_FLAG_TEMPORARY | CD_FLAG_NOCOPY; - } - - out->data = nullptr; - out->layer = cdata->layers + index; - out->bmesh_cd_offset = out->layer->offset; - out->elem_size = CustomData_sizeof(proptype); - break; + switch (domain) { + case ATTR_DOMAIN_POINT: + cdata = &bm->vdata; + break; + case ATTR_DOMAIN_FACE: + cdata = &bm->pdata; + break; + default: + out->used = false; + return false; } - case PBVH_FACES: { - CustomData *cdata = nullptr; - switch (domain) { - case ATTR_DOMAIN_POINT: - cdata = &mesh->vert_data; - break; - case ATTR_DOMAIN_FACE: - cdata = &mesh->face_data; - break; - default: - out->used = false; - return false; - } + BLI_assert(CustomData_get_named_layer_index(cdata, proptype, name) == -1); - BLI_assert(CustomData_get_named_layer_index(cdata, proptype, name) == -1); + BM_data_layer_add_named(bm, cdata, proptype, name); + int index = CustomData_get_named_layer_index(cdata, proptype, name); - CustomData_add_layer_named(cdata, proptype, CD_SET_DEFAULT, totelem, name); - int index = CustomData_get_named_layer_index(cdata, proptype, name); - - if (!permanent) { - cdata->layers[index].flag |= CD_FLAG_TEMPORARY | CD_FLAG_NOCOPY; - } - - out->layer = cdata->layers + index; - out->data = out->layer->data; - out->data_for_bmesh = false; - out->bmesh_cd_offset = -1; - out->elem_size = CustomData_get_elem_size(out->layer); - - break; + if (!permanent) { + cdata->layers[index].flag |= CD_FLAG_TEMPORARY | CD_FLAG_NOCOPY; } - case PBVH_GRIDS: { - /* GRIDS should have been handled as simple arrays. */ - BLI_assert_unreachable(); - break; - } - default: - BLI_assert_unreachable(); - break; + + out->data = nullptr; + out->layer = cdata->layers + index; + out->bmesh_cd_offset = out->layer->offset; + out->elem_size = CustomData_sizeof(proptype); } + else { + CustomData *cdata = nullptr; + + switch (domain) { + case ATTR_DOMAIN_POINT: + cdata = &mesh->vert_data; + break; + case ATTR_DOMAIN_FACE: + cdata = &mesh->face_data; + break; + default: + out->used = false; + return false; + } + + BLI_assert(CustomData_get_named_layer_index(cdata, proptype, name) == -1); + + CustomData_add_layer_named(cdata, proptype, CD_SET_DEFAULT, totelem, name); + int index = CustomData_get_named_layer_index(cdata, proptype, name); + + if (!permanent) { + cdata->layers[index].flag |= CD_FLAG_TEMPORARY | CD_FLAG_NOCOPY; + } + + out->layer = cdata->layers + index; + out->data = out->layer->data; + out->data_for_bmesh = false; + out->bmesh_cd_offset = -1; + out->elem_size = CustomData_get_elem_size(out->layer); + } + /* GRIDS should have been handled as simple arrays. */ out->used = true; out->elem_num = totelem; diff --git a/source/blender/blenkernel/intern/particle.cc b/source/blender/blenkernel/intern/particle.cc index e52b4eaf93a..1a18c80c0c4 100644 --- a/source/blender/blenkernel/intern/particle.cc +++ b/source/blender/blenkernel/intern/particle.cc @@ -2575,7 +2575,7 @@ float *psys_cache_vgroup(Mesh *mesh, ParticleSystem *psys, int vgroup) /* hair dynamics pinning vgroup */ } else if (psys->vgroup[vgroup]) { - const MDeformVert *dvert = BKE_mesh_deform_verts(mesh); + const MDeformVert *dvert = mesh->deform_verts().data(); if (dvert) { int totvert = mesh->totvert, i; vg = static_cast(MEM_callocN(sizeof(float) * totvert, "vg_cache")); diff --git a/source/blender/blenkernel/intern/particle_system.cc b/source/blender/blenkernel/intern/particle_system.cc index f570f05bb37..27175174ccc 100644 --- a/source/blender/blenkernel/intern/particle_system.cc +++ b/source/blender/blenkernel/intern/particle_system.cc @@ -3352,7 +3352,7 @@ static void hair_create_input_mesh(ParticleSimulationData *sim, } blender::MutableSpan positions = mesh->vert_positions_for_write(); blender::int2 *edge = mesh->edges_for_write().data(); - dvert = BKE_mesh_deform_verts_for_write(mesh); + dvert = mesh->deform_verts_for_write().data(); if (psys->clmd->hairdata == nullptr) { psys->clmd->hairdata = static_cast( @@ -3534,7 +3534,7 @@ static void do_hair_dynamics(ParticleSimulationData *sim) sim->ob, psys->hair_in_mesh, reinterpret_cast(psys->hair_out_mesh->vert_positions_for_write().data())); - BKE_mesh_tag_positions_changed(psys->hair_out_mesh); + psys->hair_out_mesh->tag_positions_changed(); /* restore cloth effector weights */ psys->clmd->sim_parms->effector_weights = clmd_effweights; diff --git a/source/blender/blenkernel/intern/pbvh.cc b/source/blender/blenkernel/intern/pbvh.cc index e36b6c75e94..16ff2413d90 100644 --- a/source/blender/blenkernel/intern/pbvh.cc +++ b/source/blender/blenkernel/intern/pbvh.cc @@ -123,13 +123,9 @@ void update_node_bounds_bmesh(PBVHNode &node) node.vb = bounds; } -} // namespace blender::bke::pbvh - /* Not recursive */ static void update_node_vb(PBVH *pbvh, PBVHNode *node) { - using namespace blender; - using namespace blender::bke::pbvh; if (node->flag & PBVH_Leaf) { switch (pbvh->header.type) { case PBVH_FACES: @@ -149,17 +145,17 @@ static void update_node_vb(PBVH *pbvh, PBVHNode *node) } } -static bool face_materials_match(const int *material_indices, - const bool *sharp_faces, +static bool face_materials_match(const Span material_indices, + const Span sharp_faces, const int a, const int b) { - if (material_indices) { + if (!material_indices.is_empty()) { if (material_indices[a] != material_indices[b]) { return false; } } - if (sharp_faces) { + if (!sharp_faces.is_empty()) { if (sharp_faces[a] != sharp_faces[b]) { return false; } @@ -169,7 +165,7 @@ static bool face_materials_match(const int *material_indices, /* Adapted from BLI_kdopbvh.c */ /* Returns the index of the first element on the right of the partition */ -static int partition_prim_indices(blender::MutableSpan prim_indices, +static int partition_prim_indices(MutableSpan prim_indices, int *prim_scratch, int lo, int hi, @@ -178,7 +174,6 @@ static int partition_prim_indices(blender::MutableSpan prim_indices, const Span> prim_bounds, const Span prim_to_face_map) { - using namespace blender; for (int i = lo; i < hi; i++) { prim_scratch[i - lo] = prim_indices[i]; } @@ -204,8 +199,8 @@ static int partition_prim_indices(blender::MutableSpan prim_indices, /* Returns the index of the first element on the right of the partition */ static int partition_indices_material_faces(MutableSpan indices, const Span prim_to_face_map, - const int *material_indices, - const bool *sharp_faces, + const Span material_indices, + const Span sharp_faces, const int lo, const int hi) { @@ -232,14 +227,9 @@ static int partition_indices_material_faces(MutableSpan indices, } } -void pbvh_grow_nodes(PBVH *pbvh, int totnode) -{ - pbvh->nodes.resize(totnode); -} - /* Add a vertex to the map, with a positive value for unique vertices and * a negative value for additional vertices */ -static int map_insert_vert(blender::Map &map, +static int map_insert_vert(Map &map, MutableSpan vert_bitmap, int *face_verts, int *uniq_verts, @@ -264,7 +254,7 @@ static int map_insert_vert(blender::Map &map, static void build_mesh_leaf_node(const Span corner_verts, const Span looptris, const Span looptri_faces, - const bool *hide_poly, + const Span hide_poly, MutableSpan vert_bitmap, PBVHNode *node) { @@ -272,23 +262,23 @@ static void build_mesh_leaf_node(const Span corner_verts, const Span prim_indices = node->prim_indices; /* reserve size is rough guess */ - blender::Map map; + Map map; map.reserve(prim_indices.size()); node->face_vert_indices.reinitialize(prim_indices.size()); for (const int i : prim_indices.index_range()) { - const MLoopTri &tri = looptris[prim_indices[i]]; + const MLoopTri < = looptris[prim_indices[i]]; for (int j = 0; j < 3; j++) { node->face_vert_indices[i][j] = map_insert_vert( - map, vert_bitmap, &node->face_verts, &node->uniq_verts, corner_verts[tri.tri[j]]); + map, vert_bitmap, &node->face_verts, &node->uniq_verts, corner_verts[lt.tri[j]]); } } node->vert_indices.reinitialize(node->uniq_verts + node->face_verts); /* Build the vertex list, unique verts first */ - for (const blender::MapItem item : map.items()) { + for (const MapItem item : map.items()) { int value = item.value; if (value < 0) { value = -value + node->uniq_verts - 1; @@ -305,11 +295,11 @@ static void build_mesh_leaf_node(const Span corner_verts, } } - const bool fully_hidden = hide_poly && std::all_of(prim_indices.begin(), - prim_indices.end(), - [&](const int tri) { - return hide_poly[looptri_faces[tri]]; - }); + const bool fully_hidden = !hide_poly.is_empty() && + std::all_of( + prim_indices.begin(), prim_indices.end(), [&](const int tri) { + return hide_poly[looptri_faces[tri]]; + }); BKE_pbvh_node_fully_hidden_set(node, fully_hidden); BKE_pbvh_node_mark_rebuild_draw(node); } @@ -320,7 +310,6 @@ static void update_vb(const Span prim_indices, int offset, int count) { - using namespace blender; node->vb = prim_bounds[prim_indices[offset]]; for (const int i : IndexRange(offset, count).drop_front(1)) { node->vb = bounds::merge(node->vb, prim_bounds[prim_indices[i]]); @@ -328,15 +317,14 @@ static void update_vb(const Span prim_indices, node->orig_vb = node->vb; } -int BKE_pbvh_count_grid_quads(const BitGroupVector<> &grid_hidden, - const int *grid_indices, - int totgrid, - int gridsize, - int display_gridsize) +int count_grid_quads(const BitGroupVector<> &grid_hidden, + const Span grid_indices, + int gridsize, + int display_gridsize) { const int gridarea = (gridsize - 1) * (gridsize - 1); if (grid_hidden.is_empty()) { - return gridarea * totgrid; + return gridarea * grid_indices.size(); } /* grid hidden layer is present, so have to check each grid for @@ -348,8 +336,8 @@ int BKE_pbvh_count_grid_quads(const BitGroupVector<> &grid_hidden, int skip = depth2 < depth1 ? 1 << (depth1 - depth2 - 1) : 1; int totquad = 0; - for (int i = 0; i < totgrid; i++) { - const blender::BoundedBitSpan gh = grid_hidden[grid_indices[i]]; + for (const int grid : grid_indices) { + const blender::BoundedBitSpan gh = grid_hidden[grid]; /* grid hidden are present, have to check each element */ for (int y = 0; y < gridsize - skip; y += skip) { for (int x = 0; x < gridsize - skip; x += skip) { @@ -365,11 +353,10 @@ int BKE_pbvh_count_grid_quads(const BitGroupVector<> &grid_hidden, static void build_grid_leaf_node(PBVH *pbvh, PBVHNode *node) { - int totquads = BKE_pbvh_count_grid_quads(pbvh->subdiv_ccg->grid_hidden, - node->prim_indices.data(), - node->prim_indices.size(), - pbvh->gridkey.grid_size, - pbvh->gridkey.grid_size); + int totquads = count_grid_quads(pbvh->subdiv_ccg->grid_hidden, + node->prim_indices, + pbvh->gridkey.grid_size, + pbvh->gridkey.grid_size); BKE_pbvh_node_fully_hidden_set(node, (totquads == 0)); BKE_pbvh_node_mark_rebuild_draw(node); } @@ -378,7 +365,8 @@ static void build_leaf(PBVH *pbvh, const Span corner_verts, const Span looptris, const Span looptri_faces, - const bool *hide_poly, + const Span hide_poly, + MutableSpan vert_bitmap, int node_index, const Span> prim_bounds, int offset, @@ -392,9 +380,8 @@ static void build_leaf(PBVH *pbvh, /* Still need vb for searches */ update_vb(pbvh->prim_indices, &node, prim_bounds, offset, count); - if (!pbvh->looptri.is_empty()) { - build_mesh_leaf_node( - corner_verts, looptris, looptri_faces, hide_poly, pbvh->vert_bitmap, &node); + if (!pbvh->looptris.is_empty()) { + build_mesh_leaf_node(corner_verts, looptris, looptri_faces, hide_poly, vert_bitmap, &node); } else { build_grid_leaf_node(pbvh, &node); @@ -405,8 +392,8 @@ static void build_leaf(PBVH *pbvh, * same material (including flat/smooth shading), non-zero otherwise */ static bool leaf_needs_material_split(PBVH *pbvh, const Span prim_to_face_map, - const int *material_indices, - const bool *sharp_faces, + const Span material_indices, + const Span sharp_faces, int offset, int count) { @@ -488,9 +475,10 @@ static void build_sub(PBVH *pbvh, const Span corner_verts, const Span looptris, const Span looptri_faces, - const bool *hide_poly, - const int *material_indices, - const bool *sharp_faces, + const Span hide_poly, + const Span material_indices, + const Span sharp_faces, + MutableSpan vert_bitmap, int node_index, const Bounds *cb, const Span> prim_bounds, @@ -499,7 +487,6 @@ static void build_sub(PBVH *pbvh, int *prim_scratch, int depth) { - using namespace blender; const Span prim_to_face_map = pbvh->header.type == PBVH_FACES ? looptri_faces : pbvh->subdiv_ccg->grid_to_face_map; @@ -520,6 +507,7 @@ static void build_sub(PBVH *pbvh, looptris, looptri_faces, hide_poly, + vert_bitmap, node_index, prim_bounds, offset, @@ -535,7 +523,7 @@ static void build_sub(PBVH *pbvh, /* Add two child nodes */ pbvh->nodes[node_index].children_offset = pbvh->nodes.size(); - pbvh_grow_nodes(pbvh, pbvh->nodes.size() + 2); + pbvh->nodes.resize(pbvh->nodes.size() + 2); /* Update parent node bounding box */ update_vb(pbvh->prim_indices, &pbvh->nodes[node_index], prim_bounds, offset, count); @@ -582,6 +570,7 @@ static void build_sub(PBVH *pbvh, hide_poly, material_indices, sharp_faces, + vert_bitmap, pbvh->nodes[node_index].children_offset, nullptr, prim_bounds, @@ -596,6 +585,7 @@ static void build_sub(PBVH *pbvh, hide_poly, material_indices, sharp_faces, + vert_bitmap, pbvh->nodes[node_index].children_offset + 1, nullptr, prim_bounds, @@ -613,9 +603,10 @@ static void pbvh_build(PBVH *pbvh, const Span corner_verts, const Span looptris, const Span looptri_faces, - const bool *hide_poly, - const int *material_indices, - const bool *sharp_faces, + const Span hide_poly, + const Span material_indices, + const Span sharp_faces, + MutableSpan vert_bitmap, const Bounds *cb, const Span> prim_bounds, int totprim) @@ -625,7 +616,7 @@ static void pbvh_build(PBVH *pbvh, pbvh->nodes.clear_and_shrink(); pbvh->prim_indices.reinitialize(totprim); - blender::array_utils::fill_index_range(pbvh->prim_indices); + array_utils::fill_index_range(pbvh->prim_indices); } pbvh->nodes.resize(1); @@ -637,6 +628,7 @@ static void pbvh_build(PBVH *pbvh, hide_poly, material_indices, sharp_faces, + vert_bitmap, 0, cb, prim_bounds, @@ -713,7 +705,7 @@ static void pbvh_validate_node_prims(PBVH *pbvh, const Span looptri_faces) } #endif -void BKE_pbvh_update_mesh_pointers(PBVH *pbvh, Mesh *mesh) +void update_mesh_pointers(PBVH *pbvh, Mesh *mesh) { BLI_assert(pbvh->header.type == PBVH_FACES); pbvh->faces = mesh->faces(); @@ -728,26 +720,26 @@ void BKE_pbvh_update_mesh_pointers(PBVH *pbvh, Mesh *mesh) } } -void BKE_pbvh_build_mesh(PBVH *pbvh, Mesh *mesh) +PBVH *build_mesh(Mesh *mesh) { - using namespace blender; - const int totvert = mesh->totvert; - const int looptri_num = poly_to_tri_count(mesh->faces_num, mesh->totloop); - MutableSpan vert_positions = mesh->vert_positions_for_write(); - const blender::OffsetIndices faces = mesh->faces(); - const Span corner_verts = mesh->corner_verts(); - - pbvh->looptri.reinitialize(looptri_num); - blender::bke::mesh::looptris_calc(vert_positions, faces, corner_verts, pbvh->looptri); - const Span looptris = pbvh->looptri; - - pbvh->mesh = mesh; + std::unique_ptr pbvh = std::make_unique(); pbvh->header.type = PBVH_FACES; - BKE_pbvh_update_mesh_pointers(pbvh, mesh); + const int totvert = mesh->totvert; + const int looptris_num = poly_to_tri_count(mesh->faces_num, mesh->totloop); + MutableSpan vert_positions = mesh->vert_positions_for_write(); + const OffsetIndices faces = mesh->faces(); + const Span corner_verts = mesh->corner_verts(); + + pbvh->looptris.reinitialize(looptris_num); + mesh::looptris_calc(vert_positions, faces, corner_verts, pbvh->looptris); + const Span looptris = pbvh->looptris; + + pbvh->mesh = mesh; + + update_mesh_pointers(pbvh.get(), mesh); const Span looptri_faces = pbvh->looptri_faces; - /* Those are not set in #BKE_pbvh_update_mesh_pointers because they are owned by the #PBVH. */ pbvh->vert_bitmap = blender::Array(totvert, false); pbvh->totvert = totvert; @@ -763,7 +755,7 @@ void BKE_pbvh_build_mesh(PBVH *pbvh, Mesh *mesh) pbvh->faces_num = mesh->faces_num; /* For each face, store the AABB and the AABB centroid */ - Array> prim_bounds(looptri_num); + Array> prim_bounds(looptris_num); const Bounds cb = threading::parallel_reduce( looptris.index_range(), 1024, @@ -783,23 +775,22 @@ void BKE_pbvh_build_mesh(PBVH *pbvh, Mesh *mesh) }, [](const Bounds &a, const Bounds &b) { return bounds::merge(a, b); }); - if (looptri_num) { - const bool *hide_poly = static_cast( - CustomData_get_layer_named(&mesh->face_data, CD_PROP_BOOL, ".hide_poly")); - const int *material_indices = static_cast( - CustomData_get_layer_named(&mesh->face_data, CD_PROP_INT32, "material_index")); - const bool *sharp_faces = (const bool *)CustomData_get_layer_named( - &mesh->face_data, CD_PROP_BOOL, "sharp_face"); - pbvh_build(pbvh, + if (looptris_num) { + const AttributeAccessor attributes = mesh->attributes(); + const VArraySpan hide_poly = *attributes.lookup(".hide_poly", ATTR_DOMAIN_FACE); + const VArraySpan material_index = *attributes.lookup("material_index", ATTR_DOMAIN_FACE); + const VArraySpan sharp_face = *attributes.lookup("sharp_face", ATTR_DOMAIN_FACE); + pbvh_build(pbvh.get(), corner_verts, looptris, looptri_faces, hide_poly, - material_indices, - sharp_faces, + material_index, + sharp_face, + pbvh->vert_bitmap, &cb, prim_bounds, - looptri_num); + looptris_num); #ifdef TEST_PBVH_FACE_SPLIT test_face_boundaries(pbvh, looptri_faces); @@ -809,36 +800,38 @@ void BKE_pbvh_build_mesh(PBVH *pbvh, Mesh *mesh) /* Clear the bitmap so it can be used as an update tag later on. */ pbvh->vert_bitmap.fill(false); - BKE_pbvh_update_active_vcol(pbvh, mesh); + BKE_pbvh_update_active_vcol(pbvh.get(), mesh); #ifdef VALIDATE_UNIQUE_NODE_FACES pbvh_validate_node_prims(pbvh); #endif + + return pbvh.release(); } -void BKE_pbvh_build_grids(PBVH *pbvh, const CCGKey *key, Mesh *mesh, SubdivCCG *subdiv_ccg) +PBVH *build_grids(const CCGKey *key, Mesh *mesh, SubdivCCG *subdiv_ccg) { - using namespace blender; - const int gridsize = key->grid_size; - const Span grids = subdiv_ccg->grids; - + std::unique_ptr pbvh = std::make_unique(); pbvh->header.type = PBVH_GRIDS; + pbvh->gridkey = *key; pbvh->subdiv_ccg = subdiv_ccg; pbvh->faces_num = mesh->faces_num; /* Find maximum number of grids per face. */ int max_grids = 1; - const blender::OffsetIndices faces = mesh->faces(); + const OffsetIndices faces = mesh->faces(); for (const int i : faces.index_range()) { max_grids = max_ii(max_grids, faces[i].size()); } + const Span grids = subdiv_ccg->grids; + /* Ensure leaf limit is at least 4 so there's room * to split at original face boundaries. * Fixes #102209. */ - pbvh->leaf_limit = max_ii(LEAF_LIMIT / (gridsize * gridsize), max_grids); + pbvh->leaf_limit = max_ii(LEAF_LIMIT / (key->grid_area), max_grids); /* We also need the base mesh for PBVH draw. */ pbvh->mesh = mesh; @@ -866,12 +859,20 @@ void BKE_pbvh_build_grids(PBVH *pbvh, const CCGKey *key, Mesh *mesh, SubdivCCG * [](const Bounds &a, const Bounds &b) { return bounds::merge(a, b); }); if (!grids.is_empty()) { - const int *material_indices = static_cast( - CustomData_get_layer_named(&mesh->face_data, CD_PROP_INT32, "material_index")); - const bool *sharp_faces = (const bool *)CustomData_get_layer_named( - &mesh->face_data, CD_PROP_BOOL, "sharp_face"); - pbvh_build( - pbvh, {}, {}, {}, nullptr, material_indices, sharp_faces, &cb, prim_bounds, grids.size()); + const AttributeAccessor attributes = mesh->attributes(); + const VArraySpan material_index = *attributes.lookup("material_index", ATTR_DOMAIN_FACE); + const VArraySpan sharp_face = *attributes.lookup("sharp_face", ATTR_DOMAIN_FACE); + pbvh_build(pbvh.get(), + {}, + {}, + {}, + {}, + material_index, + sharp_face, + {}, + &cb, + prim_bounds, + grids.size()); #ifdef TEST_PBVH_FACE_SPLIT test_face_boundaries(pbvh); @@ -881,20 +882,11 @@ void BKE_pbvh_build_grids(PBVH *pbvh, const CCGKey *key, Mesh *mesh, SubdivCCG * #ifdef VALIDATE_UNIQUE_NODE_FACES pbvh_validate_node_prims(pbvh); #endif + + return pbvh.release(); } -PBVH *BKE_pbvh_new(PBVHType type) -{ - PBVH *pbvh = MEM_new(__func__); - pbvh->draw_cache_invalid = true; - pbvh->header.type = type; - - /* Initialize this to true, instead of waiting for a draw engine - * to set it. Prevents a crash in draw manager instancing code. - */ - pbvh->is_drawing = true; - return pbvh; -} +} // namespace blender::bke::pbvh void BKE_pbvh_free(PBVH *pbvh) { @@ -912,7 +904,7 @@ void BKE_pbvh_free(PBVH *pbvh) pbvh_pixels_free(pbvh); - MEM_delete(pbvh); + delete pbvh; } static void pbvh_iter_begin(PBVHIter *iter, PBVH *pbvh, blender::FunctionRef scb) @@ -1162,14 +1154,14 @@ static bool update_search(PBVHNode *node, const int flag) return true; } +namespace blender::bke::pbvh { + static void normals_calc_faces(const Span positions, const blender::OffsetIndices faces, const Span corner_verts, const Span mask, MutableSpan face_normals) { - using namespace blender; - using namespace blender::bke; threading::parallel_for(mask.index_range(), 512, [&](const IndexRange range) { for (const int i : mask.slice(range)) { face_normals[i] = mesh::face_normal_calc(positions, corner_verts.slice(faces[i])); @@ -1182,7 +1174,6 @@ static void normals_calc_verts_simple(const blender::GroupedSpan vert_to_fa const Span mask, MutableSpan vert_normals) { - using namespace blender; threading::parallel_for(mask.index_range(), 1024, [&](const IndexRange range) { for (const int vert : mask.slice(range)) { float3 normal(0.0f); @@ -1194,21 +1185,19 @@ static void normals_calc_verts_simple(const blender::GroupedSpan vert_to_fa }); } -static void pbvh_faces_update_normals(PBVH *pbvh, Span nodes, Mesh &mesh) +static void pbvh_faces_update_normals(PBVH &pbvh, Span nodes, Mesh &mesh) { - using namespace blender; - using namespace blender::bke; - const Span positions = pbvh->vert_positions; + const Span positions = pbvh.vert_positions; const OffsetIndices faces = mesh.faces(); const Span corner_verts = mesh.corner_verts(); - MutableSpan update_tags = pbvh->vert_bitmap; + MutableSpan update_tags = pbvh.vert_bitmap; VectorSet faces_to_update; for (const PBVHNode *node : nodes) { for (const int vert : node->vert_indices.as_span().take_front(node->uniq_verts)) { if (update_tags[vert]) { - faces_to_update.add_multiple(pbvh->pmap[vert]); + faces_to_update.add_multiple(pbvh.pmap[vert]); } } } @@ -1220,16 +1209,16 @@ static void pbvh_faces_update_normals(PBVH *pbvh, Span nodes, Mesh & VectorSet verts_to_update; threading::parallel_invoke( [&]() { - if (pbvh->deformed) { + if (pbvh.deformed) { normals_calc_faces( - positions, faces, corner_verts, faces_to_update, pbvh->face_normals_deformed); + positions, faces, corner_verts, faces_to_update, pbvh.face_normals_deformed); } else { mesh.runtime->face_normals_cache.update([&](Vector &r_data) { normals_calc_faces(positions, faces, corner_verts, faces_to_update, r_data); }); /* #SharedCache::update() reallocates cached vectors if they were shared initially. */ - pbvh->face_normals = mesh.runtime->face_normals_cache.data(); + pbvh.face_normals = mesh.runtime->face_normals_cache.data(); } }, [&]() { @@ -1247,15 +1236,36 @@ static void pbvh_faces_update_normals(PBVH *pbvh, Span nodes, Mesh & } }); - if (pbvh->deformed) { + if (pbvh.deformed) { normals_calc_verts_simple( - pbvh->pmap, pbvh->face_normals, verts_to_update, pbvh->vert_normals_deformed); + pbvh.pmap, pbvh.face_normals, verts_to_update, pbvh.vert_normals_deformed); } else { mesh.runtime->vert_normals_cache.update([&](Vector &r_data) { - normals_calc_verts_simple(pbvh->pmap, pbvh->face_normals, verts_to_update, r_data); + normals_calc_verts_simple(pbvh.pmap, pbvh.face_normals, verts_to_update, r_data); }); - pbvh->vert_normals = mesh.runtime->vert_normals_cache.data(); + pbvh.vert_normals = mesh.runtime->vert_normals_cache.data(); + } +} + +void update_normals(PBVH &pbvh, SubdivCCG *subdiv_ccg) +{ + Vector nodes = search_gather( + &pbvh, [&](PBVHNode &node) { return update_search(&node, PBVH_UpdateNormals); }); + + if (pbvh.header.type == PBVH_BMESH) { + pbvh_bmesh_normals_update(nodes); + } + else if (pbvh.header.type == PBVH_FACES) { + pbvh_faces_update_normals(pbvh, nodes, *pbvh.mesh); + } + else if (pbvh.header.type == PBVH_GRIDS) { + IndexMaskMemory memory; + const IndexMask faces_to_update = BKE_pbvh_get_grid_updates(&pbvh, nodes, memory); + BKE_subdiv_ccg_update_normals(*subdiv_ccg, faces_to_update); + for (PBVHNode *node : nodes) { + node->flag &= ~PBVH_UpdateNormals; + } } } @@ -1278,7 +1288,6 @@ static void node_update_bounds(PBVH &pbvh, PBVHNode &node, const PBVHNodeFlags f static void pbvh_update_BB_redraw(PBVH *pbvh, Span nodes, int flag) { - using namespace blender; threading::parallel_for(nodes.index_range(), 1, [&](const IndexRange range) { for (PBVHNode *node : nodes.slice(range)) { node_update_bounds(*pbvh, *node, PBVHNodeFlags(flag)); @@ -1286,14 +1295,6 @@ static void pbvh_update_BB_redraw(PBVH *pbvh, Span nodes, int flag) }); } -bool BKE_pbvh_get_color_layer(Mesh *mesh, CustomDataLayer **r_layer, eAttrDomain *r_domain) -{ - *r_layer = BKE_id_attribute_search_for_write( - &mesh->id, mesh->active_color_attribute, CD_MASK_COLOR_ALL, ATTR_DOMAIN_MASK_COLOR); - *r_domain = *r_layer ? BKE_id_attribute_domain(&mesh->id, *r_layer) : ATTR_DOMAIN_POINT; - return *r_layer != nullptr; -} - static int pbvh_flush_bb(PBVH *pbvh, PBVHNode *node, int flag) { int update = 0; @@ -1326,39 +1327,20 @@ static int pbvh_flush_bb(PBVH *pbvh, PBVHNode *node, int flag) return update; } -void BKE_pbvh_update_bounds(PBVH *pbvh, int flag) +void update_bounds(PBVH &pbvh, int flag) { - if (pbvh->nodes.is_empty()) { - return; - } - - Vector nodes = blender::bke::pbvh::search_gather( - pbvh, [&](PBVHNode &node) { return update_search(&node, flag); }); + Vector nodes = search_gather( + &pbvh, [&](PBVHNode &node) { return update_search(&node, flag); }); if (flag & (PBVH_UpdateBB | PBVH_UpdateOriginalBB | PBVH_UpdateRedraw)) { - pbvh_update_BB_redraw(pbvh, nodes, flag); + pbvh_update_BB_redraw(&pbvh, nodes, flag); } if (flag & (PBVH_UpdateBB | PBVH_UpdateOriginalBB)) { - pbvh_flush_bb(pbvh, &pbvh->nodes.first(), flag); + pbvh_flush_bb(&pbvh, &pbvh.nodes.first(), flag); } } -void BKE_pbvh_update_vertex_data(PBVH *pbvh, int flag) -{ - using namespace blender; - Vector nodes = blender::bke::pbvh::search_gather( - pbvh, [&](PBVHNode &node) { return update_search(&node, flag); }); - - if (flag & (PBVH_UpdateColor)) { - for (PBVHNode *node : nodes) { - node->flag |= PBVH_UpdateRedraw | PBVH_UpdateDrawBuffers | PBVH_UpdateColor; - } - } -} - -namespace blender::bke::pbvh { - void node_update_mask_mesh(const Span mask, PBVHNode &node) { const bool fully_masked = std::all_of(node.vert_indices.begin(), @@ -1466,29 +1448,24 @@ static void update_mask_bmesh(const BMesh &bm, const Span nodes) }); } -} // namespace blender::bke::pbvh - -void BKE_pbvh_update_mask(PBVH *pbvh) +void update_mask(PBVH &pbvh) { - using namespace blender::bke::pbvh; Vector nodes = search_gather( - pbvh, [&](PBVHNode &node) { return update_search(&node, PBVH_UpdateMask); }); + &pbvh, [&](PBVHNode &node) { return update_search(&node, PBVH_UpdateMask); }); - switch (BKE_pbvh_type(pbvh)) { + switch (BKE_pbvh_type(&pbvh)) { case PBVH_FACES: - update_mask_mesh(*pbvh->mesh, nodes); + update_mask_mesh(*pbvh.mesh, nodes); break; case PBVH_GRIDS: - update_mask_grids(*pbvh->subdiv_ccg, nodes); + update_mask_grids(*pbvh.subdiv_ccg, nodes); break; case PBVH_BMESH: - update_mask_bmesh(*pbvh->header.bm, nodes); + update_mask_bmesh(*pbvh.header.bm, nodes); break; } } -namespace blender::bke::pbvh { - void node_update_visibility_mesh(const Span hide_vert, PBVHNode &node) { BLI_assert(!hide_vert.is_empty()); @@ -1499,7 +1476,7 @@ void node_update_visibility_mesh(const Span hide_vert, PBVHNode &node) node.flag &= ~PBVH_UpdateVisibility; } -static void pbvh_faces_node_visibility_update(const Mesh &mesh, const Span nodes) +static void update_visibility_faces(const Mesh &mesh, const Span nodes) { const AttributeAccessor attributes = mesh.attributes(); const VArraySpan hide_vert = *attributes.lookup(".hide_vert", ATTR_DOMAIN_POINT); @@ -1529,9 +1506,9 @@ void node_update_visibility_grids(const BitGroupVector<> &grid_hidden, PBVHNode node.flag &= ~PBVH_UpdateVisibility; } -static void pbvh_grids_node_visibility_update(PBVH *pbvh, const Span nodes) +static void update_visibility_grids(PBVH &pbvh, const Span nodes) { - const BitGroupVector<> &grid_hidden = pbvh->subdiv_ccg->grid_hidden; + const BitGroupVector<> &grid_hidden = pbvh.subdiv_ccg->grid_hidden; if (grid_hidden.is_empty()) { for (PBVHNode *node : nodes) { node->flag &= ~PBVH_FullyHidden; @@ -1561,7 +1538,7 @@ void node_update_visibility_bmesh(PBVHNode &node) node.flag &= ~PBVH_UpdateVisibility; } -static void pbvh_bmesh_node_visibility_update(const Span nodes) +static void update_visibility_bmesh(const Span nodes) { threading::parallel_for(nodes.index_range(), 1, [&](const IndexRange range) { for (PBVHNode *node : nodes.slice(range)) { @@ -1570,27 +1547,26 @@ static void pbvh_bmesh_node_visibility_update(const Span nodes) }); } -} // namespace blender::bke::pbvh - -void BKE_pbvh_update_visibility(PBVH *pbvh) +void update_visibility(PBVH &pbvh) { - using namespace blender::bke::pbvh; Vector nodes = search_gather( - pbvh, [&](PBVHNode &node) { return update_search(&node, PBVH_UpdateVisibility); }); + &pbvh, [&](PBVHNode &node) { return update_search(&node, PBVH_UpdateVisibility); }); - switch (BKE_pbvh_type(pbvh)) { + switch (BKE_pbvh_type(&pbvh)) { case PBVH_FACES: - pbvh_faces_node_visibility_update(*pbvh->mesh, nodes); + update_visibility_faces(*pbvh.mesh, nodes); break; case PBVH_GRIDS: - pbvh_grids_node_visibility_update(pbvh, nodes); + update_visibility_grids(pbvh, nodes); break; case PBVH_BMESH: - pbvh_bmesh_node_visibility_update(nodes); + update_visibility_bmesh(nodes); break; } } +} // namespace blender::bke::pbvh + Bounds BKE_pbvh_redraw_BB(PBVH *pbvh) { using namespace blender; @@ -1634,6 +1610,14 @@ blender::IndexMask BKE_pbvh_get_grid_updates(const PBVH *pbvh, /***************************** PBVH Access ***********************************/ +bool BKE_pbvh_get_color_layer(Mesh *mesh, CustomDataLayer **r_layer, eAttrDomain *r_domain) +{ + *r_layer = BKE_id_attribute_search_for_write( + &mesh->id, mesh->active_color_attribute, CD_MASK_COLOR_ALL, ATTR_DOMAIN_MASK_COLOR); + *r_domain = *r_layer ? BKE_id_attribute_domain(&mesh->id, *r_layer) : ATTR_DOMAIN_POINT; + return *r_layer != nullptr; +} + bool BKE_pbvh_has_faces(const PBVH *pbvh) { if (pbvh->header.type == PBVH_BMESH) { @@ -1780,11 +1764,9 @@ void BKE_pbvh_vert_tag_update_normal(PBVH *pbvh, PBVHVertRef vertex) pbvh->vert_bitmap[vertex.i] = true; } -void BKE_pbvh_node_get_loops(const PBVHNode *node, const int **r_loop_indices) +blender::Span BKE_pbvh_node_get_loops(const PBVHNode *node) { - if (r_loop_indices) { - *r_loop_indices = node->loop_indices.data(); - } + return node->loop_indices; } int BKE_pbvh_num_faces(const PBVH *pbvh) @@ -1811,83 +1793,60 @@ blender::Span BKE_pbvh_node_get_unique_vert_indices(const PBVHNode *node) return node->vert_indices.as_span().take_front(node->uniq_verts); } -void BKE_pbvh_node_calc_face_indices(const PBVH &pbvh, const PBVHNode &node, Vector &faces) +namespace blender::bke::pbvh { + +Span node_face_indices_calc_mesh(const PBVH &pbvh, const PBVHNode &node, Vector &faces) { + faces.clear(); + const Span looptri_faces = pbvh.looptri_faces; + int prev_face = -1; + for (const int tri : node.prim_indices) { + const int face = looptri_faces[tri]; + if (face != prev_face) { + faces.append(face); + prev_face = face; + } + } + return faces.as_span(); +} + +Span node_face_indices_calc_grids(const PBVH &pbvh, const PBVHNode &node, Vector &faces) +{ + faces.clear(); + const Span grid_to_face_map = pbvh.subdiv_ccg->grid_to_face_map; + int prev_face = -1; + for (const int prim : node.prim_indices) { + const int face = grid_to_face_map[prim]; + if (face != prev_face) { + faces.append(face); + prev_face = face; + } + } + return faces.as_span(); +} + +} // namespace blender::bke::pbvh + +blender::Vector BKE_pbvh_node_calc_face_indices(const PBVH &pbvh, const PBVHNode &node) +{ + using namespace blender::bke::pbvh; + Vector faces; switch (pbvh.header.type) { case PBVH_FACES: { - const Span looptri_faces = pbvh.looptri_faces; - int prev_face = -1; - for (const int tri : node.prim_indices) { - const int face = looptri_faces[tri]; - if (face != prev_face) { - faces.append(face); - prev_face = face; - } - } + node_face_indices_calc_mesh(pbvh, node, faces); break; } case PBVH_GRIDS: { - const SubdivCCG &subdiv_ccg = *pbvh.subdiv_ccg; - int prev_face = -1; - for (const int prim : node.prim_indices) { - const int face = BKE_subdiv_ccg_grid_to_face_index(subdiv_ccg, prim); - if (face != prev_face) { - faces.append(face); - prev_face = face; - } - } + node_face_indices_calc_grids(pbvh, node, faces); break; } case PBVH_BMESH: BLI_assert_unreachable(); break; } -} - -blender::Vector BKE_pbvh_node_calc_face_indices(const PBVH &pbvh, const PBVHNode &node) -{ - Vector faces; - BKE_pbvh_node_calc_face_indices(pbvh, node, faces); return faces; } -void BKE_pbvh_node_num_verts(const PBVH *pbvh, - const PBVHNode *node, - int *r_uniquevert, - int *r_totvert) -{ - int tot; - - switch (pbvh->header.type) { - case PBVH_GRIDS: - tot = node->prim_indices.size() * pbvh->gridkey.grid_area; - if (r_totvert) { - *r_totvert = tot; - } - if (r_uniquevert) { - *r_uniquevert = tot; - } - break; - case PBVH_FACES: - if (r_totvert) { - *r_totvert = node->uniq_verts + node->face_verts; - } - if (r_uniquevert) { - *r_uniquevert = node->uniq_verts; - } - break; - case PBVH_BMESH: - tot = node->bm_unique_verts.size(); - if (r_totvert) { - *r_totvert = tot + node->bm_other_verts.size(); - } - if (r_uniquevert) { - *r_uniquevert = tot; - } - break; - } -} - int BKE_pbvh_node_num_unique_verts(const PBVH &pbvh, const PBVHNode &node) { switch (pbvh.header.type) { @@ -2099,7 +2058,7 @@ static bool pbvh_faces_node_raycast(PBVH *pbvh, const PBVHNode *node, float (*origco)[3], const Span corner_verts, - const bool *hide_poly, + const Span hide_poly, const float ray_start[3], const float ray_normal[3], IsectRayPrecalc *isect_precalc, @@ -2114,10 +2073,10 @@ static bool pbvh_faces_node_raycast(PBVH *pbvh, for (const int i : node->prim_indices.index_range()) { const int looptri_i = node->prim_indices[i]; - const MLoopTri *lt = &pbvh->looptri[looptri_i]; + const MLoopTri *lt = &pbvh->looptris[looptri_i]; const blender::int3 face_verts = node->face_vert_indices[i]; - if (hide_poly && hide_poly[pbvh->looptri_faces[looptri_i]]) { + if (!hide_poly.is_empty() && hide_poly[pbvh->looptri_faces[looptri_i]]) { continue; } @@ -2260,7 +2219,7 @@ bool BKE_pbvh_node_raycast(PBVH *pbvh, float (*origco)[3], bool use_origco, const Span corner_verts, - const bool *hide_poly, + const Span hide_poly, const float ray_start[3], const float ray_normal[3], IsectRayPrecalc *isect_precalc, @@ -2454,7 +2413,7 @@ static bool pbvh_faces_node_nearest_to_ray(PBVH *pbvh, const PBVHNode *node, float (*origco)[3], const Span corner_verts, - const bool *hide_poly, + const Span hide_poly, const float ray_start[3], const float ray_normal[3], float *depth, @@ -2465,10 +2424,10 @@ static bool pbvh_faces_node_nearest_to_ray(PBVH *pbvh, for (const int i : node->prim_indices.index_range()) { const int looptri_i = node->prim_indices[i]; - const MLoopTri *lt = &pbvh->looptri[looptri_i]; + const MLoopTri *lt = &pbvh->looptris[looptri_i]; const blender::int3 face_verts = node->face_vert_indices[i]; - if (hide_poly && hide_poly[pbvh->looptri_faces[looptri_i]]) { + if (!hide_poly.is_empty() && hide_poly[pbvh->looptri_faces[looptri_i]]) { continue; } @@ -2562,7 +2521,7 @@ bool BKE_pbvh_node_find_nearest_to_ray(PBVH *pbvh, float (*origco)[3], bool use_origco, const Span corner_verts, - const bool *hide_poly, + const Span hide_poly, const float ray_start[3], const float ray_normal[3], float *depth, @@ -2644,29 +2603,6 @@ bool BKE_pbvh_node_frustum_exclude_AABB(const PBVHNode *node, const PBVHFrustumP return test_frustum_aabb(node->vb, data) != ISECT_INSIDE; } -void BKE_pbvh_update_normals(PBVH *pbvh, SubdivCCG *subdiv_ccg) -{ - using namespace blender; - /* Update normals */ - Vector nodes = blender::bke::pbvh::search_gather( - pbvh, [&](PBVHNode &node) { return update_search(&node, PBVH_UpdateNormals); }); - - if (pbvh->header.type == PBVH_BMESH) { - pbvh_bmesh_normals_update(nodes); - } - else if (pbvh->header.type == PBVH_FACES) { - pbvh_faces_update_normals(pbvh, nodes, *pbvh->mesh); - } - else if (pbvh->header.type == PBVH_GRIDS) { - IndexMaskMemory memory; - const IndexMask faces_to_update = BKE_pbvh_get_grid_updates(pbvh, nodes, memory); - BKE_subdiv_ccg_update_normals(*subdiv_ccg, faces_to_update); - for (PBVHNode *node : nodes) { - node->flag &= ~PBVH_UpdateNormals; - } - } -} - static blender::draw::pbvh::PBVH_GPU_Args pbvh_draw_args_init(const Mesh &mesh, PBVH &pbvh, const PBVHNode &node) @@ -2693,13 +2629,12 @@ static blender::draw::pbvh::PBVH_GPU_Args pbvh_draw_args_init(const Mesh &mesh, args.vert_positions = pbvh.vert_positions; args.corner_verts = mesh.corner_verts(); args.corner_edges = mesh.corner_edges(); - args.mlooptri = pbvh.looptri; + args.looptris = pbvh.looptris; args.vert_normals = pbvh.vert_normals; args.face_normals = pbvh.face_normals; /* Retrieve data from the original mesh. Ideally that would be passed to this function to * make it clearer when each is used. */ - args.hide_poly = static_cast( - CustomData_get_layer_named(&pbvh.mesh->face_data, CD_PROP_BOOL, ".hide_poly")); + args.hide_poly = *pbvh.mesh->attributes().lookup(".hide_poly", ATTR_DOMAIN_FACE); args.prim_indices = node.prim_indices; args.looptri_faces = mesh.looptri_faces(); @@ -2886,6 +2821,7 @@ void BKE_pbvh_grids_update(PBVH *pbvh, const CCGKey *key) void BKE_pbvh_vert_coords_apply(PBVH *pbvh, const Span vert_positions) { + using namespace blender::bke::pbvh; BLI_assert(vert_positions.size() == pbvh->totvert); if (!pbvh->deformed) { @@ -2925,7 +2861,7 @@ void BKE_pbvh_vert_coords_apply(PBVH *pbvh, const Span vert_positions) BKE_pbvh_node_mark_update(&node); } - BKE_pbvh_update_bounds(pbvh, PBVH_UpdateBB | PBVH_UpdateOriginalBB); + update_bounds(*pbvh, PBVH_UpdateBB | PBVH_UpdateOriginalBB); } } @@ -2985,8 +2921,22 @@ void pbvh_vertex_iter_init(PBVH *pbvh, PBVHNode *node, PBVHVertexIter *vi, int m vi->vert_positions = {}; vi->vertex.i = 0LL; - int uniq_verts, totvert; - BKE_pbvh_node_num_verts(pbvh, node, &uniq_verts, &totvert); + int uniq_verts; + int totvert; + switch (pbvh->header.type) { + case PBVH_GRIDS: + totvert = node->prim_indices.size() * pbvh->gridkey.grid_area; + uniq_verts = totvert; + break; + case PBVH_FACES: + totvert = node->uniq_verts + node->face_verts; + uniq_verts = node->uniq_verts; + break; + case PBVH_BMESH: + totvert = node->bm_unique_verts.size() + node->bm_other_verts.size(); + uniq_verts = node->bm_unique_verts.size(); + break; + } if (pbvh->header.type == PBVH_GRIDS) { vi->key = pbvh->gridkey; @@ -3061,9 +3011,8 @@ bool pbvh_has_face_sets(PBVH *pbvh) case PBVH_FACES: return pbvh->mesh->attributes().contains(".sculpt_face_set"); case PBVH_BMESH: - return false; + return CustomData_has_layer_named(&pbvh->header.bm->pdata, CD_PROP_FLOAT, ".sculpt_mask"); } - return false; } @@ -3083,14 +3032,6 @@ void BKE_pbvh_get_frustum_planes(const PBVH *pbvh, PBVHFrustumPlanes *planes) } } -void BKE_pbvh_parallel_range_settings(TaskParallelSettings *settings, - bool use_threading, - int totnode) -{ - memset(settings, 0, sizeof(*settings)); - settings->use_threading = use_threading && totnode > 1; -} - Mesh *BKE_pbvh_get_mesh(PBVH *pbvh) { return pbvh->mesh; @@ -3134,16 +3075,6 @@ void BKE_pbvh_is_drawing_set(PBVH *pbvh, bool val) pbvh->is_drawing = val; } -void BKE_pbvh_node_num_loops(PBVH *pbvh, PBVHNode *node, int *r_totloop) -{ - UNUSED_VARS(pbvh); - BLI_assert(BKE_pbvh_type(pbvh) == PBVH_FACES); - - if (r_totloop) { - *r_totloop = node->loop_indices.size(); - } -} - void BKE_pbvh_update_active_vcol(PBVH *pbvh, Mesh *mesh) { BKE_pbvh_get_color_layer(mesh, &pbvh->color_layer, &pbvh->color_domain); @@ -3185,12 +3116,12 @@ void BKE_pbvh_ensure_node_loops(PBVH *pbvh) loop_indices.clear(); for (const int i : node.prim_indices) { - const MLoopTri &mlt = pbvh->looptri[i]; + const MLoopTri < = pbvh->looptris[i]; for (int k = 0; k < 3; k++) { - if (!BLI_BITMAP_TEST(visit, mlt.tri[k])) { - loop_indices.append(mlt.tri[k]); - BLI_BITMAP_ENABLE(visit, mlt.tri[k]); + if (!BLI_BITMAP_TEST(visit, lt.tri[k])) { + loop_indices.append(lt.tri[k]); + BLI_BITMAP_ENABLE(visit, lt.tri[k]); } } } diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.cc b/source/blender/blenkernel/intern/pbvh_bmesh.cc index 71beec7d57e..c302e1f2706 100644 --- a/source/blender/blenkernel/intern/pbvh_bmesh.cc +++ b/source/blender/blenkernel/intern/pbvh_bmesh.cc @@ -291,7 +291,7 @@ static void pbvh_bmesh_node_split(PBVH *pbvh, /* Add two new child nodes. */ const int children = pbvh->nodes.size(); n->children_offset = children; - pbvh_grow_nodes(pbvh, pbvh->nodes.size() + 2); + pbvh->nodes.resize(pbvh->nodes.size() + 2); /* Array reallocated, update current node pointer. */ n = &pbvh->nodes[node_index]; @@ -1965,8 +1965,8 @@ struct FastNodeBuildInfo { * to a sub part of the arrays. */ static void pbvh_bmesh_node_limit_ensure_fast(PBVH *pbvh, - BMFace **nodeinfo, - Bounds *face_bounds, + const blender::MutableSpan nodeinfo, + const blender::Span> face_bounds, FastNodeBuildInfo *node, MemArena *arena) { @@ -2066,8 +2066,8 @@ static void pbvh_bmesh_node_limit_ensure_fast(PBVH *pbvh, } static void pbvh_bmesh_create_nodes_fast_recursive(PBVH *pbvh, - BMFace **nodeinfo, - Bounds *face_bounds, + const blender::Span nodeinfo, + const blender::Span> face_bounds, FastNodeBuildInfo *node, int node_index) { @@ -2078,7 +2078,7 @@ static void pbvh_bmesh_create_nodes_fast_recursive(PBVH *pbvh, int children_offset = pbvh->nodes.size(); n->children_offset = children_offset; - pbvh_grow_nodes(pbvh, pbvh->nodes.size() + 2); + pbvh->nodes.resize(pbvh->nodes.size() + 2); pbvh_bmesh_create_nodes_fast_recursive( pbvh, nodeinfo, face_bounds, node->child1, children_offset); pbvh_bmesh_create_nodes_fast_recursive( @@ -2158,16 +2158,19 @@ void BKE_pbvh_update_bmesh_offsets(PBVH *pbvh, int cd_vert_node_offset, int cd_f pbvh->cd_face_node_offset = cd_face_node_offset; } -void BKE_pbvh_build_bmesh(PBVH *pbvh, - BMesh *bm, - BMLog *log, - const int cd_vert_node_offset, - const int cd_face_node_offset) +namespace blender::bke::pbvh { + +PBVH *build_bmesh(BMesh *bm, + BMLog *log, + const int cd_vert_node_offset, + const int cd_face_node_offset) { - using namespace blender; + std::unique_ptr pbvh = std::make_unique(); + pbvh->header.type = PBVH_BMESH; + pbvh->header.bm = bm; - BKE_pbvh_bmesh_detail_size_set(pbvh, 0.75); + BKE_pbvh_bmesh_detail_size_set(pbvh.get(), 0.75); pbvh->header.type = PBVH_BMESH; pbvh->bm_log = log; @@ -2175,13 +2178,15 @@ void BKE_pbvh_build_bmesh(PBVH *pbvh, /* TODO: choose leaf limit better. */ pbvh->leaf_limit = 400; - BKE_pbvh_update_bmesh_offsets(pbvh, cd_vert_node_offset, cd_face_node_offset); + BKE_pbvh_update_bmesh_offsets(pbvh.get(), cd_vert_node_offset, cd_face_node_offset); + + if (bm->totface == 0) { + return {}; + } /* bounding box array of all faces, no need to recalculate every time. */ - Bounds *face_bounds = static_cast *>( - MEM_mallocN(sizeof(Bounds) * bm->totface, "Bounds")); - BMFace **nodeinfo = static_cast( - MEM_mallocN(sizeof(*nodeinfo) * bm->totface, "nodeinfo")); + Array> face_bounds(bm->totface); + Array nodeinfo(bm->totface); MemArena *arena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "fast PBVH node storage"); BMIter iter; @@ -2214,7 +2219,7 @@ void BKE_pbvh_build_bmesh(PBVH *pbvh, rootnode.totface = bm->totface; /* Start recursion, assign faces to nodes accordingly. */ - pbvh_bmesh_node_limit_ensure_fast(pbvh, nodeinfo, face_bounds, &rootnode, arena); + pbvh_bmesh_node_limit_ensure_fast(pbvh.get(), nodeinfo, face_bounds, &rootnode, arena); /* We now have all faces assigned to a node, * next we need to assign those to the gsets of the nodes. */ @@ -2223,13 +2228,14 @@ void BKE_pbvh_build_bmesh(PBVH *pbvh, pbvh->nodes.append({}); /* Take root node and visit and populate children recursively. */ - pbvh_bmesh_create_nodes_fast_recursive(pbvh, nodeinfo, face_bounds, &rootnode, 0); + pbvh_bmesh_create_nodes_fast_recursive(pbvh.get(), nodeinfo, face_bounds, &rootnode, 0); BLI_memarena_free(arena); - MEM_freeN(face_bounds); - MEM_freeN(nodeinfo); + return pbvh.release(); } +} // namespace blender::bke::pbvh + bool BKE_pbvh_bmesh_update_topology(PBVH *pbvh, PBVHTopologyUpdateMode mode, const float center[3], diff --git a/source/blender/blenkernel/intern/pbvh_intern.hh b/source/blender/blenkernel/intern/pbvh_intern.hh index d1937f9b8a9..01c5cf103c7 100644 --- a/source/blender/blenkernel/intern/pbvh_intern.hh +++ b/source/blender/blenkernel/intern/pbvh_intern.hh @@ -43,7 +43,7 @@ struct PBVHNode { /* List of primitives for this node. Semantics depends on * PBVH type: * - * - PBVH_FACES: Indices into the PBVH.looptri array. + * - PBVH_FACES: Indices into the #PBVH::looptris array. * - PBVH_GRIDS: Multires grid indices. * - PBVH_BMESH: Unused. See PBVHNode.bm_faces. * @@ -163,7 +163,7 @@ struct PBVH { blender::OffsetIndices faces; blender::Span corner_verts; /* Owned by the #PBVH, because after deformations they have to be recomputed. */ - blender::Array looptri; + blender::Array looptris; blender::Span looptri_faces; /* Grid Data */ @@ -197,10 +197,13 @@ struct PBVH { CustomDataLayer *color_layer; eAttrDomain color_domain; - bool is_drawing; + /* Initialize this to true, instead of waiting for a draw engine + * to set it. Prevents a crash in draw manager instancing code. + * TODO: This is fragile, another solution should be found. */ + bool is_drawing = true; /* Used by DynTopo to invalidate the draw cache. */ - bool draw_cache_invalid; + bool draw_cache_invalid = true; PBVHGPUFormat *vbo_id; @@ -209,7 +212,6 @@ struct PBVH { /* pbvh.cc */ -void pbvh_grow_nodes(PBVH *bvh, int totnode); bool ray_face_intersection_quad(const float ray_start[3], IsectRayPrecalc *isect_precalc, const float t0[3], diff --git a/source/blender/blenkernel/intern/pbvh_pixels.cc b/source/blender/blenkernel/intern/pbvh_pixels.cc index c2cd60cbed9..bb12593451c 100644 --- a/source/blender/blenkernel/intern/pbvh_pixels.cc +++ b/source/blender/blenkernel/intern/pbvh_pixels.cc @@ -285,7 +285,7 @@ static void split_flush_final_nodes(SplitQueueData *tdata) if (!newsplit->parent->children_offset) { newsplit->parent->children_offset = pbvh->nodes.size(); - pbvh_grow_nodes(pbvh, pbvh->nodes.size() + 2); + pbvh->nodes.resize(pbvh->nodes.size() + 2); newsplit->source_index = newsplit->parent->children_offset; } else { @@ -418,10 +418,10 @@ static void update_geom_primitives(PBVH &pbvh, const uv_islands::MeshData &mesh_ { PBVHData &pbvh_data = BKE_pbvh_pixels_data_get(pbvh); pbvh_data.clear_data(); - for (const MLoopTri &looptri : mesh_data.looptris) { - pbvh_data.geom_primitives.append(int3(mesh_data.corner_verts[looptri.tri[0]], - mesh_data.corner_verts[looptri.tri[1]], - mesh_data.corner_verts[looptri.tri[2]])); + for (const MLoopTri < : mesh_data.looptris) { + pbvh_data.geom_primitives.append(int3(mesh_data.corner_verts[lt.tri[0]], + mesh_data.corner_verts[lt.tri[1]], + mesh_data.corner_verts[lt.tri[2]])); } } @@ -466,11 +466,8 @@ struct EncodePixelsUserData { const UVPrimitiveLookup *uv_primitive_lookup; }; -static void do_encode_pixels(void *__restrict userdata, - const int n, - const TaskParallelTLS *__restrict /*tls*/) +static void do_encode_pixels(EncodePixelsUserData *data, const int n) { - EncodePixelsUserData *data = static_cast(userdata); const uv_islands::MeshData &mesh_data = *data->mesh_data; Image *image = data->image; ImageUser image_user = *data->image_user; @@ -676,7 +673,7 @@ static bool update_pixels(PBVH *pbvh, Mesh *mesh, Image *image, ImageUser *image const VArraySpan uv_map = *attributes.lookup(active_uv_name, ATTR_DOMAIN_CORNER); uv_islands::MeshData mesh_data( - pbvh->looptri, mesh->corner_verts(), uv_map, pbvh->vert_positions); + pbvh->looptris, mesh->corner_verts(), uv_map, pbvh->vert_positions); uv_islands::UVIslands islands(mesh_data); uv_islands::UVIslandsMask uv_masks; @@ -710,9 +707,11 @@ static bool update_pixels(PBVH *pbvh, Mesh *mesh, Image *image, ImageUser *image user_data.uv_primitive_lookup = &uv_primitive_lookup; user_data.uv_masks = &uv_masks; - TaskParallelSettings settings; - BKE_pbvh_parallel_range_settings(&settings, true, nodes_to_update.size()); - BLI_task_parallel_range(0, nodes_to_update.size(), &user_data, do_encode_pixels, &settings); + threading::parallel_for(nodes_to_update.index_range(), 1, [&](const IndexRange range) { + for (const int i : range) { + do_encode_pixels(&user_data, i); + } + }); if (USE_WATERTIGHT_CHECK) { apply_watertight_check(pbvh, image, image_user); } diff --git a/source/blender/blenkernel/intern/pbvh_pixels_copy.cc b/source/blender/blenkernel/intern/pbvh_pixels_copy.cc index 271a541e322..a39121a96c8 100644 --- a/source/blender/blenkernel/intern/pbvh_pixels_copy.cc +++ b/source/blender/blenkernel/intern/pbvh_pixels_copy.cc @@ -109,12 +109,12 @@ class NonManifoldUVEdges : public Vector> { if (is_manifold(mesh_data, edge_id)) { continue; } - const MLoopTri &loop_tri = mesh_data.looptris[primitive_id]; + const MLoopTri < = mesh_data.looptris[primitive_id]; const uv_islands::MeshEdge &mesh_edge = mesh_data.edges[edge_id]; Edge edge; - edge.vertex_1.coordinate = find_uv(mesh_data, loop_tri, mesh_edge.vert1); - edge.vertex_2.coordinate = find_uv(mesh_data, loop_tri, mesh_edge.vert2); + edge.vertex_1.coordinate = find_uv(mesh_data, lt, mesh_edge.vert1); + edge.vertex_2.coordinate = find_uv(mesh_data, lt, mesh_edge.vert2); append(edge); } } @@ -154,12 +154,10 @@ class NonManifoldUVEdges : public Vector> { return mesh_data.edge_to_primitive_map[edge_id].size() == 2; } - static float2 find_uv(const uv_islands::MeshData &mesh_data, - const MLoopTri &loop_tri, - int vertex_i) + static float2 find_uv(const uv_islands::MeshData &mesh_data, const MLoopTri <, int vertex_i) { for (int i = 0; i < 3; i++) { - const int loop_i = loop_tri.tri[i]; + const int loop_i = lt.tri[i]; const int vert = mesh_data.corner_verts[loop_i]; if (vert == vertex_i) { return mesh_data.uv_map[loop_i]; diff --git a/source/blender/blenkernel/intern/pbvh_uv_islands.cc b/source/blender/blenkernel/intern/pbvh_uv_islands.cc index 0f9765b7795..e866d4092cf 100644 --- a/source/blender/blenkernel/intern/pbvh_uv_islands.cc +++ b/source/blender/blenkernel/intern/pbvh_uv_islands.cc @@ -42,20 +42,14 @@ static void uv_primitive_append_to_uv_vertices(UVPrimitive &uv_primitive) * \{ */ static int primitive_get_other_uv_vertex(const MeshData &mesh_data, - const MLoopTri &looptri, + const MLoopTri <, const int v1, const int v2) { const Span corner_verts = mesh_data.corner_verts; - BLI_assert(ELEM(v1, - corner_verts[looptri.tri[0]], - corner_verts[looptri.tri[1]], - corner_verts[looptri.tri[2]])); - BLI_assert(ELEM(v2, - corner_verts[looptri.tri[0]], - corner_verts[looptri.tri[1]], - corner_verts[looptri.tri[2]])); - for (const int loop : looptri.tri) { + BLI_assert(ELEM(v1, corner_verts[lt.tri[0]], corner_verts[lt.tri[1]], corner_verts[lt.tri[2]])); + BLI_assert(ELEM(v2, corner_verts[lt.tri[0]], corner_verts[lt.tri[1]], corner_verts[lt.tri[2]])); + for (const int loop : lt.tri) { const int vert = corner_verts[loop]; if (!ELEM(vert, v1, v2)) { return vert; @@ -65,12 +59,12 @@ static int primitive_get_other_uv_vertex(const MeshData &mesh_data, } static bool primitive_has_shared_uv_edge(const Span uv_map, - const MLoopTri &looptri, - const MLoopTri &other) + const MLoopTri <, + const MLoopTri <_other) { int shared_uv_verts = 0; - for (const int loop : looptri.tri) { - for (const int other_loop : other.tri) { + for (const int loop : lt.tri) { + for (const int other_loop : lt_other.tri) { if (uv_map[loop] == uv_map[other_loop]) { shared_uv_verts += 1; } @@ -79,22 +73,22 @@ static bool primitive_has_shared_uv_edge(const Span uv_map, return shared_uv_verts >= 2; } -static int get_uv_loop(const MeshData &mesh_data, const MLoopTri &looptri, const int vert) +static int get_uv_loop(const MeshData &mesh_data, const MLoopTri <, const int vert) { - for (const int loop : looptri.tri) { + for (const int loop : lt.tri) { if (mesh_data.corner_verts[loop] == vert) { return loop; } } BLI_assert_unreachable(); - return looptri.tri[0]; + return lt.tri[0]; } -static rctf primitive_uv_bounds(const MLoopTri &looptri, const Span uv_map) +static rctf primitive_uv_bounds(const MLoopTri <, const Span uv_map) { rctf result; BLI_rctf_init_minmax(&result); - for (const int loop : looptri.tri) { + for (const int loop : lt.tri) { BLI_rctf_do_minmax_v(&result, uv_map[loop]); } return result; @@ -112,11 +106,11 @@ static void mesh_data_init_edges(MeshData &mesh_data) Map eh; eh.reserve(mesh_data.looptris.size() * 3); for (int64_t i = 0; i < mesh_data.looptris.size(); i++) { - const MLoopTri &tri = mesh_data.looptris[i]; + const MLoopTri < = mesh_data.looptris[i]; Vector edges; for (int j = 0; j < 3; j++) { - int v1 = mesh_data.corner_verts[tri.tri[j]]; - int v2 = mesh_data.corner_verts[tri.tri[(j + 1) % 3]]; + int v1 = mesh_data.corner_verts[lt.tri[j]]; + int v2 = mesh_data.corner_verts[lt.tri[(j + 1) % 3]]; int64_t edge_index; eh.add_or_modify( @@ -426,13 +420,13 @@ static UVPrimitive *add_primitive(const MeshData &mesh_data, const int primitive_i) { UVPrimitive uv_primitive(primitive_i); - const MLoopTri &primitive = mesh_data.looptris[primitive_i]; + const MLoopTri <_primitive = mesh_data.looptris[primitive_i]; uv_island.uv_primitives.append(uv_primitive); UVPrimitive *uv_primitive_ptr = &uv_island.uv_primitives.last(); for (const int edge_i : mesh_data.primitive_to_edge_map[primitive_i]) { const MeshEdge &edge = mesh_data.edges[edge_i]; - const int loop_1 = get_uv_loop(mesh_data, primitive, edge.vert1); - const int loop_2 = get_uv_loop(mesh_data, primitive, edge.vert2); + const int loop_1 = get_uv_loop(mesh_data, lt_primitive, edge.vert1); + const int loop_2 = get_uv_loop(mesh_data, lt_primitive, edge.vert2); UVEdge uv_edge_template; uv_edge_template.vertices[0] = uv_island.lookup_or_create(UVVertex(mesh_data, loop_1)); uv_edge_template.vertices[1] = uv_island.lookup_or_create(UVVertex(mesh_data, loop_2)); @@ -508,7 +502,7 @@ static std::optional sharpest_border_corner(UVIsland &island) /** The inner edge of a fan. */ struct FanSegment { const int primitive_index; - const MLoopTri *primitive; + const MLoopTri *lt_primitive; /* UVs order are already applied. So `uvs[0]` matches `primitive->vertices[vert_order[0]]`. */ float2 uvs[3]; int vert_order[3]; @@ -519,25 +513,25 @@ struct FanSegment { FanSegment(const MeshData &mesh_data, const int primitive_index, - const MLoopTri *primitive, + const MLoopTri *lt_primitive, int vertex) - : primitive_index(primitive_index), primitive(primitive) + : primitive_index(primitive_index), lt_primitive(lt_primitive) { flags.found = false; /* Reorder so the first edge starts with the given vertex. */ - if (mesh_data.corner_verts[primitive->tri[1]] == vertex) { + if (mesh_data.corner_verts[lt_primitive->tri[1]] == vertex) { vert_order[0] = 1; vert_order[1] = 2; vert_order[2] = 0; } - else if (mesh_data.corner_verts[primitive->tri[2]] == vertex) { + else if (mesh_data.corner_verts[lt_primitive->tri[2]] == vertex) { vert_order[0] = 2; vert_order[1] = 0; vert_order[2] = 1; } else { - BLI_assert(mesh_data.corner_verts[primitive->tri[0]] == vertex); + BLI_assert(mesh_data.corner_verts[lt_primitive->tri[0]] == vertex); vert_order[0] = 0; vert_order[1] = 1; vert_order[2] = 2; @@ -547,9 +541,9 @@ struct FanSegment { void print_debug(const MeshData &mesh_data) const { std::stringstream ss; - ss << " v1:" << mesh_data.corner_verts[primitive->tri[vert_order[0]]]; - ss << " v2:" << mesh_data.corner_verts[primitive->tri[vert_order[1]]]; - ss << " v3:" << mesh_data.corner_verts[primitive->tri[vert_order[2]]]; + ss << " v1:" << mesh_data.corner_verts[lt_primitive->tri[vert_order[0]]]; + ss << " v2:" << mesh_data.corner_verts[lt_primitive->tri[vert_order[1]]]; + ss << " v3:" << mesh_data.corner_verts[lt_primitive->tri[vert_order[2]]]; ss << " uv1:" << uvs[0]; ss << " uv2:" << uvs[1]; ss << " uv3:" << uvs[2]; @@ -590,14 +584,14 @@ struct Fan { continue; } - const MLoopTri &other_looptri = mesh_data.looptris[other_primitive_i]; + const MLoopTri &other_lt = mesh_data.looptris[other_primitive_i]; for (const int edge_i : mesh_data.primitive_to_edge_map[other_primitive_i]) { const MeshEdge &edge = mesh_data.edges[edge_i]; if (edge_i == current_edge || (edge.vert1 != vertex && edge.vert2 != vertex)) { continue; } - segments.append(FanSegment(mesh_data, other_primitive_i, &other_looptri, vertex)); + segments.append(FanSegment(mesh_data, other_primitive_i, &other_lt, vertex)); current_edge = edge_i; previous_primitive = other_primitive_i; stop = true; @@ -638,9 +632,9 @@ struct Fan { void init_uv_coordinates(const MeshData &mesh_data, UVVertex &uv_vertex) { for (FanSegment &fan_edge : segments) { - int other_v = mesh_data.corner_verts[fan_edge.primitive->tri[fan_edge.vert_order[0]]]; + int other_v = mesh_data.corner_verts[fan_edge.lt_primitive->tri[fan_edge.vert_order[0]]]; if (other_v == uv_vertex.vertex) { - other_v = mesh_data.corner_verts[fan_edge.primitive->tri[fan_edge.vert_order[1]]]; + other_v = mesh_data.corner_verts[fan_edge.lt_primitive->tri[fan_edge.vert_order[1]]]; } for (UVEdge *edge : uv_vertex.uv_edges) { @@ -668,7 +662,7 @@ struct Fan { bool contains_vertex_on_outside(const MeshData &mesh_data, const int vertex_index) const { for (const FanSegment &segment : segments) { - int v2 = mesh_data.corner_verts[segment.primitive->tri[segment.vert_order[1]]]; + int v2 = mesh_data.corner_verts[segment.lt_primitive->tri[segment.vert_order[1]]]; if (vertex_index == v2) { return true; } @@ -685,8 +679,8 @@ struct Fan { { int current_vert = from_vertex; for (FanSegment *segment : path) { - int v1 = mesh_data.corner_verts[segment->primitive->tri[segment->vert_order[1]]]; - int v2 = mesh_data.corner_verts[segment->primitive->tri[segment->vert_order[2]]]; + int v1 = mesh_data.corner_verts[segment->lt_primitive->tri[segment->vert_order[1]]]; + int v2 = mesh_data.corner_verts[segment->lt_primitive->tri[segment->vert_order[2]]]; if (!ELEM(current_vert, v1, v2)) { return false; } @@ -717,7 +711,7 @@ struct Fan { while (true) { FanSegment *segment = edge_order[index]; int v2 = - mesh_data.corner_verts[segment->primitive->tri[segment->vert_order[from_vert_order]]]; + mesh_data.corner_verts[segment->lt_primitive->tri[segment->vert_order[from_vert_order]]]; if (v2 == from_vertex) { break; } @@ -728,7 +722,8 @@ struct Fan { FanSegment *segment = edge_order[index]; result.append(segment); - int v3 = mesh_data.corner_verts[segment->primitive->tri[segment->vert_order[to_vert_order]]]; + int v3 = + mesh_data.corner_verts[segment->lt_primitive->tri[segment->vert_order[to_vert_order]]]; if (v3 == to_vertex) { break; } @@ -812,21 +807,21 @@ static void add_uv_primitive_shared_uv_edge(const MeshData &mesh_data, const int mesh_primitive_i) { UVPrimitive prim1(mesh_primitive_i); - const MLoopTri &looptri = mesh_data.looptris[mesh_primitive_i]; + const MLoopTri < = mesh_data.looptris[mesh_primitive_i]; const int other_vert_i = primitive_get_other_uv_vertex( - mesh_data, looptri, connected_vert_1->vertex, connected_vert_2->vertex); + mesh_data, lt, connected_vert_1->vertex, connected_vert_2->vertex); UVVertex vert_template; vert_template.uv = uv_unconnected; vert_template.vertex = other_vert_i; UVVertex *vert_ptr = island.lookup_or_create(vert_template); - const int loop_1 = get_uv_loop(mesh_data, looptri, connected_vert_1->vertex); + const int loop_1 = get_uv_loop(mesh_data, lt, connected_vert_1->vertex); vert_template.uv = connected_vert_1->uv; vert_template.vertex = mesh_data.corner_verts[loop_1]; UVVertex *vert_1_ptr = island.lookup_or_create(vert_template); - const int loop_2 = get_uv_loop(mesh_data, looptri, connected_vert_2->vertex); + const int loop_2 = get_uv_loop(mesh_data, lt, connected_vert_2->vertex); vert_template.uv = connected_vert_2->uv; vert_template.vertex = mesh_data.corner_verts[loop_2]; UVVertex *vert_2_ptr = island.lookup_or_create(vert_template); @@ -862,9 +857,9 @@ static int find_fill_primitive(const MeshData &mesh_data, UVBorderCorner &corner const MeshEdge &edge = mesh_data.edges[edge_i]; if (corner.first->edge->has_same_vertices(edge)) { for (const int primitive_i : mesh_data.edge_to_primitive_map[edge_i]) { - const MLoopTri &looptri = mesh_data.looptris[primitive_i]; + const MLoopTri < = mesh_data.looptris[primitive_i]; const int other_vert = primitive_get_other_uv_vertex( - mesh_data, looptri, edge.vert1, edge.vert2); + mesh_data, lt, edge.vert1, edge.vert2); if (other_vert == corner.second->get_uv_vertex(1)->vertex) { return primitive_i; } @@ -927,7 +922,7 @@ static void extend_at_vert(const MeshData &mesh_data, * When all edges are already added and its winding solution contains one segment to be added, * the segment should be split into two segments in order one for both sides. * - * Although the fill_primitive can fill the missing segment it could lead to a squashed + * Although the lt_fill_primitive can fill the missing segment it could lead to a squashed * triangle when the corner angle is near 180 degrees. In order to fix this we will * always add two segments both using the same fill primitive. */ @@ -992,9 +987,9 @@ static void extend_at_vert(const MeshData &mesh_data, FanSegment &segment = *winding_solution[segment_index]; const int fill_primitive_i = segment.primitive_index; - const MLoopTri &fill_primitive = mesh_data.looptris[fill_primitive_i]; + const MLoopTri <_fill_primitive = mesh_data.looptris[fill_primitive_i]; const int other_prim_vertex = primitive_get_other_uv_vertex( - mesh_data, fill_primitive, uv_vertex->vertex, shared_edge_vertex); + mesh_data, lt_fill_primitive, uv_vertex->vertex, shared_edge_vertex); UVVertex uv_vertex_template; uv_vertex_template.vertex = uv_vertex->vertex; @@ -1321,10 +1316,10 @@ bool UVPrimitive::has_shared_edge(const UVPrimitive &other) const bool UVPrimitive::has_shared_edge(const MeshData &mesh_data, const int primitive_i) const { for (const UVEdge *uv_edge : edges) { - const MLoopTri &primitive = mesh_data.looptris[primitive_i]; - int loop_1 = primitive.tri[2]; + const MLoopTri <_primitive = mesh_data.looptris[primitive_i]; + int loop_1 = lt_primitive.tri[2]; for (int i = 0; i < 3; i++) { - int loop_2 = primitive.tri[i]; + int loop_2 = lt_primitive.tri[i]; if (uv_edge->has_shared_edge(mesh_data.uv_map, loop_1, loop_2)) { return true; } @@ -1337,8 +1332,8 @@ bool UVPrimitive::has_shared_edge(const MeshData &mesh_data, const int primitive const UVVertex *UVPrimitive::get_uv_vertex(const MeshData &mesh_data, const uint8_t mesh_vert_index) const { - const MLoopTri &looptri = mesh_data.looptris[this->primitive_i]; - const int mesh_vertex = mesh_data.corner_verts[looptri.tri[mesh_vert_index]]; + const MLoopTri < = mesh_data.looptris[this->primitive_i]; + const int mesh_vertex = mesh_data.corner_verts[lt.tri[mesh_vert_index]]; for (const UVEdge *uv_edge : edges) { for (const UVVertex *uv_vert : uv_edge->vertices) { if (uv_vert->vertex == mesh_vertex) { @@ -1528,9 +1523,9 @@ static void add_uv_island(const MeshData &mesh_data, { for (const VectorList::UsedVector &uv_primitives : uv_island.uv_primitives) { for (const UVPrimitive &uv_primitive : uv_primitives) { - const MLoopTri &looptri = mesh_data.looptris[uv_primitive.primitive_i]; + const MLoopTri < = mesh_data.looptris[uv_primitive.primitive_i]; - rctf uv_bounds = primitive_uv_bounds(looptri, mesh_data.uv_map); + rctf uv_bounds = primitive_uv_bounds(lt, mesh_data.uv_map); rcti buffer_bounds; buffer_bounds.xmin = max_ii( floor((uv_bounds.xmin - tile.udim_offset.x) * tile.mask_resolution.x), 0); @@ -1547,9 +1542,9 @@ static void add_uv_island(const MeshData &mesh_data, for (int x = buffer_bounds.xmin; x < buffer_bounds.xmax + 1; x++) { float2 uv(float(x) / tile.mask_resolution.x, float(y) / tile.mask_resolution.y); float3 weights; - barycentric_weights_v2(mesh_data.uv_map[looptri.tri[0]], - mesh_data.uv_map[looptri.tri[1]], - mesh_data.uv_map[looptri.tri[2]], + barycentric_weights_v2(mesh_data.uv_map[lt.tri[0]], + mesh_data.uv_map[lt.tri[1]], + mesh_data.uv_map[lt.tri[2]], uv + tile.udim_offset, weights); if (!barycentric_inside_triangle_v2(weights)) { diff --git a/source/blender/blenkernel/intern/pbvh_uv_islands.hh b/source/blender/blenkernel/intern/pbvh_uv_islands.hh index 998664c7997..1b221644b7b 100644 --- a/source/blender/blenkernel/intern/pbvh_uv_islands.hh +++ b/source/blender/blenkernel/intern/pbvh_uv_islands.hh @@ -118,10 +118,10 @@ class TriangleToEdgeMap { */ struct MeshData { public: - const Span looptris; - const Span corner_verts; - const Span uv_map; - const Span vert_positions; + Span looptris; + Span corner_verts; + Span uv_map; + Span vert_positions; VertToEdgeMap vert_to_edge_map; @@ -141,8 +141,8 @@ struct MeshData { public: explicit MeshData(Span looptris, Span corner_verts, - const Span uv_map, - const Span vert_positions); + Span uv_map, + Span vert_positions); }; struct UVVertex { diff --git a/source/blender/blenkernel/intern/shrinkwrap.cc b/source/blender/blenkernel/intern/shrinkwrap.cc index 2c2384627af..fbbb4dc267d 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.cc +++ b/source/blender/blenkernel/intern/shrinkwrap.cc @@ -133,7 +133,7 @@ bool BKE_shrinkwrap_init_tree( return false; } - data->bvh = BKE_bvhtree_from_mesh_get(&data->treeData, mesh, BVHTREE_FROM_LOOPTRI, 4); + data->bvh = BKE_bvhtree_from_mesh_get(&data->treeData, mesh, BVHTREE_FROM_LOOPTRIS, 4); if (data->bvh == nullptr) { return false; @@ -226,7 +226,7 @@ static std::unique_ptr shrinkwrap_build_boundary_data(Me data->edge_is_boundary = std::move(edge_is_boundary); - /* Build the boundary looptri bitmask. */ + /* Build the boundary looptris bit-mask. */ const blender::Span looptris = mesh->looptris(); blender::BitVector<> looptri_has_boundary(looptris.size(), false); @@ -995,21 +995,25 @@ static void target_project_edge(const ShrinkwrapTreeData *tree, } /* Target normal projection BVH callback - based on mesh_looptri_nearest_point. */ -static void mesh_looptri_target_project(void *userdata, - int index, - const float co[3], - BVHTreeNearest *nearest) +static void mesh_looptris_target_project(void *userdata, + int index, + const float co[3], + BVHTreeNearest *nearest) { using namespace blender; const ShrinkwrapTreeData *tree = (ShrinkwrapTreeData *)userdata; const BVHTreeFromMesh *data = &tree->treeData; const MLoopTri *lt = &data->looptris[index]; - const int tri_verts[3] = {data->corner_verts[lt->tri[0]], - data->corner_verts[lt->tri[1]], - data->corner_verts[lt->tri[2]]}; - const float *vtri_co[3] = {data->vert_positions[tri_verts[0]], - data->vert_positions[tri_verts[1]], - data->vert_positions[tri_verts[2]]}; + const int tri_verts[3] = { + data->corner_verts[lt->tri[0]], + data->corner_verts[lt->tri[1]], + data->corner_verts[lt->tri[2]], + }; + const float *vtri_co[3] = { + data->vert_positions[tri_verts[0]], + data->vert_positions[tri_verts[1]], + data->vert_positions[tri_verts[2]], + }; float raw_hit_co[3], hit_co[3], hit_no[3], dist_sq, vtri_no[3][3]; /* First find the closest point and bail out if it's worse than the current solution. */ @@ -1066,7 +1070,7 @@ void BKE_shrinkwrap_find_nearest_surface(ShrinkwrapTreeData *tree, #endif BLI_bvhtree_find_nearest_ex( - tree->bvh, co, nearest, mesh_looptri_target_project, tree, BVH_NEAREST_OPTIMAL_ORDER); + tree->bvh, co, nearest, mesh_looptris_target_project, tree, BVH_NEAREST_OPTIMAL_ORDER); #ifdef TRACE_TARGET_PROJECT printf("====== TARGET PROJECT END: %d %g ======\n\n", nearest->index, nearest->dist_sq); @@ -1165,21 +1169,21 @@ void BKE_shrinkwrap_compute_smooth_normal(const ShrinkwrapTreeData *tree, float r_no[3]) { const BVHTreeFromMesh *treeData = &tree->treeData; - const MLoopTri *tri = &treeData->looptris[looptri_idx]; + const MLoopTri *lt = &treeData->looptris[looptri_idx]; const int face_i = tree->mesh->looptri_faces()[looptri_idx]; /* Interpolate smooth normals if enabled. */ if (!(tree->sharp_faces && tree->sharp_faces[face_i])) { - const int vert_indices[3] = {treeData->corner_verts[tri->tri[0]], - treeData->corner_verts[tri->tri[1]], - treeData->corner_verts[tri->tri[2]]}; + const int vert_indices[3] = {treeData->corner_verts[lt->tri[0]], + treeData->corner_verts[lt->tri[1]], + treeData->corner_verts[lt->tri[2]]}; float w[3], no[3][3], tmp_co[3]; /* Custom and auto smooth split normals. */ if (!tree->corner_normals.is_empty()) { - copy_v3_v3(no[0], tree->corner_normals[tri->tri[0]]); - copy_v3_v3(no[1], tree->corner_normals[tri->tri[1]]); - copy_v3_v3(no[2], tree->corner_normals[tri->tri[2]]); + copy_v3_v3(no[0], tree->corner_normals[lt->tri[0]]); + copy_v3_v3(no[1], tree->corner_normals[lt->tri[1]]); + copy_v3_v3(no[2], tree->corner_normals[lt->tri[2]]); } /* Ordinary vertex normals. */ else { @@ -1215,7 +1219,7 @@ void BKE_shrinkwrap_compute_smooth_normal(const ShrinkwrapTreeData *tree, else if (!tree->face_normals.is_empty()) { copy_v3_v3(r_no, tree->face_normals[face_i]); } - /* Finally fallback to the looptri normal. */ + /* Finally fallback to the looptris normal. */ else { copy_v3_v3(r_no, hit_no); } @@ -1541,7 +1545,7 @@ void BKE_shrinkwrap_mesh_nearest_surface_deform(Depsgraph *depsgraph, -1, reinterpret_cast(src_me->vert_positions_for_write().data()), src_me->totvert); - BKE_mesh_tag_positions_changed(src_me); + src_me->tag_positions_changed(); } void BKE_shrinkwrap_remesh_target_project(Mesh *src_me, Mesh *target_me, Object *ob_target) @@ -1578,5 +1582,5 @@ void BKE_shrinkwrap_remesh_target_project(Mesh *src_me, Mesh *target_me, Object BKE_shrinkwrap_free_tree(&tree); } - BKE_mesh_tag_positions_changed(src_me); + src_me->tag_positions_changed(); } diff --git a/source/blender/blenkernel/intern/softbody.cc b/source/blender/blenkernel/intern/softbody.cc index 581249fcca5..2e553b1cfc4 100644 --- a/source/blender/blenkernel/intern/softbody.cc +++ b/source/blender/blenkernel/intern/softbody.cc @@ -106,7 +106,7 @@ typedef struct SBScratch { short needstobuildcollider; short flag; BodyFace *bodyface; - int totface; + int bodyface_num; float aabbmin[3], aabbmax[3]; ReferenceState Ref; } SBScratch; @@ -1251,10 +1251,10 @@ static void scan_for_ext_face_forces(Object *ob, float timenow) float tune = -10.0f; float feedback[3]; - if (sb && sb->scratch->totface) { + if (sb && sb->scratch->bodyface_num) { bf = sb->scratch->bodyface; - for (a = 0; a < sb->scratch->totface; a++, bf++) { + for (a = 0; a < sb->scratch->bodyface_num; a++, bf++) { bf->ext_force[0] = bf->ext_force[1] = bf->ext_force[2] = 0.0f; /*+++edges intruding. */ bf->flag &= ~BFF_INTERSECT; @@ -1300,7 +1300,7 @@ static void scan_for_ext_face_forces(Object *ob, float timenow) /*--- close vertices. */ } bf = sb->scratch->bodyface; - for (a = 0; a < sb->scratch->totface; a++, bf++) { + for (a = 0; a < sb->scratch->bodyface_num; a++, bf++) { if ((bf->flag & BFF_INTERSECT) || (bf->flag & BFF_CLOSEVERT)) { sb->bpoint[bf->v1].choke2 = max_ff(sb->bpoint[bf->v1].choke2, choke); sb->bpoint[bf->v2].choke2 = max_ff(sb->bpoint[bf->v2].choke2, choke); @@ -2701,7 +2701,7 @@ static void mesh_to_softbody(Object *ob) sb = ob->soft; bp = sb->bpoint; - const MDeformVert *dvert = BKE_mesh_deform_verts(mesh); + const MDeformVert *dvert = mesh->deform_verts().data(); defgroup_index = dvert ? (sb->vertgroup - 1) : -1; defgroup_index_mass = dvert ? BKE_id_defgroup_name_index(&mesh->id, sb->namedVG_Mass) : -1; @@ -2776,17 +2776,17 @@ static void mesh_faces_to_scratch(Object *ob) /* Allocate and copy faces. */ - sb->scratch->totface = poly_to_tri_count(mesh->faces_num, mesh->totloop); - blender::Array looptri(mesh->totvert); + sb->scratch->bodyface_num = poly_to_tri_count(mesh->faces_num, mesh->totloop); + blender::Array looptris(sb->scratch->bodyface_num); blender::bke::mesh::looptris_calc( - mesh->vert_positions(), mesh->faces(), mesh->corner_verts(), looptri); + mesh->vert_positions(), mesh->faces(), mesh->corner_verts(), looptris); - lt = looptri.data(); + lt = looptris.data(); bodyface = sb->scratch->bodyface = static_cast( - MEM_mallocN(sizeof(BodyFace) * sb->scratch->totface, "SB_body_Faces")); + MEM_mallocN(sizeof(BodyFace) * sb->scratch->bodyface_num, "SB_body_Faces")); - for (a = 0; a < sb->scratch->totface; a++, lt++, bodyface++) { + for (a = 0; a < sb->scratch->bodyface_num; a++, lt++, bodyface++) { bodyface->v1 = corner_verts[lt->tri[0]]; bodyface->v2 = corner_verts[lt->tri[1]]; bodyface->v3 = corner_verts[lt->tri[2]]; @@ -3111,7 +3111,7 @@ static void sb_new_scratch(SoftBody *sb) sb->scratch = static_cast(MEM_callocN(sizeof(SBScratch), "SBScratch")); sb->scratch->colliderhash = BLI_ghash_ptr_new("sb_new_scratch gh"); sb->scratch->bodyface = nullptr; - sb->scratch->totface = 0; + sb->scratch->bodyface_num = 0; sb->scratch->aabbmax[0] = sb->scratch->aabbmax[1] = sb->scratch->aabbmax[2] = 1.0e30f; sb->scratch->aabbmin[0] = sb->scratch->aabbmin[1] = sb->scratch->aabbmin[2] = -1.0e30f; sb->scratch->Ref.ivert = nullptr; diff --git a/source/blender/blenkernel/intern/studiolight.cc b/source/blender/blenkernel/intern/studiolight.cc index 09d72ce9328..68f4b698dc7 100644 --- a/source/blender/blenkernel/intern/studiolight.cc +++ b/source/blender/blenkernel/intern/studiolight.cc @@ -39,18 +39,8 @@ static ListBase studiolights; static int last_studiolight_id = 0; #define STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE 96 -#define STUDIOLIGHT_IRRADIANCE_EQUIRECT_HEIGHT 32 -#define STUDIOLIGHT_IRRADIANCE_EQUIRECT_WIDTH (STUDIOLIGHT_IRRADIANCE_EQUIRECT_HEIGHT * 2) #define STUDIOLIGHT_PASSNAME_DIFFUSE "diffuse" #define STUDIOLIGHT_PASSNAME_SPECULAR "specular" -/* Temporarily disabled due to the creation of textures with -nan(ind)s */ -#define STUDIOLIGHT_SH_WINDOWING 0.0f /* 0.0 is disabled */ - -/* - * Disable this option so caches are not loaded from disk - * Do not checking with this commented out. - */ -#define STUDIOLIGHT_LOAD_CACHED_FILES static const char *STUDIOLIGHT_LIGHTS_FOLDER = "studiolights" SEP_STR "studio" SEP_STR; static const char *STUDIOLIGHT_WORLD_FOLDER = "studiolights" SEP_STR "world" SEP_STR; @@ -107,6 +97,14 @@ static const char *STUDIOLIGHT_MATCAP_DEFAULT = "basic_1.exr"; } \ } while (0) +static void studiolight_free_image_buffers(StudioLight *sl) +{ + sl->flag &= ~STUDIOLIGHT_EXTERNAL_IMAGE_LOADED; + IMB_SAFE_FREE(sl->matcap_diffuse.ibuf); + IMB_SAFE_FREE(sl->matcap_specular.ibuf); + IMB_SAFE_FREE(sl->equirect_radiance_buffer); +} + static void studiolight_free(StudioLight *sl) { #define STUDIOLIGHT_DELETE_ICON(s) \ @@ -126,29 +124,35 @@ static void studiolight_free(StudioLight *sl) STUDIOLIGHT_DELETE_ICON(sl->icon_id_matcap_flipped); #undef STUDIOLIGHT_DELETE_ICON - for (int index = 0; index < 6; index++) { - IMB_SAFE_FREE(sl->radiance_cubemap_buffers[index]); - } + studiolight_free_image_buffers(sl); + GPU_TEXTURE_SAFE_FREE(sl->equirect_radiance_gputexture); - GPU_TEXTURE_SAFE_FREE(sl->equirect_irradiance_gputexture); - IMB_SAFE_FREE(sl->equirect_radiance_buffer); - IMB_SAFE_FREE(sl->equirect_irradiance_buffer); GPU_TEXTURE_SAFE_FREE(sl->matcap_diffuse.gputexture); GPU_TEXTURE_SAFE_FREE(sl->matcap_specular.gputexture); - IMB_SAFE_FREE(sl->matcap_diffuse.ibuf); - IMB_SAFE_FREE(sl->matcap_specular.ibuf); - MEM_SAFE_FREE(sl->path_irr_cache); - MEM_SAFE_FREE(sl->path_sh_cache); MEM_SAFE_FREE(sl); } +/** + * Free temp resources when the studio light is only requested for icons. + * + * Only keeps around resources for studio lights that have been used in any viewport. + */ +static void studiolight_free_temp_resources(StudioLight *sl) +{ + const bool is_used_in_viewport = bool(sl->flag & (STUDIOLIGHT_EQUIRECT_RADIANCE_GPUTEXTURE | + STUDIOLIGHT_MATCAP_SPECULAR_GPUTEXTURE | + STUDIOLIGHT_MATCAP_DIFFUSE_GPUTEXTURE)); + if (is_used_in_viewport) { + return; + } + studiolight_free_image_buffers(sl); +} + static StudioLight *studiolight_create(int flag) { StudioLight *sl = static_cast(MEM_callocN(sizeof(*sl), __func__)); sl->filepath[0] = 0x00; sl->name[0] = 0x00; - sl->path_irr_cache = nullptr; - sl->path_sh_cache = nullptr; sl->free_function = nullptr; sl->flag = flag; sl->index = ++last_studiolight_id; @@ -164,10 +168,6 @@ static StudioLight *studiolight_create(int flag) sl->icon_id_radiance = BKE_icon_ensure_studio_light(sl, STUDIOLIGHT_ICON_ID_TYPE_RADIANCE); } - for (int index = 0; index < 6; index++) { - sl->radiance_cubemap_buffers[index] = nullptr; - } - return sl; } @@ -275,58 +275,6 @@ static void direction_to_equirect(float r[2], const float dir[3]) r[1] = (acosf(dir[2] / 1.0) - M_PI) / -M_PI; } -static void equirect_to_direction(float r[3], float u, float v) -{ - float phi = -(M_PI * 2) * u + M_PI; - float theta = -M_PI * v + M_PI; - float sin_theta = sinf(theta); - r[0] = sin_theta * cosf(phi); - r[1] = sin_theta * sinf(phi); - r[2] = cosf(theta); -} - -static void UNUSED_FUNCTION(direction_to_cube_face_uv)(float r_uv[2], - int *r_face, - const float dir[3]) -{ - if (fabsf(dir[0]) > fabsf(dir[1]) && fabsf(dir[0]) > fabsf(dir[2])) { - bool is_pos = (dir[0] > 0.0f); - *r_face = is_pos ? STUDIOLIGHT_X_POS : STUDIOLIGHT_X_NEG; - r_uv[0] = dir[2] / fabsf(dir[0]) * (is_pos ? 1 : -1); - r_uv[1] = dir[1] / fabsf(dir[0]) * -1; - } - else if (fabsf(dir[1]) > fabsf(dir[0]) && fabsf(dir[1]) > fabsf(dir[2])) { - bool is_pos = (dir[1] > 0.0f); - *r_face = is_pos ? STUDIOLIGHT_Y_POS : STUDIOLIGHT_Y_NEG; - r_uv[0] = dir[0] / fabsf(dir[1]) * 1; - r_uv[1] = dir[2] / fabsf(dir[1]) * (is_pos ? -1 : 1); - } - else { - bool is_pos = (dir[2] > 0.0f); - *r_face = is_pos ? STUDIOLIGHT_Z_NEG : STUDIOLIGHT_Z_POS; - r_uv[0] = dir[0] / fabsf(dir[2]) * (is_pos ? -1 : 1); - r_uv[1] = dir[1] / fabsf(dir[2]) * -1; - } - r_uv[0] = r_uv[0] * 0.5f + 0.5f; - r_uv[1] = r_uv[1] * 0.5f + 0.5f; -} - -static void cube_face_uv_to_direction(float r_dir[3], float x, float y, int face) -{ - const float conversion_matrices[6][3][3] = { - {{0.0f, 0.0f, 1.0f}, {0.0f, -1.0f, 0.0f}, {1.0f, 0.0f, 0.0f}}, - {{0.0f, 0.0f, -1.0f}, {0.0f, -1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f}}, - {{1.0f, 0.0f, 0.0f}, {0.0f, 0.0f, -1.0f}, {0.0f, 1.0f, 0.0f}}, - {{1.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {0.0f, -1.0f, 0.0f}}, - {{1.0f, 0.0f, 0.0f}, {0.0f, -1.0f, 0.0f}, {0.0f, 0.0f, -1.0f}}, - {{-1.0f, 0.0f, 0.0f}, {0.0f, -1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}}, - }; - - copy_v3_fl3(r_dir, x * 2.0f - 1.0f, y * 2.0f - 1.0f, 1.0f); - mul_m3_v3(conversion_matrices[face], r_dir); - normalize_v3(r_dir); -} - struct MultilayerConvertContext { int num_diffuse_channels; float *diffuse_pass; @@ -540,25 +488,6 @@ static void studiolight_create_matcap_specular_gputexture(StudioLight *sl) sl->flag |= STUDIOLIGHT_MATCAP_SPECULAR_GPUTEXTURE; } -static void studiolight_create_equirect_irradiance_gputexture(StudioLight *sl) -{ - if (sl->flag & STUDIOLIGHT_EXTERNAL_FILE) { - BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_EQUIRECT_IRRADIANCE_IMAGE_CALCULATED); - ImBuf *ibuf = sl->equirect_irradiance_buffer; - sl->equirect_irradiance_gputexture = GPU_texture_create_2d("studiolight_irradiance", - ibuf->x, - ibuf->y, - 1, - GPU_RGBA16F, - GPU_TEXTURE_USAGE_SHADER_READ, - ibuf->float_buffer.data); - GPUTexture *tex = sl->equirect_irradiance_gputexture; - GPU_texture_filter_mode(tex, true); - GPU_texture_extend_mode(tex, GPU_SAMPLER_EXTEND_MODE_REPEAT); - } - sl->flag |= STUDIOLIGHT_EQUIRECT_IRRADIANCE_GPUTEXTURE; -} - static void studiolight_calculate_radiance(ImBuf *ibuf, float color[4], const float direction[3]) { float uv[2]; @@ -566,117 +495,6 @@ static void studiolight_calculate_radiance(ImBuf *ibuf, float color[4], const fl nearest_interpolation_color_wrap(ibuf, nullptr, color, uv[0] * ibuf->x, uv[1] * ibuf->y); } -static void studiolight_calculate_radiance_buffer(ImBuf *ibuf, - float *colbuf, - const int index_x, - const int index_y, - const int index_z, - const float xsign, - const float ysign, - const float zsign) -{ - ITER_PIXELS ( - float, colbuf, 4, STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE, STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE) - { - float direction[3]; - direction[index_x] = xsign * (x - 0.5f); - direction[index_y] = ysign * (y - 0.5f); - direction[index_z] = zsign * 0.5f; - normalize_v3(direction); - studiolight_calculate_radiance(ibuf, pixel, direction); - } - ITER_PIXELS_END; -} - -static void studiolight_calculate_radiance_cubemap_buffers(StudioLight *sl) -{ - if (sl->flag & STUDIOLIGHT_EXTERNAL_FILE) { - BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_EXTERNAL_IMAGE_LOADED); - ImBuf *ibuf = sl->equirect_radiance_buffer; - if (ibuf) { - float *colbuf = static_cast(MEM_malloc_arrayN( - square_i(STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE), sizeof(float[4]), __func__)); - - /* front */ - studiolight_calculate_radiance_buffer(ibuf, colbuf, 0, 2, 1, 1, -1, 1); - sl->radiance_cubemap_buffers[STUDIOLIGHT_Y_POS] = IMB_allocFromBuffer( - nullptr, - colbuf, - STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE, - STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE, - 4); - - /* back */ - studiolight_calculate_radiance_buffer(ibuf, colbuf, 0, 2, 1, 1, 1, -1); - sl->radiance_cubemap_buffers[STUDIOLIGHT_Y_NEG] = IMB_allocFromBuffer( - nullptr, - colbuf, - STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE, - STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE, - 4); - - /* left */ - studiolight_calculate_radiance_buffer(ibuf, colbuf, 2, 1, 0, 1, -1, 1); - sl->radiance_cubemap_buffers[STUDIOLIGHT_X_POS] = IMB_allocFromBuffer( - nullptr, - colbuf, - STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE, - STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE, - 4); - - /* right */ - studiolight_calculate_radiance_buffer(ibuf, colbuf, 2, 1, 0, -1, -1, -1); - sl->radiance_cubemap_buffers[STUDIOLIGHT_X_NEG] = IMB_allocFromBuffer( - nullptr, - colbuf, - STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE, - STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE, - 4); - - /* top */ - studiolight_calculate_radiance_buffer(ibuf, colbuf, 0, 1, 2, -1, -1, 1); - sl->radiance_cubemap_buffers[STUDIOLIGHT_Z_NEG] = IMB_allocFromBuffer( - nullptr, - colbuf, - STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE, - STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE, - 4); - - /* bottom */ - studiolight_calculate_radiance_buffer(ibuf, colbuf, 0, 1, 2, 1, -1, -1); - sl->radiance_cubemap_buffers[STUDIOLIGHT_Z_POS] = IMB_allocFromBuffer( - nullptr, - colbuf, - STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE, - STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE, - 4); - -#if 0 - IMB_saveiff(sl->radiance_cubemap_buffers[STUDIOLIGHT_X_POS], - "/tmp/studiolight_radiance_left.png", - IB_rectfloat); - IMB_saveiff(sl->radiance_cubemap_buffers[STUDIOLIGHT_X_NEG], - "/tmp/studiolight_radiance_right.png", - IB_rectfloat); - IMB_saveiff(sl->radiance_cubemap_buffers[STUDIOLIGHT_Y_POS], - "/tmp/studiolight_radiance_front.png", - IB_rectfloat); - IMB_saveiff(sl->radiance_cubemap_buffers[STUDIOLIGHT_Y_NEG], - "/tmp/studiolight_radiance_back.png", - IB_rectfloat); - IMB_saveiff(sl->radiance_cubemap_buffers[STUDIOLIGHT_Z_POS], - "/tmp/studiolight_radiance_bottom.png", - IB_rectfloat); - IMB_saveiff(sl->radiance_cubemap_buffers[STUDIOLIGHT_Z_NEG], - "/tmp/studiolight_radiance_top.png", - IB_rectfloat); -#endif - MEM_freeN(colbuf); - } - } - sl->flag |= STUDIOLIGHT_RADIANCE_BUFFERS_CALCULATED; -} - /* * Spherical Harmonics */ @@ -685,347 +503,6 @@ BLI_INLINE float area_element(float x, float y) return atan2(x * y, sqrtf(x * x + y * y + 1)); } -BLI_INLINE float texel_solid_angle(float x, float y, float halfpix) -{ - float v1x = (x - halfpix) * 2.0f - 1.0f; - float v1y = (y - halfpix) * 2.0f - 1.0f; - float v2x = (x + halfpix) * 2.0f - 1.0f; - float v2y = (y + halfpix) * 2.0f - 1.0f; - - return area_element(v1x, v1y) - area_element(v1x, v2y) - area_element(v2x, v1y) + - area_element(v2x, v2y); -} - -static void studiolight_calculate_cubemap_vector_weight( - float normal[3], float *weight, int face, float x, float y) -{ - const float halfpix = 0.5f / STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE; - cube_face_uv_to_direction(normal, x, y, face); - *weight = texel_solid_angle(x, y, halfpix); -} - -static void studiolight_spherical_harmonics_calculate_coefficients(StudioLight *sl, float (*sh)[3]) -{ - float weight_accum = 0.0f; - memset(sh, 0, sizeof(float[3]) * STUDIOLIGHT_SH_COEFS_LEN); - - for (int face = 0; face < 6; face++) { - ITER_PIXELS (float, - sl->radiance_cubemap_buffers[face]->float_buffer.data, - 4, - STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE, - STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE) - { - float color[3], cubevec[3], weight; - studiolight_calculate_cubemap_vector_weight(cubevec, &weight, face, x, y); - mul_v3_v3fl(color, pixel, weight); - weight_accum += weight; - - int i = 0; - /* L0 */ - madd_v3_v3fl(sh[i++], color, 0.2822095f); -#if STUDIOLIGHT_SH_BANDS > 1 /* L1 */ - const float nx = cubevec[0]; - const float ny = cubevec[1]; - const float nz = cubevec[2]; - madd_v3_v3fl(sh[i++], color, -0.488603f * nz); - madd_v3_v3fl(sh[i++], color, 0.488603f * ny); - madd_v3_v3fl(sh[i++], color, -0.488603f * nx); -#endif -#if STUDIOLIGHT_SH_BANDS > 2 /* L2 */ - const float nx2 = SQUARE(nx); - const float ny2 = SQUARE(ny); - const float nz2 = SQUARE(nz); - madd_v3_v3fl(sh[i++], color, 1.092548f * nx * nz); - madd_v3_v3fl(sh[i++], color, -1.092548f * nz * ny); - madd_v3_v3fl(sh[i++], color, 0.315392f * (3.0f * ny2 - 1.0f)); - madd_v3_v3fl(sh[i++], color, 1.092548f * nx * ny); - madd_v3_v3fl(sh[i++], color, 0.546274f * (nx2 - nz2)); -#endif -/* Bypass L3 Because final irradiance does not need it. */ -#if STUDIOLIGHT_SH_BANDS > 4 /* L4 */ - const float nx4 = SQUARE(nx2); - const float ny4 = SQUARE(ny2); - const float nz4 = SQUARE(nz2); - madd_v3_v3fl(sh[i++], color, 2.5033429417967046f * nx * nz * (nx2 - nz2)); - madd_v3_v3fl(sh[i++], color, -1.7701307697799304f * nz * ny * (3.0f * nx2 - nz2)); - madd_v3_v3fl(sh[i++], color, 0.9461746957575601f * nz * nx * (-1.0f + 7.0f * ny2)); - madd_v3_v3fl(sh[i++], color, -0.6690465435572892f * nz * ny * (-3.0f + 7.0f * ny2)); - madd_v3_v3fl(sh[i++], color, (105.0f * ny4 - 90.0f * ny2 + 9.0f) / 28.359261614f); - madd_v3_v3fl(sh[i++], color, -0.6690465435572892f * nx * ny * (-3.0f + 7.0f * ny2)); - madd_v3_v3fl(sh[i++], color, 0.9461746957575601f * (nx2 - nz2) * (-1.0f + 7.0f * ny2)); - madd_v3_v3fl(sh[i++], color, -1.7701307697799304f * nx * ny * (nx2 - 3.0f * nz2)); - madd_v3_v3fl(sh[i++], color, 0.6258357354491761f * (nx4 - 6.0f * nz2 * nx2 + nz4)); -#endif - } - ITER_PIXELS_END; - } - - /* The sum of solid angle should be equal to the solid angle of the sphere (4 PI), - * so normalize in order to make our weightAccum exactly match 4 PI. */ - for (int i = 0; i < STUDIOLIGHT_SH_COEFS_LEN; i++) { - mul_v3_fl(sh[i], M_PI * 4.0f / weight_accum); - } -} - -/* Take monochrome SH as input */ -static float studiolight_spherical_harmonics_lambda_get(float *sh, float max_laplacian) -{ - /* From Peter-Pike Sloan's Stupid SH Tricks http://www.ppsloan.org/publications/StupidSH36.pdf - */ - float table_l[STUDIOLIGHT_SH_BANDS]; - float table_b[STUDIOLIGHT_SH_BANDS]; - - float lambda = 0.0f; - - table_l[0] = 0.0f; - table_b[0] = 0.0f; - int index = 1; - for (int level = 1; level < STUDIOLIGHT_SH_BANDS; level++) { - table_l[level] = float(square_i(level) * square_i(level + 1)); - - float b = 0.0f; - for (int m = -1; m <= level; m++) { - b += square_f(sh[index++]); - } - table_b[level] = b; - } - - float squared_lamplacian = 0.0f; - for (int level = 1; level < STUDIOLIGHT_SH_BANDS; level++) { - squared_lamplacian += table_l[level] * table_b[level]; - } - - const float target_squared_laplacian = max_laplacian * max_laplacian; - if (squared_lamplacian <= target_squared_laplacian) { - return lambda; - } - - const int no_iterations = 10000000; - for (int i = 0; i < no_iterations; i++) { - float f = 0.0f; - float fd = 0.0f; - - for (int level = 1; level < STUDIOLIGHT_SH_BANDS; level++) { - f += table_l[level] * table_b[level] / square_f(1.0f + lambda * table_l[level]); - fd += (2.0f * square_f(table_l[level]) * table_b[level]) / - cube_f(1.0f + lambda * table_l[level]); - } - - f = target_squared_laplacian - f; - - float delta = -f / fd; - lambda += delta; - - if (fabsf(delta) < 1e-6f) { - break; - } - } - - return lambda; -} - -static void studiolight_spherical_harmonics_apply_windowing(float (*sh)[3], float max_laplacian) -{ - if (max_laplacian <= 0.0f) { - return; - } - - float sh_r[STUDIOLIGHT_SH_COEFS_LEN]; - float sh_g[STUDIOLIGHT_SH_COEFS_LEN]; - float sh_b[STUDIOLIGHT_SH_COEFS_LEN]; - for (int i = 0; i < STUDIOLIGHT_SH_COEFS_LEN; i++) { - sh_r[i] = sh[i][0]; - sh_g[i] = sh[i][1]; - sh_b[i] = sh[i][2]; - } - float lambda_r = studiolight_spherical_harmonics_lambda_get(sh_r, max_laplacian); - float lambda_g = studiolight_spherical_harmonics_lambda_get(sh_g, max_laplacian); - float lambda_b = studiolight_spherical_harmonics_lambda_get(sh_b, max_laplacian); - - /* Apply windowing lambda */ - int index = 0; - for (int level = 0; level < STUDIOLIGHT_SH_BANDS; level++) { - float s[3]; - const int level_sq = square_i(level); - const int level_1_sq = square_i(level + 1.0f); - s[0] = 1.0f / (1.0f + lambda_r * level_sq * level_1_sq); - s[1] = 1.0f / (1.0f + lambda_g * level_sq * level_1_sq); - s[2] = 1.0f / (1.0f + lambda_b * level_sq * level_1_sq); - - for (int m = -1; m <= level; m++) { - mul_v3_v3(sh[index++], s); - } - } -} - -static float studiolight_spherical_harmonics_geomerics_eval( - const float normal[3], float sh0, float sh1, float sh2, float sh3) -{ - /* Use Geomerics non-linear SH. */ - /* http://www.geomerics.com/wp-content/uploads/2015/08/CEDEC_Geomerics_ReconstructingDiffuseLighting1.pdf - */ - float R0 = sh0 * M_1_PI; - - float R1[3] = {-sh3, sh2, -sh1}; - mul_v3_fl(R1, 0.5f * M_1_PI * 1.5f); /* 1.5f is to improve the contrast a bit. */ - float lenR1 = len_v3(R1); - mul_v3_fl(R1, 1.0f / lenR1); - float q = 0.5f * (1.0f + dot_v3v3(R1, normal)); - - float p = 1.0f + 2.0f * lenR1 / R0; - float a = (1.0f - lenR1 / R0) / (1.0f + lenR1 / R0); - - return R0 * (a + (1.0f - a) * (p + 1.0f) * powf(q, p)); -} - -BLI_INLINE void studiolight_spherical_harmonics_eval(StudioLight *sl, - float color[3], - const float normal[3]) -{ -#if STUDIOLIGHT_SH_BANDS == 2 - float(*sh)[3] = (float(*)[3])sl->spherical_harmonics_coefs; - for (int i = 0; i < 3; i++) { - color[i] = studiolight_spherical_harmonics_geomerics_eval( - normal, sh[0][i], sh[1][i], sh[2][i], sh[3][i]); - } -#else - /* L0 */ - mul_v3_v3fl(color, sl->spherical_harmonics_coefs[0], 0.282095f); -# if STUDIOLIGHT_SH_BANDS > 1 /* L1 */ - const float nx = normal[0]; - const float ny = normal[1]; - const float nz = normal[2]; - madd_v3_v3fl(color, sl->spherical_harmonics_coefs[1], -0.488603f * nz); - madd_v3_v3fl(color, sl->spherical_harmonics_coefs[2], 0.488603f * ny); - madd_v3_v3fl(color, sl->spherical_harmonics_coefs[3], -0.488603f * nx); -# endif -# if STUDIOLIGHT_SH_BANDS > 2 /* L2 */ - const float nx2 = SQUARE(nx); - const float ny2 = SQUARE(ny); - const float nz2 = SQUARE(nz); - madd_v3_v3fl(color, sl->spherical_harmonics_coefs[4], 1.092548f * nx * nz); - madd_v3_v3fl(color, sl->spherical_harmonics_coefs[5], -1.092548f * nz * ny); - madd_v3_v3fl(color, sl->spherical_harmonics_coefs[6], 0.315392f * (3.0f * ny2 - 1.0f)); - madd_v3_v3fl(color, sl->spherical_harmonics_coefs[7], -1.092548 * nx * ny); - madd_v3_v3fl(color, sl->spherical_harmonics_coefs[8], 0.546274 * (nx2 - nz2)); -# endif -/* L3 coefs are 0 */ -# if STUDIOLIGHT_SH_BANDS > 4 /* L4 */ - const float nx4 = SQUARE(nx2); - const float ny4 = SQUARE(ny2); - const float nz4 = SQUARE(nz2); - madd_v3_v3fl( - color, sl->spherical_harmonics_coefs[9], 2.5033429417967046f * nx * nz * (nx2 - nz2)); - madd_v3_v3fl(color, - sl->spherical_harmonics_coefs[10], - -1.7701307697799304f * nz * ny * (3.0f * nx2 - nz2)); - madd_v3_v3fl(color, - sl->spherical_harmonics_coefs[11], - 0.9461746957575601f * nz * nx * (-1.0f + 7.0f * ny2)); - madd_v3_v3fl(color, - sl->spherical_harmonics_coefs[12], - -0.6690465435572892f * nz * ny * (-3.0f + 7.0f * ny2)); - madd_v3_v3fl(color, - sl->spherical_harmonics_coefs[13], - (105.0f * ny4 - 90.0f * ny2 + 9.0f) / 28.359261614f); - madd_v3_v3fl(color, - sl->spherical_harmonics_coefs[14], - -0.6690465435572892f * nx * ny * (-3.0f + 7.0f * ny2)); - madd_v3_v3fl(color, - sl->spherical_harmonics_coefs[15], - 0.9461746957575601f * (nx2 - nz2) * (-1.0f + 7.0f * ny2)); - madd_v3_v3fl(color, - sl->spherical_harmonics_coefs[16], - -1.7701307697799304f * nx * ny * (nx2 - 3.0f * nz2)); - madd_v3_v3fl(color, - sl->spherical_harmonics_coefs[17], - 0.6258357354491761f * (nx4 - 6.0f * nz2 * nx2 + nz4)); -# endif -#endif -} - -/* This modify the radiance into irradiance. */ -static void studiolight_spherical_harmonics_apply_band_factors(StudioLight *sl, float (*sh)[3]) -{ - static const float sl_sh_band_factors[5] = { - 1.0f, - 2.0f / 3.0f, - 1.0f / 4.0f, - 0.0f, - -1.0f / 24.0f, - }; - - int index = 0, dst_idx = 0; - for (int band = 0; band < STUDIOLIGHT_SH_BANDS; band++) { - const int last_band = square_i(band + 1) - square_i(band); - for (int m = 0; m < last_band; m++) { - /* Skip L3 */ - if (band != 3) { - mul_v3_v3fl(sl->spherical_harmonics_coefs[dst_idx++], sh[index], sl_sh_band_factors[band]); - } - index++; - } - } -} - -static void studiolight_calculate_diffuse_light(StudioLight *sl) -{ - /* init light to black */ - if (sl->flag & STUDIOLIGHT_EXTERNAL_FILE) { - BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_RADIANCE_BUFFERS_CALCULATED); - - float sh_coefs[STUDIOLIGHT_SH_COEFS_LEN][3]; - studiolight_spherical_harmonics_calculate_coefficients(sl, sh_coefs); - studiolight_spherical_harmonics_apply_windowing(sh_coefs, STUDIOLIGHT_SH_WINDOWING); - studiolight_spherical_harmonics_apply_band_factors(sl, sh_coefs); - - if (sl->flag & STUDIOLIGHT_USER_DEFINED) { - FILE *fp = BLI_fopen(sl->path_sh_cache, "wb"); - if (fp) { - fwrite(sl->spherical_harmonics_coefs, sizeof(sl->spherical_harmonics_coefs), 1, fp); - fclose(fp); - } - } - } - sl->flag |= STUDIOLIGHT_SPHERICAL_HARMONICS_COEFFICIENTS_CALCULATED; -} - -BLI_INLINE void studiolight_evaluate_specular_radiance_buffer(ImBuf *radiance_buffer, - const float normal[3], - float color[3], - int xoffset, - int yoffset, - int zoffset, - float zsign) -{ - if (radiance_buffer == nullptr) { - return; - } - - float accum[3] = {0.0f, 0.0f, 0.0f}; - float accum_weight = 0.00001f; - ITER_PIXELS (float, - radiance_buffer->float_buffer.data, - 4, - STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE, - STUDIOLIGHT_RADIANCE_CUBEMAP_SIZE) - { - float direction[3]; - direction[zoffset] = zsign * 0.5f; - direction[xoffset] = x - 0.5f; - direction[yoffset] = y - 0.5f; - normalize_v3(direction); - float weight = dot_v3v3(direction, normal) > 0.95f ? 1.0f : 0.0f; - // float solid_angle = texel_solid_angle(x, y, texel_size[0] * 0.5f); - madd_v3_v3fl(accum, pixel, weight); - accum_weight += weight; - } - ITER_PIXELS_END; - - madd_v3_v3fl(color, accum, 1.0f / accum_weight); -} - static float brdf_approx(float spec_color, float roughness, float NV) { /* Very rough own approx. We don't need it to be correct, just fast. @@ -1108,80 +585,6 @@ static void studiolight_lights_eval(StudioLight *sl, float color[3], const float add_v3_v3v3(color, diff_light, spec_light); } -static bool studiolight_load_irradiance_equirect_image(StudioLight *sl) -{ -#ifdef STUDIOLIGHT_LOAD_CACHED_FILES - if (sl->flag & STUDIOLIGHT_EXTERNAL_FILE) { - ImBuf *ibuf = nullptr; - ibuf = IMB_loadiffname(sl->path_irr_cache, 0, nullptr); - if (ibuf) { - IMB_float_from_rect(ibuf); - sl->equirect_irradiance_buffer = ibuf; - sl->flag |= STUDIOLIGHT_EQUIRECT_IRRADIANCE_IMAGE_CALCULATED; - return true; - } - } -#else - UNUSED_VARS(sl); -#endif - return false; -} - -static bool studiolight_load_spherical_harmonics_coefficients(StudioLight *sl) -{ -#ifdef STUDIOLIGHT_LOAD_CACHED_FILES - if (sl->flag & STUDIOLIGHT_EXTERNAL_FILE) { - FILE *fp = BLI_fopen(sl->path_sh_cache, "rb"); - if (fp) { - if (fread((void *)(sl->spherical_harmonics_coefs), - sizeof(sl->spherical_harmonics_coefs), - 1, - fp)) { - sl->flag |= STUDIOLIGHT_SPHERICAL_HARMONICS_COEFFICIENTS_CALCULATED; - fclose(fp); - return true; - } - fclose(fp); - } - } -#else - UNUSED_VARS(sl); -#endif - return false; -} - -static void studiolight_calculate_irradiance_equirect_image(StudioLight *sl) -{ - if (sl->flag & STUDIOLIGHT_EXTERNAL_FILE) { - BKE_studiolight_ensure_flag(sl, STUDIOLIGHT_SPHERICAL_HARMONICS_COEFFICIENTS_CALCULATED); - - float *colbuf = static_cast(MEM_mallocN(STUDIOLIGHT_IRRADIANCE_EQUIRECT_WIDTH * - STUDIOLIGHT_IRRADIANCE_EQUIRECT_HEIGHT * - sizeof(float[4]), - __func__)); - - ITER_PIXELS (float, - colbuf, - 4, - STUDIOLIGHT_IRRADIANCE_EQUIRECT_WIDTH, - STUDIOLIGHT_IRRADIANCE_EQUIRECT_HEIGHT) - { - float dir[3]; - equirect_to_direction(dir, x, y); - studiolight_spherical_harmonics_eval(sl, pixel, dir); - pixel[3] = 1.0f; - } - ITER_PIXELS_END; - - sl->equirect_irradiance_buffer = IMB_allocFromBufferOwn(nullptr, - colbuf, - STUDIOLIGHT_IRRADIANCE_EQUIRECT_WIDTH, - STUDIOLIGHT_IRRADIANCE_EQUIRECT_HEIGHT, - 4); - } - sl->flag |= STUDIOLIGHT_EQUIRECT_IRRADIANCE_IMAGE_CALCULATED; -} - static StudioLight *studiolight_add_file(const char *filepath, int flag) { char filename[FILE_MAXFILE]; @@ -1197,10 +600,6 @@ static StudioLight *studiolight_add_file(const char *filepath, int flag) if ((flag & STUDIOLIGHT_TYPE_STUDIO) != 0) { studiolight_load_solid_light(sl); } - else { - sl->path_irr_cache = BLI_string_joinN(filepath, ".irr"); - sl->path_sh_cache = BLI_string_joinN(filepath, ".sh2"); - } BLI_addtail(&studiolights, sl); return sl; } @@ -1435,9 +834,8 @@ void BKE_studiolight_default(SolidLight lights[4], float light_ambient[3]) void BKE_studiolight_init() { /* Add default studio light */ - StudioLight *sl = studiolight_create( - STUDIOLIGHT_INTERNAL | STUDIOLIGHT_SPHERICAL_HARMONICS_COEFFICIENTS_CALCULATED | - STUDIOLIGHT_TYPE_STUDIO | STUDIOLIGHT_SPECULAR_HIGHLIGHT_PASS); + StudioLight *sl = studiolight_create(STUDIOLIGHT_INTERNAL | STUDIOLIGHT_TYPE_STUDIO | + STUDIOLIGHT_SPECULAR_HIGHLIGHT_PASS); STRNCPY(sl->name, "Default"); BLI_addtail(&studiolights, sl); @@ -1558,6 +956,7 @@ void BKE_studiolight_preview(uint *icon_buffer, StudioLight *sl, int icon_id_typ break; } } + studiolight_free_temp_resources(sl); } void BKE_studiolight_ensure_flag(StudioLight *sl, int flag) @@ -1569,25 +968,9 @@ void BKE_studiolight_ensure_flag(StudioLight *sl, int flag) if (flag & STUDIOLIGHT_EXTERNAL_IMAGE_LOADED) { studiolight_load_equirect_image(sl); } - if (flag & STUDIOLIGHT_RADIANCE_BUFFERS_CALCULATED) { - studiolight_calculate_radiance_cubemap_buffers(sl); - } - if (flag & STUDIOLIGHT_SPHERICAL_HARMONICS_COEFFICIENTS_CALCULATED) { - if (!studiolight_load_spherical_harmonics_coefficients(sl)) { - studiolight_calculate_diffuse_light(sl); - } - } if (flag & STUDIOLIGHT_EQUIRECT_RADIANCE_GPUTEXTURE) { studiolight_create_equirect_radiance_gputexture(sl); } - if (flag & STUDIOLIGHT_EQUIRECT_IRRADIANCE_GPUTEXTURE) { - studiolight_create_equirect_irradiance_gputexture(sl); - } - if (flag & STUDIOLIGHT_EQUIRECT_IRRADIANCE_IMAGE_CALCULATED) { - if (!studiolight_load_irradiance_equirect_image(sl)) { - studiolight_calculate_irradiance_equirect_image(sl); - } - } if (flag & STUDIOLIGHT_MATCAP_DIFFUSE_GPUTEXTURE) { studiolight_create_matcap_diffuse_gputexture(sl); } diff --git a/source/blender/blenkernel/intern/subdiv.cc b/source/blender/blenkernel/intern/subdiv.cc index 267b6506f94..34f8ea8a361 100644 --- a/source/blender/blenkernel/intern/subdiv.cc +++ b/source/blender/blenkernel/intern/subdiv.cc @@ -21,10 +21,10 @@ #include "subdiv_converter.hh" -#include "opensubdiv_capi.h" -#include "opensubdiv_converter_capi.h" -#include "opensubdiv_evaluator_capi.h" -#include "opensubdiv_topology_refiner_capi.h" +#include "opensubdiv_capi.hh" +#include "opensubdiv_converter_capi.hh" +#include "opensubdiv_evaluator_capi.hh" +#include "opensubdiv_topology_refiner_capi.hh" /* -------------------------------------------------------------------- * Module. diff --git a/source/blender/blenkernel/intern/subdiv_ccg.cc b/source/blender/blenkernel/intern/subdiv_ccg.cc index 687c2c2e4d3..295c1a9ddb0 100644 --- a/source/blender/blenkernel/intern/subdiv_ccg.cc +++ b/source/blender/blenkernel/intern/subdiv_ccg.cc @@ -14,9 +14,11 @@ #include "MEM_guardedalloc.h" #include "BLI_enumerable_thread_specific.hh" +#include "BLI_index_mask.hh" #include "BLI_math_bits.h" #include "BLI_math_geom.h" #include "BLI_math_vector.h" +#include "BLI_set.hh" #include "BLI_task.hh" #include "BLI_vector_set.hh" @@ -27,7 +29,7 @@ #include "BKE_subdiv.hh" #include "BKE_subdiv_eval.hh" -#include "opensubdiv_topology_refiner_capi.h" +#include "opensubdiv_topology_refiner_capi.hh" using blender::Array; using blender::float3; diff --git a/source/blender/blenkernel/intern/subdiv_converter.cc b/source/blender/blenkernel/intern/subdiv_converter.cc index ded7e890404..202c1c0153a 100644 --- a/source/blender/blenkernel/intern/subdiv_converter.cc +++ b/source/blender/blenkernel/intern/subdiv_converter.cc @@ -10,7 +10,7 @@ #include "BLI_utildefines.h" -#include "opensubdiv_converter_capi.h" +#include "opensubdiv_converter_capi.hh" void BKE_subdiv_converter_free(OpenSubdiv_Converter *converter) { diff --git a/source/blender/blenkernel/intern/subdiv_converter.hh b/source/blender/blenkernel/intern/subdiv_converter.hh index 761cd3924ac..b3656b58484 100644 --- a/source/blender/blenkernel/intern/subdiv_converter.hh +++ b/source/blender/blenkernel/intern/subdiv_converter.hh @@ -12,7 +12,7 @@ /* NOTE: Was initially used to get proper enumerator types, but this makes * it tricky to compile without OpenSubdiv. */ -/* #include "opensubdiv_converter_capi.h" */ +/* #include "opensubdiv_converter_capi.hh" */ struct Mesh; struct OpenSubdiv_Converter; diff --git a/source/blender/blenkernel/intern/subdiv_converter_mesh.cc b/source/blender/blenkernel/intern/subdiv_converter_mesh.cc index f22cea02f19..f5d81c45d3f 100644 --- a/source/blender/blenkernel/intern/subdiv_converter_mesh.cc +++ b/source/blender/blenkernel/intern/subdiv_converter_mesh.cc @@ -22,8 +22,8 @@ #include "MEM_guardedalloc.h" -#include "opensubdiv_capi.h" -#include "opensubdiv_converter_capi.h" +#include "opensubdiv_capi.hh" +#include "opensubdiv_converter_capi.hh" #include "bmesh_class.hh" diff --git a/source/blender/blenkernel/intern/subdiv_eval.cc b/source/blender/blenkernel/intern/subdiv_eval.cc index 9b6aa30962e..b491c09c4a9 100644 --- a/source/blender/blenkernel/intern/subdiv_eval.cc +++ b/source/blender/blenkernel/intern/subdiv_eval.cc @@ -22,8 +22,8 @@ #include "MEM_guardedalloc.h" -#include "opensubdiv_evaluator_capi.h" -#include "opensubdiv_topology_refiner_capi.h" +#include "opensubdiv_evaluator_capi.hh" +#include "opensubdiv_topology_refiner_capi.hh" /* -------------------------------------------------------------------- * Helper functions. diff --git a/source/blender/blenkernel/intern/subdiv_modifier.cc b/source/blender/blenkernel/intern/subdiv_modifier.cc index 4efa4ec7b5a..b670e39e28a 100644 --- a/source/blender/blenkernel/intern/subdiv_modifier.cc +++ b/source/blender/blenkernel/intern/subdiv_modifier.cc @@ -20,7 +20,7 @@ #include "GPU_capabilities.h" #include "GPU_context.h" -#include "opensubdiv_capi.h" +#include "opensubdiv_capi.hh" SubdivSettings BKE_subsurf_modifier_settings_init(const SubsurfModifierData *smd, const bool use_render_params) diff --git a/source/blender/blenkernel/intern/subdiv_topology.cc b/source/blender/blenkernel/intern/subdiv_topology.cc index f69df1a3d8b..c8dc6e9315e 100644 --- a/source/blender/blenkernel/intern/subdiv_topology.cc +++ b/source/blender/blenkernel/intern/subdiv_topology.cc @@ -10,7 +10,7 @@ #include "BKE_subdiv.hh" -#include "opensubdiv_topology_refiner_capi.h" +#include "opensubdiv_topology_refiner_capi.hh" int BKE_subdiv_topology_num_fvar_layers_get(const Subdiv *subdiv) { diff --git a/source/blender/blenkernel/intern/text.cc b/source/blender/blenkernel/intern/text.cc index f4acd2d616c..972441d2d55 100644 --- a/source/blender/blenkernel/intern/text.cc +++ b/source/blender/blenkernel/intern/text.cc @@ -1283,7 +1283,6 @@ void txt_sel_line(Text *text) void txt_sel_set(Text *text, int startl, int startc, int endl, int endc) { TextLine *froml, *tol; - int fromllen, tollen; /* Support negative indices. */ if (startl < 0 || endl < 0) { @@ -1312,20 +1311,16 @@ void txt_sel_set(Text *text, int startl, int startc, int endl, int endc) } } - fromllen = BLI_strlen_utf8(froml->line); - tollen = BLI_strlen_utf8(tol->line); - /* Support negative indices. */ if (startc < 0) { - startc = fromllen + startc + 1; + const int fromllen = BLI_strlen_utf8(froml->line); + startc = std::max(0, fromllen + startc + 1); } if (endc < 0) { - endc = tollen + endc + 1; + const int tollen = BLI_strlen_utf8(tol->line); + endc = std::max(0, tollen + endc + 1); } - CLAMP(startc, 0, fromllen); - CLAMP(endc, 0, tollen); - text->curl = froml; text->curc = BLI_str_utf8_offset_from_index(froml->line, froml->len, startc); text->sell = tol; diff --git a/source/blender/blenkernel/intern/volume_to_mesh.cc b/source/blender/blenkernel/intern/volume_to_mesh.cc index a62827efb91..0058f7a09cb 100644 --- a/source/blender/blenkernel/intern/volume_to_mesh.cc +++ b/source/blender/blenkernel/intern/volume_to_mesh.cc @@ -163,8 +163,8 @@ Mesh *volume_to_mesh(const openvdb::GridBase &grid, const float threshold, const float adaptivity) { - const bke::OpenVDBMeshData mesh_data = volume_to_mesh_data( - grid, resolution, threshold, adaptivity); + using namespace blender::bke; + const OpenVDBMeshData mesh_data = volume_to_mesh_data(grid, resolution, threshold, adaptivity); const int tot_loops = 3 * mesh_data.tris.size() + 4 * mesh_data.quads.size(); const int tot_faces = mesh_data.tris.size() + mesh_data.quads.size(); @@ -181,7 +181,7 @@ Mesh *volume_to_mesh(const openvdb::GridBase &grid, mesh->corner_verts_for_write()); BKE_mesh_calc_edges(mesh, false, false); - BKE_mesh_smooth_flag_set(mesh, false); + mesh_smooth_set(*mesh, false); mesh->tag_overlapping_none(); diff --git a/source/blender/blenkernel/intern/writeffmpeg.cc b/source/blender/blenkernel/intern/writeffmpeg.cc index 1937427565d..c028329e85c 100644 --- a/source/blender/blenkernel/intern/writeffmpeg.cc +++ b/source/blender/blenkernel/intern/writeffmpeg.cc @@ -45,6 +45,7 @@ extern "C" { # include # include +# include # include # include # include @@ -117,10 +118,7 @@ static void ffmpeg_filepath_get(FFMpegContext *context, static void delete_picture(AVFrame *f) { if (f) { - if (f->data[0]) { - MEM_freeN(f->data[0]); - } - av_free(f); + av_frame_free(&f); } } @@ -233,24 +231,22 @@ static int write_audio_frame(FFMpegContext *context) /* Allocate a temporary frame */ static AVFrame *alloc_picture(AVPixelFormat pix_fmt, int width, int height) { - AVFrame *f; - uint8_t *buf; - int size; - /* allocate space for the struct */ - f = av_frame_alloc(); - if (!f) { - return nullptr; - } - size = av_image_get_buffer_size(pix_fmt, width, height, 1); - /* allocate the actual picture buffer */ - buf = static_cast(MEM_mallocN(size, "AVFrame buffer")); - if (!buf) { - free(f); + AVFrame *f = av_frame_alloc(); + if (f == nullptr) { return nullptr; } - av_image_fill_arrays(f->data, f->linesize, buf, pix_fmt, width, height, 1); + /* allocate the actual picture buffer */ + int size = av_image_get_buffer_size(pix_fmt, width, height, 1); + AVBufferRef *buf = av_buffer_alloc(size); + if (buf == nullptr) { + av_frame_free(&f); + return nullptr; + } + + av_image_fill_arrays(f->data, f->linesize, buf->data, pix_fmt, width, height, 1); + f->buf[0] = buf; f->format = pix_fmt; f->width = width; f->height = height; @@ -424,6 +420,9 @@ static AVFrame *generate_video_frame(FFMpegContext *context, const uint8_t *pixe /* Convert to the output pixel format, if it's different that Blender's internal one. */ if (context->img_convert_frame != nullptr) { BLI_assert(context->img_convert_ctx != NULL); +# if defined(FFMPEG_SWSCALE_THREADING) + sws_scale_frame(context->img_convert_ctx, context->current_frame, rgb_frame); +# else sws_scale(context->img_convert_ctx, (const uint8_t *const *)rgb_frame->data, rgb_frame->linesize, @@ -431,6 +430,7 @@ static AVFrame *generate_video_frame(FFMpegContext *context, const uint8_t *pixe codec->height, context->current_frame->data, context->current_frame->linesize); +# endif } return context->current_frame; @@ -677,6 +677,47 @@ static const AVCodec *get_av1_encoder( return codec; } +static SwsContext *get_threaded_sws_context(int width, + int height, + AVPixelFormat src_format, + AVPixelFormat dst_format) +{ +# if defined(FFMPEG_SWSCALE_THREADING) + /* sws_getContext does not allow passing flags that ask for multi-threaded + * scaling context, so do it the hard way. */ + SwsContext *c = sws_alloc_context(); + if (c == nullptr) { + return nullptr; + } + av_opt_set_int(c, "srcw", width, 0); + av_opt_set_int(c, "srch", height, 0); + av_opt_set_int(c, "src_format", src_format, 0); + av_opt_set_int(c, "dstw", width, 0); + av_opt_set_int(c, "dsth", height, 0); + av_opt_set_int(c, "dst_format", dst_format, 0); + av_opt_set_int(c, "sws_flags", SWS_BICUBIC, 0); + av_opt_set_int(c, "threads", BLI_system_thread_count(), 0); + + if (sws_init_context(c, nullptr, nullptr) < 0) { + sws_freeContext(c); + return nullptr; + } +# else + SwsContext *c = sws_getContext(width, + height, + src_format, + width, + height, + dst_format, + SWS_BICUBIC, + nullptr, + nullptr, + nullptr); +# endif + + return c; +} + /* prepare a video stream for the output file */ static AVStream *alloc_video_stream(FFMpegContext *context, @@ -914,16 +955,8 @@ static AVStream *alloc_video_stream(FFMpegContext *context, else { /* Output pixel format is different, allocate frame for conversion. */ context->img_convert_frame = alloc_picture(AV_PIX_FMT_RGBA, c->width, c->height); - context->img_convert_ctx = sws_getContext(c->width, - c->height, - AV_PIX_FMT_RGBA, - c->width, - c->height, - c->pix_fmt, - SWS_BICUBIC, - nullptr, - nullptr, - nullptr); + context->img_convert_ctx = get_threaded_sws_context( + c->width, c->height, AV_PIX_FMT_RGBA, c->pix_fmt); } avcodec_parameters_from_context(st->codecpar, c); diff --git a/source/blender/blenlib/BLI_delaunay_2d.h b/source/blender/blenlib/BLI_delaunay_2d.hh similarity index 76% rename from source/blender/blenlib/BLI_delaunay_2d.h rename to source/blender/blenlib/BLI_delaunay_2d.hh index c36aee39916..251b8660764 100644 --- a/source/blender/blenlib/BLI_delaunay_2d.h +++ b/source/blender/blenlib/BLI_delaunay_2d.hh @@ -4,6 +4,12 @@ #pragma once +#include "BLI_array.hh" +#include "BLI_math_mpq.hh" +#include "BLI_math_vector_mpq_types.hh" +#include "BLI_math_vector_types.hh" +#include "BLI_vector.hh" + /** \file * \ingroup bli * @@ -11,10 +17,6 @@ * to the 2D Constrained Delaunay Triangulation library routine. */ -#ifdef __cplusplus -extern "C" { -#endif - /** * Interface for Constrained Delaunay Triangulation (CDT) in 2D. * @@ -48,10 +50,46 @@ extern "C" { * for dynamically maintaining a triangulation. */ +/** What triangles and edges of CDT are desired when getting output? */ +enum CDT_output_type { + /** All triangles, outer boundary is convex hull. */ + CDT_FULL, + /** All triangles fully enclosed by constraint edges or faces. */ + CDT_INSIDE, + /** Like previous, but detect holes and omit those from output. */ + CDT_INSIDE_WITH_HOLES, + /** Only point, edge, and face constraints, and their intersections. */ + CDT_CONSTRAINTS, + /** + * Like CDT_CONSTRAINTS, but keep enough + * edges so that any output faces that came from input faces can be made as valid + * #BMesh faces in Blender: that is, + * no vertex appears more than once and no isolated holes in faces. + */ + CDT_CONSTRAINTS_VALID_BMESH, + /** Like previous, but detect holes and omit those from output. */ + CDT_CONSTRAINTS_VALID_BMESH_WITH_HOLES, +}; + +namespace blender::meshintersect { + +/** #vec2 is a 2d vector with #Arith_t as the type for coordinates. */ +template struct vec2_impl; +template<> struct vec2_impl { + typedef double2 type; +}; + +#ifdef WITH_GMP +template<> struct vec2_impl { + typedef mpq2 type; +}; +#endif + +template using vec2 = typename vec2_impl::type; + /** * Input to Constrained Delaunay Triangulation. - * There are verts_len vertices, whose coordinates - * are given by vert_coords. For the rest of the input, + * Input vertex coordinates are stored in `vert`. For the rest of the input, * vertices are referred to by indices into that array. * Edges and Faces are optional. If provided, they will * appear in the output triangulation ("constraints"). @@ -59,11 +97,7 @@ extern "C" { * implied by the faces will be inferred. * * The edges are given by pairs of vertex indices. - * The faces are given in a triple `(faces, faces_start_table, faces_len_table)` - * to represent a list-of-lists as follows: - * the vertex indices for a counterclockwise traversal of - * face number `i` starts at `faces_start_table[i]` and has `faces_len_table[i]` - * elements. + * The faces are given as groups of vertex indices, in counterclockwise order. * * The edges implied by the faces are automatically added * and need not be put in the edges array, which is intended @@ -103,18 +137,14 @@ extern "C" { * If this is not needed, set need_ids to false and the execution may be much * faster in some circumstances. */ -typedef struct CDT_input { - int verts_len; - int edges_len; - int faces_len; - float (*vert_coords)[2]; - int (*edges)[2]; - int *faces; - int *faces_start_table; - int *faces_len_table; - float epsilon; - bool need_ids; -} CDT_input; +template class CDT_input { + public: + Array> vert; + Array> edge; + Array> face; + Arith_t epsilon{0}; + bool need_ids{true}; +}; /** * A representation of the triangulation for output. @@ -129,110 +159,15 @@ typedef struct CDT_input { * The output faces may be pieces of some input faces, or they * may be new. * - * In the same way that faces lists-of-lists were represented by - * a run-together array and a "start" and "len" extra array, - * similar triples are used to represent the output to input + * Extra outputs are used to represent the output to input * mapping of vertices, edges, and faces. * These are only set if need_ids is true in the input. * - * Those triples are: - * - verts_orig, verts_orig_start_table, verts_orig_len_table - * - edges_orig, edges_orig_start_table, edges_orig_len_table - * - faces_orig, faces_orig_start_table, faces_orig_len_table * - * For edges, the edges_orig triple can also say which original face - * edge is part of a given output edge. See the comment below - * on the C++ interface for how to decode the entries in the edges_orig - * table. + * For edges, the edge_orig triple can also say which original face + * edge is part of a given output edge. See the comment below for how + * to decode the entries in the edge_orig table. */ -typedef struct CDT_result { - int verts_len; - int edges_len; - int faces_len; - int face_edge_offset; - float (*vert_coords)[2]; - int (*edges)[2]; - int *faces; - int *faces_start_table; - int *faces_len_table; - int *verts_orig; - int *verts_orig_start_table; - int *verts_orig_len_table; - int *edges_orig; - int *edges_orig_start_table; - int *edges_orig_len_table; - int *faces_orig; - int *faces_orig_start_table; - int *faces_orig_len_table; -} CDT_result; - -/** What triangles and edges of CDT are desired when getting output? */ -typedef enum CDT_output_type { - /** All triangles, outer boundary is convex hull. */ - CDT_FULL, - /** All triangles fully enclosed by constraint edges or faces. */ - CDT_INSIDE, - /** Like previous, but detect holes and omit those from output. */ - CDT_INSIDE_WITH_HOLES, - /** Only point, edge, and face constraints, and their intersections. */ - CDT_CONSTRAINTS, - /** - * Like CDT_CONSTRAINTS, but keep enough - * edges so that any output faces that came from input faces can be made as valid - * #BMesh faces in Blender: that is, - * no vertex appears more than once and no isolated holes in faces. - */ - CDT_CONSTRAINTS_VALID_BMESH, - /** Like previous, but detect holes and omit those from output. */ - CDT_CONSTRAINTS_VALID_BMESH_WITH_HOLES, -} CDT_output_type; - -/** - * API interface to CDT. - * This returns a pointer to an allocated CDT_result. - * When the caller is finished with it, the caller - * should use #BLI_delaunay_2d_cdt_free() to free it. - */ -CDT_result *BLI_delaunay_2d_cdt_calc(const CDT_input *input, const CDT_output_type output_type); - -void BLI_delaunay_2d_cdt_free(CDT_result *result); - -#ifdef __cplusplus -} - -/* C++ Interface. */ - -# include "BLI_array.hh" -# include "BLI_math_mpq.hh" -# include "BLI_math_vector_mpq_types.hh" -# include "BLI_math_vector_types.hh" -# include "BLI_vector.hh" - -namespace blender::meshintersect { - -/** #vec2 is a 2d vector with #Arith_t as the type for coordinates. */ -template struct vec2_impl; -template<> struct vec2_impl { - typedef double2 type; -}; - -# ifdef WITH_GMP -template<> struct vec2_impl { - typedef mpq2 type; -}; -# endif - -template using vec2 = typename vec2_impl::type; - -template class CDT_input { - public: - Array> vert; - Array> edge; - Array> face; - Arith_t epsilon{0}; - bool need_ids{true}; -}; - template class CDT_result { public: Array> vert; @@ -259,11 +194,9 @@ template class CDT_result { CDT_result delaunay_2d_calc(const CDT_input &input, CDT_output_type output_type); -# ifdef WITH_GMP +#ifdef WITH_GMP CDT_result delaunay_2d_calc(const CDT_input &input, CDT_output_type output_type); -# endif +#endif } /* namespace blender::meshintersect */ - -#endif /* __cplusplus */ diff --git a/source/blender/blenlib/BLI_math_interp.h b/source/blender/blenlib/BLI_math_interp.h index d63f2debe90..5cb999ccc40 100644 --- a/source/blender/blenlib/BLI_math_interp.h +++ b/source/blender/blenlib/BLI_math_interp.h @@ -15,24 +15,14 @@ extern "C" { void BLI_bicubic_interpolation_fl( const float *buffer, float *output, int width, int height, int components, float u, float v); -void BLI_bicubic_interpolation_char(const unsigned char *buffer, - unsigned char *output, - int width, - int height, - int components, - float u, - float v); +void BLI_bicubic_interpolation_char( + const unsigned char *buffer, unsigned char *output, int width, int height, float u, float v); void BLI_bilinear_interpolation_fl( const float *buffer, float *output, int width, int height, int components, float u, float v); -void BLI_bilinear_interpolation_char(const unsigned char *buffer, - unsigned char *output, - int width, - int height, - int components, - float u, - float v); +void BLI_bilinear_interpolation_char( + const unsigned char *buffer, unsigned char *output, int width, int height, float u, float v); void BLI_bilinear_interpolation_wrap_fl(const float *buffer, float *output, @@ -44,16 +34,6 @@ void BLI_bilinear_interpolation_wrap_fl(const float *buffer, bool wrap_x, bool wrap_y); -void BLI_bilinear_interpolation_wrap_char(const unsigned char *buffer, - unsigned char *output, - int width, - int height, - int components, - float u, - float v, - bool wrap_x, - bool wrap_y); - #define EWA_MAXIDX 255 extern const float EWA_WTS[EWA_MAXIDX + 1]; diff --git a/source/blender/blenlib/BLI_math_matrix.hh b/source/blender/blenlib/BLI_math_matrix.hh index 28af274c3b1..36219fa6664 100644 --- a/source/blender/blenlib/BLI_math_matrix.hh +++ b/source/blender/blenlib/BLI_math_matrix.hh @@ -1401,7 +1401,7 @@ template [[nodiscard]] MatT from_up_axis(const using T = typename MatT::base_type; using Vec3T = VecBase; /* Duff, Tom, et al. "Building an orthonormal basis, revisited." JCGT 6.1 (2017). */ - T sign = math::sign(up.z); + T sign = up.z >= T(0) ? T(1) : T(-1); T a = T(-1) / (sign + up.z); T b = up.x * up.y * a; diff --git a/source/blender/blenlib/BLI_offset_indices.hh b/source/blender/blenlib/BLI_offset_indices.hh index 35281a09aa9..4cd4c98de49 100644 --- a/source/blender/blenlib/BLI_offset_indices.hh +++ b/source/blender/blenlib/BLI_offset_indices.hh @@ -6,7 +6,13 @@ #include -#include "BLI_index_mask.hh" +namespace blender { +namespace index_mask { +class IndexMask; +} +using index_mask::IndexMask; +} // namespace blender + #include "BLI_index_range.hh" #include "BLI_span.hh" @@ -152,7 +158,14 @@ void gather_group_sizes(OffsetIndices offsets, const IndexMask &mask, Mutab /** Build new offsets that contains only the groups chosen by \a selection. */ OffsetIndices gather_selected_offsets(OffsetIndices src_offsets, const IndexMask &selection, + int start_offset, MutableSpan dst_offsets); +inline OffsetIndices gather_selected_offsets(OffsetIndices src_offsets, + const IndexMask &selection, + MutableSpan dst_offsets) +{ + return gather_selected_offsets(src_offsets, selection, 0, dst_offsets); +} /** * Create a map from indexed elements to the source indices, in other words from the larger array * to the smaller array. diff --git a/source/blender/blenlib/BLI_serialize.hh b/source/blender/blenlib/BLI_serialize.hh index 1ade17877d9..19376e5765b 100644 --- a/source/blender/blenlib/BLI_serialize.hh +++ b/source/blender/blenlib/BLI_serialize.hh @@ -80,6 +80,7 @@ enum class eValueType { Boolean, Double, Dictionary, + Enum, }; class Value; @@ -89,6 +90,7 @@ template class PrimitiveValue; using IntValue = PrimitiveValue; using DoubleValue = PrimitiveValue; using BooleanValue = PrimitiveValue; +using EnumValue = PrimitiveValue; class ArrayValue; /** @@ -146,6 +148,12 @@ class Value { */ const BooleanValue *as_boolean_value() const; + /** + * Casts to a EnumValue. + * Will return nullptr when it is a different type. + */ + const EnumValue *as_enum_value() const; + /** * Casts to an ArrayValue. * Will return nullptr when it is a different type. diff --git a/source/blender/blenlib/BLI_string_utf8.h b/source/blender/blenlib/BLI_string_utf8.h index c7676c4d0b0..a899aabf2dd 100644 --- a/source/blender/blenlib/BLI_string_utf8.h +++ b/source/blender/blenlib/BLI_string_utf8.h @@ -215,6 +215,12 @@ size_t BLI_str_partition_ex_utf8(const char *str, int BLI_str_utf8_offset_to_index(const char *str, size_t str_len, int offset_target) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1); +/** + * Return the byte offset in `str` from `index_target`. + * \param index_target: The unicode index, where multi-byte characters are counted once. + * There is no need to clamp this value, the index is logically clamped to `BLI_strlen_utf8(str)` + * or below. + */ int BLI_str_utf8_offset_from_index(const char *str, size_t str_len, int index_target) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1); diff --git a/source/blender/blenlib/BLI_vector.hh b/source/blender/blenlib/BLI_vector.hh index 79e4b111dca..cd9c9fb5643 100644 --- a/source/blender/blenlib/BLI_vector.hh +++ b/source/blender/blenlib/BLI_vector.hh @@ -816,6 +816,7 @@ class Vector { { const T *prev_end = this->end(); end_ = std::remove_if(this->begin(), this->end(), predicate); + destruct_n(end_, prev_end - end_); UPDATE_VECTOR_SIZE(this); return int64_t(prev_end - end_); } diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt index 5c1eed4fec4..3de5abb69e9 100644 --- a/source/blender/blenlib/CMakeLists.txt +++ b/source/blender/blenlib/CMakeLists.txt @@ -210,7 +210,7 @@ set(SRC BLI_cpp_type_make.hh BLI_cpp_types.hh BLI_cpp_types_make.hh - BLI_delaunay_2d.h + BLI_delaunay_2d.hh BLI_devirtualize_parameters.hh BLI_dial_2d.h BLI_disjoint_set.hh @@ -524,6 +524,7 @@ if(WITH_GTESTS) tests/BLI_math_bits_test.cc tests/BLI_math_color_test.cc tests/BLI_math_geom_test.cc + tests/BLI_math_interp_test.cc tests/BLI_math_matrix_test.cc tests/BLI_math_matrix_types_test.cc tests/BLI_math_rotation_test.cc diff --git a/source/blender/blenlib/intern/delaunay_2d.cc b/source/blender/blenlib/intern/delaunay_2d.cc index af859a25c9d..1e67ac23a9b 100644 --- a/source/blender/blenlib/intern/delaunay_2d.cc +++ b/source/blender/blenlib/intern/delaunay_2d.cc @@ -21,7 +21,7 @@ #include "BLI_task.hh" #include "BLI_vector.hh" -#include "BLI_delaunay_2d.h" +#include "BLI_delaunay_2d.hh" namespace blender::meshintersect { @@ -496,7 +496,7 @@ template void cdt_draw(const std::string &label, const CDTArrangemen constexpr bool draw_edge_labels = false; constexpr bool draw_face_labels = false; - if (cdt.verts.size() == 0) { + if (cdt.verts.is_empty()) { return; } vec2 vmin(DBL_MAX, DBL_MAX); @@ -2208,12 +2208,13 @@ int add_face_constraints(CDT_state *cdt_state, CDT_output_type output_type) { int nv = input.vert.size(); - int nf = input.face.size(); + const Span> input_faces = input.face; SymEdge *face_symedge0 = nullptr; CDTArrangement *cdt = &cdt_state->cdt; + int maxflen = 0; - for (int f = 0; f < nf; f++) { - maxflen = max_ii(maxflen, input.face[f].size()); + for (const int f : input_faces.index_range()) { + maxflen = max_ii(maxflen, input_faces[f].size()); } /* For convenience in debugging, make face_edge_offset be a power of 10. */ cdt_state->face_edge_offset = power_of_10_greater_equal_to( @@ -2222,19 +2223,19 @@ int add_face_constraints(CDT_state *cdt_state, * If we really have that many faces and that large a max face length that when multiplied * together the are >= INT_MAX, then the Delaunay calculation will take unreasonably long anyway. */ - BLI_assert(INT_MAX / cdt_state->face_edge_offset > nf); + BLI_assert(INT_MAX / cdt_state->face_edge_offset > input_faces.size()); int faces_added = 0; - for (int f = 0; f < nf; f++) { - int flen = input.face[f].size(); - if (flen <= 2) { + for (const int f : input_faces.index_range()) { + const Span face = input_faces[f]; + if (face.size() <= 2) { /* Ignore faces with fewer than 3 vertices. */ continue; } int fedge_start = (f + 1) * cdt_state->face_edge_offset; - for (int i = 0; i < flen; i++) { + for (const int i : face.index_range()) { int face_edge_id = fedge_start + i; - int iv1 = input.face[f][i]; - int iv2 = input.face[f][(i + 1) % flen]; + int iv1 = face[i]; + int iv2 = face[(i + 1) % face.size()]; if (iv1 < 0 || iv1 >= nv || iv2 < 0 || iv2 >= nv) { /* Ignore face edges with invalid vertices. */ continue; @@ -2260,7 +2261,7 @@ int add_face_constraints(CDT_state *cdt_state, } BLI_linklist_free(edge_list, nullptr); } - int fedge_end = fedge_start + flen - 1; + int fedge_end = fedge_start + face.size() - 1; if (face_symedge0 != nullptr) { /* We need to propagate face ids to all faces that represent #f, if #need_ids. * Even if `need_ids == false`, we need to propagate at least the fact that @@ -2810,168 +2811,3 @@ blender::meshintersect::CDT_result delaunay_2d_calc(const CDT_input> - * and a C version that linearizes all the elements and uses a "start" - * and "len" array to say where the individual vectors start and how - * long they are. - */ -extern "C" ::CDT_result *BLI_delaunay_2d_cdt_calc(const ::CDT_input *input, - const CDT_output_type output_type) -{ - blender::meshintersect::CDT_input in; - in.vert = blender::Array>(input->verts_len); - in.edge = blender::Array>(input->edges_len); - in.face = blender::Array>(input->faces_len); - for (int v = 0; v < input->verts_len; ++v) { - double x = double(input->vert_coords[v][0]); - double y = double(input->vert_coords[v][1]); - in.vert[v] = blender::meshintersect::vec2(x, y); - } - for (int e = 0; e < input->edges_len; ++e) { - in.edge[e] = std::pair(input->edges[e][0], input->edges[e][1]); - } - for (int f = 0; f < input->faces_len; ++f) { - in.face[f] = blender::Vector(input->faces_len_table[f]); - int fstart = input->faces_start_table[f]; - for (int j = 0; j < input->faces_len_table[f]; ++j) { - in.face[f][j] = input->faces[fstart + j]; - } - } - in.epsilon = double(input->epsilon); - in.need_ids = input->need_ids; - - blender::meshintersect::CDT_result res = blender::meshintersect::delaunay_2d_calc( - in, output_type); - - ::CDT_result *output = static_cast<::CDT_result *>(MEM_mallocN(sizeof(*output), __func__)); - int nv = output->verts_len = res.vert.size(); - int ne = output->edges_len = res.edge.size(); - int nf = output->faces_len = res.face.size(); - int tot_v_orig = 0; - int tot_e_orig = 0; - int tot_f_orig = 0; - int tot_f_lens = 0; - if (input->need_ids) { - for (int v = 0; v < nv; ++v) { - tot_v_orig += res.vert_orig[v].size(); - } - for (int e = 0; e < ne; ++e) { - tot_e_orig += res.edge_orig[e].size(); - } - } - for (int f = 0; f < nf; ++f) { - if (input->need_ids) { - tot_f_orig += res.face_orig[f].size(); - } - tot_f_lens += res.face[f].size(); - } - - output->vert_coords = static_castvert_coords)>( - MEM_malloc_arrayN(nv, sizeof(output->vert_coords[0]), __func__)); - output->edges = static_castedges)>( - MEM_malloc_arrayN(ne, sizeof(output->edges[0]), __func__)); - output->faces = static_cast(MEM_malloc_arrayN(tot_f_lens, sizeof(int), __func__)); - output->faces_start_table = static_cast(MEM_malloc_arrayN(nf, sizeof(int), __func__)); - output->faces_len_table = static_cast(MEM_malloc_arrayN(nf, sizeof(int), __func__)); - if (input->need_ids) { - output->verts_orig = static_cast(MEM_malloc_arrayN(tot_v_orig, sizeof(int), __func__)); - output->verts_orig_start_table = static_cast( - MEM_malloc_arrayN(nv, sizeof(int), __func__)); - output->verts_orig_len_table = static_cast( - MEM_malloc_arrayN(nv, sizeof(int), __func__)); - output->edges_orig = static_cast(MEM_malloc_arrayN(tot_e_orig, sizeof(int), __func__)); - output->edges_orig_start_table = static_cast( - MEM_malloc_arrayN(ne, sizeof(int), __func__)); - output->edges_orig_len_table = static_cast( - MEM_malloc_arrayN(ne, sizeof(int), __func__)); - output->faces_orig = static_cast(MEM_malloc_arrayN(tot_f_orig, sizeof(int), __func__)); - output->faces_orig_start_table = static_cast( - MEM_malloc_arrayN(nf, sizeof(int), __func__)); - output->faces_orig_len_table = static_cast( - MEM_malloc_arrayN(nf, sizeof(int), __func__)); - } - else { - output->verts_orig = nullptr; - output->verts_orig_start_table = nullptr; - output->verts_orig_len_table = nullptr; - output->edges_orig = nullptr; - output->edges_orig_start_table = nullptr; - output->edges_orig_len_table = nullptr; - output->faces_orig = nullptr; - output->faces_orig_start_table = nullptr; - output->faces_orig_len_table = nullptr; - } - - int v_orig_index = 0; - for (int v = 0; v < nv; ++v) { - output->vert_coords[v][0] = float(res.vert[v][0]); - output->vert_coords[v][1] = float(res.vert[v][1]); - if (input->need_ids) { - int this_start = v_orig_index; - output->verts_orig_start_table[v] = this_start; - for (int j : res.vert_orig[v].index_range()) { - output->verts_orig[v_orig_index++] = res.vert_orig[v][j]; - } - output->verts_orig_len_table[v] = v_orig_index - this_start; - } - } - int e_orig_index = 0; - for (int e = 0; e < ne; ++e) { - output->edges[e][0] = res.edge[e].first; - output->edges[e][1] = res.edge[e].second; - if (input->need_ids) { - int this_start = e_orig_index; - output->edges_orig_start_table[e] = this_start; - for (int j : res.edge_orig[e].index_range()) { - output->edges_orig[e_orig_index++] = res.edge_orig[e][j]; - } - output->edges_orig_len_table[e] = e_orig_index - this_start; - } - } - int f_orig_index = 0; - int f_index = 0; - for (int f = 0; f < nf; ++f) { - - output->faces_start_table[f] = f_index; - int flen = res.face[f].size(); - output->faces_len_table[f] = flen; - for (int j = 0; j < flen; ++j) { - output->faces[f_index++] = res.face[f][j]; - } - if (input->need_ids) { - int this_start = f_orig_index; - output->faces_orig_start_table[f] = this_start; - for (int k : res.face_orig[f].index_range()) { - output->faces_orig[f_orig_index++] = res.face_orig[f][k]; - } - output->faces_orig_len_table[f] = f_orig_index - this_start; - } - } - return output; -} - -extern "C" void BLI_delaunay_2d_cdt_free(::CDT_result *result) -{ - MEM_freeN(result->vert_coords); - MEM_freeN(result->edges); - MEM_freeN(result->faces); - MEM_freeN(result->faces_start_table); - MEM_freeN(result->faces_len_table); - if (result->verts_orig) { - MEM_freeN(result->verts_orig); - MEM_freeN(result->verts_orig_start_table); - MEM_freeN(result->verts_orig_len_table); - MEM_freeN(result->edges_orig); - MEM_freeN(result->edges_orig_start_table); - MEM_freeN(result->edges_orig_len_table); - MEM_freeN(result->faces_orig); - MEM_freeN(result->faces_orig_start_table); - MEM_freeN(result->faces_orig_len_table); - } - MEM_freeN(result); -} diff --git a/source/blender/blenlib/intern/math_interp.c b/source/blender/blenlib/intern/math_interp.c index c7044acb39a..cdf5caec321 100644 --- a/source/blender/blenlib/intern/math_interp.c +++ b/source/blender/blenlib/intern/math_interp.c @@ -7,12 +7,18 @@ */ #include +#include #include "BLI_math_base.h" #include "BLI_math_interp.h" #include "BLI_math_vector.h" +#include "BLI_simd.h" #include "BLI_strict_flags.h" +#if BLI_HAVE_SSE2 && defined(__SSE4_1__) +# include /* _mm_floor_ps */ +#endif + /************************************************************************** * INTERPOLATIONS * @@ -236,221 +242,298 @@ void BLI_bicubic_interpolation_fl( } void BLI_bicubic_interpolation_char( - const uchar *buffer, uchar *output, int width, int height, int components, float u, float v) + const uchar *buffer, uchar *output, int width, int height, float u, float v) { - bicubic_interpolation(buffer, NULL, output, NULL, width, height, components, u, v); + bicubic_interpolation(buffer, NULL, output, NULL, width, height, 4, u, v); } /* BILINEAR INTERPOLATION */ -BLI_INLINE void bilinear_interpolation(const uchar *byte_buffer, - const float *float_buffer, - uchar *byte_output, - float *float_output, - int width, - int height, - int components, - float u, - float v, - bool wrap_x, - bool wrap_y) +BLI_INLINE void bilinear_interpolation_fl(const float *float_buffer, + float *float_output, + int width, + int height, + int components, + float u, + float v, + bool wrap_x, + bool wrap_y) { float a, b; float a_b, ma_b, a_mb, ma_mb; int y1, y2, x1, x2; - /* ImBuf in must have a valid rect or rect_float, assume this is already checked */ + float uf = floorf(u); + float vf = floorf(v); - x1 = (int)floor(u); - x2 = (int)ceil(u); - y1 = (int)floor(v); - y2 = (int)ceil(v); + x1 = (int)uf; + x2 = x1 + 1; + y1 = (int)vf; + y2 = y1 + 1; - if (float_output) { - const float *row1, *row2, *row3, *row4; - const float empty[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + const float *row1, *row2, *row3, *row4; + const float empty[4] = {0.0f, 0.0f, 0.0f, 0.0f}; - /* pixel value must be already wrapped, however values at boundaries may flip */ - if (wrap_x) { - if (x1 < 0) { - x1 = width - 1; - } - if (x2 >= width) { - x2 = 0; - } + /* pixel value must be already wrapped, however values at boundaries may flip */ + if (wrap_x) { + if (x1 < 0) { + x1 = width - 1; } - else if (x2 < 0 || x1 >= width) { - copy_vn_fl(float_output, components, 0.0f); - return; + if (x2 >= width) { + x2 = 0; } + } + else if (x2 < 0 || x1 >= width) { + copy_vn_fl(float_output, components, 0.0f); + return; + } - if (wrap_y) { - if (y1 < 0) { - y1 = height - 1; - } - if (y2 >= height) { - y2 = 0; - } + if (wrap_y) { + if (y1 < 0) { + y1 = height - 1; } - else if (y2 < 0 || y1 >= height) { - copy_vn_fl(float_output, components, 0.0f); - return; + if (y2 >= height) { + y2 = 0; } + } + else if (y2 < 0 || y1 >= height) { + copy_vn_fl(float_output, components, 0.0f); + return; + } - /* sample including outside of edges of image */ - if (x1 < 0 || y1 < 0) { - row1 = empty; - } - else { - row1 = float_buffer + width * y1 * components + components * x1; - } - - if (x1 < 0 || y2 > height - 1) { - row2 = empty; - } - else { - row2 = float_buffer + width * y2 * components + components * x1; - } - - if (x2 > width - 1 || y1 < 0) { - row3 = empty; - } - else { - row3 = float_buffer + width * y1 * components + components * x2; - } - - if (x2 > width - 1 || y2 > height - 1) { - row4 = empty; - } - else { - row4 = float_buffer + width * y2 * components + components * x2; - } - - a = u - floorf(u); - b = v - floorf(v); - a_b = a * b; - ma_b = (1.0f - a) * b; - a_mb = a * (1.0f - b); - ma_mb = (1.0f - a) * (1.0f - b); - - if (components == 1) { - float_output[0] = ma_mb * row1[0] + a_mb * row3[0] + ma_b * row2[0] + a_b * row4[0]; - } - else if (components == 3) { - float_output[0] = ma_mb * row1[0] + a_mb * row3[0] + ma_b * row2[0] + a_b * row4[0]; - float_output[1] = ma_mb * row1[1] + a_mb * row3[1] + ma_b * row2[1] + a_b * row4[1]; - float_output[2] = ma_mb * row1[2] + a_mb * row3[2] + ma_b * row2[2] + a_b * row4[2]; - } - else { - float_output[0] = ma_mb * row1[0] + a_mb * row3[0] + ma_b * row2[0] + a_b * row4[0]; - float_output[1] = ma_mb * row1[1] + a_mb * row3[1] + ma_b * row2[1] + a_b * row4[1]; - float_output[2] = ma_mb * row1[2] + a_mb * row3[2] + ma_b * row2[2] + a_b * row4[2]; - float_output[3] = ma_mb * row1[3] + a_mb * row3[3] + ma_b * row2[3] + a_b * row4[3]; - } + /* sample including outside of edges of image */ + if (x1 < 0 || y1 < 0) { + row1 = empty; } else { - const uchar *row1, *row2, *row3, *row4; - uchar empty[4] = {0, 0, 0, 0}; - - /* pixel value must be already wrapped, however values at boundaries may flip */ - if (wrap_x) { - if (x1 < 0) { - x1 = width - 1; - } - if (x2 >= width) { - x2 = 0; - } - } - else if (x2 < 0 || x1 >= width) { - copy_vn_uchar(byte_output, components, 0); - return; - } - - if (wrap_y) { - if (y1 < 0) { - y1 = height - 1; - } - if (y2 >= height) { - y2 = 0; - } - } - else if (y2 < 0 || y1 >= height) { - copy_vn_uchar(byte_output, components, 0); - return; - } - - /* sample including outside of edges of image */ - if (x1 < 0 || y1 < 0) { - row1 = empty; - } - else { - row1 = byte_buffer + width * y1 * components + components * x1; - } - - if (x1 < 0 || y2 > height - 1) { - row2 = empty; - } - else { - row2 = byte_buffer + width * y2 * components + components * x1; - } - - if (x2 > width - 1 || y1 < 0) { - row3 = empty; - } - else { - row3 = byte_buffer + width * y1 * components + components * x2; - } - - if (x2 > width - 1 || y2 > height - 1) { - row4 = empty; - } - else { - row4 = byte_buffer + width * y2 * components + components * x2; - } - - a = u - floorf(u); - b = v - floorf(v); - a_b = a * b; - ma_b = (1.0f - a) * b; - a_mb = a * (1.0f - b); - ma_mb = (1.0f - a) * (1.0f - b); - - if (components == 1) { - byte_output[0] = (uchar)(ma_mb * row1[0] + a_mb * row3[0] + ma_b * row2[0] + a_b * row4[0] + - 0.5f); - } - else if (components == 3) { - byte_output[0] = (uchar)(ma_mb * row1[0] + a_mb * row3[0] + ma_b * row2[0] + a_b * row4[0] + - 0.5f); - byte_output[1] = (uchar)(ma_mb * row1[1] + a_mb * row3[1] + ma_b * row2[1] + a_b * row4[1] + - 0.5f); - byte_output[2] = (uchar)(ma_mb * row1[2] + a_mb * row3[2] + ma_b * row2[2] + a_b * row4[2] + - 0.5f); - } - else { - byte_output[0] = (uchar)(ma_mb * row1[0] + a_mb * row3[0] + ma_b * row2[0] + a_b * row4[0] + - 0.5f); - byte_output[1] = (uchar)(ma_mb * row1[1] + a_mb * row3[1] + ma_b * row2[1] + a_b * row4[1] + - 0.5f); - byte_output[2] = (uchar)(ma_mb * row1[2] + a_mb * row3[2] + ma_b * row2[2] + a_b * row4[2] + - 0.5f); - byte_output[3] = (uchar)(ma_mb * row1[3] + a_mb * row3[3] + ma_b * row2[3] + a_b * row4[3] + - 0.5f); - } + row1 = float_buffer + width * y1 * components + components * x1; } + + if (x1 < 0 || y2 > height - 1) { + row2 = empty; + } + else { + row2 = float_buffer + width * y2 * components + components * x1; + } + + if (x2 > width - 1 || y1 < 0) { + row3 = empty; + } + else { + row3 = float_buffer + width * y1 * components + components * x2; + } + + if (x2 > width - 1 || y2 > height - 1) { + row4 = empty; + } + else { + row4 = float_buffer + width * y2 * components + components * x2; + } + + a = u - uf; + b = v - vf; + a_b = a * b; + ma_b = (1.0f - a) * b; + a_mb = a * (1.0f - b); + ma_mb = (1.0f - a) * (1.0f - b); + + if (components == 1) { + float_output[0] = ma_mb * row1[0] + a_mb * row3[0] + ma_b * row2[0] + a_b * row4[0]; + } + else if (components == 3) { + float_output[0] = ma_mb * row1[0] + a_mb * row3[0] + ma_b * row2[0] + a_b * row4[0]; + float_output[1] = ma_mb * row1[1] + a_mb * row3[1] + ma_b * row2[1] + a_b * row4[1]; + float_output[2] = ma_mb * row1[2] + a_mb * row3[2] + ma_b * row2[2] + a_b * row4[2]; + } + else { +#if BLI_HAVE_SSE2 + __m128 rgba1 = _mm_loadu_ps(row1); + __m128 rgba2 = _mm_loadu_ps(row2); + __m128 rgba3 = _mm_loadu_ps(row3); + __m128 rgba4 = _mm_loadu_ps(row4); + rgba1 = _mm_mul_ps(_mm_set1_ps(ma_mb), rgba1); + rgba2 = _mm_mul_ps(_mm_set1_ps(ma_b), rgba2); + rgba3 = _mm_mul_ps(_mm_set1_ps(a_mb), rgba3); + rgba4 = _mm_mul_ps(_mm_set1_ps(a_b), rgba4); + __m128 rgba13 = _mm_add_ps(rgba1, rgba3); + __m128 rgba24 = _mm_add_ps(rgba2, rgba4); + __m128 rgba = _mm_add_ps(rgba13, rgba24); + _mm_storeu_ps(float_output, rgba); +#else + float_output[0] = ma_mb * row1[0] + a_mb * row3[0] + ma_b * row2[0] + a_b * row4[0]; + float_output[1] = ma_mb * row1[1] + a_mb * row3[1] + ma_b * row2[1] + a_b * row4[1]; + float_output[2] = ma_mb * row1[2] + a_mb * row3[2] + ma_b * row2[2] + a_b * row4[2]; + float_output[3] = ma_mb * row1[3] + a_mb * row3[3] + ma_b * row2[3] + a_b * row4[3]; +#endif + } +} + +void BLI_bilinear_interpolation_char( + const uchar *buffer, uchar *output, int width, int height, float u, float v) +{ +#if BLI_HAVE_SSE2 + /* Bilinear interpolation needs to read and blend four image pixels, while + * also handling conditions of sample coordinate being outside of the + * image, in which case black (all zeroes) should be used as the sample + * contribution. + * + * Code below does all that without any branches, by making outside the + * image sample locations still read the first pixel of the image, but + * later making sure that the result is set to zero for that sample. */ + + __m128 uvuv = _mm_set_ps(v, u, v, u); + +# if defined(__SSE4_1__) || defined(__ARM_NEON) && defined(WITH_SSE2NEON) + /* If we're on SSE4 or ARM NEON, just use the simple floor() way. */ + __m128 uvuv_floor = _mm_floor_ps(uvuv); +# else + /* The hard way: truncate, for negative inputs this will round towards zero. + * Then compare with input UV, and subtract 1 for the inputs that were + * negative. */ + __m128 uv_trunc = _mm_cvtepi32_ps(_mm_cvttps_epi32(uvuv)); + __m128 uv_neg = _mm_cmplt_ps(uvuv, uv_trunc); + __m128 uvuv_floor = _mm_sub_ps(uv_trunc, _mm_and_ps(uv_neg, _mm_set1_ps(1.0f))); +# endif + + /* x1, y1, x2, y2 */ + __m128i xy12 = _mm_add_epi32(_mm_cvttps_epi32(uvuv_floor), _mm_set_epi32(1, 1, 0, 0)); + /* Check whether any of the coordinates are outside of the image. */ + __m128i size_minus_1 = _mm_sub_epi32(_mm_set_epi32(height, width, height, width), + _mm_set1_epi32(1)); + __m128i too_lo_xy12 = _mm_cmplt_epi32(xy12, _mm_setzero_si128()); + __m128i too_hi_xy12 = _mm_cmplt_epi32(size_minus_1, xy12); + __m128i invalid_xy12 = _mm_or_si128(too_lo_xy12, too_hi_xy12); + + /* Samples 1,2,3,4 are in this order: x1y1, x1y2, x2y1, x2y2 */ + __m128i x1234 = _mm_shuffle_epi32(xy12, _MM_SHUFFLE(2, 2, 0, 0)); + __m128i y1234 = _mm_shuffle_epi32(xy12, _MM_SHUFFLE(3, 1, 3, 1)); + __m128i invalid_1234 = _mm_or_si128(_mm_shuffle_epi32(invalid_xy12, _MM_SHUFFLE(2, 2, 0, 0)), + _mm_shuffle_epi32(invalid_xy12, _MM_SHUFFLE(3, 1, 3, 1))); + /* Set x & y to zero for invalid samples. */ + x1234 = _mm_andnot_si128(invalid_1234, x1234); + y1234 = _mm_andnot_si128(invalid_1234, y1234); + + /* Read the four sample values. Do address calculations in C, since SSE + * before 4.1 makes it very cumbersome to do full integer multiplies. */ + int xcoord[4]; + int ycoord[4]; + _mm_storeu_ps((float *)xcoord, _mm_castsi128_ps(x1234)); + _mm_storeu_ps((float *)ycoord, _mm_castsi128_ps(y1234)); + int sample1 = ((const int *)buffer)[ycoord[0] * (int64_t)width + xcoord[0]]; + int sample2 = ((const int *)buffer)[ycoord[1] * (int64_t)width + xcoord[1]]; + int sample3 = ((const int *)buffer)[ycoord[2] * (int64_t)width + xcoord[2]]; + int sample4 = ((const int *)buffer)[ycoord[3] * (int64_t)width + xcoord[3]]; + __m128i samples1234 = _mm_set_epi32(sample4, sample3, sample2, sample1); + /* Set samples to black for the ones that were actually invalid. */ + samples1234 = _mm_andnot_si128(invalid_1234, samples1234); + + /* Expand samples from packed 8-bit RGBA to full floats: + * spread to 16 bit values. */ + __m128i rgba16_12 = _mm_unpacklo_epi8(samples1234, _mm_setzero_si128()); + __m128i rgba16_34 = _mm_unpackhi_epi8(samples1234, _mm_setzero_si128()); + /* Spread to 32 bit values and convert to float. */ + __m128 rgba1 = _mm_cvtepi32_ps(_mm_unpacklo_epi16(rgba16_12, _mm_setzero_si128())); + __m128 rgba2 = _mm_cvtepi32_ps(_mm_unpackhi_epi16(rgba16_12, _mm_setzero_si128())); + __m128 rgba3 = _mm_cvtepi32_ps(_mm_unpacklo_epi16(rgba16_34, _mm_setzero_si128())); + __m128 rgba4 = _mm_cvtepi32_ps(_mm_unpackhi_epi16(rgba16_34, _mm_setzero_si128())); + + /* Calculate interpolation factors: (1-a)*(1-b), (1-a)*b, a*(1-b), a*b */ + __m128 abab = _mm_sub_ps(uvuv, uvuv_floor); + __m128 m_abab = _mm_sub_ps(_mm_set1_ps(1.0f), abab); + __m128 ab_mab = _mm_shuffle_ps(abab, m_abab, _MM_SHUFFLE(3, 2, 1, 0)); + __m128 factors = _mm_mul_ps(_mm_shuffle_ps(ab_mab, ab_mab, _MM_SHUFFLE(0, 0, 2, 2)), + _mm_shuffle_ps(ab_mab, ab_mab, _MM_SHUFFLE(1, 3, 1, 3))); + + /* Blend the samples. */ + rgba1 = _mm_mul_ps(_mm_shuffle_ps(factors, factors, _MM_SHUFFLE(0, 0, 0, 0)), rgba1); + rgba2 = _mm_mul_ps(_mm_shuffle_ps(factors, factors, _MM_SHUFFLE(1, 1, 1, 1)), rgba2); + rgba3 = _mm_mul_ps(_mm_shuffle_ps(factors, factors, _MM_SHUFFLE(2, 2, 2, 2)), rgba3); + rgba4 = _mm_mul_ps(_mm_shuffle_ps(factors, factors, _MM_SHUFFLE(3, 3, 3, 3)), rgba4); + __m128 rgba13 = _mm_add_ps(rgba1, rgba3); + __m128 rgba24 = _mm_add_ps(rgba2, rgba4); + __m128 rgba = _mm_add_ps(rgba13, rgba24); + rgba = _mm_add_ps(rgba, _mm_set1_ps(0.5f)); + /* Pack and write to destination: pack to 16 bit signed, then to 8 bit + * unsigned, then write resulting 32-bit value. */ + __m128i rgba32 = _mm_cvttps_epi32(rgba); + __m128i rgba16 = _mm_packs_epi32(rgba32, _mm_setzero_si128()); + __m128i rgba8 = _mm_packus_epi16(rgba16, _mm_setzero_si128()); + _mm_store_ss((float *)output, _mm_castsi128_ps(rgba8)); + +#else + + float a, b; + float a_b, ma_b, a_mb, ma_mb; + int y1, y2, x1, x2; + + float uf = floorf(u); + float vf = floorf(v); + + x1 = (int)uf; + x2 = x1 + 1; + y1 = (int)vf; + y2 = y1 + 1; + + const uchar *row1, *row2, *row3, *row4; + uchar empty[4] = {0, 0, 0, 0}; + + /* completely outside of the image? */ + if (x2 < 0 || x1 >= width) { + copy_vn_uchar(output, 4, 0); + return; + } + + if (y2 < 0 || y1 >= height) { + copy_vn_uchar(output, 4, 0); + return; + } + + /* sample including outside of edges of image */ + if (x1 < 0 || y1 < 0) { + row1 = empty; + } + else { + row1 = buffer + width * y1 * 4 + 4 * x1; + } + + if (x1 < 0 || y2 > height - 1) { + row2 = empty; + } + else { + row2 = buffer + width * y2 * 4 + 4 * x1; + } + + if (x2 > width - 1 || y1 < 0) { + row3 = empty; + } + else { + row3 = buffer + width * y1 * 4 + 4 * x2; + } + + if (x2 > width - 1 || y2 > height - 1) { + row4 = empty; + } + else { + row4 = buffer + width * y2 * 4 + 4 * x2; + } + + a = u - uf; + b = v - vf; + a_b = a * b; + ma_b = (1.0f - a) * b; + a_mb = a * (1.0f - b); + ma_mb = (1.0f - a) * (1.0f - b); + + output[0] = (uchar)(ma_mb * row1[0] + a_mb * row3[0] + ma_b * row2[0] + a_b * row4[0] + 0.5f); + output[1] = (uchar)(ma_mb * row1[1] + a_mb * row3[1] + ma_b * row2[1] + a_b * row4[1] + 0.5f); + output[2] = (uchar)(ma_mb * row1[2] + a_mb * row3[2] + ma_b * row2[2] + a_b * row4[2] + 0.5f); + output[3] = (uchar)(ma_mb * row1[3] + a_mb * row3[3] + ma_b * row2[3] + a_b * row4[3] + 0.5f); +#endif } void BLI_bilinear_interpolation_fl( const float *buffer, float *output, int width, int height, int components, float u, float v) { - bilinear_interpolation( - NULL, buffer, NULL, output, width, height, components, u, v, false, false); -} - -void BLI_bilinear_interpolation_char( - const uchar *buffer, uchar *output, int width, int height, int components, float u, float v) -{ - bilinear_interpolation( - buffer, NULL, output, NULL, width, height, components, u, v, false, false); + bilinear_interpolation_fl(buffer, output, width, height, components, u, v, false, false); } void BLI_bilinear_interpolation_wrap_fl(const float *buffer, @@ -463,22 +546,7 @@ void BLI_bilinear_interpolation_wrap_fl(const float *buffer, bool wrap_x, bool wrap_y) { - bilinear_interpolation( - NULL, buffer, NULL, output, width, height, components, u, v, wrap_x, wrap_y); -} - -void BLI_bilinear_interpolation_wrap_char(const uchar *buffer, - uchar *output, - int width, - int height, - int components, - float u, - float v, - bool wrap_x, - bool wrap_y) -{ - bilinear_interpolation( - buffer, NULL, output, NULL, width, height, components, u, v, wrap_x, wrap_y); + bilinear_interpolation_fl(buffer, output, width, height, components, u, v, wrap_x, wrap_y); } /************************************************************************** diff --git a/source/blender/blenlib/intern/mesh_boolean.cc b/source/blender/blenlib/intern/mesh_boolean.cc index a1c6dfde7a6..d89383e77e0 100644 --- a/source/blender/blenlib/intern/mesh_boolean.cc +++ b/source/blender/blenlib/intern/mesh_boolean.cc @@ -15,7 +15,7 @@ # include "BLI_array.hh" # include "BLI_assert.h" -# include "BLI_delaunay_2d.h" +# include "BLI_delaunay_2d.hh" # include "BLI_hash.hh" # include "BLI_kdopbvh.h" # include "BLI_map.hh" @@ -981,7 +981,7 @@ static Array sort_tris_around_edge( * be only 3 or 4 - so OK to make copies of arrays instead of swapping * around in a single array. */ const int dbg_level = 0; - if (tris.size() == 0) { + if (tris.is_empty()) { return Array(); } if (dbg_level > 0) { @@ -1306,7 +1306,7 @@ static bool patch_cell_graph_ok(const CellsInfo &cinfo, const PatchesInfo &pinfo if (cell.merged_to() != NO_INDEX) { continue; } - if (cell.patches().size() == 0) { + if (cell.patches().is_empty()) { std::cout << "Patch/Cell graph disconnected at Cell " << c << " with no patches\n"; return false; } @@ -2132,7 +2132,7 @@ static void finish_patch_cell_graph(const IMesh &tm, /* For nested components, merge their ambient cell with the nearest containing cell. */ Vector outer_components; for (int comp : comp_cont.index_range()) { - if (comp_cont[comp].size() == 0) { + if (comp_cont[comp].is_empty()) { outer_components.append(comp); } else { @@ -3217,7 +3217,7 @@ static void do_dissolve(FaceMergeState *fms) dissolve_edges.append(e); } } - if (dissolve_edges.size() == 0) { + if (dissolve_edges.is_empty()) { return; } /* Things look nicer if we dissolve the longer edges first. */ diff --git a/source/blender/blenlib/intern/mesh_intersect.cc b/source/blender/blenlib/intern/mesh_intersect.cc index 674e00143d0..857be23e6d6 100644 --- a/source/blender/blenlib/intern/mesh_intersect.cc +++ b/source/blender/blenlib/intern/mesh_intersect.cc @@ -17,7 +17,7 @@ # include "BLI_allocator.hh" # include "BLI_array.hh" # include "BLI_assert.h" -# include "BLI_delaunay_2d.h" +# include "BLI_delaunay_2d.hh" # include "BLI_hash.hh" # include "BLI_kdopbvh.h" # include "BLI_map.hh" @@ -1686,7 +1686,7 @@ static void prepare_need_tri(CDT_data &cd, const IMesh &tm, int t) cd.is_reversed.append(rev); } -static CDT_data prepare_cdt_input(const IMesh &tm, int t, const Vector itts) +static CDT_data prepare_cdt_input(const IMesh &tm, int t, const Span itts) { CDT_data ans; BLI_assert(tm.face(t)->plane_populated()); @@ -1718,7 +1718,7 @@ static CDT_data prepare_cdt_input(const IMesh &tm, int t, const Vector itts) + const Span itts) { CDT_data ans; BLI_assert(c < clinfo.tot_cluster()); @@ -2086,13 +2086,11 @@ static Array polyfill_triangulate_poly(Face *f, IMeshArena *arena) static Array exact_triangulate_poly(Face *f, IMeshArena *arena) { int flen = f->size(); - CDT_input cdt_in; - cdt_in.vert = Array(flen); - cdt_in.face = Array>(1); - cdt_in.face[0].reserve(flen); - for (int i : f->index_range()) { - cdt_in.face[0].append(i); - } + Array in_verts(flen); + Array> faces; + faces.first().resize(flen); + std::iota(faces.first().begin(), faces.first().end(), 0); + /* Project poly along dominant axis of normal to get 2d coords. */ if (!f->plane_populated()) { f->populate_plane(false); @@ -2108,7 +2106,7 @@ static Array exact_triangulate_poly(Face *f, IMeshArena *arena) bool rev = rev1 ^ rev2; for (int i = 0; i < flen; ++i) { int ii = rev ? flen - i - 1 : i; - mpq2 &p2d = cdt_in.vert[ii]; + mpq2 &p2d = in_verts[ii]; int k = 0; for (int j = 0; j < 3; ++j) { if (j != axis) { @@ -2116,6 +2114,11 @@ static Array exact_triangulate_poly(Face *f, IMeshArena *arena) } } } + + CDT_input cdt_in; + cdt_in.vert = std::move(in_verts); + cdt_in.face = std::move(faces); + CDT_result cdt_out = delaunay_2d_calc(cdt_in, CDT_INSIDE); int n_tris = cdt_out.face.size(); Array ans(n_tris); @@ -2126,7 +2129,7 @@ static Array exact_triangulate_poly(Face *f, IMeshArena *arena) bool needs_steiner = false; for (int i = 0; i < 3; ++i) { i_v_out[i] = cdt_out.face[t][i]; - if (cdt_out.vert_orig[i_v_out[i]].size() == 0) { + if (cdt_out.vert_orig[i_v_out[i]].is_empty()) { needs_steiner = true; break; } @@ -2763,7 +2766,7 @@ static CoplanarClusterInfo find_clusters(const IMesh &tm, if (dbg_level > 0) { std::cout << "found " << maybe_coplanar_tris.size() << " possible coplanar tris\n"; } - if (maybe_coplanar_tris.size() == 0) { + if (maybe_coplanar_tris.is_empty()) { if (dbg_level > 0) { std::cout << "No possible coplanar tris, so no clusters\n"; } @@ -2810,7 +2813,7 @@ static CoplanarClusterInfo find_clusters(const IMesh &tm, no_int_cls.append(&cl); } } - if (int_cls.size() == 0) { + if (int_cls.is_empty()) { /* t doesn't intersect any existing cluster in its plane, so make one just for it. */ if (dbg_level > 1) { std::cout << "no intersecting clusters for t, make a new one\n"; diff --git a/source/blender/blenlib/intern/offset_indices.cc b/source/blender/blenlib/intern/offset_indices.cc index c8c1f42f205..9ef6cbb5bff 100644 --- a/source/blender/blenlib/intern/offset_indices.cc +++ b/source/blender/blenlib/intern/offset_indices.cc @@ -50,14 +50,18 @@ void gather_group_sizes(const OffsetIndices offsets, OffsetIndices gather_selected_offsets(const OffsetIndices src_offsets, const IndexMask &selection, + const int start_offset, MutableSpan dst_offsets) { if (selection.is_empty()) { return {}; } - BLI_assert(selection.size() == (dst_offsets.size() - 1)); - gather_group_sizes(src_offsets, selection, dst_offsets); - accumulate_counts_to_offsets(dst_offsets); + int offset = start_offset; + selection.foreach_index_optimized([&](const int i, const int pos) { + dst_offsets[pos] = offset; + offset += src_offsets[i].size(); + }); + dst_offsets.last() = offset; return OffsetIndices(dst_offsets); } diff --git a/source/blender/blenlib/intern/serialize.cc b/source/blender/blenlib/intern/serialize.cc index 506453c8e35..f7c55705558 100644 --- a/source/blender/blenlib/intern/serialize.cc +++ b/source/blender/blenlib/intern/serialize.cc @@ -41,6 +41,14 @@ const BooleanValue *Value::as_boolean_value() const return static_cast(this); } +const EnumValue *Value::as_enum_value() const +{ + if (type_ != eValueType::Enum) { + return nullptr; + } + return static_cast(this); +} + const ArrayValue *Value::as_array_value() const { if (type_ != eValueType::Array) { @@ -121,6 +129,12 @@ static void convert_to_json(nlohmann::ordered_json &j, const Value &value) case eValueType::Double: { j = value.as_double_value()->value(); + break; + } + + case eValueType::Enum: { + j = value.as_enum_value()->value(); + break; } } } diff --git a/source/blender/blenlib/tests/BLI_delaunay_2d_test.cc b/source/blender/blenlib/tests/BLI_delaunay_2d_test.cc index 5adfdc8f321..6485499e5da 100644 --- a/source/blender/blenlib/tests/BLI_delaunay_2d_test.cc +++ b/source/blender/blenlib/tests/BLI_delaunay_2d_test.cc @@ -15,7 +15,6 @@ #include #define DO_CPP_TESTS 1 -#define DO_C_TESTS 1 #define DO_TEXT_TESTS 0 #define DO_RANDOM_TESTS 0 @@ -25,7 +24,7 @@ #include "BLI_math_vector_mpq_types.hh" #include "BLI_vector.hh" -#include "BLI_delaunay_2d.h" +#include "BLI_delaunay_2d.hh" namespace blender::meshintersect { @@ -284,7 +283,7 @@ void graph_draw(const std::string &label, constexpr bool draw_vert_labels = false; constexpr bool draw_edge_labels = false; - if (verts.size() == 0) { + if (verts.is_empty()) { return; } vec2 vmin(1e10, 1e10); @@ -1735,56 +1734,6 @@ TEST(delaunay_m, RepeatTri) # endif #endif -#if DO_C_TESTS - -TEST(delaunay_d, CintTwoFace) -{ - float vert_coords[][2] = { - {0.0, 0.0}, {1.0, 0.0}, {0.5, 1.0}, {1.1, 1.0}, {1.1, 0.0}, {1.6, 1.0}}; - int faces[] = {0, 1, 2, 3, 4, 5}; - int faces_len[] = {3, 3}; - int faces_start[] = {0, 3}; - - ::CDT_input input; - input.verts_len = 6; - input.edges_len = 0; - input.faces_len = 2; - input.vert_coords = vert_coords; - input.edges = nullptr; - input.faces = faces; - input.faces_len_table = faces_len; - input.faces_start_table = faces_start; - input.epsilon = 1e-5f; - input.need_ids = false; - ::CDT_result *output = BLI_delaunay_2d_cdt_calc(&input, CDT_FULL); - BLI_delaunay_2d_cdt_free(output); -} - -TEST(delaunay_d, CintTwoFaceNoIds) -{ - float vert_coords[][2] = { - {0.0, 0.0}, {1.0, 0.0}, {0.5, 1.0}, {1.1, 1.0}, {1.1, 0.0}, {1.6, 1.0}}; - int faces[] = {0, 1, 2, 3, 4, 5}; - int faces_len[] = {3, 3}; - int faces_start[] = {0, 3}; - - ::CDT_input input; - input.verts_len = 6; - input.edges_len = 0; - input.faces_len = 2; - input.vert_coords = vert_coords; - input.edges = nullptr; - input.faces = faces; - input.faces_len_table = faces_len; - input.faces_start_table = faces_start; - input.epsilon = 1e-5f; - input.need_ids = true; - ::CDT_result *output = BLI_delaunay_2d_cdt_calc(&input, CDT_FULL); - BLI_delaunay_2d_cdt_free(output); -} - -#endif - #if DO_TEXT_TESTS template void text_test( diff --git a/source/blender/blenlib/tests/BLI_math_interp_test.cc b/source/blender/blenlib/tests/BLI_math_interp_test.cc new file mode 100644 index 00000000000..4e553280962 --- /dev/null +++ b/source/blender/blenlib/tests/BLI_math_interp_test.cc @@ -0,0 +1,98 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: Apache-2.0 */ + +#include "testing/testing.h" + +#include "BLI_math_interp.h" + +static constexpr int image_width = 3; +static constexpr int image_height = 3; +static constexpr unsigned char image_char[image_height][image_width][4] = { + {{255, 254, 217, 216}, {230, 230, 230, 230}, {240, 160, 90, 20}}, + {{0, 1, 2, 3}, {62, 72, 82, 92}, {126, 127, 128, 129}}, + {{1, 2, 3, 4}, {73, 108, 153, 251}, {128, 129, 130, 131}}, +}; + +TEST(math_interp, BilinearCharExactSamples) +{ + unsigned char res[4]; + unsigned char exp1[4] = {73, 108, 153, 251}; + BLI_bilinear_interpolation_char(image_char[0][0], res, image_width, image_height, 1.0f, 2.0f); + EXPECT_EQ_ARRAY(exp1, res, 4); + unsigned char exp2[4] = {240, 160, 90, 20}; + BLI_bilinear_interpolation_char(image_char[0][0], res, image_width, image_height, 2.0f, 0.0f); + EXPECT_EQ_ARRAY(exp2, res, 4); +} + +TEST(math_interp, BilinearCharHalfwayUSamples) +{ + unsigned char res[4]; + unsigned char exp1[4] = {31, 37, 42, 48}; + BLI_bilinear_interpolation_char(image_char[0][0], res, image_width, image_height, 0.5f, 1.0f); + EXPECT_EQ_ARRAY(exp1, res, 4); + unsigned char exp2[4] = {243, 242, 224, 223}; + BLI_bilinear_interpolation_char(image_char[0][0], res, image_width, image_height, 0.5f, 0.0f); + EXPECT_EQ_ARRAY(exp2, res, 4); +} + +TEST(math_interp, BilinearCharHalfwayVSamples) +{ + unsigned char res[4]; + unsigned char exp1[4] = {1, 2, 3, 4}; + BLI_bilinear_interpolation_char(image_char[0][0], res, image_width, image_height, 0.0f, 1.5f); + EXPECT_EQ_ARRAY(exp1, res, 4); + unsigned char exp2[4] = {127, 128, 129, 130}; + BLI_bilinear_interpolation_char(image_char[0][0], res, image_width, image_height, 2.0f, 1.5f); + EXPECT_EQ_ARRAY(exp2, res, 4); +} + +TEST(math_interp, BilinearCharSamples) +{ + unsigned char res[4]; + unsigned char exp1[4] = {136, 133, 132, 130}; + BLI_bilinear_interpolation_char(image_char[0][0], res, image_width, image_height, 1.25f, 0.625f); + EXPECT_EQ_ARRAY(exp1, res, 4); + unsigned char exp2[4] = {219, 191, 167, 142}; + BLI_bilinear_interpolation_char(image_char[0][0], res, image_width, image_height, 1.4f, 0.1f); + EXPECT_EQ_ARRAY(exp2, res, 4); +} + +TEST(math_interp, BilinearCharPartiallyOutsideImage) +{ + unsigned char res[4]; + unsigned char exp1[4] = {1, 1, 2, 2}; + BLI_bilinear_interpolation_char(image_char[0][0], res, image_width, image_height, -0.5f, 2.0f); + EXPECT_EQ_ARRAY(exp1, res, 4); + unsigned char exp2[4] = {9, 11, 15, 22}; + BLI_bilinear_interpolation_char(image_char[0][0], res, image_width, image_height, 1.25f, 2.9f); + EXPECT_EQ_ARRAY(exp2, res, 4); + unsigned char exp3[4] = {173, 115, 65, 14}; + BLI_bilinear_interpolation_char(image_char[0][0], res, image_width, image_height, 2.2f, -0.1f); + EXPECT_EQ_ARRAY(exp3, res, 4); +} + +TEST(math_interp, BilinearCharFullyOutsideImage) +{ + unsigned char res[4]; + unsigned char exp[4] = {0, 0, 0, 0}; + /* Out of range on U */ + BLI_bilinear_interpolation_char(image_char[0][0], res, image_width, image_height, -1.5f, 0); + EXPECT_EQ_ARRAY(exp, res, 4); + BLI_bilinear_interpolation_char(image_char[0][0], res, image_width, image_height, -1.1f, 0); + EXPECT_EQ_ARRAY(exp, res, 4); + BLI_bilinear_interpolation_char(image_char[0][0], res, image_width, image_height, 3, 0); + EXPECT_EQ_ARRAY(exp, res, 4); + BLI_bilinear_interpolation_char(image_char[0][0], res, image_width, image_height, 5, 0); + EXPECT_EQ_ARRAY(exp, res, 4); + + /* Out of range on V */ + BLI_bilinear_interpolation_char(image_char[0][0], res, image_width, image_height, 0, -3.2f); + EXPECT_EQ_ARRAY(exp, res, 4); + BLI_bilinear_interpolation_char(image_char[0][0], res, image_width, image_height, 0, -1.5f); + EXPECT_EQ_ARRAY(exp, res, 4); + BLI_bilinear_interpolation_char(image_char[0][0], res, image_width, image_height, 0, 3.1f); + EXPECT_EQ_ARRAY(exp, res, 4); + BLI_bilinear_interpolation_char(image_char[0][0], res, image_width, image_height, 0, 500.0f); + EXPECT_EQ_ARRAY(exp, res, 4); +} diff --git a/source/blender/blenlib/tests/BLI_string_utf8_test.cc b/source/blender/blenlib/tests/BLI_string_utf8_test.cc index 29417636f4f..5975baf3f72 100644 --- a/source/blender/blenlib/tests/BLI_string_utf8_test.cc +++ b/source/blender/blenlib/tests/BLI_string_utf8_test.cc @@ -14,6 +14,46 @@ * BLI_string_test.cc However, tests below are specific utf-8 conformance ones, and since they eat * quite their share of lines, they deserved their own file. */ +/** + * Multi byte defies, use when the exact character isn't important, + * and when proper handling of multi-byte sequences is needed. + * + * Define the first text character found in 1-4 bytes. + * We might want to generate other string tables too. + * + * \code{.py} + * unicode_max = 0x110000 + * bytes_max = 4 + * sample_chars = dict() + * for i in range(unicode_max): + * ch = chr(i) + * try: + * byte = ch.encode('utf-8') + * byte_len = len(byte) + * except UnicodeEncodeError: + * continue + * if byte_len not in sample_chars: + * # Not essential but useful if the character is printable. + * if ch.isalpha(): + * sample_chars[byte_len] = byte + * if byte_len == bytes_max: + * break + * + * assert tuple(sorted(sample_chars.keys())) == tuple(range(1, bytes_max + 1)) + * for i in range(1, bytes_max + 1): + * byte = sample_chars[i] + * print("#define STR_MB_ALPHA_%d \"" % i, end="") + * for x in byte: + * print("\\x%02x" % x, end="") + * print("\"") + * \endcode + */ + +#define STR_MB_ALPHA_1 "\x41" +#define STR_MB_ALPHA_2 "\xc2\xaa" +#define STR_MB_ALPHA_3 "\xe0\xa0\x80" +#define STR_MB_ALPHA_4 "\xf0\x90\x80\x80" + /* -------------------------------------------------------------------- */ /** \name Test #BLI_str_utf8_invalid_strip * \{ */ @@ -292,6 +332,37 @@ TEST(string, Utf8InvalidBytes) /** \} */ +/* -------------------------------------------------------------------- */ +/** \name Test #BLI_str_utf8_offset_from_index + * \{ */ + +TEST(string, Utf8OffsetFromIndex_ClampedIndex) +{ + /* Ensure an index that exceeds the number of multi-byte characters in the + * string has the same behavior as an index which is clamped by the number of code-points. */ + const char *test_strings[] = { + "", + "TEST", + STR_MB_ALPHA_1, + STR_MB_ALPHA_2, + STR_MB_ALPHA_3, + STR_MB_ALPHA_4, + STR_MB_ALPHA_1 STR_MB_ALPHA_2 STR_MB_ALPHA_3 STR_MB_ALPHA_4, + STR_MB_ALPHA_4 STR_MB_ALPHA_3 STR_MB_ALPHA_2 STR_MB_ALPHA_1, + }; + for (int i = 0; i < ARRAY_SIZE(test_strings); i++) { + const char *str = test_strings[i]; + const size_t str_len = strlen(str); + const int str_len_utf8 = BLI_strlen_utf8(str); + + const int str_offset = BLI_str_utf8_offset_from_index(str, str_len, str_len_utf8); + EXPECT_EQ(BLI_str_utf8_offset_from_index(str, str_len, str_len_utf8 + 1), str_offset); + EXPECT_EQ(BLI_str_utf8_offset_from_index(str, str_len, str_len_utf8 + 10), str_offset); + } +} + +/** \} */ + /* -------------------------------------------------------------------- */ /** \name Test #BLI_str_utf8_as_unicode_step_safe * \{ */ diff --git a/source/blender/blenlib/tests/BLI_vector_test.cc b/source/blender/blenlib/tests/BLI_vector_test.cc index aca21af4d25..18eccce0c1a 100644 --- a/source/blender/blenlib/tests/BLI_vector_test.cc +++ b/source/blender/blenlib/tests/BLI_vector_test.cc @@ -431,6 +431,17 @@ TEST(vector, RemoveIf) EXPECT_EQ_ARRAY(vec.data(), expected_vec.data(), size_t(vec.size())); } +TEST(vector, RemoveIfNonTrivialDestructible) +{ + Vector> vec; + for ([[maybe_unused]] const int64_t i : IndexRange(10)) { + /* This test relies on leak detection to run after tests. */ + vec.append(Vector(100)); + } + vec.remove_if([&](const auto & /*value*/) { return true; }); + EXPECT_TRUE(vec.is_empty()); +} + TEST(vector, ExtendSmallVector) { Vector a = {2, 3, 4}; diff --git a/source/blender/blenloader/intern/versioning_280.cc b/source/blender/blenloader/intern/versioning_280.cc index dc0b63b3c8e..84b52301a8d 100644 --- a/source/blender/blenloader/intern/versioning_280.cc +++ b/source/blender/blenloader/intern/versioning_280.cc @@ -4674,7 +4674,7 @@ void blo_do_versions_280(FileData *fd, Library * /*lib*/, Main *bmain) } LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { - scene->r.mode &= ~(R_MODE_UNUSED_1 | R_MODE_UNUSED_2 | R_MODE_UNUSED_3 | R_MODE_UNUSED_4 | + scene->r.mode &= ~(R_SIMPLIFY_NORMALS | R_MODE_UNUSED_2 | R_MODE_UNUSED_3 | R_MODE_UNUSED_4 | R_MODE_UNUSED_5 | R_MODE_UNUSED_6 | R_MODE_UNUSED_7 | R_MODE_UNUSED_8 | R_MODE_UNUSED_10 | R_MODE_UNUSED_13 | R_MODE_UNUSED_16 | R_MODE_UNUSED_17 | R_MODE_UNUSED_18 | R_MODE_UNUSED_19 | diff --git a/source/blender/blenloader/intern/versioning_290.cc b/source/blender/blenloader/intern/versioning_290.cc index 6469754865e..b06f87749ad 100644 --- a/source/blender/blenloader/intern/versioning_290.cc +++ b/source/blender/blenloader/intern/versioning_290.cc @@ -846,7 +846,7 @@ void blo_do_versions_290(FileData *fd, Library * /*lib*/, Main *bmain) me->totloop, me->face_offsets_for_write().data(), me->faces_num, - BKE_mesh_deform_verts_for_write(me), + me->deform_verts_for_write().data(), false, true, &changed); diff --git a/source/blender/blenloader/intern/versioning_400.cc b/source/blender/blenloader/intern/versioning_400.cc index 4753dcd8c38..5833cbb381a 100644 --- a/source/blender/blenloader/intern/versioning_400.cc +++ b/source/blender/blenloader/intern/versioning_400.cc @@ -83,9 +83,9 @@ static void version_composite_nodetree_null_id(bNodeTree *ntree, Scene *scene) { for (bNode *node : ntree->all_nodes()) { - if (node->id == nullptr && - ((node->type == CMP_NODE_R_LAYERS) || - (node->type == CMP_NODE_CRYPTOMATTE && node->custom1 == CMP_CRYPTOMATTE_SRC_RENDER))) + if (node->id == nullptr && ((node->type == CMP_NODE_R_LAYERS) || + (node->type == CMP_NODE_CRYPTOMATTE && + node->custom1 == CMP_NODE_CRYPTOMATTE_SOURCE_RENDER))) { node->id = &scene->id; } @@ -1382,7 +1382,11 @@ static void version_geometry_nodes_use_rotation_socket(bNodeTree &ntree) bNodeSocket *socket = nodeFindSocket(node, SOCK_IN, "Rotation"); change_input_socket_to_rotation_type(ntree, *node, *socket); } - if (STR_ELEM(node->idname, "GeometryNodeDistributePointsOnFaces", "GeometryNodeObjectInfo")) { + if (STR_ELEM(node->idname, + "GeometryNodeDistributePointsOnFaces", + "GeometryNodeObjectInfo", + "GeometryNodeInputInstanceRotation")) + { bNodeSocket *socket = nodeFindSocket(node, SOCK_OUT, "Rotation"); change_output_socket_to_rotation_type(ntree, *node, *socket); } @@ -1391,39 +1395,37 @@ static void version_geometry_nodes_use_rotation_socket(bNodeTree &ntree) static bNodeTreeInterfaceItem *legacy_socket_move_to_interface(bNodeSocket &legacy_socket, const eNodeSocketInOut in_out) { - bNodeTreeInterfaceItem *new_item = static_cast( - MEM_mallocN(sizeof(bNodeTreeInterfaceSocket), __func__)); - new_item->item_type = NODE_INTERFACE_SOCKET; - bNodeTreeInterfaceSocket &new_socket = *reinterpret_cast(new_item); + bNodeTreeInterfaceSocket *new_socket = MEM_cnew(__func__); + new_socket->item.item_type = NODE_INTERFACE_SOCKET; /* Move reusable data. */ - new_socket.name = BLI_strdup(legacy_socket.name); - new_socket.identifier = BLI_strdup(legacy_socket.identifier); - new_socket.description = BLI_strdup(legacy_socket.description); - new_socket.socket_type = BLI_strdup(legacy_socket.idname); - new_socket.flag = (in_out == SOCK_IN ? NODE_INTERFACE_SOCKET_INPUT : - NODE_INTERFACE_SOCKET_OUTPUT); + new_socket->name = BLI_strdup(legacy_socket.name); + new_socket->identifier = BLI_strdup(legacy_socket.identifier); + new_socket->description = BLI_strdup(legacy_socket.description); + new_socket->socket_type = BLI_strdup(legacy_socket.idname); + new_socket->flag = (in_out == SOCK_IN ? NODE_INTERFACE_SOCKET_INPUT : + NODE_INTERFACE_SOCKET_OUTPUT); SET_FLAG_FROM_TEST( - new_socket.flag, legacy_socket.flag & SOCK_HIDE_VALUE, NODE_INTERFACE_SOCKET_HIDE_VALUE); - SET_FLAG_FROM_TEST(new_socket.flag, + new_socket->flag, legacy_socket.flag & SOCK_HIDE_VALUE, NODE_INTERFACE_SOCKET_HIDE_VALUE); + SET_FLAG_FROM_TEST(new_socket->flag, legacy_socket.flag & SOCK_HIDE_IN_MODIFIER, NODE_INTERFACE_SOCKET_HIDE_IN_MODIFIER); - new_socket.attribute_domain = legacy_socket.attribute_domain; + new_socket->attribute_domain = legacy_socket.attribute_domain; /* The following data are stolen from the old data, the ownership of their memory is directly * transferred to the new data. */ - new_socket.default_attribute_name = legacy_socket.default_attribute_name; + new_socket->default_attribute_name = legacy_socket.default_attribute_name; legacy_socket.default_attribute_name = nullptr; - new_socket.socket_data = legacy_socket.default_value; + new_socket->socket_data = legacy_socket.default_value; legacy_socket.default_value = nullptr; - new_socket.properties = legacy_socket.prop; + new_socket->properties = legacy_socket.prop; legacy_socket.prop = nullptr; /* Unused data. */ MEM_delete(legacy_socket.runtime); legacy_socket.runtime = nullptr; - return new_item; + return &new_socket->item; } static void versioning_convert_node_tree_socket_lists_to_interface(bNodeTree *ntree) @@ -1764,6 +1766,17 @@ static void versioning_nodes_dynamic_sockets(bNodeTree &ntree) } } +static void versioning_switch_node_dynamic_socket(bNodeTree &ntree) +{ + LISTBASE_FOREACH (bNode *, node, &ntree.nodes) { + if (node->type != GEO_NODE_SWITCH) { + continue; + } + version_socket_identifier_suffixes_for_dynamic_types(node->inputs, "_"); + version_socket_identifier_suffixes_for_dynamic_types(node->outputs, "_"); + } +} + static void versioning_grease_pencil_stroke_radii_scaling(GreasePencil *grease_pencil) { using namespace blender; @@ -1962,21 +1975,8 @@ void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain) } if (!MAIN_VERSION_FILE_ATLEAST(bmain, 400, 14)) { - if (!DNA_struct_member_exists( - fd->filesdna, "SceneEEVEE", "RaytraceEEVEE", "reflection_options")) { + if (!DNA_struct_member_exists(fd->filesdna, "SceneEEVEE", "int", "ray_tracing_method")) { LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { - scene->eevee.reflection_options.flag = RAYTRACE_EEVEE_USE_DENOISE; - scene->eevee.reflection_options.denoise_stages = RAYTRACE_EEVEE_DENOISE_SPATIAL | - RAYTRACE_EEVEE_DENOISE_TEMPORAL | - RAYTRACE_EEVEE_DENOISE_BILATERAL; - scene->eevee.reflection_options.screen_trace_quality = 0.25f; - scene->eevee.reflection_options.screen_trace_thickness = 0.2f; - scene->eevee.reflection_options.sample_clamp = 10.0f; - scene->eevee.reflection_options.resolution_scale = 2; - - scene->eevee.refraction_options = scene->eevee.reflection_options; - - scene->eevee.ray_split_settings = 0; scene->eevee.ray_tracing_method = RAYTRACE_EEVEE_METHOD_SCREEN; } } @@ -2274,13 +2274,6 @@ void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain) light->shadow_trace_distance = default_light.shadow_trace_distance; } } - - if (!DNA_struct_member_exists(fd->filesdna, "SceneEEVEE", "RaytraceEEVEE", "diffuse_options")) - { - LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { - scene->eevee.diffuse_options = scene->eevee.reflection_options; - } - } } if (!MAIN_VERSION_FILE_ATLEAST(bmain, 400, 28)) { @@ -2523,22 +2516,6 @@ void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain) } if (!MAIN_VERSION_FILE_ATLEAST(bmain, 401, 9)) { - LISTBASE_FOREACH (bNodeTree *, ntree, &bmain->nodetrees) { - if (ntree->type == NTREE_GEOMETRY) { - version_geometry_nodes_use_rotation_socket(*ntree); - } - } - - if (!DNA_struct_member_exists( - fd->filesdna, "RaytraceEEVEE", "float", "screen_trace_max_roughness")) - { - LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { - scene->eevee.reflection_options.screen_trace_max_roughness = 0.5f; - scene->eevee.refraction_options.screen_trace_max_roughness = 0.5f; - scene->eevee.diffuse_options.screen_trace_max_roughness = 0.5f; - } - } - if (!DNA_struct_member_exists(fd->filesdna, "Material", "char", "displacement_method")) { /* Replace Cycles.displacement_method by Material::displacement_method. */ LISTBASE_FOREACH (Material *, material, &bmain->materials) { @@ -2591,6 +2568,28 @@ void blo_do_versions_400(FileData *fd, Library * /*lib*/, Main *bmain) */ { /* Keep this block, even when empty. */ + + if (!DNA_struct_member_exists( + fd->filesdna, "SceneEEVEE", "RaytraceEEVEE", "ray_tracing_options")) { + LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { + scene->eevee.ray_tracing_options.flag = RAYTRACE_EEVEE_USE_DENOISE; + scene->eevee.ray_tracing_options.denoise_stages = RAYTRACE_EEVEE_DENOISE_SPATIAL | + RAYTRACE_EEVEE_DENOISE_TEMPORAL | + RAYTRACE_EEVEE_DENOISE_BILATERAL; + scene->eevee.ray_tracing_options.screen_trace_quality = 0.25f; + scene->eevee.ray_tracing_options.screen_trace_thickness = 0.2f; + scene->eevee.ray_tracing_options.screen_trace_max_roughness = 0.5f; + scene->eevee.ray_tracing_options.sample_clamp = 10.0f; + scene->eevee.ray_tracing_options.resolution_scale = 2; + } + } + + LISTBASE_FOREACH (bNodeTree *, ntree, &bmain->nodetrees) { + if (ntree->type == NTREE_GEOMETRY) { + version_geometry_nodes_use_rotation_socket(*ntree); + versioning_switch_node_dynamic_socket(*ntree); + } + } } /* Always run this versioning; meshes are written with the legacy format which always needs to diff --git a/source/blender/blenloader/intern/versioning_defaults.cc b/source/blender/blenloader/intern/versioning_defaults.cc index 655634f7c06..bbb5a34aa44 100644 --- a/source/blender/blenloader/intern/versioning_defaults.cc +++ b/source/blender/blenloader/intern/versioning_defaults.cc @@ -599,7 +599,7 @@ void BLO_update_defaults_startup_blend(Main *bmain, const char *app_template) /* For Sculpting template. */ if (app_template && STREQ(app_template, "Sculpting")) { mesh->remesh_voxel_size = 0.035f; - BKE_mesh_smooth_flag_set(mesh, false); + blender::bke::mesh_smooth_set(*mesh, false); } else { /* Remove sculpt-mask data in default mesh objects for all non-sculpt templates. */ diff --git a/source/blender/blenloader/intern/writefile.cc b/source/blender/blenloader/intern/writefile.cc index ac2195e92c1..d92276ec10f 100644 --- a/source/blender/blenloader/intern/writefile.cc +++ b/source/blender/blenloader/intern/writefile.cc @@ -1232,6 +1232,22 @@ static bool write_file_handle(Main *mainvar, * asap afterward. */ id_lib_extern(id_iter); } + else if (GS(id_iter->name) == ID_SCE) { + /* For scenes, do not force them into 'indirectly linked' status. + * The main reason is that scenes typically have no users, so most linked scene would be + * systematically 'lost' on file save. + * + * While this change re-introduces the 'no-more-used data laying around in files for + * ever' issue when it comes to scenes, this solution seems to be the most sensible one + * for the time being, considering that: + * - Scene are a top-level container. + * - Linked scenes are typically explicitly linked by the user. + * - Cases where scenes would be indirectly linked by other data (e.g. when linking a + * collection or material) can be considered at the very least as not following sane + * practice in data dependencies. + * - There are typically not hundreds of scenes in a file, and they are always very + * easily discoverable and browsable from the main UI. */ + } else { id_iter->tag |= LIB_TAG_INDIRECT; id_iter->tag &= ~LIB_TAG_EXTERN; diff --git a/source/blender/bmesh/intern/bmesh_construct.cc b/source/blender/bmesh/intern/bmesh_construct.cc index ff7f7ab5c24..76484dcea9b 100644 --- a/source/blender/bmesh/intern/bmesh_construct.cc +++ b/source/blender/bmesh/intern/bmesh_construct.cc @@ -319,25 +319,29 @@ void BM_verts_sort_radial_plane(BMVert **vert_arr, int len) void BM_elem_attrs_copy(BMesh *bm, const BMCustomDataCopyMap &map, const BMVert *src, BMVert *dst) { + BLI_assert(src != dst); CustomData_bmesh_copy_block(bm->vdata, map, src->head.data, &dst->head.data); dst->head.hflag = src->head.hflag & ~BM_ELEM_SELECT; copy_v3_v3(dst->no, src->no); } void BM_elem_attrs_copy(BMesh *bm, const BMCustomDataCopyMap &map, const BMEdge *src, BMEdge *dst) { - CustomData_bmesh_copy_block(bm->vdata, map, src->head.data, &dst->head.data); + BLI_assert(src != dst); + CustomData_bmesh_copy_block(bm->edata, map, src->head.data, &dst->head.data); dst->head.hflag = src->head.hflag & ~BM_ELEM_SELECT; } void BM_elem_attrs_copy(BMesh *bm, const BMCustomDataCopyMap &map, const BMFace *src, BMFace *dst) { - CustomData_bmesh_copy_block(bm->vdata, map, src->head.data, &dst->head.data); + BLI_assert(src != dst); + CustomData_bmesh_copy_block(bm->pdata, map, src->head.data, &dst->head.data); dst->head.hflag = src->head.hflag & ~BM_ELEM_SELECT; copy_v3_v3(dst->no, src->no); dst->mat_nr = src->mat_nr; } void BM_elem_attrs_copy(BMesh *bm, const BMCustomDataCopyMap &map, const BMLoop *src, BMLoop *dst) { - CustomData_bmesh_copy_block(bm->vdata, map, src->head.data, &dst->head.data); + BLI_assert(src != dst); + CustomData_bmesh_copy_block(bm->ldata, map, src->head.data, &dst->head.data); dst->head.hflag = src->head.hflag & ~BM_ELEM_SELECT; } @@ -415,7 +419,7 @@ static BMFace *bm_mesh_copy_new_face(BMesh *bm_new, /* use totface in case adding some faces fails */ BM_elem_index_set(f_new, (bm_new->totface - 1)); /* set_inline */ - CustomData_bmesh_copy_block(bm_new->vdata, face_map, f->head.data, &f_new->head.data); + CustomData_bmesh_copy_block(bm_new->pdata, face_map, f->head.data, &f_new->head.data); copy_v3_v3(f_new->no, f->no); f_new->mat_nr = f->mat_nr; f_new->head.hflag = f->head.hflag; /* low level! don't do this for normal api use */ @@ -423,7 +427,7 @@ static BMFace *bm_mesh_copy_new_face(BMesh *bm_new, j = 0; l_iter = l_first = BM_FACE_FIRST_LOOP(f_new); do { - CustomData_bmesh_copy_block(bm_new->vdata, loop_map, loops[j]->head.data, &l_iter->head.data); + CustomData_bmesh_copy_block(bm_new->ldata, loop_map, loops[j]->head.data, &l_iter->head.data); l_iter->head.hflag = loops[j]->head.hflag & ~BM_ELEM_SELECT; j++; } while ((l_iter = l_iter->next) != l_first); @@ -591,7 +595,7 @@ BMesh *BM_mesh_copy(BMesh *bm_old) e, BM_CREATE_SKIP_CD); - CustomData_bmesh_copy_block(bm_new->edata, vert_map, e->head.data, &e_new->head.data); + CustomData_bmesh_copy_block(bm_new->edata, edge_map, e->head.data, &e_new->head.data); e_new->head.hflag = e->head.hflag; /* low level! don't do this for normal api use */ etable[i] = e_new; BM_elem_index_set(e, i); /* set_inline */ diff --git a/source/blender/bmesh/intern/bmesh_mesh_convert.cc b/source/blender/bmesh/intern/bmesh_mesh_convert.cc index 0f86c489339..1ed70dd75c8 100644 --- a/source/blender/bmesh/intern/bmesh_mesh_convert.cc +++ b/source/blender/bmesh/intern/bmesh_mesh_convert.cc @@ -212,6 +212,7 @@ static void mesh_attributes_copy_to_bmesh_block(CustomData &data, void BM_mesh_bm_from_me(BMesh *bm, const Mesh *mesh, const BMeshFromMeshParams *params) { + using namespace blender; if (!mesh) { /* Sanity check. */ return; @@ -410,26 +411,17 @@ void BM_mesh_bm_from_me(BMesh *bm, const Mesh *mesh, const BMeshFromMeshParams * CustomData_get_offset(&bm->vdata, CD_SHAPE_KEYINDEX) : -1; - const bool *select_vert = (const bool *)CustomData_get_layer_named( - &mesh->vert_data, CD_PROP_BOOL, ".select_vert"); - const bool *select_edge = (const bool *)CustomData_get_layer_named( - &mesh->edge_data, CD_PROP_BOOL, ".select_edge"); - const bool *select_poly = (const bool *)CustomData_get_layer_named( - &mesh->face_data, CD_PROP_BOOL, ".select_poly"); - const bool *hide_vert = (const bool *)CustomData_get_layer_named( - &mesh->vert_data, CD_PROP_BOOL, ".hide_vert"); - const bool *hide_edge = (const bool *)CustomData_get_layer_named( - &mesh->edge_data, CD_PROP_BOOL, ".hide_edge"); - const bool *hide_poly = (const bool *)CustomData_get_layer_named( - &mesh->face_data, CD_PROP_BOOL, ".hide_poly"); - const int *material_indices = (const int *)CustomData_get_layer_named( - &mesh->face_data, CD_PROP_INT32, "material_index"); - const bool *sharp_faces = (const bool *)CustomData_get_layer_named( - &mesh->face_data, CD_PROP_BOOL, "sharp_face"); - const bool *sharp_edges = (const bool *)CustomData_get_layer_named( - &mesh->edge_data, CD_PROP_BOOL, "sharp_edge"); - const bool *uv_seams = (const bool *)CustomData_get_layer_named( - &mesh->edge_data, CD_PROP_BOOL, ".uv_seam"); + const bke::AttributeAccessor attributes = mesh->attributes(); + const VArraySpan select_vert = *attributes.lookup(".select_vert", ATTR_DOMAIN_POINT); + const VArraySpan select_edge = *attributes.lookup(".select_edge", ATTR_DOMAIN_EDGE); + const VArraySpan select_poly = *attributes.lookup(".select_poly", ATTR_DOMAIN_FACE); + const VArraySpan hide_vert = *attributes.lookup(".hide_vert", ATTR_DOMAIN_POINT); + const VArraySpan hide_edge = *attributes.lookup(".hide_edge", ATTR_DOMAIN_EDGE); + const VArraySpan hide_poly = *attributes.lookup(".hide_poly", ATTR_DOMAIN_FACE); + const VArraySpan material_indices = *attributes.lookup("material_index", ATTR_DOMAIN_FACE); + const VArraySpan sharp_faces = *attributes.lookup("sharp_face", ATTR_DOMAIN_FACE); + const VArraySpan sharp_edges = *attributes.lookup("sharp_edge", ATTR_DOMAIN_EDGE); + const VArraySpan uv_seams = *attributes.lookup(".uv_seam", ATTR_DOMAIN_EDGE); const Span positions = mesh->vert_positions(); Array vtable(mesh->totvert); @@ -438,10 +430,10 @@ void BM_mesh_bm_from_me(BMesh *bm, const Mesh *mesh, const BMeshFromMeshParams * bm, keyco ? keyco[i] : positions[i], nullptr, BM_CREATE_SKIP_CD); BM_elem_index_set(v, i); /* set_ok */ - if (hide_vert && hide_vert[i]) { + if (!hide_vert.is_empty() && hide_vert[i]) { BM_elem_flag_enable(v, BM_ELEM_HIDDEN); } - if (select_vert && select_vert[i]) { + if (!select_vert.is_empty() && select_vert[i]) { BM_vert_select_set(bm, v, true); } @@ -476,16 +468,16 @@ void BM_mesh_bm_from_me(BMesh *bm, const Mesh *mesh, const BMeshFromMeshParams * BM_elem_index_set(e, i); /* set_ok */ e->head.hflag = 0; - if (uv_seams && uv_seams[i]) { + if (!uv_seams.is_empty() && uv_seams[i]) { BM_elem_flag_enable(e, BM_ELEM_SEAM); } - if (hide_edge && hide_edge[i]) { + if (!hide_edge.is_empty() && hide_edge[i]) { BM_elem_flag_enable(e, BM_ELEM_HIDDEN); } - if (select_edge && select_edge[i]) { + if (!select_edge.is_empty() && select_edge[i]) { BM_edge_select_set(bm, e, true); } - if (!(sharp_edges && sharp_edges[i])) { + if (!(!sharp_edges.is_empty() && sharp_edges[i])) { BM_elem_flag_enable(e, BM_ELEM_SMOOTH); } @@ -529,17 +521,17 @@ void BM_mesh_bm_from_me(BMesh *bm, const Mesh *mesh, const BMeshFromMeshParams * BM_elem_index_set(f, bm->totface - 1); /* set_ok */ /* Transfer flag. */ - if (!(sharp_faces && sharp_faces[i])) { + if (!(!sharp_faces.is_empty() && sharp_faces[i])) { BM_elem_flag_enable(f, BM_ELEM_SMOOTH); } - if (hide_poly && hide_poly[i]) { + if (!hide_poly.is_empty() && hide_poly[i]) { BM_elem_flag_enable(f, BM_ELEM_HIDDEN); } - if (select_poly && select_poly[i]) { + if (!select_poly.is_empty() && select_poly[i]) { BM_face_select_set(bm, f, true); } - f->mat_nr = material_indices == nullptr ? 0 : material_indices[i]; + f->mat_nr = material_indices.is_empty() ? 0 : material_indices[i]; if (i == mesh->act_face) { bm->act_face = f; } diff --git a/source/blender/compositor/CMakeLists.txt b/source/blender/compositor/CMakeLists.txt index 070b27bb6e1..0a726e650a1 100644 --- a/source/blender/compositor/CMakeLists.txt +++ b/source/blender/compositor/CMakeLists.txt @@ -10,6 +10,7 @@ if(WITH_COMPOSITOR_CPU) intern nodes operations + realtime_compositor ../blenkernel ../blentranslation ../imbuf @@ -117,8 +118,6 @@ if(WITH_COMPOSITOR_CPU) nodes/COM_MaskNode.h nodes/COM_MovieClipNode.cc nodes/COM_MovieClipNode.h - nodes/COM_OutputFileNode.cc - nodes/COM_OutputFileNode.h nodes/COM_RenderLayersNode.cc nodes/COM_RenderLayersNode.h nodes/COM_SceneTimeNode.cc @@ -139,6 +138,8 @@ if(WITH_COMPOSITOR_CPU) # output nodes nodes/COM_CompositorNode.cc nodes/COM_CompositorNode.h + nodes/COM_FileOutputNode.cc + nodes/COM_FileOutputNode.h nodes/COM_ViewLevelsNode.cc nodes/COM_ViewLevelsNode.h nodes/COM_ViewerNode.cc @@ -419,10 +420,8 @@ if(WITH_COMPOSITOR_CPU) operations/COM_CompositorOperation.h operations/COM_ConvertDepthToRadiusOperation.cc operations/COM_ConvertDepthToRadiusOperation.h - operations/COM_OutputFileMultiViewOperation.cc - operations/COM_OutputFileMultiViewOperation.h - operations/COM_OutputFileOperation.cc - operations/COM_OutputFileOperation.h + operations/COM_FileOutputOperation.cc + operations/COM_FileOutputOperation.h operations/COM_PreviewOperation.cc operations/COM_PreviewOperation.h operations/COM_SplitOperation.cc @@ -602,6 +601,7 @@ if(WITH_COMPOSITOR_CPU) PRIVATE bf::dna PRIVATE bf::intern::clog PRIVATE bf::intern::guardedalloc + bf_realtime_compositor extern_clew PRIVATE bf::intern::atomic ) diff --git a/source/blender/compositor/COM_compositor.hh b/source/blender/compositor/COM_compositor.hh index 956554463ce..3f4e58e78ef 100644 --- a/source/blender/compositor/COM_compositor.hh +++ b/source/blender/compositor/COM_compositor.hh @@ -7,6 +7,10 @@ #include "DNA_color_types.h" #include "DNA_node_types.h" +namespace blender::realtime_compositor { +class RenderContext; +} + struct Render; /* Keep ascii art. */ @@ -332,7 +336,8 @@ void COM_execute(Render *render, Scene *scene, bNodeTree *node_tree, bool rendering, - const char *view_name); + const char *view_name, + blender::realtime_compositor::RenderContext *render_context); /** * \brief Deinitialize the compositor caches and allocated memory. diff --git a/source/blender/compositor/intern/COM_CompositorContext.h b/source/blender/compositor/intern/COM_CompositorContext.h index 1fc3187d680..dbe3851aede 100644 --- a/source/blender/compositor/intern/COM_CompositorContext.h +++ b/source/blender/compositor/intern/COM_CompositorContext.h @@ -12,6 +12,10 @@ struct bNodeInstanceHash; +namespace blender::realtime_compositor { +class RenderContext; +} + namespace blender::compositor { /** @@ -70,6 +74,12 @@ class CompositorContext { */ const char *view_name_; + /** + * \brief Render context that contains information about active render. Can be null if the + * compositor is not executing as part of the render pipeline. + */ + realtime_compositor::RenderContext *render_context_; + public: /** * \brief constructor initializes the context with default values. @@ -192,6 +202,22 @@ class CompositorContext { return view_name_ && view_name_[0] != '\0'; } + /** + * \brief get the render context + */ + realtime_compositor::RenderContext *get_render_context() const + { + return render_context_; + } + + /** + * \brief set the render context + */ + void set_render_context(realtime_compositor::RenderContext *render_context) + { + render_context_ = render_context; + } + /** * \brief get the active rendering view */ diff --git a/source/blender/compositor/intern/COM_ConstantFolder.cc b/source/blender/compositor/intern/COM_ConstantFolder.cc index cf9d39551f4..817fab1660b 100644 --- a/source/blender/compositor/intern/COM_ConstantFolder.cc +++ b/source/blender/compositor/intern/COM_ConstantFolder.cc @@ -119,7 +119,7 @@ Vector ConstantFolder::get_constant_input_buffers(NodeOperation Vector ConstantFolder::try_fold_operations(Span operations) { Set foldable_ops = find_constant_foldable_operations(operations); - if (foldable_ops.size() == 0) { + if (foldable_ops.is_empty()) { return Vector(); } diff --git a/source/blender/compositor/intern/COM_Converter.cc b/source/blender/compositor/intern/COM_Converter.cc index 43d03a475fc..57f03db7e40 100644 --- a/source/blender/compositor/intern/COM_Converter.cc +++ b/source/blender/compositor/intern/COM_Converter.cc @@ -50,6 +50,7 @@ #include "COM_DistanceMatteNode.h" #include "COM_DoubleEdgeMaskNode.h" #include "COM_EllipseMaskNode.h" +#include "COM_FileOutputNode.h" #include "COM_FilterNode.h" #include "COM_FlipNode.h" #include "COM_GammaNode.h" @@ -75,7 +76,6 @@ #include "COM_MovieDistortionNode.h" #include "COM_NormalNode.h" #include "COM_NormalizeNode.h" -#include "COM_OutputFileNode.h" #include "COM_PixelateNode.h" #include "COM_PlaneTrackDeformNode.h" #include "COM_PosterizeNode.h" @@ -347,7 +347,7 @@ Node *COM_convert_bnode(bNode *b_node) node = new ColorSpillNode(b_node); break; case CMP_NODE_OUTPUT_FILE: - node = new OutputFileNode(b_node); + node = new FileOutputNode(b_node); break; case CMP_NODE_MAP_VALUE: node = new MapValueNode(b_node); diff --git a/source/blender/compositor/intern/COM_ExecutionSystem.cc b/source/blender/compositor/intern/COM_ExecutionSystem.cc index d2bd9b52a8a..5740ec26333 100644 --- a/source/blender/compositor/intern/COM_ExecutionSystem.cc +++ b/source/blender/compositor/intern/COM_ExecutionSystem.cc @@ -24,9 +24,11 @@ ExecutionSystem::ExecutionSystem(RenderData *rd, bNodeTree *editingtree, bool rendering, bool fastcalculation, - const char *view_name) + const char *view_name, + realtime_compositor::RenderContext *render_context) { num_work_threads_ = WorkScheduler::get_num_cpu_threads(); + context_.set_render_context(render_context); context_.set_view_name(view_name); context_.set_scene(scene); context_.set_bnodetree(editingtree); diff --git a/source/blender/compositor/intern/COM_ExecutionSystem.h b/source/blender/compositor/intern/COM_ExecutionSystem.h index 074afff2736..4e367a73248 100644 --- a/source/blender/compositor/intern/COM_ExecutionSystem.h +++ b/source/blender/compositor/intern/COM_ExecutionSystem.h @@ -20,6 +20,10 @@ #include "DNA_scene_types.h" #include "DNA_vec_types.h" +namespace blender::realtime_compositor { +class RenderContext; +} + namespace blender::compositor { /** @@ -161,7 +165,8 @@ class ExecutionSystem { bNodeTree *editingtree, bool rendering, bool fastcalculation, - const char *view_name); + const char *view_name, + realtime_compositor::RenderContext *render_context); /** * Destructor diff --git a/source/blender/compositor/intern/COM_MetaData.cc b/source/blender/compositor/intern/COM_MetaData.cc index 4049bf6261a..f885b201f5a 100644 --- a/source/blender/compositor/intern/COM_MetaData.cc +++ b/source/blender/compositor/intern/COM_MetaData.cc @@ -51,6 +51,14 @@ void MetaData::add_to_render_result(RenderResult *render_result) const } } +void MetaData::for_each_entry( + FunctionRef callback) const +{ + for (MapItem entry : entries_.items()) { + callback(entry.key, entry.value); + } +} + void MetaDataExtractCallbackData::add_meta_data(blender::StringRef key, blender::StringRefNull value) { diff --git a/source/blender/compositor/intern/COM_MetaData.h b/source/blender/compositor/intern/COM_MetaData.h index 20a7244dfae..bf4def6ae21 100644 --- a/source/blender/compositor/intern/COM_MetaData.h +++ b/source/blender/compositor/intern/COM_MetaData.h @@ -7,6 +7,7 @@ #include #include "BKE_cryptomatte.hh" +#include "BLI_function_ref.hh" #include "BLI_map.hh" #include "MEM_guardedalloc.h" @@ -44,6 +45,8 @@ class MetaData { */ void replace_hash_neutral_cryptomatte_keys(const blender::StringRef layer_name); void add_to_render_result(RenderResult *render_result) const; + /* Invokes the given callback on each entry of the meta data. */ + void for_each_entry(FunctionRef callback) const; #ifdef WITH_CXX_GUARDEDALLOC MEM_CXX_CLASS_ALLOC_FUNCS("COM:MetaData") #endif diff --git a/source/blender/compositor/intern/COM_NodeOperation.cc b/source/blender/compositor/intern/COM_NodeOperation.cc index 2f10cd91236..42b07576b17 100644 --- a/source/blender/compositor/intern/COM_NodeOperation.cc +++ b/source/blender/compositor/intern/COM_NodeOperation.cc @@ -194,7 +194,7 @@ const rcti &NodeOperation::get_canvas() const void NodeOperation::unset_canvas() { - BLI_assert(inputs_.size() == 0); + BLI_assert(inputs_.is_empty()); flags_.is_canvas_set = false; } @@ -217,7 +217,7 @@ bool NodeOperation::determine_depending_area_of_interest(rcti *input, ReadBufferOperation *read_operation, rcti *output) { - if (inputs_.size() == 0) { + if (inputs_.is_empty()) { BLI_rcti_init(output, input->xmin, input->xmax, input->ymin, input->ymax); return false; } diff --git a/source/blender/compositor/intern/COM_compositor.cc b/source/blender/compositor/intern/COM_compositor.cc index 80a3c75e6aa..ea73f8c87d2 100644 --- a/source/blender/compositor/intern/COM_compositor.cc +++ b/source/blender/compositor/intern/COM_compositor.cc @@ -54,7 +54,8 @@ void COM_execute(Render *render, Scene *scene, bNodeTree *node_tree, bool rendering, - const char *view_name) + const char *view_name, + blender::realtime_compositor::RenderContext *render_context) { /* Initialize mutex, TODO: this mutex init is actually not thread safe and * should be done somewhere as part of blender startup, all the other @@ -80,7 +81,8 @@ void COM_execute(Render *render, node_tree->execution_mode == NTREE_EXECUTION_MODE_REALTIME) { /* Realtime GPU compositor. */ - RE_compositor_execute(*render, *scene, *render_data, *node_tree, rendering, view_name); + RE_compositor_execute( + *render, *scene, *render_data, *node_tree, rendering, view_name, render_context); } else { /* Tiled and Full Frame compositors. */ @@ -94,7 +96,7 @@ void COM_execute(Render *render, const bool twopass = (node_tree->flag & NTREE_TWO_PASS) && !rendering; if (twopass) { blender::compositor::ExecutionSystem fast_pass( - render_data, scene, node_tree, rendering, true, view_name); + render_data, scene, node_tree, rendering, true, view_name, render_context); fast_pass.execute(); if (node_tree->runtime->test_break(node_tree->runtime->tbh)) { @@ -104,7 +106,7 @@ void COM_execute(Render *render, } blender::compositor::ExecutionSystem system( - render_data, scene, node_tree, rendering, false, view_name); + render_data, scene, node_tree, rendering, false, view_name, render_context); system.execute(); } diff --git a/source/blender/compositor/nodes/COM_CryptomatteNode.cc b/source/blender/compositor/nodes/COM_CryptomatteNode.cc index 209264d09ad..59922e59df0 100644 --- a/source/blender/compositor/nodes/COM_CryptomatteNode.cc +++ b/source/blender/compositor/nodes/COM_CryptomatteNode.cc @@ -204,10 +204,10 @@ Vector CryptomatteNode::create_input_operations(const Composito { Vector input_operations; switch (node.custom1) { - case CMP_CRYPTOMATTE_SRC_RENDER: + case CMP_NODE_CRYPTOMATTE_SOURCE_RENDER: input_operations_from_render_source(context, node, input_operations); break; - case CMP_CRYPTOMATTE_SRC_IMAGE: + case CMP_NODE_CRYPTOMATTE_SOURCE_IMAGE: input_operations_from_image_source(context, node, input_operations); break; } diff --git a/source/blender/compositor/nodes/COM_FileOutputNode.cc b/source/blender/compositor/nodes/COM_FileOutputNode.cc new file mode 100644 index 00000000000..df921b9bf7f --- /dev/null +++ b/source/blender/compositor/nodes/COM_FileOutputNode.cc @@ -0,0 +1,45 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "COM_FileOutputNode.h" + +#include "BLI_string.h" + +namespace blender::compositor { + +FileOutputNode::FileOutputNode(bNode *editor_node) : Node(editor_node) +{ + /* pass */ +} + +void FileOutputNode::convert_to_operations(NodeConverter &converter, + const CompositorContext &context) const +{ + for (NodeInput *input : inputs_) { + if (input->is_linked()) { + converter.add_node_input_preview(input); + break; + } + } + + if (!context.is_rendering()) { + return; + } + + Vector inputs; + for (NodeInput *input : inputs_) { + auto *storage = static_cast(input->get_bnode_socket()->storage); + inputs.append(FileOutputInput(storage, input->get_data_type())); + } + + auto *storage = static_cast(this->get_bnode()->storage); + auto *output_operation = new FileOutputOperation(&context, storage, inputs); + converter.add_operation(output_operation); + + for (int i = 0; i < inputs_.size(); i++) { + converter.map_input_socket(inputs_[i], output_operation->get_input_socket(i)); + } +} + +} // namespace blender::compositor diff --git a/source/blender/compositor/nodes/COM_FileOutputNode.h b/source/blender/compositor/nodes/COM_FileOutputNode.h new file mode 100644 index 00000000000..4dd991b24d2 --- /dev/null +++ b/source/blender/compositor/nodes/COM_FileOutputNode.h @@ -0,0 +1,26 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#include "COM_Node.h" + +#include "COM_FileOutputOperation.h" + +#include "DNA_node_types.h" + +namespace blender::compositor { + +/** + * \brief FileOutputNode + * \ingroup Node + */ +class FileOutputNode : public Node { + public: + FileOutputNode(bNode *editor_node); + void convert_to_operations(NodeConverter &converter, + const CompositorContext &context) const override; +}; + +} // namespace blender::compositor diff --git a/source/blender/compositor/nodes/COM_OutputFileNode.cc b/source/blender/compositor/nodes/COM_OutputFileNode.cc deleted file mode 100644 index e2d82ca7d60..00000000000 --- a/source/blender/compositor/nodes/COM_OutputFileNode.cc +++ /dev/null @@ -1,160 +0,0 @@ -/* SPDX-FileCopyrightText: 2011 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include "COM_OutputFileNode.h" - -#include "BLI_string.h" - -namespace blender::compositor { - -OutputFileNode::OutputFileNode(bNode *editor_node) : Node(editor_node) -{ - /* pass */ -} - -void OutputFileNode::add_input_sockets(OutputOpenExrMultiLayerOperation &operation) const -{ - for (NodeInput *input : inputs_) { - NodeImageMultiFileSocket *sockdata = - (NodeImageMultiFileSocket *)input->get_bnode_socket()->storage; - /* NOTE: layer becomes an empty placeholder if the input is not linked. */ - operation.add_layer(sockdata->layer, input->get_data_type(), input->is_linked()); - } -} - -void OutputFileNode::map_input_sockets(NodeConverter &converter, - OutputOpenExrMultiLayerOperation &operation) const -{ - bool preview_added = false; - int index = 0; - for (NodeInput *input : inputs_) { - converter.map_input_socket(input, operation.get_input_socket(index++)); - - if (!preview_added) { - converter.add_node_input_preview(input); - preview_added = true; - } - } -} - -void OutputFileNode::add_preview_to_first_linked_input(NodeConverter &converter) const -{ - if (get_input_sockets().is_empty()) { - return; - } - - NodeInput *first_socket = this->get_input_socket(0); - if (first_socket->is_linked()) { - converter.add_node_input_preview(first_socket); - } -} - -void OutputFileNode::convert_to_operations(NodeConverter &converter, - const CompositorContext &context) const -{ - const NodeImageMultiFile *storage = (const NodeImageMultiFile *)this->get_bnode()->storage; - const bool is_multiview = (context.get_render_data()->scemode & R_MULTIVIEW) != 0; - - add_preview_to_first_linked_input(converter); - - if (!context.is_rendering()) { - /* only output files when rendering a sequence - - * otherwise, it overwrites the output files just - * scrubbing through the timeline when the compositor updates. - */ - return; - } - - if (storage->format.imtype == R_IMF_IMTYPE_MULTILAYER) { - const bool use_half_float = (storage->format.depth == R_IMF_CHAN_DEPTH_16); - /* Single output operation for the multi-layer file. */ - OutputOpenExrMultiLayerOperation *output_operation; - - if (is_multiview && storage->format.views_format == R_IMF_VIEWS_MULTIVIEW) { - output_operation = new OutputOpenExrMultiLayerMultiViewOperation(context.get_scene(), - context.get_render_data(), - context.get_bnodetree(), - storage->base_path, - storage->format.exr_codec, - use_half_float, - context.get_view_name()); - } - else { - output_operation = new OutputOpenExrMultiLayerOperation(context.get_scene(), - context.get_render_data(), - context.get_bnodetree(), - storage->base_path, - storage->format.exr_codec, - use_half_float, - context.get_view_name()); - } - converter.add_operation(output_operation); - - /* First add all inputs. Inputs are stored in a Vector and can be moved to a different - * memory address during this time. */ - add_input_sockets(*output_operation); - /* After adding the sockets the memory addresses will stick. */ - map_input_sockets(converter, *output_operation); - } - else { /* single layer format */ - for (NodeInput *input : inputs_) { - if (input->is_linked()) { - NodeImageMultiFileSocket *sockdata = - (NodeImageMultiFileSocket *)input->get_bnode_socket()->storage; - const ImageFormatData *format = (sockdata->use_node_format ? &storage->format : - &sockdata->format); - char path[FILE_MAX]; - - /* combine file path for the input */ - if (sockdata->path[0]) { - BLI_path_join(path, FILE_MAX, storage->base_path, sockdata->path); - } - else { - STRNCPY(path, storage->base_path); - BLI_path_slash_ensure(path, FILE_MAX); - } - - NodeOperation *output_operation = nullptr; - - if (is_multiview && format->views_format == R_IMF_VIEWS_MULTIVIEW) { - output_operation = new OutputOpenExrSingleLayerMultiViewOperation( - context.get_scene(), - context.get_render_data(), - context.get_bnodetree(), - input->get_data_type(), - format, - path, - context.get_view_name(), - sockdata->save_as_render); - } - else if ((!is_multiview) || (format->views_format == R_IMF_VIEWS_INDIVIDUAL)) { - output_operation = new OutputSingleLayerOperation(context.get_scene(), - context.get_render_data(), - context.get_bnodetree(), - input->get_data_type(), - format, - path, - context.get_view_name(), - sockdata->save_as_render); - } - else { /* R_IMF_VIEWS_STEREO_3D */ - output_operation = new OutputStereoOperation(context.get_scene(), - context.get_render_data(), - context.get_bnodetree(), - input->get_data_type(), - format, - path, - sockdata->layer, - context.get_view_name(), - sockdata->save_as_render); - } - - converter.add_operation(output_operation); - converter.map_input_socket(input, output_operation->get_input_socket(0)); - } - } - } -} - -} // namespace blender::compositor diff --git a/source/blender/compositor/nodes/COM_OutputFileNode.h b/source/blender/compositor/nodes/COM_OutputFileNode.h deleted file mode 100644 index 6ada74f3057..00000000000 --- a/source/blender/compositor/nodes/COM_OutputFileNode.h +++ /dev/null @@ -1,32 +0,0 @@ -/* SPDX-FileCopyrightText: 2011 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -#include "COM_Node.h" - -#include "COM_OutputFileMultiViewOperation.h" - -#include "DNA_node_types.h" - -namespace blender::compositor { - -/** - * \brief OutputFileNode - * \ingroup Node - */ -class OutputFileNode : public Node { - public: - OutputFileNode(bNode *editor_node); - void convert_to_operations(NodeConverter &converter, - const CompositorContext &context) const override; - - private: - void add_preview_to_first_linked_input(NodeConverter &converter) const; - void add_input_sockets(OutputOpenExrMultiLayerOperation &operation) const; - void map_input_sockets(NodeConverter &converter, - OutputOpenExrMultiLayerOperation &operation) const; -}; - -} // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_FileOutputOperation.cc b/source/blender/compositor/operations/COM_FileOutputOperation.cc new file mode 100644 index 00000000000..8d894bac6d4 --- /dev/null +++ b/source/blender/compositor/operations/COM_FileOutputOperation.cc @@ -0,0 +1,382 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include + +#include "BLI_fileops.h" +#include "BLI_path_util.h" +#include "BLI_string.h" +#include "BLI_string_utils.hh" +#include "BLI_utildefines.h" + +#include "DNA_node_types.h" +#include "DNA_scene_types.h" + +#include "BKE_image.h" +#include "BKE_image_format.h" +#include "BKE_main.hh" +#include "BKE_scene.h" + +#include "RE_pipeline.h" + +#include "COM_FileOutputOperation.h" +#include "COM_render_context.hh" + +namespace blender::compositor { + +FileOutputInput::FileOutputInput(NodeImageMultiFileSocket *data, DataType data_type) + : data(data), data_type(data_type) +{ +} + +static int get_channels_count(DataType datatype) +{ + switch (datatype) { + case DataType::Value: + return 1; + case DataType::Vector: + return 3; + case DataType::Color: + return 4; + default: + return 0; + } +} + +static float *initialize_buffer(uint width, uint height, DataType datatype) +{ + const int size = get_channels_count(datatype); + return static_cast( + MEM_malloc_arrayN(size_t(width) * height, sizeof(float) * size, "File Output Buffer.")); +} + +static void write_buffer_rect( + rcti *rect, SocketReader *reader, float *buffer, uint width, DataType datatype) +{ + + if (!buffer) { + return; + } + int x1 = rect->xmin; + int y1 = rect->ymin; + int x2 = rect->xmax; + int y2 = rect->ymax; + + int size = get_channels_count(datatype); + int offset = (y1 * width + x1) * size; + for (int y = y1; y < y2; y++) { + for (int x = x1; x < x2; x++) { + float color[4]; + reader->read_sampled(color, x, y, PixelSampler::Nearest); + + for (int i = 0; i < size; i++) { + buffer[offset + i] = color[i]; + } + offset += size; + } + offset += (width - (x2 - x1)) * size; + } +} + +FileOutputOperation::FileOutputOperation(const CompositorContext *context, + const NodeImageMultiFile *node_data, + Vector inputs) + : context_(context), node_data_(node_data), file_output_inputs_(inputs) +{ + for (const FileOutputInput &input : inputs) { + add_input_socket(input.data_type); + } + this->set_canvas_input_index(RESOLUTION_INPUT_ANY); +} + +void FileOutputOperation::init_execution() +{ + for (int i = 0; i < file_output_inputs_.size(); i++) { + FileOutputInput &input = file_output_inputs_[i]; + input.image_input = get_input_socket_reader(i); + if (!input.image_input) { + continue; + } + input.output_buffer = initialize_buffer(get_width(), get_height(), input.data_type); + } +} + +void FileOutputOperation::execute_region(rcti *rect, uint /*tile_number*/) +{ + for (int i = 0; i < file_output_inputs_.size(); i++) { + const FileOutputInput &input = file_output_inputs_[i]; + if (!input.image_input || !input.output_buffer) { + continue; + } + write_buffer_rect(rect, input.image_input, input.output_buffer, get_width(), input.data_type); + } +} + +void FileOutputOperation::update_memory_buffer_partial(MemoryBuffer * /*output*/, + const rcti &area, + Span inputs) +{ + for (int i = 0; i < file_output_inputs_.size(); i++) { + const FileOutputInput &input = file_output_inputs_[i]; + if (!input.output_buffer) { + continue; + } + int channels_count = get_channels_count(input.data_type); + MemoryBuffer output_buf(input.output_buffer, channels_count, get_width(), get_height()); + output_buf.copy_from(inputs[i], area, 0, inputs[i]->get_num_channels(), 0); + } +} + +static void add_meta_data_for_input(realtime_compositor::FileOutput &file_output, + const FileOutputInput &input) +{ + std::unique_ptr meta_data = input.image_input->get_meta_data(); + if (!meta_data) { + return; + } + + blender::StringRef layer_name = blender::bke::cryptomatte::BKE_cryptomatte_extract_layer_name( + blender::StringRef(input.data->layer, + BLI_strnlen(input.data->layer, sizeof(input.data->layer)))); + meta_data->replace_hash_neutral_cryptomatte_keys(layer_name); + meta_data->for_each_entry([&](const std::string &key, const std::string &value) { + file_output.add_meta_data(key, value); + }); +} + +void FileOutputOperation::deinit_execution() +{ + if (is_multi_layer()) { + execute_multi_layer(); + } + else { + execute_single_layer(); + } +} + +/* -------------------- + * Single Layer Images. + */ + +void FileOutputOperation::execute_single_layer() +{ + const int2 size = int2(get_width(), get_height()); + for (const FileOutputInput &input : file_output_inputs_) { + /* Unlinked input. */ + if (!input.image_input) { + continue; + } + + char base_path[FILE_MAX]; + get_single_layer_image_base_path(input.data->path, base_path); + + /* The image saving code expects EXR images to have a different structure than standard + * images. In particular, in EXR images, the buffers need to be stored in passes that are, in + * turn, stored in a render layer. On the other hand, in non-EXR images, the buffers need to + * be stored in views. An exception to this is stereo images, which needs to have the same + * structure as non-EXR images. */ + const auto &format = input.data->use_node_format ? node_data_->format : input.data->format; + const bool is_exr = format.imtype == R_IMF_IMTYPE_OPENEXR; + const int views_count = BKE_scene_multiview_num_views_get(context_->get_render_data()); + if (is_exr && !(format.views_format == R_IMF_VIEWS_STEREO_3D && views_count == 2)) { + execute_single_layer_multi_view_exr(input, format, base_path); + continue; + } + + char image_path[FILE_MAX]; + get_single_layer_image_path(base_path, format, image_path); + + realtime_compositor::FileOutput &file_output = context_->get_render_context()->get_file_output( + image_path, format, size, input.data->save_as_render); + + add_view_for_input(file_output, input, context_->get_view_name()); + + add_meta_data_for_input(file_output, input); + } +} + +/* ----------------------------------- + * Single Layer Multi-View EXR Images. + */ + +void FileOutputOperation::execute_single_layer_multi_view_exr(const FileOutputInput &input, + const ImageFormatData &format, + const char *base_path) +{ + const bool has_views = format.views_format != R_IMF_VIEWS_INDIVIDUAL; + + /* The EXR stores all views in the same file, so we supply an empty view to make sure the file + * name does not contain a view suffix. */ + char image_path[FILE_MAX]; + const char *path_view = has_views ? "" : context_->get_view_name(); + get_multi_layer_exr_image_path(base_path, path_view, image_path); + + const int2 size = int2(get_width(), get_height()); + realtime_compositor::FileOutput &file_output = context_->get_render_context()->get_file_output( + image_path, format, size, false); + + /* The EXR stores all views in the same file, so we add the actual render view. Otherwise, we + * add a default unnamed view. */ + const char *view_name = has_views ? context_->get_view_name() : ""; + file_output.add_view(view_name); + add_pass_for_input(file_output, input, "", view_name); + + add_meta_data_for_input(file_output, input); +} + +/* ----------------------- + * Multi-Layer EXR Images. + */ + +void FileOutputOperation::execute_multi_layer() +{ + const bool store_views_in_single_file = is_multi_view_exr(); + const char *view = context_->get_view_name(); + + /* If we are saving all views in a single multi-layer file, we supply an empty view to make + * sure the file name does not contain a view suffix. */ + char image_path[FILE_MAX]; + const char *write_view = store_views_in_single_file ? "" : view; + get_multi_layer_exr_image_path(get_base_path(), write_view, image_path); + + const int2 size = int2(get_width(), get_height()); + const ImageFormatData format = node_data_->format; + realtime_compositor::FileOutput &file_output = context_->get_render_context()->get_file_output( + image_path, format, size, false); + + /* If we are saving views in separate files, we needn't store the view in the channel names, so + * we add an unnamed view. */ + const char *pass_view = store_views_in_single_file ? view : ""; + file_output.add_view(pass_view); + + for (const FileOutputInput &input : file_output_inputs_) { + /* Unlinked input. */ + if (!input.image_input) { + continue; + } + + const char *pass_name = input.data->layer; + add_pass_for_input(file_output, input, pass_name, pass_view); + + add_meta_data_for_input(file_output, input); + } +} + +/* Add a pass of the given name, view, and input buffer. The pass channel identifiers follows the + * EXR conventions. */ +void FileOutputOperation::add_pass_for_input(realtime_compositor::FileOutput &file_output, + const FileOutputInput &input, + const char *pass_name, + const char *view_name) +{ + switch (input.data_type) { + case DataType::Color: + file_output.add_pass(pass_name, view_name, "RGBA", input.output_buffer); + break; + case DataType::Vector: + file_output.add_pass(pass_name, view_name, "XYZ", input.output_buffer); + break; + case DataType::Value: + file_output.add_pass(pass_name, view_name, "V", input.output_buffer); + break; + } +} + +/* Add a view of the given name and input buffer. */ +void FileOutputOperation::add_view_for_input(realtime_compositor::FileOutput &file_output, + const FileOutputInput &input, + const char *view_name) +{ + switch (input.data_type) { + case DataType::Color: + file_output.add_view(view_name, 4, input.output_buffer); + break; + case DataType::Vector: + file_output.add_view(view_name, 3, input.output_buffer); + break; + case DataType::Value: + file_output.add_view(view_name, 1, input.output_buffer); + break; + } +} + +/* Get the base path of the image to be saved, based on the base path of the node. The base name + * is an optional initial name of the image, which will later be concatenated with other + * information like the frame number, view, and extension. If the base name is empty, then the + * base path represents a directory, so a trailing slash is ensured. */ +void FileOutputOperation::get_single_layer_image_base_path(const char *base_name, char *base_path) +{ + if (base_name[0]) { + BLI_path_join(base_path, FILE_MAX, get_base_path(), base_name); + } + else { + BLI_strncpy(base_path, get_base_path(), FILE_MAX); + BLI_path_slash_ensure(base_path, FILE_MAX); + } +} + +/* Get the path of the image to be saved based on the given format. */ +void FileOutputOperation::get_single_layer_image_path(const char *base_path, + const ImageFormatData &format, + char *image_path) +{ + BKE_image_path_from_imformat(image_path, + base_path, + BKE_main_blendfile_path_from_global(), + context_->get_framenumber(), + &format, + use_file_extension(), + true, + nullptr); +} + +/* Get the path of the EXR image to be saved. If the given view is not empty, its corresponding + * file suffix will be appended to the name. */ +void FileOutputOperation::get_multi_layer_exr_image_path(const char *base_path, + const char *view, + char *image_path) +{ + const char *suffix = BKE_scene_multiview_view_suffix_get(context_->get_render_data(), view); + BKE_image_path_from_imtype(image_path, + base_path, + BKE_main_blendfile_path_from_global(), + context_->get_framenumber(), + R_IMF_IMTYPE_MULTILAYER, + use_file_extension(), + true, + suffix); +} + +bool FileOutputOperation::is_multi_layer() +{ + return node_data_->format.imtype == R_IMF_IMTYPE_MULTILAYER; +} + +const char *FileOutputOperation::get_base_path() +{ + return node_data_->base_path; +} + +/* Add the file format extensions to the rendered file name. */ +bool FileOutputOperation::use_file_extension() +{ + return context_->get_render_data()->scemode & R_EXTENSION; +} + +/* If true, save views in a multi-view EXR file, otherwise, save each view in its own file. */ +bool FileOutputOperation::is_multi_view_exr() +{ + if (!is_multi_view_scene()) { + return false; + } + + return node_data_->format.views_format == R_IMF_VIEWS_MULTIVIEW; +} + +bool FileOutputOperation::is_multi_view_scene() +{ + return context_->get_render_data()->scemode & R_MULTIVIEW; +} + +} // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_FileOutputOperation.h b/source/blender/compositor/operations/COM_FileOutputOperation.h new file mode 100644 index 00000000000..61d9ef0ae94 --- /dev/null +++ b/source/blender/compositor/operations/COM_FileOutputOperation.h @@ -0,0 +1,106 @@ +/* SPDX-FileCopyrightText: 2011 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#include "BLI_vector.hh" + +#include "DNA_node_types.h" + +#include "COM_CompositorContext.h" +#include "COM_MultiThreadedOperation.h" + +struct StampData; + +namespace blender::realtime_compositor { +class FileOutput; +} + +namespace blender::compositor { + +struct FileOutputInput { + FileOutputInput(NodeImageMultiFileSocket *data, DataType data_type); + + NodeImageMultiFileSocket *data; + DataType data_type; + + float *output_buffer = nullptr; + SocketReader *image_input = nullptr; +}; + +class FileOutputOperation : public MultiThreadedOperation { + private: + const CompositorContext *context_; + const NodeImageMultiFile *node_data_; + Vector file_output_inputs_; + + public: + FileOutputOperation(const CompositorContext *context, + const NodeImageMultiFile *node_data, + Vector inputs); + + void execute_region(rcti *rect, unsigned int tile_number) override; + bool is_output_operation(bool /*rendering*/) const override + { + return true; + } + void init_execution() override; + void deinit_execution() override; + eCompositorPriority get_render_priority() const override + { + return eCompositorPriority::Low; + } + + void update_memory_buffer_partial(MemoryBuffer *output, + const rcti &area, + Span inputs) override; + + private: + void execute_single_layer(); + void execute_single_layer_multi_view_exr(const FileOutputInput &input, + const ImageFormatData &format, + const char *base_path); + void execute_multi_layer(); + + /* Add a pass of the given name, view, and input buffer. The pass channel identifiers follows the + * EXR conventions. */ + void add_pass_for_input(realtime_compositor::FileOutput &file_output, + const FileOutputInput &input, + const char *pass_name, + const char *view_name); + + /* Add a view of the given name and input buffer. */ + void add_view_for_input(realtime_compositor::FileOutput &file_output, + const FileOutputInput &input, + const char *view_name); + + /* Get the base path of the image to be saved, based on the base path of the node. The base name + * is an optional initial name of the image, which will later be concatenated with other + * information like the frame number, view, and extension. If the base name is empty, then the + * base path represents a directory, so a trailing slash is ensured. */ + void get_single_layer_image_base_path(const char *base_name, char *base_path); + + /* Get the path of the image to be saved based on the given format. */ + void get_single_layer_image_path(const char *base_path, + const ImageFormatData &format, + char *image_path); + + /* Get the path of the EXR image to be saved. If the given view is not empty, its corresponding + * file suffix will be appended to the name. */ + void get_multi_layer_exr_image_path(const char *base_path, const char *view, char *image_path); + + bool is_multi_layer(); + + const char *get_base_path(); + + /* Add the file format extensions to the rendered file name. */ + bool use_file_extension(); + + /* If true, save views in a multi-view EXR file, otherwise, save each view in its own file. */ + bool is_multi_view_exr(); + + bool is_multi_view_scene(); +}; + +} // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_MaskOperation.cc b/source/blender/compositor/operations/COM_MaskOperation.cc index 5d1b3436c31..bdf22952f5e 100644 --- a/source/blender/compositor/operations/COM_MaskOperation.cc +++ b/source/blender/compositor/operations/COM_MaskOperation.cc @@ -132,7 +132,7 @@ void MaskOperation::update_memory_buffer_partial(MemoryBuffer *output, Span /*inputs*/) { Vector handles = get_non_null_handles(); - if (handles.size() == 0) { + if (handles.is_empty()) { output->fill(area, COM_VALUE_ZERO); return; } diff --git a/source/blender/compositor/operations/COM_OutputFileMultiViewOperation.cc b/source/blender/compositor/operations/COM_OutputFileMultiViewOperation.cc deleted file mode 100644 index 3dbdab3e942..00000000000 --- a/source/blender/compositor/operations/COM_OutputFileMultiViewOperation.cc +++ /dev/null @@ -1,353 +0,0 @@ -/* SPDX-FileCopyrightText: 2015 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include "COM_OutputFileMultiViewOperation.h" - -#include "BLI_fileops.h" -#include "BLI_string.h" - -#include "BKE_image.h" -#include "BKE_image_format.h" -#include "BKE_main.hh" -#include "BKE_scene.h" - -#include "IMB_colormanagement.h" -#include "IMB_imbuf.h" -#include "IMB_imbuf_types.h" - -namespace blender::compositor { - -/************************************ OpenEXR Singlelayer Multiview ******************************/ - -OutputOpenExrSingleLayerMultiViewOperation::OutputOpenExrSingleLayerMultiViewOperation( - const Scene *scene, - const RenderData *rd, - const bNodeTree *tree, - DataType datatype, - const ImageFormatData *format, - const char *path, - const char *view_name, - const bool save_as_render) - : OutputSingleLayerOperation( - scene, rd, tree, datatype, format, path, view_name, save_as_render) -{ -} - -void *OutputOpenExrSingleLayerMultiViewOperation::get_handle(const char *filepath) -{ - size_t width = this->get_width(); - size_t height = this->get_height(); - - if (width != 0 && height != 0) { - void *exrhandle; - - exrhandle = IMB_exr_get_handle_name(filepath); - - if (!BKE_scene_multiview_is_render_view_first(rd_, view_name_)) { - return exrhandle; - } - - IMB_exr_clear_channels(exrhandle); - - LISTBASE_FOREACH (SceneRenderView *, srv, &rd_->views) { - if (BKE_scene_multiview_is_render_view_active(rd_, srv) == false) { - continue; - } - - IMB_exr_add_view(exrhandle, srv->name); - add_exr_channels(exrhandle, nullptr, datatype_, srv->name, width, false, nullptr); - } - - BLI_file_ensure_parent_dir_exists(filepath); - - /* prepare the file with all the channels */ - - if (!IMB_exr_begin_write(exrhandle, filepath, width, height, format_.exr_codec, nullptr)) { - printf("Error Writing Singlelayer Multiview Openexr\n"); - IMB_exr_close(exrhandle); - } - else { - IMB_exr_clear_channels(exrhandle); - return exrhandle; - } - } - return nullptr; -} - -void OutputOpenExrSingleLayerMultiViewOperation::deinit_execution() -{ - uint width = this->get_width(); - uint height = this->get_height(); - - if (width != 0 && height != 0) { - void *exrhandle; - char filepath[FILE_MAX]; - - BKE_image_path_from_imtype(filepath, - path_, - BKE_main_blendfile_path_from_global(), - rd_->cfra, - R_IMF_IMTYPE_OPENEXR, - (rd_->scemode & R_EXTENSION) != 0, - true, - nullptr); - - exrhandle = this->get_handle(filepath); - add_exr_channels(exrhandle, - nullptr, - datatype_, - view_name_, - width, - format_.depth == R_IMF_CHAN_DEPTH_16, - output_buffer_); - - /* memory can only be freed after we write all views to the file */ - output_buffer_ = nullptr; - image_input_ = nullptr; - - /* ready to close the file */ - if (BKE_scene_multiview_is_render_view_last(rd_, view_name_)) { - IMB_exr_write_channels(exrhandle); - - /* free buffer memory for all the views */ - free_exr_channels(exrhandle, rd_, nullptr, datatype_); - - /* remove exr handle and data */ - IMB_exr_close(exrhandle); - } - } -} - -/************************************ OpenEXR Multilayer Multiview *******************************/ - -OutputOpenExrMultiLayerMultiViewOperation::OutputOpenExrMultiLayerMultiViewOperation( - const Scene *scene, - const RenderData *rd, - const bNodeTree *tree, - const char *path, - char exr_codec, - bool exr_half_float, - const char *view_name) - : OutputOpenExrMultiLayerOperation(scene, rd, tree, path, exr_codec, exr_half_float, view_name) -{ -} - -void *OutputOpenExrMultiLayerMultiViewOperation::get_handle(const char *filepath) -{ - uint width = this->get_width(); - uint height = this->get_height(); - - if (width != 0 && height != 0) { - /* Get a new global handle. */ - void *exrhandle = IMB_exr_get_handle_name(filepath); - - if (!BKE_scene_multiview_is_render_view_first(rd_, view_name_)) { - return exrhandle; - } - - IMB_exr_clear_channels(exrhandle); - - /* check renderdata for amount of views */ - LISTBASE_FOREACH (SceneRenderView *, srv, &rd_->views) { - - if (BKE_scene_multiview_is_render_view_active(rd_, srv) == false) { - continue; - } - - IMB_exr_add_view(exrhandle, srv->name); - - for (uint i = 0; i < layers_.size(); i++) { - add_exr_channels(exrhandle, - layers_[i].name, - layers_[i].datatype, - srv->name, - width, - exr_half_float_, - nullptr); - } - } - - BLI_file_ensure_parent_dir_exists(filepath); - - /* prepare the file with all the channels for the header */ - StampData *stamp_data = create_stamp_data(); - if (!IMB_exr_begin_write(exrhandle, filepath, width, height, exr_codec_, stamp_data)) { - printf("Error Writing Multilayer Multiview Openexr\n"); - IMB_exr_close(exrhandle); - BKE_stamp_data_free(stamp_data); - } - else { - IMB_exr_clear_channels(exrhandle); - BKE_stamp_data_free(stamp_data); - return exrhandle; - } - } - return nullptr; -} - -void OutputOpenExrMultiLayerMultiViewOperation::deinit_execution() -{ - uint width = this->get_width(); - uint height = this->get_height(); - - if (width != 0 && height != 0) { - void *exrhandle; - char filepath[FILE_MAX]; - - BKE_image_path_from_imtype(filepath, - path_, - BKE_main_blendfile_path_from_global(), - rd_->cfra, - R_IMF_IMTYPE_MULTILAYER, - (rd_->scemode & R_EXTENSION) != 0, - true, - nullptr); - - exrhandle = this->get_handle(filepath); - - for (uint i = 0; i < layers_.size(); i++) { - add_exr_channels(exrhandle, - layers_[i].name, - layers_[i].datatype, - view_name_, - width, - exr_half_float_, - layers_[i].output_buffer); - } - - for (uint i = 0; i < layers_.size(); i++) { - /* memory can only be freed after we write all views to the file */ - layers_[i].output_buffer = nullptr; - layers_[i].image_input = nullptr; - } - - /* ready to close the file */ - if (BKE_scene_multiview_is_render_view_last(rd_, view_name_)) { - IMB_exr_write_channels(exrhandle); - - /* free buffer memory for all the views */ - for (uint i = 0; i < layers_.size(); i++) { - free_exr_channels(exrhandle, rd_, layers_[i].name, layers_[i].datatype); - } - - IMB_exr_close(exrhandle); - } - } -} - -/******************************** Stereo3D ******************************/ - -OutputStereoOperation::OutputStereoOperation(const Scene *scene, - const RenderData *rd, - const bNodeTree *tree, - DataType datatype, - const ImageFormatData *format, - const char *path, - const char *pass_name, - const char *view_name, - const bool save_as_render) - : OutputSingleLayerOperation( - scene, rd, tree, datatype, format, path, view_name, save_as_render) -{ - STRNCPY(pass_name_, pass_name); - channels_ = get_datatype_size(datatype); -} - -void *OutputStereoOperation::get_handle(const char *filepath) -{ - size_t width = this->get_width(); - size_t height = this->get_height(); - const char *names[2] = {STEREO_LEFT_NAME, STEREO_RIGHT_NAME}; - size_t i; - - if (width != 0 && height != 0) { - void *exrhandle; - - exrhandle = IMB_exr_get_handle_name(filepath); - - if (!BKE_scene_multiview_is_render_view_first(rd_, view_name_)) { - return exrhandle; - } - - IMB_exr_clear_channels(exrhandle); - - for (i = 0; i < 2; i++) { - IMB_exr_add_view(exrhandle, names[i]); - } - - return exrhandle; - } - return nullptr; -} - -void OutputStereoOperation::deinit_execution() -{ - uint width = this->get_width(); - uint height = this->get_height(); - - if (width != 0 && height != 0) { - void *exrhandle; - - exrhandle = this->get_handle(path_); - float *buf = output_buffer_; - - /* populate single EXR channel with view data */ - IMB_exr_add_channel(exrhandle, - nullptr, - pass_name_, - view_name_, - 1, - channels_ * width * height, - buf, - format_.depth == R_IMF_CHAN_DEPTH_16); - - image_input_ = nullptr; - output_buffer_ = nullptr; - - /* create stereo ibuf */ - if (BKE_scene_multiview_is_render_view_last(rd_, view_name_)) { - ImBuf *ibuf[3] = {nullptr}; - const char *names[2] = {STEREO_LEFT_NAME, STEREO_RIGHT_NAME}; - char filepath[FILE_MAX]; - int i; - - /* get rectf from EXR */ - for (i = 0; i < 2; i++) { - float *rectf = IMB_exr_channel_rect(exrhandle, nullptr, pass_name_, names[i]); - ibuf[i] = IMB_allocImBuf(width, height, format_.planes, 0); - - ibuf[i]->channels = channels_; - ibuf[i]->dither = rd_->dither_intensity; - - IMB_assign_float_buffer(ibuf[i], rectf, IB_TAKE_OWNERSHIP); - - /* do colormanagement in the individual views, so it doesn't need to do in the stereo */ - IMB_colormanagement_imbuf_for_write(ibuf[i], true, false, &format_); - } - - /* create stereo buffer */ - ibuf[2] = IMB_stereo3d_ImBuf(&format_, ibuf[0], ibuf[1]); - - BKE_image_path_from_imformat(filepath, - path_, - BKE_main_blendfile_path_from_global(), - rd_->cfra, - &format_, - (rd_->scemode & R_EXTENSION) != 0, - true, - nullptr); - - BKE_imbuf_write(ibuf[2], filepath, &format_); - - /* imbuf knows which rects are not part of ibuf */ - for (i = 0; i < 3; i++) { - IMB_freeImBuf(ibuf[i]); - } - - IMB_exr_close(exrhandle); - } - } -} - -} // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_OutputFileMultiViewOperation.h b/source/blender/compositor/operations/COM_OutputFileMultiViewOperation.h deleted file mode 100644 index 7084da00b7b..00000000000 --- a/source/blender/compositor/operations/COM_OutputFileMultiViewOperation.h +++ /dev/null @@ -1,71 +0,0 @@ -/* SPDX-FileCopyrightText: 2015 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -#include "COM_NodeOperation.h" -#include "COM_OutputFileOperation.h" - -#include "BLI_path_util.h" -#include "BLI_rect.h" - -#include "DNA_color_types.h" - -#include "IMB_openexr.h" - -namespace blender::compositor { - -class OutputOpenExrSingleLayerMultiViewOperation : public OutputSingleLayerOperation { - private: - public: - OutputOpenExrSingleLayerMultiViewOperation(const Scene *scene, - const RenderData *rd, - const bNodeTree *tree, - DataType datatype, - const ImageFormatData *format, - const char *path, - const char *view_name, - bool save_as_render); - - void *get_handle(const char *filepath); - void deinit_execution() override; -}; - -/** Writes inputs into OpenEXR multi-layer channels. */ -class OutputOpenExrMultiLayerMultiViewOperation : public OutputOpenExrMultiLayerOperation { - private: - public: - OutputOpenExrMultiLayerMultiViewOperation(const Scene *scene, - const RenderData *rd, - const bNodeTree *tree, - const char *path, - char exr_codec, - bool exr_half_float, - const char *view_name); - - void *get_handle(const char *filepath); - void deinit_execution() override; -}; - -class OutputStereoOperation : public OutputSingleLayerOperation { - private: - /* NOTE: Using FILE_MAX here is misleading, this is not a file path. */ - char pass_name_[FILE_MAX]; - size_t channels_; - - public: - OutputStereoOperation(const Scene *scene, - const RenderData *rd, - const bNodeTree *tree, - DataType datatype, - const struct ImageFormatData *format, - const char *path, - const char *pass_name, - const char *view_name, - bool save_as_render); - void *get_handle(const char *filepath); - void deinit_execution() override; -}; - -} // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_OutputFileOperation.cc b/source/blender/compositor/operations/COM_OutputFileOperation.cc deleted file mode 100644 index 7ba078d4870..00000000000 --- a/source/blender/compositor/operations/COM_OutputFileOperation.cc +++ /dev/null @@ -1,467 +0,0 @@ -/* SPDX-FileCopyrightText: 2011 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#include "COM_OutputFileOperation.h" - -#include "BLI_fileops.h" -#include "BLI_listbase.h" -#include "BLI_string.h" - -#include "BKE_image.h" -#include "BKE_image_format.h" -#include "BKE_main.hh" -#include "BKE_scene.h" - -#include "DNA_color_types.h" - -#include "IMB_colormanagement.h" -#include "IMB_imbuf.h" -#include "IMB_imbuf_types.h" - -#include "RE_pipeline.h" - -namespace blender::compositor { - -void add_exr_channels(void *exrhandle, - const char *layer_name, - const DataType datatype, - const char *view_name, - const size_t width, - bool use_half_float, - float *buf) -{ - /* create channels */ - switch (datatype) { - case DataType::Value: - IMB_exr_add_channel( - exrhandle, layer_name, "V", view_name, 1, width, buf ? buf : nullptr, use_half_float); - break; - case DataType::Vector: - IMB_exr_add_channel(exrhandle, - layer_name, - "X", - view_name, - 3, - 3 * width, - buf ? buf : nullptr, - use_half_float); - IMB_exr_add_channel(exrhandle, - layer_name, - "Y", - view_name, - 3, - 3 * width, - buf ? buf + 1 : nullptr, - use_half_float); - IMB_exr_add_channel(exrhandle, - layer_name, - "Z", - view_name, - 3, - 3 * width, - buf ? buf + 2 : nullptr, - use_half_float); - break; - case DataType::Color: - IMB_exr_add_channel(exrhandle, - layer_name, - "R", - view_name, - 4, - 4 * width, - buf ? buf : nullptr, - use_half_float); - IMB_exr_add_channel(exrhandle, - layer_name, - "G", - view_name, - 4, - 4 * width, - buf ? buf + 1 : nullptr, - use_half_float); - IMB_exr_add_channel(exrhandle, - layer_name, - "B", - view_name, - 4, - 4 * width, - buf ? buf + 2 : nullptr, - use_half_float); - IMB_exr_add_channel(exrhandle, - layer_name, - "A", - view_name, - 4, - 4 * width, - buf ? buf + 3 : nullptr, - use_half_float); - break; - default: - break; - } -} - -void free_exr_channels(void *exrhandle, - const RenderData *rd, - const char *layer_name, - const DataType datatype) -{ - /* check renderdata for amount of views */ - LISTBASE_FOREACH (SceneRenderView *, srv, &rd->views) { - float *rect = nullptr; - - if (BKE_scene_multiview_is_render_view_active(rd, srv) == false) { - continue; - } - - /* the pointer is stored in the first channel of each datatype */ - switch (datatype) { - case DataType::Value: - rect = IMB_exr_channel_rect(exrhandle, layer_name, "V", srv->name); - break; - case DataType::Vector: - rect = IMB_exr_channel_rect(exrhandle, layer_name, "X", srv->name); - break; - case DataType::Color: - rect = IMB_exr_channel_rect(exrhandle, layer_name, "R", srv->name); - break; - default: - break; - } - if (rect) { - MEM_freeN(rect); - } - } -} - -int get_datatype_size(DataType datatype) -{ - switch (datatype) { - case DataType::Value: - return 1; - case DataType::Vector: - return 3; - case DataType::Color: - return 4; - default: - return 0; - } -} - -static float *init_buffer(uint width, uint height, DataType datatype) -{ - /* When initializing the tree during initial load the width and height can be zero. */ - if (width != 0 && height != 0) { - int size = get_datatype_size(datatype); - return (float *)MEM_callocN(width * height * size * sizeof(float), "OutputFile buffer"); - } - - return nullptr; -} - -static void write_buffer_rect(rcti *rect, - const bNodeTree *tree, - SocketReader *reader, - float *buffer, - uint width, - DataType datatype) -{ - float color[4]; - int i, size = get_datatype_size(datatype); - - if (!buffer) { - return; - } - int x1 = rect->xmin; - int y1 = rect->ymin; - int x2 = rect->xmax; - int y2 = rect->ymax; - int offset = (y1 * width + x1) * size; - int x; - int y; - bool breaked = false; - - for (y = y1; y < y2 && (!breaked); y++) { - for (x = x1; x < x2 && (!breaked); x++) { - reader->read_sampled(color, x, y, PixelSampler::Nearest); - - for (i = 0; i < size; i++) { - buffer[offset + i] = color[i]; - } - offset += size; - - if (tree->runtime->test_break && tree->runtime->test_break(tree->runtime->tbh)) { - breaked = true; - } - } - offset += (width - (x2 - x1)) * size; - } -} - -OutputSingleLayerOperation::OutputSingleLayerOperation(const Scene *scene, - const RenderData *rd, - const bNodeTree *tree, - DataType datatype, - const ImageFormatData *format, - const char *path, - const char *view_name, - const bool save_as_render) -{ - rd_ = rd; - tree_ = tree; - - this->add_input_socket(datatype); - - output_buffer_ = nullptr; - datatype_ = datatype; - image_input_ = nullptr; - - BKE_image_format_init_for_write(&format_, scene, format); - if (!save_as_render) { - /* If not saving as render, stop IMB_colormanagement_imbuf_for_write using this - * colorspace for conversion. */ - format_.linear_colorspace_settings.name[0] = '\0'; - } - - STRNCPY(path_, path); - - view_name_ = view_name; - save_as_render_ = save_as_render; -} - -OutputSingleLayerOperation::~OutputSingleLayerOperation() -{ - BKE_image_format_free(&format_); -} - -void OutputSingleLayerOperation::init_execution() -{ - image_input_ = get_input_socket_reader(0); - output_buffer_ = init_buffer(this->get_width(), this->get_height(), datatype_); -} - -void OutputSingleLayerOperation::execute_region(rcti *rect, uint /*tile_number*/) -{ - write_buffer_rect(rect, tree_, image_input_, output_buffer_, this->get_width(), datatype_); -} - -void OutputSingleLayerOperation::deinit_execution() -{ - if (this->get_width() * this->get_height() != 0) { - - int size = get_datatype_size(datatype_); - ImBuf *ibuf = IMB_allocImBuf(this->get_width(), this->get_height(), format_.planes, 0); - char filepath[FILE_MAX]; - const char *suffix; - - ibuf->channels = size; - ibuf->dither = rd_->dither_intensity; - - IMB_assign_float_buffer(ibuf, output_buffer_, IB_TAKE_OWNERSHIP); - - IMB_colormanagement_imbuf_for_write(ibuf, save_as_render_, false, &format_); - - suffix = BKE_scene_multiview_view_suffix_get(rd_, view_name_); - - BKE_image_path_from_imformat(filepath, - path_, - BKE_main_blendfile_path_from_global(), - rd_->cfra, - &format_, - (rd_->scemode & R_EXTENSION) != 0, - true, - suffix); - - if (0 == BKE_imbuf_write(ibuf, filepath, &format_)) { - printf("Cannot save Node File Output to %s\n", filepath); - } - else { - printf("Saved: %s\n", filepath); - } - - IMB_freeImBuf(ibuf); - } - output_buffer_ = nullptr; - image_input_ = nullptr; -} - -void OutputSingleLayerOperation::update_memory_buffer_partial(MemoryBuffer * /*output*/, - const rcti &area, - Span inputs) -{ - if (!output_buffer_) { - return; - } - - MemoryBuffer output_buf(output_buffer_, - COM_data_type_num_channels(datatype_), - this->get_width(), - this->get_height()); - const MemoryBuffer *input_image = inputs[0]; - output_buf.copy_from(input_image, area); -} - -/******************************* MultiLayer *******************************/ - -OutputOpenExrLayer::OutputOpenExrLayer(const char *name_, DataType datatype_, bool use_layer_) -{ - STRNCPY(this->name, name_); - this->datatype = datatype_; - this->use_layer = use_layer_; - - /* these are created in init_execution */ - this->output_buffer = nullptr; - this->image_input = nullptr; -} - -OutputOpenExrMultiLayerOperation::OutputOpenExrMultiLayerOperation(const Scene *scene, - const RenderData *rd, - const bNodeTree *tree, - const char *path, - char exr_codec, - bool exr_half_float, - const char *view_name) -{ - scene_ = scene; - rd_ = rd; - tree_ = tree; - - STRNCPY(path_, path); - exr_codec_ = exr_codec; - exr_half_float_ = exr_half_float; - view_name_ = view_name; - this->set_canvas_input_index(RESOLUTION_INPUT_ANY); -} - -void OutputOpenExrMultiLayerOperation::add_layer(const char *name, - DataType datatype, - bool use_layer) -{ - this->add_input_socket(datatype); - layers_.append(OutputOpenExrLayer(name, datatype, use_layer)); -} - -StampData *OutputOpenExrMultiLayerOperation::create_stamp_data() const -{ - /* StampData API doesn't provide functions to modify an instance without having a RenderResult. - */ - RenderResult render_result; - StampData *stamp_data = BKE_stamp_info_from_scene_static(scene_); - render_result.stamp_data = stamp_data; - for (const OutputOpenExrLayer &layer : layers_) { - /* Skip unconnected sockets. */ - if (layer.image_input == nullptr) { - continue; - } - std::unique_ptr meta_data = layer.image_input->get_meta_data(); - if (meta_data) { - blender::StringRef layer_name = - blender::bke::cryptomatte::BKE_cryptomatte_extract_layer_name( - blender::StringRef(layer.name, BLI_strnlen(layer.name, sizeof(layer.name)))); - meta_data->replace_hash_neutral_cryptomatte_keys(layer_name); - meta_data->add_to_render_result(&render_result); - } - } - return stamp_data; -} - -void OutputOpenExrMultiLayerOperation::init_execution() -{ - for (uint i = 0; i < layers_.size(); i++) { - if (layers_[i].use_layer) { - SocketReader *reader = get_input_socket_reader(i); - layers_[i].image_input = reader; - layers_[i].output_buffer = init_buffer( - this->get_width(), this->get_height(), layers_[i].datatype); - } - } -} - -void OutputOpenExrMultiLayerOperation::execute_region(rcti *rect, uint /*tile_number*/) -{ - for (uint i = 0; i < layers_.size(); i++) { - OutputOpenExrLayer &layer = layers_[i]; - if (layer.image_input) { - write_buffer_rect( - rect, tree_, layer.image_input, layer.output_buffer, this->get_width(), layer.datatype); - } - } -} - -void OutputOpenExrMultiLayerOperation::deinit_execution() -{ - uint width = this->get_width(); - uint height = this->get_height(); - if (width != 0 && height != 0) { - char filepath[FILE_MAX]; - const char *suffix; - void *exrhandle = IMB_exr_get_handle(); - - suffix = BKE_scene_multiview_view_suffix_get(rd_, view_name_); - BKE_image_path_from_imtype(filepath, - path_, - BKE_main_blendfile_path_from_global(), - rd_->cfra, - R_IMF_IMTYPE_MULTILAYER, - (rd_->scemode & R_EXTENSION) != 0, - true, - suffix); - BLI_file_ensure_parent_dir_exists(filepath); - - for (uint i = 0; i < layers_.size(); i++) { - OutputOpenExrLayer &layer = layers_[i]; - if (!layer.image_input) { - continue; /* skip unconnected sockets */ - } - - add_exr_channels(exrhandle, - layers_[i].name, - layers_[i].datatype, - "", - width, - exr_half_float_, - layers_[i].output_buffer); - } - - /* When the filepath has no permissions, this can fail. */ - StampData *stamp_data = create_stamp_data(); - if (IMB_exr_begin_write(exrhandle, filepath, width, height, exr_codec_, stamp_data)) { - IMB_exr_write_channels(exrhandle); - } - else { - /* TODO: get the error from openexr's exception. */ - /* XXX: nice way to do report? */ - printf("Error Writing Render Result, see console\n"); - } - - IMB_exr_close(exrhandle); - for (uint i = 0; i < layers_.size(); i++) { - if (layers_[i].output_buffer) { - MEM_freeN(layers_[i].output_buffer); - layers_[i].output_buffer = nullptr; - } - - layers_[i].image_input = nullptr; - } - BKE_stamp_data_free(stamp_data); - } -} - -void OutputOpenExrMultiLayerOperation::update_memory_buffer_partial(MemoryBuffer * /*output*/, - const rcti &area, - Span inputs) -{ - for (int i = 0; i < layers_.size(); i++) { - OutputOpenExrLayer &layer = layers_[i]; - int layer_num_channels = COM_data_type_num_channels(layer.datatype); - if (layer.output_buffer) { - MemoryBuffer output_buf( - layer.output_buffer, layer_num_channels, this->get_width(), this->get_height()); - /* Input node always has 4 channels. Not all are needed depending on datatype. */ - output_buf.copy_from(inputs[i], area, 0, layer_num_channels, 0); - } - } -} - -} // namespace blender::compositor diff --git a/source/blender/compositor/operations/COM_OutputFileOperation.h b/source/blender/compositor/operations/COM_OutputFileOperation.h deleted file mode 100644 index fefda6a493c..00000000000 --- a/source/blender/compositor/operations/COM_OutputFileOperation.h +++ /dev/null @@ -1,131 +0,0 @@ -/* SPDX-FileCopyrightText: 2011 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ - -#pragma once - -#include "COM_MultiThreadedOperation.h" - -#include "BLI_path_util.h" -#include "BLI_rect.h" - -#include "DNA_color_types.h" - -#include "IMB_openexr.h" - -namespace blender::compositor { - -/* Writes the image to a single-layer file. */ -class OutputSingleLayerOperation : public MultiThreadedOperation { - protected: - const RenderData *rd_; - const bNodeTree *tree_; - - ImageFormatData format_; - char path_[FILE_MAX]; - - float *output_buffer_; - DataType datatype_; - SocketReader *image_input_; - - const char *view_name_; - bool save_as_render_; - - public: - OutputSingleLayerOperation(const Scene *scene, - const RenderData *rd, - const bNodeTree *tree, - DataType datatype, - const ImageFormatData *format, - const char *path, - const char *view_name, - bool save_as_render); - ~OutputSingleLayerOperation(); - - void execute_region(rcti *rect, unsigned int tile_number) override; - bool is_output_operation(bool /*rendering*/) const override - { - return true; - } - void init_execution() override; - void deinit_execution() override; - eCompositorPriority get_render_priority() const override - { - return eCompositorPriority::Low; - } - - void update_memory_buffer_partial(MemoryBuffer *output, - const rcti &area, - Span inputs) override; -}; - -/* extra info for OpenEXR layers */ -struct OutputOpenExrLayer { - OutputOpenExrLayer(const char *name, DataType datatype, bool use_layer); - - char name[EXR_TOT_MAXNAME - 2]; - DataType datatype; - bool use_layer; - - /* internals */ - float *output_buffer; - SocketReader *image_input; -}; - -/* Writes inputs into OpenEXR multi-layer channels. */ -class OutputOpenExrMultiLayerOperation : public MultiThreadedOperation { - protected: - const Scene *scene_; - const RenderData *rd_; - const bNodeTree *tree_; - - char path_[FILE_MAX]; - char exr_codec_; - bool exr_half_float_; - Vector layers_; - const char *view_name_; - - StampData *create_stamp_data() const; - - public: - OutputOpenExrMultiLayerOperation(const Scene *scene, - const RenderData *rd, - const bNodeTree *tree, - const char *path, - char exr_codec, - bool exr_half_float, - const char *view_name); - - void add_layer(const char *name, DataType datatype, bool use_layer); - - void execute_region(rcti *rect, unsigned int tile_number) override; - bool is_output_operation(bool /*rendering*/) const override - { - return true; - } - void init_execution() override; - void deinit_execution() override; - eCompositorPriority get_render_priority() const override - { - return eCompositorPriority::Low; - } - - void update_memory_buffer_partial(MemoryBuffer *output, - const rcti &area, - Span inputs) override; -}; - -void add_exr_channels(void *exrhandle, - const char *layer_name, - const DataType datatype, - const char *view_name, - size_t width, - bool use_half_float, - float *buf); -void free_exr_channels(void *exrhandle, - const RenderData *rd, - const char *layer_name, - const DataType datatype); -int get_datatype_size(DataType datatype); - -} // namespace blender::compositor diff --git a/source/blender/compositor/realtime_compositor/CMakeLists.txt b/source/blender/compositor/realtime_compositor/CMakeLists.txt index ed59da9fbb6..6a496bb4706 100644 --- a/source/blender/compositor/realtime_compositor/CMakeLists.txt +++ b/source/blender/compositor/realtime_compositor/CMakeLists.txt @@ -32,6 +32,7 @@ set(SRC intern/operation.cc intern/realize_on_domain_operation.cc intern/reduce_to_single_value_operation.cc + intern/render_context.cc intern/result.cc intern/scheduler.cc intern/shader_node.cc @@ -52,6 +53,7 @@ set(SRC COM_operation.hh COM_realize_on_domain_operation.hh COM_reduce_to_single_value_operation.hh + COM_render_context.hh COM_result.hh COM_scheduler.hh COM_shader_node.hh @@ -83,6 +85,8 @@ set(SRC algorithms/COM_algorithm_symmetric_separable_blur_variable_size.hh algorithms/COM_algorithm_transform.hh + cached_resources/intern/bokeh_kernel.cc + cached_resources/intern/cached_image.cc cached_resources/intern/cached_mask.cc cached_resources/intern/cached_shader.cc cached_resources/intern/cached_texture.cc @@ -94,6 +98,8 @@ set(SRC cached_resources/intern/symmetric_blur_weights.cc cached_resources/intern/symmetric_separable_blur_weights.cc + cached_resources/COM_bokeh_kernel.hh + cached_resources/COM_cached_image.hh cached_resources/COM_cached_mask.hh cached_resources/COM_cached_resource.hh cached_resources/COM_cached_shader.hh @@ -127,6 +133,9 @@ set(GLSL_SRC shaders/compositor_box_mask.glsl shaders/compositor_compute_preview.glsl shaders/compositor_convert.glsl + shaders/compositor_cryptomatte_image.glsl + shaders/compositor_cryptomatte_matte.glsl + shaders/compositor_cryptomatte_pick.glsl shaders/compositor_despeckle.glsl shaders/compositor_directional_blur.glsl shaders/compositor_displace.glsl @@ -173,6 +182,7 @@ set(GLSL_SRC shaders/compositor_parallel_reduction.glsl shaders/compositor_plane_deform.glsl shaders/compositor_plane_deform_motion_blur.glsl + shaders/compositor_premultiply_alpha.glsl shaders/compositor_projector_lens_distortion.glsl shaders/compositor_read_input.glsl shaders/compositor_realize_on_domain.glsl @@ -264,6 +274,7 @@ set(SRC_SHADER_CREATE_INFOS shaders/infos/compositor_box_mask_info.hh shaders/infos/compositor_compute_preview_info.hh shaders/infos/compositor_convert_info.hh + shaders/infos/compositor_cryptomatte_info.hh shaders/infos/compositor_despeckle_info.hh shaders/infos/compositor_directional_blur_info.hh shaders/infos/compositor_displace_info.hh @@ -290,6 +301,7 @@ set(SRC_SHADER_CREATE_INFOS shaders/infos/compositor_parallel_reduction_info.hh shaders/infos/compositor_plane_deform_info.hh shaders/infos/compositor_plane_deform_motion_blur_info.hh + shaders/infos/compositor_premultiply_alpha_info.hh shaders/infos/compositor_projector_lens_distortion_info.hh shaders/infos/compositor_read_input_info.hh shaders/infos/compositor_realize_on_domain_info.hh diff --git a/source/blender/compositor/realtime_compositor/COM_context.hh b/source/blender/compositor/realtime_compositor/COM_context.hh index ff183b01e0f..3c850941b6e 100644 --- a/source/blender/compositor/realtime_compositor/COM_context.hh +++ b/source/blender/compositor/realtime_compositor/COM_context.hh @@ -14,6 +14,7 @@ #include "GPU_shader.h" #include "GPU_texture.h" +#include "COM_render_context.hh" #include "COM_result.hh" #include "COM_static_cache_manager.hh" #include "COM_texture_pool.hh" @@ -104,6 +105,11 @@ class Context { * that is, to ready it to track the next change. */ virtual IDRecalcFlag query_id_recalc_flag(ID *id) const = 0; + /* Get a pointer to the render context of this context. A render context stores information about + * the current render. It might be null if the compositor is not being evaluated as part of a + * render pipeline. */ + virtual RenderContext *render_context() const; + /* Get the size of the compositing region. See get_compositing_region(). */ int2 get_compositing_region_size() const; diff --git a/source/blender/compositor/realtime_compositor/COM_render_context.hh b/source/blender/compositor/realtime_compositor/COM_render_context.hh new file mode 100644 index 00000000000..aee19fe6aab --- /dev/null +++ b/source/blender/compositor/realtime_compositor/COM_render_context.hh @@ -0,0 +1,119 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#include +#include + +#include "BLI_map.hh" +#include "BLI_math_vector_types.hh" + +#include "DNA_scene_types.h" + +struct RenderResult; + +namespace blender::realtime_compositor { + +/* ------------------------------------------------------------------------------------------------ + * File Output + * + * A FileOutput represents an image that will be saved to a file output. The image is internally + * stored as a RenderResult and saved at the path according to the image format. The image can + * either be saved as an EXR image or a non-EXR image, specified by the format. This is important + * because EXR images needs to constructed differently from other image types as will be explained + * in the following sections. + * + * For EXR images, the render result needs to be composed of passes for each layer, so the add_pass + * method should be called to add each of the passes. Additionally, an empty view should be added + * for each of the views referenced by the passes, using the single-argument overload of the + * add_view method. Those views are merely empty structure and does not hold any data aside from + * the view name. An exception to this rule is stereo EXR images, which needs to have the same + * structure as non-EXR images as explained in the following section. + * + * For non-EXR images, the render result needs to composed of views, so the multi-argument overload + * of the method add_view should be used to add each view. + * + * Color management will be applied on the images if save_as_render_ is true. + * + * Meta data can be added using the add_meta_data function. */ +class FileOutput { + private: + std::string path_; + ImageFormatData format_; + RenderResult *render_result_; + bool save_as_render_; + Map meta_data_; + + public: + /* Allocate and initialize the internal render result of the file output using the give + * parameters. See the implementation for more information. */ + FileOutput(std::string path, ImageFormatData format, int2 size, bool save_as_render); + + /* Free the internal render result. */ + ~FileOutput(); + + /* Add an empty view with the given name. An empty view is just structure and does not hold any + * data aside from the view name. This should be called for each view referenced by passes. This + * should only be called for EXR images. */ + void add_view(const char *view_name); + + /* Add a view of the given name that stores the given pixel buffer composed of the given number + * of channels. */ + void add_view(const char *view_name, int channels, float *buffer); + + /* Add a pass of the given name in the given view that stores the given pixel buffer composed of + * each of the channels given by the channels string. The channels string should contain a + * character for each channel in the pixel buffer representing the channel ID. This should only + * be called for EXR images. The given view name should be the name of an added view using the + * add_view method. */ + void add_pass(const char *pass_name, const char *view_name, const char *channels, float *buffer); + + /* Add meta data that will eventually be saved to the file if the format supports it. */ + void add_meta_data(std::string key, std::string value); + + /* Save the file to the path along with its meta data, reporting any reports to the standard + * output. */ + void save(Scene *scene); +}; + +/* ------------------------------------------------------------------------------------------------ + * Render Context + * + * A render context is created by the render pipeline and passed to the compositor to stores data + * that is specifically related to the rendering process. In particular, since the compositor is + * executed for each view separately and consecutively, it can be used to store and accumulate + * data from each of the evaluations of each view, for instance, to save all views in a single file + * for the File Output node, see the file_outputs_ member for more information. */ +class RenderContext { + private: + /* A mapping between file outputs and their image file paths. Those are constructed in the + * get_file_output method and saved in the save_file_outputs method. See those methods for more + * information. */ + Map> file_outputs_; + + public: + /* Check if there is an available file output with the given path in the context, if one exists, + * return it, otherwise, return a newly created one from the given parameters and add it to the + * context. The arguments are ignored if the file output already exist. This method is typically + * called in the File Output nodes in the compositor. + * + * Since the compositor gets executed multiple times for each view, for single view renders, the + * file output will be constructed and fully initialized in the same compositor evaluation. For + * multi-view renders, the file output will be constructed in the evaluation of the first view, + * and each view will subsequently add its data until the file output is fully initialized in the + * last view. The render pipeline code will then call the save_file_outputs method after all + * views were evaluated to write the file outputs. */ + FileOutput &get_file_output(std::string path, + ImageFormatData format, + int2 size, + bool save_as_render); + + /* Write the file outputs that were added to the context. The render pipeline code should call + * this method after all views were evaluated to write the file outputs. See the get_file_output + * method for more information. */ + void save_file_outputs(Scene *scene); +}; + +} // namespace blender::realtime_compositor diff --git a/source/blender/compositor/realtime_compositor/COM_result.hh b/source/blender/compositor/realtime_compositor/COM_result.hh index c557d099741..074a0ec4d2d 100644 --- a/source/blender/compositor/realtime_compositor/COM_result.hh +++ b/source/blender/compositor/realtime_compositor/COM_result.hh @@ -300,6 +300,12 @@ class Result { /* Returns the type of the result. */ ResultType type() const; + /* Returns the precision of the result. */ + ResultPrecision precision() const; + + /* Sets the precision of the result. */ + void set_precision(ResultPrecision precision); + /* Returns true if the result is a texture and false of it is a single value. */ bool is_texture() const; diff --git a/source/blender/compositor/realtime_compositor/COM_static_cache_manager.hh b/source/blender/compositor/realtime_compositor/COM_static_cache_manager.hh index f95bda7e903..2bf1fa86046 100644 --- a/source/blender/compositor/realtime_compositor/COM_static_cache_manager.hh +++ b/source/blender/compositor/realtime_compositor/COM_static_cache_manager.hh @@ -4,6 +4,8 @@ #pragma once +#include "COM_bokeh_kernel.hh" +#include "COM_cached_image.hh" #include "COM_cached_mask.hh" #include "COM_cached_shader.hh" #include "COM_cached_texture.hh" @@ -51,6 +53,8 @@ class StaticCacheManager { DistortionGridContainer distortion_grids; KeyingScreenContainer keying_screens; CachedShaderContainer cached_shaders; + BokehKernelContainer bokeh_kernels; + CachedImageContainer cached_images; /* Reset the cache manager by deleting the cached resources that are no longer needed because * they weren't used in the last evaluation and prepare the remaining cached resources to track diff --git a/source/blender/compositor/realtime_compositor/cached_resources/COM_bokeh_kernel.hh b/source/blender/compositor/realtime_compositor/cached_resources/COM_bokeh_kernel.hh new file mode 100644 index 00000000000..2fe2a3fcad3 --- /dev/null +++ b/source/blender/compositor/realtime_compositor/cached_resources/COM_bokeh_kernel.hh @@ -0,0 +1,92 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#include +#include + +#include "BLI_map.hh" +#include "BLI_math_vector_types.hh" + +#include "GPU_shader.h" +#include "GPU_texture.h" + +#include "COM_cached_resource.hh" + +namespace blender::realtime_compositor { + +class Context; + +/* ------------------------------------------------------------------------------------------------ + * Bokeh Kernel Key. + */ +class BokehKernelKey { + public: + int2 size; + int sides; + float rotation; + float roundness; + float catadioptric; + float lens_shift; + + BokehKernelKey( + int2 size, int sides, float rotation, float roundness, float catadioptric, float lens_shift); + + uint64_t hash() const; +}; + +bool operator==(const BokehKernelKey &a, const BokehKernelKey &b); + +/* ------------------------------------------------------------------------------------------------- + * Bokeh Kernel. + * + * A cached resource that computes and caches a GPU texture containing the unnormalized convolution + * kernel, which when convolved with an image emulates a bokeh lens with the given parameters. */ +class BokehKernel : public CachedResource { + private: + GPUTexture *texture_ = nullptr; + + public: + BokehKernel(Context &context, + int2 size, + int sides, + float rotation, + float roundness, + float catadioptric, + float lens_shift); + + ~BokehKernel(); + + void bind_as_texture(GPUShader *shader, const char *texture_name) const; + + void unbind_as_texture() const; + + GPUTexture *texture() const; +}; + +/* ------------------------------------------------------------------------------------------------ + * Bokeh Kernel Container. + */ +class BokehKernelContainer : CachedResourceContainer { + private: + Map> map_; + + public: + void reset() override; + + /* Check if there is an available BokehKernel cached resource with the given parameters in the + * container, if one exists, return it, otherwise, return a newly created one and add it to the + * container. In both cases, tag the cached resource as needed to keep it cached for the next + * evaluation. */ + BokehKernel &get(Context &context, + int2 size, + int sides, + float rotation, + float roundness, + float catadioptric, + float lens_shift); +}; + +} // namespace blender::realtime_compositor diff --git a/source/blender/compositor/realtime_compositor/cached_resources/COM_cached_image.hh b/source/blender/compositor/realtime_compositor/cached_resources/COM_cached_image.hh new file mode 100644 index 00000000000..329fe4ba843 --- /dev/null +++ b/source/blender/compositor/realtime_compositor/cached_resources/COM_cached_image.hh @@ -0,0 +1,77 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma once + +#include +#include +#include + +#include "BLI_map.hh" + +#include "GPU_texture.h" + +#include "DNA_image_types.h" + +#include "COM_cached_resource.hh" + +namespace blender::realtime_compositor { + +class Context; + +/* ------------------------------------------------------------------------------------------------ + * Cached Image Key. + */ +class CachedImageKey { + public: + ImageUser image_user; + std::string pass_name; + + CachedImageKey(ImageUser image_user, std::string pass_name); + + uint64_t hash() const; +}; + +bool operator==(const CachedImageKey &a, const CachedImageKey &b); + +/* ------------------------------------------------------------------------------------------------- + * Cached Image. + * + * A cached resource that computes and caches a GPU texture containing the contents of the image + * with the given image user. */ +class CachedImage : public CachedResource { + private: + GPUTexture *texture_ = nullptr; + + public: + CachedImage(Context &context, Image *image, ImageUser *image_user, const char *pass_name); + + ~CachedImage(); + + GPUTexture *texture(); +}; + +/* ------------------------------------------------------------------------------------------------ + * Cached Image Container. + */ +class CachedImageContainer : CachedResourceContainer { + private: + Map>> map_; + + public: + void reset() override; + + /* Check if the given image ID has changed since the last time it was retrieved through its + * recalculate flag, and if so, invalidate its corresponding cached image and reset the + * recalculate flag to ready it to track the next change. Then, check if there is an available + * CachedImage cached resource with the given image user and pass_name in the container, if one + * exists, return it, otherwise, return a newly created one and add it to the container. In both + * cases, tag the cached resource as needed to keep it cached for the next evaluation. */ + GPUTexture *get(Context &context, + Image *image, + const ImageUser *image_user, + const char *pass_name); +}; + +} // namespace blender::realtime_compositor diff --git a/source/blender/compositor/realtime_compositor/cached_resources/intern/bokeh_kernel.cc b/source/blender/compositor/realtime_compositor/cached_resources/intern/bokeh_kernel.cc new file mode 100644 index 00000000000..3723257e0ad --- /dev/null +++ b/source/blender/compositor/realtime_compositor/cached_resources/intern/bokeh_kernel.cc @@ -0,0 +1,161 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include +#include + +#include "BLI_hash.hh" +#include "BLI_math_base.h" +#include "BLI_math_vector_types.hh" + +#include "GPU_shader.h" +#include "GPU_texture.h" + +#include "COM_bokeh_kernel.hh" +#include "COM_context.hh" +#include "COM_result.hh" +#include "COM_utilities.hh" + +namespace blender::realtime_compositor { + +/* -------------------------------------------------------------------- + * Bokeh Kernel Key. + */ + +BokehKernelKey::BokehKernelKey( + int2 size, int sides, float rotation, float roundness, float catadioptric, float lens_shift) + : size(size), + sides(sides), + rotation(rotation), + roundness(roundness), + catadioptric(catadioptric), + lens_shift(lens_shift) +{ +} + +uint64_t BokehKernelKey::hash() const +{ + return get_default_hash_3( + size, size, get_default_hash(float4(rotation, roundness, catadioptric, lens_shift))); +} + +bool operator==(const BokehKernelKey &a, const BokehKernelKey &b) +{ + return a.size == b.size && a.sides == b.sides && a.rotation == b.rotation && + a.roundness == b.roundness && a.catadioptric == b.catadioptric && + a.lens_shift == b.lens_shift; +} + +/* -------------------------------------------------------------------- + * Bokeh Kernel. + */ + +/* The exterior angle is the angle between each two consecutive vertices of the regular polygon + * from its center. */ +static float compute_exterior_angle(int sides) +{ + return (M_PI * 2.0f) / sides; +} + +static float compute_rotation(float angle, int sides) +{ + /* Offset the rotation such that the second vertex of the regular polygon lies on the positive + * y axis, which is 90 degrees minus the angle that it makes with the positive x axis assuming + * the first vertex lies on the positive x axis. */ + const float offset = M_PI_2 - compute_exterior_angle(sides); + return angle - offset; +} + +BokehKernel::BokehKernel(Context &context, + int2 size, + int sides, + float rotation, + float roundness, + float catadioptric, + float lens_shift) +{ + texture_ = GPU_texture_create_2d( + "Bokeh Kernel", + size.x, + size.y, + 1, + Result::texture_format(ResultType::Color, context.get_precision()), + GPU_TEXTURE_USAGE_SHADER_READ, + nullptr); + + GPUShader *shader = context.get_shader("compositor_bokeh_image"); + GPU_shader_bind(shader); + + GPU_shader_uniform_1f(shader, "exterior_angle", compute_exterior_angle(sides)); + GPU_shader_uniform_1f(shader, "rotation", compute_rotation(rotation, sides)); + GPU_shader_uniform_1f(shader, "roundness", roundness); + GPU_shader_uniform_1f(shader, "catadioptric", catadioptric); + GPU_shader_uniform_1f(shader, "lens_shift", lens_shift); + + const int image_unit = GPU_shader_get_sampler_binding(shader, "output_img"); + GPU_texture_image_bind(texture_, image_unit); + + compute_dispatch_threads_at_least(shader, size); + + GPU_texture_image_unbind(texture_); + GPU_shader_unbind(); +} + +BokehKernel::~BokehKernel() +{ + GPU_texture_free(texture_); +} + +void BokehKernel::bind_as_texture(GPUShader *shader, const char *texture_name) const +{ + const int texture_image_unit = GPU_shader_get_sampler_binding(shader, texture_name); + GPU_texture_bind(texture_, texture_image_unit); +} + +void BokehKernel::unbind_as_texture() const +{ + GPU_texture_unbind(texture_); +} + +GPUTexture *BokehKernel::texture() const +{ + return texture_; +} + +/* -------------------------------------------------------------------- + * Bokeh Kernel Container. + */ + +void BokehKernelContainer::reset() +{ + /* First, delete all resources that are no longer needed. */ + map_.remove_if([](auto item) { return !item.value->needed; }); + + /* Second, reset the needed status of the remaining resources to false to ready them to track + * their needed status for the next evaluation. */ + for (auto &value : map_.values()) { + value->needed = false; + } +} + +BokehKernel &BokehKernelContainer::get(Context &context, + int2 size, + int sides, + float rotation, + float roundness, + float catadioptric, + float lens_shift) +{ + const BokehKernelKey key(size, sides, rotation, roundness, catadioptric, lens_shift); + + auto &bokeh_kernel = *map_.lookup_or_add_cb(key, [&]() { + return std::make_unique( + context, size, sides, rotation, roundness, catadioptric, lens_shift); + }); + + bokeh_kernel.needed = true; + return bokeh_kernel; +} + +} // namespace blender::realtime_compositor diff --git a/source/blender/compositor/realtime_compositor/cached_resources/intern/cached_image.cc b/source/blender/compositor/realtime_compositor/cached_resources/intern/cached_image.cc new file mode 100644 index 00000000000..a082cbe3c14 --- /dev/null +++ b/source/blender/compositor/realtime_compositor/cached_resources/intern/cached_image.cc @@ -0,0 +1,321 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include +#include + +#include "BLI_array.hh" +#include "BLI_assert.h" +#include "BLI_hash.hh" +#include "BLI_listbase.h" + +#include "RE_pipeline.h" + +#include "GPU_shader.h" +#include "GPU_texture.h" + +#include "IMB_imbuf.h" +#include "IMB_imbuf_types.h" + +#include "BKE_image.h" +#include "BKE_lib_id.h" + +#include "DNA_ID.h" +#include "DNA_image_types.h" + +#include "COM_cached_image.hh" +#include "COM_context.hh" +#include "COM_result.hh" +#include "COM_utilities.hh" + +namespace blender::realtime_compositor { + +/* -------------------------------------------------------------------- + * Cached Image Key. + */ + +CachedImageKey::CachedImageKey(ImageUser image_user, std::string pass_name) + : image_user(image_user), pass_name(pass_name) +{ +} + +uint64_t CachedImageKey::hash() const +{ + return get_default_hash_4(image_user.framenr, image_user.layer, image_user.view, pass_name); +} + +bool operator==(const CachedImageKey &a, const CachedImageKey &b) +{ + return a.image_user.framenr == b.image_user.framenr && + a.image_user.layer == b.image_user.layer && a.image_user.view == b.image_user.view && + a.pass_name == b.pass_name; +} + +/* -------------------------------------------------------------------- + * Cached Image. + */ + +/* Returns a new texture of the given format and precision preprocessed using the given shader. The + * input texture is freed. */ +static GPUTexture *preprocess_texture(Context &context, + GPUTexture *input_texture, + eGPUTextureFormat target_format, + ResultPrecision precision, + const char *shader_name) +{ + const int2 size = int2(GPU_texture_width(input_texture), GPU_texture_height(input_texture)); + + GPUTexture *preprocessed_texture = GPU_texture_create_2d( + "Cached Image", size.x, size.y, 1, target_format, GPU_TEXTURE_USAGE_GENERAL, nullptr); + + GPUShader *shader = context.get_shader(shader_name, precision); + GPU_shader_bind(shader); + + const int input_unit = GPU_shader_get_sampler_binding(shader, "input_tx"); + GPU_texture_bind(input_texture, input_unit); + + const int image_unit = GPU_shader_get_sampler_binding(shader, "output_img"); + GPU_texture_image_bind(preprocessed_texture, image_unit); + + compute_dispatch_threads_at_least(shader, size); + + GPU_shader_unbind(); + GPU_texture_unbind(input_texture); + GPU_texture_image_unbind(preprocessed_texture); + GPU_texture_free(input_texture); + + return preprocessed_texture; +} + +/* Compositor images are expected to be always pre-multiplied, so identify if the GPU texture + * returned by the IMB module is straight and needs to be pre-multiplied. An exception is when + * the image has an alpha mode of channel packed or alpha ignore, in which case, we always ignore + * pre-multiplication. */ +static bool should_premultiply_alpha(Image *image, ImBuf *image_buffer) +{ + if (ELEM(image->alpha_mode, IMA_ALPHA_CHANNEL_PACKED, IMA_ALPHA_IGNORE)) { + return false; + } + + return !BKE_image_has_gpu_texture_premultiplied_alpha(image, image_buffer); +} + +/* Get a suitable texture format supported by the compositor given the format of the texture + * returned by the IMB module. See imb_gpu_get_format for the formats that needs to be handled. */ +static eGPUTextureFormat get_compatible_texture_format(eGPUTextureFormat original_format) +{ + switch (original_format) { + case GPU_R16F: + case GPU_R32F: + case GPU_RGBA16F: + case GPU_RGBA32F: + return original_format; + case GPU_R8: + return GPU_R16F; + case GPU_RGBA8: + case GPU_SRGB8_A8: + return GPU_RGBA16F; + default: + break; + } + + BLI_assert_unreachable(); + return original_format; +} + +/* Get the selected render layer selected assuming the image is a multilayer image. */ +static RenderLayer *get_render_layer(Image *image, ImageUser &image_user) +{ + const ListBase *layers = &image->rr->layers; + return static_cast(BLI_findlink(layers, image_user.layer)); +} + +/* Get the index of the pass with the given name in the selected render layer's passes list + * assuming the image is a multilayer image. */ +static int get_pass_index(Image *image, ImageUser &image_user, const char *name) +{ + const RenderLayer *render_layer = get_render_layer(image, image_user); + return BLI_findstringindex(&render_layer->passes, name, offsetof(RenderPass, name)); +} + +/* Get the index of the view selected in the image user. If the image is not a multi-view image + * or only has a single view, then zero is returned. Otherwise, if the image is a multi-view + * image, the index of the selected view is returned. However, note that the value of the view + * member of the image user is not the actual index of the view. More specifically, the index 0 + * is reserved to denote the special mode of operation "All", which dynamically selects the view + * whose name matches the view currently being rendered. It follows that the views are then + * indexed starting from 1. So for non zero view values, the actual index of the view is the + * value of the view member of the image user minus 1. */ +static int get_view_index(Context &context, Image *image, ImageUser &image_user) +{ + /* The image is not a multi-view image, so just return zero. */ + if (!BKE_image_is_multiview(image)) { + return 0; + } + + const ListBase *views = &image->rr->views; + /* There is only one view and its index is 0. */ + if (BLI_listbase_count_at_most(views, 2) < 2) { + return 0; + } + + const int view = image_user.view; + /* The view is not zero, which means it is manually specified and the actual index is then the + * view value minus 1. */ + if (view != 0) { + return view - 1; + } + + /* Otherwise, the view value is zero, denoting the special mode of operation "All", which finds + * the index of the view whose name matches the view currently being rendered. */ + const char *view_name = context.get_view_name().data(); + const int matched_view = BLI_findstringindex(views, view_name, offsetof(RenderView, name)); + + /* No view matches the view currently being rendered, so fallback to the first view. */ + if (matched_view == -1) { + return 0; + } + + return matched_view; +} + +/* Get a copy of the image user that is appropriate to retrieve the needed image buffer from the + * image. This essentially sets the appropriate frame, pass, and view that corresponds to the + * given context and pass name. */ +static ImageUser compute_image_user_for_pass(Context &context, + Image *image, + const ImageUser *image_user, + const char *pass_name) +{ + ImageUser image_user_for_pass = *image_user; + + /* Set the needed view. */ + image_user_for_pass.view = get_view_index(context, image, image_user_for_pass); + + /* Set the needed pass. */ + if (BKE_image_is_multilayer(image)) { + image_user_for_pass.pass = get_pass_index(image, image_user_for_pass, pass_name); + BKE_image_multilayer_index(image->rr, &image_user_for_pass); + } + else { + BKE_image_multiview_index(image, &image_user_for_pass); + } + + return image_user_for_pass; +} + +CachedImage::CachedImage(Context &context, + Image *image, + ImageUser *image_user, + const char *pass_name) +{ + /* We can't retrieve the needed image buffer yet, because we still need to assign the pass index + * to the image user in order to acquire the image buffer corresponding to the given pass name. + * However, in order to compute the pass index, we need the render result structure of the image + * to be initialized. So we first acquire a dummy image buffer since it initializes the image + * render result as a side effect. We also use that as a mean of validation, since we can early + * exit if the returned image buffer is nullptr. This image buffer can be immediately released. + * Since it carries no important information. */ + ImBuf *initial_image_buffer = BKE_image_acquire_ibuf(image, image_user, nullptr); + BKE_image_release_ibuf(image, initial_image_buffer, nullptr); + if (!initial_image_buffer) { + return; + } + + ImageUser image_user_for_pass = compute_image_user_for_pass( + context, image, image_user, pass_name); + + ImBuf *image_buffer = BKE_image_acquire_ibuf(image, &image_user_for_pass, nullptr); + const bool is_premultiplied = BKE_image_has_gpu_texture_premultiplied_alpha(image, image_buffer); + texture_ = IMB_create_gpu_texture("Image Texture", image_buffer, true, is_premultiplied); + + const eGPUTextureFormat original_format = GPU_texture_format(texture_); + const eGPUTextureFormat target_format = get_compatible_texture_format(original_format); + const ResultType result_type = Result::type(target_format); + const ResultPrecision precision = Result::precision(target_format); + + /* The GPU image returned by the IMB module can be in a format not supported by the compositor, + * or it might need pre-multiplication, so preprocess them first. */ + if (result_type == ResultType::Color && should_premultiply_alpha(image, image_buffer)) { + texture_ = preprocess_texture( + context, texture_, target_format, precision, "compositor_premultiply_alpha"); + } + else if (original_format != target_format) { + const char *conversion_shader_name = result_type == ResultType::Float ? + "compositor_convert_float_to_float" : + "compositor_convert_color_to_color"; + texture_ = preprocess_texture( + context, texture_, target_format, precision, conversion_shader_name); + } + + /* Set the alpha to 1 using swizzling if alpha is ignored. */ + if (result_type == ResultType::Color && image->alpha_mode == IMA_ALPHA_IGNORE) { + GPU_texture_swizzle_set(texture_, "rgb1"); + } + + BKE_image_release_ibuf(image, image_buffer, nullptr); +} + +CachedImage::~CachedImage() +{ + GPU_texture_free(texture_); +} + +GPUTexture *CachedImage::texture() +{ + return texture_; +} + +/* -------------------------------------------------------------------- + * Cached Image Container. + */ + +void CachedImageContainer::reset() +{ + /* First, delete all cached images that are no longer needed. */ + for (auto &cached_images_for_id : map_.values()) { + cached_images_for_id.remove_if([](auto item) { return !item.value->needed; }); + } + map_.remove_if([](auto item) { return item.value.is_empty(); }); + + /* Second, reset the needed status of the remaining cached images to false to ready them to + * track their needed status for the next evaluation. */ + for (auto &cached_images_for_id : map_.values()) { + for (auto &value : cached_images_for_id.values()) { + value->needed = false; + } + } +} + +GPUTexture *CachedImageContainer::get(Context &context, + Image *image, + const ImageUser *image_user, + const char *pass_name) +{ + if (!image || !image_user) { + return nullptr; + } + + /* Compute the effective frame number of the image if it was animated. */ + ImageUser image_user_for_frame = *image_user; + BKE_image_user_frame_calc(image, &image_user_for_frame, context.get_frame_number()); + + const CachedImageKey key(image_user_for_frame, pass_name); + + auto &cached_images_for_id = map_.lookup_or_add_default(image->id.name); + + /* Invalidate the cache for that image ID if it was changed and reset the recalculate flag. */ + if (context.query_id_recalc_flag(reinterpret_cast(image)) & ID_RECALC_ALL) { + cached_images_for_id.clear(); + } + + auto &cached_image = *cached_images_for_id.lookup_or_add_cb(key, [&]() { + return std::make_unique(context, image, &image_user_for_frame, pass_name); + }); + + cached_image.needed = true; + return cached_image.texture(); +} + +} // namespace blender::realtime_compositor diff --git a/source/blender/compositor/realtime_compositor/cached_resources/intern/keying_screen.cc b/source/blender/compositor/realtime_compositor/cached_resources/intern/keying_screen.cc index 206346c7382..3efe8a6e907 100644 --- a/source/blender/compositor/realtime_compositor/cached_resources/intern/keying_screen.cc +++ b/source/blender/compositor/realtime_compositor/cached_resources/intern/keying_screen.cc @@ -64,8 +64,8 @@ static void compute_marker_points(MovieClip *movie_clip, Vector &marker_positions, Vector &marker_colors) { - BLI_assert(marker_positions.size() == 0); - BLI_assert(marker_colors.size() == 0); + BLI_assert(marker_positions.is_empty()); + BLI_assert(marker_colors.is_empty()); ImBuf *image_buffer = BKE_movieclip_get_ibuf(movie_clip, &movie_clip_user); if (!image_buffer) { diff --git a/source/blender/compositor/realtime_compositor/intern/context.cc b/source/blender/compositor/realtime_compositor/intern/context.cc index ec00a558c68..4ec7baa8ec9 100644 --- a/source/blender/compositor/realtime_compositor/intern/context.cc +++ b/source/blender/compositor/realtime_compositor/intern/context.cc @@ -9,6 +9,7 @@ #include "GPU_shader.h" #include "COM_context.hh" +#include "COM_render_context.hh" #include "COM_static_cache_manager.hh" #include "COM_texture_pool.hh" @@ -16,6 +17,11 @@ namespace blender::realtime_compositor { Context::Context(TexturePool &texture_pool) : texture_pool_(texture_pool) {} +RenderContext *Context::render_context() const +{ + return nullptr; +} + int2 Context::get_compositing_region_size() const { const rcti compositing_region = get_compositing_region(); diff --git a/source/blender/compositor/realtime_compositor/intern/render_context.cc b/source/blender/compositor/realtime_compositor/intern/render_context.cc new file mode 100644 index 00000000000..f0c241c263e --- /dev/null +++ b/source/blender/compositor/realtime_compositor/intern/render_context.cc @@ -0,0 +1,151 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include +#include + +#include "BLI_assert.h" +#include "BLI_listbase.h" +#include "BLI_map.hh" +#include "BLI_math_base.hh" +#include "BLI_math_vector_types.hh" +#include "BLI_string.h" +#include "BLI_utildefines.h" + +#include "MEM_guardedalloc.h" + +#include "IMB_imbuf.h" +#include "IMB_imbuf_types.h" + +#include "DNA_scene_types.h" +#include "DNA_windowmanager_types.h" + +#include "BKE_image.h" +#include "BKE_image_save.h" +#include "BKE_report.h" + +#include "RE_pipeline.h" + +#include "COM_render_context.hh" + +namespace blender::realtime_compositor { + +/* ------------------------------------------------------------------------------------------------ + * File Output + */ + +FileOutput::FileOutput(std::string path, ImageFormatData format, int2 size, bool save_as_render) + : path_(path), format_(format), save_as_render_(save_as_render) +{ + render_result_ = MEM_cnew("Temporary Render Result For File Output"); + + render_result_->rectx = size.x; + render_result_->recty = size.y; + + /* File outputs are always single layer, as images are actually stored in passes on that single + * layer. Create a single unnamed layer to add the passes to. A single unnamed layer is treated + * by the EXR writer as a special case where the channel names take the form: + * .. + * Otherwise, the layer name would have preceded in the pass name in yet another section. */ + RenderLayer *render_layer = MEM_cnew("Render Layer For File Output."); + BLI_addtail(&render_result_->layers, render_layer); + render_layer->name[0] = '\0'; +} + +FileOutput::~FileOutput() +{ + RE_FreeRenderResult(render_result_); +} + +void FileOutput::add_view(const char *view_name) +{ + /* Empty views can only be added for EXR images. */ + BLI_assert(ELEM(format_.imtype, R_IMF_IMTYPE_OPENEXR, R_IMF_IMTYPE_MULTILAYER)); + + RenderView *render_view = MEM_cnew("Render View For File Output."); + BLI_addtail(&render_result_->views, render_view); + STRNCPY(render_view->name, view_name); +} + +void FileOutput::add_view(const char *view_name, int channels, float *buffer) +{ + RenderView *render_view = MEM_cnew("Render View For File Output."); + BLI_addtail(&render_result_->views, render_view); + STRNCPY(render_view->name, view_name); + + render_view->ibuf = IMB_allocImBuf( + render_result_->rectx, render_result_->recty, channels * 8, 0); + render_view->ibuf->channels = channels; + IMB_assign_float_buffer(render_view->ibuf, buffer, IB_TAKE_OWNERSHIP); +} + +void FileOutput::add_pass(const char *pass_name, + const char *view_name, + const char *channels, + float *buffer) +{ + /* Passes can only be added for EXR images. */ + BLI_assert(ELEM(format_.imtype, R_IMF_IMTYPE_OPENEXR, R_IMF_IMTYPE_MULTILAYER)); + + RenderLayer *render_layer = static_cast(render_result_->layers.first); + RenderPass *render_pass = MEM_cnew("Render Pass For File Output."); + BLI_addtail(&render_layer->passes, render_pass); + STRNCPY(render_pass->name, pass_name); + STRNCPY(render_pass->view, view_name); + STRNCPY(render_pass->chan_id, channels); + + const int channels_count = BLI_strnlen(channels, 4); + render_pass->rectx = render_result_->rectx; + render_pass->recty = render_result_->recty; + render_pass->channels = channels_count; + + render_pass->ibuf = IMB_allocImBuf( + render_result_->rectx, render_result_->recty, channels_count * 8, 0); + render_pass->ibuf->channels = channels_count; + IMB_assign_float_buffer(render_pass->ibuf, buffer, IB_TAKE_OWNERSHIP); +} + +void FileOutput::add_meta_data(std::string key, std::string value) +{ + meta_data_.add(key, value); +} + +void FileOutput::save(Scene *scene) +{ + ReportList reports; + BKE_reports_init(&reports, RPT_STORE); + + /* Add scene stamp data as meta data as well as the custom meta data. */ + BKE_render_result_stamp_info(scene, nullptr, render_result_, false); + for (const auto &field : meta_data_.items()) { + BKE_render_result_stamp_data(render_result_, field.key.c_str(), field.value.c_str()); + } + + BKE_image_render_write( + &reports, render_result_, scene, true, path_.c_str(), &format_, save_as_render_); + + BKE_reports_free(&reports); +} + +/* ------------------------------------------------------------------------------------------------ + * Render Context + */ + +FileOutput &RenderContext::get_file_output(std::string path, + ImageFormatData format, + int2 size, + bool save_as_render) +{ + return *file_outputs_.lookup_or_add_cb( + path, [&]() { return std::make_unique(path, format, size, save_as_render); }); +} + +void RenderContext::save_file_outputs(Scene *scene) +{ + for (std::unique_ptr &file_output : file_outputs_.values()) { + file_output->save(scene); + } +} + +} // namespace blender::realtime_compositor diff --git a/source/blender/compositor/realtime_compositor/intern/result.cc b/source/blender/compositor/realtime_compositor/intern/result.cc index 61a7120c6ea..493d4f8821b 100644 --- a/source/blender/compositor/realtime_compositor/intern/result.cc +++ b/source/blender/compositor/realtime_compositor/intern/result.cc @@ -433,6 +433,18 @@ ResultType Result::type() const return type_; } +ResultPrecision Result::precision() const +{ + return precision_; +} + +void Result::set_precision(ResultPrecision precision) +{ + /* Changing the precision can only be done if it wasn't allocated yet. */ + BLI_assert(!is_allocated()); + precision_ = precision; +} + bool Result::is_texture() const { return !is_single_value_; diff --git a/source/blender/compositor/realtime_compositor/intern/static_cache_manager.cc b/source/blender/compositor/realtime_compositor/intern/static_cache_manager.cc index 3b8aeb90e4c..ed0f952be54 100644 --- a/source/blender/compositor/realtime_compositor/intern/static_cache_manager.cc +++ b/source/blender/compositor/realtime_compositor/intern/static_cache_manager.cc @@ -18,6 +18,8 @@ void StaticCacheManager::reset() distortion_grids.reset(); keying_screens.reset(); cached_shaders.reset(); + bokeh_kernels.reset(); + cached_images.reset(); } } // namespace blender::realtime_compositor diff --git a/source/blender/compositor/realtime_compositor/shaders/compositor_cryptomatte_image.glsl b/source/blender/compositor/realtime_compositor/shaders/compositor_cryptomatte_image.glsl new file mode 100644 index 00000000000..f05fdb4a7bd --- /dev/null +++ b/source/blender/compositor/realtime_compositor/shaders/compositor_cryptomatte_image.glsl @@ -0,0 +1,15 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma BLENDER_REQUIRE(gpu_shader_compositor_texture_utilities.glsl) + +void main() +{ + ivec2 texel = ivec2(gl_GlobalInvocationID.xy); + vec4 input_color = texture_load(input_tx, texel); + float input_matte = texture_load(matte_tx, texel).x; + + /* Premultiply the alpha to the image. */ + imageStore(output_img, texel, input_color * vec4(input_matte)); +} diff --git a/source/blender/compositor/realtime_compositor/shaders/compositor_cryptomatte_matte.glsl b/source/blender/compositor/realtime_compositor/shaders/compositor_cryptomatte_matte.glsl new file mode 100644 index 00000000000..ed231c92696 --- /dev/null +++ b/source/blender/compositor/realtime_compositor/shaders/compositor_cryptomatte_matte.glsl @@ -0,0 +1,48 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/* Loops over all identifiers selected by the user, and accumulate the coverage of ranks whose + * identifiers match that of the user selected identifiers. + * + * This is described in section "Matte Extraction: Implementation Details" in the original + * Cryptomatte publication: + * + * Friedman, Jonah, and Andrew C. Jones. "Fully automatic id mattes with support for motion blur + * and transparency." ACM SIGGRAPH 2015 Posters. 2015. 1-1. + */ + +#pragma BLENDER_REQUIRE(gpu_shader_compositor_texture_utilities.glsl) + +void main() +{ + ivec2 texel = ivec2(gl_GlobalInvocationID.xy); + vec4 layer = texture_load(layer_tx, texel); + + /* Each Cryptomatte layer stores two ranks. */ + vec2 first_rank = layer.xy; + vec2 second_rank = layer.zw; + + /* Each Cryptomatte rank stores a pair of an identifier and the coverage of the entity identified + * by that identifier. */ + float identifier_of_first_rank = first_rank.x; + float coverage_of_first_rank = first_rank.y; + float identifier_of_second_rank = second_rank.x; + float coverage_of_second_rank = second_rank.y; + + /* Loop over all identifiers selected by the user, if the identifier of either of the ranks match + * it, accumulate its coverage. */ + float total_coverage = 0.0; + for (int i = 0; i < identifiers_count; i++) { + float identifier = identifiers[i]; + if (identifier_of_first_rank == identifier) { + total_coverage += coverage_of_first_rank; + } + if (identifier_of_second_rank == identifier) { + total_coverage += coverage_of_second_rank; + } + } + + /* Add the total coverage to the coverage accumulated by previous layers. */ + imageStore(matte_img, texel, imageLoad(matte_img, texel) + vec4(total_coverage)); +} diff --git a/source/blender/compositor/realtime_compositor/shaders/compositor_cryptomatte_pick.glsl b/source/blender/compositor/realtime_compositor/shaders/compositor_cryptomatte_pick.glsl new file mode 100644 index 00000000000..51c9b27c7c1 --- /dev/null +++ b/source/blender/compositor/realtime_compositor/shaders/compositor_cryptomatte_pick.glsl @@ -0,0 +1,43 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/* Blender provides a Cryptomatte picker operator (UI_OT_eyedropper_color) that can pick a + * Cryptomatte entity from an image. That image is a specially encoded image that the picker + * operator can understand. In particular, its red channel is the identifier of the entity in the + * first rank, while the green and blue channels are arbitrary [0, 1] compressed versions of the + * identifier to make the image more humane-viewable, but they are actually ignored by the picker + * operator, as can be seen in functions like eyedropper_color_sample_text_update, where only the + * red channel is considered. + * + * This shader just computes this special image given the first Cryptomatte layer. The output needs + * to be in full precision since the identifier is a 32-bit float. + * + * This is the same concept as the "keyable" image described in section "Matte Extraction: + * Implementation Details" in the original Cryptomatte publication: + * + * Friedman, Jonah, and Andrew C. Jones. "Fully automatic id mattes with support for motion blur + * and transparency." ACM SIGGRAPH 2015 Posters. 2015. 1-1. + * + * Except we put the identifier in the red channel by convention instead of the suggested blue + * channel. */ + +#pragma BLENDER_REQUIRE(gpu_shader_compositor_texture_utilities.glsl) + +void main() +{ + ivec2 texel = ivec2(gl_GlobalInvocationID.xy); + + /* Each layer stores two ranks, each rank contains a pair, the identifier and the coverage of + * the entity identified by the identifier. */ + vec2 first_rank = texture_load(first_layer_tx, texel).xy; + float id_of_first_rank = first_rank.x; + + /* There is no logic to this, we just compute arbitrary compressed versions of the identifier in + * the [0, 1] range to make the image more human-viewable. */ + uint hash_value = floatBitsToUint(id_of_first_rank); + float green = float(hash_value << 8) / float(0xFFFFFFFFu); + float blue = float(hash_value << 16) / float(0xFFFFFFFFu); + + imageStore(output_img, texel, vec4(id_of_first_rank, green, blue, 1.0)); +} diff --git a/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform.glsl b/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform.glsl index 3f23207046f..54e1b19b419 100644 --- a/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform.glsl +++ b/source/blender/compositor/realtime_compositor/shaders/compositor_plane_deform.glsl @@ -23,6 +23,14 @@ void main() vec4 sampled_color = textureGrad(input_tx, projected_coordinates, x_gradient, y_gradient); + /* The plane mask is 1 if it is inside the plane and 0 otherwise. However, we use the alpha value + * of the sampled color for pixels outside of the plane to utilize the anti-aliasing effect of + * the anisotropic filtering. Therefore, the input_tx sampler should use anisotropic filtering + * and be clamped to zero border color. */ + bool is_inside_plane = all(greaterThanEqual(projected_coordinates, vec2(0.0))) && + all(lessThanEqual(projected_coordinates, vec2(1.0))); + float mask_value = is_inside_plane ? 1.0 : sampled_color.a; + imageStore(output_img, texel, sampled_color); - imageStore(mask_img, texel, sampled_color.aaaa); + imageStore(mask_img, texel, vec4(mask_value)); } diff --git a/source/blender/compositor/realtime_compositor/shaders/compositor_premultiply_alpha.glsl b/source/blender/compositor/realtime_compositor/shaders/compositor_premultiply_alpha.glsl new file mode 100644 index 00000000000..593b15260c5 --- /dev/null +++ b/source/blender/compositor/realtime_compositor/shaders/compositor_premultiply_alpha.glsl @@ -0,0 +1,12 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#pragma BLENDER_REQUIRE(gpu_shader_compositor_texture_utilities.glsl) + +void main() +{ + ivec2 texel = ivec2(gl_GlobalInvocationID.xy); + vec4 input_color = texture_load(input_tx, texel); + imageStore(output_img, texel, input_color * vec4(vec3(input_color.a), 1.0)); +} diff --git a/source/blender/compositor/realtime_compositor/shaders/infos/compositor_convert_info.hh b/source/blender/compositor/realtime_compositor/shaders/infos/compositor_convert_info.hh index a44d97e6365..10800381449 100644 --- a/source/blender/compositor/realtime_compositor/shaders/infos/compositor_convert_info.hh +++ b/source/blender/compositor/realtime_compositor/shaders/infos/compositor_convert_info.hh @@ -10,6 +10,12 @@ GPU_SHADER_CREATE_INFO(compositor_convert_shared) .typedef_source("gpu_shader_compositor_type_conversion.glsl") .compute_source("compositor_convert.glsl"); +GPU_SHADER_CREATE_INFO(compositor_convert_float_to_float) + .additional_info("compositor_convert_shared") + .image(0, GPU_R16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_img") + .define("CONVERT_EXPRESSION(value)", "value") + .do_static_compilation(true); + GPU_SHADER_CREATE_INFO(compositor_convert_float_to_vector) .additional_info("compositor_convert_shared") .image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_img") @@ -34,14 +40,32 @@ GPU_SHADER_CREATE_INFO(compositor_convert_color_to_vector) .define("CONVERT_EXPRESSION(value)", "vec4(vec3_from_vec4(value), 0.0)") .do_static_compilation(true); +GPU_SHADER_CREATE_INFO(compositor_convert_color_to_color) + .additional_info("compositor_convert_shared") + .image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_img") + .define("CONVERT_EXPRESSION(value)", "value") + .do_static_compilation(true); + GPU_SHADER_CREATE_INFO(compositor_convert_vector_to_float) .additional_info("compositor_convert_shared") .image(0, GPU_R16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_img") .define("CONVERT_EXPRESSION(value)", "vec4(float_from_vec3(value.xyz), vec3(0.0))") .do_static_compilation(true); +GPU_SHADER_CREATE_INFO(compositor_convert_vector_to_vector) + .additional_info("compositor_convert_shared") + .image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_img") + .define("CONVERT_EXPRESSION(value)", "value") + .do_static_compilation(true); + GPU_SHADER_CREATE_INFO(compositor_convert_vector_to_color) .additional_info("compositor_convert_shared") .image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_img") .define("CONVERT_EXPRESSION(value)", "vec4_from_vec3(value.xyz)") .do_static_compilation(true); + +GPU_SHADER_CREATE_INFO(compositor_convert_color_to_alpha) + .additional_info("compositor_convert_shared") + .image(0, GPU_R16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_img") + .define("CONVERT_EXPRESSION(value)", "vec4(value.a)") + .do_static_compilation(true); diff --git a/source/blender/compositor/realtime_compositor/shaders/infos/compositor_cryptomatte_info.hh b/source/blender/compositor/realtime_compositor/shaders/infos/compositor_cryptomatte_info.hh new file mode 100644 index 00000000000..5eef93499b4 --- /dev/null +++ b/source/blender/compositor/realtime_compositor/shaders/infos/compositor_cryptomatte_info.hh @@ -0,0 +1,29 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "gpu_shader_create_info.hh" + +GPU_SHADER_CREATE_INFO(compositor_cryptomatte_pick) + .local_group_size(16, 16) + .sampler(0, ImageType::FLOAT_2D, "first_layer_tx") + .image(0, GPU_RGBA32F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_img") + .compute_source("compositor_cryptomatte_pick.glsl") + .do_static_compilation(true); + +GPU_SHADER_CREATE_INFO(compositor_cryptomatte_matte) + .local_group_size(16, 16) + .push_constant(Type::INT, "identifiers_count") + .push_constant(Type::FLOAT, "identifiers", 32) + .sampler(0, ImageType::FLOAT_2D, "layer_tx") + .image(0, GPU_RGBA16F, Qualifier::READ_WRITE, ImageType::FLOAT_2D, "matte_img") + .compute_source("compositor_cryptomatte_matte.glsl") + .do_static_compilation(true); + +GPU_SHADER_CREATE_INFO(compositor_cryptomatte_image) + .local_group_size(16, 16) + .sampler(0, ImageType::FLOAT_2D, "input_tx") + .sampler(1, ImageType::FLOAT_2D, "matte_tx") + .image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_img") + .compute_source("compositor_cryptomatte_image.glsl") + .do_static_compilation(true); diff --git a/source/blender/compositor/realtime_compositor/shaders/infos/compositor_premultiply_alpha_info.hh b/source/blender/compositor/realtime_compositor/shaders/infos/compositor_premultiply_alpha_info.hh new file mode 100644 index 00000000000..c698750269b --- /dev/null +++ b/source/blender/compositor/realtime_compositor/shaders/infos/compositor_premultiply_alpha_info.hh @@ -0,0 +1,12 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "gpu_shader_create_info.hh" + +GPU_SHADER_CREATE_INFO(compositor_premultiply_alpha) + .local_group_size(16, 16) + .sampler(0, ImageType::FLOAT_2D, "input_tx") + .image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_img") + .compute_source("compositor_premultiply_alpha.glsl") + .do_static_compilation(true); diff --git a/source/blender/compositor/realtime_compositor/shaders/infos/compositor_read_input_info.hh b/source/blender/compositor/realtime_compositor/shaders/infos/compositor_read_input_info.hh index d1dee6b8a56..a8e80ebb948 100644 --- a/source/blender/compositor/realtime_compositor/shaders/infos/compositor_read_input_info.hh +++ b/source/blender/compositor/realtime_compositor/shaders/infos/compositor_read_input_info.hh @@ -24,10 +24,8 @@ GPU_SHADER_CREATE_INFO(compositor_read_input_vector) GPU_SHADER_CREATE_INFO(compositor_read_input_color) .additional_info("compositor_read_input_shared") - .push_constant(Type::BOOL, "premultiply_alpha") .image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "output_img") - .define("READ_EXPRESSION(input_color)", - "input_color * vec4(vec3(premultiply_alpha ? input_color.a : 1.0), 1.0)") + .define("READ_EXPRESSION(input_color)", "input_color") .do_static_compilation(true); GPU_SHADER_CREATE_INFO(compositor_read_input_alpha) diff --git a/source/blender/depsgraph/DEG_depsgraph_build.hh b/source/blender/depsgraph/DEG_depsgraph_build.hh index 918b8f592ce..a75af424c25 100644 --- a/source/blender/depsgraph/DEG_depsgraph_build.hh +++ b/source/blender/depsgraph/DEG_depsgraph_build.hh @@ -120,6 +120,10 @@ void DEG_add_scene_relation(DepsNodeHandle *node_handle, Scene *scene, eDepsSceneComponentType component, const char *description); +void DEG_add_scene_camera_relation(DepsNodeHandle *node_handle, + Scene *scene, + eDepsObjectComponentType component, + const char *description); void DEG_add_object_relation(DepsNodeHandle *node_handle, Object *object, eDepsObjectComponentType component, diff --git a/source/blender/depsgraph/intern/depsgraph_build.cc b/source/blender/depsgraph/intern/depsgraph_build.cc index 24aab99c197..c39f06e24da 100644 --- a/source/blender/depsgraph/intern/depsgraph_build.cc +++ b/source/blender/depsgraph/intern/depsgraph_build.cc @@ -83,6 +83,24 @@ void DEG_add_scene_relation(DepsNodeHandle *node_handle, deg_node_handle->builder->add_node_handle_relation(comp_key, deg_node_handle, description); } +void DEG_add_scene_camera_relation(DepsNodeHandle *node_handle, + Scene *scene, + eDepsObjectComponentType component, + const char *description) +{ + if (scene->camera != nullptr) { + DEG_add_object_relation(node_handle, scene->camera, component, description); + } + + /* Like DepsgraphNodeBuilder::build_scene_camera(), we also need to account for other cameras + * referenced by markers. */ + LISTBASE_FOREACH (TimeMarker *, marker, &scene->markers) { + if (!ELEM(marker->camera, nullptr, scene->camera)) { + DEG_add_object_relation(node_handle, marker->camera, component, description); + } + } +} + void DEG_add_object_relation(DepsNodeHandle *node_handle, Object *object, eDepsObjectComponentType component, diff --git a/source/blender/depsgraph/intern/depsgraph_tag.cc b/source/blender/depsgraph/intern/depsgraph_tag.cc index 4bf3878ac6b..96786164baf 100644 --- a/source/blender/depsgraph/intern/depsgraph_tag.cc +++ b/source/blender/depsgraph/intern/depsgraph_tag.cc @@ -557,7 +557,14 @@ void graph_tag_ids_for_visible_update(Depsgraph *graph) if (id_type == ID_OB) { flags |= ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY; } - graph_id_tag_update(bmain, graph, id_node->id_orig, flags, DEG_UPDATE_SOURCE_VISIBILITY); + /* For non-COW datablocks like images, there is no need to update when + * they just got added to the depsgraph and there is no flag indicating + * a specific change that was made to them. Unlike COW datablocks which + * have just been copied. + * This helps preserve cached image draw data for the compositor. */ + if (ID_TYPE_IS_COW(id_type) || flags != 0) { + graph_id_tag_update(bmain, graph, id_node->id_orig, flags, DEG_UPDATE_SOURCE_VISIBILITY); + } if (id_type == ID_SCE) { /* Make sure collection properties are up to date. */ id_node->tag_update(graph, DEG_UPDATE_SOURCE_VISIBILITY); diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index ad9e3ec4bb8..a20186dde14 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -250,7 +250,7 @@ set(SRC intern/draw_manager.hh intern/draw_manager_profiling.hh intern/draw_manager_testing.h - intern/draw_manager_text.h + intern/draw_manager_text.hh intern/draw_pass.hh intern/draw_pbvh.hh intern/draw_resource.hh @@ -506,6 +506,7 @@ set(GLSL_SRC engines/eevee_next/shaders/eevee_film_cryptomatte_post_comp.glsl engines/eevee_next/shaders/eevee_film_frag.glsl engines/eevee_next/shaders/eevee_film_lib.glsl + engines/eevee_next/shaders/eevee_forward_lib.glsl engines/eevee_next/shaders/eevee_gbuffer_lib.glsl engines/eevee_next/shaders/eevee_geom_curves_vert.glsl engines/eevee_next/shaders/eevee_geom_gpencil_vert.glsl @@ -597,6 +598,7 @@ set(GLSL_SRC engines/eevee_next/shaders/eevee_surf_deferred_frag.glsl engines/eevee_next/shaders/eevee_surf_depth_frag.glsl engines/eevee_next/shaders/eevee_surf_forward_frag.glsl + engines/eevee_next/shaders/eevee_surf_hybrid_frag.glsl engines/eevee_next/shaders/eevee_surf_lib.glsl engines/eevee_next/shaders/eevee_surf_occupancy_frag.glsl engines/eevee_next/shaders/eevee_surf_shadow_frag.glsl @@ -927,8 +929,8 @@ if(WITH_XR_OPENXR) endif() if(WITH_GTESTS) - if(WITH_OPENGL_DRAW_TESTS) - add_definitions(-DWITH_OPENGL_DRAW_TESTS) + if(WITH_GPU_DRAW_TESTS) + add_definitions(-DWITH_GPU_DRAW_TESTS) if(WITH_OPENGL_BACKEND) add_definitions(-DWITH_OPENGL_BACKEND) endif() @@ -963,7 +965,7 @@ blender_add_lib(bf_draw "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") if(WITH_GTESTS) - if(WITH_OPENGL_DRAW_TESTS) + if(WITH_GPU_DRAW_TESTS) set(TEST_SRC tests/draw_pass_test.cc tests/draw_testing.cc diff --git a/source/blender/draw/DRW_pbvh.hh b/source/blender/draw/DRW_pbvh.hh index 3ac7682ab73..2a12fdfcb72 100644 --- a/source/blender/draw/DRW_pbvh.hh +++ b/source/blender/draw/DRW_pbvh.hh @@ -80,9 +80,9 @@ struct PBVH_GPU_Args { Span prim_indices; - const bool *hide_poly; + VArraySpan hide_poly; - Span mlooptri; + Span looptris; Span looptri_faces; /* BMesh. */ diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_surface_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_surface_lib.glsl index e02759f6c82..92f46a59c8b 100644 --- a/source/blender/draw/engines/eevee/shaders/closure_eval_surface_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/closure_eval_surface_lib.glsl @@ -95,7 +95,7 @@ Closure closure_eval(ClosureTranslucent translucent) /* Glue with the old system. */ CLOSURE_VARS_DECLARE_1(Translucent); - in_Translucent_0.N = translucent.N; + in_Translucent_0.N = -translucent.N; CLOSURE_EVAL_FUNCTION_1(TranslucentBSDF, Translucent); diff --git a/source/blender/draw/engines/eevee_next/eevee_hizbuffer.hh b/source/blender/draw/engines/eevee_next/eevee_hizbuffer.hh index dc7a2eb12e1..6243728b35c 100644 --- a/source/blender/draw/engines/eevee_next/eevee_hizbuffer.hh +++ b/source/blender/draw/engines/eevee_next/eevee_hizbuffer.hh @@ -69,11 +69,13 @@ class HiZBuffer { /** * Set source texture for the hiz down-sampling. * Need to be called once at the start of a pipeline or view. + * Tag the buffer as dirty. */ void set_source(GPUTexture **texture, int layer = -1) { src_tx_ptr_ = texture; layer_id_ = layer; + swap_layer(); } /** diff --git a/source/blender/draw/engines/eevee_next/eevee_irradiance_cache.cc b/source/blender/draw/engines/eevee_next/eevee_irradiance_cache.cc index e3405a0f04d..c40cc909057 100644 --- a/source/blender/draw/engines/eevee_next/eevee_irradiance_cache.cc +++ b/source/blender/draw/engines/eevee_next/eevee_irradiance_cache.cc @@ -1012,10 +1012,8 @@ void IrradianceBake::surfels_lights_eval() /* TODO(fclem): Remove this. It is only present to avoid crash inside `shadows.set_view` */ inst_.render_buffers.acquire(int2(1)); inst_.hiz_buffer.set_source(&inst_.render_buffers.depth_tx); - inst_.hiz_buffer.set_dirty(); - inst_.lights.set_view(view_z_, grid_pixel_extent_.xy()); - inst_.shadows.set_view(view_z_); + inst_.shadows.set_view(view_z_, inst_.render_buffers.depth_tx); inst_.render_buffers.release(); inst_.manager->submit(surfel_light_eval_ps_, view_z_); diff --git a/source/blender/draw/engines/eevee_next/eevee_light.cc b/source/blender/draw/engines/eevee_next/eevee_light.cc index 37b559f2436..c4540c36281 100644 --- a/source/blender/draw/engines/eevee_next/eevee_light.cc +++ b/source/blender/draw/engines/eevee_next/eevee_light.cc @@ -172,7 +172,9 @@ void Light::shape_parameters_set(const ::Light *la, const float scale[3]) _area_size_x = tanf(min_ff(la->sun_angle, DEG2RADF(179.9f)) / 2.0f); } else { - _area_size_x = la->radius; + /* Ensure a minimum radius/energy ratio to avoid harsh cut-offs. (See 114284) */ + float min_radius = la->energy * 2e-05f; + _area_size_x = std::max(la->radius, min_radius); } _area_size_y = _area_size_x = max_ff(0.001f, _area_size_x); radius_squared = square_f(_area_size_x); diff --git a/source/blender/draw/engines/eevee_next/eevee_material.hh b/source/blender/draw/engines/eevee_next/eevee_material.hh index 528e9a9f60e..5ed96b5bf7c 100644 --- a/source/blender/draw/engines/eevee_next/eevee_material.hh +++ b/source/blender/draw/engines/eevee_next/eevee_material.hh @@ -125,6 +125,9 @@ static inline eClosureBits shader_closure_bits_from_flag(const GPUMaterial *gpum if (GPU_material_flag_get(gpumat, GPU_MATFLAG_TRANSPARENT)) { closure_bits |= CLOSURE_TRANSPARENCY; } + if (GPU_material_flag_get(gpumat, GPU_MATFLAG_TRANSLUCENT)) { + closure_bits |= CLOSURE_TRANSLUCENT; + } if (GPU_material_flag_get(gpumat, GPU_MATFLAG_EMISSION)) { closure_bits |= CLOSURE_EMISSION; } @@ -143,6 +146,9 @@ static inline eClosureBits shader_closure_bits_from_flag(const GPUMaterial *gpum if (GPU_material_flag_get(gpumat, GPU_MATFLAG_AO)) { closure_bits |= CLOSURE_AMBIENT_OCCLUSION; } + if (GPU_material_flag_get(gpumat, GPU_MATFLAG_SHADER_TO_RGBA)) { + closure_bits |= CLOSURE_SHADER_TO_RGBA; + } return closure_bits; } diff --git a/source/blender/draw/engines/eevee_next/eevee_pipeline.cc b/source/blender/draw/engines/eevee_next/eevee_pipeline.cc index 7b8eb4ce8ed..0bf2b74c510 100644 --- a/source/blender/draw/engines/eevee_next/eevee_pipeline.cc +++ b/source/blender/draw/engines/eevee_next/eevee_pipeline.cc @@ -388,7 +388,7 @@ void ForwardPipeline::render(View &view, Framebuffer &prepass_fb, Framebuffer &c inst_.hiz_buffer.set_dirty(); - inst_.shadows.set_view(view); + inst_.shadows.set_view(view, inst_.render_buffers.depth_tx); inst_.irradiance_cache.set_view(view); combined_fb.bind(); @@ -408,24 +408,70 @@ void ForwardPipeline::render(View &view, Framebuffer &prepass_fb, Framebuffer &c /** \name Deferred Layer * \{ */ +void DeferredLayerBase::gbuffer_pass_sync(Instance &inst) +{ + gbuffer_ps_.init(); + gbuffer_ps_.subpass_transition(GPU_ATTACHEMENT_WRITE, + {GPU_ATTACHEMENT_WRITE, + GPU_ATTACHEMENT_WRITE, + GPU_ATTACHEMENT_WRITE, + GPU_ATTACHEMENT_WRITE}); + /* G-buffer. */ + gbuffer_ps_.bind_image(GBUF_CLOSURE_SLOT, &inst.gbuffer.closure_img_tx); + gbuffer_ps_.bind_image(GBUF_COLOR_SLOT, &inst.gbuffer.color_img_tx); + /* RenderPasses & AOVs. */ + gbuffer_ps_.bind_image(RBUFS_COLOR_SLOT, &inst.render_buffers.rp_color_tx); + gbuffer_ps_.bind_image(RBUFS_VALUE_SLOT, &inst.render_buffers.rp_value_tx); + /* Cryptomatte. */ + gbuffer_ps_.bind_image(RBUFS_CRYPTOMATTE_SLOT, &inst.render_buffers.cryptomatte_tx); + /* Storage Buffer. */ + /* Textures. */ + gbuffer_ps_.bind_texture(RBUFS_UTILITY_TEX_SLOT, inst.pipelines.utility_tx); + + inst.bind_uniform_data(&gbuffer_ps_); + inst.sampling.bind_resources(gbuffer_ps_); + inst.hiz_buffer.bind_resources(gbuffer_ps_); + inst.cryptomatte.bind_resources(gbuffer_ps_); + + /* Bind light resources for the NPR materials that gets rendered first. + * Non-NPR shaders will override these resource bindings. */ + inst.lights.bind_resources(gbuffer_ps_); + inst.shadows.bind_resources(gbuffer_ps_); + inst.reflection_probes.bind_resources(gbuffer_ps_); + inst.irradiance_cache.bind_resources(gbuffer_ps_); + + DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL; + + gbuffer_single_sided_hybrid_ps_ = &gbuffer_ps_.sub("DoubleSided"); + gbuffer_single_sided_hybrid_ps_->state_set(state | DRW_STATE_CULL_BACK); + + gbuffer_double_sided_hybrid_ps_ = &gbuffer_ps_.sub("SingleSided"); + gbuffer_double_sided_hybrid_ps_->state_set(state); + + gbuffer_double_sided_ps_ = &gbuffer_ps_.sub("DoubleSided"); + gbuffer_double_sided_ps_->state_set(state); + + gbuffer_single_sided_ps_ = &gbuffer_ps_.sub("SingleSided"); + gbuffer_single_sided_ps_->state_set(state | DRW_STATE_CULL_BACK); + + closure_bits_ = CLOSURE_NONE; +} + void DeferredLayer::begin_sync() { { prepass_ps_.init(); - { - /* Common resources. */ + /* Textures. */ + prepass_ps_.bind_texture(RBUFS_UTILITY_TEX_SLOT, inst_.pipelines.utility_tx); - /* Textures. */ - prepass_ps_.bind_texture(RBUFS_UTILITY_TEX_SLOT, inst_.pipelines.utility_tx); + /* Make alpha hash scale sub-pixel so that it converges to a noise free image. + * If there is motion, use pixel scale for stability. */ + bool alpha_hash_subpixel_scale = !inst_.is_viewport() || !inst_.velocity.camera_has_motion(); + inst_.pipelines.data.alpha_hash_scale = alpha_hash_subpixel_scale ? 0.1f : 1.0f; - inst_.pipelines.data.alpha_hash_scale = 0.1f; - if (inst_.is_viewport() && inst_.velocity.camera_has_motion()) { - inst_.pipelines.data.alpha_hash_scale = 1.0f; - } - inst_.bind_uniform_data(&prepass_ps_); - inst_.velocity.bind_resources(prepass_ps_); - inst_.sampling.bind_resources(prepass_ps_); - } + inst_.bind_uniform_data(&prepass_ps_); + inst_.velocity.bind_resources(prepass_ps_); + inst_.sampling.bind_resources(prepass_ps_); DRWState state_depth_only = DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS; DRWState state_depth_color = DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | @@ -443,47 +489,16 @@ void DeferredLayer::begin_sync() prepass_single_sided_moving_ps_ = &prepass_ps_.sub("SingleSided.Moving"); prepass_single_sided_moving_ps_->state_set(state_depth_color | DRW_STATE_CULL_BACK); } - { - gbuffer_ps_.init(); - gbuffer_ps_.subpass_transition(GPU_ATTACHEMENT_WRITE, - {GPU_ATTACHEMENT_WRITE, - GPU_ATTACHEMENT_WRITE, - GPU_ATTACHEMENT_WRITE, - GPU_ATTACHEMENT_WRITE}); - /* G-buffer. */ - gbuffer_ps_.bind_image(GBUF_CLOSURE_SLOT, &inst_.gbuffer.closure_img_tx); - gbuffer_ps_.bind_image(GBUF_COLOR_SLOT, &inst_.gbuffer.color_img_tx); - /* RenderPasses & AOVs. */ - gbuffer_ps_.bind_image(RBUFS_COLOR_SLOT, &inst_.render_buffers.rp_color_tx); - gbuffer_ps_.bind_image(RBUFS_VALUE_SLOT, &inst_.render_buffers.rp_value_tx); - /* Cryptomatte. */ - gbuffer_ps_.bind_image(RBUFS_CRYPTOMATTE_SLOT, &inst_.render_buffers.cryptomatte_tx); - /* Storage Buffer. */ - /* Textures. */ - gbuffer_ps_.bind_texture(RBUFS_UTILITY_TEX_SLOT, inst_.pipelines.utility_tx); - inst_.bind_uniform_data(&gbuffer_ps_); - inst_.sampling.bind_resources(gbuffer_ps_); - inst_.hiz_buffer.bind_resources(gbuffer_ps_); - inst_.cryptomatte.bind_resources(gbuffer_ps_); - - DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL; - - gbuffer_double_sided_ps_ = &gbuffer_ps_.sub("DoubleSided"); - gbuffer_double_sided_ps_->state_set(state); - - gbuffer_single_sided_ps_ = &gbuffer_ps_.sub("SingleSided"); - gbuffer_single_sided_ps_->state_set(state | DRW_STATE_CULL_BACK); - } - - closure_bits_ = CLOSURE_NONE; + this->gbuffer_pass_sync(inst_); } void DeferredLayer::end_sync() { - eClosureBits evaluated_closures = CLOSURE_DIFFUSE | CLOSURE_REFLECTION | CLOSURE_REFRACTION; + eClosureBits evaluated_closures = CLOSURE_DIFFUSE | CLOSURE_TRANSLUCENT | CLOSURE_REFLECTION | + CLOSURE_REFRACTION; if (closure_bits_ & evaluated_closures) { - /* First add the tile classification step at the end of the GBuffer pass. */ + /* Add the tile classification step at the end of the GBuffer pass. */ { /* Fill tile mask texture with the collected closure present in a tile. */ PassMain::Sub &sub = gbuffer_ps_.sub("TileClassify"); @@ -546,7 +561,7 @@ void DeferredLayer::end_sync() sub.bind_image(RBUFS_COLOR_SLOT, &inst_.render_buffers.rp_color_tx); sub.bind_image(RBUFS_VALUE_SLOT, &inst_.render_buffers.rp_value_tx); /* Submit the more costly ones first to avoid long tail in occupancy. - * See page 78 of "Siggraph 2023: Unreal Engine Substrate" by Hillaire & de Rousiers. */ + * See page 78 of "SIGGRAPH 2023: Unreal Engine Substrate" by Hillaire & de Rousiers. */ for (int i = ARRAY_SIZE(closure_bufs_) - 1; i >= 0; i--) { sub.shader_set(inst_.shaders.static_shader_get(eShaderType(DEFERRED_LIGHT_SINGLE + i))); sub.bind_image("direct_radiance_1_img", &direct_radiance_txs_[0]); @@ -603,9 +618,15 @@ PassMain::Sub *DeferredLayer::material_add(::Material *blender_mat, GPUMaterial eClosureBits closure_bits = shader_closure_bits_from_flag(gpumat); closure_bits_ |= closure_bits; - PassMain::Sub *pass = (blender_mat->blend_flag & MA_BL_CULL_BACKFACE) ? - gbuffer_single_sided_ps_ : - gbuffer_double_sided_ps_; + bool has_shader_to_rgba = (closure_bits & CLOSURE_SHADER_TO_RGBA) != 0; + bool backface_culling = (blender_mat->blend_flag & MA_BL_CULL_BACKFACE) != 0; + + PassMain::Sub *pass = (has_shader_to_rgba) ? + ((backface_culling) ? gbuffer_single_sided_hybrid_ps_ : + gbuffer_double_sided_hybrid_ps_) : + ((backface_culling) ? gbuffer_single_sided_ps_ : + gbuffer_double_sided_ps_); + return &pass->sub(GPU_material_get_name(gpumat)); } @@ -623,7 +644,7 @@ void DeferredLayer::render(View &main_view, /* The first pass will never have any surfaces behind it. Nothing is refracted except the * environment. So in this case, disable tracing and fallback to probe. */ bool do_screen_space_refraction = !is_first_pass && (closure_bits_ & CLOSURE_REFRACTION); - bool do_screen_space_reflection = (closure_bits_ & CLOSURE_REFLECTION); + bool do_screen_space_reflection = (closure_bits_ & (CLOSURE_REFLECTION | CLOSURE_DIFFUSE)); eGPUTextureUsage usage_rw = GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_SHADER_WRITE; if (do_screen_space_reflection) { @@ -656,8 +677,12 @@ void DeferredLayer::render(View &main_view, inst_.manager->submit(prepass_ps_, render_view); inst_.hiz_buffer.swap_layer(); + /* Update for lighting pass or AO node. */ inst_.hiz_buffer.update(); + inst_.irradiance_cache.set_view(render_view); + inst_.shadows.set_view(render_view, inst_.render_buffers.depth_tx); + if (/* FIXME(fclem): Vulkan doesn't implement load / store config yet. */ GPU_backend_get_type() == GPU_BACKEND_VULKAN) { @@ -696,16 +721,8 @@ void DeferredLayer::render(View &main_view, inst_.manager->submit(gbuffer_ps_, render_view); - inst_.hiz_buffer.set_dirty(); - - inst_.irradiance_cache.set_view(render_view); - - /* Only update the HiZ after refraction tracing. */ - inst_.hiz_buffer.update(); - - inst_.shadows.set_view(render_view); - - int closure_count = count_bits_i(closure_bits_ & (CLOSURE_REFLECTION | CLOSURE_DIFFUSE)); + int closure_count = count_bits_i(closure_bits_ & + (CLOSURE_REFLECTION | CLOSURE_DIFFUSE | CLOSURE_TRANSLUCENT)); for (int i = 0; i < ARRAY_SIZE(direct_radiance_txs_); i++) { direct_radiance_txs_[i].acquire( (closure_count > 1) ? extent : int2(1), GPU_R11F_G11F_B10F, usage_rw); @@ -714,34 +731,18 @@ void DeferredLayer::render(View &main_view, GPU_framebuffer_bind(combined_fb); inst_.manager->submit(eval_light_ps_, render_view); - RayTraceResult refract_result = inst_.raytracing.trace(rt_buffer, - radiance_behind_tx_, - render_view.persmat(), - closure_bits_, - CLOSURE_REFRACTION, - main_view, - render_view, - !do_screen_space_refraction); + RayTraceResult indirect_result = inst_.raytracing.render(rt_buffer, + radiance_behind_tx_, + radiance_feedback_tx_, + radiance_feedback_persmat_, + closure_bits_, + main_view, + render_view, + do_screen_space_refraction); - RayTraceResult diffuse_result = inst_.raytracing.trace(rt_buffer, - radiance_feedback_tx_, - radiance_feedback_persmat_, - closure_bits_, - CLOSURE_DIFFUSE, - main_view, - render_view); - - RayTraceResult reflect_result = inst_.raytracing.trace(rt_buffer, - radiance_feedback_tx_, - radiance_feedback_persmat_, - closure_bits_, - CLOSURE_REFLECTION, - main_view, - render_view); - - indirect_diffuse_tx_ = diffuse_result.get(); - indirect_reflect_tx_ = reflect_result.get(); - indirect_refract_tx_ = refract_result.get(); + indirect_diffuse_tx_ = indirect_result.diffuse.get(); + indirect_reflect_tx_ = indirect_result.reflect.get(); + indirect_refract_tx_ = indirect_result.refract.get(); inst_.subsurface.render( direct_radiance_txs_[0], indirect_diffuse_tx_, closure_bits_, render_view); @@ -749,9 +750,7 @@ void DeferredLayer::render(View &main_view, GPU_framebuffer_bind(combined_fb); inst_.manager->submit(combine_ps_); - diffuse_result.release(); - refract_result.release(); - reflect_result.release(); + indirect_result.release(); for (int i = 0; i < ARRAY_SIZE(direct_radiance_txs_); i++) { direct_radiance_txs_[i].release(); @@ -1135,38 +1134,8 @@ void DeferredProbeLayer::begin_sync() prepass_single_sided_static_ps_ = &prepass_ps_.sub("SingleSided"); prepass_single_sided_static_ps_->state_set(state_depth_only | DRW_STATE_CULL_BACK); } - { - gbuffer_ps_.init(); - { - /* Common resources. */ - /* G-buffer. */ - gbuffer_ps_.bind_image(GBUF_CLOSURE_SLOT, &inst_.gbuffer.closure_tx); - gbuffer_ps_.bind_image(GBUF_COLOR_SLOT, &inst_.gbuffer.color_tx); - gbuffer_ps_.bind_image(GBUF_HEADER_SLOT, &inst_.gbuffer.header_tx); - /* RenderPasses & AOVs. */ - gbuffer_ps_.bind_image(RBUFS_COLOR_SLOT, &inst_.render_buffers.rp_color_tx); - gbuffer_ps_.bind_image(RBUFS_VALUE_SLOT, &inst_.render_buffers.rp_value_tx); - /* Cryptomatte. */ - gbuffer_ps_.bind_image(RBUFS_CRYPTOMATTE_SLOT, &inst_.render_buffers.cryptomatte_tx); - /* Storage Buffer. */ - /* Textures. */ - gbuffer_ps_.bind_texture(RBUFS_UTILITY_TEX_SLOT, inst_.pipelines.utility_tx); - - inst_.bind_uniform_data(&gbuffer_ps_); - inst_.sampling.bind_resources(gbuffer_ps_); - inst_.hiz_buffer.bind_resources(gbuffer_ps_); - inst_.cryptomatte.bind_resources(gbuffer_ps_); - } - - DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL; - - gbuffer_double_sided_ps_ = &gbuffer_ps_.sub("DoubleSided"); - gbuffer_double_sided_ps_->state_set(state); - - gbuffer_single_sided_ps_ = &gbuffer_ps_.sub("SingleSided"); - gbuffer_single_sided_ps_->state_set(state | DRW_STATE_CULL_BACK); - } + this->gbuffer_pass_sync(inst_); } void DeferredProbeLayer::end_sync() @@ -1175,7 +1144,7 @@ void DeferredProbeLayer::end_sync() PassSimple &pass = eval_light_ps_; pass.init(); /* Use depth test to reject background pixels. */ - pass.state_set(DRW_STATE_DEPTH_GREATER | DRW_STATE_WRITE_COLOR); + pass.state_set(DRW_STATE_DEPTH_GREATER | DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD_FULL); pass.shader_set(inst_.shaders.static_shader_get(DEFERRED_CAPTURE_EVAL)); pass.bind_image(RBUFS_COLOR_SLOT, &inst_.render_buffers.rp_color_tx); pass.bind_image(RBUFS_VALUE_SLOT, &inst_.render_buffers.rp_value_tx); @@ -1206,9 +1175,15 @@ PassMain::Sub *DeferredProbeLayer::material_add(::Material *blender_mat, GPUMate eClosureBits closure_bits = shader_closure_bits_from_flag(gpumat); closure_bits_ |= closure_bits; - PassMain::Sub *pass = (blender_mat->blend_flag & MA_BL_CULL_BACKFACE) ? - gbuffer_single_sided_ps_ : - gbuffer_double_sided_ps_; + bool has_shader_to_rgba = (closure_bits & CLOSURE_SHADER_TO_RGBA) != 0; + bool backface_culling = (blender_mat->blend_flag & MA_BL_CULL_BACKFACE) != 0; + + PassMain::Sub *pass = (has_shader_to_rgba) ? + ((backface_culling) ? gbuffer_single_sided_hybrid_ps_ : + gbuffer_double_sided_hybrid_ps_) : + ((backface_culling) ? gbuffer_single_sided_ps_ : + gbuffer_double_sided_ps_); + return &pass->sub(GPU_material_get_name(gpumat)); } @@ -1218,20 +1193,28 @@ void DeferredProbeLayer::render(View &view, Framebuffer &gbuffer_fb, int2 extent) { + inst_.pipelines.data.is_probe_reflection = true; + inst_.push_uniform_data(); + GPU_framebuffer_bind(prepass_fb); inst_.manager->submit(prepass_ps_, view); inst_.hiz_buffer.set_source(&inst_.render_buffers.depth_tx); - inst_.hiz_buffer.set_dirty(); inst_.lights.set_view(view, extent); - inst_.shadows.set_view(view); + inst_.shadows.set_view(view, inst_.render_buffers.depth_tx); inst_.irradiance_cache.set_view(view); + /* Update for lighting pass. */ + inst_.hiz_buffer.update(); + GPU_framebuffer_bind(gbuffer_fb); inst_.manager->submit(gbuffer_ps_, view); GPU_framebuffer_bind(combined_fb); inst_.manager->submit(eval_light_ps_, view); + + inst_.pipelines.data.is_probe_reflection = false; + inst_.push_uniform_data(); } /** \} */ @@ -1297,30 +1280,9 @@ void PlanarProbePipeline::begin_sync() prepass_single_sided_static_ps_ = &prepass_ps_.sub("SingleSided.Static"); prepass_single_sided_static_ps_->state_set(state_depth_only | DRW_STATE_CULL_BACK); } - { - gbuffer_ps_.init(); - gbuffer_ps_.bind_image(GBUF_CLOSURE_SLOT, &inst_.gbuffer.closure_tx); - gbuffer_ps_.bind_image(GBUF_COLOR_SLOT, &inst_.gbuffer.color_tx); - gbuffer_ps_.bind_image(GBUF_HEADER_SLOT, &inst_.gbuffer.header_tx); - gbuffer_ps_.bind_texture(RBUFS_UTILITY_TEX_SLOT, inst_.pipelines.utility_tx); - inst_.bind_uniform_data(&gbuffer_ps_); - inst_.sampling.bind_resources(gbuffer_ps_); - inst_.hiz_buffer.bind_resources(gbuffer_ps_); - /* Cryptomatte. */ - gbuffer_ps_.bind_image(RBUFS_CRYPTOMATTE_SLOT, &inst_.render_buffers.cryptomatte_tx); - /* RenderPasses & AOVs. */ - gbuffer_ps_.bind_image(RBUFS_COLOR_SLOT, &inst_.render_buffers.rp_color_tx); - gbuffer_ps_.bind_image(RBUFS_VALUE_SLOT, &inst_.render_buffers.rp_value_tx); - inst_.cryptomatte.bind_resources(gbuffer_ps_); - DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL; + this->gbuffer_pass_sync(inst_); - gbuffer_double_sided_ps_ = &gbuffer_ps_.sub("DoubleSided"); - gbuffer_double_sided_ps_->state_set(state); - - gbuffer_single_sided_ps_ = &gbuffer_ps_.sub("SingleSided"); - gbuffer_single_sided_ps_->state_set(state | DRW_STATE_CULL_BACK); - } { PassSimple &pass = eval_light_ps_; pass.init(); @@ -1360,37 +1322,59 @@ PassMain::Sub *PlanarProbePipeline::material_add(::Material *blender_mat, GPUMat eClosureBits closure_bits = shader_closure_bits_from_flag(gpumat); closure_bits_ |= closure_bits; - PassMain::Sub *pass = (blender_mat->blend_flag & MA_BL_CULL_BACKFACE) ? - gbuffer_single_sided_ps_ : - gbuffer_double_sided_ps_; + bool has_shader_to_rgba = (closure_bits & CLOSURE_SHADER_TO_RGBA) != 0; + bool backface_culling = (blender_mat->blend_flag & MA_BL_CULL_BACKFACE) != 0; + + PassMain::Sub *pass = (has_shader_to_rgba) ? + ((backface_culling) ? gbuffer_single_sided_hybrid_ps_ : + gbuffer_double_sided_hybrid_ps_) : + ((backface_culling) ? gbuffer_single_sided_ps_ : + gbuffer_double_sided_ps_); + return &pass->sub(GPU_material_get_name(gpumat)); } -void PlanarProbePipeline::render( - View &view, Framebuffer &gbuffer_fb, Framebuffer &combined_fb, int layer_id, int2 extent) +void PlanarProbePipeline::render(View &view, + GPUTexture *depth_layer_tx, + Framebuffer &gbuffer_fb, + Framebuffer &combined_fb, + int2 extent) { GPU_debug_group_begin("Planar.Capture"); - inst_.hiz_buffer.set_source(&inst_.planar_probes.depth_tx_, layer_id); - inst_.hiz_buffer.set_dirty(); + inst_.pipelines.data.is_probe_reflection = true; + inst_.push_uniform_data(); GPU_framebuffer_bind(gbuffer_fb); GPU_framebuffer_clear_depth(gbuffer_fb, 1.0f); inst_.manager->submit(prepass_ps_, view); + /* TODO(fclem): This is the only place where we use the layer source to HiZ. + * This is because the texture layer view is still a layer texture. */ + inst_.hiz_buffer.set_source(&depth_layer_tx, 0); inst_.lights.set_view(view, extent); - inst_.shadows.set_view(view); + inst_.shadows.set_view(view, depth_layer_tx); inst_.irradiance_cache.set_view(view); + /* Update for lighting pass. */ inst_.hiz_buffer.update(); - GPU_framebuffer_bind(gbuffer_fb); - GPU_framebuffer_clear_color(gbuffer_fb, float4(0.0f, 0.0f, 0.0f, 1.0f)); + GPU_framebuffer_bind_ex(gbuffer_fb, + { + {GPU_LOADACTION_LOAD, GPU_STOREACTION_STORE}, /* Depth */ + {GPU_LOADACTION_CLEAR, GPU_STOREACTION_STORE, {0.0f}}, /* Combined */ + {GPU_LOADACTION_CLEAR, GPU_STOREACTION_STORE, {0}}, /* GBuf Header */ + {GPU_LOADACTION_DONT_CARE, GPU_STOREACTION_STORE}, /* GBuf Closure */ + {GPU_LOADACTION_DONT_CARE, GPU_STOREACTION_STORE}, /* GBuf Color */ + }); inst_.manager->submit(gbuffer_ps_, view); GPU_framebuffer_bind(combined_fb); inst_.manager->submit(eval_light_ps_, view); + inst_.pipelines.data.is_probe_reflection = false; + inst_.push_uniform_data(); + GPU_debug_group_end(); } diff --git a/source/blender/draw/engines/eevee_next/eevee_pipeline.hh b/source/blender/draw/engines/eevee_next/eevee_pipeline.hh index 724ae5ffe70..c6e7652fbc3 100644 --- a/source/blender/draw/engines/eevee_next/eevee_pipeline.hh +++ b/source/blender/draw/engines/eevee_next/eevee_pipeline.hh @@ -12,6 +12,8 @@ #pragma once +#include "BLI_math_bits.h" + #include "DRW_render.h" #include "draw_shader_shared.h" @@ -175,6 +177,10 @@ struct DeferredLayerBase { PassMain::Sub *prepass_double_sided_moving_ps_ = nullptr; PassMain gbuffer_ps_ = {"Shading"}; + /* Shaders that use the ClosureToRGBA node needs to be rendered first. + * Consider they hybrid forward and deferred. */ + PassMain::Sub *gbuffer_single_sided_hybrid_ps_ = nullptr; + PassMain::Sub *gbuffer_double_sided_hybrid_ps_ = nullptr; PassMain::Sub *gbuffer_single_sided_ps_ = nullptr; PassMain::Sub *gbuffer_double_sided_ps_ = nullptr; @@ -184,16 +190,18 @@ struct DeferredLayerBase { /* Return the amount of gbuffer layer needed. */ int closure_layer_count() const { - return count_bits_i(closure_bits_ & - (CLOSURE_REFRACTION | CLOSURE_REFLECTION | CLOSURE_DIFFUSE | CLOSURE_SSS)); + return count_bits_i(closure_bits_ & (CLOSURE_REFRACTION | CLOSURE_REFLECTION | + CLOSURE_DIFFUSE | CLOSURE_TRANSLUCENT | CLOSURE_SSS)); } /* Return the amount of gbuffer layer needed. */ int color_layer_count() const { - return count_bits_i(closure_bits_ & - (CLOSURE_REFRACTION | CLOSURE_REFLECTION | CLOSURE_DIFFUSE)); + return count_bits_i(closure_bits_ & (CLOSURE_REFRACTION | CLOSURE_REFLECTION | + CLOSURE_DIFFUSE | CLOSURE_TRANSLUCENT)); } + + void gbuffer_pass_sync(Instance &inst); }; class DeferredPipeline; @@ -544,8 +552,11 @@ class PlanarProbePipeline : DeferredLayerBase { PassMain::Sub *prepass_add(::Material *material, GPUMaterial *gpumat); PassMain::Sub *material_add(::Material *material, GPUMaterial *gpumat); - void render( - View &view, Framebuffer &gbuffer, Framebuffer &combined_fb, int layer_id, int2 extent); + void render(View &view, + GPUTexture *depth_layer_tx, + Framebuffer &gbuffer, + Framebuffer &combined_fb, + int2 extent); }; /** \} */ @@ -688,6 +699,7 @@ class PipelineModule { void begin_sync() { + data.is_probe_reflection = false; probe.begin_sync(); planar.begin_sync(); deferred.begin_sync(); diff --git a/source/blender/draw/engines/eevee_next/eevee_planar_probes.cc b/source/blender/draw/engines/eevee_next/eevee_planar_probes.cc index cfb59ea1f1b..7ab50712e54 100644 --- a/source/blender/draw/engines/eevee_next/eevee_planar_probes.cc +++ b/source/blender/draw/engines/eevee_next/eevee_planar_probes.cc @@ -96,6 +96,8 @@ void PlanarProbeModule::end_sync() void PlanarProbeModule::set_view(const draw::View &main_view, int2 main_view_extent) { + GBuffer &gbuf = instance_.gbuffer; + const int64_t num_probes = probes_.size(); /* TODO resolution percentage. */ @@ -111,6 +113,7 @@ void PlanarProbeModule::set_view(const draw::View &main_view, int2 main_view_ext eGPUTextureUsage usage = GPU_TEXTURE_USAGE_ATTACHMENT | GPU_TEXTURE_USAGE_SHADER_READ; radiance_tx_.ensure_2d_array(GPU_R11F_G11F_B10F, extent, layer_count, usage); depth_tx_.ensure_2d_array(GPU_DEPTH_COMPONENT32F, extent, layer_count, usage); + depth_tx_.ensure_layer_views(); do_display_draw_ = DRW_state_draw_support() && num_probes > 0; @@ -133,7 +136,6 @@ void PlanarProbeModule::set_view(const draw::View &main_view, int2 main_view_ext world_clip_buf_.plane = probe.reflection_clip_plane_get(); world_clip_buf_.push_update(); - GBuffer &gbuf = instance_.gbuffer; gbuf.acquire(extent, instance_.pipelines.deferred.closure_layer_count(), instance_.pipelines.deferred.color_layer_count()); @@ -148,7 +150,7 @@ void PlanarProbeModule::set_view(const draw::View &main_view, int2 main_view_ext GPU_ATTACHMENT_TEXTURE_LAYER(gbuf.closure_tx.layer_view(0), 0)); instance_.pipelines.planar.render( - res.view, res.combined_fb, res.gbuffer_fb, resource_index, extent); + res.view, depth_tx_.layer_view(resource_index), res.gbuffer_fb, res.combined_fb, extent); if (do_display_draw_ && probe.viewport_display) { display_data_buf_.get_or_resize(display_index++) = {probe.plane_to_world, resource_index}; @@ -157,6 +159,8 @@ void PlanarProbeModule::set_view(const draw::View &main_view, int2 main_view_ext resource_index++; } + gbuf.release(); + if (resource_index < PLANAR_PROBES_MAX) { /* Tag the end of the array. */ probe_planar_buf_[resource_index].layer_id = -1; diff --git a/source/blender/draw/engines/eevee_next/eevee_raytrace.cc b/source/blender/draw/engines/eevee_next/eevee_raytrace.cc index 16de9fee630..9ef0f43f42c 100644 --- a/source/blender/draw/engines/eevee_next/eevee_raytrace.cc +++ b/source/blender/draw/engines/eevee_next/eevee_raytrace.cc @@ -28,15 +28,8 @@ void RayTraceModule::init() { const SceneEEVEE &sce_eevee = inst_.scene->eevee; - reflection_options_ = sce_eevee.reflection_options; - refraction_options_ = sce_eevee.refraction_options; - diffuse_options_ = sce_eevee.diffuse_options; + ray_tracing_options_ = sce_eevee.ray_tracing_options; tracing_method_ = RaytraceEEVEE_Method(sce_eevee.ray_tracing_method); - - if (sce_eevee.ray_split_settings == 0) { - refraction_options_ = reflection_options_; - diffuse_options_ = reflection_options_; - } } void RayTraceModule::sync() @@ -58,11 +51,10 @@ void RayTraceModule::sync() PassSimple &pass = tile_classify_ps_; pass.init(); pass.shader_set(inst_.shaders.static_shader_get(RAY_TILE_CLASSIFY)); - pass.bind_image("tile_mask_img", &tile_mask_tx_); - pass.bind_ssbo("ray_dispatch_buf", &ray_dispatch_buf_); - pass.bind_ssbo("ray_denoise_dispatch_buf", &ray_denoise_dispatch_buf_); - pass.bind_ssbo("horizon_dispatch_buf", &horizon_dispatch_buf_); - pass.bind_ssbo("horizon_denoise_dispatch_buf", &horizon_denoise_dispatch_buf_); + pass.bind_image("tile_raytrace_denoise_img", &tile_raytrace_denoise_tx_); + pass.bind_image("tile_raytrace_tracing_img", &tile_raytrace_tracing_tx_); + pass.bind_image("tile_horizon_denoise_img", &tile_horizon_denoise_tx_); + pass.bind_image("tile_horizon_tracing_img", &tile_horizon_tracing_tx_); inst_.bind_uniform_data(&pass); inst_.gbuffer.bind_resources(pass); pass.dispatch(&tile_classify_dispatch_size_); @@ -72,14 +64,17 @@ void RayTraceModule::sync() PassSimple &pass = tile_compact_ps_; pass.init(); pass.shader_set(inst_.shaders.static_shader_get(RAY_TILE_COMPACT)); - pass.bind_image("tile_mask_img", &tile_mask_tx_); - pass.bind_ssbo("ray_dispatch_buf", &ray_dispatch_buf_); - pass.bind_ssbo("ray_denoise_dispatch_buf", &ray_denoise_dispatch_buf_); - pass.bind_ssbo("ray_tiles_buf", &ray_tiles_buf_); - pass.bind_ssbo("ray_denoise_tiles_buf", &ray_denoise_tiles_buf_); - pass.bind_ssbo("horizon_dispatch_buf", &horizon_dispatch_buf_); + pass.bind_image("tile_raytrace_denoise_img", &tile_raytrace_denoise_tx_); + pass.bind_image("tile_raytrace_tracing_img", &tile_raytrace_tracing_tx_); + pass.bind_image("tile_horizon_denoise_img", &tile_horizon_denoise_tx_); + pass.bind_image("tile_horizon_tracing_img", &tile_horizon_tracing_tx_); + pass.bind_ssbo("raytrace_tracing_dispatch_buf", &raytrace_tracing_dispatch_buf_); + pass.bind_ssbo("raytrace_denoise_dispatch_buf", &raytrace_denoise_dispatch_buf_); + pass.bind_ssbo("horizon_tracing_dispatch_buf", &horizon_tracing_dispatch_buf_); pass.bind_ssbo("horizon_denoise_dispatch_buf", &horizon_denoise_dispatch_buf_); - pass.bind_ssbo("horizon_tiles_buf", &horizon_tiles_buf_); + pass.bind_ssbo("raytrace_tracing_tiles_buf", &raytrace_tracing_tiles_buf_); + pass.bind_ssbo("raytrace_denoise_tiles_buf", &raytrace_denoise_tiles_buf_); + pass.bind_ssbo("horizon_tracing_tiles_buf", &horizon_tracing_tiles_buf_); pass.bind_ssbo("horizon_denoise_tiles_buf", &horizon_denoise_tiles_buf_); inst_.bind_uniform_data(&pass); pass.dispatch(&tile_compact_dispatch_size_); @@ -91,10 +86,10 @@ void RayTraceModule::sync() pass.shader_set(inst_.shaders.static_shader_get(SHADER_VARIATION(RAY_GENERATE_, type))); pass.bind_texture(RBUFS_UTILITY_TEX_SLOT, inst_.pipelines.utility_tx); pass.bind_image("out_ray_data_img", &ray_data_tx_); - pass.bind_ssbo("tiles_coord_buf", &ray_tiles_buf_); + pass.bind_ssbo("tiles_coord_buf", &raytrace_tracing_tiles_buf_); inst_.sampling.bind_resources(pass); inst_.gbuffer.bind_resources(pass); - pass.dispatch(ray_dispatch_buf_); + pass.dispatch(raytrace_tracing_dispatch_buf_); pass.barrier(GPU_BARRIER_SHADER_STORAGE | GPU_BARRIER_TEXTURE_FETCH | GPU_BARRIER_SHADER_IMAGE_ACCESS); } @@ -106,7 +101,7 @@ void RayTraceModule::sync() /* Inject planar tracing in the same pass as reflection tracing. */ PassSimple::Sub &sub = pass.sub("Trace.Planar"); sub.shader_set(inst_.shaders.static_shader_get(RAY_TRACE_PLANAR)); - sub.bind_ssbo("tiles_coord_buf", &ray_tiles_buf_); + sub.bind_ssbo("tiles_coord_buf", &raytrace_tracing_tiles_buf_); sub.bind_image("ray_data_img", &ray_data_tx_); sub.bind_image("ray_time_img", &ray_time_tx_); sub.bind_image("ray_radiance_img", &ray_radiance_tx_); @@ -116,13 +111,13 @@ void RayTraceModule::sync() inst_.irradiance_cache.bind_resources(sub); inst_.reflection_probes.bind_resources(sub); /* TODO(@fclem): Use another dispatch with only tiles that touches planar captures. */ - sub.dispatch(ray_dispatch_buf_); + sub.dispatch(raytrace_tracing_dispatch_buf_); sub.barrier(GPU_BARRIER_SHADER_IMAGE_ACCESS); } HiZBuffer::Type hiz_type = (&pass == &trace_refract_ps_) ? HiZBuffer::Type::BACK : HiZBuffer::Type::FRONT; pass.shader_set(inst_.shaders.static_shader_get(SHADER_VARIATION(RAY_TRACE_SCREEN_, type))); - pass.bind_ssbo("tiles_coord_buf", &ray_tiles_buf_); + pass.bind_ssbo("tiles_coord_buf", &raytrace_tracing_tiles_buf_); pass.bind_image("ray_data_img", &ray_data_tx_); pass.bind_image("ray_time_img", &ray_time_tx_); pass.bind_texture("screen_radiance_tx", &screen_radiance_tx_); @@ -133,14 +128,14 @@ void RayTraceModule::sync() inst_.sampling.bind_resources(pass); inst_.irradiance_cache.bind_resources(pass); inst_.reflection_probes.bind_resources(pass); - pass.dispatch(ray_dispatch_buf_); + pass.dispatch(raytrace_tracing_dispatch_buf_); pass.barrier(GPU_BARRIER_SHADER_IMAGE_ACCESS); } { PassSimple &pass = trace_fallback_ps_; pass.init(); pass.shader_set(inst_.shaders.static_shader_get(RAY_TRACE_FALLBACK)); - pass.bind_ssbo("tiles_coord_buf", &ray_tiles_buf_); + pass.bind_ssbo("tiles_coord_buf", &raytrace_tracing_tiles_buf_); pass.bind_image("ray_data_img", &ray_data_tx_); pass.bind_image("ray_time_img", &ray_time_tx_); pass.bind_image("ray_radiance_img", &ray_radiance_tx_); @@ -148,7 +143,7 @@ void RayTraceModule::sync() inst_.bind_uniform_data(&pass); inst_.irradiance_cache.bind_resources(pass); inst_.reflection_probes.bind_resources(pass); - pass.dispatch(ray_dispatch_buf_); + pass.dispatch(raytrace_tracing_dispatch_buf_); pass.barrier(GPU_BARRIER_SHADER_IMAGE_ACCESS); } /* Denoise. */ @@ -156,7 +151,7 @@ void RayTraceModule::sync() PassSimple &pass = PASS_VARIATION(denoise_spatial_, type, _ps_); pass.init(); pass.shader_set(inst_.shaders.static_shader_get(SHADER_VARIATION(RAY_DENOISE_SPATIAL_, type))); - pass.bind_ssbo("tiles_coord_buf", &ray_denoise_tiles_buf_); + pass.bind_ssbo("tiles_coord_buf", &raytrace_denoise_tiles_buf_); pass.bind_texture(RBUFS_UTILITY_TEX_SLOT, inst_.pipelines.utility_tx); pass.bind_texture("depth_tx", &depth_tx); pass.bind_image("ray_data_img", &ray_data_tx_); @@ -165,11 +160,11 @@ void RayTraceModule::sync() pass.bind_image("out_radiance_img", &denoised_spatial_tx_); pass.bind_image("out_variance_img", &hit_variance_tx_); pass.bind_image("out_hit_depth_img", &hit_depth_tx_); - pass.bind_image("tile_mask_img", &tile_mask_tx_); + pass.bind_image("tile_mask_img", &tile_raytrace_denoise_tx_); inst_.bind_uniform_data(&pass); inst_.sampling.bind_resources(pass); inst_.gbuffer.bind_resources(pass); - pass.dispatch(ray_denoise_dispatch_buf_); + pass.dispatch(raytrace_denoise_dispatch_buf_); pass.barrier(GPU_BARRIER_SHADER_IMAGE_ACCESS); } { @@ -186,9 +181,9 @@ void RayTraceModule::sync() pass.bind_image("out_radiance_img", &denoised_temporal_tx_); pass.bind_image("in_variance_img", &hit_variance_tx_); pass.bind_image("out_variance_img", &denoise_variance_tx_); - pass.bind_ssbo("tiles_coord_buf", &ray_denoise_tiles_buf_); + pass.bind_ssbo("tiles_coord_buf", &raytrace_denoise_tiles_buf_); inst_.sampling.bind_resources(pass); - pass.dispatch(ray_denoise_dispatch_buf_); + pass.dispatch(raytrace_denoise_dispatch_buf_); pass.barrier(GPU_BARRIER_SHADER_IMAGE_ACCESS); } for (auto type : IndexRange(3)) { @@ -200,12 +195,12 @@ void RayTraceModule::sync() pass.bind_image("in_radiance_img", &denoised_temporal_tx_); pass.bind_image("out_radiance_img", &denoised_bilateral_tx_); pass.bind_image("in_variance_img", &denoise_variance_tx_); - pass.bind_image("tile_mask_img", &tile_mask_tx_); - pass.bind_ssbo("tiles_coord_buf", &ray_denoise_tiles_buf_); + pass.bind_image("tile_mask_img", &tile_raytrace_denoise_tx_); + pass.bind_ssbo("tiles_coord_buf", &raytrace_denoise_tiles_buf_); inst_.bind_uniform_data(&pass); inst_.sampling.bind_resources(pass); inst_.gbuffer.bind_resources(pass); - pass.dispatch(ray_denoise_dispatch_buf_); + pass.dispatch(raytrace_denoise_dispatch_buf_); pass.barrier(GPU_BARRIER_SHADER_IMAGE_ACCESS); } { @@ -228,7 +223,7 @@ void RayTraceModule::sync() pass.shader_set(inst_.shaders.static_shader_get(SHADER_VARIATION(HORIZON_SCAN_, type))); pass.bind_image("horizon_radiance_img", &horizon_radiance_tx_); pass.bind_image("horizon_occlusion_img", &horizon_occlusion_tx_); - pass.bind_ssbo("tiles_coord_buf", &horizon_tiles_buf_); + pass.bind_ssbo("tiles_coord_buf", &horizon_tracing_tiles_buf_); pass.bind_texture("screen_radiance_tx", &downsampled_in_radiance_tx_); pass.bind_texture("screen_normal_tx", &downsampled_in_normal_tx_); pass.bind_texture(RBUFS_UTILITY_TEX_SLOT, inst_.pipelines.utility_tx); @@ -236,7 +231,7 @@ void RayTraceModule::sync() inst_.hiz_buffer.bind_resources(pass); inst_.sampling.bind_resources(pass); inst_.gbuffer.bind_resources(pass); - pass.dispatch(horizon_dispatch_buf_); + pass.dispatch(horizon_tracing_dispatch_buf_); pass.barrier(GPU_BARRIER_SHADER_IMAGE_ACCESS); } { @@ -248,7 +243,7 @@ void RayTraceModule::sync() pass.bind_image("horizon_radiance_img", &horizon_radiance_tx_); pass.bind_image("horizon_occlusion_img", &horizon_occlusion_tx_); pass.bind_image("radiance_img", &horizon_scan_output_tx_); - pass.bind_image("tile_mask_img", &tile_mask_tx_); + pass.bind_image("tile_mask_img", &tile_horizon_denoise_tx_); pass.bind_ssbo("tiles_coord_buf", &horizon_denoise_tiles_buf_); inst_.bind_uniform_data(&pass); inst_.sampling.bind_resources(pass); @@ -266,15 +261,150 @@ void RayTraceModule::debug_pass_sync() {} void RayTraceModule::debug_draw(View & /*view*/, GPUFrameBuffer * /*view_fb*/) {} -RayTraceResult RayTraceModule::trace(RayTraceBuffer &rt_buffer, - GPUTexture *screen_radiance_tx, - const float4x4 &screen_radiance_persmat, - eClosureBits active_closures, - eClosureBits raytrace_closure, - /* TODO(fclem): Maybe wrap these two in some other class. */ - View &main_view, - View &render_view, - bool force_no_tracing) +RayTraceResult RayTraceModule::render(RayTraceBuffer &rt_buffer, + GPUTexture *screen_radiance_back_tx, + GPUTexture *screen_radiance_front_tx, + const float4x4 &screen_radiance_persmat, + eClosureBits active_closures, + /* TODO(fclem): Maybe wrap these two in some other class. */ + View &main_view, + View &render_view, + bool do_refraction_tracing) +{ + using namespace blender::math; + + RaytraceEEVEE options = ray_tracing_options_; + + bool use_horizon_scan = options.screen_trace_max_roughness < 1.0f; + if ((active_closures == CLOSURE_REFRACTION) || (active_closures == CLOSURE_NONE)) { + /* Disable horizon scan if there is only a refraction closure. Avoid the setup cost. */ + use_horizon_scan = false; + } + + const int resolution_scale = max_ii(1, power_of_2_max_i(options.resolution_scale)); + + const int2 extent = inst_.film.render_extent_get(); + const int2 tracing_res = math::divide_ceil(extent, int2(resolution_scale)); + const int2 dummy_extent(1, 1); + const int2 group_size(RAYTRACE_GROUP_SIZE); + + const int2 denoise_tiles = divide_ceil(extent, group_size); + const int2 raytrace_tiles = divide_ceil(tracing_res, group_size); + const int denoise_tile_count = denoise_tiles.x * denoise_tiles.y; + const int raytrace_tile_count = raytrace_tiles.x * raytrace_tiles.y; + tile_classify_dispatch_size_ = int3(denoise_tiles, 1); + tile_compact_dispatch_size_ = int3(divide_ceil(raytrace_tiles, group_size), 1); + tracing_dispatch_size_ = int3(divide_ceil(tracing_res, group_size), 1); + + const int closure_count = 3; + eGPUTextureFormat format = RAYTRACE_TILEMASK_FORMAT; + eGPUTextureUsage usage_rw = GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_SHADER_WRITE; + tile_raytrace_denoise_tx_.ensure_2d_array(format, denoise_tiles, closure_count, usage_rw); + tile_raytrace_tracing_tx_.ensure_2d_array(format, raytrace_tiles, closure_count, usage_rw); + tile_horizon_denoise_tx_.ensure_2d_array(format, denoise_tiles, closure_count, usage_rw); + tile_horizon_tracing_tx_.ensure_2d_array(format, raytrace_tiles, closure_count, usage_rw); + + tile_raytrace_denoise_tx_.clear(uint4(0u)); + tile_raytrace_tracing_tx_.clear(uint4(0u)); + tile_horizon_denoise_tx_.clear(uint4(0u)); + tile_horizon_tracing_tx_.clear(uint4(0u)); + + horizon_tracing_tiles_buf_.resize(ceil_to_multiple_u(raytrace_tile_count, 512)); + horizon_denoise_tiles_buf_.resize(ceil_to_multiple_u(denoise_tile_count, 512)); + raytrace_tracing_tiles_buf_.resize(ceil_to_multiple_u(raytrace_tile_count, 512)); + raytrace_denoise_tiles_buf_.resize(ceil_to_multiple_u(denoise_tile_count, 512)); + + /* Data for tile classification. */ + float roughness_mask_start = options.screen_trace_max_roughness; + float roughness_mask_fade = 0.2f; + data_.roughness_mask_scale = 1.0 / roughness_mask_fade; + data_.roughness_mask_bias = data_.roughness_mask_scale * roughness_mask_start; + + /* Data for the radiance setup. */ + data_.brightness_clamp = (options.sample_clamp > 0.0) ? options.sample_clamp : 1e20; + data_.resolution_scale = resolution_scale; + data_.resolution_bias = int2(inst_.sampling.rng_2d_get(SAMPLING_RAYTRACE_V) * resolution_scale); + data_.radiance_persmat = screen_radiance_persmat; + data_.full_resolution = extent; + data_.full_resolution_inv = 1.0f / float2(extent); + + /* TODO(fclem): Eventually all uniform data is setup here. */ + + inst_.push_uniform_data(); + + RayTraceResult result; + + DRW_stats_group_start("Raytracing"); + + if (use_horizon_scan) { + downsampled_in_radiance_tx_.acquire(tracing_res, RAYTRACE_RADIANCE_FORMAT, usage_rw); + downsampled_in_normal_tx_.acquire(tracing_res, GPU_RGBA8, usage_rw); + + screen_radiance_tx_ = screen_radiance_front_tx; + inst_.manager->submit(horizon_setup_ps_, render_view); + } + + if (active_closures != CLOSURE_NONE) { + inst_.manager->submit(tile_classify_ps_); + } + + result.diffuse = trace("Diffuse", + options, + rt_buffer, + screen_radiance_front_tx, + screen_radiance_persmat, + active_closures, + CLOSURE_DIFFUSE, + main_view, + render_view, + use_horizon_scan, + false); + + result.reflect = trace("Reflection", + options, + rt_buffer, + screen_radiance_front_tx, + screen_radiance_persmat, + active_closures, + CLOSURE_REFLECTION, + main_view, + render_view, + use_horizon_scan, + false); + + result.refract = trace("Refraction", + options, + rt_buffer, + screen_radiance_back_tx, + render_view.persmat(), + active_closures, + CLOSURE_REFRACTION, + main_view, + render_view, + false, /* Not yet supported */ + !do_refraction_tracing); + + downsampled_in_radiance_tx_.release(); + downsampled_in_normal_tx_.release(); + + DRW_stats_group_end(); + + return result; +} + +RayTraceResultTexture RayTraceModule::trace( + const char *debug_pass_name, + RaytraceEEVEE options, + RayTraceBuffer &rt_buffer, + GPUTexture *screen_radiance_tx, + const float4x4 &screen_radiance_persmat, + eClosureBits active_closures, + eClosureBits raytrace_closure, + /* TODO(fclem): Maybe wrap these two in some other class. */ + View &main_view, + View &render_view, + bool use_horizon_scan, + bool force_no_tracing) { BLI_assert_msg(count_bits_i(raytrace_closure) == 1, "Only one closure type can be raytraced at a time."); @@ -288,40 +418,40 @@ RayTraceResult RayTraceModule::trace(RayTraceBuffer &rt_buffer, screen_radiance_tx_ = screen_radiance_tx; - RaytraceEEVEE options; PassSimple *generate_ray_ps = nullptr; PassSimple *trace_ray_ps = nullptr; PassSimple *denoise_spatial_ps = nullptr; PassSimple *denoise_bilateral_ps = nullptr; PassSimple *horizon_scan_ps = nullptr; RayTraceBuffer::DenoiseBuffer *denoise_buf = nullptr; + int closure_index = 0; if (raytrace_closure == CLOSURE_DIFFUSE) { - options = diffuse_options_; generate_ray_ps = &generate_diffuse_ps_; trace_ray_ps = force_no_tracing ? &trace_fallback_ps_ : &trace_diffuse_ps_; denoise_spatial_ps = &denoise_spatial_diffuse_ps_; denoise_bilateral_ps = &denoise_bilateral_diffuse_ps_; denoise_buf = &rt_buffer.diffuse; horizon_scan_ps = &horizon_scan_diffuse_ps_; + closure_index = 0; } else if (raytrace_closure == CLOSURE_REFLECTION) { - options = reflection_options_; generate_ray_ps = &generate_reflect_ps_; trace_ray_ps = force_no_tracing ? &trace_fallback_ps_ : &trace_reflect_ps_; denoise_spatial_ps = &denoise_spatial_reflect_ps_; denoise_bilateral_ps = &denoise_bilateral_reflect_ps_; denoise_buf = &rt_buffer.reflection; horizon_scan_ps = &horizon_scan_reflect_ps_; + closure_index = 1; } else if (raytrace_closure == CLOSURE_REFRACTION) { - options = refraction_options_; generate_ray_ps = &generate_refract_ps_; trace_ray_ps = force_no_tracing ? &trace_fallback_ps_ : &trace_refract_ps_; denoise_spatial_ps = &denoise_spatial_refract_ps_; denoise_bilateral_ps = &denoise_bilateral_refract_ps_; denoise_buf = &rt_buffer.refraction; horizon_scan_ps = &horizon_scan_refract_ps_; + closure_index = 2; } if ((active_closures & raytrace_closure) == 0) { @@ -337,19 +467,7 @@ RayTraceResult RayTraceModule::trace(RayTraceBuffer &rt_buffer, const int2 extent = inst_.film.render_extent_get(); const int2 tracing_res = math::divide_ceil(extent, int2(resolution_scale)); - const int2 dummy_extent(1, 1); - tracing_dispatch_size_ = int3(math::divide_ceil(tracing_res, int2(RAYTRACE_GROUP_SIZE)), 1); - - tile_classify_dispatch_size_ = int3(math::divide_ceil(extent, int2(RAYTRACE_GROUP_SIZE)), 1); - const int denoise_tile_count = tile_classify_dispatch_size_.x * tile_classify_dispatch_size_.y; - const int2 tile_mask_extent = tile_classify_dispatch_size_.xy(); - - const int2 ray_tiles = math::divide_ceil(tracing_res, int2(RAYTRACE_GROUP_SIZE)); - const int ray_tile_count = ray_tiles.x * ray_tiles.y; - tile_compact_dispatch_size_ = int3(math::divide_ceil(ray_tiles, int2(RAYTRACE_GROUP_SIZE)), 1); - - renderbuf_stencil_view_ = inst_.render_buffers.depth_tx.stencil_view(); renderbuf_depth_view_ = inst_.render_buffers.depth_tx; const bool use_denoise = (options.flag & RAYTRACE_EEVEE_USE_DENOISE); @@ -359,9 +477,10 @@ RayTraceResult RayTraceModule::trace(RayTraceBuffer &rt_buffer, use_spatial_denoise; const bool use_bilateral_denoise = (options.denoise_stages & RAYTRACE_EEVEE_DENOISE_BILATERAL) && use_temporal_denoise; - const bool use_horizon_scan = true; - DRW_stats_group_start("Raytracing"); + eGPUTextureUsage usage_rw = GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_SHADER_WRITE; + + DRW_stats_group_start(debug_pass_name); data_.thickness = options.screen_trace_thickness; data_.quality = 1.0f - 0.95f * options.screen_trace_quality; @@ -380,16 +499,14 @@ RayTraceResult RayTraceModule::trace(RayTraceBuffer &rt_buffer, data_.full_resolution = extent; data_.full_resolution_inv = 1.0f / float2(extent); data_.skip_denoise = !use_spatial_denoise; + data_.closure_index = closure_index; inst_.push_uniform_data(); - tile_mask_tx_.acquire(tile_mask_extent, RAYTRACE_TILEMASK_FORMAT); - horizon_tiles_buf_.resize(ceil_to_multiple_u(ray_tile_count, 512)); - horizon_denoise_tiles_buf_.resize(ceil_to_multiple_u(denoise_tile_count, 512)); - ray_tiles_buf_.resize(ceil_to_multiple_u(ray_tile_count, 512)); - ray_denoise_tiles_buf_.resize(ceil_to_multiple_u(denoise_tile_count, 512)); - /* Ray setup. */ - inst_.manager->submit(tile_classify_ps_); + raytrace_tracing_dispatch_buf_.clear_to_zero(); + raytrace_denoise_dispatch_buf_.clear_to_zero(); + horizon_tracing_dispatch_buf_.clear_to_zero(); + horizon_denoise_dispatch_buf_.clear_to_zero(); inst_.manager->submit(tile_compact_ps_); { @@ -402,14 +519,13 @@ RayTraceResult RayTraceModule::trace(RayTraceBuffer &rt_buffer, inst_.manager->submit(*trace_ray_ps, render_view); } - RayTraceResult result; + RayTraceResultTexture result; /* Spatial denoise pass is required to resolve at least one ray per pixel. */ { denoise_buf->denoised_spatial_tx.acquire(extent, RAYTRACE_RADIANCE_FORMAT); - hit_variance_tx_.acquire(use_temporal_denoise ? extent : dummy_extent, - RAYTRACE_VARIANCE_FORMAT); - hit_depth_tx_.acquire(use_temporal_denoise ? extent : dummy_extent, GPU_R32F); + hit_variance_tx_.acquire(use_temporal_denoise ? extent : int2(1), RAYTRACE_VARIANCE_FORMAT); + hit_depth_tx_.acquire(use_temporal_denoise ? extent : int2(1), GPU_R32F); denoised_spatial_tx_ = denoise_buf->denoised_spatial_tx; inst_.manager->submit(*denoise_spatial_ps, render_view); @@ -422,13 +538,17 @@ RayTraceResult RayTraceModule::trace(RayTraceBuffer &rt_buffer, ray_radiance_tx_.release(); if (use_temporal_denoise) { - denoise_buf->denoised_temporal_tx.acquire(extent, RAYTRACE_RADIANCE_FORMAT); - denoise_variance_tx_.acquire(use_bilateral_denoise ? extent : dummy_extent, - RAYTRACE_VARIANCE_FORMAT); - denoise_buf->variance_history_tx.ensure_2d(RAYTRACE_VARIANCE_FORMAT, - use_bilateral_denoise ? extent : dummy_extent); - denoise_buf->tilemask_history_tx.ensure_2d(RAYTRACE_TILEMASK_FORMAT, tile_mask_extent); - if (denoise_buf->radiance_history_tx.ensure_2d(RAYTRACE_RADIANCE_FORMAT, extent) || + denoise_buf->denoised_temporal_tx.acquire(extent, RAYTRACE_RADIANCE_FORMAT, usage_rw); + denoise_variance_tx_.acquire( + use_bilateral_denoise ? extent : int2(1), RAYTRACE_VARIANCE_FORMAT, usage_rw); + denoise_buf->variance_history_tx.ensure_2d( + RAYTRACE_VARIANCE_FORMAT, use_bilateral_denoise ? extent : int2(1), usage_rw); + denoise_buf->tilemask_history_tx.ensure_2d_array(RAYTRACE_TILEMASK_FORMAT, + tile_raytrace_denoise_tx_.size().xy(), + tile_raytrace_denoise_tx_.size().z, + usage_rw); + + if (denoise_buf->radiance_history_tx.ensure_2d(RAYTRACE_RADIANCE_FORMAT, extent, usage_rw) || denoise_buf->valid_history == false) { /* If viewport resolution changes, do not try to use history. */ @@ -450,6 +570,8 @@ RayTraceResult RayTraceModule::trace(RayTraceBuffer &rt_buffer, result = {denoise_buf->denoised_temporal_tx, denoise_buf->radiance_history_tx}; /* Not referenced by result anymore. */ denoise_buf->denoised_spatial_tx.release(); + + GPU_texture_copy(denoise_buf->tilemask_history_tx, tile_raytrace_denoise_tx_); } /* Only use history buffer for the next frame if temporal denoise was used by the current one. */ @@ -459,7 +581,7 @@ RayTraceResult RayTraceModule::trace(RayTraceBuffer &rt_buffer, hit_depth_tx_.release(); if (use_bilateral_denoise) { - denoise_buf->denoised_bilateral_tx.acquire(extent, RAYTRACE_RADIANCE_FORMAT); + denoise_buf->denoised_bilateral_tx.acquire(extent, RAYTRACE_RADIANCE_FORMAT, usage_rw); denoised_bilateral_tx_ = denoise_buf->denoised_bilateral_tx; inst_.manager->submit(*denoise_bilateral_ps, render_view); @@ -476,19 +598,11 @@ RayTraceResult RayTraceModule::trace(RayTraceBuffer &rt_buffer, denoise_variance_tx_.release(); if (use_horizon_scan) { - downsampled_in_radiance_tx_.acquire(tracing_res, RAYTRACE_RADIANCE_FORMAT); - downsampled_in_normal_tx_.acquire(tracing_res, GPU_RGBA8); - - inst_.manager->submit(horizon_setup_ps_, render_view); - - horizon_occlusion_tx_.acquire(tracing_res, GPU_R8); - horizon_radiance_tx_.acquire(tracing_res, RAYTRACE_RADIANCE_FORMAT); + horizon_occlusion_tx_.acquire(tracing_res, GPU_R8, usage_rw); + horizon_radiance_tx_.acquire(tracing_res, RAYTRACE_RADIANCE_FORMAT, usage_rw); inst_.manager->submit(*horizon_scan_ps, render_view); - downsampled_in_radiance_tx_.release(); - downsampled_in_normal_tx_.release(); - horizon_scan_output_tx_ = result.get(); inst_.manager->submit(horizon_denoise_ps_, render_view); @@ -497,13 +611,6 @@ RayTraceResult RayTraceModule::trace(RayTraceBuffer &rt_buffer, horizon_radiance_tx_.release(); } - tile_mask_tx_.release(); - - if (tile_mask_tx_.is_valid()) { - /* Swap after last use. */ - TextureFromPool::swap(tile_mask_tx_, denoise_buf->tilemask_history_tx); - } - DRW_stats_group_end(); return result; diff --git a/source/blender/draw/engines/eevee_next/eevee_raytrace.hh b/source/blender/draw/engines/eevee_next/eevee_raytrace.hh index fd59d30b8d7..1cb77d95de9 100644 --- a/source/blender/draw/engines/eevee_next/eevee_raytrace.hh +++ b/source/blender/draw/engines/eevee_next/eevee_raytrace.hh @@ -28,7 +28,7 @@ class Instance; * \{ */ /** - * Contain persistent buffer that need to be stored per view. + * Contain persistent buffer that need to be stored per view, per layer. */ struct RayTraceBuffer { /** Set of buffers that need to be allocated for each ray type. */ @@ -62,7 +62,7 @@ struct RayTraceBuffer { * The result buffer is usually short lived and is kept in a TextureFromPool managed by the mode. * This structure contains a reference to it so that it can be freed after use by the caller. */ -class RayTraceResult { +class RayTraceResultTexture { private: /** Result is in a temporary texture that needs to be released. */ TextureFromPool *result_ = nullptr; @@ -70,9 +70,9 @@ class RayTraceResult { Texture *history_ = nullptr; public: - RayTraceResult() = default; - RayTraceResult(TextureFromPool &result) : result_(result.ptr()){}; - RayTraceResult(TextureFromPool &result, Texture &history) + RayTraceResultTexture() = default; + RayTraceResultTexture(TextureFromPool &result) : result_(result.ptr()){}; + RayTraceResultTexture(TextureFromPool &result, Texture &history) : result_(result.ptr()), history_(history.ptr()){}; GPUTexture *get() @@ -91,6 +91,19 @@ class RayTraceResult { } }; +struct RayTraceResult { + RayTraceResultTexture diffuse; + RayTraceResultTexture reflect; + RayTraceResultTexture refract; + + void release() + { + diffuse.release(); + reflect.release(); + refract.release(); + } +}; + /** \} */ /* -------------------------------------------------------------------- */ @@ -129,22 +142,26 @@ class RayTraceModule { int3 tile_compact_dispatch_size_ = int3(1); /** Dispatch with enough tiles for the tracing resolution. */ int3 tracing_dispatch_size_ = int3(1); - /** 2D tile mask to check which unused adjacent tile we need to clear. */ - TextureFromPool tile_mask_tx_ = {"tile_mask_tx"}; + /** 2D tile mask to check which unused adjacent tile we need to clear and which tile we need to + * dispatch for each work type. */ + Texture tile_raytrace_denoise_tx_ = {"tile_raytrace_denoise_tx_"}; + Texture tile_raytrace_tracing_tx_ = {"tile_raytrace_tracing_tx_"}; + Texture tile_horizon_denoise_tx_ = {"tile_horizon_denoise_tx_"}; + Texture tile_horizon_tracing_tx_ = {"tile_horizon_tracing_tx_"}; /** Indirect dispatch rays. Avoid dispatching work-groups that will not trace anything.*/ - DispatchIndirectBuf ray_dispatch_buf_ = {"ray_dispatch_buf_"}; + DispatchIndirectBuf raytrace_tracing_dispatch_buf_ = {"raytrace_tracing_dispatch_buf_"}; /** Indirect dispatch denoise full-resolution tiles. */ - DispatchIndirectBuf ray_denoise_dispatch_buf_ = {"ray_denoise_dispatch_buf_"}; + DispatchIndirectBuf raytrace_denoise_dispatch_buf_ = {"raytrace_denoise_dispatch_buf_"}; /** Indirect dispatch horizon scan. Avoid dispatching work-groups that will not scan anything.*/ - DispatchIndirectBuf horizon_dispatch_buf_ = {"horizon_dispatch_buf_"}; + DispatchIndirectBuf horizon_tracing_dispatch_buf_ = {"horizon_tracing_dispatch_buf_"}; /** Indirect dispatch denoise full-resolution tiles. */ DispatchIndirectBuf horizon_denoise_dispatch_buf_ = {"horizon_denoise_dispatch_buf_"}; /** Pointer to the texture to store the result of horizon scan in. */ GPUTexture *horizon_scan_output_tx_ = nullptr; /** Tile buffer that contains tile coordinates. */ - RayTraceTileBuf ray_tiles_buf_ = {"ray_tiles_buf_"}; - RayTraceTileBuf ray_denoise_tiles_buf_ = {"ray_denoise_tiles_buf_"}; - RayTraceTileBuf horizon_tiles_buf_ = {"horizon_tiles_buf_"}; + RayTraceTileBuf raytrace_tracing_tiles_buf_ = {"raytrace_tracing_tiles_buf_"}; + RayTraceTileBuf raytrace_denoise_tiles_buf_ = {"raytrace_denoise_tiles_buf_"}; + RayTraceTileBuf horizon_tracing_tiles_buf_ = {"horizon_tracing_tiles_buf_"}; RayTraceTileBuf horizon_denoise_tiles_buf_ = {"horizon_denoise_tiles_buf_"}; /** Texture containing the ray direction and PDF. */ TextureFromPool ray_data_tx_ = {"ray_data_tx"}; @@ -179,15 +196,11 @@ class RayTraceModule { /** Dummy texture when the tracing is disabled. */ TextureFromPool dummy_result_tx_ = {"dummy_result_tx"}; - /** Pointer to `inst_.render_buffers.depth_tx.stencil_view()` updated before submission. */ - GPUTexture *renderbuf_stencil_view_ = nullptr; /** Pointer to `inst_.render_buffers.depth_tx` updated before submission. */ GPUTexture *renderbuf_depth_view_ = nullptr; /** Copy of the scene options to avoid changing parameters during motion blur. */ - RaytraceEEVEE reflection_options_; - RaytraceEEVEE refraction_options_; - RaytraceEEVEE diffuse_options_; + RaytraceEEVEE ray_tracing_options_; RaytraceEEVEE_Method tracing_method_ = RAYTRACE_EEVEE_METHOD_NONE; @@ -201,31 +214,47 @@ class RayTraceModule { void sync(); /** - * RayTrace the scene and resolve a radiance buffer for the corresponding `closure_bit` into the - * given `out_radiance_tx`. + * RayTrace the scene and resolve radiance buffer for the corresponding `closure_bit`. * * IMPORTANT: Should not be conditionally executed as it manages the RayTraceResult. - * IMPORTANT: The screen tracing will use the Hierarchical-Z Buffer in its current state. + * IMPORTANT: The screen tracing will be using the front and back Hierarchical-Z Buffer in its + * current state. * - * \arg screen_radiance_tx is the texture used for screen space rays. - * \arg screen_radiance_persmat is the view projection matrix used to render screen_radiance_tx. + * \arg rt_buffer is the layer's permanent storage. + * \arg screen_radiance_back_tx is the texture used for screen space transmission rays. + * \arg screen_radiance_front_tx is the texture used for screen space reflection rays. + * \arg screen_radiance_persmat is the view projection matrix used for screen_radiance_front_tx. * \arg active_closures is a mask of all active closures in a deferred layer. - * \arg raytrace_closure is type of closure the rays are to be casted for. * \arg main_view is the un-jittered view. * \arg render_view is the TAA jittered view. * \arg force_no_tracing will run the pipeline without any tracing, relying only on local probes. */ - RayTraceResult trace(RayTraceBuffer &rt_buffer, - GPUTexture *screen_radiance_tx, - const float4x4 &screen_radiance_persmat, - eClosureBits active_closures, - eClosureBits raytrace_closure, - View &main_view, - View &render_view, - bool force_no_tracing = false); + RayTraceResult render(RayTraceBuffer &rt_buffer, + GPUTexture *screen_radiance_back_tx, + GPUTexture *screen_radiance_front_tx, + const float4x4 &screen_radiance_persmat, + eClosureBits active_closures, + /* TODO(fclem): Maybe wrap these two in some other class. */ + View &main_view, + View &render_view, + bool do_refraction_tracing); void debug_pass_sync(); void debug_draw(View &view, GPUFrameBuffer *view_fb); + + private: + RayTraceResultTexture trace(const char *debug_pass_name, + RaytraceEEVEE options, + RayTraceBuffer &rt_buffer, + GPUTexture *screen_radiance_tx, + const float4x4 &screen_radiance_persmat, + eClosureBits active_closures, + eClosureBits raytrace_closure, + /* TODO(fclem): Maybe wrap these two in some other class. */ + View &main_view, + View &render_view, + bool use_horizon_scan, + bool force_no_tracing); }; /** \} */ diff --git a/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc b/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc index 3498f93cbfd..ee0c55ed9c4 100644 --- a/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc +++ b/source/blender/draw/engines/eevee_next/eevee_renderbuffers.cc @@ -69,7 +69,7 @@ void RenderBuffers::acquire(int2 extent) eGPUTextureUsage usage = GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_ATTACHMENT; /* Depth and combined are always needed. */ - depth_tx.ensure_2d(GPU_DEPTH24_STENCIL8, extent, usage | GPU_TEXTURE_USAGE_FORMAT_VIEW); + depth_tx.ensure_2d(GPU_DEPTH24_STENCIL8, extent, usage); /* TODO(fclem): depth_tx should ideally be a texture from pool but we need stencil_view * which is currently unsupported by pool textures. */ // depth_tx.acquire(extent, GPU_DEPTH24_STENCIL8); diff --git a/source/blender/draw/engines/eevee_next/eevee_shader.cc b/source/blender/draw/engines/eevee_next/eevee_shader.cc index fb395e767cf..d8da4340f7f 100644 --- a/source/blender/draw/engines/eevee_next/eevee_shader.cc +++ b/source/blender/draw/engines/eevee_next/eevee_shader.cc @@ -394,10 +394,6 @@ void ShaderModule::material_create_info_ammend(GPUMaterial *gpumat, GPUCodegenOu } } - if (pipeline_type == MAT_PIPE_PREPASS_FORWARD) { - info.define("MAT_FORWARD"); - } - bool supports_render_passes = (pipeline_type == MAT_PIPE_DEFERRED); /* Opaque forward do support AOVs and render pass if not using transparency. */ if (!GPU_material_flag_get(gpumat, GPU_MATFLAG_TRANSPARENT) && @@ -410,8 +406,56 @@ void ShaderModule::material_create_info_ammend(GPUMaterial *gpumat, GPUCodegenOu info.additional_info("eevee_cryptomatte_out"); } - if (GPU_material_flag_get(gpumat, GPU_MATFLAG_SUBSURFACE) && pipeline_type == MAT_PIPE_FORWARD) { - info.define("SSS_TRANSMITTANCE"); + int lit_closure_count = 0; + if (GPU_material_flag_get(gpumat, GPU_MATFLAG_DIFFUSE)) { + info.define("MAT_DIFFUSE"); + lit_closure_count++; + } + if (GPU_material_flag_get(gpumat, GPU_MATFLAG_GLOSSY)) { + info.define("MAT_REFLECTION"); + lit_closure_count++; + } + if (GPU_material_flag_get(gpumat, GPU_MATFLAG_TRANSLUCENT)) { + info.define("MAT_TRANSLUCENT"); + lit_closure_count++; + } + if (GPU_material_flag_get(gpumat, GPU_MATFLAG_SUBSURFACE)) { + info.define("MAT_SUBSURFACE"); + lit_closure_count++; + } + if (GPU_material_flag_get(gpumat, GPU_MATFLAG_REFRACT)) { + info.define("MAT_REFRACTION"); + /* TODO(fclem): Support refracted lights. */ + } + + if (GPU_material_flag_get(gpumat, GPU_MATFLAG_TRANSLUCENT | GPU_MATFLAG_SUBSURFACE)) { + info.define("SHADOW_SUBSURFACE"); + } + + if ((pipeline_type == MAT_PIPE_FORWARD) || + GPU_material_flag_get(gpumat, GPU_MATFLAG_SHADER_TO_RGBA)) + { + switch (lit_closure_count) { + case 0: + /* Define nothing. This will in turn define SKIP_LIGHT_EVAL. */ + break; + /* These need to be separated since the strings need to be static. */ + case 1: + info.define("LIGHT_CLOSURE_EVAL_COUNT", "1"); + break; + case 2: + info.define("LIGHT_CLOSURE_EVAL_COUNT", "2"); + break; + case 3: + info.define("LIGHT_CLOSURE_EVAL_COUNT", "3"); + break; + case 4: + info.define("LIGHT_CLOSURE_EVAL_COUNT", "4"); + break; + default: + BLI_assert_unreachable(); + break; + } } if (GPU_material_flag_get(gpumat, GPU_MATFLAG_BARYCENTRIC)) { @@ -645,7 +689,12 @@ void ShaderModule::material_create_info_ammend(GPUMaterial *gpumat, GPUCodegenOu info.additional_info("eevee_surf_capture"); break; case MAT_PIPE_DEFERRED: - info.additional_info("eevee_surf_deferred"); + if (GPU_material_flag_get(gpumat, GPU_MATFLAG_SHADER_TO_RGBA)) { + info.additional_info("eevee_surf_deferred_hybrid"); + } + else { + info.additional_info("eevee_surf_deferred"); + } break; case MAT_PIPE_FORWARD: info.additional_info("eevee_surf_forward"); diff --git a/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh b/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh index 3e7eb26df61..599b4a20ca7 100644 --- a/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh +++ b/source/blender/draw/engines/eevee_next/eevee_shader_shared.hh @@ -1182,11 +1182,13 @@ enum eClosureBits : uint32_t { CLOSURE_SSS = (1u << 1u), CLOSURE_REFLECTION = (1u << 2u), CLOSURE_REFRACTION = (1u << 3u), + CLOSURE_TRANSLUCENT = (1u << 4u), CLOSURE_TRANSPARENCY = (1u << 8u), CLOSURE_EMISSION = (1u << 9u), CLOSURE_HOLDOUT = (1u << 10u), CLOSURE_VOLUME = (1u << 11u), CLOSURE_AMBIENT_OCCLUSION = (1u << 12u), + CLOSURE_SHADER_TO_RGBA = (1u << 13u), }; enum GBufferMode : uint32_t { @@ -1197,9 +1199,10 @@ enum GBufferMode : uint32_t { GBUF_REFRACTION = 2u, GBUF_DIFFUSE = 3u, GBUF_SSS = 4u, + GBUF_TRANSLUCENT = 5u, /** Special configurations. Packs multiple closures into 1 layer. */ - GBUF_OPAQUE_DIELECTRIC = 4u, + GBUF_OPAQUE_DIELECTRIC = 14u, /** Set for surfaces without lit closures. This stores only the normal to the surface. */ GBUF_UNLIT = 15u, @@ -1232,7 +1235,7 @@ struct RayTraceData { bool1 skip_denoise; /** Closure being ray-traced. */ eClosureBits closure_active; - int _pad0; + int closure_index; int _pad1; }; BLI_STATIC_ASSERT_ALIGN(RayTraceData, 16) @@ -1424,7 +1427,7 @@ BLI_STATIC_ASSERT_ALIGN(ProbePlanarDisplayData, 16) struct PipelineInfoData { float alpha_hash_scale; - float _pad0; + bool1 is_probe_reflection; float _pad1; float _pad2; }; diff --git a/source/blender/draw/engines/eevee_next/eevee_shadow.cc b/source/blender/draw/engines/eevee_next/eevee_shadow.cc index 7c7561b41e5..9de56cfbe35 100644 --- a/source/blender/draw/engines/eevee_next/eevee_shadow.cc +++ b/source/blender/draw/engines/eevee_next/eevee_shadow.cc @@ -761,8 +761,10 @@ void ShadowModule::init() const int2 atlas_extent = shadow_page_size_ * int2(SHADOW_PAGE_PER_ROW); const int atlas_layers = divide_ceil_u(shadow_page_len_, SHADOW_PAGE_PER_LAYER); - eGPUTextureUsage tex_usage = GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_SHADER_WRITE | - GPU_TEXTURE_USAGE_ATOMIC; + eGPUTextureUsage tex_usage = GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_SHADER_WRITE; + if (ShadowModule::shadow_technique == ShadowTechnique::ATOMIC_RASTER) { + tex_usage |= GPU_TEXTURE_USAGE_ATOMIC; + } if (atlas_tx_.ensure_2d_array(atlas_type, atlas_extent, atlas_layers, tex_usage)) { /* Global update. */ do_full_update = true; @@ -824,7 +826,6 @@ void ShadowModule::begin_sync() { Manager &manager = *inst_.manager; - RenderBuffers &render_buffers = inst_.render_buffers; PassMain &pass = tilemap_usage_ps_; pass.init(); @@ -861,7 +862,7 @@ void ShadowModule::begin_sync() sub.shader_set(inst_.shaders.static_shader_get(SHADOW_TILEMAP_TAG_USAGE_OPAQUE)); sub.bind_ssbo("tilemaps_buf", &tilemap_pool.tilemaps_data); sub.bind_ssbo("tiles_buf", &tilemap_pool.tiles_data); - sub.bind_texture("depth_tx", &render_buffers.depth_tx); + sub.bind_texture("depth_tx", &src_depth_tx_); sub.push_constant("tilemap_projection_ratio", &tilemap_projection_ratio_); inst_.lights.bind_resources(sub); sub.dispatch(&dispatch_depth_scan_size_); @@ -1263,15 +1264,15 @@ float ShadowModule::tilemap_pixel_radius() return cubeface_diagonal / pixel_count; } -/* Update all shadow regions visible inside the view. - * If called multiple time for the same view, it will only do the depth buffer scanning - * to check any new opaque surfaces. - * Needs to be called after `LightModule::set_view();`. */ -void ShadowModule::set_view(View &view) +void ShadowModule::set_view(View &view, GPUTexture *depth_tx) { GPUFrameBuffer *prev_fb = GPU_framebuffer_active_get(); - int3 target_size = inst_.render_buffers.depth_tx.size(); + src_depth_tx_ = depth_tx; + + int3 target_size(1); + GPU_texture_get_mipmap_size(depth_tx, 0, target_size); + dispatch_depth_scan_size_ = math::divide_ceil(target_size, int3(SHADOW_DEPTH_SCAN_GROUP_SIZE)); pixel_world_radius_ = screen_pixel_radius(view, int2(target_size)); diff --git a/source/blender/draw/engines/eevee_next/eevee_shadow.hh b/source/blender/draw/engines/eevee_next/eevee_shadow.hh index 4808df6d01e..01396189fd0 100644 --- a/source/blender/draw/engines/eevee_next/eevee_shadow.hh +++ b/source/blender/draw/engines/eevee_next/eevee_shadow.hh @@ -223,6 +223,8 @@ class ShadowModule { PassMain::Sub *tilemap_usage_transparent_ps_ = nullptr; GPUBatch *box_batch_ = nullptr; + /* Source texture for depth buffer analysis. */ + GPUTexture *src_depth_tx_ = nullptr; Framebuffer usage_tag_fb; @@ -336,7 +338,11 @@ class ShadowModule { void set_lights_data(); - void set_view(View &view); + /* Update all shadow regions visible inside the view. + * If called multiple time for the same view, it will only do the depth buffer scanning + * to check any new opaque surfaces. + * Needs to be called after `LightModule::set_view();`. */ + void set_view(View &view, GPUTexture *depth_tx = nullptr); void debug_end_sync(); void debug_draw(View &view, GPUFrameBuffer *view_fb); diff --git a/source/blender/draw/engines/eevee_next/eevee_sync.hh b/source/blender/draw/engines/eevee_next/eevee_sync.hh index b881d87f55f..409c127f991 100644 --- a/source/blender/draw/engines/eevee_next/eevee_sync.hh +++ b/source/blender/draw/engines/eevee_next/eevee_sync.hh @@ -49,10 +49,6 @@ class ObjectKey { ObjectKey(Object *ob, int sub_key = 0) { - /* Since we use `memcmp` for comparison, - * we have to ensure the padding bytes are initialized as well. */ - memset(this, 0, sizeof(*this)); - ob_ = DEG_get_original_object(ob); hash_value_ = BLI_ghashutil_ptrhash(ob_); @@ -81,12 +77,56 @@ class ObjectKey { bool operator<(const ObjectKey &k) const { - return memcmp(this, &k, sizeof(*this)) < 0; + if (hash_value_ != k.hash_value_) { + return hash_value_ < k.hash_value_; + } + if (ob_ != k.ob_) { + return (ob_ < k.ob_); + } + if (parent_ != k.parent_) { + return (parent_ < k.parent_); + } + if (sub_key_ != k.sub_key_) { + return (sub_key_ < k.sub_key_); + } + if (parent_) { + for (int i : IndexRange(MAX_DUPLI_RECUR)) { + if (id_[i] < k.id_[i]) { + return true; + } + if (id_[i] == INT_MAX) { + break; + } + } + } + return false; } bool operator==(const ObjectKey &k) const { - return memcmp(this, &k, sizeof(*this)) == 0; + if (hash_value_ != k.hash_value_) { + return false; + } + if (ob_ != k.ob_) { + return false; + } + if (parent_ != k.parent_) { + return false; + } + if (sub_key_ != k.sub_key_) { + return false; + } + if (parent_) { + for (int i : IndexRange(MAX_DUPLI_RECUR)) { + if (id_[i] != k.id_[i]) { + return false; + } + if (id_[i] == INT_MAX) { + break; + } + } + } + return true; } }; diff --git a/source/blender/draw/engines/eevee_next/eevee_view.cc b/source/blender/draw/engines/eevee_next/eevee_view.cc index c9701ae4051..c5c46b043ab 100644 --- a/source/blender/draw/engines/eevee_next/eevee_view.cc +++ b/source/blender/draw/engines/eevee_next/eevee_view.cc @@ -82,13 +82,14 @@ void ShadingView::render() DRW_stats_group_start(name_); - /* Needs to be before anything else because it query its own gbuffer. */ - inst_.planar_probes.set_view(render_view_, extent_); - - /* Query temp textures and create frame-buffers. */ + /* Needs to be before planar_probes because it needs correct crypto-matte & render-pass buffers + * to reuse the same deferred shaders. */ RenderBuffers &rbufs = inst_.render_buffers; rbufs.acquire(extent_); + /* Needs to be before anything else because it query its own gbuffer. */ + inst_.planar_probes.set_view(render_view_, extent_); + combined_fb_.ensure(GPU_ATTACHMENT_TEXTURE(rbufs.depth_tx), GPU_ATTACHMENT_TEXTURE(rbufs.combined_tx)); prepass_fb_.ensure(GPU_ATTACHMENT_TEXTURE(rbufs.depth_tx), @@ -116,15 +117,14 @@ void ShadingView::render() GPU_framebuffer_bind(combined_fb_); GPU_framebuffer_clear_color_depth(combined_fb_, clear_color, 1.0f); - inst_.hiz_buffer.set_source(&inst_.render_buffers.depth_tx); - inst_.hiz_buffer.set_dirty(); - - inst_.pipelines.background.render(render_view_); - /* TODO(fclem): Move it after the first prepass (and hiz update) once pipeline is stabilized. */ inst_.lights.set_view(render_view_, extent_); inst_.reflection_probes.set_view(render_view_); + inst_.pipelines.background.render(render_view_); + + inst_.hiz_buffer.set_source(&inst_.render_buffers.depth_tx); + inst_.volume.draw_prepass(render_view_); /* TODO(Miguel Pozo): Deferred and forward prepass should happen before the GBuffer pass. */ @@ -211,7 +211,7 @@ void ShadingView::update_view() jitter *= 2.0f; window_translate_m4(winmat.ptr(), winmat.ptr(), UNPACK2(jitter)); - jitter_view_.sync(winmat, winmat); + jitter_view_.sync(viewmat, winmat); /* FIXME(fclem): The offset may be noticeably large and the culling might make object pop * out of the blurring radius. To fix this, use custom enlarged culling matrix. */ diff --git a/source/blender/draw/engines/eevee_next/eevee_volume.cc b/source/blender/draw/engines/eevee_next/eevee_volume.cc index 84c33e58262..875fd9c4ba4 100644 --- a/source/blender/draw/engines/eevee_next/eevee_volume.cc +++ b/source/blender/draw/engines/eevee_next/eevee_volume.cc @@ -28,14 +28,14 @@ void VolumeModule::init() const Scene *scene_eval = inst_.scene; - const float2 viewport_size = float2(inst_.film.render_extent_get()); + const int2 extent = inst_.film.render_extent_get(); const int tile_size = scene_eval->eevee.volumetric_tile_size; data_.tile_size = tile_size; data_.tile_size_lod = int(log2(tile_size)); /* Find Froxel Texture resolution. */ - int3 tex_size = int3(math::ceil(math::max(float2(1.0f), viewport_size / float(tile_size))), 0); + int3 tex_size = int3(math::divide_ceil(extent, int2(tile_size)), 0); tex_size.z = std::max(1, scene_eval->eevee.volumetric_samples); /* Clamp 3D texture size based on device maximum. */ @@ -43,8 +43,8 @@ void VolumeModule::init() BLI_assert(tex_size == math::min(tex_size, max_size)); tex_size = math::min(tex_size, max_size); - data_.coord_scale = viewport_size / float2(tile_size * tex_size); - data_.viewport_size_inv = 1.0f / viewport_size; + data_.coord_scale = float2(extent) / float2(tile_size * tex_size); + data_.viewport_size_inv = 1.0f / float2(extent); /* TODO: compute snap to maxZBuffer for clustered rendering. */ if (data_.tex_size != tex_size) { diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_ambient_occlusion_pass_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_ambient_occlusion_pass_comp.glsl index c12b92f21e3..4006455db65 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_ambient_occlusion_pass_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_ambient_occlusion_pass_comp.glsl @@ -3,7 +3,6 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #pragma BLENDER_REQUIRE(gpu_shader_math_vector_lib.glsl) -#pragma BLENDER_REQUIRE(eevee_ambient_occlusion_lib.glsl) #pragma BLENDER_REQUIRE(eevee_horizon_scan_eval_lib.glsl) void main() @@ -45,7 +44,8 @@ void main() uniform_buf.ao.distance, uniform_buf.ao.thickness, uniform_buf.ao.angle_bias, - 10); + 10, + false); imageStore( out_ao_img, ivec3(texel, out_ao_img_layer_index), vec4(saturate(ctx.occlusion_result.r))); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_combine_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_combine_frag.glsl index f341cc4ac99..90f0732aaf8 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_combine_frag.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_combine_frag.glsl @@ -17,35 +17,42 @@ void main() GBufferData gbuf = gbuffer_read(gbuf_header_tx, gbuf_closure_tx, gbuf_color_tx, texel); - vec3 diffuse_light = vec3(0.0); - vec3 reflect_light = vec3(0.0); - vec3 refract_light = vec3(0.0); + vec3 glossy_reflect_light = vec3(0.0); + vec3 glossy_refract_light = vec3(0.0); + vec3 diffuse_reflect_light = vec3(0.0); + vec3 diffuse_refract_light = vec3(0.0); if (gbuf.has_diffuse) { - diffuse_light = imageLoad(direct_radiance_1_img, texel).rgb + - imageLoad(indirect_diffuse_img, texel).rgb; + diffuse_reflect_light = imageLoad(direct_radiance_1_img, texel).rgb + + imageLoad(indirect_diffuse_img, texel).rgb; } if (gbuf.has_reflection) { - reflect_light = imageLoad(direct_radiance_2_img, texel).rgb + - imageLoad(indirect_reflect_img, texel).rgb; + glossy_reflect_light = imageLoad(direct_radiance_2_img, texel).rgb + + imageLoad(indirect_reflect_img, texel).rgb; + } + + if (gbuf.has_translucent) { + /* Indirect radiance not implemented yet. */ + diffuse_refract_light = imageLoad(direct_radiance_3_img, texel).rgb; } if (gbuf.has_refraction) { - refract_light = - /* imageLoad(direct_radiance_3_img, texel).rgb + */ /* TODO: Not implemented. */ - imageLoad(indirect_refract_img, texel).rgb; + /* Direct radiance not implemented yet. */ + glossy_refract_light = imageLoad(indirect_refract_img, texel).rgb; } /* Light passes. */ - vec3 specular_light = reflect_light + refract_light; + vec3 diffuse_light = diffuse_reflect_light + diffuse_refract_light; + vec3 specular_light = glossy_reflect_light + glossy_refract_light; output_renderpass_color(uniform_buf.render_pass.diffuse_light_id, vec4(diffuse_light, 1.0)); output_renderpass_color(uniform_buf.render_pass.specular_light_id, vec4(specular_light, 1.0)); /* Combine. */ out_combined = vec4(0.0); - out_combined.xyz += diffuse_light * gbuf.diffuse.color; - out_combined.xyz += reflect_light * gbuf.reflection.color; - out_combined.xyz += refract_light * gbuf.refraction.color; + out_combined.xyz += diffuse_reflect_light * gbuf.diffuse.color; + out_combined.xyz += diffuse_refract_light * gbuf.translucent.color; + out_combined.xyz += glossy_reflect_light * gbuf.reflection.color; + out_combined.xyz += glossy_refract_light * gbuf.refraction.color; if (any(isnan(out_combined))) { out_combined = vec4(1.0, 0.0, 1.0, 0.0); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_light_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_light_frag.glsl index 383ac58e479..da91acfdb4d 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_light_frag.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_light_frag.glsl @@ -31,43 +31,42 @@ void main() vec3 V = drw_world_incident_vector(P); float vPz = dot(drw_view_forward(), P) - dot(drw_view_forward(), drw_view_position()); - ClosureLightStack stack; + ClosureLight cl_diff; + cl_diff.N = gbuf.diffuse.N; + cl_diff.ltc_mat = LTC_LAMBERT_MAT; + cl_diff.type = LIGHT_DIFFUSE; - /* TODO(fclem): This is waiting for fully flexible evaluation pipeline. We need to refactor the - * raytracing pipeline first. */ - if (gbuf.has_diffuse) { - ClosureLight cl_diff; - cl_diff.N = gbuf.diffuse.N; - cl_diff.ltc_mat = LTC_LAMBERT_MAT; - cl_diff.type = LIGHT_DIFFUSE; - stack.cl[0] = cl_diff; - } - else { - ClosureLight cl_refl; - cl_refl.N = gbuf.reflection.N; - cl_refl.ltc_mat = LTC_GGX_MAT(dot(gbuf.reflection.N, V), gbuf.reflection.roughness); - cl_refl.type = LIGHT_SPECULAR; - stack.cl[0] = cl_refl; - } - -#if LIGHT_CLOSURE_EVAL_COUNT > 1 ClosureLight cl_refl; cl_refl.N = gbuf.reflection.N; cl_refl.ltc_mat = LTC_GGX_MAT(dot(gbuf.reflection.N, V), gbuf.reflection.roughness); cl_refl.type = LIGHT_SPECULAR; - stack.cl[1] = cl_refl; -#endif -#if LIGHT_CLOSURE_EVAL_COUNT > 2 ClosureLight cl_sss; cl_sss.N = -gbuf.diffuse.N; cl_sss.ltc_mat = LTC_LAMBERT_MAT; cl_sss.type = LIGHT_DIFFUSE; - stack.cl[2] = cl_sss; + + ClosureLight cl_translucent; + cl_translucent.N = -gbuf.translucent.N; + cl_translucent.ltc_mat = LTC_LAMBERT_MAT; + cl_translucent.type = LIGHT_DIFFUSE; + + ClosureLightStack stack; + + /* TODO(fclem): This is waiting for fully flexible evaluation pipeline. We need to refactor the + * raytracing pipeline first. */ + stack.cl[0] = (gbuf.has_diffuse) ? cl_diff : cl_refl; + +#if LIGHT_CLOSURE_EVAL_COUNT > 1 + stack.cl[1] = cl_refl; #endif - float thickness = 0.0; -#ifdef SSS_TRANSMITTANCE +#if LIGHT_CLOSURE_EVAL_COUNT > 2 + stack.cl[2] = (gbuf.has_translucent) ? cl_translucent : cl_sss; +#endif + + float thickness = (gbuf.has_translucent) ? gbuf.thickness : 0.0; +#ifdef MAT_SUBSURFACE if (gbuf.has_sss) { float shadow_thickness = thickness_from_shadow(P, Ng, vPz); thickness = (shadow_thickness != THICKNESS_NO_VALUE) ? max(shadow_thickness, gbuf.thickness) : @@ -88,7 +87,7 @@ void main() radiance_unshadowed += stack.cl[2].light_unshadowed; #endif -#ifdef SSS_TRANSMITTANCE +#ifdef MAT_SUBSURFACE if (gbuf.has_sss) { vec3 sss_profile = subsurface_transmission(gbuf.diffuse.sss_radius, thickness); stack.cl[2].light_shadowed *= sss_profile; @@ -121,10 +120,8 @@ void main() #endif #if LIGHT_CLOSURE_EVAL_COUNT > 2 -# if 0 /* Will work when we have fully flexible evaluation. */ - if (gbuf.closure_count > 2) { + if (gbuf.closure_count > 2 || gbuf.has_translucent) { imageStore(direct_radiance_3_img, texel, vec4(stack.cl[2].light_shadowed, 1.0)); } -# endif #endif } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_tile_classify_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_tile_classify_frag.glsl index 8a409fe1bb2..da171d377ba 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_tile_classify_frag.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_deferred_tile_classify_frag.glsl @@ -27,7 +27,11 @@ void main() if (gbuffer_has_closure(in_gbuffer_header, eClosureBits(CLOSURE_REFRACTION))) { imageStore(tile_mask_img, ivec3(tile_co, 2), uvec4(1u)); } - if (gbuffer_has_closure(in_gbuffer_header, eClosureBits(CLOSURE_SSS))) { + if (gbuffer_has_closure(in_gbuffer_header, eClosureBits(CLOSURE_TRANSLUCENT))) { + imageStore(tile_mask_img, ivec3(tile_co, 3), uvec4(1u)); + } + /* TODO(fclem): For now, override SSS if we have translucency. */ + else if (gbuffer_has_closure(in_gbuffer_header, eClosureBits(CLOSURE_SSS))) { imageStore(tile_mask_img, ivec3(tile_co, 3), uvec4(1u)); } } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_forward_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_forward_lib.glsl new file mode 100644 index 00000000000..e64acd62e55 --- /dev/null +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_forward_lib.glsl @@ -0,0 +1,121 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** + * Forward lighting evaluation: Lighting is evaluated during the geometry rasterization. + * + * This is used by alpha blended materials and materials using Shader to RGB nodes. + */ + +#pragma BLENDER_REQUIRE(eevee_subsurface_lib.glsl) +#pragma BLENDER_REQUIRE(eevee_light_eval_lib.glsl) +#pragma BLENDER_REQUIRE(eevee_lightprobe_eval_lib.glsl) + +void forward_lighting_eval(float thickness, out vec3 radiance, out vec3 transmittance) +{ + float vPz = dot(drw_view_forward(), g_data.P) - dot(drw_view_forward(), drw_view_position()); + vec3 V = drw_world_incident_vector(g_data.P); + + ClosureLightStack stack; + + ClosureLight cl_diffuse; + cl_diffuse.N = g_diffuse_data.N; + cl_diffuse.ltc_mat = LTC_LAMBERT_MAT; + cl_diffuse.type = LIGHT_DIFFUSE; + + ClosureLight cl_subsurface; + cl_subsurface.N = -g_diffuse_data.N; + cl_subsurface.ltc_mat = LTC_LAMBERT_MAT; + cl_subsurface.type = LIGHT_DIFFUSE; + + ClosureLight cl_translucent; + cl_translucent.N = -g_translucent_data.N; + cl_translucent.ltc_mat = LTC_LAMBERT_MAT; + cl_translucent.type = LIGHT_DIFFUSE; + + ClosureLight cl_reflection; + cl_reflection.N = g_reflection_data.N; + cl_reflection.ltc_mat = LTC_GGX_MAT(dot(g_reflection_data.N, V), g_reflection_data.roughness); + cl_reflection.type = LIGHT_SPECULAR; + + int cl_layer = 0; + +#ifdef MAT_DIFFUSE + const int cl_diffuse_id = cl_layer++; + stack.cl[cl_diffuse_id] = cl_diffuse; +#endif + +#ifdef MAT_SUBSURFACE + const int cl_subsurface_id = cl_layer++; + stack.cl[cl_subsurface_id] = cl_subsurface; +#endif + +#ifdef MAT_TRANSLUCENT + const int cl_translucent_id = cl_layer++; + stack.cl[cl_translucent_id] = cl_translucent; +#endif + +#ifdef MAT_REFLECTION + const int cl_reflection_id = cl_layer++; + stack.cl[cl_reflection_id] = cl_reflection; +#endif + +#ifndef SKIP_LIGHT_EVAL + light_eval(stack, g_data.P, g_data.Ng, V, vPz, thickness); +#endif + +#ifdef MAT_SUBSURFACE + vec3 sss_profile = subsurface_transmission(g_diffuse_data.sss_radius, thickness); + stack.cl[cl_subsurface_id].light_shadowed *= sss_profile; + stack.cl[cl_subsurface_id].light_unshadowed *= sss_profile; + /* Fuse back the SSS transmittance with the diffuse lighting. */ + stack.cl[cl_diffuse_id].light_shadowed += stack.cl[cl_subsurface_id].light_shadowed; + stack.cl[cl_diffuse_id].light_unshadowed += stack.cl[cl_subsurface_id].light_unshadowed; +#endif + + vec3 diffuse_light = vec3(0.0); + vec3 translucent_light = vec3(0.0); + vec3 reflection_light = vec3(0.0); + vec3 refraction_light = vec3(0.0); + + vec2 noise_probe = interlieved_gradient_noise(gl_FragCoord.xy, vec2(0, 1), vec2(0.0)); + LightProbeSample samp = lightprobe_load(g_data.P, g_data.Ng, V); + +#ifdef MAT_DIFFUSE + diffuse_light = stack.cl[cl_diffuse_id].light_shadowed; + diffuse_light += lightprobe_eval(samp, g_diffuse_data, g_data.P, V, noise_probe); +#endif +#ifdef MAT_TRANSLUCENT + translucent_light = stack.cl[cl_translucent_id].light_shadowed; + translucent_light += lightprobe_eval(samp, g_translucent_data, g_data.P, V, noise_probe); +#endif +#ifdef MAT_REFLECTION + reflection_light = stack.cl[cl_reflection_id].light_shadowed; + reflection_light += lightprobe_eval(samp, g_reflection_data, g_data.P, V, noise_probe); +#endif +#ifdef MAT_REFRACTION + /* TODO(fclem): Refraction from lightprobe. */ + // refraction_light += lightprobe_eval(samp, g_refraction_data, g_data.P, V, noise_probe); +#endif + + /* Apply weight. */ + g_diffuse_data.color *= g_diffuse_data.weight; + g_translucent_data.color *= g_translucent_data.weight; + g_reflection_data.color *= g_reflection_data.weight; + g_refraction_data.color *= g_refraction_data.weight; + /* Mask invalid lighting from undefined closure. */ + diffuse_light = (g_diffuse_data.weight > 1e-5) ? diffuse_light : vec3(0.0); + translucent_light = (g_translucent_data.weight > 1e-5) ? translucent_light : vec3(0.0); + reflection_light = (g_reflection_data.weight > 1e-5) ? reflection_light : vec3(0.0); + refraction_light = (g_refraction_data.weight > 1e-5) ? refraction_light : vec3(0.0); + + /* Combine all radiance. */ + radiance = g_emission; + radiance += g_diffuse_data.color * diffuse_light; + radiance += g_reflection_data.color * reflection_light; + radiance += g_refraction_data.color * refraction_light; + radiance += g_translucent_data.color * translucent_light; + + transmittance = g_transmittance; +} diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_gbuffer_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_gbuffer_lib.glsl index dd2f769637f..ad826a62088 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_gbuffer_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_gbuffer_lib.glsl @@ -163,6 +163,13 @@ bool gbuffer_has_closure(uint header, eClosureBits closure) return has_diffuse; } + bool has_translucent = (gbuffer_header_unpack(header, layer) == GBUF_TRANSLUCENT); + layer += int(has_translucent); + + if (closure == eClosureBits(CLOSURE_TRANSLUCENT)) { + return has_translucent; + } + bool has_sss = (gbuffer_header_unpack(header, layer) == GBUF_SSS); layer += int(has_sss); @@ -181,6 +188,7 @@ struct GBufferDataPacked { }; GBufferDataPacked gbuffer_pack(ClosureDiffuse diffuse, + ClosureTranslucent translucent, ClosureReflection reflection, ClosureRefraction refraction, vec3 default_N, @@ -192,6 +200,7 @@ GBufferDataPacked gbuffer_pack(ClosureDiffuse diffuse, bool has_refraction = refraction.weight > 1e-5; bool has_reflection = reflection.weight > 1e-5; bool has_diffuse = diffuse.weight > 1e-5; + bool has_translucent = translucent.weight > 1e-5; bool has_sss = diffuse.sss_id > 0; int layer = 0; @@ -241,7 +250,16 @@ GBufferDataPacked gbuffer_pack(ClosureDiffuse diffuse, layer += 1; } - if (has_sss) { + if (has_translucent) { + gbuf.color[layer] = gbuffer_color_pack(translucent.color); + gbuf.closure[layer].xy = gbuffer_normal_pack(translucent.N); + gbuf.closure[layer].z = 0.0; /* Unused. */ + gbuf.closure[layer].w = gbuffer_thickness_pack(thickness); + gbuf.header |= gbuffer_header_pack(GBUF_TRANSLUCENT, layer); + layer += 1; + } + /* TODO(fclem): For now, override SSS if we have translucency. */ + else if (has_sss) { gbuf.closure[layer].xyz = gbuffer_sss_radii_pack(diffuse.sss_radius); gbuf.closure[layer].w = gbuffer_object_id_unorm16_pack(diffuse.sss_id); gbuf.header |= gbuffer_header_pack(GBUF_SSS, layer); @@ -264,12 +282,14 @@ GBufferDataPacked gbuffer_pack(ClosureDiffuse diffuse, struct GBufferData { /* Only valid (or null) if `has_diffuse`, `has_reflection` or `has_refraction` is true. */ ClosureDiffuse diffuse; + ClosureTranslucent translucent; ClosureReflection reflection; ClosureRefraction refraction; /* First world normal stored in the gbuffer. Only valid if `has_any_surface` is true. */ vec3 surface_N; float thickness; bool has_diffuse; + bool has_translucent; bool has_reflection; bool has_refraction; bool has_sss; @@ -394,6 +414,24 @@ GBufferData gbuffer_read(usampler2D header_tx, gbuf.thickness = 0.0; } + gbuf.has_translucent = (gbuffer_header_unpack(gbuf.header, layer) == GBUF_TRANSLUCENT); + + if (gbuf.has_translucent) { + vec4 closure_packed = texelFetch(closure_tx, ivec3(texel, layer), 0); + vec4 color_packed = texelFetch(color_tx, ivec3(texel, layer), 0); + + gbuf.translucent.color = gbuffer_color_unpack(color_packed); + gbuf.translucent.N = gbuffer_normal_unpack(closure_packed.xy); + gbuf.thickness = gbuffer_thickness_unpack(closure_packed.w); + gbuf.closure_count += 1u; + layer += 1; + } + else { + /* Default values. */ + gbuf.translucent.color = vec3(0.0); + gbuf.translucent.N = vec3(0.0, 0.0, 1.0); + } + gbuf.has_sss = (gbuffer_header_unpack(gbuf.header, layer) == GBUF_SSS); if (gbuf.has_sss) { diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_hiz_update_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_hiz_update_comp.glsl index 5f190654376..dc6ae961cae 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_hiz_update_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_hiz_update_comp.glsl @@ -44,10 +44,11 @@ void main() /* Copy level 0. */ ivec2 src_px = ivec2(kernel_origin + local_px) * 2; - vec2 samp_co = (vec2(src_px) + 0.5) / vec2(textureSize(depth_tx, 0)); #ifdef HIZ_LAYER + vec2 samp_co = (vec2(src_px) + 0.5) / vec2(textureSize(depth_layered_tx, 0).xy); vec4 samp = textureGather(depth_layered_tx, vec3(samp_co, float(layer_id))); #else + vec2 samp_co = (vec2(src_px) + 0.5) / vec2(textureSize(depth_tx, 0)); vec4 samp = textureGather(depth_tx, samp_co); #endif diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_horizon_denoise_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_horizon_denoise_comp.glsl index 79dc30e81d5..d5bddbdd218 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_horizon_denoise_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_horizon_denoise_comp.glsl @@ -55,20 +55,7 @@ vec3 from_accumulation_space(vec3 color) vec3 load_normal(ivec2 texel) { - GBufferData gbuf = gbuffer_read(gbuf_header_tx, gbuf_closure_tx, gbuf_color_tx, texel); - - /* TODO(fclem): Load preprocessed Normal. */ - vec3 N = vec3(0.0); - if (gbuf.has_diffuse) { - N = gbuf.diffuse.N; - } - else if (gbuf.has_reflection) { - N = gbuf.reflection.N; - } - else if (gbuf.has_refraction) { - N = gbuf.refraction.N; - } - return N; + return gbuffer_read(gbuf_header_tx, gbuf_closure_tx, gbuf_color_tx, texel).surface_N; } void main() @@ -135,11 +122,10 @@ void main() ivec2 sample_texel = texel + ivec2(x, y); ivec2 sample_texel_fullres = sample_texel * uniform_buf.raytrace.resolution_scale + uniform_buf.raytrace.resolution_bias; - ivec2 sample_tile = sample_texel_fullres / RAYTRACE_GROUP_SIZE; + int closure_index = uniform_buf.raytrace.closure_index; + ivec3 sample_tile = ivec3(sample_texel_fullres / RAYTRACE_GROUP_SIZE, closure_index); /* Make sure the sample has been processed and do not contain garbage data. */ - uint tile_mask = imageLoad(tile_mask_img, sample_tile).r; - bool unprocessed_tile = !flag_test(tile_mask, 1u << 1u); - if (unprocessed_tile) { + if (imageLoad(tile_mask_img, sample_tile).r == 0u) { continue; } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_horizon_scan_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_horizon_scan_comp.glsl index b259f878971..1f62e4a4230 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_horizon_scan_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_horizon_scan_comp.glsl @@ -76,7 +76,8 @@ void main() 1.0e16, uniform_buf.ao.thickness, uniform_buf.ao.angle_bias, - 8); + 8, + false); float occlusion = 0.0; vec4 radiance = vec4(1.0, 0.0, 1.0, 1.0); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_horizon_scan_eval_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_horizon_scan_eval_lib.glsl index ba06186b7d4..09534b2e6fd 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_horizon_scan_eval_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_horizon_scan_eval_lib.glsl @@ -31,6 +31,10 @@ #ifdef RAYTRACE_REFRACT # define HORIZON_REFRACT #endif +#if defined(MAT_DEFERRED) || defined(MAT_FORWARD) +/* Enable AO node computation for material shaders. */ +# define HORIZON_OCCLUSION +#endif vec3 horizon_scan_sample_radiance(vec2 uv) { @@ -171,22 +175,22 @@ void horizon_scan_context_sample_finish( * The paper suggests a smooth test which is not physically correct since we * already consider the sample reflected radiance. * Set the weight to allow energy conservation. If we modulate the radiance, we loose energy. */ - float weight = step(dot(sample_normal, -L), 0.0); + float weight = step(dot(sample_normal, L), 0.0); #ifdef HORIZON_OCCLUSION horizon_scan_context_sample_finish(ctx.occlusion_common, sample_radiance, 1.0, theta, bias); #endif #ifdef HORIZON_DIFFUSE - weight = bxdf_eval(ctx.diffuse, L, V); + weight *= bxdf_eval(ctx.diffuse, L, V); horizon_scan_context_sample_finish(ctx.diffuse_common, sample_radiance, weight, theta, bias); #endif #ifdef HORIZON_REFLECT - weight = bxdf_eval(ctx.reflection, L, V); + weight *= bxdf_eval(ctx.reflection, L, V); horizon_scan_context_sample_finish(ctx.reflection_common, sample_radiance, weight, theta, bias); #endif #ifdef HORIZON_REFRACT /* TODO(fclem): Broken: Black. */ - weight = bxdf_eval(ctx.refraction, L, V); + weight *= bxdf_eval(ctx.refraction, L, V); horizon_scan_context_sample_finish(ctx.refraction_common, sample_radiance, weight, theta, bias); #endif } @@ -275,6 +279,7 @@ void horizon_scan_occluder_intersection_ray_sphere_clip(Ray ray, /** * Scans the horizon in many directions and returns the indirect lighting radiance. * Returned lighting is stored inside the context in `_accum` members already normalized. + * If `reversed` is set to true, the input normal must be negated. */ void horizon_scan_eval(vec3 vP, inout HorizonScanContext context, @@ -283,7 +288,8 @@ void horizon_scan_eval(vec3 vP, float search_distance, float global_thickness, float angle_bias, - const int sample_count) + const int sample_count, + const bool reversed) { vec3 vV = drw_view_incident_vector(vP); @@ -318,33 +324,44 @@ void horizon_scan_eval(vec3 vP, /* Always cross at least one pixel. */ float time = 1.0 + square((float(j) + noise.y) / float(sample_count)) * ssray.max_time; + if (reversed) { + /* We need to cross at least 2 pixels to avoid artifacts form the HiZ storing only the + * max depth. The HiZ would need to contain the min depth instead to avoid this. */ + time += 1.0; + } + float lod = 1.0 + (float(j >> 2) / (1.0 + uniform_buf.ao.quality)); vec2 sample_uv = ssray.origin.xy + ssray.direction.xy * time; float sample_depth = textureLod(hiz_tx, sample_uv * uniform_buf.hiz.uv_scale, lod).r; - if (sample_depth == 1.0) { + if (sample_depth == 1.0 && !reversed) { /* Skip background. Avoids making shadow on the geometry near the far plane. */ continue; } - /* TODO(fclem): Re-introduce bias. But this is difficult to do per closure. */ - bool front_facing = true; // vN.z > 0.0; - /* Bias depth a bit to avoid self shadowing issues. */ const float bias = 2.0 * 2.4e-7; - sample_depth += front_facing ? bias : -bias; + sample_depth += reversed ? -bias : bias; vec3 vP_sample = drw_point_screen_to_view(vec3(sample_uv, sample_depth)); + vec3 vV_sample = drw_view_incident_vector(vP_sample); Ray ray; ray.origin = vP_sample; - ray.direction = -vV; + ray.direction = -vV_sample; ray.max_time = global_thickness; + if (reversed) { + /* Make the ray start above the surface and end exactly at the surface. */ + ray.max_time = 2.0 * distance(vP, vP_sample); + ray.origin = vP_sample + vV_sample * ray.max_time; + ray.direction = -vV_sample; + } + Sphere sphere = shape_sphere(vP, search_distance); - vec3 vP_front, vP_back; + vec3 vP_front = ray.origin, vP_back = ray.origin + ray.direction * ray.max_time; horizon_scan_occluder_intersection_ray_sphere_clip(ray, sphere, vP_front, vP_back); vec3 vL_front = normalize(vP_front - vP); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_light_eval_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_light_eval_lib.glsl index 8a0f6f1b302..c2b22cbfeaa 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_light_eval_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_light_eval_lib.glsl @@ -25,6 +25,7 @@ #if !defined(LIGHT_CLOSURE_EVAL_COUNT) # define LIGHT_CLOSURE_EVAL_COUNT 1 +# define SKIP_LIGHT_EVAL #endif uint shadow_pack(float visibility, uint bit_depth, uint shift) @@ -192,7 +193,7 @@ void light_eval(inout ClosureLightStack stack, vec3 P, vec3 Ng, vec3 V, float vP light_eval(stack, P, Ng, V, vPz, thickness, 0u); } -# if !defined(SSS_TRANSMITTANCE) && defined(LIGHT_ITER_FORCE_NO_CULLING) +# if !defined(SHADOW_SUBSURFACE) && defined(LIGHT_ITER_FORCE_NO_CULLING) void light_eval(inout ClosureLightStack stack, vec3 P, vec3 Ng, vec3 V) { light_eval(stack, P, Ng, V, 0.0, 0.0, 0u); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_light_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_light_lib.glsl index 094b2db2d0c..2339deae622 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_light_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_light_lib.glsl @@ -233,35 +233,4 @@ float light_ltc( } } -#ifdef SSS_TRANSMITTANCE -float sample_transmittance_profile(float u) -{ - return utility_tx_sample(utility_tx, vec2(u, 0.0), UTIL_SSS_TRANSMITTANCE_PROFILE_LAYER).r; -} - -vec3 light_translucent(const bool is_directional, - LightData light, - vec3 N, - LightVector lv, - vec3 sss_radius, - float delta) -{ - /* TODO(fclem): We should compute the power at the entry point. */ - /* NOTE(fclem): we compute the light attenuation using the light vector but the transmittance - * using the shadow depth delta. */ - float power = light_point_light(light, is_directional, lv); - /* Do not add more energy on front faces. Also apply lambertian BSDF. */ - power *= max(0.0, dot(-N, lv.L)) * M_1_PI; - - sss_radius *= SSS_TRANSMIT_LUT_RADIUS; - vec3 channels_co = saturate(delta / sss_radius) * SSS_TRANSMIT_LUT_SCALE + SSS_TRANSMIT_LUT_BIAS; - - vec3 translucency; - translucency.x = (sss_radius.x > 0.0) ? sample_transmittance_profile(channels_co.x) : 0.0; - translucency.y = (sss_radius.y > 0.0) ? sample_transmittance_profile(channels_co.y) : 0.0; - translucency.z = (sss_radius.z > 0.0) ? sample_transmittance_profile(channels_co.z) : 0.0; - return translucency * power; -} -#endif - /** \} */ diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_eval_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_eval_lib.glsl index 2b84f468336..5970ae6d707 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_eval_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_lightprobe_eval_lib.glsl @@ -282,9 +282,15 @@ float lightprobe_roughness_to_lod(float roughness) return sqrt(roughness) * 11.0; } -vec3 lightprobe_eval(LightProbeSample samp, ClosureDiffuse diffuse, vec3 P, vec3 V, vec2 noise) +vec3 lightprobe_eval(LightProbeSample samp, ClosureDiffuse cl, vec3 P, vec3 V, vec2 noise) { - vec3 radiance_sh = spherical_harmonics_evaluate_lambert(diffuse.N, samp.volume_irradiance); + vec3 radiance_sh = spherical_harmonics_evaluate_lambert(cl.N, samp.volume_irradiance); + return radiance_sh; +} + +vec3 lightprobe_eval(LightProbeSample samp, ClosureTranslucent cl, vec3 P, vec3 V, vec2 noise) +{ + vec3 radiance_sh = spherical_harmonics_evaluate_lambert(-cl.N, samp.volume_irradiance); return radiance_sh; } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_ltc_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_ltc_lib.glsl index d25de14f27c..15d95b101ff 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_ltc_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_ltc_lib.glsl @@ -11,6 +11,7 @@ */ #pragma BLENDER_REQUIRE(gpu_shader_utildefines_lib.glsl) +#pragma BLENDER_REQUIRE(gpu_shader_math_matrix_lib.glsl) #define LTC_LAMBERT_MAT vec4(1.0, 0.0, 0.0, 1.0) #define LTC_GGX_MAT(cos_theta, roughness) \ @@ -147,18 +148,26 @@ mat3 ltc_matrix(vec4 lut) return mat3(vec3(lut.x, 0, lut.y), vec3(0, 1, 0), vec3(lut.z, 0, lut.w)); } +mat3x3 ltc_tangent_basis(vec3 N, vec3 V) +{ + float NV = dot(N, V); + if (NV > 0.9999) { + /* Mostly for orthographic view and surfel light eval. */ + return from_up_axis(N); + } + /* Construct orthonormal basis around N. */ + vec3 T1 = normalize(V - N * NV); + vec3 T2 = cross(N, T1); + return mat3x3(T1, T2, N); +} + void ltc_transform_quad(vec3 N, vec3 V, mat3 Minv, inout vec3 corners[4]) { - /* Avoid dot(N, V) == 1 in ortho mode, leading T1 normalize to fail. */ - V = normalize(V + 1e-8); - /* Construct orthonormal basis around N. */ - vec3 T1, T2; - T1 = normalize(V - N * dot(N, V)); - T2 = cross(N, T1); + mat3 T = ltc_tangent_basis(N, V); /* Rotate area light in (T1, T2, R) basis. */ - Minv = Minv * transpose(mat3(T1, T2, N)); + Minv = Minv * transpose(T); /* Apply LTC inverse matrix. */ corners[0] = normalize(Minv * corners[0]); @@ -195,16 +204,11 @@ float ltc_evaluate_disk_simple(sampler2DArray utility_tx, float disk_radius, flo /* disk_points are WS vectors from the shading point to the disk "bounding domain" */ float ltc_evaluate_disk(sampler2DArray utility_tx, vec3 N, vec3 V, mat3 Minv, vec3 disk_points[3]) { - /* Avoid dot(N, V) == 1 in ortho mode, leading T1 normalize to fail. */ - V = normalize(V + 1e-8); + /* Construct orthonormal basis around N. */ + mat3 T = ltc_tangent_basis(N, V); - /* construct orthonormal basis around N */ - vec3 T1, T2; - T1 = normalize(V - N * dot(V, N)); - T2 = cross(N, T1); - - /* rotate area light in (T1, T2, R) basis */ - mat3 R = transpose(mat3(T1, T2, N)); + /* Rotate area light in (T1, T2, R) basis. */ + mat3 R = transpose(T); /* Intermediate step: init ellipse. */ vec3 L_[3]; diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_nodetree_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_nodetree_lib.glsl index 251817ad773..9fe1ce85178 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_nodetree_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_nodetree_lib.glsl @@ -18,12 +18,14 @@ float g_holdout; /* Sampled closure parameters. */ ClosureDiffuse g_diffuse_data; +ClosureTranslucent g_translucent_data; ClosureReflection g_reflection_data; ClosureRefraction g_refraction_data; ClosureVolumeScatter g_volume_scatter_data; ClosureVolumeAbsorption g_volume_absorption_data; /* Random number per sampled closure type. */ float g_diffuse_rand; +float g_translucent_rand; float g_reflection_rand; float g_refraction_rand; float g_volume_scatter_rand; @@ -63,6 +65,10 @@ void closure_weights_reset() g_diffuse_data.sss_radius = vec3(0.0); g_diffuse_data.sss_id = uint(0); + g_translucent_data.weight = 0.0; + g_translucent_data.color = vec3(0.0); + g_translucent_data.N = vec3(0.0); + g_reflection_data.weight = 0.0; g_reflection_data.color = vec3(0.0); g_reflection_data.N = vec3(0.0); @@ -82,10 +88,11 @@ void closure_weights_reset() g_volume_absorption_data.absorption = vec3(0.0); #if defined(GPU_FRAGMENT_SHADER) - g_diffuse_rand = g_reflection_rand = g_refraction_rand = g_closure_rand; + g_diffuse_rand = g_translucent_rand = g_reflection_rand = g_refraction_rand = g_closure_rand; g_volume_scatter_rand = g_volume_absorption_rand = g_closure_rand; #else g_diffuse_rand = 0.0; + g_translucent_rand = 0.0; g_reflection_rand = 0.0; g_refraction_rand = 0.0; g_volume_scatter_rand = 0.0; @@ -106,7 +113,7 @@ Closure closure_eval(ClosureDiffuse diffuse) Closure closure_eval(ClosureTranslucent translucent) { - /* TODO */ + SELECT_CLOSURE(g_translucent_data, g_translucent_rand, translucent); return Closure(0); } @@ -232,19 +239,50 @@ float ambient_occlusion_eval(vec3 normal, // clang-format off #if defined(GPU_FRAGMENT_SHADER) && defined(MAT_AMBIENT_OCCLUSION) && !defined(MAT_DEPTH) && !defined(MAT_SHADOW) // clang-format on +# if 0 /* TODO(fclem): Finish inverted horizon scan. */ + /* TODO(fclem): Replace eevee_ambient_occlusion_lib by eevee_horizon_scan_eval_lib when this is + * finished. */ + vec3 vP = drw_point_world_to_view(g_data.P); + vec3 vN = drw_normal_world_to_view(normal); + + ivec2 texel = ivec2(gl_FragCoord.xy); + vec2 noise; + noise.x = interlieved_gradient_noise(vec2(texel), 3.0, 0.0); + noise.y = utility_tx_fetch(utility_tx, vec2(texel), UTIL_BLUE_NOISE_LAYER).r; + noise = fract(noise + sampling_rng_2D_get(SAMPLING_AO_U)); + + ClosureOcclusion occlusion; + occlusion.N = (inverted != 0.0) ? -vN : vN; + + HorizonScanContext ctx; + ctx.occlusion = occlusion; + + horizon_scan_eval(vP, + ctx, + noise, + uniform_buf.ao.pixel_size, + max_distance, + uniform_buf.ao.thickness, + uniform_buf.ao.angle_bias, + 10, + inverted != 0.0); + + return saturate(ctx.occlusion_result.r); +# else vec3 vP = drw_point_world_to_view(g_data.P); ivec2 texel = ivec2(gl_FragCoord.xy); OcclusionData data = ambient_occlusion_search( vP, hiz_tx, texel, max_distance, inverted, sample_count); vec3 V = drw_world_incident_vector(g_data.P); - vec3 N = g_data.N; + vec3 N = normal; vec3 Ng = g_data.Ng; float unused_error, visibility; vec3 unused; ambient_occlusion_eval(data, texel, V, N, Ng, inverted, visibility, unused_error, unused); return visibility; +# endif #else return 1.0; #endif diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_denoise_bilateral_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_denoise_bilateral_comp.glsl index 84aa38e3ba2..09e45f085d4 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_denoise_bilateral_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_denoise_bilateral_comp.glsl @@ -154,12 +154,11 @@ void main() vec2 offset_f = (fract(hammersley_2d(i, sample_count) + noise) - 0.5) * filter_size; ivec2 offset = ivec2(floor(offset_f + 0.5)); + int closure_index = uniform_buf.raytrace.closure_index; ivec2 sample_texel = texel_fullres + offset; - ivec2 sample_tile = sample_texel / RAYTRACE_GROUP_SIZE; + ivec3 sample_tile = ivec3(sample_texel / RAYTRACE_GROUP_SIZE, closure_index); /* Make sure the sample has been processed and do not contain garbage data. */ - uint tile_mask = imageLoad(tile_mask_img, sample_tile).r; - bool unprocessed_tile = !flag_test(tile_mask, 1u << 0u); - if (unprocessed_tile) { + if (imageLoad(tile_mask_img, sample_tile).r == 0u) { continue; } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_denoise_spatial_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_denoise_spatial_comp.glsl index 10af05701d9..746fb09225b 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_denoise_spatial_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_denoise_spatial_comp.glsl @@ -63,7 +63,10 @@ void main() continue; } - uint tile_mask = imageLoad(tile_mask_img, tile_coord_neighbor).r; + int closure_index = uniform_buf.raytrace.closure_index; + ivec3 sample_tile = ivec3(tile_coord_neighbor, closure_index); + + uint tile_mask = imageLoad(tile_mask_img, sample_tile).r; bool tile_is_unused = !flag_test(tile_mask, 1u << 0u); if (tile_is_unused) { ivec2 texel_fullres_neighbor = texel_fullres + ivec2(x, y) * int(tile_size); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_denoise_temporal_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_denoise_temporal_comp.glsl index 35c86b047ab..87c7f84f3ab 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_denoise_temporal_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_denoise_temporal_comp.glsl @@ -93,7 +93,8 @@ vec4 radiance_history_fetch(ivec2 texel, float bilinear_weight) if (!in_texture_range(texel, radiance_history_tx)) { return vec4(0.0); } - ivec2 history_tile = texel / RAYTRACE_GROUP_SIZE; + int closure_index = uniform_buf.raytrace.closure_index; + ivec3 history_tile = ivec3(texel / RAYTRACE_GROUP_SIZE, closure_index); /* Fetch previous tilemask to avoid loading invalid data. */ bool is_valid_history = texelFetch(tilemask_history_tx, history_tile, 0).r != 0; /* Exclude unprocessed pixels. */ @@ -147,8 +148,9 @@ vec2 variance_history_sample(vec3 P) float history_variance = texture(variance_history_tx, uv).r; + int closure_index = uniform_buf.raytrace.closure_index; ivec2 history_texel = ivec2(floor(uv * vec2(textureSize(variance_history_tx, 0).xy))); - ivec2 history_tile = history_texel / RAYTRACE_GROUP_SIZE; + ivec3 history_tile = ivec3(history_texel / RAYTRACE_GROUP_SIZE, closure_index); /* Fetch previous tilemask to avoid loading invalid data. */ bool is_valid_history = texelFetch(tilemask_history_tx, history_tile, 0).r != 0; diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_tile_classify_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_tile_classify_comp.glsl index e6fa67c12e0..5acce2b4672 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_tile_classify_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_tile_classify_comp.glsl @@ -12,8 +12,8 @@ #pragma BLENDER_REQUIRE(gpu_shader_codegen_lib.glsl) #pragma BLENDER_REQUIRE(eevee_gbuffer_lib.glsl) -shared uint tile_contains_ray_tracing; -shared uint tile_contains_horizon_scan; +shared uint tile_contains_ray_tracing[3]; +shared uint tile_contains_horizon_scan[3]; /* Returns a blend factor between different tracing method. */ float ray_roughness_factor(RayTraceData raytrace, float roughness) @@ -24,25 +24,11 @@ float ray_roughness_factor(RayTraceData raytrace, float roughness) void main() { if (all(equal(gl_LocalInvocationID, uvec3(0)))) { - /* Clear num_groups_x to 0 so that we can use it as counter in the compaction phase. - * Note that these writes are subject to race condition, but we write the same value - * from all work-groups. */ - ray_denoise_dispatch_buf.num_groups_x = 0u; - ray_denoise_dispatch_buf.num_groups_y = 1u; - ray_denoise_dispatch_buf.num_groups_z = 1u; - ray_dispatch_buf.num_groups_x = 0u; - ray_dispatch_buf.num_groups_y = 1u; - ray_dispatch_buf.num_groups_z = 1u; - horizon_dispatch_buf.num_groups_x = 0u; - horizon_dispatch_buf.num_groups_y = 1u; - horizon_dispatch_buf.num_groups_z = 1u; - horizon_denoise_dispatch_buf.num_groups_x = 0u; - horizon_denoise_dispatch_buf.num_groups_y = 1u; - horizon_denoise_dispatch_buf.num_groups_z = 1u; - /* Init shared variables. */ - tile_contains_ray_tracing = 0; - tile_contains_horizon_scan = 0; + for (int i = 0; i < 3; i++) { + tile_contains_ray_tracing[i] = 0; + tile_contains_horizon_scan[i] = 0; + } } barrier(); @@ -50,43 +36,56 @@ void main() ivec2 texel = ivec2(gl_GlobalInvocationID.xy); bool valid_texel = in_texture_range(texel, gbuf_header_tx); - uint header = (!valid_texel) ? 0u : texelFetch(gbuf_header_tx, texel, 0).r; - if (gbuffer_has_closure(header, uniform_buf.raytrace.closure_active)) { + if (valid_texel) { GBufferData gbuf = gbuffer_read(gbuf_header_tx, gbuf_closure_tx, gbuf_color_tx, texel); - float roughness = 1.0; - if (uniform_buf.raytrace.closure_active == eClosureBits(CLOSURE_REFLECTION)) { - roughness = gbuf.reflection.roughness; - } - else if (uniform_buf.raytrace.closure_active == eClosureBits(CLOSURE_REFRACTION)) { - roughness = 0.0; /* TODO(fclem): Apparent roughness. For now, always raytrace. */ - } + /* TODO(fclem): Arbitrary closure stack. */ + for (int i = 0; i < 3; i++) { + float ray_roughness_fac; + + if (i == 0 && gbuf.has_diffuse) { + /* Diffuse. */ + ray_roughness_fac = ray_roughness_factor(uniform_buf.raytrace, 1.0); + } + else if (i == 1 && gbuf.has_reflection) { + /* Reflection. */ + ray_roughness_fac = ray_roughness_factor(uniform_buf.raytrace, gbuf.reflection.roughness); + } + else if (i == 2 && gbuf.has_refraction) { + /* Refraction. */ + ray_roughness_fac = 0.0; /* TODO(fclem): Apparent roughness. For now, always raytrace. */ + } + else { + continue; + } - float ray_roughness_fac = ray_roughness_factor(uniform_buf.raytrace, roughness); - if (ray_roughness_fac > 0.0) { /* We don't care about race condition here. */ - tile_contains_horizon_scan = 1; - } - if (ray_roughness_fac < 1.0) { - /* We don't care about race condition here. */ - tile_contains_ray_tracing = 1; + if (ray_roughness_fac > 0.0) { + tile_contains_horizon_scan[i] = 1; + } + if (ray_roughness_fac < 1.0) { + tile_contains_ray_tracing[i] = 1; + } } } barrier(); if (all(equal(gl_LocalInvocationID, uvec3(0)))) { - ivec2 tile_co = ivec2(gl_WorkGroupID.xy); + ivec2 denoise_tile_co = ivec2(gl_WorkGroupID.xy); + ivec2 tracing_tile_co = denoise_tile_co / uniform_buf.raytrace.resolution_scale; - uint tile_mask = 0u; - if (tile_contains_ray_tracing > 0) { - tile_mask |= 1u << 0u; - } - if (tile_contains_horizon_scan > 0) { - tile_mask |= 1u << 1u; - } + for (int i = 0; i < 3; i++) { + if (tile_contains_ray_tracing[i] > 0) { + imageStore(tile_raytrace_denoise_img, ivec3(denoise_tile_co, i), uvec4(1)); + imageStore(tile_raytrace_tracing_img, ivec3(tracing_tile_co, i), uvec4(1)); + } - imageStore(tile_mask_img, tile_co, uvec4(tile_mask)); + if (tile_contains_horizon_scan[i] > 0) { + imageStore(tile_horizon_denoise_img, ivec3(denoise_tile_co, i), uvec4(1)); + imageStore(tile_horizon_tracing_img, ivec3(tracing_tile_co, i), uvec4(1)); + } + } } } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_tile_compact_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_tile_compact_comp.glsl index 88576d4de92..c489ee2b676 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_ray_tile_compact_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_ray_tile_compact_comp.glsl @@ -15,71 +15,105 @@ void main() { - int resolution_scale = uniform_buf.raytrace.resolution_scale; ivec2 tile = ivec2(gl_GlobalInvocationID.xy); - /* True if an adjacent tile is tracing and will need this tile data for denoising. */ - bool tile_is_ray_sampled = false; + if (all(equal(tile, ivec2(0)))) { + raytrace_tracing_dispatch_buf.num_groups_y = 1; + raytrace_denoise_dispatch_buf.num_groups_y = 1; + horizon_tracing_dispatch_buf.num_groups_y = 1; + horizon_denoise_dispatch_buf.num_groups_y = 1; + + raytrace_tracing_dispatch_buf.num_groups_z = 1; + raytrace_denoise_dispatch_buf.num_groups_z = 1; + horizon_tracing_dispatch_buf.num_groups_z = 1; + horizon_denoise_dispatch_buf.num_groups_z = 1; + } + + if (!in_image_range(tile, tile_raytrace_tracing_img)) { + return; + } + + int closure_index = uniform_buf.raytrace.closure_index; + /* True if this tile is shooting and tracing rays. */ - bool tile_is_ray_tracing = false; + bool is_ray_tracing = imageLoad(tile_raytrace_tracing_img, ivec3(tile, closure_index)).r != 0; /* True if this tile is using horizon scan. */ - bool tile_is_horizon_tracing = false; - /* True if an adjacent tile is tracing and will need this tile data for denoising (horizon). */ - bool tile_is_horizon_sampled = false; - /* Could be optimized if that becomes an issue. */ + bool is_horizon_tracing = imageLoad(tile_horizon_tracing_img, ivec3(tile, closure_index)).r != 0; + + /* True if an adjacent tile is ray tracing and will need this tile data for denoising. */ + bool tile_is_ray_sampled = false; + /* Could be optimized if that becomes an issue (3x3 cross gather + 3x3 "X" shape scatter). */ for (int x_tile = -1; x_tile <= 1; x_tile++) { for (int y_tile = -1; y_tile <= 1; y_tile++) { ivec2 tile_adj = tile + ivec2(x_tile, y_tile); - for (int x = 0; x < resolution_scale; x++) { - for (int y = 0; y < resolution_scale; y++) { - ivec2 full_res_tile = tile_adj * resolution_scale + ivec2(x, y); - if (any(greaterThanEqual(full_res_tile, imageSize(tile_mask_img)))) { - continue; - } - uint tile_mask = imageLoad(tile_mask_img, full_res_tile).r; - bool tile_uses_ray_tracing = flag_test(tile_mask, 1u << 0u); - bool tile_uses_horizon_scan = flag_test(tile_mask, 1u << 1u); - if (tile_uses_ray_tracing) { - if (x_tile == 0 && y_tile == 0) { - /* Dispatch full resolution denoise tile. */ - uint tile_index = atomicAdd(ray_denoise_dispatch_buf.num_groups_x, 1u); - ray_denoise_tiles_buf[tile_index] = packUvec2x16(uvec2(full_res_tile)); - tile_is_ray_tracing = true; - } - else { - /* This denoise tile will sample the target tracing tile. Make sure it is cleared. */ - tile_is_ray_sampled = true; - } - } + bool is_center_tile = (x_tile == 0 && y_tile == 0); + if (in_image_range(tile_adj, tile_raytrace_tracing_img) && !is_center_tile) { + if (imageLoad(tile_raytrace_tracing_img, ivec3(tile_adj, closure_index)).r != 0) { + /* This tile will sample the target tracing tile. Make sure it is cleared. */ + tile_is_ray_sampled = true; + break; + } + } + } + } - if (tile_uses_horizon_scan) { - if (x_tile == 0 && y_tile == 0) { - /* Dispatch full resolution horizon scan. */ - uint tile_horizon_index = atomicAdd(horizon_denoise_dispatch_buf.num_groups_x, 1u); - horizon_denoise_tiles_buf[tile_horizon_index] = packUvec2x16(uvec2(full_res_tile)); - tile_is_horizon_tracing = true; - } - else { - /* This denoise tile will sample the target tracing tile. Make sure it is cleared. */ - tile_is_horizon_sampled = true; - } - } + /* True if an adjacent tile is horizon tracing and will need this tile data for denoising. */ + bool tile_is_horizon_sampled = false; + /* Could be optimized if that becomes an issue (3x3 cross gather + 3x3 "X" shape scatter). */ + for (int x_tile = -1; x_tile <= 1; x_tile++) { + for (int y_tile = -1; y_tile <= 1; y_tile++) { + ivec2 tile_adj = tile + ivec2(x_tile, y_tile); + bool is_center_tile = (x_tile == 0 && y_tile == 0); + if (in_image_range(tile_adj, tile_horizon_tracing_img) && !is_center_tile) { + if (imageLoad(tile_horizon_tracing_img, ivec3(tile_adj, closure_index)).r != 0) { + /* This tile will sample the target tracing tile. Make sure it is cleared. */ + tile_is_horizon_sampled = true; + break; } } } } /* TODO(fclem): we might want to dispatch another type of shader only for clearing. */ - if (tile_is_ray_tracing || tile_is_ray_sampled) { + if (is_ray_tracing || tile_is_ray_sampled) { /* Dispatch trace resolution tracing tile. */ - uint tile_index = atomicAdd(ray_dispatch_buf.num_groups_x, 1u); - ray_tiles_buf[tile_index] = packUvec2x16(uvec2(tile)); + uint tile_index = atomicAdd(raytrace_tracing_dispatch_buf.num_groups_x, 1u); + raytrace_tracing_tiles_buf[tile_index] = packUvec2x16(uvec2(tile)); } /* TODO(fclem): we might want to dispatch another type of shader only for clearing. */ - if (tile_is_horizon_tracing || tile_is_horizon_sampled) { + if (is_horizon_tracing || tile_is_horizon_sampled) { /* Dispatch trace resolution tracing tile. */ - uint tile_index = atomicAdd(horizon_dispatch_buf.num_groups_x, 1u); - horizon_tiles_buf[tile_index] = packUvec2x16(uvec2(tile)); + uint tile_index = atomicAdd(horizon_tracing_dispatch_buf.num_groups_x, 1u); + horizon_tracing_tiles_buf[tile_index] = packUvec2x16(uvec2(tile)); + } + + /* Dispatch denoise tiles. */ + int resolution_scale = uniform_buf.raytrace.resolution_scale; + if (is_ray_tracing) { + for (int x_tile = 0; x_tile < resolution_scale; x_tile++) { + for (int y_tile = 0; y_tile < resolution_scale; y_tile++) { + ivec2 tile_adj = tile * resolution_scale + ivec2(x_tile, y_tile); + if (in_image_range(tile_adj, tile_raytrace_denoise_img)) { + if (imageLoad(tile_raytrace_denoise_img, ivec3(tile_adj, closure_index)).r != 0) { + uint tile_index = atomicAdd(raytrace_denoise_dispatch_buf.num_groups_x, 1u); + raytrace_denoise_tiles_buf[tile_index] = packUvec2x16(uvec2(tile_adj)); + } + } + } + } + } + if (is_horizon_tracing) { + for (int x_tile = 0; x_tile < resolution_scale; x_tile++) { + for (int y_tile = 0; y_tile < resolution_scale; y_tile++) { + ivec2 tile_adj = tile * resolution_scale + ivec2(x_tile, y_tile); + if (in_image_range(tile_adj, tile_horizon_denoise_img)) { + if (imageLoad(tile_horizon_denoise_img, ivec3(tile_adj, closure_index)).r != 0) { + uint tile_index = atomicAdd(horizon_denoise_dispatch_buf.num_groups_x, 1u); + horizon_denoise_tiles_buf[tile_index] = packUvec2x16(uvec2(tile_adj)); + } + } + } + } } } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_lib.glsl index 33db8d15ac8..36639c3befa 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_lib.glsl @@ -8,7 +8,13 @@ #define EEVEE_SHADOW_LIB -float shadow_read_depth_at_tilemap_uv(usampler2DArray atlas_tx, +#ifdef SHADOW_READ_ATOMIC +# define SHADOW_ATLAS_TYPE usampler2DArrayAtomic +#else +# define SHADOW_ATLAS_TYPE usampler2DArray +#endif + +float shadow_read_depth_at_tilemap_uv(SHADOW_ATLAS_TYPE atlas_tx, usampler2D tilemaps_tx, int tilemap_index, vec2 tilemap_uv) @@ -86,7 +92,7 @@ float shadow_linear_occluder_distance(LightData light, return receiver_z - occluder_z; } -ShadowEvalResult shadow_punctual_sample_get(usampler2DArray atlas_tx, +ShadowEvalResult shadow_punctual_sample_get(SHADOW_ATLAS_TYPE atlas_tx, usampler2D tilemaps_tx, LightData light, vec3 P) @@ -116,7 +122,7 @@ ShadowEvalResult shadow_punctual_sample_get(usampler2DArray atlas_tx, return result; } -ShadowEvalResult shadow_directional_sample_get(usampler2DArray atlas_tx, +ShadowEvalResult shadow_directional_sample_get(SHADOW_ATLAS_TYPE atlas_tx, usampler2D tilemaps_tx, LightData light, vec3 P) @@ -159,7 +165,7 @@ ShadowEvalResult shadow_directional_sample_get(usampler2DArray atlas_tx, } ShadowEvalResult shadow_sample(const bool is_directional, - usampler2DArray atlas_tx, + SHADOW_ATLAS_TYPE atlas_tx, usampler2D tilemaps_tx, LightData light, vec3 P) diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tracing_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tracing_lib.glsl index d71c26d9e30..36526ff6000 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tracing_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_shadow_tracing_lib.glsl @@ -310,12 +310,10 @@ ShadowRayPunctual shadow_ray_generate_punctual(LightData light, direction = point_on_light_shape - lP; r_is_above_surface = dot(direction, lNg) > 0.0; -#ifdef SSS_TRANSMITTANCE +#ifdef SHADOW_SUBSURFACE if (!r_is_above_surface) { - float dir_len; - vec3 L = normalize_and_get_length(direction, dir_len); /* Skip the object volume. Do not push behind the light. */ - float offset_len = saturate(thickness / dir_len); + float offset_len = saturate(thickness / length(direction)); lP += direction * offset_len; direction *= 1.0 - offset_len; } @@ -341,12 +339,10 @@ ShadowRayPunctual shadow_ray_generate_punctual(LightData light, direction = point_on_light_shape - lP; r_is_above_surface = dot(direction, lNg) > 0.0; -#ifdef SSS_TRANSMITTANCE +#ifdef SHADOW_SUBSURFACE if (!r_is_above_surface) { - float dir_len; - vec3 L = normalize_and_get_length(direction, dir_len); /* Skip the object volume. Do not push behind the light. */ - float offset_len = saturate(thickness / dir_len); + float offset_len = saturate(thickness / length(direction)); lP += direction * offset_len; direction *= 1.0 - offset_len; } @@ -477,7 +473,7 @@ ShadowEvalResult shadow_eval(LightData light, ShadowEvalResult result; result.light_visibilty = saturate(1.0 - surface_hit * safe_rcp(surface_ray_count)); result.light_visibilty = min(result.light_visibilty, - saturate(1.0 - subsurface_hit * safe_rcp(surface_ray_count))); + saturate(1.0 - subsurface_hit * safe_rcp(subsurface_ray_count))); result.occluder_distance = 0.0; /* Unused. Could reintroduced if needed. */ return result; } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_subsurface_setup_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_subsurface_setup_comp.glsl index 5aeb200b859..d7fb28df892 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_subsurface_setup_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_subsurface_setup_comp.glsl @@ -25,7 +25,7 @@ void main(void) GBufferData gbuf = gbuffer_read(gbuf_header_tx, gbuf_closure_tx, gbuf_color_tx, texel); - if (gbuf.has_diffuse && gbuf.diffuse.sss_id != 0u) { + if (gbuf.has_sss) { vec3 radiance = imageLoad(direct_light_img, texel).rgb + imageLoad(indirect_light_img, texel).rgb; diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_deferred_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_deferred_frag.glsl index 09c6f240261..09a73feba00 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_deferred_frag.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_deferred_frag.glsl @@ -82,8 +82,12 @@ void main() /* ----- GBuffer output ----- */ - GBufferDataPacked gbuf = gbuffer_pack( - g_diffuse_data, g_reflection_data, g_refraction_data, out_normal, thickness); + GBufferDataPacked gbuf = gbuffer_pack(g_diffuse_data, + g_translucent_data, + g_reflection_data, + g_refraction_data, + out_normal, + thickness); /* Output header and first closure using frame-buffer attachment. */ out_gbuf_header = gbuf.header; diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_forward_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_forward_frag.glsl index 0fdd48b7f71..c200d780c4f 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_forward_frag.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_forward_frag.glsl @@ -9,60 +9,26 @@ */ #pragma BLENDER_REQUIRE(draw_view_lib.glsl) -#pragma BLENDER_REQUIRE(eevee_light_eval_lib.glsl) -#pragma BLENDER_REQUIRE(eevee_lightprobe_eval_lib.glsl) #pragma BLENDER_REQUIRE(eevee_ambient_occlusion_lib.glsl) #pragma BLENDER_REQUIRE(eevee_nodetree_lib.glsl) #pragma BLENDER_REQUIRE(eevee_sampling_lib.glsl) #pragma BLENDER_REQUIRE(eevee_surf_lib.glsl) -#pragma BLENDER_REQUIRE(eevee_subsurface_lib.glsl) #pragma BLENDER_REQUIRE(eevee_volume_lib.glsl) +#pragma BLENDER_REQUIRE(eevee_forward_lib.glsl) #pragma BLENDER_REQUIRE(common_hair_lib.glsl) -vec4 closure_to_rgba(Closure cl) +/* Global thickness because it is needed for closure_to_rgba. */ +float g_thickness; + +vec4 closure_to_rgba(Closure cl_unused) { - vec3 diffuse_light = vec3(0.0); - vec3 reflection_light = vec3(0.0); - vec3 refraction_light = vec3(0.0); - float shadow = 1.0; - - float vPz = dot(drw_view_forward(), g_data.P) - dot(drw_view_forward(), drw_view_position()); - vec3 V = drw_world_incident_vector(g_data.P); - - ClosureLightStack stack; - - ClosureLight cl_diff; - cl_diff.N = g_diffuse_data.N; - cl_diff.ltc_mat = LTC_LAMBERT_MAT; - cl_diff.type = LIGHT_DIFFUSE; - stack.cl[0] = cl_diff; - - ClosureLight cl_refl; - cl_refl.N = g_reflection_data.N; - cl_refl.ltc_mat = LTC_GGX_MAT(dot(g_reflection_data.N, V), g_reflection_data.roughness); - cl_refl.type = LIGHT_SPECULAR; - stack.cl[1] = cl_refl; - - float thickness = 0.01; /* TODO(fclem) thickness. */ - light_eval(stack, g_data.P, g_data.Ng, V, vPz, thickness); - - vec2 noise_probe = interlieved_gradient_noise(gl_FragCoord.xy, vec2(0, 1), vec2(0.0)); - LightProbeSample samp = lightprobe_load(g_data.P, g_data.Ng, V); - - diffuse_light += lightprobe_eval(samp, g_diffuse_data, g_data.P, V, noise_probe); - reflection_light += lightprobe_eval(samp, g_reflection_data, g_data.P, V, noise_probe); - - vec4 out_color; - out_color.rgb = g_emission; - out_color.rgb += g_diffuse_data.color * g_diffuse_data.weight * stack.cl[0].light_shadowed; - out_color.rgb += g_reflection_data.color * g_reflection_data.weight * stack.cl[1].light_shadowed; - - out_color.a = saturate(1.0 - average(g_transmittance)); + vec3 radiance, transmittance; + forward_lighting_eval(g_thickness, radiance, transmittance); /* Reset for the next closure tree. */ closure_weights_reset(); - return out_color; + return vec4(radiance, saturate(1.0 - average(transmittance))); } void main() @@ -77,124 +43,25 @@ void main() fragment_displacement(); + g_thickness = max(0.0, nodetree_thickness()); + nodetree_surface(); - g_holdout = saturate(g_holdout); + vec3 radiance, transmittance; + forward_lighting_eval(g_thickness, radiance, transmittance); - float thickness = nodetree_thickness(); - - float vPz = dot(drw_view_forward(), g_data.P) - dot(drw_view_forward(), drw_view_position()); - vec3 V = drw_world_incident_vector(g_data.P); - - ClosureLightStack stack; - - ClosureLight cl_diff; - cl_diff.N = g_diffuse_data.N; - cl_diff.ltc_mat = LTC_LAMBERT_MAT; - cl_diff.type = LIGHT_DIFFUSE; - stack.cl[0] = cl_diff; - - ClosureLight cl_refl; - cl_refl.N = g_reflection_data.N; - cl_refl.ltc_mat = LTC_GGX_MAT(dot(g_reflection_data.N, V), g_reflection_data.roughness); - cl_refl.type = LIGHT_SPECULAR; - stack.cl[1] = cl_refl; - -#ifdef SSS_TRANSMITTANCE - ClosureLight cl_sss; - cl_sss.N = -g_diffuse_data.N; - cl_sss.ltc_mat = LTC_LAMBERT_MAT; - cl_sss.type = LIGHT_DIFFUSE; - stack.cl[2] = cl_sss; -#endif - - light_eval(stack, g_data.P, g_data.Ng, V, vPz, thickness); - - vec3 diffuse_light = stack.cl[0].light_shadowed; - vec3 reflection_light = stack.cl[1].light_shadowed; - vec3 refraction_light = vec3(0.0); -#ifdef SSS_TRANSMITTANCE - diffuse_light += stack.cl[2].light_shadowed; -#endif - - vec2 noise_probe = interlieved_gradient_noise(gl_FragCoord.xy, vec2(0, 1), vec2(0.0)); - LightProbeSample samp = lightprobe_load(g_data.P, g_data.Ng, V); - - diffuse_light += lightprobe_eval(samp, g_diffuse_data, g_data.P, V, noise_probe); - reflection_light += lightprobe_eval(samp, g_reflection_data, g_data.P, V, noise_probe); - - g_diffuse_data.color *= g_diffuse_data.weight; - g_reflection_data.color *= g_reflection_data.weight; - g_refraction_data.color *= g_refraction_data.weight; - diffuse_light *= step(1e-5, g_diffuse_data.weight); - reflection_light *= step(1e-5, g_reflection_data.weight); - refraction_light *= step(1e-5, g_refraction_data.weight); - - out_radiance.rgb = g_emission; - out_radiance.rgb += g_diffuse_data.color * diffuse_light; - out_radiance.rgb += g_reflection_data.color * reflection_light; - out_radiance.rgb += g_refraction_data.color * refraction_light; - out_radiance.a = 0.0; - - vec3 specular_light = reflection_light + refraction_light; - vec3 specular_color = g_reflection_data.color + g_refraction_data.color; - - /* TODO(fclem): This feels way too complex for what is it. */ - bool has_any_bsdf_weight = g_diffuse_data.weight != 0.0 || g_reflection_data.weight != 0.0 || - g_refraction_data.weight != 0.0; - vec3 out_normal = has_any_bsdf_weight ? vec3(0.0) : g_data.N; - out_normal += g_diffuse_data.N * g_diffuse_data.weight; - out_normal += g_reflection_data.N * g_reflection_data.weight; - out_normal += g_refraction_data.N * g_refraction_data.weight; - out_normal = safe_normalize(out_normal); - -#ifdef MAT_RENDER_PASS_SUPPORT - ivec2 out_texel = ivec2(gl_FragCoord.xy); - if (imageSize(rp_cryptomatte_img).x > 1) { - vec4 cryptomatte_output = vec4( - cryptomatte_object_buf[resource_id], node_tree.crypto_hash, 0.0); - imageStore(rp_cryptomatte_img, out_texel, cryptomatte_output); - } - - vec3 radiance_shadowed = stack.cl[0].light_shadowed; - vec3 radiance_unshadowed = stack.cl[0].light_unshadowed; - radiance_shadowed += stack.cl[1].light_shadowed; - radiance_unshadowed += stack.cl[1].light_unshadowed; -# ifdef SSS_TRANSMITTANCE - radiance_shadowed += stack.cl[2].light_shadowed; - radiance_unshadowed += stack.cl[2].light_unshadowed; -# endif - - vec3 shadows = radiance_shadowed / safe_rcp(radiance_unshadowed); - - output_renderpass_color(uniform_buf.render_pass.normal_id, vec4(out_normal, 1.0)); - output_renderpass_color(uniform_buf.render_pass.position_id, vec4(g_data.P, 1.0)); - output_renderpass_color(uniform_buf.render_pass.diffuse_color_id, - vec4(g_diffuse_data.color, 1.0)); - output_renderpass_color(uniform_buf.render_pass.diffuse_light_id, vec4(diffuse_light, 1.0)); - output_renderpass_color(uniform_buf.render_pass.specular_color_id, vec4(specular_color, 1.0)); - output_renderpass_color(uniform_buf.render_pass.specular_light_id, vec4(specular_light, 1.0)); - output_renderpass_color(uniform_buf.render_pass.emission_id, vec4(g_emission, 1.0)); - output_renderpass_value(uniform_buf.render_pass.shadow_id, average(shadows)); - /** NOTE: AO is done on its own pass. */ -#endif - -#ifdef MAT_TRANSPARENT /* Volumetric resolve and compositing. */ vec2 uvs = gl_FragCoord.xy * uniform_buf.volumes.viewport_size_inv; VolumeResolveSample vol = volume_resolve( vec3(uvs, gl_FragCoord.z), volume_transmittance_tx, volume_scattering_tx); - /* Removes the part of the volume scattering that has * already been added to the destination pixels by the opaque resolve. * Since we do that using the blending pipeline we need to account for material transmittance. */ vol.scattering -= vol.scattering * g_transmittance; + radiance = radiance * vol.transmittance + vol.scattering; - out_radiance.rgb = out_radiance.rgb * vol.transmittance + vol.scattering; -#endif + radiance *= 1.0 - saturate(g_holdout); - out_radiance.rgb *= 1.0 - g_holdout; - - out_transmittance.rgb = g_transmittance; - out_transmittance.a = saturate(average(g_transmittance)); + out_radiance = vec4(radiance, 0.0); + out_transmittance = vec4(transmittance, saturate(average(transmittance))); } diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_hybrid_frag.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_hybrid_frag.glsl new file mode 100644 index 00000000000..0b7e1aa3df3 --- /dev/null +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_hybrid_frag.glsl @@ -0,0 +1,121 @@ +/* SPDX-FileCopyrightText: 2022-2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +/** + * Deferred lighting evaluation: Lighting is evaluated in a separate pass. + * + * Outputs shading parameter per pixel using a randomized set of BSDFs. + * Some render-pass are written during this pass. + */ + +#pragma BLENDER_REQUIRE(draw_view_lib.glsl) +#pragma BLENDER_REQUIRE(eevee_gbuffer_lib.glsl) +#pragma BLENDER_REQUIRE(common_hair_lib.glsl) +#pragma BLENDER_REQUIRE(eevee_ambient_occlusion_lib.glsl) +#pragma BLENDER_REQUIRE(eevee_surf_lib.glsl) +#pragma BLENDER_REQUIRE(eevee_forward_lib.glsl) +#pragma BLENDER_REQUIRE(eevee_nodetree_lib.glsl) +#pragma BLENDER_REQUIRE(eevee_sampling_lib.glsl) + +/* Global thickness because it is needed for closure_to_rgba. */ +float g_thickness; + +vec4 closure_to_rgba(Closure cl_unused) +{ + vec3 radiance, transmittance; + forward_lighting_eval(g_thickness, radiance, transmittance); + + /* Reset for the next closure tree. */ + closure_weights_reset(); + + return vec4(radiance, saturate(1.0 - average(transmittance))); +} + +void main() +{ + /* Clear AOVs first. In case the material renders to them. */ + clear_aovs(); + + init_globals(); + + float noise = utility_tx_fetch(utility_tx, gl_FragCoord.xy, UTIL_BLUE_NOISE_LAYER).r; + g_closure_rand = fract(noise + sampling_rng_1D_get(SAMPLING_CLOSURE)); + + fragment_displacement(); + + nodetree_surface(); + + g_holdout = saturate(g_holdout); + + g_thickness = max(0.0, nodetree_thickness()); + + g_diffuse_data.color *= g_diffuse_data.weight; + g_reflection_data.color *= g_reflection_data.weight; + g_refraction_data.color *= g_refraction_data.weight; + + /* TODO(fclem): This feels way too complex for what is it. */ + bool has_any_bsdf_weight = g_diffuse_data.weight != 0.0 || g_reflection_data.weight != 0.0 || + g_refraction_data.weight != 0.0; + vec3 out_normal = has_any_bsdf_weight ? vec3(0.0) : g_data.N; + out_normal += g_diffuse_data.N * g_diffuse_data.weight; + out_normal += g_reflection_data.N * g_reflection_data.weight; + out_normal += g_refraction_data.N * g_refraction_data.weight; + out_normal = safe_normalize(out_normal); + + vec3 specular_color = g_reflection_data.color + g_refraction_data.color; + + /* ----- Render Passes output ----- */ + + ivec2 out_texel = ivec2(gl_FragCoord.xy); +#ifdef MAT_RENDER_PASS_SUPPORT /* Needed because node_tree isn't present in test shaders. */ + /* Some render pass can be written during the gbuffer pass. Light passes are written later. */ + if (imageSize(rp_cryptomatte_img).x > 1) { + vec4 cryptomatte_output = vec4( + cryptomatte_object_buf[resource_id], node_tree.crypto_hash, 0.0); + imageStore(rp_cryptomatte_img, out_texel, cryptomatte_output); + } + output_renderpass_color(uniform_buf.render_pass.normal_id, vec4(out_normal, 1.0)); + output_renderpass_color(uniform_buf.render_pass.position_id, vec4(g_data.P, 1.0)); + output_renderpass_color(uniform_buf.render_pass.diffuse_color_id, + vec4(g_diffuse_data.color, 1.0)); + output_renderpass_color(uniform_buf.render_pass.specular_color_id, vec4(specular_color, 1.0)); + output_renderpass_color(uniform_buf.render_pass.emission_id, vec4(g_emission, 1.0)); +#endif + + /* ----- GBuffer output ----- */ + + GBufferDataPacked gbuf = gbuffer_pack(g_diffuse_data, + g_translucent_data, + g_reflection_data, + g_refraction_data, + out_normal, + g_thickness); + + /* Output header and first closure using frame-buffer attachment. */ + out_gbuf_header = gbuf.header; + out_gbuf_color = gbuf.color[0]; + out_gbuf_closure = gbuf.closure[0]; + + /* Output remaining closures using image store. */ + /* NOTE: The image view start at layer 1 so all destination layer is `closure_index - 1`. */ + if (gbuffer_header_unpack(gbuf.header, 1) != GBUF_NONE) { + imageStore(out_gbuf_color_img, ivec3(out_texel, 1 - 1), gbuf.color[1]); + imageStore(out_gbuf_closure_img, ivec3(out_texel, 1 - 1), gbuf.closure[1]); + } + if (gbuffer_header_unpack(gbuf.header, 2) != GBUF_NONE) { + imageStore(out_gbuf_color_img, ivec3(out_texel, 2 - 1), gbuf.color[2]); + imageStore(out_gbuf_closure_img, ivec3(out_texel, 2 - 1), gbuf.closure[2]); + } + if (gbuffer_header_unpack(gbuf.header, 3) != GBUF_NONE) { + /* No color for SSS. */ + imageStore(out_gbuf_closure_img, ivec3(out_texel, 3 - 1), gbuf.closure[3]); + } + + /* ----- Radiance output ----- */ + + /* Only output emission during the gbuffer pass. */ + out_radiance = vec4(g_emission, 0.0); + out_radiance.rgb *= 1.0 - g_holdout; + out_radiance.a = g_holdout; +} diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_lib.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_lib.glsl index 30871cd7d05..36056795f66 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_surf_lib.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_surf_lib.glsl @@ -107,7 +107,18 @@ void init_globals() g_data.hair_time = 0.0; g_data.hair_thickness = 0.0; g_data.hair_strand_id = 0; - g_data.ray_type = RAY_TYPE_CAMERA; /* TODO */ +#if defined(MAT_SHADOW) + g_data.ray_type = RAY_TYPE_SHADOW; +#elif defined(MAT_CAPTURE) + g_data.ray_type = RAY_TYPE_DIFFUSE; +#else + if (uniform_buf.pipeline.is_probe_reflection) { + g_data.ray_type = RAY_TYPE_GLOSSY; + } + else { + g_data.ray_type = RAY_TYPE_CAMERA; + } +#endif g_data.ray_depth = 0.0; g_data.ray_length = distance(g_data.P, drw_view_position()); g_data.barycentric_coords = vec2(0.0); diff --git a/source/blender/draw/engines/eevee_next/shaders/eevee_volume_integration_comp.glsl b/source/blender/draw/engines/eevee_next/shaders/eevee_volume_integration_comp.glsl index 2ef8c94e1da..66777d6be04 100644 --- a/source/blender/draw/engines/eevee_next/shaders/eevee_volume_integration_comp.glsl +++ b/source/blender/draw/engines/eevee_next/shaders/eevee_volume_integration_comp.glsl @@ -51,21 +51,27 @@ void main() float cell_depth = volume_z_to_view_z((float(i) + 1.0) / tex_size.z); float ray_len = orig_ray_len * cell_depth; - /* Emission does not work if there is no extinction because - * froxel_transmittance evaluates to 1.0 leading to froxel_scattering = 0.0. (See #65771) */ - extinction = max(vec3(1e-7) * step(1e-5, froxel_scattering), extinction); - /* Evaluate Scattering. */ float step_len = abs(ray_len - prev_ray_len); prev_ray_len = ray_len; vec3 froxel_transmittance = exp(-extinction * step_len); - - /* Integrate along the current step segment. */ /** NOTE: Original calculation carries precision issues when compiling for AMD GPUs * and running Metal. This version of the equation retains precision well for all - * macOS HW configurations. */ - froxel_scattering = (froxel_scattering * (1.0f - froxel_transmittance)) / - max(vec3(1e-8), extinction); + * macOS HW configurations. + * Here is the original for reference: + * `Lscat = (Lscat - Lscat * Tr) / safe_rcp(s_extinction)` */ + vec3 froxel_opacity = 1.0 - froxel_transmittance; + vec3 froxel_step_opacity = froxel_opacity * safe_rcp(extinction); + + /* Emission does not work if there is no extinction because + * `froxel_transmittance` evaluates to 1.0 leading to `froxel_opacity = 0.0`. (See #65771) + * To avoid fiddling with numerical values, take the limit of `froxel_step_opacity` as + * `extinction` approaches zero which is simply `step_len`. */ + bvec3 is_invalid_extinction = equal(extinction, vec3(0.0)); + froxel_step_opacity = mix(froxel_step_opacity, vec3(step_len), is_invalid_extinction); + + /* Integrate along the current step segment. */ + froxel_scattering = froxel_scattering * froxel_step_opacity; /* Accumulate and also take into account the transmittance from previous steps. */ scattering += transmittance * froxel_scattering; diff --git a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_deferred_info.hh b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_deferred_info.hh index 71ed5fc87e2..f5e6861ce77 100644 --- a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_deferred_info.hh +++ b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_deferred_info.hh @@ -85,7 +85,8 @@ GPU_SHADER_CREATE_INFO(eevee_deferred_light_double) GPU_SHADER_CREATE_INFO(eevee_deferred_light_triple) .additional_info("eevee_deferred_light") - .define("SSS_TRANSMITTANCE") + .define("SHADOW_SUBSURFACE") + .define("MAT_SUBSURFACE") .define("LIGHT_CLOSURE_EVAL_COUNT", "3") .do_static_compilation(true); @@ -112,7 +113,7 @@ GPU_SHADER_CREATE_INFO(eevee_deferred_capture_eval) .early_fragment_test(true) /* Inputs. */ .fragment_out(0, Type::VEC4, "out_radiance") - .define("SSS_TRANSMITTANCE") + .define("SHADOW_SUBSURFACE") .additional_info("eevee_shared", "eevee_gbuffer_data", "eevee_utility_texture", @@ -132,7 +133,7 @@ GPU_SHADER_CREATE_INFO(eevee_deferred_planar_eval) /* Inputs. */ .fragment_out(0, Type::VEC4, "out_radiance") .define("REFLECTION_PROBE") - .define("SSS_TRANSMITTANCE") + .define("SHADOW_SUBSURFACE") .define("LIGHT_CLOSURE_EVAL_COUNT", "2") .additional_info("eevee_shared", "eevee_gbuffer_data", diff --git a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_hiz_info.hh b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_hiz_info.hh index ffe0aa3d715..ca28f8808f7 100644 --- a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_hiz_info.hh +++ b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_hiz_info.hh @@ -9,11 +9,9 @@ GPU_SHADER_CREATE_INFO(eevee_hiz_data) .sampler(HIZ_TEX_SLOT, ImageType::FLOAT_2D, "hiz_tx") .additional_info("eevee_global_ubo"); -GPU_SHADER_CREATE_INFO(eevee_hiz_update) - .do_static_compilation(true) +GPU_SHADER_CREATE_INFO(eevee_hiz_update_base) .local_group_size(FILM_GROUP_SIZE, FILM_GROUP_SIZE) .storage_buf(0, Qualifier::READ_WRITE, "uint", "finished_tile_counter") - .sampler(0, ImageType::DEPTH_2D, "depth_tx") .image(0, GPU_R32F, Qualifier::WRITE, ImageType::FLOAT_2D, "out_mip_0") .image(1, GPU_R32F, Qualifier::WRITE, ImageType::FLOAT_2D, "out_mip_1") .image(2, GPU_R32F, Qualifier::WRITE, ImageType::FLOAT_2D, "out_mip_2") @@ -24,12 +22,17 @@ GPU_SHADER_CREATE_INFO(eevee_hiz_update) .push_constant(Type::BOOL, "update_mip_0") .compute_source("eevee_hiz_update_comp.glsl"); +GPU_SHADER_CREATE_INFO(eevee_hiz_update) + .do_static_compilation(true) + .sampler(0, ImageType::DEPTH_2D, "depth_tx") + .additional_info("eevee_hiz_update_base"); + GPU_SHADER_CREATE_INFO(eevee_hiz_update_layer) .do_static_compilation(true) .define("HIZ_LAYER") .sampler(1, ImageType::DEPTH_2D_ARRAY, "depth_layered_tx") .push_constant(Type::INT, "layer_id") - .additional_info("eevee_hiz_update"); + .additional_info("eevee_hiz_update_base"); GPU_SHADER_CREATE_INFO(eevee_hiz_debug) .do_static_compilation(true) diff --git a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_irradiance_cache_info.hh b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_irradiance_cache_info.hh index c7581ec56d9..854fe29a413 100644 --- a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_irradiance_cache_info.hh +++ b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_irradiance_cache_info.hh @@ -88,7 +88,7 @@ GPU_SHADER_CREATE_INFO(eevee_surfel_light) GPU_SHADER_CREATE_INFO(eevee_surfel_cluster_build) .local_group_size(SURFEL_GROUP_SIZE) .additional_info("eevee_shared", "eevee_surfel_common", "draw_view") - .image(0, GPU_R32I, Qualifier::READ_WRITE, ImageType::INT_3D, "cluster_list_img") + .image(0, GPU_R32I, Qualifier::READ_WRITE, ImageType::INT_3D_ATOMIC, "cluster_list_img") .compute_source("eevee_surfel_cluster_build_comp.glsl") .do_static_compilation(true); @@ -157,7 +157,7 @@ GPU_SHADER_CREATE_INFO(eevee_lightprobe_irradiance_offset) .additional_info("eevee_shared", "eevee_surfel_common", "draw_view") .storage_buf(0, Qualifier::READ, "int", "list_start_buf[]") .storage_buf(6, Qualifier::READ, "SurfelListInfoData", "list_info_buf") - .image(0, GPU_R32I, Qualifier::READ, ImageType::INT_3D, "cluster_list_img") + .image(0, GPU_R32I, Qualifier::READ, ImageType::INT_3D_ATOMIC, "cluster_list_img") .image(1, GPU_RGBA16F, Qualifier::READ_WRITE, ImageType::FLOAT_3D, "virtual_offset_img") .compute_source("eevee_lightprobe_irradiance_offset_comp.glsl") .do_static_compilation(true); diff --git a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_material_info.hh b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_material_info.hh index f57bbc7020d..b1b96cc62f4 100644 --- a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_material_info.hh +++ b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_material_info.hh @@ -148,7 +148,8 @@ GPU_SHADER_CREATE_INFO(eevee_cryptomatte_out) .storage_buf(CRYPTOMATTE_BUF_SLOT, Qualifier::READ, "vec2", "cryptomatte_object_buf[]") .image_out(RBUFS_CRYPTOMATTE_SLOT, Qualifier::WRITE, GPU_RGBA32F, "rp_cryptomatte_img"); -GPU_SHADER_CREATE_INFO(eevee_surf_deferred) +GPU_SHADER_CREATE_INFO(eevee_surf_deferred_base) + .define("MAT_DEFERRED") /* NOTE: This removes the possibility of using gl_FragDepth. */ .early_fragment_test(true) /* Direct output. (Emissive, Holdout) */ @@ -160,7 +161,6 @@ GPU_SHADER_CREATE_INFO(eevee_surf_deferred) * limitation of the number of images we can bind on a single shader. */ .image_array_out(GBUF_CLOSURE_SLOT, Qualifier::WRITE, GPU_RGBA16, "out_gbuf_closure_img") .image_array_out(GBUF_COLOR_SLOT, Qualifier::WRITE, GPU_RGB10_A2, "out_gbuf_color_img") - .fragment_source("eevee_surf_deferred_frag.glsl") .additional_info("eevee_global_ubo", "eevee_utility_texture", /* Added at runtime because of test shaders not having `node_tree`. */ @@ -169,14 +169,25 @@ GPU_SHADER_CREATE_INFO(eevee_surf_deferred) "eevee_sampling_data", "eevee_hiz_data"); +GPU_SHADER_CREATE_INFO(eevee_surf_deferred) + .fragment_source("eevee_surf_deferred_frag.glsl") + .additional_info("eevee_surf_deferred_base"); + +GPU_SHADER_CREATE_INFO(eevee_surf_deferred_hybrid) + .fragment_source("eevee_surf_hybrid_frag.glsl") + .additional_info("eevee_surf_deferred_base", + "eevee_light_data", + "eevee_lightprobe_data", + "eevee_shadow_data"); + GPU_SHADER_CREATE_INFO(eevee_surf_forward) + .define("MAT_FORWARD") /* Early fragment test is needed for render passes support for forward surfaces. */ /* NOTE: This removes the possibility of using gl_FragDepth. */ .early_fragment_test(true) .fragment_out(0, Type::VEC4, "out_radiance", DualBlend::SRC_0) .fragment_out(0, Type::VEC4, "out_transmittance", DualBlend::SRC_1) .fragment_source("eevee_surf_forward_frag.glsl") - .define("LIGHT_CLOSURE_EVAL_COUNT", "3") .additional_info("eevee_global_ubo", "eevee_light_data", "eevee_lightprobe_data", @@ -238,7 +249,7 @@ GPU_SHADER_CREATE_INFO(eevee_surf_shadow_atomic) .image(SHADOW_ATLAS_IMG_SLOT, GPU_R32UI, Qualifier::READ_WRITE, - ImageType::UINT_2D_ARRAY, + ImageType::UINT_2D_ARRAY_ATOMIC, "shadow_atlas_img"); GPU_SHADER_CREATE_INFO(eevee_surf_shadow_tbdr) @@ -292,7 +303,11 @@ GPU_SHADER_CREATE_INFO(eevee_volume_object) Qualifier::READ_WRITE, ImageType::FLOAT_3D, "out_phase_img") - .image(VOLUME_OCCUPANCY_SLOT, GPU_R32UI, Qualifier::READ, ImageType::UINT_3D, "occupancy_img") + .image(VOLUME_OCCUPANCY_SLOT, + GPU_R32UI, + Qualifier::READ, + ImageType::UINT_3D_ATOMIC, + "occupancy_img") .additional_info("eevee_volume_material_common", "draw_object_infos_new", "draw_volume_infos"); GPU_SHADER_CREATE_INFO(eevee_volume_world) @@ -327,12 +342,12 @@ GPU_SHADER_CREATE_INFO(eevee_surf_occupancy) .image(VOLUME_HIT_COUNT_SLOT, GPU_R32UI, Qualifier::READ_WRITE, - ImageType::UINT_2D, + ImageType::UINT_2D_ATOMIC, "hit_count_img") .image(VOLUME_OCCUPANCY_SLOT, GPU_R32UI, Qualifier::READ_WRITE, - ImageType::UINT_3D, + ImageType::UINT_3D_ATOMIC, "occupancy_img") .fragment_source("eevee_surf_occupancy_frag.glsl") .additional_info("eevee_global_ubo", "eevee_sampling_data"); diff --git a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_shadow_info.hh b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_shadow_info.hh index 23d3bd2aa67..f0834cdd063 100644 --- a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_shadow_info.hh +++ b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_shadow_info.hh @@ -205,7 +205,7 @@ GPU_SHADER_CREATE_INFO(eevee_shadow_page_clear) .image(SHADOW_ATLAS_IMG_SLOT, GPU_R32UI, Qualifier::READ_WRITE, - ImageType::UINT_2D_ARRAY, + ImageType::UINT_2D_ARRAY_ATOMIC, "shadow_atlas_img"); /* TBDR clear implementation. */ @@ -260,6 +260,13 @@ GPU_SHADER_CREATE_INFO(eevee_shadow_page_tile_store) * \{ */ GPU_SHADER_CREATE_INFO(eevee_shadow_data) + /* SHADOW_READ_ATOMIC macro indicating shadow functions should use `usampler2DArrayAtomic` as + * the atlas type. */ + .define("SHADOW_READ_ATOMIC") + .sampler(SHADOW_ATLAS_TEX_SLOT, ImageType::UINT_2D_ARRAY_ATOMIC, "shadow_atlas_tx") + .sampler(SHADOW_TILEMAPS_TEX_SLOT, ImageType::UINT_2D, "shadow_tilemaps_tx"); + +GPU_SHADER_CREATE_INFO(eevee_shadow_data_non_atomic) .sampler(SHADOW_ATLAS_TEX_SLOT, ImageType::UINT_2D_ARRAY, "shadow_atlas_tx") .sampler(SHADOW_TILEMAPS_TEX_SLOT, ImageType::UINT_2D, "shadow_tilemaps_tx"); diff --git a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_tracing_info.hh b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_tracing_info.hh index 172ccb181dc..9b465632f95 100644 --- a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_tracing_info.hh +++ b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_tracing_info.hh @@ -26,16 +26,20 @@ /** \name Ray tracing Pipeline * \{ */ +#define image_out(slot, format, type, name) \ + image(slot, format, Qualifier::WRITE, type, name, Frequency::PASS) +#define image_in(slot, format, type, name) \ + image(slot, format, Qualifier::READ, type, name, Frequency::PASS) + GPU_SHADER_CREATE_INFO(eevee_ray_tile_classify) .do_static_compilation(true) .local_group_size(RAYTRACE_GROUP_SIZE, RAYTRACE_GROUP_SIZE) .additional_info("eevee_shared", "eevee_gbuffer_data", "eevee_global_ubo") .typedef_source("draw_shader_shared.h") - .image(0, RAYTRACE_TILEMASK_FORMAT, Qualifier::WRITE, ImageType::UINT_2D, "tile_mask_img") - .storage_buf(0, Qualifier::WRITE, "DispatchCommand", "ray_dispatch_buf") - .storage_buf(1, Qualifier::WRITE, "DispatchCommand", "ray_denoise_dispatch_buf") - .storage_buf(2, Qualifier::WRITE, "DispatchCommand", "horizon_dispatch_buf") - .storage_buf(3, Qualifier::WRITE, "DispatchCommand", "horizon_denoise_dispatch_buf") + .image_out(0, RAYTRACE_TILEMASK_FORMAT, ImageType::UINT_2D_ARRAY, "tile_raytrace_denoise_img") + .image_out(1, RAYTRACE_TILEMASK_FORMAT, ImageType::UINT_2D_ARRAY, "tile_raytrace_tracing_img") + .image_out(2, RAYTRACE_TILEMASK_FORMAT, ImageType::UINT_2D_ARRAY, "tile_horizon_denoise_img") + .image_out(3, RAYTRACE_TILEMASK_FORMAT, ImageType::UINT_2D_ARRAY, "tile_horizon_tracing_img") .compute_source("eevee_ray_tile_classify_comp.glsl"); GPU_SHADER_CREATE_INFO(eevee_ray_tile_compact) @@ -43,14 +47,17 @@ GPU_SHADER_CREATE_INFO(eevee_ray_tile_compact) .local_group_size(RAYTRACE_GROUP_SIZE, RAYTRACE_GROUP_SIZE) .additional_info("eevee_shared", "eevee_global_ubo") .typedef_source("draw_shader_shared.h") - .image(0, RAYTRACE_TILEMASK_FORMAT, Qualifier::READ, ImageType::UINT_2D, "tile_mask_img") - .storage_buf(0, Qualifier::READ_WRITE, "DispatchCommand", "ray_dispatch_buf") - .storage_buf(1, Qualifier::READ_WRITE, "DispatchCommand", "ray_denoise_dispatch_buf") - .storage_buf(2, Qualifier::READ_WRITE, "DispatchCommand", "horizon_dispatch_buf") + .image_in(0, RAYTRACE_TILEMASK_FORMAT, ImageType::UINT_2D_ARRAY, "tile_raytrace_denoise_img") + .image_in(1, RAYTRACE_TILEMASK_FORMAT, ImageType::UINT_2D_ARRAY, "tile_raytrace_tracing_img") + .image_in(2, RAYTRACE_TILEMASK_FORMAT, ImageType::UINT_2D_ARRAY, "tile_horizon_denoise_img") + .image_in(3, RAYTRACE_TILEMASK_FORMAT, ImageType::UINT_2D_ARRAY, "tile_horizon_tracing_img") + .storage_buf(0, Qualifier::READ_WRITE, "DispatchCommand", "raytrace_tracing_dispatch_buf") + .storage_buf(1, Qualifier::READ_WRITE, "DispatchCommand", "raytrace_denoise_dispatch_buf") + .storage_buf(2, Qualifier::READ_WRITE, "DispatchCommand", "horizon_tracing_dispatch_buf") .storage_buf(3, Qualifier::READ_WRITE, "DispatchCommand", "horizon_denoise_dispatch_buf") - .storage_buf(4, Qualifier::WRITE, "uint", "ray_tiles_buf[]") - .storage_buf(5, Qualifier::WRITE, "uint", "ray_denoise_tiles_buf[]") - .storage_buf(6, Qualifier::WRITE, "uint", "horizon_tiles_buf[]") + .storage_buf(4, Qualifier::WRITE, "uint", "raytrace_tracing_tiles_buf[]") + .storage_buf(5, Qualifier::WRITE, "uint", "raytrace_denoise_tiles_buf[]") + .storage_buf(6, Qualifier::WRITE, "uint", "horizon_tracing_tiles_buf[]") .storage_buf(7, Qualifier::WRITE, "uint", "horizon_denoise_tiles_buf[]") .compute_source("eevee_ray_tile_compact_comp.glsl"); @@ -129,7 +136,7 @@ GPU_SHADER_CREATE_INFO(eevee_ray_denoise_spatial) .image(3, RAYTRACE_RADIANCE_FORMAT, Qualifier::WRITE, ImageType::FLOAT_2D, "out_radiance_img") .image(4, RAYTRACE_VARIANCE_FORMAT, Qualifier::WRITE, ImageType::FLOAT_2D, "out_variance_img") .image(5, GPU_R32F, Qualifier::WRITE, ImageType::FLOAT_2D, "out_hit_depth_img") - .image(6, RAYTRACE_TILEMASK_FORMAT, Qualifier::READ, ImageType::UINT_2D, "tile_mask_img") + .image(6, RAYTRACE_TILEMASK_FORMAT, Qualifier::READ, ImageType::UINT_2D_ARRAY, "tile_mask_img") .storage_buf(4, Qualifier::READ, "uint", "tiles_coord_buf[]") .compute_source("eevee_ray_denoise_spatial_comp.glsl"); @@ -141,7 +148,7 @@ GPU_SHADER_CREATE_INFO(eevee_ray_denoise_temporal) .additional_info("eevee_shared", "eevee_global_ubo", "draw_view") .sampler(0, ImageType::FLOAT_2D, "radiance_history_tx") .sampler(1, ImageType::FLOAT_2D, "variance_history_tx") - .sampler(2, ImageType::UINT_2D, "tilemask_history_tx") + .sampler(2, ImageType::UINT_2D_ARRAY, "tilemask_history_tx") .sampler(3, ImageType::DEPTH_2D, "depth_tx") .image(0, GPU_R32F, Qualifier::READ, ImageType::FLOAT_2D, "hit_depth_img") .image(1, RAYTRACE_RADIANCE_FORMAT, Qualifier::READ, ImageType::FLOAT_2D, "in_radiance_img") @@ -162,7 +169,7 @@ GPU_SHADER_CREATE_INFO(eevee_ray_denoise_bilateral) .image(1, RAYTRACE_RADIANCE_FORMAT, Qualifier::READ, ImageType::FLOAT_2D, "in_radiance_img") .image(2, RAYTRACE_RADIANCE_FORMAT, Qualifier::WRITE, ImageType::FLOAT_2D, "out_radiance_img") .image(3, RAYTRACE_VARIANCE_FORMAT, Qualifier::READ, ImageType::FLOAT_2D, "in_variance_img") - .image(6, RAYTRACE_TILEMASK_FORMAT, Qualifier::READ, ImageType::UINT_2D, "tile_mask_img") + .image(6, RAYTRACE_TILEMASK_FORMAT, Qualifier::READ, ImageType::UINT_2D_ARRAY, "tile_mask_img") .storage_buf(4, Qualifier::READ, "uint", "tiles_coord_buf[]") .compute_source("eevee_ray_denoise_bilateral_comp.glsl"); @@ -210,8 +217,11 @@ GPU_SHADER_CREATE_INFO(eevee_horizon_denoise) 2, RAYTRACE_RADIANCE_FORMAT, Qualifier::READ, ImageType::FLOAT_2D, "horizon_radiance_img") .image(3, GPU_R8, Qualifier::READ, ImageType::FLOAT_2D, "horizon_occlusion_img") .image(4, RAYTRACE_RADIANCE_FORMAT, Qualifier::READ_WRITE, ImageType::FLOAT_2D, "radiance_img") - .image(6, RAYTRACE_TILEMASK_FORMAT, Qualifier::READ, ImageType::UINT_2D, "tile_mask_img") + .image(6, RAYTRACE_TILEMASK_FORMAT, Qualifier::READ, ImageType::UINT_2D_ARRAY, "tile_mask_img") .storage_buf(7, Qualifier::READ, "uint", "tiles_coord_buf[]") .compute_source("eevee_horizon_denoise_comp.glsl"); +#undef image_out +#undef image_in + /** \} */ diff --git a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_volume_info.hh b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_volume_info.hh index 13a79bc211f..d38fa35b6d2 100644 --- a/source/blender/draw/engines/eevee_next/shaders/infos/eevee_volume_info.hh +++ b/source/blender/draw/engines/eevee_next/shaders/infos/eevee_volume_info.hh @@ -72,7 +72,7 @@ GPU_SHADER_CREATE_INFO(eevee_volume_occupancy_convert) .image(VOLUME_OCCUPANCY_SLOT, GPU_R32UI, Qualifier::READ_WRITE, - ImageType::UINT_3D, + ImageType::UINT_3D_ATOMIC, "occupancy_img") .fragment_source("eevee_occupancy_convert_frag.glsl") .do_static_compilation(true); diff --git a/source/blender/draw/engines/gpencil/gpencil_cache_utils.cc b/source/blender/draw/engines/gpencil/gpencil_cache_utils.cc index 019c0f1fb8e..4fb0c19f84f 100644 --- a/source/blender/draw/engines/gpencil/gpencil_cache_utils.cc +++ b/source/blender/draw/engines/gpencil/gpencil_cache_utils.cc @@ -68,7 +68,7 @@ GPENCIL_tObject *gpencil_object_cache_add(GPENCIL_PrivateData *pd, Object *ob) * computationally heavy and should go into the GPData evaluation. */ const std::optional> bounds = BKE_gpencil_data_minmax(gpd).value_or( Bounds(float3(0))); - float3 size = bounds->max - bounds->min; + float3 size = (bounds->max - bounds->min) * 0.5f; float3 center = math::midpoint(bounds->min, bounds->max); /* Convert bbox to matrix */ float mat[4][4]; diff --git a/source/blender/draw/engines/gpencil/gpencil_object.hh b/source/blender/draw/engines/gpencil/gpencil_object.hh index 34cd34db0e2..8d82b6a5c9a 100644 --- a/source/blender/draw/engines/gpencil/gpencil_object.hh +++ b/source/blender/draw/engines/gpencil/gpencil_object.hh @@ -129,7 +129,7 @@ class ObjectModule { bool object_has_vfx = false; /* TODO: `vfx.object_has_vfx(gpd);`. */ uint material_offset = materials_.object_offset_get(); - for (auto i : IndexRange(BKE_object_material_count_eval(object))) { + for (const int i : IndexRange(BKE_object_material_count_eval(object))) { materials_.sync(object, i, do_material_holdout); } @@ -268,6 +268,10 @@ class ObjectModule { return objects_buf_.size() > 0; } + /** + * Define a matrix that will be used to render a triangle to merge the depth of the rendered + * gpencil object with the rest of the scene. + */ float4x4 get_object_plane_mat(const Object &object) { using namespace math; @@ -309,8 +313,6 @@ class ObjectModule { plane_normal = normalize(transform_direction(bbox_mat_inv, plane_normal)); plane_normal = normalize(transform_direction(bbox_mat_inv_t, plane_normal)); - /* Define a matrix that will be used to render a triangle to merge the depth of the rendered - * gpencil object with the rest of the scene. */ float4x4 plane_mat = from_up_axis(plane_normal); float radius = length(transform_direction(object_to_world, size)); plane_mat = scale(plane_mat, float3(radius)); diff --git a/source/blender/draw/engines/overlay/overlay_armature.cc b/source/blender/draw/engines/overlay/overlay_armature.cc index e77e376fb11..a5662bba3e6 100644 --- a/source/blender/draw/engines/overlay/overlay_armature.cc +++ b/source/blender/draw/engines/overlay/overlay_armature.cc @@ -43,7 +43,7 @@ #include "UI_resources.hh" #include "draw_common.h" -#include "draw_manager_text.h" +#include "draw_manager_text.hh" #include "overlay_private.hh" diff --git a/source/blender/draw/engines/overlay/overlay_background.cc b/source/blender/draw/engines/overlay/overlay_background.cc index b6ada81667d..0214c1901b2 100644 --- a/source/blender/draw/engines/overlay/overlay_background.cc +++ b/source/blender/draw/engines/overlay/overlay_background.cc @@ -10,7 +10,7 @@ #include "UI_resources.hh" -#include "draw_manager_text.h" +#include "draw_manager_text.hh" #include "overlay_private.hh" void OVERLAY_background_cache_init(OVERLAY_Data *vedata) diff --git a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc index 0e183b16a4e..4e8cf4e9349 100644 --- a/source/blender/draw/engines/overlay/overlay_edit_mesh.cc +++ b/source/blender/draw/engines/overlay/overlay_edit_mesh.cc @@ -17,7 +17,7 @@ #include "BKE_object.hh" #include "draw_cache_impl.hh" -#include "draw_manager_text.h" +#include "draw_manager_text.hh" #include "overlay_private.hh" diff --git a/source/blender/draw/engines/overlay/overlay_edit_uv.cc b/source/blender/draw/engines/overlay/overlay_edit_uv.cc index 670041a57d0..faaf319b4ee 100644 --- a/source/blender/draw/engines/overlay/overlay_edit_uv.cc +++ b/source/blender/draw/engines/overlay/overlay_edit_uv.cc @@ -8,7 +8,7 @@ #include "DRW_render.h" #include "draw_cache_impl.hh" -#include "draw_manager_text.h" +#include "draw_manager_text.hh" #include "BLI_math_color.h" diff --git a/source/blender/draw/engines/overlay/overlay_extra.cc b/source/blender/draw/engines/overlay/overlay_extra.cc index d067d71a708..0a28d3742ac 100644 --- a/source/blender/draw/engines/overlay/overlay_extra.cc +++ b/source/blender/draw/engines/overlay/overlay_extra.cc @@ -48,7 +48,7 @@ #include "overlay_private.hh" #include "draw_common.h" -#include "draw_manager_text.h" +#include "draw_manager_text.hh" void OVERLAY_extra_cache_init(OVERLAY_Data *vedata) { @@ -366,7 +366,7 @@ static void OVERLAY_bounds(OVERLAY_ExtraCallBuffers *cb, const Bounds bounds = BKE_object_boundbox_get(ob).value_or( Bounds(float3(-1.0f), float3(1.0f))); - float3 size = bounds.max - bounds.min; + float3 size = (bounds.max - bounds.min) * 0.5f; const float3 center = around_origin ? float3(0) : math::midpoint(bounds.min, bounds.max); switch (boundtype) { diff --git a/source/blender/draw/engines/overlay/overlay_gpencil_legacy.cc b/source/blender/draw/engines/overlay/overlay_gpencil_legacy.cc index 908c66363fd..08409b728f1 100644 --- a/source/blender/draw/engines/overlay/overlay_gpencil_legacy.cc +++ b/source/blender/draw/engines/overlay/overlay_gpencil_legacy.cc @@ -21,7 +21,7 @@ #include "overlay_private.hh" #include "draw_common.h" -#include "draw_manager_text.h" +#include "draw_manager_text.hh" void OVERLAY_edit_gpencil_legacy_cache_init(OVERLAY_Data *vedata) { diff --git a/source/blender/draw/engines/overlay/overlay_motion_path.cc b/source/blender/draw/engines/overlay/overlay_motion_path.cc index 8832ba27411..6694308396e 100644 --- a/source/blender/draw/engines/overlay/overlay_motion_path.cc +++ b/source/blender/draw/engines/overlay/overlay_motion_path.cc @@ -19,7 +19,7 @@ #include "UI_resources.hh" -#include "draw_manager_text.h" +#include "draw_manager_text.hh" #include "overlay_private.hh" diff --git a/source/blender/draw/engines/overlay/overlay_next_private.hh b/source/blender/draw/engines/overlay/overlay_next_private.hh index 0563390f531..07e522dd613 100644 --- a/source/blender/draw/engines/overlay/overlay_next_private.hh +++ b/source/blender/draw/engines/overlay/overlay_next_private.hh @@ -256,7 +256,7 @@ template struct ShapeInstanceBuf : private select::Selec void end_sync(PassSimple &pass, GPUBatch *shape) { - if (data_buf.size() == 0) { + if (data_buf.is_empty()) { return; } this->select_bind(pass); diff --git a/source/blender/draw/engines/overlay/overlay_outline.cc b/source/blender/draw/engines/overlay/overlay_outline.cc index 92b2588e017..5c78e19e832 100644 --- a/source/blender/draw/engines/overlay/overlay_outline.cc +++ b/source/blender/draw/engines/overlay/overlay_outline.cc @@ -38,7 +38,7 @@ static void gpencil_depth_plane(Object *ob, float r_plane[4]) * computationally heavy and should go into the GPData evaluation. */ const std::optional> bounds = BKE_object_boundbox_get(ob).value_or( Bounds(float3(0))); - float3 size = bounds->max - bounds->min; + float3 size = (bounds->max - bounds->min) * 0.5f; float3 center = math::midpoint(bounds->min, bounds->max); /* Convert bbox to matrix */ float mat[4][4]; diff --git a/source/blender/draw/intern/draw_attributes.hh b/source/blender/draw/intern/draw_attributes.hh index bdcb971fa5c..d754903bea9 100644 --- a/source/blender/draw/intern/draw_attributes.hh +++ b/source/blender/draw/intern/draw_attributes.hh @@ -17,11 +17,8 @@ #include "BKE_attribute.h" #include "BLI_sys_types.h" -#include "BLI_threads.h" -#include "BLI_utildefines.h" #include "GPU_shader.h" -#include "GPU_vertex_format.h" struct DRW_AttributeRequest { eCustomDataType cd_type; @@ -50,7 +47,7 @@ struct DRW_MeshCDMask { /* Keep `DRW_MeshCDMask` struct within a `uint32_t`. * bit-wise and atomic operations are used to compare and update the struct. * See `mesh_cd_layers_type_*` functions. */ -BLI_STATIC_ASSERT(sizeof(DRW_MeshCDMask) <= sizeof(uint32_t), "DRW_MeshCDMask exceeds 32 bits") +static_assert(sizeof(DRW_MeshCDMask) <= sizeof(uint32_t), "DRW_MeshCDMask exceeds 32 bits"); void drw_attributes_clear(DRW_Attributes *attributes); diff --git a/source/blender/draw/intern/draw_cache_extract.hh b/source/blender/draw/intern/draw_cache_extract.hh index 0dfe45d7c1f..cc9633f1825 100644 --- a/source/blender/draw/intern/draw_cache_extract.hh +++ b/source/blender/draw/intern/draw_cache_extract.hh @@ -8,24 +8,15 @@ #pragma once -#include - #include "BLI_utildefines.h" -#include "DNA_customdata_types.h" -#include "DNA_mesh_types.h" -#include "DNA_view3d_enums.h" - -#include "BKE_attribute.h" -#include "BKE_object.hh" - -#include "GPU_batch.h" -#include "GPU_index_buffer.h" -#include "GPU_vertex_buffer.h" +#include "GPU_shader.h" #include "draw_attributes.hh" struct DRWSubdivCache; +struct GPUBatch; +struct GPUIndexBuf; struct MeshRenderData; struct TaskGraph; @@ -73,16 +64,7 @@ enum eMRDataType { }; ENUM_OPERATORS(eMRDataType, MR_DATA_POLYS_SORTED) -BLI_INLINE int mesh_render_mat_len_get(const Object *object, const Mesh *mesh) -{ - if (mesh->edit_mesh != NULL) { - const Mesh *editmesh_eval_final = BKE_object_get_editmesh_eval_final(object); - if (editmesh_eval_final != NULL) { - return std::max(1, editmesh_eval_final->totcol); - } - } - return std::max(1, mesh->totcol); -} +int mesh_render_mat_len_get(const Object *object, const Mesh *mesh); struct MeshBufferList { /* Every VBO below contains at least enough data for every loop in the mesh @@ -256,7 +238,7 @@ struct MeshBufferCache { mbc == &batch_cache.final || mbc == &batch_cache.cage || mbc == &batch_cache.uv_cage; \ mbc = (mbc == &batch_cache.final) ? \ &batch_cache.cage : \ - ((mbc == &batch_cache.cage) ? &batch_cache.uv_cage : NULL)) + ((mbc == &batch_cache.cage) ? &batch_cache.uv_cage : nullptr)) struct MeshBatchCache { MeshBufferCache final, cage, uv_cage; diff --git a/source/blender/draw/intern/draw_cache_extract_mesh.cc b/source/blender/draw/intern/draw_cache_extract_mesh.cc index 5e2f6d7e3b5..cf9aac07d44 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh.cc +++ b/source/blender/draw/intern/draw_cache_extract_mesh.cc @@ -22,6 +22,7 @@ #include "BLI_vector.hh" #include "BKE_editmesh.hh" +#include "BKE_object.hh" #include "GPU_capabilities.h" @@ -37,6 +38,17 @@ # include "PIL_time_utildefines.h" #endif +int mesh_render_mat_len_get(const Object *object, const Mesh *mesh) +{ + if (mesh->edit_mesh != nullptr) { + const Mesh *editmesh_eval_final = BKE_object_get_editmesh_eval_final(object); + if (editmesh_eval_final != nullptr) { + return std::max(1, editmesh_eval_final->totcol); + } + } + return std::max(1, mesh->totcol); +} + namespace blender::draw { /* ---------------------------------------------------------------------- */ @@ -260,6 +272,7 @@ static void extract_range_iter_looptri_bm(void *__restrict userdata, void *extract_data = tls->userdata_chunk; const MeshRenderData &mr = *data->mr; BMLoop **elt = ((BMLoop * (*)[3]) data->elems)[iter]; + BLI_assert(iter < mr.edit_bmesh->tottri); for (const ExtractorRunData &run_data : data->extractors) { run_data.extractor->iter_looptri_bm( mr, elt, iter, POINTER_OFFSET(extract_data, run_data.data_offset)); @@ -274,10 +287,10 @@ static void extract_range_iter_looptri_mesh(void *__restrict userdata, const ExtractorIterData *data = static_cast(userdata); const MeshRenderData &mr = *data->mr; - const MLoopTri *mlt = &((const MLoopTri *)data->elems)[iter]; + const MLoopTri *lt = &((const MLoopTri *)data->elems)[iter]; for (const ExtractorRunData &run_data : data->extractors) { run_data.extractor->iter_looptri_mesh( - mr, mlt, iter, POINTER_OFFSET(extract_data, run_data.data_offset)); + mr, lt, iter, POINTER_OFFSET(extract_data, run_data.data_offset)); } } @@ -686,6 +699,7 @@ void mesh_buffer_cache_create_requested(TaskGraph *task_graph, mr->use_hide = use_hide; mr->use_subsurf_fdots = mr->mesh && !mr->mesh->runtime->subsurf_face_dot_tags.is_empty(); mr->use_final_mesh = do_final; + mr->use_simplify_normals = (scene->r.mode & R_SIMPLIFY) && (scene->r.mode & R_SIMPLIFY_NORMALS); #ifdef DEBUG_TIME double rdata_end = PIL_check_seconds_timer(); diff --git a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc index baca9062361..221704e3732 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc +++ b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc @@ -23,6 +23,7 @@ #include "BKE_editmesh_cache.hh" #include "BKE_mesh.hh" #include "BKE_mesh_runtime.hh" +#include "BKE_object.hh" #include "GPU_batch.h" @@ -191,9 +192,9 @@ static void accumululate_material_counts_mesh( const MeshRenderData &mr, threading::EnumerableThreadSpecific> &all_tri_counts) { const OffsetIndices faces = mr.faces; - if (!mr.material_indices) { - if (mr.use_hide && mr.hide_poly) { - const Span hide_poly(mr.hide_poly, mr.face_len); + if (mr.material_indices.is_empty()) { + if (mr.use_hide && !mr.hide_poly.is_empty()) { + const Span hide_poly = mr.hide_poly; all_tri_counts.local().first() = threading::parallel_reduce( faces.index_range(), 4096, @@ -214,11 +215,11 @@ static void accumululate_material_counts_mesh( return; } - const Span material_indices(mr.material_indices, mr.face_len); + const Span material_indices = mr.material_indices; threading::parallel_for(material_indices.index_range(), 1024, [&](const IndexRange range) { Array &tri_counts = all_tri_counts.local(); const int last_index = tri_counts.size() - 1; - if (mr.use_hide && mr.hide_poly) { + if (mr.use_hide && !mr.hide_poly.is_empty()) { for (const int i : range) { if (!mr.hide_poly[i]) { const int mat = std::clamp(material_indices[i], 0, last_index); @@ -297,8 +298,10 @@ static void mesh_render_data_faces_sorted_build(MeshRenderData &mr, MeshBufferCa } else { for (int i = 0; i < mr.face_len; i++) { - if (!(mr.use_hide && mr.hide_poly && mr.hide_poly[i])) { - const int mat = mr.material_indices ? clamp_i(mr.material_indices[i], 0, mat_last) : 0; + if (!(mr.use_hide && !mr.hide_poly.is_empty() && mr.hide_poly[i])) { + const int mat = mr.material_indices.is_empty() ? + 0 : + clamp_i(mr.material_indices[i], 0, mat_last); tri_first_index[i] = mat_tri_offs[mat]; mat_tri_offs[mat] += mr.faces[i].size() - 2; } @@ -335,6 +338,82 @@ void mesh_render_data_update_faces_sorted(MeshRenderData &mr, /** \name Mesh/BMesh Interface (indirect, partially cached access to complex data). * \{ */ +const Mesh *editmesh_final_or_this(const Object *object, const Mesh *mesh) +{ + if (mesh->edit_mesh != nullptr) { + Mesh *editmesh_eval_final = BKE_object_get_editmesh_eval_final(object); + if (editmesh_eval_final != nullptr) { + return editmesh_eval_final; + } + } + + return mesh; +} + +const CustomData *mesh_cd_ldata_get_from_mesh(const Mesh *mesh) +{ + switch (mesh->runtime->wrapper_type) { + case ME_WRAPPER_TYPE_SUBD: + case ME_WRAPPER_TYPE_MDATA: + return &mesh->loop_data; + break; + case ME_WRAPPER_TYPE_BMESH: + return &mesh->edit_mesh->bm->ldata; + break; + } + + BLI_assert(0); + return &mesh->loop_data; +} + +const CustomData *mesh_cd_pdata_get_from_mesh(const Mesh *mesh) +{ + switch (mesh->runtime->wrapper_type) { + case ME_WRAPPER_TYPE_SUBD: + case ME_WRAPPER_TYPE_MDATA: + return &mesh->face_data; + break; + case ME_WRAPPER_TYPE_BMESH: + return &mesh->edit_mesh->bm->pdata; + break; + } + + BLI_assert(0); + return &mesh->face_data; +} + +const CustomData *mesh_cd_edata_get_from_mesh(const Mesh *mesh) +{ + switch (mesh->runtime->wrapper_type) { + case ME_WRAPPER_TYPE_SUBD: + case ME_WRAPPER_TYPE_MDATA: + return &mesh->edge_data; + break; + case ME_WRAPPER_TYPE_BMESH: + return &mesh->edit_mesh->bm->edata; + break; + } + + BLI_assert(0); + return &mesh->edge_data; +} + +const CustomData *mesh_cd_vdata_get_from_mesh(const Mesh *mesh) +{ + switch (mesh->runtime->wrapper_type) { + case ME_WRAPPER_TYPE_SUBD: + case ME_WRAPPER_TYPE_MDATA: + return &mesh->vert_data; + break; + case ME_WRAPPER_TYPE_BMESH: + return &mesh->edit_mesh->bm->vdata; + break; + } + + BLI_assert(0); + return &mesh->vert_data; +} + void mesh_render_data_update_looptris(MeshRenderData &mr, const eMRIterType iter_type, const eMRDataType data_flag) @@ -413,8 +492,8 @@ void mesh_render_data_update_normals(MeshRenderData &mr, const eMRDataType data_ if (data_flag & (MR_DATA_POLY_NOR | MR_DATA_LOOP_NOR | MR_DATA_TAN_LOOP_NOR)) { mr.face_normals = mr.mesh->face_normals(); } - if (((data_flag & MR_DATA_LOOP_NOR) && - mr.mesh->normals_domain() == blender::bke::MeshNormalDomain::Corner) || + if (((data_flag & MR_DATA_LOOP_NOR) && !mr.use_simplify_normals && + mr.normals_domain == blender::bke::MeshNormalDomain::Corner) || (data_flag & MR_DATA_TAN_LOOP_NOR)) { mr.loop_normals = mr.mesh->corner_normals(); @@ -425,7 +504,8 @@ void mesh_render_data_update_normals(MeshRenderData &mr, const eMRDataType data_ if (data_flag & MR_DATA_POLY_NOR) { /* Use #BMFace.no instead. */ } - if (((data_flag & MR_DATA_LOOP_NOR) && bm_loop_normals_required(mr.bm)) || + if (((data_flag & MR_DATA_LOOP_NOR) && !mr.use_simplify_normals && + bm_loop_normals_required(mr.bm)) || (data_flag & MR_DATA_TAN_LOOP_NOR)) { @@ -475,6 +555,7 @@ MeshRenderData *mesh_render_data_create(Object *object, const bool do_uvedit, const ToolSettings *ts) { + using namespace blender; MeshRenderData *mr = MEM_new(__func__); mr->toolsettings = ts; mr->mat_len = mesh_render_mat_len_get(object, mesh); @@ -598,25 +679,21 @@ MeshRenderData *mesh_render_data_create(Object *object, mr->p_origindex = static_cast( CustomData_get_layer(&mr->mesh->face_data, CD_ORIGINDEX)); - mr->material_indices = static_cast( - CustomData_get_layer_named(&mr->mesh->face_data, CD_PROP_INT32, "material_index")); + mr->normals_domain = mr->mesh->normals_domain(); - mr->hide_vert = static_cast( - CustomData_get_layer_named(&mr->mesh->vert_data, CD_PROP_BOOL, ".hide_vert")); - mr->hide_edge = static_cast( - CustomData_get_layer_named(&mr->mesh->edge_data, CD_PROP_BOOL, ".hide_edge")); - mr->hide_poly = static_cast( - CustomData_get_layer_named(&mr->mesh->face_data, CD_PROP_BOOL, ".hide_poly")); + const bke::AttributeAccessor attributes = mr->mesh->attributes(); - mr->select_vert = static_cast( - CustomData_get_layer_named(&mr->mesh->vert_data, CD_PROP_BOOL, ".select_vert")); - mr->select_edge = static_cast( - CustomData_get_layer_named(&mr->mesh->edge_data, CD_PROP_BOOL, ".select_edge")); - mr->select_poly = static_cast( - CustomData_get_layer_named(&mr->mesh->face_data, CD_PROP_BOOL, ".select_poly")); + mr->material_indices = *attributes.lookup("material_index", ATTR_DOMAIN_FACE); - mr->sharp_faces = static_cast( - CustomData_get_layer_named(&mr->mesh->face_data, CD_PROP_BOOL, "sharp_face")); + mr->hide_vert = *attributes.lookup(".hide_vert", ATTR_DOMAIN_POINT); + mr->hide_edge = *attributes.lookup(".hide_edge", ATTR_DOMAIN_EDGE); + mr->hide_poly = *attributes.lookup(".hide_poly", ATTR_DOMAIN_FACE); + + mr->select_vert = *attributes.lookup(".select_vert", ATTR_DOMAIN_POINT); + mr->select_edge = *attributes.lookup(".select_edge", ATTR_DOMAIN_EDGE); + mr->select_poly = *attributes.lookup(".select_poly", ATTR_DOMAIN_FACE); + + mr->sharp_faces = *attributes.lookup("sharp_face", ATTR_DOMAIN_FACE); } else { /* #BMesh */ diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.cc b/source/blender/draw/intern/draw_cache_impl_mesh.cc index f3f693b9726..e186b1376d0 100644 --- a/source/blender/draw/intern/draw_cache_impl_mesh.cc +++ b/source/blender/draw/intern/draw_cache_impl_mesh.cc @@ -40,6 +40,7 @@ #include "BKE_mesh_runtime.hh" #include "BKE_mesh_tangent.hh" #include "BKE_modifier.hh" +#include "BKE_object.hh" #include "BKE_object_deform.h" #include "BKE_paint.hh" #include "BKE_pbvh_api.hh" @@ -591,7 +592,7 @@ static void mesh_batch_cache_init(Object *object, Mesh *mesh) if (cache->is_editmode == false) { // cache->edge_len = mesh_render_edges_len_get(mesh); - // cache->tri_len = mesh_render_looptri_len_get(mesh); + // cache->tri_len = mesh_render_looptris_len_get(mesh); // cache->face_len = mesh_render_faces_len_get(mesh); // cache->vert_len = mesh_render_verts_len_get(mesh); } @@ -1340,6 +1341,7 @@ void DRW_mesh_batch_cache_create_requested(TaskGraph *task_graph, const bool is_paint_mode, const bool use_hide) { + using namespace blender; BLI_assert(task_graph); const ToolSettings *ts = nullptr; if (scene) { @@ -1506,7 +1508,7 @@ void DRW_mesh_batch_cache_create_requested(TaskGraph *task_graph, const bool do_update_sculpt_normals = ob->sculpt && ob->sculpt->pbvh; if (do_update_sculpt_normals) { Mesh *mesh = static_cast(ob->data); - BKE_pbvh_update_normals(ob->sculpt->pbvh, mesh->runtime->subdiv_ccg.get()); + bke::pbvh::update_normals(*ob->sculpt->pbvh, mesh->runtime->subdiv_ccg.get()); } cache.batch_ready |= batch_requested; diff --git a/source/blender/draw/intern/draw_cache_impl_subdivision.cc b/source/blender/draw/intern/draw_cache_impl_subdivision.cc index 6f9b52eed37..bb05cc43bb9 100644 --- a/source/blender/draw/intern/draw_cache_impl_subdivision.cc +++ b/source/blender/draw/intern/draw_cache_impl_subdivision.cc @@ -37,11 +37,11 @@ #include "GPU_state.h" #include "GPU_vertex_buffer.h" -#include "opensubdiv_capi.h" -#include "opensubdiv_capi_type.h" -#include "opensubdiv_converter_capi.h" -#include "opensubdiv_evaluator_capi.h" -#include "opensubdiv_topology_refiner_capi.h" +#include "opensubdiv_capi.hh" +#include "opensubdiv_capi_type.hh" +#include "opensubdiv_converter_capi.hh" +#include "opensubdiv_evaluator_capi.hh" +#include "opensubdiv_topology_refiner_capi.hh" #include "draw_cache_extract.hh" #include "draw_cache_impl.hh" @@ -756,13 +756,15 @@ static void draw_subdiv_cache_extra_coarse_face_data_mesh(const MeshRenderData & const blender::OffsetIndices faces = mesh->faces(); for (const int i : faces.index_range()) { uint32_t flag = 0; - if (!(mr.sharp_faces && mr.sharp_faces[i])) { + if (!(mr.normals_domain == blender::bke::MeshNormalDomain::Face || + (!mr.sharp_faces.is_empty() && mr.sharp_faces[i]))) + { flag |= SUBDIV_COARSE_FACE_FLAG_SMOOTH; } - if (mr.select_poly && mr.select_poly[i]) { + if (!mr.select_poly.is_empty() && mr.select_poly[i]) { flag |= SUBDIV_COARSE_FACE_FLAG_SELECT; } - if (mr.hide_poly && mr.hide_poly[i]) { + if (!mr.hide_poly.is_empty() && mr.hide_poly[i]) { flag |= SUBDIV_COARSE_FACE_FLAG_HIDDEN; } flags_data[i] = uint(faces[i].start()) | (flag << SUBDIV_COARSE_FACE_FLAG_OFFSET); @@ -785,7 +787,9 @@ static void draw_subdiv_cache_extra_coarse_face_data_mapped(Mesh *mesh, /* Selection and hiding from bmesh. */ uint32_t flag = (f) ? compute_coarse_face_flag_bm(f, mr.efa_act) : 0; /* Smooth from mesh. */ - if (!(mr.sharp_faces && mr.sharp_faces[i])) { + if (!(mr.normals_domain == blender::bke::MeshNormalDomain::Face || + (!mr.sharp_faces.is_empty() && mr.sharp_faces[i]))) + { flag |= SUBDIV_COARSE_FACE_FLAG_SMOOTH; } flags_data[i] = uint(faces[i].start()) | (flag << SUBDIV_COARSE_FACE_FLAG_OFFSET); diff --git a/source/blender/draw/intern/draw_manager.hh b/source/blender/draw/intern/draw_manager.hh index 30e871554b8..01d6422fd7c 100644 --- a/source/blender/draw/intern/draw_manager.hh +++ b/source/blender/draw/intern/draw_manager.hh @@ -14,8 +14,9 @@ * \note It is currently work in progress and should replace the old global draw manager. */ -#include "BLI_listbase_wrapper.hh" +#include "BLI_map.hh" #include "BLI_sys_types.h" + #include "GPU_material.h" #include "draw_resource.hh" diff --git a/source/blender/draw/intern/draw_manager_c.cc b/source/blender/draw/intern/draw_manager_c.cc index 92e44a0312e..19fea9d1afa 100644 --- a/source/blender/draw/intern/draw_manager_c.cc +++ b/source/blender/draw/intern/draw_manager_c.cc @@ -80,7 +80,7 @@ #include "draw_manager.h" #include "draw_manager_profiling.hh" #include "draw_manager_testing.h" -#include "draw_manager_text.h" +#include "draw_manager_text.hh" #include "draw_shader.h" #include "draw_subdivision.hh" #include "draw_texture_pool.h" @@ -843,6 +843,7 @@ static bool id_type_can_have_drawdata(const short id_type) case ID_TE: case ID_MSK: case ID_MC: + case ID_IM: return true; /* no DrawData */ @@ -3375,7 +3376,7 @@ void DRW_xr_drawing_end() /** \name Internal testing API for gtests * \{ */ -#ifdef WITH_OPENGL_DRAW_TESTS +#ifdef WITH_GPU_DRAW_TESTS void DRW_draw_state_init_gtests(eGPUShaderConfig sh_cfg) { diff --git a/source/blender/draw/intern/draw_manager_data.cc b/source/blender/draw/intern/draw_manager_data.cc index 1dc52462a79..d33b59e4ae0 100644 --- a/source/blender/draw/intern/draw_manager_data.cc +++ b/source/blender/draw/intern/draw_manager_data.cc @@ -1307,6 +1307,7 @@ static void drw_sculpt_get_frustum_planes(const Object *ob, float planes[6][4]) static void drw_sculpt_generate_calls(DRWSculptCallbackData *scd) { + using namespace blender; /* PBVH should always exist for non-empty meshes, created by depsgraph eval. */ PBVH *pbvh = (scd->ob->sculpt) ? scd->ob->sculpt->pbvh : nullptr; if (!pbvh) { @@ -1363,7 +1364,7 @@ static void drw_sculpt_generate_calls(DRWSculptCallbackData *scd) } Mesh *mesh = static_cast(scd->ob->data); - BKE_pbvh_update_normals(pbvh, mesh->runtime->subdiv_ccg.get()); + bke::pbvh::update_normals(*pbvh, mesh->runtime->subdiv_ccg.get()); BKE_pbvh_draw_cb( *mesh, diff --git a/source/blender/draw/intern/draw_manager_testing.h b/source/blender/draw/intern/draw_manager_testing.h index 276680ed74d..faa45cc7d59 100644 --- a/source/blender/draw/intern/draw_manager_testing.h +++ b/source/blender/draw/intern/draw_manager_testing.h @@ -16,7 +16,7 @@ extern "C" { #endif -#ifdef WITH_OPENGL_DRAW_TESTS +#ifdef WITH_GPU_DRAW_TESTS void DRW_draw_state_init_gtests(eGPUShaderConfig sh_cfg); #endif diff --git a/source/blender/draw/intern/draw_manager_text.cc b/source/blender/draw/intern/draw_manager_text.cc index 4eea4b074c0..7e219aef1d5 100644 --- a/source/blender/draw/intern/draw_manager_text.cc +++ b/source/blender/draw/intern/draw_manager_text.cc @@ -42,7 +42,7 @@ #include "BLF_api.h" #include "WM_api.hh" -#include "draw_manager_text.h" +#include "draw_manager_text.hh" #include "intern/bmesh_polygon.hh" struct ViewCachedString { @@ -425,13 +425,13 @@ void DRW_text_edit_mesh_measure_stats(ARegion *region, * without having to add an extra loop. */ int looptri_index = 0; BM_ITER_MESH_INDEX (f, &iter, em->bm, BM_FACES_OF_MESH, i) { - const int f_looptri_len = f->len - 2; + const int f_looptris_len = f->len - 2; if (BM_elem_flag_test(f, BM_ELEM_SELECT)) { n = 0; area = 0; zero_v3(vmid); BMLoop *(*l)[3] = &em->looptris[looptri_index]; - for (int j = 0; j < f_looptri_len; j++) { + for (int j = 0; j < f_looptris_len; j++) { if (use_coords) { copy_v3_v3(v1, vert_coords[BM_elem_index_get(l[j][0]->v)]); @@ -477,7 +477,7 @@ void DRW_text_edit_mesh_measure_stats(ARegion *region, DRW_text_cache_add(dt, vmid, numstr, numstr_len, 0, 0, txt_flag, col); } - looptri_index += f_looptri_len; + looptri_index += f_looptris_len; } } diff --git a/source/blender/draw/intern/draw_manager_text.h b/source/blender/draw/intern/draw_manager_text.hh similarity index 55% rename from source/blender/draw/intern/draw_manager_text.h rename to source/blender/draw/intern/draw_manager_text.hh index 20372f936b4..02c58a730ce 100644 --- a/source/blender/draw/intern/draw_manager_text.h +++ b/source/blender/draw/intern/draw_manager_text.hh @@ -6,11 +6,9 @@ * \ingroup draw */ -#pragma once +#include "BLI_sys_types.h" -#ifdef __cplusplus -extern "C" { -#endif +#pragma once struct ARegion; struct DRWTextStore; @@ -18,10 +16,10 @@ struct Object; struct UnitSettings; struct View3D; -struct DRWTextStore *DRW_text_cache_create(void); -void DRW_text_cache_destroy(struct DRWTextStore *dt); +DRWTextStore *DRW_text_cache_create(); +void DRW_text_cache_destroy(DRWTextStore *dt); -void DRW_text_cache_add(struct DRWTextStore *dt, +void DRW_text_cache_add(DRWTextStore *dt, const float co[3], const char *str, int str_len, @@ -30,12 +28,12 @@ void DRW_text_cache_add(struct DRWTextStore *dt, short flag, const uchar col[4]); -void DRW_text_cache_draw(struct DRWTextStore *dt, struct ARegion *region, struct View3D *v3d); +void DRW_text_cache_draw(DRWTextStore *dt, ARegion *region, View3D *v3d); -void DRW_text_edit_mesh_measure_stats(struct ARegion *region, - struct View3D *v3d, - struct Object *ob, - const struct UnitSettings *unit); +void DRW_text_edit_mesh_measure_stats(ARegion *region, + View3D *v3d, + Object *ob, + const UnitSettings *unit); enum { // DRW_UNUSED_1 = (1 << 0), /* dirty */ @@ -47,8 +45,4 @@ enum { /* `draw_manager.cc` */ -struct DRWTextStore *DRW_text_cache_ensure(void); - -#ifdef __cplusplus -} -#endif +DRWTextStore *DRW_text_cache_ensure(); diff --git a/source/blender/draw/intern/draw_pass.hh b/source/blender/draw/intern/draw_pass.hh index 9a71da49ef5..f008d9a17ce 100644 --- a/source/blender/draw/intern/draw_pass.hh +++ b/source/blender/draw/intern/draw_pass.hh @@ -40,12 +40,16 @@ * if any of these reference becomes invalid. */ -#include "BKE_image.h" +#include "BLI_listbase_wrapper.hh" #include "BLI_vector.hh" -#include "DRW_gpu_wrapper.hh" + +#include "BKE_image.h" + #include "GPU_debug.h" #include "GPU_material.h" +#include "DRW_gpu_wrapper.hh" + #include "draw_command.hh" #include "draw_handle.hh" #include "draw_manager.hh" diff --git a/source/blender/draw/intern/draw_pbvh.cc b/source/blender/draw/intern/draw_pbvh.cc index d8d996094ac..faeec89b86f 100644 --- a/source/blender/draw/intern/draw_pbvh.cc +++ b/source/blender/draw/intern/draw_pbvh.cc @@ -127,13 +127,13 @@ void extract_data_vert_faces(const PBVH_GPU_Args &args, const Span attribute, using Converter = AttributeConverter; using VBOType = typename Converter::VBOType; const Span corner_verts = args.corner_verts; - const Span looptris = args.mlooptri; + const Span looptris = args.looptris; const Span looptri_faces = args.looptri_faces; - const bool *hide_poly = args.hide_poly; + const Span hide_poly = args.hide_poly; VBOType *data = static_cast(GPU_vertbuf_get_data(&vbo)); for (const int looptri_i : args.prim_indices) { - if (hide_poly && hide_poly[looptri_faces[looptri_i]]) { + if (!hide_poly.is_empty() && hide_poly[looptri_faces[looptri_i]]) { continue; } for (int i : IndexRange(3)) { @@ -151,12 +151,12 @@ void extract_data_face_faces(const PBVH_GPU_Args &args, const Span attribute, using VBOType = typename Converter::VBOType; const Span looptri_faces = args.looptri_faces; - const bool *hide_poly = args.hide_poly; + const Span hide_poly = args.hide_poly; VBOType *data = static_cast(GPU_vertbuf_get_data(&vbo)); for (const int looptri_i : args.prim_indices) { const int face = looptri_faces[looptri_i]; - if (hide_poly && hide_poly[face]) { + if (!hide_poly.is_empty() && hide_poly[face]) { continue; } std::fill_n(data, 3, Converter::convert(attribute[face])); @@ -170,13 +170,13 @@ void extract_data_corner_faces(const PBVH_GPU_Args &args, const Span attribut using Converter = AttributeConverter; using VBOType = typename Converter::VBOType; - const Span looptris = args.mlooptri; + const Span looptris = args.looptris; const Span looptri_faces = args.looptri_faces; - const bool *hide_poly = args.hide_poly; + const Span hide_poly = args.hide_poly; VBOType *data = static_cast(GPU_vertbuf_get_data(&vbo)); for (const int looptri_i : args.prim_indices) { - if (hide_poly && hide_poly[looptri_faces[looptri_i]]) { + if (!hide_poly.is_empty() && hide_poly[looptri_faces[looptri_i]]) { continue; } for (int i : IndexRange(3)) { @@ -338,7 +338,7 @@ struct PBVHBatches { switch (args.pbvh_type) { case PBVH_FACES: { - if (args.hide_poly) { + if (!args.hide_poly.is_empty()) { for (const int looptri_i : args.prim_indices) { if (!args.hide_poly[args.looptri_faces[looptri_i]]) { count++; @@ -351,11 +351,10 @@ struct PBVHBatches { break; } case PBVH_GRIDS: { - count = BKE_pbvh_count_grid_quads(args.subdiv_ccg->grid_hidden, - args.grid_indices.data(), - args.grid_indices.size(), - args.ccg_key.grid_size, - args.ccg_key.grid_size); + count = bke::pbvh::count_grid_quads(args.subdiv_ccg->grid_hidden, + args.grid_indices, + args.ccg_key.grid_size, + args.ccg_key.grid_size); break; } @@ -438,18 +437,19 @@ struct PBVHBatches { void fill_vbo_normal_faces(const PBVH_GPU_Args &args, GPUVertBuf &vert_buf) { - const bool *sharp_faces = static_cast( - CustomData_get_layer_named(args.face_data, CD_PROP_BOOL, "sharp_face")); + const bke::AttributeAccessor attributes = args.mesh->attributes(); + const VArraySpan sharp_faces = *attributes.lookup("sharp_face", ATTR_DOMAIN_FACE); + short4 *data = static_cast(GPU_vertbuf_get_data(&vert_buf)); short4 face_no; int last_face = -1; for (const int looptri_i : args.prim_indices) { const int face_i = args.looptri_faces[looptri_i]; - if (args.hide_poly && args.hide_poly[face_i]) { + if (!args.hide_poly.is_empty() && args.hide_poly[face_i]) { continue; } - if (sharp_faces && sharp_faces[face_i]) { + if (!sharp_faces.is_empty() && sharp_faces[face_i]) { if (face_i != last_face) { face_no = normal_float_to_short(args.face_normals[face_i]); last_face = face_i; @@ -459,7 +459,7 @@ struct PBVHBatches { } else { for (const int i : IndexRange(3)) { - const int vert = args.corner_verts[args.mlooptri[looptri_i].tri[i]]; + const int vert = args.corner_verts[args.looptris[looptri_i].tri[i]]; *data = normal_float_to_short(args.vert_normals[vert]); data++; } @@ -499,12 +499,14 @@ struct PBVHBatches { } case CustomRequest::Normal: { const Span grid_to_face_map = args.subdiv_ccg->grid_to_face_map; - const bool *sharp_faces = static_cast( - CustomData_get_layer_named(args.face_data, CD_PROP_BOOL, "sharp_face")); + const bke::AttributeAccessor attributes = args.mesh->attributes(); + const VArraySpan sharp_faces = *attributes.lookup("sharp_face", ATTR_DOMAIN_FACE); + foreach_grids([&](int /*x*/, int /*y*/, int grid_index, CCGElem *elems[4], int /*i*/) { float3 no(0.0f, 0.0f, 0.0f); - const bool smooth = !(sharp_faces && sharp_faces[grid_to_face_map[grid_index]]); + const bool smooth = !(!sharp_faces.is_empty() && + sharp_faces[grid_to_face_map[grid_index]]); if (smooth) { no = CCG_elem_no(&args.ccg_key, elems[0]); @@ -682,12 +684,12 @@ struct PBVHBatches { ATTR_DOMAIN_POINT)) { const VArraySpan mask_span(mask); const Span corner_verts = args.corner_verts; - const Span looptris = args.mlooptri; + const Span looptris = args.looptris; const Span looptri_faces = args.looptri_faces; - const bool *hide_poly = args.hide_poly; + const Span hide_poly = args.hide_poly; for (const int looptri_i : args.prim_indices) { - if (hide_poly && hide_poly[looptri_faces[looptri_i]]) { + if (!hide_poly.is_empty() && hide_poly[looptri_faces[looptri_i]]) { continue; } for (int i : IndexRange(3)) { @@ -711,7 +713,7 @@ struct PBVHBatches { uchar4 fset_color(UCHAR_MAX); for (const int looptri_i : args.prim_indices) { - if (args.hide_poly && args.hide_poly[args.looptri_faces[looptri_i]]) { + if (!args.hide_poly.is_empty() && args.hide_poly[args.looptri_faces[looptri_i]]) { continue; } const int face_i = args.looptri_faces[looptri_i]; @@ -1026,14 +1028,10 @@ struct PBVHBatches { void create_index_faces(const PBVH_GPU_Args &args) { - const int *mat_index = static_cast( - CustomData_get_layer_named(args.face_data, CD_PROP_INT32, "material_index")); - - if (mat_index && !args.prim_indices.is_empty()) { - const int looptri_i = args.prim_indices[0]; - const int face_i = args.looptri_faces[looptri_i]; - material_index = mat_index[face_i]; - } + const bke::AttributeAccessor attributes = args.mesh->attributes(); + const VArray material_indices = *attributes.lookup_or_default( + "material_index", ATTR_DOMAIN_FACE, 0); + material_index = material_indices[args.looptri_faces[args.prim_indices.first()]]; const Span edges = args.mesh->edges(); @@ -1041,12 +1039,12 @@ struct PBVHBatches { int edge_count = 0; for (const int looptri_i : args.prim_indices) { const int face_i = args.looptri_faces[looptri_i]; - if (args.hide_poly && args.hide_poly[face_i]) { + if (!args.hide_poly.is_empty() && args.hide_poly[face_i]) { continue; } const int3 real_edges = bke::mesh::looptri_get_real_edges( - edges, args.corner_verts, args.corner_edges, args.mlooptri[looptri_i]); + edges, args.corner_verts, args.corner_edges, args.looptris[looptri_i]); if (real_edges[0] != -1) { edge_count++; @@ -1065,12 +1063,12 @@ struct PBVHBatches { int vertex_i = 0; for (const int looptri_i : args.prim_indices) { const int face_i = args.looptri_faces[looptri_i]; - if (args.hide_poly && args.hide_poly[face_i]) { + if (!args.hide_poly.is_empty() && args.hide_poly[face_i]) { continue; } const int3 real_edges = bke::mesh::looptri_get_real_edges( - edges, args.corner_verts, args.corner_edges, args.mlooptri[looptri_i]); + edges, args.corner_verts, args.corner_edges, args.looptris[looptri_i]); if (real_edges[0] != -1) { GPU_indexbuf_add_line_verts(&elb_lines, vertex_i, vertex_i + 1); @@ -1114,18 +1112,15 @@ struct PBVHBatches { void create_index_grids(const PBVH_GPU_Args &args, bool do_coarse) { + const bke::AttributeAccessor attributes = args.mesh->attributes(); + const VArraySpan sharp_faces = *attributes.lookup("sharp_face", ATTR_DOMAIN_FACE); + const VArray material_indices = *attributes.lookup_or_default( + "material_index", ATTR_DOMAIN_FACE, 0); const BitGroupVector<> &grid_hidden = args.subdiv_ccg->grid_hidden; const Span grid_to_face_map = args.subdiv_ccg->grid_to_face_map; - const bool *sharp_faces = static_cast( - CustomData_get_layer_named(args.face_data, CD_PROP_BOOL, "sharp_face")); - const int *mat_index = static_cast( - CustomData_get_layer_named(args.face_data, CD_PROP_INT32, "material_index")); - - if (mat_index && !args.grid_indices.is_empty()) { - int face_i = BKE_subdiv_ccg_grid_to_face_index(*args.subdiv_ccg, args.grid_indices[0]); - material_index = mat_index[face_i]; - } + material_index = material_indices[BKE_subdiv_ccg_grid_to_face_index( + *args.subdiv_ccg, args.grid_indices.first())]; needs_tri_index = true; int gridsize = args.ccg_key.grid_size; @@ -1141,7 +1136,7 @@ struct PBVHBatches { } for (const int grid_index : args.grid_indices) { - bool smooth = !(sharp_faces && sharp_faces[grid_to_face_map[grid_index]]); + bool smooth = !(!sharp_faces.is_empty() && sharp_faces[grid_to_face_map[grid_index]]); if (!grid_hidden.is_empty()) { const BoundedBitSpan gh = grid_hidden[grid_index]; for (int y = 0; y < gridsize - 1; y += skip) { @@ -1167,8 +1162,8 @@ struct PBVHBatches { const CCGKey *key = &args.ccg_key; - uint visible_quad_len = BKE_pbvh_count_grid_quads( - grid_hidden, args.grid_indices.data(), totgrid, key->grid_size, display_gridsize); + uint visible_quad_len = bke::pbvh::count_grid_quads( + grid_hidden, args.grid_indices, key->grid_size, display_gridsize); GPU_indexbuf_init(&elb, GPU_PRIM_TRIS, 2 * visible_quad_len, INT_MAX); GPU_indexbuf_init(&elb_lines, diff --git a/source/blender/draw/intern/draw_sculpt.cc b/source/blender/draw/intern/draw_sculpt.cc index 329ee957190..512cb4736d8 100644 --- a/source/blender/draw/intern/draw_sculpt.cc +++ b/source/blender/draw/intern/draw_sculpt.cc @@ -97,7 +97,7 @@ static Vector sculpt_batches_get_ex(const Object *ob, } const Mesh *mesh = static_cast(ob->data); - BKE_pbvh_update_normals(pbvh, mesh->runtime->subdiv_ccg.get()); + bke::pbvh::update_normals(*pbvh, mesh->runtime->subdiv_ccg.get()); Vector result_batches; BKE_pbvh_draw_cb(*mesh, diff --git a/source/blender/draw/intern/draw_view_data.cc b/source/blender/draw/intern/draw_view_data.cc index c0bd2f11445..1faa1b5a495 100644 --- a/source/blender/draw/intern/draw_view_data.cc +++ b/source/blender/draw/intern/draw_view_data.cc @@ -15,7 +15,7 @@ #include "draw_instance_data.h" -#include "draw_manager_text.h" +#include "draw_manager_text.hh" #include "draw_manager.h" #include "draw_manager.hh" diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh.hh b/source/blender/draw/intern/mesh_extractors/extract_mesh.hh index 95eda3bdf36..165c102e67d 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh.hh +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh.hh @@ -11,20 +11,25 @@ #pragma once #include "BLI_math_vector_types.hh" +#include "BLI_virtual_array.hh" -#include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" -#include "DNA_object_types.h" #include "DNA_scene_types.h" -#include "BKE_customdata.hh" -#include "BKE_editmesh.hh" -#include "BKE_editmesh_cache.hh" #include "BKE_mesh.hh" +#include "bmesh.hh" + +#include "GPU_vertex_buffer.h" +#include "GPU_vertex_format.h" + #include "draw_cache_extract.hh" struct DRWSubdivCache; +struct BMVert; +struct BMEdge; +struct BMFace; +struct BMLoop; #define MIN_RANGE_LEN 1024 @@ -51,6 +56,7 @@ struct MeshRenderData { bool use_subsurf_fdots; bool use_final_mesh; bool hide_unmapped_edges; + bool use_simplify_normals; /** Use for #MeshStatVis calculation which use world-space coords. */ float obmat[4][4]; @@ -89,17 +95,20 @@ struct MeshRenderData { /* The triangulation of #Mesh faces, owned by the mesh. */ blender::Span looptris; blender::Span looptri_faces; - const int *material_indices; + blender::VArraySpan material_indices; + + blender::bke::MeshNormalDomain normals_domain; blender::Span vert_normals; blender::Span face_normals; blender::Span loop_normals; - const bool *hide_vert; - const bool *hide_edge; - const bool *hide_poly; - const bool *select_vert; - const bool *select_edge; - const bool *select_poly; - const bool *sharp_faces; + + blender::VArraySpan hide_vert; + blender::VArraySpan hide_edge; + blender::VArraySpan hide_poly; + blender::VArraySpan select_vert; + blender::VArraySpan select_edge; + blender::VArraySpan select_poly; + blender::VArraySpan sharp_faces; blender::Span loose_verts; blender::Span loose_edges; @@ -109,81 +118,11 @@ struct MeshRenderData { const char *default_color_name; }; -BLI_INLINE const Mesh *editmesh_final_or_this(const Object *object, const Mesh *mesh) -{ - if (mesh->edit_mesh != nullptr) { - Mesh *editmesh_eval_final = BKE_object_get_editmesh_eval_final(object); - if (editmesh_eval_final != nullptr) { - return editmesh_eval_final; - } - } - - return mesh; -} - -BLI_INLINE const CustomData *mesh_cd_ldata_get_from_mesh(const Mesh *mesh) -{ - switch (mesh->runtime->wrapper_type) { - case ME_WRAPPER_TYPE_SUBD: - case ME_WRAPPER_TYPE_MDATA: - return &mesh->loop_data; - break; - case ME_WRAPPER_TYPE_BMESH: - return &mesh->edit_mesh->bm->ldata; - break; - } - - BLI_assert(0); - return &mesh->loop_data; -} - -BLI_INLINE const CustomData *mesh_cd_pdata_get_from_mesh(const Mesh *mesh) -{ - switch (mesh->runtime->wrapper_type) { - case ME_WRAPPER_TYPE_SUBD: - case ME_WRAPPER_TYPE_MDATA: - return &mesh->face_data; - break; - case ME_WRAPPER_TYPE_BMESH: - return &mesh->edit_mesh->bm->pdata; - break; - } - - BLI_assert(0); - return &mesh->face_data; -} - -BLI_INLINE const CustomData *mesh_cd_edata_get_from_mesh(const Mesh *mesh) -{ - switch (mesh->runtime->wrapper_type) { - case ME_WRAPPER_TYPE_SUBD: - case ME_WRAPPER_TYPE_MDATA: - return &mesh->edge_data; - break; - case ME_WRAPPER_TYPE_BMESH: - return &mesh->edit_mesh->bm->edata; - break; - } - - BLI_assert(0); - return &mesh->edge_data; -} - -BLI_INLINE const CustomData *mesh_cd_vdata_get_from_mesh(const Mesh *mesh) -{ - switch (mesh->runtime->wrapper_type) { - case ME_WRAPPER_TYPE_SUBD: - case ME_WRAPPER_TYPE_MDATA: - return &mesh->vert_data; - break; - case ME_WRAPPER_TYPE_BMESH: - return &mesh->edit_mesh->bm->vdata; - break; - } - - BLI_assert(0); - return &mesh->vert_data; -} +const Mesh *editmesh_final_or_this(const Object *object, const Mesh *mesh); +const CustomData *mesh_cd_vdata_get_from_mesh(const Mesh *mesh); +const CustomData *mesh_cd_edata_get_from_mesh(const Mesh *mesh); +const CustomData *mesh_cd_pdata_get_from_mesh(const Mesh *mesh); +const CustomData *mesh_cd_ldata_get_from_mesh(const Mesh *mesh); BLI_INLINE BMFace *bm_original_face_get(const MeshRenderData &mr, int idx) { @@ -240,7 +179,7 @@ BLI_INLINE const float *bm_face_no_get(const MeshRenderData &mr, const BMFace *e using ExtractTriBMeshFn = void(const MeshRenderData &mr, BMLoop **elt, int elt_index, void *data); using ExtractTriMeshFn = void(const MeshRenderData &mr, - const MLoopTri *mlt, + const MLoopTri *lt, int elt_index, void *data); using ExtractFaceBMeshFn = void(const MeshRenderData &mr, diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_edituv.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_edituv.cc index 053b3e9d735..3ecb232375f 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_edituv.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_edituv.cc @@ -6,10 +6,10 @@ * \ingroup draw */ -#include "BLI_bitmap.h" - #include "extract_mesh.hh" +#include "GPU_index_buffer.h" + #include "draw_subdivision.hh" namespace blender::draw { @@ -55,7 +55,7 @@ static void extract_edituv_tris_iter_looptri_bm(const MeshRenderData & /*mr*/, } static void extract_edituv_tris_iter_looptri_mesh(const MeshRenderData &mr, - const MLoopTri *mlt, + const MLoopTri *lt, const int elt_index, void *_data) { @@ -65,7 +65,7 @@ static void extract_edituv_tris_iter_looptri_mesh(const MeshRenderData &mr, const bool mp_hidden = (efa) ? BM_elem_flag_test_bool(efa, BM_ELEM_HIDDEN) : true; const bool mp_select = (efa) ? BM_elem_flag_test_bool(efa, BM_ELEM_SELECT) : false; - edituv_tri_add(data, mp_hidden, mp_select, mlt->tri[0], mlt->tri[1], mlt->tri[2]); + edituv_tri_add(data, mp_hidden, mp_select, lt->tri[0], lt->tri[1], lt->tri[2]); } static void extract_edituv_tris_finish(const MeshRenderData & /*mr*/, @@ -217,8 +217,8 @@ static void extract_edituv_lines_iter_face_mesh(const MeshRenderData &mr, mp_select = (efa) ? BM_elem_flag_test_bool(efa, BM_ELEM_SELECT) : false; } else { - mp_hidden = (mr.hide_poly) ? mr.hide_poly[face_index] : false; - mp_select = mr.select_poly && mr.select_poly[face_index]; + mp_hidden = mr.hide_poly.is_empty() ? false : mr.hide_poly[face_index]; + mp_select = !mr.select_poly.is_empty() && mr.select_poly[face_index]; } for (const int ml_index : face) { @@ -295,8 +295,8 @@ static void extract_edituv_lines_iter_subdiv_mesh(const DRWSubdivCache &subdiv_c mp_select = (efa) ? BM_elem_flag_test_bool(efa, BM_ELEM_SELECT) : false; } else { - mp_hidden = (mr.hide_poly) ? mr.hide_poly[coarse_face_index] : false; - mp_select = mr.select_poly && mr.select_poly[coarse_face_index]; + mp_hidden = mr.hide_poly.is_empty() ? false : mr.hide_poly[coarse_face_index]; + mp_select = !mr.select_poly.is_empty() && mr.select_poly[coarse_face_index]; } uint start_loop_idx = subdiv_quad_index * 4; diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_fdots.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_fdots.cc index 7788b37cee6..a47c2911a84 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_fdots.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_fdots.cc @@ -6,7 +6,7 @@ * \ingroup draw */ -#include "BLI_bitmap.h" +#include "GPU_index_buffer.h" #include "extract_mesh.hh" @@ -42,7 +42,7 @@ static void extract_fdots_iter_face_mesh(const MeshRenderData &mr, const int face_index, void *_userdata) { - const bool hidden = mr.use_hide && mr.hide_poly && mr.hide_poly[face_index]; + const bool hidden = mr.use_hide && !mr.hide_poly.is_empty() && mr.hide_poly[face_index]; GPUIndexBufBuilder *elb = static_cast(_userdata); if (mr.use_subsurf_fdots) { diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines.cc index 51bee7b13ef..35c40cac9d6 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines.cc @@ -6,7 +6,7 @@ * \ingroup draw */ -#include "MEM_guardedalloc.h" +#include "GPU_index_buffer.h" #include "extract_mesh.hh" @@ -22,13 +22,13 @@ struct MeshExtract_LinesData { GPUIndexBufBuilder elb; BitSpan optimal_display_edges; const int *e_origindex; - const bool *hide_edge; + Span hide_edge; bool test_visibility; }; BLI_INLINE bool is_edge_visible(const MeshExtract_LinesData *data, const int edge) { - if (data->hide_edge && data->hide_edge[edge]) { + if (!data->hide_edge.is_empty() && data->hide_edge[edge]) { return false; } if (data->e_origindex && data->e_origindex[edge] == ORIGINDEX_NONE) { @@ -55,10 +55,10 @@ static void extract_lines_init(const MeshRenderData &mr, if (mr.extract_type == MR_EXTRACT_MESH) { data->optimal_display_edges = mr.mesh->runtime->subsurf_optimal_display_edges; data->e_origindex = mr.hide_unmapped_edges ? mr.e_origindex : nullptr; - data->hide_edge = mr.use_hide ? mr.hide_edge : nullptr; + data->hide_edge = mr.use_hide ? Span(mr.hide_edge) : Span(); data->test_visibility = !data->optimal_display_edges.is_empty() || data->e_origindex || - data->hide_edge; + !data->hide_edge.is_empty(); } } @@ -221,8 +221,8 @@ static void extract_lines_loose_geom_subdiv(const DRWSubdivCache &subdiv_cache, case MR_EXTRACT_MESH: { const int *e_origindex = (mr.hide_unmapped_edges) ? mr.e_origindex : nullptr; if (e_origindex == nullptr) { - const bool *hide_edge = mr.hide_edge; - if (hide_edge) { + const Span hide_edge = mr.hide_edge; + if (!hide_edge.is_empty()) { for (DRWSubdivLooseEdge edge : loose_edges) { *flags_data++ = hide_edge[edge.coarse_edge_index]; } @@ -239,8 +239,8 @@ static void extract_lines_loose_geom_subdiv(const DRWSubdivCache &subdiv_cache, } } else { - const bool *hide_edge = mr.hide_edge; - if (hide_edge) { + const Span hide_edge = mr.hide_edge; + if (!hide_edge.is_empty()) { for (DRWSubdivLooseEdge edge : loose_edges) { int e = edge.coarse_edge_index; diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_adjacency.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_adjacency.cc index 24b1062c8c3..e2b57851e42 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_adjacency.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_adjacency.cc @@ -12,6 +12,8 @@ #include "MEM_guardedalloc.h" +#include "GPU_index_buffer.h" + #include "draw_subdivision.hh" #include "extract_mesh.hh" @@ -124,22 +126,22 @@ static void extract_lines_adjacency_iter_looptri_bm(const MeshRenderData & /*mr* } static void extract_lines_adjacency_iter_looptri_mesh(const MeshRenderData &mr, - const MLoopTri *mlt, + const MLoopTri *lt, const int elt_index, void *_data) { MeshExtract_LineAdjacency_Data *data = static_cast(_data); const int face_i = mr.looptri_faces[elt_index]; - const bool hidden = mr.use_hide && mr.hide_poly && mr.hide_poly[face_i]; + const bool hidden = mr.use_hide && !mr.hide_poly.is_empty() && mr.hide_poly[face_i]; if (hidden) { return; } - lines_adjacency_triangle(mr.corner_verts[mlt->tri[0]], - mr.corner_verts[mlt->tri[1]], - mr.corner_verts[mlt->tri[2]], - mlt->tri[0], - mlt->tri[1], - mlt->tri[2], + lines_adjacency_triangle(mr.corner_verts[lt->tri[0]], + mr.corner_verts[lt->tri[1]], + mr.corner_verts[lt->tri[2]], + lt->tri[0], + lt->tri[1], + lt->tri[2], data); } diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_paint_mask.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_paint_mask.cc index 502c9cd106a..4a93ffb7b08 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_paint_mask.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_paint_mask.cc @@ -7,11 +7,12 @@ */ #include "BLI_bitmap.h" -#include "BLI_vector.hh" #include "atomic_ops.h" #include "MEM_guardedalloc.h" +#include "GPU_index_buffer.h" + #include "draw_subdivision.hh" #include "extract_mesh.hh" @@ -47,13 +48,13 @@ static void extract_lines_paint_mask_iter_face_mesh(const MeshRenderData &mr, for (int ml_index = face.start(); ml_index < ml_index_end; ml_index += 1) { const int e_index = mr.corner_edges[ml_index]; - if (!((mr.use_hide && mr.hide_edge && mr.hide_edge[e_index]) || + if (!((mr.use_hide && !mr.hide_edge.is_empty() && mr.hide_edge[e_index]) || ((mr.e_origindex) && (mr.e_origindex[e_index] == ORIGINDEX_NONE)))) { const int ml_index_last = face.size() + face.start() - 1; const int ml_index_other = (ml_index == ml_index_last) ? face.start() : (ml_index + 1); - if (mr.select_poly && mr.select_poly[face_index]) { + if (!mr.select_poly.is_empty() && mr.select_poly[face_index]) { if (BLI_BITMAP_TEST_AND_SET_ATOMIC(data->select_map, e_index)) { /* Hide edge as it has more than 2 selected loop. */ GPU_indexbuf_set_line_restart(&data->elb, e_index); @@ -121,12 +122,12 @@ static void extract_lines_paint_mask_iter_subdiv_mesh(const DRWSubdivCache &subd GPU_indexbuf_set_line_restart(&data->elb, subdiv_edge_index); } else { - if (!((mr.use_hide && mr.hide_edge && mr.hide_edge[coarse_edge_index]) || + if (!((mr.use_hide && !mr.hide_edge.is_empty() && mr.hide_edge[coarse_edge_index]) || ((mr.e_origindex) && (mr.e_origindex[coarse_edge_index] == ORIGINDEX_NONE)))) { const uint ml_index_other = (loop_idx == (end_loop_idx - 1)) ? start_loop_idx : loop_idx + 1; - if (mr.select_poly && mr.select_poly[coarse_quad_index]) { + if (!mr.select_poly.is_empty() && mr.select_poly[coarse_quad_index]) { if (BLI_BITMAP_TEST_AND_SET_ATOMIC(data->select_map, coarse_edge_index)) { /* Hide edge as it has more than 2 selected loop. */ GPU_indexbuf_set_line_restart(&data->elb, subdiv_edge_index); diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_points.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_points.cc index 7ba9eb7d8b6..1e303fb7a49 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_points.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_points.cc @@ -6,9 +6,7 @@ * \ingroup draw */ -#include "BLI_vector.hh" - -#include "MEM_guardedalloc.h" +#include "GPU_index_buffer.h" #include "draw_subdivision.hh" #include "extract_mesh.hh" @@ -44,7 +42,7 @@ BLI_INLINE void vert_set_mesh(GPUIndexBufBuilder *elb, const int v_index, const int l_index) { - const bool hidden = mr.use_hide && mr.hide_vert && mr.hide_vert[v_index]; + const bool hidden = mr.use_hide && !mr.hide_vert.is_empty() && mr.hide_vert[v_index]; if (!(hidden || ((mr.v_origindex) && (mr.v_origindex[v_index] == ORIGINDEX_NONE)))) { GPU_indexbuf_set_point_vert(elb, v_index, l_index); @@ -176,7 +174,7 @@ static void extract_points_iter_subdiv_common(GPUIndexBufBuilder *elb, } } else { - if (mr.use_hide && mr.hide_vert && mr.hide_vert[coarse_vertex_index]) { + if (mr.use_hide && !mr.hide_vert.is_empty() && mr.hide_vert[coarse_vertex_index]) { GPU_indexbuf_set_point_restart(elb, coarse_vertex_index); continue; } diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_tris.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_tris.cc index d7ba132df01..f2aa7697864 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_tris.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_tris.cc @@ -6,7 +6,9 @@ * \ingroup draw */ -#include "MEM_guardedalloc.h" +#include "BKE_editmesh.hh" + +#include "GPU_index_buffer.h" #include "extract_mesh.hh" @@ -76,9 +78,9 @@ static void extract_tris_iter_face_mesh(const MeshRenderData &mr, int tri_len = face.size() - 2; for (int offs = 0; offs < tri_len; offs++) { - const MLoopTri *mlt = &mr.looptris[tri_first_index_real + offs]; + const MLoopTri *lt = &mr.looptris[tri_first_index_real + offs]; int tri_index = tri_first_index + offs; - GPU_indexbuf_set_tri_verts(elb, tri_index, mlt->tri[0], mlt->tri[1], mlt->tri[2]); + GPU_indexbuf_set_tri_verts(elb, tri_index, lt->tri[0], lt->tri[1], lt->tri[2]); } } @@ -186,18 +188,18 @@ static void extract_tris_single_mat_iter_looptri_bm(const MeshRenderData & /*mr* } static void extract_tris_single_mat_iter_looptri_mesh(const MeshRenderData &mr, - const MLoopTri *mlt, - const int mlt_index, + const MLoopTri *lt, + const int lt_index, void *_data) { GPUIndexBufBuilder *elb = static_cast(_data); - const int face_i = mr.looptri_faces[mlt_index]; - const bool hidden = mr.use_hide && mr.hide_poly && mr.hide_poly[face_i]; + const int face_i = mr.looptri_faces[lt_index]; + const bool hidden = mr.use_hide && !mr.hide_poly.is_empty() && mr.hide_poly[face_i]; if (hidden) { - GPU_indexbuf_set_tri_restart(elb, mlt_index); + GPU_indexbuf_set_tri_restart(elb, lt_index); } else { - GPU_indexbuf_set_tri_verts(elb, mlt_index, mlt->tri[0], mlt->tri[1], mlt->tri[2]); + GPU_indexbuf_set_tri_verts(elb, lt_index, lt->tri[0], lt->tri[1], lt->tri[2]); } } diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_attributes.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_attributes.cc index 5005ee7b287..f576a66ff59 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_attributes.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_attributes.cc @@ -21,6 +21,8 @@ #include "draw_subdivision.hh" #include "extract_mesh.hh" +#include "GPU_vertex_buffer.h" + namespace blender::draw { /* ---------------------------------------------------------------------- */ diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_fdots_pos.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_fdots_pos.cc index fcbb89a0e2f..6b1ee705ec0 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_fdots_pos.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_fdots_pos.cc @@ -6,7 +6,7 @@ * \ingroup draw */ -#include "BLI_bitmap.h" +#include "GPU_index_buffer.h" #include "extract_mesh.hh" diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_lnor.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_lnor.cc index e84ed05b149..0e3c54fcb52 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_lnor.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_lnor.cc @@ -60,7 +60,7 @@ static void extract_lnor_iter_face_bm(const MeshRenderData &mr, static void extract_lnor_iter_face_mesh(const MeshRenderData &mr, const int face_index, void *data) { - const bool hidden = mr.hide_poly && mr.hide_poly[face_index]; + const bool hidden = !mr.hide_poly.is_empty() && mr.hide_poly[face_index]; for (const int ml_index : mr.faces[face_index]) { const int vert = mr.corner_verts[ml_index]; @@ -68,7 +68,9 @@ static void extract_lnor_iter_face_mesh(const MeshRenderData &mr, const int face if (!mr.loop_normals.is_empty()) { *lnor_data = GPU_normal_convert_i10_v3(mr.loop_normals[ml_index]); } - else if (mr.sharp_faces && mr.sharp_faces[face_index]) { + else if (mr.normals_domain == bke::MeshNormalDomain::Face || + (!mr.sharp_faces.is_empty() && mr.sharp_faces[face_index])) + { *lnor_data = GPU_normal_convert_i10_v3(mr.face_normals[face_index]); } else { @@ -81,7 +83,7 @@ static void extract_lnor_iter_face_mesh(const MeshRenderData &mr, const int face if (hidden || (mr.edit_bmesh && (mr.v_origindex) && mr.v_origindex[vert] == ORIGINDEX_NONE)) { lnor_data->w = -1; } - else if (mr.select_poly && mr.select_poly[face_index]) { + else if (!mr.select_poly.is_empty() && mr.select_poly[face_index]) { lnor_data->w = 1; } else { @@ -181,7 +183,7 @@ static void extract_lnor_hq_iter_face_mesh(const MeshRenderData &mr, const int face_index, void *data) { - const bool hidden = mr.hide_poly && mr.hide_poly[face_index]; + const bool hidden = !mr.hide_poly.is_empty() && mr.hide_poly[face_index]; for (const int ml_index : mr.faces[face_index]) { const int vert = mr.corner_verts[ml_index]; @@ -189,7 +191,9 @@ static void extract_lnor_hq_iter_face_mesh(const MeshRenderData &mr, if (!mr.loop_normals.is_empty()) { normal_float_to_short_v3(&lnor_data->x, mr.loop_normals[ml_index]); } - else if (mr.sharp_faces && mr.sharp_faces[face_index]) { + else if (mr.normals_domain == bke::MeshNormalDomain::Face || + (!mr.sharp_faces.is_empty() && mr.sharp_faces[face_index])) + { normal_float_to_short_v3(&lnor_data->x, mr.face_normals[face_index]); } else { @@ -202,7 +206,7 @@ static void extract_lnor_hq_iter_face_mesh(const MeshRenderData &mr, if (hidden || (mr.edit_bmesh && (mr.v_origindex) && mr.v_origindex[vert] == ORIGINDEX_NONE)) { lnor_data->w = -1; } - else if (mr.select_poly && mr.select_poly[face_index]) { + else if (!mr.select_poly.is_empty() && mr.select_poly[face_index]) { lnor_data->w = 1; } else { diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_mesh_analysis.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_mesh_analysis.cc index edc80468ff1..2a5b08b9b5a 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_mesh_analysis.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_mesh_analysis.cc @@ -14,6 +14,7 @@ #include "BLI_ordered_edge.hh" #include "BKE_bvhutils.hh" +#include "BKE_editmesh.hh" #include "BKE_editmesh_bvh.h" #include "BKE_editmesh_cache.hh" @@ -215,7 +216,7 @@ static void statvis_calc_thickness(const MeshRenderData &mr, float *r_thickness) else { BVHTreeFromMesh treeData = {nullptr}; - BVHTree *tree = BKE_bvhtree_from_mesh_get(&treeData, mr.mesh, BVHTREE_FROM_LOOPTRI, 4); + BVHTree *tree = BKE_bvhtree_from_mesh_get(&treeData, mr.mesh, BVHTREE_FROM_LOOPTRIS, 4); const Span looptris = mr.looptris; const Span looptri_faces = mr.looptri_faces; for (const int i : looptris.index_range()) { @@ -277,15 +278,15 @@ static bool bvh_overlap_cb(void *userdata, int index_a, int index_b, int /*threa return false; } - const MLoopTri *tri_a = &data->looptris[index_a]; - const MLoopTri *tri_b = &data->looptris[index_b]; + const MLoopTri *lt_a = &data->looptris[index_a]; + const MLoopTri *lt_b = &data->looptris[index_b]; - const float *tri_a_co[3] = {data->positions[data->corner_verts[tri_a->tri[0]]], - data->positions[data->corner_verts[tri_a->tri[1]]], - data->positions[data->corner_verts[tri_a->tri[2]]]}; - const float *tri_b_co[3] = {data->positions[data->corner_verts[tri_b->tri[0]]], - data->positions[data->corner_verts[tri_b->tri[1]]], - data->positions[data->corner_verts[tri_b->tri[2]]]}; + const float *tri_a_co[3] = {data->positions[data->corner_verts[lt_a->tri[0]]], + data->positions[data->corner_verts[lt_a->tri[1]]], + data->positions[data->corner_verts[lt_a->tri[2]]]}; + const float *tri_b_co[3] = {data->positions[data->corner_verts[lt_b->tri[0]]], + data->positions[data->corner_verts[lt_b->tri[1]]], + data->positions[data->corner_verts[lt_b->tri[2]]]}; float ix_pair[2][3]; int verts_shared = 0; @@ -343,7 +344,7 @@ static void statvis_calc_intersect(const MeshRenderData &mr, float *r_intersect) uint overlap_len; BVHTreeFromMesh treeData = {nullptr}; - BVHTree *tree = BKE_bvhtree_from_mesh_get(&treeData, mr.mesh, BVHTREE_FROM_LOOPTRI, 4); + BVHTree *tree = BKE_bvhtree_from_mesh_get(&treeData, mr.mesh, BVHTREE_FROM_LOOPTRIS, 4); BVHTree_OverlapData data = {}; data.positions = mr.vert_positions; diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc index d52fb6152dc..a9c2d43353d 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc @@ -87,12 +87,12 @@ static void extract_pos_nor_iter_face_mesh(const MeshRenderData &mr, void *_data) { MeshExtract_PosNor_Data *data = static_cast(_data); - const bool poly_hidden = mr.hide_poly && mr.hide_poly[face_index]; + const bool poly_hidden = !mr.hide_poly.is_empty() && mr.hide_poly[face_index]; for (const int ml_index : mr.faces[face_index]) { const int vert_i = mr.corner_verts[ml_index]; PosNorLoop *vert = &data->vbo_data[ml_index]; - const bool vert_hidden = mr.hide_vert && mr.hide_vert[vert_i]; + const bool vert_hidden = !mr.hide_vert.is_empty() && mr.hide_vert[vert_i]; copy_v3_v3(vert->pos, mr.vert_positions[vert_i]); vert->nor = data->normals[vert_i].low; /* Flag for paint mode overlay. */ @@ -100,7 +100,7 @@ static void extract_pos_nor_iter_face_mesh(const MeshRenderData &mr, ((mr.v_origindex) && (mr.v_origindex[vert_i] == ORIGINDEX_NONE))) { vert->nor.w = -1; } - else if (mr.select_vert && mr.select_vert[vert_i]) { + else if (!mr.select_vert.is_empty() && mr.select_vert[vert_i]) { vert->nor.w = 1; } else { @@ -199,12 +199,12 @@ static void extract_vertex_flags(const MeshRenderData &mr, char *flags) { for (int i = 0; i < mr.vert_len; i++) { char *flag = &flags[i]; - const bool vert_hidden = mr.hide_vert && mr.hide_vert[i]; + const bool vert_hidden = !mr.hide_vert.is_empty() && mr.hide_vert[i]; /* Flag for paint mode overlay. */ if (vert_hidden || ((mr.v_origindex) && (mr.v_origindex[i] == ORIGINDEX_NONE))) { *flag = -1; } - else if (mr.select_vert && mr.select_vert[i]) { + else if (!mr.select_vert.is_empty() && mr.select_vert[i]) { *flag = 1; } else { @@ -457,12 +457,12 @@ static void extract_pos_nor_hq_iter_face_mesh(const MeshRenderData &mr, void *_data) { MeshExtract_PosNorHQ_Data *data = static_cast(_data); - const bool poly_hidden = mr.hide_poly && mr.hide_poly[face_index]; + const bool poly_hidden = !mr.hide_poly.is_empty() && mr.hide_poly[face_index]; for (const int ml_index : mr.faces[face_index]) { const int vert_i = mr.corner_verts[ml_index]; - const bool vert_hidden = mr.hide_vert && mr.hide_vert[vert_i]; + const bool vert_hidden = !mr.hide_vert.is_empty() && mr.hide_vert[vert_i]; PosNorHQLoop *vert = &data->vbo_data[ml_index]; copy_v3_v3(vert->pos, mr.vert_positions[vert_i]); copy_v3_v3_short(vert->nor, data->normals[vert_i].high); @@ -472,7 +472,7 @@ static void extract_pos_nor_hq_iter_face_mesh(const MeshRenderData &mr, ((mr.v_origindex) && (mr.v_origindex[vert_i] == ORIGINDEX_NONE))) { vert->nor[3] = -1; } - else if (mr.select_vert && mr.select_vert[vert_i]) { + else if (!mr.select_vert.is_empty() && mr.select_vert[vert_i]) { vert->nor[3] = 1; } else { diff --git a/source/blender/editors/animation/anim_channels_defines.cc b/source/blender/editors/animation/anim_channels_defines.cc index 2f998e2eff8..fce48984450 100644 --- a/source/blender/editors/animation/anim_channels_defines.cc +++ b/source/blender/editors/animation/anim_channels_defines.cc @@ -9,6 +9,7 @@ #include #include "ANIM_action.hh" +#include "ANIM_animdata.hh" #include "ANIM_keyframing.hh" #include "MEM_guardedalloc.h" @@ -5094,7 +5095,7 @@ static void achannel_setting_slider_shapekey_cb(bContext *C, void *key_poin, voi if (RNA_path_resolve_property(&id_ptr, rna_path, &ptr, &prop)) { /* find or create new F-Curve */ /* XXX is the group name for this ok? */ - bAction *act = ED_id_action_ensure(bmain, (ID *)key); + bAction *act = blender::animrig::id_action_ensure(bmain, (ID *)key); FCurve *fcu = blender::animrig::action_fcurve_ensure(bmain, act, nullptr, &ptr, rna_path, 0); /* set the special 'replace' flag if on a keyframe */ diff --git a/source/blender/editors/animation/anim_channels_edit.cc b/source/blender/editors/animation/anim_channels_edit.cc index 0ecd140fc4f..0b5a6d0165c 100644 --- a/source/blender/editors/animation/anim_channels_edit.cc +++ b/source/blender/editors/animation/anim_channels_edit.cc @@ -4310,6 +4310,173 @@ static void ANIM_OT_channel_view_pick(wmOperatorType *ot) "Ignore frames outside of the preview range"); } +static const EnumPropertyItem channel_bake_key_options[] = { + {BEZT_IPO_BEZ, "BEZIER", 0, "Bezier", "New keys will be beziers"}, + {BEZT_IPO_LIN, "LIN", 0, "Linear", "New keys will be linear"}, + {BEZT_IPO_CONST, "CONST", 0, "Constant", "New keys will be constant"}, + {0, nullptr, 0, nullptr, nullptr}, +}; + +static int channels_bake_exec(bContext *C, wmOperator *op) +{ + bAnimContext ac; + + /* Get editor data. */ + if (ANIM_animdata_get_context(C, &ac) == 0) { + return OPERATOR_CANCELLED; + } + + ListBase anim_data = {nullptr, nullptr}; + const int filter = (ANIMFILTER_SEL | ANIMFILTER_NODUPLIS | ANIMFILTER_DATA_VISIBLE | + ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FCURVESONLY); + size_t anim_data_length = ANIM_animdata_filter( + &ac, &anim_data, eAnimFilter_Flags(filter), ac.data, eAnimCont_Types(ac.datatype)); + + if (anim_data_length == 0) { + WM_report(RPT_WARNING, "No channels to operate on"); + return OPERATOR_CANCELLED; + } + + Scene *scene = CTX_data_scene(C); + + /* The range will default to the scene or preview range, but only if it hasn't been set before. + * If a range is set here, the redo panel wouldn't work properly because the range would + * constantly be overridden. */ + blender::int2 frame_range; + RNA_int_get_array(op->ptr, "range", frame_range); + if (frame_range[1] < frame_range[0]) { + frame_range[1] = frame_range[0]; + } + const float step = RNA_float_get(op->ptr, "step"); + if (frame_range[0] == 0 && frame_range[1] == 0) { + if (scene->r.flag & SCER_PRV_RANGE) { + frame_range = {scene->r.psfra, scene->r.pefra}; + } + else { + frame_range = {scene->r.sfra, scene->r.efra}; + } + RNA_int_set_array(op->ptr, "range", frame_range); + } + + const bool remove_outside_range = RNA_boolean_get(op->ptr, "remove_outside_range"); + const BakeCurveRemove remove_existing = remove_outside_range ? BakeCurveRemove::REMOVE_ALL : + BakeCurveRemove::REMOVE_IN_RANGE; + const int interpolation_type = RNA_enum_get(op->ptr, "interpolation_type"); + const bool bake_modifiers = RNA_boolean_get(op->ptr, "bake_modifiers"); + + LISTBASE_FOREACH (bAnimListElem *, ale, &anim_data) { + FCurve *fcu = static_cast(ale->data); + if (!fcu->bezt) { + continue; + } + AnimData *adt = ANIM_nla_mapping_get(&ac, ale); + blender::int2 nla_mapped_range; + nla_mapped_range[0] = int(BKE_nla_tweakedit_remap(adt, frame_range[0], NLATIME_CONVERT_UNMAP)); + nla_mapped_range[1] = int(BKE_nla_tweakedit_remap(adt, frame_range[1], NLATIME_CONVERT_UNMAP)); + /* Save current state of modifier flags so they can be reapplied after baking. */ + blender::Vector modifier_flags; + if (!bake_modifiers) { + LISTBASE_FOREACH (FModifier *, modifier, &fcu->modifiers) { + modifier_flags.append(modifier->flag); + modifier->flag |= FMODIFIER_FLAG_MUTED; + } + } + + bool replace; + const int last_index = BKE_fcurve_bezt_binarysearch_index( + fcu->bezt, nla_mapped_range[1], fcu->totvert, &replace); + + /* Since the interpolation of a key defines the curve following it, the last key in the baked + * segment needs to keep the interpolation mode that existed previously so the curve isn't + * changed. */ + const char segment_end_interpolation = fcu->bezt[min_ii(last_index, fcu->totvert - 1)].ipo; + + bake_fcurve(fcu, nla_mapped_range, step, remove_existing); + + if (bake_modifiers) { + free_fmodifiers(&fcu->modifiers); + } + else { + int modifier_index = 0; + LISTBASE_FOREACH (FModifier *, modifier, &fcu->modifiers) { + modifier->flag = modifier_flags[modifier_index]; + modifier_index++; + } + } + + for (int i = 0; i < fcu->totvert; i++) { + BezTriple *key = &fcu->bezt[i]; + if (key->vec[1][0] < nla_mapped_range[0]) { + continue; + } + if (key->vec[1][0] > nla_mapped_range[1]) { + fcu->bezt[max_ii(i - 1, 0)].ipo = segment_end_interpolation; + break; + } + key->ipo = interpolation_type; + } + } + + ANIM_animdata_freelist(&anim_data); + WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_SELECTED, nullptr); + + return OPERATOR_FINISHED; +} + +static void ANIM_OT_channels_bake(wmOperatorType *ot) +{ + /* Identifiers */ + ot->name = "Bake Channels"; + ot->idname = "ANIM_OT_channels_bake"; + ot->description = + "Create keyframes following the current shape of F-Curves of selected channels"; + + /* API callbacks */ + ot->exec = channels_bake_exec; + ot->poll = channel_view_poll; + + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + RNA_def_int_array(ot->srna, + "range", + 2, + nullptr, + INT_MIN, + INT_MAX, + "Frame Range", + "The range in which to create new keys", + 0, + INT_MAX); + + RNA_def_float(ot->srna, + "step", + 1.0f, + 0.01f, + FLT_MAX, + "Frame Step", + "At which interval to add keys", + 1.0f, + 16.0f); + + RNA_def_boolean(ot->srna, + "remove_outside_range", + false, + "Remove Outside Range", + "Removes keys outside the given range, leaving only the newly baked"); + + RNA_def_enum(ot->srna, + "interpolation_type", + channel_bake_key_options, + BEZT_IPO_BEZ, + "Interpolation Type", + "Choose the interpolation type with which new keys will be added"); + + RNA_def_boolean(ot->srna, + "bake_modifiers", + true, + "Bake Modifiers", + "Bake Modifiers into keyframes and delete them after"); +} + /* Find a Graph Editor area and modify the given context to be the window region of it. */ static bool move_context_to_graph_editor(bContext *C) { @@ -4540,7 +4707,7 @@ static void ANIM_OT_view_curve_in_graph_editor(wmOperatorType *ot) "isolate", false, "Isolate", - "Hides all other F-Curves other than the ones being framed"); + "Hides all F-Curves other than the ones being framed"); } /** \} */ @@ -4584,6 +4751,8 @@ void ED_operatortypes_animchannels() WM_operatortype_append(ANIM_OT_channels_group); WM_operatortype_append(ANIM_OT_channels_ungroup); + + WM_operatortype_append(ANIM_OT_channels_bake); } void ED_keymap_animchannels(wmKeyConfig *keyconf) diff --git a/source/blender/editors/animation/keyframes_general.cc b/source/blender/editors/animation/keyframes_general.cc index 21ea311e46f..7a36be279fd 100644 --- a/source/blender/editors/animation/keyframes_general.cc +++ b/source/blender/editors/animation/keyframes_general.cc @@ -15,6 +15,7 @@ #include "BLI_blenlib.h" #include "BLI_math_vector.h" +#include "BLI_math_vector_types.hh" #include "BLI_string_utils.hh" #include "BLI_utildefines.h" @@ -1211,7 +1212,7 @@ struct TempFrameValCache { void sample_fcurve_segment(FCurve *fcu, const float start_frame, - const int sample_rate, + const float sample_rate, float *samples, const int sample_count) { @@ -1221,6 +1222,104 @@ void sample_fcurve_segment(FCurve *fcu, } } +static void remove_fcurve_key_range(FCurve *fcu, + const blender::int2 range, + const BakeCurveRemove removal_mode) +{ + switch (removal_mode) { + + case BakeCurveRemove::REMOVE_ALL: { + BKE_fcurve_delete_keys_all(fcu); + break; + } + + case BakeCurveRemove::REMOVE_OUT_RANGE: { + bool replace; + + int before_index = BKE_fcurve_bezt_binarysearch_index( + fcu->bezt, range[0], fcu->totvert, &replace); + + if (before_index > 0) { + BKE_fcurve_delete_keys(fcu, {0, uint(before_index)}); + } + + int after_index = BKE_fcurve_bezt_binarysearch_index( + fcu->bezt, range[1], fcu->totvert, &replace); + /* REMOVE_OUT_RANGE is treated as exlusive on both ends. */ + if (replace) { + after_index++; + } + if (after_index < fcu->totvert) { + BKE_fcurve_delete_keys(fcu, {uint(after_index), fcu->totvert}); + } + break; + } + + case BakeCurveRemove::REMOVE_IN_RANGE: { + bool replace; + const int range_start_index = BKE_fcurve_bezt_binarysearch_index( + fcu->bezt, range[0], fcu->totvert, &replace); + int range_end_index = BKE_fcurve_bezt_binarysearch_index( + fcu->bezt, range[1], fcu->totvert, &replace); + if (replace) { + range_end_index++; + } + + if (range_end_index > range_start_index) { + BKE_fcurve_delete_keys(fcu, {uint(range_start_index), uint(range_end_index)}); + } + break; + } + + default: + break; + } +} + +void bake_fcurve(FCurve *fcu, + const blender::int2 range, + const float step, + const BakeCurveRemove remove_existing) +{ + using namespace blender::animrig; + BLI_assert(step > 0); + const int sample_count = (range[1] - range[0]) / step + 1; + float *samples = static_cast( + MEM_callocN(sample_count * sizeof(float), "Channel Bake Samples")); + const float sample_rate = 1.0f / step; + sample_fcurve_segment(fcu, range[0], sample_rate, samples, sample_count); + + if (remove_existing != BakeCurveRemove::REMOVE_NONE) { + remove_fcurve_key_range(fcu, range, remove_existing); + } + + BezTriple *baked_keys = static_cast( + MEM_callocN(sample_count * sizeof(BezTriple), "beztriple")); + + const KeyframeSettings settings = get_keyframe_settings(true); + + for (int i = 0; i < sample_count; i++) { + BezTriple *key = &baked_keys[i]; + blender::float2 key_position = {range[0] + i * step, samples[i]}; + initialize_bezt(key, key_position, settings, eFCurve_Flags(fcu->flag)); + } + + int merged_size; + BezTriple *merged_bezt = BKE_bezier_array_merge( + baked_keys, sample_count, fcu->bezt, fcu->totvert, &merged_size); + + if (fcu->bezt != nullptr) { + /* Can happen if we removed all keys beforehand. */ + MEM_freeN(fcu->bezt); + } + MEM_freeN(baked_keys); + fcu->bezt = merged_bezt; + fcu->totvert = merged_size; + + MEM_freeN(samples); + BKE_fcurve_handles_recalc(fcu); +} + void bake_fcurve_segments(FCurve *fcu) { using namespace blender::animrig; diff --git a/source/blender/editors/animation/keyframing.cc b/source/blender/editors/animation/keyframing.cc index 1dedcd52d7d..e57fb634720 100644 --- a/source/blender/editors/animation/keyframing.cc +++ b/source/blender/editors/animation/keyframing.cc @@ -115,70 +115,6 @@ eInsertKeyFlags ANIM_get_keyframing_flags(Scene *scene, const bool use_autokey_m /* ******************************************* */ /* Animation Data Validation */ -bAction *ED_id_action_ensure(Main *bmain, ID *id) -{ - AnimData *adt; - - /* init animdata if none available yet */ - adt = BKE_animdata_from_id(id); - if (adt == nullptr) { - adt = BKE_animdata_ensure_id(id); - } - if (adt == nullptr) { - /* if still none (as not allowed to add, or ID doesn't have animdata for some reason) */ - printf("ERROR: Couldn't add AnimData (ID = %s)\n", (id) ? (id->name) : ""); - return nullptr; - } - - /* init action if none available yet */ - /* TODO: need some wizardry to handle NLA stuff correct */ - if (adt->action == nullptr) { - /* init action name from name of ID block */ - char actname[sizeof(id->name) - 2]; - SNPRINTF(actname, "%sAction", id->name + 2); - - /* create action */ - adt->action = BKE_action_add(bmain, actname); - - /* set ID-type from ID-block that this is going to be assigned to - * so that users can't accidentally break actions by assigning them - * to the wrong places - */ - BKE_animdata_action_ensure_idroot(id, adt->action); - - /* Tag depsgraph to be rebuilt to include time dependency. */ - DEG_relations_tag_update(bmain); - } - - DEG_id_tag_update(&adt->action->id, ID_RECALC_ANIMATION_NO_FLUSH); - - /* return the action */ - return adt->action; -} - -/** Helper for #update_autoflags_fcurve(). */ -void update_autoflags_fcurve_direct(FCurve *fcu, PropertyRNA *prop) -{ - /* set additional flags for the F-Curve (i.e. only integer values) */ - fcu->flag &= ~(FCURVE_INT_VALUES | FCURVE_DISCRETE_VALUES); - switch (RNA_property_type(prop)) { - case PROP_FLOAT: - /* do nothing */ - break; - case PROP_INT: - /* do integer (only 'whole' numbers) interpolation between all points */ - fcu->flag |= FCURVE_INT_VALUES; - break; - default: - /* do 'discrete' (i.e. enum, boolean values which cannot take any intermediate - * values at all) interpolation between all points - * - however, we must also ensure that evaluated values are only integers still - */ - fcu->flag |= (FCURVE_DISCRETE_VALUES | FCURVE_INT_VALUES); - break; - } -} - void update_autoflags_fcurve(FCurve *fcu, bContext *C, ReportList *reports, PointerRNA *ptr) { PointerRNA tmp_ptr; @@ -205,7 +141,7 @@ void update_autoflags_fcurve(FCurve *fcu, bContext *C, ReportList *reports, Poin } /* update F-Curve flags */ - update_autoflags_fcurve_direct(fcu, prop); + blender::animrig::update_autoflags_fcurve_direct(fcu, prop); if (old_flag != fcu->flag) { /* Same as if keyframes had been changed */ diff --git a/source/blender/editors/animation/keyingsets.cc b/source/blender/editors/animation/keyingsets.cc index 7adc2ce4635..efe1d6cbef4 100644 --- a/source/blender/editors/animation/keyingsets.cc +++ b/source/blender/editors/animation/keyingsets.cc @@ -1013,6 +1013,112 @@ static eInsertKeyFlags keyingset_apply_keying_flags(const eInsertKeyFlags base_f return result; } +static int insert_key_to_keying_set_path(bContext *C, + KS_Path *keying_set_path, + KeyingSet *keying_set, + const eInsertKeyFlags insert_key_flags, + const eModifyKey_Modes mode, + const float frame) +{ + /* Since keying settings can be defined on the paths too, + * apply the settings for this path first. */ + const eInsertKeyFlags path_insert_key_flags = keyingset_apply_keying_flags( + insert_key_flags, + eInsertKeyFlags(keying_set_path->keyingoverride), + eInsertKeyFlags(keying_set_path->keyingflag)); + + const char *groupname = nullptr; + /* Get pointer to name of group to add channels to. */ + if (keying_set_path->groupmode == KSP_GROUP_NONE) { + groupname = nullptr; + } + else if (keying_set_path->groupmode == KSP_GROUP_KSNAME) { + groupname = keying_set->name; + } + else { + groupname = keying_set_path->group; + } + + /* Init - array_length should be greater than array_index so that + * normal non-array entries get keyframed correctly. + */ + int array_index = keying_set_path->array_index; + int array_length = array_index; + + /* Get length of array if whole array option is enabled. */ + if (keying_set_path->flag & KSP_FLAG_WHOLE_ARRAY) { + PointerRNA ptr; + PropertyRNA *prop; + + PointerRNA id_ptr = RNA_id_pointer_create(keying_set_path->id); + if (RNA_path_resolve_property(&id_ptr, keying_set_path->rna_path, &ptr, &prop)) { + array_length = RNA_property_array_length(&ptr, prop); + /* Start from start of array, instead of the previously specified index - #48020 */ + array_index = 0; + } + } + + /* We should do at least one step. */ + if (array_length == array_index) { + array_length++; + } + + Main *bmain = CTX_data_main(C); + ReportList *reports = CTX_wm_reports(C); + Scene *scene = CTX_data_scene(C); + const eBezTriple_KeyframeType keytype = eBezTriple_KeyframeType( + scene->toolsettings->keyframe_type); + /* For each possible index, perform operation + * - assume that arraylen is greater than index. + */ + Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); + const AnimationEvalContext anim_eval_context = BKE_animsys_eval_context_construct(depsgraph, + frame); + int keyed_channels = 0; + for (; array_index < array_length; array_index++) { + if (mode == MODIFYKEY_MODE_INSERT) { + keyed_channels += blender::animrig::insert_keyframe(bmain, + reports, + keying_set_path->id, + nullptr, + groupname, + keying_set_path->rna_path, + array_index, + &anim_eval_context, + keytype, + path_insert_key_flags); + } + else if (mode == MODIFYKEY_MODE_DELETE) { + keyed_channels += blender::animrig::delete_keyframe(bmain, + reports, + keying_set_path->id, + nullptr, + keying_set_path->rna_path, + array_index, + frame); + } + } + + switch (GS(keying_set_path->id->name)) { + case ID_OB: /* Object (or Object-Related) Keyframes */ + { + Object *ob = (Object *)keying_set_path->id; + + /* XXX: only object transforms? */ + DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); + break; + } + default: + DEG_id_tag_update(keying_set_path->id, ID_RECALC_ANIMATION_NO_FLUSH); + break; + } + + /* Send notifiers for updates (this doesn't require context to work!). */ + WM_main_add_notifier(NC_ANIMATION | ND_KEYFRAME | NA_ADDED, nullptr); + + return keyed_channels; +} + int ANIM_apply_keyingset( bContext *C, blender::Vector *sources, KeyingSet *ks, short mode, float cfra) { @@ -1044,17 +1150,11 @@ int ANIM_apply_keyingset( } } - Main *bmain = CTX_data_main(C); ReportList *reports = CTX_wm_reports(C); - char keytype = scene->toolsettings->keyframe_type; - int num_channels = 0; - const char *groupname = nullptr; + int keyed_channels = 0; /* apply the paths as specified in the KeyingSet now */ LISTBASE_FOREACH (KS_Path *, ksp, &ks->paths) { - int arraylen, i; - eInsertKeyFlags kflag2; - /* skip path if no ID pointer is specified */ if (ksp->id == nullptr) { BKE_reportf(reports, @@ -1066,94 +1166,13 @@ int ANIM_apply_keyingset( continue; } - /* Since keying settings can be defined on the paths too, - * apply the settings for this path first. */ - kflag2 = keyingset_apply_keying_flags( - kflag, eInsertKeyFlags(ksp->keyingoverride), eInsertKeyFlags(ksp->keyingflag)); - - /* get pointer to name of group to add channels to */ - if (ksp->groupmode == KSP_GROUP_NONE) { - groupname = nullptr; - } - else if (ksp->groupmode == KSP_GROUP_KSNAME) { - groupname = ks->name; - } - else { - groupname = ksp->group; - } - - /* init arraylen and i - arraylen should be greater than i so that - * normal non-array entries get keyframed correctly - */ - i = ksp->array_index; - arraylen = i; - - /* get length of array if whole array option is enabled */ - if (ksp->flag & KSP_FLAG_WHOLE_ARRAY) { - PointerRNA ptr; - PropertyRNA *prop; - - PointerRNA id_ptr = RNA_id_pointer_create(ksp->id); - if (RNA_path_resolve_property(&id_ptr, ksp->rna_path, &ptr, &prop)) { - arraylen = RNA_property_array_length(&ptr, prop); - /* start from start of array, instead of the previously specified index - #48020 */ - i = 0; - } - } - - /* we should do at least one step */ - if (arraylen == i) { - arraylen++; - } - - /* for each possible index, perform operation - * - assume that arraylen is greater than index - */ - Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); - const AnimationEvalContext anim_eval_context = BKE_animsys_eval_context_construct(depsgraph, - cfra); - for (; i < arraylen; i++) { - /* action to take depends on mode */ - if (mode == MODIFYKEY_MODE_INSERT) { - num_channels += blender::animrig::insert_keyframe(bmain, - reports, - ksp->id, - nullptr, - groupname, - ksp->rna_path, - i, - &anim_eval_context, - eBezTriple_KeyframeType(keytype), - kflag2); - } - else if (mode == MODIFYKEY_MODE_DELETE) { - num_channels += blender::animrig::delete_keyframe( - bmain, reports, ksp->id, nullptr, ksp->rna_path, i, cfra); - } - } - - /* set recalc-flags */ - switch (GS(ksp->id->name)) { - case ID_OB: /* Object (or Object-Related) Keyframes */ - { - Object *ob = (Object *)ksp->id; - - /* XXX: only object transforms? */ - DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); - break; - } - default: - DEG_id_tag_update(ksp->id, ID_RECALC_ANIMATION_NO_FLUSH); - break; - } - - /* send notifiers for updates (this doesn't require context to work!) */ - WM_main_add_notifier(NC_ANIMATION | ND_KEYFRAME | NA_ADDED, nullptr); + keyed_channels += insert_key_to_keying_set_path( + C, ksp, ks, kflag, eModifyKey_Modes(mode), cfra); } /* return the number of channels successfully affected */ - BLI_assert(num_channels >= 0); - return num_channels; + BLI_assert(keyed_channels >= 0); + return keyed_channels; } /* ************************************************** */ diff --git a/source/blender/editors/armature/bone_collections.cc b/source/blender/editors/armature/bone_collections.cc index efe93bd0d40..05bec4dd3a9 100644 --- a/source/blender/editors/armature/bone_collections.cc +++ b/source/blender/editors/armature/bone_collections.cc @@ -417,7 +417,10 @@ static int bone_collection_assign_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } + /* NOTE: this operator can be called through the M/Shift+M shortcuts, which + * allow assigning to a newly-created bone collection. */ BoneCollection *bcoll = get_bonecoll_named_or_active(C, op, ob, CREATE_IF_MISSING); + BLI_assert_msg(bcoll, "Bone Collection should always be created"); if (bcoll == nullptr) { return OPERATOR_CANCELLED; } @@ -593,7 +596,7 @@ static int bone_collection_unassign_named_exec(bContext *C, wmOperator *op) void ARMATURE_OT_collection_unassign_named(wmOperatorType *ot) { /* identifiers */ - ot->name = "Remove Bone from Bone collections"; + ot->name = "Remove Bone from Bone Collection"; ot->idname = "ARMATURE_OT_collection_unassign_named"; ot->description = "Unassign the bone from this bone collection"; diff --git a/source/blender/editors/armature/meshlaplacian.cc b/source/blender/editors/armature/meshlaplacian.cc index 4ff0c0f211c..517fa629159 100644 --- a/source/blender/editors/armature/meshlaplacian.cc +++ b/source/blender/editors/armature/meshlaplacian.cc @@ -71,7 +71,7 @@ struct LaplacianSystem { blender::Map edgehash; /* edge hash for construction */ struct HeatWeighting { - const MLoopTri *mlooptri; + const MLoopTri *looptris; blender::Span corner_verts; /* needed to find vertices by index */ int verts_num; int tris_num; @@ -373,7 +373,7 @@ struct BVHCallbackUserData { static void bvh_callback(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit) { BVHCallbackUserData *data = (BVHCallbackUserData *)userdata; - const MLoopTri *lt = &data->sys->heat.mlooptri[index]; + const MLoopTri *lt = &data->sys->heat.looptris[index]; const blender::Span corner_verts = data->sys->heat.corner_verts; float(*verts)[3] = data->sys->heat.verts; const float *vtri_co[3]; @@ -405,7 +405,7 @@ static void bvh_callback(void *userdata, int index, const BVHTreeRay *ray, BVHTr /* Ray-tracing for vertex to bone/vertex visibility. */ static void heat_ray_tree_create(LaplacianSystem *sys) { - const MLoopTri *looptri = sys->heat.mlooptri; + const MLoopTri *looptris = sys->heat.looptris; const blender::Span corner_verts = sys->heat.corner_verts; float(*verts)[3] = sys->heat.verts; int tris_num = sys->heat.tris_num; @@ -417,7 +417,7 @@ static void heat_ray_tree_create(LaplacianSystem *sys) MEM_callocN(sizeof(MLoopTri *) * verts_num, "HeatVFaces")); for (a = 0; a < tris_num; a++) { - const MLoopTri *lt = &looptri[a]; + const MLoopTri *lt = &looptris[a]; float bb[6]; int vtri[3]; @@ -572,7 +572,7 @@ static void heat_calc_vnormals(LaplacianSystem *sys) static void heat_laplacian_create(LaplacianSystem *sys) { - const MLoopTri *mlooptri = sys->heat.mlooptri, *lt; + const MLoopTri *looptris = sys->heat.looptris, *lt; const blender::Span corner_verts = sys->heat.corner_verts; int tris_num = sys->heat.tris_num; int verts_num = sys->heat.verts_num; @@ -588,7 +588,7 @@ static void heat_laplacian_create(LaplacianSystem *sys) laplacian_add_vertex(sys, sys->heat.verts[a], 0); } - for (a = 0, lt = mlooptri; a < tris_num; a++, lt++) { + for (a = 0, lt = looptris; a < tris_num; a++, lt++) { int vtri[3]; vtri[0] = corner_verts[lt->tri[0]]; vtri[1] = corner_verts[lt->tri[1]]; @@ -608,7 +608,7 @@ static void heat_system_free(LaplacianSystem *sys) { BLI_bvhtree_free(sys->heat.bvhtree); MEM_freeN((void *)sys->heat.vltree); - MEM_freeN((void *)sys->heat.mlooptri); + MEM_freeN((void *)sys->heat.looptris); MEM_freeN(sys->heat.mindist); MEM_freeN(sys->heat.H); @@ -642,7 +642,7 @@ void heat_bone_weighting(Object *ob, const char **error_str) { LaplacianSystem *sys; - MLoopTri *mlooptri; + MLoopTri *looptris; float solution, weight; int *vertsflipped = nullptr, *mask = nullptr; int a, tris_num, j, bbone, firstsegment, lastsegment; @@ -695,13 +695,13 @@ void heat_bone_weighting(Object *ob, sys = laplacian_system_construct_begin(mesh->totvert, tris_num, 1); sys->heat.tris_num = poly_to_tri_count(mesh->faces_num, mesh->totloop); - mlooptri = static_cast( - MEM_mallocN(sizeof(*sys->heat.mlooptri) * sys->heat.tris_num, __func__)); + looptris = static_cast( + MEM_mallocN(sizeof(*sys->heat.looptris) * sys->heat.tris_num, __func__)); blender::bke::mesh::looptris_calc( - vert_positions, faces, corner_verts, {mlooptri, sys->heat.tris_num}); + vert_positions, faces, corner_verts, {looptris, sys->heat.tris_num}); - sys->heat.mlooptri = mlooptri; + sys->heat.looptris = looptris; sys->heat.corner_verts = corner_verts; sys->heat.verts_num = mesh->totvert; sys->heat.verts = verts; @@ -1603,7 +1603,7 @@ static void harmonic_coordinates_bind(MeshDeformModifierData *mmd, MeshDeformBin mdb->boundisect = static_cast( MEM_callocN(sizeof(*mdb->boundisect) * mdb->size3, "MDefBoundIsect")); mdb->semibound = static_cast(MEM_callocN(sizeof(int) * mdb->size3, "MDefSemiBound")); - mdb->bvhtree = BKE_bvhtree_from_mesh_get(&mdb->bvhdata, mdb->cagemesh, BVHTREE_FROM_LOOPTRI, 4); + mdb->bvhtree = BKE_bvhtree_from_mesh_get(&mdb->bvhdata, mdb->cagemesh, BVHTREE_FROM_LOOPTRIS, 4); mdb->inside = static_cast(MEM_callocN(sizeof(int) * mdb->verts_num, "MDefInside")); if (mmd->flag & MOD_MDEF_DYNAMIC_BIND) { diff --git a/source/blender/editors/asset/intern/asset_handle.cc b/source/blender/editors/asset/intern/asset_handle.cc index 684ef1a0b52..b56c79a6905 100644 --- a/source/blender/editors/asset/intern/asset_handle.cc +++ b/source/blender/editors/asset/intern/asset_handle.cc @@ -10,7 +10,7 @@ #include "AS_asset_representation.hh" -#include "BKE_blendfile.h" +#include "BKE_blendfile.hh" #include "BLI_string.h" diff --git a/source/blender/editors/curves/CMakeLists.txt b/source/blender/editors/curves/CMakeLists.txt index a4da63a29d3..27c401204d7 100644 --- a/source/blender/editors/curves/CMakeLists.txt +++ b/source/blender/editors/curves/CMakeLists.txt @@ -24,6 +24,7 @@ set(SRC intern/curves_add.cc intern/curves_attribute_set.cc intern/curves_data.cc + intern/curves_draw.cc intern/curves_edit.cc intern/curves_masks.cc intern/curves_ops.cc @@ -36,6 +37,7 @@ set(LIB PRIVATE bf::blenlib PRIVATE bf::depsgraph PRIVATE bf::dna + PRIVATE bf::extern::curve_fit_nd PRIVATE bf::intern::clog PRIVATE bf::intern::guardedalloc ) diff --git a/source/blender/editors/curves/intern/curves_draw.cc b/source/blender/editors/curves/intern/curves_draw.cc new file mode 100644 index 00000000000..bd21abb0de7 --- /dev/null +++ b/source/blender/editors/curves/intern/curves_draw.cc @@ -0,0 +1,1207 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "DNA_curve_types.h" + +#include "BLI_math_matrix.h" +#include "BLI_math_rotation.h" +#include "BLI_math_vector.h" +#include "BLI_mempool.h" + +#include "BKE_attribute.h" +#include "BKE_context.hh" +#include "BKE_curves.hh" +#include "BKE_report.h" + +#include "DEG_depsgraph.hh" + +#include "WM_api.hh" + +#include "ED_curves.hh" +#include "ED_screen.hh" +#include "ED_space_api.hh" +#include "ED_view3d.hh" + +#include "GPU_batch.h" +#include "GPU_batch_presets.h" +#include "GPU_immediate.h" +#include "GPU_immediate_util.h" +#include "GPU_matrix.h" + +#include "UI_resources.hh" + +#include "RNA_access.hh" +#include "RNA_define.hh" +#include "RNA_enum_types.hh" +#include "RNA_prototypes.h" + +extern "C" { +#include "curve_fit_nd.h" +} + +namespace blender::ed::curves { + +/* Distance between input samples */ +#define STROKE_SAMPLE_DIST_MIN_PX 1 +#define STROKE_SAMPLE_DIST_MAX_PX 3 + +/* Distance between start/end points to consider cyclic */ +#define STROKE_CYCLIC_DIST_PX 8 + +/* -------------------------------------------------------------------- */ +/** \name StrokeElem / #RNA_OperatorStrokeElement Conversion Functions + * \{ */ + +struct StrokeElem { + float mval[2]; + float location_world[3]; + float location_local[3]; + + /* surface normal, may be zero'd */ + float normal_world[3]; + float normal_local[3]; + + float pressure; +}; + +enum CurveDrawState { + CURVE_DRAW_IDLE = 0, + CURVE_DRAW_PAINTING = 1, +}; + +struct CurveDrawData { + short init_event_type; + short curve_type; + float bevel_radius; + bool is_curve_2d; + + /* projecting 2D into 3D space */ + struct { + /* use a plane or project to the surface */ + bool use_plane; + float plane[4]; + + /* use 'rv3d->depths', note that this will become 'damaged' while drawing, but that's OK. */ + bool use_depth; + + /* offset projection by this value */ + bool use_offset; + float offset[3]; /* world-space */ + float surface_offset; + bool use_surface_offset_absolute; + } project; + + /* cursor sampling */ + struct { + /* use substeps, needed for nicely interpolating depth */ + bool use_substeps; + } sample; + + struct { + float min, max, range; + } radius; + + struct { + float mval[2]; + /* Used in case we can't calculate the depth. */ + float location_world[3]; + + float location_world_valid[3]; + + const StrokeElem *selem; + } prev; + + ViewContext vc; + ViewDepths *depths; + CurveDrawState state; + + /* StrokeElem */ + BLI_mempool *stroke_elem_pool; + + void *draw_handle_view; +}; + +static float stroke_elem_radius_from_pressure(const CurveDrawData *cdd, const float pressure) +{ + return ((pressure * cdd->radius.range) + cdd->radius.min) * cdd->bevel_radius; +} + +static float stroke_elem_radius(const CurveDrawData *cdd, const StrokeElem *selem) +{ + return stroke_elem_radius_from_pressure(cdd, selem->pressure); +} + +static void stroke_elem_pressure_set(const CurveDrawData *cdd, StrokeElem *selem, float pressure) +{ + if ((cdd->project.surface_offset != 0.0f) && !cdd->project.use_surface_offset_absolute && + !is_zero_v3(selem->normal_local)) + { + const float adjust = stroke_elem_radius_from_pressure(cdd, pressure) - + stroke_elem_radius_from_pressure(cdd, selem->pressure); + madd_v3_v3fl(selem->location_local, selem->normal_local, adjust); + mul_v3_m4v3(selem->location_world, cdd->vc.obedit->object_to_world, selem->location_local); + } + selem->pressure = pressure; +} + +static void stroke_elem_interp(StrokeElem *selem_out, + const StrokeElem *selem_a, + const StrokeElem *selem_b, + float t) +{ + interp_v2_v2v2(selem_out->mval, selem_a->mval, selem_b->mval, t); + interp_v3_v3v3(selem_out->location_world, selem_a->location_world, selem_b->location_world, t); + interp_v3_v3v3(selem_out->location_local, selem_a->location_local, selem_b->location_local, t); + selem_out->pressure = interpf(selem_a->pressure, selem_b->pressure, t); +} + +/** + * Sets the depth from #StrokeElem.mval + */ +static bool stroke_elem_project(const CurveDrawData *cdd, + const int mval_i[2], + const float mval_fl[2], + float surface_offset, + const float radius, + float r_location_world[3], + float r_normal_world[3]) +{ + ARegion *region = cdd->vc.region; + + bool is_location_world_set = false; + + /* project to 'location_world' */ + if (cdd->project.use_plane) { + /* get the view vector to 'location' */ + if (ED_view3d_win_to_3d_on_plane(region, cdd->project.plane, mval_fl, true, r_location_world)) + { + if (r_normal_world) { + zero_v3(r_normal_world); + } + is_location_world_set = true; + } + } + else { + const ViewDepths *depths = cdd->depths; + if (depths && (uint(mval_i[0]) < depths->w) && (uint(mval_i[1]) < depths->h)) { + float depth_fl = 1.0f; + ED_view3d_depth_read_cached(depths, mval_i, 0, &depth_fl); + const double depth = double(depth_fl); + if ((depth > depths->depth_range[0]) && (depth < depths->depth_range[1])) { + if (ED_view3d_depth_unproject_v3(region, mval_i, depth, r_location_world)) { + is_location_world_set = true; + if (r_normal_world) { + zero_v3(r_normal_world); + } + + if (surface_offset != 0.0f) { + const float offset = cdd->project.use_surface_offset_absolute ? 1.0f : radius; + float normal[3]; + if (ED_view3d_depth_read_cached_normal(region, depths, mval_i, normal)) { + madd_v3_v3fl(r_location_world, normal, offset * surface_offset); + if (r_normal_world) { + copy_v3_v3(r_normal_world, normal); + } + } + } + } + } + } + } + + if (is_location_world_set) { + if (cdd->project.use_offset) { + add_v3_v3(r_location_world, cdd->project.offset); + } + } + + return is_location_world_set; +} + +static bool stroke_elem_project_fallback(const CurveDrawData *cdd, + const int mval_i[2], + const float mval_fl[2], + const float surface_offset, + const float radius, + const float location_fallback_depth[3], + float r_location_world[3], + float r_location_local[3], + float r_normal_world[3], + float r_normal_local[3]) +{ + bool is_depth_found = stroke_elem_project( + cdd, mval_i, mval_fl, surface_offset, radius, r_location_world, r_normal_world); + if (is_depth_found == false) { + ED_view3d_win_to_3d( + cdd->vc.v3d, cdd->vc.region, location_fallback_depth, mval_fl, r_location_world); + zero_v3(r_normal_local); + } + mul_v3_m4v3(r_location_local, cdd->vc.obedit->world_to_object, r_location_world); + + if (!is_zero_v3(r_normal_world)) { + copy_v3_v3(r_normal_local, r_normal_world); + mul_transposed_mat3_m4_v3(cdd->vc.obedit->object_to_world, r_normal_local); + normalize_v3(r_normal_local); + } + else { + zero_v3(r_normal_local); + } + + return is_depth_found; +} + +/** + * \note #StrokeElem.mval & #StrokeElem.pressure must be set first. + */ +static bool stroke_elem_project_fallback_elem(const CurveDrawData *cdd, + const float location_fallback_depth[3], + StrokeElem *selem) +{ + const int mval_i[2] = {int(selem->mval[0]), int(selem->mval[1])}; + const float radius = stroke_elem_radius(cdd, selem); + return stroke_elem_project_fallback(cdd, + mval_i, + selem->mval, + cdd->project.surface_offset, + radius, + location_fallback_depth, + selem->location_world, + selem->location_local, + selem->normal_world, + selem->normal_local); +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Operator/Stroke Conversion + * \{ */ + +static void curve_draw_stroke_to_operator_elem(wmOperator *op, const StrokeElem *selem) +{ + PointerRNA itemptr; + RNA_collection_add(op->ptr, "stroke", &itemptr); + + RNA_float_set_array(&itemptr, "mouse", selem->mval); + RNA_float_set_array(&itemptr, "location", selem->location_world); + RNA_float_set(&itemptr, "pressure", selem->pressure); +} + +static void curve_draw_stroke_from_operator_elem(wmOperator *op, PointerRNA *itemptr) +{ + CurveDrawData *cdd = static_cast(op->customdata); + + StrokeElem *selem = static_cast(BLI_mempool_calloc(cdd->stroke_elem_pool)); + + RNA_float_get_array(itemptr, "mouse", selem->mval); + RNA_float_get_array(itemptr, "location", selem->location_world); + mul_v3_m4v3(selem->location_local, cdd->vc.obedit->world_to_object, selem->location_world); + selem->pressure = RNA_float_get(itemptr, "pressure"); +} + +static void curve_draw_stroke_to_operator(wmOperator *op) +{ + CurveDrawData *cdd = static_cast(op->customdata); + + BLI_mempool_iter iter; + const StrokeElem *selem; + + BLI_mempool_iternew(cdd->stroke_elem_pool, &iter); + for (selem = static_cast(BLI_mempool_iterstep(&iter)); selem; + selem = static_cast(BLI_mempool_iterstep(&iter))) + { + curve_draw_stroke_to_operator_elem(op, selem); + } +} + +static void curve_draw_stroke_from_operator(wmOperator *op) +{ + RNA_BEGIN (op->ptr, itemptr, "stroke") { + curve_draw_stroke_from_operator_elem(op, &itemptr); + } + RNA_END; +} + +/** \} */ + +static void curve_draw_stroke_3d(const bContext * /*C*/, ARegion * /*region*/, void *arg) +{ + wmOperator *op = static_cast(arg); + CurveDrawData *cdd = static_cast(op->customdata); + + const int stroke_len = BLI_mempool_len(cdd->stroke_elem_pool); + + if (stroke_len == 0) { + return; + } + + Object *obedit = cdd->vc.obedit; + + if (cdd->bevel_radius > 0.0f) { + BLI_mempool_iter iter; + const StrokeElem *selem; + + const float location_zero[3] = {0}; + const float *location_prev = location_zero; + + float color[3]; + UI_GetThemeColor3fv(TH_WIRE, color); + + GPUBatch *sphere = GPU_batch_preset_sphere(0); + GPU_batch_program_set_builtin(sphere, GPU_SHADER_3D_UNIFORM_COLOR); + GPU_batch_uniform_3fv(sphere, "color", color); + + /* scale to edit-mode space */ + GPU_matrix_push(); + GPU_matrix_mul(obedit->object_to_world); + + BLI_mempool_iternew(cdd->stroke_elem_pool, &iter); + for (selem = static_cast(BLI_mempool_iterstep(&iter)); selem; + selem = static_cast(BLI_mempool_iterstep(&iter))) + { + GPU_matrix_translate_3f(selem->location_local[0] - location_prev[0], + selem->location_local[1] - location_prev[1], + selem->location_local[2] - location_prev[2]); + + const float radius = stroke_elem_radius(cdd, selem); + + GPU_matrix_push(); + GPU_matrix_scale_1f(radius); + GPU_batch_draw(sphere); + GPU_matrix_pop(); + + location_prev = selem->location_local; + } + + GPU_matrix_pop(); + } + + if (stroke_len > 1) { + float(*coord_array)[3] = static_cast( + MEM_mallocN(sizeof(*coord_array) * stroke_len, __func__)); + + { + BLI_mempool_iter iter; + const StrokeElem *selem; + int i; + BLI_mempool_iternew(cdd->stroke_elem_pool, &iter); + for (selem = static_cast(BLI_mempool_iterstep(&iter)), i = 0; selem; + selem = static_cast(BLI_mempool_iterstep(&iter)), i++) + { + copy_v3_v3(coord_array[i], selem->location_world); + } + } + + { + GPUVertFormat *format = immVertexFormat(); + uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); + immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); + + GPU_depth_test(GPU_DEPTH_NONE); + GPU_blend(GPU_BLEND_ALPHA); + GPU_line_smooth(true); + GPU_line_width(3.0f); + + imm_cpack(0x0); + immBegin(GPU_PRIM_LINE_STRIP, stroke_len); + for (int i = 0; i < stroke_len; i++) { + immVertex3fv(pos, coord_array[i]); + } + immEnd(); + + GPU_line_width(1.0f); + + imm_cpack(0xffffffff); + immBegin(GPU_PRIM_LINE_STRIP, stroke_len); + for (int i = 0; i < stroke_len; i++) { + immVertex3fv(pos, coord_array[i]); + } + immEnd(); + + /* Reset defaults */ + GPU_depth_test(GPU_DEPTH_LESS_EQUAL); + GPU_blend(GPU_BLEND_NONE); + GPU_line_smooth(false); + + immUnbindProgram(); + } + + MEM_freeN(coord_array); + } +} + +static void curve_draw_event_add(wmOperator *op, const wmEvent *event) +{ + CurveDrawData *cdd = static_cast(op->customdata); + Object *obedit = cdd->vc.obedit; + + invert_m4_m4(obedit->world_to_object, obedit->object_to_world); + + StrokeElem *selem = static_cast(BLI_mempool_calloc(cdd->stroke_elem_pool)); + + ARRAY_SET_ITEMS(selem->mval, event->mval[0], event->mval[1]); + + /* handle pressure sensitivity (which is supplied by tablets or otherwise 1.0) */ + selem->pressure = event->tablet.pressure; + + bool is_depth_found = stroke_elem_project_fallback_elem( + cdd, cdd->prev.location_world_valid, selem); + + if (is_depth_found) { + /* use the depth if a fallback wasn't used */ + copy_v3_v3(cdd->prev.location_world_valid, selem->location_world); + } + copy_v3_v3(cdd->prev.location_world, selem->location_world); + + float len_sq = len_squared_v2v2(cdd->prev.mval, selem->mval); + copy_v2_v2(cdd->prev.mval, selem->mval); + + if (cdd->sample.use_substeps && cdd->prev.selem) { + const StrokeElem selem_target = *selem; + StrokeElem *selem_new_last = selem; + if (len_sq >= square_f(STROKE_SAMPLE_DIST_MAX_PX)) { + int n = int(ceil(sqrt(double(len_sq)))) / STROKE_SAMPLE_DIST_MAX_PX; + + for (int i = 1; i < n; i++) { + StrokeElem *selem_new = selem_new_last; + stroke_elem_interp(selem_new, cdd->prev.selem, &selem_target, float(i) / n); + + const bool is_depth_found_substep = stroke_elem_project_fallback_elem( + cdd, cdd->prev.location_world_valid, selem_new); + if (is_depth_found == false) { + if (is_depth_found_substep) { + copy_v3_v3(cdd->prev.location_world_valid, selem_new->location_world); + } + } + + selem_new_last = static_cast(BLI_mempool_calloc(cdd->stroke_elem_pool)); + } + } + selem = selem_new_last; + *selem_new_last = selem_target; + } + + cdd->prev.selem = selem; + + ED_region_tag_redraw(cdd->vc.region); +} + +static void curve_draw_event_add_first(wmOperator *op, const wmEvent *event) +{ + CurveDrawData *cdd = static_cast(op->customdata); + const CurvePaintSettings *cps = &cdd->vc.scene->toolsettings->curve_paint_settings; + + /* add first point */ + curve_draw_event_add(op, event); + + if ((cps->depth_mode == CURVE_PAINT_PROJECT_SURFACE) && cdd->project.use_depth && + (cps->flag & CURVE_PAINT_FLAG_DEPTH_STROKE_ENDPOINTS)) + { + RegionView3D *rv3d = cdd->vc.rv3d; + + cdd->project.use_depth = false; + cdd->project.use_plane = true; + + float normal[3] = {0.0f}; + if (ELEM(cps->surface_plane, + CURVE_PAINT_SURFACE_PLANE_NORMAL_VIEW, + CURVE_PAINT_SURFACE_PLANE_NORMAL_SURFACE)) + { + if (ED_view3d_depth_read_cached_normal(cdd->vc.region, cdd->depths, event->mval, normal)) { + if (cps->surface_plane == CURVE_PAINT_SURFACE_PLANE_NORMAL_VIEW) { + float cross_a[3], cross_b[3]; + cross_v3_v3v3(cross_a, rv3d->viewinv[2], normal); + cross_v3_v3v3(cross_b, normal, cross_a); + copy_v3_v3(normal, cross_b); + } + } + } + + /* CURVE_PAINT_SURFACE_PLANE_VIEW or fallback */ + if (is_zero_v3(normal)) { + copy_v3_v3(normal, rv3d->viewinv[2]); + } + + normalize_v3_v3(cdd->project.plane, normal); + cdd->project.plane[3] = -dot_v3v3(cdd->project.plane, cdd->prev.location_world_valid); + + /* Special case for when we only have offset applied on the first-hit, + * the remaining stroke must be offset too. */ + if (cdd->project.surface_offset != 0.0f) { + const float mval_fl[2] = {float(event->mval[0]), float(event->mval[1])}; + + float location_no_offset[3]; + + if (stroke_elem_project(cdd, event->mval, mval_fl, 0.0f, 0.0f, location_no_offset, nullptr)) + { + sub_v3_v3v3(cdd->project.offset, cdd->prev.location_world_valid, location_no_offset); + if (!is_zero_v3(cdd->project.offset)) { + cdd->project.use_offset = true; + } + } + } + /* end special case */ + } + + cdd->init_event_type = event->type; + cdd->state = CURVE_DRAW_PAINTING; +} + +static void curve_draw_exit(wmOperator *op) +{ + CurveDrawData *cdd = static_cast(op->customdata); + if (cdd) { + if (cdd->draw_handle_view) { + ED_region_draw_cb_exit(cdd->vc.region->type, cdd->draw_handle_view); + WM_cursor_modal_restore(cdd->vc.win); + } + + if (cdd->stroke_elem_pool) { + BLI_mempool_destroy(cdd->stroke_elem_pool); + } + + if (cdd->depths) { + ED_view3d_depths_free(cdd->depths); + } + MEM_freeN(cdd); + op->customdata = nullptr; + } +} + +static bool curve_draw_init(bContext *C, wmOperator *op, bool is_invoke) +{ + BLI_assert(op->customdata == nullptr); + + CurveDrawData *cdd = static_cast(MEM_callocN(sizeof(*cdd), __func__)); + + Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); + + if (is_invoke) { + cdd->vc = ED_view3d_viewcontext_init(C, depsgraph); + if (ELEM(nullptr, cdd->vc.region, cdd->vc.rv3d, cdd->vc.v3d, cdd->vc.win, cdd->vc.scene)) { + MEM_freeN(cdd); + BKE_report(op->reports, RPT_ERROR, "Unable to access 3D viewport"); + return false; + } + } + else { + cdd->vc.bmain = CTX_data_main(C); + cdd->vc.depsgraph = depsgraph; + cdd->vc.scene = CTX_data_scene(C); + cdd->vc.view_layer = CTX_data_view_layer(C); + cdd->vc.obedit = CTX_data_edit_object(C); + + /* Using an empty stroke complicates logic later, + * it's simplest to disallow early on (see: #94085). */ + if (RNA_collection_is_empty(op->ptr, "stroke")) { + MEM_freeN(cdd); + BKE_report(op->reports, RPT_ERROR, "The \"stroke\" cannot be empty"); + return false; + } + } + + op->customdata = cdd; + cdd->bevel_radius = 1.0f; + cdd->is_curve_2d = RNA_boolean_get(op->ptr, "is_curve_2d"); + + const CurvePaintSettings *cps = &cdd->vc.scene->toolsettings->curve_paint_settings; + + cdd->curve_type = cps->curve_type; + + cdd->radius.min = cps->radius_min; + cdd->radius.max = cps->radius_max; + cdd->radius.range = cps->radius_max - cps->radius_min; + cdd->project.surface_offset = cps->surface_offset; + cdd->project.use_surface_offset_absolute = (cps->flag & + CURVE_PAINT_FLAG_DEPTH_STROKE_OFFSET_ABS) != 0; + + cdd->stroke_elem_pool = BLI_mempool_create(sizeof(StrokeElem), 0, 512, BLI_MEMPOOL_ALLOW_ITER); + + return true; +} + +static int curves_draw_exec(bContext *C, wmOperator *op) +{ + if (op->customdata == nullptr) { + if (!curve_draw_init(C, op, false)) { + return OPERATOR_CANCELLED; + } + } + + CurveDrawData *cdd = static_cast(op->customdata); + + const CurvePaintSettings *cps = &cdd->vc.scene->toolsettings->curve_paint_settings; + Object *obedit = cdd->vc.obedit; + + int stroke_len = BLI_mempool_len(cdd->stroke_elem_pool); + + invert_m4_m4(obedit->world_to_object, obedit->object_to_world); + + if (BLI_mempool_len(cdd->stroke_elem_pool) == 0) { + curve_draw_stroke_from_operator(op); + stroke_len = BLI_mempool_len(cdd->stroke_elem_pool); + } + + /* error in object local space */ + const int fit_method = RNA_enum_get(op->ptr, "fit_method"); + const float error_threshold = RNA_float_get(op->ptr, "error_threshold"); + const float corner_angle = RNA_float_get(op->ptr, "corner_angle"); + const bool use_cyclic = RNA_boolean_get(op->ptr, "use_cyclic"); + + const float radius_min = cps->radius_min; + const float radius_max = cps->radius_max; + const float radius_range = cps->radius_max - cps->radius_min; + + Curves *curves_id = static_cast(obedit->data); + bke::CurvesGeometry &curves = curves_id->geometry.wrap(); + const eAttrDomain selection_domain = eAttrDomain(curves_id->selection_domain); + const int curve_index = curves.curves_num(); + + const bool use_pressure_radius = (cps->flag & CURVE_PAINT_FLAG_PRESSURE_RADIUS) || + ((cps->radius_taper_start != 0.0f) || + (cps->radius_taper_end != 0.0f)); + + if (cdd->curve_type == CU_BEZIER) { + /* Allow to interpolate multiple channels */ + int dims = 3; + const int radius_index = use_pressure_radius ? dims++ : -1; + + float *coords = static_cast( + MEM_mallocN(sizeof(*coords) * stroke_len * dims, __func__)); + + float *cubic_spline = nullptr; + uint cubic_spline_len = 0; + + { + BLI_mempool_iter iter; + const StrokeElem *selem; + float *co = coords; + + BLI_mempool_iternew(cdd->stroke_elem_pool, &iter); + for (selem = static_cast(BLI_mempool_iterstep(&iter)); selem; + selem = static_cast(BLI_mempool_iterstep(&iter)), co += dims) + { + copy_v3_v3(co, selem->location_local); + if (radius_index != -1) { + co[radius_index] = selem->pressure; + } + + /* remove doubles */ + if ((co != coords) && UNLIKELY(memcmp(co, co - dims, sizeof(float) * dims) == 0)) { + co -= dims; + stroke_len--; + } + } + } + + uint *corners = nullptr; + uint corners_len = 0; + + if ((fit_method == CURVE_PAINT_FIT_METHOD_SPLIT) && (corner_angle < float(M_PI))) { + /* this could be configurable... */ + const float corner_radius_min = error_threshold / 8; + const float corner_radius_max = error_threshold * 2; + const uint samples_max = 16; + + curve_fit_corners_detect_fl(coords, + stroke_len, + dims, + corner_radius_min, + corner_radius_max, + samples_max, + corner_angle, + &corners, + &corners_len); + } + + uint *corners_index = nullptr; + uint corners_index_len = 0; + uint calc_flag = CURVE_FIT_CALC_HIGH_QUALIY; + + if ((stroke_len > 2) && use_cyclic) { + calc_flag |= CURVE_FIT_CALC_CYCLIC; + } + + int result; + if (fit_method == CURVE_PAINT_FIT_METHOD_REFIT) { + result = curve_fit_cubic_to_points_refit_fl(coords, + stroke_len, + dims, + error_threshold, + calc_flag, + nullptr, + 0, + corner_angle, + &cubic_spline, + &cubic_spline_len, + nullptr, + &corners_index, + &corners_index_len); + } + else { + result = curve_fit_cubic_to_points_fl(coords, + stroke_len, + dims, + error_threshold, + calc_flag, + corners, + corners_len, + &cubic_spline, + &cubic_spline_len, + nullptr, + &corners_index, + &corners_index_len); + } + + MEM_freeN(coords); + if (corners) { + free(corners); + } + + if (result == 0) { + curves.resize(curves.points_num() + cubic_spline_len, curve_index + 1); + MutableSpan curve_types = curves.curve_types_for_write(); + curve_types[curve_index] = CURVE_TYPE_BEZIER; + curves.update_curve_types(); + + MutableSpan handle_positions_l = curves.handle_positions_left_for_write(); + MutableSpan handle_positions_r = curves.handle_positions_right_for_write(); + MutableSpan handle_types_l = curves.handle_types_left_for_write(); + MutableSpan handle_types_r = curves.handle_types_right_for_write(); + MutableSpan cyclic = curves.cyclic_for_write(); + MutableSpan resolution = curves.resolution_for_write(); + + resolution[curve_index] = 12; + IndexRange new_points = curves.points_by_curve()[curve_index]; + MutableSpan positions = curves.positions_for_write(); + + bke::MutableAttributeAccessor curves_attributes = curves.attributes_for_write(); + bke::SpanAttributeWriter radius_attribute = + curves_attributes.lookup_or_add_for_write_only_span("radius", ATTR_DOMAIN_POINT); + MutableSpan radii = radius_attribute.span; + + bke::GSpanAttributeWriter selection = ensure_selection_attribute( + curves, selection_domain, CD_PROP_BOOL); + + curves::fill_selection_false(selection.span); + + float *co = cubic_spline; + + for (const int64_t i : new_points) { + const float *handle_l = co + (dims * 0); + const float *pt = co + (dims * 1); + const float *handle_r = co + (dims * 2); + + copy_v3_v3(handle_positions_l[i], handle_l); + copy_v3_v3(positions[i], pt); + copy_v3_v3(handle_positions_r[i], handle_r); + + const float radius = (radius_index != -1) ? + (pt[radius_index] * cdd->radius.range) + cdd->radius.min : + radius_max; + radii[i] = radius; + + handle_types_l[i] = BEZIER_HANDLE_ALIGN; + handle_types_r[i] = BEZIER_HANDLE_ALIGN; + co += (dims * 3); + } + + curves::fill_selection_true( + selection.span, + selection.domain == ATTR_DOMAIN_POINT ? new_points : IndexRange(curve_index, 1)); + selection.finish(); + // bezt->f1 = bezt->f2 = bezt->f3 = SELECT; + + if (corners_index) { + /* ignore the first and last */ + uint i_start = 0, i_end = corners_index_len; + + if ((corners_index_len >= 2) && (calc_flag & CURVE_FIT_CALC_CYCLIC) == 0) { + i_start += 1; + i_end -= 1; + } + + for (const auto i : IndexRange(i_start, i_end - i_start)) { + const int64_t corner_i = new_points[corners_index[i]]; + handle_types_l[corner_i] = BEZIER_HANDLE_FREE; + handle_types_r[corner_i] = BEZIER_HANDLE_FREE; + } + } + + cyclic[curve_index] = bool(calc_flag & CURVE_FIT_CALC_CYCLIC); + + radius_attribute.finish(); + } + + if (corners_index) { + free(corners_index); + } + + if (cubic_spline) { + free(cubic_spline); + } + } + else { /* CU_POLY */ + curves.resize(curves.points_num() + stroke_len, curve_index + 1); + MutableSpan curve_types = curves.curve_types_for_write(); + curve_types[curve_index] = CURVE_TYPE_POLY; + curves.update_curve_types(); + + IndexRange new_points = curves.points_by_curve()[curve_index]; + MutableSpan positions = curves.positions_for_write(); + bke::MutableAttributeAccessor curves_attributes = curves.attributes_for_write(); + bke::SpanAttributeWriter radius_attribute = + curves_attributes.lookup_or_add_for_write_only_span("radius", ATTR_DOMAIN_POINT); + MutableSpan radii = radius_attribute.span; + + bke::GSpanAttributeWriter selection = ensure_selection_attribute( + curves, selection_domain, CD_PROP_BOOL); + curves::fill_selection_false(selection.span); + + IndexRange::Iterator points_iter = new_points.begin(); + + BLI_mempool_iter iter; + BLI_mempool_iternew(cdd->stroke_elem_pool, &iter); + for (auto *selem = static_cast(BLI_mempool_iterstep(&iter)); selem; + selem = static_cast(BLI_mempool_iterstep(&iter)), points_iter++) + { + const int64_t i = *points_iter; + copy_v3_v3(positions[i], selem->location_local); + if (cdd->is_curve_2d) { + positions[i][2] = 0.0f; + } + + radii[i] = use_pressure_radius ? (selem->pressure * radius_range) + radius_min : + cps->radius_max; + } + curves::fill_selection_true( + selection.span, + selection.domain == ATTR_DOMAIN_POINT ? new_points : IndexRange(curve_index, 1)); + selection.finish(); + radius_attribute.finish(); + } + + WM_event_add_notifier(C, NC_GEOM | ND_DATA, obedit->data); + DEG_id_tag_update(static_cast(obedit->data), 0); + + curve_draw_exit(op); + + return OPERATOR_FINISHED; +} + +static int curves_draw_invoke(bContext *C, wmOperator *op, const wmEvent *event) +{ + if (RNA_struct_property_is_set(op->ptr, "stroke")) { + return curves_draw_exec(C, op); + } + + if (!curve_draw_init(C, op, true)) { + return OPERATOR_CANCELLED; + } + + CurveDrawData *cdd = static_cast(op->customdata); + + const CurvePaintSettings *cps = &cdd->vc.scene->toolsettings->curve_paint_settings; + + const bool is_modal = RNA_boolean_get(op->ptr, "wait_for_input"); + + /* Fallback (in case we can't find the depth on first test). */ + { + const float mval_fl[2] = {float(event->mval[0]), float(event->mval[1])}; + float center[3]; + negate_v3_v3(center, cdd->vc.rv3d->ofs); + ED_view3d_win_to_3d(cdd->vc.v3d, cdd->vc.region, center, mval_fl, cdd->prev.location_world); + copy_v3_v3(cdd->prev.location_world_valid, cdd->prev.location_world); + } + + cdd->draw_handle_view = ED_region_draw_cb_activate( + cdd->vc.region->type, curve_draw_stroke_3d, op, REGION_DRAW_POST_VIEW); + WM_cursor_modal_set(cdd->vc.win, WM_CURSOR_PAINT_BRUSH); + + { + View3D *v3d = cdd->vc.v3d; + RegionView3D *rv3d = cdd->vc.rv3d; + Object *obedit = cdd->vc.obedit; + + const float *plane_no = nullptr; + const float *plane_co = nullptr; + + if (cdd->is_curve_2d) { + /* 2D overrides other options */ + plane_co = obedit->object_to_world[3]; + plane_no = obedit->object_to_world[2]; + cdd->project.use_plane = true; + } + else { + if ((cps->depth_mode == CURVE_PAINT_PROJECT_SURFACE) && (v3d->shading.type > OB_WIRE)) { + /* needed or else the draw matrix can be incorrect */ + view3d_operator_needs_opengl(C); + + ED_view3d_depth_override(cdd->vc.depsgraph, + cdd->vc.region, + cdd->vc.v3d, + nullptr, + V3D_DEPTH_NO_GPENCIL, + &cdd->depths); + + if (cdd->depths != nullptr) { + cdd->project.use_depth = true; + } + else { + BKE_report(op->reports, RPT_WARNING, "Unable to access depth buffer, using view plane"); + cdd->project.use_depth = false; + } + } + + /* use view plane (when set or as fallback when surface can't be found) */ + if (cdd->project.use_depth == false) { + plane_co = cdd->vc.scene->cursor.location; + plane_no = rv3d->viewinv[2]; + cdd->project.use_plane = true; + } + + if (cdd->project.use_depth && (cdd->curve_type != CU_POLY)) { + cdd->sample.use_substeps = true; + } + } + + if (cdd->project.use_plane) { + normalize_v3_v3(cdd->project.plane, plane_no); + cdd->project.plane[3] = -dot_v3v3(cdd->project.plane, plane_co); + } + } + + if (is_modal == false) { + curve_draw_event_add_first(op, event); + } + + /* add temp handler */ + WM_event_add_modal_handler(C, op); + + return OPERATOR_RUNNING_MODAL; +} + +static void curve_draw_cancel(bContext * /*C*/, wmOperator *op) +{ + curve_draw_exit(op); +} + +/** + * Initialize values before calling 'exec' (when running interactively). + */ +static void curve_draw_exec_precalc(wmOperator *op) +{ + CurveDrawData *cdd = static_cast(op->customdata); + const CurvePaintSettings *cps = &cdd->vc.scene->toolsettings->curve_paint_settings; + PropertyRNA *prop; + + prop = RNA_struct_find_property(op->ptr, "fit_method"); + if (!RNA_property_is_set(op->ptr, prop)) { + RNA_property_enum_set(op->ptr, prop, cps->fit_method); + } + + prop = RNA_struct_find_property(op->ptr, "corner_angle"); + if (!RNA_property_is_set(op->ptr, prop)) { + const float corner_angle = (cps->flag & CURVE_PAINT_FLAG_CORNERS_DETECT) ? cps->corner_angle : + float(M_PI); + RNA_property_float_set(op->ptr, prop, corner_angle); + } + + prop = RNA_struct_find_property(op->ptr, "error_threshold"); + if (!RNA_property_is_set(op->ptr, prop)) { + + /* Error isn't set so we'll have to calculate it from the pixel values. */ + BLI_mempool_iter iter; + const StrokeElem *selem, *selem_prev; + + float len_3d = 0.0f, len_2d = 0.0f; + float scale_px; /* pixel to local space scale */ + + int i = 0; + BLI_mempool_iternew(cdd->stroke_elem_pool, &iter); + selem_prev = static_cast(BLI_mempool_iterstep(&iter)); + for (selem = static_cast(BLI_mempool_iterstep(&iter)); selem; + selem = static_cast(BLI_mempool_iterstep(&iter)), i++) + { + len_3d += len_v3v3(selem->location_local, selem_prev->location_local); + len_2d += len_v2v2(selem->mval, selem_prev->mval); + selem_prev = selem; + } + scale_px = ((len_3d > 0.0f) && (len_2d > 0.0f)) ? (len_3d / len_2d) : 0.0f; + float error_threshold = (cps->error_threshold * UI_SCALE_FAC) * scale_px; + RNA_property_float_set(op->ptr, prop, error_threshold); + } + + prop = RNA_struct_find_property(op->ptr, "use_cyclic"); + if (!RNA_property_is_set(op->ptr, prop)) { + bool use_cyclic = false; + + if (BLI_mempool_len(cdd->stroke_elem_pool) > 2) { + BLI_mempool_iter iter; + const StrokeElem *selem, *selem_first, *selem_last; + + BLI_mempool_iternew(cdd->stroke_elem_pool, &iter); + selem_first = selem_last = static_cast(BLI_mempool_iterstep(&iter)); + for (selem = static_cast(BLI_mempool_iterstep(&iter)); selem; + selem = static_cast(BLI_mempool_iterstep(&iter))) + { + selem_last = selem; + } + + if (len_squared_v2v2(selem_first->mval, selem_last->mval) <= + square_f(STROKE_CYCLIC_DIST_PX * UI_SCALE_FAC)) + { + use_cyclic = true; + } + } + + RNA_property_boolean_set(op->ptr, prop, use_cyclic); + } + + if ((cps->radius_taper_start != 0.0f) || (cps->radius_taper_end != 0.0f)) { + /* NOTE: we could try to de-duplicate the length calculations above. */ + const int stroke_len = BLI_mempool_len(cdd->stroke_elem_pool); + + BLI_mempool_iter iter; + StrokeElem *selem, *selem_prev; + + float *lengths = static_cast(MEM_mallocN(sizeof(float) * stroke_len, __func__)); + StrokeElem **selem_array = static_cast( + MEM_mallocN(sizeof(*selem_array) * stroke_len, __func__)); + lengths[0] = 0.0f; + + float len_3d = 0.0f; + + int i = 1; + BLI_mempool_iternew(cdd->stroke_elem_pool, &iter); + selem_prev = static_cast(BLI_mempool_iterstep(&iter)); + selem_array[0] = selem_prev; + for (selem = static_cast(BLI_mempool_iterstep(&iter)); selem; + selem = static_cast(BLI_mempool_iterstep(&iter)), i++) + { + const float len_3d_segment = len_v3v3(selem->location_local, selem_prev->location_local); + len_3d += len_3d_segment; + lengths[i] = len_3d; + selem_array[i] = selem; + selem_prev = selem; + } + + if (cps->radius_taper_start != 0.0f) { + const float len_taper_max = cps->radius_taper_start * len_3d; + for (i = 0; i < stroke_len && lengths[i] < len_taper_max; i++) { + const float pressure_new = selem_array[i]->pressure * (lengths[i] / len_taper_max); + stroke_elem_pressure_set(cdd, selem_array[i], pressure_new); + } + } + + if (cps->radius_taper_end != 0.0f) { + const float len_taper_max = cps->radius_taper_end * len_3d; + const float len_taper_min = len_3d - len_taper_max; + for (i = stroke_len - 1; i > 0 && lengths[i] > len_taper_min; i--) { + const float pressure_new = selem_array[i]->pressure * + ((len_3d - lengths[i]) / len_taper_max); + stroke_elem_pressure_set(cdd, selem_array[i], pressure_new); + } + } + + MEM_freeN(lengths); + MEM_freeN(selem_array); + } +} + +static int curves_draw_modal(bContext *C, wmOperator *op, const wmEvent *event) +{ + int ret = OPERATOR_RUNNING_MODAL; + CurveDrawData *cdd = static_cast(op->customdata); + + UNUSED_VARS(C, op); + + if (event->type == cdd->init_event_type) { + if (event->val == KM_RELEASE) { + ED_region_tag_redraw(cdd->vc.region); + + curve_draw_exec_precalc(op); + + curve_draw_stroke_to_operator(op); + + curves_draw_exec(C, op); + + return OPERATOR_FINISHED; + } + } + else if (ELEM(event->type, EVT_ESCKEY, RIGHTMOUSE)) { + ED_region_tag_redraw(cdd->vc.region); + curve_draw_cancel(C, op); + return OPERATOR_CANCELLED; + } + else if (ELEM(event->type, LEFTMOUSE)) { + if (event->val == KM_PRESS) { + curve_draw_event_add_first(op, event); + } + } + else if (ISMOUSE_MOTION(event->type)) { + if (cdd->state == CURVE_DRAW_PAINTING) { + const float mval_fl[2] = {float(event->mval[0]), float(event->mval[1])}; + if (len_squared_v2v2(mval_fl, cdd->prev.mval) > square_f(STROKE_SAMPLE_DIST_MIN_PX)) { + curve_draw_event_add(op, event); + } + } + } + + return ret; +} + +void CURVES_OT_draw(wmOperatorType *ot) +{ + ot->name = "Draw Curves"; + ot->idname = __func__; + ot->description = "Draw a freehand curve"; + + ot->exec = curves_draw_exec; + ot->invoke = curves_draw_invoke; + ot->modal = curves_draw_modal; + ot->poll = editable_curves_in_edit_mode_poll; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + + /* properties */ + PropertyRNA *prop; + + prop = RNA_def_float_distance(ot->srna, + "error_threshold", + 0.0f, + 0.0f, + 10.0f, + "Error", + "Error distance threshold (in object units)", + 0.0001f, + 10.0f); + RNA_def_property_ui_range(prop, 0.0, 10, 1, 4); + + RNA_def_enum(ot->srna, + "fit_method", + rna_enum_curve_fit_method_items, + CURVE_PAINT_FIT_METHOD_REFIT, + "Fit Method", + ""); + + prop = RNA_def_float_distance( + ot->srna, "corner_angle", DEG2RADF(70.0f), 0.0f, M_PI, "Corner Angle", "", 0.0f, M_PI); + RNA_def_property_subtype(prop, PROP_ANGLE); + + prop = RNA_def_boolean(ot->srna, "use_cyclic", true, "Cyclic", ""); + RNA_def_property_flag(prop, PROP_SKIP_SAVE); + + prop = RNA_def_collection_runtime(ot->srna, "stroke", &RNA_OperatorStrokeElement, "Stroke", ""); + RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); + + prop = RNA_def_boolean(ot->srna, "wait_for_input", true, "Wait for Input", ""); + RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); + + prop = RNA_def_boolean(ot->srna, "is_curve_2d", false, "Curve 2D", ""); + RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); +} + +} // namespace blender::ed::curves diff --git a/source/blender/editors/curves/intern/curves_edit.cc b/source/blender/editors/curves/intern/curves_edit.cc index 8766f216cfd..6e5f7b4bd10 100644 --- a/source/blender/editors/curves/intern/curves_edit.cc +++ b/source/blender/editors/curves/intern/curves_edit.cc @@ -6,6 +6,8 @@ * \ingroup edcurves */ +#include "BLI_array_utils.hh" + #include "BKE_curves.hh" #include "ED_curves.hh" @@ -34,4 +36,187 @@ bool remove_selection(bke::CurvesGeometry &curves, const eAttrDomain selection_d return attributes.domain_size(selection_domain) != domain_size_orig; } +void duplicate_points(bke::CurvesGeometry &curves, const IndexMask &mask) +{ + const OffsetIndices points_by_curve = curves.points_by_curve(); + const VArray src_cyclic = curves.cyclic(); + + Array points_to_duplicate(curves.points_num()); + mask.to_bools(points_to_duplicate.as_mutable_span()); + const int num_points_to_add = mask.size(); + + int curr_dst_point_start = 0; + Array dst_to_src_point(num_points_to_add); + Vector dst_curve_counts; + Vector dst_to_src_curve; + Vector dst_cyclic; + + /* Add the duplicated curves and points. */ + for (const int curve_i : curves.curves_range()) { + const IndexRange points = points_by_curve[curve_i]; + const Span curve_points_to_duplicate = points_to_duplicate.as_span().slice(points); + const bool curve_cyclic = src_cyclic[curve_i]; + + /* Note, these ranges start at zero and needed to be shifted by `points.first()` */ + const Vector ranges_to_duplicate = array_utils::find_all_ranges( + curve_points_to_duplicate, true); + + if (ranges_to_duplicate.is_empty()) { + continue; + } + + const bool is_last_segment_selected = curve_cyclic && + ranges_to_duplicate.first().first() == 0 && + ranges_to_duplicate.last().last() == points.size() - 1; + const bool is_curve_self_joined = is_last_segment_selected && ranges_to_duplicate.size() != 1; + const bool is_cyclic = ranges_to_duplicate.size() == 1 && is_last_segment_selected; + + const IndexRange range_ids = ranges_to_duplicate.index_range(); + /* Skip the first range because it is joined to the end of the last range. */ + for (const int range_i : ranges_to_duplicate.index_range().drop_front(is_curve_self_joined)) { + const IndexRange range = ranges_to_duplicate[range_i]; + + array_utils::fill_index_range( + dst_to_src_point.as_mutable_span().slice(curr_dst_point_start, range.size()), + range.start() + points.first()); + curr_dst_point_start += range.size(); + + dst_curve_counts.append(range.size()); + dst_to_src_curve.append(curve_i); + dst_cyclic.append(is_cyclic); + } + + /* Join the first range to the end of the last range. */ + if (is_curve_self_joined) { + const IndexRange first_range = ranges_to_duplicate[range_ids.first()]; + array_utils::fill_index_range( + dst_to_src_point.as_mutable_span().slice(curr_dst_point_start, first_range.size()), + first_range.start() + points.first()); + curr_dst_point_start += first_range.size(); + dst_curve_counts[dst_curve_counts.size() - 1] += first_range.size(); + } + } + + const int old_curves_num = curves.curves_num(); + const int old_points_num = curves.points_num(); + const int num_curves_to_add = dst_to_src_curve.size(); + + bke::MutableAttributeAccessor attributes = curves.attributes_for_write(); + + /* Delete selection attribute so that it will not have to be resized. */ + attributes.remove(".selection"); + + curves.resize(old_points_num + num_points_to_add, old_curves_num + num_curves_to_add); + + MutableSpan new_curve_offsets = curves.offsets_for_write(); + array_utils::copy(dst_curve_counts.as_span(), + new_curve_offsets.drop_front(old_curves_num).drop_back(1)); + offset_indices::accumulate_counts_to_offsets(new_curve_offsets.drop_front(old_curves_num), + old_points_num); + + /* Transfer curve and point attributes. */ + attributes.for_all([&](const bke::AttributeIDRef &id, const bke::AttributeMetaData meta_data) { + bke::GSpanAttributeWriter attribute = attributes.lookup_for_write_span(id); + if (!attribute) { + return true; + } + + switch (meta_data.domain) { + case ATTR_DOMAIN_CURVE: { + if (id.name() == "cyclic") { + return true; + } + bke::attribute_math::gather( + attribute.span, + dst_to_src_curve, + attribute.span.slice(IndexRange(old_curves_num, num_curves_to_add))); + break; + } + case ATTR_DOMAIN_POINT: { + bke::attribute_math::gather( + attribute.span, + dst_to_src_point, + attribute.span.slice(IndexRange(old_points_num, num_points_to_add))); + break; + } + default: { + attribute.finish(); + BLI_assert_unreachable(); + return true; + } + } + + attribute.finish(); + + return true; + }); + + if (!(src_cyclic.is_single() && !src_cyclic.get_internal_single())) { + array_utils::copy(dst_cyclic.as_span(), curves.cyclic_for_write().drop_front(old_curves_num)); + } + + curves.update_curve_types(); + curves.tag_topology_changed(); + + bke::SpanAttributeWriter selection = attributes.lookup_or_add_for_write_span( + ".selection", ATTR_DOMAIN_POINT); + selection.span.take_back(num_points_to_add).fill(true); + selection.finish(); +} + +void duplicate_curves(bke::CurvesGeometry &curves, const IndexMask &mask) +{ + const int orig_points_num = curves.points_num(); + const int orig_curves_num = curves.curves_num(); + bke::MutableAttributeAccessor attributes = curves.attributes_for_write(); + + /* Delete selection attribute so that it will not have to be resized. */ + attributes.remove(".selection"); + + /* Resize the curves and copy the offsets of duplicated curves into the new offsets. */ + curves.resize(curves.points_num(), orig_curves_num + mask.size()); + const IndexRange orig_curves_range = curves.curves_range().take_front(orig_curves_num); + const IndexRange new_curves_range = curves.curves_range().drop_front(orig_curves_num); + + MutableSpan offset_data = curves.offsets_for_write(); + offset_indices::gather_selected_offsets( + OffsetIndices(offset_data.take_front(orig_curves_num + 1)), + mask, + orig_points_num, + offset_data.drop_front(orig_curves_num)); + const OffsetIndices points_by_curve = curves.points_by_curve(); + + /* Resize the points array to match the new total point count. */ + curves.resize(points_by_curve.total_size(), curves.curves_num()); + + attributes.for_all([&](const bke::AttributeIDRef &id, const bke::AttributeMetaData meta_data) { + bke::GSpanAttributeWriter attribute = attributes.lookup_for_write_span(id); + switch (meta_data.domain) { + case ATTR_DOMAIN_POINT: + bke::attribute_math::gather_group_to_group(points_by_curve.slice(orig_curves_range), + points_by_curve.slice(new_curves_range), + mask, + attribute.span, + attribute.span); + break; + case ATTR_DOMAIN_CURVE: + array_utils::gather(attribute.span, mask, attribute.span.take_back(mask.size())); + break; + default: + BLI_assert_unreachable(); + return true; + } + attribute.finish(); + return true; + }); + + curves.update_curve_types(); + curves.tag_topology_changed(); + + bke::SpanAttributeWriter selection = attributes.lookup_or_add_for_write_span( + ".selection", ATTR_DOMAIN_CURVE); + selection.span.take_back(mask.size()).fill(true); + selection.finish(); +} + } // namespace blender::ed::curves diff --git a/source/blender/editors/curves/intern/curves_ops.cc b/source/blender/editors/curves/intern/curves_ops.cc index 7eab0c12348..2ab9f5a97e7 100644 --- a/source/blender/editors/curves/intern/curves_ops.cc +++ b/source/blender/editors/curves/intern/curves_ops.cc @@ -269,7 +269,7 @@ static void try_convert_single_object(Object &curves_ob, Mesh &surface_me = *static_cast(surface_ob.data); BVHTreeFromMesh surface_bvh; - BKE_bvhtree_from_mesh_get(&surface_bvh, &surface_me, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&surface_bvh, &surface_me, BVHTREE_FROM_LOOPTRIS, 2); BLI_SCOPED_DEFER([&]() { free_bvhtree_from_mesh(&surface_bvh); }); const Span positions_cu = curves.positions(); @@ -605,7 +605,7 @@ static void snap_curves_to_surface_exec_object(Object &curves_ob, switch (attach_mode) { case AttachMode::Nearest: { BVHTreeFromMesh surface_bvh; - BKE_bvhtree_from_mesh_get(&surface_bvh, &surface_mesh, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&surface_bvh, &surface_mesh, BVHTREE_FROM_LOOPTRIS, 2); BLI_SCOPED_DEFER([&]() { free_bvhtree_from_mesh(&surface_bvh); }); threading::parallel_for(curves.curves_range(), 256, [&](const IndexRange curves_range) { @@ -639,11 +639,11 @@ static void snap_curves_to_surface_exec_object(Object &curves_ob, } if (!surface_uv_map.is_empty()) { - const MLoopTri &tri = surface_looptris[looptri_index]; + const MLoopTri < = surface_looptris[looptri_index]; const float3 bary_coords = bke::mesh_surface_sample::compute_bary_coord_in_triangle( - surface_positions, corner_verts, tri, new_first_point_pos_su); + surface_positions, corner_verts, lt, new_first_point_pos_su); const float2 uv = bke::mesh_surface_sample::sample_corner_attribute_with_bary_coords( - bary_coords, tri, surface_uv_map); + bary_coords, lt, surface_uv_map); surface_uv_coords[curve_i] = uv; } } @@ -671,12 +671,12 @@ static void snap_curves_to_surface_exec_object(Object &curves_ob, continue; } - const MLoopTri &looptri = surface_looptris[lookup_result.looptri_index]; + const MLoopTri < = surface_looptris[lookup_result.looptri_index]; const float3 &bary_coords = lookup_result.bary_weights; - const float3 &p0_su = surface_positions[corner_verts[looptri.tri[0]]]; - const float3 &p1_su = surface_positions[corner_verts[looptri.tri[1]]]; - const float3 &p2_su = surface_positions[corner_verts[looptri.tri[2]]]; + const float3 &p0_su = surface_positions[corner_verts[lt.tri[0]]]; + const float3 &p1_su = surface_positions[corner_verts[lt.tri[1]]]; + const float3 &p2_su = surface_positions[corner_verts[lt.tri[2]]]; float3 new_first_point_pos_su; interp_v3_v3v3v3(new_first_point_pos_su, p0_su, p1_su, p2_su, bary_coords); @@ -1244,6 +1244,44 @@ static void CURVES_OT_delete(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } +namespace curves_duplicate { + +static int delete_exec(bContext *C, wmOperator * /*op*/) +{ + for (Curves *curves_id : get_unique_editable_curves(*C)) { + bke::CurvesGeometry &curves = curves_id->geometry.wrap(); + IndexMaskMemory memory; + switch (eAttrDomain(curves_id->selection_domain)) { + case ATTR_DOMAIN_POINT: + duplicate_points(curves, retrieve_selected_points(*curves_id, memory)); + break; + case ATTR_DOMAIN_CURVE: + duplicate_curves(curves, retrieve_selected_curves(*curves_id, memory)); + break; + default: + BLI_assert_unreachable(); + break; + } + DEG_id_tag_update(&curves_id->id, ID_RECALC_GEOMETRY); + WM_event_add_notifier(C, NC_GEOM | ND_DATA, curves_id); + } + return OPERATOR_FINISHED; +} + +} // namespace curves_duplicate + +static void CURVES_OT_duplicate(wmOperatorType *ot) +{ + ot->name = "Duplicate"; + ot->idname = __func__; + ot->description = "Copy selected points or curves"; + + ot->exec = curves_duplicate::delete_exec; + ot->poll = editable_curves_in_edit_mode_poll; + + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; +} + } // namespace blender::ed::curves void ED_operatortypes_curves() @@ -1252,6 +1290,7 @@ void ED_operatortypes_curves() WM_operatortype_append(CURVES_OT_attribute_set); WM_operatortype_append(CURVES_OT_convert_to_particle_system); WM_operatortype_append(CURVES_OT_convert_from_particle_system); + WM_operatortype_append(CURVES_OT_draw); WM_operatortype_append(CURVES_OT_snap_curves_to_surface); WM_operatortype_append(CURVES_OT_set_selection_domain); WM_operatortype_append(CURVES_OT_select_all); @@ -1262,6 +1301,23 @@ void ED_operatortypes_curves() WM_operatortype_append(CURVES_OT_select_less); WM_operatortype_append(CURVES_OT_surface_set); WM_operatortype_append(CURVES_OT_delete); + WM_operatortype_append(CURVES_OT_duplicate); +} + +void ED_operatormacros_curves() +{ + wmOperatorType *ot; + wmOperatorTypeMacro *otmacro; + + /* Duplicate + Move = Interactively place newly duplicated strokes */ + ot = WM_operatortype_append_macro("CURVES_OT_duplicate_move", + "Duplicate", + "Make copies of selected elements and move them", + OPTYPE_UNDO | OPTYPE_REGISTER); + WM_operatortype_macro_define(ot, "CURVES_OT_duplicate"); + otmacro = WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); + RNA_boolean_set(otmacro->ptr, "use_proportional_edit", false); + RNA_boolean_set(otmacro->ptr, "mirror", false); } void ED_keymap_curves(wmKeyConfig *keyconf) diff --git a/source/blender/editors/datafiles/CMakeLists.txt b/source/blender/editors/datafiles/CMakeLists.txt index dbb05dab14f..e7865403ec0 100644 --- a/source/blender/editors/datafiles/CMakeLists.txt +++ b/source/blender/editors/datafiles/CMakeLists.txt @@ -906,6 +906,7 @@ if(WITH_BLENDER) # Blend files. data_to_c_simple(../../../../release/datafiles/preview.blend SRC) data_to_c_simple(../../../../release/datafiles/preview_grease_pencil.blend SRC) + data_to_c_simple(../../../../release/datafiles/preview_grease_pencil_legacy.blend SRC) # Images. data_to_c_simple(../../../../release/datafiles/splash.png SRC) diff --git a/source/blender/editors/geometry/node_group_operator.cc b/source/blender/editors/geometry/node_group_operator.cc index a252af96593..b262f8a17f8 100644 --- a/source/blender/editors/geometry/node_group_operator.cc +++ b/source/blender/editors/geometry/node_group_operator.cc @@ -225,7 +225,7 @@ static void store_result_geometry( if (object.mode == OB_MODE_EDIT) { EDBM_mesh_make(&object, scene.toolsettings->selectmode, true); - BKE_editmesh_looptri_and_normals_calc(mesh.edit_mesh); + BKE_editmesh_looptris_and_normals_calc(mesh.edit_mesh); } else if (object.mode == OB_MODE_SCULPT) { sculpt_paint::undo::geometry_end(&object); @@ -249,8 +249,11 @@ static Depsgraph *build_depsgraph_from_indirect_ids(Main &bmain, { Set ids_for_relations; bool needs_own_transform_relation = false; - nodes::find_node_tree_dependencies( - node_tree_orig, ids_for_relations, needs_own_transform_relation); + bool needs_scene_camera_relation = false; + nodes::find_node_tree_dependencies(node_tree_orig, + ids_for_relations, + needs_own_transform_relation, + needs_scene_camera_relation); IDP_foreach_property( &const_cast(properties), IDP_TYPE_FILTER_ID, diff --git a/source/blender/editors/gpencil_legacy/gpencil_convert.cc b/source/blender/editors/gpencil_legacy/gpencil_convert.cc index 0ab37ed1f95..9bd48342df4 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_convert.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_convert.cc @@ -67,6 +67,7 @@ #include "UI_view2d.hh" #include "ANIM_action.hh" +#include "ANIM_animdata.hh" #include "ANIM_keyframing.hh" #include "ED_clip.hh" @@ -524,7 +525,7 @@ static void gpencil_stroke_path_animation(bContext *C, prop = RNA_struct_find_property(&ptr, "eval_time"); /* Ensure we have an F-Curve to add keyframes to */ - act = ED_id_action_ensure(bmain, (ID *)cu); + act = blender::animrig::id_action_ensure(bmain, (ID *)cu); fcu = blender::animrig::action_fcurve_ensure(bmain, act, nullptr, &ptr, "eval_time", 0); if (gtd->mode == GP_STROKECONVERT_TIMING_LINEAR) { diff --git a/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc b/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc index 7664719fdf3..0df31cb152f 100644 --- a/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc +++ b/source/blender/editors/grease_pencil/intern/grease_pencil_edit.cc @@ -616,7 +616,7 @@ static bke::CurvesGeometry remove_points_and_split(const bke::CurvesGeometry &cu const Vector ranges_to_keep = array_utils::find_all_ranges(curve_points_to_delete, false); - if (ranges_to_keep.size() == 0) { + if (ranges_to_keep.is_empty()) { continue; } @@ -676,7 +676,6 @@ static bke::CurvesGeometry remove_points_and_split(const bke::CurvesGeometry &cu static int grease_pencil_delete_exec(bContext *C, wmOperator * /*op*/) { - using namespace blender; const Scene *scene = CTX_data_scene(C); Object *object = CTX_data_active_object(C); GreasePencil &grease_pencil = *static_cast(object->data); @@ -1010,7 +1009,7 @@ static void GREASE_PENCIL_OT_stroke_material_set(wmOperatorType *ot) { ot->name = "Assign Material"; ot->idname = "GREASE_PENCIL_OT_stroke_material_set"; - ot->description = "Change Stroke material with selected material"; + ot->description = "Assign the active material slot to the selected strokes"; ot->exec = grease_pencil_stroke_material_set_exec; ot->poll = editable_grease_pencil_poll; @@ -1116,11 +1115,11 @@ static void GREASE_PENCIL_OT_cyclical_set(wmOperatorType *ot) /** \} */ /* -------------------------------------------------------------------- */ -/** \name Set selected material as active material +/** \name Set Active Material Operator * \{ */ + static int grease_pencil_set_active_material_exec(bContext *C, wmOperator * /*op*/) { - using namespace blender; const Scene *scene = CTX_data_scene(C); Object *object = CTX_data_active_object(C); GreasePencil &grease_pencil = *static_cast(object->data); @@ -1164,7 +1163,7 @@ static void GREASE_PENCIL_OT_set_active_material(wmOperatorType *ot) /** \} */ /* -------------------------------------------------------------------- */ -/** \name Set stroke uniform Thickness +/** \name Set Uniform Thickness Operator * \{ */ static int grease_pencil_set_uniform_thickness_exec(bContext *C, wmOperator *op) @@ -1222,7 +1221,7 @@ static void GREASE_PENCIL_OT_set_uniform_thickness(wmOperatorType *ot) /** \} */ /* -------------------------------------------------------------------- */ -/** \name Set stroke uniform Opacity +/** \name Set Uniform Opacity Operator * \{ */ static int grease_pencil_set_uniform_opacity_exec(bContext *C, wmOperator *op) @@ -1330,7 +1329,7 @@ static void GREASE_PENCIL_OT_stroke_switch_direction(wmOperatorType *ot) /** \} */ /* -------------------------------------------------------------------- */ -/** \name Caps mode Set Operator +/** \name Set Curve Caps Operator * \{ */ enum class CapsMode : int8_t { @@ -1456,6 +1455,7 @@ static void GREASE_PENCIL_OT_caps_set(wmOperatorType *ot) /* -------------------------------------------------------------------- */ /** \name Set Active Material Operator * \{ */ + /* Retry enum items with object materials. */ static const EnumPropertyItem *material_enum_itemf(bContext *C, PointerRNA * /*ptr*/, @@ -1530,153 +1530,31 @@ static void GREASE_PENCIL_OT_set_material(wmOperatorType *ot) /** \name Duplicate Operator * \{ */ -static void duplicate_points(bke::CurvesGeometry &curves, const IndexMask &mask) -{ - const OffsetIndices points_by_curve = curves.points_by_curve(); - const VArray src_cyclic = curves.cyclic(); - - Array points_to_duplicate(curves.points_num()); - mask.to_bools(points_to_duplicate.as_mutable_span()); - const int num_points_to_add = mask.size(); - - int curr_dst_point_start = 0; - Array dst_to_src_point(num_points_to_add); - Vector dst_curve_counts; - Vector dst_to_src_curve; - Vector dst_cyclic; - - /* Add the duplicated curves and points. */ - for (const int curve_i : curves.curves_range()) { - const IndexRange points = points_by_curve[curve_i]; - const Span curve_points_to_duplicate = points_to_duplicate.as_span().slice(points); - const bool curve_cyclic = src_cyclic[curve_i]; - - /* Note, these ranges start at zero and needed to be shifted by `points.first()` */ - const Vector ranges_to_duplicate = array_utils::find_all_ranges( - curve_points_to_duplicate, true); - - if (ranges_to_duplicate.size() == 0) { - continue; - } - - const bool is_last_segment_selected = curve_cyclic && - ranges_to_duplicate.first().first() == 0 && - ranges_to_duplicate.last().last() == points.size() - 1; - const bool is_curve_self_joined = is_last_segment_selected && ranges_to_duplicate.size() != 1; - const bool is_cyclic = ranges_to_duplicate.size() == 1 && is_last_segment_selected; - - const IndexRange range_ids = ranges_to_duplicate.index_range(); - /* Skip the first range because it is joined to the end of the last range. */ - for (const int range_i : ranges_to_duplicate.index_range().drop_front(is_curve_self_joined)) { - const IndexRange range = ranges_to_duplicate[range_i]; - - array_utils::fill_index_range( - dst_to_src_point.as_mutable_span().slice(curr_dst_point_start, range.size()), - range.start() + points.first()); - curr_dst_point_start += range.size(); - - dst_curve_counts.append(range.size()); - dst_to_src_curve.append(curve_i); - dst_cyclic.append(is_cyclic); - } - - /* Join the first range to the end of the last range. */ - if (is_curve_self_joined) { - const IndexRange first_range = ranges_to_duplicate[range_ids.first()]; - array_utils::fill_index_range( - dst_to_src_point.as_mutable_span().slice(curr_dst_point_start, first_range.size()), - first_range.start() + points.first()); - curr_dst_point_start += first_range.size(); - dst_curve_counts[dst_curve_counts.size() - 1] += first_range.size(); - } - } - - const int old_curves_num = curves.curves_num(); - const int old_points_num = curves.points_num(); - const int num_curves_to_add = dst_to_src_curve.size(); - - bke::MutableAttributeAccessor attributes = curves.attributes_for_write(); - - /* Delete selection attribute so that it will not have to be resized. */ - attributes.remove(".selection"); - - curves.resize(old_points_num + num_points_to_add, old_curves_num + num_curves_to_add); - - MutableSpan new_curve_offsets = curves.offsets_for_write(); - array_utils::copy(dst_curve_counts.as_span(), - new_curve_offsets.drop_front(old_curves_num).drop_back(1)); - offset_indices::accumulate_counts_to_offsets(new_curve_offsets.drop_front(old_curves_num), - old_points_num); - - /* Transfer curve and point attributes. */ - attributes.for_all([&](const bke::AttributeIDRef &id, const bke::AttributeMetaData meta_data) { - bke::GSpanAttributeWriter attribute = attributes.lookup_for_write_span(id); - if (!attribute) { - return true; - } - - switch (meta_data.domain) { - case ATTR_DOMAIN_CURVE: { - if (id.name() == "cyclic") { - return true; - } - bke::attribute_math::gather( - attribute.span, - dst_to_src_curve, - attribute.span.slice(IndexRange(old_curves_num, num_curves_to_add))); - break; - } - case ATTR_DOMAIN_POINT: { - bke::attribute_math::gather( - attribute.span, - dst_to_src_point, - attribute.span.slice(IndexRange(old_points_num, num_points_to_add))); - break; - } - default: { - attribute.finish(); - BLI_assert_unreachable(); - return true; - } - } - - attribute.finish(); - - return true; - }); - array_utils::copy(dst_cyclic.as_span(), curves.cyclic_for_write().drop_front(old_curves_num)); - - curves.update_curve_types(); - curves.tag_topology_changed(); - - /* Deselect the original and select the new curves. */ - bke::GSpanAttributeWriter selection = ed::curves::ensure_selection_attribute( - curves, ATTR_DOMAIN_CURVE, CD_PROP_BOOL); - curves::fill_selection_true(selection.span, - IndexMask(IndexRange(old_curves_num, num_curves_to_add))); - curves::fill_selection_false(selection.span, IndexMask(old_curves_num)); - selection.finish(); -} - static int grease_pencil_duplicate_exec(bContext *C, wmOperator * /*op*/) { - using namespace blender; const Scene *scene = CTX_data_scene(C); Object *object = CTX_data_active_object(C); GreasePencil &grease_pencil = *static_cast(object->data); + const eAttrDomain selection_domain = ED_grease_pencil_selection_domain_get(scene->toolsettings); + std::atomic changed = false; const Array drawings = retrieve_editable_drawings(*scene, grease_pencil); threading::parallel_for_each(drawings, [&](const MutableDrawingInfo &info) { IndexMaskMemory memory; - const IndexMask points = ed::greasepencil::retrieve_editable_and_selected_points( - *object, info.drawing, memory); - if (points.is_empty()) { + const IndexMask elements = retrieve_editable_and_selected_elements( + *object, info.drawing, selection_domain, memory); + if (elements.is_empty()) { return; } bke::CurvesGeometry &curves = info.drawing.strokes_for_write(); - duplicate_points(curves, points); + if (selection_domain == ATTR_DOMAIN_CURVE) { + curves::duplicate_curves(curves, elements); + } + else if (selection_domain == ATTR_DOMAIN_POINT) { + curves::duplicate_points(curves, elements); + } info.drawing.tag_topology_changed(); changed.store(true, std::memory_order_relaxed); }); diff --git a/source/blender/editors/include/ED_anim_api.hh b/source/blender/editors/include/ED_anim_api.hh index ac15b4680d0..6eb7f46f705 100644 --- a/source/blender/editors/include/ED_anim_api.hh +++ b/source/blender/editors/include/ED_anim_api.hh @@ -957,12 +957,6 @@ float ANIM_unit_mapping_get_factor(Scene *scene, ID *id, FCurve *fcu, short flag /** \name Utility macros * \{ */ -/** - * Provide access to Keyframe Type info in #BezTriple. - * NOTE: this is so that we can change it from being stored in 'hide' - */ -#define BEZKEYTYPE(bezt) ((bezt)->hide) - /** * Set/Clear/Toggle macro. * \param channel: Channel with a 'flag' member that we're setting. diff --git a/source/blender/editors/include/ED_curves.hh b/source/blender/editors/include/ED_curves.hh index 9c854b1c0cb..ccf4630d39f 100644 --- a/source/blender/editors/include/ED_curves.hh +++ b/source/blender/editors/include/ED_curves.hh @@ -32,6 +32,7 @@ struct wmKeyConfig; * \{ */ void ED_operatortypes_curves(); +void ED_operatormacros_curves(); void ED_curves_undosys_type(UndoType *ut); void ED_keymap_curves(wmKeyConfig *keyconf); @@ -75,6 +76,7 @@ bool curves_poll(bContext *C); * \{ */ void CURVES_OT_attribute_set(wmOperatorType *ot); +void CURVES_OT_draw(wmOperatorType *ot); /** \} */ @@ -285,6 +287,9 @@ bool select_circle(const ViewContext &vc, */ bool remove_selection(bke::CurvesGeometry &curves, eAttrDomain selection_domain); +void duplicate_points(bke::CurvesGeometry &curves, const IndexMask &mask); +void duplicate_curves(bke::CurvesGeometry &curves, const IndexMask &mask); + /** \} */ } // namespace blender::ed::curves diff --git a/source/blender/editors/include/ED_datafiles.h b/source/blender/editors/include/ED_datafiles.h index fe52bacb81c..efa90f1e0bb 100644 --- a/source/blender/editors/include/ED_datafiles.h +++ b/source/blender/editors/include/ED_datafiles.h @@ -23,6 +23,9 @@ extern const char datatoc_preview_blend[]; extern int datatoc_preview_grease_pencil_blend_size; extern const char datatoc_preview_grease_pencil_blend[]; +extern int datatoc_preview_grease_pencil_legacy_blend_size; +extern const char datatoc_preview_grease_pencil_legacy_blend[]; + extern int datatoc_blender_icons16_png_size; extern const char datatoc_blender_icons16_png[]; diff --git a/source/blender/editors/include/ED_keyframes_edit.hh b/source/blender/editors/include/ED_keyframes_edit.hh index e8c7289acb7..c623ae31cbf 100644 --- a/source/blender/editors/include/ED_keyframes_edit.hh +++ b/source/blender/editors/include/ED_keyframes_edit.hh @@ -8,6 +8,7 @@ #pragma once +#include "BLI_math_vector_types.hh" #include "ED_anim_api.hh" /* for enum eAnimFilter_Flags */ struct BezTriple; @@ -497,7 +498,14 @@ void bake_fcurve_segments(FCurve *fcu); * \param sample_rate: indicates how many samples per frame should be generated. */ void sample_fcurve_segment( - FCurve *fcu, float start_frame, int sample_rate, float *r_samples, int sample_count); + FCurve *fcu, float start_frame, float sample_rate, float *r_samples, int sample_count); + +enum class BakeCurveRemove { REMOVE_NONE, REMOVE_IN_RANGE, REMOVE_OUT_RANGE, REMOVE_ALL }; +/** Creates keyframes in the given range at the given step interval. + * \param range: start and end frame to bake. Is inclusive on both ends. + * \param remove_existing: choice which keys to remove in relation to the given range. + */ +void bake_fcurve(FCurve *fcu, blender::int2 range, float step, BakeCurveRemove remove_existing); /* ----------- */ diff --git a/source/blender/editors/include/ED_keyframing.hh b/source/blender/editors/include/ED_keyframing.hh index 4c3d9b365b9..53173aed5e9 100644 --- a/source/blender/editors/include/ED_keyframing.hh +++ b/source/blender/editors/include/ED_keyframing.hh @@ -48,14 +48,6 @@ eInsertKeyFlags ANIM_get_keyframing_flags(Scene *scene, bool use_autokey_mode); /* -------- */ -/** - * Get (or add relevant data to be able to do so) the Active Action for the given - * Animation Data block, given an ID block where the Animation Data should reside. - */ -bAction *ED_id_action_ensure(Main *bmain, ID *id); - -/* -------- */ - /** * \brief Lesser Key-framing API call. * @@ -63,7 +55,6 @@ bAction *ED_id_action_ensure(Main *bmain, ID *id); * but also through RNA when editing an ID prop, see #37103). */ void update_autoflags_fcurve(FCurve *fcu, bContext *C, ReportList *reports, PointerRNA *ptr); -void update_autoflags_fcurve_direct(FCurve *fcu, PropertyRNA *prop); /* -------- */ diff --git a/source/blender/editors/include/ED_mesh.hh b/source/blender/editors/include/ED_mesh.hh index 3832da5d473..77ed9671c81 100644 --- a/source/blender/editors/include/ED_mesh.hh +++ b/source/blender/editors/include/ED_mesh.hh @@ -112,7 +112,7 @@ bool EDBM_mesh_hide(BMEditMesh *em, bool swap); bool EDBM_mesh_reveal(BMEditMesh *em, bool select); struct EDBMUpdate_Params { - uint calc_looptri : 1; + uint calc_looptris : 1; uint calc_normals : 1; uint is_destructive : 1; }; @@ -577,12 +577,12 @@ BMBackup EDBM_redo_state_store(BMEditMesh *em); /** * Restore a BMesh from backup. */ -void EDBM_redo_state_restore(BMBackup *backup, BMEditMesh *em, bool recalc_looptri) +void EDBM_redo_state_restore(BMBackup *backup, BMEditMesh *em, bool recalc_looptris) ATTR_NONNULL(1, 2); /** * Delete the backup, flushing it to an edit-mesh. */ -void EDBM_redo_state_restore_and_free(BMBackup *backup, BMEditMesh *em, bool recalc_looptri) +void EDBM_redo_state_restore_and_free(BMBackup *backup, BMEditMesh *em, bool recalc_looptris) ATTR_NONNULL(1, 2); void EDBM_redo_state_free(BMBackup *backup) ATTR_NONNULL(1); diff --git a/source/blender/editors/interface/eyedroppers/eyedropper_color.cc b/source/blender/editors/interface/eyedroppers/eyedropper_color.cc index ab671336ee8..e1171f5bf28 100644 --- a/source/blender/editors/interface/eyedroppers/eyedropper_color.cc +++ b/source/blender/editors/interface/eyedroppers/eyedropper_color.cc @@ -316,8 +316,8 @@ static bool eyedropper_cryptomatte_sample_fl(bContext *C, return false; } - /* CMP_CRYPTOMATTE_SRC_RENDER and CMP_CRYPTOMATTE_SRC_IMAGE require a referenced image/scene to - * work properly. */ + /* CMP_NODE_CRYPTOMATTE_SOURCE_RENDER and CMP_NODE_CRYPTOMATTE_SOURCE_IMAGE require a referenced + * image/scene to work properly. */ if (!node->id) { return false; } @@ -330,10 +330,10 @@ static bool eyedropper_cryptomatte_sample_fl(bContext *C, ntreeCompositCryptomatteLayerPrefix(scene, node, prefix, sizeof(prefix) - 1); prefix[MAX_NAME] = '\0'; - if (node->custom1 == CMP_CRYPTOMATTE_SRC_RENDER) { + if (node->custom1 == CMP_NODE_CRYPTOMATTE_SOURCE_RENDER) { return eyedropper_cryptomatte_sample_render_fl(node, prefix, fpos, r_col); } - if (node->custom1 == CMP_CRYPTOMATTE_SRC_IMAGE) { + if (node->custom1 == CMP_NODE_CRYPTOMATTE_SOURCE_IMAGE) { return eyedropper_cryptomatte_sample_image_fl(node, crypto, prefix, fpos, r_col); } return false; diff --git a/source/blender/editors/interface/interface_context_menu.cc b/source/blender/editors/interface/interface_context_menu.cc index ef2efbfd891..3aa8185a636 100644 --- a/source/blender/editors/interface/interface_context_menu.cc +++ b/source/blender/editors/interface/interface_context_menu.cc @@ -661,6 +661,16 @@ bool ui_popup_context_menu_for_button(bContext *C, uiBut *but, const wmEvent *ev PointerRNA op_ptr; wmOperatorType *ot; ot = WM_operatortype_find("ANIM_OT_view_curve_in_graph_editor", false); + uiItemFullO_ptr(layout, + ot, + CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "View All in Graph Editor"), + ICON_NONE, + nullptr, + WM_OP_INVOKE_DEFAULT, + UI_ITEM_NONE, + &op_ptr); + RNA_boolean_set(&op_ptr, "all", true); + uiItemFullO_ptr( layout, ot, @@ -671,16 +681,6 @@ bool ui_popup_context_menu_for_button(bContext *C, uiBut *but, const wmEvent *ev UI_ITEM_NONE, &op_ptr); RNA_boolean_set(&op_ptr, "all", false); - - uiItemFullO_ptr(layout, - ot, - CTX_IFACE_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "View All in Graph Editor"), - ICON_NONE, - nullptr, - WM_OP_INVOKE_DEFAULT, - UI_ITEM_NONE, - &op_ptr); - RNA_boolean_set(&op_ptr, "all", true); } else { PointerRNA op_ptr; diff --git a/source/blender/editors/interface/interface_drag.cc b/source/blender/editors/interface/interface_drag.cc index 9a9516ef5b2..10800a2b34d 100644 --- a/source/blender/editors/interface/interface_drag.cc +++ b/source/blender/editors/interface/interface_drag.cc @@ -64,7 +64,7 @@ void UI_but_drag_set_path(uiBut *but, const char *path) if (but->dragflag & UI_BUT_DRAGPOIN_FREE) { WM_drag_data_free(but->dragtype, but->dragpoin); } - but->dragpoin = WM_drag_create_path_data(path); + but->dragpoin = WM_drag_create_path_data(blender::Span(&path, 1)); but->dragflag |= UI_BUT_DRAGPOIN_FREE; } diff --git a/source/blender/editors/interface/interface_templates.cc b/source/blender/editors/interface/interface_templates.cc index 1dd883f1fcf..019393b0e87 100644 --- a/source/blender/editors/interface/interface_templates.cc +++ b/source/blender/editors/interface/interface_templates.cc @@ -43,7 +43,7 @@ #include "BKE_action.h" #include "BKE_blender_version.h" -#include "BKE_blendfile.h" +#include "BKE_blendfile.hh" #include "BKE_cachefile.h" #include "BKE_colorband.h" #include "BKE_colortools.h" diff --git a/source/blender/editors/io/io_usd.cc b/source/blender/editors/io/io_usd.cc index a7a2f58a1b4..221dc3b3185 100644 --- a/source/blender/editors/io/io_usd.cc +++ b/source/blender/editors/io/io_usd.cc @@ -91,6 +91,26 @@ const EnumPropertyItem rna_enum_usd_tex_name_collision_mode_items[] = { {0, nullptr, 0, nullptr, nullptr}, }; +const EnumPropertyItem rna_enum_usd_export_subdiv_mode_items[] = { + {USD_SUBDIV_IGNORE, + "IGNORE", + 0, + "Ignore", + "Subdivision scheme = None, export base mesh without subdivision"}, + {USD_SUBDIV_TESSELLATE, + "TESSELLATE", + 0, + "Tessellate", + "Subdivision scheme = None, export subdivided mesh"}, + {USD_SUBDIV_BEST_MATCH, + "BEST_MATCH", + 0, + "Best Match", + "Subdivision scheme = Catmull-Clark, when possible. " + "Reverts to exporting the subdivided mesh for the Simple subdivision type"}, + {0, nullptr, 0, nullptr, nullptr}, +}; + /* Stored in the wmOperator's customdata field to indicate it should run as a background job. * This is set when the operator is invoked, and not set when it is only executed. */ enum { AS_BACKGROUND_JOB = 1 }; @@ -155,6 +175,8 @@ static int wm_usd_export_exec(bContext *C, wmOperator *op) const bool export_mesh_colors = RNA_boolean_get(op->ptr, "export_mesh_colors"); const bool export_normals = RNA_boolean_get(op->ptr, "export_normals"); const bool export_materials = RNA_boolean_get(op->ptr, "export_materials"); + const eSubdivExportMode export_subdiv = eSubdivExportMode( + RNA_enum_get(op->ptr, "export_subdivision")); const bool use_instancing = RNA_boolean_get(op->ptr, "use_instancing"); const bool evaluation_mode = RNA_enum_get(op->ptr, "evaluation_mode"); @@ -174,6 +196,7 @@ static int wm_usd_export_exec(bContext *C, wmOperator *op) export_normals, export_mesh_colors, export_materials, + export_subdiv, selected_objects_only, visible_objects_only, use_instancing, @@ -211,6 +234,7 @@ static void wm_usd_export_draw(bContext * /*C*/, wmOperator *op) uiItemR(col, ptr, "export_uvmaps", UI_ITEM_NONE, nullptr, ICON_NONE); uiItemR(col, ptr, "export_normals", UI_ITEM_NONE, nullptr, ICON_NONE); uiItemR(col, ptr, "export_materials", UI_ITEM_NONE, nullptr, ICON_NONE); + uiItemR(col, ptr, "export_subdivision", UI_ITEM_NONE, nullptr, ICON_NONE); uiItemR(col, ptr, "root_prim_path", UI_ITEM_NONE, nullptr, ICON_NONE); col = uiLayoutColumn(box, true); @@ -335,6 +359,14 @@ void WM_OT_usd_export(wmOperatorType *ot) "Export viewport settings of materials as USD preview materials, and export " "material assignments as geometry subsets"); + RNA_def_enum(ot->srna, + "export_subdivision", + rna_enum_usd_export_subdiv_mode_items, + USD_SUBDIV_BEST_MATCH, + "Subdivision Scheme", + "Choose how subdivision modifiers will be mapped to the USD subdivision scheme " + "during export"); + RNA_def_boolean(ot->srna, "use_instancing", false, diff --git a/source/blender/editors/mesh/editmesh_add.cc b/source/blender/editors/mesh/editmesh_add.cc index ac4cf4b8887..87d13f57d13 100644 --- a/source/blender/editors/mesh/editmesh_add.cc +++ b/source/blender/editors/mesh/editmesh_add.cc @@ -78,7 +78,7 @@ static void make_prim_finish(bContext *C, /* Only recalculate edit-mode tessellation if we are staying in edit-mode. */ EDBMUpdate_Params params{}; - params.calc_looptri = !exit_editmode; + params.calc_looptris = !exit_editmode; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); diff --git a/source/blender/editors/mesh/editmesh_add_gizmo.cc b/source/blender/editors/mesh/editmesh_add_gizmo.cc index 43b4811e492..840875c5085 100644 --- a/source/blender/editors/mesh/editmesh_add_gizmo.cc +++ b/source/blender/editors/mesh/editmesh_add_gizmo.cc @@ -347,7 +347,7 @@ static int add_primitive_cube_gizmo_exec(bContext *C, wmOperator *op) EDBM_selectmode_flush_ex(em, SCE_SELECT_VERTEX); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); diff --git a/source/blender/editors/mesh/editmesh_attribute.cc b/source/blender/editors/mesh/editmesh_attribute.cc index 69fdc495f4d..66fa655753b 100644 --- a/source/blender/editors/mesh/editmesh_attribute.cc +++ b/source/blender/editors/mesh/editmesh_attribute.cc @@ -210,7 +210,7 @@ static int mesh_set_attribute_exec(bContext *C, wmOperator *op) changed = true; EDBMUpdate_Params update{}; - update.calc_looptri = false; + update.calc_looptris = false; update.calc_normals = false; update.is_destructive = false; EDBM_update(mesh, &update); diff --git a/source/blender/editors/mesh/editmesh_automerge.cc b/source/blender/editors/mesh/editmesh_automerge.cc index 630634d8f2d..b1660b531aa 100644 --- a/source/blender/editors/mesh/editmesh_automerge.cc +++ b/source/blender/editors/mesh/editmesh_automerge.cc @@ -61,7 +61,7 @@ void EDBM_automerge(Object *obedit, bool update, const char hflag, const float d BMO_op_finish(bm, &weldop); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; if ((totvert_prev != bm->totvert) && update) { @@ -124,7 +124,7 @@ void EDBM_automerge_and_split(Object *obedit, if (LIKELY(ok) && update) { EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); diff --git a/source/blender/editors/mesh/editmesh_bevel.cc b/source/blender/editors/mesh/editmesh_bevel.cc index ca363f330e6..93eb9f5843d 100644 --- a/source/blender/editors/mesh/editmesh_bevel.cc +++ b/source/blender/editors/mesh/editmesh_bevel.cc @@ -380,7 +380,7 @@ static bool edbm_bevel_calc(wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = true; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -430,7 +430,7 @@ static void edbm_bevel_cancel(bContext *C, wmOperator *op) EDBM_redo_state_restore_and_free(&opdata->ob_store[ob_index].mesh_backup, em, true); EDBMUpdate_Params params{}; - params.calc_looptri = false; + params.calc_looptris = false; params.calc_normals = true; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); diff --git a/source/blender/editors/mesh/editmesh_bisect.cc b/source/blender/editors/mesh/editmesh_bisect.cc index 310448c34d7..d03ac2d195d 100644 --- a/source/blender/editors/mesh/editmesh_bisect.cc +++ b/source/blender/editors/mesh/editmesh_bisect.cc @@ -386,7 +386,7 @@ static int mesh_bisect_exec(bContext *C, wmOperator *op) if (EDBM_op_finish(em, &bmop, op, true)) { EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); diff --git a/source/blender/editors/mesh/editmesh_extrude.cc b/source/blender/editors/mesh/editmesh_extrude.cc index 8208aa0634d..d52534e9c51 100644 --- a/source/blender/editors/mesh/editmesh_extrude.cc +++ b/source/blender/editors/mesh/editmesh_extrude.cc @@ -308,7 +308,7 @@ static int edbm_extrude_repeat_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = true; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -449,7 +449,7 @@ static int edbm_extrude_region_exec(bContext *C, wmOperator *op) /* This normally happens when pushing undo but modal operators * like this one don't push undo data until after modal mode is done. */ EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = true; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -507,7 +507,7 @@ static int edbm_extrude_context_exec(bContext *C, wmOperator *op) /* This normally happens when pushing undo but modal operators * like this one don't push undo data until after modal mode is done. */ EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = true; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -559,7 +559,7 @@ static int edbm_extrude_verts_exec(bContext *C, wmOperator *op) edbm_extrude_verts_indiv(em, op, BM_ELEM_SELECT); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -612,7 +612,7 @@ static int edbm_extrude_edges_exec(bContext *C, wmOperator *op) edbm_extrude_edges_indiv(em, op, BM_ELEM_SELECT, use_normal_flip); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -665,7 +665,7 @@ static int edbm_extrude_faces_exec(bContext *C, wmOperator *op) edbm_extrude_discrete_faces(em, op, BM_ELEM_SELECT); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -904,7 +904,7 @@ static int edbm_dupli_extrude_cursor_invoke(bContext *C, wmOperator *op, const w /* This normally happens when pushing undo but modal operators * like this one don't push undo data until after modal mode is done. */ EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = true; params.is_destructive = true; EDBM_update(static_cast(vc.obedit->data), ¶ms); diff --git a/source/blender/editors/mesh/editmesh_extrude_screw.cc b/source/blender/editors/mesh/editmesh_extrude_screw.cc index fe709d6dbbd..28d1bce0029 100644 --- a/source/blender/editors/mesh/editmesh_extrude_screw.cc +++ b/source/blender/editors/mesh/editmesh_extrude_screw.cc @@ -145,7 +145,7 @@ static int edbm_screw_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); diff --git a/source/blender/editors/mesh/editmesh_extrude_spin.cc b/source/blender/editors/mesh/editmesh_extrude_spin.cc index 26a0c0b505d..6946229f8dc 100644 --- a/source/blender/editors/mesh/editmesh_extrude_spin.cc +++ b/source/blender/editors/mesh/editmesh_extrude_spin.cc @@ -97,7 +97,7 @@ static int edbm_spin_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); diff --git a/source/blender/editors/mesh/editmesh_inset.cc b/source/blender/editors/mesh/editmesh_inset.cc index 5df0c03e0ec..3c452209153 100644 --- a/source/blender/editors/mesh/editmesh_inset.cc +++ b/source/blender/editors/mesh/editmesh_inset.cc @@ -217,7 +217,7 @@ static void edbm_inset_cancel(bContext *C, wmOperator *op) BMEditMesh *em = BKE_editmesh_from_object(obedit); EDBM_redo_state_restore_and_free(&opdata->ob_store[ob_index].mesh_backup, em, true); EDBMUpdate_Params params{}; - params.calc_looptri = false; + params.calc_looptris = false; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -311,7 +311,7 @@ static bool edbm_inset_calc(wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); diff --git a/source/blender/editors/mesh/editmesh_intersect.cc b/source/blender/editors/mesh/editmesh_intersect.cc index 70c7dd1fd25..3b6ea24c778 100644 --- a/source/blender/editors/mesh/editmesh_intersect.cc +++ b/source/blender/editors/mesh/editmesh_intersect.cc @@ -107,7 +107,7 @@ static void edbm_intersect_select(BMEditMesh *em, Mesh *mesh, bool do_select) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = true; params.is_destructive = true; EDBM_update(mesh, ¶ms); @@ -968,7 +968,7 @@ static int edbm_face_split_by_edges_exec(bContext *C, wmOperator * /*op*/) #endif EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = true; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -1076,7 +1076,7 @@ static int edbm_face_split_by_edges_exec(bContext *C, wmOperator * /*op*/) BLI_ghash_free(face_edge_map, nullptr, nullptr); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = true; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); diff --git a/source/blender/editors/mesh/editmesh_knife.cc b/source/blender/editors/mesh/editmesh_knife.cc index 1c63da8edcc..6369f130ace 100644 --- a/source/blender/editors/mesh/editmesh_knife.cc +++ b/source/blender/editors/mesh/editmesh_knife.cc @@ -186,7 +186,7 @@ struct KnifeUndoFrame { struct KnifeBVH { BVHTree *tree; /* Knife Custom BVH Tree. */ - BMLoop *(*looptris)[3]; /* Used by #knife_bvh_raycast_cb to store the intersecting looptri. */ + BMLoop *(*looptris)[3]; /* Used by #knife_bvh_raycast_cb to store the intersecting triangles. */ float uv[2]; /* Used by #knife_bvh_raycast_cb to store the intersecting uv. */ uint ob_index; @@ -4297,7 +4297,7 @@ static void knifetool_finish_single_post(KnifeTool_OpData * /*kcd*/, Object *ob) BMEditMesh *em = BKE_editmesh_from_object(ob); EDBM_selectmode_flush(em); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = true; params.is_destructive = true; EDBM_update(static_cast(ob->data), ¶ms); diff --git a/source/blender/editors/mesh/editmesh_loopcut.cc b/source/blender/editors/mesh/editmesh_loopcut.cc index 3dece332169..8c3fa8940c5 100644 --- a/source/blender/editors/mesh/editmesh_loopcut.cc +++ b/source/blender/editors/mesh/editmesh_loopcut.cc @@ -198,7 +198,7 @@ static void ringsel_finish(bContext *C, wmOperator *op) /* When used in a macro the tessellation will be recalculated anyway, * this is needed here because modifiers depend on updated tessellation, see #45920 */ EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(lcd->ob->data), ¶ms); diff --git a/source/blender/editors/mesh/editmesh_path.cc b/source/blender/editors/mesh/editmesh_path.cc index 46b00bca3cc..455cf531c32 100644 --- a/source/blender/editors/mesh/editmesh_path.cc +++ b/source/blender/editors/mesh/editmesh_path.cc @@ -273,7 +273,7 @@ static void mouse_mesh_shortest_path_vert(Scene * /*scene*/, } EDBMUpdate_Params params{}; - params.calc_looptri = false; + params.calc_looptris = false; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -494,7 +494,7 @@ static void mouse_mesh_shortest_path_edge( } EDBMUpdate_Params params{}; - params.calc_looptri = false; + params.calc_looptris = false; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -628,7 +628,7 @@ static void mouse_mesh_shortest_path_face(Scene * /*scene*/, } EDBMUpdate_Params params{}; - params.calc_looptri = false; + params.calc_looptris = false; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); diff --git a/source/blender/editors/mesh/editmesh_polybuild.cc b/source/blender/editors/mesh/editmesh_polybuild.cc index 88f090a83ca..b75d9e61ac7 100644 --- a/source/blender/editors/mesh/editmesh_polybuild.cc +++ b/source/blender/editors/mesh/editmesh_polybuild.cc @@ -148,7 +148,7 @@ static int edbm_polybuild_transform_at_cursor_invoke(bContext *C, } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = true; params.is_destructive = true; EDBM_update(static_cast(vc.obedit->data), ¶ms); @@ -234,7 +234,7 @@ static int edbm_polybuild_delete_at_cursor_invoke(bContext *C, if (changed) { EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = true; params.is_destructive = true; EDBM_update(static_cast(vc.obedit->data), ¶ms); @@ -401,7 +401,7 @@ static int edbm_polybuild_face_at_cursor_invoke(bContext *C, wmOperator *op, con if (changed) { EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = true; params.is_destructive = true; EDBM_update(static_cast(vc.obedit->data), ¶ms); @@ -492,7 +492,7 @@ static int edbm_polybuild_split_at_cursor_invoke(bContext *C, if (changed) { EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = true; params.is_destructive = true; EDBM_update(static_cast(vc.obedit->data), ¶ms); diff --git a/source/blender/editors/mesh/editmesh_rip.cc b/source/blender/editors/mesh/editmesh_rip.cc index 8f7dbf9fac6..21f894eff67 100644 --- a/source/blender/editors/mesh/editmesh_rip.cc +++ b/source/blender/editors/mesh/editmesh_rip.cc @@ -1103,7 +1103,7 @@ static int edbm_rip_invoke(bContext *C, wmOperator *op, const wmEvent *event) error_rip_failed = false; EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = true; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); diff --git a/source/blender/editors/mesh/editmesh_rip_edge.cc b/source/blender/editors/mesh/editmesh_rip_edge.cc index 48e78ef0f6b..3d2de99185c 100644 --- a/source/blender/editors/mesh/editmesh_rip_edge.cc +++ b/source/blender/editors/mesh/editmesh_rip_edge.cc @@ -211,7 +211,7 @@ static int edbm_rip_edge_invoke(bContext *C, wmOperator * /*op*/, const wmEvent BM_mesh_select_mode_flush(bm); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); diff --git a/source/blender/editors/mesh/editmesh_select.cc b/source/blender/editors/mesh/editmesh_select.cc index 26490bc0410..03ea5a3979e 100644 --- a/source/blender/editors/mesh/editmesh_select.cc +++ b/source/blender/editors/mesh/editmesh_select.cc @@ -4350,7 +4350,7 @@ static int edbm_select_nth_exec(bContext *C, wmOperator *op) if (edbm_deselect_nth(em, &op_params) == true) { found_active_elt = true; EDBMUpdate_Params params{}; - params.calc_looptri = false; + params.calc_looptris = false; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); diff --git a/source/blender/editors/mesh/editmesh_select_similar.cc b/source/blender/editors/mesh/editmesh_select_similar.cc index 3f740687f91..b694ed16336 100644 --- a/source/blender/editors/mesh/editmesh_select_similar.cc +++ b/source/blender/editors/mesh/editmesh_select_similar.cc @@ -458,7 +458,7 @@ static int similar_face_select_exec(bContext *C, wmOperator *op) if (changed) { EDBM_selectmode_flush(em); EDBMUpdate_Params params{}; - params.calc_looptri = false; + params.calc_looptris = false; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(ob->data), ¶ms); @@ -484,7 +484,7 @@ static int similar_face_select_exec(bContext *C, wmOperator *op) } EDBM_selectmode_flush(em); EDBMUpdate_Params params{}; - params.calc_looptri = false; + params.calc_looptris = false; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(ob->data), ¶ms); @@ -508,11 +508,6 @@ static int similar_face_select_exec(bContext *C, wmOperator *op) /** \name Select Similar Edge * \{ */ -/** - * NOTE: This is not normal, but the edge direction itself and always in - * a positive quadrant (tries z, y then x). - * Therefore we need to use the entire object transformation matrix. - */ static void edge_pos_direction_worldspace_get(Object *ob, BMEdge *edge, float *r_dir) { float v1[3], v2[3]; @@ -524,22 +519,6 @@ static void edge_pos_direction_worldspace_get(Object *ob, BMEdge *edge, float *r sub_v3_v3v3(r_dir, v1, v2); normalize_v3(r_dir); - - /* Make sure we have a consistent direction that can be checked regardless of - * the verts order of the edges. This spares us from storing dir and -dir in the tree_3d. */ - if (fabs(r_dir[2]) < FLT_EPSILON) { - if (fabs(r_dir[1]) < FLT_EPSILON) { - if (r_dir[0] < 0.0f) { - mul_v3_fl(r_dir, -1.0f); - } - } - else if (r_dir[1] < 0.0f) { - mul_v3_fl(r_dir, -1.0f); - } - } - else if (r_dir[2] < 0.0f) { - mul_v3_fl(r_dir, -1.0f); - } } static float edge_length_squared_worldspace_get(Object *ob, BMEdge *edge) @@ -619,7 +598,7 @@ static int similar_edge_select_exec(bContext *C, wmOperator *op) tree_1d = BLI_kdtree_1d_new(tot_edges_selected_all); break; case SIMEDGE_DIR: - tree_3d = BLI_kdtree_3d_new(tot_edges_selected_all); + tree_3d = BLI_kdtree_3d_new(tot_edges_selected_all * 2); break; case SIMEDGE_FACE: gset = BLI_gset_ptr_new("Select similar edge: face"); @@ -687,9 +666,13 @@ static int similar_edge_select_exec(bContext *C, wmOperator *op) BLI_gset_add(gset, POINTER_FROM_INT(BM_edge_face_count(edge))); break; case SIMEDGE_DIR: { - float dir[3]; + float dir[3], dir_flip[3]; edge_pos_direction_worldspace_get(ob, edge, dir); BLI_kdtree_3d_insert(tree_3d, tree_index++, dir); + /* Also store the flipped direction so it can be checked regardless of the verts order + * of the edges. */ + negate_v3_v3(dir_flip, dir); + BLI_kdtree_3d_insert(tree_3d, tree_index++, dir_flip); break; } case SIMEDGE_LENGTH: { @@ -916,7 +899,7 @@ static int similar_edge_select_exec(bContext *C, wmOperator *op) if (changed) { EDBM_selectmode_flush(em); EDBMUpdate_Params params{}; - params.calc_looptri = false; + params.calc_looptris = false; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(ob->data), ¶ms); @@ -942,7 +925,7 @@ static int similar_edge_select_exec(bContext *C, wmOperator *op) } EDBM_selectmode_flush(em); EDBMUpdate_Params params{}; - params.calc_looptri = false; + params.calc_looptris = false; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(ob->data), ¶ms); @@ -1276,7 +1259,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op) if (changed) { EDBM_selectmode_flush(em); EDBMUpdate_Params params{}; - params.calc_looptri = false; + params.calc_looptris = false; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(ob->data), ¶ms); diff --git a/source/blender/editors/mesh/editmesh_tools.cc b/source/blender/editors/mesh/editmesh_tools.cc index 3865ff6ba22..eec3818948c 100644 --- a/source/blender/editors/mesh/editmesh_tools.cc +++ b/source/blender/editors/mesh/editmesh_tools.cc @@ -128,7 +128,7 @@ static int edbm_subdivide_exec(bContext *C, wmOperator *op) seed); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -326,7 +326,7 @@ static int edbm_subdivide_edge_ring_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -391,7 +391,7 @@ static int edbm_unsubdivide_exec(bContext *C, wmOperator *op) EDBM_selectmode_flush(em); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -521,7 +521,7 @@ static int edbm_delete_exec(bContext *C, wmOperator *op) BM_custom_loop_normals_from_vector_layer(em->bm, false); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -655,7 +655,7 @@ static int edbm_delete_loose_exec(bContext *C, wmOperator *op) EDBM_flag_disable_all(em, BM_ELEM_SELECT); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -718,7 +718,7 @@ static int edbm_collapse_edge_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -1013,7 +1013,7 @@ static int edbm_add_edge_face_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -1093,7 +1093,7 @@ static int edbm_mark_seam_exec(bContext *C, wmOperator *op) for (uint ob_index = 0; ob_index < objects_len; ob_index++) { Object *obedit = objects[ob_index]; EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -1168,7 +1168,7 @@ static int edbm_mark_sharp_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -1304,7 +1304,7 @@ static bool edbm_connect_vert_pair(BMEditMesh *em, Mesh *mesh, wmOperator *op) BM_custom_loop_normals_from_vector_layer(bm, false); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(mesh, ¶ms); @@ -1615,7 +1615,7 @@ static int edbm_vert_connect_path_exec(bContext *C, wmOperator *op) BM_custom_loop_normals_from_vector_layer(bm, false); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -1686,7 +1686,7 @@ static int edbm_vert_connect_concave_exec(bContext *C, wmOperator *op) continue; } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -1746,7 +1746,7 @@ static int edbm_vert_connect_nonplaner_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -1817,7 +1817,7 @@ static int edbm_face_make_planar_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = true; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -1870,7 +1870,7 @@ static bool edbm_edge_split_selected_edges(wmOperator *op, Object *obedit, BMEdi EDBM_select_flush(em); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -1945,7 +1945,7 @@ static bool edbm_edge_split_selected_verts(wmOperator *op, Object *obedit, BMEdi EDBM_select_flush(em); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -2066,7 +2066,7 @@ static int edbm_duplicate_exec(bContext *C, wmOperator *op) continue; } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -2217,7 +2217,7 @@ static void edbm_flip_normals_custom_loop_normals(Object *obedit, BMEditMesh *em } BM_loop_normal_editdata_array_free(lnors_ed_arr); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -2227,7 +2227,7 @@ static void edbm_flip_quad_tessellation(wmOperator *op, Object *obedit, BMEditMe { if (EDBM_op_callf(em, op, "flip_quad_tessellation faces=%hf", BM_ELEM_SELECT)) { EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -2248,7 +2248,7 @@ static void edbm_flip_normals_face_winding(wmOperator *op, Object *obedit, BMEdi if (flip_custom_normals(em->bm, lnors_ed_arr) || has_flipped_faces) { EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -2423,7 +2423,7 @@ static int edbm_edge_rotate_selected_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -2514,7 +2514,7 @@ static int edbm_hide_exec(bContext *C, wmOperator *op) if (EDBM_mesh_hide(em, unselected)) { EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -2570,7 +2570,7 @@ static int edbm_reveal_exec(bContext *C, wmOperator *op) if (EDBM_mesh_reveal(em, select)) { EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -2641,7 +2641,7 @@ static int edbm_normals_make_consistent_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -2759,7 +2759,7 @@ static int edbm_do_smooth_vertex_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -2870,7 +2870,7 @@ static int edbm_do_smooth_laplacian_vertex_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -2964,7 +2964,7 @@ static int edbm_faces_shade_smooth_exec(bContext *C, wmOperator * /*op*/) mesh_set_smooth_faces(em, 1); EDBMUpdate_Params params{}; - params.calc_looptri = false; + params.calc_looptris = false; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -3012,7 +3012,7 @@ static int edbm_faces_shade_flat_exec(bContext *C, wmOperator * /*op*/) mesh_set_smooth_faces(em, 0); EDBMUpdate_Params params{}; - params.calc_looptri = false; + params.calc_looptris = false; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -3072,7 +3072,7 @@ static int edbm_rotate_uvs_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = false; + params.calc_looptris = false; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -3107,7 +3107,7 @@ static int edbm_reverse_uvs_exec(bContext *C, wmOperator *op) continue; } EDBMUpdate_Params params{}; - params.calc_looptri = false; + params.calc_looptris = false; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -3162,7 +3162,7 @@ static int edbm_rotate_colors_exec(bContext *C, wmOperator *op) /* dependencies graph and notification stuff */ EDBMUpdate_Params params{}; - params.calc_looptri = false; + params.calc_looptris = false; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(ob->data), ¶ms); @@ -3210,7 +3210,7 @@ static int edbm_reverse_colors_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = false; + params.calc_looptris = false; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -3464,7 +3464,7 @@ static int edbm_merge_exec(bContext *C, wmOperator *op) BM_custom_loop_normals_from_vector_layer(em->bm, false); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -3649,7 +3649,7 @@ static int edbm_remove_doubles_exec(bContext *C, wmOperator *op) if (count) { count_multi += count; EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -3772,7 +3772,7 @@ static int edbm_shape_propagate_to_all_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = false; + params.calc_looptris = false; params.calc_normals = false; params.is_destructive = false; EDBM_update(mesh, ¶ms); @@ -3911,7 +3911,7 @@ static int edbm_blend_from_shape_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = true; params.is_destructive = false; EDBM_update(mesh, ¶ms); @@ -4053,7 +4053,7 @@ static int edbm_solidify_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -4391,7 +4391,7 @@ static int edbm_knife_cut_exec(bContext *C, wmOperator *op) BM_custom_loop_normals_from_vector_layer(bm, false); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -4792,7 +4792,7 @@ static int edbm_separate_exec(bContext *C, wmOperator *op) if (changed) { EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(base->object->data), ¶ms); @@ -4944,7 +4944,7 @@ static int edbm_fill_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -5251,7 +5251,7 @@ static int edbm_fill_grid_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -5329,7 +5329,7 @@ static int edbm_fill_holes_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -5413,7 +5413,7 @@ static int edbm_beautify_fill_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -5502,7 +5502,7 @@ static int edbm_poke_face_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = true; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -5609,7 +5609,7 @@ static int edbm_quads_convert_to_tris_exec(bContext *C, wmOperator *op) BM_custom_loop_normals_from_vector_layer(em->bm, false); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -5730,7 +5730,7 @@ static int edbm_tris_convert_to_quads_exec(bContext *C, wmOperator *op) BM_custom_loop_normals_from_vector_layer(em->bm, false); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -5920,7 +5920,7 @@ static int edbm_decimate_exec(bContext *C, wmOperator *op) EDBM_selectmode_flush_ex(em, selectmode); } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = true; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -6065,7 +6065,7 @@ static int edbm_dissolve_verts_exec(bContext *C, wmOperator *op) BM_custom_loop_normals_from_vector_layer(em->bm, false); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -6132,7 +6132,7 @@ static int edbm_dissolve_edges_exec(bContext *C, wmOperator *op) BM_custom_loop_normals_from_vector_layer(em->bm, false); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -6199,7 +6199,7 @@ static int edbm_dissolve_faces_exec(bContext *C, wmOperator *op) BM_custom_loop_normals_from_vector_layer(em->bm, false); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -6349,7 +6349,7 @@ static int edbm_dissolve_limited_exec(bContext *C, wmOperator *op) BM_custom_loop_normals_from_vector_layer(em->bm, false); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -6441,7 +6441,7 @@ static int edbm_dissolve_degenerate_exec(bContext *C, wmOperator *op) EDBM_select_flush(em); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -6538,7 +6538,7 @@ static int edbm_delete_edgeloop_exec(bContext *C, wmOperator *op) EDBM_selectmode_flush_ex(em, SCE_SELECT_VERTEX); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -6605,7 +6605,7 @@ static int edbm_split_exec(bContext *C, wmOperator *op) /* Geometry has changed, need to recalculate normals and tessellation. */ EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = true; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -7127,7 +7127,7 @@ static void sort_bmelem_flag(bContext *C, BM_mesh_remap(em->bm, map[0], map[1], map[2]); EDBMUpdate_Params params{}; - params.calc_looptri = (totelem[2] != 0); + params.calc_looptris = (totelem[2] != 0); params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(ob->data), ¶ms); @@ -7471,7 +7471,7 @@ static int edbm_bridge_edge_loops_for_single_editmesh(wmOperator *op, if (EDBM_op_finish(em, &bmop, op, true)) { EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(mesh, ¶ms); @@ -7618,7 +7618,7 @@ static int edbm_wireframe_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -7713,7 +7713,7 @@ static int edbm_offset_edgeloop_exec(bContext *C, wmOperator *op) if (EDBM_op_finish(em, &bmop, op, true)) { EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -7849,7 +7849,7 @@ static int edbm_convex_hull_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -7942,7 +7942,7 @@ static int mesh_symmetrize_exec(bContext *C, wmOperator *op) continue; } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = true; EDBM_update(static_cast(obedit->data), ¶ms); @@ -8090,7 +8090,7 @@ static int mesh_symmetry_snap_exec(bContext *C, wmOperator *op) } } EDBMUpdate_Params params{}; - params.calc_looptri = false; + params.calc_looptris = false; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -8776,7 +8776,7 @@ static int edbm_point_normals_modal(bContext *C, wmOperator *op, const wmEvent * if (point_normals_ensure(C, op)) { point_normals_apply(C, op, target, do_reset); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = false; /* Recheck booleans. */ @@ -8839,7 +8839,7 @@ static int edbm_point_normals_exec(bContext *C, wmOperator *op) point_normals_apply(C, op, target, false); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -9106,7 +9106,7 @@ static int normals_split_merge(bContext *C, const bool do_merge) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -9322,7 +9322,7 @@ static int edbm_average_normals_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -9585,7 +9585,7 @@ static int edbm_normals_tools_exec(bContext *C, wmOperator *op) BM_loop_normal_editdata_array_free(lnors_ed_arr); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -9744,7 +9744,7 @@ static int edbm_set_normals_from_faces_exec(bContext *C, wmOperator *op) MEM_freeN(loop_set); MEM_freeN(vert_normals); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -9858,7 +9858,7 @@ static int edbm_smooth_normals_exec(bContext *C, wmOperator *op) MEM_freeN(smooth_normal); EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); @@ -9952,7 +9952,7 @@ static int edbm_mod_weighted_strength_exec(bContext *C, wmOperator *op) } EDBMUpdate_Params params{}; - params.calc_looptri = false; + params.calc_looptris = false; params.calc_normals = false; params.is_destructive = false; EDBM_update(static_cast(obedit->data), ¶ms); diff --git a/source/blender/editors/mesh/editmesh_undo.cc b/source/blender/editors/mesh/editmesh_undo.cc index 07b7a6d7083..304cd093a6f 100644 --- a/source/blender/editors/mesh/editmesh_undo.cc +++ b/source/blender/editors/mesh/editmesh_undo.cc @@ -831,7 +831,7 @@ static void undomesh_to_editmesh(UndoMesh *um, Object *ob, BMEditMesh *em) *em = *em_tmp; /* Calculate face normals and tessellation at once since it's multi-threaded. */ - BKE_editmesh_looptri_and_normals_calc(em); + BKE_editmesh_looptris_and_normals_calc(em); em->selectmode = um->selectmode; bm->selectmode = um->selectmode; diff --git a/source/blender/editors/mesh/editmesh_utils.cc b/source/blender/editors/mesh/editmesh_utils.cc index fcda88c73b1..daee0b8c55c 100644 --- a/source/blender/editors/mesh/editmesh_utils.cc +++ b/source/blender/editors/mesh/editmesh_utils.cc @@ -61,7 +61,7 @@ BMBackup EDBM_redo_state_store(BMEditMesh *em) return backup; } -void EDBM_redo_state_restore(BMBackup *backup, BMEditMesh *em, bool recalc_looptri) +void EDBM_redo_state_restore(BMBackup *backup, BMEditMesh *em, bool recalc_looptris) { BM_mesh_data_free(em->bm); BMesh *tmpbm = BM_mesh_copy(backup->bmcopy); @@ -69,19 +69,19 @@ void EDBM_redo_state_restore(BMBackup *backup, BMEditMesh *em, bool recalc_loopt MEM_freeN(tmpbm); tmpbm = nullptr; - if (recalc_looptri) { - BKE_editmesh_looptri_calc(em); + if (recalc_looptris) { + BKE_editmesh_looptris_calc(em); } } -void EDBM_redo_state_restore_and_free(BMBackup *backup, BMEditMesh *em, bool recalc_looptri) +void EDBM_redo_state_restore_and_free(BMBackup *backup, BMEditMesh *em, bool recalc_looptris) { BM_mesh_data_free(em->bm); *em->bm = *backup->bmcopy; MEM_freeN(backup->bmcopy); backup->bmcopy = nullptr; - if (recalc_looptri) { - BKE_editmesh_looptri_calc(em); + if (recalc_looptris) { + BKE_editmesh_looptris_calc(em); } } @@ -1662,17 +1662,17 @@ void EDBM_update(Mesh *mesh, const EDBMUpdate_Params *params) DEG_id_tag_update(&mesh->id, ID_RECALC_GEOMETRY); WM_main_add_notifier(NC_GEOM | ND_DATA, &mesh->id); - if (params->calc_normals && params->calc_looptri) { + if (params->calc_normals && params->calc_looptris) { /* Calculating both has some performance gains. */ - BKE_editmesh_looptri_and_normals_calc(em); + BKE_editmesh_looptris_and_normals_calc(em); } else { if (params->calc_normals) { EDBM_mesh_normals_update(em); } - if (params->calc_looptri) { - BKE_editmesh_looptri_calc(em); + if (params->calc_looptris) { + BKE_editmesh_looptris_calc(em); } } @@ -1701,7 +1701,7 @@ void EDBM_update(Mesh *mesh, const EDBMUpdate_Params *params) void EDBM_update_extern(Mesh *mesh, const bool do_tessellation, const bool is_destructive) { EDBMUpdate_Params params{}; - params.calc_looptri = do_tessellation; + params.calc_looptris = do_tessellation; params.calc_normals = false; params.is_destructive = is_destructive; EDBM_update(mesh, ¶ms); diff --git a/source/blender/editors/mesh/meshtools.cc b/source/blender/editors/mesh/meshtools.cc index c89fc4bb77a..0d9a5330cd1 100644 --- a/source/blender/editors/mesh/meshtools.cc +++ b/source/blender/editors/mesh/meshtools.cc @@ -1302,7 +1302,7 @@ bool ED_mesh_pick_face_vert( * \return boolean true == Found */ struct VertPickData { - const bool *hide_vert; + blender::VArraySpan hide_vert; const float *mval_f; /* [2] */ ARegion *region; @@ -1317,7 +1317,7 @@ static void ed_mesh_pick_vert__mapFunc(void *user_data, const float /*no*/[3]) { VertPickData *data = static_cast(user_data); - if (data->hide_vert && data->hide_vert[index]) { + if (!data->hide_vert.is_empty() && data->hide_vert[index]) { return; } float sco[2]; @@ -1334,6 +1334,7 @@ static void ed_mesh_pick_vert__mapFunc(void *user_data, bool ED_mesh_pick_vert( bContext *C, Object *ob, const int mval[2], uint dist_px, bool use_zbuf, uint *r_index) { + using namespace blender; Mesh *mesh = static_cast(ob->data); BLI_assert(mesh && GS(mesh->id.name) == ID_ME); @@ -1381,13 +1382,14 @@ bool ED_mesh_pick_vert( return false; } + const bke::AttributeAccessor attributes = mesh->attributes(); + /* setup data */ data.region = region; data.mval_f = mval_f; data.len_best = FLT_MAX; data.v_idx_best = -1; - data.hide_vert = (const bool *)CustomData_get_layer_named( - &me_eval->vert_data, CD_PROP_BOOL, ".hide_vert"); + data.hide_vert = *attributes.lookup(".hide_vert", ATTR_DOMAIN_POINT); BKE_mesh_foreach_mapped_vert(me_eval, ed_mesh_pick_vert__mapFunc, &data, MESH_FOREACH_NOP); diff --git a/source/blender/editors/object/object_bake.cc b/source/blender/editors/object/object_bake.cc index bf231e85249..b3e9055e66d 100644 --- a/source/blender/editors/object/object_bake.cc +++ b/source/blender/editors/object/object_bake.cc @@ -23,6 +23,7 @@ #include "BLI_utildefines.h" #include "BKE_DerivedMesh.hh" +#include "BKE_attribute.hh" #include "BKE_blender.h" #include "BKE_cdderivedmesh.h" #include "BKE_context.hh" @@ -114,6 +115,7 @@ struct MultiresBakeJob { static bool multiresbake_check(bContext *C, wmOperator *op) { + using namespace blender; Scene *scene = CTX_data_scene(C); Object *ob; Mesh *mesh; @@ -163,10 +165,13 @@ static bool multiresbake_check(bContext *C, wmOperator *op) ok = false; } else { - const int *material_indices = BKE_mesh_material_indices(mesh); + const bke::AttributeAccessor attributes = mesh->attributes(); + const VArraySpan material_indices = *attributes.lookup("material_index", + ATTR_DOMAIN_FACE); a = mesh->faces_num; while (ok && a--) { - Image *ima = bake_object_image_get(ob, material_indices ? material_indices[a] : 0); + Image *ima = bake_object_image_get(ob, + material_indices.is_empty() ? 0 : material_indices[a]); if (!ima) { BKE_report( diff --git a/source/blender/editors/object/object_bake_api.cc b/source/blender/editors/object/object_bake_api.cc index 27740a40d9d..c1a543de730 100644 --- a/source/blender/editors/object/object_bake_api.cc +++ b/source/blender/editors/object/object_bake_api.cc @@ -1075,12 +1075,13 @@ static void bake_targets_populate_pixels_color_attributes(BakeTargets *targets, } /* Populate through adjacent triangles, first triangle wins. */ - const int tottri = poly_to_tri_count(me_eval->faces_num, me_eval->totloop); - MLoopTri *looptri = static_cast(MEM_mallocN(sizeof(*looptri) * tottri, __func__)); + const int looptris_num = poly_to_tri_count(me_eval->faces_num, me_eval->totloop); + MLoopTri *looptris = static_cast( + MEM_mallocN(sizeof(*looptris) * looptris_num, __func__)); const blender::Span corner_verts = me_eval->corner_verts(); blender::bke::mesh::looptris_calc( - me_eval->vert_positions(), me_eval->faces(), corner_verts, {looptri, tottri}); + me_eval->vert_positions(), me_eval->faces(), corner_verts, {looptris, looptris_num}); const blender::Span looptri_faces = me_eval->looptri_faces(); /* For mapping back to original mesh in case there are modifiers. */ @@ -1091,8 +1092,8 @@ static void bake_targets_populate_pixels_color_attributes(BakeTargets *targets, const blender::OffsetIndices orig_faces = mesh->faces(); const blender::Span orig_corner_verts = mesh->corner_verts(); - for (int i = 0; i < tottri; i++) { - const MLoopTri *lt = &looptri[i]; + for (int i = 0; i < looptris_num; i++) { + const MLoopTri *lt = &looptris[i]; const int face_i = looptri_faces[i]; for (int j = 0; j < 3; j++) { @@ -1137,7 +1138,7 @@ static void bake_targets_populate_pixels_color_attributes(BakeTargets *targets, } } - MEM_freeN(looptri); + MEM_freeN(looptris); } static void bake_result_add_to_rgba(float rgba[4], const float *result, const int channels_num) diff --git a/source/blender/editors/object/object_constraint.cc b/source/blender/editors/object/object_constraint.cc index df6cec1460e..774342791c8 100644 --- a/source/blender/editors/object/object_constraint.cc +++ b/source/blender/editors/object/object_constraint.cc @@ -61,6 +61,7 @@ #include "ED_screen.hh" #include "ANIM_action.hh" +#include "ANIM_animdata.hh" #include "UI_interface.hh" #include "UI_resources.hh" @@ -1072,7 +1073,7 @@ static int followpath_path_animate_exec(bContext *C, wmOperator *op) (BKE_fcurve_find(&cu->adt->action->curves, "eval_time", 0) == nullptr)) { /* create F-Curve for path animation */ - act = ED_id_action_ensure(bmain, &cu->id); + act = blender::animrig::id_action_ensure(bmain, &cu->id); fcu = blender::animrig::action_fcurve_ensure(bmain, act, nullptr, nullptr, "eval_time", 0); /* standard vertical range - 1:1 = 100 frames */ @@ -1096,7 +1097,7 @@ static int followpath_path_animate_exec(bContext *C, wmOperator *op) path = RNA_path_from_ID_to_property(&ptr, prop); /* create F-Curve for constraint */ - act = ED_id_action_ensure(bmain, &ob->id); + act = blender::animrig::id_action_ensure(bmain, &ob->id); fcu = blender::animrig::action_fcurve_ensure(bmain, act, nullptr, nullptr, path, 0); /* standard vertical range - 0.0 to 1.0 */ diff --git a/source/blender/editors/object/object_data_transform.cc b/source/blender/editors/object/object_data_transform.cc index 44bbcc68874..1c7fc2f9287 100644 --- a/source/blender/editors/object/object_data_transform.cc +++ b/source/blender/editors/object/object_data_transform.cc @@ -552,7 +552,7 @@ void ED_object_data_xform_by_mat4(XFormObjectData *xod_base, const float mat[4][ for (const int i : positions.index_range()) { mul_v3_m4v3(positions[i], mat, xod->elem_array[i]); } - BKE_mesh_tag_positions_changed(mesh); + mesh->tag_positions_changed(); } if (key != nullptr) { @@ -661,7 +661,7 @@ void ED_object_data_xform_restore(XFormObjectData *xod_base) else { mesh->vert_positions_for_write().copy_from( {reinterpret_cast(xod->elem_array), mesh->totvert}); - BKE_mesh_tag_positions_changed(mesh); + mesh->tag_positions_changed(); } if ((key != nullptr) && (xod->key_data != nullptr)) { @@ -750,7 +750,7 @@ void ED_object_data_xform_tag_update(XFormObjectData *xod_base) Mesh *mesh = (Mesh *)xod_base->id; if (xod_base->is_edit_mode) { EDBMUpdate_Params params{}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = true; params.is_destructive = false; EDBM_update(mesh, ¶ms); diff --git a/source/blender/editors/object/object_edit.cc b/source/blender/editors/object/object_edit.cc index 141a7f0e726..86545c89647 100644 --- a/source/blender/editors/object/object_edit.cc +++ b/source/blender/editors/object/object_edit.cc @@ -829,7 +829,7 @@ bool ED_object_editmode_enter_ex(Main *bmain, Scene *scene, Object *ob, int flag BMEditMesh *em = BKE_editmesh_from_object(ob); if (LIKELY(em)) { - BKE_editmesh_looptri_and_normals_calc(em); + BKE_editmesh_looptris_and_normals_calc(em); } WM_main_add_notifier(NC_SCENE | ND_MODE | NS_EDITMODE_MESH, nullptr); @@ -1566,6 +1566,7 @@ void OBJECT_OT_paths_clear(wmOperatorType *ot) static int shade_smooth_exec(bContext *C, wmOperator *op) { + using namespace blender; const bool use_smooth = STREQ(op->idname, "OBJECT_OT_shade_smooth"); const bool use_smooth_by_angle = STREQ(op->idname, "OBJECT_OT_shade_smooth_by_angle"); bool changed_multi = false; @@ -1616,11 +1617,11 @@ static int shade_smooth_exec(bContext *C, wmOperator *op) bool changed = false; if (ob->type == OB_MESH) { - BKE_mesh_smooth_flag_set(static_cast(ob->data), use_smooth || use_smooth_by_angle); + bke::mesh_smooth_set(*static_cast(ob->data), use_smooth || use_smooth_by_angle); if (use_smooth || use_smooth_by_angle) { if (use_smooth_by_angle) { const float angle = RNA_float_get(op->ptr, "angle"); - BKE_mesh_sharp_edges_set_from_angle(static_cast(ob->data), angle); + bke::mesh_sharp_edges_set_from_angle(*static_cast(ob->data), angle); } } BKE_mesh_batch_cache_dirty_tag(static_cast(ob->data), BKE_MESH_BATCH_DIRTY_ALL); diff --git a/source/blender/editors/object/object_hook.cc b/source/blender/editors/object/object_hook.cc index ecbfb2b04db..686f7af9c3e 100644 --- a/source/blender/editors/object/object_hook.cc +++ b/source/blender/editors/object/object_hook.cc @@ -344,7 +344,7 @@ static bool object_hook_index_array(Main *bmain, em = mesh->edit_mesh; - BKE_editmesh_looptri_and_normals_calc(em); + BKE_editmesh_looptris_and_normals_calc(em); /* check selected vertices first */ if (return_editmesh_indexar(em, r_indexar_num, r_indexar, r_cent) == 0) { diff --git a/source/blender/editors/object/object_modifier.cc b/source/blender/editors/object/object_modifier.cc index 6e680b8bb45..2fd081d94c4 100644 --- a/source/blender/editors/object/object_modifier.cc +++ b/source/blender/editors/object/object_modifier.cc @@ -812,7 +812,7 @@ static Mesh *create_applied_mesh_for_modifier(Depsgraph *depsgraph, if (mti->type == ModifierTypeType::OnlyDeform) { result = mesh_temp; mti->deform_verts(md_eval, &mectx, result, deformedVerts); - BKE_mesh_tag_positions_changed(result); + result->tag_positions_changed(); if (build_shapekey_layers) { add_shapekey_layers(*result, *mesh); diff --git a/source/blender/editors/object/object_relations.cc b/source/blender/editors/object/object_relations.cc index b62023cf44a..bf809fe3a95 100644 --- a/source/blender/editors/object/object_relations.cc +++ b/source/blender/editors/object/object_relations.cc @@ -106,6 +106,7 @@ #include "ED_view3d.hh" #include "ANIM_action.hh" +#include "ANIM_animdata.hh" #include "MOD_nodes.hh" @@ -147,7 +148,7 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op) em = mesh->edit_mesh; - BKE_editmesh_looptri_and_normals_calc(em); + BKE_editmesh_looptris_and_normals_calc(em); /* Make sure the evaluated mesh is updated. * @@ -563,7 +564,7 @@ bool ED_object_parent_set(ReportList *reports, /* if follow, add F-Curve for ctime (i.e. "eval_time") so that path-follow works */ if (partype == PAR_FOLLOW) { /* get or create F-Curve */ - bAction *act = ED_id_action_ensure(bmain, &cu->id); + bAction *act = blender::animrig::id_action_ensure(bmain, &cu->id); FCurve *fcu = blender::animrig::action_fcurve_ensure( bmain, act, nullptr, nullptr, "eval_time", 0); diff --git a/source/blender/editors/object/object_remesh.cc b/source/blender/editors/object/object_remesh.cc index 0df80ec6fb0..2c0db9bd290 100644 --- a/source/blender/editors/object/object_remesh.cc +++ b/source/blender/editors/object/object_remesh.cc @@ -168,7 +168,7 @@ static int voxel_remesh_exec(bContext *C, wmOperator *op) else { const VArray sharp_face = *mesh->attributes().lookup_or_default( "sharp_face", ATTR_DOMAIN_FACE, false); - BKE_mesh_smooth_flag_set(new_mesh, !sharp_face[0]); + bke::mesh_smooth_set(*new_mesh, !sharp_face[0]); } BKE_mesh_nomain_to_mesh(new_mesh, mesh, ob); @@ -831,6 +831,7 @@ static Mesh *remesh_symmetry_mirror(Object *ob, Mesh *mesh, eSymmetryAxes symmet static void quadriflow_start_job(void *customdata, wmJobWorkerStatus *worker_status) { + using namespace blender; using namespace blender::ed; QuadriFlowJob *qj = static_cast(customdata); @@ -899,7 +900,7 @@ static void quadriflow_start_job(void *customdata, wmJobWorkerStatus *worker_sta BKE_mesh_nomain_to_mesh(new_mesh, mesh, ob); - BKE_mesh_smooth_flag_set(static_cast(ob->data), qj->smooth_normals); + bke::mesh_smooth_set(*static_cast(ob->data), qj->smooth_normals); if (ob->mode == OB_MODE_SCULPT) { sculpt_paint::undo::geometry_end(ob); diff --git a/source/blender/editors/physics/particle_edit.cc b/source/blender/editors/physics/particle_edit.cc index 358f231927b..014a304de11 100644 --- a/source/blender/editors/physics/particle_edit.cc +++ b/source/blender/editors/physics/particle_edit.cc @@ -535,7 +535,7 @@ static bool PE_create_shape_tree(PEData *data, Object *shapeob) return false; } - return (BKE_bvhtree_from_mesh_get(&data->shape_bvh, mesh, BVHTREE_FROM_LOOPTRI, 4) != nullptr); + return (BKE_bvhtree_from_mesh_get(&data->shape_bvh, mesh, BVHTREE_FROM_LOOPTRIS, 4) != nullptr); } static void PE_free_shape_tree(PEData *data) diff --git a/source/blender/editors/render/render_preview.cc b/source/blender/editors/render/render_preview.cc index 595bbe74848..61e1f6d4e73 100644 --- a/source/blender/editors/render/render_preview.cc +++ b/source/blender/editors/render/render_preview.cc @@ -194,8 +194,16 @@ void ED_preview_ensure_dbase(const bool with_gpencil) base_initialized = true; } if (!base_initialized_gpencil && with_gpencil) { - G_pr_main_grease_pencil = load_main_from_memory(datatoc_preview_grease_pencil_blend, - datatoc_preview_grease_pencil_blend_size); + + if (U.experimental.use_grease_pencil_version3) { + G_pr_main_grease_pencil = load_main_from_memory(datatoc_preview_grease_pencil_blend, + datatoc_preview_grease_pencil_blend_size); + } + else { + G_pr_main_grease_pencil = load_main_from_memory( + datatoc_preview_grease_pencil_legacy_blend, + datatoc_preview_grease_pencil_legacy_blend_size); + } base_initialized_gpencil = true; } #else @@ -530,16 +538,20 @@ static Scene *preview_prepare_scene( /* Use a default world color. Using the current * scene world can be slow if it has big textures. */ sce->world->use_nodes = false; - sce->world->horr = 0.05f; - sce->world->horg = 0.05f; - sce->world->horb = 0.05f; + /* Use brighter world color for grease pencil. */ + if (sp->pr_main == G_pr_main_grease_pencil) { + sce->world->horr = 1.0f; + sce->world->horg = 1.0f; + sce->world->horb = 1.0f; + } + else { + sce->world->horr = 0.05f; + sce->world->horg = 0.05f; + sce->world->horb = 0.05f; + } } - /* For grease pencil, always use sphere for icon renders. */ - const ePreviewType preview_type = static_cast( - (sp->pr_method == PR_ICON_RENDER && sp->pr_main == G_pr_main_grease_pencil) ? - MA_SPHERE_A : - (ePreviewType)mat->pr_type); + const ePreviewType preview_type = static_cast(mat->pr_type); ED_preview_set_visibility(pr_main, sce, view_layer, preview_type, sp->pr_method); } else { diff --git a/source/blender/editors/screen/screen_ops.cc b/source/blender/editors/screen/screen_ops.cc index d8c014aa362..e0e40270421 100644 --- a/source/blender/editors/screen/screen_ops.cc +++ b/source/blender/editors/screen/screen_ops.cc @@ -5972,7 +5972,7 @@ static bool blend_file_drop_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * static void blend_file_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) { /* copy drag path to properties */ - RNA_string_set(drop->ptr, "filepath", WM_drag_get_path(drag)); + RNA_string_set(drop->ptr, "filepath", WM_drag_get_single_path(drag)); } void ED_keymap_screen(wmKeyConfig *keyconf) diff --git a/source/blender/editors/screen/workspace_edit.cc b/source/blender/editors/screen/workspace_edit.cc index 6873f549e2d..960cee24c76 100644 --- a/source/blender/editors/screen/workspace_edit.cc +++ b/source/blender/editors/screen/workspace_edit.cc @@ -15,7 +15,7 @@ #include "BLI_utildefines.h" #include "BKE_appdir.h" -#include "BKE_blendfile.h" +#include "BKE_blendfile.hh" #include "BKE_context.hh" #include "BKE_lib_id.h" #include "BKE_main.hh" diff --git a/source/blender/editors/sculpt_paint/curves_sculpt_add.cc b/source/blender/editors/sculpt_paint/curves_sculpt_add.cc index 943ce74ff55..d159659ba06 100644 --- a/source/blender/editors/sculpt_paint/curves_sculpt_add.cc +++ b/source/blender/editors/sculpt_paint/curves_sculpt_add.cc @@ -146,7 +146,7 @@ struct AddOperationExecutor { surface_positions_eval_ = surface_eval_->vert_positions(); surface_corner_verts_eval_ = surface_eval_->corner_verts(); surface_looptris_eval_ = surface_eval_->looptris(); - BKE_bvhtree_from_mesh_get(&surface_bvh_eval_, surface_eval_, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&surface_bvh_eval_, surface_eval_, BVHTREE_FROM_LOOPTRIS, 2); BLI_SCOPED_DEFER([&]() { free_bvhtree_from_mesh(&surface_bvh_eval_); }); curves_sculpt_ = ctx_.scene->toolsettings->curves_sculpt; @@ -297,13 +297,13 @@ struct AddOperationExecutor { } const int looptri_index = ray_hit.index; - const MLoopTri &looptri = surface_looptris_eval_[looptri_index]; + const MLoopTri < = surface_looptris_eval_[looptri_index]; const float3 brush_pos_su = ray_hit.co; const float3 bary_coords = bke::mesh_surface_sample::compute_bary_coord_in_triangle( - surface_positions_eval_, surface_corner_verts_eval_, looptri, brush_pos_su); + surface_positions_eval_, surface_corner_verts_eval_, lt, brush_pos_su); const float2 uv = bke::mesh_surface_sample::sample_corner_attribute_with_bary_coords( - bary_coords, looptri, surface_uv_map_eval_); + bary_coords, lt, surface_uv_map_eval_); r_sampled_uvs.append(uv); } @@ -429,13 +429,10 @@ struct AddOperationExecutor { brush_pos_su, brush_radius_su, [&](const int index, const float3 & /*co*/, const float /*dist_sq*/) { - const MLoopTri &looptri = surface_looptris_eval_[index]; - const float3 &v0_su = - surface_positions_eval_[surface_corner_verts_eval_[looptri.tri[0]]]; - const float3 &v1_su = - surface_positions_eval_[surface_corner_verts_eval_[looptri.tri[1]]]; - const float3 &v2_su = - surface_positions_eval_[surface_corner_verts_eval_[looptri.tri[2]]]; + const MLoopTri < = surface_looptris_eval_[index]; + const float3 &v0_su = surface_positions_eval_[surface_corner_verts_eval_[lt.tri[0]]]; + const float3 &v1_su = surface_positions_eval_[surface_corner_verts_eval_[lt.tri[1]]]; + const float3 &v2_su = surface_positions_eval_[surface_corner_verts_eval_[lt.tri[2]]]; float3 normal_su; normal_tri_v3(normal_su, v0_su, v1_su, v2_su); if (math::dot(normal_su, view_direction_su) >= 0.0f) { diff --git a/source/blender/editors/sculpt_paint/curves_sculpt_brush.cc b/source/blender/editors/sculpt_paint/curves_sculpt_brush.cc index 304654436c9..bed286a367e 100644 --- a/source/blender/editors/sculpt_paint/curves_sculpt_brush.cc +++ b/source/blender/editors/sculpt_paint/curves_sculpt_brush.cc @@ -193,7 +193,7 @@ std::optional sample_curves_3d_brush(const Depsgraph &depsgraph, Mesh *surface_eval = BKE_object_get_evaluated_mesh(surface_object_eval); BVHTreeFromMesh surface_bvh; - BKE_bvhtree_from_mesh_get(&surface_bvh, surface_eval, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&surface_bvh, surface_eval, BVHTREE_FROM_LOOPTRIS, 2); BLI_SCOPED_DEFER([&]() { free_bvhtree_from_mesh(&surface_bvh); }); const float3 center_ray_start_su = math::transform_point(world_to_surface_mat, diff --git a/source/blender/editors/sculpt_paint/curves_sculpt_density.cc b/source/blender/editors/sculpt_paint/curves_sculpt_density.cc index 1fd30fc77aa..f1e8e3b231e 100644 --- a/source/blender/editors/sculpt_paint/curves_sculpt_density.cc +++ b/source/blender/editors/sculpt_paint/curves_sculpt_density.cc @@ -131,7 +131,7 @@ struct DensityAddOperationExecutor { return; } - BKE_bvhtree_from_mesh_get(&surface_bvh_eval_, surface_eval_, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&surface_bvh_eval_, surface_eval_, BVHTREE_FROM_LOOPTRIS, 2); BLI_SCOPED_DEFER([&]() { free_bvhtree_from_mesh(&surface_bvh_eval_); }); surface_looptris_eval_ = surface_eval_->looptris(); /* Find UV map. */ @@ -550,7 +550,7 @@ struct DensitySubtractOperationExecutor { } surface_eval_ = BKE_object_get_evaluated_mesh(surface_ob_eval_); - BKE_bvhtree_from_mesh_get(&surface_bvh_eval_, surface_eval_, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&surface_bvh_eval_, surface_eval_, BVHTREE_FROM_LOOPTRIS, 2); BLI_SCOPED_DEFER([&]() { free_bvhtree_from_mesh(&surface_bvh_eval_); }); curves_sculpt_ = ctx_.scene->toolsettings->curves_sculpt; @@ -834,7 +834,7 @@ static bool use_add_density_mode(const BrushStrokeMode brush_mode, const CurvesSurfaceTransforms transforms(curves_ob_orig, curves_id_orig.surface); BVHTreeFromMesh surface_bvh_eval; - BKE_bvhtree_from_mesh_get(&surface_bvh_eval, surface_mesh_eval, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&surface_bvh_eval, surface_mesh_eval, BVHTREE_FROM_LOOPTRIS, 2); BLI_SCOPED_DEFER([&]() { free_bvhtree_from_mesh(&surface_bvh_eval); }); const float2 brush_pos_re = stroke_start.mouse_position; diff --git a/source/blender/editors/sculpt_paint/curves_sculpt_ops.cc b/source/blender/editors/sculpt_paint/curves_sculpt_ops.cc index b2abe585f58..052e2f2bf75 100644 --- a/source/blender/editors/sculpt_paint/curves_sculpt_ops.cc +++ b/source/blender/editors/sculpt_paint/curves_sculpt_ops.cc @@ -1031,7 +1031,7 @@ static int min_distance_edit_invoke(bContext *C, wmOperator *op, const wmEvent * } BVHTreeFromMesh surface_bvh_eval; - BKE_bvhtree_from_mesh_get(&surface_bvh_eval, surface_me_eval, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&surface_bvh_eval, surface_me_eval, BVHTREE_FROM_LOOPTRIS, 2); BLI_SCOPED_DEFER([&]() { free_bvhtree_from_mesh(&surface_bvh_eval); }); const int2 mouse_pos_int_re{event->mval}; diff --git a/source/blender/editors/sculpt_paint/curves_sculpt_puff.cc b/source/blender/editors/sculpt_paint/curves_sculpt_puff.cc index f818af498a0..355a737b2f2 100644 --- a/source/blender/editors/sculpt_paint/curves_sculpt_puff.cc +++ b/source/blender/editors/sculpt_paint/curves_sculpt_puff.cc @@ -121,7 +121,7 @@ struct PuffOperationExecutor { surface_corner_verts_ = surface_->corner_verts(); surface_looptris_ = surface_->looptris(); corner_normals_su_ = surface_->corner_normals(); - BKE_bvhtree_from_mesh_get(&surface_bvh_, surface_, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&surface_bvh_, surface_, BVHTREE_FROM_LOOPTRIS, 2); BLI_SCOPED_DEFER([&]() { free_bvhtree_from_mesh(&surface_bvh_); }); if (stroke_extension.is_first) { @@ -213,7 +213,7 @@ struct PuffOperationExecutor { brush_, dist_to_brush_re, brush_radius_re); math::max_inplace(max_weight, radius_falloff); } - r_curve_weights[curve_i] = max_weight; + math::max_inplace(r_curve_weights[curve_i], max_weight); }); } @@ -292,15 +292,15 @@ struct PuffOperationExecutor { surface_bvh_.nearest_callback, &surface_bvh_); - const MLoopTri &looptri = surface_looptris_[nearest.index]; + const MLoopTri < = surface_looptris_[nearest.index]; const float3 closest_pos_su = nearest.co; - const float3 &v0_su = surface_positions_[surface_corner_verts_[looptri.tri[0]]]; - const float3 &v1_su = surface_positions_[surface_corner_verts_[looptri.tri[1]]]; - const float3 &v2_su = surface_positions_[surface_corner_verts_[looptri.tri[2]]]; + const float3 &v0_su = surface_positions_[surface_corner_verts_[lt.tri[0]]]; + const float3 &v1_su = surface_positions_[surface_corner_verts_[lt.tri[1]]]; + const float3 &v2_su = surface_positions_[surface_corner_verts_[lt.tri[2]]]; float3 bary_coords; interp_weights_tri_v3(bary_coords, v0_su, v1_su, v2_su, closest_pos_su); const float3 normal_su = geometry::compute_surface_point_normal( - looptri, bary_coords, corner_normals_su_); + lt, bary_coords, corner_normals_su_); const float3 normal_cu = math::normalize( math::transform_direction(transforms_.surface_to_curves_normal, normal_su)); diff --git a/source/blender/editors/sculpt_paint/curves_sculpt_slide.cc b/source/blender/editors/sculpt_paint/curves_sculpt_slide.cc index 762e38ea21d..dcb5894ec3e 100644 --- a/source/blender/editors/sculpt_paint/curves_sculpt_slide.cc +++ b/source/blender/editors/sculpt_paint/curves_sculpt_slide.cc @@ -200,7 +200,7 @@ struct SlideOperationExecutor { report_missing_uv_map_on_evaluated_surface(stroke_extension.reports); return; } - BKE_bvhtree_from_mesh_get(&surface_bvh_eval_, surface_eval_, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&surface_bvh_eval_, surface_eval_, BVHTREE_FROM_LOOPTRIS, 2); BLI_SCOPED_DEFER([&]() { free_bvhtree_from_mesh(&surface_bvh_eval_); }); if (stroke_extension.is_first) { @@ -376,13 +376,13 @@ struct SlideOperationExecutor { } /* Compute the uv of the new surface position on the evaluated mesh. */ - const MLoopTri &looptri_eval = surface_looptris_eval_[looptri_index_eval]; + const MLoopTri <_eval = surface_looptris_eval_[looptri_index_eval]; const float3 bary_weights_eval = bke::mesh_surface_sample::compute_bary_coord_in_triangle( - surface_positions_eval_, surface_corner_verts_eval_, looptri_eval, hit_pos_eval_su); + surface_positions_eval_, surface_corner_verts_eval_, lt_eval, hit_pos_eval_su); const float2 uv = bke::attribute_math::mix3(bary_weights_eval, - surface_uv_map_eval_[looptri_eval.tri[0]], - surface_uv_map_eval_[looptri_eval.tri[1]], - surface_uv_map_eval_[looptri_eval.tri[2]]); + surface_uv_map_eval_[lt_eval.tri[0]], + surface_uv_map_eval_[lt_eval.tri[1]], + surface_uv_map_eval_[lt_eval.tri[2]]); /* Try to find the same uv on the original surface. */ const ReverseUVSampler::Result result = reverse_uv_sampler_orig.sample(uv); @@ -390,22 +390,22 @@ struct SlideOperationExecutor { found_invalid_uv_mapping_.store(true); continue; } - const MLoopTri &looptri_orig = surface_looptris_orig_[result.looptri_index]; + const MLoopTri <_orig = surface_looptris_orig_[result.looptri_index]; const float3 &bary_weights_orig = result.bary_weights; /* Gather old and new surface normal. */ const float3 &initial_normal_cu = slide_curve_info.initial_normal_cu; - const float3 new_normal_cu = math::normalize(math::transform_point( - transforms_.surface_to_curves_normal, - geometry::compute_surface_point_normal( - looptri_orig, result.bary_weights, corner_normals_orig_su_))); + const float3 new_normal_cu = math::normalize( + math::transform_point(transforms_.surface_to_curves_normal, + geometry::compute_surface_point_normal( + lt_orig, result.bary_weights, corner_normals_orig_su_))); /* Gather old and new surface position. */ const float3 new_first_pos_orig_su = bke::attribute_math::mix3( bary_weights_orig, - positions_orig_su[corner_verts_orig[looptri_orig.tri[0]]], - positions_orig_su[corner_verts_orig[looptri_orig.tri[1]]], - positions_orig_su[corner_verts_orig[looptri_orig.tri[2]]]); + positions_orig_su[corner_verts_orig[lt_orig.tri[0]]], + positions_orig_su[corner_verts_orig[lt_orig.tri[1]]], + positions_orig_su[corner_verts_orig[lt_orig.tri[2]]]); const float3 old_first_pos_orig_cu = self_->initial_positions_cu_[first_point_i]; const float3 new_first_pos_orig_cu = math::transform_point(transforms_.surface_to_curves, new_first_pos_orig_su); diff --git a/source/blender/editors/sculpt_paint/paint_hide.cc b/source/blender/editors/sculpt_paint/paint_hide.cc index 4df1a12304f..91fa102d174 100644 --- a/source/blender/editors/sculpt_paint/paint_hide.cc +++ b/source/blender/editors/sculpt_paint/paint_hide.cc @@ -260,7 +260,7 @@ static void partialvis_update_mesh(Object &object, if (action == VisAction::Show && mask.is_empty()) { mesh_show_all(object, nodes); } - else { + else if (!mask.is_empty()) { vert_hide_update(object, nodes, [&](const Span verts, MutableSpan hide) { for (const int i : verts.index_range()) { if (mask[verts[i]] > 0.5f) { @@ -659,10 +659,14 @@ void PAINT_OT_hide_show(wmOperatorType *ot) "action", action_items, int(VisAction::Hide), - "VisAction", + "Visibility Action", "Whether to hide or show vertices"); - RNA_def_enum( - ot->srna, "area", area_items, VisArea::Inside, "VisArea", "Which vertices to hide or show"); + RNA_def_enum(ot->srna, + "area", + area_items, + VisArea::Inside, + "Visibility Area", + "Which vertices to hide or show"); WM_operator_properties_border(ot); } diff --git a/source/blender/editors/sculpt_paint/paint_image_proj.cc b/source/blender/editors/sculpt_paint/paint_image_proj.cc index 42dab6437fd..de7c50affaf 100644 --- a/source/blender/editors/sculpt_paint/paint_image_proj.cc +++ b/source/blender/editors/sculpt_paint/paint_image_proj.cc @@ -1322,7 +1322,7 @@ static void uv_image_outset(const ProjPaintState *ps, int fidx[2]; uint loop_index; uint vert[2]; - const MLoopTri *ltri = &ps->looptris_eval[tri_index]; + const MLoopTri *lt = &ps->looptris_eval[tri_index]; float ibuf_inv[2]; @@ -1338,7 +1338,7 @@ static void uv_image_outset(const ProjPaintState *ps, continue; } - loop_index = ltri->tri[fidx[0]]; + loop_index = lt->tri[fidx[0]]; seam_data = &ps->loopSeamData[loop_index]; seam_uvs = seam_data->seam_uvs; @@ -1350,7 +1350,7 @@ static void uv_image_outset(const ProjPaintState *ps, fidx[1] = (fidx[0] == 2) ? 0 : fidx[0] + 1; vert[0] = ps->corner_verts_eval[loop_index]; - vert[1] = ps->corner_verts_eval[ltri->tri[fidx[1]]]; + vert[1] = ps->corner_verts_eval[lt->tri[fidx[1]]]; for (uint i = 0; i < 2; i++) { VertSeam *seam; diff --git a/source/blender/editors/sculpt_paint/paint_intern.hh b/source/blender/editors/sculpt_paint/paint_intern.hh index 366b1a50241..eb9280cc408 100644 --- a/source/blender/editors/sculpt_paint/paint_intern.hh +++ b/source/blender/editors/sculpt_paint/paint_intern.hh @@ -456,7 +456,7 @@ enum BrushStrokeMode { namespace blender::ed::sculpt_paint::hide { void sync_all_from_faces(Object &object); -void mesh_show_all(Object &object, const Span nodes); +void mesh_show_all(Object &object, Span nodes); void grids_show_all(Depsgraph &depsgraph, Object &object, Span nodes); void tag_update_visibility(const bContext &C); diff --git a/source/blender/editors/sculpt_paint/paint_mask.cc b/source/blender/editors/sculpt_paint/paint_mask.cc index a15827de91d..8c4f58d078b 100644 --- a/source/blender/editors/sculpt_paint/paint_mask.cc +++ b/source/blender/editors/sculpt_paint/paint_mask.cc @@ -1125,10 +1125,7 @@ static void sculpt_gesture_face_set_apply_for_symmetry_pass(bContext * /*C*/, } } -static void sculpt_gesture_face_set_end(bContext * /*C*/, SculptGestureContext *sgcontext) -{ - BKE_pbvh_update_visibility(sgcontext->ss->pbvh); -} +static void sculpt_gesture_face_set_end(bContext * /*C*/, SculptGestureContext * /*sgcontext*/) {} static void sculpt_gesture_init_face_set_properties(SculptGestureContext *sgcontext, wmOperator * /*op*/) @@ -1224,7 +1221,7 @@ static void sculpt_gesture_mask_end(bContext *C, SculptGestureContext *sgcontext if (BKE_pbvh_type(sgcontext->ss->pbvh) == PBVH_GRIDS) { multires_mark_as_modified(depsgraph, sgcontext->vc.obact, MULTIRES_COORDS_MODIFIED); } - BKE_pbvh_update_mask(sgcontext->ss->pbvh); + blender::bke::pbvh::update_mask(*sgcontext->ss->pbvh); } static void sculpt_gesture_init_mask_properties(bContext *C, @@ -1650,7 +1647,7 @@ static void sculpt_gesture_trim_geometry_generate(SculptGestureContext *sgcontex loop_index += 3; } - BKE_mesh_smooth_flag_set(trim_operation->mesh, false); + bke::mesh_smooth_set(*trim_operation->mesh, false); BKE_mesh_calc_edges(trim_operation->mesh, false, false); sculpt_gesture_trim_normals_update(sgcontext); diff --git a/source/blender/editors/sculpt_paint/paint_utils.cc b/source/blender/editors/sculpt_paint/paint_utils.cc index 3b45d34d46f..5af14b5c76a 100644 --- a/source/blender/editors/sculpt_paint/paint_utils.cc +++ b/source/blender/editors/sculpt_paint/paint_utils.cc @@ -820,8 +820,7 @@ static int vert_select_ungrouped_exec(bContext *C, wmOperator *op) Object *ob = CTX_data_active_object(C); Mesh *mesh = static_cast(ob->data); - if (BLI_listbase_is_empty(&mesh->vertex_group_names) || (BKE_mesh_deform_verts(mesh) == nullptr)) - { + if (BLI_listbase_is_empty(&mesh->vertex_group_names) || mesh->deform_verts().is_empty()) { BKE_report(op->reports, RPT_ERROR, "No weights/vertex groups on object"); return OPERATOR_CANCELLED; } diff --git a/source/blender/editors/sculpt_paint/paint_vertex.cc b/source/blender/editors/sculpt_paint/paint_vertex.cc index 271e79e03ba..eaf46c09b34 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.cc +++ b/source/blender/editors/sculpt_paint/paint_vertex.cc @@ -522,6 +522,7 @@ void update_cache_invariants( /* Initialize the stroke cache variants from operator properties */ void update_cache_variants(bContext *C, VPaint *vp, Object *ob, PointerRNA *ptr) { + using namespace blender; Scene *scene = CTX_data_scene(C); SculptSession *ss = ob->sculpt; StrokeCache *cache = ss->cache; @@ -562,7 +563,7 @@ void update_cache_variants(bContext *C, VPaint *vp, Object *ob, PointerRNA *ptr) cache->radius_squared = cache->radius * cache->radius; if (ss->pbvh) { - BKE_pbvh_update_bounds(ss->pbvh, PBVH_UpdateRedraw | PBVH_UpdateBB); + bke::pbvh::update_bounds(*ss->pbvh, PBVH_UpdateRedraw | PBVH_UpdateBB); } } diff --git a/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.cc b/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.cc index 3482337d378..c1ab61d4f91 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.cc +++ b/source/blender/editors/sculpt_paint/paint_vertex_weight_ops.cc @@ -175,7 +175,7 @@ static int weight_sample_invoke(bContext *C, wmOperator *op, const wmEvent *even ViewContext vc = ED_view3d_viewcontext_init(C, depsgraph); mesh = BKE_mesh_from_object(vc.obact); - const MDeformVert *dvert = BKE_mesh_deform_verts(mesh); + const MDeformVert *dvert = mesh->deform_verts().data(); if (mesh && dvert && vc.v3d && vc.rv3d && (mesh->vertex_group_active_index != 0)) { const bool use_vert_sel = (mesh->editflag & ME_EDIT_PAINT_VERT_SEL) != 0; @@ -320,7 +320,7 @@ static int weight_sample_group_invoke(bContext *C, wmOperator *op, const wmEvent BLI_assert(vc.v3d && vc.rv3d); /* Ensured by poll. */ Mesh *mesh = BKE_mesh_from_object(vc.obact); - const MDeformVert *dverts = BKE_mesh_deform_verts(mesh); + const MDeformVert *dverts = mesh->deform_verts().data(); if (BLI_listbase_is_empty(&mesh->vertex_group_names) || (dverts == nullptr)) { BKE_report(op->reports, RPT_WARNING, "No vertex group data"); return OPERATOR_CANCELLED; @@ -405,6 +405,7 @@ void PAINT_OT_weight_sample_group(wmOperatorType *ot) /* fills in the selected faces with the current weight and vertex group */ static bool weight_paint_set(Object *ob, float paintweight) { + using namespace blender; Mesh *mesh = static_cast(ob->data); MDeformWeight *dw, *dw_prev; int vgroup_active, vgroup_mirror = -1; @@ -415,7 +416,7 @@ static bool weight_paint_set(Object *ob, float paintweight) const blender::OffsetIndices faces = mesh->faces(); const blender::Span corner_verts = mesh->corner_verts(); - MDeformVert *dvert = BKE_mesh_deform_verts_for_write(mesh); + MDeformVert *dvert = mesh->deform_verts_for_write().data(); if (mesh->faces_num == 0 || dvert == nullptr) { return false; @@ -431,19 +432,19 @@ static bool weight_paint_set(Object *ob, float paintweight) WPaintPrev wpp; wpaint_prev_create(&wpp, dvert, mesh->totvert); - const bool *select_vert = (const bool *)CustomData_get_layer_named( - &mesh->vert_data, CD_PROP_BOOL, ".select_vert"); - const bool *select_poly = (const bool *)CustomData_get_layer_named( - &mesh->face_data, CD_PROP_BOOL, ".select_poly"); + const bke::AttributeAccessor attributes = mesh->attributes(); + const VArraySpan select_vert = *attributes.lookup(".select_vert", ATTR_DOMAIN_POINT); + const VArraySpan select_poly = *attributes.lookup(".select_poly", ATTR_DOMAIN_FACE); for (const int i : faces.index_range()) { - if ((paint_selmode == SCE_SELECT_FACE) && !(select_poly && select_poly[i])) { + if ((paint_selmode == SCE_SELECT_FACE) && !(!select_poly.is_empty() && select_poly[i])) { continue; } for (const int vert : corner_verts.slice(faces[i])) { if (!dvert[vert].flag) { - if ((paint_selmode == SCE_SELECT_VERTEX) && !(select_vert && select_vert[vert])) { + if ((paint_selmode == SCE_SELECT_VERTEX) && + !(!select_vert.is_empty() && select_vert[vert])) { continue; } @@ -553,7 +554,7 @@ struct WPGradient_userData { Scene *scene; Mesh *mesh; MDeformVert *dvert; - const bool *select_vert; + blender::VArraySpan select_vert; blender::VArray hide_vert; Brush *brush; const float *sco_start; /* [2] */ @@ -654,7 +655,8 @@ static void gradientVertInit__mapFunc(void *user_data, WPGradient_vertStore *vs = &grad_data->vert_cache->elem[index]; if (grad_data->hide_vert[index] || - (grad_data->use_select && (grad_data->select_vert && !grad_data->select_vert[index]))) + (grad_data->use_select && + (!grad_data->select_vert.is_empty() && !grad_data->select_vert[index]))) { copy_v2_fl(vs->sco, FLT_MAX); return; @@ -720,7 +722,7 @@ static int paint_weight_gradient_modal(bContext *C, wmOperator *op, const wmEven if (vert_cache != nullptr) { Mesh *mesh = static_cast(ob->data); if (vert_cache->wpp.wpaint_prev) { - MDeformVert *dvert = BKE_mesh_deform_verts_for_write(mesh); + MDeformVert *dvert = mesh->deform_verts_for_write().data(); BKE_defvert_array_free_elems(dvert, mesh->totvert); BKE_defvert_array_copy(dvert, vert_cache->wpp.wpaint_prev, mesh->totvert); wpaint_prev_destroy(&vert_cache->wpp); @@ -748,7 +750,7 @@ static int paint_weight_gradient_exec(bContext *C, wmOperator *op) Scene *scene = CTX_data_scene(C); Object *ob = CTX_data_active_object(C); Mesh *mesh = static_cast(ob->data); - MDeformVert *dverts = BKE_mesh_deform_verts_for_write(mesh); + MDeformVert *dverts = mesh->deform_verts_for_write().data(); int x_start = RNA_int_get(op->ptr, "xstart"); int y_start = RNA_int_get(op->ptr, "ystart"); int x_end = RNA_int_get(op->ptr, "xend"); @@ -797,8 +799,7 @@ static int paint_weight_gradient_exec(bContext *C, wmOperator *op) data.scene = scene; data.mesh = mesh; data.dvert = dverts; - data.select_vert = (const bool *)CustomData_get_layer_named( - &mesh->vert_data, CD_PROP_BOOL, ".select_vert"); + data.select_vert = *attributes.lookup(".select_vert", ATTR_DOMAIN_POINT); data.hide_vert = *attributes.lookup_or_default(".hide_vert", ATTR_DOMAIN_POINT, false); data.sco_start = sco_start; data.sco_end = sco_end; diff --git a/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.cc b/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.cc index b75550dded6..e00ca516f1e 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.cc +++ b/source/blender/editors/sculpt_paint/paint_vertex_weight_utils.cc @@ -60,7 +60,7 @@ bool ED_wpaint_ensure_data(bContext *C, } /* If nothing was added yet, we make deform-verts and a vertex deform group. */ - if (BKE_mesh_deform_verts(mesh) == nullptr) { + if (mesh->deform_verts().is_empty()) { BKE_object_defgroup_data_create(&mesh->id); WM_event_add_notifier(C, NC_GEOM | ND_DATA, mesh); } diff --git a/source/blender/editors/sculpt_paint/sculpt.cc b/source/blender/editors/sculpt_paint/sculpt.cc index 8d6d3a5bf87..b466b7dfcdb 100644 --- a/source/blender/editors/sculpt_paint/sculpt.cc +++ b/source/blender/editors/sculpt_paint/sculpt.cc @@ -294,12 +294,14 @@ void SCULPT_vertex_persistent_normal_get(SculptSession *ss, PBVHVertRef vertex, float SCULPT_vertex_mask_get(SculptSession *ss, PBVHVertRef vertex) { + using namespace blender; switch (BKE_pbvh_type(ss->pbvh)) { case PBVH_FACES: { const Mesh *mesh = BKE_pbvh_get_mesh(ss->pbvh); - const float *mask = static_cast( - CustomData_get_layer_named(&mesh->vert_data, CD_PROP_FLOAT, ".sculpt_mask")); - return mask ? mask[vertex.i] : 0.0f; + const bke::AttributeAccessor attributes = mesh->attributes(); + const VArray mask = *attributes.lookup_or_default( + ".sculpt_mask", ATTR_DOMAIN_POINT, 0.0f); + return mask[vertex.i]; } case PBVH_BMESH: { BMVert *v; @@ -408,9 +410,10 @@ bool vert_visible_get(const SculptSession *ss, PBVHVertRef vertex) switch (BKE_pbvh_type(ss->pbvh)) { case PBVH_FACES: { const Mesh *mesh = BKE_pbvh_get_mesh(ss->pbvh); - const bool *hide_vert = static_cast( - CustomData_get_layer_named(&mesh->vert_data, CD_PROP_BOOL, ".hide_vert")); - return hide_vert == nullptr || !hide_vert[vertex.i]; + const bke::AttributeAccessor attributes = mesh->attributes(); + const VArray hide_vert = *attributes.lookup_or_default( + ".hide_vert", ATTR_DOMAIN_POINT, false); + return !hide_vert[vertex.i]; } case PBVH_BMESH: return !BM_elem_flag_test((BMVert *)vertex.i, BM_ELEM_HIDDEN); @@ -1231,8 +1234,8 @@ void SCULPT_orig_vert_data_unode_init(SculptOrigVertData *data, data->bm_log = ss->bm_log; } else { - data->coords = reinterpret_cast(data->unode->co.data()); - data->normals = reinterpret_cast(data->unode->no.data()); + data->coords = reinterpret_cast(data->unode->position.data()); + data->normals = reinterpret_cast(data->unode->normal.data()); data->vmasks = data->unode->mask.data(); data->colors = reinterpret_cast(data->unode->col.data()); } @@ -1244,8 +1247,7 @@ void SCULPT_orig_vert_data_init(SculptOrigVertData *data, blender::ed::sculpt_paint::undo::Type type) { using namespace blender::ed::sculpt_paint; - undo::Node *unode; - unode = undo::push_node(ob, node, type); + undo::Node *unode = undo::push_node(ob, node, type); SCULPT_orig_vert_data_unode_init(data, ob, unode); } @@ -1829,7 +1831,7 @@ static void calc_area_normal_and_center_task(Object *ob, if (ss->cache && !ss->cache->accum) { unode = undo::push_node(ob, node, undo::Type::Position); - use_original = (!unode->co.is_empty() || unode->bm_entry); + use_original = (!unode->position.is_empty() || unode->bm_entry); } SculptBrushTest normal_test; @@ -1939,8 +1941,8 @@ static void calc_area_normal_and_center_task(Object *ob, copy_v3_v3(no_s, temp_no_s); } else { - copy_v3_v3(co, unode->co[vd.i]); - copy_v3_v3(no_s, unode->no[vd.i]); + copy_v3_v3(co, unode->position[vd.i]); + copy_v3_v3(no_s, unode->normal[vd.i]); } } else { @@ -2891,7 +2893,7 @@ struct SculptRaycastData { float depth; bool original; Span corner_verts; - const bool *hide_poly; + blender::VArraySpan hide_poly; PBVHVertRef active_vertex; float *face_normal; @@ -2909,7 +2911,7 @@ struct SculptFindNearestToRayData { float dist_sq_to_ray; bool original; Span corner_verts; - const bool *hide_poly; + blender::VArraySpan hide_poly; }; ePaintSymmetryAreas SCULPT_get_vertex_symm_area(const float co[3]) @@ -3177,7 +3179,7 @@ void SCULPT_vertcos_to_key(Object *ob, KeyBlock *kb, const Span vertCos) /* Modifying of basis key should update mesh. */ if (kb == mesh->key->refkey) { mesh->vert_positions_for_write().copy_from(vertCos); - BKE_mesh_tag_positions_changed(mesh); + mesh->tag_positions_changed(); } /* Apply new coords on active key block, no need to re-allocate kb->data here! */ @@ -3618,7 +3620,7 @@ static void sculpt_combine_proxies_node(Object &object, float(*orco)[3] = nullptr; if (use_orco && !ss->bm) { orco = reinterpret_cast( - (undo::push_node(&object, &node, undo::Type::Position)->co.data())); + (undo::push_node(&object, &node, undo::Type::Position)->position.data())); } MutableSpan proxies = BKE_pbvh_node_get_proxies(&node); @@ -4775,7 +4777,7 @@ static void sculpt_raycast_cb(PBVHNode *node, void *data_v, float *tmin) else { /* Intersect with coordinates from before we started stroke. */ undo::Node *unode = undo::get_node(node, undo::Type::Position); - origco = (unode) ? reinterpret_cast(unode->co.data()) : nullptr; + origco = (unode) ? reinterpret_cast(unode->position.data()) : nullptr; use_origco = origco ? true : false; } } @@ -4816,7 +4818,7 @@ static void sculpt_find_nearest_to_ray_cb(PBVHNode *node, void *data_v, float *t else { /* Intersect with coordinates from before we started stroke. */ undo::Node *unode = undo::get_node(node, undo::Type::Position); - origco = (unode) ? reinterpret_cast(unode->co.data()) : nullptr; + origco = (unode) ? reinterpret_cast(unode->position.data()) : nullptr; use_origco = origco ? true : false; } } @@ -4884,6 +4886,7 @@ bool SCULPT_cursor_geometry_info_update(bContext *C, const float mval[2], bool use_sampled_normal) { + using namespace blender; Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); Scene *scene = CTX_data_scene(C); Sculpt *sd = scene->toolsettings->sculpt; @@ -4918,8 +4921,8 @@ bool SCULPT_cursor_geometry_info_update(bContext *C, if (BKE_pbvh_type(ss->pbvh) == PBVH_FACES) { const Mesh &mesh = *static_cast(ob->data); srd.corner_verts = mesh.corner_verts(); - srd.hide_poly = static_cast( - CustomData_get_layer_named(&mesh.face_data, CD_PROP_BOOL, ".hide_poly")); + const bke::AttributeAccessor attributes = mesh.attributes(); + srd.hide_poly = *attributes.lookup(".hide_poly", ATTR_DOMAIN_FACE); } srd.ray_start = ray_start; srd.ray_normal = ray_normal; @@ -5028,6 +5031,7 @@ bool SCULPT_stroke_get_location_ex(bContext *C, bool check_closest, bool limit_closest_radius) { + using namespace blender; using namespace blender::ed::sculpt_paint; Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C); Object *ob; @@ -5065,8 +5069,8 @@ bool SCULPT_stroke_get_location_ex(bContext *C, if (BKE_pbvh_type(ss->pbvh) == PBVH_FACES) { const Mesh &mesh = *static_cast(ob->data); srd.corner_verts = mesh.corner_verts(); - srd.hide_poly = static_cast( - CustomData_get_layer_named(&mesh.face_data, CD_PROP_BOOL, ".hide_poly")); + const bke::AttributeAccessor attributes = mesh.attributes(); + srd.hide_poly = *attributes.lookup(".hide_poly", ATTR_DOMAIN_FACE); } srd.depth = depth; srd.original = original; @@ -5093,8 +5097,8 @@ bool SCULPT_stroke_get_location_ex(bContext *C, if (BKE_pbvh_type(ss->pbvh) == PBVH_FACES) { const Mesh &mesh = *static_cast(ob->data); srd.corner_verts = mesh.corner_verts(); - srd.hide_poly = static_cast( - CustomData_get_layer_named(&mesh.face_data, CD_PROP_BOOL, ".hide_poly")); + const bke::AttributeAccessor attributes = mesh.attributes(); + srd.hide_poly = *attributes.lookup(".hide_poly", ATTR_DOMAIN_FACE); } srd.ray_start = ray_start; srd.ray_normal = ray_normal; @@ -5233,7 +5237,7 @@ void SCULPT_flush_update_step(bContext *C, SculptUpdateType update_flags) rcti r; if (update_flags & SCULPT_UPDATE_COORDS) { - BKE_pbvh_update_bounds(ss->pbvh, PBVH_UpdateBB); + bke::pbvh::update_bounds(*ss->pbvh, PBVH_UpdateBB); } RegionView3D *rv3d = CTX_wm_region_view3d(C); @@ -5260,11 +5264,11 @@ void SCULPT_flush_update_step(bContext *C, SculptUpdateType update_flags) * sculpt mode has special requirements and is expected to have sole ownership of the mesh it * modifies, it's generally okay. * - * Vertex and face normals are updated later in #BKE_pbvh_update_normals. However, we update - * the mesh's bounds eagerly here since they are trivial to access from the PBVH. Updating - * the object's evaluated geometry bounding box is necessary because sculpt strokes don't - * cause an object reevaluation. */ - BKE_mesh_tag_positions_changed_no_normals(mesh); + * Vertex and face normals are updated later in #bke::pbvh::update_normals. However, we + * update the mesh's bounds eagerly here since they are trivial to access from the PBVH. + * Updating the object's evaluated geometry bounding box is necessary because sculpt strokes + * don't cause an object reevaluation. */ + mesh->tag_positions_changed_no_normals(); mesh->bounds_set_eager(BKE_pbvh_bounding_box(ob->sculpt->pbvh)); if (ob->runtime->bounds_eval) { ob->runtime->bounds_eval = mesh->bounds_min_max(); @@ -5275,6 +5279,7 @@ void SCULPT_flush_update_step(bContext *C, SculptUpdateType update_flags) void SCULPT_flush_update_done(const bContext *C, Object *ob, SculptUpdateType update_flags) { + using namespace blender; /* After we are done drawing the stroke, check if we need to do a more * expensive depsgraph tag to update geometry. */ wmWindowManager *wm = CTX_wm_manager(C); @@ -5324,18 +5329,14 @@ void SCULPT_flush_update_done(const bContext *C, Object *ob, SculptUpdateType up } if (update_flags & SCULPT_UPDATE_COORDS) { - BKE_pbvh_update_bounds(ss->pbvh, PBVH_UpdateOriginalBB); + bke::pbvh::update_bounds(*ss->pbvh, PBVH_UpdateOriginalBB); /* Coordinates were modified, so fake neighbors are not longer valid. */ SCULPT_fake_neighbors_free(ob); } if (update_flags & SCULPT_UPDATE_MASK) { - BKE_pbvh_update_mask(ss->pbvh); - } - - if (update_flags & SCULPT_UPDATE_COLOR) { - BKE_pbvh_update_vertex_data(ss->pbvh, PBVH_UpdateColor); + bke::pbvh::update_mask(*ss->pbvh); } BKE_sculpt_attributes_destroy_temporary_stroke(ob); diff --git a/source/blender/editors/sculpt_paint/sculpt_brush_types.cc b/source/blender/editors/sculpt_paint/sculpt_brush_types.cc index 58c95900a8b..44a679b6488 100644 --- a/source/blender/editors/sculpt_paint/sculpt_brush_types.cc +++ b/source/blender/editors/sculpt_paint/sculpt_brush_types.cc @@ -2318,8 +2318,6 @@ void SCULPT_do_slide_relax_brush(Sculpt *sd, Object *ob, Span nodes) BKE_curvemapping_init(brush->curve); - TaskParallelSettings settings; - BKE_pbvh_parallel_range_settings(&settings, true, nodes.size()); if (ss->cache->alt_smooth) { SCULPT_boundary_info_ensure(ob); for (int i = 0; i < 4; i++) { diff --git a/source/blender/editors/sculpt_paint/sculpt_face_set.cc b/source/blender/editors/sculpt_paint/sculpt_face_set.cc index b0bff9299bf..35a5a4e6312 100644 --- a/source/blender/editors/sculpt_paint/sculpt_face_set.cc +++ b/source/blender/editors/sculpt_paint/sculpt_face_set.cc @@ -454,8 +454,6 @@ void do_draw_face_sets_brush(Sculpt *sd, Object *ob, Span nodes) BKE_curvemapping_init(brush->curve); - TaskParallelSettings settings; - BKE_pbvh_parallel_range_settings(&settings, true, nodes.size()); if (ss->cache->alt_smooth) { SCULPT_boundary_info_ensure(ob); for (int i = 0; i < 4; i++) { @@ -497,9 +495,8 @@ static void face_sets_update(Object &object, threading::parallel_for(nodes.index_range(), 1, [&](const IndexRange range) { TLS &tls = all_tls.local(); for (PBVHNode *node : nodes.slice(range)) { - tls.face_indices.clear(); - BKE_pbvh_node_calc_face_indices(pbvh, *node, tls.face_indices); - const Span faces = tls.face_indices; + const Span faces = bke::pbvh::node_face_indices_calc_mesh( + pbvh, *node, tls.face_indices); tls.new_face_sets.reinitialize(faces.size()); MutableSpan new_face_sets = tls.new_face_sets; @@ -818,11 +815,11 @@ static int sculpt_face_set_init_exec(bContext *C, wmOperator *op) break; } case InitMode::Creases: { - const float *creases = static_cast( - CustomData_get_layer_named(&mesh->edge_data, CD_PROP_FLOAT, "crease_edge")); + const VArraySpan creases = *attributes.lookup_or_default( + "crease_edge", ATTR_DOMAIN_EDGE, 0.0f); sculpt_face_sets_init_flood_fill( ob, [&](const int /*from_face*/, const int edge, const int /*to_face*/) -> bool { - return creases ? creases[edge] < threshold : true; + return creases[edge] < threshold; }); break; } @@ -836,11 +833,11 @@ static int sculpt_face_set_init_exec(bContext *C, wmOperator *op) break; } case InitMode::BevelWeight: { - const float *bevel_weights = static_cast( - CustomData_get_layer_named(&mesh->edge_data, CD_PROP_FLOAT, "bevel_weight_edge")); + const VArraySpan bevel_weights = *attributes.lookup_or_default( + "bevel_weight_edge", ATTR_DOMAIN_EDGE, 0.0f); sculpt_face_sets_init_flood_fill( ob, [&](const int /*from_face*/, const int edge, const int /*to_face*/) -> bool { - return bevel_weights ? bevel_weights[edge] < threshold : true; + return bevel_weights[edge] < threshold; }); break; } @@ -954,9 +951,8 @@ static void face_hide_update(Object &object, threading::parallel_for(nodes.index_range(), 1, [&](const IndexRange range) { TLS &tls = all_tls.local(); for (PBVHNode *node : nodes.slice(range)) { - tls.face_indices.clear(); - BKE_pbvh_node_calc_face_indices(pbvh, *node, tls.face_indices); - const Span faces = tls.face_indices; + const Span faces = bke::pbvh::node_face_indices_calc_mesh( + pbvh, *node, tls.face_indices); tls.new_hide.reinitialize(faces.size()); MutableSpan new_hide = tls.new_hide; @@ -1028,7 +1024,7 @@ static int sculpt_face_set_change_visibility_exec(bContext *C, wmOperator *op) else { face_hide_update(object, nodes, [&](const Span faces, MutableSpan hide) { for (const int i : hide.index_range()) { - hide[i] = face_sets[faces[i]] == active_face_set; + hide[i] = face_sets[faces[i]] != active_face_set; } }); } @@ -1080,7 +1076,7 @@ static int sculpt_face_set_change_visibility_exec(bContext *C, wmOperator *op) undo::push_end(&object); - BKE_pbvh_update_visibility(ss->pbvh); + bke::pbvh::update_visibility(*ss->pbvh); BKE_sculpt_hide_poly_pointer_update(object); SCULPT_topology_islands_invalidate(object.sculpt); diff --git a/source/blender/editors/sculpt_paint/sculpt_filter_mesh.cc b/source/blender/editors/sculpt_paint/sculpt_filter_mesh.cc index 84f4315ef2e..c37f1e19e67 100644 --- a/source/blender/editors/sculpt_paint/sculpt_filter_mesh.cc +++ b/source/blender/editors/sculpt_paint/sculpt_filter_mesh.cc @@ -133,7 +133,7 @@ void cache_init(bContext *C, /* `mesh->runtime.subdiv_ccg` is not available. Updating of the normals is done during drawing. * Filters can't use normals in multi-resolution. */ if (BKE_pbvh_type(ss->pbvh) != PBVH_GRIDS) { - BKE_pbvh_update_normals(ss->pbvh, nullptr); + bke::pbvh::update_normals(*ss->pbvh, nullptr); } for (const int i : ss->filter_cache->nodes.index_range()) { @@ -760,7 +760,7 @@ static void sculpt_mesh_filter_apply(bContext *C, wmOperator *op) /* The relax mesh filter needs the updated normals of the modified mesh after each iteration. */ if (ELEM(MESH_FILTER_RELAX, MESH_FILTER_RELAX_FACE_SETS)) { - BKE_pbvh_update_normals(ss->pbvh, ss->subdiv_ccg); + bke::pbvh::update_normals(*ss->pbvh, ss->subdiv_ccg); } SCULPT_flush_update_step(C, SCULPT_UPDATE_COORDS); @@ -859,7 +859,7 @@ static void sculpt_mesh_filter_cancel(bContext *C, wmOperator * /*op*/) BKE_pbvh_node_mark_update(node); } - BKE_pbvh_update_bounds(ss->pbvh, PBVH_UpdateBB); + blender::bke::pbvh::update_bounds(*ss->pbvh, PBVH_UpdateBB); } static int sculpt_mesh_filter_modal(bContext *C, wmOperator *op, const wmEvent *event) diff --git a/source/blender/editors/sculpt_paint/sculpt_geodesic.cc b/source/blender/editors/sculpt_paint/sculpt_geodesic.cc index 39b578f8da6..14e6b11073b 100644 --- a/source/blender/editors/sculpt_paint/sculpt_geodesic.cc +++ b/source/blender/editors/sculpt_paint/sculpt_geodesic.cc @@ -199,7 +199,7 @@ static float *geodesic_mesh_create(Object *ob, GSet *initial_verts, const float } if (e_other != e && !BLI_BITMAP_TEST(edge_tag, e_other) && - (ss->epmap[e_other].size() == 0 || dists[ev_other] != FLT_MAX)) + (ss->epmap[e_other].is_empty() || dists[ev_other] != FLT_MAX)) { if (BLI_BITMAP_TEST(affected_vertex, v_other) || BLI_BITMAP_TEST(affected_vertex, ev_other)) { diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.hh b/source/blender/editors/sculpt_paint/sculpt_intern.hh index 77c5e84e072..135fac3e899 100644 --- a/source/blender/editors/sculpt_paint/sculpt_intern.hh +++ b/source/blender/editors/sculpt_paint/sculpt_intern.hh @@ -186,22 +186,25 @@ struct Node { char idname[MAX_ID_NAME]; /* Name instead of pointer. */ void *node; /* only during push, not valid afterwards! */ - Array co; - Array orig_co; - Array no; + Array position; + Array orig_position; + Array normal; Array col; Array mask; - int totvert; Array loop_col; Array orig_loop_col; - int totloop; /* non-multires */ - int maxvert; /* to verify if totvert it still the same */ - Array index; /* Unique vertex indices, to restore into right location */ - int maxloop; - Array loop_index; + + /* to verify if totvert it still the same */ + int mesh_verts_num; + int mesh_corners_num; + + Array vert_indices; + int unique_verts_num; + + Array corner_indices; BitVector<> vert_hidden; BitVector<> face_hidden; @@ -1883,4 +1886,3 @@ int SCULPT_vertex_island_get(const SculptSession *ss, PBVHVertRef vertex); /* Make SCULPT_ alias to a few blenkernel sculpt methods. */ #define SCULPT_vertex_attr_get BKE_sculpt_vertex_attr_get -#define SCULPT_face_attr_get BKE_sculpt_face_attr_get diff --git a/source/blender/editors/sculpt_paint/sculpt_mask_init.cc b/source/blender/editors/sculpt_paint/sculpt_mask_init.cc index e0bdc84f894..e66fecf116a 100644 --- a/source/blender/editors/sculpt_paint/sculpt_mask_init.cc +++ b/source/blender/editors/sculpt_paint/sculpt_mask_init.cc @@ -119,7 +119,7 @@ static int sculpt_mask_init_exec(bContext *C, wmOperator *op) undo::push_end(ob); - BKE_pbvh_update_mask(ss->pbvh); + bke::pbvh::update_mask(*ss->pbvh); SCULPT_tag_update_overlays(C); return OPERATOR_FINISHED; } diff --git a/source/blender/editors/sculpt_paint/sculpt_ops.cc b/source/blender/editors/sculpt_paint/sculpt_ops.cc index 952e90b0013..7bc8f2658a4 100644 --- a/source/blender/editors/sculpt_paint/sculpt_ops.cc +++ b/source/blender/editors/sculpt_paint/sculpt_ops.cc @@ -956,7 +956,7 @@ static int sculpt_mask_by_color_invoke(bContext *C, wmOperator *op, const wmEven sculpt_mask_by_color_full_mesh(ob, active_vertex, threshold, invert, preserve_mask); } - BKE_pbvh_update_mask(ss->pbvh); + bke::pbvh::update_mask(*ss->pbvh); undo::push_end(ob); SCULPT_flush_update_done(C, ob, SCULPT_UPDATE_MASK); @@ -1161,7 +1161,7 @@ static int sculpt_bake_cavity_exec(bContext *C, wmOperator *op) auto_mask::cache_free(automasking); - BKE_pbvh_update_mask(ss->pbvh); + bke::pbvh::update_mask(*ss->pbvh); undo::push_end(ob); SCULPT_flush_update_done(C, ob, SCULPT_UPDATE_MASK); diff --git a/source/blender/editors/sculpt_paint/sculpt_paint_image.cc b/source/blender/editors/sculpt_paint/sculpt_paint_image.cc index c40db45d127..68378a5a39d 100644 --- a/source/blender/editors/sculpt_paint/sculpt_paint_image.cc +++ b/source/blender/editors/sculpt_paint/sculpt_paint_image.cc @@ -327,11 +327,8 @@ static std::vector init_uv_primitives_brush_test(SculptSession *ss, return brush_test; } -static void do_paint_pixels(void *__restrict userdata, - const int n, - const TaskParallelTLS *__restrict tls) +static void do_paint_pixels(TexturePaintingUserData *data, const int n) { - TexturePaintingUserData *data = static_cast(userdata); Object *ob = data->ob; SculptSession *ss = ob->sculpt; const Brush *brush = data->brush; @@ -339,7 +336,7 @@ static void do_paint_pixels(void *__restrict userdata, PBVHNode *node = data->nodes[n]; PBVHData &pbvh_data = BKE_pbvh_pixels_data_get(*pbvh); NodeData &node_data = BKE_pbvh_pixels_node_data_get(*node); - const int thread_id = BLI_task_parallel_thread_id(tls); + const int thread_id = BLI_task_parallel_thread_id(nullptr); const Span positions = SCULPT_mesh_deformed_positions_get(ss); std::vector brush_test = init_uv_primitives_brush_test( @@ -472,11 +469,8 @@ static void push_undo(const NodeData &node_data, } } -static void do_push_undo_tile(void *__restrict userdata, - const int n, - const TaskParallelTLS *__restrict /*tls*/) +static void do_push_undo_tile(TexturePaintingUserData *data, const int n) { - TexturePaintingUserData *data = static_cast(userdata); PBVHNode *node = data->nodes[n]; NodeData &node_data = BKE_pbvh_pixels_node_data_get(*node); @@ -501,14 +495,6 @@ static void do_push_undo_tile(void *__restrict userdata, } } -static void do_mark_dirty_regions(void *__restrict userdata, - const int n, - const TaskParallelTLS *__restrict /*tls*/) -{ - TexturePaintingUserData *data = static_cast(userdata); - PBVHNode *node = data->nodes[n]; - BKE_pbvh_pixels_mark_image_dirty(*node, *data->image_data.image, *data->image_data.image_user); -} /* -------------------------------------------------------------------- */ /** \name Fix non-manifold edge bleeding. @@ -580,6 +566,7 @@ void SCULPT_do_paint_brush_image(PaintModeSettings *paint_mode_settings, Object *ob, blender::Span texnodes) { + using namespace blender; Brush *brush = BKE_paint_brush(&sd->paint); TexturePaintingUserData data = {nullptr}; @@ -591,14 +578,19 @@ void SCULPT_do_paint_brush_image(PaintModeSettings *paint_mode_settings, return; } - TaskParallelSettings settings; - BKE_pbvh_parallel_range_settings(&settings, true, texnodes.size()); - BLI_task_parallel_range(0, texnodes.size(), &data, do_push_undo_tile, &settings); - BLI_task_parallel_range(0, texnodes.size(), &data, do_paint_pixels, &settings); + threading::parallel_for(texnodes.index_range(), 1, [&](const IndexRange range) { + for (const int i : range) { + do_push_undo_tile(&data, i); + } + }); + threading::parallel_for(texnodes.index_range(), 1, [&](const IndexRange range) { + for (const int i : range) { + do_paint_pixels(&data, i); + } + }); fix_non_manifold_seam_bleeding(*ob, data); - TaskParallelSettings settings_flush; - - BKE_pbvh_parallel_range_settings(&settings_flush, false, texnodes.size()); - BLI_task_parallel_range(0, texnodes.size(), &data, do_mark_dirty_regions, &settings_flush); + for (PBVHNode *node : texnodes) { + BKE_pbvh_pixels_mark_image_dirty(*node, *data.image_data.image, *data.image_data.image_user); + } } diff --git a/source/blender/editors/sculpt_paint/sculpt_smooth.cc b/source/blender/editors/sculpt_paint/sculpt_smooth.cc index 2224ded6a9f..7d7401ea0e2 100644 --- a/source/blender/editors/sculpt_paint/sculpt_smooth.cc +++ b/source/blender/editors/sculpt_paint/sculpt_smooth.cc @@ -506,8 +506,6 @@ void do_surface_smooth_brush(Sculpt *sd, Object *ob, Span nodes) { Brush *brush = BKE_paint_brush(&sd->paint); - TaskParallelSettings settings; - BKE_pbvh_parallel_range_settings(&settings, true, nodes.size()); for (int i = 0; i < brush->surface_smooth_iterations; i++) { threading::parallel_for(nodes.index_range(), 1, [&](const IndexRange range) { for (const int i : range) { diff --git a/source/blender/editors/sculpt_paint/sculpt_transform.cc b/source/blender/editors/sculpt_paint/sculpt_transform.cc index 80b474db56c..d56c5fa1b12 100644 --- a/source/blender/editors/sculpt_paint/sculpt_transform.cc +++ b/source/blender/editors/sculpt_paint/sculpt_transform.cc @@ -269,9 +269,6 @@ static void sculpt_transform_radius_elastic(Sculpt *sd, Object *ob, const float sculpt_transform_matrices_init( ss, symm, ss->filter_cache->transform_displacement_mode, transform_mats); - TaskParallelSettings settings; - BKE_pbvh_parallel_range_settings(&settings, true, ss->filter_cache->nodes.size()); - /* Elastic transform needs to apply all transform matrices to all vertices and then combine the * displacement proxies as all vertices are modified by all symmetry passes. */ for (ePaintSymmetryFlags symmpass = PAINT_SYMM_NONE; symmpass <= symm; symmpass++) { diff --git a/source/blender/editors/sculpt_paint/sculpt_undo.cc b/source/blender/editors/sculpt_paint/sculpt_undo.cc index c8cede8a629..019a6d34399 100644 --- a/source/blender/editors/sculpt_paint/sculpt_undo.cc +++ b/source/blender/editors/sculpt_paint/sculpt_undo.cc @@ -158,8 +158,7 @@ struct SculptUndoStep { #endif }; -static UndoSculpt *sculpt_undo_get_nodes(); -static bool sculpt_attribute_ref_equals(SculptAttrRef *a, SculptAttrRef *b); +static UndoSculpt *get_nodes(); static void sculpt_save_active_attribute(Object *ob, SculptAttrRef *attr); static UndoSculpt *sculpt_undosys_step_get_nodes(UndoStep *us_p); @@ -200,7 +199,7 @@ static void print_sculpt_node(Object *ob, Node *node) } } -static void print_sculpt_undo_step(Object *ob, UndoStep *us, UndoStep *active, int i) +static void print_step(Object *ob, UndoStep *us, UndoStep *active, int i) { Node *node; @@ -238,7 +237,7 @@ static void print_sculpt_undo_step(Object *ob, UndoStep *us, UndoStep *active, i } } } -void sculpt_undo_print_nodes(Object *ob, void *active) +static void print_nodes(Object *ob, void *active) { printf("=================== Sculpt undo steps ==============\n"); @@ -256,7 +255,7 @@ void sculpt_undo_print_nodes(Object *ob, void *active) printf("\n"); if (ustack->step_init) { printf("===Undo initialization stepB===\n"); - print_sculpt_undo_step(ob, ustack->step_init, active, -1); + print_step(ob, ustack->step_init, active, -1); printf("===============\n"); } @@ -266,16 +265,16 @@ void sculpt_undo_print_nodes(Object *ob, void *active) act_i = i; } - print_sculpt_undo_step(ob, us, active, i); + print_step(ob, us, active, i); } if (ustack->step_active) { printf("\n\n==Active step:==\n"); - print_sculpt_undo_step(ob, ustack->step_active, active, act_i); + print_step(ob, ustack->step_active, active, act_i); } } #else -# define sculpt_undo_print_nodes(ob, active) while (0) +static void print_nodes(Object * /*ob*/, void * /*active*/) {} #endif struct PartialUpdateData { @@ -326,7 +325,7 @@ static void update_modified_node_mesh(PBVHNode *node, void *userdata) Vector faces; if (!data->modified_face_set_faces.is_empty()) { if (faces.is_empty()) { - faces = BKE_pbvh_node_calc_face_indices(*data->pbvh, *node); + bke::pbvh::node_face_indices_calc_mesh(*data->pbvh, *node, faces); } for (const int face : faces) { if (data->modified_face_set_faces[face]) { @@ -337,7 +336,7 @@ static void update_modified_node_mesh(PBVHNode *node, void *userdata) } if (!data->modified_hidden_faces.is_empty()) { if (faces.is_empty()) { - faces = BKE_pbvh_node_calc_face_indices(*data->pbvh, *node); + bke::pbvh::node_face_indices_calc_mesh(*data->pbvh, *node, faces); } for (const int face : faces) { if (data->modified_hidden_faces[face]) { @@ -370,7 +369,7 @@ static void update_modified_node_grids(PBVHNode *node, void *userdata) Vector faces; if (!data->modified_face_set_faces.is_empty()) { if (faces.is_empty()) { - faces = BKE_pbvh_node_calc_face_indices(*data->pbvh, *node); + bke::pbvh::node_face_indices_calc_grids(*data->pbvh, *node, faces); } for (const int face : faces) { if (data->modified_face_set_faces[face]) { @@ -381,7 +380,7 @@ static void update_modified_node_grids(PBVHNode *node, void *userdata) } if (!data->modified_hidden_faces.is_empty()) { if (faces.is_empty()) { - faces = BKE_pbvh_node_calc_face_indices(*data->pbvh, *node); + bke::pbvh::node_face_indices_calc_grids(*data->pbvh, *node, faces); } for (const int face : faces) { if (data->modified_hidden_faces[face]) { @@ -402,22 +401,22 @@ static bool test_swap_v3_v3(float a[3], float b[3]) return false; } -static bool sculpt_undo_restore_deformed( +static bool restore_deformed( const SculptSession *ss, Node &unode, int uindex, int oindex, float coord[3]) { - if (test_swap_v3_v3(coord, unode.orig_co[uindex])) { - copy_v3_v3(unode.co[uindex], ss->deform_cos[oindex]); + if (test_swap_v3_v3(coord, unode.orig_position[uindex])) { + copy_v3_v3(unode.position[uindex], ss->deform_cos[oindex]); return true; } return false; } -static bool sculpt_undo_restore_coords(bContext *C, Object *ob, Depsgraph *depsgraph, Node &unode) +static bool restore_coords(bContext *C, Object *ob, Depsgraph *depsgraph, Node &unode) { SculptSession *ss = ob->sculpt; SubdivCCG *subdiv_ccg = ss->subdiv_ccg; - if (unode.maxvert) { + if (unode.mesh_verts_num) { /* Regular mesh restore. */ if (ss->shapekey_active && !STREQ(ss->shapekey_active->name, unode.shapeName)) { @@ -439,28 +438,28 @@ static bool sculpt_undo_restore_coords(bContext *C, Object *ob, Depsgraph *depsg } /* No need for float comparison here (memory is exactly equal or not). */ - const Span index = unode.index; + const Span index = unode.vert_indices.as_span().take_front(unode.unique_verts_num); MutableSpan positions = ss->vert_positions; if (ss->shapekey_active) { MutableSpan vertCos(static_cast(ss->shapekey_active->data), ss->shapekey_active->totelem); - if (!unode.orig_co.is_empty()) { + if (!unode.orig_position.is_empty()) { if (ss->deform_modifiers_active) { - for (int i = 0; i < unode.totvert; i++) { - sculpt_undo_restore_deformed(ss, unode, i, index[i], vertCos[index[i]]); + for (const int i : index.index_range()) { + restore_deformed(ss, unode, i, index[i], vertCos[index[i]]); } } else { - for (int i = 0; i < unode.totvert; i++) { - swap_v3_v3(vertCos[index[i]], unode.orig_co[i]); + for (const int i : index.index_range()) { + swap_v3_v3(vertCos[index[i]], unode.orig_position[i]); } } } else { - for (int i = 0; i < unode.totvert; i++) { - swap_v3_v3(vertCos[index[i]], unode.co[i]); + for (const int i : index.index_range()) { + swap_v3_v3(vertCos[index[i]], unode.position[i]); } } @@ -472,41 +471,40 @@ static bool sculpt_undo_restore_coords(bContext *C, Object *ob, Depsgraph *depsg BKE_pbvh_vert_coords_apply(ss->pbvh, vertCos); } else { - if (!unode.orig_co.is_empty()) { + if (!unode.orig_position.is_empty()) { if (ss->deform_modifiers_active) { - for (int i = 0; i < unode.totvert; i++) { - sculpt_undo_restore_deformed(ss, unode, i, index[i], positions[index[i]]); + for (const int i : index.index_range()) { + restore_deformed(ss, unode, i, index[i], positions[index[i]]); BKE_pbvh_vert_tag_update_normal(ss->pbvh, BKE_pbvh_make_vref(index[i])); } } else { - for (int i = 0; i < unode.totvert; i++) { - swap_v3_v3(positions[index[i]], unode.orig_co[i]); + for (const int i : index.index_range()) { + swap_v3_v3(positions[index[i]], unode.orig_position[i]); BKE_pbvh_vert_tag_update_normal(ss->pbvh, BKE_pbvh_make_vref(index[i])); } } } else { - for (int i = 0; i < unode.totvert; i++) { - swap_v3_v3(positions[index[i]], unode.co[i]); + for (const int i : index.index_range()) { + swap_v3_v3(positions[index[i]], unode.position[i]); BKE_pbvh_vert_tag_update_normal(ss->pbvh, BKE_pbvh_make_vref(index[i])); } } } } else if (!unode.grids.is_empty() && subdiv_ccg != nullptr) { - const int gridsize = subdiv_ccg->grid_size; const CCGKey key = BKE_subdiv_ccg_key_top_level(*subdiv_ccg); const Span grid_indices = unode.grids; - MutableSpan co = unode.co; + MutableSpan position = unode.position; MutableSpan grids = subdiv_ccg->grids; int index = 0; for (const int i : grid_indices.index_range()) { CCGElem *grid = grids[grid_indices[i]]; - for (const int j : IndexRange(gridsize * gridsize)) { - swap_v3_v3(CCG_elem_offset_co(&key, grid, j), co[index]); + for (const int j : IndexRange(key.grid_area)) { + swap_v3_v3(CCG_elem_offset_co(&key, grid, j), position[index]); index++; } } @@ -515,20 +513,18 @@ static bool sculpt_undo_restore_coords(bContext *C, Object *ob, Depsgraph *depsg return true; } -static bool sculpt_undo_restore_hidden(Object *ob, - Node &unode, - MutableSpan modified_vertices) +static bool restore_hidden(Object *ob, Node &unode, MutableSpan modified_vertices) { SculptSession *ss = ob->sculpt; SubdivCCG *subdiv_ccg = ss->subdiv_ccg; - if (unode.maxvert) { + if (unode.mesh_verts_num) { Mesh &mesh = *static_cast(ob->data); bke::MutableAttributeAccessor attributes = mesh.attributes_for_write(); bke::SpanAttributeWriter hide_vert = attributes.lookup_or_add_for_write_span( ".hide_vert", ATTR_DOMAIN_POINT); - for (const int i : unode.index.index_range()) { - const int vert = unode.index[i]; + for (const int i : unode.vert_indices.index_range().take_front(unode.unique_verts_num)) { + const int vert = unode.vert_indices[i]; if (unode.vert_hidden[i].test() != hide_vert.span[vert]) { unode.vert_hidden[i].set(!unode.vert_hidden[i].test()); hide_vert.span[vert] = !hide_vert.span[vert]; @@ -561,9 +557,7 @@ static bool sculpt_undo_restore_hidden(Object *ob, return true; } -static bool sculpt_undo_restore_hidden_face(Object &object, - Node &unode, - MutableSpan modified_faces) +static bool restore_hidden_face(Object &object, Node &unode, MutableSpan modified_faces) { Mesh &mesh = *static_cast(object.data); bke::MutableAttributeAccessor attributes = mesh.attributes_for_write(); @@ -587,7 +581,7 @@ static bool sculpt_undo_restore_hidden_face(Object &object, return modified; } -static bool sculpt_undo_restore_color(Object *ob, Node &unode, MutableSpan modified_vertices) +static bool restore_color(Object *ob, Node &unode, MutableSpan modified_vertices) { SculptSession *ss = ob->sculpt; @@ -596,62 +590,58 @@ static bool sculpt_undo_restore_color(Object *ob, Node &unode, MutableSpan /* NOTE: even with loop colors we still store derived * vertex colors for original data lookup. */ if (!unode.col.is_empty() && unode.loop_col.is_empty()) { - BKE_pbvh_swap_colors(ss->pbvh, unode.index, unode.col); + BKE_pbvh_swap_colors(ss->pbvh, unode.vert_indices, unode.col); modified = true; } Mesh *mesh = BKE_object_get_original_mesh(ob); - if (!unode.loop_col.is_empty() && unode.maxloop == mesh->totloop) { - BKE_pbvh_swap_colors(ss->pbvh, unode.loop_index, unode.loop_col); - + if (!unode.loop_col.is_empty() && unode.mesh_corners_num == mesh->totloop) { + BKE_pbvh_swap_colors(ss->pbvh, unode.corner_indices, unode.loop_col); modified = true; } if (modified) { - for (int i = 0; i < unode.totvert; i++) { - modified_vertices[unode.index[i]] = true; - } + modified_vertices.fill_indices(unode.vert_indices.as_span(), true); } return modified; } -static bool sculpt_undo_restore_mask(Object *ob, Node &unode, MutableSpan modified_vertices) +static bool restore_mask(Object *ob, Node &unode, MutableSpan modified_vertices) { Mesh *mesh = BKE_object_get_original_mesh(ob); SculptSession *ss = ob->sculpt; SubdivCCG *subdiv_ccg = ss->subdiv_ccg; - if (unode.maxvert) { + if (unode.mesh_verts_num) { bke::MutableAttributeAccessor attributes = mesh->attributes_for_write(); bke::SpanAttributeWriter mask = attributes.lookup_or_add_for_write_span( ".sculpt_mask", ATTR_DOMAIN_POINT); - const Span index = unode.index; + const Span index = unode.vert_indices.as_span().take_front(unode.unique_verts_num); - for (int i = 0; i < unode.totvert; i++) { - if (mask.span[index[i]] != unode.mask[i]) { - std::swap(mask.span[index[i]], unode.mask[i]); - modified_vertices[index[i]] = true; + for (const int i : index.index_range()) { + const int vert = index[i]; + if (mask.span[vert] != unode.mask[i]) { + std::swap(mask.span[vert], unode.mask[i]); + modified_vertices[vert] = true; } } mask.finish(); } else if (!unode.grids.is_empty() && subdiv_ccg != nullptr) { - const int gridsize = subdiv_ccg->grid_size; const CCGKey key = BKE_subdiv_ccg_key_top_level(*subdiv_ccg); - const Span grid_indices = unode.grids; MutableSpan mask = unode.mask; MutableSpan grids = subdiv_ccg->grids; int index = 0; - for (const int i : grid_indices.index_range()) { - CCGElem *grid = grids[grid_indices[i]]; - for (const int j : IndexRange(gridsize * gridsize)) { - std::swap(*CCG_elem_offset_mask(&key, grid, j), mask[index]); + for (const int grid : unode.grids) { + CCGElem *elem = grids[grid]; + for (const int j : IndexRange(key.grid_area)) { + std::swap(*CCG_elem_offset_mask(&key, elem, j), mask[index]); index++; } } @@ -660,9 +650,7 @@ static bool sculpt_undo_restore_mask(Object *ob, Node &unode, MutableSpan return true; } -static bool sculpt_undo_restore_face_sets(Object *ob, - Node &unode, - MutableSpan modified_face_set_faces) +static bool restore_face_sets(Object *ob, Node &unode, MutableSpan modified_face_set_faces) { bke::SpanAttributeWriter face_sets = face_set::ensure_face_sets_mesh(*ob); @@ -682,7 +670,7 @@ static bool sculpt_undo_restore_face_sets(Object *ob, return modified; } -static void sculpt_undo_bmesh_restore_generic(Node &unode, Object *ob, SculptSession *ss) +static void bmesh_restore_generic(Node &unode, Object *ob, SculptSession *ss) { if (unode.applied) { BM_log_undo(ss->bm, ss->bm_log); @@ -705,7 +693,7 @@ static void sculpt_undo_bmesh_restore_generic(Node &unode, Object *ob, SculptSes } /* Create empty sculpt BMesh and enable logging. */ -static void sculpt_undo_bmesh_enable(Object *ob, Node &unode) +static void bmesh_enable(Object *ob, Node &unode) { SculptSession *ss = ob->sculpt; Mesh *mesh = static_cast(ob->data); @@ -725,17 +713,14 @@ static void sculpt_undo_bmesh_enable(Object *ob, Node &unode) ss->bm_log = BM_log_from_existing_entries_create(ss->bm, unode.bm_entry); } -static void sculpt_undo_bmesh_restore_begin(bContext *C, - Node &unode, - Object *ob, - SculptSession *ss) +static void bmesh_restore_begin(bContext *C, Node &unode, Object *ob, SculptSession *ss) { if (unode.applied) { dyntopo::disable(C, &unode); unode.applied = false; } else { - sculpt_undo_bmesh_enable(ob, unode); + bmesh_enable(ob, unode); /* Restore the mesh from the first log entry. */ BM_log_redo(ss->bm, ss->bm_log); @@ -744,10 +729,10 @@ static void sculpt_undo_bmesh_restore_begin(bContext *C, } } -static void sculpt_undo_bmesh_restore_end(bContext *C, Node &unode, Object *ob, SculptSession *ss) +static void bmesh_restore_end(bContext *C, Node &unode, Object *ob, SculptSession *ss) { if (unode.applied) { - sculpt_undo_bmesh_enable(ob, unode); + bmesh_enable(ob, unode); /* Restore the mesh from the last log entry. */ BM_log_undo(ss->bm, ss->bm_log); @@ -761,7 +746,7 @@ static void sculpt_undo_bmesh_restore_end(bContext *C, Node &unode, Object *ob, } } -static void sculpt_undo_geometry_store_data(NodeGeometry *geometry, Object *object) +static void store_geometry_data(NodeGeometry *geometry, Object *object) { Mesh *mesh = static_cast(object->data); @@ -783,7 +768,7 @@ static void sculpt_undo_geometry_store_data(NodeGeometry *geometry, Object *obje geometry->faces_num = mesh->faces_num; } -static void sculpt_undo_geometry_restore_data(NodeGeometry *geometry, Object *object) +static void restore_geometry_data(NodeGeometry *geometry, Object *object) { Mesh *mesh = static_cast(object->data); @@ -807,36 +792,28 @@ static void sculpt_undo_geometry_restore_data(NodeGeometry *geometry, Object *ob &mesh->runtime->face_offsets_sharing_info); } -static void sculpt_undo_geometry_free_data(NodeGeometry *geometry) +static void geometry_free_data(NodeGeometry *geometry) { - if (geometry->totvert) { - CustomData_free(&geometry->vert_data, geometry->totvert); - } - if (geometry->totedge) { - CustomData_free(&geometry->edge_data, geometry->totedge); - } - if (geometry->totloop) { - CustomData_free(&geometry->loop_data, geometry->totloop); - } - if (geometry->faces_num) { - CustomData_free(&geometry->face_data, geometry->faces_num); - } + CustomData_free(&geometry->vert_data, geometry->totvert); + CustomData_free(&geometry->edge_data, geometry->totedge); + CustomData_free(&geometry->loop_data, geometry->totloop); + CustomData_free(&geometry->face_data, geometry->faces_num); implicit_sharing::free_shared_data(&geometry->face_offset_indices, &geometry->face_offsets_sharing_info); } -static void sculpt_undo_geometry_restore(Node &unode, Object *object) +static void restore_geometry(Node &unode, Object *object) { if (unode.geometry_clear_pbvh) { SCULPT_pbvh_clear(object); } if (unode.applied) { - sculpt_undo_geometry_restore_data(&unode.geometry_modified, object); + restore_geometry_data(&unode.geometry_modified, object); unode.applied = false; } else { - sculpt_undo_geometry_restore_data(&unode.geometry_original, object); + restore_geometry_data(&unode.geometry_original, object); unode.applied = true; } } @@ -845,19 +822,19 @@ static void sculpt_undo_geometry_restore(Node &unode, Object *object) * * Returns true if this was a dynamic-topology undo step, otherwise * returns false to indicate the non-dyntopo code should run. */ -static int sculpt_undo_bmesh_restore(bContext *C, Node &unode, Object *ob, SculptSession *ss) +static int bmesh_restore(bContext *C, Node &unode, Object *ob, SculptSession *ss) { switch (unode.type) { case Type::DyntopoBegin: - sculpt_undo_bmesh_restore_begin(C, unode, ob, ss); + bmesh_restore_begin(C, unode, ob, ss); return true; case Type::DyntopoEnd: - sculpt_undo_bmesh_restore_end(C, unode, ob, ss); + bmesh_restore_end(C, unode, ob, ss); return true; default: if (ss->bm_log) { - sculpt_undo_bmesh_restore_generic(unode, ob, ss); + bmesh_restore_generic(unode, ob, ss); return true; } break; @@ -879,10 +856,7 @@ static int sculpt_undo_bmesh_restore(bContext *C, Node &unode, Object *ob, Sculp * * Note that the dependency graph is ensured to be evaluated prior to the undo step is decoded, * so if the object's modifier stack references other object it is all fine. */ -static void sculpt_undo_refine_subdiv(Depsgraph *depsgraph, - SculptSession *ss, - Object *object, - Subdiv *subdiv) +static void refine_subdiv(Depsgraph *depsgraph, SculptSession *ss, Object *object, Subdiv *subdiv) { Array deformed_verts = BKE_multires_create_deformed_base_mesh_vert_coords( depsgraph, object, ss->multires.modifier); @@ -892,7 +866,7 @@ static void sculpt_undo_refine_subdiv(Depsgraph *depsgraph, reinterpret_cast(deformed_verts.data())); } -static void sculpt_undo_restore_list(bContext *C, Depsgraph *depsgraph, UndoSculpt &usculpt) +static void restore_list(bContext *C, Depsgraph *depsgraph, UndoSculpt &usculpt) { Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); @@ -926,7 +900,7 @@ static void sculpt_undo_restore_list(bContext *C, Depsgraph *depsgraph, UndoScul BKE_sculpt_update_object_for_edit(depsgraph, ob, false); } - if (sculpt_undo_bmesh_restore(C, *usculpt.nodes.first(), ob, ss)) { + if (bmesh_restore(C, *usculpt.nodes.first(), ob, ss)) { return; } } @@ -956,8 +930,8 @@ static void sculpt_undo_restore_list(bContext *C, Depsgraph *depsgraph, UndoScul } /* Check if undo data matches current data well enough to continue. */ - if (unode->maxvert) { - if (ss->totvert != unode->maxvert) { + if (unode->mesh_verts_num) { + if (ss->totvert != unode->mesh_verts_num) { continue; } } @@ -972,42 +946,42 @@ static void sculpt_undo_restore_list(bContext *C, Depsgraph *depsgraph, UndoScul switch (unode->type) { case Type::Position: - if (sculpt_undo_restore_coords(C, ob, depsgraph, *unode)) { + if (restore_coords(C, ob, depsgraph, *unode)) { changed_position = true; } break; case Type::HideVert: modified_verts_hide.resize(ss->totvert, false); - if (sculpt_undo_restore_hidden(ob, *unode, modified_verts_hide)) { + if (restore_hidden(ob, *unode, modified_verts_hide)) { changed_hide_vert = true; } break; case Type::HideFace: modified_faces_hide.resize(ss->totfaces, false); - if (sculpt_undo_restore_hidden_face(*ob, *unode, modified_faces_hide)) { + if (restore_hidden_face(*ob, *unode, modified_faces_hide)) { changed_hide_face = true; } break; case Type::Mask: modified_verts_mask.resize(ss->totvert, false); - if (sculpt_undo_restore_mask(ob, *unode, modified_verts_mask)) { + if (restore_mask(ob, *unode, modified_verts_mask)) { changed_mask = true; } break; case Type::FaceSet: modified_faces_face_set.resize(ss->totfaces, false); - if (sculpt_undo_restore_face_sets(ob, *unode, modified_faces_face_set)) { + if (restore_face_sets(ob, *unode, modified_faces_face_set)) { changed_face_sets = true; } break; case Type::Color: modified_verts_color.resize(ss->totvert, false); - if (sculpt_undo_restore_color(ob, *unode, modified_verts_color)) { + if (restore_color(ob, *unode, modified_verts_color)) { changed_color = true; } break; case Type::Geometry: - sculpt_undo_geometry_restore(*unode, ob); + restore_geometry(*unode, ob); changed_all_geometry = true; BKE_sculpt_update_object_for_edit(depsgraph, ob, false); break; @@ -1031,7 +1005,7 @@ static void sculpt_undo_restore_list(bContext *C, Depsgraph *depsgraph, UndoScul } if (subdiv_ccg != nullptr && changed_all_geometry) { - sculpt_undo_refine_subdiv(depsgraph, ss, ob, subdiv_ccg->subdiv); + refine_subdiv(depsgraph, ss, ob, subdiv_ccg->subdiv); } DEG_id_tag_update(&ob->id, ID_RECALC_SHADING); @@ -1064,21 +1038,21 @@ static void sculpt_undo_restore_list(bContext *C, Depsgraph *depsgraph, UndoScul } if (changed_position) { - BKE_pbvh_update_bounds(ss->pbvh, PBVH_UpdateBB | PBVH_UpdateOriginalBB | PBVH_UpdateRedraw); + bke::pbvh::update_bounds(*ss->pbvh, PBVH_UpdateBB | PBVH_UpdateOriginalBB | PBVH_UpdateRedraw); } if (changed_mask) { - BKE_pbvh_update_mask(ss->pbvh); + bke::pbvh::update_mask(*ss->pbvh); } if (changed_hide_face) { hide::sync_all_from_faces(*ob); - BKE_pbvh_update_visibility(ss->pbvh); + bke::pbvh::update_visibility(*ss->pbvh); } if (changed_hide_vert) { if (ELEM(BKE_pbvh_type(ss->pbvh), PBVH_FACES, PBVH_GRIDS)) { Mesh &mesh = *static_cast(ob->data); BKE_pbvh_sync_visibility_from_verts(ss->pbvh, &mesh); } - BKE_pbvh_update_visibility(ss->pbvh); + bke::pbvh::update_visibility(*ss->pbvh); } if (BKE_sculpt_multires_active(scene, ob)) { @@ -1097,19 +1071,19 @@ static void sculpt_undo_restore_list(bContext *C, Depsgraph *depsgraph, UndoScul if (tag_update) { Mesh *mesh = static_cast(ob->data); if (changed_position) { - BKE_mesh_tag_positions_changed(mesh); + mesh->tag_positions_changed(); BKE_sculptsession_free_deformMats(ss); } DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); } } -static void sculpt_undo_free_list(UndoSculpt &usculpt) +static void free_list(UndoSculpt &usculpt) { for (std::unique_ptr &unode : usculpt.nodes) { - sculpt_undo_geometry_free_data(&unode->geometry_original); - sculpt_undo_geometry_free_data(&unode->geometry_modified); - sculpt_undo_geometry_free_data(&unode->geometry_bmesh_enter); + geometry_free_data(&unode->geometry_original); + geometry_free_data(&unode->geometry_modified); + geometry_free_data(&unode->geometry_bmesh_enter); if (unode->bm_entry) { BM_log_entry_drop(unode->bm_entry); } @@ -1119,7 +1093,7 @@ static void sculpt_undo_free_list(UndoSculpt &usculpt) Node *get_node(PBVHNode *node, Type type) { - UndoSculpt *usculpt = sculpt_undo_get_nodes(); + UndoSculpt *usculpt = get_nodes(); if (usculpt == nullptr) { return nullptr; @@ -1134,7 +1108,7 @@ Node *get_node(PBVHNode *node, Type type) return nullptr; } -static size_t sculpt_undo_alloc_and_store_hidden(SculptSession *ss, Node *unode) +static size_t alloc_and_store_hidden(SculptSession *ss, Node *unode) { PBVHNode *node = static_cast(unode->node); if (!ss->subdiv_ccg) { @@ -1156,9 +1130,9 @@ static size_t sculpt_undo_alloc_and_store_hidden(SculptSession *ss, Node *unode) /* Allocate node and initialize its default fields specific for the given undo type. * Will also add the node to the list in the undo step. */ -static Node *sculpt_undo_alloc_node_type(Object *object, Type type) +static Node *alloc_node_type(Object *object, Type type) { - UndoSculpt *usculpt = sculpt_undo_get_nodes(); + UndoSculpt *usculpt = get_nodes(); std::unique_ptr unode = std::make_unique(); usculpt->nodes.append(std::move(unode)); usculpt->undo_size += sizeof(Node); @@ -1173,9 +1147,9 @@ static Node *sculpt_undo_alloc_node_type(Object *object, Type type) /* Will return first existing undo node of the given type. * If such node does not exist will allocate node of this type, register it in the undo step and * return it. */ -static Node *sculpt_undo_find_or_alloc_node_type(Object *object, Type type) +static Node *find_or_alloc_node_type(Object *object, Type type) { - UndoSculpt *usculpt = sculpt_undo_get_nodes(); + UndoSculpt *usculpt = get_nodes(); for (std::unique_ptr &unode : usculpt->nodes) { if (unode->type == type) { @@ -1183,41 +1157,46 @@ static Node *sculpt_undo_find_or_alloc_node_type(Object *object, Type type) } } - return sculpt_undo_alloc_node_type(object, type); + return alloc_node_type(object, type); } -static Node *sculpt_undo_alloc_node(Object *ob, PBVHNode *node, Type type) +static Node *alloc_node(Object *ob, PBVHNode *node, Type type) { - UndoSculpt *usculpt = sculpt_undo_get_nodes(); + UndoSculpt *usculpt = get_nodes(); SculptSession *ss = ob->sculpt; - Node *unode = sculpt_undo_alloc_node_type(ob, type); + Node *unode = alloc_node_type(ob, type); unode->node = node; - int totvert = 0; - int allvert = 0; - BKE_pbvh_node_num_verts(ss->pbvh, node, &totvert, &allvert); - - Span grids; + int verts_num; if (BKE_pbvh_type(ss->pbvh) == PBVH_GRIDS) { - grids = BKE_pbvh_node_get_grid_indices(*node); - } + unode->maxgrid = ss->subdiv_ccg->grids.size(); + unode->gridsize = ss->subdiv_ccg->grid_size; - unode->totvert = totvert; + verts_num = unode->maxgrid * unode->gridsize; + + unode->grids = BKE_pbvh_node_get_grid_indices(*node); + usculpt->undo_size += unode->grids.as_span().size_in_bytes(); + } + else { + unode->mesh_verts_num = ss->totvert; + + unode->vert_indices = BKE_pbvh_node_get_vert_indices(node); + unode->unique_verts_num = BKE_pbvh_node_get_unique_vert_indices(node).size(); + + verts_num = unode->vert_indices.size(); + + usculpt->undo_size += unode->vert_indices.as_span().size_in_bytes(); + } bool need_loops = type == Type::Color; const bool need_faces = ELEM(type, Type::FaceSet, Type::HideFace); if (need_loops) { - int totloop; + unode->corner_indices = BKE_pbvh_node_get_loops(node); + unode->mesh_corners_num = static_cast(ob->data)->totloop; - BKE_pbvh_node_num_loops(ss->pbvh, node, &totloop); - - unode->loop_index.reinitialize(totloop); - unode->maxloop = 0; - unode->totloop = totloop; - - usculpt->undo_size += unode->loop_index.as_span().size_in_bytes(); + usculpt->undo_size += unode->corner_indices.as_span().size_in_bytes(); } if (need_faces) { @@ -1227,21 +1206,21 @@ static Node *sculpt_undo_alloc_node(Object *ob, PBVHNode *node, Type type) switch (type) { case Type::Position: { - unode->co.reinitialize(allvert); - usculpt->undo_size += unode->co.as_span().size_in_bytes(); + unode->position.reinitialize(verts_num); + usculpt->undo_size += unode->position.as_span().size_in_bytes(); /* Needed for original data lookup. */ - unode->no.reinitialize(allvert); - usculpt->undo_size += unode->no.as_span().size_in_bytes(); + unode->normal.reinitialize(verts_num); + usculpt->undo_size += unode->normal.as_span().size_in_bytes(); break; } case Type::HideVert: { - if (grids.is_empty()) { - unode->vert_hidden.resize(allvert); - usculpt->undo_size += BLI_BITMAP_SIZE(allvert); + if (BKE_pbvh_type(ss->pbvh) == PBVH_GRIDS) { + usculpt->undo_size += alloc_and_store_hidden(ss, unode); } else { - usculpt->undo_size += sculpt_undo_alloc_and_store_hidden(ss, unode); + unode->vert_hidden.resize(unode->vert_indices.size()); + usculpt->undo_size += BLI_BITMAP_SIZE(unode->vert_indices.size()); } break; @@ -1252,19 +1231,19 @@ static Node *sculpt_undo_alloc_node(Object *ob, PBVHNode *node, Type type) break; } case Type::Mask: { - unode->mask.reinitialize(allvert); + unode->mask.reinitialize(verts_num); usculpt->undo_size += unode->mask.as_span().size_in_bytes(); break; } case Type::Color: { /* Allocate vertex colors, even for loop colors we still * need this for original data lookup. */ - unode->col.reinitialize(allvert); + unode->col.reinitialize(verts_num); usculpt->undo_size += unode->col.as_span().size_in_bytes(); /* Allocate loop colors separately too. */ if (ss->vcol_domain == ATTR_DOMAIN_CORNER) { - unode->loop_col.reinitialize(unode->totloop); + unode->loop_col.reinitialize(unode->corner_indices.size()); unode->undo_size += unode->loop_col.as_span().size_in_bytes(); } break; @@ -1283,51 +1262,59 @@ static Node *sculpt_undo_alloc_node(Object *ob, PBVHNode *node, Type type) } } - if (!grids.is_empty()) { - /* Multires. */ - unode->maxgrid = ss->subdiv_ccg->grids.size(); - unode->gridsize = ss->subdiv_ccg->grid_size; - - unode->grids.reinitialize(grids.size()); - usculpt->undo_size += unode->grids.as_span().size_in_bytes(); - } - else { - /* Regular mesh. */ - unode->maxvert = ss->totvert; - unode->index.reinitialize(allvert); - usculpt->undo_size += unode->index.as_span().size_in_bytes(); - } - if (ss->deform_modifiers_active) { - unode->orig_co.reinitialize(allvert); - usculpt->undo_size += unode->orig_co.as_span().size_in_bytes(); + unode->orig_position.reinitialize(unode->vert_indices.size()); + usculpt->undo_size += unode->orig_position.as_span().size_in_bytes(); } return unode; } -static void sculpt_undo_store_coords(Object *ob, Node *unode) +static void store_coords(Object *ob, Node *unode) { SculptSession *ss = ob->sculpt; - PBVHVertexIter vd; - BKE_pbvh_vertex_iter_begin (ss->pbvh, static_cast(unode->node), vd, PBVH_ITER_ALL) { - copy_v3_v3(unode->co[vd.i], vd.co); - if (vd.no) { - copy_v3_v3(unode->no[vd.i], vd.no); + if (!unode->grids.is_empty()) { + const SubdivCCG &subdiv_ccg = *ss->subdiv_ccg; + const CCGKey key = BKE_subdiv_ccg_key_top_level(subdiv_ccg); + const Span grids = subdiv_ccg.grids; + { + int index = 0; + for (const int grid : unode->grids) { + CCGElem *elem = grids[grid]; + for (const int i : IndexRange(key.grid_area)) { + unode->position[index] = float3(CCG_elem_offset_co(&key, elem, i)); + index++; + } + } } - else { - copy_v3_v3(unode->no[vd.i], vd.fno); - } - - if (ss->deform_modifiers_active) { - copy_v3_v3(unode->orig_co[vd.i], ss->orig_cos[unode->index[vd.i]]); + if (key.has_normals) { + int index = 0; + for (const int grid : unode->grids) { + CCGElem *elem = grids[grid]; + for (const int i : IndexRange(key.grid_area)) { + unode->normal[index] = float3(CCG_elem_offset_no(&key, elem, i)); + index++; + } + } + } + } + else { + array_utils::gather(BKE_pbvh_get_vert_positions(ss->pbvh).as_span(), + unode->vert_indices.as_span(), + unode->position.as_mutable_span()); + array_utils::gather(BKE_pbvh_get_vert_normals(ss->pbvh), + unode->vert_indices.as_span(), + unode->normal.as_mutable_span()); + if (ss->deform_modifiers_active) { + array_utils::gather(ss->orig_cos.as_span(), + unode->vert_indices.as_span(), + unode->orig_position.as_mutable_span()); } } - BKE_pbvh_vertex_iter_end; } -static void sculpt_undo_store_hidden(Object *ob, Node *unode) +static void store_hidden(Object *ob, Node *unode) { if (!unode->grids.is_empty()) { /* Already stored during allocation. */ @@ -1346,7 +1333,7 @@ static void sculpt_undo_store_hidden(Object *ob, Node *unode) unode->vert_hidden[i].set(hide_vert[verts[i]]); } -static void sculpt_undo_store_face_hidden(Object &object, Node &unode) +static void store_face_hidden(Object &object, Node &unode) { const Mesh &mesh = *static_cast(object.data); const bke::AttributeAccessor attributes = mesh.attributes(); @@ -1360,18 +1347,41 @@ static void sculpt_undo_store_face_hidden(Object &object, Node &unode) unode.face_hidden[i].set(hide_poly[faces[i]]); } -static void sculpt_undo_store_mask(Object *ob, Node *unode) +static void store_mask(Object *ob, Node *unode) { - SculptSession *ss = ob->sculpt; - PBVHVertexIter vd; + const SculptSession *ss = ob->sculpt; - BKE_pbvh_vertex_iter_begin (ss->pbvh, static_cast(unode->node), vd, PBVH_ITER_ALL) { - unode->mask[vd.i] = vd.mask; + if (!unode->grids.is_empty()) { + const SubdivCCG &subdiv_ccg = *ss->subdiv_ccg; + const CCGKey key = BKE_subdiv_ccg_key_top_level(subdiv_ccg); + if (key.has_mask) { + const Span grids = subdiv_ccg.grids; + int index = 0; + for (const int grid : unode->grids) { + CCGElem *elem = grids[grid]; + for (const int i : IndexRange(key.grid_area)) { + unode->mask[index] = *CCG_elem_offset_mask(&key, elem, i); + index++; + } + } + } + else { + unode->mask.fill(0.0f); + } + } + else { + const Mesh &mesh = *static_cast(ob->data); + const bke::AttributeAccessor attributes = mesh.attributes(); + if (const VArray mask = *attributes.lookup(".sculpt_mask", ATTR_DOMAIN_POINT)) { + array_utils::gather(mask, unode->vert_indices.as_span(), unode->mask.as_mutable_span()); + } + else { + unode->mask.fill(0.0f); + } } - BKE_pbvh_vertex_iter_end; } -static void sculpt_undo_store_color(Object *ob, Node *unode) +static void store_color(Object *ob, Node *unode) { SculptSession *ss = ob->sculpt; @@ -1379,14 +1389,14 @@ static void sculpt_undo_store_color(Object *ob, Node *unode) /* NOTE: even with loop colors we still store (derived) * vertex colors for original data lookup. */ - BKE_pbvh_store_colors_vertex(ss->pbvh, unode->index, unode->col); + BKE_pbvh_store_colors_vertex(ss->pbvh, unode->vert_indices, unode->col); - if (!unode->loop_col.is_empty() && unode->totloop) { - BKE_pbvh_store_colors(ss->pbvh, unode->loop_index, unode->loop_col); + if (!unode->loop_col.is_empty() && !unode->corner_indices.is_empty()) { + BKE_pbvh_store_colors(ss->pbvh, unode->corner_indices, unode->loop_col); } } -static NodeGeometry *sculpt_undo_geometry_get(Node *unode) +static NodeGeometry *geometry_get(Node *unode) { if (!unode->geometry_original.is_initialized) { return &unode->geometry_original; @@ -1397,19 +1407,19 @@ static NodeGeometry *sculpt_undo_geometry_get(Node *unode) return &unode->geometry_modified; } -static Node *sculpt_undo_geometry_push(Object *object, Type type) +static Node *geometry_push(Object *object, Type type) { - Node *unode = sculpt_undo_find_or_alloc_node_type(object, type); + Node *unode = find_or_alloc_node_type(object, type); unode->applied = false; unode->geometry_clear_pbvh = true; - NodeGeometry *geometry = sculpt_undo_geometry_get(unode); - sculpt_undo_geometry_store_data(geometry, object); + NodeGeometry *geometry = geometry_get(unode); + store_geometry_data(geometry, object); return unode; } -static void sculpt_undo_store_face_sets(const Mesh &mesh, Node &unode) +static void store_face_sets(const Mesh &mesh, Node &unode) { array_utils::gather( *mesh.attributes().lookup_or_default(".sculpt_face_set", ATTR_DOMAIN_FACE, 0), @@ -1417,9 +1427,9 @@ static void sculpt_undo_store_face_sets(const Mesh &mesh, Node &unode) unode.face_sets.as_mutable_span()); } -static Node *sculpt_undo_bmesh_push(Object *ob, PBVHNode *node, Type type) +static Node *bmesh_push(Object *ob, PBVHNode *node, Type type) { - UndoSculpt *usculpt = sculpt_undo_get_nodes(); + UndoSculpt *usculpt = get_nodes(); SculptSession *ss = ob->sculpt; PBVHVertexIter vd; @@ -1444,7 +1454,7 @@ static Node *sculpt_undo_bmesh_push(Object *ob, PBVHNode *node, Type type) * (converting faces to triangles) that the BMLog can't * fully restore from. */ NodeGeometry *geometry = &unode->geometry_bmesh_enter; - sculpt_undo_geometry_store_data(geometry, ob); + store_geometry_data(geometry, ob); unode->bm_entry = BM_log_entry_add(ss->bm_log); BM_log_all_added(ss->bm, ss->bm_log); @@ -1460,18 +1470,22 @@ static Node *sculpt_undo_bmesh_push(Object *ob, PBVHNode *node, Type type) case Type::Mask: /* Before any vertex values get modified, ensure their * original positions are logged. */ - BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_ALL) { - BM_log_vert_before_modified(ss->bm_log, vd.bm_vert, vd.cd_vert_mask_offset); + for (BMVert *vert : BKE_pbvh_bmesh_node_unique_verts(node)) { + BM_log_vert_before_modified(ss->bm_log, vert, vd.cd_vert_mask_offset); + } + for (BMVert *vert : BKE_pbvh_bmesh_node_other_verts(node)) { + BM_log_vert_before_modified(ss->bm_log, vert, vd.cd_vert_mask_offset); } - BKE_pbvh_vertex_iter_end; break; case Type::HideFace: case Type::HideVert: { - BKE_pbvh_vertex_iter_begin (ss->pbvh, node, vd, PBVH_ITER_ALL) { - BM_log_vert_before_modified(ss->bm_log, vd.bm_vert, vd.cd_vert_mask_offset); + for (BMVert *vert : BKE_pbvh_bmesh_node_unique_verts(node)) { + BM_log_vert_before_modified(ss->bm_log, vert, vd.cd_vert_mask_offset); + } + for (BMVert *vert : BKE_pbvh_bmesh_node_other_verts(node)) { + BM_log_vert_before_modified(ss->bm_log, vert, vd.cd_vert_mask_offset); } - BKE_pbvh_vertex_iter_end; for (BMFace *f : BKE_pbvh_bmesh_node_faces(node)) { BM_log_face_modified(ss->bm_log, f); @@ -1495,6 +1509,7 @@ static Node *sculpt_undo_bmesh_push(Object *ob, PBVHNode *node, Type type) Node *push_node(Object *ob, PBVHNode *node, Type type) { SculptSession *ss = ob->sculpt; + Node *unode; /* List is manipulated by multiple threads, so we lock. */ @@ -1502,78 +1517,61 @@ Node *push_node(Object *ob, PBVHNode *node, Type type) ss->needs_flush_to_id = 1; - if (ss->bm || ELEM(type, Type::DyntopoBegin, Type::DyntopoEnd)) { - /* Dynamic topology stores only one undo node per stroke, - * regardless of the number of PBVH nodes modified. */ - unode = sculpt_undo_bmesh_push(ob, node, type); - BLI_thread_unlock(LOCK_CUSTOM1); - return unode; - } - if (type == Type::Geometry) { - unode = sculpt_undo_geometry_push(ob, type); - BLI_thread_unlock(LOCK_CUSTOM1); - return unode; - } - if ((unode = get_node(node, type))) { - BLI_thread_unlock(LOCK_CUSTOM1); - return unode; - } - - unode = sculpt_undo_alloc_node(ob, node, type); - - /* NOTE: If this ever becomes a bottleneck, make a lock inside of the node. - * so we release global lock sooner, but keep data locked for until it is - * fully initialized. - */ - - if (!unode->grids.is_empty()) { - unode->grids.as_mutable_span().copy_from(BKE_pbvh_node_get_grid_indices(*node)); - } - else { - unode->index.as_mutable_span().copy_from(BKE_pbvh_node_get_vert_indices(node)); - - if (!unode->loop_index.is_empty()) { - const int *loop_indices; - int allloop; - BKE_pbvh_node_num_loops(ss->pbvh, static_cast(unode->node), &allloop); - BKE_pbvh_node_get_loops(static_cast(unode->node), &loop_indices); - - if (allloop) { - unode->loop_index.as_mutable_span().copy_from({loop_indices, allloop}); - - unode->maxloop = BKE_object_get_original_mesh(ob)->totloop; - } + threading::isolate_task([&]() { + if (ss->bm || ELEM(type, Type::DyntopoBegin, Type::DyntopoEnd)) { + /* Dynamic topology stores only one undo node per stroke, + * regardless of the number of PBVH nodes modified. */ + unode = bmesh_push(ob, node, type); + BLI_thread_unlock(LOCK_CUSTOM1); + // return unode; + return; + } + if (type == Type::Geometry) { + unode = geometry_push(ob, type); + BLI_thread_unlock(LOCK_CUSTOM1); + // return unode; + return; + } + if ((unode = get_node(node, type))) { + BLI_thread_unlock(LOCK_CUSTOM1); + // return unode; + return; } - } - switch (type) { - case Type::Position: - sculpt_undo_store_coords(ob, unode); - break; - case Type::HideVert: - sculpt_undo_store_hidden(ob, unode); - break; - case Type::HideFace: - sculpt_undo_store_face_hidden(*ob, *unode); - break; - case Type::Mask: - if (pbvh_has_mask(ss->pbvh)) { - sculpt_undo_store_mask(ob, unode); - } - break; - case Type::Color: - sculpt_undo_store_color(ob, unode); - break; - case Type::DyntopoBegin: - case Type::DyntopoEnd: - case Type::DyntopoSymmetrize: - BLI_assert_msg(0, "Dynamic topology should've already been handled"); - case Type::Geometry: - break; - case Type::FaceSet: - sculpt_undo_store_face_sets(*static_cast(ob->data), *unode); - break; - } + unode = alloc_node(ob, node, type); + + /* NOTE: If this ever becomes a bottleneck, make a lock inside of the node. + * so we release global lock sooner, but keep data locked for until it is + * fully initialized. */ + switch (type) { + case Type::Position: + store_coords(ob, unode); + break; + case Type::HideVert: + store_hidden(ob, unode); + break; + case Type::HideFace: + store_face_hidden(*ob, *unode); + break; + case Type::Mask: + store_mask(ob, unode); + break; + case Type::Color: + store_color(ob, unode); + break; + case Type::DyntopoBegin: + case Type::DyntopoEnd: + case Type::DyntopoSymmetrize: + BLI_assert_msg(0, "Dynamic topology should've already been handled"); + case Type::Geometry: + break; + case Type::FaceSet: + store_face_sets(*static_cast(ob->data), *unode); + break; + } + + BLI_thread_unlock(LOCK_CUSTOM1); + }); /* Store sculpt pivot. */ copy_v3_v3(unode->pivot_pos, ss->pivot_pos); @@ -1587,16 +1585,9 @@ Node *push_node(Object *ob, PBVHNode *node, Type type) unode->shapeName[0] = '\0'; } - BLI_thread_unlock(LOCK_CUSTOM1); - return unode; } -static bool sculpt_attribute_ref_equals(SculptAttrRef *a, SculptAttrRef *b) -{ - return a->domain == b->domain && a->type == b->type && STREQ(a->name, b->name); -} - static void sculpt_save_active_attribute(Object *ob, SculptAttrRef *attr) { Mesh *mesh = BKE_object_get_original_mesh(ob); @@ -1664,12 +1655,12 @@ void push_end(Object *ob) void push_end_ex(Object *ob, const bool use_nested_undo) { - UndoSculpt *usculpt = sculpt_undo_get_nodes(); + UndoSculpt *usculpt = get_nodes(); /* We don't need normals in the undo stack. */ for (std::unique_ptr &unode : usculpt->nodes) { - usculpt->undo_size -= unode->no.as_span().size_in_bytes(); - unode->no = {}; + usculpt->undo_size -= unode->normal.as_span().size_in_bytes(); + unode->normal = {}; } /* We could remove this and enforce all callers run in an operator using 'OPTYPE_UNDO'. */ @@ -1688,14 +1679,14 @@ void push_end_ex(Object *ob, const bool use_nested_undo) ustack, BKE_UNDOSYS_TYPE_SCULPT); sculpt_save_active_attribute(ob, &us->active_color_end); - sculpt_undo_print_nodes(ob, nullptr); + print_nodes(ob, nullptr); } /* -------------------------------------------------------------------- */ /** \name Implements ED Undo System * \{ */ -static void sculpt_undo_set_active_layer(bContext *C, SculptAttrRef *attr) +static void set_active_layer(bContext *C, SculptAttrRef *attr) { if (attr->domain == ATTR_DOMAIN_AUTO) { return; @@ -1741,10 +1732,6 @@ static void sculpt_undo_set_active_layer(bContext *C, SculptAttrRef *attr) if (ob->sculpt && ob->sculpt->pbvh) { BKE_pbvh_update_active_vcol(ob->sculpt->pbvh, mesh); - - if (!sculpt_attribute_ref_equals(&existing, attr)) { - BKE_pbvh_update_vertex_data(ob->sculpt->pbvh, PBVH_UpdateColor); - } } } } @@ -1781,10 +1768,10 @@ static void sculpt_undosys_step_decode_undo_impl(bContext *C, { BLI_assert(us->step.is_applied == true); - sculpt_undo_restore_list(C, depsgraph, us->data); + restore_list(C, depsgraph, us->data); us->step.is_applied = false; - sculpt_undo_print_nodes(CTX_data_active_object(C), nullptr); + print_nodes(CTX_data_active_object(C), nullptr); } static void sculpt_undosys_step_decode_redo_impl(bContext *C, @@ -1793,10 +1780,10 @@ static void sculpt_undosys_step_decode_redo_impl(bContext *C, { BLI_assert(us->step.is_applied == false); - sculpt_undo_restore_list(C, depsgraph, us->data); + restore_list(C, depsgraph, us->data); us->step.is_applied = true; - sculpt_undo_print_nodes(CTX_data_active_object(C), nullptr); + print_nodes(CTX_data_active_object(C), nullptr); } static void sculpt_undosys_step_decode_undo(bContext *C, @@ -1817,12 +1804,12 @@ static void sculpt_undosys_step_decode_undo(bContext *C, while ((us_iter != us) || (!is_final && us_iter == us)) { BLI_assert(us_iter->step.type == us->step.type); /* Previous loop ensures this. */ - sculpt_undo_set_active_layer(C, &((SculptUndoStep *)us_iter)->active_color_start); + set_active_layer(C, &((SculptUndoStep *)us_iter)->active_color_start); sculpt_undosys_step_decode_undo_impl(C, depsgraph, us_iter); if (us_iter == us) { if (us_iter->step.prev && us_iter->step.prev->type == BKE_UNDOSYS_TYPE_SCULPT) { - sculpt_undo_set_active_layer(C, &((SculptUndoStep *)us_iter->step.prev)->active_color_end); + set_active_layer(C, &((SculptUndoStep *)us_iter->step.prev)->active_color_end); } break; } @@ -1841,11 +1828,11 @@ static void sculpt_undosys_step_decode_redo(bContext *C, Depsgraph *depsgraph, S us_iter = (SculptUndoStep *)us_iter->step.prev; } while (us_iter && (us_iter->step.is_applied == false)) { - sculpt_undo_set_active_layer(C, &((SculptUndoStep *)us_iter)->active_color_start); + set_active_layer(C, &((SculptUndoStep *)us_iter)->active_color_start); sculpt_undosys_step_decode_redo_impl(C, depsgraph, us_iter); if (us_iter == us) { - sculpt_undo_set_active_layer(C, &((SculptUndoStep *)us_iter)->active_color_end); + set_active_layer(C, &((SculptUndoStep *)us_iter)->active_color_end); break; } us_iter = (SculptUndoStep *)us_iter->step.next; @@ -1908,7 +1895,7 @@ static void sculpt_undosys_step_decode( static void sculpt_undosys_step_free(UndoStep *us_p) { SculptUndoStep *us = (SculptUndoStep *)us_p; - sculpt_undo_free_list(us->data); + free_list(us->data); } void geometry_begin(Object *ob, const wmOperator *op) @@ -1955,7 +1942,7 @@ static UndoSculpt *sculpt_undosys_step_get_nodes(UndoStep *us_p) return &us->data; } -static UndoSculpt *sculpt_undo_get_nodes() +static UndoSculpt *get_nodes() { UndoStack *ustack = ED_undo_stack_get(); UndoStep *us = BKE_undosys_stack_init_or_active_with_type(ustack, BKE_UNDOSYS_TYPE_SCULPT); @@ -1986,7 +1973,7 @@ static UndoSculpt *sculpt_undo_get_nodes() * * * \{ */ -static bool sculpt_undo_use_multires_mesh(bContext *C) +static bool use_multires_mesh(bContext *C) { if (BKE_paintmode_get_active_from_context(C) != PAINT_MODE_SCULPT) { return false; @@ -1998,7 +1985,7 @@ static bool sculpt_undo_use_multires_mesh(bContext *C) return sculpt_session->multires.active; } -static void sculpt_undo_push_all_grids(Object *object) +static void push_all_grids(Object *object) { SculptSession *ss = object->sculpt; @@ -2023,7 +2010,7 @@ static void sculpt_undo_push_all_grids(Object *object) void push_multires_mesh_begin(bContext *C, const char *str) { - if (!sculpt_undo_use_multires_mesh(C)) { + if (!use_multires_mesh(C)) { return; } @@ -2034,12 +2021,12 @@ void push_multires_mesh_begin(bContext *C, const char *str) Node *geometry_unode = push_node(object, nullptr, Type::Geometry); geometry_unode->geometry_clear_pbvh = false; - sculpt_undo_push_all_grids(object); + push_all_grids(object); } void push_multires_mesh_end(bContext *C, const char *str) { - if (!sculpt_undo_use_multires_mesh(C)) { + if (!use_multires_mesh(C)) { ED_undo_push(C, str); return; } diff --git a/source/blender/editors/space_api/spacetypes.cc b/source/blender/editors/space_api/spacetypes.cc index fc6d7ac01e7..c55906eb2ff 100644 --- a/source/blender/editors/space_api/spacetypes.cc +++ b/source/blender/editors/space_api/spacetypes.cc @@ -162,6 +162,7 @@ void ED_spacemacros_init() ED_operatormacros_action(); ED_operatormacros_clip(); ED_operatormacros_curve(); + ED_operatormacros_curves(); ED_operatormacros_mask(); ED_operatormacros_sequencer(); ED_operatormacros_paint(); diff --git a/source/blender/editors/space_clip/space_clip.cc b/source/blender/editors/space_clip/space_clip.cc index fff564cc7ac..1fc04ba3ba7 100644 --- a/source/blender/editors/space_clip/space_clip.cc +++ b/source/blender/editors/space_clip/space_clip.cc @@ -536,7 +536,7 @@ static void clip_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) PointerRNA itemptr; char dir[FILE_MAX], file[FILE_MAX]; - BLI_path_split_dir_file(WM_drag_get_path(drag), dir, sizeof(dir), file, sizeof(file)); + BLI_path_split_dir_file(WM_drag_get_single_path(drag), dir, sizeof(dir), file, sizeof(file)); RNA_string_set(drop->ptr, "directory", dir); diff --git a/source/blender/editors/space_console/space_console.cc b/source/blender/editors/space_console/space_console.cc index aeee63af694..9bce3be7877 100644 --- a/source/blender/editors/space_console/space_console.cc +++ b/source/blender/editors/space_console/space_console.cc @@ -174,7 +174,7 @@ static bool path_drop_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * /*eve static void path_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) { char pathname[FILE_MAX + 2]; - SNPRINTF(pathname, "\"%s\"", WM_drag_get_path(drag)); + SNPRINTF(pathname, "\"%s\"", WM_drag_get_single_path(drag)); RNA_string_set(drop->ptr, "text", pathname); } diff --git a/source/blender/editors/space_file/file_draw.cc b/source/blender/editors/space_file/file_draw.cc index ec78de51171..4265a86b3d3 100644 --- a/source/blender/editors/space_file/file_draw.cc +++ b/source/blender/editors/space_file/file_draw.cc @@ -25,7 +25,7 @@ #include "BIF_glutil.hh" -#include "BKE_blendfile.h" +#include "BKE_blendfile.hh" #include "BKE_context.hh" #include "BKE_report.h" diff --git a/source/blender/editors/space_file/file_ops.cc b/source/blender/editors/space_file/file_ops.cc index 2fb5e1beb94..771b44b9e22 100644 --- a/source/blender/editors/space_file/file_ops.cc +++ b/source/blender/editors/space_file/file_ops.cc @@ -12,7 +12,7 @@ #include "BLI_linklist.h" #include "BKE_appdir.h" -#include "BKE_blendfile.h" +#include "BKE_blendfile.hh" #include "BKE_context.hh" #include "BKE_global.h" #include "BKE_main.hh" diff --git a/source/blender/editors/space_file/file_utils.cc b/source/blender/editors/space_file/file_utils.cc index 80a8a321056..7b5cab46a85 100644 --- a/source/blender/editors/space_file/file_utils.cc +++ b/source/blender/editors/space_file/file_utils.cc @@ -11,7 +11,7 @@ #include "BLI_rect.h" #include "BLI_string.h" -#include "BKE_blendfile.h" +#include "BKE_blendfile.hh" #include "BKE_context.hh" #include "ED_fileselect.hh" diff --git a/source/blender/editors/space_file/filelist.cc b/source/blender/editors/space_file/filelist.cc index 020aa5690d1..d03896f3732 100644 --- a/source/blender/editors/space_file/filelist.cc +++ b/source/blender/editors/space_file/filelist.cc @@ -49,7 +49,7 @@ #endif #include "BKE_asset.hh" -#include "BKE_blendfile.h" +#include "BKE_blendfile.hh" #include "BKE_context.hh" #include "BKE_global.h" #include "BKE_icons.h" diff --git a/source/blender/editors/space_file/space_file.cc b/source/blender/editors/space_file/space_file.cc index fed15290320..424e9e43850 100644 --- a/source/blender/editors/space_file/space_file.cc +++ b/source/blender/editors/space_file/space_file.cc @@ -797,7 +797,7 @@ static bool filepath_drop_poll(bContext *C, wmDrag *drag, const wmEvent * /*even static void filepath_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) { - RNA_string_set(drop->ptr, "filepath", WM_drag_get_path(drag)); + RNA_string_set(drop->ptr, "filepath", WM_drag_get_single_path(drag)); } /* region dropbox definition */ diff --git a/source/blender/editors/space_image/space_image.cc b/source/blender/editors/space_image/space_image.cc index 64cc8b79774..ecca3d2dab2 100644 --- a/source/blender/editors/space_image/space_image.cc +++ b/source/blender/editors/space_image/space_image.cc @@ -268,7 +268,7 @@ static bool image_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event) static void image_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) { /* copy drag path to properties */ - RNA_string_set(drop->ptr, "filepath", WM_drag_get_path(drag)); + RNA_string_set(drop->ptr, "filepath", WM_drag_get_single_path(drag)); } /* area+region dropbox definition */ diff --git a/source/blender/editors/space_node/drawnode.cc b/source/blender/editors/space_node/drawnode.cc index 8e3733a9746..a218cb0cfa2 100644 --- a/source/blender/editors/space_node/drawnode.cc +++ b/source/blender/editors/space_node/drawnode.cc @@ -762,7 +762,7 @@ static void node_composit_buts_cryptomatte(uiLayout *layout, bContext *C, Pointe uiItemR(row, ptr, "source", DEFAULT_FLAGS | UI_ITEM_R_EXPAND, nullptr, ICON_NONE); uiLayout *col = uiLayoutColumn(layout, false); - if (node->custom1 == CMP_CRYPTOMATTE_SRC_RENDER) { + if (node->custom1 == CMP_NODE_CRYPTOMATTE_SOURCE_RENDER) { uiTemplateID(col, C, ptr, diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc index 5d5beb28d29..0080f7b73a2 100644 --- a/source/blender/editors/space_node/node_draw.cc +++ b/source/blender/editors/space_node/node_draw.cc @@ -2769,7 +2769,7 @@ static void node_draw_extra_info_panel(const bContext &C, preview = nullptr; } Vector extra_info_rows = node_get_extra_info(C, tree_draw_ctx, snode, node); - if (extra_info_rows.size() == 0 && !preview) { + if (extra_info_rows.is_empty() && !preview) { return; } diff --git a/source/blender/editors/space_node/node_edit.cc b/source/blender/editors/space_node/node_edit.cc index cecb378d2b1..443acb57189 100644 --- a/source/blender/editors/space_node/node_edit.cc +++ b/source/blender/editors/space_node/node_edit.cc @@ -296,14 +296,15 @@ static void compo_startjob(void *cjv, wmJobWorkerStatus *worker_status) BKE_callback_exec_id(cj->bmain, &scene->id, BKE_CB_EVT_COMPOSITE_PRE); if ((cj->scene->r.scemode & R_MULTIVIEW) == 0) { - ntreeCompositExecTree(cj->re, cj->scene, ntree, &cj->scene->r, false, true, ""); + ntreeCompositExecTree(cj->re, cj->scene, ntree, &cj->scene->r, false, true, "", nullptr); } else { LISTBASE_FOREACH (SceneRenderView *, srv, &scene->r.views) { if (BKE_scene_multiview_is_render_view_active(&scene->r, srv) == false) { continue; } - ntreeCompositExecTree(cj->re, cj->scene, ntree, &cj->scene->r, false, true, srv->name); + ntreeCompositExecTree( + cj->re, cj->scene, ntree, &cj->scene->r, false, true, srv->name, nullptr); } } @@ -1506,8 +1507,8 @@ static int node_read_viewlayers_exec(bContext *C, wmOperator * /*op*/) } for (bNode *node : edit_tree.all_nodes()) { - if ((node->type == CMP_NODE_R_LAYERS) || - (node->type == CMP_NODE_CRYPTOMATTE && node->custom1 == CMP_CRYPTOMATTE_SRC_RENDER)) + if ((node->type == CMP_NODE_R_LAYERS) || (node->type == CMP_NODE_CRYPTOMATTE && + node->custom1 == CMP_NODE_CRYPTOMATTE_SOURCE_RENDER)) { ID *id = node->id; if (id == nullptr) { diff --git a/source/blender/editors/space_node/node_shader_preview.cc b/source/blender/editors/space_node/node_shader_preview.cc index 25c1a5b5dd9..529ee1e5914 100644 --- a/source/blender/editors/space_node/node_shader_preview.cc +++ b/source/blender/editors/space_node/node_shader_preview.cc @@ -452,7 +452,7 @@ static void connect_node_to_surface_output(const Span treepath, static void connect_nodes_to_aovs(const Span treepath, const Span &nodesocket_span) { - if (nodesocket_span.size() == 0) { + if (nodesocket_span.is_empty()) { return; } bNodeTree *main_nt = treepath.first()->nodetree; diff --git a/source/blender/editors/space_node/space_node.cc b/source/blender/editors/space_node/space_node.cc index c1321dd723a..db74db961f4 100644 --- a/source/blender/editors/space_node/space_node.cc +++ b/source/blender/editors/space_node/space_node.cc @@ -897,7 +897,7 @@ static void node_id_path_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop) return; } - const char *path = WM_drag_get_path(drag); + const char *path = WM_drag_get_single_path(drag); if (path) { RNA_string_set(drop->ptr, "filepath", path); RNA_struct_property_unset(drop->ptr, "name"); diff --git a/source/blender/editors/space_outliner/outliner_select.cc b/source/blender/editors/space_outliner/outliner_select.cc index 7ae6b1318a1..9eda64c7c1e 100644 --- a/source/blender/editors/space_outliner/outliner_select.cc +++ b/source/blender/editors/space_outliner/outliner_select.cc @@ -328,7 +328,7 @@ static void tree_element_object_activate(bContext *C, } /* find associated base in current scene */ - BKE_view_layer_synced_ensure(sce, view_layer); + BKE_view_layer_synced_ensure(scene, view_layer); base = BKE_view_layer_base_find(view_layer, ob); if (scene->toolsettings->object_flag & SCE_OBJECT_MODE_LOCK) { diff --git a/source/blender/editors/space_sequencer/CMakeLists.txt b/source/blender/editors/space_sequencer/CMakeLists.txt index e5602bb28b9..f6656599d85 100644 --- a/source/blender/editors/space_sequencer/CMakeLists.txt +++ b/source/blender/editors/space_sequencer/CMakeLists.txt @@ -57,6 +57,7 @@ set(LIB bf_editor_util PRIVATE bf::intern::atomic PRIVATE bf::intern::guardedalloc + PRIVATE bf::animrig ) if(WITH_AUDASPACE) diff --git a/source/blender/editors/space_sequencer/sequencer_clipboard.cc b/source/blender/editors/space_sequencer/sequencer_clipboard.cc index 46e7a53439c..ab6381162cb 100644 --- a/source/blender/editors/space_sequencer/sequencer_clipboard.cc +++ b/source/blender/editors/space_sequencer/sequencer_clipboard.cc @@ -29,7 +29,7 @@ #include "BKE_appdir.h" #include "BKE_blender_copybuffer.h" -#include "BKE_blendfile.h" +#include "BKE_blendfile.hh" #include "BKE_context.hh" #include "BKE_fcurve.h" #include "BKE_lib_id.h" @@ -51,6 +51,8 @@ #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" +#include "ANIM_animdata.hh" + #include "WM_api.hh" #include "WM_types.hh" @@ -175,7 +177,7 @@ static bool sequencer_write_copy_paste_file(Main *bmain_src, if (!BLI_listbase_is_empty(&fcurves_dst) || !BLI_listbase_is_empty(&drivers_dst)) { BLI_assert(scene_dst->adt == nullptr); - bAction *act_dst = ED_id_action_ensure(bmain_src, &scene_dst->id); + bAction *act_dst = blender::animrig::id_action_ensure(bmain_src, &scene_dst->id); BLI_movelisttolist(&act_dst->curves, &fcurves_dst); BLI_movelisttolist(&scene_dst->adt->drivers, &drivers_dst); } @@ -229,7 +231,8 @@ int sequencer_clipboard_copy_exec(bContext *C, wmOperator *op) } /* We are all done! */ - BKE_report(op->reports, RPT_INFO, "Copied the selected VSE strips to internal clipboard"); + BKE_report( + op->reports, RPT_INFO, "Copied the selected Video Sequencer strips to internal clipboard"); return OPERATOR_FINISHED; } @@ -250,7 +253,7 @@ static bool sequencer_paste_animation(Main *bmain_dst, Scene *scene_dst, Scene * } else { /* get action to add F-Curve+keyframe to */ - act_dst = ED_id_action_ensure(bmain_dst, &scene_dst->id); + act_dst = blender::animrig::id_action_ensure(bmain_dst, &scene_dst->id); } LISTBASE_FOREACH (FCurve *, fcu, &scene_src->adt->action->curves) { @@ -290,7 +293,7 @@ int sequencer_clipboard_paste_exec(bContext *C, wmOperator *op) } if (!scene_src || !scene_src->ed) { - BKE_report(op->reports, RPT_ERROR, "No clipboard scene to paste VSE data from"); + BKE_report(op->reports, RPT_ERROR, "No clipboard scene to paste Video Sequencer data from"); BKE_main_free(bmain_src); return OPERATOR_CANCELLED; } diff --git a/source/blender/editors/space_sequencer/sequencer_drag_drop.cc b/source/blender/editors/space_sequencer/sequencer_drag_drop.cc index 38b23e7748c..8718d241688 100644 --- a/source/blender/editors/space_sequencer/sequencer_drag_drop.cc +++ b/source/blender/editors/space_sequencer/sequencer_drag_drop.cc @@ -249,7 +249,7 @@ static void sequencer_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop) return; } - const char *path = WM_drag_get_path(drag); + const char *path = WM_drag_get_single_path(drag); /* Path dropped. */ if (path) { if (RNA_struct_find_property(drop->ptr, "filepath")) { @@ -335,7 +335,7 @@ static void get_drag_path(const bContext *C, wmDrag *drag, char r_path[FILE_MAX] BLI_path_abs(r_path, BKE_main_blendfile_path_from_global()); } else { - BLI_strncpy(r_path, WM_drag_get_path(drag), FILE_MAX); + BLI_strncpy(r_path, WM_drag_get_single_path(drag), FILE_MAX); } } diff --git a/source/blender/editors/space_sequencer/sequencer_intern.hh b/source/blender/editors/space_sequencer/sequencer_intern.hh index 727dacaa4f0..cbbb220adcd 100644 --- a/source/blender/editors/space_sequencer/sequencer_intern.hh +++ b/source/blender/editors/space_sequencer/sequencer_intern.hh @@ -313,6 +313,8 @@ void SEQUENCER_OT_retiming_freeze_frame_add(wmOperatorType *ot); void SEQUENCER_OT_retiming_transition_add(wmOperatorType *ot); void SEQUENCER_OT_retiming_segment_speed_set(wmOperatorType *ot); int sequencer_retiming_key_select_exec(bContext *C, wmOperator *op); +/* Select a key and all following keys. */ +int sequencer_retiming_select_linked_time(bContext *C, wmOperator *op); int sequencer_select_exec(bContext *C, wmOperator *op); int sequencer_retiming_key_remove_exec(bContext *C, wmOperator *op); int sequencer_retiming_select_all_exec(bContext *C, wmOperator *op); diff --git a/source/blender/editors/space_sequencer/sequencer_retiming.cc b/source/blender/editors/space_sequencer/sequencer_retiming.cc index aed12d3d8f4..461f3ee74c3 100644 --- a/source/blender/editors/space_sequencer/sequencer_retiming.cc +++ b/source/blender/editors/space_sequencer/sequencer_retiming.cc @@ -242,7 +242,7 @@ static int retiming_key_add_to_editable_strips(bContext *C, bool inserted = false; blender::Map selection = SEQ_retiming_selection_get(ed); - if (selection.size() == 0) { + if (selection.is_empty()) { return OPERATOR_CANCELLED; } @@ -553,7 +553,7 @@ static int strip_speed_set_exec(bContext *C, const wmOperator *op) continue; } /* TODO: it would be nice to multiply speed with complex retiming by a factor. */ - SEQ_retiming_key_speed_set(scene, seq, key, RNA_float_get(op->ptr, "speed")); + SEQ_retiming_key_speed_set(scene, seq, key, RNA_float_get(op->ptr, "speed"), false); SEQ_relations_invalidate_cache_raw(scene, seq); } @@ -566,9 +566,19 @@ static int segment_speed_set_exec(const bContext *C, blender::Map selection) { Scene *scene = CTX_data_scene(C); + ListBase *seqbase = SEQ_active_seqbase_get(SEQ_editing_get(scene)); for (auto item : selection.items()) { - SEQ_retiming_key_speed_set(scene, item.value, item.key, RNA_float_get(op->ptr, "speed")); + SEQ_retiming_key_speed_set(scene, + item.value, + item.key, + RNA_float_get(op->ptr, "speed"), + RNA_boolean_get(op->ptr, "keep_retiming")); + + if (SEQ_transform_test_overlap(scene, seqbase, item.value)) { + SEQ_transform_seqbase_shuffle(seqbase, item.value, scene); + } + SEQ_relations_invalidate_cache_raw(scene, item.value); } @@ -631,6 +641,12 @@ void SEQUENCER_OT_retiming_segment_speed_set(wmOperatorType *ot) "New speed of retimed segment", 0.1f, FLT_MAX); + + RNA_def_boolean(ot->srna, + "keep_retiming", + true, + "Preserve Current retiming", + "Keep speed of other segments unchanged, change strip length instead"); } /** \} */ @@ -660,8 +676,34 @@ static bool select_key(const Editing *ed, return true; } +int sequencer_retiming_select_linked_time(bContext *C, wmOperator *op) +{ + Scene *scene = CTX_data_scene(C); + Editing *ed = SEQ_editing_get(scene); + const int mval[2] = {RNA_int_get(op->ptr, "mouse_x"), RNA_int_get(op->ptr, "mouse_y")}; + + Sequence *seq_key_owner = nullptr; + SeqRetimingKey *key = retiming_mousover_key_get(C, mval, &seq_key_owner); + + if (key == nullptr) { + return OPERATOR_CANCELLED; + } + if (!RNA_boolean_get(op->ptr, "extend")) { + SEQ_retiming_selection_clear(ed); + } + for (; key <= SEQ_retiming_last_key_get(seq_key_owner); key++) { + select_key(ed, key, false, false); + } + WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene); + return OPERATOR_FINISHED; +} + int sequencer_retiming_key_select_exec(bContext *C, wmOperator *op) { + if (RNA_boolean_get(op->ptr, "linked_time")) { + return sequencer_retiming_select_linked_time(C, op); + } + Scene *scene = CTX_data_scene(C); Editing *ed = SEQ_editing_get(scene); const int mval[2] = {RNA_int_get(op->ptr, "mouse_x"), RNA_int_get(op->ptr, "mouse_y")}; diff --git a/source/blender/editors/space_sequencer/sequencer_retiming_draw.cc b/source/blender/editors/space_sequencer/sequencer_retiming_draw.cc index b02baf29bc1..5ab1d1eb5bc 100644 --- a/source/blender/editors/space_sequencer/sequencer_retiming_draw.cc +++ b/source/blender/editors/space_sequencer/sequencer_retiming_draw.cc @@ -170,7 +170,7 @@ int left_fake_key_frame_get(const bContext *C, const Sequence *seq) int right_fake_key_frame_get(const bContext *C, const Sequence *seq) { const Scene *scene = CTX_data_scene(C); - const int content_end = SEQ_time_content_end_frame_get(scene, seq); + const int content_end = SEQ_time_content_end_frame_get(scene, seq) - 1; return min_ii(content_end, SEQ_time_right_handle_frame_get(scene, seq)); } @@ -201,7 +201,14 @@ SeqRetimingKey *try_to_realize_virtual_key(const bContext *C, Sequence *seq, con int frame = SEQ_time_left_handle_frame_get(scene, seq); key = SEQ_retiming_add_key(scene, seq, frame); } - if (retiming_fake_key_is_clicked(C, seq, right_fake_key_frame_get(C, seq), mval)) { + + int right_key_frame = right_fake_key_frame_get(C, seq); + /* `key_x_get()` compensates 1 frame offset of last key, however this can not + * be conveyed via `fake_key` alone. Therefore the same offset must be emulated. */ + if (SEQ_time_right_handle_frame_get(scene, seq) >= SEQ_time_content_end_frame_get(scene, seq)) { + right_key_frame += 1; + } + if (retiming_fake_key_is_clicked(C, seq, right_key_frame, mval)) { SEQ_retiming_data_ensure(seq); const int frame = SEQ_time_right_handle_frame_get(scene, seq); key = SEQ_retiming_add_key(scene, seq, frame); @@ -376,19 +383,29 @@ static bool fake_keys_draw(const bContext *C, const Scene *scene = CTX_data_scene(C); const int left_key_frame = left_fake_key_frame_get(C, seq); - const int right_key_frame = right_fake_key_frame_get(C, seq); + int right_key_frame = right_fake_key_frame_get(C, seq); if (SEQ_retiming_key_get_by_timeline_frame(scene, seq, left_key_frame) == nullptr) { SeqRetimingKey fake_key; - fake_key.strip_frame_index = left_key_frame - SEQ_time_start_frame_get(seq); + fake_key.strip_frame_index = (left_key_frame - SEQ_time_start_frame_get(seq)) * + SEQ_time_media_playback_rate_factor_get(scene, seq); fake_key.flag = 0; retime_key_draw(C, seq, &fake_key, sh_bindings, selection); } if (SEQ_retiming_key_get_by_timeline_frame(scene, seq, right_key_frame) == nullptr) { + /* `key_x_get()` compensates 1 frame offset of last key, however this can not + * be conveyed via `fake_key` alone. Therefore the same offset must be emulated. */ + if (SEQ_time_right_handle_frame_get(scene, seq) >= SEQ_time_content_end_frame_get(scene, seq)) + { + right_key_frame += 1; + } + SeqRetimingKey fake_key; - fake_key.strip_frame_index = right_key_frame - SEQ_time_start_frame_get(seq); - fake_key.flag = 0; + fake_key.strip_frame_index = (right_key_frame - SEQ_time_start_frame_get(seq)) * + SEQ_time_media_playback_rate_factor_get(scene, seq); + + fake_key.flag = SEQ_SPEED_TRANSITION_IN; retime_key_draw(C, seq, &fake_key, sh_bindings, selection); } return true; diff --git a/source/blender/editors/space_sequencer/sequencer_select.cc b/source/blender/editors/space_sequencer/sequencer_select.cc index 7636cdf232d..d479cff94b0 100644 --- a/source/blender/editors/space_sequencer/sequencer_select.cc +++ b/source/blender/editors/space_sequencer/sequencer_select.cc @@ -885,6 +885,12 @@ static void sequencer_select_strip_impl(const Editing *ed, } } +static bool use_retiming_mode(const bContext *C, const Sequence *seq_key_test) +{ + return seq_key_test && SEQ_retiming_data_is_editable(seq_key_test) && + !sequencer_retiming_mode_is_active(C) && retiming_keys_are_visible(C); +} + int sequencer_select_exec(bContext *C, wmOperator *op) { View2D *v2d = UI_view2d_fromcontext(C); @@ -929,17 +935,25 @@ int sequencer_select_exec(bContext *C, wmOperator *op) seq = find_nearest_seq(scene, v2d, mval, &handle_clicked); } + Sequence *seq_key_test = nullptr; + SeqRetimingKey *key = retiming_mousover_key_get(C, mval, &seq_key_test); + /* NOTE: `side_of_frame` and `linked_time` functionality is designed to be shared on one keymap, * therefore both properties can be true at the same time. */ if (seq && RNA_boolean_get(op->ptr, "linked_time")) { - if (!extend && !toggle) { - ED_sequencer_deselect_all(scene); + if (use_retiming_mode(C, seq_key_test)) { + return sequencer_retiming_select_linked_time(C, op); + } + else { + if (!extend && !toggle) { + ED_sequencer_deselect_all(scene); + } + sequencer_select_strip_impl(ed, seq, handle_clicked, extend, deselect, toggle); + select_linked_time(scene, ed->seqbasep, seq); + sequencer_select_do_updates(C, scene); + sequencer_select_set_active(scene, seq); + return OPERATOR_FINISHED; } - sequencer_select_strip_impl(ed, seq, handle_clicked, extend, deselect, toggle); - select_linked_time(scene, ed->seqbasep, seq); - sequencer_select_do_updates(C, scene); - sequencer_select_set_active(scene, seq); - return OPERATOR_FINISHED; } /* Select left, right or overlapping the current frame. */ @@ -971,12 +985,7 @@ int sequencer_select_exec(bContext *C, wmOperator *op) return OPERATOR_RUNNING_MODAL; } - Sequence *seq_key_test = nullptr; - SeqRetimingKey *key = retiming_mousover_key_get(C, mval, &seq_key_test); - - if (seq_key_test && SEQ_retiming_data_is_editable(seq_key_test) && - !sequencer_retiming_mode_is_active(C) && retiming_keys_are_visible(C)) - { + if (use_retiming_mode(C, seq_key_test)) { /* Realize "fake" key, if it is clicked on. */ if (key == nullptr && seq_key_test != nullptr) { diff --git a/source/blender/editors/space_text/space_text.cc b/source/blender/editors/space_text/space_text.cc index 938ac4bd5d2..45fde446df3 100644 --- a/source/blender/editors/space_text/space_text.cc +++ b/source/blender/editors/space_text/space_text.cc @@ -316,7 +316,7 @@ static bool text_drop_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * /*eve static void text_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) { /* copy drag path to properties */ - RNA_string_set(drop->ptr, "filepath", WM_drag_get_path(drag)); + RNA_string_set(drop->ptr, "filepath", WM_drag_get_single_path(drag)); } static bool text_drop_paste_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * /*event*/) diff --git a/source/blender/editors/space_text/text_format.cc b/source/blender/editors/space_text/text_format.cc index a3e3bafcd0b..e55bd125913 100644 --- a/source/blender/editors/space_text/text_format.cc +++ b/source/blender/editors/space_text/text_format.cc @@ -257,8 +257,7 @@ int text_format_string_literal_find(const Span string_literals, co } #ifndef NDEBUG -const bool text_format_string_literals_check_sorted_array( - const Span &string_literals) +const bool text_format_string_literals_check_sorted_array(const Span string_literals) { return std::is_sorted(string_literals.begin(), string_literals.end(), diff --git a/source/blender/editors/space_text/text_format.hh b/source/blender/editors/space_text/text_format.hh index 9dd2357c585..1294f32c822 100644 --- a/source/blender/editors/space_text/text_format.hh +++ b/source/blender/editors/space_text/text_format.hh @@ -126,14 +126,13 @@ void ED_text_format_register_pov_ini(); * If a string literal is found, the length of the string literal is returned. * Otherwise, 0. */ -int text_format_string_literal_find(const Span string_literals, const char *text); +int text_format_string_literal_find(Span string_literals, const char *text); #ifndef NDEBUG /** * Check if #string_literals array is shorted. This validation is required since text formatters do * binary search on these string literals arrays. Used only for assertions. */ -const bool text_format_string_literals_check_sorted_array( - const Span &string_literals); +const bool text_format_string_literals_check_sorted_array(Span string_literals); #endif diff --git a/source/blender/editors/space_topbar/space_topbar.cc b/source/blender/editors/space_topbar/space_topbar.cc index cc536af4128..59af59d5059 100644 --- a/source/blender/editors/space_topbar/space_topbar.cc +++ b/source/blender/editors/space_topbar/space_topbar.cc @@ -16,7 +16,7 @@ #include "BLT_translation.h" -#include "BKE_blendfile.h" +#include "BKE_blendfile.hh" #include "BKE_context.hh" #include "BKE_global.h" #include "BKE_screen.hh" diff --git a/source/blender/editors/space_view3d/space_view3d.cc b/source/blender/editors/space_view3d/space_view3d.cc index 4cba9425ce4..dc7bd693d00 100644 --- a/source/blender/editors/space_view3d/space_view3d.cc +++ b/source/blender/editors/space_view3d/space_view3d.cc @@ -893,7 +893,7 @@ static void view3d_id_path_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop) RNA_struct_property_unset(drop->ptr, "filepath"); return; } - const char *path = WM_drag_get_path(drag); + const char *path = WM_drag_get_single_path(drag); if (path) { RNA_string_set(drop->ptr, "filepath", path); RNA_struct_property_unset(drop->ptr, "image"); diff --git a/source/blender/editors/space_view3d/view3d_buttons.cc b/source/blender/editors/space_view3d/view3d_buttons.cc index 8b9e5fc95b4..6c816e6bd91 100644 --- a/source/blender/editors/space_view3d/view3d_buttons.cc +++ b/source/blender/editors/space_view3d/view3d_buttons.cc @@ -186,7 +186,7 @@ static void editmesh_partial_update_update_fn(bContext *C, BMEditMesh *em = static_cast(arg1); - BKE_editmesh_looptri_and_normals_calc_with_partial(em, bmpinfo); + BKE_editmesh_looptris_and_normals_calc_with_partial(em, bmpinfo); } /** \} */ diff --git a/source/blender/editors/space_view3d/view3d_iterators.cc b/source/blender/editors/space_view3d/view3d_iterators.cc index 80fa5b709c6..3deefe1bbcd 100644 --- a/source/blender/editors/space_view3d/view3d_iterators.cc +++ b/source/blender/editors/space_view3d/view3d_iterators.cc @@ -22,6 +22,7 @@ #include "BKE_DerivedMesh.hh" #include "BKE_action.h" #include "BKE_armature.hh" +#include "BKE_attribute.hh" #include "BKE_curve.hh" #include "BKE_displist.h" #include "BKE_editmesh.hh" @@ -213,7 +214,7 @@ struct foreachScreenObjectVert_userData { void (*func)(void *user_data, const float screen_co[2], int index); void *user_data; ViewContext vc; - const bool *hide_vert; + blender::VArraySpan hide_vert; eV3DProjTest clip_flag; }; @@ -272,7 +273,7 @@ static void meshobject_foreachScreenVert__mapFunc(void *user_data, { foreachScreenObjectVert_userData *data = static_cast( user_data); - if (data->hide_vert && data->hide_vert[index]) { + if (!data->hide_vert.is_empty() && data->hide_vert[index]) { return; } @@ -299,6 +300,7 @@ void meshobject_foreachScreenVert(ViewContext *vc, const Object *ob_eval = DEG_get_evaluated_object(vc->depsgraph, vc->obact); const Mesh *mesh = BKE_object_get_evaluated_mesh(ob_eval); + const blender::bke::AttributeAccessor attributes = mesh->attributes(); ED_view3d_check_mats_rv3d(vc->rv3d); @@ -306,8 +308,7 @@ void meshobject_foreachScreenVert(ViewContext *vc, data.func = func; data.user_data = user_data; data.clip_flag = clip_flag; - data.hide_vert = (const bool *)CustomData_get_layer_named( - &mesh->vert_data, CD_PROP_BOOL, ".hide_vert"); + data.hide_vert = *attributes.lookup(".hide_vert", ATTR_DOMAIN_POINT); if (clip_flag & V3D_PROJ_TEST_CLIP_BB) { ED_view3d_clipping_local(vc->rv3d, vc->obact->object_to_world); diff --git a/source/blender/editors/space_view3d/view3d_navigate_fly.cc b/source/blender/editors/space_view3d/view3d_navigate_fly.cc index 7449ca85b2a..7fa1123203e 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_fly.cc +++ b/source/blender/editors/space_view3d/view3d_navigate_fly.cc @@ -539,7 +539,7 @@ static void flyEvent(FlyInfo *fly, const wmEvent *event) fly->state = FLY_CONFIRM; break; } - /* Speed adjusting with mouse-pan (track-pad). */ + /* Speed adjusting with mouse-pan (trackpad). */ case FLY_MODAL_SPEED: { float fac = 0.02f * float(event->prev_xy[1] - event->xy[1]); diff --git a/source/blender/editors/space_view3d/view3d_navigate_walk.cc b/source/blender/editors/space_view3d/view3d_navigate_walk.cc index 2d710ef07a8..da9b9e4eef8 100644 --- a/source/blender/editors/space_view3d/view3d_navigate_walk.cc +++ b/source/blender/editors/space_view3d/view3d_navigate_walk.cc @@ -159,9 +159,9 @@ void walk_modal_keymap(wmKeyConfig *keyconf) {WALK_MODAL_DIR_FORWARD_STOP, "FORWARD_STOP", 0, "Stop Move Forward", ""}, {WALK_MODAL_DIR_BACKWARD_STOP, "BACKWARD_STOP", 0, "Stop Move Backward", ""}, {WALK_MODAL_DIR_LEFT_STOP, "LEFT_STOP", 0, "Stop Move Left", ""}, - {WALK_MODAL_DIR_RIGHT_STOP, "RIGHT_STOP", 0, "Stop Mode Right", ""}, + {WALK_MODAL_DIR_RIGHT_STOP, "RIGHT_STOP", 0, "Stop Move Right", ""}, {WALK_MODAL_DIR_UP_STOP, "UP_STOP", 0, "Stop Move Global Up", ""}, - {WALK_MODAL_DIR_DOWN_STOP, "DOWN_STOP", 0, "Stop Mode Global Down", ""}, + {WALK_MODAL_DIR_DOWN_STOP, "DOWN_STOP", 0, "Stop Move Global Down", ""}, {WALK_MODAL_DIR_LOCAL_UP_STOP, "LOCAL_UP_STOP", 0, "Stop Move Local Up", ""}, {WALK_MODAL_DIR_LOCAL_DOWN_STOP, "LOCAL_DOWN_STOP", 0, "Stop Move Local Down", ""}, diff --git a/source/blender/editors/space_view3d/view3d_utils.cc b/source/blender/editors/space_view3d/view3d_utils.cc index 57e8283990e..8ce1e82643c 100644 --- a/source/blender/editors/space_view3d/view3d_utils.cc +++ b/source/blender/editors/space_view3d/view3d_utils.cc @@ -703,7 +703,7 @@ bool ED_view3d_camera_lock_undo_test(const View3D *v3d, const RegionView3D *rv3d /** * Create a MEMFILE undo-step for locked camera movement when transforming the view. * Edit and texture paint mode don't use MEMFILE undo so undo push is skipped for them. - * NDOF and track-pad navigation would create an undo step on every gesture and we may end up with + * NDOF and trackpad navigation would create an undo step on every gesture and we may end up with * unnecessary undo steps so undo push for them is not supported for now. * Operators that use smooth view for navigation are supported via an optional parameter field, * see: #V3D_SmoothParams.undo_str. @@ -1010,8 +1010,8 @@ void ED_view3d_quadview_update(ScrArea *area, ARegion *region, bool do_clip) /* -------------------------------------------------------------------- */ /** \name View Auto-Depth Last State Access * - * Calling consecutive track-pad gestures reuses the previous offset to prevent - * each track-pad event using a different offset, see: #103263. + * Calling consecutive trackpad gestures reuses the previous offset to prevent + * each trackpad event using a different offset, see: #103263. * \{ */ static const char *view3d_autodepth_last_id = "view3d_autodist_last"; diff --git a/source/blender/editors/transform/transform.hh b/source/blender/editors/transform/transform.hh index ee53642987a..0ae341c97ac 100644 --- a/source/blender/editors/transform/transform.hh +++ b/source/blender/editors/transform/transform.hh @@ -273,7 +273,7 @@ enum { TFM_MODAL_NODE_ATTACH_ON = 24, TFM_MODAL_NODE_ATTACH_OFF = 25, - /** For analog input, like track-pad. */ + /** For analog input, like trackpad. */ TFM_MODAL_PROPSIZE = 26, /** Node editor insert offset (also called auto-offset) direction toggle. */ TFM_MODAL_INSERTOFS_TOGGLE_DIR = 27, diff --git a/source/blender/editors/transform/transform_convert_armature.cc b/source/blender/editors/transform/transform_convert_armature.cc index efa59a6e0e0..04571cd168b 100644 --- a/source/blender/editors/transform/transform_convert_armature.cc +++ b/source/blender/editors/transform/transform_convert_armature.cc @@ -1326,7 +1326,7 @@ static void recalcData_pose(TransInfo *t) int targetless_ik = (t->flag & T_AUTOIK); animrecord_check_state(t, &ob->id); - blender::animrig::autokeyframe_pose(t->context, t->scene, ob, t->mode, targetless_ik); + blender::animrig::autokeyframe_pose(t->context, t->scene, ob, targetless_ik); } if (motionpath_need_update_pose(t->scene, ob)) { @@ -1589,7 +1589,7 @@ static void special_aftertrans_update__pose(bContext *C, TransInfo *t) /* automatic inserting of keys and unkeyed tagging - * only if transform wasn't canceled (or TFM_DUMMY) */ if (!canceled && (t->mode != TFM_DUMMY)) { - blender::animrig::autokeyframe_pose(C, t->scene, ob, t->mode, targetless_ik); + blender::animrig::autokeyframe_pose(C, t->scene, ob, targetless_ik); DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); } else { diff --git a/source/blender/editors/transform/transform_convert_mesh.cc b/source/blender/editors/transform/transform_convert_mesh.cc index 0a88081787a..2eb2b389645 100644 --- a/source/blender/editors/transform/transform_convert_mesh.cc +++ b/source/blender/editors/transform/transform_convert_mesh.cc @@ -85,7 +85,7 @@ enum ePartialType { * use for comparison with previous updates. */ struct PartialTypeState { - ePartialType for_looptri; + ePartialType for_looptris; ePartialType for_normals; }; @@ -104,7 +104,7 @@ static TransCustomDataMesh *mesh_customdata_ensure(TransDataContainer *tc) tc->custom.type.data = MEM_callocN(sizeof(TransCustomDataMesh), __func__); tc->custom.type.free_cb = mesh_customdata_free_fn; tcmd = static_cast(tc->custom.type.data); - tcmd->partial_update_state_prev.for_looptri = PARTIAL_NONE; + tcmd->partial_update_state_prev.for_looptris = PARTIAL_NONE; tcmd->partial_update_state_prev.for_normals = PARTIAL_NONE; } return tcmd; @@ -217,10 +217,10 @@ static void mesh_customdatacorrect_face_substitute_set(TransCustomDataLayer *tcl BLI_assert(is_zero_v3(f->no)); BMesh *bm = tcld->bm; - const BMCustomDataCopyMap cd_face_map = CustomData_bmesh_copy_map_calc(tcld->bm_origfaces->pdata, - bm->pdata); - const BMCustomDataCopyMap cd_loop_map = CustomData_bmesh_copy_map_calc(tcld->bm_origfaces->ldata, - bm->ldata); + const BMCustomDataCopyMap cd_face_map = CustomData_bmesh_copy_map_calc( + bm->pdata, tcld->bm_origfaces->pdata); + const BMCustomDataCopyMap cd_loop_map = CustomData_bmesh_copy_map_calc( + bm->ldata, tcld->bm_origfaces->ldata); /* It is impossible to calculate the loops weights of a face without area. * Find a substitute. */ @@ -235,7 +235,7 @@ static void mesh_customdatacorrect_face_substitute_set(TransCustomDataLayer *tcl /* Use the substitute face as the reference during the transformation. */ BMFace *f_substitute_copy = BM_face_copy( - bm, cd_face_map, cd_loop_map, f_substitute, true, true); + tcld->bm_origfaces, cd_face_map, cd_loop_map, f_substitute, true, true); /* Hack: reference substitute face in `f_copy->no`. * `tcld->origfaces` is already used to restore the initial value. */ @@ -262,10 +262,10 @@ static void mesh_customdatacorrect_init_vert(TransCustomDataLayer *tcld, int j, l_num; float *loop_weights; - const BMCustomDataCopyMap cd_face_map = CustomData_bmesh_copy_map_calc(tcld->bm_origfaces->pdata, - bm->pdata); - const BMCustomDataCopyMap cd_loop_map = CustomData_bmesh_copy_map_calc(tcld->bm_origfaces->ldata, - bm->ldata); + const BMCustomDataCopyMap cd_face_map = CustomData_bmesh_copy_map_calc( + bm->pdata, tcld->bm_origfaces->pdata); + const BMCustomDataCopyMap cd_loop_map = CustomData_bmesh_copy_map_calc( + bm->ldata, tcld->bm_origfaces->ldata); // BM_ITER_ELEM (l, &liter, sv->v, BM_LOOPS_OF_VERT) { BM_iter_init(&liter, bm, BM_LOOPS_OF_VERT, v); @@ -280,7 +280,8 @@ static void mesh_customdatacorrect_init_vert(TransCustomDataLayer *tcld, /* Generic custom-data correction. Copy face data. */ void **val_p; if (!BLI_ghash_ensure_p(tcld->origfaces, l->f, &val_p)) { - BMFace *f_copy = BM_face_copy(bm, cd_face_map, cd_loop_map, l->f, true, true); + BMFace *f_copy = BM_face_copy( + tcld->bm_origfaces, cd_face_map, cd_loop_map, l->f, true, true); *val_p = f_copy; #ifdef USE_FACE_SUBSTITUTE if (is_zero_v3(l->f->no)) { @@ -1899,13 +1900,13 @@ static void mesh_partial_types_calc(TransInfo *t, PartialTypeState *r_partial_st { /* Calculate the kind of partial updates which can be performed. */ enum ePartialType partial_for_normals = PARTIAL_NONE; - enum ePartialType partial_for_looptri = PARTIAL_NONE; + enum ePartialType partial_for_looptris = PARTIAL_NONE; /* Note that operations such as #TFM_CREASE are not handled here * (if they were, leaving as #PARTIAL_NONE would be appropriate). */ switch (t->mode) { case TFM_TRANSLATION: { - partial_for_looptri = PARTIAL_TYPE_GROUP; + partial_for_looptris = PARTIAL_TYPE_GROUP; partial_for_normals = PARTIAL_TYPE_GROUP; /* Translation can rotate when snapping to normal. */ if (transform_snap_is_active(t) && usingSnappingNormal(t) && validSnappingNormal(t)) { @@ -1914,12 +1915,12 @@ static void mesh_partial_types_calc(TransInfo *t, PartialTypeState *r_partial_st break; } case TFM_ROTATION: { - partial_for_looptri = PARTIAL_TYPE_GROUP; + partial_for_looptris = PARTIAL_TYPE_GROUP; partial_for_normals = PARTIAL_TYPE_ALL; break; } case TFM_RESIZE: { - partial_for_looptri = PARTIAL_TYPE_GROUP; + partial_for_looptris = PARTIAL_TYPE_GROUP; partial_for_normals = PARTIAL_TYPE_GROUP; /* Non-uniform scale needs to recalculate all normals * since their relative locations change. @@ -1933,7 +1934,7 @@ static void mesh_partial_types_calc(TransInfo *t, PartialTypeState *r_partial_st break; } default: { - partial_for_looptri = PARTIAL_TYPE_ALL; + partial_for_looptris = PARTIAL_TYPE_ALL; partial_for_normals = PARTIAL_TYPE_ALL; break; } @@ -1941,15 +1942,15 @@ static void mesh_partial_types_calc(TransInfo *t, PartialTypeState *r_partial_st /* With projection, transform isn't affine. */ if (transform_snap_project_individual_is_active(t)) { - if (partial_for_looptri == PARTIAL_TYPE_GROUP) { - partial_for_looptri = PARTIAL_TYPE_ALL; + if (partial_for_looptris == PARTIAL_TYPE_GROUP) { + partial_for_looptris = PARTIAL_TYPE_ALL; } if (partial_for_normals == PARTIAL_TYPE_GROUP) { partial_for_normals = PARTIAL_TYPE_ALL; } } - r_partial_state->for_looptri = partial_for_looptri; + r_partial_state->for_looptris = partial_for_looptris; r_partial_state->for_normals = partial_for_normals; } @@ -1966,12 +1967,12 @@ static void mesh_partial_update(TransInfo *t, /* Promote the partial update types based on the previous state * so the values that no longer modified are reset before being left as-is. * Needed for translation which can toggle snap-to-normal during transform. */ - const enum ePartialType partial_for_looptri = std::max(partial_state->for_looptri, - partial_state_prev->for_looptri); + const enum ePartialType partial_for_looptris = std::max(partial_state->for_looptris, + partial_state_prev->for_looptris); const enum ePartialType partial_for_normals = std::max(partial_state->for_normals, partial_state_prev->for_normals); - if ((partial_for_looptri == PARTIAL_TYPE_ALL) && (partial_for_normals == PARTIAL_TYPE_ALL) && + if ((partial_for_looptris == PARTIAL_TYPE_ALL) && (partial_for_normals == PARTIAL_TYPE_ALL) && (em->bm->totvert == em->bm->totvertsel)) { /* The additional cost of generating the partial connectivity data isn't justified @@ -1980,21 +1981,21 @@ static void mesh_partial_update(TransInfo *t, * While proportional editing can cause all geometry to need updating with a partial * selection. It's impractical to calculate this ahead of time. Further, the down side of * using partial updates when their not needed is negligible. */ - BKE_editmesh_looptri_and_normals_calc(em); + BKE_editmesh_looptris_and_normals_calc(em); } else { - if (partial_for_looptri != PARTIAL_NONE) { - BMPartialUpdate *bmpinfo = mesh_partial_ensure(t, tc, partial_for_looptri); + if (partial_for_looptris != PARTIAL_NONE) { + BMPartialUpdate *bmpinfo = mesh_partial_ensure(t, tc, partial_for_looptris); BMeshCalcTessellation_Params params{}; params.face_normals = true; - BKE_editmesh_looptri_calc_with_partial_ex(em, bmpinfo, ¶ms); + BKE_editmesh_looptris_calc_with_partial_ex(em, bmpinfo, ¶ms); } if (partial_for_normals != PARTIAL_NONE) { BMPartialUpdate *bmpinfo = mesh_partial_ensure(t, tc, partial_for_normals); /* While not a large difference, take advantage of existing normals where possible. */ - const bool face_normals = !((partial_for_looptri == PARTIAL_TYPE_ALL) || - ((partial_for_looptri == PARTIAL_TYPE_GROUP) && + const bool face_normals = !((partial_for_looptris == PARTIAL_TYPE_ALL) || + ((partial_for_looptris == PARTIAL_TYPE_GROUP) && (partial_for_normals == PARTIAL_TYPE_GROUP))); BMeshNormalsUpdate_Params params{}; params.face_normals = face_normals; diff --git a/source/blender/editors/transform/transform_convert_mesh_skin.cc b/source/blender/editors/transform/transform_convert_mesh_skin.cc index 4819dedcf0b..f13cef865d8 100644 --- a/source/blender/editors/transform/transform_convert_mesh_skin.cc +++ b/source/blender/editors/transform/transform_convert_mesh_skin.cc @@ -289,7 +289,7 @@ static void recalcData_mesh_skin(TransInfo *t) FOREACH_TRANS_DATA_CONTAINER (t, tc) { DEG_id_tag_update(static_cast(tc->obedit->data), ID_RECALC_GEOMETRY); BMEditMesh *em = BKE_editmesh_from_object(tc->obedit); - BKE_editmesh_looptri_and_normals_calc(em); + BKE_editmesh_looptris_and_normals_calc(em); } } diff --git a/source/blender/editors/transform/transform_convert_object.cc b/source/blender/editors/transform/transform_convert_object.cc index 8c7a03ef4aa..616cecf9881 100644 --- a/source/blender/editors/transform/transform_convert_object.cc +++ b/source/blender/editors/transform/transform_convert_object.cc @@ -780,7 +780,7 @@ static void recalcData_objects(TransInfo *t) * (FPoints) instead of keyframes? */ if ((t->animtimer) && blender::animrig::is_autokey_on(t->scene)) { animrecord_check_state(t, &ob->id); - blender::animrig::autokeyframe_object(t->context, t->scene, t->view_layer, ob, t->mode); + blender::animrig::autokeyframe_object(t->context, t->scene, ob); } motionpath_update |= motionpath_need_update_object(t->scene, ob); @@ -855,7 +855,7 @@ static void special_aftertrans_update__object(bContext *C, TransInfo *t) /* Set auto-key if necessary. */ if (!canceled) { - blender::animrig::autokeyframe_object(C, t->scene, t->view_layer, ob, t->mode); + blender::animrig::autokeyframe_object(C, t->scene, ob); } motionpath_update |= motionpath_need_update_object(t->scene, ob); diff --git a/source/blender/editors/transform/transform_convert_sequencer_retiming.cc b/source/blender/editors/transform/transform_convert_sequencer_retiming.cc index 6d6131ad767..93eb527b2bf 100644 --- a/source/blender/editors/transform/transform_convert_sequencer_retiming.cc +++ b/source/blender/editors/transform/transform_convert_sequencer_retiming.cc @@ -87,7 +87,7 @@ static void createTransSeqRetimingData(bContext * /*C*/, TransInfo *t) const blender::Map selection = SEQ_retiming_selection_get(SEQ_editing_get(t->scene)); - if (selection.size() == 0) { + if (selection.is_empty()) { return; } diff --git a/source/blender/editors/transform/transform_mode_translate.cc b/source/blender/editors/transform/transform_mode_translate.cc index 4132a66fd18..cf4415de85e 100644 --- a/source/blender/editors/transform/transform_mode_translate.cc +++ b/source/blender/editors/transform/transform_mode_translate.cc @@ -37,6 +37,8 @@ #include "transform_mode.hh" #include "transform_snap.hh" +using namespace blender; + /* -------------------------------------------------------------------- */ /** \name Transform (Translate) Custom Data * \{ */ @@ -71,16 +73,18 @@ struct TranslateCustomData { struct TransDataArgs_Translate { const TransInfo *t; const TransDataContainer *tc; - float pivot_local[3]; - float vec[3]; + float3 snap_source_local; + float3 snap_normal_local; + float3 vec; enum eTranslateRotateMode rotate_mode; }; static void transdata_elem_translate(const TransInfo *t, const TransDataContainer *tc, TransData *td, - const float pivot_local[3], - const float vec[3], + const float3 &snap_source_local, + const float3 &snap_normal_local, + const float3 &vec, enum eTranslateRotateMode rotate_mode) { float rotate_offset[3] = {0}; @@ -106,10 +110,10 @@ static void transdata_elem_translate(const TransInfo *t, original_normal = td->axismtx[2]; } - rotation_between_vecs_to_mat3(mat, original_normal, t->tsnap.snapNormal); + rotation_between_vecs_to_mat3(mat, original_normal, snap_normal_local); } - ElementRotation_ex(t, tc, td, mat, pivot_local); + ElementRotation_ex(t, tc, td, mat, snap_source_local); if (td->loc) { use_rotate_offset = true; @@ -165,7 +169,13 @@ static void transdata_elem_translate_fn(void *__restrict iter_data_v, if (td->flag & TD_SKIP) { return; } - transdata_elem_translate(data->t, data->tc, td, data->pivot_local, data->vec, data->rotate_mode); + transdata_elem_translate(data->t, + data->tc, + td, + data->snap_source_local, + data->snap_normal_local, + data->vec, + data->rotate_mode); } /** \} */ @@ -494,12 +504,17 @@ static void applyTranslationValue(TransInfo *t, const float vec[3]) } FOREACH_TRANS_DATA_CONTAINER (t, tc) { - float pivot_local[3]; + float3 snap_source_local, snap_normal_local; if (rotate_mode != TRANSLATE_ROTATE_OFF) { - copy_v3_v3(pivot_local, t->tsnap.snap_source); - /* The pivot has to be in local-space (see #49494) */ + snap_source_local = t->tsnap.snap_source; + snap_normal_local = t->tsnap.snapNormal; if (tc->use_local_mat) { - mul_m4_v3(tc->imat, pivot_local); + /* The pivot has to be in local-space (see #49494) */ + snap_source_local = math::transform_point(float4x4(tc->imat), snap_source_local); + if (t->data_type == &TransConvertType_Mesh) { + /* The #td->axismtx of other element types (e.g. Pose) are already in global space. */ + snap_normal_local = math::transform_direction(float3x3(tc->imat3), snap_normal_local); + } } } @@ -509,15 +524,17 @@ static void applyTranslationValue(TransInfo *t, const float vec[3]) if (td->flag & TD_SKIP) { continue; } - transdata_elem_translate(t, tc, td, pivot_local, vec, rotate_mode); + transdata_elem_translate( + t, tc, td, snap_source_local, snap_normal_local, vec, rotate_mode); } } else { TransDataArgs_Translate data{}; data.t = t; data.tc = tc; - copy_v3_v3(data.pivot_local, pivot_local); - copy_v3_v3(data.vec, vec); + data.snap_source_local = snap_source_local; + data.snap_normal_local = snap_normal_local; + data.vec = vec; data.rotate_mode = rotate_mode; TaskParallelSettings settings; diff --git a/source/blender/editors/transform/transform_mode_vert_slide.cc b/source/blender/editors/transform/transform_mode_vert_slide.cc index a6861520710..a7c9ae10bc3 100644 --- a/source/blender/editors/transform/transform_mode_vert_slide.cc +++ b/source/blender/editors/transform/transform_mode_vert_slide.cc @@ -58,12 +58,11 @@ struct TransDataVertSlideVert { }; struct VertSlideData { + /* result of ED_view3d_ob_project_mat_get */ + float4x4 proj_mat; TransDataVertSlideVert *sv; int totsv; int curr_sv_index; - - /* result of ED_view3d_ob_project_mat_get */ - float4x4 proj_mat; }; struct VertSlideParams { @@ -194,7 +193,7 @@ static VertSlideData *createVertSlideVerts(TransInfo *t, const TransDataContaine BMEdge *e; BMVert *v; TransDataVertSlideVert *sv_array; - VertSlideData *sld = static_cast(MEM_callocN(sizeof(*sld), "sld")); + VertSlideData *sld = MEM_new(__func__); int j; sld->curr_sv_index = 0; diff --git a/source/blender/editors/transform/transform_snap_object.hh b/source/blender/editors/transform/transform_snap_object.hh index 347e8b417d0..333f82a3880 100644 --- a/source/blender/editors/transform/transform_snap_object.hh +++ b/source/blender/editors/transform/transform_snap_object.hh @@ -8,6 +8,7 @@ #pragma once +#include "BLI_map.hh" #include "BLI_math_geom.h" #define MAX_CLIPPLANE_LEN 6 diff --git a/source/blender/editors/transform/transform_snap_object_editmesh.cc b/source/blender/editors/transform/transform_snap_object_editmesh.cc index c1c60d36a37..8082ee4c9e7 100644 --- a/source/blender/editors/transform/transform_snap_object_editmesh.cc +++ b/source/blender/editors/transform/transform_snap_object_editmesh.cc @@ -184,13 +184,13 @@ static void snap_cache_tri_ensure(SnapCache_EditMesh *em_cache, SnapObjectContex BLI_assert(poly_to_tri_count(bm->totface, bm->totloop) == em->tottri); blender::BitVector<> elem_mask(em->tottri); - int looptri_num_active = BM_iter_mesh_bitmap_from_filter_tessface( + int looptris_num_active = BM_iter_mesh_bitmap_from_filter_tessface( bm, elem_mask, sctx->callbacks.edit_mesh.test_face_fn, sctx->callbacks.edit_mesh.user_data); - bvhtree_from_editmesh_looptri_ex(&treedata, em, elem_mask, looptri_num_active, 0.0f, 4, 6); + bvhtree_from_editmesh_looptris_ex(&treedata, em, elem_mask, looptris_num_active, 0.0f, 4, 6); } else { /* Only cache if BVH-tree is created without a mask. @@ -198,7 +198,7 @@ static void snap_cache_tri_ensure(SnapCache_EditMesh *em_cache, SnapObjectContex BKE_bvhtree_from_editmesh_get(&treedata, em, 4, - BVHTREE_FROM_EM_LOOPTRI, + BVHTREE_FROM_EM_LOOPTRIS, /* WORKAROUND: avoid updating while transforming. */ G.moving ? nullptr : &em_cache->mesh_runtime->bvh_cache, &em_cache->mesh_runtime->eval_mutex); @@ -261,10 +261,10 @@ static SnapCache_EditMesh *editmesh_snapdata_init(SnapObjectContext *sctx, * \{ */ /* Callback to ray-cast with back-face culling (#EditMesh). */ -static void editmesh_looptri_raycast_backface_culling_cb(void *userdata, - int index, - const BVHTreeRay *ray, - BVHTreeRayHit *hit) +static void editmesh_looptris_raycast_backface_culling_cb(void *userdata, + int index, + const BVHTreeRay *ray, + BVHTreeRayHit *hit) { BMEditMesh *em = static_cast(userdata); const BMLoop **ltri = (const BMLoop **)em->looptris[index]; @@ -372,7 +372,7 @@ static bool raycastEditMesh(SnapCache_EditMesh *em_cache, 0.0f, &hit, sctx->runtime.params.use_backface_culling ? - editmesh_looptri_raycast_backface_culling_cb : + editmesh_looptris_raycast_backface_culling_cb : em_cache->raycast_callback, em) != -1) { diff --git a/source/blender/editors/transform/transform_snap_object_mesh.cc b/source/blender/editors/transform/transform_snap_object_mesh.cc index 0eed6e58a89..00cf6b8201a 100644 --- a/source/blender/editors/transform/transform_snap_object_mesh.cc +++ b/source/blender/editors/transform/transform_snap_object_mesh.cc @@ -36,7 +36,7 @@ static void snap_object_data_mesh_get(const Mesh *me_eval, { /* The BVHTree from looptris is always required. */ BKE_bvhtree_from_mesh_get( - r_treedata, me_eval, use_hide ? BVHTREE_FROM_LOOPTRI_NO_HIDDEN : BVHTREE_FROM_LOOPTRI, 4); + r_treedata, me_eval, use_hide ? BVHTREE_FROM_LOOPTRIS_NO_HIDDEN : BVHTREE_FROM_LOOPTRIS, 4); } /** \} */ @@ -49,10 +49,10 @@ static void snap_object_data_mesh_get(const Mesh *me_eval, * Support for storing all depths, not just the first (ray-cast 'all'). */ /* Callback to ray-cast with back-face culling (#Mesh). */ -static void mesh_looptri_raycast_backface_culling_cb(void *userdata, - int index, - const BVHTreeRay *ray, - BVHTreeRayHit *hit) +static void mesh_looptris_raycast_backface_culling_cb(void *userdata, + int index, + const BVHTreeRay *ray, + BVHTreeRayHit *hit) { const BVHTreeFromMesh *data = (BVHTreeFromMesh *)userdata; const blender::Span positions = data->vert_positions; @@ -166,7 +166,7 @@ static bool raycastMesh(SnapObjectContext *sctx, 0.0f, &hit, sctx->runtime.params.use_backface_culling ? - mesh_looptri_raycast_backface_culling_cb : + mesh_looptris_raycast_backface_culling_cb : treedata.raycast_callback, &treedata) != -1) { @@ -533,7 +533,7 @@ static eSnapMode snapMesh(SnapObjectContext *sctx, else { BLI_assert(snap_to & SCE_SNAP_TO_EDGE_ENDPOINT); if (bvhtree[0]) { - /* Snap to loose edge verts. */ + /* Snap to loose edges verts. */ BLI_bvhtree_find_nearest_projected( bvhtree[0], nearest2d.pmat_local.ptr(), @@ -547,7 +547,7 @@ static eSnapMode snapMesh(SnapObjectContext *sctx, } if (treedata.tree) { - /* Snap to looptri verts. */ + /* Snap to looptris verts. */ BLI_bvhtree_find_nearest_projected( treedata.tree, nearest2d.pmat_local.ptr(), diff --git a/source/blender/editors/uvedit/uvedit_ops.cc b/source/blender/editors/uvedit/uvedit_ops.cc index 2a034c4701e..268e21eef5e 100644 --- a/source/blender/editors/uvedit/uvedit_ops.cc +++ b/source/blender/editors/uvedit/uvedit_ops.cc @@ -1322,7 +1322,7 @@ static int uv_hide_exec(bContext *C, wmOperator *op) if (EDBM_mesh_hide(em, swap)) { Mesh *mesh = static_cast(ob->data); EDBMUpdate_Params params = {0}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = false; EDBM_update(mesh, ¶ms); @@ -1499,7 +1499,7 @@ static int uv_reveal_exec(bContext *C, wmOperator *op) if (EDBM_mesh_reveal(em, select)) { Mesh *mesh = static_cast(ob->data); EDBMUpdate_Params params = {0}; - params.calc_looptri = true; + params.calc_looptris = true; params.calc_normals = false; params.is_destructive = false; EDBM_update(mesh, ¶ms); diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.cc b/source/blender/editors/uvedit/uvedit_unwrap_ops.cc index bd31462e285..727c4e39a7f 100644 --- a/source/blender/editors/uvedit/uvedit_unwrap_ops.cc +++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.cc @@ -1223,7 +1223,7 @@ static void uvedit_pack_islands_multi(const Scene *scene, } } - if (island_vector.size() == 0) { + if (island_vector.is_empty()) { return; } @@ -2882,7 +2882,7 @@ static int smart_project_exec(bContext *C, wmOperator *op) project_angle_limit_cos, area_weight); - if (project_normal_array.size() == 0) { + if (project_normal_array.is_empty()) { MEM_freeN(thick_faces); continue; } diff --git a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp index c2548a490af..48dda8ff8d6 100644 --- a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp +++ b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp @@ -419,8 +419,8 @@ void BlenderFileLoader::insertShapeNode(Object *ob, Mesh *mesh, int id) // Compute loop triangles int tottri = poly_to_tri_count(mesh->faces_num, mesh->totloop); - MLoopTri *mlooptri = (MLoopTri *)MEM_malloc_arrayN(tottri, sizeof(*mlooptri), __func__); - blender::bke::mesh::looptris_calc(vert_positions, mesh_polys, corner_verts, {mlooptri, tottri}); + MLoopTri *looptris = (MLoopTri *)MEM_malloc_arrayN(tottri, sizeof(*looptris), __func__); + blender::bke::mesh::looptris_calc(vert_positions, mesh_polys, corner_verts, {looptris, tottri}); const blender::Span looptri_faces = mesh->looptri_faces(); const blender::Span lnors = mesh->corner_normals(); @@ -449,7 +449,7 @@ void BlenderFileLoader::insertShapeNode(Object *ob, Mesh *mesh, int id) float n1[3], n2[3], n3[3], facenormal[3]; int clip[3]; for (int a = 0; a < tottri; a++) { - const MLoopTri *lt = &mlooptri[a]; + const MLoopTri *lt = &looptris[a]; copy_v3_v3(v1, vert_positions[corner_verts[lt->tri[0]]]); copy_v3_v3(v2, vert_positions[corner_verts[lt->tri[1]]]); @@ -471,7 +471,7 @@ void BlenderFileLoader::insertShapeNode(Object *ob, Mesh *mesh, int id) } #endif if (numFaces == 0) { - MEM_freeN(mlooptri); + MEM_freeN(looptris); return; } @@ -523,7 +523,7 @@ void BlenderFileLoader::insertShapeNode(Object *ob, Mesh *mesh, int id) // We parse the vlak nodes again and import meshes while applying the clipping // by the near and far view planes. for (int a = 0; a < tottri; a++) { - const MLoopTri *lt = &mlooptri[a]; + const MLoopTri *lt = &looptris[a]; const int poly_i = looptri_faces[a]; Material *mat = BKE_object_material_get(ob, material_indices[poly_i] + 1); @@ -631,7 +631,7 @@ void BlenderFileLoader::insertShapeNode(Object *ob, Mesh *mesh, int id) } } - MEM_freeN(mlooptri); + MEM_freeN(looptris); // We might have several times the same vertex. We want a clean // shape with no real-vertex. Here, we are making a cleaning pass. diff --git a/source/blender/functions/FN_lazy_function_execute.hh b/source/blender/functions/FN_lazy_function_execute.hh index 267a5da5825..d5a0806d4bf 100644 --- a/source/blender/functions/FN_lazy_function_execute.hh +++ b/source/blender/functions/FN_lazy_function_execute.hh @@ -30,8 +30,8 @@ class BasicParams : public Params { public: BasicParams(const LazyFunction &fn, - const Span inputs, - const Span outputs, + Span inputs, + Span outputs, MutableSpan> input_usages, Span output_usages, MutableSpan set_outputs); diff --git a/source/blender/geometry/GEO_add_curves_on_mesh.hh b/source/blender/geometry/GEO_add_curves_on_mesh.hh index c1523e0452b..f1396ed3fb0 100644 --- a/source/blender/geometry/GEO_add_curves_on_mesh.hh +++ b/source/blender/geometry/GEO_add_curves_on_mesh.hh @@ -60,8 +60,8 @@ struct AddCurvesOnMeshOutputs { AddCurvesOnMeshOutputs add_curves_on_mesh(bke::CurvesGeometry &curves, const AddCurvesOnMeshInputs &inputs); -float3 compute_surface_point_normal(const MLoopTri &looptri, +float3 compute_surface_point_normal(const MLoopTri <, const float3 &bary_coord, - const Span corner_normals); + Span corner_normals); } // namespace blender::geometry diff --git a/source/blender/geometry/GEO_reverse_uv_sampler.hh b/source/blender/geometry/GEO_reverse_uv_sampler.hh index cb773a9e1d5..06bd9790276 100644 --- a/source/blender/geometry/GEO_reverse_uv_sampler.hh +++ b/source/blender/geometry/GEO_reverse_uv_sampler.hh @@ -21,13 +21,13 @@ namespace blender::geometry { */ class ReverseUVSampler { private: - const Span uv_map_; - const Span looptris_; + Span uv_map_; + Span looptris_; int resolution_; MultiValueMap looptris_by_cell_; public: - ReverseUVSampler(const Span uv_map, const Span looptris); + ReverseUVSampler(Span uv_map, Span looptris); enum class ResultType { None, diff --git a/source/blender/geometry/GEO_uv_pack.hh b/source/blender/geometry/GEO_uv_pack.hh index 5133406a544..102f4c14f55 100644 --- a/source/blender/geometry/GEO_uv_pack.hh +++ b/source/blender/geometry/GEO_uv_pack.hh @@ -129,18 +129,14 @@ class PackIsland { /** Unchanged by #pack_islands, used by caller. */ int caller_index; - void add_triangle(const float2 uv0, const float2 uv1, const float2 uv2); - void add_polygon(const Span uvs, MemArena *arena, Heap *heap); + void add_triangle(float2 uv0, float2 uv1, float2 uv2); + void add_polygon(Span uvs, MemArena *arena, Heap *heap); - void build_transformation(const float scale, const double rotation, float r_matrix[2][2]) const; - void build_inverse_transformation(const float scale, - const double rotation, - float r_matrix[2][2]) const; + void build_transformation(float scale, double rotation, float r_matrix[2][2]) const; + void build_inverse_transformation(float scale, double rotation, float r_matrix[2][2]) const; - float2 get_diagonal_support(const float scale, const float rotation, const float margin) const; - float2 get_diagonal_support_d4(const float scale, - const float rotation, - const float margin) const; + float2 get_diagonal_support(float scale, float rotation, float margin) const; + float2 get_diagonal_support_d4(float scale, float rotation, float margin) const; /** Center of AABB and inside-or-touching the convex hull. */ float2 pivot_; @@ -148,7 +144,7 @@ class PackIsland { float2 half_diagonal_; float pre_rotate_; - void place_(const float scale, const UVPhi phi); + void place_(float scale, UVPhi phi); void finalize_geometry_(const UVPackIsland_Params ¶ms, MemArena *arena, Heap *heap); bool can_rotate_(const UVPackIsland_Params ¶ms) const; @@ -165,7 +161,7 @@ class PackIsland { friend class OverlapMerger; }; -float pack_islands(const Span &islands, const UVPackIsland_Params ¶ms); +float pack_islands(Span islands, const UVPackIsland_Params ¶ms); /** Compute `r = mat * (a + b)` with high precision. */ void mul_v2_m2_add_v2v2(float r[2], const float mat[2][2], const float a[2], const float b[2]); diff --git a/source/blender/geometry/intern/add_curves_on_mesh.cc b/source/blender/geometry/intern/add_curves_on_mesh.cc index 59b93367af1..f0431e99b77 100644 --- a/source/blender/geometry/intern/add_curves_on_mesh.cc +++ b/source/blender/geometry/intern/add_curves_on_mesh.cc @@ -37,12 +37,12 @@ struct NeighborCurve { static constexpr int max_neighbors = 5; using NeighborCurves = Vector; -float3 compute_surface_point_normal(const MLoopTri &looptri, +float3 compute_surface_point_normal(const MLoopTri <, const float3 &bary_coord, const Span corner_normals) { const float3 value = bke::mesh_surface_sample::sample_corner_attribute_with_bary_coords( - bary_coord, looptri, corner_normals); + bary_coord, lt, corner_normals); return math::normalize(value); } @@ -258,14 +258,14 @@ AddCurvesOnMeshOutputs add_curves_on_mesh(CurvesGeometry &curves, outputs.uv_error = true; continue; } - const MLoopTri &looptri = inputs.surface_looptris[result.looptri_index]; + const MLoopTri < = inputs.surface_looptris[result.looptri_index]; bary_coords.append(result.bary_weights); looptri_indices.append(result.looptri_index); const float3 root_position_su = bke::attribute_math::mix3( result.bary_weights, - surface_positions[surface_corner_verts[looptri.tri[0]]], - surface_positions[surface_corner_verts[looptri.tri[1]]], - surface_positions[surface_corner_verts[looptri.tri[2]]]); + surface_positions[surface_corner_verts[lt.tri[0]]], + surface_positions[surface_corner_verts[lt.tri[1]]], + surface_positions[surface_corner_verts[lt.tri[2]]]); root_positions_cu.append( math::transform_point(inputs.transforms->surface_to_curves, root_position_su)); used_uvs.append(uv); diff --git a/source/blender/geometry/intern/curve_constraints.cc b/source/blender/geometry/intern/curve_constraints.cc index d19ce0bcfdb..7b54f89709b 100644 --- a/source/blender/geometry/intern/curve_constraints.cc +++ b/source/blender/geometry/intern/curve_constraints.cc @@ -70,7 +70,7 @@ void solve_length_and_collision_constraints(const OffsetIndices points_by_c solve_length_constraints(points_by_curve, curve_selection, segment_lengths_cu, positions_cu); BVHTreeFromMesh surface_bvh; - BKE_bvhtree_from_mesh_get(&surface_bvh, &surface, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&surface_bvh, &surface, BVHTREE_FROM_LOOPTRIS, 2); BLI_SCOPED_DEFER([&]() { free_bvhtree_from_mesh(&surface_bvh); }); const float radius = 0.005f; diff --git a/source/blender/geometry/intern/mesh_merge_by_distance.cc b/source/blender/geometry/intern/mesh_merge_by_distance.cc index 0e5d2d7d2d9..56173aa6adf 100644 --- a/source/blender/geometry/intern/mesh_merge_by_distance.cc +++ b/source/blender/geometry/intern/mesh_merge_by_distance.cc @@ -384,7 +384,7 @@ static void weld_edge_find_doubles(Span weld_edges, /* Setup Edge Overlap. */ int edge_double_kill_len = 0; - if (weld_edges.size() == 0) { + if (weld_edges.is_empty()) { *r_edge_double_kill_len = edge_double_kill_len; return; } @@ -1041,7 +1041,7 @@ static int poly_find_doubles(const OffsetIndices poly_corners_offsets, /* Use a reverse for loop to ensure that indexes are assigned in ascending order. */ for (int face_index = poly_num; face_index--;) { - if (poly_corners_offsets[face_index].size() == 0) { + if (poly_corners_offsets[face_index].is_empty()) { continue; } diff --git a/source/blender/geometry/intern/mesh_primitive_cuboid.cc b/source/blender/geometry/intern/mesh_primitive_cuboid.cc index dec8022d4de..15cff45a796 100644 --- a/source/blender/geometry/intern/mesh_primitive_cuboid.cc +++ b/source/blender/geometry/intern/mesh_primitive_cuboid.cc @@ -376,7 +376,7 @@ Mesh *create_cuboid_mesh(const float3 &size, Mesh *mesh = BKE_mesh_new_nomain(config.vertex_count, 0, config.face_count, config.loop_count); MutableSpan positions = mesh->vert_positions_for_write(); MutableSpan corner_verts = mesh->corner_verts_for_write(); - BKE_mesh_smooth_flag_set(mesh, false); + bke::mesh_smooth_set(*mesh, false); calculate_positions(config, positions); offset_indices::fill_constant_group_size(4, 0, mesh->face_offsets_for_write()); diff --git a/source/blender/geometry/intern/mesh_primitive_cylinder_cone.cc b/source/blender/geometry/intern/mesh_primitive_cylinder_cone.cc index 603add8b38f..8372f22fb3e 100644 --- a/source/blender/geometry/intern/mesh_primitive_cylinder_cone.cc +++ b/source/blender/geometry/intern/mesh_primitive_cylinder_cone.cc @@ -685,7 +685,7 @@ Mesh *create_cylinder_or_cone_mesh(const float radius_top, MutableSpan face_offsets = mesh->face_offsets_for_write(); MutableSpan corner_verts = mesh->corner_verts_for_write(); MutableSpan corner_edges = mesh->corner_edges_for_write(); - BKE_mesh_smooth_flag_set(mesh, false); + bke::mesh_smooth_set(*mesh, false); calculate_cone_verts(config, positions); calculate_cone_edges(config, edges); diff --git a/source/blender/geometry/intern/mesh_primitive_grid.cc b/source/blender/geometry/intern/mesh_primitive_grid.cc index 81432cd9b5b..0050992ac75 100644 --- a/source/blender/geometry/intern/mesh_primitive_grid.cc +++ b/source/blender/geometry/intern/mesh_primitive_grid.cc @@ -51,7 +51,7 @@ Mesh *create_grid_mesh(const int verts_x, MutableSpan edges = mesh->edges_for_write(); MutableSpan corner_verts = mesh->corner_verts_for_write(); MutableSpan corner_edges = mesh->corner_edges_for_write(); - BKE_mesh_smooth_flag_set(mesh, false); + bke::mesh_smooth_set(*mesh, false); offset_indices::fill_constant_group_size(4, 0, mesh->face_offsets_for_write()); diff --git a/source/blender/geometry/intern/mesh_primitive_uv_sphere.cc b/source/blender/geometry/intern/mesh_primitive_uv_sphere.cc index 54c4cc4c6d2..20b5bbda3c0 100644 --- a/source/blender/geometry/intern/mesh_primitive_uv_sphere.cc +++ b/source/blender/geometry/intern/mesh_primitive_uv_sphere.cc @@ -307,7 +307,7 @@ Mesh *create_uv_sphere_mesh(const float radius, MutableSpan face_offsets = mesh->face_offsets_for_write(); MutableSpan corner_verts = mesh->corner_verts_for_write(); MutableSpan corner_edges = mesh->corner_edges_for_write(); - BKE_mesh_smooth_flag_set(mesh, false); + bke::mesh_smooth_set(*mesh, false); threading::parallel_invoke( 1024 < segments * rings, diff --git a/source/blender/geometry/intern/mesh_split_edges.cc b/source/blender/geometry/intern/mesh_split_edges.cc index d49f8faa1ef..7aa3e41e0f2 100644 --- a/source/blender/geometry/intern/mesh_split_edges.cc +++ b/source/blender/geometry/intern/mesh_split_edges.cc @@ -595,7 +595,7 @@ void split_edges(Mesh &mesh, const Array vert_map = offsets_to_map(affected_verts, new_verts_by_affected_vert); propagate_vert_attributes(mesh, vert_map); - BKE_mesh_tag_edges_split(&mesh); + mesh.tag_edges_split(); debug_randomize_vert_order(&mesh); debug_randomize_edge_order(&mesh); diff --git a/source/blender/geometry/intern/mesh_to_volume.cc b/source/blender/geometry/intern/mesh_to_volume.cc index 9a4ff178e1f..79073c40b69 100644 --- a/source/blender/geometry/intern/mesh_to_volume.cc +++ b/source/blender/geometry/intern/mesh_to_volume.cc @@ -65,9 +65,9 @@ void OpenVDBMeshAdapter::getIndexSpacePoint(size_t polygon_index, size_t vertex_index, openvdb::Vec3d &pos) const { - const MLoopTri &looptri = looptris_[polygon_index]; + const MLoopTri < = looptris_[polygon_index]; const float3 transformed_co = math::transform_point( - transform_, positions_[corner_verts_[looptri.tri[vertex_index]]]); + transform_, positions_[corner_verts_[lt.tri[vertex_index]]]); pos = &transformed_co.x; } @@ -164,10 +164,9 @@ static openvdb::FloatGrid::Ptr mesh_to_sdf_volume_grid(const Mesh &mesh, threading::parallel_for(looptris.index_range(), 2048, [&](const IndexRange range) { for (const int i : range) { - const MLoopTri &loop_tri = looptris[i]; - triangles[i] = openvdb::Vec3I(corner_verts[loop_tri.tri[0]], - corner_verts[loop_tri.tri[1]], - corner_verts[loop_tri.tri[2]]); + const MLoopTri < = looptris[i]; + triangles[i] = openvdb::Vec3I( + corner_verts[lt.tri[0]], corner_verts[lt.tri[1]], corner_verts[lt.tri[2]]); } }); diff --git a/source/blender/geometry/intern/randomize.cc b/source/blender/geometry/intern/randomize.cc index 18cb518b9f9..87143bde83d 100644 --- a/source/blender/geometry/intern/randomize.cc +++ b/source/blender/geometry/intern/randomize.cc @@ -104,7 +104,7 @@ void debug_randomize_vert_order(Mesh *mesh) v = new_by_old_map[v]; } - BKE_mesh_tag_topology_changed(mesh); + mesh->tag_topology_changed(); } void debug_randomize_edge_order(Mesh *mesh) @@ -122,7 +122,7 @@ void debug_randomize_edge_order(Mesh *mesh) e = new_by_old_map[e]; } - BKE_mesh_tag_topology_changed(mesh); + mesh->tag_topology_changed(); } static Array make_new_offset_indices(const OffsetIndices old_offsets, @@ -177,7 +177,7 @@ void debug_randomize_face_order(Mesh *mesh) mesh->face_offsets_for_write().copy_from(new_face_offsets); - BKE_mesh_tag_topology_changed(mesh); + mesh->tag_topology_changed(); } void debug_randomize_point_order(PointCloud *pointcloud) diff --git a/source/blender/geometry/intern/reverse_uv_sampler.cc b/source/blender/geometry/intern/reverse_uv_sampler.cc index caf38047f69..277ac5ad38c 100644 --- a/source/blender/geometry/intern/reverse_uv_sampler.cc +++ b/source/blender/geometry/intern/reverse_uv_sampler.cc @@ -22,10 +22,10 @@ ReverseUVSampler::ReverseUVSampler(const Span uv_map, const Span(3, std::sqrt(looptris.size()) * 2); for (const int looptri_index : looptris.index_range()) { - const MLoopTri &looptri = looptris[looptri_index]; - const float2 &uv_0 = uv_map_[looptri.tri[0]]; - const float2 &uv_1 = uv_map_[looptri.tri[1]]; - const float2 &uv_2 = uv_map_[looptri.tri[2]]; + const MLoopTri < = looptris[looptri_index]; + const float2 &uv_0 = uv_map_[lt.tri[0]]; + const float2 &uv_1 = uv_map_[lt.tri[1]]; + const float2 &uv_2 = uv_map_[lt.tri[2]]; const int2 key_0 = uv_to_cell_key(uv_0, resolution_); const int2 key_1 = uv_to_cell_key(uv_1, resolution_); @@ -50,7 +50,7 @@ ReverseUVSampler::Result ReverseUVSampler::sample(const float2 &query_uv) const float best_dist = FLT_MAX; float3 best_bary_weights; - int best_looptri; + int best_looptri_index; /* The distance to an edge that is allowed to be inside or outside the triangle. Without this, * the lookup can fail for floating point accuracy reasons when the uv is almost exact on an @@ -58,10 +58,10 @@ ReverseUVSampler::Result ReverseUVSampler::sample(const float2 &query_uv) const const float edge_epsilon = 0.00001f; for (const int looptri_index : looptri_indices) { - const MLoopTri &looptri = looptris_[looptri_index]; - const float2 &uv_0 = uv_map_[looptri.tri[0]]; - const float2 &uv_1 = uv_map_[looptri.tri[1]]; - const float2 &uv_2 = uv_map_[looptri.tri[2]]; + const MLoopTri < = looptris_[looptri_index]; + const float2 &uv_0 = uv_map_[lt.tri[0]]; + const float2 &uv_1 = uv_map_[lt.tri[1]]; + const float2 &uv_2 = uv_map_[lt.tri[2]]; float3 bary_weights; if (!barycentric_coords_v2(uv_0, uv_1, uv_2, query_uv, bary_weights)) { continue; @@ -86,14 +86,14 @@ ReverseUVSampler::Result ReverseUVSampler::sample(const float2 &query_uv) const if (dist < best_dist) { best_dist = dist; best_bary_weights = bary_weights; - best_looptri = looptri_index; + best_looptri_index = looptri_index; } } /* Allow using the closest (but not intersecting) triangle if the uv is almost exactly on an * edge. */ if (best_dist < edge_epsilon) { - return Result{ResultType::Ok, best_looptri, math::clamp(best_bary_weights, 0.0f, 1.0f)}; + return Result{ResultType::Ok, best_looptri_index, math::clamp(best_bary_weights, 0.0f, 1.0f)}; } return Result{}; diff --git a/source/blender/geometry/intern/uv_pack.cc b/source/blender/geometry/intern/uv_pack.cc index 3f9260600da..d5c1e59a0c8 100644 --- a/source/blender/geometry/intern/uv_pack.cc +++ b/source/blender/geometry/intern/uv_pack.cc @@ -1493,7 +1493,7 @@ static bool rotate_inside_square(const Span> islan MutableSpan r_phis, rctf *r_extent) { - if (island_indices.size() == 0) { + if (island_indices.is_empty()) { return false; /* Nothing to do. */ } if (params.rotate_method != ED_UVPACK_ROTATION_ANY) { @@ -2245,12 +2245,12 @@ static void finalize_geometry(const Span &islands, const UVPackIsl BLI_memarena_free(arena); } -float pack_islands(const Span &islands, const UVPackIsland_Params ¶ms) +float pack_islands(const Span islands, const UVPackIsland_Params ¶ms) { BLI_assert(0.0f <= params.margin); BLI_assert(0.0f <= params.target_aspect_y); - if (islands.size() == 0) { + if (islands.is_empty()) { return 1.0f; /* Nothing to do, just create a safe default. */ } diff --git a/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_cpu.cc b/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_cpu.cc index d9bd7e8033d..4fec3963d12 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_cpu.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_cpu.cc @@ -1466,8 +1466,8 @@ static LineartTriangle *lineart_triangle_from_index(LineartData *ld, struct EdgeFeatData { LineartData *ld; Mesh *mesh; - Object *ob_eval; /* For evaluated materials. */ - const int *material_indices; + Object *ob_eval; /* For evaluated materials. */ + blender::Span material_indices; /* May be empty. */ blender::Span edges; blender::Span corner_verts; blender::Span corner_edges; @@ -1499,18 +1499,18 @@ static void feat_data_sum_reduce(const void *__restrict /*userdata*/, feat_chunk_join->feat_edges += feat_chunk->feat_edges; } -static void lineart_identify_mlooptri_feature_edges(void *__restrict userdata, - const int i, - const TaskParallelTLS *__restrict tls) +static void lineart_identify_looptri_feature_edges(void *__restrict userdata, + const int i, + const TaskParallelTLS *__restrict tls) { EdgeFeatData *e_feat_data = (EdgeFeatData *)userdata; EdgeFeatReduceData *reduce_data = (EdgeFeatReduceData *)tls->userdata_chunk; Mesh *mesh = e_feat_data->mesh; - const int *material_indices = e_feat_data->material_indices; Object *ob_eval = e_feat_data->ob_eval; LineartEdgeNeighbor *edge_nabr = e_feat_data->edge_nabr; const blender::Span looptris = e_feat_data->looptris; const blender::Span looptri_faces = e_feat_data->looptri_faces; + const blender::Span material_indices = e_feat_data->material_indices; uint16_t edge_flag_result = 0; @@ -1656,8 +1656,8 @@ static void lineart_identify_mlooptri_feature_edges(void *__restrict userdata, } } - int mat1 = material_indices ? material_indices[looptri_faces[f1]] : 0; - int mat2 = material_indices ? material_indices[looptri_faces[f2]] : 0; + int mat1 = material_indices.is_empty() ? 0 : material_indices[looptri_faces[f1]]; + int mat2 = material_indices.is_empty() ? 0 : material_indices[looptri_faces[f2]]; if (mat1 != mat2) { Material *m1 = BKE_object_material_get_eval(ob_eval, mat1 + 1); @@ -1791,7 +1791,7 @@ struct TriData { blender::Span corner_verts; blender::Span looptris; blender::Span looptri_faces; - const int *material_indices; + blender::Span material_indices; LineartVert *vert_arr; LineartTriangle *tri_arr; int lineart_triangle_size; @@ -1806,25 +1806,26 @@ static void lineart_load_tri_task(void *__restrict userdata, LineartObjectInfo *ob_info = tri_task_data->ob_info; const blender::Span positions = tri_task_data->positions; const blender::Span corner_verts = tri_task_data->corner_verts; - const MLoopTri *looptri = &tri_task_data->looptris[i]; + const MLoopTri *lt = &tri_task_data->looptris[i]; const int face_i = tri_task_data->looptri_faces[i]; - const int *material_indices = tri_task_data->material_indices; + const blender::Span material_indices = tri_task_data->material_indices; + LineartVert *vert_arr = tri_task_data->vert_arr; LineartTriangle *tri = tri_task_data->tri_arr; tri = (LineartTriangle *)(((uchar *)tri) + tri_task_data->lineart_triangle_size * i); - int v1 = corner_verts[looptri->tri[0]]; - int v2 = corner_verts[looptri->tri[1]]; - int v3 = corner_verts[looptri->tri[2]]; + int v1 = corner_verts[lt->tri[0]]; + int v2 = corner_verts[lt->tri[1]]; + int v3 = corner_verts[lt->tri[2]]; tri->v[0] = &vert_arr[v1]; tri->v[1] = &vert_arr[v2]; tri->v[2] = &vert_arr[v3]; /* Material mask bits and occlusion effectiveness assignment. */ - Material *mat = BKE_object_material_get(ob_info->original_ob_eval, - material_indices ? material_indices[face_i] + 1 : 1); + Material *mat = BKE_object_material_get( + ob_info->original_ob_eval, material_indices.is_empty() ? 1 : material_indices[face_i] + 1); tri->material_mask_bits |= ((mat && (mat->lineart.flags & LRT_MATERIAL_MASK_ENABLED)) ? mat->lineart.material_mask_bits : 0); @@ -1875,13 +1876,13 @@ static void lineart_edge_neighbor_init_task(void *__restrict userdata, { EdgeNeighborData *en_data = (EdgeNeighborData *)userdata; LineartAdjacentEdge *adj_e = &en_data->adj_e[i]; - const MLoopTri *looptri = &en_data->looptris[i / 3]; + const MLoopTri *lt = &en_data->looptris[i / 3]; LineartEdgeNeighbor *edge_nabr = &en_data->edge_nabr[i]; const blender::Span corner_verts = en_data->corner_verts; adj_e->e = i; - adj_e->v1 = corner_verts[looptri->tri[i % 3]]; - adj_e->v2 = corner_verts[looptri->tri[(i + 1) % 3]]; + adj_e->v1 = corner_verts[lt->tri[i % 3]]; + adj_e->v2 = corner_verts[lt->tri[(i + 1) % 3]]; if (adj_e->v1 > adj_e->v2) { std::swap(adj_e->v1, adj_e->v2); } @@ -1958,10 +1959,9 @@ static void lineart_geometry_object_load(LineartObjectInfo *ob_info, } /* Triangulate. */ - const blender::Span looptris = mesh->looptris(); - - const int *material_indices = (const int *)CustomData_get_layer_named( - &mesh->face_data, CD_PROP_INT32, "material_index"); + const Span looptris = mesh->looptris(); + const bke::AttributeAccessor attributes = mesh->attributes(); + const VArraySpan material_indices = *attributes.lookup("material_index", ATTR_DOMAIN_FACE); /* Check if we should look for custom data tags like Freestyle edges or faces. */ bool can_find_freestyle_edge = false; @@ -2090,7 +2090,6 @@ static void lineart_geometry_object_load(LineartObjectInfo *ob_info, edge_feat_settings.userdata_chunk_size = sizeof(EdgeFeatReduceData); edge_feat_settings.func_reduce = feat_data_sum_reduce; - const bke::AttributeAccessor attributes = mesh->attributes(); const VArray sharp_edges = *attributes.lookup_or_default( "sharp_edge", ATTR_DOMAIN_EDGE, false); const VArray sharp_faces = *attributes.lookup_or_default( @@ -2127,14 +2126,14 @@ static void lineart_geometry_object_load(LineartObjectInfo *ob_info, BLI_task_parallel_range(0, total_edges, &edge_feat_data, - lineart_identify_mlooptri_feature_edges, + lineart_identify_looptri_feature_edges, &edge_feat_settings); LooseEdgeData loose_data = {0}; if (la_data->conf.use_loose) { /* Only identifying floating edges at this point because other edges has been taken care of - * inside #lineart_identify_mlooptri_feature_edges function. */ + * inside #lineart_identify_looptri_feature_edges function. */ const bke::LooseEdgeCache &loose_edges = mesh->loose_edges(); loose_data.loose_array = static_cast( MEM_malloc_arrayN(loose_edges.count, sizeof(int), __func__)); @@ -5358,7 +5357,7 @@ static void lineart_gpencil_generate(LineartCache *cache, if (eval_ob && eval_ob->type == OB_MESH) { int dindex = 0; Mesh *mesh = BKE_object_get_evaluated_mesh(eval_ob); - MDeformVert *dvert = BKE_mesh_deform_verts_for_write(mesh); + MDeformVert *dvert = mesh->deform_verts_for_write().data(); if (dvert) { LISTBASE_FOREACH (bDeformGroup *, db, &mesh->vertex_group_names) { if ((!source_vgname) || strstr(db->name, source_vgname) == db->name) { diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt index cbaeaa10db4..902773ea1fa 100644 --- a/source/blender/gpu/CMakeLists.txt +++ b/source/blender/gpu/CMakeLists.txt @@ -626,7 +626,7 @@ set(MSL_SRC ) if(WITH_GTESTS) - if(WITH_OPENGL_DRAW_TESTS) + if(WITH_GPU_DRAW_TESTS) list(APPEND GLSL_SRC ${GLSL_SRC_TEST}) endif() endif() @@ -775,7 +775,7 @@ set(SRC_SHADER_CREATE_INFOS_MTL ) if(WITH_GTESTS) - if(WITH_OPENGL_DRAW_TESTS) + if(WITH_GPU_DRAW_TESTS) list(APPEND SRC_SHADER_CREATE_INFOS ${SRC_SHADER_CREATE_INFOS_TEST}) endif() endif() @@ -884,10 +884,8 @@ if(WITH_GTESTS) set(TEST_INC) set(TEST_LIB) - if(WITH_OPENGL_DRAW_TESTS) + if(WITH_GPU_DRAW_TESTS) list(APPEND TEST_SRC - tests/gpu_testing.cc - tests/buffer_texture_test.cc tests/compute_test.cc tests/framebuffer_test.cc @@ -899,8 +897,7 @@ if(WITH_GTESTS) tests/storage_buffer_test.cc tests/texture_test.cc tests/vertex_buffer_test.cc - - tests/gpu_testing.hh + tests/shader_create_info_test.cc ) endif() @@ -911,7 +908,19 @@ if(WITH_GTESTS) ) endif() + # Enable shader validation on buildbot for Metal + if(WITH_METAL_BACKEND AND NOT WITH_GPU_DRAW_TESTS) + list(APPEND TEST_SRC + tests/shader_create_info_test.cc + ) + endif() + if (TEST_SRC) + list(APPEND TEST_SRC + tests/gpu_testing.cc + tests/gpu_testing.hh + ) + include(GTestTesting) blender_add_test_lib(bf_gpu_tests "${TEST_SRC}" "${INC};${TEST_INC}" "${INC_SYS}" "${LIB};${TEST_LIB}") endif() diff --git a/source/blender/gpu/GPU_material.h b/source/blender/gpu/GPU_material.h index a2615cd6927..45115bf6c95 100644 --- a/source/blender/gpu/GPU_material.h +++ b/source/blender/gpu/GPU_material.h @@ -79,12 +79,13 @@ typedef enum eGPUMaterialFlag { GPU_MATFLAG_SHADER_TO_RGBA = (1 << 7), GPU_MATFLAG_AO = (1 << 8), GPU_MATFLAG_COAT = (1 << 9), + GPU_MATFLAG_TRANSLUCENT = (1 << 10), - GPU_MATFLAG_VOLUME_SCATTER = (1 << 10), - GPU_MATFLAG_VOLUME_ABSORPTION = (1 << 11), + GPU_MATFLAG_VOLUME_SCATTER = (1 << 16), + GPU_MATFLAG_VOLUME_ABSORPTION = (1 << 17), - GPU_MATFLAG_OBJECT_INFO = (1 << 12), - GPU_MATFLAG_AOV = (1 << 13), + GPU_MATFLAG_OBJECT_INFO = (1 << 18), + GPU_MATFLAG_AOV = (1 << 19), GPU_MATFLAG_BARYCENTRIC = (1 << 20), diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h index f39e2ce850b..9f853e2a952 100644 --- a/source/blender/gpu/GPU_shader.h +++ b/source/blender/gpu/GPU_shader.h @@ -152,6 +152,7 @@ void GPU_shader_uniform_4fv(GPUShader *sh, const char *name, const float data[4] void GPU_shader_uniform_2iv(GPUShader *sh, const char *name, const int data[2]); void GPU_shader_uniform_mat4(GPUShader *sh, const char *name, const float data[4][4]); void GPU_shader_uniform_mat3_as_mat4(GPUShader *sh, const char *name, const float data[3][3]); +void GPU_shader_uniform_1f_array(GPUShader *sh, const char *name, int len, const float *val); void GPU_shader_uniform_2fv_array(GPUShader *sh, const char *name, int len, const float (*val)[2]); void GPU_shader_uniform_4fv_array(GPUShader *sh, const char *name, int len, const float (*val)[4]); diff --git a/source/blender/gpu/intern/gpu_debug.cc b/source/blender/gpu/intern/gpu_debug.cc index e33dbc975fc..af565358bae 100644 --- a/source/blender/gpu/intern/gpu_debug.cc +++ b/source/blender/gpu/intern/gpu_debug.cc @@ -47,7 +47,7 @@ void GPU_debug_get_groups_names(int name_buf_len, char *r_name_buf) return; } DebugStack &stack = ctx->debug_stack; - if (stack.size() == 0) { + if (stack.is_empty()) { r_name_buf[0] = '\0'; return; } diff --git a/source/blender/gpu/intern/gpu_shader.cc b/source/blender/gpu/intern/gpu_shader.cc index 91f5c4e046f..3c220d9133f 100644 --- a/source/blender/gpu/intern/gpu_shader.cc +++ b/source/blender/gpu/intern/gpu_shader.cc @@ -64,7 +64,7 @@ Shader::~Shader() static void standard_defines(Vector &sources) { - BLI_assert(sources.size() == 0); + BLI_assert(sources.is_empty()); /* Version needs to be first. Exact values will be added by implementation. */ sources.append("version"); /* Define to identify code usage in shading language. */ @@ -736,6 +736,12 @@ void GPU_shader_uniform_mat3_as_mat4(GPUShader *sh, const char *name, const floa GPU_shader_uniform_mat4(sh, name, matrix); } +void GPU_shader_uniform_1f_array(GPUShader *sh, const char *name, int len, const float *val) +{ + const int loc = GPU_shader_get_uniform(sh, name); + GPU_shader_uniform_float_ex(sh, loc, 1, len, val); +} + void GPU_shader_uniform_2fv_array(GPUShader *sh, const char *name, int len, const float (*val)[2]) { const int loc = GPU_shader_get_uniform(sh, name); diff --git a/source/blender/gpu/intern/gpu_shader_builder.cc b/source/blender/gpu/intern/gpu_shader_builder.cc index 007b06df48c..b0f8b99efb2 100644 --- a/source/blender/gpu/intern/gpu_shader_builder.cc +++ b/source/blender/gpu/intern/gpu_shader_builder.cc @@ -16,6 +16,7 @@ #include "GPU_init_exit.h" #include "gpu_shader_create_info_private.hh" +#include "BLI_string_ref.hh" #include "BLI_vector.hh" #include "CLG_log.h" @@ -25,23 +26,33 @@ namespace blender::gpu::shader_builder { class ShaderBuilder { private: GHOST_SystemHandle ghost_system_; - GHOST_ContextHandle ghost_context_; + GHOST_ContextHandle ghost_context_ = nullptr; GPUContext *gpu_context_ = nullptr; public: - void init(); - bool bake_create_infos(); - void exit(); + void init_system(); + bool init_context(); + bool bake_create_infos(const char *name_starts_with_filter); + void exit_context(); + void exit_system(); }; -bool ShaderBuilder::bake_create_infos() +bool ShaderBuilder::bake_create_infos(const char *name_starts_with_filter) { - return gpu_shader_create_info_compile_all(); + return gpu_shader_create_info_compile(name_starts_with_filter); } -void ShaderBuilder::init() +void ShaderBuilder::init_system() { CLG_init(); + ghost_system_ = GHOST_CreateSystemBackground(); +} + +bool ShaderBuilder::init_context() +{ + BLI_assert(ghost_system_); + BLI_assert(ghost_context_ == nullptr); + BLI_assert(gpu_context_ == nullptr); GHOST_GPUSettings gpuSettings = {0}; switch (GPU_backend_type_selection_get()) { @@ -68,23 +79,33 @@ void ShaderBuilder::init() break; } - ghost_system_ = GHOST_CreateSystemBackground(); ghost_context_ = GHOST_CreateGPUContext(ghost_system_, gpuSettings); + if (ghost_context_ == nullptr) { + GHOST_DisposeSystem(ghost_system_); + return false; + } + GHOST_ActivateGPUContext(ghost_context_); gpu_context_ = GPU_context_create(nullptr, ghost_context_); GPU_init(); + return true; } -void ShaderBuilder::exit() +void ShaderBuilder::exit_context() { + BLI_assert(ghost_context_); + BLI_assert(gpu_context_); GPU_exit(); - GPU_context_discard(gpu_context_); - GHOST_DisposeGPUContext(ghost_system_, ghost_context_); - GHOST_DisposeSystem(ghost_system_); + gpu_context_ = nullptr; + ghost_context_ = nullptr; +} +void ShaderBuilder::exit_system() +{ + GHOST_DisposeSystem(ghost_system_); CLG_exit(); } @@ -93,13 +114,58 @@ void ShaderBuilder::exit() /** \brief Entry point for the shader_builder. */ int main(int argc, const char *argv[]) { - if (argc < 2) { - printf("Usage: %s \n", argv[0]); + std::string gpu_backend_arg; + std::string shader_name_starts_with_filter_arg; + std::string result_file_arg; + + int arg = 1; + while (arg < argc) { + if (arg < argc - 2) { + blender::StringRefNull argument = argv[arg]; + if (argument == "--gpu-backend") { + gpu_backend_arg = std::string(argv[arg + 1]); + arg += 2; + } + else if (argument == "--gpu-shader-filter") { + shader_name_starts_with_filter_arg = std::string(argv[arg + 1]); + arg += 2; + } + else { + break; + } + } + else if (arg == argc - 1) { + result_file_arg = argv[arg]; + arg += 1; + } + else { + break; + } + } + + if (result_file_arg.empty() || (!ELEM(gpu_backend_arg, "", "vulkan", "metal", "opengl"))) { + std::cout << "Usage: " << argv[0]; + std::cout << " [--gpu-backend "; +#ifdef WITH_METAL_BACKEND + std::cout << "metal"; +#endif +#ifdef WITH_OPENGL_BACKEND + std::cout << "opengl"; +#endif +#ifdef WITH_VULKAN_BACKEND + std::cout << ",vulkan"; +#endif + std::cout << "]"; + std::cout << " [--gpu-shader-filter ]"; + std::cout << " \n"; exit(1); } int exit_code = 0; + blender::gpu::shader_builder::ShaderBuilder builder; + builder.init_system(); + struct NamedBackend { std::string name; eGPUBackendType backend; @@ -107,14 +173,21 @@ int main(int argc, const char *argv[]) blender::Vector backends_to_validate; #ifdef WITH_OPENGL_BACKEND - backends_to_validate.append({"OpenGL", GPU_BACKEND_OPENGL}); + if (ELEM(gpu_backend_arg, "", "opengl")) { + backends_to_validate.append({"OpenGL", GPU_BACKEND_OPENGL}); + } #endif #ifdef WITH_METAL_BACKEND - backends_to_validate.append({"Metal", GPU_BACKEND_METAL}); + if (ELEM(gpu_backend_arg, "", "metal")) { + backends_to_validate.append({"Metal", GPU_BACKEND_METAL}); + } #endif #ifdef WITH_VULKAN_BACKEND - backends_to_validate.append({"Vulkan", GPU_BACKEND_VULKAN}); + if (ELEM(gpu_backend_arg, "", "vulkan")) { + backends_to_validate.append({"Vulkan", GPU_BACKEND_VULKAN}); + } #endif + for (NamedBackend &backend : backends_to_validate) { GPU_backend_type_selection_set(backend.backend); if (!GPU_backend_supported()) { @@ -122,18 +195,24 @@ int main(int argc, const char *argv[]) backend.name.c_str()); continue; } - blender::gpu::shader_builder::ShaderBuilder builder; - builder.init(); - if (!builder.bake_create_infos()) { - printf("Shader compilation failed for %s backend\n", backend.name.c_str()); - exit_code = 1; + if (builder.init_context()) { + if (!builder.bake_create_infos(shader_name_starts_with_filter_arg.c_str())) { + printf("Shader compilation failed for %s backend\n", backend.name.c_str()); + exit_code = 1; + } + else { + printf("%s backend shader compilation succeeded.\n", backend.name.c_str()); + } + builder.exit_context(); } else { - printf("%s backend shader compilation succeeded.\n", backend.name.c_str()); + printf("Shader compilation skipped for %s backend. Context could not be created.\n", + backend.name.c_str()); } - builder.exit(); } + builder.exit_system(); + exit(exit_code); return exit_code; } diff --git a/source/blender/gpu/intern/gpu_shader_create_info.cc b/source/blender/gpu/intern/gpu_shader_create_info.cc index 74aa9cbb6fb..2fb1c551630 100644 --- a/source/blender/gpu/intern/gpu_shader_create_info.cc +++ b/source/blender/gpu/intern/gpu_shader_create_info.cc @@ -503,6 +503,14 @@ void gpu_shader_create_info_init() /* GPencil stroke. */ gpu_shader_gpencil_stroke = gpu_shader_gpencil_stroke_no_geom; + + /* NOTE: As atomic data types can alter shader gen if native atomics are unsupported, we need + * to use differing create info's to handle the tile optimized check. This does prevent + * the shadow techniques from being dynamically switchable . */ + const bool is_tile_based_arch = (GPU_platform_architecture() == GPU_ARCHITECTURE_TBDR); + if (is_tile_based_arch) { + eevee_shadow_data = eevee_shadow_data_non_atomic; + } } #endif @@ -524,7 +532,7 @@ void gpu_shader_create_info_init() } /* TEST */ - // gpu_shader_create_info_compile_all(); + // gpu_shader_create_info_compile(nullptr); } void gpu_shader_create_info_exit() @@ -540,15 +548,22 @@ void gpu_shader_create_info_exit() delete g_interfaces; } -bool gpu_shader_create_info_compile_all() +bool gpu_shader_create_info_compile(const char *name_starts_with_filter) { using namespace blender::gpu; int success = 0; + int skipped_filter = 0; int skipped = 0; int total = 0; for (ShaderCreateInfo *info : g_create_infos->values()) { info->finalize(); if (info->do_static_compilation_) { + if (name_starts_with_filter && + !info->name_.startswith(blender::StringRefNull(name_starts_with_filter))) + { + skipped_filter++; + continue; + } if ((info->metal_backend_only_ && GPU_backend_get_type() != GPU_BACKEND_METAL) || (GPU_compute_shader_support() == false && info->compute_source_ != nullptr) || (GPU_geometry_shader_support() == false && info->geometry_source_ != nullptr) || @@ -614,6 +629,9 @@ bool gpu_shader_create_info_compile_all() } } printf("Shader Test compilation result: %d / %d passed", success, total); + if (skipped_filter > 0) { + printf(" (skipped %d when filtering)", skipped_filter); + } if (skipped > 0) { printf(" (skipped %d for compatibility reasons)", skipped); } diff --git a/source/blender/gpu/intern/gpu_shader_create_info.hh b/source/blender/gpu/intern/gpu_shader_create_info.hh index aac2b8523f8..20ae857e893 100644 --- a/source/blender/gpu/intern/gpu_shader_create_info.hh +++ b/source/blender/gpu/intern/gpu_shader_create_info.hh @@ -265,6 +265,20 @@ enum class ImageType { DEPTH_2D_ARRAY, DEPTH_CUBE, DEPTH_CUBE_ARRAY, + /** Atomic texture type wrappers. + * For OpenGL, these map to the equivalent (U)INT_* types. + * NOTE: Atomic variants MUST be used if the texture bound to this resource has usage flag: + * `GPU_TEXTURE_USAGE_ATOMIC`, even if atomic texture operations are not used in the given + * shader. + * The shader source MUST also utilize the correct atomic sampler handle e.g. + * `usampler2DAtomic` in conjunction with these types, for passing texture/image resources into + * functions. */ + UINT_2D_ATOMIC, + UINT_2D_ARRAY_ATOMIC, + UINT_3D_ATOMIC, + INT_2D_ATOMIC, + INT_2D_ARRAY_ATOMIC, + INT_3D_ATOMIC }; /* Storage qualifiers. */ diff --git a/source/blender/gpu/intern/gpu_shader_create_info_private.hh b/source/blender/gpu/intern/gpu_shader_create_info_private.hh index b1947c2c085..22c772919c2 100644 --- a/source/blender/gpu/intern/gpu_shader_create_info_private.hh +++ b/source/blender/gpu/intern/gpu_shader_create_info_private.hh @@ -22,7 +22,7 @@ extern "C" { void gpu_shader_create_info_init(); void gpu_shader_create_info_exit(); -bool gpu_shader_create_info_compile_all(); +bool gpu_shader_create_info_compile(const char *name_starts_with_filter); /** Runtime create infos are not registered in the dictionary and cannot be searched. */ const GPUShaderCreateInfo *gpu_shader_create_info_get(const char *info_name); diff --git a/source/blender/gpu/intern/gpu_shader_dependency.cc b/source/blender/gpu/intern/gpu_shader_dependency.cc index d69b4a2c47e..d5e9e945514 100644 --- a/source/blender/gpu/intern/gpu_shader_dependency.cc +++ b/source/blender/gpu/intern/gpu_shader_dependency.cc @@ -575,7 +575,7 @@ struct GPUSource { CHECK(char_end, input, cursor, "Malformed char literal. Missing ending `'`."); StringRef input_char = input.substr(char_start, char_end - char_start); - if (input_char.size() == 0) { + if (input_char.is_empty()) { CHECK(-1, input, cursor, "Malformed char literal. Empty character constant"); } diff --git a/source/blender/gpu/intern/gpu_shader_interface.cc b/source/blender/gpu/intern/gpu_shader_interface.cc index e450f4f8ca6..bc135866a71 100644 --- a/source/blender/gpu/intern/gpu_shader_interface.cc +++ b/source/blender/gpu/intern/gpu_shader_interface.cc @@ -29,7 +29,7 @@ ShaderInterface::~ShaderInterface() static void sort_input_list(MutableSpan dst) { - if (dst.size() == 0) { + if (dst.is_empty()) { return; } diff --git a/source/blender/gpu/intern/gpu_shader_log.cc b/source/blender/gpu/intern/gpu_shader_log.cc index 0997c89b788..d97a1fb6dfb 100644 --- a/source/blender/gpu/intern/gpu_shader_log.cc +++ b/source/blender/gpu/intern/gpu_shader_log.cc @@ -77,7 +77,7 @@ void Shader::print_log(Span sources, } #endif } - if (sources_end_line.size() == 0) { + if (sources_end_line.is_empty()) { sources_end_line.append(0); } diff --git a/source/blender/gpu/metal/mtl_backend.mm b/source/blender/gpu/metal/mtl_backend.mm index c8d49f050e2..6263b2f1237 100644 --- a/source/blender/gpu/metal/mtl_backend.mm +++ b/source/blender/gpu/metal/mtl_backend.mm @@ -392,6 +392,14 @@ void MTLBackend::capabilities_init(MTLContext *ctx) * with Apple Silicon GPUs. Disabling for now to avoid erroneous rendering. */ MTLBackend::capabilities.supports_texture_gather = [device hasUnifiedMemory]; + /* Texture atomics supported in Metal 3.1. */ + MTLBackend::capabilities.supports_texture_atomics = false; +#if defined(MAC_OS_VERSION_14_0) + if (@available(macOS 14.0, *)) { + MTLBackend::capabilities.supports_texture_atomics = true; + } +#endif + /* Common Global Capabilities. */ GCaps.max_texture_size = ([device supportsFamily:MTLGPUFamilyApple3] || MTLBackend::capabilities.supports_family_mac1) ? diff --git a/source/blender/gpu/metal/mtl_capabilities.hh b/source/blender/gpu/metal/mtl_capabilities.hh index 94c5ac5b0c9..b928a0b0870 100644 --- a/source/blender/gpu/metal/mtl_capabilities.hh +++ b/source/blender/gpu/metal/mtl_capabilities.hh @@ -47,6 +47,7 @@ struct MTLCapabilities { bool supports_sampler_border_color = false; bool supports_argument_buffers_tier2 = false; bool supports_texture_gather = false; + bool supports_texture_atomics = false; /* GPU Family */ bool supports_family_mac1 = false; diff --git a/source/blender/gpu/metal/mtl_context.mm b/source/blender/gpu/metal/mtl_context.mm index c7a866446fc..c6e8839013b 100644 --- a/source/blender/gpu/metal/mtl_context.mm +++ b/source/blender/gpu/metal/mtl_context.mm @@ -1013,7 +1013,9 @@ bool MTLContext::ensure_render_pipeline_state(MTLPrimitiveType mtl_prim_type) GPU_matrix_bind(reinterpret_cast( static_cast(this->pipeline_state.active_shader))); - /* Bind buffers. */ + /* Bind buffers. + * NOTE: `ensure_buffer_bindings` must be called after `ensure_texture_bindings` to allow + * for binding of buffer-backed texture's data buffer and metadata. */ this->ensure_buffer_bindings(rec, shader_interface, pipeline_state_instance); /* Bind Null attribute buffer, if needed. */ @@ -1636,6 +1638,21 @@ void MTLContext::ensure_texture_bindings( rps.bind_fragment_sampler(bound_sampler, use_argument_buffer_for_samplers, slot); } + /* Bind texture buffer to associated SSBO slot. */ + if (shader_texture_info.texture_buffer_ssbo_location != -1) { + BLI_assert(bound_texture->usage_get() & GPU_TEXTURE_USAGE_ATOMIC); + MTLStorageBuf *tex_storage_buf = bound_texture->get_storagebuf(); + BLI_assert(tex_storage_buf != nullptr); + tex_storage_buf->bind(shader_texture_info.texture_buffer_ssbo_location); + /* Update bound texture metadata. + * components packed int uint4 (sizeX, sizeY, sizeZ/Layers, bytes per row). */ + MTLShader *active_shader = this->pipeline_state.active_shader; + const int *metadata = bound_texture->get_texture_metdata_ptr(); + BLI_assert(shader_texture_info.buffer_metadata_uniform_loc != -1); + active_shader->uniform_int( + shader_texture_info.buffer_metadata_uniform_loc, 4, 1, metadata); + } + /* Texture state resolved, no need to bind dummy texture */ bind_dummy_texture = false; } @@ -1866,6 +1883,21 @@ void MTLContext::ensure_texture_bindings( cs.bind_compute_sampler(bound_sampler, use_argument_buffer_for_samplers, slot); } + /* Bind texture buffer to associated SSBO slot. */ + if (shader_texture_info.texture_buffer_ssbo_location != -1) { + BLI_assert(bound_texture->usage_get() & GPU_TEXTURE_USAGE_ATOMIC); + MTLStorageBuf *tex_storage_buf = bound_texture->get_storagebuf(); + BLI_assert(tex_storage_buf != nullptr); + tex_storage_buf->bind(shader_texture_info.texture_buffer_ssbo_location); + /* Update bound texture metadata. + * components packed int uint4 (sizeX, sizeY, sizeZ/Layers, bytes per row). */ + MTLShader *active_shader = this->pipeline_state.active_shader; + const int *metadata = bound_texture->get_texture_metdata_ptr(); + BLI_assert(shader_texture_info.buffer_metadata_uniform_loc != -1); + active_shader->uniform_int( + shader_texture_info.buffer_metadata_uniform_loc, 4, 1, metadata); + } + /* Texture state resolved, no need to bind dummy texture */ bind_dummy_texture = false; } @@ -2207,8 +2239,6 @@ void MTLContext::compute_dispatch(int groups_x_len, int groups_y_len, int groups MTLComputeState &cs = this->main_command_buffer.get_compute_state(); cs.bind_pso(compute_pso_inst.pso); - /* Bind buffers. */ - this->ensure_buffer_bindings(compute_encoder, shader_interface, compute_pso_inst); /** Ensure resource bindings. */ /* Texture Bindings. */ /* We will iterate through all texture bindings on the context and determine if any of the @@ -2217,6 +2247,11 @@ void MTLContext::compute_dispatch(int groups_x_len, int groups_y_len, int groups this->ensure_texture_bindings(compute_encoder, shader_interface, compute_pso_inst); } + /* Bind buffers. + * NOTE: `ensure_buffer_bindings` must be called after `ensure_texture_bindings` to allow + * for binding of buffer-backed texture's data buffer and metadata. */ + this->ensure_buffer_bindings(compute_encoder, shader_interface, compute_pso_inst); + /* Dispatch compute. */ [compute_encoder dispatchThreadgroups:MTLSizeMake(max_ii(groups_x_len, 1), max_ii(groups_y_len, 1), @@ -2252,8 +2287,6 @@ void MTLContext::compute_dispatch_indirect(StorageBuf *indirect_buf) MTLComputeState &cs = this->main_command_buffer.get_compute_state(); cs.bind_pso(compute_pso_inst.pso); - /* Bind buffers. */ - this->ensure_buffer_bindings(compute_encoder, shader_interface, compute_pso_inst); /** Ensure resource bindings. */ /* Texture Bindings. */ /* We will iterate through all texture bindings on the context and determine if any of the @@ -2262,6 +2295,11 @@ void MTLContext::compute_dispatch_indirect(StorageBuf *indirect_buf) this->ensure_texture_bindings(compute_encoder, shader_interface, compute_pso_inst); } + /* Bind buffers. + * NOTE: `ensure_buffer_bindings` must be called after `ensure_texture_bindings` to allow + * for binding of buffer-backed texture's data buffer and metadata. */ + this->ensure_buffer_bindings(compute_encoder, shader_interface, compute_pso_inst); + /* Indirect Dispatch compute. */ MTLStorageBuf *mtlssbo = static_cast(indirect_buf); id mtl_indirect_buf = mtlssbo->get_metal_buffer(); diff --git a/source/blender/gpu/metal/mtl_framebuffer.mm b/source/blender/gpu/metal/mtl_framebuffer.mm index 7f0975daec8..8eb55792f59 100644 --- a/source/blender/gpu/metal/mtl_framebuffer.mm +++ b/source/blender/gpu/metal/mtl_framebuffer.mm @@ -763,11 +763,6 @@ void MTLFrameBuffer::update_attachments(bool /*update_viewport*/) this->size_set(size[0], size[1]); srgb_ = (GPU_texture_format(attach.tex) == GPU_SRGB8_A8); } - else { - /* Empty frame-buffer. */ - width_ = 0; - height_ = 0; - } /* We have now updated our internal structures. */ dirty_attachments_ = false; @@ -1247,7 +1242,6 @@ void MTLFrameBuffer::ensure_render_target_size() if (colour_attachment_count_ == 0 && !this->has_depth_attachment() && !this->has_stencil_attachment()) { - /* Reset default size for empty framebuffer. */ this->default_size_set(0, 0); } @@ -1495,16 +1489,9 @@ bool MTLFrameBuffer::validate_render_pass() this->update_attachments(true); } - /* Verify attachment count. */ - int used_attachments = 0; - for (int attachment = 0; attachment < GPU_FB_MAX_COLOR_ATTACHMENT; attachment++) { - if (mtl_color_attachments_[attachment].used) { - used_attachments++; - } - } - used_attachments += (mtl_depth_attachment_.used) ? 1 : 0; - used_attachments += (mtl_stencil_attachment_.used) ? 1 : 0; - return (used_attachments > 0); + /* NOTE: Attachment-less render targets now supported so we do not need to validate attachment + * counts. Keeping this function in place if other parameters need to be validate. */ + return true; } MTLLoadAction mtl_load_action_from_gpu(eGPULoadOp action) @@ -1796,6 +1783,17 @@ MTLRenderPassDescriptor *MTLFrameBuffer::bake_render_pass_descriptor(bool load_c else { framebuffer_descriptor_[descriptor_config].stencilAttachment.texture = nil; } + + /* Attachmentless render support. */ + int total_num_attachments = colour_attachment_count_ + (mtl_depth_attachment_.used ? 1 : 0) + + (mtl_stencil_attachment_.used ? 1 : 0); + if (total_num_attachments == 0) { + BLI_assert(width_ > 0 && height_ > 0); + framebuffer_descriptor_[descriptor_config].renderTargetWidth = width_; + framebuffer_descriptor_[descriptor_config].renderTargetHeight = height_; + framebuffer_descriptor_[descriptor_config].defaultRasterSampleCount = 1; + } + descriptor_dirty_[descriptor_config] = false; } /* Clear dirty state flags. */ diff --git a/source/blender/gpu/metal/mtl_shader_generator.hh b/source/blender/gpu/metal/mtl_shader_generator.hh index ed2c6de1e54..d1c4b927964 100644 --- a/source/blender/gpu/metal/mtl_shader_generator.hh +++ b/source/blender/gpu/metal/mtl_shader_generator.hh @@ -227,6 +227,8 @@ struct MSLBufferBlock { uint slot; uint location; shader::Qualifier qualifiers; + /* Flag for use with texture atomic fallback. */ + bool is_texture_buffer = false; bool operator==(const MSLBufferBlock &right) const { @@ -254,6 +256,9 @@ struct MSLTextureResource { /* Explicit bind index provided by ShaderCreateInfo. */ uint location; + /* Atomic fallback buffer information. */ + int atomic_fallback_buffer_ssbo_id = -1; + eGPUTextureType get_texture_binding_type() const; eGPUSamplerFormat get_sampler_format() const; diff --git a/source/blender/gpu/metal/mtl_shader_generator.mm b/source/blender/gpu/metal/mtl_shader_generator.mm index cfdbfc3566a..2fc265914be 100644 --- a/source/blender/gpu/metal/mtl_shader_generator.mm +++ b/source/blender/gpu/metal/mtl_shader_generator.mm @@ -1804,6 +1804,8 @@ void MSLGeneratorInterface::prepare_from_createinfo(const shader::ShaderCreateIn int ubo_buffer_slot_id_ = 0; int storage_buffer_slot_id_ = 0; + uint max_storage_buffer_location = 0; + /* Determine max sampler slot for image resource offset, when not using auto resource location, * as image resources cannot overlap sampler ranges. */ int max_sampler_slot = 0; @@ -1898,6 +1900,7 @@ void MSLGeneratorInterface::prepare_from_createinfo(const shader::ShaderCreateIn ubo.qualifiers = shader::Qualifier::READ; ubo.type_name = res.uniformbuf.type_name; + ubo.is_texture_buffer = false; ubo.is_array = (array_offset > -1); if (ubo.is_array) { /* If is array UBO, strip out array tag from name. */ @@ -1923,10 +1926,13 @@ void MSLGeneratorInterface::prepare_from_createinfo(const shader::ShaderCreateIn ssbo.slot = storage_buffer_slot_id_++; ssbo.location = (create_info_->auto_resource_location_) ? ssbo.slot : res.slot; + max_storage_buffer_location = max_uu(max_storage_buffer_location, ssbo.location); + BLI_assert(ssbo.location >= 0 && ssbo.location < MTL_MAX_BUFFER_BINDINGS); ssbo.qualifiers = res.storagebuf.qualifiers; ssbo.type_name = res.storagebuf.type_name; + ssbo.is_texture_buffer = false; ssbo.is_array = (array_offset > -1); if (ssbo.is_array) { /* If is array UBO, strip out array tag from name. */ @@ -1943,6 +1949,55 @@ void MSLGeneratorInterface::prepare_from_createinfo(const shader::ShaderCreateIn } } + /* For texture atomic fallback support, bind texture source buffers and data buffer as storage + * blocks. */ + if (!MTLBackend::get_capabilities().supports_texture_atomics) { + uint atomic_fallback_buffer_count = 0; + for (MSLTextureResource &tex : texture_samplers) { + if (ELEM(tex.type, + ImageType::UINT_2D_ATOMIC, + ImageType::UINT_2D_ARRAY_ATOMIC, + ImageType::UINT_3D_ATOMIC, + ImageType::INT_2D_ATOMIC, + ImageType::INT_2D_ARRAY_ATOMIC, + ImageType::INT_3D_ATOMIC)) + { + /* Add storage-buffer bind-point. */ + MSLBufferBlock ssbo; + + /* We maintain two bind indices. "Slot" refers to the storage index buffer(N) in which + * we will bind the resource. "Location" refers to the explicit bind index specified + * in ShaderCreateInfo. + * NOTE: For texture buffers, we will accumulate these after all other storage buffers. + */ + ssbo.slot = storage_buffer_slot_id_++; + ssbo.location = max_storage_buffer_location + 1 + atomic_fallback_buffer_count; + + /* Flag atomic fallback buffer id and location. + * ID is used to determine order for accessing parameters, while + * location is used to extract the explicit bind point for the buffer. */ + tex.atomic_fallback_buffer_ssbo_id = storage_blocks.size(); + + BLI_assert(ssbo.location >= 0 && ssbo.location < MTL_MAX_BUFFER_BINDINGS); + + /* Qualifier should be read write and type is either uint or int. */ + ssbo.qualifiers = Qualifier::READ_WRITE; + ssbo.type_name = tex.get_msl_return_type_str(); + ssbo.is_array = false; + ssbo.name = tex.name + "_storagebuf"; + ssbo.stage = ShaderStage::ANY; + ssbo.is_texture_buffer = true; + storage_blocks.append(ssbo); + + /* Add uniform for metadata. */ + MSLUniform uniform(shader::Type::IVEC4, tex.name + "_metadata", false, 1); + uniforms.append(uniform); + + atomic_fallback_buffer_count++; + } + } + } + /* Assign maximum buffer. */ max_buffer_slot = storage_buffer_slot_id_ + ubo_buffer_slot_id_ + 1; @@ -2978,7 +3033,7 @@ std::string MSLGeneratorInterface::generate_msl_uniform_block_population(ShaderS for (const MSLBufferBlock &ssbo : this->storage_blocks) { /* Only include blocks which are used within this stage. */ - if (bool(ssbo.stage & stage)) { + if (bool(ssbo.stage & stage) && !ssbo.is_texture_buffer) { /* Generate UBO reference assignment. * NOTE(Metal): We append `_local` post-fix onto the class member name * for the ubo to avoid name collision with the UBO accessor macro. @@ -3388,6 +3443,30 @@ std::string MSLGeneratorInterface::generate_msl_texture_vars(ShaderStage shader_ << this->texture_samplers[i].name << ".samp = &" << this->texture_samplers[i].name << "_sampler;" << std::endl; } + + /* Assign texture buffer reference and uniform metadata (if used). */ + int tex_buf_id = this->texture_samplers[i].atomic_fallback_buffer_ssbo_id; + if (tex_buf_id != -1) { + MSLBufferBlock &ssbo = this->storage_blocks[tex_buf_id]; + out << "\t" << get_shader_stage_instance_name(shader_stage) << "." + << this->texture_samplers[i].name << ".buffer = " << ssbo.name << ";" << std::endl; + out << "\t" << get_shader_stage_instance_name(shader_stage) << "." + << this->texture_samplers[i].name << ".aligned_width = uniforms->" + << this->texture_samplers[i].name << "_metadata.w;" << std::endl; + + /* Buffer-backed 2D Array and 3D texture types are not natively supported so texture size + * is passed in as uniform metadata for 3D to 2D coordinate remapping. */ + if (ELEM(this->texture_samplers[i].type, + ImageType::UINT_2D_ARRAY_ATOMIC, + ImageType::UINT_3D_ATOMIC, + ImageType::INT_2D_ARRAY_ATOMIC, + ImageType::INT_3D_ATOMIC)) + { + out << "\t" << get_shader_stage_instance_name(shader_stage) << "." + << this->texture_samplers[i].name << ".texture_size = ushort3(uniforms->" + << this->texture_samplers[i].name << "_metadata.xyz);" << std::endl; + } + } } } out << std::endl; @@ -3623,6 +3702,13 @@ MTLShaderInterface *MSLGeneratorInterface::bake_shader_interface(const char *nam /* Texture/sampler bindings to interface. */ for (const MSLTextureResource &input_texture : this->texture_samplers) { + /* Determine SSBO bind location for buffer-baked texture's data. */ + uint tex_buf_ssbo_location = -1; + uint tex_buf_ssbo_id = input_texture.atomic_fallback_buffer_ssbo_id; + if (tex_buf_ssbo_id != -1) { + tex_buf_ssbo_location = this->storage_blocks[tex_buf_ssbo_id].location; + } + interface->add_texture(name_buffer_copystr(&interface->name_buffer_, input_texture.name.c_str(), name_buffer_size, @@ -3632,7 +3718,8 @@ MTLShaderInterface *MSLGeneratorInterface::bake_shader_interface(const char *nam input_texture.get_texture_binding_type(), input_texture.get_sampler_format(), input_texture.is_texture_sampler, - input_texture.stage); + input_texture.stage, + tex_buf_ssbo_location); } /* Sampler Parameters. */ @@ -3655,6 +3742,7 @@ MTLShaderInterface *MSLGeneratorInterface::bake_shader_interface(const char *nam std::string MSLTextureResource::get_msl_texture_type_str() const { + bool supports_native_atomics = MTLBackend::get_capabilities().supports_texture_atomics; /* Add Types as needed. */ switch (this->type) { case ImageType::FLOAT_1D: { @@ -3753,6 +3841,31 @@ std::string MSLTextureResource::get_msl_texture_type_str() const case ImageType::UINT_BUFFER: { return "texture_buffer"; } + /* If texture atomics are natively supported, we use the native texture type, otherwise all + * other formats are implemented via texture2d. */ + case ImageType::INT_2D_ATOMIC: + case ImageType::UINT_2D_ATOMIC: { + return "texture2d"; + } + case ImageType::INT_2D_ARRAY_ATOMIC: + case ImageType::UINT_2D_ARRAY_ATOMIC: { + if (supports_native_atomics) { + return "texture2d_array"; + } + else { + return "texture2d"; + } + } + case ImageType::INT_3D_ATOMIC: + case ImageType::UINT_3D_ATOMIC: { + if (supports_native_atomics) { + return "texture3d"; + } + else { + return "texture2d"; + } + } + default: { /* Unrecognized type. */ BLI_assert_unreachable(); @@ -3763,6 +3876,7 @@ std::string MSLTextureResource::get_msl_texture_type_str() const std::string MSLTextureResource::get_msl_wrapper_type_str() const { + bool supports_native_atomics = MTLBackend::get_capabilities().supports_texture_atomics; /* Add Types as needed. */ switch (this->type) { case ImageType::FLOAT_1D: { @@ -3861,6 +3975,35 @@ std::string MSLTextureResource::get_msl_wrapper_type_str() const case ImageType::UINT_BUFFER: { return "_mtl_combined_image_sampler_buffer"; } + /* If native texture atomics are unsupported, map types to fallback atomic structures which + * contain a buffer pointer and metadata members for size and alignment. */ + case ImageType::INT_2D_ATOMIC: + case ImageType::UINT_2D_ATOMIC: { + if (supports_native_atomics) { + return "_mtl_combined_image_sampler_2d"; + } + else { + return "_mtl_combined_image_sampler_2d_atomic_fallback"; + } + } + case ImageType::INT_3D_ATOMIC: + case ImageType::UINT_3D_ATOMIC: { + if (supports_native_atomics) { + return "_mtl_combined_image_sampler_3d"; + } + else { + return "_mtl_combined_image_sampler_3d_atomic_fallback"; + } + } + case ImageType::INT_2D_ARRAY_ATOMIC: + case ImageType::UINT_2D_ARRAY_ATOMIC: { + if (supports_native_atomics) { + return "_mtl_combined_image_sampler_2d"; + } + else { + return "_mtl_combined_image_sampler_2d_array_atomic_fallback"; + } + } default: { /* Unrecognized type. */ BLI_assert_unreachable(); @@ -3900,7 +4043,10 @@ std::string MSLTextureResource::get_msl_return_type_str() const case ImageType::INT_1D_ARRAY: case ImageType::INT_2D_ARRAY: case ImageType::INT_CUBE_ARRAY: - case ImageType::INT_BUFFER: { + case ImageType::INT_BUFFER: + case ImageType::INT_2D_ATOMIC: + case ImageType::INT_2D_ARRAY_ATOMIC: + case ImageType::INT_3D_ATOMIC: { return "int"; } @@ -3912,7 +4058,10 @@ std::string MSLTextureResource::get_msl_return_type_str() const case ImageType::UINT_1D_ARRAY: case ImageType::UINT_2D_ARRAY: case ImageType::UINT_CUBE_ARRAY: - case ImageType::UINT_BUFFER: { + case ImageType::UINT_BUFFER: + case ImageType::UINT_2D_ATOMIC: + case ImageType::UINT_2D_ARRAY_ATOMIC: + case ImageType::UINT_3D_ATOMIC: { return "uint32_t"; } @@ -4003,10 +4152,14 @@ eGPUTextureType MSLTextureResource::get_texture_binding_type() const case ImageType::UINT_1D: { return GPU_TEXTURE_1D; } - case ImageType::UINT_2D: { + case ImageType::UINT_2D: + case ImageType::UINT_2D_ATOMIC: + case ImageType::INT_2D_ATOMIC: { return GPU_TEXTURE_2D; } - case ImageType::UINT_3D: { + case ImageType::UINT_3D: + case ImageType::UINT_3D_ATOMIC: + case ImageType::INT_3D_ATOMIC: { return GPU_TEXTURE_3D; } case ImageType::UINT_CUBE: { @@ -4015,7 +4168,9 @@ eGPUTextureType MSLTextureResource::get_texture_binding_type() const case ImageType::UINT_1D_ARRAY: { return GPU_TEXTURE_1D_ARRAY; } - case ImageType::UINT_2D_ARRAY: { + case ImageType::UINT_2D_ARRAY: + case ImageType::UINT_2D_ARRAY_ATOMIC: + case ImageType::INT_2D_ARRAY_ATOMIC: { return GPU_TEXTURE_2D_ARRAY; } case ImageType::UINT_CUBE_ARRAY: { @@ -4051,6 +4206,9 @@ eGPUSamplerFormat MSLTextureResource::get_sampler_format() const case ImageType::INT_3D: case ImageType::INT_CUBE: case ImageType::INT_CUBE_ARRAY: + case ImageType::INT_2D_ATOMIC: + case ImageType::INT_3D_ATOMIC: + case ImageType::INT_2D_ARRAY_ATOMIC: return GPU_SAMPLER_TYPE_INT; case ImageType::UINT_BUFFER: case ImageType::UINT_1D: @@ -4060,6 +4218,9 @@ eGPUSamplerFormat MSLTextureResource::get_sampler_format() const case ImageType::UINT_3D: case ImageType::UINT_CUBE: case ImageType::UINT_CUBE_ARRAY: + case ImageType::UINT_2D_ATOMIC: + case ImageType::UINT_3D_ATOMIC: + case ImageType::UINT_2D_ARRAY_ATOMIC: return GPU_SAMPLER_TYPE_UINT; case ImageType::SHADOW_2D: case ImageType::SHADOW_2D_ARRAY: diff --git a/source/blender/gpu/metal/mtl_shader_interface.hh b/source/blender/gpu/metal/mtl_shader_interface.hh index 88d8f3c8cca..9506d9e2674 100644 --- a/source/blender/gpu/metal/mtl_shader_interface.hh +++ b/source/blender/gpu/metal/mtl_shader_interface.hh @@ -142,6 +142,10 @@ struct MTLShaderTexture { ShaderStage stage_mask; /* Whether texture resource is expected to be image or sampler. */ bool is_texture_sampler; + /* SSBO index for texture buffer binding. */ + int texture_buffer_ssbo_location = -1; + /* Uniform location for texture buffer metadata. */ + int buffer_metadata_uniform_loc = -1; }; struct MTLShaderSampler { @@ -234,7 +238,8 @@ class MTLShaderInterface : public ShaderInterface { eGPUTextureType tex_binding_type, eGPUSamplerFormat sampler_format, bool is_texture_sampler, - ShaderStage stage_mask = ShaderStage::FRAGMENT); + ShaderStage stage_mask = ShaderStage::FRAGMENT, + int tex_buffer_ssbo_location = -1); void add_push_constant_block(uint32_t name_offset); /* Resolve and cache locations of builtin uniforms and uniform blocks. */ diff --git a/source/blender/gpu/metal/mtl_shader_interface.mm b/source/blender/gpu/metal/mtl_shader_interface.mm index 65c425b2741..2c0d06d84eb 100644 --- a/source/blender/gpu/metal/mtl_shader_interface.mm +++ b/source/blender/gpu/metal/mtl_shader_interface.mm @@ -225,7 +225,8 @@ void MTLShaderInterface::add_texture(uint32_t name_offset, eGPUTextureType tex_binding_type, eGPUSamplerFormat sampler_format, bool is_texture_sampler, - ShaderStage stage_mask) + ShaderStage stage_mask, + int tex_buffer_ssbo_location) { BLI_assert(texture_slot >= 0 && texture_slot < GPU_max_textures()); BLI_assert(sampler_format < GPU_SAMPLER_TYPE_MAX); @@ -241,6 +242,7 @@ void MTLShaderInterface::add_texture(uint32_t name_offset, tex.is_texture_sampler = is_texture_sampler; tex.stage_mask = stage_mask; tex.used = true; + tex.texture_buffer_ssbo_location = tex_buffer_ssbo_location; total_textures_++; max_texture_index_ = max_ii(max_texture_index_, texture_slot); } @@ -410,6 +412,25 @@ void MTLShaderInterface::prepare_common_shader_inputs() /* Map builtin uniform indices to uniform binding locations. */ this->map_builtins(); + + /* Pre-calculate texture metadata uniform locations for buffer-backed textures. */ + for (int texture_index = 0; texture_index <= max_texture_index_; texture_index++) { + MTLShaderTexture &shd_tex = textures_[texture_index]; + if (shd_tex.texture_buffer_ssbo_location != -1) { + char uniform_name[256]; + const char *tex_name = get_name_at_offset(shd_tex.name_offset); + BLI_snprintf(uniform_name, 256, "%s_metadata", tex_name); + const ShaderInput *uni = this->uniform_get(uniform_name); + BLI_assert_msg(uni != nullptr, + "Could not find expected metadata uniform slot for buffer-backed texture."); + if (uni != nullptr) { + BLI_assert(uni->location >= 0); + if (uni->location >= 0) { + shd_tex.buffer_metadata_uniform_loc = uni->location; + } + } + } + } } void MTLShaderInterface::set_sampler_properties(bool use_argument_buffer, diff --git a/source/blender/gpu/metal/mtl_storage_buffer.hh b/source/blender/gpu/metal/mtl_storage_buffer.hh index af114c1e768..aaba20ad2d1 100644 --- a/source/blender/gpu/metal/mtl_storage_buffer.hh +++ b/source/blender/gpu/metal/mtl_storage_buffer.hh @@ -33,6 +33,7 @@ class MTLStorageBuf : public StorageBuf { MTL_STORAGE_BUF_TYPE_UNIFORMBUF = 1, MTL_STORAGE_BUF_TYPE_VERTBUF = 2, MTL_STORAGE_BUF_TYPE_INDEXBUF = 3, + MTL_STORAGE_BUF_TYPE_TEXTURE = 4, } storage_source_ = MTL_STORAGE_BUF_TYPE_DEFAULT; union { @@ -42,6 +43,7 @@ class MTLStorageBuf : public StorageBuf { MTLUniformBuf *uniform_buffer_; MTLVertBuf *vertex_buffer_; MTLIndexBuf *index_buffer_; + gpu::MTLTexture *texture_; }; /* Whether buffer has contents, if false, no GPU buffer will @@ -65,6 +67,7 @@ class MTLStorageBuf : public StorageBuf { MTLStorageBuf(MTLUniformBuf *uniform_buf, size_t size); MTLStorageBuf(MTLVertBuf *uniform_buf, size_t size); MTLStorageBuf(MTLIndexBuf *uniform_buf, size_t size); + MTLStorageBuf(MTLTexture *texture, size_t size); void update(const void *data) override; void bind(int slot) override; diff --git a/source/blender/gpu/metal/mtl_storage_buffer.mm b/source/blender/gpu/metal/mtl_storage_buffer.mm index 40006459f77..5ed2701a326 100644 --- a/source/blender/gpu/metal/mtl_storage_buffer.mm +++ b/source/blender/gpu/metal/mtl_storage_buffer.mm @@ -64,6 +64,15 @@ MTLStorageBuf::MTLStorageBuf(MTLIndexBuf *index_buf, size_t size) BLI_assert(index_buffer_ != nullptr); } +MTLStorageBuf::MTLStorageBuf(MTLTexture *texture, size_t size) + : StorageBuf(size, "Texture_as_SSBO") +{ + usage_ = GPU_USAGE_DYNAMIC; + storage_source_ = MTL_STORAGE_BUF_TYPE_TEXTURE; + texture_ = texture; + BLI_assert(texture_ != nullptr); +} + MTLStorageBuf::~MTLStorageBuf() { if (storage_source_ == MTL_STORAGE_BUF_TYPE_DEFAULT) { @@ -475,6 +484,15 @@ id MTLStorageBuf::get_metal_buffer() case MTL_STORAGE_BUF_TYPE_INDEXBUF: { source_buffer = index_buffer_->ibo_; } break; + /* SSBO buffer comes from Texture. */ + case MTL_STORAGE_BUF_TYPE_TEXTURE: { + BLI_assert(texture_); + /* Fetch metal texture to ensure it has been initialized. */ + id tex = texture_->get_metal_handle_base(); + BLI_assert(tex != nil); + UNUSED_VARS_NDEBUG(tex); + source_buffer = texture_->backing_buffer_; + } } /* Return Metal allocation handle and flag as used. */ diff --git a/source/blender/gpu/metal/mtl_texture.hh b/source/blender/gpu/metal/mtl_texture.hh index acc7b671a57..ddc64ca4f61 100644 --- a/source/blender/gpu/metal/mtl_texture.hh +++ b/source/blender/gpu/metal/mtl_texture.hh @@ -127,6 +127,8 @@ namespace blender::gpu { class MTLContext; class MTLVertBuf; +class MTLStorageBuf; +class MTLBuffer; /* Metal Texture internal implementation. */ static const int MTL_MAX_MIPMAP_COUNT = 15; /* Max: 16384x16384 */ @@ -173,6 +175,7 @@ class MTLTexture : public Texture { friend class MTLContext; friend class MTLStateManager; friend class MTLFrameBuffer; + friend class MTLStorageBuf; private: /* Where the textures data comes from. */ @@ -191,9 +194,19 @@ class MTLTexture : public Texture { id texture_ = nil; /* Texture Storage. */ - id texture_buffer_ = nil; size_t aligned_w_ = 0; + /* Storage buffer view. + * Buffer backed textures can be wrapped with a storage buffer instance for direct data + * reading/writing. Required for atomic operations on texture data when texture atomics are + * unsupported. + * + * tex_buffer_metadata_ packs 4 parameters required by the shader to perform texture space + * remapping: (x, y, z) = (width, height, depth/layers) (w) = aligned width. */ + MTLBuffer *backing_buffer_ = nullptr; + MTLStorageBuf *storage_buffer_ = nullptr; + int tex_buffer_metadata_[4]; + /* Blit Frame-buffer. */ GPUFrameBuffer *blit_fb_ = nullptr; uint blit_fb_slice_ = 0; @@ -286,6 +299,13 @@ class MTLTexture : public Texture { return nil; } + MTLStorageBuf *get_storagebuf(); + + const int *get_texture_metdata_ptr() const + { + return tex_buffer_metadata_; + } + protected: bool init_internal() override; bool init_internal(GPUVertBuf *vbo) override; @@ -626,7 +646,6 @@ inline MTLTextureUsage mtl_usage_from_gpu(eGPUTextureUsage usage) #if defined(MAC_OS_VERSION_14_0) if (@available(macOS 14.0, *)) { if (usage & GPU_TEXTURE_USAGE_ATOMIC) { - mtl_usage = mtl_usage | MTLTextureUsageShaderAtomic; } } diff --git a/source/blender/gpu/metal/mtl_texture.mm b/source/blender/gpu/metal/mtl_texture.mm index 40826a04459..fe20598412a 100644 --- a/source/blender/gpu/metal/mtl_texture.mm +++ b/source/blender/gpu/metal/mtl_texture.mm @@ -22,6 +22,7 @@ #include "mtl_common.hh" #include "mtl_context.hh" #include "mtl_debug.hh" +#include "mtl_storage_buffer.hh" #include "mtl_texture.hh" #include "mtl_vertex_buffer.hh" @@ -45,7 +46,6 @@ void gpu::MTLTexture::mtl_texture_init() /* Metal properties. */ texture_ = nil; - texture_buffer_ = nil; mip_swizzle_view_ = nil; /* Binding information. */ @@ -1333,6 +1333,32 @@ void gpu::MTLTexture::clear(eGPUDataFormat data_format, const void *data) if (ELEM(type_, GPU_TEXTURE_1D, GPU_TEXTURE_1D_ARRAY)) { do_render_pass_clear = false; } + /* If texture is buffer-backed, clear directly on buffer. + * NOTE: This us currently only true for fallback atomic textures. */ + if (backing_buffer_ != nullptr) { + uint num_channels = to_component_len(format_); + bool fast_buf_clear_to_zero = true; + const uint *val = reinterpret_cast(data); + for (int i = 0; i < num_channels; i++) { + fast_buf_clear_to_zero = fast_buf_clear_to_zero && (val[i] == 0); + } + if (fast_buf_clear_to_zero) { + /* Fetch active context. */ + MTLContext *ctx = static_cast(unwrap(GPU_context_active_get())); + BLI_assert(ctx); + + /* Begin compute encoder. */ + id blit_encoder = + ctx->main_command_buffer.ensure_begin_blit_encoder(); + [blit_encoder fillBuffer:backing_buffer_->get_metal_buffer() + range:NSMakeRange(0, backing_buffer_->get_size()) + value:0]; + } + else { + BLI_assert_msg(false, "Non-zero buffer-backed texture clear not supported!"); + } + return; + } if (do_render_pass_clear) { /* Create clear frame-buffer for fast clear. */ @@ -2325,16 +2351,99 @@ void gpu::MTLTexture::ensure_baked() } } - /* Standard texture allocation. */ - texture_ = [ctx->device newTextureWithDescriptor:texture_descriptor_]; + /** Atomic texture fallback. + * If texture atomic operations are required and are not natively supported, we instead + * allocate a buffer-backed 2D texture and perform atomic operations on this instead. Support + * for 2D Array textures and 3D textures is achieved via packing layers into the 2D texture.*/ + bool native_texture_atomics = MTLBackend::get_capabilities().supports_texture_atomics; + if ((gpu_image_usage_flags_ & GPU_TEXTURE_USAGE_ATOMIC) && !native_texture_atomics) { + + /* Validate format support. */ + BLI_assert_msg(ELEM(type_, GPU_TEXTURE_2D, GPU_TEXTURE_2D_ARRAY, GPU_TEXTURE_3D), + "Texture atomic fallback support is only available for GPU_TEXTURE_2D, " + "GPU_TEXTURE_2D_ARRAY and GPU_TEXTURE_3D."); + + /* Re-assign 2D resolution to encompass all texture layers. + * Texture access is handled by remapping to a linear ID and using this in the destination + * texture. based on original with: LinearPxID = x + y*layer_w + z*(layer_h*layer_w); + * tx_2d.y = LinearPxID/2D_tex_width; + * tx_2d.x = LinearPxID - (tx_2d.y*2D_tex_width); */ + if (ELEM(type_, GPU_TEXTURE_2D_ARRAY, GPU_TEXTURE_3D)) { + /* Maximum 2D texture dimensions will be (16384, 16384) on all target platforms. */ + const uint max_width = 16384; + const uint max_height = 16384; + const uint pixels_res = w_ * h_ * d_; + + uint new_w = 0, new_h = 0; + if (pixels_res <= max_width) { + new_w = pixels_res; + new_h = 1; + } + else { + new_w = max_width; + new_h = ((pixels_res % new_w) == 0) ? (pixels_res / new_w) : ((pixels_res / new_w) + 1); + } + + texture_descriptor_.width = new_w; + texture_descriptor_.height = new_h; + + UNUSED_VARS_NDEBUG(max_height); + BLI_assert_msg(texture_descriptor_.width <= max_width && + texture_descriptor_.height <= max_height, + "Atomic fallback support texture is too large."); + } + + /* Allocate buffer for texture data. */ + size_t bytes_per_pixel = get_mtl_format_bytesize(mtl_format); + size_t bytes_per_row = bytes_per_pixel * texture_descriptor_.width; + size_t total_bytes = bytes_per_row * texture_descriptor_.height; + + backing_buffer_ = MTLContext::get_global_memory_manager()->allocate( + total_bytes, (gpu_image_usage_flags_ & GPU_TEXTURE_USAGE_HOST_READ)); + BLI_assert(backing_buffer_ != nullptr); + + /* NOTE: Fallback buffer-backed texture always set to Texture2D. */ + texture_descriptor_.textureType = MTLTextureType2D; + texture_descriptor_.depth = 1; + texture_descriptor_.arrayLength = 1; + + /* Write texture dimensions to metadata. This is required to remap 2D Array/3D sample + * coordinates into 2D texture space. */ + tex_buffer_metadata_[0] = w_; + tex_buffer_metadata_[1] = h_; + tex_buffer_metadata_[2] = d_; + + /* Texture allocation with buffer as backing storage. Bytes per row must satisfy alignment + * rules for device. */ + uint32_t align_requirement = static_cast( + [ctx->device minimumLinearTextureAlignmentForPixelFormat:mtl_format]); + size_t aligned_bytes_per_row = ceil_to_multiple_ul(bytes_per_row, align_requirement); + texture_ = [backing_buffer_->get_metal_buffer() + newTextureWithDescriptor:texture_descriptor_ + offset:0 + bytesPerRow:aligned_bytes_per_row]; + /* Aligned width. */ + tex_buffer_metadata_[3] = bytes_per_row / bytes_per_pixel; + #ifndef NDEBUG - if (gpu_image_usage_flags_ & GPU_TEXTURE_USAGE_MEMORYLESS) { - texture_.label = [NSString stringWithFormat:@"MemorylessTexture_%s", this->get_name()]; + texture_.label = [NSString + stringWithFormat:@"AtomicBufferBackedTexture_%s", this->get_name()]; +#endif } else { - texture_.label = [NSString stringWithFormat:@"Texture_%s", this->get_name()]; - } + + /* Standard texture allocation. */ + texture_ = [ctx->device newTextureWithDescriptor:texture_descriptor_]; + +#ifndef NDEBUG + if (gpu_image_usage_flags_ & GPU_TEXTURE_USAGE_MEMORYLESS) { + texture_.label = [NSString stringWithFormat:@"MemorylessTexture_%s", this->get_name()]; + } + else { + texture_.label = [NSString stringWithFormat:@"Texture_%s", this->get_name()]; + } #endif + } BLI_assert(texture_); is_baked_ = true; @@ -2359,6 +2468,18 @@ void gpu::MTLTexture::reset() is_dirty_ = true; } + /* Release backing Metal buffer, if used. */ + if (backing_buffer_ != nullptr) { + backing_buffer_->free(); + backing_buffer_ = nullptr; + } + + /* Release backing storage buffer, if used. */ + if (storage_buffer_ != nullptr) { + delete storage_buffer_; + storage_buffer_ = nullptr; + } + if (texture_no_srgb_ != nil) { [texture_no_srgb_ release]; texture_no_srgb_ = nil; @@ -2369,10 +2490,6 @@ void gpu::MTLTexture::reset() mip_swizzle_view_ = nil; } - if (texture_buffer_ != nil) { - [texture_buffer_ release]; - } - /* Blit framebuffer. */ if (blit_fb_) { GPU_framebuffer_free(blit_fb_); @@ -2394,6 +2511,26 @@ void gpu::MTLTexture::reset() /** \} */ +/* -------------------------------------------------------------------- */ +/** \name Alias resource access to buffer backed content using Storage Buffer. + * \{ */ +MTLStorageBuf *gpu::MTLTexture::get_storagebuf() +{ + BLI_assert_msg( + backing_buffer_ != nullptr, + "Resource must have been created as a buffer backed resource to support SSBO wrapping."); + /* Ensure texture resource is up to date. */ + this->ensure_baked(); + if (storage_buffer_ == nil) { + BLI_assert(texture_ != nullptr); + id backing_buffer = [texture_ buffer]; + BLI_assert(backing_buffer != nil); + storage_buffer_ = new MTLStorageBuf(this, [backing_buffer length]); + } + return storage_buffer_; +} +/** \} */ + /* -------------------------------------------------------------------- */ /** \name SRGB Handling. * \{ */ diff --git a/source/blender/gpu/opengl/gl_shader.cc b/source/blender/gpu/opengl/gl_shader.cc index 7d64c6b5ae8..8c8ba7e5c24 100644 --- a/source/blender/gpu/opengl/gl_shader.cc +++ b/source/blender/gpu/opengl/gl_shader.cc @@ -6,6 +6,8 @@ * \ingroup gpu */ +#include + #include "BKE_global.h" #include "BLI_string.h" @@ -376,6 +378,9 @@ static void print_image_type(std::ostream &os, case ImageType::INT_3D: case ImageType::INT_CUBE: case ImageType::INT_CUBE_ARRAY: + case ImageType::INT_2D_ATOMIC: + case ImageType::INT_2D_ARRAY_ATOMIC: + case ImageType::INT_3D_ATOMIC: os << "i"; break; case ImageType::UINT_BUFFER: @@ -386,6 +391,9 @@ static void print_image_type(std::ostream &os, case ImageType::UINT_3D: case ImageType::UINT_CUBE: case ImageType::UINT_CUBE_ARRAY: + case ImageType::UINT_2D_ATOMIC: + case ImageType::UINT_2D_ARRAY_ATOMIC: + case ImageType::UINT_3D_ATOMIC: os << "u"; break; default: @@ -417,8 +425,12 @@ static void print_image_type(std::ostream &os, case ImageType::FLOAT_2D_ARRAY: case ImageType::INT_2D: case ImageType::INT_2D_ARRAY: + case ImageType::INT_2D_ATOMIC: + case ImageType::INT_2D_ARRAY_ATOMIC: case ImageType::UINT_2D: case ImageType::UINT_2D_ARRAY: + case ImageType::UINT_2D_ATOMIC: + case ImageType::UINT_2D_ARRAY_ATOMIC: case ImageType::SHADOW_2D: case ImageType::SHADOW_2D_ARRAY: case ImageType::DEPTH_2D: @@ -428,6 +440,8 @@ static void print_image_type(std::ostream &os, case ImageType::FLOAT_3D: case ImageType::INT_3D: case ImageType::UINT_3D: + case ImageType::INT_3D_ATOMIC: + case ImageType::UINT_3D_ATOMIC: os << "3D"; break; case ImageType::FLOAT_CUBE: @@ -455,6 +469,7 @@ static void print_image_type(std::ostream &os, case ImageType::INT_CUBE_ARRAY: case ImageType::UINT_1D_ARRAY: case ImageType::UINT_2D_ARRAY: + case ImageType::UINT_2D_ARRAY_ATOMIC: case ImageType::UINT_CUBE_ARRAY: case ImageType::SHADOW_2D_ARRAY: case ImageType::SHADOW_CUBE_ARRAY: @@ -1009,116 +1024,116 @@ bool GLShader::do_geometry_shader_injection(const shader::ShaderCreateInfo *info /** \name Shader stage creation * \{ */ -static char *glsl_patch_default_get() +static const char *glsl_patch_default_get() { /** Used for shader patching. Init once. */ - static char patch[2048] = "\0"; - if (patch[0] != '\0') { - return patch; + static std::string patch; + if (!patch.empty()) { + return patch.c_str(); } - size_t slen = 0; + std::stringstream ss; /* Version need to go first. */ if (epoxy_gl_version() >= 43) { - STR_CONCAT(patch, slen, "#version 430\n"); + ss << "#version 430\n"; } else { - STR_CONCAT(patch, slen, "#version 330\n"); + ss << "#version 330\n"; } /* Enable extensions for features that are not part of our base GLSL version * don't use an extension for something already available! */ if (GLContext::texture_gather_support) { - STR_CONCAT(patch, slen, "#extension GL_ARB_texture_gather: enable\n"); + ss << "#extension GL_ARB_texture_gather: enable\n"; /* Some drivers don't agree on epoxy_has_gl_extension("GL_ARB_texture_gather") and the actual * support in the shader so double check the preprocessor define (see #56544). */ - STR_CONCAT(patch, slen, "#ifdef GL_ARB_texture_gather\n"); - STR_CONCAT(patch, slen, "# define GPU_ARB_texture_gather\n"); - STR_CONCAT(patch, slen, "#endif\n"); + ss << "#ifdef GL_ARB_texture_gather\n"; + ss << "# define GPU_ARB_texture_gather\n"; + ss << "#endif\n"; } if (GLContext::shader_draw_parameters_support) { - STR_CONCAT(patch, slen, "#extension GL_ARB_shader_draw_parameters : enable\n"); - STR_CONCAT(patch, slen, "#define GPU_ARB_shader_draw_parameters\n"); - STR_CONCAT(patch, slen, "#define gpu_BaseInstance gl_BaseInstanceARB\n"); + ss << "#extension GL_ARB_shader_draw_parameters : enable\n"; + ss << "#define GPU_ARB_shader_draw_parameters\n"; + ss << "#define gpu_BaseInstance gl_BaseInstanceARB\n"; } if (GLContext::geometry_shader_invocations) { - STR_CONCAT(patch, slen, "#extension GL_ARB_gpu_shader5 : enable\n"); - STR_CONCAT(patch, slen, "#define GPU_ARB_gpu_shader5\n"); + ss << "#extension GL_ARB_gpu_shader5 : enable\n"; + ss << "#define GPU_ARB_gpu_shader5\n"; } if (GLContext::texture_cube_map_array_support) { - STR_CONCAT(patch, slen, "#extension GL_ARB_texture_cube_map_array : enable\n"); - STR_CONCAT(patch, slen, "#define GPU_ARB_texture_cube_map_array\n"); + ss << "#extension GL_ARB_texture_cube_map_array : enable\n"; + ss << "#define GPU_ARB_texture_cube_map_array\n"; } if (epoxy_has_gl_extension("GL_ARB_conservative_depth")) { - STR_CONCAT(patch, slen, "#extension GL_ARB_conservative_depth : enable\n"); + ss << "#extension GL_ARB_conservative_depth : enable\n"; } if (GPU_shader_image_load_store_support()) { - STR_CONCAT(patch, slen, "#extension GL_ARB_shader_image_load_store: enable\n"); - STR_CONCAT(patch, slen, "#extension GL_ARB_shading_language_420pack: enable\n"); + ss << "#extension GL_ARB_shader_image_load_store: enable\n"; + ss << "#extension GL_ARB_shading_language_420pack: enable\n"; } if (GLContext::layered_rendering_support) { - STR_CONCAT(patch, slen, "#extension GL_ARB_shader_viewport_layer_array: enable\n"); - STR_CONCAT(patch, slen, "#define gpu_Layer gl_Layer\n"); - STR_CONCAT(patch, slen, "#define gpu_ViewportIndex gl_ViewportIndex\n"); + ss << "#extension GL_ARB_shader_viewport_layer_array: enable\n"; + ss << "#define gpu_Layer gl_Layer\n"; + ss << "#define gpu_ViewportIndex gl_ViewportIndex\n"; } if (GLContext::native_barycentric_support) { - STR_CONCAT(patch, slen, "#extension GL_AMD_shader_explicit_vertex_parameter: enable\n"); + ss << "#extension GL_AMD_shader_explicit_vertex_parameter: enable\n"; } if (GLContext::framebuffer_fetch_support) { - STR_CONCAT(patch, slen, "#extension GL_EXT_shader_framebuffer_fetch: enable\n"); + ss << "#extension GL_EXT_shader_framebuffer_fetch: enable\n"; } /* Fallbacks. */ if (!GLContext::shader_draw_parameters_support) { - STR_CONCAT(patch, slen, "uniform int gpu_BaseInstance;\n"); + ss << "uniform int gpu_BaseInstance;\n"; } /* Vulkan GLSL compatibility. */ - STR_CONCAT(patch, slen, "#define gpu_InstanceIndex (gl_InstanceID + gpu_BaseInstance)\n"); - STR_CONCAT(patch, slen, "#define gpu_EmitVertex EmitVertex\n"); + ss << "#define gpu_InstanceIndex (gl_InstanceID + gpu_BaseInstance)\n"; + ss << "#define gpu_EmitVertex EmitVertex\n"; /* Array compatibility. */ - STR_CONCAT(patch, slen, "#define gpu_Array(_type) _type[]\n"); + ss << "#define gpu_Array(_type) _type[]\n"; /* Derivative sign can change depending on implementation. */ - STR_CONCATF(patch, slen, "#define DFDX_SIGN %1.1f\n", GLContext::derivative_signs[0]); - STR_CONCATF(patch, slen, "#define DFDY_SIGN %1.1f\n", GLContext::derivative_signs[1]); + ss << "#define DFDX_SIGN " << std::setprecision(2) << GLContext::derivative_signs[0] << "\n"; + ss << "#define DFDY_SIGN " << std::setprecision(2) << GLContext::derivative_signs[1] << "\n"; /* GLSL Backend Lib. */ - STR_CONCAT(patch, slen, datatoc_glsl_shader_defines_glsl); + ss << datatoc_glsl_shader_defines_glsl; - BLI_assert(slen < sizeof(patch)); - return patch; + patch = ss.str(); + return patch.c_str(); } -static char *glsl_patch_compute_get() +static const char *glsl_patch_compute_get() { /** Used for shader patching. Init once. */ - static char patch[2048] = "\0"; - if (patch[0] != '\0') { - return patch; + static std::string patch; + if (!patch.empty()) { + return patch.c_str(); } - size_t slen = 0; + std::stringstream ss; /* Version need to go first. */ - STR_CONCAT(patch, slen, "#version 430\n"); - STR_CONCAT(patch, slen, "#extension GL_ARB_compute_shader :enable\n"); + ss << "#version 430\n"; + ss << "#extension GL_ARB_compute_shader :enable\n"; if (GLContext::texture_cube_map_array_support) { - STR_CONCAT(patch, slen, "#extension GL_ARB_texture_cube_map_array : enable\n"); - STR_CONCAT(patch, slen, "#define GPU_ARB_texture_cube_map_array\n"); + ss << "#extension GL_ARB_texture_cube_map_array : enable\n"; + ss << "#define GPU_ARB_texture_cube_map_array\n"; } /* Array compatibility. */ - STR_CONCAT(patch, slen, "#define gpu_Array(_type) _type[]\n"); + ss << "#define gpu_Array(_type) _type[]\n"; - STR_CONCAT(patch, slen, datatoc_glsl_shader_defines_glsl); + ss << datatoc_glsl_shader_defines_glsl; - BLI_assert(slen < sizeof(patch)); - return patch; + patch = ss.str(); + return patch.c_str(); } -char *GLShader::glsl_patch_get(GLenum gl_stage) +const char *GLShader::glsl_patch_get(GLenum gl_stage) { if (gl_stage == GL_COMPUTE_SHADER) { return glsl_patch_compute_get(); diff --git a/source/blender/gpu/opengl/gl_shader.hh b/source/blender/gpu/opengl/gl_shader.hh index 65f55c0c19e..d407019f1e4 100644 --- a/source/blender/gpu/opengl/gl_shader.hh +++ b/source/blender/gpu/opengl/gl_shader.hh @@ -88,7 +88,7 @@ class GLShader : public Shader { } private: - char *glsl_patch_get(GLenum gl_stage); + const char *glsl_patch_get(GLenum gl_stage); /** Create, compile and attach the shader stage to the shader program. */ GLuint create_shader_stage(GLenum gl_stage, MutableSpan sources); diff --git a/source/blender/gpu/opengl/gl_texture.cc b/source/blender/gpu/opengl/gl_texture.cc index 2bcf02e8660..f067606f06c 100644 --- a/source/blender/gpu/opengl/gl_texture.cc +++ b/source/blender/gpu/opengl/gl_texture.cc @@ -418,25 +418,13 @@ void GLTexture::copy_to(Texture *dst_) BLI_assert((dst->w_ == src->w_) && (dst->h_ == src->h_) && (dst->d_ == src->d_)); BLI_assert(dst->format_ == src->format_); BLI_assert(dst->type_ == src->type_); - /* TODO: support array / 3D textures. */ - BLI_assert(dst->d_ == 0); - if (GLContext::copy_image_support) { - int mip = 0; - /* NOTE: mip_size_get() won't override any dimension that is equal to 0. */ - int extent[3] = {1, 1, 1}; - this->mip_size_get(mip, extent); - glCopyImageSubData( - src->tex_id_, target_, mip, 0, 0, 0, dst->tex_id_, target_, mip, 0, 0, 0, UNPACK3(extent)); - } - else { - /* Fallback for older GL. */ - GPU_framebuffer_blit(wrap(src->framebuffer_get()), - 0, - wrap(dst->framebuffer_get()), - 0, - to_framebuffer_bits(format_)); - } + int mip = 0; + /* NOTE: mip_size_get() won't override any dimension that is equal to 0. */ + int extent[3] = {1, 1, 1}; + this->mip_size_get(mip, extent); + glCopyImageSubData( + src->tex_id_, target_, mip, 0, 0, 0, dst->tex_id_, target_, mip, 0, 0, 0, UNPACK3(extent)); has_pixels_ = true; } diff --git a/source/blender/gpu/shaders/common/gpu_shader_math_matrix_lib.glsl b/source/blender/gpu/shaders/common/gpu_shader_math_matrix_lib.glsl index adb600cb665..f521ef71605 100644 --- a/source/blender/gpu/shaders/common/gpu_shader_math_matrix_lib.glsl +++ b/source/blender/gpu/shaders/common/gpu_shader_math_matrix_lib.glsl @@ -1029,7 +1029,7 @@ mat4x4 from_loc_rot_scale(vec3 location, AxisAngle rotation, vec3 scale) mat3x3 from_up_axis(vec3 up) { /* Duff, Tom, et al. "Building an orthonormal basis, revisited." JCGT 6.1 (2017). */ - float z_sign = sign(up.z); + float z_sign = up.z >= 0.0 ? 1.0 : -1.0; float a = -1.0 / (z_sign + up.z); float b = up.x * up.y * a; diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_translucent.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_translucent.glsl index 801f921be1a..f7829443efc 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_translucent.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_translucent.glsl @@ -10,7 +10,7 @@ void node_bsdf_translucent(vec4 color, vec3 N, float weight, out Closure result) ClosureTranslucent translucent_data; translucent_data.weight = weight; translucent_data.color = color.rgb; - translucent_data.N = -N; + translucent_data.N = N; result = closure_eval(translucent_data); } diff --git a/source/blender/gpu/shaders/metal/mtl_shader_defines.msl b/source/blender/gpu/shaders/metal/mtl_shader_defines.msl index a1f12890bcd..4b94e10045f 100644 --- a/source/blender/gpu/shaders/metal/mtl_shader_defines.msl +++ b/source/blender/gpu/shaders/metal/mtl_shader_defines.msl @@ -13,6 +13,13 @@ #pragma clang diagnostic ignored "-Wunused-variable" #pragma clang diagnostic ignored "-Wcomment" +/** Feature support. */ +/* Native texture atomics supported in Metal 3.1+. Without these, we will use a fallback + * implementation based on SSBOS.*/ +#if __METAL_VERSION__ >= 310 +# define MTL_SUPPORTS_TEXTURE_ATOMICS 1 +#endif + /* Base instance with offsets. */ #define gpu_BaseInstance gl_BaseInstanceARB #define gpu_InstanceIndex (gl_InstanceID + gpu_BaseInstance) @@ -208,17 +215,71 @@ template T atomicExchange(device T &mem, T data) /* Generate wrapper structs for combined texture and sampler type. */ #ifdef USE_ARGUMENT_BUFFER_FOR_SAMPLERS -# define COMBINED_SAMPLER_TYPE(STRUCT_NAME, TEX_TYPE) \ - template struct STRUCT_NAME { \ - thread TEX_TYPE *texture; \ - constant sampler *samp; \ - } +# define SAMPLER_DECLARATION constant sampler *samp; #else -# define COMBINED_SAMPLER_TYPE(STRUCT_NAME, TEX_TYPE) \ - template struct STRUCT_NAME { \ - thread TEX_TYPE *texture; \ - thread sampler *samp; \ - } +# define SAMPLER_DECLARATION thread sampler *samp; +#endif + +#define COMBINED_SAMPLER_TYPE(STRUCT_NAME, TEX_TYPE) \ + template struct STRUCT_NAME { \ + thread TEX_TYPE *texture; \ + SAMPLER_DECLARATION \ + } + +/* If native texture atomics are unsupported, we instead utilize a custom type which wraps a + * buffer-backed texture. This texture will always be a Texture2D, but will emulate access to + * Texture3D and Texture2DArray by stacking layers. + * Access pattern will be derived based on the source type. 2DArray and 3D atomic texture + * support will require information on the size of each layer within the source 2D texture. + * + * A device pointer to the backing buffer will also be available for the atomic operations. + * NOTE: For atomic ops, it will only be valid to use access::read_write. + * We still need to use the wrapped type for access:sample, as texture2DArray and texture3D + * will require access indirection. + * + * NOTE: Only type of UINT is valid, but full template provided to match syntax of standard + * textures. */ +#ifndef MTL_SUPPORTS_TEXTURE_ATOMICS + +template +struct _mtl_combined_image_sampler_2d_atomic_fallback { + thread texture2d *texture; + SAMPLER_DECLARATION + device T *buffer; + /* Aligned width matches the number of buffer elements in bytes_per_row. This may be greater than + * the texture's native width to satisfy device alignment rules. We need to use the padded width + * when writing to ensure the + * correct writing location aligns with a given pixel location in the texture. */ + uint aligned_width; +}; + +template +struct _mtl_combined_image_sampler_2d_array_atomic_fallback { + thread texture2d *texture; + SAMPLER_DECLARATION + device T *buffer; + /* Aligned width matches the number of buffer elements in bytes_per_row. This may be greater than + * the texture's native width to satisfy device alignment rules. We need to use the padded width + * when writing to ensure the + * correct writing location aligns with a given pixel location in the texture. */ + uint aligned_width; + /* Texture size required to determine location offset of array layer with 2D texture space. */ + ushort3 texture_size; +}; + +template +struct _mtl_combined_image_sampler_3d_atomic_fallback { + thread texture2d *texture; + SAMPLER_DECLARATION + device T *buffer; + /* Aligned width matches the number of buffer elements in bytes_per_row. This may be greater than + * the texture's native width to satisfy device alignment rules. We need to use the padded width + * when writing to ensure the + * correct writing location aligns with a given pixel location in the texture. */ + uint aligned_width; + /* Texture size required to determine location offset of array layer with 2D texture space. */ + ushort3 texture_size; +}; #endif /* Add any types as needed. */ @@ -280,6 +341,23 @@ struct SStruct { #define isamplerCube thread _mtl_combined_image_sampler_cube #define isamplerCubeArray thread _mtl_combined_image_sampler_cube_array +#ifndef MTL_SUPPORTS_TEXTURE_ATOMICS +/* If texture atomics are unsupported, map atomic types to internal atomic fallback type. */ +# define usampler2DArrayAtomic _mtl_combined_image_sampler_2d_array_atomic_fallback +# define usampler2DAtomic _mtl_combined_image_sampler_2d_atomic_fallback +# define usampler3DAtomic _mtl_combined_image_sampler_3d_atomic_fallback +# define isampler2DArrayAtomic _mtl_combined_image_sampler_2d_array_atomic_fallback +# define isampler2DAtomic _mtl_combined_image_sampler_2d_atomic_fallback +# define isampler3DAtomic _mtl_combined_image_sampler_3d_atomic_fallback +#else +# define usampler2DArrayAtomic usampler2DArray +# define usampler2DAtomic usampler2D +# define usampler3DAtomic usampler3D +# define isampler2DArrayAtomic isampler2DArray +# define isampler2DAtomic isampler2D +# define isampler3DAtomic isampler3D +#endif + /* Vector accessor aliases. */ #define st xy @@ -976,7 +1054,7 @@ inline void _texture_write_internal_fast(thread _mtl_combined_image_sampler_3d= 310 +#ifdef MTL_SUPPORTS_TEXTURE_ATOMICS /* Image atomic operations. */ # define imageAtomicMin(tex, coord, data) _texture_image_atomic_min_internal(tex, coord, data) @@ -1192,77 +1270,457 @@ S _texture_image_atomic_exchange_internal(thread _mtl_combined_image_sampler_3d< } #else -/* Fallback for imageAtomicMin if atomics are unsupported. - * for general concurrent thread access, but will allow inter-thread writing. - * This assumes 2D texture array. - * NOTE: Implementations should switch to a buffer-backed texture write in these cases. */ + +/** + * Texture atomic fallback function entry points. + * NOTE: When texture atomics are unsupported, the wrapped type contains a buffer-backed 2D + * texture. Atomic operations happen directly on the underlying buffer, and texture coordinates are + * remapped into 2D texture space from 2D Array or 3D texture coordinates. + */ + +/* Image atomic operations. */ # define imageAtomicMin(tex, coord, data) \ - auto val = _texelFetch_internal(tex, coord, 0).r; \ - tex.texture->fence(); \ - tex.texture->write(min(val, data), uint2(coord.xy), uint(coord.z)); \ - tex.texture->fence(); - -/* Fallback for atomic Exchange if atomics are unavailable. - * NOTE: Implementations should switch to a buffer-backed texture write in these cases. */ + _texture_image_atomic_min_internal_fallback(tex, coord, data) +# define imageAtomicAdd(tex, coord, data) \ + _texture_image_atomic_add_internal_fallack(tex, coord, data) # define imageAtomicExchange(tex, coord, data) \ - _texture_image_atomic_exchange_internal_fallback(tex, coord, data) + _texture_image_atomic_exchange_internal_fallack(tex, coord, data) +# define imageAtomicXor(tex, coord, data) \ + _texture_image_atomic_xor_internal_fallack(tex, coord, data) +# define imageAtomicOr(tex, coord, data) \ + _texture_image_atomic_or_internal_fallack(tex, coord, data) +/** Pixel address location remapping. */ + +/* Map 2D/3D texture coordinate into a linear pixel ID. */ template -S _texture_image_atomic_exchange_internal_fallback(thread _mtl_combined_image_sampler_1d tex, - int coord, - S data) +uint tex_coord_to_linear_px(thread _mtl_combined_image_sampler_2d_atomic_fallback tex, + uint2 coord) { - S val = tex.texture->read(uint(coord), data).x; - tex.texture->fence(); - tex.texture->write(data, uint(coord)); - tex.texture->fence(); - return val; + return (coord.x + coord.y * uint(tex.texture->get_width())); +} +template +uint tex_coord_to_linear_px(thread _mtl_combined_image_sampler_2d_atomic_fallback tex, + int2 coord) +{ + return tex_coord_to_linear_px(tex, uint2(coord)); } template -S _texture_image_atomic_exchange_internal_fallback( - thread _mtl_combined_image_sampler_1d_array tex, int2 coord, S data) +uint tex_coord_to_linear_px(thread _mtl_combined_image_sampler_2d_array_atomic_fallback tex, + uint3 coord) { - S val = tex.texture->read(uint(coord.x), uint(coord.y), data).x; - tex.texture->fence(); - tex.texture->write(data, uint(coord.x), uint(coord.y)); - tex.texture->fence(); - return val; + return (coord.x + coord.y * tex.texture_size.x + + coord.z * (tex.texture_size.x * tex.texture_size.y)); +} +template +uint tex_coord_to_linear_px(thread _mtl_combined_image_sampler_2d_array_atomic_fallback tex, + int3 coord) +{ + return tex_coord_to_linear_px(tex, uint3(coord)); } template -S _texture_image_atomic_exchange_internal_fallback(thread _mtl_combined_image_sampler_2d tex, - int2 coord, - S data) +uint tex_coord_to_linear_px(thread _mtl_combined_image_sampler_3d_atomic_fallback tex, + uint3 coord) { - S val = tex.texture->read(uint2(coord), data).x; - tex.texture->fence(); - tex.texture->write(data, uint2(coord.x)); - tex.texture->fence(); - return val; + return (coord.x + coord.y * tex.texture_size.x + + coord.z * (tex.texture_size.x * tex.texture_size.y)); +} +template +uint tex_coord_to_linear_px(thread _mtl_combined_image_sampler_3d_atomic_fallback tex, + int3 coord) +{ + return tex_coord_to_linear_px(tex, uint3(coord)); +} + +/* Map 3D texture coordinate into 2D texture space. */ +template +uint2 tex_coord_3d_to_2d(thread _mtl_combined_image_sampler_2d_array_atomic_fallback tex, + uint3 coord) +{ + uint linear_id = tex_coord_to_linear_px(tex, coord); + uint tex_full_w = uint(tex.texture->get_width()); + uint2 out_2dcoord; + out_2dcoord.y = linear_id / tex_full_w; + out_2dcoord.x = linear_id - (out_2dcoord.y * tex_full_w); + return out_2dcoord; } template -S _texture_image_atomic_exchange_internal_fallback( - thread _mtl_combined_image_sampler_2d_array tex, int3 coord, S data) +uint2 tex_coord_3d_to_2d(thread _mtl_combined_image_sampler_3d_atomic_fallback tex, + uint3 coord) { - S val = tex.texture->read(uint2(coord.xy), uint(coord.z), data).x; - tex.texture->fence(); - tex.texture->write(data, uint2(coord.xy), uint(coord.z)); - tex.texture->fence(); - return val; + uint linear_id = tex_coord_to_linear_px(tex, coord); + uint tex_full_w = uint(tex.texture->get_width()); + uint2 out_2dcoord; + out_2dcoord.y = linear_id / tex_full_w; + out_2dcoord.x = linear_id - (out_2dcoord.y * tex_full_w); + return out_2dcoord; +} + +template bool in_range(vec value, vec min, vec max) +{ + return (all(value >= min) && all(value < max)); +} + +/* Map 2D/3D texture coordinate into buffer index, accounting for padded row widths. */ +template +uint tex_coord_to_linear_buffer_id(thread _mtl_combined_image_sampler_2d_atomic_fallback tex, + uint2 coord) +{ + return (coord.x + coord.y * uint(tex.aligned_width)); +} +template +uint tex_coord_to_linear_buffer_id(thread _mtl_combined_image_sampler_2d_atomic_fallback tex, + int2 coord) +{ + return tex_coord_to_linear_buffer_id(tex, uint2(coord)); } template -S _texture_image_atomic_exchange_internal_fallback(thread _mtl_combined_image_sampler_3d tex, - int3 coord, - S data) +uint tex_coord_to_linear_buffer_id( + thread _mtl_combined_image_sampler_2d_array_atomic_fallback tex, uint3 coord) { - S val = tex.texture->read(uint3(coord), data).x; - tex.texture->fence(); - tex.texture->write(data, uint3(coord)); - tex.texture->fence(); - return val; + uint2 coord2d = tex_coord_3d_to_2d(tex, coord); + return (coord2d.x + coord2d.y * uint(tex.aligned_width)); +} +template +uint tex_coord_to_linear_buffer_id( + thread _mtl_combined_image_sampler_2d_array_atomic_fallback tex, int3 coord) +{ + return tex_coord_to_linear_buffer_id(tex, uint3(coord)); +} + +template +uint tex_coord_to_linear_buffer_id(thread _mtl_combined_image_sampler_3d_atomic_fallback tex, + uint3 coord) +{ + uint2 coord2d = tex_coord_3d_to_2d(tex, coord); + return (coord2d.x + coord2d.y * uint(tex.aligned_width)); +} +template +uint tex_coord_to_linear_buffer_id(thread _mtl_combined_image_sampler_3d_atomic_fallback tex, + int3 coord) +{ + return tex_coord_to_linear_buffer_id(tex, uint3(coord)); +} + +/* imageAtomicMin. */ + +template +S _texture_image_atomic_min_internal_fallback( + thread _mtl_combined_image_sampler_2d_atomic_fallback tex, int2 coord, S data) +{ + if (!in_range(coord.xy, int2(0, 0), int2(tex.texture->get_width(0), tex.texture->get_height(0)))) + { + return S(0); + } + uint linear_id = tex_coord_to_linear_buffer_id(tex, coord); + return atomicMin(tex.buffer[linear_id], data); +} + +template +S _texture_image_atomic_min_internal_fallback( + thread _mtl_combined_image_sampler_2d_array_atomic_fallback tex, int3 coord, S data) +{ + if (!in_range(coord.xyz, int3(0, 0, 0), int3(tex.texture_size.xyz))) { + return S(0); + } + uint linear_id = tex_coord_to_linear_buffer_id(tex, coord); + return atomicMin(tex.buffer[linear_id], data); +} + +template +S _texture_image_atomic_min_internal_fallback( + thread _mtl_combined_image_sampler_3d_atomic_fallback tex, int3 coord, S data) +{ + if (!in_range(coord.xyz, int3(0, 0, 0), int3(tex.texture_size.xyz))) { + return S(0); + } + uint linear_id = tex_coord_to_linear_buffer_id(tex, coord); + return atomicMin(tex.buffer[linear_id], data); +} + +/* imageAtomicAdd. */ +template +S _texture_image_atomic_add_internal_fallack( + thread _mtl_combined_image_sampler_2d_atomic_fallback tex, int2 coord, S data) +{ + if (!in_range(coord.xy, int2(0, 0), int2(tex.texture->get_width(0), tex.texture->get_height(0)))) + { + return S(0); + } + uint linear_id = tex_coord_to_linear_buffer_id(tex, coord); + return atomicAdd(tex.buffer[linear_id], data); +} + +template +S _texture_image_atomic_add_internal_fallack( + thread _mtl_combined_image_sampler_2d_array_atomic_fallback tex, int3 coord, S data) +{ + if (!in_range(coord.xyz, int3(0, 0, 0), int3(tex.texture_size.xyz))) { + return S(0); + } + uint linear_id = tex_coord_to_linear_buffer_id(tex, coord); + return atomicAdd(tex.buffer[linear_id], data); +} + +template +S _texture_image_atomic_add_internal_fallack( + thread _mtl_combined_image_sampler_3d_atomic_fallback tex, int3 coord, S data) +{ + if (!in_range(coord.xyz, int3(0, 0, 0), int3(tex.texture_size.xyz))) { + return S(0); + } + uint linear_id = tex_coord_to_linear_buffer_id(tex, coord); + return atomicAdd(tex.buffer[linear_id], data); +} + +/* imageAtomicExchange. */ +template +S _texture_image_atomic_exchange_internal_fallack( + thread _mtl_combined_image_sampler_2d_atomic_fallback tex, int2 coord, S data) +{ + if (!in_range(coord.xy, int2(0, 0), int2(tex.texture->get_width(0), tex.texture->get_height(0)))) + { + return S(0); + } + uint linear_id = tex_coord_to_linear_buffer_id(tex, coord); + return atomicExchange(tex.buffer[linear_id], data); +} + +template +S _texture_image_atomic_exchange_internal_fallack( + thread _mtl_combined_image_sampler_2d_array_atomic_fallback tex, int3 coord, S data) +{ + if (!in_range(coord.xyz, int3(0, 0, 0), int3(tex.texture_size.xyz))) { + return S(0); + } + uint linear_id = tex_coord_to_linear_buffer_id(tex, coord); + return atomicExchange(tex.buffer[linear_id], data); +} + +template +S _texture_image_atomic_exchange_internal_fallack( + thread _mtl_combined_image_sampler_3d_atomic_fallback tex, int3 coord, S data) +{ + if (!in_range(coord.xyz, int3(0, 0, 0), int3(tex.texture_size.xyz))) { + return S(0); + } + uint linear_id = tex_coord_to_linear_buffer_id(tex, coord); + return atomicExchange(tex.buffer[linear_id], data); +} + +/* imageAtomicXor. */ +template +S _texture_image_atomic_xor_internal_fallack( + thread _mtl_combined_image_sampler_2d_atomic_fallback tex, int2 coord, S data) +{ + if (!in_range(coord.xy, int2(0, 0), int2(tex.texture->get_width(0), tex.texture->get_height(0)))) + { + return S(0); + } + uint linear_id = tex_coord_to_linear_buffer_id(tex, coord); + return atomicXor(tex.buffer[linear_id], data); +} + +template +S _texture_image_atomic_xor_internal_fallack( + thread _mtl_combined_image_sampler_2d_array_atomic_fallback tex, int3 coord, S data) +{ + if (!in_range(coord.xyz, int3(0, 0, 0), int3(tex.texture_size.xyz))) { + return S(0); + } + uint linear_id = tex_coord_to_linear_buffer_id(tex, coord); + return atomicXor(tex.buffer[linear_id], data); +} + +template +S _texture_image_atomic_xor_internal_fallack( + thread _mtl_combined_image_sampler_3d_atomic_fallback tex, int3 coord, S data) +{ + if (!in_range(coord.xyz, int3(0, 0, 0), int3(tex.texture_size.xyz))) { + return S(0); + } + uint linear_id = tex_coord_to_linear_buffer_id(tex, coord); + return atomicXor(tex.buffer[linear_id], data); +} + +/* imageAtomicOr. */ +template +S _texture_image_atomic_or_internal_fallack( + thread _mtl_combined_image_sampler_2d_atomic_fallback tex, int2 coord, S data) +{ + if (!in_range(coord.xy, int2(0, 0), int2(tex.texture->get_width(0), tex.texture->get_height(0)))) + { + return S(0); + } + uint linear_id = tex_coord_to_linear_buffer_id(tex, coord); + return atomicOr(tex.buffer[linear_id], data); +} + +template +S _texture_image_atomic_or_internal_fallack( + thread _mtl_combined_image_sampler_2d_array_atomic_fallback tex, int3 coord, S data) +{ + if (!in_range(coord.xyz, int3(0, 0, 0), int3(tex.texture_size.xyz))) { + return S(0); + } + uint linear_id = tex_coord_to_linear_buffer_id(tex, coord); + return atomicOr(tex.buffer[linear_id], data); +} + +template +S _texture_image_atomic_or_internal_fallack( + thread _mtl_combined_image_sampler_3d_atomic_fallback tex, int3 coord, S data) +{ + if (!in_range(coord.xyz, int3(0, 0, 0), int3(tex.texture_size.xyz))) { + return S(0); + } + uint linear_id = tex_coord_to_linear_buffer_id(tex, coord); + return atomicOr(tex.buffer[linear_id], data); +} + +/** Texture sampling, reading and writing functions with layer mapping. */ + +/* Texel Fetch. */ +template +inline vec _texelFetch_internal( + thread _mtl_combined_image_sampler_2d_atomic_fallback tex, + vec texel, + uint lod, + vec offset = vec(0)) +{ + return tex.texture->sample(_point_sample_, float2(texel.xy + offset.xy), level(lod)); +} + +template +inline vec _texelFetch_internal( + thread _mtl_combined_image_sampler_2d_array_atomic_fallback tex, + vec texel, + uint lod, + vec offset = vec(0)) +{ + return tex.texture->sample( + _point_sample_, float2(tex_coord_3d_to_2d(tex, uint3(texel + offset))), level(lod)); +} + +template +inline vec _texelFetch_internal( + thread _mtl_combined_image_sampler_3d_atomic_fallback tex, + vec texel, + uint lod, + vec offset = vec(0)) +{ + return tex.texture->sample( + _point_sample_, float2(tex_coord_3d_to_2d(tex, uint3(texel + offset))), level(lod)); +} + +template +inline vec _texelFetch_internal( + thread _mtl_combined_image_sampler_2d_atomic_fallback tex, + vec texel, + uint lod, + vec offset = vec(0)) +{ + + float w = tex.texture->get_width() >> lod; + float h = tex.texture->get_height() >> lod; + if ((texel.x + offset.x) >= 0 && (texel.x + offset.x) < w && (texel.y + offset.y) >= 0 && + (texel.y + offset.y) < h) + { + return tex.texture->read(uint2(texel + offset), lod); + } + else { + return vec(0); + } +} + +template +inline vec _texelFetch_internal( + thread _mtl_combined_image_sampler_2d_array_atomic_fallback tex, + vec texel, + uint lod, + vec offset = vec(0)) +{ + return tex.texture->read(tex_coord_3d_to_2d(tex, uint3(texel + offset)), lod); +} + +template +inline vec _texelFetch_internal( + thread _mtl_combined_image_sampler_3d_atomic_fallback tex, + vec texel, + uint lod, + vec offset = vec(0)) +{ + return tex.texture->read(tex_coord_3d_to_2d(tex, uint3(texel + offset)), lod); +} + +/* imageStore. */ + +template +inline void _texture_write_internal( + thread _mtl_combined_image_sampler_2d_atomic_fallback tex, T _coord, vec value) +{ + float w = tex.texture_size.x; + float h = tex.texture_size.y; + if (_coord.x >= 0 && _coord.x < w && _coord.y >= 0 && _coord.y < h) { + tex.texture->write(value, uint2(_coord.xy)); + } +} + +template +inline void _texture_write_internal_fast( + thread _mtl_combined_image_sampler_2d_atomic_fallback tex, T _coord, vec value) +{ + tex.texture->write(value, uint2(_coord.xy)); +} + +template +inline void _texture_write_internal( + thread _mtl_combined_image_sampler_2d_array_atomic_fallback tex, + T _coord, + vec value) +{ + float w = tex.texture_size.x; + float h = tex.texture_size.y; + float d = tex.texture_size.z; + if (_coord.x >= 0 && _coord.x < w && _coord.y >= 0 && _coord.y < h && _coord.z >= 0 && + _coord.z < d) + { + tex.texture->write(value, tex_coord_3d_to_2d(tex, uint3(_coord))); + } +} + +template +inline void _texture_write_internal_fast( + thread _mtl_combined_image_sampler_2d_array_atomic_fallback tex, + T _coord, + vec value) +{ + tex.texture->write(value, tex_coord_3d_to_2d(tex, uint3(_coord))); +} + +template +inline void _texture_write_internal( + thread _mtl_combined_image_sampler_3d_atomic_fallback tex, T _coord, vec value) +{ + float w = tex.texture_size.x; + float h = tex.texture_size.y; + float d = tex.texture_size.z; + if (_coord.x >= 0 && _coord.x < w && _coord.y >= 0 && _coord.y < h && _coord.z >= 0 && + _coord.z < d) + { + tex.texture->write(value, tex_coord_3d_to_2d(tex, uint3(_coord))); + } +} + +template +inline void _texture_write_internal_fast( + thread _mtl_combined_image_sampler_3d_atomic_fallback tex, T _coord, vec value) +{ + tex.texture->write(value, tex_coord_3d_to_2d(tex, uint3(_coord))); } #endif @@ -1596,6 +2054,27 @@ int3 textureSize(thread _mtl_combined_image_sampler_3d image, uint lod) image.texture->get_depth(lod)); } +#ifndef MTL_SUPPORTS_TEXTURE_ATOMICS +/* textureSize functions for fallback atomic textures. */ +template +int2 textureSize(thread _mtl_combined_image_sampler_2d_atomic_fallback image, uint lod) +{ + return int2(image.texture->get_width(lod), image.texture->get_height(lod)); +} + +template +int3 textureSize(thread _mtl_combined_image_sampler_2d_array_atomic_fallback image, uint lod) +{ + return int3(image.texture_size); +} + +template +int3 textureSize(thread _mtl_combined_image_sampler_3d_atomic_fallback image, uint lod) +{ + return int3(image.texture_size); +} +#endif + /* Equality and comparison functions. */ #define lessThan(a, b) ((a) < (b)) #define lessThanEqual(a, b) ((a) <= (b)) diff --git a/source/blender/gpu/shaders/opengl/glsl_shader_defines.glsl b/source/blender/gpu/shaders/opengl/glsl_shader_defines.glsl index d98bb8896ba..85874fc3fa4 100644 --- a/source/blender/gpu/shaders/opengl/glsl_shader_defines.glsl +++ b/source/blender/gpu/shaders/opengl/glsl_shader_defines.glsl @@ -22,6 +22,13 @@ #define depthCubeArray samplerCubeArray #define depth2DArrayShadow sampler2DArrayShadow +#define usampler2DArrayAtomic usampler2DArray +#define usampler2DAtomic usampler2D +#define usampler3DAtomic usampler3D +#define isampler2DArrayAtomic isampler2DArray +#define isampler2DAtomic isampler2D +#define isampler3DAtomic isampler3D + /* Backend Functions. */ #define select(A, B, mask) mix(A, B, mask) diff --git a/source/blender/gpu/tests/gpu_testing.cc b/source/blender/gpu/tests/gpu_testing.cc index eb74eaf583e..f61573c4522 100644 --- a/source/blender/gpu/tests/gpu_testing.cc +++ b/source/blender/gpu/tests/gpu_testing.cc @@ -15,14 +15,12 @@ #include "GHOST_C-api.h" -#include "BKE_global.h" - namespace blender::gpu { void GPUTest::SetUp() { prev_g_debug_ = G.debug; - G.debug |= G_DEBUG_GPU | G_DEBUG_GPU_RENDERDOC; + G.debug |= g_debug_flags_; CLG_init(); GPU_backend_type_selection_set(gpu_backend_type); diff --git a/source/blender/gpu/tests/gpu_testing.hh b/source/blender/gpu/tests/gpu_testing.hh index 06d0a2b3bdc..0d6104a2344 100644 --- a/source/blender/gpu/tests/gpu_testing.hh +++ b/source/blender/gpu/tests/gpu_testing.hh @@ -4,19 +4,18 @@ #include "testing/testing.h" +#include "BKE_global.h" + #include "GHOST_C-api.h" + #include "GPU_platform.h" struct GPUContext; namespace blender::gpu { -/* Test class that setups a GPUContext for test cases. - * - * Usage: - * TEST_F(GPUTest, my_gpu_test) { - * ... - * } +/** + * Test class that setups a GPUContext for test cases. */ class GPUTest : public ::testing::Test { private: @@ -26,11 +25,16 @@ class GPUTest : public ::testing::Test { GHOST_ContextHandle ghost_context; GPUContext *context; + int32_t g_debug_flags_; int32_t prev_g_debug_; protected: - GPUTest(GHOST_TDrawingContextType draw_context_type, eGPUBackendType gpu_backend_type) - : draw_context_type(draw_context_type), gpu_backend_type(gpu_backend_type) + GPUTest(GHOST_TDrawingContextType draw_context_type, + eGPUBackendType gpu_backend_type, + int32_t g_debug_flags) + : draw_context_type(draw_context_type), + gpu_backend_type(gpu_backend_type), + g_debug_flags_(g_debug_flags) { } @@ -41,7 +45,12 @@ class GPUTest : public ::testing::Test { #ifdef WITH_OPENGL_BACKEND class GPUOpenGLTest : public GPUTest { public: - GPUOpenGLTest() : GPUTest(GHOST_kDrawingContextTypeOpenGL, GPU_BACKEND_OPENGL) {} + GPUOpenGLTest() + : GPUTest(GHOST_kDrawingContextTypeOpenGL, + GPU_BACKEND_OPENGL, + G_DEBUG_GPU | G_DEBUG_GPU_RENDERDOC) + { + } }; # define GPU_OPENGL_TEST(test_name) \ TEST_F(GPUOpenGLTest, test_name) \ @@ -55,10 +64,24 @@ class GPUOpenGLTest : public GPUTest { #ifdef WITH_METAL_BACKEND class GPUMetalTest : public GPUTest { public: - GPUMetalTest() : GPUTest(GHOST_kDrawingContextTypeMetal, GPU_BACKEND_METAL) {} + GPUMetalTest() : GPUTest(GHOST_kDrawingContextTypeMetal, GPU_BACKEND_METAL, G_DEBUG_GPU) {} +}; + +class GPUMetalWorkaroundsTest : public GPUTest { + public: + GPUMetalWorkaroundsTest() + : GPUTest(GHOST_kDrawingContextTypeMetal, + GPU_BACKEND_METAL, + G_DEBUG_GPU | G_DEBUG_GPU_FORCE_WORKAROUNDS) + { + } }; # define GPU_METAL_TEST(test_name) \ TEST_F(GPUMetalTest, test_name) \ + { \ + test_##test_name(); \ + } \ + TEST_F(GPUMetalWorkaroundsTest, test_name) \ { \ test_##test_name(); \ } @@ -69,10 +92,29 @@ class GPUMetalTest : public GPUTest { #ifdef WITH_VULKAN_BACKEND class GPUVulkanTest : public GPUTest { public: - GPUVulkanTest() : GPUTest(GHOST_kDrawingContextTypeVulkan, GPU_BACKEND_VULKAN) {} + GPUVulkanTest() + : GPUTest(GHOST_kDrawingContextTypeVulkan, + GPU_BACKEND_VULKAN, + G_DEBUG_GPU | G_DEBUG_GPU_RENDERDOC) + { + } +}; + +class GPUVulkanWorkaroundsTest : public GPUTest { + public: + GPUVulkanWorkaroundsTest() + : GPUTest(GHOST_kDrawingContextTypeVulkan, + GPU_BACKEND_VULKAN, + G_DEBUG_GPU | G_DEBUG_GPU_RENDERDOC | G_DEBUG_GPU_FORCE_WORKAROUNDS) + { + } }; # define GPU_VULKAN_TEST(test_name) \ TEST_F(GPUVulkanTest, test_name) \ + { \ + test_##test_name(); \ + } \ + TEST_F(GPUVulkanWorkaroundsTest, test_name) \ { \ test_##test_name(); \ } diff --git a/source/blender/gpu/tests/shader_create_info_test.cc b/source/blender/gpu/tests/shader_create_info_test.cc new file mode 100644 index 00000000000..e0208a60e83 --- /dev/null +++ b/source/blender/gpu/tests/shader_create_info_test.cc @@ -0,0 +1,21 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: Apache-2.0 */ + +#include "testing/testing.h" + +#include "gpu_shader_create_info_private.hh" +#include "gpu_testing.hh" + +namespace blender::gpu::tests { + +/** + * Test if all static shaders can be compiled. + */ +static void test_static_shaders() +{ + EXPECT_TRUE(gpu_shader_create_info_compile(nullptr)); +} +GPU_TEST(static_shaders) + +} // namespace blender::gpu::tests diff --git a/source/blender/gpu/tests/shader_test.cc b/source/blender/gpu/tests/shader_test.cc index 0cc956b82bb..94d37cfff75 100644 --- a/source/blender/gpu/tests/shader_test.cc +++ b/source/blender/gpu/tests/shader_test.cc @@ -29,12 +29,6 @@ namespace blender::gpu::tests { using namespace blender::gpu::shader; -static void test_shader_compile_statically_defined() -{ - EXPECT_TRUE(gpu_shader_create_info_compile_all()); -} -GPU_TEST(shader_compile_statically_defined) - static void test_shader_compute_2d() { diff --git a/source/blender/gpu/vulkan/vk_device.cc b/source/blender/gpu/vulkan/vk_device.cc index abe2d711d7f..b9732bc8737 100644 --- a/source/blender/gpu/vulkan/vk_device.cc +++ b/source/blender/gpu/vulkan/vk_device.cc @@ -6,19 +6,25 @@ * \ingroup gpu */ -#include "vk_device.hh" +#include + #include "vk_backend.hh" #include "vk_context.hh" +#include "vk_device.hh" #include "vk_memory.hh" #include "vk_state_manager.hh" #include "vk_storage_buffer.hh" #include "vk_texture.hh" #include "vk_vertex_buffer.hh" +#include "GPU_capabilities.h" + #include "BLI_math_matrix_types.hh" #include "GHOST_C-api.h" +extern "C" char datatoc_glsl_shader_defines_glsl[]; + namespace blender::gpu { void VKDevice::deinit() @@ -48,6 +54,7 @@ void VKDevice::deinit() vk_queue_family_ = 0; vk_queue_ = VK_NULL_HANDLE; vk_physical_device_properties_ = {}; + glsl_patch_.clear(); } bool VKDevice::is_initialized() const @@ -79,6 +86,7 @@ void VKDevice::init(void *ghost_context) debug::object_label(device_get(), "LogicalDevice"); debug::object_label(queue_get(), "GenericQueue"); + init_glsl_patch(); } void VKDevice::init_debug_callbacks() @@ -161,6 +169,45 @@ void VKDevice::init_dummy_color_attachment() dummy_color_attachment_ = std::make_optional(std::reference_wrapper(vk_texture)); } +void VKDevice::init_glsl_patch() +{ + std::stringstream ss; + + ss << "#version 450\n"; + if (GPU_shader_draw_parameters_support()) { + ss << "#extension GL_ARB_shader_draw_parameters : enable\n"; + ss << "#define GPU_ARB_shader_draw_parameters\n"; + ss << "#define gpu_BaseInstance (gl_BaseInstanceARB)\n"; + } + + ss << "#define gl_VertexID gl_VertexIndex\n"; + ss << "#define gpu_InstanceIndex (gl_InstanceIndex)\n"; + ss << "#define GPU_ARB_texture_cube_map_array\n"; + ss << "#define gl_InstanceID (gpu_InstanceIndex - gpu_BaseInstance)\n"; + + /* TODO(fclem): This creates a validation error and should be already part of Vulkan 1.2. */ + ss << "#extension GL_ARB_shader_viewport_layer_array: enable\n"; + if (!workarounds_.shader_output_layer) { + ss << "#define gpu_Layer gl_Layer\n"; + } + if (!workarounds_.shader_output_viewport_index) { + ss << "#define gpu_ViewportIndex gl_ViewportIndex\n"; + } + + ss << "#define DFDX_SIGN 1.0\n"; + ss << "#define DFDY_SIGN 1.0\n"; + + /* GLSL Backend Lib. */ + ss << datatoc_glsl_shader_defines_glsl; + glsl_patch_ = ss.str(); +} + +const char *VKDevice::glsl_patch_get() const +{ + BLI_assert(!glsl_patch_.empty()); + return glsl_patch_.c_str(); +} + /* -------------------------------------------------------------------- */ /** \name Platform/driver/device information * \{ */ diff --git a/source/blender/gpu/vulkan/vk_device.hh b/source/blender/gpu/vulkan/vk_device.hh index c295a33d315..b1f7f9ce041 100644 --- a/source/blender/gpu/vulkan/vk_device.hh +++ b/source/blender/gpu/vulkan/vk_device.hh @@ -104,6 +104,8 @@ class VKDevice : public NonCopyable { Vector discarded_frame_buffers_; Vector discarded_image_views_; + std::string glsl_patch_; + public: VkPhysicalDevice physical_device_get() const { @@ -196,6 +198,9 @@ class VKDevice : public NonCopyable { return workarounds_; } + const char *glsl_patch_get() const; + void init_glsl_patch(); + /* -------------------------------------------------------------------- */ /** \name Resource management * \{ */ diff --git a/source/blender/gpu/vulkan/vk_shader.cc b/source/blender/gpu/vulkan/vk_shader.cc index d5f461ab8bc..8e3cc3a430e 100644 --- a/source/blender/gpu/vulkan/vk_shader.cc +++ b/source/blender/gpu/vulkan/vk_shader.cc @@ -24,8 +24,6 @@ using namespace blender::gpu::shader; -extern "C" char datatoc_glsl_shader_defines_glsl[]; - namespace blender::gpu { /* -------------------------------------------------------------------- */ @@ -215,6 +213,9 @@ static void print_image_type(std::ostream &os, case ImageType::INT_3D: case ImageType::INT_CUBE: case ImageType::INT_CUBE_ARRAY: + case ImageType::INT_2D_ATOMIC: + case ImageType::INT_2D_ARRAY_ATOMIC: + case ImageType::INT_3D_ATOMIC: os << "i"; break; case ImageType::UINT_BUFFER: @@ -225,6 +226,9 @@ static void print_image_type(std::ostream &os, case ImageType::UINT_3D: case ImageType::UINT_CUBE: case ImageType::UINT_CUBE_ARRAY: + case ImageType::UINT_2D_ATOMIC: + case ImageType::UINT_2D_ARRAY_ATOMIC: + case ImageType::UINT_3D_ATOMIC: os << "u"; break; default: @@ -262,11 +266,17 @@ static void print_image_type(std::ostream &os, case ImageType::SHADOW_2D_ARRAY: case ImageType::DEPTH_2D: case ImageType::DEPTH_2D_ARRAY: + case ImageType::INT_2D_ATOMIC: + case ImageType::INT_2D_ARRAY_ATOMIC: + case ImageType::UINT_2D_ATOMIC: + case ImageType::UINT_2D_ARRAY_ATOMIC: os << "2D"; break; case ImageType::FLOAT_3D: case ImageType::INT_3D: + case ImageType::INT_3D_ATOMIC: case ImageType::UINT_3D: + case ImageType::UINT_3D_ATOMIC: os << "3D"; break; case ImageType::FLOAT_CUBE: @@ -299,6 +309,7 @@ static void print_image_type(std::ostream &os, case ImageType::SHADOW_CUBE_ARRAY: case ImageType::DEPTH_2D_ARRAY: case ImageType::DEPTH_CUBE_ARRAY: + case ImageType::UINT_2D_ARRAY_ATOMIC: os << "Array"; break; default: @@ -487,49 +498,6 @@ static const std::string to_stage_name(shaderc_shader_kind stage) return std::string("unknown stage"); } -static char *glsl_patch_get() -{ - static char patch[2048] = "\0"; - if (patch[0] != '\0') { - return patch; - } - - const VKWorkarounds &workarounds = VKBackend::get().device_get().workarounds_get(); - - size_t slen = 0; - /* Version need to go first. */ - STR_CONCAT(patch, slen, "#version 450\n"); - - if (GPU_shader_draw_parameters_support()) { - STR_CONCAT(patch, slen, "#extension GL_ARB_shader_draw_parameters : enable\n"); - STR_CONCAT(patch, slen, "#define GPU_ARB_shader_draw_parameters\n"); - STR_CONCAT(patch, slen, "#define gpu_BaseInstance (gl_BaseInstanceARB)\n"); - } - - STR_CONCAT(patch, slen, "#define gl_VertexID gl_VertexIndex\n"); - STR_CONCAT(patch, slen, "#define gpu_InstanceIndex (gl_InstanceIndex)\n"); - STR_CONCAT(patch, slen, "#define GPU_ARB_texture_cube_map_array\n"); - STR_CONCAT(patch, slen, "#define gl_InstanceID (gpu_InstanceIndex - gpu_BaseInstance)\n"); - - /* TODO(fclem): This creates a validation error and should be already part of Vulkan 1.2. */ - STR_CONCAT(patch, slen, "#extension GL_ARB_shader_viewport_layer_array: enable\n"); - if (!workarounds.shader_output_layer) { - STR_CONCAT(patch, slen, "#define gpu_Layer gl_Layer\n"); - } - if (!workarounds.shader_output_viewport_index) { - STR_CONCAT(patch, slen, "#define gpu_ViewportIndex gl_ViewportIndex\n"); - } - - STR_CONCAT(patch, slen, "#define DFDX_SIGN 1.0\n"); - STR_CONCAT(patch, slen, "#define DFDY_SIGN 1.0\n"); - - /* GLSL Backend Lib. */ - STR_CONCAT(patch, slen, datatoc_glsl_shader_defines_glsl); - - BLI_assert(slen < sizeof(patch)); - return patch; -} - static std::string combine_sources(Span sources) { char *sources_combined = BLI_string_join_arrayN((const char **)sources.data(), sources.size()); @@ -641,7 +609,8 @@ void VKShader::build_shader_module(MutableSpan sources, shaderc_fragment_shader, shaderc_compute_shader), "Only forced ShaderC shader kinds are supported."); - sources[0] = glsl_patch_get(); + const VKDevice &device = VKBackend::get().device_get(); + sources[0] = device.glsl_patch_get(); Vector spirv_module = compile_glsl_to_spirv(sources, stage); build_shader_module(spirv_module, r_shader_module); } @@ -776,6 +745,9 @@ static VkDescriptorType storage_descriptor_type(const shader::ImageType &image_t case shader::ImageType::INT_3D: case shader::ImageType::INT_CUBE: case shader::ImageType::INT_CUBE_ARRAY: + case shader::ImageType::INT_2D_ATOMIC: + case shader::ImageType::INT_2D_ARRAY_ATOMIC: + case shader::ImageType::INT_3D_ATOMIC: case shader::ImageType::UINT_1D: case shader::ImageType::UINT_1D_ARRAY: case shader::ImageType::UINT_2D: @@ -783,6 +755,9 @@ static VkDescriptorType storage_descriptor_type(const shader::ImageType &image_t case shader::ImageType::UINT_3D: case shader::ImageType::UINT_CUBE: case shader::ImageType::UINT_CUBE_ARRAY: + case shader::ImageType::UINT_2D_ATOMIC: + case shader::ImageType::UINT_2D_ARRAY_ATOMIC: + case shader::ImageType::UINT_3D_ATOMIC: return VK_DESCRIPTOR_TYPE_STORAGE_IMAGE; case shader::ImageType::FLOAT_BUFFER: @@ -814,6 +789,9 @@ static VkDescriptorType sampler_descriptor_type(const shader::ImageType &image_t case shader::ImageType::INT_3D: case shader::ImageType::INT_CUBE: case shader::ImageType::INT_CUBE_ARRAY: + case shader::ImageType::INT_2D_ATOMIC: + case shader::ImageType::INT_2D_ARRAY_ATOMIC: + case shader::ImageType::INT_3D_ATOMIC: case shader::ImageType::UINT_1D: case shader::ImageType::UINT_1D_ARRAY: case shader::ImageType::UINT_2D: @@ -821,6 +799,9 @@ static VkDescriptorType sampler_descriptor_type(const shader::ImageType &image_t case shader::ImageType::UINT_3D: case shader::ImageType::UINT_CUBE: case shader::ImageType::UINT_CUBE_ARRAY: + case shader::ImageType::UINT_2D_ATOMIC: + case shader::ImageType::UINT_2D_ARRAY_ATOMIC: + case shader::ImageType::UINT_3D_ATOMIC: case shader::ImageType::SHADOW_2D: case shader::ImageType::SHADOW_2D_ARRAY: case shader::ImageType::SHADOW_CUBE: diff --git a/source/blender/ikplugin/intern/iksolver_plugin.cc b/source/blender/ikplugin/intern/iksolver_plugin.cc index 8ea7183752e..3f612170c44 100644 --- a/source/blender/ikplugin/intern/iksolver_plugin.cc +++ b/source/blender/ikplugin/intern/iksolver_plugin.cc @@ -65,7 +65,7 @@ static void initialize_posetree(Object * /*ob*/, bPoseChannel *pchan_tip) blender::Vector ik_constraints; find_ik_constraints(&pchan_tip->constraints, ik_constraints); - if (ik_constraints.size() == 0) { + if (ik_constraints.is_empty()) { return; } diff --git a/source/blender/imbuf/IMB_colormanagement.h b/source/blender/imbuf/IMB_colormanagement.h index 545b10a9e6e..fba3c653037 100644 --- a/source/blender/imbuf/IMB_colormanagement.h +++ b/source/blender/imbuf/IMB_colormanagement.h @@ -534,10 +534,12 @@ enum { /** \name Rendering Tables * \{ */ +void IMB_colormanagement_blackbody_temperature_to_rgb(float r_dest[4], float value); void IMB_colormanagement_blackbody_temperature_to_rgb_table(float *r_table, int width, float min, float max); +void IMB_colormanagement_wavelength_to_rgb(float r_dest[4], float value); void IMB_colormanagement_wavelength_to_rgb_table(float *r_table, int width); /** \} */ diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h index fa2aac4ea35..2d7e911e77e 100644 --- a/source/blender/imbuf/IMB_imbuf.h +++ b/source/blender/imbuf/IMB_imbuf.h @@ -682,10 +682,11 @@ void nearest_interpolation_color_wrap( const struct ImBuf *in, unsigned char outI[4], float outF[4], float u, float v); void bilinear_interpolation_color( const struct ImBuf *in, unsigned char outI[4], float outF[4], float u, float v); -void bilinear_interpolation_color_char( - const struct ImBuf *in, unsigned char outI[4], float outF[4], float u, float v); -void bilinear_interpolation_color_fl( - const struct ImBuf *in, unsigned char outI[4], float outF[4], float u, float v); +void bilinear_interpolation_color_char(const struct ImBuf *in, + unsigned char outI[4], + float u, + float v); +void bilinear_interpolation_color_fl(const struct ImBuf *in, float outF[4], float u, float v); /** * Note about wrapping, the u/v still needs to be within the image bounds, * just the interpolation is wrapped. diff --git a/source/blender/imbuf/intern/colormanagement.cc b/source/blender/imbuf/intern/colormanagement.cc index 12c7e933947..351f0c2b4ba 100644 --- a/source/blender/imbuf/intern/colormanagement.cc +++ b/source/blender/imbuf/intern/colormanagement.cc @@ -4340,6 +4340,19 @@ static void blackbody_temperature_to_rec709(float rec709[3], float t) } } +void IMB_colormanagement_blackbody_temperature_to_rgb(float r_dest[4], float value) +{ + float rec709[3]; + blackbody_temperature_to_rec709(rec709, value); + + float rgb[3]; + IMB_colormanagement_rec709_to_scene_linear(rgb, rec709); + clamp_v3(rgb, 0.0f, FLT_MAX); + + copy_v3_v3(r_dest, rgb); + r_dest[3] = 1.0f; +} + void IMB_colormanagement_blackbody_temperature_to_rgb_table(float *r_table, const int width, const float min, @@ -4347,16 +4360,7 @@ void IMB_colormanagement_blackbody_temperature_to_rgb_table(float *r_table, { for (int i = 0; i < width; i++) { float temperature = min + (max - min) / float(width) * float(i); - - float rec709[3]; - blackbody_temperature_to_rec709(rec709, temperature); - - float rgb[3]; - IMB_colormanagement_rec709_to_scene_linear(rgb, rec709); - clamp_v3(rgb, 0.0f, FLT_MAX); - - copy_v3_v3(&r_table[i * 4], rgb); - r_table[i * 4 + 3] = 0.0f; + IMB_colormanagement_blackbody_temperature_to_rgb(&r_table[i * 4], temperature); } } @@ -4420,20 +4424,24 @@ static void wavelength_to_xyz(float xyz[3], float lambda_nm) } } +void IMB_colormanagement_wavelength_to_rgb(float r_dest[4], float value) +{ + float xyz[3]; + wavelength_to_xyz(xyz, value); + + float rgb[3]; + IMB_colormanagement_xyz_to_scene_linear(rgb, xyz); + clamp_v3(rgb, 0.0f, FLT_MAX); + + copy_v3_v3(r_dest, rgb); + r_dest[3] = 1.0f; +} + void IMB_colormanagement_wavelength_to_rgb_table(float *r_table, const int width) { for (int i = 0; i < width; i++) { - float temperature = 380 + 400 / float(width) * float(i); - - float xyz[3]; - wavelength_to_xyz(xyz, temperature); - - float rgb[3]; - IMB_colormanagement_xyz_to_scene_linear(rgb, xyz); - clamp_v3(rgb, 0.0f, FLT_MAX); - - copy_v3_v3(&r_table[i * 4], rgb); - r_table[i * 4 + 3] = 0.0f; + float wavelength = 380 + 400 / float(width) * float(i); + IMB_colormanagement_wavelength_to_rgb(&r_table[i * 4], wavelength); } } diff --git a/source/blender/imbuf/intern/imageprocess.cc b/source/blender/imbuf/intern/imageprocess.cc index 544bfac5ef1..32c95e44d09 100644 --- a/source/blender/imbuf/intern/imageprocess.cc +++ b/source/blender/imbuf/intern/imageprocess.cc @@ -83,7 +83,7 @@ void bicubic_interpolation_color(const ImBuf *in, uchar outI[4], float outF[4], BLI_bicubic_interpolation_fl(in->float_buffer.data, outF, in->x, in->y, 4, u, v); } else { - BLI_bicubic_interpolation_char(in->byte_buffer.data, outI, in->x, in->y, 4, u, v); + BLI_bicubic_interpolation_char(in->byte_buffer.data, outI, in->x, in->y, u, v); } } @@ -108,20 +108,18 @@ void bicubic_interpolation(const ImBuf *in, ImBuf *out, float u, float v, int xo /** \name Bi-Linear Interpolation * \{ */ -void bilinear_interpolation_color_fl( - const ImBuf *in, uchar /*outI*/[4], float outF[4], float u, float v) +void bilinear_interpolation_color_fl(const ImBuf *in, float outF[4], float u, float v) { BLI_assert(outF); BLI_assert(in->float_buffer.data); BLI_bilinear_interpolation_fl(in->float_buffer.data, outF, in->x, in->y, 4, u, v); } -void bilinear_interpolation_color_char( - const ImBuf *in, uchar outI[4], float /*outF*/[4], float u, float v) +void bilinear_interpolation_color_char(const ImBuf *in, uchar outI[4], float u, float v) { BLI_assert(outI); BLI_assert(in->byte_buffer.data); - BLI_bilinear_interpolation_char(in->byte_buffer.data, outI, in->x, in->y, 4, u, v); + BLI_bilinear_interpolation_char(in->byte_buffer.data, outI, in->x, in->y, u, v); } void bilinear_interpolation_color(const ImBuf *in, uchar outI[4], float outF[4], float u, float v) @@ -130,7 +128,7 @@ void bilinear_interpolation_color(const ImBuf *in, uchar outI[4], float outF[4], BLI_bilinear_interpolation_fl(in->float_buffer.data, outF, in->x, in->y, 4, u, v); } else { - BLI_bilinear_interpolation_char(in->byte_buffer.data, outI, in->x, in->y, 4, u, v); + BLI_bilinear_interpolation_char(in->byte_buffer.data, outI, in->x, in->y, u, v); } } diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp index e070ccf7105..fbbf8420371 100644 --- a/source/blender/imbuf/intern/openexr/openexr_api.cpp +++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp @@ -1438,7 +1438,10 @@ static int imb_exr_split_token(const char *str, const char *end, const char **to return int(end - *token); } -static int imb_exr_split_channel_name(ExrChannel *echan, char *layname, char *passname) +static int imb_exr_split_channel_name(ExrChannel *echan, + char *layname, + char *passname, + bool has_xyz_channels) { const int layname_maxncpy = EXR_TOT_MAXNAME; const int passname_maxncpy = EXR_TOT_MAXNAME; @@ -1446,20 +1449,26 @@ static int imb_exr_split_channel_name(ExrChannel *echan, char *layname, char *pa const char *end = name + strlen(name); const char *token; - /* Some multi-layers have the combined buffer with names A B G R saved. */ + /* Some multi-layers have the combined buffer with names V, RGBA, or XYZ saved. Additionally, the + * Z channel can be interpreted as a Depth channel, but we only detect it as such if no X and Y + * channels exists, since the Z in this case is part of XYZ. The same goes for the Y channel, + * which can be detected as a luminance channel with the same name. */ if (name[1] == 0) { + /* Notice that we will be comparing with this upper-case version of the channel name, so the + * below comparisons are effectively not case sensitive, and would also consider lowercase + * versions of the listed channels. */ echan->chan_id = BLI_toupper_ascii(name[0]); layname[0] = '\0'; - /* Notice that we are comparing with an upper-case version of the channel name, so the - * comparison is effectively not case sensitive, and would also consider lowercase versions of - * the listed channels. */ - if (ELEM(echan->chan_id, 'R', 'G', 'B', 'A', 'V')) { - BLI_strncpy(passname, "Combined", passname_maxncpy); - } - else if (echan->chan_id == 'Z') { + if (echan->chan_id == 'Z' && !has_xyz_channels) { BLI_strncpy(passname, "Depth", passname_maxncpy); } + else if (echan->chan_id == 'Y' && !has_xyz_channels) { + BLI_strncpy(passname, name, passname_maxncpy); + } + else if (ELEM(echan->chan_id, 'R', 'G', 'B', 'A', 'V', 'X', 'Y', 'Z')) { + BLI_strncpy(passname, "Combined", passname_maxncpy); + } else { BLI_strncpy(passname, name, passname_maxncpy); } @@ -1572,6 +1581,26 @@ static ExrPass *imb_exr_get_pass(ListBase *lb, char *passname) return pass; } +static bool exr_has_xyz_channels(ExrHandle *exr_handle) +{ + bool x_found = false; + bool y_found = false; + bool z_found = false; + LISTBASE_FOREACH (ExrChannel *, channel, &exr_handle->channels) { + if (channel->m->name == "X" || channel->m->name == "x") { + x_found = true; + } + if (channel->m->name == "Y" || channel->m->name == "y") { + y_found = true; + } + if (channel->m->name == "Z" || channel->m->name == "z") { + z_found = true; + } + } + + return x_found && y_found && z_found; +} + static bool imb_exr_multilayer_parse_channels_from_file(ExrHandle *data) { std::vector channels; @@ -1590,13 +1619,14 @@ static bool imb_exr_multilayer_parse_channels_from_file(ExrHandle *data) echan->m->internal_name = channel.internal_name; } + const bool has_xyz_channels = exr_has_xyz_channels(data); + /* now try to sort out how to assign memory to the channels */ /* first build hierarchical layer list */ ExrChannel *echan = (ExrChannel *)data->channels.first; for (; echan; echan = echan->next) { char layname[EXR_TOT_MAXNAME], passname[EXR_TOT_MAXNAME]; - if (imb_exr_split_channel_name(echan, layname, passname)) { - + if (imb_exr_split_channel_name(echan, layname, passname, has_xyz_channels)) { const char *view = echan->m->view.c_str(); char internal_name[EXR_PASS_MAXNAME]; @@ -1830,6 +1860,17 @@ static bool exr_has_alpha(MultiPartInputFile &file) return !(header.channels().findChannel("A") == nullptr); } +static bool exr_has_xyz(MultiPartInputFile &file) +{ + const Header &header = file.header(0); + return (header.channels().findChannel("X") != nullptr || + header.channels().findChannel("x") != nullptr) && + (header.channels().findChannel("Y") != nullptr || + header.channels().findChannel("y") != nullptr) && + (header.channels().findChannel("Z") != nullptr || + header.channels().findChannel("z") != nullptr); +} + static bool exr_is_half_float(MultiPartInputFile &file) { const ChannelList &channels = file.header(0).channels(); @@ -2033,6 +2074,7 @@ ImBuf *imb_load_openexr(const uchar *mem, size_t size, int flags, char colorspac const char *rgb_channels[3]; const int num_rgb_channels = exr_has_rgb(*file, rgb_channels); const bool has_luma = exr_has_luma(*file); + const bool has_xyz = exr_has_xyz(*file); FrameBuffer frameBuffer; float *first; size_t xstride = sizeof(float[4]); @@ -2052,6 +2094,14 @@ ImBuf *imb_load_openexr(const uchar *mem, size_t size, int flags, char colorspac Slice(Imf::FLOAT, (char *)(first + i), xstride, ystride)); } } + else if (has_xyz) { + frameBuffer.insert(exr_rgba_channelname(*file, "X"), + Slice(Imf::FLOAT, (char *)first, xstride, ystride)); + frameBuffer.insert(exr_rgba_channelname(*file, "Y"), + Slice(Imf::FLOAT, (char *)(first + 1), xstride, ystride)); + frameBuffer.insert(exr_rgba_channelname(*file, "Z"), + Slice(Imf::FLOAT, (char *)(first + 2), xstride, ystride)); + } else if (has_luma) { frameBuffer.insert(exr_rgba_channelname(*file, "Y"), Slice(Imf::FLOAT, (char *)first, xstride, ystride)); @@ -2096,16 +2146,12 @@ ImBuf *imb_load_openexr(const uchar *mem, size_t size, int flags, char colorspac BLI_YCC_ITU_BT709); } } - else if (num_rgb_channels <= 1) { + else if (!has_xyz && num_rgb_channels <= 1) { /* Convert 1 to 3 channels. */ for (size_t a = 0; a < size_t(ibuf->x) * ibuf->y; a++) { float *color = ibuf->float_buffer.data + a * 4; - if (num_rgb_channels <= 1) { - color[1] = color[0]; - } - if (num_rgb_channels <= 2) { - color[2] = color[0]; - } + color[1] = color[0]; + color[2] = color[0]; } } diff --git a/source/blender/imbuf/intern/scaling.cc b/source/blender/imbuf/intern/scaling.cc index 59311246a3c..f809116f8c1 100644 --- a/source/blender/imbuf/intern/scaling.cc +++ b/source/blender/imbuf/intern/scaling.cc @@ -1762,7 +1762,7 @@ static void *do_scale_thread(void *data_v) if (data->byte_buffer) { uchar *pixel = data->byte_buffer + 4 * offset; - BLI_bilinear_interpolation_char(ibuf->byte_buffer.data, pixel, ibuf->x, ibuf->y, 4, u, v); + BLI_bilinear_interpolation_char(ibuf->byte_buffer.data, pixel, ibuf->x, ibuf->y, u, v); } if (data->float_buffer) { diff --git a/source/blender/imbuf/intern/thumbs.cc b/source/blender/imbuf/intern/thumbs.cc index f3e7018a18f..52c43cfa3a9 100644 --- a/source/blender/imbuf/intern/thumbs.cc +++ b/source/blender/imbuf/intern/thumbs.cc @@ -11,7 +11,7 @@ #include "MEM_guardedalloc.h" -#include "BKE_blendfile.h" +#include "BKE_blendfile.hh" #include "BLI_fileops.h" #include "BLI_ghash.h" diff --git a/source/blender/imbuf/intern/transform.cc b/source/blender/imbuf/intern/transform.cc index 9db14362c86..833d8ef52f7 100644 --- a/source/blender/imbuf/intern/transform.cc +++ b/source/blender/imbuf/intern/transform.cc @@ -145,34 +145,16 @@ struct TransformUserData { } }; -/** - * \brief Base class for source discarding. - * - * The class decides if a specific uv coordinate from the source buffer should be ignored. - * This is used to mix multiple images over a single output buffer. Discarded pixels will - * not change the output buffer. - */ -class BaseDiscard { - public: - virtual ~BaseDiscard() = default; - - /** - * \brief Should the source pixel at the given uv coordinate be discarded. - */ - virtual bool should_discard(const TransformUserData &user_data, const double2 &uv) = 0; -}; - /** * \brief Crop uv-coordinates that are outside the user data src_crop rect. */ -class CropSource : public BaseDiscard { - public: +struct CropSource { /** * \brief Should the source pixel at the given uv coordinate be discarded. * * Uses user_data.src_crop to determine if the uv coordinate should be skipped. */ - bool should_discard(const TransformUserData &user_data, const double2 &uv) override + static bool should_discard(const TransformUserData &user_data, const double2 &uv) { return uv.x < user_data.src_crop.xmin || uv.x >= user_data.src_crop.xmax || uv.y < user_data.src_crop.ymin || uv.y >= user_data.src_crop.ymax; @@ -182,14 +164,13 @@ class CropSource : public BaseDiscard { /** * \brief Discard that does not discard anything. */ -class NoDiscard : public BaseDiscard { - public: +struct NoDiscard { /** * \brief Should the source pixel at the given uv coordinate be discarded. * * Will never discard any pixels. */ - bool should_discard(const TransformUserData & /*user_data*/, const double2 & /*uv*/) override + static bool should_discard(const TransformUserData & /*user_data*/, const double2 & /*uv*/) { return false; } @@ -250,73 +231,19 @@ class PixelPointer { }; /** - * \brief Wrapping mode for the uv coordinates. - * - * Subclasses have the ability to change the UV coordinates when sampling the source buffer. + * \brief Repeats UV coordinate. */ -class BaseUVWrapping { - public: - /** - * \brief modify the given u coordinate. - */ - virtual double modify_u(const ImBuf *source_buffer, double u) = 0; - - /** - * \brief modify the given v coordinate. - */ - virtual double modify_v(const ImBuf *source_buffer, double v) = 0; - - /** - * \brief modify the given uv coordinate. - */ - double2 modify_uv(const ImBuf *source_buffer, const double2 &uv) - { - return double2(modify_u(source_buffer, uv.x), modify_v(source_buffer, uv.y)); - } -}; - -/** - * \brief UVWrapping method that does not modify the UV coordinates. - */ -class PassThroughUV : public BaseUVWrapping { - public: - double modify_u(const ImBuf * /*source_buffer*/, double u) override - { - return u; - } - - double modify_v(const ImBuf * /*source_buffer*/, double v) override - { - return v; - } -}; - -/** - * \brief UVWrapping method that wrap repeats the UV coordinates. - */ -class WrapRepeatUV : public BaseUVWrapping { - public: - double modify_u(const ImBuf *source_buffer, double u) override - - { - int x = int(floor(u)); - x = x % source_buffer->x; +static float wrap_uv(float value, int size) +{ + int x = int(floorf(value)); + if (UNLIKELY(x < 0 || x >= size)) { + x %= size; if (x < 0) { - x += source_buffer->x; + x += size; } - return x; } - - double modify_v(const ImBuf *source_buffer, double v) override - { - int y = int(floor(v)); - y = y % source_buffer->y; - if (y < 0) { - y += source_buffer->y; - } - return y; - } -}; + return x; +} /* TODO: should we use math_vectors for this. */ template @@ -369,14 +296,10 @@ template< */ int NumChannels, /** - * \brief Wrapping method to perform - * - * Should be a subclass of BaseUVWrapper + * \brief Should UVs wrap */ - typename UVWrapping> + bool UVWrapping> class Sampler { - UVWrapping uv_wrapper; - public: using ChannelType = StorageType; static const int ChannelLen = NumChannels; @@ -384,26 +307,29 @@ class Sampler { void sample(const ImBuf *source, const double2 &uv, SampleType &r_sample) { + float u = float(uv.x); + float v = float(uv.y); + if constexpr (UVWrapping) { + u = wrap_uv(u, source->x); + v = wrap_uv(v, source->y); + } if constexpr (Filter == IMB_FILTER_BILINEAR && std::is_same_v && NumChannels == 4) { - const double2 wrapped_uv = uv_wrapper.modify_uv(source, uv); - bilinear_interpolation_color_fl(source, nullptr, r_sample.data(), UNPACK2(wrapped_uv)); + bilinear_interpolation_color_fl(source, r_sample.data(), u, v); } else if constexpr (Filter == IMB_FILTER_NEAREST && std::is_same_v && NumChannels == 4) { - const double2 wrapped_uv = uv_wrapper.modify_uv(source, uv); - nearest_interpolation_color_char(source, r_sample.data(), nullptr, UNPACK2(wrapped_uv)); + nearest_interpolation_color_char(source, r_sample.data(), nullptr, u, v); } else if constexpr (Filter == IMB_FILTER_BILINEAR && std::is_same_v && NumChannels == 4) { - const double2 wrapped_uv = uv_wrapper.modify_uv(source, uv); - bilinear_interpolation_color_char(source, r_sample.data(), nullptr, UNPACK2(wrapped_uv)); + bilinear_interpolation_color_char(source, r_sample.data(), u, v); } else if constexpr (Filter == IMB_FILTER_BILINEAR && std::is_same_v) { - if constexpr (std::is_same_v) { + if constexpr (UVWrapping) { BLI_bilinear_interpolation_wrap_fl(source->float_buffer.data, r_sample.data(), source->x, @@ -414,18 +340,12 @@ class Sampler { true); } else { - const double2 wrapped_uv = uv_wrapper.modify_uv(source, uv); - BLI_bilinear_interpolation_fl(source->float_buffer.data, - r_sample.data(), - source->x, - source->y, - NumChannels, - UNPACK2(wrapped_uv)); + BLI_bilinear_interpolation_fl( + source->float_buffer.data, r_sample.data(), source->x, source->y, NumChannels, u, v); } } else if constexpr (Filter == IMB_FILTER_NEAREST && std::is_same_v) { - const double2 wrapped_uv = uv_wrapper.modify_uv(source, uv); - sample_nearest_float(source, wrapped_uv, r_sample); + sample_nearest_float(source, u, v, r_sample); } else { /* Unsupported sampler. */ @@ -434,13 +354,16 @@ class Sampler { } private: - void sample_nearest_float(const ImBuf *source, const double2 &uv, SampleType &r_sample) + void sample_nearest_float(const ImBuf *source, + const float u, + const float v, + SampleType &r_sample) { BLI_STATIC_ASSERT(std::is_same_v); /* ImBuf in must have a valid rect or rect_float, assume this is already checked */ - int x1 = int(uv.x); - int y1 = int(uv.y); + int x1 = int(u); + int y1 = int(v); /* Break when sample outside image is requested. */ if (x1 < 0 || x1 >= source->x || y1 < 0 || y1 >= source->y) { @@ -537,9 +460,7 @@ class ChannelConverter { */ template< /** - * \brief Discard function to use. - * - * \attention Should be a subclass of BaseDiscard. + * \brief Discard functor that implements `should_discard`. */ typename Discard, @@ -659,17 +580,17 @@ ScanlineThreadFunc get_scanline_function(const eIMBTransformMode mode) case IMB_TRANSFORM_MODE_REGULAR: return transform_scanline_function< ScanlineProcessor, + Sampler, PixelPointer>>; case IMB_TRANSFORM_MODE_CROP_SRC: return transform_scanline_function< ScanlineProcessor, + Sampler, PixelPointer>>; case IMB_TRANSFORM_MODE_WRAP_REPEAT: return transform_scanline_function< ScanlineProcessor, + Sampler, PixelPointer>>; } diff --git a/source/blender/io/alembic/CMakeLists.txt b/source/blender/io/alembic/CMakeLists.txt index 9287fc546c9..3f7822dcb77 100644 --- a/source/blender/io/alembic/CMakeLists.txt +++ b/source/blender/io/alembic/CMakeLists.txt @@ -44,7 +44,6 @@ set(SRC exporter/abc_custom_props.cc exporter/abc_export_capi.cc exporter/abc_hierarchy_iterator.cc - exporter/abc_subdiv_disabler.cc exporter/abc_writer_abstract.cc exporter/abc_writer_camera.cc exporter/abc_writer_curves.cc @@ -72,7 +71,6 @@ set(SRC exporter/abc_archive.h exporter/abc_custom_props.h exporter/abc_hierarchy_iterator.h - exporter/abc_subdiv_disabler.h exporter/abc_writer_abstract.h exporter/abc_writer_camera.h exporter/abc_writer_curves.h diff --git a/source/blender/io/alembic/exporter/abc_export_capi.cc b/source/blender/io/alembic/exporter/abc_export_capi.cc index 2922a606c05..f395cf86ee6 100644 --- a/source/blender/io/alembic/exporter/abc_export_capi.cc +++ b/source/blender/io/alembic/exporter/abc_export_capi.cc @@ -3,9 +3,9 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #include "ABC_alembic.h" +#include "IO_subdiv_disabler.hh" #include "abc_archive.h" #include "abc_hierarchy_iterator.h" -#include "abc_subdiv_disabler.h" #include "MEM_guardedalloc.h" diff --git a/source/blender/io/alembic/exporter/abc_subdiv_disabler.cc b/source/blender/io/alembic/exporter/abc_subdiv_disabler.cc deleted file mode 100644 index e74f1f26067..00000000000 --- a/source/blender/io/alembic/exporter/abc_subdiv_disabler.cc +++ /dev/null @@ -1,86 +0,0 @@ -/* SPDX-FileCopyrightText: 2020 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ -#include "abc_subdiv_disabler.h" - -#include - -#include "BLI_listbase.h" - -#include "DEG_depsgraph.hh" -#include "DEG_depsgraph_query.hh" - -#include "DNA_layer_types.h" -#include "DNA_mesh_types.h" -#include "DNA_modifier_types.h" -#include "DNA_object_types.h" - -#include "BKE_layer.h" -#include "BKE_modifier.hh" - -namespace blender::io::alembic { - -SubdivModifierDisabler::SubdivModifierDisabler(Depsgraph *depsgraph) : depsgraph_(depsgraph) {} - -SubdivModifierDisabler::~SubdivModifierDisabler() -{ - for (ModifierData *modifier : disabled_modifiers_) { - modifier->mode &= ~eModifierMode_DisableTemporary; - } -} - -void SubdivModifierDisabler::disable_modifiers() -{ - Scene *scene = DEG_get_input_scene(depsgraph_); - ViewLayer *view_layer = DEG_get_input_view_layer(depsgraph_); - - BKE_view_layer_synced_ensure(scene, view_layer); - LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) { - Object *object = base->object; - - if (object->type != OB_MESH) { - continue; - } - - ModifierData *subdiv = get_subdiv_modifier(scene, object); - if (subdiv == nullptr) { - continue; - } - - /* This disables more modifiers than necessary, as it doesn't take restrictions like - * "export selected objects only" into account. However, with the subsurfs disabled, - * moving to a different frame is also going to be faster, so in the end this is probably - * a good thing to do. */ - subdiv->mode |= eModifierMode_DisableTemporary; - disabled_modifiers_.insert(subdiv); - DEG_id_tag_update(&object->id, ID_RECALC_GEOMETRY); - } -} - -ModifierData *SubdivModifierDisabler::get_subdiv_modifier(Scene *scene, Object *ob) -{ - ModifierData *md = static_cast(ob->modifiers.last); - - for (; md; md = md->prev) { - if (!BKE_modifier_is_enabled(scene, md, eModifierMode_Render)) { - continue; - } - - if (md->type == eModifierType_Subsurf) { - SubsurfModifierData *smd = reinterpret_cast(md); - - if (smd->subdivType == ME_CC_SUBSURF) { - return md; - } - } - - /* mesh is not a subsurf. break */ - if (!ELEM(md->type, eModifierType_Displace, eModifierType_ParticleSystem)) { - return nullptr; - } - } - - return nullptr; -} - -} // namespace blender::io::alembic diff --git a/source/blender/io/alembic/exporter/abc_subdiv_disabler.h b/source/blender/io/alembic/exporter/abc_subdiv_disabler.h deleted file mode 100644 index cd568516102..00000000000 --- a/source/blender/io/alembic/exporter/abc_subdiv_disabler.h +++ /dev/null @@ -1,40 +0,0 @@ -/* SPDX-FileCopyrightText: 2020 Blender Authors - * - * SPDX-License-Identifier: GPL-2.0-or-later */ -#pragma once - -#include - -struct Depsgraph; -struct ModifierData; -struct Object; -struct Scene; - -namespace blender::io::alembic { - -/** - * Temporarily all subdivision modifiers on mesh objects. - * The destructor restores all disabled modifiers. - * - * This is used to export unsubdivided meshes to Alembic. It is done in a separate step before the - * exporter starts iterating over all the frames, so that it only has to happen once per export. - */ -class SubdivModifierDisabler final { - private: - Depsgraph *depsgraph_; - std::set disabled_modifiers_; - - public: - explicit SubdivModifierDisabler(Depsgraph *depsgraph); - ~SubdivModifierDisabler(); - - void disable_modifiers(); - - /** - * Check if the mesh is a subsurf, ignoring disabled modifiers and - * displace if it's after subsurf. - */ - static ModifierData *get_subdiv_modifier(Scene *scene, Object *ob); -}; - -} // namespace blender::io::alembic diff --git a/source/blender/io/alembic/intern/abc_reader_mesh.cc b/source/blender/io/alembic/intern/abc_reader_mesh.cc index 18f01206fa7..d3743587b0d 100644 --- a/source/blender/io/alembic/intern/abc_reader_mesh.cc +++ b/source/blender/io/alembic/intern/abc_reader_mesh.cc @@ -156,7 +156,7 @@ static void read_mverts(CDStreamConfig &config, const AbcMeshData &mesh_data) const double weight = mesh_data.interpolation_settings->weight; read_mverts_interp(vert_positions, positions, mesh_data.ceil_positions, weight); - BKE_mesh_tag_positions_changed(config.mesh); + config.mesh->tag_positions_changed(); return; } @@ -171,7 +171,7 @@ void read_mverts(Mesh &mesh, const P3fArraySamplePtr positions, const N3fArraySa copy_zup_from_yup(vert_positions[i], pos_in.getValue()); } - BKE_mesh_tag_positions_changed(&mesh); + mesh.tag_positions_changed(); if (normals) { Vector vert_normals(mesh.totvert); diff --git a/source/blender/io/collada/AnimationImporter.cpp b/source/blender/io/collada/AnimationImporter.cpp index 700cefe58cb..ce4db271f64 100644 --- a/source/blender/io/collada/AnimationImporter.cpp +++ b/source/blender/io/collada/AnimationImporter.cpp @@ -15,6 +15,7 @@ #include "ED_keyframing.hh" +#include "ANIM_animdata.hh" #include "ANIM_fcurve.hh" #include "BLI_listbase.h" @@ -188,7 +189,7 @@ void AnimationImporter::add_fcurves_to_object(Main *bmain, bAction *act; if (!ob->adt || !ob->adt->action) { - act = ED_id_action_ensure(bmain, (ID *)&ob->id); + act = blender::animrig::id_action_ensure(bmain, (ID *)&ob->id); } else { act = ob->adt->action; @@ -920,7 +921,7 @@ void AnimationImporter::apply_matrix_curves(Object *ob, } } Main *bmain = CTX_data_main(mContext); - ED_id_action_ensure(bmain, (ID *)&ob->id); + blender::animrig::id_action_ensure(bmain, (ID *)&ob->id); ListBase *curves = &ob->adt->action->curves; @@ -983,7 +984,7 @@ static ListBase &get_animation_curves(Main *bmain, Material *ma) { bAction *act; if (!ma->adt || !ma->adt->action) { - act = ED_id_action_ensure(bmain, (ID *)&ma->id); + act = blender::animrig::id_action_ensure(bmain, (ID *)&ma->id); } else { act = ma->adt->action; @@ -1029,7 +1030,7 @@ void AnimationImporter::translate_Animations( } if (!ob->adt || !ob->adt->action) { - act = ED_id_action_ensure(bmain, (ID *)&ob->id); + act = blender::animrig::id_action_ensure(bmain, (ID *)&ob->id); } else { act = ob->adt->action; @@ -1091,7 +1092,7 @@ void AnimationImporter::translate_Animations( if ((animType->light) != 0) { Light *lamp = (Light *)ob->data; if (!lamp->adt || !lamp->adt->action) { - act = ED_id_action_ensure(bmain, (ID *)&lamp->id); + act = blender::animrig::id_action_ensure(bmain, (ID *)&lamp->id); } else { act = lamp->adt->action; @@ -1129,7 +1130,7 @@ void AnimationImporter::translate_Animations( Camera *cam = (Camera *)ob->data; if (!cam->adt || !cam->adt->action) { - act = ED_id_action_ensure(bmain, (ID *)&cam->id); + act = blender::animrig::id_action_ensure(bmain, (ID *)&cam->id); } else { act = cam->adt->action; @@ -1185,7 +1186,7 @@ void AnimationImporter::translate_Animations( Material *ma = BKE_object_material_get(ob, 1); if (!ma->adt || !ma->adt->action) { - act = ED_id_action_ensure(bmain, (ID *)&ma->id); + act = blender::animrig::id_action_ensure(bmain, (ID *)&ma->id); } else { act = ma->adt->action; @@ -1366,7 +1367,7 @@ void AnimationImporter::add_bone_animation_sampled(Object *ob, } } Main *bmain = CTX_data_main(mContext); - ED_id_action_ensure(bmain, (ID *)&ob->id); + blender::animrig::id_action_ensure(bmain, (ID *)&ob->id); /* add curves */ for (int i = 0; i < totcu; i++) { @@ -1793,7 +1794,7 @@ Object *AnimationImporter::translate_animation_OLD( #endif } Main *bmain = CTX_data_main(mContext); - ED_id_action_ensure(bmain, (ID *)&ob->id); + blender::animrig::id_action_ensure(bmain, (ID *)&ob->id); ListBase *curves = &ob->adt->action->curves; @@ -2097,7 +2098,7 @@ Object *AnimationImporter::get_joint_object(COLLADAFW::Node *root, mul_v3_fl(job->scale, 0.5f); DEG_id_tag_update(&job->id, ID_RECALC_TRANSFORM); - ED_id_action_ensure((ID *)&job->id); + blender::animrig::id_action_ensure((ID *)&job->id); job->rotmode = ROT_MODE_QUAT; diff --git a/source/blender/io/collada/ArmatureExporter.cpp b/source/blender/io/collada/ArmatureExporter.cpp index df8a7836d29..713b3ce7d26 100644 --- a/source/blender/io/collada/ArmatureExporter.cpp +++ b/source/blender/io/collada/ArmatureExporter.cpp @@ -39,7 +39,7 @@ void ArmatureExporter::add_bone_collections(Object *ob_arm, COLLADASW::Node &nod std::stringstream collection_stream; std::stringstream visible_stream; - LISTBASE_FOREACH (const BoneCollection *, bcoll, &armature->collections) { + for (const BoneCollection *bcoll : armature->collections_span()) { collection_stream << bcoll->name << "\n"; if (bcoll->flags & BONE_COLLECTION_VISIBLE) { @@ -115,7 +115,7 @@ bool ArmatureExporter::add_instance_controller(Object *ob) ins.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, controller_id)); Mesh *mesh = (Mesh *)ob->data; - if (BKE_mesh_deform_verts(mesh) == nullptr) { + if (mesh->deform_verts().is_empty()) { return false; } diff --git a/source/blender/io/collada/ControllerExporter.cpp b/source/blender/io/collada/ControllerExporter.cpp index 0c115cc03e0..5e5bb2582c4 100644 --- a/source/blender/io/collada/ControllerExporter.cpp +++ b/source/blender/io/collada/ControllerExporter.cpp @@ -66,7 +66,7 @@ bool ControllerExporter::add_instance_controller(Object *ob) ins.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, controller_id)); Mesh *mesh = (Mesh *)ob->data; - if (BKE_mesh_deform_verts(mesh) == nullptr) { + if (mesh->deform_verts().is_empty()) { return false; } @@ -162,7 +162,7 @@ void ControllerExporter::export_skin_controller(Object *ob, Object *ob_arm) bool use_instantiation = this->export_settings.get_use_object_instantiation(); Mesh *mesh; - if (BKE_mesh_deform_verts((Mesh *)ob->data) == nullptr) { + if (((Mesh *)ob->data)->deform_verts().is_empty()) { return; } @@ -205,7 +205,7 @@ void ControllerExporter::export_skin_controller(Object *ob, Object *ob_arm) } } - const MDeformVert *dvert = BKE_mesh_deform_verts(mesh); + const MDeformVert *dvert = mesh->deform_verts().data(); int oob_counter = 0; for (i = 0; i < mesh->totvert; i++) { const MDeformVert *vert = &dvert[i]; diff --git a/source/blender/io/collada/MeshImporter.cpp b/source/blender/io/collada/MeshImporter.cpp index 8f0f45816a7..84222d1de59 100644 --- a/source/blender/io/collada/MeshImporter.cpp +++ b/source/blender/io/collada/MeshImporter.cpp @@ -18,7 +18,7 @@ #include "MEM_guardedalloc.h" -#include "BKE_attribute.h" +#include "BKE_attribute.hh" #include "BKE_customdata.hh" #include "BKE_displist.h" #include "BKE_global.h" @@ -601,6 +601,7 @@ void MeshImporter::read_polys(COLLADAFW::Mesh *collada_mesh, Mesh *mesh, blender::Vector &loop_normals) { + using namespace blender; uint i; allocate_poly_data(collada_mesh, mesh); @@ -615,7 +616,10 @@ void MeshImporter::read_polys(COLLADAFW::Mesh *collada_mesh, MaterialIdPrimitiveArrayMap mat_prim_map; - int *material_indices = BKE_mesh_material_indices_for_write(mesh); + bke::MutableAttributeAccessor attributes = mesh->attributes_for_write(); + bke::SpanAttributeWriter material_indices = attributes.lookup_or_add_for_write_span( + "material_index", ATTR_DOMAIN_FACE); + bool *sharp_faces = static_cast(CustomData_get_layer_named_for_write( &mesh->face_data, CD_PROP_BOOL, "sharp_face", mesh->faces_num)); if (!sharp_faces) { @@ -642,7 +646,7 @@ void MeshImporter::read_polys(COLLADAFW::Mesh *collada_mesh, /* Since we cannot set `poly->mat_nr` here, we store a portion of `mesh->mpoly` in Primitive. */ - Primitive prim = {face_index, &material_indices[face_index], 0}; + Primitive prim = {face_index, &material_indices.span[face_index], 0}; /* If MeshPrimitive is TRIANGLE_FANS we split it into triangles * The first triangle-fan vertex will be the first vertex in every triangle @@ -800,6 +804,7 @@ void MeshImporter::read_polys(COLLADAFW::Mesh *collada_mesh, } geom_uid_mat_mapping_map[collada_mesh->getUniqueId()] = mat_prim_map; + material_indices.finish(); } void MeshImporter::get_vector(float v[3], COLLADAFW::MeshVertexData &arr, int i, int stride) diff --git a/source/blender/io/common/CMakeLists.txt b/source/blender/io/common/CMakeLists.txt index 03365aa3c7e..10269e17d2e 100644 --- a/source/blender/io/common/CMakeLists.txt +++ b/source/blender/io/common/CMakeLists.txt @@ -18,12 +18,14 @@ set(SRC intern/object_identifier.cc intern/orientation.cc intern/path_util.cc + intern/subdiv_disabler.cc IO_abstract_hierarchy_iterator.h IO_dupli_persistent_id.hh IO_orientation.hh IO_path_util.hh IO_path_util_types.hh + IO_subdiv_disabler.hh IO_types.hh intern/dupli_parent_finder.hh ) diff --git a/source/blender/io/common/IO_subdiv_disabler.hh b/source/blender/io/common/IO_subdiv_disabler.hh new file mode 100644 index 00000000000..59ed65283dc --- /dev/null +++ b/source/blender/io/common/IO_subdiv_disabler.hh @@ -0,0 +1,62 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ +#pragma once + +#include "DNA_modifier_types.h" + +#include + +struct Depsgraph; +struct ModifierData; +struct Object; +struct Scene; + +namespace blender::io { + +/** + * This code is shared between the Alembic and USD exporters. + * Temporarily disable the subdiv modifier on mesh objects, + * if the subdiv modifier is last on the modifier stack. + * + * The destructor restores all disabled modifiers. + * + * Currently, this class is used to disable Catmull-Clark subdivision modifiers. + * It is done in a separate step before the exporter starts iterating over all + * the frames, so that it only has to happen once per export. + */ +class SubdivModifierDisabler final { + private: + Depsgraph *depsgraph_; + std::set disabled_modifiers_; + std::set modified_objects_; + + public: + explicit SubdivModifierDisabler(Depsgraph *depsgraph); + ~SubdivModifierDisabler(); + + /** + * Disable subdiv modifiers on all mesh objects. + */ + void disable_modifiers(); + + /** + * Return the Catmull-Clark subdiv modifier on the mesh, if it's the last modifier + * in the list or if it's the last modifier preceding any particle system modifiers. + * This function ignores Simple subdiv modifiers. + */ + static ModifierData *get_subdiv_modifier(Scene *scene, const Object *ob, ModifierMode mode); + + /* Disallow copying. */ + SubdivModifierDisabler(const SubdivModifierDisabler &) = delete; + SubdivModifierDisabler &operator=(const SubdivModifierDisabler &) = delete; + + private: + /** + * Disable the given modifier and add it to the disabled + * modifiers list. + */ + void disable_modifier(ModifierData *mod); +}; + +} // namespace blender::io diff --git a/source/blender/io/common/intern/subdiv_disabler.cc b/source/blender/io/common/intern/subdiv_disabler.cc new file mode 100644 index 00000000000..4281185db44 --- /dev/null +++ b/source/blender/io/common/intern/subdiv_disabler.cc @@ -0,0 +1,118 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ +#include "IO_subdiv_disabler.hh" + +#include + +#include "BLI_listbase.h" + +#include "DEG_depsgraph.hh" +#include "DEG_depsgraph_query.hh" + +#include "DNA_layer_types.h" +#include "DNA_mesh_types.h" +#include "DNA_modifier_types.h" +#include "DNA_object_types.h" + +#include "BKE_layer.h" +#include "BKE_modifier.hh" + +namespace blender::io { + +/* Returns the last subdiv modifier associated with an object, + * if that modifier should be disabled. + * We do not disable the subdiv modifier if other modifiers are + * applied after it, with the sole exception of particle modifiers, + * which are allowed. + * Returns nullptr if there is not any subdiv modifier to disable. + */ +ModifierData *SubdivModifierDisabler::get_subdiv_modifier(Scene *scene, + const Object *ob, + ModifierMode mode) +{ + ModifierData *md = static_cast(ob->modifiers.last); + + for (; md; md = md->prev) { + /* Ignore disabled modifiers. */ + if (!BKE_modifier_is_enabled(scene, md, mode)) { + continue; + } + + if (md->type == eModifierType_Subsurf) { + SubsurfModifierData *smd = reinterpret_cast(md); + + if (smd->subdivType == ME_CC_SUBSURF) { + /* This is a Catmull-Clark modifier. */ + return md; + } + + /* Not Catmull-Clark, so ignore it. */ + return nullptr; + } + + /* If any modifier other than a particle system exists after the + * subdiv modifier, then abort. */ + if (md->type != eModifierType_ParticleSystem) { + return nullptr; + } + } + + return nullptr; +} + +SubdivModifierDisabler::SubdivModifierDisabler(Depsgraph *depsgraph) : depsgraph_(depsgraph) {} + +SubdivModifierDisabler::~SubdivModifierDisabler() +{ + /* Enable previously disabled modifiers. */ + for (ModifierData *modifier : disabled_modifiers_) { + modifier->mode &= ~eModifierMode_DisableTemporary; + } + + /* Update object to render with restored modifiers in the viewport. */ + for (Object *object : modified_objects_) { + DEG_id_tag_update(&object->id, ID_RECALC_GEOMETRY); + } +} + +void SubdivModifierDisabler::disable_modifiers() +{ + eEvaluationMode eval_mode = DEG_get_mode(depsgraph_); + const ModifierMode mode = eval_mode == DAG_EVAL_VIEWPORT ? eModifierMode_Realtime : + eModifierMode_Render; + + Scene *scene = DEG_get_input_scene(depsgraph_); + ViewLayer *view_layer = DEG_get_input_view_layer(depsgraph_); + + BKE_view_layer_synced_ensure(scene, view_layer); + LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) { + Object *object = base->object; + + if (object->type != OB_MESH) { + continue; + } + + /* Check if a subdiv modifier exists, and should be disabled. */ + ModifierData *mod = get_subdiv_modifier(scene, object, mode); + if (!mod) { + continue; + } + + /* This might disable more modifiers than necessary, as it doesn't take restrictions like + * "export selected objects only" into account. However, with the subdivs disabled, + * moving to a different frame is also going to be faster, so in the end this is probably + * a good thing to do. */ + disable_modifier(mod); + modified_objects_.insert(object); + DEG_id_tag_update(&object->id, ID_RECALC_GEOMETRY); + } +} + +void SubdivModifierDisabler::disable_modifier(ModifierData *mod) +{ + mod->mode |= eModifierMode_DisableTemporary; + disabled_modifiers_.insert(mod); +} + +} // namespace blender::io diff --git a/source/blender/io/ply/importer/ply_import_buffer.cc b/source/blender/io/ply/importer/ply_import_buffer.cc index 061341f5760..4e96b7dd04b 100644 --- a/source/blender/io/ply/importer/ply_import_buffer.cc +++ b/source/blender/io/ply/importer/ply_import_buffer.cc @@ -11,7 +11,7 @@ static inline bool is_newline(char ch) { - return ch == '\n' || ch == '\r'; + return ch == '\n'; } namespace blender::io::ply { @@ -48,8 +48,12 @@ Span PlyReadBuffer::read_line() pos_++; } int res_end = pos_; - /* Move past newlines (possibly multiple for different line endings). */ - while (pos_ < buf_used_ && is_newline(buffer_[pos_])) { + /* Remove possible trailing CR from the result. */ + if (res_end > res_begin && buffer_[res_end - 1] == '\r') { + --res_end; + } + /* Move cursor past newline. */ + if (pos_ < buf_used_ && is_newline(buffer_[pos_])) { pos_++; } return Span(buffer_.data() + res_begin, res_end - res_begin); diff --git a/source/blender/io/ply/importer/ply_import_mesh.cc b/source/blender/io/ply/importer/ply_import_mesh.cc index f297b24368c..f92fb69c258 100644 --- a/source/blender/io/ply/importer/ply_import_mesh.cc +++ b/source/blender/io/ply/importer/ply_import_mesh.cc @@ -121,7 +121,7 @@ Mesh *convert_ply_to_mesh(PlyData &data, const PLYImportParams ¶ms) } else { /* No vertex normals: set faces to sharp. */ - BKE_mesh_smooth_flag_set(mesh, false); + bke::mesh_smooth_set(*mesh, false); } /* Custom attributes: add them after anything above. */ diff --git a/source/blender/io/ply/tests/io_ply_importer_test.cc b/source/blender/io/ply/tests/io_ply_importer_test.cc index b0915ea4ede..26bfba4c261 100644 --- a/source/blender/io/ply/tests/io_ply_importer_test.cc +++ b/source/blender/io/ply/tests/io_ply_importer_test.cc @@ -113,6 +113,13 @@ TEST_F(ply_import_test, PLYImportWireframeCube) import_and_check("wireframe_cube.ply", expect); } +TEST_F(ply_import_test, PlyImportBinaryDataStartsWithLF) +{ + Expectation expect = {4, 1, 4, 0, 37235, 0, float3(-1, -1, 0), float3(-1, 1, 0)}; + import_and_check("bin_data_starts_with_lf.ply", expect); + import_and_check("bin_data_starts_with_lf_header_crlf.ply", expect); +} + TEST_F(ply_import_test, PLYImportBunny) { Expectation expect = {1623, diff --git a/source/blender/io/usd/hydra/mesh.cc b/source/blender/io/usd/hydra/mesh.cc index 1239c12b258..c26160a48d9 100644 --- a/source/blender/io/usd/hydra/mesh.cc +++ b/source/blender/io/usd/hydra/mesh.cc @@ -10,7 +10,7 @@ #include "BLI_string.h" #include "BLI_vector_set.hh" -#include "BKE_attribute.h" +#include "BKE_attribute.hh" #include "BKE_material.h" #include "BKE_mesh.hh" #include "BKE_mesh_runtime.hh" @@ -277,10 +277,10 @@ void gather_corner_data(const Span looptris, MutableSpan dst_data) { triangles.foreach_index_optimized(GrainSize(1024), [&](const int src, const int dst) { - const MLoopTri &tri = looptris[src]; - dst_data[dst * 3 + 0] = src_data[tri.tri[0]]; - dst_data[dst * 3 + 1] = src_data[tri.tri[1]]; - dst_data[dst * 3 + 2] = src_data[tri.tri[2]]; + const MLoopTri < = looptris[src]; + dst_data[dst * 3 + 0] = src_data[lt.tri[0]]; + dst_data[dst * 3 + 1] = src_data[lt.tri[1]]; + dst_data[dst * 3 + 2] = src_data[lt.tri[2]]; }); } @@ -315,10 +315,10 @@ static void copy_submesh(const Mesh &mesh, * for vertices actually used by the subset of triangles. */ verts.reserve(triangles.size()); triangles.foreach_index([&](const int src, const int dst) { - const MLoopTri &tri = looptris[src]; - sm.face_vertex_indices[dst * 3 + 0] = verts.index_of_or_add(corner_verts[tri.tri[0]]); - sm.face_vertex_indices[dst * 3 + 1] = verts.index_of_or_add(corner_verts[tri.tri[1]]); - sm.face_vertex_indices[dst * 3 + 2] = verts.index_of_or_add(corner_verts[tri.tri[2]]); + const MLoopTri < = looptris[src]; + sm.face_vertex_indices[dst * 3 + 0] = verts.index_of_or_add(corner_verts[lt.tri[0]]); + sm.face_vertex_indices[dst * 3 + 1] = verts.index_of_or_add(corner_verts[lt.tri[1]]); + sm.face_vertex_indices[dst * 3 + 2] = verts.index_of_or_add(corner_verts[lt.tri[2]]); }); dst_verts_num = verts.size(); } @@ -343,10 +343,10 @@ static void copy_submesh(const Mesh &mesh, break; case bke::MeshNormalDomain::Point: triangles.foreach_index(GrainSize(1024), [&](const int src, const int dst) { - const MLoopTri &tri = looptris[src]; - dst_normals[dst * 3 + 0] = src_normals[corner_verts[tri.tri[0]]]; - dst_normals[dst * 3 + 1] = src_normals[corner_verts[tri.tri[1]]]; - dst_normals[dst * 3 + 2] = src_normals[corner_verts[tri.tri[2]]]; + const MLoopTri < = looptris[src]; + dst_normals[dst * 3 + 0] = src_normals[corner_verts[lt.tri[0]]]; + dst_normals[dst * 3 + 1] = src_normals[corner_verts[lt.tri[1]]]; + dst_normals[dst * 3 + 2] = src_normals[corner_verts[lt.tri[2]]]; }); break; case bke::MeshNormalDomain::Corner: @@ -373,21 +373,20 @@ void MeshData::write_submeshes(const Mesh *mesh) const Span corner_verts = mesh->corner_verts(); const Span looptris = mesh->looptris(); const Span looptri_faces = mesh->looptri_faces(); - const std::pair> normals = get_mesh_normals(*mesh); + const bke::AttributeAccessor attributes = mesh->attributes(); + const StringRef active_uv = CustomData_get_active_layer_name(&mesh->loop_data, CD_PROP_FLOAT2); + const VArraySpan uv_map = *attributes.lookup(active_uv, ATTR_DOMAIN_CORNER); + const VArraySpan material_indices = *attributes.lookup("material_index", ATTR_DOMAIN_FACE); - const float2 *uv_map = static_cast( - CustomData_get_layer(&mesh->loop_data, CD_PROP_FLOAT2)); - - const int *material_indices = BKE_mesh_material_indices(mesh); - if (!material_indices) { + if (material_indices.is_empty()) { copy_submesh(*mesh, vert_positions, corner_verts, looptris, looptri_faces, normals, - uv_map ? Span(uv_map, mesh->totloop) : Span(), + uv_map, looptris.index_range(), submeshes_.first()); return; @@ -410,7 +409,7 @@ void MeshData::write_submeshes(const Mesh *mesh) looptris, looptri_faces, normals, - uv_map ? Span(uv_map, mesh->totloop) : Span(), + uv_map, triangles_by_material[i], submeshes_[i]); } diff --git a/source/blender/io/usd/intern/usd_capi_export.cc b/source/blender/io/usd/intern/usd_capi_export.cc index 26d02fb162c..6fae3909cf2 100644 --- a/source/blender/io/usd/intern/usd_capi_export.cc +++ b/source/blender/io/usd/intern/usd_capi_export.cc @@ -4,6 +4,7 @@ #include +#include "IO_subdiv_disabler.hh" #include "usd.h" #include "usd.hh" #include "usd_hierarchy_iterator.h" @@ -226,6 +227,16 @@ pxr::UsdStageRefPtr export_to_stage(const USDExportParams ¶ms, Scene *scene = DEG_get_input_scene(depsgraph); Main *bmain = DEG_get_bmain(depsgraph); + SubdivModifierDisabler mod_disabler(depsgraph); + + /* If we want to set the subdiv scheme, then we need to the export the mesh + * without the subdiv modifier applied. */ + if ((params.export_subdiv == USD_SUBDIV_BEST_MATCH) || + (params.export_subdiv == USD_SUBDIV_IGNORE)) { + mod_disabler.disable_modifiers(); + BKE_scene_graph_update_tagged(depsgraph, bmain); + } + /* This whole `export_to_stage` function is assumed to cover about 80% of the whole export * process, from 0.1f to 0.9f. */ worker_status->progress = 0.10f; diff --git a/source/blender/io/usd/intern/usd_reader_material.cc b/source/blender/io/usd/intern/usd_reader_material.cc index e3ef609594e..207e4cc71be 100644 --- a/source/blender/io/usd/intern/usd_reader_material.cc +++ b/source/blender/io/usd/intern/usd_reader_material.cc @@ -832,7 +832,7 @@ void USDMaterialReader::convert_usd_transform_2d(const pxr::UsdShadeShader &usd_ if (!mapping) { BKE_reportf(reports(), RPT_WARNING, - "%s: Couldn't create SH_NODE_MAPPING for node input %s", + "%s: Couldn't create SH_NODE_MAPPING for node input %s", __func__, dest_socket_name); return; diff --git a/source/blender/io/usd/intern/usd_reader_mesh.cc b/source/blender/io/usd/intern/usd_reader_mesh.cc index 6b7b9fb7ab8..96c927ed052 100644 --- a/source/blender/io/usd/intern/usd_reader_mesh.cc +++ b/source/blender/io/usd/intern/usd_reader_mesh.cc @@ -853,7 +853,7 @@ void USDMeshReader::read_mesh_sample(ImportSettings *settings, for (int i = 0; i < positions_.size(); i++) { vert_positions[i] = {positions_[i][0], positions_[i][1], positions_[i][2]}; } - BKE_mesh_tag_positions_changed(mesh); + mesh->tag_positions_changed(); read_vertex_creases(mesh, motionSampleTime); } diff --git a/source/blender/io/usd/intern/usd_reader_shape.cc b/source/blender/io/usd/intern/usd_reader_shape.cc index a89ba7ef2cb..bc01f41617f 100644 --- a/source/blender/io/usd/intern/usd_reader_shape.cc +++ b/source/blender/io/usd/intern/usd_reader_shape.cc @@ -152,7 +152,7 @@ Mesh *USDShapeReader::read_mesh(Mesh *existing_mesh, offset_indices::accumulate_counts_to_offsets(face_offsets); /* Don't smooth-shade cubes; we're not worrying about sharpness for Gprims. */ - BKE_mesh_smooth_flag_set(active_mesh, !prim_.IsA()); + bke::mesh_smooth_set(*active_mesh, !prim_.IsA()); MutableSpan corner_verts = active_mesh->corner_verts_for_write(); for (const int i : corner_verts.index_range()) { diff --git a/source/blender/io/usd/intern/usd_skel_convert.cc b/source/blender/io/usd/intern/usd_skel_convert.cc index c423f828e3b..c3e6b0ef035 100644 --- a/source/blender/io/usd/intern/usd_skel_convert.cc +++ b/source/blender/io/usd/intern/usd_skel_convert.cc @@ -41,6 +41,7 @@ #include "ED_keyframing.hh" #include "ED_mesh.hh" +#include "ANIM_animdata.hh" #include "ANIM_fcurve.hh" #include "WM_api.hh" @@ -141,7 +142,7 @@ void import_skeleton_curves(Main *bmain, const size_t num_samples = samples.size(); /* Create the action on the armature. */ - bAction *act = ED_id_action_ensure(bmain, (ID *)&arm_obj->id); + bAction *act = blender::animrig::id_action_ensure(bmain, (ID *)&arm_obj->id); /* Create the curves. */ @@ -590,7 +591,7 @@ void import_blendshapes(Main *bmain, const size_t num_samples = times.size(); /* Create the animation and curves. */ - bAction *act = ED_id_action_ensure(bmain, (ID *)&key->id); + bAction *act = blender::animrig::id_action_ensure(bmain, (ID *)&key->id); std::vector curves; for (auto blendshape_name : blendshapes) { diff --git a/source/blender/io/usd/intern/usd_writer_curves.cc b/source/blender/io/usd/intern/usd_writer_curves.cc index 1c2d0119b11..d4095788bdb 100644 --- a/source/blender/io/usd/intern/usd_writer_curves.cc +++ b/source/blender/io/usd/intern/usd_writer_curves.cc @@ -529,9 +529,11 @@ void USDCurvesWriter::assign_materials(const HierarchyContext &context, continue; } - pxr::UsdShadeMaterialBindingAPI api = pxr::UsdShadeMaterialBindingAPI(usd_curve.GetPrim()); + pxr::UsdPrim curve_prim = usd_curve.GetPrim(); + pxr::UsdShadeMaterialBindingAPI api = pxr::UsdShadeMaterialBindingAPI(curve_prim); pxr::UsdShadeMaterial usd_material = ensure_usd_material(context, material); api.Bind(usd_material); + api.Apply(curve_prim); /* USD seems to support neither per-material nor per-face-group double-sidedness, so we just * use the flag from the first non-empty material slot. */ diff --git a/source/blender/io/usd/intern/usd_writer_mesh.cc b/source/blender/io/usd/intern/usd_writer_mesh.cc index b1a04c48228..8acf6f15db0 100644 --- a/source/blender/io/usd/intern/usd_writer_mesh.cc +++ b/source/blender/io/usd/intern/usd_writer_mesh.cc @@ -56,6 +56,35 @@ bool USDGenericMeshWriter::is_supported(const HierarchyContext *context) const return true; } +/* Get the last subdiv modifier, regardless of enable/disable status */ +static const SubsurfModifierData *get_last_subdiv_modifier(eEvaluationMode eval_mode, Object *obj) +{ + BLI_assert(obj); + + /* Return the subdiv modifier if it is the last modifier and has + * the required mode enabled. */ + + ModifierData *md = (ModifierData *)(obj->modifiers.last); + + if (!md) { + return nullptr; + } + + /* Determine if the modifier is enabled for the current evaluation mode. */ + ModifierMode mod_mode = (eval_mode == DAG_EVAL_RENDER) ? eModifierMode_Render : + eModifierMode_Realtime; + + if ((md->mode & mod_mode) != mod_mode) { + return nullptr; + } + + if (md->type == eModifierType_Subsurf) { + return reinterpret_cast(md); + } + + return nullptr; +} + void USDGenericMeshWriter::do_write(HierarchyContext &context) { Object *object_eval = context.object; @@ -67,7 +96,11 @@ void USDGenericMeshWriter::do_write(HierarchyContext &context) } try { - write_mesh(context, mesh); + /* Fetch the subdiv modifier, if one exists and it is the last modifier. */ + const SubsurfModifierData *subsurfData = get_last_subdiv_modifier( + usd_export_context_.export_params.evaluation_mode, object_eval); + + write_mesh(context, mesh, subsurfData); if (needsfree) { free_export_mesh(mesh); @@ -376,7 +409,9 @@ struct USDMeshData { pxr::VtFloatArray corner_sharpnesses; }; -void USDGenericMeshWriter::write_mesh(HierarchyContext &context, Mesh *mesh) +void USDGenericMeshWriter::write_mesh(HierarchyContext &context, + Mesh *mesh, + const SubsurfModifierData *subsurfData) { pxr::UsdTimeCode timecode = get_export_time_code(); pxr::UsdStageRefPtr stage = usd_export_context_.stage; @@ -465,18 +500,26 @@ void USDGenericMeshWriter::write_mesh(HierarchyContext &context, Mesh *mesh) } write_custom_data(mesh, usd_mesh); + write_surface_velocity(mesh, usd_mesh); - if (usd_export_context_.export_params.export_normals) { + const pxr::TfToken subdiv_scheme = get_subdiv_scheme(subsurfData); + + /* Normals can be animated, so ensure these are written for each frame, + * unless a subdiv modifier is used, in which case normals are computed, + * not stored with the mesh. */ + if (usd_export_context_.export_params.export_normals && + subdiv_scheme == pxr::UsdGeomTokens->none) { write_normals(mesh, usd_mesh); } - write_surface_velocity(mesh, usd_mesh); /* TODO(Sybren): figure out what happens when the face groups change. */ if (frame_has_been_written_) { return; } - usd_mesh.CreateSubdivisionSchemeAttr().Set(pxr::UsdGeomTokens->none); + /* The subdivision scheme is a uniform according to spec, + * so this value cannot be animated. */ + write_subdiv(subdiv_scheme, usd_mesh, subsurfData); if (usd_export_context_.export_params.export_materials) { assign_materials(context, usd_mesh, usd_mesh_data.face_groups); @@ -491,6 +534,80 @@ void USDGenericMeshWriter::write_mesh(HierarchyContext &context, Mesh *mesh) } } +pxr::TfToken USDGenericMeshWriter::get_subdiv_scheme(const SubsurfModifierData *subsurfData) +{ + /* Default to setting the subdivision scheme to None. */ + pxr::TfToken subdiv_scheme = pxr::UsdGeomTokens->none; + + if (subsurfData) { + if (subsurfData->subdivType == SUBSURF_TYPE_CATMULL_CLARK) { + if (usd_export_context_.export_params.export_subdiv == USD_SUBDIV_BEST_MATCH) { + /* If a subdivision modifier exists, and it uses Catmull-Clark, then apply Catmull-Clark + * SubD scheme. */ + subdiv_scheme = pxr::UsdGeomTokens->catmullClark; + } + } + else { + /* "Simple" is currently the only other subdivision type provided by Blender, */ + /* and we do not yet provide a corresponding representation for USD export. */ + BKE_reportf(reports(), + RPT_WARNING, + "USD export: Simple subdivision not supported, exporting subdivided mesh"); + } + } + + return subdiv_scheme; +} + +void USDGenericMeshWriter::write_subdiv(const pxr::TfToken &subdiv_scheme, + pxr::UsdGeomMesh &usd_mesh, + const SubsurfModifierData *subsurfData) +{ + usd_mesh.CreateSubdivisionSchemeAttr().Set(subdiv_scheme); + if (subdiv_scheme == pxr::UsdGeomTokens->catmullClark) { + /* For Catmull-Clark, also consider the various interpolation modes. */ + /* For reference, see + * https://graphics.pixar.com/opensubdiv/docs/subdivision_surfaces.html#face-varying-interpolation-rules + */ + switch (subsurfData->uv_smooth) { + case SUBSURF_UV_SMOOTH_NONE: + usd_mesh.CreateFaceVaryingLinearInterpolationAttr().Set(pxr::UsdGeomTokens->all); + break; + case SUBSURF_UV_SMOOTH_PRESERVE_CORNERS: + usd_mesh.CreateFaceVaryingLinearInterpolationAttr().Set(pxr::UsdGeomTokens->cornersOnly); + break; + case SUBSURF_UV_SMOOTH_PRESERVE_CORNERS_AND_JUNCTIONS: + usd_mesh.CreateFaceVaryingLinearInterpolationAttr().Set(pxr::UsdGeomTokens->cornersPlus1); + break; + case SUBSURF_UV_SMOOTH_PRESERVE_CORNERS_JUNCTIONS_AND_CONCAVE: + usd_mesh.CreateFaceVaryingLinearInterpolationAttr().Set(pxr::UsdGeomTokens->cornersPlus2); + break; + case SUBSURF_UV_SMOOTH_PRESERVE_BOUNDARIES: + usd_mesh.CreateFaceVaryingLinearInterpolationAttr().Set(pxr::UsdGeomTokens->boundaries); + break; + case SUBSURF_UV_SMOOTH_ALL: + usd_mesh.CreateFaceVaryingLinearInterpolationAttr().Set(pxr::UsdGeomTokens->none); + break; + default: + BLI_assert_msg(0, "Unsupported UV smoothing mode."); + } + + /* For reference, see + * https://graphics.pixar.com/opensubdiv/docs/subdivision_surfaces.html#boundary-interpolation-rules + */ + switch (subsurfData->boundary_smooth) { + case SUBSURF_BOUNDARY_SMOOTH_ALL: + usd_mesh.CreateInterpolateBoundaryAttr().Set(pxr::UsdGeomTokens->edgeOnly); + break; + case SUBSURF_BOUNDARY_SMOOTH_PRESERVE_CORNERS: + usd_mesh.CreateInterpolateBoundaryAttr().Set(pxr::UsdGeomTokens->edgeAndCorner); + break; + default: + BLI_assert_msg(0, "Unsupported boundary smoothing mode."); + } + } +} + static void get_positions(const Mesh *mesh, USDMeshData &usd_mesh_data) { const Span positions = mesh->vert_positions().cast(); diff --git a/source/blender/io/usd/intern/usd_writer_mesh.h b/source/blender/io/usd/intern/usd_writer_mesh.h index e3c9a362242..e4f401f7532 100644 --- a/source/blender/io/usd/intern/usd_writer_mesh.h +++ b/source/blender/io/usd/intern/usd_writer_mesh.h @@ -3,6 +3,7 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once +#include "DNA_modifier_types.h" #include "usd_writer_abstract.h" #include "BLI_map.hh" @@ -31,7 +32,11 @@ class USDGenericMeshWriter : public USDAbstractWriter { /* Mapping from material slot number to array of face indices with that material. */ using MaterialFaceGroups = Map; - void write_mesh(HierarchyContext &context, Mesh *mesh); + void write_mesh(HierarchyContext &context, Mesh *mesh, const SubsurfModifierData *subsurfData); + pxr::TfToken get_subdiv_scheme(const SubsurfModifierData *subsurfData); + void write_subdiv(const pxr::TfToken &subdiv_scheme, + pxr::UsdGeomMesh &usd_mesh, + const SubsurfModifierData *subsurfData); void get_geometry_data(const Mesh *mesh, struct USDMeshData &usd_mesh_data); void assign_materials(const HierarchyContext &context, pxr::UsdGeomMesh usd_mesh, diff --git a/source/blender/io/usd/usd.h b/source/blender/io/usd/usd.h index 3b40d86cfb7..c6643450a2e 100644 --- a/source/blender/io/usd/usd.h +++ b/source/blender/io/usd/usd.h @@ -40,6 +40,14 @@ typedef enum eUSDTexNameCollisionMode { USD_TEX_NAME_COLLISION_OVERWRITE = 1, } eUSDTexNameCollisionMode; +typedef enum eSubdivExportMode { + USD_SUBDIV_IGNORE = 0, /* Subdivision scheme = None, export base mesh without subdivision. */ + USD_SUBDIV_TESSELLATE = 1, /* Subdivision scheme = None, export subdivided mesh. */ + USD_SUBDIV_BEST_MATCH = + 2, /* Apply the USD subdivision scheme that is the closest match to Blender. */ + /* Reverts to USD_SUBDIV_TESSELLATE if the subdivision method is not supported. */ +} eSubdivExportMode; + struct USDExportParams { bool export_animation = false; bool export_hair = true; @@ -47,6 +55,7 @@ struct USDExportParams { bool export_normals = true; bool export_mesh_colors = true; bool export_materials = true; + eSubdivExportMode export_subdiv = USD_SUBDIV_BEST_MATCH; bool selected_objects_only = false; bool visible_objects_only = true; bool use_instancing = false; diff --git a/source/blender/io/wavefront_obj/exporter/obj_export_file_writer.cc b/source/blender/io/wavefront_obj/exporter/obj_export_file_writer.cc index 38c21eb65fc..cd2e6d38c16 100644 --- a/source/blender/io/wavefront_obj/exporter/obj_export_file_writer.cc +++ b/source/blender/io/wavefront_obj/exporter/obj_export_file_writer.cc @@ -669,7 +669,7 @@ void MTLWriter::write_materials(const char *blen_filepath, const char *dest_dir, bool write_pbr) { - if (mtlmaterials_.size() == 0) { + if (mtlmaterials_.is_empty()) { return; } diff --git a/source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc b/source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc index 7fc9d55c354..e2298819558 100644 --- a/source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc +++ b/source/blender/io/wavefront_obj/exporter/obj_export_mesh.cc @@ -200,10 +200,9 @@ int OBJMesh::ith_smooth_group(const int face_index) const void OBJMesh::calc_smooth_groups(const bool use_bitflags) { - const bool *sharp_edges = static_cast( - CustomData_get_layer_named(&export_mesh_->edge_data, CD_PROP_BOOL, "sharp_edge")); - const bool *sharp_faces = static_cast( - CustomData_get_layer_named(&export_mesh_->face_data, CD_PROP_BOOL, "sharp_face")); + const bke::AttributeAccessor attributes = export_mesh_->attributes(); + const VArraySpan sharp_edges = *attributes.lookup("sharp_edge", ATTR_DOMAIN_EDGE); + const VArraySpan sharp_faces = *attributes.lookup("sharp_face", ATTR_DOMAIN_FACE); poly_smooth_groups_ = BKE_mesh_calc_smoothgroups(mesh_edges_.size(), mesh_faces_, export_mesh_->corner_edges(), diff --git a/source/blender/io/wavefront_obj/exporter/obj_export_mesh.hh b/source/blender/io/wavefront_obj/exporter/obj_export_mesh.hh index f35123ff30b..26289e56d5b 100644 --- a/source/blender/io/wavefront_obj/exporter/obj_export_mesh.hh +++ b/source/blender/io/wavefront_obj/exporter/obj_export_mesh.hh @@ -11,6 +11,7 @@ #include #include "BLI_math_vector_types.hh" +#include "BLI_offset_indices.hh" #include "BLI_utility_mixins.hh" #include "BLI_vector.hh" #include "BLI_virtual_array.hh" diff --git a/source/blender/io/wavefront_obj/importer/importer_mesh_utils.cc b/source/blender/io/wavefront_obj/importer/importer_mesh_utils.cc index 557f0e3999d..23ec6f989c8 100644 --- a/source/blender/io/wavefront_obj/importer/importer_mesh_utils.cc +++ b/source/blender/io/wavefront_obj/importer/importer_mesh_utils.cc @@ -9,7 +9,7 @@ #include "BKE_mesh.hh" #include "BKE_object.hh" -#include "BLI_delaunay_2d.h" +#include "BLI_delaunay_2d.hh" #include "BLI_math_geom.h" #include "BLI_math_matrix.h" #include "BLI_math_rotation.h" @@ -24,49 +24,38 @@ namespace blender::io::obj { -Vector> fixup_invalid_polygon(Span vertex_coords, - Span face_vertex_indices) +Vector> fixup_invalid_polygon(Span vert_positions, Span face_verts) { using namespace blender::meshintersect; - if (face_vertex_indices.size() < 3) { + if (face_verts.size() < 3) { return {}; } - /* Calculate face normal, to project verts to 2D. */ - float normal[3] = {0, 0, 0}; - float3 co_prev = vertex_coords[face_vertex_indices.last()]; - for (int idx : face_vertex_indices) { - BLI_assert(idx >= 0 && idx < vertex_coords.size()); - float3 co_curr = vertex_coords[idx]; - add_newell_cross_v3_v3v3(normal, co_prev, co_curr); - co_prev = co_curr; - } - if (UNLIKELY(normalize_v3(normal) == 0.0f)) { - normal[2] = 1.0f; - } + const float3 normal = bke::mesh::face_normal_calc(vert_positions, face_verts); float axis_mat[3][3]; axis_dominant_v3_to_m3(axis_mat, normal); - /* Prepare data for CDT. */ - CDT_input input; - input.vert.reinitialize(face_vertex_indices.size()); - input.face.reinitialize(1); - input.face[0].resize(face_vertex_indices.size()); - for (int64_t i = 0; i < face_vertex_indices.size(); ++i) { - input.face[0][i] = i; - } - input.epsilon = 1.0e-6f; - input.need_ids = true; /* Project vertices to 2D. */ - for (size_t i = 0; i < face_vertex_indices.size(); ++i) { - int idx = face_vertex_indices[i]; - BLI_assert(idx >= 0 && idx < vertex_coords.size()); - float3 coord = vertex_coords[idx]; + Array input_verts(face_verts.size()); + for (const int i : face_verts.index_range()) { + int idx = face_verts[i]; + BLI_assert(idx >= 0 && idx < vert_positions.size()); float2 coord2d; - mul_v2_m3v3(coord2d, axis_mat, coord); - input.vert[i] = double2(coord2d.x, coord2d.y); + mul_v2_m3v3(coord2d, axis_mat, vert_positions[idx]); + input_verts[i] = double2(coord2d.x, coord2d.y); } + Array> input_faces(1); + input_faces.first().resize(input_verts.size()); + + std::iota(input_faces.first().begin(), input_faces.first().end(), 0); + + /* Prepare data for CDT. */ + CDT_input input; + input.vert = std::move(input_verts); + input.face = std::move(input_faces); + input.epsilon = 1.0e-6f; + input.need_ids = true; CDT_result res = delaunay_2d_calc(input, CDT_CONSTRAINTS_VALID_BMESH_WITH_HOLES); /* Emit new face information from CDT result. */ @@ -88,7 +77,7 @@ Vector> fixup_invalid_polygon(Span vertex_coords, else { /* Vertex corresponds to one or more of the input vertices, use it. */ idx = res.vert_orig[idx][0]; - BLI_assert(idx >= 0 && idx < face_vertex_indices.size()); + BLI_assert(idx >= 0 && idx < face_verts.size()); face_verts.append(idx); } } diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h index 9ed5c7bbde6..18b0356166c 100644 --- a/source/blender/makesdna/DNA_ID.h +++ b/source/blender/makesdna/DNA_ID.h @@ -54,12 +54,25 @@ typedef struct IDPropertyUIData { char _pad[4]; } IDPropertyUIData; +/* DNA version of #EnumPropertyItem. */ +typedef struct IDPropertyUIDataEnumItem { + /* Unique identifier, used for string lookup. */ + char *identifier; + /* UI name of the item. */ + char *name; + /* Optional description. */ + char *description; + /* Unique integer value, should never change. */ + int value; + /* Optional icon. */ + int icon; +} IDPropertyUIDataEnumItem; + /* IDP_UI_DATA_TYPE_INT */ typedef struct IDPropertyUIDataInt { IDPropertyUIData base; int *default_array; /* Only for array properties. */ int default_array_len; - char _pad[4]; int min; int max; @@ -67,6 +80,9 @@ typedef struct IDPropertyUIDataInt { int soft_max; int step; int default_value; + + int enum_items_num; + IDPropertyUIDataEnumItem *enum_items; } IDPropertyUIDataInt; /** For #IDP_UI_DATA_TYPE_BOOLEAN Use `int8_t` because DNA does not support `bool`. */ diff --git a/source/blender/makesdna/DNA_armature_types.h b/source/blender/makesdna/DNA_armature_types.h index 4a11fc47bc5..b3397d7a490 100644 --- a/source/blender/makesdna/DNA_armature_types.h +++ b/source/blender/makesdna/DNA_armature_types.h @@ -189,10 +189,12 @@ typedef struct bArmature { short pathflag; /** This is used only for reading/writing BoneCollections in blend - * files, for forwards/backwards compatibility with Blender 4.0. It - * should always be empty at runtime. - * Use collection_array for everything other than file reading/writing. */ - ListBase collections; /* BoneCollection. */ + * files, for forwards/backwards compatibility with Blender 4.0. It + * should always be empty at runtime. Use collection_array for + * everything other than file reading/writing. + * TODO: remove this in Blender 5.0, and instead write the contents of + * collection_array to blend files directly. */ + ListBase collections_legacy; /* BoneCollection. */ struct BoneCollection **collection_array; /* Array of `collection_array_num` BoneCollections. */ int collection_array_num; diff --git a/source/blender/makesdna/DNA_curve_types.h b/source/blender/makesdna/DNA_curve_types.h index ca5eca27073..182fef6ec13 100644 --- a/source/blender/makesdna/DNA_curve_types.h +++ b/source/blender/makesdna/DNA_curve_types.h @@ -88,8 +88,11 @@ typedef struct BezTriple { /** F1, f2, f3: used for selection status. */ uint8_t f1, f2, f3; - /** Hide: used to indicate whether BezTriple is hidden (3D), - * type of keyframe (eBezTriple_KeyframeType). */ + /** + * Hide is used to indicate whether BezTriple is hidden (3D). + * + * \warning For #FCurve this is used to store the key-type, see #BEZKEYTYPE. + */ char hide; /** Easing: easing type for interpolation mode (eBezTriple_Easing). */ @@ -104,6 +107,12 @@ typedef struct BezTriple { char _pad[3]; } BezTriple; +/** + * Provide access to Keyframe Type info #eBezTriple_KeyframeType in #BezTriple::hide. + * \note this is so that we can change it to another location. + */ +#define BEZKEYTYPE(bezt) ((bezt)->hide) + /** * \note #BPoint.tilt location in struct is abused by Key system. */ diff --git a/source/blender/makesdna/DNA_image_types.h b/source/blender/makesdna/DNA_image_types.h index 3284e5482d7..881835d2fe9 100644 --- a/source/blender/makesdna/DNA_image_types.h +++ b/source/blender/makesdna/DNA_image_types.h @@ -136,6 +136,12 @@ typedef struct Image_Runtime { typedef struct Image { ID id; + struct AnimData *adt; + /** + * Engines draw data, must be immediately after AnimData. See IdDdtTemplate and + * DRW_drawdatalist_from_id to understand this requirement. + */ + DrawDataList drawdata; /** File path, 1024 = FILE_MAX. */ char filepath[1024]; diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h index f57d89a6936..8d66e57882b 100644 --- a/source/blender/makesdna/DNA_mesh_types.h +++ b/source/blender/makesdna/DNA_mesh_types.h @@ -11,7 +11,6 @@ #include "DNA_ID.h" #include "DNA_customdata_types.h" #include "DNA_defs.h" -#include "DNA_meshdata_types.h" #include "DNA_session_uuid_types.h" /** Workaround to forward-declare C++ type in C header. */ @@ -19,13 +18,18 @@ # include -# include "BLI_bounds_types.hh" # include "BLI_math_vector_types.hh" -# include "BLI_offset_indices.hh" namespace blender { -template class Span; +template struct Bounds; +namespace offset_indices { +template struct GroupedSpan; +template class OffsetIndices; +} // namespace offset_indices +using offset_indices::GroupedSpan; +using offset_indices::OffsetIndices; template class MutableSpan; +template class Span; namespace bke { struct MeshRuntime; class AttributeAccessor; @@ -395,6 +399,21 @@ typedef struct Mesh { * using #face_normals() or #vert_normals() when possible (see #normals_domain()). */ blender::Span corner_normals() const; + + /** Call after changing vertex positions to tag lazily calculated caches for recomputation. */ + void tag_positions_changed(); + /** Call after moving every mesh vertex by the same translation. */ + void tag_positions_changed_uniformly(); + /** Like #tag_positions_changed but doesn't tag normals; they must be updated separately. */ + void tag_positions_changed_no_normals(); + /** Call when changing "sharp_face" or "sharp_edge" data. */ + void tag_sharpness_changed(); + /** Call when face vertex order has changed but positions and faces haven't changed. */ + void tag_face_winding_changed(); + /** Call when new edges and vertices have been created but vertices and faces haven't changed. */ + void tag_edges_split(); + /** Call for topology updates not described by other update tags. */ + void tag_topology_changed(); #endif } Mesh; diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h index c7dc9f5f5f9..d019f320bff 100644 --- a/source/blender/makesdna/DNA_meshdata_types.h +++ b/source/blender/makesdna/DNA_meshdata_types.h @@ -41,92 +41,55 @@ enum { * \{ */ /** - * #MLoopTri's are lightweight triangulation data, - * for functionality that doesn't support ngons. - * This is cache data created from (polygons, corner vert, and position arrays). - * There is no attempt to maintain this data's validity over time, - * any changes to the underlying mesh invalidate the #MLoopTri array, - * which will need to be re-calculated. - * - * Users normally access this via #Mesh::looptris(). - * In rare cases its calculated directly, with #bke::mesh::looptris_calc. + * #MLoopTri is runtime triangulation data for #Mesh, for functionality that doesn't support ngons. * * Typical usage includes: * - Viewport drawing. * - #BVHTree creation. * - Physics/collision detection. * - * Storing loop indices (instead of vertex indices) allows us to - * directly access UVs, vertex-colors as well as vertices. - * The index of the source polygon is stored as well, - * giving access to materials and polygon normals. + * A mesh's triangulation data is generally accessed via #Mesh::looptris(), which uses a cache that + * is lazily calculated from faces, corner vert, and position arrays. In rare cases it is + * calculated directly too, with #bke::mesh::looptris_calc. When the underlying mesh data changes, + * the array is recalculated from scratch; there is no extra attempt to maintain the validity over + * time. * - * \note This data is runtime only, never written to disk. + * #MLoopTri is stored in an array, where triangles from each face are stored sequentially. + * The triangles order is guaranteed to match the face order where the first triangle will always + * be from the first face, and the last triangle from the last face. + * The number of triangles for each polygon is guaranteed to be the corner count - 2, even for + * degenerate geometry (see #bke::mesh::face_triangles_num). * - * Usage examples: - * \code{.c} - * // access vertex locations. - * float *vtri_co[3] = { - * positions[corner_verts[lt->tri[0]]], - * positions[corner_verts[lt->tri[1]]], - * positions[corner_verts[lt->tri[2]]], + * Storing corner indices (instead of vertex indices) gives more flexibility for accessing mesh + * data stored per-corner, though it does often add an extra level of indirection. The index of the + * corresponding face for each triangle is stored in a separate array, accessed with + * #Mesh::looptri_faces(). + * + * Examples: + * \code{.cc} + * // Access vertex locations. + * std::array tri_positions{ + * positions[corner_verts[lt.tri[0]]], + * positions[corner_verts[lt.tri[1]]], + * positions[corner_verts[lt.tri[2]]], * }; * - * // access UV coordinates (works for all loop data, vertex colors... etc). - * float *uvtri_co[3] = { - * mloopuv[lt->tri[0]], - * mloopuv[lt->tri[1]], - * mloopuv[lt->tri[2]], + * // Access UV coordinates (works for all face corner data, vertex colors... etc). + * std::array tri_uvs{ + * uv_map[lt.tri[0]], + * uv_map[lt.tri[1]], + * uv_map[lt.tri[2]], * }; - * \endcode * - * #MLoopTri's are allocated in an array, where each polygon's #MLoopTri's are stored contiguously, - * the number of triangles for each polygon is guaranteed to be the corner count - 2, - * even for degenerate geometry. See #bke::mesh::face_triangles_num macro. - * - * It's also possible to perform a reverse lookup (find all #MLoopTri's for any given face). - * - * \code{.c} - * // loop over all looptri's for a given polygon: i + * // Access all triangles in a given face. * const IndexRange face = faces[i]; - * MLoopTri *lt = &looptri[poly_to_tri_count(i, face.start())]; - * int j, lt_tot = bke::mesh::face_triangles_num(face.size()); - * - * for (j = 0; j < lt_tot; j++, lt++) { - * int vtri[3] = { - * corner_verts[lt->tri[0]], - * corner_verts[lt->tri[1]], - * corner_verts[lt->tri[2]], - * }; - * printf("tri %u %u %u\n", vtri[0], vtri[1], vtri[2]); - * }; + * const Span looptris = looptris.slice(poly_to_tri_count(i, face.start()), + * bke::mesh::face_triangles_num(face.size())); * \endcode * - * It may also be useful to check whether or not two vertices of a triangle - * form an edge in the underlying mesh. - * - * This can be done by checking the edge of the referenced corner, - * the winding of the #MLoopTri and the corners's will always match, - * however the order of vertices in the edge is undefined. - * - * \code{.c} - * // print real edges from an MLoopTri: lt - * int j, j_next; - * for (j = 2, j_next = 0; j_next < 3; j = j_next++) { - * const int2 &edge = &medge[corner_edges[lt->tri[j]]]; - * unsigned int tri_edge[2] = {corner_verts[lt->tri[j]], corner_verts[lt->tri[j_next]]}; - * - * if (((edge[0] == tri_edge[0]) && (edge[1] == tri_edge[1])) || - * ((edge[0] == tri_edge[1]) && (edge[1] == tri_edge[0]))) - * { - * printf("real edge found %u %u\n", tri_edge[0], tri_edge[1]); - * } - * } - * \endcode - * - * See #bke::mesh::looptri_get_real_edges for a utility that does this. - * - * \note A #MLoopTri may be in the middle of an ngon and not reference **any** edges. + * It may also be useful to check whether or not two vertices of a triangle form an edge in the + * underlying mesh. See #bke::mesh::looptri_get_real_edges for a utility that does this. Note that + * a #MLoopTri may be in the middle of an ngon and not reference **any** real edges. */ typedef struct MLoopTri { unsigned int tri[3]; diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 0f69f621953..dafff65d250 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -2285,8 +2285,8 @@ enum { /** Surface Deform vertex bind modes. */ enum { - MOD_SDEF_MODE_LOOPTRI = 0, - MOD_SDEF_MODE_NGON = 1, + MOD_SDEF_MODE_LOOPTRIS = 0, + MOD_SDEF_MODE_NGONS = 1, MOD_SDEF_MODE_CENTROID = 2, }; diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 58f5137fb01..feb8718b6be 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -2518,6 +2518,12 @@ typedef enum CMPNodeCombSepColorMode { CMP_NODE_COMBSEP_COLOR_YUV = 4, } CMPNodeCombSepColorMode; +/* Cryptomatte node source. */ +typedef enum CMPNodeCryptomatteSource { + CMP_NODE_CRYPTOMATTE_SOURCE_RENDER = 0, + CMP_NODE_CRYPTOMATTE_SOURCE_IMAGE = 1, +} CMPNodeCryptomatteSource; + /* Point Density shader node */ enum { diff --git a/source/blender/makesdna/DNA_scene_defaults.h b/source/blender/makesdna/DNA_scene_defaults.h index cc595107db7..1cc0a94b031 100644 --- a/source/blender/makesdna/DNA_scene_defaults.h +++ b/source/blender/makesdna/DNA_scene_defaults.h @@ -237,12 +237,9 @@ .shadow_step_count = 6, \ .shadow_normal_bias = 0.02f, \ \ - .ray_split_settings = 0, \ .ray_tracing_method = RAYTRACE_EEVEE_METHOD_SCREEN, \ \ - .reflection_options = _DNA_DEFAULT_RaytraceEEVEE, \ - .refraction_options = _DNA_DEFAULT_RaytraceEEVEE, \ - .diffuse_options = _DNA_DEFAULT_RaytraceEEVEE, \ + .ray_tracing_options = _DNA_DEFAULT_RaytraceEEVEE, \ \ .light_cache_data = NULL, \ .light_threshold = 0.01f, \ diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index f3f84093b68..effad7d3116 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -1891,12 +1891,10 @@ typedef struct SceneEEVEE { int shadow_step_count; float shadow_normal_bias; - int ray_split_settings; + char _pad[4]; int ray_tracing_method; - struct RaytraceEEVEE reflection_options; - struct RaytraceEEVEE refraction_options; - struct RaytraceEEVEE diffuse_options; + struct RaytraceEEVEE ray_tracing_options; struct LightCache *light_cache DNA_DEPRECATED; struct LightCache *light_cache_data; @@ -2092,7 +2090,7 @@ enum { /** #RenderData::mode. */ enum { R_MODE_UNUSED_0 = 1 << 0, /* dirty */ - R_MODE_UNUSED_1 = 1 << 1, /* cleared */ + R_SIMPLIFY_NORMALS = 1 << 1, R_MODE_UNUSED_2 = 1 << 2, /* cleared */ R_MODE_UNUSED_3 = 1 << 3, /* cleared */ R_MODE_UNUSED_4 = 1 << 4, /* cleared */ diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h index 223890e1ca9..b15d99f8c54 100644 --- a/source/blender/makesdna/DNA_sequence_types.h +++ b/source/blender/makesdna/DNA_sequence_types.h @@ -127,13 +127,15 @@ typedef enum eSeqRetimingKeyFlag { } eSeqRetimingKeyFlag; typedef struct SeqRetimingKey { - int strip_frame_index; + double strip_frame_index; int flag; /* eSeqRetimingKeyFlag */ int _pad0; float retiming_factor; /* Value between 0-1 mapped to original content range. */ - int original_strip_frame_index; /* Used for transition keys only. */ - float original_retiming_factor; /* Used for transition keys only. */ + char _pad1[4]; + double original_strip_frame_index; /* Used for transition keys only. */ + float original_retiming_factor; /* Used for transition keys only. */ + char _pad2[4]; } SeqRetimingKey; typedef struct SequenceRuntime { diff --git a/source/blender/makesdna/DNA_xr_types.h b/source/blender/makesdna/DNA_xr_types.h index 00fc999ae5b..4e5ecd22c04 100644 --- a/source/blender/makesdna/DNA_xr_types.h +++ b/source/blender/makesdna/DNA_xr_types.h @@ -92,7 +92,7 @@ typedef enum eXrHapticFlag { } eXrHapticFlag; /** - * For axis-based inputs (thumb-stick/track-pad/etc). + * For axis-based inputs (thumbstick/trackpad/etc). * Determines the region for action execution (mutually exclusive per axis). */ typedef enum eXrAxisFlag { diff --git a/source/blender/makesdna/intern/dna_rename_defs.h b/source/blender/makesdna/intern/dna_rename_defs.h index a51f65b2735..f35dc9c663a 100644 --- a/source/blender/makesdna/intern/dna_rename_defs.h +++ b/source/blender/makesdna/intern/dna_rename_defs.h @@ -182,6 +182,7 @@ DNA_STRUCT_RENAME_ELEM(View3D, near, clip_start) DNA_STRUCT_RENAME_ELEM(View3D, ob_centre, ob_center) DNA_STRUCT_RENAME_ELEM(View3D, ob_centre_bone, ob_center_bone) DNA_STRUCT_RENAME_ELEM(View3D, ob_centre_cursor, ob_center_cursor) +DNA_STRUCT_RENAME_ELEM(bArmature, collections, collections_legacy) DNA_STRUCT_RENAME_ELEM(bGPDstroke, gradient_f, hardness) DNA_STRUCT_RENAME_ELEM(bGPDstroke, gradient_s, aspect_ratio) DNA_STRUCT_RENAME_ELEM(bNodeTree, inputs, inputs_legacy) diff --git a/source/blender/makesrna/intern/rna_ID.cc b/source/blender/makesrna/intern/rna_ID.cc index f28c49f2c53..7b3b7c4819f 100644 --- a/source/blender/makesrna/intern/rna_ID.cc +++ b/source/blender/makesrna/intern/rna_ID.cc @@ -1585,6 +1585,11 @@ static void rna_def_ID_properties(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_IDPROPERTY); RNA_def_property_array(prop, 1); + /* IDP_ENUM */ + prop = RNA_def_property(srna, "enum", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, rna_enum_dummy_DEFAULT_items); + RNA_def_property_flag(prop, PROP_IDPROPERTY); + /* IDP_GROUP */ prop = RNA_def_property(srna, "group", PROP_POINTER, PROP_NONE); RNA_def_property_flag(prop, PROP_IDPROPERTY); diff --git a/source/blender/makesrna/intern/rna_access.cc b/source/blender/makesrna/intern/rna_access.cc index a70a0fc5913..fb3bb01b006 100644 --- a/source/blender/makesrna/intern/rna_access.cc +++ b/source/blender/makesrna/intern/rna_access.cc @@ -519,6 +519,14 @@ void rna_property_rna_or_id_get(PropertyRNA *prop, r_prop_rna_or_id->array_len = idprop_evaluated != nullptr ? uint(idprop_evaluated->len) : 0; } else { + /* Special case for int properties with enum items, these are displayed as a PROP_ENUM. */ + if (idprop->type == IDP_INT) { + const IDPropertyUIDataInt *ui_data_int = reinterpret_cast( + idprop->ui_data); + if (ui_data_int && ui_data_int->enum_items_num > 0) { + r_prop_rna_or_id->rnaprop = &rna_PropertyGroupItem_enum; + } + } r_prop_rna_or_id->rnaprop = typemap[int(idprop->type)]; } } @@ -560,6 +568,14 @@ PropertyRNA *rna_ensure_property(PropertyRNA *prop) if (idprop->type == IDP_ARRAY) { return arraytypemap[int(idprop->subtype)]; } + /* Special case for int properties with enum items, these are displayed as a PROP_ENUM. */ + if (idprop->type == IDP_INT) { + const IDPropertyUIDataInt *ui_data_int = reinterpret_cast( + idprop->ui_data); + if (ui_data_int && ui_data_int->enum_items_num > 0) { + return &rna_PropertyGroupItem_enum; + } + } return typemap[int(idprop->type)]; } } @@ -1501,6 +1517,39 @@ void RNA_property_enum_items_ex(bContext *C, int *r_totitem, bool *r_free) { + if (!use_static && prop->magic != RNA_MAGIC) { + const IDProperty *idprop = (IDProperty *)prop; + if (idprop->type == IDP_INT) { + IDPropertyUIDataInt *ui_data = reinterpret_cast(idprop->ui_data); + + int totitem = 0; + EnumPropertyItem *result = nullptr; + if (ui_data) { + for (const IDPropertyUIDataEnumItem &idprop_item : + blender::Span(ui_data->enum_items, ui_data->enum_items_num)) + { + BLI_assert(idprop_item.identifier != nullptr); + BLI_assert(idprop_item.name != nullptr); + const EnumPropertyItem item = {idprop_item.value, + idprop_item.identifier, + idprop_item.icon, + idprop_item.name, + idprop_item.description ? idprop_item.description : ""}; + RNA_enum_item_add(&result, &totitem, &item); + } + } + + RNA_enum_item_end(&result, &totitem); + *r_item = result; + if (r_totitem) { + /* Exclude the terminator item. */ + *r_totitem = totitem - 1; + } + *r_free = true; + return; + } + } + EnumPropertyRNA *eprop = (EnumPropertyRNA *)rna_ensure_property(prop); *r_free = false; @@ -4622,6 +4671,8 @@ static int rna_raw_access(ReportList *reports, /* Could also be faster with non-matching types, * for now we just do slower loop. */ } + BLI_assert_msg(itemlen == 0 || itemtype != PROP_ENUM, + "Enum array properties should not exist"); } { @@ -4659,11 +4710,14 @@ static int rna_raw_access(ReportList *reports, break; } - if (!ELEM(itemtype, PROP_BOOLEAN, PROP_INT, PROP_FLOAT)) { - BKE_report(reports, RPT_ERROR, "Only boolean, int, and float properties supported"); + if (!ELEM(itemtype, PROP_BOOLEAN, PROP_INT, PROP_FLOAT, PROP_ENUM)) { + BKE_report( + reports, RPT_ERROR, "Only boolean, int, float and enum properties supported"); err = 1; break; } + BLI_assert_msg(itemlen == 0 || itemtype != PROP_ENUM, + "Enum array properties should not exist"); } /* editable check */ @@ -4697,7 +4751,14 @@ static int rna_raw_access(ReportList *reports, RNA_property_float_set(&itemptr, iprop, f); break; } + case PROP_ENUM: { + int i; + RAW_GET(int, i, in, a); + RNA_property_enum_set(&itemptr, iprop, i); + break; + } default: + BLI_assert_unreachable(); break; } } @@ -4718,7 +4779,13 @@ static int rna_raw_access(ReportList *reports, RAW_SET(float, in, a, f); break; } + case PROP_ENUM: { + int i = RNA_property_enum_get(&itemptr, iprop); + RAW_SET(int, in, a, i); + break; + } default: + BLI_assert_unreachable(); break; } } @@ -4763,6 +4830,7 @@ static int rna_raw_access(ReportList *reports, break; } default: + BLI_assert_unreachable(); break; } } @@ -4793,6 +4861,7 @@ static int rna_raw_access(ReportList *reports, break; } default: + BLI_assert_unreachable(); break; } } @@ -4816,6 +4885,7 @@ static int rna_raw_access(ReportList *reports, break; } default: + BLI_assert_unreachable(); break; } } @@ -4837,6 +4907,7 @@ static int rna_raw_access(ReportList *reports, break; } default: + BLI_assert_unreachable(); break; } } diff --git a/source/blender/makesrna/intern/rna_curves.cc b/source/blender/makesrna/intern/rna_curves.cc index 6e5fbb6536a..7827dec20fd 100644 --- a/source/blender/makesrna/intern/rna_curves.cc +++ b/source/blender/makesrna/intern/rna_curves.cc @@ -183,12 +183,10 @@ static void rna_CurvePoint_location_set(PointerRNA *ptr, const float value[3]) static float rna_CurvePoint_radius_get(PointerRNA *ptr) { + using namespace blender; const Curves *curves = rna_curves(ptr); - const float *radii = static_cast( - CustomData_get_layer_named(&curves->geometry.point_data, CD_PROP_FLOAT, "radius")); - if (radii == nullptr) { - return 0.0f; - } + const bke::AttributeAccessor attributes = curves->geometry.wrap().attributes(); + const VArray radii = *attributes.lookup_or_default("radius", ATTR_DOMAIN_POINT, 0.0f); return radii[rna_CurvePoint_index_get_const(ptr)]; } diff --git a/source/blender/makesrna/intern/rna_mesh.cc b/source/blender/makesrna/intern/rna_mesh.cc index f0d41a26eff..51451afb60e 100644 --- a/source/blender/makesrna/intern/rna_mesh.cc +++ b/source/blender/makesrna/intern/rna_mesh.cc @@ -55,6 +55,7 @@ static const EnumPropertyItem rna_enum_mesh_remesh_mode_items[] = { # include "BLI_math_vector.h" +# include "BKE_attribute.hh" # include "BKE_customdata.hh" # include "BKE_main.hh" # include "BKE_mesh.hh" @@ -266,7 +267,7 @@ static void rna_Mesh_update_facemask(Main *bmain, Scene *scene, PointerRNA *ptr) static void rna_Mesh_update_positions_tag(Main *bmain, Scene *scene, PointerRNA *ptr) { Mesh *mesh = rna_mesh(ptr); - BKE_mesh_tag_positions_changed(mesh); + mesh->tag_positions_changed(); rna_Mesh_update_data_legacy_deg_tag_all(bmain, scene, ptr); } @@ -322,10 +323,10 @@ static int rna_MeshLoop_index_get(PointerRNA *ptr) static int rna_MeshLoopTriangle_index_get(PointerRNA *ptr) { const Mesh *mesh = rna_mesh(ptr); - const MLoopTri *tri = static_cast(ptr->data); - const int index = int(tri - mesh->looptris().data()); + const MLoopTri *lt = static_cast(ptr->data); + const int index = int(lt - mesh->looptris().data()); BLI_assert(index >= 0); - BLI_assert(index < BKE_mesh_runtime_looptri_len(mesh)); + BLI_assert(index < BKE_mesh_runtime_looptris_len(mesh)); return index; } @@ -351,13 +352,13 @@ static void rna_Mesh_loop_triangles_begin(CollectionPropertyIterator *iter, Poin static int rna_Mesh_loop_triangles_length(PointerRNA *ptr) { const Mesh *mesh = rna_mesh(ptr); - return BKE_mesh_runtime_looptri_len(mesh); + return BKE_mesh_runtime_looptris_len(mesh); } int rna_Mesh_loop_triangles_lookup_int(PointerRNA *ptr, int index, PointerRNA *r_ptr) { const Mesh *mesh = rna_mesh(ptr); - if (index < 0 || index >= BKE_mesh_runtime_looptri_len(mesh)) { + if (index < 0 || index >= BKE_mesh_runtime_looptris_len(mesh)) { return false; } /* Casting away const is okay because this RNA type doesn't allow changing the value. */ @@ -374,7 +375,7 @@ static void rna_Mesh_loop_triangle_polygons_begin(CollectionPropertyIterator *it rna_iterator_array_begin(iter, const_cast(mesh->looptri_faces().data()), sizeof(int), - BKE_mesh_runtime_looptri_len(mesh), + BKE_mesh_runtime_looptris_len(mesh), false, nullptr); } @@ -382,7 +383,7 @@ static void rna_Mesh_loop_triangle_polygons_begin(CollectionPropertyIterator *it int rna_Mesh_loop_triangle_polygons_lookup_int(PointerRNA *ptr, int index, PointerRNA *r_ptr) { const Mesh *mesh = rna_mesh(ptr); - if (index < 0 || index >= BKE_mesh_runtime_looptri_len(mesh)) { + if (index < 0 || index >= BKE_mesh_runtime_looptris_len(mesh)) { return false; } /* Casting away const is okay because this RNA type doesn't allow changing the value. */ @@ -596,7 +597,7 @@ static void rna_MeshPolygon_use_smooth_set(PointerRNA *ptr, bool value) const int index = rna_MeshPolygon_index_get(ptr); if (value == sharp_faces[index]) { sharp_faces[index] = !value; - BKE_mesh_tag_sharpness_changed(mesh); + mesh->tag_sharpness_changed(); } } @@ -628,18 +629,23 @@ static void rna_MeshPolygon_select_set(PointerRNA *ptr, bool value) static int rna_MeshPolygon_material_index_get(PointerRNA *ptr) { + using namespace blender; const Mesh *mesh = rna_mesh(ptr); - const int *material_indices = BKE_mesh_material_indices(mesh); - const int index = rna_MeshPolygon_index_get(ptr); - return material_indices == nullptr ? 0 : material_indices[index]; + const bke::AttributeAccessor attributes = mesh->attributes(); + const VArray material_index = *attributes.lookup_or_default( + "material_index", ATTR_DOMAIN_FACE, 0); + return material_index[rna_MeshPolygon_index_get(ptr)]; } static void rna_MeshPolygon_material_index_set(PointerRNA *ptr, int value) { + using namespace blender; Mesh *mesh = rna_mesh(ptr); - int *material_indices = BKE_mesh_material_indices_for_write(mesh); - const int index = rna_MeshPolygon_index_get(ptr); - material_indices[index] = max_ii(0, value); + bke::MutableAttributeAccessor attributes = mesh->attributes_for_write(); + bke::AttributeWriter material_index = attributes.lookup_or_add_for_write("material_index", + ATTR_DOMAIN_FACE); + material_index.varray.set(rna_MeshPolygon_index_get(ptr), max_ii(0, value)); + material_index.finish(); } static void rna_MeshPolygon_center_get(PointerRNA *ptr, float *values) @@ -765,7 +771,7 @@ static void rna_Mesh_texspace_location_get(PointerRNA *ptr, float values[3]) static void rna_MeshVertex_groups_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) { Mesh *mesh = rna_mesh(ptr); - MDeformVert *dverts = (MDeformVert *)BKE_mesh_deform_verts(mesh); + MDeformVert *dverts = mesh->deform_verts_for_write().data(); if (dverts) { const int index = rna_MeshVertex_index_get(ptr); MDeformVert *dvert = &dverts[index]; @@ -1344,7 +1350,7 @@ static void rna_MeshEdge_use_edge_sharp_set(PointerRNA *ptr, bool value) const int index = rna_MeshEdge_index_get(ptr); if (value != sharp_edge[index]) { sharp_edge[index] = value; - BKE_mesh_tag_sharpness_changed(mesh); + mesh->tag_sharpness_changed(); } } @@ -1384,10 +1390,12 @@ static bool rna_MeshEdge_is_loose_get(PointerRNA *ptr) static int rna_MeshLoopTriangle_material_index_get(PointerRNA *ptr) { + using namespace blender; const Mesh *mesh = rna_mesh(ptr); - const int face_i = rna_MeshLoopTriangle_polygon_index_get(ptr); - const int *material_indices = BKE_mesh_material_indices(mesh); - return material_indices == nullptr ? 0 : material_indices[face_i]; + const bke::AttributeAccessor attributes = mesh->attributes(); + const VArray material_indices = *attributes.lookup_or_default( + "material_index", ATTR_DOMAIN_FACE, 0); + return material_indices[rna_MeshLoopTriangle_polygon_index_get(ptr)]; } static bool rna_MeshLoopTriangle_use_smooth_get(PointerRNA *ptr) @@ -1405,7 +1413,7 @@ static char *rna_VertexGroupElement_path(const PointerRNA *ptr) { const Mesh *mesh = rna_mesh(ptr); /* XXX not always! */ const MDeformWeight *dw = (MDeformWeight *)ptr->data; - const MDeformVert *dvert = BKE_mesh_deform_verts(mesh); + const MDeformVert *dvert = mesh->deform_verts().data(); int a, b; for (a = 0; a < mesh->totvert; a++, dvert++) { diff --git a/source/blender/makesrna/intern/rna_mesh_api.cc b/source/blender/makesrna/intern/rna_mesh_api.cc index b8d94d4f8de..b74bdfe425f 100644 --- a/source/blender/makesrna/intern/rna_mesh_api.cc +++ b/source/blender/makesrna/intern/rna_mesh_api.cc @@ -55,7 +55,7 @@ static void rna_Mesh_sharp_from_angle_set(Mesh *mesh, const float angle) { mesh->attributes_for_write().remove("sharp_edge"); mesh->attributes_for_write().remove("sharp_face"); - BKE_mesh_sharp_edges_set_from_angle(mesh, angle); + blender::bke::mesh_sharp_edges_set_from_angle(*mesh, angle); DEG_id_tag_update(&mesh->id, ID_RECALC_GEOMETRY); } @@ -90,11 +90,11 @@ static void rna_Mesh_calc_looptri(Mesh *mesh) static void rna_Mesh_calc_smooth_groups( Mesh *mesh, bool use_bitflags, int **r_poly_group, int *r_poly_group_num, int *r_group_total) { + using namespace blender; *r_poly_group_num = mesh->faces_num; - const bool *sharp_edges = (const bool *)CustomData_get_layer_named( - &mesh->edge_data, CD_PROP_BOOL, "sharp_edge"); - const bool *sharp_faces = (const bool *)CustomData_get_layer_named( - &mesh->face_data, CD_PROP_BOOL, "sharp_face"); + const bke::AttributeAccessor attributes = mesh->attributes(); + const VArraySpan sharp_edges = *attributes.lookup("sharp_edge", ATTR_DOMAIN_EDGE); + const VArraySpan sharp_faces = *attributes.lookup("sharp_face", ATTR_DOMAIN_FACE); *r_poly_group = BKE_mesh_calc_smoothgroups(mesh->totedge, mesh->faces(), mesh->corner_edges(), diff --git a/source/blender/makesrna/intern/rna_nodetree.cc b/source/blender/makesrna/intern/rna_nodetree.cc index 65df8c9fbd6..f4e2c280b4d 100644 --- a/source/blender/makesrna/intern/rna_nodetree.cc +++ b/source/blender/makesrna/intern/rna_nodetree.cc @@ -2771,7 +2771,7 @@ static void rna_Node_image_layer_update(Main *bmain, Scene *scene, PointerRNA *p Image *ima = reinterpret_cast(node->id); ImageUser *iuser = static_cast(node->storage); - if (node->type == CMP_NODE_CRYPTOMATTE && node->custom1 != CMP_CRYPTOMATTE_SRC_IMAGE) { + if (node->type == CMP_NODE_CRYPTOMATTE && node->custom1 != CMP_NODE_CRYPTOMATTE_SOURCE_IMAGE) { return; } @@ -2842,7 +2842,7 @@ static const EnumPropertyItem *rna_Node_image_layer_itemf(bContext * /*C*/, const EnumPropertyItem *item = nullptr; RenderLayer *rl; - if (node->type == CMP_NODE_CRYPTOMATTE && node->custom1 != CMP_CRYPTOMATTE_SRC_IMAGE) { + if (node->type == CMP_NODE_CRYPTOMATTE && node->custom1 != CMP_NODE_CRYPTOMATTE_SOURCE_IMAGE) { return rna_enum_dummy_NULL_items; } @@ -2864,7 +2864,7 @@ static bool rna_Node_image_has_layers_get(PointerRNA *ptr) bNode *node = static_cast(ptr->data); Image *ima = reinterpret_cast(node->id); - if (node->type == CMP_NODE_CRYPTOMATTE && node->custom1 != CMP_CRYPTOMATTE_SRC_IMAGE) { + if (node->type == CMP_NODE_CRYPTOMATTE && node->custom1 != CMP_NODE_CRYPTOMATTE_SOURCE_IMAGE) { return false; } @@ -2880,7 +2880,7 @@ static bool rna_Node_image_has_views_get(PointerRNA *ptr) bNode *node = static_cast(ptr->data); Image *ima = reinterpret_cast(node->id); - if (node->type == CMP_NODE_CRYPTOMATTE && node->custom1 != CMP_CRYPTOMATTE_SRC_IMAGE) { + if (node->type == CMP_NODE_CRYPTOMATTE && node->custom1 != CMP_NODE_CRYPTOMATTE_SOURCE_IMAGE) { return false; } @@ -2930,7 +2930,7 @@ static const EnumPropertyItem *rna_Node_image_view_itemf(bContext * /*C*/, const EnumPropertyItem *item = nullptr; RenderView *rv; - if (node->type == CMP_NODE_CRYPTOMATTE && node->custom1 != CMP_CRYPTOMATTE_SRC_IMAGE) { + if (node->type == CMP_NODE_CRYPTOMATTE && node->custom1 != CMP_NODE_CRYPTOMATTE_SOURCE_IMAGE) { return rna_enum_dummy_NULL_items; } @@ -3156,7 +3156,7 @@ static PointerRNA rna_NodeCryptomatte_scene_get(PointerRNA *ptr) { bNode *node = static_cast(ptr->data); - Scene *scene = (node->custom1 == CMP_CRYPTOMATTE_SRC_RENDER) ? + Scene *scene = (node->custom1 == CMP_NODE_CRYPTOMATTE_SOURCE_RENDER) ? reinterpret_cast(node->id) : nullptr; return rna_pointer_inherit_refine(ptr, &RNA_Scene, scene); @@ -3166,7 +3166,7 @@ static void rna_NodeCryptomatte_scene_set(PointerRNA *ptr, PointerRNA value, Rep { bNode *node = static_cast(ptr->data); - if (node->custom1 == CMP_CRYPTOMATTE_SRC_RENDER) { + if (node->custom1 == CMP_NODE_CRYPTOMATTE_SOURCE_RENDER) { rna_Node_scene_set(ptr, value, reports); } } @@ -3175,7 +3175,7 @@ static PointerRNA rna_NodeCryptomatte_image_get(PointerRNA *ptr) { bNode *node = static_cast(ptr->data); - Image *image = (node->custom1 == CMP_CRYPTOMATTE_SRC_IMAGE) ? + Image *image = (node->custom1 == CMP_NODE_CRYPTOMATTE_SOURCE_IMAGE) ? reinterpret_cast(node->id) : nullptr; return rna_pointer_inherit_refine(ptr, &RNA_Image, image); @@ -3187,7 +3187,7 @@ static void rna_NodeCryptomatte_image_set(PointerRNA *ptr, { bNode *node = static_cast(ptr->data); - if (node->custom1 == CMP_CRYPTOMATTE_SRC_IMAGE) { + if (node->custom1 == CMP_NODE_CRYPTOMATTE_SOURCE_IMAGE) { if (node->id) id_us_min(node->id); if (value.data) @@ -8443,8 +8443,16 @@ static void def_cmp_cryptomatte(StructRNA *srna) PropertyRNA *prop; static const EnumPropertyItem cryptomatte_source_items[] = { - {CMP_CRYPTOMATTE_SRC_RENDER, "RENDER", 0, "Render", "Use Cryptomatte passes from a render"}, - {CMP_CRYPTOMATTE_SRC_IMAGE, "IMAGE", 0, "Image", "Use Cryptomatte passes from an image"}, + {CMP_NODE_CRYPTOMATTE_SOURCE_RENDER, + "RENDER", + 0, + "Render", + "Use Cryptomatte passes from a render"}, + {CMP_NODE_CRYPTOMATTE_SOURCE_IMAGE, + "IMAGE", + 0, + "Image", + "Use Cryptomatte passes from an image"}, {0, nullptr, 0, nullptr, nullptr}}; prop = RNA_def_property(srna, "source", PROP_ENUM, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_object.cc b/source/blender/makesrna/intern/rna_object.cc index 06efb94e32d..01b2cf0dae5 100644 --- a/source/blender/makesrna/intern/rna_object.cc +++ b/source/blender/makesrna/intern/rna_object.cc @@ -477,7 +477,7 @@ static void rna_Object_active_shape_update(Main *bmain, Scene * /*scene*/, Point DEG_id_tag_update(&mesh->id, 0); - BKE_editmesh_looptri_and_normals_calc(em); + BKE_editmesh_looptris_and_normals_calc(em); break; } case OB_CURVES_LEGACY: diff --git a/source/blender/makesrna/intern/rna_object_api.cc b/source/blender/makesrna/intern/rna_object_api.cc index 433d9e5e749..ee00c780ec5 100644 --- a/source/blender/makesrna/intern/rna_object_api.cc +++ b/source/blender/makesrna/intern/rna_object_api.cc @@ -629,7 +629,7 @@ static void rna_Object_ray_cast(Object *ob, /* No need to managing allocation or freeing of the BVH data. * This is generated and freed as needed. */ - BKE_bvhtree_from_mesh_get(&treeData, mesh_eval, BVHTREE_FROM_LOOPTRI, 4); + BKE_bvhtree_from_mesh_get(&treeData, mesh_eval, BVHTREE_FROM_LOOPTRIS, 4); /* may fail if the mesh has no faces, in that case the ray-cast misses */ if (treeData.tree != nullptr) { @@ -687,7 +687,7 @@ static void rna_Object_closest_point_on_mesh(Object *ob, /* No need to managing allocation or freeing of the BVH data. * this is generated and freed as needed. */ Mesh *mesh_eval = BKE_object_get_evaluated_mesh(ob); - BKE_bvhtree_from_mesh_get(&treeData, mesh_eval, BVHTREE_FROM_LOOPTRI, 4); + BKE_bvhtree_from_mesh_get(&treeData, mesh_eval, BVHTREE_FROM_LOOPTRIS, 4); if (treeData.tree == nullptr) { BKE_reportf(reports, diff --git a/source/blender/makesrna/intern/rna_scene.cc b/source/blender/makesrna/intern/rna_scene.cc index 455647886d9..9a4f86788dc 100644 --- a/source/blender/makesrna/intern/rna_scene.cc +++ b/source/blender/makesrna/intern/rna_scene.cc @@ -2012,7 +2012,7 @@ static void rna_Scene_uv_select_mode_update(bContext *C, PointerRNA * /*ptr*/) ED_uvedit_selectmode_clean_multi(C); } -static void object_simplify_update(Object *ob) +static void object_simplify_update(Scene *scene, Object *ob, bool update_normals) { ModifierData *md; ParticleSystem *psys; @@ -2037,7 +2037,7 @@ static void object_simplify_update(Object *ob) if (ob->instance_collection) { FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN (ob->instance_collection, ob_collection) { - object_simplify_update(ob_collection); + object_simplify_update(scene, ob_collection, update_normals); } FOREACH_COLLECTION_OBJECT_RECURSIVE_END; } @@ -2045,22 +2045,27 @@ static void object_simplify_update(Object *ob) if (ob->type == OB_VOLUME) { DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); } + + if (scene->r.mode & R_SIMPLIFY_NORMALS || update_normals) { + if (OB_TYPE_IS_GEOMETRY(ob->type)) { + DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY); + } + } } -static void rna_Scene_use_simplify_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr) +static void rna_Scene_simplify_update_impl(Main *bmain, Scene *sce, bool update_normals) { - Scene *sce = (Scene *)ptr->owner_id; Scene *sce_iter; Base *base; BKE_main_id_tag_listbase(&bmain->objects, LIB_TAG_DOIT, true); FOREACH_SCENE_OBJECT_BEGIN (sce, ob) { - object_simplify_update(ob); + object_simplify_update(sce, ob, update_normals); } FOREACH_SCENE_OBJECT_END; for (SETLOOPER_SET_ONLY(sce, sce_iter, base)) { - object_simplify_update(base->object); + object_simplify_update(sce, base->object, update_normals); } WM_main_add_notifier(NC_GEOM | ND_DATA, nullptr); @@ -2068,12 +2073,25 @@ static void rna_Scene_use_simplify_update(Main *bmain, Scene * /*scene*/, Pointe DEG_id_tag_update(&sce->id, ID_RECALC_COPY_ON_WRITE); } -static void rna_Scene_simplify_update(Main *bmain, Scene *scene, PointerRNA *ptr) +static void rna_Scene_use_simplify_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr) { Scene *sce = (Scene *)ptr->owner_id; + rna_Scene_simplify_update_impl(bmain, sce, false); +} - if (sce->r.mode & R_SIMPLIFY) { - rna_Scene_use_simplify_update(bmain, scene, ptr); +static void rna_Scene_simplify_update(Main *bmain, Scene *scene, PointerRNA * /*ptr*/) +{ + if (scene->r.mode & R_SIMPLIFY) { + rna_Scene_simplify_update_impl(bmain, scene, false); + } +} + +static void rna_Scene_use_simplify_normals_update(Main *bmain, Scene *scene, PointerRNA * /*ptr*/) +{ + /* NOTE: Ideally this would just force recalculation of the draw batch cache normals. + * That's complicated enough to not be worth it here. */ + if (scene->r.mode & R_SIMPLIFY) { + rna_Scene_simplify_update_impl(bmain, scene, true); } } @@ -7086,6 +7104,14 @@ static void rna_def_scene_render_data(BlenderRNA *brna) prop, "Simplify Volumes", "Resolution percentage of volume objects in viewport"); RNA_def_property_update(prop, 0, "rna_Scene_simplify_update"); + prop = RNA_def_property(srna, "use_simplify_normals", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, nullptr, "mode", R_SIMPLIFY_NORMALS); + RNA_def_property_ui_text(prop, + "Mesh Normals", + "Skip computing custom normals and face corner normals for displaying " + "meshes in the viewport"); + RNA_def_property_update(prop, 0, "rna_Scene_use_simplify_normals_update"); + /* EEVEE - Simplify Options */ prop = RNA_def_property(srna, "simplify_shadows_render", PROP_FLOAT, PROP_FACTOR); RNA_def_property_float_default(prop, 1.0); @@ -7581,12 +7607,6 @@ static void rna_def_scene_eevee(BlenderRNA *brna) {0, nullptr, 0, nullptr, nullptr}, }; - static const EnumPropertyItem ray_split_settings_items[] = { - {0, "UNIFIED", 0, "Unified", "All ray types use the same settings"}, - {1, "SPLIT", 0, "Split", "Settings are individual to each ray type"}, - {0, nullptr, 0, nullptr, nullptr}, - }; - static const EnumPropertyItem ray_tracing_method_items[] = { {RAYTRACE_EEVEE_METHOD_NONE, "NONE", 0, "None", "No intersection with scene geometry"}, {RAYTRACE_EEVEE_METHOD_SCREEN, @@ -7789,11 +7809,6 @@ static void rna_def_scene_eevee(BlenderRNA *brna) RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, nullptr); - prop = RNA_def_property(srna, "ray_split_settings", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_items(prop, ray_split_settings_items); - RNA_def_property_ui_text(prop, "Options Split", "Split settings per ray type"); - RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, nullptr); - prop = RNA_def_property(srna, "ray_tracing_method", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, ray_tracing_method_items); RNA_def_property_ui_text( @@ -8153,7 +8168,7 @@ static void rna_def_scene_eevee(BlenderRNA *brna) prop = RNA_def_property(srna, "shadow_normal_bias", PROP_FLOAT, PROP_FACTOR); RNA_def_property_range(prop, 0.0f, FLT_MAX); RNA_def_property_ui_range(prop, 0.001f, 0.1f, 0.001, 3); - RNA_def_property_ui_text(prop, "Shadow Normal Bias", "Move along their normal"); + RNA_def_property_ui_text(prop, "Shadow Normal Bias", "Move shadows along their normal"); RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, nullptr); @@ -8198,20 +8213,10 @@ static void rna_def_scene_eevee(BlenderRNA *brna) RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 2); RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); - prop = RNA_def_property(srna, "reflection_options", PROP_POINTER, PROP_NONE); + prop = RNA_def_property(srna, "ray_tracing_options", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "RaytraceEEVEE"); RNA_def_property_ui_text( prop, "Reflection Trace Options", "EEVEE settings for tracing reflections"); - - prop = RNA_def_property(srna, "refraction_options", PROP_POINTER, PROP_NONE); - RNA_def_property_struct_type(prop, "RaytraceEEVEE"); - RNA_def_property_ui_text( - prop, "Refraction Trace Options", "EEVEE settings for tracing refractions"); - - prop = RNA_def_property(srna, "diffuse_options", PROP_POINTER, PROP_NONE); - RNA_def_property_struct_type(prop, "RaytraceEEVEE"); - RNA_def_property_ui_text( - prop, "Diffuse Trace Options", "EEVEE settings for tracing diffuse reflections"); } static void rna_def_scene_gpencil(BlenderRNA *brna) diff --git a/source/blender/makesrna/intern/rna_sequencer.cc b/source/blender/makesrna/intern/rna_sequencer.cc index 358a487a3df..c4bac795bd4 100644 --- a/source/blender/makesrna/intern/rna_sequencer.cc +++ b/source/blender/makesrna/intern/rna_sequencer.cc @@ -1661,7 +1661,6 @@ static void rna_def_retiming_key(BlenderRNA *brna) RNA_def_struct_sdna(srna, "SeqRetimingKey"); prop = RNA_def_property(srna, "timeline_frame", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, nullptr, "strip_frame_index"); RNA_def_property_int_funcs( prop, "rna_Sequence_retiming_key_frame_get", "rna_Sequence_retiming_key_frame_set", nullptr); RNA_def_property_ui_text(prop, "Timeline Frame", "Position of retiming key in timeline"); diff --git a/source/blender/makesrna/intern/rna_space.cc b/source/blender/makesrna/intern/rna_space.cc index 6bb6408b32f..a91575c9c83 100644 --- a/source/blender/makesrna/intern/rna_space.cc +++ b/source/blender/makesrna/intern/rna_space.cc @@ -2199,13 +2199,16 @@ static void rna_ConsoleLine_body_set(PointerRNA *ptr, const char *value) } } -static void rna_ConsoleLine_cursor_index_range( - PointerRNA *ptr, int *min, int *max, int * /*softmin*/, int * /*softmax*/) +static int rna_ConsoleLine_current_character_get(PointerRNA *ptr) +{ + const ConsoleLine *ci = (ConsoleLine *)ptr->data; + return BLI_str_utf8_offset_to_index(ci->line, ci->len, ci->cursor); +} + +static void rna_ConsoleLine_current_character_set(PointerRNA *ptr, const int index) { ConsoleLine *ci = (ConsoleLine *)ptr->data; - - *min = 0; - *max = ci->len; /* intentionally _not_ -1 */ + ci->cursor = BLI_str_utf8_offset_from_index(ci->line, ci->len, index); } /* Space Dopesheet */ @@ -4706,7 +4709,8 @@ static void rna_def_space_view3d_overlay(BlenderRNA *brna) prop = RNA_def_property(srna, "show_statvis", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, nullptr, "overlay.edit_flag", V3D_OVERLAY_EDIT_STATVIS); - RNA_def_property_ui_text(prop, "Stat Vis", "Display statistical information about the mesh"); + RNA_def_property_ui_text( + prop, "Mesh Analysis", "Display statistical information about the mesh"); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, nullptr); prop = RNA_def_property(srna, "show_extra_edge_length", PROP_BOOLEAN, PROP_NONE); @@ -6608,8 +6612,10 @@ static void rna_def_console_line(BlenderRNA *brna) prop = RNA_def_property( srna, "current_character", PROP_INT, PROP_NONE); /* copied from text editor */ - RNA_def_property_int_sdna(prop, nullptr, "cursor"); - RNA_def_property_int_funcs(prop, nullptr, nullptr, "rna_ConsoleLine_cursor_index_range"); + RNA_def_property_int_funcs(prop, + "rna_ConsoleLine_current_character_get", + "rna_ConsoleLine_current_character_set", + nullptr); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_CONSOLE, nullptr); prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_text.cc b/source/blender/makesrna/intern/rna_text.cc index 60b66f82e5c..ac74b5cebb6 100644 --- a/source/blender/makesrna/intern/rna_text.cc +++ b/source/blender/makesrna/intern/rna_text.cc @@ -108,12 +108,10 @@ static int rna_Text_current_character_get(PointerRNA *ptr) return BLI_str_utf8_offset_to_index(line->line, line->len, text->curc); } -static void rna_Text_current_character_set(PointerRNA *ptr, int index) +static void rna_Text_current_character_set(PointerRNA *ptr, const int index) { Text *text = static_cast(ptr->data); TextLine *line = text->curl; - const int len_utf8 = BLI_strlen_utf8(line->line); - CLAMP_MAX(index, len_utf8); text->curc = BLI_str_utf8_offset_from_index(line->line, line->len, index); } @@ -124,12 +122,10 @@ static int rna_Text_select_end_character_get(PointerRNA *ptr) return BLI_str_utf8_offset_to_index(line->line, line->len, text->selc); } -static void rna_Text_select_end_character_set(PointerRNA *ptr, int index) +static void rna_Text_select_end_character_set(PointerRNA *ptr, const int index) { Text *text = static_cast(ptr->data); TextLine *line = text->sell; - const int len_utf8 = BLI_strlen_utf8(line->line); - CLAMP_MAX(index, len_utf8); text->selc = BLI_str_utf8_offset_from_index(line->line, line->len, index); } diff --git a/source/blender/makesrna/intern/rna_userdef.cc b/source/blender/makesrna/intern/rna_userdef.cc index 35b5f5a9ce1..b60baf6d87c 100644 --- a/source/blender/makesrna/intern/rna_userdef.cc +++ b/source/blender/makesrna/intern/rna_userdef.cc @@ -1118,48 +1118,6 @@ static int rna_UserDef_studiolight_path_length(PointerRNA *ptr) return strlen(sl->filepath); } -/* StudioLight.path_irr_cache */ -static void rna_UserDef_studiolight_path_irr_cache_get(PointerRNA *ptr, char *value) -{ - StudioLight *sl = (StudioLight *)ptr->data; - if (sl->path_irr_cache) { - strcpy(value, sl->path_irr_cache); - } - else { - value[0] = '\0'; - } -} - -static int rna_UserDef_studiolight_path_irr_cache_length(PointerRNA *ptr) -{ - StudioLight *sl = (StudioLight *)ptr->data; - if (sl->path_irr_cache) { - return strlen(sl->path_irr_cache); - } - return 0; -} - -/* StudioLight.path_sh_cache */ -static void rna_UserDef_studiolight_path_sh_cache_get(PointerRNA *ptr, char *value) -{ - StudioLight *sl = (StudioLight *)ptr->data; - if (sl->path_sh_cache) { - strcpy(value, sl->path_sh_cache); - } - else { - value[0] = '\0'; - } -} - -static int rna_UserDef_studiolight_path_sh_cache_length(PointerRNA *ptr) -{ - StudioLight *sl = (StudioLight *)ptr->data; - if (sl->path_sh_cache) { - return strlen(sl->path_sh_cache); - } - return 0; -} - /* StudioLight.index */ static int rna_UserDef_studiolight_index_get(PointerRNA *ptr) { @@ -1189,17 +1147,6 @@ static int rna_UserDef_studiolight_type_get(PointerRNA *ptr) return sl->flag & STUDIOLIGHT_FLAG_ORIENTATIONS; } -static void rna_UserDef_studiolight_spherical_harmonics_coefficients_get(PointerRNA *ptr, - float *values) -{ - StudioLight *sl = (StudioLight *)ptr->data; - float *value = values; - for (int i = 0; i < STUDIOLIGHT_SH_EFFECTIVE_COEFS_LEN; i++) { - copy_v3_v3(value, sl->spherical_harmonics_coefs[i]); - value += 3; - } -} - /* StudioLight.solid_lights */ static void rna_UserDef_studiolight_solid_lights_begin(CollectionPropertyIterator *iter, @@ -4527,31 +4474,6 @@ static void rna_def_userdef_studiolight(BlenderRNA *brna) prop, "Ambient Color", "Color of the ambient light that uniformly lit the scene"); RNA_def_property_clear_flag(prop, PROP_EDITABLE); - prop = RNA_def_property(srna, "path_irr_cache", PROP_STRING, PROP_DIRPATH); - RNA_def_property_string_funcs(prop, - "rna_UserDef_studiolight_path_irr_cache_get", - "rna_UserDef_studiolight_path_irr_cache_length", - nullptr); - RNA_def_property_ui_text( - prop, "Irradiance Cache Path", "Path where the irradiance cache is stored"); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - - prop = RNA_def_property(srna, "path_sh_cache", PROP_STRING, PROP_DIRPATH); - RNA_def_property_string_funcs(prop, - "rna_UserDef_studiolight_path_sh_cache_get", - "rna_UserDef_studiolight_path_sh_cache_length", - nullptr); - RNA_def_property_ui_text( - prop, "SH Cache Path", "Path where the spherical harmonics cache is stored"); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - - const int spherical_harmonics_dim[] = {STUDIOLIGHT_SH_EFFECTIVE_COEFS_LEN, 3}; - prop = RNA_def_property(srna, "spherical_harmonics_coefficients", PROP_FLOAT, PROP_COLOR); - RNA_def_property_multi_array(prop, 2, spherical_harmonics_dim); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_float_funcs( - prop, "rna_UserDef_studiolight_spherical_harmonics_coefficients_get", nullptr, nullptr); - RNA_define_verify_sdna(true); } @@ -6317,7 +6239,7 @@ static void rna_def_userdef_input(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Mouse Drag Threshold", "Number of pixels to drag before a drag event is triggered " - "for mouse/track-pad input " + "for mouse/trackpad input " "(otherwise click events are detected)"); prop = RNA_def_property(srna, "drag_threshold_tablet", PROP_INT, PROP_PIXEL); diff --git a/source/blender/makesrna/intern/rna_wm.cc b/source/blender/makesrna/intern/rna_wm.cc index f890379382a..1440b90badd 100644 --- a/source/blender/makesrna/intern/rna_wm.cc +++ b/source/blender/makesrna/intern/rna_wm.cc @@ -2166,13 +2166,13 @@ static void rna_def_event(BlenderRNA *brna) RNA_def_property_boolean_funcs(prop, "rna_Event_is_repeat_get", nullptr); RNA_def_property_ui_text(prop, "Is Repeat", "The event is generated by holding a key down"); - /* Track-pad & NDOF. */ + /* Trackpad & NDOF. */ prop = RNA_def_property(srna, "is_consecutive", PROP_BOOLEAN, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_boolean_funcs(prop, "rna_Event_is_consecutive_get", nullptr); RNA_def_property_ui_text(prop, "Is Consecutive", - "Part of a track-pad or NDOF motion, " + "Part of a trackpad or NDOF motion, " "interrupted by cursor motion, button or key press events"); /* mouse */ diff --git a/source/blender/makesrna/intern/rna_xr.cc b/source/blender/makesrna/intern/rna_xr.cc index 7867ad03154..9692dd2d21d 100644 --- a/source/blender/makesrna/intern/rna_xr.cc +++ b/source/blender/makesrna/intern/rna_xr.cc @@ -1364,7 +1364,7 @@ static const EnumPropertyItem rna_enum_xr_action_types[] = { "VECTOR2D", 0, "Vector2D", - "2D float vector action, representing a thumb-stick or track-pad"}, + "2D float vector action, representing a thumbstick or trackpad"}, {XR_POSE_INPUT, "POSE", 0, diff --git a/source/blender/modifiers/intern/MOD_array.cc b/source/blender/modifiers/intern/MOD_array.cc index 326344a2df1..8cc77cdcd07 100644 --- a/source/blender/modifiers/intern/MOD_array.cc +++ b/source/blender/modifiers/intern/MOD_array.cc @@ -316,8 +316,8 @@ static void mesh_merge_transform(Mesh *result, } /* remap the vertex groups if necessary */ - if (BKE_mesh_deform_verts(result) != nullptr) { - MDeformVert *dvert = BKE_mesh_deform_verts_for_write(result); + if (!result->deform_verts().is_empty()) { + MDeformVert *dvert = result->deform_verts_for_write().data(); BKE_object_defgroup_index_map_apply(&dvert[cap_verts_index], cap_nverts, remap, remap_len); } diff --git a/source/blender/modifiers/intern/MOD_boolean.cc b/source/blender/modifiers/intern/MOD_boolean.cc index 24bfe729960..c0af83e4461 100644 --- a/source/blender/modifiers/intern/MOD_boolean.cc +++ b/source/blender/modifiers/intern/MOD_boolean.cc @@ -151,7 +151,7 @@ static Mesh *get_quick_mesh( mul_m4_v3(omat, positions[i]); } - BKE_mesh_tag_positions_changed(result); + result->tag_positions_changed(); } break; diff --git a/source/blender/modifiers/intern/MOD_cloth.cc b/source/blender/modifiers/intern/MOD_cloth.cc index 7ad127045ac..d2b884bada1 100644 --- a/source/blender/modifiers/intern/MOD_cloth.cc +++ b/source/blender/modifiers/intern/MOD_cloth.cc @@ -115,7 +115,7 @@ static void deform_verts(ModifierData *md, } mesh->vert_positions_for_write().copy_from(positions); - BKE_mesh_tag_positions_changed(mesh); + mesh->tag_positions_changed(); clothModifier_do(clmd, ctx->depsgraph, diff --git a/source/blender/modifiers/intern/MOD_collision.cc b/source/blender/modifiers/intern/MOD_collision.cc index a2e21575d72..227864d5f2a 100644 --- a/source/blender/modifiers/intern/MOD_collision.cc +++ b/source/blender/modifiers/intern/MOD_collision.cc @@ -110,7 +110,7 @@ static void deform_verts(ModifierData *md, int mvert_num = 0; mesh->vert_positions_for_write().copy_from(positions); - BKE_mesh_tag_positions_changed(mesh); + mesh->tag_positions_changed(); current_time = DEG_get_ctime(ctx->depsgraph); @@ -159,7 +159,7 @@ static void deform_verts(ModifierData *md, collmd->tri_num = looptris.size(); MVertTri *tri = static_cast( MEM_mallocN(sizeof(*tri) * collmd->tri_num, __func__)); - BKE_mesh_runtime_verttri_from_looptri( + BKE_mesh_runtime_verttris_from_looptris( tri, mesh->corner_verts().data(), looptris.data(), collmd->tri_num); collmd->tri = tri; } diff --git a/source/blender/modifiers/intern/MOD_explode.cc b/source/blender/modifiers/intern/MOD_explode.cc index 971221b24ba..7a5983a4bc2 100644 --- a/source/blender/modifiers/intern/MOD_explode.cc +++ b/source/blender/modifiers/intern/MOD_explode.cc @@ -128,7 +128,7 @@ static void createFacepa(ExplodeModifierData *emd, ParticleSystemModifierData *p /* set protected verts */ if (emd->vgroup) { - const MDeformVert *dvert = BKE_mesh_deform_verts(mesh); + const MDeformVert *dvert = mesh->deform_verts().data(); if (dvert) { const int defgrp_index = emd->vgroup - 1; for (i = 0; i < totvert; i++, dvert++) { diff --git a/source/blender/modifiers/intern/MOD_laplaciandeform.cc b/source/blender/modifiers/intern/MOD_laplaciandeform.cc index df9cfb6f468..2ff65e5998c 100644 --- a/source/blender/modifiers/intern/MOD_laplaciandeform.cc +++ b/source/blender/modifiers/intern/MOD_laplaciandeform.cc @@ -65,18 +65,34 @@ struct LaplacianSystem { int tris_num; int anchors_num; int repeat; - char anchor_grp_name[64]; /* Vertex Group name */ - float (*co)[3]; /* Original vertex coordinates */ - float (*no)[3]; /* Original vertex normal */ - float (*delta)[3]; /* Differential Coordinates */ - uint (*tris)[3]; /* Copy of MLoopTri (tessellation triangle) v1-v3 */ - int *index_anchors; /* Static vertex index list */ - int *unit_verts; /* Unit vectors of projected edges onto the plane orthogonal to n */ - int *ringf_indices; /* Indices of faces per vertex */ - int *ringv_indices; /* Indices of neighbors(vertex) per vertex */ - LinearSolver *context; /* System for solve general implicit rotations */ - MeshElemMap *ringf_map; /* Map of faces per vertex */ - MeshElemMap *ringv_map; /* Map of vertex per vertex */ + /** Vertex Group name */ + char anchor_grp_name[64]; + /** Original vertex coordinates. */ + float (*co)[3]; + /** Original vertex normal. */ + float (*no)[3]; + /** Differential Coordinates. */ + float (*delta)[3]; + /** + * An array of triangles, each triangle represents 3 vertex indices. + * + * \note This is derived from the meshes #MLoopTri array. + */ + uint (*tris)[3]; + /** Static vertex index list. */ + int *index_anchors; + /** Unit vectors of projected edges onto the plane orthogonal to n. */ + int *unit_verts; + /** Indices of faces per vertex. */ + int *ringf_indices; + /** Indices of neighbors(vertex) per vertex. */ + int *ringv_indices; + /** System for solve general implicit rotations. */ + LinearSolver *context; + /** Map of faces per vertex. */ + MeshElemMap *ringf_map; + /** Map of vertex per vertex. */ + MeshElemMap *ringv_map; }; static LaplacianSystem *newLaplacianSystem() @@ -151,9 +167,9 @@ static void createFaceRingMap(const int mvert_tot, MeshElemMap *map = MEM_cnew_array(mvert_tot, __func__); for (const int i : looptris.index_range()) { - const MLoopTri &mlt = looptris[i]; + const MLoopTri < = looptris[i]; for (int j = 0; j < 3; j++) { - const int v_index = corner_verts[mlt.tri[j]]; + const int v_index = corner_verts[lt.tri[j]]; map[v_index].count++; indices_num++; } @@ -166,9 +182,9 @@ static void createFaceRingMap(const int mvert_tot, map[i].count = 0; } for (const int i : looptris.index_range()) { - const MLoopTri &mlt = looptris[i]; + const MLoopTri < = looptris[i]; for (int j = 0; j < 3; j++) { - const int v_index = corner_verts[mlt.tri[j]]; + const int v_index = corner_verts[lt.tri[j]]; map[v_index].indices[map[v_index].count] = i; map[v_index].count++; } diff --git a/source/blender/modifiers/intern/MOD_meshcache.cc b/source/blender/modifiers/intern/MOD_meshcache.cc index ff81d61e477..dd0938f0a1f 100644 --- a/source/blender/modifiers/intern/MOD_meshcache.cc +++ b/source/blender/modifiers/intern/MOD_meshcache.cc @@ -248,7 +248,7 @@ static void meshcache_do(MeshCacheModifierData *mcmd, const float global_offset = (mcmd->flag & MOD_MESHCACHE_INVERT_VERTEX_GROUP) ? mcmd->factor : 0.0f; - if (BKE_mesh_deform_verts(mesh) != nullptr) { + if (!mesh->deform_verts().is_empty()) { for (int i = 0; i < verts_num; i++) { /* For each vertex, compute its blending factor between the mesh cache (for `fac = 0`) * and the former position of the vertex (for `fac = 1`). */ diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc index d23ed5bfbd9..d8b4be58b88 100644 --- a/source/blender/modifiers/intern/MOD_nodes.cc +++ b/source/blender/modifiers/intern/MOD_nodes.cc @@ -164,9 +164,11 @@ static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphCont DEG_add_node_tree_output_relation(ctx->node, nmd->node_group, "Nodes Modifier"); bool needs_own_transform_relation = false; + bool needs_scene_camera_relation = false; Set used_ids; find_used_ids_from_settings(nmd->settings, used_ids); - nodes::find_node_tree_dependencies(*nmd->node_group, used_ids, needs_own_transform_relation); + nodes::find_node_tree_dependencies( + *nmd->node_group, used_ids, needs_own_transform_relation, needs_scene_camera_relation); if (ctx->object->type == OB_CURVES) { Curves *curves_id = static_cast(ctx->object->data); @@ -203,6 +205,11 @@ static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphCont if (needs_own_transform_relation) { DEG_add_depends_on_transform_relation(ctx->node, "Nodes Modifier"); } + if (needs_scene_camera_relation) { + DEG_add_scene_camera_relation(ctx->node, ctx->scene, DEG_OB_COMP_TRANSFORM, "Nodes Modifier"); + /* Active camera is a scene parameter that can change, so we need a relation for that, too. */ + DEG_add_scene_relation(ctx->node, ctx->scene, DEG_SCENE_COMP_PARAMETERS, "Nodes Modifier"); + } } static bool check_tree_for_time_node(const bNodeTree &tree, Set &checked_groups) diff --git a/source/blender/modifiers/intern/MOD_normal_edit.cc b/source/blender/modifiers/intern/MOD_normal_edit.cc index 25f913f3b9c..6494d1ed933 100644 --- a/source/blender/modifiers/intern/MOD_normal_edit.cc +++ b/source/blender/modifiers/intern/MOD_normal_edit.cc @@ -232,6 +232,7 @@ static void normalEditModifier_do_radial(NormalEditModifierData *enmd, blender::MutableSpan corner_edges, const blender::OffsetIndices faces) { + using namespace blender; Object *ob_target = enmd->target; const bool do_facenors_fix = (enmd->flag & MOD_NORMALEDIT_NO_POLYNORS_FIX) == 0; @@ -321,8 +322,8 @@ static void normalEditModifier_do_radial(NormalEditModifierData *enmd, if (do_facenors_fix) { faces_check_flip(*mesh, nos, mesh->face_normals()); } - const bool *sharp_faces = static_cast( - CustomData_get_layer_named(&mesh->face_data, CD_PROP_BOOL, "sharp_face")); + const bke::AttributeAccessor attributes = mesh->attributes(); + const VArraySpan sharp_faces = *attributes.lookup("sharp_face", ATTR_DOMAIN_FACE); blender::bke::mesh::normals_loop_custom_set(vert_positions, edges, faces, @@ -358,6 +359,7 @@ static void normalEditModifier_do_directional(NormalEditModifierData *enmd, blender::MutableSpan corner_edges, const blender::OffsetIndices faces) { + using namespace blender; Object *ob_target = enmd->target; const bool do_facenors_fix = (enmd->flag & MOD_NORMALEDIT_NO_POLYNORS_FIX) == 0; @@ -426,8 +428,8 @@ static void normalEditModifier_do_directional(NormalEditModifierData *enmd, if (do_facenors_fix) { faces_check_flip(*mesh, nos, mesh->face_normals()); } - const bool *sharp_faces = static_cast( - CustomData_get_layer_named(&mesh->face_data, CD_PROP_BOOL, "sharp_face")); + const bke::AttributeAccessor attributes = mesh->attributes(); + const VArraySpan sharp_faces = *attributes.lookup("sharp_face", ATTR_DOMAIN_FACE); blender::bke::mesh::normals_loop_custom_set(positions, edges, faces, @@ -511,8 +513,7 @@ static Mesh *normalEditModifier_do(NormalEditModifierData *enmd, clnors = static_cast( CustomData_get_layer_for_write(ldata, CD_CUSTOMLOOPNORMAL, corner_verts.size())); loop_normals.reinitialize(corner_verts.size()); - const bool *sharp_faces = static_cast( - CustomData_get_layer_named(&result->face_data, CD_PROP_BOOL, "sharp_face")); + const VArraySpan sharp_faces = *attributes.lookup("sharp_face", ATTR_DOMAIN_FACE); blender::bke::mesh::normals_calc_loop(positions, edges, faces, @@ -521,7 +522,7 @@ static Mesh *normalEditModifier_do(NormalEditModifierData *enmd, result->corner_to_face_map(), result->vert_normals(), result->face_normals(), - sharp_edges.span.data(), + sharp_edges.span, sharp_faces, clnors, nullptr, diff --git a/source/blender/modifiers/intern/MOD_ocean.cc b/source/blender/modifiers/intern/MOD_ocean.cc index 54df4ac2e51..3260df9762f 100644 --- a/source/blender/modifiers/intern/MOD_ocean.cc +++ b/source/blender/modifiers/intern/MOD_ocean.cc @@ -453,7 +453,7 @@ static Mesh *doOcean(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mes } } - BKE_mesh_tag_positions_changed(mesh); + mesh->tag_positions_changed(); if (allocated_ocean) { BKE_ocean_free(omd->ocean); diff --git a/source/blender/modifiers/intern/MOD_particlesystem.cc b/source/blender/modifiers/intern/MOD_particlesystem.cc index 59fa6d2df4c..1caf1b23533 100644 --- a/source/blender/modifiers/intern/MOD_particlesystem.cc +++ b/source/blender/modifiers/intern/MOD_particlesystem.cc @@ -148,7 +148,7 @@ static void deform_verts(ModifierData *md, /* make new mesh */ psmd->mesh_final = BKE_mesh_copy_for_eval(mesh); psmd->mesh_final->vert_positions_for_write().copy_from(positions); - BKE_mesh_tag_positions_changed(psmd->mesh_final); + psmd->mesh_final->tag_positions_changed(); BKE_mesh_tessface_ensure(psmd->mesh_final); diff --git a/source/blender/modifiers/intern/MOD_remesh.cc b/source/blender/modifiers/intern/MOD_remesh.cc index 7c4a1d18208..a59e152006a 100644 --- a/source/blender/modifiers/intern/MOD_remesh.cc +++ b/source/blender/modifiers/intern/MOD_remesh.cc @@ -69,9 +69,9 @@ static void init_dualcon_mesh(DualConInput *input, Mesh *mesh) input->mloop = (DualConLoop)mesh->corner_verts().data(); input->loop_stride = sizeof(int); - input->looptri = (DualConTri)mesh->looptris().data(); + input->looptris = (DualConTri)mesh->looptris().data(); input->tri_stride = sizeof(MLoopTri); - input->tottri = BKE_mesh_runtime_looptri_len(mesh); + input->tottri = BKE_mesh_runtime_looptris_len(mesh); const blender::Bounds bounds = *mesh->bounds_min_max(); copy_v3_v3(input->min, bounds.min); @@ -134,6 +134,7 @@ static void dualcon_add_quad(void *output_v, const int vert_indices[4]) static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext * /*ctx*/, Mesh *mesh) { + using namespace blender; RemeshModifierData *rmd; DualConOutput *output; DualConInput input; @@ -196,7 +197,7 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext * /*ctx*/, MEM_freeN(output); } - BKE_mesh_smooth_flag_set(result, rmd->flag & MOD_REMESH_SMOOTH_SHADING); + bke::mesh_smooth_set(*result, rmd->flag & MOD_REMESH_SMOOTH_SHADING); BKE_mesh_copy_parameters_for_eval(result, mesh); BKE_mesh_calc_edges(result, true, false); diff --git a/source/blender/modifiers/intern/MOD_screw.cc b/source/blender/modifiers/intern/MOD_screw.cc index b6e82c2f99e..9c21caf8ead 100644 --- a/source/blender/modifiers/intern/MOD_screw.cc +++ b/source/blender/modifiers/intern/MOD_screw.cc @@ -836,8 +836,13 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh /* more of an offset in this case */ edge_offset = totedge + (totvert * (step_tot - (close ? 0 : 1))); - const int *src_material_index = BKE_mesh_material_indices(mesh); - int *dst_material_index = BKE_mesh_material_indices_for_write(result); + const bke::AttributeAccessor src_attributes = mesh->attributes(); + const VArraySpan src_material_index = *src_attributes.lookup("material_index", + ATTR_DOMAIN_FACE); + + bke::MutableAttributeAccessor dst_attributes = result->attributes_for_write(); + bke::SpanAttributeWriter dst_material_index = dst_attributes.lookup_or_add_for_write_span( + "material_index", ATTR_DOMAIN_FACE); for (uint i = 0; i < totedge; i++, med_new_firstloop++) { const uint step_last = step_tot - (close ? 1 : 2); @@ -858,7 +863,7 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh i2 = uint((*med_new_firstloop)[1]); if (has_mpoly_orig) { - mat_nr = src_material_index == nullptr ? 0 : src_material_index[face_index_orig]; + mat_nr = src_material_index.is_empty() ? 0 : src_material_index[face_index_orig]; } else { mat_nr = 0; @@ -884,7 +889,7 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh } else { origindex[face_index] = ORIGINDEX_NONE; - dst_material_index[face_index] = mat_nr; + dst_material_index.span[face_index] = mat_nr; sharp_faces.span[face_index] = use_flat_shading; } face_offests_new[face_index] = face_index * 4; @@ -1026,6 +1031,8 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh ltmd->merge_dist); } + dst_material_index.finish(); + return result; } diff --git a/source/blender/modifiers/intern/MOD_skin.cc b/source/blender/modifiers/intern/MOD_skin.cc index 57a2af44902..ef13280124a 100644 --- a/source/blender/modifiers/intern/MOD_skin.cc +++ b/source/blender/modifiers/intern/MOD_skin.cc @@ -539,7 +539,7 @@ static void end_node_frames(int v, const float *rad = nodes[v].radius; float mat[3][3]; - if (emap[v].size() == 0) { + if (emap[v].is_empty()) { float avg = half_v2(rad); /* For solitary nodes, just build a box (two frames) */ @@ -814,7 +814,7 @@ static EMat *build_edge_mats(const MVertSkin *vs, *has_valid_root = true; } - else if (edges.size() == 0) { + else if (edges.is_empty()) { /* Vertex-only mesh is valid, mark valid root as well (will display error otherwise). */ *has_valid_root = true; break; @@ -906,7 +906,7 @@ static Mesh *subdivide_base(const Mesh *orig) CustomData_get_layer(&orig->vert_data, CD_MVERT_SKIN)); const blender::Span orig_vert_positions = orig->vert_positions(); const blender::Span orig_edges = orig->edges(); - const MDeformVert *origdvert = BKE_mesh_deform_verts(orig); + const MDeformVert *origdvert = orig->deform_verts().data(); int orig_vert_num = orig->totvert; int orig_edge_num = orig->totedge; @@ -932,7 +932,7 @@ static Mesh *subdivide_base(const Mesh *orig) CustomData_get_layer_for_write(&result->vert_data, CD_MVERT_SKIN, result->totvert)); MDeformVert *outdvert = nullptr; if (origdvert) { - outdvert = BKE_mesh_deform_verts_for_write(result); + outdvert = result->deform_verts_for_write().data(); } /* Copy original vertex data */ @@ -1913,7 +1913,6 @@ static Mesh *base_skin(Mesh *origmesh, SkinModifierData *smd, eSkinErrorFlag *r_ BMesh *bm; EMat *emat; SkinNode *skin_nodes; - const MDeformVert *dvert; bool has_valid_root = false; const MVertSkin *nodes = static_cast( @@ -1921,7 +1920,7 @@ static Mesh *base_skin(Mesh *origmesh, SkinModifierData *smd, eSkinErrorFlag *r_ const blender::Span vert_positions = origmesh->vert_positions(); const blender::Span edges = origmesh->edges(); - dvert = BKE_mesh_deform_verts(origmesh); + const MDeformVert *dvert = origmesh->deform_verts().data(); const int verts_num = origmesh->totvert; blender::Array vert_to_edge_offsets; diff --git a/source/blender/modifiers/intern/MOD_solidify_extrude.cc b/source/blender/modifiers/intern/MOD_solidify_extrude.cc index 147637b1d71..8d03170956a 100644 --- a/source/blender/modifiers/intern/MOD_solidify_extrude.cc +++ b/source/blender/modifiers/intern/MOD_solidify_extrude.cc @@ -19,6 +19,7 @@ #include "MEM_guardedalloc.h" +#include "BKE_attribute.hh" #include "BKE_deform.h" #include "BKE_mesh.hh" #include "BKE_particle.h" @@ -144,6 +145,7 @@ static void mesh_calc_hq_normal(Mesh *mesh, /* NOLINTNEXTLINE: readability-function-size */ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh) { + using namespace blender; Mesh *result; const SolidifyModifierData *smd = (SolidifyModifierData *)md; @@ -415,7 +417,9 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex } \ (void)0 - int *dst_material_index = BKE_mesh_material_indices_for_write(result); + bke::MutableAttributeAccessor dst_attributes = result->attributes_for_write(); + bke::SpanAttributeWriter dst_material_index = dst_attributes.lookup_or_add_for_write_span( + "material_index", ATTR_DOMAIN_FACE); /* flip normals */ @@ -451,8 +455,8 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex #endif if (mat_ofs) { - dst_material_index[faces_num + i] += mat_ofs; - CLAMP(dst_material_index[faces_num + i], 0, mat_nr_max); + dst_material_index.span[faces_num + i] += mat_ofs; + CLAMP(dst_material_index.span[faces_num + i], 0, mat_nr_max); } e = corner_edges[corner_2 + 0]; @@ -982,7 +986,7 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex /* Add vertex weights for rim and shell vgroups. */ if (shell_defgrp_index != -1 || rim_defgrp_index != -1) { - MDeformVert *dst_dvert = BKE_mesh_deform_verts_for_write(result); + MDeformVert *dst_dvert = result->deform_verts_for_write().data(); /* Ultimate security check. */ if (dst_dvert != nullptr) { @@ -1121,8 +1125,8 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex /* use the next material index if option enabled */ if (mat_ofs_rim) { - dst_material_index[new_face_index] += mat_ofs_rim; - CLAMP(dst_material_index[new_face_index], 0, mat_nr_max); + dst_material_index.span[new_face_index] += mat_ofs_rim; + CLAMP(dst_material_index.span[new_face_index], 0, mat_nr_max); } if (crease_outer) { /* crease += crease_outer; without wrapping */ @@ -1152,6 +1156,8 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex MEM_freeN(old_vert_arr); } + dst_material_index.finish(); + return result; } diff --git a/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc b/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc index 189f5a0bb9b..ddcabe22637 100644 --- a/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc +++ b/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc @@ -2014,7 +2014,7 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md, /* Checks that result has dvert data. */ MDeformVert *dst_dvert = nullptr; if (shell_defgrp_index != -1 || rim_defgrp_index != -1) { - dst_dvert = BKE_mesh_deform_verts_for_write(result); + dst_dvert = result->deform_verts_for_write().data(); } /* Get vertex crease layer and ensure edge creases are active if vertex creases are found, since @@ -2148,9 +2148,12 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md, } } #endif - - const int *src_material_index = BKE_mesh_material_indices(mesh); - int *dst_material_index = BKE_mesh_material_indices_for_write(result); + const bke::AttributeAccessor src_attributes = mesh->attributes(); + const VArraySpan src_material_index = *src_attributes.lookup("material_index", + ATTR_DOMAIN_FACE); + bke::MutableAttributeAccessor dst_attributes = result->attributes_for_write(); + bke::SpanAttributeWriter dst_material_index = dst_attributes.lookup_or_add_for_write_span( + "material_index", ATTR_DOMAIN_FACE); /* Make boundary edges/faces. */ { @@ -2293,20 +2296,24 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md, for (EdgeGroup *g3 = g2; g3->valid && k < j; g3++) { if ((do_rim && !g3->is_orig_closed) || (do_shell && g3->split)) { /* Check both far ends in terms of faces of an edge group. */ - if ((src_material_index ? src_material_index[g3->edges[0]->faces[0]->index] : - 0) == l) { + if ((!src_material_index.is_empty() ? + src_material_index[g3->edges[0]->faces[0]->index] : + 0) == l) { face = g3->edges[0]->faces[0]->index; count++; } NewEdgeRef *le = g3->edges[g3->edges_len - 1]; if (le->faces[1] && - (src_material_index ? src_material_index[le->faces[1]->index] : 0) == l) { + (!src_material_index.is_empty() ? src_material_index[le->faces[1]->index] : + 0) == l) + { face = le->faces[1]->index; count++; } - else if (!le->faces[1] && - (src_material_index ? src_material_index[le->faces[0]->index] : 0) == - l) { + else if (!le->faces[1] && (!src_material_index.is_empty() ? + src_material_index[le->faces[0]->index] : + 0) == l) + { face = le->faces[0]->index; count++; } @@ -2325,9 +2332,10 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md, origindex_face[face_index] = ORIGINDEX_NONE; } face_offsets[face_index] = int(loop_index); - dst_material_index[face_index] = most_mat_nr + - (g->is_orig_closed || !do_rim ? 0 : mat_ofs_rim); - CLAMP(dst_material_index[face_index], 0, mat_nr_max); + dst_material_index.span[face_index] = most_mat_nr + (g->is_orig_closed || !do_rim ? + 0 : + mat_ofs_rim); + CLAMP(dst_material_index.span[face_index], 0, mat_nr_max); face_index++; for (uint k = 0; g2->valid && k < j; g2++) { @@ -2401,9 +2409,11 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md, int(face_index), 1); face_offsets[face_index] = int(loop_index); - dst_material_index[face_index] = - (src_material_index ? src_material_index[orig_face_index] : 0) + mat_ofs_rim; - CLAMP(dst_material_index[face_index], 0, mat_nr_max); + dst_material_index.span[face_index] = (!src_material_index.is_empty() ? + src_material_index[orig_face_index] : + 0) + + mat_ofs_rim; + CLAMP(dst_material_index.span[face_index], 0, mat_nr_max); face_index++; int loop1 = -1; @@ -2593,10 +2603,11 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md, CustomData_copy_data( &mesh->face_data, &result->face_data, int(i / 2), int(face_index), 1); face_offsets[face_index] = int(loop_index); - dst_material_index[face_index] = (src_material_index ? src_material_index[fr->index] : - 0) + - (fr->reversed != do_flip ? mat_ofs : 0); - CLAMP(dst_material_index[face_index], 0, mat_nr_max); + dst_material_index.span[face_index] = (!src_material_index.is_empty() ? + src_material_index[fr->index] : + 0) + + (fr->reversed != do_flip ? mat_ofs : 0); + CLAMP(dst_material_index.span[face_index], 0, mat_nr_max); if (fr->reversed != do_flip) { for (int l = int(k) - 1; l >= 0; l--) { if (shell_defgrp_index != -1) { @@ -2686,6 +2697,8 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md, #undef MOD_SOLIDIFY_EMPTY_TAG + dst_material_index.finish(); + return result; } diff --git a/source/blender/modifiers/intern/MOD_surface.cc b/source/blender/modifiers/intern/MOD_surface.cc index 7a88c0beee5..d0c78d1af01 100644 --- a/source/blender/modifiers/intern/MOD_surface.cc +++ b/source/blender/modifiers/intern/MOD_surface.cc @@ -119,7 +119,7 @@ static void deform_verts(ModifierData *md, int init = 0; surmd->runtime.mesh->vert_positions_for_write().copy_from(positions); - BKE_mesh_tag_positions_changed(surmd->runtime.mesh); + surmd->runtime.mesh->tag_positions_changed(); mesh_verts_num = surmd->runtime.mesh->totvert; @@ -168,7 +168,7 @@ static void deform_verts(ModifierData *md, if (has_face) { BKE_bvhtree_from_mesh_get( - surmd->runtime.bvhtree, surmd->runtime.mesh, BVHTREE_FROM_LOOPTRI, 2); + surmd->runtime.bvhtree, surmd->runtime.mesh, BVHTREE_FROM_LOOPTRIS, 2); } else if (has_edge) { BKE_bvhtree_from_mesh_get( diff --git a/source/blender/modifiers/intern/MOD_surfacedeform.cc b/source/blender/modifiers/intern/MOD_surfacedeform.cc index f3c99bd0872..ae0f024aa69 100644 --- a/source/blender/modifiers/intern/MOD_surfacedeform.cc +++ b/source/blender/modifiers/intern/MOD_surfacedeform.cc @@ -699,7 +699,7 @@ BLI_INLINE SDefBindWeightData *computeBindWeights(SDefBindCalcData *const data, /* Compute the distance scale for the corner. The base value is the orthogonal * distance from the corner to the chord, scaled by `sqrt(2)` to preserve the old * values in case of a square grid. This doesn't use the centroid because the - * LOOPTRI method only uses these three vertices. */ + * LOOPTRIS method only uses these three vertices. */ bpoly->scale_mid = area_tri_v2(vert0_v2, corner_v2, vert1_v2) / len_v2v2(vert0_v2, vert1_v2) * sqrtf(2); @@ -1016,7 +1016,7 @@ static void bindVert(void *__restrict userdata, sdbind->influence = bpoly->weight; sdbind->verts_num = bpoly->verts_num; - sdbind->mode = MOD_SDEF_MODE_NGON; + sdbind->mode = MOD_SDEF_MODE_NGONS; sdbind->vert_weights = static_cast(MEM_malloc_arrayN( bpoly->verts_num, sizeof(*sdbind->vert_weights), "SDefNgonVertWeights")); if (sdbind->vert_weights == nullptr) { @@ -1105,7 +1105,7 @@ static void bindVert(void *__restrict userdata, sdbind->influence = bpoly->weight * bpoly->dominant_angle_weight; sdbind->verts_num = bpoly->verts_num; - sdbind->mode = MOD_SDEF_MODE_LOOPTRI; + sdbind->mode = MOD_SDEF_MODE_LOOPTRIS; sdbind->vert_weights = static_cast( MEM_malloc_arrayN(3, sizeof(*sdbind->vert_weights), "SDefTriVertWeights")); if (sdbind->vert_weights == nullptr) { @@ -1220,7 +1220,7 @@ static bool surfacedeformBind(Object *ob, return false; } - BKE_bvhtree_from_mesh_get(&treeData, target, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&treeData, target, BVHTREE_FROM_LOOPTRIS, 2); if (treeData.tree == nullptr) { BKE_modifier_set_error(ob, (ModifierData *)smd_eval, "Out of memory"); freeAdjacencyMap(vert_edges, adj_array, edge_polys); @@ -1384,7 +1384,7 @@ static void deformVert(void *__restrict userdata, switch (sdbind->mode) { /* ---------- looptri mode ---------- */ - case MOD_SDEF_MODE_LOOPTRI: { + case MOD_SDEF_MODE_LOOPTRIS: { madd_v3_v3fl(temp, data->targetCos[sdbind->vert_inds[0]], sdbind->vert_weights[0]); madd_v3_v3fl(temp, data->targetCos[sdbind->vert_inds[1]], sdbind->vert_weights[1]); madd_v3_v3fl(temp, data->targetCos[sdbind->vert_inds[2]], sdbind->vert_weights[2]); @@ -1392,7 +1392,7 @@ static void deformVert(void *__restrict userdata, } /* ---------- ngon mode ---------- */ - case MOD_SDEF_MODE_NGON: { + case MOD_SDEF_MODE_NGONS: { for (int k = 0; k < sdbind->verts_num; k++) { madd_v3_v3fl(temp, coords_buffer[k], sdbind->vert_weights[k]); } @@ -1670,7 +1670,7 @@ static void blend_write(BlendWriter *writer, const ID *id_owner, const ModifierD BLO_write_uint32_array( writer, bind_verts[i].binds[j].verts_num, bind_verts[i].binds[j].vert_inds); - if (ELEM(bind_verts[i].binds[j].mode, MOD_SDEF_MODE_CENTROID, MOD_SDEF_MODE_LOOPTRI)) { + if (ELEM(bind_verts[i].binds[j].mode, MOD_SDEF_MODE_CENTROID, MOD_SDEF_MODE_LOOPTRIS)) { BLO_write_float3_array(writer, 1, bind_verts[i].binds[j].vert_weights); } else { @@ -1698,7 +1698,7 @@ static void blend_read(BlendDataReader *reader, ModifierData *md) BLO_read_uint32_array( reader, smd->verts[i].binds[j].verts_num, &smd->verts[i].binds[j].vert_inds); - if (ELEM(smd->verts[i].binds[j].mode, MOD_SDEF_MODE_CENTROID, MOD_SDEF_MODE_LOOPTRI)) { + if (ELEM(smd->verts[i].binds[j].mode, MOD_SDEF_MODE_CENTROID, MOD_SDEF_MODE_LOOPTRIS)) { BLO_read_float3_array(reader, 1, &smd->verts[i].binds[j].vert_weights); } else { diff --git a/source/blender/modifiers/intern/MOD_util.cc b/source/blender/modifiers/intern/MOD_util.cc index c1a47907691..5dc444fdd5f 100644 --- a/source/blender/modifiers/intern/MOD_util.cc +++ b/source/blender/modifiers/intern/MOD_util.cc @@ -22,6 +22,7 @@ #include "DNA_scene_types.h" #include "BKE_action.h" /* BKE_pose_channel_find_name */ +#include "BKE_attribute.hh" #include "BKE_deform.h" #include "BKE_editmesh.hh" #include "BKE_image.h" @@ -100,8 +101,9 @@ void MOD_get_texture_coords(MappingInfoModifierData *dmd, BLI_bitmap *done = BLI_BITMAP_NEW(verts_num, __func__); char uvname[MAX_CUSTOMDATA_LAYER_NAME]; CustomData_validate_layer_name(&mesh->loop_data, CD_PROP_FLOAT2, dmd->uvlayer_name, uvname); - const float(*mloop_uv)[2] = static_cast( - CustomData_get_layer_named(&mesh->loop_data, CD_PROP_FLOAT2, uvname)); + const bke::AttributeAccessor attributes = mesh->attributes(); + const VArraySpan uv_map = *attributes.lookup_or_default( + uvname, ATTR_DOMAIN_CORNER, float2(0)); /* verts are given the UV from the first face that uses them */ for (const int i : faces.index_range()) { @@ -110,8 +112,8 @@ void MOD_get_texture_coords(MappingInfoModifierData *dmd, const int vert = corner_verts[corner]; if (!BLI_BITMAP_TEST(done, vert)) { /* remap UVs from [0, 1] to [-1, 1] */ - r_texco[vert][0] = (mloop_uv[corner][0] * 2.0f) - 1.0f; - r_texco[vert][1] = (mloop_uv[corner][1] * 2.0f) - 1.0f; + r_texco[vert][0] = (uv_map[corner][0] * 2.0f) - 1.0f; + r_texco[vert][1] = (uv_map[corner][1] * 2.0f) - 1.0f; BLI_BITMAP_ENABLE(done, vert); } } @@ -168,7 +170,7 @@ void MOD_get_vgroup(const Object *ob, if (mesh) { *defgrp_index = BKE_id_defgroup_name_index(&mesh->id, name); if (*defgrp_index != -1) { - *dvert = BKE_mesh_deform_verts(mesh); + *dvert = mesh->deform_verts().data(); } else { *dvert = nullptr; diff --git a/source/blender/modifiers/intern/MOD_volume_to_mesh.cc b/source/blender/modifiers/intern/MOD_volume_to_mesh.cc index 5bbda514f21..c4986d4cbed 100644 --- a/source/blender/modifiers/intern/MOD_volume_to_mesh.cc +++ b/source/blender/modifiers/intern/MOD_volume_to_mesh.cc @@ -131,6 +131,7 @@ static Mesh *create_empty_mesh(const Mesh *input_mesh) static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *input_mesh) { + using namespace blender; #ifdef WITH_OPENVDB VolumeToMeshModifierData *vmmd = reinterpret_cast(md); if (vmmd->object == nullptr) { @@ -171,7 +172,7 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh /* Create a temporary transformed grid. The underlying tree is shared. */ openvdb::GridBase::ConstPtr transformed_grid = local_grid->copyGridReplacingTransform(transform); - blender::bke::VolumeToMeshResolution resolution; + bke::VolumeToMeshResolution resolution; resolution.mode = (VolumeToMeshResolutionMode)vmmd->resolution_mode; if (resolution.mode == VOLUME_TO_MESH_RESOLUTION_MODE_VOXEL_AMOUNT) { resolution.settings.voxel_amount = vmmd->voxel_amount; @@ -180,7 +181,7 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh resolution.settings.voxel_size = vmmd->voxel_size; } - Mesh *mesh = blender::bke::volume_to_mesh( + Mesh *mesh = bke::volume_to_mesh( *transformed_grid, resolution, vmmd->threshold, vmmd->adaptivity); if (mesh == nullptr) { BKE_modifier_set_error(ctx->object, md, "Could not generate mesh from grid"); @@ -188,7 +189,7 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh } BKE_mesh_copy_parameters_for_eval(mesh, input_mesh); - BKE_mesh_smooth_flag_set(mesh, vmmd->flag & VOLUME_TO_MESH_USE_SMOOTH_SHADE); + bke::mesh_smooth_set(*mesh, vmmd->flag & VOLUME_TO_MESH_USE_SMOOTH_SHADE); return mesh; #else UNUSED_VARS(md); diff --git a/source/blender/modifiers/intern/MOD_weighted_normal.cc b/source/blender/modifiers/intern/MOD_weighted_normal.cc index 770892c4a93..3bbc62d9e11 100644 --- a/source/blender/modifiers/intern/MOD_weighted_normal.cc +++ b/source/blender/modifiers/intern/MOD_weighted_normal.cc @@ -86,7 +86,7 @@ struct WeightedNormalData { blender::OffsetIndices faces; blender::Span face_normals; - const bool *sharp_faces; + blender::VArraySpan sharp_faces; const int *face_strength; const MDeformVert *dvert; @@ -228,7 +228,7 @@ static void apply_weights_vertex_normal(WeightedNormalModifierData *wnmd, loop_to_face, wn_data->vert_normals, wn_data->face_normals, - wn_data->sharp_edges.data(), + wn_data->sharp_edges, wn_data->sharp_faces, has_clnors ? clnors.data() : nullptr, &lnors_spacearr, @@ -356,7 +356,7 @@ static void apply_weights_vertex_normal(WeightedNormalModifierData *wnmd, loop_to_face, wn_data->vert_normals, face_normals, - wn_data->sharp_edges.data(), + wn_data->sharp_edges, wn_data->sharp_faces, has_clnors ? clnors.data() : nullptr, nullptr, @@ -541,8 +541,7 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh wn_data.faces = faces; wn_data.face_normals = mesh->face_normals(); - wn_data.sharp_faces = static_cast( - CustomData_get_layer_named(&mesh->face_data, CD_PROP_BOOL, "sharp_face")); + wn_data.sharp_faces = *attributes.lookup("sharp_face", ATTR_DOMAIN_FACE); wn_data.face_strength = static_cast(CustomData_get_layer_named( &result->face_data, CD_PROP_INT32, MOD_WEIGHTEDNORMALS_FACEWEIGHT_CDLAYER_ID)); diff --git a/source/blender/modifiers/intern/MOD_weightvgedit.cc b/source/blender/modifiers/intern/MOD_weightvgedit.cc index 88fffbe70e7..548c48c0cbc 100644 --- a/source/blender/modifiers/intern/MOD_weightvgedit.cc +++ b/source/blender/modifiers/intern/MOD_weightvgedit.cc @@ -193,7 +193,7 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh } } - MDeformVert *dvert = BKE_mesh_deform_verts_for_write(mesh); + MDeformVert *dvert = mesh->deform_verts_for_write().data(); /* Ultimate security check. */ if (!dvert) { diff --git a/source/blender/modifiers/intern/MOD_weightvgmix.cc b/source/blender/modifiers/intern/MOD_weightvgmix.cc index ce53ed538cb..f364f6525de 100644 --- a/source/blender/modifiers/intern/MOD_weightvgmix.cc +++ b/source/blender/modifiers/intern/MOD_weightvgmix.cc @@ -257,7 +257,7 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh } } - MDeformVert *dvert = BKE_mesh_deform_verts_for_write(mesh); + MDeformVert *dvert = mesh->deform_verts_for_write().data(); /* Ultimate security check. */ if (!dvert) { diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.cc b/source/blender/modifiers/intern/MOD_weightvgproximity.cc index 41b14f80ef9..1089af36813 100644 --- a/source/blender/modifiers/intern/MOD_weightvgproximity.cc +++ b/source/blender/modifiers/intern/MOD_weightvgproximity.cc @@ -181,7 +181,7 @@ static void get_vert2geom_distance(int verts_num, } if (dist_f) { /* Create a BVH-tree of the given target's faces. */ - BKE_bvhtree_from_mesh_get(&treeData_f, target, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&treeData_f, target, BVHTREE_FROM_LOOPTRIS, 2); if (treeData_f.tree == nullptr) { OUT_OF_MEMORY(); return; @@ -477,7 +477,7 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh return mesh; } - MDeformVert *dvert = BKE_mesh_deform_verts_for_write(mesh); + MDeformVert *dvert = mesh->deform_verts_for_write().data(); /* Ultimate security check. */ if (!dvert) { return mesh; diff --git a/source/blender/nodes/NOD_composite.hh b/source/blender/nodes/NOD_composite.hh index f0d668263ec..4544c3a4fd0 100644 --- a/source/blender/nodes/NOD_composite.hh +++ b/source/blender/nodes/NOD_composite.hh @@ -10,6 +10,10 @@ #include "BKE_node.h" +namespace blender::realtime_compositor { +class RenderContext; +} + struct bNodeTreeType; struct CryptomatteSession; struct Scene; @@ -36,7 +40,8 @@ void ntreeCompositExecTree(Render *render, RenderData *rd, bool rendering, int do_previews, - const char *view_name); + const char *view_name, + blender::realtime_compositor::RenderContext *render_context); /** * Called from render pipeline, to tag render input and output. diff --git a/source/blender/nodes/NOD_geometry_exec.hh b/source/blender/nodes/NOD_geometry_exec.hh index 819bfb2a89a..d248e7159b9 100644 --- a/source/blender/nodes/NOD_geometry_exec.hh +++ b/source/blender/nodes/NOD_geometry_exec.hh @@ -46,8 +46,8 @@ using bke::InstancesComponent; using bke::MeshComponent; using bke::MutableAttributeAccessor; using bke::PointCloudComponent; +using bke::SocketValueVariant; using bke::SpanAttributeWriter; -using bke::ValueOrField; using bke::VolumeComponent; using fn::Field; using fn::FieldContext; @@ -96,22 +96,22 @@ class GeoNodeExecParams { template T extract_input(StringRef identifier) { if constexpr (is_field_base_type_v) { - ValueOrField value_or_field = this->extract_input>(identifier); - return value_or_field.as_value(); + SocketValueVariant value_variant = this->extract_input>(identifier); + return value_variant.as_value(); } else if constexpr (fn::is_field_v) { using BaseType = typename T::base_type; - ValueOrField value_or_field = this->extract_input>( - identifier); - return value_or_field.as_field(); + SocketValueVariant value_variant = + this->extract_input>(identifier); + return value_variant.as_field(); } else if constexpr (std::is_same_v, GField>) { const int index = this->get_input_index(identifier); const bNodeSocket &input_socket = node_.input_by_identifier(identifier); const CPPType &value_type = *input_socket.typeinfo->geometry_nodes_cpp_type; - const bke::ValueOrFieldCPPType &value_or_field_type = - *bke::ValueOrFieldCPPType::get_from_self(value_type); - return value_or_field_type.as_field(params_.try_get_input_data_ptr(index)); + const bke::SocketValueVariantCPPType &value_variant_type = + *bke::SocketValueVariantCPPType::get_from_self(value_type); + return value_variant_type.as_field(params_.try_get_input_data_ptr(index)); } else { #ifndef NDEBUG @@ -135,13 +135,14 @@ class GeoNodeExecParams { template T get_input(StringRef identifier) const { if constexpr (is_field_base_type_v) { - ValueOrField value_or_field = this->get_input>(identifier); - return value_or_field.as_value(); + SocketValueVariant value_variant = this->get_input>(identifier); + return value_variant.as_value(); } else if constexpr (fn::is_field_v) { using BaseType = typename T::base_type; - ValueOrField value_or_field = this->get_input>(identifier); - return value_or_field.as_field(); + SocketValueVariant value_variant = this->get_input>( + identifier); + return value_variant.as_field(); } else { #ifndef NDEBUG @@ -163,17 +164,17 @@ class GeoNodeExecParams { { using StoredT = std::decay_t; if constexpr (is_field_base_type_v) { - this->set_output(identifier, ValueOrField(std::forward(value))); + this->set_output(identifier, SocketValueVariant(std::forward(value))); } else if constexpr (fn::is_field_v) { using BaseType = typename StoredT::base_type; - this->set_output(identifier, ValueOrField(std::forward(value))); + this->set_output(identifier, SocketValueVariant(std::forward(value))); } else if constexpr (std::is_same_v, GField>) { bke::attribute_math::convert_to_static_type(value.cpp_type(), [&](auto dummy) { using ValueT = decltype(dummy); Field value_typed(std::forward(value)); - this->set_output(identifier, ValueOrField(std::move(value_typed))); + this->set_output(identifier, SocketValueVariant(std::move(value_typed))); }); } else { diff --git a/source/blender/nodes/NOD_geometry_nodes_execute.hh b/source/blender/nodes/NOD_geometry_nodes_execute.hh index 64ddc645cc1..df57d3e39f5 100644 --- a/source/blender/nodes/NOD_geometry_nodes_execute.hh +++ b/source/blender/nodes/NOD_geometry_nodes_execute.hh @@ -32,7 +32,8 @@ namespace blender::nodes { void find_node_tree_dependencies(const bNodeTree &tree, Set &r_ids, - bool &r_needs_own_transform_relation); + bool &r_needs_own_transform_relation, + bool &r_needs_scene_camera_relation); StringRef input_use_attribute_suffix(); StringRef input_attribute_name_suffix(); diff --git a/source/blender/nodes/NOD_node_declaration.hh b/source/blender/nodes/NOD_node_declaration.hh index 7fbe93a08b2..7f795988a27 100644 --- a/source/blender/nodes/NOD_node_declaration.hh +++ b/source/blender/nodes/NOD_node_declaration.hh @@ -303,7 +303,7 @@ class BaseSocketDeclarationBuilder { /** The input is evaluated on a subset of the geometry inputs. */ BaseSocketDeclarationBuilder &implicit_field_on(ImplicitInputValueFn fn, - const Span input_indices); + Span input_indices); /** For inputs that are evaluated or available on a subset of the geometry sockets. */ BaseSocketDeclarationBuilder &field_on(Span indices); diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h index 62499142c74..d25cf3577f7 100644 --- a/source/blender/nodes/NOD_static_types.h +++ b/source/blender/nodes/NOD_static_types.h @@ -336,6 +336,7 @@ DefNode(GeometryNode, GEO_NODE_IMAGE_TEXTURE, def_geo_image_texture, "IMAGE_TEXT DefNode(GeometryNode, GEO_NODE_INDEX_OF_NEAREST, 0, "INDEX_OF_NEAREST", IndexOfNearest, "Index of Nearest", "Find the nearest element in a group. Similar to the \"Sample Nearest\" node") DefNode(GeometryNode, GEO_NODE_INDEX_SWITCH, def_geo_index_switch, "INDEX_SWITCH", IndexSwitch, "Index Switch", "Choose between an arbitrary number of values with an index") DefNode(GeometryNode, GEO_NODE_IMAGE, def_geo_image, "IMAGE", InputImage, "Image", "Input image") +DefNode(GeometryNode, GEO_NODE_INPUT_ACTIVE_CAMERA, 0, "INPUT_ACTIVE_CAMERA", InputActiveCamera, "Active Camera", "Retrieve the scene's active camera") DefNode(GeometryNode, GEO_NODE_INPUT_CURVE_HANDLES, 0, "INPUT_CURVE_HANDLES", InputCurveHandlePositions, "Curve Handle Positions", "Retrieve the position of each Bézier control point's handles") DefNode(GeometryNode, GEO_NODE_INPUT_CURVE_TILT, 0, "INPUT_CURVE_TILT", InputCurveTilt, "Curve Tilt", "Retrieve the angle at each control point used to twist the curve's normal around its tangent") DefNode(GeometryNode, GEO_NODE_INPUT_ID, 0, "INPUT_ID", InputID, "ID", "Retrieve a stable random identifier value from the \"id\" attribute on the point domain, or the index if the attribute does not exist") @@ -434,7 +435,7 @@ DefNode(GeometryNode, GEO_NODE_SET_SHADE_SMOOTH, 0, "SET_SHADE_SMOOTH", SetShade DefNode(GeometryNode, GEO_NODE_SET_SPLINE_CYCLIC, 0, "SET_SPLINE_CYCLIC", SetSplineCyclic, "Set Spline Cyclic", "Control whether each spline loops back on itself by changing the \"cyclic\" attribute") DefNode(GeometryNode, GEO_NODE_SET_SPLINE_RESOLUTION, 0, "SET_SPLINE_RESOLUTION", SetSplineResolution, "Set Spline Resolution", "Control how many evaluated points should be generated on every curve segment") DefNode(GeometryNode, GEO_NODE_SIMULATION_INPUT, def_geo_simulation_input, "SIMULATION_INPUT", SimulationInput, "Simulation Input", "Input data for the simulation zone") -DefNode(GeometryNode, GEO_NODE_SIMULATION_OUTPUT, def_geo_simulation_output, "SIMULATION_OUTPUT", SimulationOutput, "Simulation Output", " Output data from the simulation zone") +DefNode(GeometryNode, GEO_NODE_SIMULATION_OUTPUT, def_geo_simulation_output, "SIMULATION_OUTPUT", SimulationOutput, "Simulation Output", "Output data from the simulation zone") DefNode(GeometryNode, GEO_NODE_SPLIT_TO_INSTANCES, 0, "Split to Instances", SplitToInstances, "Split to Instances", "Create separate geometries containing the elements from the same group") DefNode(GeometryNode, GEO_NODE_SPLIT_EDGES, 0, "SPLIT_EDGES", SplitEdges, "Split Edges", "Duplicate mesh edges and break connections with the surrounding faces") DefNode(GeometryNode, GEO_NODE_STORE_NAMED_ATTRIBUTE, 0, "STORE_NAMED_ATTRIBUTE", StoreNamedAttribute, "Store Named Attribute", "Store the result of a field on a geometry as an attribute with the specified name") diff --git a/source/blender/nodes/composite/CMakeLists.txt b/source/blender/nodes/composite/CMakeLists.txt index a57e6e7de84..78303b4cc40 100644 --- a/source/blender/nodes/composite/CMakeLists.txt +++ b/source/blender/nodes/composite/CMakeLists.txt @@ -59,6 +59,7 @@ set(SRC nodes/node_composite_double_edge_mask.cc nodes/node_composite_ellipsemask.cc nodes/node_composite_exposure.cc + nodes/node_composite_file_output.cc nodes/node_composite_filter.cc nodes/node_composite_flip.cc nodes/node_composite_gamma.cc @@ -85,7 +86,6 @@ set(SRC nodes/node_composite_moviedistortion.cc nodes/node_composite_normal.cc nodes/node_composite_normalize.cc - nodes/node_composite_output_file.cc nodes/node_composite_pixelate.cc nodes/node_composite_planetrackdeform.cc nodes/node_composite_posterize.cc diff --git a/source/blender/nodes/composite/node_composite_tree.cc b/source/blender/nodes/composite/node_composite_tree.cc index a48ba88c77c..022eafd75e3 100644 --- a/source/blender/nodes/composite/node_composite_tree.cc +++ b/source/blender/nodes/composite/node_composite_tree.cc @@ -179,12 +179,13 @@ void ntreeCompositExecTree(Render *render, RenderData *rd, bool rendering, int do_preview, - const char *view_name) + const char *view_name, + blender::realtime_compositor::RenderContext *render_context) { #ifdef WITH_COMPOSITOR_CPU - COM_execute(render, rd, scene, ntree, rendering, view_name); + COM_execute(render, rd, scene, ntree, rendering, view_name, render_context); #else - UNUSED_VARS(render, scene, ntree, rd, rendering, view_name); + UNUSED_VARS(render, scene, ntree, rd, rendering, view_name, render_context); #endif UNUSED_VARS(do_preview); diff --git a/source/blender/nodes/composite/nodes/node_composite_bokehimage.cc b/source/blender/nodes/composite/nodes/node_composite_bokehimage.cc index 8a48c669a7d..436c49f6c1e 100644 --- a/source/blender/nodes/composite/nodes/node_composite_bokehimage.cc +++ b/source/blender/nodes/composite/nodes/node_composite_bokehimage.cc @@ -14,6 +14,7 @@ #include "GPU_shader.h" +#include "COM_bokeh_kernel.hh" #include "COM_node_operation.hh" #include "COM_utilities.hh" @@ -64,46 +65,25 @@ class BokehImageOperation : public NodeOperation { void execute() override { - GPUShader *shader = context().get_shader("compositor_bokeh_image"); - GPU_shader_bind(shader); + const Domain domain = compute_domain(); - GPU_shader_uniform_1f(shader, "exterior_angle", get_exterior_angle()); - GPU_shader_uniform_1f(shader, "rotation", get_rotation()); - GPU_shader_uniform_1f(shader, "roundness", node_storage(bnode()).rounding); - GPU_shader_uniform_1f(shader, "catadioptric", node_storage(bnode()).catadioptric); - GPU_shader_uniform_1f(shader, "lens_shift", node_storage(bnode()).lensshift); + const BokehKernel &bokeh_kernel = context().cache_manager().bokeh_kernels.get( + context(), + domain.size, + node_storage(bnode()).flaps, + node_storage(bnode()).angle, + node_storage(bnode()).rounding, + node_storage(bnode()).catadioptric, + node_storage(bnode()).lensshift); Result &output = get_result("Image"); - const Domain domain = compute_domain(); - output.allocate_texture(domain); - output.bind_as_image(shader, "output_img"); - - compute_dispatch_threads_at_least(shader, domain.size); - - output.unbind_as_image(); - GPU_shader_unbind(); + output.wrap_external(bokeh_kernel.texture()); } Domain compute_domain() override { return Domain(int2(512)); } - - /* The exterior angle is the angle between each two consecutive vertices of the regular polygon - * from its center. */ - float get_exterior_angle() - { - return (M_PI * 2.0f) / node_storage(bnode()).flaps; - } - - float get_rotation() - { - /* Offset the rotation such that the second vertex of the regular polygon lies on the positive - * y axis, which is 90 degrees minus the angle that it makes with the positive x axis assuming - * the first vertex lies on the positive x axis. */ - const float offset = M_PI_2 - get_exterior_angle(); - return node_storage(bnode()).angle - offset; - } }; static NodeOperation *get_compositor_operation(Context &context, DNode node) diff --git a/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc b/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc index 8e6b933b170..9378336d078 100644 --- a/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc +++ b/source/blender/nodes/composite/nodes/node_composite_cryptomatte.cc @@ -6,15 +6,27 @@ * \ingroup cmpnodes */ +#include + #include "node_composite_util.hh" #include "BLI_assert.h" #include "BLI_dynstr.h" #include "BLI_hash_mm3.h" +#include "BLI_listbase.h" #include "BLI_math_vector.h" +#include "BLI_math_vector_types.hh" #include "BLI_string.h" #include "BLI_string_ref.hh" #include "BLI_utildefines.h" +#include "BLI_vector.hh" + +#include "IMB_imbuf_types.h" + +#include "GPU_shader.h" +#include "GPU_texture.h" + +#include "DNA_image_types.h" #include "BKE_context.hh" #include "BKE_cryptomatte.hh" @@ -29,6 +41,8 @@ #include "RE_pipeline.h" #include "COM_node_operation.hh" +#include "COM_result.hh" +#include "COM_utilities.hh" #include @@ -98,11 +112,11 @@ static blender::bke::cryptomatte::CryptomatteSessionPtr cryptomatte_init_from_no } switch (node.custom1) { - case CMP_CRYPTOMATTE_SRC_RENDER: { + case CMP_NODE_CRYPTOMATTE_SOURCE_RENDER: { return cryptomatte_init_from_node_render(node, use_meta_data); } - case CMP_CRYPTOMATTE_SRC_IMAGE: { + case CMP_NODE_CRYPTOMATTE_SOURCE_IMAGE: { return cryptomatte_init_from_node_image(scene, node); } } @@ -228,6 +242,8 @@ CryptomatteSession *ntreeCompositCryptomatteSession(const Scene *scene, bNode *n namespace blender::nodes::node_composite_cryptomatte_cc { +NODE_STORAGE_FUNCS(NodeCryptomatte) + static bNodeSocketTemplate cmp_node_cryptomatte_out[] = { {SOCK_RGBA, N_("Image")}, {SOCK_FLOAT, N_("Matte")}, @@ -237,7 +253,9 @@ static bNodeSocketTemplate cmp_node_cryptomatte_out[] = { static void cmp_node_cryptomatte_declare(NodeDeclarationBuilder &b) { - b.add_input("Image").default_value({0.0f, 0.0f, 0.0f, 1.0f}); + b.add_input("Image") + .default_value({0.0f, 0.0f, 0.0f, 1.0f}) + .compositor_domain_priority(0); b.add_output("Image"); b.add_output("Matte"); b.add_output("Pick"); @@ -318,10 +336,397 @@ class CryptoMatteOperation : public NodeOperation { void execute() override { - get_input("Image").pass_through(get_result("Image")); - get_result("Matte").allocate_invalid(); - get_result("Pick").allocate_invalid(); - context().set_info_message("Viewport compositor setup not fully supported"); + Vector layers = get_layers(); + if (layers.is_empty()) { + allocate_invalid(); + return; + } + + Result &output_pick = get_result("Pick"); + if (output_pick.should_compute()) { + compute_pick(layers); + } + + Result &matte_output = get_result("Matte"); + Result &image_output = get_result("Image"); + if (!matte_output.should_compute() && !image_output.should_compute()) { + return; + } + + Result matte = compute_matte(layers); + + if (image_output.should_compute()) { + compute_image(matte); + } + + if (matte_output.should_compute()) { + matte_output.steal_data(matte); + } + else { + matte.release(); + } + } + + void allocate_invalid() + { + Result &pick = get_result("Pick"); + if (pick.should_compute()) { + pick.allocate_invalid(); + } + + Result &matte = get_result("Matte"); + if (matte.should_compute()) { + matte.allocate_invalid(); + } + + Result &image = get_result("Image"); + if (image.should_compute()) { + image.allocate_invalid(); + } + } + + /* Computes the pick result, which is a special human-viewable image that the user can pick + * entities from using the Cryptomatte picker operator. See the shader for more information. */ + void compute_pick(Vector &layers) + { + /* See the comment below for why full precision is necessary. */ + GPUShader *shader = context().get_shader("compositor_cryptomatte_pick", ResultPrecision::Full); + GPU_shader_bind(shader); + + GPUTexture *first_layer = layers[0]; + const int input_unit = GPU_shader_get_sampler_binding(shader, "first_layer_tx"); + GPU_texture_bind(first_layer, input_unit); + + Result &output_pick = get_result("Pick"); + + /* Promote to full precision since it stores the identifiers of the first Cryptomatte rank, + * which is a 32-bit float. See the shader for more information. */ + output_pick.set_precision(ResultPrecision::Full); + + const Domain domain = compute_domain(); + output_pick.allocate_texture(domain); + output_pick.bind_as_image(shader, "output_img"); + + compute_dispatch_threads_at_least(shader, domain.size); + + GPU_shader_unbind(); + GPU_texture_unbind(first_layer); + output_pick.unbind_as_image(); + } + + /* Computes and returns the matte by accumulating the coverage of all entities whose identifiers + * are selected by the user, across all layers. See the shader for more information. */ + Result compute_matte(Vector &layers) + { + const Domain domain = compute_domain(); + Result output_matte = context().create_temporary_result(ResultType::Float); + output_matte.allocate_texture(domain); + + /* Clear the matte to zero to ready it to accumulate the coverage. */ + const float4 zero_color = float4(0.0f); + GPU_texture_clear(output_matte.texture(), GPU_DATA_FLOAT, zero_color); + + Vector identifiers = get_identifiers(); + /* The user haven't selected any entities, return the currently zero matte. */ + if (identifiers.is_empty()) { + return output_matte; + } + + GPUShader *shader = context().get_shader("compositor_cryptomatte_matte"); + GPU_shader_bind(shader); + + GPU_shader_uniform_1i(shader, "identifiers_count", identifiers.size()); + GPU_shader_uniform_1f_array(shader, "identifiers", identifiers.size(), identifiers.data()); + + for (GPUTexture *layer : layers) { + const int input_unit = GPU_shader_get_sampler_binding(shader, "layer_tx"); + GPU_texture_bind(layer, input_unit); + + /* Bind the matte with read access, since we will be accumulating in it. */ + output_matte.bind_as_image(shader, "matte_img", true); + + compute_dispatch_threads_at_least(shader, domain.size); + + GPU_texture_unbind(layer); + output_matte.unbind_as_image(); + } + + GPU_shader_unbind(); + + return output_matte; + } + + /* Computes the output image result by premultiplying the matte to the image. */ + void compute_image(Result &matte) + { + GPUShader *shader = context().get_shader("compositor_cryptomatte_image"); + GPU_shader_bind(shader); + + Result &input_image = get_input("Image"); + input_image.bind_as_texture(shader, "input_tx"); + + matte.bind_as_texture(shader, "matte_tx"); + + const Domain domain = compute_domain(); + Result &image_output = get_result("Image"); + image_output.allocate_texture(domain); + image_output.bind_as_image(shader, "output_img"); + + compute_dispatch_threads_at_least(shader, domain.size); + + GPU_shader_unbind(); + input_image.unbind_as_texture(); + matte.unbind_as_texture(); + image_output.unbind_as_image(); + } + + /* Returns all the relevant Cryptomatte layers from the selected source. */ + Vector get_layers() + { + switch (get_source()) { + case CMP_NODE_CRYPTOMATTE_SOURCE_RENDER: + return get_layers_from_render(); + case CMP_NODE_CRYPTOMATTE_SOURCE_IMAGE: + return get_layers_from_image(); + } + + BLI_assert_unreachable(); + return Vector(); + } + + /* Returns all the relevant Cryptomatte layers from the selected render. */ + Vector get_layers_from_render() + { + Vector layers; + + Scene *scene = get_scene(); + if (!scene) { + return layers; + } + + Render *render = RE_GetSceneRender(scene); + if (!render) { + return layers; + } + + RenderResult *render_result = RE_AcquireResultRead(render); + if (!render_result) { + RE_ReleaseResult(render); + return layers; + } + + int view_layer_index; + const std::string type_name = get_type_name(); + LISTBASE_FOREACH_INDEX (ViewLayer *, view_layer, &scene->view_layers, view_layer_index) { + RenderLayer *render_layer = RE_GetRenderLayer(render_result, view_layer->name); + if (!render_layer) { + continue; + } + + LISTBASE_FOREACH (RenderPass *, render_pass, &render_layer->passes) { + /* We are only interested in passes of the current view. Except if the current view is + * unnamed, that is, in the case of mono rendering, in which case we just return the first + * view. */ + if (!context().get_view_name().is_empty() && + context().get_view_name() != render_pass->view) { + continue; + } + + /* If the combined pass name doesn't start with the Cryptomatte type name, then it is not a + * Cryptomatte layer. */ + const std::string combined_name = get_combined_layer_pass_name(render_layer, render_pass); + if (combined_name == type_name || !StringRef(combined_name).startswith(type_name)) { + continue; + } + + GPUTexture *pass_texture = context().get_input_texture( + scene, view_layer_index, render_pass->name); + layers.append(pass_texture); + } + + if (!layers.is_empty()) { + break; + } + } + + RE_ReleaseResult(render); + + return layers; + } + + /* Returns all the relevant Cryptomatte layers from the selected EXR image. */ + Vector get_layers_from_image() + { + Vector layers; + + Image *image = get_image(); + if (!image || image->type != IMA_TYPE_MULTILAYER) { + return layers; + } + + /* The render result structure of the image is populated as a side effect of the acquisition of + * an image buffer, so acquire an image buffer and immediately release it since it is not + * actually needed. */ + ImageUser image_user_for_layer = *get_image_user(); + ImBuf *image_buffer = BKE_image_acquire_ibuf(image, &image_user_for_layer, nullptr); + BKE_image_release_ibuf(image, image_buffer, nullptr); + if (!image_buffer || !image->rr) { + return layers; + } + + int layer_index; + const std::string type_name = get_type_name(); + LISTBASE_FOREACH_INDEX (RenderLayer *, render_layer, &image->rr->layers, layer_index) { + /* If the layer name doesn't start with the Cryptomatte type name, then it is not a + * Cryptomatte layer. Unless it is an unnamed layer, in which case, we need to check its + * passes. */ + const bool is_unnamed_layer = render_layer->name[0] == '\0'; + if (!is_unnamed_layer && !StringRefNull(render_layer->name).startswith(type_name)) { + continue; + } + + image_user_for_layer.layer = layer_index; + LISTBASE_FOREACH (RenderPass *, render_pass, &render_layer->passes) { + /* If the combined pass name doesn't start with the Cryptomatte type name, then it is not a + * Cryptomatte layer. */ + const std::string combined_name = get_combined_layer_pass_name(render_layer, render_pass); + if (combined_name == type_name || !StringRef(combined_name).startswith(type_name)) { + continue; + } + + GPUTexture *pass_texture = context().cache_manager().cached_images.get( + context(), image, &image_user_for_layer, render_pass->name); + layers.append(pass_texture); + } + + /* If we already found Cryptomatte layers, no need to check other render layers. */ + if (!layers.is_empty()) { + return layers; + } + } + + return layers; + } + + /* Returns the combined name of the render layer and pass using the EXR convention of a period + * separator. */ + std::string get_combined_layer_pass_name(RenderLayer *render_layer, RenderPass *render_pass) + { + if (render_layer->name[0] == '\0') { + return std::string(render_pass->name); + } + return std::string(render_layer->name) + "." + std::string(render_pass->name); + } + + /* Get the selected type name of the Cryptomatte from the metadata of the image/render. This type + * name will be used to identify the corresponding layers in the source image/render. See the + * "EXR File: Layer Naming" section of the Cryptomatte specification for more information on what + * this represents. */ + std::string get_type_name() + { + char type_name[MAX_NAME]; + ntreeCompositCryptomatteLayerPrefix( + &context().get_scene(), &bnode(), type_name, sizeof(type_name)); + return std::string(type_name); + } + + /* Get the identifiers of the entities selected by the user to generate a matte from. The + * identifiers are hashes of the names of the entities encoded in floats. See the "ID Generation" + * section of the Cryptomatte specification for more information. */ + Vector get_identifiers() + { + Vector identifiers; + LISTBASE_FOREACH (CryptomatteEntry *, cryptomatte_entry, &node_storage(bnode()).entries) { + identifiers.append(cryptomatte_entry->encoded_hash); + } + return identifiers; + } + + /* The domain should be centered with the same size as the source. In case of invalid source, + * fallback to the domain inferred from the input. */ + Domain compute_domain() override + { + switch (get_source()) { + case CMP_NODE_CRYPTOMATTE_SOURCE_RENDER: + return Domain(context().get_render_size()); + case CMP_NODE_CRYPTOMATTE_SOURCE_IMAGE: + return compute_image_domain(); + } + + BLI_assert_unreachable(); + return Domain::identity(); + } + + /* In case of a render source, the domain should be centered with the same size as the render. In + * case of an invalid render, fallback to the domain inferred from the input. */ + Domain compute_render_domain() + { + BLI_assert(get_source() == CMP_NODE_CRYPTOMATTE_SOURCE_RENDER); + + Scene *scene = get_scene(); + if (!scene) { + return NodeOperation::compute_domain(); + } + + Render *render = RE_GetSceneRender(scene); + if (!render) { + return NodeOperation::compute_domain(); + } + + RenderResult *render_result = RE_AcquireResultRead(render); + if (!render_result) { + RE_ReleaseResult(render); + return NodeOperation::compute_domain(); + } + + const int2 render_size = int2(render_result->rectx, render_result->rectx); + RE_ReleaseResult(render); + return Domain(render_size); + } + + /* In case of an image source, the domain should be centered with the same size as the source + * image. In case of an invalid image, fallback to the domain inferred from the input. */ + Domain compute_image_domain() + { + BLI_assert(get_source() == CMP_NODE_CRYPTOMATTE_SOURCE_IMAGE); + + Image *image = get_image(); + if (!image) { + return NodeOperation::compute_domain(); + } + + ImageUser image_user = *get_image_user(); + ImBuf *image_buffer = BKE_image_acquire_ibuf(image, &image_user, nullptr); + if (!image_buffer) { + return NodeOperation::compute_domain(); + } + + const int2 image_size = int2(image_buffer->x, image_buffer->y); + BKE_image_release_ibuf(image, image_buffer, nullptr); + return Domain(image_size); + } + + const ImageUser *get_image_user() + { + BLI_assert(get_source() == CMP_NODE_CRYPTOMATTE_SOURCE_IMAGE); + return &node_storage(bnode()).iuser; + } + + Scene *get_scene() + { + BLI_assert(get_source() == CMP_NODE_CRYPTOMATTE_SOURCE_RENDER); + return reinterpret_cast(bnode().id); + } + + Image *get_image() + { + BLI_assert(get_source() == CMP_NODE_CRYPTOMATTE_SOURCE_IMAGE); + return reinterpret_cast(bnode().id); + } + + CMPNodeCryptomatteSource get_source() + { + return static_cast(bnode().custom1); } }; @@ -347,8 +752,6 @@ void register_node_type_cmp_cryptomatte() node_type_storage( &ntype, "NodeCryptomatte", file_ns::node_free_cryptomatte, file_ns::node_copy_cryptomatte); ntype.get_compositor_operation = file_ns::get_compositor_operation; - ntype.realtime_compositor_unsupported_message = N_( - "Node not supported in the Viewport compositor"); nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_output_file.cc b/source/blender/nodes/composite/nodes/node_composite_file_output.cc similarity index 57% rename from source/blender/nodes/composite/nodes/node_composite_output_file.cc rename to source/blender/nodes/composite/nodes/node_composite_file_output.cc index c1ba20f32a8..9398e8eda14 100644 --- a/source/blender/nodes/composite/nodes/node_composite_output_file.cc +++ b/source/blender/nodes/composite/nodes/node_composite_file_output.cc @@ -8,13 +8,26 @@ #include +#include "BLI_assert.h" +#include "BLI_fileops.h" +#include "BLI_index_range.hh" +#include "BLI_path_util.h" #include "BLI_string.h" #include "BLI_string_utf8.h" #include "BLI_string_utils.hh" +#include "BLI_task.hh" #include "BLI_utildefines.h" +#include "MEM_guardedalloc.h" + +#include "DNA_node_types.h" +#include "DNA_scene_types.h" + #include "BKE_context.hh" +#include "BKE_image.h" #include "BKE_image_format.h" +#include "BKE_main.hh" +#include "BKE_scene.h" #include "RNA_access.hh" #include "RNA_prototypes.h" @@ -24,8 +37,14 @@ #include "WM_api.hh" +#include "IMB_colormanagement.h" +#include "IMB_imbuf.h" +#include "IMB_imbuf_types.h" #include "IMB_openexr.h" +#include "GPU_state.h" +#include "GPU_texture.h" + #include "COM_node_operation.hh" #include "node_composite_util.hh" @@ -187,7 +206,9 @@ void ntreeCompositOutputFileSetLayer(bNode *node, bNodeSocket *sock, const char ntreeCompositOutputFileUniqueLayer(&node->inputs, sock, name, '_'); } -namespace blender::nodes::node_composite_output_file_cc { +namespace blender::nodes::node_composite_file_output_cc { + +NODE_STORAGE_FUNCS(NodeImageMultiFile) /* XXX uses initfunc_api callback, regular initfunc does not support context yet */ static void init_output_file(const bContext *C, PointerRNA *ptr) @@ -443,28 +464,291 @@ static void node_composit_buts_file_output_ex(uiLayout *layout, bContext *C, Poi using namespace blender::realtime_compositor; -class OutputFileOperation : public NodeOperation { +class FileOutputOperation : public NodeOperation { public: using NodeOperation::NodeOperation; void execute() override { - if (context().use_file_output()) { - context().set_info_message("Viewport compositor setup not fully supported"); + if (is_multi_layer()) { + execute_multi_layer(); } + else { + execute_single_layer(); + } + } + + /* -------------------- + * Single Layer Images. + */ + + void execute_single_layer() + { + const int2 size = compute_domain().size; + for (const bNodeSocket *input : this->node()->input_sockets()) { + const Result &result = get_input(input->identifier); + /* We only write images, not single values. */ + if (result.is_single_value()) { + continue; + } + + char base_path[FILE_MAX]; + const auto &socket = *static_cast(input->storage); + get_single_layer_image_base_path(socket.path, base_path); + + /* The image saving code expects EXR images to have a different structure than standard + * images. In particular, in EXR images, the buffers need to be stored in passes that are, in + * turn, stored in a render layer. On the other hand, in non-EXR images, the buffers need to + * be stored in views. An exception to this is stereo images, which needs to have the same + * structure as non-EXR images. */ + const auto &format = socket.use_node_format ? node_storage(bnode()).format : socket.format; + const bool is_exr = format.imtype == R_IMF_IMTYPE_OPENEXR; + const int views_count = BKE_scene_multiview_num_views_get(&context().get_render_data()); + if (is_exr && !(format.views_format == R_IMF_VIEWS_STEREO_3D && views_count == 2)) { + execute_single_layer_multi_view_exr(result, format, base_path); + continue; + } + + char image_path[FILE_MAX]; + get_single_layer_image_path(base_path, format, image_path); + + FileOutput &file_output = context().render_context()->get_file_output( + image_path, format, size, socket.save_as_render); + + add_view_for_result(file_output, result, context().get_view_name().data()); + } + } + + /* ----------------------------------- + * Single Layer Multi-View EXR Images. + */ + + void execute_single_layer_multi_view_exr(const Result &result, + const ImageFormatData &format, + const char *base_path) + { + const bool has_views = format.views_format != R_IMF_VIEWS_INDIVIDUAL; + + /* The EXR stores all views in the same file, so we supply an empty view to make sure the file + * name does not contain a view suffix. */ + char image_path[FILE_MAX]; + const char *path_view = has_views ? "" : context().get_view_name().data(); + get_multi_layer_exr_image_path(base_path, path_view, image_path); + + const int2 size = compute_domain().size; + FileOutput &file_output = context().render_context()->get_file_output( + image_path, format, size, false); + + /* The EXR stores all views in the same file, so we add the actual render view. Otherwise, we + * add a default unnamed view. */ + const char *view_name = has_views ? context().get_view_name().data() : ""; + file_output.add_view(view_name); + add_pass_for_result(file_output, result, "", view_name); + } + + /* ----------------------- + * Multi-Layer EXR Images. + */ + + void execute_multi_layer() + { + const bool store_views_in_single_file = is_multi_view_exr(); + const char *view = context().get_view_name().data(); + + /* If we are saving all views in a single multi-layer file, we supply an empty view to make + * sure the file name does not contain a view suffix. */ + char image_path[FILE_MAX]; + const char *write_view = store_views_in_single_file ? "" : view; + get_multi_layer_exr_image_path(get_base_path(), write_view, image_path); + + const int2 size = compute_domain().size; + const ImageFormatData format = node_storage(bnode()).format; + FileOutput &file_output = context().render_context()->get_file_output( + image_path, format, size, false); + + /* If we are saving views in separate files, we needn't store the view in the channel names, so + * we add an unnamed view. */ + const char *pass_view = store_views_in_single_file ? view : ""; + file_output.add_view(pass_view); + + for (const bNodeSocket *input : this->node()->input_sockets()) { + const Result &input_result = get_input(input->identifier); + /* We only write images, not single values. */ + if (input_result.is_single_value()) { + continue; + } + + const char *pass_name = (static_cast(input->storage))->layer; + add_pass_for_result(file_output, input_result, pass_name, pass_view); + } + } + + /* Read the data stored in the GPU texture of the given result and add a pass of the given name, + * view, and read buffer. The pass channel identifiers follows the EXR conventions. */ + void add_pass_for_result(FileOutput &file_output, + const Result &result, + const char *pass_name, + const char *view_name) + { + /* The image buffer in the file output will take ownership of this buffer and freeing it will + * be its responsibility. */ + GPU_memory_barrier(GPU_BARRIER_TEXTURE_UPDATE); + float *buffer = static_cast(GPU_texture_read(result.texture(), GPU_DATA_FLOAT, 0)); + + const int2 size = result.domain().size; + switch (result.type()) { + case ResultType::Color: + file_output.add_pass(pass_name, view_name, "RGBA", buffer); + break; + case ResultType::Vector: + file_output.add_pass(pass_name, view_name, "XYZ", float4_to_float3_image(size, buffer)); + break; + case ResultType::Float: + file_output.add_pass(pass_name, view_name, "V", buffer); + break; + default: + /* Other types are internal and needn't be handled by operations. */ + BLI_assert_unreachable(); + break; + } + } + + /* Read the data stored in the GPU texture of the given result and add a view of the given name + * and read buffer. */ + void add_view_for_result(FileOutput &file_output, const Result &result, const char *view_name) + { + /* The image buffer in the file output will take ownership of this buffer and freeing it will + * be its responsibility. */ + GPU_memory_barrier(GPU_BARRIER_TEXTURE_UPDATE); + float *buffer = static_cast(GPU_texture_read(result.texture(), GPU_DATA_FLOAT, 0)); + + const int2 size = result.domain().size; + switch (result.type()) { + case ResultType::Color: + file_output.add_view(view_name, 4, buffer); + break; + case ResultType::Vector: + file_output.add_view(view_name, 3, float4_to_float3_image(size, buffer)); + break; + case ResultType::Float: + file_output.add_view(view_name, 1, buffer); + break; + default: + /* Other types are internal and needn't be handled by operations. */ + BLI_assert_unreachable(); + break; + } + } + + /* Given a float4 image, return a newly allocated float3 image that ignores the last channel. The + * input image is freed. */ + float *float4_to_float3_image(int2 size, float *float4_image) + { + float *float3_image = static_cast(MEM_malloc_arrayN( + size_t(size.x) * size.y, sizeof(float[3]), "File Output Vector Buffer.")); + + threading::parallel_for(IndexRange(size.y), 1, [&](const IndexRange sub_y_range) { + for (const int64_t y : sub_y_range) { + for (const int64_t x : IndexRange(size.x)) { + for (int i = 0; i < 3; i++) { + const int pixel_index = y * size.x + x; + float3_image[pixel_index * 3 + i] = float4_image[pixel_index * 4 + i]; + } + } + } + }); + + MEM_freeN(float4_image); + return float3_image; + } + + /* Get the base path of the image to be saved, based on the base path of the node. The base name + * is an optional initial name of the image, which will later be concatenated with other + * information like the frame number, view, and extension. If the base name is empty, then the + * base path represents a directory, so a trailing slash is ensured. */ + void get_single_layer_image_base_path(const char *base_name, char *base_path) + { + if (base_name[0]) { + BLI_path_join(base_path, FILE_MAX, get_base_path(), base_name); + } + else { + BLI_strncpy(base_path, get_base_path(), FILE_MAX); + BLI_path_slash_ensure(base_path, FILE_MAX); + } + } + + /* Get the path of the image to be saved based on the given format. */ + void get_single_layer_image_path(const char *base_path, + const ImageFormatData &format, + char *image_path) + { + BKE_image_path_from_imformat(image_path, + base_path, + BKE_main_blendfile_path_from_global(), + context().get_frame_number(), + &format, + use_file_extension(), + true, + nullptr); + } + + /* Get the path of the EXR image to be saved. If the given view is not empty, its corresponding + * file suffix will be appended to the name. */ + void get_multi_layer_exr_image_path(const char *base_path, const char *view, char *image_path) + { + const char *suffix = BKE_scene_multiview_view_suffix_get(&context().get_render_data(), view); + BKE_image_path_from_imtype(image_path, + base_path, + BKE_main_blendfile_path_from_global(), + context().get_frame_number(), + R_IMF_IMTYPE_MULTILAYER, + use_file_extension(), + true, + suffix); + } + + bool is_multi_layer() + { + return node_storage(bnode()).format.imtype == R_IMF_IMTYPE_MULTILAYER; + } + + const char *get_base_path() + { + return node_storage(bnode()).base_path; + } + + /* Add the file format extensions to the rendered file name. */ + bool use_file_extension() + { + return context().get_render_data().scemode & R_EXTENSION; + } + + /* If true, save views in a multi-view EXR file, otherwise, save each view in its own file. */ + bool is_multi_view_exr() + { + if (!is_multi_view_scene()) { + return false; + } + + return node_storage(bnode()).format.views_format == R_IMF_VIEWS_MULTIVIEW; + } + + bool is_multi_view_scene() + { + return context().get_render_data().scemode & R_MULTIVIEW; } }; static NodeOperation *get_compositor_operation(Context &context, DNode node) { - return new OutputFileOperation(context, node); + return new FileOutputOperation(context, node); } -} // namespace blender::nodes::node_composite_output_file_cc +} // namespace blender::nodes::node_composite_file_output_cc void register_node_type_cmp_output_file() { - namespace file_ns = blender::nodes::node_composite_output_file_cc; + namespace file_ns = blender::nodes::node_composite_file_output_cc; static bNodeType ntype; @@ -477,8 +761,6 @@ void register_node_type_cmp_output_file() &ntype, "NodeImageMultiFile", file_ns::free_output_file, file_ns::copy_output_file); ntype.updatefunc = file_ns::update_output_file; ntype.get_compositor_operation = file_ns::get_compositor_operation; - ntype.realtime_compositor_unsupported_message = N_( - "Node not supported in the Viewport compositor"); nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/composite/nodes/node_composite_image.cc b/source/blender/nodes/composite/nodes/node_composite_image.cc index 6a44c94bbaf..9a2bbabbda5 100644 --- a/source/blender/nodes/composite/nodes/node_composite_image.cc +++ b/source/blender/nodes/composite/nodes/node_composite_image.cc @@ -41,7 +41,7 @@ #include "COM_node_operation.hh" #include "COM_utilities.hh" -/* **************** IMAGE (and RenderResult, multilayer image) ******************** */ +/* **************** IMAGE (and RenderResult, multi-layer image) ******************** */ static bNodeSocketTemplate cmp_node_rlayers_out[] = { {SOCK_RGBA, N_("Image"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, @@ -336,7 +336,7 @@ static void cmp_node_rlayer_create_outputs(bNodeTree *ntree, } /* XXX make this into a generic socket verification function for dynamic socket replacement - * (multilayer, groups, static templates) */ + * (multi-layer, groups, static templates). */ static void cmp_node_image_verify_outputs(bNodeTree *ntree, bNode *node, bool rlayer) { bNodeSocket *sock, *sock_next; @@ -445,88 +445,45 @@ class ImageOperation : public NodeOperation { void execute() override { - if (!is_valid()) { - allocate_invalid(); - return; - } - - update_image_frame_number(); - for (const bNodeSocket *output : this->node()->output_sockets()) { compute_output(output->identifier); } } - /* Returns true if the node results can be computed, otherwise, returns false. */ - bool is_valid() - { - Image *image = get_image(); - ImageUser *image_user = get_image_user(); - if (!image || !image_user) { - return false; - } - - if (BKE_image_is_multilayer(image)) { - if (!image->rr) { - return false; - } - - RenderLayer *render_layer = get_render_layer(); - if (!render_layer) { - return false; - } - } - - return true; - } - - /* Allocate all needed outputs as invalid. This should be called when is_valid returns false. */ - void allocate_invalid() - { - for (const bNodeSocket *output : this->node()->output_sockets()) { - if (!should_compute_output(output->identifier)) { - continue; - } - - Result &result = get_result(output->identifier); - result.allocate_invalid(); - } - } - - /* Compute the effective frame number of the image if it was animated and invalidate the cached - * GPU texture if the computed frame number is different. */ - void update_image_frame_number() - { - BKE_image_user_frame_calc(get_image(), get_image_user(), context().get_frame_number()); - } - void compute_output(StringRef identifier) { if (!should_compute_output(identifier)) { return; } - ImageUser image_user = compute_image_user_for_output(identifier); - BKE_image_ensure_gpu_texture(get_image(), &image_user); - GPUTexture *image_texture = BKE_image_get_gpu_texture(get_image(), &image_user, nullptr); + GPUTexture *image_texture = context().cache_manager().cached_images.get( + context(), get_image(), get_image_user(), get_pass_name(identifier)); - const int2 size = int2(GPU_texture_width(image_texture), GPU_texture_height(image_texture)); Result &result = get_result(identifier); - result.allocate_texture(Domain(size)); - - GPUShader *shader = context().get_shader(get_shader_name(identifier)); - GPU_shader_bind(shader); - - const int2 lower_bound = int2(0); - GPU_shader_uniform_2iv(shader, "lower_bound", lower_bound); - - if (result.type() == ResultType::Color) { - GPU_shader_uniform_1b(shader, "premultiply_alpha", should_premultiply_alpha(image_user)); + if (!image_texture) { + result.allocate_invalid(); + return; } + const ResultPrecision precision = Result::precision(GPU_texture_format(image_texture)); + + /* Alpha is mot an actual pass, but one that is extracted from the combined pass. So we need to + * extract it using a shader. */ + if (identifier != "Alpha") { + result.set_precision(precision); + result.wrap_external(image_texture); + return; + } + + GPUShader *shader = context().get_shader("compositor_convert_color_to_alpha", precision); + GPU_shader_bind(shader); + const int input_unit = GPU_shader_get_sampler_binding(shader, "input_tx"); GPU_texture_bind(image_texture, input_unit); + const int2 size = int2(GPU_texture_width(image_texture), GPU_texture_height(image_texture)); + result.allocate_texture(Domain(size)); + result.bind_as_image(shader, "output_img"); compute_dispatch_threads_at_least(shader, size); @@ -536,139 +493,21 @@ class ImageOperation : public NodeOperation { result.unbind_as_image(); } - /* Get a copy of the image user that is appropriate to retrieve the image buffer for the output - * with the given identifier. This essentially sets the appropriate pass and view indices that - * corresponds to the output. */ - ImageUser compute_image_user_for_output(StringRef identifier) - { - ImageUser image_user = *get_image_user(); - - /* Set the needed view. */ - image_user.view = get_view_index(); - - /* Set the needed pass. */ - if (BKE_image_is_multilayer(get_image())) { - image_user.pass = get_pass_index(get_pass_name(identifier)); - BKE_image_multilayer_index(get_image()->rr, &image_user); - } - else { - BKE_image_multiview_index(get_image(), &image_user); - } - - return image_user; - } - - /* Get the shader that should be used to compute the output with the given identifier. The - * shaders just copy the retrieved image textures into the results except for the alpha output, - * which extracts the alpha and writes it to the result instead. Note that a call to a host - * texture copy doesn't work because results are stored in a different half float formats. */ - const char *get_shader_name(StringRef identifier) - { - if (identifier == "Alpha") { - return "compositor_read_input_alpha"; - } - else if (get_result(identifier).type() == ResultType::Color) { - return "compositor_read_input_color"; - } - else { - return "compositor_read_input_float"; - } - } - - /* Compositor image inputs are expected to be always pre-multiplied, so identify if the GPU - * texture returned by the image module is straight and needs to be pre-multiplied. An exception - * is when the image has an alpha mode of channel packed or alpha ignore, in which case, we - * always ignore pre-multiplication. */ - bool should_premultiply_alpha(ImageUser &image_user) - { - Image *image = get_image(); - if (ELEM(image->alpha_mode, IMA_ALPHA_CHANNEL_PACKED, IMA_ALPHA_IGNORE)) { - return false; - } - - ImBuf *image_buffer = BKE_image_acquire_ibuf(image, &image_user, nullptr); - if (!image_buffer) { - return false; - } - - const bool has_premultiplied_alpha = BKE_image_has_gpu_texture_premultiplied_alpha( - image, image_buffer); - BKE_image_release_ibuf(image, image_buffer, nullptr); - - return !has_premultiplied_alpha; - } - - Image *get_image() - { - return (Image *)bnode().id; - } - - ImageUser *get_image_user() - { - return static_cast(bnode().storage); - } - - /* Get the render layer selected in the node assuming the image is a multilayer image. */ - RenderLayer *get_render_layer() - { - const ListBase *layers = &get_image()->rr->layers; - return static_cast(BLI_findlink(layers, get_image_user()->layer)); - } - - /* Get the name of the pass corresponding to the output with the given identifier assuming the - * image is a multilayer image. */ + /* Get the name of the pass corresponding to the output with the given identifier. */ const char *get_pass_name(StringRef identifier) { DOutputSocket output = node().output_by_identifier(identifier); return static_cast(output->storage)->pass_name; } - /* Get the index of the pass with the given name in the selected render layer's passes list - * assuming the image is a multilayer image. */ - int get_pass_index(const char *name) + Image *get_image() { - return BLI_findstringindex(&get_render_layer()->passes, name, offsetof(RenderPass, name)); + return reinterpret_cast(bnode().id); } - /* Get the index of the view selected in the node. If the image is not a multi-view image or only - * has a single view, then zero is returned. Otherwise, if the image is a multi-view image, the - * index of the selected view is returned. However, note that the value of the view member of the - * image user is not the actual index of the view. More specifically, the index 0 is reserved to - * denote the special mode of operation "All", which dynamically selects the view whose name - * matches the view currently being rendered. It follows that the views are then indexed starting - * from 1. So for non zero view values, the actual index of the view is the value of the view - * member of the image user minus 1. */ - int get_view_index() + ImageUser *get_image_user() { - /* The image is not a multi-view image, so just return zero. */ - if (!BKE_image_is_multiview(get_image())) { - return 0; - } - - const ListBase *views = &get_image()->rr->views; - /* There is only one view and its index is 0. */ - if (BLI_listbase_count_at_most(views, 2) < 2) { - return 0; - } - - const int view = get_image_user()->view; - /* The view is not zero, which means it is manually specified and the actual index is then the - * view value minus 1. */ - if (view != 0) { - return view - 1; - } - - /* Otherwise, the view value is zero, denoting the special mode of operation "All", which finds - * the index of the view whose name matches the view currently being rendered. */ - const char *view_name = context().get_view_name().data(); - const int matched_view = BLI_findstringindex(views, view_name, offsetof(RenderView, name)); - - /* No view matches the view currently being rendered, so fallback to the first view. */ - if (matched_view == -1) { - return 0; - } - - return matched_view; + return static_cast(bnode().storage); } }; diff --git a/source/blender/nodes/function/nodes/node_fn_slice_string.cc b/source/blender/nodes/function/nodes/node_fn_slice_string.cc index 04e216bba52..6581deabf48 100644 --- a/source/blender/nodes/function/nodes/node_fn_slice_string.cc +++ b/source/blender/nodes/function/nodes/node_fn_slice_string.cc @@ -20,11 +20,9 @@ static void node_build_multi_function(NodeMultiFunctionBuilder &builder) { static auto slice_fn = mf::build::SI3_SO( "Slice", [](const std::string &str, int a, int b) { - const int len = BLI_strlen_utf8(str.c_str()); - const int start = BLI_str_utf8_offset_from_index( - str.c_str(), str.size(), std::clamp(a, 0, len)); + const int start = BLI_str_utf8_offset_from_index(str.c_str(), str.size(), std::max(0, a)); const int end = BLI_str_utf8_offset_from_index( - str.c_str(), str.size(), std::clamp(a + b, 0, len)); + str.c_str(), str.size(), std::max(0, a + b)); return str.substr(start, std::max(end - start, 0)); }); builder.set_matching_fn(&slice_fn); diff --git a/source/blender/nodes/geometry/CMakeLists.txt b/source/blender/nodes/geometry/CMakeLists.txt index 259e588c17b..83f9eefe4e5 100644 --- a/source/blender/nodes/geometry/CMakeLists.txt +++ b/source/blender/nodes/geometry/CMakeLists.txt @@ -82,6 +82,7 @@ set(SRC nodes/node_geo_image_texture.cc nodes/node_geo_index_of_nearest.cc nodes/node_geo_index_switch.cc + nodes/node_geo_input_active_camera.cc nodes/node_geo_input_curve_handles.cc nodes/node_geo_input_curve_tilt.cc nodes/node_geo_input_edge_smooth.cc diff --git a/source/blender/nodes/geometry/node_geometry_util.hh b/source/blender/nodes/geometry/node_geometry_util.hh index f035b207632..91228974b01 100644 --- a/source/blender/nodes/geometry/node_geometry_util.hh +++ b/source/blender/nodes/geometry/node_geometry_util.hh @@ -37,10 +37,7 @@ namespace blender::nodes { bool check_tool_context_and_error(GeoNodeExecParams ¶ms); void search_link_ops_for_tool_node(GatherLinkSearchOpParams ¶ms); -void transform_mesh(Mesh &mesh, - const float3 translation, - const math::Quaternion rotation, - const float3 scale); +void transform_mesh(Mesh &mesh, float3 translation, math::Quaternion rotation, float3 scale); void transform_geometry_set(GeoNodeExecParams ¶ms, GeometrySet &geometry, @@ -62,9 +59,9 @@ void separate_geometry(GeometrySet &geometry_set, void get_closest_in_bvhtree(BVHTreeFromMesh &tree_data, const VArray &positions, const IndexMask &mask, - const MutableSpan r_indices, - const MutableSpan r_distances_sq, - const MutableSpan r_positions); + MutableSpan r_indices, + MutableSpan r_distances_sq, + MutableSpan r_positions); int apply_offset_in_cyclic_range(IndexRange range, int start_index, int offset); @@ -101,14 +98,14 @@ const CPPType &get_simulation_item_cpp_type(eNodeSocketDatatype socket_type); const CPPType &get_simulation_item_cpp_type(const NodeSimulationItem &item); bke::bake::BakeState move_values_to_simulation_state( - const Span node_simulation_items, const Span input_values); -void move_simulation_state_to_values(const Span node_simulation_items, + Span node_simulation_items, Span input_values); +void move_simulation_state_to_values(Span node_simulation_items, bke::bake::BakeState zone_state, const Object &self_object, const ComputeContext &compute_context, const bNode &sim_output_node, Span r_output_values); -void copy_simulation_state_to_values(const Span node_simulation_items, +void copy_simulation_state_to_values(Span node_simulation_items, const bke::bake::BakeStateRef &zone_state, const Object &self_object, const ComputeContext &compute_context, @@ -120,7 +117,7 @@ void copy_with_checked_indices(const GVArray &src, const IndexMask &mask, GMutableSpan dst); -void mix_baked_data_item(const eNodeSocketDatatype socket_type, +void mix_baked_data_item(eNodeSocketDatatype socket_type, void *prev, const void *next, const float factor); diff --git a/source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc b/source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc index f20f19457cb..8fdb32e5325 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc @@ -49,7 +49,7 @@ static Mesh *hull_from_bullet(const Mesh *mesh, Span coords) result = BKE_mesh_new_nomain(verts_num, edges_num, faces_num, loops_num); BKE_id_material_eval_ensure_default_slot(&result->id); } - BKE_mesh_smooth_flag_set(result, false); + bke::mesh_smooth_set(*result, false); /* Copy vertices. */ MutableSpan dst_positions = result->vert_positions_for_write(); diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc index 6bb100bd017..ddf80ae9611 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_curve_fill.cc @@ -3,7 +3,7 @@ * SPDX-License-Identifier: GPL-2.0-or-later */ #include "BLI_array.hh" -#include "BLI_delaunay_2d.h" +#include "BLI_delaunay_2d.hh" #include "BLI_math_vector_types.hh" #include "DNA_mesh_types.h" @@ -52,32 +52,39 @@ static void node_init(bNodeTree * /*tree*/, bNode *node) node->storage = data; } +static void fill_curve_vert_indices(const OffsetIndices offsets, + MutableSpan> faces) +{ + threading::parallel_for(faces.index_range(), 1024, [&](const IndexRange range) { + for (const int i : range) { + faces[i].resize(offsets[i].size()); + array_utils::fill_index_range(faces[i], offsets[i].start()); + } + }); +} + static meshintersect::CDT_result do_cdt(const bke::CurvesGeometry &curves, const CDT_output_type output_type) { const OffsetIndices points_by_curve = curves.evaluated_points_by_curve(); const Span positions = curves.evaluated_positions(); + Array positions_2d(positions.size()); + threading::parallel_for(positions.index_range(), 2048, [&](const IndexRange range) { + for (const int i : range) { + positions_2d[i] = double2(positions[i].x, positions[i].y); + } + }); + + Array> faces(curves.curves_num()); + fill_curve_vert_indices(points_by_curve, faces); + meshintersect::CDT_input input; input.need_ids = false; - input.vert.reinitialize(points_by_curve.total_size()); - input.face.reinitialize(curves.curves_num()); + input.vert = std::move(positions_2d); + input.face = std::move(faces); - for (const int i_curve : curves.curves_range()) { - const IndexRange points = points_by_curve[i_curve]; - - for (const int i : points) { - input.vert[i] = double2(positions[i].x, positions[i].y); - } - - input.face[i_curve].resize(points.size()); - MutableSpan face_verts = input.face[i_curve]; - for (const int i : face_verts.index_range()) { - face_verts[i] = points[i]; - } - } - meshintersect::CDT_result result = delaunay_2d_calc(input, output_type); - return result; + return delaunay_2d_calc(input, output_type); } static meshintersect::CDT_result do_cdt_with_mask(const bke::CurvesGeometry &curves, @@ -87,34 +94,30 @@ static meshintersect::CDT_result do_cdt_with_mask(const bke::CurvesGeome const OffsetIndices points_by_curve = curves.evaluated_points_by_curve(); const Span positions = curves.evaluated_positions(); - int vert_len = 0; - mask.foreach_index([&](const int i) { vert_len += points_by_curve[i].size(); }); - - meshintersect::CDT_input input; - input.need_ids = false; - input.vert.reinitialize(vert_len); - input.face.reinitialize(mask.size()); - Array offsets_data(mask.size() + 1); const OffsetIndices points_by_curve_masked = offset_indices::gather_selected_offsets( points_by_curve, mask, offsets_data); + Array positions_2d(points_by_curve_masked.total_size()); mask.foreach_index(GrainSize(1024), [&](const int src_curve, const int dst_curve) { const IndexRange src_points = points_by_curve[src_curve]; const IndexRange dst_points = points_by_curve_masked[dst_curve]; - for (const int i : src_points.index_range()) { const int src = src_points[i]; const int dst = dst_points[i]; - input.vert[dst] = double2(positions[src].x, positions[src].y); + positions_2d[dst] = double2(positions[src].x, positions[src].y); } - - input.face[dst_curve].resize(src_points.size()); - array_utils::fill_index_range(input.face[dst_curve], dst_points.start()); }); - meshintersect::CDT_result result = delaunay_2d_calc(input, output_type); - return result; + Array> faces(points_by_curve_masked.size()); + fill_curve_vert_indices(points_by_curve_masked, faces); + + meshintersect::CDT_input input; + input.need_ids = false; + input.vert = std::move(positions_2d); + input.face = std::move(faces); + + return delaunay_2d_calc(input, output_type); } static Array> do_group_aware_cdt( @@ -245,7 +248,7 @@ static Mesh *cdts_to_mesh(const Span> results) /* The delaunay triangulation doesn't seem to return all of the necessary all_edges, even in * triangulation mode. */ BKE_mesh_calc_edges(mesh, true, false); - BKE_mesh_smooth_flag_set(mesh, false); + bke::mesh_smooth_set(*mesh, false); mesh->tag_overlapping_none(); diff --git a/source/blender/nodes/geometry/nodes/node_geo_deform_curves_on_surface.cc b/source/blender/nodes/geometry/nodes/node_geo_deform_curves_on_surface.cc index 0b45275f131..f0ffa936182 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_deform_curves_on_surface.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_deform_curves_on_surface.cc @@ -93,18 +93,18 @@ static void deform_curves(const CurvesGeometry &curves, continue; } - const MLoopTri &looptri_old = surface_looptris_old[surface_sample_old.looptri_index]; - const MLoopTri &looptri_new = surface_looptris_new[surface_sample_new.looptri_index]; + const MLoopTri <_old = surface_looptris_old[surface_sample_old.looptri_index]; + const MLoopTri <_new = surface_looptris_new[surface_sample_new.looptri_index]; const float3 &bary_weights_old = surface_sample_old.bary_weights; const float3 &bary_weights_new = surface_sample_new.bary_weights; - const int corner_0_old = looptri_old.tri[0]; - const int corner_1_old = looptri_old.tri[1]; - const int corner_2_old = looptri_old.tri[2]; + const int corner_0_old = lt_old.tri[0]; + const int corner_1_old = lt_old.tri[1]; + const int corner_2_old = lt_old.tri[2]; - const int corner_0_new = looptri_new.tri[0]; - const int corner_1_new = looptri_new.tri[1]; - const int corner_2_new = looptri_new.tri[2]; + const int corner_0_new = lt_new.tri[0]; + const int corner_1_new = lt_new.tri[1]; + const int corner_2_new = lt_new.tri[2]; const int vert_0_old = surface_corner_verts_old[corner_0_old]; const int vert_1_old = surface_corner_verts_old[corner_1_old]; diff --git a/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc b/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc index 92397f7d589..ce616ae1c7e 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc @@ -119,10 +119,10 @@ static void sample_mesh_surface(const Mesh &mesh, const Span looptris = mesh.looptris(); for (const int looptri_index : looptris.index_range()) { - const MLoopTri &looptri = looptris[looptri_index]; - const int v0_loop = looptri.tri[0]; - const int v1_loop = looptri.tri[1]; - const int v2_loop = looptri.tri[2]; + const MLoopTri < = looptris[looptri_index]; + const int v0_loop = lt.tri[0]; + const int v1_loop = lt.tri[1]; + const int v2_loop = lt.tri[2]; const float3 &v0_pos = positions[corner_verts[v0_loop]]; const float3 &v1_pos = positions[corner_verts[v1_loop]]; const float3 &v2_pos = positions[corner_verts[v2_loop]]; @@ -215,12 +215,12 @@ BLI_NOINLINE static void update_elimination_mask_based_on_density_factors( continue; } - const MLoopTri &looptri = looptris[looptri_indices[i]]; + const MLoopTri < = looptris[looptri_indices[i]]; const float3 bary_coord = bary_coords[i]; - const int v0_loop = looptri.tri[0]; - const int v1_loop = looptri.tri[1]; - const int v2_loop = looptri.tri[2]; + const int v0_loop = lt.tri[0]; + const int v1_loop = lt.tri[1]; + const int v2_loop = lt.tri[2]; const float v0_density_factor = std::max(0.0f, density_factors[v0_loop]); const float v1_density_factor = std::max(0.0f, density_factors[v1_loop]); @@ -380,11 +380,11 @@ static void compute_legacy_normal_outputs(const Mesh &mesh, for (const int i : bary_coords.index_range()) { const int looptri_index = looptri_indices[i]; - const MLoopTri &looptri = looptris[looptri_index]; + const MLoopTri < = looptris[looptri_index]; - const int v0_index = corner_verts[looptri.tri[0]]; - const int v1_index = corner_verts[looptri.tri[1]]; - const int v2_index = corner_verts[looptri.tri[2]]; + const int v0_index = corner_verts[lt.tri[0]]; + const int v1_index = corner_verts[lt.tri[1]]; + const int v2_index = corner_verts[lt.tri[2]]; const float3 v0_pos = positions[v0_index]; const float3 v1_pos = positions[v1_index]; const float3 v2_pos = positions[v2_index]; diff --git a/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc b/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc index 1dc84d6713a..205aef6b410 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_dual_mesh.cc @@ -332,7 +332,7 @@ static bool sort_vertex_faces(const Span edges, MutableSpan r_shared_edges, MutableSpan r_sorted_corners) { - if (connected_faces.size() <= 2 && (!boundary_vertex || connected_faces.size() == 0)) { + if (connected_faces.size() <= 2 && (!boundary_vertex || connected_faces.is_empty())) { return true; } @@ -890,7 +890,7 @@ static Mesh *calc_dual_mesh(const Mesh &src_mesh, } Mesh *mesh_out = BKE_mesh_new_nomain( vert_positions.size(), new_edges.size(), loop_lengths.size(), loops.size()); - BKE_mesh_smooth_flag_set(mesh_out, false); + bke::mesh_smooth_set(*mesh_out, false); transfer_attributes(vertex_types, keep_boundaries, diff --git a/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc b/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc index 90af0af0e58..5c4c3753046 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc @@ -408,7 +408,7 @@ static void copy_stable_id_faces(const Mesh &mesh, int loop_index = 0; for (const int i_face : selection.index_range()) { const IndexRange range = face_offsets[i_face]; - if (range.size() == 0) { + if (range.is_empty()) { continue; } const IndexRange source = faces[i_face]; @@ -950,7 +950,7 @@ static void duplicate_instances(GeometrySet &geometry_set, dst_instances->resize(duplicates.total_size()); for (const int i_selection : selection.index_range()) { const IndexRange range = duplicates[i_selection]; - if (range.size() == 0) { + if (range.is_empty()) { continue; } const int old_handle = src_instances.reference_handles()[i_selection]; diff --git a/source/blender/nodes/geometry/nodes/node_geo_index_switch.cc b/source/blender/nodes/geometry/nodes/node_geo_index_switch.cc index 378e4028cf9..1302b1bc49c 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_index_switch.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_index_switch.cc @@ -186,7 +186,7 @@ class LazyFunctionForIndexSwitchNode : public LazyFunction { const CPPType &cpp_type = *node.output_socket(0).typeinfo->geometry_nodes_cpp_type; debug_name_ = node.name; - inputs_.append_as("Index", CPPType::get>(), lf::ValueUsage::Used); + inputs_.append_as("Index", CPPType::get>(), lf::ValueUsage::Used); for (const int i : storage.items_span().index_range()) { const bNodeSocket &input = node.input_socket(value_inputs_start + i); inputs_.append_as(input.identifier, cpp_type, lf::ValueUsage::Maybe); @@ -196,7 +196,7 @@ class LazyFunctionForIndexSwitchNode : public LazyFunction { void execute_impl(lf::Params ¶ms, const lf::Context & /*context*/) const override { - const ValueOrField index = params.get_input>(0); + const SocketValueVariant index = params.get_input>(0); if (index.is_field() && can_be_field_) { Field index_field = index.as_field(); if (index_field.node().depends_on_input()) { @@ -256,12 +256,12 @@ class LazyFunctionForIndexSwitchNode : public LazyFunction { } const CPPType &type = *outputs_[0].type; - const auto &value_or_field_type = *bke::ValueOrFieldCPPType::get_from_self(type); - const CPPType &value_type = value_or_field_type.value; + const auto &value_variant_type = *bke::SocketValueVariantCPPType::get_from_self(type); + const CPPType &value_type = value_variant_type.value; Vector input_fields({std::move(index)}); for (const int i : IndexRange(values_num)) { - input_fields.append(value_or_field_type.as_field(input_values[i])); + input_fields.append(value_variant_type.as_field(input_values[i])); } std::unique_ptr switch_fn = std::make_unique( @@ -269,7 +269,7 @@ class LazyFunctionForIndexSwitchNode : public LazyFunction { GField output_field(FieldOperation::Create(std::move(switch_fn), std::move(input_fields))); void *output_ptr = params.get_output_data_ptr(0); - value_or_field_type.construct_from_field(output_ptr, std::move(output_field)); + value_variant_type.construct_from_field(output_ptr, std::move(output_field)); params.output_set(0); } }; diff --git a/source/blender/nodes/geometry/nodes/node_geo_input_active_camera.cc b/source/blender/nodes/geometry/nodes/node_geo_input_active_camera.cc new file mode 100644 index 00000000000..e93907f079c --- /dev/null +++ b/source/blender/nodes/geometry/nodes/node_geo_input_active_camera.cc @@ -0,0 +1,36 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "BKE_scene.h" + +#include "DEG_depsgraph_query.hh" + +#include "node_geometry_util.hh" + +namespace blender::nodes::node_geo_input_active_camera_cc { + +static void node_declare(NodeDeclarationBuilder &b) +{ + b.add_output("Active Camera") + .description("The camera used for rendering the scene"); +} + +static void node_exec(GeoNodeExecParams params) +{ + const Scene *scene = DEG_get_evaluated_scene(params.depsgraph()); + Object *camera = DEG_get_evaluated_object(params.depsgraph(), scene->camera); + params.set_output("Active Camera", camera); +} + +static void node_register() +{ + static bNodeType ntype; + geo_node_type_base(&ntype, GEO_NODE_INPUT_ACTIVE_CAMERA, "Active Camera", NODE_CLASS_INPUT); + ntype.geometry_node_execute = node_exec; + ntype.declare = node_declare; + nodeRegisterType(&ntype); +} +NOD_REGISTER_NODE(node_register) + +} // namespace blender::nodes::node_geo_input_active_camera_cc diff --git a/source/blender/nodes/geometry/nodes/node_geo_input_instance_rotation.cc b/source/blender/nodes/geometry/nodes/node_geo_input_instance_rotation.cc index 10a5e71420e..70b54263c40 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_input_instance_rotation.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_input_instance_rotation.cc @@ -12,21 +12,23 @@ namespace blender::nodes::node_geo_input_instance_rotation_cc { static void node_declare(NodeDeclarationBuilder &b) { - b.add_output("Rotation").field_source(); + b.add_output("Rotation").field_source(); } class InstanceRotationFieldInput final : public bke::InstancesFieldInput { public: - InstanceRotationFieldInput() : bke::InstancesFieldInput(CPPType::get(), "Rotation") {} + InstanceRotationFieldInput() + : bke::InstancesFieldInput(CPPType::get(), "Rotation") + { + } GVArray get_varray_for_context(const bke::Instances &instances, const IndexMask & /*mask*/) const final { - auto rotation_fn = [&](const int i) -> float3 { - return float3(math::to_euler(math::normalize(instances.transforms()[i]))); - }; - - return VArray::ForFunc(instances.instances_num(), rotation_fn); + const Span transforms = instances.transforms(); + return VArray::ForFunc(instances.instances_num(), [transforms](const int i) { + return math::to_quaternion(math::normalize(transforms[i])); + }); } uint64_t hash() const override @@ -42,7 +44,7 @@ class InstanceRotationFieldInput final : public bke::InstancesFieldInput { static void node_geo_exec(GeoNodeExecParams params) { - Field rotation{std::make_shared()}; + Field rotation{std::make_shared()}; params.set_output("Rotation", std::move(rotation)); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_face_group_boundaries.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_face_group_boundaries.cc index b81d1022237..7c4fda3170a 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_mesh_face_group_boundaries.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_face_group_boundaries.cc @@ -89,11 +89,8 @@ class BoundaryFieldInput final : public bke::MeshFieldInput { if (faces_group_id[edge_state_value] == group_id) { break; } - if (edge_state.compare_exchange_weak(edge_state_value, - is_boundary, - std::memory_order_release, - std::memory_order_release)) - { + if (edge_state.compare_exchange_weak( + edge_state_value, is_boundary, std::memory_order_release)) { boundary[edge_i] = true; break; } diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc index c68cabadf22..694dfb6c8a0 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc @@ -128,7 +128,7 @@ static Mesh *create_circle_mesh(const float radius, MutableSpan face_offsets = mesh->face_offsets_for_write(); MutableSpan corner_verts = mesh->corner_verts_for_write(); MutableSpan corner_edges = mesh->corner_edges_for_write(); - BKE_mesh_smooth_flag_set(mesh, false); + bke::mesh_smooth_set(*mesh, false); /* Assign vertex coordinates. */ const float angle_delta = 2.0f * (M_PI / float(verts_num)); diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_to_curve.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_to_curve.cc index 2d5196ef54e..1556237771a 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_mesh_to_curve.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_to_curve.cc @@ -33,7 +33,7 @@ static void node_geo_exec(GeoNodeExecParams params) evaluator.add(params.get_input>("Selection")); evaluator.evaluate(); const IndexMask selection = evaluator.get_evaluated_as_mask(0); - if (selection.size() == 0) { + if (selection.is_empty()) { geometry_set.remove_geometry_during_modify(); return; } diff --git a/source/blender/nodes/geometry/nodes/node_geo_proximity.cc b/source/blender/nodes/geometry/nodes/node_geo_proximity.cc index 5f8f8fabc35..0ace180d9c9 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_proximity.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_proximity.cc @@ -59,7 +59,7 @@ static bool calculate_mesh_proximity(const VArray &positions, BKE_bvhtree_from_mesh_get(&bvh_data, &mesh, BVHTREE_FROM_EDGES, 2); break; case GEO_NODE_PROX_TARGET_FACES: - BKE_bvhtree_from_mesh_get(&bvh_data, &mesh, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&bvh_data, &mesh, BVHTREE_FROM_LOOPTRIS, 2); break; } diff --git a/source/blender/nodes/geometry/nodes/node_geo_raycast.cc b/source/blender/nodes/geometry/nodes/node_geo_raycast.cc index 73d11f023dc..d43782c0de1 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_raycast.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_raycast.cc @@ -100,7 +100,7 @@ static void raycast_to_mesh(const IndexMask &mask, const MutableSpan r_hit_distances) { BVHTreeFromMesh tree_data; - BKE_bvhtree_from_mesh_get(&tree_data, &mesh, BVHTREE_FROM_LOOPTRI, 4); + BKE_bvhtree_from_mesh_get(&tree_data, &mesh, BVHTREE_FROM_LOOPTRIS, 4); BLI_SCOPED_DEFER([&]() { free_bvhtree_from_mesh(&tree_data); }); if (tree_data.tree == nullptr) { diff --git a/source/blender/nodes/geometry/nodes/node_geo_sample_index.cc b/source/blender/nodes/geometry/nodes/node_geo_sample_index.cc index 33703f1eccd..0096caa7355 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_sample_index.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_sample_index.cc @@ -233,21 +233,22 @@ static void node_geo_exec(GeoNodeExecParams params) const bool use_clamp = bool(storage.clamp); GField value_field = params.extract_input("Value"); - ValueOrField index_value_or_field = params.extract_input>("Index"); + SocketValueVariant index_value_variant = params.extract_input>( + "Index"); const CPPType &cpp_type = value_field.cpp_type(); - if (index_value_or_field.is_field()) { + if (index_value_variant.is_field()) { /* If the index is a field, the output has to be a field that still depends on the input. */ auto fn = std::make_shared( std::move(geometry), std::move(value_field), domain, use_clamp); - auto op = FieldOperation::Create(std::move(fn), {index_value_or_field.as_field()}); + auto op = FieldOperation::Create(std::move(fn), {index_value_variant.as_field()}); params.set_output("Value", GField(std::move(op))); } else if (const GeometryComponent *component = find_source_component(geometry, domain)) { /* Optimization for the case when the index is a single value. Here only that one index has to * be evaluated. */ const int domain_size = component->attribute_domain_size(domain); - int index = index_value_or_field.as_value(); + int index = index_value_variant.as_value(); if (use_clamp) { index = std::clamp(index, 0, domain_size - 1); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_sample_nearest.cc b/source/blender/nodes/geometry/nodes/node_geo_sample_nearest.cc index 52367f5dc9d..5695f08b612 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_sample_nearest.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_sample_nearest.cc @@ -142,7 +142,7 @@ static void get_closest_mesh_looptris(const Mesh &mesh, { BLI_assert(mesh.faces_num > 0); BVHTreeFromMesh tree_data; - BKE_bvhtree_from_mesh_get(&tree_data, &mesh, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&tree_data, &mesh, BVHTREE_FROM_LOOPTRIS, 2); get_closest_in_bvhtree( tree_data, positions, mask, r_looptri_indices, r_distances_sq, r_positions); free_bvhtree_from_mesh(&tree_data); diff --git a/source/blender/nodes/geometry/nodes/node_geo_sample_nearest_surface.cc b/source/blender/nodes/geometry/nodes/node_geo_sample_nearest_surface.cc index 37541a39da8..b658035d5bc 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_sample_nearest_surface.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_sample_nearest_surface.cc @@ -77,7 +77,7 @@ static void get_closest_mesh_looptris(const Mesh &mesh, { BLI_assert(mesh.faces_num > 0); BVHTreeFromMesh tree_data; - BKE_bvhtree_from_mesh_get(&tree_data, &mesh, BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&tree_data, &mesh, BVHTREE_FROM_LOOPTRIS, 2); get_closest_in_bvhtree( tree_data, positions, mask, r_looptri_indices, r_distances_sq, r_positions); free_bvhtree_from_mesh(&tree_data); diff --git a/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc b/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc index d9e3cc11e14..3d11c21e2a9 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc @@ -193,7 +193,7 @@ static void scale_vertex_islands_uniformly(Mesh &mesh, } }); - BKE_mesh_tag_positions_changed(&mesh); + mesh.tag_positions_changed(); } static void scale_vertex_islands_on_axis(Mesh &mesh, @@ -239,7 +239,7 @@ static void scale_vertex_islands_on_axis(Mesh &mesh, } }); - BKE_mesh_tag_positions_changed(&mesh); + mesh.tag_positions_changed(); } static Vector prepare_face_islands(const Mesh &mesh, diff --git a/source/blender/nodes/geometry/nodes/node_geo_set_curve_handles.cc b/source/blender/nodes/geometry/nodes/node_geo_set_curve_handles.cc index 60f1f8c0b31..105138d95cb 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_set_curve_handles.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_set_curve_handles.cc @@ -30,7 +30,7 @@ static void node_declare(NodeDeclarationBuilder &b) const StringRef side = node_storage(node).mode == GEO_NODE_CURVE_HANDLE_LEFT ? "handle_left" : "handle_right"; - new (r_value) ValueOrField(bke::AttributeFieldInput::Create(side)); + new (r_value) SocketValueVariant(bke::AttributeFieldInput::Create(side)); }); b.add_input("Offset").default_value(float3(0.0f, 0.0f, 0.0f)).field_on_all(); b.add_output("Curve").propagate_all(); diff --git a/source/blender/nodes/geometry/nodes/node_geo_simulation_input.cc b/source/blender/nodes/geometry/nodes/node_geo_simulation_input.cc index 1b69eb490fb..693a0eb50f0 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_simulation_input.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_simulation_input.cc @@ -41,7 +41,7 @@ class LazyFunctionForSimulationInputNode final : public LazyFunction { MutableSpan lf_index_by_bsocket = own_lf_graph_info.mapping.lf_index_by_bsocket; lf_index_by_bsocket[node.output_socket(0).index_in_tree()] = outputs_.append_and_get_index_as( - "Delta Time", CPPType::get>()); + "Delta Time", CPPType::get>()); for (const int i : simulation_items_.index_range()) { const NodeSimulationItem &item = simulation_items_[i]; @@ -103,7 +103,7 @@ class LazyFunctionForSimulationInputNode final : public LazyFunction { BLI_assert_unreachable(); } if (!params.output_was_set(0)) { - params.set_output(0, bke::ValueOrField(delta_time)); + params.set_output(0, bke::SocketValueVariant(delta_time)); } } diff --git a/source/blender/nodes/geometry/nodes/node_geo_simulation_output.cc b/source/blender/nodes/geometry/nodes/node_geo_simulation_output.cc index 63fa873adc1..b2935e59a67 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_simulation_output.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_simulation_output.cc @@ -405,16 +405,16 @@ void mix_baked_data_item(const eNodeSocketDatatype socket_type, case SOCK_ROTATION: case SOCK_RGBA: { const CPPType &type = get_simulation_item_cpp_type(socket_type); - const bke::ValueOrFieldCPPType &value_or_field_type = - *bke::ValueOrFieldCPPType::get_from_self(type); - if (value_or_field_type.is_field(prev) || value_or_field_type.is_field(next)) { + const bke::SocketValueVariantCPPType &value_variant_type = + *bke::SocketValueVariantCPPType::get_from_self(type); + if (value_variant_type.is_field(prev) || value_variant_type.is_field(next)) { /* Fields are evaluated on geometries and are mixed there. */ break; } - void *prev_value = value_or_field_type.get_value_ptr(prev); - const void *next_value = value_or_field_type.get_value_ptr(next); - bke::attribute_math::convert_to_static_type(value_or_field_type.value, [&](auto dummy) { + void *prev_value = value_variant_type.get_value_ptr(prev); + const void *next_value = value_variant_type.get_value_ptr(next); + bke::attribute_math::convert_to_static_type(value_variant_type.value, [&](auto dummy) { using T = decltype(dummy); *static_cast(prev_value) = bke::attribute_math::mix2( factor, *static_cast(prev_value), *static_cast(next_value)); diff --git a/source/blender/nodes/geometry/nodes/node_geo_split_to_instances.cc b/source/blender/nodes/geometry/nodes/node_geo_split_to_instances.cc index f3a755a7312..101c1a817f0 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_split_to_instances.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_split_to_instances.cc @@ -359,7 +359,7 @@ static void node_rna(StructRNA *srna) RNA_def_node_enum(srna, "domain", "Domain", - "Attribute domain for the selection and group id inputs", + "Attribute domain for the Selection and Group ID inputs", rna_enum_attribute_domain_without_corner_items, NOD_inline_enum_accessors(custom1), ATTR_DOMAIN_POINT, diff --git a/source/blender/nodes/geometry/nodes/node_geo_string_join.cc b/source/blender/nodes/geometry/nodes/node_geo_string_join.cc index 176251bb7e1..1e4962b3e6c 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_string_join.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_string_join.cc @@ -15,8 +15,8 @@ static void node_declare(NodeDeclarationBuilder &b) static void node_geo_exec(GeoNodeExecParams params) { - Vector> strings = - params.extract_input>>("Strings"); + Vector> strings = + params.extract_input>>("Strings"); const std::string delim = params.extract_input("Delimiter"); std::string output; diff --git a/source/blender/nodes/geometry/nodes/node_geo_string_to_curves.cc b/source/blender/nodes/geometry/nodes/node_geo_string_to_curves.cc index 14e44c17978..86ad17fca82 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_string_to_curves.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_string_to_curves.cc @@ -373,7 +373,7 @@ static void node_geo_exec(GeoNodeExecParams params) params.set_output("Remainder", std::move(layout->truncated_text)); } - if (layout->positions.size() == 0) { + if (layout->positions.is_empty()) { params.set_output("Curve Instances", GeometrySet()); params.set_default_remaining_outputs(); return; diff --git a/source/blender/nodes/geometry/nodes/node_geo_switch.cc b/source/blender/nodes/geometry/nodes/node_geo_switch.cc index bfa4bb6e473..7f7a8d7e4b1 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_switch.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_switch.cc @@ -19,55 +19,27 @@ NODE_STORAGE_FUNCS(NodeSwitch) static void node_declare(NodeDeclarationBuilder &b) { - b.add_input("Switch").default_value(false).supports_field(); - b.add_input("Switch", "Switch_001").default_value(false); + auto &switch_decl = b.add_input("Switch"); + const bNode *node = b.node_or_null(); + if (!node) { + return; + } + const NodeSwitch &storage = node_storage(*node); + const eNodeSocketDatatype socket_type = eNodeSocketDatatype(storage.input_type); - b.add_input("False").supports_field(); - b.add_input("True").supports_field(); - b.add_input("False", "False_001").min(-100000).max(100000).supports_field(); - b.add_input("True", "True_001").min(-100000).max(100000).supports_field(); - b.add_input("False", "False_002").default_value(false).hide_value().supports_field(); - b.add_input("True", "True_002").default_value(true).hide_value().supports_field(); - b.add_input("False", "False_003").supports_field(); - b.add_input("True", "True_003").supports_field(); + auto &false_decl = b.add_input(socket_type, "False"); + auto &true_decl = b.add_input(socket_type, "True"); + auto &output_decl = b.add_output(socket_type, "Output"); - b.add_input("False", "False_004") - .default_value({0.8f, 0.8f, 0.8f, 1.0f}) - .supports_field(); - b.add_input("True", "True_004") - .default_value({0.8f, 0.8f, 0.8f, 1.0f}) - .supports_field(); - b.add_input("False", "False_005").supports_field(); - b.add_input("True", "True_005").supports_field(); - - b.add_input("False", "False_006"); - b.add_input("True", "True_006"); - b.add_input("False", "False_007"); - b.add_input("True", "True_007"); - b.add_input("False", "False_008"); - b.add_input("True", "True_008"); - b.add_input("False", "False_009"); - b.add_input("True", "True_009"); - b.add_input("False", "False_010"); - b.add_input("True", "True_010"); - b.add_input("False", "False_011"); - b.add_input("True", "True_011"); - b.add_input("False", "False_012").supports_field(); - b.add_input("True", "True_012").supports_field(); - - b.add_output("Output").dependent_field().reference_pass_all(); - b.add_output("Output", "Output_001").dependent_field().reference_pass_all(); - b.add_output("Output", "Output_002").dependent_field().reference_pass_all(); - b.add_output("Output", "Output_003").dependent_field().reference_pass_all(); - b.add_output("Output", "Output_004").dependent_field().reference_pass_all(); - b.add_output("Output", "Output_005").dependent_field().reference_pass_all(); - b.add_output("Output", "Output_006").propagate_all(); - b.add_output("Output", "Output_007"); - b.add_output("Output", "Output_008"); - b.add_output("Output", "Output_009"); - b.add_output("Output", "Output_010"); - b.add_output("Output", "Output_011"); - b.add_output("Output", "Output_012").propagate_all().reference_pass_all(); + if (socket_type_supports_fields(socket_type)) { + switch_decl.supports_field(); + false_decl.supports_field(); + true_decl.supports_field(); + output_decl.dependent_field().reference_pass_all(); + } + if (socket_type == SOCK_GEOMETRY) { + output_decl.propagate_all(); + } } static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr) @@ -82,37 +54,6 @@ static void node_init(bNodeTree * /*tree*/, bNode *node) node->storage = data; } -static void node_update(bNodeTree *ntree, bNode *node) -{ - const NodeSwitch &storage = node_storage(*node); - int index = 0; - bNodeSocket *field_switch = static_cast(node->inputs.first); - bNodeSocket *non_field_switch = static_cast(field_switch->next); - - const bool fields_type = ELEM(storage.input_type, - SOCK_FLOAT, - SOCK_INT, - SOCK_BOOLEAN, - SOCK_VECTOR, - SOCK_RGBA, - SOCK_STRING, - SOCK_ROTATION); - - bke::nodeSetSocketAvailability(ntree, field_switch, fields_type); - bke::nodeSetSocketAvailability(ntree, non_field_switch, !fields_type); - - LISTBASE_FOREACH_INDEX (bNodeSocket *, socket, &node->inputs, index) { - if (index <= 1) { - continue; - } - bke::nodeSetSocketAvailability(ntree, socket, socket->type == storage.input_type); - } - - LISTBASE_FOREACH (bNodeSocket *, socket, &node->outputs) { - bke::nodeSetSocketAvailability(ntree, socket, socket->type == storage.input_type); - } -} - static void node_gather_link_searches(GatherLinkSearchOpParams ¶ms) { if (params.in_out() == SOCK_OUT) { @@ -174,7 +115,7 @@ class LazyFunctionForSwitchNode : public LazyFunction { const CPPType &cpp_type = *socket_type->geometry_nodes_cpp_type; debug_name_ = node.name; - inputs_.append_as("Condition", CPPType::get>()); + inputs_.append_as("Condition", CPPType::get>()); inputs_.append_as("False", cpp_type, lf::ValueUsage::Maybe); inputs_.append_as("True", cpp_type, lf::ValueUsage::Maybe); outputs_.append_as("Value", cpp_type); @@ -182,7 +123,7 @@ class LazyFunctionForSwitchNode : public LazyFunction { void execute_impl(lf::Params ¶ms, const lf::Context & /*context*/) const override { - const ValueOrField condition = params.get_input>(0); + const SocketValueVariant condition = params.get_input>(0); if (condition.is_field() && can_be_field_) { Field condition_field = condition.as_field(); if (condition_field.node().depends_on_input()) { @@ -220,28 +161,28 @@ class LazyFunctionForSwitchNode : public LazyFunction { void execute_field(Field condition, lf::Params ¶ms) const { /* When the condition is a non-constant field, we need both inputs. */ - void *false_value_or_field = params.try_get_input_data_ptr_or_request(false_input_index); - void *true_value_or_field = params.try_get_input_data_ptr_or_request(true_input_index); - if (ELEM(nullptr, false_value_or_field, true_value_or_field)) { + void *false_value_variant = params.try_get_input_data_ptr_or_request(false_input_index); + void *true_value_variant = params.try_get_input_data_ptr_or_request(true_input_index); + if (ELEM(nullptr, false_value_variant, true_value_variant)) { /* Try again when inputs are available. */ return; } const CPPType &type = *outputs_[0].type; - const bke::ValueOrFieldCPPType &value_or_field_type = *bke::ValueOrFieldCPPType::get_from_self( - type); - const CPPType &value_type = value_or_field_type.value; + const bke::SocketValueVariantCPPType &value_variant_type = + *bke::SocketValueVariantCPPType::get_from_self(type); + const CPPType &value_type = value_variant_type.value; const MultiFunction &switch_multi_function = this->get_switch_multi_function(value_type); - GField false_field = value_or_field_type.as_field(false_value_or_field); - GField true_field = value_or_field_type.as_field(true_value_or_field); + GField false_field = value_variant_type.as_field(false_value_variant); + GField true_field = value_variant_type.as_field(true_value_variant); GField output_field{FieldOperation::Create( switch_multi_function, {std::move(condition), std::move(false_field), std::move(true_field)})}; void *output_ptr = params.get_output_data_ptr(0); - value_or_field_type.construct_from_field(output_ptr, std::move(output_field)); + value_variant_type.construct_from_field(output_ptr, std::move(output_field)); params.output_set(0); } @@ -297,7 +238,6 @@ static void node_rna(StructRNA *srna) SOCK_GEOMETRY, SOCK_OBJECT, SOCK_COLLECTION, - SOCK_TEXTURE, SOCK_MATERIAL, SOCK_IMAGE); }); @@ -311,7 +251,6 @@ static void register_node() geo_node_type_base(&ntype, GEO_NODE_SWITCH, "Switch", NODE_CLASS_CONVERTER); ntype.declare = node_declare; ntype.initfunc = node_init; - ntype.updatefunc = node_update; node_type_storage(&ntype, "NodeSwitch", node_free_standard_storage, node_copy_standard_storage); ntype.gather_link_search_ops = node_gather_link_searches; ntype.draw_buttons = node_layout; diff --git a/source/blender/nodes/geometry/nodes/node_geo_transform_geometry.cc b/source/blender/nodes/geometry/nodes/node_geo_transform_geometry.cc index 0a319a46535..c8bd5ed42e6 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_transform_geometry.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_transform_geometry.cc @@ -63,7 +63,7 @@ static void transform_positions(MutableSpan positions, const float4x4 &m static void transform_mesh(Mesh &mesh, const float4x4 &transform) { transform_positions(mesh.vert_positions_for_write(), transform); - BKE_mesh_tag_positions_changed(&mesh); + mesh.tag_positions_changed(); } static void translate_pointcloud(PointCloud &pointcloud, const float3 translation) diff --git a/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc b/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc index e744581a0c0..732d33537ff 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc @@ -151,7 +151,7 @@ static Mesh *create_mesh_from_volume_grids(Span gri } BKE_mesh_calc_edges(mesh, false, false); - BKE_mesh_smooth_flag_set(mesh, false); + bke::mesh_smooth_set(*mesh, false); mesh->tag_overlapping_none(); diff --git a/source/blender/nodes/intern/geometry_nodes_execute.cc b/source/blender/nodes/intern/geometry_nodes_execute.cc index cfe92acf124..4a40ecc8a1c 100644 --- a/source/blender/nodes/intern/geometry_nodes_execute.cc +++ b/source/blender/nodes/intern/geometry_nodes_execute.cc @@ -104,6 +104,7 @@ static bool node_needs_own_transform_relation(const bNode &node) static void process_nodes_for_depsgraph(const bNodeTree &tree, Set &ids, bool &r_needs_own_transform_relation, + bool &r_needs_scene_camera_relation, Set &checked_groups) { if (!checked_groups.add(&tree)) { @@ -115,21 +116,28 @@ static void process_nodes_for_depsgraph(const bNodeTree &tree, add_used_ids_from_sockets(node->inputs, ids); add_used_ids_from_sockets(node->outputs, ids); r_needs_own_transform_relation |= node_needs_own_transform_relation(*node); + r_needs_scene_camera_relation |= (node->type == GEO_NODE_INPUT_ACTIVE_CAMERA); } for (const bNode *node : tree.group_nodes()) { if (const bNodeTree *sub_tree = reinterpret_cast(node->id)) { - process_nodes_for_depsgraph(*sub_tree, ids, r_needs_own_transform_relation, checked_groups); + process_nodes_for_depsgraph(*sub_tree, + ids, + r_needs_own_transform_relation, + r_needs_scene_camera_relation, + checked_groups); } } } void find_node_tree_dependencies(const bNodeTree &tree, Set &r_ids, - bool &r_needs_own_transform_relation) + bool &r_needs_own_transform_relation, + bool &r_needs_scene_camera_relation) { Set checked_groups; - process_nodes_for_depsgraph(tree, r_ids, r_needs_own_transform_relation, checked_groups); + process_nodes_for_depsgraph( + tree, r_ids, r_needs_own_transform_relation, r_needs_scene_camera_relation, checked_groups); } StringRef input_use_attribute_suffix() @@ -339,12 +347,12 @@ static void init_socket_cpp_value_from_property(const IDProperty &property, else if (property.type == IDP_DOUBLE) { value = float(IDP_Double(&property)); } - new (r_value) bke::ValueOrField(value); + new (r_value) bke::SocketValueVariant(value); break; } case SOCK_INT: { int value = IDP_Int(&property); - new (r_value) bke::ValueOrField(value); + new (r_value) bke::SocketValueVariant(value); break; } case SOCK_VECTOR: { @@ -360,7 +368,7 @@ static void init_socket_cpp_value_from_property(const IDProperty &property, BLI_assert(property.subtype == IDP_DOUBLE); value = float3(double3(static_cast(property_array))); } - new (r_value) bke::ValueOrField(value); + new (r_value) bke::SocketValueVariant(value); break; } case SOCK_RGBA: { @@ -377,12 +385,12 @@ static void init_socket_cpp_value_from_property(const IDProperty &property, vec = float4(double4(static_cast(property_array))); } ColorGeometry4f value(vec); - new (r_value) bke::ValueOrField(value); + new (r_value) bke::SocketValueVariant(value); break; } case SOCK_BOOLEAN: { const bool value = IDP_Bool(&property); - new (r_value) bke::ValueOrField(value); + new (r_value) bke::SocketValueVariant(value); break; } case SOCK_ROTATION: { @@ -399,12 +407,12 @@ static void init_socket_cpp_value_from_property(const IDProperty &property, vec = float3(double3(static_cast(property_array))); } const math::EulerXYZ euler_value = math::EulerXYZ(vec); - new (r_value) bke::ValueOrField(math::to_quaternion(euler_value)); + new (r_value) bke::SocketValueVariant(math::to_quaternion(euler_value)); break; } case SOCK_STRING: { std::string value = IDP_String(&property); - new (r_value) bke::ValueOrField(std::move(value)); + new (r_value) bke::SocketValueVariant(std::move(value)); break; } case SOCK_OBJECT: { @@ -501,10 +509,10 @@ static void initialize_group_input(const bNodeTree &tree, if (attribute_name && bke::allow_procedural_attribute_access(*attribute_name)) { fn::GField attribute_field = bke::AttributeFieldInput::Create(*attribute_name, *typeinfo->base_cpp_type); - const auto *value_or_field_cpp_type = bke::ValueOrFieldCPPType::get_from_self( + const auto *value_variant_type = bke::SocketValueVariantCPPType::get_from_self( *typeinfo->geometry_nodes_cpp_type); - BLI_assert(value_or_field_cpp_type != nullptr); - value_or_field_cpp_type->construct_from_field(r_value, std::move(attribute_field)); + BLI_assert(value_variant_type != nullptr); + value_variant_type->construct_from_field(r_value, std::move(attribute_field)); } else if (is_layer_selection_field(io_input)) { const IDProperty *property_layer_name = IDP_GetPropertyFromGroup(properties, @@ -512,10 +520,10 @@ static void initialize_group_input(const bNodeTree &tree, StringRef layer_name = IDP_String(property_layer_name); const fn::GField selection_field( std::make_shared(layer_name), 0); - const auto *value_or_field_cpp_type = bke::ValueOrFieldCPPType::get_from_self( + const auto *value_variant_type = bke::SocketValueVariantCPPType::get_from_self( *typeinfo->geometry_nodes_cpp_type); - BLI_assert(value_or_field_cpp_type != nullptr); - value_or_field_cpp_type->construct_from_field(r_value, std::move(selection_field)); + BLI_assert(value_variant_type != nullptr); + value_variant_type->construct_from_field(r_value, std::move(selection_field)); } else { init_socket_cpp_value_from_property(*property, socket_data_type, r_value); @@ -563,9 +571,9 @@ static MultiValueMap find_output_attributes_to const int index = socket->index(); const GPointer value = output_values[index]; - const auto *value_or_field_type = bke::ValueOrFieldCPPType::get_from_self(*value.type()); - BLI_assert(value_or_field_type != nullptr); - const fn::GField field = value_or_field_type->as_field(value.get()); + const auto *value_variant_type = bke::SocketValueVariantCPPType::get_from_self(*value.type()); + BLI_assert(value_variant_type != nullptr); + const fn::GField field = value_variant_type->as_field(value.get()); const bNodeTreeInterfaceSocket *interface_socket = tree.interface_outputs()[index]; const eAttrDomain domain = (eAttrDomain)interface_socket->attribute_domain; diff --git a/source/blender/nodes/intern/geometry_nodes_lazy_function.cc b/source/blender/nodes/intern/geometry_nodes_lazy_function.cc index 13633c670ed..64ffeb7847c 100644 --- a/source/blender/nodes/intern/geometry_nodes_lazy_function.cc +++ b/source/blender/nodes/intern/geometry_nodes_lazy_function.cc @@ -57,8 +57,8 @@ namespace blender::nodes { namespace aai = bke::anonymous_attribute_inferencing; using bke::bNodeTreeZone; using bke::bNodeTreeZones; -using bke::ValueOrField; -using bke::ValueOrFieldCPPType; +using bke::SocketValueVariant; +using bke::SocketValueVariantCPPType; static const CPPType *get_socket_cpp_type(const bNodeSocketType &typeinfo) { @@ -342,14 +342,14 @@ class LazyFunctionForGeometryNode : public LazyFunction { const int lf_index, AnonymousAttributeIDPtr attribute_id) const { - const ValueOrFieldCPPType &value_or_field_cpp_type = *ValueOrFieldCPPType::get_from_self( - *outputs_[lf_index].type); + const SocketValueVariantCPPType &value_variant_type = + *SocketValueVariantCPPType::get_from_self(*outputs_[lf_index].type); GField output_field{std::make_shared( std::move(attribute_id), - value_or_field_cpp_type.value, + value_variant_type.value, fmt::format(TIP_("{} node"), std::string_view(node_.label_or_name())))}; void *r_value = params.get_output_data_ptr(lf_index); - value_or_field_cpp_type.construct_from_field(r_value, std::move(output_field)); + value_variant_type.construct_from_field(r_value, std::move(output_field)); params.output_set(lf_index); } @@ -415,21 +415,22 @@ class LazyFunctionForMultiInput : public LazyFunction { { /* Currently we only have multi-inputs for geometry and string sockets. This could be * generalized in the future. */ - base_type_->to_static_type_tag>([&](auto type_tag) { - using T = typename decltype(type_tag)::type; - if constexpr (std::is_void_v) { - /* This type is not supported in this node for now. */ - BLI_assert_unreachable(); - } - else { - void *output_ptr = params.get_output_data_ptr(0); - Vector &values = *new (output_ptr) Vector(); - for (const int i : inputs_.index_range()) { - values.append(params.extract_input(i)); - } - params.output_set(0); - } - }); + base_type_->to_static_type_tag>( + [&](auto type_tag) { + using T = typename decltype(type_tag)::type; + if constexpr (std::is_void_v) { + /* This type is not supported in this node for now. */ + BLI_assert_unreachable(); + } + else { + void *output_ptr = params.get_output_data_ptr(0); + Vector &values = *new (output_ptr) Vector(); + for (const int i : inputs_.index_range()) { + values.append(params.extract_input(i)); + } + params.output_set(0); + } + }); } }; @@ -481,11 +482,11 @@ class LazyFunctionForUndefinedNode : public LazyFunction { * Executes a multi-function. If all inputs are single values, the results will also be single * values. If any input is a field, the outputs will also be fields. */ -static void execute_multi_function_on_value_or_field( +static void execute_multi_function_on_value_variant( const MultiFunction &fn, const std::shared_ptr &owned_fn, - const Span input_types, - const Span output_types, + const Span input_types, + const Span output_types, const Span input_values, const Span output_values) { @@ -496,9 +497,9 @@ static void execute_multi_function_on_value_or_field( /* Check if any input is a field. */ bool any_input_is_field = false; for (const int i : input_types.index_range()) { - const ValueOrFieldCPPType &type = *input_types[i]; - const void *value_or_field = input_values[i]; - if (type.is_field(value_or_field)) { + const SocketValueVariantCPPType &type = *input_types[i]; + const void *value_variant = input_values[i]; + if (type.is_field(value_variant)) { any_input_is_field = true; break; } @@ -508,9 +509,9 @@ static void execute_multi_function_on_value_or_field( /* Convert all inputs into fields, so that they can be used as input in the new field. */ Vector input_fields; for (const int i : input_types.index_range()) { - const ValueOrFieldCPPType &type = *input_types[i]; - const void *value_or_field = input_values[i]; - input_fields.append(type.as_field(value_or_field)); + const SocketValueVariantCPPType &type = *input_types[i]; + const void *value_variant = input_values[i]; + input_fields.append(type.as_field(value_variant)); } /* Construct the new field node. */ @@ -524,9 +525,9 @@ static void execute_multi_function_on_value_or_field( /* Store the new fields in the output. */ for (const int i : output_types.index_range()) { - const ValueOrFieldCPPType &type = *output_types[i]; - void *value_or_field = output_values[i]; - type.construct_from_field(value_or_field, GField{operation, i}); + const SocketValueVariantCPPType &type = *output_types[i]; + void *value_variant = output_values[i]; + type.construct_from_field(value_variant, GField{operation, i}); } } else { @@ -536,16 +537,16 @@ static void execute_multi_function_on_value_or_field( mf::ContextBuilder context; for (const int i : input_types.index_range()) { - const ValueOrFieldCPPType &type = *input_types[i]; - const void *value_or_field = input_values[i]; - const void *value = type.get_value_ptr(value_or_field); + const SocketValueVariantCPPType &type = *input_types[i]; + const void *value_variant = input_values[i]; + const void *value = type.get_value_ptr(value_variant); params.add_readonly_single_input(GPointer{type.value, value}); } for (const int i : output_types.index_range()) { - const ValueOrFieldCPPType &type = *output_types[i]; - void *value_or_field = output_values[i]; - type.self.default_construct(value_or_field); - void *value = type.get_value_ptr(value_or_field); + const SocketValueVariantCPPType &type = *output_types[i]; + void *value_variant = output_values[i]; + type.self.default_construct(value_variant); + void *value = type.get_value_ptr(value_variant); type.value.destruct(value); params.add_uninitialized_single_output(GMutableSpan{type.value, value, 1}); } @@ -620,13 +621,13 @@ class LazyFunctionForMutedNode : public LazyFunction { } /* Perform a type conversion and then format the value. */ const bke::DataTypeConversions &conversions = bke::get_implicit_type_conversions(); - const auto *from_type = ValueOrFieldCPPType::get_from_self(input_type); - const auto *to_type = ValueOrFieldCPPType::get_from_self(output_type); + const auto *from_type = SocketValueVariantCPPType::get_from_self(input_type); + const auto *to_type = SocketValueVariantCPPType::get_from_self(output_type); if (from_type != nullptr && to_type != nullptr) { if (conversions.is_convertible(from_type->value, to_type->value)) { const MultiFunction &multi_fn = *conversions.get_conversion_multi_function( mf::DataType::ForSingle(from_type->value), mf::DataType::ForSingle(to_type->value)); - execute_multi_function_on_value_or_field( + execute_multi_function_on_value_variant( multi_fn, {}, {from_type}, {to_type}, {input_value}, {output_value}); } params.output_set(output_i); @@ -646,13 +647,13 @@ class LazyFunctionForMutedNode : public LazyFunction { class LazyFunctionForMultiFunctionConversion : public LazyFunction { private: const MultiFunction &fn_; - const ValueOrFieldCPPType &from_type_; - const ValueOrFieldCPPType &to_type_; + const SocketValueVariantCPPType &from_type_; + const SocketValueVariantCPPType &to_type_; public: LazyFunctionForMultiFunctionConversion(const MultiFunction &fn, - const ValueOrFieldCPPType &from, - const ValueOrFieldCPPType &to) + const SocketValueVariantCPPType &from, + const SocketValueVariantCPPType &to) : fn_(fn), from_type_(from), to_type_(to) { debug_name_ = "Convert"; @@ -667,7 +668,7 @@ class LazyFunctionForMultiFunctionConversion : public LazyFunction { BLI_assert(from_value != nullptr); BLI_assert(to_value != nullptr); - execute_multi_function_on_value_or_field( + execute_multi_function_on_value_variant( fn_, {}, {&from_type_}, {&to_type_}, {from_value}, {to_value}); params.output_set(0); @@ -680,8 +681,8 @@ class LazyFunctionForMultiFunctionConversion : public LazyFunction { class LazyFunctionForMultiFunctionNode : public LazyFunction { private: const NodeMultiFunctions::Item fn_item_; - Vector input_types_; - Vector output_types_; + Vector input_types_; + Vector output_types_; public: LazyFunctionForMultiFunctionNode(const bNode &node, @@ -693,10 +694,10 @@ class LazyFunctionForMultiFunctionNode : public LazyFunction { debug_name_ = node.name; lazy_function_interface_from_node(node, inputs_, outputs_, r_lf_index_by_bsocket); for (const lf::Input &fn_input : inputs_) { - input_types_.append(ValueOrFieldCPPType::get_from_self(*fn_input.type)); + input_types_.append(SocketValueVariantCPPType::get_from_self(*fn_input.type)); } for (const lf::Output &fn_output : outputs_) { - output_types_.append(ValueOrFieldCPPType::get_from_self(*fn_output.type)); + output_types_.append(SocketValueVariantCPPType::get_from_self(*fn_output.type)); } } @@ -710,7 +711,7 @@ class LazyFunctionForMultiFunctionNode : public LazyFunction { for (const int i : outputs_.index_range()) { output_values[i] = params.get_output_data_ptr(i); } - execute_multi_function_on_value_or_field( + execute_multi_function_on_value_variant( *fn_item_.fn, fn_item_.owned_fn, input_types_, output_types_, input_values, output_values); for (const int i : outputs_.index_range()) { params.output_set(i); @@ -790,10 +791,10 @@ class LazyFunctionForViewerNode : public LazyFunction { const NodeGeometryViewer *storage = static_cast(bnode_.storage); if (use_field_input_) { - const void *value_or_field = params.try_get_input_data_ptr(1); - BLI_assert(value_or_field != nullptr); - const auto &value_or_field_type = *ValueOrFieldCPPType::get_from_self(*inputs_[1].type); - GField field = value_or_field_type.as_field(value_or_field); + const void *value_variant = params.try_get_input_data_ptr(1); + BLI_assert(value_variant != nullptr); + const auto &value_variant_type = *SocketValueVariantCPPType::get_from_self(*inputs_[1].type); + GField field = value_variant_type.as_field(value_variant); const eAttrDomain domain = eAttrDomain(storage->domain); const StringRefNull viewer_attribute_name = ".viewer"; if (domain == ATTR_DOMAIN_INSTANCE) { @@ -1099,14 +1100,14 @@ class LazyFunctionForSwitchSocketUsage : public lf::LazyFunction { LazyFunctionForSwitchSocketUsage() { debug_name_ = "Switch Socket Usage"; - inputs_.append_as("Condition", CPPType::get>()); + inputs_.append_as("Condition", CPPType::get>()); outputs_.append_as("False", CPPType::get()); outputs_.append_as("True", CPPType::get()); } void execute_impl(lf::Params ¶ms, const lf::Context & /*context*/) const override { - const ValueOrField &condition = params.get_input>(0); + const SocketValueVariant &condition = params.get_input>(0); if (condition.is_field()) { params.set_output(0, true); params.set_output(1, true); @@ -1128,7 +1129,7 @@ class LazyFunctionForIndexSwitchSocketUsage : public lf::LazyFunction { LazyFunctionForIndexSwitchSocketUsage(const bNode &bnode) { debug_name_ = "Index Switch Socket Usage"; - inputs_.append_as("Index", CPPType::get>()); + inputs_.append_as("Index", CPPType::get>()); for (const bNodeSocket *socket : bnode.input_sockets().drop_front(1)) { outputs_.append_as(socket->identifier, CPPType::get()); } @@ -1136,7 +1137,7 @@ class LazyFunctionForIndexSwitchSocketUsage : public lf::LazyFunction { void execute_impl(lf::Params ¶ms, const lf::Context & /*context*/) const override { - const ValueOrField &index = params.get_input>(0); + const SocketValueVariant &index = params.get_input>(0); if (index.is_field()) { for (const int i : outputs_.index_range()) { params.set_output(i, true); @@ -1156,10 +1157,10 @@ class LazyFunctionForIndexSwitchSocketUsage : public lf::LazyFunction { */ class LazyFunctionForAnonymousAttributeSetExtract : public lf::LazyFunction { private: - const ValueOrFieldCPPType &type_; + const SocketValueVariantCPPType &type_; public: - LazyFunctionForAnonymousAttributeSetExtract(const ValueOrFieldCPPType &type) : type_(type) + LazyFunctionForAnonymousAttributeSetExtract(const SocketValueVariantCPPType &type) : type_(type) { debug_name_ = "Extract Attribute Set"; inputs_.append_as("Use", CPPType::get()); @@ -1174,15 +1175,15 @@ class LazyFunctionForAnonymousAttributeSetExtract : public lf::LazyFunction { params.set_output(0, {}); return; } - const void *value_or_field = params.try_get_input_data_ptr_or_request(1); - if (value_or_field == nullptr) { + const void *value_variant = params.try_get_input_data_ptr_or_request(1); + if (value_variant == nullptr) { /* Wait until the field is computed. */ return; } bke::AnonymousAttributeSet attributes; - if (type_.is_field(value_or_field)) { - const GField &field = *type_.get_field_ptr(value_or_field); + if (type_.is_field(value_variant)) { + const GField &field = *type_.get_field_ptr(value_variant); field.node().for_each_field_input_recursive([&](const FieldInput &field_input) { if (const auto *attr_field_input = dynamic_cast( &field_input)) @@ -1528,7 +1529,7 @@ class LazyFunctionForRepeatZone : public LazyFunction { { debug_name_ = "Repeat Zone"; - inputs_.append_as("Iterations", CPPType::get>(), lf::ValueUsage::Used); + inputs_.append_as("Iterations", CPPType::get>(), lf::ValueUsage::Used); for (const bNodeSocket *socket : zone.input_node->input_sockets().drop_front(1).drop_back(1)) { inputs_.append_as( socket->name, *socket->typeinfo->geometry_nodes_cpp_type, lf::ValueUsage::Maybe); @@ -1641,7 +1642,8 @@ class LazyFunctionForRepeatZone : public LazyFunction { /* Number of iterations to evaluate. */ const int iterations = std::max( - 0, params.get_input>(zone_info_.indices.inputs.main[0]).as_value()); + 0, + params.get_input>(zone_info_.indices.inputs.main[0]).as_value()); /* Show a warning when the inspection index is out of range. */ if (node_storage.inspection_index > 0) { @@ -2853,7 +2855,8 @@ struct GeometryNodesLazyFunctionBuilder { lf::Graph &lf_graph, Set &socket_usage_inputs) { - const ValueOrFieldCPPType &type = *ValueOrFieldCPPType::get_from_self(lf_field_socket.type()); + const SocketValueVariantCPPType &type = *SocketValueVariantCPPType::get_from_self( + lf_field_socket.type()); auto &lazy_function = scope_.construct(type); lf::Node &lf_node = lf_graph.add_function(lazy_function); lf::InputSocket &lf_use_input = lf_node.input(0); @@ -3521,73 +3524,43 @@ struct GeometryNodesLazyFunctionBuilder { lf::FunctionNode &lf_node = graph_params.lf_graph.add_function(*lazy_function); scope_.add(std::move(lazy_function)); - int input_index = 0; - for (const bNodeSocket *bsocket : bnode.input_sockets()) { - if (bsocket->is_available()) { - lf::InputSocket &lf_socket = lf_node.input(input_index); - graph_params.lf_inputs_by_bsocket.add(bsocket, &lf_socket); - mapping_->bsockets_by_lf_socket_map.add(&lf_socket, bsocket); - input_index++; - } - } - for (const bNodeSocket *bsocket : bnode.output_sockets()) { - if (bsocket->is_available()) { - lf::OutputSocket &lf_socket = lf_node.output(0); - graph_params.lf_output_by_bsocket.add(bsocket, &lf_socket); - mapping_->bsockets_by_lf_socket_map.add(&lf_socket, bsocket); - break; - } + for (const int i : bnode.input_sockets().index_range()) { + graph_params.lf_inputs_by_bsocket.add(&bnode.input_socket(i), &lf_node.input(i)); + mapping_->bsockets_by_lf_socket_map.add(&lf_node.input(i), &bnode.input_socket(i)); } + graph_params.lf_output_by_bsocket.add(&bnode.output_socket(0), &lf_node.output(0)); + mapping_->bsockets_by_lf_socket_map.add(&lf_node.output(0), &bnode.output_socket(0)); + this->build_switch_node_socket_usage(bnode, graph_params); } void build_switch_node_socket_usage(const bNode &bnode, BuildGraphParams &graph_params) { - const bNodeSocket *switch_input_bsocket = nullptr; - const bNodeSocket *false_input_bsocket = nullptr; - const bNodeSocket *true_input_bsocket = nullptr; - const bNodeSocket *output_bsocket = nullptr; - for (const bNodeSocket *socket : bnode.input_sockets()) { - if (!socket->is_available()) { - continue; - } - if (socket->name == StringRef("Switch")) { - switch_input_bsocket = socket; - } - else if (socket->name == StringRef("False")) { - false_input_bsocket = socket; - } - else if (socket->name == StringRef("True")) { - true_input_bsocket = socket; - } - } - for (const bNodeSocket *socket : bnode.output_sockets()) { - if (socket->is_available()) { - output_bsocket = socket; - break; - } - } + const bNodeSocket &switch_input_bsocket = bnode.input_socket(0); + const bNodeSocket &false_input_bsocket = bnode.input_socket(1); + const bNodeSocket &true_input_bsocket = bnode.input_socket(2); + const bNodeSocket &output_bsocket = bnode.output_socket(0); lf::OutputSocket *output_is_used_socket = graph_params.usage_by_bsocket.lookup_default( - output_bsocket, nullptr); + &output_bsocket, nullptr); if (output_is_used_socket == nullptr) { return; } - graph_params.usage_by_bsocket.add(switch_input_bsocket, output_is_used_socket); - if (switch_input_bsocket->is_directly_linked()) { + graph_params.usage_by_bsocket.add(&switch_input_bsocket, output_is_used_socket); + if (switch_input_bsocket.is_directly_linked()) { /* The condition input is dynamic, so the usage of the other inputs is as well. */ static const LazyFunctionForSwitchSocketUsage switch_socket_usage_fn; lf::Node &lf_node = graph_params.lf_graph.add_function(switch_socket_usage_fn); - graph_params.lf_inputs_by_bsocket.add(switch_input_bsocket, &lf_node.input(0)); - graph_params.usage_by_bsocket.add(false_input_bsocket, &lf_node.output(0)); - graph_params.usage_by_bsocket.add(true_input_bsocket, &lf_node.output(1)); + graph_params.lf_inputs_by_bsocket.add(&switch_input_bsocket, &lf_node.input(0)); + graph_params.usage_by_bsocket.add(&false_input_bsocket, &lf_node.output(0)); + graph_params.usage_by_bsocket.add(&true_input_bsocket, &lf_node.output(1)); } else { - if (switch_input_bsocket->default_value_typed()->value) { - graph_params.usage_by_bsocket.add(true_input_bsocket, output_is_used_socket); + if (switch_input_bsocket.default_value_typed()->value) { + graph_params.usage_by_bsocket.add(&true_input_bsocket, output_is_used_socket); } else { - graph_params.usage_by_bsocket.add(false_input_bsocket, output_is_used_socket); + graph_params.usage_by_bsocket.add(&false_input_bsocket, output_is_used_socket); } } } @@ -3781,15 +3754,15 @@ struct GeometryNodesLazyFunctionBuilder { if (from_type == to_type) { return &from_socket; } - const auto *from_field_type = ValueOrFieldCPPType::get_from_self(from_type); - const auto *to_field_type = ValueOrFieldCPPType::get_from_self(to_type); - if (from_field_type != nullptr && to_field_type != nullptr) { - if (conversions_->is_convertible(from_field_type->value, to_field_type->value)) { + const auto *from_variant_type = SocketValueVariantCPPType::get_from_self(from_type); + const auto *to_variant_type = SocketValueVariantCPPType::get_from_self(to_type); + if (from_variant_type != nullptr && to_variant_type != nullptr) { + if (conversions_->is_convertible(from_variant_type->value, to_variant_type->value)) { const MultiFunction &multi_fn = *conversions_->get_conversion_multi_function( - mf::DataType::ForSingle(from_field_type->value), - mf::DataType::ForSingle(to_field_type->value)); + mf::DataType::ForSingle(from_variant_type->value), + mf::DataType::ForSingle(to_variant_type->value)); auto &fn = scope_.construct( - multi_fn, *from_field_type, *to_field_type); + multi_fn, *from_variant_type, *to_variant_type); lf::Node &conversion_node = lf_graph.add_function(fn); lf_graph.add_link(from_socket, conversion_node.input(0)); return &conversion_node.output(0); diff --git a/source/blender/nodes/intern/geometry_nodes_log.cc b/source/blender/nodes/intern/geometry_nodes_log.cc index c08a62686a6..30b63d503d9 100644 --- a/source/blender/nodes/intern/geometry_nodes_log.cc +++ b/source/blender/nodes/intern/geometry_nodes_log.cc @@ -180,11 +180,11 @@ void GeoTreeLogger::log_value(const bNode &node, const bNodeSocket &socket, cons const bke::GeometrySet &geometry = *value.get(); store_logged_value(this->allocator->construct(geometry)); } - else if (const auto *value_or_field_type = bke::ValueOrFieldCPPType::get_from_self(type)) { - const void *value_or_field = value.get(); - const CPPType &base_type = value_or_field_type->value; - if (value_or_field_type->is_field(value_or_field)) { - const GField *field = value_or_field_type->get_field_ptr(value_or_field); + else if (const auto *value_variant_type = bke::SocketValueVariantCPPType::get_from_self(type)) { + const void *value_variant = value.get(); + const CPPType &base_type = value_variant_type->value; + if (value_variant_type->is_field(value_variant)) { + const GField *field = value_variant_type->get_field_ptr(value_variant); if (field->node().depends_on_input()) { store_logged_value(this->allocator->construct(*field)); } @@ -195,7 +195,7 @@ void GeoTreeLogger::log_value(const bNode &node, const bNodeSocket &socket, cons } } else { - const void *value = value_or_field_type->get_value_ptr(value_or_field); + const void *value = value_variant_type->get_value_ptr(value_variant); log_generic_value(base_type, value); } } diff --git a/source/blender/nodes/intern/node_declaration.cc b/source/blender/nodes/intern/node_declaration.cc index 102afd7c434..536beb5a595 100644 --- a/source/blender/nodes/intern/node_declaration.cc +++ b/source/blender/nodes/intern/node_declaration.cc @@ -888,24 +888,26 @@ namespace implicit_field_inputs { void position(const bNode & /*node*/, void *r_value) { - new (r_value) bke::ValueOrField(bke::AttributeFieldInput::Create("position")); + new (r_value) + bke::SocketValueVariant(bke::AttributeFieldInput::Create("position")); } void normal(const bNode & /*node*/, void *r_value) { - new (r_value) - bke::ValueOrField(fn::Field(std::make_shared())); + new (r_value) bke::SocketValueVariant( + fn::Field(std::make_shared())); } void index(const bNode & /*node*/, void *r_value) { - new (r_value) bke::ValueOrField(fn::Field(std::make_shared())); + new (r_value) + bke::SocketValueVariant(fn::Field(std::make_shared())); } void id_or_index(const bNode & /*node*/, void *r_value) { new (r_value) - bke::ValueOrField(fn::Field(std::make_shared())); + bke::SocketValueVariant(fn::Field(std::make_shared())); } } // namespace implicit_field_inputs diff --git a/source/blender/nodes/intern/node_socket.cc b/source/blender/nodes/intern/node_socket.cc index 955312d2ac6..d7314355ce7 100644 --- a/source/blender/nodes/intern/node_socket.cc +++ b/source/blender/nodes/intern/node_socket.cc @@ -39,7 +39,7 @@ #include "NOD_socket_declarations.hh" using namespace blender; -using blender::bke::ValueOrField; +using blender::bke::SocketValueVariant; using blender::nodes::SocketDeclarationPtr; bNodeSocket *node_add_socket_from_template(bNodeTree *ntree, @@ -371,24 +371,6 @@ static const char *get_current_socket_identifier_for_future_socket( const Span socket_decls) { switch (node.type) { - case GEO_NODE_SWITCH: { - const NodeSwitch &storage = *static_cast(node.storage); - const bool use_field_socket = ELEM(storage.input_type, - SOCK_FLOAT, - SOCK_INT, - SOCK_BOOLEAN, - SOCK_VECTOR, - SOCK_RGBA, - SOCK_STRING, - SOCK_ROTATION); - if (BLI_str_startswith(socket.identifier, "Switch")) { - if (use_field_socket) { - return "Switch"; - } - return "Switch_001"; - } - return get_identifier_from_decl({"False", "True", "Output"}, socket, socket_decls); - } case GEO_NODE_SAMPLE_CURVE: { return get_identifier_from_decl("Value", socket, socket_decls); } @@ -950,10 +932,10 @@ static bNodeSocketType *make_socket_type_bool() socktype->get_base_cpp_value = [](const void *socket_value, void *r_value) { *(bool *)r_value = ((bNodeSocketValueBoolean *)socket_value)->value; }; - socktype->geometry_nodes_cpp_type = &blender::CPPType::get>(); + socktype->geometry_nodes_cpp_type = &blender::CPPType::get>(); socktype->get_geometry_nodes_cpp_value = [](const void *socket_value, void *r_value) { const bool value = ((bNodeSocketValueBoolean *)socket_value)->value; - new (r_value) ValueOrField(value); + new (r_value) SocketValueVariant(value); }; return socktype; } @@ -967,12 +949,13 @@ static bNodeSocketType *make_socket_type_rotation() const math::EulerXYZ euler(float3(typed_value.value_euler)); *static_cast(r_value) = math::to_quaternion(euler); }; - socktype->geometry_nodes_cpp_type = &blender::CPPType::get>(); + socktype->geometry_nodes_cpp_type = + &blender::CPPType::get>(); socktype->get_geometry_nodes_cpp_value = [](const void *socket_value, void *r_value) { const auto &typed_value = *(bNodeSocketValueRotation *)socket_value; const math::EulerXYZ euler(float3(typed_value.value_euler)); const math::Quaternion value = math::to_quaternion(euler); - new (r_value) ValueOrField(value); + new (r_value) SocketValueVariant(value); }; return socktype; } @@ -984,10 +967,10 @@ static bNodeSocketType *make_socket_type_float(PropertySubType subtype) socktype->get_base_cpp_value = [](const void *socket_value, void *r_value) { *(float *)r_value = ((bNodeSocketValueFloat *)socket_value)->value; }; - socktype->geometry_nodes_cpp_type = &blender::CPPType::get>(); + socktype->geometry_nodes_cpp_type = &blender::CPPType::get>(); socktype->get_geometry_nodes_cpp_value = [](const void *socket_value, void *r_value) { const float value = ((bNodeSocketValueFloat *)socket_value)->value; - new (r_value) ValueOrField(value); + new (r_value) SocketValueVariant(value); }; return socktype; } @@ -999,10 +982,10 @@ static bNodeSocketType *make_socket_type_int(PropertySubType subtype) socktype->get_base_cpp_value = [](const void *socket_value, void *r_value) { *(int *)r_value = ((bNodeSocketValueInt *)socket_value)->value; }; - socktype->geometry_nodes_cpp_type = &blender::CPPType::get>(); + socktype->geometry_nodes_cpp_type = &blender::CPPType::get>(); socktype->get_geometry_nodes_cpp_value = [](const void *socket_value, void *r_value) { const int value = ((bNodeSocketValueInt *)socket_value)->value; - new (r_value) ValueOrField(value); + new (r_value) SocketValueVariant(value); }; return socktype; } @@ -1014,10 +997,11 @@ static bNodeSocketType *make_socket_type_vector(PropertySubType subtype) socktype->get_base_cpp_value = [](const void *socket_value, void *r_value) { *(blender::float3 *)r_value = ((bNodeSocketValueVector *)socket_value)->value; }; - socktype->geometry_nodes_cpp_type = &blender::CPPType::get>(); + socktype->geometry_nodes_cpp_type = + &blender::CPPType::get>(); socktype->get_geometry_nodes_cpp_value = [](const void *socket_value, void *r_value) { const blender::float3 value = ((bNodeSocketValueVector *)socket_value)->value; - new (r_value) ValueOrField(value); + new (r_value) SocketValueVariant(value); }; return socktype; } @@ -1030,10 +1014,10 @@ static bNodeSocketType *make_socket_type_rgba() *(blender::ColorGeometry4f *)r_value = ((bNodeSocketValueRGBA *)socket_value)->value; }; socktype->geometry_nodes_cpp_type = - &blender::CPPType::get>(); + &blender::CPPType::get>(); socktype->get_geometry_nodes_cpp_value = [](const void *socket_value, void *r_value) { const blender::ColorGeometry4f value = ((bNodeSocketValueRGBA *)socket_value)->value; - new (r_value) ValueOrField(value); + new (r_value) SocketValueVariant(value); }; return socktype; } @@ -1045,12 +1029,12 @@ static bNodeSocketType *make_socket_type_string() socktype->get_base_cpp_value = [](const void *socket_value, void *r_value) { new (r_value) std::string(((bNodeSocketValueString *)socket_value)->value); }; - socktype->geometry_nodes_cpp_type = &blender::CPPType::get>(); + socktype->geometry_nodes_cpp_type = &blender::CPPType::get>(); socktype->get_geometry_nodes_cpp_value = [](const void *socket_value, void *r_value) { std::string value; value.~basic_string(); new (&value) std::string(((bNodeSocketValueString *)socket_value)->value); - new (r_value) ValueOrField(value); + new (r_value) SocketValueVariant(value); }; return socktype; } diff --git a/source/blender/nodes/shader/node_shader_util.cc b/source/blender/nodes/shader/node_shader_util.cc index 70d2d81e5b7..9aab5703a08 100644 --- a/source/blender/nodes/shader/node_shader_util.cc +++ b/source/blender/nodes/shader/node_shader_util.cc @@ -401,3 +401,16 @@ void get_XYZ_to_RGB_for_gpu(XYZ_to_RGB *data) data->b[1] = xyz_to_rgb[5]; data->b[2] = xyz_to_rgb[8]; } + +bool node_socket_not_zero(const GPUNodeStack &socket) +{ + return socket.link || socket.vec[0] > 1e-5f; +} +bool node_socket_not_white(const GPUNodeStack &socket) +{ + return socket.link || socket.vec[0] < 1.0f || socket.vec[1] < 1.0f || socket.vec[2] < 1.0f; +} +bool node_socket_not_black(const GPUNodeStack &socket) +{ + return socket.link || socket.vec[0] > 1e-5f || socket.vec[1] > 1e-5f || socket.vec[2] > 1e-5f; +} diff --git a/source/blender/nodes/shader/node_shader_util.hh b/source/blender/nodes/shader/node_shader_util.hh index fce47c0e7d7..20b87d1b7b5 100644 --- a/source/blender/nodes/shader/node_shader_util.hh +++ b/source/blender/nodes/shader/node_shader_util.hh @@ -72,3 +72,7 @@ void ntreeShaderEndExecTree_internal(bNodeTreeExec *exec); void ntreeExecGPUNodes(bNodeTreeExec *exec, GPUMaterial *mat, bNode *output_node); void get_XYZ_to_RGB_for_gpu(XYZ_to_RGB *data); + +bool node_socket_not_zero(const GPUNodeStack &socket); +bool node_socket_not_white(const GPUNodeStack &socket); +bool node_socket_not_black(const GPUNodeStack &socket); diff --git a/source/blender/nodes/shader/nodes/node_shader_blackbody.cc b/source/blender/nodes/shader/nodes/node_shader_blackbody.cc index 915ee52d310..251b55979af 100644 --- a/source/blender/nodes/shader/nodes/node_shader_blackbody.cc +++ b/source/blender/nodes/shader/nodes/node_shader_blackbody.cc @@ -2,14 +2,19 @@ * * SPDX-License-Identifier: GPL-2.0-or-later */ +#include "FN_multi_function_builder.hh" +#include "NOD_multi_function.hh" #include "node_shader_util.hh" +#include "node_util.hh" +#include "BLI_color.hh" #include "IMB_colormanagement.h" namespace blender::nodes::node_shader_blackbody_cc { static void node_declare(NodeDeclarationBuilder &b) { + b.is_function_node(); b.add_input("Temperature").default_value(1500.0f).min(800.0f).max(12000.0f); b.add_output("Color"); } @@ -31,6 +36,16 @@ static int node_shader_gpu_blackbody(GPUMaterial *mat, return GPU_stack_link(mat, node, "node_blackbody", in, out, ramp_texture, GPU_constant(&layer)); } +static void sh_node_blackbody_build_multi_function(nodes::NodeMultiFunctionBuilder &builder) +{ + static auto fn = mf::build::SI1_SO("Blackbody", [](float temperature) { + float color[4]; + IMB_colormanagement_blackbody_temperature_to_rgb(color, temperature); + return ColorGeometry4f(color); + }); + builder.set_matching_fn(fn); +} + NODE_SHADER_MATERIALX_BEGIN #ifdef WITH_MATERIALX { @@ -57,10 +72,11 @@ void register_node_type_sh_blackbody() static bNodeType ntype; - sh_node_type_base(&ntype, SH_NODE_BLACKBODY, "Blackbody", NODE_CLASS_CONVERTER); + sh_fn_node_type_base(&ntype, SH_NODE_BLACKBODY, "Blackbody", NODE_CLASS_CONVERTER); ntype.declare = file_ns::node_declare; blender::bke::node_type_size_preset(&ntype, blender::bke::eNodeSizePreset::MIDDLE); ntype.gpu_fn = file_ns::node_shader_gpu_blackbody; + ntype.build_multi_function = file_ns::sh_node_blackbody_build_multi_function; ntype.materialx_fn = file_ns::node_shader_materialx; nodeRegisterType(&ntype); diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_translucent.cc b/source/blender/nodes/shader/nodes/node_shader_bsdf_translucent.cc index add64251ace..3857f8175f9 100644 --- a/source/blender/nodes/shader/nodes/node_shader_bsdf_translucent.cc +++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_translucent.cc @@ -24,7 +24,7 @@ static int node_shader_gpu_bsdf_translucent(GPUMaterial *mat, GPU_link(mat, "world_normals_get", &in[1].link); } - GPU_material_flag_set(mat, GPU_MATFLAG_DIFFUSE); + GPU_material_flag_set(mat, GPU_MATFLAG_TRANSLUCENT); return GPU_stack_link(mat, node, "node_bsdf_translucent", in, out); } diff --git a/source/blender/nodes/shader/nodes/node_shader_vector_math.cc b/source/blender/nodes/shader/nodes/node_shader_vector_math.cc index 68069f0df9f..6b92d7cd751 100644 --- a/source/blender/nodes/shader/nodes/node_shader_vector_math.cc +++ b/source/blender/nodes/shader/nodes/node_shader_vector_math.cc @@ -223,7 +223,7 @@ static void node_shader_update_vector_math(bNodeTree *ntree, bNode *node) node_sock_label(sockB, "Increment"); break; case NODE_VECTOR_MATH_REFRACT: - node_sock_label(sockScale, "Ior"); + node_sock_label(sockScale, "IOR"); break; case NODE_VECTOR_MATH_SCALE: node_sock_label(sockScale, "Scale"); diff --git a/source/blender/nodes/shader/nodes/node_shader_volume_absorption.cc b/source/blender/nodes/shader/nodes/node_shader_volume_absorption.cc index e585f64c137..da2542be2ca 100644 --- a/source/blender/nodes/shader/nodes/node_shader_volume_absorption.cc +++ b/source/blender/nodes/shader/nodes/node_shader_volume_absorption.cc @@ -16,19 +16,13 @@ static void node_declare(NodeDeclarationBuilder &b) b.add_output("Volume").translation_context(BLT_I18NCONTEXT_ID_ID); } -#define socket_not_zero(sock) (in[sock].link || (clamp_f(in[sock].vec[0], 0.0f, 1.0f) > 1e-5f)) -#define socket_not_white(sock) \ - (in[sock].link || \ - (clamp_f(in[sock].vec[0], 0.0f, 1.0f) < 1.0f && clamp_f(in[sock].vec[1], 0.0f, 1.0f) < 1.0f && \ - clamp_f(in[sock].vec[2], 0.0f, 1.0f) < 1.0f)) - static int node_shader_gpu_volume_absorption(GPUMaterial *mat, bNode *node, bNodeExecData * /*execdata*/, GPUNodeStack *in, GPUNodeStack *out) { - if (socket_not_zero(SOCK_DENSITY_ID) && socket_not_white(SOCK_COLOR_ID)) { + if (node_socket_not_zero(in[SOCK_DENSITY_ID]) && node_socket_not_white(in[SOCK_COLOR_ID])) { GPU_material_flag_set(mat, GPU_MATFLAG_VOLUME_ABSORPTION); } return GPU_stack_link(mat, node, "node_volume_absorption", in, out); diff --git a/source/blender/nodes/shader/nodes/node_shader_volume_principled.cc b/source/blender/nodes/shader/nodes/node_shader_volume_principled.cc index d70fb65befd..ef25a191eb6 100644 --- a/source/blender/nodes/shader/nodes/node_shader_volume_principled.cc +++ b/source/blender/nodes/shader/nodes/node_shader_volume_principled.cc @@ -56,16 +56,6 @@ static void attribute_post_process(GPUMaterial *mat, } } -#define socket_not_zero(sock) (in[sock].link || (clamp_f(in[sock].vec[0], 0.0f, 1.0f) > 1e-5f)) -#define socket_not_black(sock) \ - (in[sock].link || (clamp_f(in[sock].vec[0], 0.0f, 1.0f) > 1e-5f && \ - clamp_f(in[sock].vec[1], 0.0f, 1.0f) > 1e-5f && \ - clamp_f(in[sock].vec[2], 0.0f, 1.0f) > 1e-5f)) -#define socket_not_white(sock) \ - (in[sock].link || \ - (clamp_f(in[sock].vec[0], 0.0f, 1.0f) < 1.0f && clamp_f(in[sock].vec[1], 0.0f, 1.0f) < 1.0f && \ - clamp_f(in[sock].vec[2], 0.0f, 1.0f) < 1.0f)) - static int node_shader_gpu_volume_principled(GPUMaterial *mat, bNode *node, bNodeExecData * /*execdata*/, @@ -73,14 +63,16 @@ static int node_shader_gpu_volume_principled(GPUMaterial *mat, GPUNodeStack *out) { /* Test if blackbody intensity is enabled. */ - bool use_blackbody = socket_not_zero(SOCK_BLACKBODY_INTENSITY_ID); + bool use_blackbody = node_socket_not_zero(in[SOCK_BLACKBODY_INTENSITY_ID]); - if (socket_not_zero(SOCK_DENSITY_ID) && socket_not_black(SOCK_COLOR_ID)) { + if (node_socket_not_zero(in[SOCK_DENSITY_ID]) && node_socket_not_black(in[SOCK_COLOR_ID])) { /* Consider there is absorption phenomenon when there is scattering since * `extinction = scattering + absorption`. */ GPU_material_flag_set(mat, GPU_MATFLAG_VOLUME_SCATTER | GPU_MATFLAG_VOLUME_ABSORPTION); } - if (socket_not_zero(SOCK_DENSITY_ID) && socket_not_white(SOCK_ABSORPTION_COLOR_ID)) { + if (node_socket_not_zero(in[SOCK_DENSITY_ID]) && + node_socket_not_white(in[SOCK_ABSORPTION_COLOR_ID])) + { GPU_material_flag_set(mat, GPU_MATFLAG_VOLUME_ABSORPTION); } diff --git a/source/blender/python/generic/idprop_py_ui_api.cc b/source/blender/python/generic/idprop_py_ui_api.cc index c04fa040c3e..2a6f869a3a7 100644 --- a/source/blender/python/generic/idprop_py_ui_api.cc +++ b/source/blender/python/generic/idprop_py_ui_api.cc @@ -66,6 +66,105 @@ static bool idprop_ui_data_update_base(IDPropertyUIData *ui_data, return true; } +/* Utility function for parsing ints in an if statement. */ +static bool py_long_as_int(PyObject *py_long, int *r_int) +{ + if (PyLong_CheckExact(py_long)) { + *r_int = int(PyLong_AS_LONG(py_long)); + return true; + } + return false; +} + +/** + * Similar to #enum_items_from_py, which parses enum items for RNA properties. + * This function is simpler, since it doesn't have to parse a default value or handle the case of + * enum flags (PROP_ENUM_FLAG). + */ +static bool try_parse_enum_item(PyObject *py_item, const int index, IDPropertyUIDataEnumItem &item) +{ + if (!PyTuple_CheckExact(py_item)) { + return false; + } + Py_ssize_t item_size = PyTuple_GET_SIZE(py_item); + if (item_size < 3 || item_size > 5) { + return false; + } + + Py_ssize_t identifier_len; + Py_ssize_t name_len; + Py_ssize_t description_len; + const char *identifier = PyUnicode_AsUTF8AndSize(PyTuple_GET_ITEM(py_item, 0), &identifier_len); + const char *name = PyUnicode_AsUTF8AndSize(PyTuple_GET_ITEM(py_item, 1), &name_len); + const char *description = PyUnicode_AsUTF8AndSize(PyTuple_GET_ITEM(py_item, 2), + &description_len); + if (!identifier || !name || !description) { + return false; + } + + const char *icon_name = nullptr; + if (item_size <= 3) { + item.value = index; + } + else if (item_size == 4) { + if (!py_long_as_int(PyTuple_GET_ITEM(py_item, 3), &item.value)) { + return false; + } + } + else if (item_size == 5) { + /* Must have icon value or name. */ + if (!py_long_as_int(PyTuple_GET_ITEM(py_item, 3), &item.icon) && + !(icon_name = PyUnicode_AsUTF8(PyTuple_GET_ITEM(py_item, 3)))) + { + return false; + } + if (!py_long_as_int(PyTuple_GET_ITEM(py_item, 4), &item.value)) { + return false; + } + } + + item.identifier = BLI_strdup(identifier); + item.name = BLI_strdup(name); + item.description = BLI_strdup_null(description); + if (icon_name) { + RNA_enum_value_from_identifier(rna_enum_icon_items, icon_name, &item.icon); + } + return true; +} + +static IDPropertyUIDataEnumItem *idprop_enum_items_from_py(PyObject *seq_fast, int &r_items_num) +{ + IDPropertyUIDataEnumItem *items; + + const Py_ssize_t seq_len = PySequence_Fast_GET_SIZE(seq_fast); + PyObject **seq_fast_items = PySequence_Fast_ITEMS(seq_fast); + int i; + + items = MEM_cnew_array(seq_len, __func__); + r_items_num = seq_len; + + for (i = 0; i < seq_len; i++) { + IDPropertyUIDataEnumItem item = {nullptr, nullptr, nullptr, 0, 0}; + PyObject *py_item = seq_fast_items[i]; + if (try_parse_enum_item(py_item, i, item)) { + items[i] = item; + } + else if (py_item == Py_None) { + items[i].identifier = nullptr; + } + else { + MEM_freeN(items); + PyErr_SetString(PyExc_TypeError, + "expected a tuple containing " + "(identifier, name, description) and optionally an " + "icon name and unique number"); + return nullptr; + } + } + + return items; +} + /** * \note The default value needs special handling because for array IDProperties it can * be a single value or an array, but for non-array properties it can only be a value. @@ -114,11 +213,22 @@ static bool idprop_ui_data_update_int(IDProperty *idprop, PyObject *args, PyObje const char *description = nullptr; int min, max, soft_min, soft_max, step; PyObject *default_value = nullptr; + PyObject *items = nullptr; const char *kwlist[] = { - "min", "max", "soft_min", "soft_max", "step", "default", "subtype", "description", nullptr}; + "min", + "max", + "soft_min", + "soft_max", + "step", + "default", + "items", + "subtype", + "description", + nullptr, + }; if (!PyArg_ParseTupleAndKeywords(args, kwargs, - "|$iiiiiOzz:update", + "|$iiiiiOOzz:update", (char **)kwlist, &min, &max, @@ -126,6 +236,7 @@ static bool idprop_ui_data_update_int(IDProperty *idprop, PyObject *args, PyObje &soft_max, &step, &default_value, + &items, &rna_subtype, &description)) { @@ -173,6 +284,32 @@ static bool idprop_ui_data_update_int(IDProperty *idprop, PyObject *args, PyObje } } + if (!ELEM(items, nullptr, Py_None)) { + PyObject *items_fast; + if (!(items_fast = PySequence_Fast(items, "expected a sequence of tuples for the enum items"))) + { + return false; + } + + int idprop_items_num = 0; + IDPropertyUIDataEnumItem *idprop_items = idprop_enum_items_from_py(items_fast, + idprop_items_num); + if (!idprop_items) { + Py_DECREF(items_fast); + return false; + } + if (!IDP_EnumItemsValidate(idprop_items, idprop_items_num, [](const char *msg) { + PyErr_SetString(PyExc_ValueError, msg); + })) + { + Py_DECREF(items_fast); + return false; + } + Py_DECREF(items_fast); + ui_data.enum_items = idprop_items; + ui_data.enum_items_num = idprop_items_num; + } + /* Write back to the property's UI data. */ IDP_ui_data_free_unique_contents(&ui_data_orig->base, IDP_ui_data_type(idprop), &ui_data.base); *ui_data_orig = ui_data; @@ -482,6 +619,7 @@ PyDoc_STRVAR(BPy_IDPropertyUIManager_update_doc, "step=None, " "default=None, " "id_type=None, " + "items=None, " "description=None)\n" "\n" " Update the RNA information of the IDProperty used for interaction and\n" @@ -567,6 +705,27 @@ static void idprop_ui_data_to_dict_int(IDProperty *property, PyObject *dict) PyDict_SetItemString(dict, "default", item = PyLong_FromLong(ui_data->default_value)); Py_DECREF(item); } + + if (ui_data->enum_items_num > 0) { + PyObject *items_list = PyList_New(ui_data->enum_items_num); + for (int i = 0; i < ui_data->enum_items_num; ++i) { + const IDPropertyUIDataEnumItem &item = ui_data->enum_items[i]; + BLI_assert(item.identifier != nullptr); + BLI_assert(item.name != nullptr); + + PyObject *item_tuple = PyTuple_New(5); + PyTuple_SET_ITEM(item_tuple, 0, PyUnicode_FromString(item.identifier)); + PyTuple_SET_ITEM(item_tuple, 1, PyUnicode_FromString(item.name)); + PyTuple_SET_ITEM( + item_tuple, 2, PyUnicode_FromString(item.description ? item.description : "")); + PyTuple_SET_ITEM(item_tuple, 3, PyLong_FromLong(item.icon)); + PyTuple_SET_ITEM(item_tuple, 4, PyLong_FromLong(item.value)); + + PyList_SET_ITEM(items_list, i, item_tuple); + } + PyDict_SetItemString(dict, "items", items_list); + Py_DECREF(items_list); + } } static void idprop_ui_data_to_dict_bool(IDProperty *property, PyObject *dict) @@ -636,17 +795,17 @@ static void idprop_ui_data_to_dict_id(IDProperty *property, PyObject *dict) short id_type_value = ui_data->id_type; if (id_type_value == 0) { - /* While UI exposed custom properties do not allow the 'all ID types' `0` value, in py-defined - * IDProperties it is accepted. So force defining a valid id_type value when this function is - * called. */ + /* While UI exposed custom properties do not allow the 'all ID types' `0` value, in + * py-defined IDProperties it is accepted. So force defining a valid id_type value when this + * function is called. */ ID *id = IDP_Id(property); id_type_value = id ? GS(id->name) : ID_OB; } const char *id_type = nullptr; if (!RNA_enum_identifier(rna_enum_id_type_items, id_type_value, &id_type)) { - /* Same fall-back as above, in case it is an unknown ID type (from a future version of Blender - * e.g.). */ + /* Same fall-back as above, in case it is an unknown ID type (from a future version of + * Blender e.g.). */ RNA_enum_identifier(rna_enum_id_type_items, ID_OB, &id_type); } PyObject *item = PyUnicode_FromString(id_type); diff --git a/source/blender/python/gpu/gpu_py_shader_create_info.cc b/source/blender/python/gpu/gpu_py_shader_create_info.cc index 7c27cd576b3..f775b001beb 100644 --- a/source/blender/python/gpu/gpu_py_shader_create_info.cc +++ b/source/blender/python/gpu/gpu_py_shader_create_info.cc @@ -131,6 +131,9 @@ static const PyC_StringEnumItems pygpu_imagetype_items[] = { {int(ImageType::INT_3D), "INT_3D"}, {int(ImageType::INT_CUBE), "INT_CUBE"}, {int(ImageType::INT_CUBE_ARRAY), "INT_CUBE_ARRAY"}, + {int(ImageType::INT_2D_ATOMIC), "INT_2D_ATOMIC"}, + {int(ImageType::INT_2D_ARRAY_ATOMIC), "INT_2D_ARRAY_ATOMIC"}, + {int(ImageType::INT_3D_ATOMIC), "INT_3D_ATOMIC"}, {int(ImageType::UINT_BUFFER), "UINT_BUFFER"}, {int(ImageType::UINT_1D), "UINT_1D"}, {int(ImageType::UINT_1D_ARRAY), "UINT_1D_ARRAY"}, @@ -139,6 +142,9 @@ static const PyC_StringEnumItems pygpu_imagetype_items[] = { {int(ImageType::UINT_3D), "UINT_3D"}, {int(ImageType::UINT_CUBE), "UINT_CUBE"}, {int(ImageType::UINT_CUBE_ARRAY), "UINT_CUBE_ARRAY"}, + {int(ImageType::UINT_2D_ATOMIC), "UINT_2D_ATOMIC"}, + {int(ImageType::UINT_2D_ARRAY_ATOMIC), "UINT_2D_ARRAY_ATOMIC"}, + {int(ImageType::UINT_3D_ATOMIC), "UINT_3D_ATOMIC"}, {int(ImageType::SHADOW_2D), "SHADOW_2D"}, {int(ImageType::SHADOW_2D_ARRAY), "SHADOW_2D_ARRAY"}, {int(ImageType::SHADOW_CUBE), "SHADOW_CUBE"}, diff --git a/source/blender/python/intern/bpy_app_opensubdiv.cc b/source/blender/python/intern/bpy_app_opensubdiv.cc index 45ed1adaa7e..eefe60230ba 100644 --- a/source/blender/python/intern/bpy_app_opensubdiv.cc +++ b/source/blender/python/intern/bpy_app_opensubdiv.cc @@ -14,7 +14,7 @@ #include "../generic/py_capi_utils.h" #ifdef WITH_OPENSUBDIV -# include "opensubdiv_capi.h" +# include "opensubdiv_capi.hh" #endif static PyTypeObject BlenderAppOpenSubdivType; diff --git a/source/blender/python/intern/bpy_library_load.cc b/source/blender/python/intern/bpy_library_load.cc index f668433efef..01e1cc7d220 100644 --- a/source/blender/python/intern/bpy_library_load.cc +++ b/source/blender/python/intern/bpy_library_load.cc @@ -22,7 +22,7 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BKE_blendfile_link_append.h" +#include "BKE_blendfile_link_append.hh" #include "BKE_context.hh" #include "BKE_idtype.h" #include "BKE_lib_id.h" diff --git a/source/blender/python/intern/bpy_library_write.cc b/source/blender/python/intern/bpy_library_write.cc index 13e62e7983c..84e988f6ff0 100644 --- a/source/blender/python/intern/bpy_library_write.cc +++ b/source/blender/python/intern/bpy_library_write.cc @@ -18,7 +18,7 @@ #include "BLI_string.h" #include "BLI_utildefines.h" -#include "BKE_blendfile.h" +#include "BKE_blendfile.hh" #include "BKE_global.h" #include "BKE_main.hh" #include "BKE_report.h" diff --git a/source/blender/python/intern/bpy_rna_context.cc b/source/blender/python/intern/bpy_rna_context.cc index 15cd28bfabe..21a0dd825df 100644 --- a/source/blender/python/intern/bpy_rna_context.cc +++ b/source/blender/python/intern/bpy_rna_context.cc @@ -114,6 +114,15 @@ struct BPyContextTempOverride { ContextStore ctx_init; ContextStore ctx_temp; + + struct { + /** + * The original screen of `ctx_temp.win`, needed when restoring this windows screen as it + * won't be `ctx_init.screen` (when switching the window as well as the screen), see #115937. + */ + bScreen *screen; + } ctx_temp_orig; + /** Bypass Python overrides set when calling an operator from Python. */ bContext_PyState py_state; /** @@ -248,6 +257,12 @@ static PyObject *bpy_rna_context_temp_override_enter(BPyContextTempOverride *sel } } + /* Manipulate the context (setup). */ + if (self->ctx_temp.screen_is_set) { + self->ctx_temp_orig.screen = WM_window_get_active_screen(win); + bpy_rna_context_temp_set_screen_for_window(C, win, self->ctx_temp.screen); + } + /* NOTE: always set these members, even when they are equal to the current values because * setting the window (for e.g.) clears the area & region, setting the area clears the region. * While it would be useful in some cases to leave the context as-is when setting members @@ -262,7 +277,6 @@ static PyObject *bpy_rna_context_temp_override_enter(BPyContextTempOverride *sel CTX_wm_window_set(C, self->ctx_temp.win); } if (self->ctx_temp.screen_is_set) { - bpy_rna_context_temp_set_screen_for_window(C, win, self->ctx_temp.screen); CTX_wm_screen_set(C, self->ctx_temp.screen); } if (self->ctx_temp.area_is_set) { @@ -282,6 +296,16 @@ static PyObject *bpy_rna_context_temp_override_exit(BPyContextTempOverride *self Main *bmain = CTX_data_main(C); + /* Manipulate the context (restore). */ + if (self->ctx_temp.screen_is_set) { + if (self->ctx_temp_orig.screen && wm_check_screen_exists(bmain, self->ctx_temp_orig.screen)) { + wmWindow *win = self->ctx_temp.win_is_set ? self->ctx_temp.win : self->ctx_init.win; + if (win && wm_check_window_exists(bmain, win)) { + bpy_rna_context_temp_set_screen_for_window(C, win, self->ctx_temp_orig.screen); + } + } + } + /* Account for for the window to be freed on file-read, * in this case the window should not be restored, see: #92818. * Also account for other windowing members to be removed on exit, @@ -330,7 +354,6 @@ static PyObject *bpy_rna_context_temp_override_exit(BPyContextTempOverride *self if (do_restore) { if (self->ctx_init.screen_is_set || is_container_set) { - bpy_rna_context_temp_set_screen_for_window(C, self->ctx_init.win, self->ctx_init.screen); CTX_wm_screen_set(C, self->ctx_init.screen); is_container_set = true; } @@ -611,6 +634,8 @@ static PyObject *bpy_context_temp_override(PyObject *self, PyObject *args, PyObj ret->ctx_temp = ctx_temp; memset(&ret->ctx_init, 0, sizeof(ret->ctx_init)); + ret->ctx_temp_orig.screen = nullptr; + ret->py_state_context_dict = kwds; return (PyObject *)ret; diff --git a/source/blender/python/mathutils/mathutils.cc b/source/blender/python/mathutils/mathutils.cc index bd7b803f344..55771dfd104 100644 --- a/source/blender/python/mathutils/mathutils.cc +++ b/source/blender/python/mathutils/mathutils.cc @@ -369,71 +369,40 @@ int mathutils_array_parse_alloc_vi(int **array, return size; } -int mathutils_array_parse_alloc_viseq( - int **array, int **start_table, int **len_table, PyObject *value, const char *error_prefix) +bool mathutils_array_parse_alloc_viseq(PyObject *value, + const char *error_prefix, + blender::Array> &r_data) { - PyObject *value_fast, *subseq; - int i, size, start, subseq_len; - int *ip; - - *array = nullptr; - *start_table = nullptr; - *len_table = nullptr; + PyObject *value_fast; if (!(value_fast = PySequence_Fast(value, error_prefix))) { /* PySequence_Fast sets the error */ - return -1; + return false; } - size = PySequence_Fast_GET_SIZE(value_fast); - + const int size = PySequence_Fast_GET_SIZE(value_fast); if (size != 0) { PyObject **value_fast_items = PySequence_Fast_ITEMS(value_fast); - - *start_table = static_cast(PyMem_Malloc(size * sizeof(int))); - *len_table = static_cast(PyMem_Malloc(size * sizeof(int))); - - /* First pass to set starts and len, and calculate size of array needed */ - start = 0; - for (i = 0; i < size; i++) { - subseq = value_fast_items[i]; - if ((subseq_len = int(PySequence_Size(subseq))) == -1) { + r_data.reinitialize(size); + for (const int64_t i : r_data.index_range()) { + PyObject *subseq = value_fast_items[i]; + const int subseq_len = int(PySequence_Size(subseq)); + if (subseq_len == -1) { PyErr_Format( PyExc_ValueError, "%.200s: sequence expected to have subsequences", error_prefix); - PyMem_Free(*start_table); - PyMem_Free(*len_table); Py_DECREF(value_fast); - *start_table = nullptr; - *len_table = nullptr; - return -1; + return false; } - (*start_table)[i] = start; - (*len_table)[i] = subseq_len; - start += subseq_len; - } - - ip = *array = static_cast(PyMem_Malloc(start * sizeof(int))); - - /* Second pass to parse the subsequences into array */ - for (i = 0; i < size; i++) { - subseq = value_fast_items[i]; - subseq_len = (*len_table)[i]; - - if (mathutils_int_array_parse(ip, subseq_len, subseq, error_prefix) == -1) { - PyMem_Free(*array); - PyMem_Free(*start_table); - PyMem_Free(*len_table); - *array = nullptr; - *len_table = nullptr; - *start_table = nullptr; - size = -1; - break; + r_data[i].resize(subseq_len); + blender::MutableSpan group = r_data[i]; + if (mathutils_int_array_parse(group.data(), group.size(), subseq, error_prefix) == -1) { + Py_DECREF(value_fast); + return false; } - ip += subseq_len; } } Py_DECREF(value_fast); - return size; + return true; } int mathutils_any_to_rotmat(float rmat[3][3], PyObject *value, const char *error_prefix) diff --git a/source/blender/python/mathutils/mathutils.h b/source/blender/python/mathutils/mathutils.h index 04973c9c51c..676a64ea40b 100644 --- a/source/blender/python/mathutils/mathutils.h +++ b/source/blender/python/mathutils/mathutils.h @@ -10,7 +10,9 @@ /* Can cast different mathutils types to this, use for generic functions. */ +#include "BLI_array.hh" #include "BLI_compiler_attrs.h" +#include "BLI_vector.hh" struct DynStr; @@ -187,14 +189,11 @@ int mathutils_array_parse_alloc_vi(int **array, PyObject *value, const char *error_prefix); /** - * Parse sequence of variable-length sequences of int and return allocated - * triple of arrays to represent the result: - * The flattened sequences are put into *array. - * The start index of each sequence goes into start_table. - * The length of each index goes into len_table. + * Parse sequence of variable-length sequences of integers and fill r_data with their values. */ -int mathutils_array_parse_alloc_viseq( - int **array, int **start_table, int **len_table, PyObject *value, const char *error_prefix); +bool mathutils_array_parse_alloc_viseq(PyObject *value, + const char *error_prefix, + blender::Array> &r_data); int mathutils_any_to_rotmat(float rmat[3][3], PyObject *value, const char *error_prefix); /** diff --git a/source/blender/python/mathutils/mathutils_geometry.cc b/source/blender/python/mathutils/mathutils_geometry.cc index a231e57e305..5b200cc240a 100644 --- a/source/blender/python/mathutils/mathutils_geometry.cc +++ b/source/blender/python/mathutils/mathutils_geometry.cc @@ -18,7 +18,7 @@ # include "BLI_blenlib.h" # include "BLI_boxpack_2d.h" # include "BLI_convexhull_2d.h" -# include "BLI_delaunay_2d.h" +# include "BLI_delaunay_2d.hh" # include "MEM_guardedalloc.h" #endif /* !MATH_STANDALONE */ @@ -1536,25 +1536,17 @@ static PyObject *M_Geometry_convex_hull_2d(PyObject * /*self*/, PyObject *pointl * to fill values, with start_table and len_table giving the start index * and length of the toplevel_len sub-lists. */ -static PyObject *list_of_lists_from_arrays(const int *array, - const int *start_table, - const int *len_table, - int toplevel_len) +static PyObject *list_of_lists_from_arrays(const blender::Span> data) { - PyObject *ret, *sublist; - int i, j, sublist_len, sublist_start, val; - - if (array == nullptr) { + if (data.is_empty()) { return PyList_New(0); } - ret = PyList_New(toplevel_len); - for (i = 0; i < toplevel_len; i++) { - sublist_len = len_table[i]; - sublist = PyList_New(sublist_len); - sublist_start = start_table[i]; - for (j = 0; j < sublist_len; j++) { - val = array[sublist_start + j]; - PyList_SET_ITEM(sublist, j, PyLong_FromLong(val)); + PyObject *ret = PyList_New(data.size()); + for (const int i : data.index_range()) { + const blender::Span group = data[i]; + PyObject *sublist = PyList_New(group.size()); + for (const int j : group.index_range()) { + PyList_SET_ITEM(sublist, j, PyLong_FromLong(group[j])); } PyList_SET_ITEM(ret, i, sublist); } @@ -1606,19 +1598,15 @@ PyDoc_STRVAR( "\n"); static PyObject *M_Geometry_delaunay_2d_cdt(PyObject * /*self*/, PyObject *args) { + using namespace blender; const char *error_prefix = "delaunay_2d_cdt"; - PyObject *vert_coords, *edges, *faces, *item; + PyObject *vert_coords, *edges, *faces; int output_type; float epsilon; bool need_ids = true; float(*in_coords)[2] = nullptr; int(*in_edges)[2] = nullptr; - int *in_faces = nullptr; - int *in_faces_start_table = nullptr; - int *in_faces_len_table = nullptr; - Py_ssize_t vert_coords_len, edges_len, faces_len; - CDT_input in; - CDT_result *res = nullptr; + Py_ssize_t vert_coords_len, edges_len; PyObject *out_vert_coords = nullptr; PyObject *out_edges = nullptr; PyObject *out_faces = nullptr; @@ -1626,7 +1614,6 @@ static PyObject *M_Geometry_delaunay_2d_cdt(PyObject * /*self*/, PyObject *args) PyObject *out_orig_edges = nullptr; PyObject *out_orig_faces = nullptr; PyObject *ret_value = nullptr; - int i; if (!PyArg_ParseTuple(args, "OOOif|p:delaunay_2d_cdt", @@ -1640,6 +1627,15 @@ static PyObject *M_Geometry_delaunay_2d_cdt(PyObject * /*self*/, PyObject *args) return nullptr; } + BLI_SCOPED_DEFER([&]() { + if (in_coords != nullptr) { + PyMem_Free(in_coords); + } + if (in_edges != nullptr) { + PyMem_Free(in_edges); + } + }); + vert_coords_len = mathutils_array_parse_alloc_v( (float **)&in_coords, 2, vert_coords, error_prefix); if (vert_coords_len == -1) { @@ -1648,86 +1644,65 @@ static PyObject *M_Geometry_delaunay_2d_cdt(PyObject * /*self*/, PyObject *args) edges_len = mathutils_array_parse_alloc_vi((int **)&in_edges, 2, edges, error_prefix); if (edges_len == -1) { - goto exit_cdt; + return nullptr; } - faces_len = mathutils_array_parse_alloc_viseq( - &in_faces, &in_faces_start_table, &in_faces_len_table, faces, error_prefix); - if (faces_len == -1) { - goto exit_cdt; + Array> in_faces; + if (!mathutils_array_parse_alloc_viseq(faces, error_prefix, in_faces)) { + return nullptr; } - in.verts_len = int(vert_coords_len); - in.vert_coords = in_coords; - in.edges_len = edges_len; - in.faces_len = faces_len; - in.edges = in_edges; - in.faces = in_faces; - in.faces_start_table = in_faces_start_table; - in.faces_len_table = in_faces_len_table; + Array verts(vert_coords_len); + for (const int i : verts.index_range()) { + verts[i] = {double(in_coords[i][0]), double(in_coords[i][1])}; + } + + meshintersect::CDT_input in; + in.vert = std::move(verts); + in.edge = Span(reinterpret_cast *>(in_edges), edges_len); + in.face = std::move(in_faces); in.epsilon = epsilon; in.need_ids = need_ids; - res = BLI_delaunay_2d_cdt_calc(&in, CDT_output_type(output_type)); + const meshintersect::CDT_result res = meshintersect::delaunay_2d_calc( + in, CDT_output_type(output_type)); ret_value = PyTuple_New(6); - out_vert_coords = PyList_New(res->verts_len); - for (i = 0; i < res->verts_len; i++) { - item = Vector_CreatePyObject(res->vert_coords[i], 2, nullptr); + out_vert_coords = PyList_New(res.vert.size()); + for (const int i : res.vert.index_range()) { + const float2 vert_float(res.vert[i]); + PyObject *item = Vector_CreatePyObject(vert_float, 2, nullptr); if (item == nullptr) { Py_DECREF(ret_value); Py_DECREF(out_vert_coords); - goto exit_cdt; + return nullptr; } PyList_SET_ITEM(out_vert_coords, i, item); } PyTuple_SET_ITEM(ret_value, 0, out_vert_coords); - out_edges = PyList_New(res->edges_len); - for (i = 0; i < res->edges_len; i++) { - item = PyTuple_New(2); - PyTuple_SET_ITEM(item, 0, PyLong_FromLong(long(res->edges[i][0]))); - PyTuple_SET_ITEM(item, 1, PyLong_FromLong(long(res->edges[i][1]))); + out_edges = PyList_New(res.edge.size()); + for (const int i : res.edge.index_range()) { + PyObject *item = PyTuple_New(2); + PyTuple_SET_ITEM(item, 0, PyLong_FromLong(long(res.edge[i].first))); + PyTuple_SET_ITEM(item, 1, PyLong_FromLong(long(res.edge[i].second))); PyList_SET_ITEM(out_edges, i, item); } PyTuple_SET_ITEM(ret_value, 1, out_edges); - out_faces = list_of_lists_from_arrays( - res->faces, res->faces_start_table, res->faces_len_table, res->faces_len); + out_faces = list_of_lists_from_arrays(res.face); PyTuple_SET_ITEM(ret_value, 2, out_faces); - out_orig_verts = list_of_lists_from_arrays( - res->verts_orig, res->verts_orig_start_table, res->verts_orig_len_table, res->verts_len); + out_orig_verts = list_of_lists_from_arrays(res.vert_orig); PyTuple_SET_ITEM(ret_value, 3, out_orig_verts); - out_orig_edges = list_of_lists_from_arrays( - res->edges_orig, res->edges_orig_start_table, res->edges_orig_len_table, res->edges_len); + out_orig_edges = list_of_lists_from_arrays(res.edge_orig); PyTuple_SET_ITEM(ret_value, 4, out_orig_edges); - out_orig_faces = list_of_lists_from_arrays( - res->faces_orig, res->faces_orig_start_table, res->faces_orig_len_table, res->faces_len); + out_orig_faces = list_of_lists_from_arrays(res.face_orig); PyTuple_SET_ITEM(ret_value, 5, out_orig_faces); -exit_cdt: - if (in_coords != nullptr) { - PyMem_Free(in_coords); - } - if (in_edges != nullptr) { - PyMem_Free(in_edges); - } - if (in_faces != nullptr) { - PyMem_Free(in_faces); - } - if (in_faces_start_table != nullptr) { - PyMem_Free(in_faces_start_table); - } - if (in_faces_len_table != nullptr) { - PyMem_Free(in_faces_len_table); - } - if (res) { - BLI_delaunay_2d_cdt_free(res); - } return ret_value; } diff --git a/source/blender/render/CMakeLists.txt b/source/blender/render/CMakeLists.txt index 7faa4393627..f7b39a0a9f6 100644 --- a/source/blender/render/CMakeLists.txt +++ b/source/blender/render/CMakeLists.txt @@ -11,6 +11,7 @@ set(INC ../compositor/realtime_compositor ../compositor/realtime_compositor/cached_resources ../draw + ../draw/intern ../gpu ../gpu/intern ../imbuf diff --git a/source/blender/render/RE_compositor.hh b/source/blender/render/RE_compositor.hh index ee95c95d8d3..a4d0c5c463a 100644 --- a/source/blender/render/RE_compositor.hh +++ b/source/blender/render/RE_compositor.hh @@ -6,6 +6,10 @@ #include +namespace blender::realtime_compositor { +class RenderContext; +} + struct bNodeTree; struct Depsgraph; struct Render; @@ -29,7 +33,8 @@ void RE_compositor_execute(Render &render, const RenderData &render_data, const bNodeTree &node_tree, const bool use_file_output, - const char *view_name); + const char *view_name, + blender::realtime_compositor::RenderContext *render_context); /* Free compositor caches. */ void RE_compositor_free(Render &render); diff --git a/source/blender/render/intern/bake.cc b/source/blender/render/intern/bake.cc index 97c36b58973..1a5a56dfb73 100644 --- a/source/blender/render/intern/bake.cc +++ b/source/blender/render/intern/bake.cc @@ -459,7 +459,7 @@ static TriTessFace *mesh_calc_tri_tessface(Mesh *mesh, bool tangent, Mesh *me_ev int i; const int tottri = poly_to_tri_count(mesh->faces_num, mesh->totloop); - MLoopTri *looptri; + MLoopTri *looptris; TriTessFace *triangles; /* calculate normal for each face only once */ @@ -473,7 +473,7 @@ static TriTessFace *mesh_calc_tri_tessface(Mesh *mesh, bool tangent, Mesh *me_ev const VArray sharp_faces = attributes.lookup_or_default("sharp_face", ATTR_DOMAIN_FACE, false).varray; - looptri = static_cast(MEM_mallocN(sizeof(*looptri) * tottri, __func__)); + looptris = static_cast(MEM_mallocN(sizeof(*looptris) * tottri, __func__)); triangles = static_cast(MEM_callocN(sizeof(TriTessFace) * tottri, __func__)); const bool calculate_normal = BKE_mesh_face_normals_are_dirty(mesh); @@ -484,10 +484,10 @@ static TriTessFace *mesh_calc_tri_tessface(Mesh *mesh, bool tangent, Mesh *me_ev if (!precomputed_normals.is_empty()) { blender::bke::mesh::looptris_calc_with_normals( - positions, faces, corner_verts, precomputed_normals, {looptri, tottri}); + positions, faces, corner_verts, precomputed_normals, {looptris, tottri}); } else { - blender::bke::mesh::looptris_calc(positions, faces, corner_verts, {looptri, tottri}); + blender::bke::mesh::looptris_calc(positions, faces, corner_verts, {looptris, tottri}); } const TSpace *tspace = nullptr; @@ -504,7 +504,7 @@ static TriTessFace *mesh_calc_tri_tessface(Mesh *mesh, bool tangent, Mesh *me_ev const blender::Span vert_normals = mesh->vert_normals(); const blender::Span looptri_faces = mesh->looptri_faces(); for (i = 0; i < tottri; i++) { - const MLoopTri *lt = &looptri[i]; + const MLoopTri *lt = &looptris[i]; const int face_i = looptri_faces[i]; triangles[i].positions[0] = positions[corner_verts[lt->tri[0]]]; @@ -539,7 +539,7 @@ static TriTessFace *mesh_calc_tri_tessface(Mesh *mesh, bool tangent, Mesh *me_ev } } - MEM_freeN(looptri); + MEM_freeN(looptris); return triangles; } @@ -599,9 +599,9 @@ bool RE_bake_pixels_populate_from_objects(Mesh *me_low, me_highpoly[i] = highpoly[i].mesh; - if (BKE_mesh_runtime_looptri_len(me_highpoly[i]) != 0) { + if (BKE_mesh_runtime_looptris_len(me_highpoly[i]) != 0) { /* Create a BVH-tree for each `highpoly` object. */ - BKE_bvhtree_from_mesh_get(&treeData[i], me_highpoly[i], BVHTREE_FROM_LOOPTRI, 2); + BKE_bvhtree_from_mesh_get(&treeData[i], me_highpoly[i], BVHTREE_FROM_LOOPTRIS, 2); if (treeData[i].tree == nullptr) { printf("Baking: out of memory while creating BHVTree for object \"%s\"\n", @@ -720,6 +720,7 @@ void RE_bake_pixels_populate(Mesh *mesh, const BakeTargets *targets, const char *uv_layer) { + using namespace blender; const float(*mloopuv)[2]; if ((uv_layer == nullptr) || (uv_layer[0] == '\0')) { mloopuv = static_cast( @@ -750,24 +751,25 @@ void RE_bake_pixels_populate(Mesh *mesh, } const int tottri = poly_to_tri_count(mesh->faces_num, mesh->totloop); - MLoopTri *looptri = static_cast(MEM_mallocN(sizeof(*looptri) * tottri, __func__)); + MLoopTri *looptris = static_cast(MEM_mallocN(sizeof(*looptris) * tottri, __func__)); blender::bke::mesh::looptris_calc( - mesh->vert_positions(), mesh->faces(), mesh->corner_verts(), {looptri, tottri}); + mesh->vert_positions(), mesh->faces(), mesh->corner_verts(), {looptris, tottri}); const blender::Span looptri_faces = mesh->looptri_faces(); + const bke::AttributeAccessor attributes = mesh->attributes(); + const VArraySpan material_indices = *attributes.lookup("material_index", ATTR_DOMAIN_FACE); - const int *material_indices = BKE_mesh_material_indices(mesh); const int materials_num = targets->materials_num; for (int i = 0; i < tottri; i++) { - const MLoopTri *lt = &looptri[i]; + const MLoopTri *lt = &looptris[i]; const int face_i = looptri_faces[i]; bd.primitive_id = i; /* Find images matching this material. */ - const int material_index = (material_indices && materials_num) ? + const int material_index = (!material_indices.is_empty() && materials_num) ? clamp_i(material_indices[face_i], 0, materials_num - 1) : 0; Image *image = targets->material_to_image[material_index]; @@ -802,7 +804,7 @@ void RE_bake_pixels_populate(Mesh *mesh, zbuf_free_span(&bd.zspan[i]); } - MEM_freeN(looptri); + MEM_freeN(looptris); MEM_freeN(bd.zspan); } diff --git a/source/blender/render/intern/compositor.cc b/source/blender/render/intern/compositor.cc index 3519cbccaad..c40fc10c7b9 100644 --- a/source/blender/render/intern/compositor.cc +++ b/source/blender/render/intern/compositor.cc @@ -10,12 +10,15 @@ #include "MEM_guardedalloc.h" +#include "DNA_ID.h" + #include "BKE_global.h" #include "BKE_image.h" #include "BKE_node.hh" #include "BKE_scene.h" #include "DRW_engine.h" +#include "DRW_render.h" #include "IMB_colormanagement.h" #include "IMB_imbuf.h" @@ -24,6 +27,7 @@ #include "COM_context.hh" #include "COM_evaluator.hh" +#include "COM_render_context.hh" #include "RE_compositor.hh" #include "RE_pipeline.h" @@ -119,17 +123,20 @@ class ContextInputData { const bNodeTree *node_tree; bool use_file_output; std::string view_name; + realtime_compositor::RenderContext *render_context; ContextInputData(const Scene &scene, const RenderData &render_data, const bNodeTree &node_tree, const bool use_file_output, - const char *view_name) + const char *view_name, + realtime_compositor::RenderContext *render_context) : scene(&scene), render_data(&render_data), node_tree(&node_tree), use_file_output(use_file_output), - view_name(view_name) + view_name(view_name), + render_context(render_context) { } }; @@ -334,10 +341,13 @@ class Context : public realtime_compositor::Context { * incomplete support, and leave more specific message to individual nodes? */ } - IDRecalcFlag query_id_recalc_flag(ID * /*id*/) const override + IDRecalcFlag query_id_recalc_flag(ID *id) const override { - /* TODO: implement? */ - return IDRecalcFlag(0); + DrawEngineType *owner = (DrawEngineType *)this; + DrawData *draw_data = DRW_drawdata_ensure(id, owner, sizeof(DrawData), nullptr, nullptr); + IDRecalcFlag recalc_flag = IDRecalcFlag(draw_data->recalc); + draw_data->recalc = IDRecalcFlag(0); + return recalc_flag; } void output_to_render_result() @@ -427,6 +437,11 @@ class Context : public realtime_compositor::Context { input_data_.node_tree->runtime->update_draw(input_data_.node_tree->runtime->udh); } } + + realtime_compositor::RenderContext *render_context() const override + { + return input_data_.render_context; + } }; /* Render Realtime Compositor */ @@ -501,12 +516,13 @@ void Render::compositor_execute(const Scene &scene, const RenderData &render_data, const bNodeTree &node_tree, const bool use_file_output, - const char *view_name) + const char *view_name, + blender::realtime_compositor::RenderContext *render_context) { std::unique_lock lock(gpu_compositor_mutex); blender::render::ContextInputData input_data( - scene, render_data, node_tree, use_file_output, view_name); + scene, render_data, node_tree, use_file_output, view_name, render_context); if (gpu_compositor == nullptr) { gpu_compositor = new blender::render::RealtimeCompositor(*this, input_data); @@ -530,9 +546,11 @@ void RE_compositor_execute(Render &render, const RenderData &render_data, const bNodeTree &node_tree, const bool use_file_output, - const char *view_name) + const char *view_name, + blender::realtime_compositor::RenderContext *render_context) { - render.compositor_execute(scene, render_data, node_tree, use_file_output, view_name); + render.compositor_execute( + scene, render_data, node_tree, use_file_output, view_name, render_context); } void RE_compositor_free(Render &render) diff --git a/source/blender/render/intern/multires_bake.cc b/source/blender/render/intern/multires_bake.cc index e56d9da6120..e3e6231db35 100644 --- a/source/blender/render/intern/multires_bake.cc +++ b/source/blender/render/intern/multires_bake.cc @@ -520,6 +520,8 @@ static void do_multires_bake(MultiresBakeRender *bkr, if (require_tangent) { if (CustomData_get_layer_index(&dm->loopData, CD_TANGENT) == -1) { const blender::Span corner_normals = temp_mesh->corner_normals(); + const bool *sharp_faces = static_cast( + CustomData_get_layer_named(&dm->polyData, CD_PROP_BOOL, "sharp_face")); BKE_mesh_calc_loop_tangent_ex( reinterpret_cast(positions.data()), faces, @@ -527,8 +529,7 @@ static void do_multires_bake(MultiresBakeRender *bkr, looptris.data(), looptri_faces.data(), looptris.size(), - static_cast( - CustomData_get_layer_named(&dm->polyData, CD_PROP_BOOL, "sharp_face")), + sharp_faces ? blender::Span(sharp_faces, faces.size()) : blender::Span(), &dm->loopData, true, nullptr, @@ -761,14 +762,14 @@ static void interp_bilinear_mpoly(const blender::Span vert_posi interp_bilinear_quad_v3(data, u, v, res); } -static void interp_barycentric_mlooptri(const blender::Span vert_positions, - const blender::Span vert_normals, - const blender::Span corner_verts, - const MLoopTri *lt, - const float u, - const float v, - const int mode, - float res[3]) +static void interp_barycentric_looptri(const blender::Span vert_positions, + const blender::Span vert_normals, + const blender::Span corner_verts, + const MLoopTri *lt, + const float u, + const float v, + const int mode, + float res[3]) { float data[3][3]; @@ -909,9 +910,9 @@ static void apply_heights_callback(const blender::Span vert_pos interp_bilinear_mpoly(vert_positions, vert_normals, corner_verts, face, uv[0], uv[1], 0, n); } else { - interp_barycentric_mlooptri( + interp_barycentric_looptri( vert_positions, vert_normals, corner_verts, lt, uv[0], uv[1], 1, p0); - interp_barycentric_mlooptri( + interp_barycentric_looptri( vert_positions, vert_normals, corner_verts, lt, uv[0], uv[1], 0, n); } } diff --git a/source/blender/render/intern/pipeline.cc b/source/blender/render/intern/pipeline.cc index 1c8bfd6ac12..68da6d4631f 100644 --- a/source/blender/render/intern/pipeline.cc +++ b/source/blender/render/intern/pipeline.cc @@ -66,6 +66,8 @@ #include "NOD_composite.hh" +#include "COM_render_context.hh" + #include "DEG_depsgraph.hh" #include "DEG_depsgraph_build.hh" #include "DEG_depsgraph_debug.hh" @@ -1267,10 +1269,18 @@ static void do_render_compositor(Render *re) /* If we have consistent depsgraph now would be a time to update them. */ } + blender::realtime_compositor::RenderContext compositor_render_context; LISTBASE_FOREACH (RenderView *, rv, &re->result->views) { - ntreeCompositExecTree( - re, re->pipeline_scene_eval, ntree, &re->r, true, G.background == 0, rv->name); + ntreeCompositExecTree(re, + re->pipeline_scene_eval, + ntree, + &re->r, + true, + G.background == 0, + rv->name, + &compositor_render_context); } + compositor_render_context.save_file_outputs(re->pipeline_scene_eval); ntree->runtime->stats_draw = nullptr; ntree->runtime->test_break = nullptr; diff --git a/source/blender/render/intern/render_result.cc b/source/blender/render/intern/render_result.cc index c38a001be54..be57c21cd00 100644 --- a/source/blender/render/intern/render_result.cc +++ b/source/blender/render/intern/render_result.cc @@ -448,9 +448,9 @@ GPUTexture *RE_pass_ensure_gpu_texture_cache(Render *re, RenderPass *rpass) return nullptr; } - const eGPUTextureFormat format = (rpass->channels == 1) ? GPU_R16F : - (rpass->channels == 3) ? GPU_RGB16F : - GPU_RGBA16F; + const eGPUTextureFormat format = (rpass->channels == 1) ? GPU_R32F : + (rpass->channels == 3) ? GPU_RGB32F : + GPU_RGBA32F; /* TODO(sergey): Use utility to assign the texture. */ ibuf->gpu.texture = GPU_texture_create_2d("RenderBuffer.gpu_texture", @@ -1055,6 +1055,7 @@ ImBuf *RE_render_result_rect_to_ibuf(RenderResult *rr, if (rv->ibuf) { IMB_assign_byte_buffer(ibuf, rv->ibuf->byte_buffer.data, IB_DO_NOT_TAKE_OWNERSHIP); IMB_assign_float_buffer(ibuf, rv->ibuf->float_buffer.data, IB_DO_NOT_TAKE_OWNERSHIP); + ibuf->channels = rv->ibuf->channels; } /* float factor for random dither, imbuf takes care of it */ diff --git a/source/blender/render/intern/render_types.h b/source/blender/render/intern/render_types.h index 030842b082b..cd06cab4576 100644 --- a/source/blender/render/intern/render_types.h +++ b/source/blender/render/intern/render_types.h @@ -23,6 +23,10 @@ #include "tile_highlight.h" +namespace blender::realtime_compositor { +class RenderContext; +} + struct bNodeTree; struct Depsgraph; struct GSet; @@ -46,7 +50,8 @@ struct BaseRender { const RenderData &render_data, const bNodeTree &node_tree, const bool use_file_output, - const char *view_name) = 0; + const char *view_name, + blender::realtime_compositor::RenderContext *render_context) = 0; virtual void compositor_free() = 0; virtual void display_init(RenderResult *render_result) = 0; @@ -93,11 +98,13 @@ struct ViewRender : public BaseRender { return nullptr; } - void compositor_execute(const Scene & /*scene*/, - const RenderData & /*render_data*/, - const bNodeTree & /*node_tree*/, - const bool /*use_file_output*/, - const char * /*view_name*/) override + void compositor_execute( + const Scene & /*scene*/, + const RenderData & /*render_data*/, + const bNodeTree & /*node_tree*/, + const bool /*use_file_output*/, + const char * /*view_name*/, + blender::realtime_compositor::RenderContext * /*render_context*/) override { } void compositor_free() override {} @@ -141,7 +148,8 @@ struct Render : public BaseRender { const RenderData &render_data, const bNodeTree &node_tree, const bool use_file_output, - const char *view_name) override; + const char *view_name, + blender::realtime_compositor::RenderContext *render_context) override; void compositor_free() override; void display_init(RenderResult *render_result) override; diff --git a/source/blender/render/intern/texture_margin.cc b/source/blender/render/intern/texture_margin.cc index 977bb2ac386..3f5dfb82070 100644 --- a/source/blender/render/intern/texture_margin.cc +++ b/source/blender/render/intern/texture_margin.cc @@ -13,6 +13,7 @@ #include "BLI_vector.hh" #include "BKE_DerivedMesh.hh" +#include "BKE_attribute.hh" #include "BKE_customdata.hh" #include "BKE_mesh.hh" #include "BKE_mesh_mapping.hh" @@ -567,15 +568,13 @@ void RE_generate_texturemargin_adjacentfaces(ImBuf *ibuf, char const *uv_layer, const float uv_offset[2]) { - const blender::float2 *mloopuv; - if ((uv_layer == nullptr) || (uv_layer[0] == '\0')) { - mloopuv = static_cast( - CustomData_get_layer(&mesh->loop_data, CD_PROP_FLOAT2)); - } - else { - mloopuv = static_cast( - CustomData_get_layer_named(&mesh->loop_data, CD_PROP_FLOAT2, uv_layer)); - } + const blender::StringRef uv_map_name = (uv_layer && uv_layer[0]) ? + uv_layer : + CustomData_get_active_layer_name(&mesh->loop_data, + CD_PROP_FLOAT2); + const blender::bke::AttributeAccessor attributes = mesh->attributes(); + const blender::VArraySpan uv_map = *attributes.lookup( + uv_map_name, ATTR_DOMAIN_CORNER); blender::render::texturemargin::generate_margin(ibuf, mask, @@ -585,7 +584,7 @@ void RE_generate_texturemargin_adjacentfaces(ImBuf *ibuf, mesh->faces(), mesh->corner_edges(), mesh->corner_verts(), - {mloopuv, mesh->totloop}, + uv_map, uv_offset); } diff --git a/source/blender/sequencer/SEQ_retiming.hh b/source/blender/sequencer/SEQ_retiming.hh index 89d98a22c6f..bd2816a6825 100644 --- a/source/blender/sequencer/SEQ_retiming.hh +++ b/source/blender/sequencer/SEQ_retiming.hh @@ -32,11 +32,11 @@ SeqRetimingKey *SEQ_retiming_add_key(const Scene *scene, Sequence *seq, int time SeqRetimingKey *SEQ_retiming_add_transition(const Scene *scene, Sequence *seq, SeqRetimingKey *key, - int offset); + const int offset); SeqRetimingKey *SEQ_retiming_add_freeze_frame(const Scene *scene, Sequence *seq, SeqRetimingKey *key, - int offset); + const int offset); bool SEQ_retiming_is_last_key(const Sequence *seq, const SeqRetimingKey *key); SeqRetimingKey *SEQ_retiming_last_key_get(const Sequence *seq); void SEQ_retiming_remove_key(const Scene *scene, Sequence *seq, SeqRetimingKey *key); @@ -45,18 +45,16 @@ void SEQ_retiming_offset_transition_key(const Scene *scene, SeqRetimingKey *key, int offset); float SEQ_retiming_key_speed_get(const Sequence *seq, const SeqRetimingKey *key); -void SEQ_retiming_key_speed_set(const Scene *scene, - Sequence *seq, - SeqRetimingKey *key, - float speed); +void SEQ_retiming_key_speed_set( + const Scene *scene, Sequence *seq, SeqRetimingKey *key, float speed, bool keep_retiming); int SEQ_retiming_key_index_get(const Sequence *seq, const SeqRetimingKey *key); SeqRetimingKey *SEQ_retiming_key_get_by_timeline_frame(const Scene *scene, const Sequence *seq, int timeline_frame); void SEQ_retiming_sound_animation_data_set(const Scene *scene, const Sequence *seq); -float SEQ_retiming_key_timeline_frame_get(const Scene *scene, - const Sequence *seq, - const SeqRetimingKey *key); +int SEQ_retiming_key_timeline_frame_get(const Scene *scene, + const Sequence *seq, + const SeqRetimingKey *key); void SEQ_retiming_key_timeline_frame_set(const Scene *scene, Sequence *seq, SeqRetimingKey *key, diff --git a/source/blender/sequencer/SEQ_time.hh b/source/blender/sequencer/SEQ_time.hh index 87a77039120..4cc837ae4dd 100644 --- a/source/blender/sequencer/SEQ_time.hh +++ b/source/blender/sequencer/SEQ_time.hh @@ -120,3 +120,8 @@ void SEQ_time_start_frame_set(const Scene *scene, Sequence *seq, int timeline_fr * \note this function is currently only used internally and in versioning code. */ void SEQ_time_update_meta_strip_range(const Scene *scene, Sequence *seq_meta); + +/** + * Get difference between scene and movie strip framerate. + */ +float SEQ_time_media_playback_rate_factor_get(const Scene *scene, const Sequence *seq); diff --git a/source/blender/sequencer/intern/effects.cc b/source/blender/sequencer/intern/effects.cc index 3a0d4e91ef8..f8ef6a668fc 100644 --- a/source/blender/sequencer/intern/effects.cc +++ b/source/blender/sequencer/intern/effects.cc @@ -64,6 +64,8 @@ #include "strip_time.hh" #include "utils.hh" +using blender::float4; + static SeqEffectHandle get_sequence_effect_impl(int seq_type); /* -------------------------------------------------------------------- */ @@ -120,6 +122,44 @@ static void slice_get_float_buffers(const SeqRenderData *context, } } +static float4 load_premul_pixel(const uchar *ptr) +{ + float4 res; + straight_uchar_to_premul_float(res, ptr); + return res; +} + +static float4 load_premul_pixel(const float *ptr) +{ + return float4(ptr); +} + +static void store_premul_pixel(const float4 &pix, uchar *dst) +{ + premul_float_to_straight_uchar(dst, pix); +} + +static void store_premul_pixel(const float4 &pix, float *dst) +{ + *reinterpret_cast(dst) = pix; +} + +static void store_opaque_black_pixel(uchar *dst) +{ + dst[0] = 0; + dst[1] = 0; + dst[2] = 0; + dst[3] = 255; +} + +static void store_opaque_black_pixel(float *dst) +{ + dst[0] = 0.0f; + dst[1] = 0.0f; + dst[2] = 0.0f; + dst[3] = 1.0f; +} + /** \} */ /* -------------------------------------------------------------------- */ @@ -203,72 +243,32 @@ static void init_alpha_over_or_under(Sequence *seq) seq->seq1 = seq2; } -static void do_alphaover_effect_byte( - float fac, int x, int y, uchar *rect1, uchar *rect2, uchar *out) +/* dst = src1 over src2 (alpha from src1) */ +template +static void do_alphaover_effect( + float fac, int width, int height, const T *src1, const T *src2, T *dst) { - uchar *cp1 = rect1; - uchar *cp2 = rect2; - uchar *rt = out; - - for (int i = 0; i < y; i++) { - for (int j = 0; j < x; j++) { - /* rt = rt1 over rt2 (alpha from rt1) */ - - float tempc[4], rt1[4], rt2[4]; - straight_uchar_to_premul_float(rt1, cp1); - straight_uchar_to_premul_float(rt2, cp2); - - float mfac = 1.0f - fac * rt1[3]; - - if (fac <= 0.0f) { - *((uint *)rt) = *((uint *)cp2); - } - else if (mfac <= 0.0f) { - *((uint *)rt) = *((uint *)cp1); - } - else { - tempc[0] = fac * rt1[0] + mfac * rt2[0]; - tempc[1] = fac * rt1[1] + mfac * rt2[1]; - tempc[2] = fac * rt1[2] + mfac * rt2[2]; - tempc[3] = fac * rt1[3] + mfac * rt2[3]; - - premul_float_to_straight_uchar(rt, tempc); - } - cp1 += 4; - cp2 += 4; - rt += 4; - } + if (fac <= 0.0f) { + memcpy(dst, src2, sizeof(T) * 4 * width * height); + return; } -} -static void do_alphaover_effect_float( - float fac, int x, int y, float *rect1, float *rect2, float *out) -{ - float *rt1 = rect1; - float *rt2 = rect2; - float *rt = out; + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + float4 col1 = load_premul_pixel(src1); + float mfac = 1.0f - fac * col1.w; - for (int i = 0; i < y; i++) { - for (int j = 0; j < x; j++) { - /* rt = rt1 over rt2 (alpha from rt1) */ - - float mfac = 1.0f - (fac * rt1[3]); - - if (fac <= 0.0f) { - memcpy(rt, rt2, sizeof(float[4])); - } - else if (mfac <= 0) { - memcpy(rt, rt1, sizeof(float[4])); + if (mfac <= 0.0f) { + memcpy(dst, src1, sizeof(T) * 4); } else { - rt[0] = fac * rt1[0] + mfac * rt2[0]; - rt[1] = fac * rt1[1] + mfac * rt2[1]; - rt[2] = fac * rt1[2] + mfac * rt2[2]; - rt[3] = fac * rt1[3] + mfac * rt2[3]; + float4 col2 = load_premul_pixel(src2); + float4 col = fac * col1 + mfac * col2; + store_premul_pixel(col, dst); } - rt1 += 4; - rt2 += 4; - rt += 4; + src1 += 4; + src2 += 4; + dst += 4; } } } @@ -290,7 +290,7 @@ static void do_alphaover_effect(const SeqRenderData *context, slice_get_float_buffers( context, ibuf1, ibuf2, nullptr, out, start_line, &rect1, &rect2, nullptr, &rect_out); - do_alphaover_effect_float(fac, context->rectx, total_lines, rect1, rect2, rect_out); + do_alphaover_effect(fac, context->rectx, total_lines, rect1, rect2, rect_out); } else { uchar *rect1 = nullptr, *rect2 = nullptr, *rect_out = nullptr; @@ -298,7 +298,7 @@ static void do_alphaover_effect(const SeqRenderData *context, slice_get_byte_buffers( context, ibuf1, ibuf2, nullptr, out, start_line, &rect1, &rect2, nullptr, &rect_out); - do_alphaover_effect_byte(fac, context->rectx, total_lines, rect1, rect2, rect_out); + do_alphaover_effect(fac, context->rectx, total_lines, rect1, rect2, rect_out); } } @@ -308,88 +308,34 @@ static void do_alphaover_effect(const SeqRenderData *context, /** \name Alpha Under Effect * \{ */ -static void do_alphaunder_effect_byte( - float fac, int x, int y, uchar *rect1, uchar *rect2, uchar *out) +/* dst = src1 under src2 (alpha from src2) */ +template +static void do_alphaunder_effect( + float fac, int width, int height, const T *src1, const T *src2, T *dst) { - uchar *cp1 = rect1; - uchar *cp2 = rect2; - uchar *rt = out; - - for (int i = 0; i < y; i++) { - for (int j = 0; j < x; j++) { - /* rt = rt1 under rt2 (alpha from rt2) */ - - float tempc[4], rt1[4], rt2[4]; - straight_uchar_to_premul_float(rt1, cp1); - straight_uchar_to_premul_float(rt2, cp2); - - /* this complex optimization is because the - * 'skybuf' can be crossed in - */ - if (rt2[3] <= 0.0f && fac >= 1.0f) { - *((uint *)rt) = *((uint *)cp1); - } - else if (rt2[3] >= 1.0f) { - *((uint *)rt) = *((uint *)cp2); - } - else { - float temp_fac = (fac * (1.0f - rt2[3])); - - if (fac <= 0) { - *((uint *)rt) = *((uint *)cp2); - } - else { - tempc[0] = (temp_fac * rt1[0] + rt2[0]); - tempc[1] = (temp_fac * rt1[1] + rt2[1]); - tempc[2] = (temp_fac * rt1[2] + rt2[2]); - tempc[3] = (temp_fac * rt1[3] + rt2[3]); - - premul_float_to_straight_uchar(rt, tempc); - } - } - cp1 += 4; - cp2 += 4; - rt += 4; - } + if (fac >= 1.0f) { + memcpy(dst, src1, sizeof(T) * 4 * width * height); + return; } -} -static void do_alphaunder_effect_float( - float fac, int x, int y, float *rect1, float *rect2, float *out) -{ - float *rt1 = rect1; - float *rt2 = rect2; - float *rt = out; - - for (int i = 0; i < y; i++) { - for (int j = 0; j < x; j++) { - /* rt = rt1 under rt2 (alpha from rt2) */ - - /* this complex optimization is because the - * 'skybuf' can be crossed in - */ - if (rt2[3] <= 0 && fac >= 1.0f) { - memcpy(rt, rt1, sizeof(float[4])); + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + float4 col2 = load_premul_pixel(src2); + if (col2.w <= 0.0f) { + memcpy(dst, src1, sizeof(T) * 4); } - else if (rt2[3] >= 1.0f) { - memcpy(rt, rt2, sizeof(float[4])); + else if (col2.w >= 1.0f || fac <= 0.0f) { + memcpy(dst, src2, sizeof(T) * 4); } else { - float temp_fac = fac * (1.0f - rt2[3]); - - if (fac == 0) { - memcpy(rt, rt2, sizeof(float[4])); - } - else { - rt[0] = temp_fac * rt1[0] + rt2[0]; - rt[1] = temp_fac * rt1[1] + rt2[1]; - rt[2] = temp_fac * rt1[2] + rt2[2]; - rt[3] = temp_fac * rt1[3] + rt2[3]; - } + float mfac = fac * (1.0f - col2.w); + float4 col1 = load_premul_pixel(src1); + float4 col = mfac * col1 + col2; + store_premul_pixel(col, dst); } - rt1 += 4; - rt2 += 4; - rt += 4; + src1 += 4; + src2 += 4; + dst += 4; } } } @@ -411,7 +357,7 @@ static void do_alphaunder_effect(const SeqRenderData *context, slice_get_float_buffers( context, ibuf1, ibuf2, nullptr, out, start_line, &rect1, &rect2, nullptr, &rect_out); - do_alphaunder_effect_float(fac, context->rectx, total_lines, rect1, rect2, rect_out); + do_alphaunder_effect(fac, context->rectx, total_lines, rect1, rect2, rect_out); } else { uchar *rect1 = nullptr, *rect2 = nullptr, *rect_out = nullptr; @@ -419,7 +365,7 @@ static void do_alphaunder_effect(const SeqRenderData *context, slice_get_byte_buffers( context, ibuf1, ibuf2, nullptr, out, start_line, &rect1, &rect2, nullptr, &rect_out); - do_alphaunder_effect_byte(fac, context->rectx, total_lines, rect1, rect2, rect_out); + do_alphaunder_effect(fac, context->rectx, total_lines, rect1, rect2, rect_out); } } @@ -527,53 +473,24 @@ static float invGammaCorrect(float c) return sqrtf_signed(c); } -static void do_gammacross_effect_byte( - float fac, int x, int y, uchar *rect1, uchar *rect2, uchar *out) +template +static void do_gammacross_effect( + float fac, int width, int height, const T *src1, const T *src2, T *dst) { - uchar *cp1 = rect1; - uchar *cp2 = rect2; - uchar *rt = out; - float mfac = 1.0f - fac; - for (int i = 0; i < y; i++) { - for (int j = 0; j < x; j++) { - float rt1[4], rt2[4], tempc[4]; - - straight_uchar_to_premul_float(rt1, cp1); - straight_uchar_to_premul_float(rt2, cp2); - - tempc[0] = gammaCorrect(mfac * invGammaCorrect(rt1[0]) + fac * invGammaCorrect(rt2[0])); - tempc[1] = gammaCorrect(mfac * invGammaCorrect(rt1[1]) + fac * invGammaCorrect(rt2[1])); - tempc[2] = gammaCorrect(mfac * invGammaCorrect(rt1[2]) + fac * invGammaCorrect(rt2[2])); - tempc[3] = gammaCorrect(mfac * invGammaCorrect(rt1[3]) + fac * invGammaCorrect(rt2[3])); - - premul_float_to_straight_uchar(rt, tempc); - cp1 += 4; - cp2 += 4; - rt += 4; - } - } -} - -static void do_gammacross_effect_float( - float fac, int x, int y, float *rect1, float *rect2, float *out) -{ - float *rt1 = rect1; - float *rt2 = rect2; - float *rt = out; - - float mfac = 1.0f - fac; - - for (int i = 0; i < y; i++) { - for (int j = 0; j < x; j++) { - rt[0] = gammaCorrect(mfac * invGammaCorrect(rt1[0]) + fac * invGammaCorrect(rt2[0])); - rt[1] = gammaCorrect(mfac * invGammaCorrect(rt1[1]) + fac * invGammaCorrect(rt2[1])); - rt[2] = gammaCorrect(mfac * invGammaCorrect(rt1[2]) + fac * invGammaCorrect(rt2[2])); - rt[3] = gammaCorrect(mfac * invGammaCorrect(rt1[3]) + fac * invGammaCorrect(rt2[3])); - rt1 += 4; - rt2 += 4; - rt += 4; + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + float4 col1 = load_premul_pixel(src1); + float4 col2 = load_premul_pixel(src2); + float4 col; + for (int c = 0; c < 4; ++c) { + col[c] = gammaCorrect(mfac * invGammaCorrect(col1[c]) + fac * invGammaCorrect(col2[c])); + } + store_premul_pixel(col, dst); + src1 += 4; + src2 += 4; + dst += 4; } } } @@ -604,7 +521,7 @@ static void do_gammacross_effect(const SeqRenderData *context, slice_get_float_buffers( context, ibuf1, ibuf2, nullptr, out, start_line, &rect1, &rect2, nullptr, &rect_out); - do_gammacross_effect_float(fac, context->rectx, total_lines, rect1, rect2, rect_out); + do_gammacross_effect(fac, context->rectx, total_lines, rect1, rect2, rect_out); } else { uchar *rect1 = nullptr, *rect2 = nullptr, *rect_out = nullptr; @@ -612,7 +529,7 @@ static void do_gammacross_effect(const SeqRenderData *context, slice_get_byte_buffers( context, ibuf1, ibuf2, nullptr, out, start_line, &rect1, &rect2, nullptr, &rect_out); - do_gammacross_effect_byte(fac, context->rectx, total_lines, rect1, rect2, rect_out); + do_gammacross_effect(fac, context->rectx, total_lines, rect1, rect2, rect_out); } } @@ -943,57 +860,21 @@ static void do_mul_effect(const SeqRenderData *context, /** \name Blend Mode Effect * \{ */ -using IMB_blend_func_byte = void (*)(uchar *dst, const uchar *src1, const uchar *src2); -using IMB_blend_func_float = void (*)(float *dst, const float *src1, const float *src2); - -BLI_INLINE void apply_blend_function_byte(float fac, - int x, - int y, - uchar *rect1, - uchar *rect2, - uchar *out, - IMB_blend_func_byte blend_function) +/* blend_function has to be: void (T* dst, const T *src1, const T *src2) */ +template +static void apply_blend_function( + float fac, int width, int height, const T *src1, T *src2, T *dst, Func blend_function) { - uchar *rt1 = rect1; - uchar *rt2 = rect2; - uchar *rt = out; - - for (int i = 0; i < y; i++) { - for (int j = 0; j < x; j++) { - uint achannel = rt2[3]; - rt2[3] = uint(achannel) * fac; - blend_function(rt, rt1, rt2); - rt2[3] = achannel; - rt[3] = rt1[3]; - rt1 += 4; - rt2 += 4; - rt += 4; - } - } -} - -BLI_INLINE void apply_blend_function_float(float fac, - int x, - int y, - float *rect1, - float *rect2, - float *out, - IMB_blend_func_float blend_function) -{ - float *rt1 = rect1; - float *rt2 = rect2; - float *rt = out; - - for (int i = 0; i < y; i++) { - for (int j = 0; j < x; j++) { - float achannel = rt2[3]; - rt2[3] = achannel * fac; - blend_function(rt, rt1, rt2); - rt2[3] = achannel; - rt[3] = rt1[3]; - rt1 += 4; - rt2 += 4; - rt += 4; + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + T achannel = src2[3]; + src2[3] = T(achannel * fac); + blend_function(dst, src1, src2); + src2[3] = achannel; + dst[3] = src1[3]; + src1 += 4; + src2 += 4; + dst += 4; } } } @@ -1003,67 +884,67 @@ static void do_blend_effect_float( { switch (btype) { case SEQ_TYPE_ADD: - apply_blend_function_float(fac, x, y, rect1, rect2, out, blend_color_add_float); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_add_float); break; case SEQ_TYPE_SUB: - apply_blend_function_float(fac, x, y, rect1, rect2, out, blend_color_sub_float); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_sub_float); break; case SEQ_TYPE_MUL: - apply_blend_function_float(fac, x, y, rect1, rect2, out, blend_color_mul_float); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_mul_float); break; case SEQ_TYPE_DARKEN: - apply_blend_function_float(fac, x, y, rect1, rect2, out, blend_color_darken_float); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_darken_float); break; case SEQ_TYPE_COLOR_BURN: - apply_blend_function_float(fac, x, y, rect1, rect2, out, blend_color_burn_float); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_burn_float); break; case SEQ_TYPE_LINEAR_BURN: - apply_blend_function_float(fac, x, y, rect1, rect2, out, blend_color_linearburn_float); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_linearburn_float); break; case SEQ_TYPE_SCREEN: - apply_blend_function_float(fac, x, y, rect1, rect2, out, blend_color_screen_float); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_screen_float); break; case SEQ_TYPE_LIGHTEN: - apply_blend_function_float(fac, x, y, rect1, rect2, out, blend_color_lighten_float); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_lighten_float); break; case SEQ_TYPE_DODGE: - apply_blend_function_float(fac, x, y, rect1, rect2, out, blend_color_dodge_float); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_dodge_float); break; case SEQ_TYPE_OVERLAY: - apply_blend_function_float(fac, x, y, rect1, rect2, out, blend_color_overlay_float); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_overlay_float); break; case SEQ_TYPE_SOFT_LIGHT: - apply_blend_function_float(fac, x, y, rect1, rect2, out, blend_color_softlight_float); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_softlight_float); break; case SEQ_TYPE_HARD_LIGHT: - apply_blend_function_float(fac, x, y, rect1, rect2, out, blend_color_hardlight_float); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_hardlight_float); break; case SEQ_TYPE_PIN_LIGHT: - apply_blend_function_float(fac, x, y, rect1, rect2, out, blend_color_pinlight_float); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_pinlight_float); break; case SEQ_TYPE_LIN_LIGHT: - apply_blend_function_float(fac, x, y, rect1, rect2, out, blend_color_linearlight_float); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_linearlight_float); break; case SEQ_TYPE_VIVID_LIGHT: - apply_blend_function_float(fac, x, y, rect1, rect2, out, blend_color_vividlight_float); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_vividlight_float); break; case SEQ_TYPE_BLEND_COLOR: - apply_blend_function_float(fac, x, y, rect1, rect2, out, blend_color_color_float); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_color_float); break; case SEQ_TYPE_HUE: - apply_blend_function_float(fac, x, y, rect1, rect2, out, blend_color_hue_float); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_hue_float); break; case SEQ_TYPE_SATURATION: - apply_blend_function_float(fac, x, y, rect1, rect2, out, blend_color_saturation_float); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_saturation_float); break; case SEQ_TYPE_VALUE: - apply_blend_function_float(fac, x, y, rect1, rect2, out, blend_color_luminosity_float); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_luminosity_float); break; case SEQ_TYPE_DIFFERENCE: - apply_blend_function_float(fac, x, y, rect1, rect2, out, blend_color_difference_float); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_difference_float); break; case SEQ_TYPE_EXCLUSION: - apply_blend_function_float(fac, x, y, rect1, rect2, out, blend_color_exclusion_float); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_exclusion_float); break; default: break; @@ -1075,67 +956,67 @@ static void do_blend_effect_byte( { switch (btype) { case SEQ_TYPE_ADD: - apply_blend_function_byte(fac, x, y, rect1, rect2, out, blend_color_add_byte); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_add_byte); break; case SEQ_TYPE_SUB: - apply_blend_function_byte(fac, x, y, rect1, rect2, out, blend_color_sub_byte); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_sub_byte); break; case SEQ_TYPE_MUL: - apply_blend_function_byte(fac, x, y, rect1, rect2, out, blend_color_mul_byte); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_mul_byte); break; case SEQ_TYPE_DARKEN: - apply_blend_function_byte(fac, x, y, rect1, rect2, out, blend_color_darken_byte); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_darken_byte); break; case SEQ_TYPE_COLOR_BURN: - apply_blend_function_byte(fac, x, y, rect1, rect2, out, blend_color_burn_byte); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_burn_byte); break; case SEQ_TYPE_LINEAR_BURN: - apply_blend_function_byte(fac, x, y, rect1, rect2, out, blend_color_linearburn_byte); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_linearburn_byte); break; case SEQ_TYPE_SCREEN: - apply_blend_function_byte(fac, x, y, rect1, rect2, out, blend_color_screen_byte); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_screen_byte); break; case SEQ_TYPE_LIGHTEN: - apply_blend_function_byte(fac, x, y, rect1, rect2, out, blend_color_lighten_byte); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_lighten_byte); break; case SEQ_TYPE_DODGE: - apply_blend_function_byte(fac, x, y, rect1, rect2, out, blend_color_dodge_byte); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_dodge_byte); break; case SEQ_TYPE_OVERLAY: - apply_blend_function_byte(fac, x, y, rect1, rect2, out, blend_color_overlay_byte); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_overlay_byte); break; case SEQ_TYPE_SOFT_LIGHT: - apply_blend_function_byte(fac, x, y, rect1, rect2, out, blend_color_softlight_byte); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_softlight_byte); break; case SEQ_TYPE_HARD_LIGHT: - apply_blend_function_byte(fac, x, y, rect1, rect2, out, blend_color_hardlight_byte); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_hardlight_byte); break; case SEQ_TYPE_PIN_LIGHT: - apply_blend_function_byte(fac, x, y, rect1, rect2, out, blend_color_pinlight_byte); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_pinlight_byte); break; case SEQ_TYPE_LIN_LIGHT: - apply_blend_function_byte(fac, x, y, rect1, rect2, out, blend_color_linearlight_byte); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_linearlight_byte); break; case SEQ_TYPE_VIVID_LIGHT: - apply_blend_function_byte(fac, x, y, rect1, rect2, out, blend_color_vividlight_byte); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_vividlight_byte); break; case SEQ_TYPE_BLEND_COLOR: - apply_blend_function_byte(fac, x, y, rect1, rect2, out, blend_color_color_byte); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_color_byte); break; case SEQ_TYPE_HUE: - apply_blend_function_byte(fac, x, y, rect1, rect2, out, blend_color_hue_byte); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_hue_byte); break; case SEQ_TYPE_SATURATION: - apply_blend_function_byte(fac, x, y, rect1, rect2, out, blend_color_saturation_byte); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_saturation_byte); break; case SEQ_TYPE_VALUE: - apply_blend_function_byte(fac, x, y, rect1, rect2, out, blend_color_luminosity_byte); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_luminosity_byte); break; case SEQ_TYPE_DIFFERENCE: - apply_blend_function_byte(fac, x, y, rect1, rect2, out, blend_color_difference_byte); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_difference_byte); break; case SEQ_TYPE_EXCLUSION: - apply_blend_function_byte(fac, x, y, rect1, rect2, out, blend_color_exclusion_byte); + apply_blend_function(fac, x, y, rect1, rect2, out, blend_color_exclusion_byte); break; default: break; @@ -1516,58 +1397,38 @@ static void copy_wipe_effect(Sequence *dst, Sequence *src, const int /*flag*/) dst->effectdata = MEM_dupallocN(src->effectdata); } -static void do_wipe_effect_byte(const Sequence *seq, - float fac, - int width, - int height, - const uchar *rect1, - const uchar *rect2, - uchar *out) +template +static void do_wipe_effect( + const Sequence *seq, float fac, int width, int height, const T *rect1, const T *rect2, T *out) { using namespace blender; const WipeVars *wipe = (const WipeVars *)seq->effectdata; const WipeZone wipezone = precalc_wipe_zone(wipe, width, height); threading::parallel_for(IndexRange(height), 64, [&](const IndexRange y_range) { - const uchar *cp1 = rect1 + y_range.first() * width * 4; - const uchar *cp2 = rect2 + y_range.first() * width * 4; - uchar *rt = out + y_range.first() * width * 4; + const T *cp1 = rect1 ? rect1 + y_range.first() * width * 4 : nullptr; + const T *cp2 = rect2 ? rect2 + y_range.first() * width * 4 : nullptr; + T *rt = out + y_range.first() * width * 4; for (const int y : y_range) { for (int x = 0; x < width; x++) { float check = check_zone(&wipezone, x, y, fac); if (check) { if (cp1) { - float rt1[4], rt2[4], tempc[4]; - - straight_uchar_to_premul_float(rt1, cp1); - straight_uchar_to_premul_float(rt2, cp2); - - tempc[0] = rt1[0] * check + rt2[0] * (1 - check); - tempc[1] = rt1[1] * check + rt2[1] * (1 - check); - tempc[2] = rt1[2] * check + rt2[2] * (1 - check); - tempc[3] = rt1[3] * check + rt2[3] * (1 - check); - - premul_float_to_straight_uchar(rt, tempc); + float4 col1 = load_premul_pixel(cp1); + float4 col2 = load_premul_pixel(cp2); + float4 col = col1 * check + col2 * (1.0f - check); + store_premul_pixel(col, rt); } else { - rt[0] = 0; - rt[1] = 0; - rt[2] = 0; - rt[3] = 255; + store_opaque_black_pixel(rt); } } else { if (cp2) { - rt[0] = cp2[0]; - rt[1] = cp2[1]; - rt[2] = cp2[2]; - rt[3] = cp2[3]; + memcpy(rt, cp2, sizeof(T) * 4); } else { - rt[0] = 0; - rt[1] = 0; - rt[2] = 0; - rt[3] = 255; + store_opaque_black_pixel(rt); } } @@ -1583,66 +1444,6 @@ static void do_wipe_effect_byte(const Sequence *seq, }); } -static void do_wipe_effect_float(Sequence *seq, - float fac, - int width, - int height, - const float *rect1, - const float *rect2, - float *out) -{ - using namespace blender; - const WipeVars *wipe = (const WipeVars *)seq->effectdata; - const WipeZone wipezone = precalc_wipe_zone(wipe, width, height); - - threading::parallel_for(IndexRange(height), 64, [&](const IndexRange y_range) { - const float *rt1 = rect1 + y_range.first() * width * 4; - const float *rt2 = rect2 + y_range.first() * width * 4; - float *rt = out + y_range.first() * width * 4; - for (const int y : y_range) { - for (int x = 0; x < width; x++) { - float check = check_zone(&wipezone, x, y, fac); - if (check) { - if (rt1) { - rt[0] = rt1[0] * check + rt2[0] * (1 - check); - rt[1] = rt1[1] * check + rt2[1] * (1 - check); - rt[2] = rt1[2] * check + rt2[2] * (1 - check); - rt[3] = rt1[3] * check + rt2[3] * (1 - check); - } - else { - rt[0] = 0; - rt[1] = 0; - rt[2] = 0; - rt[3] = 1.0; - } - } - else { - if (rt2) { - rt[0] = rt2[0]; - rt[1] = rt2[1]; - rt[2] = rt2[2]; - rt[3] = rt2[3]; - } - else { - rt[0] = 0; - rt[1] = 0; - rt[2] = 0; - rt[3] = 1.0; - } - } - - rt += 4; - if (rt1 != nullptr) { - rt1 += 4; - } - if (rt2 != nullptr) { - rt2 += 4; - } - } - } - }); -} - static ImBuf *do_wipe_effect(const SeqRenderData *context, Sequence *seq, float /*timeline_frame*/, @@ -1654,22 +1455,22 @@ static ImBuf *do_wipe_effect(const SeqRenderData *context, ImBuf *out = prepare_effect_imbufs(context, ibuf1, ibuf2, ibuf3); if (out->float_buffer.data) { - do_wipe_effect_float(seq, - fac, - context->rectx, - context->recty, - ibuf1->float_buffer.data, - ibuf2->float_buffer.data, - out->float_buffer.data); + do_wipe_effect(seq, + fac, + context->rectx, + context->recty, + ibuf1->float_buffer.data, + ibuf2->float_buffer.data, + out->float_buffer.data); } else { - do_wipe_effect_byte(seq, - fac, - context->rectx, - context->recty, - ibuf1->byte_buffer.data, - ibuf2->byte_buffer.data, - out->byte_buffer.data); + do_wipe_effect(seq, + fac, + context->rectx, + context->recty, + ibuf1->byte_buffer.data, + ibuf2->byte_buffer.data, + out->byte_buffer.data); } return out; @@ -1837,12 +1638,8 @@ static void do_transform_effect(const SeqRenderData *context, /** \name Glow Effect * \{ */ -static void glow_blur_bitmap(const blender::float4 *src, - blender::float4 *map, - int width, - int height, - float blur, - int quality) +static void glow_blur_bitmap( + const float4 *src, float4 *map, int width, int height, float blur, int quality) { using namespace blender; @@ -1913,8 +1710,8 @@ static void glow_blur_bitmap(const blender::float4 *src, }); } -static void blur_isolate_highlights(const blender::float4 *in, - blender::float4 *out, +static void blur_isolate_highlights(const float4 *in, + float4 *out, int width, int height, float threshold, @@ -2525,7 +2322,7 @@ static void do_overdrop_effect(const SeqRenderData *context, context, ibuf1, ibuf2, nullptr, out, start_line, &rect1, &rect2, nullptr, &rect_out); do_drop_effect_float(fac, x, y, rect1, rect2, rect_out); - do_alphaover_effect_float(fac, x, y, rect1, rect2, rect_out); + do_alphaover_effect(fac, x, y, rect1, rect2, rect_out); } else { uchar *rect1 = nullptr, *rect2 = nullptr, *rect_out = nullptr; @@ -2534,7 +2331,7 @@ static void do_overdrop_effect(const SeqRenderData *context, context, ibuf1, ibuf2, nullptr, out, start_line, &rect1, &rect2, nullptr, &rect_out); do_drop_effect_byte(fac, x, y, rect1, rect2, rect_out); - do_alphaover_effect_byte(fac, x, y, rect1, rect2, rect_out); + do_alphaover_effect(fac, x, y, rect1, rect2, rect_out); } } @@ -2544,14 +2341,6 @@ static void do_overdrop_effect(const SeqRenderData *context, /** \name Gaussian Blur * \{ */ -/* NOTE: This gaussian blur implementation accumulates values in the square - * kernel rather that doing X direction and then Y direction because of the - * lack of using multiple-staged filters. - * - * Once we can we'll implement a way to apply filter as multiple stages we - * can optimize hell of a lot in here. - */ - static void init_gaussian_blur_effect(Sequence *seq) { if (seq->effectdata) { @@ -2585,346 +2374,92 @@ static int early_out_gaussian_blur(Sequence *seq, float /*fac*/) return EARLY_DO_EFFECT; } -/* TODO(sergey): De-duplicate with compositor. */ -static float *make_gaussian_blur_kernel(float rad, int size) +static blender::Array make_gaussian_blur_kernel(float rad, int size) { - float *gausstab, sum, val; - float fac; - int i, n; + int n = 2 * size + 1; + blender::Array gausstab(n); - n = 2 * size + 1; - - gausstab = (float *)MEM_mallocN(sizeof(float) * n, __func__); - - sum = 0.0f; - fac = (rad > 0.0f ? 1.0f / rad : 0.0f); - for (i = -size; i <= size; i++) { - val = RE_filter_value(R_FILTER_GAUSS, float(i) * fac); + float sum = 0.0f; + float fac = (rad > 0.0f ? 1.0f / rad : 0.0f); + for (int i = -size; i <= size; i++) { + float val = RE_filter_value(R_FILTER_GAUSS, float(i) * fac); sum += val; gausstab[i + size] = val; } - sum = 1.0f / sum; - for (i = 0; i < n; i++) { - gausstab[i] *= sum; + float inv_sum = 1.0f / sum; + for (int i = 0; i < n; i++) { + gausstab[i] *= inv_sum; } return gausstab; } -static void do_gaussian_blur_effect_byte_x(Sequence *seq, - int start_line, - int x, - int y, - int frame_width, - int /*frame_height*/, - const uchar *rect, - uchar *out) +template +static void gaussian_blur_x(const blender::Array &gausstab, + int half_size, + int start_line, + int width, + int height, + int /*frame_height*/, + const T *rect, + T *dst) { -#define INDEX(_x, _y) (((_y) * (x) + (_x)) * 4) - GaussianBlurVars *data = static_cast(seq->effectdata); - const int size_x = int(data->size_x + 0.5f); - int i, j; - - /* Make gaussian weight table. */ - float *gausstab_x; - gausstab_x = make_gaussian_blur_kernel(data->size_x, size_x); - - for (i = 0; i < y; i++) { - for (j = 0; j < x; j++) { - int out_index = INDEX(j, i); - float accum[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + dst += start_line * width * 4; + for (int y = start_line; y < start_line + height; y++) { + for (int x = 0; x < width; x++) { + float4 accum(0.0f); float accum_weight = 0.0f; - for (int current_x = j - size_x; current_x <= j + size_x; current_x++) { - if (current_x < 0 || current_x >= frame_width) { - /* Out of bounds. */ - continue; - } - int index = INDEX(current_x, i + start_line); - float weight = gausstab_x[current_x - j + size_x]; - accum[0] += rect[index] * weight; - accum[1] += rect[index + 1] * weight; - accum[2] += rect[index + 2] * weight; - accum[3] += rect[index + 3] * weight; + int xmin = blender::math::max(x - half_size, 0); + int xmax = blender::math::min(x + half_size, width - 1); + for (int nx = xmin, index = (xmin - x) + half_size; nx <= xmax; nx++, index++) { + float weight = gausstab[index]; + int offset = (y * width + nx) * 4; + accum += float4(rect + offset) * weight; accum_weight += weight; } - - float inv_accum_weight = 1.0f / accum_weight; - out[out_index + 0] = accum[0] * inv_accum_weight; - out[out_index + 1] = accum[1] * inv_accum_weight; - out[out_index + 2] = accum[2] * inv_accum_weight; - out[out_index + 3] = accum[3] * inv_accum_weight; + accum *= (1.0f / accum_weight); + dst[0] = accum[0]; + dst[1] = accum[1]; + dst[2] = accum[2]; + dst[3] = accum[3]; + dst += 4; } } - - MEM_freeN(gausstab_x); -#undef INDEX } -static void do_gaussian_blur_effect_byte_y(Sequence *seq, - int start_line, - int x, - int y, - int /*frame_width*/, - int frame_height, - const uchar *rect, - uchar *out) +template +static void gaussian_blur_y(const blender::Array &gausstab, + int half_size, + int start_line, + int width, + int height, + int frame_height, + const T *rect, + T *dst) { -#define INDEX(_x, _y) (((_y) * (x) + (_x)) * 4) - GaussianBlurVars *data = static_cast(seq->effectdata); - const int size_y = int(data->size_y + 0.5f); - int i, j; - - /* Make gaussian weight table. */ - float *gausstab_y; - gausstab_y = make_gaussian_blur_kernel(data->size_y, size_y); - - for (i = 0; i < y; i++) { - for (j = 0; j < x; j++) { - int out_index = INDEX(j, i); - float accum[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + dst += start_line * width * 4; + for (int y = start_line; y < start_line + height; y++) { + for (int x = 0; x < width; x++) { + float4 accum(0.0f); float accum_weight = 0.0f; - for (int current_y = i - size_y; current_y <= i + size_y; current_y++) { - if (current_y < -start_line || current_y + start_line >= frame_height) { - /* Out of bounds. */ - continue; - } - int index = INDEX(j, current_y + start_line); - float weight = gausstab_y[current_y - i + size_y]; - accum[0] += rect[index] * weight; - accum[1] += rect[index + 1] * weight; - accum[2] += rect[index + 2] * weight; - accum[3] += rect[index + 3] * weight; + int ymin = blender::math::max(y - half_size, 0); + int ymax = blender::math::min(y + half_size, frame_height - 1); + for (int ny = ymin, index = (ymin - y) + half_size; ny <= ymax; ny++, index++) { + float weight = gausstab[index]; + int offset = (ny * width + x) * 4; + accum += float4(rect + offset) * weight; accum_weight += weight; } - float inv_accum_weight = 1.0f / accum_weight; - out[out_index + 0] = accum[0] * inv_accum_weight; - out[out_index + 1] = accum[1] * inv_accum_weight; - out[out_index + 2] = accum[2] * inv_accum_weight; - out[out_index + 3] = accum[3] * inv_accum_weight; + accum *= (1.0f / accum_weight); + dst[0] = accum[0]; + dst[1] = accum[1]; + dst[2] = accum[2]; + dst[3] = accum[3]; + dst += 4; } } - - MEM_freeN(gausstab_y); -#undef INDEX -} - -static void do_gaussian_blur_effect_float_x(Sequence *seq, - int start_line, - int x, - int y, - int frame_width, - int /*frame_height*/, - float *rect, - float *out) -{ -#define INDEX(_x, _y) (((_y) * (x) + (_x)) * 4) - GaussianBlurVars *data = static_cast(seq->effectdata); - const int size_x = int(data->size_x + 0.5f); - int i, j; - - /* Make gaussian weight table. */ - float *gausstab_x; - gausstab_x = make_gaussian_blur_kernel(data->size_x, size_x); - - for (i = 0; i < y; i++) { - for (j = 0; j < x; j++) { - int out_index = INDEX(j, i); - float accum[4] = {0.0f, 0.0f, 0.0f, 0.0f}; - float accum_weight = 0.0f; - for (int current_x = j - size_x; current_x <= j + size_x; current_x++) { - if (current_x < 0 || current_x >= frame_width) { - /* Out of bounds. */ - continue; - } - int index = INDEX(current_x, i + start_line); - float weight = gausstab_x[current_x - j + size_x]; - madd_v4_v4fl(accum, &rect[index], weight); - accum_weight += weight; - } - mul_v4_v4fl(&out[out_index], accum, 1.0f / accum_weight); - } - } - - MEM_freeN(gausstab_x); -#undef INDEX -} - -static void do_gaussian_blur_effect_float_y(Sequence *seq, - int start_line, - int x, - int y, - int /*frame_width*/, - int frame_height, - float *rect, - float *out) -{ -#define INDEX(_x, _y) (((_y) * (x) + (_x)) * 4) - GaussianBlurVars *data = static_cast(seq->effectdata); - const int size_y = int(data->size_y + 0.5f); - int i, j; - - /* Make gaussian weight table. */ - float *gausstab_y; - gausstab_y = make_gaussian_blur_kernel(data->size_y, size_y); - - for (i = 0; i < y; i++) { - for (j = 0; j < x; j++) { - int out_index = INDEX(j, i); - float accum[4] = {0.0f, 0.0f, 0.0f, 0.0f}; - float accum_weight = 0.0f; - for (int current_y = i - size_y; current_y <= i + size_y; current_y++) { - if (current_y < -start_line || current_y + start_line >= frame_height) { - /* Out of bounds. */ - continue; - } - int index = INDEX(j, current_y + start_line); - float weight = gausstab_y[current_y - i + size_y]; - madd_v4_v4fl(accum, &rect[index], weight); - accum_weight += weight; - } - mul_v4_v4fl(&out[out_index], accum, 1.0f / accum_weight); - } - } - - MEM_freeN(gausstab_y); -#undef INDEX -} - -static void do_gaussian_blur_effect_x_cb(const SeqRenderData *context, - Sequence *seq, - ImBuf *ibuf, - int start_line, - int total_lines, - ImBuf *out) -{ - if (out->float_buffer.data) { - float *rect1 = nullptr, *rect2 = nullptr, *rect_out = nullptr; - - slice_get_float_buffers( - context, ibuf, nullptr, nullptr, out, start_line, &rect1, &rect2, nullptr, &rect_out); - - do_gaussian_blur_effect_float_x(seq, - start_line, - context->rectx, - total_lines, - context->rectx, - context->recty, - ibuf->float_buffer.data, - rect_out); - } - else { - uchar *rect1 = nullptr, *rect2 = nullptr, *rect_out = nullptr; - - slice_get_byte_buffers( - context, ibuf, nullptr, nullptr, out, start_line, &rect1, &rect2, nullptr, &rect_out); - - do_gaussian_blur_effect_byte_x(seq, - start_line, - context->rectx, - total_lines, - context->rectx, - context->recty, - ibuf->byte_buffer.data, - rect_out); - } -} - -static void do_gaussian_blur_effect_y_cb(const SeqRenderData *context, - Sequence *seq, - ImBuf *ibuf, - int start_line, - int total_lines, - ImBuf *out) -{ - if (out->float_buffer.data) { - float *rect1 = nullptr, *rect2 = nullptr, *rect_out = nullptr; - - slice_get_float_buffers( - context, ibuf, nullptr, nullptr, out, start_line, &rect1, &rect2, nullptr, &rect_out); - - do_gaussian_blur_effect_float_y(seq, - start_line, - context->rectx, - total_lines, - context->rectx, - context->recty, - ibuf->float_buffer.data, - rect_out); - } - else { - uchar *rect1 = nullptr, *rect2 = nullptr, *rect_out = nullptr; - - slice_get_byte_buffers( - context, ibuf, nullptr, nullptr, out, start_line, &rect1, &rect2, nullptr, &rect_out); - - do_gaussian_blur_effect_byte_y(seq, - start_line, - context->rectx, - total_lines, - context->rectx, - context->recty, - ibuf->byte_buffer.data, - rect_out); - } -} - -struct RenderGaussianBlurEffectInitData { - const SeqRenderData *context; - Sequence *seq; - ImBuf *ibuf; - ImBuf *out; -}; - -struct RenderGaussianBlurEffectThread { - const SeqRenderData *context; - Sequence *seq; - ImBuf *ibuf; - ImBuf *out; - int start_line, tot_line; -}; - -static void render_effect_execute_init_handle(void *handle_v, - int start_line, - int tot_line, - void *init_data_v) -{ - RenderGaussianBlurEffectThread *handle = (RenderGaussianBlurEffectThread *)handle_v; - RenderGaussianBlurEffectInitData *init_data = (RenderGaussianBlurEffectInitData *)init_data_v; - - handle->context = init_data->context; - handle->seq = init_data->seq; - handle->ibuf = init_data->ibuf; - handle->out = init_data->out; - - handle->start_line = start_line; - handle->tot_line = tot_line; -} - -static void *render_effect_execute_do_x_thread(void *thread_data_v) -{ - RenderGaussianBlurEffectThread *thread_data = (RenderGaussianBlurEffectThread *)thread_data_v; - do_gaussian_blur_effect_x_cb(thread_data->context, - thread_data->seq, - thread_data->ibuf, - thread_data->start_line, - thread_data->tot_line, - thread_data->out); - return nullptr; -} - -static void *render_effect_execute_do_y_thread(void *thread_data_v) -{ - RenderGaussianBlurEffectThread *thread_data = (RenderGaussianBlurEffectThread *)thread_data_v; - do_gaussian_blur_effect_y_cb(thread_data->context, - thread_data->seq, - thread_data->ibuf, - thread_data->start_line, - thread_data->tot_line, - thread_data->out); - - return nullptr; } static ImBuf *do_gaussian_blur_effect(const SeqRenderData *context, @@ -2935,32 +2470,75 @@ static ImBuf *do_gaussian_blur_effect(const SeqRenderData *context, ImBuf * /*ibuf2*/, ImBuf * /*ibuf3*/) { + using namespace blender; + + /* Create blur kernel weights. */ + const GaussianBlurVars *data = static_cast(seq->effectdata); + const int half_size_x = int(data->size_x + 0.5f); + const int half_size_y = int(data->size_y + 0.5f); + Array gausstab_x = make_gaussian_blur_kernel(data->size_x, half_size_x); + Array gausstab_y = make_gaussian_blur_kernel(data->size_y, half_size_y); + + const int width = context->rectx; + const int height = context->recty; + const bool is_float = ibuf1->float_buffer.data; + + /* Horizontal blur: create output, blur ibuf1 into it. */ ImBuf *out = prepare_effect_imbufs(context, ibuf1, nullptr, nullptr); + threading::parallel_for(IndexRange(context->recty), 32, [&](const IndexRange y_range) { + const int y_first = y_range.first(); + const int y_size = y_range.size(); + if (is_float) { + gaussian_blur_x(gausstab_x, + half_size_x, + y_first, + width, + y_size, + height, + ibuf1->float_buffer.data, + out->float_buffer.data); + } + else { + gaussian_blur_x(gausstab_x, + half_size_x, + y_first, + width, + y_size, + height, + ibuf1->byte_buffer.data, + out->byte_buffer.data); + } + }); - RenderGaussianBlurEffectInitData init_data; - - init_data.context = context; - init_data.seq = seq; - init_data.ibuf = ibuf1; - init_data.out = out; - - IMB_processor_apply_threaded(out->y, - sizeof(RenderGaussianBlurEffectThread), - &init_data, - render_effect_execute_init_handle, - render_effect_execute_do_x_thread); - + /* Vertical blur: create output, blur previous output into it. */ ibuf1 = out; - init_data.ibuf = ibuf1; out = prepare_effect_imbufs(context, ibuf1, nullptr, nullptr); - init_data.out = out; - - IMB_processor_apply_threaded(out->y, - sizeof(RenderGaussianBlurEffectThread), - &init_data, - render_effect_execute_init_handle, - render_effect_execute_do_y_thread); + threading::parallel_for(IndexRange(context->recty), 32, [&](const IndexRange y_range) { + const int y_first = y_range.first(); + const int y_size = y_range.size(); + if (is_float) { + gaussian_blur_y(gausstab_y, + half_size_y, + y_first, + width, + y_size, + height, + ibuf1->float_buffer.data, + out->float_buffer.data); + } + else { + gaussian_blur_y(gausstab_y, + half_size_y, + y_first, + width, + y_size, + height, + ibuf1->byte_buffer.data, + out->byte_buffer.data); + } + }); + /* Free the first output. */ IMB_freeImBuf(ibuf1); return out; diff --git a/source/blender/sequencer/intern/strip_edit.cc b/source/blender/sequencer/intern/strip_edit.cc index d64c81c7489..8019ddd5ffd 100644 --- a/source/blender/sequencer/intern/strip_edit.cc +++ b/source/blender/sequencer/intern/strip_edit.cc @@ -273,7 +273,7 @@ static void seq_split_set_right_hold_offset(Main *bmain, /* Adjust within range of strip contents. */ else if ((timeline_frame >= content_start) && (timeline_frame <= content_end)) { seq->endofs = 0; - float speed_factor = seq_time_media_playback_rate_factor_get(scene, seq); + float speed_factor = SEQ_time_media_playback_rate_factor_get(scene, seq); seq->anim_endofs += round_fl_to_int((content_end - timeline_frame) * speed_factor); } @@ -292,7 +292,7 @@ static void seq_split_set_left_hold_offset(Main *bmain, /* Adjust within range of strip contents. */ if ((timeline_frame >= content_start) && (timeline_frame <= content_end)) { - float speed_factor = seq_time_media_playback_rate_factor_get(scene, seq); + float speed_factor = SEQ_time_media_playback_rate_factor_get(scene, seq); seq->anim_startofs += round_fl_to_int((timeline_frame - content_start) * speed_factor); seq->start = timeline_frame; seq->startofs = 0; diff --git a/source/blender/sequencer/intern/strip_retiming.cc b/source/blender/sequencer/intern/strip_retiming.cc index 6704f944636..10efa10f934 100644 --- a/source/blender/sequencer/intern/strip_retiming.cc +++ b/source/blender/sequencer/intern/strip_retiming.cc @@ -71,7 +71,8 @@ SeqRetimingKey *SEQ_retiming_key_get_by_timeline_frame(const Scene *scene, const int timeline_frame) { for (auto &key : SEQ_retiming_keys_get(seq)) { - if (SEQ_retiming_key_timeline_frame_get(scene, seq, &key) == timeline_frame) { + const int key_timeline_frame = SEQ_retiming_key_timeline_frame_get(scene, seq, &key); + if (key_timeline_frame == timeline_frame) { return &key; } } @@ -279,19 +280,15 @@ float seq_retiming_evaluate(const Sequence *seq, const float frame_index) SeqRetimingKey *SEQ_retiming_add_key(const Scene *scene, Sequence *seq, const int timeline_frame) { float frame_index = (timeline_frame - SEQ_time_start_frame_get(seq)) * - seq_time_media_playback_rate_factor_get(scene, seq); + SEQ_time_media_playback_rate_factor_get(scene, seq); - SeqRetimingKey *last_key = SEQ_retiming_last_key_get(seq); - - if (frame_index >= last_key->strip_frame_index) { - return last_key; /* This is expected for strips with no offsets. */ + if (timeline_frame >= SEQ_time_content_end_frame_get(scene, seq) - 1) { + return SEQ_retiming_last_key_get(seq); /* This is expected for strips with no offsets. */ } - float value = seq_retiming_evaluate(seq, frame_index); - SeqRetimingKey *start_key = SEQ_retiming_find_segment_start_key(seq, frame_index); - if (start_key->strip_frame_index == frame_index) { + if (SEQ_retiming_key_timeline_frame_get(scene, seq, start_key) == timeline_frame) { return start_key; /* Retiming key already exists. */ } @@ -301,6 +298,8 @@ SeqRetimingKey *SEQ_retiming_add_key(const Scene *scene, Sequence *seq, const in return nullptr; } + float value = seq_retiming_evaluate(seq, frame_index); + SeqRetimingKey *keys = seq->retiming_keys; size_t keys_count = SEQ_retiming_keys_count(seq); const int new_key_index = start_key - keys + 1; @@ -799,6 +798,14 @@ static RetimingRangeData seq_retiming_range_data_get(const Scene *scene, const S void SEQ_retiming_sound_animation_data_set(const Scene *scene, const Sequence *seq) { + /* Content cut off by `anim_startofs` is as if it does not exist for sequencer. But Audaspace + * seeking relies on having animation buffer initialized for whole sequence. */ + if (seq->anim_startofs > 0) { + const int seq_start = SEQ_time_start_frame_get(seq); + BKE_sound_set_scene_sound_pitch_constant_range( + seq->scene_sound, seq_start - seq->anim_startofs, seq_start, 1.0f); + } + RetimingRangeData retiming_data = seq_retiming_range_data_get(scene, seq); for (int i = 0; i < retiming_data.ranges.size(); i++) { RetimingRange range = retiming_data.ranges[i]; @@ -821,12 +828,13 @@ void SEQ_retiming_sound_animation_data_set(const Scene *scene, const Sequence *s } } -float SEQ_retiming_key_timeline_frame_get(const Scene *scene, - const Sequence *seq, - const SeqRetimingKey *key) +int SEQ_retiming_key_timeline_frame_get(const Scene *scene, + const Sequence *seq, + const SeqRetimingKey *key) { - return SEQ_time_start_frame_get(seq) + - key->strip_frame_index / seq_time_media_playback_rate_factor_get(scene, seq); + return round_fl_to_int(SEQ_time_start_frame_get(seq) + + key->strip_frame_index / + SEQ_time_media_playback_rate_factor_get(scene, seq)); } static int seq_retiming_clamp_transition_offset(SeqRetimingKey *start_key, int offset) @@ -942,7 +950,7 @@ static void seq_retiming_key_offset(const Scene *scene, seq_retiming_transition_offset(scene, seq, key, offset); } else { - key->strip_frame_index += offset; + key->strip_frame_index += offset * SEQ_time_media_playback_rate_factor_get(scene, seq); seq_retiming_fix_transitions(scene, seq, key); } } @@ -988,10 +996,8 @@ void SEQ_retiming_key_timeline_frame_set(const Scene *scene, SEQ_time_update_meta_strip_range(scene, seq_sequence_lookup_meta_by_seq(scene, seq)); } -void SEQ_retiming_key_speed_set(const Scene *scene, - Sequence *seq, - SeqRetimingKey *key, - const float speed) +void SEQ_retiming_key_speed_set( + const Scene *scene, Sequence *seq, SeqRetimingKey *key, const float speed, bool keep_retiming) { if (key->strip_frame_index == 0) { return; @@ -1007,10 +1013,20 @@ void SEQ_retiming_key_speed_set(const Scene *scene, const int segment_duration = frame_retimed - frame_retimed_prev; const int new_duration = segment_duration * speed_fac; + const int orig_timeline_frame = SEQ_retiming_key_timeline_frame_get(scene, seq, key); const int new_timeline_frame = SEQ_retiming_key_timeline_frame_get(scene, seq, key_prev) + new_duration; SEQ_retiming_key_timeline_frame_set(scene, seq, key, new_timeline_frame); + + if (keep_retiming) { + const int key_index = SEQ_retiming_key_index_get(seq, key); + const int offset = new_timeline_frame - orig_timeline_frame; + for (int i = key_index + 1; i < SEQ_retiming_keys_count(seq); i++) { + SeqRetimingKey *key_iter = &SEQ_retiming_keys_get(seq)[i]; + seq_retiming_key_offset(scene, seq, key_iter, offset); + } + } } bool SEQ_retiming_selection_clear(const Editing *ed) diff --git a/source/blender/sequencer/intern/strip_time.cc b/source/blender/sequencer/intern/strip_time.cc index 7f57d41af13..f9d84f777b3 100644 --- a/source/blender/sequencer/intern/strip_time.cc +++ b/source/blender/sequencer/intern/strip_time.cc @@ -41,7 +41,7 @@ #include "strip_time.hh" #include "utils.hh" -float seq_time_media_playback_rate_factor_get(const Scene *scene, const Sequence *seq) +float SEQ_time_media_playback_rate_factor_get(const Scene *scene, const Sequence *seq) { if ((seq->flag & SEQ_AUTO_PLAYBACK_RATE) == 0) { return 1.0f; @@ -60,7 +60,7 @@ int seq_time_strip_original_content_length_get(const Scene *scene, const Sequenc return seq->len; } - return seq->len / seq_time_media_playback_rate_factor_get(scene, seq); + return seq->len / SEQ_time_media_playback_rate_factor_get(scene, seq); } float SEQ_give_frame_index(const Scene *scene, Sequence *seq, float timeline_frame) @@ -91,7 +91,7 @@ float SEQ_give_frame_index(const Scene *scene, Sequence *seq, float timeline_fra frame_index = max_ff(frame_index, 0); - frame_index *= seq_time_media_playback_rate_factor_get(scene, seq); + frame_index *= SEQ_time_media_playback_rate_factor_get(scene, seq); if (SEQ_retiming_is_active(seq)) { const float retiming_factor = seq_retiming_evaluate(seq, frame_index); @@ -477,13 +477,13 @@ bool SEQ_time_has_still_frames(const Scene *scene, const Sequence *seq) int SEQ_time_strip_length_get(const Scene *scene, const Sequence *seq) { if (SEQ_retiming_is_active(seq)) { - const SeqRetimingKey *key_start = seq->retiming_keys; - const SeqRetimingKey *key_end = seq->retiming_keys + (SEQ_retiming_keys_count(seq) - 1); - return (key_end->strip_frame_index + 1) / seq_time_media_playback_rate_factor_get(scene, seq) - - key_start->strip_frame_index / seq_time_media_playback_rate_factor_get(scene, seq); + const int last_key_frame = SEQ_retiming_key_timeline_frame_get( + scene, seq, SEQ_retiming_last_key_get(seq)); + /* Last key is mapped to last frame index. Numbering starts from 0. */ + return last_key_frame + 1 - SEQ_time_start_frame_get(seq); } - return seq->len / seq_time_media_playback_rate_factor_get(scene, seq); + return seq->len / SEQ_time_media_playback_rate_factor_get(scene, seq); } float SEQ_time_start_frame_get(const Sequence *seq) diff --git a/source/blender/windowmanager/CMakeLists.txt b/source/blender/windowmanager/CMakeLists.txt index 03c01f2ad21..2b1a0fa624f 100644 --- a/source/blender/windowmanager/CMakeLists.txt +++ b/source/blender/windowmanager/CMakeLists.txt @@ -214,3 +214,11 @@ blender_add_lib_nolist(bf_windowmanager "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") # RNA_prototypes.h add_dependencies(bf_windowmanager bf_rna) + +if(WITH_GTESTS) + set(TEST_SRC + intern/wm_dragdrop_test.cc + ) + include(GTestTesting) + blender_add_test_lib(bf_wm_tests "${TEST_SRC}" "${INC};${TEST_INC}" "${INC_SYS}" "${LIB}") +endif() diff --git a/source/blender/windowmanager/WM_api.hh b/source/blender/windowmanager/WM_api.hh index f060c912da1..bf97735515d 100644 --- a/source/blender/windowmanager/WM_api.hh +++ b/source/blender/windowmanager/WM_api.hh @@ -1424,18 +1424,38 @@ const ListBase *WM_drag_asset_list_get(const wmDrag *drag); const char *WM_drag_get_item_name(wmDrag *drag); -/* Path drag and drop. */ +/* Paths drag and drop. */ /** - * \param path: The path to drag. Value will be copied into the drag data so the passed string may - * be destructed. + * \param paths: The paths to drag. Values will be copied into the drag data so the passed strings + * may be destructed. */ -wmDragPath *WM_drag_create_path_data(const char *path); -const char *WM_drag_get_path(const wmDrag *drag); +wmDragPath *WM_drag_create_path_data(blender::Span paths); +/** + * If `drag` contains path data, returns the first path int he path list. + */ +const char *WM_drag_get_single_path(const wmDrag *drag); +/** + * If `drag` contains path data, returns the first path in the path list that matches a + * a `file_type`. + * + * \param drag: The drag that could contain drag path data. + * \param file_type: #eFileSel_File_Types bit flag. + */ +const char *WM_drag_get_single_path(const wmDrag *drag, int file_type); +blender::Span WM_drag_get_paths(const wmDrag *drag); +/** + * If `drag` contains path data, returns if any file path match a `file_type`. + * + * \param drag: The drag that could contain drag path data. + * \param file_type: #eFileSel_File_Types bit flag. + */ +bool WM_drag_has_path_file_type(const wmDrag *drag, int file_type); /** * Note that even though the enum return type uses bit-flags, this should never have multiple - * type-bits set, so `ELEM()` like comparison is possible. + * type-bits set, so `ELEM()` like comparison is possible. To check all paths or to do a bit-flag + * check use `WM_drag_has_path_file_type(drag, file_type)` instead. */ -int /* eFileSel_File_Types */ WM_drag_get_path_file_type(const wmDrag *drag); +int /* #eFileSel_File_Types */ WM_drag_get_path_file_type(const wmDrag *drag); /* Set OpenGL viewport and scissor */ void wmViewport(const rcti *winrct); @@ -1462,11 +1482,12 @@ enum eWM_JobFlag { ENUM_OPERATORS(eWM_JobFlag, WM_JOB_PROGRESS); /** - * Identifying jobs by owner alone is unreliable, this isn't saved, - * order can change (keep 0 for 'any'). + * Identifying jobs by owner alone is unreliable, this isn't saved, order can change. */ enum eWM_JobType { + /** Not a real type, use for querying any type. */ WM_JOB_TYPE_ANY = 0, + WM_JOB_TYPE_COMPOSITE, WM_JOB_TYPE_RENDER, WM_JOB_TYPE_RENDER_PREVIEW, /* UI preview */ @@ -1551,7 +1572,7 @@ void WM_jobs_callbacks_ex(wmJob *wm_job, /** * If job running, the same owner gave it a new job. - * if different owner starts existing startjob, it suspends itself + * if different owner starts existing #wmJob::startjob, it suspends itself. */ void WM_jobs_start(wmWindowManager *wm, wmJob *); /** @@ -1599,20 +1620,17 @@ void WM_clipboard_text_set(const char *buf, bool selection); bool WM_clipboard_image_available(); /** - * Get image data from the Clipboard - * \param r_width: the returned image width in pixels. - * \param r_height: the returned image height in pixels. - * \return pointer uint array in RGBA byte order. Caller must free. + * Get image data from the clipboard. + * \return The image or null when not found. Caller must free. */ ImBuf *WM_clipboard_image_get(); /** - * Put image data to the Clipboard - * \param rgba: uint array in RGBA byte order. - * \param width: the image width in pixels. - * \param height: the image height in pixels. + * Put image data to the clipboard. + * + * \param ibuf: the image to set the clipboard to. */ -bool WM_clipboard_image_set(ImBuf *ibuf); +bool WM_clipboard_image_set(ImBuf *ibuf) ATTR_NONNULL(1); /* progress */ diff --git a/source/blender/windowmanager/WM_types.hh b/source/blender/windowmanager/WM_types.hh index 90a89188ba8..0ecd3f2d687 100644 --- a/source/blender/windowmanager/WM_types.hh +++ b/source/blender/windowmanager/WM_types.hh @@ -111,6 +111,7 @@ struct wmWindowManager; #include "BLI_compiler_attrs.h" #include "BLI_utildefines.h" +#include "BLI_vector.hh" #include "DNA_listBase.h" #include "DNA_uuid_types.h" #include "DNA_vec_types.h" @@ -631,11 +632,11 @@ enum eWM_EventFlag { */ WM_EVENT_IS_REPEAT = (1 << 1), /** - * Generated for consecutive track-pad or NDOF-motion events, + * Generated for consecutive trackpad or NDOF-motion events, * the repeat chain is broken by key/button events, * or cursor motion exceeding #WM_EVENT_CURSOR_MOTION_THRESHOLD. * - * Changing the type of track-pad or gesture event also breaks the chain. + * Changing the type of trackpad or gesture event also breaks the chain. */ WM_EVENT_IS_CONSECUTIVE = (1 << 2), /** @@ -673,7 +674,7 @@ struct wmTabletData { * See: #ISKEYBOARD_OR_BUTTON. * * - Previous x/y are exceptions: #wmEvent.prev - * these are set on mouse motion, see #MOUSEMOVE & track-pad events. + * these are set on mouse motion, see #MOUSEMOVE & trackpad events. * * - Modal key-map handling sets `prev_val` & `prev_type` to `val` & `type`, * this allows modal keys-maps to check the original values (needed in some cases). @@ -1179,10 +1180,12 @@ struct wmDragAssetListItem { }; struct wmDragPath { - char *path; - /* Note that even though the enum type uses bit-flags, this should never have multiple type-bits - * set, so `ELEM()` like comparison is possible. */ - int file_type; /* eFileSel_File_Types */ + blender::Vector paths; + /* File type of each path in #paths. */ + blender::Vector file_types; /* eFileSel_File_Types */ + /* Bit flag of file types in #paths. */ + int file_types_bit_flag; /* eFileSel_File_Types */ + std::string tooltip; }; struct wmDragGreasePencilLayer { diff --git a/source/blender/windowmanager/intern/wm_dragdrop.cc b/source/blender/windowmanager/intern/wm_dragdrop.cc index 9eb739e7c20..a0f94fce155 100644 --- a/source/blender/windowmanager/intern/wm_dragdrop.cc +++ b/source/blender/windowmanager/intern/wm_dragdrop.cc @@ -60,6 +60,7 @@ #include "wm_event_system.h" #include "wm_window.hh" +#include /* ****************************************************** */ static ListBase dropboxes = {nullptr, nullptr}; @@ -762,29 +763,80 @@ const ListBase *WM_drag_asset_list_get(const wmDrag *drag) return &drag->asset_items; } -wmDragPath *WM_drag_create_path_data(const char *path) +wmDragPath *WM_drag_create_path_data(blender::Span paths) { + BLI_assert(!paths.is_empty()); wmDragPath *path_data = MEM_new("wmDragPath"); - path_data->path = BLI_strdup(path); - path_data->file_type = ED_path_extension_type(path); + + for (const char *path : paths) { + path_data->paths.append(path); + path_data->file_types_bit_flag |= ED_path_extension_type(path); + path_data->file_types.append(ED_path_extension_type(path)); + } + + path_data->tooltip = path_data->paths[0]; + + if (path_data->paths.size() > 1) { + std::string path_count = std::to_string(path_data->paths.size()); + path_data->tooltip = fmt::format(TIP_("Dragging {} files"), path_count); + } + return path_data; } static void wm_drag_free_path_data(wmDragPath **path_data) { - MEM_freeN((*path_data)->path); MEM_delete(*path_data); *path_data = nullptr; } -const char *WM_drag_get_path(const wmDrag *drag) +const char *WM_drag_get_single_path(const wmDrag *drag) { if (drag->type != WM_DRAG_PATH) { return nullptr; } const wmDragPath *path_data = static_cast(drag->poin); - return path_data->path; + return path_data->paths[0].c_str(); +} + +const char *WM_drag_get_single_path(const wmDrag *drag, int file_type) +{ + if (drag->type != WM_DRAG_PATH) { + return nullptr; + } + const wmDragPath *path_data = static_cast(drag->poin); + auto const file_types = path_data->file_types; + + auto itr = std::find_if( + file_types.begin(), file_types.end(), [file_type](const int file_fype_test) { + return file_fype_test & file_type; + }); + + if (itr == file_types.end()) { + return nullptr; + } + const int index = itr - file_types.begin(); + return path_data->paths[index].c_str(); +} + +bool WM_drag_has_path_file_type(const wmDrag *drag, int file_type) +{ + if (drag->type != WM_DRAG_PATH) { + return false; + } + const wmDragPath *path_data = static_cast(drag->poin); + return bool(path_data->file_types_bit_flag & file_type); +} + +blender::Span WM_drag_get_paths(const wmDrag *drag) +{ + if (drag->type != WM_DRAG_PATH) { + return blender::Span(); + } + + const wmDragPath *path_data = static_cast(drag->poin); + return path_data->paths.as_span(); } int WM_drag_get_path_file_type(const wmDrag *drag) @@ -794,7 +846,7 @@ int WM_drag_get_path_file_type(const wmDrag *drag) } const wmDragPath *path_data = static_cast(drag->poin); - return path_data->file_type; + return path_data->file_types[0]; } /* ************** draw ***************** */ @@ -848,7 +900,7 @@ const char *WM_drag_get_item_name(wmDrag *drag) } case WM_DRAG_PATH: { const wmDragPath *path_drag_data = static_cast(drag->poin); - return path_drag_data->path; + return path_drag_data->tooltip.c_str(); } case WM_DRAG_NAME: return static_cast(drag->poin); diff --git a/source/blender/windowmanager/intern/wm_dragdrop_test.cc b/source/blender/windowmanager/intern/wm_dragdrop_test.cc new file mode 100644 index 00000000000..215cef0d140 --- /dev/null +++ b/source/blender/windowmanager/intern/wm_dragdrop_test.cc @@ -0,0 +1,93 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: Apache-2.0 */ + +#include "testing/testing.h" + +/* #eFileSel_File_Types. */ +#include "DNA_space_types.h" + +#include "WM_api.hh" +#include "WM_types.hh" + +namespace blender::tests { + +TEST(wm_drag, wmDragPath) +{ + { + /** + * NOTE: `WM_drag_create_path_data` gets the `file_type` from the first path in `paths` and + * only needs its extension, so there is no need to describe a full path here that can have a + * different format on Windows or Linux. However callers must ensure that they are valid paths. + */ + blender::Vector paths{"text_file.txt"}; + wmDragPath *path_data = WM_drag_create_path_data(paths); + blender::Vector expected_file_paths{"text_file.txt"}; + + EXPECT_EQ(path_data->paths.size(), 1); + EXPECT_EQ(path_data->tooltip, "text_file.txt"); + EXPECT_EQ(path_data->paths, expected_file_paths); + + /** Test `wmDrag` path data getters. */ + wmDrag drag; + drag.type = WM_DRAG_PATH; + drag.poin = path_data; + EXPECT_STREQ(WM_drag_get_single_path(&drag), "text_file.txt"); + EXPECT_EQ(WM_drag_get_path_file_type(&drag), FILE_TYPE_TEXT); + EXPECT_EQ(WM_drag_get_paths(&drag), expected_file_paths.as_span()); + EXPECT_STREQ(WM_drag_get_single_path(&drag, FILE_TYPE_TEXT), "text_file.txt"); + EXPECT_EQ(WM_drag_get_single_path(&drag, FILE_TYPE_BLENDER), nullptr); + EXPECT_TRUE( + WM_drag_has_path_file_type(&drag, FILE_TYPE_BLENDER | FILE_TYPE_TEXT | FILE_TYPE_IMAGE)); + EXPECT_FALSE(WM_drag_has_path_file_type(&drag, FILE_TYPE_BLENDER | FILE_TYPE_IMAGE)); + MEM_delete(path_data); + } + { + blender::Vector paths = {"blender.blend", "text_file.txt", "image.png"}; + wmDragPath *path_data = WM_drag_create_path_data(paths); + blender::Vector expected_file_paths = { + "blender.blend", "text_file.txt", "image.png"}; + + EXPECT_EQ(path_data->paths.size(), 3); + EXPECT_EQ(path_data->tooltip, "Dragging 3 files"); + EXPECT_EQ(path_data->paths, expected_file_paths); + + /** Test `wmDrag` path data getters. */ + wmDrag drag; + drag.type = WM_DRAG_PATH; + drag.poin = path_data; + EXPECT_STREQ(WM_drag_get_single_path(&drag), "blender.blend"); + EXPECT_EQ(WM_drag_get_path_file_type(&drag), FILE_TYPE_BLENDER); + EXPECT_EQ(WM_drag_get_paths(&drag), expected_file_paths.as_span()); + EXPECT_STREQ(WM_drag_get_single_path(&drag, FILE_TYPE_BLENDER), "blender.blend"); + EXPECT_STREQ(WM_drag_get_single_path(&drag, FILE_TYPE_IMAGE), "image.png"); + EXPECT_STREQ(WM_drag_get_single_path(&drag, FILE_TYPE_TEXT), "text_file.txt"); + EXPECT_STREQ( + WM_drag_get_single_path(&drag, FILE_TYPE_BLENDER | FILE_TYPE_TEXT | FILE_TYPE_IMAGE), + "blender.blend"); + EXPECT_STREQ(WM_drag_get_single_path(&drag, FILE_TYPE_TEXT | FILE_TYPE_IMAGE), + "text_file.txt"); + EXPECT_EQ(WM_drag_get_single_path(&drag, FILE_TYPE_ASSET), nullptr); + EXPECT_TRUE( + WM_drag_has_path_file_type(&drag, FILE_TYPE_BLENDER | FILE_TYPE_TEXT | FILE_TYPE_IMAGE)); + EXPECT_TRUE(WM_drag_has_path_file_type(&drag, FILE_TYPE_BLENDER | FILE_TYPE_IMAGE)); + EXPECT_TRUE(WM_drag_has_path_file_type(&drag, FILE_TYPE_IMAGE)); + EXPECT_FALSE(WM_drag_has_path_file_type(&drag, FILE_TYPE_ASSET)); + MEM_delete(path_data); + } + { + /** Test `wmDrag` path data getters when the drag type is different to `WM_DRAG_PATH`. */ + wmDrag drag; + drag.type = WM_DRAG_COLOR; + EXPECT_EQ(WM_drag_get_single_path(&drag), nullptr); + EXPECT_EQ(WM_drag_get_path_file_type(&drag), 0); + EXPECT_EQ(WM_drag_get_paths(&drag).size(), 0); + EXPECT_EQ(WM_drag_get_single_path( + &drag, FILE_TYPE_BLENDER | FILE_TYPE_IMAGE | FILE_TYPE_TEXT | FILE_TYPE_ASSET), + nullptr); + EXPECT_FALSE(WM_drag_has_path_file_type( + &drag, FILE_TYPE_BLENDER | FILE_TYPE_IMAGE | FILE_TYPE_TEXT | FILE_TYPE_ASSET)); + } +} + +} // namespace blender::tests diff --git a/source/blender/windowmanager/intern/wm_event_system.cc b/source/blender/windowmanager/intern/wm_event_system.cc index 4c48e7a4bab..b002571753c 100644 --- a/source/blender/windowmanager/intern/wm_event_system.cc +++ b/source/blender/windowmanager/intern/wm_event_system.cc @@ -5371,7 +5371,7 @@ static wmEvent *wm_event_add_mousemove_to_head(wmWindow *win) static wmEvent *wm_event_add_trackpad(wmWindow *win, const wmEvent *event, int deltax, int deltay) { - /* Ignore in between track-pad events for performance, we only need high accuracy + /* Ignore in between trackpad events for performance, we only need high accuracy * for painting with mouse moves, for navigation using the accumulated value is ok. */ const wmEvent *event_last = static_cast(win->event_queue.last); if (event_last && event_last->type == event->type) { diff --git a/source/blender/windowmanager/intern/wm_files.cc b/source/blender/windowmanager/intern/wm_files.cc index 0d525cc3a28..156ea0b4e97 100644 --- a/source/blender/windowmanager/intern/wm_files.cc +++ b/source/blender/windowmanager/intern/wm_files.cc @@ -66,7 +66,7 @@ #include "BKE_autoexec.h" #include "BKE_blender.h" #include "BKE_blender_version.h" -#include "BKE_blendfile.h" +#include "BKE_blendfile.hh" #include "BKE_callbacks.h" #include "BKE_context.hh" #include "BKE_global.h" diff --git a/source/blender/windowmanager/intern/wm_files_link.cc b/source/blender/windowmanager/intern/wm_files_link.cc index 5f792e4697d..1d7f7648f19 100644 --- a/source/blender/windowmanager/intern/wm_files_link.cc +++ b/source/blender/windowmanager/intern/wm_files_link.cc @@ -37,8 +37,8 @@ #include "BLO_readfile.h" #include "BKE_armature.hh" -#include "BKE_blendfile.h" -#include "BKE_blendfile_link_append.h" +#include "BKE_blendfile.hh" +#include "BKE_blendfile_link_append.hh" #include "BKE_context.hh" #include "BKE_global.h" #include "BKE_key.h" @@ -258,6 +258,12 @@ static int wm_link_append_exec(bContext *C, wmOperator *op) int flag = wm_link_append_flag(op); const bool do_append = (flag & FILE_LINK) == 0; + /* from here down, no error returns */ + + if (view_layer && RNA_boolean_get(op->ptr, "autoselect")) { + BKE_view_layer_base_deselect_all(scene, view_layer); + } + /* sanity checks for flag */ if (scene && scene->id.lib) { BKE_reportf(op->reports, @@ -268,12 +274,6 @@ static int wm_link_append_exec(bContext *C, wmOperator *op) scene = nullptr; } - /* from here down, no error returns */ - - if (view_layer && RNA_boolean_get(op->ptr, "autoselect")) { - BKE_view_layer_base_deselect_all(scene, view_layer); - } - /* tag everything, all untagged data can be made local * its also generally useful to know what is new * @@ -383,7 +383,9 @@ static int wm_link_append_exec(bContext *C, wmOperator *op) * to all objects and limit update to the particular object only. * But afraid first we need to change collection evaluation in DEG * according to depsgraph manifesto. */ - DEG_id_tag_update(&scene->id, 0); + if (scene) { + DEG_id_tag_update(&scene->id, 0); + } /* recreate dependency graph to include new objects */ DEG_relations_tag_update(bmain); diff --git a/source/blender/windowmanager/intern/wm_init_exit.cc b/source/blender/windowmanager/intern/wm_init_exit.cc index 41455d75098..35668c5294d 100644 --- a/source/blender/windowmanager/intern/wm_init_exit.cc +++ b/source/blender/windowmanager/intern/wm_init_exit.cc @@ -34,7 +34,7 @@ #include "BLO_writefile.hh" #include "BKE_blender.h" -#include "BKE_blendfile.h" +#include "BKE_blendfile.hh" #include "BKE_callbacks.h" #include "BKE_context.hh" #include "BKE_global.h" diff --git a/source/blender/windowmanager/intern/wm_playanim.cc b/source/blender/windowmanager/intern/wm_playanim.cc index 68a44a901c2..0d9e664321a 100644 --- a/source/blender/windowmanager/intern/wm_playanim.cc +++ b/source/blender/windowmanager/intern/wm_playanim.cc @@ -1143,11 +1143,11 @@ static void playanim_audio_stop(PlayState * /*ps*/) #endif } -static bool ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr ps_void) +static bool ghost_event_proc(GHOST_EventHandle ghost_event, GHOST_TUserDataPtr ps_void_ptr) { - PlayState *ps = static_cast(ps_void); - const GHOST_TEventType type = GHOST_GetEventType(evt); - GHOST_TEventDataPtr data = GHOST_GetEventData(evt); + PlayState *ps = static_cast(ps_void_ptr); + const GHOST_TEventType type = GHOST_GetEventType(ghost_event); + GHOST_TEventDataPtr data = GHOST_GetEventData(ghost_event); /* Convert ghost event into value keyboard or mouse. */ const int val = ELEM(type, GHOST_kEventKeyDown, GHOST_kEventButtonDown); GHOST_SystemHandle ghost_system = ps->ghost_data.system; diff --git a/source/blender/windowmanager/intern/wm_window.cc b/source/blender/windowmanager/intern/wm_window.cc index e39947050a7..1b379f281fd 100644 --- a/source/blender/windowmanager/intern/wm_window.cc +++ b/source/blender/windowmanager/intern/wm_window.cc @@ -15,6 +15,8 @@ #include #include +#include "CLG_log.h" + #include "DNA_listBase.h" #include "DNA_screen_types.h" #include "DNA_windowmanager_types.h" @@ -1294,18 +1296,100 @@ void wm_window_reset_drawable() } } +#ifndef NDEBUG +/** + * Time-stamp validation that uses basic heuristics to warn about bad time-stamps. + * Issues here should be resolved in GHOST. + */ +static void ghost_event_proc_timestamp_warning(GHOST_EventHandle ghost_event) +{ + /* NOTE: The following time constants can be tweaked if they're reporting false positives. */ + + /* The reference event time-stamp must have happened in this time-frame. */ + constexpr uint64_t event_time_ok_ms = 1000; + /* The current event time-stamp must be outside this time-frame to be considered an error. */ + constexpr uint64_t event_time_error_ms = 5000; + + static uint64_t event_ms_ref_last = std::numeric_limits::max(); + const uint64_t event_ms = GHOST_GetEventTime(ghost_event); + const uint64_t event_ms_ref = event_ms_ref_last; + + /* Assign first (allow early returns). */ + event_ms_ref_last = event_ms; + + if (event_ms_ref == std::numeric_limits::max()) { + return; + } + /* Check the events are recent enough to be used for testing. */ + const uint64_t now_ms = GHOST_GetMilliSeconds(g_system); + /* Ensure the reference time occurred in the last #event_time_ok_ms. + * If not, the reference time it's self may be a bad time-stamp. */ + if (event_ms_ref < event_time_error_ms || (event_ms_ref < (now_ms - event_time_ok_ms)) || + (event_ms_ref > (now_ms + event_time_ok_ms))) + { + /* Skip, the reference time not recent enough to be used. */ + return; + } + + /* NOTE: Regarding time-stamps from the future. + * Generally this shouldn't happen but may do depending on the kinds of events. + * Different input methods may detect and trigger events in a way that wont ensure + * monotonic event times, so only consider this an error for large time deltas. */ + double time_delta = 0.0; + if (event_ms < (event_ms_ref - event_time_error_ms)) { + /* New event time is after (to be expected). */ + time_delta = double(now_ms - event_ms) / -1000.0; + } + else if (event_ms > (event_ms_ref + event_time_error_ms)) { + /* New event time is before (unexpected but not an error). */ + time_delta = double(event_ms - now_ms) / 1000.0; + } + else { + /* Time is in range. */ + return; + } + + const char *time_unit = "seconds"; + const struct { + const char *unit; + double scale; + } unit_table[] = {{"minutes", 60}, {"hours", 60}, {"days", 24}, {"weeks", 7}, {"years", 52}}; + for (int i = 0; i < ARRAY_SIZE(unit_table); i++) { + if (std::abs(time_delta) <= unit_table[i].scale) { + break; + } + time_delta /= unit_table[i].scale; + time_unit = unit_table[i].unit; + } + + fprintf(stderr, + "GHOST: suspicious time-stamp from far in the %s: %.2f %s, " + "absolute value is %" PRIu64 ", current time is %" PRIu64 ", for type %d\n", + time_delta < 0.0f ? "past" : "future", + std::abs(time_delta), + time_unit, + event_ms, + now_ms, + int(GHOST_GetEventType(ghost_event))); +} +#endif /* !NDEBUG */ + /** * Called by ghost, here we handle events for windows themselves or send to event system. * * Mouse coordinate conversion happens here. */ -static bool ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_ptr) +static bool ghost_event_proc(GHOST_EventHandle ghost_event, GHOST_TUserDataPtr C_void_ptr) { bContext *C = static_cast(C_void_ptr); wmWindowManager *wm = CTX_wm_manager(C); - GHOST_TEventType type = GHOST_GetEventType(evt); + GHOST_TEventType type = GHOST_GetEventType(ghost_event); - GHOST_WindowHandle ghostwin = GHOST_GetEventWindow(evt); + GHOST_WindowHandle ghostwin = GHOST_GetEventWindow(ghost_event); + +#ifndef NDEBUG + ghost_event_proc_timestamp_warning(ghost_event); +#endif if (type == GHOST_kEventQuitRequest) { /* Find an active window to display quit dialog in. */ @@ -1327,8 +1411,8 @@ static bool ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_pt return true; } - GHOST_TEventDataPtr data = GHOST_GetEventData(evt); - const uint64_t event_time_ms = GHOST_GetEventTime(evt); + GHOST_TEventDataPtr data = GHOST_GetEventData(ghost_event); + const uint64_t event_time_ms = GHOST_GetEventTime(ghost_event); /* Ghost now can call this function for life resizes, * but it should return if WM didn't initialize yet. @@ -1572,14 +1656,17 @@ static bool ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_pt if (ddd->dataType == GHOST_kDragnDropTypeFilenames) { const GHOST_TStringArray *stra = static_cast(ddd->data); - for (int a = 0; a < stra->count; a++) { - printf("drop file %s\n", stra->strings[a]); - /* try to get icon type from extension */ - int icon = ED_file_extension_icon((char *)stra->strings[a]); - wmDragPath *path_data = WM_drag_create_path_data((char *)stra->strings[a]); + if (stra->count) { + CLOG_INFO(WM_LOG_EVENTS, 1, "Drop %d files:", stra->count); + for (const char *path : blender::Span((char **)stra->strings, stra->count)) { + CLOG_INFO(WM_LOG_EVENTS, 1, "%s", path); + } + /* Try to get icon type from extension of the first path. */ + int icon = ED_file_extension_icon((char *)stra->strings[0]); + wmDragPath *path_data = WM_drag_create_path_data( + blender::Span((char **)stra->strings, stra->count)); WM_event_start_drag(C, icon, WM_DRAG_PATH, path_data, 0.0, WM_DRAG_NOP); /* Void pointer should point to string, it makes a copy. */ - break; /* only one drop element supported now */ } } diff --git a/source/blender/windowmanager/wm_event_types.hh b/source/blender/windowmanager/wm_event_types.hh index 995d5980f83..2fae3eb4153 100644 --- a/source/blender/windowmanager/wm_event_types.hh +++ b/source/blender/windowmanager/wm_event_types.hh @@ -58,7 +58,7 @@ enum { /* More mouse buttons - can't use 9 and 10 here (wheel) */ BUTTON6MOUSE = 0x0012, BUTTON7MOUSE = 0x0013, - /* Extra track-pad gestures (check #WM_EVENT_IS_CONSECUTIVE to detect motion events). */ + /* Extra trackpad gestures (check #WM_EVENT_IS_CONSECUTIVE to detect motion events). */ MOUSEPAN = 0x000e, MOUSEZOOM = 0x000f, MOUSEROTATE = 0x0010, @@ -415,7 +415,7 @@ enum { BUTTON7MOUSE)) /** Test whether the event is a mouse wheel. */ #define ISMOUSE_WHEEL(event_type) ((event_type) >= WHEELUPMOUSE && (event_type) <= WHEELOUTMOUSE) -/** Test whether the event is a mouse (track-pad) gesture. */ +/** Test whether the event is a mouse (trackpad) gesture. */ #define ISMOUSE_GESTURE(event_type) ((event_type) >= MOUSEPAN && (event_type) <= MOUSESMARTZOOM) /** Test whether the event is a NDOF event. */ diff --git a/source/creator/creator.cc b/source/creator/creator.cc index cf788b8014b..9324aaead82 100644 --- a/source/creator/creator.cc +++ b/source/creator/creator.cc @@ -14,10 +14,6 @@ # include #endif -#ifdef __linux__ -# include -#endif - #if defined(WITH_TBB_MALLOC) && defined(_MSC_VER) && defined(NDEBUG) # pragma comment(lib, "tbbmalloc_proxy.lib") # pragma comment(linker, "/include:__TBB_malloc_proxy") @@ -29,7 +25,6 @@ #include "DNA_genfile.h" -#include "BLI_path_util.h" #include "BLI_string.h" #include "BLI_system.h" #include "BLI_task.h" @@ -336,19 +331,6 @@ int main(int argc, # endif /* USE_WIN32_UNICODE_ARGS */ #endif /* WIN32 */ -/* Here we check for Windows ARM64 or WSL, and override the Mesa reported OpenGL version */ -#if defined(WIN32) || defined(__linux__) -# if defined(WIN32) - if (strncmp(BLI_getenv("PROCESSOR_IDENTIFIER"), "ARM", 3) == 0) -# else /* Must be linux, so check if we're in WSL */ - if (access("/proc/sys/fs/binfmt_misc/WSLInterop", F_OK) == 0) -# endif - { - BLI_setenv_if_new("MESA_GLSL_VERSION_OVERRIDE", "430"); - BLI_setenv_if_new("MESA_GL_VERSION_OVERRIDE", "4.3"); - } -#endif - /* NOTE: Special exception for guarded allocator type switch: * we need to perform switch from lock-free to fully * guarded allocator before any allocation happened. diff --git a/source/creator/creator_args.cc b/source/creator/creator_args.cc index 7eb7486f2bc..328c6b84fa7 100644 --- a/source/creator/creator_args.cc +++ b/source/creator/creator_args.cc @@ -34,7 +34,7 @@ # include "BKE_appdir.h" # include "BKE_blender_version.h" -# include "BKE_blendfile.h" +# include "BKE_blendfile.hh" # include "BKE_context.hh" # include "BKE_global.h" diff --git a/tests/python/CMakeLists.txt b/tests/python/CMakeLists.txt index 08850240c57..506ac00fcba 100644 --- a/tests/python/CMakeLists.txt +++ b/tests/python/CMakeLists.txt @@ -602,7 +602,7 @@ if(TRUE) endif() endif() -if(WITH_CYCLES OR WITH_OPENGL_RENDER_TESTS) +if(WITH_CYCLES OR WITH_GPU_RENDER_TESTS) if(NOT OPENIMAGEIO_IDIFF) message(WARNING "Disabling render tests because OIIO idiff does not exist") elseif(NOT EXISTS "${TEST_SRC_DIR}/render/shader") @@ -657,7 +657,7 @@ if(WITH_CYCLES OR WITH_OPENGL_RENDER_TESTS) # list(APPEND render_tests guiding) #endif() - if(WITH_OPENGL_RENDER_TESTS) + if(WITH_GPU_RENDER_TESTS) list(APPEND render_tests grease_pencil) endif() @@ -693,7 +693,7 @@ if(WITH_CYCLES OR WITH_OPENGL_RENDER_TESTS) unset(_cycles_blacklist) endif() - if(WITH_OPENGL_RENDER_TESTS) + if(WITH_GPU_RENDER_TESTS) # Eevee foreach(render_test ${render_tests}) add_render_test( @@ -874,7 +874,7 @@ else() endif() -if(WITH_OPENGL_DRAW_TESTS) +if(WITH_GPU_DRAW_TESTS) if(NOT OPENIMAGEIO_IDIFF) message(STATUS "Disabling OpenGL draw tests because OIIO idiff does not exist") elseif(NOT EXISTS "${TEST_SRC_DIR}/opengl") diff --git a/tests/python/bl_pyapi_idprop.py b/tests/python/bl_pyapi_idprop.py index d6d78f248ba..41881884cc2 100644 --- a/tests/python/bl_pyapi_idprop.py +++ b/tests/python/bl_pyapi_idprop.py @@ -69,6 +69,11 @@ class TestIdPropertyCreation(TestHelper, unittest.TestCase): self.assertEqual(self.id["a"], b"Hello World") self.assertTrue(isinstance(self.id["a"], bytes)) + def test_enum(self): + self.id["a"] = 5 + self.assertEqual(self.id["a"], 5) + self.assertTrue(isinstance(self.id["a"], int)) + def test_sequence_double_list(self): mylist = [1.2, 3.4, 5.6] self.id["a"] = mylist @@ -349,6 +354,24 @@ class TestRNAData(TestHelper, unittest.TestCase): rna_data = ui_data_test_prop_array.as_dict() self.assertEqual(rna_data["default"], [1, 2]) + # Test RNA data for enum property. + test_object.id_properties_clear() + test_object["test_enum_prop"] = 2 + ui_data_test_prop_enum = test_object.id_properties_ui("test_enum_prop") + ui_data_test_prop_enum_items = [ + ("TOMATOES", "Tomatoes", "Solanum lycopersicum"), + ("CUCUMBERS", "Cucumbers", "Cucumis sativus"), + ("RADISHES", "Radishes", "Raphanus raphanistrum"), + ] + ui_data_test_prop_enum.update(items=ui_data_test_prop_enum_items) + ui_data_test_prop_enum_items_full = [ + ("TOMATOES", "Tomatoes", "Solanum lycopersicum", 0, 0), + ("CUCUMBERS", "Cucumbers", "Cucumis sativus", 0, 1), + ("RADISHES", "Radishes", "Raphanus raphanistrum", 0, 2), + ] + rna_data = ui_data_test_prop_enum.as_dict() + self.assertEqual(rna_data["items"], ui_data_test_prop_enum_items_full) + if __name__ == '__main__': import sys diff --git a/tools/check_source/check_spelling_config.py b/tools/check_source/check_spelling_config.py index 6ce7e36c888..697765c5f3e 100644 --- a/tools/check_source/check_spelling_config.py +++ b/tools/check_source/check_spelling_config.py @@ -46,6 +46,7 @@ dict_custom = { "anisotropic", "anisotropy", "atomicity", + "attachmentless", "attenuations", "backlit", "bindless", @@ -54,6 +55,7 @@ dict_custom = { "boolean", "borderless", "breaked", + "browsable", "callables", "canonicalization", "canonicalize", @@ -73,6 +75,7 @@ dict_custom = { "confusticated", "constructability", "constructible", + "convolved", "coplanarity", "copyable", "correctors", @@ -377,8 +380,10 @@ dict_custom = { "teleporting", "templating", "tertiarily", + "thumbstick", "tokenize", "tokenizing", + "trackpad", "transcode", "transmissive", "triaging",