Merge branch 'bf-blender' into main

This commit is contained in:
Jaume Bellet 2023-12-10 12:28:17 +01:00
commit 23e28a8a9e
923 changed files with 24068 additions and 16792 deletions

View File

@ -59,4 +59,13 @@ trim_trailing_whitespace = true
insert_final_newline = true
indent_style = tab
indent_size = 4
max_line_length = 120
max_line_length = 120
# HTML
[*.html]
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 2
max_line_length = 99

View File

@ -0,0 +1,39 @@
name: Python API Documentation
about: File a bug report for the python API documentation
labels:
- "Type/Report"
- "Status/Needs Triage"
- "Priority/Normal"
body:
- type: markdown
attributes:
value: |
### Instructions
Thank you for reporting an issue with Blender's Python API documentation.
If you meant to file an issue with the software please create a normal [bug report](https://projects.blender.org/blender/blender/issues/new?template=.gitea%2fissue_template%2fbug.yaml).
Please add to the description below explain the issue at hand.
Use **Report issue on this page** at the bottom of the page with an issue to autofill some information.
Including details, examples, or suggested fixes are appreated and will help resolve the issue as soon as possible.
- type: textarea
id: body
attributes:
label: "Description"
hide_label: true
value: |
**Page Information**
Blender Version: (example: 4.0, edbf15d3c044, main)
[Permanent Link](https://docs.blender.org/api/current/) (Update me to the URL of the page with an issue)
**Short description of issue**
[Please fill out a short description of the issue here]
- type: markdown
attributes:
value: |
### Help the developers
Bug fixing is important, the developers will handle reports swiftly. For that reason, carefully provide exact steps and a **small and simple Python scipt** if neccesarry to reproduce the problem. You do your half of the work, then we do our half!

View File

@ -53,15 +53,11 @@ endif()
# quiet output for Makefiles, 'make -s' helps too
# set_property(GLOBAL PROPERTY RULE_MESSAGES OFF)
# global compile definitions since add_definitions() adds for all.
# Global compile definitions since add_definitions() adds for all.
# _DEBUG is a Visual Studio define, enabled for all platforms.
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS
$<$<CONFIG:Debug>:DEBUG;_DEBUG>
$<$<CONFIG:Release>:NDEBUG>
$<$<CONFIG:MinSizeRel>:NDEBUG>
$<$<CONFIG:RelWithDebInfo>:NDEBUG>
$<$<CONFIG:Debug>:_DEBUG>
)
# -----------------------------------------------------------------------------
# Set policy
@ -99,7 +95,6 @@ endif()
include(build_files/cmake/macros.cmake)
# -----------------------------------------------------------------------------
# Initialize Project
@ -733,6 +728,9 @@ mark_as_advanced(WITH_CXX_GUARDEDALLOC)
option(WITH_ASSERT_ABORT "Call abort() when raising an assertion through BLI_assert()" ON)
mark_as_advanced(WITH_ASSERT_ABORT)
option(WITH_ASSERT_RELEASE "Build with asserts enabled even for non-debug configurations" OFF)
mark_as_advanced(WITH_ASSERT_RELEASE)
if((UNIX AND NOT APPLE) OR (CMAKE_GENERATOR MATCHES "^Visual Studio.+"))
option(WITH_CLANG_TIDY "\
Use Clang Tidy to analyze the source code \
@ -1786,13 +1784,21 @@ if(CMAKE_COMPILER_IS_GNUCC)
CXX_WARN_NO_SUGGEST_OVERRIDE -Wno-suggest-override
CXX_WARN_UNINITIALIZED -Wuninitialized
# NOTE(@ideasman42): In GCC 13.2.1 on Linux this causes internal compiler errors.
# The crashes can be resolved by disabling the flag per module (but not via pragmas).
# However this also causes a type mix-up FreeStyle (Blender & FreeStyle's `Curve`)
# so it seems to impact GCC's the internal state enough that it's too risky to enable.
# When this is resolved the check can be enabled for fixed GCC versions.
#
# Prevents linking errors with MSVC.
# `CXX_WARN_MISMATCHED_TAGS -Wmismatched-tags`
# Useful but too many false positives and inconvenient to suppress each occurrence.
CXX_WARN_NO_STRINGOP_OVERREAD -Wno-stringop-overread
CXX_WARN_NO_STRINGOP_OVERFLOW -Wno-stringop-overflow
# Use `[[fallthrough]]` or `ATTR_FALLTHROUGH` macro to suppress.
CXX_WARN_IMPLICIT_FALLTHROUGH -Wimplicit-fallthrough=5
)
# causes too many warnings
@ -1895,6 +1901,9 @@ elseif(CMAKE_C_COMPILER_ID MATCHES "Clang")
CXX_WARN_UNDEF_PREFIX -Wundef-prefix
CXX_WARN_UNUSED_PARAMETER -Wunused-parameter
# Prevents linking errors with MSVC.
CXX_WARN_MISMATCHED_TAGS -Wmismatched-tags
# Gives too many unfixable warnings.
# `C_WARN_UNUSED_MACROS -Wunused-macros`
# `CXX_WARN_UNUSED_MACROS -Wunused-macros`
@ -2165,6 +2174,20 @@ if(WITH_ASSERT_ABORT)
add_definitions(-DWITH_ASSERT_ABORT)
endif()
# NDEBUG is the standard C define to disable asserts.
if(WITH_ASSERT_RELEASE)
# CMake seemingly be setting the NDEBUG flag on its own already on some configurations
# therefore we need to remove the flags if they happen to be set.
remove_cc_flag("-DNDEBUG") # GCC/CLang
remove_cc_flag("/DNDEBUG") # MSVC
else()
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS
$<$<CONFIG:Release>:NDEBUG>
$<$<CONFIG:MinSizeRel>:NDEBUG>
$<$<CONFIG:RelWithDebInfo>:NDEBUG>
)
endif()
# message(STATUS "Using CFLAGS: ${CMAKE_C_FLAGS}")
# message(STATUS "Using CXXFLAGS: ${CMAKE_CXX_FLAGS}")

View File

@ -9,6 +9,7 @@
#
set(WITH_ASSERT_ABORT ON CACHE BOOL "" FORCE)
set(WITH_ASSERT_RELEASE ON CACHE BOOL "" FORCE)
set(WITH_BUILDINFO OFF CACHE BOOL "" FORCE)
# Sadly ASAN is more often broken than working with MSVC do not enable it in the
# developer profile for now.

View File

