Compare commits
562 Commits
temp-paral
...
temp_bmesh
Author | SHA1 | Date | |
---|---|---|---|
f0c35d16f3 | |||
d3bba94bf2 | |||
6cf734a2e5 | |||
6b0aa7ae15 | |||
9566e3bc9c | |||
8ee7f62a63 | |||
365443412c | |||
![]() |
9a41b44197 | ||
e1d7ce005f | |||
1cd20b0026 | |||
9dee0a10c8 | |||
06ac655b8d | |||
04c3690299 | |||
6dca61b91c | |||
8bc27c508a | |||
f8b51f702c | |||
180bafe225 | |||
da2ba40268 | |||
633c29fb7b | |||
8e21d528ca | |||
4fa0bbb5ac | |||
a1c65748c4 | |||
8e2e44b58b | |||
627edd1efa | |||
7a9cfd08a8 | |||
445889676b | |||
db7fca3588 | |||
f81bacd6f0 | |||
ddb7cb7e4a | |||
31a0708cb1 | |||
58043c0637 | |||
c9daab7936 | |||
73ed076489 | |||
867e6ffe88 | |||
f2cfad77f9 | |||
9fee59a484 | |||
c938d9a0e5 | |||
08aa0eb15d | |||
e97653ccf3 | |||
3deb56424f | |||
e04a10adab | |||
27b6636c45 | |||
4ec2bdbbda | |||
1d5cc52ef6 | |||
1fce66190a | |||
236a9f0814 | |||
4f38624bf5 | |||
95c2f0bea8 | |||
bfe8f29baf | |||
860a55d8fc | |||
0e329a967e | |||
0530b67909 | |||
289f68588a | |||
350e783668 | |||
28bd74c186 | |||
8c5d9fa929 | |||
525def99bc | |||
acb8909021 | |||
![]() |
231948f33f | ||
a866a32ff2 | |||
4a009b54bc | |||
51f7d24a4e | |||
b6d890672c | |||
![]() |
a6adb7ecae | ||
09f14b38f2 | |||
5841f8656d | |||
e456a9de57 | |||
46fff97604 | |||
5c6cc931b2 | |||
1bd28a5e0c | |||
c420399f4d | |||
429136c89f | |||
0b2aee5841 | |||
ecdd6a302e | |||
e6ca054590 | |||
173f5f94ff | |||
fb27a9bb98 | |||
785e7ddf10 | |||
8cbe55c9e9 | |||
a2c5c2b406 | |||
c1cf66bff3 | |||
202dc3631e | |||
94dd30208e | |||
56f8d7c705 | |||
e1714ce8c9 | |||
97de4f07a3 | |||
e6fa74ffed | |||
![]() |
7c7348f78d | ||
0ed089cebd | |||
3be5ce4aad | |||
cddb792021 | |||
2d13c823ee | |||
edaeec3e72 | |||
dee0b56b92 | |||
426e2663a0 | |||
fd60f6713a | |||
90a48fa064 | |||
1c1be5bdf4 | |||
30845b5c8e | |||
0eeaeb3fc2 | |||
917a972b56 | |||
3df335d330 | |||
9b0b78d58f | |||
3ff60bcad8 | |||
9fe6854a93 | |||
![]() |
4f73d43adc | ||
a78410386b | |||
1bcdd1c54e | |||
503d79cd77 | |||
![]() |
6f52ebba19 | ||
c9c890f196 | |||
4b06420e65 | |||
603ae580ce | |||
b777df8080 | |||
410dc76177 | |||
f6ebbfe7de | |||
9d6e960e2c | |||
0676928408 | |||
25550c210a | |||
eaa35b27e0 | |||
9b2b32a333 | |||
9d336576b5 | |||
e68667a835 | |||
![]() |
e0394761b9 | ||
b5a1c194c5 | |||
2aa7edbe6b | |||
86972d294f | |||
15405685d9 | |||
b9febb54a4 | |||
c946fdb2e5 | |||
863460e5a5 | |||
cbe05edde5 | |||
4e78b89e48 | |||
166c8be7ac | |||
aeeffb935e | |||
6ae8de4742 | |||
d475f99460 | |||
cb83313863 | |||
![]() |
eab26f1334 | ||
8745bb9628 | |||
6a00e7a428 | |||
5e0684b07d | |||
![]() |
28f773925a | ||
6b7b4f8e57 | |||
e2f99c338b | |||
![]() |
128eb6cbe9 | ||
42215d7cb8 | |||
eb96f0cf06 | |||
0467ff4053 | |||
ca39aff59d | |||
7a5216497c | |||
![]() |
7f1fe10595 | ||
a1167e910a | |||
![]() |
60cfdf0809 | ||
a00507c482 | |||
fe4286435c | |||
93d2940603 | |||
284c9430f9 | |||
![]() |
db6b3801b3 | ||
82ab2c1678 | |||
ee3b4e8420 | |||
c9347b9a7f | |||
f52a03dd71 | |||
f13eb69269 | |||
efcf46fb6d | |||
84d03a1298 | |||
45c44a5b5b | |||
ed4ef77f49 | |||
b4fd8750f9 | |||
62ec88eb84 | |||
3eb6569b38 | |||
![]() |
07c6af4136 | ||
fc46035117 | |||
da50cd86a7 | |||
a52f89a446 | |||
9f3bafc4ab | |||
bb1096f475 | |||
3e6edf5278 | |||
37bce7b701 | |||
6febbd7a55 | |||
416c7a32d8 | |||
d4badd4b22 | |||
4e43e09cca | |||
21b6d78cd2 | |||
2b20931707 | |||
416686707f | |||
8bfbbc467a | |||
baa24243a5 | |||
73529fb1bb | |||
381ef09073 | |||
56ba339cd8 | |||
055fa3fa5e | |||
7d5c3beb06 | |||
39b0e9df81 | |||
b21595cdf9 | |||
e4b36fb6bc | |||
966e4ba9ae | |||
268682527f | |||
cdb52aee9f | |||
8b02ab86f1 | |||
019700583b | |||
31d2b04411 | |||
3508c699fb | |||
8ea7c93a37 | |||
12f87d02c6 | |||
9680edf77c | |||
a00bfa8976 | |||
bde54e127e | |||
9b8c82e2ed | |||
5866a4680d | |||
d795144f54 | |||
de6258c618 | |||
d912ceeb40 | |||
9a197a1185 | |||
36785c83f0 | |||
8eb7a04150 | |||
97c3e5944c | |||
6f523ffacb | |||
04562794df | |||
93004c7b19 | |||
0d542db1e1 | |||
de1f2c41fa | |||
106f542ac4 | |||
83f94ebb6f | |||
954aa88ba4 | |||
9503751c83 | |||
dcaba4c5e3 | |||
fb463a13cd | |||
b5100e73c8 | |||
ab632243e6 | |||
8510c77b9c | |||
40aa321dc7 | |||
a80c381ec5 | |||
1e9a7383ef | |||
dc738de90c | |||
8ed4c5fc61 | |||
76bd253be7 | |||
b243eb2646 | |||
af71984942 | |||
ec4b9dff19 | |||
70a4956020 | |||
7cd74015f8 | |||
7bd521a5c4 | |||
7dda5ac5ba | |||
1694e2aca4 | |||
2fddbebf93 | |||
4247a56cde | |||
e3b58b6451 | |||
5b10d08db3 | |||
7c4eb4f8db | |||
792292e3de | |||
4ca249018d | |||
d529e13d65 | |||
4e797dbc69 | |||
1b9a835893 | |||
320a1b6f35 | |||
f07f56aa37 | |||
4e91e72d53 | |||
58b4688c34 | |||
2f862bc7b9 | |||
4674795591 | |||
be9017c349 | |||
4c2f5b80b7 | |||
0502b0103f | |||
e8b717ee42 | |||
4b4ac93acd | |||
57286eed8d | |||
d0759840a0 | |||
5b19b2cb56 | |||
dcb00bf529 | |||
d66d5b431e | |||
43a0fe378f | |||
fb6636c812 | |||
adc8980dec | |||
48c41b189a | |||
7562ad5777 | |||
27986e9b56 | |||
dba4f30328 | |||
83c491f044 | |||
7ef7843ada | |||
5a7b9adef1 | |||
d293de425f | |||
17d4c7abb1 | |||
ca4ac36c59 | |||
00fd823bcd | |||
8ca52a7757 | |||
4adc0a7798 | |||
552e44bd25 | |||
1f19a86150 | |||
3ca3098ed7 | |||
995702da48 | |||
33066542ca | |||
5a26ea0961 | |||
1e3e79fe7b | |||
d4292bbd28 | |||
a97c5d7daa | |||
6b009b8890 | |||
3d16099a77 | |||
4352980b0f | |||
3d6ac0bd7b | |||
71959181ad | |||
daa4a33383 | |||
d3695eb12c | |||
c1f236dcd4 | |||
a90533e9b8 | |||
9bea7259e1 | |||
7fca310f25 | |||
27f4f761e7 | |||
17fafe2f63 | |||
89d56ea225 | |||
cfd6d48aab | |||
6be2c079c1 | |||
32ceaa7919 | |||
ec4786d00b | |||
582c30d32f | |||
b047b333b0 | |||
f2c9706781 | |||
fa06238aa7 | |||
b8a8e4f9b1 | |||
dbe767f5d9 | |||
7cf3b1f472 | |||
6c3b29a14c | |||
febfaecd97 | |||
2d98802905 | |||
f70a8c1581 | |||
8eeacca9cb | |||
82847af9f9 | |||
ee19a80041 | |||
013eee7ec6 | |||
83a855a8a1 | |||
9e46eebcf1 | |||
786781304c | |||
3028d53865 | |||
02b4df9827 | |||
815d77192f | |||
9fab16f0f3 | |||
82f5e0200c | |||
032a35fb50 | |||
8a700673db | |||
0386350de6 | |||
97fc606c65 | |||
14be52f0fc | |||
73c590e1eb | |||
fdc6fb2c53 | |||
237ac342c9 | |||
465e804193 | |||
4ab8614cd1 | |||
dabff9af7d | |||
384a0930d1 | |||
a5fa9ec310 | |||
ed15d0c1b9 | |||
e07a95b86d | |||
b52e04f794 | |||
e74c298cf9 | |||
cd485a7c6f | |||
06341c19c4 | |||
a527bd5f48 | |||
7f14d519c0 | |||
64337d087d | |||
e1fae3cbee | |||
7dbb4c9b2d | |||
fe67ca56d6 | |||
881df30a46 | |||
6f91eaad39 | |||
55045ed85a | |||
2582090824 | |||
55415cd62a | |||
8aac19cab5 | |||
b4536d274c | |||
f5588dfb70 | |||
4b308888d8 | |||
fdfa2045ec | |||
33af94dc46 | |||
8ea624aeaf | |||
e29cd298fe | |||
7bba304c57 | |||
0dc09668ce | |||
cfa6753518 | |||
2cf8c35578 | |||
aa116ba5ba | |||
7be027075f | |||
215c346017 | |||
7c9235d0e0 | |||
e254cc23b2 | |||
dee286fc7e | |||
ab9b89ac5d | |||
924b13b03a | |||
75a1116b51 | |||
f6cda6bf88 | |||
cb0f159155 | |||
8a98189bfb | |||
1f2b48eb45 | |||
148b39caec | |||
e9f9217f75 | |||
dd45a4bc6e | |||
1ccd92d0bb | |||
1a17c578a8 | |||
56e1ae1afa | |||
35092510ba | |||
5385455e6a | |||
2c54c641a3 | |||
b3fff9b07a | |||
681e2b6134 | |||
49bd2228cb | |||
0a140ec66e | |||
f30225725d | |||
a1ac104f02 | |||
d823f6e2cf | |||
3042f6e608 | |||
6115091103 | |||
78ef2d0d84 | |||
9d92a97562 | |||
192670e8ce | |||
7ae1cc23fc | |||
ebb6648bda | |||
384f2956e5 | |||
2ba90cf717 | |||
e5af8597e5 | |||
1f6a7785f6 | |||
0ee053fb12 | |||
8cd4776764 | |||
f32bde6bd9 | |||
![]() |
8b808cefae | ||
f8466b6284 | |||
4a2d7a2f89 | |||
67defe866b | |||
b6575fed92 | |||
d6735bfae0 | |||
e4c45d0c5e | |||
c4668b750c | |||
81a85233a7 | |||
89f62e5dc3 | |||
408e13783d | |||
3900734063 | |||
fa688ac593 | |||
787f952ef4 | |||
63241d25b9 | |||
![]() |
98166b5c98 | ||
229849af0f | |||
0a1fc855bc | |||
46ccaff9a3 | |||
9c8b0a20c1 | |||
a42cf75ecb | |||
d77e884bd7 | |||
e2111233f0 | |||
e4efd04063 | |||
8edd20274e | |||
9be60839cd | |||
af934d751d | |||
5ac07c31f0 | |||
f3a7d9375d | |||
a033a0eaaf | |||
c137b53569 | |||
f0a9986ccf | |||
f639ffe795 | |||
326381bfe1 | |||
174e3c6b65 | |||
5c899dcc92 | |||
24ee80f077 | |||
22b69af796 | |||
0758c006ec | |||
c2a329ec07 | |||
bdaee543f3 | |||
44d358c384 | |||
f87123a6eb | |||
f2fc2cd521 | |||
af92a39e37 | |||
49cbb23855 | |||
9cb84de509 | |||
53f6991de8 | |||
5b696c2bd8 | |||
b95a5c2e68 | |||
080e78d205 | |||
a55a69f81a | |||
596fea8afd | |||
47e4adde5a | |||
a349943cd7 | |||
360faf5c3c | |||
9cf97857d1 | |||
44bdf515ba | |||
45ccdebad3 | |||
d242d33571 | |||
731eaa68d3 | |||
344963bf23 | |||
aaca5731fb | |||
aa7147f665 | |||
0fb50afdc5 | |||
f3cc74d216 | |||
0946a8da3b | |||
a8e5e63f45 | |||
e52f8ac7ce | |||
71a088582a | |||
3aab8dd731 | |||
56d57b2e9d | |||
b16eb9d7ad | |||
3fcd3d41c4 | |||
0b0bfa0628 | |||
ff9ce5fd98 | |||
2d99e118b4 | |||
a93add61b0 | |||
7f28a99dd5 | |||
9aaf9857a0 | |||
e2595de761 | |||
40c4942901 | |||
2e188dc504 | |||
![]() |
dfce29b809 | ||
decf7adcf6 | |||
81531d5e76 | |||
15bc0b7d5d | |||
17dec471c5 | |||
81f05aca29 | |||
d1270925a5 | |||
9e09ae7aff | |||
![]() |
c51a5e1066 | ||
758452ffba | |||
c7cd82c356 | |||
cc554eea75 | |||
0d770432d6 | |||
b2cb9d4b1b | |||
08e19c6bc0 | |||
b928f58849 | |||
228c1e5345 | |||
488af21ae0 | |||
b54d7bfad8 | |||
2babf80ae6 | |||
022dcb8e6c | |||
6d66e81667 | |||
91a5e1aef8 | |||
6d704d57ad | |||
a1b1c840a0 | |||
901654dcbf | |||
37a657a45f | |||
e07bb3955e | |||
7834b59598 | |||
0c8d40d2de | |||
1014b6f455 | |||
093e29f3c2 | |||
0f0d1f8e2a | |||
43ccbe353f | |||
2d861122e1 | |||
66f8852e30 | |||
54ddb01299 | |||
3d47323162 | |||
5c77439264 | |||
e2c92c1341 | |||
faf8402c19 | |||
4c0bcc3d13 | |||
4fc4a7e1f4 | |||
f9859a3b2a | |||
6da9fa1bf2 | |||
5c6407c268 | |||
3214b1114f | |||
bfbe9a0d55 | |||
f482afadab | |||
661dcd813c | |||
5541de9a3a | |||
3791afa29c | |||
3ae8229843 | |||
f61d4b2e3a | |||
49f57d8de8 | |||
64c7bad391 | |||
4659855b0f |
@@ -263,6 +263,7 @@ ForEachMacros:
|
||||
- SET_SLOT_PROBING_BEGIN
|
||||
- MAP_SLOT_PROBING_BEGIN
|
||||
- VECTOR_SET_SLOT_PROBING_BEGIN
|
||||
- TGSET_ITER
|
||||
|
||||
StatementMacros:
|
||||
- PyObject_HEAD
|
||||
|
@@ -578,6 +578,12 @@ if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\LLVM\\LLVM;]/lib/clang/7.0.0/lib/windows
|
||||
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\LLVM\\LLVM;]/lib/clang/6.0.0/lib/windows
|
||||
)
|
||||
find_library(
|
||||
COMPILER_ASAN_LIBRARY_THUNK NAMES clang_rt.asan_dll_thunk-x86_64
|
||||
PATHS
|
||||
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\LLVM\\LLVM;]/lib/clang/7.0.0/lib/windows
|
||||
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\LLVM\\LLVM;]/lib/clang/6.0.0/lib/windows
|
||||
)
|
||||
elseif(APPLE)
|
||||
execute_process(COMMAND ${CMAKE_CXX_COMPILER}
|
||||
-print-file-name=lib
|
||||
@@ -598,6 +604,7 @@ if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||
)
|
||||
endif()
|
||||
|
||||
mark_as_advanced(COMPILER_ASAN_LIBRARY_THUNK)
|
||||
mark_as_advanced(COMPILER_ASAN_LIBRARY)
|
||||
endif()
|
||||
endif()
|
||||
@@ -918,9 +925,9 @@ if(NOT CMAKE_BUILD_TYPE MATCHES "Release")
|
||||
unset(_list_COMPILER_ASAN_CFLAGS)
|
||||
unset(_is_CONFIG_DEBUG)
|
||||
elseif(COMPILER_ASAN_LIBRARY)
|
||||
set(PLATFORM_LINKLIBS "${PLATFORM_LINKLIBS};${COMPILER_ASAN_LIBRARY}")
|
||||
set(PLATFORM_LINKFLAGS "${COMPILER_ASAN_LIBRARY} ${COMPILER_ASAN_LINKER_FLAGS}")
|
||||
set(PLATFORM_LINKFLAGS_DEBUG "${COMPILER_ASAN_LIBRARY} ${COMPILER_ASAN_LINKER_FLAGS}")
|
||||
set(PLATFORM_LINKLIBS "${PLATFORM_LINKLIBS};\"${COMPILER_ASAN_LIBRARY}\" \"${COMPILER_ASAN_LIBRARY_THUNK}\"")
|
||||
set(PLATFORM_LINKFLAGS "\"${COMPILER_ASAN_LIBRARY}\" \"${COMPILER_ASAN_LIBRARY_THUNK}\" ${COMPILER_ASAN_LINKER_FLAGS}")
|
||||
set(PLATFORM_LINKFLAGS_DEBUG "\"${COMPILER_ASAN_LIBRARY}\" \"${COMPILER_ASAN_LIBRARY_THUNK}\" ${COMPILER_ASAN_LINKER_FLAGS}")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
@@ -259,7 +259,7 @@ if(NOT DEFINED LIBDIR)
|
||||
else()
|
||||
message(FATAL_ERROR "32 bit compiler detected, blender no longer provides pre-build libraries for 32 bit windows, please set the LIBDIR cmake variable to your own library folder")
|
||||
endif()
|
||||
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.29.30130)
|
||||
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.30.30423)
|
||||
message(STATUS "Visual Studio 2022 detected.")
|
||||
set(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/${LIBDIR_BASE}_vc15)
|
||||
elseif(MSVC_VERSION GREATER 1919)
|
||||
|
@@ -222,6 +222,10 @@ if __name__ == "__main__":
|
||||
|
||||
# Test if we are building a specific release version.
|
||||
branch = make_utils.git_branch(args.git_command)
|
||||
if branch == 'HEAD':
|
||||
sys.stderr.write('Blender git repository is in detached HEAD state, must be in a branch\n')
|
||||
sys.exit(1)
|
||||
|
||||
tag = make_utils.git_tag(args.git_command)
|
||||
release_version = make_utils.git_branch_release_version(branch, tag)
|
||||
|
||||
|
@@ -70,7 +70,7 @@ def git_branch_release_version(branch, tag):
|
||||
return release_version
|
||||
|
||||
|
||||
def svn_libraries_base_url(release_version, branch):
|
||||
def svn_libraries_base_url(release_version, branch=None):
|
||||
if release_version:
|
||||
svn_branch = "tags/blender-" + release_version + "-release"
|
||||
elif branch:
|
||||
|
@@ -10,4 +10,4 @@ requests==2.26.0
|
||||
|
||||
# Only needed to match the theme used for the official documentation.
|
||||
# Without this theme, the default theme will be used.
|
||||
sphinx_rtd_theme==1.0.0rc1
|
||||
sphinx_rtd_theme==1.0.0
|
||||
|
2
extern/Eigen3/Eigen/src/Core/util/Macros.h
vendored
2
extern/Eigen3/Eigen/src/Core/util/Macros.h
vendored
@@ -389,7 +389,7 @@
|
||||
|
||||
// Does the compiler support result_of?
|
||||
#ifndef EIGEN_HAS_STD_RESULT_OF
|
||||
#if EIGEN_MAX_CPP_VER>=11 && ((__has_feature(cxx_lambdas) || (defined(__cplusplus) && __cplusplus >= 201103L)))
|
||||
#if __cplusplus < 201703L && EIGEN_MAX_CPP_VER>=11 && ((__has_feature(cxx_lambdas) || (defined(__cplusplus) && __cplusplus >= 201103L && __cplusplus)))
|
||||
#define EIGEN_HAS_STD_RESULT_OF 1
|
||||
#else
|
||||
#define EIGEN_HAS_STD_RESULT_OF 0
|
||||
|
2
extern/audaspace/bindings/C/AUD_Device.cpp
vendored
2
extern/audaspace/bindings/C/AUD_Device.cpp
vendored
@@ -221,7 +221,7 @@ AUD_API void AUD_Device_setListenerVelocity(AUD_Device* device, const float valu
|
||||
AUD_API double AUD_Device_getRate(AUD_Device* device)
|
||||
{
|
||||
auto dev = device ? *device : DeviceManager::getDevice();
|
||||
return dev->getSpecs().rate;
|
||||
return dev ? dev->getSpecs().rate : 0.0;
|
||||
}
|
||||
|
||||
AUD_API float AUD_Device_getSpeedOfSound(AUD_Device* device)
|
||||
|
8
extern/audaspace/include/util/ThreadPool.h
vendored
8
extern/audaspace/include/util/ThreadPool.h
vendored
@@ -87,11 +87,17 @@ public:
|
||||
* \param args The arguments of the task.
|
||||
* \return A future of the same type as the return type of the task.
|
||||
*/
|
||||
#if __cplusplus > 201703L
|
||||
template<class T, class... Args>
|
||||
std::future<typename std::invoke_result<T, Args...>::type> enqueue(T&& t, Args&&... args)
|
||||
{
|
||||
using pkgdTask = std::packaged_task<typename std::invoke_result<T, Args...>::type()>;
|
||||
#else
|
||||
template<class T, class... Args>
|
||||
std::future<typename std::result_of<T(Args...)>::type> enqueue(T&& t, Args&&... args)
|
||||
{
|
||||
using pkgdTask = std::packaged_task<typename std::result_of<T(Args...)>::type()>;
|
||||
|
||||
#endif
|
||||
std::shared_ptr<pkgdTask> task = std::make_shared<pkgdTask>(std::bind(std::forward<T>(t), std::forward<Args>(args)...));
|
||||
auto result = task->get_future();
|
||||
|
||||
|
@@ -67,7 +67,7 @@ SET(LEMON_ENABLE_ILOG YES CACHE STRING "Enable ILOG (CPLEX) solver backend.")
|
||||
SET(LEMON_ENABLE_COIN YES CACHE STRING "Enable COIN solver backend.")
|
||||
SET(LEMON_ENABLE_SOPLEX YES CACHE STRING "Enable SoPlex solver backend.")
|
||||
|
||||
IF(LEMON_ENABLE_GLPK)
|
||||
IF(LEMON_ENABLE_GLPK)
|
||||
FIND_PACKAGE(GLPK 4.33)
|
||||
ENDIF(LEMON_ENABLE_GLPK)
|
||||
IF(LEMON_ENABLE_ILOG)
|
||||
|
@@ -4,7 +4,7 @@ FIND_PATH(ILOG_ROOT_DIR
|
||||
PATHS /opt/ibm/ILOG /usr/local/ibm/ILOG /usr/local/ILOG /usr/local/ilog
|
||||
PATHS "$ENV{HOME}/ILOG" "$ENV{HOME}/.local/ILOG"
|
||||
PATHS "$ENV{HOME}/ibm/ILOG" "$ENV{HOME}/.local/ibm/ILOG"
|
||||
PATHS "C:/Program Files/IBM/ILOG"
|
||||
PATHS "C:/Program Files/IBM/ILOG"
|
||||
PATH_SUFFIXES "CPLEX_Studio126" "CPLEX_Studio125"
|
||||
"CPLEX_Studio124" "CPLEX_Studio123" "CPLEX_Studio122"
|
||||
NO_DEFAULT_PATH
|
||||
|
@@ -16,3 +16,4 @@ LINK_DIRECTORIES(
|
||||
|
||||
# ADD_EXECUTABLE(myprog myprog-main.cc)
|
||||
# TARGET_LINK_LIBRARIES(myprog lemon)
|
||||
|
||||
|
@@ -88,3 +88,4 @@ INSTALL(
|
||||
FILES ${CMAKE_CURRENT_BINARY_DIR}/lemon.pc
|
||||
DESTINATION lib/pkgconfig
|
||||
)
|
||||
|
||||
|
3
extern/quadriflow/src/loader.cpp
vendored
3
extern/quadriflow/src/loader.cpp
vendored
@@ -10,6 +10,7 @@
|
||||
|
||||
#include <fstream>
|
||||
#include <unordered_map>
|
||||
#include <functional>
|
||||
|
||||
namespace qflow {
|
||||
|
||||
@@ -69,7 +70,7 @@ void load(const char* filename, MatrixXd& V, MatrixXi& F)
|
||||
};
|
||||
|
||||
/// Hash function for obj_vertex
|
||||
struct obj_vertexHash {
|
||||
struct obj_vertexHash : std::function<size_t(obj_vertex)> {
|
||||
std::size_t operator()(const obj_vertex &v) const {
|
||||
size_t hash = std::hash<uint32_t>()(v.p);
|
||||
hash = hash * 37 + std::hash<uint32_t>()(v.uv);
|
||||
|
@@ -49,27 +49,27 @@
|
||||
/* Unsigned */
|
||||
ATOMIC_INLINE uint64_t atomic_add_and_fetch_uint64(uint64_t *p, uint64_t x)
|
||||
{
|
||||
return InterlockedExchangeAdd64((int64_t *)p, (int64_t)x) + x;
|
||||
return (uint64_t)(InterlockedExchangeAdd64((int64_t *)p, (int64_t)x) + (int64_t)x);
|
||||
}
|
||||
|
||||
ATOMIC_INLINE uint64_t atomic_sub_and_fetch_uint64(uint64_t *p, uint64_t x)
|
||||
{
|
||||
return InterlockedExchangeAdd64((int64_t *)p, -((int64_t)x)) - x;
|
||||
return (uint64_t)(InterlockedExchangeAdd64((int64_t *)p, -((int64_t)x)) - (int64_t)x);
|
||||
}
|
||||
|
||||
ATOMIC_INLINE uint64_t atomic_cas_uint64(uint64_t *v, uint64_t old, uint64_t _new)
|
||||
{
|
||||
return InterlockedCompareExchange64((int64_t *)v, _new, old);
|
||||
return (uint64_t)(InterlockedCompareExchange64((int64_t *)v, _new, old));
|
||||
}
|
||||
|
||||
ATOMIC_INLINE uint64_t atomic_fetch_and_add_uint64(uint64_t *p, uint64_t x)
|
||||
{
|
||||
return InterlockedExchangeAdd64((int64_t *)p, (int64_t)x);
|
||||
return (uint64_t)InterlockedExchangeAdd64((int64_t *)p, (int64_t)x);
|
||||
}
|
||||
|
||||
ATOMIC_INLINE uint64_t atomic_fetch_and_sub_uint64(uint64_t *p, uint64_t x)
|
||||
{
|
||||
return InterlockedExchangeAdd64((int64_t *)p, -((int64_t)x));
|
||||
return (uint64_t)InterlockedExchangeAdd64((int64_t *)p, -((int64_t)x));
|
||||
}
|
||||
|
||||
/* Signed */
|
||||
@@ -103,32 +103,32 @@ ATOMIC_INLINE int64_t atomic_fetch_and_sub_int64(int64_t *p, int64_t x)
|
||||
/* Unsigned */
|
||||
ATOMIC_INLINE uint32_t atomic_add_and_fetch_uint32(uint32_t *p, uint32_t x)
|
||||
{
|
||||
return InterlockedExchangeAdd(p, x) + x;
|
||||
return (uint32_t)InterlockedExchangeAdd(p, x) + x;
|
||||
}
|
||||
|
||||
ATOMIC_INLINE uint32_t atomic_sub_and_fetch_uint32(uint32_t *p, uint32_t x)
|
||||
{
|
||||
return InterlockedExchangeAdd(p, -((int32_t)x)) - x;
|
||||
return (uint32_t)InterlockedExchangeAdd(p, -((int32_t)x)) - x;
|
||||
}
|
||||
|
||||
ATOMIC_INLINE uint32_t atomic_cas_uint32(uint32_t *v, uint32_t old, uint32_t _new)
|
||||
{
|
||||
return InterlockedCompareExchange((long *)v, _new, old);
|
||||
return (uint32_t)InterlockedCompareExchange((long *)v, _new, old);
|
||||
}
|
||||
|
||||
ATOMIC_INLINE uint32_t atomic_fetch_and_add_uint32(uint32_t *p, uint32_t x)
|
||||
{
|
||||
return InterlockedExchangeAdd(p, x);
|
||||
return (uint32_t)InterlockedExchangeAdd(p, x);
|
||||
}
|
||||
|
||||
ATOMIC_INLINE uint32_t atomic_fetch_and_or_uint32(uint32_t *p, uint32_t x)
|
||||
{
|
||||
return InterlockedOr((long *)p, x);
|
||||
return (uint32_t)InterlockedOr((long *)p, x);
|
||||
}
|
||||
|
||||
ATOMIC_INLINE uint32_t atomic_fetch_and_and_uint32(uint32_t *p, uint32_t x)
|
||||
{
|
||||
return InterlockedAnd((long *)p, x);
|
||||
return (uint32_t)InterlockedAnd((long *)p, x);
|
||||
}
|
||||
|
||||
/* Signed */
|
||||
@@ -205,9 +205,9 @@ ATOMIC_INLINE uint8_t atomic_fetch_and_or_uint8(uint8_t *p, uint8_t b)
|
||||
ATOMIC_INLINE int8_t atomic_fetch_and_and_int8(int8_t *p, int8_t b)
|
||||
{
|
||||
#if (LG_SIZEOF_PTR == 8 || LG_SIZEOF_INT == 8)
|
||||
return InterlockedAnd8((char *)p, (char)b);
|
||||
return (int8_t)InterlockedAnd8((char *)p, (char)b);
|
||||
#else
|
||||
return _InterlockedAnd8((char *)p, (char)b);
|
||||
return (int8_t)_InterlockedAnd8((char *)p, (char)b);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -215,9 +215,9 @@ ATOMIC_INLINE int8_t atomic_fetch_and_and_int8(int8_t *p, int8_t b)
|
||||
ATOMIC_INLINE int8_t atomic_fetch_and_or_int8(int8_t *p, int8_t b)
|
||||
{
|
||||
#if (LG_SIZEOF_PTR == 8 || LG_SIZEOF_INT == 8)
|
||||
return InterlockedOr8((char *)p, (char)b);
|
||||
return (int8_t)InterlockedOr8((char *)p, (char)b);
|
||||
#else
|
||||
return _InterlockedOr8((char *)p, (char)b);
|
||||
return (int8_t)_InterlockedOr8((char *)p, (char)b);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@@ -189,8 +189,10 @@ void BlenderSync::sync_geometry_motion(BL::Depsgraph &b_depsgraph,
|
||||
/* Ensure we only sync instanced geometry once. */
|
||||
Geometry *geom = object->get_geometry();
|
||||
|
||||
if (geometry_motion_synced.find(geom) != geometry_motion_synced.end())
|
||||
if (geometry_motion_synced.find(geom) != geometry_motion_synced.end() ||
|
||||
geometry_motion_attribute_synced.find(geom) != geometry_motion_attribute_synced.end()) {
|
||||
return;
|
||||
}
|
||||
|
||||
geometry_motion_synced.insert(geom);
|
||||
|
||||
|
@@ -347,16 +347,57 @@ static void fill_generic_attribute(BL::Mesh &b_mesh,
|
||||
}
|
||||
}
|
||||
|
||||
static void attr_create_generic(Scene *scene, Mesh *mesh, BL::Mesh &b_mesh, bool subdivision)
|
||||
static void attr_create_motion(Mesh *mesh, BL::Attribute &b_attribute, const float motion_scale)
|
||||
{
|
||||
if (!(b_attribute.domain() == BL::Attribute::domain_POINT) &&
|
||||
(b_attribute.data_type() == BL::Attribute::data_type_FLOAT_VECTOR)) {
|
||||
return;
|
||||
}
|
||||
|
||||
BL::FloatVectorAttribute b_vector_attribute(b_attribute);
|
||||
const int numverts = mesh->get_verts().size();
|
||||
|
||||
/* Find or add attribute */
|
||||
float3 *P = &mesh->get_verts()[0];
|
||||
Attribute *attr_mP = mesh->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
|
||||
|
||||
if (!attr_mP) {
|
||||
attr_mP = mesh->attributes.add(ATTR_STD_MOTION_VERTEX_POSITION);
|
||||
}
|
||||
|
||||
/* Only export previous and next frame, we don't have any in between data. */
|
||||
float motion_times[2] = {-1.0f, 1.0f};
|
||||
for (int step = 0; step < 2; step++) {
|
||||
const float relative_time = motion_times[step] * 0.5f * motion_scale;
|
||||
float3 *mP = attr_mP->data_float3() + step * numverts;
|
||||
|
||||
for (int i = 0; i < numverts; i++) {
|
||||
mP[i] = P[i] + get_float3(b_vector_attribute.data[i].vector()) * relative_time;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void attr_create_generic(Scene *scene,
|
||||
Mesh *mesh,
|
||||
BL::Mesh &b_mesh,
|
||||
const bool subdivision,
|
||||
const bool need_motion,
|
||||
const float motion_scale)
|
||||
{
|
||||
if (subdivision) {
|
||||
/* TODO: Handle subdivision correctly. */
|
||||
return;
|
||||
}
|
||||
AttributeSet &attributes = mesh->attributes;
|
||||
static const ustring u_velocity("velocity");
|
||||
|
||||
for (BL::Attribute &b_attribute : b_mesh.attributes) {
|
||||
const ustring name{b_attribute.name().c_str()};
|
||||
|
||||
if (need_motion && name == u_velocity) {
|
||||
attr_create_motion(mesh, b_attribute, motion_scale);
|
||||
}
|
||||
|
||||
if (!mesh->need_attribute(scene, name)) {
|
||||
continue;
|
||||
}
|
||||
@@ -859,8 +900,10 @@ static void create_mesh(Scene *scene,
|
||||
Mesh *mesh,
|
||||
BL::Mesh &b_mesh,
|
||||
const array<Node *> &used_shaders,
|
||||
bool subdivision = false,
|
||||
bool subdivide_uvs = true)
|
||||
const bool need_motion,
|
||||
const float motion_scale,
|
||||
const bool subdivision = false,
|
||||
const bool subdivide_uvs = true)
|
||||
{
|
||||
/* count vertices and faces */
|
||||
int numverts = b_mesh.vertices.length();
|
||||
@@ -974,7 +1017,7 @@ static void create_mesh(Scene *scene,
|
||||
attr_create_vertex_color(scene, mesh, b_mesh, subdivision);
|
||||
attr_create_sculpt_vertex_color(scene, mesh, b_mesh, subdivision);
|
||||
attr_create_random_per_island(scene, mesh, b_mesh, subdivision);
|
||||
attr_create_generic(scene, mesh, b_mesh, subdivision);
|
||||
attr_create_generic(scene, mesh, b_mesh, subdivision, need_motion, motion_scale);
|
||||
|
||||
if (subdivision) {
|
||||
attr_create_subd_uv_map(scene, mesh, b_mesh, subdivide_uvs);
|
||||
@@ -1002,6 +1045,8 @@ static void create_subd_mesh(Scene *scene,
|
||||
BObjectInfo &b_ob_info,
|
||||
BL::Mesh &b_mesh,
|
||||
const array<Node *> &used_shaders,
|
||||
const bool need_motion,
|
||||
const float motion_scale,
|
||||
float dicing_rate,
|
||||
int max_subdivisions)
|
||||
{
|
||||
@@ -1010,7 +1055,7 @@ static void create_subd_mesh(Scene *scene,
|
||||
BL::SubsurfModifier subsurf_mod(b_ob.modifiers[b_ob.modifiers.length() - 1]);
|
||||
bool subdivide_uvs = subsurf_mod.uv_smooth() != BL::SubsurfModifier::uv_smooth_NONE;
|
||||
|
||||
create_mesh(scene, mesh, b_mesh, used_shaders, true, subdivide_uvs);
|
||||
create_mesh(scene, mesh, b_mesh, used_shaders, need_motion, motion_scale, true, subdivide_uvs);
|
||||
|
||||
/* export creases */
|
||||
size_t num_creases = 0;
|
||||
@@ -1074,96 +1119,6 @@ static bool mesh_need_motion_attribute(BObjectInfo &b_ob_info, Scene *scene)
|
||||
return true;
|
||||
}
|
||||
|
||||
static void sync_mesh_cached_velocities(BObjectInfo &b_ob_info, Scene *scene, Mesh *mesh)
|
||||
{
|
||||
if (!mesh_need_motion_attribute(b_ob_info, scene)) {
|
||||
return;
|
||||
}
|
||||
|
||||
BL::Object b_ob = b_ob_info.real_object;
|
||||
BL::MeshSequenceCacheModifier b_mesh_cache = object_mesh_cache_find(b_ob, true, nullptr);
|
||||
|
||||
if (!b_mesh_cache) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!MeshSequenceCacheModifier_read_velocity_get(&b_mesh_cache.ptr)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const size_t numverts = mesh->get_verts().size();
|
||||
|
||||
if (b_mesh_cache.vertex_velocities.length() != numverts) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Find or add attribute */
|
||||
float3 *P = &mesh->get_verts()[0];
|
||||
Attribute *attr_mP = mesh->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
|
||||
|
||||
if (!attr_mP) {
|
||||
attr_mP = mesh->attributes.add(ATTR_STD_MOTION_VERTEX_POSITION);
|
||||
}
|
||||
|
||||
/* Only export previous and next frame, we don't have any in between data. */
|
||||
float motion_times[2] = {-1.0f, 1.0f};
|
||||
for (int step = 0; step < 2; step++) {
|
||||
const float relative_time = motion_times[step] * scene->motion_shutter_time() * 0.5f;
|
||||
float3 *mP = attr_mP->data_float3() + step * numverts;
|
||||
|
||||
BL::MeshSequenceCacheModifier::vertex_velocities_iterator vvi;
|
||||
int i = 0;
|
||||
|
||||
for (b_mesh_cache.vertex_velocities.begin(vvi); vvi != b_mesh_cache.vertex_velocities.end();
|
||||
++vvi, ++i) {
|
||||
mP[i] = P[i] + get_float3(vvi->velocity()) * relative_time;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void sync_mesh_fluid_motion(BObjectInfo &b_ob_info, Scene *scene, Mesh *mesh)
|
||||
{
|
||||
if (!b_ob_info.is_real_object_data()) {
|
||||
return;
|
||||
}
|
||||
if (!mesh_need_motion_attribute(b_ob_info, scene)) {
|
||||
return;
|
||||
}
|
||||
|
||||
BL::Object b_ob = b_ob_info.real_object;
|
||||
BL::FluidDomainSettings b_fluid_domain = object_fluid_liquid_domain_find(b_ob);
|
||||
|
||||
if (!b_fluid_domain)
|
||||
return;
|
||||
|
||||
/* If the mesh has modifiers following the fluid domain we can't export motion. */
|
||||
if (b_fluid_domain.mesh_vertices.length() != mesh->get_verts().size())
|
||||
return;
|
||||
|
||||
/* Find or add attribute */
|
||||
float3 *P = &mesh->get_verts()[0];
|
||||
Attribute *attr_mP = mesh->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
|
||||
|
||||
if (!attr_mP) {
|
||||
attr_mP = mesh->attributes.add(ATTR_STD_MOTION_VERTEX_POSITION);
|
||||
}
|
||||
|
||||
/* Only export previous and next frame, we don't have any in between data. */
|
||||
float motion_times[2] = {-1.0f, 1.0f};
|
||||
for (int step = 0; step < 2; step++) {
|
||||
float relative_time = motion_times[step] * scene->motion_shutter_time() * 0.5f;
|
||||
float3 *mP = attr_mP->data_float3() + step * mesh->get_verts().size();
|
||||
|
||||
BL::FluidDomainSettings::mesh_vertices_iterator svi;
|
||||
int i = 0;
|
||||
|
||||
for (b_fluid_domain.mesh_vertices.begin(svi); svi != b_fluid_domain.mesh_vertices.end();
|
||||
++svi, ++i) {
|
||||
mP[i] = P[i] + get_float3(svi->velocity()) * relative_time;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BlenderSync::sync_mesh(BL::Depsgraph b_depsgraph, BObjectInfo &b_ob_info, Mesh *mesh)
|
||||
{
|
||||
/* make a copy of the shaders as the caller in the main thread still need them for syncing the
|
||||
@@ -1187,6 +1142,13 @@ void BlenderSync::sync_mesh(BL::Depsgraph b_depsgraph, BObjectInfo &b_ob_info, M
|
||||
b_data, b_ob_info, b_depsgraph, need_undeformed, new_mesh.get_subdivision_type());
|
||||
|
||||
if (b_mesh) {
|
||||
/* Motion blur attribute is relative to seconds, we need it relative to frames. */
|
||||
const bool need_motion = mesh_need_motion_attribute(b_ob_info, scene);
|
||||
const float motion_scale = (need_motion) ?
|
||||
scene->motion_shutter_time() /
|
||||
(b_scene.render().fps() / b_scene.render().fps_base()) :
|
||||
0.0f;
|
||||
|
||||
/* Sync mesh itself. */
|
||||
if (new_mesh.get_subdivision_type() != Mesh::SUBDIVISION_NONE)
|
||||
create_subd_mesh(scene,
|
||||
@@ -1194,21 +1156,23 @@ void BlenderSync::sync_mesh(BL::Depsgraph b_depsgraph, BObjectInfo &b_ob_info, M
|
||||
b_ob_info,
|
||||
b_mesh,
|
||||
new_mesh.get_used_shaders(),
|
||||
need_motion,
|
||||
motion_scale,
|
||||
dicing_rate,
|
||||
max_subdivisions);
|
||||
else
|
||||
create_mesh(scene, &new_mesh, b_mesh, new_mesh.get_used_shaders(), false);
|
||||
create_mesh(scene,
|
||||
&new_mesh,
|
||||
b_mesh,
|
||||
new_mesh.get_used_shaders(),
|
||||
need_motion,
|
||||
motion_scale,
|
||||
false);
|
||||
|
||||
free_object_to_mesh(b_data, b_ob_info, b_mesh);
|
||||
}
|
||||
}
|
||||
|
||||
/* cached velocities (e.g. from alembic archive) */
|
||||
sync_mesh_cached_velocities(b_ob_info, scene, &new_mesh);
|
||||
|
||||
/* mesh fluid motion mantaflow */
|
||||
sync_mesh_fluid_motion(b_ob_info, scene, &new_mesh);
|
||||
|
||||
/* update original sockets */
|
||||
|
||||
mesh->clear_non_sockets();
|
||||
@@ -1242,19 +1206,6 @@ void BlenderSync::sync_mesh_motion(BL::Depsgraph b_depsgraph,
|
||||
Mesh *mesh,
|
||||
int motion_step)
|
||||
{
|
||||
/* Fluid motion blur already exported. */
|
||||
BL::FluidDomainSettings b_fluid_domain = object_fluid_liquid_domain_find(b_ob_info.real_object);
|
||||
if (b_fluid_domain) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Cached motion blur already exported. */
|
||||
BL::MeshSequenceCacheModifier mesh_cache = object_mesh_cache_find(
|
||||
b_ob_info.real_object, true, nullptr);
|
||||
if (mesh_cache) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Skip if no vertices were exported. */
|
||||
size_t numverts = mesh->get_verts().size();
|
||||
if (numverts == 0) {
|
||||
|
@@ -604,7 +604,7 @@ void BlenderSync::sync_objects(BL::Depsgraph &b_depsgraph,
|
||||
* only available in preview renders since currently do not have a good cache policy, the
|
||||
* data being loaded at once for all the frames. */
|
||||
if (experimental && b_v3d) {
|
||||
b_mesh_cache = object_mesh_cache_find(b_ob, false, &has_subdivision_modifier);
|
||||
b_mesh_cache = object_mesh_cache_find(b_ob, &has_subdivision_modifier);
|
||||
use_procedural = b_mesh_cache && b_mesh_cache.cache_file().use_render_procedural();
|
||||
}
|
||||
|
||||
@@ -719,6 +719,14 @@ void BlenderSync::sync_motion(BL::RenderSettings &b_render,
|
||||
}
|
||||
}
|
||||
|
||||
/* Check which geometry already has motion blur so it can be skipped. */
|
||||
geometry_motion_attribute_synced.clear();
|
||||
for (Geometry *geom : scene->geometry) {
|
||||
if (geom->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION)) {
|
||||
geometry_motion_attribute_synced.insert(geom);
|
||||
}
|
||||
}
|
||||
|
||||
/* note iteration over motion_times set happens in sorted order */
|
||||
foreach (float relative_time, motion_times) {
|
||||
/* center time is already handled. */
|
||||
@@ -749,6 +757,8 @@ void BlenderSync::sync_motion(BL::RenderSettings &b_render,
|
||||
sync_objects(b_depsgraph, b_v3d, relative_time);
|
||||
}
|
||||
|
||||
geometry_motion_attribute_synced.clear();
|
||||
|
||||
/* we need to set the python thread state again because this
|
||||
* function assumes it is being executed from python and will
|
||||
* try to save the thread state */
|
||||
|
@@ -236,6 +236,7 @@ class BlenderSync {
|
||||
id_map<ParticleSystemKey, ParticleSystem> particle_system_map;
|
||||
set<Geometry *> geometry_synced;
|
||||
set<Geometry *> geometry_motion_synced;
|
||||
set<Geometry *> geometry_motion_attribute_synced;
|
||||
set<float> motion_times;
|
||||
void *world_map;
|
||||
bool world_recalc;
|
||||
|
@@ -573,22 +573,6 @@ static inline bool object_use_deform_motion(BL::Object &b_parent, BL::Object &b_
|
||||
return use_deform_motion;
|
||||
}
|
||||
|
||||
static inline BL::FluidDomainSettings object_fluid_liquid_domain_find(BL::Object &b_ob)
|
||||
{
|
||||
for (BL::Modifier &b_mod : b_ob.modifiers) {
|
||||
if (b_mod.is_a(&RNA_FluidModifier)) {
|
||||
BL::FluidModifier b_mmd(b_mod);
|
||||
|
||||
if (b_mmd.fluid_type() == BL::FluidModifier::fluid_type_DOMAIN &&
|
||||
b_mmd.domain_settings().domain_type() == BL::FluidDomainSettings::domain_type_LIQUID) {
|
||||
return b_mmd.domain_settings();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return BL::FluidDomainSettings(PointerRNA_NULL);
|
||||
}
|
||||
|
||||
static inline BL::FluidDomainSettings object_fluid_gas_domain_find(BL::Object &b_ob)
|
||||
{
|
||||
for (BL::Modifier &b_mod : b_ob.modifiers) {
|
||||
@@ -606,7 +590,6 @@ static inline BL::FluidDomainSettings object_fluid_gas_domain_find(BL::Object &b
|
||||
}
|
||||
|
||||
static inline BL::MeshSequenceCacheModifier object_mesh_cache_find(BL::Object &b_ob,
|
||||
bool check_velocity,
|
||||
bool *has_subdivision_modifier)
|
||||
{
|
||||
for (int i = b_ob.modifiers.length() - 1; i >= 0; --i) {
|
||||
@@ -614,13 +597,6 @@ static inline BL::MeshSequenceCacheModifier object_mesh_cache_find(BL::Object &b
|
||||
|
||||
if (b_mod.type() == BL::Modifier::type_MESH_SEQUENCE_CACHE) {
|
||||
BL::MeshSequenceCacheModifier mesh_cache = BL::MeshSequenceCacheModifier(b_mod);
|
||||
|
||||
if (check_velocity) {
|
||||
if (!MeshSequenceCacheModifier_has_velocity_get(&mesh_cache.ptr)) {
|
||||
return BL::MeshSequenceCacheModifier(PointerRNA_NULL);
|
||||
}
|
||||
}
|
||||
|
||||
return mesh_cache;
|
||||
}
|
||||
|
||||
@@ -629,9 +605,7 @@ static inline BL::MeshSequenceCacheModifier object_mesh_cache_find(BL::Object &b
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Only skip the subsurf modifier if we are not checking for the mesh sequence cache modifier
|
||||
* for motion blur. */
|
||||
if (b_mod.type() == BL::Modifier::type_SUBSURF && !check_velocity) {
|
||||
if (b_mod.type() == BL::Modifier::type_SUBSURF) {
|
||||
if (has_subdivision_modifier) {
|
||||
*has_subdivision_modifier = true;
|
||||
}
|
||||
|
@@ -89,10 +89,10 @@ class Hair : public Geometry {
|
||||
float4 r_keys[4]) const;
|
||||
};
|
||||
|
||||
NODE_SOCKET_API(array<float3>, curve_keys)
|
||||
NODE_SOCKET_API(array<float>, curve_radius)
|
||||
NODE_SOCKET_API(array<int>, curve_first_key)
|
||||
NODE_SOCKET_API(array<int>, curve_shader)
|
||||
NODE_SOCKET_API_ARRAY(array<float3>, curve_keys)
|
||||
NODE_SOCKET_API_ARRAY(array<float>, curve_radius)
|
||||
NODE_SOCKET_API_ARRAY(array<int>, curve_first_key)
|
||||
NODE_SOCKET_API_ARRAY(array<int>, curve_shader)
|
||||
|
||||
/* BVH */
|
||||
size_t curvekey_offset;
|
||||
|
@@ -413,7 +413,7 @@ void LightManager::device_update_distribution(Device *,
|
||||
/* point lights */
|
||||
bool use_lamp_mis = false;
|
||||
int light_index = 0;
|
||||
|
||||
|
||||
if (num_lights > 0) {
|
||||
float lightarea = (totarea > 0.0f) ? totarea / num_lights : 1.0f;
|
||||
foreach (Light *light, scene->lights) {
|
||||
|
@@ -128,7 +128,7 @@ class ImageTextureNode : public ImageSlotTextureNode {
|
||||
NODE_SOCKET_API(float, projection_blend)
|
||||
NODE_SOCKET_API(bool, animated)
|
||||
NODE_SOCKET_API(float3, vector)
|
||||
NODE_SOCKET_API(array<int>, tiles)
|
||||
NODE_SOCKET_API_ARRAY(array<int>, tiles)
|
||||
|
||||
protected:
|
||||
void cull_tiles(Scene *scene, ShaderGraph *graph);
|
||||
@@ -1554,7 +1554,7 @@ class CurvesNode : public ShaderNode {
|
||||
return NODE_GROUP_LEVEL_3;
|
||||
}
|
||||
|
||||
NODE_SOCKET_API(array<float3>, curves)
|
||||
NODE_SOCKET_API_ARRAY(array<float3>, curves)
|
||||
NODE_SOCKET_API(float, min_x)
|
||||
NODE_SOCKET_API(float, max_x)
|
||||
NODE_SOCKET_API(float, fac)
|
||||
@@ -1588,8 +1588,8 @@ class RGBRampNode : public ShaderNode {
|
||||
return NODE_GROUP_LEVEL_1;
|
||||
}
|
||||
|
||||
NODE_SOCKET_API(array<float3>, ramp)
|
||||
NODE_SOCKET_API(array<float>, ramp_alpha)
|
||||
NODE_SOCKET_API_ARRAY(array<float3>, ramp)
|
||||
NODE_SOCKET_API_ARRAY(array<float>, ramp_alpha)
|
||||
NODE_SOCKET_API(float, fac)
|
||||
NODE_SOCKET_API(bool, interpolate)
|
||||
};
|
||||
|
@@ -652,6 +652,11 @@ typedef struct {
|
||||
enum {
|
||||
GHOST_kXrContextDebug = (1 << 0),
|
||||
GHOST_kXrContextDebugTime = (1 << 1),
|
||||
# ifdef WIN32
|
||||
/* Needed to avoid issues with the SteamVR OpenGL graphics binding (use DirectX fallback
|
||||
instead). */
|
||||
GHOST_kXrContextGpuNVIDIA = (1 << 2),
|
||||
# endif
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
|
@@ -20,6 +20,7 @@
|
||||
* Abstraction for XR (VR, AR, MR, ..) access via OpenXR.
|
||||
*/
|
||||
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
@@ -98,7 +99,7 @@ void GHOST_XrContext::initialize(const GHOST_XrContextCreateInfo *create_info)
|
||||
storeInstanceProperties();
|
||||
|
||||
/* Multiple bindings may be enabled. Now that we know the runtime in use, settle for one. */
|
||||
m_gpu_binding_type = determineGraphicsBindingTypeToUse(graphics_binding_types);
|
||||
m_gpu_binding_type = determineGraphicsBindingTypeToUse(graphics_binding_types, create_info);
|
||||
|
||||
printInstanceInfo();
|
||||
if (isDebugMode()) {
|
||||
@@ -135,7 +136,8 @@ void GHOST_XrContext::storeInstanceProperties()
|
||||
{"Monado(XRT) by Collabora et al", OPENXR_RUNTIME_MONADO},
|
||||
{"Oculus", OPENXR_RUNTIME_OCULUS},
|
||||
{"SteamVR/OpenXR", OPENXR_RUNTIME_STEAMVR},
|
||||
{"Windows Mixed Reality Runtime", OPENXR_RUNTIME_WMR}};
|
||||
{"Windows Mixed Reality Runtime", OPENXR_RUNTIME_WMR},
|
||||
{"Varjo OpenXR Runtime", OPENXR_RUNTIME_VARJO}};
|
||||
decltype(runtime_map)::const_iterator runtime_map_iter;
|
||||
|
||||
m_oxr->instance_properties.type = XR_TYPE_INSTANCE_PROPERTIES;
|
||||
@@ -415,6 +417,12 @@ void GHOST_XrContext::getExtensionsToEnable(
|
||||
try_ext.push_back(XR_HTC_VIVE_COSMOS_CONTROLLER_INTERACTION_EXTENSION_NAME);
|
||||
try_ext.push_back(XR_HUAWEI_CONTROLLER_INTERACTION_EXTENSION_NAME);
|
||||
|
||||
/* Varjo quad view extension. */
|
||||
try_ext.push_back(XR_VARJO_QUAD_VIEWS_EXTENSION_NAME);
|
||||
|
||||
/* Varjo foveated extension. */
|
||||
try_ext.push_back(XR_VARJO_FOVEATED_RENDERING_EXTENSION_NAME);
|
||||
|
||||
r_ext_names.reserve(try_ext.size() + graphics_binding_types.size());
|
||||
|
||||
/* Add graphics binding extensions (may be multiple ones, we'll settle for one to use later, once
|
||||
@@ -465,16 +473,20 @@ std::vector<GHOST_TXrGraphicsBinding> GHOST_XrContext::determineGraphicsBindingT
|
||||
}
|
||||
|
||||
GHOST_TXrGraphicsBinding GHOST_XrContext::determineGraphicsBindingTypeToUse(
|
||||
const std::vector<GHOST_TXrGraphicsBinding> &enabled_types)
|
||||
const std::vector<GHOST_TXrGraphicsBinding> &enabled_types,
|
||||
const GHOST_XrContextCreateInfo *create_info)
|
||||
{
|
||||
/* Return the first working type. */
|
||||
for (GHOST_TXrGraphicsBinding type : enabled_types) {
|
||||
#ifdef WIN32
|
||||
/* The SteamVR OpenGL backend fails currently. Disable it and allow falling back to the DirectX
|
||||
* one. */
|
||||
if ((m_runtime_id == OPENXR_RUNTIME_STEAMVR) && (type == GHOST_kXrGraphicsOpenGL)) {
|
||||
/* The SteamVR OpenGL backend currently fails for NVIDIA GPU's. Disable it and allow falling
|
||||
* back to the DirectX one. */
|
||||
if ((m_runtime_id == OPENXR_RUNTIME_STEAMVR) && (type == GHOST_kXrGraphicsOpenGL) &&
|
||||
((create_info->context_flag & GHOST_kXrContextGpuNVIDIA) != 0)) {
|
||||
continue;
|
||||
}
|
||||
#else
|
||||
((void)create_info);
|
||||
#endif
|
||||
|
||||
assert(type != GHOST_kXrGraphicsUnknown);
|
||||
@@ -613,4 +625,11 @@ bool GHOST_XrContext::isDebugTimeMode() const
|
||||
return m_debug_time;
|
||||
}
|
||||
|
||||
bool GHOST_XrContext::isExtensionEnabled(const char *ext) const
|
||||
{
|
||||
bool contains = std::find(m_enabled_extensions.begin(), m_enabled_extensions.end(), ext) !=
|
||||
m_enabled_extensions.end();
|
||||
return contains;
|
||||
}
|
||||
|
||||
/** \} */ /* Ghost Internal Accessors and Mutators */
|
||||
|
@@ -51,6 +51,7 @@ enum GHOST_TXrOpenXRRuntimeID {
|
||||
OPENXR_RUNTIME_OCULUS,
|
||||
OPENXR_RUNTIME_STEAMVR,
|
||||
OPENXR_RUNTIME_WMR, /* Windows Mixed Reality */
|
||||
OPENXR_RUNTIME_VARJO,
|
||||
|
||||
OPENXR_RUNTIME_UNKNOWN
|
||||
};
|
||||
@@ -94,6 +95,8 @@ class GHOST_XrContext : public GHOST_IXrContext {
|
||||
bool isDebugMode() const;
|
||||
bool isDebugTimeMode() const;
|
||||
|
||||
bool isExtensionEnabled(const char *ext) const;
|
||||
|
||||
private:
|
||||
static GHOST_XrErrorHandlerFn s_error_handler;
|
||||
static void *s_error_handler_customdata;
|
||||
@@ -136,5 +139,6 @@ class GHOST_XrContext : public GHOST_IXrContext {
|
||||
std::vector<GHOST_TXrGraphicsBinding> determineGraphicsBindingTypesToEnable(
|
||||
const GHOST_XrContextCreateInfo *create_info);
|
||||
GHOST_TXrGraphicsBinding determineGraphicsBindingTypeToUse(
|
||||
const std::vector<GHOST_TXrGraphicsBinding> &enabled_types);
|
||||
const std::vector<GHOST_TXrGraphicsBinding> &enabled_types,
|
||||
const GHOST_XrContextCreateInfo *create_info);
|
||||
};
|
||||
|
@@ -41,10 +41,13 @@ struct OpenXRSessionData {
|
||||
XrSession session = XR_NULL_HANDLE;
|
||||
XrSessionState session_state = XR_SESSION_STATE_UNKNOWN;
|
||||
|
||||
/* Only stereo rendering supported now. */
|
||||
const XrViewConfigurationType view_type = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO;
|
||||
/* Use stereo rendering by default. */
|
||||
XrViewConfigurationType view_type = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO;
|
||||
bool foveation_supported = false;
|
||||
|
||||
XrSpace reference_space;
|
||||
XrSpace view_space;
|
||||
XrSpace combined_eye_space;
|
||||
std::vector<XrView> views;
|
||||
std::vector<GHOST_XrSwapchain> swapchains;
|
||||
|
||||
@@ -58,6 +61,9 @@ struct GHOST_XrDrawInfo {
|
||||
std::chrono::high_resolution_clock::time_point frame_begin_time;
|
||||
/* Time previous frames took for rendering (in ms). */
|
||||
std::list<double> last_frame_times;
|
||||
|
||||
/* Whether foveation is active for the frame. */
|
||||
bool foveation_active;
|
||||
};
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
@@ -82,6 +88,9 @@ GHOST_XrSession::~GHOST_XrSession()
|
||||
if (m_oxr->view_space != XR_NULL_HANDLE) {
|
||||
CHECK_XR_ASSERT(xrDestroySpace(m_oxr->view_space));
|
||||
}
|
||||
if (m_oxr->combined_eye_space != XR_NULL_HANDLE) {
|
||||
CHECK_XR_ASSERT(xrDestroySpace(m_oxr->combined_eye_space));
|
||||
}
|
||||
if (m_oxr->session != XR_NULL_HANDLE) {
|
||||
CHECK_XR_ASSERT(xrDestroySession(m_oxr->session));
|
||||
}
|
||||
@@ -189,6 +198,13 @@ static void create_reference_spaces(OpenXRSessionData &oxr, const GHOST_XrPose &
|
||||
create_info.referenceSpaceType = XR_REFERENCE_SPACE_TYPE_VIEW;
|
||||
CHECK_XR(xrCreateReferenceSpace(oxr.session, &create_info, &oxr.view_space),
|
||||
"Failed to create view reference space.");
|
||||
|
||||
/* Foveation reference spaces. */
|
||||
if (oxr.foveation_supported) {
|
||||
create_info.referenceSpaceType = XR_REFERENCE_SPACE_TYPE_COMBINED_EYE_VARJO;
|
||||
CHECK_XR(xrCreateReferenceSpace(oxr.session, &create_info, &oxr.combined_eye_space),
|
||||
"Failed to create combined eye reference space.");
|
||||
}
|
||||
}
|
||||
|
||||
void GHOST_XrSession::start(const GHOST_XrSessionBeginInfo *begin_info)
|
||||
@@ -292,9 +308,19 @@ GHOST_XrSession::LifeExpectancy GHOST_XrSession::handleStateChangeEvent(
|
||||
|
||||
void GHOST_XrSession::prepareDrawing()
|
||||
{
|
||||
assert(m_context->getInstance() != XR_NULL_HANDLE);
|
||||
|
||||
std::vector<XrViewConfigurationView> view_configs;
|
||||
uint32_t view_count;
|
||||
|
||||
/* Attempt to use quad view if supported. */
|
||||
if (m_context->isExtensionEnabled(XR_VARJO_QUAD_VIEWS_EXTENSION_NAME)) {
|
||||
m_oxr->view_type = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_QUAD_VARJO;
|
||||
}
|
||||
|
||||
m_oxr->foveation_supported = m_context->isExtensionEnabled(
|
||||
XR_VARJO_FOVEATED_RENDERING_EXTENSION_NAME);
|
||||
|
||||
CHECK_XR(
|
||||
xrEnumerateViewConfigurationViews(
|
||||
m_context->getInstance(), m_oxr->system_id, m_oxr->view_type, 0, &view_count, nullptr),
|
||||
@@ -306,7 +332,36 @@ void GHOST_XrSession::prepareDrawing()
|
||||
view_configs.size(),
|
||||
&view_count,
|
||||
view_configs.data()),
|
||||
"Failed to get count of view configurations.");
|
||||
"Failed to get view configurations.");
|
||||
|
||||
/* If foveated rendering is used, query the foveated views. */
|
||||
if (m_oxr->foveation_supported) {
|
||||
std::vector<XrFoveatedViewConfigurationViewVARJO> request_foveated_config{
|
||||
view_count, {XR_TYPE_FOVEATED_VIEW_CONFIGURATION_VIEW_VARJO, nullptr, XR_TRUE}};
|
||||
|
||||
auto foveated_views = std::vector<XrViewConfigurationView>(view_count,
|
||||
{XR_TYPE_VIEW_CONFIGURATION_VIEW});
|
||||
|
||||
for (uint32_t i = 0; i < view_count; i++) {
|
||||
foveated_views[i].next = &request_foveated_config[i];
|
||||
}
|
||||
CHECK_XR(xrEnumerateViewConfigurationViews(m_context->getInstance(),
|
||||
m_oxr->system_id,
|
||||
m_oxr->view_type,
|
||||
view_configs.size(),
|
||||
&view_count,
|
||||
foveated_views.data()),
|
||||
"Failed to get foveated view configurations.");
|
||||
|
||||
/* Ensure swapchains have correct size even when foveation is being used. */
|
||||
for (uint32_t i = 0; i < view_count; i++) {
|
||||
view_configs[i].recommendedImageRectWidth = std::max(
|
||||
view_configs[i].recommendedImageRectWidth, foveated_views[i].recommendedImageRectWidth);
|
||||
view_configs[i].recommendedImageRectHeight = std::max(
|
||||
view_configs[i].recommendedImageRectHeight,
|
||||
foveated_views[i].recommendedImageRectHeight);
|
||||
}
|
||||
}
|
||||
|
||||
for (const XrViewConfigurationView &view_config : view_configs) {
|
||||
m_oxr->swapchains.emplace_back(*m_gpu_binding, m_oxr->session, view_config);
|
||||
@@ -327,6 +382,20 @@ void GHOST_XrSession::beginFrameDrawing()
|
||||
CHECK_XR(xrWaitFrame(m_oxr->session, &wait_info, &frame_state),
|
||||
"Failed to synchronize frame rates between Blender and the device.");
|
||||
|
||||
/* Check if we have foveation available for the current frame. */
|
||||
m_draw_info->foveation_active = false;
|
||||
if (m_oxr->foveation_supported) {
|
||||
XrSpaceLocation render_gaze_location{XR_TYPE_SPACE_LOCATION};
|
||||
CHECK_XR(xrLocateSpace(m_oxr->combined_eye_space,
|
||||
m_oxr->view_space,
|
||||
frame_state.predictedDisplayTime,
|
||||
&render_gaze_location),
|
||||
"Failed to locate combined eye space.");
|
||||
|
||||
m_draw_info->foveation_active = (render_gaze_location.locationFlags &
|
||||
XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT) != 0;
|
||||
}
|
||||
|
||||
CHECK_XR(xrBeginFrame(m_oxr->session, &begin_info),
|
||||
"Failed to submit frame rendering start state.");
|
||||
|
||||
@@ -442,6 +511,8 @@ XrCompositionLayerProjection GHOST_XrSession::drawLayer(
|
||||
std::vector<XrCompositionLayerProjectionView> &r_proj_layer_views, void *draw_customdata)
|
||||
{
|
||||
XrViewLocateInfo viewloc_info = {XR_TYPE_VIEW_LOCATE_INFO};
|
||||
XrViewLocateFoveatedRenderingVARJO foveated_info{
|
||||
XR_TYPE_VIEW_LOCATE_FOVEATED_RENDERING_VARJO, nullptr, true};
|
||||
XrViewState view_state = {XR_TYPE_VIEW_STATE};
|
||||
XrCompositionLayerProjection layer = {XR_TYPE_COMPOSITION_LAYER_PROJECTION};
|
||||
XrSpaceLocation view_location{XR_TYPE_SPACE_LOCATION};
|
||||
@@ -451,6 +522,10 @@ XrCompositionLayerProjection GHOST_XrSession::drawLayer(
|
||||
viewloc_info.displayTime = m_draw_info->frame_state.predictedDisplayTime;
|
||||
viewloc_info.space = m_oxr->reference_space;
|
||||
|
||||
if (m_draw_info->foveation_active) {
|
||||
viewloc_info.next = &foveated_info;
|
||||
}
|
||||
|
||||
CHECK_XR(xrLocateViews(m_oxr->session,
|
||||
&viewloc_info,
|
||||
&view_state,
|
||||
@@ -458,6 +533,7 @@ XrCompositionLayerProjection GHOST_XrSession::drawLayer(
|
||||
&view_count,
|
||||
m_oxr->views.data()),
|
||||
"Failed to query frame view and projection state.");
|
||||
|
||||
assert(m_oxr->swapchains.size() == view_count);
|
||||
|
||||
CHECK_XR(
|
||||
|
@@ -21,6 +21,7 @@
|
||||
set(INC
|
||||
.
|
||||
../atomic
|
||||
../../source/blender/blenlib
|
||||
)
|
||||
|
||||
set(INC_SYS
|
||||
|
@@ -409,7 +409,7 @@ static void print_memhead_backtrace(MemHead *memh)
|
||||
(void)memh; /* Ignored. */
|
||||
}
|
||||
# endif /* defined(__linux__) || defined(__APPLE__) */
|
||||
#endif /* DEBUG_BACKTRACE */
|
||||
#endif /* DEBUG_BACKTRACE */
|
||||
|
||||
static void make_memhead_header(MemHead *memh, size_t len, const char *str)
|
||||
{
|
||||
|
@@ -30,6 +30,7 @@
|
||||
|
||||
/* to ensure strict conversions */
|
||||
#include "../../source/blender/blenlib/BLI_strict_flags.h"
|
||||
#include "../../source/blender/blenlib/BLI_asan.h"
|
||||
|
||||
#include "atomic_ops.h"
|
||||
#include "mallocn_intern.h"
|
||||
@@ -59,6 +60,9 @@ enum {
|
||||
#define MEMHEAD_ALIGNED_FROM_PTR(ptr) (((MemHeadAligned *)ptr) - 1)
|
||||
#define MEMHEAD_IS_ALIGNED(memhead) ((memhead)->len & (size_t)MEMHEAD_ALIGN_FLAG)
|
||||
|
||||
#define MEM_POISON_MEMHEAD(vmemh) BLI_asan_poison(MEMHEAD_FROM_PTR(vmemh), sizeof(MemHead))
|
||||
#define MEM_UNPOISON_MEMHEAD(vmemh) BLI_asan_unpoison(MEMHEAD_FROM_PTR(vmemh), sizeof(MemHead))
|
||||
|
||||
/* Uncomment this to have proper peak counter. */
|
||||
#define USE_ATOMIC_MAX
|
||||
|
||||
@@ -93,7 +97,13 @@ print_error(const char *str, ...)
|
||||
size_t MEM_lockfree_allocN_len(const void *vmemh)
|
||||
{
|
||||
if (vmemh) {
|
||||
return MEMHEAD_FROM_PTR(vmemh)->len & ~((size_t)(MEMHEAD_ALIGN_FLAG));
|
||||
size_t ret;
|
||||
|
||||
MEM_UNPOISON_MEMHEAD(vmemh);
|
||||
ret = MEMHEAD_FROM_PTR(vmemh)->len & ~((size_t)(MEMHEAD_ALIGN_FLAG));
|
||||
MEM_POISON_MEMHEAD(vmemh);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -119,6 +129,8 @@ void MEM_lockfree_freeN(void *vmemh)
|
||||
atomic_sub_and_fetch_u(&totblock, 1);
|
||||
atomic_sub_and_fetch_z(&mem_in_use, len);
|
||||
|
||||
MEM_UNPOISON_MEMHEAD(vmemh);
|
||||
|
||||
if (UNLIKELY(malloc_debug_memset && len)) {
|
||||
memset(memh + 1, 255, len);
|
||||
}
|
||||
@@ -137,6 +149,9 @@ void *MEM_lockfree_dupallocN(const void *vmemh)
|
||||
if (vmemh) {
|
||||
MemHead *memh = MEMHEAD_FROM_PTR(vmemh);
|
||||
const size_t prev_size = MEM_lockfree_allocN_len(vmemh);
|
||||
|
||||
MEM_UNPOISON_MEMHEAD(vmemh);
|
||||
|
||||
if (UNLIKELY(MEMHEAD_IS_ALIGNED(memh))) {
|
||||
MemHeadAligned *memh_aligned = MEMHEAD_ALIGNED_FROM_PTR(vmemh);
|
||||
newp = MEM_lockfree_mallocN_aligned(
|
||||
@@ -145,6 +160,8 @@ void *MEM_lockfree_dupallocN(const void *vmemh)
|
||||
else {
|
||||
newp = MEM_lockfree_mallocN(prev_size, "dupli_malloc");
|
||||
}
|
||||
|
||||
MEM_POISON_MEMHEAD(vmemh);
|
||||
memcpy(newp, vmemh, prev_size);
|
||||
}
|
||||
return newp;
|
||||
@@ -158,6 +175,8 @@ void *MEM_lockfree_reallocN_id(void *vmemh, size_t len, const char *str)
|
||||
MemHead *memh = MEMHEAD_FROM_PTR(vmemh);
|
||||
size_t old_len = MEM_lockfree_allocN_len(vmemh);
|
||||
|
||||
MEM_UNPOISON_MEMHEAD(vmemh);
|
||||
|
||||
if (LIKELY(!MEMHEAD_IS_ALIGNED(memh))) {
|
||||
newp = MEM_lockfree_mallocN(len, "realloc");
|
||||
}
|
||||
@@ -166,6 +185,8 @@ void *MEM_lockfree_reallocN_id(void *vmemh, size_t len, const char *str)
|
||||
newp = MEM_lockfree_mallocN_aligned(len, (size_t)memh_aligned->alignment, "realloc");
|
||||
}
|
||||
|
||||
MEM_POISON_MEMHEAD(vmemh);
|
||||
|
||||
if (newp) {
|
||||
if (len < old_len) {
|
||||
/* shrink */
|
||||
@@ -194,6 +215,8 @@ void *MEM_lockfree_recallocN_id(void *vmemh, size_t len, const char *str)
|
||||
MemHead *memh = MEMHEAD_FROM_PTR(vmemh);
|
||||
size_t old_len = MEM_lockfree_allocN_len(vmemh);
|
||||
|
||||
MEM_UNPOISON_MEMHEAD(vmemh);
|
||||
|
||||
if (LIKELY(!MEMHEAD_IS_ALIGNED(memh))) {
|
||||
newp = MEM_lockfree_mallocN(len, "recalloc");
|
||||
}
|
||||
@@ -201,6 +224,7 @@ void *MEM_lockfree_recallocN_id(void *vmemh, size_t len, const char *str)
|
||||
MemHeadAligned *memh_aligned = MEMHEAD_ALIGNED_FROM_PTR(vmemh);
|
||||
newp = MEM_lockfree_mallocN_aligned(len, (size_t)memh_aligned->alignment, "recalloc");
|
||||
}
|
||||
MEM_POISON_MEMHEAD(vmemh);
|
||||
|
||||
if (newp) {
|
||||
if (len < old_len) {
|
||||
@@ -241,6 +265,7 @@ void *MEM_lockfree_callocN(size_t len, const char *str)
|
||||
atomic_add_and_fetch_z(&mem_in_use, len);
|
||||
update_maximum(&peak_mem, mem_in_use);
|
||||
|
||||
MEM_POISON_MEMHEAD(PTR_FROM_MEMHEAD(memh));
|
||||
return PTR_FROM_MEMHEAD(memh);
|
||||
}
|
||||
print_error("Calloc returns null: len=" SIZET_FORMAT " in %s, total %u\n",
|
||||
@@ -286,6 +311,8 @@ void *MEM_lockfree_mallocN(size_t len, const char *str)
|
||||
atomic_add_and_fetch_z(&mem_in_use, len);
|
||||
update_maximum(&peak_mem, mem_in_use);
|
||||
|
||||
MEM_POISON_MEMHEAD(PTR_FROM_MEMHEAD(memh));
|
||||
|
||||
return PTR_FROM_MEMHEAD(memh);
|
||||
}
|
||||
print_error("Malloc returns null: len=" SIZET_FORMAT " in %s, total %u\n",
|
||||
@@ -357,6 +384,8 @@ void *MEM_lockfree_mallocN_aligned(size_t len, size_t alignment, const char *str
|
||||
atomic_add_and_fetch_z(&mem_in_use, len);
|
||||
update_maximum(&peak_mem, mem_in_use);
|
||||
|
||||
MEM_POISON_MEMHEAD(PTR_FROM_MEMHEAD(memh));
|
||||
|
||||
return PTR_FROM_MEMHEAD(memh);
|
||||
}
|
||||
print_error("Malloc returns null: len=" SIZET_FORMAT " in %s, total %u\n",
|
||||
|
@@ -70,9 +70,9 @@ static int check_if_canceled(float progress,
|
||||
return cancel;
|
||||
}
|
||||
|
||||
void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd,
|
||||
void (*update_cb)(void *, float progress, int *cancel),
|
||||
void *update_cb_data)
|
||||
ATTR_NO_OPT void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd,
|
||||
void (*update_cb)(void *, float progress, int *cancel),
|
||||
void *update_cb_data)
|
||||
{
|
||||
Parametrizer field;
|
||||
VertexMap vertexMap;
|
||||
@@ -80,6 +80,12 @@ void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd,
|
||||
/* Get remeshing parameters. */
|
||||
int faces = qrd->target_faces;
|
||||
|
||||
field.flag_adaptive_scale = 1;
|
||||
field.flag_minimum_cost_flow = 1;
|
||||
field.flag_preserve_boundary = 1;
|
||||
field.flag_preserve_sharp = 1;
|
||||
// field.flag_aggresive_sat = 1;
|
||||
|
||||
if (qrd->preserve_sharp) {
|
||||
field.flag_preserve_sharp = 1;
|
||||
}
|
||||
@@ -106,6 +112,7 @@ void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd,
|
||||
/* Copy mesh to quadriflow data structures. */
|
||||
std::vector<Vector3d> positions;
|
||||
std::vector<uint32_t> indices;
|
||||
std::vector<uint32_t> eflags;
|
||||
std::vector<ObjVertex> vertices;
|
||||
|
||||
for (int i = 0; i < qrd->totverts; i++) {
|
||||
@@ -114,16 +121,18 @@ void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd,
|
||||
}
|
||||
|
||||
for (int q = 0; q < qrd->totfaces; q++) {
|
||||
Vector3i f(qrd->faces[q * 3], qrd->faces[q * 3 + 1], qrd->faces[q * 3 + 2]);
|
||||
Vector3i f(qrd->faces[q].v[0], qrd->faces[q].v[1], qrd->faces[q].v[2]);
|
||||
|
||||
ObjVertex tri[6];
|
||||
int nVertices = 3;
|
||||
const int nVertices = 3;
|
||||
|
||||
tri[0] = ObjVertex(f[0]);
|
||||
tri[1] = ObjVertex(f[1]);
|
||||
tri[2] = ObjVertex(f[2]);
|
||||
|
||||
for (int i = 0; i < nVertices; ++i) {
|
||||
eflags.push_back(qrd->faces[q].eflag[i]);
|
||||
|
||||
const ObjVertex &v = tri[i];
|
||||
VertexMap::const_iterator it = vertexMap.find(v);
|
||||
if (it == vertexMap.end()) {
|
||||
@@ -138,7 +147,10 @@ void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd,
|
||||
}
|
||||
|
||||
field.F.resize(3, indices.size() / 3);
|
||||
// field.FF.resize(3, indices.size() / 3);
|
||||
|
||||
memcpy(field.F.data(), indices.data(), sizeof(uint32_t) * indices.size());
|
||||
// memcpy(field.FF.data(), eflags.data(), sizeof(uint32_t) * eflags.size());
|
||||
|
||||
field.V.resize(3, vertices.size());
|
||||
for (uint32_t i = 0; i < vertices.size(); ++i) {
|
||||
@@ -157,12 +169,17 @@ void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd,
|
||||
return;
|
||||
}
|
||||
|
||||
const int steps = 2;
|
||||
|
||||
/* Setup mesh boundary constraints if needed */
|
||||
if (field.flag_preserve_boundary) {
|
||||
#if 0
|
||||
if (true) { // field.flag_preserve_boundary) {
|
||||
Hierarchy &mRes = field.hierarchy;
|
||||
mRes.clearConstraints();
|
||||
|
||||
for (uint32_t i = 0; i < 3 * mRes.mF.cols(); ++i) {
|
||||
if (mRes.mE2E[i] == -1) {
|
||||
if (mRes.mFF((i) % 3, i / 3) & QFLOW_CONSTRAINED) {
|
||||
// if (mRes.mE2E[i] == -1) {
|
||||
uint32_t i0 = mRes.mF(i % 3, i / 3);
|
||||
uint32_t i1 = mRes.mF((i + 1) % 3, i / 3);
|
||||
Vector3d p0 = mRes.mV[0].col(i0), p1 = mRes.mV[0].col(i1);
|
||||
@@ -172,15 +189,20 @@ void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd,
|
||||
mRes.mCO[0].col(i0) = p0;
|
||||
mRes.mCO[0].col(i1) = p1;
|
||||
mRes.mCQ[0].col(i0) = mRes.mCQ[0].col(i1) = edge;
|
||||
mRes.mCQw[0][i0] = mRes.mCQw[0][i1] = mRes.mCOw[0][i0] = mRes.mCOw[0][i1] = 1.0;
|
||||
mRes.mCQw[0][i0] = mRes.mCQw[0][i1] = mRes.mCOw[0][i0] = mRes.mCOw[0][i1] = 0.1;
|
||||
}
|
||||
}
|
||||
}
|
||||
mRes.propagateConstraints();
|
||||
for (int j = 0; j < 10; j++) {
|
||||
mRes.propagateConstraints();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Optimize the mesh field orientations (tangental field etc) */
|
||||
Optimizer::optimize_orientations(field.hierarchy);
|
||||
for (int i = 0; i < steps; i++) {
|
||||
Optimizer::optimize_orientations(field.hierarchy);
|
||||
}
|
||||
field.ComputeOrientationSingularities();
|
||||
|
||||
if (check_if_canceled(0.3f, update_cb, update_cb_data)) {
|
||||
@@ -195,11 +217,13 @@ void QFLOW_quadriflow_remesh(QuadriflowRemeshData *qrd,
|
||||
return;
|
||||
}
|
||||
|
||||
Optimizer::optimize_scale(field.hierarchy, field.rho, field.flag_adaptive_scale);
|
||||
field.flag_adaptive_scale = 1;
|
||||
|
||||
Optimizer::optimize_positions(field.hierarchy, field.flag_adaptive_scale);
|
||||
for (int i = 0; i < steps; i++) {
|
||||
Optimizer::optimize_scale(field.hierarchy, field.rho, field.flag_adaptive_scale);
|
||||
}
|
||||
|
||||
for (int i = 0; i < steps; i++) {
|
||||
Optimizer::optimize_positions(field.hierarchy, field.flag_adaptive_scale);
|
||||
}
|
||||
field.ComputePositionSingularities();
|
||||
|
||||
if (check_if_canceled(0.5f, update_cb, update_cb_data)) {
|
||||
|
@@ -23,9 +23,16 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
enum { QFLOW_CONSTRAINED = 1 };
|
||||
|
||||
typedef struct QuadriflowFace {
|
||||
int v[3];
|
||||
char eflag[3];
|
||||
} QuadriflowFace;
|
||||
|
||||
typedef struct QuadriflowRemeshData {
|
||||
float *verts;
|
||||
int *faces;
|
||||
QuadriflowFace *faces;
|
||||
int totfaces;
|
||||
int totverts;
|
||||
|
||||
|
Binary file not shown.
Binary file not shown.
BIN
release/datafiles/icons/brush.sculpt.paint.dat
Normal file
BIN
release/datafiles/icons/brush.sculpt.paint.dat
Normal file
Binary file not shown.
BIN
release/datafiles/icons/brush.sculpt.smear.dat
Normal file
BIN
release/datafiles/icons/brush.sculpt.smear.dat
Normal file
Binary file not shown.
BIN
release/datafiles/icons/brush.sculpt.vcol_boundary.dat
Normal file
BIN
release/datafiles/icons/brush.sculpt.vcol_boundary.dat
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Submodule release/datafiles/locale updated: 8a05b618f0...326997b913
@@ -231,7 +231,7 @@ const UserDef U_default = {
|
||||
.collection_instance_empty_size = 1.0f,
|
||||
|
||||
.statusbar_flag = STATUSBAR_SHOW_VERSION,
|
||||
.file_preview_type = USER_FILE_PREVIEW_CAMERA,
|
||||
.file_preview_type = USER_FILE_PREVIEW_AUTO,
|
||||
|
||||
.runtime =
|
||||
{
|
||||
|
Submodule release/scripts/addons updated: 67f1fbca14...59c8409947
Submodule release/scripts/addons_contrib updated: ef6ef414d2...98f6085e9d
@@ -48,6 +48,7 @@ class SpellChecker:
|
||||
"equi", # equi-angular, etc.
|
||||
"fader",
|
||||
"globbing",
|
||||
"gridded",
|
||||
"haptics",
|
||||
"hasn", # hasn't
|
||||
"hetero",
|
||||
@@ -64,12 +65,14 @@ class SpellChecker:
|
||||
"mplayer",
|
||||
"ons", # add-ons
|
||||
"pong", # ping pong
|
||||
"resumable",
|
||||
"scalable",
|
||||
"shadeless",
|
||||
"shouldn", # shouldn't
|
||||
"smoothen",
|
||||
"spacings",
|
||||
"teleport", "teleporting",
|
||||
"tangency",
|
||||
"vertices",
|
||||
"wasn", # wasn't
|
||||
|
||||
@@ -173,11 +176,13 @@ class SpellChecker:
|
||||
"precalculate",
|
||||
"precomputing",
|
||||
"prefetch",
|
||||
"preload",
|
||||
"premultiply", "premultiplied",
|
||||
"prepass",
|
||||
"prepend",
|
||||
"preprocess", "preprocessing", "preprocessor",
|
||||
"preprocess", "preprocessing", "preprocessor", "preprocessed",
|
||||
"preseek",
|
||||
"preselect", "preselected",
|
||||
"promillage",
|
||||
"pushdown",
|
||||
"raytree",
|
||||
@@ -185,8 +190,10 @@ class SpellChecker:
|
||||
"realtime",
|
||||
"reinject", "reinjected",
|
||||
"rekey",
|
||||
"relink",
|
||||
"remesh",
|
||||
"reprojection", "reproject", "reprojecting",
|
||||
"resample",
|
||||
"resize",
|
||||
"restpose",
|
||||
"resync", "resynced",
|
||||
@@ -226,6 +233,7 @@ class SpellChecker:
|
||||
"todo",
|
||||
"tradeoff",
|
||||
"un",
|
||||
"unadjust", "unadjusted",
|
||||
"unassociate", "unassociated",
|
||||
"unbake",
|
||||
"uncheck",
|
||||
@@ -388,6 +396,7 @@ class SpellChecker:
|
||||
"boid", "boids",
|
||||
"ceil",
|
||||
"compressibility",
|
||||
"coplanar",
|
||||
"curvilinear",
|
||||
"equiangular",
|
||||
"equisolid",
|
||||
@@ -396,6 +405,7 @@ class SpellChecker:
|
||||
"gettext",
|
||||
"hashable",
|
||||
"hotspot",
|
||||
"hydrostatic",
|
||||
"interocular",
|
||||
"intrinsics",
|
||||
"irradiance",
|
||||
@@ -495,6 +505,7 @@ class SpellChecker:
|
||||
"perlin",
|
||||
"phong",
|
||||
"pinlight",
|
||||
"posterize",
|
||||
"qi",
|
||||
"radiosity",
|
||||
"raycast", "raycasting",
|
||||
|
@@ -63,16 +63,11 @@ def kmi_args_as_data(kmi):
|
||||
if kmi.any:
|
||||
s.append("\"any\": True")
|
||||
else:
|
||||
if kmi.shift:
|
||||
s.append("\"shift\": True")
|
||||
if kmi.ctrl:
|
||||
s.append("\"ctrl\": True")
|
||||
if kmi.alt:
|
||||
s.append("\"alt\": True")
|
||||
if kmi.oskey:
|
||||
s.append("\"oskey\": True")
|
||||
if kmi.key_modifier and kmi.key_modifier != 'NONE':
|
||||
s.append(f"\"key_modifier\": '{kmi.key_modifier}'")
|
||||
for attr in ("shift", "ctrl", "alt", "oskey"):
|
||||
if mod := getattr(kmi, attr):
|
||||
s.append(f"\"{attr:s}\": " + ("-1" if mod == -1 else "True"))
|
||||
if (mod := kmi.key_modifier) and (mod != 'NONE'):
|
||||
s.append(f"\"key_modifier\": '{mod:s}'")
|
||||
|
||||
if kmi.repeat:
|
||||
if (
|
||||
|
@@ -199,10 +199,12 @@ def draw_kmi(display_keymaps, kc, km, kmi, layout, level):
|
||||
subrow = sub.row()
|
||||
subrow.scale_x = 0.75
|
||||
subrow.prop(kmi, "any", toggle=True)
|
||||
subrow.prop(kmi, "shift", toggle=True)
|
||||
subrow.prop(kmi, "ctrl", toggle=True)
|
||||
subrow.prop(kmi, "alt", toggle=True)
|
||||
subrow.prop(kmi, "oskey", text="Cmd", toggle=True)
|
||||
# Use `*_ui` properties as integers aren't practical.
|
||||
subrow.prop(kmi, "shift_ui", toggle=True)
|
||||
subrow.prop(kmi, "ctrl_ui", toggle=True)
|
||||
subrow.prop(kmi, "alt_ui", toggle=True)
|
||||
subrow.prop(kmi, "oskey_ui", text="Cmd", toggle=True)
|
||||
|
||||
subrow.prop(kmi, "key_modifier", text="", event=True)
|
||||
|
||||
# Operator properties
|
||||
|
@@ -47,6 +47,7 @@ url_manual_mapping = (
|
||||
("bpy.types.fluiddomainsettings.sndparticle_potential_min_wavecrest*", "physics/fluid/type/domain/liquid/particles.html#bpy-types-fluiddomainsettings-sndparticle-potential-min-wavecrest"),
|
||||
("bpy.types.movietrackingsettings.refine_intrinsics_principal_point*", "movie_clip/tracking/clip/toolbar/solve.html#bpy-types-movietrackingsettings-refine-intrinsics-principal-point"),
|
||||
("bpy.types.cyclesrenderlayersettings.denoising_optix_input_passes*", "render/layers/denoising.html#bpy-types-cyclesrenderlayersettings-denoising-optix-input-passes"),
|
||||
("bpy.types.sequencertoolsettings.use_snap_current_frame_to_strips*", "video_editing/sequencer/editing.html#bpy-types-sequencertoolsettings-use-snap-current-frame-to-strips"),
|
||||
("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"),
|
||||
("bpy.types.movietrackingsettings.refine_intrinsics_focal_length*", "movie_clip/tracking/clip/toolbar/solve.html#bpy-types-movietrackingsettings-refine-intrinsics-focal-length"),
|
||||
@@ -56,6 +57,7 @@ url_manual_mapping = (
|
||||
("bpy.types.fluiddomainsettings.sndparticle_sampling_wavecrest*", "physics/fluid/type/domain/liquid/particles.html#bpy-types-fluiddomainsettings-sndparticle-sampling-wavecrest"),
|
||||
("bpy.types.rigidbodyconstraint.use_override_solver_iterations*", "physics/rigid_body/constraints/introduction.html#bpy-types-rigidbodyconstraint-use-override-solver-iterations"),
|
||||
("bpy.types.toolsettings.use_transform_correct_face_attributes*", "modeling/meshes/tools/tool_settings.html#bpy-types-toolsettings-use-transform-correct-face-attributes"),
|
||||
("bpy.types.rendersettings.use_sequencer_override_scene_strip*", "video_editing/preview/sidebar.html#bpy-types-rendersettings-use-sequencer-override-scene-strip"),
|
||||
("bpy.types.toolsettings.use_transform_correct_keep_connected*", "modeling/meshes/tools/tool_settings.html#bpy-types-toolsettings-use-transform-correct-keep-connected"),
|
||||
("bpy.types.fluiddomainsettings.sndparticle_potential_radius*", "physics/fluid/type/domain/liquid/particles.html#bpy-types-fluiddomainsettings-sndparticle-potential-radius"),
|
||||
("bpy.types.fluiddomainsettings.openvdb_cache_compress_type*", "physics/fluid/type/domain/cache.html#bpy-types-fluiddomainsettings-openvdb-cache-compress-type"),
|
||||
@@ -65,6 +67,8 @@ url_manual_mapping = (
|
||||
("bpy.types.fluiddomainsettings.vector_scale_with_magnitude*", "physics/fluid/type/domain/gas/viewport_display.html#bpy-types-fluiddomainsettings-vector-scale-with-magnitude"),
|
||||
("bpy.types.movietrackingstabilization.use_2d_stabilization*", "movie_clip/tracking/clip/sidebar/stabilization/panel.html#bpy-types-movietrackingstabilization-use-2d-stabilization"),
|
||||
("bpy.types.spacespreadsheet.display_context_path_collapsed*", "editors/spreadsheet.html#bpy-types-spacespreadsheet-display-context-path-collapsed"),
|
||||
("bpy.types.toolsettings.annotation_stroke_placement_view2d*", "interface/annotate_tool.html#bpy-types-toolsettings-annotation-stroke-placement-view2d"),
|
||||
("bpy.types.toolsettings.annotation_stroke_placement_view3d*", "interface/annotate_tool.html#bpy-types-toolsettings-annotation-stroke-placement-view3d"),
|
||||
("bpy.types.fluiddomainsettings.use_collision_border_front*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-use-collision-border-front"),
|
||||
("bpy.types.fluiddomainsettings.use_collision_border_right*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-use-collision-border-right"),
|
||||
("bpy.types.cyclesobjectsettings.use_adaptive_subdivision*", "render/cycles/object_settings/adaptive_subdiv.html#bpy-types-cyclesobjectsettings-use-adaptive-subdivision"),
|
||||
@@ -85,11 +89,15 @@ url_manual_mapping = (
|
||||
("bpy.types.fluiddomainsettings.sndparticle_bubble_drag*", "physics/fluid/type/domain/liquid/particles.html#bpy-types-fluiddomainsettings-sndparticle-bubble-drag"),
|
||||
("bpy.types.linestylegeometrymodifier_backbonestretcher*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/backbone_stretcher.html#bpy-types-linestylegeometrymodifier-backbonestretcher"),
|
||||
("bpy.types.linestylegeometrymodifier_sinusdisplacement*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/sinus_displacement.html#bpy-types-linestylegeometrymodifier-sinusdisplacement"),
|
||||
("bpy.types.sequencertoolsettings.snap_to_current_frame*", "video_editing/sequencer/editing.html#bpy-types-sequencertoolsettings-snap-to-current-frame"),
|
||||
("bpy.types.colormanageddisplaysettings.display_device*", "render/color_management.html#bpy-types-colormanageddisplaysettings-display-device"),
|
||||
("bpy.types.colormanagedviewsettings.use_curve_mapping*", "render/color_management.html#bpy-types-colormanagedviewsettings-use-curve-mapping"),
|
||||
("bpy.types.fluiddomainsettings.color_ramp_field_scale*", "physics/fluid/type/domain/gas/viewport_display.html#bpy-types-fluiddomainsettings-color-ramp-field-scale"),
|
||||
("bpy.types.fluiddomainsettings.use_adaptive_timesteps*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-use-adaptive-timesteps"),
|
||||
("bpy.types.fluiddomainsettings.use_dissolve_smoke_log*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-use-dissolve-smoke-log"),
|
||||
("bpy.types.gpencillayer.annotation_onion_before_color*", "interface/annotate_tool.html#bpy-types-gpencillayer-annotation-onion-before-color"),
|
||||
("bpy.types.gpencillayer.annotation_onion_before_range*", "interface/annotate_tool.html#bpy-types-gpencillayer-annotation-onion-before-range"),
|
||||
("bpy.types.gpencillayer.use_annotation_onion_skinning*", "interface/annotate_tool.html#bpy-types-gpencillayer-use-annotation-onion-skinning"),
|
||||
("bpy.types.greasepencil.use_adaptive_curve_resolution*", "grease_pencil/modes/edit/curve_editing.html#bpy-types-greasepencil-use-adaptive-curve-resolution"),
|
||||
("bpy.types.linestylegeometrymodifier_polygonalization*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/polygonization.html#bpy-types-linestylegeometrymodifier-polygonalization"),
|
||||
("bpy.types.toolsettings.use_gpencil_automerge_strokes*", "grease_pencil/modes/draw/introduction.html#bpy-types-toolsettings-use-gpencil-automerge-strokes"),
|
||||
@@ -102,10 +110,13 @@ url_manual_mapping = (
|
||||
("bpy.types.fluiddomainsettings.gridlines_lower_bound*", "physics/fluid/type/domain/gas/viewport_display.html#bpy-types-fluiddomainsettings-gridlines-lower-bound"),
|
||||
("bpy.types.fluiddomainsettings.gridlines_range_color*", "physics/fluid/type/domain/gas/viewport_display.html#bpy-types-fluiddomainsettings-gridlines-range-color"),
|
||||
("bpy.types.fluiddomainsettings.gridlines_upper_bound*", "physics/fluid/type/domain/gas/viewport_display.html#bpy-types-fluiddomainsettings-gridlines-upper-bound"),
|
||||
("bpy.types.gpencillayer.annotation_onion_after_color*", "interface/annotate_tool.html#bpy-types-gpencillayer-annotation-onion-after-color"),
|
||||
("bpy.types.gpencillayer.annotation_onion_after_range*", "interface/annotate_tool.html#bpy-types-gpencillayer-annotation-onion-after-range"),
|
||||
("bpy.types.materialgpencilstyle.use_fill_texture_mix*", "grease_pencil/materials/properties.html#bpy-types-materialgpencilstyle-use-fill-texture-mix"),
|
||||
("bpy.types.rendersettings_simplify_gpencil_shader_fx*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-gpencil-shader-fx"),
|
||||
("bpy.types.rendersettings_simplify_gpencil_view_fill*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-gpencil-view-fill"),
|
||||
("bpy.types.spacesequenceeditor.waveform_display_type*", "video_editing/sequencer/navigating.html#bpy-types-spacesequenceeditor-waveform-display-type"),
|
||||
("bpy.types.sequencertoolsettings.snap_to_hold_offset*", "video_editing/sequencer/editing.html#bpy-types-sequencertoolsettings-snap-to-hold-offset"),
|
||||
("bpy.types.spacesequenceeditor.waveform_display_type*", "editors/video_sequencer/sequencer/display.html#bpy-types-spacesequenceeditor-waveform-display-type"),
|
||||
("bpy.types.toolsettings.use_mesh_automerge_and_split*", "modeling/meshes/tools/tool_settings.html#bpy-types-toolsettings-use-mesh-automerge-and-split"),
|
||||
("bpy.types.brush.cloth_constraint_softbody_strength*", "sculpt_paint/sculpting/tools/cloth.html#bpy-types-brush-cloth-constraint-softbody-strength"),
|
||||
("bpy.types.brush.elastic_deform_volume_preservation*", "sculpt_paint/sculpting/tools/elastic_deform.html#bpy-types-brush-elastic-deform-volume-preservation"),
|
||||
@@ -145,9 +156,11 @@ url_manual_mapping = (
|
||||
("bpy.types.materialgpencilstyle.use_stroke_holdout*", "grease_pencil/materials/properties.html#bpy-types-materialgpencilstyle-use-stroke-holdout"),
|
||||
("bpy.types.movietrackingsettings.use_tripod_solver*", "movie_clip/tracking/clip/toolbar/solve.html#bpy-types-movietrackingsettings-use-tripod-solver"),
|
||||
("bpy.types.rendersettings.use_high_quality_normals*", "render/eevee/render_settings/performance.html#bpy-types-rendersettings-use-high-quality-normals"),
|
||||
("bpy.types.sequencertoolsettings.snap_ignore_muted*", "video_editing/sequencer/editing.html#bpy-types-sequencertoolsettings-snap-ignore-muted"),
|
||||
("bpy.types.sequencertoolsettings.snap_ignore_sound*", "video_editing/sequencer/editing.html#bpy-types-sequencertoolsettings-snap-ignore-sound"),
|
||||
("bpy.types.spaceoutliner.use_filter_case_sensitive*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-case-sensitive"),
|
||||
("bpy.types.spaceoutliner.use_filter_object_content*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-object-content"),
|
||||
("bpy.types.spacesequenceeditor.show_strip_duration*", "video_editing/sequencer/navigating.html#bpy-types-spacesequenceeditor-show-strip-duration"),
|
||||
("bpy.types.spacesequenceeditor.show_strip_duration*", "editors/video_sequencer/sequencer/display.html#bpy-types-spacesequenceeditor-show-strip-duration"),
|
||||
("bpy.types.toolsettings.use_proportional_connected*", "editors/3dview/controls/proportional_editing.html#bpy-types-toolsettings-use-proportional-connected"),
|
||||
("bpy.types.toolsettings.use_proportional_projected*", "editors/3dview/controls/proportional_editing.html#bpy-types-toolsettings-use-proportional-projected"),
|
||||
("bpy.types.view3doverlay.vertex_paint_mode_opacity*", "editors/3dview/display/overlays.html#bpy-types-view3doverlay-vertex-paint-mode-opacity"),
|
||||
@@ -156,6 +169,7 @@ url_manual_mapping = (
|
||||
("bpy.ops.gpencil.vertex_color_brightness_contrast*", "grease_pencil/modes/vertex_paint/editing.html#bpy-ops-gpencil-vertex-color-brightness-contrast"),
|
||||
("bpy.ops.view3d.edit_mesh_extrude_individual_move*", "modeling/meshes/editing/face/extrude_faces.html#bpy-ops-view3d-edit-mesh-extrude-individual-move"),
|
||||
("bpy.ops.view3d.edit_mesh_extrude_manifold_normal*", "modeling/meshes/tools/extrude_manifold.html#bpy-ops-view3d-edit-mesh-extrude-manifold-normal"),
|
||||
("bpy.types.cyclesobjectsettings.use_distance_cull*", "render/cycles/object_settings/object_data.html#bpy-types-cyclesobjectsettings-use-distance-cull"),
|
||||
("bpy.types.cyclesrendersettings.ao_bounces_render*", "render/cycles/render_settings/light_paths.html#bpy-types-cyclesrendersettings-ao-bounces-render"),
|
||||
("bpy.types.cyclesrendersettings.use_distance_cull*", "render/cycles/render_settings/simplify.html#bpy-types-cyclesrendersettings-use-distance-cull"),
|
||||
("bpy.types.fluiddomainsettings.cache_frame_offset*", "physics/fluid/type/domain/cache.html#bpy-types-fluiddomainsettings-cache-frame-offset"),
|
||||
@@ -180,6 +194,7 @@ url_manual_mapping = (
|
||||
("bpy.types.spacedopesheeteditor.show_pose_markers*", "animation/markers.html#bpy-types-spacedopesheeteditor-show-pose-markers"),
|
||||
("bpy.types.spaceoutliner.use_filter_object_camera*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-object-camera"),
|
||||
("bpy.types.spaceoutliner.use_filter_object_others*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-object-others"),
|
||||
("bpy.types.spacesequenceeditor.show_strip_overlay*", "editors/video_sequencer/sequencer/display.html#bpy-types-spacesequenceeditor-show-strip-overlay"),
|
||||
("bpy.types.toolsettings.proportional_edit_falloff*", "editors/3dview/controls/proportional_editing.html#bpy-types-toolsettings-proportional-edit-falloff"),
|
||||
("bpy.types.toolsettings.use_edge_path_live_unwrap*", "modeling/meshes/tools/tool_settings.html#bpy-types-toolsettings-use-edge-path-live-unwrap"),
|
||||
("bpy.types.toolsettings.use_gpencil_draw_additive*", "grease_pencil/modes/draw/introduction.html#bpy-types-toolsettings-use-gpencil-draw-additive"),
|
||||
@@ -214,8 +229,8 @@ url_manual_mapping = (
|
||||
("bpy.types.spaceoutliner.use_filter_object_empty*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-object-empty"),
|
||||
("bpy.types.spaceoutliner.use_filter_object_light*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-object-light"),
|
||||
("bpy.types.spacesequenceeditor.proxy_render_size*", "video_editing/preview/sidebar.html#bpy-types-spacesequenceeditor-proxy-render-size"),
|
||||
("bpy.types.spacesequenceeditor.show_strip_offset*", "video_editing/sequencer/navigating.html#bpy-types-spacesequenceeditor-show-strip-offset"),
|
||||
("bpy.types.spacesequenceeditor.show_strip_source*", "video_editing/sequencer/navigating.html#bpy-types-spacesequenceeditor-show-strip-source"),
|
||||
("bpy.types.spacesequenceeditor.show_strip_offset*", "editors/video_sequencer/sequencer/display.html#bpy-types-spacesequenceeditor-show-strip-offset"),
|
||||
("bpy.types.spacesequenceeditor.show_strip_source*", "editors/video_sequencer/sequencer/display.html#bpy-types-spacesequenceeditor-show-strip-source"),
|
||||
("bpy.types.spacespreadsheetrowfilter.column_name*", "editors/spreadsheet.html#bpy-types-spacespreadsheetrowfilter-column-name"),
|
||||
("bpy.types.toolsettings.gpencil_stroke_placement*", "grease_pencil/modes/draw/stroke_placement.html#bpy-types-toolsettings-gpencil-stroke-placement"),
|
||||
("bpy.types.toolsettings.use_keyframe_cycle_aware*", "editors/timeline.html#bpy-types-toolsettings-use-keyframe-cycle-aware"),
|
||||
@@ -223,6 +238,7 @@ url_manual_mapping = (
|
||||
("bpy.types.viewlayer.use_pass_cryptomatte_object*", "render/layers/passes.html#bpy-types-viewlayer-use-pass-cryptomatte-object"),
|
||||
("bpy.ops.armature.rigify_apply_selection_colors*", "addons/rigging/rigify/metarigs.html#bpy-ops-armature-rigify-apply-selection-colors"),
|
||||
("bpy.types.brushgpencilsettings.fill_layer_mode*", "grease_pencil/modes/draw/tools/fill.html#bpy-types-brushgpencilsettings-fill-layer-mode"),
|
||||
("bpy.types.cyclesobjectsettings.use_camera_cull*", "render/cycles/object_settings/object_data.html#bpy-types-cyclesobjectsettings-use-camera-cull"),
|
||||
("bpy.types.cyclesrendersettings.use_camera_cull*", "render/cycles/render_settings/simplify.html#bpy-types-cyclesrendersettings-use-camera-cull"),
|
||||
("bpy.types.editbone.bbone_handle_use_ease_start*", "animation/armatures/bones/properties/bendy_bones.html#bpy-types-editbone-bbone-handle-use-ease-start"),
|
||||
("bpy.types.fluiddomainsettings.color_ramp_field*", "physics/fluid/type/domain/gas/viewport_display.html#bpy-types-fluiddomainsettings-color-ramp-field"),
|
||||
@@ -232,7 +248,7 @@ url_manual_mapping = (
|
||||
("bpy.types.linestylegeometrymodifier_tipremover*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/tip_remover.html#bpy-types-linestylegeometrymodifier-tipremover"),
|
||||
("bpy.types.movieclipuser.use_render_undistorted*", "editors/clip/display/clip_display.html#bpy-types-movieclipuser-use-render-undistorted"),
|
||||
("bpy.types.movietrackingcamera.distortion_model*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-types-movietrackingcamera-distortion-model"),
|
||||
("bpy.types.rendersettings.resolution_percentage*", "render/output/properties/dimensions.html#bpy-types-rendersettings-resolution-percentage"),
|
||||
("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.spaceoutliner.use_filter_object_mesh*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-object-mesh"),
|
||||
("bpy.types.spaceoutliner.use_filter_view_layers*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-view-layers"),
|
||||
@@ -267,6 +283,7 @@ url_manual_mapping = (
|
||||
("bpy.types.linestylegeometrymodifier_blueprint*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/blueprint.html#bpy-types-linestylegeometrymodifier-blueprint"),
|
||||
("bpy.types.materialgpencilstyle.alignment_mode*", "grease_pencil/materials/properties.html#bpy-types-materialgpencilstyle-alignment-mode"),
|
||||
("bpy.types.particlesettings.use_modifier_stack*", "physics/particles/emitter/emission.html#bpy-types-particlesettings-use-modifier-stack"),
|
||||
("bpy.types.rendersettings.sequencer_gl_preview*", "video_editing/preview/sidebar.html#bpy-types-rendersettings-sequencer-gl-preview"),
|
||||
("bpy.types.rendersettings.simplify_subdivision*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-subdivision"),
|
||||
("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"),
|
||||
@@ -274,7 +291,7 @@ url_manual_mapping = (
|
||||
("bpy.types.spacesequenceeditor.show_annotation*", "video_editing/preview/introduction.html#bpy-types-spacesequenceeditor-show-annotation"),
|
||||
("bpy.types.spacesequenceeditor.show_region_hud*", "video_editing/sequencer/navigating.html#bpy-types-spacesequenceeditor-show-region-hud"),
|
||||
("bpy.types.spacesequenceeditor.show_safe_areas*", "video_editing/preview/introduction.html#bpy-types-spacesequenceeditor-show-safe-areas"),
|
||||
("bpy.types.spacesequenceeditor.show_strip_name*", "video_editing/sequencer/navigating.html#bpy-types-spacesequenceeditor-show-strip-name"),
|
||||
("bpy.types.spacesequenceeditor.show_strip_name*", "editors/video_sequencer/sequencer/display.html#bpy-types-spacesequenceeditor-show-strip-name"),
|
||||
("bpy.types.spacespreadsheet.show_only_selected*", "editors/spreadsheet.html#bpy-types-spacespreadsheet-show-only-selected"),
|
||||
("bpy.types.spacespreadsheetrowfilter.operation*", "editors/spreadsheet.html#bpy-types-spacespreadsheetrowfilter-operation"),
|
||||
("bpy.types.spacespreadsheetrowfilter.threshold*", "editors/spreadsheet.html#bpy-types-spacespreadsheetrowfilter-threshold"),
|
||||
@@ -313,6 +330,7 @@ url_manual_mapping = (
|
||||
("bpy.types.linestylegeometrymodifier_sampling*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/sampling.html#bpy-types-linestylegeometrymodifier-sampling"),
|
||||
("bpy.types.nodesocketinterface*.default_value*", "interface/controls/nodes/groups.html#bpy-types-nodesocketinterface-default-value"),
|
||||
("bpy.types.rendersettings.use_persistent_data*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-use-persistent-data"),
|
||||
("bpy.types.sequencertoolsettings.overlap_mode*", "video_editing/sequencer/editing.html#bpy-types-sequencertoolsettings-overlap-mode"),
|
||||
("bpy.types.spaceclipeditor.show_green_channel*", "editors/clip/display/clip_display.html#bpy-types-spaceclipeditor-show-green-channel"),
|
||||
("bpy.types.spaceoutliner.show_restrict_column*", "editors/outliner/interface.html#bpy-types-spaceoutliner-show-restrict-column"),
|
||||
("bpy.types.spacespreadsheet.object_eval_state*", "editors/spreadsheet.html#bpy-types-spacespreadsheet-object-eval-state"),
|
||||
@@ -339,10 +357,10 @@ url_manual_mapping = (
|
||||
("bpy.types.materialgpencilstyle.stroke_style*", "grease_pencil/materials/properties.html#bpy-types-materialgpencilstyle-stroke-style"),
|
||||
("bpy.types.objectlineart.use_crease_override*", "scene_layout/object/properties/line_art.html#bpy-types-objectlineart-use-crease-override"),
|
||||
("bpy.types.rendersettings.preview_pixel_size*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-preview-pixel-size"),
|
||||
("bpy.types.rendersettings.use_crop_to_border*", "render/output/properties/dimensions.html#bpy-types-rendersettings-use-crop-to-border"),
|
||||
("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.spaceclipeditor.annotation_source*", "movie_clip/tracking/clip/sidebar/annotation.html#bpy-types-spaceclipeditor-annotation-source"),
|
||||
("bpy.types.spaceclipeditor.annotation_source*", "movie_clip/tracking/clip/sidebar/view.html#bpy-types-spaceclipeditor-annotation-source"),
|
||||
("bpy.types.spaceclipeditor.show_blue_channel*", "editors/clip/display/clip_display.html#bpy-types-spaceclipeditor-show-blue-channel"),
|
||||
("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"),
|
||||
@@ -388,7 +406,7 @@ url_manual_mapping = (
|
||||
("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"),
|
||||
("bpy.types.spacesequenceeditor.overlay_type*", "video_editing/preview/sidebar.html#bpy-types-spacesequenceeditor-overlay-type"),
|
||||
("bpy.types.spacesequenceeditor.show_fcurves*", "video_editing/sequencer/navigating.html#bpy-types-spacesequenceeditor-show-fcurves"),
|
||||
("bpy.types.spacesequenceeditor.show_fcurves*", "editors/video_sequencer/sequencer/display.html#bpy-types-spacesequenceeditor-show-fcurves"),
|
||||
("bpy.types.spaceuveditor.sticky_select_mode*", "editors/uv/selecting.html#bpy-types-spaceuveditor-sticky-select-mode"),
|
||||
("bpy.types.spaceview3d.show_object_viewport*", "editors/3dview/display/visibility.html#bpy-types-spaceview3d-show-object-viewport"),
|
||||
("bpy.types.view3doverlay.show_fade_inactive*", "editors/3dview/display/overlays.html#bpy-types-view3doverlay-show-fade-inactive"),
|
||||
@@ -396,6 +414,7 @@ url_manual_mapping = (
|
||||
("bpy.ops.clip.stabilize_2d_rotation_select*", "movie_clip/tracking/clip/selecting.html#bpy-ops-clip-stabilize-2d-rotation-select"),
|
||||
("bpy.ops.constraint.disable_keep_transform*", "animation/constraints/interface/common.html#bpy-ops-constraint-disable-keep-transform"),
|
||||
("bpy.ops.gpencil.stroke_reset_vertex_color*", "grease_pencil/modes/vertex_paint/editing.html#bpy-ops-gpencil-stroke-reset-vertex-color"),
|
||||
("bpy.ops.object.modifier_apply_as_shapekey*", "modeling/modifiers/introduction.html#bpy-ops-object-modifier-apply-as-shapekey"),
|
||||
("bpy.ops.object.vertex_group_normalize_all*", "sculpt_paint/weight_paint/editing.html#bpy-ops-object-vertex-group-normalize-all"),
|
||||
("bpy.ops.outliner.collection_color_tag_set*", "editors/outliner/editing.html#bpy-ops-outliner-collection-color-tag-set"),
|
||||
("bpy.ops.outliner.collection_enable_render*", "editors/outliner/editing.html#bpy-ops-outliner-collection-enable-render"),
|
||||
@@ -417,6 +436,7 @@ url_manual_mapping = (
|
||||
("bpy.types.fluidflowsettings.flow_behavior*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-flow-behavior"),
|
||||
("bpy.types.fluidflowsettings.noise_texture*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-noise-texture"),
|
||||
("bpy.types.geometrynodeattributevectormath*", "modeling/geometry_nodes/attribute/attribute_vector_math.html#bpy-types-geometrynodeattributevectormath"),
|
||||
("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"),
|
||||
("bpy.types.gpencilsculptguide.use_snapping*", "grease_pencil/modes/draw/guides.html#bpy-types-gpencilsculptguide-use-snapping"),
|
||||
("bpy.types.gpencilsculptsettings.lock_axis*", "grease_pencil/modes/draw/drawing_planes.html#bpy-types-gpencilsculptsettings-lock-axis"),
|
||||
@@ -443,6 +463,7 @@ url_manual_mapping = (
|
||||
("bpy.types.toolsettings.gpencil_selectmode*", "grease_pencil/selecting.html#bpy-types-toolsettings-gpencil-selectmode"),
|
||||
("bpy.types.toolsettings.use_auto_normalize*", "sculpt_paint/weight_paint/tool_settings/options.html#bpy-types-toolsettings-use-auto-normalize"),
|
||||
("bpy.types.toolsettings.use_mesh_automerge*", "modeling/meshes/tools/tool_settings.html#bpy-types-toolsettings-use-mesh-automerge"),
|
||||
("bpy.types.toolsettings.use_snap_sequencer*", "video_editing/sequencer/editing.html#bpy-types-toolsettings-use-snap-sequencer"),
|
||||
("bpy.types.toolsettings.use_snap_translate*", "editors/3dview/controls/snapping.html#bpy-types-toolsettings-use-snap-translate"),
|
||||
("bpy.types.toolsettings.use_uv_select_sync*", "editors/uv/selecting.html#bpy-types-toolsettings-use-uv-select-sync"),
|
||||
("bpy.types.view3doverlay.wireframe_opacity*", "editors/3dview/display/overlays.html#bpy-types-view3doverlay-wireframe-opacity"),
|
||||
@@ -469,7 +490,6 @@ url_manual_mapping = (
|
||||
("bpy.types.fluiddomainsettings.flip_ratio*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-flip-ratio"),
|
||||
("bpy.types.fluiddomainsettings.guide_beta*", "physics/fluid/type/domain/guides.html#bpy-types-fluiddomainsettings-guide-beta"),
|
||||
("bpy.types.fluiddomainsettings.mesh_scale*", "physics/fluid/type/domain/liquid/mesh.html#bpy-types-fluiddomainsettings-mesh-scale"),
|
||||
("bpy.types.fluiddomainsettings.noise_type*", "physics/fluid/type/domain/gas/noise.html#bpy-types-fluiddomainsettings-noise-type"),
|
||||
("bpy.types.fluiddomainsettings.slice_axis*", "physics/fluid/type/domain/gas/viewport_display.html#bpy-types-fluiddomainsettings-slice-axis"),
|
||||
("bpy.types.fluiddomainsettings.time_scale*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-time-scale"),
|
||||
("bpy.types.fluidflowsettings.texture_size*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-texture-size"),
|
||||
@@ -534,7 +554,7 @@ url_manual_mapping = (
|
||||
("bpy.types.fluidflowsettings.smoke_color*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-smoke-color"),
|
||||
("bpy.types.fluidflowsettings.temperature*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-temperature"),
|
||||
("bpy.types.fluidflowsettings.use_texture*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-use-texture"),
|
||||
("bpy.types.fmodifierenvelopecontrolpoint*", "editors/graph_editor/fcurves/sidebar/modifiers.html#bpy-types-fmodifierenvelopecontrolpoint"),
|
||||
("bpy.types.fmodifierenvelopecontrolpoint*", "editors/graph_editor/fcurves/modifiers.html#bpy-types-fmodifierenvelopecontrolpoint"),
|
||||
("bpy.types.geometrynodeattributecurvemap*", "modeling/geometry_nodes/attribute/attribute_curve_map.html#bpy-types-geometrynodeattributecurvemap"),
|
||||
("bpy.types.geometrynodeattributemaprange*", "modeling/geometry_nodes/attribute/attribute_map_range.html#bpy-types-geometrynodeattributemaprange"),
|
||||
("bpy.types.geometrynodeattributetransfer*", "modeling/geometry_nodes/attribute/attribute_transfer.html#bpy-types-geometrynodeattributetransfer"),
|
||||
@@ -543,13 +563,15 @@ url_manual_mapping = (
|
||||
("bpy.types.material.use_sss_translucency*", "render/eevee/materials/settings.html#bpy-types-material-use-sss-translucency"),
|
||||
("bpy.types.movietrackingcamera.principal*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-types-movietrackingcamera-principal"),
|
||||
("bpy.types.object.use_camera_lock_parent*", "scene_layout/object/properties/relations.html#bpy-types-object-use-camera-lock-parent"),
|
||||
("bpy.types.rendersettings.pixel_aspect_x*", "render/output/properties/dimensions.html#bpy-types-rendersettings-pixel-aspect-x"),
|
||||
("bpy.types.rendersettings.pixel_aspect_y*", "render/output/properties/dimensions.html#bpy-types-rendersettings-pixel-aspect-y"),
|
||||
("bpy.types.object.visible_volume_scatter*", "render/cycles/object_settings/object_data.html#bpy-types-object-visible-volume-scatter"),
|
||||
("bpy.types.rendersettings.pixel_aspect_x*", "render/output/properties/format.html#bpy-types-rendersettings-pixel-aspect-x"),
|
||||
("bpy.types.rendersettings.pixel_aspect_y*", "render/output/properties/format.html#bpy-types-rendersettings-pixel-aspect-y"),
|
||||
("bpy.types.rigidbodyconstraint.use_limit*", "physics/rigid_body/constraints/introduction.html#bpy-types-rigidbodyconstraint-use-limit"),
|
||||
("bpy.types.sceneeevee.taa_render_samples*", "render/eevee/render_settings/sampling.html#bpy-types-sceneeevee-taa-render-samples"),
|
||||
("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"),
|
||||
("bpy.types.spacesequenceeditor.view_type*", "editors/video_sequencer/introduction.html#bpy-types-spacesequenceeditor-view-type"),
|
||||
("bpy.types.spacetexteditor.margin_column*", "editors/text_editor.html#bpy-types-spacetexteditor-margin-column"),
|
||||
("bpy.types.spacetexteditor.use_find_wrap*", "editors/text_editor.html#bpy-types-spacetexteditor-use-find-wrap"),
|
||||
("bpy.types.spaceuveditor.pixel_snap_mode*", "modeling/meshes/uv/editing.html#bpy-types-spaceuveditor-pixel-snap-mode"),
|
||||
@@ -586,9 +608,10 @@ url_manual_mapping = (
|
||||
("bpy.types.material.preview_render_type*", "render/materials/preview.html#bpy-types-material-preview-render-type"),
|
||||
("bpy.types.materialgpencilstyle.pattern*", "grease_pencil/materials/properties.html#bpy-types-materialgpencilstyle-pattern"),
|
||||
("bpy.types.materialgpencilstyle.texture*", "grease_pencil/materials/properties.html#bpy-types-materialgpencilstyle-texture"),
|
||||
("bpy.types.modifier.use_apply_on_spline*", "modeling/modifiers/introduction.html#bpy-types-modifier-use-apply-on-spline"),
|
||||
("bpy.types.object.use_empty_image_alpha*", "modeling/empties.html#bpy-types-object-use-empty-image-alpha"),
|
||||
("bpy.types.rendersettings.frame_map_new*", "render/output/properties/dimensions.html#bpy-types-rendersettings-frame-map-new"),
|
||||
("bpy.types.rendersettings.frame_map_old*", "render/output/properties/dimensions.html#bpy-types-rendersettings-frame-map-old"),
|
||||
("bpy.types.rendersettings.frame_map_new*", "render/output/properties/frame_range.html#bpy-types-rendersettings-frame-map-new"),
|
||||
("bpy.types.rendersettings.frame_map_old*", "render/output/properties/frame_range.html#bpy-types-rendersettings-frame-map-old"),
|
||||
("bpy.types.rendersettings.use_overwrite*", "render/output/properties/output.html#bpy-types-rendersettings-use-overwrite"),
|
||||
("bpy.types.rendersettings.use_sequencer*", "render/output/properties/post_processing.html#bpy-types-rendersettings-use-sequencer"),
|
||||
("bpy.types.sceneeevee.volumetric_shadow*", "render/eevee/render_settings/volumetrics.html#bpy-types-sceneeevee-volumetric-shadow"),
|
||||
@@ -613,6 +636,7 @@ url_manual_mapping = (
|
||||
("bpy.ops.mesh.primitive_ico_sphere_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-ico-sphere-add"),
|
||||
("bpy.ops.object.gpencil_modifier_apply*", "grease_pencil/modifiers/introduction.html#bpy-ops-object-gpencil-modifier-apply"),
|
||||
("bpy.ops.object.material_slot_deselect*", "render/materials/assignment.html#bpy-ops-object-material-slot-deselect"),
|
||||
("bpy.ops.object.modifier_move_to_index*", "modeling/modifiers/introduction.html#bpy-ops-object-modifier-move-to-index"),
|
||||
("bpy.ops.object.multires_external_save*", "modeling/modifiers/generate/multiresolution.html#bpy-ops-object-multires-external-save"),
|
||||
("bpy.ops.object.vertex_group_normalize*", "sculpt_paint/weight_paint/editing.html#bpy-ops-object-vertex-group-normalize"),
|
||||
("bpy.ops.object.visual_transform_apply*", "scene_layout/object/editing/apply.html#bpy-ops-object-visual-transform-apply"),
|
||||
@@ -645,11 +669,12 @@ url_manual_mapping = (
|
||||
("bpy.types.linestyle*modifier_material*", "render/freestyle/parameter_editor/line_style/modifiers/color/material.html#bpy-types-linestyle-modifier-material"),
|
||||
("bpy.types.movietrackingcamera.brown_k*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-types-movietrackingcamera-brown-k"),
|
||||
("bpy.types.movietrackingcamera.brown_p*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-types-movietrackingcamera-brown-p"),
|
||||
("bpy.types.object.visible_transmission*", "render/cycles/object_settings/object_data.html#bpy-types-object-visible-transmission"),
|
||||
("bpy.types.particlesettingstextureslot*", "physics/particles/texture_influence.html#bpy-types-particlesettingstextureslot"),
|
||||
("bpy.types.posebone.ik_rotation_weight*", "animation/armatures/posing/bone_constraints/inverse_kinematics/introduction.html#bpy-types-posebone-ik-rotation-weight"),
|
||||
("bpy.types.regionview3d.show_sync_view*", "editors/3dview/navigate/views.html#bpy-types-regionview3d-show-sync-view"),
|
||||
("bpy.types.rendersettings.resolution_x*", "render/output/properties/dimensions.html#bpy-types-rendersettings-resolution-x"),
|
||||
("bpy.types.rendersettings.resolution_y*", "render/output/properties/dimensions.html#bpy-types-rendersettings-resolution-y"),
|
||||
("bpy.types.rendersettings.resolution_x*", "render/output/properties/format.html#bpy-types-rendersettings-resolution-x"),
|
||||
("bpy.types.rendersettings.resolution_y*", "render/output/properties/format.html#bpy-types-rendersettings-resolution-y"),
|
||||
("bpy.types.rendersettings.threads_mode*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-threads-mode"),
|
||||
("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"),
|
||||
@@ -700,7 +725,7 @@ url_manual_mapping = (
|
||||
("bpy.types.compositornodekeyingscreen*", "compositing/types/matte/keying_screen.html#bpy-types-compositornodekeyingscreen"),
|
||||
("bpy.types.dynamicpaintcanvassettings*", "physics/dynamic_paint/canvas.html#bpy-types-dynamicpaintcanvassettings"),
|
||||
("bpy.types.fluidflowsettings.use_flow*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-use-flow"),
|
||||
("bpy.types.fmodifierfunctiongenerator*", "editors/graph_editor/fcurves/sidebar/modifiers.html#bpy-types-fmodifierfunctiongenerator"),
|
||||
("bpy.types.fmodifierfunctiongenerator*", "editors/graph_editor/fcurves/modifiers.html#bpy-types-fmodifierfunctiongenerator"),
|
||||
("bpy.types.geometrynodeattributeclamp*", "modeling/geometry_nodes/attribute/attribute_clamp.html#bpy-types-geometrynodeattributeclamp"),
|
||||
("bpy.types.geometrynodecollectioninfo*", "modeling/geometry_nodes/input/collection_info.html#bpy-types-geometrynodecollectioninfo"),
|
||||
("bpy.types.geometrynodecurveendpoints*", "modeling/geometry_nodes/curve/curve_endpoints.html#bpy-types-geometrynodecurveendpoints"),
|
||||
@@ -710,6 +735,7 @@ url_manual_mapping = (
|
||||
("bpy.types.geometrynodepointstovolume*", "modeling/geometry_nodes/volume/points_to_volume.html#bpy-types-geometrynodepointstovolume"),
|
||||
("bpy.types.geometrynodepointtranslate*", "modeling/geometry_nodes/point/point_translate.html#bpy-types-geometrynodepointtranslate"),
|
||||
("bpy.types.greasepencil.use_multiedit*", "grease_pencil/multiframe.html#bpy-types-greasepencil-use-multiedit"),
|
||||
("bpy.types.keyframe.handle_right_type*", "editors/graph_editor/fcurves/properties.html#bpy-types-keyframe-handle-right-type"),
|
||||
("bpy.types.materialgpencilstyle.color*", "grease_pencil/materials/properties.html#bpy-types-materialgpencilstyle-color"),
|
||||
("bpy.types.movietrackingcamera.nuke_k*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-types-movietrackingcamera-nuke-k"),
|
||||
("bpy.types.movietrackingstabilization*", "movie_clip/tracking/clip/sidebar/stabilization/index.html#bpy-types-movietrackingstabilization"),
|
||||
@@ -728,6 +754,7 @@ url_manual_mapping = (
|
||||
("bpy.types.toolsettings.use_snap_self*", "editors/3dview/controls/snapping.html#bpy-types-toolsettings-use-snap-self"),
|
||||
("bpy.types.viewlayer.active_aov_index*", "render/layers/passes.html#bpy-types-viewlayer-active-aov-index"),
|
||||
("bpy.ops.anim.channels_enable_toggle*", "editors/graph_editor/channels.html#bpy-ops-anim-channels-enable-toggle"),
|
||||
("bpy.ops.constraint.copy_to_selected*", "animation/constraints/interface/header.html#bpy-ops-constraint-copy-to-selected"),
|
||||
("bpy.ops.gpencil.bake_mesh_animation*", "grease_pencil/animation/tools.html#bpy-ops-gpencil-bake-mesh-animation"),
|
||||
("bpy.ops.gpencil.select_vertex_color*", "grease_pencil/selecting.html#bpy-ops-gpencil-select-vertex-color"),
|
||||
("bpy.ops.gpencil.set_active_material*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-set-active-material"),
|
||||
@@ -778,13 +805,15 @@ url_manual_mapping = (
|
||||
("bpy.types.geometrynodepointinstance*", "modeling/geometry_nodes/point/point_instance.html#bpy-types-geometrynodepointinstance"),
|
||||
("bpy.types.geometrynodepointseparate*", "modeling/geometry_nodes/point/point_separate.html#bpy-types-geometrynodepointseparate"),
|
||||
("bpy.types.geometrynoderesamplecurve*", "modeling/geometry_nodes/curve/resample_curve.html#bpy-types-geometrynoderesamplecurve"),
|
||||
("bpy.types.keyframe.handle_left_type*", "editors/graph_editor/fcurves/properties.html#bpy-types-keyframe-handle-left-type"),
|
||||
("bpy.types.light.use_custom_distance*", "render/eevee/lighting.html#bpy-types-light-use-custom-distance"),
|
||||
("bpy.types.materialgpencilstyle.flip*", "grease_pencil/materials/properties.html#bpy-types-materialgpencilstyle-flip"),
|
||||
("bpy.types.materialgpencilstyle.mode*", "grease_pencil/materials/properties.html#bpy-types-materialgpencilstyle-mode"),
|
||||
("bpy.types.modifier.show_in_editmode*", "modeling/modifiers/introduction.html#bpy-types-modifier-show-in-editmode"),
|
||||
("bpy.types.object.empty_display_size*", "modeling/empties.html#bpy-types-object-empty-display-size"),
|
||||
("bpy.types.object.empty_display_type*", "modeling/empties.html#bpy-types-object-empty-display-type"),
|
||||
("bpy.types.regionview3d.use_box_clip*", "editors/3dview/navigate/views.html#bpy-types-regionview3d-use-box-clip"),
|
||||
("bpy.types.rendersettings.use_border*", "render/output/properties/dimensions.html#bpy-types-rendersettings-use-border"),
|
||||
("bpy.types.rendersettings.use_border*", "render/output/properties/format.html#bpy-types-rendersettings-use-border"),
|
||||
("bpy.types.rigidbodyconstraint.limit*", "physics/rigid_body/constraints/introduction.html#bpy-types-rigidbodyconstraint-limit"),
|
||||
("bpy.types.rigidbodyobject.kinematic*", "physics/rigid_body/properties/settings.html#bpy-types-rigidbodyobject-kinematic"),
|
||||
("bpy.types.scene.audio_doppler_speed*", "scene_layout/scene/properties.html#bpy-types-scene-audio-doppler-speed"),
|
||||
@@ -848,7 +877,6 @@ url_manual_mapping = (
|
||||
("bpy.types.copytransformsconstraint*", "animation/constraints/transform/copy_transforms.html#bpy-types-copytransformsconstraint"),
|
||||
("bpy.types.correctivesmoothmodifier*", "modeling/modifiers/deform/corrective_smooth.html#bpy-types-correctivesmoothmodifier"),
|
||||
("bpy.types.curve.bevel_factor_start*", "modeling/curves/properties/geometry.html#bpy-types-curve-bevel-factor-start"),
|
||||
("bpy.types.cyclesvisibilitysettings*", "render/cycles/object_settings/object_data.html#bpy-types-cyclesvisibilitysettings"),
|
||||
("bpy.types.fluiddomainsettings.beta*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-beta"),
|
||||
("bpy.types.fluidmodifier.fluid_type*", "physics/fluid/type/index.html#bpy-types-fluidmodifier-fluid-type"),
|
||||
("bpy.types.functionnodefloatcompare*", "modeling/geometry_nodes/utilities/float_compare.html#bpy-types-functionnodefloatcompare"),
|
||||
@@ -865,6 +893,7 @@ url_manual_mapping = (
|
||||
("bpy.types.mesh.use_mirror_topology*", "modeling/meshes/tools/tool_settings.html#bpy-types-mesh-use-mirror-topology"),
|
||||
("bpy.types.movieclip.display_aspect*", "editors/clip/display/clip_display.html#bpy-types-movieclip-display-aspect"),
|
||||
("bpy.types.nodesocketinterface.name*", "interface/controls/nodes/groups.html#bpy-types-nodesocketinterface-name"),
|
||||
("bpy.types.object.is_shadow_catcher*", "render/cycles/object_settings/object_data.html#bpy-types-object-is-shadow-catcher"),
|
||||
("bpy.types.particleinstancemodifier*", "modeling/modifiers/physics/particle_instance.html#bpy-types-particleinstancemodifier"),
|
||||
("bpy.types.sequencetransform.offset*", "video_editing/sequencer/sidebar/strip.html#bpy-types-sequencetransform-offset"),
|
||||
("bpy.types.shadernodebrightcontrast*", "render/shader_nodes/color/bright_contrast.html#bpy-types-shadernodebrightcontrast"),
|
||||
@@ -955,7 +984,7 @@ url_manual_mapping = (
|
||||
("bpy.types.limitrotationconstraint*", "animation/constraints/transform/limit_rotation.html#bpy-types-limitrotationconstraint"),
|
||||
("bpy.types.multiplygpencilmodifier*", "grease_pencil/modifiers/generate/multiple_strokes.html#bpy-types-multiplygpencilmodifier"),
|
||||
("bpy.types.rendersettings.filepath*", "render/output/properties/output.html#bpy-types-rendersettings-filepath"),
|
||||
("bpy.types.rendersettings.fps_base*", "render/output/properties/dimensions.html#bpy-types-rendersettings-fps-base"),
|
||||
("bpy.types.rendersettings.fps_base*", "render/output/properties/format.html#bpy-types-rendersettings-fps-base"),
|
||||
("bpy.types.rigidbodyobject.enabled*", "physics/rigid_body/properties/settings.html#bpy-types-rigidbodyobject-enabled"),
|
||||
("bpy.types.sceneeevee.use_overscan*", "render/eevee/render_settings/film.html#bpy-types-sceneeevee-use-overscan"),
|
||||
("bpy.types.sequencetransform.scale*", "video_editing/sequencer/sidebar/strip.html#bpy-types-sequencetransform-scale"),
|
||||
@@ -965,13 +994,13 @@ url_manual_mapping = (
|
||||
("bpy.types.shadernodevolumescatter*", "render/shader_nodes/shader/volume_scatter.html#bpy-types-shadernodevolumescatter"),
|
||||
("bpy.types.simplifygpencilmodifier*", "grease_pencil/modifiers/generate/simplify.html#bpy-types-simplifygpencilmodifier"),
|
||||
("bpy.types.spacegrapheditor.cursor*", "editors/graph_editor/introduction.html#bpy-types-spacegrapheditor-cursor"),
|
||||
("bpy.types.toolsettings.annotation*", "interface/annotate_tool.html#bpy-types-toolsettings-annotation"),
|
||||
("bpy.types.vertexweightmixmodifier*", "modeling/modifiers/modify/weight_mix.html#bpy-types-vertexweightmixmodifier"),
|
||||
("bpy.types.viewlayer.use_freestyle*", "render/freestyle/view_layer.html#bpy-types-viewlayer-use-freestyle"),
|
||||
("bpy.types.volumedisplay.use_slice*", "modeling/volumes/properties.html#bpy-types-volumedisplay-use-slice"),
|
||||
("bpy.ops.armature.armature_layers*", "animation/armatures/bones/editing/change_layers.html#bpy-ops-armature-armature-layers"),
|
||||
("bpy.ops.armature.select_linked()*", "animation/armatures/bones/selecting.html#bpy-ops-armature-select-linked"),
|
||||
("bpy.ops.clip.stabilize_2d_select*", "movie_clip/tracking/clip/selecting.html#bpy-ops-clip-stabilize-2d-select"),
|
||||
("bpy.ops.constraint.move_to_index*", "animation/constraints/interface/header.html#bpy-ops-constraint-move-to-index"),
|
||||
("bpy.ops.gpencil.frame_clean_fill*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-frame-clean-fill"),
|
||||
("bpy.ops.gpencil.stroke_subdivide*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-subdivide"),
|
||||
("bpy.ops.gpencil.vertex_color_hsv*", "grease_pencil/modes/vertex_paint/editing.html#bpy-ops-gpencil-vertex-color-hsv"),
|
||||
@@ -994,7 +1023,7 @@ url_manual_mapping = (
|
||||
("bpy.ops.outliner.collection_hide*", "editors/outliner/editing.html#bpy-ops-outliner-collection-hide"),
|
||||
("bpy.ops.outliner.collection_show*", "editors/outliner/editing.html#bpy-ops-outliner-collection-show"),
|
||||
("bpy.ops.paint.mask_lasso_gesture*", "sculpt_paint/sculpting/editing/mask.html#bpy-ops-paint-mask-lasso-gesture"),
|
||||
("bpy.ops.rigidbody.mass_calculate*", "physics/rigid_body/editing.html#bpy-ops-rigidbody-mass-calculate"),
|
||||
("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.sequencer.duplicate_move*", "video_editing/sequencer/editing.html#bpy-ops-sequencer-duplicate-move"),
|
||||
@@ -1045,9 +1074,12 @@ url_manual_mapping = (
|
||||
("bpy.types.geometrynodepointscale*", "modeling/geometry_nodes/point/point_scale.html#bpy-types-geometrynodepointscale"),
|
||||
("bpy.types.imagepaint.use_occlude*", "sculpt_paint/texture_paint/tool_settings/options.html#bpy-types-imagepaint-use-occlude"),
|
||||
("bpy.types.imagesequence.use_flip*", "video_editing/sequencer/sidebar/strip.html#bpy-types-imagesequence-use-flip"),
|
||||
("bpy.types.keyframe.interpolation*", "editors/graph_editor/fcurves/properties.html#bpy-types-keyframe-interpolation"),
|
||||
("bpy.types.latticegpencilmodifier*", "grease_pencil/modifiers/deform/lattice.html#bpy-types-latticegpencilmodifier"),
|
||||
("bpy.types.lineartgpencilmodifier*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier"),
|
||||
("bpy.types.mesh.auto_smooth_angle*", "modeling/meshes/structure.html#bpy-types-mesh-auto-smooth-angle"),
|
||||
("bpy.types.modifier.show_viewport*", "modeling/modifiers/introduction.html#bpy-types-modifier-show-viewport"),
|
||||
("bpy.types.object.visible_diffuse*", "render/cycles/object_settings/object_data.html#bpy-types-object-visible-diffuse"),
|
||||
("bpy.types.objectsolverconstraint*", "animation/constraints/motion_tracking/object_solver.html#bpy-types-objectsolverconstraint"),
|
||||
("bpy.types.opacitygpencilmodifier*", "grease_pencil/modifiers/color/opacity.html#bpy-types-opacitygpencilmodifier"),
|
||||
("bpy.types.particlesystemmodifier*", "physics/particles/index.html#bpy-types-particlesystemmodifier"),
|
||||
@@ -1143,6 +1175,7 @@ url_manual_mapping = (
|
||||
("bpy.types.dopesheet.filter_text*", "editors/graph_editor/channels.html#bpy-types-dopesheet-filter-text"),
|
||||
("bpy.types.editbone.bbone_easein*", "animation/armatures/bones/properties/bendy_bones.html#bpy-types-editbone-bbone-easein"),
|
||||
("bpy.types.editbone.bbone_rollin*", "animation/armatures/bones/properties/bendy_bones.html#bpy-types-editbone-bbone-rollin"),
|
||||
("bpy.types.fcurve.auto_smoothing*", "editors/graph_editor/fcurves/properties.html#bpy-types-fcurve-auto-smoothing"),
|
||||
("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.geometrynodecurveline*", "modeling/geometry_nodes/curve_primitives/line.html#bpy-types-geometrynodecurveline"),
|
||||
@@ -1151,12 +1184,17 @@ url_manual_mapping = (
|
||||
("bpy.types.geometrynodeedgesplit*", "modeling/geometry_nodes/mesh/edge_split.html#bpy-types-geometrynodeedgesplit"),
|
||||
("bpy.types.geometrynodetransform*", "modeling/geometry_nodes/geometry/transform.html#bpy-types-geometrynodetransform"),
|
||||
("bpy.types.gpencilsculptsettings*", "grease_pencil/properties/index.html#bpy-types-gpencilsculptsettings"),
|
||||
("bpy.types.keyframe.handle_right*", "editors/graph_editor/fcurves/properties.html#bpy-types-keyframe-handle-right"),
|
||||
("bpy.types.light.cutoff_distance*", "render/eevee/lighting.html#bpy-types-light-cutoff-distance"),
|
||||
("bpy.types.lockedtrackconstraint*", "animation/constraints/tracking/locked_track.html#bpy-types-lockedtrackconstraint"),
|
||||
("bpy.types.material.blend_method*", "render/eevee/materials/settings.html#bpy-types-material-blend-method"),
|
||||
("bpy.types.mirrorgpencilmodifier*", "grease_pencil/modifiers/generate/mirror.html#bpy-types-mirrorgpencilmodifier"),
|
||||
("bpy.types.modifier.show_on_cage*", "modeling/modifiers/introduction.html#bpy-types-modifier-show-on-cage"),
|
||||
("bpy.types.movietrackingcamera.k*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-types-movietrackingcamera-k"),
|
||||
("bpy.types.node.use_custom_color*", "interface/controls/nodes/sidebar.html#bpy-types-node-use-custom-color"),
|
||||
("bpy.types.object.visible_camera*", "render/cycles/object_settings/object_data.html#bpy-types-object-visible-camera"),
|
||||
("bpy.types.object.visible_glossy*", "render/cycles/object_settings/object_data.html#bpy-types-object-visible-glossy"),
|
||||
("bpy.types.object.visible_shadow*", "render/cycles/object_settings/object_data.html#bpy-types-object-visible-shadow"),
|
||||
("bpy.types.offsetgpencilmodifier*", "grease_pencil/modifiers/deform/offset.html#bpy-types-offsetgpencilmodifier"),
|
||||
("bpy.types.posebone.custom_shape*", "animation/armatures/bones/properties/display.html#bpy-types-posebone-custom-shape"),
|
||||
("bpy.types.rendersettings.tile_x*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-tile-x"),
|
||||
@@ -1192,6 +1230,7 @@ url_manual_mapping = (
|
||||
("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.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"),
|
||||
("bpy.ops.object.transform_apply*", "scene_layout/object/editing/apply.html#bpy-ops-object-transform-apply"),
|
||||
("bpy.ops.outliner.lib_operation*", "files/linked_libraries/link_append.html#bpy-ops-outliner-lib-operation"),
|
||||
@@ -1232,11 +1271,13 @@ url_manual_mapping = (
|
||||
("bpy.types.geometrynodemeshline*", "modeling/geometry_nodes/mesh_primitives/line.html#bpy-types-geometrynodemeshline"),
|
||||
("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"),
|
||||
("bpy.types.keyingsetsall.active*", "editors/timeline.html#bpy-types-keyingsetsall-active"),
|
||||
("bpy.types.limitscaleconstraint*", "animation/constraints/transform/limit_scale.html#bpy-types-limitscaleconstraint"),
|
||||
("bpy.types.materialgpencilstyle*", "grease_pencil/materials/index.html#bpy-types-materialgpencilstyle"),
|
||||
("bpy.types.mesh.use_auto_smooth*", "modeling/meshes/structure.html#bpy-types-mesh-use-auto-smooth"),
|
||||
("bpy.types.meshtovolumemodifier*", "modeling/modifiers/generate/mesh_to_volume.html#bpy-types-meshtovolumemodifier"),
|
||||
("bpy.types.modifier.show_render*", "modeling/modifiers/introduction.html#bpy-types-modifier-show-render"),
|
||||
("bpy.types.noisegpencilmodifier*", "grease_pencil/modifiers/deform/noise.html#bpy-types-noisegpencilmodifier"),
|
||||
("bpy.types.object.hide_viewport*", "scene_layout/object/properties/visibility.html#bpy-types-object-hide-viewport"),
|
||||
("bpy.types.posebone.rigify_type*", "addons/rigging/rigify/rig_types/index.html#bpy-types-posebone-rigify-type"),
|
||||
@@ -1291,6 +1332,7 @@ url_manual_mapping = (
|
||||
("bpy.ops.node.tree_socket_move*", "interface/controls/nodes/groups.html#bpy-ops-node-tree-socket-move"),
|
||||
("bpy.ops.object.duplicate_move*", "scene_layout/object/editing/duplicate.html#bpy-ops-object-duplicate-move"),
|
||||
("bpy.ops.object.hook_add_selob*", "modeling/meshes/editing/vertex/hooks.html#bpy-ops-object-hook-add-selob"),
|
||||
("bpy.ops.object.modifier_apply*", "modeling/modifiers/introduction.html#bpy-ops-object-modifier-apply"),
|
||||
("bpy.ops.object.select_by_type*", "scene_layout/object/selecting.html#bpy-ops-object-select-by-type"),
|
||||
("bpy.ops.object.select_grouped*", "scene_layout/object/selecting.html#bpy-ops-object-select-grouped"),
|
||||
("bpy.ops.object.select_pattern*", "scene_layout/object/selecting.html#bpy-ops-object-select-pattern"),
|
||||
@@ -1402,6 +1444,7 @@ url_manual_mapping = (
|
||||
("bpy.ops.node.read_viewlayers*", "interface/controls/nodes/editing.html#bpy-ops-node-read-viewlayers"),
|
||||
("bpy.ops.node.tree_socket_add*", "interface/controls/nodes/groups.html#bpy-ops-node-tree-socket-add"),
|
||||
("bpy.ops.object.data_transfer*", "scene_layout/object/editing/link_transfer/transfer_mesh_data.html#bpy-ops-object-data-transfer"),
|
||||
("bpy.ops.object.modifier_copy*", "modeling/modifiers/introduction.html#bpy-ops-object-modifier-copy"),
|
||||
("bpy.ops.object.select_camera*", "scene_layout/object/selecting.html#bpy-ops-object-select-camera"),
|
||||
("bpy.ops.object.select_linked*", "scene_layout/object/selecting.html#bpy-ops-object-select-linked"),
|
||||
("bpy.ops.object.select_mirror*", "scene_layout/object/selecting.html#bpy-ops-object-select-mirror"),
|
||||
@@ -1436,13 +1479,15 @@ url_manual_mapping = (
|
||||
("bpy.types.compositornodemask*", "compositing/types/input/mask.html#bpy-types-compositornodemask"),
|
||||
("bpy.types.compositornodemath*", "compositing/types/converter/math.html#bpy-types-compositornodemath"),
|
||||
("bpy.types.compositornodetime*", "compositing/types/input/time.html#bpy-types-compositornodetime"),
|
||||
("bpy.types.constraint.enabled*", "animation/constraints/interface/header.html#bpy-types-constraint-enabled"),
|
||||
("bpy.types.curve.bevel_object*", "modeling/curves/properties/geometry.html#bpy-types-curve-bevel-object"),
|
||||
("bpy.types.curve.resolution_u*", "modeling/curves/properties/shape.html#bpy-types-curve-resolution-u"),
|
||||
("bpy.types.curve.resolution_v*", "modeling/surfaces/properties/shape.html#bpy-types-curve-resolution-v"),
|
||||
("bpy.types.curve.taper_object*", "modeling/curves/properties/geometry.html#bpy-types-curve-taper-object"),
|
||||
("bpy.types.curve.twist_smooth*", "modeling/curves/properties/shape.html#bpy-types-curve-twist-smooth"),
|
||||
("bpy.types.curvepaintsettings*", "modeling/curves/tools/draw.html#bpy-types-curvepaintsettings"),
|
||||
("bpy.types.fmodifiergenerator*", "editors/graph_editor/fcurves/sidebar/modifiers.html#bpy-types-fmodifiergenerator"),
|
||||
("bpy.types.fcurve.array_index*", "editors/graph_editor/fcurves/properties.html#bpy-types-fcurve-array-index"),
|
||||
("bpy.types.fmodifiergenerator*", "editors/graph_editor/fcurves/modifiers.html#bpy-types-fmodifiergenerator"),
|
||||
("bpy.types.freestylelinestyle*", "render/freestyle/parameter_editor/line_style/index.html#bpy-types-freestylelinestyle"),
|
||||
("bpy.types.gammacrosssequence*", "video_editing/sequencer/strips/transitions/gamma_cross.html#bpy-types-gammacrosssequence"),
|
||||
("bpy.types.geometrynodeswitch*", "modeling/geometry_nodes/utilities/switch.html#bpy-types-geometrynodeswitch"),
|
||||
@@ -1459,7 +1504,7 @@ url_manual_mapping = (
|
||||
("bpy.types.object.hide_select*", "scene_layout/object/properties/visibility.html#bpy-types-object-hide-select"),
|
||||
("bpy.types.object.parent_type*", "scene_layout/object/properties/relations.html#bpy-types-object-parent-type"),
|
||||
("bpy.types.object.show_bounds*", "scene_layout/object/properties/display.html#bpy-types-object-show-bounds"),
|
||||
("bpy.types.rendersettings.fps*", "render/output/properties/dimensions.html#bpy-types-rendersettings-fps"),
|
||||
("bpy.types.rendersettings.fps*", "render/output/properties/format.html#bpy-types-rendersettings-fps"),
|
||||
("bpy.types.scene.audio_volume*", "scene_layout/scene/properties.html#bpy-types-scene-audio-volume"),
|
||||
("bpy.types.sculpt.detail_size*", "sculpt_paint/sculpting/tool_settings/dyntopo.html#bpy-types-sculpt-detail-size"),
|
||||
("bpy.types.shadernodebsdfhair*", "render/shader_nodes/shader/hair.html#bpy-types-shadernodebsdfhair"),
|
||||
@@ -1558,8 +1603,9 @@ url_manual_mapping = (
|
||||
("bpy.types.curve.bevel_depth*", "modeling/curves/properties/geometry.html#bpy-types-curve-bevel-depth"),
|
||||
("bpy.types.curve.use_stretch*", "modeling/curves/properties/shape.html#bpy-types-curve-use-stretch"),
|
||||
("bpy.types.edgesplitmodifier*", "modeling/modifiers/generate/edge_split.html#bpy-types-edgesplitmodifier"),
|
||||
("bpy.types.fcurve.color_mode*", "editors/graph_editor/fcurves/properties.html#bpy-types-fcurve-color-mode"),
|
||||
("bpy.types.fluidflowsettings*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings"),
|
||||
("bpy.types.fmodifierenvelope*", "editors/graph_editor/fcurves/sidebar/modifiers.html#bpy-types-fmodifierenvelope"),
|
||||
("bpy.types.fmodifierenvelope*", "editors/graph_editor/fcurves/modifiers.html#bpy-types-fmodifierenvelope"),
|
||||
("bpy.types.freestylesettings*", "render/freestyle/view_layer.html#bpy-types-freestylesettings"),
|
||||
("bpy.types.geometrynodegroup*", "modeling/geometry_nodes/group.html#bpy-types-geometrynodegroup"),
|
||||
("bpy.types.gpencillayer.hide*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-hide"),
|
||||
@@ -1573,12 +1619,13 @@ url_manual_mapping = (
|
||||
("bpy.types.meshcachemodifier*", "modeling/modifiers/modify/mesh_cache.html#bpy-types-meshcachemodifier"),
|
||||
("bpy.types.movieclipsequence*", "video_editing/sequencer/strips/clip.html#bpy-types-movieclipsequence"),
|
||||
("bpy.types.object.dimensions*", "scene_layout/object/properties/transforms.html#bpy-types-object-dimensions"),
|
||||
("bpy.types.object.is_holdout*", "scene_layout/object/properties/visibility.html#bpy-types-object-is-holdout"),
|
||||
("bpy.types.object.pass_index*", "scene_layout/object/properties/relations.html#bpy-types-object-pass-index"),
|
||||
("bpy.types.object.track_axis*", "scene_layout/object/properties/relations.html#bpy-types-object-track-axis"),
|
||||
("bpy.types.pose.use_mirror_x*", "animation/armatures/posing/tool_settings.html#bpy-types-pose-use-mirror-x"),
|
||||
("bpy.types.preferencessystem*", "editors/preferences/system.html#bpy-types-preferencessystem"),
|
||||
("bpy.types.scene.active_clip*", "scene_layout/scene/properties.html#bpy-types-scene-active-clip"),
|
||||
("bpy.types.scene.frame_start*", "render/output/properties/dimensions.html#bpy-types-scene-frame-start"),
|
||||
("bpy.types.scene.frame_start*", "render/output/properties/frame_range.html#bpy-types-scene-frame-start"),
|
||||
("bpy.types.sceneeevee.shadow*", "render/eevee/render_settings/shadows.html#bpy-types-sceneeevee-shadow"),
|
||||
("bpy.types.screen.use_follow*", "editors/timeline.html#bpy-types-screen-use-follow"),
|
||||
("bpy.types.sequencetransform*", "video_editing/sequencer/sidebar/strip.html#bpy-types-sequencetransform"),
|
||||
@@ -1661,7 +1708,8 @@ url_manual_mapping = (
|
||||
("bpy.types.displaysafeareas*", "render/cameras.html#bpy-types-displaysafeareas"),
|
||||
("bpy.types.editbone.bbone_x*", "animation/armatures/bones/properties/bendy_bones.html#bpy-types-editbone-bbone-x"),
|
||||
("bpy.types.editbone.bbone_z*", "animation/armatures/bones/properties/bendy_bones.html#bpy-types-editbone-bbone-z"),
|
||||
("bpy.types.fmodifierstepped*", "editors/graph_editor/fcurves/sidebar/modifiers.html#bpy-types-fmodifierstepped"),
|
||||
("bpy.types.fcurve.data_path*", "editors/graph_editor/fcurves/properties.html#bpy-types-fcurve-data-path"),
|
||||
("bpy.types.fmodifierstepped*", "editors/graph_editor/fcurves/modifiers.html#bpy-types-fmodifierstepped"),
|
||||
("bpy.types.freestylelineset*", "render/freestyle/parameter_editor/line_set.html#bpy-types-freestylelineset"),
|
||||
("bpy.types.mask.frame_start*", "movie_clip/masking/sidebar.html#bpy-types-mask-frame-start"),
|
||||
("bpy.types.mesh.*customdata*", "modeling/meshes/properties/custom_data.html#bpy-types-mesh-customdata"),
|
||||
@@ -1675,7 +1723,7 @@ url_manual_mapping = (
|
||||
("bpy.types.pose.use_auto_ik*", "animation/armatures/posing/tool_settings.html#bpy-types-pose-use-auto-ik"),
|
||||
("bpy.types.preferencesinput*", "editors/preferences/input.html#bpy-types-preferencesinput"),
|
||||
("bpy.types.rigifyparameters*", "addons/rigging/rigify/rig_types/index.html#bpy-types-rigifyparameters"),
|
||||
("bpy.types.scene.frame_step*", "render/output/properties/dimensions.html#bpy-types-scene-frame-step"),
|
||||
("bpy.types.scene.frame_step*", "render/output/properties/frame_range.html#bpy-types-scene-frame-step"),
|
||||
("bpy.types.sceneeevee.bloom*", "render/eevee/render_settings/bloom.html#bpy-types-sceneeevee-bloom"),
|
||||
("bpy.types.sculpt.show_mask*", "sculpt_paint/sculpting/editing/mask.html#bpy-types-sculpt-show-mask"),
|
||||
("bpy.types.sequence.channel*", "video_editing/sequencer/sidebar/strip.html#bpy-types-sequence-channel"),
|
||||
@@ -1708,6 +1756,7 @@ url_manual_mapping = (
|
||||
("bpy.ops.clip.clean_tracks*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-clean-tracks"),
|
||||
("bpy.ops.clip.delete_track*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-delete-track"),
|
||||
("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.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"),
|
||||
@@ -1751,15 +1800,16 @@ url_manual_mapping = (
|
||||
("bpy.types.booleanmodifier*", "modeling/modifiers/generate/booleans.html#bpy-types-booleanmodifier"),
|
||||
("bpy.types.brush.mask_tool*", "sculpt_paint/sculpting/tools/mask.html#bpy-types-brush-mask-tool"),
|
||||
("bpy.types.constraint.mute*", "animation/constraints/interface/header.html#bpy-types-constraint-mute"),
|
||||
("bpy.types.constraint.name*", "animation/constraints/interface/header.html#bpy-types-constraint-name"),
|
||||
("bpy.types.curve.eval_time*", "modeling/curves/properties/path_animation.html#bpy-types-curve-eval-time"),
|
||||
("bpy.types.curve.fill_mode*", "modeling/curves/properties/shape.html#bpy-types-curve-fill-mode"),
|
||||
("bpy.types.editbone.layers*", "animation/armatures/bones/properties/relations.html#bpy-types-editbone-layers"),
|
||||
("bpy.types.editbone.parent*", "animation/armatures/bones/properties/relations.html#bpy-types-editbone-parent"),
|
||||
("bpy.types.explodemodifier*", "modeling/modifiers/physics/explode.html#bpy-types-explodemodifier"),
|
||||
("bpy.types.fcurvemodifiers*", "editors/graph_editor/fcurves/sidebar/modifiers.html#bpy-types-fcurvemodifiers"),
|
||||
("bpy.types.fcurvemodifiers*", "editors/graph_editor/fcurves/modifiers.html#bpy-types-fcurvemodifiers"),
|
||||
("bpy.types.floorconstraint*", "animation/constraints/relationship/floor.html#bpy-types-floorconstraint"),
|
||||
("bpy.types.fmodifiercycles*", "editors/graph_editor/fcurves/sidebar/modifiers.html#bpy-types-fmodifiercycles"),
|
||||
("bpy.types.fmodifierlimits*", "editors/graph_editor/fcurves/sidebar/modifiers.html#bpy-types-fmodifierlimits"),
|
||||
("bpy.types.fmodifiercycles*", "editors/graph_editor/fcurves/modifiers.html#bpy-types-fmodifiercycles"),
|
||||
("bpy.types.fmodifierlimits*", "editors/graph_editor/fcurves/modifiers.html#bpy-types-fmodifierlimits"),
|
||||
("bpy.types.imagepaint.mode*", "sculpt_paint/texture_paint/tool_settings/texture_slots.html#bpy-types-imagepaint-mode"),
|
||||
("bpy.types.latticemodifier*", "modeling/modifiers/deform/lattice.html#bpy-types-latticemodifier"),
|
||||
("bpy.types.musgravetexture*", "render/materials/legacy_textures/types/musgrave.html#bpy-types-musgravetexture"),
|
||||
@@ -1770,7 +1820,7 @@ url_manual_mapping = (
|
||||
("bpy.types.preferencesedit*", "editors/preferences/editing.html#bpy-types-preferencesedit"),
|
||||
("bpy.types.preferencesview*", "editors/preferences/interface.html#bpy-types-preferencesview"),
|
||||
("bpy.types.rigidbodyobject*", "physics/rigid_body/index.html#bpy-types-rigidbodyobject"),
|
||||
("bpy.types.scene.frame_end*", "render/output/properties/dimensions.html#bpy-types-scene-frame-end"),
|
||||
("bpy.types.scene.frame_end*", "render/output/properties/frame_range.html#bpy-types-scene-frame-end"),
|
||||
("bpy.types.sceneeevee.gtao*", "render/eevee/render_settings/ambient_occlusion.html#bpy-types-sceneeevee-gtao"),
|
||||
("bpy.types.screen.use_play*", "editors/timeline.html#bpy-types-screen-use-play"),
|
||||
("bpy.types.shadernodebevel*", "render/shader_nodes/input/bevel.html#bpy-types-shadernodebevel"),
|
||||
@@ -1786,6 +1836,7 @@ url_manual_mapping = (
|
||||
("bpy.types.texturenodemath*", "editors/texture_node/types/converter/math.html#bpy-types-texturenodemath"),
|
||||
("bpy.types.volume.filepath*", "modeling/volumes/properties.html#bpy-types-volume-filepath"),
|
||||
("bpy.ops.clip.join_tracks*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-join-tracks"),
|
||||
("bpy.ops.constraint.apply*", "animation/constraints/interface/header.html#bpy-ops-constraint-apply"),
|
||||
("bpy.ops.curve.select_row*", "modeling/surfaces/selecting.html#bpy-ops-curve-select-row"),
|
||||
("bpy.ops.curve.tilt_clear*", "modeling/curves/editing/control_points.html#bpy-ops-curve-tilt-clear"),
|
||||
("bpy.ops.curve.vertex_add*", "modeling/curves/editing/other.html#bpy-ops-curve-vertex-add"),
|
||||
@@ -1829,7 +1880,8 @@ url_manual_mapping = (
|
||||
("bpy.types.brush.hardness*", "sculpt_paint/sculpting/tool_settings/brush_settings.html#bpy-types-brush-hardness"),
|
||||
("bpy.types.curvesmodifier*", "video_editing/sequencer/sidebar/modifiers.html#bpy-types-curvesmodifier"),
|
||||
("bpy.types.ffmpegsettings*", "render/output/properties/output.html#bpy-types-ffmpegsettings"),
|
||||
("bpy.types.fmodifiernoise*", "editors/graph_editor/fcurves/sidebar/modifiers.html#bpy-types-fmodifiernoise"),
|
||||
("bpy.types.fmodifiernoise*", "editors/graph_editor/fcurves/modifiers.html#bpy-types-fmodifiernoise"),
|
||||
("bpy.types.keyframe.co_ui*", "editors/graph_editor/fcurves/properties.html#bpy-types-keyframe-co-ui"),
|
||||
("bpy.types.mask.frame_end*", "movie_clip/masking/sidebar.html#bpy-types-mask-frame-end"),
|
||||
("bpy.types.material.paint*", "sculpt_paint/texture_paint/index.html#bpy-types-material-paint"),
|
||||
("bpy.types.mirrormodifier*", "modeling/modifiers/generate/mirror.html#bpy-types-mirrormodifier"),
|
||||
@@ -1861,6 +1913,7 @@ url_manual_mapping = (
|
||||
("bpy.ops.clip.select_all*", "movie_clip/tracking/clip/selecting.html#bpy-ops-clip-select-all"),
|
||||
("bpy.ops.clip.select_box*", "movie_clip/tracking/clip/selecting.html#bpy-ops-clip-select-box"),
|
||||
("bpy.ops.clip.set_origin*", "movie_clip/tracking/clip/editing/reconstruction.html#bpy-ops-clip-set-origin"),
|
||||
("bpy.ops.constraint.copy*", "animation/constraints/interface/header.html#bpy-ops-constraint-copy"),
|
||||
("bpy.ops.curve.subdivide*", "modeling/curves/editing/segments.html#bpy-ops-curve-subdivide"),
|
||||
("bpy.ops.ed.undo_history*", "interface/undo_redo.html#bpy-ops-ed-undo-history"),
|
||||
("bpy.ops.file.unpack_all*", "files/blend/packed_data.html#bpy-ops-file-unpack-all"),
|
||||
@@ -1924,6 +1977,7 @@ url_manual_mapping = (
|
||||
("bpy.types.fieldsettings*", "physics/forces/force_fields/index.html#bpy-types-fieldsettings"),
|
||||
("bpy.types.imagesequence*", "video_editing/sequencer/strips/image.html#bpy-types-imagesequence"),
|
||||
("bpy.types.marbletexture*", "render/materials/legacy_textures/types/marble.html#bpy-types-marbletexture"),
|
||||
("bpy.types.modifier.name*", "modeling/modifiers/introduction.html#bpy-types-modifier-name"),
|
||||
("bpy.types.modifier.show*", "modeling/modifiers/introduction.html#bpy-types-modifier-show"),
|
||||
("bpy.types.moviesequence*", "video_editing/sequencer/strips/movie.html#bpy-types-moviesequence"),
|
||||
("bpy.types.movietracking*", "movie_clip/tracking/index.html#bpy-types-movietracking"),
|
||||
@@ -2106,6 +2160,7 @@ url_manual_mapping = (
|
||||
("bpy.types.compositor*", "compositing/index.html#bpy-types-compositor"),
|
||||
("bpy.types.constraint*", "animation/constraints/index.html#bpy-types-constraint"),
|
||||
("bpy.types.imagepaint*", "sculpt_paint/texture_paint/index.html#bpy-types-imagepaint"),
|
||||
("bpy.types.keymapitem*", "editors/preferences/keymap.html#bpy-types-keymapitem"),
|
||||
("bpy.types.lightprobe*", "render/eevee/light_probes/index.html#bpy-types-lightprobe"),
|
||||
("bpy.types.maskparent*", "movie_clip/masking/sidebar.html#bpy-types-maskparent"),
|
||||
("bpy.types.maskspline*", "movie_clip/masking/sidebar.html#bpy-types-maskspline"),
|
||||
@@ -2142,7 +2197,7 @@ url_manual_mapping = (
|
||||
("bpy.types.bone.hide*", "animation/armatures/bones/properties/display.html#bpy-types-bone-hide"),
|
||||
("bpy.types.colorramp*", "interface/controls/templates/color_ramp.html#bpy-types-colorramp"),
|
||||
("bpy.types.dopesheet*", "editors/dope_sheet/index.html#bpy-types-dopesheet"),
|
||||
("bpy.types.fmodifier*", "editors/graph_editor/fcurves/sidebar/modifiers.html#bpy-types-fmodifier"),
|
||||
("bpy.types.fmodifier*", "editors/graph_editor/fcurves/modifiers.html#bpy-types-fmodifier"),
|
||||
("bpy.types.freestyle*", "render/freestyle/index.html#bpy-types-freestyle"),
|
||||
("bpy.types.masklayer*", "movie_clip/masking/sidebar.html#bpy-types-masklayer"),
|
||||
("bpy.types.movieclip*", "movie_clip/index.html#bpy-types-movieclip"),
|
||||
|
@@ -85,9 +85,9 @@ class ASSET_OT_open_containing_blend_file(Operator):
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
asset_file_handle = getattr(context, 'asset_file_handle', None)
|
||||
asset_library = getattr(context, 'asset_library', None)
|
||||
asset_library_ref = getattr(context, 'asset_library_ref', None)
|
||||
|
||||
if not asset_library:
|
||||
if not asset_library_ref:
|
||||
cls.poll_message_set("No asset library selected")
|
||||
return False
|
||||
if not asset_file_handle:
|
||||
@@ -100,13 +100,13 @@ class ASSET_OT_open_containing_blend_file(Operator):
|
||||
|
||||
def execute(self, context):
|
||||
asset_file_handle = context.asset_file_handle
|
||||
asset_library = context.asset_library
|
||||
asset_library_ref = context.asset_library_ref
|
||||
|
||||
if asset_file_handle.local_id:
|
||||
self.report({'WARNING'}, "This asset is stored in the current blend file")
|
||||
return {'CANCELLED'}
|
||||
|
||||
asset_lib_path = bpy.types.AssetHandle.get_full_library_path(asset_file_handle, asset_library)
|
||||
asset_lib_path = bpy.types.AssetHandle.get_full_library_path(asset_file_handle, asset_library_ref)
|
||||
self.open_in_new_blender(asset_lib_path)
|
||||
|
||||
wm = context.window_manager
|
||||
|
@@ -42,8 +42,8 @@ def geometry_node_group_empty_new():
|
||||
def geometry_modifier_poll(context):
|
||||
ob = context.object
|
||||
|
||||
# Test object support for geometry node modifier (No curve, or hair object support yet)
|
||||
if not ob or ob.type not in {'MESH', 'POINTCLOUD', 'VOLUME'}:
|
||||
# Test object support for geometry node modifier (No hair object support yet)
|
||||
if not ob or ob.type not in {'MESH', 'POINTCLOUD', 'VOLUME', 'CURVE', 'FONT'}:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
@@ -120,7 +120,6 @@ class DATA_PT_shape_curve(CurveButtonsPanel, Panel):
|
||||
sub = col.column()
|
||||
sub.active = (curve.dimensions == '2D' or (curve.bevel_mode != 'OBJECT' and curve.dimensions == '3D'))
|
||||
sub.prop(curve, "fill_mode")
|
||||
col.prop(curve, "use_fill_deform")
|
||||
|
||||
if is_curve:
|
||||
col = layout.column()
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -417,6 +417,7 @@ class MASK_MT_select(Menu):
|
||||
|
||||
layout.operator("mask.select_box")
|
||||
layout.operator("mask.select_circle")
|
||||
layout.operator_menu_enum("mask.select_lasso", "mode")
|
||||
|
||||
layout.separator()
|
||||
|
||||
|
@@ -549,15 +549,27 @@ def brush_settings(layout, context, brush, popover=False):
|
||||
if context.preferences.experimental.use_sculpt_tools_tilt and capabilities.has_tilt:
|
||||
layout.prop(brush, "tilt_strength_factor", slider=True)
|
||||
|
||||
UnifiedPaintPanel.prop_unified(
|
||||
layout,
|
||||
context,
|
||||
brush,
|
||||
"hard_edge_mode",
|
||||
slider=True,
|
||||
unified_name="use_unified_hard_edge_mode",
|
||||
)
|
||||
|
||||
row = layout.row(align=True)
|
||||
|
||||
row.prop(brush, "hardness", slider=True)
|
||||
row.prop(brush, "invert_hardness_pressure", text="")
|
||||
row.prop(brush, "use_hardness_pressure", text="")
|
||||
|
||||
# auto_smooth_factor and use_inverse_smooth_pressure
|
||||
if capabilities.has_auto_smooth:
|
||||
box = layout.box().column() #.column() is a bit more compact
|
||||
|
||||
UnifiedPaintPanel.prop_unified(
|
||||
layout,
|
||||
box,
|
||||
context,
|
||||
brush,
|
||||
"auto_smooth_factor",
|
||||
@@ -565,13 +577,70 @@ def brush_settings(layout, context, brush, popover=False):
|
||||
slider=True,
|
||||
)
|
||||
|
||||
# topology_rake_factor
|
||||
box.prop(brush, "boundary_smooth_factor")
|
||||
box.prop(brush, "use_weighted_smooth")
|
||||
box.prop(brush, "preserve_faceset_boundary")
|
||||
|
||||
if brush.preserve_faceset_boundary:
|
||||
box.prop(brush, "autosmooth_fset_slide")
|
||||
|
||||
box.prop(brush, "use_custom_auto_smooth_spacing", text="Custom Spacing")
|
||||
if brush.use_custom_auto_smooth_spacing:
|
||||
UnifiedPaintPanel.prop_unified(
|
||||
box,
|
||||
context,
|
||||
brush,
|
||||
"auto_smooth_spacing",
|
||||
slider=True,
|
||||
text="Spacing"
|
||||
)
|
||||
UnifiedPaintPanel.prop_unified(
|
||||
box,
|
||||
context,
|
||||
brush,
|
||||
"auto_smooth_projection",
|
||||
slider=True
|
||||
)
|
||||
UnifiedPaintPanel.prop_unified(
|
||||
box,
|
||||
context,
|
||||
brush,
|
||||
"auto_smooth_radius_factor",
|
||||
slider=True
|
||||
)
|
||||
elif brush.sculpt_tool == "SMOOTH":
|
||||
UnifiedPaintPanel.prop_unified(
|
||||
layout,
|
||||
context,
|
||||
brush,
|
||||
"auto_smooth_projection",
|
||||
slider=True
|
||||
)
|
||||
|
||||
|
||||
if capabilities.has_vcol_boundary_smooth:
|
||||
layout.prop(brush, "vcol_boundary_factor", slider=True)
|
||||
|
||||
if (
|
||||
capabilities.has_topology_rake and
|
||||
context.sculpt_object.use_dynamic_topology_sculpting
|
||||
):
|
||||
layout.prop(brush, "topology_rake_factor", slider=True)
|
||||
box = layout.box().column() #.column() is a bit more compact
|
||||
|
||||
box.prop(brush, "topology_rake_factor", slider=True)
|
||||
box.prop(brush, "use_custom_topology_rake_spacing", text="Custom Spacing")
|
||||
|
||||
if brush.use_custom_topology_rake_spacing:
|
||||
box.prop(brush, "topology_rake_spacing", text="Spacing")
|
||||
box.prop(brush, "topology_rake_projection")
|
||||
|
||||
box.prop(brush, "topology_rake_radius_factor", slider=True)
|
||||
box.prop(brush, "use_curvature_rake")
|
||||
box.prop(brush, "ignore_falloff_for_topology_rake")
|
||||
|
||||
if context.sculpt_object.use_dynamic_topology_sculpting:
|
||||
layout.prop(brush.dyntopo, "disabled", text="Disable Dyntopo")
|
||||
|
||||
# normal_weight
|
||||
if capabilities.has_normal_weight:
|
||||
layout.prop(brush, "normal_weight", slider=True)
|
||||
@@ -630,6 +699,10 @@ def brush_settings(layout, context, brush, popover=False):
|
||||
|
||||
# Per sculpt tool options.
|
||||
|
||||
if sculpt_tool == "VCOL_BOUNDARY":
|
||||
row = layout.row()
|
||||
row.prop(brush, "vcol_boundary_exponent")
|
||||
|
||||
if sculpt_tool == 'CLAY_STRIPS':
|
||||
row = layout.row()
|
||||
row.prop(brush, "tip_roundness")
|
||||
@@ -756,7 +829,15 @@ def brush_settings(layout, context, brush, popover=False):
|
||||
|
||||
elif sculpt_tool == 'SMOOTH':
|
||||
col = layout.column()
|
||||
col.prop(brush, "boundary_smooth_factor")
|
||||
|
||||
col.prop(brush, "use_weighted_smooth")
|
||||
col.prop(brush, "preserve_faceset_boundary")
|
||||
if brush.preserve_faceset_boundary:
|
||||
col.prop(brush, "autosmooth_fset_slide")
|
||||
|
||||
col.prop(brush, "smooth_deform_type")
|
||||
|
||||
if brush.smooth_deform_type == 'SURFACE':
|
||||
col.prop(brush, "surface_smooth_shape_preservation")
|
||||
col.prop(brush, "surface_smooth_current_vertex")
|
||||
@@ -916,6 +997,14 @@ def brush_settings_advanced(layout, context, brush, popover=False):
|
||||
# topology automasking
|
||||
col.prop(brush, "use_automasking_topology", text="Topology")
|
||||
|
||||
col.prop(brush, "use_automasking_concave")
|
||||
|
||||
col2 = col.column()
|
||||
col2.enabled = brush.use_automasking_concave
|
||||
|
||||
col2.prop(brush, "concave_mask_factor", text="Cavity Factor")
|
||||
col2.prop(brush, "invert_automasking_concavity", text="Invert Cavity Mask")
|
||||
|
||||
# face masks automasking
|
||||
col.prop(brush, "use_automasking_face_sets", text="Face Sets")
|
||||
|
||||
|
@@ -1578,6 +1578,7 @@ class CLIP_MT_select(Menu):
|
||||
|
||||
layout.operator("clip.select_box")
|
||||
layout.operator("clip.select_circle")
|
||||
layout.operator_menu_enum("clip.select_lasso", "mode")
|
||||
|
||||
layout.separator()
|
||||
|
||||
|
@@ -394,6 +394,7 @@ class DOPESHEET_MT_select(Menu):
|
||||
layout.operator("action.select_box", text="Box Select (Axis Range)").axis_range = True
|
||||
|
||||
layout.operator("action.select_circle")
|
||||
layout.operator_menu_enum("action.select_lasso", "mode")
|
||||
|
||||
layout.separator()
|
||||
layout.operator("action.select_column", text="Columns on Selected Keys").mode = 'KEYS'
|
||||
|
@@ -267,7 +267,7 @@ class FILEBROWSER_PT_bookmarks_system(Panel):
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
return (
|
||||
not context.preferences.filepaths.hide_system_bookmarks and
|
||||
context.preferences.filepaths.show_system_bookmarks and
|
||||
panel_poll_is_upper_region(context.region) and
|
||||
not panel_poll_is_asset_browsing(context)
|
||||
)
|
||||
@@ -345,7 +345,7 @@ class FILEBROWSER_PT_bookmarks_recents(Panel):
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
return (
|
||||
not context.preferences.filepaths.hide_recent_locations and
|
||||
context.preferences.filepaths.show_recent_locations and
|
||||
panel_poll_is_upper_region(context.region) and
|
||||
not panel_poll_is_asset_browsing(context)
|
||||
)
|
||||
|
@@ -179,6 +179,7 @@ class GRAPH_MT_select(Menu):
|
||||
props.include_handles = True
|
||||
|
||||
layout.operator("graph.select_circle")
|
||||
layout.operator_menu_enum("graph.select_lasso", "mode")
|
||||
|
||||
layout.separator()
|
||||
layout.operator("graph.select_column", text="Columns on Selected Keys").mode = 'KEYS'
|
||||
|
@@ -289,6 +289,7 @@ class NODE_MT_select(Menu):
|
||||
|
||||
layout.operator("node.select_box").tweak = False
|
||||
layout.operator("node.select_circle")
|
||||
layout.operator_menu_enum("node.select_lasso", "mode")
|
||||
|
||||
layout.separator()
|
||||
layout.operator("node.select_all").action = 'TOGGLE'
|
||||
|
@@ -191,16 +191,6 @@ class SEQUENCER_PT_overlay(Panel):
|
||||
pass
|
||||
|
||||
|
||||
class SEQUENCER_PT_overlay(Panel):
|
||||
bl_space_type = 'SEQUENCE_EDITOR'
|
||||
bl_region_type = 'HEADER'
|
||||
bl_label = "Overlays"
|
||||
bl_ui_units_x = 7
|
||||
|
||||
def draw(self, _context):
|
||||
pass
|
||||
|
||||
|
||||
class SEQUENCER_PT_preview_overlay(Panel):
|
||||
bl_space_type = 'SEQUENCE_EDITOR'
|
||||
bl_region_type = 'HEADER'
|
||||
|
@@ -1294,7 +1294,9 @@ class _defs_sculpt:
|
||||
# Use 'bpy.context' instead of 'context' since it can be None.
|
||||
prefs = bpy.context.preferences
|
||||
if not prefs.experimental.use_sculpt_vertex_colors:
|
||||
exclude_filter = {'PAINT', 'SMEAR'}
|
||||
exclude_filter = {'PAINT' : True, 'SMEAR' : True}
|
||||
if not prefs.experimental.use_sculpt_uvsmooth:
|
||||
exclude_filter['UV_SMOOTH'] = True
|
||||
|
||||
return generate_from_enum_ex(
|
||||
context,
|
||||
|
@@ -209,9 +209,9 @@ class TOPBAR_MT_editor_menus(Menu):
|
||||
|
||||
# Allow calling this menu directly (this might not be a header area).
|
||||
if getattr(context.area, "show_menus", False):
|
||||
layout.menu("TOPBAR_MT_app", text="", icon='BLENDER')
|
||||
layout.menu("TOPBAR_MT_blender", text="", icon='BLENDER')
|
||||
else:
|
||||
layout.menu("TOPBAR_MT_app", text="Blender")
|
||||
layout.menu("TOPBAR_MT_blender", text="Blender")
|
||||
|
||||
layout.menu("TOPBAR_MT_file")
|
||||
layout.menu("TOPBAR_MT_edit")
|
||||
@@ -222,7 +222,7 @@ class TOPBAR_MT_editor_menus(Menu):
|
||||
layout.menu("TOPBAR_MT_help")
|
||||
|
||||
|
||||
class TOPBAR_MT_app(Menu):
|
||||
class TOPBAR_MT_blender(Menu):
|
||||
bl_label = "Blender"
|
||||
|
||||
def draw(self, _context):
|
||||
@@ -238,7 +238,7 @@ class TOPBAR_MT_app(Menu):
|
||||
|
||||
layout.separator()
|
||||
|
||||
layout.menu("TOPBAR_MT_app_system")
|
||||
layout.menu("TOPBAR_MT_blender_system")
|
||||
|
||||
|
||||
class TOPBAR_MT_file_cleanup(Menu):
|
||||
@@ -430,7 +430,7 @@ class TOPBAR_MT_file_defaults(Menu):
|
||||
|
||||
|
||||
# Include technical operators here which would otherwise have no way for users to access.
|
||||
class TOPBAR_MT_app_system(Menu):
|
||||
class TOPBAR_MT_blender_system(Menu):
|
||||
bl_label = "System"
|
||||
|
||||
def draw(self, _context):
|
||||
@@ -655,6 +655,7 @@ class TOPBAR_MT_window(Menu):
|
||||
layout.separator()
|
||||
|
||||
layout.operator("screen.screenshot")
|
||||
layout.operator("screen.screenshot_area")
|
||||
|
||||
if sys.platform[:3] == "win":
|
||||
layout.separator()
|
||||
@@ -854,8 +855,8 @@ classes = (
|
||||
TOPBAR_MT_file_context_menu,
|
||||
TOPBAR_MT_workspace_menu,
|
||||
TOPBAR_MT_editor_menus,
|
||||
TOPBAR_MT_app,
|
||||
TOPBAR_MT_app_system,
|
||||
TOPBAR_MT_blender,
|
||||
TOPBAR_MT_blender_system,
|
||||
TOPBAR_MT_file,
|
||||
TOPBAR_MT_file_new,
|
||||
TOPBAR_MT_file_recover,
|
||||
|
@@ -267,7 +267,6 @@ class USERPREF_PT_interface_editors(InterfacePanel, CenterAlignMixIn, Panel):
|
||||
|
||||
col = layout.column()
|
||||
col.prop(system, "use_region_overlap")
|
||||
col.prop(view, "show_layout_ui", text="Corner Splitting")
|
||||
col.prop(view, "show_navigate_ui")
|
||||
col.prop(view, "color_picker_type")
|
||||
col.row().prop(view, "header_align")
|
||||
@@ -1455,13 +1454,11 @@ class USERPREF_PT_saveload_file_browser(SaveLoadPanel, CenterAlignMixIn, Panel):
|
||||
prefs = context.preferences
|
||||
paths = prefs.filepaths
|
||||
|
||||
col = layout.column()
|
||||
col = layout.column(heading="Defaults")
|
||||
col.prop(paths, "use_filter_files")
|
||||
|
||||
col = layout.column(heading="Hide")
|
||||
col.prop(paths, "show_hidden_files_datablocks", text="Dot File & Data-Blocks")
|
||||
col.prop(paths, "hide_recent_locations", text="Recent Locations")
|
||||
col.prop(paths, "hide_system_bookmarks", text="System Bookmarks")
|
||||
col.prop(paths, "show_hidden_files_datablocks")
|
||||
col.prop(paths, "show_recent_locations")
|
||||
col.prop(paths, "show_system_bookmarks")
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
@@ -2251,6 +2248,7 @@ class USERPREF_PT_experimental_new_features(ExperimentalPanel, Panel):
|
||||
self._draw_items(
|
||||
context, (
|
||||
({"property": "use_sculpt_vertex_colors"}, "T71947"),
|
||||
({"property": "use_sculpt_uvsmooth"}, ""),
|
||||
({"property": "use_sculpt_tools_tilt"}, "T82877"),
|
||||
({"property": "use_extended_asset_browser"}, ("project/view/130/", "Project Page")),
|
||||
({"property": "use_override_templates"}, ("T73318", "Milestone 4")),
|
||||
|
@@ -171,6 +171,7 @@ class VIEW3D_HT_tool_header(Header):
|
||||
row.popover(panel="VIEW3D_PT_tools_weightpaint_symmetry_for_topbar", text="")
|
||||
elif mode_string == 'SCULPT':
|
||||
row.popover(panel="VIEW3D_PT_sculpt_symmetry_for_topbar", text="")
|
||||
layout.prop(context.object.data, "use_fset_boundary_mirror");
|
||||
elif mode_string == 'PAINT_VERTEX':
|
||||
row.popover(panel="VIEW3D_PT_tools_vertexpaint_symmetry_for_topbar", text="")
|
||||
|
||||
@@ -1362,6 +1363,7 @@ class VIEW3D_MT_select_object(Menu):
|
||||
|
||||
layout.operator("view3d.select_box")
|
||||
layout.operator("view3d.select_circle")
|
||||
layout.operator_menu_enum("view3d.select_lasso", "mode")
|
||||
|
||||
layout.separator()
|
||||
|
||||
@@ -1422,6 +1424,7 @@ class VIEW3D_MT_select_pose(Menu):
|
||||
|
||||
layout.operator("view3d.select_box")
|
||||
layout.operator("view3d.select_circle")
|
||||
layout.operator_menu_enum("view3d.select_lasso", "mode")
|
||||
|
||||
layout.separator()
|
||||
|
||||
@@ -1456,6 +1459,7 @@ class VIEW3D_MT_select_particle(Menu):
|
||||
|
||||
layout.operator("view3d.select_box")
|
||||
layout.operator("view3d.select_circle")
|
||||
layout.operator_menu_enum("view3d.select_lasso", "mode")
|
||||
|
||||
layout.separator()
|
||||
|
||||
@@ -1562,6 +1566,7 @@ class VIEW3D_MT_select_edit_mesh(Menu):
|
||||
|
||||
layout.operator("view3d.select_box")
|
||||
layout.operator("view3d.select_circle")
|
||||
layout.operator_menu_enum("view3d.select_lasso", "mode")
|
||||
|
||||
layout.separator()
|
||||
|
||||
@@ -1615,6 +1620,7 @@ class VIEW3D_MT_select_edit_curve(Menu):
|
||||
|
||||
layout.operator("view3d.select_box")
|
||||
layout.operator("view3d.select_circle")
|
||||
layout.operator_menu_enum("view3d.select_lasso", "mode")
|
||||
|
||||
layout.separator()
|
||||
|
||||
@@ -1650,6 +1656,7 @@ class VIEW3D_MT_select_edit_surface(Menu):
|
||||
|
||||
layout.operator("view3d.select_box")
|
||||
layout.operator("view3d.select_circle")
|
||||
layout.operator_menu_enum("view3d.select_lasso", "mode")
|
||||
|
||||
layout.separator()
|
||||
|
||||
@@ -1711,6 +1718,7 @@ class VIEW3D_MT_select_edit_metaball(Menu):
|
||||
|
||||
layout.operator("view3d.select_box")
|
||||
layout.operator("view3d.select_circle")
|
||||
layout.operator_menu_enum("view3d.select_lasso", "mode")
|
||||
|
||||
layout.separator()
|
||||
|
||||
@@ -1752,6 +1760,7 @@ class VIEW3D_MT_select_edit_lattice(Menu):
|
||||
|
||||
layout.operator("view3d.select_box")
|
||||
layout.operator("view3d.select_circle")
|
||||
layout.operator_menu_enum("view3d.select_lasso", "mode")
|
||||
|
||||
layout.separator()
|
||||
|
||||
@@ -1782,6 +1791,7 @@ class VIEW3D_MT_select_edit_armature(Menu):
|
||||
|
||||
layout.operator("view3d.select_box")
|
||||
layout.operator("view3d.select_circle")
|
||||
layout.operator_menu_enum("view3d.select_lasso", "mode")
|
||||
|
||||
layout.separator()
|
||||
|
||||
@@ -1849,6 +1859,7 @@ class VIEW3D_MT_select_gpencil(Menu):
|
||||
|
||||
layout.operator("gpencil.select_box")
|
||||
layout.operator("gpencil.select_circle")
|
||||
layout.operator_menu_enum("gpencil.select_lasso", "mode")
|
||||
|
||||
layout.separator()
|
||||
|
||||
@@ -1885,6 +1896,7 @@ class VIEW3D_MT_select_paint_mask(Menu):
|
||||
|
||||
layout.operator("view3d.select_box")
|
||||
layout.operator("view3d.select_circle")
|
||||
layout.operator_menu_enum("view3d.select_lasso", "mode")
|
||||
|
||||
layout.separator()
|
||||
|
||||
@@ -1905,6 +1917,7 @@ class VIEW3D_MT_select_paint_mask_vertex(Menu):
|
||||
|
||||
layout.operator("view3d.select_box")
|
||||
layout.operator("view3d.select_circle")
|
||||
layout.operator_menu_enum("view3d.select_lasso", "mode")
|
||||
|
||||
layout.separator()
|
||||
|
||||
@@ -3983,6 +3996,7 @@ class VIEW3D_MT_edit_mesh_vertices(Menu):
|
||||
layout.operator_context = 'INVOKE_REGION_WIN'
|
||||
|
||||
layout.operator("mesh.extrude_vertices_move", text="Extrude Vertices")
|
||||
layout.operator("mesh.dupli_extrude_cursor").rotate_source = True
|
||||
layout.operator("mesh.bevel", text="Bevel Vertices").affect = 'VERTICES'
|
||||
|
||||
layout.separator()
|
||||
@@ -4414,6 +4428,7 @@ class VIEW3D_MT_edit_curve_ctrlpoints(Menu):
|
||||
|
||||
if edit_object.type in {'CURVE', 'SURFACE'}:
|
||||
layout.operator("curve.extrude_move")
|
||||
layout.operator("curve.vertex_add")
|
||||
|
||||
layout.separator()
|
||||
|
||||
@@ -4742,6 +4757,7 @@ class VIEW3D_MT_edit_armature(Menu):
|
||||
layout.separator()
|
||||
|
||||
layout.operator("armature.extrude_move")
|
||||
layout.operator("armature.click_extrude")
|
||||
|
||||
if arm.use_mirror_x:
|
||||
layout.operator("armature.extrude_forked")
|
||||
|
@@ -17,7 +17,7 @@
|
||||
# ##### END GPL LICENSE BLOCK #####
|
||||
|
||||
# <pep8 compliant>
|
||||
from bpy.types import Menu, Panel, UIList
|
||||
from bpy.types import Menu, Panel, UIList, WindowManager
|
||||
from bl_ui.properties_grease_pencil_common import (
|
||||
GreasePencilSculptOptionsPanel,
|
||||
GreasePencilDisplayPanel,
|
||||
@@ -754,10 +754,78 @@ class VIEW3D_PT_tools_brush_falloff_normal(View3DPaintPanel, Panel):
|
||||
layout.prop(ipaint, "normal_angle", text="Angle")
|
||||
|
||||
|
||||
# TODO, move to space_view3d.py
|
||||
class VIEW3D_PT_sculpt_dyntopo_advanced(Panel, View3DPaintPanel):
|
||||
bl_context = ".sculpt_mode" # dot on purpose (access from topbar)
|
||||
bl_label = "Dyntopo (Advanced)"
|
||||
#bl_options = {'DEFAULT_CLOSED'}
|
||||
bl_ui_units_x = 12
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
paint_settings = cls.paint_settings(context)
|
||||
return (context.sculpt_object and context.tool_settings.sculpt and paint_settings)
|
||||
|
||||
def draw_header(self, context):
|
||||
pass
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
layout.use_property_split = True
|
||||
layout.use_property_decorate = False
|
||||
|
||||
tool_settings = context.tool_settings
|
||||
sculpt = tool_settings.sculpt
|
||||
settings = self.paint_settings(context)
|
||||
brush = settings.brush
|
||||
|
||||
col = layout.column()
|
||||
col.label(text="Local Brush Settings")
|
||||
|
||||
row = col.row()
|
||||
row.prop(brush.dyntopo, "disabled", text="Disable Dyntopo locally for this brush")
|
||||
|
||||
col.label(text="Overrides")
|
||||
inherit_all = "ALL" in brush.dyntopo.inherit
|
||||
|
||||
col.prop_enum(brush.dyntopo, "inherit", value="ALL", text="Use All Defaults", icon="LOCKED" if inherit_all else "UNLOCKED")
|
||||
|
||||
def do_prop(key):
|
||||
row = col.row()
|
||||
if key.upper() in brush.dyntopo.inherit:
|
||||
icon = "UNLOCKED"
|
||||
else:
|
||||
icon = "LOCKED"
|
||||
|
||||
row.prop_enum(brush.dyntopo, "inherit", value=key.upper(), icon=icon, text="")
|
||||
|
||||
row2 = row.row()
|
||||
row2.prop(brush.dyntopo, key)
|
||||
|
||||
if icon == "UNLOCKED":
|
||||
row2.enabled = False
|
||||
|
||||
if inherit_all:
|
||||
row.enabled = False
|
||||
|
||||
col = layout.column()
|
||||
do_prop("subdivide")
|
||||
do_prop("collapse")
|
||||
do_prop("cleanup")
|
||||
do_prop("spacing")
|
||||
do_prop("local_subdivide")
|
||||
do_prop("local_collapse")
|
||||
do_prop("detail_size")
|
||||
do_prop("detail_range")
|
||||
do_prop("detail_percent")
|
||||
do_prop("constant_detail")
|
||||
do_prop("mode")
|
||||
do_prop("radius_scale")
|
||||
|
||||
# TODO, move to space_view3d.py
|
||||
class VIEW3D_PT_sculpt_dyntopo(Panel, View3DPaintPanel):
|
||||
bl_context = ".sculpt_mode" # dot on purpose (access from topbar)
|
||||
bl_label = "Dyntopo"
|
||||
bl_label = "Dynamic Mode"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
bl_ui_units_x = 12
|
||||
|
||||
@@ -789,6 +857,8 @@ class VIEW3D_PT_sculpt_dyntopo(Panel, View3DPaintPanel):
|
||||
col = layout.column()
|
||||
col.active = context.sculpt_object.use_dynamic_topology_sculpting
|
||||
|
||||
col.prop(sculpt, "use_dyntopo");
|
||||
|
||||
sub = col.column()
|
||||
sub.active = (brush and brush.sculpt_tool != 'MASK')
|
||||
if sculpt.detail_type_method in {'CONSTANT', 'MANUAL'}:
|
||||
@@ -806,7 +876,12 @@ class VIEW3D_PT_sculpt_dyntopo(Panel, View3DPaintPanel):
|
||||
if sculpt.detail_type_method in {'CONSTANT', 'MANUAL'}:
|
||||
col.operator("sculpt.detail_flood_fill")
|
||||
|
||||
col.prop(sculpt, "use_dyntopo_cleanup")
|
||||
col.prop(sculpt, "use_smooth_shading")
|
||||
col.prop(sculpt, "use_flat_vcol_shading")
|
||||
|
||||
col.prop(sculpt, "dyntopo_spacing")
|
||||
col.prop(sculpt, "dyntopo_radius_scale");
|
||||
|
||||
|
||||
class VIEW3D_PT_sculpt_voxel_remesh(Panel, View3DPaintPanel):
|
||||
@@ -865,6 +940,7 @@ class VIEW3D_PT_sculpt_options(Panel, View3DPaintPanel):
|
||||
col = layout.column(heading="Display", align=True)
|
||||
col.prop(sculpt, "show_low_resolution")
|
||||
col.prop(sculpt, "use_sculpt_delay_updates")
|
||||
col.prop(sculpt, "use_fast_draw")
|
||||
col.prop(sculpt, "use_deform_only")
|
||||
|
||||
col.separator()
|
||||
@@ -938,6 +1014,7 @@ class VIEW3D_PT_sculpt_symmetry(Panel, View3DPaintPanel):
|
||||
row.prop(sculpt, "tile_z", text="Z", toggle=True)
|
||||
|
||||
layout.prop(sculpt, "use_symmetry_feather", text="Feather")
|
||||
layout.prop(mesh, "use_fset_boundary_mirror")
|
||||
layout.prop(sculpt, "radial_symmetry", text="Radial")
|
||||
layout.prop(sculpt, "tile_offset", text="Tile Offset")
|
||||
|
||||
@@ -945,6 +1022,7 @@ class VIEW3D_PT_sculpt_symmetry(Panel, View3DPaintPanel):
|
||||
|
||||
layout.prop(sculpt, "symmetrize_direction")
|
||||
layout.operator("sculpt.symmetrize")
|
||||
layout.prop(WindowManager.operator_properties_last("sculpt.symmetrize"), "merge_tolerance")
|
||||
|
||||
|
||||
class VIEW3D_PT_sculpt_symmetry_for_topbar(Panel):
|
||||
@@ -2278,6 +2356,7 @@ classes = (
|
||||
VIEW3D_PT_tools_grease_pencil_brush_vertex_color,
|
||||
VIEW3D_PT_tools_grease_pencil_brush_vertex_palette,
|
||||
VIEW3D_PT_tools_grease_pencil_brush_vertex_falloff,
|
||||
VIEW3D_PT_sculpt_dyntopo_advanced
|
||||
)
|
||||
|
||||
if __name__ == "__main__": # only for live edit.
|
||||
|
@@ -183,6 +183,9 @@ def object_eevee_cycles_shader_nodes_poll(context):
|
||||
def geometry_nodes_fields_poll(context):
|
||||
return context.preferences.experimental.use_geometry_nodes_fields
|
||||
|
||||
def geometry_nodes_fields_legacy_poll(context):
|
||||
return not context.preferences.experimental.use_geometry_nodes_fields
|
||||
|
||||
|
||||
# All standard node categories currently used in nodes.
|
||||
|
||||
@@ -480,25 +483,26 @@ texture_node_categories = [
|
||||
geometry_node_categories = [
|
||||
# Geometry Nodes
|
||||
GeometryNodeCategory("GEO_ATTRIBUTE", "Attribute", items=[
|
||||
NodeItem("GeometryNodeAttributeRandomize"),
|
||||
NodeItem("GeometryNodeAttributeMath"),
|
||||
NodeItem("GeometryNodeLegacyAttributeRandomize", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyAttributeMath", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyAttributeClamp", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyAttributeCompare", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyAttributeConvert", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyAttributeCurveMap", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyAttributeFill", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyAttributeMix", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyAttributeProximity", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyAttributeColorRamp", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyAttributeVectorMath", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyAttributeVectorRotate", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyAttributeSampleTexture", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyAttributeCombineXYZ", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyAttributeSeparateXYZ", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyAttributeMapRange", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyAttributeTransfer", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeAttributeRemove", poll=geometry_nodes_fields_legacy_poll),
|
||||
|
||||
NodeItem("GeometryNodeAttributeCapture", poll=geometry_nodes_fields_poll),
|
||||
NodeItem("GeometryNodeAttributeClamp"),
|
||||
NodeItem("GeometryNodeAttributeCompare"),
|
||||
NodeItem("GeometryNodeAttributeConvert"),
|
||||
NodeItem("GeometryNodeAttributeCurveMap"),
|
||||
NodeItem("GeometryNodeAttributeFill"),
|
||||
NodeItem("GeometryNodeAttributeMix"),
|
||||
NodeItem("GeometryNodeAttributeProximity"),
|
||||
NodeItem("GeometryNodeAttributeColorRamp"),
|
||||
NodeItem("GeometryNodeAttributeVectorMath"),
|
||||
NodeItem("GeometryNodeAttributeVectorRotate"),
|
||||
NodeItem("GeometryNodeAttributeSampleTexture"),
|
||||
NodeItem("GeometryNodeAttributeCombineXYZ"),
|
||||
NodeItem("GeometryNodeAttributeSeparateXYZ"),
|
||||
NodeItem("GeometryNodeAttributeRemove"),
|
||||
NodeItem("GeometryNodeAttributeMapRange"),
|
||||
NodeItem("GeometryNodeAttributeTransfer"),
|
||||
]),
|
||||
GeometryNodeCategory("GEO_COLOR", "Color", items=[
|
||||
NodeItem("ShaderNodeMixRGB"),
|
||||
@@ -508,19 +512,20 @@ geometry_node_categories = [
|
||||
NodeItem("ShaderNodeCombineRGB"),
|
||||
]),
|
||||
GeometryNodeCategory("GEO_CURVE", "Curve", items=[
|
||||
NodeItem("GeometryNodeCurveSubdivide"),
|
||||
NodeItem("GeometryNodeLegacyCurveSubdivide", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyCurveReverse", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyCurveSplineType", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyCurveSetHandles", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyCurveSelectHandles", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyMeshToCurve", poll=geometry_nodes_fields_legacy_poll),
|
||||
|
||||
NodeItem("GeometryNodeCurveToMesh"),
|
||||
NodeItem("GeometryNodeCurveResample"),
|
||||
NodeItem("GeometryNodeMeshToCurve"),
|
||||
NodeItem("GeometryNodeCurveToPoints"),
|
||||
NodeItem("GeometryNodeCurveEndpoints"),
|
||||
NodeItem("GeometryNodeCurveFill"),
|
||||
NodeItem("GeometryNodeCurveTrim"),
|
||||
NodeItem("GeometryNodeCurveLength"),
|
||||
NodeItem("GeometryNodeCurveReverse"),
|
||||
NodeItem("GeometryNodeCurveSplineType"),
|
||||
NodeItem("GeometryNodeCurveSetHandles"),
|
||||
NodeItem("GeometryNodeCurveSelectHandles"),
|
||||
]),
|
||||
GeometryNodeCategory("GEO_PRIMITIVES_CURVE", "Curve Primitives", items=[
|
||||
NodeItem("GeometryNodeCurvePrimitiveLine"),
|
||||
@@ -532,13 +537,14 @@ geometry_node_categories = [
|
||||
NodeItem("GeometryNodeCurvePrimitiveBezierSegment"),
|
||||
]),
|
||||
GeometryNodeCategory("GEO_GEOMETRY", "Geometry", items=[
|
||||
NodeItem("GeometryNodeLegacyDeleteGeometry", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyRaycast", poll=geometry_nodes_fields_legacy_poll),
|
||||
|
||||
NodeItem("GeometryNodeBoundBox"),
|
||||
NodeItem("GeometryNodeConvexHull"),
|
||||
NodeItem("GeometryNodeDeleteGeometry"),
|
||||
NodeItem("GeometryNodeTransform"),
|
||||
NodeItem("GeometryNodeJoinGeometry"),
|
||||
NodeItem("GeometryNodeSeparateComponents"),
|
||||
NodeItem("GeometryNodeRaycast"),
|
||||
NodeItem("GeometryNodeSetPosition", poll=geometry_nodes_fields_poll),
|
||||
]),
|
||||
GeometryNodeCategory("GEO_INPUT", "Input", items=[
|
||||
@@ -555,8 +561,11 @@ geometry_node_categories = [
|
||||
NodeItem("GeometryNodeInputNormal", poll=geometry_nodes_fields_poll),
|
||||
]),
|
||||
GeometryNodeCategory("GEO_MATERIAL", "Material", items=[
|
||||
NodeItem("GeometryNodeMaterialAssign"),
|
||||
NodeItem("GeometryNodeSelectByMaterial"),
|
||||
NodeItem("GeometryNodeLegacyMaterialAssign", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacySelectByMaterial", poll=geometry_nodes_fields_legacy_poll),
|
||||
|
||||
NodeItem("GeometryNodeMaterialAssign", poll=geometry_nodes_fields_poll),
|
||||
NodeItem("GeometryNodeMaterialSelection", poll=geometry_nodes_fields_poll),
|
||||
NodeItem("GeometryNodeMaterialReplace"),
|
||||
]),
|
||||
GeometryNodeCategory("GEO_MESH", "Mesh", items=[
|
||||
@@ -576,15 +585,14 @@ geometry_node_categories = [
|
||||
NodeItem("GeometryNodeMeshLine"),
|
||||
NodeItem("GeometryNodeMeshUVSphere"),
|
||||
]),
|
||||
|
||||
GeometryNodeCategory("GEO_POINT", "Point", items=[
|
||||
NodeItem("GeometryNodePointDistribute"),
|
||||
NodeItem("GeometryNodePointInstance"),
|
||||
NodeItem("GeometryNodePointSeparate"),
|
||||
NodeItem("GeometryNodePointScale"),
|
||||
NodeItem("GeometryNodePointTranslate"),
|
||||
NodeItem("GeometryNodeRotatePoints"),
|
||||
NodeItem("GeometryNodeAlignRotationToVector"),
|
||||
NodeItem("GeometryNodeLegacyPointDistribute", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyPointInstance", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyPointSeparate", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyPointScale", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyPointTranslate", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyRotatePoints", poll=geometry_nodes_fields_legacy_poll),
|
||||
NodeItem("GeometryNodeLegacyAlignRotationToVector", poll=geometry_nodes_fields_legacy_poll),
|
||||
]),
|
||||
GeometryNodeCategory("GEO_UTILITIES", "Utilities", items=[
|
||||
NodeItem("ShaderNodeMapRange"),
|
||||
@@ -606,7 +614,8 @@ geometry_node_categories = [
|
||||
NodeItem("GeometryNodeViewer"),
|
||||
]),
|
||||
GeometryNodeCategory("GEO_VOLUME", "Volume", items=[
|
||||
NodeItem("GeometryNodePointsToVolume"),
|
||||
NodeItem("GeometryNodeLegacyPointsToVolume", poll=geometry_nodes_fields_legacy_poll),
|
||||
|
||||
NodeItem("GeometryNodeVolumeToMesh"),
|
||||
]),
|
||||
GeometryNodeCategory("GEO_GROUP", "Group", items=node_group_items),
|
||||
|
@@ -92,6 +92,7 @@ set(SRC_DNA_INC
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_texture_types.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_tracking_types.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_userdef_types.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_uuid_types.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_vec_types.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_vfont_types.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/makesdna/DNA_view2d_types.h
|
||||
|
@@ -120,7 +120,7 @@ template<bool IsStrongReference> class OwnedAnonymousAttributeID {
|
||||
return BKE_anonymous_attribute_id_has_strong_references(data_);
|
||||
}
|
||||
|
||||
/** Extract the onwership of the currently wrapped anonymous id. */
|
||||
/** Extract the ownership of the currently wrapped anonymous id. */
|
||||
const AnonymousAttributeID *extract()
|
||||
{
|
||||
const AnonymousAttributeID *extracted_data = data_;
|
||||
|
@@ -66,6 +66,11 @@ bool BKE_id_attribute_remove(struct ID *id,
|
||||
struct CustomDataLayer *layer,
|
||||
struct ReportList *reports);
|
||||
|
||||
struct CustomDataLayer *BKE_id_attribute_find(const struct ID *id,
|
||||
const char *name,
|
||||
const int type,
|
||||
const AttributeDomain domain);
|
||||
|
||||
AttributeDomain BKE_id_attribute_domain(struct ID *id, struct CustomDataLayer *layer);
|
||||
int BKE_id_attribute_data_length(struct ID *id, struct CustomDataLayer *layer);
|
||||
bool BKE_id_attribute_required(struct ID *id, struct CustomDataLayer *layer);
|
||||
|
@@ -247,7 +247,7 @@ class OutputAttribute {
|
||||
GVMutableArrayPtr varray_;
|
||||
AttributeDomain domain_;
|
||||
SaveFn save_;
|
||||
std::optional<fn::GVMutableArray_GSpan> optional_span_varray_;
|
||||
std::unique_ptr<fn::GVMutableArray_GSpan> optional_span_varray_;
|
||||
bool ignore_old_values_ = false;
|
||||
bool save_has_been_called_ = false;
|
||||
|
||||
@@ -306,9 +306,10 @@ class OutputAttribute {
|
||||
|
||||
fn::GMutableSpan as_span()
|
||||
{
|
||||
if (!optional_span_varray_.has_value()) {
|
||||
if (!optional_span_varray_) {
|
||||
const bool materialize_old_values = !ignore_old_values_;
|
||||
optional_span_varray_.emplace(*varray_, materialize_old_values);
|
||||
optional_span_varray_ = std::make_unique<fn::GVMutableArray_GSpan>(*varray_,
|
||||
materialize_old_values);
|
||||
}
|
||||
fn::GVMutableArray_GSpan &span_varray = *optional_span_varray_;
|
||||
return span_varray;
|
||||
|
@@ -39,7 +39,7 @@ extern "C" {
|
||||
|
||||
/* Blender file format version. */
|
||||
#define BLENDER_FILE_VERSION BLENDER_VERSION
|
||||
#define BLENDER_FILE_SUBVERSION 21
|
||||
#define BLENDER_FILE_SUBVERSION 23
|
||||
|
||||
/* Minimum Blender version that supports reading file written with the current
|
||||
* version. Older Blender versions will test this and show a warning if the file
|
||||
|
@@ -36,6 +36,8 @@ struct Main;
|
||||
struct Scene;
|
||||
struct ToolSettings;
|
||||
struct UnifiedPaintSettings;
|
||||
struct DynTopoSettings;
|
||||
struct Sculpt;
|
||||
|
||||
// enum eCurveMappingPreset;
|
||||
|
||||
@@ -151,6 +153,13 @@ void BKE_brush_scale_size(int *r_brush_size,
|
||||
/* debugging only */
|
||||
void BKE_brush_debug_print_state(struct Brush *br);
|
||||
|
||||
void BKE_brush_get_dyntopo(struct Brush *brush, struct Sculpt *sd, struct DynTopoSettings *out);
|
||||
|
||||
bool BKE_brush_hard_edge_mode_get(const struct Scene *scene, const struct Brush *brush);
|
||||
void BKE_brush_hard_edge_mode_set(struct Scene *scene, struct Brush *brush, bool val);
|
||||
|
||||
float BKE_brush_fset_slide_get(const struct Scene *scene, const struct Brush *brush);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
129
source/blender/blenkernel/BKE_brush_engine.h
Normal file
129
source/blender/blenkernel/BKE_brush_engine.h
Normal file
@@ -0,0 +1,129 @@
|
||||
#pragma once
|
||||
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
||||
* All rights reserved.
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* \ingroup bke
|
||||
* \brief New brush engine for sculpt
|
||||
*/
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "RNA_types.h"
|
||||
|
||||
/*
|
||||
The new brush engine is based on command lists. These lists
|
||||
will eventually be created by a node editor.
|
||||
|
||||
Key is the concept of BrushChannels. A brush channel is
|
||||
a logical parameter with a type, input settings (e.g. pen),
|
||||
a falloff curve, etc.
|
||||
|
||||
Brush channels have a concept of inheritance. There is a
|
||||
BrushChannelSet (collection of channels) in Sculpt,
|
||||
in Brush, and in BrushCommand. Inheritence behavior
|
||||
is controller via BrushChannel->flag.
|
||||
|
||||
This should completely replace UnifiedPaintSettings.
|
||||
*/
|
||||
struct BrushChannel;
|
||||
|
||||
#include "BLO_read_write.h"
|
||||
#include "DNA_sculpt_brush_types.h"
|
||||
|
||||
typedef struct BrushMappingDef {
|
||||
int curve;
|
||||
bool enabled;
|
||||
bool inv;
|
||||
float min, max;
|
||||
int blendmode;
|
||||
} BrushMappingDef;
|
||||
|
||||
typedef struct BrushMappingPreset {
|
||||
// must match order of BRUSH_MAPPING_XXX enums
|
||||
struct BrushMappingDef pressure, xtilt, ytilt, angle, speed;
|
||||
} BrushMappingPreset;
|
||||
|
||||
#define MAX_BRUSH_ENUM_DEF 32
|
||||
|
||||
typedef struct BrushEnumDef {
|
||||
EnumPropertyItem items[MAX_BRUSH_ENUM_DEF];
|
||||
} BrushEnumDef;
|
||||
|
||||
typedef struct BrushChannelType {
|
||||
char name[32], idname[32];
|
||||
float min, max, soft_min, soft_max;
|
||||
BrushMappingPreset mappings;
|
||||
|
||||
int type, flag;
|
||||
int ivalue;
|
||||
float fvalue;
|
||||
BrushEnumDef enumdef; // if an enum type
|
||||
} BrushChannelType;
|
||||
|
||||
typedef struct BrushCommand {
|
||||
int tool;
|
||||
struct BrushChannelSet *params;
|
||||
struct BrushChannelSet *params_final;
|
||||
int totparam;
|
||||
} BrushCommand;
|
||||
|
||||
typedef struct BrushCommandList {
|
||||
BrushCommand *commands;
|
||||
int totcommand;
|
||||
} BrushCommandList;
|
||||
|
||||
void BKE_brush_channel_free(BrushChannel *ch);
|
||||
void BKE_brush_channel_copy(BrushChannel *dst, BrushChannel *src);
|
||||
void BKE_brush_channel_init(BrushChannel *ch, BrushChannelType *def);
|
||||
BrushChannelSet *BKE_brush_channelset_create();
|
||||
|
||||
void BKE_brush_channelset_free(BrushChannelSet *chset);
|
||||
void BKE_brush_channelset_add(BrushChannelSet *chset, BrushChannel *ch);
|
||||
|
||||
BrushChannel *BKE_brush_channelset_lookup(BrushChannelSet *chset, const char *idname);
|
||||
|
||||
bool BKE_brush_channelset_has(BrushChannelSet *chset, const char *idname);
|
||||
|
||||
void BKE_brush_channelset_add_builtin(BrushChannelSet *chset, const char *idname);
|
||||
bool BKE_brush_channelset_ensure_builtin(BrushChannelSet *chset, const char *idname);
|
||||
|
||||
void BKE_brush_channelset_merge(BrushChannelSet *dst,
|
||||
BrushChannelSet *child,
|
||||
BrushChannelSet *parent);
|
||||
|
||||
void BKE_brush_resolve_channels(struct Brush *brush, struct Sculpt *sd);
|
||||
int BKE_brush_channel_get_int(BrushChannelSet *chset, char *idname);
|
||||
float BKE_brush_channel_get_float(BrushChannelSet *chset, char *idname);
|
||||
float BKE_brush_channel_set_float(BrushChannelSet *chset, char *idname, float val);
|
||||
void BKE_brush_init_toolsettings(struct Sculpt *sd);
|
||||
void BKE_brush_builtin_create(struct Brush *brush, int tool);
|
||||
BrushCommandList *BKE_brush_commandlist_create();
|
||||
void BKE_brush_commandlist_free(BrushCommandList *cl);
|
||||
BrushCommand *BKE_brush_commandlist_add(BrushCommandList *cl);
|
||||
BrushCommand *BKE_brush_command_init(BrushCommand *command, int tool);
|
||||
void BKE_builtin_commandlist_create(BrushChannelSet *chset, BrushCommandList *cl, int tool);
|
||||
void BKE_brush_channelset_read(BlendDataReader *reader, BrushChannelSet *cset);
|
||||
void BKE_brush_channelset_write(BlendWriter *writer, BrushChannelSet *cset);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
@@ -105,6 +105,8 @@ bool CustomData_has_math(const struct CustomData *data);
|
||||
bool CustomData_has_interp(const struct CustomData *data);
|
||||
bool CustomData_bmesh_has_free(const struct CustomData *data);
|
||||
|
||||
bool CustomData_layout_is_same(const struct CustomData *_a, const struct CustomData *_b);
|
||||
|
||||
/**
|
||||
* Checks if any of the customdata layers is referenced.
|
||||
*/
|
||||
@@ -141,6 +143,10 @@ void CustomData_copy(const struct CustomData *source,
|
||||
/* BMESH_TODO, not really a public function but readfile.c needs it */
|
||||
void CustomData_update_typemap(struct CustomData *data);
|
||||
|
||||
/* copies all customdata layers without allocating data,
|
||||
* and without respect to type masks or NO_COPY/etc flags*/
|
||||
void CustomData_copy_all_layout(const struct CustomData *source, struct CustomData *dest);
|
||||
|
||||
/* same as the above, except that this will preserve existing layers, and only
|
||||
* add the layers that were not there yet */
|
||||
bool CustomData_merge(const struct CustomData *source,
|
||||
@@ -277,6 +283,16 @@ void CustomData_copy_data_named(const struct CustomData *source,
|
||||
int dest_index,
|
||||
int count);
|
||||
void CustomData_copy_elements(int type, void *src_data_ofs, void *dst_data_ofs, int count);
|
||||
|
||||
// ignores CD_MESH_ID layer if it exists
|
||||
void CustomData_bmesh_swap_data(struct CustomData *source,
|
||||
struct CustomData *dest,
|
||||
void *src_block,
|
||||
void **dest_block);
|
||||
|
||||
// simple pointer swap; will unswaps ids if a CD_MESH_ID layer exists
|
||||
void CustomData_bmesh_swap_data_simple(CustomData *data, void **block1, void **block2);
|
||||
|
||||
void CustomData_bmesh_copy_data(const struct CustomData *source,
|
||||
struct CustomData *dest,
|
||||
void *src_block,
|
||||
@@ -605,6 +621,11 @@ void CustomData_blend_write(struct BlendWriter *writer,
|
||||
struct ID *id);
|
||||
void CustomData_blend_read(struct BlendDataReader *reader, struct CustomData *data, int count);
|
||||
|
||||
void CustomData_unmark_temporary_nocopy(struct CustomData *data);
|
||||
void CustomData_mark_temporary_nocopy(struct CustomData *data);
|
||||
|
||||
int CustomData_get_elem_size(CustomDataLayer *layer);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@@ -54,9 +54,11 @@ enum {
|
||||
DT_TYPE_UV = 1 << 24,
|
||||
DT_TYPE_SHARP_FACE = 1 << 25,
|
||||
DT_TYPE_FREESTYLE_FACE = 1 << 26,
|
||||
#define DT_TYPE_MAX 27
|
||||
DT_TYPE_PROPCOL = 1 << 27,
|
||||
#define DT_TYPE_MAX 28
|
||||
|
||||
DT_TYPE_VERT_ALL = DT_TYPE_MDEFORMVERT | DT_TYPE_SHAPEKEY | DT_TYPE_SKIN | DT_TYPE_BWEIGHT_VERT,
|
||||
DT_TYPE_VERT_ALL = DT_TYPE_MDEFORMVERT | DT_TYPE_SHAPEKEY | DT_TYPE_SKIN | DT_TYPE_BWEIGHT_VERT |
|
||||
DT_TYPE_PROPCOL,
|
||||
DT_TYPE_EDGE_ALL = DT_TYPE_SHARP_EDGE | DT_TYPE_SEAM | DT_TYPE_CREASE | DT_TYPE_BWEIGHT_EDGE |
|
||||
DT_TYPE_FREESTYLE_EDGE,
|
||||
DT_TYPE_LOOP_ALL = DT_TYPE_VCOL | DT_TYPE_LNOR | DT_TYPE_UV,
|
||||
@@ -74,7 +76,7 @@ int BKE_object_data_transfer_dttype_to_cdtype(const int dtdata_type);
|
||||
int BKE_object_data_transfer_dttype_to_srcdst_index(const int dtdata_type);
|
||||
|
||||
#define DT_DATATYPE_IS_VERT(_dt) \
|
||||
ELEM(_dt, DT_TYPE_MDEFORMVERT, DT_TYPE_SHAPEKEY, DT_TYPE_SKIN, DT_TYPE_BWEIGHT_VERT)
|
||||
ELEM(_dt, DT_TYPE_MDEFORMVERT, DT_TYPE_SHAPEKEY, DT_TYPE_SKIN, DT_TYPE_BWEIGHT_VERT, DT_TYPE_PROPCOL)
|
||||
#define DT_DATATYPE_IS_EDGE(_dt) \
|
||||
ELEM(_dt, \
|
||||
DT_TYPE_CREASE, \
|
||||
@@ -94,7 +96,8 @@ enum {
|
||||
DT_MULTILAYER_INDEX_SHAPEKEY = 1,
|
||||
DT_MULTILAYER_INDEX_VCOL = 2,
|
||||
DT_MULTILAYER_INDEX_UV = 3,
|
||||
DT_MULTILAYER_INDEX_MAX = 4,
|
||||
DT_MULTILAYER_INDEX_PROPCOL = 4,
|
||||
DT_MULTILAYER_INDEX_MAX = 5,
|
||||
};
|
||||
|
||||
/* Below we keep positive values for real layers idx (generated dynamically). */
|
||||
|
@@ -82,7 +82,6 @@ DispList *BKE_displist_find(struct ListBase *lb, int type);
|
||||
void BKE_displist_normals_add(struct ListBase *lb);
|
||||
void BKE_displist_count(const struct ListBase *lb, int *totvert, int *totface, int *tottri);
|
||||
void BKE_displist_free(struct ListBase *lb);
|
||||
bool BKE_displist_has_faces(const struct ListBase *lb);
|
||||
|
||||
void BKE_displist_make_curveTypes(struct Depsgraph *depsgraph,
|
||||
const struct Scene *scene,
|
||||
@@ -94,12 +93,8 @@ void BKE_displist_make_curveTypes_forRender(struct Depsgraph *depsgraph,
|
||||
struct ListBase *dispbase,
|
||||
struct Mesh **r_final);
|
||||
void BKE_displist_make_mball(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob);
|
||||
void BKE_displist_make_mball_forRender(struct Depsgraph *depsgraph,
|
||||
struct Scene *scene,
|
||||
struct Object *ob,
|
||||
struct ListBase *dispbase);
|
||||
|
||||
bool BKE_curve_calc_modifiers_pre(struct Depsgraph *depsgraph,
|
||||
void BKE_curve_calc_modifiers_pre(struct Depsgraph *depsgraph,
|
||||
const struct Scene *scene,
|
||||
struct Object *ob,
|
||||
struct ListBase *source_nurb,
|
||||
|
24
source/blender/blenkernel/BKE_dyntopo.h
Normal file
24
source/blender/blenkernel/BKE_dyntopo.h
Normal file
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
/** \file
|
||||
* \ingroup bke
|
||||
* \brief Dynamic topology remeshing API
|
||||
*/
|
||||
|
||||
typedef struct DynTopo DynTopo;
|
@@ -78,8 +78,12 @@ typedef struct FModifierTypeInfo {
|
||||
short size;
|
||||
/** #eFMI_Action_Types. */
|
||||
short acttype;
|
||||
#ifdef __cplusplus
|
||||
short requires_;
|
||||
#else
|
||||
/** #eFMI_Requirement_Flags. */
|
||||
short requires;
|
||||
#endif
|
||||
/** name of modifier in interface. */
|
||||
char name[64];
|
||||
/** name of struct for SDNA. */
|
||||
|
@@ -103,6 +103,7 @@ class GeometryComponent {
|
||||
virtual int attribute_domain_size(const AttributeDomain domain) const;
|
||||
|
||||
bool attribute_is_builtin(const blender::StringRef attribute_name) const;
|
||||
bool attribute_is_builtin(const blender::bke::AttributeIDRef &attribute_id) const;
|
||||
|
||||
/* Get read-only access to the highest priority attribute with the given name.
|
||||
* Returns null if the attribute does not exist. */
|
||||
@@ -657,10 +658,17 @@ class AttributeFieldInput : public fn::FieldInput {
|
||||
{
|
||||
}
|
||||
|
||||
StringRefNull attribute_name() const
|
||||
{
|
||||
return name_;
|
||||
}
|
||||
|
||||
const GVArray *get_varray_for_context(const fn::FieldContext &context,
|
||||
IndexMask mask,
|
||||
ResourceScope &scope) const override;
|
||||
|
||||
std::string socket_inspection_name() const override;
|
||||
|
||||
uint64_t hash() const override;
|
||||
bool is_equal_to(const fn::FieldNode &other) const override;
|
||||
};
|
||||
@@ -683,6 +691,8 @@ class AnonymousAttributeFieldInput : public fn::FieldInput {
|
||||
IndexMask mask,
|
||||
ResourceScope &scope) const override;
|
||||
|
||||
std::string socket_inspection_name() const override;
|
||||
|
||||
uint64_t hash() const override;
|
||||
bool is_equal_to(const fn::FieldNode &other) const override;
|
||||
};
|
||||
|
@@ -124,7 +124,10 @@ enum {
|
||||
/** Don't overwrite these flags when reading a file. */
|
||||
#define G_FLAG_ALL_RUNTIME \
|
||||
(G_FLAG_SCRIPT_AUTOEXEC | G_FLAG_SCRIPT_OVERRIDE_PREF | G_FLAG_EVENT_SIMULATE | \
|
||||
G_FLAG_USERPREF_NO_SAVE_ON_EXIT)
|
||||
G_FLAG_USERPREF_NO_SAVE_ON_EXIT | \
|
||||
\
|
||||
/* #BPY_python_reset is responsible for resetting these flags on file load. */ \
|
||||
G_FLAG_SCRIPT_AUTOEXEC_FAIL | G_FLAG_SCRIPT_AUTOEXEC_FAIL_QUIET)
|
||||
|
||||
/** Flags to read from blend file. */
|
||||
#define G_FLAG_ALL_READFILE 0
|
||||
|
@@ -45,8 +45,10 @@ enum {
|
||||
IDTYPE_FLAGS_NO_COPY = 1 << 0,
|
||||
/** Indicates that the given IDType does not support linking/appending from a library file. */
|
||||
IDTYPE_FLAGS_NO_LIBLINKING = 1 << 1,
|
||||
/** Indicates that the given IDType does not support making a library-linked ID local. */
|
||||
IDTYPE_FLAGS_NO_MAKELOCAL = 1 << 2,
|
||||
/** Indicates that the given IDType should not be directly linked from a library file, but may be
|
||||
* appended.
|
||||
* NOTE: Mutually exclusive with `IDTYPE_FLAGS_NO_LIBLINKING`. */
|
||||
IDTYPE_FLAGS_ONLY_APPEND = 1 << 2,
|
||||
/** Indicates that the given IDType does not have animation data. */
|
||||
IDTYPE_FLAGS_NO_ANIMDATA = 1 << 3,
|
||||
};
|
||||
@@ -283,9 +285,14 @@ const struct IDTypeInfo *BKE_idtype_get_info_from_id(const struct ID *id);
|
||||
const char *BKE_idtype_idcode_to_name(const short idcode);
|
||||
const char *BKE_idtype_idcode_to_name_plural(const short idcode);
|
||||
const char *BKE_idtype_idcode_to_translation_context(const short idcode);
|
||||
bool BKE_idtype_idcode_is_linkable(const short idcode);
|
||||
|
||||
bool BKE_idtype_idcode_is_valid(const short idcode);
|
||||
|
||||
bool BKE_idtype_idcode_is_linkable(const short idcode);
|
||||
bool BKE_idtype_idcode_is_only_appendable(const short idcode);
|
||||
/* Macro currently, since any linkable IDtype should be localizable. */
|
||||
#define BKE_idtype_idcode_is_localizable BKE_idtype_idcode_is_linkable
|
||||
|
||||
short BKE_idtype_idcode_from_name(const char *idtype_name);
|
||||
|
||||
uint64_t BKE_idtype_idcode_to_idfilter(const short idcode);
|
||||
|
@@ -230,7 +230,7 @@ void id_us_plus(struct ID *id);
|
||||
void id_us_min(struct ID *id);
|
||||
void id_fake_user_set(struct ID *id);
|
||||
void id_fake_user_clear(struct ID *id);
|
||||
void BKE_id_clear_newpoin(struct ID *id);
|
||||
void BKE_id_newptr_and_tag_clear(struct ID *id);
|
||||
|
||||
/** Flags to control make local code behavior. */
|
||||
enum {
|
||||
@@ -248,7 +248,7 @@ enum {
|
||||
};
|
||||
|
||||
void BKE_lib_id_make_local_generic(struct Main *bmain, struct ID *id, const int flags);
|
||||
bool BKE_lib_id_make_local(struct Main *bmain, struct ID *id, const bool test, const int flags);
|
||||
bool BKE_lib_id_make_local(struct Main *bmain, struct ID *id, const int flags);
|
||||
bool id_single_user(struct bContext *C,
|
||||
struct ID *id,
|
||||
struct PointerRNA *ptr,
|
||||
|
@@ -112,6 +112,7 @@ void BKE_libblock_relink_ex(struct Main *bmain,
|
||||
const short remap_flags) ATTR_NONNULL(1, 2);
|
||||
|
||||
void BKE_libblock_relink_to_newid(struct ID *id) ATTR_NONNULL();
|
||||
void BKE_libblock_relink_to_newid_new(struct Main *bmain, struct ID *id) ATTR_NONNULL();
|
||||
|
||||
typedef void (*BKE_library_free_notifier_reference_cb)(const void *);
|
||||
typedef void (*BKE_library_remap_editor_id_reference_cb)(struct ID *, struct ID *);
|
||||
|
@@ -69,7 +69,8 @@ extern "C" {
|
||||
|
||||
/* *** mesh.c *** */
|
||||
|
||||
struct BMesh *BKE_mesh_to_bmesh_ex(const struct Mesh *me,
|
||||
struct BMesh *BKE_mesh_to_bmesh_ex(const struct Object *ob,
|
||||
const struct Mesh *me,
|
||||
const struct BMeshCreateParams *create_params,
|
||||
const struct BMeshFromMeshParams *convert_params);
|
||||
struct BMesh *BKE_mesh_to_bmesh(struct Mesh *me,
|
||||
@@ -123,7 +124,7 @@ void BKE_mesh_eval_delete(struct Mesh *mesh_eval);
|
||||
|
||||
/* Performs copy for use during evaluation,
|
||||
* optional referencing original arrays to reduce memory. */
|
||||
struct Mesh *BKE_mesh_copy_for_eval(struct Mesh *source, bool reference);
|
||||
struct Mesh *BKE_mesh_copy_for_eval(const struct Mesh *source, bool reference);
|
||||
|
||||
/* These functions construct a new Mesh,
|
||||
* contrary to BKE_mesh_to_curve_nurblist which modifies ob itself. */
|
||||
@@ -636,7 +637,7 @@ void BKE_mesh_calc_edges_tessface(struct Mesh *mesh);
|
||||
|
||||
/* In DerivedMesh.cc */
|
||||
void BKE_mesh_wrapper_deferred_finalize(struct Mesh *me_eval,
|
||||
const CustomData_MeshMasks *cd_mask_finalize);
|
||||
const struct CustomData_MeshMasks *cd_mask_finalize);
|
||||
|
||||
/* **** Depsgraph evaluation **** */
|
||||
|
||||
|
@@ -105,20 +105,28 @@ UvVertMap *BKE_mesh_uv_vert_map_create(const struct MPoly *mpoly,
|
||||
UvMapVert *BKE_mesh_uv_vert_map_get_vert(UvVertMap *vmap, unsigned int v);
|
||||
void BKE_mesh_uv_vert_map_free(UvVertMap *vmap);
|
||||
|
||||
void BKE_mesh_vert_poly_map_create(MeshElemMap **r_map,
|
||||
int **r_mem,
|
||||
const struct MPoly *mpoly,
|
||||
const struct MLoop *mloop,
|
||||
int totvert,
|
||||
int totpoly,
|
||||
int totloop);
|
||||
void BKE_mesh_vert_loop_map_create(MeshElemMap **r_map,
|
||||
int **r_mem,
|
||||
const struct MPoly *mpoly,
|
||||
const struct MLoop *mloop,
|
||||
int totvert,
|
||||
int totpoly,
|
||||
int totloop);
|
||||
void BKE_mesh_vert_poly_map_create(
|
||||
MeshElemMap **r_map,
|
||||
int **r_mem,
|
||||
const struct MVert *mvert, // only needed if sort_disk_cycles is true
|
||||
const struct MEdge *medge, // only needed if sort_disk_cycles is true
|
||||
const struct MPoly *mpoly,
|
||||
const struct MLoop *mloop,
|
||||
int totvert,
|
||||
int totpoly,
|
||||
int totloop,
|
||||
const bool sort_disk_cycles); // put polys in sorted geometric order
|
||||
void BKE_mesh_vert_loop_map_create(
|
||||
MeshElemMap **r_map,
|
||||
int **r_mem,
|
||||
const struct MVert *mvert, // only needed if sort_disk_cycles is true
|
||||
const struct MEdge *medge, // only needed if sort_disk_cycles is true
|
||||
const struct MPoly *mpoly,
|
||||
const struct MLoop *mloop,
|
||||
int totvert,
|
||||
int totpoly,
|
||||
int totloop,
|
||||
const bool sort_disk_cycles); // put loops in sorted geometric order
|
||||
void BKE_mesh_vert_looptri_map_create(MeshElemMap **r_map,
|
||||
int **r_mem,
|
||||
const struct MVert *mvert,
|
||||
@@ -128,7 +136,13 @@ void BKE_mesh_vert_looptri_map_create(MeshElemMap **r_map,
|
||||
const struct MLoop *mloop,
|
||||
const int totloop);
|
||||
void BKE_mesh_vert_edge_map_create(
|
||||
MeshElemMap **r_map, int **r_mem, const struct MEdge *medge, int totvert, int totedge);
|
||||
MeshElemMap **r_map,
|
||||
int **r_mem,
|
||||
const struct MVert *mvert, // only needed if sort_disk_cycles is true
|
||||
const struct MEdge *medge,
|
||||
int totvert,
|
||||
int totedge,
|
||||
bool sort_disk_cycles); // sort verts in geometric order around edges
|
||||
void BKE_mesh_vert_edge_vert_map_create(
|
||||
MeshElemMap **r_map, int **r_mem, const struct MEdge *medge, int totvert, int totedge);
|
||||
void BKE_mesh_edge_loop_map_create(MeshElemMap **r_map,
|
||||
|
@@ -32,7 +32,7 @@ struct Mesh;
|
||||
struct MirrorModifierData;
|
||||
struct Object;
|
||||
|
||||
struct Mesh *BKE_mesh_mirror_bisect_on_mirror_plane_for_modifier(struct MirrorModifierData *mmd,
|
||||
struct Mesh *BKE_mesh_mirror_bisect_on_mirror_plane_for_modifier(struct Object *ob, struct MirrorModifierData *mmd,
|
||||
const struct Mesh *mesh,
|
||||
int axis,
|
||||
const float plane_co[3],
|
||||
|
@@ -39,6 +39,7 @@ struct MultiresModifierData;
|
||||
struct Object;
|
||||
struct Scene;
|
||||
struct SubdivCCG;
|
||||
struct BMesh;
|
||||
|
||||
struct MLoop;
|
||||
struct MLoopTri;
|
||||
@@ -217,6 +218,7 @@ BLI_INLINE void BKE_multires_construct_tangent_matrix(float tangent_matrix[3][3]
|
||||
const float dPdv[3],
|
||||
const int corner);
|
||||
|
||||
void BKE_multires_bmesh_space_set(struct Object *ob, struct BMesh *bm, int mode);
|
||||
/* Versioning. */
|
||||
|
||||
/* Convert displacement which is stored for simply-subdivided mesh to a Catmull-Clark
|
||||
|
@@ -731,6 +731,8 @@ void nodeSetSocketAvailability(struct bNodeSocket *sock, bool is_available);
|
||||
|
||||
int nodeSocketLinkLimit(const struct bNodeSocket *sock);
|
||||
|
||||
void nodeDeclarationEnsure(struct bNodeTree *ntree, struct bNode *node);
|
||||
|
||||
/* Node Clipboard */
|
||||
void BKE_node_clipboard_init(const struct bNodeTree *ntree);
|
||||
void BKE_node_clipboard_clear(void);
|
||||
@@ -1412,34 +1414,34 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
|
||||
#define GEO_NODE_EDGE_SPLIT 1001
|
||||
#define GEO_NODE_TRANSFORM 1002
|
||||
#define GEO_NODE_BOOLEAN 1003
|
||||
#define GEO_NODE_POINT_DISTRIBUTE 1004
|
||||
#define GEO_NODE_POINT_INSTANCE 1005
|
||||
#define GEO_NODE_LEGACY_POINT_DISTRIBUTE 1004
|
||||
#define GEO_NODE_LEGACY_POINT_INSTANCE 1005
|
||||
#define GEO_NODE_SUBDIVISION_SURFACE 1006
|
||||
#define GEO_NODE_OBJECT_INFO 1007
|
||||
#define GEO_NODE_ATTRIBUTE_RANDOMIZE 1008
|
||||
#define GEO_NODE_ATTRIBUTE_MATH 1009
|
||||
#define GEO_NODE_LEGACY_ATTRIBUTE_RANDOMIZE 1008
|
||||
#define GEO_NODE_LEGACY_ATTRIBUTE_MATH 1009
|
||||
#define GEO_NODE_JOIN_GEOMETRY 1010
|
||||
#define GEO_NODE_ATTRIBUTE_FILL 1011
|
||||
#define GEO_NODE_ATTRIBUTE_MIX 1012
|
||||
#define GEO_NODE_ATTRIBUTE_COLOR_RAMP 1013
|
||||
#define GEO_NODE_POINT_SEPARATE 1014
|
||||
#define GEO_NODE_ATTRIBUTE_COMPARE 1015
|
||||
#define GEO_NODE_POINT_ROTATE 1016
|
||||
#define GEO_NODE_ATTRIBUTE_VECTOR_MATH 1017
|
||||
#define GEO_NODE_ALIGN_ROTATION_TO_VECTOR 1018
|
||||
#define GEO_NODE_POINT_TRANSLATE 1019
|
||||
#define GEO_NODE_POINT_SCALE 1020
|
||||
#define GEO_NODE_ATTRIBUTE_SAMPLE_TEXTURE 1021
|
||||
#define GEO_NODE_POINTS_TO_VOLUME 1022
|
||||
#define GEO_NODE_LEGACY_ATTRIBUTE_FILL 1011
|
||||
#define GEO_NODE_LEGACY_ATTRIBUTE_MIX 1012
|
||||
#define GEO_NODE_LEGACY_ATTRIBUTE_COLOR_RAMP 1013
|
||||
#define GEO_NODE_LEGACY_POINT_SEPARATE 1014
|
||||
#define GEO_NODE_LEGACY_ATTRIBUTE_COMPARE 1015
|
||||
#define GEO_NODE_LEGACY_POINT_ROTATE 1016
|
||||
#define GEO_NODE_LEGACY_ATTRIBUTE_VECTOR_MATH 1017
|
||||
#define GEO_NODE_LEGACY_ALIGN_ROTATION_TO_VECTOR 1018
|
||||
#define GEO_NODE_LEGACY_POINT_TRANSLATE 1019
|
||||
#define GEO_NODE_LEGACY_POINT_SCALE 1020
|
||||
#define GEO_NODE_LEGACY_ATTRIBUTE_SAMPLE_TEXTURE 1021
|
||||
#define GEO_NODE_LEGACY_POINTS_TO_VOLUME 1022
|
||||
#define GEO_NODE_COLLECTION_INFO 1023
|
||||
#define GEO_NODE_IS_VIEWPORT 1024
|
||||
#define GEO_NODE_ATTRIBUTE_PROXIMITY 1025
|
||||
#define GEO_NODE_LEGACY_ATTRIBUTE_PROXIMITY 1025
|
||||
#define GEO_NODE_VOLUME_TO_MESH 1026
|
||||
#define GEO_NODE_ATTRIBUTE_COMBINE_XYZ 1027
|
||||
#define GEO_NODE_ATTRIBUTE_SEPARATE_XYZ 1028
|
||||
#define GEO_NODE_LEGACY_ATTRIBUTE_COMBINE_XYZ 1027
|
||||
#define GEO_NODE_LEGACY_ATTRIBUTE_SEPARATE_XYZ 1028
|
||||
#define GEO_NODE_MESH_SUBDIVIDE 1029
|
||||
#define GEO_NODE_ATTRIBUTE_REMOVE 1030
|
||||
#define GEO_NODE_ATTRIBUTE_CONVERT 1031
|
||||
#define GEO_NODE_LEGACY_ATTRIBUTE_CONVERT 1031
|
||||
#define GEO_NODE_MESH_PRIMITIVE_CUBE 1032
|
||||
#define GEO_NODE_MESH_PRIMITIVE_CIRCLE 1033
|
||||
#define GEO_NODE_MESH_PRIMITIVE_UV_SPHERE 1034
|
||||
@@ -1448,28 +1450,28 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
|
||||
#define GEO_NODE_MESH_PRIMITIVE_CONE 1037
|
||||
#define GEO_NODE_MESH_PRIMITIVE_LINE 1038
|
||||
#define GEO_NODE_MESH_PRIMITIVE_GRID 1039
|
||||
#define GEO_NODE_ATTRIBUTE_MAP_RANGE 1040
|
||||
#define GEO_NODE_ATTRIBUTE_CLAMP 1041
|
||||
#define GEO_NODE_LEGACY_ATTRIBUTE_MAP_RANGE 1040
|
||||
#define GEO_NODE_LECAGY_ATTRIBUTE_CLAMP 1041
|
||||
#define GEO_NODE_BOUNDING_BOX 1042
|
||||
#define GEO_NODE_SWITCH 1043
|
||||
#define GEO_NODE_ATTRIBUTE_TRANSFER 1044
|
||||
#define GEO_NODE_LEGACY_ATTRIBUTE_TRANSFER 1044
|
||||
#define GEO_NODE_CURVE_TO_MESH 1045
|
||||
#define GEO_NODE_ATTRIBUTE_CURVE_MAP 1046
|
||||
#define GEO_NODE_LEGACY_ATTRIBUTE_CURVE_MAP 1046
|
||||
#define GEO_NODE_CURVE_RESAMPLE 1047
|
||||
#define GEO_NODE_ATTRIBUTE_VECTOR_ROTATE 1048
|
||||
#define GEO_NODE_MATERIAL_ASSIGN 1049
|
||||
#define GEO_NODE_LEGACY_MATERIAL_ASSIGN 1049
|
||||
#define GEO_NODE_INPUT_MATERIAL 1050
|
||||
#define GEO_NODE_MATERIAL_REPLACE 1051
|
||||
#define GEO_NODE_MESH_TO_CURVE 1052
|
||||
#define GEO_NODE_DELETE_GEOMETRY 1053
|
||||
#define GEO_NODE_LEGACY_MESH_TO_CURVE 1052
|
||||
#define GEO_NODE_LEGACY_DELETE_GEOMETRY 1053
|
||||
#define GEO_NODE_CURVE_LENGTH 1054
|
||||
#define GEO_NODE_SELECT_BY_MATERIAL 1055
|
||||
#define GEO_NODE_LEGACY_SELECT_BY_MATERIAL 1055
|
||||
#define GEO_NODE_CONVEX_HULL 1056
|
||||
#define GEO_NODE_CURVE_TO_POINTS 1057
|
||||
#define GEO_NODE_CURVE_REVERSE 1058
|
||||
#define GEO_NODE_LEGACY_CURVE_REVERSE 1058
|
||||
#define GEO_NODE_SEPARATE_COMPONENTS 1059
|
||||
#define GEO_NODE_CURVE_SUBDIVIDE 1060
|
||||
#define GEO_NODE_RAYCAST 1061
|
||||
#define GEO_NODE_LEGACY_CURVE_SUBDIVIDE 1060
|
||||
#define GEO_NODE_LEGACY_RAYCAST 1061
|
||||
#define GEO_NODE_CURVE_PRIMITIVE_STAR 1062
|
||||
#define GEO_NODE_CURVE_PRIMITIVE_SPIRAL 1063
|
||||
#define GEO_NODE_CURVE_PRIMITIVE_QUADRATIC_BEZIER 1064
|
||||
@@ -1480,15 +1482,17 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
|
||||
#define GEO_NODE_CURVE_ENDPOINTS 1069
|
||||
#define GEO_NODE_CURVE_PRIMITIVE_QUADRILATERAL 1070
|
||||
#define GEO_NODE_CURVE_TRIM 1071
|
||||
#define GEO_NODE_CURVE_SET_HANDLES 1072
|
||||
#define GEO_NODE_CURVE_SPLINE_TYPE 1073
|
||||
#define GEO_NODE_CURVE_SELECT_HANDLES 1074
|
||||
#define GEO_NODE_LEGACY_CURVE_SET_HANDLES 1072
|
||||
#define GEO_NODE_LEGACY_CURVE_SPLINE_TYPE 1073
|
||||
#define GEO_NODE_LEGACY_CURVE_SELECT_HANDLES 1074
|
||||
#define GEO_NODE_CURVE_FILL 1075
|
||||
#define GEO_NODE_INPUT_POSITION 1076
|
||||
#define GEO_NODE_SET_POSITION 1077
|
||||
#define GEO_NODE_INPUT_INDEX 1078
|
||||
#define GEO_NODE_INPUT_NORMAL 1079
|
||||
#define GEO_NODE_ATTRIBUTE_CAPTURE 1080
|
||||
#define GEO_NODE_MATERIAL_SELECTION 1081
|
||||
#define GEO_NODE_MATERIAL_ASSIGN 1082
|
||||
|
||||
/** \} */
|
||||
|
||||
|
@@ -25,6 +25,8 @@
|
||||
#include "BLI_sys_types.h"
|
||||
|
||||
#include "DNA_object_enums.h"
|
||||
#include "DNA_userdef_types.h"
|
||||
#include "BKE_lib_id.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@@ -154,8 +156,8 @@ bool BKE_object_obdata_is_libdata(const struct Object *ob);
|
||||
|
||||
struct Object *BKE_object_duplicate(struct Main *bmain,
|
||||
struct Object *ob,
|
||||
uint dupflag,
|
||||
const uint duplicate_options);
|
||||
eDupli_ID_Flags dupflag,
|
||||
const eLibIDDuplicateFlags duplicate_options);
|
||||
|
||||
void BKE_object_obdata_size_init(struct Object *ob, const float size);
|
||||
|
||||
|
@@ -74,6 +74,12 @@ char *BKE_packedfile_unpack_to_file(struct ReportList *reports,
|
||||
const char *local_name,
|
||||
struct PackedFile *pf,
|
||||
enum ePF_FileStatus how);
|
||||
char *BKE_packedfile_unpack(struct Main *bmain,
|
||||
struct ReportList *reports,
|
||||
struct ID *id,
|
||||
const char *orig_file_path,
|
||||
struct PackedFile *pf,
|
||||
enum ePF_FileStatus how);
|
||||
int BKE_packedfile_unpack_vfont(struct Main *bmain,
|
||||
struct ReportList *reports,
|
||||
struct VFont *vfont,
|
||||
|
@@ -23,15 +23,18 @@
|
||||
* \ingroup bke
|
||||
*/
|
||||
|
||||
#include "BKE_pbvh.h"
|
||||
#include "BLI_bitmap.h"
|
||||
#include "BLI_utildefines.h"
|
||||
#include "DNA_brush_enums.h"
|
||||
#include "DNA_customdata_types.h"
|
||||
#include "DNA_object_enums.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct MDynTopoVert;
|
||||
struct BMFace;
|
||||
struct BMesh;
|
||||
struct BlendDataReader;
|
||||
@@ -342,6 +345,11 @@ typedef struct SculptClothSimulation {
|
||||
/** #PBVHNode pointer as a key, index in #SculptClothSimulation.node_state as value. */
|
||||
struct GHash *node_state_index;
|
||||
eSculptClothNodeSimState *node_state;
|
||||
|
||||
// persistent base customdata layer offsets
|
||||
int cd_pers_co;
|
||||
int cd_pers_no;
|
||||
int cd_pers_disp;
|
||||
} SculptClothSimulation;
|
||||
|
||||
typedef struct SculptPersistentBase {
|
||||
@@ -360,7 +368,8 @@ typedef struct SculptVertexInfo {
|
||||
|
||||
typedef struct SculptBoundaryEditInfo {
|
||||
/* Vertex index from where the topology propagation reached this vertex. */
|
||||
int original_vertex;
|
||||
SculptVertRef original_vertex;
|
||||
int original_vertex_i;
|
||||
|
||||
/* How many steps were needed to reach this vertex from the boundary. */
|
||||
int num_propagation_steps;
|
||||
@@ -371,13 +380,23 @@ typedef struct SculptBoundaryEditInfo {
|
||||
|
||||
/* Edge for drawing the boundary preview in the cursor. */
|
||||
typedef struct SculptBoundaryPreviewEdge {
|
||||
int v1;
|
||||
int v2;
|
||||
SculptVertRef v1;
|
||||
SculptVertRef v2;
|
||||
} SculptBoundaryPreviewEdge;
|
||||
|
||||
#define MAX_STORED_COTANGENTW_EDGES 7
|
||||
|
||||
typedef struct StoredCotangentW {
|
||||
float static_weights[MAX_STORED_COTANGENTW_EDGES];
|
||||
float *weights;
|
||||
int length;
|
||||
} StoredCotangentW;
|
||||
|
||||
typedef struct SculptBoundary {
|
||||
/* Vertex indices of the active boundary. */
|
||||
int *vertices;
|
||||
SculptVertRef *vertices;
|
||||
int *vertex_indices;
|
||||
|
||||
int vertices_capacity;
|
||||
int num_vertices;
|
||||
|
||||
@@ -386,6 +405,14 @@ typedef struct SculptBoundary {
|
||||
* a distance of 0. */
|
||||
float *distance;
|
||||
|
||||
float (*smoothco)[3];
|
||||
float *boundary_dist; // distances from verts to boundary
|
||||
float (*boundary_tangents)[3];
|
||||
|
||||
StoredCotangentW *boundary_cotangents;
|
||||
SculptVertRef *boundary_closest;
|
||||
int sculpt_totvert;
|
||||
|
||||
/* Data for drawing the preview. */
|
||||
SculptBoundaryPreviewEdge *edges;
|
||||
int edges_capacity;
|
||||
@@ -395,12 +422,12 @@ typedef struct SculptBoundary {
|
||||
bool forms_loop;
|
||||
|
||||
/* Initial vertex in the boundary which is closest to the current sculpt active vertex. */
|
||||
int initial_vertex;
|
||||
SculptVertRef initial_vertex;
|
||||
|
||||
/* Vertex that at max_propagation_steps from the boundary and closest to the original active
|
||||
* vertex that was used to initialize the boundary. This is used as a reference to check how much
|
||||
* the deformation will go into the mesh and to calculate the strength of the brushes. */
|
||||
int pivot_vertex;
|
||||
SculptVertRef pivot_vertex;
|
||||
|
||||
/* Stores the initial positions of the pivot and boundary initial vertex as they may be deformed
|
||||
* during the brush action. This allows to use them as a reference positions and vectors for some
|
||||
@@ -418,7 +445,7 @@ typedef struct SculptBoundary {
|
||||
/* Bend Deform type. */
|
||||
struct {
|
||||
float (*pivot_rotation_axis)[3];
|
||||
float (*pivot_positions)[3];
|
||||
float (*pivot_positions)[4];
|
||||
} bend;
|
||||
|
||||
/* Slide Deform type. */
|
||||
@@ -440,7 +467,7 @@ typedef struct SculptFakeNeighbors {
|
||||
float current_max_distance;
|
||||
|
||||
/* Indexed by vertex, stores the vertex index of its fake neighbor if available. */
|
||||
int *fake_neighbor_index;
|
||||
SculptVertRef *fake_neighbor_index;
|
||||
|
||||
} SculptFakeNeighbors;
|
||||
|
||||
@@ -459,8 +486,15 @@ typedef struct SculptSession {
|
||||
|
||||
/* These are always assigned to base mesh data when using PBVH_FACES and PBVH_GRIDS. */
|
||||
struct MVert *mvert;
|
||||
struct MPoly *mpoly;
|
||||
struct MEdge *medge;
|
||||
struct MLoop *mloop;
|
||||
struct MPoly *mpoly;
|
||||
|
||||
// only assigned in PBVH_FACES and PBVH_GRIDS
|
||||
CustomData *vdata, *edata, *ldata, *pdata;
|
||||
|
||||
// for grids
|
||||
CustomData temp_vdata, temp_pdata;
|
||||
|
||||
/* These contain the vertex and poly counts of the final mesh. */
|
||||
int totvert, totpoly;
|
||||
@@ -495,8 +529,13 @@ typedef struct SculptSession {
|
||||
|
||||
/* BMesh for dynamic topology sculpting */
|
||||
struct BMesh *bm;
|
||||
int cd_dyn_vert;
|
||||
int cd_vert_node_offset;
|
||||
int cd_face_node_offset;
|
||||
int cd_vcol_offset;
|
||||
int cd_faceset_offset;
|
||||
int cd_face_areas;
|
||||
|
||||
bool bm_smooth_shading;
|
||||
/* Undo/redo log for dynamic topology sculpting */
|
||||
struct BMLog *bm_log;
|
||||
@@ -524,9 +563,9 @@ typedef struct SculptSession {
|
||||
struct ExpandCache *expand_cache;
|
||||
|
||||
/* Cursor data and active vertex for tools */
|
||||
int active_vertex_index;
|
||||
SculptVertRef active_vertex_index;
|
||||
SculptFaceRef active_face_index;
|
||||
|
||||
int active_face_index;
|
||||
int active_grid_index;
|
||||
|
||||
/* When active, the cursor draws with faded colors, indicating that there is an action enabled.
|
||||
@@ -548,9 +587,12 @@ typedef struct SculptSession {
|
||||
struct RegionView3D *rv3d;
|
||||
struct View3D *v3d;
|
||||
struct Scene *scene;
|
||||
int cd_origvcol_offset;
|
||||
int cd_origco_offset;
|
||||
int cd_origno_offset;
|
||||
|
||||
/* Dynamic mesh preview */
|
||||
int *preview_vert_index_list;
|
||||
SculptVertRef *preview_vert_index_list;
|
||||
int preview_vert_index_count;
|
||||
|
||||
/* Pose Brush Preview */
|
||||
@@ -612,6 +654,13 @@ typedef struct SculptSession {
|
||||
*/
|
||||
char needs_flush_to_id;
|
||||
|
||||
// id of current stroke, used to detect
|
||||
// if vertex original data needs to be updated
|
||||
int stroke_id, boundary_symmetry;
|
||||
|
||||
bool fast_draw; // hides facesets/masks and forces smooth to save GPU bandwidth
|
||||
struct MDynTopoVert *mdyntopo_verts; // for non-bmesh
|
||||
int mdyntopo_verts_size;
|
||||
} SculptSession;
|
||||
|
||||
void BKE_sculptsession_free(struct Object *ob);
|
||||
@@ -619,6 +668,7 @@ void BKE_sculptsession_free_deformMats(struct SculptSession *ss);
|
||||
void BKE_sculptsession_free_vwpaint_data(struct SculptSession *ss);
|
||||
void BKE_sculptsession_bm_to_me(struct Object *ob, bool reorder);
|
||||
void BKE_sculptsession_bm_to_me_for_render(struct Object *object);
|
||||
bool BKE_sculptsession_check_mdyntopo(SculptSession *ss, int totvert);
|
||||
|
||||
/* Create new color layer on object if it doesn't have one and if experimental feature set has
|
||||
* sculpt vertex color enabled. Returns truth if new layer has been added, false otherwise. */
|
||||
@@ -655,6 +705,8 @@ void BKE_sculpt_ensure_orig_mesh_data(struct Scene *scene, struct Object *object
|
||||
|
||||
bool BKE_sculptsession_use_pbvh_draw(const struct Object *ob, const struct View3D *v3d);
|
||||
|
||||
char BKE_get_fset_boundary_symflag(struct Object *object);
|
||||
|
||||
enum {
|
||||
SCULPT_MASK_LAYER_CALC_VERT = (1 << 0),
|
||||
SCULPT_MASK_LAYER_CALC_LOOP = (1 << 1),
|
||||
|
@@ -22,20 +22,97 @@
|
||||
*/
|
||||
|
||||
#include "BLI_bitmap.h"
|
||||
#include "BLI_compiler_compat.h"
|
||||
#include "BLI_ghash.h"
|
||||
|
||||
/* For embedding CCGKey in iterator. */
|
||||
#include "BKE_ccg.h"
|
||||
#include <stdint.h>
|
||||
|
||||
//#define DEFRAGMENT_MEMORY
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// experimental feature to detect quad diagonals and mark (but not dissolve) them
|
||||
//#define SCULPT_DIAGONAL_EDGE_MARKS
|
||||
|
||||
typedef struct SculptVertRef {
|
||||
intptr_t i;
|
||||
} SculptVertRef;
|
||||
|
||||
typedef struct SculptEdgeRef {
|
||||
intptr_t i;
|
||||
} SculptEdgeRef;
|
||||
|
||||
typedef struct SculptFaceRef {
|
||||
intptr_t i;
|
||||
} SculptFaceRef;
|
||||
|
||||
#if 0
|
||||
typedef struct SculptLoopRef {
|
||||
intptr_t i;
|
||||
} SculptLoopRef;
|
||||
#endif
|
||||
|
||||
BLI_INLINE SculptVertRef BKE_pbvh_make_vref(intptr_t i)
|
||||
{
|
||||
SculptVertRef ret = {i};
|
||||
return ret;
|
||||
}
|
||||
|
||||
BLI_INLINE SculptEdgeRef BKE_pbvh_make_eref(intptr_t i)
|
||||
{
|
||||
SculptEdgeRef ret = {i};
|
||||
return ret;
|
||||
}
|
||||
|
||||
BLI_INLINE SculptFaceRef BKE_pbvh_make_fref(intptr_t i)
|
||||
{
|
||||
SculptFaceRef ret = {i};
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define SCULPT_REF_NONE ((intptr_t)-1)
|
||||
|
||||
#ifdef DEFRAGMENT_MEMORY
|
||||
# include "BLI_smallhash.h"
|
||||
#endif
|
||||
|
||||
typedef struct PBVHTri {
|
||||
int v[3]; // references into PBVHTriBuf->verts
|
||||
intptr_t l[3]; // loops
|
||||
int eflag; // bitmask of which edges in the tri are real edges in the mesh
|
||||
|
||||
float no[3];
|
||||
SculptFaceRef f;
|
||||
} PBVHTri;
|
||||
|
||||
typedef struct PBVHTriBuf {
|
||||
PBVHTri *tris;
|
||||
SculptVertRef *verts;
|
||||
int *edges;
|
||||
int totvert, totedge, tottri;
|
||||
int verts_size, edges_size, tris_size;
|
||||
|
||||
SmallHash vertmap; // maps vertex ptrs to indices within verts
|
||||
|
||||
// private field
|
||||
intptr_t *loops;
|
||||
int totloop, mat_nr;
|
||||
float min[3], max[3];
|
||||
} PBVHTriBuf;
|
||||
|
||||
struct BMLog;
|
||||
struct BMesh;
|
||||
struct BMVert;
|
||||
struct BMEdge;
|
||||
struct BMFace;
|
||||
struct CCGElem;
|
||||
struct CCGKey;
|
||||
struct CustomData;
|
||||
struct TableGSet;
|
||||
struct DMFlagMat;
|
||||
struct GPU_PBVH_Buffers;
|
||||
struct IsectRayPrecalc;
|
||||
@@ -52,12 +129,86 @@ struct TaskParallelSettings;
|
||||
typedef struct PBVH PBVH;
|
||||
typedef struct PBVHNode PBVHNode;
|
||||
|
||||
//#define PROXY_ADVANCED
|
||||
|
||||
// experimental performance test of "data-based programming" approach
|
||||
#ifdef PROXY_ADVANCED
|
||||
typedef struct ProxyKey {
|
||||
int node;
|
||||
int pindex;
|
||||
} ProxyKey;
|
||||
|
||||
# define MAX_PROXY_NEIGHBORS 12
|
||||
|
||||
typedef struct ProxyVertArray {
|
||||
float **ownerco;
|
||||
short **ownerno;
|
||||
float (*co)[3];
|
||||
float (*fno)[3];
|
||||
short (*no)[3];
|
||||
float *mask, **ownermask;
|
||||
SculptVertRef *index;
|
||||
float **ownercolor, (*color)[4];
|
||||
|
||||
ProxyKey (*neighbors)[MAX_PROXY_NEIGHBORS];
|
||||
|
||||
int size;
|
||||
int datamask;
|
||||
bool neighbors_dirty;
|
||||
|
||||
GHash *indexmap;
|
||||
} ProxyVertArray;
|
||||
|
||||
typedef enum {
|
||||
PV_OWNERCO = 1,
|
||||
PV_OWNERNO = 2,
|
||||
PV_CO = 4,
|
||||
PV_NO = 8,
|
||||
PV_MASK = 16,
|
||||
PV_OWNERMASK = 32,
|
||||
PV_INDEX = 64,
|
||||
PV_OWNERCOLOR = 128,
|
||||
PV_COLOR = 256,
|
||||
PV_NEIGHBORS = 512
|
||||
} ProxyVertField;
|
||||
|
||||
typedef struct ProxyVertUpdateRec {
|
||||
float *co, *no, *mask, *color;
|
||||
SculptVertRef index, newindex;
|
||||
} ProxyVertUpdateRec;
|
||||
|
||||
# define PBVH_PROXY_DEFAULT CO | INDEX | MASK
|
||||
|
||||
struct SculptSession;
|
||||
|
||||
void BKE_pbvh_ensure_proxyarrays(
|
||||
struct SculptSession *ss, PBVH *pbvh, PBVHNode **nodes, int totnode, int mask);
|
||||
void BKE_pbvh_load_proxyarrays(PBVH *pbvh, PBVHNode **nodes, int totnode, int mask);
|
||||
|
||||
void BKE_pbvh_ensure_proxyarray(
|
||||
struct SculptSession *ss,
|
||||
struct PBVH *pbvh,
|
||||
struct PBVHNode *node,
|
||||
int mask,
|
||||
struct GHash
|
||||
*vert_node_map, // vert_node_map maps vertex SculptVertRefs to PBVHNode indices; optional
|
||||
bool check_indexmap,
|
||||
bool force_update);
|
||||
void BKE_pbvh_gather_proxyarray(PBVH *pbvh, PBVHNode **nodes, int totnode);
|
||||
|
||||
void BKE_pbvh_free_proxyarray(struct PBVH *pbvh, struct PBVHNode *node);
|
||||
void BKE_pbvh_update_proxyvert(struct PBVH *pbvh, struct PBVHNode *node, ProxyVertUpdateRec *rec);
|
||||
ProxyVertArray *BKE_pbvh_get_proxyarrays(struct PBVH *pbvh, struct PBVHNode *node);
|
||||
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
float (*co)[3];
|
||||
} PBVHProxyNode;
|
||||
|
||||
typedef struct {
|
||||
float (*color)[4];
|
||||
int size;
|
||||
} PBVHColorBufferNode;
|
||||
|
||||
typedef enum {
|
||||
@@ -78,6 +229,15 @@ typedef enum {
|
||||
|
||||
PBVH_UpdateTopology = 1 << 13,
|
||||
PBVH_UpdateColor = 1 << 14,
|
||||
PBVH_Delete = 1 << 15,
|
||||
PBVH_UpdateCurvatureDir = 1 << 16,
|
||||
PBVH_UpdateTris = 1 << 17,
|
||||
PBVH_RebuildNodeVerts = 1 << 18,
|
||||
|
||||
/* tri areas are not guaranteed to be up to date, tools should
|
||||
update all nodes on first step of brush*/
|
||||
PBVH_UpdateTriAreas = 1 << 19,
|
||||
PBVH_UpdateOtherVerts = 1 << 20
|
||||
} PBVHNodeFlags;
|
||||
|
||||
typedef struct PBVHFrustumPlanes {
|
||||
@@ -98,6 +258,9 @@ typedef void (*BKE_pbvh_HitOccludedCallback)(PBVHNode *node, void *data, float *
|
||||
|
||||
typedef void (*BKE_pbvh_SearchNearestCallback)(PBVHNode *node, void *data, float *tmin);
|
||||
|
||||
void BKE_pbvh_get_nodes(PBVH *pbvh, int flag, PBVHNode ***r_array, int *r_totnode);
|
||||
PBVHNode *BKE_pbvh_get_node(PBVH *pbvh, int node);
|
||||
|
||||
/* Building */
|
||||
|
||||
PBVH *BKE_pbvh_new(void);
|
||||
@@ -106,27 +269,57 @@ void BKE_pbvh_build_mesh(PBVH *pbvh,
|
||||
const struct MPoly *mpoly,
|
||||
const struct MLoop *mloop,
|
||||
struct MVert *verts,
|
||||
struct MDynTopoVert *mdyntopo_verts,
|
||||
int totvert,
|
||||
struct CustomData *vdata,
|
||||
struct CustomData *ldata,
|
||||
struct CustomData *pdata,
|
||||
const struct MLoopTri *looptri,
|
||||
int looptri_num);
|
||||
int looptri_num,
|
||||
bool fast_draw);
|
||||
void BKE_pbvh_build_grids(PBVH *pbvh,
|
||||
struct CCGElem **grids,
|
||||
int totgrid,
|
||||
struct CCGKey *key,
|
||||
void **gridfaces,
|
||||
struct DMFlagMat *flagmats,
|
||||
unsigned int **grid_hidden);
|
||||
unsigned int **grid_hidden,
|
||||
bool fast_draw);
|
||||
void BKE_pbvh_build_bmesh(PBVH *pbvh,
|
||||
struct BMesh *bm,
|
||||
bool smooth_shading,
|
||||
struct BMLog *log,
|
||||
const int cd_vert_node_offset,
|
||||
const int cd_face_node_offset);
|
||||
const int cd_face_node_offset,
|
||||
const int cd_dyn_vert,
|
||||
const int cd_face_areas,
|
||||
bool fast_draw);
|
||||
void BKE_pbvh_update_offsets(PBVH *pbvh,
|
||||
const int cd_vert_node_offset,
|
||||
const int cd_face_node_offset,
|
||||
const int cd_dyn_vert,
|
||||
const int cd_face_areas);
|
||||
void BKE_pbvh_free(PBVH *pbvh);
|
||||
|
||||
void BKE_pbvh_set_bm_log(PBVH *pbvh, struct BMLog *log);
|
||||
|
||||
/** update original data, only data whose r_** parameters are passed in will be updated*/
|
||||
void BKE_pbvh_bmesh_update_origvert(
|
||||
PBVH *pbvh, struct BMVert *v, float **r_co, float **r_no, float **r_color, bool log_undo);
|
||||
void BKE_pbvh_update_origcolor_bmesh(PBVH *pbvh, PBVHNode *node);
|
||||
void BKE_pbvh_update_origco_bmesh(PBVH *pbvh, PBVHNode *node);
|
||||
|
||||
/**
|
||||
checks if original data needs to be updated for v, and if so updates it. Stroke_id
|
||||
is provided by the sculpt code and is used to detect updates. The reason we do it
|
||||
inside the verts and not in the nodes is to allow splitting of the pbvh during the stroke.
|
||||
*/
|
||||
bool BKE_pbvh_bmesh_check_origdata(PBVH *pbvh, struct BMVert *v, int stroke_id);
|
||||
|
||||
/** used so pbvh can differentiate between different strokes,
|
||||
see BKE_pbvh_bmesh_check_origdata */
|
||||
void BKE_pbvh_set_stroke_id(PBVH *pbvh, int stroke_id);
|
||||
|
||||
/* Hierarchical Search in the BVH, two methods:
|
||||
* - for each hit calling a callback
|
||||
* - gather nodes in an array (easy to multithread) */
|
||||
@@ -150,7 +343,8 @@ void BKE_pbvh_raycast(PBVH *pbvh,
|
||||
void *data,
|
||||
const float ray_start[3],
|
||||
const float ray_normal[3],
|
||||
bool original);
|
||||
bool original,
|
||||
int stroke_id);
|
||||
|
||||
bool BKE_pbvh_node_raycast(PBVH *pbvh,
|
||||
PBVHNode *node,
|
||||
@@ -160,11 +354,13 @@ bool BKE_pbvh_node_raycast(PBVH *pbvh,
|
||||
const float ray_normal[3],
|
||||
struct IsectRayPrecalc *isect_precalc,
|
||||
float *depth,
|
||||
int *active_vertex_index,
|
||||
int *active_face_grid_index,
|
||||
float *face_normal);
|
||||
SculptVertRef *active_vertex_index,
|
||||
SculptFaceRef *active_face_grid_index,
|
||||
float *face_normal,
|
||||
int stroke_id);
|
||||
|
||||
bool BKE_pbvh_bmesh_node_raycast_detail(PBVHNode *node,
|
||||
bool BKE_pbvh_bmesh_node_raycast_detail(PBVH *pbvh,
|
||||
PBVHNode *node,
|
||||
const float ray_start[3],
|
||||
struct IsectRayPrecalc *isect_precalc,
|
||||
float *depth,
|
||||
@@ -189,7 +385,8 @@ bool BKE_pbvh_node_find_nearest_to_ray(PBVH *pbvh,
|
||||
const float ray_start[3],
|
||||
const float ray_normal[3],
|
||||
float *depth,
|
||||
float *dist_sq);
|
||||
float *dist_sq,
|
||||
int stroke_id);
|
||||
|
||||
/* Drawing */
|
||||
|
||||
@@ -238,22 +435,60 @@ int BKE_pbvh_get_grid_num_faces(const PBVH *pbvh);
|
||||
|
||||
/* Only valid for type == PBVH_BMESH */
|
||||
struct BMesh *BKE_pbvh_get_bmesh(PBVH *pbvh);
|
||||
void BKE_pbvh_bmesh_detail_size_set(PBVH *pbvh, float detail_size);
|
||||
void BKE_pbvh_bmesh_detail_size_set(PBVH *pbvh, float detail_size, float detail_range);
|
||||
|
||||
typedef enum {
|
||||
PBVH_Subdivide = 1,
|
||||
PBVH_Collapse = 2,
|
||||
PBVH_Subdivide = 1 << 0,
|
||||
PBVH_Collapse = 1 << 1,
|
||||
PBVH_Cleanup = 1 << 2, // dissolve verts surrounded by either 3 or 4 triangles then triangulate
|
||||
PBVH_LocalSubdivide = 1 << 3,
|
||||
PBVH_LocalCollapse = 1 << 4
|
||||
} PBVHTopologyUpdateMode;
|
||||
bool BKE_pbvh_bmesh_update_topology(PBVH *pbvh,
|
||||
PBVHTopologyUpdateMode mode,
|
||||
const float center[3],
|
||||
const float view_normal[3],
|
||||
float radius,
|
||||
const bool use_frontface,
|
||||
const bool use_projected);
|
||||
|
||||
typedef float (*DyntopoMaskCB)(SculptVertRef vertex, void *userdata);
|
||||
|
||||
bool BKE_pbvh_bmesh_update_topology(
|
||||
PBVH *pbvh,
|
||||
PBVHTopologyUpdateMode mode,
|
||||
const float center[3],
|
||||
const float view_normal[3],
|
||||
float radius,
|
||||
const bool use_frontface,
|
||||
const bool use_projected,
|
||||
int symaxis,
|
||||
bool updatePBVH,
|
||||
DyntopoMaskCB mask_cb,
|
||||
void *mask_cb_data,
|
||||
int custom_max_steps); // if 0, will use defaul hueristics for max steps
|
||||
|
||||
bool BKE_pbvh_bmesh_update_topology_nodes(PBVH *pbvh,
|
||||
bool (*searchcb)(PBVHNode *node, void *data),
|
||||
void (*undopush)(PBVHNode *node, void *data),
|
||||
void *searchdata,
|
||||
PBVHTopologyUpdateMode mode,
|
||||
const float center[3],
|
||||
const float view_normal[3],
|
||||
float radius,
|
||||
const bool use_frontface,
|
||||
const bool use_projected,
|
||||
int sym_axis,
|
||||
bool updatePBVH,
|
||||
DyntopoMaskCB mask_cb,
|
||||
void *mask_cb_data);
|
||||
/* Node Access */
|
||||
|
||||
void BKE_pbvh_check_tri_areas(PBVH *pbvh, PBVHNode *node);
|
||||
|
||||
// updates boundaries and valences for whole mesh
|
||||
void BKE_pbvh_bmesh_on_mesh_change(PBVH *pbvh);
|
||||
bool BKE_pbvh_bmesh_check_valence(PBVH *pbvh, SculptVertRef vertex);
|
||||
void BKE_pbvh_bmesh_update_valence(int cd_dyn_vert, SculptVertRef vertex);
|
||||
void BKE_pbvh_bmesh_update_all_valence(PBVH *pbvh);
|
||||
void BKE_pbvh_bmesh_flag_all_disk_sort(PBVH *pbvh);
|
||||
bool BKE_pbvh_bmesh_mark_update_valence(PBVH *pbvh, SculptVertRef vertex);
|
||||
|
||||
void BKE_pbvh_node_mark_update_tri_area(PBVHNode *node);
|
||||
void BKE_pbvh_update_all_tri_areas(PBVH *pbvh);
|
||||
void BKE_pbvh_node_mark_update(PBVHNode *node);
|
||||
void BKE_pbvh_node_mark_update_mask(PBVHNode *node);
|
||||
void BKE_pbvh_node_mark_update_color(PBVHNode *node);
|
||||
@@ -292,10 +527,14 @@ bool BKE_pbvh_node_frustum_contain_AABB(PBVHNode *node, void *frustum);
|
||||
/* test if AABB is at least partially outside the PBVHFrustumPlanes volume */
|
||||
bool BKE_pbvh_node_frustum_exclude_AABB(PBVHNode *node, void *frustum);
|
||||
|
||||
struct GSet *BKE_pbvh_bmesh_node_unique_verts(PBVHNode *node);
|
||||
struct GSet *BKE_pbvh_bmesh_node_other_verts(PBVHNode *node);
|
||||
struct GSet *BKE_pbvh_bmesh_node_faces(PBVHNode *node);
|
||||
void BKE_pbvh_bmesh_node_save_orig(struct BMesh *bm, PBVHNode *node);
|
||||
struct TableGSet *BKE_pbvh_bmesh_node_unique_verts(PBVHNode *node);
|
||||
struct TableGSet *BKE_pbvh_bmesh_node_other_verts(PBVHNode *node);
|
||||
struct TableGSet *BKE_pbvh_bmesh_node_faces(PBVHNode *node);
|
||||
|
||||
void BKE_pbvh_bmesh_regen_node_verts(PBVH *pbvh);
|
||||
void BKE_pbvh_bmesh_mark_node_regen(PBVH *pbvh, PBVHNode *node);
|
||||
|
||||
// now generated PBVHTris
|
||||
void BKE_pbvh_bmesh_after_stroke(PBVH *pbvh);
|
||||
|
||||
/* Update Bounding Box/Redraw and clear flags */
|
||||
@@ -343,6 +582,7 @@ typedef struct PBVHVertexIter {
|
||||
int gy;
|
||||
int i;
|
||||
int index;
|
||||
SculptVertRef vertex;
|
||||
bool respect_hide;
|
||||
|
||||
/* grid */
|
||||
@@ -362,10 +602,14 @@ typedef struct PBVHVertexIter {
|
||||
float *vmask;
|
||||
|
||||
/* bmesh */
|
||||
struct GSetIterator bm_unique_verts;
|
||||
struct GSetIterator bm_other_verts;
|
||||
int bi;
|
||||
struct TableGSet *bm_cur_set;
|
||||
struct TableGSet *bm_unique_verts, *bm_other_verts;
|
||||
|
||||
struct CustomData *bm_vdata;
|
||||
int cd_dyn_vert;
|
||||
int cd_vert_mask_offset;
|
||||
int cd_vcol_offset;
|
||||
|
||||
/* result: these are all computed in the macro, but we assume
|
||||
* that compiler optimization's will skip the ones we don't use */
|
||||
@@ -379,6 +623,8 @@ typedef struct PBVHVertexIter {
|
||||
bool visible;
|
||||
} PBVHVertexIter;
|
||||
|
||||
#define BKE_PBVH_DYNVERT(cd_dyn_vert, v) ((MDynTopoVert *)BM_ELEM_CD_GET_VOID_P(v, cd_dyn_vert))
|
||||
|
||||
void pbvh_vertex_iter_init(PBVH *pbvh, PBVHNode *node, PBVHVertexIter *vi, int mode);
|
||||
|
||||
#define BKE_pbvh_vertex_iter_begin(pbvh, node, vi, mode) \
|
||||
@@ -388,7 +634,7 @@ void pbvh_vertex_iter_init(PBVH *pbvh, PBVHNode *node, PBVHVertexIter *vi, int m
|
||||
if (vi.grids) { \
|
||||
vi.width = vi.gridsize; \
|
||||
vi.height = vi.gridsize; \
|
||||
vi.index = vi.grid_indices[vi.g] * vi.key.grid_area - 1; \
|
||||
vi.vertex.i = vi.index = vi.grid_indices[vi.g] * vi.key.grid_area - 1; \
|
||||
vi.grid = vi.grids[vi.grid_indices[vi.g]]; \
|
||||
if (mode == PBVH_ITER_UNIQUE) { \
|
||||
vi.gh = vi.grid_hidden[vi.grid_indices[vi.g]]; \
|
||||
@@ -407,6 +653,7 @@ void pbvh_vertex_iter_init(PBVH *pbvh, PBVHNode *node, PBVHVertexIter *vi, int m
|
||||
vi.mask = vi.key.has_mask ? CCG_elem_mask(&vi.key, vi.grid) : NULL; \
|
||||
vi.grid = CCG_elem_next(&vi.key, vi.grid); \
|
||||
vi.index++; \
|
||||
vi.vertex.i++; \
|
||||
vi.visible = true; \
|
||||
if (vi.gh) { \
|
||||
if (BLI_BITMAP_TEST(vi.gh, vi.gy * vi.gridsize + vi.gx)) { \
|
||||
@@ -427,7 +674,7 @@ void pbvh_vertex_iter_init(PBVH *pbvh, PBVHNode *node, PBVHVertexIter *vi, int m
|
||||
} \
|
||||
vi.co = vi.mvert->co; \
|
||||
vi.no = vi.mvert->no; \
|
||||
vi.index = vi.vert_indices[vi.i]; \
|
||||
vi.index = vi.vertex.i = vi.vert_indices[vi.i]; \
|
||||
if (vi.vmask) { \
|
||||
vi.mask = &vi.vmask[vi.index]; \
|
||||
} \
|
||||
@@ -436,22 +683,41 @@ void pbvh_vertex_iter_init(PBVH *pbvh, PBVHNode *node, PBVHVertexIter *vi, int m
|
||||
} \
|
||||
} \
|
||||
else { \
|
||||
if (!BLI_gsetIterator_done(&vi.bm_unique_verts)) { \
|
||||
vi.bm_vert = BLI_gsetIterator_getKey(&vi.bm_unique_verts); \
|
||||
BLI_gsetIterator_step(&vi.bm_unique_verts); \
|
||||
BMVert *bv = NULL; \
|
||||
while (!bv) { \
|
||||
if (!vi.bm_cur_set->elems || vi.bi >= vi.bm_cur_set->cur) { \
|
||||
if (vi.bm_cur_set != vi.bm_other_verts && mode != PBVH_ITER_UNIQUE) { \
|
||||
vi.bm_cur_set = vi.bm_other_verts; \
|
||||
vi.bi = 0; \
|
||||
if (!vi.bm_cur_set->elems || vi.bi >= vi.bm_other_verts->cur) { \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
else { \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
else { \
|
||||
bv = vi.bm_cur_set->elems[vi.bi++]; \
|
||||
} \
|
||||
} \
|
||||
else { \
|
||||
vi.bm_vert = BLI_gsetIterator_getKey(&vi.bm_other_verts); \
|
||||
BLI_gsetIterator_step(&vi.bm_other_verts); \
|
||||
if (!bv) { \
|
||||
continue; \
|
||||
} \
|
||||
vi.bm_vert = bv; \
|
||||
if (vi.cd_vcol_offset >= 0) { \
|
||||
MPropCol *vcol = BM_ELEM_CD_GET_VOID_P(bv, vi.cd_vcol_offset); \
|
||||
vi.col = vcol->color; \
|
||||
} \
|
||||
vi.vertex.i = (intptr_t)bv; \
|
||||
vi.index = BM_elem_index_get(vi.bm_vert); \
|
||||
vi.visible = !BM_elem_flag_test_bool(vi.bm_vert, BM_ELEM_HIDDEN); \
|
||||
if (mode == PBVH_ITER_UNIQUE && !vi.visible) { \
|
||||
continue; \
|
||||
} \
|
||||
vi.co = vi.bm_vert->co; \
|
||||
vi.fno = vi.bm_vert->no; \
|
||||
vi.index = BM_elem_index_get(vi.bm_vert); \
|
||||
vi.mask = BM_ELEM_CD_GET_VOID_P(vi.bm_vert, vi.cd_vert_mask_offset); \
|
||||
vi.mask = (float *)BM_ELEM_CD_GET_VOID_P(vi.bm_vert, vi.cd_vert_mask_offset); \
|
||||
}
|
||||
|
||||
#define BKE_pbvh_vertex_iter_end \
|
||||
@@ -460,24 +726,28 @@ void pbvh_vertex_iter_init(PBVH *pbvh, PBVHNode *node, PBVHVertexIter *vi, int m
|
||||
} \
|
||||
((void)0)
|
||||
|
||||
#define BKE_pbvh_vertex_index_to_table(pbvh, v) \
|
||||
(BKE_pbvh_type(pbvh) == PBVH_BMESH && v.i != -1 ? BM_elem_index_get((BMVert *)(v.i)) : (v.i))
|
||||
SculptVertRef BKE_pbvh_table_index_to_vertex(PBVH *pbvh, int idx);
|
||||
|
||||
#define BKE_pbvh_face_index_to_table(pbvh, v) \
|
||||
(BKE_pbvh_type(pbvh) == PBVH_BMESH && v.i != -1 ? BM_elem_index_get((BMFace *)(v.i)) : (v.i))
|
||||
SculptFaceRef BKE_pbvh_table_index_to_face(PBVH *pbvh, int idx);
|
||||
|
||||
void BKE_pbvh_node_get_proxies(PBVHNode *node, PBVHProxyNode **proxies, int *proxy_count);
|
||||
void BKE_pbvh_node_free_proxies(PBVHNode *node);
|
||||
PBVHProxyNode *BKE_pbvh_node_add_proxy(PBVH *pbvh, PBVHNode *node);
|
||||
void BKE_pbvh_gather_proxies(PBVH *pbvh, PBVHNode ***r_array, int *r_tot);
|
||||
void BKE_pbvh_node_get_bm_orco_data(PBVHNode *node,
|
||||
int (**r_orco_tris)[3],
|
||||
int *r_orco_tris_num,
|
||||
float (**r_orco_coords)[3]);
|
||||
|
||||
bool BKE_pbvh_node_vert_update_check_any(PBVH *pbvh, PBVHNode *node);
|
||||
|
||||
// void BKE_pbvh_node_BB_reset(PBVHNode *node);
|
||||
// void BKE_pbvh_node_BB_expand(PBVHNode *node, float co[3]);
|
||||
|
||||
bool pbvh_has_mask(const PBVH *pbvh);
|
||||
bool BKE_pbvh_draw_mask(const PBVH *pbvh);
|
||||
void pbvh_show_mask_set(PBVH *pbvh, bool show_mask);
|
||||
|
||||
bool pbvh_has_face_sets(PBVH *pbvh);
|
||||
bool BKE_pbvh_draw_face_sets(PBVH *pbvh);
|
||||
void pbvh_show_face_sets_set(PBVH *pbvh, bool show_face_sets);
|
||||
|
||||
/* Parallelization */
|
||||
@@ -490,6 +760,150 @@ struct MVert *BKE_pbvh_get_verts(const PBVH *pbvh);
|
||||
PBVHColorBufferNode *BKE_pbvh_node_color_buffer_get(PBVHNode *node);
|
||||
void BKE_pbvh_node_color_buffer_free(PBVH *pbvh);
|
||||
|
||||
int BKE_pbvh_get_node_index(PBVH *pbvh, PBVHNode *node);
|
||||
int BKE_pbvh_get_node_id(PBVH *pbvh, PBVHNode *node);
|
||||
void BKE_pbvh_set_flat_vcol_shading(PBVH *pbvh, bool value);
|
||||
|
||||
#define DYNTOPO_CD_INTERP
|
||||
|
||||
void SCULPT_update_flat_vcol_shading(struct Object *ob, struct Scene *scene);
|
||||
|
||||
void BKE_pbvh_curvature_update_set(PBVHNode *node, bool state);
|
||||
bool BKE_pbvh_curvature_update_get(PBVHNode *node);
|
||||
|
||||
int BKE_pbvh_get_totnodes(PBVH *pbvh);
|
||||
|
||||
bool BKE_pbvh_bmesh_check_tris(PBVH *pbvh, PBVHNode *node);
|
||||
PBVHTriBuf *BKE_pbvh_bmesh_get_tris(PBVH *pbvh, PBVHNode *node);
|
||||
void BKE_pbvh_bmesh_free_tris(PBVH *pbvh, PBVHNode *node);
|
||||
|
||||
/*recalculates boundary flags for *all* vertices. used by
|
||||
symmetrize.*/
|
||||
void BKE_pbvh_recalc_bmesh_boundary(PBVH *pbvh);
|
||||
|
||||
void BKE_pbvh_bmesh_remove_face(PBVH *pbvh, struct BMFace *f, bool log_face);
|
||||
void BKE_pbvh_bmesh_remove_vertex(PBVH *pbvh, struct BMVert *v, bool log_vert);
|
||||
void BKE_pbvh_bmesh_add_face(PBVH *pbvh, struct BMFace *f, bool log_face, bool force_tree_walk);
|
||||
|
||||
// note that e_tri and f_example are allowed to be NULL
|
||||
struct BMFace *BKE_pbvh_face_create_bmesh(PBVH *pbvh,
|
||||
struct BMVert *v_tri[3],
|
||||
struct BMEdge *e_tri[3],
|
||||
const struct BMFace *f_example);
|
||||
|
||||
// if node is NULL, one will be foudn in the pbvh, which potentially can be slow
|
||||
struct BMVert *BKE_pbvh_vert_create_bmesh(
|
||||
PBVH *pbvh, float co[3], float no[3], PBVHNode *node, struct BMVert *v_example);
|
||||
PBVHNode *BKE_pbvh_node_from_face_bmesh(PBVH *pbvh, struct BMFace *f);
|
||||
PBVHNode *BKE_pbvh_node_from_index(PBVH *pbvh, int node_i);
|
||||
|
||||
struct BMesh *BKE_pbvh_reorder_bmesh(PBVH *pbvh);
|
||||
void BKE_pbvh_update_vert_boundary(int cd_dyn_vert,
|
||||
int cd_faceset_offset,
|
||||
struct BMVert *v,
|
||||
int symmetry);
|
||||
|
||||
#define DYNTOPO_DYNAMIC_TESS
|
||||
|
||||
PBVHNode *BKE_pbvh_get_node_leaf_safe(PBVH *pbvh, int i);
|
||||
|
||||
void BKE_pbvh_get_vert_face_areas(PBVH *pbvh, SculptVertRef vertex, float *r_areas, int valence);
|
||||
void BKE_pbvh_set_symmetry(PBVH *pbvh, int symmetry, int boundary_symmetry);
|
||||
|
||||
#if 0
|
||||
typedef enum {
|
||||
SCULPT_TEXTURE_UV = 1 << 0, // per-uv
|
||||
// SCULPT_TEXTURE_PTEX?
|
||||
} SculptTextureType;
|
||||
|
||||
typedef int TexLayerRef;
|
||||
|
||||
/*
|
||||
Texture points are texels projected into 3d.
|
||||
*/
|
||||
typedef intptr_t TexPointRef;
|
||||
|
||||
void *BKE_pbvh_get_tex_settings(PBVH *pbvh, PBVHNode *node, TexLayerRef vdm);
|
||||
void *BKE_pbvh_get_tex_data(PBVH *pbvh, PBVHNode *node, TexPointRef vdm);
|
||||
|
||||
typedef struct SculptTextureDef {
|
||||
SculptTextureType type;
|
||||
int settings_size;
|
||||
|
||||
void (*build_begin)(PBVH *pbvh, PBVHNode *node, TexLayerRef vdm);
|
||||
|
||||
/*vdms can cache data per node, which is freed to maintain memory limit.
|
||||
they store cache in the same structure they return in buildNodeData.*/
|
||||
void (*freeCachedData)(PBVH *pbvh, PBVHNode *node, TexLayerRef vdm);
|
||||
void (*ensuredCachedData)(PBVH *pbvh, PBVHNode *node, TexLayerRef vdm);
|
||||
|
||||
/*builds all data that isn't cached.*/
|
||||
void *(*buildNodeData)(PBVH *pbvh, PBVHNode *node);
|
||||
bool (*validate)(PBVH *pbvh, TexLayerRef vdm);
|
||||
|
||||
void (*getPointsFromNode)(PBVH *pbvh,
|
||||
PBVHNode *node,
|
||||
TexLayerRef vdm,
|
||||
TexPointRef **r_ids,
|
||||
float ***r_cos,
|
||||
float ***r_nos,
|
||||
int *r_totpoint);
|
||||
void (*releaseNodePoints)(
|
||||
PBVH *pbvh, PBVHNode *node, TexLayerRef vdm, TexPointRef *ids, float **cos, float **nos);
|
||||
|
||||
# if 0
|
||||
int (*getTrisFromNode)(PBVH *pbvh,
|
||||
PBVHNode *node,
|
||||
TexLayerRef vdm,
|
||||
TexPointRef *((*r_tris)[3]),
|
||||
TexPointRef **r_ids,
|
||||
int tottri,
|
||||
int totid);
|
||||
void (*getTriInterpWeightsFromNode)(PBVH *pbvh,
|
||||
PBVHNode *node,
|
||||
TexLayerRef vdm,
|
||||
float *((*r_tris)[3]),
|
||||
SculptLoopRef ***r_src_loops,
|
||||
int tottri,
|
||||
int totloop);
|
||||
int (*getTriCount)(PBVH *pbvh, PBVHNode *node, TexLayerRef vdm);
|
||||
# endif
|
||||
|
||||
void (*getPointNeighbors)(PBVH *pbvh,
|
||||
PBVHNode *node,
|
||||
TexLayerRef vdm,
|
||||
TexPointRef id,
|
||||
TexPointRef **r_neighbor_ids,
|
||||
int *r_totneighbor,
|
||||
int maxneighbors,
|
||||
TexPointRef **r_duplicates_id,
|
||||
int r_totduplicate,
|
||||
int maxduplicates);
|
||||
void (*getPointValence)(PBVH *pbvh, PBVHNode *node, TexLayerRef vdm, TexPointRef id);
|
||||
void (*freeNodeData)(PBVH *pbvh, PBVHNode *node, TexLayerRef vdm, void *settings);
|
||||
|
||||
void (*getPointsFromIds)(
|
||||
PBVH *pbvh, PBVHNode *node, TexLayerRef vdm, TexPointRef *ids, int totid);
|
||||
|
||||
/*displacement texture stuff*/
|
||||
// can be tangent, object space displacement, whatever
|
||||
void (*worldToDelta)(PBVH *pbvh, PBVHNode *node, TexLayerRef vdm, TexPointRef *ids, int totid);
|
||||
void (*deltaToWorld)(PBVH *pbvh, PBVHNode *node, TexLayerRef vdm, TexPointRef *ids, int totid);
|
||||
} SculptDisplacementDef;
|
||||
|
||||
typedef struct SculptLayerEntry {
|
||||
char name[64];
|
||||
int type;
|
||||
void *settings;
|
||||
float factor;
|
||||
struct SculptLayerEntry *parent;
|
||||
} SculptLayerEntry;
|
||||
|
||||
#endif
|
||||
|
||||
int BKE_pbvh_do_fset_symmetry(int fset, const int symflag, const float *co);
|
||||
bool BKE_pbvh_check_vert_boundary(PBVH *pbvh, struct BMVert *v);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@@ -130,6 +130,11 @@ class Spline {
|
||||
virtual void translate(const blender::float3 &translation);
|
||||
virtual void transform(const blender::float4x4 &matrix);
|
||||
|
||||
/**
|
||||
* Change the direction of the spline (switch the start and end) without changing its shape.
|
||||
*/
|
||||
void reverse();
|
||||
|
||||
/**
|
||||
* Mark all caches for re-computation. This must be called after any operation that would
|
||||
* change the generated positions, tangents, normals, mapping, etc. of the evaluated points.
|
||||
@@ -210,6 +215,7 @@ class Spline {
|
||||
virtual void correct_end_tangents() const = 0;
|
||||
virtual void copy_settings(Spline &dst) const = 0;
|
||||
virtual void copy_data(Spline &dst) const = 0;
|
||||
virtual void reverse_impl() = 0;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -353,6 +359,9 @@ class BezierSpline final : public Spline {
|
||||
void correct_end_tangents() const final;
|
||||
void copy_settings(Spline &dst) const final;
|
||||
void copy_data(Spline &dst) const final;
|
||||
|
||||
protected:
|
||||
void reverse_impl() override;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -469,6 +478,7 @@ class NURBSpline final : public Spline {
|
||||
void correct_end_tangents() const final;
|
||||
void copy_settings(Spline &dst) const final;
|
||||
void copy_data(Spline &dst) const final;
|
||||
void reverse_impl() override;
|
||||
|
||||
void calculate_knots() const;
|
||||
blender::Span<BasisCache> calculate_basis_cache() const;
|
||||
@@ -519,6 +529,7 @@ class PolySpline final : public Spline {
|
||||
void correct_end_tangents() const final;
|
||||
void copy_settings(Spline &dst) const final;
|
||||
void copy_data(Spline &dst) const final;
|
||||
void reverse_impl() override;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -124,6 +124,7 @@ set(SRC
|
||||
intern/displist.cc
|
||||
intern/displist_tangent.c
|
||||
intern/dynamicpaint.c
|
||||
intern/dyntopo.c
|
||||
intern/editlattice.c
|
||||
intern/editmesh.c
|
||||
intern/editmesh_bvh.c
|
||||
@@ -186,7 +187,7 @@ set(SRC
|
||||
intern/mball_tessellate.c
|
||||
intern/mesh.c
|
||||
intern/mesh_boolean_convert.cc
|
||||
intern/mesh_convert.c
|
||||
intern/mesh_convert.cc
|
||||
intern/mesh_evaluate.cc
|
||||
intern/mesh_fair.cc
|
||||
intern/mesh_iterators.c
|
||||
@@ -235,6 +236,7 @@ set(SRC
|
||||
intern/particle_system.c
|
||||
intern/pbvh.c
|
||||
intern/pbvh_bmesh.c
|
||||
intern/pbvh_displacement.c
|
||||
intern/pointcache.c
|
||||
intern/pointcloud.cc
|
||||
intern/preferences.c
|
||||
@@ -287,6 +289,7 @@ set(SRC
|
||||
intern/workspace.c
|
||||
intern/world.c
|
||||
intern/writeavi.c
|
||||
intern/brush_engine.c
|
||||
|
||||
BKE_DerivedMesh.h
|
||||
BKE_action.h
|
||||
@@ -449,6 +452,7 @@ set(SRC
|
||||
BKE_workspace.h
|
||||
BKE_world.h
|
||||
BKE_writeavi.h
|
||||
BKE_brush_engine.h
|
||||
|
||||
nla_private.h
|
||||
particle_private.h
|
||||
@@ -794,3 +798,75 @@ if(WITH_GTESTS)
|
||||
include(GTestTesting)
|
||||
blender_add_test_lib(bf_blenkernel_tests "${TEST_SRC}" "${INC};${TEST_INC}" "${INC_SYS}" "${LIB}")
|
||||
endif()
|
||||
|
||||
if(false)
|
||||
set(PBVH_CACHE_TEST_INC
|
||||
.
|
||||
../blenfont
|
||||
../blenlib
|
||||
../blenloader
|
||||
../blentranslation
|
||||
../bmesh
|
||||
../depsgraph
|
||||
../draw
|
||||
../functions
|
||||
../gpencil_modifiers
|
||||
../gpu
|
||||
../ikplugin
|
||||
../imbuf
|
||||
../makesdna
|
||||
../makesrna
|
||||
../modifiers
|
||||
../nodes
|
||||
../render
|
||||
../sequencer
|
||||
../shader_fx
|
||||
../simulation
|
||||
../../../intern/eigen
|
||||
../../../intern/ghost
|
||||
../../../intern/glew-mx
|
||||
../../../intern/guardedalloc
|
||||
../../../intern/iksolver/extern
|
||||
../../../intern/atomic
|
||||
../../../intern/clog
|
||||
../../../intern/libmv
|
||||
../../../intern/mantaflow/extern
|
||||
../../../intern/memutil
|
||||
../../../intern/mikktspace
|
||||
../../../intern/opensubdiv
|
||||
../../../extern/curve_fit_nd
|
||||
)
|
||||
|
||||
set(PBVH_CACHE_TEST_SRC
|
||||
intern/pbvh_cache_test_main.c
|
||||
)
|
||||
|
||||
setup_libdirs()
|
||||
|
||||
add_executable(pbvh_cache_test ${PBVH_CACHE_TEST_SRC} ${PBVH_CACHE_TEST_INC})
|
||||
setup_platform_linker_flags(pbvh_cache_test)
|
||||
|
||||
target_link_libraries(pbvh_cache_test bf_blenkernel bf_bmesh bf_intern_ghost bf_blenlib bf_intern_guardedalloc)
|
||||
|
||||
if(WIN32)
|
||||
set_target_properties(pbvh_cache_test PROPERTIES VS_GLOBAL_VcpkgEnabled "false")
|
||||
set_target_properties(pbvh_cache_test PROPERTIES
|
||||
PDB_NAME "pbvh_cache_test_private"
|
||||
PDB_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>")
|
||||
if(WITH_WINDOWS_PDB AND WITH_WINDOWS_STRIPPED_PDB)
|
||||
# This is slightly messy, but single target generators like ninja will not have the
|
||||
# CMAKE_CFG_INTDIR variable and multitarget generators like msbuild will not have
|
||||
# CMAKE_BUILD_TYPE. This can be simplified by target_link_options and the $<CONFIG>
|
||||
# generator expression in newer cmake (2.13+) but until that time this fill have suffice.
|
||||
if(CMAKE_BUILD_TYPE)
|
||||
set_property(TARGET pbvh_cache_test APPEND_STRING PROPERTY LINK_FLAGS " /PDBSTRIPPED:${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/pbvh_cache_test_public.pdb")
|
||||
else()
|
||||
set_property(TARGET pbvh_cache_test APPEND_STRING PROPERTY LINK_FLAGS " /PDBSTRIPPED:${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/pbvh_cache_test_public.pdb")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (WIN32)
|
||||
target_link_libraries(pbvh_cache_test Vfw32.lib Imm32.lib Version.lib Comctl32.lib Shcore.lib Pathcch.lib)
|
||||
endif()
|
||||
endif()
|
||||
|
@@ -1140,7 +1140,7 @@ static void mesh_calc_modifiers(struct Depsgraph *depsgraph,
|
||||
unsupported = true;
|
||||
}
|
||||
|
||||
if (scene->toolsettings->sculpt->flags & SCULPT_ONLY_DEFORM) {
|
||||
if (scene->toolsettings->sculpt && scene->toolsettings->sculpt->flags & SCULPT_ONLY_DEFORM) {
|
||||
unsupported |= (mti->type != eModifierTypeType_OnlyDeform);
|
||||
}
|
||||
|
||||
|
@@ -425,7 +425,7 @@ void BKE_animdata_copy_id_action(Main *bmain, ID *id)
|
||||
|
||||
void BKE_animdata_duplicate_id_action(struct Main *bmain,
|
||||
struct ID *id,
|
||||
const eDupli_ID_Flags duplicate_flags)
|
||||
const uint duplicate_flags)
|
||||
{
|
||||
if (duplicate_flags & USER_DUP_ACT) {
|
||||
animdata_copy_id_action(bmain, id, true, (duplicate_flags & USER_DUP_LINKED_ID) != 0);
|
||||
|
@@ -51,7 +51,7 @@ typedef struct DomainInfo {
|
||||
int length;
|
||||
} DomainInfo;
|
||||
|
||||
static void get_domains(ID *id, DomainInfo info[ATTR_DOMAIN_NUM])
|
||||
static void get_domains(const ID *id, DomainInfo info[ATTR_DOMAIN_NUM])
|
||||
{
|
||||
memset(info, 0, sizeof(DomainInfo) * ATTR_DOMAIN_NUM);
|
||||
|
||||
@@ -223,6 +223,29 @@ bool BKE_id_attribute_remove(ID *id, CustomDataLayer *layer, ReportList *reports
|
||||
return true;
|
||||
}
|
||||
|
||||
CustomDataLayer *BKE_id_attribute_find(const ID *id,
|
||||
const char *name,
|
||||
const int type,
|
||||
const AttributeDomain domain)
|
||||
{
|
||||
DomainInfo info[ATTR_DOMAIN_NUM];
|
||||
get_domains(id, info);
|
||||
|
||||
CustomData *customdata = info[domain].customdata;
|
||||
if (customdata == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (int i = 0; i < customdata->totlayer; i++) {
|
||||
CustomDataLayer *layer = &customdata->layers[i];
|
||||
if (layer->type == type && STREQ(layer->name, name)) {
|
||||
return layer;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int BKE_id_attributes_length(ID *id, const CustomDataMask mask)
|
||||
{
|
||||
DomainInfo info[ATTR_DOMAIN_NUM];
|
||||
|
@@ -32,6 +32,8 @@
|
||||
#include "BLI_float2.hh"
|
||||
#include "BLI_span.hh"
|
||||
|
||||
#include "BLT_translation.h"
|
||||
|
||||
#include "CLG_log.h"
|
||||
|
||||
#include "NOD_type_conversions.hh"
|
||||
@@ -188,7 +190,7 @@ AttributeDomain attribute_domain_highest_priority(Span<AttributeDomain> domains)
|
||||
void OutputAttribute::save()
|
||||
{
|
||||
save_has_been_called_ = true;
|
||||
if (optional_span_varray_.has_value()) {
|
||||
if (optional_span_varray_) {
|
||||
optional_span_varray_->save();
|
||||
}
|
||||
if (save_) {
|
||||
@@ -815,6 +817,12 @@ bool GeometryComponent::attribute_is_builtin(const blender::StringRef attribute_
|
||||
return providers->builtin_attribute_providers().contains_as(attribute_name);
|
||||
}
|
||||
|
||||
bool GeometryComponent::attribute_is_builtin(const AttributeIDRef &attribute_id) const
|
||||
{
|
||||
/* Anonymous attributes cannot be built-in. */
|
||||
return attribute_id.is_named() && this->attribute_is_builtin(attribute_id.name());
|
||||
}
|
||||
|
||||
blender::bke::ReadAttributeLookup GeometryComponent::attribute_try_get_for_read(
|
||||
const AttributeIDRef &attribute_id) const
|
||||
{
|
||||
@@ -1208,7 +1216,7 @@ static OutputAttribute create_output_attribute(GeometryComponent &component,
|
||||
BLI_assert(cpp_type != nullptr);
|
||||
const nodes::DataTypeConversions &conversions = nodes::get_implicit_type_conversions();
|
||||
|
||||
if (attribute_id.is_named() && component.attribute_is_builtin(attribute_id.name())) {
|
||||
if (component.attribute_is_builtin(attribute_id)) {
|
||||
const StringRef attribute_name = attribute_id.name();
|
||||
WriteAttributeLookup attribute = component.attribute_try_get_for_write(attribute_name);
|
||||
if (!attribute) {
|
||||
@@ -1313,11 +1321,20 @@ const GVArray *AttributeFieldInput::get_varray_for_context(const fn::FieldContex
|
||||
const AttributeDomain domain = geometry_context->domain();
|
||||
const CustomDataType data_type = cpp_type_to_custom_data_type(*type_);
|
||||
GVArrayPtr attribute = component.attribute_try_get_for_read(name_, domain, data_type);
|
||||
return scope.add(std::move(attribute), __func__);
|
||||
if (attribute) {
|
||||
return scope.add(std::move(attribute));
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::string AttributeFieldInput::socket_inspection_name() const
|
||||
{
|
||||
std::stringstream ss;
|
||||
ss << TIP_("Attribute: ") << name_;
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
uint64_t AttributeFieldInput::hash() const
|
||||
{
|
||||
return get_default_hash_2(name_, type_);
|
||||
@@ -1341,11 +1358,18 @@ const GVArray *AnonymousAttributeFieldInput::get_varray_for_context(
|
||||
const CustomDataType data_type = cpp_type_to_custom_data_type(*type_);
|
||||
GVArrayPtr attribute = component.attribute_try_get_for_read(
|
||||
anonymous_id_.get(), domain, data_type);
|
||||
return scope.add(std::move(attribute), __func__);
|
||||
return scope.add(std::move(attribute));
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::string AnonymousAttributeFieldInput::socket_inspection_name() const
|
||||
{
|
||||
std::stringstream ss;
|
||||
ss << TIP_("Anonymous Attribute: ") << debug_name_;
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
uint64_t AnonymousAttributeFieldInput::hash() const
|
||||
{
|
||||
return get_default_hash_2(anonymous_id_.get(), type_);
|
||||
|
@@ -362,7 +362,9 @@ void BKE_blender_userdef_app_template_data_swap(UserDef *userdef_a, UserDef *use
|
||||
DATA_SWAP(app_flag);
|
||||
|
||||
/* We could add others. */
|
||||
FLAG_SWAP(uiflag, int, USER_SAVE_PROMPT);
|
||||
FLAG_SWAP(uiflag, int, USER_SAVE_PROMPT | USER_SPLASH_DISABLE | USER_SHOW_GIZMO_NAVIGATE);
|
||||
|
||||
DATA_SWAP(ui_scale);
|
||||
|
||||
#undef SWAP_TYPELESS
|
||||
#undef DATA_SWAP
|
||||
|
@@ -34,6 +34,7 @@
|
||||
#include "BLT_translation.h"
|
||||
|
||||
#include "BKE_brush.h"
|
||||
#include "BKE_brush_engine.h"
|
||||
#include "BKE_colortools.h"
|
||||
#include "BKE_context.h"
|
||||
#include "BKE_gpencil.h"
|
||||
@@ -161,7 +162,13 @@ static void brush_make_local(Main *bmain, ID *id, const int flags)
|
||||
|
||||
if (brush->clone.image) {
|
||||
/* Special case: ima always local immediately. Clone image should only have one user anyway. */
|
||||
BKE_lib_id_make_local(bmain, &brush->clone.image->id, false, 0);
|
||||
/* 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. */
|
||||
/* NOTE: assert below ensures that the comment above is valid, and that that exception is
|
||||
* acceptable for the time being. */
|
||||
BKE_lib_id_make_local(bmain, &brush->clone.image->id, 0);
|
||||
BLI_assert(brush->clone.image->id.lib == NULL && brush->clone.image->id.newid == NULL);
|
||||
}
|
||||
|
||||
if (!force_local && !force_copy) {
|
||||
@@ -256,12 +263,47 @@ static void brush_blend_write(BlendWriter *writer, ID *id, const void *id_addres
|
||||
if (brush->gradient) {
|
||||
BLO_write_struct(writer, ColorBand, brush->gradient);
|
||||
}
|
||||
|
||||
if (brush->channels) {
|
||||
BKE_brush_channelset_write(writer, brush->channels);
|
||||
}
|
||||
}
|
||||
|
||||
static void brush_blend_read_data(BlendDataReader *reader, ID *id)
|
||||
ATTR_NO_OPT static void brush_blend_read_data(BlendDataReader *reader, ID *id)
|
||||
{
|
||||
Brush *brush = (Brush *)id;
|
||||
|
||||
if (brush->channels) {
|
||||
BLO_read_data_address(reader, &brush->channels);
|
||||
BKE_brush_channelset_read(reader, brush->channels);
|
||||
}
|
||||
else {
|
||||
BKE_brush_builtin_create(brush, brush->sculpt_tool);
|
||||
}
|
||||
|
||||
if (brush->dyntopo.radius_scale == 0.0f) {
|
||||
brush->dyntopo.radius_scale = 1.0f;
|
||||
brush->dyntopo.inherit |= DYNTOPO_INHERIT_RADIUS_SCALE;
|
||||
}
|
||||
|
||||
// detect old file data
|
||||
if (brush->autosmooth_radius_factor == 0.0f) {
|
||||
brush->autosmooth_radius_factor = 1.0f;
|
||||
}
|
||||
|
||||
if (brush->topology_rake_radius_factor == 0.0f) {
|
||||
brush->topology_rake_radius_factor = 1.0f;
|
||||
}
|
||||
|
||||
if (brush->autosmooth_spacing == 0.0f) {
|
||||
brush->autosmooth_spacing = 12;
|
||||
}
|
||||
|
||||
if (brush->topology_rake_spacing == 0.0f) {
|
||||
brush->topology_rake_spacing = 12;
|
||||
brush->topology_rake_projection = 1.0f;
|
||||
}
|
||||
|
||||
/* Falloff curve. */
|
||||
BLO_read_data_address(reader, &brush->curve);
|
||||
|
||||
@@ -458,7 +500,13 @@ static void brush_defaults(Brush *brush)
|
||||
FROM_DEFAULT(alpha);
|
||||
FROM_DEFAULT(hardness);
|
||||
FROM_DEFAULT(autosmooth_factor);
|
||||
FROM_DEFAULT(autosmooth_projection);
|
||||
FROM_DEFAULT(autosmooth_radius_factor);
|
||||
FROM_DEFAULT(autosmooth_spacing);
|
||||
FROM_DEFAULT(topology_rake_factor);
|
||||
FROM_DEFAULT(topology_rake_radius_factor);
|
||||
FROM_DEFAULT(topology_rake_projection);
|
||||
FROM_DEFAULT(topology_rake_spacing);
|
||||
FROM_DEFAULT(crease_pinch_factor);
|
||||
FROM_DEFAULT(normal_radius_factor);
|
||||
FROM_DEFAULT(wet_paint_radius_factor);
|
||||
@@ -489,6 +537,7 @@ static void brush_defaults(Brush *brush)
|
||||
FROM_DEFAULT(stencil_dimension);
|
||||
FROM_DEFAULT(mtex);
|
||||
FROM_DEFAULT(mask_mtex);
|
||||
FROM_DEFAULT(dyntopo);
|
||||
|
||||
#undef FROM_DEFAULT
|
||||
#undef FROM_DEFAULT_PTR
|
||||
@@ -1656,6 +1705,8 @@ void BKE_brush_debug_print_state(Brush *br)
|
||||
BR_TEST(plane_offset, f);
|
||||
|
||||
BR_TEST(autosmooth_factor, f);
|
||||
BR_TEST(autosmooth_projection, f);
|
||||
BR_TEST(autosmooth_radius_factor, f);
|
||||
|
||||
BR_TEST(topology_rake_factor, f);
|
||||
|
||||
@@ -1697,6 +1748,12 @@ void BKE_brush_sculpt_reset(Brush *br)
|
||||
* assign this so logic below can remain the same. */
|
||||
br->alpha = 0.5f;
|
||||
|
||||
bool disable_dyntopo = false;
|
||||
|
||||
// basic face set setup for all organic brushes
|
||||
br->autosmooth_fset_slide = 1.0f;
|
||||
br->flag2 |= BRUSH_SMOOTH_PRESERVE_FACE_SETS | BRUSH_SMOOTH_USE_AREA_WEIGHT;
|
||||
|
||||
/* Brush settings */
|
||||
switch (br->sculpt_tool) {
|
||||
case SCULPT_TOOL_DRAW_SHARP:
|
||||
@@ -1708,11 +1765,16 @@ void BKE_brush_sculpt_reset(Brush *br)
|
||||
br->curve_preset = BRUSH_CURVE_SMOOTHER;
|
||||
br->spacing = 10;
|
||||
br->alpha = 1.0f;
|
||||
|
||||
disable_dyntopo = true;
|
||||
|
||||
break;
|
||||
case SCULPT_TOOL_SLIDE_RELAX:
|
||||
br->spacing = 10;
|
||||
br->alpha = 1.0f;
|
||||
br->slide_deform_type = BRUSH_SLIDE_DEFORM_DRAG;
|
||||
|
||||
disable_dyntopo = true;
|
||||
break;
|
||||
case SCULPT_TOOL_CLAY:
|
||||
br->flag |= BRUSH_SIZE_PRESSURE;
|
||||
@@ -1760,18 +1822,29 @@ void BKE_brush_sculpt_reset(Brush *br)
|
||||
break;
|
||||
case SCULPT_TOOL_ROTATE:
|
||||
br->alpha = 1.0;
|
||||
disable_dyntopo = true;
|
||||
|
||||
break;
|
||||
case SCULPT_TOOL_SMOOTH:
|
||||
br->flag &= ~BRUSH_SPACE_ATTEN;
|
||||
br->flag2 |= BRUSH_SMOOTH_PRESERVE_FACE_SETS | BRUSH_SMOOTH_USE_AREA_WEIGHT;
|
||||
|
||||
br->spacing = 5;
|
||||
br->alpha = 0.7f;
|
||||
br->surface_smooth_shape_preservation = 0.5f;
|
||||
br->surface_smooth_current_vertex = 0.5f;
|
||||
br->surface_smooth_iterations = 4;
|
||||
|
||||
disable_dyntopo = true;
|
||||
break;
|
||||
case SCULPT_TOOL_SNAKE_HOOK:
|
||||
br->alpha = 1.0f;
|
||||
br->rake_factor = 1.0f;
|
||||
br->dyntopo.inherit = DYNTOPO_INHERIT_BITMASK &
|
||||
~(DYNTOPO_INHERIT_ALL | DYNTOPO_LOCAL_COLLAPSE |
|
||||
DYNTOPO_INHERIT_DETAIL_RANGE);
|
||||
br->dyntopo.flag |= DYNTOPO_LOCAL_COLLAPSE;
|
||||
br->dyntopo.detail_range = 0.4f;
|
||||
break;
|
||||
case SCULPT_TOOL_THUMB:
|
||||
br->size = 75;
|
||||
@@ -1785,6 +1858,8 @@ void BKE_brush_sculpt_reset(Brush *br)
|
||||
br->flag &= ~BRUSH_ALPHA_PRESSURE;
|
||||
br->flag &= ~BRUSH_SPACE;
|
||||
br->flag &= ~BRUSH_SPACE_ATTEN;
|
||||
|
||||
disable_dyntopo = true;
|
||||
break;
|
||||
case SCULPT_TOOL_POSE:
|
||||
br->pose_smooth_iterations = 4;
|
||||
@@ -1793,18 +1868,24 @@ void BKE_brush_sculpt_reset(Brush *br)
|
||||
br->flag &= ~BRUSH_ALPHA_PRESSURE;
|
||||
br->flag &= ~BRUSH_SPACE;
|
||||
br->flag &= ~BRUSH_SPACE_ATTEN;
|
||||
|
||||
disable_dyntopo = true;
|
||||
break;
|
||||
case SCULPT_TOOL_BOUNDARY:
|
||||
br->flag &= ~BRUSH_ALPHA_PRESSURE;
|
||||
br->flag &= ~BRUSH_SPACE;
|
||||
br->flag &= ~BRUSH_SPACE_ATTEN;
|
||||
br->curve_preset = BRUSH_CURVE_CONSTANT;
|
||||
|
||||
disable_dyntopo = true;
|
||||
break;
|
||||
case SCULPT_TOOL_DRAW_FACE_SETS:
|
||||
br->alpha = 0.5f;
|
||||
br->flag &= ~BRUSH_ALPHA_PRESSURE;
|
||||
br->flag &= ~BRUSH_SPACE;
|
||||
br->flag &= ~BRUSH_SPACE_ATTEN;
|
||||
|
||||
disable_dyntopo = true;
|
||||
break;
|
||||
case SCULPT_TOOL_GRAB:
|
||||
br->alpha = 0.4f;
|
||||
@@ -1812,6 +1893,8 @@ void BKE_brush_sculpt_reset(Brush *br)
|
||||
br->flag &= ~BRUSH_ALPHA_PRESSURE;
|
||||
br->flag &= ~BRUSH_SPACE;
|
||||
br->flag &= ~BRUSH_SPACE_ATTEN;
|
||||
|
||||
disable_dyntopo = true;
|
||||
break;
|
||||
case SCULPT_TOOL_CLOTH:
|
||||
br->cloth_mass = 1.0f;
|
||||
@@ -1820,6 +1903,8 @@ void BKE_brush_sculpt_reset(Brush *br)
|
||||
br->cloth_sim_falloff = 0.75f;
|
||||
br->cloth_deform_type = BRUSH_CLOTH_DEFORM_DRAG;
|
||||
br->flag &= ~(BRUSH_ALPHA_PRESSURE | BRUSH_SIZE_PRESSURE);
|
||||
|
||||
disable_dyntopo = true;
|
||||
break;
|
||||
case SCULPT_TOOL_LAYER:
|
||||
br->flag &= ~BRUSH_SPACE_ATTEN;
|
||||
@@ -1837,6 +1922,8 @@ void BKE_brush_sculpt_reset(Brush *br)
|
||||
br->density = 1.0f;
|
||||
br->flag &= ~BRUSH_SPACE_ATTEN;
|
||||
zero_v3(br->rgb);
|
||||
|
||||
disable_dyntopo = true;
|
||||
break;
|
||||
case SCULPT_TOOL_SMEAR:
|
||||
br->alpha = 1.0f;
|
||||
@@ -1844,6 +1931,18 @@ void BKE_brush_sculpt_reset(Brush *br)
|
||||
br->flag &= ~BRUSH_ALPHA_PRESSURE;
|
||||
br->flag &= ~BRUSH_SPACE_ATTEN;
|
||||
br->curve_preset = BRUSH_CURVE_SPHERE;
|
||||
|
||||
disable_dyntopo = true;
|
||||
break;
|
||||
case SCULPT_TOOL_VCOL_BOUNDARY:
|
||||
br->flag &= ~BRUSH_SPACE_ATTEN;
|
||||
br->spacing = 5;
|
||||
br->alpha = 0.7f;
|
||||
br->surface_smooth_shape_preservation = 0.5f;
|
||||
br->surface_smooth_current_vertex = 0.5f;
|
||||
br->surface_smooth_iterations = 4;
|
||||
|
||||
disable_dyntopo = true;
|
||||
break;
|
||||
case SCULPT_TOOL_DISPLACEMENT_SMEAR:
|
||||
br->alpha = 1.0f;
|
||||
@@ -1852,11 +1951,17 @@ void BKE_brush_sculpt_reset(Brush *br)
|
||||
br->flag &= ~BRUSH_ALPHA_PRESSURE;
|
||||
br->flag &= ~BRUSH_SPACE_ATTEN;
|
||||
br->curve_preset = BRUSH_CURVE_SMOOTHER;
|
||||
disable_dyntopo = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (disable_dyntopo) {
|
||||
// disabled flag is never inherited
|
||||
br->dyntopo.flag |= DYNTOPO_DISABLED;
|
||||
}
|
||||
|
||||
/* Cursor colors */
|
||||
|
||||
/* Default Alpha */
|
||||
@@ -1913,6 +2018,20 @@ void BKE_brush_sculpt_reset(Brush *br)
|
||||
break;
|
||||
|
||||
case SCULPT_TOOL_SIMPLIFY:
|
||||
// don't use DYNTOPO_INHERIT_BITMASK, we want to include
|
||||
// future bits
|
||||
|
||||
br->flag2 |= BRUSH_SMOOTH_PRESERVE_FACE_SETS | BRUSH_SMOOTH_USE_AREA_WEIGHT |
|
||||
BRUSH_CURVATURE_RAKE;
|
||||
br->dyntopo.inherit = 0x7FFFFFFF &
|
||||
~(DYNTOPO_INHERIT_ALL | DYNTOPO_SUBDIVIDE | DYNTOPO_COLLAPSE);
|
||||
br->dyntopo.flag |= DYNTOPO_COLLAPSE | DYNTOPO_SUBDIVIDE;
|
||||
br->autosmooth_factor = 0.05;
|
||||
br->topology_rake_factor = 0.35;
|
||||
br->topology_rake_projection = 0.975;
|
||||
|
||||
break;
|
||||
case SCULPT_TOOL_VCOL_BOUNDARY:
|
||||
case SCULPT_TOOL_PAINT:
|
||||
case SCULPT_TOOL_MASK:
|
||||
case SCULPT_TOOL_DRAW_FACE_SETS:
|
||||
@@ -2548,3 +2667,158 @@ struct ImBuf *BKE_brush_gen_radial_control_imbuf(Brush *br, bool secondary, bool
|
||||
|
||||
return im;
|
||||
}
|
||||
|
||||
void BKE_brush_get_dyntopo(Brush *brush, Sculpt *sd, DynTopoSettings *out)
|
||||
{
|
||||
*out = brush->dyntopo;
|
||||
|
||||
// detect unconverted file data
|
||||
if (!out->inherit && !out->detail_range) {
|
||||
// reload default dyntopo settings
|
||||
Brush brush2 = *brush;
|
||||
|
||||
// don't copy heap allocd data
|
||||
brush2.curve = NULL;
|
||||
brush2.icon_imbuf = NULL;
|
||||
brush2.gpencil_settings = NULL;
|
||||
brush2.gradient = NULL;
|
||||
brush2.preview = NULL;
|
||||
|
||||
BKE_brush_sculpt_reset(&brush2);
|
||||
|
||||
brush->dyntopo = *out = brush2.dyntopo;
|
||||
|
||||
brush_free_data((ID *)&brush2);
|
||||
}
|
||||
else if (!out->detail_size) {
|
||||
brush->dyntopo.inherit |= DYNTOPO_INHERIT_DETAIL_SIZE;
|
||||
brush->dyntopo.detail_size = 8.0f;
|
||||
}
|
||||
|
||||
int inherit = out->inherit;
|
||||
|
||||
if (inherit & DYNTOPO_INHERIT_ALL) {
|
||||
inherit = 0x7FFFFFFF;
|
||||
}
|
||||
|
||||
if (!(sd->flags & SCULPT_DYNTOPO_ENABLED)) {
|
||||
out->flag |= DYNTOPO_DISABLED;
|
||||
}
|
||||
|
||||
if (inherit & DYNTOPO_INHERIT_MODE) {
|
||||
if (sd->flags & SCULPT_DYNTOPO_DETAIL_CONSTANT) {
|
||||
out->mode = DYNTOPO_DETAIL_CONSTANT;
|
||||
}
|
||||
else if (sd->flags & SCULPT_DYNTOPO_DETAIL_BRUSH) {
|
||||
out->mode = DYNTOPO_DETAIL_BRUSH;
|
||||
}
|
||||
else if (sd->flags & SCULPT_DYNTOPO_DETAIL_MANUAL) {
|
||||
out->mode = DYNTOPO_DETAIL_MANUAL;
|
||||
}
|
||||
else {
|
||||
out->mode = DYNTOPO_DETAIL_RELATIVE;
|
||||
}
|
||||
}
|
||||
|
||||
if (inherit & DYNTOPO_INHERIT_RADIUS_SCALE) {
|
||||
out->radius_scale = sd->dyntopo_radius_scale;
|
||||
}
|
||||
|
||||
if (inherit & DYNTOPO_INHERIT_DETAIL_SIZE) {
|
||||
out->detail_size = sd->detail_size;
|
||||
}
|
||||
|
||||
if (inherit & DYNTOPO_INHERIT_DETAIL_RANGE) {
|
||||
out->detail_range = sd->detail_range;
|
||||
}
|
||||
|
||||
if (inherit & DYNTOPO_INHERIT_DETAIL_PERCENT) {
|
||||
out->detail_percent = sd->detail_percent;
|
||||
}
|
||||
|
||||
if (inherit & DYNTOPO_INHERIT_SPACING) {
|
||||
out->spacing = sd->dyntopo_spacing;
|
||||
}
|
||||
|
||||
if (inherit & DYNTOPO_INHERIT_CONSTANT_DETAIL) {
|
||||
out->constant_detail = sd->constant_detail;
|
||||
}
|
||||
|
||||
if (inherit & DYNTOPO_SUBDIVIDE) {
|
||||
if (sd->flags & SCULPT_DYNTOPO_SUBDIVIDE) {
|
||||
out->flag |= DYNTOPO_SUBDIVIDE;
|
||||
}
|
||||
else {
|
||||
out->flag &= ~DYNTOPO_SUBDIVIDE;
|
||||
}
|
||||
}
|
||||
|
||||
if (inherit & DYNTOPO_LOCAL_COLLAPSE) {
|
||||
if (sd->flags & SCULPT_DYNTOPO_LOCAL_COLLAPSE) {
|
||||
out->flag |= DYNTOPO_LOCAL_COLLAPSE;
|
||||
}
|
||||
else {
|
||||
out->flag &= ~DYNTOPO_LOCAL_COLLAPSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (inherit & DYNTOPO_LOCAL_SUBDIVIDE) {
|
||||
if (sd->flags & SCULPT_DYNTOPO_LOCAL_SUBDIVIDE) {
|
||||
out->flag |= DYNTOPO_LOCAL_SUBDIVIDE;
|
||||
}
|
||||
else {
|
||||
out->flag &= ~DYNTOPO_LOCAL_SUBDIVIDE;
|
||||
}
|
||||
}
|
||||
|
||||
if (inherit & DYNTOPO_COLLAPSE) {
|
||||
if (sd->flags & SCULPT_DYNTOPO_COLLAPSE) {
|
||||
out->flag |= DYNTOPO_COLLAPSE;
|
||||
}
|
||||
else {
|
||||
out->flag &= ~DYNTOPO_COLLAPSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (inherit & DYNTOPO_CLEANUP) {
|
||||
if (sd->flags & SCULPT_DYNTOPO_CLEANUP) {
|
||||
out->flag |= DYNTOPO_CLEANUP;
|
||||
}
|
||||
else {
|
||||
out->flag &= ~DYNTOPO_CLEANUP;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
bool BKE_brush_hard_edge_mode_get(const Scene *scene, const Brush *brush)
|
||||
{
|
||||
UnifiedPaintSettings *ups = &scene->toolsettings->unified_paint_settings;
|
||||
bool ret = (ups->flag & UNIFIED_PAINT_FLAG_HARD_EDGE_MODE) ? ups->hard_edge_mode :
|
||||
brush->flag2 & BRUSH_HARD_EDGE_MODE;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void BKE_brush_hard_edge_mode_set(Scene *scene, Brush *brush, bool val)
|
||||
{
|
||||
UnifiedPaintSettings *ups = &scene->toolsettings->unified_paint_settings;
|
||||
|
||||
if (ups->flag & UNIFIED_PAINT_FLAG_HARD_EDGE_MODE) {
|
||||
ups->hard_edge_mode = val;
|
||||
}
|
||||
else {
|
||||
if (val) {
|
||||
brush->flag2 |= BRUSH_HARD_EDGE_MODE;
|
||||
}
|
||||
else {
|
||||
brush->flag2 &= ~BRUSH_HARD_EDGE_MODE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
float BKE_brush_fset_slide_get(const Scene *scene, const Brush *brush)
|
||||
{
|
||||
UnifiedPaintSettings *ups = &scene->toolsettings->unified_paint_settings;
|
||||
|
||||
return BKE_brush_hard_edge_mode_get(scene, brush) ? 0.0f : brush->autosmooth_fset_slide;
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user