Merge branch 'master' into asset-browser-grid-view
This commit is contained in:
commit
065bc42ce5
|
@ -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
|
||||
|
@ -268,6 +269,7 @@ ForEachMacros:
|
|||
StatementMacros:
|
||||
- PyObject_HEAD
|
||||
- PyObject_VAR_HEAD
|
||||
- ccl_gpu_kernel_postfix
|
||||
|
||||
MacroBlockBegin: "^BSDF_CLOSURE_CLASS_BEGIN$"
|
||||
MacroBlockEnd: "^BSDF_CLOSURE_CLASS_END$"
|
||||
|
|
|
@ -432,8 +432,8 @@ PYTHON_MODULES_PIP=(
|
|||
)
|
||||
|
||||
|
||||
BOOST_VERSION="1.73.0"
|
||||
BOOST_VERSION_SHORT="1.73"
|
||||
BOOST_VERSION="1.78.0"
|
||||
BOOST_VERSION_SHORT="1.78"
|
||||
BOOST_VERSION_MIN="1.49"
|
||||
BOOST_VERSION_MEX="2.0"
|
||||
BOOST_FORCE_BUILD=false
|
||||
|
@ -442,15 +442,15 @@ BOOST_SKIP=false
|
|||
|
||||
TBB_VERSION="2020"
|
||||
TBB_VERSION_SHORT="2020"
|
||||
TBB_VERSION_UPDATE="_U2" # Used for source packages...
|
||||
TBB_VERSION_UPDATE="_U3" # Used for source packages...
|
||||
TBB_VERSION_MIN="2018"
|
||||
TBB_VERSION_MEX="2022"
|
||||
TBB_FORCE_BUILD=false
|
||||
TBB_FORCE_REBUILD=false
|
||||
TBB_SKIP=false
|
||||
|
||||
OCIO_VERSION="2.0.0"
|
||||
OCIO_VERSION_SHORT="2.0"
|
||||
OCIO_VERSION="2.1.1"
|
||||
OCIO_VERSION_SHORT="2.1"
|
||||
OCIO_VERSION_MIN="2.0"
|
||||
OCIO_VERSION_MEX="3.0"
|
||||
OCIO_FORCE_BUILD=false
|
||||
|
@ -466,10 +466,10 @@ OPENEXR_FORCE_REBUILD=false
|
|||
OPENEXR_SKIP=false
|
||||
_with_built_openexr=false
|
||||
|
||||
OIIO_VERSION="2.2.15.1"
|
||||
OIIO_VERSION_SHORT="2.2"
|
||||
OIIO_VERSION="2.3.13.0"
|
||||
OIIO_VERSION_SHORT="2.3"
|
||||
OIIO_VERSION_MIN="2.1.12"
|
||||
OIIO_VERSION_MEX="2.3.0"
|
||||
OIIO_VERSION_MEX="2.4.0"
|
||||
OIIO_FORCE_BUILD=false
|
||||
OIIO_FORCE_REBUILD=false
|
||||
OIIO_SKIP=false
|
||||
|
@ -493,7 +493,7 @@ OSL_FORCE_REBUILD=false
|
|||
OSL_SKIP=false
|
||||
|
||||
# OpenSubdiv needs to be compiled for now
|
||||
OSD_VERSION="3.4.3"
|
||||
OSD_VERSION="3.4.4"
|
||||
OSD_VERSION_SHORT="3.4"
|
||||
OSD_VERSION_MIN="3.4"
|
||||
OSD_VERSION_MEX="4.0"
|
||||
|
@ -502,19 +502,19 @@ OSD_FORCE_REBUILD=false
|
|||
OSD_SKIP=false
|
||||
|
||||
# OpenVDB needs to be compiled for now
|
||||
OPENVDB_BLOSC_VERSION="1.5.0"
|
||||
OPENVDB_BLOSC_VERSION="1.21.1"
|
||||
|
||||
OPENVDB_VERSION="8.0.1"
|
||||
OPENVDB_VERSION_SHORT="8.0"
|
||||
OPENVDB_VERSION_MIN="8.0"
|
||||
OPENVDB_VERSION_MEX="8.1"
|
||||
OPENVDB_VERSION="9.0.0"
|
||||
OPENVDB_VERSION_SHORT="9.0"
|
||||
OPENVDB_VERSION_MIN="9.0"
|
||||
OPENVDB_VERSION_MEX="9.1"
|
||||
OPENVDB_FORCE_BUILD=false
|
||||
OPENVDB_FORCE_REBUILD=false
|
||||
OPENVDB_SKIP=false
|
||||
|
||||
# Alembic needs to be compiled for now
|
||||
ALEMBIC_VERSION="1.7.16"
|
||||
ALEMBIC_VERSION_SHORT="1.7"
|
||||
ALEMBIC_VERSION="1.8.3"
|
||||
ALEMBIC_VERSION_SHORT="1.8"
|
||||
ALEMBIC_VERSION_MIN="1.7"
|
||||
ALEMBIC_VERSION_MEX="2.0"
|
||||
ALEMBIC_FORCE_BUILD=false
|
||||
|
@ -537,15 +537,15 @@ OPENCOLLADA_FORCE_BUILD=false
|
|||
OPENCOLLADA_FORCE_REBUILD=false
|
||||
OPENCOLLADA_SKIP=false
|
||||
|
||||
EMBREE_VERSION="3.10.0"
|
||||
EMBREE_VERSION_SHORT="3.10"
|
||||
EMBREE_VERSION_MIN="3.10"
|
||||
EMBREE_VERSION="3.13.3"
|
||||
EMBREE_VERSION_SHORT="3.13"
|
||||
EMBREE_VERSION_MIN="3.13"
|
||||
EMBREE_VERSION_MEX="4.0"
|
||||
EMBREE_FORCE_BUILD=false
|
||||
EMBREE_FORCE_REBUILD=false
|
||||
EMBREE_SKIP=false
|
||||
|
||||
OIDN_VERSION="1.4.1"
|
||||
OIDN_VERSION="1.4.3"
|
||||
OIDN_VERSION_SHORT="1.4"
|
||||
OIDN_VERSION_MIN="1.4.0"
|
||||
OIDN_VERSION_MEX="1.5"
|
||||
|
@ -553,7 +553,7 @@ OIDN_FORCE_BUILD=false
|
|||
OIDN_FORCE_REBUILD=false
|
||||
OIDN_SKIP=false
|
||||
|
||||
ISPC_VERSION="1.16.0"
|
||||
ISPC_VERSION="1.17.0"
|
||||
|
||||
FFMPEG_VERSION="4.4"
|
||||
FFMPEG_VERSION_SHORT="4.4"
|
||||
|
@ -1029,7 +1029,7 @@ OPENEXR_SOURCE_REPO_UID="0ac2ea34c8f3134148a5df4052e40f155b76f6fb"
|
|||
#~ OPENEXR_SOURCE=( "https://github.com/openexr/openexr/archive/$OPENEXR_SOURCE_REPO_UID.tar.gz" )
|
||||
|
||||
OIIO_USE_REPO=false
|
||||
OIIO_SOURCE=( "https://github.com/OpenImageIO/oiio/archive/Release-$OIIO_VERSION.tar.gz" )
|
||||
OIIO_SOURCE=( "https://github.com/OpenImageIO/oiio/archive/refs/tags/v$OIIO_VERSION.tar.gz" )
|
||||
#~ OIIO_SOURCE_REPO=( "https://github.com/OpenImageIO/oiio.git" )
|
||||
#~ OIIO_SOURCE_REPO_UID="c9e67275a0b248ead96152f6d2221cc0c0f278a4"
|
||||
|
||||
|
@ -2034,7 +2034,7 @@ compile_OIIO() {
|
|||
else
|
||||
download OIIO_SOURCE[@] "$_src.tar.gz"
|
||||
INFO "Unpacking OpenImageIO-$OIIO_VERSION"
|
||||
tar -C $SRC --transform "s,(.*/?)oiio-Release-[^/]*(.*),\1OpenImageIO-$OIIO_VERSION\2,x" -xf $_src.tar.gz
|
||||
tar -C $SRC --transform "s,(.*/?)oiio-[^/]*(.*),\1OpenImageIO-$OIIO_VERSION\2,x" -xf $_src.tar.gz
|
||||
fi
|
||||
fi
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -41,7 +41,7 @@ class MATERIAL_UL_matslots_example(bpy.types.UIList):
|
|||
else:
|
||||
layout.label(text="", translate=False, icon_value=icon)
|
||||
# 'GRID' layout type should be as compact as possible (typically a single icon!).
|
||||
elif self.layout_type in {'GRID'}:
|
||||
elif self.layout_type == 'GRID':
|
||||
layout.alignment = 'CENTER'
|
||||
layout.label(text="", icon_value=icon)
|
||||
|
||||
|
|
|
@ -73,7 +73,7 @@ class MESH_UL_vgroups_slow(bpy.types.UIList):
|
|||
layout.prop(vgroup, "name", text="", emboss=False, icon_value=icon)
|
||||
icon = 'LOCKED' if vgroup.lock_weight else 'UNLOCKED'
|
||||
layout.prop(vgroup, "lock_weight", text="", icon=icon, emboss=False)
|
||||
elif self.layout_type in {'GRID'}:
|
||||
elif self.layout_type == 'GRID':
|
||||
layout.alignment = 'CENTER'
|
||||
if flt_flag & self.VGROUP_EMPTY:
|
||||
layout.enabled = False
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -12,7 +12,7 @@ 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_view_layer import ViewLayerCryptomattePanel, ViewLayerAOVPanel, ViewLayerLightgroupsPanel
|
||||
|
||||
class CyclesPresetPanel(PresetPanel, Panel):
|
||||
COMPAT_ENGINES = {'CYCLES'}
|
||||
|
@ -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,45 @@ 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
|
||||
|
||||
col = layout.column(align=True)
|
||||
col.prop_search(ob, "lightgroup", view_layer, "lightgroups", text="Light Group")
|
||||
|
||||
|
||||
class CYCLES_OBJECT_PT_visibility(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Visibility"
|
||||
bl_context = "object"
|
||||
|
@ -1300,6 +1353,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 +1430,14 @@ 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")
|
||||
|
||||
col = layout.column(align=True)
|
||||
col.prop_search(world, "lightgroup", view_layer, "lightgroups", text="Light Group")
|
||||
|
||||
|
||||
class CYCLES_WORLD_PT_volume(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Volume"
|
||||
|
@ -1496,6 +1555,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):
|
||||
|
@ -2183,6 +2244,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 +2255,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());
|
||||
}
|
||||
|
||||
|
|
|
@ -69,6 +69,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 +81,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
|
||||
###########################################################################
|
||||
|
@ -126,31 +144,40 @@ 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)
|
||||
find_package(PNG REQUIRED)
|
||||
endif()
|
||||
|
@ -161,76 +188,70 @@ 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()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
|
@ -238,22 +259,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 +296,59 @@ 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_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_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 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 +356,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 +388,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 +435,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 +465,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 +487,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()
|
||||
|
||||
###########################################################################
|
||||
|
@ -438,9 +522,9 @@ if(CYCLES_STANDALONE_REPOSITORY)
|
|||
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)
|
||||
else()
|
||||
# Workaround for unconventional variable name use in Blender.
|
||||
set(GLEW_INCLUDE_DIR "${GLEW_INCLUDE_PATH}")
|
||||
|
@ -466,11 +550,11 @@ if(CYCLES_STANDALONE_REPOSITORY)
|
|||
|
||||
find_package(OpenGL REQUIRED)
|
||||
|
||||
set(CYCLES_GL_LIBRARIES
|
||||
${OPENGL_gl_LIBRARY}
|
||||
${OPENGL_glu_LIBRARY}
|
||||
${GLEW_LIBRARY}
|
||||
)
|
||||
set(CYCLES_GL_LIBRARIES
|
||||
${OPENGL_gl_LIBRARY}
|
||||
${OPENGL_glu_LIBRARY}
|
||||
${GLEW_LIBRARY}
|
||||
)
|
||||
else()
|
||||
set(CYCLES_GL_LIBRARIES
|
||||
bf_intern_glew_mx
|
||||
|
|
|
@ -144,13 +144,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()
|
||||
|
|
|
@ -91,35 +91,15 @@ target_compile_definitions(hdCyclesStatic
|
|||
)
|
||||
|
||||
target_link_libraries(hdCyclesStatic
|
||||
PUBLIC
|
||||
hd
|
||||
hgi
|
||||
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
|
||||
)
|
||||
|
||||
if(USD_PYTHON_LIBRARIES)
|
||||
target_link_libraries(hdCyclesStatic
|
||||
PRIVATE
|
||||
${USD_PYTHON_LIBRARIES}
|
||||
)
|
||||
endif()
|
||||
|
||||
set(HdCyclesPluginName hdCycles)
|
||||
add_library(${HdCyclesPluginName} SHARED
|
||||
plugin.h
|
||||
|
@ -144,12 +124,6 @@ target_link_libraries(${HdCyclesPluginName}
|
|||
hdCyclesStatic
|
||||
)
|
||||
|
||||
target_link_directories(${HdCyclesPluginName}
|
||||
BEFORE
|
||||
PRIVATE
|
||||
${USD_LIBRARY_DIR}
|
||||
)
|
||||
|
||||
cycles_target_link_libraries(${HdCyclesPluginName})
|
||||
|
||||
if(WITH_CYCLES_BLENDER)
|
||||
|
@ -162,9 +136,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,6 +82,7 @@ void HdCyclesCamera::Sync(HdSceneDelegate *sceneDelegate,
|
|||
}
|
||||
#endif
|
||||
|
||||
#if PXR_VERSION < 2111
|
||||
if (*dirtyBits & DirtyBits::DirtyProjMatrix) {
|
||||
value = sceneDelegate->GetCameraParamValue(id, HdCameraTokens->projectionMatrix);
|
||||
if (!value.IsEmpty()) {
|
||||
|
@ -113,6 +123,7 @@ void HdCyclesCamera::Sync(HdSceneDelegate *sceneDelegate,
|
|||
#endif
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (*dirtyBits & DirtyBits::DirtyWindowPolicy) {
|
||||
value = sceneDelegate->GetCameraParamValue(id, HdCameraTokens->windowPolicy);
|
||||
|
@ -137,9 +148,9 @@ 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 ?
|
||||
_data.SetProjection(value.Get<TfToken>() != _tokens->orthographic ?
|
||||
GfCamera::Perspective :
|
||||
GfCamera::Orthographic);
|
||||
}
|
||||
|
|
|
@ -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,7 @@ 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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,13 +444,14 @@ 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]);
|
||||
const float3 dir = make_float3(klight->spot.dir[0], klight->spot.dir[1], klight->spot.dir[2]);
|
||||
/* the normal of the oriented disk */
|
||||
const float3 lightN = normalize(ray_P - center);
|
||||
/* we set the light normal to the outgoing direction to support texturing*/
|
||||
/* We set the light normal to the outgoing direction to support texturing. */
|
||||
ls->Ng = -ls->D;
|
||||
|
||||
float invarea = klight->spot.invarea;
|
||||
|
@ -467,7 +480,7 @@ ccl_device bool light_sample_from_intersection(KernelGlobals kg,
|
|||
const float3 center = make_float3(klight->co[0], klight->co[1], klight->co[2]);
|
||||
const float3 lighN = normalize(ray_P - center);
|
||||
|
||||
/* we set the light normal to the outgoing direction to support texturing*/
|
||||
/* We set the light normal to the outgoing direction to support texturing. */
|
||||
ls->Ng = -ls->D;
|
||||
|
||||
float invarea = klight->spot.invarea;
|
||||
|
@ -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. */
|
||||
|
|
|
@ -180,7 +180,7 @@ bool Geometry::has_true_displacement() const
|
|||
}
|
||||
|
||||
void Geometry::compute_bvh(
|
||||
Device *device, DeviceScene *dscene, SceneParams *params, Progress *progress, int n, int total)
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -87,7 +87,7 @@ class DebugFlags {
|
|||
/* Reset flags to their defaults. */
|
||||
void reset();
|
||||
|
||||
/* Whether adaptive feature based runtime compile is enabled or not.*/
|
||||
/* Whether adaptive feature based runtime compile is enabled or not. */
|
||||
bool adaptive_compile;
|
||||
};
|
||||
|
||||
|
@ -110,7 +110,7 @@ class DebugFlags {
|
|||
/* Reset flags to their defaults. */
|
||||
void reset();
|
||||
|
||||
/* Whether adaptive feature based runtime compile is enabled or not.*/
|
||||
/* Whether adaptive feature based runtime compile is enabled or not. */
|
||||
bool adaptive_compile;
|
||||
};
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -15,7 +15,7 @@ CCL_NAMESPACE_BEGIN
|
|||
#define TEX_IMAGE_MISSING_A 1
|
||||
|
||||
/* Interpolation types for textures
|
||||
* cuda also use texture space to store other objects */
|
||||
* CUDA also use texture space to store other objects. */
|
||||
typedef enum InterpolationType {
|
||||
INTERPOLATION_NONE = -1,
|
||||
INTERPOLATION_LINEAR = 0,
|
||||
|
|
|
@ -64,7 +64,7 @@
|
|||
ime.event.target_end = -1;
|
||||
|
||||
/* Register a function to be executed when Input Method is changed using
|
||||
* 'Control + Space' or language-specific keys (such as 'Eisu / Kana' key for Japanese).*/
|
||||
* 'Control + Space' or language-specific keys (such as 'Eisu / Kana' key for Japanese). */
|
||||
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
|
||||
[center addObserver:self
|
||||
selector:@selector(ImeDidChangeCallback:)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -7719,7 +7719,7 @@
|
|||
<g
|
||||
style="display:inline;fill:#ffffff;enable-background:new"
|
||||
id="g13475"
|
||||
transform="translate(-20)">
|
||||
transform="translate(-21)">
|
||||
<path
|
||||
sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccccccccc"
|
||||
mask="none"
|
||||
|
@ -7741,7 +7741,7 @@
|
|||
</g>
|
||||
<g
|
||||
style="display:inline;fill:#ffffff;enable-background:new"
|
||||
transform="matrix(-1,0,0,1,90,-231)"
|
||||
transform="matrix(-1,0,0,1,89,-231)"
|
||||
id="g12197">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
|
@ -8569,7 +8569,7 @@
|
|||
<g
|
||||
style="display:inline;fill:#ffffff;enable-background:new"
|
||||
id="g12259"
|
||||
transform="matrix(0,-1,-1,0,313,-85.999995)"
|
||||
transform="matrix(0,-1,-1,0,312,-85.999995)"
|
||||
inkscape:export-filename="blender_icons.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96">
|
||||
|
@ -8823,7 +8823,7 @@
|
|||
<g
|
||||
style="display:inline;fill:#ffffff;enable-background:new"
|
||||
id="g12761"
|
||||
transform="translate(72.999998)"
|
||||
transform="translate(71.999998)"
|
||||
inkscape:export-filename="blender_icons.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96">
|
||||
|
@ -10405,7 +10405,7 @@
|
|||
sodipodi:nodetypes="sssss" />
|
||||
</g>
|
||||
<g
|
||||
transform="translate(0.97000661)"
|
||||
transform="translate(-0.02999339)"
|
||||
style="display:inline;fill:#ffffff;enable-background:new"
|
||||
id="g14346">
|
||||
<path
|
||||
|
@ -10995,7 +10995,7 @@
|
|||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
style="display:inline;fill:#ffffff;enable-background:new"
|
||||
transform="translate(-188,168)"
|
||||
transform="translate(-189,168)"
|
||||
id="g21028">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
|
@ -11064,7 +11064,7 @@
|
|||
<g
|
||||
style="display:inline;fill:#ffffff;enable-background:new"
|
||||
id="g19653"
|
||||
transform="translate(-626.99987,42.000005)">
|
||||
transform="translate(-627.99987,42.000005)">
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 143.13867,515.0332 c -0.49613,-0.0451 -1.03862,0.15972 -1.49219,0.61328 l -1.75,1.75 c -0.19519,0.19527 -0.19519,0.51177 0,0.70704 l 3,3 c 0.19527,0.19519 0.51177,0.19519 0.70704,0 l 1.75,-1.75 c 0.45356,-0.45357 0.65838,-0.99606 0.61328,-1.49219 -0.0451,-0.49613 -0.30436,-0.90592 -0.61328,-1.21485 l -1,-1 c -0.30893,-0.30892 -0.71872,-0.56817 -1.21485,-0.61328 z m -4.39648,3.7168 a 0.50005,0.50005 0 0 0 -0.34571,0.14648 l -0.25,0.25 a 0.50005,0.50005 0 0 0 0,0.70704 l 3,3 a 0.50005,0.50005 0 0 0 0.70704,0 l 0.25,-0.25 a 0.50005,0.50005 0 0 0 0,-0.70704 l -3,-3 A 0.50005,0.50005 0 0 0 138.74219,518.75 Z m -1.25196,2.24609 a 0.50005,0.50005 0 0 0 -0.34375,0.15039 l -4.25,4.25 c -0.83838,0.83839 -1.06879,1.7573 -0.80273,2.4668 C 132.35981,528.57278 133.04167,529 133.75,529 H 138 c 1.00042,0 2,-0.79793 2,-2 v -3.5 a 0.50005,0.50005 0 1 0 -1,0 v 3.5 c 0,0.66505 -0.50442,1 -1,1 h -4.25 c -0.29167,0 -0.60981,-0.19778 -0.71875,-0.48828 -0.10894,-0.2905 -0.0893,-0.74659 0.57227,-1.4082 l 4.25,-4.25 a 0.50005,0.50005 0 0 0 -0.36329,-0.85743 z"
|
||||
|
@ -11396,7 +11396,7 @@
|
|||
<g
|
||||
style="display:inline;fill:#ffffff;enable-background:new"
|
||||
id="g22292"
|
||||
transform="translate(-87.000002,-170)">
|
||||
transform="translate(-88.000002,-170)">
|
||||
<g
|
||||
transform="translate(20,10)"
|
||||
id="g22287"
|
||||
|
@ -12431,11 +12431,6 @@
|
|||
id="path24010-2"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 310.57031,473.01758 c -0.79787,-0.038 -1.57177,0.27684 -2.16015,0.86523 l -1.48633,1.48828 c -0.61577,0.57533 -0.93433,1.35407 -0.89258,2.1543 a 0.50005,0.50005 0 1 0 0.99805,-0.0508 c -0.0269,-0.51495 0.15566,-0.98016 0.57617,-1.37305 a 0.50005,0.50005 0 0 0 0.0117,-0.0117 l 1.5,-1.5 c 0.41161,-0.41161 0.88966,-0.59872 1.40429,-0.57422 0.51464,0.0245 1.08439,0.26993 1.63868,0.82422 0.55479,0.5548 0.80954,1.13546 0.83789,1.65235 0.0283,0.51688 -0.15241,0.9848 -0.57422,1.3789 a 0.50005,0.50005 0 0 0 -0.0137,0.0117 l -1.5,1.5 c -0.41213,0.41213 -0.87694,0.60352 -1.39649,0.60352 a 0.50005,0.50005 0 1 0 0,1 c 0.78067,0 1.52491,-0.31788 2.10352,-0.89649 l 1.48828,-1.48828 c 0.61768,-0.57711 0.9366,-1.36125 0.89258,-2.16406 -0.044,-0.80281 -0.43566,-1.60948 -1.13086,-2.30469 -0.69571,-0.69571 -1.49901,-1.07724 -2.29688,-1.11523 z m -1.08008,3.97851 a 0.50005,0.50005 0 0 0 -0.34375,0.15039 l -5,5 a 0.50005,0.50005 0 1 0 0.70704,0.70704 l 5,-5 a 0.50005,0.50005 0 0 0 -0.36329,-0.85743 z m -4.92968,2.02149 c -0.80753,-0.0482 -1.5954,0.26944 -2.17578,0.89062 l -1.48829,1.48828 c -0.58838,0.58839 -0.90322,1.36034 -0.86523,2.15821 0.038,0.79787 0.41952,1.60311 1.11523,2.29883 0.69521,0.6952 1.50384,1.08487 2.30664,1.1289 0.80281,0.044 1.585,-0.27294 2.16211,-0.89062 l 1.48829,-1.48828 C 307.68213,484.0249 308,483.28067 308,482.5 a 0.50005,0.50005 0 1 0 -1,0 c 0,0.51955 -0.19139,0.98436 -0.60352,1.39648 l -1.5,1.5 a 0.50005,0.50005 0 0 0 -0.0117,0.0117 c -0.39411,0.42182 -0.86007,0.60452 -1.37696,0.57618 -0.51688,-0.0283 -1.0995,-0.2831 -1.65429,-0.8379 -0.55429,-0.55428 -0.79776,-1.12404 -0.82227,-1.63867 -0.0245,-0.51463 0.16065,-0.99268 0.57227,-1.40429 l 1.5,-1.5 a 0.50005,0.50005 0 0 0 0.0117,-0.0117 c 0.39634,-0.4242 0.86629,-0.60725 1.38672,-0.57618 a 0.50005,0.50005 0 1 0 0.0586,-0.99804 z"
|
||||
id="path23281"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
style="display:inline;fill:#ffffff;enable-background:new"
|
||||
id="g23341"
|
||||
|
@ -13044,7 +13039,7 @@
|
|||
inkscape:export-ydpi="96"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-filename="blender_icons.png"
|
||||
transform="translate(-20,168)"
|
||||
transform="translate(-21,168)"
|
||||
id="g15951-6"
|
||||
style="display:inline;opacity:1;fill:#ffffff;enable-background:new">
|
||||
<path
|
||||
|
@ -14438,7 +14433,7 @@
|
|||
<path
|
||||
id="path16385"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
|
||||
d="m 516.5,432 c -0.1326,2e-5 -0.25976,0.0527 -0.35352,0.14647 L 514.29297,434 H 511.5 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 8 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 6.45312 0.004 c 0.0131,-8.2e-4 0.0261,-0.002 0.0391,-0.004 0.004,5e-5 0.008,5e-5 0.0117,0 0.0143,0.002 0.0286,0.003 0.043,0.004 h 0.006 5.44336 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -8 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 h -1.79297 l -1.85351,-1.85353 C 519.76,432.05268 519.6327,431.99995 519.5,432 Z m 1.49781,1.99804 c 2.21589,-3.2e-4 4.00185,1.7855 4.00195,4.00196 -9e-4,2.19736 -1.75841,3.97457 -3.95508,4 -0.0131,8.2e-4 -0.0261,0.002 -0.0391,0.004 -0.0149,-0.002 -0.0299,-0.003 -0.0449,-0.004 -10e-4,0 -0.003,0 -0.004,0 -2.19824,-0.0228 -3.95803,-1.80057 -3.95898,-4 9e-5,-2.21578 1.78479,-4.00131 4,-4.00196 z M 517.99805,435 C 516.34742,435 515,436.34922 515,438 c 0,1.65079 1.34742,3 2.99805,3 1.65063,0 3,-1.34921 3,-3 0,-1.65078 -1.34937,-3 -3,-3 z m 0,1 c 1.11009,0 2,0.88955 2,2 0,1.11045 -0.88991,2 -2,2 C 516.88796,440 516,439.11045 516,438 c 0,-1.11045 0.88796,-2 1.99805,-2 z"
|
||||
d="m 515.5,432 c -0.1326,2e-5 -0.25976,0.0527 -0.35352,0.14647 L 513.29297,434 H 510.5 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 8 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 6.45312 0.004 c 0.0131,-8.2e-4 0.0261,-0.002 0.0391,-0.004 0.004,5e-5 0.008,5e-5 0.0117,0 0.0143,0.002 0.0286,0.003 0.043,0.004 h 0.006 5.44336 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -8 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 h -1.79297 l -1.85351,-1.85353 C 518.76,432.05268 518.6327,431.99995 518.5,432 Z m 1.49781,1.99804 c 2.21589,-3.2e-4 4.00185,1.7855 4.00195,4.00196 -9e-4,2.19736 -1.75841,3.97457 -3.95508,4 -0.0131,8.2e-4 -0.0261,0.002 -0.0391,0.004 -0.0149,-0.002 -0.0299,-0.003 -0.0449,-0.004 -10e-4,0 -0.003,0 -0.004,0 -2.19824,-0.0228 -3.95803,-1.80057 -3.95898,-4 9e-5,-2.21578 1.78479,-4.00131 4,-4.00196 z M 516.99805,435 C 515.34742,435 514,436.34922 514,438 c 0,1.65079 1.34742,3 2.99805,3 1.65063,0 3,-1.34921 3,-3 0,-1.65078 -1.34937,-3 -3,-3 z m 0,1 c 1.11009,0 2,0.88955 2,2 0,1.11045 -0.88991,2 -2,2 C 515.88796,440 515,439.11045 515,438 c 0,-1.11045 0.88796,-2 1.99805,-2 z"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
|
@ -14448,18 +14443,18 @@
|
|||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path22635-0-9"
|
||||
d="m 495.5,432 a 0.50005,0.50005 0 0 0 -0.35352,0.14648 L 493.29297,434 H 490.5 a 0.50005,0.50005 0 0 0 -0.5,0.5 v 8 a 0.50005,0.50005 0 0 0 0.5,0.5 h 12 a 0.50005,0.50005 0 0 0 0.5,-0.5 v -8 a 0.50005,0.50005 0 0 0 -0.5,-0.5 h -1.79297 l -1.85351,-1.85352 A 0.50005,0.50005 0 0 0 498.5,432 Z m 0.20703,1 h 2.58594 l 1.85351,1.85352 A 0.50005,0.50005 0 0 0 500.5,435 h 1.5 v 7 h -11 v -7 h 2.5 a 0.50005,0.50005 0 0 0 0.35352,-0.14648 z m -0.46094,2.74414 a 0.50005,0.50005 0 0 0 -0.34961,0.85938 l 1.39649,1.39648 -1.39649,1.39648 a 0.50005,0.50005 0 1 0 0.70704,0.70704 L 497,438.70703 l 1.39648,1.39649 a 0.50005,0.50005 0 1 0 0.70704,-0.70704 L 497.70703,438 l 1.39649,-1.39648 a 0.50005,0.50005 0 1 0 -0.70704,-0.70704 L 497,437.29297 l -1.39648,-1.39649 a 0.50005,0.50005 0 0 0 -0.35743,-0.15234 z"
|
||||
d="m 494.5,432 a 0.50005,0.50005 0 0 0 -0.35352,0.14648 L 492.29297,434 H 489.5 a 0.50005,0.50005 0 0 0 -0.5,0.5 v 8 a 0.50005,0.50005 0 0 0 0.5,0.5 h 12 a 0.50005,0.50005 0 0 0 0.5,-0.5 v -8 a 0.50005,0.50005 0 0 0 -0.5,-0.5 h -1.79297 l -1.85351,-1.85352 A 0.50005,0.50005 0 0 0 497.5,432 Z m 0.20703,1 h 2.58594 l 1.85351,1.85352 A 0.50005,0.50005 0 0 0 499.5,435 h 1.5 v 7 h -11 v -7 h 2.5 a 0.50005,0.50005 0 0 0 0.35352,-0.14648 z m -0.46094,2.74414 a 0.50005,0.50005 0 0 0 -0.34961,0.85938 l 1.39649,1.39648 -1.39649,1.39648 a 0.50005,0.50005 0 1 0 0.70704,0.70704 L 496,438.70703 l 1.39648,1.39649 a 0.50005,0.50005 0 1 0 0.70704,-0.70704 L 496.70703,438 l 1.39649,-1.39648 a 0.50005,0.50005 0 1 0 -0.70704,-0.70704 L 496,437.29297 l -1.39648,-1.39649 a 0.50005,0.50005 0 0 0 -0.35743,-0.15234 z"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path19969-0"
|
||||
d="m 471.49125,433 c -0.3497,0.006 -0.58488,0.36077 -0.45507,0.68555 l 4,10.00195 c 0.1779,0.45034 0.82806,0.4102 0.94922,-0.0586 l 1.17578,-4.46875 4.46679,-1.17578 c 0.46499,-0.12321 0.50486,-0.76769 0.0586,-0.94727 l -10,-4.00195 c -0.0621,-0.0247 -0.12852,-0.0366 -0.19532,-0.0351 z"
|
||||
d="m 470.49125,433 c -0.3497,0.006 -0.58488,0.36077 -0.45507,0.68555 l 4,10.00195 c 0.1779,0.45034 0.82806,0.4102 0.94922,-0.0586 l 1.17578,-4.46875 4.46679,-1.17578 c 0.46499,-0.12321 0.50486,-0.76769 0.0586,-0.94727 l -10,-4.00195 c -0.0621,-0.0247 -0.12852,-0.0366 -0.19532,-0.0351 z"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path19971-4"
|
||||
d="m 450.49078,433 a 0.50005,0.50005 0 0 0 -0.45507,0.68555 l 4,10.00195 a 0.50050292,0.50050292 0 1 0 0.92968,-0.37109 l -3.5664,-8.91797 8.91601,3.5664 a 0.50005,0.50005 0 1 0 0.3711,-0.92773 l -10,-4.00195 A 0.50005,0.50005 0 0 0 450.49078,433 Z"
|
||||
d="m 449.49078,433 a 0.50005,0.50005 0 0 0 -0.45507,0.68555 l 4,10.00195 a 0.50050292,0.50050292 0 1 0 0.92968,-0.37109 l -3.5664,-8.91797 8.91601,3.5664 a 0.50005,0.50005 0 1 0 0.3711,-0.92773 l -10,-4.00195 A 0.50005,0.50005 0 0 0 449.49078,433 Z"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" />
|
||||
<g
|
||||
transform="translate(37.00977,-1667.9941)"
|
||||
|
@ -14570,7 +14565,7 @@
|
|||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path13646-9"
|
||||
d="m 406.50195,437 a 0.50005,0.50005 0 0 0 -0.33203,0.84375 c 1.3239,1.43817 3.0824,4.1582 6.3457,4.1582 3.26331,0 5.02376,-2.72003 6.34766,-4.1582 a 0.50037481,0.50037481 0 1 0 -0.73633,-0.67773 c -1.43556,1.55946 -2.90607,3.83593 -5.61133,3.83593 -2.70525,0 -4.17576,-2.27647 -5.61132,-3.83593 A 0.50005,0.50005 0 0 0 406.50195,437 Z"
|
||||
d="m 405.50174,437 a 0.50005,0.50005 0 0 0 -0.33203,0.84375 c 1.3239,1.43817 3.0824,4.1582 6.3457,4.1582 3.26331,0 5.02376,-2.72003 6.34766,-4.1582 a 0.50037481,0.50037481 0 1 0 -0.73633,-0.67773 c -1.43556,1.55946 -2.90607,3.83593 -5.61133,3.83593 -2.70525,0 -4.17576,-2.27647 -5.61132,-3.83593 A 0.50005,0.50005 0 0 0 405.50174,437 Z"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new" />
|
||||
<g
|
||||
transform="translate(315,-0.999996)"
|
||||
|
@ -14623,7 +14618,7 @@
|
|||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
|
||||
d="m 433.5,433 c -3.27784,-9.4e-4 -5.036,2.7211 -6.36328,4.16211 -0.17644,0.19146 -0.17644,0.48627 0,0.67773 1.3275,1.44124 3.08593,4.15993 6.36328,4.16211 3.27801,0.002 5.03608,-2.72118 6.36328,-4.16211 0.17644,-0.19146 0.17644,-0.48627 0,-0.67773 C 438.53587,435.72096 436.77755,433.00094 433.5,433 Z m 0,1 a 3.4999952,3.4999933 0 0 1 3.5,3.5 3.4999952,3.4999933 0 0 1 -3.5,3.5 3.4999952,3.4999933 0 0 1 -3.5,-3.5 3.4999952,3.4999933 0 0 1 3.5,-3.5 z m 0,2 a 1.4999952,1.4999944 0 0 0 -1.5,1.5 1.4999952,1.4999944 0 0 0 1.5,1.5 1.4999952,1.4999944 0 0 0 1.5,-1.5 1.4999952,1.4999944 0 0 0 -1.5,-1.5 z"
|
||||
d="m 432.49961,433 c -3.27784,-9.4e-4 -5.036,2.7211 -6.36328,4.16211 -0.17644,0.19146 -0.17644,0.48627 0,0.67773 1.3275,1.44124 3.08593,4.15993 6.36328,4.16211 3.27801,0.002 5.03608,-2.72118 6.36328,-4.16211 0.17644,-0.19146 0.17644,-0.48627 0,-0.67773 -1.32741,-1.44115 -3.08573,-4.16117 -6.36328,-4.16211 z m 0,1 a 3.4999952,3.4999933 0 0 1 3.5,3.5 3.4999952,3.4999933 0 0 1 -3.5,3.5 3.4999952,3.4999933 0 0 1 -3.5,-3.5 3.4999952,3.4999933 0 0 1 3.5,-3.5 z m 0,2 a 1.4999952,1.4999944 0 0 0 -1.5,1.5 1.4999952,1.4999944 0 0 0 1.5,1.5 1.4999952,1.4999944 0 0 0 1.5,-1.5 1.4999952,1.4999944 0 0 0 -1.5,-1.5 z"
|
||||
id="path19347-7" />
|
||||
<g
|
||||
id="g19953"
|
||||
|
@ -15552,22 +15547,22 @@
|
|||
</g>
|
||||
<path
|
||||
id="path22885-3-7"
|
||||
d="m 538.4922,557 c -0.1299,0 -0.2539,0.055 -0.3457,0.1465 -1.4018,1.4018 -2.9571,1.8535 -5.6465,1.8535 -0.2761,0 -0.5,0.2239 -0.5,0.5 v 3 c 0,2.4627 0.6805,4.0682 1.7871,5.2754 1.1066,1.2072 2.5736,2.0242 4.1777,3.1348 0.084,0.058 0.1832,0.09 0.2852,0.09 h 0.5 c 0.102,-2e-4 0.2015,-0.032 0.2852,-0.09 1.6041,-1.1106 3.0711,-1.9276 4.1777,-3.1348 C 544.3195,566.5682 545,564.9627 545,562.5 v -3 c 0,-0.2761 -0.2239,-0.5 -0.5,-0.5 -2.6894,0 -4.2447,-0.4517 -5.6465,-1.8535 -0.096,-0.096 -0.226,-0.1486 -0.3613,-0.1465 z m 3.4766,3.9902 a 1.0001,1.0001 0 0 1 0.8124,1.6348 l -4,5 a 1.0001,1.0001 0 0 1 -1.4882,0.082 l -2,-2 a 1.0001,1.0001 0 1 1 1.414,-1.414 l 1.209,1.209 3.3028,-4.127 a 1.0001,1.0001 0 0 1 0.75,-0.3848 z"
|
||||
d="m 537.4922,557 c -0.1299,0 -0.2539,0.055 -0.3457,0.1465 -1.4018,1.4018 -2.9571,1.8535 -5.6465,1.8535 -0.2761,0 -0.5,0.2239 -0.5,0.5 v 3 c 0,2.4627 0.6805,4.0682 1.7871,5.2754 1.1066,1.2072 2.5736,2.0242 4.1777,3.1348 0.084,0.058 0.1832,0.09 0.2852,0.09 h 0.5 c 0.102,-2e-4 0.2015,-0.032 0.2852,-0.09 1.6041,-1.1106 3.0711,-1.9276 4.1777,-3.1348 C 543.3195,566.5682 544,564.9627 544,562.5 v -3 c 0,-0.2761 -0.2239,-0.5 -0.5,-0.5 -2.6894,0 -4.2447,-0.4517 -5.6465,-1.8535 -0.096,-0.096 -0.226,-0.1486 -0.3613,-0.1465 z m 3.4766,3.9902 a 1.0001,1.0001 0 0 1 0.8124,1.6348 l -4,5 a 1.0001,1.0001 0 0 1 -1.4882,0.082 l -2,-2 a 1.0001,1.0001 0 1 1 1.414,-1.414 l 1.209,1.209 3.3028,-4.127 a 1.0001,1.0001 0 0 1 0.75,-0.3848 z"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
|
||||
d="m 517.49219,557 a 0.50005,0.50005 0 0 0 -0.34571,0.14648 C 515.74469,558.54828 514.18939,559 511.5,559 a 0.50005,0.50005 0 0 0 -0.5,0.5 v 3 c 0,2.46272 0.6805,4.06818 1.78711,5.27539 1.10661,1.20722 2.57356,2.02419 4.17773,3.13477 A 0.50005,0.50005 0 0 0 517.25,571 h 0.5 a 0.50005,0.50005 0 0 0 0.28516,-0.0898 c 1.60417,-1.11058 3.07112,-1.92755 4.17773,-3.13477 C 523.3195,566.56818 524,564.96272 524,562.5 v -3 a 0.50005,0.50005 0 0 0 -0.5,-0.5 c -2.68939,0 -4.24469,-0.45172 -5.64648,-1.85352 A 0.50005,0.50005 0 0 0 517.49219,557 Z m 0.008,1.07031 c 1.42533,1.26825 3.16641,1.79779 5.5,1.86524 V 562.5 c 0,2.28728 -0.5695,3.55682 -1.52539,4.59961 -0.92707,1.01135 -2.30655,1.81425 -3.88867,2.90039 h -0.17188 c -1.58212,-1.08614 -2.9616,-1.88904 -3.88867,-2.90039 C 512.5695,566.05682 512,564.78728 512,562.5 v -2.56445 c 2.33359,-0.0675 4.07467,-0.59699 5.5,-1.86524 z"
|
||||
d="m 516.49219,557 a 0.50005,0.50005 0 0 0 -0.34571,0.14648 C 514.74469,558.54828 513.18939,559 510.5,559 a 0.50005,0.50005 0 0 0 -0.5,0.5 v 3 c 0,2.46272 0.6805,4.06818 1.78711,5.27539 1.10661,1.20722 2.57356,2.02419 4.17773,3.13477 A 0.50005,0.50005 0 0 0 516.25,571 h 0.5 a 0.50005,0.50005 0 0 0 0.28516,-0.0898 c 1.60417,-1.11058 3.07112,-1.92755 4.17773,-3.13477 C 522.3195,566.56818 523,564.96272 523,562.5 v -3 a 0.50005,0.50005 0 0 0 -0.5,-0.5 c -2.68939,0 -4.24469,-0.45172 -5.64648,-1.85352 A 0.50005,0.50005 0 0 0 516.49219,557 Z m 0.008,1.07031 c 1.42533,1.26825 3.16641,1.79779 5.5,1.86524 V 562.5 c 0,2.28728 -0.5695,3.55682 -1.52539,4.59961 -0.92707,1.01135 -2.30655,1.81425 -3.88867,2.90039 h -0.17188 c -1.58212,-1.08614 -2.9616,-1.88904 -3.88867,-2.90039 C 511.5695,566.05682 511,564.78728 511,562.5 v -2.56445 c 2.33359,-0.0675 4.07467,-0.59699 5.5,-1.86524 z"
|
||||
id="path22877-22-0"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 513,414.00018 h 9 v 5 h -9 z m -1.5,-2 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 8 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 5.5 v 1 h -2.5 c -0.67616,-0.01 -0.67616,1.00956 0,1 h 6 c 0.6573,-0.009 0.6573,-0.9907 0,-1 H 518 v -1 h 5.5 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -8 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z m 0.5,1 h 11 v 7 h -11 z"
|
||||
d="m 512,414.00018 h 9 v 5 h -9 z m -1.5,-2 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 8 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 5.5 v 1 h -2.5 c -0.67616,-0.01 -0.67616,1.00956 0,1 h 6 c 0.6573,-0.009 0.6573,-0.9907 0,-1 H 517 v -1 h 5.5 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -8 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z m 0.5,1 h 11 v 7 h -11 z"
|
||||
style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"
|
||||
id="rect22324-2" />
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
|
||||
d="m 490.5,412 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 8 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 5.5 v 1 h -2.5 c -0.67616,-0.01 -0.67616,1.00956 0,1 h 6 c 0.6573,-0.009 0.6573,-0.9907 0,-1 H 497 v -1 h 5.5 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -8 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z m 0.5,1 h 11 v 7 h -11 z"
|
||||
d="m 489.5,412 c -0.27613,3e-5 -0.49997,0.22387 -0.5,0.5 v 8 c 3e-5,0.27613 0.22387,0.49997 0.5,0.5 h 5.5 v 1 h -2.5 c -0.67616,-0.01 -0.67616,1.00956 0,1 h 6 c 0.6573,-0.009 0.6573,-0.9907 0,-1 H 496 v -1 h 5.5 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -8 c -3e-5,-0.27613 -0.22387,-0.49997 -0.5,-0.5 z m 0.5,1 h 11 v 7 h -11 z"
|
||||
id="path22338-8"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccccccccccccccccccc" />
|
||||
|
@ -15646,11 +15641,11 @@
|
|||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
|
||||
d="m 542.77344,306 a 1.0001,1.0001 0 0 0 -0.41211,0.0781 l -4.74024,2 a 1.0004654,1.0004654 0 1 0 0.77735,1.84376 l 1.54883,-0.65235 -2.69532,5.375 -2.78906,-2.30078 a 1.50015,1.50015 0 1 0 -1.9082,2.3125 l 4.24023,3.5 a 1.50015,1.50015 0 0 0 2.29688,-0.48437 l 3.53711,-7.0586 0.41015,1.63086 a 1.0001,1.0001 0 1 0 1.93946,-0.48828 l -1.25977,-5 A 1.0001,1.0001 0 0 0 542.77344,306 Z"
|
||||
d="m 541.77363,306 a 1.0001,1.0001 0 0 0 -0.41211,0.0781 l -4.74024,2 a 1.0004654,1.0004654 0 1 0 0.77735,1.84376 l 1.54883,-0.65235 -2.69532,5.375 -2.78906,-2.30078 a 1.50015,1.50015 0 1 0 -1.9082,2.3125 l 4.24023,3.5 a 1.50015,1.50015 0 0 0 2.29688,-0.48437 l 3.53711,-7.0586 0.41015,1.63086 a 1.0001,1.0001 0 1 0 1.93946,-0.48828 l -1.25977,-5 A 1.0001,1.0001 0 0 0 541.77363,306 Z"
|
||||
id="path25427-8" />
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.6;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 521.51367,306 a 0.50005,0.50005 0 0 0 -0.23633,0.0527 l -4,2 a 0.50005,0.50005 0 1 0 0.44532,0.89454 l 2.8164,-1.40821 -4.20508,8.1875 -4.52148,-3.61718 a 0.50024018,0.50024018 0 1 0 -0.625,0.78124 l 5,4 a 0.50005,0.50005 0 0 0 0.75781,-0.1621 l 4.4375,-8.64063 0.63281,2.5332 a 0.50005,0.50005 0 1 0 0.96876,-0.24218 l -1,-4 A 0.50005,0.50005 0 0 0 521.51367,306 Z"
|
||||
d="m 520.51395,306 a 0.50005,0.50005 0 0 0 -0.23633,0.0527 l -4,2 a 0.50005,0.50005 0 1 0 0.44532,0.89454 l 2.8164,-1.40821 -4.20508,8.1875 -4.52148,-3.61718 a 0.50024018,0.50024018 0 1 0 -0.625,0.78124 l 5,4 a 0.50005,0.50005 0 0 0 0.75781,-0.1621 l 4.4375,-8.64063 0.63281,2.5332 a 0.50005,0.50005 0 1 0 0.96876,-0.24218 l -1,-4 A 0.50005,0.50005 0 0 0 520.51395,306 Z"
|
||||
id="path25488-0"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
|
@ -17355,21 +17350,21 @@
|
|||
id="g905">
|
||||
<g
|
||||
transform="matrix(0.6740384,0,0,0.6740384,192.80592,-339.68227)"
|
||||
style="display:inline;opacity:0.99;fill:#ffffff;stroke-width:1.07692;enable-background:new"
|
||||
style="display:inline;opacity:0.99;fill:#ffffff;stroke-width:1.07692;enable-background:new"
|
||||
id="g8599-6-7"
|
||||
inkscape:export-filename="blender_icons.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96">
|
||||
<path
|
||||
inkscape:export-filename="blender_icons.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96">
|
||||
<path
|
||||
id="path8597-7-0"
|
||||
d="m 331.87142,629.24052 c 0,0.81936 -0.66423,1.48359 -1.48359,1.48359 -0.81937,0 -1.4836,-0.66422 -1.4836,-1.48359 0,-0.81937 0.66423,-1.4836 1.4836,-1.4836 0.81937,0 1.48359,0.66423 1.48359,1.4836 z"
|
||||
style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.72218;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="sssss" />
|
||||
</g>
|
||||
<path
|
||||
</g>
|
||||
<path
|
||||
sodipodi:nodetypes="cccccccccczzcczzzzz"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path8595-5-9"
|
||||
d="m 414.93725,78.999996 c -0.65344,-0.653443 -1.58833,0.255453 -0.88297,0.960812 L 415.18167,81 h -4.6057 c -0.88913,-0.01822 -0.88913,1.018254 0,1 l 2.19337,-0.004 -0.006,0.004 -3.27651,2.873468 c -0.64989,0.580999 0.2216,1.555837 0.87149,0.97484 L 412.00004,84.45 c 0,1.651946 1.15621,3.581251 3.47506,3.550001 C 417.79395,87.968751 419,86.250706 419,84.45 c 0,-1.800705 -1.00462,-2.558141 -1.45954,-3.013074 z M 415.5,82.2 c 1.22478,0 2.25,0.945047 2.25,2.25 0,1.304953 -1.05311,2.25 -2.25,2.25 -1.19689,0 -2.25,-0.960585 -2.25,-2.25 0,-1.289415 1.02522,-2.25 2.25,-2.25 z"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.3066;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||
|
@ -17431,25 +17426,25 @@
|
|||
d="m 414.93725,78.992499 c -0.65344,-0.653443 -1.58833,0.255453 -0.88297,0.960812 l 1.12739,1.039192 h -4.6057 c -0.88913,-0.01822 -0.88913,1.018254 0,1 l 2.19337,-0.004 -0.006,0.004 -3.27651,2.873468 c -0.64989,0.580999 0.2216,1.555837 0.87149,0.97484 l 1.64161,-1.398308 c 0,1.651946 1.15632,3.581251 3.47517,3.550001 2.31885,-0.03125 3.5249,-1.749295 3.5249,-3.550001 0,-1.800705 -1.00462,-2.558141 -1.45954,-3.013074 z M 415.5,82.192503 c 1.22478,0 2.25,0.945047 2.25,2.25 0,1.304953 -1.05311,2.25 -2.25,2.25 -1.19689,0 -2.25,-0.960585 -2.25,-2.25 0,-1.289415 1.02522,-2.25 2.25,-2.25 z"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.3066;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
|
||||
</g>
|
||||
<g
|
||||
<g
|
||||
transform="translate(19.000003)"
|
||||
id="g28228-3-3"
|
||||
style="display:inline;opacity:0.6;stroke:#ffffff;enable-background:new"
|
||||
inkscape:export-filename="blender_icons.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96">
|
||||
inkscape:export-filename="blender_icons.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96">
|
||||
<g
|
||||
id="g28217-6-6"
|
||||
transform="translate(338.99999,-439.99995)"
|
||||
style="display:inline;opacity:0.99;stroke:#ffffff;enable-background:new">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path28215-0"
|
||||
transform="translate(-337.99999,439.99995)"
|
||||
d="m 501.49219,52.992188 c -0.27615,0.0043 -0.49651,0.223792 -0.49219,0.499938 v 1 c -0.01,0.676161 1.00956,0.676161 1,0 v -1 c 0.004,-0.282265 -0.22554,-0.504353 -0.50781,-0.499938 z m -7.00781,0.0067 c -0.12718,0.004 -0.248,0.0564 -0.3379,0.146484 l -4,4.001116 c -0.10126,0.101337 -0.1304,0.223491 -0.13086,0.345704 L 490,57.507812 v 1.984314 c -0.01,0.676161 1.00956,0.676161 1,0 v -1.5 h 3.5 c 0.27613,-3e-5 0.49997,-0.22387 0.5,-0.5 v -3.5 h 1.5 c 0.67616,0.0096 0.67616,-1.002805 0,-0.993242 h -2 v 0.002 c -0.005,-5e-6 -0.0101,-0.0021 -0.0156,-0.002 z m 4.01562,-0.0068 c -0.67616,-0.0096 -0.67616,1.009563 0,1 h 1 c 0.67616,0.0096 0.67616,-1.009563 0,-1 z m 2.99219,3.000062 c -0.27615,0.0043 -0.49651,0.223792 -0.49219,0.499938 v 1 c -0.01,0.676161 1.00956,0.676161 1,0 v -1 c 0.004,-0.282265 -0.22554,-0.504353 -0.50781,-0.499938 z m -11,5 c -0.27615,0.0043 -0.49651,0.223792 -0.49219,0.499938 v 1 c -0.01,0.676161 1.00956,0.676161 1,0 v -1 c 0.004,-0.282265 -0.22554,-0.504353 -0.50781,-0.499938 z m 0,3 c -0.27615,0.0043 -0.49651,0.223792 -0.49219,0.499938 v 1 c -0.01,0.676161 1.00956,0.676161 1,0 v -1 c 0.004,-0.282265 -0.22554,-0.504353 -0.50781,-0.499938 z M 492.5,65.992126 c -0.67616,-0.0096 -0.67616,1.009563 0,1 h 1 c 0.67616,0.0096 0.67616,-1.009563 0,-1 z m 3,0 c -0.67616,-0.0096 -0.67616,1.009563 0,1 h 1 c 0.67616,0.0096 0.67616,-1.009563 0,-1 z"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccccccccccccccccccc" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
|
@ -17471,10 +17466,10 @@
|
|||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccccscccccccccccccccc" />
|
||||
</g>
|
||||
<path
|
||||
<path
|
||||
sodipodi:nodetypes="csscccccccccccssscccc"
|
||||
style="opacity:0.6;fill:#ffffff"
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path2-6"
|
||||
d="m 469,101 v 7.5 c 0,0.276 0.224,0.5 0.5,0.5 h 11 c 0.30423,0 0.5,-0.22782 0.5,-0.5 v -4 c 0,-0.65459 -1,-0.65682 -1,0 v 3.5 h -10 v -7 z m 4.48081,-6 c -0.151,0.004 -0.293,0.077 -0.384,0.197 l -3.95,3.949 c -0.314,0.315 -0.091,0.854 0.354,0.854 h 4 c 0.276,0 0.5,-0.224 0.5,-0.5 V 96 H 480.5 c 0.68512,0 0.64092,-1 0,-1 z" />
|
||||
</g>
|
||||
|
|
Before Width: | Height: | Size: 2.5 MiB After Width: | Height: | Size: 2.5 MiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue