Compare commits
102 Commits
blender-v2
...
geometry-n
Author | SHA1 | Date | |
---|---|---|---|
bf4b31468e | |||
f5de32562e | |||
bc4e31afb6 | |||
594f47ecd2 | |||
f32ab724eb | |||
065dfdc529 | |||
3c42892610 | |||
69a22afdb6 | |||
390b28e338 | |||
83ddd658a6 | |||
![]() |
559e87ad08 | ||
0d1b1c341f | |||
50c475e534 | |||
9d7672be71 | |||
994e7178bb | |||
1719743066 | |||
8910033f57 | |||
2a4c6c612a | |||
e4728d0a16 | |||
56a3566e64 | |||
b062b922f9 | |||
895f4620a0 | |||
06e6068902 | |||
3f12f02bea | |||
14a4961490 | |||
c6281d5dc7 | |||
165b4f85ec | |||
ff8ecf105c | |||
a3f5154448 | |||
9b46d3cc80 | |||
2261da2897 | |||
7863ded680 | |||
fafed6234b | |||
d453bbbd26 | |||
3953833b60 | |||
![]() |
383c20a6ab | ||
7ff8094a8b | |||
5aabf67a9c | |||
b5169cd230 | |||
ab8c7fe946 | |||
a05012d500 | |||
e79154de73 | |||
2985a745bb | |||
90eab4a25d | |||
a8837c6cb0 | |||
cd7354f9f5 | |||
97a93566e9 | |||
f73dad211b | |||
992a88b38b | |||
658370e9e1 | |||
da4d697772 | |||
87218899be | |||
ffa0a6df9d | |||
706fa5ad76 | |||
dea3b8d984 | |||
107199426c | |||
d11e357824 | |||
f68c3d557a | |||
6c178bf439 | |||
36653a92fa | |||
cf5ae6718c | |||
fe963b5a41 | |||
d00b1f6313 | |||
0c36255c48 | |||
a308607a53 | |||
6ebb2e5e2b | |||
608243c79c | |||
f5080c82dd | |||
358a584985 | |||
b9c8eb3b0c | |||
e9ae8148ae | |||
899d6d4db9 | |||
37df2ebaa9 | |||
cee35b2ca5 | |||
d6a43abc3a | |||
b632c1e90d | |||
ca87f4c45d | |||
![]() |
ef5d6e9c45 | ||
b7f6de490d | |||
8a22b76988 | |||
d7e3b3aed0 | |||
0b3cb54887 | |||
0da8eb7bd0 | |||
e296d58cf2 | |||
657e344351 | |||
![]() |
bb49aa0d69 | ||
b5803c0a24 | |||
ce76f2db94 | |||
b6e0661e9e | |||
f2d454c829 | |||
9216b8d6cb | |||
7e485b4620 | |||
a7dba81aab | |||
4606e83a75 | |||
1d28de57a4 | |||
3cfcfb938d | |||
bcdc6910a0 | |||
7793e8c884 | |||
05d9bd7c4a | |||
9255ce9247 | |||
a0ce0154e7 | |||
0cd7f7ddd1 |
@@ -18,72 +18,12 @@
|
||||
|
||||
# <pep8 compliant>
|
||||
|
||||
import dataclasses
|
||||
import json
|
||||
import os
|
||||
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
|
||||
import codesign.util as util
|
||||
|
||||
|
||||
class ArchiveStateError(Exception):
|
||||
message: str
|
||||
|
||||
def __init__(self, message):
|
||||
self.message = message
|
||||
super().__init__(self.message)
|
||||
|
||||
|
||||
@dataclasses.dataclass
|
||||
class ArchiveState:
|
||||
"""
|
||||
Additional information (state) of the archive
|
||||
|
||||
Includes information like expected file size of the archive file in the case
|
||||
the archive file is expected to be successfully created.
|
||||
|
||||
If the archive can not be created, this state will contain error message
|
||||
indicating details of error.
|
||||
"""
|
||||
|
||||
# Size in bytes of the corresponding archive.
|
||||
file_size: Optional[int] = None
|
||||
|
||||
# Non-empty value indicates that error has happenned.
|
||||
error_message: str = ''
|
||||
|
||||
def has_error(self) -> bool:
|
||||
"""
|
||||
Check whether the archive is at error state
|
||||
"""
|
||||
|
||||
return self.error_message
|
||||
|
||||
def serialize_to_string(self) -> str:
|
||||
payload = dataclasses.asdict(self)
|
||||
return json.dumps(payload, sort_keys=True, indent=4)
|
||||
|
||||
def serialize_to_file(self, filepath: Path) -> None:
|
||||
string = self.serialize_to_string()
|
||||
filepath.write_text(string)
|
||||
|
||||
@classmethod
|
||||
def deserialize_from_string(cls, string: str) -> 'ArchiveState':
|
||||
try:
|
||||
object_as_dict = json.loads(string)
|
||||
except json.decoder.JSONDecodeError:
|
||||
raise ArchiveStateError('Error parsing JSON')
|
||||
|
||||
return cls(**object_as_dict)
|
||||
|
||||
@classmethod
|
||||
def deserialize_from_file(cls, filepath: Path):
|
||||
string = filepath.read_text()
|
||||
return cls.deserialize_from_string(string)
|
||||
|
||||
|
||||
class ArchiveWithIndicator:
|
||||
"""
|
||||
The idea of this class is to wrap around logic which takes care of keeping
|
||||
@@ -139,19 +79,6 @@ class ArchiveWithIndicator:
|
||||
if not self.ready_indicator_filepath.exists():
|
||||
return False
|
||||
|
||||
try:
|
||||
archive_state = ArchiveState.deserialize_from_file(
|
||||
self.ready_indicator_filepath)
|
||||
except ArchiveStateError as error:
|
||||
print(f'Error deserializing archive state: {error.message}')
|
||||
return False
|
||||
|
||||
if archive_state.has_error():
|
||||
# If the error did happen during codesign procedure there will be no
|
||||
# corresponding archive file.
|
||||
# The caller code will deal with the error check further.
|
||||
return True
|
||||
|
||||
# Sometimes on macOS indicator file appears prior to the actual archive
|
||||
# despite the order of creation and os.sync() used in tag_ready().
|
||||
# So consider archive not ready if there is an indicator without an
|
||||
@@ -161,11 +88,23 @@ class ArchiveWithIndicator:
|
||||
f'({self.archive_filepath}) to appear.')
|
||||
return False
|
||||
|
||||
# Read archive size from indicator/
|
||||
#
|
||||
# Assume that file is either empty or is fully written. This is being checked
|
||||
# by performing ValueError check since empty string will throw this exception
|
||||
# when attempted to be converted to int.
|
||||
expected_archive_size_str = self.ready_indicator_filepath.read_text()
|
||||
try:
|
||||
expected_archive_size = int(expected_archive_size_str)
|
||||
except ValueError:
|
||||
print(f'Invalid archive size "{expected_archive_size_str}"')
|
||||
return False
|
||||
|
||||
# Wait for until archive is fully stored.
|
||||
actual_archive_size = self.archive_filepath.stat().st_size
|
||||
if actual_archive_size != archive_state.file_size:
|
||||
if actual_archive_size != expected_archive_size:
|
||||
print('Partial/invalid archive size (expected '
|
||||
f'{archive_state.file_size} got {actual_archive_size})')
|
||||
f'{expected_archive_size} got {actual_archive_size})')
|
||||
return False
|
||||
|
||||
return True
|
||||
@@ -190,7 +129,7 @@ class ArchiveWithIndicator:
|
||||
print(f'Exception checking archive: {e}')
|
||||
return False
|
||||
|
||||
def tag_ready(self, error_message='') -> None:
|
||||
def tag_ready(self) -> None:
|
||||
"""
|
||||
Tag the archive as ready by creating the corresponding indication file.
|
||||
|
||||
@@ -199,34 +138,13 @@ class ArchiveWithIndicator:
|
||||
If it is violated, an assert will fail.
|
||||
"""
|
||||
assert not self.is_ready()
|
||||
|
||||
# Try the best to make sure everything is synced to the file system,
|
||||
# to avoid any possibility of stamp appearing on a network share prior to
|
||||
# an actual file.
|
||||
if util.get_current_platform() != util.Platform.WINDOWS:
|
||||
os.sync()
|
||||
|
||||
archive_size = -1
|
||||
if self.archive_filepath.exists():
|
||||
archive_size = self.archive_filepath.stat().st_size
|
||||
|
||||
archive_info = ArchiveState(
|
||||
file_size=archive_size, error_message=error_message)
|
||||
|
||||
self.ready_indicator_filepath.write_text(
|
||||
archive_info.serialize_to_string())
|
||||
|
||||
def get_state(self) -> ArchiveState:
|
||||
"""
|
||||
Get state object for this archive
|
||||
|
||||
The state is read from the corresponding state file.
|
||||
"""
|
||||
|
||||
try:
|
||||
return ArchiveState.deserialize_from_file(self.ready_indicator_filepath)
|
||||
except ArchiveStateError as error:
|
||||
return ArchiveState(error_message=f'Error in information format: {error}')
|
||||
archive_size = self.archive_filepath.stat().st_size
|
||||
self.ready_indicator_filepath.write_text(str(archive_size))
|
||||
|
||||
def clean(self) -> None:
|
||||
"""
|
||||
|
@@ -58,7 +58,6 @@ import codesign.util as util
|
||||
|
||||
from codesign.absolute_and_relative_filename import AbsoluteAndRelativeFileName
|
||||
from codesign.archive_with_indicator import ArchiveWithIndicator
|
||||
from codesign.exception import CodeSignException
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -146,13 +145,13 @@ class BaseCodeSigner(metaclass=abc.ABCMeta):
|
||||
def cleanup_environment_for_builder(self) -> None:
|
||||
# TODO(sergey): Revisit need of cleaning up the existing files.
|
||||
# In practice it wasn't so helpful, and with multiple clients
|
||||
# talking to the same server it becomes even more tricky.
|
||||
# talking to the same server it becomes even mor etricky.
|
||||
pass
|
||||
|
||||
def cleanup_environment_for_signing_server(self) -> None:
|
||||
# TODO(sergey): Revisit need of cleaning up the existing files.
|
||||
# In practice it wasn't so helpful, and with multiple clients
|
||||
# talking to the same server it becomes even more tricky.
|
||||
# talking to the same server it becomes even mor etricky.
|
||||
pass
|
||||
|
||||
def generate_request_id(self) -> str:
|
||||
@@ -221,15 +220,9 @@ class BaseCodeSigner(metaclass=abc.ABCMeta):
|
||||
"""
|
||||
Wait until archive with signed files is available.
|
||||
|
||||
Will only return if the archive with signed files is available. If there
|
||||
was an error during code sign procedure the SystemExit exception is
|
||||
raised, with the message set to the error reported by the codesign
|
||||
server.
|
||||
|
||||
Will only wait for the configured time. If that time exceeds and there
|
||||
is still no responce from the signing server the application will exit
|
||||
with a non-zero exit code.
|
||||
|
||||
"""
|
||||
|
||||
signed_archive_info = self.signed_archive_info_for_request_id(
|
||||
@@ -243,17 +236,9 @@ class BaseCodeSigner(metaclass=abc.ABCMeta):
|
||||
time.sleep(1)
|
||||
time_slept_in_seconds = time.monotonic() - time_start
|
||||
if time_slept_in_seconds > timeout_in_seconds:
|
||||
signed_archive_info.clean()
|
||||
unsigned_archive_info.clean()
|
||||
raise SystemExit("Signing server didn't finish signing in "
|
||||
f'{timeout_in_seconds} seconds, dying :(')
|
||||
|
||||
archive_state = signed_archive_info.get_state()
|
||||
if archive_state.has_error():
|
||||
signed_archive_info.clean()
|
||||
unsigned_archive_info.clean()
|
||||
raise SystemExit(
|
||||
f'Error happenned during codesign procedure: {archive_state.error_message}')
|
||||
f"{timeout_in_seconds} seconds, dying :(")
|
||||
|
||||
def copy_signed_files_to_directory(
|
||||
self, signed_dir: Path, destination_dir: Path) -> None:
|
||||
@@ -411,13 +396,7 @@ class BaseCodeSigner(metaclass=abc.ABCMeta):
|
||||
temp_dir)
|
||||
|
||||
logger_server.info('Signing all requested files...')
|
||||
try:
|
||||
self.sign_all_files(files)
|
||||
except CodeSignException as error:
|
||||
signed_archive_info.tag_ready(error_message=error.message)
|
||||
unsigned_archive_info.clean()
|
||||
logger_server.info('Signing is complete with errors.')
|
||||
return
|
||||
self.sign_all_files(files)
|
||||
|
||||
logger_server.info('Packing signed files...')
|
||||
pack_files(files=files,
|
||||
|
@@ -1,26 +0,0 @@
|
||||
# ##### BEGIN GPL LICENSE BLOCK #####
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ##### END GPL LICENSE BLOCK #####
|
||||
|
||||
# <pep8 compliant>
|
||||
|
||||
class CodeSignException(Exception):
|
||||
message: str
|
||||
|
||||
def __init__(self, message):
|
||||
self.message = message
|
||||
super().__init__(self.message)
|
@@ -33,7 +33,6 @@ from buildbot_utils import Builder
|
||||
|
||||
from codesign.absolute_and_relative_filename import AbsoluteAndRelativeFileName
|
||||
from codesign.base_code_signer import BaseCodeSigner
|
||||
from codesign.exception import CodeSignException
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
logger_server = logger.getChild('server')
|
||||
@@ -46,10 +45,6 @@ EXTENSIONS_TO_BE_SIGNED = {'.dylib', '.so', '.dmg'}
|
||||
NAME_PREFIXES_TO_BE_SIGNED = {'python'}
|
||||
|
||||
|
||||
class NotarizationException(CodeSignException):
|
||||
pass
|
||||
|
||||
|
||||
def is_file_from_bundle(file: AbsoluteAndRelativeFileName) -> bool:
|
||||
"""
|
||||
Check whether file is coming from an .app bundle
|
||||
@@ -191,7 +186,7 @@ class MacOSCodeSigner(BaseCodeSigner):
|
||||
file.absolute_filepath]
|
||||
self.run_command_or_mock(command, util.Platform.MACOS)
|
||||
|
||||
def codesign_all_files(self, files: List[AbsoluteAndRelativeFileName]) -> None:
|
||||
def codesign_all_files(self, files: List[AbsoluteAndRelativeFileName]) -> bool:
|
||||
"""
|
||||
Run codesign tool on all eligible files in the given list.
|
||||
|
||||
@@ -230,6 +225,8 @@ class MacOSCodeSigner(BaseCodeSigner):
|
||||
file_index + 1, num_signed_files,
|
||||
signed_file.relative_filepath)
|
||||
|
||||
return True
|
||||
|
||||
def codesign_bundles(
|
||||
self, files: List[AbsoluteAndRelativeFileName]) -> None:
|
||||
"""
|
||||
@@ -276,6 +273,8 @@ class MacOSCodeSigner(BaseCodeSigner):
|
||||
|
||||
files.extend(extra_files)
|
||||
|
||||
return True
|
||||
|
||||
############################################################################
|
||||
# Notarization.
|
||||
|
||||
@@ -335,40 +334,7 @@ class MacOSCodeSigner(BaseCodeSigner):
|
||||
logger_server.error('xcrun command did not report RequestUUID')
|
||||
return None
|
||||
|
||||
def notarize_review_status(self, xcrun_output: str) -> bool:
|
||||
"""
|
||||
Review status returned by xcrun's notarization info
|
||||
|
||||
Returns truth if the notarization process has finished.
|
||||
If there are errors during notarization, a NotarizationException()
|
||||
exception is thrown with status message from the notarial office.
|
||||
"""
|
||||
|
||||
# Parse status and message
|
||||
status = xcrun_field_value_from_output('Status', xcrun_output)
|
||||
status_message = xcrun_field_value_from_output(
|
||||
'Status Message', xcrun_output)
|
||||
|
||||
if status == 'success':
|
||||
logger_server.info(
|
||||
'Package successfully notarized: %s', status_message)
|
||||
return True
|
||||
|
||||
if status == 'invalid':
|
||||
logger_server.error(xcrun_output)
|
||||
logger_server.error(
|
||||
'Package notarization has failed: %s', status_message)
|
||||
raise NotarizationException(status_message)
|
||||
|
||||
if status == 'in progress':
|
||||
return False
|
||||
|
||||
logger_server.info(
|
||||
'Unknown notarization status %s (%s)', status, status_message)
|
||||
|
||||
return False
|
||||
|
||||
def notarize_wait_result(self, request_uuid: str) -> None:
|
||||
def notarize_wait_result(self, request_uuid: str) -> bool:
|
||||
"""
|
||||
Wait for until notarial office have a reply
|
||||
"""
|
||||
@@ -385,11 +351,29 @@ class MacOSCodeSigner(BaseCodeSigner):
|
||||
timeout_in_seconds = self.config.MACOS_NOTARIZE_TIMEOUT_IN_SECONDS
|
||||
|
||||
while True:
|
||||
xcrun_output = self.check_output_or_mock(
|
||||
output = self.check_output_or_mock(
|
||||
command, util.Platform.MACOS, allow_nonzero_exit_code=True)
|
||||
# Parse status and message
|
||||
status = xcrun_field_value_from_output('Status', output)
|
||||
status_message = xcrun_field_value_from_output(
|
||||
'Status Message', output)
|
||||
|
||||
if self.notarize_review_status(xcrun_output):
|
||||
break
|
||||
# Review status.
|
||||
if status:
|
||||
if status == 'success':
|
||||
logger_server.info(
|
||||
'Package successfully notarized: %s', status_message)
|
||||
return True
|
||||
elif status == 'invalid':
|
||||
logger_server.error(output)
|
||||
logger_server.error(
|
||||
'Package notarization has failed: %s', status_message)
|
||||
return False
|
||||
elif status == 'in progress':
|
||||
pass
|
||||
else:
|
||||
logger_server.info(
|
||||
'Unknown notarization status %s (%s)', status, status_message)
|
||||
|
||||
logger_server.info('Keep waiting for notarization office.')
|
||||
time.sleep(30)
|
||||
@@ -410,6 +394,8 @@ class MacOSCodeSigner(BaseCodeSigner):
|
||||
command = ['xcrun', 'stapler', 'staple', '-v', file.absolute_filepath]
|
||||
self.check_output_or_mock(command, util.Platform.MACOS)
|
||||
|
||||
return True
|
||||
|
||||
def notarize_dmg(self, file: AbsoluteAndRelativeFileName) -> bool:
|
||||
"""
|
||||
Run entire pipeline to get DMG notarized.
|
||||
@@ -428,7 +414,10 @@ class MacOSCodeSigner(BaseCodeSigner):
|
||||
return False
|
||||
|
||||
# Staple.
|
||||
self.notarize_staple(file)
|
||||
if not self.notarize_staple(file):
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def notarize_all_dmg(
|
||||
self, files: List[AbsoluteAndRelativeFileName]) -> bool:
|
||||
@@ -443,7 +432,10 @@ class MacOSCodeSigner(BaseCodeSigner):
|
||||
if not self.check_file_is_to_be_signed(file):
|
||||
continue
|
||||
|
||||
self.notarize_dmg(file)
|
||||
if not self.notarize_dmg(file):
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
############################################################################
|
||||
# Entry point.
|
||||
@@ -451,6 +443,11 @@ class MacOSCodeSigner(BaseCodeSigner):
|
||||
def sign_all_files(self, files: List[AbsoluteAndRelativeFileName]) -> None:
|
||||
# TODO(sergey): Handle errors somehow.
|
||||
|
||||
self.codesign_all_files(files)
|
||||
self.codesign_bundles(files)
|
||||
self.notarize_all_dmg(files)
|
||||
if not self.codesign_all_files(files):
|
||||
return
|
||||
|
||||
if not self.codesign_bundles(files):
|
||||
return
|
||||
|
||||
if not self.notarize_all_dmg(files):
|
||||
return
|
||||
|
@@ -29,7 +29,6 @@ from buildbot_utils import Builder
|
||||
|
||||
from codesign.absolute_and_relative_filename import AbsoluteAndRelativeFileName
|
||||
from codesign.base_code_signer import BaseCodeSigner
|
||||
from codesign.exception import CodeSignException
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
logger_server = logger.getChild('server')
|
||||
@@ -41,9 +40,6 @@ BLACKLIST_FILE_PREFIXES = (
|
||||
'api-ms-', 'concrt', 'msvcp', 'ucrtbase', 'vcomp', 'vcruntime')
|
||||
|
||||
|
||||
class SigntoolException(CodeSignException):
|
||||
pass
|
||||
|
||||
class WindowsCodeSigner(BaseCodeSigner):
|
||||
def check_file_is_to_be_signed(
|
||||
self, file: AbsoluteAndRelativeFileName) -> bool:
|
||||
@@ -54,41 +50,12 @@ class WindowsCodeSigner(BaseCodeSigner):
|
||||
|
||||
return file.relative_filepath.suffix in EXTENSIONS_TO_BE_SIGNED
|
||||
|
||||
|
||||
def get_sign_command_prefix(self) -> List[str]:
|
||||
return [
|
||||
'signtool', 'sign', '/v',
|
||||
'/f', self.config.WIN_CERTIFICATE_FILEPATH,
|
||||
'/tr', self.config.WIN_TIMESTAMP_AUTHORITY_URL]
|
||||
|
||||
|
||||
def run_codesign_tool(self, filepath: Path) -> None:
|
||||
command = self.get_sign_command_prefix() + [filepath]
|
||||
codesign_output = self.check_output_or_mock(command, util.Platform.WINDOWS)
|
||||
logger_server.info(f'signtool output:\n{codesign_output}')
|
||||
|
||||
got_number_of_success = False
|
||||
|
||||
for line in codesign_output.split('\n'):
|
||||
line_clean = line.strip()
|
||||
line_clean_lower = line_clean.lower()
|
||||
|
||||
if line_clean_lower.startswith('number of warnings') or \
|
||||
line_clean_lower.startswith('number of errors'):
|
||||
number = int(line_clean_lower.split(':')[1])
|
||||
if number != 0:
|
||||
raise SigntoolException('Non-clean success of signtool')
|
||||
|
||||
if line_clean_lower.startswith('number of files successfully signed'):
|
||||
got_number_of_success = True
|
||||
number = int(line_clean_lower.split(':')[1])
|
||||
if number != 1:
|
||||
raise SigntoolException('Signtool did not consider codesign a success')
|
||||
|
||||
if not got_number_of_success:
|
||||
raise SigntoolException('Signtool did not report number of files signed')
|
||||
|
||||
|
||||
def sign_all_files(self, files: List[AbsoluteAndRelativeFileName]) -> None:
|
||||
# NOTE: Sign files one by one to avoid possible command line length
|
||||
# overflow (which could happen if we ever decide to sign every binary
|
||||
@@ -106,7 +73,12 @@ class WindowsCodeSigner(BaseCodeSigner):
|
||||
file_index + 1, num_files, file.relative_filepath)
|
||||
continue
|
||||
|
||||
command = self.get_sign_command_prefix()
|
||||
command.append(file.absolute_filepath)
|
||||
logger_server.info(
|
||||
'Running signtool command for file [%d/%d] %s...',
|
||||
file_index + 1, num_files, file.relative_filepath)
|
||||
self.run_codesign_tool(file.absolute_filepath)
|
||||
# TODO(sergey): Check the status somehow. With a missing certificate
|
||||
# the command still exists with a zero code.
|
||||
self.run_command_or_mock(command, util.Platform.WINDOWS)
|
||||
# TODO(sergey): Report number of signed and ignored files.
|
||||
|
@@ -60,17 +60,6 @@ if(WITH_OPENAL)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_JACK)
|
||||
find_library(JACK_FRAMEWORK
|
||||
NAMES jackmp
|
||||
)
|
||||
if(NOT JACK_FRAMEWORK)
|
||||
set(WITH_JACK OFF)
|
||||
else()
|
||||
set(JACK_INCLUDE_DIRS ${JACK_FRAMEWORK}/headers)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED LIBDIR)
|
||||
set(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/darwin)
|
||||
# Prefer lib directory paths
|
||||
@@ -105,6 +94,17 @@ if(WITH_OPENSUBDIV)
|
||||
find_package(OpenSubdiv)
|
||||
endif()
|
||||
|
||||
if(WITH_JACK)
|
||||
find_library(JACK_FRAMEWORK
|
||||
NAMES jackmp
|
||||
)
|
||||
if(NOT JACK_FRAMEWORK)
|
||||
set(WITH_JACK OFF)
|
||||
else()
|
||||
set(JACK_INCLUDE_DIRS ${JACK_FRAMEWORK}/headers)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_CODEC_SNDFILE)
|
||||
find_package(SndFile)
|
||||
find_library(_sndfile_FLAC_LIBRARY NAMES flac HINTS ${LIBDIR}/sndfile/lib)
|
||||
@@ -194,7 +194,7 @@ if(SYSTEMSTUBS_LIBRARY)
|
||||
list(APPEND PLATFORM_LINKLIBS SystemStubs)
|
||||
endif()
|
||||
|
||||
set(PLATFORM_CFLAGS "${PLATFORM_CFLAGS} -pipe -funsigned-char -fno-strict-aliasing")
|
||||
set(PLATFORM_CFLAGS "${PLATFORM_CFLAGS} -pipe -funsigned-char")
|
||||
set(PLATFORM_LINKFLAGS
|
||||
"-fexceptions -framework CoreServices -framework Foundation -framework IOKit -framework AppKit -framework Cocoa -framework Carbon -framework AudioUnit -framework AudioToolbox -framework CoreAudio -framework Metal -framework QuartzCore"
|
||||
)
|
||||
@@ -335,7 +335,10 @@ endif()
|
||||
|
||||
if(WITH_CYCLES_EMBREE)
|
||||
find_package(Embree 3.8.0 REQUIRED)
|
||||
set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -Xlinker -stack_size -Xlinker 0x100000")
|
||||
# Increase stack size for Embree, only works for executables.
|
||||
if(NOT WITH_PYTHON_MODULE)
|
||||
set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -Xlinker -stack_size -Xlinker 0x100000")
|
||||
endif()
|
||||
|
||||
# Embree static library linking can mix up SSE and AVX symbols, causing
|
||||
# crashes on macOS systems with older CPUs that don't have AVX. Using
|
||||
@@ -425,8 +428,8 @@ endif()
|
||||
|
||||
set(EXETYPE MACOSX_BUNDLE)
|
||||
|
||||
set(CMAKE_C_FLAGS_DEBUG "-g")
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "-g")
|
||||
set(CMAKE_C_FLAGS_DEBUG "-fno-strict-aliasing -g")
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "-fno-strict-aliasing -g")
|
||||
if(CMAKE_OSX_ARCHITECTURES MATCHES "x86_64" OR CMAKE_OSX_ARCHITECTURES MATCHES "i386")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -mdynamic-no-pic -msse -msse2 -msse3 -mssse3")
|
||||
set(CMAKE_C_FLAGS_RELEASE "-O2 -mdynamic-no-pic -msse -msse2 -msse3 -mssse3")
|
||||
@@ -435,8 +438,8 @@ if(CMAKE_OSX_ARCHITECTURES MATCHES "x86_64" OR CMAKE_OSX_ARCHITECTURES MATCHES "
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -ftree-vectorize -fvariable-expansion-in-unroller")
|
||||
endif()
|
||||
else()
|
||||
set(CMAKE_C_FLAGS_RELEASE "-O2 -mdynamic-no-pic")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -mdynamic-no-pic")
|
||||
set(CMAKE_C_FLAGS_RELEASE "-O2 -mdynamic-no-pic -fno-strict-aliasing")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -mdynamic-no-pic -fno-strict-aliasing")
|
||||
endif()
|
||||
|
||||
if(${XCODE_VERSION} VERSION_EQUAL 5 OR ${XCODE_VERSION} VERSION_GREATER 5)
|
||||
|
@@ -38,7 +38,7 @@ PROJECT_NAME = Blender
|
||||
# could be handy for archiving the generated documentation or if some version
|
||||
# control system is used.
|
||||
|
||||
PROJECT_NUMBER = "V2.91"
|
||||
PROJECT_NUMBER = "V2.92"
|
||||
|
||||
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
||||
# for a project that appears at the top of each page and should give viewer a
|
||||
|
@@ -150,8 +150,6 @@ void CLG_level_set(int level);
|
||||
|
||||
void CLG_logref_init(CLG_LogRef *clg_ref);
|
||||
|
||||
int CLG_color_support_get(CLG_LogRef *clg_ref);
|
||||
|
||||
/** Declare outside function, declare as extern in header. */
|
||||
#define CLG_LOGREF_DECLARE_GLOBAL(var, id) \
|
||||
static CLG_LogRef _static_##var = {id}; \
|
||||
|
@@ -755,12 +755,4 @@ void CLG_logref_init(CLG_LogRef *clg_ref)
|
||||
#endif
|
||||
}
|
||||
|
||||
int CLG_color_support_get(CLG_LogRef *clg_ref)
|
||||
{
|
||||
if (clg_ref->type == NULL) {
|
||||
CLG_logref_init(clg_ref);
|
||||
}
|
||||
return clg_ref->type->ctx->use_color;
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
@@ -25,6 +25,7 @@
|
||||
#include "blender/blender_util.h"
|
||||
|
||||
#include "util/util_foreach.h"
|
||||
#include "util/util_task.h"
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
@@ -45,16 +46,17 @@ Geometry *BlenderSync::sync_geometry(BL::Depsgraph &b_depsgraph,
|
||||
BL::Object &b_ob,
|
||||
BL::Object &b_ob_instance,
|
||||
bool object_updated,
|
||||
bool use_particle_hair)
|
||||
bool use_particle_hair,
|
||||
TaskPool *task_pool)
|
||||
{
|
||||
/* Test if we can instance or if the object is modified. */
|
||||
BL::ID b_ob_data = b_ob.data();
|
||||
BL::ID b_key_id = (BKE_object_is_modified(b_ob)) ? b_ob_instance : b_ob_data;
|
||||
GeometryKey key(b_key_id.ptr.data, use_particle_hair);
|
||||
BL::Material material_override = view_layer.material_override;
|
||||
Shader *default_shader = (b_ob.type() == BL::Object::type_VOLUME) ? scene->default_volume :
|
||||
scene->default_surface;
|
||||
Geometry::Type geom_type = determine_geom_type(b_ob, use_particle_hair);
|
||||
GeometryKey key(b_key_id.ptr.data, geom_type);
|
||||
|
||||
/* Find shader indices. */
|
||||
vector<Shader *> used_shaders;
|
||||
@@ -77,8 +79,15 @@ Geometry *BlenderSync::sync_geometry(BL::Depsgraph &b_depsgraph,
|
||||
used_shaders.push_back(default_shader);
|
||||
}
|
||||
|
||||
/* Test if we need to sync. */
|
||||
/* Ensure we only sync instanced geometry once. */
|
||||
Geometry *geom = geometry_map.find(key);
|
||||
if (geom) {
|
||||
if (geometry_synced.find(geom) != geometry_synced.end()) {
|
||||
return geom;
|
||||
}
|
||||
}
|
||||
|
||||
/* Test if we need to sync. */
|
||||
bool sync = true;
|
||||
if (geom == NULL) {
|
||||
/* Add new geometry if it did not exist yet. */
|
||||
@@ -125,28 +134,36 @@ Geometry *BlenderSync::sync_geometry(BL::Depsgraph &b_depsgraph,
|
||||
}
|
||||
}
|
||||
|
||||
/* Ensure we only sync instanced geometry once. */
|
||||
if (geometry_synced.find(geom) != geometry_synced.end()) {
|
||||
return geom;
|
||||
}
|
||||
|
||||
progress.set_sync_status("Synchronizing object", b_ob.name());
|
||||
|
||||
geometry_synced.insert(geom);
|
||||
|
||||
geom->name = ustring(b_ob_data.name().c_str());
|
||||
|
||||
if (geom_type == Geometry::HAIR) {
|
||||
Hair *hair = static_cast<Hair *>(geom);
|
||||
sync_hair(b_depsgraph, b_ob, hair, used_shaders);
|
||||
}
|
||||
else if (geom_type == Geometry::VOLUME) {
|
||||
Volume *volume = static_cast<Volume *>(geom);
|
||||
sync_volume(b_ob, volume, used_shaders);
|
||||
auto sync_func = [=]() mutable {
|
||||
if (progress.get_cancel())
|
||||
return;
|
||||
|
||||
progress.set_sync_status("Synchronizing object", b_ob.name());
|
||||
|
||||
if (geom_type == Geometry::HAIR) {
|
||||
Hair *hair = static_cast<Hair *>(geom);
|
||||
sync_hair(b_depsgraph, b_ob, hair, used_shaders);
|
||||
}
|
||||
else if (geom_type == Geometry::VOLUME) {
|
||||
Volume *volume = static_cast<Volume *>(geom);
|
||||
sync_volume(b_ob, volume, used_shaders);
|
||||
}
|
||||
else {
|
||||
Mesh *mesh = static_cast<Mesh *>(geom);
|
||||
sync_mesh(b_depsgraph, b_ob, mesh, used_shaders);
|
||||
}
|
||||
};
|
||||
|
||||
/* Defer the actual geometry sync to the task_pool for multithreading */
|
||||
if (task_pool) {
|
||||
task_pool->push(sync_func);
|
||||
}
|
||||
else {
|
||||
Mesh *mesh = static_cast<Mesh *>(geom);
|
||||
sync_mesh(b_depsgraph, b_ob, mesh, used_shaders);
|
||||
sync_func();
|
||||
}
|
||||
|
||||
return geom;
|
||||
@@ -156,7 +173,8 @@ void BlenderSync::sync_geometry_motion(BL::Depsgraph &b_depsgraph,
|
||||
BL::Object &b_ob,
|
||||
Object *object,
|
||||
float motion_time,
|
||||
bool use_particle_hair)
|
||||
bool use_particle_hair,
|
||||
TaskPool *task_pool)
|
||||
{
|
||||
/* Ensure we only sync instanced geometry once. */
|
||||
Geometry *geom = object->geometry;
|
||||
@@ -177,16 +195,29 @@ void BlenderSync::sync_geometry_motion(BL::Depsgraph &b_depsgraph,
|
||||
return;
|
||||
}
|
||||
|
||||
if (b_ob.type() == BL::Object::type_HAIR || use_particle_hair) {
|
||||
Hair *hair = static_cast<Hair *>(geom);
|
||||
sync_hair_motion(b_depsgraph, b_ob, hair, motion_step);
|
||||
}
|
||||
else if (b_ob.type() == BL::Object::type_VOLUME || object_fluid_gas_domain_find(b_ob)) {
|
||||
/* No volume motion blur support yet. */
|
||||
auto sync_func = [=]() mutable {
|
||||
if (progress.get_cancel())
|
||||
return;
|
||||
|
||||
if (b_ob.type() == BL::Object::type_HAIR || use_particle_hair) {
|
||||
Hair *hair = static_cast<Hair *>(geom);
|
||||
sync_hair_motion(b_depsgraph, b_ob, hair, motion_step);
|
||||
}
|
||||
else if (b_ob.type() == BL::Object::type_VOLUME || object_fluid_gas_domain_find(b_ob)) {
|
||||
/* No volume motion blur support yet. */
|
||||
}
|
||||
else {
|
||||
Mesh *mesh = static_cast<Mesh *>(geom);
|
||||
sync_mesh_motion(b_depsgraph, b_ob, mesh, motion_step);
|
||||
}
|
||||
};
|
||||
|
||||
/* Defer the actual geometry sync to the task_pool for multithreading */
|
||||
if (task_pool) {
|
||||
task_pool->push(sync_func);
|
||||
}
|
||||
else {
|
||||
Mesh *mesh = static_cast<Mesh *>(geom);
|
||||
sync_mesh_motion(b_depsgraph, b_ob, mesh, motion_step);
|
||||
sync_func();
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -19,7 +19,6 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "render/geometry.h"
|
||||
#include "render/scene.h"
|
||||
|
||||
#include "util/util_map.h"
|
||||
@@ -35,22 +34,10 @@ CCL_NAMESPACE_BEGIN
|
||||
|
||||
template<typename K, typename T> class id_map {
|
||||
public:
|
||||
id_map(Scene *scene_) : scene(scene_)
|
||||
id_map()
|
||||
{
|
||||
}
|
||||
|
||||
~id_map()
|
||||
{
|
||||
set<T *> nodes;
|
||||
|
||||
typename map<K, T *>::iterator jt;
|
||||
for (jt = b_map.begin(); jt != b_map.end(); jt++) {
|
||||
nodes.insert(jt->second);
|
||||
}
|
||||
|
||||
scene->delete_nodes(nodes);
|
||||
}
|
||||
|
||||
T *find(const BL::ID &id)
|
||||
{
|
||||
return find(id.ptr.owner_id);
|
||||
@@ -110,15 +97,16 @@ template<typename K, typename T> class id_map {
|
||||
}
|
||||
|
||||
/* Combined add and update as needed. */
|
||||
bool add_or_update(T **r_data, const BL::ID &id)
|
||||
bool add_or_update(Scene *scene, T **r_data, const BL::ID &id)
|
||||
{
|
||||
return add_or_update(r_data, id, id, id.ptr.owner_id);
|
||||
return add_or_update(scene, r_data, id, id, id.ptr.owner_id);
|
||||
}
|
||||
bool add_or_update(T **r_data, const BL::ID &id, const K &key)
|
||||
bool add_or_update(Scene *scene, T **r_data, const BL::ID &id, const K &key)
|
||||
{
|
||||
return add_or_update(r_data, id, id, key);
|
||||
return add_or_update(scene, r_data, id, id, key);
|
||||
}
|
||||
bool add_or_update(T **r_data, const BL::ID &id, const BL::ID &parent, const K &key)
|
||||
bool add_or_update(
|
||||
Scene *scene, T **r_data, const BL::ID &id, const BL::ID &parent, const K &key)
|
||||
{
|
||||
T *data = find(key);
|
||||
bool recalc;
|
||||
@@ -157,7 +145,7 @@ template<typename K, typename T> class id_map {
|
||||
b_map[NULL] = data;
|
||||
}
|
||||
|
||||
void post_sync(bool do_delete = true)
|
||||
void post_sync(Scene *scene, bool do_delete = true)
|
||||
{
|
||||
map<K, T *> new_map;
|
||||
typedef pair<const K, T *> TMapPair;
|
||||
@@ -188,7 +176,6 @@ template<typename K, typename T> class id_map {
|
||||
map<K, T *> b_map;
|
||||
set<T *> used_set;
|
||||
set<void *> b_recalc;
|
||||
Scene *scene;
|
||||
};
|
||||
|
||||
/* Object Key
|
||||
@@ -243,9 +230,9 @@ struct ObjectKey {
|
||||
|
||||
struct GeometryKey {
|
||||
void *id;
|
||||
Geometry::Type geometry_type;
|
||||
bool use_particle_hair;
|
||||
|
||||
GeometryKey(void *id, Geometry::Type geometry_type) : id(id), geometry_type(geometry_type)
|
||||
GeometryKey(void *id, bool use_particle_hair) : id(id), use_particle_hair(use_particle_hair)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -255,7 +242,7 @@ struct GeometryKey {
|
||||
return true;
|
||||
}
|
||||
else if (id == k.id) {
|
||||
if (geometry_type < k.geometry_type) {
|
||||
if (use_particle_hair < k.use_particle_hair) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@@ -39,9 +39,9 @@ void BlenderSync::sync_light(BL::Object &b_parent,
|
||||
BL::Light b_light(b_ob.data());
|
||||
|
||||
/* Update if either object or light data changed. */
|
||||
if (!light_map.add_or_update(&light, b_ob, b_parent, key)) {
|
||||
if (!light_map.add_or_update(scene, &light, b_ob, b_parent, key)) {
|
||||
Shader *shader;
|
||||
if (!shader_map.add_or_update(&shader, b_light)) {
|
||||
if (!shader_map.add_or_update(scene, &shader, b_light)) {
|
||||
if (light->is_portal)
|
||||
*use_portal = true;
|
||||
return;
|
||||
@@ -176,7 +176,7 @@ void BlenderSync::sync_background_light(BL::SpaceView3D &b_v3d, bool use_portal)
|
||||
Light *light;
|
||||
ObjectKey key(b_world, 0, b_world, false);
|
||||
|
||||
if (light_map.add_or_update(&light, b_world, b_world, key) || world_recalc ||
|
||||
if (light_map.add_or_update(scene, &light, b_world, b_world, key) || world_recalc ||
|
||||
b_world.ptr.data != world_map) {
|
||||
light->type = LIGHT_BACKGROUND;
|
||||
if (sampling_method == SAMPLING_MANUAL) {
|
||||
|
@@ -346,7 +346,7 @@ static void attr_create_vertex_color(Scene *scene, Mesh *mesh, BL::Mesh &b_mesh,
|
||||
for (int i = 0; i < n; i++) {
|
||||
float4 color = get_float4(l->data[p->loop_start() + i].color());
|
||||
/* Compress/encode vertex color using the sRGB curve. */
|
||||
*(cdata++) = color_float4_to_uchar4(color);
|
||||
*(cdata++) = color_float4_to_uchar4(color_srgb_to_linear_v4(color));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -368,10 +368,9 @@ static void attr_create_vertex_color(Scene *scene, Mesh *mesh, BL::Mesh &b_mesh,
|
||||
float4 c3 = get_float4(l->data[li[2]].color());
|
||||
|
||||
/* Compress/encode vertex color using the sRGB curve. */
|
||||
cdata[0] = color_float4_to_uchar4(c1);
|
||||
cdata[1] = color_float4_to_uchar4(c2);
|
||||
cdata[2] = color_float4_to_uchar4(c3);
|
||||
|
||||
cdata[0] = color_float4_to_uchar4(color_srgb_to_linear_v4(c1));
|
||||
cdata[1] = color_float4_to_uchar4(color_srgb_to_linear_v4(c2));
|
||||
cdata[2] = color_float4_to_uchar4(color_srgb_to_linear_v4(c3));
|
||||
cdata += 3;
|
||||
}
|
||||
}
|
||||
|
@@ -32,6 +32,7 @@
|
||||
#include "util/util_foreach.h"
|
||||
#include "util/util_hash.h"
|
||||
#include "util/util_logging.h"
|
||||
#include "util/util_task.h"
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
@@ -103,7 +104,8 @@ Object *BlenderSync::sync_object(BL::Depsgraph &b_depsgraph,
|
||||
bool use_particle_hair,
|
||||
bool show_lights,
|
||||
BlenderObjectCulling &culling,
|
||||
bool *use_portal)
|
||||
bool *use_portal,
|
||||
TaskPool *geom_task_pool)
|
||||
{
|
||||
const bool is_instance = b_instance.is_instance();
|
||||
BL::Object b_ob = b_instance.object();
|
||||
@@ -181,6 +183,10 @@ Object *BlenderSync::sync_object(BL::Depsgraph &b_depsgraph,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Use task pool only for non-instances, since sync_dupli_particle accesses
|
||||
* geometry. This restriction should be removed for better performance. */
|
||||
TaskPool *object_geom_task_pool = (is_instance) ? NULL : geom_task_pool;
|
||||
|
||||
/* key to lookup object */
|
||||
ObjectKey key(b_parent, persistent_id, b_ob_instance, use_particle_hair);
|
||||
Object *object;
|
||||
@@ -198,7 +204,12 @@ Object *BlenderSync::sync_object(BL::Depsgraph &b_depsgraph,
|
||||
|
||||
/* mesh deformation */
|
||||
if (object->geometry)
|
||||
sync_geometry_motion(b_depsgraph, b_ob, object, motion_time, use_particle_hair);
|
||||
sync_geometry_motion(b_depsgraph,
|
||||
b_ob_instance,
|
||||
object,
|
||||
motion_time,
|
||||
use_particle_hair,
|
||||
object_geom_task_pool);
|
||||
}
|
||||
|
||||
return object;
|
||||
@@ -207,12 +218,19 @@ Object *BlenderSync::sync_object(BL::Depsgraph &b_depsgraph,
|
||||
/* test if we need to sync */
|
||||
bool object_updated = false;
|
||||
|
||||
if (object_map.add_or_update(&object, b_ob, b_parent, key))
|
||||
if (object_map.add_or_update(scene, &object, b_ob, b_parent, key))
|
||||
object_updated = true;
|
||||
|
||||
/* mesh sync */
|
||||
object->geometry = sync_geometry(
|
||||
b_depsgraph, b_ob, b_ob_instance, object_updated, use_particle_hair);
|
||||
/* b_ob is owned by the iterator and will go out of scope at the end of the block.
|
||||
* b_ob_instance is the original object and will remain valid for deferred geometry
|
||||
* sync. */
|
||||
object->geometry = sync_geometry(b_depsgraph,
|
||||
b_ob_instance,
|
||||
b_ob_instance,
|
||||
object_updated,
|
||||
use_particle_hair,
|
||||
object_geom_task_pool);
|
||||
|
||||
/* special case not tracked by object update flags */
|
||||
|
||||
@@ -331,6 +349,9 @@ void BlenderSync::sync_objects(BL::Depsgraph &b_depsgraph,
|
||||
BL::SpaceView3D &b_v3d,
|
||||
float motion_time)
|
||||
{
|
||||
/* Task pool for multithreaded geometry sync. */
|
||||
TaskPool geom_task_pool;
|
||||
|
||||
/* layer data */
|
||||
bool motion = motion_time != 0.0f;
|
||||
|
||||
@@ -355,8 +376,8 @@ void BlenderSync::sync_objects(BL::Depsgraph &b_depsgraph,
|
||||
const bool show_lights = BlenderViewportParameters(b_v3d).use_scene_lights;
|
||||
|
||||
BL::ViewLayer b_view_layer = b_depsgraph.view_layer_eval();
|
||||
|
||||
BL::Depsgraph::object_instances_iterator b_instance_iter;
|
||||
|
||||
for (b_depsgraph.object_instances.begin(b_instance_iter);
|
||||
b_instance_iter != b_depsgraph.object_instances.end() && !cancel;
|
||||
++b_instance_iter) {
|
||||
@@ -372,6 +393,11 @@ void BlenderSync::sync_objects(BL::Depsgraph &b_depsgraph,
|
||||
/* Load per-object culling data. */
|
||||
culling.init_object(scene, b_ob);
|
||||
|
||||
/* Ensure the object geom supporting the hair is processed before adding
|
||||
* the hair processing task to the task pool, calling .to_mesh() on the
|
||||
* same object in parallel does not work. */
|
||||
const bool sync_hair = b_instance.show_particles() && object_has_particle_hair(b_ob);
|
||||
|
||||
/* Object itself. */
|
||||
if (b_instance.show_self()) {
|
||||
sync_object(b_depsgraph,
|
||||
@@ -381,11 +407,12 @@ void BlenderSync::sync_objects(BL::Depsgraph &b_depsgraph,
|
||||
false,
|
||||
show_lights,
|
||||
culling,
|
||||
&use_portal);
|
||||
&use_portal,
|
||||
sync_hair ? NULL : &geom_task_pool);
|
||||
}
|
||||
|
||||
/* Particle hair as separate object. */
|
||||
if (b_instance.show_particles() && object_has_particle_hair(b_ob)) {
|
||||
if (sync_hair) {
|
||||
sync_object(b_depsgraph,
|
||||
b_view_layer,
|
||||
b_instance,
|
||||
@@ -393,22 +420,25 @@ void BlenderSync::sync_objects(BL::Depsgraph &b_depsgraph,
|
||||
true,
|
||||
show_lights,
|
||||
culling,
|
||||
&use_portal);
|
||||
&use_portal,
|
||||
&geom_task_pool);
|
||||
}
|
||||
|
||||
cancel = progress.get_cancel();
|
||||
}
|
||||
|
||||
geom_task_pool.wait_work();
|
||||
|
||||
progress.set_sync_status("");
|
||||
|
||||
if (!cancel && !motion) {
|
||||
sync_background_light(b_v3d, use_portal);
|
||||
|
||||
/* handle removed data and modified pointers */
|
||||
light_map.post_sync();
|
||||
geometry_map.post_sync();
|
||||
object_map.post_sync();
|
||||
particle_system_map.post_sync();
|
||||
light_map.post_sync(scene);
|
||||
geometry_map.post_sync(scene);
|
||||
object_map.post_sync(scene);
|
||||
particle_system_map.post_sync(scene);
|
||||
}
|
||||
|
||||
if (motion)
|
||||
|
@@ -53,7 +53,8 @@ bool BlenderSync::sync_dupli_particle(BL::Object &b_ob,
|
||||
ParticleSystem *psys;
|
||||
|
||||
bool first_use = !particle_system_map.is_used(key);
|
||||
bool need_update = particle_system_map.add_or_update(&psys, b_ob, b_instance.object(), key);
|
||||
bool need_update = particle_system_map.add_or_update(
|
||||
scene, &psys, b_ob, b_instance.object(), key);
|
||||
|
||||
/* no update needed? */
|
||||
if (!need_update && !object->geometry->need_update && !scene->object_manager->need_update)
|
||||
|
@@ -238,7 +238,6 @@ void BlenderSession::reset_session(BL::BlendData &b_data, BL::Depsgraph &b_depsg
|
||||
* See note on create_session().
|
||||
*/
|
||||
/* sync object should be re-created */
|
||||
delete sync;
|
||||
sync = new BlenderSync(b_engine, b_data, b_scene, scene, !background, session->progress);
|
||||
|
||||
BL::SpaceView3D b_null_space_view3d(PointerRNA_NULL);
|
||||
@@ -260,8 +259,6 @@ void BlenderSession::reset_session(BL::BlendData &b_data, BL::Depsgraph &b_depsg
|
||||
|
||||
void BlenderSession::free_session()
|
||||
{
|
||||
session->cancel();
|
||||
|
||||
delete sync;
|
||||
delete session;
|
||||
}
|
||||
|
@@ -1241,7 +1241,7 @@ void BlenderSync::sync_materials(BL::Depsgraph &b_depsgraph, bool update_all)
|
||||
Shader *shader;
|
||||
|
||||
/* test if we need to sync */
|
||||
if (shader_map.add_or_update(&shader, b_mat) || update_all) {
|
||||
if (shader_map.add_or_update(scene, &shader, b_mat) || update_all) {
|
||||
ShaderGraph *graph = new ShaderGraph();
|
||||
|
||||
shader->name = b_mat.name().c_str();
|
||||
@@ -1467,7 +1467,7 @@ void BlenderSync::sync_lights(BL::Depsgraph &b_depsgraph, bool update_all)
|
||||
Shader *shader;
|
||||
|
||||
/* test if we need to sync */
|
||||
if (shader_map.add_or_update(&shader, b_light) || update_all) {
|
||||
if (shader_map.add_or_update(scene, &shader, b_light) || update_all) {
|
||||
ShaderGraph *graph = new ShaderGraph();
|
||||
|
||||
/* create nodes */
|
||||
|
@@ -56,11 +56,11 @@ BlenderSync::BlenderSync(BL::RenderEngine &b_engine,
|
||||
: b_engine(b_engine),
|
||||
b_data(b_data),
|
||||
b_scene(b_scene),
|
||||
shader_map(scene),
|
||||
object_map(scene),
|
||||
geometry_map(scene),
|
||||
light_map(scene),
|
||||
particle_system_map(scene),
|
||||
shader_map(),
|
||||
object_map(),
|
||||
geometry_map(),
|
||||
light_map(),
|
||||
particle_system_map(),
|
||||
world_map(NULL),
|
||||
world_recalc(false),
|
||||
scene(scene),
|
||||
@@ -247,7 +247,7 @@ void BlenderSync::sync_data(BL::RenderSettings &b_render,
|
||||
|
||||
/* Shader sync done at the end, since object sync uses it.
|
||||
* false = don't delete unused shaders, not supported. */
|
||||
shader_map.post_sync(false);
|
||||
shader_map.post_sync(scene, false);
|
||||
|
||||
free_data_after_sync(b_depsgraph);
|
||||
|
||||
|
@@ -50,6 +50,7 @@ class ViewLayer;
|
||||
class Shader;
|
||||
class ShaderGraph;
|
||||
class ShaderNode;
|
||||
class TaskPool;
|
||||
|
||||
class BlenderSync {
|
||||
public:
|
||||
@@ -145,7 +146,8 @@ class BlenderSync {
|
||||
bool use_particle_hair,
|
||||
bool show_lights,
|
||||
BlenderObjectCulling &culling,
|
||||
bool *use_portal);
|
||||
bool *use_portal,
|
||||
TaskPool *geom_task_pool);
|
||||
|
||||
/* Volume */
|
||||
void sync_volume(BL::Object &b_ob, Volume *volume, const vector<Shader *> &used_shaders);
|
||||
@@ -177,12 +179,15 @@ class BlenderSync {
|
||||
BL::Object &b_ob,
|
||||
BL::Object &b_ob_instance,
|
||||
bool object_updated,
|
||||
bool use_particle_hair);
|
||||
bool use_particle_hair,
|
||||
TaskPool *task_pool);
|
||||
|
||||
void sync_geometry_motion(BL::Depsgraph &b_depsgraph,
|
||||
BL::Object &b_ob,
|
||||
Object *object,
|
||||
float motion_time,
|
||||
bool use_particle_hair);
|
||||
bool use_particle_hair,
|
||||
TaskPool *task_pool);
|
||||
|
||||
/* Light */
|
||||
void sync_light(BL::Object &b_parent,
|
||||
|
@@ -242,6 +242,13 @@ class BlenderVolumeLoader : public VDBImageLoader {
|
||||
#endif
|
||||
}
|
||||
|
||||
bool equals(const ImageLoader &other) const override
|
||||
{
|
||||
/* TODO: detect multiple volume datablocks with the same filepath. */
|
||||
const BlenderVolumeLoader &other_loader = (const BlenderVolumeLoader &)other;
|
||||
return b_volume == other_loader.b_volume && grid_name == other_loader.grid_name;
|
||||
}
|
||||
|
||||
BL::Volume b_volume;
|
||||
};
|
||||
|
||||
@@ -300,10 +307,25 @@ static void sync_volume_object(BL::BlendData &b_data,
|
||||
}
|
||||
}
|
||||
|
||||
/* If the voxel attributes change, we need to rebuild the bounding mesh. */
|
||||
static vector<int> get_voxel_image_slots(Mesh *mesh)
|
||||
{
|
||||
vector<int> slots;
|
||||
for (const Attribute &attr : mesh->attributes.attributes) {
|
||||
if (attr.element == ATTR_ELEMENT_VOXEL) {
|
||||
slots.push_back(attr.data_voxel().svm_slot());
|
||||
}
|
||||
}
|
||||
|
||||
return slots;
|
||||
}
|
||||
|
||||
void BlenderSync::sync_volume(BL::Object &b_ob,
|
||||
Volume *volume,
|
||||
const vector<Shader *> &used_shaders)
|
||||
{
|
||||
vector<int> old_voxel_slots = get_voxel_image_slots(volume);
|
||||
|
||||
volume->clear();
|
||||
volume->used_shaders = used_shaders;
|
||||
|
||||
@@ -320,7 +342,8 @@ void BlenderSync::sync_volume(BL::Object &b_ob,
|
||||
}
|
||||
|
||||
/* Tag update. */
|
||||
volume->tag_update(scene, true);
|
||||
bool rebuild = (old_voxel_slots != get_voxel_image_slots(volume));
|
||||
volume->tag_update(scene, rebuild);
|
||||
}
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
@@ -108,7 +108,6 @@ BVH *BVH::create(const BVHParams ¶ms,
|
||||
#ifdef WITH_EMBREE
|
||||
return new BVHEmbree(params, geometry, objects, device);
|
||||
#else
|
||||
(void)device;
|
||||
break;
|
||||
#endif
|
||||
case BVH_LAYOUT_OPTIX:
|
||||
|
@@ -405,8 +405,7 @@ ccl_device float4 patch_eval_uchar4(KernelGlobals *kg,
|
||||
*dv = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
|
||||
for (int i = 0; i < num_control; i++) {
|
||||
float4 v = color_srgb_to_linear_v4(
|
||||
color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, offset + indices[i])));
|
||||
float4 v = color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, offset + indices[i]));
|
||||
|
||||
val += v * weights[i];
|
||||
if (du)
|
||||
|
@@ -581,14 +581,14 @@ ccl_device_noinline float4 subd_triangle_attribute_float4(KernelGlobals *kg,
|
||||
int corners[4];
|
||||
subd_triangle_patch_corners(kg, patch, corners);
|
||||
|
||||
float4 f0 = color_srgb_to_linear_v4(
|
||||
color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, corners[0] + desc.offset)));
|
||||
float4 f1 = color_srgb_to_linear_v4(
|
||||
color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, corners[1] + desc.offset)));
|
||||
float4 f2 = color_srgb_to_linear_v4(
|
||||
color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, corners[2] + desc.offset)));
|
||||
float4 f3 = color_srgb_to_linear_v4(
|
||||
color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, corners[3] + desc.offset)));
|
||||
float4 f0 = color_uchar4_to_float4(
|
||||
kernel_tex_fetch(__attributes_uchar4, corners[0] + desc.offset));
|
||||
float4 f1 = color_uchar4_to_float4(
|
||||
kernel_tex_fetch(__attributes_uchar4, corners[1] + desc.offset));
|
||||
float4 f2 = color_uchar4_to_float4(
|
||||
kernel_tex_fetch(__attributes_uchar4, corners[2] + desc.offset));
|
||||
float4 f3 = color_uchar4_to_float4(
|
||||
kernel_tex_fetch(__attributes_uchar4, corners[3] + desc.offset));
|
||||
|
||||
if (subd_triangle_patch_num_corners(kg, patch) != 4) {
|
||||
f1 = (f1 + f0) * 0.5f;
|
||||
@@ -614,8 +614,7 @@ ccl_device_noinline float4 subd_triangle_attribute_float4(KernelGlobals *kg,
|
||||
if (dy)
|
||||
*dy = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
|
||||
return color_srgb_to_linear_v4(
|
||||
color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, desc.offset)));
|
||||
return color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, desc.offset));
|
||||
}
|
||||
else {
|
||||
if (dx)
|
||||
|
@@ -317,12 +317,9 @@ ccl_device float4 triangle_attribute_float4(KernelGlobals *kg,
|
||||
|
||||
if (desc.element == ATTR_ELEMENT_CORNER_BYTE) {
|
||||
int tri = desc.offset + sd->prim * 3;
|
||||
f0 = color_srgb_to_linear_v4(
|
||||
color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, tri + 0)));
|
||||
f1 = color_srgb_to_linear_v4(
|
||||
color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, tri + 1)));
|
||||
f2 = color_srgb_to_linear_v4(
|
||||
color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, tri + 2)));
|
||||
f0 = color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, tri + 0));
|
||||
f1 = color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, tri + 1));
|
||||
f2 = color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, tri + 2));
|
||||
}
|
||||
else {
|
||||
uint4 tri_vindex = kernel_tex_fetch(__tri_vindex, sd->prim);
|
||||
@@ -346,8 +343,7 @@ ccl_device float4 triangle_attribute_float4(KernelGlobals *kg,
|
||||
if (dy)
|
||||
*dy = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
|
||||
return color_srgb_to_linear_v4(
|
||||
color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, desc.offset)));
|
||||
return color_uchar4_to_float4(kernel_tex_fetch(__attributes_uchar4, desc.offset));
|
||||
}
|
||||
else {
|
||||
if (dx)
|
||||
|
@@ -313,12 +313,9 @@ void Camera::update(Scene *scene)
|
||||
if (type == CAMERA_PERSPECTIVE) {
|
||||
float3 v = transform_perspective(&full_rastertocamera,
|
||||
make_float3(full_width, full_height, 1.0f));
|
||||
|
||||
frustum_right_normal = normalize(make_float3(v.z, 0.0f, -v.x));
|
||||
frustum_top_normal = normalize(make_float3(0.0f, v.z, -v.y));
|
||||
|
||||
v = transform_perspective(&full_rastertocamera, make_float3(0.0f, 0.0f, 1.0f));
|
||||
frustum_left_normal = normalize(make_float3(-v.z, 0.0f, v.x));
|
||||
frustum_bottom_normal = normalize(make_float3(0.0f, -v.z, v.y));
|
||||
}
|
||||
|
||||
/* Compute kernel camera data. */
|
||||
@@ -647,22 +644,17 @@ float Camera::world_to_raster_size(float3 P)
|
||||
|
||||
if (offscreen_dicing_scale > 1.0f) {
|
||||
float3 p = transform_point(&worldtocamera, P);
|
||||
float3 v1 = transform_perspective(&full_rastertocamera,
|
||||
make_float3(full_width, full_height, 0.0f));
|
||||
float3 v2 = transform_perspective(&full_rastertocamera, make_float3(0.0f, 0.0f, 0.0f));
|
||||
float3 v = transform_perspective(&full_rastertocamera,
|
||||
make_float3(full_width, full_height, 0.0f));
|
||||
|
||||
/* Create point clamped to frustum */
|
||||
float3 c;
|
||||
c.x = max(v2.x, min(v1.x, p.x));
|
||||
c.y = max(v2.y, min(v1.y, p.y));
|
||||
c.x = max(-v.x, min(v.x, p.x));
|
||||
c.y = max(-v.y, min(v.y, p.y));
|
||||
c.z = max(0.0f, p.z);
|
||||
|
||||
/* Check right side */
|
||||
float f_dist = len(p - c) / sqrtf((v1.x * v1.x + v1.y * v1.y) * 0.5f);
|
||||
if (f_dist < 0.0f) {
|
||||
/* Check left side */
|
||||
f_dist = len(p - c) / sqrtf((v2.x * v2.x + v2.y * v2.y) * 0.5f);
|
||||
}
|
||||
float f_dist = len(p - c) / sqrtf((v.x * v.x + v.y * v.y) * 0.5f);
|
||||
|
||||
if (f_dist > 0.0f) {
|
||||
res += res * f_dist * (offscreen_dicing_scale - 1.0f);
|
||||
}
|
||||
@@ -693,8 +685,10 @@ float Camera::world_to_raster_size(float3 P)
|
||||
/* Distance from the four planes */
|
||||
float r = dot(p, frustum_right_normal);
|
||||
float t = dot(p, frustum_top_normal);
|
||||
float l = dot(p, frustum_left_normal);
|
||||
float b = dot(p, frustum_bottom_normal);
|
||||
p = make_float3(-p.x, -p.y, p.z);
|
||||
float l = dot(p, frustum_right_normal);
|
||||
float b = dot(p, frustum_top_normal);
|
||||
p = make_float3(-p.x, -p.y, p.z);
|
||||
|
||||
if (r <= 0.0f && l <= 0.0f && t <= 0.0f && b <= 0.0f) {
|
||||
/* Point is inside frustum */
|
||||
@@ -707,9 +701,9 @@ float Camera::world_to_raster_size(float3 P)
|
||||
else {
|
||||
/* Point may be behind or off to the side, need to check */
|
||||
float3 along_right = make_float3(-frustum_right_normal.z, 0.0f, frustum_right_normal.x);
|
||||
float3 along_left = make_float3(frustum_left_normal.z, 0.0f, -frustum_left_normal.x);
|
||||
float3 along_left = make_float3(frustum_right_normal.z, 0.0f, frustum_right_normal.x);
|
||||
float3 along_top = make_float3(0.0f, -frustum_top_normal.z, frustum_top_normal.y);
|
||||
float3 along_bottom = make_float3(0.0f, frustum_bottom_normal.z, -frustum_bottom_normal.y);
|
||||
float3 along_bottom = make_float3(0.0f, frustum_top_normal.z, frustum_top_normal.y);
|
||||
|
||||
float dist[] = {r, l, t, b};
|
||||
float3 along[] = {along_right, along_left, along_top, along_bottom};
|
||||
|
@@ -170,8 +170,6 @@ class Camera : public Node {
|
||||
|
||||
float3 frustum_right_normal;
|
||||
float3 frustum_top_normal;
|
||||
float3 frustum_left_normal;
|
||||
float3 frustum_bottom_normal;
|
||||
|
||||
/* update */
|
||||
bool need_update;
|
||||
|
@@ -81,11 +81,9 @@ Geometry::~Geometry()
|
||||
delete bvh;
|
||||
}
|
||||
|
||||
void Geometry::clear(bool preserve_shaders)
|
||||
void Geometry::clear()
|
||||
{
|
||||
if (!preserve_shaders)
|
||||
used_shaders.clear();
|
||||
|
||||
used_shaders.clear();
|
||||
transform_applied = false;
|
||||
transform_negative_scaled = false;
|
||||
transform_normal = transform_identity();
|
||||
@@ -1131,10 +1129,7 @@ void GeometryManager::device_update_preprocess(Device *device, Scene *scene, Pro
|
||||
}
|
||||
}
|
||||
|
||||
/* Re-create volume mesh if we will rebuild or refit the BVH. Note we
|
||||
* should only do it in that case, otherwise the BVH and mesh can go
|
||||
* out of sync. */
|
||||
if (geom->need_update && geom->type == Geometry::VOLUME) {
|
||||
if (geom->need_update_rebuild && geom->type == Geometry::VOLUME) {
|
||||
/* Create volume meshes if there is voxel data. */
|
||||
if (!volume_images_updated) {
|
||||
progress.set_status("Updating Meshes Volume Bounds");
|
||||
@@ -1277,17 +1272,12 @@ void GeometryManager::device_update(Device *device,
|
||||
true_displacement_used = true;
|
||||
}
|
||||
|
||||
if (progress.get_cancel()) {
|
||||
if (progress.get_cancel())
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (progress.get_cancel()) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Tessellate meshes that are using subdivision */
|
||||
if (total_tess_needed) {
|
||||
scoped_callback_timer timer([scene](double time) {
|
||||
@@ -1324,15 +1314,10 @@ void GeometryManager::device_update(Device *device,
|
||||
|
||||
i++;
|
||||
|
||||
if (progress.get_cancel()) {
|
||||
if (progress.get_cancel())
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (progress.get_cancel()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Update images needed for true displacement. */
|
||||
@@ -1362,9 +1347,8 @@ void GeometryManager::device_update(Device *device,
|
||||
});
|
||||
device_update_mesh(device, dscene, scene, true, progress);
|
||||
}
|
||||
if (progress.get_cancel()) {
|
||||
if (progress.get_cancel())
|
||||
return;
|
||||
}
|
||||
|
||||
{
|
||||
scoped_callback_timer timer([scene](double time) {
|
||||
@@ -1373,9 +1357,8 @@ void GeometryManager::device_update(Device *device,
|
||||
}
|
||||
});
|
||||
device_update_attributes(device, dscene, scene, progress);
|
||||
if (progress.get_cancel()) {
|
||||
if (progress.get_cancel())
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Update displacement. */
|
||||
@@ -1405,16 +1388,11 @@ void GeometryManager::device_update(Device *device,
|
||||
}
|
||||
}
|
||||
|
||||
if (progress.get_cancel()) {
|
||||
if (progress.get_cancel())
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (progress.get_cancel()) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Device re-update after displacement. */
|
||||
if (displacement_done) {
|
||||
scoped_callback_timer timer([scene](double time) {
|
||||
@@ -1426,9 +1404,8 @@ void GeometryManager::device_update(Device *device,
|
||||
device_free(device, dscene);
|
||||
|
||||
device_update_attributes(device, dscene, scene, progress);
|
||||
if (progress.get_cancel()) {
|
||||
if (progress.get_cancel())
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
@@ -1475,9 +1452,8 @@ void GeometryManager::device_update(Device *device,
|
||||
}
|
||||
}
|
||||
|
||||
if (progress.get_cancel()) {
|
||||
if (progress.get_cancel())
|
||||
return;
|
||||
}
|
||||
|
||||
{
|
||||
scoped_callback_timer timer([scene](double time) {
|
||||
@@ -1486,9 +1462,8 @@ void GeometryManager::device_update(Device *device,
|
||||
}
|
||||
});
|
||||
device_update_bvh(device, dscene, scene, progress);
|
||||
if (progress.get_cancel()) {
|
||||
if (progress.get_cancel())
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
@@ -1499,9 +1474,8 @@ void GeometryManager::device_update(Device *device,
|
||||
}
|
||||
});
|
||||
device_update_mesh(device, dscene, scene, false, progress);
|
||||
if (progress.get_cancel()) {
|
||||
if (progress.get_cancel())
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
need_update = false;
|
||||
|
@@ -96,7 +96,7 @@ class Geometry : public Node {
|
||||
virtual ~Geometry();
|
||||
|
||||
/* Geometry */
|
||||
virtual void clear(bool preserve_shaders = false);
|
||||
virtual void clear();
|
||||
virtual void compute_bounds() = 0;
|
||||
virtual void apply_transform(const Transform &tfm, const bool apply_to_motion) = 0;
|
||||
|
||||
|
@@ -762,7 +762,6 @@ void ShaderGraph::compute_displacement_hash()
|
||||
foreach (ShaderInput *input, node->inputs) {
|
||||
int link_id = (input->link) ? input->link->parent->id : 0;
|
||||
md5.append((uint8_t *)&link_id, sizeof(link_id));
|
||||
md5.append((input->link) ? input->link->name().c_str() : "");
|
||||
}
|
||||
|
||||
if (node->special_type == SHADER_SPECIAL_TYPE_OSL) {
|
||||
|
@@ -321,9 +321,9 @@ void Hair::reserve_curves(int numcurves, int numkeys)
|
||||
attributes.resize(true);
|
||||
}
|
||||
|
||||
void Hair::clear(bool preserve_shaders)
|
||||
void Hair::clear()
|
||||
{
|
||||
Geometry::clear(preserve_shaders);
|
||||
Geometry::clear();
|
||||
|
||||
curve_keys.clear();
|
||||
curve_radius.clear();
|
||||
|
@@ -103,7 +103,7 @@ class Hair : public Geometry {
|
||||
~Hair();
|
||||
|
||||
/* Geometry */
|
||||
void clear(bool preserve_shaders = false) override;
|
||||
void clear() override;
|
||||
|
||||
void resize_curves(int numcurves, int numkeys);
|
||||
void reserve_curves(int numcurves, int numkeys);
|
||||
|
@@ -213,9 +213,9 @@ void Mesh::reserve_subd_faces(int numfaces, int num_ngons_, int numcorners)
|
||||
subd_attributes.resize(true);
|
||||
}
|
||||
|
||||
void Mesh::clear(bool preserve_shaders, bool preserve_voxel_data)
|
||||
void Mesh::clear(bool preserve_voxel_data)
|
||||
{
|
||||
Geometry::clear(preserve_shaders);
|
||||
Geometry::clear();
|
||||
|
||||
/* clear all verts and triangles */
|
||||
verts.clear();
|
||||
@@ -243,9 +243,9 @@ void Mesh::clear(bool preserve_shaders, bool preserve_voxel_data)
|
||||
patch_table = NULL;
|
||||
}
|
||||
|
||||
void Mesh::clear(bool preserve_shaders)
|
||||
void Mesh::clear()
|
||||
{
|
||||
clear(preserve_shaders, false);
|
||||
clear(false);
|
||||
}
|
||||
|
||||
void Mesh::add_vertex(float3 P)
|
||||
|
@@ -174,7 +174,8 @@ class Mesh : public Geometry {
|
||||
void reserve_mesh(int numverts, int numfaces);
|
||||
void resize_subd_faces(int numfaces, int num_ngons, int numcorners);
|
||||
void reserve_subd_faces(int numfaces, int num_ngons, int numcorners);
|
||||
void clear(bool preserve_shaders = false) override;
|
||||
void clear(bool preserve_voxel_data);
|
||||
void clear() override;
|
||||
void add_vertex(float3 P);
|
||||
void add_vertex_slow(float3 P);
|
||||
void add_triangle(int v0, int v1, int v2, int shader, bool smooth);
|
||||
@@ -201,9 +202,6 @@ class Mesh : public Geometry {
|
||||
void pack_patches(uint *patch_data, uint vert_offset, uint face_offset, uint corner_offset);
|
||||
|
||||
void tessellate(DiagSplit *split);
|
||||
|
||||
protected:
|
||||
void clear(bool preserve_shaders, bool preserve_voxel_data);
|
||||
};
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
@@ -2785,7 +2785,7 @@ void PrincipledBsdfNode::expand(ShaderGraph *graph)
|
||||
ShaderInput *emission_strength_in = input("Emission Strength");
|
||||
if ((emission_in->link || emission != make_float3(0.0f, 0.0f, 0.0f)) &&
|
||||
(emission_strength_in->link || emission_strength != 0.0f)) {
|
||||
/* Create add closure and emission, and relink inputs. */
|
||||
/* Create add closure and emission. */
|
||||
AddClosureNode *add = graph->create_node<AddClosureNode>();
|
||||
EmissionNode *emission_node = graph->create_node<EmissionNode>();
|
||||
ShaderOutput *new_out = add->output("Closure");
|
||||
@@ -2801,16 +2801,6 @@ void PrincipledBsdfNode::expand(ShaderGraph *graph)
|
||||
|
||||
principled_out = new_out;
|
||||
}
|
||||
else {
|
||||
/* Disconnect unused links if the other value is zero, required before
|
||||
* we remove the input from the node entirely. */
|
||||
if (emission_in->link) {
|
||||
emission_in->disconnect();
|
||||
}
|
||||
if (emission_strength_in->link) {
|
||||
emission_strength_in->disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
ShaderInput *alpha_in = input("Alpha");
|
||||
if (alpha_in->link || alpha != 1.0f) {
|
||||
@@ -2828,7 +2818,6 @@ void PrincipledBsdfNode::expand(ShaderGraph *graph)
|
||||
}
|
||||
|
||||
remove_input(emission_in);
|
||||
remove_input(emission_strength_in);
|
||||
remove_input(alpha_in);
|
||||
}
|
||||
|
||||
@@ -5767,7 +5756,6 @@ NODE_DEFINE(MapRangeNode)
|
||||
SOCKET_IN_FLOAT(to_min, "To Min", 0.0f);
|
||||
SOCKET_IN_FLOAT(to_max, "To Max", 1.0f);
|
||||
SOCKET_IN_FLOAT(steps, "Steps", 4.0f);
|
||||
SOCKET_IN_BOOLEAN(clamp, "Clamp", false);
|
||||
|
||||
SOCKET_OUT_FLOAT(result, "Result");
|
||||
|
||||
|
@@ -707,58 +707,4 @@ template<> void Scene::delete_node_impl(Shader * /*node*/)
|
||||
/* don't delete unused shaders, not supported */
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
static void remove_nodes_in_set(const set<T *> &nodes_set,
|
||||
vector<T *> &nodes_array,
|
||||
const NodeOwner *owner)
|
||||
{
|
||||
size_t new_size = nodes_array.size();
|
||||
|
||||
for (size_t i = 0; i < new_size; ++i) {
|
||||
T *node = nodes_array[i];
|
||||
|
||||
if (nodes_set.find(node) != nodes_set.end()) {
|
||||
std::swap(nodes_array[i], nodes_array[new_size - 1]);
|
||||
|
||||
assert(node->get_owner() == owner);
|
||||
delete node;
|
||||
|
||||
i -= 1;
|
||||
new_size -= 1;
|
||||
}
|
||||
}
|
||||
|
||||
nodes_array.resize(new_size);
|
||||
(void)owner;
|
||||
}
|
||||
|
||||
template<> void Scene::delete_nodes(const set<Light *> &nodes, const NodeOwner *owner)
|
||||
{
|
||||
remove_nodes_in_set(nodes, lights, owner);
|
||||
light_manager->tag_update(this);
|
||||
}
|
||||
|
||||
template<> void Scene::delete_nodes(const set<Geometry *> &nodes, const NodeOwner *owner)
|
||||
{
|
||||
remove_nodes_in_set(nodes, geometry, owner);
|
||||
geometry_manager->tag_update(this);
|
||||
}
|
||||
|
||||
template<> void Scene::delete_nodes(const set<Object *> &nodes, const NodeOwner *owner)
|
||||
{
|
||||
remove_nodes_in_set(nodes, objects, owner);
|
||||
object_manager->tag_update(this);
|
||||
}
|
||||
|
||||
template<> void Scene::delete_nodes(const set<ParticleSystem *> &nodes, const NodeOwner *owner)
|
||||
{
|
||||
remove_nodes_in_set(nodes, particle_systems, owner);
|
||||
particle_system_manager->tag_update(this);
|
||||
}
|
||||
|
||||
template<> void Scene::delete_nodes(const set<Shader *> & /*nodes*/, const NodeOwner * /*owner*/)
|
||||
{
|
||||
/* don't delete unused shaders, not supported */
|
||||
}
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
@@ -322,18 +322,6 @@ class Scene : public NodeOwner {
|
||||
(void)owner;
|
||||
}
|
||||
|
||||
/* Remove all nodes in the set from the appropriate data arrays, and tag the
|
||||
* specific managers for an update. This assumes that the scene owns the nodes.
|
||||
*/
|
||||
template<typename T> void delete_nodes(const set<T *> &nodes)
|
||||
{
|
||||
delete_nodes(nodes, this);
|
||||
}
|
||||
|
||||
/* Same as above, but specify the actual owner of all the nodes in the set.
|
||||
*/
|
||||
template<typename T> void delete_nodes(const set<T *> &nodes, const NodeOwner *owner);
|
||||
|
||||
protected:
|
||||
/* Check if some heavy data worth logging was updated.
|
||||
* Mainly used to suppress extra annoying logging.
|
||||
@@ -393,16 +381,6 @@ template<> void Scene::delete_node_impl(ParticleSystem *node);
|
||||
|
||||
template<> void Scene::delete_node_impl(Shader *node);
|
||||
|
||||
template<> void Scene::delete_nodes(const set<Light *> &nodes, const NodeOwner *owner);
|
||||
|
||||
template<> void Scene::delete_nodes(const set<Geometry *> &nodes, const NodeOwner *owner);
|
||||
|
||||
template<> void Scene::delete_nodes(const set<Object *> &nodes, const NodeOwner *owner);
|
||||
|
||||
template<> void Scene::delete_nodes(const set<ParticleSystem *> &nodes, const NodeOwner *owner);
|
||||
|
||||
template<> void Scene::delete_nodes(const set<Shader *> &nodes, const NodeOwner *owner);
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
||||
#endif /* __SCENE_H__ */
|
||||
|
@@ -94,7 +94,21 @@ Session::Session(const SessionParams ¶ms_)
|
||||
|
||||
Session::~Session()
|
||||
{
|
||||
cancel();
|
||||
if (session_thread) {
|
||||
/* wait for session thread to end */
|
||||
progress.set_cancel("Exiting");
|
||||
|
||||
gpu_need_display_buffer_update = false;
|
||||
gpu_need_display_buffer_update_cond.notify_all();
|
||||
|
||||
{
|
||||
thread_scoped_lock pause_lock(pause_mutex);
|
||||
pause = false;
|
||||
}
|
||||
pause_cond.notify_all();
|
||||
|
||||
wait();
|
||||
}
|
||||
|
||||
if (params.write_render_cb) {
|
||||
/* Copy to display buffer and write out image if requested */
|
||||
@@ -128,25 +142,6 @@ void Session::start()
|
||||
}
|
||||
}
|
||||
|
||||
void Session::cancel()
|
||||
{
|
||||
if (session_thread) {
|
||||
/* wait for session thread to end */
|
||||
progress.set_cancel("Exiting");
|
||||
|
||||
gpu_need_display_buffer_update = false;
|
||||
gpu_need_display_buffer_update_cond.notify_all();
|
||||
|
||||
{
|
||||
thread_scoped_lock pause_lock(pause_mutex);
|
||||
pause = false;
|
||||
}
|
||||
pause_cond.notify_all();
|
||||
|
||||
wait();
|
||||
}
|
||||
}
|
||||
|
||||
bool Session::ready_to_reset()
|
||||
{
|
||||
double dt = time_dt() - reset_time;
|
||||
|
@@ -146,7 +146,6 @@ class Session {
|
||||
~Session();
|
||||
|
||||
void start();
|
||||
void cancel();
|
||||
bool draw(BufferParams ¶ms, DeviceDrawParams &draw_params);
|
||||
void wait();
|
||||
|
||||
|
@@ -56,9 +56,9 @@ Volume::Volume() : Mesh(node_type, Geometry::VOLUME)
|
||||
object_space = false;
|
||||
}
|
||||
|
||||
void Volume::clear(bool preserve_shaders)
|
||||
void Volume::clear()
|
||||
{
|
||||
Mesh::clear(preserve_shaders, true);
|
||||
Mesh::clear(true);
|
||||
}
|
||||
|
||||
struct QuadData {
|
||||
@@ -76,7 +76,6 @@ enum {
|
||||
QUAD_Z_MAX = 5,
|
||||
};
|
||||
|
||||
#ifdef WITH_OPENVDB
|
||||
const int quads_indices[6][4] = {
|
||||
/* QUAD_X_MIN */
|
||||
{4, 0, 3, 7},
|
||||
@@ -141,7 +140,6 @@ static void create_quad(int3 corners[8],
|
||||
|
||||
quads.push_back(quad);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Create a mesh from a volume.
|
||||
*
|
||||
@@ -286,27 +284,16 @@ void VolumeMeshBuilder::create_mesh(vector<float3> &vertices,
|
||||
vector<float3> &face_normals,
|
||||
const float face_overlap_avoidance)
|
||||
{
|
||||
#ifdef WITH_OPENVDB
|
||||
/* We create vertices in index space (is), and only convert them to object
|
||||
* space when done. */
|
||||
vector<int3> vertices_is;
|
||||
vector<QuadData> quads;
|
||||
|
||||
/* make sure we only have leaf nodes in the tree, as tiles are not handled by
|
||||
* this algorithm */
|
||||
topology_grid->tree().voxelizeActiveTiles();
|
||||
|
||||
generate_vertices_and_quads(vertices_is, quads);
|
||||
|
||||
convert_object_space(vertices_is, vertices, face_overlap_avoidance);
|
||||
|
||||
convert_quads_to_tris(quads, indices, face_normals);
|
||||
#else
|
||||
(void)vertices;
|
||||
(void)indices;
|
||||
(void)face_normals;
|
||||
(void)face_overlap_avoidance;
|
||||
#endif
|
||||
}
|
||||
|
||||
void VolumeMeshBuilder::generate_vertices_and_quads(vector<ccl::int3> &vertices_is,
|
||||
@@ -451,15 +438,10 @@ static openvdb::GridBase::ConstPtr openvdb_grid_from_device_texture(device_textu
|
||||
image_memory->data_width - 1,
|
||||
image_memory->data_height - 1,
|
||||
image_memory->data_depth - 1);
|
||||
|
||||
typename GridType::Ptr sparse = GridType::create(ValueType(0.0f));
|
||||
if (dense_bbox.empty()) {
|
||||
return sparse;
|
||||
}
|
||||
|
||||
openvdb::tools::Dense<ValueType, openvdb::tools::MemoryLayout::LayoutXYZ> dense(
|
||||
dense_bbox, static_cast<ValueType *>(image_memory->host_pointer));
|
||||
|
||||
typename GridType::Ptr sparse = GridType::create(ValueType(0.0f));
|
||||
openvdb::tools::copyFromDense(dense, *sparse, ValueType(volume_clipping));
|
||||
|
||||
/* #copyFromDense will remove any leaf node that contains constant data and replace it with a
|
||||
@@ -508,39 +490,6 @@ void GeometryManager::create_volume_mesh(Volume *volume, Progress &progress)
|
||||
string msg = string_printf("Computing Volume Mesh %s", volume->name.c_str());
|
||||
progress.set_status("Updating Mesh", msg);
|
||||
|
||||
/* Find shader and compute padding based on volume shader interpolation settings. */
|
||||
Shader *volume_shader = NULL;
|
||||
int pad_size = 0;
|
||||
|
||||
foreach (Shader *shader, volume->used_shaders) {
|
||||
if (!shader->has_volume) {
|
||||
continue;
|
||||
}
|
||||
|
||||
volume_shader = shader;
|
||||
|
||||
if (shader->volume_interpolation_method == VOLUME_INTERPOLATION_LINEAR) {
|
||||
pad_size = max(1, pad_size);
|
||||
}
|
||||
else if (shader->volume_interpolation_method == VOLUME_INTERPOLATION_CUBIC) {
|
||||
pad_size = max(2, pad_size);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
/* Clear existing volume mesh, done here in case we early out due to
|
||||
* empty grid or missing volume shader.
|
||||
* Also keep the shaders to avoid infinite loops when synchronizing, as this will tag the shaders
|
||||
* as having changed. */
|
||||
volume->clear(true);
|
||||
volume->need_update_rebuild = true;
|
||||
|
||||
if (!volume_shader) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Create volume mesh builder. */
|
||||
VolumeMeshBuilder builder;
|
||||
|
||||
#ifdef WITH_OPENVDB
|
||||
@@ -587,11 +536,35 @@ void GeometryManager::create_volume_mesh(Volume *volume, Progress &progress)
|
||||
}
|
||||
#endif
|
||||
|
||||
/* If nothing to build, early out. */
|
||||
if (builder.empty_grid()) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Compute padding. */
|
||||
Shader *volume_shader = NULL;
|
||||
int pad_size = 0;
|
||||
|
||||
foreach (Shader *shader, volume->used_shaders) {
|
||||
if (!shader->has_volume) {
|
||||
continue;
|
||||
}
|
||||
|
||||
volume_shader = shader;
|
||||
|
||||
if (shader->volume_interpolation_method == VOLUME_INTERPOLATION_LINEAR) {
|
||||
pad_size = max(1, pad_size);
|
||||
}
|
||||
else if (shader->volume_interpolation_method == VOLUME_INTERPOLATION_CUBIC) {
|
||||
pad_size = max(2, pad_size);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (!volume_shader) {
|
||||
return;
|
||||
}
|
||||
|
||||
builder.add_padding(pad_size);
|
||||
|
||||
/* Slightly offset vertex coordinates to avoid overlapping faces with other
|
||||
@@ -607,9 +580,10 @@ void GeometryManager::create_volume_mesh(Volume *volume, Progress &progress)
|
||||
vector<float3> face_normals;
|
||||
builder.create_mesh(vertices, indices, face_normals, face_overlap_avoidance);
|
||||
|
||||
volume->clear();
|
||||
volume->reserve_mesh(vertices.size(), indices.size() / 3);
|
||||
volume->used_shaders.clear();
|
||||
volume->used_shaders.push_back(volume_shader);
|
||||
volume->need_update_rebuild = true;
|
||||
|
||||
for (size_t i = 0; i < vertices.size(); ++i) {
|
||||
volume->add_vertex(vertices[i]);
|
||||
|
@@ -32,7 +32,7 @@ class Volume : public Mesh {
|
||||
float step_size;
|
||||
bool object_space;
|
||||
|
||||
virtual void clear(bool preserve_shaders = false) override;
|
||||
virtual void clear() override;
|
||||
};
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
@@ -24,7 +24,7 @@ CCL_NAMESPACE_BEGIN
|
||||
|
||||
/* Task Pool */
|
||||
|
||||
TaskPool::TaskPool() : start_time(time_dt()), num_tasks_pushed(0)
|
||||
TaskPool::TaskPool() : start_time(time_dt()), num_tasks_handled(0)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ TaskPool::~TaskPool()
|
||||
void TaskPool::push(TaskRunFunction &&task)
|
||||
{
|
||||
tbb_group.run(std::move(task));
|
||||
num_tasks_pushed++;
|
||||
num_tasks_handled++;
|
||||
}
|
||||
|
||||
void TaskPool::wait_work(Summary *stats)
|
||||
@@ -45,19 +45,14 @@ void TaskPool::wait_work(Summary *stats)
|
||||
|
||||
if (stats != NULL) {
|
||||
stats->time_total = time_dt() - start_time;
|
||||
stats->num_tasks_handled = num_tasks_pushed;
|
||||
stats->num_tasks_handled = num_tasks_handled;
|
||||
}
|
||||
|
||||
num_tasks_pushed = 0;
|
||||
}
|
||||
|
||||
void TaskPool::cancel()
|
||||
{
|
||||
if (num_tasks_pushed > 0) {
|
||||
tbb_group.cancel();
|
||||
tbb_group.wait();
|
||||
num_tasks_pushed = 0;
|
||||
}
|
||||
tbb_group.cancel();
|
||||
tbb_group.wait();
|
||||
}
|
||||
|
||||
bool TaskPool::canceled()
|
||||
|
@@ -71,8 +71,8 @@ class TaskPool {
|
||||
/* Time time stamp of first task pushed. */
|
||||
double start_time;
|
||||
|
||||
/* Number of all tasks pushed to the pool. Cleared after wait_work() and cancel(). */
|
||||
int num_tasks_pushed;
|
||||
/* Number of all tasks handled by this pool. */
|
||||
int num_tasks_handled;
|
||||
};
|
||||
|
||||
/* Task Scheduler
|
||||
|
@@ -1589,7 +1589,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleMouseEvent(void *eventPtr)
|
||||
}
|
||||
case GHOST_kGrabWrap: // Wrap cursor at area/window boundaries
|
||||
{
|
||||
NSPoint mousePos = [event locationInWindow];
|
||||
NSPoint mousePos = [cocoawindow mouseLocationOutsideOfEventStream];
|
||||
GHOST_TInt32 x_mouse = mousePos.x;
|
||||
GHOST_TInt32 y_mouse = mousePos.y;
|
||||
GHOST_Rect bounds, windowBounds, correctedBounds;
|
||||
@@ -1639,7 +1639,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleMouseEvent(void *eventPtr)
|
||||
}
|
||||
default: {
|
||||
// Normal cursor operation: send mouse position in window
|
||||
NSPoint mousePos = [event locationInWindow];
|
||||
NSPoint mousePos = [cocoawindow mouseLocationOutsideOfEventStream];
|
||||
GHOST_TInt32 x, y;
|
||||
|
||||
window->clientToScreenIntern(mousePos.x, mousePos.y, x, y);
|
||||
@@ -1699,7 +1699,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleMouseEvent(void *eventPtr)
|
||||
pushEvent(new GHOST_EventWheel([event timestamp] * 1000, window, delta));
|
||||
}
|
||||
else {
|
||||
NSPoint mousePos = [event locationInWindow];
|
||||
NSPoint mousePos = [cocoawindow mouseLocationOutsideOfEventStream];
|
||||
GHOST_TInt32 x, y;
|
||||
double dx;
|
||||
double dy;
|
||||
@@ -1722,7 +1722,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleMouseEvent(void *eventPtr)
|
||||
} break;
|
||||
|
||||
case NSEventTypeMagnify: {
|
||||
NSPoint mousePos = [event locationInWindow];
|
||||
NSPoint mousePos = [cocoawindow mouseLocationOutsideOfEventStream];
|
||||
GHOST_TInt32 x, y;
|
||||
window->clientToScreenIntern(mousePos.x, mousePos.y, x, y);
|
||||
pushEvent(new GHOST_EventTrackpad([event timestamp] * 1000,
|
||||
@@ -1735,7 +1735,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleMouseEvent(void *eventPtr)
|
||||
} break;
|
||||
|
||||
case NSEventTypeSmartMagnify: {
|
||||
NSPoint mousePos = [event locationInWindow];
|
||||
NSPoint mousePos = [cocoawindow mouseLocationOutsideOfEventStream];
|
||||
GHOST_TInt32 x, y;
|
||||
window->clientToScreenIntern(mousePos.x, mousePos.y, x, y);
|
||||
pushEvent(new GHOST_EventTrackpad(
|
||||
@@ -1743,7 +1743,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleMouseEvent(void *eventPtr)
|
||||
} break;
|
||||
|
||||
case NSEventTypeRotate: {
|
||||
NSPoint mousePos = [event locationInWindow];
|
||||
NSPoint mousePos = [cocoawindow mouseLocationOutsideOfEventStream];
|
||||
GHOST_TInt32 x, y;
|
||||
window->clientToScreenIntern(mousePos.x, mousePos.y, x, y);
|
||||
pushEvent(new GHOST_EventTrackpad([event timestamp] * 1000,
|
||||
|
@@ -56,8 +56,7 @@ using std::to_string;
|
||||
atomic<int> MANTA::solverID(0);
|
||||
int MANTA::with_debug(0);
|
||||
|
||||
MANTA::MANTA(int *res, FluidModifierData *fmd)
|
||||
: mCurrentID(++solverID), mMaxRes(fmd->domain->maxres)
|
||||
MANTA::MANTA(int *res, FluidModifierData *fmd) : mCurrentID(++solverID)
|
||||
{
|
||||
if (with_debug)
|
||||
cout << "FLUID: " << mCurrentID << " with res(" << res[0] << ", " << res[1] << ", " << res[2]
|
||||
@@ -86,10 +85,11 @@ MANTA::MANTA(int *res, FluidModifierData *fmd)
|
||||
mUsingInvel = (fds->active_fields & FLUID_DOMAIN_ACTIVE_INVEL);
|
||||
mUsingOutflow = (fds->active_fields & FLUID_DOMAIN_ACTIVE_OUTFLOW);
|
||||
|
||||
/* Simulation constants */
|
||||
mResX = res[0]; /* Current size of domain (will adjust with adaptive domain). */
|
||||
/* Simulation constants. */
|
||||
mResX = res[0];
|
||||
mResY = res[1];
|
||||
mResZ = res[2];
|
||||
mMaxRes = MAX3(mResX, mResY, mResZ);
|
||||
mTotalCells = mResX * mResY * mResZ;
|
||||
mResGuiding = fds->res;
|
||||
|
||||
|
@@ -38,6 +38,7 @@ using std::vector;
|
||||
struct MANTA {
|
||||
public:
|
||||
MANTA(int *res, struct FluidModifierData *fmd);
|
||||
MANTA(){};
|
||||
virtual ~MANTA();
|
||||
|
||||
/* Mirroring Mantaflow structures for particle data (pVel also used for mesh vert vels). */
|
||||
@@ -744,7 +745,7 @@ struct MANTA {
|
||||
unordered_map<string, string> mRNAMap;
|
||||
|
||||
/* The ID of the solver objects will be incremented for every new object. */
|
||||
const int mCurrentID;
|
||||
int mCurrentID;
|
||||
|
||||
bool mUsingHeat;
|
||||
bool mUsingColors;
|
||||
@@ -774,7 +775,7 @@ struct MANTA {
|
||||
int mResX;
|
||||
int mResY;
|
||||
int mResZ;
|
||||
const int mMaxRes;
|
||||
int mMaxRes;
|
||||
|
||||
int mResXNoise;
|
||||
int mResYNoise;
|
||||
|
@@ -122,7 +122,6 @@ timePerFrame_s$ID$ = $TIME_PER_FRAME$\n\
|
||||
# In Blender fluid.c: frame_length = DT_DEFAULT * (25.0 / fps) * time_scale\n\
|
||||
# with DT_DEFAULT = 0.1\n\
|
||||
frameLength_s$ID$ = $FRAME_LENGTH$\n\
|
||||
frameLengthUnscaled_s$ID$ = frameLength_s$ID$ / timeScale_s$ID$\n\
|
||||
frameLengthRaw_s$ID$ = 0.1 * 25 # dt = 0.1 at 25 fps\n\
|
||||
\n\
|
||||
dt0_s$ID$ = $DT$\n\
|
||||
@@ -149,15 +148,9 @@ mantaMsg('1 Blender length unit is ' + str(ratioResToBLength_s$ID$) + ' Mantaflo
|
||||
ratioBTimeToTimestep_s$ID$ = float(1) / float(frameLengthRaw_s$ID$) # the time within 1 blender time unit, see also fluid.c\n\
|
||||
mantaMsg('1 Blender time unit is ' + str(ratioBTimeToTimestep_s$ID$) + ' Mantaflow time units long.')\n\
|
||||
\n\
|
||||
ratioFrameToFramelength_s$ID$ = float(1) / float(frameLengthUnscaled_s$ID$ ) # the time within 1 frame\n\
|
||||
mantaMsg('frame / frameLength is ' + str(ratioFrameToFramelength_s$ID$) + ' Mantaflow time units long.')\n\
|
||||
\n\
|
||||
scaleAcceleration_s$ID$ = ratioResToBLength_s$ID$ * (ratioBTimeToTimestep_s$ID$**2)# [meters/btime^2] to [cells/timestep^2] (btime: sec, min, or h, ...)\n\
|
||||
mantaMsg('scaleAcceleration is ' + str(scaleAcceleration_s$ID$))\n\
|
||||
\n\
|
||||
scaleSpeedFrames_s$ID$ = ratioResToBLength_s$ID$ * ratioFrameToFramelength_s$ID$ # [blength/frame] to [cells/frameLength]\n\
|
||||
mantaMsg('scaleSpeed is ' + str(scaleSpeedFrames_s$ID$))\n\
|
||||
\n\
|
||||
gravity_s$ID$ *= scaleAcceleration_s$ID$ # scale from world acceleration to cell based acceleration\n\
|
||||
\n\
|
||||
# OpenVDB options\n\
|
||||
@@ -371,6 +364,7 @@ def fluid_pre_step_$ID$():\n\
|
||||
\n\
|
||||
# Main vel grid is copied in adapt time step function\n\
|
||||
\n\
|
||||
# translate obvels (world space) to grid space\n\
|
||||
if using_obstacle_s$ID$:\n\
|
||||
# Average out velocities from multiple obstacle objects at one cell\n\
|
||||
x_obvel_s$ID$.safeDivide(numObs_s$ID$)\n\
|
||||
@@ -378,6 +372,7 @@ def fluid_pre_step_$ID$():\n\
|
||||
z_obvel_s$ID$.safeDivide(numObs_s$ID$)\n\
|
||||
copyRealToVec3(sourceX=x_obvel_s$ID$, sourceY=y_obvel_s$ID$, sourceZ=z_obvel_s$ID$, target=obvelC_s$ID$)\n\
|
||||
\n\
|
||||
# translate invels (world space) to grid space\n\
|
||||
if using_invel_s$ID$:\n\
|
||||
copyRealToVec3(sourceX=x_invel_s$ID$, sourceY=y_invel_s$ID$, sourceZ=z_invel_s$ID$, target=invelC_s$ID$)\n\
|
||||
\n\
|
||||
@@ -387,9 +382,7 @@ def fluid_pre_step_$ID$():\n\
|
||||
interpolateMACGrid(source=guidevel_sg$ID$, target=velT_s$ID$)\n\
|
||||
velT_s$ID$.multConst(vec3(gamma_sg$ID$))\n\
|
||||
\n\
|
||||
x_force_s$ID$.multConst(scaleSpeedFrames_s$ID$)\n\
|
||||
y_force_s$ID$.multConst(scaleSpeedFrames_s$ID$)\n\
|
||||
z_force_s$ID$.multConst(scaleSpeedFrames_s$ID$)\n\
|
||||
# translate external forces (world space) to grid space\n\
|
||||
copyRealToVec3(sourceX=x_force_s$ID$, sourceY=y_force_s$ID$, sourceZ=z_force_s$ID$, target=forces_s$ID$)\n\
|
||||
\n\
|
||||
# If obstacle has velocity, i.e. is a moving obstacle, switch to dynamic preconditioner\n\
|
||||
|
Before Width: | Height: | Size: 742 KiB After Width: | Height: | Size: 721 KiB |
@@ -1108,28 +1108,28 @@ const bTheme U_theme_default = {
|
||||
},
|
||||
.collection_color = {
|
||||
{
|
||||
.color = RGBA(0xe2605bff),
|
||||
.color = RGBA(0xe4312bff),
|
||||
},
|
||||
{
|
||||
.color = RGBA(0xf1a355ff),
|
||||
.color = RGBA(0xef7e42ff),
|
||||
},
|
||||
{
|
||||
.color = RGBA(0xf1dc55ff),
|
||||
.color = RGBA(0xe4dd52ff),
|
||||
},
|
||||
{
|
||||
.color = RGBA(0x7bcc7bff),
|
||||
.color = RGBA(0x9ac546ff),
|
||||
},
|
||||
{
|
||||
.color = RGBA(0x5db6eaff),
|
||||
.color = RGBA(0x46bcc2ff),
|
||||
},
|
||||
{
|
||||
.color = RGBA(0x8d59daff),
|
||||
.color = RGBA(0x8b65dcff),
|
||||
},
|
||||
{
|
||||
.color = RGBA(0xc673b8ff),
|
||||
.color = RGBA(0x999999ff),
|
||||
},
|
||||
{
|
||||
.color = RGBA(0x7a5441ff),
|
||||
.color = RGBA(0x06d4432ff),
|
||||
},
|
||||
},
|
||||
};
|
||||
|
@@ -40,30 +40,6 @@
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
<releases>
|
||||
<release version="2.91" date="2020-11-25">
|
||||
<description>
|
||||
<p>New features:</p>
|
||||
<ul>
|
||||
<li>Volume modifiers</li>
|
||||
<li>Precise boolean</li>
|
||||
<li>Cloth brush collision</li>
|
||||
<li>Custom curve bevels</li>
|
||||
<li>Grease Pencil image tracer</li>
|
||||
<li>Property search and fuzzy search</li>
|
||||
</ul>
|
||||
<p>Enhancements:</p>
|
||||
<ul>
|
||||
<li>Boundary and pose cloth brushes</li>
|
||||
<li>Material holdout for Grease Pencil</li>
|
||||
<li>Sculpting gestures</li>
|
||||
<li>Overrides resync and transform support</li>
|
||||
<li>Animation proxy conversion</li>
|
||||
<li>Compound shape collision</li>
|
||||
<li>Outliner collection colors</li>
|
||||
<li>Snappier F-Curves and seamless keyframe insertion</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="2.90" date="2020-08-31">
|
||||
<description>
|
||||
<p>New features:</p>
|
||||
|
@@ -73,6 +73,11 @@ def kmi_args_as_data(kmi):
|
||||
if kmi.key_modifier and kmi.key_modifier != 'NONE':
|
||||
s.append(f"\"key_modifier\": '{kmi.key_modifier}'")
|
||||
|
||||
if kmi.repeat:
|
||||
if kmi.map_type == 'KEYBOARD':
|
||||
if kmi.value in {'PRESS', 'ANY'}:
|
||||
s.append("\"repeat\": True")
|
||||
|
||||
return "{" + ", ".join(s) + "}"
|
||||
|
||||
|
||||
@@ -159,8 +164,15 @@ def keyconfig_export_as_data(wm, kc, filepath, *, all_keymaps=False):
|
||||
# not essential, just convenient to order them predictably.
|
||||
export_keymaps.sort(key=lambda k: k[0].name)
|
||||
|
||||
with open(filepath, "w", encoding="utf-8") as fh:
|
||||
with open(filepath, "w") as fh:
|
||||
fw = fh.write
|
||||
|
||||
# Use the file version since it includes the sub-version
|
||||
# which we can bump multiple times between releases.
|
||||
from bpy.app import version_file
|
||||
fw(f"keyconfig_version = {version_file!r}\n")
|
||||
del version_file
|
||||
|
||||
fw("keyconfig_data = \\\n[")
|
||||
|
||||
for km, _kc_x in export_keymaps:
|
||||
@@ -212,7 +224,11 @@ def keyconfig_export_as_data(wm, kc, filepath, *, all_keymaps=False):
|
||||
fw("if __name__ == \"__main__\":\n")
|
||||
fw(" import os\n")
|
||||
fw(" from bl_keymap_utils.io import keyconfig_import_from_data\n")
|
||||
fw(" keyconfig_import_from_data(os.path.splitext(os.path.basename(__file__))[0], keyconfig_data)\n")
|
||||
fw(" keyconfig_import_from_data(\n")
|
||||
fw(" os.path.splitext(os.path.basename(__file__))[0],\n")
|
||||
fw(" keyconfig_data,\n")
|
||||
fw(" keyconfig_version=keyconfig_version,\n")
|
||||
fw(" )\n")
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
@@ -264,7 +280,7 @@ def keyconfig_init_from_data(kc, keyconfig_data):
|
||||
keymap_init_from_data(km, km_items, is_modal=km_args.get("modal", False))
|
||||
|
||||
|
||||
def keyconfig_import_from_data(name, keyconfig_data):
|
||||
def keyconfig_import_from_data(name, keyconfig_data, *, keyconfig_version=(0, 0, 0)):
|
||||
# Load data in the format defined above.
|
||||
#
|
||||
# Runs at load time, keep this fast!
|
||||
@@ -272,6 +288,9 @@ def keyconfig_import_from_data(name, keyconfig_data):
|
||||
import bpy
|
||||
wm = bpy.context.window_manager
|
||||
kc = wm.keyconfigs.new(name)
|
||||
if keyconfig_version is not None:
|
||||
from .versioning import keyconfig_update
|
||||
keyconfig_data = keyconfig_update(keyconfig_data, keyconfig_version)
|
||||
keyconfig_init_from_data(kc, keyconfig_data)
|
||||
return kc
|
||||
|
||||
|
@@ -192,25 +192,16 @@ def generate(context, space_type, use_fallback_keys=True, use_reset=True):
|
||||
# PAINT_OT_brush_select
|
||||
mode = context.active_object.mode
|
||||
# See: BKE_paint_get_tool_prop_id_from_paintmode
|
||||
if space_type == 'IMAGE_EDITOR':
|
||||
if context.space_data.ui_mode == 'PAINT':
|
||||
attr = "image_tool"
|
||||
else:
|
||||
attr = None
|
||||
elif space_type == 'VIEW_3D':
|
||||
attr = {
|
||||
'SCULPT': "sculpt_tool",
|
||||
'VERTEX_PAINT': "vertex_tool",
|
||||
'WEIGHT_PAINT': "weight_tool",
|
||||
'TEXTURE_PAINT': "image_tool",
|
||||
'PAINT_GPENCIL': "gpencil_tool",
|
||||
'VERTEX_GPENCIL': "gpencil_vertex_tool",
|
||||
'SCULPT_GPENCIL': "gpencil_sculpt_tool",
|
||||
'WEIGHT_GPENCIL': "gpencil_weight_tool",
|
||||
}.get(mode, None)
|
||||
else:
|
||||
attr = None
|
||||
|
||||
attr = {
|
||||
'SCULPT': "sculpt_tool",
|
||||
'VERTEX_PAINT': "vertex_tool",
|
||||
'WEIGHT_PAINT': "weight_tool",
|
||||
'TEXTURE_PAINT': "image_tool",
|
||||
'PAINT_GPENCIL': "gpencil_tool",
|
||||
'VERTEX_GPENCIL': "gpencil_vertex_tool",
|
||||
'SCULPT_GPENCIL': "gpencil_sculpt_tool",
|
||||
'WEIGHT_GPENCIL': "gpencil_weight_tool",
|
||||
}.get(mode, None)
|
||||
if attr is not None:
|
||||
setattr(kmi_hack_brush_select_properties, attr, item.data_block)
|
||||
kmi_found = wm.keyconfigs.find_item_from_operator(
|
||||
|
49
release/scripts/modules/bl_keymap_utils/versioning.py
Normal file
@@ -0,0 +1,49 @@
|
||||
# ##### BEGIN GPL LICENSE BLOCK #####
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ##### END GPL LICENSE BLOCK #####
|
||||
|
||||
# <pep8 compliant>
|
||||
|
||||
# Update Blender version this key-map was written in:
|
||||
#
|
||||
# When the version is ``(0, 0, 0)``, the key-map being loaded didn't contain any versioning information.
|
||||
# This will older than ``(2, 92, 0)``.
|
||||
|
||||
def keyconfig_update(keyconfig_data, keyconfig_version):
|
||||
from bpy.app import version_file as blender_version
|
||||
if keyconfig_version >= blender_version:
|
||||
return keyconfig_data
|
||||
|
||||
# Version the key-map.
|
||||
import copy
|
||||
has_copy = False
|
||||
|
||||
# Default repeat to false.
|
||||
if keyconfig_version <= (2, 92, 0):
|
||||
# Only copy once.
|
||||
if not has_copy:
|
||||
keyconfig_data = copy.deepcopy(keyconfig_data)
|
||||
has_copy = True
|
||||
|
||||
for _km_name, _km_parms, km_items_data in keyconfig_data:
|
||||
for (_item_op, item_event, _item_prop) in km_items_data["items"]:
|
||||
if item_event.get("value") == 'PRESS':
|
||||
# Unfortunately we don't know the 'map_type' at this point.
|
||||
# Setting repeat true on other kinds of events is harmless.
|
||||
item_event["repeat"] = True
|
||||
|
||||
return keyconfig_data
|
@@ -215,13 +215,12 @@ def object_add_grid_scale_apply_operator(operator, context):
|
||||
"""
|
||||
Scale an operators distance values by the grid size.
|
||||
"""
|
||||
# This is a Python version of the C function `WM_operator_view3d_unit_defaults`.
|
||||
grid_scale = object_add_grid_scale(context)
|
||||
|
||||
properties = operator.properties
|
||||
properties_def = properties.bl_rna.properties
|
||||
for prop_id in properties_def.keys():
|
||||
if not properties.is_property_set(prop_id, ghost=False):
|
||||
if not properties.is_property_set(prop_id):
|
||||
prop_def = properties_def[prop_id]
|
||||
if prop_def.unit == 'LENGTH' and prop_def.subtype == 'DISTANCE':
|
||||
setattr(operator, prop_id,
|
||||
|
@@ -84,7 +84,6 @@ url_manual_mapping = (
|
||||
("bpy.types.materialgpencilstyle.use_fill_texture_mix*", "grease_pencil/materials/grease_pencil_shader.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.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"),
|
||||
("bpy.types.brushgpencilsettings.fill_simplify_level*", "grease_pencil/modes/draw/tool_settings/brushes/fill_brush.html#bpy-types-brushgpencilsettings-fill-simplify-level"),
|
||||
("bpy.types.brushgpencilsettings.use_jitter_pressure*", "grease_pencil/modes/draw/tool_settings/brushes/draw_brush.html#bpy-types-brushgpencilsettings-use-jitter-pressure"),
|
||||
@@ -100,7 +99,6 @@ url_manual_mapping = (
|
||||
("bpy.types.toolsettings.use_gpencil_weight_data_add*", "grease_pencil/modes/draw/introduction.html#bpy-types-toolsettings-use-gpencil-weight-data-add"),
|
||||
("bpy.types.view3doverlay.texture_paint_mode_opacity*", "editors/3dview/display/overlays.html#bpy-types-view3doverlay-texture-paint-mode-opacity"),
|
||||
("bpy.types.brush.surface_smooth_shape_preservation*", "sculpt_paint/sculpting/tools/smooth.html#bpy-types-brush-surface-smooth-shape-preservation"),
|
||||
("bpy.types.brush.use_cloth_pin_simulation_boundary*", "sculpt_paint/sculpting/tools/cloth.html#bpy-types-brush-use-cloth-pin-simulation-boundary"),
|
||||
("bpy.types.cyclesrendersettings.camera_cull_margin*", "render/cycles/render_settings/simplify.html#bpy-types-cyclesrendersettings-camera-cull-margin"),
|
||||
("bpy.types.fluiddomainsettings.export_manta_script*", "physics/fluid/type/domain/cache.html#bpy-types-fluiddomainsettings-export-manta-script"),
|
||||
("bpy.types.fluiddomainsettings.fractions_threshold*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-fractions-threshold"),
|
||||
@@ -141,7 +139,7 @@ url_manual_mapping = (
|
||||
("bpy.types.toolsettings.use_gpencil_draw_additive*", "grease_pencil/modes/draw/introduction.html#bpy-types-toolsettings-use-gpencil-draw-additive"),
|
||||
("bpy.types.toolsettings.use_snap_backface_culling*", "editors/3dview/controls/snapping.html#bpy-types-toolsettings-use-snap-backface-culling"),
|
||||
("bpy.types.toolsettings.use_transform_data_origin*", "scene_layout/object/tools/tool_settings.html#bpy-types-toolsettings-use-transform-data-origin"),
|
||||
("bpy.types.view3doverlay.sculpt_mode_mask_opacity*", "sculpt_paint/sculpting/editing/mask.html#bpy-types-view3doverlay-sculpt-mode-mask-opacity"),
|
||||
("bpy.types.view3doverlay.sculpt_mode_mask_opacity*", "sculpt_paint/sculpting/hide_mask.html#bpy-types-view3doverlay-sculpt-mode-mask-opacity"),
|
||||
("bpy.ops.outliner.collection_indirect_only_clear*", "render/layers/layers.html#bpy-ops-outliner-collection-indirect-only-clear"),
|
||||
("bpy.types.cyclesrendersettings.max_subdivisions*", "render/cycles/render_settings/subdivision.html#bpy-types-cyclesrendersettings-max-subdivisions"),
|
||||
("bpy.types.fluiddomainsettings.cache_data_format*", "physics/fluid/type/domain/cache.html#bpy-types-fluiddomainsettings-cache-data-format"),
|
||||
@@ -177,7 +175,6 @@ url_manual_mapping = (
|
||||
("bpy.ops.sequencer.deinterlace_selected_movies*", "video_editing/sequencer/editing.html#bpy-ops-sequencer-deinterlace-selected-movies"),
|
||||
("bpy.types.brush.surface_smooth_current_vertex*", "sculpt_paint/sculpting/tools/smooth.html#bpy-types-brush-surface-smooth-current-vertex"),
|
||||
("bpy.types.brush.use_multiplane_scrape_dynamic*", "sculpt_paint/sculpting/tools/multiplane_scrape.html#bpy-types-brush-use-multiplane-scrape-dynamic"),
|
||||
("bpy.types.brushgpencilsettings.fill_direction*", "grease_pencil/modes/draw/tool_settings/brushes/fill_brush.html#bpy-types-brushgpencilsettings-fill-direction"),
|
||||
("bpy.types.brushgpencilsettings.fill_draw_mode*", "grease_pencil/modes/draw/tool_settings/brushes/fill_brush.html#bpy-types-brushgpencilsettings-fill-draw-mode"),
|
||||
("bpy.types.brushgpencilsettings.fill_threshold*", "grease_pencil/modes/draw/tool_settings/brushes/fill_brush.html#bpy-types-brushgpencilsettings-fill-threshold"),
|
||||
("bpy.types.clothsettings.vertex_group_pressure*", "physics/cloth/settings/physical_properties.html#bpy-types-clothsettings-vertex-group-pressure"),
|
||||
@@ -236,7 +233,6 @@ url_manual_mapping = (
|
||||
("bpy.types.fluidflowsettings.velocity_normal*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-velocity-normal"),
|
||||
("bpy.types.materialgpencilstyle.stroke_style*", "grease_pencil/materials/grease_pencil_shader.html#bpy-types-materialgpencilstyle-stroke-style"),
|
||||
("bpy.types.rendersettings.use_file_extension*", "render/output/settings.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.spaceview3d.transform_orientation*", "editors/3dview/controls/orientation.html#bpy-types-spaceview3d-transform-orientation"),
|
||||
("bpy.types.spaceview3d.use_local_collections*", "editors/3dview/sidebar.html#bpy-types-spaceview3d-use-local-collections"),
|
||||
("bpy.ops.object.constraint_add_with_targets*", "animation/constraints/interface/adding_removing.html#bpy-ops-object-constraint-add-with-targets"),
|
||||
@@ -268,8 +264,8 @@ url_manual_mapping = (
|
||||
("bpy.ops.object.vertex_group_normalize_all*", "sculpt_paint/weight_paint/editing.html#bpy-ops-object-vertex-group-normalize-all"),
|
||||
("bpy.ops.outliner.collection_exclude_clear*", "render/layers/layers.html#bpy-ops-outliner-collection-exclude-clear"),
|
||||
("bpy.ops.outliner.collection_holdout_clear*", "render/layers/layers.html#bpy-ops-outliner-collection-holdout-clear"),
|
||||
("bpy.ops.sculpt.face_set_change_visibility*", "sculpt_paint/sculpting/editing/face_sets.html#bpy-ops-sculpt-face-set-change-visibility"),
|
||||
("bpy.ops.sculpt.face_sets_randomize_colors*", "sculpt_paint/sculpting/editing/face_sets.html#bpy-ops-sculpt-face-sets-randomize-colors"),
|
||||
("bpy.ops.sculpt.face_set_change_visibility*", "sculpt_paint/sculpting/editing.html#bpy-ops-sculpt-face-set-change-visibility"),
|
||||
("bpy.ops.sculpt.face_sets_randomize_colors*", "sculpt_paint/sculpting/editing.html#bpy-ops-sculpt-face-sets-randomize-colors"),
|
||||
("bpy.types.brush.disconnected_distance_max*", "sculpt_paint/sculpting/tools/pose.html#bpy-types-brush-disconnected-distance-max"),
|
||||
("bpy.types.brush.surface_smooth_iterations*", "sculpt_paint/sculpting/tools/smooth.html#bpy-types-brush-surface-smooth-iterations"),
|
||||
("bpy.types.brushgpencilsettings.pen_jitter*", "grease_pencil/modes/draw/tool_settings/brushes/draw_brush.html#bpy-types-brushgpencilsettings-pen-jitter"),
|
||||
@@ -302,7 +298,6 @@ url_manual_mapping = (
|
||||
("bpy.ops.object.anim_transforms_to_deltas*", "scene_layout/object/editing/apply.html#bpy-ops-object-anim-transforms-to-deltas"),
|
||||
("bpy.ops.preferences.app_template_install*", "advanced/app_templates.html#bpy-ops-preferences-app-template-install"),
|
||||
("bpy.types.actionposemarkers.active_index*", "animation/armatures/properties/pose_library.html#bpy-types-actionposemarkers-active-index"),
|
||||
("bpy.types.brush.cloth_force_falloff_type*", "sculpt_paint/sculpting/tools/cloth.html#bpy-types-brush-cloth-force-falloff-type"),
|
||||
("bpy.types.brushgpencilsettings.fill_leak*", "grease_pencil/modes/draw/tool_settings/brushes/fill_brush.html#bpy-types-brushgpencilsettings-fill-leak"),
|
||||
("bpy.types.brushgpencilsettings.show_fill*", "grease_pencil/modes/draw/tool_settings/brushes/fill_brush.html#bpy-types-brushgpencilsettings-show-fill"),
|
||||
("bpy.types.brushgpencilsettings.uv_random*", "grease_pencil/modes/draw/tool_settings/brushes/draw_brush.html#bpy-types-brushgpencilsettings-uv-random"),
|
||||
@@ -369,7 +364,6 @@ url_manual_mapping = (
|
||||
("bpy.types.armature.rigify_theme_to_add*", "addons/rigging/rigify/metarigs.html#bpy-types-armature-rigify-theme-to-add"),
|
||||
("bpy.types.brush.pose_smooth_iterations*", "sculpt_paint/sculpting/tools/pose.html#bpy-types-brush-pose-smooth-iterations"),
|
||||
("bpy.types.brush.use_grab_active_vertex*", "sculpt_paint/sculpting/tools/grab.html#bpy-types-brush-use-grab-active-vertex"),
|
||||
("bpy.types.brush.use_pose_lock_rotation*", "sculpt_paint/sculpting/tools/pose.html#bpy-types-brush-use-pose-lock-rotation"),
|
||||
("bpy.types.compositornodebrightcontrast*", "compositing/types/color/bright_contrast.html#bpy-types-compositornodebrightcontrast"),
|
||||
("bpy.types.compositornodedoubleedgemask*", "compositing/types/matte/double_edge_mask.html#bpy-types-compositornodedoubleedgemask"),
|
||||
("bpy.types.fluiddomainsettings.clipping*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-clipping"),
|
||||
@@ -398,13 +392,11 @@ url_manual_mapping = (
|
||||
("bpy.ops.object.visual_transform_apply*", "scene_layout/object/editing/apply.html#bpy-ops-object-visual-transform-apply"),
|
||||
("bpy.ops.sequencer.change_effect_input*", "video_editing/sequencer/editing.html#bpy-ops-sequencer-change-effect-input"),
|
||||
("bpy.types.armature.rigify_colors_lock*", "addons/rigging/rigify/metarigs.html#bpy-types-armature-rigify-colors-lock"),
|
||||
("bpy.types.brush.boundary_falloff_type*", "sculpt_paint/sculpting/tools/boundary.html#bpy-types-brush-boundary-falloff-type"),
|
||||
("bpy.types.brush.texture_overlay_alpha*", "sculpt_paint/brush/cursor.html#bpy-types-brush-texture-overlay-alpha"),
|
||||
("bpy.types.brushgpencilsettings.random*", "grease_pencil/modes/draw/tool_settings/brushes/draw_brush.html#bpy-types-brushgpencilsettings-random"),
|
||||
("bpy.types.clothsettings.target_volume*", "physics/cloth/settings/physical_properties.html#bpy-types-clothsettings-target-volume"),
|
||||
("bpy.types.compositornodebilateralblur*", "compositing/types/filter/bilateral_blur.html#bpy-types-compositornodebilateralblur"),
|
||||
("bpy.types.compositornodedistancematte*", "compositing/types/matte/distance_key.html#bpy-types-compositornodedistancematte"),
|
||||
("bpy.types.dopesheet.use_filter_invert*", "editors/graph_editor/channels.html#bpy-types-dopesheet-use-filter-invert"),
|
||||
("bpy.types.fluiddomainsettings.gravity*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-gravity"),
|
||||
("bpy.types.fluidflowsettings.flow_type*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-flow-type"),
|
||||
("bpy.types.fluidflowsettings.subframes*", "physics/fluid/type/flow.html#bpy-types-fluidflowsettings-subframes"),
|
||||
@@ -417,7 +409,6 @@ url_manual_mapping = (
|
||||
("bpy.types.rigidbodyconstraint.object1*", "physics/rigid_body/constraints/introduction.html#bpy-types-rigidbodyconstraint-object1"),
|
||||
("bpy.types.rigidbodyconstraint.object2*", "physics/rigid_body/constraints/introduction.html#bpy-types-rigidbodyconstraint-object2"),
|
||||
("bpy.types.sceneeevee.volumetric_light*", "render/eevee/render_settings/volumetrics.html#bpy-types-sceneeevee-volumetric-light"),
|
||||
("bpy.types.sculpt.detail_refine_method*", "sculpt_paint/sculpting/tool_settings/dyntopo.html#bpy-types-sculpt-detail-refine-method"),
|
||||
("bpy.types.sculpt.symmetrize_direction*", "sculpt_paint/sculpting/tool_settings/symmetry.html#bpy-types-sculpt-symmetrize-direction"),
|
||||
("bpy.types.sequenceeditor.show_overlay*", "video_editing/preview/properties.html#bpy-types-sequenceeditor-show-overlay"),
|
||||
("bpy.types.spacetexteditor.show_margin*", "editors/text_editor.html#bpy-types-spacetexteditor-show-margin"),
|
||||
@@ -432,7 +423,6 @@ url_manual_mapping = (
|
||||
("bpy.ops.sequencer.change_effect_type*", "video_editing/sequencer/editing.html#bpy-ops-sequencer-change-effect-type"),
|
||||
("bpy.ops.view3d.localview_remove_from*", "editors/3dview/navigate/local_view.html#bpy-ops-view3d-localview-remove-from"),
|
||||
("bpy.types.animdata.action_blend_type*", "editors/nla/properties_modifiers.html#bpy-types-animdata-action-blend-type"),
|
||||
("bpy.types.brush.boundary_deform_type*", "sculpt_paint/sculpting/tools/boundary.html#bpy-types-brush-boundary-deform-type"),
|
||||
("bpy.types.brush.cursor_overlay_alpha*", "sculpt_paint/brush/cursor.html#bpy-types-brush-cursor-overlay-alpha"),
|
||||
("bpy.types.brush.normal_radius_factor*", "sculpt_paint/sculpting/tool_settings/brush_settings.html#bpy-types-brush-normal-radius-factor"),
|
||||
("bpy.types.brush.topology_rake_factor*", "sculpt_paint/sculpting/tool_settings/dyntopo.html#bpy-types-brush-topology-rake-factor"),
|
||||
@@ -471,7 +461,6 @@ url_manual_mapping = (
|
||||
("bpy.types.armature.layers_protected*", "animation/armatures/properties/skeleton.html#bpy-types-armature-layers-protected"),
|
||||
("bpy.types.brush.crease_pinch_factor*", "sculpt_paint/sculpting/tools/snake_hook.html#bpy-types-brush-crease-pinch-factor"),
|
||||
("bpy.types.brush.elastic_deform_type*", "sculpt_paint/sculpting/tools/elastic_deform.html#bpy-types-brush-elastic-deform-type"),
|
||||
("bpy.types.brush.use_cloth_collision*", "sculpt_paint/sculpting/tools/cloth.html#bpy-types-brush-use-cloth-collision"),
|
||||
("bpy.types.brush.use_primary_overlay*", "sculpt_paint/brush/cursor.html#bpy-types-brush-use-primary-overlay"),
|
||||
("bpy.types.camera.passepartout_alpha*", "render/cameras.html#bpy-types-camera-passepartout-alpha"),
|
||||
("bpy.types.compositornodechromamatte*", "compositing/types/matte/chroma_key.html#bpy-types-compositornodechromamatte"),
|
||||
@@ -492,8 +481,6 @@ url_manual_mapping = (
|
||||
("bpy.types.rigidbodyconstraint.limit*", "physics/rigid_body/constraints/introduction.html#bpy-types-rigidbodyconstraint-limit"),
|
||||
("bpy.types.scene.audio_doppler_speed*", "scene_layout/scene/properties.html#bpy-types-scene-audio-doppler-speed"),
|
||||
("bpy.types.sceneeevee.bokeh_max_size*", "render/eevee/render_settings/depth_of_field.html#bpy-types-sceneeevee-bokeh-max-size"),
|
||||
("bpy.types.sculpt.detail_type_method*", "sculpt_paint/sculpting/tool_settings/dyntopo.html#bpy-types-sculpt-detail-type-method"),
|
||||
("bpy.types.sculpt.use_smooth_shading*", "sculpt_paint/sculpting/tool_settings/dyntopo.html#bpy-types-sculpt-use-smooth-shading"),
|
||||
("bpy.types.shadernodebsdfanisotropic*", "render/shader_nodes/shader/anisotropic.html#bpy-types-shadernodebsdfanisotropic"),
|
||||
("bpy.types.shadernodebsdftranslucent*", "render/shader_nodes/shader/translucent.html#bpy-types-shadernodebsdftranslucent"),
|
||||
("bpy.types.shadernodebsdftransparent*", "render/shader_nodes/shader/transparent.html#bpy-types-shadernodebsdftransparent"),
|
||||
@@ -504,7 +491,7 @@ url_manual_mapping = (
|
||||
("bpy.types.spaceuveditor.lock_bounds*", "modeling/meshes/uv/editing.html#bpy-types-spaceuveditor-lock-bounds"),
|
||||
("bpy.types.spline.tilt_interpolation*", "modeling/curves/properties/active_spline.html#bpy-types-spline-tilt-interpolation"),
|
||||
("bpy.types.volumedisplay.slice_depth*", "modeling/volumes/properties.html#bpy-types-volumedisplay-slice-depth"),
|
||||
("bpy.ops.mesh.customdata_mask_clear*", "sculpt_paint/sculpting/editing/mask.html#bpy-ops-mesh-customdata-mask-clear"),
|
||||
("bpy.ops.mesh.customdata_mask_clear*", "sculpt_paint/sculpting/hide_mask.html#bpy-ops-mesh-customdata-mask-clear"),
|
||||
("bpy.ops.mesh.extrude_vertices_move*", "modeling/meshes/editing/vertex/extrude_vertices.html#bpy-ops-mesh-extrude-vertices-move"),
|
||||
("bpy.ops.mesh.mod_weighted_strength*", "modeling/meshes/editing/mesh/normals.html#bpy-ops-mesh-mod-weighted-strength"),
|
||||
("bpy.ops.mesh.quads_convert_to_tris*", "modeling/meshes/editing/face/triangulate_faces.html#bpy-ops-mesh-quads-convert-to-tris"),
|
||||
@@ -570,12 +557,10 @@ url_manual_mapping = (
|
||||
("bpy.ops.object.vertex_group_clean*", "sculpt_paint/weight_paint/editing.html#bpy-ops-object-vertex-group-clean"),
|
||||
("bpy.ops.preferences.theme_install*", "editors/preferences/themes.html#bpy-ops-preferences-theme-install"),
|
||||
("bpy.ops.render.play-rendered-anim*", "render/output/animation_player.html#bpy-ops-render-play-rendered-anim"),
|
||||
("bpy.ops.sculpt.set_pivot_position*", "sculpt_paint/sculpting/editing/sculpt.html#bpy-ops-sculpt-set-pivot-position"),
|
||||
("bpy.ops.sculpt.set_pivot_position*", "sculpt_paint/sculpting/editing.html#bpy-ops-sculpt-set-pivot-position"),
|
||||
("bpy.ops.sequencer.reassign_inputs*", "video_editing/sequencer/editing.html#bpy-ops-sequencer-reassign-inputs"),
|
||||
("bpy.ops.view3d.view_center_camera*", "editors/3dview/navigate/camera_view.html#bpy-ops-view3d-view-center-camera"),
|
||||
("bpy.types.armaturegpencilmodifier*", "grease_pencil/modifiers/deform/armature.html#bpy-types-armaturegpencilmodifier"),
|
||||
("bpy.types.brush.cloth_deform_type*", "sculpt_paint/sculpting/tools/cloth.html#bpy-types-brush-cloth-deform-type"),
|
||||
("bpy.types.brush.cloth_sim_falloff*", "sculpt_paint/sculpting/tools/cloth.html#bpy-types-brush-cloth-sim-falloff"),
|
||||
("bpy.types.brush.slide_deform_type*", "sculpt_paint/sculpting/tools/slide_relax.html#bpy-types-brush-slide-deform-type"),
|
||||
("bpy.types.camera.show_composition*", "render/cameras.html#bpy-types-camera-show-composition"),
|
||||
("bpy.types.compositornodealphaover*", "compositing/types/color/alpha_over.html#bpy-types-compositornodealphaover"),
|
||||
@@ -598,7 +583,6 @@ url_manual_mapping = (
|
||||
("bpy.types.gpencilsculptguide.type*", "grease_pencil/modes/draw/guides.html#bpy-types-gpencilsculptguide-type"),
|
||||
("bpy.types.laplaciandeformmodifier*", "modeling/modifiers/deform/laplacian_deform.html#bpy-types-laplaciandeformmodifier"),
|
||||
("bpy.types.laplaciansmoothmodifier*", "modeling/modifiers/deform/laplacian_smooth.html#bpy-types-laplaciansmoothmodifier"),
|
||||
("bpy.types.layercollection.exclude*", "editors/outliner/interface.html#bpy-types-layercollection-exclude"),
|
||||
("bpy.types.layercollection.holdout*", "editors/outliner/interface.html#bpy-types-layercollection-holdout"),
|
||||
("bpy.types.limitdistanceconstraint*", "animation/constraints/transform/limit_distance.html#bpy-types-limitdistanceconstraint"),
|
||||
("bpy.types.limitlocationconstraint*", "animation/constraints/transform/limit_location.html#bpy-types-limitlocationconstraint"),
|
||||
@@ -631,9 +615,8 @@ url_manual_mapping = (
|
||||
("bpy.ops.object.vertex_group_move*", "modeling/meshes/properties/vertex_groups/vertex_groups.html#bpy-ops-object-vertex-group-move"),
|
||||
("bpy.ops.object.vertex_group_sort*", "modeling/meshes/properties/vertex_groups/vertex_groups.html#bpy-ops-object-vertex-group-sort"),
|
||||
("bpy.ops.object.vertex_parent_set*", "modeling/meshes/editing/vertex/make_vertex_parent.html#bpy-ops-object-vertex-parent-set"),
|
||||
("bpy.ops.paint.mask_lasso_gesture*", "sculpt_paint/sculpting/editing/mask.html#bpy-ops-paint-mask-lasso-gesture"),
|
||||
("bpy.ops.paint.mask_lasso_gesture*", "sculpt_paint/sculpting/hide_mask.html#bpy-ops-paint-mask-lasso-gesture"),
|
||||
("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"),
|
||||
("bpy.ops.uv.average_islands_scale*", "modeling/meshes/uv/editing.html#bpy-ops-uv-average-islands-scale"),
|
||||
("bpy.types.armature.pose_position*", "animation/armatures/properties/skeleton.html#bpy-types-armature-pose-position"),
|
||||
@@ -692,7 +675,6 @@ url_manual_mapping = (
|
||||
("bpy.ops.mesh.extrude_edges_move*", "modeling/meshes/editing/edge/extrude_edges.html#bpy-ops-mesh-extrude-edges-move"),
|
||||
("bpy.ops.mesh.extrude_faces_move*", "modeling/meshes/editing/face/extrude_individual_faces.html#bpy-ops-mesh-extrude-faces-move"),
|
||||
("bpy.ops.mesh.faces_shade_smooth*", "modeling/meshes/editing/face/shading.html#bpy-ops-mesh-faces-shade-smooth"),
|
||||
("bpy.ops.mesh.paint_mask_extract*", "sculpt_paint/sculpting/editing/mask.html#bpy-ops-mesh-paint-mask-extract"),
|
||||
("bpy.ops.mesh.subdivide_edgering*", "modeling/meshes/editing/edge/subdivide_edge_ring.html#bpy-ops-mesh-subdivide-edgering"),
|
||||
("bpy.ops.object.constraints_copy*", "animation/constraints/interface/adding_removing.html#bpy-ops-object-constraints-copy"),
|
||||
("bpy.ops.object.gpencil_modifier*", "grease_pencil/modifiers/index.html#bpy-ops-object-gpencil-modifier"),
|
||||
@@ -706,7 +688,7 @@ url_manual_mapping = (
|
||||
("bpy.ops.preferences.studiolight*", "editors/preferences/lights.html#bpy-ops-preferences-studiolight"),
|
||||
("bpy.ops.scene.view_layer_remove*", "render/layers/layers.html#bpy-ops-scene-view-layer-remove"),
|
||||
("bpy.ops.screen.screen_full_area*", "interface/window_system/areas.html#bpy-ops-screen-screen-full-area"),
|
||||
("bpy.ops.sculpt.face_sets_create*", "sculpt_paint/sculpting/editing/face_sets.html#bpy-ops-sculpt-face-sets-create"),
|
||||
("bpy.ops.sculpt.face_sets_create*", "sculpt_paint/sculpting/editing.html#bpy-ops-sculpt-face-sets-create"),
|
||||
("bpy.ops.transform.rotate_normal*", "modeling/meshes/editing/mesh/normals.html#bpy-ops-transform-rotate-normal"),
|
||||
("bpy.ops.transform.shrink_fatten*", "modeling/meshes/editing/mesh/transform/shrink-fatten.html#bpy-ops-transform-shrink-fatten"),
|
||||
("bpy.ops.transform.vertex_random*", "modeling/meshes/editing/mesh/transform/randomize.html#bpy-ops-transform-vertex-random"),
|
||||
@@ -714,8 +696,6 @@ url_manual_mapping = (
|
||||
("bpy.ops.wm.operator_cheat_sheet*", "advanced/operators.html#bpy-ops-wm-operator-cheat-sheet"),
|
||||
("bpy.ops.wm.previews_batch_clear*", "files/blend/previews.html#bpy-ops-wm-previews-batch-clear"),
|
||||
("bpy.types.armature.use_mirror_x*", "animation/armatures/bones/tools/tool_settings.html#bpy-types-armature-use-mirror-x"),
|
||||
("bpy.types.brush.boundary_offset*", "sculpt_paint/sculpting/tools/boundary.html#bpy-types-brush-boundary-offset"),
|
||||
("bpy.types.brush.cloth_sim_limit*", "sculpt_paint/sculpting/tools/cloth.html#bpy-types-brush-cloth-sim-limit"),
|
||||
("bpy.types.brush.use_custom_icon*", "sculpt_paint/brush/brush.html#bpy-types-brush-use-custom-icon"),
|
||||
("bpy.types.brushtextureslot.mask*", "sculpt_paint/brush/texture.html#bpy-types-brushtextureslot-mask"),
|
||||
("bpy.types.camerabackgroundimage*", "render/cameras.html#bpy-types-camerabackgroundimage"),
|
||||
@@ -732,7 +712,6 @@ url_manual_mapping = (
|
||||
("bpy.types.curve.use_path_follow*", "modeling/curves/properties/path_animation.html#bpy-types-curve-use-path-follow"),
|
||||
("bpy.types.dampedtrackconstraint*", "animation/constraints/tracking/damped_track.html#bpy-types-dampedtrackconstraint"),
|
||||
("bpy.types.distortednoisetexture*", "render/materials/legacy_textures/types/distorted_noise.html#bpy-types-distortednoisetexture"),
|
||||
("bpy.types.dopesheet.filter_text*", "editors/graph_editor/channels.html#bpy-types-dopesheet-filter-text"),
|
||||
("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.gpencilsculptsettings*", "grease_pencil/properties/index.html#bpy-types-gpencilsculptsettings"),
|
||||
@@ -745,7 +724,6 @@ url_manual_mapping = (
|
||||
("bpy.types.posebone.custom_shape*", "animation/armatures/bones/properties/display.html#bpy-types-posebone-custom-shape"),
|
||||
("bpy.types.rigifyselectioncolors*", "addons/rigging/rigify/metarigs.html#bpy-types-rigifyselectioncolors"),
|
||||
("bpy.types.sceneeevee.volumetric*", "render/eevee/render_settings/volumetrics.html#bpy-types-sceneeevee-volumetric"),
|
||||
("bpy.types.sculpt.detail_percent*", "sculpt_paint/sculpting/tool_settings/dyntopo.html#bpy-types-sculpt-detail-percent"),
|
||||
("bpy.types.sculpt.gravity_object*", "sculpt_paint/sculpting/tool_settings/options.html#bpy-types-sculpt-gravity-object"),
|
||||
("bpy.types.shadernodebsdfdiffuse*", "render/shader_nodes/shader/diffuse.html#bpy-types-shadernodebsdfdiffuse"),
|
||||
("bpy.types.shadernodelayerweight*", "render/shader_nodes/input/layer_weight.html#bpy-types-shadernodelayerweight"),
|
||||
@@ -771,9 +749,8 @@ url_manual_mapping = (
|
||||
("bpy.ops.nla.action_sync_length*", "editors/nla/editing.html#bpy-ops-nla-action-sync-length"),
|
||||
("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"),
|
||||
("bpy.ops.outliner.lib_operation*", "files/linked_libraries/introduction.html#bpy-ops-outliner-lib-operation"),
|
||||
("bpy.ops.outliner.orphans_purge*", "editors/outliner/interface.html#bpy-ops-outliner-orphans-purge"),
|
||||
("bpy.ops.paint.mask_box_gesture*", "sculpt_paint/sculpting/editing/mask.html#bpy-ops-paint-mask-box-gesture"),
|
||||
("bpy.ops.screen.region_quadview*", "editors/3dview/navigate/views.html#bpy-ops-screen-region-quadview"),
|
||||
("bpy.ops.sequencer.offset_clear*", "video_editing/sequencer/editing.html#bpy-ops-sequencer-offset-clear"),
|
||||
("bpy.ops.uv.follow_active_quads*", "modeling/meshes/editing/uv.html#bpy-ops-uv-follow-active-quads"),
|
||||
@@ -803,7 +780,6 @@ url_manual_mapping = (
|
||||
("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.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"),
|
||||
("bpy.types.preferencesfilepaths*", "editors/preferences/file_paths.html#bpy-types-preferencesfilepaths"),
|
||||
("bpy.types.scene.background_set*", "scene_layout/scene/properties.html#bpy-types-scene-background-set"),
|
||||
@@ -836,9 +812,8 @@ url_manual_mapping = (
|
||||
("bpy.ops.mesh.blend_from_shape*", "modeling/meshes/editing/vertex/blend_shape.html#bpy-ops-mesh-blend-from-shape"),
|
||||
("bpy.ops.mesh.dissolve_limited*", "modeling/meshes/editing/mesh/delete.html#bpy-ops-mesh-dissolve-limited"),
|
||||
("bpy.ops.mesh.face_make_planar*", "modeling/meshes/editing/mesh/cleanup.html#bpy-ops-mesh-face-make-planar"),
|
||||
("bpy.ops.mesh.face_set_extract*", "sculpt_paint/sculpting/editing/face_sets.html#bpy-ops-mesh-face-set-extract"),
|
||||
("bpy.ops.mesh.faces_shade_flat*", "modeling/meshes/editing/face/shading.html#bpy-ops-mesh-faces-shade-flat"),
|
||||
("bpy.ops.mesh.paint_mask_slice*", "sculpt_paint/sculpting/editing/mask.html#bpy-ops-mesh-paint-mask-slice"),
|
||||
("bpy.ops.mesh.paint_mask_slice*", "sculpt_paint/sculpting/hide_mask.html#bpy-ops-mesh-paint-mask-slice"),
|
||||
("bpy.ops.mesh.select_ungrouped*", "modeling/meshes/selecting/all_by_trait.html#bpy-ops-mesh-select-ungrouped"),
|
||||
("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"),
|
||||
@@ -846,13 +821,13 @@ url_manual_mapping = (
|
||||
("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"),
|
||||
("bpy.ops.outliner.id_operation*", "editors/outliner/editing.html#bpy-ops-outliner-id-operation"),
|
||||
("bpy.ops.paint.mask_flood_fill*", "sculpt_paint/sculpting/editing/mask.html#bpy-ops-paint-mask-flood-fill"),
|
||||
("bpy.ops.paint.mask_flood_fill*", "sculpt_paint/sculpting/hide_mask.html#bpy-ops-paint-mask-flood-fill"),
|
||||
("bpy.ops.pose.quaternions_flip*", "animation/armatures/posing/editing/flip_quats.html#bpy-ops-pose-quaternions-flip"),
|
||||
("bpy.ops.pose.transforms_clear*", "animation/armatures/posing/editing/clear.html#bpy-ops-pose-transforms-clear"),
|
||||
("bpy.ops.preferences.copy_prev*", "editors/preferences/introduction.html#bpy-ops-preferences-copy-prev"),
|
||||
("bpy.ops.preferences.keyconfig*", "editors/preferences/keymap.html#bpy-ops-preferences-keyconfig"),
|
||||
("bpy.ops.screen.repeat_history*", "interface/undo_redo.html#bpy-ops-screen-repeat-history"),
|
||||
("bpy.ops.sculpt.face_sets_init*", "sculpt_paint/sculpting/editing/face_sets.html#bpy-ops-sculpt-face-sets-init"),
|
||||
("bpy.ops.sculpt.face_sets_init*", "sculpt_paint/sculpting/editing.html#bpy-ops-sculpt-face-sets-init"),
|
||||
("bpy.ops.sequencer.change_path*", "video_editing/sequencer/editing.html#bpy-ops-sequencer-change-path"),
|
||||
("bpy.ops.sequencer.refresh_all*", "video_editing/sequencer/navigating.html#bpy-ops-sequencer-refresh-all"),
|
||||
("bpy.ops.sequencer.swap_inputs*", "video_editing/sequencer/editing.html#bpy-ops-sequencer-swap-inputs"),
|
||||
@@ -861,7 +836,6 @@ url_manual_mapping = (
|
||||
("bpy.ops.transform.edge_crease*", "modeling/meshes/editing/edge/edge_data.html#bpy-ops-transform-edge-crease"),
|
||||
("bpy.ops.transform.skin_resize*", "modeling/meshes/editing/mesh/transform/skin_resize.html#bpy-ops-transform-skin-resize"),
|
||||
("bpy.ops.uv.seams_from_islands*", "modeling/meshes/uv/editing.html#bpy-ops-uv-seams-from-islands"),
|
||||
("bpy.types.brush.cloth_damping*", "sculpt_paint/sculpting/tools/cloth.html#bpy-types-brush-cloth-damping"),
|
||||
("bpy.types.brush.icon_filepath*", "sculpt_paint/brush/brush.html#bpy-types-brush-icon-filepath"),
|
||||
("bpy.types.brush.smooth_stroke*", "grease_pencil/modes/draw/tool_settings/brushes/draw_brush.html#bpy-types-brush-smooth-stroke"),
|
||||
("bpy.types.brush.tip_roundness*", "sculpt_paint/sculpting/tools/clay_strips.html#bpy-types-brush-tip-roundness"),
|
||||
@@ -940,7 +914,7 @@ url_manual_mapping = (
|
||||
("bpy.ops.pose.rigify_generate*", "addons/rigging/rigify/basics.html#bpy-ops-pose-rigify-generate"),
|
||||
("bpy.ops.preferences.autoexec*", "editors/preferences/save_load.html#bpy-ops-preferences-autoexec"),
|
||||
("bpy.ops.scene.view_layer_add*", "render/layers/layers.html#bpy-ops-scene-view-layer-add"),
|
||||
("bpy.ops.sculpt.face_set_edit*", "sculpt_paint/sculpting/editing/face_sets.html#bpy-ops-sculpt-face-set-edit"),
|
||||
("bpy.ops.sculpt.face_set_edit*", "sculpt_paint/sculpting/editing.html#bpy-ops-sculpt-face-set-edit"),
|
||||
("bpy.ops.sequencer.gap_insert*", "video_editing/sequencer/editing.html#bpy-ops-sequencer-gap-insert"),
|
||||
("bpy.ops.sequencer.gap_remove*", "video_editing/sequencer/editing.html#bpy-ops-sequencer-gap-remove"),
|
||||
("bpy.ops.sequencer.rendersize*", "video_editing/sequencer/editing.html#bpy-ops-sequencer-rendersize"),
|
||||
@@ -976,11 +950,9 @@ url_manual_mapping = (
|
||||
("bpy.types.nodeoutputfileslot*", "compositing/types/output/file.html#bpy-types-nodeoutputfileslot"),
|
||||
("bpy.types.normaleditmodifier*", "modeling/modifiers/modify/normal_edit.html#bpy-types-normaleditmodifier"),
|
||||
("bpy.types.object.empty_image*", "modeling/empties.html#bpy-types-object-empty-image"),
|
||||
("bpy.types.object.hide_render*", "scene_layout/object/properties/visibility.html#bpy-types-object-hide-render"),
|
||||
("bpy.types.object.hide_select*", "scene_layout/object/properties/visibility.html#bpy-types-object-hide-select"),
|
||||
("bpy.types.object.hide_render*", "editors/outliner/interface.html#bpy-types-object-hide-render"),
|
||||
("bpy.types.object.show_bounds*", "scene_layout/object/properties/display.html#bpy-types-object-show-bounds"),
|
||||
("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"),
|
||||
("bpy.types.shadernodebsdftoon*", "render/shader_nodes/shader/toon.html#bpy-types-shadernodebsdftoon"),
|
||||
("bpy.types.shadernodeemission*", "render/shader_nodes/shader/emission.html#bpy-types-shadernodeemission"),
|
||||
@@ -1121,8 +1093,8 @@ url_manual_mapping = (
|
||||
("bpy.ops.object.track_clear*", "animation/constraints/interface/adding_removing.html#bpy-ops-object-track-clear"),
|
||||
("bpy.ops.poselib.apply_pose*", "animation/armatures/properties/pose_library.html#bpy-ops-poselib-apply-pose"),
|
||||
("bpy.ops.screen.repeat_last*", "interface/undo_redo.html#bpy-ops-screen-repeat-last"),
|
||||
("bpy.ops.sculpt.mask_expand*", "sculpt_paint/sculpting/editing/mask.html#bpy-ops-sculpt-mask-expand"),
|
||||
("bpy.ops.sculpt.mask_filter*", "sculpt_paint/sculpting/editing/mask.html#bpy-ops-sculpt-mask-filter"),
|
||||
("bpy.ops.sculpt.mask_expand*", "sculpt_paint/sculpting/hide_mask.html#bpy-ops-sculpt-mask-expand"),
|
||||
("bpy.ops.sculpt.mask_filter*", "sculpt_paint/sculpting/hide_mask.html#bpy-ops-sculpt-mask-filter"),
|
||||
("bpy.ops.transform.tosphere*", "modeling/meshes/editing/mesh/transform/to_sphere.html#bpy-ops-transform-tosphere"),
|
||||
("bpy.ops.view3d.clip_border*", "editors/3dview/navigate/regions.html#bpy-ops-view3d-clip-border"),
|
||||
("bpy.ops.wm.previews_ensure*", "files/blend/previews.html#bpy-ops-wm-previews-ensure"),
|
||||
@@ -1130,7 +1102,6 @@ url_manual_mapping = (
|
||||
("bpy.types.actionconstraint*", "animation/constraints/relationship/action.html#bpy-types-actionconstraint"),
|
||||
("bpy.types.addonpreferences*", "editors/preferences/addons.html#bpy-types-addonpreferences"),
|
||||
("bpy.types.armaturemodifier*", "modeling/modifiers/deform/armature.html#bpy-types-armaturemodifier"),
|
||||
("bpy.types.brush.cloth_mass*", "sculpt_paint/sculpting/tools/cloth.html#bpy-types-brush-cloth-mass"),
|
||||
("bpy.types.colormixsequence*", "video_editing/sequencer/strips/effects/color_mix.html#bpy-types-colormixsequence"),
|
||||
("bpy.types.curve.dimensions*", "modeling/curves/properties/shape.html#bpy-types-curve-dimensions"),
|
||||
("bpy.types.curve.twist_mode*", "modeling/curves/properties/shape.html#bpy-types-curve-twist-mode"),
|
||||
@@ -1144,6 +1115,7 @@ url_manual_mapping = (
|
||||
("bpy.types.multicamsequence*", "video_editing/sequencer/strips/effects/multicam.html#bpy-types-multicamsequence"),
|
||||
("bpy.types.multiplysequence*", "video_editing/sequencer/strips/effects/multiply.html#bpy-types-multiplysequence"),
|
||||
("bpy.types.multiresmodifier*", "modeling/modifiers/generate/multiresolution.html#bpy-types-multiresmodifier"),
|
||||
("bpy.types.object.use_extra*", "scene_layout/object/properties/relations.html#bpy-types-object-use-extra"),
|
||||
("bpy.types.overdropsequence*", "video_editing/sequencer/strips/effects/alpha_over_under_overdrop.html#bpy-types-overdropsequence"),
|
||||
("bpy.types.paint.show_brush*", "sculpt_paint/brush/cursor.html#bpy-types-paint-show-brush"),
|
||||
("bpy.types.paint.use_cavity*", "sculpt_paint/texture_paint/tool_settings/mask.html#bpy-types-paint-use-cavity"),
|
||||
@@ -1152,7 +1124,7 @@ url_manual_mapping = (
|
||||
("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.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.sculpt.show_mask*", "sculpt_paint/sculpting/hide_mask.html#bpy-types-sculpt-show-mask"),
|
||||
("bpy.types.sequencemodifier*", "video_editing/sequencer/properties/modifiers.html#bpy-types-sequencemodifier"),
|
||||
("bpy.types.shaderfxcolorize*", "grease_pencil/visual_effects/colorize.html#bpy-types-shaderfxcolorize"),
|
||||
("bpy.types.shaderfxpixelate*", "grease_pencil/visual_effects/pixelate.html#bpy-types-shaderfxpixelate"),
|
||||
@@ -1191,7 +1163,7 @@ url_manual_mapping = (
|
||||
("bpy.ops.nla.tracks_delete*", "editors/nla/editing.html#bpy-ops-nla-tracks-delete"),
|
||||
("bpy.ops.object.lightprobe*", "render/eevee/light_probes/index.html#bpy-ops-object-lightprobe"),
|
||||
("bpy.ops.object.make_links*", "scene_layout/object/editing/make_links.html#bpy-ops-object-make-links"),
|
||||
("bpy.ops.object.make_local*", "files/linked_libraries/link_append.html#bpy-ops-object-make-local"),
|
||||
("bpy.ops.object.make_local*", "files/linked_libraries/introduction.html#bpy-ops-object-make-local"),
|
||||
("bpy.ops.object.origin_set*", "scene_layout/object/origin.html#bpy-ops-object-origin-set"),
|
||||
("bpy.ops.object.parent_set*", "scene_layout/object/editing/parent.html#bpy-ops-object-parent-set"),
|
||||
("bpy.ops.object.pointcloud*", "modeling/point_cloud.html#bpy-ops-object-pointcloud"),
|
||||
@@ -1202,7 +1174,7 @@ url_manual_mapping = (
|
||||
("bpy.ops.preferences.addon*", "editors/preferences/addons.html#bpy-ops-preferences-addon"),
|
||||
("bpy.ops.scene.light_cache*", "render/eevee/render_settings/indirect_lighting.html#bpy-ops-scene-light-cache"),
|
||||
("bpy.ops.screen.area_dupli*", "interface/window_system/areas.html#bpy-ops-screen-area-dupli"),
|
||||
("bpy.ops.sculpt.dirty_mask*", "sculpt_paint/sculpting/editing/mask.html#bpy-ops-sculpt-dirty-mask"),
|
||||
("bpy.ops.sculpt.dirty_mask*", "sculpt_paint/sculpting/hide_mask.html#bpy-ops-sculpt-dirty-mask"),
|
||||
("bpy.ops.sculpt.symmetrize*", "sculpt_paint/sculpting/tool_settings/symmetry.html#bpy-ops-sculpt-symmetrize"),
|
||||
("bpy.ops.uv.remove_doubles*", "modeling/meshes/uv/editing.html#bpy-ops-uv-remove-doubles"),
|
||||
("bpy.ops.uv.sphere_project*", "modeling/meshes/editing/uv.html#bpy-ops-uv-sphere-project"),
|
||||
@@ -1326,7 +1298,7 @@ url_manual_mapping = (
|
||||
("bpy.ops.object.face_map*", "modeling/meshes/properties/object_data.html#bpy-ops-object-face-map"),
|
||||
("bpy.ops.pose.relax_rest*", "animation/armatures/posing/editing/in_betweens.html#bpy-ops-pose-relax-rest"),
|
||||
("bpy.ops.rigidbody.world*", "physics/rigid_body/world.html#bpy-ops-rigidbody-world"),
|
||||
("bpy.ops.sculpt.optimize*", "sculpt_paint/sculpting/editing/sculpt.html#bpy-ops-sculpt-optimize"),
|
||||
("bpy.ops.sculpt.optimize*", "sculpt_paint/sculpting/editing.html#bpy-ops-sculpt-optimize"),
|
||||
("bpy.ops.sequencer.split*", "video_editing/sequencer/editing.html#bpy-ops-sequencer-split"),
|
||||
("bpy.ops.transform.shear*", "modeling/meshes/editing/mesh/transform/shear.html#bpy-ops-transform-shear"),
|
||||
("bpy.ops.uv.cube_project*", "modeling/meshes/editing/uv.html#bpy-ops-uv-cube-project"),
|
||||
@@ -1556,7 +1528,7 @@ url_manual_mapping = (
|
||||
("bpy.ops.mesh.screw*", "modeling/meshes/editing/edge/screw.html#bpy-ops-mesh-screw"),
|
||||
("bpy.ops.mesh.split*", "modeling/meshes/editing/mesh/split.html#bpy-ops-mesh-split"),
|
||||
("bpy.ops.nla.delete*", "editors/nla/editing.html#bpy-ops-nla-delete"),
|
||||
("bpy.ops.paint.mask*", "sculpt_paint/sculpting/editing/mask.html#bpy-ops-paint-mask"),
|
||||
("bpy.ops.paint.mask*", "sculpt_paint/sculpting/hide_mask.html#bpy-ops-paint-mask"),
|
||||
("bpy.ops.pose.paste*", "animation/armatures/posing/editing/copy_paste.html#bpy-ops-pose-paste"),
|
||||
("bpy.ops.pose.relax*", "animation/armatures/posing/editing/in_betweens.html#bpy-ops-pose-relax"),
|
||||
("bpy.ops.safe_areas*", "render/cameras.html#bpy-ops-safe-areas"),
|
||||
@@ -1590,7 +1562,6 @@ url_manual_mapping = (
|
||||
("bpy.ops.uv.select*", "editors/uv/selecting.html#bpy-ops-uv-select"),
|
||||
("bpy.ops.uv.stitch*", "modeling/meshes/uv/editing.html#bpy-ops-uv-stitch"),
|
||||
("bpy.ops.uv.unwrap*", "modeling/meshes/editing/uv.html#bpy-ops-uv-unwrap"),
|
||||
("bpy.ops.wm.append*", "files/linked_libraries/link_append.html#bpy-ops-wm-append"),
|
||||
("bpy.ops.wm.search*", "interface/controls/templates/operator_search.html#bpy-ops-wm-search"),
|
||||
("bpy.types.animviz*", "animation/motion_paths.html#bpy-types-animviz"),
|
||||
("bpy.types.lattice*", "animation/lattice.html#bpy-types-lattice"),
|
||||
@@ -1632,7 +1603,6 @@ url_manual_mapping = (
|
||||
("bpy.ops.surface*", "modeling/surfaces/index.html#bpy-ops-surface"),
|
||||
("bpy.ops.texture*", "render/materials/legacy_textures/index.html#bpy-ops-texture"),
|
||||
("bpy.ops.uv.weld*", "modeling/meshes/uv/editing.html#bpy-ops-uv-weld"),
|
||||
("bpy.ops.wm.link*", "files/linked_libraries/link_append.html#bpy-ops-wm-link"),
|
||||
("bpy.ops.wm.tool*", "interface/tool_system.html#bpy-ops-wm-tool"),
|
||||
("bpy.types.addon*", "editors/preferences/addons.html#bpy-types-addon"),
|
||||
("bpy.types.brush*", "sculpt_paint/brush/brush.html#bpy-types-brush"),
|
||||
|
@@ -82,10 +82,10 @@ def write_sysinfo(filepath):
|
||||
output.write("\t%r\n" % p)
|
||||
|
||||
output.write(title("Python (External Binary)"))
|
||||
output.write("binary path: %s\n" % prepr(sys.executable))
|
||||
output.write("binary path: %s\n" % prepr(bpy.app.binary_path_python))
|
||||
try:
|
||||
py_ver = prepr(subprocess.check_output([
|
||||
sys.executable,
|
||||
bpy.app.binary_path_python,
|
||||
"--version",
|
||||
]).strip())
|
||||
except Exception as e:
|
||||
|
@@ -1454,40 +1454,6 @@
|
||||
>
|
||||
</ThemeBoneColorSet>
|
||||
</bone_color_sets>
|
||||
<collection_color>
|
||||
<ThemeCollectionColor
|
||||
color="#dd473f"
|
||||
>
|
||||
</ThemeCollectionColor>
|
||||
<ThemeCollectionColor
|
||||
color="#e5a057"
|
||||
>
|
||||
</ThemeCollectionColor>
|
||||
<ThemeCollectionColor
|
||||
color="#e4d050"
|
||||
>
|
||||
</ThemeCollectionColor>
|
||||
<ThemeCollectionColor
|
||||
color="#3fb931"
|
||||
>
|
||||
</ThemeCollectionColor>
|
||||
<ThemeCollectionColor
|
||||
color="#3887c7"
|
||||
>
|
||||
</ThemeCollectionColor>
|
||||
<ThemeCollectionColor
|
||||
color="#844fcd"
|
||||
>
|
||||
</ThemeCollectionColor>
|
||||
<ThemeCollectionColor
|
||||
color="#c169b5"
|
||||
>
|
||||
</ThemeCollectionColor>
|
||||
<ThemeCollectionColor
|
||||
color="#7a5441"
|
||||
>
|
||||
</ThemeCollectionColor>
|
||||
</collection_color>
|
||||
</Theme>
|
||||
<ThemeStyle>
|
||||
<panel_title>
|
||||
|
@@ -237,7 +237,7 @@ def km_screen(params):
|
||||
)
|
||||
|
||||
items.extend([
|
||||
("screen.repeat_last", {"type": 'G', "value": 'PRESS'}, None),
|
||||
("screen.repeat_last", {"type": 'G', "value": 'PRESS', "repeat": True}, None),
|
||||
# Animation
|
||||
("screen.userpref_show", {"type": 'COMMA', "value": 'PRESS', "ctrl": True}, None),
|
||||
("screen.animation_step", {"type": 'TIMER0', "value": 'ANY', "any": True}, None),
|
||||
@@ -256,8 +256,8 @@ def km_screen(params):
|
||||
("file.execute", {"type": 'NUMPAD_ENTER', "value": 'PRESS'}, None),
|
||||
("file.cancel", {"type": 'ESC', "value": 'PRESS'}, None),
|
||||
# Undo
|
||||
("ed.undo", {"type": 'Z', "value": 'PRESS', "ctrl": True}, None),
|
||||
("ed.redo", {"type": 'Z', "value": 'PRESS', "shift": True, "ctrl": True}, None),
|
||||
("ed.undo", {"type": 'Z', "value": 'PRESS', "ctrl": True, "repeat": True}, None),
|
||||
("ed.redo", {"type": 'Z', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True}, None),
|
||||
("ed.undo_history", {"type": 'Z', "value": 'PRESS', "alt": True, "ctrl": True}, None),
|
||||
# Render
|
||||
("render.view_cancel", {"type": 'ESC', "value": 'PRESS'}, None),
|
||||
@@ -344,8 +344,8 @@ def km_view2d(params):
|
||||
("view2d.zoom_in", {"type": 'WHEELINMOUSE', "value": 'PRESS'}, None),
|
||||
("view2d.zoom_out", {"type": 'WHEELOUTMOUSE', "value": 'PRESS', "alt": True}, None),
|
||||
("view2d.zoom_in", {"type": 'WHEELINMOUSE', "value": 'PRESS', "alt": True}, None),
|
||||
("view2d.zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS'}, None),
|
||||
("view2d.zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
|
||||
("view2d.zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "repeat": True}, None),
|
||||
("view2d.zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "repeat": True}, None),
|
||||
("view2d.zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
|
||||
("view2d.smoothview", {"type": 'TIMER1', "value": 'ANY', "any": True}, None),
|
||||
# Scroll up/down, only when zoom is not available.
|
||||
@@ -379,16 +379,16 @@ def km_view2d_buttons_list(params):
|
||||
("view2d.pan", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
|
||||
("view2d.scroll_down", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'}, None),
|
||||
("view2d.scroll_up", {"type": 'WHEELUPMOUSE', "value": 'PRESS'}, None),
|
||||
("view2d.scroll_down", {"type": 'PAGE_DOWN', "value": 'PRESS'},
|
||||
("view2d.scroll_down", {"type": 'PAGE_DOWN', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("page", True)]}),
|
||||
("view2d.scroll_up", {"type": 'PAGE_UP', "value": 'PRESS'},
|
||||
("view2d.scroll_up", {"type": 'PAGE_UP', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("page", True)]}),
|
||||
# Zoom
|
||||
("view2d.zoom", {"type": 'RIGHTMOUSE', "value": 'PRESS', "alt": True}, None),
|
||||
("view2d.zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
|
||||
("view2d.zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
|
||||
("view2d.zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS'}, None),
|
||||
("view2d.zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
|
||||
("view2d.zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "repeat": True}, None),
|
||||
("view2d.zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "repeat": True}, None),
|
||||
("view2d.reset", {"type": 'A', "value": 'PRESS'}, None),
|
||||
])
|
||||
|
||||
@@ -479,17 +479,21 @@ def km_outliner(params):
|
||||
{"properties": [("tweak", True), ("mode", "ADD")]}),
|
||||
("outliner.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY', "ctrl": True},
|
||||
{"properties": [("tweak", True), ("mode", "SUB")]}),
|
||||
("outliner.select_walk", {"type": 'UP_ARROW', "value": 'PRESS'}, {"properties": [("direction", 'UP')]}),
|
||||
("outliner.select_walk", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True},
|
||||
("outliner.select_walk", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("direction", 'UP')]}),
|
||||
("outliner.select_walk", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("direction", 'UP'), ("extend", True)]}),
|
||||
("outliner.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS'}, {"properties": [("direction", 'DOWN')]}),
|
||||
("outliner.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True},
|
||||
("outliner.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("direction", 'DOWN')]}),
|
||||
("outliner.select_walk", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("direction", 'DOWN'), ("extend", True)]}),
|
||||
("outliner.select_walk", {"type": 'LEFT_ARROW', "value": 'PRESS'}, {"properties": [("direction", 'LEFT')]}),
|
||||
("outliner.select_walk", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True},
|
||||
("outliner.select_walk", {"type": 'LEFT_ARROW', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("direction", 'LEFT')]}),
|
||||
("outliner.select_walk", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("direction", 'LEFT'), ("toggle_all", True)]}),
|
||||
("outliner.select_walk", {"type": 'RIGHT_ARROW', "value": 'PRESS'}, {"properties": [("direction", 'RIGHT')]}),
|
||||
("outliner.select_walk", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True},
|
||||
("outliner.select_walk", {"type": 'RIGHT_ARROW', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("direction", 'RIGHT')]}),
|
||||
("outliner.select_walk", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("direction", 'RIGHT'), ("toggle_all", True)]}),
|
||||
("outliner.item_openclose", {"type": 'LEFTMOUSE', "value": 'CLICK'},
|
||||
{"properties": [("all", False)]}),
|
||||
@@ -505,9 +509,9 @@ def km_outliner(params):
|
||||
("outliner.show_hierarchy", {"type": 'A', "value": 'PRESS'}, None),
|
||||
("outliner.show_active", {"type": 'PERIOD', "value": 'PRESS'}, None),
|
||||
("outliner.show_active", {"type": 'F', "value": 'PRESS'}, None),
|
||||
("outliner.scroll_page", {"type": 'PAGE_DOWN', "value": 'PRESS'},
|
||||
("outliner.scroll_page", {"type": 'PAGE_DOWN', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("up", False)]}),
|
||||
("outliner.scroll_page", {"type": 'PAGE_UP', "value": 'PRESS'},
|
||||
("outliner.scroll_page", {"type": 'PAGE_UP', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("up", True)]}),
|
||||
("outliner.show_one_level", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
|
||||
("outliner.show_one_level", {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
|
||||
@@ -570,8 +574,8 @@ def km_uv_editor(params):
|
||||
("uv.select_loop", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'},
|
||||
{"properties": [("extend", False)]}),
|
||||
("uv.select_linked", {"type": 'RIGHT_BRACKET', "value": 'PRESS'}, None),
|
||||
("uv.select_more", {"type": 'UP_ARROW', "value": 'PRESS'}, None),
|
||||
("uv.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS'}, None),
|
||||
("uv.select_more", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, None),
|
||||
("uv.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, None),
|
||||
("uv.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'SELECT')]}),
|
||||
("uv.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True, "shift": True}, {"properties": [("action", 'DESELECT')]}),
|
||||
("uv.select_all", {"type": 'I', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'INVERT')]}),
|
||||
@@ -649,9 +653,9 @@ def km_view3d(params):
|
||||
("view3d.zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
|
||||
("view3d.zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
|
||||
# Numpad
|
||||
("view3d.zoom", {"type": 'NUMPAD_PLUS', "value": 'PRESS'},
|
||||
("view3d.zoom", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("delta", 1)]}),
|
||||
("view3d.zoom", {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
|
||||
("view3d.zoom", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("delta", -1)]}),
|
||||
("view3d.zoom", {"type": 'WHEELINMOUSE', "value": 'PRESS'},
|
||||
{"properties": [("delta", 1)]}),
|
||||
@@ -661,9 +665,9 @@ def km_view3d(params):
|
||||
{"properties": [("delta", 1)]}),
|
||||
("view3d.zoom", {"type": 'WHEELOUTMOUSE', "value": 'PRESS', "alt": True},
|
||||
{"properties": [("delta", -1)]}),
|
||||
("view3d.dolly", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True},
|
||||
("view3d.dolly", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("delta", 1)]}),
|
||||
("view3d.dolly", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True},
|
||||
("view3d.dolly", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("delta", -1)]}),
|
||||
("view3d.view_all", {"type": 'A', "value": 'PRESS'},
|
||||
{"properties": [("center", False)]}),
|
||||
@@ -777,8 +781,8 @@ def km_mask_editing(params):
|
||||
{"properties": [("mode", 'ADD')]}),
|
||||
("mask.select_lasso", {"type": params.action_tweak, "value": 'ANY', "shift": True, "ctrl": True, "alt": True},
|
||||
{"properties": [("mode", 'SUB')]}),
|
||||
("mask.select_more", {"type": 'UP_ARROW', "value": 'PRESS'}, None),
|
||||
("mask.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS'}, None),
|
||||
("mask.select_more", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, None),
|
||||
("mask.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, None),
|
||||
("mask.hide_view_clear", {"type": 'H', "value": 'PRESS', "alt": True}, None),
|
||||
("mask.hide_view_set", {"type": 'H', "value": 'PRESS', "ctrl": True},
|
||||
{"properties": [("unselected", False)]}),
|
||||
@@ -903,8 +907,8 @@ def km_graph_editor(params):
|
||||
{"properties":[("tweak", True), ("axis_range", False), ("mode", 'ADD')]}),
|
||||
("graph.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY', "ctrl": True},
|
||||
{"properties":[("tweak", True), ("axis_range", False), ("mode", 'SUB')]}),
|
||||
("graph.select_more", {"type": 'UP_ARROW', "value": 'PRESS'}, None),
|
||||
("graph.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS'}, None),
|
||||
("graph.select_more", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, None),
|
||||
("graph.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, None),
|
||||
("graph.select_linked", {"type": 'RIGHT_BRACKET', "value": 'PRESS'}, None),
|
||||
op_menu("GRAPH_MT_delete", {"type": 'BACK_SPACE', "value": 'PRESS'}),
|
||||
op_menu("GRAPH_MT_delete", {"type": 'DEL', "value": 'PRESS'}),
|
||||
@@ -982,8 +986,8 @@ def km_image(params):
|
||||
("image.view_zoom_out", {"type": 'WHEELOUTMOUSE', "value": 'PRESS'}, None),
|
||||
("image.view_zoom_in", {"type": 'WHEELINMOUSE', "value": 'PRESS', "alt": True}, None),
|
||||
("image.view_zoom_out", {"type": 'WHEELOUTMOUSE', "value": 'PRESS', "alt": True}, None),
|
||||
("image.view_zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
|
||||
("image.view_zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS'}, None),
|
||||
("image.view_zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "repeat": True}, None),
|
||||
("image.view_zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "repeat": True}, None),
|
||||
("image.view_zoom", {"type": 'RIGHTMOUSE', "value": 'PRESS', "alt": True}, None),
|
||||
("image.view_zoom", {"type": 'TRACKPADZOOM', "value": 'ANY'}, None),
|
||||
("image.view_zoom", {"type": 'TRACKPADPAN', "value": 'ANY', "ctrl": True}, None),
|
||||
@@ -1213,17 +1217,17 @@ def km_file_browser(params):
|
||||
("wm.context_toggle", {"type": 'T', "value": 'PRESS'},
|
||||
{"properties": [("data_path", 'space_data.show_region_toolbar')]}),
|
||||
("file.bookmark_add", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
|
||||
("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS'},
|
||||
("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("increment", 1)]}),
|
||||
("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True},
|
||||
("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("increment", 10)]}),
|
||||
("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
|
||||
("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True},
|
||||
{"properties": [("increment", 100)]}),
|
||||
("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
|
||||
("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("increment", -1)]}),
|
||||
("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True},
|
||||
("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("increment", -10)]}),
|
||||
("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
|
||||
("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True},
|
||||
{"properties": [("increment", -100)]}),
|
||||
*_template_items_context_menu("FILEBROWSER_MT_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}),
|
||||
])
|
||||
@@ -1301,17 +1305,17 @@ def km_file_browser_buttons(params):
|
||||
)
|
||||
|
||||
items.extend([
|
||||
("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS'},
|
||||
("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("increment", 1)]}),
|
||||
("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True},
|
||||
("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("increment", 10)]}),
|
||||
("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
|
||||
("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True},
|
||||
{"properties": [("increment", 100)]}),
|
||||
("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
|
||||
("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("increment", -1)]}),
|
||||
("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True},
|
||||
("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("increment", -10)]}),
|
||||
("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
|
||||
("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True},
|
||||
{"properties": [("increment", -100)]}),
|
||||
])
|
||||
|
||||
@@ -1385,8 +1389,8 @@ def km_dopesheet(params):
|
||||
{"properties": [("mode", 'MARKERS_COLUMN')]}),
|
||||
("action.select_column", {"type": 'K', "value": 'PRESS', "alt": True},
|
||||
{"properties": [("mode", 'MARKERS_BETWEEN')]}),
|
||||
("action.select_more", {"type": 'UP_ARROW', "value": 'PRESS', "ctrl": True}, None),
|
||||
("action.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS', "ctrl": True}, None),
|
||||
("action.select_more", {"type": 'UP_ARROW', "value": 'PRESS', "ctrl": True, "repeat": True}, None),
|
||||
("action.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS', "ctrl": True, "repeat": True}, None),
|
||||
("action.select_linked", {"type": 'RIGHT_BRACKET', "value": 'PRESS'}, None),
|
||||
("action.frame_jump", {"type": 'G', "value": 'PRESS', "ctrl": True}, None),
|
||||
("wm.context_menu_enum", {"type": 'X', "value": 'PRESS'},
|
||||
@@ -1584,9 +1588,9 @@ def km_text(params):
|
||||
{"properties": [("data_path", 'space_data.font_size'), ("reverse", False)]}),
|
||||
("wm.context_cycle_int", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True},
|
||||
{"properties": [("data_path", 'space_data.font_size'), ("reverse", True)]}),
|
||||
("wm.context_cycle_int", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
|
||||
("wm.context_cycle_int", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True},
|
||||
{"properties": [("data_path", 'space_data.font_size'), ("reverse", False)]}),
|
||||
("wm.context_cycle_int", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
|
||||
("wm.context_cycle_int", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True},
|
||||
{"properties": [("data_path", 'space_data.font_size'), ("reverse", True)]}),
|
||||
("text.new", {"type": 'N', "value": 'PRESS', "ctrl": True}, None),
|
||||
])
|
||||
@@ -1603,16 +1607,16 @@ def km_text(params):
|
||||
("text.cut", {"type": 'DEL', "value": 'PRESS', "shift": True}, None),
|
||||
("text.copy", {"type": 'INSERT', "value": 'PRESS', "ctrl": True}, None),
|
||||
("text.paste", {"type": 'INSERT', "value": 'PRESS', "shift": True}, None),
|
||||
("text.duplicate_line", {"type": 'D', "value": 'PRESS', "ctrl": True}, None),
|
||||
("text.duplicate_line", {"type": 'D', "value": 'PRESS', "ctrl": True, "repeat": True}, None),
|
||||
("text.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True}, None),
|
||||
("text.select_line", {"type": 'A', "value": 'PRESS', "shift": True, "ctrl": True}, None),
|
||||
("text.select_word", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
|
||||
("text.move_lines", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
|
||||
("text.move_lines", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True},
|
||||
{"properties": [("direction", 'UP')]}),
|
||||
("text.move_lines", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
|
||||
("text.move_lines", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True},
|
||||
{"properties": [("direction", 'DOWN')]}),
|
||||
("text.indent_or_autocomplete", {"type": 'TAB', "value": 'PRESS'}, None),
|
||||
("text.unindent", {"type": 'TAB', "value": 'PRESS', "shift": True}, None),
|
||||
("text.indent_or_autocomplete", {"type": 'TAB', "value": 'PRESS', "repeat": True}, None),
|
||||
("text.unindent", {"type": 'TAB', "value": 'PRESS', "shift": True, "repeat": True}, None),
|
||||
("text.uncomment", {"type": 'D', "value": 'PRESS', "shift": True, "ctrl": True}, None),
|
||||
("text.move", {"type": 'HOME', "value": 'PRESS'},
|
||||
{"properties": [("type", 'LINE_BEGIN')]}),
|
||||
@@ -1622,21 +1626,21 @@ def km_text(params):
|
||||
{"properties": [("type", 'LINE_END')]}),
|
||||
("text.move", {"type": 'E', "value": 'PRESS', "shift": True, "ctrl": True},
|
||||
{"properties": [("type", 'LINE_END')]}),
|
||||
("text.move", {"type": 'LEFT_ARROW', "value": 'PRESS'},
|
||||
("text.move", {"type": 'LEFT_ARROW', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_CHARACTER')]}),
|
||||
("text.move", {"type": 'RIGHT_ARROW', "value": 'PRESS'},
|
||||
("text.move", {"type": 'RIGHT_ARROW', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("type", 'NEXT_CHARACTER')]}),
|
||||
("text.move", {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True},
|
||||
("text.move", {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True, "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_WORD')]}),
|
||||
("text.move", {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True},
|
||||
("text.move", {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True, "repeat": True},
|
||||
{"properties": [("type", 'NEXT_WORD')]}),
|
||||
("text.move", {"type": 'UP_ARROW', "value": 'PRESS'},
|
||||
("text.move", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_LINE')]}),
|
||||
("text.move", {"type": 'DOWN_ARROW', "value": 'PRESS'},
|
||||
("text.move", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("type", 'NEXT_LINE')]}),
|
||||
("text.move", {"type": 'PAGE_UP', "value": 'PRESS'},
|
||||
("text.move", {"type": 'PAGE_UP', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_PAGE')]}),
|
||||
("text.move", {"type": 'PAGE_DOWN', "value": 'PRESS'},
|
||||
("text.move", {"type": 'PAGE_DOWN', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("type", 'NEXT_PAGE')]}),
|
||||
("text.move", {"type": 'HOME', "value": 'PRESS', "ctrl": True},
|
||||
{"properties": [("type", 'FILE_TOP')]}),
|
||||
@@ -1646,33 +1650,33 @@ def km_text(params):
|
||||
{"properties": [("type", 'LINE_BEGIN')]}),
|
||||
("text.move_select", {"type": 'END', "value": 'PRESS', "shift": True},
|
||||
{"properties": [("type", 'LINE_END')]}),
|
||||
("text.move_select", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True},
|
||||
("text.move_select", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_CHARACTER')]}),
|
||||
("text.move_select", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True},
|
||||
("text.move_select", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("type", 'NEXT_CHARACTER')]}),
|
||||
("text.move_select", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
|
||||
("text.move_select", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_WORD')]}),
|
||||
("text.move_select", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
|
||||
("text.move_select", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True},
|
||||
{"properties": [("type", 'NEXT_WORD')]}),
|
||||
("text.move_select", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True},
|
||||
("text.move_select", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_LINE')]}),
|
||||
("text.move_select", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True},
|
||||
("text.move_select", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("type", 'NEXT_LINE')]}),
|
||||
("text.move_select", {"type": 'PAGE_UP', "value": 'PRESS', "shift": True},
|
||||
("text.move_select", {"type": 'PAGE_UP', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_PAGE')]}),
|
||||
("text.move_select", {"type": 'PAGE_DOWN', "value": 'PRESS', "shift": True},
|
||||
("text.move_select", {"type": 'PAGE_DOWN', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("type", 'NEXT_PAGE')]}),
|
||||
("text.move_select", {"type": 'HOME', "value": 'PRESS', "shift": True, "ctrl": True},
|
||||
{"properties": [("type", 'FILE_TOP')]}),
|
||||
("text.move_select", {"type": 'END', "value": 'PRESS', "shift": True, "ctrl": True},
|
||||
{"properties": [("type", 'FILE_BOTTOM')]}),
|
||||
("text.delete", {"type": 'DEL', "value": 'PRESS'},
|
||||
("text.delete", {"type": 'DEL', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("type", 'NEXT_CHARACTER')]}),
|
||||
("text.delete", {"type": 'BACK_SPACE', "value": 'PRESS'},
|
||||
("text.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_CHARACTER')]}),
|
||||
("text.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True},
|
||||
("text.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_CHARACTER')]}),
|
||||
("text.delete", {"type": 'DEL', "value": 'PRESS', "ctrl": True},
|
||||
("text.delete", {"type": 'DEL', "value": 'PRESS', "ctrl": True, "repeat": True},
|
||||
{"properties": [("type", 'NEXT_WORD')]}),
|
||||
("text.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "ctrl": True},
|
||||
{"properties": [("type", 'PREVIOUS_WORD')]}),
|
||||
@@ -1688,11 +1692,11 @@ def km_text(params):
|
||||
{"properties": [("lines", -1)]}),
|
||||
("text.scroll", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'},
|
||||
{"properties": [("lines", 1)]}),
|
||||
("text.line_break", {"type": 'RET', "value": 'PRESS'}, None),
|
||||
("text.line_break", {"type": 'NUMPAD_ENTER', "value": 'PRESS'}, None),
|
||||
("text.line_break", {"type": 'RET', "value": 'PRESS', "repeat": True}, None),
|
||||
("text.line_break", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "repeat": True}, None),
|
||||
*_template_items_context_menu("TEXT_MT_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS', "any": True}),
|
||||
("text.line_number", {"type": 'TEXTINPUT', "value": 'ANY', "any": True}, None),
|
||||
("text.insert", {"type": 'TEXTINPUT', "value": 'ANY', "any": True}, None),
|
||||
("text.insert", {"type": 'TEXTINPUT', "value": 'ANY', "any": True, "repeat": True}, None),
|
||||
])
|
||||
|
||||
return keymap
|
||||
@@ -1759,17 +1763,17 @@ def km_sequencer(params):
|
||||
("sequencer.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
|
||||
("sequencer.view_selected", {"type": 'F', "value": 'PRESS'}, None),
|
||||
("sequencer.view_frame", {"type": 'NUMPAD_0', "value": 'PRESS'}, None),
|
||||
("sequencer.strip_jump", {"type": 'PAGE_UP', "value": 'PRESS'},
|
||||
("sequencer.strip_jump", {"type": 'PAGE_UP', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("next", True), ("center", False)]}),
|
||||
("sequencer.strip_jump", {"type": 'PAGE_DOWN', "value": 'PRESS'},
|
||||
("sequencer.strip_jump", {"type": 'PAGE_DOWN', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("next", False), ("center", False)]}),
|
||||
("sequencer.strip_jump", {"type": 'PAGE_UP', "value": 'PRESS', "alt": True},
|
||||
("sequencer.strip_jump", {"type": 'PAGE_UP', "value": 'PRESS', "alt": True, "repeat": True},
|
||||
{"properties": [("next", True), ("center", True)]}),
|
||||
("sequencer.strip_jump", {"type": 'PAGE_DOWN', "value": 'PRESS', "alt": True},
|
||||
("sequencer.strip_jump", {"type": 'PAGE_DOWN', "value": 'PRESS', "alt": True, "repeat": True},
|
||||
{"properties": [("next", False), ("center", True)]}),
|
||||
("sequencer.swap", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True},
|
||||
("sequencer.swap", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True, "repeat": True},
|
||||
{"properties": [("side", 'LEFT')]}),
|
||||
("sequencer.swap", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True},
|
||||
("sequencer.swap", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True, "repeat": True},
|
||||
{"properties": [("side", 'RIGHT')]}),
|
||||
("sequencer.gap_remove", {"type": 'BACK_SPACE', "value": 'PRESS'},
|
||||
{"properties": [("all", False)]}),
|
||||
@@ -1797,8 +1801,8 @@ def km_sequencer(params):
|
||||
{"properties": [("side_of_frame", True), ("linked_time", True)]}),
|
||||
("sequencer.select", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True},
|
||||
{"properties": [("extend", True), ("side_of_frame", True), ("linked_time", True)]}),
|
||||
("sequencer.select_more", {"type": 'UP_ARROW', "value": 'PRESS'}, None),
|
||||
("sequencer.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS'}, None),
|
||||
("sequencer.select_more", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, None),
|
||||
("sequencer.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, None),
|
||||
("sequencer.select_linked_pick", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
|
||||
{"properties": [("extend", False)]}),
|
||||
("sequencer.select_linked_pick", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True},
|
||||
@@ -1860,9 +1864,9 @@ def km_console(params):
|
||||
)
|
||||
|
||||
items.extend([
|
||||
("console.move", {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True},
|
||||
("console.move", {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True, "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_WORD')]}),
|
||||
("console.move", {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True},
|
||||
("console.move", {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True, "repeat": True},
|
||||
{"properties": [("type", 'NEXT_WORD')]}),
|
||||
("console.move", {"type": 'HOME', "value": 'PRESS'},
|
||||
{"properties": [("type", 'LINE_BEGIN')]}),
|
||||
@@ -1872,27 +1876,27 @@ def km_console(params):
|
||||
{"properties": [("data_path", 'space_data.font_size'), ("reverse", False)]}),
|
||||
("wm.context_cycle_int", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "ctrl": True},
|
||||
{"properties": [("data_path", 'space_data.font_size'), ("reverse", True)]}),
|
||||
("wm.context_cycle_int", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
|
||||
("wm.context_cycle_int", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True, "repeat": True},
|
||||
{"properties": [("data_path", 'space_data.font_size'), ("reverse", False)]}),
|
||||
("wm.context_cycle_int", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
|
||||
("wm.context_cycle_int", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True, "repeat": True},
|
||||
{"properties": [("data_path", 'space_data.font_size'), ("reverse", True)]}),
|
||||
("console.move", {"type": 'LEFT_ARROW', "value": 'PRESS'},
|
||||
("console.move", {"type": 'LEFT_ARROW', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_CHARACTER')]}),
|
||||
("console.move", {"type": 'RIGHT_ARROW', "value": 'PRESS'},
|
||||
("console.move", {"type": 'RIGHT_ARROW', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("type", 'NEXT_CHARACTER')]}),
|
||||
("console.history_cycle", {"type": 'UP_ARROW', "value": 'PRESS'},
|
||||
("console.history_cycle", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("reverse", True)]}),
|
||||
("console.history_cycle", {"type": 'DOWN_ARROW', "value": 'PRESS'},
|
||||
("console.history_cycle", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("reverse", False)]}),
|
||||
("console.delete", {"type": 'DEL', "value": 'PRESS'},
|
||||
("console.delete", {"type": 'DEL', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("type", 'NEXT_CHARACTER')]}),
|
||||
("console.delete", {"type": 'BACK_SPACE', "value": 'PRESS'},
|
||||
("console.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_CHARACTER')]}),
|
||||
("console.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True},
|
||||
{"properties": [("type", 'PREVIOUS_CHARACTER')]}),
|
||||
("console.delete", {"type": 'DEL', "value": 'PRESS', "ctrl": True},
|
||||
("console.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_CHARACTER')], "repeat": True}),
|
||||
("console.delete", {"type": 'DEL', "value": 'PRESS', "ctrl": True, "repeat": True},
|
||||
{"properties": [("type", 'NEXT_WORD')]}),
|
||||
("console.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "ctrl": True},
|
||||
("console.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "ctrl": True, "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_WORD')]}),
|
||||
("console.clear_line", {"type": 'RET', "value": 'PRESS', "shift": True}, None),
|
||||
("console.clear_line", {"type": 'NUMPAD_ENTER', "value": 'PRESS', "shift": True}, None),
|
||||
@@ -1905,12 +1909,12 @@ def km_console(params):
|
||||
("console.paste", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
|
||||
("console.select_set", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
|
||||
("console.select_word", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
|
||||
("console.insert", {"type": 'TAB', "value": 'PRESS', "ctrl": True},
|
||||
("console.insert", {"type": 'TAB', "value": 'PRESS', "ctrl": True, "repeat": True},
|
||||
{"properties": [("text", '\t')]}),
|
||||
("console.indent_or_autocomplete", {"type": 'TAB', "value": 'PRESS'}, None),
|
||||
("console.unindent", {"type": 'TAB', "value": 'PRESS', "shift": True}, None),
|
||||
("console.indent_or_autocomplete", {"type": 'TAB', "value": 'PRESS', "repeat": True}, None),
|
||||
("console.unindent", {"type": 'TAB', "value": 'PRESS', "shift": True, "repeat": True}, None),
|
||||
*_template_items_context_menu("CONSOLE_MT_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}),
|
||||
("console.insert", {"type": 'TEXTINPUT', "value": 'ANY', "any": True}, None),
|
||||
("console.insert", {"type": 'TEXTINPUT', "value": 'ANY', "any": True, "repeat": True}, None),
|
||||
])
|
||||
|
||||
return keymap
|
||||
@@ -1928,9 +1932,9 @@ def km_clip(params):
|
||||
op_panel("TOPBAR_PT_name", {"type": 'RET', "value": 'PRESS'}, [("keep_open", False)]),
|
||||
("wm.search_menu", {"type": 'TAB', "value": 'PRESS'}, None),
|
||||
("clip.open", {"type": 'O', "value": 'PRESS', "alt": True}, None),
|
||||
("clip.track_markers", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True},
|
||||
("clip.track_markers", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True, "repeat": True},
|
||||
{"properties": [("backwards", True), ("sequence", False)]}),
|
||||
("clip.track_markers", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True},
|
||||
("clip.track_markers", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True, "repeat": True},
|
||||
{"properties": [("backwards", False), ("sequence", False)]}),
|
||||
("clip.track_markers", {"type": 'T', "value": 'PRESS', "ctrl": True},
|
||||
{"properties": [("backwards", False), ("sequence", True)]}),
|
||||
@@ -1965,8 +1969,8 @@ def km_clip_editor(params):
|
||||
("clip.view_zoom_out", {"type": 'WHEELOUTMOUSE', "value": 'PRESS'}, None),
|
||||
("clip.view_zoom_in", {"type": 'WHEELINMOUSE', "value": 'PRESS', "alt": True}, None),
|
||||
("clip.view_zoom_out", {"type": 'WHEELOUTMOUSE', "value": 'PRESS', "alt": True}, None),
|
||||
("clip.view_zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS'}, None),
|
||||
("clip.view_zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS'}, None),
|
||||
("clip.view_zoom_in", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "repeat": True}, None),
|
||||
("clip.view_zoom_out", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "repeat": True}, None),
|
||||
("clip.view_zoom_ratio", {"type": 'NUMPAD_8', "value": 'PRESS', "ctrl": True},
|
||||
{"properties": [("ratio", 8.0)]}),
|
||||
("clip.view_zoom_ratio", {"type": 'NUMPAD_4', "value": 'PRESS', "ctrl": True},
|
||||
@@ -1991,13 +1995,13 @@ def km_clip_editor(params):
|
||||
("clip.view_selected", {"type": 'F', "value": 'PRESS'}, None),
|
||||
("clip.view_all", {"type": 'NDOF_BUTTON_FIT', "value": 'PRESS'}, None),
|
||||
("clip.view_ndof", {"type": 'NDOF_MOTION', "value": 'ANY'}, None),
|
||||
("clip.frame_jump", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
|
||||
("clip.frame_jump", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True},
|
||||
{"properties": [("position", 'PATHSTART')]}),
|
||||
("clip.frame_jump", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
|
||||
("clip.frame_jump", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True},
|
||||
{"properties": [("position", 'PATHEND')]}),
|
||||
("clip.frame_jump", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "alt": True},
|
||||
("clip.frame_jump", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "alt": True, "repeat": True},
|
||||
{"properties": [("position", 'FAILEDPREV')]}),
|
||||
("clip.frame_jump", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "alt": True},
|
||||
("clip.frame_jump", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "alt": True, "repeat": True},
|
||||
{"properties": [("position", 'PATHSTART')]}),
|
||||
("clip.change_frame", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
|
||||
("clip.select", {"type": 'LEFTMOUSE', "value": 'PRESS'},
|
||||
@@ -2139,7 +2143,7 @@ def km_frames(params):
|
||||
{"properties": [("end", True)]}),
|
||||
("screen.frame_jump", {"type": 'MEDIA_FIRST', "value": 'PRESS'},
|
||||
{"properties": [("end", False)]}),
|
||||
("screen.animation_play", {"type": 'SPACE', "value": 'PRESS', "repeat": False}, None),
|
||||
("screen.animation_play", {"type": 'SPACE', "value": 'PRESS'}, None),
|
||||
("screen.animation_cancel", {"type": 'ESC', "value": 'PRESS'}, None),
|
||||
("screen.animation_play", {"type": 'MEDIA_PLAY', "value": 'PRESS'}, None),
|
||||
("screen.animation_cancel", {"type": 'MEDIA_STOP', "value": 'PRESS'}, None),
|
||||
@@ -2214,9 +2218,9 @@ def km_animation_channels(params):
|
||||
("anim.channels_collapse", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
|
||||
{"properties": [("all", False)]}),
|
||||
# Move.
|
||||
("anim.channels_move", {"type": 'PAGE_UP', "value": 'PRESS'},
|
||||
("anim.channels_move", {"type": 'PAGE_UP', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("direction", 'UP')]}),
|
||||
("anim.channels_move", {"type": 'PAGE_DOWN', "value": 'PRESS'},
|
||||
("anim.channels_move", {"type": 'PAGE_DOWN', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("direction", 'DOWN')]}),
|
||||
("anim.channels_move", {"type": 'PAGE_UP', "value": 'PRESS', "shift": True},
|
||||
{"properties": [("direction", 'TOP')]}),
|
||||
@@ -2268,8 +2272,8 @@ def _grease_pencil_selection(params):
|
||||
# Select grouped
|
||||
("gpencil.select_grouped", {"type": 'G', "value": 'PRESS', "shift": True}, None),
|
||||
# Select more/less
|
||||
("gpencil.select_more", {"type": 'UP_ARROW', "value": 'PRESS'}, None),
|
||||
("gpencil.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS'}, None),
|
||||
("gpencil.select_more", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, None),
|
||||
("gpencil.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, None),
|
||||
]
|
||||
|
||||
|
||||
@@ -2957,13 +2961,13 @@ def km_pose(params):
|
||||
("pose.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True, "shift": True}, {"properties": [("action", 'DESELECT')]}),
|
||||
("pose.select_all", {"type": 'I', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'INVERT')]}),
|
||||
("pose.select_parent", {"type": 'UP_ARROW', "value": 'PRESS', "ctrl": True}, None),
|
||||
("pose.select_hierarchy", {"type": 'UP_ARROW', "value": 'PRESS'},
|
||||
("pose.select_hierarchy", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("direction", 'PARENT'), ("extend", False)]}),
|
||||
("pose.select_hierarchy", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True},
|
||||
("pose.select_hierarchy", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("direction", 'PARENT'), ("extend", True)]}),
|
||||
("pose.select_hierarchy", {"type": 'DOWN_ARROW', "value": 'PRESS'},
|
||||
("pose.select_hierarchy", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("direction", 'CHILD'), ("extend", False)]}),
|
||||
("pose.select_hierarchy", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True},
|
||||
("pose.select_hierarchy", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("direction", 'CHILD'), ("extend", True)]}),
|
||||
("pose.select_linked", {"type": 'RIGHT_BRACKET', "value": 'PRESS'}, None),
|
||||
("pose.bone_layers", {"type": 'G', "value": 'PRESS'}, None),
|
||||
@@ -3007,16 +3011,16 @@ def km_object_mode(params):
|
||||
("object.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'SELECT')]}),
|
||||
("object.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True, "shift": True}, {"properties": [("action", 'DESELECT')]}),
|
||||
("object.select_all", {"type": 'I', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'INVERT')]}),
|
||||
("object.select_more", {"type": 'UP_ARROW', "value": 'PRESS'}, None),
|
||||
("object.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS'}, None),
|
||||
("object.select_more", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, None),
|
||||
("object.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, None),
|
||||
("object.select_linked", {"type": 'RIGHT_BRACKET', "value": 'PRESS'}, None),
|
||||
("object.select_hierarchy", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
|
||||
("object.select_hierarchy", {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("direction", 'PARENT'), ("extend", False)]}),
|
||||
("object.select_hierarchy", {"type": 'LEFT_BRACKET', "value": 'PRESS', "shift": True},
|
||||
("object.select_hierarchy", {"type": 'LEFT_BRACKET', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("direction", 'PARENT'), ("extend", True)]}),
|
||||
("object.select_hierarchy", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
|
||||
("object.select_hierarchy", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("direction", 'CHILD'), ("extend", False)]}),
|
||||
("object.select_hierarchy", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True},
|
||||
("object.select_hierarchy", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("direction", 'CHILD'), ("extend", True)]}),
|
||||
("object.parent_set", {"type": 'P', "value": 'PRESS'}, None),
|
||||
|
||||
@@ -3113,8 +3117,8 @@ def km_curve(params):
|
||||
("curve.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True, "shift": True}, {"properties": [("action", 'DESELECT')]}),
|
||||
("curve.select_all", {"type": 'I', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'INVERT')]}),
|
||||
("curve.select_row", {"type": 'R', "value": 'PRESS', "shift": True}, None),
|
||||
("curve.select_more", {"type": 'UP_ARROW', "value": 'PRESS'}, None),
|
||||
("curve.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS'}, None),
|
||||
("curve.select_more", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, None),
|
||||
("curve.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, None),
|
||||
("curve.select_linked", {"type": 'RIGHT_BRACKET', "value": 'PRESS'}, None),
|
||||
("curve.shortest_path_pick", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True, "shift": True}, None),
|
||||
("curve.duplicate_move", {"type": 'D', "value": 'PRESS', "ctrl": True}, None),
|
||||
@@ -3208,9 +3212,9 @@ def km_image_paint(params):
|
||||
("paint.sample_color", {"type": 'I', "value": 'PRESS'}, None),
|
||||
("paint.brush_colors_flip", {"type": 'X', "value": 'PRESS'}, None),
|
||||
("paint.grab_clone", {"type": 'MIDDLEMOUSE', "value": 'PRESS'}, None),
|
||||
("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
|
||||
("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("scalar", 0.9)]}),
|
||||
("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
|
||||
("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("scalar", 1.0 / 0.9)]}),
|
||||
*_template_paint_radial_control("image_paint", color=True, zoom=True, rotation=True, secondary_rotation=True),
|
||||
("brush.stencil_control", {"type": 'RIGHTMOUSE', "value": 'PRESS'},
|
||||
@@ -3258,9 +3262,9 @@ def km_vertex_paint(params):
|
||||
("paint.vertex_paint", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True},
|
||||
{"properties": [("mode", 'INVERT')]}),
|
||||
("paint.brush_colors_flip", {"type": 'X', "value": 'PRESS'}, None),
|
||||
("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
|
||||
("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("scalar", 0.9)]}),
|
||||
("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
|
||||
("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("scalar", 1.0 / 0.9)]}),
|
||||
*_template_paint_radial_control("vertex_paint", color=True, rotation=True),
|
||||
("brush.stencil_control", {"type": 'RIGHTMOUSE', "value": 'PRESS'},
|
||||
@@ -3303,9 +3307,9 @@ def km_weight_paint(params):
|
||||
items.extend([
|
||||
("paint.weight_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
|
||||
("paint.weight_sample_group", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, None),
|
||||
("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
|
||||
("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("scalar", 0.9)]}),
|
||||
("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
|
||||
("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("scalar", 1.0 / 0.9)]}),
|
||||
*_template_paint_radial_control("weight_paint"),
|
||||
("wm.context_toggle", {"type": 'M', "value": 'PRESS'},
|
||||
@@ -3354,9 +3358,9 @@ def km_sculpt(params):
|
||||
{"properties": [("action", 'SHOW'), ("area", 'ALL')]}),
|
||||
# Subdivision levels
|
||||
*_template_items_object_subdivision_set(),
|
||||
("object.subdivision_set", {"type": 'PAGE_UP', "value": 'PRESS'},
|
||||
("object.subdivision_set", {"type": 'PAGE_UP', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("level", 1), ("relative", True)]}),
|
||||
("object.subdivision_set", {"type": 'PAGE_DOWN', "value": 'PRESS'},
|
||||
("object.subdivision_set", {"type": 'PAGE_DOWN', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("level", -1), ("relative", True)]}),
|
||||
# Mask
|
||||
("paint.mask_flood_fill", {"type": 'A', "value": 'PRESS', "ctrl": True},
|
||||
@@ -3381,9 +3385,9 @@ def km_sculpt(params):
|
||||
("object.voxel_size_edit", {"type": 'R', "value": 'PRESS', "shift": True}, None),
|
||||
("object.quadriflow_remesh", {"type": 'R', "value": 'PRESS', "ctrl": True, "alt": True}, None),
|
||||
# Brush properties
|
||||
("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
|
||||
("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("scalar", 0.9)]}),
|
||||
("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
|
||||
("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("scalar", 1.0 / 0.9)]}),
|
||||
*_template_paint_radial_control("sculpt", rotation=True),
|
||||
# Stencil
|
||||
@@ -3469,8 +3473,8 @@ def km_mesh(params):
|
||||
("mesh.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'SELECT')]}),
|
||||
("mesh.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True, "shift": True}, {"properties": [("action", 'DESELECT')]}),
|
||||
("mesh.select_all", {"type": 'I', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'INVERT')]}),
|
||||
("mesh.select_more", {"type": 'UP_ARROW', "value": 'PRESS'}, None),
|
||||
("mesh.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS'}, None),
|
||||
("mesh.select_more", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, None),
|
||||
("mesh.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, None),
|
||||
("mesh.select_linked", {"type": 'RIGHT_BRACKET', "value": 'PRESS'}, None),
|
||||
|
||||
*_template_items_editmode_mesh_select_mode(params),
|
||||
@@ -3537,8 +3541,8 @@ def km_armature(params):
|
||||
("armature.select_hierarchy", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True},
|
||||
{"properties": [("direction", 'CHILD'), ("extend", True)]}),
|
||||
|
||||
("armature.select_more", {"type": 'UP_ARROW', "value": 'PRESS'}, None),
|
||||
("armature.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS'}, None),
|
||||
("armature.select_more", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, None),
|
||||
("armature.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, None),
|
||||
|
||||
("armature.select_similar", {"type": 'G', "value": 'PRESS', "shift": True}, None),
|
||||
("armature.select_linked_pick", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
|
||||
@@ -3610,8 +3614,8 @@ def km_lattice(params):
|
||||
("lattice.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'SELECT')]}),
|
||||
("lattice.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True, "shift": True}, {"properties": [("action", 'DESELECT')]}),
|
||||
("lattice.select_all", {"type": 'I', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'INVERT')]}),
|
||||
("lattice.select_more", {"type": 'UP_ARROW', "value": 'PRESS'}, None),
|
||||
("lattice.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS'}, None),
|
||||
("lattice.select_more", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, None),
|
||||
("lattice.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, None),
|
||||
("object.vertex_parent_set", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
|
||||
*_template_items_context_menu("VIEW3D_MT_edit_lattice_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}),
|
||||
("wm.context_toggle", {"type": 'B', "value": 'PRESS'},
|
||||
@@ -3641,8 +3645,8 @@ def km_particle(params):
|
||||
("particle.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'SELECT')]}),
|
||||
("particle.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True, "shift": True}, {"properties": [("action", 'DESELECT')]}),
|
||||
("particle.select_all", {"type": 'I', "value": 'PRESS', "ctrl": True}, {"properties": [("action", 'INVERT')]}),
|
||||
("particle.select_more", {"type": 'UP_ARROW', "value": 'PRESS'}, None),
|
||||
("particle.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS'}, None),
|
||||
("particle.select_more", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True}, None),
|
||||
("particle.select_less", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True}, None),
|
||||
("particle.select_linked_pick", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
|
||||
{"properties": [("deselect", False)]}),
|
||||
("particle.select_linked_pick", {"type": 'RIGHT_BRACKET', "value": 'PRESS', "shift": True},
|
||||
@@ -3687,63 +3691,63 @@ def km_font(params):
|
||||
{"properties": [("style", 'UNDERLINE')]}),
|
||||
("font.style_toggle", {"type": 'P', "value": 'PRESS', "ctrl": True},
|
||||
{"properties": [("style", 'SMALL_CAPS')]}),
|
||||
("font.delete", {"type": 'DEL', "value": 'PRESS'},
|
||||
("font.delete", {"type": 'DEL', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("type", 'NEXT_OR_SELECTION')]}),
|
||||
("font.delete", {"type": 'DEL', "value": 'PRESS', "ctrl": True},
|
||||
("font.delete", {"type": 'DEL', "value": 'PRESS', "ctrl": True, "repeat": True},
|
||||
{"properties": [("type", 'NEXT_WORD')]}),
|
||||
("font.delete", {"type": 'BACK_SPACE', "value": 'PRESS'},
|
||||
("font.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_OR_SELECTION')]}),
|
||||
("font.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True},
|
||||
("font.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_OR_SELECTION')]}),
|
||||
("font.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "ctrl": True},
|
||||
("font.delete", {"type": 'BACK_SPACE', "value": 'PRESS', "ctrl": True, "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_WORD')]}),
|
||||
("font.move", {"type": 'HOME', "value": 'PRESS'},
|
||||
{"properties": [("type", 'LINE_BEGIN')]}),
|
||||
("font.move", {"type": 'END', "value": 'PRESS'},
|
||||
{"properties": [("type", 'LINE_END')]}),
|
||||
("font.move", {"type": 'LEFT_ARROW', "value": 'PRESS'},
|
||||
("font.move", {"type": 'LEFT_ARROW', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_CHARACTER')]}),
|
||||
("font.move", {"type": 'RIGHT_ARROW', "value": 'PRESS'},
|
||||
("font.move", {"type": 'RIGHT_ARROW', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("type", 'NEXT_CHARACTER')]}),
|
||||
("font.move", {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True},
|
||||
("font.move", {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True, "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_WORD')]}),
|
||||
("font.move", {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True},
|
||||
("font.move", {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True, "repeat": True},
|
||||
{"properties": [("type", 'NEXT_WORD')]}),
|
||||
("font.move", {"type": 'UP_ARROW', "value": 'PRESS'},
|
||||
("font.move", {"type": 'UP_ARROW', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_LINE')]}),
|
||||
("font.move", {"type": 'DOWN_ARROW', "value": 'PRESS'},
|
||||
("font.move", {"type": 'DOWN_ARROW', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("type", 'NEXT_LINE')]}),
|
||||
("font.move", {"type": 'PAGE_UP', "value": 'PRESS'},
|
||||
("font.move", {"type": 'PAGE_UP', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_PAGE')]}),
|
||||
("font.move", {"type": 'PAGE_DOWN', "value": 'PRESS'},
|
||||
("font.move", {"type": 'PAGE_DOWN', "value": 'PRESS', "repeat": True},
|
||||
{"properties": [("type", 'NEXT_PAGE')]}),
|
||||
("font.move_select", {"type": 'HOME', "value": 'PRESS', "shift": True},
|
||||
{"properties": [("type", 'LINE_BEGIN')]}),
|
||||
("font.move_select", {"type": 'END', "value": 'PRESS', "shift": True},
|
||||
{"properties": [("type", 'LINE_END')]}),
|
||||
("font.move_select", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True},
|
||||
("font.move_select", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_CHARACTER')]}),
|
||||
("font.move_select", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True},
|
||||
("font.move_select", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("type", 'NEXT_CHARACTER')]}),
|
||||
("font.move_select", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
|
||||
("font.move_select", {"type": 'LEFT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_WORD')]}),
|
||||
("font.move_select", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True},
|
||||
("font.move_select", {"type": 'RIGHT_ARROW', "value": 'PRESS', "shift": True, "ctrl": True, "repeat": True},
|
||||
{"properties": [("type", 'NEXT_WORD')]}),
|
||||
("font.move_select", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True},
|
||||
("font.move_select", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_LINE')]}),
|
||||
("font.move_select", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True},
|
||||
("font.move_select", {"type": 'DOWN_ARROW', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("type", 'NEXT_LINE')]}),
|
||||
("font.move_select", {"type": 'PAGE_UP', "value": 'PRESS', "shift": True},
|
||||
("font.move_select", {"type": 'PAGE_UP', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("type", 'PREVIOUS_PAGE')]}),
|
||||
("font.move_select", {"type": 'PAGE_DOWN', "value": 'PRESS', "shift": True},
|
||||
("font.move_select", {"type": 'PAGE_DOWN', "value": 'PRESS', "shift": True, "repeat": True},
|
||||
{"properties": [("type", 'NEXT_PAGE')]}),
|
||||
("font.change_spacing", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True},
|
||||
("font.change_spacing", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True, "repeat": True},
|
||||
{"properties": [("delta", -1)]}),
|
||||
("font.change_spacing", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True},
|
||||
("font.change_spacing", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True, "repeat": True},
|
||||
{"properties": [("delta", 1)]}),
|
||||
("font.change_character", {"type": 'UP_ARROW', "value": 'PRESS', "alt": True},
|
||||
("font.change_character", {"type": 'UP_ARROW', "value": 'PRESS', "alt": True, "repeat": True},
|
||||
{"properties": [("delta", 1)]}),
|
||||
("font.change_character", {"type": 'DOWN_ARROW', "value": 'PRESS', "alt": True},
|
||||
("font.change_character", {"type": 'DOWN_ARROW', "value": 'PRESS', "alt": True, "repeat": True},
|
||||
{"properties": [("delta", -1)]}),
|
||||
("font.select_all", {"type": 'A', "value": 'PRESS', "ctrl": True}, None),
|
||||
("font.text_copy", {"type": 'C', "value": 'PRESS', "ctrl": True}, None),
|
||||
@@ -3918,10 +3922,10 @@ def km_transform_modal_map(_params):
|
||||
("ADD_SNAP", {"type": 'A', "value": 'PRESS'}, None),
|
||||
("ADD_SNAP", {"type": 'A', "value": 'PRESS', "ctrl": True}, None),
|
||||
("REMOVE_SNAP", {"type": 'A', "value": 'PRESS', "alt": True}, None),
|
||||
("PROPORTIONAL_SIZE_UP", {"type": 'PAGE_UP', "value": 'PRESS'}, None),
|
||||
("PROPORTIONAL_SIZE_DOWN", {"type": 'PAGE_DOWN', "value": 'PRESS'}, None),
|
||||
("PROPORTIONAL_SIZE_UP", {"type": 'PAGE_UP', "value": 'PRESS', "shift": True}, None),
|
||||
("PROPORTIONAL_SIZE_DOWN", {"type": 'PAGE_DOWN', "value": 'PRESS', "shift": True}, None),
|
||||
("PROPORTIONAL_SIZE_UP", {"type": 'PAGE_UP', "value": 'PRESS', "repeat": True}, None),
|
||||
("PROPORTIONAL_SIZE_DOWN", {"type": 'PAGE_DOWN', "value": 'PRESS', "repeat": True}, None),
|
||||
("PROPORTIONAL_SIZE_UP", {"type": 'PAGE_UP', "value": 'PRESS', "shift": True, "repeat": True}, None),
|
||||
("PROPORTIONAL_SIZE_DOWN", {"type": 'PAGE_DOWN', "value": 'PRESS', "shift": True, "repeat": True}, None),
|
||||
("PROPORTIONAL_SIZE_UP", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'}, None),
|
||||
("PROPORTIONAL_SIZE_DOWN", {"type": 'WHEELUPMOUSE', "value": 'PRESS'}, None),
|
||||
("PROPORTIONAL_SIZE_UP", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True}, None),
|
||||
@@ -3929,10 +3933,10 @@ def km_transform_modal_map(_params):
|
||||
("PROPORTIONAL_SIZE", {"type": 'TRACKPADPAN', "value": 'ANY'}, None),
|
||||
("EDGESLIDE_EDGE_NEXT", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "alt": True}, None),
|
||||
("EDGESLIDE_PREV_NEXT", {"type": 'WHEELUPMOUSE', "value": 'PRESS', "alt": True}, None),
|
||||
("AUTOIK_CHAIN_LEN_UP", {"type": 'PAGE_UP', "value": 'PRESS'}, None),
|
||||
("AUTOIK_CHAIN_LEN_DOWN", {"type": 'PAGE_DOWN', "value": 'PRESS'}, None),
|
||||
("AUTOIK_CHAIN_LEN_UP", {"type": 'PAGE_UP', "value": 'PRESS', "shift": True}, None),
|
||||
("AUTOIK_CHAIN_LEN_DOWN", {"type": 'PAGE_DOWN', "value": 'PRESS', "shift": True}, None),
|
||||
("AUTOIK_CHAIN_LEN_UP", {"type": 'PAGE_UP', "value": 'PRESS', "repeat": True}, None),
|
||||
("AUTOIK_CHAIN_LEN_DOWN", {"type": 'PAGE_DOWN', "value": 'PRESS', "repeat": True}, None),
|
||||
("AUTOIK_CHAIN_LEN_UP", {"type": 'PAGE_UP', "value": 'PRESS', "shift": True, "repeat": True}, None),
|
||||
("AUTOIK_CHAIN_LEN_DOWN", {"type": 'PAGE_DOWN', "value": 'PRESS', "shift": True, "repeat": True}, None),
|
||||
("AUTOIK_CHAIN_LEN_UP", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS'}, None),
|
||||
("AUTOIK_CHAIN_LEN_DOWN", {"type": 'WHEELUPMOUSE', "value": 'PRESS'}, None),
|
||||
("AUTOIK_CHAIN_LEN_UP", {"type": 'WHEELDOWNMOUSE', "value": 'PRESS', "shift": True}, None),
|
||||
|
@@ -31,6 +31,7 @@ _modules = [
|
||||
"console",
|
||||
"constraint",
|
||||
"file",
|
||||
"geometry_nodes",
|
||||
"image",
|
||||
"mesh",
|
||||
"node",
|
||||
@@ -42,13 +43,11 @@ _modules = [
|
||||
"rigidbody",
|
||||
"screen_play_rendered_anim",
|
||||
"sequencer",
|
||||
"simulation",
|
||||
"userpref",
|
||||
"uvcalc_follow_active",
|
||||
"uvcalc_lightmap",
|
||||
"vertexpaint_dirt",
|
||||
"view3d",
|
||||
"gpencil_mesh_bake",
|
||||
"wm",
|
||||
]
|
||||
|
||||
|
@@ -19,23 +19,30 @@
|
||||
import bpy
|
||||
|
||||
|
||||
class NewSimulation(bpy.types.Operator):
|
||||
"""Create a new simulation data block and edit it in the opened simulation editor"""
|
||||
class NewGeometryNodeTree(bpy.types.Operator):
|
||||
"""Create a new geometry node tree"""
|
||||
|
||||
bl_idname = "simulation.new"
|
||||
bl_label = "New Simulation"
|
||||
bl_idname = "node.new_geometry_node_tree"
|
||||
bl_label = "New Geometry Node Tree"
|
||||
bl_options = {'REGISTER', 'UNDO'}
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
return context.area.type == 'NODE_EDITOR' and context.space_data.tree_type == 'SimulationNodeTree'
|
||||
return context.area.type == 'NODE_EDITOR' and context.space_data.tree_type == 'GeometryNodeTree'
|
||||
|
||||
def execute(self, context):
|
||||
simulation = bpy.data.simulations.new("Simulation")
|
||||
context.space_data.simulation = simulation
|
||||
group = bpy.data.node_groups.new("Geometry Node Group", 'GeometryNodeTree')
|
||||
group.inputs.new('NodeSocketGeometry', "Geometry")
|
||||
group.outputs.new('NodeSocketGeometry', "Geometry")
|
||||
input_node = group.nodes.new('NodeGroupInput')
|
||||
output_node = group.nodes.new('NodeGroupOutput')
|
||||
|
||||
input_node.location.x = -200 - input_node.width
|
||||
output_node.location.x = 200
|
||||
context.space_data.node_tree = group
|
||||
return {'FINISHED'}
|
||||
|
||||
|
||||
classes = (
|
||||
NewSimulation,
|
||||
NewGeometryNodeTree,
|
||||
)
|
@@ -1,157 +0,0 @@
|
||||
# ##### BEGIN GPL LICENSE BLOCK #####
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# ##### END GPL LICENSE BLOCK #####
|
||||
|
||||
# <pep8-80 compliant>
|
||||
|
||||
import bpy
|
||||
from bpy.types import Operator
|
||||
from bpy.props import (
|
||||
IntProperty,
|
||||
FloatProperty,
|
||||
BoolProperty,
|
||||
EnumProperty,
|
||||
)
|
||||
|
||||
gp_object_items = []
|
||||
|
||||
|
||||
def my_objlist_callback(scene, context):
|
||||
gp_object_items.clear()
|
||||
gp_object_items.append(('*NEW', "New Object", ""))
|
||||
for o in context.scene.objects:
|
||||
if o.type == 'GPENCIL':
|
||||
gp_object_items.append((o.name, o.name, ""))
|
||||
|
||||
return gp_object_items
|
||||
|
||||
|
||||
class GPENCIL_OT_mesh_bake(Operator):
|
||||
"""Bake all mesh animation into grease pencil strokes"""
|
||||
bl_idname = "gpencil.mesh_bake"
|
||||
bl_label = "Bake Mesh to Grease Pencil"
|
||||
bl_options = {'REGISTER', 'UNDO'}
|
||||
|
||||
frame_start: IntProperty(
|
||||
name="Start Frame",
|
||||
description="Start frame for baking",
|
||||
min=0, max=300000,
|
||||
default=1,
|
||||
)
|
||||
frame_end: IntProperty(
|
||||
name="End Frame",
|
||||
description="End frame for baking",
|
||||
min=1, max=300000,
|
||||
default=250,
|
||||
)
|
||||
step: IntProperty(
|
||||
name="Frame Step",
|
||||
description="Frame Step",
|
||||
min=1, max=120,
|
||||
default=1,
|
||||
)
|
||||
thickness: IntProperty(
|
||||
name="Thickness",
|
||||
description="Thickness of the stroke lines",
|
||||
min=1, max=100,
|
||||
default=1,
|
||||
)
|
||||
angle: FloatProperty(
|
||||
name="Threshold Angle",
|
||||
description="Threshold to determine ends of the strokes",
|
||||
min=0,
|
||||
max=+3.141592,
|
||||
default=+1.22173, # 70 Degress
|
||||
subtype='ANGLE',
|
||||
)
|
||||
offset: FloatProperty(
|
||||
name="Stroke Offset",
|
||||
description="Offset strokes from fill",
|
||||
soft_min=0.0, soft_max=100.0,
|
||||
min=0.0, max=100.0,
|
||||
default=0.001,
|
||||
precision=3,
|
||||
step=1,
|
||||
subtype='DISTANCE',
|
||||
unit='LENGTH',
|
||||
)
|
||||
seams: BoolProperty(
|
||||
name="Only Seam Edges",
|
||||
description="Convert only seam edges",
|
||||
default=False,
|
||||
)
|
||||
faces: BoolProperty(
|
||||
name="Export Faces",
|
||||
description="Export faces as filled strokes",
|
||||
default=True,
|
||||
)
|
||||
target: EnumProperty(
|
||||
name="Target Object",
|
||||
description="Grease Pencil Object",
|
||||
items=my_objlist_callback
|
||||
)
|
||||
frame_target: IntProperty(
|
||||
name="Target Frame",
|
||||
description="Destination frame for the baked animation",
|
||||
min=1, max=300000,
|
||||
default=1,
|
||||
)
|
||||
project_type: EnumProperty(
|
||||
name="Reproject Type",
|
||||
description="Type of projection",
|
||||
items=(
|
||||
("KEEP", "No Reproject", ""),
|
||||
("FRONT", "Front", "Reproject the strokes using the X-Z plane"),
|
||||
("SIDE", "Side", "Reproject the strokes using the Y-Z plane"),
|
||||
("TOP", "Top", "Reproject the strokes using the X-Y plane"),
|
||||
("VIEW", "View", "Reproject the strokes to current viewpoint"),
|
||||
("CURSOR", "Cursor", "Reproject the strokes using the orientation of 3D cursor")
|
||||
)
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def poll(self, context):
|
||||
ob = context.active_object
|
||||
return ((ob is not None) and
|
||||
(ob.type in {'EMPTY', 'MESH'}) and
|
||||
(context.mode == 'OBJECT'))
|
||||
|
||||
def execute(self, context):
|
||||
bpy.ops.gpencil.bake_mesh_animation(
|
||||
frame_start=self.frame_start,
|
||||
frame_end=self.frame_end,
|
||||
step=self.step,
|
||||
angle=self.angle,
|
||||
thickness=self.thickness,
|
||||
seams=self.seams,
|
||||
faces=self.faces,
|
||||
offset=self.offset,
|
||||
target=self.target,
|
||||
frame_target=self.frame_target,
|
||||
project_type=self.project_type
|
||||
)
|
||||
|
||||
return {'FINISHED'}
|
||||
|
||||
def invoke(self, context, _event):
|
||||
wm = context.window_manager
|
||||
return wm.invoke_props_dialog(self)
|
||||
|
||||
|
||||
classes = (
|
||||
GPENCIL_OT_mesh_bake,
|
||||
)
|
@@ -40,7 +40,7 @@ class RENDER_PT_freestyle(RenderFreestyleButtonsPanel, Panel):
|
||||
bl_label = "Freestyle"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
bl_order = 10
|
||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_WORKBENCH'}
|
||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE'}
|
||||
|
||||
def draw_header(self, context):
|
||||
rd = context.scene.render
|
||||
@@ -113,7 +113,7 @@ class RENDER_MT_lineset_context_menu(Menu):
|
||||
|
||||
class VIEWLAYER_PT_freestyle(ViewLayerFreestyleButtonsPanel, Panel):
|
||||
bl_label = "Freestyle"
|
||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_WORKBENCH'}
|
||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE'}
|
||||
|
||||
def draw_header(self, context):
|
||||
view_layer = context.view_layer
|
||||
@@ -178,7 +178,7 @@ class VIEWLAYER_PT_freestyle(ViewLayerFreestyleButtonsPanel, Panel):
|
||||
|
||||
class VIEWLAYER_PT_freestyle_lineset(ViewLayerFreestyleEditorButtonsPanel, Panel):
|
||||
bl_label = "Freestyle Line Set"
|
||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_WORKBENCH'}
|
||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE'}
|
||||
|
||||
def draw_edge_type_buttons(self, box, lineset, edge_type):
|
||||
# property names
|
||||
@@ -277,7 +277,7 @@ class VIEWLAYER_PT_freestyle_lineset(ViewLayerFreestyleEditorButtonsPanel, Panel
|
||||
class VIEWLAYER_PT_freestyle_linestyle(ViewLayerFreestyleEditorButtonsPanel, Panel):
|
||||
bl_label = "Freestyle Line Style"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_WORKBENCH'}
|
||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE'}
|
||||
|
||||
def draw_modifier_box_header(self, box, modifier):
|
||||
row = box.row()
|
||||
@@ -833,7 +833,7 @@ class MaterialFreestyleButtonsPanel:
|
||||
class MATERIAL_PT_freestyle_line(MaterialFreestyleButtonsPanel, Panel):
|
||||
bl_label = "Freestyle Line"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_WORKBENCH'}
|
||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE'}
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
@@ -698,6 +698,7 @@ def brush_settings(layout, context, brush, popover=False):
|
||||
|
||||
elif sculpt_tool == 'GRAB':
|
||||
layout.prop(brush, "use_grab_active_vertex")
|
||||
layout.prop(brush, "use_grab_silhouette")
|
||||
|
||||
elif sculpt_tool == 'PAINT':
|
||||
row = layout.row(align=True)
|
||||
|
@@ -668,10 +668,10 @@ class DOPESHEET_MT_snap_pie(Menu):
|
||||
layout = self.layout
|
||||
pie = layout.menu_pie()
|
||||
|
||||
pie.operator("action.snap", text="Selection to Current Frame").type = 'CFRA'
|
||||
pie.operator("action.snap", text="Selection to Nearest Frame").type = 'NEAREST_FRAME'
|
||||
pie.operator("action.snap", text="Selection to Nearest Second").type = 'NEAREST_SECOND'
|
||||
pie.operator("action.snap", text="Selection to Nearest Marker").type = 'NEAREST_MARKER'
|
||||
pie.operator("action.snap", text="Current Frame").type = 'CFRA'
|
||||
pie.operator("action.snap", text="Nearest Frame").type = 'NEAREST_FRAME'
|
||||
pie.operator("action.snap", text="Nearest Second").type = 'NEAREST_SECOND'
|
||||
pie.operator("action.snap", text="Nearest Marker").type = 'NEAREST_MARKER'
|
||||
|
||||
|
||||
class LayersDopeSheetPanel:
|
||||
|
@@ -241,10 +241,10 @@ class NLA_MT_snap_pie(Menu):
|
||||
layout = self.layout
|
||||
pie = layout.menu_pie()
|
||||
|
||||
pie.operator("nla.snap", text="Selection to Current Frame").type = 'CFRA'
|
||||
pie.operator("nla.snap", text="Selection to Nearest Frame").type = 'NEAREST_FRAME'
|
||||
pie.operator("nla.snap", text="Selection to Nearest Second").type = 'NEAREST_SECOND'
|
||||
pie.operator("nla.snap", text="Selection to Nearest Marker").type = 'NEAREST_MARKER'
|
||||
pie.operator("nla.snap", text="Current Frame").type = 'CFRA'
|
||||
pie.operator("nla.snap", text="Nearest Frame").type = 'NEAREST_FRAME'
|
||||
pie.operator("nla.snap", text="Nearest Second").type = 'NEAREST_SECOND'
|
||||
pie.operator("nla.snap", text="Nearest Marker").type = 'NEAREST_MARKER'
|
||||
|
||||
|
||||
class NLA_MT_context_menu(Menu):
|
||||
|
@@ -151,13 +151,10 @@ class NODE_HT_header(Header):
|
||||
if snode_id:
|
||||
layout.prop(snode_id, "use_nodes")
|
||||
|
||||
elif snode.tree_type == 'SimulationNodeTree':
|
||||
row = layout.row(align=True)
|
||||
row.prop(snode, "simulation", text="")
|
||||
row.operator("simulation.new", text="", icon='ADD')
|
||||
simulation = snode.simulation
|
||||
if simulation:
|
||||
row.prop(snode.simulation, "use_fake_user", text="")
|
||||
elif snode.tree_type == 'GeometryNodeTree':
|
||||
NODE_MT_editor_menus.draw_collapsible(context, layout)
|
||||
layout.separator_spacer()
|
||||
layout.template_ID(snode, "node_tree", new="node.new_geometry_node_tree")
|
||||
|
||||
else:
|
||||
# Custom node tree is edited as independent ID block
|
||||
|
@@ -370,7 +370,7 @@ class OUTLINER_PT_filter(Panel):
|
||||
col = layout.column(align=True)
|
||||
|
||||
row = col.row()
|
||||
row.label(icon='OUTLINER_COLLECTION')
|
||||
row.label(icon='GROUP')
|
||||
row.prop(space, "use_filter_collection", text="Collections")
|
||||
row = col.row()
|
||||
row.label(icon='OBJECT_DATAMODE')
|
||||
|
@@ -1814,6 +1814,11 @@ class _defs_gpencil_paint:
|
||||
|
||||
@ToolDef.from_fn
|
||||
def cutter():
|
||||
def draw_settings(context, layout, tool):
|
||||
props = tool.operator_properties("gpencil.stroke_cutter")
|
||||
row = layout.row()
|
||||
row.use_property_split = False
|
||||
row.prop(props, "flat_caps")
|
||||
return dict(
|
||||
idname="builtin.cutter",
|
||||
label="Cutter",
|
||||
@@ -1821,6 +1826,7 @@ class _defs_gpencil_paint:
|
||||
cursor='KNIFE',
|
||||
widget=None,
|
||||
keymap=(),
|
||||
draw_settings=draw_settings,
|
||||
)
|
||||
|
||||
@ToolDef.from_fn
|
||||
@@ -2558,8 +2564,8 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel):
|
||||
'OBJECT': [
|
||||
*_tools_default,
|
||||
|
||||
# None,
|
||||
# _tools_view3d_add,
|
||||
None,
|
||||
_tools_view3d_add,
|
||||
],
|
||||
'POSE': [
|
||||
*_tools_default,
|
||||
@@ -2587,8 +2593,8 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel):
|
||||
],
|
||||
'EDIT_MESH': [
|
||||
*_tools_default,
|
||||
# None,
|
||||
# _tools_view3d_add,
|
||||
None,
|
||||
_tools_view3d_add,
|
||||
None,
|
||||
(
|
||||
_defs_edit_mesh.extrude,
|
||||
|
@@ -45,8 +45,7 @@ class USERPREF_HT_header(Header):
|
||||
# Show '*' to let users know the preferences have been modified.
|
||||
layout.operator(
|
||||
"wm.save_userpref",
|
||||
text=iface_("Save Preferences") + (" *" if prefs.is_dirty else ""),
|
||||
translate=False,
|
||||
text="Save Preferences" + (" *" if prefs.is_dirty else ""),
|
||||
)
|
||||
|
||||
def draw(self, context):
|
||||
@@ -575,12 +574,6 @@ class USERPREF_PT_system_sound(SystemPanel, CenterAlignMixIn, Panel):
|
||||
class USERPREF_PT_system_cycles_devices(SystemPanel, CenterAlignMixIn, Panel):
|
||||
bl_label = "Cycles Render Devices"
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
# No GPU rendering on macOS currently.
|
||||
import sys
|
||||
return bpy.app.build_options.cycles and sys.platform != "darwin"
|
||||
|
||||
def draw_centered(self, context, layout):
|
||||
prefs = context.preferences
|
||||
|
||||
|
@@ -2292,7 +2292,7 @@ class VIEW3D_MT_object_animation(Menu):
|
||||
layout.separator()
|
||||
|
||||
layout.operator("nla.bake", text="Bake Action...")
|
||||
layout.operator("gpencil.mesh_bake", text="Bake Mesh to Grease Pencil...")
|
||||
layout.operator("gpencil.bake_mesh_animation", text="Bake Mesh to Grease Pencil...")
|
||||
|
||||
|
||||
class VIEW3D_MT_object_rigid_body(Menu):
|
||||
|
@@ -58,11 +58,11 @@ class TextureNodeCategory(SortedNodeCategory):
|
||||
context.space_data.tree_type == 'TextureNodeTree')
|
||||
|
||||
|
||||
class SimulationNodeCategory(SortedNodeCategory):
|
||||
class GeometryNodeCategory(SortedNodeCategory):
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
return (context.space_data.type == 'NODE_EDITOR' and
|
||||
context.space_data.tree_type == 'SimulationNodeTree')
|
||||
context.space_data.tree_type == 'GeometryNodeTree')
|
||||
|
||||
|
||||
# menu entry for node group tools
|
||||
@@ -77,11 +77,11 @@ node_tree_group_type = {
|
||||
'CompositorNodeTree': 'CompositorNodeGroup',
|
||||
'ShaderNodeTree': 'ShaderNodeGroup',
|
||||
'TextureNodeTree': 'TextureNodeGroup',
|
||||
'SimulationNodeTree': 'SimulationNodeGroup',
|
||||
'GeometryNodeTree': 'GeometryNodeGroup',
|
||||
}
|
||||
|
||||
|
||||
# generic node group items generator for shader, compositor, simulation and texture node groups
|
||||
# generic node group items generator for shader, compositor, geometry and texture node groups
|
||||
def node_group_items(context):
|
||||
if context is None:
|
||||
return
|
||||
@@ -483,10 +483,32 @@ def not_implemented_node(idname):
|
||||
return NodeItem(idname, label=label)
|
||||
|
||||
|
||||
simulation_node_categories = [
|
||||
# Simulation Nodes
|
||||
SimulationNodeCategory("SIM_GROUP", "Group", items=node_group_items),
|
||||
SimulationNodeCategory("SIM_LAYOUT", "Layout", items=[
|
||||
geometry_node_categories = [
|
||||
# Geometry Nodes
|
||||
GeometryNodeCategory("GEO_MESH", "Mesh", items=[
|
||||
NodeItem("GeometryNodeTriangulate"),
|
||||
NodeItem("GeometryNodeEdgeSplit"),
|
||||
NodeItem("GeometryNodeTransform"),
|
||||
]),
|
||||
GeometryNodeCategory("GEO_MATH", "Misc", items=[
|
||||
NodeItem("ShaderNodeMapRange"),
|
||||
NodeItem("ShaderNodeClamp"),
|
||||
NodeItem("ShaderNodeMath"),
|
||||
NodeItem("ShaderNodeValToRGB"),
|
||||
NodeItem("ShaderNodeVectorMath"),
|
||||
NodeItem("ShaderNodeSeparateRGB"),
|
||||
NodeItem("ShaderNodeCombineRGB"),
|
||||
NodeItem("ShaderNodeSeparateXYZ"),
|
||||
NodeItem("ShaderNodeCombineXYZ"),
|
||||
NodeItem("FunctionNodeBooleanMath"),
|
||||
NodeItem("FunctionNodeFloatCompare"),
|
||||
NodeItem("FunctionNodeCombineStrings"),
|
||||
NodeItem("FunctionNodeRandomFloat"),
|
||||
NodeItem("ShaderNodeValue"),
|
||||
NodeItem("FunctionNodeGroupInstanceID"),
|
||||
]),
|
||||
GeometryNodeCategory("GEO_GROUP", "Group", items=node_group_items),
|
||||
GeometryNodeCategory("GEO_LAYOUT", "Layout", items=[
|
||||
NodeItem("NodeFrame"),
|
||||
NodeItem("NodeReroute"),
|
||||
]),
|
||||
@@ -497,14 +519,14 @@ def register():
|
||||
nodeitems_utils.register_node_categories('SHADER', shader_node_categories)
|
||||
nodeitems_utils.register_node_categories('COMPOSITING', compositor_node_categories)
|
||||
nodeitems_utils.register_node_categories('TEXTURE', texture_node_categories)
|
||||
nodeitems_utils.register_node_categories('SIMULATION', simulation_node_categories)
|
||||
nodeitems_utils.register_node_categories('GEOMETRY', geometry_node_categories)
|
||||
|
||||
|
||||
def unregister():
|
||||
nodeitems_utils.unregister_node_categories('SHADER')
|
||||
nodeitems_utils.unregister_node_categories('COMPOSITING')
|
||||
nodeitems_utils.unregister_node_categories('TEXTURE')
|
||||
nodeitems_utils.unregister_node_categories('SIMULATION')
|
||||
nodeitems_utils.unregister_node_categories('GEOMETRY')
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
@@ -5,7 +5,7 @@
|
||||
<DisplayName>Blender[LTSORNOT]</DisplayName>
|
||||
<PublisherDisplayName>Blender Foundation</PublisherDisplayName>
|
||||
<Description>Blender [VERSION] is the Free and Open Source 3D creation suite</Description>
|
||||
<Logo>Assets\StoreLogo.scale-100.png</Logo>
|
||||
<Logo>Assets\StoreLogo.png</Logo>
|
||||
</Properties>
|
||||
<Resources>
|
||||
<Resource Language="en-us" />
|
||||
|
BIN
release/windows/msix/Assets/Square150x150Logo.png
Normal file
After Width: | Height: | Size: 8.7 KiB |
Before Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 5.1 KiB |
Before Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 8.9 KiB |
Before Width: | Height: | Size: 20 KiB |
BIN
release/windows/msix/Assets/Square310x310Logo.png
Normal file
After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 9.2 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 604 B |
Before Width: | Height: | Size: 918 B |
Before Width: | Height: | Size: 7.8 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 604 B |
Before Width: | Height: | Size: 7.8 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.7 KiB |
BIN
release/windows/msix/Assets/Square44x44Logo.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 604 B |