Merge branch 'main' into geometry-nodes-simulation

This commit is contained in:
2023-03-20 16:15:08 +01:00
575 changed files with 16675 additions and 8071 deletions

View File

@@ -1555,6 +1555,9 @@ elseif(CMAKE_C_COMPILER_ID MATCHES "Clang")
# add_check_c_compiler_flag(C_WARNINGS C_WARN_UNUSED_MACROS -Wunused-macros)
# add_check_cxx_compiler_flag(CXX_WARNINGS CXX_WARN_UNUSED_MACROS -Wunused-macros)
add_check_c_compiler_flag(C_WARNINGS C_WARN_ERROR_UNGUARDED_AVAILABILITY_NEW -Werror=unguarded-availability-new)
add_check_c_compiler_flag(CXX_WARNINGS CXX_WARN_ERROR_UNGUARDED_AVAILABILITY_NEW -Werror=unguarded-availability-new)
# ---------------------
# Suppress Strict Flags

View File

@@ -322,6 +322,11 @@ def external_script_initialize_if_needed(args: argparse.Namespace,
blender_url = make_utils.git_get_remote_url(args.git_command, origin_name)
external_url = resolve_external_url(blender_url, repo_name)
# When running `make update` from a freshly cloned fork check whether the fork of the submodule is
# available, If not, switch to the submodule relative to the main blender repository.
if origin_name == "origin" and not make_utils.git_is_remote_repository(args.git_command, external_url):
external_url = resolve_external_url("https://projects.blender.org/blender/blender", repo_name)
call((args.git_command, "clone", "--origin", origin_name, external_url, str(external_dir)))

View File

@@ -1,20 +0,0 @@
if NOT exist "%BLENDER_DIR%\source\tools\.git" (
echo Checking out sub-modules
if not "%GIT%" == "" (
"%GIT%" submodule update --init --recursive --progress
if errorlevel 1 goto FAIL
"%GIT%" submodule foreach git checkout main
if errorlevel 1 goto FAIL
"%GIT%" submodule foreach git pull --rebase origin main
if errorlevel 1 goto FAIL
goto EOF
) else (
echo Blender submodules not found, and git not found in path to retrieve them.
goto FAIL
)
)
goto EOF
:FAIL
exit /b 1
:EOF

View File

@@ -14,7 +14,7 @@ if NOT EXIST %PYTHON% (
exit /b 1
)
set FORMAT_PATHS=%BLENDER_DIR%\source\tools\utils_maintenance\clang_format_paths.py
set FORMAT_PATHS=%BLENDER_DIR%\tools\utils_maintenance\clang_format_paths.py
REM The formatting script expects clang-format to be in the current PATH.
set PATH=%CF_PATH%;%PATH%

View File

@@ -41,7 +41,7 @@ static const char *FRAGMENT_SHADER =
"void main()\n"
"{\n"
" vec4 rgba = texture(image_texture, texCoord_interp);\n"
/* Harcoded Rec.709 gamma, should use OpenColorIO eventually. */
/* Hard-coded Rec.709 gamma, should use OpenColorIO eventually. */
" fragColor = pow(rgba, vec4(0.45, 0.45, 0.45, 1.0));\n"
"}\n\0";

View File

@@ -818,6 +818,23 @@ static void attr_create_pointiness(Scene *scene, Mesh *mesh, BL::Mesh &b_mesh, b
}
}
static std::optional<BL::IntAttribute> find_corner_vert_attribute(BL::Mesh b_mesh)
{
for (BL::Attribute &b_attribute : b_mesh.attributes) {
if (b_attribute.domain() != BL::Attribute::domain_CORNER) {
continue;
}
if (b_attribute.data_type() != BL::Attribute::data_type_INT) {
continue;
}
if (b_attribute.name() != ".corner_vert") {
continue;
}
return BL::IntAttribute{b_attribute};
}
return std::nullopt;
}
/* The Random Per Island attribute is a random float associated with each
* connected component (island) of the mesh. The attribute is computed by
* first classifying the vertices into different sets using a Disjoint Set
@@ -864,11 +881,11 @@ static void attr_create_random_per_island(Scene *scene,
else {
if (polys_num != 0) {
const MPoly *polys = static_cast<const MPoly *>(b_mesh.polygons[0].ptr.data);
const MLoop *loops = static_cast<const MLoop *>(b_mesh.loops[0].ptr.data);
BL::IntAttribute corner_verts = *find_corner_vert_attribute(b_mesh);
for (int i = 0; i < polys_num; i++) {
const MPoly &b_poly = polys[i];
const MLoop &b_loop = loops[b_poly.loopstart];
data[i] = hash_uint_to_float(vertices_sets.find(b_loop.v));
const int vert = corner_verts.data[b_poly.loopstart].value();
data[i] = hash_uint_to_float(vertices_sets.find(vert));
}
}
}
@@ -1036,7 +1053,7 @@ static void create_mesh(Scene *scene,
vector<int> vi;
const MPoly *polys = static_cast<const MPoly *>(b_mesh.polygons[0].ptr.data);
const MLoop *loops = static_cast<const MLoop *>(b_mesh.loops[0].ptr.data);
std::optional<BL::IntAttribute> corner_verts = find_corner_vert_attribute(b_mesh);
for (int i = 0; i < numfaces; i++) {
const MPoly &b_poly = polys[i];
@@ -1047,8 +1064,7 @@ static void create_mesh(Scene *scene,
vi.resize(n);
for (int i = 0; i < n; i++) {
/* NOTE: Autosmooth is already taken care about. */
vi[i] = loops[b_poly.loopstart + i].v;
vi[i] = corner_verts->data[b_poly.loopstart + i].value();
}
/* create subd faces */

View File

@@ -536,12 +536,11 @@ void CUDADevice::free_host(void *shared_pointer)
cuMemFreeHost(shared_pointer);
}
bool CUDADevice::transform_host_pointer(void *&device_pointer, void *&shared_pointer)
void CUDADevice::transform_host_pointer(void *&device_pointer, void *&shared_pointer)
{
CUDAContextScope scope(this);
cuda_assert(cuMemHostGetDevicePointer_v2((CUdeviceptr *)&device_pointer, shared_pointer, 0));
return true;
}
void CUDADevice::copy_host_to_device(void *device_pointer, void *host_pointer, size_t size)

View File

@@ -68,7 +68,7 @@ class CUDADevice : public GPUDevice {
virtual void free_device(void *device_pointer) override;
virtual bool alloc_host(void *&shared_pointer, size_t size) override;
virtual void free_host(void *shared_pointer) override;
virtual bool transform_host_pointer(void *&device_pointer, void *&shared_pointer) override;
virtual void transform_host_pointer(void *&device_pointer, void *&shared_pointer) override;
virtual void copy_host_to_device(void *device_pointer, void *host_pointer, size_t size) override;
void mem_alloc(device_memory &mem) override;

View File

@@ -648,7 +648,7 @@ GPUDevice::Mem *GPUDevice::generic_alloc(device_memory &mem, size_t pitch_paddin
}
if (mem_alloc_result) {
assert(transform_host_pointer(device_pointer, shared_pointer));
transform_host_pointer(device_pointer, shared_pointer);
map_host_used += size;
status = " in host memory";
}

View File

@@ -391,7 +391,7 @@ class GPUDevice : public Device {
/* This function should return device pointer corresponding to shared pointer, which
* is host buffer, allocated in `alloc_host`. The function should `true`, if such
* address transformation is possible and `false` otherwise. */
virtual bool transform_host_pointer(void *&device_pointer, void *&shared_pointer) = 0;
virtual void transform_host_pointer(void *&device_pointer, void *&shared_pointer) = 0;
virtual void copy_host_to_device(void *device_pointer, void *host_pointer, size_t size) = 0;
};

View File

@@ -499,12 +499,11 @@ void HIPDevice::free_host(void *shared_pointer)
hipHostFree(shared_pointer);
}
bool HIPDevice::transform_host_pointer(void *&device_pointer, void *&shared_pointer)
void HIPDevice::transform_host_pointer(void *&device_pointer, void *&shared_pointer)
{
HIPContextScope scope(this);
hip_assert(hipHostGetDevicePointer((hipDeviceptr_t *)&device_pointer, shared_pointer, 0));
return true;
}
void HIPDevice::copy_host_to_device(void *device_pointer, void *host_pointer, size_t size)

View File

@@ -61,7 +61,7 @@ class HIPDevice : public GPUDevice {
virtual void free_device(void *device_pointer) override;
virtual bool alloc_host(void *&shared_pointer, size_t size) override;
virtual void free_host(void *shared_pointer) override;
virtual bool transform_host_pointer(void *&device_pointer, void *&shared_pointer) override;
virtual void transform_host_pointer(void *&device_pointer, void *&shared_pointer) override;
virtual void copy_host_to_device(void *device_pointer, void *host_pointer, size_t size) override;
void mem_alloc(device_memory &mem) override;

View File

@@ -128,9 +128,8 @@ void RenderScheduler::reset(const BufferParams &buffer_params, int num_samples,
state_.resolution_divider = 1;
}
else {
/* NOTE: Divide by 2 because of the way how scheduling works: it advances resolution divider
* first and then initialized render work. */
state_.resolution_divider = start_resolution_divider_ * 2;
state_.user_is_navigating = true;
state_.resolution_divider = start_resolution_divider_;
}
state_.num_rendered_samples = 0;
@@ -312,7 +311,21 @@ RenderWork RenderScheduler::get_render_work()
RenderWork render_work;
if (state_.resolution_divider != pixel_size_) {
state_.resolution_divider = max(state_.resolution_divider / 2, pixel_size_);
if (state_.user_is_navigating) {
/* Don't progress the resolution divider as the user is currently navigating in the scene. */
state_.user_is_navigating = false;
}
else {
/* If the resolution divider is greater than or equal to default_start_resolution_divider_,
* drop the resolution divider down to 4. This is so users with slow hardware and thus high
* resolution dividers (E.G. 16), get an update to let them know something is happening
* rather than having to wait for the full 1:1 render to show up. */
state_.resolution_divider = state_.resolution_divider > default_start_resolution_divider_ ?
(4 * pixel_size_) :
1;
}
state_.resolution_divider = max(state_.resolution_divider, pixel_size_);
state_.num_rendered_samples = 0;
state_.last_display_update_sample = -1;
}
@@ -1058,10 +1071,16 @@ void RenderScheduler::update_start_resolution_divider()
return;
}
/* Calculate the maximum resolution divider possible while keeping the long axis of the viewport
* above our preferred minimum axis size (128). */
const int long_viewport_axis = max(buffer_params_.width, buffer_params_.height);
const int max_res_divider_for_desired_size = long_viewport_axis / 128;
if (start_resolution_divider_ == 0) {
/* Resolution divider has never been calculated before: use default resolution, so that we have
* somewhat good initial behavior, giving a chance to collect real numbers. */
start_resolution_divider_ = default_start_resolution_divider_;
/* Resolution divider has never been calculated before: start with a high resolution divider so
* that we have a somewhat good initial behavior, giving a chance to collect real numbers. */
start_resolution_divider_ = min(default_start_resolution_divider_,
max_res_divider_for_desired_size);
VLOG_WORK << "Initial resolution divider is " << start_resolution_divider_;
return;
}
@@ -1089,8 +1108,7 @@ void RenderScheduler::update_start_resolution_divider()
/* Don't let resolution drop below the desired one. It's better to be slow than provide an
* unreadable viewport render. */
start_resolution_divider_ = min(resolution_divider_for_update,
default_start_resolution_divider_);
start_resolution_divider_ = min(resolution_divider_for_update, max_res_divider_for_desired_size);
VLOG_WORK << "Calculated resolution divider is " << start_resolution_divider_;
}

View File

@@ -332,6 +332,8 @@ class RenderScheduler {
};
struct {
bool user_is_navigating = false;
int resolution_divider = 1;
/* Number of rendered samples on top of the start sample. */

View File

@@ -741,21 +741,21 @@ if(WITH_CYCLES_DEVICE_ONEAPI)
endif()
# SYCL_CPP_FLAGS is a variable that the user can set to pass extra compiler options
set(sycl_compiler_flags
${CMAKE_CURRENT_SOURCE_DIR}/${SRC_KERNEL_DEVICE_ONEAPI}
-fsycl
-fsycl-unnamed-lambda
-fdelayed-template-parsing
-mllvm -inlinedefault-threshold=250
-mllvm -inlinehint-threshold=350
-fsycl-device-code-split=per_kernel
-fsycl-max-parallel-link-jobs=${SYCL_OFFLINE_COMPILER_PARALLEL_JOBS}
-shared
-DWITH_ONEAPI
-ffast-math
-O2
-o"${cycles_kernel_oneapi_lib}"
-I"${CMAKE_CURRENT_SOURCE_DIR}/.."
${SYCL_CPP_FLAGS}
${CMAKE_CURRENT_SOURCE_DIR}/${SRC_KERNEL_DEVICE_ONEAPI}
-fsycl
-fsycl-unnamed-lambda
-fdelayed-template-parsing
-mllvm -inlinedefault-threshold=250
-mllvm -inlinehint-threshold=350
-fsycl-device-code-split=per_kernel
-fsycl-max-parallel-link-jobs=${SYCL_OFFLINE_COMPILER_PARALLEL_JOBS}
-shared
-DWITH_ONEAPI
-ffast-math
-O2
-o"${cycles_kernel_oneapi_lib}"
-I"${CMAKE_CURRENT_SOURCE_DIR}/.."
${SYCL_CPP_FLAGS}
)
if(WITH_CYCLES_ONEAPI_HOST_TASK_EXECUTION)

View File

@@ -105,12 +105,18 @@ ccl_device_forceinline Spectrum interpolate_fresnel_color(float3 L,
return mix(F0, one_spectrum(), inverse_lerp(real_F0, 1.0f, real_F));
}
ccl_device float3 ensure_valid_reflection(float3 Ng, float3 I, float3 N)
/* If the shading normal results in specular reflection in the lower hemisphere, raise the shading
* normal towards the geometry normal so that the specular reflection is just above the surface.
* Only used for glossy materials. */
ccl_device float3 ensure_valid_specular_reflection(float3 Ng, float3 I, float3 N)
{
float3 R = 2 * dot(N, I) * N - I;
const float3 R = 2 * dot(N, I) * N - I;
const float Iz = dot(I, Ng);
kernel_assert(Iz > 0);
/* Reflection rays may always be at least as shallow as the incoming ray. */
float threshold = min(0.9f * dot(Ng, I), 0.01f);
const float threshold = min(0.9f * Iz, 0.01f);
if (dot(Ng, R) >= threshold) {
return N;
}
@@ -119,11 +125,8 @@ ccl_device float3 ensure_valid_reflection(float3 Ng, float3 I, float3 N)
* The X axis is found by normalizing the component of N that's orthogonal to Ng.
* The Y axis isn't actually needed.
*/
float NdotNg = dot(N, Ng);
float3 X = normalize(N - NdotNg * Ng);
const float3 X = normalize(N - dot(N, Ng) * Ng);
/* Keep math expressions. */
/* clang-format off */
/* Calculate N.z and N.x in the local coordinate system.
*
* The goal of this computation is to find a N' that is rotated towards Ng just enough
@@ -141,74 +144,53 @@ ccl_device float3 ensure_valid_reflection(float3 Ng, float3 I, float3 N)
*
* Furthermore, we want N' to be normalized, so N'.x = sqrt(1 - N'.z^2).
*
* With these simplifications,
* we get the final equation 2*(sqrt(1 - N'.z^2)*I.x + N'.z*I.z)*N'.z - I.z = t.
* With these simplifications, we get the equation
* 2*(sqrt(1 - N'.z^2)*I.x + N'.z*I.z)*N'.z - I.z = t,
* or
* 2*sqrt(1 - N'.z^2)*I.x*N'.z = t + I.z * (1 - 2*N'.z^2),
* after rearranging terms.
* Raise both sides to the power of two and substitute terms with
* a = I.x^2 + I.z^2,
* b = 2*(a + Iz*t),
* c = (Iz + t)^2,
* we obtain
* 4*a*N'.z^4 - 2*b*N'.z^2 + c = 0.
*
* The only unknown here is N'.z, so we can solve for that.
*
* The equation has four solutions in general:
*
* N'.z = +-sqrt(0.5*(+-sqrt(I.x^2*(I.x^2 + I.z^2 - t^2)) + t*I.z + I.x^2 + I.z^2)/(I.x^2 + I.z^2))
* We can simplify this expression a bit by grouping terms:
*
* a = I.x^2 + I.z^2
* b = sqrt(I.x^2 * (a - t^2))
* c = I.z*t + a
* N'.z = +-sqrt(0.5*(+-b + c)/a)
*
* Two solutions can immediately be discarded because they're negative so N' would lie in the
* lower hemisphere.
* The equation has four solutions in general, two can immediately be discarded because they're
* negative so N' would lie in the lower hemisphere; one solves
* 2*sqrt(1 - N'.z^2)*I.x*N'.z = -(t + I.z * (1 - 2*N'.z^2))
* instead of the original equation (before squaring both sides).
* Therefore only one root is valid.
*/
/* clang-format on */
float Ix = dot(I, X), Iz = dot(I, Ng);
float Ix2 = sqr(Ix), Iz2 = sqr(Iz);
float a = Ix2 + Iz2;
const float Ix = dot(I, X);
float b = safe_sqrtf(Ix2 * (a - sqr(threshold)));
float c = Iz * threshold + a;
const float a = sqr(Ix) + sqr(Iz);
const float b = 2.0f * (a + Iz * threshold);
const float c = sqr(threshold + Iz);
/* Evaluate both solutions.
* In many cases one can be immediately discarded (if N'.z would be imaginary or larger than
* one), so check for that first. If no option is viable (might happen in extreme cases like N
* being in the wrong hemisphere), give up and return Ng. */
float fac = 0.5f / a;
float N1_z2 = fac * (b + c), N2_z2 = fac * (-b + c);
bool valid1 = (N1_z2 > 1e-5f) && (N1_z2 <= (1.0f + 1e-5f));
bool valid2 = (N2_z2 > 1e-5f) && (N2_z2 <= (1.0f + 1e-5f));
/* In order that the root formula solves 2*sqrt(1 - N'.z^2)*I.x*N'.z = t + I.z - 2*I.z*N'.z^2,
* Ix and (t + I.z * (1 - 2*N'.z^2)) must have the same sign (the rest terms are non-negative by
* definition). */
const float Nz2 = (Ix < 0) ? 0.25f * (b + safe_sqrtf(sqr(b) - 4.0f * a * c)) / a :
0.25f * (b - safe_sqrtf(sqr(b) - 4.0f * a * c)) / a;
float2 N_new;
if (valid1 && valid2) {
/* If both are possible, do the expensive reflection-based check. */
float2 N1 = make_float2(safe_sqrtf(1.0f - N1_z2), safe_sqrtf(N1_z2));
float2 N2 = make_float2(safe_sqrtf(1.0f - N2_z2), safe_sqrtf(N2_z2));
const float Nx = safe_sqrtf(1.0f - Nz2);
const float Nz = safe_sqrtf(Nz2);
float R1 = 2 * (N1.x * Ix + N1.y * Iz) * N1.y - Iz;
float R2 = 2 * (N2.x * Ix + N2.y * Iz) * N2.y - Iz;
return Nx * X + Nz * Ng;
}
valid1 = (R1 >= 1e-5f);
valid2 = (R2 >= 1e-5f);
if (valid1 && valid2) {
/* If both solutions are valid, return the one with the shallower reflection since it will be
* closer to the input (if the original reflection wasn't shallow, we would not be in this
* part of the function). */
N_new = (R1 < R2) ? N1 : N2;
}
else {
/* If only one reflection is valid (= positive), pick that one. */
N_new = (R1 > R2) ? N1 : N2;
}
/* Do not call #ensure_valid_specular_reflection if the primitive type is curve or if the geometry
* normal and the shading normal is the same. */
ccl_device float3 maybe_ensure_valid_specular_reflection(ccl_private ShaderData *sd, float3 N)
{
if ((sd->type & PRIMITIVE_CURVE) || isequal(sd->Ng, N)) {
return N;
}
else if (valid1 || valid2) {
/* Only one solution passes the N'.z criterium, so pick that one. */
float Nz2 = valid1 ? N1_z2 : N2_z2;
N_new = make_float2(safe_sqrtf(1.0f - Nz2), safe_sqrtf(Nz2));
}
else {
return Ng;
}
return N_new.x * X + N_new.y * Ng;
return ensure_valid_specular_reflection(sd->Ng, sd->wi, N);
}
CCL_NAMESPACE_END

View File

@@ -78,7 +78,7 @@ ccl_device void osl_closure_diffuse_setup(KernelGlobals kg,
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = closure->N;
sd->flag |= bsdf_diffuse_setup(bsdf);
}
@@ -99,7 +99,7 @@ ccl_device void osl_closure_oren_nayar_setup(KernelGlobals kg,
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = closure->N;
bsdf->roughness = closure->roughness;
sd->flag |= bsdf_oren_nayar_setup(bsdf);
@@ -121,7 +121,7 @@ ccl_device void osl_closure_translucent_setup(KernelGlobals kg,
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = closure->N;
sd->flag |= bsdf_translucent_setup(bsdf);
}
@@ -142,7 +142,7 @@ ccl_device void osl_closure_reflection_setup(KernelGlobals kg,
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
sd->flag |= bsdf_reflection_setup(bsdf);
}
@@ -163,7 +163,7 @@ ccl_device void osl_closure_refraction_setup(KernelGlobals kg,
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->ior = closure->ior;
sd->flag |= bsdf_refraction_setup(bsdf);
@@ -204,7 +204,7 @@ ccl_device void osl_closure_dielectric_bsdf_setup(KernelGlobals kg,
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->alpha_x = closure->alpha_x;
bsdf->alpha_y = closure->alpha_y;
bsdf->ior = closure->ior;
@@ -266,7 +266,7 @@ ccl_device void osl_closure_conductor_bsdf_setup(KernelGlobals kg,
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->alpha_x = closure->alpha_x;
bsdf->alpha_y = closure->alpha_y;
bsdf->ior = 0.0f;
@@ -313,7 +313,7 @@ ccl_device void osl_closure_generalized_schlick_bsdf_setup(
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->alpha_x = closure->alpha_x;
bsdf->alpha_y = closure->alpha_y;
bsdf->ior = ior_from_F0(closure->f0);
@@ -375,7 +375,7 @@ ccl_device void osl_closure_microfacet_setup(KernelGlobals kg,
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->alpha_x = closure->alpha_x;
bsdf->alpha_y = closure->alpha_y;
bsdf->ior = closure->ior;
@@ -440,7 +440,7 @@ ccl_device void osl_closure_microfacet_ggx_setup(
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->alpha_x = bsdf->alpha_y = closure->alpha_x;
sd->flag |= bsdf_microfacet_ggx_setup(bsdf);
@@ -463,7 +463,7 @@ ccl_device void osl_closure_microfacet_ggx_aniso_setup(
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->alpha_x = closure->alpha_x;
bsdf->alpha_y = closure->alpha_y;
bsdf->T = closure->T;
@@ -488,7 +488,7 @@ ccl_device void osl_closure_microfacet_ggx_refraction_setup(
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->alpha_x = closure->alpha_x;
bsdf->ior = closure->ior;
@@ -520,7 +520,7 @@ ccl_device void osl_closure_microfacet_ggx_fresnel_setup(
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->alpha_x = closure->alpha_x;
bsdf->alpha_y = bsdf->alpha_x;
bsdf->ior = closure->ior;
@@ -556,7 +556,7 @@ ccl_device void osl_closure_microfacet_ggx_aniso_fresnel_setup(
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->alpha_x = closure->alpha_x;
bsdf->alpha_y = closure->alpha_y;
bsdf->ior = closure->ior;
@@ -597,7 +597,7 @@ ccl_device void osl_closure_microfacet_multi_ggx_setup(
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->alpha_x = closure->alpha_x;
bsdf->alpha_y = bsdf->alpha_x;
bsdf->ior = 1.0f;
@@ -636,7 +636,7 @@ ccl_device void osl_closure_microfacet_multi_ggx_glass_setup(
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->alpha_x = closure->alpha_x;
bsdf->alpha_y = bsdf->alpha_x;
bsdf->ior = closure->ior;
@@ -675,7 +675,7 @@ ccl_device void osl_closure_microfacet_multi_ggx_aniso_setup(
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->alpha_x = closure->alpha_x;
bsdf->alpha_y = closure->alpha_y;
bsdf->ior = 1.0f;
@@ -716,7 +716,7 @@ ccl_device void osl_closure_microfacet_multi_ggx_fresnel_setup(
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->alpha_x = closure->alpha_x;
bsdf->alpha_y = bsdf->alpha_x;
bsdf->ior = closure->ior;
@@ -756,7 +756,7 @@ ccl_device void osl_closure_microfacet_multi_ggx_glass_fresnel_setup(
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->alpha_x = closure->alpha_x;
bsdf->alpha_y = bsdf->alpha_x;
bsdf->ior = closure->ior;
@@ -796,7 +796,7 @@ ccl_device void osl_closure_microfacet_multi_ggx_aniso_fresnel_setup(
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->alpha_x = closure->alpha_x;
bsdf->alpha_y = closure->alpha_y;
bsdf->ior = closure->ior;
@@ -829,7 +829,7 @@ ccl_device void osl_closure_microfacet_beckmann_setup(
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->alpha_x = bsdf->alpha_y = closure->alpha_x;
sd->flag |= bsdf_microfacet_beckmann_setup(bsdf);
@@ -852,7 +852,7 @@ ccl_device void osl_closure_microfacet_beckmann_aniso_setup(
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->alpha_x = closure->alpha_x;
bsdf->alpha_y = closure->alpha_y;
bsdf->T = closure->T;
@@ -877,7 +877,7 @@ ccl_device void osl_closure_microfacet_beckmann_refraction_setup(
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->alpha_x = closure->alpha_x;
bsdf->ior = closure->ior;
@@ -903,7 +903,7 @@ ccl_device void osl_closure_ashikhmin_velvet_setup(
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->sigma = closure->sigma;
sd->flag |= bsdf_ashikhmin_velvet_setup(bsdf);
@@ -926,7 +926,7 @@ ccl_device void osl_closure_ashikhmin_shirley_setup(
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->alpha_x = closure->alpha_x;
bsdf->alpha_y = closure->alpha_y;
bsdf->T = closure->T;
@@ -950,7 +950,7 @@ ccl_device void osl_closure_diffuse_toon_setup(KernelGlobals kg,
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->size = closure->size;
bsdf->smooth = closure->smooth;
@@ -973,7 +973,7 @@ ccl_device void osl_closure_glossy_toon_setup(KernelGlobals kg,
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->size = closure->size;
bsdf->smooth = closure->smooth;
@@ -999,7 +999,7 @@ ccl_device void osl_closure_principled_diffuse_setup(
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = closure->N;
bsdf->roughness = closure->roughness;
sd->flag |= bsdf_principled_diffuse_setup(bsdf);
@@ -1022,7 +1022,7 @@ ccl_device void osl_closure_principled_sheen_setup(
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = closure->N;
bsdf->avg_value = 0.0f;
sd->flag |= bsdf_principled_sheen_setup(sd, bsdf);
@@ -1042,7 +1042,7 @@ ccl_device void osl_closure_principled_clearcoat_setup(
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->alpha_x = closure->clearcoat_roughness;
bsdf->alpha_y = closure->clearcoat_roughness;
bsdf->ior = 1.5f;
@@ -1109,7 +1109,7 @@ ccl_device void osl_closure_diffuse_ramp_setup(KernelGlobals kg,
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = closure->N;
bsdf->colors = (float3 *)closure_alloc_extra(sd, sizeof(float3) * 8);
if (!bsdf->colors) {
@@ -1134,7 +1134,7 @@ ccl_device void osl_closure_phong_ramp_setup(KernelGlobals kg,
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->exponent = closure->exponent;
bsdf->colors = (float3 *)closure_alloc_extra(sd, sizeof(float3) * 8);
@@ -1185,7 +1185,7 @@ ccl_device void osl_closure_bssrdf_setup(KernelGlobals kg,
/* create one closure per color channel */
bssrdf->albedo = closure->albedo;
bssrdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bssrdf->N = closure->N;
bssrdf->roughness = closure->roughness;
bssrdf->anisotropy = clamp(closure->anisotropy, 0.0f, 0.9f);
@@ -1210,7 +1210,7 @@ ccl_device void osl_closure_hair_reflection_setup(KernelGlobals kg,
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->T = closure->T;
bsdf->roughness1 = closure->roughness1;
bsdf->roughness2 = closure->roughness2;
@@ -1236,7 +1236,7 @@ ccl_device void osl_closure_hair_transmission_setup(
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->T = closure->T;
bsdf->roughness1 = closure->roughness1;
bsdf->roughness2 = closure->roughness2;
@@ -1268,7 +1268,7 @@ ccl_device void osl_closure_principled_hair_setup(KernelGlobals kg,
return;
}
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
bsdf->N = ensure_valid_specular_reflection(sd->Ng, sd->wi, closure->N);
bsdf->sigma = closure->sigma;
bsdf->v = closure->v;
bsdf->s = closure->s;

View File

@@ -50,6 +50,4 @@ surface node_bump(int invert = 0,
if (use_object_space) {
NormalOut = normalize(transform("object", "world", NormalOut));
}
NormalOut = ensure_valid_reflection(Ng, I, NormalOut);
}

View File

@@ -65,67 +65,4 @@ closure color principled_hair(normal N,
closure color henyey_greenstein(float g) BUILTIN;
closure color absorption() BUILTIN;
normal ensure_valid_reflection(normal Ng, vector I, normal N)
{
/* The implementation here mirrors the one in kernel_montecarlo.h,
* check there for an explanation of the algorithm. */
float sqr(float x)
{
return x * x;
}
vector R = 2 * dot(N, I) * N - I;
float threshold = min(0.9 * dot(Ng, I), 0.01);
if (dot(Ng, R) >= threshold) {
return N;
}
float NdotNg = dot(N, Ng);
vector X = normalize(N - NdotNg * Ng);
float Ix = dot(I, X), Iz = dot(I, Ng);
float Ix2 = sqr(Ix), Iz2 = sqr(Iz);
float a = Ix2 + Iz2;
float b = sqrt(Ix2 * (a - sqr(threshold)));
float c = Iz * threshold + a;
float fac = 0.5 / a;
float N1_z2 = fac * (b + c), N2_z2 = fac * (-b + c);
int valid1 = (N1_z2 > 1e-5) && (N1_z2 <= (1.0 + 1e-5));
int valid2 = (N2_z2 > 1e-5) && (N2_z2 <= (1.0 + 1e-5));
float N_new_x, N_new_z;
if (valid1 && valid2) {
float N1_x = sqrt(1.0 - N1_z2), N1_z = sqrt(N1_z2);
float N2_x = sqrt(1.0 - N2_z2), N2_z = sqrt(N2_z2);
float R1 = 2 * (N1_x * Ix + N1_z * Iz) * N1_z - Iz;
float R2 = 2 * (N2_x * Ix + N2_z * Iz) * N2_z - Iz;
valid1 = (R1 >= 1e-5);
valid2 = (R2 >= 1e-5);
if (valid1 && valid2) {
N_new_x = (R1 < R2) ? N1_x : N2_x;
N_new_z = (R1 < R2) ? N1_z : N2_z;
}
else {
N_new_x = (R1 > R2) ? N1_x : N2_x;
N_new_z = (R1 > R2) ? N1_z : N2_z;
}
}
else if (valid1 || valid2) {
float Nz2 = valid1 ? N1_z2 : N2_z2;
N_new_x = sqrt(1.0 - Nz2);
N_new_z = sqrt(Nz2);
}
else {
return Ng;
}
return N_new_x * X + N_new_z * Ng;
}
#endif /* CCL_STDOSL_H */

View File

@@ -59,9 +59,6 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
float3 N = stack_valid(data_node.x) ? safe_normalize(stack_load_float3(stack, data_node.x)) :
sd->N;
if (!(sd->type & PRIMITIVE_CURVE)) {
N = ensure_valid_reflection(sd->Ng, sd->wi, N);
}
float param1 = (stack_valid(param1_offset)) ? stack_load_float(stack, param1_offset) :
__uint_as_float(node.z);
@@ -119,8 +116,9 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
/* calculate ior */
float ior = (sd->flag & SD_BACKFACING) ? 1.0f / eta : eta;
// calculate fresnel for refraction
float cosNI = dot(N, sd->wi);
/* Calculate fresnel for refraction. */
float3 valid_reflection_N = maybe_ensure_valid_specular_reflection(sd, N);
float cosNI = dot(valid_reflection_N, sd->wi);
float fresnel = fresnel_dielectric_cos(cosNI, ior);
// calculate weights of the diffuse and specular part
@@ -142,9 +140,7 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
float3 clearcoat_normal = stack_valid(data_cn_ssr.x) ?
stack_load_float3(stack, data_cn_ssr.x) :
sd->N;
if (!(sd->type & PRIMITIVE_CURVE)) {
clearcoat_normal = ensure_valid_reflection(sd->Ng, sd->wi, clearcoat_normal);
}
clearcoat_normal = maybe_ensure_valid_specular_reflection(sd, clearcoat_normal);
float3 subsurface_radius = stack_valid(data_cn_ssr.y) ?
stack_load_float3(stack, data_cn_ssr.y) :
one_float3();
@@ -271,7 +267,7 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
NULL;
if (bsdf && fresnel) {
bsdf->N = N;
bsdf->N = valid_reflection_N;
bsdf->ior = (2.0f / (1.0f - safe_sqrtf(0.08f * specular))) - 1.0f;
bsdf->T = T;
@@ -333,7 +329,7 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
NULL;
if (bsdf && fresnel) {
bsdf->N = N;
bsdf->N = valid_reflection_N;
bsdf->T = zero_float3();
bsdf->fresnel = fresnel;
@@ -362,7 +358,7 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
sizeof(MicrofacetBsdf),
rgb_to_spectrum(base_color) * glass_weight * refraction_fresnel);
if (bsdf) {
bsdf->N = N;
bsdf->N = valid_reflection_N;
bsdf->T = zero_float3();
bsdf->fresnel = NULL;
@@ -390,7 +386,7 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
NULL;
if (bsdf && fresnel) {
bsdf->N = N;
bsdf->N = valid_reflection_N;
bsdf->fresnel = fresnel;
bsdf->T = zero_float3();
@@ -461,7 +457,7 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
sd, sizeof(DiffuseBsdf), weight);
if (bsdf) {
bsdf->N = N;
bsdf->N = maybe_ensure_valid_specular_reflection(sd, N);
sd->flag |= bsdf_translucent_setup(bsdf);
}
break;
@@ -490,7 +486,7 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
float roughness = sqr(param1);
bsdf->N = N;
bsdf->N = maybe_ensure_valid_specular_reflection(sd, N);
bsdf->ior = 1.0f;
bsdf->fresnel = NULL;
@@ -554,7 +550,7 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
sd, sizeof(MicrofacetBsdf), weight);
if (bsdf) {
bsdf->N = N;
bsdf->N = maybe_ensure_valid_specular_reflection(sd, N);
bsdf->T = zero_float3();
bsdf->fresnel = NULL;
@@ -597,7 +593,7 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
sd, sizeof(MicrofacetBsdf), weight);
if (bsdf) {
bsdf->N = N;
bsdf->N = maybe_ensure_valid_specular_reflection(sd, N);
bsdf->T = zero_float3();
bsdf->fresnel = NULL;
@@ -646,7 +642,7 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
break;
}
bsdf->N = N;
bsdf->N = maybe_ensure_valid_specular_reflection(sd, N);
bsdf->fresnel = fresnel;
bsdf->T = zero_float3();
@@ -752,7 +748,7 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
float coat = stack_load_float_default(stack, coat_ofs, data_node2.y);
float m0_roughness = 1.0f - clamp(coat, 0.0f, 1.0f);
bsdf->N = N;
bsdf->N = maybe_ensure_valid_specular_reflection(sd, N);
bsdf->v = roughness;
bsdf->s = radial_roughness;
bsdf->m0_roughness = m0_roughness;
@@ -820,7 +816,7 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
sd, sizeof(HairBsdf), weight);
if (bsdf) {
bsdf->N = N;
bsdf->N = maybe_ensure_valid_specular_reflection(sd, N);
bsdf->roughness1 = param1;
bsdf->roughness2 = param2;
bsdf->offset = -stack_load_float(stack, data_node.z);

View File

@@ -71,7 +71,6 @@ ccl_device_noinline void svm_node_set_bump(KernelGlobals kg,
object_normal_transform(kg, sd, &normal_out);
}
normal_out = ensure_valid_reflection(sd->Ng, sd->wi, normal_out);
stack_store_float3(stack, node.w, normal_out);
}
else

View File

@@ -205,8 +205,8 @@ LightTree::LightTree(vector<LightTreePrimitive> &prims,
}
max_lights_in_leaf_ = max_lights_in_leaf;
int num_prims = prims.size();
int num_local_lights = num_prims - num_distant_lights;
const int num_prims = prims.size();
const int num_local_lights = num_prims - num_distant_lights;
/* The amount of nodes is estimated to be twice the amount of primitives */
nodes_.reserve(2 * num_prims);
@@ -240,8 +240,8 @@ int LightTree::recursive_build(
OrientationBounds bcone = OrientationBounds::empty;
BoundBox centroid_bounds = BoundBox::empty;
float energy_total = 0.0;
int num_prims = end - start;
int current_index = nodes_.size();
const int num_prims = end - start;
for (int i = start; i < end; i++) {
const LightTreePrimitive &prim = prims.at(i);
@@ -254,13 +254,13 @@ int LightTree::recursive_build(
nodes_.emplace_back(bbox, bcone, energy_total, bit_trail);
bool try_splitting = num_prims > 1 && len(centroid_bounds.size()) > 0.0f;
const bool try_splitting = num_prims > 1 && len(centroid_bounds.size()) > 0.0f;
int split_dim = -1, split_bucket = 0, num_left_prims = 0;
bool should_split = false;
if (try_splitting) {
/* Find the best place to split the primitives into 2 nodes.
* If the best split cost is no better than making a leaf node, make a leaf instead. */
float min_cost = min_split_saoh(
const float min_cost = min_split_saoh(
centroid_bounds, start, end, bbox, bcone, split_dim, split_bucket, num_left_prims, prims);
should_split = num_prims > max_lights_in_leaf_ || min_cost < energy_total;
}
@@ -295,8 +295,8 @@ int LightTree::recursive_build(
}
float LightTree::min_split_saoh(const BoundBox &centroid_bbox,
int start,
int end,
const int start,
const int end,
const BoundBox &bbox,
const OrientationBounds &bcone,
int &split_dim,
@@ -329,7 +329,7 @@ float LightTree::min_split_saoh(const BoundBox &centroid_bbox,
const float inv_extent = 1 / (centroid_bbox.size()[dim]);
/* Fill in buckets with primitives. */
vector<LightTreeBucketInfo> buckets(LightTreeBucketInfo::num_buckets);
std::array<LightTreeBucketInfo, LightTreeBucketInfo::num_buckets> buckets;
for (int i = start; i < end; i++) {
const LightTreePrimitive &prim = prims[i];
@@ -348,7 +348,7 @@ float LightTree::min_split_saoh(const BoundBox &centroid_bbox,
}
/* Calculate the cost of splitting at each point between partitions. */
vector<float> bucket_costs(LightTreeBucketInfo::num_buckets - 1);
std::array<float, LightTreeBucketInfo::num_buckets - 1> bucket_costs;
float energy_L, energy_R;
BoundBox bbox_L, bbox_R;
OrientationBounds bcone_L, bcone_R;
@@ -379,9 +379,10 @@ float LightTree::min_split_saoh(const BoundBox &centroid_bbox,
/* Calculate the cost of splitting using the heuristic as described in the paper. */
const float area_L = has_area ? bbox_L.area() : len(bbox_L.size());
const float area_R = has_area ? bbox_R.area() : len(bbox_R.size());
float left = (bbox_L.valid()) ? energy_L * area_L * bcone_L.calculate_measure() : 0.0f;
float right = (bbox_R.valid()) ? energy_R * area_R * bcone_R.calculate_measure() : 0.0f;
float regularization = max_extent * inv_extent;
const float left = (bbox_L.valid()) ? energy_L * area_L * bcone_L.calculate_measure() : 0.0f;
const float right = (bbox_R.valid()) ? energy_R * area_R * bcone_R.calculate_measure() :
0.0f;
const float regularization = max_extent * inv_extent;
bucket_costs[split] = regularization * (left + right) * inv_total_cost;
if (bucket_costs[split] < min_cost) {

View File

@@ -153,6 +153,16 @@ static float3 output_estimate_emission(ShaderOutput *output, bool &is_constant)
estimate *= node->get_float(strength_in->socket_type);
}
/* Lower importance of emission nodes from automatic value/color to shader
* conversion, as these are likely used for previewing and can be slow to
* build a light tree for on dense meshes. */
if (node->type == EmissionNode::get_node_type()) {
EmissionNode *emission_node = static_cast<EmissionNode *>(node);
if (emission_node->from_auto_conversion) {
estimate *= 0.1f;
}
}
return estimate;
}
else if (node->type == LightFalloffNode::get_node_type() ||

View File

@@ -260,6 +260,7 @@ void ShaderGraph::connect(ShaderOutput *from, ShaderInput *to)
if (to->type() == SocketType::CLOSURE) {
EmissionNode *emission = create_node<EmissionNode>();
emission->from_auto_conversion = true;
emission->set_color(one_float3());
emission->set_strength(1.0f);
convert = add(emission);

View File

@@ -723,6 +723,8 @@ class EmissionNode : public ShaderNode {
NODE_SOCKET_API(float3, color)
NODE_SOCKET_API(float, strength)
NODE_SOCKET_API(float, surface_mix_weight)
bool from_auto_conversion = false;
};
class BackgroundNode : public ShaderNode {

View File

@@ -56,8 +56,8 @@ class BoundBox {
__forceinline void grow(const BoundBox &bbox)
{
grow(bbox.min);
grow(bbox.max);
min = ccl::min(bbox.min, min);
max = ccl::max(bbox.max, max);
}
__forceinline void grow_safe(const float3 &pt)
@@ -81,8 +81,12 @@ class BoundBox {
__forceinline void grow_safe(const BoundBox &bbox)
{
grow_safe(bbox.min);
grow_safe(bbox.max);
if (isfinite_safe(bbox.min)) {
min = ccl::min(bbox.min, min);
}
if (isfinite_safe(bbox.max)) {
max = ccl::max(bbox.max, max);
}
}
__forceinline void intersect(const BoundBox &bbox)

View File

@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\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 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\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"
@@ -16934,6 +16934,10 @@ msgid "Weight of feather point"
msgstr "ﺶﻣﺎﻬﻟﺍ ﺔﻄﻘﻧ ﻥﺯﻭ"
msgid "Active Point"
msgstr "ﺔﻟﺎﻌﻔﻟﺍ ﺔﻄﻘﻨﻟﺍ"
msgid "Alignment"
msgstr "ﺓﺍﺫﺎﺤﻤﻟﺍ"
@@ -30389,10 +30393,6 @@ msgid "Camera Presets"
msgstr "ﺍﺮﻴﻤﻜﻠﻟ ﺔﻘﺒﺴﻤﻟﺍ ﺕﺍﺩﺍﺪﻋﻹﺍ"
msgid "Active Point"
msgstr "ﺔﻟﺎﻌﻔﻟﺍ ﺔﻄﻘﻨﻟﺍ"
msgid "Footage Settings"
msgstr "ﺓﺩﺎﻤﻟﺍ ﺕﺍﺩﺍﺪﻋﺇ"

File diff suppressed because it is too large Load Diff

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\n"
"PO-Revision-Date: \n"
"Last-Translator: Martin Tabačan <tabycz@gmail.com>\n"
"Language-Team: Taby <tabycz@gmail.com>\n"
@@ -14385,6 +14385,10 @@ msgid "Weight of feather point"
msgstr "Váha této vazby"
msgid "Active Point"
msgstr "Aktivní bod"
msgid "Alignment"
msgstr "Zarovnaný"
@@ -23901,19 +23905,11 @@ msgid "Clear Restrict View"
msgstr "Obnovit pohled"
msgid "Reveal the layer by setting the hide flag"
msgstr "Ukáže objekt dle nastavení skrývající vazby"
msgctxt "Operator"
msgid "Set Restrict View"
msgstr "Obnovit pohled"
msgid "Hide the layer by setting the hide flag"
msgstr "Skryje objekt dle nastavení skrývající vazby"
msgctxt "Operator"
msgid "Move Layer"
msgstr "Přesunout do vrstvy"
@@ -32915,10 +32911,6 @@ msgid "2D Cursor"
msgstr "2D Kursor"
msgid "Active Point"
msgstr "Aktivní bod"
msgid "Predefined tracking camera intrinsics"
msgstr "Předdefinovaná vnitřní nastavení tracking kamery"
@@ -35408,10 +35400,6 @@ msgid "Mini Axes Size"
msgstr "Osa Zrcadlení"
msgid "Simple Axis"
msgstr "Jednoduchá Osa"
msgid "Interactive Navigation"
msgstr "Interaktivní Navigace"
@@ -43645,10 +43633,6 @@ msgid "View Name"
msgstr "Zobrazit Název"
msgid "3D Viewport Axis"
msgstr "Osy 3D Pohledu"
msgid "Smooth Wires"
msgstr "Hladké Dráty"

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\n"
"PO-Revision-Date: \n"
"Last-Translator: Martin Reininger <martinreininger@gmx.net>\n"
"Language-Team: German translation team\n"
@@ -20560,6 +20560,10 @@ msgid "Active spline of masking layer"
msgstr "Aktiver Spline der Maskierungsebene"
msgid "Active Point"
msgstr "Aktive Punkte"
msgid "Grease Pencil Color"
msgstr "Wachsstift-Farbe"
@@ -43123,10 +43127,6 @@ msgid "2D Cursor"
msgstr "2D Cursor"
msgid "Active Point"
msgstr "Aktive Punkte"
msgid "Footage Settings"
msgstr "Filmmaterial-Einstellungen"
@@ -46324,10 +46324,6 @@ msgid "Mini Axes Type"
msgstr "Mini Achsentyp"
msgid "Simple Axis"
msgstr "Einfache Achse"
msgid "Pie menu size in pixels"
msgstr "Kreismenügröße in Pixel"
@@ -58755,10 +58751,6 @@ msgid "View Name"
msgstr "Ansichtnamen"
msgid "3D Viewport Axis"
msgstr "3D Viewport Achsen"
msgid "Smooth Wires"
msgstr "Weichet Draht"

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\n"
"PO-Revision-Date: \n"
"Last-Translator: Gabriel Gazzán <gabcorreo@gmail.com>\n"
"Language-Team: Español <gabcorreo@gmail.com>\n"
@@ -33447,6 +33447,10 @@ msgid "Active spline of masking layer"
msgstr "Curva activa de la capa de máscara"
msgid "Active Point"
msgstr "Punto activo"
msgid "Grease Pencil Color"
msgstr "Color del lápiz de cera"
@@ -44381,10 +44385,6 @@ msgid "Is Face Planar"
msgstr "Es cara plana"
msgid "Retrieve whether all triangles in a face are on the same plane, i.e. whether have the same normal"
msgstr "Proporciona información acerca de si todos los triángulos de una cara se encuentran sobre un mismo plano o, lo que es lo mismo, si tienen normales idénticas"
msgid "Face Neighbors"
msgstr "Cercanos a la cara"
@@ -59451,19 +59451,11 @@ msgid "Clear Restrict View"
msgstr "Eliminar restricción visibilidad"
msgid "Reveal the layer by setting the hide flag"
msgstr "Revela la capa, restableciendo su indicador de ocultamiento"
msgctxt "Operator"
msgid "Set Restrict View"
msgstr "Impedir visibilidad"
msgid "Hide the layer by setting the hide flag"
msgstr "Oculta la capa, activando su indicador de ocultamiento"
msgctxt "Operator"
msgid "Move Layer"
msgstr "Mover capa"
@@ -81106,10 +81098,6 @@ msgid "2D Cursor"
msgstr "Cursor 2D"
msgid "Active Point"
msgstr "Punto activo"
msgid "Predefined tracking camera intrinsics"
msgstr "Ajustes predefinidos de cámara para el rastreo"
@@ -86097,14 +86085,6 @@ msgid "Mini Axes Type"
msgstr "Tipo de mini ejes"
msgid "Show a small rotating 3D axes in the top right corner of the 3D viewport"
msgstr "Muestra pequeños ejes 3D rotatorios en la esquina superior derecha de la vista 3D"
msgid "Simple Axis"
msgstr "Ejes simples"
msgid "Interactive Navigation"
msgstr "Navegación interactiva"
@@ -110010,10 +109990,6 @@ msgid "Playback Frame Rate (FPS)"
msgstr "Velocidad de reproducción (fps)"
msgid "3D Viewport Axis"
msgstr "Ejes de vista 3D"
msgid "Smooth Wires"
msgstr "Suavizar estructura"

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\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,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\n"
"PO-Revision-Date: 2012-10-31 17:00-0800\n"
"Last-Translator: Amin Babaeipanah <translate@leomoon.com>\n"
"Language-Team: LeoMoon Studios <blender@leomoon.com>\n"

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\n"
"PO-Revision-Date: \n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -8550,10 +8550,6 @@ msgid "View Name"
msgstr "Katso nimeä"
msgid "3D Viewport Axis"
msgstr "3D-näkymän akselit"
msgid "Limit Size"
msgstr "Rajoita kokoa"

View File

@@ -1,10 +1,10 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"PO-Revision-Date: 2023-03-12 17:34+0100\n"
"POT-Creation-Date: 2023-03-20 13:37:56\n"
"PO-Revision-Date: 2023-03-15 23:26+0100\n"
"Last-Translator: Damien Picard (pioverfour) <dam.pic@free.fr>\n"
"Language-Team: French https://wiki.blender.org/wiki/Process/Translate_Blender/French_Team\n"
"Language: fr\n"
@@ -1110,6 +1110,10 @@ msgid "Copyright"
msgstr "Copyright"
msgid "Copyright notice for this asset. An empty copyright notice does not necessarily indicate that this is copyright-free. Contact the author if any clarification is needed"
msgstr "Avis de droit dauteur pour cet asset. Un champ vide ne signifie pas forcément que lasset nest soumis à aucun droit dauteur. Contacter lauteur pour obtenir toute clarification nécessaire"
msgid "Description"
msgstr "Description"
@@ -1118,6 +1122,14 @@ msgid "A description of the asset to be displayed for the user"
msgstr "Une description de lasset affichée à lutilisateur"
msgid "License"
msgstr "Licence"
msgid "The type of license this asset is distributed under. An empty license name does not necessarily indicate that this is free of licensing terms. Contact the author if any clarification is needed"
msgstr "Le type de licence selon laquelle cet asset est distribué. Un champ vide ne signifie pas forcément que lasset nest soumis à aucune condition. Contacter lauteur pour obtenir toute clarification nécessaire"
msgid "Tags"
msgstr "Étiquettes"
@@ -13701,6 +13713,11 @@ msgid "Minimum number of particles per cell (ensures that each cell has at least
msgstr "Nombre minimum de particules par cellules (garantit que chaque cellule a au moins cette quantité de particules)"
msgctxt "Amount"
msgid "Number"
msgstr "Nombre"
msgid "Particle number factor (higher value results in more particles)"
msgstr "Facteur de nombre de particules (des valeurs plus élevées donnent plus de particules)"
@@ -19542,6 +19559,61 @@ msgid "Editable falloff curve"
msgstr "Courbe datténuation éditable"
msgctxt "Curves"
msgid "Curve Preset"
msgstr "Préréglage de courbe"
msgctxt "Curves"
msgid "Custom"
msgstr "Personnalisée"
msgctxt "Curves"
msgid "Smooth"
msgstr "Douce"
msgctxt "Curves"
msgid "Smoother"
msgstr "Plus douce"
msgctxt "Curves"
msgid "Sphere"
msgstr "Sphère"
msgctxt "Curves"
msgid "Root"
msgstr "Racine carrée"
msgctxt "Curves"
msgid "Sharp"
msgstr "Dure"
msgctxt "Curves"
msgid "Linear"
msgstr "Linéaire"
msgctxt "Curves"
msgid "Sharper"
msgstr "Plus dure"
msgctxt "Curves"
msgid "Inverse Square"
msgstr "Quadratique inverse"
msgctxt "Curves"
msgid "Constant"
msgstr "Constante"
msgid "Curves Sculpt Settings"
msgstr "Réglages de peinture de courbes"
@@ -20986,10 +21058,25 @@ msgid "Name of the Alembic attribute used for generating motion blur data"
msgstr "Nom de lattribut Alembic utilisé pour générer les données de flou cinétique"
msgctxt "Unit"
msgid "Velocity Unit"
msgstr "Unité de vélocité"
msgid "Define how the velocity vectors are interpreted with regard to time, 'frame' means the delta time is 1 frame, 'second' means the delta time is 1 / FPS"
msgstr "Définir comment les vecteurs vélocité sont interprétés par rapport au temps, « frame » signifie que le différentiel de temps est de 1 image, « seconde » que le différentiel de temps est de 1 / FPS"
msgctxt "Unit"
msgid "Second"
msgstr "Seconde"
msgctxt "Unit"
msgid "Frame"
msgstr "Frame"
msgid "Camera data-block for storing camera settings"
msgstr "Bloc de données caméra pour stocker les réglages de caméra"
@@ -26934,7 +27021,7 @@ msgstr "Afficher la santé des boids"
msgid "Number"
msgstr "Numéro/Nombre"
msgstr "Numéro"
msgid "Show particle number"
@@ -28012,6 +28099,11 @@ msgid "Text file on disk is different than the one in memory"
msgstr "Le fichier texte sur le disque est différent de celui en mémoire"
msgctxt "Text"
msgid "Lines"
msgstr "Lignes"
msgid "Lines of text"
msgstr "Lignes de texte"
@@ -33507,6 +33599,10 @@ msgid "Active spline of masking layer"
msgstr "Courbe active du calque de masque"
msgid "Active Point"
msgstr "Point actif"
msgid "Grease Pencil Color"
msgstr "Couleur de crayon gras"
@@ -34044,6 +34140,11 @@ msgid "Write"
msgstr "Écriture"
msgctxt "NodeTree"
msgid "Constant"
msgstr "Constante"
msgid "Instances"
msgstr "Instances"
@@ -41482,11 +41583,11 @@ msgstr "Nombre de lames"
msgid "Rounding"
msgstr "Arrondis"
msgstr "Arrondi"
msgid "Level of rounding of the bokeh"
msgstr "Niveau darrondis du bokeh"
msgstr "Niveau darrondi du bokeh"
msgid "Lens Shift"
@@ -44659,10 +44760,6 @@ msgid "Is Face Planar"
msgstr "La face est plane"
msgid "Retrieve whether all triangles in a face are on the same plane, i.e. whether have the same normal"
msgstr "Savoir si tous les triangles dune face sont sur le même plan, c-à-d sils ont la même normale"
msgid "Face Neighbors"
msgstr "Voisins de face"
@@ -47694,11 +47791,11 @@ msgstr "Sous-chemin utilisé pour cet emplacement"
msgid "Save as Render"
msgstr "Enregistrer rendu sous"
msgstr "Enregistrer comme rendu"
msgid "Apply render part of display transform when saving byte image"
msgstr "Appliquer la partie rendu des transformations daffichage à lenregistrement binaire de limage"
msgstr "Appliquer la partie rendu des transformations daffichage à lenregistrement dune image 8-bits"
msgid "Use Node Format"
@@ -50162,7 +50259,7 @@ msgstr "Annule la dernière modification des catalogues dassets"
msgctxt "Operator"
msgid "Store undo snapshot for asset catalog edits"
msgstr "Enregistrer instantané dannulation pour les modifications des catalogues dassets"
msgstr "Enregistrer un instantané dannulation pour les modifications des catalogues dassets"
msgid "Store the current state of the asset catalogs in the undo buffer"
@@ -50171,11 +50268,11 @@ msgstr "Enregistrer létat actuel des catalogues dassets dans le tampon d
msgctxt "Operator"
msgid "Save Asset Catalogs"
msgstr "Enregistrer catalogues dassets"
msgstr "Enregistrer les catalogues dassets"
msgid "Make any edits to any catalogs permanent by writing the current set up to the asset library"
msgstr "Rendre toutes les modifications de catalogues permanentes en enregistrant létat actuel dans la bibliothèque dassets"
msgstr "Rendre permanentes toutes les modifications de catalogues en enregistrant létat actuel dans la bibliothèque dassets"
msgctxt "Operator"
@@ -53510,7 +53607,7 @@ msgstr "Exporter STL"
msgid "Save STL triangle mesh data"
msgstr "Enregistrer données de maillage triangulé STL"
msgstr "Enregistrer des données de maillage triangulé STL"
msgid "Ascii"
@@ -54176,7 +54273,7 @@ msgstr "Format JPEG (.jpg)"
msgid "Save images as JPEGs. (Images that need alpha are saved as PNGs though.) Be aware of a possible loss in quality"
msgstr "Enregistrer des images en JPEG. (Les images qui ont besoin dalpha sont quand même enregistrées en PNG.) Attention : une perte de qualité est possible"
msgstr "Enregistrer les images en JPEG. (Les images qui ont besoin dalpha sont quand même enregistrées en PNG.) Attention : une perte de qualité est possible"
msgid "Don't export images"
@@ -57063,7 +57160,7 @@ msgstr "Inverser la sélection existante"
msgid "Intersect existing selection"
msgstr "Intersecter la sélection actuelle"
msgstr "Intersecter avec la sélection existante"
msgid "Select Grease Pencil strokes using brush selection"
@@ -58761,7 +58858,7 @@ msgstr "Début Y"
msgctxt "Operator"
msgid "Save Image"
msgstr "Enregistrer image"
msgstr "Enregistrer limage"
msgid "Save the image with current name and settings"
@@ -58779,7 +58876,7 @@ msgstr "Enregistrer toutes les images modifiées"
msgctxt "Operator"
msgid "Save As Image"
msgstr "Enregistrer image sous"
msgstr "Enregistrer limage sous"
msgid "Save the image with another name and/or settings"
@@ -58791,7 +58888,7 @@ msgstr "Créer un nouveau fichier image, sans modifier limage actuelle dans b
msgid "Save As Render"
msgstr "Enregistrer rendu sous"
msgstr "Enregistrer comme rendu"
msgid ""
@@ -59918,19 +60015,11 @@ msgid "Clear Restrict View"
msgstr "Annuler cacher dans la vue"
msgid "Reveal the layer by setting the hide flag"
msgstr "Afficher les calques de masque temporairement cachés"
msgctxt "Operator"
msgid "Set Restrict View"
msgstr "Définir cacher dans la vue"
msgid "Hide the layer by setting the hide flag"
msgstr "Cacher temporairement les calques de masque"
msgctxt "Operator"
msgid "Move Layer"
msgstr "Déplacer calque"
@@ -60285,11 +60374,11 @@ msgstr "Biseauter"
msgid "Cut into selected items at an angle to create bevel or chamfer"
msgstr "Couper dans lélément sélectionné selon un angle, afin de créer un biseau ou un chanfrein"
msgstr "Couper les éléments sélectionnés en biais, afin de créer un biseau ou un chanfrein"
msgid "Do not allow beveled edges/vertices to overlap each other"
msgstr "Interdire aux arêtes/sommets biseautés de se recouvrir mutuellement"
msgstr "Interdire aux arêtes/sommets biseautés de se chevaucher"
msgid "Face Strength Mode"
@@ -70754,11 +70843,11 @@ msgstr "Installer éclairages studio personnalisés"
msgctxt "Operator"
msgid "Save Custom Studio Light"
msgstr "Enregistrer éclairages studio personnalisés"
msgstr "Enregistrer les éclairages studio personnalisés"
msgid "Save custom studio light from the studio light editor settings"
msgstr "Enregistrer éclairages studio personnalisés depuis les réglages de léditeur déclairage studio"
msgstr "Enregistrer les éclairages studio personnalisés depuis les réglages de léditeur déclairage studio"
msgid "Show light preferences"
@@ -70928,7 +71017,7 @@ msgstr "Utiliser la vue 3D actuelle pour le rendu, sinon utiliser les réglages
msgid "Write Image"
msgstr "Enregistrer image"
msgstr "Enregistrer limage"
msgid "Save rendered the image to the output path (used only when animation is disabled)"
@@ -72084,7 +72173,7 @@ msgstr "Alterner entre les dispositions décran disponibles"
msgctxt "Operator"
msgid "Save Screenshot"
msgstr "Enregistrer capture décran"
msgstr "Enregistrer une capture décran"
msgid "Capture a picture of the whole Blender window"
@@ -72093,7 +72182,7 @@ msgstr "Capturer une image de toute la fenêtre Blender"
msgctxt "Operator"
msgid "Save Screenshot (Editor)"
msgstr "Enregistrer capture décran (éditeur)"
msgstr "Enregistrer une capture décran (éditeur)"
msgid "Capture a picture of an editor"
@@ -79547,7 +79636,7 @@ msgstr "Lier"
msgid "Link from a Library .blend file"
msgstr "Lier depuis autre fichier .blend bibliothèque"
msgstr "Lier depuis un autre fichier .blend bibliothèque"
msgctxt "Operator"
@@ -80278,7 +80367,7 @@ msgstr "Charger les réglages dusine"
msgid "Load factory default startup file and preferences. To make changes permanent, use \"Save Startup File\" and \"Save Preferences\""
msgstr "Charger le fichier de démarrage et les préférences dusine par défaut. Pour rendre les changements permanents, utiliser « Enregistrer fichier de démarrage » et « Enregistrer préférences »"
msgstr "Charger le fichier de démarrage et les préférences dusine par défaut. Pour rendre les changements permanents, utiliser « Enregistrer le fichier de démarrage » et « Enregistrer préférences »"
msgid "Factory Startup App-Template Only"
@@ -80300,7 +80389,7 @@ msgstr "Recharger le fichier dhistorique"
msgid "Reloads history and bookmarks"
msgstr "Recharge lhistorique et les signets"
msgstr "Recharger lhistorique et les signets"
msgctxt "Operator"
@@ -80309,7 +80398,7 @@ msgstr "Recharger le fichier de démarrage"
msgid "Open the default file (doesn't save the current file)"
msgstr "Ouvre le fichier par défaut (ne sauvegarde pas le fichier en cours)"
msgstr "Ouvrir le fichier par défaut (ne pas sauvegarder le fichier en cours)"
msgid "Path to an alternative start-up file"
@@ -80326,7 +80415,7 @@ msgstr "Démarrage dusine"
msgctxt "Operator"
msgid "Load Preferences"
msgstr "Charger préférences"
msgstr "Charger les préférences"
msgid "Load last saved preferences"
@@ -80335,20 +80424,20 @@ msgstr "Charger les dernières préférences enregistrées"
msgctxt "Operator"
msgid "Recover Auto Save"
msgstr "Récupérer sauvegarde auto"
msgstr "Récupérer une sauvegarde auto"
msgid "Open an automatically saved file to recover it"
msgstr "Ouvre un fichier automatiquement sauvegardé"
msgstr "Ouvrir un fichier sauvegardé automatiquement"
msgctxt "Operator"
msgid "Recover Last Session"
msgstr "Récupérer dernière session"
msgstr "Récupérer la dernière session"
msgid "Open the last closed file (\"quit.blend\")"
msgstr "Ouvre la sauvegarde effectuée à la fermeture (« quit.blend »)"
msgstr "Ouvrir la sauvegarde effectuée à la fermeture (« quit.blend »)"
msgctxt "Operator"
@@ -80446,7 +80535,7 @@ msgstr "Écrire un fichier .blend compressé"
msgid "Save Copy"
msgstr "Enregistrer copie"
msgstr "Enregistrer une copie"
msgid "Save a copy of the actual working state but does not make saved file active"
@@ -80463,7 +80552,7 @@ msgstr "Actualiser les chemins relatifs lors dun enregistrement dans un autre
msgctxt "Operator"
msgid "Save Startup File"
msgstr "Enregistrer fichier de démarrage"
msgstr "Enregistrer le fichier de démarrage"
msgid "Make the current file the default .blend file"
@@ -80472,7 +80561,7 @@ msgstr "Faire du fichier actuel le fichier .blend par défaut"
msgctxt "Operator"
msgid "Save Blender File"
msgstr "Enregistrer fichier Blender"
msgstr "Enregistrer le fichier Blender"
msgid "Save the current Blender file"
@@ -80485,7 +80574,7 @@ msgstr "Quitter Blender après avoir enregistré"
msgctxt "Operator"
msgid "Save Preferences"
msgstr "Enregistrer préférences"
msgstr "Enregistrer les préférences"
msgid "Make the current preferences default"
@@ -80639,7 +80728,7 @@ msgstr "Valider et corriger les maillages importés (lent)"
msgctxt "Operator"
msgid "Save System Info"
msgstr "Enregistrer infos système"
msgstr "Enregistrer les infos système"
msgid "Generate system information, saved into a text file"
@@ -81987,10 +82076,6 @@ msgid "2D Cursor"
msgstr "Curseur 2D"
msgid "Active Point"
msgstr "Point actif"
msgid "Predefined tracking camera intrinsics"
msgstr "« Intrinsèques » de caméra de suivi prédéfinis"
@@ -83009,7 +83094,7 @@ msgstr "Paramètres de souris 3D"
msgid "Save Preferences"
msgstr "Enregistrer préférences"
msgstr "Enregistrer les préférences"
msgid "Auto Run Python Scripts"
@@ -85800,11 +85885,11 @@ msgstr "Le répertoire par défaut de sortie des rendus, pour les nouvelles scè
msgid "Save Versions"
msgstr "Enregistrer versions"
msgstr "Versions de sauvegarde"
msgid "The number of old versions to maintain in the current directory, when manually saving"
msgstr "Nombre de précédentes versions à maintenir dans le dossier actuel,lors dune sauvegarde manuelle"
msgstr "Nombre de précédentes versions à garder dans le dossier actuel, lors dune sauvegarde manuelle"
msgid "Python Scripts Directory"
@@ -87051,14 +87136,6 @@ msgid "Mini Axes Type"
msgstr "Type des mini axes"
msgid "Show a small rotating 3D axes in the top right corner of the 3D viewport"
msgstr "Afficher des petits axes 3D tournants dans le coin supérieur droit de la vue 3D"
msgid "Simple Axis"
msgstr "Axes simples"
msgid "Interactive Navigation"
msgstr "Navigation interactive"
@@ -90064,10 +90141,25 @@ msgid "Additional subdivision along the curves"
msgstr "Subdivision supplémentaire le long des courbes"
msgctxt "Curves"
msgid "Curves Shape Type"
msgstr "Type de forme des courbes"
msgid "Curves shape type"
msgstr "Type de forme des courbes"
msgctxt "Curves"
msgid "Strand"
msgstr "Fibre"
msgctxt "Curves"
msgid "Strip"
msgstr "Bande"
msgid "Multiple Engines"
msgstr "Plusieurs moteurs"
@@ -106349,6 +106441,10 @@ msgid "Previews clear process failed for file '%s'!"
msgstr "Le processus de nettoyage des prévisualisations a échoué pour le fichier « %s »"
msgid "No active camera in the scene"
msgstr "Aucune caméra active dans la scène"
msgid "Unexpected modifier type: "
msgstr "Type de modificateur inattendu : "
@@ -111128,7 +111224,7 @@ msgstr "Revenir au précédent"
msgctxt "Operator"
msgid "Save Copy..."
msgstr "Enregistrer copie…"
msgstr "Enregistrer une copie…"
msgctxt "Operator"
@@ -111425,10 +111521,6 @@ msgid "Playback Frame Rate (FPS)"
msgstr "Framerate durant la lecture (FPS)"
msgid "3D Viewport Axis"
msgstr "Axes de la vue 3D"
msgid "Smooth Wires"
msgstr "Adoucir filaire"
@@ -111692,7 +111784,7 @@ msgstr "Caméra"
msgctxt "Operator"
msgid "Orbit Opposite"
msgstr "Orbiter en sens opposé"
msgstr "Orbiter de lautre côté"
msgctxt "Operator"
@@ -116417,6 +116509,10 @@ msgid "Error evaluating number, see Info editor for details"
msgstr "Erreur lors de lévaluation du nombre, voir léditeur infos pour plus de détails"
msgid "Press a key"
msgstr "Appuyer sur une touche"
msgid "Missing Panel: %s"
msgstr "Panneau manquant : %s"
@@ -119600,7 +119696,7 @@ msgstr "Impossible de créer un tampon OpenGL hors-écran : %s"
msgid "Missing%s%s%s%s detected!"
msgstr "%s%s%s%s manquant détecté!"
msgstr "%s%s%s%s manquants détectés!"
msgid "Active group is locked, aborting"
@@ -123703,6 +123799,31 @@ msgid "UNDEFINED"
msgstr "INDÉFINI"
msgctxt "NodeTree"
msgid "Functions"
msgstr "Fonctions"
msgctxt "NodeTree"
msgid "Comparison"
msgstr "Comparaison"
msgctxt "NodeTree"
msgid "Rounding"
msgstr "Arrondi"
msgctxt "NodeTree"
msgid "Trigonometric"
msgstr "Trigonométrie"
msgctxt "NodeTree"
msgid "Conversion"
msgstr "Conversion"
msgid "Same input/output direction of sockets"
msgstr "Même direction dentrée/sortie des prises"

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\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 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\n"
"PO-Revision-Date: 2012-10-07 13:56+0300\n"
"Last-Translator: Barak Itkin <lightningismyname@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\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"

File diff suppressed because it is too large Load Diff

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\n"
"PO-Revision-Date: 2021-12-25 23:57-0800\n"
"Last-Translator: Adriel Tristanputra <ultimexport@gmail.com>\n"
"Language-Team: Indonesian <>\n"
@@ -11629,6 +11629,10 @@ msgid "Weight of feather point"
msgstr "Kamera"
msgid "Active Point"
msgstr "Titik Aktif"
msgid "Grease Pencil Color"
msgstr "Warna Pensil Grease"
@@ -20109,10 +20113,6 @@ msgid "Camera Presets"
msgstr "Preset Kamera"
msgid "Active Point"
msgstr "Titik Aktif"
msgid "Clip Display"
msgstr "Tampilan Klip"

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\n"
"PO-Revision-Date: 2022-01-21 16:08+0100\n"
"Last-Translator: MT\n"
"Language-Team: blend-it <https://developer.blender.org/T42765>\n"
@@ -18365,6 +18365,10 @@ msgid "Weight of feather point"
msgstr "Peso del punto sfumatura"
msgid "Active Point"
msgstr "Punto Attivo"
msgid "Alignment"
msgstr "Allineamento"
@@ -30999,19 +31003,11 @@ msgid "Clear Restrict View"
msgstr "Pulisci Vista con Restrizioni"
msgid "Reveal the layer by setting the hide flag"
msgstr "Rivela il livello impostando il flag hide"
msgctxt "Operator"
msgid "Set Restrict View"
msgstr "Imposta Vista con Restrizioni"
msgid "Hide the layer by setting the hide flag"
msgstr "Nasconde il livello impostando il flag hide"
msgctxt "Operator"
msgid "Move Layer"
msgstr "Sposta Livello"
@@ -42411,10 +42407,6 @@ msgid "2D Cursor"
msgstr "Cursore 2D"
msgid "Active Point"
msgstr "Punto Attivo"
msgid "Footage Settings"
msgstr "Impostazioni Filmato Originale"
@@ -54591,10 +54583,6 @@ msgid "View Name"
msgstr "Nome Vista"
msgid "3D Viewport Axis"
msgstr "Assi Vista 3D"
msgid "Limit Size"
msgstr "Limita Dimensioni"

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\n"
"PO-Revision-Date: 2016-10-13 03:05+0900\n"
"Last-Translator: \n"
"Language-Team: Japanese Translation Team (https://sites.google.com/site/blugjp/blender-translators)\n"
@@ -1115,6 +1115,10 @@ msgid "Copyright"
msgstr "コピーライト"
msgid "Copyright notice for this asset. An empty copyright notice does not necessarily indicate that this is copyright-free. Contact the author if any clarification is needed"
msgstr "このアセットの著作権情報。著作権情報が空の場合でも著作権フリーとは限りません。明確にする必要がある場合は作者に連絡してください"
msgid "Description"
msgstr "詳細"
@@ -1123,6 +1127,14 @@ msgid "A description of the asset to be displayed for the user"
msgstr "ユーザー用に表示されるアセットの解説"
msgid "License"
msgstr "ライセンス"
msgid "The type of license this asset is distributed under. An empty license name does not necessarily indicate that this is free of licensing terms. Contact the author if any clarification is needed"
msgstr "このアセットのライセンスタイプ。"
msgid "Tags"
msgstr "タグ"
@@ -13873,8 +13885,13 @@ msgstr ""
"(各セルは少なくともこのパーティクル数を持つようになります)"
msgctxt "Amount"
msgid "Number"
msgstr "数"
msgid "Particle number factor (higher value results in more particles)"
msgstr "パーティクル係数(大きな値でパーティクルが増加)"
msgstr "パーティクル数の係数(大きな値でパーティクルが増加)"
msgid "Particle radius factor. Increase this value if the simulation appears to leak volume, decrease it if the simulation seems to gain volume"
@@ -19794,6 +19811,61 @@ msgid "Editable falloff curve"
msgstr "減衰曲線を有効化します"
msgctxt "Curves"
msgid "Curve Preset"
msgstr "カーブプリセット"
msgctxt "Curves"
msgid "Custom"
msgstr "カスタム"
msgctxt "Curves"
msgid "Smooth"
msgstr "スムーズ"
msgctxt "Curves"
msgid "Smoother"
msgstr "強スムーズ"
msgctxt "Curves"
msgid "Sphere"
msgstr "球状"
msgctxt "Curves"
msgid "Root"
msgstr "ルート"
msgctxt "Curves"
msgid "Sharp"
msgstr "シャープ"
msgctxt "Curves"
msgid "Linear"
msgstr "リニア"
msgctxt "Curves"
msgid "Sharper"
msgstr "強シャープ"
msgctxt "Curves"
msgid "Inverse Square"
msgstr "逆二乗式"
msgctxt "Curves"
msgid "Constant"
msgstr "一定"
msgid "Curves Sculpt Settings"
msgstr "ヘアーカーブスカルプト設定"
@@ -21263,6 +21335,11 @@ msgid "Name of the Alembic attribute used for generating motion blur data"
msgstr "モーションブラーデータの生成に使用される Alembic の属性の名前"
msgctxt "Unit"
msgid "Velocity Unit"
msgstr "速度の単位"
msgid "Define how the velocity vectors are interpreted with regard to time, 'frame' means the delta time is 1 frame, 'second' means the delta time is 1 / FPS"
msgstr ""
"時間に対する速度ベクトルの解釈方法\n"
@@ -21270,6 +21347,16 @@ msgstr ""
"「秒数」はデルタタイムが 1/FPS"
msgctxt "Unit"
msgid "Second"
msgstr "秒数"
msgctxt "Unit"
msgid "Frame"
msgstr "フレーム"
msgid "Camera data-block for storing camera settings"
msgstr "カメラ設定を格納するカメラデータブロック"
@@ -28351,8 +28438,13 @@ msgid "Text file on disk is different than the one in memory"
msgstr "ディスク上のテキストファイルはメモリ内のものと異なります"
msgctxt "Text"
msgid "Lines"
msgstr "行数"
msgid "Lines of text"
msgstr "テキストの行"
msgstr "テキストの行"
msgid "Selection End Character"
@@ -29033,7 +29125,7 @@ msgstr "よりクリアに設定されたマーブルを使用"
msgid "Sharper"
msgstr "よりシャープ"
msgstr "シャープ"
msgid "Use very clearly defined marble"
@@ -33879,6 +33971,10 @@ msgid "Active spline of masking layer"
msgstr "マスキングレイヤーのアクティブスプライン"
msgid "Active Point"
msgstr "アクティブポイント"
msgid "Grease Pencil Color"
msgstr "グリースペンシルカラー"
@@ -34416,6 +34512,11 @@ msgid "Write"
msgstr "書込"
msgctxt "NodeTree"
msgid "Constant"
msgstr "定数"
msgid "Instances"
msgstr "インスタンス"
@@ -45081,10 +45182,6 @@ msgid "Is Face Planar"
msgstr "平面判定"
msgid "Retrieve whether all triangles in a face are on the same plane, i.e. whether have the same normal"
msgstr "1つの面内の全三角形が同一平面上にあるかどうか同じ法線かどうかを計算します"
msgid "Face Neighbors"
msgstr "面情報"
@@ -60483,19 +60580,11 @@ msgid "Clear Restrict View"
msgstr "ビューの制限を解除"
msgid "Reveal the layer by setting the hide flag"
msgstr "非表示フラグを解除しオブジェクトを再表示します"
msgctxt "Operator"
msgid "Set Restrict View"
msgstr "ビューの制限を設定"
msgid "Hide the layer by setting the hide flag"
msgstr "非表示フラグを設定し、レイヤーを隠します"
msgctxt "Operator"
msgid "Move Layer"
msgstr "レイヤー移動"
@@ -82685,10 +82774,6 @@ msgid "2D Cursor"
msgstr "2Dカーソル"
msgid "Active Point"
msgstr "アクティブポイント"
msgid "Predefined tracking camera intrinsics"
msgstr "定義済トラッキングカメラ固有値"
@@ -87791,14 +87876,6 @@ msgid "Mini Axes Type"
msgstr "ミニ軸のタイプ"
msgid "Show a small rotating 3D axes in the top right corner of the 3D viewport"
msgstr "3Dビューポートの右上隅に、回転する小さな3D座標軸を表示します"
msgid "Simple Axis"
msgstr "シンプルな軸"
msgid "Interactive Navigation"
msgstr "インタラクティブナビゲーション"
@@ -90872,10 +90949,25 @@ msgid "Additional subdivision along the curves"
msgstr "カーブに沿ってさらに細分化します"
msgctxt "Curves"
msgid "Curves Shape Type"
msgstr "カーブの形状タイプ"
msgid "Curves shape type"
msgstr "カーブの形状タイプ"
msgctxt "Curves"
msgid "Strand"
msgstr "ストランド"
msgctxt "Curves"
msgid "Strip"
msgstr "ストリップ"
msgid "Multiple Engines"
msgstr "複数のエンジン"
@@ -107222,6 +107314,10 @@ msgid "Previews clear process failed for file '%s'!"
msgstr "ファイル「%s」のプレビュークリアプロセスに失敗しました"
msgid "No active camera in the scene"
msgstr "シーンにアクティブカメラがありません"
msgid "Unexpected modifier type: "
msgstr "未知のモディファイアータイプ:"
@@ -109574,7 +109670,7 @@ msgstr "このオブジェクトは複合形状の一部です"
msgid "Second"
msgstr "秒数"
msgstr "2つめ"
msgid "X Stiffness"
@@ -112298,10 +112394,6 @@ msgid "Playback Frame Rate (FPS)"
msgstr "再生フレームレートFPS"
msgid "3D Viewport Axis"
msgstr "3Dビューポートの軸"
msgid "Smooth Wires"
msgstr "スムーズワイヤ"
@@ -117296,6 +117388,10 @@ msgid "Error evaluating number, see Info editor for details"
msgstr "数値の評価エラー。詳細は情報エディターを参照してください"
msgid "Press a key"
msgstr "キーを押下"
msgid "Missing Panel: %s"
msgstr "欠けているパネル:%s"
@@ -124590,6 +124686,31 @@ msgid "UNDEFINED"
msgstr "未定義"
msgctxt "NodeTree"
msgid "Functions"
msgstr "関数"
msgctxt "NodeTree"
msgid "Comparison"
msgstr "比較"
msgctxt "NodeTree"
msgid "Rounding"
msgstr "丸め"
msgctxt "NodeTree"
msgid "Trigonometric"
msgstr "三角関数"
msgctxt "NodeTree"
msgid "Conversion"
msgstr "変換"
msgid "Same input/output direction of sockets"
msgstr "ソケットの入出力方向が同じです"

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Tamar Mebonia <tammebonia@gmail.com>, 2023\n"
"Language-Team: LANGUAGE <LL@li.org>\n"

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\n"
"PO-Revision-Date: 2020-01-04 05:04+0900\n"
"Last-Translator: Geuntak Jeong <beroberos@gmail.com>\n"
"Language-Team: Korean (http://www.transifex.com/lxlalexlxl/blender/language/ko/)\n"
@@ -26193,6 +26193,10 @@ msgid "Active spline of masking layer"
msgstr "마스킹 레이어의 활성 스플라인"
msgid "Active Point"
msgstr "활성 포인트"
msgid "Grease Pencil Color"
msgstr "그리스 펜슬 컬러"
@@ -44683,19 +44687,11 @@ msgid "Clear Restrict View"
msgstr "제한 뷰를 지우기"
msgid "Reveal the layer by setting the hide flag"
msgstr "숨기기 플레그를 설정하여 레이어를 보이기"
msgctxt "Operator"
msgid "Set Restrict View"
msgstr "제한 뷰를 설정"
msgid "Hide the layer by setting the hide flag"
msgstr "숨기기 플레그를 설정하여 레이어를 숨기기"
msgctxt "Operator"
msgid "Move Layer"
msgstr "레이어 이동"
@@ -60696,10 +60692,6 @@ msgid "2D Cursor"
msgstr "2D 커서"
msgid "Active Point"
msgstr "활성 포인트"
msgid "Predefined tracking camera intrinsics"
msgstr "미리 정의된 트래킹 카메라 내장"
@@ -64649,10 +64641,6 @@ msgid "Mini Axes Type"
msgstr "미니 축 유형"
msgid "Simple Axis"
msgstr "심플 축"
msgid "Interactive Navigation"
msgstr "대화형 네비게이션"
@@ -80660,10 +80648,6 @@ msgid "View Name"
msgstr "뷰 이름"
msgid "3D Viewport Axis"
msgstr "3D 뷰포트 축"
msgid "Limit Size"
msgstr "크기를 제한"

View File

@@ -1,10 +1,10 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"(b'0000000000000000000000000000000000000000')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\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"

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\n"
"PO-Revision-Date: 2021-12-05 20:05+0100\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
@@ -2699,6 +2699,10 @@ msgid "Calculate Holes"
msgstr "Bereken Gaten"
msgid "Active Point"
msgstr "Actieve Punt"
msgctxt "MovieClip"
msgid "Clip"
msgstr "Clip"
@@ -6443,10 +6447,6 @@ msgid "Custom Shape"
msgstr "Aangepaste Vorm"
msgid "Active Point"
msgstr "Actieve Punt"
msgctxt "MovieClip"
msgid "Scene Setup"
msgstr "Scene Opstelling"

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\n"
"PO-Revision-Date: 2017-08-26 11:13+0200\n"
"Last-Translator: Mikołaj Juda <mikolaj.juda@gmail.com>\n"
"Language: pl\n"

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: Ivan Paulos Tomé <ivan.paulos.tome@yandex.com>\n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\n"
"PO-Revision-Date: 2017-09-08 21:24-0300\n"
"Last-Translator: Ivan Paulos Tomé <greylica@gmail.com>\n"
"Language-Team: Ivan Paulos Tomé, Inês Almeida, João Brandão (ULISBOA), Paulo Martins <ivan.paulos.tome@yandex.com>\n"
@@ -20652,6 +20652,10 @@ msgid "Active spline of masking layer"
msgstr "Spline ativa da camada de máscara."
msgid "Active Point"
msgstr "Ponto ativo"
msgid "Alignment"
msgstr "Alinhamento"
@@ -35586,19 +35590,11 @@ msgid "Clear Restrict View"
msgstr "Limpar visualização restrita"
msgid "Reveal the layer by setting the hide flag"
msgstr "Revela a camada pela definição da bandeira de ocultação."
msgctxt "Operator"
msgid "Set Restrict View"
msgstr "Definir restrição de visualização"
msgid "Hide the layer by setting the hide flag"
msgstr "Oculta a camada definindo a bandeira de ocultação."
msgctxt "Operator"
msgid "Move Layer"
msgstr "Mover camada"
@@ -48266,10 +48262,6 @@ msgid "2D Cursor"
msgstr "Cursor 2D"
msgid "Active Point"
msgstr "Ponto ativo"
msgid "Predefined tracking camera intrinsics"
msgstr "Intrínsecos de câmara de rastreamento predefinidos."

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: Leandro Paganelli <leandrobp@fastmail.com>\n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\n"
"PO-Revision-Date: 2022-03-21 19:03-0300\n"
"Last-Translator: Leandro Paganelli <leandrobp@fastmail.com>\n"
"Language-Team: Leandro Paganelli, Ivan Paulos Tomé, Dalai Felinto, Bruno Gonçalves Pirajá, Samuel Arataca, Daniel Tavares, Moraes Junior <ivan.paulos.tome@yandex.com>\n"
@@ -22130,6 +22130,10 @@ msgid "Active spline of masking layer"
msgstr "Spline ativa da camada de máscara."
msgid "Active Point"
msgstr "Ponto ativo"
msgid "Alignment"
msgstr "Alinhamento"
@@ -38735,19 +38739,11 @@ msgid "Clear Restrict View"
msgstr "Limpar visualização restrita"
msgid "Reveal the layer by setting the hide flag"
msgstr "Revela a camada pela configuração da bandeira de ocultação."
msgctxt "Operator"
msgid "Set Restrict View"
msgstr "Configurar restrição de visualização"
msgid "Hide the layer by setting the hide flag"
msgstr "Oculta a camada configurando a bandeira de ocultação."
msgctxt "Operator"
msgid "Move Layer"
msgstr "Mover camada"
@@ -53035,10 +53031,6 @@ msgid "2D Cursor"
msgstr "Cursor 2D"
msgid "Active Point"
msgstr "Ponto ativo"
msgid "Predefined tracking camera intrinsics"
msgstr "Intrínsecos de câmera de rastreamento predefinidos."
@@ -68762,10 +68754,6 @@ msgid "View Name"
msgstr "Visualizar nomes"
msgid "3D Viewport Axis"
msgstr "Eixo da Janela de Exibição 3D"
msgid "Limit Size"
msgstr "Limitar texturas"

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\n"
"PO-Revision-Date: 2018-01-03 14:47+0000\n"
"Last-Translator: Lockal <lockalsash@gmail.com>, 2023\n"
"Language-Team: Russian (https://www.transifex.com/translateblender/teams/82039/ru/)\n"
@@ -29060,6 +29060,10 @@ msgid "Active spline of masking layer"
msgstr "Активный сплайн слоя маски"
msgid "Active Point"
msgstr "Активная точка"
msgid "Grease Pencil Color"
msgstr "Цвет Grease Pencil"
@@ -47215,19 +47219,11 @@ msgid "Clear Restrict View"
msgstr "Очистить ограничение просмотра"
msgid "Reveal the layer by setting the hide flag"
msgstr "Отобразить слой, установив переключатель скрытия"
msgctxt "Operator"
msgid "Set Restrict View"
msgstr "Установить ограничение просмотра"
msgid "Hide the layer by setting the hide flag"
msgstr "Скрыть слой, установив переключатель скрытия"
msgctxt "Operator"
msgid "Move Layer"
msgstr "Переместить слой"
@@ -63202,10 +63198,6 @@ msgid "2D Cursor"
msgstr "2D-курсор"
msgid "Active Point"
msgstr "Активная точка"
msgid "Predefined tracking camera intrinsics"
msgstr "Предопределённые характеристики отслеживаемой камеры"
@@ -67168,10 +67160,6 @@ msgid "Mini Axes Type"
msgstr "Тип миниосей"
msgid "Simple Axis"
msgstr "Простые оси"
msgid "Interactive Navigation"
msgstr "Интерактивная навигация"
@@ -83315,10 +83303,6 @@ msgid "View Name"
msgstr "Имена видов"
msgid "3D Viewport Axis"
msgstr "Оси 3D-вьюпорта"
msgid "Limit Size"
msgstr "Максимальный размер"

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\n"
"PO-Revision-Date: 2023-03-08 07:56+0100\n"
"Last-Translator: Jozef Matta <jozef.m923@gmail.com>\n"
"Language-Team: Jozef Matta\n"
@@ -33509,6 +33509,10 @@ msgid "Active spline of masking layer"
msgstr "Aktívna drážka vrstvy maskovania"
msgid "Active Point"
msgstr "Aktívny bod"
msgid "Grease Pencil Color"
msgstr "Farba pastelky"
@@ -44660,10 +44664,6 @@ msgid "Is Face Planar"
msgstr "Je plôška rovinná"
msgid "Retrieve whether all triangles in a face are on the same plane, i.e. whether have the same normal"
msgstr "Zisťuje, či sú všetky trojuholníky na plôške v rovnakej rovine, t. j. či majú rovnaký normál"
msgid "Face Neighbors"
msgstr "Susedné plôšky"
@@ -59919,19 +59919,11 @@ msgid "Clear Restrict View"
msgstr "Zmazať obmedzené zobrazenie"
msgid "Reveal the layer by setting the hide flag"
msgstr "Odhalí vrstvu nastavením príznaku skrytia"
msgctxt "Operator"
msgid "Set Restrict View"
msgstr "Nastaviť obmedzenie zobrazenia"
msgid "Hide the layer by setting the hide flag"
msgstr "Skryje vrstvu nastavením príznaku skrytia"
msgctxt "Operator"
msgid "Move Layer"
msgstr "Presunúť vrstvu"
@@ -81988,10 +81980,6 @@ msgid "2D Cursor"
msgstr "2D kurzor"
msgid "Active Point"
msgstr "Aktívny bod"
msgid "Predefined tracking camera intrinsics"
msgstr "Preddefinované snímanie vnútornej kamery"
@@ -87052,14 +87040,6 @@ msgid "Mini Axes Type"
msgstr "Typ mini osí"
msgid "Show a small rotating 3D axes in the top right corner of the 3D viewport"
msgstr "Zobrazí malé rotujúce 3D osi v pravom hornom rohu 3D záberu"
msgid "Simple Axis"
msgstr "Jednoduchá os"
msgid "Interactive Navigation"
msgstr "Interaktívna navigácia"
@@ -111428,10 +111408,6 @@ msgid "Playback Frame Rate (FPS)"
msgstr "Frekvencia prehrávania (sním/s)"
msgid "3D Viewport Axis"
msgstr "Osi 3D záberu"
msgid "Smooth Wires"
msgstr "Vyhladiť drôty"

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\n"
"PO-Revision-Date: 2012-09-07 22:32+0100\n"
"Last-Translator: Nikola Radovanovic <cobisimo@gmail.com>\n"
"Language-Team: Nikola Radovanovic\n"
@@ -9229,6 +9229,10 @@ msgid "Weight of the point"
msgstr "Тежина тачке"
msgid "Active Point"
msgstr "Активна тачка"
msgid "Alignment"
msgstr "Поравнање"
@@ -20914,10 +20918,6 @@ msgid "2D Cursor"
msgstr "2D курсор"
msgid "Active Point"
msgstr "Активна тачка"
msgid "Footage Settings"
msgstr "Подешавање видеа"

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\n"
"PO-Revision-Date: 2012-09-07 22:32+0100\n"
"Last-Translator: Nikola Radovanovic <cobisimo@gmail.com>\n"
"Language-Team: Nikola Radovanovic\n"
@@ -9229,6 +9229,10 @@ msgid "Weight of the point"
msgstr "Težina tačke"
msgid "Active Point"
msgstr "Aktivna tačka"
msgid "Alignment"
msgstr "Poravnanje"
@@ -20914,10 +20918,6 @@ msgid "2D Cursor"
msgstr "2D kursor"
msgid "Active Point"
msgstr "Aktivna tačka"
msgid "Footage Settings"
msgstr "Podešavanje videa"

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\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 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\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"

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\n"
"PO-Revision-Date: 2023-02-05 22:00+0300\n"
"Last-Translator: Emir SARI <emir_sari@îcloud.com>\n"
"Language-Team: Turkish <>\n"

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\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"
@@ -29651,6 +29651,10 @@ msgid "Active spline of masking layer"
msgstr "Активний сплайн шару маскування"
msgid "Active Point"
msgstr "Активна Точка"
msgid "Grease Pencil Color"
msgstr "Колір Нарисного Олівця"
@@ -51158,19 +51162,11 @@ msgid "Clear Restrict View"
msgstr "Зчистити обмеження видимості"
msgid "Reveal the layer by setting the hide flag"
msgstr "Виявити шар, знявши прапорець приховування"
msgctxt "Operator"
msgid "Set Restrict View"
msgstr "Встановити обмеження видимості"
msgid "Hide the layer by setting the hide flag"
msgstr "Приховати шар, встановивши прапорець приховування"
msgctxt "Operator"
msgid "Move Layer"
msgstr "Пересунути шар"
@@ -69963,10 +69959,6 @@ msgid "2D Cursor"
msgstr "2D-курсор"
msgid "Active Point"
msgstr "Активна Точка"
msgid "Predefined tracking camera intrinsics"
msgstr "Передустави простеження камери"
@@ -74387,10 +74379,6 @@ msgid "Mini Axes Type"
msgstr "Тип мініосей"
msgid "Simple Axis"
msgstr "Проста Вісь"
msgid "Interactive Navigation"
msgstr "Інтерактивна навігація"
@@ -93457,10 +93445,6 @@ msgid "View Name"
msgstr "Назва огляду"
msgid "3D Viewport Axis"
msgstr "Вісь 3D Оглядвікна"
msgid "Smooth Wires"
msgstr "Згладження Дротів"

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\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"
@@ -32828,6 +32828,10 @@ msgid "Active spline of masking layer"
msgstr "Mẫu cong hoạt động của lớp mặt nạ"
msgid "Active Point"
msgstr "Điểm Hoạt Động"
msgid "Grease Pencil Color"
msgstr "Màu Bút Sáp"
@@ -43645,10 +43649,6 @@ msgid "Is Face Planar"
msgstr "Mặt Là Mặt Phẳng"
msgid "Retrieve whether all triangles in a face are on the same plane, i.e. whether have the same normal"
msgstr "Rút thông tin về tất cả tam giác nằm trên cùng mặt phẳng, ví dụ: có cùnh pháp tuyến"
msgid "Face Neighbors"
msgstr "Kề Mặt"
@@ -58326,19 +58326,11 @@ msgid "Clear Restrict View"
msgstr "Xóa Hạn Chế Hiển Thị"
msgid "Reveal the layer by setting the hide flag"
msgstr "Hiện lớp bằng đặt cờ ẩn"
msgctxt "Operator"
msgid "Set Restrict View"
msgstr "Đặt Hạn Chế Hiển Thị"
msgid "Hide the layer by setting the hide flag"
msgstr "Ẩn lớp bằng đặt cờ ẩn"
msgctxt "Operator"
msgid "Move Layer"
msgstr "Di Chuyển Lớp"
@@ -79542,10 +79534,6 @@ msgid "2D Cursor"
msgstr "Con Trỏ 2D"
msgid "Active Point"
msgstr "Điểm Hoạt Động"
msgid "Predefined tracking camera intrinsics"
msgstr "Bản chất theo dõi máy quay phim được đặt sẵn"
@@ -84476,14 +84464,6 @@ msgid "Mini Axes Type"
msgstr "Loại Tiểu Trục"
msgid "Show a small rotating 3D axes in the top right corner of the 3D viewport"
msgstr "Cho xem một bộ trục 3D xoay trong góc trên phải của màn chiếu 3D"
msgid "Simple Axis"
msgstr "Trục Đơn Giản"
msgid "Interactive Navigation"
msgstr "Chuyển Hướng Tương Tác"
@@ -107456,10 +107436,6 @@ msgid "Playback Frame Rate (FPS)"
msgstr "Tốc Độ Hát Lại (Bức Ảnh/Giây)"
msgid "3D Viewport Axis"
msgstr "Trục Màn Chiếu 3D"
msgid "Smooth Wires"
msgstr "Sợi Dây Mịn"

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\n"
"PO-Revision-Date: \n"
"Last-Translator: DeathBlood\n"
"Language-Team: \n"
@@ -33498,6 +33498,10 @@ msgid "Active spline of masking layer"
msgstr "遮罩层活动样条"
msgid "Active Point"
msgstr "活动点"
msgid "Grease Pencil Color"
msgstr "蜡笔颜色"
@@ -44640,10 +44644,6 @@ msgid "Is Face Planar"
msgstr "面是否平直"
msgid "Retrieve whether all triangles in a face are on the same plane, i.e. whether have the same normal"
msgstr "检索面中的所有三角形是否在同一平面上,即是否具有相同的法向"
msgid "Face Neighbors"
msgstr "面的邻项"
@@ -59879,19 +59879,11 @@ msgid "Clear Restrict View"
msgstr "清除显示限制"
msgid "Reveal the layer by setting the hide flag"
msgstr "通过对隐藏标记进行设置, 恢复层的可见性"
msgctxt "Operator"
msgid "Set Restrict View"
msgstr "设置显示限制"
msgid "Hide the layer by setting the hide flag"
msgstr "通过设置隐藏标识来隐藏图层"
msgctxt "Operator"
msgid "Move Layer"
msgstr "移动层"
@@ -81867,10 +81859,6 @@ msgid "2D Cursor"
msgstr "2D 游标"
msgid "Active Point"
msgstr "活动点"
msgid "Predefined tracking camera intrinsics"
msgstr "预定义的轨迹摄像机内部参数"
@@ -86919,14 +86907,6 @@ msgid "Mini Axes Type"
msgstr "迷你坐标轴类型"
msgid "Show a small rotating 3D axes in the top right corner of the 3D viewport"
msgstr "在3D视图的左下角显示一个可旋转的小3D坐标轴"
msgid "Simple Axis"
msgstr "单一轴向"
msgid "Interactive Navigation"
msgstr "交互漫游"
@@ -111166,10 +111146,6 @@ msgid "Playback Frame Rate (FPS)"
msgstr "播放帧率(FPS)"
msgid "3D Viewport Axis"
msgstr "3D 视图轴向"
msgid "Smooth Wires"
msgstr "平滑线框"

View File

@@ -1,9 +1,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Blender 3.5.0 Beta (b'4096bcfb25f6')\n"
"Project-Id-Version: Blender 3.5.0 Beta (b'3962d9b931f1')\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 11:29:34\n"
"POT-Creation-Date: 2023-03-20 13:37:56\n"
"PO-Revision-Date: 2023-01-28 11:09+0800\n"
"Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
"Language-Team: Chinese (Traditional) <http://weblate.slat.org/projects/blender/blender/zh_Hant/>\n"
@@ -19148,6 +19148,10 @@ msgid "Weight of feather point"
msgstr "羽毛點的權重"
msgid "Active Point"
msgstr "作用中的點"
msgid "Alignment"
msgstr "對齊"
@@ -32215,19 +32219,11 @@ msgid "Clear Restrict View"
msgstr "清除限制視圖"
msgid "Reveal the layer by setting the hide flag"
msgstr "揭開設有隱藏旗幟的層"
msgctxt "Operator"
msgid "Set Restrict View"
msgstr "設定限制視圖"
msgid "Hide the layer by setting the hide flag"
msgstr "隱藏設有隱藏旗幟的層"
msgctxt "Operator"
msgid "Move Layer"
msgstr "移動層"
@@ -43722,10 +43718,6 @@ msgid "2D Cursor"
msgstr "2D 游標"
msgid "Active Point"
msgstr "作用中的點"
msgid "Predefined tracking camera intrinsics"
msgstr "預先定義的追蹤攝影機內在本質"
@@ -55612,10 +55604,6 @@ msgid "View Name"
msgstr "視圖名稱"
msgid "3D Viewport Axis"
msgstr "3D 視接口座標軸"
msgid "Limit Size"
msgstr "限制大小"

View File

@@ -113,9 +113,6 @@ if "%TEST%" == "1" (
goto EOF
)
call "%BLENDER_DIR%\build_files\windows\check_submodules.cmd"
if errorlevel 1 goto EOF
if "%BUILD_WITH_NINJA%" == "" (
call "%BLENDER_DIR%\build_files\windows\configure_msbuild.cmd"
if errorlevel 1 goto EOF

View File

@@ -66,8 +66,8 @@ const UserDef U_default = {
/** Default so DPI is detected automatically. */
.dpi = 0,
.dpi_fac = 0.0,
.inv_dpi_fac = 0.0, /* run-time. */
.scale_factor = 0.0,
.inv_scale_factor = 0.0, /* run-time. */
.pixelsize = 1,
.virtual_pixel = 0,

View File

@@ -389,6 +389,8 @@ class NODE_MT_geometry_node_GEO_MESH_OPERATIONS(Menu):
node_add_menu.add_node_type(layout, "GeometryNodeMeshBoolean")
node_add_menu.add_node_type(layout, "GeometryNodeMeshToCurve")
node_add_menu.add_node_type(layout, "GeometryNodeMeshToPoints")
if _context.preferences.experimental.use_new_volume_nodes:
node_add_menu.add_node_type(layout, "GeometryNodeMeshToSDFVolume")
node_add_menu.add_node_type(layout, "GeometryNodeMeshToVolume")
node_add_menu.add_node_type(layout, "GeometryNodeScaleElements")
node_add_menu.add_node_type(layout, "GeometryNodeSplitEdges")
@@ -453,6 +455,8 @@ class NODE_MT_category_GEO_POINT(Menu):
layout.separator()
node_add_menu.add_node_type(layout, "GeometryNodePoints")
node_add_menu.add_node_type(layout, "GeometryNodePointsToVertices")
if _context.preferences.experimental.use_new_volume_nodes:
node_add_menu.add_node_type(layout, "GeometryNodePointsToSDFVolume")
node_add_menu.add_node_type(layout, "GeometryNodePointsToVolume")
layout.separator()
node_add_menu.add_node_type(layout, "GeometryNodeSetPointRadius")
@@ -604,6 +608,11 @@ class NODE_MT_category_GEO_VOLUME(Menu):
layout = self.layout
node_add_menu.add_node_type(layout, "GeometryNodeVolumeCube")
node_add_menu.add_node_type(layout, "GeometryNodeVolumeToMesh")
if _context.preferences.experimental.use_new_volume_nodes:
layout.separator()
node_add_menu.add_node_type(layout, "GeometryNodeMeanFilterSDFVolume")
node_add_menu.add_node_type(layout, "GeometryNodeOffsetSDFVolume")
node_add_menu.add_node_type(layout, "GeometryNodeSDFVolumeSphere")
node_add_menu.draw_assets_for_catalog(layout, self.bl_label)

View File

@@ -25,6 +25,7 @@ class AssetIdentifier {
AssetIdentifier(const AssetIdentifier &) = default;
std::string full_path() const;
std::string full_library_path() const;
};
} // namespace blender::asset_system

View File

@@ -21,6 +21,8 @@ const char *AS_asset_representation_name_get(const AssetRepresentation *asset)
ATTR_WARN_UNUSED_RESULT;
AssetMetaData *AS_asset_representation_metadata_get(const AssetRepresentation *asset)
ATTR_WARN_UNUSED_RESULT;
struct ID *AS_asset_representation_local_id_get(const AssetRepresentation *asset)
ATTR_WARN_UNUSED_RESULT;
bool AS_asset_representation_is_local_id(const AssetRepresentation *asset) ATTR_WARN_UNUSED_RESULT;
bool AS_asset_representation_is_never_link(const AssetRepresentation *asset)
ATTR_WARN_UNUSED_RESULT;

View File

@@ -82,6 +82,9 @@ class AssetRepresentation {
* #get_import_method(). Also returns true if there is no predefined import method
* (when #get_import_method() returns no value). */
bool may_override_import_method() const;
/** If this asset is stored inside this current file (#is_local_id() is true), this returns the
* ID's pointer, otherwise null. */
ID *local_id() const;
/** Returns if this asset is stored inside this current file, and as such fully editable. */
bool is_local_id() const;
const AssetLibrary &owner_asset_library() const;
@@ -92,7 +95,11 @@ class AssetRepresentation {
/* C-Handle */
struct AssetRepresentation;
const std::string AS_asset_representation_full_path_get(const ::AssetRepresentation *asset);
std::string AS_asset_representation_full_path_get(const ::AssetRepresentation *asset);
/** Get the absolute path to the .blend file containing the given asset. String will be empty if
* the asset could not be mapped to a valid .blend file path. Valid in this case also means that
* the file needs to exist on disk. */
std::string AS_asset_representation_full_library_path_get(const ::AssetRepresentation *asset);
std::optional<eAssetImportMethod> AS_asset_representation_import_method_get(
const ::AssetRepresentation *asset_handle);
bool AS_asset_representation_may_override_import_method(const ::AssetRepresentation *asset_handle);

View File

@@ -4,8 +4,11 @@
* \ingroup asset_system
*/
#include <string>
#include "BKE_blendfile.h"
#include "BLI_path_util.h"
#include <iostream>
#include "AS_asset_identifier.hh"
@@ -24,4 +27,16 @@ std::string AssetIdentifier::full_path() const
return path;
}
std::string AssetIdentifier::full_library_path() const
{
std::string asset_path = full_path();
char blend_path[1090 /*FILE_MAX_LIBEXTRA*/];
if (!BKE_blendfile_library_path_explode(asset_path.c_str(), blend_path, nullptr, nullptr)) {
return {};
}
return blend_path;
}
} // namespace blender::asset_system

View File

@@ -97,6 +97,11 @@ bool AssetRepresentation::may_override_import_method() const
return owner_asset_library_->may_override_import_method_;
}
ID *AssetRepresentation::local_id() const
{
return is_local_id_ ? local_asset_id_ : nullptr;
}
bool AssetRepresentation::is_local_id() const
{
return is_local_id_;
@@ -111,7 +116,7 @@ const AssetLibrary &AssetRepresentation::owner_asset_library() const
using namespace blender;
const std::string AS_asset_representation_full_path_get(const AssetRepresentation *asset_handle)
std::string AS_asset_representation_full_path_get(const AssetRepresentation *asset_handle)
{
const asset_system::AssetRepresentation *asset =
reinterpret_cast<const asset_system::AssetRepresentation *>(asset_handle);
@@ -119,6 +124,13 @@ const std::string AS_asset_representation_full_path_get(const AssetRepresentatio
return identifier.full_path();
}
std::string AS_asset_representation_full_library_path_get(const AssetRepresentation *asset_handle)
{
const asset_system::AssetRepresentation *asset =
reinterpret_cast<const asset_system::AssetRepresentation *>(asset_handle);
return asset->get_identifier().full_library_path();
}
std::optional<eAssetImportMethod> AS_asset_representation_import_method_get(
const AssetRepresentation *asset_handle)
{
@@ -152,6 +164,13 @@ AssetMetaData *AS_asset_representation_metadata_get(const AssetRepresentation *a
return &asset->get_metadata();
}
ID *AS_asset_representation_local_id_get(const AssetRepresentation *asset_handle)
{
const asset_system::AssetRepresentation *asset =
reinterpret_cast<const asset_system::AssetRepresentation *>(asset_handle);
return asset->local_id();
}
bool AS_asset_representation_is_local_id(const AssetRepresentation *asset_handle)
{
const asset_system::AssetRepresentation *asset =

View File

@@ -45,7 +45,7 @@ int BLF_set_default(void)
{
ASSERT_DEFAULT_SET;
BLF_size(global_font_default, global_font_size * U.dpi_fac);
BLF_size(global_font_default, global_font_size * UI_SCALE_FAC);
return global_font_default;
}
@@ -53,7 +53,7 @@ int BLF_set_default(void)
void BLF_draw_default(float x, float y, float z, const char *str, const size_t str_len)
{
ASSERT_DEFAULT_SET;
BLF_size(global_font_default, global_font_size * U.dpi_fac);
BLF_size(global_font_default, global_font_size * UI_SCALE_FAC);
BLF_position(global_font_default, x, y, z);
BLF_draw(global_font_default, str, str_len);
}

View File

@@ -29,7 +29,7 @@
* It's mostly used for modifiers, and has the advantages of not taking much
* resources.
*
* BMesh is a full-on brep, used for editmode, some modifiers, etc. It's much
* BMesh is a full-on BREP, used for edit-mode, some modifiers, etc. It's much
* more capable (if memory-intensive) then CDDM.
*
* DerivedMesh is somewhat hackish. Many places assumes that a DerivedMesh is
@@ -129,7 +129,8 @@ struct DerivedMesh {
*/
float *(*getVertArray)(DerivedMesh *dm);
struct MEdge *(*getEdgeArray)(DerivedMesh *dm);
struct MLoop *(*getLoopArray)(DerivedMesh *dm);
int *(*getCornerVertArray)(DerivedMesh *dm);
int *(*getCornerEdgeArray)(DerivedMesh *dm);
struct MPoly *(*getPolyArray)(DerivedMesh *dm);
/** Copy all verts/edges/faces from the derived mesh into
@@ -137,7 +138,8 @@ struct DerivedMesh {
*/
void (*copyVertArray)(DerivedMesh *dm, float (*r_positions)[3]);
void (*copyEdgeArray)(DerivedMesh *dm, struct MEdge *r_edge);
void (*copyLoopArray)(DerivedMesh *dm, struct MLoop *r_loop);
void (*copyCornerVertArray)(DerivedMesh *dm, int *r_corner_verts);
void (*copyCornerEdgeArray)(DerivedMesh *dm, int *r_corner_edges);
void (*copyPolyArray)(DerivedMesh *dm, struct MPoly *r_poly);
/** Return a pointer to the entire array of vert/edge/face custom data

View File

@@ -19,6 +19,32 @@ struct ReportList;
struct UserDef;
struct bContext;
/**
* Check whether given path ends with a blend file compatible extension
* (`.blend`, `.ble` or `.blend.gz`).
*
* \param str: The path to check.
* \return true is this path ends with a blender file extension.
*/
bool BKE_blendfile_extension_check(const char *str);
/**
* Try to explode given path into its 'library components'
* (i.e. a .blend file, id type/group, and data-block itself).
*
* \param path: the full path to explode.
* \param r_dir: the string that'll contain path up to blend file itself ('library' path).
* WARNING! Must be at least #FILE_MAX_LIBEXTRA long (it also stores group and name strings)!
* \param r_group: a pointer within `r_dir` to the 'group' part of the path, if any ('\0'
* terminated). May be NULL.
* \param r_name: a pointer within `r_dir` to the data-block name, if any ('\0' terminated). May be
* NULL.
* \return true if path contains a blend file.
*/
bool BKE_blendfile_library_path_explode(const char *path,
char *r_dir,
char **r_group,
char **r_name);
/**
* Shared setup function that makes the data from `bfd` into the current blend file,
* replacing the contents of #G.main.

View File

@@ -61,7 +61,7 @@ typedef struct BVHTreeFromMesh {
const float (*vert_positions)[3];
const struct MEdge *edge;
const struct MFace *face;
const struct MLoop *loop;
const int *corner_verts;
const struct MLoopTri *looptri;
/* Private data */
@@ -181,7 +181,7 @@ BVHTree *bvhtree_from_editmesh_looptri_ex(BVHTreeFromEditMesh *data,
*/
BVHTree *bvhtree_from_mesh_looptri_ex(struct BVHTreeFromMesh *data,
const float (*vert_positions)[3],
const struct MLoop *mloop,
const int *corner_verts,
const struct MLoopTri *looptri,
int looptri_num,
blender::BitSpan mask,

View File

@@ -381,6 +381,8 @@ bool CTX_data_editable_gpencil_strokes(const bContext *C, ListBase *list);
const struct AssetLibraryReference *CTX_wm_asset_library_ref(const bContext *C);
struct AssetHandle CTX_wm_asset_handle(const bContext *C, bool *r_is_valid);
struct AssetRepresentation *CTX_wm_asset(const bContext *C);
bool CTX_wm_interface_locked(const bContext *C);
/**

View File

@@ -486,6 +486,8 @@ const char *CustomData_get_active_layer_name(const struct CustomData *data, int
*/
const char *CustomData_get_render_layer_name(const struct CustomData *data, int type);
bool CustomData_layer_is_anonymous(const struct CustomData *data, int type, int n);
void CustomData_bmesh_set(const struct CustomData *data,
void *block,
int type,

View File

@@ -18,7 +18,6 @@ struct ID;
struct ListBase;
struct MDeformVert;
struct MEdge;
struct MLoop;
struct MPoly;
struct Object;
struct bDeformGroup;
@@ -270,14 +269,14 @@ void BKE_defvert_extract_vgroup_to_edgeweights(const struct MDeformVert *dvert,
void BKE_defvert_extract_vgroup_to_loopweights(const struct MDeformVert *dvert,
int defgroup,
int verts_num,
const struct MLoop *loops,
const int *corner_verts,
int loops_num,
bool invert_vgroup,
float *r_weights);
void BKE_defvert_extract_vgroup_to_polyweights(const struct MDeformVert *dvert,
int defgroup,
int verts_num,
const struct MLoop *loops,
const int *corner_verts,
int loops_num,
const struct MPoly *polys,
int polys_num,

View File

@@ -44,7 +44,7 @@ typedef struct CfraElem {
/* ************** F-Curve Modifiers *************** */
/**
* F-Curve Modifier Type-Info (fmi):
* F-Curve Modifier Type-Info (`fmi`):
* This struct provides function pointers for runtime, so that functions can be
* written more generally (with fewer/no special exceptions for various modifiers).
*

View File

@@ -33,7 +33,6 @@ struct MDeformVert;
struct MDisps;
struct MEdge;
struct MFace;
struct MLoop;
struct MLoopTri;
struct MPoly;
struct Main;
@@ -109,14 +108,14 @@ void BKE_mesh_ensure_default_orig_index_customdata_no_check(struct Mesh *mesh);
* Find the index of the loop in 'poly' which references vertex,
* returns -1 if not found
*/
int poly_find_loop_from_vert(const struct MPoly *poly, const struct MLoop *loopstart, int vert);
int poly_find_loop_from_vert(const struct MPoly *poly, const int *poly_verts, int vert);
/**
* Fill \a r_adj with the loop indices in \a poly adjacent to the
* vertex. Returns the index of the loop matching vertex, or -1 if the
* vertex is not in \a poly
*/
int poly_get_adj_loops_from_vert(const struct MPoly *poly,
const struct MLoop *mloop,
const int *corner_verts,
int vert,
int r_adj[2]);
@@ -129,8 +128,9 @@ int BKE_mesh_edge_other_vert(const struct MEdge *e, int v);
* Sets each output array element to the edge index if it is a real edge, or -1.
*/
void BKE_mesh_looptri_get_real_edges(const struct MEdge *edges,
const struct MLoop *loops,
const struct MLoopTri *looptri,
const int *corner_verts,
const int *corner_edges,
const struct MLoopTri *tri,
int r_edges[3]);
/**
@@ -312,7 +312,7 @@ void BKE_mesh_vert_coords_apply(struct Mesh *mesh, const float (*vert_coords)[3]
/**
* Calculate tessellation into #MLoopTri which exist only for this purpose.
*/
void BKE_mesh_recalc_looptri(const struct MLoop *mloop,
void BKE_mesh_recalc_looptri(const int *corner_verts,
const struct MPoly *polys,
const float (*vert_positions)[3],
int totvert,
@@ -384,7 +384,7 @@ bool BKE_mesh_vert_normals_are_dirty(const struct Mesh *mesh);
*/
bool BKE_mesh_poly_normals_are_dirty(const struct Mesh *mesh);
void BKE_mesh_calc_poly_normal(const struct MLoop *poly_loops,
void BKE_mesh_calc_poly_normal(const int *poly_verts,
int poly_size,
const float (*vert_positions)[3],
int verts_num,
@@ -430,7 +430,7 @@ enum {
* Collection of #MLoopNorSpace basic storage & pre-allocation.
*/
typedef struct MLoopNorSpaceArray {
MLoopNorSpace **lspacearr; /* MLoop aligned array */
MLoopNorSpace **lspacearr; /* Face corner aligned array */
struct LinkNode
*loops_pool; /* Allocated once, avoids to call BLI_linklist_prepend_arena() for each loop! */
char data_type; /* Whether we store loop indices, or pointers to BMLoop. */
@@ -505,7 +505,7 @@ void BKE_lnor_space_custom_normal_to_data(const MLoopNorSpace *lnor_space,
* \param r_vert_clnors: The (already allocated) array where to store averaged per-vertex normals.
*/
void BKE_mesh_normals_loop_to_vertex(int numVerts,
const struct MLoop *mloops,
const int *corner_verts,
int numLoops,
const float (*clnors)[3],
float (*r_vert_clnors)[3]);
@@ -546,12 +546,12 @@ void BKE_mesh_set_custom_normals_from_verts(struct Mesh *mesh, float (*r_custom_
/* *** mesh_evaluate.cc *** */
void BKE_mesh_calc_poly_center(const struct MLoop *poly_loops,
void BKE_mesh_calc_poly_center(const int *poly_verts,
int poly_size,
const float (*vert_positions)[3],
int verts_num,
float r_cent[3]);
float BKE_mesh_calc_poly_area(const struct MLoop *poly_loops,
float BKE_mesh_calc_poly_area(const int *poly_verts,
int poly_size,
const float (*vert_positions)[3],
int verts_num);
@@ -581,12 +581,12 @@ void BKE_mesh_calc_volume(const float (*vert_positions)[3],
int mverts_num,
const struct MLoopTri *mlooptri,
int looptri_num,
const struct MLoop *mloop,
const int *corner_verts,
float *r_volume,
float r_center[3]);
/**
* Flip a single MLoop's #MDisps structure,
* Flip a single corner's #MDisps structure,
* low level function to be called from face-flipping code which re-arranged the mdisps themselves.
*/
void BKE_mesh_mdisp_flip(struct MDisps *md, bool use_loop_mdisp_flip);
@@ -600,13 +600,15 @@ void BKE_mesh_mdisp_flip(struct MDisps *md, bool use_loop_mdisp_flip);
* \param ldata: the loops custom data.
*/
void BKE_mesh_polygon_flip_ex(const struct MPoly *poly,
struct MLoop *mloop,
int *corner_verts,
int *corner_edges,
struct CustomData *ldata,
float (*lnors)[3],
struct MDisps *mdisp,
bool use_loop_mdisp_flip);
void BKE_mesh_polygon_flip(const struct MPoly *poly,
struct MLoop *mloop,
int *corner_verts,
int *corner_edges,
struct CustomData *ldata,
int totloop);
/**
@@ -615,7 +617,8 @@ void BKE_mesh_polygon_flip(const struct MPoly *poly,
* \note Invalidates tessellation, caller must handle that.
*/
void BKE_mesh_polys_flip(const struct MPoly *polys,
struct MLoop *mloop,
int *corner_verts,
int *corner_edges,
struct CustomData *ldata,
int totpoly);
@@ -652,7 +655,7 @@ void BKE_mesh_flush_select_from_verts(struct Mesh *me);
*/
void BKE_mesh_calc_relative_deform(const struct MPoly *polys,
int totpoly,
const struct MLoop *mloop,
const int *corner_verts,
int totvert,
const float (*vert_cos_src)[3],
@@ -702,7 +705,8 @@ bool BKE_mesh_validate_arrays(struct Mesh *me,
unsigned int totedge,
struct MFace *mfaces,
unsigned int totface,
struct MLoop *mloops,
int *corner_verts,
int *corner_edges,
unsigned int totloop,
struct MPoly *polys,
unsigned int totpoly,
@@ -819,13 +823,24 @@ BLI_INLINE MPoly *BKE_mesh_polys_for_write(Mesh *mesh)
return (MPoly *)CustomData_get_layer_for_write(&mesh->pdata, CD_MPOLY, mesh->totpoly);
}
BLI_INLINE const MLoop *BKE_mesh_loops(const Mesh *mesh)
BLI_INLINE const int *BKE_mesh_corner_verts(const Mesh *mesh)
{
return (const MLoop *)CustomData_get_layer(&mesh->ldata, CD_MLOOP);
return (const int *)CustomData_get_layer_named(&mesh->ldata, CD_PROP_INT32, ".corner_vert");
}
BLI_INLINE MLoop *BKE_mesh_loops_for_write(Mesh *mesh)
BLI_INLINE int *BKE_mesh_corner_verts_for_write(Mesh *mesh)
{
return (MLoop *)CustomData_get_layer_for_write(&mesh->ldata, CD_MLOOP, mesh->totloop);
return (int *)CustomData_get_layer_named_for_write(
&mesh->ldata, CD_PROP_INT32, ".corner_vert", mesh->totloop);
}
BLI_INLINE const int *BKE_mesh_corner_edges(const Mesh *mesh)
{
return (const int *)CustomData_get_layer_named(&mesh->ldata, CD_PROP_INT32, ".corner_edge");
}
BLI_INLINE int *BKE_mesh_corner_edges_for_write(Mesh *mesh)
{
return (int *)CustomData_get_layer_named_for_write(
&mesh->ldata, CD_PROP_INT32, ".corner_edge", mesh->totloop);
}
BLI_INLINE const MDeformVert *BKE_mesh_deform_verts(const Mesh *mesh)

View File

@@ -15,14 +15,14 @@ namespace blender::bke::mesh {
* \{ */
/** Calculate the up direction for the polygon, depending on its winding direction. */
float3 poly_normal_calc(Span<float3> vert_positions, Span<MLoop> poly_loops);
float3 poly_normal_calc(Span<float3> vert_positions, Span<int> poly_verts);
/**
* Calculate tessellation into #MLoopTri which exist only for this purpose.
*/
void looptris_calc(Span<float3> vert_positions,
Span<MPoly> polys,
Span<MLoop> loops,
Span<int> corner_verts,
MutableSpan<MLoopTri> looptris);
/**
* A version of #looptris_calc which takes pre-calculated polygon normals
@@ -33,19 +33,19 @@ void looptris_calc(Span<float3> vert_positions,
*/
void looptris_calc_with_normals(Span<float3> vert_positions,
Span<MPoly> polys,
Span<MLoop> loops,
Span<int> corner_verts,
Span<float3> poly_normals,
MutableSpan<MLoopTri> looptris);
/** Calculate the average position of the vertices in the polygon. */
float3 poly_center_calc(Span<float3> vert_positions, Span<MLoop> poly_loops);
float3 poly_center_calc(Span<float3> vert_positions, Span<int> poly_verts);
/** Calculate the surface area of the polygon described by the indexed vertices. */
float poly_area_calc(Span<float3> vert_positions, Span<MLoop> poly_loops);
float poly_area_calc(Span<float3> vert_positions, Span<int> poly_verts);
/** Calculate the angles at each of the polygons corners. */
void poly_angles_calc(Span<float3> vert_positions,
Span<MLoop> poly_loops,
Span<int> poly_verts,
MutableSpan<float> angles);
/** \} */
@@ -62,7 +62,7 @@ void poly_angles_calc(Span<float3> vert_positions,
*/
void normals_calc_polys(Span<float3> vert_positions,
Span<MPoly> polys,
Span<MLoop> loops,
Span<int> corner_verts,
MutableSpan<float3> poly_normals);
/**
@@ -73,7 +73,7 @@ void normals_calc_polys(Span<float3> vert_positions,
*/
void normals_calc_poly_vert(Span<float3> vert_positions,
Span<MPoly> polys,
Span<MLoop> loops,
Span<int> corner_verts,
MutableSpan<float3> poly_normals,
MutableSpan<float3> vert_normals);
@@ -82,14 +82,15 @@ void normals_calc_poly_vert(Span<float3> vert_positions,
* Useful to materialize sharp edges (or non-smooth faces) without actually modifying the geometry
* (splitting edges).
*
* \param loop_to_poly_map: Optional pre-created map from loops to their polygon.
* \param loop_to_poly_map: Optional pre-created map from corners to their polygon.
* \param sharp_edges: Optional array of sharp edge tags, used to split the evaluated normals on
* each side of the edge.
*/
void normals_calc_loop(Span<float3> vert_positions,
Span<MEdge> edges,
Span<MPoly> polys,
Span<MLoop> loops,
Span<int> corner_verts,
Span<int> corner_edges,
Span<int> loop_to_poly_map,
Span<float3> vert_normals,
Span<float3> poly_normals,
@@ -104,7 +105,8 @@ void normals_calc_loop(Span<float3> vert_positions,
void normals_loop_custom_set(Span<float3> vert_positions,
Span<MEdge> edges,
Span<MPoly> polys,
Span<MLoop> loops,
Span<int> corner_verts,
Span<int> corner_edges,
Span<float3> vert_normals,
Span<float3> poly_normals,
const bool *sharp_faces,
@@ -115,7 +117,8 @@ void normals_loop_custom_set(Span<float3> vert_positions,
void normals_loop_custom_set_from_verts(Span<float3> vert_positions,
Span<MEdge> edges,
Span<MPoly> polys,
Span<MLoop> loops,
Span<int> corner_verts,
Span<int> corner_edges,
Span<float3> vert_normals,
Span<float3> poly_normals,
const bool *sharp_faces,
@@ -132,7 +135,8 @@ void normals_loop_custom_set_from_verts(Span<float3> vert_positions,
* \param sharp_faces: Optional array used to mark specific faces for sharp shading.
*/
void edges_sharp_from_angle_set(Span<MPoly> polys,
Span<MLoop> loops,
Span<int> corner_verts,
Span<int> corner_edges,
Span<float3> poly_normals,
const bool *sharp_faces,
const float split_angle,
@@ -174,13 +178,22 @@ inline blender::MutableSpan<MPoly> Mesh::polys_for_write()
return {BKE_mesh_polys_for_write(this), this->totpoly};
}
inline blender::Span<MLoop> Mesh::loops() const
inline blender::Span<int> Mesh::corner_verts() const
{
return {BKE_mesh_loops(this), this->totloop};
return {BKE_mesh_corner_verts(this), this->totloop};
}
inline blender::MutableSpan<MLoop> Mesh::loops_for_write()
inline blender::MutableSpan<int> Mesh::corner_verts_for_write()
{
return {BKE_mesh_loops_for_write(this), this->totloop};
return {BKE_mesh_corner_verts_for_write(this), this->totloop};
}
inline blender::Span<int> Mesh::corner_edges() const
{
return {BKE_mesh_corner_edges(this), this->totloop};
}
inline blender::MutableSpan<int> Mesh::corner_edges_for_write()
{
return {BKE_mesh_corner_edges_for_write(this), this->totloop};
}
inline blender::Span<MDeformVert> Mesh::deform_verts() const

View File

@@ -112,8 +112,15 @@ struct MVert *BKE_mesh_legacy_convert_positions_to_verts(
void BKE_mesh_legacy_convert_verts_to_positions(Mesh *mesh);
struct MLoop *BKE_mesh_legacy_convert_corners_to_loops(
Mesh *mesh,
blender::ResourceScope &temp_arrays_for_convert,
blender::Vector<CustomDataLayer, 16> &loop_layers_to_write);
#endif
void BKE_mesh_legacy_convert_loops_to_corners(struct Mesh *mesh);
/**
* Recreate #MFace Tessellation.
*

View File

@@ -15,7 +15,6 @@ extern "C" {
#endif
struct MEdge;
struct MLoop;
struct MLoopTri;
struct MPoly;
@@ -104,7 +103,7 @@ typedef struct MeshElemMap {
UvVertMap *BKE_mesh_uv_vert_map_create(const struct MPoly *polys,
const bool *hide_poly,
const bool *select_poly,
const struct MLoop *mloop,
const int *corner_verts,
const float (*mloopuv)[2],
unsigned int totpoly,
unsigned int totvert,
@@ -122,7 +121,7 @@ void BKE_mesh_uv_vert_map_free(UvVertMap *vmap);
void BKE_mesh_vert_poly_map_create(MeshElemMap **r_map,
int **r_mem,
const struct MPoly *polys,
const struct MLoop *mloop,
const int *corner_verts,
int totvert,
int totpoly,
int totloop);
@@ -134,7 +133,7 @@ void BKE_mesh_vert_poly_map_create(MeshElemMap **r_map,
void BKE_mesh_vert_loop_map_create(MeshElemMap **r_map,
int **r_mem,
const struct MPoly *polys,
const struct MLoop *mloop,
const int *corner_verts,
int totvert,
int totpoly,
int totloop);
@@ -148,7 +147,7 @@ void BKE_mesh_vert_looptri_map_create(MeshElemMap **r_map,
int totvert,
const struct MLoopTri *mlooptri,
int totlooptri,
const struct MLoop *mloop,
const int *corner_verts,
int totloop);
/**
* Generates a map where the key is the vertex and the value
@@ -173,7 +172,7 @@ void BKE_mesh_edge_loop_map_create(MeshElemMap **r_map,
int totedge,
const struct MPoly *polys,
int totpoly,
const struct MLoop *mloop,
const int *corner_edges,
int totloop);
/**
* Generates a map where the key is the edge and the value
@@ -185,7 +184,7 @@ void BKE_mesh_edge_poly_map_create(MeshElemMap **r_map,
int totedge,
const struct MPoly *polys,
int totpoly,
const struct MLoop *mloop,
const int *corner_edges,
int totloop);
/**
* This function creates a map so the source-data (vert/edge/loop/poly)
@@ -263,7 +262,8 @@ typedef bool (*MeshRemapIslandsCalc)(const float (*vert_positions)[3],
const bool *uv_seams,
const struct MPoly *polys,
int totpoly,
const struct MLoop *loops,
const int *corner_verts,
const int *corner_edges,
int totloop,
struct MeshIslandStore *r_island_store);
@@ -281,7 +281,8 @@ bool BKE_mesh_calc_islands_loop_poly_edgeseam(const float (*vert_positions)[3],
const bool *uv_seams,
const struct MPoly *polys,
int totpoly,
const struct MLoop *loops,
const int *corner_verts,
const int *corner_edges,
int totloop,
MeshIslandStore *r_island_store);
@@ -305,7 +306,8 @@ bool BKE_mesh_calc_islands_loop_poly_uvmap(float (*vert_positions)[3],
const bool *uv_seams,
struct MPoly *polys,
int totpoly,
struct MLoop *loops,
const int *corner_verts,
const int *corner_edges,
int totloop,
const float (*luvs)[2],
MeshIslandStore *r_island_store);
@@ -321,7 +323,7 @@ bool BKE_mesh_calc_islands_loop_poly_uvmap(float (*vert_positions)[3],
int *BKE_mesh_calc_smoothgroups(int totedge,
const struct MPoly *polys,
int totpoly,
const struct MLoop *mloop,
const int *corner_edges,
int totloop,
const bool *sharp_edges,
const bool *sharp_faces,
@@ -351,11 +353,15 @@ namespace blender::bke::mesh_topology {
Array<int> build_loop_to_poly_map(Span<MPoly> polys, int loops_num);
Array<Vector<int>> build_vert_to_edge_map(Span<MEdge> edges, int verts_num);
Array<Vector<int>> build_vert_to_poly_map(Span<MPoly> polys, Span<MLoop> loops, int verts_num);
Array<Vector<int>> build_vert_to_loop_map(Span<MLoop> loops, int verts_num);
Array<Vector<int>> build_edge_to_loop_map(Span<MLoop> loops, int edges_num);
Array<Vector<int, 2>> build_edge_to_poly_map(Span<MPoly> polys, Span<MLoop> loops, int edges_num);
Vector<Vector<int>> build_edge_to_loop_map_resizable(Span<MLoop> loops, int edges_num);
Array<Vector<int>> build_vert_to_poly_map(Span<MPoly> polys,
Span<int> corner_verts,
int verts_num);
Array<Vector<int>> build_vert_to_loop_map(Span<int> corner_verts, int verts_num);
Array<Vector<int>> build_edge_to_loop_map(Span<int> corner_edges, int edges_num);
Array<Vector<int, 2>> build_edge_to_poly_map(Span<MPoly> polys,
Span<int> corner_edges,
int edges_num);
Vector<Vector<int>> build_edge_to_loop_map_resizable(Span<int> corner_edges, int edges_num);
inline int poly_loop_prev(const MPoly &poly, int loop_i)
{

View File

@@ -202,7 +202,8 @@ void BKE_mesh_remap_calc_loops_from_mesh(int mode,
int numverts_dst,
const struct MEdge *edges_dst,
int numedges_dst,
const struct MLoop *loops_dst,
const int *corner_verts_dst,
const int *corner_edges_dst,
int numloops_dst,
const struct MPoly *polys_dst,
int numpolys_dst,
@@ -222,7 +223,7 @@ void BKE_mesh_remap_calc_polys_from_mesh(int mode,
const struct Mesh *mesh_dst,
const float (*vert_positions_dst)[3],
int numverts_dst,
const struct MLoop *loops_dst,
const int *corner_verts,
const struct MPoly *polys_dst,
int numpolys_dst,
struct Mesh *me_src,

View File

@@ -17,7 +17,6 @@ extern "C" {
struct CustomData_MeshMasks;
struct Depsgraph;
struct KeyBlock;
struct MLoop;
struct MLoopTri;
struct MVertTri;
struct Mesh;
@@ -63,7 +62,7 @@ void BKE_mesh_runtime_clear_cache(struct Mesh *mesh);
* Convert triangles encoded as face corner indices to triangles encoded as vertex indices.
*/
void BKE_mesh_runtime_verttri_from_looptri(struct MVertTri *r_verttri,
const struct MLoop *mloop,
const int *corner_verts,
const struct MLoopTri *looptri,
int looptri_num);

View File

@@ -128,7 +128,7 @@ int sample_surface_points_projected(
Vector<float3> &r_positions);
float3 compute_bary_coord_in_triangle(Span<float3> vert_positions,
Span<MLoop> loops,
Span<int> corner_verts,
const MLoopTri &looptri,
const float3 &position);

View File

@@ -20,7 +20,7 @@ struct ReportList;
*/
void BKE_mesh_calc_loop_tangent_single_ex(const float (*vert_positions)[3],
int numVerts,
const struct MLoop *mloops,
const int *corner_verts,
float (*r_looptangent)[4],
const float (*loop_normals)[3],
const float (*loopuv)[2],
@@ -45,7 +45,7 @@ void BKE_mesh_calc_loop_tangent_single(struct Mesh *mesh,
void BKE_mesh_calc_loop_tangent_ex(const float (*vert_positions)[3],
const struct MPoly *polys,
uint polys_len,
const struct MLoop *mloop,
const int *corner_verts,
const struct MLoopTri *looptri,
uint looptri_len,
const bool *sharp_faces,

View File

@@ -49,7 +49,7 @@ typedef enum eMeshBatchDirtyMode {
/** #MeshRuntime.wrapper_type */
typedef enum eMeshWrapperType {
/** Use mesh data (#Mesh.vert_positions(), #Mesh.medge, #Mesh.mloop, #Mesh.mpoly). */
/** Use mesh data (#Mesh.vert_positions(), #Mesh.medge, #Mesh.corner_verts(), #Mesh.mpoly). */
ME_WRAPPER_TYPE_MDATA = 0,
/** Use edit-mesh data (#Mesh.edit_mesh, #MeshRuntime.edit_data). */
ME_WRAPPER_TYPE_BMESH = 1,

View File

@@ -24,6 +24,7 @@ struct Object;
struct Scene;
struct SubdivCCG;
struct MLoopTri;
struct MPoly;
/**

View File

@@ -1558,6 +1558,11 @@ void BKE_nodetree_remove_layer_n(struct bNodeTree *ntree, struct Scene *scene, i
#define GEO_NODE_IMAGE 1191
#define GEO_NODE_INTERPOLATE_CURVES 1192
#define GEO_NODE_EDGES_TO_FACE_GROUPS 1193
#define GEO_NODE_POINTS_TO_SDF_VOLUME 1194
#define GEO_NODE_MESH_TO_SDF_VOLUME 1195
#define GEO_NODE_SDF_VOLUME_SPHERE 1196
#define GEO_NODE_MEAN_FILTER_SDF_VOLUME 1197
#define GEO_NODE_OFFSET_SDF_VOLUME 1198
/** \} */

View File

@@ -153,13 +153,6 @@ class bNodeTreeRuntime : NonCopyable, NonMovable {
Vector<bNode *> root_frames;
Vector<bNodeSocket *> interface_inputs;
Vector<bNodeSocket *> interface_outputs;
/**
* The location of all sockets in the tree, calculated while drawing the nodes.
* Indexed with #bNodeSocket::index_in_tree(). In the node tree's "world space"
* (the same as #bNode::runtime::totr).
*/
Vector<float2> all_socket_locations;
};
/**
@@ -185,6 +178,13 @@ class bNodeSocketRuntime : NonCopyable, NonMovable {
*/
short total_inputs = 0;
/**
* The location of the socket in the tree, calculated while drawing the nodes and invalid if the
* node tree hasn't been drawn yet. In the node tree's "world space" (the same as
* #bNode::runtime::totr).
*/
float2 location;
/** Only valid when #topology_cache_is_dirty is false. */
Vector<bNodeLink *> directly_linked_links;
Vector<bNodeSocket *> directly_linked_sockets;

View File

@@ -37,7 +37,6 @@ struct Image;
struct ImagePool;
struct ImageUser;
struct ListBase;
struct MLoop;
struct MLoopTri;
struct Main;
struct Mesh;
@@ -578,7 +577,7 @@ typedef struct SculptSession {
/* These are always assigned to base mesh data when using PBVH_FACES and PBVH_GRIDS. */
float (*vert_positions)[3];
const struct MPoly *polys;
const struct MLoop *mloop;
const int *corner_verts;
/* These contain the vertex and poly counts of the final mesh. */
int totvert, totpoly;

View File

@@ -29,7 +29,6 @@ struct CCGKey;
struct CustomData;
struct DMFlagMat;
struct IsectRayPrecalc;
struct MLoop;
struct MLoopTri;
struct MPoly;
struct Mesh;
@@ -283,13 +282,13 @@ PBVH *BKE_pbvh_new(PBVHType type);
/**
* Do a full rebuild with on Mesh data structure.
*
* \note Unlike mpoly/mloop/verts, looptri is *totally owned* by PBVH
* \note Unlike mpoly/corner_verts/verts, looptri is *totally owned* by PBVH
* (which means it may rewrite it if needed, see #BKE_pbvh_vert_coords_apply().
*/
void BKE_pbvh_build_mesh(PBVH *pbvh,
struct Mesh *mesh,
const struct MPoly *polys,
const struct MLoop *mloop,
const int *corner_verts,
float (*vert_positions)[3],
int totvert,
struct CustomData *vdata,
@@ -510,7 +509,7 @@ const int *BKE_pbvh_node_get_vert_indices(PBVHNode *node);
void BKE_pbvh_node_get_loops(PBVH *pbvh,
PBVHNode *node,
const int **r_loop_indices,
const struct MLoop **r_loops);
const int **r_corner_verts);
/* Get number of faces in the mesh; for PBVH_GRIDS the
* number of base mesh faces is returned.
@@ -737,7 +736,7 @@ typedef struct PBVHFaceIter {
int *face_sets_;
const struct MPoly *polys_;
const struct MLoopTri *looptri_;
const struct MLoop *mloop_;
const int *corner_verts_;
int prim_index_;
const struct SubdivCCG *subdiv_ccg_;
const struct BMesh *bm;

View File

@@ -256,8 +256,8 @@ struct NodeData {
MEM_delete(node_data);
}
};
/* -------------------------------------------------------------------- */
/* -------------------------------------------------------------------- */
/** \name Fix non-manifold edge bleeding.
* \{ */

View File

@@ -122,11 +122,11 @@ typedef struct PTCacheID {
/* flags defined in DNA_object_force_types.h */
unsigned int data_types, info_types;
/* copies point data to cache data */
/* Copies point data to cache data. */
int (*write_point)(int index, void *calldata, void **data, int cfra);
/* copies cache cata to point data */
/* Copies cache data to point data. */
void (*read_point)(int index, void *calldata, void **data, float cfra, const float *old_data);
/* interpolated between previously read point data and cache data */
/* Interpolated between previously read point data and cache data. */
void (*interpolate_point)(int index,
void *calldata,
void **data,

View File

@@ -75,6 +75,7 @@ typedef struct ShrinkwrapTreeData {
const struct MPoly *polys;
const float (*vert_normals)[3];
const int *corner_edges;
const float (*poly_normals)[3];
const bool *sharp_faces;
const float (*clnors)[3];

View File

@@ -21,7 +21,6 @@ struct CCGKey;
struct DMFlagMat;
struct Mesh;
struct MPoly;
struct MLoop;
struct Subdiv;
/* --------------------------------------------------------------------
@@ -310,8 +309,8 @@ typedef enum SubdivCCGAdjacencyType {
* adjacent to a vertex, r_v1 and r_v2 will be the index of that vertex. */
SubdivCCGAdjacencyType BKE_subdiv_ccg_coarse_mesh_adjacency_info_get(const SubdivCCG *subdiv_ccg,
const SubdivCCGCoord *coord,
const struct MLoop *mloop,
const struct MPoly *polys,
const int *corner_verts,
const struct MPoly *mpoly,
int *r_v1,
int *r_v2);

View File

@@ -76,6 +76,7 @@ VolumeGrid *BKE_volume_grid_get_for_write(struct Volume *volume, int grid_index)
const VolumeGrid *BKE_volume_grid_active_get_for_read(const struct Volume *volume);
/* Tries to find a grid with the given name. Make sure that the volume has been loaded. */
const VolumeGrid *BKE_volume_grid_find_for_read(const struct Volume *volume, const char *name);
VolumeGrid *BKE_volume_grid_find_for_write(struct Volume *volume, const char *name);
/* Tries to set the name of the velocity field. If no such grid exists with the given base name,
* this will try common post-fixes in order to detect velocity fields split into multiple grids.

View File

@@ -64,7 +64,7 @@ void fill_mesh_from_openvdb_data(const Span<openvdb::Vec3s> vdb_verts,
int loop_offset,
MutableSpan<float3> vert_positions,
MutableSpan<MPoly> polys,
MutableSpan<MLoop> loops);
MutableSpan<int> corner_verts);
#endif

View File

@@ -122,19 +122,32 @@ static MEdge *dm_getEdgeArray(DerivedMesh *dm)
return edge;
}
static MLoop *dm_getLoopArray(DerivedMesh *dm)
static int *dm_getCornerVertArray(DerivedMesh *dm)
{
MLoop *mloop = (MLoop *)CustomData_get_layer_for_write(
&dm->loopData, CD_MLOOP, dm->getNumLoops(dm));
int *corner_verts = (int *)CustomData_get_layer_named_for_write(
&dm->loopData, CD_PROP_INT32, ".corner_vert", dm->getNumLoops(dm));
if (!mloop) {
mloop = (MLoop *)CustomData_add_layer(
&dm->loopData, CD_MLOOP, CD_SET_DEFAULT, dm->getNumLoops(dm));
CustomData_set_layer_flag(&dm->loopData, CD_MLOOP, CD_FLAG_TEMPORARY);
dm->copyLoopArray(dm, mloop);
if (!corner_verts) {
corner_verts = (int *)CustomData_add_layer_named(
&dm->loopData, CD_PROP_INT32, CD_SET_DEFAULT, dm->getNumLoops(dm), ".corner_vert");
dm->copyCornerVertArray(dm, corner_verts);
}
return mloop;
return corner_verts;
}
static int *dm_getCornerEdgeArray(DerivedMesh *dm)
{
int *corner_edges = (int *)CustomData_get_layer_named(
&dm->loopData, CD_PROP_INT32, ".corner_edge");
if (!corner_edges) {
corner_edges = (int *)CustomData_add_layer_named(
&dm->loopData, CD_PROP_INT32, CD_SET_DEFAULT, dm->getNumLoops(dm), ".corner_edge");
dm->copyCornerEdgeArray(dm, corner_edges);
}
return corner_edges;
}
static MPoly *dm_getPolyArray(DerivedMesh *dm)
@@ -188,7 +201,8 @@ void DM_init_funcs(DerivedMesh *dm)
/* default function implementations */
dm->getVertArray = dm_getVertArray;
dm->getEdgeArray = dm_getEdgeArray;
dm->getLoopArray = dm_getLoopArray;
dm->getCornerVertArray = dm_getCornerVertArray;
dm->getCornerEdgeArray = dm_getCornerEdgeArray;
dm->getPolyArray = dm_getPolyArray;
dm->getLoopTriArray = dm_getLoopTriArray;
@@ -1891,7 +1905,7 @@ static void mesh_init_origspace(Mesh *mesh)
&mesh->ldata, CD_ORIGSPACE_MLOOP, mesh->totloop);
const Span<float3> positions = mesh->vert_positions();
const Span<MPoly> polys = mesh->polys();
const Span<MLoop> loops = mesh->loops();
const Span<int> corner_verts = mesh->corner_verts();
int j, k;
@@ -1907,7 +1921,6 @@ static void mesh_init_origspace(Mesh *mesh)
}
}
else {
const MLoop *l = &loops[poly.loopstart];
float co[3];
float mat[3][3];
@@ -1915,13 +1928,13 @@ static void mesh_init_origspace(Mesh *mesh)
float translate[2], scale[2];
const float3 p_nor = blender::bke::mesh::poly_normal_calc(
positions, loops.slice(poly.loopstart, poly.totloop));
positions, corner_verts.slice(poly.loopstart, poly.totloop));
axis_dominant_v3_to_m3(mat, p_nor);
vcos_2d.resize(poly.totloop);
for (j = 0; j < poly.totloop; j++, l++) {
mul_v3_m3v3(co, mat, positions[l->v]);
for (j = 0; j < poly.totloop; j++) {
mul_v3_m3v3(co, mat, positions[corner_verts[poly.loopstart + j]]);
copy_v2_v2(vcos_2d[j], co);
for (k = 0; k < 2; k++) {

View File

@@ -3767,12 +3767,12 @@ void BKE_animsys_nla_remap_keyframe_values(struct NlaKeyframingContext *context,
NlaEvalChannelSnapshot *blended_necs = nlaeval_snapshot_ensure_channel(&blended_snapshot, nec);
memcpy(blended_necs->values, values, sizeof(float) * count);
/* Force all channels to be remapped for quaternions in a Combine strip, otherwise it will
* always fail. See nlaevalchan_combine_quaternion_handle_undefined_blend_values().
/* Force all channels to be remapped for quaternions in a Combine or Replace strip, otherwise it
* will always fail. See nlaevalchan_combine_quaternion_handle_undefined_blend_values().
*/
const bool can_force_all = r_force_all != NULL;
if (blended_necs->channel->mix_mode == NEC_MIX_QUATERNION &&
blend_mode == NLASTRIP_MODE_COMBINE && can_force_all) {
ELEM(blend_mode, NLASTRIP_MODE_COMBINE, NLASTRIP_MODE_REPLACE) && can_force_all) {
*r_force_all = true;
index = -1;

View File

@@ -370,6 +370,26 @@ CustomDataLayer *BKE_id_attribute_duplicate(ID *id, const char *name, ReportList
return BKE_id_attribute_search(id, uniquename, CD_MASK_PROP_ALL, ATTR_DOMAIN_MASK_ALL);
}
static int color_name_to_index(ID *id, const char *name)
{
const CustomDataLayer *layer = BKE_id_attribute_search(
id, name, CD_MASK_COLOR_ALL, ATTR_DOMAIN_MASK_COLOR);
return BKE_id_attribute_to_index(id, layer, ATTR_DOMAIN_MASK_COLOR, CD_MASK_COLOR_ALL);
}
static int color_clamp_index(ID *id, int index)
{
const int length = BKE_id_attributes_length(id, ATTR_DOMAIN_MASK_COLOR, CD_MASK_COLOR_ALL);
return min_ii(index, length - 1);
}
static const char *color_name_from_index(ID *id, int index)
{
const CustomDataLayer *layer = BKE_id_attribute_from_index(
id, index, ATTR_DOMAIN_MASK_COLOR, CD_MASK_COLOR_ALL);
return layer ? layer->name : nullptr;
}
bool BKE_id_attribute_remove(ID *id, const char *name, ReportList *reports)
{
using namespace blender;
@@ -391,31 +411,43 @@ bool BKE_id_attribute_remove(ID *id, const char *name, ReportList *reports)
if (BMEditMesh *em = mesh->edit_mesh) {
for (const int domain : IndexRange(ATTR_DOMAIN_NUM)) {
if (CustomData *data = info[domain].customdata) {
int layer_index = CustomData_get_named_layer_index_notype(data, name);
if (layer_index >= 0) {
if (data->layers[layer_index].type == CD_PROP_FLOAT2) {
/* free associated UV map bool layers */
char buffer_src[MAX_CUSTOMDATA_LAYER_NAME];
BM_data_layer_free_named(
em->bm, data, BKE_uv_map_vert_select_name_get(name, buffer_src));
BM_data_layer_free_named(
em->bm, data, BKE_uv_map_edge_select_name_get(name, buffer_src));
BM_data_layer_free_named(em->bm, data, BKE_uv_map_pin_name_get(name, buffer_src));
}
const std::string name_copy = name;
const int layer_index = CustomData_get_named_layer_index_notype(data, name_copy.c_str());
if (layer_index == -1) {
continue;
}
/* Because it's possible that name is owned by the layer and will be freed
* when freeing the layer, do these checks before freeing. */
const bool is_active_color_attribute = name == StringRef(mesh->active_color_attribute);
const bool is_default_color_attribute = name == StringRef(mesh->default_color_attribute);
if (BM_data_layer_free_named(em->bm, data, name)) {
if (is_active_color_attribute) {
MEM_SAFE_FREE(mesh->active_color_attribute);
}
else if (is_default_color_attribute) {
MEM_SAFE_FREE(mesh->default_color_attribute);
}
return true;
const eCustomDataType type = eCustomDataType(data->layers[layer_index].type);
const bool is_active_color_attribute = name_copy.c_str() ==
StringRef(mesh->active_color_attribute);
const bool is_default_color_attribute = name_copy.c_str() ==
StringRef(mesh->default_color_attribute);
const int active_color_index = color_name_to_index(id, mesh->active_color_attribute);
const int default_color_index = color_name_to_index(id, mesh->default_color_attribute);
if (!BM_data_layer_free_named(em->bm, data, name_copy.c_str())) {
BLI_assert_unreachable();
}
if (is_active_color_attribute) {
BKE_id_attributes_active_color_set(
id, color_name_from_index(id, color_clamp_index(id, active_color_index)));
}
if (is_default_color_attribute) {
BKE_id_attributes_default_color_set(
id, color_name_from_index(id, color_clamp_index(id, default_color_index)));
}
if (type == CD_PROP_FLOAT2 && domain == ATTR_DOMAIN_CORNER) {
char buffer[MAX_CUSTOMDATA_LAYER_NAME];
BM_data_layer_free_named(
em->bm, data, BKE_uv_map_vert_select_name_get(name_copy.c_str(), buffer));
BM_data_layer_free_named(
em->bm, data, BKE_uv_map_edge_select_name_get(name_copy.c_str(), buffer));
BM_data_layer_free_named(
em->bm, data, BKE_uv_map_pin_name_get(name_copy.c_str(), buffer));
}
return true;
}
}
return false;
@@ -423,21 +455,44 @@ bool BKE_id_attribute_remove(ID *id, const char *name, ReportList *reports)
}
std::optional<MutableAttributeAccessor> attributes = get_attribute_accessor_for_write(*id);
if (!attributes) {
return false;
}
if (GS(id->name) == ID_ME) {
std::optional<blender::bke::AttributeMetaData> metadata = attributes->lookup_meta_data(name);
if (metadata->data_type == CD_PROP_FLOAT2) {
/* remove UV sub-attributes. */
char buffer_src[MAX_CUSTOMDATA_LAYER_NAME];
BKE_id_attribute_remove(id, BKE_uv_map_vert_select_name_get(name, buffer_src), reports);
BKE_id_attribute_remove(id, BKE_uv_map_edge_select_name_get(name, buffer_src), reports);
BKE_id_attribute_remove(id, BKE_uv_map_pin_name_get(name, buffer_src), reports);
const std::string name_copy = name;
std::optional<blender::bke::AttributeMetaData> metadata = attributes->lookup_meta_data(
name_copy);
if (!metadata) {
return false;
}
/* Update active and default color attributes. */
Mesh *mesh = reinterpret_cast<Mesh *>(id);
const bool is_active_color_attribute = name_copy == StringRef(mesh->active_color_attribute);
const bool is_default_color_attribute = name_copy == StringRef(mesh->default_color_attribute);
const int active_color_index = color_name_to_index(id, mesh->active_color_attribute);
const int default_color_index = color_name_to_index(id, mesh->default_color_attribute);
if (!attributes->remove(name_copy)) {
BLI_assert_unreachable();
}
if (is_active_color_attribute) {
BKE_id_attributes_active_color_set(
id, color_name_from_index(id, color_clamp_index(id, active_color_index)));
}
if (is_default_color_attribute) {
BKE_id_attributes_default_color_set(
id, color_name_from_index(id, color_clamp_index(id, default_color_index)));
}
if (metadata->data_type == CD_PROP_FLOAT2 && metadata->domain == ATTR_DOMAIN_CORNER) {
char buffer[MAX_CUSTOMDATA_LAYER_NAME];
attributes->remove(BKE_uv_map_vert_select_name_get(name_copy.c_str(), buffer));
attributes->remove(BKE_uv_map_edge_select_name_get(name_copy.c_str(), buffer));
attributes->remove(BKE_uv_map_pin_name_get(name_copy.c_str(), buffer));
}
return true;
}
return attributes->remove(name);

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