@ -750,11 +750,11 @@ macro(remove_c_flag
_flag)
foreach(f ${ARGV})
string(REGEX REPLACE ${f} "" CMAKE_C_FLAGS ${CMAKE_C_FLAGS})
string(REGEX REPLACE ${f} "" CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})
string(REGEX REPLACE ${f} "" CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE})
string(REGEX REPLACE ${f} "" CMAKE_C_FLAGS_MINSIZEREL ${CMAKE_C_FLAGS_MINSIZEREL})
string(REGEX REPLACE ${f} "" CMAKE_C_FLAGS_RELWITHDEBINFO ${CMAKE_C_FLAGS_RELWITHDEBINFO})
string(REGEX REPLACE ${f} "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
string(REGEX REPLACE ${f} "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
string(REGEX REPLACE ${f} "" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
string(REGEX REPLACE ${f} "" CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL}")
string(REGEX REPLACE ${f} "" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
endforeach()
unset(f)
endmacro()
@ -763,11 +763,11 @@ macro(remove_cxx_flag
_flag)
foreach(f ${ARGV})
string(REGEX REPLACE ${f} "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
string(REGEX REPLACE ${f} "" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
string(REGEX REPLACE ${f} "" CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
string(REGEX REPLACE ${f} "" CMAKE_CXX_FLAGS_MINSIZEREL ${CMAKE_CXX_FLAGS_MINSIZEREL})
string(REGEX REPLACE ${f} "" CMAKE_CXX_FLAGS_RELWITHDEBINFO ${CMAKE_CXX_FLAGS_RELWITHDEBINFO})
string(REGEX REPLACE ${f} "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
string(REGEX REPLACE ${f} "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
string(REGEX REPLACE ${f} "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
string(REGEX REPLACE ${f} "" CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL}")
string(REGEX REPLACE ${f} "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
endforeach()
unset(f)
endmacro()

View File

@ -674,7 +674,6 @@ if(NOT OpenImageIO_FOUND)
set(OPENIMAGEIO_LIBRARIES ${OIIO_OPTIMIZED} ${OIIO_DEBUG})
set(OPENIMAGEIO_IDIFF "${OPENIMAGEIO}/bin/idiff.exe")
endif()
add_definitions(-DOIIO_NO_SSE=1)
if(WITH_LLVM)
set(LLVM_ROOT_DIR ${LIBDIR}/llvm CACHE PATH "Path to the LLVM installation")

View File

@ -150,11 +150,12 @@ def build_info(
print("parsing make log ...")
for line in makelog:
args: Union[str, List[str]] = line.split()
if not any([(c in args) for c in compilers]):
args_orig: Union[str, List[str]] = line.split()
args = [fake_compiler if c in compilers else c for c in args_orig]
if args == args_orig:
# No compilers in the command, skip.
continue
del args_orig
# join args incase they are not.
args = ' '.join(args)
@ -162,8 +163,6 @@ def build_info(
args = args.replace(" -D ", " -D")
args = args.replace(" -I ", " -I")
for c in compilers:
args = args.replace(c, fake_compiler)
args = shlex.split(args)
# end

View File

@ -1,5 +1,9 @@
<hr class="footer"/><address class="footer"><small>Generated on $datetime for $projectname by&#160;
<a href="http://www.doxygen.org/index.html">
doxygen</a> $doxygenversion </small></address>
<hr class="footer"/>
<address class="footer">
<small>Generated on $datetime for $projectname by&#160;
<a href="http://www.doxygen.org/index.html"> doxygen</a>
$doxygenversion
</small>
</address>
</body>
</html>

View File

@ -0,0 +1,22 @@
{# For the "Report Issue" button on the bottom of pages. #}
{%- extends "!footer.html" %}
{%- block extrafooter %}
{%- if not pagename in ("search", "404", "genindex") and hasdoc(pagename) %}
<div class="footer-contribute">
<ul>
<li>
<a href="https://projects.blender.org/blender/blender/issues/new?{#
#}template=.gitea/issue_template/api_docs.yaml&field:{#
#}body=%2A%2APage+Information%2A%2A%0D%0A{#
#}File%3A+%60{{ pagename }}{{ page_source_suffix }}%60%0D%0A{#
#}Blender+Version%3A+%60{{ version }}%60%0D%0A%5B{#
#}Permanent+Link%5D%28https%3A%2F%2Fdocs.blender.org%2F{#
#}api%2F{{ version }}%2F{{ pagename }}{{ file_suffix }}%29%0D%0A%0D%0A%2A%2A{#
#}Short+description+of+error%2A%2A%0D%0A%5B{#
#}Please+fill+out+a+short+description+of+the+error+here%5D%0D%0A"
class="fa fa-bug"> {{ _('Report issue on this page') }}</a>
</li>
</ul>
</div>
{%- endif %}
{% endblock %}

View File

@ -1,17 +1,19 @@
<div class="rst-versions" data-toggle="rst-versions" role="note" aria-label="document versions">
<ul id="versionwrap" role="presentation">
<li role="presentation">
<span id="version-popover" class="version-btn" tabindex="0" role="button" aria-label="versions selector" aria-haspopup="true" aria-controls="version-vsnlist" aria-disabled="true">
{{ release }}
</span>
<div class="version-dialog" aria-hidden="true">
<div class="version-arrow" aria-hidden="true"></div>
<div class="version-title">Versions</div>
<ul id="version-vsnlist" class="version-list" role="menu" aria-labelledby="version-popover" aria-hidden="true">
<li role="presentation">Loading...</li>
</ul>
</div>
</li>
</ul>
<ul id="versionwrap" role="presentation">
<li role="presentation">
<span id="version-popover" class="version-btn" tabindex="0" role="button"
aria-label="versions selector" aria-haspopup="true" aria-controls="version-vsnlist"
aria-disabled="true">
{{ release }}
</span>
<div class="version-dialog" aria-hidden="true">
<div class="version-arrow" aria-hidden="true"></div>
<div class="version-title">Versions</div>
<ul id="version-vsnlist" class="version-list" role="menu"
aria-labelledby="version-popover" aria-hidden="true">
<li role="presentation">Loading...</li>
</ul>
</div>
</li>
</ul>
</div>

View File

@ -1311,7 +1311,7 @@ int curve_fit_cubic_to_points_refit_db(
#ifdef USE_CORNER_DETECT
if (use_corner) {
#ifdef DEBUG
#ifndef NDEBUG
for (uint i = 0; i < knots_len; i++) {
assert(knots[i].heap_node == NULL);
}

View File

@ -206,7 +206,7 @@ static void rt_node_free(RangeTreeUInt *rt, Node *node);
#ifdef USE_BTREE
#ifdef DEBUG
#ifndef NDEBUG
static bool rb_is_balanced_root(const Node *root);
#endif
@ -238,7 +238,7 @@ static int key_cmp(uint key1, uint key2)
/* removed from the tree */
static void rb_node_invalidate(Node *node)
{
#ifdef DEBUG
#ifndef NDEBUG
node->left = NULL;
node->right = NULL;
node->color = false;
@ -481,7 +481,7 @@ static Node *rb_get_or_lower_recursive(Node *n, const uint key)
}
}
#ifdef DEBUG
#ifndef NDEBUG
static bool rb_is_balanced_recursive(const Node *node, int black)
{
@ -511,7 +511,7 @@ static bool rb_is_balanced_root(const Node *root)
return rb_is_balanced_recursive(root, black);
}
#endif // DEBUG
#endif // NDEBUG
/* End BTree API */
@ -703,7 +703,7 @@ RangeTreeUInt *range_tree_uint_alloc(uint min, uint max)
void range_tree_uint_free(RangeTreeUInt *rt)
{
#ifdef DEBUG
#ifndef NDEBUG
#ifdef USE_BTREE
assert(rb_is_balanced_root(rt->root));
#endif

View File

@ -43,7 +43,10 @@ if(WITH_BULLET)
add_subdirectory(rigidbody)
endif()
add_subdirectory(utfconv)
# only windows needs utf16 converter
if(WIN32)
add_subdirectory(utfconv)
endif()
if(WITH_MOD_FLUID)
add_subdirectory(mantaflow)

View File

@ -43,12 +43,6 @@ enum_feature_set = (
1),
)
enum_displacement_methods = (
('BUMP', "Bump Only", "Bump mapping to simulate the appearance of displacement"),
('DISPLACEMENT', "Displacement Only", "Use true displacement of surface only, requires fine subdivision"),
('BOTH', "Displacement and Bump", "Combination of true displacement and bump mapping for finer detail"),
)
enum_bvh_layouts = (
('BVH2', "BVH2", "", 1),
('EMBREE', "Embree", "", 4),
@ -1047,13 +1041,6 @@ class CyclesMaterialSettings(bpy.types.PropertyGroup):
min=0.001, max=1000.0, soft_min=0.1, soft_max=10.0, precision=4
)
displacement_method: EnumProperty(
name="Displacement Method",
description="Method to use for the displacement",
items=enum_displacement_methods,
default='BUMP',
)
@classmethod
def register(cls):
bpy.types.Material.cycles = PointerProperty(

View File

@ -300,15 +300,15 @@ def do_versions(self):
if version <= (2, 79, 2):
cmat = mat.cycles
if not cmat.is_property_set("displacement_method"):
cmat.displacement_method = 'BUMP'
if cmat.get("displacement_method", -1) == -1:
cmat['displacement_method'] = 0
# Change default to bump again.
if version <= (2, 79, 6) or \
(version >= (2, 80, 0) and version <= (2, 80, 41)):
cmat = mat.cycles
if not cmat.is_property_set("displacement_method"):
cmat.displacement_method = 'DISPLACEMENT'
if cmat.get("displacement_method", -1) == -1:
cmat['displacement_method'] = 1
if version <= (3, 5, 3):
cmat = mat.cycles

View File

@ -259,7 +259,7 @@ string HIPDevice::compile_kernel(const uint kernel_features, const char *name, c
# else
options.append("Wno-parentheses-equality -Wno-unused-value --hipcc-func-supp -O3 -ffast-math");
# endif
# ifdef _DEBUG
# ifndef NDEBUG
options.append(" -save-temps");
# endif
options.append(" --amdgpu-target=").append(arch);

View File

@ -4,6 +4,10 @@
#ifdef WITH_ONEAPI
/* <algorithm> is needed until included upstream in sycl/detail/property_list_base.hpp */
# include <algorithm>
# include <sycl/sycl.hpp>
# include "device/oneapi/device_impl.h"
# include "util/debug.h"
@ -25,6 +29,9 @@ extern "C" bool rtcIsSYCLDeviceSupported(const sycl::device sycl_device);
CCL_NAMESPACE_BEGIN
static std::vector<sycl::device> available_sycl_devices();
static int parse_driver_build_version(const sycl::device &device);
static void queue_error_cb(const char *message, void *user_ptr)
{
if (user_ptr) {
@ -545,7 +552,7 @@ void OneapiDevice::usm_free(void *usm_ptr)
void OneapiDevice::check_usm(SyclQueue *queue_, const void *usm_ptr, bool allow_host = false)
{
# ifdef _DEBUG
# ifndef NDEBUG
sycl::queue *queue = reinterpret_cast<sycl::queue *>(queue_);
sycl::info::device_type device_type =
queue->get_device().get_info<sycl::info::device::device_type>();
@ -574,7 +581,7 @@ bool OneapiDevice::create_queue(SyclQueue *&external_queue,
{
bool finished_correct = true;
try {
std::vector<sycl::device> devices = OneapiDevice::available_devices();
std::vector<sycl::device> devices = available_sycl_devices();
if (device_index < 0 || device_index >= devices.size()) {
return false;
}
@ -862,7 +869,7 @@ static const int lowest_supported_driver_version_neo = 26957;
static const int lowest_supported_driver_version_neo = 26918;
# endif
int OneapiDevice::parse_driver_build_version(const sycl::device &device)
int parse_driver_build_version(const sycl::device &device)
{
const std::string &driver_version = device.get_info<sycl::info::device::driver_version>();
int driver_build_version = 0;
@ -901,7 +908,7 @@ int OneapiDevice::parse_driver_build_version(const sycl::device &device)
return driver_build_version;
}
std::vector<sycl::device> OneapiDevice::available_devices()
std::vector<sycl::device> available_sycl_devices()
{
bool allow_all_devices = false;
if (getenv("CYCLES_ONEAPI_ALL_DEVICES") != nullptr) {
@ -971,7 +978,7 @@ char *OneapiDevice::device_capabilities()
{
std::stringstream capabilities;
const std::vector<sycl::device> &oneapi_devices = available_devices();
const std::vector<sycl::device> &oneapi_devices = available_sycl_devices();
for (const sycl::device &device : oneapi_devices) {
# ifndef WITH_ONEAPI_SYCL_HOST_TASK
const std::string &name = device.get_info<sycl::info::device::name>();
@ -1080,7 +1087,7 @@ char *OneapiDevice::device_capabilities()
void OneapiDevice::iterate_devices(OneAPIDeviceIteratorCallback cb, void *user_ptr)
{
int num = 0;
std::vector<sycl::device> devices = OneapiDevice::available_devices();
std::vector<sycl::device> devices = available_sycl_devices();
for (sycl::device &device : devices) {
const std::string &platform_name =
device.get_platform().get_info<sycl::info::platform::name>();

View File

@ -3,11 +3,6 @@
* SPDX-License-Identifier: Apache-2.0 */
#ifdef WITH_ONEAPI
/* <algorithm> is needed until included upstream in sycl/detail/property_list_base.hpp */
# include <algorithm>
# include <sycl/sycl.hpp>
# include "device/device.h"
# include "device/oneapi/device.h"
# include "device/oneapi/queue.h"
@ -106,9 +101,7 @@ class OneapiDevice : public Device {
void *usm_aligned_alloc_host(size_t memory_size, size_t alignment);
void usm_free(void *usm_ptr);
static std::vector<sycl::device> available_devices();
static char *device_capabilities();
static int parse_driver_build_version(const sycl::device &device);
static void iterate_devices(OneAPIDeviceIteratorCallback cb, void *user_ptr);
size_t get_memcapacity();

View File

@ -9,6 +9,7 @@
# include <array>
# include "device/device.h"
# include "device/oneapi/device_impl.h"
# include "device/queue.h"
# include "integrator/pass_accessor_cpu.h"
# include "session/buffers.h"
@ -27,13 +28,10 @@
CCL_NAMESPACE_BEGIN
/* Ideally, this would be dynamic and adaptively change when the runtime runs out of memory. */
constexpr int prefilter_max_mem = 1024;
thread_mutex OIDNDenoiserGPU::mutex_;
bool OIDNDenoiserGPU::is_device_type_supported(const DeviceType &type)
bool OIDNDenoiserGPU::is_device_supported(const DeviceInfo &device)
{
switch (type) {
/* Currently falls back to checking just the device type, can be improved. */
switch (device.type) {
# ifdef OIDN_DEVICE_SYCL
/* Assume all devices with Cycles support are also supported by OIDN2. */
case DEVICE_ONEAPI:
@ -44,12 +42,6 @@ bool OIDNDenoiserGPU::is_device_type_supported(const DeviceType &type)
}
}
bool OIDNDenoiserGPU::is_device_supported(const DeviceInfo &device)
{
/* Currently falls back to checking just the device type, can be improved. */
return is_device_type_supported(device.type);
}
OIDNDenoiserGPU::OIDNDenoiserGPU(Device *path_trace_device, const DenoiseParams &params)
: DenoiserGPU(path_trace_device, params)
{
@ -123,9 +115,11 @@ bool OIDNDenoiserGPU::denoise_create_if_needed(DenoiseContext &context)
}
switch (denoiser_device_->info.type) {
# if defined(OIDN_DEVICE_SYCL)
# if defined(OIDN_DEVICE_SYCL) && defined(WITH_ONEAPI)
case DEVICE_ONEAPI:
oidn_device_ = oidnNewDevice(OIDN_DEVICE_TYPE_SYCL);
oidn_device_ = oidnNewSYCLDevice(
(const sycl::queue *)reinterpret_cast<OneapiDevice *>(denoiser_device_)->sycl_queue(),
1);
denoiser_queue_->init_execution();
break;
# endif
@ -156,7 +150,6 @@ bool OIDNDenoiserGPU::denoise_create_if_needed(DenoiseContext &context)
if (context.use_pass_albedo) {
albedo_filter_ = create_filter();
if (albedo_filter_ == nullptr) {
oidnSetFilterInt(oidn_filter_, "maxMemoryMB", prefilter_max_mem);
return false;
}
}
@ -164,7 +157,6 @@ bool OIDNDenoiserGPU::denoise_create_if_needed(DenoiseContext &context)
if (context.use_pass_normal) {
normal_filter_ = create_filter();
if (normal_filter_ == nullptr) {
oidnSetFilterInt(oidn_filter_, "maxMemoryMB", prefilter_max_mem);
return false;
}
}

View File

@ -34,15 +34,10 @@ class OIDNDenoiserGPU : public DenoiserGPU {
bool allow_inplace_modification) override;
static bool is_device_supported(const DeviceInfo &device);
static bool is_device_type_supported(const DeviceType &type);
protected:
virtual uint get_device_type_mask() const override;
/* We only perform one denoising at a time, since OpenImageDenoise itself is multithreaded.
* Use this mutex whenever images are passed to the OIDN and needs to be denoised. */
static thread_mutex mutex_;
/* Create OIDN denoiser descriptor if needed.
* Will do nothing if the current OIDN descriptor is usable for the given parameters.
* If the OIDN denoiser descriptor did re-allocate here it is left unconfigured. */

View File

@ -2425,7 +2425,7 @@ NODE_DEFINE(GlassBsdfNode)
SOCKET_ENUM(
distribution, "Distribution", distribution_enum, CLOSURE_BSDF_MICROFACET_GGX_GLASS_ID);
SOCKET_IN_FLOAT(roughness, "Roughness", 0.0f);
SOCKET_IN_FLOAT(IOR, "IOR", 0.3f);
SOCKET_IN_FLOAT(IOR, "IOR", 1.5f);
SOCKET_OUT_CLOSURE(BSDF, "BSDF");
@ -2623,7 +2623,7 @@ NODE_DEFINE(PrincipledBsdfNode)
SOCKET_IN_COLOR(base_color, "Base Color", make_float3(0.8f, 0.8f, 0.8f))
SOCKET_IN_FLOAT(metallic, "Metallic", 0.0f);
SOCKET_IN_FLOAT(roughness, "Roughness", 0.5f);
SOCKET_IN_FLOAT(ior, "IOR", 0.0f);
SOCKET_IN_FLOAT(ior, "IOR", 1.5f);
SOCKET_IN_FLOAT(alpha, "Alpha", 1.0f);
SOCKET_IN_NORMAL(normal, "Normal", zero_float3(), SocketType::LINK_NORMAL);
@ -5781,7 +5781,7 @@ NODE_DEFINE(FresnelNode)
SOCKET_IN_NORMAL(
normal, "Normal", zero_float3(), SocketType::LINK_NORMAL | SocketType::OSL_INTERNAL);
SOCKET_IN_FLOAT(IOR, "IOR", 1.45f);
SOCKET_IN_FLOAT(IOR, "IOR", 1.5f);
SOCKET_OUT_FLOAT(fac, "Fac");

View File

@ -14,7 +14,8 @@
# pragma GCC diagnostic ignored "-Wlogical-op"
#endif
#ifdef __EIGEN3_MATRIX_C_API_CC__ /* quiet warning */
#ifdef __EIGEN3_MATRIX_C_API_CC__
/* Quiet warning. */
#endif
#include <Eigen/Core>

View File

@ -14,7 +14,8 @@
# pragma GCC diagnostic ignored "-Wlogical-op"
#endif
#ifdef __EIGEN3_SVD_C_API_CC__ /* quiet warning */
#ifdef __EIGEN3_SVD_C_API_CC__
/* Quiet warning. */
#endif
#include <Eigen/Core>

View File

@ -4,6 +4,7 @@
set(INC
PUBLIC .
../../source/blender/imbuf
)
set(INC_SYS
@ -71,7 +72,6 @@ set(SRC
set(LIB
PRIVATE bf::blenlib
PRIVATE bf::dna
PRIVATE bf::imbuf
PRIVATE bf::intern::clog
)

View File

@ -19,9 +19,9 @@ extern "C" {
/**
* Definition of a callback routine that receives events.
* \param event: The event received.
* \param userdata: The callback's user data, supplied to #GHOST_CreateSystem.
* \param user_data: The callback's user data, supplied to #GHOST_CreateSystem.
*/
typedef bool (*GHOST_EventCallbackProcPtr)(GHOST_EventHandle event, GHOST_TUserDataPtr userdata);
typedef bool (*GHOST_EventCallbackProcPtr)(GHOST_EventHandle event, GHOST_TUserDataPtr user_data);
/**
* Creates the one and only system.
@ -69,10 +69,10 @@ extern void GHOST_ShowMessageBox(GHOST_SystemHandle systemhandle,
/**
* Creates an event consumer object
* \param eventCallback: The event callback routine.
* \param userdata: Pointer to user data returned to the callback routine.
* \param user_data: Pointer to user data returned to the callback routine.
*/
extern GHOST_EventConsumerHandle GHOST_CreateEventConsumer(
GHOST_EventCallbackProcPtr eventCallback, GHOST_TUserDataPtr userdata);
GHOST_EventCallbackProcPtr eventCallback, GHOST_TUserDataPtr user_data);
/**
* Disposes an event consumer object
@ -105,7 +105,7 @@ extern GHOST_TimerTaskHandle GHOST_InstallTimer(GHOST_SystemHandle systemhandle,
uint64_t delay,
uint64_t interval,
GHOST_TimerProcPtr timerProc,
GHOST_TUserDataPtr userData);
GHOST_TUserDataPtr user_data);
/**
* Removes a timer.
@ -207,9 +207,9 @@ extern GHOST_TUserDataPtr GHOST_GetWindowUserData(GHOST_WindowHandle windowhandl
/**
* Changes the window user data.
* \param windowhandle: The handle to the window.
* \param userdata: The window user data.
* \param user_data: The window user data.
*/
extern void GHOST_SetWindowUserData(GHOST_WindowHandle windowhandle, GHOST_TUserDataPtr userdata);
extern void GHOST_SetWindowUserData(GHOST_WindowHandle windowhandle, GHOST_TUserDataPtr user_data);
extern bool GHOST_IsDialogWindow(GHOST_WindowHandle windowhandle);
@ -537,10 +537,10 @@ extern GHOST_TUserDataPtr GHOST_GetTimerTaskUserData(GHOST_TimerTaskHandle timer
/**
* Changes the time user data.
* \param timertaskhandle: The handle to the timer-task.
* \param userdata: The timer user data.
* \param user_data: The timer user data.
*/
extern void GHOST_SetTimerTaskUserData(GHOST_TimerTaskHandle timertaskhandle,
GHOST_TUserDataPtr userdata);
GHOST_TUserDataPtr user_data);
/**
* Returns indication as to whether the window is valid.
@ -580,8 +580,8 @@ extern GHOST_ContextHandle GHOST_GetDrawingContext(GHOST_WindowHandle windowhand
extern void GHOST_SetTitle(GHOST_WindowHandle windowhandle, const char *title);
/**
* Returns the title displayed in the title bar. The title
* should be free'd with free().
* Returns the title displayed in the title bar.
* The title must be freed with free().
*
* \param windowhandle: The handle to the window.
* \return The title, free with free().
@ -1165,7 +1165,7 @@ int GHOST_XrSyncActions(GHOST_XrContextHandle xr_context, const char *action_set
/**
* Apply an OpenXR haptic output action.
*/
int GHOST_XrApplyHapticAction(GHOST_XrContextHandle xr_context,
int GHOST_XrApplyHapticAction(GHOST_XrContextHandle xr_context_handle,
const char *action_set_name,
const char *action_name,
const char *subaction_path,
@ -1176,7 +1176,7 @@ int GHOST_XrApplyHapticAction(GHOST_XrContextHandle xr_context,
/**
* Stop a previously applied OpenXR haptic output action.
*/
void GHOST_XrStopHapticAction(GHOST_XrContextHandle xr_context,
void GHOST_XrStopHapticAction(GHOST_XrContextHandle xr_context_handle,
const char *action_set_name,
const char *action_name,
const char *subaction_path);

View File

@ -316,7 +316,7 @@ typedef enum {
} GHOST_TEventType;
typedef enum {
GHOST_kStandardCursorFirstCursor = 0,
#define GHOST_kStandardCursorFirstCursor int(GHOST_kStandardCursorDefault)
GHOST_kStandardCursorDefault = 0,
GHOST_kStandardCursorRightArrow,
GHOST_kStandardCursorLeftArrow,
@ -357,7 +357,7 @@ typedef enum {
GHOST_kStandardCursorCopy,
GHOST_kStandardCursorCustom,
GHOST_kStandardCursorNumCursors
#define GHOST_kStandardCursorNumCursors (int(GHOST_kStandardCursorCustom) + 1)
} GHOST_TStandardCursor;
typedef enum {

View File

@ -73,9 +73,9 @@ void GHOST_ShowMessageBox(GHOST_SystemHandle systemhandle,
}
GHOST_EventConsumerHandle GHOST_CreateEventConsumer(GHOST_EventCallbackProcPtr eventCallback,
GHOST_TUserDataPtr userdata)
GHOST_TUserDataPtr user_data)
{
return (GHOST_EventConsumerHandle) new GHOST_CallbackEventConsumer(eventCallback, userdata);
return (GHOST_EventConsumerHandle) new GHOST_CallbackEventConsumer(eventCallback, user_data);
}
GHOST_TSuccess GHOST_DisposeEventConsumer(GHOST_EventConsumerHandle consumerhandle)
@ -95,11 +95,11 @@ GHOST_TimerTaskHandle GHOST_InstallTimer(GHOST_SystemHandle systemhandle,
uint64_t delay,
uint64_t interval,
GHOST_TimerProcPtr timerproc,
GHOST_TUserDataPtr userdata)
GHOST_TUserDataPtr user_data)
{
GHOST_ISystem *system = (GHOST_ISystem *)systemhandle;
return (GHOST_TimerTaskHandle)system->installTimer(delay, interval, timerproc, userdata);
return (GHOST_TimerTaskHandle)system->installTimer(delay, interval, timerproc, user_data);
}
GHOST_TSuccess GHOST_RemoveTimer(GHOST_SystemHandle systemhandle,
@ -188,11 +188,11 @@ GHOST_TUserDataPtr GHOST_GetWindowUserData(GHOST_WindowHandle windowhandle)
return window->getUserData();
}
void GHOST_SetWindowUserData(GHOST_WindowHandle windowhandle, GHOST_TUserDataPtr userdata)
void GHOST_SetWindowUserData(GHOST_WindowHandle windowhandle, GHOST_TUserDataPtr user_data)
{
GHOST_IWindow *window = (GHOST_IWindow *)windowhandle;
window->setUserData(userdata);
window->setUserData(user_data);
}
bool GHOST_IsDialogWindow(GHOST_WindowHandle windowhandle)
@ -494,28 +494,28 @@ void GHOST_setAcceptDragOperation(GHOST_WindowHandle windowhandle, bool can_acce
GHOST_TEventType GHOST_GetEventType(GHOST_EventHandle eventhandle)
{
GHOST_IEvent *event = (GHOST_IEvent *)eventhandle;
const GHOST_IEvent *event = (const GHOST_IEvent *)eventhandle;
return event->getType();
}
uint64_t GHOST_GetEventTime(GHOST_EventHandle eventhandle)
{
GHOST_IEvent *event = (GHOST_IEvent *)eventhandle;
const GHOST_IEvent *event = (const GHOST_IEvent *)eventhandle;
return event->getTime();
}
GHOST_WindowHandle GHOST_GetEventWindow(GHOST_EventHandle eventhandle)
{
GHOST_IEvent *event = (GHOST_IEvent *)eventhandle;
const GHOST_IEvent *event = (const GHOST_IEvent *)eventhandle;
return (GHOST_WindowHandle)event->getWindow();
}
GHOST_TEventDataPtr GHOST_GetEventData(GHOST_EventHandle eventhandle)
{
GHOST_IEvent *event = (GHOST_IEvent *)eventhandle;
const GHOST_IEvent *event = (const GHOST_IEvent *)eventhandle;
return event->getData();
}
@ -541,11 +541,12 @@ GHOST_TUserDataPtr GHOST_GetTimerTaskUserData(GHOST_TimerTaskHandle timertaskhan
return timertask->getUserData();
}
void GHOST_SetTimerTaskUserData(GHOST_TimerTaskHandle timertaskhandle, GHOST_TUserDataPtr userdata)
void GHOST_SetTimerTaskUserData(GHOST_TimerTaskHandle timertaskhandle,
GHOST_TUserDataPtr user_data)
{
GHOST_ITimerTask *timertask = (GHOST_ITimerTask *)timertaskhandle;
timertask->setUserData(userdata);
timertask->setUserData(user_data);
}
bool GHOST_GetValid(GHOST_WindowHandle windowhandle)

View File

@ -352,7 +352,8 @@ GHOST_TSuccess GHOST_ContextEGL::initializeDrawingContext()
const char *egl_extension_st = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
assert(egl_extension_st != nullptr);
assert(strstr(egl_extension_st, "EGL_MESA_platform_surfaceless") != nullptr);
assert(egl_extension_st == nullptr ||
strstr(egl_extension_st, "EGL_MESA_platform_surfaceless") != nullptr);
if (egl_extension_st == nullptr ||
strstr(egl_extension_st, "EGL_MESA_platform_surfaceless") == nullptr)
{

View File

@ -303,7 +303,6 @@ class GHOST_DeviceVK {
}
fprintf(stderr, "Couldn't find any Graphic queue family on selected device\n");
return;
}
};
@ -318,7 +317,7 @@ static std::optional<GHOST_DeviceVK> vulkan_device;
static GHOST_TSuccess ensure_vulkan_device(VkInstance vk_instance,
VkSurfaceKHR vk_surface,
vector<const char *> required_extensions)
const vector<const char *> &required_extensions)
{
if (vulkan_device.has_value()) {
return GHOST_kSuccess;
@ -623,7 +622,7 @@ static vector<VkExtensionProperties> getExtensionsAvailable()
return extensions;
}
static bool checkExtensionSupport(vector<VkExtensionProperties> &extensions_available,
static bool checkExtensionSupport(const vector<VkExtensionProperties> &extensions_available,
const char *extension_name)
{
for (const auto &extension : extensions_available) {
@ -634,7 +633,7 @@ static bool checkExtensionSupport(vector<VkExtensionProperties> &extensions_avai
return false;
}
static void requireExtension(vector<VkExtensionProperties> &extensions_available,
static void requireExtension(const vector<VkExtensionProperties> &extensions_available,
vector<const char *> &extensions_enabled,
const char *extension_name)
{
@ -657,7 +656,8 @@ static vector<VkLayerProperties> getLayersAvailable()
return layers;
}
static bool checkLayerSupport(vector<VkLayerProperties> &layers_available, const char *layer_name)
static bool checkLayerSupport(const vector<VkLayerProperties> &layers_available,
const char *layer_name)
{
for (const auto &layer : layers_available) {
if (strcmp(layer_name, layer.layerName) == 0) {
@ -667,7 +667,7 @@ static bool checkLayerSupport(vector<VkLayerProperties> &layers_available, const
return false;
}
static void enableLayer(vector<VkLayerProperties> &layers_available,
static void enableLayer(const vector<VkLayerProperties> &layers_available,
vector<const char *> &layers_enabled,
const VkLayer layer,
const bool display_warning)
@ -789,7 +789,7 @@ static bool selectSurfaceFormat(const VkPhysicalDevice physical_device,
vector<VkSurfaceFormatKHR> formats(format_count);
vkGetPhysicalDeviceSurfaceFormatsKHR(physical_device, surface, &format_count, formats.data());
for (VkSurfaceFormatKHR &format : formats) {
for (const VkSurfaceFormatKHR &format : formats) {
if (surfaceFormatSupported(format)) {
r_surfaceFormat = format;
return true;

View File

@ -80,7 +80,7 @@ class GHOST_ContextVK : public GHOST_Context {
#endif
int contextMajorVersion,
int contextMinorVersion,
int m_debug);
int debug);
/**
* Destructor.

View File

@ -10,7 +10,7 @@
#pragma once
#ifdef _MSC_VER
# ifdef DEBUG
# ifdef _DEBUG
/* Suppress STL-MSVC debug info warning. */
# pragma warning(disable : 4786)
# endif

View File

@ -159,7 +159,7 @@ GHOST_TSuccess GHOST_DisplayManagerX11::setCurrentDisplaySetting(
fprintf(stderr, "Error: XF86VidMode extension missing!\n");
return GHOST_kFailure;
}
# ifdef DEBUG
# ifndef NDEBUG
printf("Using XFree86-VidModeExtension Version %d.%d\n", majorVersion, minorVersion);
# endif
@ -199,7 +199,7 @@ GHOST_TSuccess GHOST_DisplayManagerX11::setCurrentDisplaySetting(
}
if (best_fit != -1) {
# ifdef DEBUG
# ifndef NDEBUG
printf("Switching to video mode %dx%d %dx%d %d\n",
vidmodes[best_fit]->hdisplay,
vidmodes[best_fit]->vdisplay,

View File

@ -61,13 +61,6 @@ GHOST_TSuccess GHOST_System::putClipboardImage(uint * /*rgba*/,
return GHOST_kFailure;
}
uint64_t GHOST_System::getMilliSeconds() const
{
return std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now().time_since_epoch())
.count();
}
GHOST_ITimerTask *GHOST_System::installTimer(uint64_t delay,
uint64_t interval,
GHOST_TimerProcPtr timerProc,

View File

@ -54,14 +54,6 @@ class GHOST_System : public GHOST_ISystem {
* Time(r) functionality
***************************************************************************************/
/**
* Returns the system time.
* Returns the number of milliseconds since the start of the system process.
* Based on ANSI clock() routine.
* \return The number of milliseconds.
*/
virtual uint64_t getMilliSeconds() const;
/**
* Installs a timer.
*

View File

@ -454,7 +454,8 @@ void GHOST_SystemSDL::processEvent(SDL_Event *sdl_event)
switch (sdl_event->type) {
case SDL_WINDOWEVENT: {
SDL_WindowEvent &sdl_sub_evt = sdl_event->window;
const SDL_WindowEvent &sdl_sub_evt = sdl_event->window;
const uint64_t event_ms = sdl_sub_evt.timestamp;
GHOST_WindowSDL *window = findGhostWindow(
SDL_GetWindowFromID_fallback(sdl_sub_evt.windowID));
/* Can be nullptr on close window. */
@ -464,22 +465,22 @@ void GHOST_SystemSDL::processEvent(SDL_Event *sdl_event)
switch (sdl_sub_evt.event) {
case SDL_WINDOWEVENT_EXPOSED:
g_event = new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowUpdate, window);
g_event = new GHOST_Event(event_ms, GHOST_kEventWindowUpdate, window);
break;
case SDL_WINDOWEVENT_RESIZED:
g_event = new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowSize, window);
g_event = new GHOST_Event(event_ms, GHOST_kEventWindowSize, window);
break;
case SDL_WINDOWEVENT_MOVED:
g_event = new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowMove, window);
g_event = new GHOST_Event(event_ms, GHOST_kEventWindowMove, window);
break;
case SDL_WINDOWEVENT_FOCUS_GAINED:
g_event = new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowActivate, window);
g_event = new GHOST_Event(event_ms, GHOST_kEventWindowActivate, window);
break;
case SDL_WINDOWEVENT_FOCUS_LOST:
g_event = new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowDeactivate, window);
g_event = new GHOST_Event(event_ms, GHOST_kEventWindowDeactivate, window);
break;
case SDL_WINDOWEVENT_CLOSE:
g_event = new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowClose, window);
g_event = new GHOST_Event(event_ms, GHOST_kEventWindowClose, window);
break;
}
@ -487,13 +488,16 @@ void GHOST_SystemSDL::processEvent(SDL_Event *sdl_event)
}
case SDL_QUIT: {
const SDL_QuitEvent &sdl_sub_evt = sdl_event->quit;
const uint64_t event_ms = sdl_sub_evt.timestamp;
GHOST_IWindow *window = m_windowManager->getActiveWindow();
g_event = new GHOST_Event(getMilliSeconds(), GHOST_kEventQuitRequest, window);
g_event = new GHOST_Event(event_ms, GHOST_kEventQuitRequest, window);
break;
}
case SDL_MOUSEMOTION: {
SDL_MouseMotionEvent &sdl_sub_evt = sdl_event->motion;
const SDL_MouseMotionEvent &sdl_sub_evt = sdl_event->motion;
const uint64_t event_ms = sdl_sub_evt.timestamp;
SDL_Window *sdl_win = SDL_GetWindowFromID_fallback(sdl_sub_evt.windowID);
GHOST_WindowSDL *window = findGhostWindow(sdl_win);
assert(window != nullptr);
@ -535,7 +539,7 @@ void GHOST_SystemSDL::processEvent(SDL_Event *sdl_event)
SDL_WarpMouseInWindow(sdl_win, x_new - x_win, y_new - y_win);
}
g_event = new GHOST_EventCursor(getMilliSeconds(),
g_event = new GHOST_EventCursor(event_ms,
GHOST_kEventCursorMove,
window,
x_new,
@ -543,7 +547,7 @@ void GHOST_SystemSDL::processEvent(SDL_Event *sdl_event)
GHOST_TABLET_DATA_NONE);
}
else {
g_event = new GHOST_EventCursor(getMilliSeconds(),
g_event = new GHOST_EventCursor(event_ms,
GHOST_kEventCursorMove,
window,
x_root + x_accum,
@ -554,18 +558,15 @@ void GHOST_SystemSDL::processEvent(SDL_Event *sdl_event)
else
#endif
{
g_event = new GHOST_EventCursor(getMilliSeconds(),
GHOST_kEventCursorMove,
window,
x_root,
y_root,
GHOST_TABLET_DATA_NONE);
g_event = new GHOST_EventCursor(
event_ms, GHOST_kEventCursorMove, window, x_root, y_root, GHOST_TABLET_DATA_NONE);
}
break;
}
case SDL_MOUSEBUTTONUP:
case SDL_MOUSEBUTTONDOWN: {
SDL_MouseButtonEvent &sdl_sub_evt = sdl_event->button;
const SDL_MouseButtonEvent &sdl_sub_evt = sdl_event->button;
const uint64_t event_ms = sdl_sub_evt.timestamp;
GHOST_TButton gbmask = GHOST_kButtonMaskLeft;
GHOST_TEventType type = (sdl_sub_evt.state == SDL_PRESSED) ? GHOST_kEventButtonDown :
GHOST_kEventButtonUp;
@ -595,21 +596,22 @@ void GHOST_SystemSDL::processEvent(SDL_Event *sdl_event)
break;
}
g_event = new GHOST_EventButton(
getMilliSeconds(), type, window, gbmask, GHOST_TABLET_DATA_NONE);
g_event = new GHOST_EventButton(event_ms, type, window, gbmask, GHOST_TABLET_DATA_NONE);
break;
}
case SDL_MOUSEWHEEL: {
SDL_MouseWheelEvent &sdl_sub_evt = sdl_event->wheel;
const SDL_MouseWheelEvent &sdl_sub_evt = sdl_event->wheel;
const uint64_t event_ms = sdl_sub_evt.timestamp;
GHOST_WindowSDL *window = findGhostWindow(
SDL_GetWindowFromID_fallback(sdl_sub_evt.windowID));
assert(window != nullptr);
g_event = new GHOST_EventWheel(getMilliSeconds(), window, sdl_sub_evt.y);
g_event = new GHOST_EventWheel(event_ms, window, sdl_sub_evt.y);
break;
}
case SDL_KEYDOWN:
case SDL_KEYUP: {
SDL_KeyboardEvent &sdl_sub_evt = sdl_event->key;
const SDL_KeyboardEvent &sdl_sub_evt = sdl_event->key;
const uint64_t event_ms = sdl_sub_evt.timestamp;
GHOST_TEventType type = (sdl_sub_evt.state == SDL_PRESSED) ? GHOST_kEventKeyDown :
GHOST_kEventKeyUp;
const bool is_repeat = sdl_sub_evt.repeat != 0;
@ -629,7 +631,7 @@ void GHOST_SystemSDL::processEvent(SDL_Event *sdl_event)
utf8_buf[0] = convert_keyboard_event_to_ascii(sdl_sub_evt);
}
g_event = new GHOST_EventKey(getMilliSeconds(), type, window, gkey, is_repeat, utf8_buf);
g_event = new GHOST_EventKey(event_ms, type, window, gkey, is_repeat, utf8_buf);
break;
}
}
@ -670,7 +672,9 @@ bool GHOST_SystemSDL::generateWindowExposeEvents()
bool anyProcessed = false;
for (; w_start != w_end; ++w_start) {
GHOST_Event *g_event = new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowUpdate, *w_start);
/* The caller doesn't have a time-stamp. */
const uint64_t event_ms = getMilliSeconds();
GHOST_Event *g_event = new GHOST_Event(event_ms, GHOST_kEventWindowUpdate, *w_start);
(*w_start)->validate();

View File

@ -86,6 +86,8 @@
#include <cstring>
#include <mutex>
#include <pthread.h> /* For setting the thread priority. */
#ifdef HAVE_POLL
# include <poll.h>
#endif
@ -95,8 +97,6 @@
#ifdef USE_EVENT_BACKGROUND_THREAD
# include "GHOST_TimerTask.hh"
# include <pthread.h>
#endif
#ifdef WITH_GHOST_WAYLAND_LIBDECOR
@ -135,6 +135,11 @@ 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 *);
@ -372,6 +377,14 @@ static void gwl_simple_buffer_set_from_string(GWL_SimpleBuffer *buffer, const ch
*/
#define EVDEV_OFFSET 8
/**
* Data owned by the thread that updates the cursor.
* Exposed so the #GWL_Seat can request the thread to exit & free itself.
*/
struct GWL_Cursor_AnimHandle {
std::atomic<bool> exit_pending = false;
};
struct GWL_Cursor {
/** Wayland core types. */
@ -380,6 +393,10 @@ struct GWL_Cursor {
wl_buffer *buffer = nullptr;
wl_cursor_image image = {0};
wl_cursor_theme *theme = nullptr;
/** Only set when the cursor is from the theme (it may be animated). */
const wl_cursor *theme_cursor = nullptr;
/** Needed so changing the theme scale can reload 'theme_cursor' at a new scale. */
const char *theme_cursor_name = nullptr;
} wl;
bool visible = false;
@ -395,6 +412,10 @@ struct GWL_Cursor {
void *custom_data = nullptr;
/** The size of `custom_data` in bytes. */
size_t custom_data_size = 0;
/** Use for animated cursors. */
GWL_Cursor_AnimHandle *anim_handle = nullptr;
/**
* The name of the theme (set by an environment variable).
* When disabled, leave as an empty string and the default theme will be used.
@ -582,7 +603,7 @@ struct GWL_KeyRepeatPlayload {
xkb_keycode_t key_code;
/** Time time this timer started. */
/** Time this timer started. */
uint64_t time_ms_init;
/**
@ -1182,7 +1203,14 @@ struct GWL_RegistryEntry;
* see: #GHOST_SystemWayland::milliseconds_from_input_time.
*/
struct GWL_DisplayTimeStamp {
uint64_t last = 0;
/**
* When true, the GHOST & WAYLAND time-stamps are compatible,
* in most cases this means they will be equal however for systems with long up-times
* it may equal `uint32(GHOST_SystemWayland::getMilliSeconds())`,
* the `offsets` member is set to account for this case.
*/
bool exact_match = false;
uint32_t last = 0;
uint64_t offset = 0;
};
@ -1306,6 +1334,11 @@ static void gwl_display_destroy(GWL_Display *display)
}
#endif
/* Stop all animated cursors (freeing their #GWL_Cursor_AnimHandle). */
for (GWL_Seat *seat : display->seats) {
cursor_anim_end(seat);
}
/* For typical WAYLAND use this will always be set.
* However when WAYLAND isn't running, this will early-exit and be null. */
if (display->wl.registry) {
@ -1910,47 +1943,64 @@ static GHOST_TTabletMode tablet_tool_map_type(enum zwp_tablet_tool_v2_type wp_ta
static const int default_cursor_size = 24;
static const std::unordered_map<GHOST_TStandardCursor, const char *> ghost_wl_cursors = {
{GHOST_kStandardCursorDefault, "left_ptr"},
{GHOST_kStandardCursorRightArrow, "right_ptr"},
{GHOST_kStandardCursorLeftArrow, "left_ptr"},
{GHOST_kStandardCursorInfo, ""},
{GHOST_kStandardCursorDestroy, "pirate"},
{GHOST_kStandardCursorHelp, "question_arrow"},
{GHOST_kStandardCursorWait, "watch"},
{GHOST_kStandardCursorText, "xterm"},
{GHOST_kStandardCursorCrosshair, "crosshair"},
{GHOST_kStandardCursorCrosshairA, ""},
{GHOST_kStandardCursorCrosshairB, ""},
{GHOST_kStandardCursorCrosshairC, ""},
{GHOST_kStandardCursorPencil, "pencil"},
{GHOST_kStandardCursorUpArrow, "sb_up_arrow"},
{GHOST_kStandardCursorDownArrow, "sb_down_arrow"},
{GHOST_kStandardCursorVerticalSplit, "split_v"},
{GHOST_kStandardCursorHorizontalSplit, "split_h"},
{GHOST_kStandardCursorEraser, ""},
{GHOST_kStandardCursorKnife, ""},
{GHOST_kStandardCursorEyedropper, "color-picker"},
{GHOST_kStandardCursorZoomIn, "zoom-in"},
{GHOST_kStandardCursorZoomOut, "zoom-out"},
{GHOST_kStandardCursorMove, "move"},
{GHOST_kStandardCursorNSEWScroll, "size_all"}, /* Not an exact match. */
{GHOST_kStandardCursorNSScroll, "size_ver"}, /* Not an exact match. */
{GHOST_kStandardCursorEWScroll, "size_hor"}, /* Not an exact match. */
{GHOST_kStandardCursorStop, "not-allowed"},
{GHOST_kStandardCursorUpDown, "sb_v_double_arrow"},
{GHOST_kStandardCursorLeftRight, "sb_h_double_arrow"},
{GHOST_kStandardCursorTopSide, "top_side"},
{GHOST_kStandardCursorBottomSide, "bottom_side"},
{GHOST_kStandardCursorLeftSide, "left_side"},
{GHOST_kStandardCursorRightSide, "right_side"},
{GHOST_kStandardCursorTopLeftCorner, "top_left_corner"},
{GHOST_kStandardCursorTopRightCorner, "top_right_corner"},
{GHOST_kStandardCursorBottomRightCorner, "bottom_right_corner"},
{GHOST_kStandardCursorBottomLeftCorner, "bottom_left_corner"},
{GHOST_kStandardCursorCopy, "copy"},
struct GWL_Cursor_ShapeInfo {
const char *names[GHOST_kStandardCursorNumCursors] = {nullptr};
};
static const GWL_Cursor_ShapeInfo ghost_wl_cursors = []() -> GWL_Cursor_ShapeInfo {
GWL_Cursor_ShapeInfo info{};
#define CASE_CURSOR(shape_id, shape_name_in_theme) \
case shape_id: \
info.names[int(shape_id)] = shape_name_in_theme;
/* Use a switch to ensure missing values show a compiler warning. */
switch (GHOST_kStandardCursorDefault) {
CASE_CURSOR(GHOST_kStandardCursorDefault, "left_ptr");
CASE_CURSOR(GHOST_kStandardCursorRightArrow, "right_ptr");
CASE_CURSOR(GHOST_kStandardCursorLeftArrow, "left_ptr");
CASE_CURSOR(GHOST_kStandardCursorInfo, "left_ptr_help");
CASE_CURSOR(GHOST_kStandardCursorDestroy, "pirate");
CASE_CURSOR(GHOST_kStandardCursorHelp, "question_arrow");
CASE_CURSOR(GHOST_kStandardCursorWait, "watch");
CASE_CURSOR(GHOST_kStandardCursorText, "xterm");
CASE_CURSOR(GHOST_kStandardCursorCrosshair, "crosshair");
CASE_CURSOR(GHOST_kStandardCursorCrosshairA, "");
CASE_CURSOR(GHOST_kStandardCursorCrosshairB, "");
CASE_CURSOR(GHOST_kStandardCursorCrosshairC, "");
CASE_CURSOR(GHOST_kStandardCursorPencil, "pencil");
CASE_CURSOR(GHOST_kStandardCursorUpArrow, "sb_up_arrow");
CASE_CURSOR(GHOST_kStandardCursorDownArrow, "sb_down_arrow");
CASE_CURSOR(GHOST_kStandardCursorVerticalSplit, "split_v");
CASE_CURSOR(GHOST_kStandardCursorHorizontalSplit, "split_h");
CASE_CURSOR(GHOST_kStandardCursorEraser, "");
CASE_CURSOR(GHOST_kStandardCursorKnife, "");
CASE_CURSOR(GHOST_kStandardCursorEyedropper, "color-picker");
CASE_CURSOR(GHOST_kStandardCursorZoomIn, "zoom-in");
CASE_CURSOR(GHOST_kStandardCursorZoomOut, "zoom-out");
CASE_CURSOR(GHOST_kStandardCursorMove, "move");
CASE_CURSOR(GHOST_kStandardCursorNSEWScroll, "all-scroll");
CASE_CURSOR(GHOST_kStandardCursorNSScroll, "size_ver");
CASE_CURSOR(GHOST_kStandardCursorEWScroll, "size_hor");
CASE_CURSOR(GHOST_kStandardCursorStop, "not-allowed");
CASE_CURSOR(GHOST_kStandardCursorUpDown, "sb_v_double_arrow");
CASE_CURSOR(GHOST_kStandardCursorLeftRight, "sb_h_double_arrow");
CASE_CURSOR(GHOST_kStandardCursorTopSide, "top_side");
CASE_CURSOR(GHOST_kStandardCursorBottomSide, "bottom_side");
CASE_CURSOR(GHOST_kStandardCursorLeftSide, "left_side");
CASE_CURSOR(GHOST_kStandardCursorRightSide, "right_side");
CASE_CURSOR(GHOST_kStandardCursorTopLeftCorner, "top_left_corner");
CASE_CURSOR(GHOST_kStandardCursorTopRightCorner, "top_right_corner");
CASE_CURSOR(GHOST_kStandardCursorBottomRightCorner, "bottom_right_corner");
CASE_CURSOR(GHOST_kStandardCursorBottomLeftCorner, "bottom_left_corner");
CASE_CURSOR(GHOST_kStandardCursorCopy, "copy");
CASE_CURSOR(GHOST_kStandardCursorCustom, "");
}
#undef CASE_CURSOR
return info;
}();
static constexpr const char *ghost_wl_mime_text_plain = "text/plain";
static constexpr const char *ghost_wl_mime_text_utf8 = "text/plain;charset=utf-8";
static constexpr const char *ghost_wl_mime_text_uri = "text/uri-list";
@ -1976,6 +2026,27 @@ static const char *ghost_wl_mime_send[] = {
"text/plain",
};
static void pthread_set_min_priority(pthread_t handle)
{
int policy;
sched_param sch_params;
if (pthread_getschedparam(handle, &policy, &sch_params) == 0) {
sch_params.sched_priority = sched_get_priority_min(policy);
pthread_setschedparam(handle, policy, &sch_params);
}
}
static void thread_set_min_priority(std::thread &thread)
{
constexpr bool is_pthread = std::is_same<std::thread::native_handle_type, pthread_t>();
if (!is_pthread) {
return;
}
/* The cast is "safe" as non-matching types will have returned already.
* This cast might be avoided with clever template use. */
pthread_set_min_priority(reinterpret_cast<pthread_t>(thread.native_handle()));
}
static int memfd_create_sealed(const char *name)
{
#ifdef HAVE_MEMFD_CREATE
@ -2203,6 +2274,113 @@ static wl_buffer *ghost_wl_buffer_create_for_image(wl_shm *shm,
return buffer;
}
/**
* A version of `read` which will read `nbytes` or as many bytes as possible,
* useful as the LIBC version may `read` less than requested.
*/
static ssize_t read_exhaustive(const int fd, void *data, size_t nbytes)
{
ssize_t nbytes_read = read(fd, data, nbytes);
if (nbytes_read > 0) {
while (nbytes_read < nbytes) {
const ssize_t nbytes_extra = read(
fd, static_cast<char *>(data) + nbytes_read, nbytes - nbytes_read);
if (nbytes_extra > 0) {
nbytes_read += nbytes_extra;
}
else {
if (UNLIKELY(nbytes_extra < 0)) {
nbytes_read = nbytes_extra; /* Error. */
}
break;
}
}
}
return nbytes_read;
}
/**
* Read from `fd` into a buffer which is returned.
* Use for files where seeking to determine the final size isn't supported (pipes for e.g.).
*
* \return the buffer or null on failure.
* On failure `errno` will be set.
*/
static char *read_file_as_buffer(const int fd, const bool nil_terminate, size_t *r_len)
{
struct ByteChunk {
ByteChunk *next;
char data[4096 - sizeof(ByteChunk *)];
};
bool ok = true;
size_t len = 0;
ByteChunk *chunk_first = static_cast<ByteChunk *>(malloc(sizeof(ByteChunk)));
{
ByteChunk **chunk_link_p = &chunk_first;
ByteChunk *chunk = chunk_first;
while (true) {
if (UNLIKELY(chunk == nullptr)) {
errno = ENOMEM;
ok = false;
break;
}
chunk->next = nullptr;
/* Using `read` causes issues with GNOME, see: #106040). */
const ssize_t len_chunk = read_exhaustive(fd, chunk->data, sizeof(ByteChunk::data));
if (len_chunk <= 0) {
if (UNLIKELY(len_chunk < 0)) {
ok = false;
}
free(chunk);
break;
}
*chunk_link_p = chunk;
chunk_link_p = &chunk->next;
len += len_chunk;
if (len_chunk != sizeof(ByteChunk::data)) {
break;
}
chunk = static_cast<ByteChunk *>(malloc(sizeof(ByteChunk)));
}
}
char *buf = nullptr;
if (ok) {
buf = static_cast<char *>(malloc(len + (nil_terminate ? 1 : 0)));
if (UNLIKELY(buf == nullptr)) {
errno = ENOMEM;
ok = false;
}
}
if (ok) {
*r_len = len;
if (nil_terminate) {
buf[len] = '\0';
}
}
else {
*r_len = 0;
}
char *buf_stride = buf;
while (chunk_first) {
if (ok) {
const size_t len_chunk = std::min(len, sizeof(chunk_first->data));
memcpy(buf_stride, chunk_first->data, len_chunk);
buf_stride += len_chunk;
len -= len_chunk;
}
ByteChunk *chunk = chunk_first->next;
free(chunk_first);
chunk_first = chunk;
}
return buf;
}
/** \} */
/* -------------------------------------------------------------------- */
@ -2378,85 +2556,6 @@ static void dnd_events(const GWL_Seat *const seat,
}
}
/**
* Read from `fd` into a buffer which is returned.
* \return the buffer or null on failure.
*/
static char *read_file_as_buffer(const int fd, const bool nil_terminate, size_t *r_len)
{
struct ByteChunk {
ByteChunk *next;
/* NOTE(@ideasman42): On GNOME-SHELL-43.3, non powers of two values
* (1023 or 4088 for e.g.) makes `read()` *intermittently* include uninitialized memory
* (failing to read the end of the chunk) as well as truncating the end of the whole buffer.
* The WAYLAND spec doesn't mention buffer-size so this may be a bug in GNOME-SHELL.
* Whatever the case, using a power of two isn't a problem (besides some slop-space waste).
* This workaround isn't necessary for KDE & WLROOTS based compositors, see: #106040. */
char data[4096];
};
ByteChunk *chunk_first = nullptr, **chunk_link_p = &chunk_first;
bool ok = true;
size_t len = 0;
while (true) {
ByteChunk *chunk = static_cast<typeof(chunk)>(malloc(sizeof(*chunk)));
if (UNLIKELY(chunk == nullptr)) {
CLOG_WARN(LOG, "unable to allocate chunk for file buffer");
ok = false;
break;
}
chunk->next = nullptr;
const ssize_t len_chunk = read(fd, chunk->data, sizeof(chunk->data));
if (len_chunk <= 0) {
if (UNLIKELY(len_chunk < 0)) {
CLOG_WARN(LOG, "error reading from pipe: %s", std::strerror(errno));
ok = false;
}
free(chunk);
break;
}
if (chunk_first == nullptr) {
chunk_first = chunk;
}
*chunk_link_p = chunk;
chunk_link_p = &chunk->next;
len += len_chunk;
}
char *buf = nullptr;
if (ok) {
buf = static_cast<char *>(malloc(len + (nil_terminate ? 1 : 0)));
if (UNLIKELY(buf == nullptr)) {
CLOG_WARN(LOG, "unable to allocate file buffer: %zu bytes", len);
ok = false;
}
}
if (ok) {
*r_len = len;
if (nil_terminate) {
buf[len] = '\0';
}
}
else {
*r_len = 0;
}
char *buf_stride = buf;
while (chunk_first) {
if (ok) {
const size_t len_chunk = std::min(len, sizeof(chunk_first->data));
memcpy(buf_stride, chunk_first->data, len_chunk);
buf_stride += len_chunk;
len -= len_chunk;
}
ByteChunk *chunk = chunk_first->next;
free(chunk_first);
chunk_first = chunk;
}
return buf;
}
static char *read_buffer_from_data_offer(GWL_DataOffer *data_offer,
const char *mime_receive,
std::mutex *mutex,
@ -2483,6 +2582,9 @@ static char *read_buffer_from_data_offer(GWL_DataOffer *data_offer,
char *buf = nullptr;
if (pipefd_ok) {
buf = read_file_as_buffer(pipefd[0], nil_terminate, r_len);
if (buf == nullptr) {
CLOG_WARN(LOG, "unable to pipe into buffer: %s", std::strerror(errno));
}
close(pipefd[0]);
}
return buf;
@ -2511,6 +2613,9 @@ static char *read_buffer_from_primary_selection_offer(GWL_PrimarySelection_DataO
char *buf = nullptr;
if (pipefd_ok) {
buf = read_file_as_buffer(pipefd[0], nil_terminate, r_len);
if (buf == nullptr) {
CLOG_WARN(LOG, "unable to pipe into buffer: %s", std::strerror(errno));
}
close(pipefd[0]);
}
return buf;
@ -2999,6 +3104,11 @@ static bool update_cursor_scale(GWL_Cursor &cursor,
wl_cursor_theme_destroy(cursor.wl.theme);
cursor.wl.theme = wl_cursor_theme_load(
cursor.theme_name.c_str(), scale * cursor.theme_size, shm);
if (cursor.wl.theme_cursor) {
cursor.wl.theme_cursor = wl_cursor_theme_get_cursor(cursor.wl.theme,
cursor.wl.theme_cursor_name);
}
return true;
}
return false;
@ -6306,6 +6416,9 @@ static void gwl_display_event_thread_create(GWL_Display *display)
display->events_pending.reserve(events_pending_default_size);
display->events_pthread_is_active = true;
pthread_create(&display->events_pthread, nullptr, gwl_display_event_thread_fn, display);
/* Application logic should take priority, this only ensures events don't accumulate when busy
* which typically takes a while (5+ seconds of frantic mouse motion for e.g.). */
pthread_set_min_priority(display->events_pthread);
pthread_detach(display->events_pthread);
}
@ -6901,6 +7014,14 @@ uint8_t GHOST_SystemWayland::getNumDisplays() const
return display_ ? uint8_t(display_->outputs.size()) : 0;
}
uint64_t GHOST_SystemWayland::getMilliSeconds() const
{
/* Match the timing method used by LIBINPUT, so the result is closer to WAYLAND's time-stamps. */
struct timespec ts = {0, 0};
clock_gettime(CLOCK_MONOTONIC, &ts);
return (uint64_t(ts.tv_sec) * 1000) + uint64_t(ts.tv_nsec / 1000000);
}
static GHOST_TSuccess getCursorPositionClientRelative_impl(
const GWL_SeatStatePointer *seat_state_pointer,
const GHOST_WindowWayland *win,
@ -7263,7 +7384,7 @@ GHOST_IWindow *GHOST_SystemWayland::createWindow(const char *title,
*
* The caller is responsible for setting `seat->cursor.visible`.
*/
static void cursor_buffer_show(const GWL_Seat *seat)
static void cursor_buffer_show(GWL_Seat *seat)
{
const GWL_Cursor *cursor = &seat->cursor;
@ -7292,6 +7413,8 @@ static void cursor_buffer_show(const GWL_Seat *seat)
#endif
}
}
cursor_anim_reset(seat);
}
/**
@ -7300,8 +7423,10 @@ static void cursor_buffer_show(const GWL_Seat *seat)
*
* The caller is responsible for setting `seat->cursor.visible`.
*/
static void cursor_buffer_hide(const GWL_Seat *seat)
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);
@ -7324,12 +7449,11 @@ static int cursor_buffer_compatible_scale_from_image(const wl_cursor_image *wl_i
return scale;
}
static void cursor_buffer_set_surface_impl(const GWL_Seat *seat,
static void cursor_buffer_set_surface_impl(const wl_cursor_image *wl_image,
wl_buffer *buffer,
wl_surface *wl_surface,
const int scale)
{
const wl_cursor_image *wl_image = &seat->cursor.wl.image;
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,
@ -7341,10 +7465,11 @@ static void cursor_buffer_set_surface_impl(const GWL_Seat *seat,
wl_surface_commit(wl_surface);
}
static void cursor_buffer_set(const GWL_Seat *seat, wl_buffer *buffer)
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 wl_cursor_image *wl_image = &seat->cursor.wl.image;
const bool visible = (cursor->visible && cursor->is_hardware);
/* This is a requirement of WAYLAND, when this isn't the case,
@ -7354,7 +7479,7 @@ static void cursor_buffer_set(const GWL_Seat *seat, wl_buffer *buffer)
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(seat, buffer, cursor->wl.surface_cursor, 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,
@ -7371,7 +7496,7 @@ static void cursor_buffer_set(const GWL_Seat *seat, wl_buffer *buffer)
for (zwp_tablet_tool_v2 *zwp_tablet_tool_v2 : seat->wp.tablet_tools) {
GWL_TabletTool *tablet_tool = static_cast<GWL_TabletTool *>(
zwp_tablet_tool_v2_get_user_data(zwp_tablet_tool_v2));
cursor_buffer_set_surface_impl(seat, buffer, tablet_tool->wl.surface_cursor, scale);
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,
@ -7381,6 +7506,14 @@ static void cursor_buffer_set(const GWL_Seat *seat, wl_buffer *buffer)
}
}
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,
@ -7441,6 +7574,114 @@ 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`. */
@ -7449,26 +7690,14 @@ GHOST_TSuccess GHOST_SystemWayland::cursor_shape_set(const GHOST_TStandardCursor
if (UNLIKELY(!seat)) {
return GHOST_kFailure;
}
auto cursor_find = ghost_wl_cursors.find(shape);
const char *cursor_name = (cursor_find == ghost_wl_cursors.end()) ?
ghost_wl_cursors.at(GHOST_kStandardCursorDefault) :
(*cursor_find).second;
GWL_Cursor *cursor = &seat->cursor;
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, wl_shm_get());
}
wl_cursor *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);
const char *cursor_name = nullptr;
const wl_cursor *wl_cursor = cursor_find_from_shape(seat, shape, &cursor_name);
if (wl_cursor == nullptr) {
return GHOST_kFailure;
}
GWL_Cursor *cursor = &seat->cursor;
wl_cursor_image *image = wl_cursor->images[0];
wl_buffer *buffer = wl_cursor_image_get_buffer(image);
if (!buffer) {
@ -7479,8 +7708,10 @@ GHOST_TSuccess GHOST_SystemWayland::cursor_shape_set(const GHOST_TStandardCursor
cursor->is_custom = false;
cursor->wl.buffer = buffer;
cursor->wl.image = *image;
cursor->wl.theme_cursor = wl_cursor;
cursor->wl.theme_cursor_name = cursor_name;
cursor_buffer_set(seat, buffer);
cursor_buffer_set_from_seat(seat);
return GHOST_kSuccess;
}
@ -7488,12 +7719,9 @@ GHOST_TSuccess GHOST_SystemWayland::cursor_shape_set(const GHOST_TStandardCursor
GHOST_TSuccess GHOST_SystemWayland::cursor_shape_check(const GHOST_TStandardCursor cursorShape)
{
/* No need to lock `server_mutex`. */
auto cursor_find = ghost_wl_cursors.find(cursorShape);
if (cursor_find == ghost_wl_cursors.end()) {
return GHOST_kFailure;
}
const char *value = (*cursor_find).second;
if (*value == '\0') {
GWL_Seat *seat = gwl_display_seat_active_get(display_);
const wl_cursor *wl_cursor = cursor_find_from_shape(seat, cursorShape, nullptr);
if (wl_cursor == nullptr) {
return GHOST_kFailure;
}
return GHOST_kSuccess;
@ -7569,8 +7797,10 @@ GHOST_TSuccess GHOST_SystemWayland::cursor_shape_custom_set(const uint8_t *bitma
cursor->wl.image.height = uint32_t(sizey);
cursor->wl.image.hotspot_x = uint32_t(hotX);
cursor->wl.image.hotspot_y = uint32_t(hotY);
cursor->wl.theme_cursor = nullptr;
cursor->wl.theme_cursor_name = nullptr;
cursor_buffer_set(seat, buffer);
cursor_buffer_set_from_seat(seat);
return GHOST_kSuccess;
}
@ -7871,8 +8101,12 @@ GHOST_TimerManager *GHOST_SystemWayland::ghost_timer_manager()
#ifdef WITH_INPUT_IME
void GHOST_SystemWayland::ime_begin(
GHOST_WindowWayland *win, int32_t x, int32_t y, int32_t w, int32_t h, bool completed) const
void GHOST_SystemWayland::ime_begin(const GHOST_WindowWayland *win,
int32_t x,
int32_t y,
int32_t w,
int32_t h,
bool completed) const
{
GWL_Seat *seat = gwl_display_seat_active_get(display_);
if (UNLIKELY(!seat)) {
@ -7938,7 +8172,7 @@ void GHOST_SystemWayland::ime_begin(
}
}
void GHOST_SystemWayland::ime_end(GHOST_WindowWayland * /*window*/) const
void GHOST_SystemWayland::ime_end(const GHOST_WindowWayland * /*window*/) const
{
GWL_Seat *seat = gwl_display_seat_active_get(display_);
if (UNLIKELY(!seat)) {
@ -7998,23 +8232,38 @@ uint64_t GHOST_SystemWayland::ms_from_input_time(const uint32_t timestamp_as_uin
* This is updated because time may have passed between generating the time-stamp and `now`.
* The method here is used by SDL. */
const uint64_t now = getMilliSeconds();
GWL_DisplayTimeStamp &input_timestamp = display_->input_timestamp;
uint64_t timestamp = uint64_t(timestamp_as_uint);
if (timestamp < input_timestamp.last) {
if (timestamp_as_uint < input_timestamp.last) {
/* 32-bit timer rollover, bump the offset. */
input_timestamp.offset += uint64_t(std::numeric_limits<uint32_t>::max()) + 1;
}
input_timestamp.last = timestamp;
input_timestamp.last = timestamp_as_uint;
if (!input_timestamp.offset) {
input_timestamp.offset = (now - timestamp);
uint64_t timestamp = uint64_t(timestamp_as_uint);
if (input_timestamp.exact_match) {
timestamp += input_timestamp.offset;
}
timestamp += input_timestamp.offset;
else {
const uint64_t now = getMilliSeconds();
const uint32_t now_as_uint32 = uint32_t(now);
if (now_as_uint32 == timestamp_as_uint) {
input_timestamp.exact_match = true;
/* For systems with up times exceeding 47 days
* it's possible we need to begin with an offset. */
input_timestamp.offset = now - uint64_t(now_as_uint32);
timestamp = now;
}
else {
if (!input_timestamp.offset) {
input_timestamp.offset = (now - timestamp);
}
timestamp += input_timestamp.offset;
if (timestamp > now) {
input_timestamp.offset -= (timestamp - now);
timestamp = now;
if (timestamp > now) {
input_timestamp.offset -= (timestamp - now);
timestamp = now;
}
}
}
return timestamp;
@ -8133,7 +8382,7 @@ void GHOST_SystemWayland::output_scale_update(GWL_Output *output)
if (tablet_tool->wl.surface_cursor != nullptr) {
update_cursor_scale(seat->cursor,
seat->system->wl_shm_get(),
&seat->pointer,
&seat->tablet,
tablet_tool->wl.surface_cursor);
}
}

View File

@ -154,6 +154,8 @@ class GHOST_SystemWayland : public GHOST_System {
uint8_t getNumDisplays() const override;
uint64_t getMilliSeconds() const override;
GHOST_TSuccess getCursorPositionClientRelative(const GHOST_IWindow *window,
int32_t &x,
int32_t &y) const override;
@ -236,9 +238,13 @@ class GHOST_SystemWayland : public GHOST_System {
struct wl_shm *wl_shm_get() const;
void ime_begin(
GHOST_WindowWayland *win, int32_t x, int32_t y, int32_t w, int32_t h, bool completed) const;
void ime_end(GHOST_WindowWayland *win) const;
void ime_begin(const GHOST_WindowWayland *win,
int32_t x,
int32_t y,
int32_t w,
int32_t h,
bool completed) const;
void ime_end(const GHOST_WindowWayland *win) const;
static const char *xdg_app_id_get();

View File

@ -203,6 +203,26 @@ uint64_t GHOST_SystemWin32::getMilliSeconds() const
return performanceCounterToMillis(count);
}
/**
* Returns the number of milliseconds since the start of the Blender process to the time of the
* last message, using the high frequency timer if available. This should be used instead of
* getMilliSeconds when you need the time a message was delivered versus collected, so for all
* event creation that are in response to receiving a Windows message.
*/
static uint64_t getMessageTime(GHOST_SystemWin32 *system)
{
/* Get difference between last message time and now. */
int64_t t_delta = GetMessageTime() - GetTickCount();
/* Handle 32-bit rollover. */
if (t_delta > 0) {
t_delta -= int64_t(UINT32_MAX) + 1;
}
/* Return message time as 64-bit milliseconds since Blender start. */
return system->getMilliSeconds() + t_delta;
}
uint8_t GHOST_SystemWin32::getNumDisplays() const
{
GHOST_ASSERT(m_displayManager, "GHOST_SystemWin32::getNumDisplays(): m_displayManager==0\n");
@ -863,6 +883,7 @@ GHOST_EventButton *GHOST_SystemWin32::processButtonEvent(GHOST_TEventType type,
GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem();
GHOST_TabletData td = window->getTabletData();
const uint64_t event_ms = getMessageTime(system);
/* Move mouse to button event position. */
if (window->getTabletData().Active != GHOST_kTabletModeNone) {
@ -870,8 +891,8 @@ GHOST_EventButton *GHOST_SystemWin32::processButtonEvent(GHOST_TEventType type,
DWORD msgPos = ::GetMessagePos();
int msgPosX = GET_X_LPARAM(msgPos);
int msgPosY = GET_Y_LPARAM(msgPos);
system->pushEvent(new GHOST_EventCursor(
::GetMessageTime(), GHOST_kEventCursorMove, window, msgPosX, msgPosY, td));
system->pushEvent(
new GHOST_EventCursor(event_ms, GHOST_kEventCursorMove, window, msgPosX, msgPosY, td));
if (type == GHOST_kEventButtonDown) {
WINTAB_PRINTF("HWND %p OS button down\n", window->getHWND());
@ -882,7 +903,7 @@ GHOST_EventButton *GHOST_SystemWin32::processButtonEvent(GHOST_TEventType type,
}
window->updateMouseCapture(type == GHOST_kEventButtonDown ? MousePressed : MouseReleased);
return new GHOST_EventButton(system->getMilliSeconds(), type, window, mask, td);
return new GHOST_EventButton(event_ms, type, window, mask, td);
}
void GHOST_SystemWin32::processWintabEvent(GHOST_WindowWin32 *window)
@ -1026,8 +1047,8 @@ void GHOST_SystemWin32::processWintabEvent(GHOST_WindowWin32 *window)
int y = GET_Y_LPARAM(pos);
GHOST_TabletData td = wt->getLastTabletData();
system->pushEvent(new GHOST_EventCursor(
system->getMilliSeconds(), GHOST_kEventCursorMove, window, x, y, td));
system->pushEvent(
new GHOST_EventCursor(getMessageTime(system), GHOST_kEventCursorMove, window, x, y, td));
}
}
@ -1181,7 +1202,7 @@ GHOST_EventCursor *GHOST_SystemWin32::processCursorEvent(GHOST_WindowWin32 *wind
y_screen += y_accum;
}
return new GHOST_EventCursor(system->getMilliSeconds(),
return new GHOST_EventCursor(getMessageTime(system),
GHOST_kEventCursorMove,
window,
x_screen,
@ -1207,7 +1228,7 @@ void GHOST_SystemWin32::processWheelEvent(GHOST_WindowWin32 *window,
acc = abs(acc);
while (acc >= WHEEL_DELTA) {
system->pushEvent(new GHOST_EventWheel(system->getMilliSeconds(), window, direction));
system->pushEvent(new GHOST_EventWheel(getMessageTime(system), window, direction));
acc -= WHEEL_DELTA;
}
system->m_wheelDeltaAccum = acc * direction;
@ -1286,7 +1307,7 @@ GHOST_EventKey *GHOST_SystemWin32::processKeyEvent(GHOST_WindowWin32 *window, RA
}
#endif /* WITH_INPUT_IME */
event = new GHOST_EventKey(system->getMilliSeconds(),
event = new GHOST_EventKey(getMessageTime(system),
key_down ? GHOST_kEventKeyDown : GHOST_kEventKeyUp,
window,
key,
@ -1307,8 +1328,7 @@ GHOST_EventKey *GHOST_SystemWin32::processKeyEvent(GHOST_WindowWin32 *window, RA
GHOST_Event *GHOST_SystemWin32::processWindowSizeEvent(GHOST_WindowWin32 *window)
{
GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem();
GHOST_Event *sizeEvent = new GHOST_Event(
system->getMilliSeconds(), GHOST_kEventWindowSize, window);
GHOST_Event *sizeEvent = new GHOST_Event(getMessageTime(system), GHOST_kEventWindowSize, window);
/* We get WM_SIZE before we fully init. Do not dispatch before we are continuously resizing. */
if (window->m_inLiveResize) {
@ -1328,7 +1348,7 @@ GHOST_Event *GHOST_SystemWin32::processWindowEvent(GHOST_TEventType type,
system->getWindowManager()->setActiveWindow(window);
}
return new GHOST_Event(system->getMilliSeconds(), type, window);
return new GHOST_Event(getMessageTime(system), type, window);
}
#ifdef WITH_INPUT_IME
@ -1337,7 +1357,7 @@ GHOST_Event *GHOST_SystemWin32::processImeEvent(GHOST_TEventType type,
GHOST_TEventImeData *data)
{
GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem();
return new GHOST_EventIME(system->getMilliSeconds(), type, window, data);
return new GHOST_EventIME(getMessageTime(system), type, window, data);
}
#endif
@ -1350,7 +1370,7 @@ GHOST_TSuccess GHOST_SystemWin32::pushDragDropEvent(GHOST_TEventType eventType,
{
GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem();
return system->pushEvent(new GHOST_EventDragnDrop(
system->getMilliSeconds(), eventType, draggedObjectType, window, mouseX, mouseY, data));
getMessageTime(system), eventType, draggedObjectType, window, mouseX, mouseY, data));
}
void GHOST_SystemWin32::setTabletAPI(GHOST_TTabletAPI api)
@ -1479,7 +1499,7 @@ void GHOST_SystemWin32::processTrackpad()
system->getCursorPosition(cursor_x, cursor_y);
if (trackpad_info.x != 0 || trackpad_info.y != 0) {
system->pushEvent(new GHOST_EventTrackpad(system->getMilliSeconds(),
system->pushEvent(new GHOST_EventTrackpad(getMessageTime(system),
active_window,
GHOST_kTrackpadEventScroll,
cursor_x,
@ -1489,7 +1509,7 @@ void GHOST_SystemWin32::processTrackpad()
trackpad_info.isScrollDirectionInverted));
}
if (trackpad_info.scale != 0) {
system->pushEvent(new GHOST_EventTrackpad(system->getMilliSeconds(),
system->pushEvent(new GHOST_EventTrackpad(getMessageTime(system),
active_window,
GHOST_kTrackpadEventMagnify,
cursor_x,

View File

@ -55,21 +55,21 @@ class GHOST_SystemWin32 : public GHOST_System {
/**
* This method converts performance counter measurements into milliseconds since the start of the
* system process.
* \return The number of milliseconds since the start of the system process.
* Blender process.
* \return The number of milliseconds since the start of the Blender process.
*/
uint64_t performanceCounterToMillis(__int64 perf_ticks) const;
/**
* This method converts system ticks into milliseconds since the start of the
* system process.
* \return The number of milliseconds since the start of the system process.
* Blender process.
* \return The number of milliseconds since the start of the Blender process.
*/
uint64_t tickCountToMillis(__int64 ticks) const;
/**
* Returns the system time.
* Returns the number of milliseconds since the start of the system process.
* Returns the number of milliseconds since the start of the Blender process.
* This overloaded method uses the high frequency timer if available.
* \return The number of milliseconds.
*/

View File

@ -107,7 +107,11 @@ GHOST_SystemX11::GHOST_SystemX11()
: GHOST_System(),
m_xkb_descr(nullptr),
m_start_time(0),
m_start_time_monotonic(0),
m_keyboard_vector{0},
#ifdef WITH_X11_XINPUT
m_last_key_time(0),
#endif
m_keycode_last_repeat_key(uint(-1))
{
XInitThreads();
@ -172,14 +176,23 @@ GHOST_SystemX11::GHOST_SystemX11()
m_last_release_keycode = 0;
m_last_release_time = 0;
/* compute the initial time */
timeval tv;
if (gettimeofday(&tv, nullptr) == -1) {
GHOST_ASSERT(false, "Could not instantiate timer!");
/* Compute the initial times. */
{
timeval tv;
if (gettimeofday(&tv, nullptr) != 0) {
GHOST_ASSERT(false, "Could not instantiate timer!");
}
/* Taking care not to overflow the `tv.tv_sec * 1000`. */
m_start_time = uint64_t(tv.tv_sec) * 1000 + tv.tv_usec / 1000;
}
/* Taking care not to overflow the `tv.tv_sec * 1000`. */
m_start_time = uint64_t(tv.tv_sec) * 1000 + tv.tv_usec / 1000;
{
struct timespec ts = {0, 0};
if (clock_gettime(CLOCK_MONOTONIC, &ts) != 0) {
GHOST_ASSERT(false, "Could not instantiate monotonic timer!");
}
m_start_time_monotonic = (uint64_t(ts.tv_sec) * 1000) + uint64_t(ts.tv_nsec / 1000000);
}
/* Use detectable auto-repeat, mac and windows also do this. */
int use_xkb;
@ -203,7 +216,7 @@ GHOST_SystemX11::GHOST_SystemX11()
#endif
#ifdef WITH_X11_XINPUT
/* detect if we have xinput (for reuse) */
/* Detect if we have XINPUT (for reuse). */
{
memset(&m_xinput_version, 0, sizeof(m_xinput_version));
XExtensionVersion *version = XGetExtensionVersion(m_display, INAME);
@ -271,7 +284,7 @@ GHOST_TSuccess GHOST_SystemX11::init()
uint64_t GHOST_SystemX11::getMilliSeconds() const
{
timeval tv;
if (gettimeofday(&tv, nullptr) == -1) {
if (gettimeofday(&tv, nullptr) != 0) {
GHOST_ASSERT(false, "Could not compute time!");
}
@ -279,6 +292,17 @@ uint64_t GHOST_SystemX11::getMilliSeconds() const
return uint64_t(tv.tv_sec) * 1000 + tv.tv_usec / 1000 - m_start_time;
}
uint64_t GHOST_SystemX11::ms_from_input_time(const Time timestamp) const
{
GHOST_ASSERT(timestamp >= m_start_time_monotonic, "Invalid time-stamp");
/* NOTE(@ideasman42): Return a time compatible with `getMilliSeconds()`,
* this is needed as X11 time-stamps use monotonic time.
* The X11 implementation *could* use any basis, in practice though we are supporting
* XORG/LIBINPUT which uses time-stamps based on the monotonic time,
* Needed to resolve failure to detect double-clicking, see: #40009. */
return uint64_t(timestamp) - m_start_time_monotonic;
}
uint8_t GHOST_SystemX11::getNumDisplays() const
{
return uint8_t(1);
@ -593,6 +617,13 @@ bool GHOST_SystemX11::processEvents(bool waitForEvent)
}
}
/* Ensure generated time-stamps are non-zero. */
if (ELEM(xevent.type, KeyPress, KeyRelease)) {
if (xevent.xkey.time != 0) {
m_last_key_time = xevent.xkey.time;
}
}
/* dispatch event to XIM server */
if (XFilterEvent(&xevent, (Window) nullptr) == True) {
/* do nothing now, the event is consumed by XIM. */
@ -637,6 +668,7 @@ bool GHOST_SystemX11::processEvents(bool waitForEvent)
XPeekEvent(m_display, &xev_next);
if (ELEM(xev_next.type, KeyPress, KeyRelease)) {
const uint64_t event_ms = ms_from_input_time(xev_next.xkey.time);
/* XK_Hyper_L/R currently unused. */
const static KeySym modifiers[] = {
XK_Shift_L,
@ -652,7 +684,7 @@ bool GHOST_SystemX11::processEvents(bool waitForEvent)
for (int i = 0; i < int(ARRAY_SIZE(modifiers)); i++) {
KeyCode kc = XKeysymToKeycode(m_display, modifiers[i]);
if (kc != 0 && ((xevent.xkeymap.key_vector[kc >> 3] >> (kc & 7)) & 1) != 0) {
pushEvent(new GHOST_EventKey(getMilliSeconds(),
pushEvent(new GHOST_EventKey(event_ms,
GHOST_kEventKeyDown,
window,
ghost_key_from_keysym(modifiers[i]),
@ -850,16 +882,19 @@ void GHOST_SystemX11::processEvent(XEvent *xe)
const XExposeEvent &xee = xe->xexpose;
if (xee.count == 0) {
/* Only generate a single expose event
* per read of the event queue. */
/* Only generate a single expose event per read of the event queue. */
g_event = new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowUpdate, window);
/* Event has no timestamp. */
const uint64_t event_ms = getMilliSeconds();
g_event = new GHOST_Event(event_ms, GHOST_kEventWindowUpdate, window);
}
break;
}
case MotionNotify: {
const XMotionEvent &xme = xe->xmotion;
const uint64_t event_ms = ms_from_input_time(xme.time);
bool is_tablet = window->GetTabletData().Active != GHOST_kTabletModeNone;
@ -932,7 +967,7 @@ void GHOST_SystemX11::processEvent(XEvent *xe)
setCursorPosition(x_new, y_new); /* wrap */
}
else {
g_event = new GHOST_EventCursor(getMilliSeconds(),
g_event = new GHOST_EventCursor(event_ms,
GHOST_kEventCursorMove,
window,
xme.x_root + x_accum,
@ -941,7 +976,7 @@ void GHOST_SystemX11::processEvent(XEvent *xe)
}
}
else {
g_event = new GHOST_EventCursor(getMilliSeconds(),
g_event = new GHOST_EventCursor(event_ms,
GHOST_kEventCursorMove,
window,
xme.x_root,
@ -954,6 +989,14 @@ void GHOST_SystemX11::processEvent(XEvent *xe)
case KeyPress:
case KeyRelease: {
XKeyEvent *xke = &(xe->xkey);
#ifdef WITH_X11_XINPUT
/* Can be zero for XIM generated events. */
const Time time = xke->time ? xke->time : m_last_key_time;
#else
const Time time = xke->time;
#endif
const uint64_t event_ms = ms_from_input_time(time);
KeySym key_sym;
char *utf8_buf = nullptr;
char ascii;
@ -1146,7 +1189,7 @@ void GHOST_SystemX11::processEvent(XEvent *xe)
}
}
g_event = new GHOST_EventKey(getMilliSeconds(), type, window, gkey, is_repeat, utf8_buf);
g_event = new GHOST_EventKey(event_ms, type, window, gkey, is_repeat, utf8_buf);
#if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING)
/* when using IM for some languages such as Japanese,
@ -1171,8 +1214,7 @@ void GHOST_SystemX11::processEvent(XEvent *xe)
/* Enqueue previous character. */
pushEvent(g_event);
g_event = new GHOST_EventKey(
getMilliSeconds(), type, window, gkey, is_repeat, &utf8_buf[i]);
g_event = new GHOST_EventKey(event_ms, type, window, gkey, is_repeat, &utf8_buf[i]);
}
}
@ -1187,6 +1229,7 @@ void GHOST_SystemX11::processEvent(XEvent *xe)
case ButtonPress:
case ButtonRelease: {
const XButtonEvent &xbe = xe->xbutton;
const uint64_t event_ms = ms_from_input_time(xbe.time);
GHOST_TButton gbmask = GHOST_kButtonMaskLeft;
GHOST_TEventType type = (xbe.type == ButtonPress) ? GHOST_kEventButtonDown :
GHOST_kEventButtonUp;
@ -1194,13 +1237,13 @@ void GHOST_SystemX11::processEvent(XEvent *xe)
/* process wheel mouse events and break, only pass on press events */
if (xbe.button == Button4) {
if (xbe.type == ButtonPress) {
g_event = new GHOST_EventWheel(getMilliSeconds(), window, 1);
g_event = new GHOST_EventWheel(event_ms, window, 1);
}
break;
}
if (xbe.button == Button5) {
if (xbe.type == ButtonPress) {
g_event = new GHOST_EventWheel(getMilliSeconds(), window, -1);
g_event = new GHOST_EventWheel(event_ms, window, -1);
}
break;
}
@ -1234,15 +1277,17 @@ void GHOST_SystemX11::processEvent(XEvent *xe)
break;
}
g_event = new GHOST_EventButton(
getMilliSeconds(), type, window, gbmask, window->GetTabletData());
g_event = new GHOST_EventButton(event_ms, type, window, gbmask, window->GetTabletData());
break;
}
/* change of size, border, layer etc. */
case ConfigureNotify: {
// const XConfigureEvent & xce = xe->xconfigure;
g_event = new GHOST_Event(getMilliSeconds(), GHOST_kEventWindowSize, window);
/* Event has no timestamp. */
const uint64_t event_ms = getMilliSeconds();
g_event = new GHOST_Event(event_ms, GHOST_kEventWindowSize, window);
break;
}
@ -1338,8 +1383,9 @@ void GHOST_SystemX11::processEvent(XEvent *xe)
* also send grab/un-grab crossings for mouse-wheel events.
*/
const XCrossingEvent &xce = xe->xcrossing;
const uint64_t event_ms = ms_from_input_time(xce.time);
if (xce.mode == NotifyNormal) {
g_event = new GHOST_EventCursor(getMilliSeconds(),
g_event = new GHOST_EventCursor(event_ms,
GHOST_kEventCursorMove,
window,
xce.x_root,
@ -2538,8 +2584,12 @@ GHOST_TSuccess GHOST_SystemX11::pushDragDropEvent(GHOST_TEventType eventType,
void *data)
{
GHOST_SystemX11 *system = ((GHOST_SystemX11 *)getSystem());
/* Caller has no timestamp. */
const uint64_t event_ms = system->getMilliSeconds();
return system->pushEvent(new GHOST_EventDragnDrop(
system->getMilliSeconds(), eventType, draggedObjectType, window, mouseX, mouseY, data));
event_ms, eventType, draggedObjectType, window, mouseX, mouseY, data));
}
#endif
/**

View File

@ -200,6 +200,13 @@ class GHOST_SystemX11 : public GHOST_System {
}
#endif
/**
* Use this function instead of #GHOST_System::getMilliSeconds,
* passing in the time-stamp from X to input to get the event
* time-stamp with an offset applied to make it compatible with `getMilliSeconds`.
*/
uint64_t ms_from_input_time(const Time timestamp) const;
/** Helped function for get data from the clipboard. */
void getClipboard_xcout(const XEvent *evt,
Atom sel,
@ -343,6 +350,8 @@ class GHOST_SystemX11 : public GHOST_System {
/** Start time at initialization. */
uint64_t m_start_time;
/** Start time at initialization (using `CLOCK_MONOTONIC`). */
uint64_t m_start_time_monotonic;
/** A vector of keyboard key masks. */
char m_keyboard_vector[32];
@ -358,6 +367,11 @@ class GHOST_SystemX11 : public GHOST_System {
unsigned int m_last_release_keycode;
Time m_last_release_time;
#ifdef WITH_X11_XINPUT
/** Last key press or release, to apply to XIM generated events. */
Time m_last_key_time;
#endif
uint m_keycode_last_repeat_key;
/**

View File

@ -1153,7 +1153,7 @@ static void libdecor_frame_handle_configure(libdecor_frame *frame,
GWL_WindowFrame *frame_pending = &static_cast<GWL_Window *>(data)->frame_pending;
/* Set the size. */
int size_decor[2]{
int size_decor[2] = {
libdecor_frame_get_content_width(frame),
libdecor_frame_get_content_height(frame),
};

View File

@ -259,9 +259,8 @@ bool GHOST_XrAction::createBinding(XrInstance instance,
void GHOST_XrAction::destroyBinding(const char *profile_path)
{
if (m_profiles.find(profile_path) != m_profiles.end()) {
m_profiles.erase(profile_path);
}
/* It's possible nothing is removed. */
m_profiles.erase(profile_path);
}
void GHOST_XrAction::updateState(XrSession session,
@ -492,9 +491,8 @@ bool GHOST_XrActionSet::createAction(XrInstance instance, const GHOST_XrActionIn
void GHOST_XrActionSet::destroyAction(const char *action_name)
{
if (m_actions.find(action_name) != m_actions.end()) {
m_actions.erase(action_name);
}
/* It's possible nothing is removed. */
m_actions.erase(action_name);
}
GHOST_XrAction *GHOST_XrActionSet::findAction(const char *action_name)

View File

@ -169,10 +169,10 @@ void GHOST_XrContext::printInstanceInfo()
void GHOST_XrContext::printAvailableAPILayersAndExtensionsInfo()
{
puts("Available OpenXR API-layers/extensions:");
for (XrApiLayerProperties &layer_info : m_oxr->layers) {
for (const XrApiLayerProperties &layer_info : m_oxr->layers) {
printf("Layer: %s\n", layer_info.layerName);
}
for (XrExtensionProperties &ext_info : m_oxr->extensions) {
for (const XrExtensionProperties &ext_info : m_oxr->extensions) {
printf("Extension: %s\n", ext_info.extensionName);
}
}
@ -329,7 +329,7 @@ void GHOST_XrContext::initApiLayers()
/* Actually get the layers. */
CHECK_XR(xrEnumerateApiLayerProperties(layer_count, &layer_count, m_oxr->layers.data()),
"Failed to query OpenXR runtime information. Do you have an active runtime set up?");
for (XrApiLayerProperties &layer : m_oxr->layers) {
for (const XrApiLayerProperties &layer : m_oxr->layers) {
/* Each layer may have own extensions. */
initExtensionsEx(m_oxr->extensions, layer.layerName);
}

View File

@ -474,8 +474,8 @@ static void ghost_xr_draw_view_info_from_view(const XrView &view, GHOST_XrDrawVi
void GHOST_XrSession::drawView(GHOST_XrSwapchain &swapchain,
XrCompositionLayerProjectionView &r_proj_layer_view,
XrSpaceLocation &view_location,
XrView &view,
const XrSpaceLocation &view_location,
const XrView &view,
uint32_t view_idx,
void *draw_customdata)
{
@ -646,9 +646,8 @@ bool GHOST_XrSession::createActionSet(const GHOST_XrActionSetInfo &info)
void GHOST_XrSession::destroyActionSet(const char *action_set_name)
{
std::map<std::string, GHOST_XrActionSet> &action_sets = m_oxr->action_sets;
if (action_sets.find(action_set_name) != action_sets.end()) {
action_sets.erase(action_set_name);
}
/* It's possible nothing is removed. */
action_sets.erase(action_set_name);
}
bool GHOST_XrSession::createActions(const char *action_set_name,
@ -948,9 +947,8 @@ bool GHOST_XrSession::loadControllerModel(const char *subaction_path)
void GHOST_XrSession::unloadControllerModel(const char *subaction_path)
{
std::map<std::string, GHOST_XrControllerModel> &controller_models = m_oxr->controller_models;
if (controller_models.find(subaction_path) != controller_models.end()) {
controller_models.erase(subaction_path);
}
/* It's possible nothing is removed. */
controller_models.erase(subaction_path);
}
bool GHOST_XrSession::updateControllerModelComponents(const char *subaction_path)

View File

@ -109,8 +109,8 @@ class GHOST_XrSession {
std::vector<XrCompositionLayerProjectionView> &r_proj_layer_views, void *draw_customdata);
void drawView(GHOST_XrSwapchain &swapchain,
XrCompositionLayerProjectionView &r_proj_layer_view,
XrSpaceLocation &view_location,
XrView &view,
const XrSpaceLocation &view_location,
const XrView &view,
uint32_t view_idx,
void *draw_customdata);
void beginFrameDrawing();

View File

@ -6,6 +6,10 @@ if(HAVE_MALLOC_STATS_H)
add_definitions(-DHAVE_MALLOC_STATS_H)
endif()
if(WITH_MEM_VALGRIND)
add_definitions(-DWITH_MEM_VALGRIND)
endif()
set(INC
PUBLIC .
)

View File

@ -19,6 +19,12 @@
#include "MEM_guardedalloc.h"
/* Quiet warnings when dealing with allocated data written into the blend file.
* This also rounds up and causes warnings which we don't consider bugs in practice. */
#ifdef WITH_MEM_VALGRIND
# include "valgrind/memcheck.h"
#endif
/* to ensure strict conversions */
#include "../../source/blender/blenlib/BLI_strict_flags.h"
@ -445,14 +451,28 @@ void *MEM_guarded_mallocN(size_t len, const char *str)
{
MemHead *memh;
#ifdef WITH_MEM_VALGRIND
const size_t len_unaligned = len;
#endif
len = SIZET_ALIGN_4(len);
memh = (MemHead *)malloc(len + sizeof(MemHead) + sizeof(MemTail));
if (LIKELY(memh)) {
make_memhead_header(memh, len, str);
if (UNLIKELY(malloc_debug_memset && len)) {
memset(memh + 1, 255, len);
if (LIKELY(len)) {
if (UNLIKELY(malloc_debug_memset)) {
memset(memh + 1, 255, len);
}
#ifdef WITH_MEM_VALGRIND
if (malloc_debug_memset) {
VALGRIND_MAKE_MEM_UNDEFINED(memh + 1, len_unaligned);
}
else {
VALGRIND_MAKE_MEM_DEFINED((const char *)(memh + 1) + len_unaligned, len - len_unaligned);
}
#endif /* WITH_MEM_VALGRIND */
}
#ifdef DEBUG_MEMCOUNTER
@ -510,6 +530,9 @@ void *MEM_guarded_mallocN_aligned(size_t len, size_t alignment, const char *str)
*/
assert(alignment < 1024);
#ifdef WITH_MEM_VALGRIND
const size_t len_unaligned = len;
#endif
len = SIZET_ALIGN_4(len);
MemHead *memh = (MemHead *)aligned_malloc(
@ -524,8 +547,18 @@ void *MEM_guarded_mallocN_aligned(size_t len, size_t alignment, const char *str)
make_memhead_header(memh, len, str);
memh->alignment = (short)alignment;
if (UNLIKELY(malloc_debug_memset && len)) {
memset(memh + 1, 255, len);
if (LIKELY(len)) {
if (UNLIKELY(malloc_debug_memset)) {
memset(memh + 1, 255, len);
}
#ifdef WITH_MEM_VALGRIND
if (malloc_debug_memset) {
VALGRIND_MAKE_MEM_UNDEFINED(memh + 1, len_unaligned);
}
else {
VALGRIND_MAKE_MEM_DEFINED((const char *)(memh + 1) + len_unaligned, len - len_unaligned);
}
#endif /* WITH_MEM_VALGRIND */
}
#ifdef DEBUG_MEMCOUNTER
@ -1232,4 +1265,4 @@ void MEM_guarded_name_ptr_set(void *vmemh, const char *str)
MEMNEXT(memh->prev)->nextname = str;
}
}
#endif /* NDEBUG */
#endif /* !NDEBUG */

View File

@ -16,6 +16,12 @@
#include "MEM_guardedalloc.h"
/* Quiet warnings when dealing with allocated data written into the blend file.
* This also rounds up and causes warnings which we don't consider bugs in practice. */
#ifdef WITH_MEM_VALGRIND
# include "valgrind/memcheck.h"
#endif
/* to ensure strict conversions */
#include "../../source/blender/blenlib/BLI_strict_flags.h"
@ -244,13 +250,27 @@ void *MEM_lockfree_mallocN(size_t len, const char *str)
{
MemHead *memh;
#ifdef WITH_MEM_VALGRIND
const size_t len_unaligned = len;
#endif
len = SIZET_ALIGN_4(len);
memh = (MemHead *)malloc(len + sizeof(MemHead));
if (LIKELY(memh)) {
if (UNLIKELY(malloc_debug_memset && len)) {
memset(memh + 1, 255, len);
if (LIKELY(len)) {
if (UNLIKELY(malloc_debug_memset)) {
memset(memh + 1, 255, len);
}
#ifdef WITH_MEM_VALGRIND
if (malloc_debug_memset) {
VALGRIND_MAKE_MEM_UNDEFINED(memh + 1, len_unaligned);
}
else {
VALGRIND_MAKE_MEM_DEFINED((const char *)(memh + 1) + len_unaligned, len - len_unaligned);
}
#endif /* WITH_MEM_VALGRIND */
}
memh->len = len;
@ -305,6 +325,9 @@ void *MEM_lockfree_mallocN_aligned(size_t len, size_t alignment, const char *str
*/
size_t extra_padding = MEMHEAD_ALIGN_PADDING(alignment);
#ifdef WITH_MEM_VALGRIND
const size_t len_unaligned = len;
#endif
len = SIZET_ALIGN_4(len);
MemHeadAligned *memh = (MemHeadAligned *)aligned_malloc(
@ -317,8 +340,18 @@ void *MEM_lockfree_mallocN_aligned(size_t len, size_t alignment, const char *str
*/
memh = (MemHeadAligned *)((char *)memh + extra_padding);
if (UNLIKELY(malloc_debug_memset && len)) {
memset(memh + 1, 255, len);
if (LIKELY(len)) {
if (UNLIKELY(malloc_debug_memset)) {
memset(memh + 1, 255, len);
}
#ifdef WITH_MEM_VALGRIND
if (malloc_debug_memset) {
VALGRIND_MAKE_MEM_UNDEFINED(memh + 1, len_unaligned);
}
else {
VALGRIND_MAKE_MEM_DEFINED((const char *)(memh + 1) + len_unaligned, len - len_unaligned);
}
#endif /* WITH_MEM_VALGRIND */
}
memh->len = len | (size_t)MEMHEAD_ALIGN_FLAG;
@ -407,4 +440,4 @@ const char *MEM_lockfree_name_ptr(void *vmemh)
}
void MEM_lockfree_name_ptr_set(void *UNUSED(vmemh), const char *UNUSED(str)) {}
#endif /* NDEBUG */
#endif /* !NDEBUG */

View File

@ -3,7 +3,7 @@
# SPDX-License-Identifier: GPL-2.0-or-later
set(INC
PUBLIC .
.
)
set(INC_SYS
@ -19,16 +19,14 @@ set(SRC
set(LIB
)
# This library is currently windows only, for the other platforms an empty target is created this
# way we don't have to clutter if(WIN32) ... endif() all over the place to use this library.
# This is odd but leave it for now...
# Why have win32 check here? - this is only used for windows.
# ... because one day we might want to use it on other platforms.
if(WIN32)
list(APPEND SRC
utf_winfunc.cc
utf_winfunc.hh
)
blender_add_lib(bf_intern_utfconv "${SRC}" "${INC}" "${INC_SYS}" "${LIB}")
else()
add_library(bf_intern_utfconv INTERFACE)
endif()
add_library(bf::intern::utfconv ALIAS bf_intern_utfconv)
blender_add_lib(bf_intern_utfconv "${SRC}" "${INC}" "${INC_SYS}" "${LIB}")

View File

@ -7,7 +7,7 @@
# Line starting with a # are comments!
#
# Automatically generated by bl_i18n_utils/update_languages_menu.py script.
# Highest ID currently in use: 51
# Highest ID currently in use: 52
#
0:Complete:
0:Automatic (Automatic):DEFAULT
@ -36,6 +36,7 @@
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
22:Bulgarian (Български):bg_BG
23:Greek (Ελληνικά):el_GR
35:Esperanto (Esperanto):eo

View File

@ -1,7 +1,7 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\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"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2016-04-23 22:41+0300\n"
"Last-Translator: Yousef Harfoush <bat3a@msn.com>\n"
"Language-Team: Yousef Harfoush, Amine Moussaoui <bat3a@msn.com>\n"
@ -16668,6 +16668,10 @@ msgid "Vertex Group Specials"
msgstr "ﻂﻘﻨﻟﺍ ﺔﻋﻮﻤﺠﻣ ﺕﺎﻓﺎﺿﺇ"
msgid "Strip"
msgstr "ﻂﻳﺮﺷ"
msgid "Math"
msgstr "ﺏﺎﺴﺣ"
@ -16736,10 +16740,6 @@ msgid "Navigation"
msgstr "ﺢﻔّﺼﺗ"
msgid "Strip"
msgstr "ﻂﻳﺮﺷ"
msgid "Inputs"
msgstr "ﻞﺧﺍﺪﻣ"
@ -36842,6 +36842,11 @@ msgid "Toggle Fullscreen Area"
msgstr "ﺔﻠﻣﺎﻜﻟﺍ ﺔﺷﺎﺸﻟﺍ ﺔﻘﻄﻨﻣ ﺐﻠﻗﺇ"
msgctxt "Operator"
msgid "Sound"
msgstr "ﺕﻮﺻ"
msgctxt "Operator"
msgid "Track Ordering..."
msgstr "...ﺕﺍﺭﺎﺴﻤﻟﺍ ﺐﻴﺗﺮﺗ"
@ -36852,11 +36857,6 @@ msgid "Stop Tweaking Strip Actions"
msgstr "ﺕﺎﻛﺮﺤﻟﺍ ﺔﻃﺮﺷﺃ ﻞﻳﺪﻌﺗ ﻦﻋ ﻒﻗﻮﺗ"
msgctxt "Operator"
msgid "Add Tracks Above Selected"
msgstr "ﺭﺎﺘﺨﻤﻟﺍ ﻕﻮﻓ ﺕﺍﺭﺎﺴﻣ ﻒﺿﺃ"
msgctxt "Operator"
msgid "Remove from Frame"
msgstr "ﻞﻜﻟﺍ ﻦﻣ ﻑﺬﺣﺇ"
@ -36917,11 +36917,6 @@ msgid "Movie"
msgstr "ﻢﻠﻔﻟﺍ"
msgctxt "Operator"
msgid "Sound"
msgstr "ﺕﻮﺻ"
msgid "Storage"
msgstr "ﺔﻴﻄﻐﺘﻟﺍ"
@ -39416,10 +39411,6 @@ msgid "UV Vertex"
msgstr "ﺔﻄﻘﻨﻟﺍ ﻡﺪﺨﺘﺳﺍ"
msgid "Cannot open file: %s"
msgstr "%s :ﻒﻠﻤﻟﺍ ﺓءﺍﺮﻗ ﻦﻜﻤﻳ ﻻ"
msgid "Bone Envelopes"
msgstr "ﻢﻈﻌﻟﺍ ﺔﻔﻠﻏﺃ"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2023-09-26 10:37+0000\n"
"Last-Translator: Gilberto Rodrigues <gilbertorodrigues@outlook.com>\n"
"Language-Team: Bulgarian <https://translate.blender.org/projects/blender-ui/ui/bg/>\n"

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2023-10-12 15:54+0000\n"
"Last-Translator: Zdeněk Doležal <Griperis@outlook.cz>\n"
"Language-Team: Czech <https://translate.blender.org/projects/blender-ui/ui/cs/>\n"
@ -14475,6 +14475,10 @@ msgid "Vertex Group Specials"
msgstr "Skupina vertexů"
msgid "Strip"
msgstr "Proužek"
msgid "Utilities"
msgstr "Nástroje"
@ -14556,10 +14560,6 @@ msgid "Navigation"
msgstr "Navigace"
msgid "Strip"
msgstr "Proužek"
msgid "Inputs"
msgstr "Vstup"
@ -17865,10 +17865,6 @@ msgid "Set Alpha"
msgstr "Alfa"
msgid "Split Viewer"
msgstr "Rozdělený prohlížeč"
msgid "Stabilize 2D"
msgstr "Vybrat"
@ -23099,6 +23095,10 @@ msgid "Flat"
msgstr "Ploché"
msgid "Duplicate"
msgstr "Zdvojit"
msgctxt "Operator"
msgid "Select Mode"
msgstr "Seskupený objekt"
@ -24030,10 +24030,6 @@ msgid "Duplicate mesh and move"
msgstr "Zdvojit síť"
msgid "Duplicate"
msgstr "Zdvojit"
msgctxt "Operator"
msgid "Collapse Edges & Faces"
msgstr "Sbalit Hrany & Plochy"
@ -41879,6 +41875,11 @@ msgid "Vertical Split"
msgstr "Svisle rozdělit"
msgctxt "Operator"
msgid "Sound"
msgstr "Zvuk"
msgctxt "Operator"
msgid "Rename..."
msgstr "Přejmenovat..."
@ -41889,11 +41890,6 @@ msgid "Stop Tweaking Strip Actions"
msgstr "Zrušit Akci"
msgctxt "Operator"
msgid "Add Tracks Above Selected"
msgstr "Přidat stopy nad vybrané"
msgctxt "Operator"
msgid "Join in New Frame"
msgstr "Připojit v novém rámu"
@ -42014,11 +42010,6 @@ msgid "Movie"
msgstr "Film"
msgctxt "Operator"
msgid "Sound"
msgstr "Zvuk"
msgctxt "Operator"
msgid "Image/Sequence"
msgstr "Obrázek/sekvence"
@ -46288,10 +46279,6 @@ msgid "UV Vertex"
msgstr "Vrchol"
msgid "Cannot open file: %s"
msgstr "Nelze otevřít soubor: %s"
msgid "Bone Envelopes"
msgstr "Plášť"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: \n"
"Last-Translator: Martin Reininger <martinreininger@gmx.net>\n"
"Language-Team: German translation team\n"
@ -20409,6 +20409,10 @@ msgid "Add"
msgstr "Hinzufügen"
msgid "Strip"
msgstr "Streifen"
msgid "Math"
msgstr "Mathematisch"
@ -20518,10 +20522,6 @@ msgid "Select Handle"
msgstr "Griff auswählen"
msgid "Strip"
msgstr "Streifen"
msgid "Inputs"
msgstr "Eingaben"
@ -25225,10 +25225,6 @@ msgid "Replace Alpha"
msgstr "Alpha ersetzen"
msgid "Split Viewer"
msgstr "Ansicht teilen"
msgid "Stabilize 2D"
msgstr "2D stabilisieren"
@ -31911,6 +31907,10 @@ msgid "Flat"
msgstr "Flach"
msgid "Duplicate"
msgstr "Duplizieren"
msgctxt "Operator"
msgid "Select Mode"
msgstr "Modus auswählen"
@ -33063,10 +33063,6 @@ msgid "Duplicate mesh and move"
msgstr "Masche duplizieren und bewegen"
msgid "Duplicate"
msgstr "Duplizieren"
msgctxt "Operator"
msgid "Collapse Edges & Faces"
msgstr "Reduzieren Kanten & Gesichter"
@ -54337,13 +54333,13 @@ msgstr "Materialien maskieren"
msgctxt "Operator"
msgid "Lock Unused"
msgstr "Sperre unbenutztes"
msgid "Lock Unselected"
msgstr "Sperre unausgewähltes"
msgctxt "Operator"
msgid "Lock Unselected"
msgstr "Sperre unausgewähltes"
msgid "Lock Unused"
msgstr "Sperre unbenutztes"
msgctxt "Operator"
@ -55901,8 +55897,8 @@ msgstr "Vollbildbereich umschalten"
msgctxt "Operator"
msgid "Track Ordering..."
msgstr "Spurenreihenfolge..."
msgid "Sound"
msgstr "Klang"
msgctxt "Operator"
@ -55911,8 +55907,8 @@ msgstr "Umbenennen..."
msgctxt "Operator"
msgid "Add Tracks Above Selected"
msgstr "Spur über Auswahl hinzufügen"
msgid "Track Ordering..."
msgstr "Spurenreihenfolge..."
msgctxt "Operator"
@ -56163,11 +56159,6 @@ msgid "Movie"
msgstr "Film"
msgctxt "Operator"
msgid "Sound"
msgstr "Klang"
msgctxt "Operator"
msgid "Image/Sequence"
msgstr "Bild/Sequenz"
@ -62291,10 +62282,6 @@ msgid "UV Vertex"
msgstr "UV Knoten"
msgid "Cannot open file: %s"
msgstr "Datei kann nicht geöffnet werden: %s"
msgid "Bind To"
msgstr "Binden an"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2008-03-23 12:20+0200\n"
"Last-Translator: Kostas Karvouniaris <neogen556@yahoo.gr>\n"
"Language-Team: \n"

View File

@ -1,10 +1,10 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"PO-Revision-Date: 2023-11-26 07:54+0000\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 <gabcorreo@gmail.com>\n"
"Language-Team: Spanish <https://translate.blender.org/projects/blender-ui/ui/es/>\n"
"Language: es\n"
@ -1434,14 +1434,26 @@ msgid "All"
msgstr "Todo"
msgid "Show assets from all of the listed asset libraries"
msgstr "Mostrar los recursos de todas las bibliotecas de recursos listadas"
msgid "Current File"
msgstr "Archivo actual"
msgid "Show the assets currently available in this Blender session"
msgstr "Mostrar los recursos actualmente disponibles en esta sesión de Blender"
msgid "Essentials"
msgstr "Esenciales"
msgid "Show the basic building blocks and utilities coming with Blender"
msgstr "Mostrar los elementos basicos y utilidades que vienen con Blender"
msgid "Custom"
msgstr "Personalizado"
@ -24041,6 +24053,10 @@ msgid "Grease Pencil data-block"
msgstr "Bloque de datos de lápiz de cera"
msgid "Layer Groups"
msgstr "Grupos de capas"
msgid "Image data-block referencing an external or packed image"
msgstr "Bloque de datos de imagen referenciando a una imagen externa o empacada"
@ -24992,8 +25008,12 @@ msgid "Probe clip start, below which objects will not appear in reflections"
msgstr "Recorte inicial de la sonda, más allá del cual los objetos no aparecerán en reflejos"
msgid "Viewport display size of the sampled data"
msgstr "Tamaño de visualización en la Vista 3D de los datos muestreados"
msgid "Control how fast the probe influence decreases"
msgstr "Permite controlar qué tan rápido decae la influencia de la sonda"
msgstr "Permite controlar qué tan rápido decae la influencia de la sonda"
msgid "Bake Samples"
@ -25176,8 +25196,16 @@ msgid "Show the clipping distances in the 3D view"
msgstr "Mostrar las distancias de recorte en la vista 3D"
msgid "Display Data (Deprecated)"
msgstr "Mostrar datos (Obsoleto)"
msgid "Deprecated, use use_data_display instead"
msgstr "Obsoleto, en su lugar usar use_data_display"
msgid "Show the influence volume in the 3D view"
msgstr "Mostrar el volumen de influencia en la vista 3D"
msgstr "Mostrar el volumen de influencia en la Vista 3D"
msgid "Parallax"
@ -25200,6 +25228,18 @@ msgid "Type of light probe"
msgstr "Tipo de sonda de luz"
msgid "Light probe that captures precise lighting from all directions at a single point in space"
msgstr "Sonda de luz que captura la iluminación precisa desde todas las direcciones en un punto del espacio"
msgid "Light probe that captures incoming light from a single direction on a plane"
msgstr "Sonda de luz que captura la luz entrante desde una sola dirección en un plano"
msgid "Light probe that captures low frequency lighting inside a volume"
msgstr "Sonda de luz que captura iluminación de baja frecuencia dentro de un volumen"
msgid "Use Custom Parallax"
msgstr "Usar paralaje personalizado"
@ -25208,6 +25248,10 @@ msgid "Enable custom settings for the parallax correction volume"
msgstr "Habilita opciones personalizadas para el volumen de corrección de paralaje"
msgid "Display Data"
msgstr "Mostrar datos"
msgid "Visibility Bleed Bias"
msgstr "Desviación de sangrado de visibilidad"
@ -25405,6 +25449,14 @@ msgid "Line art settings for material"
msgstr "Opciones de arte lineal del material"
msgid "Max Vertex Displacement"
msgstr "Desplazamiento máximo de vértices"
msgid "The max distance a vertex can be displaced. Displacements over this threshold may cause visibility issues"
msgstr "La distancia máxima que se podrá desplazar un vértice. Desplazamientos por encima de este umbral podrán causar problemas de visibilidad"
msgid "Metallic"
msgstr "Metálico"
@ -35205,6 +35257,10 @@ msgid "NLA"
msgstr "ANL"
msgid "Strip"
msgstr "Clip"
msgid "Utilities"
msgstr "Utilitarios"
@ -35344,10 +35400,6 @@ msgid "Select Handle"
msgstr "Seleccionar asa"
msgid "Strip"
msgstr "Clip"
msgid "Inputs"
msgstr "Entradas"
@ -37681,7 +37733,7 @@ msgstr "Sobrescribir los datos de todos los elementos"
msgid "Above Threshold"
msgstr "Por sobre del umbral"
msgstr "Por sobre el umbral"
msgid "Only replace destination elements where data is above given threshold (exact behavior depends on data type)"
@ -44524,10 +44576,6 @@ msgid "Replace the input image's alpha channel by the alpha input value"
msgstr "Reemplaza el canal alfa de la imagen de entrada con el valor Alfa"
msgid "Split Viewer"
msgstr "Visor dividido"
msgid "Stabilize 2D"
msgstr "Estabilización 2D"
@ -45955,14 +46003,6 @@ msgid "Shortest Edge Paths"
msgstr "Caminos más cortos"
msgid "Signed Distance"
msgstr "Distancia con signo"
msgid "Retrieve the signed distance field grid called 'distance' from a volume"
msgstr "Proporciona la cuadrícula de campos de distancia con signo de un volumen (llamado 'distance')"
msgid "Is Spline Cyclic"
msgstr "Es curva cíclica"
@ -46039,14 +46079,6 @@ msgid "Provide a selection of faces that use the specified material"
msgstr "Proporciona una selección de caras que usan el material especificado"
msgid "Mean Filter SDF Volume"
msgstr "Promediar volumen SDF"
msgid "Smooth the surface of an SDF volume by applying a mean filter"
msgstr "Suaviza la superficie de un volumen SDF aplicando un filtro de promedio"
msgid "Merge by Distance"
msgstr "Fusionar por distancia"
@ -46183,22 +46215,14 @@ msgid "Create a point in the point cloud for each selected face corner"
msgstr "Crear un punto en la nube de puntos para cada esquina de la cara seleccionada"
msgid "Mesh to SDF Volume"
msgstr "Malla a volumen SDF"
msgid "Create an SDF volume with the shape of the input mesh's surface"
msgstr "Crea un volumen SDF con la forma de la superficie de la malla de entrada"
msgid "Create a fog volume with the shape of the input mesh's surface"
msgstr "Crea un volumen de humo con la forma de la superficie de la malla de entrada"
msgid "How the voxel size is specified"
msgstr "Modo de especificar el tamaño de los vóxeles"
msgid "Create a fog volume with the shape of the input mesh's surface"
msgstr "Crea un volumen de humo con la forma de la superficie de la malla de entrada"
msgid "UV Sphere"
msgstr "Esfera"
@ -46243,14 +46267,6 @@ msgid "Offset a control point index within its curve"
msgstr "Desplaza el identificador de un punto de control dentro de su curva"
msgid "Offset SDF Volume"
msgstr "Desplazar volumen SDF"
msgid "Move the surface of an SDF volume inwards or outwards"
msgstr "Mueve la superficie de un volumen SDF hacia adentro o afuera"
msgid "Generate a point cloud with positions and radii defined by fields"
msgstr "Genera una nube de puntos con ubicaciones y radios definidos mediante campos"
@ -46271,22 +46287,6 @@ msgid "Split all points to curve by its group ID and reorder by weight"
msgstr "Genera curvas usando puntos, dividiéndolas según el ID de grupo de cada punto y ordenando los puntos de cada curva mediante su valor de influencia"
msgid "Points to SDF Volume"
msgstr "Puntos a volumen SDF"
msgid "Generate an SDF volume sphere around every point"
msgstr "Genera un volumen SDF esférico alrededor de cada punto"
msgid "Specify the approximate number of voxels along the diagonal"
msgstr "Especificar la cantidad aproximada de vóxeles a lo largo de la diagonal"
msgid "Specify the voxel side length"
msgstr "Especificar la longitud lateral de los vóxeles"
msgid "Points to Vertices"
msgstr "Puntos a vértices"
@ -46303,6 +46303,14 @@ msgid "Generate a fog volume sphere around every point"
msgstr "Genera un volumen esférico de humo alrededor de cada punto"
msgid "Specify the approximate number of voxels along the diagonal"
msgstr "Especificar la cantidad aproximada de vóxeles a lo largo de la diagonal"
msgid "Specify the voxel side length"
msgstr "Especificar la longitud lateral de los vóxeles"
msgid "Geometry Proximity"
msgstr "Proximidad a geometría"
@ -46447,14 +46455,6 @@ msgid "Rotate geometry instances in local or global space"
msgstr "Rota la geometría de las instancias en espacio local o global"
msgid "SDF Volume Sphere"
msgstr "Volumen SDF esférico"
msgid "Generate an SDF Volume Sphere"
msgstr "Genera un volumen SDF con forma esférica"
msgid "Sample Curve"
msgstr "Muestrear curva"
@ -46519,42 +46519,6 @@ msgid "Calculate the interpolated values of a mesh attribute at a UV coordinate"
msgstr "Calcula los valores interpolados de un atributo de la malla en una coordenada UV"
msgid "Sample Volume"
msgstr "Muestrear volumen"
msgid "Calculate the interpolated values of a Volume grid at the specified position"
msgstr "Calcula los valores interpolados de la cuadrícula de un volumen en la posición especificada"
msgid "Grid Type"
msgstr "Tipo de cuadrícula"
msgid "Type of grid to sample data from"
msgstr "Tipo de cuadrícula desde la cual tomar muestras de datos"
msgid "Interpolation Mode"
msgstr "Modo de interpolación"
msgid "How to interpolate the values from neighboring voxels"
msgstr "Cómo interpolar los valores a partir de los vóxeles cercanos"
msgid "Nearest Neighbor"
msgstr "Más cercano"
msgid "Trilinear"
msgstr "Trilineal"
msgid "Triquadratic"
msgstr "Tricuadrático"
msgid "Scale Elements"
msgstr "Escalar elementos"
@ -60894,6 +60858,10 @@ msgid "Enter/Exit draw mode for grease pencil"
msgstr "Ingresar/Salir del modo de dibujo de lápiz de cera"
msgid "Duplicate"
msgstr "Duplicar"
msgid "Insert a blank frame on the current scene frame"
msgstr "Inserta un fotograma en blanco en el fotograma actual de la escena"
@ -63342,10 +63310,6 @@ msgid "Duplicate mesh and move"
msgstr "Duplicar malla y mover"
msgid "Duplicate"
msgstr "Duplicar"
msgctxt "Operator"
msgid "Collapse Edges & Faces"
msgstr "Colapsar bordes y caras"
@ -65391,7 +65355,7 @@ msgstr "Aplica las posiciones de los vértices seleccionados a todas las restant
msgid "Edge Tag"
msgstr "Etiqueta de borde"
msgstr "Etiquetar bordes"
msgid "The edge flag to tag when selecting the shortest path"
@ -75703,15 +75667,6 @@ msgid "Project the geometry onto a plane defined by a line"
msgstr "Proyecta la geometría sobre un plano definido mediante una línea"
msgctxt "Operator"
msgid "Reveal All"
msgstr "Revelar todo"
msgid "Unhide all geometry"
msgstr "Vuelve a mostrar toda la geometría"
msgid "Sample the vertex color of the active vertex"
msgstr "Toma una muestra del color del vértice activo"
@ -86114,7 +86069,7 @@ msgstr "Modo Edición de Mallas"
msgid "Measurement"
msgstr "Medida"
msgstr "Medición"
msgid "Motion Tracking"
@ -104704,7 +104659,7 @@ msgstr "Muestra textos sobreimpresos"
msgid "Display Vertex Normals"
msgstr "Mostrar normales vértices"
msgstr "Mostrar normales de vértices"
msgid "Display vertex normals as lines"
@ -109702,7 +109657,7 @@ msgstr "Sobreimpresos personalizados"
msgid "Object Extras"
msgstr "Opciones extra"
msgstr "Objetos adicionales"
msgid "Controller Style"
@ -111530,6 +111485,18 @@ msgid "Invert"
msgstr "Invertir"
msgid "Max Displacement"
msgstr "Desplazamiento máx"
msgid "Render Method"
msgstr "Método de procesamiento"
msgid "Light Probe Volume"
msgstr "Sonda de luz Volumen"
msgid "Intersection"
msgstr "Intersección"
@ -111542,9 +111509,16 @@ msgid "Custom Occlusion"
msgstr "Oclusión personalizada"
msgctxt "Operator"
msgid "Lock Unused"
msgstr "Bloquear no usados"
msgid "Unsupported displacement method"
msgstr "Método de desplazamiento no soportado"
msgid "Transparency Overlap"
msgstr "Superposición de transparencias"
msgid "Raytraced Refraction"
msgstr "Refracción por trazado de rayos"
msgctxt "Operator"
@ -111552,6 +111526,11 @@ msgid "Lock Unselected"
msgstr "Bloquear no seleccionados"
msgctxt "Operator"
msgid "Lock Unused"
msgstr "Bloquear no usados"
msgctxt "Operator"
msgid "Convert Materials to Color Attribute"
msgstr "Convertir materiales a atributos de color"
@ -113655,8 +113634,8 @@ msgstr "Pantalla completa"
msgctxt "Operator"
msgid "Track Ordering..."
msgstr "Orden de pistas..."
msgid "Sound"
msgstr "Sonido"
msgctxt "Operator"
@ -113665,13 +113644,13 @@ msgstr "Renombrar..."
msgctxt "Operator"
msgid "Stop Tweaking Strip Actions"
msgstr "Terminar de retocar acciones de clips"
msgid "Track Ordering..."
msgstr "Orden de pistas..."
msgctxt "Operator"
msgid "Add Tracks Above Selected"
msgstr "Agregar pistas sobre la seleccionada"
msgid "Stop Tweaking Strip Actions"
msgstr "Terminar de retocar acciones de clips"
msgctxt "Operator"
@ -114067,11 +114046,6 @@ msgid "Movie"
msgstr "Película"
msgctxt "Operator"
msgid "Sound"
msgstr "Sonido"
msgctxt "Operator"
msgid "Image/Sequence"
msgstr "Imagen o Secuencia"
@ -116605,7 +116579,7 @@ msgstr "Análisis de mallas"
msgid "Face Angle"
msgstr "Ángulo entre caras"
msgstr "Ángulo de caras"
msgid "Edge Marks"
@ -122782,14 +122756,6 @@ msgid "Cannot make library override from a local object"
msgstr "No es posible realizar una redefinición de biblioteca a partir de un objeto local"
msgid "The node group must have a geometry input socket"
msgstr "El grupo de nodos debe contener un conector de entrada de geometría"
msgid "The first input must be a geometry socket"
msgstr "La primer entrada debe ser un conector de geometría"
msgid "The node group must have a geometry output socket"
msgstr "El grupo de nodos debe contener un conector de salida de geometría"
@ -123787,10 +123753,6 @@ msgid " Materials,"
msgstr " Materiales,"
msgid " Textures,"
msgstr " Texturas,"
msgid " Stencil,"
msgstr " Esténcil,"
@ -127174,10 +127136,6 @@ msgid "Freestyle: Stroke rendering"
msgstr "Freestyle: Procesamiento de trazos"
msgid "Cannot open file: %s"
msgstr "No es posible abrir el archivo: %s"
msgid "Bind To"
msgstr "Enlazar a"
@ -131127,14 +131085,6 @@ msgid "Disabled, Blender was compiled without OpenSubdiv"
msgstr "Deshabilitado, Blender fue compilado sin soporte para OpenSubdiv"
msgid "Half-Band Width"
msgstr "Medio ancho de banda"
msgid "Half the width of the narrow band in voxel units"
msgstr "La mitad del ancho de la banda angosta (en vóxeles)"
msgid "Corner Index"
msgstr "Identificador de esquina"
@ -131435,18 +131385,6 @@ msgid "Whether the node could find a single face to sample at the UV coordinate"
msgstr "Indica si el nodo fue capaz de encontrar una cara individual de la cual tomar una muestra en esa coordenada UV"
msgid "Grid name needs to be specified"
msgstr "El nombre de la cuadrícula necesita ser especificado"
msgid "The grid type is unsupported"
msgstr "El tipo de cuadrícula no es soportado"
msgid "Expects a Named Attribute with the name of a Grid in the Volume"
msgstr "Se espera un atributo con el nombre de una cuadrícula del volumen"
msgid "Origin of the scaling for each element. If multiple elements are connected, their center is averaged"
msgstr "Origen de escalado de cada elemento. Si varios elementos se encontraran conectados entre sí, su centro se promediará"
@ -131455,18 +131393,6 @@ msgid "Direction in which to scale the element"
msgstr "Dirección en la cual escalar el elemento"
msgid "Radius must be greater than 0"
msgstr "El radio debe ser mayor que 0"
msgid "Half-band width must be greater than 1"
msgstr "La mitad del ancho de banda debe ser mayor que 1"
msgid "Voxel size is too small"
msgstr "El tamaño del vóxel es demasiado pequeño"
msgid "The parts of the geometry that go into the first output"
msgstr "Las partes de la geometría que irán a la primera salida"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Ainhize & Miriam <agoenaga006@ikasle.ehu.eus>\n"
"Language-Team: Euskara <agoenaga006@ikasle.ehu.eus>\n"

View File

@ -1,10 +1,10 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"PO-Revision-Date: 2023-11-18 16:52+0000\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2023-11-30 20:00+0000\n"
"Last-Translator: \"M. Amin Taheri\" <amintaheri2001@gmail.com>\n"
"Language-Team: Persian <https://translate.blender.org/projects/blender-ui/ui/fa/>\n"
"Language: fa\n"
@ -958,14 +958,42 @@ msgid "Info"
msgstr "ﺕﺎﻋﻼﻃﺍ"
msgid "Log of operations, warnings and error messages"
msgstr "ﺎﻄﺧ ﯼﺎﻫ ﻡﺎﯿﭘ ﻭ ﺎﻫﺭﺍﺪﺸﻫ ،ﺎﻫ‌ﺕﺎﯿﻠﻤﻋ ﺵﺭﺍﺰﮔ"
msgid "Top Bar"
msgstr "ﻻﺎﺑ ﺭﺍﻮﻧ"
msgid "Global bar at the top of the screen for global per-window settings"
msgstr "ﻩﺮﺠﻨﭘ ﺮﻫ ﯽﻠﮐ ﺕﺎﻤﯿﻈﻨﺗ ﯼﺍﺮﺑ ﻪﺤﻔﺻ ﯼﻻﺎﺑ ﺭﺩ ﯼﺮﺳﺍﺮﺳ ﺭﺍﻮﻧ"
msgid "Status Bar"
msgstr "ﺖﯿﻌﺿﻭ ﺭﺍﻮﻧ"
msgid "Global bar at the bottom of the screen for general status information"
msgstr "ﯽﻣﻮﻤﻋ ﺖﯿﻌﺿﻭ ﺕﺎﻋﻼﻃﺍ ﯼﺍﺮﺑ ﻪﺤﻔﺻ ﻦﯿﯾﺎﭘ ﺭﺩ ﯼﺮﺳﺍﺮﺳ ﺭﺍﻮﻧ"
msgid "Outliner"
msgstr "ءﺎﯿﺷﺍ ﺖﯾﺮﯾﺪﻣ"
msgid "Overview of scene graph and all available data-blocks"
msgstr "ﺩﻮﺟﻮﻣ ﻩﺩﺍﺩ ﯼﺎﻫ ﮎﻮﻠﺑ ﻡﺎﻤﺗ ﻭ ﻪﻨﺤﺻ ﺭﺍﺩﻮﻤﻧ ﯽﻠﮐ ﯼﺎﻤﻧ"
msgid "Properties"
msgstr "ﺕﺎﻤﯿﻈﻨﺗ"
msgid "Edit properties of active object and related data-blocks"
msgstr "ﻦﮐ ﺶﯾﺍﺮﯾﻭ ﺍﺭ ﻂﺒﺗﺮﻣ ﻩﺩﺍﺩ ﯼﺎﻫ ﮎﻮﻠﺑ ﻭ ﻝﺎﻌﻓ ﯽﺷ ﯼﺎﻫ ﯽﮔﮋﯾﻭ"
msgid "File Browser"
msgstr "ﻞﯾﺎﻓ ﺮﮔﺭﻭﺮﻣ"
@ -5050,6 +5078,10 @@ msgid "IK"
msgstr "(IK) ﺱﻮﮑﻌﻣ ﺖﮐﺮﺣ"
msgid "ShapeKey"
msgstr "ShapeKey"
msgid "Nothing selected"
msgstr "ﻩﺪﺸﻧ ﺏﺎﺨﺘﻧﺍ ﺰﯿﭼ ﭻﯿﻫ"
@ -5317,10 +5349,6 @@ msgid " Materials,"
msgstr "ﻩﺩﺎﻣ "
msgid " Textures,"
msgstr "ﺎﻫ‌ﺖﻓﺎﺑ "
msgid "OK"
msgstr "ﺪﯿﯾﺄﺗ"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: \n"
"Last-Translator: \n"
"Language-Team: \n"

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2017-12-25 14:01+0100\n"
"Last-Translator: UMAR HARUNA ABDULLAHI <umarbrowser20@gmail.com>\n"
"Language-Team: BlenderNigeria <pyc0der@outlook.com>\n"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2023-10-06 09:54+0000\n"
"Last-Translator: Eitan Traurig <eitant13@gmail.com>\n"
"Language-Team: Hebrew <https://translate.blender.org/projects/blender-ui/ui/he/>\n"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2015-03-03 16:21+0530\n"
"Last-Translator: Roshan Lal Gumasta <roshan@anisecrets.com>\n"
"Language-Team: Hindi <www.anisecrets.com>\n"
@ -2813,6 +2813,10 @@ msgid "Add"
msgstr "जोड़ें"
msgid "Strip"
msgstr "पट्टी"
msgid "Math"
msgstr "गणित"
@ -2845,10 +2849,6 @@ msgid "Apply"
msgstr "लागू करें"
msgid "Strip"
msgstr "पट्टी"
msgid "Cache"
msgstr "द्रुतिका"
@ -3776,6 +3776,10 @@ msgid "Flat"
msgstr "समतल"
msgid "Duplicate"
msgstr "अनुकृति"
msgctxt "Operator"
msgid "Select Mode"
msgstr "दृश्य रूप का चयन करें"
@ -3829,10 +3833,6 @@ msgid "Delete Unused"
msgstr "मिटाएँ अप्रयुक्त"
msgid "Duplicate"
msgstr "अनुकृति"
msgid "Select Ring"
msgstr "वलय का चयन करें"
@ -5713,6 +5713,11 @@ msgid "Y Axis"
msgstr "Y अक्ष"
msgctxt "Operator"
msgid "Sound"
msgstr "ध्वनि"
msgctxt "Operator"
msgid "Fit"
msgstr "उचित"
@ -5736,11 +5741,6 @@ msgid "Movie"
msgstr "चलचित्र"
msgctxt "Operator"
msgid "Sound"
msgstr "ध्वनि"
msgid "Offset:"
msgstr "विचलन:"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2023-10-30 06:54+0000\n"
"Last-Translator: Satoshi Yamasaki <yamyam@yo.rim.or.jp>\n"
"Language-Team: Japanese <https://translate.blender.org/projects/blender-ui/ui/ja/>\n"
@ -35545,6 +35545,10 @@ msgid "NLA"
msgstr "NLA"
msgid "Strip"
msgstr "ストリップ"
msgid "Utilities"
msgstr "ユーティリティ"
@ -35684,10 +35688,6 @@ msgid "Select Handle"
msgstr "ハンドルを選択"
msgid "Strip"
msgstr "ストリップ"
msgid "Inputs"
msgstr "入力"
@ -44913,10 +44913,6 @@ msgid "Replace the input image's alpha channel by the alpha input value"
msgstr "入力画像のアルファチャンネルをアルファ入力値で置き換えます"
msgid "Split Viewer"
msgstr "分割ビューアー"
msgid "Stabilize 2D"
msgstr "2Dスタビライゼーション"
@ -46352,14 +46348,6 @@ msgid "Shortest Edge Paths"
msgstr "最短辺パス"
msgid "Signed Distance"
msgstr "符号付き距離"
msgid "Retrieve the signed distance field grid called 'distance' from a volume"
msgstr "ボリュームから 'distance' と呼ばれる符号付き距離フィールドグリッドを取得します"
msgid "Is Spline Cyclic"
msgstr "スプラインループフラグ"
@ -46436,14 +46424,6 @@ msgid "Provide a selection of faces that use the specified material"
msgstr "指定のマテリアルを使用する面の選択を出力します"
msgid "Mean Filter SDF Volume"
msgstr "SDFボリューム平均化フィルター"
msgid "Smooth the surface of an SDF volume by applying a mean filter"
msgstr "SDF ボリュームの表面を平均化フィルターでスムージングします"
msgid "Merge by Distance"
msgstr "距離でマージ"
@ -46580,22 +46560,14 @@ msgid "Create a point in the point cloud for each selected face corner"
msgstr "選択中の各面の角からポイントクラウド内にポイントを生成します"
msgid "Mesh to SDF Volume"
msgstr "メッシュのSDFボリューム化"
msgid "Create an SDF volume with the shape of the input mesh's surface"
msgstr "入力メッシュ表面の形状で SDF ボリュームを生成します"
msgid "Create a fog volume with the shape of the input mesh's surface"
msgstr "入力メッシュの形状でフォグボリュームを生成します"
msgid "How the voxel size is specified"
msgstr "ボクセルサイズを指定する方法"
msgid "Create a fog volume with the shape of the input mesh's surface"
msgstr "入力メッシュの形状でフォグボリュームを生成します"
msgid "UV Sphere"
msgstr "UV球"
@ -46640,14 +46612,6 @@ msgid "Offset a control point index within its curve"
msgstr "カーブ内の制御点のインデックスをずらします"
msgid "Offset SDF Volume"
msgstr "SDFボリュームオフセット"
msgid "Move the surface of an SDF volume inwards or outwards"
msgstr "SDFボリュームの表面を内側または外側に移動します"
msgid "Generate a point cloud with positions and radii defined by fields"
msgstr "フィールドで指定した位置と半径のポイントクラウドを生成します"
@ -46668,22 +46632,6 @@ msgid "Split all points to curve by its group ID and reorder by weight"
msgstr "グループ ID で全ポイントをカーブに分離し,ウェイトで並べ替えます"
msgid "Points to SDF Volume"
msgstr "ポイントのSDFボリューム化"
msgid "Generate an SDF volume sphere around every point"
msgstr "各ポイントの周囲に SDF ボリューム球を生成します"
msgid "Specify the approximate number of voxels along the diagonal"
msgstr "対角線を元に概算したボクセル数を指定します"
msgid "Specify the voxel side length"
msgstr "ボクセルの辺の長さを指定します"
msgid "Points to Vertices"
msgstr "ポイントの頂点化"
@ -46700,6 +46648,14 @@ msgid "Generate a fog volume sphere around every point"
msgstr "ポイント毎にフォグボリューム球を生成します"
msgid "Specify the approximate number of voxels along the diagonal"
msgstr "対角線を元に概算したボクセル数を指定します"
msgid "Specify the voxel side length"
msgstr "ボクセルの辺の長さを指定します"
msgid "Geometry Proximity"
msgstr "ジオメトリ近接"
@ -46847,14 +46803,6 @@ msgid "Rotate geometry instances in local or global space"
msgstr "ローカルまたはグローバル空間でジオメトリインスタンスを回転します"
msgid "SDF Volume Sphere"
msgstr "SDFボリューム球"
msgid "Generate an SDF Volume Sphere"
msgstr "SDF ボリューム球を生成します"
msgid "Sample Curve"
msgstr "カーブサンプル"
@ -46921,42 +46869,6 @@ msgid "Calculate the interpolated values of a mesh attribute at a UV coordinate"
msgstr "UV 座標のメッシュ属性の補間値を計算します"
msgid "Sample Volume"
msgstr "ボリュームサンプル"
msgid "Calculate the interpolated values of a Volume grid at the specified position"
msgstr "ボリュームグリッドの指定の位置での補間値を計算します"
msgid "Grid Type"
msgstr "グリッドタイプ"
msgid "Type of grid to sample data from"
msgstr "データをサンプリングするグリッドのタイプ"
msgid "Interpolation Mode"
msgstr "補間モード"
msgid "How to interpolate the values from neighboring voxels"
msgstr "近隣のボクセルの値を補間する方法"
msgid "Nearest Neighbor"
msgstr "ニアレストネイバー"
msgid "Trilinear"
msgstr "トライリニア"
msgid "Triquadratic"
msgstr "トライクアドラティック"
msgid "Scale Elements"
msgstr "要素スケール"
@ -61430,6 +61342,10 @@ msgid "Enter/Exit draw mode for grease pencil"
msgstr "グリースペンシルのドローモードに出入りします"
msgid "Duplicate"
msgstr "複製"
msgid "Insert a blank frame on the current scene frame"
msgstr "ブランクフレームを現在のシーンフレームに挿入します"
@ -63901,10 +63817,6 @@ msgid "Duplicate mesh and move"
msgstr "メッシュを複製・移動します"
msgid "Duplicate"
msgstr "複製"
msgctxt "Operator"
msgid "Collapse Edges & Faces"
msgstr "辺や面を統合"
@ -76331,15 +76243,6 @@ msgid "Project the geometry onto a plane defined by a line"
msgstr "線で定義された平面に形状を投影します"
msgctxt "Operator"
msgid "Reveal All"
msgstr "すべて再表示"
msgid "Unhide all geometry"
msgstr "全形状の非表示を解除します"
msgid "Sample the vertex color of the active vertex"
msgstr "アクティブ頂点の頂点カラーを取得します"
@ -112433,13 +112336,13 @@ msgstr "カスタム遮蔽"
msgctxt "Operator"
msgid "Lock Unused"
msgstr "未使用をロック"
msgid "Lock Unselected"
msgstr "非選択をロック"
msgctxt "Operator"
msgid "Lock Unselected"
msgstr "非選択をロック"
msgid "Lock Unused"
msgstr "未使用をロック"
msgctxt "Operator"
@ -114545,8 +114448,8 @@ msgstr "エリアの全画面切り替え"
msgctxt "Operator"
msgid "Track Ordering..."
msgstr "トラックの順序..."
msgid "Sound"
msgstr "音声"
msgctxt "Operator"
@ -114555,13 +114458,13 @@ msgstr "名前を変更..."
msgctxt "Operator"
msgid "Stop Tweaking Strip Actions"
msgstr "ストリップアクションの調整を終了"
msgid "Track Ordering..."
msgstr "トラックの順序..."
msgctxt "Operator"
msgid "Add Tracks Above Selected"
msgstr "トラックを選択の上に追加"
msgid "Stop Tweaking Strip Actions"
msgstr "ストリップアクションの調整を終了"
msgctxt "Operator"
@ -114957,11 +114860,6 @@ msgid "Movie"
msgstr "動画"
msgctxt "Operator"
msgid "Sound"
msgstr "音声"
msgctxt "Operator"
msgid "Image/Sequence"
msgstr "画像/連番画像"
@ -123626,14 +123524,6 @@ msgid "Cannot make library override from a local object"
msgstr "ローカルオブジェクトからはライブラリオーバーライドを作成できません"
msgid "The node group must have a geometry input socket"
msgstr "ノードグループにジオメトリ入力ソケットが必要です"
msgid "The first input must be a geometry socket"
msgstr "最初の入力はジオメトリソケットにしてください"
msgid "The node group must have a geometry output socket"
msgstr "ノードグループにジオメトリ出力ソケットが必要です"
@ -124631,10 +124521,6 @@ msgid " Materials,"
msgstr " マテリアル,"
msgid " Textures,"
msgstr " テクスチャ,"
msgid " Stencil,"
msgstr " ステンシル,"
@ -128020,10 +127906,6 @@ msgid "Freestyle: Stroke rendering"
msgstr "Freestyle: ストロークレンダリング"
msgid "Cannot open file: %s"
msgstr "ファイルが開けません: %s"
msgid "Bind To"
msgstr "バインド先"
@ -131987,14 +131869,6 @@ msgid "Disabled, Blender was compiled without OpenSubdiv"
msgstr "無効時Blender は OpenSubdiv なしでコンパイルされています"
msgid "Half-Band Width"
msgstr "半値幅"
msgid "Half the width of the narrow band in voxel units"
msgstr "ナローバンドの半分の幅(ボクセル単位)"
msgid "Corner Index"
msgstr "コーナーインデックス"
@ -132297,18 +132171,6 @@ msgid "Whether the node could find a single face to sample at the UV coordinate"
msgstr "このノードが UV 座標でサンプリングするための単一面を探し出せたかどうか"
msgid "Grid name needs to be specified"
msgstr "グリッド名を指定してください"
msgid "The grid type is unsupported"
msgstr "未対応のグリッドタイプです"
msgid "Expects a Named Attribute with the name of a Grid in the Volume"
msgstr "ボリューム内のグリッドの名前の付いた名前付き属性にしてください"
msgid "Origin of the scaling for each element. If multiple elements are connected, their center is averaged"
msgstr "各要素のスケーリング原点.複数の要素がつながっている場合はその平均値が中心になります"
@ -132317,18 +132179,6 @@ msgid "Direction in which to scale the element"
msgstr "要素をスケーリングする方向"
msgid "Radius must be greater than 0"
msgstr "半径は0より大きい必要があります"
msgid "Half-band width must be greater than 1"
msgstr "半値幅は1より大きい必要があります"
msgid "Voxel size is too small"
msgstr "ボクセルサイズが小さすぎます"
msgid "The parts of the geometry that go into the first output"
msgstr "ジオメトリの最初の出力に入る部分"

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2023-11-14 19:14+0000\n"
"Last-Translator: Lee YeonJoo <yzoo2@naver.com>\n"
"Language-Team: Korean <https://translate.blender.org/projects/blender-ui/ui/ko/>\n"
@ -25991,6 +25991,10 @@ msgid "Vertex Group Specials"
msgstr "버텍스 그룹 지정"
msgid "Strip"
msgstr "스트립"
msgid "Math"
msgstr "수학"
@ -26088,10 +26092,6 @@ msgid "Select Handle"
msgstr "핸들을 선택"
msgid "Strip"
msgstr "스트립"
msgid "Inputs"
msgstr "입력"
@ -33275,10 +33275,6 @@ msgid "Set Alpha"
msgstr "알파 설정"
msgid "Split Viewer"
msgstr "분할 뷰어"
msgid "Stabilize 2D"
msgstr "안정화 2D"
@ -42281,6 +42277,10 @@ msgid "Flat"
msgstr "플랫"
msgid "Duplicate"
msgstr "복제"
msgctxt "Operator"
msgid "Select Mode"
msgstr "선택 모드"
@ -44287,10 +44287,6 @@ msgid "Duplicate mesh and move"
msgstr "메쉬를 복제하고 이동"
msgid "Duplicate"
msgstr "복제"
msgctxt "Operator"
msgid "Make Edge/Face"
msgstr "에지/페이스를 만들기"
@ -75347,13 +75343,13 @@ msgstr "반전"
msgctxt "Operator"
msgid "Lock Unused"
msgstr "미사용을 잠금"
msgid "Lock Unselected"
msgstr "선택되지 않음 잠금"
msgctxt "Operator"
msgid "Lock Unselected"
msgstr "선택되지 않음 잠금"
msgid "Lock Unused"
msgstr "미사용을 잠금"
msgid "Flip Colors"
@ -76939,8 +76935,8 @@ msgstr "전체 화면 영역을 토글"
msgctxt "Operator"
msgid "Track Ordering..."
msgstr "트랙 정리..."
msgid "Sound"
msgstr "사운드"
msgctxt "Operator"
@ -76949,13 +76945,13 @@ msgstr "이름을 변경..."
msgctxt "Operator"
msgid "Stop Tweaking Strip Actions"
msgstr "트위킹 스트립 액션을 중지"
msgid "Track Ordering..."
msgstr "트랙 정리..."
msgctxt "Operator"
msgid "Add Tracks Above Selected"
msgstr "트랙을 선택된 위에 추가"
msgid "Stop Tweaking Strip Actions"
msgstr "트위킹 스트립 액션을 중지"
msgctxt "Operator"
@ -77200,11 +77196,6 @@ msgid "Movie"
msgstr "무비"
msgctxt "Operator"
msgid "Sound"
msgstr "사운드"
msgctxt "Operator"
msgid "Image/Sequence"
msgstr "이미지/시퀀스"
@ -84790,10 +84781,6 @@ msgid "Freestyle: Stroke rendering"
msgstr "프리스타일: 스트로크 렌더링"
msgid "Cannot open file: %s"
msgstr "읽을 수 없는 파일: %s"
msgid "Bone Envelopes"
msgstr "본 엔벨로프"

View File

@ -1,10 +1,10 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"(b'0000000000000000000000000000000000000000')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2013-11-05 13:47+0600\n"
"Last-Translator: Chyngyz Dzhumaliev <kyrgyzl10n@gmail.com>\n"
"Language-Team: Kirghiz <kyrgyzl10n@gmail.com>\n"
@ -3281,6 +3281,11 @@ msgid "Image*"
msgstr "Сүрөт*"
msgctxt "Operator"
msgid "Sound"
msgstr "Үн"
msgid "Gamma:"
msgstr "Гамма:"
@ -3290,11 +3295,6 @@ msgid "Movie"
msgstr "Тасма"
msgctxt "Operator"
msgid "Sound"
msgstr "Үн"
msgctxt "Operator"
msgid "Left"
msgstr "Солдон"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: \n"
"Last-Translator: Yudhir Khanal <yudhir.khanal@gmail.com>\n"
"Language-Team: Yudhir\n"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2023-10-08 06:34+0000\n"
"Last-Translator: Wannes Malfait <wannes.malfait@gmail.com>\n"
"Language-Team: Dutch <https://translate.blender.org/projects/blender-ui/ui/nl/>\n"
@ -4410,6 +4410,10 @@ msgid "Flat"
msgstr "Vlak"
msgid "Duplicate"
msgstr "Dupliceren"
msgctxt "Operator"
msgid "New Image"
msgstr "Nieuwe Afbeelding"
@ -4661,10 +4665,6 @@ msgid "Dissolve Selection"
msgstr "Los Selectie Op"
msgid "Duplicate"
msgstr "Dupliceren"
msgctxt "Operator"
msgid "Rotate Selected Edge"
msgstr "Roteer Geselecteerde Rand"
@ -7994,6 +7994,11 @@ msgid "Toggle Fullscreen Area"
msgstr "Volledig Scherm Gebied aan/uit"
msgctxt "Operator"
msgid "Sound"
msgstr "Geluid"
msgctxt "Operator"
msgid "Rename..."
msgstr "Hernoem..."
@ -8028,11 +8033,6 @@ msgid "Movie"
msgstr "Film"
msgctxt "Operator"
msgid "Sound"
msgstr "Geluid"
msgctxt "Operator"
msgid "Fade"
msgstr "Vervagen"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2017-08-26 11:13+0200\n"
"Last-Translator: Mikołaj Juda <mikolaj.juda@gmail.com>\n"
"Language: pl\n"
@ -10231,10 +10231,6 @@ msgid "Object has negative scale, unwrap will operate on a non-flipped version o
msgstr "Obiekt posiada ujemną skalę, odwijanie (unwrap) będzie używało nie odwróconej wersji siatki"
msgid "Cannot open file: %s"
msgstr "Nie można otworzyć pliku: %s"
msgctxt "Action"
msgid "Group"
msgstr "Grupa"

File diff suppressed because it is too large Load Diff

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: Leandro Paganelli <leandrobp@fastmail.com>\n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2023-11-27 09:55+0000\n"
"Last-Translator: Gilberto Rodrigues <gilbertorodrigues@outlook.com>\n"
"Language-Team: Portuguese (Brazil) <https://translate.blender.org/projects/blender-ui/ui/pt_BR/>\n"
@ -22021,6 +22021,10 @@ msgid "Vertex Group Specials"
msgstr "Especiais para grupo de vértices"
msgid "Strip"
msgstr "Faixa"
msgid "Math"
msgstr "Matemática"
@ -22106,10 +22110,6 @@ msgid "Navigation"
msgstr "Navegação"
msgid "Strip"
msgstr "Faixa"
msgid "Inputs"
msgstr "Entradas"
@ -28541,10 +28541,6 @@ msgid "Set Alpha"
msgstr "Definir alfa"
msgid "Split Viewer"
msgstr "Visualizador dividido"
msgid "Stabilize 2D"
msgstr "Estabilizar 2D"
@ -37077,6 +37073,10 @@ msgid "Flat"
msgstr "Achatar"
msgid "Duplicate"
msgstr "Duplicar"
msgctxt "Operator"
msgid "Select Mode"
msgstr "Modo de seleção"
@ -38636,10 +38636,6 @@ msgid "Duplicate mesh and move"
msgstr "Duplica as malhas selecionadas e permite movê-las."
msgid "Duplicate"
msgstr "Duplicar"
msgctxt "Operator"
msgid "Make Edge/Face"
msgstr "Criar arestas ou faces"
@ -65827,8 +65823,8 @@ msgstr "Alternar para tela cheia"
msgctxt "Operator"
msgid "Track Ordering..."
msgstr "Ordenamento das trilhas..."
msgid "Sound"
msgstr "Som"
msgctxt "Operator"
@ -65837,13 +65833,13 @@ msgstr "Renomear..."
msgctxt "Operator"
msgid "Stop Tweaking Strip Actions"
msgstr "Interromper os ajustes de faixa de ações"
msgid "Track Ordering..."
msgstr "Ordenamento das trilhas..."
msgctxt "Operator"
msgid "Add Tracks Above Selected"
msgstr "Adicionar trilhas acima da seleção"
msgid "Stop Tweaking Strip Actions"
msgstr "Interromper os ajustes de faixa de ações"
msgctxt "Operator"
@ -66058,11 +66054,6 @@ msgid "Movie"
msgstr "Filme"
msgctxt "Operator"
msgid "Sound"
msgstr "Som"
msgctxt "Operator"
msgid "Fade"
msgstr "Esmaecer"
@ -70984,10 +70975,6 @@ msgid " Materials,"
msgstr " Materiais,"
msgid " Textures,"
msgstr " Texturas,"
msgid " Stencil,"
msgstr " Estêncil,"
@ -72654,10 +72641,6 @@ msgid "Freestyle: Stroke rendering"
msgstr "Freestyle: Renderização de traços..."
msgid "Cannot open file: %s"
msgstr "Não é possível abrir o arquivo: %s"
msgid "Bind To"
msgstr "Vincular A"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2018-01-03 14:47+0000\n"
"Last-Translator: Lockal <lockalsash@gmail.com>, 2023\n"
"Language-Team: Russian (https://app.transifex.com/translateblender/teams/82039/ru/)\n"
@ -29184,6 +29184,10 @@ msgid "Vertex Group Specials"
msgstr "Настройка группы вершин"
msgid "Strip"
msgstr "Клип"
msgid "Math"
msgstr "Математика"
@ -29286,10 +29290,6 @@ msgid "Select Handle"
msgstr "Выделить рукоятку"
msgid "Strip"
msgstr "Клип"
msgid "Inputs"
msgstr "Входы"
@ -36422,10 +36422,6 @@ msgid "Set Alpha"
msgstr "Установить альфа-канал"
msgid "Split Viewer"
msgstr "Двойной предпросмотр"
msgid "Stabilize 2D"
msgstr "2D-стабилизация"
@ -45603,6 +45599,10 @@ msgid "Flat"
msgstr "Плоский"
msgid "Duplicate"
msgstr "Дублировать"
msgctxt "Operator"
msgid "Select Mode"
msgstr "Режим выделения"
@ -47568,10 +47568,6 @@ msgid "Duplicate mesh and move"
msgstr "Дублировать меш и переместить"
msgid "Duplicate"
msgstr "Дублировать"
msgctxt "Operator"
msgid "Make Edge/Face"
msgstr "Создать ребро/грань"
@ -79352,13 +79348,13 @@ msgstr "Инвертировать"
msgctxt "Operator"
msgid "Lock Unused"
msgstr "Заблокировать неиспользуемое"
msgid "Lock Unselected"
msgstr "Заблокировать невыделенное"
msgctxt "Operator"
msgid "Lock Unselected"
msgstr "Заблокировать невыделенное"
msgid "Lock Unused"
msgstr "Заблокировать неиспользуемое"
msgid "Flip Colors"
@ -80863,8 +80859,8 @@ msgstr "Область во весь экран"
msgctxt "Operator"
msgid "Track Ordering..."
msgstr "Порядок обхода…"
msgid "Sound"
msgstr "Звук"
msgctxt "Operator"
@ -80873,13 +80869,13 @@ msgstr "Переименовать…"
msgctxt "Operator"
msgid "Stop Tweaking Strip Actions"
msgstr "Остановить настройку действий клипа"
msgid "Track Ordering..."
msgstr "Порядок обхода…"
msgctxt "Operator"
msgid "Add Tracks Above Selected"
msgstr "Добавить треки над выделением"
msgid "Stop Tweaking Strip Actions"
msgstr "Остановить настройку действий клипа"
msgctxt "Operator"
@ -81150,11 +81146,6 @@ msgid "Movie"
msgstr "Видео"
msgctxt "Operator"
msgid "Sound"
msgstr "Звук"
msgctxt "Operator"
msgid "Image/Sequence"
msgstr "Изображение/секвенция"
@ -89093,10 +89084,6 @@ msgid "Freestyle: Stroke rendering"
msgstr "Freestyle: рендеринг штрихов"
msgid "Cannot open file: %s"
msgstr "Не удалось открыть файл: %s"
msgid "Bone Envelopes"
msgstr "Обёртки кости"

View File

@ -1,10 +1,10 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"PO-Revision-Date: 2023-11-14 09:51+0000\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2023-11-30 09:34+0000\n"
"Last-Translator: Jozef Matta <jozef.m923@gmail.com>\n"
"Language-Team: Slovak <https://translate.blender.org/projects/blender-ui/ui/sk/>\n"
"Language: sk\n"
@ -1434,14 +1434,26 @@ msgid "All"
msgstr "Všetky"
msgid "Show assets from all of the listed asset libraries"
msgstr "Zobraziť aktíva zo všetkých uvedených knižníc aktív"
msgid "Current File"
msgstr "Aktuálny súbor"
msgid "Show the assets currently available in this Blender session"
msgstr "Zobrazí aktíva, ktoré sú aktuálne k dispozícii v tejto relácii Blenderu"
msgid "Essentials"
msgstr "Základné údaje"
msgid "Show the basic building blocks and utilities coming with Blender"
msgstr "Ukáže základné stavebné bloky a nástroje dodávané s Blenderom"
msgid "Custom"
msgstr "Vlastný"
@ -19318,6 +19330,10 @@ msgid "Additional data for an asset data-block"
msgstr "Prídavné údaje pre blok údajov aktív"
msgid "Type identifier of this data-block"
msgstr "Identifikátor typu tohto bloku údajov"
msgid "Brush"
msgstr "Štetec"
@ -19450,6 +19466,10 @@ msgid "Weak reference to a data-block in another library .blend file (used to re
msgstr "Slabá referencia na blok údajov v inom súbore knižnice .blend (používa sa na opätovné použitie už pridaných údajov namiesto pridávania nových kópií)"
msgid "Unique data-block ID name (within a same type and library)"
msgstr "Jedinečný názov ID bloku údajov (v rámci toho istého typu a knižnice)"
msgid "Full Name"
msgstr "Plný názov"
@ -24041,6 +24061,10 @@ msgid "Grease Pencil data-block"
msgstr "Blok údajov pastelky"
msgid "Layer Groups"
msgstr "Skupiny vrstiev"
msgid "Image data-block referencing an external or packed image"
msgstr "Blok údajov obrázku odkazujúci na externý alebo zabalený obrázok"
@ -24992,6 +25016,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 "Viewport display size of the sampled data"
msgstr "Veľkosť zobrazenia záberu snímaných údajov"
msgid "Control how fast the probe influence decreases"
msgstr "Ovládanie zníženia rýchlosti vplyvu snímača"
@ -25176,6 +25204,14 @@ msgid "Show the clipping distances in the 3D view"
msgstr "Zobrazenie orezania vzdialeností v 3D zobrazení"
msgid "Display Data (Deprecated)"
msgstr "Zobrazenie údajov (zastarané)"
msgid "Deprecated, use use_data_display instead"
msgstr "Zastarané, namiesto toho použite use_data_display"
msgid "Show the influence volume in the 3D view"
msgstr "Zobrazí vplyv objemu v 3D zobrazení"
@ -25200,6 +25236,18 @@ msgid "Type of light probe"
msgstr "Typ snímača svetla"
msgid "Light probe that captures precise lighting from all directions at a single point in space"
msgstr "Snímač svetla, ktorý zachytáva presné osvetlenie zo všetkých smerov v jednom bode v priestore"
msgid "Light probe that captures incoming light from a single direction on a plane"
msgstr "Snímač svetla, ktorý zachytáva prichádzajúce svetlo z jedného smeru v rovine"
msgid "Light probe that captures low frequency lighting inside a volume"
msgstr "Snímač svetla, ktorý zachytáva nízkofrekvenčné osvetlenie vnútri objemu"
msgid "Use Custom Parallax"
msgstr "Použiť vlastnú paralaxu"
@ -25208,6 +25256,10 @@ msgid "Enable custom settings for the parallax correction volume"
msgstr "Povolí vlastné nastavenia pre objem korekcie paralaxy"
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"
msgid "Visibility Bleed Bias"
msgstr "Viditeľnosť odchýlky priesvitu"
@ -25381,6 +25433,14 @@ msgid "True if this material has grease pencil data"
msgstr "Pravdivé, ak tento materiál má údaje pastelky"
msgid "Light Probe Volume Single Sided"
msgstr "Snímač svetla jednostranného objemu"
msgid "Consider material single sided for light probe volume capture. Additionally helps rejecting probes inside the object to avoid light leaks"
msgstr "Zvažuje jednostranný materiál na zachytávanie objemu snímačom svetla. Okrem toho pomáha odmietnuť snímače vnútri objektu, aby sa zabránilo úniku svetla"
msgid "Line Color"
msgstr "Farba čiary"
@ -25405,6 +25465,10 @@ msgid "Line art settings for material"
msgstr "Nastavenie Čiarovej grafiky pre materiál"
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"
msgid "Metallic"
msgstr "Metalizovaný"
@ -25573,6 +25637,22 @@ msgid "How intense (bright) the specular reflection is"
msgstr "Aká je intenzita (lesklosť) zrkadlového odrazu"
msgid "Surface Render Method"
msgstr "Metóda prekresľovania povrchu"
msgid "Controls the blending and the compatibility with certain features"
msgstr "Riadi prelínanie a kompatibilitu s určitými funkciami"
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 "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"
msgid "Texture Slot Images"
msgstr "Zásuvka obrázkov textúry"
@ -25593,6 +25673,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 "Use back face culling when casting shadows"
msgstr "Pri vrhaní tieňov použije vylúčenie zadnej plôšky"
msgid "Use shader nodes to render the material"
msgstr "Použije tieňovač uzly na prekreslenie materiálu"
@ -25605,6 +25689,14 @@ msgid "Use the current world background to light the preview render"
msgstr "Použije aktuálne pozadie oblasti na osvetlenie ukážky prekreslenia"
msgid "Raytrace Refraction"
msgstr "Lom sledovania lúča"
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 "Na určenie farby lomu použije sledovanie lúča namiesto použitia iba snímačov svetla. Tým sa zabráni tomu, aby povrch prispieval k osvetleniu povrchov, ktoré toto nastavenie nepoužívajú"
msgid "Subsurface Translucency"
msgstr "Podpovrchová priesvitnosť"
@ -25621,14 +25713,26 @@ 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 "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"
msgid "Fast"
msgstr "Rýchle"
msgid "Each face is considered as a medium interface. Gives correct results for manifold geometry that contains no inner parts"
msgstr "Každá strana sa považuje za stredné rozhranie. Poskytuje správne výsledky pre vyvinutú geometriu, ktorá neobsahuje žiadne vnútorné časti"
msgid "Accurate"
msgstr "Presná"
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 "Plôšky sa považujú za stredné rozhranie len vtedy, ak majú rôzne po sebe idúce vytváranie plôšok. Poskytuje správne výsledky, pokiaľ nie je prekročená maximálna hĺbka lúča. V porovnaní s rýchlou metódou má značnú spotrebu pamäte"
msgid "Mesh data-block defining geometric surfaces"
msgstr "Blok údajov povrchovej siete definujúci geometrické plochy"
@ -25681,6 +25785,10 @@ msgid "Loops of the mesh (face corners)"
msgstr "Slučky povrchovej siete (rohov plôšok)"
msgid "Normal Domain"
msgstr "Bežná doména"
msgid "Corner"
msgstr "Rohové"
@ -35205,6 +35313,10 @@ msgid "NLA"
msgstr "NLA"
msgid "Strip"
msgstr "Pás"
msgid "Utilities"
msgstr "Obslužné programy"
@ -35344,10 +35456,6 @@ msgid "Select Handle"
msgstr "Vybrať manipulátor"
msgid "Strip"
msgstr "Pás"
msgid "Inputs"
msgstr "Vstupy"
@ -44524,10 +44632,6 @@ msgid "Replace the input image's alpha channel by the alpha input value"
msgstr "Nahradí alfa kanály vstupného obrázka vstupnou hodnotou alfa"
msgid "Split Viewer"
msgstr "Zobrazovač rozdelenia"
msgid "Stabilize 2D"
msgstr "2D stabilizácia"
@ -45955,14 +46059,6 @@ msgid "Shortest Edge Paths"
msgstr "Najkratšie cesty hrán"
msgid "Signed Distance"
msgstr "Podpísaná vzdialenosť"
msgid "Retrieve the signed distance field grid called 'distance' from a volume"
msgstr "Získa podpísanú mriežku poľa vzdialenosti volanú 'vzdialenosť' z objemu"
msgid "Is Spline Cyclic"
msgstr "Je drážka cyklická"
@ -46039,14 +46135,6 @@ msgid "Provide a selection of faces that use the specified material"
msgstr "Poskytne výber plôšok, ktoré používajú určený materiál"
msgid "Mean Filter SDF Volume"
msgstr "Priemerný objem filtra SDF"
msgid "Smooth the surface of an SDF volume by applying a mean filter"
msgstr "Vyhladzujte povrch objemu SDF použitím stredného filtra"
msgid "Merge by Distance"
msgstr "Zlúčiť podľa vzdialenosti"
@ -46183,22 +46271,14 @@ msgid "Create a point in the point cloud for each selected face corner"
msgstr "Vytvorí bod v mračne bodov pre každý vybraný roh plôšky"
msgid "Mesh to SDF Volume"
msgstr "Povrchová sieť na objem SDF"
msgid "Create an SDF volume with the shape of the input mesh's surface"
msgstr "Vytvorí objem SDF s tvarom povrchu vstupnej povrchovej siete"
msgid "Create a fog volume with the shape of the input mesh's surface"
msgstr "Vytvorí objem hmly s tvarom povrchu vstupnej povrchovej siete"
msgid "How the voxel size is specified"
msgstr "Ako je určená veľkosť voxelu"
msgid "Create a fog volume with the shape of the input mesh's surface"
msgstr "Vytvorí objem hmly s tvarom povrchu vstupnej povrchovej siete"
msgid "UV Sphere"
msgstr "UV guľa"
@ -46243,14 +46323,6 @@ msgid "Offset a control point index within its curve"
msgstr "Posuv indexu riadiaceho bodu v rámci jeho krivky"
msgid "Offset SDF Volume"
msgstr "Posuv objemu SDF"
msgid "Move the surface of an SDF volume inwards or outwards"
msgstr "Posunie povrch objemu SDF smerom dovnútra alebo von"
msgid "Generate a point cloud with positions and radii defined by fields"
msgstr "Vygeneruje mračno bodov s polohami a polomermi definovanými poľami"
@ -46271,22 +46343,6 @@ msgid "Split all points to curve by its group ID and reorder by weight"
msgstr "Rozdelí všetky body na krivku podľa ID skupiny a zmení poradie podľa váhy"
msgid "Points to SDF Volume"
msgstr "Body na objem SDF"
msgid "Generate an SDF volume sphere around every point"
msgstr "Vygeneruje sféru objemu SDF okolo každého bodu"
msgid "Specify the approximate number of voxels along the diagonal"
msgstr "Určiť približný počet voxelov pozdĺž uhlopriečky"
msgid "Specify the voxel side length"
msgstr "Určiť dĺžku strany voxelu"
msgid "Points to Vertices"
msgstr "Body na vrcholy"
@ -46303,6 +46359,14 @@ msgid "Generate a fog volume sphere around every point"
msgstr "Vygeneruje sféru objemu hmly okolo každého bodu"
msgid "Specify the approximate number of voxels along the diagonal"
msgstr "Určiť približný počet voxelov pozdĺž uhlopriečky"
msgid "Specify the voxel side length"
msgstr "Určiť dĺžku strany voxelu"
msgid "Geometry Proximity"
msgstr "Príbuzenosť geometrie"
@ -46447,14 +46511,6 @@ msgid "Rotate geometry instances in local or global space"
msgstr "Otáča inštanciami geometrie v lokálnom alebo globálnom priestore"
msgid "SDF Volume Sphere"
msgstr "Sféra objemu SDF"
msgid "Generate an SDF Volume Sphere"
msgstr "Vygeneruje sféru objemu SDF"
msgid "Sample Curve"
msgstr "Snímka krivky"
@ -46519,42 +46575,6 @@ msgid "Calculate the interpolated values of a mesh attribute at a UV coordinate"
msgstr "Vypočíta interpolované hodnoty atribútu povrchovej siete pri UV súradnici"
msgid "Sample Volume"
msgstr "Snímka objemu"
msgid "Calculate the interpolated values of a Volume grid at the specified position"
msgstr "Vypočíta interpolované hodnoty mriežky objemu na zadanej pozícii"
msgid "Grid Type"
msgstr "Typ mriežky"
msgid "Type of grid to sample data from"
msgstr "Typ mriežky na výber snímky údajov"
msgid "Interpolation Mode"
msgstr "Režim interpolácie"
msgid "How to interpolate the values from neighboring voxels"
msgstr "Určuje, ako interpolovať hodnoty zo susedných voxelov"
msgid "Nearest Neighbor"
msgstr "Najbližší sused"
msgid "Trilinear"
msgstr "Trilineárna"
msgid "Triquadratic"
msgstr "Trojhranný"
msgid "Scale Elements"
msgstr "Mierka prvkov"
@ -60894,6 +60914,10 @@ msgid "Enter/Exit draw mode for grease pencil"
msgstr "Vstup/výstup z režimu kreslenia pre Pastelku"
msgid "Duplicate"
msgstr "Vytvoriť kópiu"
msgid "Insert a blank frame on the current scene frame"
msgstr "Vloží prázdnu snímku na aktuálnu snímku scény"
@ -63342,10 +63366,6 @@ msgid "Duplicate mesh and move"
msgstr "Vytvorí kópiu povrchovej siete a presunie ju"
msgid "Duplicate"
msgstr "Vytvoriť kópiu"
msgctxt "Operator"
msgid "Collapse Edges & Faces"
msgstr "Zbúrať hrany a plôšky"
@ -75703,15 +75723,6 @@ msgid "Project the geometry onto a plane defined by a line"
msgstr "Premietne geometriu na rovinu definovanú čiarou"
msgctxt "Operator"
msgid "Reveal All"
msgstr "Odhaliť všetko"
msgid "Unhide all geometry"
msgstr "Odkryje celú geometriu"
msgid "Sample the vertex color of the active vertex"
msgstr "Zosníma farby vrcholov podľa aktívnych vrcholov"
@ -109056,6 +109067,10 @@ msgid "%s is not supported"
msgstr "%s nie je podporovaný"
msgid "Please select at least one image"
msgstr "Vyberte aspoň jeden obrázok"
msgid "Cannot generate materials for unknown %s render engine"
msgstr "Nie je možné vygenerovať materiály pre neznámy mechanizmus prekreslenia %s"
@ -109835,6 +109850,14 @@ msgid "Complete report available on '%s' text datablock"
msgstr "Kompletný prehľad je k dispozícii v textovom bloku údajov '%s'"
msgid "No active bone to copy from"
msgstr "Žiadna aktívna kosť na kopírovanie"
msgid "No selected bones to copy to"
msgstr "Nie sú vybrané kosti na kopírovanie"
msgid "Bone colors were synced; for %d bones this will not be visible due to pose bone color overrides"
msgstr "Farby kostí boli synchronizované; pre %d kostí to nebude viditeľné kvôli prepísaniu farieb kostí v póze"
@ -111543,13 +111566,13 @@ msgstr "Vlastné pohlcovanie"
msgctxt "Operator"
msgid "Lock Unused"
msgstr "Zamknúť nepoužité"
msgid "Lock Unselected"
msgstr "Zamknúť nevybrané"
msgctxt "Operator"
msgid "Lock Unselected"
msgstr "Zamknúť nevybrané"
msgid "Lock Unused"
msgstr "Zamknúť nepoužité"
msgctxt "Operator"
@ -113655,8 +113678,8 @@ msgstr "Prepnúť oblasť na celú obrazovku"
msgctxt "Operator"
msgid "Track Ordering..."
msgstr "Poradie stôp..."
msgid "Sound"
msgstr "Zvuk"
msgctxt "Operator"
@ -113665,13 +113688,13 @@ msgstr "Premenovať..."
msgctxt "Operator"
msgid "Stop Tweaking Strip Actions"
msgstr "Zastaviť potiahnutie akcií pásu"
msgid "Track Ordering..."
msgstr "Poradie stôp..."
msgctxt "Operator"
msgid "Add Tracks Above Selected"
msgstr "Pridať stopy nad vybranými"
msgid "Stop Tweaking Strip Actions"
msgstr "Zastaviť potiahnutie akcií pásu"
msgctxt "Operator"
@ -114067,11 +114090,6 @@ msgid "Movie"
msgstr "Film"
msgctxt "Operator"
msgid "Sound"
msgstr "Zvuk"
msgctxt "Operator"
msgid "Image/Sequence"
msgstr "Obrázok/sekvencia"
@ -122782,14 +122800,6 @@ msgid "Cannot make library override from a local object"
msgstr "Nemožno vytvoriť prepis knižnice z lokálneho objektu"
msgid "The node group must have a geometry input socket"
msgstr "Skupina uzlov musí mať vstupnú zásuvku geometrie"
msgid "The first input must be a geometry socket"
msgstr "Prvým vstupom musí byť geometrická zásuvka"
msgid "The node group must have a geometry output socket"
msgstr "Skupina uzlov musí mať výstupnú zásuvku geometrie"
@ -123787,10 +123797,6 @@ msgid " Materials,"
msgstr " Materiály,"
msgid " Textures,"
msgstr " Textúry,"
msgid " Stencil,"
msgstr " Šablóna,"
@ -127174,10 +127180,6 @@ msgid "Freestyle: Stroke rendering"
msgstr "Voľný štýl: Prekreslenie ťahu"
msgid "Cannot open file: %s"
msgstr "Nemožno otvoriť súbor: %s"
msgid "Bind To"
msgstr "Naviazať na"
@ -131127,14 +131129,6 @@ msgid "Disabled, Blender was compiled without OpenSubdiv"
msgstr "Zakázané, Blender bol skompilovaný bez OpenSubdiv"
msgid "Half-Band Width"
msgstr "Šírka polovičného pásma"
msgid "Half the width of the narrow band in voxel units"
msgstr "Polovica šírky úzkeho pásma vo voxelových jednotkách"
msgid "Corner Index"
msgstr "Index rohov"
@ -131435,18 +131429,6 @@ msgid "Whether the node could find a single face to sample at the UV coordinate"
msgstr "Určuje, či by uzol mohol nájsť jednu plôšku na snímanie pri UV súradniciach"
msgid "Grid name needs to be specified"
msgstr "Je potrebné uviesť názov mriežky"
msgid "The grid type is unsupported"
msgstr "Typ mriežky nie je podporovaný"
msgid "Expects a Named Attribute with the name of a Grid in the Volume"
msgstr "Očakáva sa pomenovaný atribút s názvom mriežky v objeme"
msgid "Origin of the scaling for each element. If multiple elements are connected, their center is averaged"
msgstr "Počiatok zmeny mierky pre každý prvok. Ak je spojených viacero prvkov, ich stred sa spriemeruje"
@ -131455,18 +131437,6 @@ msgid "Direction in which to scale the element"
msgstr "Smer, v ktorom má prvok zmeniť mierku"
msgid "Radius must be greater than 0"
msgstr "Polomer musí byť väčší ako 0"
msgid "Half-band width must be greater than 1"
msgstr "Šírka polovičného pásma musí byť väčšia ako 1"
msgid "Voxel size is too small"
msgstr "Veľkosť voxelu je príliš malá"
msgid "The parts of the geometry that go into the first output"
msgstr "Časti geometrie, ktoré sa dostanú do prvého výstupu"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2012-09-07 22:32+0100\n"
"Last-Translator: Nikola Radovanovic <cobisimo@gmail.com>\n"
"Language-Team: Nikola Radovanovic\n"
@ -9131,6 +9131,10 @@ msgid "Vertex Group Specials"
msgstr "Специјална група темена"
msgid "Strip"
msgstr "Одстрани"
msgid "Math"
msgstr "Математика"
@ -9191,10 +9195,6 @@ msgid "Navigation"
msgstr "Навигација"
msgid "Strip"
msgstr "Одстрани"
msgid "Inputs"
msgstr "Улази"
@ -11451,10 +11451,6 @@ msgid "Set Alpha"
msgstr "Постави алфу"
msgid "Split Viewer"
msgstr "Подели прегледач"
msgid "Stabilize 2D"
msgstr "Стабилизуј 2D"
@ -14876,6 +14872,10 @@ msgid "Flat"
msgstr "Равно"
msgid "Duplicate"
msgstr "Дуплирај"
msgctxt "Operator"
msgid "Select Mode"
msgstr "Мод изабора"
@ -15498,10 +15498,6 @@ msgid "Duplicate mesh and move"
msgstr "Дуплира и премеша меш"
msgid "Duplicate"
msgstr "Дуплирај"
msgctxt "Operator"
msgid "Make Edge/Face"
msgstr "Направи ивицу/страницу"
@ -25101,13 +25097,13 @@ msgstr "Распакуј"
msgctxt "Operator"
msgid "Track Ordering..."
msgstr "Редослед праћења..."
msgid "Sound"
msgstr "Звук"
msgctxt "Operator"
msgid "Add Tracks Above Selected"
msgstr "Додаје стазе изнад изабране"
msgid "Track Ordering..."
msgstr "Редослед праћења..."
msgctxt "Operator"
@ -25156,11 +25152,6 @@ msgid "Movie"
msgstr "Филм"
msgctxt "Operator"
msgid "Sound"
msgstr "Звук"
msgid "Storage"
msgstr "Складиште"
@ -27150,10 +27141,6 @@ msgid "UV Vertex"
msgstr "UV теме"
msgid "Cannot open file: %s"
msgstr "Не могу да отворим датотеку: %s"
msgctxt "Action"
msgid "Group"
msgstr "Група"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2012-09-07 22:32+0100\n"
"Last-Translator: Nikola Radovanovic <cobisimo@gmail.com>\n"
"Language-Team: Nikola Radovanovic\n"
@ -9131,6 +9131,10 @@ msgid "Vertex Group Specials"
msgstr "Specijalna grupa temena"
msgid "Strip"
msgstr "Odstrani"
msgid "Math"
msgstr "Matematika"
@ -9191,10 +9195,6 @@ msgid "Navigation"
msgstr "Navigacija"
msgid "Strip"
msgstr "Odstrani"
msgid "Inputs"
msgstr "Ulazi"
@ -11451,10 +11451,6 @@ msgid "Set Alpha"
msgstr "Postavi alfu"
msgid "Split Viewer"
msgstr "Podeli pregledač"
msgid "Stabilize 2D"
msgstr "Stabilizuj 2D"
@ -14876,6 +14872,10 @@ msgid "Flat"
msgstr "Ravno"
msgid "Duplicate"
msgstr "Dupliraj"
msgctxt "Operator"
msgid "Select Mode"
msgstr "Mod izabora"
@ -15498,10 +15498,6 @@ msgid "Duplicate mesh and move"
msgstr "Duplira i premeša meš"
msgid "Duplicate"
msgstr "Dupliraj"
msgctxt "Operator"
msgid "Make Edge/Face"
msgstr "Napravi ivicu/stranicu"
@ -25101,13 +25097,13 @@ msgstr "Raspakuj"
msgctxt "Operator"
msgid "Track Ordering..."
msgstr "Redosled praćenja..."
msgid "Sound"
msgstr "Zvuk"
msgctxt "Operator"
msgid "Add Tracks Above Selected"
msgstr "Dodaje staze iznad izabrane"
msgid "Track Ordering..."
msgstr "Redosled praćenja..."
msgctxt "Operator"
@ -25156,11 +25152,6 @@ msgid "Movie"
msgstr "Film"
msgctxt "Operator"
msgid "Sound"
msgstr "Zvuk"
msgid "Storage"
msgstr "Skladište"
@ -27150,10 +27141,6 @@ msgid "UV Vertex"
msgstr "UV teme"
msgid "Cannot open file: %s"
msgstr "Ne mogu da otvorim datoteku: %s"
msgctxt "Action"
msgid "Group"
msgstr "Grupa"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: \n"
"Last-Translator: Arvid Rudling <arvid.r@gmail.com>\n"
"Language-Team: \n"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2023-11-16 03:55+0000\n"
"Last-Translator: Isaac Gicheha <shwaky3@gmail.com>\n"
"Language-Team: Swahili <https://translate.blender.org/projects/blender-ui/ui/sw/>\n"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2023-11-05 13:30+0000\n"
"Last-Translator: saran <saranmurugappan2020@gmail.com>\n"
"Language-Team: Tamil <https://translate.blender.org/projects/blender-ui/ui/ta/>\n"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2019-12-08 17:40+0700\n"
"Last-Translator: gongpha <gongpha@gmail.com>\n"
"Language-Team: Thai Translation Team <gongpha@gmail.com>\n"
@ -2732,6 +2732,10 @@ msgid "Flat"
msgstr "ราบแบน"
msgid "Duplicate"
msgstr "ทำซ้ำ"
msgctxt "Operator"
msgid "Clear Render Region"
msgstr "ล้างขอบเขตที่เรนเดอร์"
@ -2813,10 +2817,6 @@ msgid "Add a new material"
msgstr "เพิ่มวัสดุใหม่"
msgid "Duplicate"
msgstr "ทำซ้ำ"
msgid "Cut"
msgstr "ตัด"
@ -4323,6 +4323,11 @@ msgid "Mirror Y"
msgstr "สะท้อน Y"
msgctxt "Operator"
msgid "Sound"
msgstr "เสียง"
msgctxt "Operator"
msgid "Rename..."
msgstr "เปลี่ยนชื่อ..."
@ -4343,11 +4348,6 @@ msgid "Movie"
msgstr "ภาพยนตร์"
msgctxt "Operator"
msgid "Sound"
msgstr "เสียง"
msgctxt "Operator"
msgid "Fade"
msgstr "จาง"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2023-11-15 02:54+0000\n"
"Last-Translator: bitigchi <bitigchi@me.com>\n"
"Language-Team: Turkish <https://translate.blender.org/projects/blender-ui/ui/tr/>\n"
@ -7956,10 +7956,6 @@ msgid "Mirror"
msgstr "Yansıt"
msgid "Signed Distance"
msgstr "İmzalı Uzaklık"
msgid "Is Viewport"
msgstr "Görüş Alanı"
@ -12708,10 +12704,6 @@ msgid " Materials,"
msgstr " Malzemeler,"
msgid " Textures,"
msgstr " Dokular,"
msgid "OK"
msgstr "TAMAM"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2021-03-01 19:15+0000\n"
"Last-Translator: lxlalexlxl <lxlalexlxl@ukr.net>\n"
"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/lxlalexlxl/blender/language/uk_UA/)\n"
@ -29368,6 +29368,10 @@ msgid "Vertex Group Specials"
msgstr "Параметри груп вершин"
msgid "Strip"
msgstr "Смужка"
msgid "Utilities"
msgstr "Утиліти"
@ -29469,10 +29473,6 @@ msgid "Select Handle"
msgstr "Вибрати Держак"
msgid "Strip"
msgstr "Смужка"
msgid "Inputs"
msgstr "Вводи"
@ -37568,10 +37568,6 @@ msgid "Replace Alpha"
msgstr "Замінити Альфа"
msgid "Split Viewer"
msgstr "Розділений оглядач"
msgid "Stabilize 2D"
msgstr "Стабілізація 2D"
@ -38084,6 +38080,10 @@ msgid "Bring the input object geometry, location, rotation and scale into the mo
msgstr "Внести геометрію, локацію, обертання та масштаб об'єкта уводу у модифікований об'єкт, підтримуючи відносну позицію між цими двома об'єктами у сцені"
msgid "Points to Volume"
msgstr "Точки в Об'єм"
msgid "Specify the approximate number of voxels along the diagonal"
msgstr "Визначити приблизну кількість вокселів уздовж діагоналі"
@ -38092,10 +38092,6 @@ msgid "Specify the voxel side length"
msgstr "Визначити довжину сторони вокселя"
msgid "Points to Volume"
msgstr "Точки в Об'єм"
msgid "Target Geometry"
msgstr "Цільова Геометрія"
@ -48379,6 +48375,10 @@ msgid "Flat"
msgstr "Плоско"
msgid "Duplicate"
msgstr "Дублювання"
msgctxt "Operator"
msgid "Select Mode"
msgstr "Режим Вибору"
@ -50567,10 +50567,6 @@ msgid "Duplicate mesh and move"
msgstr "Дублювати сіть і рухати"
msgid "Duplicate"
msgstr "Дублювання"
msgctxt "Operator"
msgid "Collapse Edges & Faces"
msgstr "Стягнути Ребра та Грані"
@ -87150,13 +87146,13 @@ msgstr "Інвертування"
msgctxt "Operator"
msgid "Lock Unused"
msgstr "Блокувати Невикористане"
msgid "Lock Unselected"
msgstr "Блокувати Невибране"
msgctxt "Operator"
msgid "Lock Unselected"
msgstr "Блокувати Невибране"
msgid "Lock Unused"
msgstr "Блокувати Невикористане"
msgctxt "Operator"
@ -89033,8 +89029,8 @@ msgstr "Перемкнути Область на Повний Екран"
msgctxt "Operator"
msgid "Track Ordering..."
msgstr "Порядок Відстеження..."
msgid "Sound"
msgstr "Звук"
msgctxt "Operator"
@ -89043,13 +89039,13 @@ msgstr "Перейменування..."
msgctxt "Operator"
msgid "Stop Tweaking Strip Actions"
msgstr "Зупинити Підправлення Дій Смужок"
msgid "Track Ordering..."
msgstr "Порядок Відстеження..."
msgctxt "Operator"
msgid "Add Tracks Above Selected"
msgstr "Додати Відстеження Над Вибраним"
msgid "Stop Tweaking Strip Actions"
msgstr "Зупинити Підправлення Дій Смужок"
msgctxt "Operator"
@ -89326,11 +89322,6 @@ msgid "Movie"
msgstr "Фільм"
msgctxt "Operator"
msgid "Sound"
msgstr "Звук"
msgctxt "Operator"
msgid "Image/Sequence"
msgstr "Зображення/Послідовність"
@ -98491,10 +98482,6 @@ msgid "Freestyle: Stroke rendering"
msgstr "Freestyle: Рендеринг штриха"
msgid "Cannot open file: %s"
msgstr "Неможливо відкрити файл: %s"
msgid "Bind To"
msgstr "Прив'язка До"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\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 <su_huynh@yahoo.com>\n"
"Language-Team: Tỉnh An Giang, Đình Bình Phú\n"
@ -32525,6 +32525,10 @@ msgid "Vertex Group Specials"
msgstr "Đồ Đặc Biệt Nhóm Đỉnh"
msgid "Strip"
msgstr "Đoạn"
msgid "Utilities"
msgstr "Các Dịch Vụ"
@ -32642,10 +32646,6 @@ msgid "Select Handle"
msgstr "Chọn Tay Cầm"
msgid "Strip"
msgstr "Đoạn"
msgid "Inputs"
msgstr "Ngõ Vào"
@ -41325,10 +41325,6 @@ 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"
msgid "Split Viewer"
msgstr "Chẻ Màn Hiển Thị"
msgid "Stabilize 2D"
msgstr "Ổn Định Hóa 2D"
@ -42741,14 +42737,14 @@ 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"
msgid "How the voxel size is specified"
msgstr "Làm sao xác định cỡ thước của thể tích tử"
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"
msgid "How the voxel size is specified"
msgstr "Làm sao xác định cỡ thước của thể tích tử"
msgid "UV Sphere"
msgstr "Hình Cầu UV"
@ -42781,14 +42777,6 @@ 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"
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"
msgid "Specify the voxel side length"
msgstr "Xác định chiều dài cạnh của thể tích tử"
msgid "Points to Vertices"
msgstr "Điểm đến Đỉnh"
@ -42805,6 +42793,14 @@ 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"
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"
msgid "Specify the voxel side length"
msgstr "Xác định chiều dài cạnh của thể tích tử"
msgid "Geometry Proximity"
msgstr "Khoảng Cách Hình Dạng"
@ -55348,6 +55344,10 @@ msgid "Flat"
msgstr "Bằng Phẳng"
msgid "Duplicate"
msgstr "Dao Chép"
msgctxt "Operator"
msgid "Select Mode"
msgstr "Chế Độ Chọn"
@ -57571,10 +57571,6 @@ msgid "Duplicate mesh and move"
msgstr "sao chép mạng lưới và di chuyển"
msgid "Duplicate"
msgstr "Dao Chép"
msgctxt "Operator"
msgid "Collapse Edges & Faces"
msgstr "Tóp Cạnh & Mặt"
@ -100430,13 +100426,13 @@ msgstr "Che Khuất Tùy Chọn"
msgctxt "Operator"
msgid "Lock Unused"
msgstr "Khóa Không Được Dùng"
msgid "Lock Unselected"
msgstr "Khóa Không Được Chọn"
msgctxt "Operator"
msgid "Lock Unselected"
msgstr "Khóa Không Được Chọn"
msgid "Lock Unused"
msgstr "Khóa Không Được Dùng"
msgctxt "Operator"
@ -102409,8 +102405,8 @@ msgstr "Bật/Tắt Vùng Toàn Màn"
msgctxt "Operator"
msgid "Track Ordering..."
msgstr "Thứ Tự Theo Dõi..."
msgid "Sound"
msgstr "Âm Thanh"
msgctxt "Operator"
@ -102419,13 +102415,13 @@ msgstr "Đổi Tên..."
msgctxt "Operator"
msgid "Stop Tweaking Strip Actions"
msgstr "Nghỉ Chỉnh Hành Động Đoạn"
msgid "Track Ordering..."
msgstr "Thứ Tự Theo Dõi..."
msgctxt "Operator"
msgid "Add Tracks Above Selected"
msgstr "Thêm Theo Gõi Trên Được Chọn"
msgid "Stop Tweaking Strip Actions"
msgstr "Nghỉ Chỉnh Hành Động Đoạn"
msgctxt "Operator"
@ -102754,11 +102750,6 @@ msgid "Movie"
msgstr "Phim"
msgctxt "Operator"
msgid "Sound"
msgstr "Âm Thanh"
msgctxt "Operator"
msgid "Image/Sequence"
msgstr "Ảnh/Trình Tự"
@ -113684,10 +113675,6 @@ msgid "Freestyle: Stroke rendering"
msgstr "Phong Cách Tự Do: Kết xuất nét"
msgid "Cannot open file: %s"
msgstr "Không thể mở tập tin: %s"
msgid "Bind To"
msgstr "Trói Đến"

View File

@ -1,11 +1,11 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"PO-Revision-Date: 2023-10-10 05:56+0000\n"
"Last-Translator: maylog <maylog@126.com>\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 <ziweidao@foxmail.com>\n"
"Language-Team: Chinese (Simplified) <https://translate.blender.org/projects/blender-ui/ui/zh_Hans/>\n"
"Language: zh_HANS\n"
"MIME-Version: 1.0\n"
@ -17141,7 +17141,7 @@ msgstr "过滤角度"
msgid "Ignore points on the stroke that deviate from their neighbors by more than this angle when determining the extrapolation shape"
msgstr "在确定外延形状时,忽略与邻偏离超过此角度的笔画点"
msgstr "在确定外延形状时,忽略与邻偏离超过此角度的笔画点"
msgid "Mode to define length"
@ -33498,6 +33498,10 @@ msgid "Vertex Group Specials"
msgstr "特殊顶点组"
msgid "Strip"
msgstr "片段"
msgid "Utilities"
msgstr "实用工具"
@ -33620,10 +33624,6 @@ msgid "Select Handle"
msgstr "选择控制柄"
msgid "Strip"
msgstr "片段"
msgid "Inputs"
msgstr "输入"
@ -35301,7 +35301,7 @@ msgstr "材质模式"
msgid "Method for setting materials on the new faces"
msgstr "在新生面上设材质的方法"
msgstr "在新生面上设材质的方法"
msgid "Index Based"
@ -42487,10 +42487,6 @@ msgid "Replace the input image's alpha channel by the alpha input value"
msgstr "用 Alpha 输入值替换输入图像的 Alpha 通道"
msgid "Split Viewer"
msgstr "对照预览"
msgid "Stabilize 2D"
msgstr "二维稳像"
@ -42688,7 +42684,7 @@ msgstr "模糊系数"
msgid "Scaling factor for motion vectors (actually, 'shutter speed', in frames)"
msgstr "运动矢量的缩放系数 (即 '门速度', 以帧为单位)"
msgstr "运动矢量的缩放系数 (即 '门速度', 以帧为单位)"
msgid "Max Speed"
@ -44058,14 +44054,14 @@ msgid "Create a point in the point cloud for each selected face corner"
msgstr "为每个选定面拐在点云中创建点"
msgid "How the voxel size is specified"
msgstr "如何指定体素大小"
msgid "Create a fog volume with the shape of the input mesh's surface"
msgstr "使用输入网格表面的形状创建雾体积"
msgid "How the voxel size is specified"
msgstr "如何指定体素大小"
msgid "UV Sphere"
msgstr "经纬球"
@ -44122,14 +44118,6 @@ msgid "Retrieve a point index within a curve"
msgstr "检索点在曲线内的编号"
msgid "Specify the approximate number of voxels along the diagonal"
msgstr "沿对角线指定体素的近似数量"
msgid "Specify the voxel side length"
msgstr "指定体素边长度"
msgid "Points to Vertices"
msgstr "点 -> 顶点"
@ -44146,6 +44134,14 @@ msgid "Generate a fog volume sphere around every point"
msgstr "在每个点周围生成雾体积球体"
msgid "Specify the approximate number of voxels along the diagonal"
msgstr "沿对角线指定体素的近似数量"
msgid "Specify the voxel side length"
msgstr "指定体素边长度"
msgid "Geometry Proximity"
msgstr "几何接近"
@ -44431,7 +44427,7 @@ msgstr "设置每个控制点处的曲线半径"
msgid "Set Curve Tilt"
msgstr "平滑曲线倾斜"
msgstr "设置曲线倾斜"
msgid "Set the tilt angle at each curve control point"
@ -57182,6 +57178,10 @@ msgid "Flat"
msgstr "平展"
msgid "Duplicate"
msgstr "复制"
msgctxt "Operator"
msgid "Select Mode"
msgstr "选择模式"
@ -59431,10 +59431,6 @@ msgid "Duplicate mesh and move"
msgstr "复制网格并移动"
msgid "Duplicate"
msgstr "复制"
msgctxt "Operator"
msgid "Collapse Edges & Faces"
msgstr "塌陷边线&面"
@ -60101,7 +60097,7 @@ msgstr "选择多个环边"
msgid "Select a loop of connected edges by connection type"
msgstr "选择一个顶点连接紫外线循环"
msgstr "按连接类型选择一个已连接边的循环"
msgid "Ring"
@ -64510,7 +64506,7 @@ msgstr "应用多级精度的基形"
msgid "Modify the base mesh to conform to the displaced mesh"
msgstr "修改基础网格与置换后网格一致"
msgstr "修改基础网格使其与置换后网格一致"
msgctxt "Operator"
@ -71162,15 +71158,6 @@ msgid "Project the geometry onto a plane defined by a line"
msgstr "将几何体投影到由线条定义的平面上"
msgctxt "Operator"
msgid "Reveal All"
msgstr "显示全部"
msgid "Unhide all geometry"
msgstr "取消隐藏所有几何体"
msgid "Sample the vertex color of the active vertex"
msgstr "对活动顶点的顶点颜色取样"
@ -84258,7 +84245,7 @@ msgstr "编辑棚灯"
msgid "View the result of the studio light editor in the viewport"
msgstr "在视口查看工作间灯光编辑器的结果"
msgstr "在视口查看棚灯编辑器的结果"
msgid "VBO Collection Rate"
@ -102176,12 +102163,12 @@ msgstr "交集"
msgctxt "Operator"
msgid "Degenerate"
msgstr "退"
msgstr "退"
msgctxt "Operator"
msgid "Distorted"
msgstr "畸变"
msgstr "畸变"
msgctxt "Operator"
@ -104129,13 +104116,13 @@ msgstr "自定义遮挡"
msgctxt "Operator"
msgid "Lock Unused"
msgstr "锁定未使用"
msgid "Lock Unselected"
msgstr "未选中项"
msgctxt "Operator"
msgid "Lock Unselected"
msgstr "未选中项"
msgid "Lock Unused"
msgstr "锁定未使用"
msgctxt "Operator"
@ -106026,6 +106013,11 @@ msgid "Unpin"
msgstr "取消钉选"
msgctxt "Operator"
msgid "Invert Pins"
msgstr "反转钉选"
msgctxt "Operator"
msgid "Clear Seam"
msgstr "清除缝合边"
@ -106142,8 +106134,8 @@ msgstr "切换全屏模式"
msgctxt "Operator"
msgid "Track Ordering..."
msgstr "轨道排序..."
msgid "Sound"
msgstr "声音"
msgctxt "Operator"
@ -106152,13 +106144,13 @@ msgstr "重命名..."
msgctxt "Operator"
msgid "Stop Tweaking Strip Actions"
msgstr "停止调节动作段"
msgid "Track Ordering..."
msgstr "轨道排序..."
msgctxt "Operator"
msgid "Add Tracks Above Selected"
msgstr "在选中项上方添加轨道"
msgid "Stop Tweaking Strip Actions"
msgstr "停止调节动作段"
msgctxt "Operator"
@ -106542,11 +106534,6 @@ msgid "Movie"
msgstr "影片"
msgctxt "Operator"
msgid "Sound"
msgstr "声音"
msgctxt "Operator"
msgid "Image/Sequence"
msgstr "图像/序列"
@ -114170,14 +114157,6 @@ msgid "Cannot make library override from a local object"
msgstr "无法从本地物体创建库重写"
msgid "The node group must have a geometry input socket"
msgstr "节点组必须具有几何输入接口"
msgid "The first input must be a geometry socket"
msgstr "第一个输入必须是几何接口"
msgid "The node group must have a geometry output socket"
msgstr "节点组必须具有几何输出接口"
@ -117990,10 +117969,6 @@ msgid "Freestyle: Stroke rendering"
msgstr "Freestyle: 笔画渲染"
msgid "Cannot open file: %s"
msgstr "无法打开文件: %s"
msgid "Bind To"
msgstr "绑定到"

View File

@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 4.1.0 Alpha (b'd293f72ab6e7')\n"
"Project-Id-Version: Blender 4.1.0 Alpha (b'72b6c44e759b')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-11-27 10:28:34\n"
"POT-Creation-Date: 2023-12-04 11:06:00\n"
"PO-Revision-Date: 2023-11-23 11:54+0000\n"
"Last-Translator: 楊 景貴 <issacsopp@gmail.com>\n"
"Language-Team: Chinese (Traditional) <https://translate.blender.org/projects/blender-ui/ui/zh_Hant/>\n"
@ -19381,6 +19381,10 @@ msgid "Vertex Group Specials"
msgstr "頂點群組特殊項"
msgid "Strip"
msgstr "片段"
msgid "Utilities"
msgstr "效用"
@ -19469,10 +19473,6 @@ msgid "Navigation"
msgstr "導覽"
msgid "Strip"
msgstr "片段"
msgid "Inputs"
msgstr "輸入"
@ -25013,10 +25013,6 @@ msgid "Set Alpha"
msgstr "設定 Alpha"
msgid "Split Viewer"
msgstr "分割檢視器"
msgid "Stabilize 2D"
msgstr "穩定處理 2D"
@ -31419,6 +31415,10 @@ msgid "Flat"
msgstr "扁平"
msgid "Duplicate"
msgstr "製作複本"
msgctxt "Operator"
msgid "Select Mode"
msgstr "選取模式"
@ -32643,10 +32643,6 @@ msgid "Duplicate mesh and move"
msgstr "製作網格複本並移動"
msgid "Duplicate"
msgstr "製作複本"
msgctxt "Operator"
msgid "Make Edge/Face"
msgstr "建立邊線/面"
@ -54253,6 +54249,11 @@ msgid "Toggle Fullscreen Area"
msgstr "切換全螢幕區域"
msgctxt "Operator"
msgid "Sound"
msgstr "聲音"
msgctxt "Operator"
msgid "Track Ordering..."
msgstr "軌道排序處理..."
@ -54263,11 +54264,6 @@ msgid "Stop Tweaking Strip Actions"
msgstr "停止調校片段動作"
msgctxt "Operator"
msgid "Add Tracks Above Selected"
msgstr "在所選項之上添加軌道"
msgctxt "Operator"
msgid "Remove from Frame"
msgstr "從框幀上移除"
@ -54327,11 +54323,6 @@ msgid "Movie"
msgstr "影片"
msgctxt "Operator"
msgid "Sound"
msgstr "聲音"
msgctxt "Operator"
msgid "Slip Strip Contents"
msgstr "滑動片段內容"
@ -59141,10 +59132,6 @@ msgid "Freestyle: Stroke rendering"
msgstr "Freestyle算繪筆觸"
msgid "Cannot open file: %s"
msgstr "無法開啟檔案:%s"
msgid "Bone Envelopes"
msgstr "骨骼封套"
@ -59864,10 +59851,6 @@ msgid "Old"
msgstr "老舊"
msgid "Expects a Named Attribute with the name of a Grid in the Volume"
msgstr "需要具有體積中網格名稱的具名屬性"
msgid "Edge Crease"
msgstr "邊線皺摺"

View File

@ -115,7 +115,7 @@ colorspaces:
from_scene_reference: !<GroupTransform>
children:
- !<ColorSpaceTransform> {src: Linear CIE-XYZ E, dst: Linear CIE-XYZ D65}
- !<MatrixTransform> {matrix: [ 3.2410032329763587, -1.5373989694887855, -0.4986158819963629, 0, -0.9692242522025164, 1.8759299836951759, 0.0415542263400847, 0, 0.0556394198519755, -0.2040112061239099, 1.0571489771875333, 0, 0, 0, 0, 1]}
- !<MatrixTransform> {matrix: [3.2404373564920070, -1.5371305409000549, -0.4985288240756933, 0, -0.9692674982687597, 1.8760136862977035, 0.0415560804587997, 0, 0.0556434463874256, -0.2040259700872272, 1.0572254813610864, 0, 0, 0, 0, 1]}
- !<ColorSpace>
name: Linear DCI-P3 D65

View File

@ -1,111 +1,145 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<title>Blender Readme</title>
<style type="text/css">
p.p1 {margin: 0.0px 156.0px 22.0px 156.0px; text-align: center; font: 22.0px Helvetica}
p.p2 {margin: 0.0px 0.0px 12.0px 0.0px; font: 12.0px Times; min-height: 14.0px}
p.p3 {margin: 0.0px 156.0px 16.0px 156.0px; font: 16.0px Helvetica}
p.p4 {margin: 0.0px 156.0px 14.0px 156.0px; font: 14.0px Helvetica}
p.p5 {margin: 0.0px 156.0px 14.0px 156.0px; font: 14.0px Helvetica; color: #0000ee}
p.p6 {margin: 0.0px 156.0px 14.0px 156.0px; text-align: center; font: 14.0px Helvetica}
span.s1 {text-decoration: underline ; color: #0000ee}
span.s2 {font: 14.0px 'Lucida Grande'}
span.s3 {color: #000000}
span.s4 {text-decoration: underline}
</style>
</head>
<body>
<p class="p1"><b>Blender @BLENDER_VERSION@</b></p>
<p class="p2"><br></p>
<p class="p3"><b>About</b></p>
<p class="p4">
Welcome to Blender, the free, open source 3D application for modeling, rigging, animation,
simulation, rendering, compositing, motion tracking, and video editing.
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<title>Blender Readme</title>
<style type="text/css">
p.p1 {margin: 0.0px 156.0px 22.0px 156.0px; text-align: center; font: 22.0px Helvetica}
p.p2 {margin: 0.0px 0.0px 12.0px 0.0px; font: 12.0px Times; min-height: 14.0px}
p.p3 {margin: 0.0px 156.0px 16.0px 156.0px; font: 16.0px Helvetica}
p.p4 {margin: 0.0px 156.0px 14.0px 156.0px; font: 14.0px Helvetica}
p.p5 {margin: 0.0px 156.0px 14.0px 156.0px; font: 14.0px Helvetica; color: #0000ee}
p.p6 {margin: 0.0px 156.0px 14.0px 156.0px; text-align: center; font: 14.0px Helvetica}
span.s1 {text-decoration: underline ; color: #0000ee}
span.s2 {font: 14.0px 'Lucida Grande'}
span.s3 {color: #000000}
span.s4 {text-decoration: underline}
</style>
</head>
<body>
<p class="p1"><b>Blender @BLENDER_VERSION@</b></p>
<p class="p2"><br></p>
<p class="p3"><b>About</b></p>
<p class="p4">
Welcome to Blender, the free, open source 3D application for modeling, rigging, animation,
simulation, rendering, compositing, motion tracking, and video editing.
Blender is available for Linux, macOS and Windows and has a large world-wide community.
</p>
<p class="p4">
Blender can be used freely for any purpose, including commercial use and distribution.
It's free and open-source software, released under the GNU GPL licence.
The entire source code is available on our website.
</p>
<p class="p4">
For more information, visit <a href="https://www.blender.org/"><span class="s1">blender.org</span></a>.
</p>
<p class="p2"><br></p>
<p class="p3"><b>@BLENDER_VERSION@</b></p>
<p class="p4">
The Blender Foundation and online developer community is proud to present Blender @BLENDER_VERSION@.
<a href="https://wiki.blender.org/wiki/Reference/Release_Notes/@BLENDER_VERSION@">
<span class="s1">More information about this release</span></a>.
</p>
<p class="p2"><br></p>
<p class="p3"><b>Bugs</b></p>
<p class="p4">
Although this is considered a stable release, you may encounter a bug.
If you do, please help us by posting it in the bug tracker or using Help
<span class="s2"></span> Report a Bug from inside Blender.
If it wasnt reported yet, please log in (or register) and fill in detailed information about the error.
Please post detailed instructions on how to reproduce it or post a .blend file showcasing the bug.
</p>
<p class="p2"><br></p>
<p class="p3"><b>Package Contents</b></p>
<p class="p4">The downloaded Blender package includes:</p>
<p class="p4">• The Blender application for the chosen operating system.</p>
<p class="p4">• Add-ons to extend Blender functionality.</p>
<p class="p4">• Readme and copyright files.</p>
<p class="p2"><br></p>
<p class="p3"><b>Installation</b></p>
<p class="p4">
<b>Windows: </b>The download .zip contains a Blender folder. You may put this anywhere on your hard drive.
To launch Blender, double-click on Blender.exe.
</p>
<p class="p4">
<b>Linux: </b>Unpack the archive, then run the Blender executable.
</p>
<p class="p4">
<b>macOS: </b>The downloaded package includes Blender.app.
Optionally copy this to your Applications folder, and add it to the dock by dragging it from there to the dock.
</p>
<p class="p2"><br></p>
<p class="p4">
<b>Installing Addons (all systems)</b> Addons can be installed from the user preferences addons section,
download an addon as a .py or .zip file, then press the "Install Addon" button and select the file to install it.
</p>
<p class="p2"><br></p>
<p class="p3"><b>Links</b></p>
<p class="p4">Users:</p>
<p class="p5">
<span class="s3">General information <a href="https://www.blender.org/">
<span class="s4">www.blender.org</span></a> <br>
Release Notes <a href="https://wiki.blender.org/wiki/Reference/Release_Notes/@BLENDER_VERSION@">
<span class="s4">wiki.blender.org/wiki/Reference/Release_Notes/@BLENDER_VERSION@</span></a><br>
Tutorials <a href="https://www.blender.org/support/tutorials/">
<span class="s4">www.blender.org/support/tutorials/</span></a> <br>
Manual <a href="https://docs.blender.org/manual/en/latest/"><span class="s4">https://docs.blender.org/manual/en/latest/</span></a><br>
User Forum <a href="https://www.blenderartists.org/">
<span class="s4">www.blenderartists.org</span></a><br>
Chat <a href="https://blender.chat/channel/today">
<span class="s4">#today</span></a> or <a href="https://blender.chat/channel/support">
<span class="s4">#support</span></a> on blender.chat</span>
</p>
<p class="p4">Developers:</p>
<p class="p5">
<span class="s3">Development <a href="https://www.blender.org/get-involved/developers/">
<span class="s4">www.blender.org/get-involved/developers/</span></a><br>
GIT and Bug Tracker <a href="https://projects.blender.org/">
<span class="s4">projects.blender.org</span></a><br>
Chat <a href="https://blender.chat/channel/blender-coders">
<span class="s4">#blender-coders</span></a> on blender.chat</span>
</p>
<p class="p2"><br></p>
<p class="p2"><br></p>
<p class="p6">Blender is open-source and free for all to use.</p>
<p class="p2"><br></p>
<p class="p6">Enjoy.</p>
<p class="p2"><br></p>
</body>
Blender is available for Linux, macOS and Windows and has a large world-wide community.
</p>
<p class="p4">
Blender can be used freely for any purpose, including commercial use and distribution.
It's free and open-source software, released under the GNU GPL licence.
The entire source code is available on our website.
</p>
<p class="p4">
For more information, visit
<a href="https://www.blender.org/">
<span class="s1">blender.org</span>
</a>.
</p>
<p class="p2"><br></p>
<p class="p3"><b>@BLENDER_VERSION@</b></p>
<p class="p4">
The Blender Foundation and online developer community is proud to present Blender
@BLENDER_VERSION@.
<a href="https://wiki.blender.org/wiki/Reference/Release_Notes/@BLENDER_VERSION@">
<span class="s1">More information about this release</span>
</a>.
</p>
<p class="p2"><br></p>
<p class="p3"><b>Bugs</b></p>
<p class="p4">
Although this is considered a stable release, you may encounter a bug.
If you do, please help us by posting it in the bug tracker or using Help
<span class="s2"></span> Report a Bug from inside Blender. If it wasnt reported yet,
please log in (or register) and fill in detailed information about the error. Please post
detailed instructions on how to reproduce it or post a .blend file showcasing the bug.
</p>
<p class="p2"><br></p>
<p class="p3"><b>Package Contents</b></p>
<p class="p4">The downloaded Blender package includes:</p>
<p class="p4">• The Blender application for the chosen operating system.</p>
<p class="p4">• Add-ons to extend Blender functionality.</p>
<p class="p4">• Readme and copyright files.</p>
<p class="p2"><br></p>
<p class="p3"><b>Installation</b></p>
<p class="p4">
<b>Windows: </b>
The download .zip contains a Blender folder. You may put this anywhere on your hard drive.
To launch Blender, double-click on Blender.exe.
</p>
<p class="p4">
<b>Linux: </b>Unpack the archive, then run the Blender executable.
</p>
<p class="p4">
<b>macOS: </b>
The downloaded package includes Blender.app.
Optionally copy this to your Applications folder,
and add it to the dock by dragging it from there to the dock.
</p>
<p class="p2"><br></p>
<p class="p4">
<b>Installing Addons (all systems)</b>
Addons can be installed from the user preferences addons section,
download an addon as a .py or .zip file, then press the "Install Addon"
button and select the file to install it.
</p>
<p class="p2"><br></p>
<p class="p3"><b>Links</b></p>
<p class="p4">Users:</p>
<p class="p5">
<span class="s3">
General information
<a href="https://www.blender.org/">
<span class="s4">www.blender.org</span>
</a><br>
Release Notes
<a href="https://wiki.blender.org/wiki/Reference/Release_Notes/@BLENDER_VERSION@">
<span class="s4">wiki.blender.org/wiki/Reference/Release_Notes/@BLENDER_VERSION@</span>
</a><br>
Tutorials
<a href="https://www.blender.org/support/tutorials/">
<span class="s4">www.blender.org/support/tutorials/</span>
</a><br>
Manual
<a href="https://docs.blender.org/manual/en/latest/">
<span class="s4">https://docs.blender.org/manual/en/latest/</span>
</a><br>
User Forum <a href="https://www.blenderartists.org/">
<span class="s4">www.blenderartists.org</span>
</a><br>
Chat
<a href="https://blender.chat/channel/today">
<span class="s4">#today</span>
</a> or
<a href="https://blender.chat/channel/support">
<span class="s4">#support</span>
</a> on blender.chat
</span>
</p>
<p class="p4">Developers:</p>
<p class="p5">
<span class="s3">
Development
<a href="https://www.blender.org/get-involved/developers/">
<span class="s4">www.blender.org/get-involved/developers/</span>
</a><br>
GIT and Bug Tracker
<a href="https://projects.blender.org/">
<span class="s4">projects.blender.org</span>
</a><br>
Chat
<a href="https://blender.chat/channel/blender-coders">
<span class="s4">#blender-coders</span>
</a> on blender.chat
</span>
</p>
<p class="p2"><br></p>
<p class="p2"><br></p>
<p class="p6">Blender is open-source and free for all to use.</p>
<p class="p2"><br></p>
<p class="p6">Enjoy.</p>
<p class="p2"><br></p>
</body>
</html>

View File

@ -87,13 +87,21 @@ class Context(StructRNA):
new_context = {}
generic_attrs = (
*StructRNA.__dict__.keys(),
"bl_rna", "rna_type", "copy",
"bl_rna",
"rna_type",
"copy",
)
function_types = {BuiltinMethodType, bpy_types.bpy_func}
for attr in dir(self):
if not (attr.startswith("_") or attr in generic_attrs):
value = getattr(self, attr)
if type(value) != BuiltinMethodType:
new_context[attr] = value
if attr.startswith("_"):
continue
if attr in generic_attrs:
continue
value = getattr(self, attr)
if type(value) in function_types:
continue
new_context[attr] = value
return new_context
@ -1251,6 +1259,10 @@ class AssetShelf(StructRNA, metaclass=RNAMeta):
__slots__ = ()
class FileHandler(StructRNA, metaclass=RNAMeta):
__slots__ = ()
class NodeTree(bpy_types.ID, metaclass=RNAMetaPropGroup):
__slots__ = ()

View File

@ -565,18 +565,18 @@ def _template_items_tool_select(
cursor_prioritize=False,
fallback=False,
):
if not params.legacy and not fallback:
select_passthrough = False
if not params.legacy:
# Experimental support for LMB interaction for the tweak tool. see: #96544.
# NOTE: For RMB-select this is a much bigger change as it disables 3D cursor placement on LMB.
# For LMB-select this means an LMB -drag will not first de-select all (similar to node/graph editor).
select_passthrough = False
if params.select_mouse == 'LEFTMOUSE':
select_passthrough = params.use_tweak_select_passthrough
else:
if not cursor_prioritize:
select_passthrough = True
if select_passthrough:
if not fallback and select_passthrough:
return [
(operator, {"type": 'LEFTMOUSE', "value": 'PRESS'},
{"properties": [("deselect_all", True), ("select_passthrough", True)]}),
@ -592,7 +592,11 @@ def _template_items_tool_select(
# unless it is expected that the tool should operate on the selection (click-drag to rip for e.g.).
return [
(operator, {"type": 'LEFTMOUSE', "value": 'PRESS'},
{"properties": [("deselect_all", True)]}),
{"properties": [
("deselect_all", True),
# Without this, fallback tool doesn't support pass-through, see: #115887.
*((("select_passthrough", True),) if select_passthrough else ()),
]}),
(operator, {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
{"properties": [("toggle", True)]}),

View File

@ -4514,7 +4514,7 @@ def generate_keymaps_impl(params=None):
km_animation_channels(params),
# Modes.
km_grease_pencil(params),
# km_grease_pencil(params), # Empty.
km_grease_pencil_stroke_edit_mode(params),
km_grease_pencil_stroke_paint_mode(params),
km_grease_pencil_stroke_paint_draw_brush(params),

View File

@ -32,7 +32,7 @@ def extend(obj, EXTEND_MODE, use_uv_selection):
return STATUS_ERR_NOT_SELECTED # Active face is not selected.
if len(f_act.verts) != 4:
return STATUS_ERR_NOT_QUAD # Active face is not a quad
if not me.uv_layers:
if not bm.loops.layers.uv:
return STATUS_ERR_MISSING_UV_LAYER # Object's mesh doesn't have any UV layers.
uv_act = bm.loops.layers.uv.active # Always use the active UV layer.
@ -240,6 +240,10 @@ def main(context, operator):
operator.report({'ERROR'}, "Active face must be a quad")
elif status & STATUS_ERR_NOT_SELECTED:
operator.report({'ERROR'}, "Active face not selected")
elif status & STATUS_ERR_NO_FACES_SELECTED:
operator.report({'ERROR'}, "No selected faces")
elif status & STATUS_ERR_MISSING_UV_LAYER:
operator.report({'ERROR'}, "No UV layers")
else:
assert status & STATUS_ERR_ACTIVE_FACE != 0
operator.report({'ERROR'}, "No active face")

View File

@ -71,7 +71,6 @@ class NODE_MT_category_compositor_output(Menu):
layout = self.layout
node_add_menu.add_node_type(layout, "CompositorNodeComposite")
node_add_menu.add_node_type(layout, "CompositorNodeSplitViewer")
node_add_menu.add_node_type(layout, "CompositorNodeViewer")
layout.separator()
node_add_menu.add_node_type(layout, "CompositorNodeOutputFile")
@ -279,6 +278,7 @@ class NODE_MT_category_compositor_utilities(Menu):
node_add_menu.add_node_type(layout, "CompositorNodeLevels")
node_add_menu.add_node_type(layout, "CompositorNodeNormalize")
layout.separator()
node_add_menu.add_node_type(layout, "CompositorNodeSplit")
node_add_menu.add_node_type(layout, "CompositorNodeSwitch")
node_add_menu.add_node_type(
layout, "CompositorNodeSwitchView",

View File

@ -281,12 +281,13 @@ class GREASE_PENCIL_MT_layer_active(Menu):
layout = self.layout
layout.operator_context = 'INVOKE_REGION_WIN'
obd = context.active_object.data
if not obd.layers:
return
nlop = layout.operator("grease_pencil.layer_add", text="New Layer", icon='ADD')
nlop.new_layer_name = "Layer"
if not obd.layers:
return
layout.separator()
for i in range(len(obd.layers) - 1, -1, -1):

Some files were not shown because too many files have changed in this diff Show More