Merge branch 'refactor-mesh-sharp-face-generic' into refactor-mesh-face-generic
This commit is contained in:
commit
9af30e3611
|
@ -0,0 +1,5 @@
|
|||
${CommitTitle}
|
||||
|
||||
${CommitBody}
|
||||
|
||||
Pull Request #${PullRequestIndex}
|
|
@ -0,0 +1,3 @@
|
|||
${PullRequestTitle}
|
||||
|
||||
Pull Request #${PullRequestIndex}
|
|
@ -15,7 +15,3 @@ body:
|
|||
attributes:
|
||||
label: "Description"
|
||||
hide_label: true
|
||||
value: |
|
||||
Description of the problem that is addressed in the patch.
|
||||
|
||||
Description of the proposed solution and its implementation.
|
||||
|
|
|
@ -1241,13 +1241,6 @@ if(WITH_OPENGL)
|
|||
add_definitions(-DWITH_OPENGL)
|
||||
endif()
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Configure Vulkan.
|
||||
|
||||
if(WITH_VULKAN_BACKEND)
|
||||
list(APPEND BLENDER_GL_LIBRARIES ${VULKAN_LIBRARIES})
|
||||
endif()
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Configure Metal
|
||||
|
||||
|
|
11
GNUmakefile
11
GNUmakefile
|
@ -71,6 +71,13 @@ Static Source Code Checking
|
|||
* check_mypy: Checks all Python scripts using mypy,
|
||||
see: source/tools/check_source/check_mypy_config.py scripts which are included.
|
||||
|
||||
Documentation Checking
|
||||
|
||||
* check_wiki_file_structure:
|
||||
Check the WIKI documentation for the source-tree's file structure
|
||||
matches Blender's source-code.
|
||||
See: https://wiki.blender.org/wiki/Source/File_Structure
|
||||
|
||||
Spell Checkers
|
||||
This runs the spell checker from the developer tools repositor.
|
||||
|
||||
|
@ -481,6 +488,10 @@ check_smatch: .FORCE
|
|||
check_mypy: .FORCE
|
||||
@$(PYTHON) "$(BLENDER_DIR)/source/tools/check_source/check_mypy.py"
|
||||
|
||||
check_wiki_file_structure: .FORCE
|
||||
@PYTHONIOENCODING=utf_8 $(PYTHON) \
|
||||
"$(BLENDER_DIR)/source/tools/check_wiki/check_wiki_file_structure.py"
|
||||
|
||||
check_spelling_py: .FORCE
|
||||
@cd "$(BUILD_DIR)" ; \
|
||||
PYTHONIOENCODING=utf_8 $(PYTHON) \
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
# LLVM does not switch over to cpp17 until llvm 16 and building ealier versions with
|
||||
# MSVC is leading to some crashes in ISPC. Switch back to their default on all platforms
|
||||
# for now.
|
||||
# for now.
|
||||
string(REPLACE "-DCMAKE_CXX_STANDARD=17" " " DPCPP_CMAKE_FLAGS "${DEFAULT_CMAKE_FLAGS}")
|
||||
|
||||
if(WIN32)
|
||||
|
|
|
@ -42,7 +42,7 @@ endif()
|
|||
|
||||
# LLVM does not switch over to cpp17 until llvm 16 and building ealier versions with
|
||||
# MSVC is leading to some crashes in ISPC. Switch back to their default on all platforms
|
||||
# for now.
|
||||
# for now.
|
||||
string(REPLACE "-DCMAKE_CXX_STANDARD=17" " " LLVM_CMAKE_FLAGS "${DEFAULT_CMAKE_FLAGS}")
|
||||
|
||||
# short project name due to long filename issues on windows
|
||||
|
|
|
@ -10,9 +10,9 @@ if(WIN32)
|
|||
DOWNLOAD_DIR ${DOWNLOAD_DIR}
|
||||
URL_HASH ${SSL_HASH_TYPE}=${SSL_HASH}
|
||||
PREFIX ${BUILD_DIR}/ssl
|
||||
CONFIGURE_COMMAND echo "."
|
||||
BUILD_COMMAND echo "."
|
||||
INSTALL_COMMAND echo "."
|
||||
CONFIGURE_COMMAND echo "."
|
||||
BUILD_COMMAND echo "."
|
||||
INSTALL_COMMAND echo "."
|
||||
INSTALL_DIR ${LIBDIR}/ssl
|
||||
)
|
||||
else()
|
||||
|
@ -46,4 +46,4 @@ else()
|
|||
INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/ssl/src/external_ssl/ && make install
|
||||
INSTALL_DIR ${LIBDIR}/ssl
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
if(WIN32)
|
||||
set(XML2_EXTRA_ARGS
|
||||
set(XML2_EXTRA_ARGS
|
||||
-DLIBXML2_WITH_ZLIB=OFF
|
||||
-DLIBXML2_WITH_LZMA=OFF
|
||||
-DLIBXML2_WITH_PYTHON=OFF
|
||||
|
|
|
@ -0,0 +1,63 @@
|
|||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
# Copyright 2023 Blender Foundation.
|
||||
|
||||
# - Find ShaderC libraries
|
||||
# Find the ShaderC includes and libraries
|
||||
# This module defines
|
||||
# SHADERC_INCLUDE_DIRS, where to find MoltenVK headers, Set when
|
||||
# SHADERC_INCLUDE_DIR is found.
|
||||
# SHADERC_LIBRARIES, libraries to link against to use ShaderC.
|
||||
# SHADERC_ROOT_DIR, The base directory to search for ShaderC.
|
||||
# This can also be an environment variable.
|
||||
# SHADERC_FOUND, If false, do not try to use ShaderC.
|
||||
#
|
||||
|
||||
# If SHADERC_ROOT_DIR was defined in the environment, use it.
|
||||
IF(NOT SHADERC_ROOT_DIR AND NOT $ENV{SHADERC_ROOT_DIR} STREQUAL "")
|
||||
SET(SHADERC_ROOT_DIR $ENV{SHADERC_ROOT_DIR})
|
||||
ENDIF()
|
||||
|
||||
SET(_shaderc_SEARCH_DIRS
|
||||
${SHADERC_ROOT_DIR}
|
||||
)
|
||||
|
||||
# FIXME: These finder modules typically don't use LIBDIR,
|
||||
# this should be set by `./build_files/cmake/platform/` instead.
|
||||
IF(DEFINED LIBDIR)
|
||||
SET(_shaderc_SEARCH_DIRS ${_shaderc_SEARCH_DIRS} ${LIBDIR}/shaderc)
|
||||
ENDIF()
|
||||
|
||||
FIND_PATH(SHADERC_INCLUDE_DIR
|
||||
NAMES
|
||||
shaderc/shaderc.h
|
||||
HINTS
|
||||
${_shaderc_SEARCH_DIRS}
|
||||
PATH_SUFFIXES
|
||||
include
|
||||
)
|
||||
|
||||
FIND_LIBRARY(SHADERC_LIBRARY
|
||||
NAMES
|
||||
shaderc_combined
|
||||
HINTS
|
||||
${_shaderc_SEARCH_DIRS}
|
||||
PATH_SUFFIXES
|
||||
lib
|
||||
)
|
||||
|
||||
# handle the QUIETLY and REQUIRED arguments and set SHADERC_FOUND to TRUE if
|
||||
# all listed variables are TRUE
|
||||
INCLUDE(FindPackageHandleStandardArgs)
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(ShaderC DEFAULT_MSG SHADERC_LIBRARY SHADERC_INCLUDE_DIR)
|
||||
|
||||
IF(SHADERC_FOUND)
|
||||
SET(SHADERC_LIBRARIES ${SHADERC_LIBRARY})
|
||||
SET(SHADERC_INCLUDE_DIRS ${SHADERC_INCLUDE_DIR})
|
||||
ENDIF()
|
||||
|
||||
MARK_AS_ADVANCED(
|
||||
SHADERC_INCLUDE_DIR
|
||||
SHADERC_LIBRARY
|
||||
)
|
||||
|
||||
UNSET(_shaderc_SEARCH_DIRS)
|
|
@ -0,0 +1,63 @@
|
|||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
# Copyright 2023 Blender Foundation.
|
||||
|
||||
# - Find Vulkan libraries
|
||||
# Find the Vulkan includes and libraries
|
||||
# This module defines
|
||||
# VULKAN_INCLUDE_DIRS, where to find Vulkan headers, Set when
|
||||
# VULKAN_INCLUDE_DIR is found.
|
||||
# VULKAN_LIBRARIES, libraries to link against to use Vulkan.
|
||||
# VULKAN_ROOT_DIR, The base directory to search for Vulkan.
|
||||
# This can also be an environment variable.
|
||||
# VULKAN_FOUND, If false, do not try to use Vulkan.
|
||||
#
|
||||
|
||||
# If VULKAN_ROOT_DIR was defined in the environment, use it.
|
||||
IF(NOT VULKAN_ROOT_DIR AND NOT $ENV{VULKAN_ROOT_DIR} STREQUAL "")
|
||||
SET(VULKAN_ROOT_DIR $ENV{VULKAN_ROOT_DIR})
|
||||
ENDIF()
|
||||
|
||||
SET(_vulkan_SEARCH_DIRS
|
||||
${VULKAN_ROOT_DIR}
|
||||
)
|
||||
|
||||
# FIXME: These finder modules typically don't use LIBDIR,
|
||||
# this should be set by `./build_files/cmake/platform/` instead.
|
||||
IF(DEFINED LIBDIR)
|
||||
SET(_vulkan_SEARCH_DIRS ${_vulkan_SEARCH_DIRS} ${LIBDIR}/vulkan)
|
||||
ENDIF()
|
||||
|
||||
FIND_PATH(VULKAN_INCLUDE_DIR
|
||||
NAMES
|
||||
vulkan/vulkan.h
|
||||
HINTS
|
||||
${_vulkan_SEARCH_DIRS}
|
||||
PATH_SUFFIXES
|
||||
include
|
||||
)
|
||||
|
||||
FIND_LIBRARY(VULKAN_LIBRARY
|
||||
NAMES
|
||||
vulkan
|
||||
HINTS
|
||||
${_vulkan_SEARCH_DIRS}
|
||||
PATH_SUFFIXES
|
||||
lib
|
||||
)
|
||||
|
||||
# handle the QUIETLY and REQUIRED arguments and set VULKAN_FOUND to TRUE if
|
||||
# all listed variables are TRUE
|
||||
INCLUDE(FindPackageHandleStandardArgs)
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Vulkan DEFAULT_MSG VULKAN_LIBRARY VULKAN_INCLUDE_DIR)
|
||||
|
||||
IF(VULKAN_FOUND)
|
||||
SET(VULKAN_LIBRARIES ${VULKAN_LIBRARY})
|
||||
SET(VULKAN_INCLUDE_DIRS ${VULKAN_INCLUDE_DIR})
|
||||
ENDIF()
|
||||
|
||||
MARK_AS_ADVANCED(
|
||||
VULKAN_INCLUDE_DIR
|
||||
VULKAN_LIBRARY
|
||||
)
|
||||
|
||||
UNSET(_vulkan_SEARCH_DIRS)
|
|
@ -97,22 +97,8 @@ add_bundled_libraries(materialx/lib)
|
|||
|
||||
if(WITH_VULKAN_BACKEND)
|
||||
find_package(MoltenVK REQUIRED)
|
||||
|
||||
if(EXISTS ${LIBDIR}/vulkan)
|
||||
set(VULKAN_FOUND On)
|
||||
set(VULKAN_ROOT_DIR ${LIBDIR}/vulkan)
|
||||
set(VULKAN_INCLUDE_DIR ${VULKAN_ROOT_DIR}/include)
|
||||
set(VULKAN_LIBRARY ${VULKAN_ROOT_DIR}/lib/libvulkan.dylib)
|
||||
set(SHADERC_ROOT_DIR ${LIBDIR}/shaderc)
|
||||
set(SHADERC_INCLUDE_DIR ${SHADERC_ROOT_DIR}/include)
|
||||
set(SHADERC_LIBRARY ${SHADERC_ROOT_DIR}/lib/libshaderc_combined.a)
|
||||
|
||||
set(VULKAN_INCLUDE_DIRS ${VULKAN_INCLUDE_DIR} ${SHADERC_INCLUDE_DIR} ${MOLTENVK_INCLUDE_DIRS})
|
||||
set(VULKAN_LIBRARIES ${VULKAN_LIBRARY} ${SHADERC_LIBRARY} ${MOLTENVK_LIBRARIES})
|
||||
else()
|
||||
message(WARNING "Vulkan SDK was not found, disabling WITH_VULKAN_BACKEND")
|
||||
set(WITH_VULKAN_BACKEND OFF)
|
||||
endif()
|
||||
find_package(ShaderC REQUIRED)
|
||||
find_package(Vulkan REQUIRED)
|
||||
endif()
|
||||
|
||||
if(WITH_OPENSUBDIV)
|
||||
|
|
|
@ -111,6 +111,7 @@ find_package_wrapper(Epoxy REQUIRED)
|
|||
|
||||
if(WITH_VULKAN_BACKEND)
|
||||
find_package_wrapper(Vulkan REQUIRED)
|
||||
find_package_wrapper(ShaderC REQUIRED)
|
||||
endif()
|
||||
|
||||
function(check_freetype_for_brotli)
|
||||
|
|
|
@ -24,7 +24,7 @@ import os
|
|||
import re
|
||||
import platform
|
||||
import string
|
||||
import setuptools # type: ignore
|
||||
import setuptools
|
||||
import sys
|
||||
|
||||
from typing import (
|
||||
|
@ -208,7 +208,7 @@ def main() -> None:
|
|||
return paths
|
||||
|
||||
# Ensure this wheel is marked platform specific.
|
||||
class BinaryDistribution(setuptools.dist.Distribution): # type: ignore
|
||||
class BinaryDistribution(setuptools.dist.Distribution):
|
||||
def has_ext_modules(self) -> bool:
|
||||
return True
|
||||
|
||||
|
|
|
@ -13,10 +13,10 @@ import sys
|
|||
import make_utils
|
||||
from make_utils import call
|
||||
|
||||
# Parse arguments
|
||||
# Parse arguments.
|
||||
|
||||
|
||||
def parse_arguments():
|
||||
def parse_arguments() -> argparse.Namespace:
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--ctest-command", default="ctest")
|
||||
parser.add_argument("--cmake-command", default="cmake")
|
||||
|
|
|
@ -7,6 +7,7 @@ set(INC
|
|||
|
||||
set(INC_SYS
|
||||
${VULKAN_INCLUDE_DIRS}
|
||||
${MOLTENVK_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
set(SRC
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
diff --git a/extern/vulkan_memory_allocator/vk_mem_alloc.h b/extern/vulkan_memory_allocator/vk_mem_alloc.h
|
||||
index 60f572038c0..63a9994ba46 100644
|
||||
--- a/extern/vulkan_memory_allocator/vk_mem_alloc.h
|
||||
+++ b/extern/vulkan_memory_allocator/vk_mem_alloc.h
|
||||
@@ -13371,8 +13371,8 @@ bool VmaDefragmentationContext_T::IncrementCounters(VkDeviceSize bytes)
|
||||
// Early return when max found
|
||||
if (++m_PassStats.allocationsMoved >= m_MaxPassAllocations || m_PassStats.bytesMoved >= m_MaxPassBytes)
|
||||
{
|
||||
- VMA_ASSERT(m_PassStats.allocationsMoved == m_MaxPassAllocations ||
|
||||
- m_PassStats.bytesMoved == m_MaxPassBytes && "Exceeded maximal pass threshold!");
|
||||
+ VMA_ASSERT((m_PassStats.allocationsMoved == m_MaxPassAllocations ||
|
||||
+ m_PassStats.bytesMoved == m_MaxPassBytes) && "Exceeded maximal pass threshold!");
|
||||
return true;
|
||||
}
|
||||
return false;
|
File diff suppressed because it is too large
Load Diff
|
@ -48,6 +48,8 @@ void BlenderSync::sync_light(BL::Object &b_parent,
|
|||
case BL::Light::type_SPOT: {
|
||||
BL::SpotLight b_spot_light(b_light);
|
||||
light->set_size(b_spot_light.shadow_soft_size());
|
||||
light->set_axisu(transform_get_column(&tfm, 0));
|
||||
light->set_axisv(transform_get_column(&tfm, 1));
|
||||
light->set_light_type(LIGHT_SPOT);
|
||||
light->set_spot_angle(b_spot_light.spot_size());
|
||||
light->set_spot_smooth(b_spot_light.spot_blend());
|
||||
|
|
|
@ -377,7 +377,7 @@ void OneapiDevice::tex_alloc(device_texture &mem)
|
|||
generic_alloc(mem);
|
||||
generic_copy_to(mem);
|
||||
|
||||
/* Resize if needed. Also, in case of resize - allocate in advance for future allocs. */
|
||||
/* Resize if needed. Also, in case of resize - allocate in advance for future allocations. */
|
||||
const uint slot = mem.slot;
|
||||
if (slot >= texture_info_.size()) {
|
||||
texture_info_.resize(slot + 128);
|
||||
|
|
|
@ -661,4 +661,37 @@ ccl_device void bsdf_blur(KernelGlobals kg, ccl_private ShaderClosure *sc, float
|
|||
#endif
|
||||
}
|
||||
|
||||
ccl_device_inline Spectrum bsdf_albedo(ccl_private const ShaderData *sd, ccl_private const ShaderClosure *sc)
|
||||
{
|
||||
Spectrum albedo = sc->weight;
|
||||
/* Some closures include additional components such as Fresnel terms that cause their albedo to
|
||||
* be below 1. The point of this function is to return a best-effort estimation of their albedo,
|
||||
* meaning the amount of reflected/refracted light that would be expected when illuminated by a
|
||||
* uniform white background.
|
||||
* This is used for the denoising albedo pass and diffuse/glossy/transmission color passes.
|
||||
* NOTE: This should always match the sample_weight of the closure - as in, if there's an albedo
|
||||
* adjustment in here, the sample_weight should also be reduced accordingly.
|
||||
* TODO(lukas): Consider calling this function to determine the sample_weight? Would be a bit of
|
||||
* extra overhead though. */
|
||||
#if defined(__SVM__) || defined(__OSL__)
|
||||
switch (sc->type) {
|
||||
case CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID:
|
||||
case CLOSURE_BSDF_MICROFACET_MULTI_GGX_FRESNEL_ID:
|
||||
case CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_FRESNEL_ID:
|
||||
case CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID:
|
||||
albedo *= microfacet_fresnel((ccl_private const MicrofacetBsdf *)sc, sd->wi, sc->N);
|
||||
break;
|
||||
case CLOSURE_BSDF_PRINCIPLED_SHEEN_ID:
|
||||
albedo *= ((ccl_private const PrincipledSheenBsdf *)sc)->avg_value;
|
||||
break;
|
||||
case CLOSURE_BSDF_HAIR_PRINCIPLED_ID:
|
||||
albedo *= bsdf_principled_hair_albedo(sc);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
return albedo;
|
||||
}
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
|
|
@ -23,8 +23,6 @@ enum MicrofacetType {
|
|||
|
||||
typedef struct MicrofacetExtra {
|
||||
Spectrum color, cspec0;
|
||||
Spectrum fresnel_color;
|
||||
float clearcoat;
|
||||
} MicrofacetExtra;
|
||||
|
||||
typedef struct MicrofacetBsdf {
|
||||
|
@ -184,26 +182,25 @@ ccl_device_forceinline float3 microfacet_ggx_sample_vndf(const float3 wi,
|
|||
*
|
||||
* Else it is simply white
|
||||
*/
|
||||
ccl_device_forceinline Spectrum reflection_color(ccl_private const MicrofacetBsdf *bsdf,
|
||||
float3 L,
|
||||
float3 H)
|
||||
ccl_device_forceinline Spectrum microfacet_fresnel(ccl_private const MicrofacetBsdf *bsdf,
|
||||
float3 wi,
|
||||
float3 H)
|
||||
{
|
||||
Spectrum F = one_spectrum();
|
||||
|
||||
bool use_clearcoat = bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID;
|
||||
bool use_fresnel = (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID || use_clearcoat);
|
||||
|
||||
if (use_fresnel) {
|
||||
float F0 = fresnel_dielectric_cos(1.0f, bsdf->ior);
|
||||
|
||||
F = interpolate_fresnel_color(L, H, bsdf->ior, F0, bsdf->extra->cspec0);
|
||||
if (CLOSURE_IS_BSDF_MICROFACET_FRESNEL(bsdf->type)) {
|
||||
return interpolate_fresnel_color(wi, H, bsdf->ior, bsdf->extra->cspec0);
|
||||
}
|
||||
|
||||
if (use_clearcoat) {
|
||||
F *= 0.25f * bsdf->extra->clearcoat;
|
||||
else if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID) {
|
||||
return make_spectrum(fresnel_dielectric_cos(dot(wi, H), bsdf->ior));
|
||||
}
|
||||
else {
|
||||
return one_spectrum();
|
||||
}
|
||||
}
|
||||
|
||||
return F;
|
||||
ccl_device_forceinline void bsdf_microfacet_adjust_weight(ccl_private const ShaderData *sd,
|
||||
ccl_private MicrofacetBsdf *bsdf)
|
||||
{
|
||||
bsdf->sample_weight *= average(microfacet_fresnel(bsdf, sd->wi, bsdf->N));
|
||||
}
|
||||
|
||||
/* Generalized Trowbridge-Reitz for clearcoat. */
|
||||
|
@ -292,22 +289,6 @@ ccl_device_inline float bsdf_aniso_D(float alpha_x, float alpha_y, float3 H)
|
|||
}
|
||||
}
|
||||
|
||||
ccl_device_forceinline void bsdf_microfacet_fresnel_color(ccl_private const ShaderData *sd,
|
||||
ccl_private MicrofacetBsdf *bsdf)
|
||||
{
|
||||
kernel_assert(CLOSURE_IS_BSDF_MICROFACET_FRESNEL(bsdf->type));
|
||||
|
||||
float F0 = fresnel_dielectric_cos(1.0f, bsdf->ior);
|
||||
bsdf->extra->fresnel_color = interpolate_fresnel_color(
|
||||
sd->wi, bsdf->N, bsdf->ior, F0, bsdf->extra->cspec0);
|
||||
|
||||
if (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID) {
|
||||
bsdf->extra->fresnel_color *= 0.25f * bsdf->extra->clearcoat;
|
||||
}
|
||||
|
||||
bsdf->sample_weight *= average(bsdf->extra->fresnel_color);
|
||||
}
|
||||
|
||||
template<MicrofacetType m_type>
|
||||
ccl_device Spectrum bsdf_microfacet_eval(ccl_private const ShaderClosure *sc,
|
||||
const float3 Ng,
|
||||
|
@ -380,8 +361,7 @@ ccl_device Spectrum bsdf_microfacet_eval(ccl_private const ShaderClosure *sc,
|
|||
|
||||
*pdf = common / (1.0f + lambdaI);
|
||||
|
||||
const Spectrum F = m_refractive ? one_spectrum() : reflection_color(bsdf, wo, H);
|
||||
|
||||
const Spectrum F = microfacet_fresnel(bsdf, wo, H);
|
||||
return F * common / (1.0f + lambdaO + lambdaI);
|
||||
}
|
||||
|
||||
|
@ -463,14 +443,7 @@ ccl_device int bsdf_microfacet_sample(ccl_private const ShaderClosure *sc,
|
|||
label |= LABEL_SINGULAR;
|
||||
/* Some high number for MIS. */
|
||||
*pdf = 1e6f;
|
||||
*eval = make_spectrum(1e6f);
|
||||
|
||||
bool use_fresnel = (bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID ||
|
||||
bsdf->type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID);
|
||||
|
||||
if (use_fresnel && !m_refractive) {
|
||||
*eval *= reflection_color(bsdf, *wo, H);
|
||||
}
|
||||
*eval = make_spectrum(1e6f) * microfacet_fresnel(bsdf, *wo, H);
|
||||
}
|
||||
else {
|
||||
label |= LABEL_GLOSSY;
|
||||
|
@ -511,8 +484,7 @@ ccl_device int bsdf_microfacet_sample(ccl_private const ShaderClosure *sc,
|
|||
|
||||
*pdf = common / (1.0f + lambdaI);
|
||||
|
||||
Spectrum F = m_refractive ? one_spectrum() : reflection_color(bsdf, *wo, H);
|
||||
|
||||
Spectrum F = microfacet_fresnel(bsdf, *wo, H);
|
||||
*eval = F * common / (1.0f + lambdaI + lambdaO);
|
||||
}
|
||||
|
||||
|
@ -565,7 +537,7 @@ ccl_device int bsdf_microfacet_ggx_fresnel_setup(ccl_private MicrofacetBsdf *bsd
|
|||
|
||||
bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID;
|
||||
|
||||
bsdf_microfacet_fresnel_color(sd, bsdf);
|
||||
bsdf_microfacet_adjust_weight(sd, bsdf);
|
||||
|
||||
return SD_BSDF | SD_BSDF_HAS_EVAL;
|
||||
}
|
||||
|
@ -573,14 +545,12 @@ ccl_device int bsdf_microfacet_ggx_fresnel_setup(ccl_private MicrofacetBsdf *bsd
|
|||
ccl_device int bsdf_microfacet_ggx_clearcoat_setup(ccl_private MicrofacetBsdf *bsdf,
|
||||
ccl_private const ShaderData *sd)
|
||||
{
|
||||
bsdf->extra->cspec0 = saturate(bsdf->extra->cspec0);
|
||||
|
||||
bsdf->alpha_x = saturatef(bsdf->alpha_x);
|
||||
bsdf->alpha_y = bsdf->alpha_x;
|
||||
|
||||
bsdf->type = CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID;
|
||||
|
||||
bsdf_microfacet_fresnel_color(sd, bsdf);
|
||||
bsdf_microfacet_adjust_weight(sd, bsdf);
|
||||
|
||||
return SD_BSDF | SD_BSDF_HAS_EVAL;
|
||||
}
|
||||
|
|
|
@ -401,7 +401,7 @@ ccl_device int bsdf_microfacet_multi_ggx_fresnel_setup(ccl_private MicrofacetBsd
|
|||
|
||||
bsdf->type = CLOSURE_BSDF_MICROFACET_MULTI_GGX_FRESNEL_ID;
|
||||
|
||||
bsdf_microfacet_fresnel_color(sd, bsdf);
|
||||
bsdf_microfacet_adjust_weight(sd, bsdf);
|
||||
|
||||
return bsdf_microfacet_multi_ggx_common_setup(bsdf);
|
||||
}
|
||||
|
@ -575,7 +575,7 @@ ccl_device int bsdf_microfacet_multi_ggx_glass_fresnel_setup(ccl_private Microfa
|
|||
|
||||
bsdf->type = CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_FRESNEL_ID;
|
||||
|
||||
bsdf_microfacet_fresnel_color(sd, bsdf);
|
||||
bsdf_microfacet_adjust_weight(sd, bsdf);
|
||||
|
||||
return SD_BSDF | SD_BSDF_HAS_EVAL | SD_BSDF_NEEDS_LCG;
|
||||
}
|
||||
|
|
|
@ -73,9 +73,8 @@ ccl_device_forceinline Spectrum MF_FUNCTION_FULL_NAME(mf_eval)(float3 wi,
|
|||
eval = make_spectrum(val);
|
||||
#endif
|
||||
|
||||
float F0 = fresnel_dielectric_cos(1.0f, eta);
|
||||
if (use_fresnel) {
|
||||
throughput = interpolate_fresnel_color(wi, wh, eta, F0, cspec0);
|
||||
throughput = interpolate_fresnel_color(wi, wh, eta, cspec0);
|
||||
|
||||
eval *= throughput;
|
||||
}
|
||||
|
@ -144,11 +143,11 @@ ccl_device_forceinline Spectrum MF_FUNCTION_FULL_NAME(mf_eval)(float3 wi,
|
|||
throughput *= color;
|
||||
}
|
||||
else if (use_fresnel && order > 0) {
|
||||
throughput *= interpolate_fresnel_color(wi_prev, wm, eta, F0, cspec0);
|
||||
throughput *= interpolate_fresnel_color(wi_prev, wm, eta, cspec0);
|
||||
}
|
||||
#else /* MF_MULTI_GLOSSY */
|
||||
if (use_fresnel && order > 0) {
|
||||
throughput *= interpolate_fresnel_color(-wr, wm, eta, F0, cspec0);
|
||||
throughput *= interpolate_fresnel_color(-wr, wm, eta, cspec0);
|
||||
}
|
||||
wr = mf_sample_phase_glossy(-wr, &throughput, wm);
|
||||
#endif
|
||||
|
@ -192,8 +191,6 @@ ccl_device_forceinline Spectrum MF_FUNCTION_FULL_NAME(mf_sample)(float3 wi,
|
|||
float G1_r = 0.0f;
|
||||
bool outside = true;
|
||||
|
||||
float F0 = fresnel_dielectric_cos(1.0f, eta);
|
||||
|
||||
int order;
|
||||
for (order = 0; order < 10; order++) {
|
||||
/* Sample microfacet height. */
|
||||
|
@ -229,22 +226,12 @@ ccl_device_forceinline Spectrum MF_FUNCTION_FULL_NAME(mf_sample)(float3 wi,
|
|||
throughput *= color;
|
||||
}
|
||||
else {
|
||||
Spectrum t_color = interpolate_fresnel_color(wi_prev, wm, eta, F0, cspec0);
|
||||
|
||||
if (order == 0)
|
||||
throughput = t_color;
|
||||
else
|
||||
throughput *= t_color;
|
||||
throughput *= interpolate_fresnel_color(wi_prev, wm, eta, cspec0);
|
||||
}
|
||||
}
|
||||
#else /* MF_MULTI_GLOSSY */
|
||||
if (use_fresnel) {
|
||||
Spectrum t_color = interpolate_fresnel_color(-wr, wm, eta, F0, cspec0);
|
||||
|
||||
if (order == 0)
|
||||
throughput = t_color;
|
||||
else
|
||||
throughput *= t_color;
|
||||
throughput *= interpolate_fresnel_color(-wr, wm, eta, cspec0);
|
||||
}
|
||||
wr = mf_sample_phase_glossy(-wr, &throughput, wm);
|
||||
#endif
|
||||
|
|
|
@ -89,19 +89,19 @@ ccl_device float schlick_fresnel(float u)
|
|||
return m2 * m2 * m; // pow(m, 5)
|
||||
}
|
||||
|
||||
/* Calculate the fresnel color which is a blend between white and the F0 color (cspec0) */
|
||||
/* Calculate the fresnel color, which is a blend between white and the F0 color */
|
||||
ccl_device_forceinline Spectrum
|
||||
interpolate_fresnel_color(float3 L, float3 H, float ior, float F0, Spectrum cspec0)
|
||||
interpolate_fresnel_color(float3 L, float3 H, float ior, Spectrum F0)
|
||||
{
|
||||
/* Calculate the fresnel interpolation factor
|
||||
* The value from fresnel_dielectric_cos(...) has to be normalized because
|
||||
* the cspec0 keeps the F0 color
|
||||
*/
|
||||
float F0_norm = 1.0f / (1.0f - F0);
|
||||
float FH = (fresnel_dielectric_cos(dot(L, H), ior) - F0) * F0_norm;
|
||||
/* Compute the real Fresnel term and remap it from real_F0..1 to F0..1.
|
||||
* The reason why we use this remapping instead of directly doing the
|
||||
* Schlick approximation lerp(F0, 1.0, (1.0-cosLH)^5) is that for cases
|
||||
* with similar IORs (e.g. ice in water), the relative IOR can be close
|
||||
* enough to 1.0 that the Schlick approximation becomes inaccurate. */
|
||||
float real_F = fresnel_dielectric_cos(dot(L, H), ior);
|
||||
float real_F0 = fresnel_dielectric_cos(1.0f, ior);
|
||||
|
||||
/* Blend between white and a specular color with respect to the fresnel */
|
||||
return cspec0 * (1.0f - FH) + make_spectrum(FH);
|
||||
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)
|
||||
|
|
|
@ -34,7 +34,7 @@ class MetalKernelContext {
|
|||
kernel_assert(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#ifdef __KERNEL_METAL_INTEL__
|
||||
template<typename TextureType, typename CoordsType>
|
||||
inline __attribute__((__always_inline__))
|
||||
|
@ -55,7 +55,7 @@ class MetalKernelContext {
|
|||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
// texture2d
|
||||
template<>
|
||||
inline __attribute__((__always_inline__))
|
||||
|
|
|
@ -195,9 +195,9 @@ using sycl::half;
|
|||
#define fmodf(x, y) sycl::fmod((x), (y))
|
||||
#define lgammaf(x) sycl::lgamma((x))
|
||||
|
||||
/* sycl::native::cos precision is not sufficient and -ffast-math lets
|
||||
* the current DPC++ compiler overload sycl::cos with it.
|
||||
* We work around this issue by directly calling the spirv implementation which
|
||||
/* `sycl::native::cos` precision is not sufficient and `-ffast-math` lets
|
||||
* the current DPC++ compiler overload `sycl::cos` with it.
|
||||
* We work around this issue by directly calling the SPIRV implementation which
|
||||
* provides greater precision. */
|
||||
#if defined(__SYCL_DEVICE_ONLY__) && defined(__SPIR__)
|
||||
# define cosf(x) __spirv_ocl_cos(((float)(x)))
|
||||
|
|
|
@ -58,23 +58,7 @@ ccl_device_forceinline void film_write_denoising_features_surface(KernelGlobals
|
|||
normal += sc->N * sc->sample_weight;
|
||||
sum_weight += sc->sample_weight;
|
||||
|
||||
Spectrum closure_albedo = sc->weight;
|
||||
/* Closures that include a Fresnel term typically have weights close to 1 even though their
|
||||
* actual contribution is significantly lower.
|
||||
* To account for this, we scale their weight by the average fresnel factor (the same is also
|
||||
* done for the sample weight in the BSDF setup, so we don't need to scale that here). */
|
||||
if (CLOSURE_IS_BSDF_MICROFACET_FRESNEL(sc->type)) {
|
||||
ccl_private MicrofacetBsdf *bsdf = (ccl_private MicrofacetBsdf *)sc;
|
||||
closure_albedo *= bsdf->extra->fresnel_color;
|
||||
}
|
||||
else if (sc->type == CLOSURE_BSDF_PRINCIPLED_SHEEN_ID) {
|
||||
ccl_private PrincipledSheenBsdf *bsdf = (ccl_private PrincipledSheenBsdf *)sc;
|
||||
closure_albedo *= bsdf->avg_value;
|
||||
}
|
||||
else if (sc->type == CLOSURE_BSDF_HAIR_PRINCIPLED_ID) {
|
||||
closure_albedo *= bsdf_principled_hair_albedo(sc);
|
||||
}
|
||||
else if (sc->type == CLOSURE_BSDF_PRINCIPLED_DIFFUSE_ID) {
|
||||
if (sc->type == CLOSURE_BSDF_PRINCIPLED_DIFFUSE_ID) {
|
||||
/* BSSRDF already accounts for weight, retro-reflection would double up. */
|
||||
ccl_private const PrincipledDiffuseBsdf *bsdf = (ccl_private const PrincipledDiffuseBsdf *)
|
||||
sc;
|
||||
|
@ -83,6 +67,7 @@ ccl_device_forceinline void film_write_denoising_features_surface(KernelGlobals
|
|||
}
|
||||
}
|
||||
|
||||
Spectrum closure_albedo = bsdf_albedo(sd, sc);
|
||||
if (bsdf_get_specular_roughness_squared(sc) > sqr(0.075f)) {
|
||||
diffuse_albedo += closure_albedo;
|
||||
sum_nonspecular_weight += sc->sample_weight;
|
||||
|
|
|
@ -621,7 +621,7 @@ ccl_device Spectrum surface_shader_diffuse(KernelGlobals kg, ccl_private const S
|
|||
ccl_private const ShaderClosure *sc = &sd->closure[i];
|
||||
|
||||
if (CLOSURE_IS_BSDF_DIFFUSE(sc->type) || CLOSURE_IS_BSSRDF(sc->type))
|
||||
eval += sc->weight;
|
||||
eval += bsdf_albedo(sd, sc);
|
||||
}
|
||||
|
||||
return eval;
|
||||
|
@ -635,7 +635,7 @@ ccl_device Spectrum surface_shader_glossy(KernelGlobals kg, ccl_private const Sh
|
|||
ccl_private const ShaderClosure *sc = &sd->closure[i];
|
||||
|
||||
if (CLOSURE_IS_BSDF_GLOSSY(sc->type))
|
||||
eval += sc->weight;
|
||||
eval += bsdf_albedo(sd, sc);
|
||||
}
|
||||
|
||||
return eval;
|
||||
|
@ -649,7 +649,7 @@ ccl_device Spectrum surface_shader_transmission(KernelGlobals kg, ccl_private co
|
|||
ccl_private const ShaderClosure *sc = &sd->closure[i];
|
||||
|
||||
if (CLOSURE_IS_BSDF_TRANSMISSION(sc->type))
|
||||
eval += sc->weight;
|
||||
eval += bsdf_albedo(sd, sc);
|
||||
}
|
||||
|
||||
return eval;
|
||||
|
|
|
@ -7,24 +7,13 @@
|
|||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
ccl_device float spot_light_attenuation(float3 dir,
|
||||
float cos_half_spot_angle,
|
||||
float spot_smooth,
|
||||
float3 N)
|
||||
ccl_device float spot_light_attenuation(const ccl_global KernelSpotLight *spot, float3 ray)
|
||||
{
|
||||
float attenuation = dot(dir, N);
|
||||
const float3 scaled_ray = safe_normalize(
|
||||
make_float3(dot(ray, spot->axis_u), dot(ray, spot->axis_v), dot(ray, spot->dir)) /
|
||||
spot->len);
|
||||
|
||||
if (attenuation <= cos_half_spot_angle) {
|
||||
attenuation = 0.0f;
|
||||
}
|
||||
else {
|
||||
float t = attenuation - cos_half_spot_angle;
|
||||
|
||||
if (t < spot_smooth && spot_smooth != 0.0f)
|
||||
attenuation *= smoothstepf(t / spot_smooth);
|
||||
}
|
||||
|
||||
return attenuation;
|
||||
return smoothstepf((scaled_ray.z - spot->cos_half_spot_angle) / spot->spot_smooth);
|
||||
}
|
||||
|
||||
template<bool in_volume_segment>
|
||||
|
@ -57,8 +46,7 @@ ccl_device_inline bool spot_light_sample(const ccl_global KernelLight *klight,
|
|||
ls->eval_fac = (0.25f * M_1_PI_F) * invarea;
|
||||
|
||||
/* spot light attenuation */
|
||||
ls->eval_fac *= spot_light_attenuation(
|
||||
klight->spot.dir, klight->spot.cos_half_spot_angle, klight->spot.spot_smooth, -ls->D);
|
||||
ls->eval_fac *= spot_light_attenuation(&klight->spot, -ls->D);
|
||||
if (!in_volume_segment && ls->eval_fac == 0.0f) {
|
||||
return false;
|
||||
}
|
||||
|
@ -87,8 +75,7 @@ ccl_device_forceinline void spot_light_update_position(const ccl_global KernelLi
|
|||
ls->pdf = invarea;
|
||||
|
||||
/* spot light attenuation */
|
||||
ls->eval_fac *= spot_light_attenuation(
|
||||
klight->spot.dir, klight->spot.cos_half_spot_angle, klight->spot.spot_smooth, ls->Ng);
|
||||
ls->eval_fac *= spot_light_attenuation(&klight->spot, ls->Ng);
|
||||
}
|
||||
|
||||
ccl_device_inline bool spot_light_intersect(const ccl_global KernelLight *klight,
|
||||
|
@ -129,8 +116,7 @@ ccl_device_inline bool spot_light_sample_from_intersection(
|
|||
ls->pdf = invarea;
|
||||
|
||||
/* spot light attenuation */
|
||||
ls->eval_fac *= spot_light_attenuation(
|
||||
klight->spot.dir, klight->spot.cos_half_spot_angle, klight->spot.spot_smooth, -ls->D);
|
||||
ls->eval_fac *= spot_light_attenuation(&klight->spot, -ls->D);
|
||||
|
||||
if (ls->eval_fac == 0.0f) {
|
||||
return false;
|
||||
|
|
|
@ -345,7 +345,6 @@ ccl_device void osl_closure_microfacet_ggx_fresnel_setup(
|
|||
bsdf->extra = extra;
|
||||
bsdf->extra->color = rgb_to_spectrum(closure->color);
|
||||
bsdf->extra->cspec0 = rgb_to_spectrum(closure->cspec0);
|
||||
bsdf->extra->clearcoat = 0.0f;
|
||||
|
||||
bsdf->T = zero_float3();
|
||||
|
||||
|
@ -383,7 +382,6 @@ ccl_device void osl_closure_microfacet_ggx_aniso_fresnel_setup(
|
|||
bsdf->extra = extra;
|
||||
bsdf->extra->color = rgb_to_spectrum(closure->color);
|
||||
bsdf->extra->cspec0 = rgb_to_spectrum(closure->cspec0);
|
||||
bsdf->extra->clearcoat = 0.0f;
|
||||
|
||||
bsdf->T = closure->T;
|
||||
|
||||
|
@ -426,7 +424,6 @@ ccl_device void osl_closure_microfacet_multi_ggx_setup(
|
|||
bsdf->extra = extra;
|
||||
bsdf->extra->color = rgb_to_spectrum(closure->color);
|
||||
bsdf->extra->cspec0 = zero_spectrum();
|
||||
bsdf->extra->clearcoat = 0.0f;
|
||||
|
||||
bsdf->T = zero_float3();
|
||||
|
||||
|
@ -467,7 +464,6 @@ ccl_device void osl_closure_microfacet_multi_ggx_glass_setup(
|
|||
bsdf->extra = extra;
|
||||
bsdf->extra->color = rgb_to_spectrum(closure->color);
|
||||
bsdf->extra->cspec0 = zero_spectrum();
|
||||
bsdf->extra->clearcoat = 0.0f;
|
||||
|
||||
bsdf->T = zero_float3();
|
||||
|
||||
|
@ -508,7 +504,6 @@ ccl_device void osl_closure_microfacet_multi_ggx_aniso_setup(
|
|||
bsdf->extra = extra;
|
||||
bsdf->extra->color = rgb_to_spectrum(closure->color);
|
||||
bsdf->extra->cspec0 = zero_spectrum();
|
||||
bsdf->extra->clearcoat = 0.0f;
|
||||
|
||||
bsdf->T = closure->T;
|
||||
|
||||
|
@ -551,7 +546,6 @@ ccl_device void osl_closure_microfacet_multi_ggx_fresnel_setup(
|
|||
bsdf->extra = extra;
|
||||
bsdf->extra->color = rgb_to_spectrum(closure->color);
|
||||
bsdf->extra->cspec0 = rgb_to_spectrum(closure->cspec0);
|
||||
bsdf->extra->clearcoat = 0.0f;
|
||||
|
||||
bsdf->T = zero_float3();
|
||||
|
||||
|
@ -592,7 +586,6 @@ ccl_device void osl_closure_microfacet_multi_ggx_glass_fresnel_setup(
|
|||
bsdf->extra = extra;
|
||||
bsdf->extra->color = rgb_to_spectrum(closure->color);
|
||||
bsdf->extra->cspec0 = rgb_to_spectrum(closure->cspec0);
|
||||
bsdf->extra->clearcoat = 0.0f;
|
||||
|
||||
bsdf->T = zero_float3();
|
||||
|
||||
|
@ -633,7 +626,6 @@ ccl_device void osl_closure_microfacet_multi_ggx_aniso_fresnel_setup(
|
|||
bsdf->extra = extra;
|
||||
bsdf->extra->color = rgb_to_spectrum(closure->color);
|
||||
bsdf->extra->cspec0 = rgb_to_spectrum(closure->cspec0);
|
||||
bsdf->extra->clearcoat = 0.0f;
|
||||
|
||||
bsdf->T = closure->T;
|
||||
|
||||
|
@ -865,27 +857,18 @@ ccl_device void osl_closure_principled_clearcoat_setup(
|
|||
float3 weight,
|
||||
ccl_private const PrincipledClearcoatClosure *closure)
|
||||
{
|
||||
weight *= 0.25f * closure->clearcoat;
|
||||
ccl_private MicrofacetBsdf *bsdf = (ccl_private MicrofacetBsdf *)bsdf_alloc(
|
||||
sd, sizeof(MicrofacetBsdf), rgb_to_spectrum(weight));
|
||||
if (!bsdf) {
|
||||
return;
|
||||
}
|
||||
|
||||
MicrofacetExtra *extra = (MicrofacetExtra *)closure_alloc_extra(sd, sizeof(MicrofacetExtra));
|
||||
if (!extra) {
|
||||
return;
|
||||
}
|
||||
|
||||
bsdf->N = ensure_valid_reflection(sd->Ng, sd->wi, closure->N);
|
||||
bsdf->alpha_x = closure->clearcoat_roughness;
|
||||
bsdf->alpha_y = closure->clearcoat_roughness;
|
||||
bsdf->ior = 1.5f;
|
||||
|
||||
bsdf->extra = extra;
|
||||
bsdf->extra->color = zero_spectrum();
|
||||
bsdf->extra->cspec0 = make_spectrum(0.04f);
|
||||
bsdf->extra->clearcoat = closure->clearcoat;
|
||||
|
||||
bsdf->T = zero_float3();
|
||||
|
||||
sd->flag |= bsdf_microfacet_ggx_clearcoat_setup(bsdf, sd);
|
||||
|
|
|
@ -161,7 +161,10 @@ ccl_device_inline void osl_eval_nodes(KernelGlobals kg,
|
|||
/* shadeindex = */ 0);
|
||||
# endif
|
||||
|
||||
if (globals.Ci) {
|
||||
if constexpr (type == SHADER_TYPE_DISPLACEMENT) {
|
||||
sd->P = globals.P;
|
||||
}
|
||||
else if (globals.Ci) {
|
||||
flatten_closure_tree(kg, sd, path_flag, globals.Ci);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -46,17 +46,8 @@ ccl_device_noinline_cpu float2 svm_brick(float3 p,
|
|||
float tint = saturatef((brick_noise((rownum << 16) + (bricknum & 0xFFFF)) + bias));
|
||||
float min_dist = min(min(x, y), min(brick_width - x, row_height - y));
|
||||
|
||||
float mortar;
|
||||
if (min_dist >= mortar_size) {
|
||||
mortar = 0.0f;
|
||||
}
|
||||
else if (mortar_smooth == 0.0f) {
|
||||
mortar = 1.0f;
|
||||
}
|
||||
else {
|
||||
min_dist = 1.0f - min_dist / mortar_size;
|
||||
mortar = (min_dist < mortar_smooth) ? smoothstepf(min_dist / mortar_smooth) : 1.0f;
|
||||
}
|
||||
min_dist = 1.0f - min_dist / mortar_size;
|
||||
float mortar = smoothstepf(min_dist / mortar_smooth);
|
||||
|
||||
return make_float2(tint, mortar);
|
||||
}
|
||||
|
|
|
@ -333,7 +333,6 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
|
|||
bsdf->extra->cspec0 = rgb_to_spectrum(
|
||||
(specular * 0.08f * tmp_col) * (1.0f - metallic) + base_color * metallic);
|
||||
bsdf->extra->color = rgb_to_spectrum(base_color);
|
||||
bsdf->extra->clearcoat = 0.0f;
|
||||
|
||||
/* setup bsdf */
|
||||
if (distribution == CLOSURE_BSDF_MICROFACET_GGX_GLASS_ID ||
|
||||
|
@ -383,7 +382,6 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
|
|||
|
||||
bsdf->extra->color = rgb_to_spectrum(base_color);
|
||||
bsdf->extra->cspec0 = rgb_to_spectrum(cspec0);
|
||||
bsdf->extra->clearcoat = 0.0f;
|
||||
|
||||
/* setup bsdf */
|
||||
sd->flag |= bsdf_microfacet_ggx_fresnel_setup(bsdf, sd);
|
||||
|
@ -440,7 +438,6 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
|
|||
|
||||
bsdf->extra->color = rgb_to_spectrum(base_color);
|
||||
bsdf->extra->cspec0 = rgb_to_spectrum(cspec0);
|
||||
bsdf->extra->clearcoat = 0.0f;
|
||||
|
||||
/* setup bsdf */
|
||||
sd->flag |= bsdf_microfacet_multi_ggx_glass_fresnel_setup(bsdf, sd);
|
||||
|
@ -455,30 +452,20 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
|
|||
#ifdef __CAUSTICS_TRICKS__
|
||||
if (kernel_data.integrator.caustics_reflective || (path_flag & PATH_RAY_DIFFUSE) == 0) {
|
||||
#endif
|
||||
if (clearcoat > CLOSURE_WEIGHT_CUTOFF) {
|
||||
ccl_private MicrofacetBsdf *bsdf = (ccl_private MicrofacetBsdf *)bsdf_alloc(
|
||||
sd, sizeof(MicrofacetBsdf), weight);
|
||||
ccl_private MicrofacetExtra *extra =
|
||||
(bsdf != NULL) ?
|
||||
(ccl_private MicrofacetExtra *)closure_alloc_extra(sd, sizeof(MicrofacetExtra)) :
|
||||
NULL;
|
||||
Spectrum clearcoat_weight = 0.25f * clearcoat * weight;
|
||||
ccl_private MicrofacetBsdf *bsdf = (ccl_private MicrofacetBsdf *)bsdf_alloc(
|
||||
sd, sizeof(MicrofacetBsdf), clearcoat_weight);
|
||||
|
||||
if (bsdf && extra) {
|
||||
bsdf->N = clearcoat_normal;
|
||||
bsdf->T = zero_float3();
|
||||
bsdf->ior = 1.5f;
|
||||
bsdf->extra = extra;
|
||||
if (bsdf) {
|
||||
bsdf->N = clearcoat_normal;
|
||||
bsdf->T = zero_float3();
|
||||
bsdf->ior = 1.5f;
|
||||
|
||||
bsdf->alpha_x = clearcoat_roughness * clearcoat_roughness;
|
||||
bsdf->alpha_y = clearcoat_roughness * clearcoat_roughness;
|
||||
bsdf->alpha_x = clearcoat_roughness * clearcoat_roughness;
|
||||
bsdf->alpha_y = clearcoat_roughness * clearcoat_roughness;
|
||||
|
||||
bsdf->extra->color = zero_spectrum();
|
||||
bsdf->extra->cspec0 = make_spectrum(0.04f);
|
||||
bsdf->extra->clearcoat = clearcoat;
|
||||
|
||||
/* setup bsdf */
|
||||
sd->flag |= bsdf_microfacet_ggx_clearcoat_setup(bsdf, sd);
|
||||
}
|
||||
/* setup bsdf */
|
||||
sd->flag |= bsdf_microfacet_ggx_clearcoat_setup(bsdf, sd);
|
||||
}
|
||||
#ifdef __CAUSTICS_TRICKS__
|
||||
}
|
||||
|
@ -584,7 +571,6 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
|
|||
if (bsdf->extra) {
|
||||
bsdf->extra->color = rgb_to_spectrum(stack_load_float3(stack, data_node.w));
|
||||
bsdf->extra->cspec0 = zero_spectrum();
|
||||
bsdf->extra->clearcoat = 0.0f;
|
||||
sd->flag |= bsdf_microfacet_multi_ggx_setup(bsdf);
|
||||
}
|
||||
}
|
||||
|
@ -724,7 +710,6 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
|
|||
kernel_assert(stack_valid(data_node.z));
|
||||
bsdf->extra->color = rgb_to_spectrum(stack_load_float3(stack, data_node.z));
|
||||
bsdf->extra->cspec0 = zero_spectrum();
|
||||
bsdf->extra->clearcoat = 0.0f;
|
||||
|
||||
/* setup bsdf */
|
||||
sd->flag |= bsdf_microfacet_multi_ggx_glass_setup(bsdf);
|
||||
|
|
|
@ -489,8 +489,7 @@ typedef enum ClosureType {
|
|||
#define CLOSURE_IS_BSDF_MICROFACET_FRESNEL(type) \
|
||||
(type == CLOSURE_BSDF_MICROFACET_MULTI_GGX_FRESNEL_ID || \
|
||||
type == CLOSURE_BSDF_MICROFACET_MULTI_GGX_GLASS_FRESNEL_ID || \
|
||||
type == CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID || \
|
||||
type == CLOSURE_BSDF_MICROFACET_GGX_CLEARCOAT_ID)
|
||||
type == CLOSURE_BSDF_MICROFACET_GGX_FRESNEL_ID)
|
||||
#define CLOSURE_IS_BSDF_OR_BSSRDF(type) (type <= CLOSURE_BSSRDF_RANDOM_WALK_FIXED_RADIUS_ID)
|
||||
#define CLOSURE_IS_BSSRDF(type) \
|
||||
(type >= CLOSURE_BSSRDF_BURLEY_ID && type <= CLOSURE_BSSRDF_RANDOM_WALK_FIXED_RADIUS_ID)
|
||||
|
|
|
@ -1290,12 +1290,14 @@ typedef struct KernelCurveSegment {
|
|||
static_assert_align(KernelCurveSegment, 8);
|
||||
|
||||
typedef struct KernelSpotLight {
|
||||
packed_float3 axis_u;
|
||||
float radius;
|
||||
packed_float3 axis_v;
|
||||
float invarea;
|
||||
float cos_half_spot_angle;
|
||||
float spot_smooth;
|
||||
packed_float3 dir;
|
||||
float pad;
|
||||
float cos_half_spot_angle;
|
||||
packed_float3 len;
|
||||
float spot_smooth;
|
||||
} KernelSpotLight;
|
||||
|
||||
/* PointLight is SpotLight with only radius and invarea being used. */
|
||||
|
|
|
@ -23,7 +23,10 @@
|
|||
#include "subd/patch_table.h"
|
||||
#include "subd/split.h"
|
||||
|
||||
#include "kernel/osl/globals.h"
|
||||
#ifdef WITH_OSL
|
||||
# include "kernel/osl/globals.h"
|
||||
# include "kernel/osl/services.h"
|
||||
#endif
|
||||
|
||||
#include "util/foreach.h"
|
||||
#include "util/log.h"
|
||||
|
@ -306,6 +309,11 @@ void GeometryManager::update_osl_globals(Device *device, Scene *scene)
|
|||
{
|
||||
#ifdef WITH_OSL
|
||||
OSLGlobals *og = (OSLGlobals *)device->get_cpu_osl_memory();
|
||||
if (og == nullptr) {
|
||||
/* Can happen when rendering with multiple GPUs, but no CPU (in which case the name maps filled
|
||||
* below are not used anyway) */
|
||||
return;
|
||||
}
|
||||
|
||||
og->object_name_map.clear();
|
||||
og->object_names.clear();
|
||||
|
@ -1666,6 +1674,7 @@ void GeometryManager::device_update_displacement_images(Device *device,
|
|||
TaskPool pool;
|
||||
ImageManager *image_manager = scene->image_manager;
|
||||
set<int> bump_images;
|
||||
bool has_osl_node = false;
|
||||
foreach (Geometry *geom, scene->geometry) {
|
||||
if (geom->is_modified()) {
|
||||
/* Geometry-level check for hair shadow transparency.
|
||||
|
@ -1685,6 +1694,9 @@ void GeometryManager::device_update_displacement_images(Device *device,
|
|||
continue;
|
||||
}
|
||||
foreach (ShaderNode *node, shader->graph->nodes) {
|
||||
if (node->special_type == SHADER_SPECIAL_TYPE_OSL) {
|
||||
has_osl_node = true;
|
||||
}
|
||||
if (node->special_type != SHADER_SPECIAL_TYPE_IMAGE_SLOT) {
|
||||
continue;
|
||||
}
|
||||
|
@ -1700,6 +1712,28 @@ void GeometryManager::device_update_displacement_images(Device *device,
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef WITH_OSL
|
||||
/* If any OSL node is used for displacement, it may reference a texture. But it's
|
||||
* unknown which ones, so have to load them all. */
|
||||
if (has_osl_node) {
|
||||
set<OSLRenderServices *> services_shared;
|
||||
device->foreach_device([&services_shared](Device *sub_device) {
|
||||
OSLGlobals *og = (OSLGlobals *)sub_device->get_cpu_osl_memory();
|
||||
services_shared.insert(og->services);
|
||||
});
|
||||
|
||||
for (OSLRenderServices *services : services_shared) {
|
||||
for (auto it = services->textures.begin(); it != services->textures.end(); ++it) {
|
||||
if (it->second->handle.get_manager() == image_manager) {
|
||||
const int slot = it->second->handle.svm_slot();
|
||||
bump_images.insert(slot);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
foreach (int slot, bump_images) {
|
||||
pool.push(function_bind(
|
||||
&ImageManager::device_update_slot, image_manager, device, scene, slot, &progress));
|
||||
|
|
|
@ -1076,23 +1076,31 @@ void LightManager::device_update_lights(Device *device, DeviceScene *dscene, Sce
|
|||
else if (light->light_type == LIGHT_SPOT) {
|
||||
shader_id &= ~SHADER_AREA_LIGHT;
|
||||
|
||||
float3 len;
|
||||
float3 axis_u = normalize_len(light->axisu, &len.x);
|
||||
float3 axis_v = normalize_len(light->axisv, &len.y);
|
||||
float3 dir = normalize_len(light->dir, &len.z);
|
||||
if (len.z == 0.0f) {
|
||||
dir = zero_float3();
|
||||
}
|
||||
|
||||
float radius = light->size;
|
||||
float invarea = (radius > 0.0f) ? 1.0f / (M_PI_F * radius * radius) : 1.0f;
|
||||
float cos_half_spot_angle = cosf(light->spot_angle * 0.5f);
|
||||
float spot_smooth = (1.0f - cos_half_spot_angle) * light->spot_smooth;
|
||||
float3 dir = light->dir;
|
||||
|
||||
dir = safe_normalize(dir);
|
||||
|
||||
if (light->use_mis && radius > 0.0f)
|
||||
shader_id |= SHADER_USE_MIS;
|
||||
|
||||
klights[light_index].co = co;
|
||||
klights[light_index].spot.axis_u = axis_u;
|
||||
klights[light_index].spot.radius = radius;
|
||||
klights[light_index].spot.axis_v = axis_v;
|
||||
klights[light_index].spot.invarea = invarea;
|
||||
klights[light_index].spot.cos_half_spot_angle = cos_half_spot_angle;
|
||||
klights[light_index].spot.spot_smooth = spot_smooth;
|
||||
klights[light_index].spot.dir = dir;
|
||||
klights[light_index].spot.cos_half_spot_angle = cos_half_spot_angle;
|
||||
klights[light_index].spot.len = len;
|
||||
klights[light_index].spot.spot_smooth = spot_smooth;
|
||||
}
|
||||
|
||||
klights[light_index].shader_id = shader_id;
|
||||
|
|
|
@ -156,7 +156,13 @@ LightTreePrimitive::LightTreePrimitive(Scene *scene, int prim_id, int object_id)
|
|||
}
|
||||
else if (type == LIGHT_SPOT) {
|
||||
bcone.theta_o = 0;
|
||||
bcone.theta_e = lamp->get_spot_angle() * 0.5f;
|
||||
|
||||
const float unscaled_theta_e = lamp->get_spot_angle() * 0.5f;
|
||||
const float len_u = len(lamp->get_axisu());
|
||||
const float len_v = len(lamp->get_axisv());
|
||||
const float len_w = len(lamp->get_dir());
|
||||
|
||||
bcone.theta_e = fast_atanf(fast_tanf(unscaled_theta_e) * fmaxf(len_u, len_v) / len_w);
|
||||
|
||||
/* Point and spot lights can emit light from any point within its radius. */
|
||||
const float3 radius = make_float3(size);
|
||||
|
|
|
@ -483,6 +483,12 @@ ccl_device_inline float compatible_signf(float f)
|
|||
|
||||
ccl_device_inline float smoothstepf(float f)
|
||||
{
|
||||
if (f <= 0.0f) {
|
||||
return 0.0f;
|
||||
}
|
||||
if (f >= 1.0f) {
|
||||
return 1.0f;
|
||||
}
|
||||
float ff = f * f;
|
||||
return (3.0f * ff - 2.0f * ff * f);
|
||||
}
|
||||
|
|
|
@ -85,10 +85,12 @@ if(WITH_VULKAN_BACKEND)
|
|||
|
||||
list(APPEND INC_SYS
|
||||
${VULKAN_INCLUDE_DIRS}
|
||||
${MOLTENVK_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
list(APPEND LIB
|
||||
${VULKAN_LIBRARIES}
|
||||
${MOLTENVK_LIBRARIES}
|
||||
)
|
||||
|
||||
add_definitions(-DWITH_VULKAN_BACKEND)
|
||||
|
|
|
@ -1201,7 +1201,7 @@ void GHOST_GetVulkanHandles(GHOST_ContextHandle context,
|
|||
void *r_instance,
|
||||
void *r_physical_device,
|
||||
void *r_device,
|
||||
uint32_t *r_graphic_queue_familly);
|
||||
uint32_t *r_graphic_queue_family);
|
||||
|
||||
/**
|
||||
* Return VULKAN back-buffer resources handles for the given window.
|
||||
|
|
|
@ -1203,10 +1203,10 @@ void GHOST_GetVulkanHandles(GHOST_ContextHandle contexthandle,
|
|||
void *r_instance,
|
||||
void *r_physical_device,
|
||||
void *r_device,
|
||||
uint32_t *r_graphic_queue_familly)
|
||||
uint32_t *r_graphic_queue_family)
|
||||
{
|
||||
GHOST_IContext *context = (GHOST_IContext *)contexthandle;
|
||||
context->getVulkanHandles(r_instance, r_physical_device, r_device, r_graphic_queue_familly);
|
||||
context->getVulkanHandles(r_instance, r_physical_device, r_device, r_graphic_queue_family);
|
||||
}
|
||||
|
||||
void GHOST_GetVulkanBackbuffer(GHOST_WindowHandle windowhandle,
|
||||
|
|
|
@ -142,7 +142,7 @@ class GHOST_Context : public GHOST_IContext {
|
|||
virtual GHOST_TSuccess getVulkanHandles(void * /*r_instance*/,
|
||||
void * /*r_physical_device*/,
|
||||
void * /*r_device*/,
|
||||
uint32_t * /*r_graphic_queue_familly*/) override
|
||||
uint32_t * /*r_graphic_queue_family*/) override
|
||||
{
|
||||
return GHOST_kFailure;
|
||||
};
|
||||
|
|
|
@ -27,11 +27,11 @@ class GHOST_ContextCGL : public GHOST_Context {
|
|||
public:
|
||||
/* Defines the number of simultaneous command buffers which can be in flight.
|
||||
* The default limit of `64` is considered to be optimal for Blender. Too many command buffers
|
||||
* will result in workload fragmnetation and additional system-level overhead. This limit should
|
||||
* will result in workload fragmentation and additional system-level overhead. This limit should
|
||||
* also only be increased if the application is consistently exceeding the limit, and there are
|
||||
* no command buffer leaks.
|
||||
*
|
||||
* If this limit is reached, starting a new command buffer will fail. The Metal backend will
|
||||
* If this limit is reached, starting a new command buffer will fail. The Metal back-end will
|
||||
* therefore stall until completion and log a warning when this limit is reached in order to
|
||||
* ensure correct function of the app.
|
||||
*
|
||||
|
|
|
@ -311,12 +311,12 @@ GHOST_TSuccess GHOST_ContextVK::getVulkanBackbuffer(void *image,
|
|||
GHOST_TSuccess GHOST_ContextVK::getVulkanHandles(void *r_instance,
|
||||
void *r_physical_device,
|
||||
void *r_device,
|
||||
uint32_t *r_graphic_queue_familly)
|
||||
uint32_t *r_graphic_queue_family)
|
||||
{
|
||||
*((VkInstance *)r_instance) = m_instance;
|
||||
*((VkPhysicalDevice *)r_physical_device) = m_physical_device;
|
||||
*((VkDevice *)r_device) = m_device;
|
||||
*r_graphic_queue_familly = m_queue_family_graphic;
|
||||
*r_graphic_queue_family = m_queue_family_graphic;
|
||||
|
||||
return GHOST_kSuccess;
|
||||
}
|
||||
|
@ -520,13 +520,14 @@ static GHOST_TSuccess getGraphicQueueFamily(VkPhysicalDevice device, uint32_t *r
|
|||
|
||||
*r_queue_index = 0;
|
||||
for (const auto &queue_family : queue_families) {
|
||||
if (queue_family.queueFlags & VK_QUEUE_GRAPHICS_BIT) {
|
||||
if ((queue_family.queueFlags & VK_QUEUE_GRAPHICS_BIT) &&
|
||||
(queue_family.queueFlags & VK_QUEUE_COMPUTE_BIT)) {
|
||||
return GHOST_kSuccess;
|
||||
}
|
||||
(*r_queue_index)++;
|
||||
}
|
||||
|
||||
fprintf(stderr, "Couldn't find any Graphic queue familly on selected device\n");
|
||||
fprintf(stderr, "Couldn't find any Graphic queue family on selected device\n");
|
||||
return GHOST_kFailure;
|
||||
}
|
||||
|
||||
|
@ -551,7 +552,7 @@ static GHOST_TSuccess getPresetQueueFamily(VkPhysicalDevice device,
|
|||
(*r_queue_index)++;
|
||||
}
|
||||
|
||||
fprintf(stderr, "Couldn't find any Present queue familly on selected device\n");
|
||||
fprintf(stderr, "Couldn't find any Present queue family on selected device\n");
|
||||
return GHOST_kFailure;
|
||||
}
|
||||
|
||||
|
|
|
@ -113,7 +113,7 @@ class GHOST_ContextVK : public GHOST_Context {
|
|||
GHOST_TSuccess getVulkanHandles(void *r_instance,
|
||||
void *r_physical_device,
|
||||
void *r_device,
|
||||
uint32_t *r_graphic_queue_familly);
|
||||
uint32_t *r_graphic_queue_family);
|
||||
/**
|
||||
* Gets the Vulkan framebuffer related resource handles associated with the Vulkan context.
|
||||
* Needs to be called after each swap events as the framebuffer will change.
|
||||
|
|
2
make.bat
2
make.bat
|
@ -69,7 +69,7 @@ if "%BUILD_UPDATE%" == "1" (
|
|||
REM Then update SVN platform libraries, since updating python while python is
|
||||
REM running tends to be problematic. The python script that update_sources
|
||||
REM calls later on may still try to switch branches and run into trouble,
|
||||
REM but for *most* people this will side step the problem.
|
||||
REM but for *most* people this will side step the problem.
|
||||
call "%BLENDER_DIR%\build_files\windows\svn_update.cmd"
|
||||
)
|
||||
REM Finally call the python script shared between all platforms that updates git
|
||||
|
|
|
@ -121,10 +121,14 @@ def object_child_map(objects):
|
|||
|
||||
def mesh_data_lists_from_mesh(me, material_colors):
|
||||
me_loops = me.loops[:]
|
||||
me_loops_color = me.attributes.active_color.data[:]
|
||||
me_verts = me.vertices[:]
|
||||
me_polys = me.polygons[:]
|
||||
|
||||
if me.attributes.active_color:
|
||||
me_loops_color = me_loops_color_active.data[:]
|
||||
else:
|
||||
me_loops_color = None
|
||||
|
||||
tris_data = []
|
||||
|
||||
for p in me_polys:
|
||||
|
@ -138,7 +142,8 @@ def mesh_data_lists_from_mesh(me, material_colors):
|
|||
l_sta = p.loop_start
|
||||
l_len = p.loop_total
|
||||
loops_poly = me_loops[l_sta:l_sta + l_len]
|
||||
color_poly = me_loops_color[l_sta:l_sta + l_len]
|
||||
if me_loops_color is not None:
|
||||
color_poly = me_loops_color[l_sta:l_sta + l_len]
|
||||
i0 = 0
|
||||
i1 = 1
|
||||
|
||||
|
@ -150,9 +155,12 @@ def mesh_data_lists_from_mesh(me, material_colors):
|
|||
l1 = loops_poly[i1]
|
||||
l2 = loops_poly[i2]
|
||||
|
||||
c0 = color_poly[i0]
|
||||
c1 = color_poly[i1]
|
||||
c2 = color_poly[i2]
|
||||
if me_loops_color is not None:
|
||||
c0 = color_poly[i0].color
|
||||
c1 = color_poly[i1].color
|
||||
c2 = color_poly[i2].color
|
||||
else:
|
||||
c0 = c1 = c2 = (1.0, 1.0, 1.0, 1.0)
|
||||
|
||||
v0 = me_verts[l0.vertex_index]
|
||||
v1 = me_verts[l1.vertex_index]
|
||||
|
@ -186,7 +194,7 @@ def color_multiply_and_from_linear_to_srgb(base_color, vertex_color):
|
|||
The final color is the product between the base color and the vertex color.
|
||||
"""
|
||||
import mathutils
|
||||
color_linear = [c * b for c, b in zip(vertex_color.color, base_color)]
|
||||
color_linear = [c * b for c, b in zip(vertex_color, base_color)]
|
||||
color_srgb = mathutils.Color(color_linear[:3]).from_scene_linear_to_srgb()
|
||||
return tuple(round(c * 255) for c in (*color_srgb, color_linear[3]))
|
||||
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 08b372721b9b33a16f380cab23b2e5ded738ea96
|
||||
Subproject commit 4331c8e76c2f42b9fd903716c333d6cdeaa5cebd
|
|
@ -1 +1 @@
|
|||
Subproject commit d887a4ea6b2a9d64b926034d4e78ecf7a48ca979
|
||||
Subproject commit b3f0ffc587d197b37eac9a1566d1d24b7bee7d9a
|
|
@ -1 +1 @@
|
|||
Subproject commit 9d538629bb8a425991c7d10a49bab1ba0788c18f
|
||||
Subproject commit 14ab9273409ea0231d08ba6e86fdc73d4e459e99
|
|
@ -50,6 +50,8 @@ url_manual_mapping = (
|
|||
("bpy.types.cyclesobjectsettings.shadow_terminator_geometry_offset*", "render/cycles/object_settings/object_data.html#bpy-types-cyclesobjectsettings-shadow-terminator-geometry-offset"),
|
||||
("bpy.types.sequencertoolsettings.use_snap_current_frame_to_strips*", "video_editing/edit/montage/editing.html#bpy-types-sequencertoolsettings-use-snap-current-frame-to-strips"),
|
||||
("bpy.types.clothcollisionsettings.vertex_group_object_collisions*", "physics/cloth/settings/collisions.html#bpy-types-clothcollisionsettings-vertex-group-object-collisions"),
|
||||
("bpy.types.gpencilsculptsettings.use_automasking_material_active*", "grease_pencil/modes/sculpting/introduction.html#bpy-types-gpencilsculptsettings-use-automasking-material-active"),
|
||||
("bpy.types.gpencilsculptsettings.use_automasking_material_stroke*", "grease_pencil/modes/sculpting/introduction.html#bpy-types-gpencilsculptsettings-use-automasking-material-stroke"),
|
||||
("bpy.types.cycleslightsettings.use_multiple_importance_sampling*", "render/cycles/light_settings.html#bpy-types-cycleslightsettings-use-multiple-importance-sampling"),
|
||||
("bpy.types.fluiddomainsettings.sndparticle_potential_max_energy*", "physics/fluid/type/domain/liquid/particles.html#bpy-types-fluiddomainsettings-sndparticle-potential-max-energy"),
|
||||
("bpy.types.fluiddomainsettings.sndparticle_potential_min_energy*", "physics/fluid/type/domain/liquid/particles.html#bpy-types-fluiddomainsettings-sndparticle-potential-min-energy"),
|
||||
|
@ -61,6 +63,8 @@ url_manual_mapping = (
|
|||
("bpy.types.cyclesrendersettings.preview_denoising_start_sample*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-preview-denoising-start-sample"),
|
||||
("bpy.types.fluiddomainsettings.sndparticle_sampling_trappedair*", "physics/fluid/type/domain/liquid/particles.html#bpy-types-fluiddomainsettings-sndparticle-sampling-trappedair"),
|
||||
("bpy.types.fluiddomainsettings.sndparticle_sampling_wavecrest*", "physics/fluid/type/domain/liquid/particles.html#bpy-types-fluiddomainsettings-sndparticle-sampling-wavecrest"),
|
||||
("bpy.types.gpencilsculptsettings.use_automasking_layer_active*", "grease_pencil/modes/sculpting/introduction.html#bpy-types-gpencilsculptsettings-use-automasking-layer-active"),
|
||||
("bpy.types.gpencilsculptsettings.use_automasking_layer_stroke*", "grease_pencil/modes/sculpting/introduction.html#bpy-types-gpencilsculptsettings-use-automasking-layer-stroke"),
|
||||
("bpy.types.lineartgpencilmodifier.use_image_boundary_trimming*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-image-boundary-trimming"),
|
||||
("bpy.types.materiallineart.use_intersection_priority_override*", "render/materials/line_art.html#bpy-types-materiallineart-use-intersection-priority-override"),
|
||||
("bpy.types.rigidbodyconstraint.use_override_solver_iterations*", "physics/rigid_body/constraints/introduction.html#bpy-types-rigidbodyconstraint-use-override-solver-iterations"),
|
||||
|
@ -125,6 +129,7 @@ url_manual_mapping = (
|
|||
("bpy.types.cyclesrendersettings.min_transparent_bounces*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-min-transparent-bounces"),
|
||||
("bpy.types.fluiddomainsettings.use_collision_border_top*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-use-collision-border-top"),
|
||||
("bpy.types.gpencilsculptsettings.intersection_threshold*", "grease_pencil/modes/draw/tools/cutter.html#bpy-types-gpencilsculptsettings-intersection-threshold"),
|
||||
("bpy.types.gpencilsculptsettings.use_automasking_stroke*", "grease_pencil/modes/sculpting/introduction.html#bpy-types-gpencilsculptsettings-use-automasking-stroke"),
|
||||
("bpy.types.gpencilsculptsettings.use_multiframe_falloff*", "grease_pencil/multiframe.html#bpy-types-gpencilsculptsettings-use-multiframe-falloff"),
|
||||
("bpy.types.lineartgpencilmodifier.use_back_face_culling*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-back-face-culling"),
|
||||
("bpy.types.lineartgpencilmodifier.use_intersection_mask*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-intersection-mask"),
|
||||
|
@ -152,6 +157,7 @@ url_manual_mapping = (
|
|||
("bpy.types.linestylegeometrymodifier_backbonestretcher*", "render/freestyle/view_layer/line_style/modifiers/geometry/backbone_stretcher.html#bpy-types-linestylegeometrymodifier-backbonestretcher"),
|
||||
("bpy.types.linestylegeometrymodifier_sinusdisplacement*", "render/freestyle/view_layer/line_style/modifiers/geometry/sinus_displacement.html#bpy-types-linestylegeometrymodifier-sinusdisplacement"),
|
||||
("bpy.types.sequencertoolsettings.snap_to_current_frame*", "video_editing/edit/montage/editing.html#bpy-types-sequencertoolsettings-snap-to-current-frame"),
|
||||
("bpy.types.view3doverlay.sculpt_mode_face_sets_opacity*", "sculpt_paint/sculpting/editing/face_sets.html#bpy-types-view3doverlay-sculpt-mode-face-sets-opacity"),
|
||||
("bpy.ops.object.geometry_nodes_input_attribute_toggle*", "modeling/modifiers/generate/geometry_nodes.html#bpy-ops-object-geometry-nodes-input-attribute-toggle"),
|
||||
("bpy.types.animvizmotionpaths.show_keyframe_highlight*", "animation/motion_paths.html#bpy-types-animvizmotionpaths-show-keyframe-highlight"),
|
||||
("bpy.types.brushcurvessculptsettings.minimum_distance*", "sculpt_paint/curves_sculpting/tools/density_curves.html#bpy-types-brushcurvessculptsettings-minimum-distance"),
|
||||
|
@ -290,8 +296,8 @@ url_manual_mapping = (
|
|||
("bpy.types.fluiddomainsettings.vector_display_type*", "physics/fluid/type/domain/gas/viewport_display.html#bpy-types-fluiddomainsettings-vector-display-type"),
|
||||
("bpy.types.freestylelineset.select_by_image_border*", "render/freestyle/view_layer/line_set.html#bpy-types-freestylelineset-select-by-image-border"),
|
||||
("bpy.types.freestylesettings.kr_derivative_epsilon*", "render/freestyle/view_layer/freestyle.html#bpy-types-freestylesettings-kr-derivative-epsilon"),
|
||||
("bpy.types.geometrynodecurveprimitivebeziersegment*", "modeling/geometry_nodes/curve_primitives/bezier_segment.html#bpy-types-geometrynodecurveprimitivebeziersegment"),
|
||||
("bpy.types.geometrynodecurveprimitivequadrilateral*", "modeling/geometry_nodes/curve_primitives/quadrilateral.html#bpy-types-geometrynodecurveprimitivequadrilateral"),
|
||||
("bpy.types.geometrynodecurveprimitivebeziersegment*", "modeling/geometry_nodes/curve/primitives/bezier_segment.html#bpy-types-geometrynodecurveprimitivebeziersegment"),
|
||||
("bpy.types.geometrynodecurveprimitivequadrilateral*", "modeling/geometry_nodes/curve/primitives/quadrilateral.html#bpy-types-geometrynodecurveprimitivequadrilateral"),
|
||||
("bpy.types.lineartgpencilmodifier.crease_threshold*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-crease-threshold"),
|
||||
("bpy.types.lineartgpencilmodifier.smooth_tolerance*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-smooth-tolerance"),
|
||||
("bpy.types.lineartgpencilmodifier.use_intersection*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-intersection"),
|
||||
|
@ -403,8 +409,8 @@ url_manual_mapping = (
|
|||
("bpy.types.freestylelineset.select_by_collection*", "render/freestyle/view_layer/line_set.html#bpy-types-freestylelineset-select-by-collection"),
|
||||
("bpy.types.freestylelineset.select_by_edge_types*", "render/freestyle/view_layer/line_set.html#bpy-types-freestylelineset-select-by-edge-types"),
|
||||
("bpy.types.freestylelineset.select_by_face_marks*", "render/freestyle/view_layer/line_set.html#bpy-types-freestylelineset-select-by-face-marks"),
|
||||
("bpy.types.geometrynodeinputcurvehandlepositions*", "modeling/geometry_nodes/curve/curve_handle_position.html#bpy-types-geometrynodeinputcurvehandlepositions"),
|
||||
("bpy.types.geometrynodeinputedgepathstoselection*", "modeling/geometry_nodes/mesh/edge_paths_to_selection.html#bpy-types-geometrynodeinputedgepathstoselection"),
|
||||
("bpy.types.geometrynodeinputcurvehandlepositions*", "modeling/geometry_nodes/curve/read/curve_handle_position.html#bpy-types-geometrynodeinputcurvehandlepositions"),
|
||||
("bpy.types.geometrynodeinputedgepathstoselection*", "modeling/geometry_nodes/mesh/operations/edge_paths_to_selection.html#bpy-types-geometrynodeinputedgepathstoselection"),
|
||||
("bpy.types.linestyle*modifier_distancefromcamera*", "render/freestyle/view_layer/line_style/modifiers/color/distance_from_camera.html#bpy-types-linestyle-modifier-distancefromcamera"),
|
||||
("bpy.types.linestyle*modifier_distancefromobject*", "render/freestyle/view_layer/line_style/modifiers/color/distance_from_object.html#bpy-types-linestyle-modifier-distancefromobject"),
|
||||
("bpy.types.linestylegeometrymodifier_2dtransform*", "render/freestyle/view_layer/line_style/modifiers/geometry/2d_transform.html#bpy-types-linestylegeometrymodifier-2dtransform"),
|
||||
|
@ -414,6 +420,7 @@ url_manual_mapping = (
|
|||
("bpy.types.movietrackingplanetrack.image_opacity*", "movie_clip/tracking/clip/sidebar/track/plane_track.html#bpy-types-movietrackingplanetrack-image-opacity"),
|
||||
("bpy.types.particlesettings.use_parent_particles*", "physics/particles/emitter/render.html#bpy-types-particlesettings-use-parent-particles"),
|
||||
("bpy.types.rigidbodyconstraint.solver_iterations*", "physics/rigid_body/constraints/introduction.html#bpy-types-rigidbodyconstraint-solver-iterations"),
|
||||
("bpy.types.rigidbodyobject.collision_collections*", "physics/rigid_body/properties/collisions.html#bpy-types-rigidbodyobject-collision-collections"),
|
||||
("bpy.types.sculpt.automasking_start_normal_limit*", "sculpt_paint/sculpting/controls.html#bpy-types-sculpt-automasking-start-normal-limit"),
|
||||
("bpy.types.sculpt.use_automasking_boundary_edges*", "sculpt_paint/sculpting/controls.html#bpy-types-sculpt-use-automasking-boundary-edges"),
|
||||
("bpy.types.sequenceeditor.use_overlay_frame_lock*", "editors/video_sequencer/preview/sidebar.html#bpy-types-sequenceeditor-use-overlay-frame-lock"),
|
||||
|
@ -456,9 +463,9 @@ url_manual_mapping = (
|
|||
("bpy.types.freestylelinestyle.material_boundary*", "render/freestyle/view_layer/line_style/strokes.html#bpy-types-freestylelinestyle-material-boundary"),
|
||||
("bpy.types.freestylelinestyle.use_split_pattern*", "render/freestyle/view_layer/line_style/strokes.html#bpy-types-freestylelinestyle-use-split-pattern"),
|
||||
("bpy.types.freestylesettings.use_view_map_cache*", "render/freestyle/view_layer/freestyle.html#bpy-types-freestylesettings-use-view-map-cache"),
|
||||
("bpy.types.geometrynodecurvehandletypeselection*", "modeling/geometry_nodes/curve/handle_type_selection.html#bpy-types-geometrynodecurvehandletypeselection"),
|
||||
("bpy.types.geometrynodecurvehandletypeselection*", "modeling/geometry_nodes/curve/read/handle_type_selection.html#bpy-types-geometrynodecurvehandletypeselection"),
|
||||
("bpy.types.geometrynodedistributepointsinvolume*", "modeling/geometry_nodes/point/distribute_points_in_volume.html#bpy-types-geometrynodedistributepointsinvolume"),
|
||||
("bpy.types.geometrynodeinputmeshvertexneighbors*", "modeling/geometry_nodes/mesh/vertex_neighbors.html#bpy-types-geometrynodeinputmeshvertexneighbors"),
|
||||
("bpy.types.geometrynodeinputmeshvertexneighbors*", "modeling/geometry_nodes/mesh/read/vertex_neighbors.html#bpy-types-geometrynodeinputmeshvertexneighbors"),
|
||||
("bpy.types.greasepencil.curve_edit_corner_angle*", "grease_pencil/modes/edit/curve_editing.html#bpy-types-greasepencil-curve-edit-corner-angle"),
|
||||
("bpy.types.imageformatsettings.color_management*", "render/output/properties/output.html#bpy-types-imageformatsettings-color-management"),
|
||||
("bpy.types.lineartgpencilmodifier.source_camera*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-source-camera"),
|
||||
|
@ -472,6 +479,8 @@ url_manual_mapping = (
|
|||
("bpy.types.movietrackingtrack.use_green_channel*", "movie_clip/tracking/clip/sidebar/track/track.html#bpy-types-movietrackingtrack-use-green-channel"),
|
||||
("bpy.types.rendersettings.resolution_percentage*", "render/output/properties/format.html#bpy-types-rendersettings-resolution-percentage"),
|
||||
("bpy.types.rendersettings_simplify_gpencil_tint*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-gpencil-tint"),
|
||||
("bpy.types.softbodysettings.use_estimate_matrix*", "physics/soft_body/settings/solver.html#bpy-types-softbodysettings-use-estimate-matrix"),
|
||||
("bpy.types.softbodysettings.vertex_group_spring*", "physics/soft_body/settings/edges.html#bpy-types-softbodysettings-vertex-group-spring"),
|
||||
("bpy.types.spaceimageeditor.show_gizmo_navigate*", "editors/image/introduction.html#bpy-types-spaceimageeditor-show-gizmo-navigate"),
|
||||
("bpy.types.spaceoutliner.lib_override_view_mode*", "editors/outliner/interface.html#bpy-types-spaceoutliner-lib-override-view-mode"),
|
||||
("bpy.types.spaceoutliner.use_filter_object_mesh*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-object-mesh"),
|
||||
|
@ -527,7 +536,7 @@ url_manual_mapping = (
|
|||
("bpy.types.freestylelinestyle.integration_type*", "render/freestyle/view_layer/line_style/strokes.html#bpy-types-freestylelinestyle-integration-type"),
|
||||
("bpy.types.freestylelinestyle.use_split_length*", "render/freestyle/view_layer/line_style/strokes.html#bpy-types-freestylelinestyle-use-split-length"),
|
||||
("bpy.types.geometrynodedistributepointsonfaces*", "modeling/geometry_nodes/point/distribute_points_on_faces.html#bpy-types-geometrynodedistributepointsonfaces"),
|
||||
("bpy.types.geometrynodesetcurvehandlepositions*", "modeling/geometry_nodes/curve/set_handle_positions.html#bpy-types-geometrynodesetcurvehandlepositions"),
|
||||
("bpy.types.geometrynodesetcurvehandlepositions*", "modeling/geometry_nodes/curve/write/set_handle_positions.html#bpy-types-geometrynodesetcurvehandlepositions"),
|
||||
("bpy.types.greasepencil.stroke_thickness_space*", "grease_pencil/properties/strokes.html#bpy-types-greasepencil-stroke-thickness-space"),
|
||||
("bpy.types.lineartgpencilmodifier.use_material*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-material"),
|
||||
("bpy.types.linestylegeometrymodifier_blueprint*", "render/freestyle/view_layer/line_style/modifiers/geometry/blueprint.html#bpy-types-linestylegeometrymodifier-blueprint"),
|
||||
|
@ -540,6 +549,9 @@ url_manual_mapping = (
|
|||
("bpy.types.rendersettings.simplify_subdivision*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-subdivision"),
|
||||
("bpy.types.sculpt.use_automasking_start_normal*", "sculpt_paint/sculpting/controls.html#bpy-types-sculpt-use-automasking-start-normal"),
|
||||
("bpy.types.sequencerpreviewoverlay.show_cursor*", "editors/video_sequencer/preview/display/overlays.html#bpy-types-sequencerpreviewoverlay-show-cursor"),
|
||||
("bpy.types.softbodysettings.use_edge_collision*", "physics/soft_body/settings/edges.html#bpy-types-softbodysettings-use-edge-collision"),
|
||||
("bpy.types.softbodysettings.use_face_collision*", "physics/soft_body/settings/edges.html#bpy-types-softbodysettings-use-face-collision"),
|
||||
("bpy.types.softbodysettings.use_self_collision*", "physics/soft_body/settings/self_collision.html#bpy-types-softbodysettings-use-self-collision"),
|
||||
("bpy.types.spacegrapheditor.show_extrapolation*", "editors/graph_editor/introduction.html#bpy-types-spacegrapheditor-show-extrapolation"),
|
||||
("bpy.types.spaceoutliner.use_filter_collection*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-collection"),
|
||||
("bpy.types.spacesequenceeditor.cursor_location*", "editors/video_sequencer/preview/sidebar.html#bpy-types-spacesequenceeditor-cursor-location"),
|
||||
|
@ -591,12 +603,12 @@ url_manual_mapping = (
|
|||
("bpy.types.freestylelinestyle.use_chain_count*", "render/freestyle/view_layer/line_style/strokes.html#bpy-types-freestylelinestyle-use-chain-count"),
|
||||
("bpy.types.freestylelinestyle.use_dashed_line*", "render/freestyle/view_layer/line_style/strokes.html#bpy-types-freestylelinestyle-use-dashed-line"),
|
||||
("bpy.types.freestylelinestyle.use_same_object*", "render/freestyle/view_layer/line_style/strokes.html#bpy-types-freestylelinestyle-use-same-object"),
|
||||
("bpy.types.functionnodeinputspecialcharacters*", "modeling/geometry_nodes/text/special_characters.html#bpy-types-functionnodeinputspecialcharacters"),
|
||||
("bpy.types.geometrynodecurveendpointselection*", "modeling/geometry_nodes/curve/endpoint_selection.html#bpy-types-geometrynodecurveendpointselection"),
|
||||
("bpy.types.geometrynodeinputedgepathstocurves*", "modeling/geometry_nodes/mesh/edge_paths_to_curves.html#bpy-types-geometrynodeinputedgepathstocurves"),
|
||||
("bpy.types.geometrynodeinputmeshedgeneighbors*", "modeling/geometry_nodes/mesh/edge_neighbors.html#bpy-types-geometrynodeinputmeshedgeneighbors"),
|
||||
("bpy.types.geometrynodeinputmeshfaceneighbors*", "modeling/geometry_nodes/mesh/face_neighbors.html#bpy-types-geometrynodeinputmeshfaceneighbors"),
|
||||
("bpy.types.geometrynodeinputshortestedgepaths*", "modeling/geometry_nodes/mesh/shortest_edge_paths.html#bpy-types-geometrynodeinputshortestedgepaths"),
|
||||
("bpy.types.functionnodeinputspecialcharacters*", "modeling/geometry_nodes/utilities/text/special_characters.html#bpy-types-functionnodeinputspecialcharacters"),
|
||||
("bpy.types.geometrynodecurveendpointselection*", "modeling/geometry_nodes/curve/read/endpoint_selection.html#bpy-types-geometrynodecurveendpointselection"),
|
||||
("bpy.types.geometrynodeinputedgepathstocurves*", "modeling/geometry_nodes/mesh/operations/edge_paths_to_curves.html#bpy-types-geometrynodeinputedgepathstocurves"),
|
||||
("bpy.types.geometrynodeinputmeshedgeneighbors*", "modeling/geometry_nodes/mesh/read/edge_neighbors.html#bpy-types-geometrynodeinputmeshedgeneighbors"),
|
||||
("bpy.types.geometrynodeinputmeshfaceneighbors*", "modeling/geometry_nodes/mesh/read/face_neighbors.html#bpy-types-geometrynodeinputmeshfaceneighbors"),
|
||||
("bpy.types.geometrynodeinputshortestedgepaths*", "modeling/geometry_nodes/mesh/read/shortest_edge_paths.html#bpy-types-geometrynodeinputshortestedgepaths"),
|
||||
("bpy.types.gpencilsculptguide.reference_point*", "grease_pencil/modes/draw/guides.html#bpy-types-gpencilsculptguide-reference-point"),
|
||||
("bpy.types.greasepencil.edit_curve_resolution*", "grease_pencil/modes/edit/curve_editing.html#bpy-types-greasepencil-edit-curve-resolution"),
|
||||
("bpy.types.lineartgpencilmodifier.use_contour*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-contour"),
|
||||
|
@ -613,6 +625,9 @@ url_manual_mapping = (
|
|||
("bpy.types.sculpt.use_automasking_view_normal*", "sculpt_paint/sculpting/controls.html#bpy-types-sculpt-use-automasking-view-normal"),
|
||||
("bpy.types.sequencertimelineoverlay.show_grid*", "editors/video_sequencer/sequencer/display.html#bpy-types-sequencertimelineoverlay-show-grid"),
|
||||
("bpy.types.sequencertoolsettings.overlap_mode*", "video_editing/edit/montage/editing.html#bpy-types-sequencertoolsettings-overlap-mode"),
|
||||
("bpy.types.softbodysettings.aerodynamics_type*", "physics/soft_body/settings/edges.html#bpy-types-softbodysettings-aerodynamics-type"),
|
||||
("bpy.types.softbodysettings.vertex_group_goal*", "physics/soft_body/settings/goal.html#bpy-types-softbodysettings-vertex-group-goal"),
|
||||
("bpy.types.softbodysettings.vertex_group_mass*", "physics/soft_body/settings/object.html#bpy-types-softbodysettings-vertex-group-mass"),
|
||||
("bpy.types.spaceclipeditor.show_green_channel*", "editors/clip/display/clip_display.html#bpy-types-spaceclipeditor-show-green-channel"),
|
||||
("bpy.types.spacenodeoverlay.show_context_path*", "interface/controls/nodes/introduction.html#bpy-types-spacenodeoverlay-show-context-path"),
|
||||
("bpy.types.spaceoutliner.show_restrict_column*", "editors/outliner/interface.html#bpy-types-spaceoutliner-show-restrict-column"),
|
||||
|
@ -652,12 +667,12 @@ url_manual_mapping = (
|
|||
("bpy.types.freestylelineset.select_edge_mark*", "render/freestyle/view_layer/line_set.html#bpy-types-freestylelineset-select-edge-mark"),
|
||||
("bpy.types.freestylelinestyle.use_length_max*", "render/freestyle/view_layer/line_style/strokes.html#bpy-types-freestylelinestyle-use-length-max"),
|
||||
("bpy.types.freestylelinestyle.use_length_min*", "render/freestyle/view_layer/line_style/strokes.html#bpy-types-freestylelinestyle-use-length-min"),
|
||||
("bpy.types.geometrynodedeformcurvesonsurface*", "modeling/geometry_nodes/curve/deform_curves_on_surface.html#bpy-types-geometrynodedeformcurvesonsurface"),
|
||||
("bpy.types.geometrynodedeformcurvesonsurface*", "modeling/geometry_nodes/curve/operations/deform_curves_on_surface.html#bpy-types-geometrynodedeformcurvesonsurface"),
|
||||
("bpy.types.geometrynodeinputinstancerotation*", "modeling/geometry_nodes/instances/instance_rotation.html#bpy-types-geometrynodeinputinstancerotation"),
|
||||
("bpy.types.geometrynodeinputmeshedgevertices*", "modeling/geometry_nodes/mesh/edge_vertices.html#bpy-types-geometrynodeinputmeshedgevertices"),
|
||||
("bpy.types.geometrynodeinputmeshfaceisplanar*", "modeling/geometry_nodes/mesh/face_is_planar.html#bpy-types-geometrynodeinputmeshfaceisplanar"),
|
||||
("bpy.types.geometrynodeinputsplineresolution*", "modeling/geometry_nodes/curve/spline_resolution.html#bpy-types-geometrynodeinputsplineresolution"),
|
||||
("bpy.types.geometrynodemeshfacesetboundaries*", "modeling/geometry_nodes/mesh/face_set_boundaries.html#bpy-types-geometrynodemeshfacesetboundaries"),
|
||||
("bpy.types.geometrynodeinputmeshedgevertices*", "modeling/geometry_nodes/mesh/read/edge_vertices.html#bpy-types-geometrynodeinputmeshedgevertices"),
|
||||
("bpy.types.geometrynodeinputmeshfaceisplanar*", "modeling/geometry_nodes/mesh/read/face_is_planar.html#bpy-types-geometrynodeinputmeshfaceisplanar"),
|
||||
("bpy.types.geometrynodeinputsplineresolution*", "modeling/geometry_nodes/curve/read/spline_resolution.html#bpy-types-geometrynodeinputsplineresolution"),
|
||||
("bpy.types.geometrynodemeshfacesetboundaries*", "modeling/geometry_nodes/mesh/read/face_set_boundaries.html#bpy-types-geometrynodemeshfacesetboundaries"),
|
||||
("bpy.types.greasepencil.curve_edit_threshold*", "grease_pencil/modes/edit/curve_editing.html#bpy-types-greasepencil-curve-edit-threshold"),
|
||||
("bpy.types.lineartgpencilmodifier.use_crease*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-crease"),
|
||||
("bpy.types.lineartgpencilmodifier.use_shadow*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-shadow"),
|
||||
|
@ -669,6 +684,7 @@ url_manual_mapping = (
|
|||
("bpy.types.rendersettings.use_crop_to_border*", "render/output/properties/format.html#bpy-types-rendersettings-use-crop-to-border"),
|
||||
("bpy.types.rendersettings.use_file_extension*", "render/output/properties/output.html#bpy-types-rendersettings-use-file-extension"),
|
||||
("bpy.types.sculpt.constant_detail_resolution*", "sculpt_paint/sculpting/tool_settings/dyntopo.html#bpy-types-sculpt-constant-detail-resolution"),
|
||||
("bpy.types.sequencemodifier.input_mask_strip*", "editors/video_sequencer/sequencer/sidebar/modifiers.html#bpy-types-sequencemodifier-input-mask-strip"),
|
||||
("bpy.types.sequencertoolsettings.pivot_point*", "editors/video_sequencer/preview/controls/pivot_point.html#bpy-types-sequencertoolsettings-pivot-point"),
|
||||
("bpy.types.spaceclipeditor.annotation_source*", "movie_clip/tracking/clip/sidebar/view.html#bpy-types-spaceclipeditor-annotation-source"),
|
||||
("bpy.types.spaceclipeditor.mask_display_type*", "editors/clip/display/mask_display.html#bpy-types-spaceclipeditor-mask-display-type"),
|
||||
|
@ -676,6 +692,7 @@ url_manual_mapping = (
|
|||
("bpy.types.spaceclipeditor.show_blue_channel*", "editors/clip/display/clip_display.html#bpy-types-spaceclipeditor-show-blue-channel"),
|
||||
("bpy.types.spaceclipeditor.show_mask_overlay*", "editors/clip/display/mask_display.html#bpy-types-spaceclipeditor-show-mask-overlay"),
|
||||
("bpy.types.spacefilebrowser.system_bookmarks*", "editors/file_browser.html#bpy-types-spacefilebrowser-system-bookmarks"),
|
||||
("bpy.types.spaceimageeditor.display_channels*", "editors/image/introduction.html#bpy-types-spaceimageeditor-display-channels"),
|
||||
("bpy.types.spaceoutliner.use_filter_children*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-children"),
|
||||
("bpy.types.spaceoutliner.use_filter_complete*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-complete"),
|
||||
("bpy.types.spacespreadsheet.attribute_domain*", "editors/spreadsheet.html#bpy-types-spacespreadsheet-attribute-domain"),
|
||||
|
@ -730,10 +747,10 @@ url_manual_mapping = (
|
|||
("bpy.types.freestylelinestyle.use_angle_min*", "render/freestyle/view_layer/line_style/strokes.html#bpy-types-freestylelinestyle-use-angle-min"),
|
||||
("bpy.types.freestylesettings.as_render_pass*", "render/freestyle/view_layer/freestyle.html#bpy-types-freestylesettings-as-render-pass"),
|
||||
("bpy.types.freestylesettings.use_smoothness*", "render/freestyle/view_layer/freestyle.html#bpy-types-freestylesettings-use-smoothness"),
|
||||
("bpy.types.geometrynodecurveprimitivecircle*", "modeling/geometry_nodes/curve_primitives/curve_circle.html#bpy-types-geometrynodecurveprimitivecircle"),
|
||||
("bpy.types.geometrynodecurvequadraticbezier*", "modeling/geometry_nodes/curve_primitives/quadratic_bezier.html#bpy-types-geometrynodecurvequadraticbezier"),
|
||||
("bpy.types.geometrynodecurveprimitivecircle*", "modeling/geometry_nodes/curve/primitives/curve_circle.html#bpy-types-geometrynodecurveprimitivecircle"),
|
||||
("bpy.types.geometrynodecurvequadraticbezier*", "modeling/geometry_nodes/curve/primitives/quadratic_bezier.html#bpy-types-geometrynodecurvequadraticbezier"),
|
||||
("bpy.types.geometrynoderemovenamedattribute*", "modeling/geometry_nodes/attribute/remove_named_attribute.html#bpy-types-geometrynoderemovenamedattribute"),
|
||||
("bpy.types.geometrynodesamplenearestsurface*", "modeling/geometry_nodes/mesh/sample_nearest_surface.html#bpy-types-geometrynodesamplenearestsurface"),
|
||||
("bpy.types.geometrynodesamplenearestsurface*", "modeling/geometry_nodes/mesh/operations/sample_nearest_surface.html#bpy-types-geometrynodesamplenearestsurface"),
|
||||
("bpy.types.gpencillayer.use_viewlayer_masks*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-use-viewlayer-masks"),
|
||||
("bpy.types.greasepencil.onion_keyframe_type*", "grease_pencil/properties/onion_skinning.html#bpy-types-greasepencil-onion-keyframe-type"),
|
||||
("bpy.types.lineartgpencilmodifier.use_cache*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-cache"),
|
||||
|
@ -744,8 +761,12 @@ url_manual_mapping = (
|
|||
("bpy.types.movietrackingcamera.sensor_width*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-types-movietrackingcamera-sensor-width"),
|
||||
("bpy.types.posebone.use_ik_rotation_control*", "animation/armatures/posing/bone_constraints/inverse_kinematics/introduction.html#bpy-types-posebone-use-ik-rotation-control"),
|
||||
("bpy.types.rendersettings.use_bake_multires*", "render/cycles/baking.html#bpy-types-rendersettings-use-bake-multires"),
|
||||
("bpy.types.rigidbodyobject.collision_margin*", "physics/rigid_body/properties/collisions.html#bpy-types-rigidbodyobject-collision-margin"),
|
||||
("bpy.types.scenegpencil.antialias_threshold*", "render/cycles/render_settings/grease_pencil.html#bpy-types-scenegpencil-antialias-threshold"),
|
||||
("bpy.types.sculpt.use_automasking_face_sets*", "sculpt_paint/sculpting/controls.html#bpy-types-sculpt-use-automasking-face-sets"),
|
||||
("bpy.types.sequencemodifier.input_mask_type*", "editors/video_sequencer/sequencer/sidebar/modifiers.html#bpy-types-sequencemodifier-input-mask-type"),
|
||||
("bpy.types.softbodysettings.error_threshold*", "physics/soft_body/settings/solver.html#bpy-types-softbodysettings-error-threshold"),
|
||||
("bpy.types.softbodysettings.use_stiff_quads*", "physics/soft_body/settings/edges.html#bpy-types-softbodysettings-use-stiff-quads"),
|
||||
("bpy.types.spaceclipeditor.show_mask_spline*", "editors/clip/display/mask_display.html#bpy-types-spaceclipeditor-show-mask-spline"),
|
||||
("bpy.types.spaceclipeditor.show_red_channel*", "editors/clip/display/clip_display.html#bpy-types-spaceclipeditor-show-red-channel"),
|
||||
("bpy.types.spaceclipeditor.use_mute_footage*", "editors/clip/display/clip_display.html#bpy-types-spaceclipeditor-use-mute-footage"),
|
||||
|
@ -803,7 +824,7 @@ url_manual_mapping = (
|
|||
("bpy.types.freestylelinestyle.use_chaining*", "render/freestyle/view_layer/line_style/strokes.html#bpy-types-freestylelinestyle-use-chaining"),
|
||||
("bpy.types.freestylesettings.sphere_radius*", "render/freestyle/view_layer/freestyle.html#bpy-types-freestylesettings-sphere-radius"),
|
||||
("bpy.types.geometrynodeattributedomainsize*", "modeling/geometry_nodes/attribute/domain_size.html#bpy-types-geometrynodeattributedomainsize"),
|
||||
("bpy.types.geometrynodesetsplineresolution*", "modeling/geometry_nodes/curve/set_spline_resolution.html#bpy-types-geometrynodesetsplineresolution"),
|
||||
("bpy.types.geometrynodesetsplineresolution*", "modeling/geometry_nodes/curve/write/set_spline_resolution.html#bpy-types-geometrynodesetsplineresolution"),
|
||||
("bpy.types.geometrynodestorenamedattribute*", "modeling/geometry_nodes/attribute/store_named_attribute.html#bpy-types-geometrynodestorenamedattribute"),
|
||||
("bpy.types.gpencillayer.annotation_opacity*", "interface/annotate_tool.html#bpy-types-gpencillayer-annotation-opacity"),
|
||||
("bpy.types.gpencillayer.use_onion_skinning*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-use-onion-skinning"),
|
||||
|
@ -825,8 +846,10 @@ url_manual_mapping = (
|
|||
("bpy.types.rendersettings.simplify_volumes*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-volumes"),
|
||||
("bpy.types.rendersettings.use_render_cache*", "render/output/properties/output.html#bpy-types-rendersettings-use-render-cache"),
|
||||
("bpy.types.rendersettings.use_single_layer*", "render/layers/view_layer.html#bpy-types-rendersettings-use-single-layer"),
|
||||
("bpy.types.rigidbodyobject.collision_shape*", "physics/rigid_body/properties/collisions.html#bpy-types-rigidbodyobject-collision-shape"),
|
||||
("bpy.types.sceneeevee.use_taa_reprojection*", "render/eevee/render_settings/sampling.html#bpy-types-sceneeevee-use-taa-reprojection"),
|
||||
("bpy.types.sculpt.use_automasking_topology*", "sculpt_paint/sculpting/controls.html#bpy-types-sculpt-use-automasking-topology"),
|
||||
("bpy.types.softbodysettings.collision_type*", "physics/soft_body/settings/self_collision.html#bpy-types-softbodysettings-collision-type"),
|
||||
("bpy.types.spaceclipeditor.cursor_location*", "editors/clip/sidebar.html#bpy-types-spaceclipeditor-cursor-location"),
|
||||
("bpy.types.spacefilebrowser.recent_folders*", "editors/file_browser.html#bpy-types-spacefilebrowser-recent-folders"),
|
||||
("bpy.types.spacefilebrowser.system_folders*", "editors/file_browser.html#bpy-types-spacefilebrowser-system-folders"),
|
||||
|
@ -885,17 +908,17 @@ url_manual_mapping = (
|
|||
("bpy.types.freestylelinestyle.chain_count*", "render/freestyle/view_layer/line_style/strokes.html#bpy-types-freestylelinestyle-chain-count"),
|
||||
("bpy.types.freestylelinestyle.use_sorting*", "render/freestyle/view_layer/line_style/strokes.html#bpy-types-freestylelinestyle-use-sorting"),
|
||||
("bpy.types.freestylesettings.crease_angle*", "render/freestyle/view_layer/freestyle.html#bpy-types-freestylesettings-crease-angle"),
|
||||
("bpy.types.functionnodealigneulertovector*", "modeling/geometry_nodes/utilities/align_euler_to_vector.html#bpy-types-functionnodealigneulertovector"),
|
||||
("bpy.types.functionnodealigneulertovector*", "modeling/geometry_nodes/utilities/rotation/align_euler_to_vector.html#bpy-types-functionnodealigneulertovector"),
|
||||
("bpy.types.geometrynodeattributestatistic*", "modeling/geometry_nodes/attribute/attribute_statistic.html#bpy-types-geometrynodeattributestatistic"),
|
||||
("bpy.types.geometrynodecurveprimitiveline*", "modeling/geometry_nodes/curve_primitives/curve_line.html#bpy-types-geometrynodecurveprimitiveline"),
|
||||
("bpy.types.geometrynodecurveprimitiveline*", "modeling/geometry_nodes/curve/primitives/curve_line.html#bpy-types-geometrynodecurveprimitiveline"),
|
||||
("bpy.types.geometrynodegeometrytoinstance*", "modeling/geometry_nodes/geometry/geometry_to_instance.html#bpy-types-geometrynodegeometrytoinstance"),
|
||||
("bpy.types.geometrynodeinputinstancescale*", "modeling/geometry_nodes/instances/instance_scale.html#bpy-types-geometrynodeinputinstancescale"),
|
||||
("bpy.types.geometrynodeinputmaterialindex*", "modeling/geometry_nodes/material/material_index.html#bpy-types-geometrynodeinputmaterialindex"),
|
||||
("bpy.types.geometrynodeinputmeshedgeangle*", "modeling/geometry_nodes/mesh/edge_angle.html#bpy-types-geometrynodeinputmeshedgeangle"),
|
||||
("bpy.types.geometrynodeoffsetcornerinface*", "modeling/geometry_nodes/mesh_topology/offset_corner_in_face.html#bpy-types-geometrynodeoffsetcornerinface"),
|
||||
("bpy.types.geometrynodeoffsetpointincurve*", "modeling/geometry_nodes/curve_topology/offset_point_in_curve.html#bpy-types-geometrynodeoffsetpointincurve"),
|
||||
("bpy.types.geometrynodeseparatecomponents*", "modeling/geometry_nodes/geometry/separate_components.html#bpy-types-geometrynodeseparatecomponents"),
|
||||
("bpy.types.geometrynodesubdivisionsurface*", "modeling/geometry_nodes/mesh/subdivision_surface.html#bpy-types-geometrynodesubdivisionsurface"),
|
||||
("bpy.types.geometrynodeinputmeshedgeangle*", "modeling/geometry_nodes/mesh/read/edge_angle.html#bpy-types-geometrynodeinputmeshedgeangle"),
|
||||
("bpy.types.geometrynodeoffsetcornerinface*", "modeling/geometry_nodes/mesh/topology/offset_corner_in_face.html#bpy-types-geometrynodeoffsetcornerinface"),
|
||||
("bpy.types.geometrynodeoffsetpointincurve*", "modeling/geometry_nodes/curve/topology/offset_point_in_curve.html#bpy-types-geometrynodeoffsetpointincurve"),
|
||||
("bpy.types.geometrynodeseparatecomponents*", "modeling/geometry_nodes/geometry/operations/separate_components.html#bpy-types-geometrynodeseparatecomponents"),
|
||||
("bpy.types.geometrynodesubdivisionsurface*", "modeling/geometry_nodes/mesh/operations/subdivision_surface.html#bpy-types-geometrynodesubdivisionsurface"),
|
||||
("bpy.types.geometrynodetranslateinstances*", "modeling/geometry_nodes/instances/translate_instances.html#bpy-types-geometrynodetranslateinstances"),
|
||||
("bpy.types.greasepencil.ghost_after_range*", "grease_pencil/properties/onion_skinning.html#bpy-types-greasepencil-ghost-after-range"),
|
||||
("bpy.types.greasepencil.use_ghosts_always*", "grease_pencil/properties/onion_skinning.html#bpy-types-greasepencil-use-ghosts-always"),
|
||||
|
@ -920,7 +943,11 @@ url_manual_mapping = (
|
|||
("bpy.types.rendersettings.use_compositing*", "render/output/properties/post_processing.html#bpy-types-rendersettings-use-compositing"),
|
||||
("bpy.types.rendersettings.use_motion_blur*", "render/cycles/render_settings/motion_blur.html#bpy-types-rendersettings-use-motion-blur"),
|
||||
("bpy.types.rendersettings.use_placeholder*", "render/output/properties/output.html#bpy-types-rendersettings-use-placeholder"),
|
||||
("bpy.types.sequencemodifier.input_mask_id*", "editors/video_sequencer/sequencer/sidebar/modifiers.html#bpy-types-sequencemodifier-input-mask-id"),
|
||||
("bpy.types.shadernodesubsurfacescattering*", "render/shader_nodes/shader/sss.html#bpy-types-shadernodesubsurfacescattering"),
|
||||
("bpy.types.softbodysettings.goal_friction*", "physics/soft_body/settings/goal.html#bpy-types-softbodysettings-goal-friction"),
|
||||
("bpy.types.softbodysettings.spring_length*", "physics/soft_body/settings/edges.html#bpy-types-softbodysettings-spring-length"),
|
||||
("bpy.types.softbodysettings.use_auto_step*", "physics/soft_body/settings/solver.html#bpy-types-softbodysettings-use-auto-step"),
|
||||
("bpy.types.spaceclipeditor.lock_selection*", "editors/clip/introduction.html#bpy-types-spaceclipeditor-lock-selection"),
|
||||
("bpy.types.spacedopesheeteditor.auto_snap*", "editors/dope_sheet/editing.html#bpy-types-spacedopesheeteditor-auto-snap"),
|
||||
("bpy.types.spacenodeoverlay.show_overlays*", "interface/controls/nodes/introduction.html#bpy-types-spacenodeoverlay-show-overlays"),
|
||||
|
@ -989,9 +1016,9 @@ url_manual_mapping = (
|
|||
("bpy.types.freestylelinestyle.sort_order*", "render/freestyle/view_layer/line_style/strokes.html#bpy-types-freestylelinestyle-sort-order"),
|
||||
("bpy.types.freestylelinestyle.split_dash*", "render/freestyle/view_layer/line_style/strokes.html#bpy-types-freestylelinestyle-split-dash"),
|
||||
("bpy.types.freestylesettings.use_culling*", "render/freestyle/view_layer/freestyle.html#bpy-types-freestylesettings-use-culling"),
|
||||
("bpy.types.geometrynodeduplicateelements*", "modeling/geometry_nodes/geometry/duplicate_elements.html#bpy-types-geometrynodeduplicateelements"),
|
||||
("bpy.types.geometrynodeinputmeshfacearea*", "modeling/geometry_nodes/mesh/face_area.html#bpy-types-geometrynodeinputmeshfacearea"),
|
||||
("bpy.types.geometrynodeinputsplinecyclic*", "modeling/geometry_nodes/curve/is_spline_cyclic.html#bpy-types-geometrynodeinputsplinecyclic"),
|
||||
("bpy.types.geometrynodeduplicateelements*", "modeling/geometry_nodes/geometry/operations/duplicate_elements.html#bpy-types-geometrynodeduplicateelements"),
|
||||
("bpy.types.geometrynodeinputmeshfacearea*", "modeling/geometry_nodes/mesh/read/face_area.html#bpy-types-geometrynodeinputmeshfacearea"),
|
||||
("bpy.types.geometrynodeinputsplinecyclic*", "modeling/geometry_nodes/curve/read/is_spline_cyclic.html#bpy-types-geometrynodeinputsplinecyclic"),
|
||||
("bpy.types.geometrynodeinstancestopoints*", "modeling/geometry_nodes/instances/instances_to_points.html#bpy-types-geometrynodeinstancestopoints"),
|
||||
("bpy.types.gpencillayer.viewlayer_render*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-viewlayer-render"),
|
||||
("bpy.types.imagepaint.use_normal_falloff*", "sculpt_paint/brush/falloff.html#bpy-types-imagepaint-use-normal-falloff"),
|
||||
|
@ -1011,6 +1038,8 @@ url_manual_mapping = (
|
|||
("bpy.types.sceneeevee.taa_render_samples*", "render/eevee/render_settings/sampling.html#bpy-types-sceneeevee-taa-render-samples"),
|
||||
("bpy.types.sculpt.use_automasking_cavity*", "sculpt_paint/sculpting/controls.html#bpy-types-sculpt-use-automasking-cavity"),
|
||||
("bpy.types.sequence.frame_final_duration*", "editors/video_sequencer/sequencer/sidebar/strip.html#bpy-types-sequence-frame-final-duration"),
|
||||
("bpy.types.softbodysettings.goal_default*", "physics/soft_body/settings/goal.html#bpy-types-softbodysettings-goal-default"),
|
||||
("bpy.types.softbodysettings.use_diagnose*", "physics/soft_body/settings/solver.html#bpy-types-softbodysettings-use-diagnose"),
|
||||
("bpy.types.spaceoutliner.use_sync_select*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-sync-select"),
|
||||
("bpy.types.spaceproperties.outliner_sync*", "editors/properties_editor.html#bpy-types-spaceproperties-outliner-sync"),
|
||||
("bpy.types.spaceproperties.search_filter*", "editors/properties_editor.html#bpy-types-spaceproperties-search-filter"),
|
||||
|
@ -1069,11 +1098,11 @@ url_manual_mapping = (
|
|||
("bpy.types.freestylelinestyle.split_gap*", "render/freestyle/view_layer/line_style/strokes.html#bpy-types-freestylelinestyle-split-gap"),
|
||||
("bpy.types.freestylelinestyle.use_nodes*", "render/freestyle/view_layer/line_style/texture.html#bpy-types-freestylelinestyle-use-nodes"),
|
||||
("bpy.types.geometrynodecaptureattribute*", "modeling/geometry_nodes/attribute/capture_attribute.html#bpy-types-geometrynodecaptureattribute"),
|
||||
("bpy.types.geometrynodeinputshadesmooth*", "modeling/geometry_nodes/mesh/is_shade_smooth.html#bpy-types-geometrynodeinputshadesmooth"),
|
||||
("bpy.types.geometrynodeinputshadesmooth*", "modeling/geometry_nodes/mesh/read/is_shade_smooth.html#bpy-types-geometrynodeinputshadesmooth"),
|
||||
("bpy.types.geometrynodeinstanceonpoints*", "modeling/geometry_nodes/instances/instance_on_points.html#bpy-types-geometrynodeinstanceonpoints"),
|
||||
("bpy.types.geometrynodepointstovertices*", "modeling/geometry_nodes/point/points_to_vertices.html#bpy-types-geometrynodepointstovertices"),
|
||||
("bpy.types.geometrynoderealizeinstances*", "modeling/geometry_nodes/instances/realize_instances.html#bpy-types-geometrynoderealizeinstances"),
|
||||
("bpy.types.geometrynodeseparategeometry*", "modeling/geometry_nodes/geometry/separate_geometry.html#bpy-types-geometrynodeseparategeometry"),
|
||||
("bpy.types.geometrynodeseparategeometry*", "modeling/geometry_nodes/geometry/operations/separate_geometry.html#bpy-types-geometrynodeseparategeometry"),
|
||||
("bpy.types.geometrynodesetmaterialindex*", "modeling/geometry_nodes/material/set_material_index.html#bpy-types-geometrynodesetmaterialindex"),
|
||||
("bpy.types.greasepencil.edit_line_color*", "grease_pencil/properties/display.html#bpy-types-greasepencil-edit-line-color"),
|
||||
("bpy.types.material.preview_render_type*", "render/materials/preview.html#bpy-types-material-preview-render-type"),
|
||||
|
@ -1094,6 +1123,7 @@ url_manual_mapping = (
|
|||
("bpy.types.sequencetimelinechannel.name*", "editors/video_sequencer/sequencer/channels.html#bpy-types-sequencetimelinechannel-name"),
|
||||
("bpy.types.shadernodebsdfhairprincipled*", "render/shader_nodes/shader/hair_principled.html#bpy-types-shadernodebsdfhairprincipled"),
|
||||
("bpy.types.shadernodevectordisplacement*", "render/shader_nodes/vector/vector_displacement.html#bpy-types-shadernodevectordisplacement"),
|
||||
("bpy.types.softbodysettings.goal_spring*", "physics/soft_body/settings/goal.html#bpy-types-softbodysettings-goal-spring"),
|
||||
("bpy.types.spaceclipeditor.blend_factor*", "editors/clip/display/mask_display.html#bpy-types-spaceclipeditor-blend-factor"),
|
||||
("bpy.types.spacegrapheditor.show_cursor*", "editors/graph_editor/introduction.html#bpy-types-spacegrapheditor-show-cursor"),
|
||||
("bpy.types.spaceimageeditor.show_repeat*", "editors/image/sidebar.html#bpy-types-spaceimageeditor-show-repeat"),
|
||||
|
@ -1141,6 +1171,7 @@ url_manual_mapping = (
|
|||
("bpy.types.brush.boundary_falloff_type*", "sculpt_paint/sculpting/tools/boundary.html#bpy-types-brush-boundary-falloff-type"),
|
||||
("bpy.types.brush.cursor_color_subtract*", "sculpt_paint/brush/cursor.html#bpy-types-brush-cursor-color-subtract"),
|
||||
("bpy.types.brush.texture_overlay_alpha*", "sculpt_paint/brush/cursor.html#bpy-types-brush-texture-overlay-alpha"),
|
||||
("bpy.types.brush.use_frontface_falloff*", "sculpt_paint/brush/falloff.html#bpy-types-brush-use-frontface-falloff"),
|
||||
("bpy.types.brush.use_space_attenuation*", "sculpt_paint/brush/stroke.html#bpy-types-brush-use-space-attenuation"),
|
||||
("bpy.types.brushgpencilsettings.aspect*", "grease_pencil/modes/draw/tools/draw.html#bpy-types-brushgpencilsettings-aspect"),
|
||||
("bpy.types.brushgpencilsettings.dilate*", "grease_pencil/modes/draw/tools/fill.html#bpy-types-brushgpencilsettings-dilate"),
|
||||
|
@ -1172,17 +1203,17 @@ url_manual_mapping = (
|
|||
("bpy.types.freestylelineset.visibility*", "render/freestyle/view_layer/line_set.html#bpy-types-freestylelineset-visibility"),
|
||||
("bpy.types.freestylelinestyle.chaining*", "render/freestyle/view_layer/line_style/strokes.html#bpy-types-freestylelinestyle-chaining"),
|
||||
("bpy.types.freestylelinestyle.sort_key*", "render/freestyle/view_layer/line_style/strokes.html#bpy-types-freestylelinestyle-sort-key"),
|
||||
("bpy.types.geometrynodeaccumulatefield*", "modeling/geometry_nodes/utilities/accumulate_field.html#bpy-types-geometrynodeaccumulatefield"),
|
||||
("bpy.types.geometrynodecornersofvertex*", "modeling/geometry_nodes/mesh_topology/corners_of_vertex.html#bpy-types-geometrynodecornersofvertex"),
|
||||
("bpy.types.geometrynodecurvesethandles*", "modeling/geometry_nodes/curve/set_handle_type.html#bpy-types-geometrynodecurvesethandles"),
|
||||
("bpy.types.geometrynodecurvesplinetype*", "modeling/geometry_nodes/curve/set_spline_type.html#bpy-types-geometrynodecurvesplinetype"),
|
||||
("bpy.types.geometrynodeinputmeshisland*", "modeling/geometry_nodes/mesh/mesh_island.html#bpy-types-geometrynodeinputmeshisland"),
|
||||
("bpy.types.geometrynodemergebydistance*", "modeling/geometry_nodes/geometry/merge_by_distance.html#bpy-types-geometrynodemergebydistance"),
|
||||
("bpy.types.geometrynodeaccumulatefield*", "modeling/geometry_nodes/utilities/field/accumulate_field.html#bpy-types-geometrynodeaccumulatefield"),
|
||||
("bpy.types.geometrynodecornersofvertex*", "modeling/geometry_nodes/mesh/topology/corners_of_vertex.html#bpy-types-geometrynodecornersofvertex"),
|
||||
("bpy.types.geometrynodecurvesethandles*", "modeling/geometry_nodes/curve/write/set_handle_type.html#bpy-types-geometrynodecurvesethandles"),
|
||||
("bpy.types.geometrynodecurvesplinetype*", "modeling/geometry_nodes/curve/write/set_spline_type.html#bpy-types-geometrynodecurvesplinetype"),
|
||||
("bpy.types.geometrynodeinputmeshisland*", "modeling/geometry_nodes/mesh/read/mesh_island.html#bpy-types-geometrynodeinputmeshisland"),
|
||||
("bpy.types.geometrynodemergebydistance*", "modeling/geometry_nodes/geometry/operations/merge_by_distance.html#bpy-types-geometrynodemergebydistance"),
|
||||
("bpy.types.geometrynodereplacematerial*", "modeling/geometry_nodes/material/replace_material.html#bpy-types-geometrynodereplacematerial"),
|
||||
("bpy.types.geometrynoderotateinstances*", "modeling/geometry_nodes/instances/rotate_instances.html#bpy-types-geometrynoderotateinstances"),
|
||||
("bpy.types.geometrynodesampleuvsurface*", "modeling/geometry_nodes/mesh/sample_uv_surface.html#bpy-types-geometrynodesampleuvsurface"),
|
||||
("bpy.types.geometrynodesetsplinecyclic*", "modeling/geometry_nodes/curve/set_spline_cyclic.html#bpy-types-geometrynodesetsplinecyclic"),
|
||||
("bpy.types.geometrynodesplineparameter*", "modeling/geometry_nodes/curve/spline_parameter.html#bpy-types-geometrynodesplineparameter"),
|
||||
("bpy.types.geometrynodesampleuvsurface*", "modeling/geometry_nodes/mesh/operations/sample_uv_surface.html#bpy-types-geometrynodesampleuvsurface"),
|
||||
("bpy.types.geometrynodesetsplinecyclic*", "modeling/geometry_nodes/curve/write/set_spline_cyclic.html#bpy-types-geometrynodesetsplinecyclic"),
|
||||
("bpy.types.geometrynodesplineparameter*", "modeling/geometry_nodes/curve/read/spline_parameter.html#bpy-types-geometrynodesplineparameter"),
|
||||
("bpy.types.gpencillayer.use_mask_layer*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-use-mask-layer"),
|
||||
("bpy.types.greasepencil.use_curve_edit*", "grease_pencil/modes/edit/curve_editing.html#bpy-types-greasepencil-use-curve-edit"),
|
||||
("bpy.types.greasepencil.use_onion_fade*", "grease_pencil/properties/onion_skinning.html#bpy-types-greasepencil-use-onion-fade"),
|
||||
|
@ -1202,12 +1233,15 @@ url_manual_mapping = (
|
|||
("bpy.types.rigidbodyconstraint.enabled*", "physics/rigid_body/constraints/introduction.html#bpy-types-rigidbodyconstraint-enabled"),
|
||||
("bpy.types.rigidbodyconstraint.object1*", "physics/rigid_body/constraints/introduction.html#bpy-types-rigidbodyconstraint-object1"),
|
||||
("bpy.types.rigidbodyconstraint.object2*", "physics/rigid_body/constraints/introduction.html#bpy-types-rigidbodyconstraint-object2"),
|
||||
("bpy.types.rigidbodyobject.mesh_source*", "physics/rigid_body/properties/collisions.html#bpy-types-rigidbodyobject-mesh-source"),
|
||||
("bpy.types.rigidbodyobject.restitution*", "physics/rigid_body/properties/collisions.html#bpy-types-rigidbodyobject-restitution"),
|
||||
("bpy.types.sceneeevee.volumetric_light*", "render/eevee/render_settings/volumetrics.html#bpy-types-sceneeevee-volumetric-light"),
|
||||
("bpy.types.sculpt.detail_refine_method*", "sculpt_paint/sculpting/tool_settings/dyntopo.html#bpy-types-sculpt-detail-refine-method"),
|
||||
("bpy.types.sculpt.symmetrize_direction*", "sculpt_paint/sculpting/tool_settings/symmetry.html#bpy-types-sculpt-symmetrize-direction"),
|
||||
("bpy.types.sequence.frame_offset_start*", "editors/video_sequencer/sequencer/sidebar/strip.html#bpy-types-sequence-frame-offset-start"),
|
||||
("bpy.types.sequenceeditor.show_overlay*", "editors/video_sequencer/preview/sidebar.html#bpy-types-sequenceeditor-show-overlay"),
|
||||
("bpy.types.sequenceeditor.use_prefetch*", "editors/video_sequencer/preview/sidebar.html#bpy-types-sequenceeditor-use-prefetch"),
|
||||
("bpy.types.softbodysettings.ball_stiff*", "physics/soft_body/settings/self_collision.html#bpy-types-softbodysettings-ball-stiff"),
|
||||
("bpy.types.soundsequence.show_waveform*", "editors/video_sequencer/sequencer/sidebar/strip.html#bpy-types-soundsequence-show-waveform"),
|
||||
("bpy.types.spaceclipeditor.show_stable*", "editors/clip/display/clip_display.html#bpy-types-spaceclipeditor-show-stable"),
|
||||
("bpy.types.spaceimageeditor.show_gizmo*", "editors/image/introduction.html#bpy-types-spaceimageeditor-show-gizmo"),
|
||||
|
@ -1267,20 +1301,20 @@ url_manual_mapping = (
|
|||
("bpy.types.fileselectparams.directory*", "editors/file_browser.html#bpy-types-fileselectparams-directory"),
|
||||
("bpy.types.fluidflowsettings.use_flow*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-use-flow"),
|
||||
("bpy.types.fmodifierfunctiongenerator*", "editors/graph_editor/fcurves/modifiers.html#bpy-types-fmodifierfunctiongenerator"),
|
||||
("bpy.types.geometrynodecollectioninfo*", "modeling/geometry_nodes/input/collection_info.html#bpy-types-geometrynodecollectioninfo"),
|
||||
("bpy.types.geometrynodedeletegeometry*", "modeling/geometry_nodes/geometry/delete_geometry.html#bpy-types-geometrynodedeletegeometry"),
|
||||
("bpy.types.geometrynodeinputcurvetilt*", "modeling/geometry_nodes/curve/curve_tilt.html#bpy-types-geometrynodeinputcurvetilt"),
|
||||
("bpy.types.geometrynodeinputscenetime*", "modeling/geometry_nodes/input/scene_time.html#bpy-types-geometrynodeinputscenetime"),
|
||||
("bpy.types.geometrynodenamedattribute*", "modeling/geometry_nodes/input/named_attribute.html#bpy-types-geometrynodenamedattribute"),
|
||||
("bpy.types.geometrynodecollectioninfo*", "modeling/geometry_nodes/input/scene/collection_info.html#bpy-types-geometrynodecollectioninfo"),
|
||||
("bpy.types.geometrynodedeletegeometry*", "modeling/geometry_nodes/geometry/operations/delete_geometry.html#bpy-types-geometrynodedeletegeometry"),
|
||||
("bpy.types.geometrynodeinputcurvetilt*", "modeling/geometry_nodes/curve/read/curve_tilt.html#bpy-types-geometrynodeinputcurvetilt"),
|
||||
("bpy.types.geometrynodeinputscenetime*", "modeling/geometry_nodes/input/scene/scene_time.html#bpy-types-geometrynodeinputscenetime"),
|
||||
("bpy.types.geometrynodenamedattribute*", "modeling/geometry_nodes/geometry/read/named_attribute.html#bpy-types-geometrynodenamedattribute"),
|
||||
("bpy.types.geometrynodepointstovolume*", "modeling/geometry_nodes/point/points_to_volume.html#bpy-types-geometrynodepointstovolume"),
|
||||
("bpy.types.geometrynodescaleinstances*", "modeling/geometry_nodes/instances/scale_instances.html#bpy-types-geometrynodescaleinstances"),
|
||||
("bpy.types.geometrynodesetcurvenormal*", "modeling/geometry_nodes/curve/set_curve_normal.html#bpy-types-geometrynodesetcurvenormal"),
|
||||
("bpy.types.geometrynodesetcurveradius*", "modeling/geometry_nodes/curve/set_curve_radius.html#bpy-types-geometrynodesetcurveradius"),
|
||||
("bpy.types.geometrynodesetcurvenormal*", "modeling/geometry_nodes/curve/write/set_curve_normal.html#bpy-types-geometrynodesetcurvenormal"),
|
||||
("bpy.types.geometrynodesetcurveradius*", "modeling/geometry_nodes/curve/write/set_curve_radius.html#bpy-types-geometrynodesetcurveradius"),
|
||||
("bpy.types.geometrynodesetpointradius*", "modeling/geometry_nodes/point/set_point_radius.html#bpy-types-geometrynodesetpointradius"),
|
||||
("bpy.types.geometrynodesetshadesmooth*", "modeling/geometry_nodes/mesh/set_shade_smooth.html#bpy-types-geometrynodesetshadesmooth"),
|
||||
("bpy.types.geometrynodestringtocurves*", "modeling/geometry_nodes/text/string_to_curves.html#bpy-types-geometrynodestringtocurves"),
|
||||
("bpy.types.geometrynodesubdividecurve*", "modeling/geometry_nodes/curve/subdivide_curve.html#bpy-types-geometrynodesubdividecurve"),
|
||||
("bpy.types.geometrynodevertexofcorner*", "modeling/geometry_nodes/mesh_topology/vertex_of_corner.html#bpy-types-geometrynodevertexofcorner"),
|
||||
("bpy.types.geometrynodesetshadesmooth*", "modeling/geometry_nodes/mesh/write/set_shade_smooth.html#bpy-types-geometrynodesetshadesmooth"),
|
||||
("bpy.types.geometrynodestringtocurves*", "modeling/geometry_nodes/utilities/text/string_to_curves.html#bpy-types-geometrynodestringtocurves"),
|
||||
("bpy.types.geometrynodesubdividecurve*", "modeling/geometry_nodes/curve/operations/subdivide_curve.html#bpy-types-geometrynodesubdividecurve"),
|
||||
("bpy.types.geometrynodevertexofcorner*", "modeling/geometry_nodes/mesh/topology/vertex_of_corner.html#bpy-types-geometrynodevertexofcorner"),
|
||||
("bpy.types.gpencillayer.channel_color*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-channel-color"),
|
||||
("bpy.types.gpencillayer.use_solo_mode*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-use-solo-mode"),
|
||||
("bpy.types.greasepencil.use_multiedit*", "grease_pencil/multiframe.html#bpy-types-greasepencil-use-multiedit"),
|
||||
|
@ -1292,12 +1326,17 @@ url_manual_mapping = (
|
|||
("bpy.types.object.show_only_shape_key*", "animation/shape_keys/shape_keys_panel.html#bpy-types-object-show-only-shape-key"),
|
||||
("bpy.types.regionview3d.lock_rotation*", "editors/3dview/navigate/views.html#bpy-types-regionview3d-lock-rotation"),
|
||||
("bpy.types.rendersettings.hair_subdiv*", "render/eevee/render_settings/hair.html#bpy-types-rendersettings-hair-subdiv"),
|
||||
("bpy.types.rigidbodyobject.use_deform*", "physics/rigid_body/properties/collisions.html#bpy-types-rigidbodyobject-use-deform"),
|
||||
("bpy.types.scene.audio_distance_model*", "scene_layout/scene/properties.html#bpy-types-scene-audio-distance-model"),
|
||||
("bpy.types.scene.audio_doppler_factor*", "scene_layout/scene/properties.html#bpy-types-scene-audio-doppler-factor"),
|
||||
("bpy.types.sequencemodifier.mask_time*", "editors/video_sequencer/sequencer/sidebar/modifiers.html#bpy-types-sequencemodifier-mask-time"),
|
||||
("bpy.types.sequencetransform.rotation*", "editors/video_sequencer/sequencer/sidebar/strip.html#bpy-types-sequencetransform-rotation"),
|
||||
("bpy.types.shadernodeambientocclusion*", "render/shader_nodes/input/ao.html#bpy-types-shadernodeambientocclusion"),
|
||||
("bpy.types.shadernodevolumeabsorption*", "render/shader_nodes/shader/volume_absorption.html#bpy-types-shadernodevolumeabsorption"),
|
||||
("bpy.types.shadernodevolumeprincipled*", "render/shader_nodes/shader/volume_principled.html#bpy-types-shadernodevolumeprincipled"),
|
||||
("bpy.types.softbodysettings.ball_damp*", "physics/soft_body/settings/self_collision.html#bpy-types-softbodysettings-ball-damp"),
|
||||
("bpy.types.softbodysettings.ball_size*", "physics/soft_body/settings/self_collision.html#bpy-types-softbodysettings-ball-size"),
|
||||
("bpy.types.softbodysettings.use_edges*", "physics/soft_body/settings/edges.html#bpy-types-softbodysettings-use-edges"),
|
||||
("bpy.types.spacefilebrowser.bookmarks*", "editors/file_browser.html#bpy-types-spacefilebrowser-bookmarks"),
|
||||
("bpy.types.spaceoutliner.display_mode*", "editors/outliner/interface.html#bpy-types-spaceoutliner-display-mode"),
|
||||
("bpy.types.spaceoutliner.filter_state*", "editors/outliner/interface.html#bpy-types-spaceoutliner-filter-state"),
|
||||
|
@ -1375,22 +1414,22 @@ url_manual_mapping = (
|
|||
("bpy.types.fluidflowsettings.density*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-density"),
|
||||
("bpy.types.freestylelineset.qi_start*", "render/freestyle/view_layer/line_set.html#bpy-types-freestylelineset-qi-start"),
|
||||
("bpy.types.freestylelinestyle.rounds*", "render/freestyle/view_layer/line_style/strokes.html#bpy-types-freestylelinestyle-rounds"),
|
||||
("bpy.types.functionnodereplacestring*", "modeling/geometry_nodes/text/replace_string.html#bpy-types-functionnodereplacestring"),
|
||||
("bpy.types.functionnodeseparatecolor*", "modeling/geometry_nodes/color/separate_color.html#bpy-types-functionnodeseparatecolor"),
|
||||
("bpy.types.functionnodevaluetostring*", "modeling/geometry_nodes/text/value_to_string.html#bpy-types-functionnodevaluetostring"),
|
||||
("bpy.types.geometrynodecurvetopoints*", "modeling/geometry_nodes/curve/curve_to_points.html#bpy-types-geometrynodecurvetopoints"),
|
||||
("bpy.types.geometrynodeedgesofcorner*", "modeling/geometry_nodes/mesh_topology/edges_of_corner.html#bpy-types-geometrynodeedgesofcorner"),
|
||||
("bpy.types.geometrynodeedgesofvertex*", "modeling/geometry_nodes/mesh_topology/edges_of_vertex.html#bpy-types-geometrynodeedgesofvertex"),
|
||||
("bpy.types.geometrynodefieldondomain*", "modeling/geometry_nodes/utilities/interpolate_domain.html#bpy-types-geometrynodefieldondomain"),
|
||||
("bpy.types.geometrynodeinputmaterial*", "modeling/geometry_nodes/input/material.html#bpy-types-geometrynodeinputmaterial"),
|
||||
("bpy.types.geometrynodeinputposition*", "modeling/geometry_nodes/input/position.html#bpy-types-geometrynodeinputposition"),
|
||||
("bpy.types.geometrynodemeshicosphere*", "modeling/geometry_nodes/mesh_primitives/icosphere.html#bpy-types-geometrynodemeshicosphere"),
|
||||
("bpy.types.geometrynodepointsofcurve*", "modeling/geometry_nodes/curve_topology/points_of_curve.html#bpy-types-geometrynodepointsofcurve"),
|
||||
("bpy.types.geometrynoderesamplecurve*", "modeling/geometry_nodes/curve/resample_curve.html#bpy-types-geometrynoderesamplecurve"),
|
||||
("bpy.types.geometrynodesamplenearest*", "modeling/geometry_nodes/geometry/sample_nearest.html#bpy-types-geometrynodesamplenearest"),
|
||||
("bpy.types.geometrynodescaleelements*", "modeling/geometry_nodes/mesh/scale_elements.html#bpy-types-geometrynodescaleelements"),
|
||||
("bpy.types.geometrynodesubdividemesh*", "modeling/geometry_nodes/mesh/subdivide_mesh.html#bpy-types-geometrynodesubdividemesh"),
|
||||
("bpy.types.geometrynodeuvpackislands*", "modeling/geometry_nodes/uv/pack_uv_islands.html#bpy-types-geometrynodeuvpackislands"),
|
||||
("bpy.types.functionnodereplacestring*", "modeling/geometry_nodes/utilities/text/replace_string.html#bpy-types-functionnodereplacestring"),
|
||||
("bpy.types.functionnodeseparatecolor*", "modeling/geometry_nodes/utilities/color/separate_color.html#bpy-types-functionnodeseparatecolor"),
|
||||
("bpy.types.functionnodevaluetostring*", "modeling/geometry_nodes/utilities/text/value_to_string.html#bpy-types-functionnodevaluetostring"),
|
||||
("bpy.types.geometrynodecurvetopoints*", "modeling/geometry_nodes/curve/operations/curve_to_points.html#bpy-types-geometrynodecurvetopoints"),
|
||||
("bpy.types.geometrynodeedgesofcorner*", "modeling/geometry_nodes/mesh/topology/edges_of_corner.html#bpy-types-geometrynodeedgesofcorner"),
|
||||
("bpy.types.geometrynodeedgesofvertex*", "modeling/geometry_nodes/mesh/topology/edges_of_vertex.html#bpy-types-geometrynodeedgesofvertex"),
|
||||
("bpy.types.geometrynodefieldondomain*", "modeling/geometry_nodes/utilities/field/evaluate_on_domain.html#bpy-types-geometrynodefieldondomain"),
|
||||
("bpy.types.geometrynodeinputmaterial*", "modeling/geometry_nodes/input/constant/material.html#bpy-types-geometrynodeinputmaterial"),
|
||||
("bpy.types.geometrynodeinputposition*", "modeling/geometry_nodes/geometry/read/position.html#bpy-types-geometrynodeinputposition"),
|
||||
("bpy.types.geometrynodemeshicosphere*", "modeling/geometry_nodes/mesh/primitives/icosphere.html#bpy-types-geometrynodemeshicosphere"),
|
||||
("bpy.types.geometrynodepointsofcurve*", "modeling/geometry_nodes/curve/topology/points_of_curve.html#bpy-types-geometrynodepointsofcurve"),
|
||||
("bpy.types.geometrynoderesamplecurve*", "modeling/geometry_nodes/curve/operations/resample_curve.html#bpy-types-geometrynoderesamplecurve"),
|
||||
("bpy.types.geometrynodesamplenearest*", "modeling/geometry_nodes/geometry/sample/sample_nearest.html#bpy-types-geometrynodesamplenearest"),
|
||||
("bpy.types.geometrynodescaleelements*", "modeling/geometry_nodes/mesh/operations/scale_elements.html#bpy-types-geometrynodescaleelements"),
|
||||
("bpy.types.geometrynodesubdividemesh*", "modeling/geometry_nodes/mesh/operations/subdivide_mesh.html#bpy-types-geometrynodesubdividemesh"),
|
||||
("bpy.types.geometrynodeuvpackislands*", "modeling/geometry_nodes/mesh/uv/pack_uv_islands.html#bpy-types-geometrynodeuvpackislands"),
|
||||
("bpy.types.greasepencil.before_color*", "grease_pencil/properties/onion_skinning.html#bpy-types-greasepencil-before-color"),
|
||||
("bpy.types.greasepencil.onion_factor*", "grease_pencil/properties/onion_skinning.html#bpy-types-greasepencil-onion-factor"),
|
||||
("bpy.types.greasepencil.pixel_factor*", "grease_pencil/properties/strokes.html#bpy-types-greasepencil-pixel-factor"),
|
||||
|
@ -1421,6 +1460,12 @@ url_manual_mapping = (
|
|||
("bpy.types.shadernodetexpointdensity*", "render/shader_nodes/textures/point_density.html#bpy-types-shadernodetexpointdensity"),
|
||||
("bpy.types.shadernodevectortransform*", "render/shader_nodes/vector/transform.html#bpy-types-shadernodevectortransform"),
|
||||
("bpy.types.shrinkwrapgpencilmodifier*", "grease_pencil/modifiers/deform/shrinkwrap.html#bpy-types-shrinkwrapgpencilmodifier"),
|
||||
("bpy.types.softbodysettings.friction*", "physics/soft_body/settings/object.html#bpy-types-softbodysettings-friction"),
|
||||
("bpy.types.softbodysettings.goal_max*", "physics/soft_body/settings/goal.html#bpy-types-softbodysettings-goal-max"),
|
||||
("bpy.types.softbodysettings.goal_min*", "physics/soft_body/settings/goal.html#bpy-types-softbodysettings-goal-min"),
|
||||
("bpy.types.softbodysettings.step_max*", "physics/soft_body/settings/solver.html#bpy-types-softbodysettings-step-max"),
|
||||
("bpy.types.softbodysettings.step_min*", "physics/soft_body/settings/solver.html#bpy-types-softbodysettings-step-min"),
|
||||
("bpy.types.softbodysettings.use_goal*", "physics/soft_body/settings/goal.html#bpy-types-softbodysettings-use-goal"),
|
||||
("bpy.types.spaceclipeditor.show_grid*", "editors/clip/display/clip_display.html#bpy-types-spaceclipeditor-show-grid"),
|
||||
("bpy.types.spaceoutliner.filter_text*", "editors/outliner/interface.html#bpy-types-spaceoutliner-filter-text"),
|
||||
("bpy.types.spacetexteditor.find_text*", "editors/text_editor.html#bpy-types-spacetexteditor-find-text"),
|
||||
|
@ -1496,21 +1541,21 @@ url_manual_mapping = (
|
|||
("bpy.types.freestylelineset.exclude*", "render/freestyle/view_layer/line_set.html#bpy-types-freestylelineset-exclude"),
|
||||
("bpy.types.freestylelinestyle.alpha*", "render/freestyle/view_layer/line_style/alpha.html#bpy-types-freestylelinestyle-alpha"),
|
||||
("bpy.types.freestylelinestyle.color*", "render/freestyle/view_layer/line_style/color.html#bpy-types-freestylelinestyle-color"),
|
||||
("bpy.types.functionnodecombinecolor*", "modeling/geometry_nodes/color/combine_color.html#bpy-types-functionnodecombinecolor"),
|
||||
("bpy.types.functionnodestringlength*", "modeling/geometry_nodes/text/string_length.html#bpy-types-functionnodestringlength"),
|
||||
("bpy.types.geometrynodecurveofpoint*", "modeling/geometry_nodes/curve_topology/curve_of_point.html#bpy-types-geometrynodecurveofpoint"),
|
||||
("bpy.types.geometrynodefaceofcorner*", "modeling/geometry_nodes/mesh_topology/face_of_corner.html#bpy-types-geometrynodefaceofcorner"),
|
||||
("bpy.types.geometrynodefieldatindex*", "modeling/geometry_nodes/utilities/field_at_index.html#bpy-types-geometrynodefieldatindex"),
|
||||
("bpy.types.functionnodecombinecolor*", "modeling/geometry_nodes/utilities/color/combine_color.html#bpy-types-functionnodecombinecolor"),
|
||||
("bpy.types.functionnodestringlength*", "modeling/geometry_nodes/utilities/text/string_length.html#bpy-types-functionnodestringlength"),
|
||||
("bpy.types.geometrynodecurveofpoint*", "modeling/geometry_nodes/curve/topology/curve_of_point.html#bpy-types-geometrynodecurveofpoint"),
|
||||
("bpy.types.geometrynodefaceofcorner*", "modeling/geometry_nodes/mesh/topology/face_of_corner.html#bpy-types-geometrynodefaceofcorner"),
|
||||
("bpy.types.geometrynodefieldatindex*", "modeling/geometry_nodes/utilities/field/evaluate_at_index.html#bpy-types-geometrynodefieldatindex"),
|
||||
("bpy.types.geometrynodeimagetexture*", "modeling/geometry_nodes/texture/image.html#bpy-types-geometrynodeimagetexture"),
|
||||
("bpy.types.geometrynodeinputtangent*", "modeling/geometry_nodes/curve/curve_tangent.html#bpy-types-geometrynodeinputtangent"),
|
||||
("bpy.types.geometrynodeinputtangent*", "modeling/geometry_nodes/curve/read/curve_tangent.html#bpy-types-geometrynodeinputtangent"),
|
||||
("bpy.types.geometrynodejoingeometry*", "modeling/geometry_nodes/geometry/join_geometry.html#bpy-types-geometrynodejoingeometry"),
|
||||
("bpy.types.geometrynodemeshcylinder*", "modeling/geometry_nodes/mesh_primitives/cylinder.html#bpy-types-geometrynodemeshcylinder"),
|
||||
("bpy.types.geometrynodemeshtopoints*", "modeling/geometry_nodes/mesh/mesh_to_points.html#bpy-types-geometrynodemeshtopoints"),
|
||||
("bpy.types.geometrynodemeshtovolume*", "modeling/geometry_nodes/mesh/mesh_to_volume.html#bpy-types-geometrynodemeshtovolume"),
|
||||
("bpy.types.geometrynodemeshuvsphere*", "modeling/geometry_nodes/mesh_primitives/uv_sphere.html#bpy-types-geometrynodemeshuvsphere"),
|
||||
("bpy.types.geometrynodereversecurve*", "modeling/geometry_nodes/curve/reverse_curve.html#bpy-types-geometrynodereversecurve"),
|
||||
("bpy.types.geometrynodesetcurvetilt*", "modeling/geometry_nodes/curve/set_curve_tilt.html#bpy-types-geometrynodesetcurvetilt"),
|
||||
("bpy.types.geometrynodesplinelength*", "modeling/geometry_nodes/curve/spline_length.html#bpy-types-geometrynodesplinelength"),
|
||||
("bpy.types.geometrynodemeshcylinder*", "modeling/geometry_nodes/mesh/primitives/cylinder.html#bpy-types-geometrynodemeshcylinder"),
|
||||
("bpy.types.geometrynodemeshtopoints*", "modeling/geometry_nodes/mesh/operations/mesh_to_points.html#bpy-types-geometrynodemeshtopoints"),
|
||||
("bpy.types.geometrynodemeshtovolume*", "modeling/geometry_nodes/mesh/operations/mesh_to_volume.html#bpy-types-geometrynodemeshtovolume"),
|
||||
("bpy.types.geometrynodemeshuvsphere*", "modeling/geometry_nodes/mesh/primitives/uv_sphere.html#bpy-types-geometrynodemeshuvsphere"),
|
||||
("bpy.types.geometrynodereversecurve*", "modeling/geometry_nodes/curve/operations/reverse_curve.html#bpy-types-geometrynodereversecurve"),
|
||||
("bpy.types.geometrynodesetcurvetilt*", "modeling/geometry_nodes/curve/write/set_curve_tilt.html#bpy-types-geometrynodesetcurvetilt"),
|
||||
("bpy.types.geometrynodesplinelength*", "modeling/geometry_nodes/curve/read/spline_length.html#bpy-types-geometrynodesplinelength"),
|
||||
("bpy.types.geometrynodevolumetomesh*", "modeling/geometry_nodes/volume/volume_to_mesh.html#bpy-types-geometrynodevolumetomesh"),
|
||||
("bpy.types.gpencillayer.line_change*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-line-change"),
|
||||
("bpy.types.gpencillayer.parent_type*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-parent-type"),
|
||||
|
@ -1530,6 +1575,7 @@ url_manual_mapping = (
|
|||
("bpy.types.particleinstancemodifier*", "modeling/modifiers/physics/particle_instance.html#bpy-types-particleinstancemodifier"),
|
||||
("bpy.types.rendersettings.hair_type*", "render/eevee/render_settings/hair.html#bpy-types-rendersettings-hair-type"),
|
||||
("bpy.types.rendersettings.tile_size*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-tile-size"),
|
||||
("bpy.types.rigidbodyobject.friction*", "physics/rigid_body/properties/collisions.html#bpy-types-rigidbodyobject-friction"),
|
||||
("bpy.types.scenedisplay.viewport_aa*", "render/workbench/sampling.html#bpy-types-scenedisplay-viewport-aa"),
|
||||
("bpy.types.sequencertimelineoverlay*", "editors/video_sequencer/sequencer/display.html#bpy-types-sequencertimelineoverlay"),
|
||||
("bpy.types.sequencetransform.filter*", "editors/video_sequencer/sequencer/sidebar/strip.html#bpy-types-sequencetransform-filter"),
|
||||
|
@ -1539,6 +1585,8 @@ url_manual_mapping = (
|
|||
("bpy.types.shadernodebsdfrefraction*", "render/shader_nodes/shader/refraction.html#bpy-types-shadernodebsdfrefraction"),
|
||||
("bpy.types.shadernodeoutputmaterial*", "render/shader_nodes/output/material.html#bpy-types-shadernodeoutputmaterial"),
|
||||
("bpy.types.shadernodetexenvironment*", "render/shader_nodes/textures/environment.html#bpy-types-shadernodetexenvironment"),
|
||||
("bpy.types.softbodysettings.damping*", "physics/soft_body/settings/edges.html#bpy-types-softbodysettings-damping"),
|
||||
("bpy.types.softbodysettings.plastic*", "physics/soft_body/settings/edges.html#bpy-types-softbodysettings-plastic"),
|
||||
("bpy.types.spacesequenceeditor.show*", "editors/video_sequencer/preview/header.html#bpy-types-spacesequenceeditor-show"),
|
||||
("bpy.types.spaceuveditor.show_faces*", "editors/uv/overlays.html#bpy-types-spaceuveditor-show-faces"),
|
||||
("bpy.types.spaceuveditor.uv_opacity*", "editors/uv/overlays.html#bpy-types-spaceuveditor-uv-opacity"),
|
||||
|
@ -1625,26 +1673,26 @@ url_manual_mapping = (
|
|||
("bpy.types.freestylelinestyle.caps*", "render/freestyle/view_layer/line_style/strokes.html#bpy-types-freestylelinestyle-caps"),
|
||||
("bpy.types.freestylelinestyle.dash*", "render/freestyle/view_layer/line_style/strokes.html#bpy-types-freestylelinestyle-dash"),
|
||||
("bpy.types.freestylemodulesettings*", "render/freestyle/python.html#bpy-types-freestylemodulesettings"),
|
||||
("bpy.types.functionnodebooleanmath*", "modeling/geometry_nodes/utilities/boolean_math.html#bpy-types-functionnodebooleanmath"),
|
||||
("bpy.types.functionnodeinputstring*", "modeling/geometry_nodes/input/string.html#bpy-types-functionnodeinputstring"),
|
||||
("bpy.types.functionnodeinputvector*", "modeling/geometry_nodes/input/vector.html#bpy-types-functionnodeinputvector"),
|
||||
("bpy.types.functionnodebooleanmath*", "modeling/geometry_nodes/utilities/math/boolean_math.html#bpy-types-functionnodebooleanmath"),
|
||||
("bpy.types.functionnodeinputstring*", "modeling/geometry_nodes/input/constant/string.html#bpy-types-functionnodeinputstring"),
|
||||
("bpy.types.functionnodeinputvector*", "modeling/geometry_nodes/input/constant/vector.html#bpy-types-functionnodeinputvector"),
|
||||
("bpy.types.functionnoderandomvalue*", "modeling/geometry_nodes/utilities/random_value.html#bpy-types-functionnoderandomvalue"),
|
||||
("bpy.types.functionnoderotateeuler*", "modeling/geometry_nodes/utilities/rotate_euler.html#bpy-types-functionnoderotateeuler"),
|
||||
("bpy.types.functionnodeslicestring*", "modeling/geometry_nodes/text/slice_string.html#bpy-types-functionnodeslicestring"),
|
||||
("bpy.types.geometrynodecurvelength*", "modeling/geometry_nodes/curve/curve_length.html#bpy-types-geometrynodecurvelength"),
|
||||
("bpy.types.geometrynodecurvespiral*", "modeling/geometry_nodes/curve_primitives/curve_spiral.html#bpy-types-geometrynodecurvespiral"),
|
||||
("bpy.types.geometrynodecurvetomesh*", "modeling/geometry_nodes/curve/curve_to_mesh.html#bpy-types-geometrynodecurvetomesh"),
|
||||
("bpy.types.geometrynodeextrudemesh*", "modeling/geometry_nodes/mesh/extrude_mesh.html#bpy-types-geometrynodeextrudemesh"),
|
||||
("bpy.types.geometrynodefilletcurve*", "modeling/geometry_nodes/curve/fillet_curve.html#bpy-types-geometrynodefilletcurve"),
|
||||
("bpy.types.geometrynodeinputnormal*", "modeling/geometry_nodes/input/normal.html#bpy-types-geometrynodeinputnormal"),
|
||||
("bpy.types.geometrynodeinputradius*", "modeling/geometry_nodes/input/radius.html#bpy-types-geometrynodeinputradius"),
|
||||
("bpy.types.geometrynodemeshboolean*", "modeling/geometry_nodes/mesh/mesh_boolean.html#bpy-types-geometrynodemeshboolean"),
|
||||
("bpy.types.geometrynodemeshtocurve*", "modeling/geometry_nodes/mesh/mesh_to_curve.html#bpy-types-geometrynodemeshtocurve"),
|
||||
("bpy.types.geometrynodesamplecurve*", "modeling/geometry_nodes/curve/sample_curve.html#bpy-types-geometrynodesamplecurve"),
|
||||
("bpy.types.geometrynodesampleindex*", "modeling/geometry_nodes/geometry/sample_index.html#bpy-types-geometrynodesampleindex"),
|
||||
("bpy.types.functionnoderotateeuler*", "modeling/geometry_nodes/utilities/rotation/rotate_euler.html#bpy-types-functionnoderotateeuler"),
|
||||
("bpy.types.functionnodeslicestring*", "modeling/geometry_nodes/utilities/text/slice_string.html#bpy-types-functionnodeslicestring"),
|
||||
("bpy.types.geometrynodecurvelength*", "modeling/geometry_nodes/curve/read/curve_length.html#bpy-types-geometrynodecurvelength"),
|
||||
("bpy.types.geometrynodecurvespiral*", "modeling/geometry_nodes/curve/primitives/curve_spiral.html#bpy-types-geometrynodecurvespiral"),
|
||||
("bpy.types.geometrynodecurvetomesh*", "modeling/geometry_nodes/curve/operations/curve_to_mesh.html#bpy-types-geometrynodecurvetomesh"),
|
||||
("bpy.types.geometrynodeextrudemesh*", "modeling/geometry_nodes/mesh/operations/extrude_mesh.html#bpy-types-geometrynodeextrudemesh"),
|
||||
("bpy.types.geometrynodefilletcurve*", "modeling/geometry_nodes/curve/operations/fillet_curve.html#bpy-types-geometrynodefilletcurve"),
|
||||
("bpy.types.geometrynodeinputnormal*", "modeling/geometry_nodes/geometry/read/normal.html#bpy-types-geometrynodeinputnormal"),
|
||||
("bpy.types.geometrynodeinputradius*", "modeling/geometry_nodes/geometry/read/radius.html#bpy-types-geometrynodeinputradius"),
|
||||
("bpy.types.geometrynodemeshboolean*", "modeling/geometry_nodes/mesh/operations/mesh_boolean.html#bpy-types-geometrynodemeshboolean"),
|
||||
("bpy.types.geometrynodemeshtocurve*", "modeling/geometry_nodes/mesh/operations/mesh_to_curve.html#bpy-types-geometrynodemeshtocurve"),
|
||||
("bpy.types.geometrynodesamplecurve*", "modeling/geometry_nodes/curve/operations/sample_curve.html#bpy-types-geometrynodesamplecurve"),
|
||||
("bpy.types.geometrynodesampleindex*", "modeling/geometry_nodes/geometry/sample/sample_index.html#bpy-types-geometrynodesampleindex"),
|
||||
("bpy.types.geometrynodesetmaterial*", "modeling/geometry_nodes/material/set_material.html#bpy-types-geometrynodesetmaterial"),
|
||||
("bpy.types.geometrynodesetposition*", "modeling/geometry_nodes/geometry/set_position.html#bpy-types-geometrynodesetposition"),
|
||||
("bpy.types.geometrynodetriangulate*", "modeling/geometry_nodes/mesh/triangulate.html#bpy-types-geometrynodetriangulate"),
|
||||
("bpy.types.geometrynodesetposition*", "modeling/geometry_nodes/geometry/write/set_position.html#bpy-types-geometrynodesetposition"),
|
||||
("bpy.types.geometrynodetriangulate*", "modeling/geometry_nodes/mesh/operations/triangulate.html#bpy-types-geometrynodetriangulate"),
|
||||
("bpy.types.gpencillayer.blend_mode*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-blend-mode"),
|
||||
("bpy.types.gpencillayer.pass_index*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-pass-index"),
|
||||
("bpy.types.gpencillayer.tint_color*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-tint-color"),
|
||||
|
@ -1724,7 +1772,6 @@ url_manual_mapping = (
|
|||
("bpy.ops.rigidbody.mass_calculate*", "scene_layout/object/editing/rigid_body.html#bpy-ops-rigidbody-mass-calculate"),
|
||||
("bpy.ops.screen.spacedata_cleanup*", "advanced/operators.html#bpy-ops-screen-spacedata-cleanup"),
|
||||
("bpy.ops.sculpt.detail_flood_fill*", "sculpt_paint/sculpting/tool_settings/dyntopo.html#bpy-ops-sculpt-detail-flood-fill"),
|
||||
("bpy.ops.sculpt_curves.select_all*", "sculpt_paint/curves_sculpting/introduction.html#bpy-ops-sculpt-curves-select-all"),
|
||||
("bpy.ops.sculpt_curves.select_end*", "sculpt_paint/curves_sculpting/introduction.html#bpy-ops-sculpt-curves-select-end"),
|
||||
("bpy.ops.sequencer.duplicate_move*", "video_editing/edit/montage/editing.html#bpy-ops-sequencer-duplicate-move"),
|
||||
("bpy.ops.sequencer.select_grouped*", "video_editing/edit/montage/selecting.html#bpy-ops-sequencer-select-grouped"),
|
||||
|
@ -1779,17 +1826,17 @@ url_manual_mapping = (
|
|||
("bpy.types.fieldsettings.strength*", "physics/forces/force_fields/introduction.html#bpy-types-fieldsettings-strength"),
|
||||
("bpy.types.freestylelinestyle.gap*", "render/freestyle/view_layer/line_style/strokes.html#bpy-types-freestylelinestyle-gap"),
|
||||
("bpy.types.freestylesettings.mode*", "render/freestyle/view_layer/freestyle.html#bpy-types-freestylesettings-mode"),
|
||||
("bpy.types.functionnodefloattoint*", "modeling/geometry_nodes/utilities/float_to_integer.html#bpy-types-functionnodefloattoint"),
|
||||
("bpy.types.functionnodeinputcolor*", "modeling/geometry_nodes/input/color.html#bpy-types-functionnodeinputcolor"),
|
||||
("bpy.types.geometrynodeconvexhull*", "modeling/geometry_nodes/geometry/convex_hull.html#bpy-types-geometrynodeconvexhull"),
|
||||
("bpy.types.geometrynodeimageinput*", "modeling/geometry_nodes/input/image_input.html#bpy-types-geometrynodeimageinput"),
|
||||
("bpy.types.geometrynodeinputindex*", "modeling/geometry_nodes/input/input_index.html#bpy-types-geometrynodeinputindex"),
|
||||
("bpy.types.geometrynodeisviewport*", "modeling/geometry_nodes/input/is_viewport.html#bpy-types-geometrynodeisviewport"),
|
||||
("bpy.types.geometrynodemeshcircle*", "modeling/geometry_nodes/mesh_primitives/mesh_circle.html#bpy-types-geometrynodemeshcircle"),
|
||||
("bpy.types.geometrynodeobjectinfo*", "modeling/geometry_nodes/input/object_info.html#bpy-types-geometrynodeobjectinfo"),
|
||||
("bpy.types.geometrynodeselfobject*", "modeling/geometry_nodes/input/self_object.html#bpy-types-geometrynodeselfobject"),
|
||||
("bpy.types.geometrynodesplitedges*", "modeling/geometry_nodes/mesh/split_edges.html#bpy-types-geometrynodesplitedges"),
|
||||
("bpy.types.geometrynodestringjoin*", "modeling/geometry_nodes/text/join_strings.html#bpy-types-geometrynodestringjoin"),
|
||||
("bpy.types.functionnodefloattoint*", "modeling/geometry_nodes/utilities/math/float_to_integer.html#bpy-types-functionnodefloattoint"),
|
||||
("bpy.types.functionnodeinputcolor*", "modeling/geometry_nodes/input/constant/color.html#bpy-types-functionnodeinputcolor"),
|
||||
("bpy.types.geometrynodeconvexhull*", "modeling/geometry_nodes/geometry/operations/convex_hull.html#bpy-types-geometrynodeconvexhull"),
|
||||
("bpy.types.geometrynodeimageinput*", "modeling/geometry_nodes/input/constant/image.html#bpy-types-geometrynodeimageinput"),
|
||||
("bpy.types.geometrynodeinputindex*", "modeling/geometry_nodes/geometry/read/input_index.html#bpy-types-geometrynodeinputindex"),
|
||||
("bpy.types.geometrynodeisviewport*", "modeling/geometry_nodes/input/scene/is_viewport.html#bpy-types-geometrynodeisviewport"),
|
||||
("bpy.types.geometrynodemeshcircle*", "modeling/geometry_nodes/mesh/primitives/mesh_circle.html#bpy-types-geometrynodemeshcircle"),
|
||||
("bpy.types.geometrynodeobjectinfo*", "modeling/geometry_nodes/input/scene/object_info.html#bpy-types-geometrynodeobjectinfo"),
|
||||
("bpy.types.geometrynodeselfobject*", "modeling/geometry_nodes/input/scene/self_object.html#bpy-types-geometrynodeselfobject"),
|
||||
("bpy.types.geometrynodesplitedges*", "modeling/geometry_nodes/mesh/operations/split_edges.html#bpy-types-geometrynodesplitedges"),
|
||||
("bpy.types.geometrynodestringjoin*", "modeling/geometry_nodes/utilities/text/join_strings.html#bpy-types-geometrynodestringjoin"),
|
||||
("bpy.types.geometrynodevolumecube*", "modeling/geometry_nodes/volume/volume_cube.html#bpy-types-geometrynodevolumecube"),
|
||||
("bpy.types.greasepencilgrid.color*", "grease_pencil/properties/display.html#bpy-types-greasepencilgrid-color"),
|
||||
("bpy.types.greasepencilgrid.lines*", "grease_pencil/properties/display.html#bpy-types-greasepencilgrid-lines"),
|
||||
|
@ -1821,6 +1868,10 @@ url_manual_mapping = (
|
|||
("bpy.types.shadernodeparticleinfo*", "render/shader_nodes/input/particle_info.html#bpy-types-shadernodeparticleinfo"),
|
||||
("bpy.types.shadernodevectorrotate*", "render/shader_nodes/vector/vector_rotate.html#bpy-types-shadernodevectorrotate"),
|
||||
("bpy.types.shapekey.interpolation*", "animation/shape_keys/shape_keys_panel.html#bpy-types-shapekey-interpolation"),
|
||||
("bpy.types.softbodysettings.choke*", "physics/soft_body/settings/solver.html#bpy-types-softbodysettings-choke"),
|
||||
("bpy.types.softbodysettings.fuzzy*", "physics/soft_body/settings/solver.html#bpy-types-softbodysettings-fuzzy"),
|
||||
("bpy.types.softbodysettings.shear*", "physics/soft_body/settings/edges.html#bpy-types-softbodysettings-shear"),
|
||||
("bpy.types.softbodysettings.speed*", "physics/soft_body/settings/simulation.html#bpy-types-softbodysettings-speed"),
|
||||
("bpy.types.sound.use_memory_cache*", "editors/video_sequencer/sequencer/sidebar/strip.html#bpy-types-sound-use-memory-cache"),
|
||||
("bpy.types.spaceview3d.clip_start*", "editors/3dview/sidebar.html#bpy-types-spaceview3d-clip-start"),
|
||||
("bpy.types.spaceview3d.show_gizmo*", "editors/3dview/display/gizmo.html#bpy-types-spaceview3d-show-gizmo"),
|
||||
|
@ -1930,15 +1981,15 @@ url_manual_mapping = (
|
|||
("bpy.types.ffmpegsettings.format*", "render/output/properties/output.html#bpy-types-ffmpegsettings-format"),
|
||||
("bpy.types.fluideffectorsettings*", "physics/fluid/type/effector.html#bpy-types-fluideffectorsettings"),
|
||||
("bpy.types.followtrackconstraint*", "animation/constraints/motion_tracking/follow_track.html#bpy-types-followtrackconstraint"),
|
||||
("bpy.types.functionnodeinputbool*", "modeling/geometry_nodes/input/boolean.html#bpy-types-functionnodeinputbool"),
|
||||
("bpy.types.geometrycornersofface*", "modeling/geometry_nodes/mesh_topology/corners_of_face.html#bpy-types-geometrycornersofface"),
|
||||
("bpy.types.geometrynodecurvestar*", "modeling/geometry_nodes/curve_primitives/star.html#bpy-types-geometrynodecurvestar"),
|
||||
("bpy.types.geometrynodefillcurve*", "modeling/geometry_nodes/curve/fill_curve.html#bpy-types-geometrynodefillcurve"),
|
||||
("bpy.types.geometrynodeflipfaces*", "modeling/geometry_nodes/mesh/flip_faces.html#bpy-types-geometrynodeflipfaces"),
|
||||
("bpy.types.geometrynodeimageinfo*", "modeling/geometry_nodes/input/image_info.html#bpy-types-geometrynodeimageinfo"),
|
||||
("bpy.types.geometrynodeproximity*", "modeling/geometry_nodes/geometry/geometry_proximity.html#bpy-types-geometrynodeproximity"),
|
||||
("bpy.types.geometrynodetransform*", "modeling/geometry_nodes/geometry/transform_geometry.html#bpy-types-geometrynodetransform"),
|
||||
("bpy.types.geometrynodetrimcurve*", "modeling/geometry_nodes/curve/trim_curve.html#bpy-types-geometrynodetrimcurve"),
|
||||
("bpy.types.functionnodeinputbool*", "modeling/geometry_nodes/input/constant/boolean.html#bpy-types-functionnodeinputbool"),
|
||||
("bpy.types.geometrycornersofface*", "modeling/geometry_nodes/mesh/topology/corners_of_face.html#bpy-types-geometrycornersofface"),
|
||||
("bpy.types.geometrynodecurvestar*", "modeling/geometry_nodes/curve/primitives/star.html#bpy-types-geometrynodecurvestar"),
|
||||
("bpy.types.geometrynodefillcurve*", "modeling/geometry_nodes/curve/operations/fill_curve.html#bpy-types-geometrynodefillcurve"),
|
||||
("bpy.types.geometrynodeflipfaces*", "modeling/geometry_nodes/mesh/operations/flip_faces.html#bpy-types-geometrynodeflipfaces"),
|
||||
("bpy.types.geometrynodeimageinfo*", "modeling/geometry_nodes/input/scene/image_info.html#bpy-types-geometrynodeimageinfo"),
|
||||
("bpy.types.geometrynodeproximity*", "modeling/geometry_nodes/geometry/sample/geometry_proximity.html#bpy-types-geometrynodeproximity"),
|
||||
("bpy.types.geometrynodetransform*", "modeling/geometry_nodes/geometry/operations/transform_geometry.html#bpy-types-geometrynodetransform"),
|
||||
("bpy.types.geometrynodetrimcurve*", "modeling/geometry_nodes/curve/operations/trim_curve.html#bpy-types-geometrynodetrimcurve"),
|
||||
("bpy.types.gpencillayer.location*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-location"),
|
||||
("bpy.types.gpencillayer.rotation*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-rotation"),
|
||||
("bpy.types.gpencilsculptsettings*", "grease_pencil/properties/index.html#bpy-types-gpencilsculptsettings"),
|
||||
|
@ -1961,6 +2012,7 @@ url_manual_mapping = (
|
|||
("bpy.types.screen.show_statusbar*", "interface/window_system/topbar.html#bpy-types-screen-show-statusbar"),
|
||||
("bpy.types.sculpt.detail_percent*", "sculpt_paint/sculpting/tool_settings/dyntopo.html#bpy-types-sculpt-detail-percent"),
|
||||
("bpy.types.sculpt.gravity_object*", "sculpt_paint/sculpting/tool_settings/options.html#bpy-types-sculpt-gravity-object"),
|
||||
("bpy.types.sculpt.show_face_sets*", "sculpt_paint/sculpting/editing/face_sets.html#bpy-types-sculpt-show-face-sets"),
|
||||
("bpy.types.shadernodebsdfdiffuse*", "render/shader_nodes/shader/diffuse.html#bpy-types-shadernodebsdfdiffuse"),
|
||||
("bpy.types.shadernodelayerweight*", "render/shader_nodes/input/layer_weight.html#bpy-types-shadernodelayerweight"),
|
||||
("bpy.types.shadernodenewgeometry*", "render/shader_nodes/input/geometry.html#bpy-types-shadernodenewgeometry"),
|
||||
|
@ -1974,6 +2026,11 @@ url_manual_mapping = (
|
|||
("bpy.types.shapekey.relative_key*", "animation/shape_keys/shape_keys_panel.html#bpy-types-shapekey-relative-key"),
|
||||
("bpy.types.shapekey.vertex_group*", "animation/shape_keys/shape_keys_panel.html#bpy-types-shapekey-vertex-group"),
|
||||
("bpy.types.smoothgpencilmodifier*", "grease_pencil/modifiers/deform/smooth.html#bpy-types-smoothgpencilmodifier"),
|
||||
("bpy.types.softbodysettings.aero*", "physics/soft_body/settings/edges.html#bpy-types-softbodysettings-aero"),
|
||||
("bpy.types.softbodysettings.bend*", "physics/soft_body/settings/edges.html#bpy-types-softbodysettings-bend"),
|
||||
("bpy.types.softbodysettings.mass*", "physics/soft_body/settings/object.html#bpy-types-softbodysettings-mass"),
|
||||
("bpy.types.softbodysettings.pull*", "physics/soft_body/settings/edges.html#bpy-types-softbodysettings-pull"),
|
||||
("bpy.types.softbodysettings.push*", "physics/soft_body/settings/edges.html#bpy-types-softbodysettings-push"),
|
||||
("bpy.types.spline.use_endpoint_u*", "modeling/curves/properties/active_spline.html#bpy-types-spline-use-endpoint-u"),
|
||||
("bpy.types.surfacedeformmodifier*", "modeling/modifiers/deform/surface_deform.html#bpy-types-surfacedeformmodifier"),
|
||||
("bpy.types.texturenodetexvoronoi*", "editors/texture_node/types/textures/voronoi.html#bpy-types-texturenodetexvoronoi"),
|
||||
|
@ -2003,6 +2060,7 @@ url_manual_mapping = (
|
|||
("bpy.ops.mesh.loop_multi_select*", "modeling/meshes/selecting/loops.html#bpy-ops-mesh-loop-multi-select"),
|
||||
("bpy.ops.mesh.vert_connect_path*", "modeling/meshes/editing/vertex/connect_vertex_path.html#bpy-ops-mesh-vert-connect-path"),
|
||||
("bpy.ops.nla.action_sync_length*", "editors/nla/editing.html#bpy-ops-nla-action-sync-length"),
|
||||
("bpy.ops.node.move_detach_links*", "interface/controls/nodes/editing.html#bpy-ops-node-move-detach-links"),
|
||||
("bpy.ops.object.make_links_data*", "scene_layout/object/editing/link_transfer/link_data.html#bpy-ops-object-make-links-data"),
|
||||
("bpy.ops.object.modifier_remove*", "modeling/modifiers/introduction.html#bpy-ops-object-modifier-remove"),
|
||||
("bpy.ops.object.paths_calculate*", "animation/motion_paths.html#bpy-ops-object-paths-calculate"),
|
||||
|
@ -2048,17 +2106,17 @@ url_manual_mapping = (
|
|||
("bpy.types.editbone.use_connect*", "animation/armatures/bones/properties/relations.html#bpy-types-editbone-use-connect"),
|
||||
("bpy.types.ffmpegsettings.codec*", "render/output/properties/output.html#bpy-types-ffmpegsettings-codec"),
|
||||
("bpy.types.followpathconstraint*", "animation/constraints/relationship/follow_path.html#bpy-types-followpathconstraint"),
|
||||
("bpy.types.functionnodeinputint*", "modeling/geometry_nodes/input/integer.html#bpy-types-functionnodeinputint"),
|
||||
("bpy.types.functionnodeinputint*", "modeling/geometry_nodes/input/constant/integer.html#bpy-types-functionnodeinputint"),
|
||||
("bpy.types.gaussianblursequence*", "video_editing/edit/montage/strips/effects/blur.html#bpy-types-gaussianblursequence"),
|
||||
("bpy.types.geometrynodeboundbox*", "modeling/geometry_nodes/geometry/bounding_box.html#bpy-types-geometrynodeboundbox"),
|
||||
("bpy.types.geometrynodecurvearc*", "modeling/geometry_nodes/curve_primitives/arc.html#bpy-types-geometrynodecurvearc"),
|
||||
("bpy.types.geometrynodedualmesh*", "modeling/geometry_nodes/mesh/dual_mesh.html#bpy-types-geometrynodedualmesh"),
|
||||
("bpy.types.geometrynodeboundbox*", "modeling/geometry_nodes/geometry/operations/bounding_box.html#bpy-types-geometrynodeboundbox"),
|
||||
("bpy.types.geometrynodecurvearc*", "modeling/geometry_nodes/curve/primitives/arc.html#bpy-types-geometrynodecurvearc"),
|
||||
("bpy.types.geometrynodedualmesh*", "modeling/geometry_nodes/mesh/operations/dual_mesh.html#bpy-types-geometrynodedualmesh"),
|
||||
("bpy.types.geometrynodematerial*", "-1"),
|
||||
("bpy.types.geometrynodemeshcone*", "modeling/geometry_nodes/mesh_primitives/cone.html#bpy-types-geometrynodemeshcone"),
|
||||
("bpy.types.geometrynodemeshcube*", "modeling/geometry_nodes/mesh_primitives/cube.html#bpy-types-geometrynodemeshcube"),
|
||||
("bpy.types.geometrynodemeshgrid*", "modeling/geometry_nodes/mesh_primitives/grid.html#bpy-types-geometrynodemeshgrid"),
|
||||
("bpy.types.geometrynodemeshline*", "modeling/geometry_nodes/mesh_primitives/mesh_line.html#bpy-types-geometrynodemeshline"),
|
||||
("bpy.types.geometrynodeuvunwrap*", "modeling/geometry_nodes/uv/uv_unwrap.html#bpy-types-geometrynodeuvunwrap"),
|
||||
("bpy.types.geometrynodemeshcone*", "modeling/geometry_nodes/mesh/primitives/cone.html#bpy-types-geometrynodemeshcone"),
|
||||
("bpy.types.geometrynodemeshcube*", "modeling/geometry_nodes/mesh/primitives/cube.html#bpy-types-geometrynodemeshcube"),
|
||||
("bpy.types.geometrynodemeshgrid*", "modeling/geometry_nodes/mesh/primitives/grid.html#bpy-types-geometrynodemeshgrid"),
|
||||
("bpy.types.geometrynodemeshline*", "modeling/geometry_nodes/mesh/primitives/mesh_line.html#bpy-types-geometrynodemeshline"),
|
||||
("bpy.types.geometrynodeuvunwrap*", "modeling/geometry_nodes/mesh/uv/uv_unwrap.html#bpy-types-geometrynodeuvunwrap"),
|
||||
("bpy.types.gpencillayer.opacity*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-opacity"),
|
||||
("bpy.types.image.display_aspect*", "editors/image/sidebar.html#bpy-types-image-display-aspect"),
|
||||
("bpy.types.keyframe.handle_left*", "editors/graph_editor/fcurves/properties.html#bpy-types-keyframe-handle-left"),
|
||||
|
@ -2198,9 +2256,9 @@ url_manual_mapping = (
|
|||
("bpy.types.fieldsettings.noise*", "physics/forces/force_fields/introduction.html#bpy-types-fieldsettings-noise"),
|
||||
("bpy.types.fieldsettings.shape*", "physics/forces/force_fields/introduction.html#bpy-types-fieldsettings-shape"),
|
||||
("bpy.types.fluiddomainsettings*", "physics/fluid/type/domain/index.html#bpy-types-fluiddomainsettings"),
|
||||
("bpy.types.functionnodecompare*", "modeling/geometry_nodes/utilities/compare.html#bpy-types-functionnodecompare"),
|
||||
("bpy.types.geometrynodeinputid*", "modeling/geometry_nodes/input/id.html#bpy-types-geometrynodeinputid"),
|
||||
("bpy.types.geometrynoderaycast*", "modeling/geometry_nodes/geometry/raycast.html#bpy-types-geometrynoderaycast"),
|
||||
("bpy.types.functionnodecompare*", "modeling/geometry_nodes/utilities/math/compare.html#bpy-types-functionnodecompare"),
|
||||
("bpy.types.geometrynodeinputid*", "modeling/geometry_nodes/geometry/read/id.html#bpy-types-geometrynodeinputid"),
|
||||
("bpy.types.geometrynoderaycast*", "modeling/geometry_nodes/geometry/sample/raycast.html#bpy-types-geometrynoderaycast"),
|
||||
("bpy.types.gpencillayer.parent*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-parent"),
|
||||
("bpy.types.hookgpencilmodifier*", "grease_pencil/modifiers/deform/hook.html#bpy-types-hookgpencilmodifier"),
|
||||
("bpy.types.imageformatsettings*", "files/media/image_formats.html#bpy-types-imageformatsettings"),
|
||||
|
@ -2372,7 +2430,7 @@ url_manual_mapping = (
|
|||
("bpy.types.shadernodeemission*", "render/shader_nodes/shader/emission.html#bpy-types-shadernodeemission"),
|
||||
("bpy.types.shadernodehairinfo*", "render/shader_nodes/input/hair_info.html#bpy-types-shadernodehairinfo"),
|
||||
("bpy.types.shadernodemaprange*", "render/shader_nodes/converter/map_range.html#bpy-types-shadernodemaprange"),
|
||||
("bpy.types.shadernodergbcurve*", "modeling/geometry_nodes/color/rgb_curves.html#bpy-types-shadernodergbcurve"),
|
||||
("bpy.types.shadernodergbcurve*", "modeling/geometry_nodes/utilities/color/rgb_curves.html#bpy-types-shadernodergbcurve"),
|
||||
("bpy.types.shadernodetexbrick*", "render/shader_nodes/textures/brick.html#bpy-types-shadernodetexbrick"),
|
||||
("bpy.types.shadernodetexcoord*", "render/shader_nodes/input/texture_coordinate.html#bpy-types-shadernodetexcoord"),
|
||||
("bpy.types.shadernodeteximage*", "render/shader_nodes/textures/image.html#bpy-types-shadernodeteximage"),
|
||||
|
@ -2479,7 +2537,7 @@ url_manual_mapping = (
|
|||
("bpy.types.fmodifierenvelope*", "editors/graph_editor/fcurves/modifiers.html#bpy-types-fmodifierenvelope"),
|
||||
("bpy.types.freestylesettings*", "render/freestyle/view_layer/freestyle.html#bpy-types-freestylesettings"),
|
||||
("bpy.types.geometrynodegroup*", "modeling/geometry_nodes/group.html#bpy-types-geometrynodegroup"),
|
||||
("bpy.types.geometrynodesetid*", "modeling/geometry_nodes/geometry/set_id.html#bpy-types-geometrynodesetid"),
|
||||
("bpy.types.geometrynodesetid*", "modeling/geometry_nodes/geometry/write/set_id.html#bpy-types-geometrynodesetid"),
|
||||
("bpy.types.gpencillayer.hide*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-hide"),
|
||||
("bpy.types.gpencillayer.lock*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-lock"),
|
||||
("bpy.types.imagepaint.dither*", "sculpt_paint/texture_paint/tool_settings/options.html#bpy-types-imagepaint-dither"),
|
||||
|
@ -2570,7 +2628,7 @@ url_manual_mapping = (
|
|||
("bpy.ops.pose.select_mirror*", "animation/armatures/posing/selecting.html#bpy-ops-pose-select-mirror"),
|
||||
("bpy.ops.screen.marker_jump*", "animation/markers.html#bpy-ops-screen-marker-jump"),
|
||||
("bpy.ops.screen.repeat_last*", "interface/undo_redo.html#bpy-ops-screen-repeat-last"),
|
||||
("bpy.ops.sculpt.mask_expand*", "sculpt_paint/sculpting/editing/mask.html#bpy-ops-sculpt-mask-expand"),
|
||||
("bpy.ops.sculpt.mask_expand*", "sculpt_paint/sculpting/editing/expand.html#bpy-ops-sculpt-mask-expand"),
|
||||
("bpy.ops.sculpt.mask_filter*", "sculpt_paint/sculpting/editing/mask.html#bpy-ops-sculpt-mask-filter"),
|
||||
("bpy.ops.transform.tosphere*", "modeling/meshes/editing/mesh/transform/to_sphere.html#bpy-ops-transform-tosphere"),
|
||||
("bpy.ops.view3d.clip_border*", "editors/3dview/navigate/regions.html#bpy-ops-view3d-clip-border"),
|
||||
|
@ -2627,7 +2685,7 @@ url_manual_mapping = (
|
|||
("bpy.types.shaderfxcolorize*", "grease_pencil/visual_effects/colorize.html#bpy-types-shaderfxcolorize"),
|
||||
("bpy.types.shaderfxpixelate*", "grease_pencil/visual_effects/pixelate.html#bpy-types-shaderfxpixelate"),
|
||||
("bpy.types.shadernodeinvert*", "render/shader_nodes/color/invert.html#bpy-types-shadernodeinvert"),
|
||||
("bpy.types.shadernodemixrgb*", "modeling/geometry_nodes/color/mix_rgb.html#bpy-types-shadernodemixrgb"),
|
||||
("bpy.types.shadernodemixrgb*", "modeling/geometry_nodes/utilities/color/mix_rgb.html#bpy-types-shadernodemixrgb"),
|
||||
("bpy.types.shadernodenormal*", "render/shader_nodes/vector/normal.html#bpy-types-shadernodenormal"),
|
||||
("bpy.types.shadernodescript*", "render/shader_nodes/osl.html#bpy-types-shadernodescript"),
|
||||
("bpy.types.shadernodetexies*", "render/shader_nodes/textures/ies.html#bpy-types-shadernodetexies"),
|
||||
|
@ -2658,6 +2716,7 @@ url_manual_mapping = (
|
|||
("bpy.ops.clip.solve_camera*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-solve-camera"),
|
||||
("bpy.ops.constraint.delete*", "animation/constraints/interface/header.html#bpy-ops-constraint-delete"),
|
||||
("bpy.ops.curve.smooth_tilt*", "modeling/curves/editing/control_points.html#bpy-ops-curve-smooth-tilt"),
|
||||
("bpy.ops.curves.select_all*", "sculpt_paint/curves_sculpting/introduction.html#bpy-ops-curves-select-all"),
|
||||
("bpy.ops.file.reset_recent*", "editors/file_browser.html#bpy-ops-file-reset-recent"),
|
||||
("bpy.ops.fluid.bake_guides*", "physics/fluid/type/domain/guides.html#bpy-ops-fluid-bake-guides"),
|
||||
("bpy.ops.fluid.free_guides*", "physics/fluid/type/domain/guides.html#bpy-ops-fluid-free-guides"),
|
||||
|
@ -3053,7 +3112,7 @@ url_manual_mapping = (
|
|||
("bpy.ops.render.opengl*", "editors/3dview/viewport_render.html#bpy-ops-render-opengl"),
|
||||
("bpy.ops.screen.header*", "interface/window_system/regions.html#bpy-ops-screen-header"),
|
||||
("bpy.ops.script.reload*", "advanced/operators.html#bpy-ops-script-reload"),
|
||||
("bpy.ops.sculpt.expand*", "sculpt_paint/sculpting/editing/mask.html#bpy-ops-sculpt-expand"),
|
||||
("bpy.ops.sculpt.expand*", "sculpt_paint/sculpting/editing/expand.html#bpy-ops-sculpt-expand"),
|
||||
("bpy.ops.sculpt_curves*", "sculpt_paint/curves_sculpting/index.html#bpy-ops-sculpt-curves"),
|
||||
("bpy.ops.ui.eyedropper*", "interface/controls/buttons/eyedropper.html#bpy-ops-ui-eyedropper"),
|
||||
("bpy.ops.view3d.select*", "editors/3dview/selecting.html#bpy-ops-view3d-select"),
|
||||
|
|
|
@ -4421,6 +4421,11 @@ def km_weight_paint_vertex_selection(params):
|
|||
("view3d.select_lasso", {"type": params.action_mouse, "value": 'CLICK_DRAG', "shift": True, "ctrl": True},
|
||||
{"properties": [("mode", 'SUB')]}),
|
||||
("view3d.select_circle", {"type": 'C', "value": 'PRESS'}, None),
|
||||
("paint.vert_select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
|
||||
("paint.vert_select_linked_pick", {"type": 'L', "value": 'PRESS'},
|
||||
{"properties": [("select", True)]}),
|
||||
("paint.vert_select_linked_pick", {"type": 'L', "value": 'PRESS', "shift": True},
|
||||
{"properties": [("select", False)]}),
|
||||
])
|
||||
|
||||
return keymap
|
||||
|
@ -5048,7 +5053,7 @@ def km_sculpt(params):
|
|||
{"properties": [
|
||||
("target", "MASK"),
|
||||
("falloff_type", "GEODESIC"),
|
||||
("invert", True),
|
||||
("invert", False),
|
||||
("use_auto_mask", False),
|
||||
("use_mask_preserve", True),
|
||||
]}),
|
||||
|
@ -6281,7 +6286,7 @@ def km_sculpt_expand_modal(_params):
|
|||
("MOVE_TOGGLE", {"type": 'SPACE', "value": 'ANY', "any": True}, None),
|
||||
*((e, {"type": NUMBERS_1[i], "value": 'PRESS', "any": True}, None) for i, e in enumerate(
|
||||
("FALLOFF_GEODESICS", "FALLOFF_TOPOLOGY", "FALLOFF_TOPOLOGY_DIAGONALS", "FALLOFF_SPHERICAL"))),
|
||||
*((e, {"type": "NUMPAD_%i" % (i+1), "value": 'PRESS', "any": True}, None) for i, e in enumerate(
|
||||
*((e, {"type": "NUMPAD_%i" % (i + 1), "value": 'PRESS', "any": True}, None) for i, e in enumerate(
|
||||
("FALLOFF_GEODESICS", "FALLOFF_TOPOLOGY", "FALLOFF_TOPOLOGY_DIAGONALS", "FALLOFF_SPHERICAL"))),
|
||||
("SNAP_TOGGLE", {"type": 'LEFT_CTRL', "value": 'ANY'}, None),
|
||||
("SNAP_TOGGLE", {"type": 'RIGHT_CTRL', "value": 'ANY'}, None),
|
||||
|
@ -6313,6 +6318,25 @@ def km_curve_pen_modal_map(_params):
|
|||
return keymap
|
||||
|
||||
|
||||
def km_node_link_modal_map(_params):
|
||||
items = []
|
||||
keymap = (
|
||||
"Node Link Modal Map",
|
||||
{"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
|
||||
{"items": items},
|
||||
)
|
||||
|
||||
items.extend([
|
||||
("BEGIN", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
|
||||
("CONFIRM", {"type": 'LEFTMOUSE', "value": 'RELEASE', "any": True}, None),
|
||||
("CANCEL", {"type": 'RIGHTMOUSE', "value": 'PRESS', "any": True}, None),
|
||||
("CANCEL", {"type": 'ESC', "value": 'PRESS', "any": True}, None),
|
||||
("SWAP", {"type": 'LEFT_ALT', "value": 'ANY', "any": True}, None),
|
||||
("SWAP", {"type": 'RIGHT_ALT', "value": 'ANY', "any": True}, None),
|
||||
])
|
||||
|
||||
return keymap
|
||||
|
||||
# Fallback for gizmos that don't have custom a custom key-map.
|
||||
def km_generic_gizmo(_params):
|
||||
keymap = (
|
||||
|
@ -8082,6 +8106,7 @@ def generate_keymaps(params=None):
|
|||
km_paint_stroke_modal(params),
|
||||
km_sculpt_expand_modal(params),
|
||||
km_curve_pen_modal_map(params),
|
||||
km_node_link_modal_map(params),
|
||||
|
||||
# Gizmos.
|
||||
km_generic_gizmo(params),
|
||||
|
|
|
@ -2972,6 +2972,11 @@ def km_weight_paint_vertex_selection(params):
|
|||
("paint.vert_select_hide", {"type": 'H', "value": 'PRESS', "shift": True},
|
||||
{"properties": [("unselected", True)]}),
|
||||
("paint.face_vert_reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
|
||||
("paint.vert_select_linked", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
|
||||
("paint.vert_select_linked_pick", {"type": 'L', "value": 'PRESS'},
|
||||
{"properties": [("select", True)]}),
|
||||
("paint.vert_select_linked_pick", {"type": 'L', "value": 'PRESS', "shift": True},
|
||||
{"properties": [("select", False)]}),
|
||||
])
|
||||
|
||||
return keymap
|
||||
|
|
|
@ -1,7 +1,4 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
import bpy
|
||||
from bpy.types import Operator, UILayout, Context
|
||||
from bpy.props import EnumProperty, StringProperty
|
||||
|
||||
"""
|
||||
This module (in particular the draw_ui_list function) lets you draw the commonly
|
||||
|
@ -15,54 +12,67 @@ You can get an example of how to use this via the Blender Text Editor->
|
|||
Templates->Ui List Generic.
|
||||
"""
|
||||
|
||||
import bpy
|
||||
from bpy.types import Operator
|
||||
from bpy.props import (
|
||||
EnumProperty,
|
||||
StringProperty,
|
||||
)
|
||||
|
||||
__all__ = (
|
||||
"draw_ui_list",
|
||||
)
|
||||
|
||||
|
||||
def draw_ui_list(
|
||||
layout: UILayout,
|
||||
context: Context,
|
||||
layout,
|
||||
context,
|
||||
class_name="UI_UL_list",
|
||||
*,
|
||||
unique_id="",
|
||||
list_path: str,
|
||||
active_idx_path: str,
|
||||
list_path,
|
||||
active_index_path,
|
||||
insertion_operators=True,
|
||||
move_operators=True,
|
||||
menu_class_name="",
|
||||
**kwargs) -> UILayout:
|
||||
**kwargs,
|
||||
):
|
||||
"""
|
||||
Draw a UIList with Add/Remove/Move buttons and a menu.
|
||||
|
||||
:param layout:
|
||||
UILayout to draw the list in.
|
||||
:param context:
|
||||
Blender context to get the list data from.
|
||||
:param class_name:
|
||||
Name of the UIList class to draw. The default is the
|
||||
UIList class that ships with Blender.
|
||||
:param unique_id:
|
||||
Optional identifier, in case wanting to draw multiple unique copies of a list.
|
||||
:arg layout: UILayout to draw the list in.
|
||||
:type layout: :class:`UILayout`
|
||||
:arg context: Blender context to get the list data from.
|
||||
:type context: :class:`Context`
|
||||
:arg class_name: Name of the UIList class to draw. The default is the UIList class that ships with Blender.
|
||||
:type class_name: str
|
||||
:arg unique_id: Optional identifier, in case wanting to draw multiple unique copies of a list.
|
||||
:type unique_id: str
|
||||
:arg list_path: Data path of the list relative to context, eg. "object.vertex_groups".
|
||||
:type list_path: str
|
||||
:arg active_index_path: Data path of the list active index integer relative to context,
|
||||
eg. "object.vertex_groups.active_index".
|
||||
:type active_index_path: str
|
||||
:arg insertion_operators: Whether to draw Add/Remove buttons.
|
||||
:type insertion_operators: bool
|
||||
:arg move_operators: Whether to draw Move Up/Down buttons.
|
||||
:type move_operators: str
|
||||
:arg menu_class_name: Identifier of a Menu that should be drawn as a drop-down.
|
||||
:type menu_class_name: str
|
||||
|
||||
:param list_path:
|
||||
Data path of the list relative to context, eg. "object.vertex_groups".
|
||||
:param active_idx_path:
|
||||
Data path of the list active index integer relative to context,
|
||||
eg. "object.vertex_groups.active_index".
|
||||
:returns: The right side column.
|
||||
:rtype: :class:`UILayout`.
|
||||
|
||||
:param insertion_operators:
|
||||
Whether to draw Add/Remove buttons.
|
||||
:param move_operators:
|
||||
Whether to draw Move Up/Down buttons.
|
||||
:param menu_class_name:
|
||||
Name of a Menu that should be drawn as a drop-down.
|
||||
|
||||
Additional keyword arguments are passed to template_list().
|
||||
Additional keyword arguments are passed to :class:`UIList.template_list`.
|
||||
"""
|
||||
|
||||
row = layout.row()
|
||||
|
||||
list_owner_path, list_prop_name = list_path.rsplit('.', 1)
|
||||
list_owner = _get_context_attr(context, list_owner_path)
|
||||
|
||||
idx_owner_path, idx_prop_name = active_idx_path.rsplit('.', 1)
|
||||
idx_owner = _get_context_attr(context, idx_owner_path)
|
||||
index_owner_path, index_prop_name = active_index_path.rsplit('.', 1)
|
||||
index_owner = _get_context_attr(context, index_owner_path)
|
||||
|
||||
list_to_draw = _get_context_attr(context, list_path)
|
||||
|
||||
|
@ -70,8 +80,8 @@ def draw_ui_list(
|
|||
class_name,
|
||||
unique_id,
|
||||
list_owner, list_prop_name,
|
||||
idx_owner, idx_prop_name,
|
||||
rows=4 if len(list_to_draw) > 0 else 1,
|
||||
index_owner, index_prop_name,
|
||||
rows=4 if list_to_draw else 1,
|
||||
**kwargs
|
||||
)
|
||||
|
||||
|
@ -81,7 +91,7 @@ def draw_ui_list(
|
|||
_draw_add_remove_buttons(
|
||||
layout=col,
|
||||
list_path=list_path,
|
||||
active_idx_path=active_idx_path,
|
||||
active_index_path=active_index_path,
|
||||
list_length=len(list_to_draw)
|
||||
)
|
||||
layout.separator()
|
||||
|
@ -90,11 +100,11 @@ def draw_ui_list(
|
|||
col.menu(menu_class_name, icon='DOWNARROW_HLT', text="")
|
||||
col.separator()
|
||||
|
||||
if move_operators and len(list_to_draw) > 0:
|
||||
if move_operators and list_to_draw:
|
||||
_draw_move_buttons(
|
||||
layout=col,
|
||||
list_path=list_path,
|
||||
active_idx_path=active_idx_path,
|
||||
active_index_path=active_index_path,
|
||||
list_length=len(list_to_draw)
|
||||
)
|
||||
|
||||
|
@ -104,50 +114,50 @@ def draw_ui_list(
|
|||
|
||||
def _draw_add_remove_buttons(
|
||||
*,
|
||||
layout: UILayout,
|
||||
list_path: str,
|
||||
active_idx_path: str,
|
||||
list_length: int
|
||||
) -> None:
|
||||
layout,
|
||||
list_path,
|
||||
active_index_path,
|
||||
list_length,
|
||||
):
|
||||
"""Draw the +/- buttons to add and remove list entries."""
|
||||
add_op = layout.operator(UILIST_OT_entry_add.bl_idname, text="", icon='ADD')
|
||||
add_op.list_path = list_path
|
||||
add_op.active_idx_path = active_idx_path
|
||||
add_op.active_index_path = active_index_path
|
||||
|
||||
row = layout.row()
|
||||
row.enabled = list_length > 0
|
||||
remove_op = row.operator(UILIST_OT_entry_remove.bl_idname, text="", icon='REMOVE')
|
||||
remove_op.list_path = list_path
|
||||
remove_op.active_idx_path = active_idx_path
|
||||
remove_op.active_index_path = active_index_path
|
||||
|
||||
|
||||
def _draw_move_buttons(
|
||||
*,
|
||||
layout: UILayout,
|
||||
list_path: str,
|
||||
active_idx_path: str,
|
||||
list_length: int
|
||||
) -> None:
|
||||
layout,
|
||||
list_path,
|
||||
active_index_path,
|
||||
list_length,
|
||||
):
|
||||
"""Draw the up/down arrows to move elements in the list."""
|
||||
col = layout.column()
|
||||
col.enabled = list_length > 1
|
||||
move_up_op = layout.operator(UILIST_OT_entry_move.bl_idname, text="", icon='TRIA_UP')
|
||||
move_up_op.direction = 'UP'
|
||||
move_up_op.list_path = list_path
|
||||
move_up_op.active_idx_path = active_idx_path
|
||||
move_up_op.active_index_path = active_index_path
|
||||
|
||||
move_down_op = layout.operator(UILIST_OT_entry_move.bl_idname, text="", icon='TRIA_DOWN')
|
||||
move_down_op.direction = 'DOWN'
|
||||
move_down_op.list_path = list_path
|
||||
move_down_op.active_idx_path = active_idx_path
|
||||
move_down_op.active_index_path = active_index_path
|
||||
|
||||
|
||||
def _get_context_attr(context: Context, data_path: str) -> object:
|
||||
def _get_context_attr(context, data_path):
|
||||
"""Return the value of a context member based on its data path."""
|
||||
return context.path_resolve(data_path)
|
||||
|
||||
|
||||
def _set_context_attr(context: Context, data_path: str, value: object) -> None:
|
||||
def _set_context_attr(context, data_path, value) -> None:
|
||||
"""Set the value of a context member based on its data path."""
|
||||
owner_path, attr_name = data_path.rsplit('.', 1)
|
||||
owner = context.path_resolve(owner_path)
|
||||
|
@ -160,19 +170,18 @@ class GenericUIListOperator:
|
|||
bl_options = {'REGISTER', 'UNDO', 'INTERNAL'}
|
||||
|
||||
list_path: StringProperty()
|
||||
active_idx_path: StringProperty()
|
||||
active_index_path: StringProperty()
|
||||
|
||||
def get_list(self, context) -> str:
|
||||
return _get_context_attr(context, self.list_path)
|
||||
|
||||
def get_active_index(self, context) -> str:
|
||||
return _get_context_attr(context, self.active_idx_path)
|
||||
return _get_context_attr(context, self.active_index_path)
|
||||
|
||||
def set_active_index(self, context, index):
|
||||
_set_context_attr(context, self.active_idx_path, index)
|
||||
_set_context_attr(context, self.active_index_path, index)
|
||||
|
||||
|
||||
# noinspection PyPep8Naming
|
||||
class UILIST_OT_entry_remove(GenericUIListOperator, Operator):
|
||||
"""Remove the selected entry from the list"""
|
||||
|
||||
|
@ -190,7 +199,6 @@ class UILIST_OT_entry_remove(GenericUIListOperator, Operator):
|
|||
return {'FINISHED'}
|
||||
|
||||
|
||||
# noinspection PyPep8Naming
|
||||
class UILIST_OT_entry_add(GenericUIListOperator, Operator):
|
||||
"""Add an entry to the list after the current active item"""
|
||||
|
||||
|
@ -210,7 +218,6 @@ class UILIST_OT_entry_add(GenericUIListOperator, Operator):
|
|||
return {'FINISHED'}
|
||||
|
||||
|
||||
# noinspection PyPep8Naming
|
||||
class UILIST_OT_entry_move(GenericUIListOperator, Operator):
|
||||
"""Move an entry in the list up or down"""
|
||||
|
||||
|
@ -219,8 +226,8 @@ class UILIST_OT_entry_move(GenericUIListOperator, Operator):
|
|||
|
||||
direction: EnumProperty(
|
||||
name="Direction",
|
||||
items=[('UP', 'UP', 'UP'),
|
||||
('DOWN', 'DOWN', 'DOWN')],
|
||||
items=(('UP', 'UP', 'UP'),
|
||||
('DOWN', 'DOWN', 'DOWN')),
|
||||
default='UP'
|
||||
)
|
||||
|
||||
|
@ -241,9 +248,7 @@ class UILIST_OT_entry_move(GenericUIListOperator, Operator):
|
|||
return {'FINISHED'}
|
||||
|
||||
|
||||
# =============================================
|
||||
# Registration
|
||||
|
||||
# Registration.
|
||||
classes = (
|
||||
UILIST_OT_entry_remove,
|
||||
UILIST_OT_entry_add,
|
||||
|
|
|
@ -46,6 +46,7 @@ class NODE_MT_geometry_node_GEO_CURVE(Menu):
|
|||
def draw(self, _context):
|
||||
layout = self.layout
|
||||
layout.menu("NODE_MT_geometry_node_GEO_CURVE_READ")
|
||||
layout.menu("NODE_MT_geometry_node_GEO_CURVE_SAMPLE")
|
||||
layout.menu("NODE_MT_geometry_node_GEO_CURVE_WRITE")
|
||||
layout.separator()
|
||||
layout.menu("NODE_MT_geometry_node_GEO_CURVE_OPERATIONS")
|
||||
|
@ -73,6 +74,16 @@ class NODE_MT_geometry_node_GEO_CURVE_READ(Menu):
|
|||
node_add_menu.draw_assets_for_catalog(layout, self.bl_label)
|
||||
|
||||
|
||||
class NODE_MT_geometry_node_GEO_CURVE_SAMPLE(Menu):
|
||||
bl_idname = "NODE_MT_geometry_node_GEO_CURVE_SAMPLE"
|
||||
bl_label = "Sample"
|
||||
|
||||
def draw(self, _context):
|
||||
layout = self.layout
|
||||
node_add_menu.add_node_type(layout, "GeometryNodeSampleCurve")
|
||||
node_add_menu.draw_assets_for_catalog(layout, self.bl_label)
|
||||
|
||||
|
||||
class NODE_MT_geometry_node_GEO_CURVE_WRITE(Menu):
|
||||
bl_idname = "NODE_MT_geometry_node_GEO_CURVE_WRITE"
|
||||
bl_label = "Write"
|
||||
|
@ -104,7 +115,6 @@ class NODE_MT_geometry_node_GEO_CURVE_OPERATIONS(Menu):
|
|||
node_add_menu.add_node_type(layout, "GeometryNodeInterpolateCurves")
|
||||
node_add_menu.add_node_type(layout, "GeometryNodeResampleCurve")
|
||||
node_add_menu.add_node_type(layout, "GeometryNodeReverseCurve")
|
||||
node_add_menu.add_node_type(layout, "GeometryNodeSampleCurve")
|
||||
node_add_menu.add_node_type(layout, "GeometryNodeSubdivideCurve")
|
||||
node_add_menu.add_node_type(layout, "GeometryNodeTrimCurve")
|
||||
node_add_menu.draw_assets_for_catalog(layout, self.bl_label)
|
||||
|
@ -146,10 +156,10 @@ class NODE_MT_geometry_node_GEO_GEOMETRY(Menu):
|
|||
def draw(self, _context):
|
||||
layout = self.layout
|
||||
layout.menu("NODE_MT_geometry_node_GEO_GEOMETRY_READ")
|
||||
layout.menu("NODE_MT_geometry_node_GEO_GEOMETRY_SAMPLE")
|
||||
layout.menu("NODE_MT_geometry_node_GEO_GEOMETRY_WRITE")
|
||||
layout.separator()
|
||||
layout.menu("NODE_MT_geometry_node_GEO_GEOMETRY_OPERATIONS")
|
||||
layout.menu("NODE_MT_geometry_node_GEO_GEOMETRY_SAMPLE")
|
||||
layout.separator()
|
||||
node_add_menu.add_node_type(layout, "GeometryNodeJoinGeometry")
|
||||
node_add_menu.add_node_type(layout, "GeometryNodeGeometryToInstance")
|
||||
|
@ -309,6 +319,7 @@ class NODE_MT_geometry_node_GEO_MESH(Menu):
|
|||
def draw(self, _context):
|
||||
layout = self.layout
|
||||
layout.menu("NODE_MT_geometry_node_GEO_MESH_READ")
|
||||
layout.menu("NODE_MT_geometry_node_GEO_MESH_SAMPLE")
|
||||
layout.menu("NODE_MT_geometry_node_GEO_MESH_WRITE")
|
||||
layout.separator()
|
||||
layout.menu("NODE_MT_geometry_node_GEO_MESH_OPERATIONS")
|
||||
|
@ -338,6 +349,17 @@ class NODE_MT_geometry_node_GEO_MESH_READ(Menu):
|
|||
node_add_menu.draw_assets_for_catalog(layout, self.bl_label)
|
||||
|
||||
|
||||
class NODE_MT_geometry_node_GEO_MESH_SAMPLE(Menu):
|
||||
bl_idname = "NODE_MT_geometry_node_GEO_MESH_SAMPLE"
|
||||
bl_label = "Sample"
|
||||
|
||||
def draw(self, _context):
|
||||
layout = self.layout
|
||||
node_add_menu.add_node_type(layout, "GeometryNodeSampleNearestSurface")
|
||||
node_add_menu.add_node_type(layout, "GeometryNodeSampleUVSurface")
|
||||
node_add_menu.draw_assets_for_catalog(layout, self.bl_label)
|
||||
|
||||
|
||||
class NODE_MT_geometry_node_GEO_MESH_WRITE(Menu):
|
||||
bl_idname = "NODE_MT_geometry_node_GEO_MESH_WRITE"
|
||||
bl_label = "Write"
|
||||
|
@ -363,8 +385,6 @@ class NODE_MT_geometry_node_GEO_MESH_OPERATIONS(Menu):
|
|||
node_add_menu.add_node_type(layout, "GeometryNodeMeshToCurve")
|
||||
node_add_menu.add_node_type(layout, "GeometryNodeMeshToPoints")
|
||||
node_add_menu.add_node_type(layout, "GeometryNodeMeshToVolume")
|
||||
node_add_menu.add_node_type(layout, "GeometryNodeSampleNearestSurface")
|
||||
node_add_menu.add_node_type(layout, "GeometryNodeSampleUVSurface")
|
||||
node_add_menu.add_node_type(layout, "GeometryNodeScaleElements")
|
||||
node_add_menu.add_node_type(layout, "GeometryNodeSplitEdges")
|
||||
node_add_menu.add_node_type(layout, "GeometryNodeSubdivideMesh")
|
||||
|
@ -629,6 +649,7 @@ classes = (
|
|||
NODE_MT_category_GEO_OUTPUT,
|
||||
NODE_MT_geometry_node_GEO_CURVE,
|
||||
NODE_MT_geometry_node_GEO_CURVE_READ,
|
||||
NODE_MT_geometry_node_GEO_CURVE_SAMPLE,
|
||||
NODE_MT_geometry_node_GEO_CURVE_WRITE,
|
||||
NODE_MT_geometry_node_GEO_CURVE_OPERATIONS,
|
||||
NODE_MT_geometry_node_GEO_PRIMITIVES_CURVE,
|
||||
|
@ -641,6 +662,7 @@ classes = (
|
|||
NODE_MT_geometry_node_GEO_INSTANCE,
|
||||
NODE_MT_geometry_node_GEO_MESH,
|
||||
NODE_MT_geometry_node_GEO_MESH_READ,
|
||||
NODE_MT_geometry_node_GEO_MESH_SAMPLE,
|
||||
NODE_MT_geometry_node_GEO_MESH_WRITE,
|
||||
NODE_MT_geometry_node_GEO_MESH_OPERATIONS,
|
||||
NODE_MT_category_GEO_UV,
|
||||
|
|
|
@ -708,6 +708,9 @@ class DOPESHEET_MT_channel_context_menu(Menu):
|
|||
operator = "action.extrapolation_type"
|
||||
layout.operator_menu_enum(operator, "type", text="Extrapolation Mode")
|
||||
|
||||
if is_graph_editor:
|
||||
layout.operator_menu_enum("graph.fmodifier_add", "type", text="Add F-Curve Modifier").only_active = False
|
||||
|
||||
layout.separator()
|
||||
layout.operator("anim.channels_expand")
|
||||
layout.operator("anim.channels_collapse")
|
||||
|
|
|
@ -8,6 +8,8 @@ from bpy_extras import (
|
|||
asset_utils,
|
||||
)
|
||||
|
||||
from bpy.app.translations import contexts as i18n_contexts
|
||||
|
||||
|
||||
class FILEBROWSER_HT_header(Header):
|
||||
bl_space_type = 'FILE_BROWSER'
|
||||
|
@ -229,6 +231,7 @@ class FILEBROWSER_PT_bookmarks_volumes(Panel):
|
|||
bl_region_type = 'TOOLS'
|
||||
bl_category = "Bookmarks"
|
||||
bl_label = "Volumes"
|
||||
bl_translation_context = i18n_contexts.editor_filebrowser
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
|
|
|
@ -222,6 +222,7 @@ class GRAPH_MT_channel(Menu):
|
|||
layout.separator()
|
||||
layout.operator("anim.channels_editable_toggle")
|
||||
layout.operator_menu_enum("graph.extrapolation_type", "type", text="Extrapolation Mode")
|
||||
layout.operator_menu_enum("graph.fmodifier_add", "type", text="Add F-Curve Modifier").only_active = False
|
||||
|
||||
layout.separator()
|
||||
layout.operator("graph.hide", text="Hide Selected Curves").unselected = False
|
||||
|
|
|
@ -946,6 +946,7 @@ class SEQUENCER_MT_strip(Menu):
|
|||
|
||||
if strip and strip.type == 'SCENE':
|
||||
layout.operator("sequencer.delete", text="Delete Strip & Data").delete_data = True
|
||||
layout.operator("sequencer.scene_frame_range_update")
|
||||
|
||||
if has_sequencer:
|
||||
if strip:
|
||||
|
@ -1068,6 +1069,7 @@ class SEQUENCER_MT_context_menu(Menu):
|
|||
strip = context.active_sequence_strip
|
||||
if strip and strip.type == 'SCENE':
|
||||
layout.operator("sequencer.delete", text="Delete Strip & Data").delete_data = True
|
||||
layout.operator("sequencer.scene_frame_range_update")
|
||||
|
||||
layout.separator()
|
||||
|
||||
|
@ -1577,7 +1579,7 @@ class SEQUENCER_PT_effect_text_style(SequencerButtonsPanel, Panel):
|
|||
subsub.prop(strip, "shadow_color", text="")
|
||||
row.prop_decorator(strip, "shadow_color")
|
||||
|
||||
row = layout.row(align=True, heading="Box")
|
||||
row = layout.row(align=True, heading="Box", heading_ctxt=i18n_contexts.id_sequence)
|
||||
row.use_property_decorate = False
|
||||
sub = row.row(align=True)
|
||||
sub.prop(strip, "use_box", text="")
|
||||
|
@ -1845,17 +1847,17 @@ class SEQUENCER_PT_time(SequencerButtonsPanel, Panel):
|
|||
frame_offset_end = strip.frame_offset_end
|
||||
|
||||
length_list = (
|
||||
str(frame_start),
|
||||
str(frame_final_end),
|
||||
str(frame_final_duration),
|
||||
str(frame_offset_start),
|
||||
str(frame_offset_end),
|
||||
str(round(frame_start, 0)),
|
||||
str(round(frame_final_end, 0)),
|
||||
str(round(frame_final_duration, 0)),
|
||||
str(round(frame_offset_start, 0)),
|
||||
str(round(frame_offset_end, 0)),
|
||||
)
|
||||
|
||||
if not is_effect:
|
||||
length_list = length_list + (
|
||||
str(strip.animation_offset_start),
|
||||
str(strip.animation_offset_end),
|
||||
str(round(strip.animation_offset_start, 0)),
|
||||
str(round(strip.animation_offset_end, 0)),
|
||||
)
|
||||
|
||||
max_length = max(len(x) for x in length_list)
|
||||
|
@ -1994,7 +1996,7 @@ class SEQUENCER_PT_adjust_sound(SequencerButtonsPanel, Panel):
|
|||
|
||||
split = col.split(factor=0.4)
|
||||
split.alignment = 'RIGHT'
|
||||
split.label(text="Pan")
|
||||
split.label(text="Pan", heading_ctxt=i18n_contexts.id_sound)
|
||||
split.prop(strip, "pan", text="")
|
||||
split.enabled = pan_enabled
|
||||
|
||||
|
|
|
@ -605,7 +605,7 @@ class USERPREF_PT_system_cycles_devices(SystemPanel, CenterAlignMixIn, Panel):
|
|||
|
||||
|
||||
class USERPREF_PT_system_gpu_backend(SystemPanel, CenterAlignMixIn, Panel):
|
||||
bl_label = "GPU Back end"
|
||||
bl_label = "GPU Backend"
|
||||
|
||||
@classmethod
|
||||
def poll(cls, _context):
|
||||
|
|
|
@ -2038,6 +2038,7 @@ class VIEW3D_MT_select_paint_mask_vertex(Menu):
|
|||
layout.separator()
|
||||
|
||||
layout.operator("paint.vert_select_ungrouped", text="Ungrouped Vertices")
|
||||
layout.operator("paint.vert_select_linked", text="Select Linked")
|
||||
|
||||
|
||||
class VIEW3D_MT_select_edit_curves(Menu):
|
||||
|
@ -2246,6 +2247,7 @@ class VIEW3D_MT_camera_add(Menu):
|
|||
class VIEW3D_MT_volume_add(Menu):
|
||||
bl_idname = "VIEW3D_MT_volume_add"
|
||||
bl_label = "Volume"
|
||||
bl_translation_context = i18n_contexts.id_id
|
||||
|
||||
def draw(self, _context):
|
||||
layout = self.layout
|
||||
|
@ -6194,14 +6196,15 @@ class VIEW3D_PT_shading_compositor(Panel):
|
|||
def draw(self, context):
|
||||
shading = context.space_data.shading
|
||||
|
||||
import sys
|
||||
is_macos = sys.platform == "darwin"
|
||||
import gpu
|
||||
is_supported = (gpu.capabilities.compute_shader_support_get()
|
||||
and gpu.capabilities.shader_image_load_store_support_get())
|
||||
|
||||
row = self.layout.row()
|
||||
row.active = not is_macos
|
||||
row.active = is_supported
|
||||
row.prop(shading, "use_compositor", expand=True)
|
||||
if is_macos and shading.use_compositor != "DISABLED":
|
||||
self.layout.label(text="Compositor not supported on MacOS", icon='ERROR')
|
||||
if shading.use_compositor != "DISABLED" and not is_supported:
|
||||
self.layout.label(text="Compositor not supported on this platform", icon='ERROR')
|
||||
|
||||
|
||||
class VIEW3D_PT_gizmo_display(Panel):
|
||||
|
@ -6293,7 +6296,7 @@ class VIEW3D_PT_overlay_guides(Panel):
|
|||
(view.region_3d.is_orthographic_side_view and not view.region_3d.is_perspective)
|
||||
)
|
||||
row_el.active = grid_active
|
||||
row.prop(overlay, "show_floor", text="Floor")
|
||||
row.prop(overlay, "show_floor", text="Floor", text_ctxt=i18n_contexts.editor_view3d)
|
||||
|
||||
if overlay.show_floor or overlay.show_ortho_grid:
|
||||
sub = col.row(align=True)
|
||||
|
|
|
@ -19,7 +19,7 @@ class MyPanel(bpy.types.Panel):
|
|||
layout,
|
||||
context,
|
||||
list_context_path="scene.my_list",
|
||||
active_idx_context_path="scene.my_list_active_idx"
|
||||
active_index_context_path="scene.my_list_active_index"
|
||||
)
|
||||
|
||||
|
||||
|
@ -34,13 +34,13 @@ class_register, class_unregister = bpy.utils.register_classes_factory(classes)
|
|||
def register():
|
||||
class_register()
|
||||
bpy.types.Scene.my_list = bpy.props.CollectionProperty(type=MyPropGroup)
|
||||
bpy.types.Scene.my_list_active_idx = bpy.props.IntProperty()
|
||||
bpy.types.Scene.my_list_active_index = bpy.props.IntProperty()
|
||||
|
||||
|
||||
def unregister():
|
||||
class_unregister()
|
||||
del bpy.types.Scene.my_list
|
||||
del bpy.types.Scene.my_list_active_idx
|
||||
del bpy.types.Scene.my_list_active_index
|
||||
|
||||
|
||||
register()
|
||||
|
|
|
@ -153,6 +153,14 @@ bool BKE_collection_object_remove(struct Main *bmain,
|
|||
struct Collection *collection,
|
||||
struct Object *object,
|
||||
bool free_us);
|
||||
/**
|
||||
* Replace one object with another in a collection (managing user counts).
|
||||
*/
|
||||
bool BKE_collection_object_replace(struct Main *bmain,
|
||||
struct Collection *collection,
|
||||
struct Object *ob_old,
|
||||
struct Object *ob_new);
|
||||
|
||||
/**
|
||||
* Move object from a collection into another
|
||||
*
|
||||
|
|
|
@ -69,21 +69,24 @@ class CurvesGeometryRuntime {
|
|||
* Cache of offsets into the evaluated array for each curve, accounting for all previous
|
||||
* evaluated points, Bezier curve vector segments, different resolutions per curve, etc.
|
||||
*/
|
||||
mutable Vector<int> evaluated_offsets_cache;
|
||||
mutable Vector<int> all_bezier_evaluated_offsets;
|
||||
mutable CacheMutex offsets_cache_mutex;
|
||||
struct EvaluatedOffsets {
|
||||
Vector<int> evaluated_offsets;
|
||||
Vector<int> all_bezier_offsets;
|
||||
};
|
||||
mutable SharedCache<EvaluatedOffsets> evaluated_offsets_cache;
|
||||
|
||||
mutable Vector<curves::nurbs::BasisCache> nurbs_basis_cache;
|
||||
mutable CacheMutex nurbs_basis_cache_mutex;
|
||||
mutable SharedCache<Vector<curves::nurbs::BasisCache>> nurbs_basis_cache;
|
||||
|
||||
/** Cache of evaluated positions. */
|
||||
mutable Vector<float3> evaluated_position_cache;
|
||||
mutable CacheMutex position_cache_mutex;
|
||||
/**
|
||||
* The evaluated positions result, using a separate span in case all curves are poly curves,
|
||||
* in which case a separate array of evaluated positions is unnecessary.
|
||||
*/
|
||||
mutable Span<float3> evaluated_positions_span;
|
||||
struct EvaluatedPositions {
|
||||
Vector<float3> vector;
|
||||
/**
|
||||
* The evaluated positions result, using a separate span in case all curves are poly curves,
|
||||
* in which case a separate array of evaluated positions is unnecessary.
|
||||
*/
|
||||
Span<float3> span;
|
||||
};
|
||||
mutable SharedCache<EvaluatedPositions> evaluated_position_cache;
|
||||
|
||||
/**
|
||||
* A cache of bounds shared between data-blocks with unchanged positions and radii.
|
||||
|
@ -97,16 +100,13 @@ class CurvesGeometryRuntime {
|
|||
* cyclic, it needs one more length value to correspond to the last segment, so in order to
|
||||
* make slicing this array for a curve fast, an extra float is stored for every curve.
|
||||
*/
|
||||
mutable Vector<float> evaluated_length_cache;
|
||||
mutable CacheMutex length_cache_mutex;
|
||||
mutable SharedCache<Vector<float>> evaluated_length_cache;
|
||||
|
||||
/** Direction of the curve at each evaluated point. */
|
||||
mutable Vector<float3> evaluated_tangent_cache;
|
||||
mutable CacheMutex tangent_cache_mutex;
|
||||
mutable SharedCache<Vector<float3>> evaluated_tangent_cache;
|
||||
|
||||
/** Normal direction vectors for each evaluated point. */
|
||||
mutable Vector<float3> evaluated_normal_cache;
|
||||
mutable CacheMutex normal_cache_mutex;
|
||||
mutable SharedCache<Vector<float3>> evaluated_normal_cache;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -128,17 +128,6 @@ class CurvesGeometry : public ::CurvesGeometry {
|
|||
CurvesGeometry &operator=(CurvesGeometry &&other);
|
||||
~CurvesGeometry();
|
||||
|
||||
static CurvesGeometry &wrap(::CurvesGeometry &dna_struct)
|
||||
{
|
||||
CurvesGeometry *geometry = reinterpret_cast<CurvesGeometry *>(&dna_struct);
|
||||
return *geometry;
|
||||
}
|
||||
static const CurvesGeometry &wrap(const ::CurvesGeometry &dna_struct)
|
||||
{
|
||||
const CurvesGeometry *geometry = reinterpret_cast<const CurvesGeometry *>(&dna_struct);
|
||||
return *geometry;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* Accessors.
|
||||
*/
|
||||
|
@ -408,6 +397,8 @@ class CurvesGeometry : public ::CurvesGeometry {
|
|||
}
|
||||
};
|
||||
|
||||
static_assert(sizeof(blender::bke::CurvesGeometry) == sizeof(::CurvesGeometry));
|
||||
|
||||
/**
|
||||
* Used to propagate deformation data through modifier evaluation so that sculpt tools can work on
|
||||
* evaluated data.
|
||||
|
@ -692,7 +683,7 @@ int calculate_evaluated_num(int points_num, bool cyclic, int resolution);
|
|||
void interpolate_to_evaluated(GSpan src, bool cyclic, int resolution, GMutableSpan dst);
|
||||
|
||||
/**
|
||||
* Evaluate the Catmull Rom curve. The placement of each segment in the #dst span is desribed by
|
||||
* Evaluate the Catmull Rom curve. The placement of each segment in the #dst span is described by
|
||||
* #evaluated_offsets.
|
||||
*/
|
||||
void interpolate_to_evaluated(const GSpan src,
|
||||
|
@ -875,7 +866,8 @@ inline Span<int> CurvesGeometry::bezier_evaluated_offsets_for_curve(const int cu
|
|||
const OffsetIndices points_by_curve = this->points_by_curve();
|
||||
const IndexRange points = points_by_curve[curve_index];
|
||||
const IndexRange range = curves::per_curve_point_offsets_range(points, curve_index);
|
||||
return this->runtime->all_bezier_evaluated_offsets.as_span().slice(range);
|
||||
const Span<int> offsets = this->runtime->evaluated_offsets_cache.data().all_bezier_offsets;
|
||||
return offsets.slice(range);
|
||||
}
|
||||
|
||||
inline IndexRange CurvesGeometry::lengths_range_for_curve(const int curve_index,
|
||||
|
@ -890,9 +882,8 @@ inline IndexRange CurvesGeometry::lengths_range_for_curve(const int curve_index,
|
|||
inline Span<float> CurvesGeometry::evaluated_lengths_for_curve(const int curve_index,
|
||||
const bool cyclic) const
|
||||
{
|
||||
BLI_assert(this->runtime->length_cache_mutex.is_cached());
|
||||
const IndexRange range = this->lengths_range_for_curve(curve_index, cyclic);
|
||||
return this->runtime->evaluated_length_cache.as_span().slice(range);
|
||||
return this->runtime->evaluated_length_cache.data().as_span().slice(range);
|
||||
}
|
||||
|
||||
inline float CurvesGeometry::evaluated_length_total_for_curve(const int curve_index,
|
||||
|
@ -966,3 +957,12 @@ struct CurvesSurfaceTransforms {
|
|||
};
|
||||
|
||||
} // namespace blender::bke
|
||||
|
||||
inline blender::bke::CurvesGeometry &CurvesGeometry::wrap()
|
||||
{
|
||||
return *reinterpret_cast<blender::bke::CurvesGeometry *>(this);
|
||||
}
|
||||
inline const blender::bke::CurvesGeometry &CurvesGeometry::wrap() const
|
||||
{
|
||||
return *reinterpret_cast<const blender::bke::CurvesGeometry *>(this);
|
||||
}
|
||||
|
|
|
@ -100,6 +100,7 @@ typedef struct MeshElemMap {
|
|||
#ifdef __cplusplus
|
||||
|
||||
/* mapping */
|
||||
|
||||
UvVertMap *BKE_mesh_uv_vert_map_create(blender::OffsetIndices<int> polys,
|
||||
const bool *hide_poly,
|
||||
const bool *select_poly,
|
||||
|
|
|
@ -133,7 +133,19 @@ void BKE_nlastrips_sort_strips(ListBase *strips);
|
|||
|
||||
/**
|
||||
* Add the given NLA-Strip to the given list of strips, assuming that it
|
||||
* isn't currently a member of another list
|
||||
* isn't currently a member of another list, NULL, or conflicting with existing
|
||||
* strips position.
|
||||
*/
|
||||
void BKE_nlastrips_add_strip_unsafe(ListBase *strips, struct NlaStrip *strip);
|
||||
|
||||
/**
|
||||
* @brief NULL checks incoming strip and verifies no overlap / invalid
|
||||
* configuration against other strips in NLA Track.
|
||||
*
|
||||
* @param strips
|
||||
* @param strip
|
||||
* @return true
|
||||
* @return false
|
||||
*/
|
||||
bool BKE_nlastrips_add_strip(ListBase *strips, struct NlaStrip *strip);
|
||||
|
||||
|
|
|
@ -298,7 +298,7 @@ typedef struct bNodeType {
|
|||
const struct bNodeTree *nodetree,
|
||||
const char **r_disabled_hint);
|
||||
|
||||
/* optional handling of link insertion. Returns false if the link shouldn't be created. */
|
||||
/* Optional handling of link insertion. Returns false if the link shouldn't be created. */
|
||||
bool (*insert_link)(struct bNodeTree *ntree, struct bNode *node, struct bNodeLink *link);
|
||||
|
||||
void (*free_self)(struct bNodeType *ntype);
|
||||
|
|
|
@ -502,7 +502,7 @@ set(SRC
|
|||
intern/data_transfer_intern.h
|
||||
intern/lib_intern.h
|
||||
intern/multires_inline.h
|
||||
intern/multires_reshape.h
|
||||
intern/multires_reshape.hh
|
||||
intern/multires_unsubdivide.h
|
||||
intern/ocean_intern.h
|
||||
intern/pbvh_intern.h
|
||||
|
|
|
@ -128,7 +128,7 @@ bMotionPath *animviz_verify_motionpaths(ReportList *reports,
|
|||
dst = &ob->mpath;
|
||||
}
|
||||
|
||||
/* avoid 0 size allocs */
|
||||
/* Avoid 0 size allocations. */
|
||||
if (avs->path_sf >= avs->path_ef) {
|
||||
BKE_reportf(reports,
|
||||
RPT_ERROR,
|
||||
|
|
|
@ -112,7 +112,7 @@ static std::optional<blender::bke::MutableAttributeAccessor> get_attribute_acces
|
|||
}
|
||||
case ID_CV: {
|
||||
Curves &curves_id = reinterpret_cast<Curves &>(id);
|
||||
CurvesGeometry &curves = CurvesGeometry::wrap(curves_id.geometry);
|
||||
CurvesGeometry &curves = curves_id.geometry.wrap();
|
||||
return curves.attributes_for_write();
|
||||
}
|
||||
default: {
|
||||
|
|
|
@ -382,7 +382,7 @@ static void setup_app_data(bContext *C,
|
|||
STRNCPY(bmain->filepath, bfd->filepath);
|
||||
}
|
||||
|
||||
/* baseflags, groups, make depsgraph, etc */
|
||||
/* Base-flags, groups, make depsgraph, etc. */
|
||||
/* first handle case if other windows have different scenes visible */
|
||||
if (mode == LOAD_UI) {
|
||||
wmWindowManager *wm = static_cast<wmWindowManager *>(bmain->wm.first);
|
||||
|
|
|
@ -75,7 +75,8 @@ static void brush_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, cons
|
|||
brush_dst->automasking_cavity_curve = BKE_curvemapping_copy(brush_src->automasking_cavity_curve);
|
||||
|
||||
if (brush_src->gpencil_settings != nullptr) {
|
||||
brush_dst->gpencil_settings = MEM_cnew(__func__, *(brush_src->gpencil_settings));
|
||||
brush_dst->gpencil_settings = MEM_cnew<BrushGpencilSettings>(__func__,
|
||||
*(brush_src->gpencil_settings));
|
||||
brush_dst->gpencil_settings->curve_sensitivity = BKE_curvemapping_copy(
|
||||
brush_src->gpencil_settings->curve_sensitivity);
|
||||
brush_dst->gpencil_settings->curve_strength = BKE_curvemapping_copy(
|
||||
|
@ -97,7 +98,8 @@ static void brush_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, cons
|
|||
brush_src->gpencil_settings->curve_rand_value);
|
||||
}
|
||||
if (brush_src->curves_sculpt_settings != nullptr) {
|
||||
brush_dst->curves_sculpt_settings = MEM_cnew(__func__, *(brush_src->curves_sculpt_settings));
|
||||
brush_dst->curves_sculpt_settings = MEM_cnew<BrushCurvesSculptSettings>(
|
||||
__func__, *(brush_src->curves_sculpt_settings));
|
||||
}
|
||||
|
||||
/* enable fake user by default */
|
||||
|
@ -149,7 +151,8 @@ static void brush_make_local(Main *bmain, ID *id, const int flags)
|
|||
BKE_lib_id_make_local_generic_action_define(bmain, id, flags, &force_local, &force_copy);
|
||||
|
||||
if (brush->clone.image) {
|
||||
/* Special case: ima always local immediately. Clone image should only have one user anyway. */
|
||||
/* Special case: `ima` always local immediately.
|
||||
* Clone image should only have one user anyway. */
|
||||
/* FIXME: Recursive calls affecting other non-embedded IDs are really bad and should be avoided
|
||||
* in IDType callbacks. Higher-level ID management code usually does not expect such things and
|
||||
* does not deal properly with it. */
|
||||
|
|
|
@ -1214,6 +1214,28 @@ bool BKE_collection_object_remove(Main *bmain,
|
|||
return true;
|
||||
}
|
||||
|
||||
bool BKE_collection_object_replace(Main *bmain,
|
||||
Collection *collection,
|
||||
Object *ob_old,
|
||||
Object *ob_new)
|
||||
{
|
||||
CollectionObject *cob = BLI_findptr(
|
||||
&collection->gobject, ob_old, offsetof(CollectionObject, ob));
|
||||
if (cob == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
id_us_min(&cob->ob->id);
|
||||
cob->ob = ob_new;
|
||||
id_us_plus(&cob->ob->id);
|
||||
|
||||
if (BKE_collection_is_in_scene(collection)) {
|
||||
BKE_main_collection_sync(bmain);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove object from all collections of scene
|
||||
* \param collection_skip: Don't remove base from this collection.
|
||||
|
|
|
@ -4528,7 +4528,7 @@ static void damptrack_do_transform(float matrix[4][4], const float tarvec_in[3],
|
|||
}
|
||||
}
|
||||
else if (norm < 0.1f) {
|
||||
/* near 0 and Pi arcsin has way better precision than arccos */
|
||||
/* Near 0 and Pi `arcsin` has way better precision than `arccos`. */
|
||||
rangle = (rangle > M_PI_2) ? M_PI - asinf(norm) : asinf(norm);
|
||||
}
|
||||
|
||||
|
|
|
@ -601,7 +601,7 @@ GeometryDeformation get_evaluated_curves_deformation(const Depsgraph &depsgraph,
|
|||
{
|
||||
BLI_assert(ob_orig.type == OB_CURVES);
|
||||
const Curves &curves_id_orig = *static_cast<const Curves *>(ob_orig.data);
|
||||
const CurvesGeometry &curves_orig = CurvesGeometry::wrap(curves_id_orig.geometry);
|
||||
const CurvesGeometry &curves_orig = curves_id_orig.geometry.wrap();
|
||||
const int points_num = curves_orig.points_num();
|
||||
|
||||
GeometryDeformation deformation;
|
||||
|
@ -643,7 +643,7 @@ GeometryDeformation get_evaluated_curves_deformation(const Depsgraph &depsgraph,
|
|||
if (curves_component_eval != nullptr) {
|
||||
const Curves *curves_id_eval = curves_component_eval->get_for_read();
|
||||
if (curves_id_eval != nullptr) {
|
||||
const CurvesGeometry &curves_eval = CurvesGeometry::wrap(curves_id_eval->geometry);
|
||||
const CurvesGeometry &curves_eval = curves_id_eval->geometry.wrap();
|
||||
if (curves_eval.points_num() == points_num) {
|
||||
deformation.positions = curves_eval.positions();
|
||||
}
|
||||
|
|
|
@ -82,7 +82,7 @@ Curves *curve_legacy_to_curves(const Curve &curve_legacy, const ListBase &nurbs_
|
|||
const Vector<const Nurb *> src_curves(nurbs_list);
|
||||
|
||||
Curves *curves_id = curves_new_nomain(0, src_curves.size());
|
||||
CurvesGeometry &curves = CurvesGeometry::wrap(curves_id->geometry);
|
||||
CurvesGeometry &curves = curves_id->geometry.wrap();
|
||||
MutableAttributeAccessor curves_attributes = curves.attributes_for_write();
|
||||
|
||||
MutableSpan<int8_t> types = curves.curve_types_for_write();
|
||||
|
|
|
@ -70,8 +70,8 @@ static void curves_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, con
|
|||
const Curves *curves_src = (const Curves *)id_src;
|
||||
curves_dst->mat = static_cast<Material **>(MEM_dupallocN(curves_src->mat));
|
||||
|
||||
const bke::CurvesGeometry &src = bke::CurvesGeometry::wrap(curves_src->geometry);
|
||||
bke::CurvesGeometry &dst = bke::CurvesGeometry::wrap(curves_dst->geometry);
|
||||
const bke::CurvesGeometry &src = curves_src->geometry.wrap();
|
||||
bke::CurvesGeometry &dst = curves_dst->geometry.wrap();
|
||||
|
||||
/* We need special handling here because the generic ID management code has already done a
|
||||
* shallow copy from the source to the destination, and because the copy-on-write functionality
|
||||
|
@ -93,7 +93,13 @@ static void curves_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, con
|
|||
dst.runtime = MEM_new<bke::CurvesGeometryRuntime>(__func__);
|
||||
|
||||
dst.runtime->type_counts = src.runtime->type_counts;
|
||||
dst.runtime->evaluated_offsets_cache = src.runtime->evaluated_offsets_cache;
|
||||
dst.runtime->nurbs_basis_cache = src.runtime->nurbs_basis_cache;
|
||||
dst.runtime->evaluated_position_cache = src.runtime->evaluated_position_cache;
|
||||
dst.runtime->bounds_cache = src.runtime->bounds_cache;
|
||||
dst.runtime->evaluated_length_cache = src.runtime->evaluated_length_cache;
|
||||
dst.runtime->evaluated_tangent_cache = src.runtime->evaluated_tangent_cache;
|
||||
dst.runtime->evaluated_normal_cache = src.runtime->evaluated_normal_cache;
|
||||
|
||||
curves_dst->batch_cache = nullptr;
|
||||
}
|
||||
|
@ -103,7 +109,7 @@ static void curves_free_data(ID *id)
|
|||
Curves *curves = (Curves *)id;
|
||||
BKE_animdata_free(&curves->id, false);
|
||||
|
||||
blender::bke::CurvesGeometry::wrap(curves->geometry).~CurvesGeometry();
|
||||
curves->geometry.wrap().~CurvesGeometry();
|
||||
|
||||
BKE_curves_batch_cache_free(curves);
|
||||
|
||||
|
@ -174,7 +180,7 @@ static void curves_blend_read_data(BlendDataReader *reader, ID *id)
|
|||
curves->geometry.runtime = MEM_new<blender::bke::CurvesGeometryRuntime>(__func__);
|
||||
|
||||
/* Recalculate curve type count cache that isn't saved in files. */
|
||||
blender::bke::CurvesGeometry::wrap(curves->geometry).update_curve_types();
|
||||
curves->geometry.wrap().update_curve_types();
|
||||
|
||||
/* Materials */
|
||||
BLO_read_pointer_array(reader, (void **)&curves->mat);
|
||||
|
@ -247,8 +253,7 @@ BoundBox *BKE_curves_boundbox_get(Object *ob)
|
|||
if (ob->runtime.bb == nullptr) {
|
||||
ob->runtime.bb = MEM_cnew<BoundBox>(__func__);
|
||||
|
||||
const blender::bke::CurvesGeometry &curves = blender::bke::CurvesGeometry::wrap(
|
||||
curves_id->geometry);
|
||||
const blender::bke::CurvesGeometry &curves = curves_id->geometry.wrap();
|
||||
|
||||
float3 min(FLT_MAX);
|
||||
float3 max(-FLT_MAX);
|
||||
|
@ -372,7 +377,7 @@ Curves *curves_new_nomain(const int points_num, const int curves_num)
|
|||
BLI_assert(points_num >= 0);
|
||||
BLI_assert(curves_num >= 0);
|
||||
Curves *curves_id = static_cast<Curves *>(BKE_id_new_nomain(ID_CV, nullptr));
|
||||
CurvesGeometry &curves = CurvesGeometry::wrap(curves_id->geometry);
|
||||
CurvesGeometry &curves = curves_id->geometry.wrap();
|
||||
curves.resize(points_num, curves_num);
|
||||
return curves_id;
|
||||
}
|
||||
|
@ -380,7 +385,7 @@ Curves *curves_new_nomain(const int points_num, const int curves_num)
|
|||
Curves *curves_new_nomain_single(const int points_num, const CurveType type)
|
||||
{
|
||||
Curves *curves_id = curves_new_nomain(points_num, 1);
|
||||
CurvesGeometry &curves = CurvesGeometry::wrap(curves_id->geometry);
|
||||
CurvesGeometry &curves = curves_id->geometry.wrap();
|
||||
curves.offsets_for_write().last() = points_num;
|
||||
curves.fill_curve_types(type);
|
||||
return curves_id;
|
||||
|
@ -389,7 +394,7 @@ Curves *curves_new_nomain_single(const int points_num, const CurveType type)
|
|||
Curves *curves_new_nomain(CurvesGeometry curves)
|
||||
{
|
||||
Curves *curves_id = static_cast<Curves *>(BKE_id_new_nomain(ID_CV, nullptr));
|
||||
bke::CurvesGeometry::wrap(curves_id->geometry) = std::move(curves);
|
||||
curves_id->geometry.wrap() = std::move(curves);
|
||||
return curves_id;
|
||||
}
|
||||
|
||||
|
|
|
@ -93,7 +93,13 @@ static void copy_curves_geometry(CurvesGeometry &dst, const CurvesGeometry &src)
|
|||
|
||||
/* Though type counts are a cache, they must be copied because they are calculated eagerly. */
|
||||
dst.runtime->type_counts = src.runtime->type_counts;
|
||||
dst.runtime->evaluated_offsets_cache = src.runtime->evaluated_offsets_cache;
|
||||
dst.runtime->nurbs_basis_cache = src.runtime->nurbs_basis_cache;
|
||||
dst.runtime->evaluated_position_cache = src.runtime->evaluated_position_cache;
|
||||
dst.runtime->bounds_cache = src.runtime->bounds_cache;
|
||||
dst.runtime->evaluated_length_cache = src.runtime->evaluated_length_cache;
|
||||
dst.runtime->evaluated_tangent_cache = src.runtime->evaluated_tangent_cache;
|
||||
dst.runtime->evaluated_normal_cache = src.runtime->evaluated_normal_cache;
|
||||
}
|
||||
|
||||
CurvesGeometry::CurvesGeometry(const CurvesGeometry &other)
|
||||
|
@ -499,30 +505,31 @@ static void calculate_evaluated_offsets(const CurvesGeometry &curves,
|
|||
|
||||
OffsetIndices<int> CurvesGeometry::evaluated_points_by_curve() const
|
||||
{
|
||||
const bke::CurvesGeometryRuntime &runtime = *this->runtime;
|
||||
if (this->is_single_type(CURVE_TYPE_POLY)) {
|
||||
/* When all the curves are poly curves, the evaluated offsets are the same as the control
|
||||
* point offsets, so it's possible to completely avoid building a new offsets array. */
|
||||
this->runtime->offsets_cache_mutex.ensure(
|
||||
[&]() { this->runtime->evaluated_offsets_cache.clear_and_shrink(); });
|
||||
runtime.evaluated_offsets_cache.ensure([&](CurvesGeometryRuntime::EvaluatedOffsets &r_data) {
|
||||
r_data.evaluated_offsets.clear_and_shrink();
|
||||
r_data.all_bezier_offsets.clear_and_shrink();
|
||||
});
|
||||
return this->points_by_curve();
|
||||
}
|
||||
|
||||
this->runtime->offsets_cache_mutex.ensure([&]() {
|
||||
this->runtime->evaluated_offsets_cache.resize(this->curves_num() + 1);
|
||||
runtime.evaluated_offsets_cache.ensure([&](CurvesGeometryRuntime::EvaluatedOffsets &r_data) {
|
||||
r_data.evaluated_offsets.resize(this->curves_num() + 1);
|
||||
|
||||
if (this->has_curve_with_type(CURVE_TYPE_BEZIER)) {
|
||||
this->runtime->all_bezier_evaluated_offsets.resize(this->points_num() + this->curves_num());
|
||||
r_data.all_bezier_offsets.resize(this->points_num() + this->curves_num());
|
||||
}
|
||||
else {
|
||||
this->runtime->all_bezier_evaluated_offsets.clear_and_shrink();
|
||||
r_data.all_bezier_offsets.clear_and_shrink();
|
||||
}
|
||||
|
||||
calculate_evaluated_offsets(*this,
|
||||
this->runtime->evaluated_offsets_cache,
|
||||
this->runtime->all_bezier_evaluated_offsets);
|
||||
calculate_evaluated_offsets(*this, r_data.evaluated_offsets, r_data.all_bezier_offsets);
|
||||
});
|
||||
|
||||
return OffsetIndices<int>(this->runtime->evaluated_offsets_cache);
|
||||
return OffsetIndices<int>(runtime.evaluated_offsets_cache.data().evaluated_offsets);
|
||||
}
|
||||
|
||||
IndexMask CurvesGeometry::indices_for_curve_type(const CurveType type,
|
||||
|
@ -553,15 +560,16 @@ Array<int> CurvesGeometry::point_to_curve_map() const
|
|||
|
||||
void CurvesGeometry::ensure_nurbs_basis_cache() const
|
||||
{
|
||||
this->runtime->nurbs_basis_cache_mutex.ensure([&]() {
|
||||
const bke::CurvesGeometryRuntime &runtime = *this->runtime;
|
||||
runtime.nurbs_basis_cache.ensure([&](Vector<curves::nurbs::BasisCache> &r_data) {
|
||||
Vector<int64_t> nurbs_indices;
|
||||
const IndexMask nurbs_mask = this->indices_for_curve_type(CURVE_TYPE_NURBS, nurbs_indices);
|
||||
if (nurbs_mask.is_empty()) {
|
||||
r_data.clear_and_shrink();
|
||||
return;
|
||||
}
|
||||
|
||||
this->runtime->nurbs_basis_cache.resize(this->curves_num());
|
||||
MutableSpan<curves::nurbs::BasisCache> basis_caches(this->runtime->nurbs_basis_cache);
|
||||
r_data.resize(this->curves_num());
|
||||
|
||||
const OffsetIndices<int> points_by_curve = this->points_by_curve();
|
||||
const OffsetIndices<int> evaluated_points_by_curve = this->evaluated_points_by_curve();
|
||||
|
@ -580,18 +588,14 @@ void CurvesGeometry::ensure_nurbs_basis_cache() const
|
|||
const KnotsMode mode = KnotsMode(knots_modes[curve_index]);
|
||||
|
||||
if (!curves::nurbs::check_valid_num_and_order(points.size(), order, is_cyclic, mode)) {
|
||||
basis_caches[curve_index].invalid = true;
|
||||
r_data[curve_index].invalid = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
knots.reinitialize(curves::nurbs::knots_num(points.size(), order, is_cyclic));
|
||||
curves::nurbs::calculate_knots(points.size(), mode, order, is_cyclic, knots);
|
||||
curves::nurbs::calculate_basis_cache(points.size(),
|
||||
evaluated_points.size(),
|
||||
order,
|
||||
is_cyclic,
|
||||
knots,
|
||||
basis_caches[curve_index]);
|
||||
curves::nurbs::calculate_basis_cache(
|
||||
points.size(), evaluated_points.size(), order, is_cyclic, knots, r_data[curve_index]);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
@ -599,16 +603,18 @@ void CurvesGeometry::ensure_nurbs_basis_cache() const
|
|||
|
||||
Span<float3> CurvesGeometry::evaluated_positions() const
|
||||
{
|
||||
this->runtime->position_cache_mutex.ensure([&]() {
|
||||
const bke::CurvesGeometryRuntime &runtime = *this->runtime;
|
||||
this->ensure_nurbs_basis_cache();
|
||||
runtime.evaluated_position_cache.ensure([&](CurvesGeometryRuntime::EvaluatedPositions &r_data) {
|
||||
if (this->is_single_type(CURVE_TYPE_POLY)) {
|
||||
this->runtime->evaluated_positions_span = this->positions();
|
||||
this->runtime->evaluated_position_cache.clear_and_shrink();
|
||||
r_data.span = this->positions();
|
||||
r_data.vector.clear_and_shrink();
|
||||
return;
|
||||
}
|
||||
|
||||
this->runtime->evaluated_position_cache.resize(this->evaluated_points_num());
|
||||
MutableSpan<float3> evaluated_positions = this->runtime->evaluated_position_cache;
|
||||
this->runtime->evaluated_positions_span = evaluated_positions;
|
||||
r_data.vector.resize(this->evaluated_points_num());
|
||||
r_data.span = r_data.vector;
|
||||
MutableSpan<float3> evaluated_positions = r_data.vector;
|
||||
|
||||
const OffsetIndices<int> points_by_curve = this->points_by_curve();
|
||||
const OffsetIndices<int> evaluated_points_by_curve = this->evaluated_points_by_curve();
|
||||
|
@ -619,12 +625,11 @@ Span<float3> CurvesGeometry::evaluated_positions() const
|
|||
|
||||
const Span<float3> handle_positions_left = this->handle_positions_left();
|
||||
const Span<float3> handle_positions_right = this->handle_positions_right();
|
||||
const Span<int> all_bezier_evaluated_offsets = this->runtime->all_bezier_evaluated_offsets;
|
||||
const Span<int> all_bezier_offsets = runtime.evaluated_offsets_cache.data().all_bezier_offsets;
|
||||
|
||||
const VArray<int8_t> nurbs_orders = this->nurbs_orders();
|
||||
const Span<float> nurbs_weights = this->nurbs_weights();
|
||||
|
||||
this->ensure_nurbs_basis_cache();
|
||||
const Span<curves::nurbs::BasisCache> nurbs_basis_cache = runtime.nurbs_basis_cache.data();
|
||||
|
||||
threading::parallel_for(this->curves_range(), 128, [&](IndexRange curves_range) {
|
||||
for (const int curve_index : curves_range) {
|
||||
|
@ -648,12 +653,12 @@ Span<float3> CurvesGeometry::evaluated_positions() const
|
|||
positions.slice(points),
|
||||
handle_positions_left.slice(points),
|
||||
handle_positions_right.slice(points),
|
||||
all_bezier_evaluated_offsets.slice(offsets),
|
||||
all_bezier_offsets.slice(offsets),
|
||||
evaluated_positions.slice(evaluated_points));
|
||||
break;
|
||||
}
|
||||
case CURVE_TYPE_NURBS:
|
||||
curves::nurbs::interpolate_to_evaluated(this->runtime->nurbs_basis_cache[curve_index],
|
||||
curves::nurbs::interpolate_to_evaluated(nurbs_basis_cache[curve_index],
|
||||
nurbs_orders[curve_index],
|
||||
nurbs_weights.slice_safe(points),
|
||||
positions.slice(points),
|
||||
|
@ -666,18 +671,19 @@ Span<float3> CurvesGeometry::evaluated_positions() const
|
|||
}
|
||||
});
|
||||
});
|
||||
return this->runtime->evaluated_positions_span;
|
||||
return runtime.evaluated_position_cache.data().span;
|
||||
}
|
||||
|
||||
Span<float3> CurvesGeometry::evaluated_tangents() const
|
||||
{
|
||||
this->runtime->tangent_cache_mutex.ensure([&]() {
|
||||
const bke::CurvesGeometryRuntime &runtime = *this->runtime;
|
||||
runtime.evaluated_tangent_cache.ensure([&](Vector<float3> &r_data) {
|
||||
const OffsetIndices<int> evaluated_points_by_curve = this->evaluated_points_by_curve();
|
||||
const Span<float3> evaluated_positions = this->evaluated_positions();
|
||||
const VArray<bool> cyclic = this->cyclic();
|
||||
|
||||
this->runtime->evaluated_tangent_cache.resize(this->evaluated_points_num());
|
||||
MutableSpan<float3> tangents = this->runtime->evaluated_tangent_cache;
|
||||
r_data.resize(this->evaluated_points_num());
|
||||
MutableSpan<float3> tangents = r_data;
|
||||
|
||||
threading::parallel_for(this->curves_range(), 128, [&](IndexRange curves_range) {
|
||||
for (const int curve_index : curves_range) {
|
||||
|
@ -722,7 +728,7 @@ Span<float3> CurvesGeometry::evaluated_tangents() const
|
|||
});
|
||||
}
|
||||
});
|
||||
return this->runtime->evaluated_tangent_cache;
|
||||
return runtime.evaluated_tangent_cache.data();
|
||||
}
|
||||
|
||||
static void rotate_directions_around_axes(MutableSpan<float3> directions,
|
||||
|
@ -773,7 +779,8 @@ static void evaluate_generic_data_for_curve(
|
|||
|
||||
Span<float3> CurvesGeometry::evaluated_normals() const
|
||||
{
|
||||
this->runtime->normal_cache_mutex.ensure([&]() {
|
||||
const bke::CurvesGeometryRuntime &runtime = *this->runtime;
|
||||
runtime.evaluated_normal_cache.ensure([&](Vector<float3> &r_data) {
|
||||
const OffsetIndices<int> points_by_curve = this->points_by_curve();
|
||||
const OffsetIndices<int> evaluated_points_by_curve = this->evaluated_points_by_curve();
|
||||
const VArray<int8_t> types = this->curve_types();
|
||||
|
@ -782,6 +789,8 @@ Span<float3> CurvesGeometry::evaluated_normals() const
|
|||
const VArray<int> resolution = this->resolution();
|
||||
const VArray<int8_t> nurbs_orders = this->nurbs_orders();
|
||||
const Span<float> nurbs_weights = this->nurbs_weights();
|
||||
const Span<int> all_bezier_offsets = runtime.evaluated_offsets_cache.data().all_bezier_offsets;
|
||||
const Span<curves::nurbs::BasisCache> nurbs_basis_cache = runtime.nurbs_basis_cache.data();
|
||||
|
||||
const Span<float3> evaluated_tangents = this->evaluated_tangents();
|
||||
const VArray<float> tilt = this->tilt();
|
||||
|
@ -791,8 +800,8 @@ Span<float3> CurvesGeometry::evaluated_normals() const
|
|||
tilt_span = tilt;
|
||||
}
|
||||
|
||||
this->runtime->evaluated_normal_cache.resize(this->evaluated_points_num());
|
||||
MutableSpan<float3> evaluated_normals = this->runtime->evaluated_normal_cache;
|
||||
r_data.resize(this->evaluated_points_num());
|
||||
MutableSpan<float3> evaluated_normals = r_data;
|
||||
|
||||
threading::parallel_for(this->curves_range(), 128, [&](IndexRange curves_range) {
|
||||
/* Reuse a buffer for the evaluated tilts. */
|
||||
|
@ -828,8 +837,8 @@ Span<float3> CurvesGeometry::evaluated_normals() const
|
|||
types,
|
||||
cyclic,
|
||||
resolution,
|
||||
this->runtime->all_bezier_evaluated_offsets.as_span(),
|
||||
this->runtime->nurbs_basis_cache.as_span(),
|
||||
all_bezier_offsets,
|
||||
nurbs_basis_cache,
|
||||
nurbs_orders,
|
||||
nurbs_weights,
|
||||
tilt_span.slice(points),
|
||||
|
@ -842,15 +851,14 @@ Span<float3> CurvesGeometry::evaluated_normals() const
|
|||
}
|
||||
});
|
||||
});
|
||||
return this->runtime->evaluated_normal_cache;
|
||||
return this->runtime->evaluated_normal_cache.data();
|
||||
}
|
||||
|
||||
void CurvesGeometry::interpolate_to_evaluated(const int curve_index,
|
||||
const GSpan src,
|
||||
GMutableSpan dst) const
|
||||
{
|
||||
BLI_assert(this->runtime->offsets_cache_mutex.is_cached());
|
||||
BLI_assert(this->runtime->nurbs_basis_cache_mutex.is_cached());
|
||||
const bke::CurvesGeometryRuntime &runtime = *this->runtime;
|
||||
const OffsetIndices points_by_curve = this->points_by_curve();
|
||||
const IndexRange points = points_by_curve[curve_index];
|
||||
BLI_assert(src.size() == points.size());
|
||||
|
@ -860,8 +868,8 @@ void CurvesGeometry::interpolate_to_evaluated(const int curve_index,
|
|||
this->curve_types(),
|
||||
this->cyclic(),
|
||||
this->resolution(),
|
||||
this->runtime->all_bezier_evaluated_offsets.as_span(),
|
||||
this->runtime->nurbs_basis_cache.as_span(),
|
||||
runtime.evaluated_offsets_cache.data().all_bezier_offsets,
|
||||
runtime.nurbs_basis_cache.data(),
|
||||
this->nurbs_orders(),
|
||||
this->nurbs_weights(),
|
||||
src,
|
||||
|
@ -870,8 +878,7 @@ void CurvesGeometry::interpolate_to_evaluated(const int curve_index,
|
|||
|
||||
void CurvesGeometry::interpolate_to_evaluated(const GSpan src, GMutableSpan dst) const
|
||||
{
|
||||
BLI_assert(this->runtime->offsets_cache_mutex.is_cached());
|
||||
BLI_assert(this->runtime->nurbs_basis_cache_mutex.is_cached());
|
||||
const bke::CurvesGeometryRuntime &runtime = *this->runtime;
|
||||
const OffsetIndices points_by_curve = this->points_by_curve();
|
||||
const OffsetIndices evaluated_points_by_curve = this->evaluated_points_by_curve();
|
||||
const VArray<int8_t> types = this->curve_types();
|
||||
|
@ -879,6 +886,8 @@ void CurvesGeometry::interpolate_to_evaluated(const GSpan src, GMutableSpan dst)
|
|||
const VArray<bool> cyclic = this->cyclic();
|
||||
const VArray<int8_t> nurbs_orders = this->nurbs_orders();
|
||||
const Span<float> nurbs_weights = this->nurbs_weights();
|
||||
const Span<int> all_bezier_offsets = runtime.evaluated_offsets_cache.data().all_bezier_offsets;
|
||||
const Span<curves::nurbs::BasisCache> nurbs_basis_cache = runtime.nurbs_basis_cache.data();
|
||||
|
||||
threading::parallel_for(this->curves_range(), 512, [&](IndexRange curves_range) {
|
||||
for (const int curve_index : curves_range) {
|
||||
|
@ -889,8 +898,8 @@ void CurvesGeometry::interpolate_to_evaluated(const GSpan src, GMutableSpan dst)
|
|||
types,
|
||||
cyclic,
|
||||
resolution,
|
||||
this->runtime->all_bezier_evaluated_offsets,
|
||||
this->runtime->nurbs_basis_cache,
|
||||
all_bezier_offsets,
|
||||
nurbs_basis_cache,
|
||||
nurbs_orders,
|
||||
nurbs_weights,
|
||||
src.slice(points),
|
||||
|
@ -901,12 +910,13 @@ void CurvesGeometry::interpolate_to_evaluated(const GSpan src, GMutableSpan dst)
|
|||
|
||||
void CurvesGeometry::ensure_evaluated_lengths() const
|
||||
{
|
||||
this->runtime->length_cache_mutex.ensure([&]() {
|
||||
const bke::CurvesGeometryRuntime &runtime = *this->runtime;
|
||||
runtime.evaluated_length_cache.ensure([&](Vector<float> &r_data) {
|
||||
/* Use an extra length value for the final cyclic segment for a consistent size
|
||||
* (see comment on #evaluated_length_cache). */
|
||||
const int total_num = this->evaluated_points_num() + this->curves_num();
|
||||
this->runtime->evaluated_length_cache.resize(total_num);
|
||||
MutableSpan<float> evaluated_lengths = this->runtime->evaluated_length_cache;
|
||||
r_data.resize(total_num);
|
||||
MutableSpan<float> evaluated_lengths = r_data;
|
||||
|
||||
const OffsetIndices<int> evaluated_points_by_curve = this->evaluated_points_by_curve();
|
||||
const Span<float3> evaluated_positions = this->evaluated_positions();
|
||||
|
@ -953,21 +963,21 @@ void CurvesGeometry::resize(const int points_num, const int curves_num)
|
|||
|
||||
void CurvesGeometry::tag_positions_changed()
|
||||
{
|
||||
this->runtime->position_cache_mutex.tag_dirty();
|
||||
this->runtime->tangent_cache_mutex.tag_dirty();
|
||||
this->runtime->normal_cache_mutex.tag_dirty();
|
||||
this->runtime->length_cache_mutex.tag_dirty();
|
||||
this->runtime->evaluated_position_cache.tag_dirty();
|
||||
this->runtime->evaluated_tangent_cache.tag_dirty();
|
||||
this->runtime->evaluated_normal_cache.tag_dirty();
|
||||
this->runtime->evaluated_length_cache.tag_dirty();
|
||||
this->runtime->bounds_cache.tag_dirty();
|
||||
}
|
||||
void CurvesGeometry::tag_topology_changed()
|
||||
{
|
||||
this->tag_positions_changed();
|
||||
this->runtime->offsets_cache_mutex.tag_dirty();
|
||||
this->runtime->nurbs_basis_cache_mutex.tag_dirty();
|
||||
this->runtime->evaluated_offsets_cache.tag_dirty();
|
||||
this->runtime->nurbs_basis_cache.tag_dirty();
|
||||
}
|
||||
void CurvesGeometry::tag_normals_changed()
|
||||
{
|
||||
this->runtime->normal_cache_mutex.tag_dirty();
|
||||
this->runtime->evaluated_normal_cache.tag_dirty();
|
||||
}
|
||||
void CurvesGeometry::tag_radii_changed()
|
||||
{
|
||||
|
|
|
@ -237,8 +237,8 @@ static void layerInterp_mdeformvert(const void **sources,
|
|||
const int count,
|
||||
void *dest)
|
||||
{
|
||||
/* a single linked list of MDeformWeight's
|
||||
* use this to avoid double allocs (which LinkNode would do) */
|
||||
/* A single linked list of #MDeformWeight's.
|
||||
* use this to avoid double allocations (which #LinkNode would do). */
|
||||
struct MDeformWeight_Link {
|
||||
struct MDeformWeight_Link *next;
|
||||
MDeformWeight dw;
|
||||
|
|
|
@ -721,7 +721,7 @@ static void bb_combineMaps(FluidObjectBB *output,
|
|||
{
|
||||
int i, x, y, z;
|
||||
|
||||
/* Copyfill input 1 struct and clear output for new allocation. */
|
||||
/* Copy-fill input 1 struct and clear output for new allocation. */
|
||||
FluidObjectBB bb1;
|
||||
memcpy(&bb1, output, sizeof(FluidObjectBB));
|
||||
memset(output, 0, sizeof(FluidObjectBB));
|
||||
|
@ -3514,7 +3514,7 @@ static int manta_step(
|
|||
|
||||
BLI_mutex_lock(&object_update_lock);
|
||||
|
||||
/* Loop as long as time_per_frame (sum of sub dt's) does not exceed actual framelength. */
|
||||
/* Loop as long as time_per_frame (sum of sub dt's) does not exceed actual frame-length. */
|
||||
while (time_per_frame + FLT_EPSILON < frame_length) {
|
||||
manta_adapt_timestep(fds->fluid);
|
||||
dt = manta_get_timestep(fds->fluid);
|
||||
|
@ -3557,7 +3557,7 @@ static int manta_step(
|
|||
fds->time_total = time_total;
|
||||
}
|
||||
|
||||
/* Total time must not exceed framecount times framelength. Correct tiny errors here. */
|
||||
/* Total time must not exceed frame-count times frame-length. Correct tiny errors here. */
|
||||
CLAMP_MAX(fds->time_total, time_total_old + fds->frame_length);
|
||||
|
||||
/* Compute shadow grid for gas simulations. Make sure to skip if bake job was canceled early. */
|
||||
|
@ -4627,7 +4627,7 @@ void BKE_fluid_fields_sanitize(FluidDomainSettings *settings)
|
|||
settings->coba_field = FLUID_DOMAIN_FIELD_DENSITY;
|
||||
}
|
||||
|
||||
/* Gas domains do not support vdb mini precision. */
|
||||
/* Gas domains do not support VDB mini precision. */
|
||||
if (data_depth == VDB_PRECISION_MINI_FLOAT) {
|
||||
settings->openvdb_data_depth = VDB_PRECISION_HALF_FLOAT;
|
||||
}
|
||||
|
|
|
@ -48,7 +48,7 @@ void GeometryComponentEditData::remember_deformed_curve_positions_if_necessary(
|
|||
if (curves_id == nullptr) {
|
||||
return;
|
||||
}
|
||||
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
|
||||
const bke::CurvesGeometry &curves = curves_id->geometry.wrap();
|
||||
const int points_num = curves.points_num();
|
||||
if (points_num != edit_component.curves_edit_hints_->curves_id_orig.geometry.point_num) {
|
||||
return;
|
||||
|
|
|
@ -55,7 +55,7 @@ GeometryFieldContext::GeometryFieldContext(const GeometryComponent &component,
|
|||
case GEO_COMPONENT_TYPE_CURVE: {
|
||||
const CurveComponent &curve_component = static_cast<const CurveComponent &>(component);
|
||||
const Curves *curves = curve_component.get_for_read();
|
||||
geometry_ = curves ? &CurvesGeometry::wrap(curves->geometry) : nullptr;
|
||||
geometry_ = curves ? &curves->geometry.wrap() : nullptr;
|
||||
break;
|
||||
}
|
||||
case GEO_COMPONENT_TYPE_POINT_CLOUD: {
|
||||
|
@ -560,8 +560,7 @@ std::optional<eAttrDomain> try_detect_field_domain(const GeometryComponent &comp
|
|||
}
|
||||
else if (const auto *curves_field_input = dynamic_cast<const CurvesFieldInput *>(
|
||||
&field_input)) {
|
||||
if (!handle_domain(
|
||||
curves_field_input->preferred_domain(CurvesGeometry::wrap(curves->geometry)))) {
|
||||
if (!handle_domain(curves_field_input->preferred_domain(curves->geometry.wrap()))) {
|
||||
return std::nullopt;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -227,7 +227,7 @@ bool GeometrySet::compute_boundbox_without_instances(float3 *r_min, float3 *r_ma
|
|||
have_minmax |= BKE_volume_min_max(volume, *r_min, *r_max);
|
||||
}
|
||||
if (const Curves *curves_id = this->get_curves_for_read()) {
|
||||
const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id->geometry);
|
||||
const bke::CurvesGeometry &curves = curves_id->geometry.wrap();
|
||||
have_minmax |= curves.bounds_min_max(*r_min, *r_max);
|
||||
}
|
||||
return have_minmax;
|
||||
|
|
|
@ -57,7 +57,7 @@ struct IDNameLib_Map {
|
|||
struct GSet *valid_id_pointers;
|
||||
int idmap_types;
|
||||
|
||||
/* For storage of keys for the TypeMap ghash, avoids many single allocs. */
|
||||
/* For storage of keys for the #TypeMap #GHash, avoids many single allocations. */
|
||||
BLI_mempool *type_maps_keys_pool;
|
||||
};
|
||||
|
||||
|
|
|
@ -798,8 +798,7 @@ static Mesh *mesh_new_from_evaluated_curve_type_object(const Object *evaluated_o
|
|||
}
|
||||
if (const Curves *curves = get_evaluated_curves_from_object(evaluated_object)) {
|
||||
const blender::bke::AnonymousAttributePropagationInfo propagation_info;
|
||||
return blender::bke::curve_to_wire_mesh(blender::bke::CurvesGeometry::wrap(curves->geometry),
|
||||
propagation_info);
|
||||
return blender::bke::curve_to_wire_mesh(curves->geometry.wrap(), propagation_info);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
|
|
@ -1170,17 +1170,17 @@ static int mesh_tessface_calc(Mesh &mesh,
|
|||
CustomData_add_layer(fdata, CD_ORIGINDEX, CD_ASSIGN, mface_to_poly_map, totface);
|
||||
add_mface_layers(mesh, fdata, ldata, totface);
|
||||
|
||||
/* NOTE: quad detection issue - fourth vertidx vs fourth loopidx:
|
||||
/* NOTE: quad detection issue - fourth vertex-index vs fourth loop-index:
|
||||
* Polygons take care of their loops ordering, hence not of their vertices ordering.
|
||||
* Currently, our tfaces' fourth vertex index might be 0 even for a quad.
|
||||
* However, we know our fourth loop index is never 0 for quads
|
||||
* (because they are sorted for polygons, and our quads are still mere copies of their polygons).
|
||||
* So we pass nullptr as MFace pointer, and #mesh_loops_to_tessdata
|
||||
* So we pass nullptr as #MFace pointer, and #mesh_loops_to_tessdata
|
||||
* will use the fourth loop index as quad test. */
|
||||
mesh_loops_to_tessdata(fdata, ldata, nullptr, mface_to_poly_map, lindices, totface);
|
||||
|
||||
/* NOTE: quad detection issue - fourth vertidx vs fourth loopidx:
|
||||
* ...However, most TFace code uses 'MFace->v4 == 0' test to check whether it is a tri or quad.
|
||||
/* NOTE: quad detection issue - fourth vert-index vs fourth loop-index:
|
||||
* ...However, most #TFace code uses `MFace->v4 == 0` test to check whether it is a tri or quad.
|
||||
* BKE_mesh_mface_index_validate() will check this and rotate the tessellated face if needed.
|
||||
*/
|
||||
#ifdef USE_TESSFACE_QUADS
|
||||
|
@ -1286,12 +1286,19 @@ void BKE_mesh_legacy_face_set_from_generic(Mesh *mesh,
|
|||
blender::MutableSpan<CustomDataLayer> poly_layers)
|
||||
{
|
||||
using namespace blender;
|
||||
void *faceset_data = nullptr;
|
||||
for (CustomDataLayer &layer : poly_layers) {
|
||||
if (StringRef(layer.name) == ".sculpt_face_set") {
|
||||
layer.type = CD_SCULPT_FACE_SETS;
|
||||
faceset_data = layer.data;
|
||||
layer.data = nullptr;
|
||||
CustomData_free_layer_named(&mesh->pdata, ".sculpt_face_set", mesh->totpoly);
|
||||
break;
|
||||
}
|
||||
}
|
||||
CustomData_update_typemap(&mesh->pdata);
|
||||
if (faceset_data != nullptr) {
|
||||
CustomData_add_layer(
|
||||
&mesh->pdata, CD_SCULPT_FACE_SETS, CD_ASSIGN, faceset_data, mesh->totpoly);
|
||||
}
|
||||
}
|
||||
|
||||
void BKE_mesh_legacy_face_set_to_generic(Mesh *mesh)
|
||||
|
@ -1300,13 +1307,19 @@ void BKE_mesh_legacy_face_set_to_generic(Mesh *mesh)
|
|||
if (mesh->attributes().contains(".sculpt_face_set")) {
|
||||
return;
|
||||
}
|
||||
for (CustomDataLayer &layer : MutableSpan(mesh->pdata.layers, mesh->pdata.totlayer)) {
|
||||
if (layer.type == CD_SCULPT_FACE_SETS) {
|
||||
BLI_strncpy(layer.name, ".sculpt_face_set", sizeof(layer.name));
|
||||
layer.type = CD_PROP_INT32;
|
||||
void *faceset_data = nullptr;
|
||||
for (const int i : IndexRange(mesh->pdata.totlayer)) {
|
||||
if (mesh->pdata.layers[i].type == CD_SCULPT_FACE_SETS) {
|
||||
faceset_data = mesh->pdata.layers[i].data;
|
||||
mesh->pdata.layers[i].data = nullptr;
|
||||
CustomData_free_layer(&mesh->pdata, CD_SCULPT_FACE_SETS, mesh->totpoly, i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
CustomData_update_typemap(&mesh->pdata);
|
||||
if (faceset_data != nullptr) {
|
||||
CustomData_add_layer_named(
|
||||
&mesh->pdata, CD_PROP_INT32, CD_ASSIGN, faceset_data, mesh->totpoly, ".sculpt_face_set");
|
||||
}
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
|
|
@ -30,7 +30,6 @@
|
|||
/** \name Mesh Connectivity Mapping
|
||||
* \{ */
|
||||
|
||||
/* ngon version wip, based on BM_uv_vert_map_create */
|
||||
UvVertMap *BKE_mesh_uv_vert_map_createconst(blender::OffsetIndices<int> polys,
|
||||
const bool *hide_poly,
|
||||
const bool *select_poly,
|
||||
|
@ -42,12 +41,13 @@ UvVertMap *BKE_mesh_uv_vert_map_createconst(blender::OffsetIndices<int> polys,
|
|||
const bool selected,
|
||||
const bool use_winding)
|
||||
{
|
||||
/* NOTE: N-gon version WIP, based on #BM_uv_vert_map_create. */
|
||||
|
||||
UvVertMap *vmap;
|
||||
UvMapVert *buf;
|
||||
uint a;
|
||||
int i, totuv, nverts;
|
||||
|
||||
bool *winding = nullptr;
|
||||
BLI_buffer_declare_static(vec2f, tf_uv_buf, BLI_BUFFER_NOP, 32);
|
||||
|
||||
totuv = 0;
|
||||
|
@ -66,15 +66,17 @@ UvVertMap *BKE_mesh_uv_vert_map_createconst(blender::OffsetIndices<int> polys,
|
|||
vmap = (UvVertMap *)MEM_callocN(sizeof(*vmap), "UvVertMap");
|
||||
buf = vmap->buf = (UvMapVert *)MEM_callocN(sizeof(*vmap->buf) * size_t(totuv), "UvMapVert");
|
||||
vmap->vert = (UvMapVert **)MEM_callocN(sizeof(*vmap->vert) * totvert, "UvMapVert*");
|
||||
if (use_winding) {
|
||||
winding = static_cast<bool *>(MEM_callocN(sizeof(*winding) * totpoly, "winding"));
|
||||
}
|
||||
|
||||
if (!vmap->vert || !vmap->buf) {
|
||||
BKE_mesh_uv_vert_map_free(vmap);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool *winding = nullptr;
|
||||
if (use_winding) {
|
||||
winding = static_cast<bool *>(MEM_callocN(sizeof(*winding) * totpoly, "winding"));
|
||||
}
|
||||
|
||||
for (a = 0; a < totpoly; a++) {
|
||||
if (!selected || (!(hide_poly && hide_poly[a]) && (select_poly && select_poly[a]))) {
|
||||
float(*tf_uv)[2] = nullptr;
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
|
||||
#include "DEG_depsgraph_query.h"
|
||||
|
||||
#include "multires_reshape.h"
|
||||
#include "multires_reshape.hh"
|
||||
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
|
||||
#include "DEG_depsgraph_query.h"
|
||||
|
||||
#include "multires_reshape.h"
|
||||
#include "multires_reshape.hh"
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/** \name Reshape from object
|
||||
|
|
|
@ -22,19 +22,19 @@ struct Object;
|
|||
struct Subdiv;
|
||||
struct SubdivCCG;
|
||||
|
||||
typedef struct MultiresReshapeContext {
|
||||
struct MultiresReshapeContext {
|
||||
/* NOTE: Only available when context is initialized from object. */
|
||||
struct Depsgraph *depsgraph;
|
||||
struct Object *object;
|
||||
Depsgraph *depsgraph;
|
||||
Object *object;
|
||||
|
||||
struct MultiresModifierData *mmd;
|
||||
MultiresModifierData *mmd;
|
||||
|
||||
/* Base mesh from original object.
|
||||
* NOTE: Does NOT include any leading modifiers in it. */
|
||||
struct Mesh *base_mesh;
|
||||
Mesh *base_mesh;
|
||||
const float (*base_positions)[3];
|
||||
const struct MEdge *base_edges;
|
||||
const struct MPoly *base_polys;
|
||||
const MEdge *base_edges;
|
||||
const MPoly *base_polys;
|
||||
const int *base_corner_verts;
|
||||
const int *base_corner_edges;
|
||||
|
||||
|
@ -42,7 +42,7 @@ typedef struct MultiresReshapeContext {
|
|||
*
|
||||
* The coarse mesh of this subdivision surface is a base mesh with all deformation modifiers
|
||||
* leading multires applied on it. */
|
||||
struct Subdiv *subdiv;
|
||||
Subdiv *subdiv;
|
||||
bool need_free_subdiv;
|
||||
|
||||
struct {
|
||||
|
@ -65,8 +65,8 @@ typedef struct MultiresReshapeContext {
|
|||
|
||||
struct {
|
||||
/* Copy of original displacement and painting masks. */
|
||||
struct MDisps *mdisps;
|
||||
struct GridPaintMask *grid_paint_masks;
|
||||
MDisps *mdisps;
|
||||
GridPaintMask *grid_paint_masks;
|
||||
} orig;
|
||||
|
||||
/* Number of grids which are required for base_mesh. */
|
||||
|
@ -74,8 +74,8 @@ typedef struct MultiresReshapeContext {
|
|||
|
||||
/* Destination displacement and mask.
|
||||
* Points to a custom data on a destination mesh. */
|
||||
struct MDisps *mdisps;
|
||||
struct GridPaintMask *grid_paint_masks;
|
||||
MDisps *mdisps;
|
||||
GridPaintMask *grid_paint_masks;
|
||||
|
||||
/* Indexed by face index, gives first grid index of the face. */
|
||||
int *face_start_grid_index;
|
||||
|
@ -102,38 +102,38 @@ typedef struct MultiresReshapeContext {
|
|||
const float *cd_vertex_crease;
|
||||
/* Edge crease custom data layer, null if none is present. */
|
||||
const float *cd_edge_crease;
|
||||
} MultiresReshapeContext;
|
||||
};
|
||||
|
||||
/**
|
||||
* Coordinate which identifies element of a grid.
|
||||
* This is directly related on how #CD_MDISPS stores displacement.
|
||||
*/
|
||||
typedef struct GridCoord {
|
||||
struct GridCoord {
|
||||
int grid_index;
|
||||
float u, v;
|
||||
} GridCoord;
|
||||
};
|
||||
|
||||
/**
|
||||
* Coordinate within ptex, which is what OpenSubdiv API operates on.
|
||||
*/
|
||||
typedef struct PTexCoord {
|
||||
struct PTexCoord {
|
||||
int ptex_face_index;
|
||||
float u, v;
|
||||
} PTexCoord;
|
||||
};
|
||||
|
||||
/**
|
||||
* Element of a grid data stored in the destination mesh.
|
||||
* This is where reshaped coordinates and mask values will be written to.
|
||||
*/
|
||||
typedef struct ReshapeGridElement {
|
||||
struct ReshapeGridElement {
|
||||
float *displacement;
|
||||
float *mask;
|
||||
} ReshapeGridElement;
|
||||
};
|
||||
|
||||
typedef struct ReshapeConstGridElement {
|
||||
struct ReshapeConstGridElement {
|
||||
float displacement[3];
|
||||
float mask;
|
||||
} ReshapeConstGridElement;
|
||||
};
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* Construct/destruct reshape context.
|
||||
|
@ -143,9 +143,9 @@ typedef struct ReshapeConstGridElement {
|
|||
* Create subdivision surface descriptor which is configured for surface evaluation at a given
|
||||
* multi-res modifier.
|
||||
*/
|
||||
struct Subdiv *multires_reshape_create_subdiv(struct Depsgraph *depsgraph,
|
||||
struct Object *object,
|
||||
const struct MultiresModifierData *mmd);
|
||||
Subdiv *multires_reshape_create_subdiv(Depsgraph *depsgraph,
|
||||
Object *object,
|
||||
const MultiresModifierData *mmd);
|
||||
|
||||
/**
|
||||
* \note Initialized base mesh to object's mesh, the Subdivision is created from the deformed
|
||||
|
@ -153,29 +153,29 @@ struct Subdiv *multires_reshape_create_subdiv(struct Depsgraph *depsgraph,
|
|||
* then Subdivision is created from base mesh (without any deformation applied).
|
||||
*/
|
||||
bool multires_reshape_context_create_from_object(MultiresReshapeContext *reshape_context,
|
||||
struct Depsgraph *depsgraph,
|
||||
struct Object *object,
|
||||
struct MultiresModifierData *mmd);
|
||||
Depsgraph *depsgraph,
|
||||
Object *object,
|
||||
MultiresModifierData *mmd);
|
||||
|
||||
bool multires_reshape_context_create_from_base_mesh(MultiresReshapeContext *reshape_context,
|
||||
struct Depsgraph *depsgraph,
|
||||
struct Object *object,
|
||||
struct MultiresModifierData *mmd);
|
||||
Depsgraph *depsgraph,
|
||||
Object *object,
|
||||
MultiresModifierData *mmd);
|
||||
|
||||
bool multires_reshape_context_create_from_ccg(MultiresReshapeContext *reshape_context,
|
||||
struct SubdivCCG *subdiv_ccg,
|
||||
struct Mesh *base_mesh,
|
||||
SubdivCCG *subdiv_ccg,
|
||||
Mesh *base_mesh,
|
||||
int top_level);
|
||||
|
||||
bool multires_reshape_context_create_from_modifier(MultiresReshapeContext *reshape_context,
|
||||
struct Object *object,
|
||||
struct MultiresModifierData *mmd,
|
||||
Object *object,
|
||||
MultiresModifierData *mmd,
|
||||
int top_level);
|
||||
|
||||
bool multires_reshape_context_create_from_subdiv(MultiresReshapeContext *reshape_context,
|
||||
struct Object *object,
|
||||
struct MultiresModifierData *mmd,
|
||||
struct Subdiv *subdiv,
|
||||
Object *object,
|
||||
MultiresModifierData *mmd,
|
||||
Subdiv *subdiv,
|
||||
int top_level);
|
||||
|
||||
void multires_reshape_free_original_grids(MultiresReshapeContext *reshape_context);
|
||||
|
@ -262,7 +262,7 @@ void multires_reshape_evaluate_limit_at_grid(const MultiresReshapeContext *resha
|
|||
/**
|
||||
* Make sure custom data is allocated for the given level.
|
||||
*/
|
||||
void multires_reshape_ensure_grids(struct Mesh *mesh, int level);
|
||||
void multires_reshape_ensure_grids(Mesh *mesh, int level);
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* Functions specific to reshaping from a set of vertices in a object position.
|
||||
|
@ -295,7 +295,7 @@ bool multires_reshape_assign_final_coords_from_vertcos(
|
|||
* \return truth if all coordinates have been updated.
|
||||
*/
|
||||
bool multires_reshape_assign_final_coords_from_ccg(const MultiresReshapeContext *reshape_context,
|
||||
struct SubdivCCG *subdiv_ccg);
|
||||
SubdivCCG *subdiv_ccg);
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* Functions specific to reshaping from MDISPS.
|
|
@ -5,7 +5,7 @@
|
|||
* \ingroup bke
|
||||
*/
|
||||
|
||||
#include "multires_reshape.h"
|
||||
#include "multires_reshape.hh"
|
||||
|
||||
#include "MEM_guardedalloc.h"
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* \ingroup bke
|
||||
*/
|
||||
|
||||
#include "multires_reshape.h"
|
||||
#include "multires_reshape.hh"
|
||||
|
||||
#include <cstring>
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* \ingroup bke
|
||||
*/
|
||||
|
||||
#include "multires_reshape.h"
|
||||
#include "multires_reshape.hh"
|
||||
|
||||
#include "MEM_guardedalloc.h"
|
||||
|
||||
|
@ -104,7 +104,7 @@ struct LinearGrids {
|
|||
LinearGridElement *elements_storage;
|
||||
};
|
||||
|
||||
/* Context which holds all information eeded during propagation and smoothing. */
|
||||
/* Context which holds all information needed during propagation and smoothing. */
|
||||
|
||||
struct MultiresReshapeSmoothContext {
|
||||
const MultiresReshapeContext *reshape_context;
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
|
||||
#include "DEG_depsgraph_query.h"
|
||||
|
||||
#include "multires_reshape.h"
|
||||
#include "multires_reshape.hh"
|
||||
|
||||
static void multires_subdivide_create_object_space_linear_grids(Mesh *mesh)
|
||||
{
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* \ingroup bke
|
||||
*/
|
||||
|
||||
#include "multires_reshape.h"
|
||||
#include "multires_reshape.hh"
|
||||
|
||||
#include "MEM_guardedalloc.h"
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* \ingroup bke
|
||||
*/
|
||||
|
||||
#include "multires_reshape.h"
|
||||
#include "multires_reshape.hh"
|
||||
|
||||
#include "DNA_mesh_types.h"
|
||||
#include "DNA_meshdata_types.h"
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
|
||||
#include "DEG_depsgraph_query.h"
|
||||
|
||||
#include "multires_reshape.h"
|
||||
#include "multires_reshape.hh"
|
||||
#include "multires_unsubdivide.h"
|
||||
|
||||
/* This is done in the following steps:
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
#include "BKE_subdiv.h"
|
||||
#include "BKE_subdiv_eval.h"
|
||||
|
||||
#include "multires_reshape.h"
|
||||
#include "multires_reshape.hh"
|
||||
#include "opensubdiv_converter_capi.h"
|
||||
#include "subdiv_converter.h"
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue