Merge branch 'master' into sculpt-dev
This commit is contained in:
commit
6f5535e56c
|
@ -205,6 +205,7 @@ ForEachMacros:
|
|||
- FOREACH_SCENE_COLLECTION_BEGIN
|
||||
- FOREACH_SCENE_OBJECT_BEGIN
|
||||
- FOREACH_SELECTED_BASE_BEGIN
|
||||
- FOREACH_SELECTED_BEZT_BEGIN
|
||||
- FOREACH_SELECTED_EDITABLE_OBJECT_BEGIN
|
||||
- FOREACH_SELECTED_OBJECT_BEGIN
|
||||
- FOREACH_TRANS_DATA_CONTAINER
|
||||
|
@ -269,6 +270,7 @@ ForEachMacros:
|
|||
StatementMacros:
|
||||
- PyObject_HEAD
|
||||
- PyObject_VAR_HEAD
|
||||
- ccl_gpu_kernel_postfix
|
||||
|
||||
MacroBlockBegin: "^BSDF_CLOSURE_CLASS_BEGIN$"
|
||||
MacroBlockEnd: "^BSDF_CLOSURE_CLASS_END$"
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -401,7 +401,7 @@ if(WITH_CODEC_FFMPEG)
|
|||
${LIBDIR}/ffmpeg/include/msvc
|
||||
)
|
||||
windows_find_package(FFmpeg)
|
||||
if(NOT FFMPEG_FOUND)
|
||||
if(NOT FFmpeg_FOUND)
|
||||
warn_hardcoded_paths(FFmpeg)
|
||||
set(FFMPEG_LIBRARIES
|
||||
${LIBDIR}/ffmpeg/lib/avcodec.lib
|
||||
|
@ -415,7 +415,7 @@ endif()
|
|||
|
||||
if(WITH_IMAGE_OPENEXR)
|
||||
windows_find_package(OpenEXR REQUIRED)
|
||||
if(NOT OPENEXR_FOUND)
|
||||
if(NOT OpenEXR_FOUND)
|
||||
set(OPENEXR_ROOT_DIR ${LIBDIR}/openexr)
|
||||
set(OPENEXR_VERSION "2.1")
|
||||
warn_hardcoded_paths(OpenEXR)
|
||||
|
@ -531,17 +531,20 @@ if(WITH_BOOST)
|
|||
set(BOOST_LIBRARIES ${Boost_LIBRARIES})
|
||||
set(BOOST_LIBPATH ${Boost_LIBRARY_DIRS})
|
||||
endif()
|
||||
|
||||
set(BOOST_DEFINITIONS "-DBOOST_ALL_NO_LIB")
|
||||
endif()
|
||||
|
||||
if(WITH_OPENIMAGEIO)
|
||||
windows_find_package(OpenImageIO)
|
||||
set(OPENIMAGEIO ${LIBDIR}/OpenImageIO)
|
||||
set(OPENIMAGEIO_LIBPATH ${OPENIMAGEIO}/lib)
|
||||
set(OPENIMAGEIO_INCLUDE_DIRS ${OPENIMAGEIO}/include)
|
||||
set(OIIO_OPTIMIZED optimized ${OPENIMAGEIO_LIBPATH}/OpenImageIO.lib optimized ${OPENIMAGEIO_LIBPATH}/OpenImageIO_Util.lib)
|
||||
set(OIIO_DEBUG debug ${OPENIMAGEIO_LIBPATH}/OpenImageIO_d.lib debug ${OPENIMAGEIO_LIBPATH}/OpenImageIO_Util_d.lib)
|
||||
set(OPENIMAGEIO_LIBRARIES ${OIIO_OPTIMIZED} ${OIIO_DEBUG})
|
||||
if(NOT OpenImageIO_FOUND)
|
||||
set(OPENIMAGEIO ${LIBDIR}/OpenImageIO)
|
||||
set(OPENIMAGEIO_LIBPATH ${OPENIMAGEIO}/lib)
|
||||
set(OPENIMAGEIO_INCLUDE_DIRS ${OPENIMAGEIO}/include)
|
||||
set(OIIO_OPTIMIZED optimized ${OPENIMAGEIO_LIBPATH}/OpenImageIO.lib optimized ${OPENIMAGEIO_LIBPATH}/OpenImageIO_Util.lib)
|
||||
set(OIIO_DEBUG debug ${OPENIMAGEIO_LIBPATH}/OpenImageIO_d.lib debug ${OPENIMAGEIO_LIBPATH}/OpenImageIO_Util_d.lib)
|
||||
set(OPENIMAGEIO_LIBRARIES ${OIIO_OPTIMIZED} ${OIIO_DEBUG})
|
||||
endif()
|
||||
|
||||
set(OPENIMAGEIO_DEFINITIONS "-DUSE_TBB=0")
|
||||
set(OPENIMAGEIO_IDIFF "${OPENIMAGEIO}/bin/idiff.exe")
|
||||
|
@ -572,31 +575,38 @@ if(WITH_LLVM)
|
|||
message(WARNING "LLVM debug libs not present on this system. Using release libs for debug builds.")
|
||||
set(LLVM_LIBRARY ${LLVM_LIBRARY_OPTIMIZED})
|
||||
endif()
|
||||
|
||||
endif()
|
||||
|
||||
if(WITH_OPENCOLORIO)
|
||||
set(OPENCOLORIO ${LIBDIR}/OpenColorIO)
|
||||
set(OPENCOLORIO_INCLUDE_DIRS ${OPENCOLORIO}/include)
|
||||
set(OPENCOLORIO_LIBPATH ${OPENCOLORIO}/lib)
|
||||
set(OPENCOLORIO_LIBRARIES
|
||||
optimized ${OPENCOLORIO_LIBPATH}/OpenColorIO.lib
|
||||
optimized ${OPENCOLORIO_LIBPATH}/libyaml-cpp.lib
|
||||
optimized ${OPENCOLORIO_LIBPATH}/libexpatMD.lib
|
||||
optimized ${OPENCOLORIO_LIBPATH}/pystring.lib
|
||||
debug ${OPENCOLORIO_LIBPATH}/OpencolorIO_d.lib
|
||||
debug ${OPENCOLORIO_LIBPATH}/libyaml-cpp_d.lib
|
||||
debug ${OPENCOLORIO_LIBPATH}/libexpatdMD.lib
|
||||
debug ${OPENCOLORIO_LIBPATH}/pystring_d.lib
|
||||
)
|
||||
windows_find_package(OpenColorIO)
|
||||
if(NOT OpenColorIO_FOUND)
|
||||
set(OPENCOLORIO ${LIBDIR}/OpenColorIO)
|
||||
set(OPENCOLORIO_INCLUDE_DIRS ${OPENCOLORIO}/include)
|
||||
set(OPENCOLORIO_LIBPATH ${OPENCOLORIO}/lib)
|
||||
set(OPENCOLORIO_LIBRARIES
|
||||
optimized ${OPENCOLORIO_LIBPATH}/OpenColorIO.lib
|
||||
optimized ${OPENCOLORIO_LIBPATH}/libyaml-cpp.lib
|
||||
optimized ${OPENCOLORIO_LIBPATH}/libexpatMD.lib
|
||||
optimized ${OPENCOLORIO_LIBPATH}/pystring.lib
|
||||
debug ${OPENCOLORIO_LIBPATH}/OpencolorIO_d.lib
|
||||
debug ${OPENCOLORIO_LIBPATH}/libyaml-cpp_d.lib
|
||||
debug ${OPENCOLORIO_LIBPATH}/libexpatdMD.lib
|
||||
debug ${OPENCOLORIO_LIBPATH}/pystring_d.lib
|
||||
)
|
||||
endif()
|
||||
|
||||
set(OPENCOLORIO_DEFINITIONS "-DOpenColorIO_SKIP_IMPORTS")
|
||||
endif()
|
||||
|
||||
if(WITH_OPENVDB)
|
||||
set(OPENVDB ${LIBDIR}/openVDB)
|
||||
set(OPENVDB_LIBPATH ${OPENVDB}/lib)
|
||||
set(OPENVDB_INCLUDE_DIRS ${OPENVDB}/include)
|
||||
set(OPENVDB_LIBRARIES optimized ${OPENVDB_LIBPATH}/openvdb.lib debug ${OPENVDB_LIBPATH}/openvdb_d.lib )
|
||||
windows_find_package(OpenVDB)
|
||||
if(NOT OpenVDB_FOUND)
|
||||
set(OPENVDB ${LIBDIR}/openVDB)
|
||||
set(OPENVDB_LIBPATH ${OPENVDB}/lib)
|
||||
set(OPENVDB_INCLUDE_DIRS ${OPENVDB}/include)
|
||||
set(OPENVDB_LIBRARIES optimized ${OPENVDB_LIBPATH}/openvdb.lib debug ${OPENVDB_LIBPATH}/openvdb_d.lib)
|
||||
endif()
|
||||
|
||||
set(OPENVDB_DEFINITIONS -DNOMINMAX -D_USE_MATH_DEFINES)
|
||||
endif()
|
||||
|
||||
|
@ -636,9 +646,10 @@ endif()
|
|||
|
||||
if(WITH_OPENSUBDIV)
|
||||
windows_find_package(OpenSubdiv)
|
||||
if (NOT OpenSubdiv_FOUND)
|
||||
set(OPENSUBDIV_INCLUDE_DIRS ${LIBDIR}/opensubdiv/include)
|
||||
set(OPENSUBDIV_LIBPATH ${LIBDIR}/opensubdiv/lib)
|
||||
if(NOT OpenSubdiv_FOUND)
|
||||
set(OPENSUBDIV ${LIBDIR}/opensubdiv)
|
||||
set(OPENSUBDIV_INCLUDE_DIRS ${OPENSUBDIV}/include)
|
||||
set(OPENSUBDIV_LIBPATH ${OPENSUBDIV}/lib)
|
||||
set(OPENSUBDIV_LIBRARIES
|
||||
optimized ${OPENSUBDIV_LIBPATH}/osdCPU.lib
|
||||
optimized ${OPENSUBDIV_LIBPATH}/osdGPU.lib
|
||||
|
@ -673,7 +684,7 @@ endif()
|
|||
|
||||
if(WITH_TBB)
|
||||
windows_find_package(TBB)
|
||||
if (NOT TBB_FOUND)
|
||||
if(NOT TBB_FOUND)
|
||||
set(TBB_LIBRARIES optimized ${LIBDIR}/tbb/lib/tbb.lib debug ${LIBDIR}/tbb/lib/tbb_debug.lib)
|
||||
set(TBB_INCLUDE_DIR ${LIBDIR}/tbb/include)
|
||||
set(TBB_INCLUDE_DIRS ${TBB_INCLUDE_DIR})
|
||||
|
@ -699,7 +710,6 @@ if(WITH_OPENAL)
|
|||
else()
|
||||
set(OPENAL_LIBRARY ${OPENAL_LIBPATH}/wrap_oal.lib)
|
||||
endif()
|
||||
|
||||
endif()
|
||||
|
||||
if(WITH_CODEC_SNDFILE)
|
||||
|
@ -744,7 +754,7 @@ endif()
|
|||
|
||||
if(WITH_CYCLES AND WITH_CYCLES_EMBREE)
|
||||
windows_find_package(Embree)
|
||||
if(NOT EMBREE_FOUND)
|
||||
if(NOT Embree_FOUND)
|
||||
set(EMBREE_INCLUDE_DIRS ${LIBDIR}/embree/include)
|
||||
set(EMBREE_LIBRARIES
|
||||
optimized ${LIBDIR}/embree/lib/embree3.lib
|
||||
|
@ -772,7 +782,6 @@ endif()
|
|||
if(WITH_USD)
|
||||
windows_find_package(USD)
|
||||
if(NOT USD_FOUND)
|
||||
set(USD_FOUND ON)
|
||||
set(USD_INCLUDE_DIRS ${LIBDIR}/usd/include)
|
||||
set(USD_RELEASE_LIB ${LIBDIR}/usd/lib/libusd_m.lib)
|
||||
set(USD_DEBUG_LIB ${LIBDIR}/usd/lib/libusd_m_d.lib)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Doxyfile 1.9.1
|
||||
# Doxyfile 1.9.3
|
||||
|
||||
# This file describes the settings to be used by the documentation system
|
||||
# doxygen (www.doxygen.org) for a project.
|
||||
|
@ -93,14 +93,6 @@ ALLOW_UNICODE_NAMES = NO
|
|||
|
||||
OUTPUT_LANGUAGE = English
|
||||
|
||||
# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all
|
||||
# documentation generated by doxygen is written. Doxygen will use this
|
||||
# information to generate all generated output in the proper direction.
|
||||
# Possible values are: None, LTR, RTL and Context.
|
||||
# The default value is: None.
|
||||
|
||||
OUTPUT_TEXT_DIRECTION = None
|
||||
|
||||
# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
|
||||
# descriptions after the members that are listed in the file and class
|
||||
# documentation (similar to Javadoc). Set to NO to disable this.
|
||||
|
@ -258,16 +250,16 @@ TAB_SIZE = 4
|
|||
# the documentation. An alias has the form:
|
||||
# name=value
|
||||
# For example adding
|
||||
# "sideeffect=@par Side Effects:\n"
|
||||
# "sideeffect=@par Side Effects:^^"
|
||||
# will allow you to put the command \sideeffect (or @sideeffect) in the
|
||||
# documentation, which will result in a user-defined paragraph with heading
|
||||
# "Side Effects:". You can put \n's in the value part of an alias to insert
|
||||
# newlines (in the resulting output). You can put ^^ in the value part of an
|
||||
# alias to insert a newline as if a physical newline was in the original file.
|
||||
# When you need a literal { or } or , in the value part of an alias you have to
|
||||
# escape them by means of a backslash (\), this can lead to conflicts with the
|
||||
# commands \{ and \} for these it is advised to use the version @{ and @} or use
|
||||
# a double escape (\\{ and \\})
|
||||
# "Side Effects:". Note that you cannot put \n's in the value part of an alias
|
||||
# to insert newlines (in the resulting output). You can put ^^ in the value part
|
||||
# of an alias to insert a newline as if a physical newline was in the original
|
||||
# file. When you need a literal { or } or , in the value part of an alias you
|
||||
# have to escape them by means of a backslash (\), this can lead to conflicts
|
||||
# with the commands \{ and \} for these it is advised to use the version @{ and
|
||||
# @} or use a double escape (\\{ and \\})
|
||||
|
||||
ALIASES =
|
||||
|
||||
|
@ -312,8 +304,8 @@ OPTIMIZE_OUTPUT_SLICE = NO
|
|||
# extension. Doxygen has a built-in mapping, but you can override or extend it
|
||||
# using this tag. The format is ext=language, where ext is a file extension, and
|
||||
# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
|
||||
# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL,
|
||||
# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
|
||||
# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice,
|
||||
# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
|
||||
# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
|
||||
# tries to guess whether the code is fixed or free formatted code, this is the
|
||||
# default for Fortran type files). For instance to make doxygen treat .inc files
|
||||
|
@ -466,7 +458,7 @@ LOOKUP_CACHE_SIZE = 3
|
|||
# than 0 to get more control over the balance between CPU load and processing
|
||||
# speed. At this moment only the input processing can be done using multiple
|
||||
# threads. Since this is still an experimental feature the default is set to 1,
|
||||
# which efficively disables parallel processing. Please report any issues you
|
||||
# which effectively disables parallel processing. Please report any issues you
|
||||
# encounter. Generating dot graphs in parallel is controlled by the
|
||||
# DOT_NUM_THREADS setting.
|
||||
# Minimum value: 0, maximum value: 32, default value: 1.
|
||||
|
@ -610,6 +602,12 @@ HIDE_SCOPE_NAMES = NO
|
|||
|
||||
HIDE_COMPOUND_REFERENCE= NO
|
||||
|
||||
# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class
|
||||
# will show which file needs to be included to use the class.
|
||||
# The default value is: YES.
|
||||
|
||||
SHOW_HEADERFILE = YES
|
||||
|
||||
# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
|
||||
# the files that are included by a file in the documentation of that file.
|
||||
# The default value is: YES.
|
||||
|
@ -767,7 +765,8 @@ FILE_VERSION_FILTER =
|
|||
# output files in an output format independent way. To create the layout file
|
||||
# that represents doxygen's defaults, run doxygen with the -l option. You can
|
||||
# optionally specify a file name after the option, if omitted DoxygenLayout.xml
|
||||
# will be used as the name of the layout file.
|
||||
# will be used as the name of the layout file. See also section "Changing the
|
||||
# layout of pages" for information.
|
||||
#
|
||||
# Note that if you run doxygen from a directory containing a file called
|
||||
# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
|
||||
|
@ -813,18 +812,26 @@ WARNINGS = YES
|
|||
WARN_IF_UNDOCUMENTED = NO
|
||||
|
||||
# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
|
||||
# potential errors in the documentation, such as not documenting some parameters
|
||||
# in a documented function, or documenting parameters that don't exist or using
|
||||
# markup commands wrongly.
|
||||
# potential errors in the documentation, such as documenting some parameters in
|
||||
# a documented function twice, or documenting parameters that don't exist or
|
||||
# using markup commands wrongly.
|
||||
# The default value is: YES.
|
||||
|
||||
WARN_IF_DOC_ERROR = YES
|
||||
|
||||
# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete
|
||||
# function parameter documentation. If set to NO, doxygen will accept that some
|
||||
# parameters have no documentation without warning.
|
||||
# The default value is: YES.
|
||||
|
||||
WARN_IF_INCOMPLETE_DOC = YES
|
||||
|
||||
# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
|
||||
# are documented, but have no documentation for their parameters or return
|
||||
# value. If set to NO, doxygen will only warn about wrong or incomplete
|
||||
# parameter documentation, but not about the absence of documentation. If
|
||||
# EXTRACT_ALL is set to YES then this flag will automatically be disabled.
|
||||
# value. If set to NO, doxygen will only warn about wrong parameter
|
||||
# documentation, but not about the absence of documentation. If EXTRACT_ALL is
|
||||
# set to YES then this flag will automatically be disabled. See also
|
||||
# WARN_IF_INCOMPLETE_DOC
|
||||
# The default value is: NO.
|
||||
|
||||
WARN_NO_PARAMDOC = NO
|
||||
|
@ -850,7 +857,10 @@ WARN_FORMAT = "$file:$line: $text"
|
|||
|
||||
# The WARN_LOGFILE tag can be used to specify a file to which warning and error
|
||||
# messages should be written. If left blank the output is written to standard
|
||||
# error (stderr).
|
||||
# error (stderr). In case the file specified cannot be opened for writing the
|
||||
# warning and error messages are written to standard error. When as file - is
|
||||
# specified the warning and error messages are written to standard output
|
||||
# (stdout).
|
||||
|
||||
WARN_LOGFILE =
|
||||
|
||||
|
@ -894,10 +904,10 @@ INPUT_ENCODING = UTF-8
|
|||
#
|
||||
# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
|
||||
# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
|
||||
# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
|
||||
# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment),
|
||||
# *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, *.vhdl,
|
||||
# *.ucf, *.qsf and *.ice.
|
||||
# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml,
|
||||
# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C
|
||||
# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd,
|
||||
# *.vhdl, *.ucf, *.qsf and *.ice.
|
||||
|
||||
FILE_PATTERNS =
|
||||
|
||||
|
@ -939,7 +949,7 @@ EXCLUDE_PATTERNS = .svn \
|
|||
# (namespaces, classes, functions, etc.) that should be excluded from the
|
||||
# output. The symbol name can be a fully qualified name, a word, or if the
|
||||
# wildcard * is used, a substring. Examples: ANamespace, AClass,
|
||||
# AClass::ANamespace, ANamespace::*Test
|
||||
# ANamespace::AClass, ANamespace::*Test
|
||||
#
|
||||
# Note that the wildcards are matched against the file with absolute path, so to
|
||||
# exclude all test directories use the pattern */test/*
|
||||
|
@ -1224,7 +1234,7 @@ HTML_EXTRA_FILES =
|
|||
|
||||
# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
|
||||
# will adjust the colors in the style sheet and background images according to
|
||||
# this color. Hue is specified as an angle on a colorwheel, see
|
||||
# this color. Hue is specified as an angle on a color-wheel, see
|
||||
# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
|
||||
# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
|
||||
# purple, and 360 is red again.
|
||||
|
@ -1234,7 +1244,7 @@ HTML_EXTRA_FILES =
|
|||
HTML_COLORSTYLE_HUE = 220
|
||||
|
||||
# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
|
||||
# in the HTML output. For a value of 0 the output will use grayscales only. A
|
||||
# in the HTML output. For a value of 0 the output will use gray-scales only. A
|
||||
# value of 255 will produce the most vivid colors.
|
||||
# Minimum value: 0, maximum value: 255, default value: 100.
|
||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||
|
@ -1316,6 +1326,13 @@ GENERATE_DOCSET = NO
|
|||
|
||||
DOCSET_FEEDNAME = "Doxygen generated docs"
|
||||
|
||||
# This tag determines the URL of the docset feed. A documentation feed provides
|
||||
# an umbrella under which multiple documentation sets from a single provider
|
||||
# (such as a company or product suite) can be grouped.
|
||||
# This tag requires that the tag GENERATE_DOCSET is set to YES.
|
||||
|
||||
DOCSET_FEEDURL =
|
||||
|
||||
# This tag specifies a string that should uniquely identify the documentation
|
||||
# set bundle. This should be a reverse domain-name style string, e.g.
|
||||
# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
|
||||
|
@ -1341,8 +1358,12 @@ DOCSET_PUBLISHER_NAME = Publisher
|
|||
# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
|
||||
# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
|
||||
# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
|
||||
# (see:
|
||||
# https://www.microsoft.com/en-us/download/details.aspx?id=21138) on Windows.
|
||||
# on Windows. In the beginning of 2021 Microsoft took the original page, with
|
||||
# a.o. the download links, offline the HTML help workshop was already many years
|
||||
# in maintenance mode). You can download the HTML help workshop from the web
|
||||
# archives at Installation executable (see:
|
||||
# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo
|
||||
# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe).
|
||||
#
|
||||
# The HTML Help Workshop contains a compiler that can convert all HTML output
|
||||
# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
|
||||
|
@ -1501,16 +1522,28 @@ DISABLE_INDEX = NO
|
|||
# to work a browser that supports JavaScript, DHTML, CSS and frames is required
|
||||
# (i.e. any modern browser). Windows users are probably better off using the
|
||||
# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
|
||||
# further fine-tune the look of the index. As an example, the default style
|
||||
# sheet generated by doxygen has an example that shows how to put an image at
|
||||
# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
|
||||
# the same information as the tab index, you could consider setting
|
||||
# DISABLE_INDEX to YES when enabling this option.
|
||||
# further fine tune the look of the index (see "Fine-tuning the output"). As an
|
||||
# example, the default style sheet generated by doxygen has an example that
|
||||
# shows how to put an image at the root of the tree instead of the PROJECT_NAME.
|
||||
# Since the tree basically has the same information as the tab index, you could
|
||||
# consider setting DISABLE_INDEX to YES when enabling this option.
|
||||
# The default value is: NO.
|
||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||
|
||||
GENERATE_TREEVIEW = NO
|
||||
|
||||
# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the
|
||||
# FULL_SIDEBAR option determines if the side bar is limited to only the treeview
|
||||
# area (value NO) or if it should extend to the full height of the window (value
|
||||
# YES). Setting this to YES gives a layout similar to
|
||||
# https://docs.readthedocs.io with more room for contents, but less room for the
|
||||
# project logo, title, and description. If either GENERATE_TREEVIEW or
|
||||
# DISABLE_INDEX is set to NO, this option has no effect.
|
||||
# The default value is: NO.
|
||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||
|
||||
FULL_SIDEBAR = NO
|
||||
|
||||
# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
|
||||
# doxygen will group on one line in the generated HTML documentation.
|
||||
#
|
||||
|
@ -1535,6 +1568,13 @@ TREEVIEW_WIDTH = 246
|
|||
|
||||
EXT_LINKS_IN_WINDOW = NO
|
||||
|
||||
# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email
|
||||
# addresses.
|
||||
# The default value is: YES.
|
||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||
|
||||
OBFUSCATE_EMAILS = YES
|
||||
|
||||
# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg
|
||||
# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
|
||||
# https://inkscape.org) to generate formulas as SVG images instead of PNGs for
|
||||
|
@ -1583,11 +1623,29 @@ FORMULA_MACROFILE =
|
|||
|
||||
USE_MATHJAX = NO
|
||||
|
||||
# With MATHJAX_VERSION it is possible to specify the MathJax version to be used.
|
||||
# Note that the different versions of MathJax have different requirements with
|
||||
# regards to the different settings, so it is possible that also other MathJax
|
||||
# settings have to be changed when switching between the different MathJax
|
||||
# versions.
|
||||
# Possible values are: MathJax_2 and MathJax_3.
|
||||
# The default value is: MathJax_2.
|
||||
# This tag requires that the tag USE_MATHJAX is set to YES.
|
||||
|
||||
MATHJAX_VERSION = MathJax_2
|
||||
|
||||
# When MathJax is enabled you can set the default output format to be used for
|
||||
# the MathJax output. See the MathJax site (see:
|
||||
# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details.
|
||||
# the MathJax output. For more details about the output format see MathJax
|
||||
# version 2 (see:
|
||||
# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3
|
||||
# (see:
|
||||
# http://docs.mathjax.org/en/latest/web/components/output.html).
|
||||
# Possible values are: HTML-CSS (which is slower, but has the best
|
||||
# compatibility), NativeMML (i.e. MathML) and SVG.
|
||||
# compatibility. This is the name for Mathjax version 2, for MathJax version 3
|
||||
# this will be translated into chtml), NativeMML (i.e. MathML. Only supported
|
||||
# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This
|
||||
# is the name for Mathjax version 3, for MathJax version 2 this will be
|
||||
# translated into HTML-CSS) and SVG.
|
||||
# The default value is: HTML-CSS.
|
||||
# This tag requires that the tag USE_MATHJAX is set to YES.
|
||||
|
||||
|
@ -1600,15 +1658,21 @@ MATHJAX_FORMAT = HTML-CSS
|
|||
# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
|
||||
# Content Delivery Network so you can quickly see the result without installing
|
||||
# MathJax. However, it is strongly recommended to install a local copy of
|
||||
# MathJax from https://www.mathjax.org before deployment.
|
||||
# The default value is: https://cdn.jsdelivr.net/npm/mathjax@2.
|
||||
# MathJax from https://www.mathjax.org before deployment. The default value is:
|
||||
# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2
|
||||
# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3
|
||||
# This tag requires that the tag USE_MATHJAX is set to YES.
|
||||
|
||||
MATHJAX_RELPATH = http://www.mathjax.org/mathjax
|
||||
|
||||
# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
|
||||
# extension names that should be enabled during MathJax rendering. For example
|
||||
# for MathJax version 2 (see
|
||||
# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions):
|
||||
# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
|
||||
# For example for MathJax version 3 (see
|
||||
# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html):
|
||||
# MATHJAX_EXTENSIONS = ams
|
||||
# This tag requires that the tag USE_MATHJAX is set to YES.
|
||||
|
||||
MATHJAX_EXTENSIONS =
|
||||
|
@ -1788,29 +1852,31 @@ PAPER_TYPE = a4
|
|||
|
||||
EXTRA_PACKAGES =
|
||||
|
||||
# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
|
||||
# generated LaTeX document. The header should contain everything until the first
|
||||
# chapter. If it is left blank doxygen will generate a standard header. See
|
||||
# section "Doxygen usage" for information on how to let doxygen write the
|
||||
# default header to a separate file.
|
||||
# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for
|
||||
# the generated LaTeX document. The header should contain everything until the
|
||||
# first chapter. If it is left blank doxygen will generate a standard header. It
|
||||
# is highly recommended to start with a default header using
|
||||
# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty
|
||||
# and then modify the file new_header.tex. See also section "Doxygen usage" for
|
||||
# information on how to generate the default header that doxygen normally uses.
|
||||
#
|
||||
# Note: Only use a user-defined header if you know what you are doing! The
|
||||
# following commands have a special meaning inside the header: $title,
|
||||
# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
|
||||
# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
|
||||
# string, for the replacement values of the other commands the user is referred
|
||||
# to HTML_HEADER.
|
||||
# Note: Only use a user-defined header if you know what you are doing!
|
||||
# Note: The header is subject to change so you typically have to regenerate the
|
||||
# default header when upgrading to a newer version of doxygen. The following
|
||||
# commands have a special meaning inside the header (and footer): For a
|
||||
# description of the possible markers and block names see the documentation.
|
||||
# This tag requires that the tag GENERATE_LATEX is set to YES.
|
||||
|
||||
LATEX_HEADER =
|
||||
|
||||
# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
|
||||
# generated LaTeX document. The footer should contain everything after the last
|
||||
# chapter. If it is left blank doxygen will generate a standard footer. See
|
||||
# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for
|
||||
# the generated LaTeX document. The footer should contain everything after the
|
||||
# last chapter. If it is left blank doxygen will generate a standard footer. See
|
||||
# LATEX_HEADER for more information on how to generate a default footer and what
|
||||
# special commands can be used inside the footer.
|
||||
#
|
||||
# Note: Only use a user-defined footer if you know what you are doing!
|
||||
# special commands can be used inside the footer. See also section "Doxygen
|
||||
# usage" for information on how to generate the default footer that doxygen
|
||||
# normally uses. Note: Only use a user-defined footer if you know what you are
|
||||
# doing!
|
||||
# This tag requires that the tag GENERATE_LATEX is set to YES.
|
||||
|
||||
LATEX_FOOTER =
|
||||
|
@ -1855,8 +1921,7 @@ USE_PDFLATEX = NO
|
|||
|
||||
# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
|
||||
# command to the generated LaTeX files. This will instruct LaTeX to keep running
|
||||
# if errors occur, instead of asking the user for help. This option is also used
|
||||
# when generating formulas in HTML.
|
||||
# if errors occur, instead of asking the user for help.
|
||||
# The default value is: NO.
|
||||
# This tag requires that the tag GENERATE_LATEX is set to YES.
|
||||
|
||||
|
@ -1869,16 +1934,6 @@ LATEX_BATCHMODE = NO
|
|||
|
||||
LATEX_HIDE_INDICES = NO
|
||||
|
||||
# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
|
||||
# code with syntax highlighting in the LaTeX output.
|
||||
#
|
||||
# Note that which sources are shown also depends on other settings such as
|
||||
# SOURCE_BROWSER.
|
||||
# The default value is: NO.
|
||||
# This tag requires that the tag GENERATE_LATEX is set to YES.
|
||||
|
||||
LATEX_SOURCE_CODE = NO
|
||||
|
||||
# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
|
||||
# bibliography, e.g. plainnat, or ieeetr. See
|
||||
# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
|
||||
|
@ -1959,16 +2014,6 @@ RTF_STYLESHEET_FILE =
|
|||
|
||||
RTF_EXTENSIONS_FILE =
|
||||
|
||||
# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
|
||||
# with syntax highlighting in the RTF output.
|
||||
#
|
||||
# Note that which sources are shown also depends on other settings such as
|
||||
# SOURCE_BROWSER.
|
||||
# The default value is: NO.
|
||||
# This tag requires that the tag GENERATE_RTF is set to YES.
|
||||
|
||||
RTF_SOURCE_CODE = NO
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the man page output
|
||||
#---------------------------------------------------------------------------
|
||||
|
@ -2065,15 +2110,6 @@ GENERATE_DOCBOOK = NO
|
|||
|
||||
DOCBOOK_OUTPUT = docbook
|
||||
|
||||
# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
|
||||
# program listings (including syntax highlighting and cross-referencing
|
||||
# information) to the DOCBOOK output. Note that enabling this will significantly
|
||||
# increase the size of the DOCBOOK output.
|
||||
# The default value is: NO.
|
||||
# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
|
||||
|
||||
DOCBOOK_PROGRAMLISTING = NO
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options for the AutoGen Definitions output
|
||||
#---------------------------------------------------------------------------
|
||||
|
@ -2254,15 +2290,6 @@ EXTERNAL_PAGES = YES
|
|||
# Configuration options related to the dot tool
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
|
||||
# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
|
||||
# NO turns the diagrams off. Note that this option also works with HAVE_DOT
|
||||
# disabled, but it is recommended to install and use dot, since it yields more
|
||||
# powerful graphs.
|
||||
# The default value is: YES.
|
||||
|
||||
CLASS_DIAGRAMS = NO
|
||||
|
||||
# You can include diagrams made with dia in doxygen documentation. Doxygen will
|
||||
# then run dia to produce the diagram and insert it in the documentation. The
|
||||
# DIA_PATH tag allows you to specify the directory where the dia binary resides.
|
||||
|
@ -2319,13 +2346,16 @@ DOT_FONTSIZE = 10
|
|||
|
||||
DOT_FONTPATH =
|
||||
|
||||
# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
|
||||
# each documented class showing the direct and indirect inheritance relations.
|
||||
# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
|
||||
# If the CLASS_GRAPH tag is set to YES (or GRAPH) then doxygen will generate a
|
||||
# graph for each documented class showing the direct and indirect inheritance
|
||||
# relations. In case HAVE_DOT is set as well dot will be used to draw the graph,
|
||||
# otherwise the built-in generator will be used. If the CLASS_GRAPH tag is set
|
||||
# to TEXT the direct and indirect inheritance relations will be shown as texts /
|
||||
# links.
|
||||
# Possible values are: NO, YES, TEXT and GRAPH.
|
||||
# The default value is: YES.
|
||||
# This tag requires that the tag HAVE_DOT is set to YES.
|
||||
|
||||
CLASS_GRAPH = YES
|
||||
CLASS_GRAPH = TEXT
|
||||
|
||||
# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
|
||||
# graph for each documented class showing the direct and indirect implementation
|
||||
|
@ -2452,6 +2482,13 @@ GRAPHICAL_HIERARCHY = YES
|
|||
|
||||
DIRECTORY_GRAPH = YES
|
||||
|
||||
# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels
|
||||
# of child directories generated in directory dependency graphs by dot.
|
||||
# Minimum value: 1, maximum value: 25, default value: 1.
|
||||
# This tag requires that the tag DIRECTORY_GRAPH is set to YES.
|
||||
|
||||
DIR_GRAPH_MAX_DEPTH = 1
|
||||
|
||||
# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
|
||||
# generated by dot. For an explanation of the image formats see the section
|
||||
# output formats in the documentation of the dot tool (Graphviz (see:
|
||||
|
@ -2505,10 +2542,10 @@ MSCFILE_DIRS =
|
|||
DIAFILE_DIRS =
|
||||
|
||||
# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
|
||||
# path where java can find the plantuml.jar file. If left blank, it is assumed
|
||||
# PlantUML is not used or called during a preprocessing step. Doxygen will
|
||||
# generate a warning when it encounters a \startuml command in this case and
|
||||
# will not generate output for the diagram.
|
||||
# path where java can find the plantuml.jar file or to the filename of jar file
|
||||
# to be used. If left blank, it is assumed PlantUML is not used or called during
|
||||
# a preprocessing step. Doxygen will generate a warning when it encounters a
|
||||
# \startuml command in this case and will not generate output for the diagram.
|
||||
|
||||
PLANTUML_JAR_PATH =
|
||||
|
||||
|
@ -2570,6 +2607,8 @@ DOT_MULTI_TARGETS = YES
|
|||
# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
|
||||
# explaining the meaning of the various boxes and arrows in the dot generated
|
||||
# graphs.
|
||||
# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal
|
||||
# graphical representation for inheritance and collaboration diagrams is used.
|
||||
# The default value is: YES.
|
||||
# This tag requires that the tag HAVE_DOT is set to YES.
|
||||
|
||||
|
@ -2578,8 +2617,8 @@ GENERATE_LEGEND = YES
|
|||
# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate
|
||||
# files that are used to generate the various graphs.
|
||||
#
|
||||
# Note: This setting is not only used for dot files but also for msc and
|
||||
# plantuml temporary files.
|
||||
# Note: This setting is not only used for dot files but also for msc temporary
|
||||
# files.
|
||||
# The default value is: YES.
|
||||
|
||||
DOT_CLEANUP = YES
|
||||
|
|
|
@ -63,6 +63,7 @@ import os
|
|||
import sys
|
||||
import inspect
|
||||
import shutil
|
||||
import time
|
||||
import logging
|
||||
import warnings
|
||||
|
||||
|
@ -399,6 +400,7 @@ MODULE_GROUPING = {
|
|||
|
||||
# converting bytes to strings, due to T30154
|
||||
BLENDER_REVISION = str(bpy.app.build_hash, 'utf_8')
|
||||
BLENDER_REVISION_TIMESTAMP = bpy.app.build_commit_timestamp
|
||||
|
||||
# '2.83.0 Beta' or '2.83.0' or '2.83.1'
|
||||
BLENDER_VERSION_STRING = bpy.app.version_string
|
||||
|
@ -407,9 +409,13 @@ BLENDER_VERSION_DOTS = "%d.%d" % (bpy.app.version[0], bpy.app.version[1])
|
|||
if BLENDER_REVISION != "Unknown":
|
||||
# SHA1 Git hash
|
||||
BLENDER_VERSION_HASH = BLENDER_REVISION
|
||||
BLENDER_VERSION_HASH_HTML_LINK = "<a href=https://developer.blender.org/rB%s>%s</a>" % (BLENDER_VERSION_HASH, BLENDER_VERSION_HASH)
|
||||
BLENDER_VERSION_DATE = time.strftime("%d/%m/%Y", time.localtime(BLENDER_REVISION_TIMESTAMP))
|
||||
else:
|
||||
# Fallback: Should not be used
|
||||
BLENDER_VERSION_HASH = "Hash Unknown"
|
||||
BLENDER_VERSION_HASH_HTML_LINK = BLENDER_VERSION_HASH
|
||||
BLENDER_VERSION_DATE = time.strftime("%Y-%m-%d")
|
||||
|
||||
# '2_83'
|
||||
BLENDER_VERSION_PATH = "%d_%d" % (bpy.app.version[0], bpy.app.version[1])
|
||||
|
@ -1752,11 +1758,12 @@ except ModuleNotFoundError:
|
|||
fw("html_split_index = True\n")
|
||||
fw("html_static_path = ['static']\n")
|
||||
fw("templates_path = ['templates']\n")
|
||||
fw("html_context = {'commit': '%s'}\n" % BLENDER_VERSION_HASH)
|
||||
fw("html_context = {'commit': '%s - %s'}\n" % (BLENDER_VERSION_HASH_HTML_LINK, BLENDER_VERSION_DATE))
|
||||
fw("html_extra_path = ['static/favicon.ico', 'static/blender_logo.svg']\n")
|
||||
fw("html_favicon = 'static/favicon.ico'\n")
|
||||
fw("html_logo = 'static/blender_logo.svg'\n")
|
||||
fw("html_last_updated_fmt = '%m/%d/%Y'\n\n")
|
||||
# Disable default `last_updated` value, since this is the date of doc generation, not the one of the source commit.
|
||||
fw("html_last_updated_fmt = None\n\n")
|
||||
fw("if html_theme == 'sphinx_rtd_theme':\n")
|
||||
fw(" html_css_files = ['css/version_switch.css']\n")
|
||||
fw(" html_js_files = ['js/version_switch.js']\n")
|
||||
|
|
|
@ -3,11 +3,7 @@
|
|||
|
||||
# Standalone or with Blender
|
||||
if(NOT WITH_BLENDER)
|
||||
if(WITH_CYCLES_STANDALONE OR NOT WITH_CYCLES_HYDRA_RENDER_DELEGATE)
|
||||
set(CYCLES_INSTALL_PATH ${CMAKE_INSTALL_PREFIX})
|
||||
else()
|
||||
set(CYCLES_INSTALL_PATH ${CMAKE_INSTALL_PREFIX}/hdCycles/resources)
|
||||
endif()
|
||||
set(CYCLES_INSTALL_PATH ${CMAKE_INSTALL_PREFIX})
|
||||
else()
|
||||
set(WITH_CYCLES_BLENDER ON)
|
||||
# WINDOWS_PYTHON_DEBUG needs to write into the user addons folder since it will
|
||||
|
@ -219,6 +215,15 @@ add_definitions(
|
|||
-DCCL_NAMESPACE_END=}
|
||||
)
|
||||
|
||||
include_directories(
|
||||
SYSTEM
|
||||
${BOOST_INCLUDE_DIR}
|
||||
${OPENIMAGEIO_INCLUDE_DIRS}
|
||||
${OPENEXR_INCLUDE_DIRS}
|
||||
${PUGIXML_INCLUDE_DIR}
|
||||
${TBB_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
if(WITH_CYCLES_DEBUG)
|
||||
add_definitions(-DWITH_CYCLES_DEBUG)
|
||||
endif()
|
||||
|
@ -259,7 +264,6 @@ endif()
|
|||
|
||||
if(WITH_CYCLES_EMBREE)
|
||||
add_definitions(-DWITH_EMBREE)
|
||||
add_definitions(-DEMBREE_STATIC_LIB)
|
||||
include_directories(
|
||||
SYSTEM
|
||||
${EMBREE_INCLUDE_DIRS}
|
||||
|
@ -284,7 +288,6 @@ endif()
|
|||
|
||||
if(WITH_OPENIMAGEDENOISE)
|
||||
add_definitions(-DWITH_OPENIMAGEDENOISE)
|
||||
add_definitions(-DOIDN_STATIC_LIB)
|
||||
include_directories(
|
||||
SYSTEM
|
||||
${OPENIMAGEDENOISE_INCLUDE_DIRS}
|
||||
|
@ -312,17 +315,6 @@ if(NOT OPENIMAGEIO_PUGIXML_FOUND)
|
|||
add_definitions(-DWITH_SYSTEM_PUGIXML)
|
||||
endif()
|
||||
|
||||
include_directories(
|
||||
SYSTEM
|
||||
${BOOST_INCLUDE_DIR}
|
||||
${OPENIMAGEIO_INCLUDE_DIRS}
|
||||
${OPENIMAGEIO_INCLUDE_DIRS}/OpenImageIO
|
||||
${OPENEXR_INCLUDE_DIR}
|
||||
${OPENEXR_INCLUDE_DIRS}
|
||||
${PUGIXML_INCLUDE_DIR}
|
||||
${TBB_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
if(CYCLES_STANDALONE_REPOSITORY)
|
||||
include_directories(../third_party/atomic)
|
||||
else()
|
||||
|
@ -339,10 +331,13 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_C_COMPILER_ID MATCHES "Clang")
|
|||
unset(_has_no_error_unused_macros)
|
||||
endif()
|
||||
|
||||
if(WITH_CYCLES_HYDRA_RENDER_DELEGATE AND NOT WITH_USD)
|
||||
if(WITH_CYCLES_HYDRA_RENDER_DELEGATE AND (NOT WITH_USD))
|
||||
message(STATUS "USD not found, disabling WITH_CYCLES_HYDRA_RENDER_DELEGATE")
|
||||
set(WITH_CYCLES_HYDRA_RENDER_DELEGATE OFF)
|
||||
endif()
|
||||
if(WITH_CYCLES_HYDRA_RENDER_DELEGATE AND (NOT WITH_BLENDER) AND (NOT WITH_CYCLES_STANDALONE))
|
||||
set(CYCLES_INSTALL_PATH ${CYCLES_INSTALL_PATH}/hdCycles/resources)
|
||||
endif()
|
||||
|
||||
if(WITH_CYCLES_CUDA_BINARIES AND (NOT WITH_CYCLES_CUBIN_COMPILER))
|
||||
if(MSVC)
|
||||
|
|
|
@ -11,7 +11,7 @@ set(INC
|
|||
set(INC_SYS
|
||||
)
|
||||
|
||||
set(LIBRARIES
|
||||
set(LIB
|
||||
cycles_device
|
||||
cycles_kernel
|
||||
cycles_scene
|
||||
|
@ -33,27 +33,23 @@ if(WITH_ALEMBIC)
|
|||
endif()
|
||||
|
||||
if(WITH_CYCLES_OSL)
|
||||
list(APPEND LIBRARIES cycles_kernel_osl)
|
||||
list(APPEND LIB cycles_kernel_osl)
|
||||
endif()
|
||||
|
||||
if(CYCLES_STANDALONE_REPOSITORY)
|
||||
list(APPEND LIBRARIES extern_sky)
|
||||
list(APPEND LIB extern_sky)
|
||||
else()
|
||||
list(APPEND LIBRARIES bf_intern_sky)
|
||||
list(APPEND LIB bf_intern_sky)
|
||||
endif()
|
||||
|
||||
if(WITH_CYCLES_STANDALONE AND WITH_CYCLES_STANDALONE_GUI)
|
||||
add_definitions(${GL_DEFINITIONS})
|
||||
list(APPEND INC_SYS
|
||||
${GLEW_INCLUDE_DIR}
|
||||
${SDL2_INCLUDE_DIRS}
|
||||
)
|
||||
list(APPEND LIBRARIES
|
||||
${CYCLES_GL_LIBRARIES}
|
||||
${SDL2_LIBRARIES}
|
||||
)
|
||||
list(APPEND INC_SYS ${GLEW_INCLUDE_DIR} ${SDL2_INCLUDE_DIRS})
|
||||
list(APPEND LIB ${CYCLES_GL_LIBRARIES} ${CYCLES_GLEW_LIBRARIES} ${SDL2_LIBRARIES})
|
||||
endif()
|
||||
|
||||
cycles_external_libraries_append(LIB)
|
||||
|
||||
# Common configuration.
|
||||
|
||||
include_directories(${INC})
|
||||
|
@ -84,8 +80,7 @@ if(WITH_CYCLES_STANDALONE)
|
|||
add_executable(cycles ${SRC} ${INC} ${INC_SYS})
|
||||
unset(SRC)
|
||||
|
||||
target_link_libraries(cycles ${LIBRARIES})
|
||||
cycles_target_link_libraries(cycles)
|
||||
target_link_libraries(cycles PRIVATE ${LIB})
|
||||
|
||||
if(APPLE)
|
||||
if(WITH_OPENCOLORIO)
|
||||
|
@ -128,9 +123,12 @@ if(WITH_CYCLES_CUBIN_COMPILER)
|
|||
set(INC
|
||||
../../../extern/cuew/include
|
||||
)
|
||||
set(LIB
|
||||
)
|
||||
cycles_external_libraries_append(LIB)
|
||||
add_executable(cycles_cubin_cc ${SRC})
|
||||
include_directories(${INC})
|
||||
cycles_target_link_libraries(cycles_cubin_cc)
|
||||
target_link_libraries(cycles_cubin_cc PRIVATE ${LIB})
|
||||
unset(SRC)
|
||||
unset(INC)
|
||||
endif()
|
||||
|
|
|
@ -121,9 +121,9 @@ static void session_init()
|
|||
options.session->set_display_driver(make_unique<OpenGLDisplayDriver>(
|
||||
window_opengl_context_enable, window_opengl_context_disable));
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if (!options.output_filepath.empty()) {
|
||||
|
||||
if (!options.output_filepath.empty()) {
|
||||
options.session->set_output_driver(make_unique<OIIOOutputDriver>(
|
||||
options.output_filepath, options.output_pass, session_print));
|
||||
}
|
||||
|
|
|
@ -228,6 +228,10 @@ def list_render_passes(scene, srl):
|
|||
else:
|
||||
yield (aov.name, "RGB", 'COLOR')
|
||||
|
||||
# Light groups.
|
||||
for lightgroup in srl.lightgroups:
|
||||
yield ("Combined_%s" % lightgroup.name, "RGB", 'COLOR')
|
||||
|
||||
|
||||
def register_passes(engine, scene, view_layer):
|
||||
for name, channelids, channeltype in list_render_passes(scene, view_layer):
|
||||
|
|
|
@ -65,8 +65,8 @@ enum_panorama_types = (
|
|||
)
|
||||
|
||||
enum_curve_shape = (
|
||||
('RIBBONS', "Rounded Ribbons", "Render hair as flat ribbon with rounded normals, for fast rendering"),
|
||||
('THICK', "3D Curves", "Render hair as 3D curve, for accurate results when viewing hair close up"),
|
||||
('RIBBONS', "Rounded Ribbons", "Render curves as flat ribbons with rounded normals, for fast rendering"),
|
||||
('THICK', "3D Curves", "Render curves as circular 3D geometry, for accurate results when viewing closely"),
|
||||
)
|
||||
|
||||
enum_use_layer_samples = (
|
||||
|
@ -428,14 +428,14 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
|
|||
min_light_bounces: IntProperty(
|
||||
name="Min Light Bounces",
|
||||
description="Minimum number of light bounces. Setting this higher reduces noise in the first bounces, "
|
||||
"but can also be less efficient for more complex geometry like hair and volumes",
|
||||
"but can also be less efficient for more complex geometry like curves and volumes",
|
||||
min=0, max=1024,
|
||||
default=0,
|
||||
)
|
||||
min_transparent_bounces: IntProperty(
|
||||
name="Min Transparent Bounces",
|
||||
description="Minimum number of transparent bounces. Setting this higher reduces noise in the first bounces, "
|
||||
"but can also be less efficient for more complex geometry like hair and volumes",
|
||||
"but can also be less efficient for more complex geometry like curves and volumes",
|
||||
min=0, max=1024,
|
||||
default=0,
|
||||
)
|
||||
|
@ -649,8 +649,8 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
|
|||
default=False,
|
||||
)
|
||||
debug_use_hair_bvh: BoolProperty(
|
||||
name="Use Hair BVH",
|
||||
description="Use special type BVH optimized for hair (uses more ram but renders faster)",
|
||||
name="Use Curves BVH",
|
||||
description="Use special type BVH optimized for curves (uses more ram but renders faster)",
|
||||
default=True,
|
||||
)
|
||||
debug_use_compact_bvh: BoolProperty(
|
||||
|
@ -1012,6 +1012,12 @@ class CyclesLightSettings(bpy.types.PropertyGroup):
|
|||
"note that this will make the light invisible",
|
||||
default=False,
|
||||
)
|
||||
is_caustics_light: BoolProperty(
|
||||
name="Shadow Caustics",
|
||||
description="Generate approximate caustics in shadows of refractive surfaces. "
|
||||
"Lights, caster and receiver objects must have shadow caustics options set to enable this",
|
||||
default=False,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def register(cls):
|
||||
|
@ -1028,6 +1034,12 @@ class CyclesLightSettings(bpy.types.PropertyGroup):
|
|||
|
||||
class CyclesWorldSettings(bpy.types.PropertyGroup):
|
||||
|
||||
is_caustics_light: BoolProperty(
|
||||
name="Shadow Caustics",
|
||||
description="Generate approximate caustics in shadows of refractive surfaces. "
|
||||
"Lights, caster and receiver objects must have shadow caustics options set to enable this",
|
||||
default=False,
|
||||
)
|
||||
sampling_method: EnumProperty(
|
||||
name="Sampling Method",
|
||||
description="How to sample the background light",
|
||||
|
@ -1226,6 +1238,21 @@ class CyclesObjectSettings(bpy.types.PropertyGroup):
|
|||
subtype='DISTANCE',
|
||||
)
|
||||
|
||||
is_caustics_caster: BoolProperty(
|
||||
name="Cast Shadow Caustics",
|
||||
description="With refractive materials, generate approximate caustics in shadows of this object. "
|
||||
"Up to 10 bounces inside this object are taken into account. Lights, caster and receiver objects "
|
||||
"must have shadow caustics options set to enable this",
|
||||
default=False,
|
||||
)
|
||||
|
||||
is_caustics_receiver: BoolProperty(
|
||||
name="Receive Shadow Caustics",
|
||||
description="Receive approximate caustics from refractive materials in shadows on this object. "
|
||||
"Lights, caster and receiver objects must have shadow caustics options set to enable this",
|
||||
default=False,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def register(cls):
|
||||
bpy.types.Object.cycles = PointerProperty(
|
||||
|
@ -1243,7 +1270,7 @@ class CyclesCurveRenderSettings(bpy.types.PropertyGroup):
|
|||
|
||||
shape: EnumProperty(
|
||||
name="Shape",
|
||||
description="Form of hair",
|
||||
description="Form of curves",
|
||||
items=enum_curve_shape,
|
||||
default='RIBBONS',
|
||||
)
|
||||
|
@ -1257,8 +1284,8 @@ class CyclesCurveRenderSettings(bpy.types.PropertyGroup):
|
|||
@classmethod
|
||||
def register(cls):
|
||||
bpy.types.Scene.cycles_curves = PointerProperty(
|
||||
name="Cycles Hair Rendering Settings",
|
||||
description="Cycles hair rendering settings",
|
||||
name="Cycles Curves Rendering Settings",
|
||||
description="Cycles curves rendering settings",
|
||||
type=cls,
|
||||
)
|
||||
|
||||
|
|
|
@ -11,8 +11,8 @@ from bl_ui.utils import PresetPanel
|
|||
from bpy.types import Panel
|
||||
|
||||
from bl_ui.properties_grease_pencil_common import GreasePencilSimplifyPanel
|
||||
from bl_ui.properties_render import draw_hair_settings
|
||||
from bl_ui.properties_view_layer import ViewLayerCryptomattePanel, ViewLayerAOVPanel
|
||||
from bl_ui.properties_render import draw_curves_settings
|
||||
from bl_ui.properties_view_layer import ViewLayerCryptomattePanel, ViewLayerAOVPanel, ViewLayerLightgroupsPanel
|
||||
|
||||
class CyclesPresetPanel(PresetPanel, Panel):
|
||||
COMPAT_ENGINES = {'CYCLES'}
|
||||
|
@ -336,8 +336,8 @@ class CYCLES_RENDER_PT_subdivision(CyclesButtonsPanel, Panel):
|
|||
col.prop(cscene, "dicing_camera")
|
||||
|
||||
|
||||
class CYCLES_RENDER_PT_hair(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Hair"
|
||||
class CYCLES_RENDER_PT_curves(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Curves"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
|
||||
def draw(self, context):
|
||||
|
@ -353,13 +353,13 @@ class CYCLES_RENDER_PT_hair(CyclesButtonsPanel, Panel):
|
|||
if ccscene.shape == 'RIBBONS':
|
||||
col.prop(ccscene, "subdivisions", text="Curve Subdivisions")
|
||||
|
||||
class CYCLES_RENDER_PT_hair_viewport_display(CyclesButtonsPanel, Panel):
|
||||
class CYCLES_RENDER_PT_curves_viewport_display(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Viewport Display"
|
||||
bl_parent_id = "CYCLES_RENDER_PT_hair"
|
||||
bl_parent_id = "CYCLES_RENDER_PT_curves"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
|
||||
def draw(self, context):
|
||||
draw_hair_settings(self, context)
|
||||
draw_curves_settings(self, context)
|
||||
|
||||
class CYCLES_RENDER_PT_volumes(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Volumes"
|
||||
|
@ -757,7 +757,7 @@ class CYCLES_RENDER_PT_filter(CyclesButtonsPanel, Panel):
|
|||
col = layout.column(heading="Include")
|
||||
col.prop(view_layer, "use_sky", text="Environment")
|
||||
col.prop(view_layer, "use_solid", text="Surfaces")
|
||||
col.prop(view_layer, "use_strand", text="Hair")
|
||||
col.prop(view_layer, "use_strand", text="Curves")
|
||||
col.prop(view_layer, "use_volumes", text="Volumes")
|
||||
|
||||
col = layout.column(heading="Use")
|
||||
|
@ -883,6 +883,12 @@ class CYCLES_RENDER_PT_passes_aov(CyclesButtonsPanel, ViewLayerAOVPanel):
|
|||
bl_parent_id = "CYCLES_RENDER_PT_passes"
|
||||
|
||||
|
||||
class CYCLES_RENDER_PT_passes_lightgroups(CyclesButtonsPanel, ViewLayerLightgroupsPanel):
|
||||
bl_label = "Light Groups"
|
||||
bl_context = "view_layer"
|
||||
bl_parent_id = "CYCLES_RENDER_PT_passes"
|
||||
|
||||
|
||||
class CYCLES_PT_post_processing(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Post Processing"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
|
@ -1093,6 +1099,10 @@ class CYCLES_OBJECT_PT_shading_shadow_terminator(CyclesButtonsPanel, Panel):
|
|||
bl_parent_id = "CYCLES_OBJECT_PT_shading"
|
||||
bl_context = "object"
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
return context.object.type != 'LIGHT'
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
layout.use_property_split = True
|
||||
|
@ -1110,6 +1120,10 @@ class CYCLES_OBJECT_PT_shading_gi_approximation(CyclesButtonsPanel, Panel):
|
|||
bl_parent_id = "CYCLES_OBJECT_PT_shading"
|
||||
bl_context = "object"
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
return context.object.type != 'LIGHT'
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
layout.use_property_split = True
|
||||
|
@ -1125,6 +1139,52 @@ class CYCLES_OBJECT_PT_shading_gi_approximation(CyclesButtonsPanel, Panel):
|
|||
col.prop(cob, "ao_distance")
|
||||
|
||||
|
||||
class CYCLES_OBJECT_PT_shading_caustics(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Caustics"
|
||||
bl_parent_id = "CYCLES_OBJECT_PT_shading"
|
||||
bl_context = "object"
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
return CyclesButtonsPanel.poll(context) and not use_metal(context) and context.object.type != 'LIGHT'
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
layout.use_property_split = True
|
||||
layout.use_property_decorate = False
|
||||
|
||||
col = layout.column()
|
||||
|
||||
ob = context.object
|
||||
cob = ob.cycles
|
||||
col.prop(cob, "is_caustics_caster")
|
||||
col.prop(cob, "is_caustics_receiver")
|
||||
|
||||
|
||||
class CYCLES_OBJECT_PT_lightgroup(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Light Group"
|
||||
bl_parent_id = "CYCLES_OBJECT_PT_shading"
|
||||
bl_context = "object"
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
layout.use_property_split = True
|
||||
|
||||
ob = context.object
|
||||
|
||||
view_layer = context.view_layer
|
||||
|
||||
row = layout.row(align=True)
|
||||
row.use_property_decorate = False
|
||||
|
||||
sub = row.column(align=True)
|
||||
sub.prop_search(ob, "lightgroup", view_layer, "lightgroups", text="Light Group", results_are_suggestions=True)
|
||||
|
||||
sub = row.column(align=True)
|
||||
sub.active = bool(ob.lightgroup) and not any(lg.name == ob.lightgroup for lg in view_layer.lightgroups)
|
||||
sub.operator("scene.view_layer_add_lightgroup", icon='ADD', text="").name = ob.lightgroup
|
||||
|
||||
|
||||
class CYCLES_OBJECT_PT_visibility(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Visibility"
|
||||
bl_context = "object"
|
||||
|
@ -1300,6 +1360,8 @@ class CYCLES_LIGHT_PT_light(CyclesButtonsPanel, Panel):
|
|||
sub.active = not (light.type == 'AREA' and clamp.is_portal)
|
||||
sub.prop(clamp, "cast_shadow")
|
||||
sub.prop(clamp, "use_multiple_importance_sampling", text="Multiple Importance")
|
||||
if not use_metal(context):
|
||||
sub.prop(clamp, "is_caustics_light", text="Shadow Caustics")
|
||||
|
||||
if light.type == 'AREA':
|
||||
col.prop(clamp, "is_portal", text="Portal")
|
||||
|
@ -1375,10 +1437,21 @@ class CYCLES_WORLD_PT_surface(CyclesButtonsPanel, Panel):
|
|||
layout.use_property_split = True
|
||||
|
||||
world = context.world
|
||||
view_layer = context.view_layer
|
||||
|
||||
if not panel_node_draw(layout, world, 'OUTPUT_WORLD', 'Surface'):
|
||||
layout.prop(world, "color")
|
||||
|
||||
row = layout.row(align=True)
|
||||
row.use_property_decorate = False
|
||||
|
||||
sub = row.column(align=True)
|
||||
sub.prop_search(world, "lightgroup", view_layer, "lightgroups", text="Light Group", results_are_suggestions=True)
|
||||
|
||||
sub = row.column(align=True)
|
||||
sub.active = bool(world.lightgroup) and not any(lg.name == world.lightgroup for lg in view_layer.lightgroups)
|
||||
sub.operator("scene.view_layer_add_lightgroup", icon='ADD', text="").name = world.lightgroup
|
||||
|
||||
|
||||
class CYCLES_WORLD_PT_volume(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Volume"
|
||||
|
@ -1496,6 +1569,8 @@ class CYCLES_WORLD_PT_settings_surface(CyclesButtonsPanel, Panel):
|
|||
subsub.active = cworld.sampling_method == 'MANUAL'
|
||||
subsub.prop(cworld, "sample_map_resolution")
|
||||
sub.prop(cworld, "max_bounces")
|
||||
sub.prop(cworld, "is_caustics_light", text="Shadow Caustics")
|
||||
|
||||
|
||||
|
||||
class CYCLES_WORLD_PT_settings_volume(CyclesButtonsPanel, Panel):
|
||||
|
@ -2157,8 +2232,8 @@ classes = (
|
|||
CYCLES_RENDER_PT_light_paths_fast_gi,
|
||||
CYCLES_RENDER_PT_volumes,
|
||||
CYCLES_RENDER_PT_subdivision,
|
||||
CYCLES_RENDER_PT_hair,
|
||||
CYCLES_RENDER_PT_hair_viewport_display,
|
||||
CYCLES_RENDER_PT_curves,
|
||||
CYCLES_RENDER_PT_curves_viewport_display,
|
||||
CYCLES_RENDER_PT_simplify,
|
||||
CYCLES_RENDER_PT_simplify_viewport,
|
||||
CYCLES_RENDER_PT_simplify_render,
|
||||
|
@ -2183,6 +2258,7 @@ classes = (
|
|||
CYCLES_RENDER_PT_passes_light,
|
||||
CYCLES_RENDER_PT_passes_crypto,
|
||||
CYCLES_RENDER_PT_passes_aov,
|
||||
CYCLES_RENDER_PT_passes_lightgroups,
|
||||
CYCLES_RENDER_PT_filter,
|
||||
CYCLES_RENDER_PT_override,
|
||||
CYCLES_PT_post_processing,
|
||||
|
@ -2193,6 +2269,8 @@ classes = (
|
|||
CYCLES_OBJECT_PT_shading,
|
||||
CYCLES_OBJECT_PT_shading_shadow_terminator,
|
||||
CYCLES_OBJECT_PT_shading_gi_approximation,
|
||||
CYCLES_OBJECT_PT_shading_caustics,
|
||||
CYCLES_OBJECT_PT_lightgroup,
|
||||
CYCLES_OBJECT_PT_visibility,
|
||||
CYCLES_OBJECT_PT_visibility_ray_visibility,
|
||||
CYCLES_OBJECT_PT_visibility_culling,
|
||||
|
|
|
@ -114,6 +114,9 @@ void BlenderSync::sync_light(BL::Object &b_parent,
|
|||
light->set_cast_shadow(get_boolean(clight, "cast_shadow"));
|
||||
light->set_use_mis(get_boolean(clight, "use_multiple_importance_sampling"));
|
||||
|
||||
/* caustics light */
|
||||
light->set_use_caustics(get_boolean(clight, "is_caustics_light"));
|
||||
|
||||
light->set_max_bounces(get_int(clight, "max_bounces"));
|
||||
|
||||
if (b_ob_info.real_object != b_ob_info.iter_object) {
|
||||
|
@ -140,6 +143,9 @@ void BlenderSync::sync_light(BL::Object &b_parent,
|
|||
light->set_use_scatter((visibility & PATH_RAY_VOLUME_SCATTER) != 0);
|
||||
light->set_is_shadow_catcher(b_ob_info.real_object.is_shadow_catcher());
|
||||
|
||||
/* lightgroup */
|
||||
light->set_lightgroup(ustring(b_ob_info.real_object.lightgroup()));
|
||||
|
||||
/* tag */
|
||||
light->tag_update(scene);
|
||||
}
|
||||
|
@ -176,6 +182,9 @@ void BlenderSync::sync_background_light(BL::SpaceView3D &b_v3d, bool use_portal)
|
|||
/* force enable light again when world is resynced */
|
||||
light->set_is_enabled(true);
|
||||
|
||||
/* caustic light */
|
||||
light->set_use_caustics(get_boolean(cworld, "is_caustics_light"));
|
||||
|
||||
light->tag_update(scene);
|
||||
light_map.set_recalc(b_world);
|
||||
}
|
||||
|
|
|
@ -66,9 +66,8 @@ bool BlenderSync::object_is_geometry(BObjectInfo &b_ob_info)
|
|||
}
|
||||
|
||||
/* Other object types that are not meshes but evaluate to meshes are presented to render engines
|
||||
* as separate instance objects. Metaballs and surface objects have not been affected by that
|
||||
* change yet. */
|
||||
if (type == BL::Object::type_SURFACE || type == BL::Object::type_META) {
|
||||
* as separate instance objects. Metaballs have not been affected by that change yet. */
|
||||
if (type == BL::Object::type_META) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -298,6 +297,12 @@ Object *BlenderSync::sync_object(BL::Depsgraph &b_depsgraph,
|
|||
}
|
||||
object->set_ao_distance(ao_distance);
|
||||
|
||||
bool is_caustics_caster = get_boolean(cobject, "is_caustics_caster");
|
||||
object->set_is_caustics_caster(is_caustics_caster);
|
||||
|
||||
bool is_caustics_receiver = get_boolean(cobject, "is_caustics_receiver");
|
||||
object->set_is_caustics_receiver(is_caustics_receiver);
|
||||
|
||||
/* sync the asset name for Cryptomatte */
|
||||
BL::Object parent = b_ob.parent();
|
||||
ustring parent_name;
|
||||
|
@ -337,6 +342,9 @@ Object *BlenderSync::sync_object(BL::Depsgraph &b_depsgraph,
|
|||
object->set_random_id(hash_uint2(hash_string(object->name.c_str()), 0));
|
||||
}
|
||||
|
||||
/* lightgroup */
|
||||
object->set_lightgroup(ustring(b_ob.lightgroup()));
|
||||
|
||||
object->tag_update(scene);
|
||||
}
|
||||
|
||||
|
@ -621,10 +629,8 @@ void BlenderSync::sync_objects(BL::Depsgraph &b_depsgraph,
|
|||
bool has_subdivision_modifier = false;
|
||||
BL::MeshSequenceCacheModifier b_mesh_cache(PointerRNA_NULL);
|
||||
|
||||
/* Experimental as Blender does not have good support for procedurals at the moment, also
|
||||
* only available in preview renders since currently do not have a good cache policy, the
|
||||
* data being loaded at once for all the frames. */
|
||||
if (experimental && b_v3d) {
|
||||
/* Experimental as Blender does not have good support for procedurals at the moment. */
|
||||
if (experimental) {
|
||||
b_mesh_cache = object_mesh_cache_find(b_ob, &has_subdivision_modifier);
|
||||
use_procedural = b_mesh_cache && b_mesh_cache.cache_file().use_render_procedural();
|
||||
}
|
||||
|
|
|
@ -1532,6 +1532,8 @@ void BlenderSync::sync_world(BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d,
|
|||
background->set_use_shader(view_layer.use_background_shader ||
|
||||
viewport_parameters.use_custom_shader());
|
||||
|
||||
background->set_lightgroup(ustring(b_world ? b_world.lightgroup() : ""));
|
||||
|
||||
background->tag_update(scene);
|
||||
}
|
||||
|
||||
|
|
|
@ -745,6 +745,20 @@ void BlenderSync::sync_render_passes(BL::RenderLayer &b_rlay, BL::ViewLayer &b_v
|
|||
}
|
||||
}
|
||||
|
||||
/* Light Group passes. */
|
||||
BL::ViewLayer::lightgroups_iterator b_lightgroup_iter;
|
||||
for (b_view_layer.lightgroups.begin(b_lightgroup_iter);
|
||||
b_lightgroup_iter != b_view_layer.lightgroups.end();
|
||||
++b_lightgroup_iter) {
|
||||
BL::Lightgroup b_lightgroup(*b_lightgroup_iter);
|
||||
|
||||
string name = string_printf("Combined_%s", b_lightgroup.name().c_str());
|
||||
|
||||
b_engine.add_pass(name.c_str(), 3, "RGB", b_view_layer.name().c_str());
|
||||
Pass *pass = pass_add(scene, PASS_COMBINED, name.c_str(), PassMode::NOISY);
|
||||
pass->set_lightgroup(ustring(b_lightgroup.name()));
|
||||
}
|
||||
|
||||
scene->film->set_pass_alpha_threshold(b_view_layer.pass_alpha_threshold());
|
||||
}
|
||||
|
||||
|
|
|
@ -19,7 +19,11 @@ endmacro()
|
|||
|
||||
if(CYCLES_STANDALONE_REPOSITORY)
|
||||
if(APPLE)
|
||||
set(_cycles_lib_dir "${CMAKE_SOURCE_DIR}/../lib/darwin")
|
||||
if("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "x86_64")
|
||||
set(_cycles_lib_dir "${CMAKE_SOURCE_DIR}/../lib/darwin")
|
||||
else()
|
||||
set(_cycles_lib_dir "${CMAKE_SOURCE_DIR}/../lib/darwin_arm64")
|
||||
endif()
|
||||
elseif(WIN32)
|
||||
if(CMAKE_CL_64)
|
||||
set(_cycles_lib_dir "${CMAKE_SOURCE_DIR}/../lib/win64_vc15")
|
||||
|
@ -48,18 +52,24 @@ if(CYCLES_STANDALONE_REPOSITORY)
|
|||
endif()
|
||||
endif()
|
||||
|
||||
if(DEFINED _cycles_lib_dir)
|
||||
message(STATUS "Using precompiled libraries at ${_cycles_lib_dir}")
|
||||
endif()
|
||||
|
||||
# Avoid namespace pollustion.
|
||||
unset(LIBDIR_NATIVE_ABI)
|
||||
unset(LIBDIR_CENTOS7_ABI)
|
||||
endif()
|
||||
|
||||
if(EXISTS ${_cycles_lib_dir})
|
||||
_set_default(ALEMBIC_ROOT_DIR "${_cycles_lib_dir}/alembic")
|
||||
_set_default(BOOST_ROOT "${_cycles_lib_dir}/boost")
|
||||
_set_default(BLOSC_ROOT_DIR "${_cycles_lib_dir}/blosc")
|
||||
_set_default(EMBREE_ROOT_DIR "${_cycles_lib_dir}/embree")
|
||||
_set_default(GLEW_ROOT_DIR "${_cycles_lib_dir}/glew")
|
||||
_set_default(JPEG_ROOT "${_cycles_lib_dir}/jpeg")
|
||||
_set_default(LLVM_ROOT_DIR "${_cycles_lib_dir}/llvm")
|
||||
_set_default(CLANG_ROOT_DIR "${_cycles_lib_dir}/llvm")
|
||||
_set_default(OPENCOLORIO_ROOT_DIR "${_cycles_lib_dir}/opencolorio")
|
||||
_set_default(OPENEXR_ROOT_DIR "${_cycles_lib_dir}/openexr")
|
||||
_set_default(OPENIMAGEDENOISE_ROOT_DIR "${_cycles_lib_dir}/openimagedenoise")
|
||||
|
@ -69,6 +79,7 @@ if(CYCLES_STANDALONE_REPOSITORY)
|
|||
_set_default(OPENVDB_ROOT_DIR "${_cycles_lib_dir}/openvdb")
|
||||
_set_default(OSL_ROOT_DIR "${_cycles_lib_dir}/osl")
|
||||
_set_default(PNG_ROOT "${_cycles_lib_dir}/png")
|
||||
_set_default(PUGIXML_ROOT_DIR "${_cycles_lib_dir}/pugixml")
|
||||
_set_default(TBB_ROOT_DIR "${_cycles_lib_dir}/tbb")
|
||||
_set_default(TIFF_ROOT "${_cycles_lib_dir}/tiff")
|
||||
_set_default(ZLIB_ROOT "${_cycles_lib_dir}/zlib")
|
||||
|
@ -80,6 +91,23 @@ if(CYCLES_STANDALONE_REPOSITORY)
|
|||
endif()
|
||||
endif()
|
||||
|
||||
###########################################################################
|
||||
# USD
|
||||
###########################################################################
|
||||
|
||||
if(CYCLES_STANDALONE_REPOSITORY AND WITH_CYCLES_HYDRA_RENDER_DELEGATE)
|
||||
set(WITH_USD ON)
|
||||
endif()
|
||||
if(WITH_CYCLES_HYDRA_RENDER_DELEGATE)
|
||||
find_package(pxr CONFIG REQUIRED PATHS ${PXR_ROOT} ${USD_ROOT} NO_DEFAULT_PATH)
|
||||
if(pxr_FOUND)
|
||||
set(PXR_LIBRARY_DIR ${PXR_CMAKE_DIR}/lib)
|
||||
set(USD_INCLUDE_DIRS ${PXR_INCLUDE_DIRS})
|
||||
else()
|
||||
set(WITH_USD OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
###########################################################################
|
||||
# Zlib
|
||||
###########################################################################
|
||||
|
@ -92,7 +120,7 @@ if(CYCLES_STANDALONE_REPOSITORY)
|
|||
set(ZLIB_LIBRARY ${_cycles_lib_dir}/zlib/lib/libz_st.lib)
|
||||
set(ZLIB_DIR ${_cycles_lib_dir}/zlib)
|
||||
set(ZLIB_FOUND ON)
|
||||
else()
|
||||
elseif(NOT APPLE)
|
||||
find_package(ZLIB REQUIRED)
|
||||
endif()
|
||||
endif()
|
||||
|
@ -126,32 +154,45 @@ if(CYCLES_STANDALONE_REPOSITORY)
|
|||
-DOIIO_STATIC_DEFINE
|
||||
)
|
||||
|
||||
set(OPENIMAGEIO_INCLUDE_DIR ${OPENIMAGEIO_ROOT_DIR}/include)
|
||||
set(OPENIMAGEIO_INCLUDE_DIRS ${OPENIMAGEIO_INCLUDE_DIR} ${OPENIMAGEIO_INCLUDE_DIR}/OpenImageIO)
|
||||
# Special exceptions for libraries which needs explicit debug version
|
||||
set(OPENIMAGEIO_LIBRARY
|
||||
set(OPENIMAGEIO_LIBRARIES
|
||||
optimized ${OPENIMAGEIO_ROOT_DIR}/lib/OpenImageIO.lib
|
||||
optimized ${OPENIMAGEIO_ROOT_DIR}/lib/OpenImageIO_Util.lib
|
||||
debug ${OPENIMAGEIO_ROOT_DIR}/lib/OpenImageIO_d.lib
|
||||
debug ${OPENIMAGEIO_ROOT_DIR}/lib/OpenImageIO_Util_d.lib
|
||||
)
|
||||
endif()
|
||||
|
||||
find_package(OpenImageIO REQUIRED)
|
||||
if(OPENIMAGEIO_PUGIXML_FOUND)
|
||||
set(PUGIXML_INCLUDE_DIR "${OPENIMAGEIO_INCLUDE_DIR/OpenImageIO}")
|
||||
set(PUGIXML_LIBRARIES "")
|
||||
set(PUGIXML_INCLUDE_DIR ${PUGIXML_ROOT_DIR}/include)
|
||||
set(PUGIXML_LIBRARIES
|
||||
optimized ${PUGIXML_ROOT_DIR}/lib/pugixml.lib
|
||||
debug ${PUGIXML_ROOT_DIR}/lib/pugixml_d.lib
|
||||
)
|
||||
else()
|
||||
find_package(PugiXML REQUIRED)
|
||||
find_package(OpenImageIO REQUIRED)
|
||||
if(OPENIMAGEIO_PUGIXML_FOUND)
|
||||
set(PUGIXML_INCLUDE_DIR "${OPENIMAGEIO_INCLUDE_DIR}/OpenImageIO")
|
||||
set(PUGIXML_LIBRARIES "")
|
||||
else()
|
||||
find_package(PugiXML REQUIRED)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Dependencies
|
||||
if(MSVC AND EXISTS ${_cycles_lib_dir})
|
||||
set(OPENJPEG_INCLUDE_DIR ${OPENJPEG}/include/openjpeg-2.3)
|
||||
set(OPENJPEG_LIBRARY ${_cycles_lib_dir}/openjpeg/lib/openjp2${CMAKE_STATIC_LIBRARY_SUFFIX})
|
||||
set(OPENJPEG_LIBRARIES ${_cycles_lib_dir}/openjpeg/lib/openjp2${CMAKE_STATIC_LIBRARY_SUFFIX})
|
||||
else()
|
||||
find_package(OpenJPEG REQUIRED)
|
||||
endif()
|
||||
|
||||
find_package(JPEG REQUIRED)
|
||||
find_package(OpenJPEG REQUIRED)
|
||||
find_package(TIFF REQUIRED)
|
||||
|
||||
if(EXISTS ${_cycles_lib_dir})
|
||||
set(PNG_NAMES png16 libpng16 png libpng)
|
||||
endif()
|
||||
find_package(PNG REQUIRED)
|
||||
endif()
|
||||
|
||||
|
@ -161,76 +202,71 @@ endif()
|
|||
|
||||
if(CYCLES_STANDALONE_REPOSITORY)
|
||||
if(MSVC AND EXISTS ${_cycles_lib_dir})
|
||||
set(OPENEXR_IEX_LIBRARY
|
||||
set(OPENEXR_INCLUDE_DIR ${OPENEXR_ROOT_DIR}/include)
|
||||
set(OPENEXR_INCLUDE_DIRS ${OPENEXR_INCLUDE_DIR} ${OPENEXR_ROOT_DIR}/include/OpenEXR)
|
||||
set(OPENEXR_LIBRARIES
|
||||
optimized ${OPENEXR_ROOT_DIR}/lib/Iex_s.lib
|
||||
debug ${OPENEXR_ROOT_DIR}/lib/Iex_s_d.lib
|
||||
)
|
||||
set(OPENEXR_HALF_LIBRARY
|
||||
optimized ${OPENEXR_ROOT_DIR}/lib/Half_s.lib
|
||||
debug ${OPENEXR_ROOT_DIR}/lib/Half_s_d.lib
|
||||
)
|
||||
set(OPENEXR_ILMIMF_LIBRARY
|
||||
optimized ${OPENEXR_ROOT_DIR}/lib/IlmImf_s.lib
|
||||
debug ${OPENEXR_ROOT_DIR}/lib/IlmImf_s_d.lib
|
||||
)
|
||||
set(OPENEXR_IMATH_LIBRARY
|
||||
optimized ${OPENEXR_ROOT_DIR}/lib/Imath_s.lib
|
||||
debug ${OPENEXR_ROOT_DIR}/lib/Imath_s_d.lib
|
||||
)
|
||||
set(OPENEXR_ILMTHREAD_LIBRARY
|
||||
optimized ${OPENEXR_ROOT_DIR}/lib/IlmThread_s.lib
|
||||
debug ${OPENEXR_ROOT_DIR}/lib/Iex_s_d.lib
|
||||
debug ${OPENEXR_ROOT_DIR}/lib/Half_s_d.lib
|
||||
debug ${OPENEXR_ROOT_DIR}/lib/IlmImf_s_d.lib
|
||||
debug ${OPENEXR_ROOT_DIR}/lib/Imath_s_d.lib
|
||||
debug ${OPENEXR_ROOT_DIR}/lib/IlmThread_s_d.lib
|
||||
)
|
||||
else()
|
||||
find_package(OpenEXR REQUIRED)
|
||||
endif()
|
||||
|
||||
find_package(OpenEXR REQUIRED)
|
||||
endif()
|
||||
|
||||
###########################################################################
|
||||
# OpenShadingLanguage & LLVM
|
||||
###########################################################################
|
||||
|
||||
if(WITH_CYCLES_OSL)
|
||||
if(CYCLES_STANDALONE_REPOSITORY)
|
||||
if(EXISTS ${_cycles_lib_dir})
|
||||
set(LLVM_STATIC ON)
|
||||
endif()
|
||||
if(CYCLES_STANDALONE_REPOSITORY AND WITH_CYCLES_OSL)
|
||||
if(EXISTS ${_cycles_lib_dir})
|
||||
set(LLVM_STATIC ON)
|
||||
endif()
|
||||
|
||||
if(MSVC AND EXISTS ${_cycles_lib_dir})
|
||||
# TODO(sergey): On Windows llvm-config doesn't give proper results for the
|
||||
# library names, use hardcoded libraries for now.
|
||||
file(GLOB _llvm_libs_release ${LLVM_ROOT_DIR}/lib/*.lib)
|
||||
file(GLOB _llvm_libs_debug ${LLVM_ROOT_DIR}/debug/lib/*.lib)
|
||||
set(_llvm_libs)
|
||||
foreach(_llvm_lib_path ${_llvm_libs_release})
|
||||
get_filename_component(_llvm_lib_name ${_llvm_lib_path} ABSOLUTE)
|
||||
list(APPEND _llvm_libs optimized ${_llvm_lib_name})
|
||||
endforeach()
|
||||
foreach(_llvm_lib_path ${_llvm_libs_debug})
|
||||
get_filename_component(_llvm_lib_name ${_llvm_lib_path} ABSOLUTE)
|
||||
list(APPEND _llvm_libs debug ${_llvm_lib_name})
|
||||
endforeach()
|
||||
set(LLVM_LIBRARY ${_llvm_libs})
|
||||
unset(_llvm_lib_name)
|
||||
unset(_llvm_lib_path)
|
||||
unset(_llvm_libs)
|
||||
unset(_llvm_libs_debug)
|
||||
unset(_llvm_libs_release)
|
||||
|
||||
set(OSL_INCLUDE_DIR ${OSL_ROOT_DIR}/include)
|
||||
set(OSL_LIBRARIES
|
||||
optimized ${OSL_ROOT_DIR}/lib/oslcomp.lib
|
||||
optimized ${OSL_ROOT_DIR}/lib/oslexec.lib
|
||||
optimized ${OSL_ROOT_DIR}/lib/oslquery.lib
|
||||
debug ${OSL_ROOT_DIR}/lib/oslcomp_d.lib
|
||||
debug ${OSL_ROOT_DIR}/lib/oslexec_d.lib
|
||||
debug ${OSL_ROOT_DIR}/lib/oslquery_d.lib
|
||||
${PUGIXML_LIBRARIES}
|
||||
)
|
||||
|
||||
find_program(OSL_COMPILER NAMES oslc PATHS ${OSL_ROOT_DIR}/bin)
|
||||
else()
|
||||
find_package(OSL REQUIRED)
|
||||
find_package(LLVM REQUIRED)
|
||||
|
||||
if(MSVC AND EXISTS ${_cycles_lib_dir})
|
||||
# TODO(sergey): On Windows llvm-config doesn't give proper results for the
|
||||
# library names, use hardcoded libraries for now.
|
||||
file(GLOB _llvm_libs_release ${LLVM_ROOT_DIR}/lib/*.lib)
|
||||
file(GLOB _llvm_libs_debug ${LLVM_ROOT_DIR}/debug/lib/*.lib)
|
||||
set(_llvm_libs)
|
||||
foreach(_llvm_lib_path ${_llvm_libs_release})
|
||||
get_filename_component(_llvm_lib_name ${_llvm_lib_path} ABSOLUTE)
|
||||
list(APPEND _llvm_libs optimized ${_llvm_lib_name})
|
||||
endforeach()
|
||||
foreach(_llvm_lib_path ${_llvm_libs_debug})
|
||||
get_filename_component(_llvm_lib_name ${_llvm_lib_path} ABSOLUTE)
|
||||
list(APPEND _llvm_libs debug ${_llvm_lib_name})
|
||||
endforeach()
|
||||
set(LLVM_LIBRARY ${_llvm_libs})
|
||||
unset(_llvm_lib_name)
|
||||
unset(_llvm_lib_path)
|
||||
unset(_llvm_libs)
|
||||
unset(_llvm_libs_debug)
|
||||
unset(_llvm_libs_release)
|
||||
|
||||
set(OSL_LIBRARIES
|
||||
optimized ${OSL_ROOT_DIR}/lib/oslcomp.lib
|
||||
optimized ${OSL_ROOT_DIR}/lib/oslexec.lib
|
||||
optimized ${OSL_ROOT_DIR}/lib/oslquery.lib
|
||||
optimized ${OSL_ROOT_DIR}/lib/pugixml.lib
|
||||
debug ${OSL_ROOT_DIR}/lib/oslcomp_d.lib
|
||||
debug ${OSL_ROOT_DIR}/lib/oslexec_d.lib
|
||||
debug ${OSL_ROOT_DIR}/lib/oslquery_d.lib
|
||||
debug ${OSL_ROOT_DIR}/lib/pugixml_d.lib
|
||||
)
|
||||
endif()
|
||||
find_package(Clang REQUIRED)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
|
@ -238,22 +274,23 @@ endif()
|
|||
# OpenColorIO
|
||||
###########################################################################
|
||||
|
||||
if(WITH_CYCLES_OPENCOLORIO)
|
||||
if(CYCLES_STANDALONE_REPOSITORY)
|
||||
find_package(OpenColorIO REQUIRED)
|
||||
set(WITH_OPENCOLORIO ON)
|
||||
if(CYCLES_STANDALONE_REPOSITORY AND WITH_CYCLES_OPENCOLORIO)
|
||||
set(WITH_OPENCOLORIO ON)
|
||||
|
||||
if(MSVC AND EXISTS ${_cycles_lib_dir})
|
||||
set(OPENCOLORIO_LIBPATH ${_cycles_lib_dir}/opencolorio/lib)
|
||||
set(OPENCOLORIO_LIBRARIES
|
||||
optimized ${OPENCOLORIO_LIBPATH}/OpenColorIO.lib
|
||||
optimized ${OPENCOLORIO_LIBPATH}/tinyxml.lib
|
||||
optimized ${OPENCOLORIO_LIBPATH}/libyaml-cpp.lib
|
||||
debug ${OPENCOLORIO_LIBPATH}/OpencolorIO_d.lib
|
||||
debug ${OPENCOLORIO_LIBPATH}/tinyxml_d.lib
|
||||
debug ${OPENCOLORIO_LIBPATH}/libyaml-cpp_d.lib
|
||||
)
|
||||
endif()
|
||||
if(MSVC AND EXISTS ${_cycles_lib_dir})
|
||||
set(OPENCOLORIO_INCLUDE_DIRS ${OPENCOLORIO_ROOT_DIR}/include)
|
||||
set(OPENCOLORIO_LIBRARIES
|
||||
optimized ${OPENCOLORIO_ROOT_DIR}/lib/OpenColorIO.lib
|
||||
optimized ${OPENCOLORIO_ROOT_DIR}/lib/libyaml-cpp.lib
|
||||
optimized ${OPENCOLORIO_ROOT_DIR}/lib/libexpatMD.lib
|
||||
optimized ${OPENCOLORIO_ROOT_DIR}/lib/pystring.lib
|
||||
debug ${OPENCOLORIO_ROOT_DIR}/lib/OpencolorIO_d.lib
|
||||
debug ${OPENCOLORIO_ROOT_DIR}/lib/libyaml-cpp_d.lib
|
||||
debug ${OPENCOLORIO_ROOT_DIR}/lib/libexpatdMD.lib
|
||||
debug ${OPENCOLORIO_ROOT_DIR}/lib/pystring_d.lib
|
||||
)
|
||||
else()
|
||||
find_package(OpenColorIO REQUIRED)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
|
@ -274,22 +311,61 @@ if(CYCLES_STANDALONE_REPOSITORY)
|
|||
endif()
|
||||
endif()
|
||||
|
||||
set(__boost_packages filesystem regex system thread date_time)
|
||||
if(WITH_CYCLES_OSL)
|
||||
list(APPEND __boost_packages wave)
|
||||
if(MSVC AND EXISTS ${_cycles_lib_dir})
|
||||
set(BOOST_INCLUDE_DIR ${BOOST_ROOT}/include)
|
||||
set(BOOST_VERSION_HEADER ${BOOST_INCLUDE_DIR}/boost/version.hpp)
|
||||
if(EXISTS ${BOOST_VERSION_HEADER})
|
||||
file(STRINGS "${BOOST_VERSION_HEADER}" BOOST_LIB_VERSION REGEX "#define BOOST_LIB_VERSION ")
|
||||
if(BOOST_LIB_VERSION MATCHES "#define BOOST_LIB_VERSION \"([0-9_]+)\"")
|
||||
set(BOOST_VERSION "${CMAKE_MATCH_1}")
|
||||
endif()
|
||||
endif()
|
||||
if(NOT BOOST_VERSION)
|
||||
message(FATAL_ERROR "Unable to determine Boost version")
|
||||
endif()
|
||||
set(BOOST_POSTFIX "vc141-mt-x64-${BOOST_VERSION}.lib")
|
||||
set(BOOST_DEBUG_POSTFIX "vc141-mt-gd-x64-${BOOST_VERSION}.lib")
|
||||
set(BOOST_LIBRARIES
|
||||
optimized ${BOOST_ROOT}/lib/libboost_date_time-${BOOST_POSTFIX}
|
||||
optimized ${BOOST_ROOT}/lib/libboost_iostreams-${BOOST_POSTFIX}
|
||||
optimized ${BOOST_ROOT}/lib/libboost_filesystem-${BOOST_POSTFIX}
|
||||
optimized ${BOOST_ROOT}/lib/libboost_regex-${BOOST_POSTFIX}
|
||||
optimized ${BOOST_ROOT}/lib/libboost_system-${BOOST_POSTFIX}
|
||||
optimized ${BOOST_ROOT}/lib/libboost_thread-${BOOST_POSTFIX}
|
||||
optimized ${BOOST_ROOT}/lib/libboost_chrono-${BOOST_POSTFIX}
|
||||
debug ${BOOST_ROOT}/lib/libboost_date_time-${BOOST_DEBUG_POSTFIX}
|
||||
debug ${BOOST_ROOT}/lib/libboost_iostreams-${BOOST_DEBUG_POSTFIX}
|
||||
debug ${BOOST_ROOT}/lib/libboost_filesystem-${BOOST_DEBUG_POSTFIX}
|
||||
debug ${BOOST_ROOT}/lib/libboost_regex-${BOOST_DEBUG_POSTFIX}
|
||||
debug ${BOOST_ROOT}/lib/libboost_system-${BOOST_DEBUG_POSTFIX}
|
||||
debug ${BOOST_ROOT}/lib/libboost_thread-${BOOST_DEBUG_POSTFIX}
|
||||
debug ${BOOST_ROOT}/lib/libboost_chrono-${BOOST_DEBUG_POSTFIX}
|
||||
)
|
||||
if(WITH_CYCLES_OSL)
|
||||
set(BOOST_LIBRARIES ${BOOST_LIBRARIES}
|
||||
optimized ${BOOST_ROOT}/lib/libboost_wave-${BOOST_POSTFIX}
|
||||
debug ${BOOST_ROOT}/lib/libboost_wave-${BOOST_DEBUG_POSTFIX})
|
||||
endif()
|
||||
else()
|
||||
set(__boost_packages iostreams filesystem regex system thread date_time)
|
||||
if(WITH_CYCLES_OSL)
|
||||
list(APPEND __boost_packages wave)
|
||||
endif()
|
||||
find_package(Boost 1.48 COMPONENTS ${__boost_packages} REQUIRED)
|
||||
if(NOT Boost_FOUND)
|
||||
# Try to find non-multithreaded if -mt not found, this flag
|
||||
# doesn't matter for us, it has nothing to do with thread
|
||||
# safety, but keep it to not disturb build setups.
|
||||
set(Boost_USE_MULTITHREADED OFF)
|
||||
find_package(Boost 1.48 COMPONENTS ${__boost_packages})
|
||||
endif()
|
||||
unset(__boost_packages)
|
||||
|
||||
set(BOOST_INCLUDE_DIR ${Boost_INCLUDE_DIRS})
|
||||
set(BOOST_LIBRARIES ${Boost_LIBRARIES})
|
||||
set(BOOST_LIBPATH ${Boost_LIBRARY_DIRS})
|
||||
endif()
|
||||
find_package(Boost 1.48 COMPONENTS ${__boost_packages} REQUIRED)
|
||||
if(NOT Boost_FOUND)
|
||||
# Try to find non-multithreaded if -mt not found, this flag
|
||||
# doesn't matter for us, it has nothing to do with thread
|
||||
# safety, but keep it to not disturb build setups.
|
||||
set(Boost_USE_MULTITHREADED OFF)
|
||||
find_package(Boost 1.48 COMPONENTS ${__boost_packages})
|
||||
endif()
|
||||
unset(__boost_packages)
|
||||
set(BOOST_INCLUDE_DIR ${Boost_INCLUDE_DIRS})
|
||||
set(BOOST_LIBRARIES ${Boost_LIBRARIES})
|
||||
set(BOOST_LIBPATH ${Boost_LIBRARY_DIRS})
|
||||
|
||||
set(BOOST_DEFINITIONS "-DBOOST_ALL_NO_LIB")
|
||||
endif()
|
||||
|
||||
|
@ -297,47 +373,30 @@ endif()
|
|||
# Embree
|
||||
###########################################################################
|
||||
|
||||
if(WITH_CYCLES_EMBREE)
|
||||
if(CYCLES_STANDALONE_REPOSITORY)
|
||||
if(MSVC AND EXISTS ${_cycles_lib_dir})
|
||||
set(EMBREE_TASKING_LIBRARY
|
||||
optimized ${EMBREE_ROOT_DIR}/lib/tasking.lib
|
||||
debug ${EMBREE_ROOT_DIR}/lib/tasking_d.lib
|
||||
)
|
||||
set(EMBREE_EMBREE3_LIBRARY
|
||||
optimized ${EMBREE_ROOT_DIR}/lib/embree3.lib
|
||||
debug ${EMBREE_ROOT_DIR}/lib/embree3_d.lib
|
||||
)
|
||||
set(EMBREE_EMBREE_AVX_LIBRARY
|
||||
optimized ${EMBREE_ROOT_DIR}/lib/embree_avx.lib
|
||||
debug ${EMBREE_ROOT_DIR}/lib/embree_avx_d.lib
|
||||
)
|
||||
set(EMBREE_EMBREE_AVX2_LIBRARY
|
||||
optimized ${EMBREE_ROOT_DIR}/lib/embree_avx2.lib
|
||||
debug ${EMBREE_ROOT_DIR}/lib/embree_avx2_d.lib
|
||||
)
|
||||
set(EMBREE_EMBREE_SSE42_LIBRARY
|
||||
optimized ${EMBREE_ROOT_DIR}/lib/embree_sse42.lib
|
||||
debug ${EMBREE_ROOT_DIR}/lib/embree_sse42_d.lib
|
||||
)
|
||||
set(EMBREE_LEXERS_LIBRARY
|
||||
optimized ${EMBREE_ROOT_DIR}/lib/lexers.lib
|
||||
debug ${EMBREE_ROOT_DIR}/lib/lexers_d.lib
|
||||
)
|
||||
set(EMBREE_MATH_LIBRARY
|
||||
optimized ${EMBREE_ROOT_DIR}/lib/math.lib
|
||||
debug ${EMBREE_ROOT_DIR}/lib/math_d.lib
|
||||
)
|
||||
set(EMBREE_SIMD_LIBRARY
|
||||
optimized ${EMBREE_ROOT_DIR}/lib/simd.lib
|
||||
debug ${EMBREE_ROOT_DIR}/lib/simd_d.lib
|
||||
)
|
||||
set(EMBREE_SYS_LIBRARY
|
||||
optimized ${EMBREE_ROOT_DIR}/lib/sys.lib
|
||||
debug ${EMBREE_ROOT_DIR}/lib/sys_d.lib
|
||||
)
|
||||
endif()
|
||||
|
||||
if(CYCLES_STANDALONE_REPOSITORY AND WITH_CYCLES_EMBREE)
|
||||
if(MSVC AND EXISTS ${_cycles_lib_dir})
|
||||
set(EMBREE_INCLUDE_DIRS ${EMBREE_ROOT_DIR}/include)
|
||||
set(EMBREE_LIBRARIES
|
||||
optimized ${EMBREE_ROOT_DIR}/lib/embree3.lib
|
||||
optimized ${EMBREE_ROOT_DIR}/lib/embree_avx2.lib
|
||||
optimized ${EMBREE_ROOT_DIR}/lib/embree_avx.lib
|
||||
optimized ${EMBREE_ROOT_DIR}/lib/embree_sse42.lib
|
||||
optimized ${EMBREE_ROOT_DIR}/lib/lexers.lib
|
||||
optimized ${EMBREE_ROOT_DIR}/lib/math.lib
|
||||
optimized ${EMBREE_ROOT_DIR}/lib/simd.lib
|
||||
optimized ${EMBREE_ROOT_DIR}/lib/tasking.lib
|
||||
optimized ${EMBREE_ROOT_DIR}/lib/sys.lib
|
||||
debug ${EMBREE_ROOT_DIR}/lib/embree3_d.lib
|
||||
debug ${EMBREE_ROOT_DIR}/lib/embree_avx2_d.lib
|
||||
debug ${EMBREE_ROOT_DIR}/lib/embree_avx_d.lib
|
||||
debug ${EMBREE_ROOT_DIR}/lib/embree_sse42_d.lib
|
||||
debug ${EMBREE_ROOT_DIR}/lib/lexers_d.lib
|
||||
debug ${EMBREE_ROOT_DIR}/lib/math_d.lib
|
||||
debug ${EMBREE_ROOT_DIR}/lib/simd_d.lib
|
||||
debug ${EMBREE_ROOT_DIR}/lib/sys_d.lib
|
||||
debug ${EMBREE_ROOT_DIR}/lib/tasking_d.lib
|
||||
)
|
||||
else()
|
||||
find_package(Embree 3.8.0 REQUIRED)
|
||||
endif()
|
||||
endif()
|
||||
|
@ -346,29 +405,45 @@ endif()
|
|||
# Logging
|
||||
###########################################################################
|
||||
|
||||
if(WITH_CYCLES_LOGGING)
|
||||
if(CYCLES_STANDALONE_REPOSITORY)
|
||||
find_package(Glog REQUIRED)
|
||||
find_package(Gflags REQUIRED)
|
||||
endif()
|
||||
if(CYCLES_STANDALONE_REPOSITORY AND WITH_CYCLES_LOGGING)
|
||||
find_package(Glog REQUIRED)
|
||||
find_package(Gflags REQUIRED)
|
||||
endif()
|
||||
|
||||
###########################################################################
|
||||
# OpenSubdiv
|
||||
###########################################################################
|
||||
|
||||
if(WITH_CYCLES_OPENSUBDIV)
|
||||
if(CYCLES_STANDALONE_REPOSITORY)
|
||||
find_package(OpenSubdiv REQUIRED)
|
||||
set(WITH_OPENSUBDIV ON)
|
||||
if(WITH_CYCLES_HYDRA_RENDER_DELEGATE AND PXR_LIBRARY_DIR AND (WITH_OPENSUBDIV OR WITH_CYCLES_OPENSUBDIV))
|
||||
find_library(OPENSUBDIV_LIBRARY_CPU_DEBUG_PXR NAMES osdCPU_d osdCPU PATHS ${PXR_LIBRARY_DIR} NO_CACHE NO_DEFAULT_PATH)
|
||||
find_library(OPENSUBDIV_LIBRARY_GPU_DEBUG_PXR NAMES osdGPU_d osdGPU PATHS ${PXR_LIBRARY_DIR} NO_CACHE NO_DEFAULT_PATH)
|
||||
find_library(OPENSUBDIV_LIBRARY_CPU_RELEASE_PXR NAMES osdCPU PATHS ${PXR_LIBRARY_DIR} NO_CACHE NO_DEFAULT_PATH)
|
||||
find_library(OPENSUBDIV_LIBRARY_GPU_RELEASE_PXR NAMES osdGPU PATHS ${PXR_LIBRARY_DIR} NO_CACHE NO_DEFAULT_PATH)
|
||||
if(OPENSUBDIV_LIBRARY_CPU_RELEASE_PXR AND OPENSUBDIV_LIBRARY_GPU_RELEASE_PXR)
|
||||
set(OPENSUBDIV_INCLUDE_DIRS ${PXR_INCLUDE_DIRS})
|
||||
set(OPENSUBDIV_LIBRARIES
|
||||
optimized ${OPENSUBDIV_LIBRARY_CPU_RELEASE_PXR}
|
||||
optimized ${OPENSUBDIV_LIBRARY_GPU_RELEASE_PXR}
|
||||
debug ${OPENSUBDIV_LIBRARY_CPU_DEBUG_PXR}
|
||||
debug ${OPENSUBDIV_LIBRARY_GPU_DEBUG_PXR}
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(CYCLES_STANDALONE_REPOSITORY AND WITH_CYCLES_OPENSUBDIV)
|
||||
set(WITH_OPENSUBDIV ON)
|
||||
|
||||
if(NOT OPENSUBDIV_LIBRARY_CPU_RELEASE_PXR OR NOT OPENSUBDIV_LIBRARY_GPU_RELEASE_PXR)
|
||||
if(MSVC AND EXISTS ${_cycles_lib_dir})
|
||||
set(OPENSUBDIV_INCLUDE_DIRS ${OPENSUBDIV_ROOT_DIR}/include)
|
||||
set(OPENSUBDIV_LIBRARIES
|
||||
optimized ${OPENSUBDIV_ROOT_DIR}/lib/osdCPU.lib
|
||||
optimized ${OPENSUBDIV_ROOT_DIR}/lib/osdGPU.lib
|
||||
debug ${OPENSUBDIV_ROOT_DIR}/lib/osdCPU_d.lib
|
||||
debug ${OPENSUBDIV_ROOT_DIR}/lib/osdGPU_d.lib
|
||||
)
|
||||
else()
|
||||
find_package(OpenSubdiv REQUIRED)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
@ -377,18 +452,29 @@ endif()
|
|||
# OpenVDB
|
||||
###########################################################################
|
||||
|
||||
if(WITH_CYCLES_OPENVDB)
|
||||
if(CYCLES_STANDALONE_REPOSITORY)
|
||||
if(WITH_CYCLES_HYDRA_RENDER_DELEGATE AND PXR_LIBRARY_DIR AND (WITH_OPENVDB OR WITH_CYCLES_OPENVDB))
|
||||
find_library(OPENVDB_LIBRARY_PXR NAMES openvdb PATHS ${PXR_LIBRARY_DIR} NO_CACHE NO_DEFAULT_PATH)
|
||||
if(OPENVDB_LIBRARY_PXR)
|
||||
set(OPENVDB_INCLUDE_DIRS ${PXR_INCLUDE_DIRS})
|
||||
set(OPENVDB_LIBRARIES ${OPENVDB_LIBRARY_PXR})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(CYCLES_STANDALONE_REPOSITORY AND WITH_CYCLES_OPENVDB)
|
||||
set(WITH_OPENVDB ON)
|
||||
set(OPENVDB_DEFINITIONS -DNOMINMAX -D_USE_MATH_DEFINES)
|
||||
|
||||
if(NOT OPENVDB_LIBRARY_PXR)
|
||||
find_package(OpenVDB REQUIRED)
|
||||
|
||||
if(MSVC AND EXISTS ${_cycles_lib_dir})
|
||||
set(BLOSC_LIBRARY
|
||||
optimized ${BLOSC_ROOT_DIR}/lib/libblosc.lib
|
||||
debug ${BLOSC_ROOT_DIR}/lib/libblosc_d.lib)
|
||||
optimized ${BLOSC_ROOT_DIR}/lib/libblosc.lib
|
||||
debug ${BLOSC_ROOT_DIR}/lib/libblosc_d.lib
|
||||
)
|
||||
else()
|
||||
find_package(Blosc REQUIRED)
|
||||
endif()
|
||||
|
||||
find_package(OpenVDB REQUIRED)
|
||||
find_package(Blosc REQUIRED)
|
||||
set(WITH_OPENVDB ON)
|
||||
set(OPENVDB_DEFINITIONS -DNOMINMAX -D_USE_MATH_DEFINES)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
|
@ -396,21 +482,21 @@ endif()
|
|||
# OpenImageDenoise
|
||||
###########################################################################
|
||||
|
||||
if(WITH_CYCLES_OPENIMAGEDENOISE)
|
||||
if(CYCLES_STANDALONE_REPOSITORY)
|
||||
if(CYCLES_STANDALONE_REPOSITORY AND WITH_CYCLES_OPENIMAGEDENOISE)
|
||||
set(WITH_OPENIMAGEDENOISE ON)
|
||||
|
||||
if(MSVC AND EXISTS ${_cycles_lib_dir})
|
||||
set(OPENIMAGEDENOISE_INCLUDE_DIRS ${OPENIMAGEDENOISE_ROOT_DIR}/include)
|
||||
set(OPENIMAGEDENOISE_LIBRARIES
|
||||
optimized ${OPENIMAGEDENOISE_ROOT_DIR}/lib/OpenImageDenoise.lib
|
||||
optimized ${OPENIMAGEDENOISE_ROOT_DIR}/lib/common.lib
|
||||
optimized ${OPENIMAGEDENOISE_ROOT_DIR}/lib/dnnl.lib
|
||||
debug ${OPENIMAGEDENOISE_ROOT_DIR}/lib/OpenImageDenoise_d.lib
|
||||
debug ${OPENIMAGEDENOISE_ROOT_DIR}/lib/common_d.lib
|
||||
debug ${OPENIMAGEDENOISE_ROOT_DIR}/lib/dnnl_d.lib
|
||||
)
|
||||
else()
|
||||
find_package(OpenImageDenoise REQUIRED)
|
||||
set(WITH_OPENIMAGEDENOISE ON)
|
||||
|
||||
if(MSVC AND EXISTS ${_cycles_lib_dir})
|
||||
set(OPENIMAGEDENOISE_LIBRARIES
|
||||
optimized ${OPENIMAGEDENOISE_ROOT_DIR}/lib/OpenImageDenoise.lib
|
||||
optimized ${OPENIMAGEDENOISE_ROOT_DIR}/lib/common.lib
|
||||
optimized ${OPENIMAGEDENOISE_ROOT_DIR}/lib/dnnl.lib
|
||||
debug ${OPENIMAGEDENOISE_ROOT_DIR}/lib/OpenImageDenoise_d.lib
|
||||
debug ${OPENIMAGEDENOISE_ROOT_DIR}/lib/common_d.lib
|
||||
debug ${OPENIMAGEDENOISE_ROOT_DIR}/lib/dnnl_d.lib)
|
||||
endif()
|
||||
|
||||
endif()
|
||||
endif()
|
||||
|
||||
|
@ -418,15 +504,30 @@ endif()
|
|||
# TBB
|
||||
###########################################################################
|
||||
|
||||
if(CYCLES_STANDALONE_REPOSITORY)
|
||||
if(MSVC AND EXISTS ${_cycles_lib_dir})
|
||||
set(TBB_LIBRARY
|
||||
optimized ${TBB_ROOT_DIR}/lib/tbb.lib
|
||||
debug ${TBB_ROOT_DIR}/lib/debug/tbb_debug.lib
|
||||
if(WITH_CYCLES_HYDRA_RENDER_DELEGATE AND PXR_LIBRARY_DIR)
|
||||
find_library(TBB_LIBRARY_DEBUG_PXR NAMES tbb_debug tbb PATHS ${PXR_LIBRARY_DIR} NO_CACHE NO_DEFAULT_PATH)
|
||||
find_library(TBB_LIBRARY_RELEASE_PXR NAMES tbb PATHS ${PXR_LIBRARY_DIR} NO_CACHE NO_DEFAULT_PATH)
|
||||
if(TBB_LIBRARY_RELEASE_PXR)
|
||||
set(TBB_INCLUDE_DIRS ${PXR_INCLUDE_DIRS})
|
||||
set(TBB_LIBRARIES
|
||||
optimized ${TBB_LIBRARY_RELEASE_PXR}
|
||||
debug ${TBB_LIBRARY_DEBUG_PXR}
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
find_package(TBB REQUIRED)
|
||||
if(CYCLES_STANDALONE_REPOSITORY)
|
||||
if(NOT TBB_LIBRARY_RELEASE_PXR)
|
||||
if(MSVC AND EXISTS ${_cycles_lib_dir})
|
||||
set(TBB_INCLUDE_DIRS ${TBB_ROOT_DIR}/include)
|
||||
set(TBB_LIBRARIES
|
||||
optimized ${TBB_ROOT_DIR}/lib/tbb.lib
|
||||
debug ${TBB_ROOT_DIR}/lib/tbb_debug.lib
|
||||
)
|
||||
else()
|
||||
find_package(TBB REQUIRED)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
###########################################################################
|
||||
|
@ -434,16 +535,41 @@ endif()
|
|||
###########################################################################
|
||||
|
||||
if(CYCLES_STANDALONE_REPOSITORY)
|
||||
if(MSVC AND EXISTS ${_cycles_lib_dir})
|
||||
set(GLEW_LIBRARY "${_cycles_lib_dir}/opengl/lib/glew.lib")
|
||||
set(GLEW_INCLUDE_DIR "${_cycles_lib_dir}/opengl/include")
|
||||
add_definitions(-DGLEW_STATIC)
|
||||
endif()
|
||||
if((WITH_CYCLES_STANDALONE AND WITH_CYCLES_STANDALONE_GUI) OR
|
||||
WITH_CYCLES_HYDRA_RENDER_DELEGATE)
|
||||
if(MSVC AND EXISTS ${_cycles_lib_dir})
|
||||
set(GLEW_LIBRARY "${_cycles_lib_dir}/opengl/lib/glew.lib")
|
||||
set(GLEW_INCLUDE_DIR "${_cycles_lib_dir}/opengl/include")
|
||||
add_definitions(-DGLEW_STATIC)
|
||||
else()
|
||||
find_package(GLEW REQUIRED)
|
||||
endif()
|
||||
|
||||
find_package(GLEW REQUIRED)
|
||||
set(CYCLES_GLEW_LIBRARIES ${GLEW_LIBRARY})
|
||||
endif()
|
||||
else()
|
||||
# Workaround for unconventional variable name use in Blender.
|
||||
set(GLEW_INCLUDE_DIR "${GLEW_INCLUDE_PATH}")
|
||||
set(CYCLES_GLEW_LIBRARIES bf_intern_glew_mx ${BLENDER_GLEW_LIBRARIES})
|
||||
endif()
|
||||
|
||||
###########################################################################
|
||||
# Alembic
|
||||
###########################################################################
|
||||
|
||||
if(WITH_CYCLES_ALEMBIC)
|
||||
if(CYCLES_STANDALONE_REPOSITORY)
|
||||
if(MSVC AND EXISTS ${_cycles_lib_dir})
|
||||
set(ALEMBIC_INCLUDE_DIRS ${_cycles_lib_dir}/alembic/include)
|
||||
set(ALEMBIC_LIBRARIES
|
||||
optimized ${_cycles_lib_dir}/alembic/lib/Alembic.lib
|
||||
debug ${_cycles_lib_dir}/alembic/lib/Alembic_d.lib)
|
||||
else()
|
||||
find_package(Alembic REQUIRED)
|
||||
endif()
|
||||
|
||||
set(WITH_ALEMBIC ON)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
###########################################################################
|
||||
|
@ -453,29 +579,25 @@ endif()
|
|||
# Detect system libraries again
|
||||
if(EXISTS ${_cycles_lib_dir})
|
||||
unset(CMAKE_IGNORE_PATH)
|
||||
unset(_cycles_lib_dir)
|
||||
endif()
|
||||
|
||||
###########################################################################
|
||||
# OpenGL
|
||||
###########################################################################
|
||||
|
||||
if(CYCLES_STANDALONE_REPOSITORY)
|
||||
if(NOT DEFINED OpenGL_GL_PREFERENCE)
|
||||
set(OpenGL_GL_PREFERENCE "LEGACY")
|
||||
if(WITH_CYCLES_STANDALONE AND WITH_CYCLES_STANDALONE_GUI)
|
||||
if(CYCLES_STANDALONE_REPOSITORY)
|
||||
if(NOT DEFINED OpenGL_GL_PREFERENCE)
|
||||
set(OpenGL_GL_PREFERENCE "LEGACY")
|
||||
endif()
|
||||
|
||||
find_package(OpenGL REQUIRED)
|
||||
|
||||
set(CYCLES_GL_LIBRARIES ${OPENGL_gl_LIBRARY})
|
||||
else()
|
||||
set(CYCLES_GL_LIBRARIES ${BLENDER_GL_LIBRARIES})
|
||||
endif()
|
||||
|
||||
find_package(OpenGL REQUIRED)
|
||||
|
||||
set(CYCLES_GL_LIBRARIES
|
||||
${OPENGL_gl_LIBRARY}
|
||||
${OPENGL_glu_LIBRARY}
|
||||
${GLEW_LIBRARY}
|
||||
)
|
||||
else()
|
||||
set(CYCLES_GL_LIBRARIES
|
||||
bf_intern_glew_mx
|
||||
${BLENDER_GL_LIBRARIES}
|
||||
${BLENDER_GLEW_LIBRARIES})
|
||||
endif()
|
||||
|
||||
###########################################################################
|
||||
|
@ -485,7 +607,7 @@ endif()
|
|||
if(WITH_CYCLES_STANDALONE AND WITH_CYCLES_STANDALONE_GUI)
|
||||
# We can't use the version from the Blender precompiled libraries because
|
||||
# it does not include the video subsystem.
|
||||
find_package(SDL2)
|
||||
find_package(SDL2 REQUIRED)
|
||||
|
||||
if(NOT SDL2_FOUND)
|
||||
set(WITH_CYCLES_STANDALONE_GUI OFF)
|
||||
|
@ -516,7 +638,6 @@ if(WITH_CYCLES_CUDA_BINARIES OR NOT WITH_CUDA_DYNLOAD)
|
|||
endif()
|
||||
endif()
|
||||
|
||||
|
||||
###########################################################################
|
||||
# HIP
|
||||
###########################################################################
|
||||
|
@ -554,4 +675,15 @@ if(WITH_CYCLES_DEVICE_METAL)
|
|||
endif()
|
||||
endif()
|
||||
|
||||
unset(_cycles_lib_dir)
|
||||
###########################################################################
|
||||
# macOS
|
||||
###########################################################################
|
||||
|
||||
if(CYCLES_STANDALONE_REPOSITORY)
|
||||
# On macOS, always use zlib from system.
|
||||
if(APPLE)
|
||||
set(ZLIB_ROOT /usr)
|
||||
find_package(ZLIB REQUIRED)
|
||||
find_package(PNG REQUIRED)
|
||||
endif()
|
||||
endif()
|
||||
|
|
|
@ -73,30 +73,39 @@ macro(cycles_add_library target library_deps)
|
|||
cycles_set_solution_folder(${target})
|
||||
endmacro()
|
||||
|
||||
macro(cycles_target_link_libraries target)
|
||||
macro(cycles_external_libraries_append libraries)
|
||||
if(WITH_CYCLES_LOGGING)
|
||||
target_link_libraries(${target} ${GLOG_LIBRARIES} ${GFLAGS_LIBRARIES})
|
||||
list(APPEND ${libraries} ${GLOG_LIBRARIES} ${GFLAGS_LIBRARIES})
|
||||
endif()
|
||||
if(WITH_CYCLES_OSL)
|
||||
target_link_libraries(${target} ${OSL_LIBRARIES} ${LLVM_LIBRARY})
|
||||
list(APPEND ${libraries} ${OSL_LIBRARIES} ${CLANG_LIBRARIES} ${LLVM_LIBRARY})
|
||||
endif()
|
||||
if(WITH_CYCLES_EMBREE)
|
||||
target_link_libraries(${target} ${EMBREE_LIBRARIES})
|
||||
list(APPEND ${libraries} ${EMBREE_LIBRARIES})
|
||||
endif()
|
||||
if(WITH_OPENSUBDIV)
|
||||
target_link_libraries(${target} ${OPENSUBDIV_LIBRARIES})
|
||||
list(APPEND ${libraries} ${OPENSUBDIV_LIBRARIES})
|
||||
endif()
|
||||
if(WITH_OPENCOLORIO)
|
||||
target_link_libraries(${target} ${OPENCOLORIO_LIBRARIES})
|
||||
list(APPEND ${libraries} ${OPENCOLORIO_LIBRARIES})
|
||||
if(APPLE)
|
||||
list(APPEND ${libraries} "-framework IOKit")
|
||||
endif()
|
||||
endif()
|
||||
if(WITH_OPENVDB)
|
||||
target_link_libraries(${target} ${OPENVDB_LIBRARIES} ${BLOSC_LIBRARIES})
|
||||
list(APPEND ${libraries} ${OPENVDB_LIBRARIES} ${BLOSC_LIBRARIES})
|
||||
endif()
|
||||
if(WITH_OPENIMAGEDENOISE)
|
||||
target_link_libraries(${target} ${OPENIMAGEDENOISE_LIBRARIES})
|
||||
list(APPEND ${libraries} ${OPENIMAGEDENOISE_LIBRARIES})
|
||||
if(APPLE AND "${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64")
|
||||
list(APPEND ${libraries} "-framework Accelerate")
|
||||
endif()
|
||||
endif()
|
||||
target_link_libraries(
|
||||
${target}
|
||||
if(WITH_ALEMBIC)
|
||||
list(APPEND ${libraries} ${ALEMBIC_LIBRARIES})
|
||||
endif()
|
||||
|
||||
list(APPEND ${libraries}
|
||||
${OPENIMAGEIO_LIBRARIES}
|
||||
${PNG_LIBRARIES}
|
||||
${JPEG_LIBRARIES}
|
||||
|
@ -115,26 +124,26 @@ macro(cycles_target_link_libraries target)
|
|||
|
||||
if(WITH_CYCLES_DEVICE_CUDA OR WITH_CYCLES_DEVICE_OPTIX)
|
||||
if(WITH_CUDA_DYNLOAD)
|
||||
target_link_libraries(${target} extern_cuew)
|
||||
list(APPEND ${libraries} extern_cuew)
|
||||
else()
|
||||
target_link_libraries(${target} ${CUDA_CUDA_LIBRARY})
|
||||
list(APPEND ${libraries} ${CUDA_CUDA_LIBRARY})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_CYCLES_DEVICE_HIP AND WITH_HIP_DYNLOAD)
|
||||
target_link_libraries(${target} extern_hipew)
|
||||
list(APPEND ${libraries} extern_hipew)
|
||||
endif()
|
||||
|
||||
if(UNIX AND NOT APPLE)
|
||||
if(CYCLES_STANDALONE_REPOSITORY)
|
||||
target_link_libraries(${target} extern_libc_compat)
|
||||
list(APPEND ${libraries} extern_libc_compat)
|
||||
else()
|
||||
target_link_libraries(${target} bf_intern_libc_compat)
|
||||
list(APPEND ${libraries} bf_intern_libc_compat)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT CYCLES_STANDALONE_REPOSITORY)
|
||||
target_link_libraries(${target} bf_intern_guardedalloc)
|
||||
list(APPEND ${libraries} bf_intern_guardedalloc)
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
|
@ -144,13 +153,13 @@ macro(cycles_install_libraries target)
|
|||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
install(
|
||||
FILES
|
||||
${TBB_ROOT_DIR}/lib/debug/tbb_debug${CMAKE_SHARED_LIBRARY_SUFFIX}
|
||||
${TBB_ROOT_DIR}/bin/tbb_debug${CMAKE_SHARED_LIBRARY_SUFFIX}
|
||||
${OPENVDB_ROOT_DIR}/bin/openvdb_d${CMAKE_SHARED_LIBRARY_SUFFIX}
|
||||
DESTINATION $<TARGET_FILE_DIR:${target}>)
|
||||
else()
|
||||
install(
|
||||
FILES
|
||||
${TBB_ROOT_DIR}/lib/tbb${CMAKE_SHARED_LIBRARY_SUFFIX}
|
||||
${TBB_ROOT_DIR}/bin/tbb${CMAKE_SHARED_LIBRARY_SUFFIX}
|
||||
${OPENVDB_ROOT_DIR}/bin/openvdb${CMAKE_SHARED_LIBRARY_SUFFIX}
|
||||
DESTINATION $<TARGET_FILE_DIR:${target}>)
|
||||
endif()
|
||||
|
|
|
@ -8,7 +8,6 @@ set(INC
|
|||
|
||||
set(INC_SYS
|
||||
${GLEW_INCLUDE_DIR}
|
||||
../../../extern/clew/include
|
||||
)
|
||||
|
||||
if(WITH_CYCLES_DEVICE_OPTIX OR WITH_CYCLES_DEVICE_CUDA)
|
||||
|
|
|
@ -13,6 +13,14 @@ set(INC_SYS
|
|||
${GLEW_INCLUDE_DIR}
|
||||
)
|
||||
|
||||
set(LIB
|
||||
cycles_scene
|
||||
cycles_session
|
||||
cycles_graph
|
||||
${CYCLES_GLEW_LIBRARIES}
|
||||
)
|
||||
cycles_external_libraries_append(LIB)
|
||||
|
||||
set(INC_HD_CYCLES
|
||||
attribute.h
|
||||
camera.h
|
||||
|
@ -63,9 +71,6 @@ if(WITH_OPENVDB)
|
|||
list(APPEND INC_SYS
|
||||
${OPENVDB_INCLUDE_DIRS}
|
||||
)
|
||||
list(APPEND LIB
|
||||
${OPENVDB_LIBRARIES}
|
||||
)
|
||||
endif()
|
||||
|
||||
include_directories(${INC})
|
||||
|
@ -91,35 +96,14 @@ target_compile_definitions(hdCyclesStatic
|
|||
)
|
||||
|
||||
target_link_libraries(hdCyclesStatic
|
||||
PUBLIC
|
||||
hd
|
||||
hgi
|
||||
hgiGL
|
||||
PRIVATE
|
||||
${USD_LIBRARY_DIR}/${PXR_LIB_PREFIX}hd${CMAKE_LINK_LIBRARY_SUFFIX}
|
||||
${USD_LIBRARY_DIR}/${PXR_LIB_PREFIX}plug${CMAKE_LINK_LIBRARY_SUFFIX}
|
||||
${USD_LIBRARY_DIR}/${PXR_LIB_PREFIX}tf${CMAKE_LINK_LIBRARY_SUFFIX}
|
||||
${USD_LIBRARY_DIR}/${PXR_LIB_PREFIX}trace${CMAKE_LINK_LIBRARY_SUFFIX}
|
||||
${USD_LIBRARY_DIR}/${PXR_LIB_PREFIX}vt${CMAKE_LINK_LIBRARY_SUFFIX}
|
||||
${USD_LIBRARY_DIR}/${PXR_LIB_PREFIX}work${CMAKE_LINK_LIBRARY_SUFFIX}
|
||||
${USD_LIBRARY_DIR}/${PXR_LIB_PREFIX}sdf${CMAKE_LINK_LIBRARY_SUFFIX}
|
||||
${USD_LIBRARY_DIR}/${PXR_LIB_PREFIX}cameraUtil${CMAKE_LINK_LIBRARY_SUFFIX}
|
||||
${USD_LIBRARY_DIR}/${PXR_LIB_PREFIX}hf${CMAKE_LINK_LIBRARY_SUFFIX}
|
||||
${USD_LIBRARY_DIR}/${PXR_LIB_PREFIX}pxOsd${CMAKE_LINK_LIBRARY_SUFFIX}
|
||||
${USD_LIBRARY_DIR}/${PXR_LIB_PREFIX}gf${CMAKE_LINK_LIBRARY_SUFFIX}
|
||||
${USD_LIBRARY_DIR}/${PXR_LIB_PREFIX}arch${CMAKE_LINK_LIBRARY_SUFFIX}
|
||||
${USD_LIBRARY_DIR}/${PXR_LIB_PREFIX}hgi${CMAKE_LINK_LIBRARY_SUFFIX}
|
||||
${USD_LIBRARY_DIR}/${PXR_LIB_PREFIX}glf${CMAKE_LINK_LIBRARY_SUFFIX}
|
||||
${USD_LIBRARY_DIR}/${PXR_LIB_PREFIX}hdx${CMAKE_LINK_LIBRARY_SUFFIX}
|
||||
${USD_LIBRARY_DIR}/${PXR_LIB_PREFIX}usdGeom${CMAKE_LINK_LIBRARY_SUFFIX}
|
||||
cycles_scene
|
||||
cycles_session
|
||||
cycles_graph
|
||||
${LIB}
|
||||
)
|
||||
|
||||
if(USD_PYTHON_LIBRARIES)
|
||||
target_link_libraries(hdCyclesStatic
|
||||
PRIVATE
|
||||
${USD_PYTHON_LIBRARIES}
|
||||
)
|
||||
endif()
|
||||
|
||||
set(HdCyclesPluginName hdCycles)
|
||||
add_library(${HdCyclesPluginName} SHARED
|
||||
plugin.h
|
||||
|
@ -144,14 +128,6 @@ target_link_libraries(${HdCyclesPluginName}
|
|||
hdCyclesStatic
|
||||
)
|
||||
|
||||
target_link_directories(${HdCyclesPluginName}
|
||||
BEFORE
|
||||
PRIVATE
|
||||
${USD_LIBRARY_DIR}
|
||||
)
|
||||
|
||||
cycles_target_link_libraries(${HdCyclesPluginName})
|
||||
|
||||
if(WITH_CYCLES_BLENDER)
|
||||
set(CYCLES_HYDRA_INSTALL_PATH "../")
|
||||
else()
|
||||
|
@ -162,9 +138,10 @@ endif()
|
|||
|
||||
delayed_install("" $<TARGET_FILE:${HdCyclesPluginName}> ${CYCLES_HYDRA_INSTALL_PATH})
|
||||
|
||||
set(PLUG_INFO_ROOT "..")
|
||||
set(PLUG_INFO_LIBRARY_PATH "../${HdCyclesPluginName}${CMAKE_SHARED_LIBRARY_SUFFIX}")
|
||||
set(PLUG_INFO_RESOURCE_PATH "resources")
|
||||
set(PLUG_INFO_ROOT "..")
|
||||
|
||||
file(RELATIVE_PATH PLUG_INFO_LIBRARY_PATH "${CYCLES_HYDRA_INSTALL_PATH}/${HdCyclesPluginName}" "${CYCLES_HYDRA_INSTALL_PATH}/${HdCyclesPluginName}${CMAKE_SHARED_LIBRARY_SUFFIX}")
|
||||
file(RELATIVE_PATH PLUG_INFO_RESOURCE_PATH "${CYCLES_HYDRA_INSTALL_PATH}/${HdCyclesPluginName}" "${CYCLES_INSTALL_PATH}")
|
||||
|
||||
configure_file(resources/plugInfo.json
|
||||
${CMAKE_CURRENT_BINARY_DIR}/resources/plugInfo.json
|
||||
|
|
|
@ -13,6 +13,15 @@ HDCYCLES_NAMESPACE_OPEN_SCOPE
|
|||
|
||||
extern Transform convert_transform(const GfMatrix4d &matrix);
|
||||
|
||||
#if PXR_VERSION < 2102
|
||||
// clang-format off
|
||||
TF_DEFINE_PRIVATE_TOKENS(_tokens,
|
||||
(projection)
|
||||
(orthographic)
|
||||
);
|
||||
// clang-format on
|
||||
#endif
|
||||
|
||||
HdCyclesCamera::HdCyclesCamera(const SdfPath &sprimId) : HdCamera(sprimId)
|
||||
{
|
||||
#if PXR_VERSION >= 2102
|
||||
|
@ -73,14 +82,15 @@ void HdCyclesCamera::Sync(HdSceneDelegate *sceneDelegate,
|
|||
}
|
||||
#endif
|
||||
|
||||
#if PXR_VERSION < 2111
|
||||
if (*dirtyBits & DirtyBits::DirtyProjMatrix) {
|
||||
value = sceneDelegate->GetCameraParamValue(id, HdCameraTokens->projectionMatrix);
|
||||
if (!value.IsEmpty()) {
|
||||
_projectionMatrix = value.Get<GfMatrix4d>();
|
||||
const float focalLength = _data.GetFocalLength(); // Get default focal length
|
||||
#if PXR_VERSION >= 2102
|
||||
# if PXR_VERSION >= 2102
|
||||
_data.SetFromViewAndProjectionMatrix(GetViewMatrix(), _projectionMatrix, focalLength);
|
||||
#else
|
||||
# else
|
||||
if (_projectionMatrix[2][3] < -0.5) {
|
||||
_data.SetProjection(GfCamera::Perspective);
|
||||
|
||||
|
@ -110,9 +120,10 @@ void HdCyclesCamera::Sync(HdSceneDelegate *sceneDelegate,
|
|||
_data.SetClippingRange(
|
||||
GfRange1f(nearPlusFarHalf + nearMinusFarHalf, nearPlusFarHalf - nearMinusFarHalf));
|
||||
}
|
||||
#endif
|
||||
# endif
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (*dirtyBits & DirtyBits::DirtyWindowPolicy) {
|
||||
value = sceneDelegate->GetCameraParamValue(id, HdCameraTokens->windowPolicy);
|
||||
|
@ -137,11 +148,10 @@ void HdCyclesCamera::Sync(HdSceneDelegate *sceneDelegate,
|
|||
GfCamera::Orthographic);
|
||||
}
|
||||
#else
|
||||
value = sceneDelegate->GetCameraParamValue(id, UsdGeomTokens->projection);
|
||||
value = sceneDelegate->GetCameraParamValue(id, _tokens->projection);
|
||||
if (!value.IsEmpty()) {
|
||||
_data.SetProjection(value.Get<TfToken>() != UsdGeomTokens->orthographic ?
|
||||
GfCamera::Perspective :
|
||||
GfCamera::Orthographic);
|
||||
_data.SetProjection(value.Get<TfToken>() != _tokens->orthographic ? GfCamera::Perspective :
|
||||
GfCamera::Orthographic);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -40,5 +40,6 @@ class Session;
|
|||
class SessionParams;
|
||||
class Shader;
|
||||
class ShaderGraph;
|
||||
class ShaderNode;
|
||||
class Volume;
|
||||
} // namespace CCL_NS
|
||||
|
|
|
@ -12,11 +12,13 @@
|
|||
|
||||
HDCYCLES_NAMESPACE_OPEN_SCOPE
|
||||
|
||||
#if PXR_VERSION < 2108
|
||||
// clang-format off
|
||||
TF_DEFINE_PRIVATE_TOKENS(_tokens,
|
||||
(fieldName)
|
||||
);
|
||||
// clang-format on
|
||||
#endif
|
||||
|
||||
#ifdef WITH_OPENVDB
|
||||
class HdCyclesVolumeLoader : public VDBImageLoader {
|
||||
|
|
|
@ -40,8 +40,6 @@ TF_DEFINE_PRIVATE_TOKENS(CyclesMaterialTokens,
|
|||
);
|
||||
// clang-format on
|
||||
|
||||
namespace {
|
||||
|
||||
// Simple class to handle remapping of USDPreviewSurface nodes and parameters to Cycles equivalents
|
||||
class UsdToCyclesMapping {
|
||||
using ParamMap = std::unordered_map<TfToken, ustring, TfToken::HashFunctor>;
|
||||
|
@ -130,6 +128,8 @@ class UsdToCyclesTexture : public UsdToCyclesMapping {
|
|||
}
|
||||
};
|
||||
|
||||
namespace {
|
||||
|
||||
class UsdToCycles {
|
||||
const UsdToCyclesMapping UsdPreviewSurface = {
|
||||
"principled_bsdf",
|
||||
|
@ -183,11 +183,6 @@ TfStaticData<UsdToCycles> sUsdToCyles;
|
|||
|
||||
} // namespace
|
||||
|
||||
struct HdCyclesMaterial::NodeDesc {
|
||||
ShaderNode *node;
|
||||
const UsdToCyclesMapping *mapping;
|
||||
};
|
||||
|
||||
HdCyclesMaterial::HdCyclesMaterial(const SdfPath &sprimId) : HdMaterial(sprimId)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -34,9 +34,12 @@ class HdCyclesMaterial final : public PXR_NS::HdMaterial {
|
|||
return _shader;
|
||||
}
|
||||
|
||||
struct NodeDesc;
|
||||
|
||||
private:
|
||||
struct NodeDesc {
|
||||
CCL_NS::ShaderNode *node;
|
||||
const class UsdToCyclesMapping *mapping;
|
||||
};
|
||||
|
||||
void Initialize(PXR_NS::HdRenderParam *renderParam);
|
||||
|
||||
void UpdateParameters(NodeDesc &nodeDesc,
|
||||
|
|
|
@ -273,7 +273,8 @@ template<typename MatrixArray> array<Transform> convertToCyclesTransformArray(co
|
|||
array<Transform> cyclesArray;
|
||||
cyclesArray.reserve(valueData.size());
|
||||
for (const auto &element : valueData) {
|
||||
cyclesArray.push_back_reserved(convertMatrixToCycles<MatrixArray::value_type>(element));
|
||||
cyclesArray.push_back_reserved(
|
||||
convertMatrixToCycles<typename MatrixArray::value_type>(element));
|
||||
}
|
||||
return cyclesArray;
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
#include "util/log.h"
|
||||
#include "util/path.h"
|
||||
|
||||
#include <pxr/base/arch/filesystem.h>
|
||||
#include <pxr/base/arch/fileSystem.h>
|
||||
#include <pxr/base/plug/plugin.h>
|
||||
#include <pxr/base/plug/thisPlugin.h>
|
||||
#include <pxr/base/tf/envSetting.h>
|
||||
|
|
|
@ -457,8 +457,9 @@ void HdCyclesDelegate::SetRenderSetting(const PXR_NS::TfToken &key, const PXR_NS
|
|||
VtValue::Cast<double>(value).GetWithDefault(session->params.time_limit));
|
||||
}
|
||||
else if (key == HdCyclesRenderSettingsTokens->samples) {
|
||||
static const int max_samples = Integrator::MAX_SAMPLES;
|
||||
int samples = VtValue::Cast<int>(value).GetWithDefault(session->params.samples);
|
||||
samples = std::min(std::max(1, samples), Integrator::MAX_SAMPLES);
|
||||
samples = std::min(std::max(1, samples), max_samples);
|
||||
session->set_samples(samples);
|
||||
}
|
||||
else if (key == HdCyclesRenderSettingsTokens->sample_offset) {
|
||||
|
|
|
@ -18,7 +18,11 @@ CCL_NAMESPACE_BEGIN
|
|||
*/
|
||||
|
||||
PassAccessor::PassAccessInfo::PassAccessInfo(const BufferPass &pass)
|
||||
: type(pass.type), mode(pass.mode), include_albedo(pass.include_albedo), offset(pass.offset)
|
||||
: type(pass.type),
|
||||
mode(pass.mode),
|
||||
include_albedo(pass.include_albedo),
|
||||
is_lightgroup(!pass.lightgroup.empty()),
|
||||
offset(pass.offset)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -127,7 +131,8 @@ bool PassAccessor::get_render_tile_pixels(const RenderBuffers *render_buffers,
|
|||
|
||||
const PassType type = pass_access_info_.type;
|
||||
const PassMode mode = pass_access_info_.mode;
|
||||
const PassInfo pass_info = Pass::get_info(type, pass_access_info_.include_albedo);
|
||||
const PassInfo pass_info = Pass::get_info(
|
||||
type, pass_access_info_.include_albedo, pass_access_info_.is_lightgroup);
|
||||
int num_written_components = pass_info.num_components;
|
||||
|
||||
if (pass_info.num_components == 1) {
|
||||
|
@ -215,8 +220,8 @@ void PassAccessor::init_kernel_film_convert(KernelFilmConvert *kfilm_convert,
|
|||
const Destination &destination) const
|
||||
{
|
||||
const PassMode mode = pass_access_info_.mode;
|
||||
const PassInfo &pass_info = Pass::get_info(pass_access_info_.type,
|
||||
pass_access_info_.include_albedo);
|
||||
const PassInfo &pass_info = Pass::get_info(
|
||||
pass_access_info_.type, pass_access_info_.include_albedo, pass_access_info_.is_lightgroup);
|
||||
|
||||
kfilm_convert->pass_offset = pass_access_info_.offset;
|
||||
kfilm_convert->pass_stride = buffer_params.pass_stride;
|
||||
|
@ -279,8 +284,8 @@ bool PassAccessor::set_render_tile_pixels(RenderBuffers *render_buffers, const S
|
|||
return false;
|
||||
}
|
||||
|
||||
const PassInfo pass_info = Pass::get_info(pass_access_info_.type,
|
||||
pass_access_info_.include_albedo);
|
||||
const PassInfo pass_info = Pass::get_info(
|
||||
pass_access_info_.type, pass_access_info_.include_albedo, pass_access_info_.is_lightgroup);
|
||||
|
||||
const BufferParams &buffer_params = render_buffers->params;
|
||||
|
||||
|
|
|
@ -28,6 +28,7 @@ class PassAccessor {
|
|||
PassType type = PASS_NONE;
|
||||
PassMode mode = PassMode::NOISY;
|
||||
bool include_albedo = false;
|
||||
bool is_lightgroup = false;
|
||||
int offset = -1;
|
||||
|
||||
/* For the shadow catcher matte pass: whether to approximate shadow catcher pass into its
|
||||
|
|
|
@ -223,6 +223,7 @@ set(SRC_KERNEL_INTEGRATOR_HEADERS
|
|||
integrator/intersect_subsurface.h
|
||||
integrator/intersect_volume_stack.h
|
||||
integrator/megakernel.h
|
||||
integrator/mnee.h
|
||||
integrator/path_state.h
|
||||
integrator/shade_background.h
|
||||
integrator/shade_light.h
|
||||
|
@ -408,6 +409,11 @@ if(WITH_CYCLES_CUDA_BINARIES)
|
|||
-o ${CMAKE_CURRENT_BINARY_DIR}/${cuda_file}
|
||||
-Wno-deprecated-gpu-targets)
|
||||
|
||||
if(CUDA_HOST_COMPILER)
|
||||
set(cuda_flags ${cuda_flags}
|
||||
-ccbin="${CUDA_HOST_COMPILER}")
|
||||
endif()
|
||||
|
||||
if(WITH_NANOVDB)
|
||||
set(cuda_flags ${cuda_flags}
|
||||
-D WITH_NANOVDB
|
||||
|
|
|
@ -76,10 +76,11 @@ typedef unsigned long long uint64_t;
|
|||
/* GPU texture objects */
|
||||
|
||||
typedef unsigned long long CUtexObject;
|
||||
typedef CUtexObject ccl_gpu_tex_object;
|
||||
typedef CUtexObject ccl_gpu_tex_object_2D;
|
||||
typedef CUtexObject ccl_gpu_tex_object_3D;
|
||||
|
||||
template<typename T>
|
||||
ccl_device_forceinline T ccl_gpu_tex_object_read_2D(const ccl_gpu_tex_object texobj,
|
||||
ccl_device_forceinline T ccl_gpu_tex_object_read_2D(const ccl_gpu_tex_object_2D texobj,
|
||||
const float x,
|
||||
const float y)
|
||||
{
|
||||
|
@ -87,7 +88,7 @@ ccl_device_forceinline T ccl_gpu_tex_object_read_2D(const ccl_gpu_tex_object tex
|
|||
}
|
||||
|
||||
template<typename T>
|
||||
ccl_device_forceinline T ccl_gpu_tex_object_read_3D(const ccl_gpu_tex_object texobj,
|
||||
ccl_device_forceinline T ccl_gpu_tex_object_read_3D(const ccl_gpu_tex_object_3D texobj,
|
||||
const float x,
|
||||
const float y,
|
||||
const float z)
|
||||
|
|
|
@ -88,6 +88,7 @@
|
|||
extern "C" __global__ void __launch_bounds__(block_num_threads)
|
||||
|
||||
#define ccl_gpu_kernel_signature(name, ...) kernel_gpu_##name(__VA_ARGS__)
|
||||
#define ccl_gpu_kernel_postfix
|
||||
|
||||
#define ccl_gpu_kernel_call(x) x
|
||||
|
||||
|
|
|
@ -56,7 +56,7 @@ ccl_device_noinline T kernel_tex_image_interp_bicubic(ccl_global const TextureIn
|
|||
float x,
|
||||
float y)
|
||||
{
|
||||
ccl_gpu_tex_object tex = (ccl_gpu_tex_object)info.data;
|
||||
ccl_gpu_tex_object_2D tex = (ccl_gpu_tex_object_2D)info.data;
|
||||
|
||||
x = (x * info.width) - 0.5f;
|
||||
y = (y * info.height) - 0.5f;
|
||||
|
@ -85,7 +85,7 @@ template<typename T>
|
|||
ccl_device_noinline T
|
||||
kernel_tex_image_interp_tricubic(ccl_global const TextureInfo &info, float x, float y, float z)
|
||||
{
|
||||
ccl_gpu_tex_object tex = (ccl_gpu_tex_object)info.data;
|
||||
ccl_gpu_tex_object_3D tex = (ccl_gpu_tex_object_3D)info.data;
|
||||
|
||||
x = (x * info.width) - 0.5f;
|
||||
y = (y * info.height) - 0.5f;
|
||||
|
@ -190,7 +190,7 @@ ccl_device float4 kernel_tex_image_interp(KernelGlobals kg, int id, float x, flo
|
|||
return kernel_tex_image_interp_bicubic<float4>(info, x, y);
|
||||
}
|
||||
else {
|
||||
ccl_gpu_tex_object tex = (ccl_gpu_tex_object)info.data;
|
||||
ccl_gpu_tex_object_2D tex = (ccl_gpu_tex_object_2D)info.data;
|
||||
return ccl_gpu_tex_object_read_2D<float4>(tex, x, y);
|
||||
}
|
||||
}
|
||||
|
@ -202,7 +202,7 @@ ccl_device float4 kernel_tex_image_interp(KernelGlobals kg, int id, float x, flo
|
|||
f = kernel_tex_image_interp_bicubic<float>(info, x, y);
|
||||
}
|
||||
else {
|
||||
ccl_gpu_tex_object tex = (ccl_gpu_tex_object)info.data;
|
||||
ccl_gpu_tex_object_2D tex = (ccl_gpu_tex_object_2D)info.data;
|
||||
f = ccl_gpu_tex_object_read_2D<float>(tex, x, y);
|
||||
}
|
||||
|
||||
|
@ -245,7 +245,7 @@ ccl_device float4 kernel_tex_image_interp_3d(KernelGlobals kg,
|
|||
return kernel_tex_image_interp_tricubic<float4>(info, x, y, z);
|
||||
}
|
||||
else {
|
||||
ccl_gpu_tex_object tex = (ccl_gpu_tex_object)info.data;
|
||||
ccl_gpu_tex_object_3D tex = (ccl_gpu_tex_object_3D)info.data;
|
||||
return ccl_gpu_tex_object_read_3D<float4>(tex, x, y, z);
|
||||
}
|
||||
}
|
||||
|
@ -256,7 +256,7 @@ ccl_device float4 kernel_tex_image_interp_3d(KernelGlobals kg,
|
|||
f = kernel_tex_image_interp_tricubic<float>(info, x, y, z);
|
||||
}
|
||||
else {
|
||||
ccl_gpu_tex_object tex = (ccl_gpu_tex_object)info.data;
|
||||
ccl_gpu_tex_object_3D tex = (ccl_gpu_tex_object_3D)info.data;
|
||||
f = ccl_gpu_tex_object_read_3D<float>(tex, x, y, z);
|
||||
}
|
||||
|
||||
|
|
|
@ -58,6 +58,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
INTEGRATOR_STATE_WRITE(state, shadow_path, queued_kernel) = 0;
|
||||
}
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
||||
ccl_gpu_kernel_signature(integrator_init_from_camera,
|
||||
|
@ -89,6 +90,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
ccl_gpu_kernel_call(
|
||||
integrator_init_from_camera(nullptr, state, tile, render_buffer, x, y, sample));
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
||||
ccl_gpu_kernel_signature(integrator_init_from_bake,
|
||||
|
@ -120,6 +122,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
ccl_gpu_kernel_call(
|
||||
integrator_init_from_bake(nullptr, state, tile, render_buffer, x, y, sample));
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
||||
ccl_gpu_kernel_signature(integrator_intersect_closest,
|
||||
|
@ -134,6 +137,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
ccl_gpu_kernel_call(integrator_intersect_closest(NULL, state, render_buffer));
|
||||
}
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
||||
ccl_gpu_kernel_signature(integrator_intersect_shadow,
|
||||
|
@ -147,6 +151,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
ccl_gpu_kernel_call(integrator_intersect_shadow(NULL, state));
|
||||
}
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
||||
ccl_gpu_kernel_signature(integrator_intersect_subsurface,
|
||||
|
@ -160,6 +165,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
ccl_gpu_kernel_call(integrator_intersect_subsurface(NULL, state));
|
||||
}
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
||||
ccl_gpu_kernel_signature(integrator_intersect_volume_stack,
|
||||
|
@ -173,6 +179,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
ccl_gpu_kernel_call(integrator_intersect_volume_stack(NULL, state));
|
||||
}
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
||||
ccl_gpu_kernel_signature(integrator_shade_background,
|
||||
|
@ -187,6 +194,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
ccl_gpu_kernel_call(integrator_shade_background(NULL, state, render_buffer));
|
||||
}
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
||||
ccl_gpu_kernel_signature(integrator_shade_light,
|
||||
|
@ -201,6 +209,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
ccl_gpu_kernel_call(integrator_shade_light(NULL, state, render_buffer));
|
||||
}
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
||||
ccl_gpu_kernel_signature(integrator_shade_shadow,
|
||||
|
@ -215,6 +224,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
ccl_gpu_kernel_call(integrator_shade_shadow(NULL, state, render_buffer));
|
||||
}
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
||||
ccl_gpu_kernel_signature(integrator_shade_surface,
|
||||
|
@ -229,6 +239,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
ccl_gpu_kernel_call(integrator_shade_surface(NULL, state, render_buffer));
|
||||
}
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
#ifdef __KERNEL_METAL__
|
||||
constant int __dummy_constant [[function_constant(0)]];
|
||||
|
@ -256,6 +267,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
#endif
|
||||
}
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
||||
ccl_gpu_kernel_signature(integrator_shade_volume,
|
||||
|
@ -270,6 +282,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
ccl_gpu_kernel_call(integrator_shade_volume(NULL, state, render_buffer));
|
||||
}
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel_threads(GPU_PARALLEL_ACTIVE_INDEX_DEFAULT_BLOCK_SIZE)
|
||||
ccl_gpu_kernel_signature(integrator_queued_paths_array,
|
||||
|
@ -288,6 +301,7 @@ ccl_gpu_kernel_threads(GPU_PARALLEL_ACTIVE_INDEX_DEFAULT_BLOCK_SIZE)
|
|||
num_indices,
|
||||
ccl_gpu_kernel_lambda_pass);
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel_threads(GPU_PARALLEL_ACTIVE_INDEX_DEFAULT_BLOCK_SIZE)
|
||||
ccl_gpu_kernel_signature(integrator_queued_shadow_paths_array,
|
||||
|
@ -306,6 +320,7 @@ ccl_gpu_kernel_threads(GPU_PARALLEL_ACTIVE_INDEX_DEFAULT_BLOCK_SIZE)
|
|||
num_indices,
|
||||
ccl_gpu_kernel_lambda_pass);
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel_threads(GPU_PARALLEL_ACTIVE_INDEX_DEFAULT_BLOCK_SIZE)
|
||||
ccl_gpu_kernel_signature(integrator_active_paths_array,
|
||||
|
@ -321,6 +336,7 @@ ccl_gpu_kernel_threads(GPU_PARALLEL_ACTIVE_INDEX_DEFAULT_BLOCK_SIZE)
|
|||
num_indices,
|
||||
ccl_gpu_kernel_lambda_pass);
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel_threads(GPU_PARALLEL_ACTIVE_INDEX_DEFAULT_BLOCK_SIZE)
|
||||
ccl_gpu_kernel_signature(integrator_terminated_paths_array,
|
||||
|
@ -337,6 +353,7 @@ ccl_gpu_kernel_threads(GPU_PARALLEL_ACTIVE_INDEX_DEFAULT_BLOCK_SIZE)
|
|||
num_indices,
|
||||
ccl_gpu_kernel_lambda_pass);
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel_threads(GPU_PARALLEL_ACTIVE_INDEX_DEFAULT_BLOCK_SIZE)
|
||||
ccl_gpu_kernel_signature(integrator_terminated_shadow_paths_array,
|
||||
|
@ -353,6 +370,7 @@ ccl_gpu_kernel_threads(GPU_PARALLEL_ACTIVE_INDEX_DEFAULT_BLOCK_SIZE)
|
|||
num_indices,
|
||||
ccl_gpu_kernel_lambda_pass);
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel_threads(GPU_PARALLEL_SORTED_INDEX_DEFAULT_BLOCK_SIZE)
|
||||
ccl_gpu_kernel_signature(integrator_sorted_paths_array,
|
||||
|
@ -380,6 +398,7 @@ ccl_gpu_kernel_threads(GPU_PARALLEL_SORTED_INDEX_DEFAULT_BLOCK_SIZE)
|
|||
key_prefix_sum,
|
||||
ccl_gpu_kernel_lambda_pass);
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel_threads(GPU_PARALLEL_ACTIVE_INDEX_DEFAULT_BLOCK_SIZE)
|
||||
ccl_gpu_kernel_signature(integrator_compact_paths_array,
|
||||
|
@ -399,6 +418,7 @@ ccl_gpu_kernel_threads(GPU_PARALLEL_ACTIVE_INDEX_DEFAULT_BLOCK_SIZE)
|
|||
num_indices,
|
||||
ccl_gpu_kernel_lambda_pass);
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel_threads(GPU_PARALLEL_SORTED_INDEX_DEFAULT_BLOCK_SIZE)
|
||||
ccl_gpu_kernel_signature(integrator_compact_states,
|
||||
|
@ -416,6 +436,7 @@ ccl_gpu_kernel_threads(GPU_PARALLEL_SORTED_INDEX_DEFAULT_BLOCK_SIZE)
|
|||
ccl_gpu_kernel_call(integrator_state_move(NULL, to_state, from_state));
|
||||
}
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel_threads(GPU_PARALLEL_ACTIVE_INDEX_DEFAULT_BLOCK_SIZE)
|
||||
ccl_gpu_kernel_signature(integrator_compact_shadow_paths_array,
|
||||
|
@ -435,6 +456,7 @@ ccl_gpu_kernel_threads(GPU_PARALLEL_ACTIVE_INDEX_DEFAULT_BLOCK_SIZE)
|
|||
num_indices,
|
||||
ccl_gpu_kernel_lambda_pass);
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel_threads(GPU_PARALLEL_SORTED_INDEX_DEFAULT_BLOCK_SIZE)
|
||||
ccl_gpu_kernel_signature(integrator_compact_shadow_states,
|
||||
|
@ -452,12 +474,14 @@ ccl_gpu_kernel_threads(GPU_PARALLEL_SORTED_INDEX_DEFAULT_BLOCK_SIZE)
|
|||
ccl_gpu_kernel_call(integrator_shadow_state_move(NULL, to_state, from_state));
|
||||
}
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel_threads(GPU_PARALLEL_PREFIX_SUM_DEFAULT_BLOCK_SIZE) ccl_gpu_kernel_signature(
|
||||
prefix_sum, ccl_global int *counter, ccl_global int *prefix_sum, int num_values)
|
||||
{
|
||||
gpu_parallel_prefix_sum(ccl_gpu_global_id_x(), counter, prefix_sum, num_values);
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* Adaptive sampling.
|
||||
|
@ -494,6 +518,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
atomic_fetch_and_add_uint32(num_active_pixels, popcount(num_active_pixels_mask));
|
||||
}
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
||||
ccl_gpu_kernel_signature(adaptive_sampling_filter_x,
|
||||
|
@ -512,6 +537,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
kernel_adaptive_sampling_filter_x(NULL, render_buffer, sy + y, sx, sw, offset, stride));
|
||||
}
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
||||
ccl_gpu_kernel_signature(adaptive_sampling_filter_y,
|
||||
|
@ -530,6 +556,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
kernel_adaptive_sampling_filter_y(NULL, render_buffer, sx + x, sy, sh, offset, stride));
|
||||
}
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* Cryptomatte.
|
||||
|
@ -546,6 +573,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
ccl_gpu_kernel_call(kernel_cryptomatte_post(nullptr, render_buffer, pixel_index));
|
||||
}
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* Film.
|
||||
|
@ -627,6 +655,7 @@ ccl_device_inline void kernel_gpu_film_convert_half_write(ccl_global uchar4 *rgb
|
|||
\
|
||||
FILM_GET_PASS_PIXEL_F32(variant, input_channel_count); \
|
||||
} \
|
||||
ccl_gpu_kernel_postfix \
|
||||
\
|
||||
ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS) \
|
||||
ccl_gpu_kernel_signature(film_convert_##variant##_half_rgba, \
|
||||
|
@ -666,7 +695,8 @@ ccl_device_inline void kernel_gpu_film_convert_half_write(ccl_global uchar4 *rgb
|
|||
const half4 half_pixel = float4_to_half4_display( \
|
||||
make_float4(pixel[0], pixel[1], pixel[2], pixel[3])); \
|
||||
kernel_gpu_film_convert_half_write(rgba, rgba_offset, rgba_stride, x, y, half_pixel); \
|
||||
}
|
||||
} \
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
/* 1 channel inputs */
|
||||
KERNEL_FILM_CONVERT_VARIANT(depth, 1)
|
||||
|
@ -706,6 +736,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
ccl_gpu_kernel_call(kernel_displace_evaluate(NULL, input, output, offset + i));
|
||||
}
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
/* Background */
|
||||
|
||||
|
@ -721,6 +752,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
ccl_gpu_kernel_call(kernel_background_evaluate(NULL, input, output, offset + i));
|
||||
}
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
/* Curve Shadow Transparency */
|
||||
|
||||
|
@ -737,6 +769,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
kernel_curve_shadow_transparency_evaluate(NULL, input, output, offset + i));
|
||||
}
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* Denoising.
|
||||
|
@ -770,6 +803,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
color_out[1] = clamp(color_out[1], 0.0f, 10000.0f);
|
||||
color_out[2] = clamp(color_out[2], 0.0f, 10000.0f);
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
||||
ccl_gpu_kernel_signature(filter_guiding_preprocess,
|
||||
|
@ -849,6 +883,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
flow_out[1] = -motion_in[1] * pixel_scale;
|
||||
}
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
||||
ccl_gpu_kernel_signature(filter_guiding_set_fake_albedo,
|
||||
|
@ -877,6 +912,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
albedo_out[1] = 0.5f;
|
||||
albedo_out[2] = 0.5f;
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
||||
ccl_gpu_kernel_signature(filter_color_postprocess,
|
||||
|
@ -936,6 +972,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
denoised_pixel[3] = 0;
|
||||
}
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* Shadow catcher.
|
||||
|
@ -961,3 +998,4 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
|
|||
atomic_fetch_and_add_uint32(num_possible_splits, popcount(can_split_mask));
|
||||
}
|
||||
}
|
||||
ccl_gpu_kernel_postfix
|
||||
|
|
|
@ -73,10 +73,11 @@ typedef unsigned long long uint64_t;
|
|||
#define ccl_gpu_ballot(predicate) __ballot(predicate)
|
||||
|
||||
/* GPU texture objects */
|
||||
typedef hipTextureObject_t ccl_gpu_tex_object;
|
||||
typedef hipTextureObject_t ccl_gpu_tex_object_2D;
|
||||
typedef hipTextureObject_t ccl_gpu_tex_object_3D;
|
||||
|
||||
template<typename T>
|
||||
ccl_device_forceinline T ccl_gpu_tex_object_read_2D(const ccl_gpu_tex_object texobj,
|
||||
ccl_device_forceinline T ccl_gpu_tex_object_read_2D(const ccl_gpu_tex_object_2D texobj,
|
||||
const float x,
|
||||
const float y)
|
||||
{
|
||||
|
@ -84,7 +85,7 @@ ccl_device_forceinline T ccl_gpu_tex_object_read_2D(const ccl_gpu_tex_object tex
|
|||
}
|
||||
|
||||
template<typename T>
|
||||
ccl_device_forceinline T ccl_gpu_tex_object_read_3D(const ccl_gpu_tex_object texobj,
|
||||
ccl_device_forceinline T ccl_gpu_tex_object_read_3D(const ccl_gpu_tex_object_3D texobj,
|
||||
const float x,
|
||||
const float y,
|
||||
const float z)
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
extern "C" __global__ void __launch_bounds__(block_num_threads)
|
||||
|
||||
#define ccl_gpu_kernel_signature(name, ...) kernel_gpu_##name(__VA_ARGS__)
|
||||
#define ccl_gpu_kernel_postfix
|
||||
|
||||
#define ccl_gpu_kernel_call(x) x
|
||||
|
||||
|
|
|
@ -132,6 +132,7 @@ void kernel_gpu_##name::run(thread MetalKernelContext& context, \
|
|||
uint simd_group_index, \
|
||||
uint num_simd_groups) ccl_global const
|
||||
|
||||
#define ccl_gpu_kernel_postfix
|
||||
#define ccl_gpu_kernel_call(x) context.x
|
||||
|
||||
/* define a function object where "func" is the lambda body, and additional parameters are used to specify captured state */
|
||||
|
|
|
@ -19,17 +19,18 @@ class MetalKernelContext {
|
|||
{}
|
||||
|
||||
/* texture fetch adapter functions */
|
||||
typedef uint64_t ccl_gpu_tex_object;
|
||||
typedef uint64_t ccl_gpu_tex_object_2D;
|
||||
typedef uint64_t ccl_gpu_tex_object_3D;
|
||||
|
||||
template<typename T>
|
||||
inline __attribute__((__always_inline__))
|
||||
T ccl_gpu_tex_object_read_2D(ccl_gpu_tex_object tex, float x, float y) const {
|
||||
T ccl_gpu_tex_object_read_2D(ccl_gpu_tex_object_2D tex, float x, float y) const {
|
||||
kernel_assert(0);
|
||||
return 0;
|
||||
}
|
||||
template<typename T>
|
||||
inline __attribute__((__always_inline__))
|
||||
T ccl_gpu_tex_object_read_3D(ccl_gpu_tex_object tex, float x, float y, float z) const {
|
||||
T ccl_gpu_tex_object_read_3D(ccl_gpu_tex_object_3D tex, float x, float y, float z) const {
|
||||
kernel_assert(0);
|
||||
return 0;
|
||||
}
|
||||
|
@ -37,14 +38,14 @@ class MetalKernelContext {
|
|||
// texture2d
|
||||
template<>
|
||||
inline __attribute__((__always_inline__))
|
||||
float4 ccl_gpu_tex_object_read_2D(ccl_gpu_tex_object tex, float x, float y) const {
|
||||
float4 ccl_gpu_tex_object_read_2D(ccl_gpu_tex_object_2D tex, float x, float y) const {
|
||||
const uint tid(tex);
|
||||
const uint sid(tex >> 32);
|
||||
return metal_ancillaries->textures_2d[tid].tex.sample(metal_samplers[sid], float2(x, y));
|
||||
}
|
||||
template<>
|
||||
inline __attribute__((__always_inline__))
|
||||
float ccl_gpu_tex_object_read_2D(ccl_gpu_tex_object tex, float x, float y) const {
|
||||
float ccl_gpu_tex_object_read_2D(ccl_gpu_tex_object_2D tex, float x, float y) const {
|
||||
const uint tid(tex);
|
||||
const uint sid(tex >> 32);
|
||||
return metal_ancillaries->textures_2d[tid].tex.sample(metal_samplers[sid], float2(x, y)).x;
|
||||
|
@ -53,14 +54,14 @@ class MetalKernelContext {
|
|||
// texture3d
|
||||
template<>
|
||||
inline __attribute__((__always_inline__))
|
||||
float4 ccl_gpu_tex_object_read_3D(ccl_gpu_tex_object tex, float x, float y, float z) const {
|
||||
float4 ccl_gpu_tex_object_read_3D(ccl_gpu_tex_object_3D tex, float x, float y, float z) const {
|
||||
const uint tid(tex);
|
||||
const uint sid(tex >> 32);
|
||||
return metal_ancillaries->textures_3d[tid].tex.sample(metal_samplers[sid], float3(x, y, z));
|
||||
}
|
||||
template<>
|
||||
inline __attribute__((__always_inline__))
|
||||
float ccl_gpu_tex_object_read_3D(ccl_gpu_tex_object tex, float x, float y, float z) const {
|
||||
float ccl_gpu_tex_object_read_3D(ccl_gpu_tex_object_3D tex, float x, float y, float z) const {
|
||||
const uint tid(tex);
|
||||
const uint sid(tex >> 32);
|
||||
return metal_ancillaries->textures_3d[tid].tex.sample(metal_samplers[sid], float3(x, y, z)).x;
|
||||
|
|
|
@ -78,10 +78,11 @@ typedef unsigned long long uint64_t;
|
|||
/* GPU texture objects */
|
||||
|
||||
typedef unsigned long long CUtexObject;
|
||||
typedef CUtexObject ccl_gpu_tex_object;
|
||||
typedef CUtexObject ccl_gpu_tex_object_2D;
|
||||
typedef CUtexObject ccl_gpu_tex_object_3D;
|
||||
|
||||
template<typename T>
|
||||
ccl_device_forceinline T ccl_gpu_tex_object_read_2D(const ccl_gpu_tex_object texobj,
|
||||
ccl_device_forceinline T ccl_gpu_tex_object_read_2D(const ccl_gpu_tex_object_2D texobj,
|
||||
const float x,
|
||||
const float y)
|
||||
{
|
||||
|
@ -89,7 +90,7 @@ ccl_device_forceinline T ccl_gpu_tex_object_read_2D(const ccl_gpu_tex_object tex
|
|||
}
|
||||
|
||||
template<typename T>
|
||||
ccl_device_forceinline T ccl_gpu_tex_object_read_3D(const ccl_gpu_tex_object texobj,
|
||||
ccl_device_forceinline T ccl_gpu_tex_object_read_3D(const ccl_gpu_tex_object_3D texobj,
|
||||
const float x,
|
||||
const float y,
|
||||
const float z)
|
||||
|
|
|
@ -320,12 +320,13 @@ ccl_device_inline void kernel_accum_combined_transparent_pass(KernelGlobals kg,
|
|||
}
|
||||
|
||||
/* Write background or emission to appropriate pass. */
|
||||
ccl_device_inline void kernel_accum_emission_or_background_pass(KernelGlobals kg,
|
||||
ConstIntegratorState state,
|
||||
float3 contribution,
|
||||
ccl_global float *ccl_restrict
|
||||
buffer,
|
||||
const int pass)
|
||||
ccl_device_inline void kernel_accum_emission_or_background_pass(
|
||||
KernelGlobals kg,
|
||||
ConstIntegratorState state,
|
||||
float3 contribution,
|
||||
ccl_global float *ccl_restrict buffer,
|
||||
const int pass,
|
||||
const int lightgroup = LIGHTGROUP_NONE)
|
||||
{
|
||||
if (!(kernel_data.film.light_pass_flag & PASS_ANY)) {
|
||||
return;
|
||||
|
@ -347,6 +348,11 @@ ccl_device_inline void kernel_accum_emission_or_background_pass(KernelGlobals kg
|
|||
}
|
||||
# endif /* __DENOISING_FEATURES__ */
|
||||
|
||||
if (lightgroup != LIGHTGROUP_NONE && kernel_data.film.pass_lightgroup != PASS_UNUSED) {
|
||||
kernel_write_pass_float3(buffer + kernel_data.film.pass_lightgroup + 3 * lightgroup,
|
||||
contribution);
|
||||
}
|
||||
|
||||
if (!(path_flag & PATH_RAY_ANY_PASS)) {
|
||||
/* Directly visible, write to emission or background pass. */
|
||||
pass_offset = pass;
|
||||
|
@ -449,6 +455,13 @@ ccl_device_inline void kernel_accum_light(KernelGlobals kg,
|
|||
return;
|
||||
}
|
||||
|
||||
/* Write lightgroup pass. LIGHTGROUP_NONE is ~0 so decode from unsigned to signed */
|
||||
const int lightgroup = (int)(INTEGRATOR_STATE(state, shadow_path, lightgroup)) - 1;
|
||||
if (lightgroup != LIGHTGROUP_NONE && kernel_data.film.pass_lightgroup != PASS_UNUSED) {
|
||||
kernel_write_pass_float3(buffer + kernel_data.film.pass_lightgroup + 3 * lightgroup,
|
||||
contribution);
|
||||
}
|
||||
|
||||
if (kernel_data.kernel_features & KERNEL_FEATURE_LIGHT_PASSES) {
|
||||
int pass_offset = PASS_UNUSED;
|
||||
|
||||
|
@ -566,15 +579,20 @@ ccl_device_inline void kernel_accum_background(KernelGlobals kg,
|
|||
kernel_accum_combined_transparent_pass(
|
||||
kg, path_flag, sample, contribution, transparent, buffer);
|
||||
}
|
||||
kernel_accum_emission_or_background_pass(
|
||||
kg, state, contribution, buffer, kernel_data.film.pass_background);
|
||||
kernel_accum_emission_or_background_pass(kg,
|
||||
state,
|
||||
contribution,
|
||||
buffer,
|
||||
kernel_data.film.pass_background,
|
||||
kernel_data.background.lightgroup);
|
||||
}
|
||||
|
||||
/* Write emission to render buffer. */
|
||||
ccl_device_inline void kernel_accum_emission(KernelGlobals kg,
|
||||
ConstIntegratorState state,
|
||||
const float3 L,
|
||||
ccl_global float *ccl_restrict render_buffer)
|
||||
ccl_global float *ccl_restrict render_buffer,
|
||||
const int lightgroup = LIGHTGROUP_NONE)
|
||||
{
|
||||
float3 contribution = L;
|
||||
kernel_accum_clamp(kg, &contribution, INTEGRATOR_STATE(state, path, bounce) - 1);
|
||||
|
@ -585,7 +603,7 @@ ccl_device_inline void kernel_accum_emission(KernelGlobals kg,
|
|||
|
||||
kernel_accum_combined_pass(kg, path_flag, sample, contribution, buffer);
|
||||
kernel_accum_emission_or_background_pass(
|
||||
kg, state, contribution, buffer, kernel_data.film.pass_emission);
|
||||
kg, state, contribution, buffer, kernel_data.film.pass_emission, lightgroup);
|
||||
}
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
|
|
@ -283,6 +283,26 @@ ccl_device_inline float object_pass_id(KernelGlobals kg, int object)
|
|||
return kernel_tex_fetch(__objects, object).pass_id;
|
||||
}
|
||||
|
||||
/* Lightgroup of lamp */
|
||||
|
||||
ccl_device_inline int lamp_lightgroup(KernelGlobals kg, int lamp)
|
||||
{
|
||||
if (lamp == LAMP_NONE)
|
||||
return LIGHTGROUP_NONE;
|
||||
|
||||
return kernel_tex_fetch(__lights, lamp).lightgroup;
|
||||
}
|
||||
|
||||
/* Lightgroup of object */
|
||||
|
||||
ccl_device_inline int object_lightgroup(KernelGlobals kg, int object)
|
||||
{
|
||||
if (object == OBJECT_NONE)
|
||||
return LIGHTGROUP_NONE;
|
||||
|
||||
return kernel_tex_fetch(__objects, object).lightgroup;
|
||||
}
|
||||
|
||||
/* Per lamp random number for shader variation */
|
||||
|
||||
ccl_device_inline float lamp_random_number(KernelGlobals kg, int lamp)
|
||||
|
|
|
@ -230,7 +230,11 @@ ccl_device bool integrator_init_from_bake(KernelGlobals kg,
|
|||
/* Setup next kernel to execute. */
|
||||
const int shader_index = shader & SHADER_MASK;
|
||||
const int shader_flags = kernel_tex_fetch(__shaders, shader_index).flags;
|
||||
if (shader_flags & SD_HAS_RAYTRACE) {
|
||||
const bool use_caustics = kernel_data.integrator.use_caustics &&
|
||||
(object_flag & SD_OBJECT_CAUSTICS);
|
||||
const bool use_raytrace_kernel = (shader_flags & SD_HAS_RAYTRACE) || use_caustics;
|
||||
|
||||
if (use_raytrace_kernel) {
|
||||
INTEGRATOR_PATH_INIT_SORTED(DEVICE_KERNEL_INTEGRATOR_SHADE_SURFACE_RAYTRACE, shader_index);
|
||||
}
|
||||
else {
|
||||
|
|
|
@ -123,7 +123,9 @@ ccl_device_forceinline void integrator_split_shadow_catcher(
|
|||
/* Continue with shading shadow catcher surface. */
|
||||
const int shader = intersection_get_shader(kg, isect);
|
||||
const int flags = kernel_tex_fetch(__shaders, shader).flags;
|
||||
const bool use_raytrace_kernel = (flags & SD_HAS_RAYTRACE);
|
||||
const bool use_caustics = kernel_data.integrator.use_caustics &&
|
||||
(object_flags & SD_OBJECT_CAUSTICS);
|
||||
const bool use_raytrace_kernel = (flags & SD_HAS_RAYTRACE) || use_caustics;
|
||||
|
||||
if (use_raytrace_kernel) {
|
||||
INTEGRATOR_PATH_INIT_SORTED(DEVICE_KERNEL_INTEGRATOR_SHADE_SURFACE_RAYTRACE, shader);
|
||||
|
@ -145,7 +147,10 @@ ccl_device_forceinline void integrator_intersect_next_kernel_after_shadow_catche
|
|||
|
||||
const int shader = intersection_get_shader(kg, &isect);
|
||||
const int flags = kernel_tex_fetch(__shaders, shader).flags;
|
||||
const bool use_raytrace_kernel = (flags & SD_HAS_RAYTRACE);
|
||||
const int object_flags = intersection_get_object_flags(kg, &isect);
|
||||
const bool use_caustics = kernel_data.integrator.use_caustics &&
|
||||
(object_flags & SD_OBJECT_CAUSTICS);
|
||||
const bool use_raytrace_kernel = (flags & SD_HAS_RAYTRACE) || use_caustics;
|
||||
|
||||
if (use_raytrace_kernel) {
|
||||
INTEGRATOR_PATH_NEXT_SORTED(
|
||||
|
@ -214,7 +219,10 @@ ccl_device_forceinline void integrator_intersect_next_kernel(
|
|||
const int flags = kernel_tex_fetch(__shaders, shader).flags;
|
||||
|
||||
if (!integrator_intersect_terminate(kg, state, flags)) {
|
||||
const bool use_raytrace_kernel = (flags & SD_HAS_RAYTRACE);
|
||||
const int object_flags = intersection_get_object_flags(kg, isect);
|
||||
const bool use_caustics = kernel_data.integrator.use_caustics &&
|
||||
(object_flags & SD_OBJECT_CAUSTICS);
|
||||
const bool use_raytrace_kernel = (flags & SD_HAS_RAYTRACE) || use_caustics;
|
||||
if (use_raytrace_kernel) {
|
||||
INTEGRATOR_PATH_NEXT_SORTED(
|
||||
current_kernel, DEVICE_KERNEL_INTEGRATOR_SHADE_SURFACE_RAYTRACE, shader);
|
||||
|
@ -261,7 +269,10 @@ ccl_device_forceinline void integrator_intersect_next_kernel_after_volume(
|
|||
/* Hit a surface, continue with surface kernel unless terminated. */
|
||||
const int shader = intersection_get_shader(kg, isect);
|
||||
const int flags = kernel_tex_fetch(__shaders, shader).flags;
|
||||
const bool use_raytrace_kernel = (flags & SD_HAS_RAYTRACE);
|
||||
const int object_flags = intersection_get_object_flags(kg, isect);
|
||||
const bool use_caustics = kernel_data.integrator.use_caustics &&
|
||||
(object_flags & SD_OBJECT_CAUSTICS);
|
||||
const bool use_raytrace_kernel = (flags & SD_HAS_RAYTRACE) || use_caustics;
|
||||
|
||||
if (use_raytrace_kernel) {
|
||||
INTEGRATOR_PATH_NEXT_SORTED(
|
||||
|
@ -328,12 +339,37 @@ ccl_device void integrator_intersect_closest(KernelGlobals kg,
|
|||
isect.prim = PRIM_NONE;
|
||||
}
|
||||
|
||||
/* Setup mnee flag to signal last intersection with a caster */
|
||||
const uint32_t path_flag = INTEGRATOR_STATE(state, path, flag);
|
||||
|
||||
#ifdef __MNEE__
|
||||
/* Path culling logic for MNEE (removes fireflies at the cost of bias) */
|
||||
if (kernel_data.integrator.use_caustics) {
|
||||
/* The following firefly removal mechanism works by culling light connections when
|
||||
* a ray comes from a caustic caster directly after bouncing off a different caustic
|
||||
* receiver */
|
||||
bool from_caustic_caster = false;
|
||||
bool from_caustic_receiver = false;
|
||||
if (!(path_flag & PATH_RAY_CAMERA) && last_isect_object != OBJECT_NONE) {
|
||||
const int object_flags = kernel_tex_fetch(__object_flag, last_isect_object);
|
||||
from_caustic_receiver = (object_flags & SD_OBJECT_CAUSTICS_RECEIVER);
|
||||
from_caustic_caster = (object_flags & SD_OBJECT_CAUSTICS_CASTER);
|
||||
}
|
||||
|
||||
bool has_receiver_ancestor = INTEGRATOR_STATE(state, path, mnee) & PATH_MNEE_RECEIVER_ANCESTOR;
|
||||
INTEGRATOR_STATE_WRITE(state, path, mnee) &= ~PATH_MNEE_CULL_LIGHT_CONNECTION;
|
||||
if (from_caustic_caster && has_receiver_ancestor)
|
||||
INTEGRATOR_STATE_WRITE(state, path, mnee) |= PATH_MNEE_CULL_LIGHT_CONNECTION;
|
||||
if (from_caustic_receiver)
|
||||
INTEGRATOR_STATE_WRITE(state, path, mnee) |= PATH_MNEE_RECEIVER_ANCESTOR;
|
||||
}
|
||||
#endif /* __MNEE__ */
|
||||
|
||||
/* Light intersection for MIS. */
|
||||
if (kernel_data.integrator.use_lamp_mis) {
|
||||
/* NOTE: if we make lights visible to camera rays, we'll need to initialize
|
||||
* these in the path_state_init. */
|
||||
const int last_type = INTEGRATOR_STATE(state, isect, type);
|
||||
const uint32_t path_flag = INTEGRATOR_STATE(state, path, flag);
|
||||
hit = lights_intersect(
|
||||
kg, state, &ray, &isect, last_isect_prim, last_isect_object, last_type, path_flag) ||
|
||||
hit;
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -57,6 +57,10 @@ ccl_device_inline void path_state_init_integrator(KernelGlobals kg,
|
|||
INTEGRATOR_STATE_WRITE(state, path, continuation_probability) = 1.0f;
|
||||
INTEGRATOR_STATE_WRITE(state, path, throughput) = make_float3(1.0f, 1.0f, 1.0f);
|
||||
|
||||
#ifdef __MNEE__
|
||||
INTEGRATOR_STATE_WRITE(state, path, mnee) = 0;
|
||||
#endif
|
||||
|
||||
INTEGRATOR_STATE_WRITE(state, isect, object) = OBJECT_NONE;
|
||||
INTEGRATOR_STATE_WRITE(state, isect, prim) = PRIM_NONE;
|
||||
|
||||
|
|
|
@ -101,6 +101,22 @@ ccl_device_inline void integrate_background(KernelGlobals kg,
|
|||
#endif
|
||||
}
|
||||
|
||||
#ifdef __MNEE__
|
||||
if (INTEGRATOR_STATE(state, path, mnee) & PATH_MNEE_CULL_LIGHT_CONNECTION) {
|
||||
if (kernel_data.background.use_mis) {
|
||||
for (int lamp = 0; lamp < kernel_data.integrator.num_all_lights; lamp++) {
|
||||
/* This path should have been resolved with mnee, it will
|
||||
* generate a firefly for small lights since it is improbable. */
|
||||
const ccl_global KernelLight *klight = &kernel_tex_fetch(__lights, lamp);
|
||||
if (klight->type == LIGHT_BACKGROUND && klight->use_caustics) {
|
||||
eval_background = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* __MNEE__ */
|
||||
|
||||
/* Evaluate background shader. */
|
||||
float3 L = (eval_background) ? integrator_eval_background_shader(kg, state, render_buffer) :
|
||||
zero_float3();
|
||||
|
@ -140,6 +156,16 @@ ccl_device_inline void integrate_distant_lights(KernelGlobals kg,
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef __MNEE__
|
||||
if (INTEGRATOR_STATE(state, path, mnee) & PATH_MNEE_CULL_LIGHT_CONNECTION) {
|
||||
/* This path should have been resolved with mnee, it will
|
||||
* generate a firefly for small lights since it is improbable. */
|
||||
const ccl_global KernelLight *klight = &kernel_tex_fetch(__lights, lamp);
|
||||
if (klight->use_caustics)
|
||||
return;
|
||||
}
|
||||
#endif /* __MNEE__ */
|
||||
|
||||
/* Evaluate light shader. */
|
||||
/* TODO: does aliasing like this break automatic SoA in CUDA? */
|
||||
ShaderDataTinyStorage emission_sd_storage;
|
||||
|
@ -160,7 +186,8 @@ ccl_device_inline void integrate_distant_lights(KernelGlobals kg,
|
|||
|
||||
/* Write to render buffer. */
|
||||
const float3 throughput = INTEGRATOR_STATE(state, path, throughput);
|
||||
kernel_accum_emission(kg, state, throughput * light_eval, render_buffer);
|
||||
kernel_accum_emission(
|
||||
kg, state, throughput * light_eval, render_buffer, kernel_data.background.lightgroup);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -78,7 +78,7 @@ ccl_device_inline void integrate_light(KernelGlobals kg,
|
|||
|
||||
/* Write to render buffer. */
|
||||
const float3 throughput = INTEGRATOR_STATE(state, path, throughput);
|
||||
kernel_accum_emission(kg, state, throughput * light_eval, render_buffer);
|
||||
kernel_accum_emission(kg, state, throughput * light_eval, render_buffer, ls.group);
|
||||
}
|
||||
|
||||
ccl_device void integrator_shade_light(KernelGlobals kg,
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
#include "kernel/film/accumulate.h"
|
||||
#include "kernel/film/passes.h"
|
||||
|
||||
#include "kernel/integrator/mnee.h"
|
||||
|
||||
#include "kernel/integrator/path_state.h"
|
||||
#include "kernel/integrator/shader_eval.h"
|
||||
#include "kernel/integrator/subsurface.h"
|
||||
|
@ -85,13 +87,15 @@ ccl_device_forceinline void integrate_surface_emission(KernelGlobals kg,
|
|||
}
|
||||
|
||||
const float3 throughput = INTEGRATOR_STATE(state, path, throughput);
|
||||
kernel_accum_emission(kg, state, throughput * L, render_buffer);
|
||||
kernel_accum_emission(
|
||||
kg, state, throughput * L, render_buffer, object_lightgroup(kg, sd->object));
|
||||
}
|
||||
#endif /* __EMISSION__ */
|
||||
|
||||
#ifdef __EMISSION__
|
||||
/* Path tracing: sample point on light and evaluate light shader, then
|
||||
* queue shadow ray to be traced. */
|
||||
template<uint node_feature_mask>
|
||||
ccl_device_forceinline void integrate_surface_direct_light(KernelGlobals kg,
|
||||
IntegratorState state,
|
||||
ccl_private ShaderData *sd,
|
||||
|
@ -124,34 +128,65 @@ ccl_device_forceinline void integrate_surface_direct_light(KernelGlobals kg,
|
|||
* integrate_surface_bounce, evaluate the BSDF, and only then evaluate
|
||||
* the light shader. This could also move to its own kernel, for
|
||||
* non-constant light sources. */
|
||||
ShaderDataTinyStorage emission_sd_storage;
|
||||
ShaderDataCausticsStorage emission_sd_storage;
|
||||
ccl_private ShaderData *emission_sd = AS_SHADER_DATA(&emission_sd_storage);
|
||||
const float3 light_eval = light_sample_shader_eval(kg, state, emission_sd, &ls, sd->time);
|
||||
if (is_zero(light_eval)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Evaluate BSDF. */
|
||||
Ray ray ccl_optional_struct_init;
|
||||
BsdfEval bsdf_eval ccl_optional_struct_init;
|
||||
const bool is_transmission = shader_bsdf_is_transmission(sd, ls.D);
|
||||
|
||||
BsdfEval bsdf_eval ccl_optional_struct_init;
|
||||
const float bsdf_pdf = shader_bsdf_eval(kg, sd, ls.D, is_transmission, &bsdf_eval, ls.shader);
|
||||
bsdf_eval_mul3(&bsdf_eval, light_eval / ls.pdf);
|
||||
# ifdef __MNEE__
|
||||
bool skip_nee = false;
|
||||
IF_KERNEL_NODES_FEATURE(RAYTRACE)
|
||||
{
|
||||
if (ls.lamp != LAMP_NONE) {
|
||||
/* Is this a caustic light? */
|
||||
const bool use_caustics = kernel_tex_fetch(__lights, ls.lamp).use_caustics;
|
||||
if (use_caustics) {
|
||||
/* Are we on a caustic caster? */
|
||||
if (is_transmission && (sd->object_flag & SD_OBJECT_CAUSTICS_CASTER))
|
||||
return;
|
||||
|
||||
if (ls.shader & SHADER_USE_MIS) {
|
||||
const float mis_weight = light_sample_mis_weight_nee(kg, ls.pdf, bsdf_pdf);
|
||||
bsdf_eval_mul(&bsdf_eval, mis_weight);
|
||||
/* Are we on a caustic receiver? */
|
||||
if (!is_transmission && (sd->object_flag & SD_OBJECT_CAUSTICS_RECEIVER))
|
||||
skip_nee = kernel_path_mnee_sample(
|
||||
kg, state, sd, emission_sd, rng_state, &ls, &bsdf_eval);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (skip_nee) {
|
||||
/* Create shadow ray after successful manifold walk:
|
||||
* emission_sd contains the last interface intersection and
|
||||
* the light sample ls has been updated */
|
||||
light_sample_to_surface_shadow_ray(kg, emission_sd, &ls, &ray);
|
||||
}
|
||||
else
|
||||
# endif /* __MNEE__ */
|
||||
{
|
||||
const float3 light_eval = light_sample_shader_eval(kg, state, emission_sd, &ls, sd->time);
|
||||
if (is_zero(light_eval)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Evaluate BSDF. */
|
||||
const float bsdf_pdf = shader_bsdf_eval(kg, sd, ls.D, is_transmission, &bsdf_eval, ls.shader);
|
||||
bsdf_eval_mul3(&bsdf_eval, light_eval / ls.pdf);
|
||||
|
||||
if (ls.shader & SHADER_USE_MIS) {
|
||||
const float mis_weight = light_sample_mis_weight_nee(kg, ls.pdf, bsdf_pdf);
|
||||
bsdf_eval_mul(&bsdf_eval, mis_weight);
|
||||
}
|
||||
|
||||
/* Path termination. */
|
||||
const float terminate = path_state_rng_light_termination(kg, rng_state);
|
||||
if (light_sample_terminate(kg, &ls, &bsdf_eval, terminate)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Create shadow ray. */
|
||||
light_sample_to_surface_shadow_ray(kg, sd, &ls, &ray);
|
||||
}
|
||||
|
||||
/* Path termination. */
|
||||
const float terminate = path_state_rng_light_termination(kg, rng_state);
|
||||
if (light_sample_terminate(kg, &ls, &bsdf_eval, terminate)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Create shadow ray. */
|
||||
Ray ray ccl_optional_struct_init;
|
||||
light_sample_to_surface_shadow_ray(kg, sd, &ls, &ray);
|
||||
const bool is_light = light_sample_is_light(&ls);
|
||||
|
||||
/* Branch off shadow kernel. */
|
||||
|
@ -224,6 +259,12 @@ ccl_device_forceinline void integrate_surface_direct_light(KernelGlobals kg,
|
|||
if (kernel_data.kernel_features & KERNEL_FEATURE_SHADOW_PASS) {
|
||||
INTEGRATOR_STATE_WRITE(shadow_state, shadow_path, unshadowed_throughput) = throughput;
|
||||
}
|
||||
|
||||
/* Write Lightgroup, +1 as lightgroup is int but we need to encode into a uint8_t. */
|
||||
INTEGRATOR_STATE_WRITE(
|
||||
shadow_state, shadow_path, lightgroup) = (ls.type != LIGHT_BACKGROUND) ?
|
||||
ls.group + 1 :
|
||||
kernel_data.background.lightgroup + 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -305,8 +346,8 @@ ccl_device_forceinline int integrate_surface_bsdf_bssrdf_bounce(
|
|||
}
|
||||
|
||||
#ifdef __VOLUME__
|
||||
ccl_device_forceinline bool integrate_surface_volume_only_bounce(IntegratorState state,
|
||||
ccl_private ShaderData *sd)
|
||||
ccl_device_forceinline int integrate_surface_volume_only_bounce(IntegratorState state,
|
||||
ccl_private ShaderData *sd)
|
||||
{
|
||||
if (!path_state_volume_next(state)) {
|
||||
return LABEL_NONE;
|
||||
|
@ -501,7 +542,7 @@ ccl_device bool integrate_surface(KernelGlobals kg,
|
|||
|
||||
/* Direct light. */
|
||||
PROFILING_EVENT(PROFILING_SHADE_SURFACE_DIRECT_LIGHT);
|
||||
integrate_surface_direct_light(kg, state, &sd, &rng_state);
|
||||
integrate_surface_direct_light<node_feature_mask>(kg, state, &sd, &rng_state);
|
||||
|
||||
#if defined(__AO__)
|
||||
/* Ambient occlusion pass. */
|
||||
|
|
|
@ -653,7 +653,8 @@ ccl_device_forceinline void volume_integrate_heterogeneous(
|
|||
|
||||
/* Write accumulated emission. */
|
||||
if (!is_zero(accum_emission)) {
|
||||
kernel_accum_emission(kg, state, accum_emission, render_buffer);
|
||||
kernel_accum_emission(
|
||||
kg, state, accum_emission, render_buffer, object_lightgroup(kg, sd->object));
|
||||
}
|
||||
|
||||
# ifdef __DENOISING_FEATURES__
|
||||
|
@ -833,6 +834,12 @@ ccl_device_forceinline void integrate_volume_direct_light(
|
|||
INTEGRATOR_STATE_WRITE(shadow_state, shadow_path, unshadowed_throughput) = throughput;
|
||||
}
|
||||
|
||||
/* Write Lightgroup, +1 as lightgroup is int but we need to encode into a uint8_t. */
|
||||
INTEGRATOR_STATE_WRITE(
|
||||
shadow_state, shadow_path, lightgroup) = (ls->type != LIGHT_BACKGROUND) ?
|
||||
ls->group + 1 :
|
||||
kernel_data.background.lightgroup + 1;
|
||||
|
||||
integrator_state_copy_volume_stack_to_shadow(kg, shadow_state, state);
|
||||
}
|
||||
# endif
|
||||
|
|
|
@ -157,7 +157,11 @@ ccl_device_inline void shader_prepare_surface_closures(KernelGlobals kg,
|
|||
*
|
||||
* Blurring of bsdf after bounces, for rays that have a small likelihood
|
||||
* of following this particular path (diffuse, rough glossy) */
|
||||
if (kernel_data.integrator.filter_glossy != FLT_MAX) {
|
||||
if (kernel_data.integrator.filter_glossy != FLT_MAX
|
||||
#ifdef __MNEE__
|
||||
&& !(INTEGRATOR_STATE(state, path, mnee) & PATH_MNEE_VALID)
|
||||
#endif
|
||||
) {
|
||||
float blur_pdf = kernel_data.integrator.filter_glossy *
|
||||
INTEGRATOR_STATE(state, path, min_ray_pdf);
|
||||
|
||||
|
@ -605,7 +609,8 @@ ccl_device void shader_eval_surface(KernelGlobals kg,
|
|||
ConstIntegratorGenericState state,
|
||||
ccl_private ShaderData *ccl_restrict sd,
|
||||
ccl_global float *ccl_restrict buffer,
|
||||
uint32_t path_flag)
|
||||
uint32_t path_flag,
|
||||
bool use_caustics_storage = false)
|
||||
{
|
||||
/* If path is being terminated, we are tracing a shadow ray or evaluating
|
||||
* emission, then we don't need to store closures. The emission and shadow
|
||||
|
@ -615,7 +620,7 @@ ccl_device void shader_eval_surface(KernelGlobals kg,
|
|||
max_closures = 0;
|
||||
}
|
||||
else {
|
||||
max_closures = kernel_data.max_closures;
|
||||
max_closures = use_caustics_storage ? CAUSTICS_MAX_CLOSURE : kernel_data.max_closures;
|
||||
}
|
||||
|
||||
sd->num_closure = 0;
|
||||
|
|
|
@ -38,6 +38,8 @@ KERNEL_STRUCT_MEMBER(shadow_path, packed_float3, pass_diffuse_weight, KERNEL_FEA
|
|||
KERNEL_STRUCT_MEMBER(shadow_path, packed_float3, pass_glossy_weight, KERNEL_FEATURE_LIGHT_PASSES)
|
||||
/* Number of intersections found by ray-tracing. */
|
||||
KERNEL_STRUCT_MEMBER(shadow_path, uint16_t, num_hits, KERNEL_FEATURE_PATH_TRACING)
|
||||
/* Light group. */
|
||||
KERNEL_STRUCT_MEMBER(shadow_path, uint8_t, lightgroup, KERNEL_FEATURE_PATH_TRACING)
|
||||
KERNEL_STRUCT_END(shadow_path)
|
||||
|
||||
/********************************** Shadow Ray *******************************/
|
||||
|
|
|
@ -34,6 +34,8 @@ KERNEL_STRUCT_MEMBER(path, uint32_t, rng_hash, KERNEL_FEATURE_PATH_TRACING)
|
|||
KERNEL_STRUCT_MEMBER(path, uint16_t, rng_offset, KERNEL_FEATURE_PATH_TRACING)
|
||||
/* enum PathRayFlag */
|
||||
KERNEL_STRUCT_MEMBER(path, uint32_t, flag, KERNEL_FEATURE_PATH_TRACING)
|
||||
/* enum PathRayMNEE */
|
||||
KERNEL_STRUCT_MEMBER(path, uint8_t, mnee, KERNEL_FEATURE_PATH_TRACING)
|
||||
/* Multiple importance sampling
|
||||
* The PDF of BSDF sampling at the last scatter point, and distance to the
|
||||
* last scatter point minus the last ray segment. This distance lets us
|
||||
|
|
|
@ -171,7 +171,12 @@ ccl_device_inline bool subsurface_scatter(KernelGlobals kg, IntegratorState stat
|
|||
|
||||
const int shader = intersection_get_shader(kg, &ss_isect.hits[0]);
|
||||
const int shader_flags = kernel_tex_fetch(__shaders, shader).flags;
|
||||
if (shader_flags & SD_HAS_RAYTRACE) {
|
||||
const int object_flags = intersection_get_object_flags(kg, &ss_isect.hits[0]);
|
||||
const bool use_caustics = kernel_data.integrator.use_caustics &&
|
||||
(object_flags & SD_OBJECT_CAUSTICS);
|
||||
const bool use_raytrace_kernel = (shader_flags & SD_HAS_RAYTRACE) || use_caustics;
|
||||
|
||||
if (use_raytrace_kernel) {
|
||||
INTEGRATOR_PATH_NEXT_SORTED(DEVICE_KERNEL_INTEGRATOR_INTERSECT_SUBSURFACE,
|
||||
DEVICE_KERNEL_INTEGRATOR_SHADE_SURFACE_RAYTRACE,
|
||||
shader);
|
||||
|
|
|
@ -23,6 +23,7 @@ typedef struct LightSample {
|
|||
int prim; /* primitive id for triangle/curve lights */
|
||||
int shader; /* shader id */
|
||||
int lamp; /* lamp id */
|
||||
int group; /* lightgroup */
|
||||
LightType type; /* type of light */
|
||||
} LightSample;
|
||||
|
||||
|
@ -52,6 +53,7 @@ ccl_device_inline bool light_sample(KernelGlobals kg,
|
|||
ls->lamp = lamp;
|
||||
ls->u = randu;
|
||||
ls->v = randv;
|
||||
ls->group = lamp_lightgroup(kg, lamp);
|
||||
|
||||
if (in_volume_segment && (type == LIGHT_DISTANT || type == LIGHT_BACKGROUND)) {
|
||||
/* Distant lights in a volume get a dummy sample, position will not actually
|
||||
|
@ -246,6 +248,15 @@ ccl_device bool lights_intersect(KernelGlobals kg,
|
|||
if (!(klight->shader_id & SHADER_USE_MIS)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
#ifdef __MNEE__
|
||||
/* This path should have been resolved with mnee, it will
|
||||
* generate a firefly for small lights since it is improbable. */
|
||||
if ((INTEGRATOR_STATE(state, path, mnee) & PATH_MNEE_CULL_LIGHT_CONNECTION) &&
|
||||
klight->use_caustics) {
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
if (path_flag & PATH_RAY_SHADOW_CATCHER_PASS) {
|
||||
|
@ -404,6 +415,7 @@ ccl_device bool light_sample_from_distant_ray(KernelGlobals kg,
|
|||
ls->P = -ray_D;
|
||||
ls->Ng = -ray_D;
|
||||
ls->D = ray_D;
|
||||
ls->group = lamp_lightgroup(kg, lamp);
|
||||
|
||||
/* compute pdf */
|
||||
float invarea = klight->distant.invarea;
|
||||
|
@ -432,6 +444,7 @@ ccl_device bool light_sample_from_intersection(KernelGlobals kg,
|
|||
ls->t = isect->t;
|
||||
ls->P = ray_P + ray_D * ls->t;
|
||||
ls->D = ray_D;
|
||||
ls->group = lamp_lightgroup(kg, lamp);
|
||||
|
||||
if (type == LIGHT_SPOT) {
|
||||
const float3 center = make_float3(klight->co[0], klight->co[1], klight->co[2]);
|
||||
|
@ -697,6 +710,7 @@ ccl_device_forceinline void triangle_light_sample(KernelGlobals kg,
|
|||
ls->lamp = LAMP_NONE;
|
||||
ls->shader |= SHADER_USE_MIS;
|
||||
ls->type = LIGHT_TRIANGLE;
|
||||
ls->group = object_lightgroup(kg, object);
|
||||
|
||||
float distance_to_plane = fabsf(dot(N0, V[0] - P) / dot(N0, N0));
|
||||
|
||||
|
|
|
@ -395,8 +395,10 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
|
|||
if (kernel_data.integrator.caustics_refractive || (path_flag & PATH_RAY_DIFFUSE) == 0)
|
||||
# endif
|
||||
{
|
||||
/* This is to prevent mnee from receiving a null bsdf. */
|
||||
float refraction_fresnel = fmaxf(0.0001f, 1.0f - fresnel);
|
||||
ccl_private MicrofacetBsdf *bsdf = (ccl_private MicrofacetBsdf *)bsdf_alloc(
|
||||
sd, sizeof(MicrofacetBsdf), base_color * glass_weight * (1.0f - fresnel));
|
||||
sd, sizeof(MicrofacetBsdf), base_color * glass_weight * refraction_fresnel);
|
||||
if (bsdf) {
|
||||
bsdf->N = N;
|
||||
bsdf->T = make_float3(0.0f, 0.0f, 0.0f);
|
||||
|
@ -674,8 +676,10 @@ ccl_device_noinline int svm_node_closure_bsdf(KernelGlobals kg,
|
|||
if (kernel_data.integrator.caustics_refractive || (path_flag & PATH_RAY_DIFFUSE) == 0)
|
||||
#endif
|
||||
{
|
||||
/* This is to prevent mnee from receiving a null bsdf. */
|
||||
float refraction_fresnel = fmaxf(0.0001f, 1.0f - fresnel);
|
||||
ccl_private MicrofacetBsdf *bsdf = (ccl_private MicrofacetBsdf *)bsdf_alloc(
|
||||
sd, sizeof(MicrofacetBsdf), weight * (1.0f - fresnel));
|
||||
sd, sizeof(MicrofacetBsdf), weight * refraction_fresnel);
|
||||
|
||||
if (bsdf) {
|
||||
bsdf->N = N;
|
||||
|
|
|
@ -113,24 +113,25 @@ ccl_device float3 sky_radiance_hosek(KernelGlobals kg,
|
|||
/* Nishita improved sky model */
|
||||
ccl_device float3 geographical_to_direction(float lat, float lon)
|
||||
{
|
||||
return make_float3(cos(lat) * cos(lon), cos(lat) * sin(lon), sin(lat));
|
||||
return make_float3(cosf(lat) * cosf(lon), cosf(lat) * sinf(lon), sinf(lat));
|
||||
}
|
||||
|
||||
ccl_device float3 sky_radiance_nishita(KernelGlobals kg,
|
||||
float3 dir,
|
||||
float3 pixel_bottom,
|
||||
float3 pixel_top,
|
||||
ccl_private float *nishita_data,
|
||||
uint texture_id)
|
||||
{
|
||||
/* definitions */
|
||||
float sun_elevation = nishita_data[6];
|
||||
float sun_rotation = nishita_data[7];
|
||||
float angular_diameter = nishita_data[8];
|
||||
float sun_intensity = nishita_data[9];
|
||||
float sun_elevation = nishita_data[0];
|
||||
float sun_rotation = nishita_data[1];
|
||||
float angular_diameter = nishita_data[2];
|
||||
float sun_intensity = nishita_data[3];
|
||||
bool sun_disc = (angular_diameter >= 0.0f);
|
||||
float3 xyz;
|
||||
/* convert dir to spherical coordinates */
|
||||
float2 direction = direction_to_spherical(dir);
|
||||
|
||||
/* render above the horizon */
|
||||
if (dir.z >= 0.0f) {
|
||||
/* definitions */
|
||||
|
@ -142,8 +143,6 @@ ccl_device float3 sky_radiance_nishita(KernelGlobals kg,
|
|||
/* if ray inside sun disc render it, otherwise render sky */
|
||||
if (sun_disc && sun_dir_angle < half_angular) {
|
||||
/* get 2 pixels data */
|
||||
float3 pixel_bottom = make_float3(nishita_data[0], nishita_data[1], nishita_data[2]);
|
||||
float3 pixel_top = make_float3(nishita_data[3], nishita_data[4], nishita_data[5]);
|
||||
float y;
|
||||
|
||||
/* sun interpolation */
|
||||
|
@ -292,27 +291,26 @@ ccl_device_noinline int svm_node_tex_sky(
|
|||
/* Nishita */
|
||||
else {
|
||||
/* Define variables */
|
||||
float nishita_data[10];
|
||||
float nishita_data[4];
|
||||
|
||||
float4 data = read_node_float(kg, &offset);
|
||||
nishita_data[0] = data.x;
|
||||
nishita_data[1] = data.y;
|
||||
nishita_data[2] = data.z;
|
||||
nishita_data[3] = data.w;
|
||||
float3 pixel_bottom = make_float3(data.x, data.y, data.z);
|
||||
float3 pixel_top;
|
||||
pixel_top.x = data.w;
|
||||
|
||||
data = read_node_float(kg, &offset);
|
||||
nishita_data[4] = data.x;
|
||||
nishita_data[5] = data.y;
|
||||
nishita_data[6] = data.z;
|
||||
nishita_data[7] = data.w;
|
||||
pixel_top.y = data.x;
|
||||
pixel_top.z = data.y;
|
||||
nishita_data[0] = data.z;
|
||||
nishita_data[1] = data.w;
|
||||
|
||||
data = read_node_float(kg, &offset);
|
||||
nishita_data[8] = data.x;
|
||||
nishita_data[9] = data.y;
|
||||
nishita_data[2] = data.x;
|
||||
nishita_data[3] = data.y;
|
||||
uint texture_id = __float_as_uint(data.z);
|
||||
|
||||
/* Compute Sky */
|
||||
f = sky_radiance_nishita(kg, dir, nishita_data, texture_id);
|
||||
f = sky_radiance_nishita(kg, dir, pixel_bottom, pixel_top, nishita_data, texture_id);
|
||||
}
|
||||
|
||||
stack_store_float3(stack, out_offset, f);
|
||||
|
|
|
@ -46,6 +46,7 @@ CCL_NAMESPACE_BEGIN
|
|||
#define LAMP_NONE (~0)
|
||||
#define ID_NONE (0.0f)
|
||||
#define PASS_UNUSED (~0)
|
||||
#define LIGHTGROUP_NONE (~0)
|
||||
|
||||
#define INTEGRATOR_SHADOW_ISECT_SIZE_CPU 1024U
|
||||
#define INTEGRATOR_SHADOW_ISECT_SIZE_GPU 4U
|
||||
|
@ -102,6 +103,12 @@ CCL_NAMESPACE_BEGIN
|
|||
# undef __BAKING__
|
||||
#endif /* __KERNEL_GPU_RAYTRACING__ */
|
||||
|
||||
/* MNEE currently causes "Compute function exceeds available temporary registers"
|
||||
* on Metal, disabled for now. */
|
||||
#ifndef __KERNEL_METAL__
|
||||
# define __MNEE__
|
||||
#endif
|
||||
|
||||
/* Scene-based selective features compilation. */
|
||||
#ifdef __KERNEL_FEATURES__
|
||||
# if !(__KERNEL_FEATURES & KERNEL_FEATURE_CAMERA_MOTION)
|
||||
|
@ -293,6 +300,13 @@ enum PathRayFlag : uint32_t {
|
|||
PATH_RAY_SHADOW_CATCHER_BACKGROUND = (1U << 31U),
|
||||
};
|
||||
|
||||
// 8bit enum, just in case we need to move more variables in it
|
||||
enum PathRayMNEE {
|
||||
PATH_MNEE_VALID = (1U << 0U),
|
||||
PATH_MNEE_RECEIVER_ANCESTOR = (1U << 1U),
|
||||
PATH_MNEE_CULL_LIGHT_CONNECTION = (1U << 2U),
|
||||
};
|
||||
|
||||
/* Configure ray visibility bits for rays and objects respectively,
|
||||
* to make shadow catchers work.
|
||||
*
|
||||
|
@ -649,6 +663,17 @@ typedef struct AttributeDescriptor {
|
|||
# define MAX_CLOSURE __MAX_CLOSURE__
|
||||
#endif
|
||||
|
||||
/* For manifold next event estimation, we need space to store and evaluate
|
||||
* 2 closures (with extra data) on the refractive interfaces, in addition
|
||||
* to keeping the full sd at the current shading point. We need 4 because a
|
||||
* refractive BSDF is instanced with a companion reflection BSDF, even though
|
||||
* we only need the refractive one, and each of them requires 2 slots. */
|
||||
#ifndef __CAUSTICS_MAX_CLOSURE__
|
||||
# define CAUSTICS_MAX_CLOSURE 4
|
||||
#else
|
||||
# define CAUSTICS_MAX_CLOSURE __CAUSTICS_MAX_CLOSURE__
|
||||
#endif
|
||||
|
||||
#ifndef __MAX_VOLUME_STACK_SIZE__
|
||||
# define MAX_VOLUME_STACK_SIZE 32
|
||||
#else
|
||||
|
@ -779,11 +804,18 @@ enum ShaderDataObjectFlag {
|
|||
SD_OBJECT_SHADOW_CATCHER = (1 << 7),
|
||||
/* object has volume attributes */
|
||||
SD_OBJECT_HAS_VOLUME_ATTRIBUTES = (1 << 8),
|
||||
/* object is caustics caster */
|
||||
SD_OBJECT_CAUSTICS_CASTER = (1 << 9),
|
||||
/* object is caustics receiver */
|
||||
SD_OBJECT_CAUSTICS_RECEIVER = (1 << 10),
|
||||
|
||||
/* object is using caustics */
|
||||
SD_OBJECT_CAUSTICS = (SD_OBJECT_CAUSTICS_CASTER | SD_OBJECT_CAUSTICS_RECEIVER),
|
||||
|
||||
SD_OBJECT_FLAGS = (SD_OBJECT_HOLDOUT_MASK | SD_OBJECT_MOTION | SD_OBJECT_TRANSFORM_APPLIED |
|
||||
SD_OBJECT_NEGATIVE_SCALE_APPLIED | SD_OBJECT_HAS_VOLUME |
|
||||
SD_OBJECT_INTERSECTS_VOLUME | SD_OBJECT_SHADOW_CATCHER |
|
||||
SD_OBJECT_HAS_VOLUME_ATTRIBUTES)
|
||||
SD_OBJECT_HAS_VOLUME_ATTRIBUTES | SD_OBJECT_CAUSTICS)
|
||||
};
|
||||
|
||||
typedef struct ccl_align(16) ShaderData
|
||||
|
@ -882,6 +914,15 @@ typedef struct ccl_align(16) ShaderDataTinyStorage
|
|||
char pad[sizeof(ShaderData) - sizeof(ShaderClosure) * MAX_CLOSURE];
|
||||
}
|
||||
ShaderDataTinyStorage;
|
||||
|
||||
/* ShaderDataCausticsStorage needs the same alignment as ShaderData, or else
|
||||
* the pointer cast in AS_SHADER_DATA invokes undefined behavior. */
|
||||
typedef struct ccl_align(16) ShaderDataCausticsStorage
|
||||
{
|
||||
char pad[sizeof(ShaderData) - sizeof(ShaderClosure) * (MAX_CLOSURE - CAUSTICS_MAX_CLOSURE)];
|
||||
}
|
||||
ShaderDataCausticsStorage;
|
||||
|
||||
#define AS_SHADER_DATA(shader_data_tiny_storage) \
|
||||
((ccl_private ShaderData *)shader_data_tiny_storage)
|
||||
|
||||
|
@ -1068,6 +1109,7 @@ typedef struct KernelFilm {
|
|||
|
||||
int pass_aov_color;
|
||||
int pass_aov_value;
|
||||
int pass_lightgroup;
|
||||
|
||||
/* XYZ to rendering color space transform. float4 instead of float3 to
|
||||
* ensure consistent padding/alignment across devices. */
|
||||
|
@ -1152,8 +1194,10 @@ typedef struct KernelBackground {
|
|||
|
||||
int use_mis;
|
||||
|
||||
int lightgroup;
|
||||
|
||||
/* Padding */
|
||||
int pad1, pad2, pad3;
|
||||
int pad1, pad2;
|
||||
} KernelBackground;
|
||||
static_assert_align(KernelBackground, 16);
|
||||
|
||||
|
@ -1201,6 +1245,9 @@ typedef struct KernelIntegrator {
|
|||
/* mis */
|
||||
int use_lamp_mis;
|
||||
|
||||
/* caustics */
|
||||
int use_caustics;
|
||||
|
||||
/* sampler */
|
||||
int sampling_pattern;
|
||||
|
||||
|
@ -1219,7 +1266,7 @@ typedef struct KernelIntegrator {
|
|||
int direct_light_sampling_type;
|
||||
|
||||
/* padding */
|
||||
int pad1, pad2;
|
||||
int pad1;
|
||||
} KernelIntegrator;
|
||||
static_assert_align(KernelIntegrator, 16);
|
||||
|
||||
|
@ -1329,9 +1376,12 @@ typedef struct KernelObject {
|
|||
|
||||
float ao_distance;
|
||||
|
||||
int lightgroup;
|
||||
|
||||
uint visibility;
|
||||
int primitive_type;
|
||||
int pad[2];
|
||||
|
||||
int pad1;
|
||||
} KernelObject;
|
||||
static_assert_align(KernelObject, 16);
|
||||
|
||||
|
@ -1383,7 +1433,8 @@ typedef struct KernelLight {
|
|||
float max_bounces;
|
||||
float random;
|
||||
float strength[3];
|
||||
float pad1, pad2;
|
||||
int use_caustics;
|
||||
int lightgroup;
|
||||
Transform tfm;
|
||||
Transform itfm;
|
||||
union {
|
||||
|
|
|
@ -32,6 +32,8 @@ NODE_DEFINE(Background)
|
|||
|
||||
SOCKET_NODE(shader, "Shader", Shader::get_node_type());
|
||||
|
||||
SOCKET_STRING(lightgroup, "Light Group", ustring());
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
|
@ -101,6 +103,15 @@ void Background::device_update(Device *device, DeviceScene *dscene, Scene *scene
|
|||
kbackground->surface_shader |= SHADER_EXCLUDE_CAMERA;
|
||||
}
|
||||
|
||||
/* Light group. */
|
||||
auto it = scene->lightgroups.find(lightgroup);
|
||||
if (it != scene->lightgroups.end()) {
|
||||
kbackground->lightgroup = it->second;
|
||||
}
|
||||
else {
|
||||
kbackground->lightgroup = LIGHTGROUP_NONE;
|
||||
}
|
||||
|
||||
clear_modified();
|
||||
}
|
||||
|
||||
|
|
|
@ -30,6 +30,8 @@ class Background : public Node {
|
|||
|
||||
NODE_SOCKET_API(float, volume_step_size)
|
||||
|
||||
NODE_SOCKET_API(ustring, lightgroup)
|
||||
|
||||
Background();
|
||||
~Background();
|
||||
|
||||
|
|
|
@ -175,6 +175,7 @@ void Film::device_update(Device *device, DeviceScene *dscene, Scene *scene)
|
|||
kfilm->pass_volume_direct = PASS_UNUSED;
|
||||
kfilm->pass_volume_indirect = PASS_UNUSED;
|
||||
kfilm->pass_shadow = PASS_UNUSED;
|
||||
kfilm->pass_lightgroup = PASS_UNUSED;
|
||||
|
||||
/* Mark passes as unused so that the kernel knows the pass is inaccessible. */
|
||||
kfilm->pass_denoising_normal = PASS_UNUSED;
|
||||
|
@ -189,6 +190,7 @@ void Film::device_update(Device *device, DeviceScene *dscene, Scene *scene)
|
|||
bool have_cryptomatte = false;
|
||||
bool have_aov_color = false;
|
||||
bool have_aov_value = false;
|
||||
bool have_lightgroup = false;
|
||||
|
||||
for (size_t i = 0; i < scene->passes.size(); i++) {
|
||||
const Pass *pass = scene->passes[i];
|
||||
|
@ -223,6 +225,15 @@ void Film::device_update(Device *device, DeviceScene *dscene, Scene *scene)
|
|||
assert(pass->get_type() <= PASS_CATEGORY_BAKE_END);
|
||||
}
|
||||
|
||||
if (pass->get_lightgroup() != ustring()) {
|
||||
if (!have_lightgroup) {
|
||||
kfilm->pass_lightgroup = kfilm->pass_stride;
|
||||
have_lightgroup = true;
|
||||
}
|
||||
kfilm->pass_stride += pass->get_info().num_components;
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (pass->get_type()) {
|
||||
case PASS_COMBINED:
|
||||
kfilm->pass_combined = kfilm->pass_stride;
|
||||
|
@ -414,6 +425,26 @@ int Film::get_aov_offset(Scene *scene, string name, bool &is_color)
|
|||
return -1;
|
||||
}
|
||||
|
||||
bool Film::update_lightgroups(Scene *scene)
|
||||
{
|
||||
map<ustring, int> lightgroups;
|
||||
int i = 0;
|
||||
foreach (const Pass *pass, scene->passes) {
|
||||
ustring lightgroup = pass->get_lightgroup();
|
||||
if (!lightgroup.empty()) {
|
||||
if (!lightgroups.count(lightgroup)) {
|
||||
lightgroups[lightgroup] = i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (scene->lightgroups != lightgroups) {
|
||||
scene->lightgroups = lightgroups;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void Film::update_passes(Scene *scene, bool add_sample_count_pass)
|
||||
{
|
||||
const Background *background = scene->background;
|
||||
|
@ -580,11 +611,19 @@ void Film::remove_auto_passes(Scene *scene)
|
|||
|
||||
static bool compare_pass_order(const Pass *a, const Pass *b)
|
||||
{
|
||||
/* On the highest level, sort by number of components.
|
||||
* Within passes of the same component count, sort so that all non-lightgroup passes come first.
|
||||
* Within that group, sort by type. */
|
||||
const int num_components_a = a->get_info().num_components;
|
||||
const int num_components_b = b->get_info().num_components;
|
||||
|
||||
if (num_components_a == num_components_b) {
|
||||
return (a->get_type() < b->get_type());
|
||||
const int is_lightgroup_a = !a->get_lightgroup().empty();
|
||||
const int is_lightgroup_b = !b->get_lightgroup().empty();
|
||||
if (is_lightgroup_a == is_lightgroup_b) {
|
||||
return (a->get_type() < b->get_type());
|
||||
}
|
||||
return is_lightgroup_b;
|
||||
}
|
||||
|
||||
return num_components_a > num_components_b;
|
||||
|
|
|
@ -68,6 +68,8 @@ class Film : public Node {
|
|||
|
||||
int get_aov_offset(Scene *scene, string name, bool &is_color);
|
||||
|
||||
bool update_lightgroups(Scene *scene);
|
||||
|
||||
/* Update passes so that they contain all passes required for the configured functionality.
|
||||
*
|
||||
* If `add_sample_count_pass` is true then the SAMPLE_COUNT pass is ensured to be added. */
|
||||
|
|
|
@ -179,8 +179,12 @@ bool Geometry::has_true_displacement() const
|
|||
return false;
|
||||
}
|
||||
|
||||
void Geometry::compute_bvh(
|
||||
Device *device, DeviceScene *dscene, SceneParams *params, Progress *progress, int n, int total)
|
||||
void Geometry::compute_bvh(Device *device,
|
||||
DeviceScene *dscene,
|
||||
SceneParams *params,
|
||||
Progress *progress,
|
||||
size_t n,
|
||||
size_t total)
|
||||
{
|
||||
if (progress->get_cancel())
|
||||
return;
|
||||
|
|
|
@ -110,8 +110,8 @@ class Geometry : public Node {
|
|||
DeviceScene *dscene,
|
||||
SceneParams *params,
|
||||
Progress *progress,
|
||||
int n,
|
||||
int total);
|
||||
size_t n,
|
||||
size_t total);
|
||||
|
||||
virtual PrimitiveType primitive_type() const = 0;
|
||||
|
||||
|
|
|
@ -123,6 +123,7 @@ NODE_DEFINE(Light)
|
|||
SOCKET_BOOLEAN(use_glossy, "Use Glossy", true);
|
||||
SOCKET_BOOLEAN(use_transmission, "Use Transmission", true);
|
||||
SOCKET_BOOLEAN(use_scatter, "Use Scatter", true);
|
||||
SOCKET_BOOLEAN(use_caustics, "Shadow Caustics", false);
|
||||
|
||||
SOCKET_INT(max_bounces, "Max Bounces", 1024);
|
||||
SOCKET_UINT(random_id, "Random ID", 0);
|
||||
|
@ -133,6 +134,8 @@ NODE_DEFINE(Light)
|
|||
|
||||
SOCKET_NODE(shader, "Shader", Shader::get_node_type());
|
||||
|
||||
SOCKET_STRING(lightgroup, "Light Group", ustring());
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
|
@ -896,10 +899,19 @@ void LightManager::device_update_points(Device *, DeviceScene *dscene, Scene *sc
|
|||
|
||||
klights[light_index].max_bounces = max_bounces;
|
||||
klights[light_index].random = random;
|
||||
klights[light_index].use_caustics = light->use_caustics;
|
||||
|
||||
klights[light_index].tfm = light->tfm;
|
||||
klights[light_index].itfm = transform_inverse(light->tfm);
|
||||
|
||||
auto it = scene->lightgroups.find(light->lightgroup);
|
||||
if (it != scene->lightgroups.end()) {
|
||||
klights[light_index].lightgroup = it->second;
|
||||
}
|
||||
else {
|
||||
klights[light_index].lightgroup = LIGHTGROUP_NONE;
|
||||
}
|
||||
|
||||
light_index++;
|
||||
}
|
||||
|
||||
|
|
|
@ -61,6 +61,7 @@ class Light : public Node {
|
|||
NODE_SOCKET_API(bool, use_glossy)
|
||||
NODE_SOCKET_API(bool, use_transmission)
|
||||
NODE_SOCKET_API(bool, use_scatter)
|
||||
NODE_SOCKET_API(bool, use_caustics)
|
||||
|
||||
NODE_SOCKET_API(bool, is_shadow_catcher)
|
||||
NODE_SOCKET_API(bool, is_portal)
|
||||
|
@ -70,6 +71,8 @@ class Light : public Node {
|
|||
NODE_SOCKET_API(int, max_bounces)
|
||||
NODE_SOCKET_API(uint, random_id)
|
||||
|
||||
NODE_SOCKET_API(ustring, lightgroup)
|
||||
|
||||
void tag_update(Scene *scene);
|
||||
|
||||
/* Check whether the light has contribution the scene. */
|
||||
|
|
|
@ -90,11 +90,16 @@ NODE_DEFINE(Object)
|
|||
|
||||
SOCKET_BOOLEAN(is_shadow_catcher, "Shadow Catcher", false);
|
||||
|
||||
SOCKET_BOOLEAN(is_caustics_caster, "Cast Shadow Caustics", false);
|
||||
SOCKET_BOOLEAN(is_caustics_receiver, "Receive Shadow Caustics", false);
|
||||
|
||||
SOCKET_NODE(particle_system, "Particle System", ParticleSystem::get_node_type());
|
||||
SOCKET_INT(particle_index, "Particle Index", 0);
|
||||
|
||||
SOCKET_FLOAT(ao_distance, "AO Distance", 0.0f);
|
||||
|
||||
SOCKET_STRING(lightgroup, "Light Group", ustring());
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
|
@ -390,7 +395,8 @@ static float object_volume_density(const Transform &tfm, Geometry *geom)
|
|||
|
||||
void ObjectManager::device_update_object_transform(UpdateObjectTransformState *state,
|
||||
Object *ob,
|
||||
bool update_all)
|
||||
bool update_all,
|
||||
const Scene *scene)
|
||||
{
|
||||
KernelObject &kobject = state->objects[ob->index];
|
||||
Transform *object_motion_pass = state->object_motion_pass;
|
||||
|
@ -510,6 +516,14 @@ void ObjectManager::device_update_object_transform(UpdateObjectTransformState *s
|
|||
kobject.visibility = ob->visibility_for_tracing();
|
||||
kobject.primitive_type = geom->primitive_type();
|
||||
|
||||
/* Object shadow caustics flag */
|
||||
if (ob->is_caustics_caster) {
|
||||
flag |= SD_OBJECT_CAUSTICS_CASTER;
|
||||
}
|
||||
if (ob->is_caustics_receiver) {
|
||||
flag |= SD_OBJECT_CAUSTICS_RECEIVER;
|
||||
}
|
||||
|
||||
/* Object flag. */
|
||||
if (ob->use_holdout) {
|
||||
flag |= SD_OBJECT_HOLDOUT_MASK;
|
||||
|
@ -521,6 +535,15 @@ void ObjectManager::device_update_object_transform(UpdateObjectTransformState *s
|
|||
if (geom->geometry_type == Geometry::HAIR) {
|
||||
state->have_curves = true;
|
||||
}
|
||||
|
||||
/* Light group. */
|
||||
auto it = scene->lightgroups.find(ob->lightgroup);
|
||||
if (it != scene->lightgroups.end()) {
|
||||
kobject.lightgroup = it->second;
|
||||
}
|
||||
else {
|
||||
kobject.lightgroup = LIGHTGROUP_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectManager::device_update_prim_offsets(Device *device, DeviceScene *dscene, Scene *scene)
|
||||
|
@ -607,7 +630,7 @@ void ObjectManager::device_update_transforms(DeviceScene *dscene, Scene *scene,
|
|||
[&](const blocked_range<size_t> &r) {
|
||||
for (size_t i = r.begin(); i != r.end(); i++) {
|
||||
Object *ob = state.scene->objects[i];
|
||||
device_update_object_transform(&state, ob, update_all);
|
||||
device_update_object_transform(&state, ob, update_all, scene);
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
@ -55,6 +55,9 @@ class Object : public Node {
|
|||
NODE_SOCKET_API(float, shadow_terminator_shading_offset)
|
||||
NODE_SOCKET_API(float, shadow_terminator_geometry_offset)
|
||||
|
||||
NODE_SOCKET_API(bool, is_caustics_caster)
|
||||
NODE_SOCKET_API(bool, is_caustics_receiver)
|
||||
|
||||
NODE_SOCKET_API(float3, dupli_generated)
|
||||
NODE_SOCKET_API(float2, dupli_uv)
|
||||
|
||||
|
@ -63,6 +66,8 @@ class Object : public Node {
|
|||
|
||||
NODE_SOCKET_API(float, ao_distance)
|
||||
|
||||
NODE_SOCKET_API(ustring, lightgroup)
|
||||
|
||||
/* Set during device update. */
|
||||
bool intersects_volume;
|
||||
|
||||
|
@ -166,7 +171,8 @@ class ObjectManager {
|
|||
protected:
|
||||
void device_update_object_transform(UpdateObjectTransformState *state,
|
||||
Object *ob,
|
||||
bool update_all);
|
||||
bool update_all,
|
||||
const Scene *scene);
|
||||
void device_update_object_transform_task(UpdateObjectTransformState *state);
|
||||
bool device_update_object_transform_pop_work(UpdateObjectTransformState *state,
|
||||
int *start_index,
|
||||
|
|
|
@ -124,6 +124,7 @@ NODE_DEFINE(Pass)
|
|||
SOCKET_ENUM(mode, "Mode", *pass_mode_enum, static_cast<int>(PassMode::DENOISED));
|
||||
SOCKET_STRING(name, "Name", ustring());
|
||||
SOCKET_BOOLEAN(include_albedo, "Include Albedo", false);
|
||||
SOCKET_STRING(lightgroup, "Light Group", ustring());
|
||||
|
||||
return type;
|
||||
}
|
||||
|
@ -134,7 +135,7 @@ Pass::Pass() : Node(get_node_type()), is_auto_(false)
|
|||
|
||||
PassInfo Pass::get_info() const
|
||||
{
|
||||
return get_info(type, include_albedo);
|
||||
return get_info(type, include_albedo, !lightgroup.empty());
|
||||
}
|
||||
|
||||
bool Pass::is_written() const
|
||||
|
@ -142,7 +143,7 @@ bool Pass::is_written() const
|
|||
return get_info().is_written;
|
||||
}
|
||||
|
||||
PassInfo Pass::get_info(const PassType type, const bool include_albedo)
|
||||
PassInfo Pass::get_info(const PassType type, const bool include_albedo, const bool is_lightgroup)
|
||||
{
|
||||
PassInfo pass_info;
|
||||
|
||||
|
@ -157,9 +158,9 @@ PassInfo Pass::get_info(const PassType type, const bool include_albedo)
|
|||
pass_info.num_components = 0;
|
||||
break;
|
||||
case PASS_COMBINED:
|
||||
pass_info.num_components = 4;
|
||||
pass_info.num_components = is_lightgroup ? 3 : 4;
|
||||
pass_info.use_exposure = true;
|
||||
pass_info.support_denoise = true;
|
||||
pass_info.support_denoise = !is_lightgroup;
|
||||
break;
|
||||
case PASS_DEPTH:
|
||||
pass_info.num_components = 1;
|
||||
|
@ -369,13 +370,16 @@ const Pass *Pass::find(const vector<Pass *> &passes, const string &name)
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
const Pass *Pass::find(const vector<Pass *> &passes, PassType type, PassMode mode)
|
||||
const Pass *Pass::find(const vector<Pass *> &passes,
|
||||
PassType type,
|
||||
PassMode mode,
|
||||
const ustring &lightgroup)
|
||||
{
|
||||
for (const Pass *pass : passes) {
|
||||
if (pass->get_type() != type || pass->get_mode() != mode) {
|
||||
if (pass->get_type() != type || pass->get_mode() != mode ||
|
||||
pass->get_lightgroup() != lightgroup) {
|
||||
continue;
|
||||
}
|
||||
|
||||
return pass;
|
||||
}
|
||||
|
||||
|
|
|
@ -53,6 +53,7 @@ class Pass : public Node {
|
|||
NODE_SOCKET_API(PassMode, mode)
|
||||
NODE_SOCKET_API(ustring, name)
|
||||
NODE_SOCKET_API(bool, include_albedo)
|
||||
NODE_SOCKET_API(ustring, lightgroup)
|
||||
|
||||
Pass();
|
||||
|
||||
|
@ -72,7 +73,9 @@ class Pass : public Node {
|
|||
static const NodeEnum *get_type_enum();
|
||||
static const NodeEnum *get_mode_enum();
|
||||
|
||||
static PassInfo get_info(PassType type, const bool include_albedo = false);
|
||||
static PassInfo get_info(PassType type,
|
||||
const bool include_albedo = false,
|
||||
const bool is_lightgroup = false);
|
||||
|
||||
static bool contains(const vector<Pass *> &passes, PassType type);
|
||||
|
||||
|
@ -80,7 +83,8 @@ class Pass : public Node {
|
|||
static const Pass *find(const vector<Pass *> &passes, const string &name);
|
||||
static const Pass *find(const vector<Pass *> &passes,
|
||||
PassType type,
|
||||
PassMode mode = PassMode::NOISY);
|
||||
PassMode mode = PassMode::NOISY,
|
||||
const ustring &lightgroup = ustring());
|
||||
|
||||
/* Returns PASS_UNUSED if there is no corresponding pass. */
|
||||
static int get_offset(const vector<Pass *> &passes, const Pass *pass);
|
||||
|
|
|
@ -251,6 +251,11 @@ void Scene::device_update(Device *device_, Progress &progress)
|
|||
* - Lookup tables are done a second time to handle film tables
|
||||
*/
|
||||
|
||||
if (film->update_lightgroups(this)) {
|
||||
light_manager->tag_update(this, ccl::LightManager::LIGHT_MODIFIED);
|
||||
object_manager->tag_update(this, ccl::ObjectManager::OBJECT_MODIFIED);
|
||||
}
|
||||
|
||||
progress.set_status("Updating Shaders");
|
||||
shader_manager->device_update(device, &dscene, this, progress);
|
||||
|
||||
|
@ -489,7 +494,21 @@ void Scene::update_kernel_features()
|
|||
if (use_motion && camera->use_motion()) {
|
||||
kernel_features |= KERNEL_FEATURE_CAMERA_MOTION;
|
||||
}
|
||||
|
||||
/* Figure out whether the scene will use shader raytrace we need at least
|
||||
* one caustic light, one caustic caster and one caustic receiver to use
|
||||
* and enable the mnee code path. */
|
||||
bool has_caustics_receiver = false;
|
||||
bool has_caustics_caster = false;
|
||||
bool has_caustics_light = false;
|
||||
|
||||
foreach (Object *object, objects) {
|
||||
if (object->get_is_caustics_caster()) {
|
||||
has_caustics_caster = true;
|
||||
}
|
||||
else if (object->get_is_caustics_receiver()) {
|
||||
has_caustics_receiver = true;
|
||||
}
|
||||
Geometry *geom = object->get_geometry();
|
||||
if (use_motion) {
|
||||
if (object->use_motion() || geom->get_use_motion_blur()) {
|
||||
|
@ -518,6 +537,18 @@ void Scene::update_kernel_features()
|
|||
}
|
||||
}
|
||||
|
||||
foreach (Light *light, lights) {
|
||||
if (light->get_use_caustics()) {
|
||||
has_caustics_light = true;
|
||||
}
|
||||
}
|
||||
|
||||
dscene.data.integrator.use_caustics = false;
|
||||
if (has_caustics_caster && has_caustics_receiver && has_caustics_light) {
|
||||
dscene.data.integrator.use_caustics = true;
|
||||
kernel_features |= KERNEL_FEATURE_NODE_RAYTRACE;
|
||||
}
|
||||
|
||||
if (bake_manager->get_baking()) {
|
||||
kernel_features |= KERNEL_FEATURE_BAKING;
|
||||
}
|
||||
|
|
|
@ -159,7 +159,7 @@ class SceneParams {
|
|||
SceneParams()
|
||||
{
|
||||
shadingsystem = SHADINGSYSTEM_SVM;
|
||||
bvh_layout = BVH_LAYOUT_BVH2;
|
||||
bvh_layout = BVH_LAYOUT_AUTO;
|
||||
bvh_type = BVH_TYPE_DYNAMIC;
|
||||
use_bvh_spatial_split = false;
|
||||
use_bvh_compact_structure = true;
|
||||
|
@ -197,6 +197,9 @@ class Scene : public NodeOwner {
|
|||
/* Optional name. Is used for logging and reporting. */
|
||||
string name;
|
||||
|
||||
/* Maps from Light group names to their pass ID. */
|
||||
map<ustring, int> lightgroups;
|
||||
|
||||
/* data */
|
||||
BVH *bvh;
|
||||
Camera *camera;
|
||||
|
|
|
@ -49,6 +49,7 @@ NODE_DEFINE(BufferPass)
|
|||
SOCKET_ENUM(mode, "Mode", *pass_mode_enum, static_cast<int>(PassMode::DENOISED));
|
||||
SOCKET_STRING(name, "Name", ustring());
|
||||
SOCKET_BOOLEAN(include_albedo, "Include Albedo", false);
|
||||
SOCKET_STRING(lightgroup, "Light Group", ustring());
|
||||
|
||||
SOCKET_INT(offset, "Offset", -1);
|
||||
|
||||
|
@ -64,13 +65,14 @@ BufferPass::BufferPass(const Pass *scene_pass)
|
|||
type(scene_pass->get_type()),
|
||||
mode(scene_pass->get_mode()),
|
||||
name(scene_pass->get_name()),
|
||||
include_albedo(scene_pass->get_include_albedo())
|
||||
include_albedo(scene_pass->get_include_albedo()),
|
||||
lightgroup(scene_pass->get_lightgroup())
|
||||
{
|
||||
}
|
||||
|
||||
PassInfo BufferPass::get_info() const
|
||||
{
|
||||
return Pass::get_info(type, include_albedo);
|
||||
return Pass::get_info(type, include_albedo, !lightgroup.empty());
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
|
|
|
@ -30,6 +30,7 @@ class BufferPass : public Node {
|
|||
PassMode mode = PassMode::NOISY;
|
||||
ustring name;
|
||||
bool include_albedo = false;
|
||||
ustring lightgroup;
|
||||
|
||||
int offset = -1;
|
||||
|
||||
|
@ -49,7 +50,8 @@ class BufferPass : public Node {
|
|||
inline bool operator==(const BufferPass &other) const
|
||||
{
|
||||
return type == other.type && mode == other.mode && name == other.name &&
|
||||
include_albedo == other.include_albedo && offset == other.offset;
|
||||
include_albedo == other.include_albedo && lightgroup == other.lightgroup &&
|
||||
offset == other.offset;
|
||||
}
|
||||
inline bool operator!=(const BufferPass &other) const
|
||||
{
|
||||
|
|
|
@ -531,7 +531,7 @@ static void read_layer_samples(vector<MergeImage> &images,
|
|||
current_layer_samples.total = 0;
|
||||
current_layer_samples.per_pixel.resize(in_spec.width * in_spec.height);
|
||||
std::fill(
|
||||
current_layer_samples.per_pixel.begin(), current_layer_samples.per_pixel.end(), 0);
|
||||
current_layer_samples.per_pixel.begin(), current_layer_samples.per_pixel.end(), 0.0f);
|
||||
}
|
||||
|
||||
if (layer.has_sample_pass) {
|
||||
|
|
|
@ -12,7 +12,7 @@ set(INC
|
|||
..
|
||||
)
|
||||
|
||||
set(ALL_CYCLES_LIBRARIES
|
||||
set(LIB
|
||||
cycles_kernel
|
||||
cycles_integrator
|
||||
cycles_scene
|
||||
|
@ -22,9 +22,9 @@ set(ALL_CYCLES_LIBRARIES
|
|||
cycles_subd
|
||||
cycles_device
|
||||
cycles_util
|
||||
extern_clew
|
||||
${CYCLES_GL_LIBRARIES}
|
||||
)
|
||||
cycles_external_libraries_append(LIB)
|
||||
|
||||
include_directories(${INC})
|
||||
|
||||
set(SRC
|
||||
|
@ -59,6 +59,5 @@ if(NOT APPLE)
|
|||
endif()
|
||||
|
||||
if(WITH_GTESTS)
|
||||
BLENDER_SRC_GTEST(cycles "${SRC}" "${ALL_CYCLES_LIBRARIES}")
|
||||
cycles_target_link_libraries(cycles_test)
|
||||
BLENDER_SRC_GTEST(cycles "${SRC}" "${LIB}")
|
||||
endif()
|
||||
|
|
|
@ -40,7 +40,7 @@ ccl_device_inline float average(const float2 &a);
|
|||
ccl_device_inline float distance(const float2 &a, const float2 &b);
|
||||
ccl_device_inline float dot(const float2 &a, const float2 &b);
|
||||
ccl_device_inline float cross(const float2 &a, const float2 &b);
|
||||
ccl_device_inline float len(const float2 &a);
|
||||
ccl_device_inline float len(const float2 a);
|
||||
ccl_device_inline float2 normalize(const float2 &a);
|
||||
ccl_device_inline float2 normalize_len(const float2 &a, float *t);
|
||||
ccl_device_inline float2 safe_normalize(const float2 &a);
|
||||
|
@ -187,11 +187,6 @@ ccl_device_inline float cross(const float2 &a, const float2 &b)
|
|||
return (a.x * b.y - a.y * b.x);
|
||||
}
|
||||
|
||||
ccl_device_inline float len(const float2 &a)
|
||||
{
|
||||
return sqrtf(dot(a, a));
|
||||
}
|
||||
|
||||
ccl_device_inline float2 normalize(const float2 &a)
|
||||
{
|
||||
return a / len(a);
|
||||
|
@ -251,6 +246,11 @@ ccl_device_inline float2 floor(const float2 &a)
|
|||
|
||||
#endif /* !__KERNEL_METAL__ */
|
||||
|
||||
ccl_device_inline float len(const float2 a)
|
||||
{
|
||||
return sqrtf(dot(a, a));
|
||||
}
|
||||
|
||||
ccl_device_inline float2 safe_divide_float2_float(const float2 a, const float b)
|
||||
{
|
||||
return (b != 0.0f) ? a / b : zero_float2();
|
||||
|
|
|
@ -20,6 +20,7 @@ OIIO_NAMESPACE_USING
|
|||
# include <sys/ioctl.h>
|
||||
# include <sys/sysctl.h>
|
||||
# include <sys/types.h>
|
||||
# include <unistd.h>
|
||||
#else
|
||||
# include <sys/ioctl.h>
|
||||
# include <unistd.h>
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
#define CYCLES_VERSION_MAJOR 1
|
||||
#define CYCLES_VERSION_MINOR 13
|
||||
#define CYCLES_VERSION_MAJOR 3
|
||||
#define CYCLES_VERSION_MINOR 2
|
||||
#define CYCLES_VERSION_PATCH 0
|
||||
|
||||
#define CYCLES_MAKE_VERSION_STRING2(a, b, c) #a "." #b "." #c
|
||||
|
@ -17,6 +17,10 @@ CCL_NAMESPACE_BEGIN
|
|||
#define CYCLES_VERSION_STRING \
|
||||
CYCLES_MAKE_VERSION_STRING(CYCLES_VERSION_MAJOR, CYCLES_VERSION_MINOR, CYCLES_VERSION_PATCH)
|
||||
|
||||
/* Blender libraries version compatible with this version */
|
||||
|
||||
#define CYCLES_BLENDER_LIBRARIES_VERSION 3.1
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
||||
#endif /* __UTIL_VERSION_H__ */
|
||||
|
|
|
@ -619,7 +619,7 @@ static OCIO_GPUDisplayShader &getGPUDisplayShader(
|
|||
GpuShaderDescRcPtr shaderdesc_to_display = GpuShaderDesc::CreateShaderDesc();
|
||||
shaderdesc_to_display->setLanguage(GPU_LANGUAGE_GLSL_1_3);
|
||||
shaderdesc_to_display->setFunctionName("OCIO_to_display");
|
||||
shaderdesc_to_scene_linear->setResourcePrefix("to_display");
|
||||
shaderdesc_to_display->setResourcePrefix("to_display");
|
||||
(*(ConstProcessorRcPtr *)processor_to_display)
|
||||
->getDefaultGPUProcessor()
|
||||
->extractGpuShaderInfo(shaderdesc_to_display);
|
||||
|
|
|
@ -246,8 +246,8 @@ void RB_shape_trimesh_update(rbCollisionShape *shape,
|
|||
float *vertices,
|
||||
int num_verts,
|
||||
int vert_stride,
|
||||
float min[3],
|
||||
float max[3]);
|
||||
const float min[3],
|
||||
const float max[3]);
|
||||
|
||||
/* ********************************** */
|
||||
/* Constraints */
|
||||
|
|
|
@ -802,8 +802,8 @@ void RB_shape_trimesh_update(rbCollisionShape *shape,
|
|||
float *vertices,
|
||||
int num_verts,
|
||||
int vert_stride,
|
||||
float min[3],
|
||||
float max[3])
|
||||
const float min[3],
|
||||
const float max[3])
|
||||
{
|
||||
if (shape->mesh == NULL || num_verts != shape->mesh->num_vertices) {
|
||||
return;
|
||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -1 +1 @@
|
|||
Subproject commit 2d12637a69df7643484a8a3655b7eeb6faa170a7
|
||||
Subproject commit 63699f968344db7dc853d2c5972325beea44900c
|
|
@ -23,7 +23,8 @@ const UserDef U_default = {
|
|||
USER_SCRIPT_AUTOEXEC_DISABLE | USER_NONEGFRAMES),
|
||||
.dupflag = USER_DUP_MESH | USER_DUP_CURVE | USER_DUP_SURF | USER_DUP_LATTICE | USER_DUP_FONT |
|
||||
USER_DUP_MBALL | USER_DUP_LAMP | USER_DUP_ARM | USER_DUP_CAMERA | USER_DUP_SPEAKER |
|
||||
USER_DUP_ACT | USER_DUP_LIGHTPROBE | USER_DUP_GPENCIL,
|
||||
USER_DUP_ACT | USER_DUP_LIGHTPROBE | USER_DUP_GPENCIL | USER_DUP_CURVES |
|
||||
USER_DUP_POINTCLOUD,
|
||||
.pref_flag = USER_PREF_FLAG_SAVE,
|
||||
.savetime = 2,
|
||||
.tempdir = "",
|
||||
|
|
|
@ -665,6 +665,10 @@ const bTheme U_theme_default = {
|
|||
.row_alternate = RGBA(0xffffff05),
|
||||
.anim_preview_range = RGBA(0xa14d0066),
|
||||
.metadatatext = RGBA(0xffffffff),
|
||||
.list = RGBA(0x18181800),
|
||||
.list_title = RGBA(0xffffffff),
|
||||
.list_text = RGBA(0xffffffff),
|
||||
.list_text_hi = RGBA(0xffffffff),
|
||||
},
|
||||
.space_image = {
|
||||
.back = RGBA(0x30303000),
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit c34f0b90d49938eccf9c1a9ae59b055155e00f9b
|
||||
Subproject commit baa581415c7ed23d7c45ef873631748135672683
|
|
@ -100,6 +100,7 @@ _km_hierarchy = [
|
|||
('Paint Stroke Modal', 'EMPTY', 'WINDOW', []),
|
||||
('Sculpt Expand Modal', 'EMPTY', 'WINDOW', []),
|
||||
('Paint Curve', 'EMPTY', 'WINDOW', []),
|
||||
('Curve Pen Modal Map', 'EMPTY', 'WINDOW', []),
|
||||
|
||||
('Object Non-modal', 'EMPTY', 'WINDOW', []), # mode change
|
||||
|
||||
|
|
|
@ -93,7 +93,6 @@ class _BPyOpsSubModOp:
|
|||
return self._module.upper() + "_OT_" + self._func
|
||||
|
||||
def idname_py(self):
|
||||
# submod.foo -> SUBMOD_OT_foo
|
||||
return self._module + "." + self._func
|
||||
|
||||
def __call__(self, *args, **kw):
|
||||
|
|
|
@ -489,7 +489,7 @@ def is_path_builtin(path):
|
|||
:type path: str
|
||||
:rtype: bool
|
||||
"""
|
||||
# Note that this function is is not optimized for speed,
|
||||
# Note that this function isn't optimized for speed,
|
||||
# it's intended to be used to check if it's OK to remove presets.
|
||||
#
|
||||
# If this is used in a draw-loop for example, we could cache some of the values.
|
||||
|
|
|
@ -8,12 +8,65 @@ StructRNA = bpy_types.bpy_struct
|
|||
StructMetaPropGroup = bpy_types.bpy_struct_meta_idprop
|
||||
# StructRNA = bpy_types.Struct
|
||||
|
||||
# Private dummy object use for comparison only.
|
||||
_sentinel = object()
|
||||
|
||||
# Note that methods extended in C are defined in: 'bpy_rna_types_capi.c'
|
||||
|
||||
|
||||
class Context(StructRNA):
|
||||
__slots__ = ()
|
||||
|
||||
def path_resolve(self, path, coerce=True):
|
||||
"""
|
||||
Returns the property from the path, raise an exception when not found.
|
||||
|
||||
:arg path: patch which this property resolves.
|
||||
:type path: string
|
||||
:arg coerce: optional argument, when True, the property will be converted into its Python representation.
|
||||
:type coerce: boolean
|
||||
"""
|
||||
# This is a convenience wrapper around `StructRNA.path_resolve` which doesn't support accessing context members.
|
||||
# Without this wrapper many users were writing `exec("context.%s" % data_path)` which is a security
|
||||
# concern if the `data_path` comes from an unknown source.
|
||||
# This function performs the initial lookup, after that the regular `path_resolve` function is used.
|
||||
|
||||
# Extract the initial attribute into `(attr, path_rest)`.
|
||||
sep = len(path)
|
||||
div = ""
|
||||
for div_test in (".", "["):
|
||||
sep_test = path.find(div_test, 0, sep)
|
||||
if sep_test != -1 and sep_test < sep:
|
||||
sep = sep_test
|
||||
div = div_test
|
||||
if div:
|
||||
attr = path[:sep]
|
||||
if div == ".":
|
||||
sep += 1
|
||||
path_rest = path[sep:]
|
||||
else:
|
||||
attr = path
|
||||
path_rest = ""
|
||||
|
||||
# Retrieve the value for `attr`.
|
||||
# Match the value error exception with that of "path_resolve"
|
||||
# to simplify exception handling for the caller.
|
||||
value = getattr(self, attr, _sentinel)
|
||||
if value is _sentinel:
|
||||
raise ValueError("Path could not be resolved: %r" % attr)
|
||||
|
||||
if value is None:
|
||||
return value
|
||||
|
||||
# Resolve the rest of the path if necessary.
|
||||
if path_rest:
|
||||
path_resolve_fn = getattr(value, "path_resolve", None)
|
||||
if path_resolve_fn is None:
|
||||
raise ValueError("Path %s resolves to a non RNA value" % attr)
|
||||
return path_resolve_fn(path_rest, coerce)
|
||||
|
||||
return value
|
||||
|
||||
def copy(self):
|
||||
from types import BuiltinMethodType
|
||||
new_context = {}
|
||||
|
|
|
@ -43,7 +43,7 @@ def rna_idprop_context_value(context, context_member, property_type):
|
|||
rna_item = pin_id
|
||||
context_member = "space_data.pin_id"
|
||||
else:
|
||||
rna_item = eval("context." + context_member)
|
||||
rna_item = context.path_resolve(context_member)
|
||||
|
||||
return rna_item, context_member
|
||||
|
||||
|
|
|
@ -345,14 +345,10 @@ def xml2rna(
|
|||
|
||||
|
||||
def _get_context_val(context, path):
|
||||
path_full = "context." + path
|
||||
try:
|
||||
value = eval(path_full)
|
||||
except:
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
print("Error: %r could not be found" % path_full)
|
||||
|
||||
value = context.path_resolve(path)
|
||||
except Exception as ex:
|
||||
print("Error: %r, path %r not found" % (ex, path))
|
||||
value = Ellipsis
|
||||
|
||||
return value
|
||||
|
|
|
@ -29,6 +29,12 @@ class Params:
|
|||
"context_menu_event",
|
||||
"cursor_set_event",
|
||||
"cursor_tweak_event",
|
||||
# NOTE: this is intended to be used so pressing a button can then drag the current selection.
|
||||
# This should not be used for button release values such as `CLICK` or `RELEASE` which should
|
||||
# instead be bound to a binding that doesn't de-select all, this way:
|
||||
# - Click-drag moves the current selection.
|
||||
# - Click selects only the item at the cursor position.
|
||||
# See: T97032.
|
||||
"use_tweak_select_passthrough",
|
||||
"use_tweak_tool_lmb_interaction",
|
||||
"use_mouse_emulate_3_button",
|
||||
|
@ -132,6 +138,7 @@ class Params:
|
|||
self.tool_maybe_tweak_value = 'PRESS'
|
||||
else:
|
||||
self.tool_maybe_tweak_value = 'CLICK_DRAG'
|
||||
|
||||
self.use_tweak_tool_lmb_interaction = use_tweak_tool_lmb_interaction
|
||||
|
||||
self.context_menu_event = {"type": 'W', "value": 'PRESS'}
|
||||
|
@ -417,7 +424,36 @@ def _template_items_change_frame(params):
|
|||
|
||||
# Tool System Templates
|
||||
|
||||
def _template_items_tool_select(params, operator, cursor_operator, fallback):
|
||||
def _template_items_tool_select(
|
||||
params, operator, cursor_operator, *,
|
||||
# Always use the cursor operator where possible,
|
||||
# needed for time-line views where we always want to be able to scrub time.
|
||||
cursor_prioritize=False,
|
||||
fallback=False,
|
||||
):
|
||||
if not params.legacy and not fallback:
|
||||
# Experimental support for LMB interaction for the tweak tool. see: T96544.
|
||||
# NOTE: For RMB-select this is a much bigger change as it disables 3D cursor placement on LMB.
|
||||
# For LMB-select this means an LMB -drag will not first de-select all (similar to node/graph editor).
|
||||
select_passthrough = False
|
||||
if params.select_mouse == 'LEFTMOUSE':
|
||||
select_passthrough = params.use_tweak_select_passthrough
|
||||
else:
|
||||
if not cursor_prioritize:
|
||||
select_passthrough = params.use_tweak_tool_lmb_interaction
|
||||
|
||||
if select_passthrough:
|
||||
return [
|
||||
(operator, {"type": 'LEFTMOUSE', "value": 'PRESS'},
|
||||
{"properties": [("deselect_all", True), ("select_passthrough", True)]}),
|
||||
(operator, {"type": 'LEFTMOUSE', "value": 'CLICK'},
|
||||
{"properties": [("deselect_all", True)]}),
|
||||
(operator, {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
|
||||
{"properties": [("deselect_all", False), ("toggle", True)]}),
|
||||
("transform.translate", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'},
|
||||
{"properties": [("release_confirm", True)]}),
|
||||
]
|
||||
|
||||
if params.select_mouse == 'LEFTMOUSE':
|
||||
# By default use 'PRESS' for immediate select without quick delay.
|
||||
# Fallback key-maps 'CLICK' since 'PRESS' events passes through (allowing either click or drag).
|
||||
|
@ -430,21 +466,15 @@ def _template_items_tool_select(params, operator, cursor_operator, fallback):
|
|||
{"properties": [("deselect_all", True)]}),
|
||||
(operator, {"type": 'LEFTMOUSE', "value": 'CLICK' if fallback else 'PRESS', "shift": True},
|
||||
{"properties": [("toggle", True)]}),
|
||||
]
|
||||
else:
|
||||
# Experimental support for LMB interaction for the tweak tool.
|
||||
if params.use_tweak_tool_lmb_interaction and not fallback:
|
||||
return [
|
||||
(operator, {"type": 'LEFTMOUSE', "value": 'PRESS'},
|
||||
{"properties": [("deselect_all", True), ("select_passthrough", True)]}),
|
||||
(operator, {"type": 'LEFTMOUSE', "value": 'CLICK'},
|
||||
{"properties": [("deselect_all", True)]}),
|
||||
(operator, {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
|
||||
{"properties": [("deselect_all", False), ("toggle", True)]}),
|
||||
|
||||
# Fallback key-map must transform as the primary tool is expected
|
||||
# to be accessed via gizmos in this case. See: T96885.
|
||||
*(() if not fallback else (
|
||||
("transform.translate", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'},
|
||||
{"properties": [("release_confirm", True)]}),
|
||||
]
|
||||
|
||||
))
|
||||
]
|
||||
else:
|
||||
# For right mouse, set the cursor.
|
||||
return [
|
||||
(cursor_operator, {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
|
||||
|
@ -530,18 +560,20 @@ def km_window(params):
|
|||
("screen.space_type_set_or_cycle",
|
||||
{"type": k, "value": 'PRESS', "shift": True},
|
||||
{"properties": [("space_type", t)]})
|
||||
for k, t in (('F1', 'FILE_BROWSER'),
|
||||
('F2', 'CLIP_EDITOR'),
|
||||
('F3', 'NODE_EDITOR'),
|
||||
('F4', 'CONSOLE'),
|
||||
('F5', 'VIEW_3D'),
|
||||
('F6', 'GRAPH_EDITOR'),
|
||||
('F7', 'PROPERTIES'),
|
||||
('F8', 'SEQUENCE_EDITOR'),
|
||||
('F9', 'OUTLINER'),
|
||||
('F10', 'IMAGE_EDITOR'),
|
||||
('F11', 'TEXT_EDITOR'),
|
||||
('F12', 'DOPESHEET_EDITOR'),)
|
||||
for k, t in (
|
||||
('F1', 'FILE_BROWSER'),
|
||||
('F2', 'CLIP_EDITOR'),
|
||||
('F3', 'NODE_EDITOR'),
|
||||
('F4', 'CONSOLE'),
|
||||
('F5', 'VIEW_3D'),
|
||||
('F6', 'GRAPH_EDITOR'),
|
||||
('F7', 'PROPERTIES'),
|
||||
('F8', 'SEQUENCE_EDITOR'),
|
||||
('F9', 'OUTLINER'),
|
||||
('F10', 'IMAGE_EDITOR'),
|
||||
('F11', 'TEXT_EDITOR'),
|
||||
('F12', 'DOPESHEET_EDITOR'),
|
||||
)
|
||||
),
|
||||
|
||||
# NDOF settings
|
||||
|
@ -2051,7 +2083,7 @@ def km_node_editor(params):
|
|||
("wm.context_menu_enum", {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True},
|
||||
{"properties": [("data_path", 'tool_settings.snap_node_element')]}),
|
||||
("wm.context_toggle", {"type": 'Z', "value": 'PRESS', "alt": True, "shift": True},
|
||||
{"properties": [("data_path", "space_data.overlay.show_overlays")]}),
|
||||
{"properties": [("data_path", "space_data.overlay.show_overlays")]}),
|
||||
*_template_items_context_menu("NODE_MT_context_menu", params.context_menu_event),
|
||||
])
|
||||
|
||||
|
@ -2731,8 +2763,10 @@ def km_sequencer(params):
|
|||
("sequencer.slip", {"type": 'S', "value": 'PRESS'}, None),
|
||||
("wm.context_set_int", {"type": 'O', "value": 'PRESS'},
|
||||
{"properties": [("data_path", 'scene.sequence_editor.overlay_frame'), ("value", 0)]}),
|
||||
("transform.seq_slide", {"type": 'G', "value": 'PRESS'}, None),
|
||||
("transform.seq_slide", {"type": params.select_mouse, "value": 'CLICK_DRAG'}, None),
|
||||
("transform.seq_slide", {"type": 'G', "value": 'PRESS'},
|
||||
{"properties": [("view2d_edge_pan", True)]}),
|
||||
("transform.seq_slide", {"type": params.select_mouse, "value": 'CLICK_DRAG'},
|
||||
{"properties": [("view2d_edge_pan", True)]}),
|
||||
("transform.transform", {"type": 'E', "value": 'PRESS'},
|
||||
{"properties": [("mode", 'TIME_EXTEND')]}),
|
||||
("marker.add", {"type": 'M', "value": 'PRESS'}, None),
|
||||
|
@ -2829,6 +2863,22 @@ def km_sequencerpreview(params):
|
|||
return keymap
|
||||
|
||||
|
||||
def km_sequencer_channels(params):
|
||||
items = []
|
||||
keymap = (
|
||||
"Sequencer Channels",
|
||||
{"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
|
||||
{"items": items},
|
||||
)
|
||||
|
||||
items.extend([
|
||||
# Rename.
|
||||
("sequencer.rename_channel", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None),
|
||||
("sequencer.rename_channel", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
|
||||
])
|
||||
return keymap
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Editor (Console)
|
||||
|
||||
|
@ -4069,10 +4119,6 @@ def km_pose(params):
|
|||
("anim.keyframe_insert_menu", {"type": 'I', "value": 'PRESS'}, None),
|
||||
("anim.keyframe_delete_v3d", {"type": 'I', "value": 'PRESS', "alt": True}, None),
|
||||
("anim.keying_set_active_set", {"type": 'I', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
|
||||
("poselib.browse_interactive", {"type": 'L', "value": 'PRESS', "alt": True}, None),
|
||||
("poselib.pose_add", {"type": 'L', "value": 'PRESS', "shift": True}, None),
|
||||
("poselib.pose_remove", {"type": 'L', "value": 'PRESS', "shift": True, "alt": True}, None),
|
||||
("poselib.pose_rename", {"type": 'L', "value": 'PRESS', "shift": True, "ctrl": True}, None),
|
||||
("pose.push", {"type": 'E', "value": 'PRESS', "ctrl": True}, None),
|
||||
("pose.relax", {"type": 'E', "value": 'PRESS', "alt": True}, None),
|
||||
("pose.breakdown", {"type": 'E', "value": 'PRESS', "shift": True}, None),
|
||||
|
@ -4332,6 +4378,11 @@ def _template_paint_radial_control_channels(paint, rotation=False, secondary_rot
|
|||
def _template_view3d_select(*, type, value, legacy, select_passthrough, exclude_mod=None):
|
||||
# NOTE: `exclude_mod` is needed since we don't want this tool to exclude Control-RMB actions when this is used
|
||||
# as a tool key-map with RMB-select and `use_fallback_tool_rmb` is enabled. See T92467.
|
||||
|
||||
# See: `use_tweak_select_passthrough` doc-string.
|
||||
if select_passthrough and (value in {'CLICK', 'RELEASE'}):
|
||||
select_passthrough = False
|
||||
|
||||
items = [(
|
||||
"view3d.select",
|
||||
{"type": type, "value": value, **{m: True for m in mods}},
|
||||
|
@ -4348,7 +4399,7 @@ def _template_view3d_select(*, type, value, legacy, select_passthrough, exclude_
|
|||
(("toggle", "center", "enumerate"), ("shift", "ctrl", "alt")),
|
||||
) if exclude_mod is None or exclude_mod not in mods]
|
||||
|
||||
if select_passthrough and (value == 'PRESS'):
|
||||
if select_passthrough:
|
||||
# Add an additional click item to de-select all other items,
|
||||
# needed so pass-through is able to de-select other items.
|
||||
items.append((
|
||||
|
@ -4373,6 +4424,11 @@ def _template_view3d_gpencil_select(*, type, value, legacy, use_select_mouse=Tru
|
|||
|
||||
|
||||
def _template_uv_select(*, type, value, select_passthrough, legacy):
|
||||
|
||||
# See: `use_tweak_select_passthrough` doc-string.
|
||||
if select_passthrough and (value in {'CLICK', 'RELEASE'}):
|
||||
select_passthrough = False
|
||||
|
||||
items = [
|
||||
("uv.select", {"type": type, "value": value},
|
||||
{"properties": [
|
||||
|
@ -4383,7 +4439,7 @@ def _template_uv_select(*, type, value, select_passthrough, legacy):
|
|||
{"properties": [("toggle", True)]}),
|
||||
]
|
||||
|
||||
if select_passthrough and (value == 'PRESS'):
|
||||
if select_passthrough:
|
||||
# Add an additional click item to de-select all other items,
|
||||
# needed so pass-through is able to de-select other items.
|
||||
items.append((
|
||||
|
@ -5077,7 +5133,10 @@ def km_sculpt_curves(params):
|
|||
)
|
||||
|
||||
items.extend([
|
||||
("sculpt_curves.brush_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
|
||||
("sculpt_curves.brush_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS'},
|
||||
{"properties": [("mode", 'NORMAL')]}),
|
||||
("sculpt_curves.brush_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True},
|
||||
{"properties": [("mode", 'INVERT')]}),
|
||||
*_template_paint_radial_control("curves_sculpt"),
|
||||
])
|
||||
|
||||
|
@ -5619,6 +5678,25 @@ def km_sculpt_expand_modal(_params):
|
|||
return keymap
|
||||
|
||||
|
||||
def km_curve_pen_modal_map(_params):
|
||||
items = []
|
||||
keymap = (
|
||||
"Curve Pen Modal Map",
|
||||
{"space_type": 'EMPTY', "region_type": 'WINDOW', "modal": True},
|
||||
{"items": items},
|
||||
)
|
||||
|
||||
items.extend([
|
||||
("FREE_ALIGN_TOGGLE", {"type": 'LEFT_SHIFT', "value": 'ANY', "any": True}, None),
|
||||
("MOVE_ADJACENT", {"type": 'LEFT_CTRL', "value": 'ANY', "any": True}, None),
|
||||
("MOVE_ENTIRE", {"type": 'SPACE', "value": 'ANY', "any": True}, None),
|
||||
("LOCK_ANGLE", {"type": 'LEFT_ALT', "value": 'ANY', "any": True}, None),
|
||||
("LINK_HANDLES", {"type": 'RIGHT_CTRL', "value": 'PRESS', "any": True}, None),
|
||||
])
|
||||
|
||||
return keymap
|
||||
|
||||
|
||||
# Fallback for gizmos that don't have custom a custom key-map.
|
||||
def km_generic_gizmo(_params):
|
||||
keymap = ("Generic Gizmo",
|
||||
|
@ -5760,7 +5838,7 @@ def km_image_editor_tool_uv_select(params, *, fallback):
|
|||
{"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'},
|
||||
{"items": [
|
||||
*([] if (fallback and (params.select_mouse == 'RIGHTMOUSE')) else _template_items_tool_select(
|
||||
params, "uv.select", "uv.cursor_set", fallback)),
|
||||
params, "uv.select", "uv.cursor_set", fallback=fallback)),
|
||||
*([] if (not params.use_fallback_tool_rmb) else _template_uv_select(
|
||||
type=params.select_mouse,
|
||||
value=params.select_mouse_value,
|
||||
|
@ -5935,7 +6013,7 @@ def km_3d_view_tool_select(params, *, fallback):
|
|||
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
|
||||
{"items": [
|
||||
*([] if (fallback and (params.select_mouse == 'RIGHTMOUSE')) else _template_items_tool_select(
|
||||
params, "view3d.select", "view3d.cursor3d", fallback)),
|
||||
params, "view3d.select", "view3d.cursor3d", fallback=fallback)),
|
||||
*([] if (not params.use_fallback_tool_rmb) else _template_view3d_select(
|
||||
type=params.select_mouse,
|
||||
value=params.select_mouse_value,
|
||||
|
@ -6299,6 +6377,27 @@ def km_3d_view_tool_edit_curve_draw(params):
|
|||
{"properties": [("wait_for_input", False)]}),]},)
|
||||
|
||||
|
||||
def km_3d_view_tool_edit_curve_pen(params):
|
||||
return (
|
||||
"3D View Tool: Edit Curve, Curve Pen",
|
||||
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
|
||||
{"items": [
|
||||
("curve.pen", {"type": params.tool_mouse, "value": 'PRESS'},
|
||||
{"properties": [
|
||||
("extrude_point", True),
|
||||
("move_segment", True),
|
||||
("select_point", True),
|
||||
("move_point", True),
|
||||
("close_spline_method", "ON_CLICK"),
|
||||
]}),
|
||||
("curve.pen", {"type": params.tool_mouse, "value": 'PRESS', "ctrl": True},
|
||||
{"properties": [("insert_point", True), ("delete_point", True)]}),
|
||||
("curve.pen", {"type": params.tool_mouse, "value": 'DOUBLE_CLICK'},
|
||||
{"properties": [("toggle_vector", True), ("cycle_handle_type", True),]}),
|
||||
]},
|
||||
)
|
||||
|
||||
|
||||
def km_3d_view_tool_edit_curve_tilt(params):
|
||||
return ("3D View Tool: Edit Curve, Tilt",
|
||||
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
|
||||
|
@ -6458,8 +6557,10 @@ def km_3d_view_tool_sculpt_color_filter(params):
|
|||
def km_3d_view_tool_sculpt_mask_by_color(params):
|
||||
return ("3D View Tool: Sculpt, Mask by Color",
|
||||
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
|
||||
{"items": [("sculpt.mask_by_color", {"type": params.tool_mouse, "value": 'ANY'}, None),
|
||||
("sculpt.mask_by_color", params.tool_tweak_event, None),]},)
|
||||
{"items": [
|
||||
("sculpt.mask_by_color", {"type": params.tool_mouse, "value": 'CLICK'}, None)
|
||||
]},
|
||||
)
|
||||
|
||||
|
||||
def km_3d_view_tool_sculpt_face_set_edit(params):
|
||||
|
@ -6612,7 +6713,7 @@ def km_3d_view_tool_edit_gpencil_select(params, *, fallback):
|
|||
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
|
||||
{"items": [
|
||||
*([] if (fallback and (params.select_mouse == 'RIGHTMOUSE')) else _template_items_tool_select(
|
||||
params, "gpencil.select", "view3d.cursor3d", fallback)),
|
||||
params, "gpencil.select", "view3d.cursor3d", fallback=fallback)),
|
||||
*([] if (not params.use_fallback_tool_rmb) else _template_view3d_gpencil_select(
|
||||
type=params.select_mouse, value=params.select_mouse_value, legacy=params.legacy)),
|
||||
]},
|
||||
|
@ -6716,7 +6817,7 @@ def km_3d_view_tool_edit_gpencil_interpolate(params):
|
|||
def km_3d_view_tool_sculpt_gpencil_select(params):
|
||||
return ("3D View Tool: Sculpt Gpencil, Tweak",
|
||||
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
|
||||
{"items": _template_items_tool_select(params, "gpencil.select", "view3d.cursor3d", False)},
|
||||
{"items": _template_items_tool_select(params, "gpencil.select", "view3d.cursor3d")},
|
||||
)
|
||||
|
||||
|
||||
|
@ -6748,7 +6849,7 @@ def km_sequencer_editor_tool_generic_select(params, *, fallback):
|
|||
{"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
|
||||
{"items": [
|
||||
*([] if (fallback and (params.select_mouse == 'RIGHTMOUSE')) else _template_items_tool_select(
|
||||
params, "sequencer.select", "sequencer.cursor_set", fallback)),
|
||||
params, "sequencer.select", "sequencer.cursor_set", cursor_prioritize=True, fallback=fallback)),
|
||||
|
||||
*([] if (not params.use_fallback_tool_rmb) else _template_sequencer_preview_select(
|
||||
type=params.select_mouse, value=params.select_mouse_value, legacy=params.legacy)),
|
||||
|
@ -6890,6 +6991,7 @@ def generate_keymaps(params=None):
|
|||
km_sequencercommon(params),
|
||||
km_sequencer(params),
|
||||
km_sequencerpreview(params),
|
||||
km_sequencer_channels(params),
|
||||
km_console(params),
|
||||
km_clip(params),
|
||||
km_clip_editor(params),
|
||||
|
@ -6969,6 +7071,7 @@ def generate_keymaps(params=None):
|
|||
km_view3d_dolly_modal(params),
|
||||
km_paint_stroke_modal(params),
|
||||
km_sculpt_expand_modal(params),
|
||||
km_curve_pen_modal_map(params),
|
||||
|
||||
# Gizmos.
|
||||
km_generic_gizmo(params),
|
||||
|
@ -7047,6 +7150,7 @@ def generate_keymaps(params=None):
|
|||
km_3d_view_tool_edit_mesh_rip_region(params),
|
||||
km_3d_view_tool_edit_mesh_rip_edge(params),
|
||||
km_3d_view_tool_edit_curve_draw(params),
|
||||
km_3d_view_tool_edit_curve_pen(params),
|
||||
km_3d_view_tool_edit_curve_radius(params),
|
||||
km_3d_view_tool_edit_curve_tilt(params),
|
||||
km_3d_view_tool_edit_curve_randomize(params),
|
||||
|
|
|
@ -1865,6 +1865,22 @@ def km_sequencerpreview(params):
|
|||
return keymap
|
||||
|
||||
|
||||
def km_sequencer_channels(params):
|
||||
items = []
|
||||
keymap = (
|
||||
"Sequencer Channels",
|
||||
{"space_type": 'SEQUENCE_EDITOR', "region_type": 'WINDOW'},
|
||||
{"items": items},
|
||||
)
|
||||
|
||||
items.extend([
|
||||
# Rename.
|
||||
("sequencer.rename_channel", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None),
|
||||
("sequencer.rename_channel", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
|
||||
])
|
||||
return keymap
|
||||
|
||||
|
||||
def km_console(params):
|
||||
items = []
|
||||
keymap = (
|
||||
|
@ -4090,6 +4106,7 @@ def generate_keymaps_impl(params=None):
|
|||
km_sequencercommon(params),
|
||||
km_sequencer(params),
|
||||
km_sequencerpreview(params),
|
||||
km_sequencer_channels(params),
|
||||
km_console(params),
|
||||
km_clip(params),
|
||||
km_clip_editor(params),
|
||||
|
|
|
@ -157,30 +157,57 @@ class DATA_PT_bone_groups(ArmatureButtonsPanel, Panel):
|
|||
|
||||
|
||||
class DATA_PT_pose_library(ArmatureButtonsPanel, Panel):
|
||||
bl_label = "Pose Library"
|
||||
bl_label = "Pose Library (Legacy)"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
return (context.object and context.object.type == 'ARMATURE' and context.object.pose)
|
||||
|
||||
@staticmethod
|
||||
def get_manual_url():
|
||||
url_fmt = "https://docs.blender.org/manual/en/%d.%d/animation/armatures/posing/editing/pose_library.html"
|
||||
return url_fmt % bpy.app.version[:2]
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
||||
col = layout.column(align=True)
|
||||
col.label(text="This panel is a remainder of the old pose library,")
|
||||
col.label(text="which was replaced by the Asset Browser.")
|
||||
|
||||
url = self.get_manual_url()
|
||||
col.operator('wm.url_open', text="More Info", icon="URL").url = url
|
||||
|
||||
layout.separator()
|
||||
|
||||
ob = context.object
|
||||
poselib = ob.pose_library
|
||||
|
||||
layout.template_ID(ob, "pose_library", new="poselib.new", unlink="poselib.unlink")
|
||||
col = layout.column(align=True)
|
||||
col.template_ID(ob, "pose_library", new="poselib.new", unlink="poselib.unlink")
|
||||
|
||||
if poselib:
|
||||
if hasattr(bpy.types, 'POSELIB_OT_convert_old_object_poselib'):
|
||||
col.operator('poselib.convert_old_object_poselib',
|
||||
text="Convert to Pose Assets", icon="ASSET_MANAGER")
|
||||
else:
|
||||
col.label(text="Enable the Pose Library add-on to convert", icon="ERROR")
|
||||
col.label(text="this legacy pose library to pose assets.", icon="BLANK1")
|
||||
|
||||
# Put the deprecated stuff in its own sub-layout.
|
||||
|
||||
dep_layout = layout.column()
|
||||
dep_layout.active = False
|
||||
|
||||
# warning about poselib being in an invalid state
|
||||
if poselib.fcurves and not poselib.pose_markers:
|
||||
layout.label(icon='ERROR', text="Error: Potentially corrupt library, run 'Sanitize' operator to fix")
|
||||
dep_layout.label(icon='ERROR', text="Error: Potentially corrupt library, run 'Sanitize' operator to fix")
|
||||
|
||||
# list of poses in pose library
|
||||
row = layout.row()
|
||||
row = dep_layout.row()
|
||||
row.template_list("UI_UL_list", "pose_markers", poselib, "pose_markers",
|
||||
poselib.pose_markers, "active_index", rows=5)
|
||||
poselib.pose_markers, "active_index", rows=3)
|
||||
|
||||
# column of operators for active pose
|
||||
# - goes beside list
|
||||
|
@ -203,7 +230,6 @@ class DATA_PT_pose_library(ArmatureButtonsPanel, Panel):
|
|||
).pose_index = poselib.pose_markers.active_index
|
||||
|
||||
col.operator("poselib.action_sanitize", icon='HELP', text="") # XXX: put in menu?
|
||||
col.operator("poselib.convert_old_poselib", icon='ASSET_MANAGER', text="")
|
||||
|
||||
if pose_marker_active is not None:
|
||||
col.operator("poselib.pose_move", icon='TRIA_UP', text="").direction = 'UP'
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
import bpy
|
||||
from bpy.types import Menu, Panel, UIList
|
||||
from rna_prop_ui import PropertyPanel
|
||||
from collections import defaultdict
|
||||
|
||||
|
||||
class MESH_MT_vertex_group_context_menu(Menu):
|
||||
|
@ -63,7 +62,7 @@ class MESH_MT_shape_key_context_menu(Menu):
|
|||
class MESH_MT_attribute_context_menu(Menu):
|
||||
bl_label = "Attribute Specials"
|
||||
|
||||
def draw(self, context):
|
||||
def draw(self, _context):
|
||||
layout = self.layout
|
||||
|
||||
layout.operator("geometry.attribute_convert")
|
||||
|
@ -130,20 +129,6 @@ class MESH_UL_uvmaps(UIList):
|
|||
layout.alignment = 'CENTER'
|
||||
layout.label(text="", icon_value=icon)
|
||||
|
||||
|
||||
class MESH_UL_vcols(UIList):
|
||||
def draw_item(self, _context, layout, _data, item, icon, _active_data, _active_propname, _index):
|
||||
# assert(isinstance(item, (bpy.types.MeshTexturePolyLayer,
|
||||
# bpy.types.MeshLoopColorLayer)))
|
||||
if self.layout_type in {'DEFAULT', 'COMPACT'}:
|
||||
layout.prop(item, "name", text="", emboss=False, icon='GROUP_VCOL')
|
||||
icon = 'RESTRICT_RENDER_OFF' if item.active_render else 'RESTRICT_RENDER_ON'
|
||||
layout.prop(item, "active_render", text="", icon=icon, emboss=False)
|
||||
elif self.layout_type == 'GRID':
|
||||
layout.alignment = 'CENTER'
|
||||
layout.label(text="", icon_value=icon)
|
||||
|
||||
|
||||
class MeshButtonsPanel:
|
||||
bl_space_type = 'PROPERTIES'
|
||||
bl_region_type = 'WINDOW'
|
||||
|
@ -425,112 +410,6 @@ class DATA_PT_uv_texture(MeshButtonsPanel, Panel):
|
|||
col.operator("mesh.uv_texture_add", icon='ADD', text="")
|
||||
col.operator("mesh.uv_texture_remove", icon='REMOVE', text="")
|
||||
|
||||
class MESH_UL_color_attributes(UIList):
|
||||
display_domain_names = {
|
||||
'POINT': "Vertex",
|
||||
'EDGE': "Edge",
|
||||
'FACE': "Face",
|
||||
'CORNER': "Face Corner",
|
||||
}
|
||||
|
||||
def filter_items(self, context, data, property):
|
||||
attrs = getattr(data, property)
|
||||
ret = []
|
||||
idxs = []
|
||||
idx = 0
|
||||
|
||||
for item in attrs:
|
||||
bad = item.domain not in ["POINT", "CORNER"]
|
||||
bad = bad or item.data_type not in ["FLOAT_COLOR", "BYTE_COLOR"]
|
||||
bad = bad or item.temporary
|
||||
|
||||
#if not bad:
|
||||
#print(bad, idx, item.name, item.domain, item.data_type)
|
||||
|
||||
ret.append(self.bitflag_filter_item if not bad else 0)
|
||||
idxs.append(idx)
|
||||
|
||||
# note this is index in full attribute list, not color list
|
||||
idx += 1
|
||||
|
||||
return ret, idxs
|
||||
|
||||
def draw_item(self, _context, layout, _data, attribute, _icon, _active_data, _active_propname, _index):
|
||||
data_type = attribute.bl_rna.properties['data_type'].enum_items[attribute.data_type]
|
||||
|
||||
domain_name = self.display_domain_names.get(attribute.domain, "")
|
||||
|
||||
split = layout.split(factor=0.50)
|
||||
split.emboss = 'NONE'
|
||||
split.prop(attribute, "name", text="")
|
||||
|
||||
split.prop(attribute, "active_render", text="", icon = 'RESTRICT_RENDER_OFF' if attribute.active_render else 'RESTRICT_RENDER_ON')
|
||||
|
||||
sub = split.row()
|
||||
sub.alignment = 'RIGHT'
|
||||
sub.active = False
|
||||
sub.label(text="%s ▶ %s" % (domain_name, data_type.name))
|
||||
|
||||
|
||||
class DATA_PT_vertex_colors(MeshButtonsPanel, Panel):
|
||||
bl_label = "Color Attributes"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_WORKBENCH'}
|
||||
|
||||
def draw(self, context):
|
||||
mesh = context.mesh
|
||||
|
||||
layout = self.layout
|
||||
row = layout.row()
|
||||
|
||||
col = row.column()
|
||||
col.template_list("MESH_UL_color_attributes",
|
||||
"attributes",
|
||||
mesh,
|
||||
"attributes",
|
||||
mesh.attributes,
|
||||
"active_color_index",
|
||||
rows=3,)
|
||||
|
||||
col = row.column(align=True)
|
||||
col.operator("geometry.color_attribute_add", icon='ADD', text="")
|
||||
col.operator("geometry.color_attribute_remove", icon='REMOVE', text="")
|
||||
|
||||
#active = mesh.attributes.active
|
||||
#if active and (active.domain == "POINT" and active.data_type == "FLOAT_COLOR"):
|
||||
# layout.operator("sculpt.vertex_to_loop_colors", text="Save To Corners")
|
||||
# layout.operator("sculpt.loop_to_vertex_colors", text="Load From Corners")
|
||||
|
||||
self.draw_attribute_warnings(context, layout)
|
||||
|
||||
def draw_attribute_warnings(self, context, layout):
|
||||
attributes_by_name = defaultdict(list)
|
||||
|
||||
ob = context.object
|
||||
mesh = ob.data
|
||||
|
||||
builtin_attribute = object()
|
||||
|
||||
def add_builtin(name):
|
||||
attributes_by_name[name].append(builtin_attribute)
|
||||
|
||||
def add_attributes(layers):
|
||||
for layer in layers:
|
||||
attributes_by_name[layer.name].append(layer)
|
||||
|
||||
add_builtin("position")
|
||||
add_builtin("material_index")
|
||||
add_builtin("shade_smooth")
|
||||
add_builtin("normal")
|
||||
add_builtin("crease")
|
||||
|
||||
add_attributes(mesh.attributes)
|
||||
|
||||
colliding_names = [name for name, layers in attributes_by_name.items() if len(layers) >= 2]
|
||||
if len(colliding_names) == 0:
|
||||
return
|
||||
|
||||
layout.label(text="Name collisions: {}".format(", ".join(colliding_names)), icon='ERROR')
|
||||
|
||||
class DATA_PT_remesh(MeshButtonsPanel, Panel):
|
||||
bl_label = "Remesh"
|
||||
|
@ -555,9 +434,7 @@ class DATA_PT_remesh(MeshButtonsPanel, Panel):
|
|||
col.prop(mesh, "use_remesh_preserve_volume", text="Volume")
|
||||
col.prop(mesh, "use_remesh_preserve_paint_mask", text="Paint Mask")
|
||||
col.prop(mesh, "use_remesh_preserve_sculpt_face_sets", text="Face Sets")
|
||||
|
||||
col.prop(mesh, "use_remesh_preserve_materials", text="Materials")
|
||||
col.prop(mesh, "use_remesh_preserve_vertex_colors", text="Vertex Colors")
|
||||
col.prop(mesh, "use_remesh_preserve_vertex_colors", text="Color Attributes")
|
||||
|
||||
col.operator("object.voxel_remesh", text="Voxel Remesh")
|
||||
else:
|
||||
|
@ -670,37 +547,114 @@ class DATA_PT_mesh_attributes(MeshButtonsPanel, Panel):
|
|||
self.draw_attribute_warnings(context, layout)
|
||||
|
||||
def draw_attribute_warnings(self, context, layout):
|
||||
attributes_by_name = defaultdict(list)
|
||||
|
||||
ob = context.object
|
||||
mesh = ob.data
|
||||
|
||||
builtin_attribute = object()
|
||||
unique_names = set()
|
||||
colliding_names = []
|
||||
for collection in (
|
||||
# Built-in names.
|
||||
{"position": None, "material_index": None, "shade_smooth": None, "normal": None, "crease": None},
|
||||
mesh.attributes,
|
||||
mesh.uv_layers,
|
||||
ob.vertex_groups,
|
||||
):
|
||||
for name in collection.keys():
|
||||
unique_names_len = len(unique_names)
|
||||
unique_names.add(name)
|
||||
if len(unique_names) == unique_names_len:
|
||||
colliding_names.append(name)
|
||||
|
||||
def add_builtin(name):
|
||||
attributes_by_name[name].append(builtin_attribute)
|
||||
|
||||
def add_attributes(layers):
|
||||
for layer in layers:
|
||||
attributes_by_name[layer.name].append(layer)
|
||||
|
||||
add_builtin("position")
|
||||
add_builtin("material_index")
|
||||
add_builtin("shade_smooth")
|
||||
add_builtin("normal")
|
||||
add_builtin("crease")
|
||||
|
||||
add_attributes(mesh.attributes)
|
||||
add_attributes(mesh.uv_layers)
|
||||
add_attributes(ob.vertex_groups)
|
||||
|
||||
colliding_names = [name for name, layers in attributes_by_name.items() if len(layers) >= 2]
|
||||
if len(colliding_names) == 0:
|
||||
if not colliding_names:
|
||||
return
|
||||
|
||||
layout.label(text="Name collisions: {}".format(", ".join(colliding_names)), icon='ERROR')
|
||||
layout.label(text="Name collisions: " + ", ".join(set(colliding_names)), icon='ERROR')
|
||||
|
||||
|
||||
class ColorAttributesListBase():
|
||||
display_domain_names = {
|
||||
'POINT': "Vertex",
|
||||
'EDGE': "Edge",
|
||||
'FACE': "Face",
|
||||
'CORNER': "Face Corner",
|
||||
}
|
||||
|
||||
def filter_items(self, _context, data, property):
|
||||
attrs = getattr(data, property)
|
||||
ret = []
|
||||
idxs = []
|
||||
|
||||
for idx, item in enumerate(attrs):
|
||||
skip = (
|
||||
(item.domain not in {"POINT", "CORNER"}) or
|
||||
(item.data_type not in {"FLOAT_COLOR", "BYTE_COLOR"})
|
||||
)
|
||||
ret.append(self.bitflag_filter_item if not skip else 0)
|
||||
idxs.append(idx)
|
||||
|
||||
return ret, idxs
|
||||
|
||||
|
||||
class MESH_UL_color_attributes(UIList, ColorAttributesListBase):
|
||||
def draw_item(self, _context, layout, data, attribute, _icon, _active_data, _active_propname, _index):
|
||||
data_type = attribute.bl_rna.properties['data_type'].enum_items[attribute.data_type]
|
||||
|
||||
domain_name = self.display_domain_names.get(attribute.domain, "")
|
||||
|
||||
split = layout.split(factor=0.50)
|
||||
split.emboss = 'NONE'
|
||||
split.prop(attribute, "name", text="")
|
||||
|
||||
active_render = _index == data.color_attributes.render_color_index
|
||||
|
||||
props = split.operator(
|
||||
"geometry.color_attribute_render_set",
|
||||
text="",
|
||||
icon='RESTRICT_RENDER_OFF' if active_render else 'RESTRICT_RENDER_ON',
|
||||
)
|
||||
|
||||
props.name = attribute.name
|
||||
|
||||
sub = split.row()
|
||||
sub.alignment = 'RIGHT'
|
||||
sub.active = False
|
||||
sub.label(text="%s ▶ %s" % (domain_name, data_type.name))
|
||||
|
||||
|
||||
class MESH_UL_color_attributes_selector(UIList, ColorAttributesListBase):
|
||||
def draw_item(self, _context, layout, data, attribute, _icon, _active_data, _active_propname, _index):
|
||||
layout.emboss = 'NONE'
|
||||
layout.prop(attribute, "name", text="", icon='COLOR')
|
||||
|
||||
|
||||
class DATA_PT_vertex_colors(DATA_PT_mesh_attributes, Panel):
|
||||
bl_label = "Color Attributes"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_WORKBENCH'}
|
||||
|
||||
def draw(self, context):
|
||||
mesh = context.mesh
|
||||
|
||||
layout = self.layout
|
||||
row = layout.row()
|
||||
|
||||
col = row.column()
|
||||
col.template_list(
|
||||
"MESH_UL_color_attributes",
|
||||
"color_attributes",
|
||||
mesh,
|
||||
"color_attributes",
|
||||
mesh.color_attributes,
|
||||
"active_color_index",
|
||||
rows=3,
|
||||
)
|
||||
|
||||
col = row.column(align=True)
|
||||
col.operator("geometry.color_attribute_add", icon='ADD', text="")
|
||||
col.operator("geometry.color_attribute_remove", icon='REMOVE', text="")
|
||||
|
||||
self.draw_attribute_warnings(context, layout)
|
||||
|
||||
classes = (MESH_MT_vertex_group_context_menu,
|
||||
MESH_MT_shape_key_context_menu,
|
||||
MESH_MT_attribute_context_menu,
|
||||
|
@ -708,7 +662,6 @@ classes = (MESH_MT_vertex_group_context_menu,
|
|||
MESH_UL_fmaps,
|
||||
MESH_UL_shape_keys,
|
||||
MESH_UL_uvmaps,
|
||||
MESH_UL_vcols,
|
||||
MESH_UL_attributes,
|
||||
MESH_UL_color_attributes,
|
||||
DATA_PT_context_mesh,
|
||||
|
@ -722,7 +675,10 @@ classes = (MESH_MT_vertex_group_context_menu,
|
|||
DATA_PT_texture_space,
|
||||
DATA_PT_remesh,
|
||||
DATA_PT_customdata,
|
||||
DATA_PT_custom_props_mesh,)
|
||||
DATA_PT_custom_props_mesh,
|
||||
MESH_UL_color_attributes,
|
||||
MESH_UL_color_attributes_selector,
|
||||
)
|
||||
|
||||
if __name__ == "__main__": # only for live edit.
|
||||
from bpy.utils import register_class
|
||||
|
|
|
@ -30,8 +30,8 @@ class GPENCIL_MT_material_context_menu(Menu):
|
|||
|
||||
layout.separator()
|
||||
|
||||
layout.operator("gpencil.material_to_vertex_color", text="Convert Materials to Vertex Color")
|
||||
layout.operator("gpencil.extract_palette_vertex", text="Extract Palette from Vertex Color")
|
||||
layout.operator("gpencil.material_to_vertex_color", text="Convert Materials to Color Attribute")
|
||||
layout.operator("gpencil.extract_palette_vertex", text="Extract Palette from Color Attribute")
|
||||
|
||||
layout.separator()
|
||||
|
||||
|
|
|
@ -878,8 +878,9 @@ class ClonePanel(BrushPanel):
|
|||
mat = ob.active_material
|
||||
if mat:
|
||||
col.label(text="Source Clone Slot")
|
||||
col.template_list("TEXTURE_UL_texpaintslots", "",
|
||||
mat, "texture_paint_images",
|
||||
col.template_list(
|
||||
"TEXTURE_UL_texpaintslots", "",
|
||||
mat, "texture_paint_slots",
|
||||
mat, "paint_clone_slot",
|
||||
rows=2,)
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue