Merge branch 'master' into cycles_disney_brdf
This commit is contained in:
6
.gitignore
vendored
6
.gitignore
vendored
@@ -33,3 +33,9 @@ Desktop.ini
|
||||
/doc/python_api/sphinx-in-tmp/
|
||||
/doc/python_api/sphinx-in/
|
||||
/doc/python_api/sphinx-out/
|
||||
/doc/python_api/rst/bmesh.ops.rst
|
||||
/doc/python_api/rst/in_menu.png
|
||||
/doc/python_api/rst/menu_id.png
|
||||
/doc/python_api/rst/op_prop.png
|
||||
/doc/python_api/rst/run_script.png
|
||||
/doc/python_api/rst/spacebar.png
|
||||
|
||||
1591
CMakeLists.txt
1591
CMakeLists.txt
File diff suppressed because it is too large
Load Diff
@@ -359,7 +359,6 @@ function(setup_liblinks
|
||||
target_link_libraries(
|
||||
${target}
|
||||
${PNG_LIBRARIES}
|
||||
${ZLIB_LIBRARIES}
|
||||
${FREETYPE_LIBRARY}
|
||||
)
|
||||
|
||||
@@ -510,6 +509,11 @@ function(setup_liblinks
|
||||
endif()
|
||||
endif()
|
||||
|
||||
target_link_libraries(
|
||||
${target}
|
||||
${ZLIB_LIBRARIES}
|
||||
)
|
||||
|
||||
#system libraries with no dependencies such as platform link libs or opengl should go last
|
||||
target_link_libraries(${target}
|
||||
${BLENDER_GL_LIBRARIES})
|
||||
@@ -1574,3 +1578,26 @@ macro(openmp_delayload
|
||||
endif(WITH_OPENMP)
|
||||
endif(MSVC)
|
||||
endmacro()
|
||||
|
||||
MACRO(WINDOWS_SIGN_TARGET target)
|
||||
if (WITH_WINDOWS_CODESIGN)
|
||||
if (!SIGNTOOL_EXE)
|
||||
error("Codesigning is enabled, but signtool is not found")
|
||||
else()
|
||||
if (WINDOWS_CODESIGN_PFX_PASSWORD)
|
||||
set(CODESIGNPASSWORD /p ${WINDOWS_CODESIGN_PFX_PASSWORD})
|
||||
else()
|
||||
if ($ENV{PFXPASSWORD})
|
||||
set(CODESIGNPASSWORD /p $ENV{PFXPASSWORD})
|
||||
else()
|
||||
message( FATAL_ERROR "WITH_WINDOWS_CODESIGN is on but WINDOWS_CODESIGN_PFX_PASSWORD not set, and environment variable PFXPASSWORD not found, unable to sign code.")
|
||||
endif()
|
||||
endif()
|
||||
add_custom_command(TARGET ${target}
|
||||
POST_BUILD
|
||||
COMMAND ${SIGNTOOL_EXE} sign /f ${WINDOWS_CODESIGN_PFX} ${CODESIGNPASSWORD} $<TARGET_FILE:${target}>
|
||||
VERBATIM
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
ENDMACRO()
|
||||
@@ -38,7 +38,17 @@ unset(MY_WC_HASH)
|
||||
# Force Package Name
|
||||
execute_process(COMMAND date "+%Y%m%d" OUTPUT_VARIABLE CPACK_DATE OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
string(TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWER)
|
||||
set(CPACK_PACKAGE_FILE_NAME ${PROJECT_NAME_LOWER}-${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}-git${CPACK_DATE}.${BUILD_REV}-${CMAKE_SYSTEM_PROCESSOR})
|
||||
if (MSVC)
|
||||
if ("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
|
||||
set(PACKAGE_ARCH windows64)
|
||||
else()
|
||||
set(PACKAGE_ARCH windows32)
|
||||
endif()
|
||||
else(MSVC)
|
||||
set(PACKAGE_ARCH ${CMAKE_SYSTEM_PROCESSOR})
|
||||
endif()
|
||||
|
||||
set(CPACK_PACKAGE_FILE_NAME ${PROJECT_NAME_LOWER}-${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}-git${CPACK_DATE}.${BUILD_REV}-${PACKAGE_ARCH})
|
||||
|
||||
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||||
# RPM packages
|
||||
|
||||
430
build_files/cmake/platform/platform_apple.cmake
Normal file
430
build_files/cmake/platform/platform_apple.cmake
Normal file
@@ -0,0 +1,430 @@
|
||||
# ***** BEGIN GPL LICENSE BLOCK *****
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#
|
||||
# The Original Code is Copyright (C) 2016, Blender Foundation
|
||||
# All rights reserved.
|
||||
#
|
||||
# Contributor(s): Sergey Sharybin.
|
||||
#
|
||||
# ***** END GPL LICENSE BLOCK *****
|
||||
|
||||
# Libraries configuration for Apple.
|
||||
|
||||
if(NOT DEFINED LIBDIR)
|
||||
set(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/darwin-9.x.universal)
|
||||
else()
|
||||
message(STATUS "Using pre-compiled LIBDIR: ${LIBDIR}")
|
||||
endif()
|
||||
if(NOT EXISTS "${LIBDIR}/")
|
||||
message(FATAL_ERROR "Mac OSX requires pre-compiled libs at: '${LIBDIR}'")
|
||||
endif()
|
||||
|
||||
if(WITH_OPENAL)
|
||||
find_package(OpenAL)
|
||||
if(OPENAL_FOUND)
|
||||
set(WITH_OPENAL ON)
|
||||
set(OPENAL_INCLUDE_DIR "${LIBDIR}/openal/include")
|
||||
else()
|
||||
set(WITH_OPENAL OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_ALEMBIC)
|
||||
set(ALEMBIC ${LIBDIR}/alembic)
|
||||
set(ALEMBIC_INCLUDE_DIR ${ALEMBIC}/include)
|
||||
set(ALEMBIC_INCLUDE_DIRS ${ALEMBIC_INCLUDE_DIR})
|
||||
set(ALEMBIC_LIBPATH ${ALEMBIC}/lib)
|
||||
set(ALEMBIC_LIBRARIES Alembic)
|
||||
endif()
|
||||
|
||||
if(WITH_OPENSUBDIV)
|
||||
set(OPENSUBDIV ${LIBDIR}/opensubdiv)
|
||||
set(OPENSUBDIV_LIBPATH ${OPENSUBDIV}/lib)
|
||||
find_library(OSL_LIB_UTIL NAMES osdutil PATHS ${OPENSUBDIV_LIBPATH})
|
||||
find_library(OSL_LIB_CPU NAMES osdCPU PATHS ${OPENSUBDIV_LIBPATH})
|
||||
find_library(OSL_LIB_GPU NAMES osdGPU PATHS ${OPENSUBDIV_LIBPATH})
|
||||
set(OPENSUBDIV_INCLUDE_DIR ${OPENSUBDIV}/include)
|
||||
set(OPENSUBDIV_INCLUDE_DIRS ${OPENSUBDIV_INCLUDE_DIR})
|
||||
list(APPEND OPENSUBDIV_LIBRARIES ${OSL_LIB_UTIL} ${OSL_LIB_CPU} ${OSL_LIB_GPU})
|
||||
endif()
|
||||
|
||||
if(WITH_JACK)
|
||||
find_library(JACK_FRAMEWORK
|
||||
NAMES jackmp
|
||||
)
|
||||
set(JACK_INCLUDE_DIRS ${JACK_FRAMEWORK}/headers)
|
||||
if(NOT JACK_FRAMEWORK)
|
||||
set(WITH_JACK OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_CODEC_SNDFILE)
|
||||
set(SNDFILE ${LIBDIR}/sndfile)
|
||||
set(SNDFILE_INCLUDE_DIRS ${SNDFILE}/include)
|
||||
set(SNDFILE_LIBRARIES sndfile FLAC ogg vorbis vorbisenc)
|
||||
set(SNDFILE_LIBPATH ${SNDFILE}/lib ${FFMPEG}/lib) # TODO, deprecate
|
||||
endif()
|
||||
|
||||
if(WITH_PYTHON)
|
||||
# we use precompiled libraries for py 3.5 and up by default
|
||||
set(PYTHON_VERSION 3.5)
|
||||
if(NOT WITH_PYTHON_MODULE AND NOT WITH_PYTHON_FRAMEWORK)
|
||||
# normally cached but not since we include them with blender
|
||||
set(PYTHON_INCLUDE_DIR "${LIBDIR}/python/include/python${PYTHON_VERSION}m")
|
||||
set(PYTHON_EXECUTABLE "${LIBDIR}/python/bin/python${PYTHON_VERSION}m")
|
||||
set(PYTHON_LIBRARY python${PYTHON_VERSION}m)
|
||||
set(PYTHON_LIBPATH "${LIBDIR}/python/lib/python${PYTHON_VERSION}")
|
||||
# set(PYTHON_LINKFLAGS "-u _PyMac_Error") # won't build with this enabled
|
||||
else()
|
||||
# module must be compiled against Python framework
|
||||
set(_py_framework "/Library/Frameworks/Python.framework/Versions/${PYTHON_VERSION}")
|
||||
|
||||
set(PYTHON_INCLUDE_DIR "${_py_framework}/include/python${PYTHON_VERSION}m")
|
||||
set(PYTHON_EXECUTABLE "${_py_framework}/bin/python${PYTHON_VERSION}m")
|
||||
set(PYTHON_LIBPATH "${_py_framework}/lib/python${PYTHON_VERSION}/config-${PYTHON_VERSION}m")
|
||||
#set(PYTHON_LIBRARY python${PYTHON_VERSION})
|
||||
#set(PYTHON_LINKFLAGS "-u _PyMac_Error -framework Python") # won't build with this enabled
|
||||
|
||||
unset(_py_framework)
|
||||
endif()
|
||||
|
||||
# uncached vars
|
||||
set(PYTHON_INCLUDE_DIRS "${PYTHON_INCLUDE_DIR}")
|
||||
set(PYTHON_LIBRARIES "${PYTHON_LIBRARY}")
|
||||
|
||||
if(NOT EXISTS "${PYTHON_EXECUTABLE}")
|
||||
message(FATAL_ERROR "Python executable missing: ${PYTHON_EXECUTABLE}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_FFTW3)
|
||||
set(FFTW3 ${LIBDIR}/fftw3)
|
||||
set(FFTW3_INCLUDE_DIRS ${FFTW3}/include)
|
||||
set(FFTW3_LIBRARIES fftw3)
|
||||
set(FFTW3_LIBPATH ${FFTW3}/lib)
|
||||
endif()
|
||||
|
||||
set(PNG_LIBRARIES png)
|
||||
set(JPEG_LIBRARIES jpeg)
|
||||
|
||||
set(ZLIB /usr)
|
||||
set(ZLIB_INCLUDE_DIRS "${ZLIB}/include")
|
||||
set(ZLIB_LIBRARIES z bz2)
|
||||
|
||||
set(FREETYPE ${LIBDIR}/freetype)
|
||||
set(FREETYPE_INCLUDE_DIRS ${FREETYPE}/include ${FREETYPE}/include/freetype2)
|
||||
set(FREETYPE_LIBPATH ${FREETYPE}/lib)
|
||||
set(FREETYPE_LIBRARY freetype)
|
||||
|
||||
if(WITH_IMAGE_OPENEXR)
|
||||
set(OPENEXR ${LIBDIR}/openexr)
|
||||
set(OPENEXR_INCLUDE_DIR ${OPENEXR}/include)
|
||||
set(OPENEXR_INCLUDE_DIRS ${OPENEXR_INCLUDE_DIR} ${OPENEXR}/include/OpenEXR)
|
||||
set(OPENEXR_LIBRARIES Iex Half IlmImf Imath IlmThread)
|
||||
set(OPENEXR_LIBPATH ${OPENEXR}/lib)
|
||||
endif()
|
||||
|
||||
if(WITH_CODEC_FFMPEG)
|
||||
set(FFMPEG ${LIBDIR}/ffmpeg)
|
||||
set(FFMPEG_INCLUDE_DIRS ${FFMPEG}/include)
|
||||
set(FFMPEG_LIBRARIES
|
||||
avcodec avdevice avformat avutil
|
||||
mp3lame swscale x264 xvidcore theora theoradec theoraenc vorbis vorbisenc vorbisfile ogg
|
||||
)
|
||||
set(FFMPEG_LIBPATH ${FFMPEG}/lib)
|
||||
endif()
|
||||
|
||||
find_library(SYSTEMSTUBS_LIBRARY
|
||||
NAMES
|
||||
SystemStubs
|
||||
PATHS
|
||||
)
|
||||
mark_as_advanced(SYSTEMSTUBS_LIBRARY)
|
||||
if(SYSTEMSTUBS_LIBRARY)
|
||||
list(APPEND PLATFORM_LINKLIBS SystemStubs)
|
||||
endif()
|
||||
|
||||
set(PLATFORM_CFLAGS "-pipe -funsigned-char")
|
||||
set(PLATFORM_LINKFLAGS
|
||||
"-fexceptions -framework CoreServices -framework Foundation -framework IOKit -framework AppKit -framework Cocoa -framework Carbon -framework AudioUnit -framework AudioToolbox -framework CoreAudio"
|
||||
)
|
||||
if(WITH_CODEC_QUICKTIME)
|
||||
set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -framework QTKit")
|
||||
if(CMAKE_OSX_ARCHITECTURES MATCHES i386)
|
||||
set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -framework QuickTime")
|
||||
# libSDL still needs 32bit carbon quicktime
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_CXX11)
|
||||
list(APPEND PLATFORM_LINKLIBS c++)
|
||||
else()
|
||||
list(APPEND PLATFORM_LINKLIBS stdc++)
|
||||
endif()
|
||||
|
||||
if(WITH_JACK)
|
||||
set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -F/Library/Frameworks -weak_framework jackmp")
|
||||
endif()
|
||||
|
||||
if(WITH_PYTHON_MODULE OR WITH_PYTHON_FRAMEWORK)
|
||||
# force cmake to link right framework
|
||||
set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} /Library/Frameworks/Python.framework/Versions/${PYTHON_VERSION}/Python")
|
||||
endif()
|
||||
|
||||
if(WITH_OPENCOLLADA)
|
||||
set(OPENCOLLADA ${LIBDIR}/opencollada)
|
||||
|
||||
set(OPENCOLLADA_INCLUDE_DIRS
|
||||
${LIBDIR}/opencollada/include/COLLADAStreamWriter
|
||||
${LIBDIR}/opencollada/include/COLLADABaseUtils
|
||||
${LIBDIR}/opencollada/include/COLLADAFramework
|
||||
${LIBDIR}/opencollada/include/COLLADASaxFrameworkLoader
|
||||
${LIBDIR}/opencollada/include/GeneratedSaxParser
|
||||
)
|
||||
|
||||
set(OPENCOLLADA_LIBPATH ${OPENCOLLADA}/lib)
|
||||
set(OPENCOLLADA_LIBRARIES
|
||||
OpenCOLLADASaxFrameworkLoader
|
||||
-lOpenCOLLADAFramework
|
||||
-lOpenCOLLADABaseUtils
|
||||
-lOpenCOLLADAStreamWriter
|
||||
-lMathMLSolver
|
||||
-lGeneratedSaxParser
|
||||
-lxml2 -lbuffer -lftoa
|
||||
)
|
||||
# Use UTF functions from collada if LLVM is not enabled
|
||||
if(NOT WITH_LLVM)
|
||||
list(APPEND OPENCOLLADA_LIBRARIES -lUTF)
|
||||
endif()
|
||||
# pcre is bundled with openCollada
|
||||
#set(PCRE ${LIBDIR}/pcre)
|
||||
#set(PCRE_LIBPATH ${PCRE}/lib)
|
||||
set(PCRE_LIBRARIES pcre)
|
||||
#libxml2 is used
|
||||
#set(EXPAT ${LIBDIR}/expat)
|
||||
#set(EXPAT_LIBPATH ${EXPAT}/lib)
|
||||
set(EXPAT_LIB)
|
||||
endif()
|
||||
|
||||
if(WITH_SDL)
|
||||
set(SDL ${LIBDIR}/sdl)
|
||||
set(SDL_INCLUDE_DIR ${SDL}/include)
|
||||
set(SDL_LIBRARY SDL2)
|
||||
set(SDL_LIBPATH ${SDL}/lib)
|
||||
set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -lazy_framework ForceFeedback")
|
||||
endif()
|
||||
|
||||
set(PNG "${LIBDIR}/png")
|
||||
set(PNG_INCLUDE_DIRS "${PNG}/include")
|
||||
set(PNG_LIBPATH ${PNG}/lib)
|
||||
|
||||
set(JPEG "${LIBDIR}/jpeg")
|
||||
set(JPEG_INCLUDE_DIR "${JPEG}/include")
|
||||
set(JPEG_LIBPATH ${JPEG}/lib)
|
||||
|
||||
if(WITH_IMAGE_TIFF)
|
||||
set(TIFF ${LIBDIR}/tiff)
|
||||
set(TIFF_INCLUDE_DIR ${TIFF}/include)
|
||||
set(TIFF_LIBRARY tiff)
|
||||
set(TIFF_LIBPATH ${TIFF}/lib)
|
||||
endif()
|
||||
|
||||
if(WITH_BOOST)
|
||||
set(BOOST ${LIBDIR}/boost)
|
||||
set(BOOST_INCLUDE_DIR ${BOOST}/include)
|
||||
set(BOOST_LIBRARIES
|
||||
boost_date_time-mt
|
||||
boost_filesystem-mt
|
||||
boost_regex-mt
|
||||
boost_system-mt
|
||||
boost_thread-mt
|
||||
boost_wave-mt
|
||||
)
|
||||
if(WITH_INTERNATIONAL)
|
||||
list(APPEND BOOST_LIBRARIES boost_locale-mt)
|
||||
endif()
|
||||
if(WITH_CYCLES_NETWORK)
|
||||
list(APPEND BOOST_LIBRARIES boost_serialization-mt)
|
||||
endif()
|
||||
if(WITH_OPENVDB)
|
||||
list(APPEND BOOST_LIBRARIES boost_iostreams-mt)
|
||||
endif()
|
||||
set(BOOST_LIBPATH ${BOOST}/lib)
|
||||
set(BOOST_DEFINITIONS)
|
||||
endif()
|
||||
|
||||
if(WITH_INTERNATIONAL OR WITH_CODEC_FFMPEG)
|
||||
set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -liconv") # boost_locale and ffmpeg needs it !
|
||||
endif()
|
||||
|
||||
if(WITH_OPENIMAGEIO)
|
||||
set(OPENIMAGEIO ${LIBDIR}/openimageio)
|
||||
set(OPENIMAGEIO_INCLUDE_DIRS ${OPENIMAGEIO}/include)
|
||||
set(OPENIMAGEIO_LIBRARIES
|
||||
${OPENIMAGEIO}/lib/libOpenImageIO.a
|
||||
${PNG_LIBRARIES}
|
||||
${JPEG_LIBRARIES}
|
||||
${TIFF_LIBRARY}
|
||||
${OPENEXR_LIBRARIES}
|
||||
${ZLIB_LIBRARIES}
|
||||
)
|
||||
set(OPENIMAGEIO_LIBPATH
|
||||
${OPENIMAGEIO}/lib
|
||||
${JPEG_LIBPATH}
|
||||
${PNG_LIBPATH}
|
||||
${TIFF_LIBPATH}
|
||||
${OPENEXR_LIBPATH}
|
||||
${ZLIB_LIBPATH}
|
||||
)
|
||||
set(OPENIMAGEIO_DEFINITIONS "-DOIIO_STATIC_BUILD")
|
||||
set(OPENIMAGEIO_IDIFF "${LIBDIR}/openimageio/bin/idiff")
|
||||
endif()
|
||||
|
||||
if(WITH_OPENCOLORIO)
|
||||
set(OPENCOLORIO ${LIBDIR}/opencolorio)
|
||||
set(OPENCOLORIO_INCLUDE_DIRS ${OPENCOLORIO}/include)
|
||||
set(OPENCOLORIO_LIBRARIES OpenColorIO tinyxml yaml-cpp)
|
||||
set(OPENCOLORIO_LIBPATH ${OPENCOLORIO}/lib)
|
||||
endif()
|
||||
|
||||
if(WITH_OPENVDB)
|
||||
set(OPENVDB ${LIBDIR}/openvdb)
|
||||
set(OPENVDB_INCLUDE_DIRS ${OPENVDB}/include)
|
||||
set(TBB_INCLUDE_DIRS ${LIBDIR}/tbb/include)
|
||||
set(TBB_LIBRARIES ${LIBDIR}/tbb/lib/libtbb.a)
|
||||
set(OPENVDB_LIBRARIES openvdb blosc ${TBB_LIBRARIES})
|
||||
set(OPENVDB_LIBPATH ${LIBDIR}/openvdb/lib)
|
||||
set(OPENVDB_DEFINITIONS)
|
||||
endif()
|
||||
|
||||
if(WITH_LLVM)
|
||||
set(LLVM_ROOT_DIR ${LIBDIR}/llvm CACHE PATH "Path to the LLVM installation")
|
||||
set(LLVM_VERSION "3.4" CACHE STRING "Version of LLVM to use")
|
||||
if(EXISTS "${LLVM_ROOT_DIR}/bin/llvm-config")
|
||||
set(LLVM_CONFIG "${LLVM_ROOT_DIR}/bin/llvm-config")
|
||||
else()
|
||||
set(LLVM_CONFIG llvm-config)
|
||||
endif()
|
||||
execute_process(COMMAND ${LLVM_CONFIG} --version
|
||||
OUTPUT_VARIABLE LLVM_VERSION
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
execute_process(COMMAND ${LLVM_CONFIG} --prefix
|
||||
OUTPUT_VARIABLE LLVM_ROOT_DIR
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
execute_process(COMMAND ${LLVM_CONFIG} --libdir
|
||||
OUTPUT_VARIABLE LLVM_LIBPATH
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
find_library(LLVM_LIBRARY
|
||||
NAMES LLVMAnalysis # first of a whole bunch of libs to get
|
||||
PATHS ${LLVM_LIBPATH})
|
||||
|
||||
if(LLVM_LIBRARY AND LLVM_ROOT_DIR AND LLVM_LIBPATH)
|
||||
if(LLVM_STATIC)
|
||||
# if static LLVM libraries were requested, use llvm-config to generate
|
||||
# the list of what libraries we need, and substitute that in the right
|
||||
# way for LLVM_LIBRARY.
|
||||
execute_process(COMMAND ${LLVM_CONFIG} --libfiles
|
||||
OUTPUT_VARIABLE LLVM_LIBRARY
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
string(REPLACE " " ";" LLVM_LIBRARY ${LLVM_LIBRARY})
|
||||
else()
|
||||
set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -lLLVM-3.4")
|
||||
endif()
|
||||
else()
|
||||
message(FATAL_ERROR "LLVM not found.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_CYCLES_OSL)
|
||||
set(CYCLES_OSL ${LIBDIR}/osl CACHE PATH "Path to OpenShadingLanguage installation")
|
||||
|
||||
find_library(OSL_LIB_EXEC NAMES oslexec PATHS ${CYCLES_OSL}/lib)
|
||||
find_library(OSL_LIB_COMP NAMES oslcomp PATHS ${CYCLES_OSL}/lib)
|
||||
find_library(OSL_LIB_QUERY NAMES oslquery PATHS ${CYCLES_OSL}/lib)
|
||||
# WARNING! depends on correct order of OSL libs linking
|
||||
list(APPEND OSL_LIBRARIES ${OSL_LIB_COMP} -force_load ${OSL_LIB_EXEC} ${OSL_LIB_QUERY})
|
||||
find_path(OSL_INCLUDE_DIR OSL/oslclosure.h PATHS ${CYCLES_OSL}/include)
|
||||
find_program(OSL_COMPILER NAMES oslc PATHS ${CYCLES_OSL}/bin)
|
||||
|
||||
if(OSL_INCLUDE_DIR AND OSL_LIBRARIES AND OSL_COMPILER)
|
||||
set(OSL_FOUND TRUE)
|
||||
else()
|
||||
message(STATUS "OSL not found")
|
||||
set(WITH_CYCLES_OSL OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_OPENMP)
|
||||
execute_process(COMMAND ${CMAKE_C_COMPILER} --version OUTPUT_VARIABLE COMPILER_VENDOR)
|
||||
string(SUBSTRING "${COMPILER_VENDOR}" 0 5 VENDOR_NAME) # truncate output
|
||||
if(${VENDOR_NAME} MATCHES "Apple") # Apple does not support OpenMP reliable with gcc and not with clang
|
||||
set(WITH_OPENMP OFF)
|
||||
else() # vanilla gcc or clang_omp support OpenMP
|
||||
message(STATUS "Using special OpenMP enabled compiler !") # letting find_package(OpenMP) module work for gcc
|
||||
if(CMAKE_C_COMPILER_ID MATCHES "Clang") # clang-omp in darwin libs
|
||||
set(OPENMP_FOUND ON)
|
||||
set(OpenMP_C_FLAGS "-fopenmp" CACHE STRING "C compiler flags for OpenMP parallization" FORCE)
|
||||
set(OpenMP_CXX_FLAGS "-fopenmp" CACHE STRING "C++ compiler flags for OpenMP parallization" FORCE)
|
||||
include_directories(${LIBDIR}/openmp/include)
|
||||
link_directories(${LIBDIR}/openmp/lib)
|
||||
# This is a workaround for our helperbinaries ( datatoc, masgfmt, ... ),
|
||||
# They are linked also to omp lib, so we need it in builddir for runtime exexcution,
|
||||
# TODO: remove all unneeded dependencies from these
|
||||
|
||||
# for intermediate binaries, in respect to lib ID
|
||||
execute_process(
|
||||
COMMAND ditto -arch ${CMAKE_OSX_ARCHITECTURES}
|
||||
${LIBDIR}/openmp/lib/libiomp5.dylib
|
||||
${CMAKE_BINARY_DIR}/Resources/lib/libiomp5.dylib)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(EXETYPE MACOSX_BUNDLE)
|
||||
|
||||
set(CMAKE_C_FLAGS_DEBUG "-fno-strict-aliasing -g")
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "-fno-strict-aliasing -g")
|
||||
if(CMAKE_OSX_ARCHITECTURES MATCHES "x86_64" OR CMAKE_OSX_ARCHITECTURES MATCHES "i386")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -mdynamic-no-pic -msse -msse2 -msse3 -mssse3")
|
||||
set(CMAKE_C_FLAGS_RELEASE "-O2 -mdynamic-no-pic -msse -msse2 -msse3 -mssse3")
|
||||
if(NOT CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -ftree-vectorize -fvariable-expansion-in-unroller")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -ftree-vectorize -fvariable-expansion-in-unroller")
|
||||
endif()
|
||||
else()
|
||||
set(CMAKE_C_FLAGS_RELEASE "-mdynamic-no-pic -fno-strict-aliasing")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "-mdynamic-no-pic -fno-strict-aliasing")
|
||||
endif()
|
||||
|
||||
if(${XCODE_VERSION} VERSION_EQUAL 5 OR ${XCODE_VERSION} VERSION_GREATER 5)
|
||||
# Xcode 5 is always using CLANG, which has too low template depth of 128 for libmv
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftemplate-depth=1024")
|
||||
endif()
|
||||
# Get rid of eventually clashes, we export some symbols explicite as local
|
||||
set(PLATFORM_LINKFLAGS
|
||||
"${PLATFORM_LINKFLAGS} -Xlinker -unexported_symbols_list -Xlinker ${CMAKE_SOURCE_DIR}/source/creator/osx_locals.map"
|
||||
)
|
||||
|
||||
if(WITH_CXX11)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
|
||||
set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -stdlib=libc++")
|
||||
endif()
|
||||
|
||||
# Suppress ranlib "has no symbols" warnings (workaround for T48250)
|
||||
set(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>")
|
||||
set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>")
|
||||
set(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
|
||||
set(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
|
||||
425
build_files/cmake/platform/platform_unix.cmake
Normal file
425
build_files/cmake/platform/platform_unix.cmake
Normal file
@@ -0,0 +1,425 @@
|
||||
# ***** BEGIN GPL LICENSE BLOCK *****
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#
|
||||
# The Original Code is Copyright (C) 2016, Blender Foundation
|
||||
# All rights reserved.
|
||||
#
|
||||
# Contributor(s): Sergey Sharybin.
|
||||
#
|
||||
# ***** END GPL LICENSE BLOCK *****
|
||||
|
||||
# Libraries configuration for any *nix system including Linux and Unix.
|
||||
|
||||
macro(find_package_wrapper)
|
||||
if(WITH_STATIC_LIBS)
|
||||
find_package_static(${ARGV})
|
||||
else()
|
||||
find_package(${ARGV})
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
find_package_wrapper(JPEG REQUIRED)
|
||||
find_package_wrapper(PNG REQUIRED)
|
||||
find_package_wrapper(ZLIB REQUIRED)
|
||||
find_package_wrapper(Freetype REQUIRED)
|
||||
|
||||
if(WITH_LZO AND WITH_SYSTEM_LZO)
|
||||
find_package_wrapper(LZO)
|
||||
if(NOT LZO_FOUND)
|
||||
message(FATAL_ERROR "Failed finding system LZO version!")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_SYSTEM_EIGEN3)
|
||||
find_package_wrapper(Eigen3)
|
||||
if(NOT EIGEN3_FOUND)
|
||||
message(FATAL_ERROR "Failed finding system Eigen3 version!")
|
||||
endif()
|
||||
endif()
|
||||
# else values are set below for all platforms
|
||||
|
||||
if(WITH_PYTHON)
|
||||
# No way to set py35, remove for now.
|
||||
# find_package(PythonLibs)
|
||||
|
||||
# Use our own instead, since without py is such a rare case,
|
||||
# require this package
|
||||
# XXX Linking errors with debian static python :/
|
||||
# find_package_wrapper(PythonLibsUnix REQUIRED)
|
||||
find_package(PythonLibsUnix REQUIRED)
|
||||
endif()
|
||||
|
||||
if(WITH_IMAGE_OPENEXR)
|
||||
find_package_wrapper(OpenEXR) # our own module
|
||||
if(NOT OPENEXR_FOUND)
|
||||
set(WITH_IMAGE_OPENEXR OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_IMAGE_OPENJPEG)
|
||||
find_package_wrapper(OpenJPEG)
|
||||
if(NOT OPENJPEG_FOUND)
|
||||
set(WITH_IMAGE_OPENJPEG OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_IMAGE_TIFF)
|
||||
# XXX Linking errors with debian static tiff :/
|
||||
# find_package_wrapper(TIFF)
|
||||
find_package(TIFF)
|
||||
if(NOT TIFF_FOUND)
|
||||
set(WITH_IMAGE_TIFF OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Audio IO
|
||||
if(WITH_SYSTEM_AUDASPACE)
|
||||
find_package_wrapper(Audaspace)
|
||||
if(NOT AUDASPACE_FOUND OR NOT AUDASPACE_C_FOUND)
|
||||
message(FATAL_ERROR "Audaspace external library not found!")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_OPENAL)
|
||||
find_package_wrapper(OpenAL)
|
||||
if(NOT OPENAL_FOUND)
|
||||
set(WITH_OPENAL OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_SDL)
|
||||
if(WITH_SDL_DYNLOAD)
|
||||
set(SDL_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/extern/sdlew/include/SDL2")
|
||||
set(SDL_LIBRARY)
|
||||
else()
|
||||
find_package_wrapper(SDL2)
|
||||
if(SDL2_FOUND)
|
||||
# Use same names for both versions of SDL until we move to 2.x.
|
||||
set(SDL_INCLUDE_DIR "${SDL2_INCLUDE_DIR}")
|
||||
set(SDL_LIBRARY "${SDL2_LIBRARY}")
|
||||
set(SDL_FOUND "${SDL2_FOUND}")
|
||||
else()
|
||||
find_package_wrapper(SDL)
|
||||
endif()
|
||||
mark_as_advanced(
|
||||
SDL_INCLUDE_DIR
|
||||
SDL_LIBRARY
|
||||
)
|
||||
# unset(SDLMAIN_LIBRARY CACHE)
|
||||
if(NOT SDL_FOUND)
|
||||
set(WITH_SDL OFF)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_JACK)
|
||||
find_package_wrapper(Jack)
|
||||
if(NOT JACK_FOUND)
|
||||
set(WITH_JACK OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Codecs
|
||||
if(WITH_CODEC_SNDFILE)
|
||||
find_package_wrapper(SndFile)
|
||||
if(NOT SNDFILE_FOUND)
|
||||
set(WITH_CODEC_SNDFILE OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_CODEC_FFMPEG)
|
||||
set(FFMPEG /usr CACHE PATH "FFMPEG Directory")
|
||||
set(FFMPEG_LIBRARIES avformat avcodec avutil avdevice swscale CACHE STRING "FFMPEG Libraries")
|
||||
|
||||
mark_as_advanced(FFMPEG)
|
||||
|
||||
# lame, but until we have proper find module for ffmpeg
|
||||
set(FFMPEG_INCLUDE_DIRS ${FFMPEG}/include)
|
||||
if(EXISTS "${FFMPEG}/include/ffmpeg/")
|
||||
list(APPEND FFMPEG_INCLUDE_DIRS "${FFMPEG}/include/ffmpeg")
|
||||
endif()
|
||||
# end lameness
|
||||
|
||||
mark_as_advanced(FFMPEG_LIBRARIES)
|
||||
set(FFMPEG_LIBPATH ${FFMPEG}/lib)
|
||||
endif()
|
||||
|
||||
if(WITH_FFTW3)
|
||||
find_package_wrapper(Fftw3)
|
||||
if(NOT FFTW3_FOUND)
|
||||
set(WITH_FFTW3 OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_OPENCOLLADA)
|
||||
find_package_wrapper(OpenCOLLADA)
|
||||
if(OPENCOLLADA_FOUND)
|
||||
find_package_wrapper(XML2)
|
||||
find_package_wrapper(PCRE)
|
||||
else()
|
||||
set(WITH_OPENCOLLADA OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_MEM_JEMALLOC)
|
||||
find_package_wrapper(JeMalloc)
|
||||
if(NOT JEMALLOC_FOUND)
|
||||
set(WITH_MEM_JEMALLOC OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_INPUT_NDOF)
|
||||
find_package_wrapper(Spacenav)
|
||||
if(SPACENAV_FOUND)
|
||||
# use generic names within blenders buildsystem.
|
||||
set(NDOF_INCLUDE_DIRS ${SPACENAV_INCLUDE_DIRS})
|
||||
set(NDOF_LIBRARIES ${SPACENAV_LIBRARIES})
|
||||
else()
|
||||
set(WITH_INPUT_NDOF OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_CYCLES_OSL)
|
||||
set(CYCLES_OSL ${LIBDIR}/osl CACHE PATH "Path to OpenShadingLanguage installation")
|
||||
if(NOT OSL_ROOT)
|
||||
set(OSL_ROOT ${CYCLES_OSL})
|
||||
endif()
|
||||
find_package_wrapper(OpenShadingLanguage)
|
||||
if(OSL_FOUND)
|
||||
if(${OSL_LIBRARY_VERSION_MAJOR} EQUAL "1" AND ${OSL_LIBRARY_VERSION_MINOR} LESS "6")
|
||||
# Note: --whole-archive is needed to force loading of all symbols in liboslexec,
|
||||
# otherwise LLVM is missing the osl_allocate_closure_component function
|
||||
set(OSL_LIBRARIES
|
||||
${OSL_OSLCOMP_LIBRARY}
|
||||
-Wl,--whole-archive ${OSL_OSLEXEC_LIBRARY}
|
||||
-Wl,--no-whole-archive ${OSL_OSLQUERY_LIBRARY}
|
||||
)
|
||||
endif()
|
||||
else()
|
||||
message(STATUS "OSL not found, disabling it from Cycles")
|
||||
set(WITH_CYCLES_OSL OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_OPENVDB)
|
||||
find_package_wrapper(OpenVDB)
|
||||
find_package_wrapper(TBB)
|
||||
if(NOT OPENVDB_FOUND OR NOT TBB_FOUND)
|
||||
set(WITH_OPENVDB OFF)
|
||||
set(WITH_OPENVDB_BLOSC OFF)
|
||||
message(STATUS "OpenVDB not found, disabling it")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_ALEMBIC)
|
||||
find_package_wrapper(Alembic)
|
||||
|
||||
if(WITH_ALEMBIC_HDF5)
|
||||
set(HDF5_ROOT_DIR ${LIBDIR}/hdf5)
|
||||
find_package_wrapper(HDF5)
|
||||
endif()
|
||||
|
||||
if(NOT ALEMBIC_FOUND OR (WITH_ALEMBIC_HDF5 AND NOT HDF5_FOUND))
|
||||
set(WITH_ALEMBIC OFF)
|
||||
set(WITH_ALEMBIC_HDF5 OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_BOOST)
|
||||
# uses in build instructions to override include and library variables
|
||||
if(NOT BOOST_CUSTOM)
|
||||
if(WITH_STATIC_LIBS)
|
||||
set(Boost_USE_STATIC_LIBS ON)
|
||||
endif()
|
||||
set(Boost_USE_MULTITHREADED ON)
|
||||
set(__boost_packages filesystem regex system thread date_time)
|
||||
if(WITH_CYCLES_OSL)
|
||||
if(NOT (${OSL_LIBRARY_VERSION_MAJOR} EQUAL "1" AND ${OSL_LIBRARY_VERSION_MINOR} LESS "6"))
|
||||
list(APPEND __boost_packages wave)
|
||||
else()
|
||||
endif()
|
||||
endif()
|
||||
if(WITH_INTERNATIONAL)
|
||||
list(APPEND __boost_packages locale)
|
||||
endif()
|
||||
if(WITH_CYCLES_NETWORK)
|
||||
list(APPEND __boost_packages serialization)
|
||||
endif()
|
||||
if(WITH_OPENVDB)
|
||||
list(APPEND __boost_packages iostreams)
|
||||
endif()
|
||||
find_package(Boost 1.48 COMPONENTS ${__boost_packages})
|
||||
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)
|
||||
if(Boost_USE_STATIC_LIBS AND WITH_BOOST_ICU)
|
||||
find_package(IcuLinux)
|
||||
endif()
|
||||
mark_as_advanced(Boost_DIR) # why doesnt boost do this?
|
||||
endif()
|
||||
|
||||
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()
|
||||
|
||||
if(WITH_OPENIMAGEIO)
|
||||
find_package_wrapper(OpenImageIO)
|
||||
if(NOT OPENIMAGEIO_PUGIXML_FOUND AND WITH_CYCLES_STANDALONE)
|
||||
find_package_wrapper(PugiXML)
|
||||
else()
|
||||
set(PUGIXML_INCLUDE_DIR "${OPENIMAGEIO_INCLUDE_DIR/OpenImageIO}")
|
||||
set(PUGIXML_LIBRARIES "")
|
||||
endif()
|
||||
|
||||
set(OPENIMAGEIO_LIBRARIES
|
||||
${OPENIMAGEIO_LIBRARIES}
|
||||
${PNG_LIBRARIES}
|
||||
${JPEG_LIBRARIES}
|
||||
${ZLIB_LIBRARIES}
|
||||
${BOOST_LIBRARIES}
|
||||
)
|
||||
set(OPENIMAGEIO_LIBPATH) # TODO, remove and reference the absolute path everywhere
|
||||
set(OPENIMAGEIO_DEFINITIONS "")
|
||||
|
||||
if(WITH_IMAGE_TIFF)
|
||||
list(APPEND OPENIMAGEIO_LIBRARIES "${TIFF_LIBRARY}")
|
||||
endif()
|
||||
if(WITH_IMAGE_OPENEXR)
|
||||
list(APPEND OPENIMAGEIO_LIBRARIES "${OPENEXR_LIBRARIES}")
|
||||
endif()
|
||||
|
||||
if(NOT OPENIMAGEIO_FOUND)
|
||||
set(WITH_OPENIMAGEIO OFF)
|
||||
message(STATUS "OpenImageIO not found, disabling WITH_CYCLES")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_OPENCOLORIO)
|
||||
find_package_wrapper(OpenColorIO)
|
||||
|
||||
set(OPENCOLORIO_LIBRARIES ${OPENCOLORIO_LIBRARIES})
|
||||
set(OPENCOLORIO_LIBPATH) # TODO, remove and reference the absolute path everywhere
|
||||
set(OPENCOLORIO_DEFINITIONS)
|
||||
|
||||
if(NOT OPENCOLORIO_FOUND)
|
||||
set(WITH_OPENCOLORIO OFF)
|
||||
message(STATUS "OpenColorIO not found")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_LLVM)
|
||||
find_package_wrapper(LLVM)
|
||||
|
||||
if(NOT LLVM_FOUND)
|
||||
set(WITH_LLVM OFF)
|
||||
message(STATUS "LLVM not found")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_LLVM OR WITH_SDL_DYNLOAD)
|
||||
# Fix for conflict with Mesa llvmpipe
|
||||
set(PLATFORM_LINKFLAGS
|
||||
"${PLATFORM_LINKFLAGS} -Wl,--version-script='${CMAKE_SOURCE_DIR}/source/creator/blender.map'"
|
||||
)
|
||||
endif()
|
||||
|
||||
if(WITH_OPENSUBDIV)
|
||||
find_package_wrapper(OpenSubdiv)
|
||||
|
||||
set(OPENSUBDIV_LIBRARIES ${OPENSUBDIV_LIBRARIES})
|
||||
set(OPENSUBDIV_LIBPATH) # TODO, remove and reference the absolute path everywhere
|
||||
|
||||
if(NOT OPENSUBDIV_FOUND)
|
||||
set(WITH_OPENSUBDIV OFF)
|
||||
message(STATUS "OpenSubdiv not found")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# OpenSuse needs lutil, ArchLinux not, for now keep, can avoid by using --as-needed
|
||||
list(APPEND PLATFORM_LINKLIBS -lutil -lc -lm)
|
||||
|
||||
find_package(Threads REQUIRED)
|
||||
list(APPEND PLATFORM_LINKLIBS ${CMAKE_THREAD_LIBS_INIT})
|
||||
# used by other platforms
|
||||
set(PTHREADS_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
|
||||
|
||||
if(CMAKE_DL_LIBS)
|
||||
list(APPEND PLATFORM_LINKLIBS ${CMAKE_DL_LIBS})
|
||||
endif()
|
||||
|
||||
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||||
if(NOT WITH_PYTHON_MODULE)
|
||||
# binreloc is linux only
|
||||
set(BINRELOC_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/extern/binreloc/include)
|
||||
set(WITH_BINRELOC ON)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# lfs on glibc, all compilers should use
|
||||
add_definitions(-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE)
|
||||
|
||||
# GNU Compiler
|
||||
if(CMAKE_COMPILER_IS_GNUCC)
|
||||
set(PLATFORM_CFLAGS "-pipe -fPIC -funsigned-char -fno-strict-aliasing")
|
||||
|
||||
# use ld.gold linker if available, could make optional
|
||||
execute_process(
|
||||
COMMAND ${CMAKE_C_COMPILER} -fuse-ld=gold -Wl,--version
|
||||
ERROR_QUIET OUTPUT_VARIABLE LD_VERSION)
|
||||
if("${LD_VERSION}" MATCHES "GNU gold")
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fuse-ld=gold")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fuse-ld=gold")
|
||||
else()
|
||||
message(STATUS "GNU gold linker isn't available, using the default system linker.")
|
||||
endif()
|
||||
unset(LD_VERSION)
|
||||
|
||||
# CLang is the same as GCC for now.
|
||||
elseif(CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||
set(PLATFORM_CFLAGS "-pipe -fPIC -funsigned-char -fno-strict-aliasing")
|
||||
# Solaris CC
|
||||
elseif(CMAKE_C_COMPILER_ID MATCHES "SunPro")
|
||||
set(PLATFORM_CFLAGS "-pipe -features=extensions -fPIC -D__FUNCTION__=__func__")
|
||||
|
||||
# Intel C++ Compiler
|
||||
elseif(CMAKE_C_COMPILER_ID MATCHES "Intel")
|
||||
# think these next two are broken
|
||||
find_program(XIAR xiar)
|
||||
if(XIAR)
|
||||
set(CMAKE_AR "${XIAR}")
|
||||
endif()
|
||||
mark_as_advanced(XIAR)
|
||||
|
||||
find_program(XILD xild)
|
||||
if(XILD)
|
||||
set(CMAKE_LINKER "${XILD}")
|
||||
endif()
|
||||
mark_as_advanced(XILD)
|
||||
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fp-model precise -prec_div -parallel")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fp-model precise -prec_div -parallel")
|
||||
|
||||
# set(PLATFORM_CFLAGS "${PLATFORM_CFLAGS} -diag-enable sc3")
|
||||
set(PLATFORM_CFLAGS "-pipe -fPIC -funsigned-char -fno-strict-aliasing")
|
||||
set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -static-intel")
|
||||
endif()
|
||||
87
build_files/cmake/platform/platform_win32.cmake
Normal file
87
build_files/cmake/platform/platform_win32.cmake
Normal file
@@ -0,0 +1,87 @@
|
||||
# ***** BEGIN GPL LICENSE BLOCK *****
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#
|
||||
# The Original Code is Copyright (C) 2016, Blender Foundation
|
||||
# All rights reserved.
|
||||
#
|
||||
# Contributor(s): Sergey Sharybin.
|
||||
#
|
||||
# ***** END GPL LICENSE BLOCK *****
|
||||
|
||||
# Libraries configuration for Windows.
|
||||
|
||||
add_definitions(-DWIN32)
|
||||
|
||||
if(MSVC)
|
||||
include(platform_win32_msvc)
|
||||
elseif(CMAKE_COMPILER_IS_GNUCC)
|
||||
include(platform_win32_mingw)
|
||||
endif()
|
||||
|
||||
# Things common to both mingw and MSVC should go here
|
||||
|
||||
set(WINTAB_INC ${LIBDIR}/wintab/include)
|
||||
|
||||
if(WITH_OPENAL)
|
||||
set(OPENAL ${LIBDIR}/openal)
|
||||
set(OPENALDIR ${LIBDIR}/openal)
|
||||
set(OPENAL_INCLUDE_DIR ${OPENAL}/include)
|
||||
if(MSVC)
|
||||
set(OPENAL_LIBRARY openal32)
|
||||
else()
|
||||
set(OPENAL_LIBRARY wrap_oal)
|
||||
endif()
|
||||
set(OPENAL_LIBPATH ${OPENAL}/lib)
|
||||
endif()
|
||||
|
||||
if(WITH_CODEC_SNDFILE)
|
||||
set(SNDFILE ${LIBDIR}/sndfile)
|
||||
set(SNDFILE_INCLUDE_DIRS ${SNDFILE}/include)
|
||||
set(SNDFILE_LIBRARIES libsndfile-1)
|
||||
set(SNDFILE_LIBPATH ${SNDFILE}/lib) # TODO, deprecate
|
||||
endif()
|
||||
|
||||
if(WITH_RAYOPTIMIZATION AND SUPPORT_SSE_BUILD)
|
||||
add_definitions(-D__SSE__ -D__MMX__)
|
||||
endif()
|
||||
|
||||
if(WITH_CYCLES_OSL)
|
||||
set(CYCLES_OSL ${LIBDIR}/osl CACHE PATH "Path to OpenShadingLanguage installation")
|
||||
|
||||
find_library(OSL_LIB_EXEC NAMES oslexec PATHS ${CYCLES_OSL}/lib)
|
||||
find_library(OSL_LIB_COMP NAMES oslcomp PATHS ${CYCLES_OSL}/lib)
|
||||
find_library(OSL_LIB_QUERY NAMES oslquery PATHS ${CYCLES_OSL}/lib)
|
||||
find_library(OSL_LIB_EXEC_DEBUG NAMES oslexec_d PATHS ${CYCLES_OSL}/lib)
|
||||
find_library(OSL_LIB_COMP_DEBUG NAMES oslcomp_d PATHS ${CYCLES_OSL}/lib)
|
||||
find_library(OSL_LIB_QUERY_DEBUG NAMES oslquery_d PATHS ${CYCLES_OSL}/lib)
|
||||
list(APPEND OSL_LIBRARIES
|
||||
optimized ${OSL_LIB_COMP}
|
||||
optimized ${OSL_LIB_EXEC}
|
||||
optimized ${OSL_LIB_QUERY}
|
||||
debug ${OSL_LIB_EXEC_DEBUG}
|
||||
debug ${OSL_LIB_COMP_DEBUG}
|
||||
debug ${OSL_LIB_QUERY_DEBUG}
|
||||
)
|
||||
find_path(OSL_INCLUDE_DIR OSL/oslclosure.h PATHS ${CYCLES_OSL}/include)
|
||||
find_program(OSL_COMPILER NAMES oslc PATHS ${CYCLES_OSL}/bin)
|
||||
|
||||
if(OSL_INCLUDE_DIR AND OSL_LIBRARIES AND OSL_COMPILER)
|
||||
set(OSL_FOUND TRUE)
|
||||
else()
|
||||
message(STATUS "OSL not found")
|
||||
set(WITH_CYCLES_OSL OFF)
|
||||
endif()
|
||||
endif()
|
||||
302
build_files/cmake/platform/platform_win32_mingw.cmake
Normal file
302
build_files/cmake/platform/platform_win32_mingw.cmake
Normal file
@@ -0,0 +1,302 @@
|
||||
# ***** BEGIN GPL LICENSE BLOCK *****
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#
|
||||
# The Original Code is Copyright (C) 2016, Blender Foundation
|
||||
# All rights reserved.
|
||||
#
|
||||
# Contributor(s): Sergey Sharybin.
|
||||
#
|
||||
# ***** END GPL LICENSE BLOCK *****
|
||||
|
||||
# Libraries configuration for Windows when compiling with MinGW.
|
||||
|
||||
# keep GCC specific stuff here
|
||||
include(CheckCSourceCompiles)
|
||||
# Setup 64bit and 64bit windows systems
|
||||
CHECK_C_SOURCE_COMPILES("
|
||||
#ifndef __MINGW64__
|
||||
#error
|
||||
#endif
|
||||
int main(void) { return 0; }
|
||||
"
|
||||
WITH_MINGW64
|
||||
)
|
||||
|
||||
if(NOT DEFINED LIBDIR)
|
||||
if(WITH_MINGW64)
|
||||
message(STATUS "Compiling for 64 bit with MinGW-w64.")
|
||||
set(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/mingw64)
|
||||
else()
|
||||
message(STATUS "Compiling for 32 bit with MinGW-w32.")
|
||||
set(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/mingw32)
|
||||
|
||||
if(WITH_RAYOPTIMIZATION)
|
||||
message(WARNING "MinGW-w32 is known to be unstable with 'WITH_RAYOPTIMIZATION' option enabled.")
|
||||
endif()
|
||||
endif()
|
||||
else()
|
||||
message(STATUS "Using pre-compiled LIBDIR: ${LIBDIR}")
|
||||
endif()
|
||||
if(NOT EXISTS "${LIBDIR}/")
|
||||
message(FATAL_ERROR "Windows requires pre-compiled libs at: '${LIBDIR}'")
|
||||
endif()
|
||||
|
||||
list(APPEND PLATFORM_LINKLIBS
|
||||
-lshell32 -lshfolder -lgdi32 -lmsvcrt -lwinmm -lmingw32 -lm -lws2_32
|
||||
-lz -lstdc++ -lole32 -luuid -lwsock32 -lpsapi -ldbghelp
|
||||
)
|
||||
|
||||
if(WITH_INPUT_IME)
|
||||
list(APPEND PLATFORM_LINKLIBS -limm32)
|
||||
endif()
|
||||
|
||||
set(PLATFORM_CFLAGS "-pipe -funsigned-char -fno-strict-aliasing")
|
||||
|
||||
if(WITH_MINGW64)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpermissive")
|
||||
list(APPEND PLATFORM_LINKLIBS -lpthread)
|
||||
|
||||
add_definitions(-DFREE_WINDOWS64 -DMS_WIN64)
|
||||
endif()
|
||||
|
||||
add_definitions(-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE)
|
||||
|
||||
add_definitions(-DFREE_WINDOWS)
|
||||
|
||||
set(PNG "${LIBDIR}/png")
|
||||
set(PNG_INCLUDE_DIRS "${PNG}/include")
|
||||
set(PNG_LIBPATH ${PNG}/lib) # not cmake defined
|
||||
|
||||
if(WITH_MINGW64)
|
||||
set(JPEG_LIBRARIES jpeg)
|
||||
else()
|
||||
set(JPEG_LIBRARIES libjpeg)
|
||||
endif()
|
||||
set(PNG_LIBRARIES png)
|
||||
|
||||
set(ZLIB ${LIBDIR}/zlib)
|
||||
set(ZLIB_INCLUDE_DIRS ${ZLIB}/include)
|
||||
set(ZLIB_LIBPATH ${ZLIB}/lib)
|
||||
set(ZLIB_LIBRARIES z)
|
||||
|
||||
set(JPEG "${LIBDIR}/jpeg")
|
||||
set(JPEG_INCLUDE_DIR "${JPEG}/include")
|
||||
set(JPEG_LIBPATH ${JPEG}/lib) # not cmake defined
|
||||
|
||||
# comes with own pthread library
|
||||
if(NOT WITH_MINGW64)
|
||||
set(PTHREADS ${LIBDIR}/pthreads)
|
||||
#set(PTHREADS_INCLUDE_DIRS ${PTHREADS}/include)
|
||||
set(PTHREADS_LIBPATH ${PTHREADS}/lib)
|
||||
set(PTHREADS_LIBRARIES pthreadGC2)
|
||||
endif()
|
||||
|
||||
set(FREETYPE ${LIBDIR}/freetype)
|
||||
set(FREETYPE_INCLUDE_DIRS ${FREETYPE}/include ${FREETYPE}/include/freetype2)
|
||||
set(FREETYPE_LIBPATH ${FREETYPE}/lib)
|
||||
set(FREETYPE_LIBRARY freetype)
|
||||
|
||||
if(WITH_FFTW3)
|
||||
set(FFTW3 ${LIBDIR}/fftw3)
|
||||
set(FFTW3_LIBRARIES fftw3)
|
||||
set(FFTW3_INCLUDE_DIRS ${FFTW3}/include)
|
||||
set(FFTW3_LIBPATH ${FFTW3}/lib)
|
||||
endif()
|
||||
|
||||
if(WITH_OPENCOLLADA)
|
||||
set(OPENCOLLADA ${LIBDIR}/opencollada)
|
||||
set(OPENCOLLADA_INCLUDE_DIRS
|
||||
${OPENCOLLADA}/include/opencollada/COLLADAStreamWriter
|
||||
${OPENCOLLADA}/include/opencollada/COLLADABaseUtils
|
||||
${OPENCOLLADA}/include/opencollada/COLLADAFramework
|
||||
${OPENCOLLADA}/include/opencollada/COLLADASaxFrameworkLoader
|
||||
${OPENCOLLADA}/include/opencollada/GeneratedSaxParser
|
||||
)
|
||||
set(OPENCOLLADA_LIBPATH ${OPENCOLLADA}/lib/opencollada)
|
||||
set(OPENCOLLADA_LIBRARIES
|
||||
OpenCOLLADAStreamWriter
|
||||
OpenCOLLADASaxFrameworkLoader
|
||||
OpenCOLLADAFramework
|
||||
OpenCOLLADABaseUtils
|
||||
GeneratedSaxParser
|
||||
UTF MathMLSolver buffer ftoa xml
|
||||
)
|
||||
set(PCRE_LIBRARIES pcre)
|
||||
endif()
|
||||
|
||||
if(WITH_CODEC_FFMPEG)
|
||||
set(FFMPEG ${LIBDIR}/ffmpeg)
|
||||
set(FFMPEG_INCLUDE_DIRS ${FFMPEG}/include)
|
||||
if(WITH_MINGW64)
|
||||
set(FFMPEG_LIBRARIES avcodec.dll avformat.dll avdevice.dll avutil.dll swscale.dll swresample.dll)
|
||||
else()
|
||||
set(FFMPEG_LIBRARIES avcodec-55 avformat-55 avdevice-55 avutil-52 swscale-2)
|
||||
endif()
|
||||
set(FFMPEG_LIBPATH ${FFMPEG}/lib)
|
||||
endif()
|
||||
|
||||
if(WITH_IMAGE_OPENEXR)
|
||||
set(OPENEXR ${LIBDIR}/openexr)
|
||||
set(OPENEXR_INCLUDE_DIR ${OPENEXR}/include)
|
||||
set(OPENEXR_INCLUDE_DIRS ${OPENEXR}/include/OpenEXR)
|
||||
set(OPENEXR_LIBRARIES Half IlmImf Imath IlmThread Iex)
|
||||
set(OPENEXR_LIBPATH ${OPENEXR}/lib)
|
||||
endif()
|
||||
|
||||
if(WITH_IMAGE_TIFF)
|
||||
set(TIFF ${LIBDIR}/tiff)
|
||||
set(TIFF_LIBRARY tiff)
|
||||
set(TIFF_INCLUDE_DIR ${TIFF}/include)
|
||||
set(TIFF_LIBPATH ${TIFF}/lib)
|
||||
endif()
|
||||
|
||||
if(WITH_JACK)
|
||||
set(JACK ${LIBDIR}/jack)
|
||||
set(JACK_INCLUDE_DIRS ${JACK}/include/jack ${JACK}/include)
|
||||
set(JACK_LIBRARIES jack)
|
||||
set(JACK_LIBPATH ${JACK}/lib)
|
||||
|
||||
# TODO, gives linking errors, force off
|
||||
set(WITH_JACK OFF)
|
||||
endif()
|
||||
|
||||
if(WITH_PYTHON)
|
||||
# normally cached but not since we include them with blender
|
||||
set(PYTHON_VERSION 3.5) # CACHE STRING)
|
||||
string(REPLACE "." "" _PYTHON_VERSION_NO_DOTS ${PYTHON_VERSION})
|
||||
set(PYTHON_INCLUDE_DIR "${LIBDIR}/python/include/python${PYTHON_VERSION}") # CACHE PATH)
|
||||
set(PYTHON_LIBRARY "${LIBDIR}/python/lib/python${_PYTHON_VERSION_NO_DOTS}mw.lib") # CACHE FILEPATH)
|
||||
unset(_PYTHON_VERSION_NO_DOTS)
|
||||
|
||||
# uncached vars
|
||||
set(PYTHON_INCLUDE_DIRS "${PYTHON_INCLUDE_DIR}")
|
||||
set(PYTHON_LIBRARIES "${PYTHON_LIBRARY}")
|
||||
endif()
|
||||
|
||||
if(WITH_BOOST)
|
||||
set(BOOST ${LIBDIR}/boost)
|
||||
set(BOOST_INCLUDE_DIR ${BOOST}/include)
|
||||
if(WITH_MINGW64)
|
||||
set(BOOST_POSTFIX "mgw47-mt-s-1_49")
|
||||
set(BOOST_DEBUG_POSTFIX "mgw47-mt-sd-1_49")
|
||||
else()
|
||||
set(BOOST_POSTFIX "mgw46-mt-s-1_49")
|
||||
set(BOOST_DEBUG_POSTFIX "mgw46-mt-sd-1_49")
|
||||
endif()
|
||||
set(BOOST_LIBRARIES
|
||||
optimized boost_date_time-${BOOST_POSTFIX} boost_filesystem-${BOOST_POSTFIX}
|
||||
boost_regex-${BOOST_POSTFIX}
|
||||
boost_system-${BOOST_POSTFIX} boost_thread-${BOOST_POSTFIX}
|
||||
debug boost_date_time-${BOOST_DEBUG_POSTFIX} boost_filesystem-${BOOST_DEBUG_POSTFIX}
|
||||
boost_regex-${BOOST_DEBUG_POSTFIX}
|
||||
boost_system-${BOOST_DEBUG_POSTFIX} boost_thread-${BOOST_DEBUG_POSTFIX})
|
||||
if(WITH_INTERNATIONAL)
|
||||
set(BOOST_LIBRARIES ${BOOST_LIBRARIES}
|
||||
optimized boost_locale-${BOOST_POSTFIX}
|
||||
debug boost_locale-${BOOST_DEBUG_POSTFIX}
|
||||
)
|
||||
endif()
|
||||
if(WITH_CYCLES_OSL)
|
||||
set(BOOST_LIBRARIES ${BOOST_LIBRARIES}
|
||||
optimized boost_wave-${BOOST_POSTFIX}
|
||||
debug boost_wave-${BOOST_DEBUG_POSTFIX}
|
||||
)
|
||||
endif()
|
||||
set(BOOST_LIBPATH ${BOOST}/lib)
|
||||
set(BOOST_DEFINITIONS "-DBOOST_ALL_NO_LIB -DBOOST_THREAD_USE_LIB ")
|
||||
endif()
|
||||
|
||||
if(WITH_OPENIMAGEIO)
|
||||
set(OPENIMAGEIO ${LIBDIR}/openimageio)
|
||||
set(OPENIMAGEIO_INCLUDE_DIRS ${OPENIMAGEIO}/include)
|
||||
set(OPENIMAGEIO_LIBRARIES OpenImageIO)
|
||||
set(OPENIMAGEIO_LIBPATH ${OPENIMAGEIO}/lib)
|
||||
set(OPENIMAGEIO_DEFINITIONS "")
|
||||
set(OPENIMAGEIO_IDIFF "${OPENIMAGEIO}/bin/idiff.exe")
|
||||
endif()
|
||||
|
||||
if(WITH_LLVM)
|
||||
set(LLVM_ROOT_DIR ${LIBDIR}/llvm CACHE PATH "Path to the LLVM installation")
|
||||
set(LLVM_LIBPATH ${LLVM_ROOT_DIR}/lib)
|
||||
# Explicitly set llvm lib order.
|
||||
#---- WARNING ON GCC ORDER OF LIBS IS IMPORTANT, DO NOT CHANGE! ---------
|
||||
set(LLVM_LIBRARY LLVMSelectionDAG LLVMCodeGen LLVMScalarOpts LLVMAnalysis LLVMArchive
|
||||
LLVMAsmParser LLVMAsmPrinter
|
||||
LLVMBitReader LLVMBitWriter
|
||||
LLVMDebugInfo LLVMExecutionEngine
|
||||
LLVMInstCombine LLVMInstrumentation
|
||||
LLVMInterpreter LLVMJIT
|
||||
LLVMLinker LLVMMC
|
||||
LLVMMCDisassembler LLVMMCJIT
|
||||
LLVMMCParser LLVMObject
|
||||
LLVMRuntimeDyld
|
||||
LLVMSupport
|
||||
LLVMTableGen LLVMTarget
|
||||
LLVMTransformUtils LLVMVectorize
|
||||
LLVMX86AsmParser LLVMX86AsmPrinter
|
||||
LLVMX86CodeGen LLVMX86Desc
|
||||
LLVMX86Disassembler LLVMX86Info
|
||||
LLVMX86Utils LLVMipa
|
||||
LLVMipo LLVMCore)
|
||||
# imagehelp is needed by LLVM 3.1 on MinGW, check lib\Support\Windows\Signals.inc
|
||||
list(APPEND PLATFORM_LINKLIBS -limagehlp)
|
||||
endif()
|
||||
|
||||
if(WITH_OPENCOLORIO)
|
||||
set(OPENCOLORIO ${LIBDIR}/opencolorio)
|
||||
set(OPENCOLORIO_INCLUDE_DIRS ${OPENCOLORIO}/include)
|
||||
set(OPENCOLORIO_LIBRARIES OpenColorIO)
|
||||
set(OPENCOLORIO_LIBPATH ${OPENCOLORIO}/lib)
|
||||
set(OPENCOLORIO_DEFINITIONS)
|
||||
endif()
|
||||
|
||||
if(WITH_SDL)
|
||||
set(SDL ${LIBDIR}/sdl)
|
||||
set(SDL_INCLUDE_DIR ${SDL}/include)
|
||||
set(SDL_LIBRARY SDL)
|
||||
set(SDL_LIBPATH ${SDL}/lib)
|
||||
endif()
|
||||
|
||||
if(WITH_OPENVDB)
|
||||
set(OPENVDB ${LIBDIR}/openvdb)
|
||||
set(OPENVDB_INCLUDE_DIRS ${OPENVDB}/include)
|
||||
set(OPENVDB_LIBRARIES openvdb ${TBB_LIBRARIES})
|
||||
set(OPENVDB_LIBPATH ${LIBDIR}/openvdb/lib)
|
||||
set(OPENVDB_DEFINITIONS)
|
||||
endif()
|
||||
|
||||
if(WITH_ALEMBIC)
|
||||
# TODO(sergey): For until someone drops by and compiles libraries for
|
||||
# MinGW we allow users to compile their own Alembic library and use
|
||||
# that via find_package(),
|
||||
#
|
||||
# Once precompiled libraries are there we'll use hardcoded locations.
|
||||
find_package_wrapper(Alembic)
|
||||
if(WITH_ALEMBIC_HDF5)
|
||||
set(HDF5_ROOT_DIR ${LIBDIR}/hdf5)
|
||||
find_package_wrapper(HDF5)
|
||||
endif()
|
||||
if(NOT ALEMBIC_FOUND OR (WITH_ALEMBIC_HDF5 AND NOT HDF5_FOUND))
|
||||
set(WITH_ALEMBIC OFF)
|
||||
set(WITH_ALEMBIC_HDF5 OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(PLATFORM_LINKFLAGS "-Xlinker --stack=2097152")
|
||||
|
||||
## DISABLE - causes linking errors
|
||||
## for re-distribution, so users dont need mingw installed
|
||||
# set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -static-libgcc -static-libstdc++")
|
||||
485
build_files/cmake/platform/platform_win32_msvc.cmake
Normal file
485
build_files/cmake/platform/platform_win32_msvc.cmake
Normal file
@@ -0,0 +1,485 @@
|
||||
# ***** BEGIN GPL LICENSE BLOCK *****
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#
|
||||
# The Original Code is Copyright (C) 2016, Blender Foundation
|
||||
# All rights reserved.
|
||||
#
|
||||
# Contributor(s): Sergey Sharybin.
|
||||
#
|
||||
# ***** END GPL LICENSE BLOCK *****
|
||||
|
||||
# Libraries configuration for Windows when compiling with MSVC.
|
||||
|
||||
macro(warn_hardcoded_paths package_name
|
||||
)
|
||||
if(WITH_WINDOWS_FIND_MODULES)
|
||||
message(WARNING "Using HARDCODED ${package_name} locations")
|
||||
endif(WITH_WINDOWS_FIND_MODULES)
|
||||
endmacro()
|
||||
|
||||
macro(windows_find_package package_name
|
||||
)
|
||||
if(WITH_WINDOWS_FIND_MODULES)
|
||||
find_package( ${package_name})
|
||||
endif(WITH_WINDOWS_FIND_MODULES)
|
||||
endmacro()
|
||||
|
||||
add_definitions(-DWIN32)
|
||||
# Minimum MSVC Version
|
||||
if(MSVC_VERSION EQUAL 1800)
|
||||
set(_min_ver "18.0.31101")
|
||||
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${_min_ver})
|
||||
message(FATAL_ERROR
|
||||
"Visual Studio 2013 (Update 4, ${_min_ver}) required, "
|
||||
"found (${CMAKE_CXX_COMPILER_VERSION})")
|
||||
endif()
|
||||
endif()
|
||||
if(MSVC_VERSION EQUAL 1900)
|
||||
set(_min_ver "19.0.24210")
|
||||
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${_min_ver})
|
||||
message(FATAL_ERROR
|
||||
"Visual Studio 2015 (Update 3, ${_min_ver}) required, "
|
||||
"found (${CMAKE_CXX_COMPILER_VERSION})")
|
||||
endif()
|
||||
endif()
|
||||
unset(_min_ver)
|
||||
|
||||
# needed for some MSVC installations
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO")
|
||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH:NO")
|
||||
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /SAFESEH:NO")
|
||||
|
||||
list(APPEND PLATFORM_LINKLIBS
|
||||
ws2_32 vfw32 winmm kernel32 user32 gdi32 comdlg32
|
||||
advapi32 shfolder shell32 ole32 oleaut32 uuid psapi Dbghelp
|
||||
)
|
||||
|
||||
if(WITH_INPUT_IME)
|
||||
list(APPEND PLATFORM_LINKLIBS imm32)
|
||||
endif()
|
||||
|
||||
add_definitions(
|
||||
-D_CRT_NONSTDC_NO_DEPRECATE
|
||||
-D_CRT_SECURE_NO_DEPRECATE
|
||||
-D_SCL_SECURE_NO_DEPRECATE
|
||||
-D_CONSOLE
|
||||
-D_LIB
|
||||
)
|
||||
|
||||
# MSVC11 needs _ALLOW_KEYWORD_MACROS to build
|
||||
add_definitions(-D_ALLOW_KEYWORD_MACROS)
|
||||
|
||||
# We want to support Vista level ABI
|
||||
add_definitions(-D_WIN32_WINNT=0x600)
|
||||
|
||||
# Make cmake find the msvc redistributables
|
||||
set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE)
|
||||
include(InstallRequiredSystemLibraries)
|
||||
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /nologo /J /Gd /MP /EHsc")
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /nologo /J /Gd /MP")
|
||||
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
|
||||
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MTd")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
|
||||
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT")
|
||||
set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} /MT")
|
||||
set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} /MT")
|
||||
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MT")
|
||||
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} /MT")
|
||||
|
||||
set(PLATFORM_LINKFLAGS "/SUBSYSTEM:CONSOLE /STACK:2097152 /INCREMENTAL:NO ")
|
||||
set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} /NODEFAULTLIB:msvcrt.lib /NODEFAULTLIB:msvcmrt.lib /NODEFAULTLIB:msvcurt.lib /NODEFAULTLIB:msvcrtd.lib ")
|
||||
|
||||
# Ignore meaningless for us linker warnings.
|
||||
set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} /ignore:4049 /ignore:4217 /ignore:4221")
|
||||
set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /ignore:4221")
|
||||
|
||||
# MSVC only, Mingw doesnt need
|
||||
if(CMAKE_CL_64)
|
||||
set(PLATFORM_LINKFLAGS "/MACHINE:X64 /OPT:NOREF ${PLATFORM_LINKFLAGS}")
|
||||
else()
|
||||
set(PLATFORM_LINKFLAGS "/MACHINE:IX86 /LARGEADDRESSAWARE ${PLATFORM_LINKFLAGS}")
|
||||
endif()
|
||||
|
||||
set(PLATFORM_LINKFLAGS_DEBUG "/IGNORE:4099 /NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:libc.lib")
|
||||
|
||||
if(NOT DEFINED LIBDIR)
|
||||
|
||||
# Setup 64bit and 64bit windows systems
|
||||
if(CMAKE_CL_64)
|
||||
message(STATUS "64 bit compiler detected.")
|
||||
set(LIBDIR_BASE "win64")
|
||||
else()
|
||||
message(STATUS "32 bit compiler detected.")
|
||||
set(LIBDIR_BASE "windows")
|
||||
endif()
|
||||
|
||||
if(MSVC_VERSION EQUAL 1900)
|
||||
message(STATUS "Visual Studio 2015 detected.")
|
||||
set(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/${LIBDIR_BASE}_vc14)
|
||||
else()
|
||||
message(STATUS "Visual Studio 2013 detected.")
|
||||
set(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/${LIBDIR_BASE}_vc12)
|
||||
endif()
|
||||
else()
|
||||
message(STATUS "Using pre-compiled LIBDIR: ${LIBDIR}")
|
||||
endif()
|
||||
if(NOT EXISTS "${LIBDIR}/")
|
||||
message(FATAL_ERROR "Windows requires pre-compiled libs at: '${LIBDIR}'")
|
||||
endif()
|
||||
|
||||
# Add each of our libraries to our cmake_prefix_path so find_package() could work
|
||||
file(GLOB children RELATIVE ${LIBDIR} ${LIBDIR}/*)
|
||||
foreach(child ${children})
|
||||
if(IS_DIRECTORY ${LIBDIR}/${child})
|
||||
list(APPEND CMAKE_PREFIX_PATH ${LIBDIR}/${child})
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
set(ZLIB_INCLUDE_DIRS ${LIBDIR}/zlib/include)
|
||||
set(ZLIB_LIBRARIES ${LIBDIR}/zlib/lib/libz_st.lib)
|
||||
set(ZLIB_INCLUDE_DIR ${LIBDIR}/zlib/include)
|
||||
set(ZLIB_LIBRARY ${LIBDIR}/zlib/lib/libz_st.lib)
|
||||
set(ZLIB_DIR ${LIBDIR}/zlib)
|
||||
|
||||
windows_find_package(zlib) # we want to find before finding things that depend on it like png
|
||||
windows_find_package(png)
|
||||
|
||||
if(NOT PNG_FOUND)
|
||||
warn_hardcoded_paths(libpng)
|
||||
set(PNG_PNG_INCLUDE_DIR ${LIBDIR}/png/include)
|
||||
set(PNG_LIBRARIES libpng)
|
||||
set(PNG "${LIBDIR}/png")
|
||||
set(PNG_INCLUDE_DIRS "${PNG}/include")
|
||||
set(PNG_LIBPATH ${PNG}/lib) # not cmake defined
|
||||
endif()
|
||||
|
||||
set(JPEG_NAMES ${JPEG_NAMES} libjpeg)
|
||||
windows_find_package(jpeg REQUIRED)
|
||||
if(NOT JPEG_FOUND)
|
||||
warn_hardcoded_paths(jpeg)
|
||||
set(JPEG_INCLUDE_DIR ${LIBDIR}/jpeg/include)
|
||||
set(JPEG_LIBRARIES ${LIBDIR}/jpeg/lib/libjpeg.lib)
|
||||
endif()
|
||||
|
||||
set(PTHREADS_INCLUDE_DIRS ${LIBDIR}/pthreads/include)
|
||||
set(PTHREADS_LIBRARIES ${LIBDIR}/pthreads/lib/pthreadVC2.lib)
|
||||
|
||||
set(FREETYPE ${LIBDIR}/freetype)
|
||||
set(FREETYPE_INCLUDE_DIRS
|
||||
${LIBDIR}/freetype/include
|
||||
${LIBDIR}/freetype/include/freetype2
|
||||
)
|
||||
set(FREETYPE_LIBRARY ${LIBDIR}/freetype/lib/freetype2ST.lib)
|
||||
windows_find_package(freetype REQUIRED)
|
||||
|
||||
if(WITH_FFTW3)
|
||||
set(FFTW3 ${LIBDIR}/fftw3)
|
||||
set(FFTW3_LIBRARIES libfftw)
|
||||
set(FFTW3_INCLUDE_DIRS ${FFTW3}/include)
|
||||
set(FFTW3_LIBPATH ${FFTW3}/lib)
|
||||
endif()
|
||||
|
||||
if(WITH_OPENCOLLADA)
|
||||
set(OPENCOLLADA ${LIBDIR}/opencollada)
|
||||
|
||||
set(OPENCOLLADA_INCLUDE_DIRS
|
||||
${OPENCOLLADA}/include/opencollada/COLLADAStreamWriter
|
||||
${OPENCOLLADA}/include/opencollada/COLLADABaseUtils
|
||||
${OPENCOLLADA}/include/opencollada/COLLADAFramework
|
||||
${OPENCOLLADA}/include/opencollada/COLLADASaxFrameworkLoader
|
||||
${OPENCOLLADA}/include/opencollada/GeneratedSaxParser
|
||||
)
|
||||
|
||||
set(OPENCOLLADA_LIBRARIES
|
||||
${OPENCOLLADA}/lib/opencollada/OpenCOLLADASaxFrameworkLoader.lib
|
||||
${OPENCOLLADA}/lib/opencollada/OpenCOLLADAFramework.lib
|
||||
${OPENCOLLADA}/lib/opencollada/OpenCOLLADABaseUtils.lib
|
||||
${OPENCOLLADA}/lib/opencollada/OpenCOLLADAStreamWriter.lib
|
||||
${OPENCOLLADA}/lib/opencollada/MathMLSolver.lib
|
||||
${OPENCOLLADA}/lib/opencollada/GeneratedSaxParser.lib
|
||||
${OPENCOLLADA}/lib/opencollada/xml.lib
|
||||
${OPENCOLLADA}/lib/opencollada/buffer.lib
|
||||
${OPENCOLLADA}/lib/opencollada/ftoa.lib
|
||||
)
|
||||
|
||||
if(NOT WITH_LLVM)
|
||||
list(APPEND OPENCOLLADA_LIBRARIES ${OPENCOLLADA}/lib/opencollada/UTF.lib)
|
||||
endif()
|
||||
|
||||
set(PCRE_LIBRARIES
|
||||
${OPENCOLLADA}/lib/opencollada/pcre.lib
|
||||
)
|
||||
endif()
|
||||
|
||||
if(WITH_CODEC_FFMPEG)
|
||||
set(FFMPEG_INCLUDE_DIRS
|
||||
${LIBDIR}/ffmpeg/include
|
||||
${LIBDIR}/ffmpeg/include/msvc
|
||||
)
|
||||
windows_find_package(FFMPEG)
|
||||
if(NOT FFMPEG_FOUND)
|
||||
warn_hardcoded_paths(ffmpeg)
|
||||
set(FFMPEG_LIBRARY_VERSION 55)
|
||||
set(FFMPEG_LIBRARY_VERSION_AVU 52)
|
||||
set(FFMPEG_LIBRARIES
|
||||
${LIBDIR}/ffmpeg/lib/avcodec-${FFMPEG_LIBRARY_VERSION}.lib
|
||||
${LIBDIR}/ffmpeg/lib/avformat-${FFMPEG_LIBRARY_VERSION}.lib
|
||||
${LIBDIR}/ffmpeg/lib/avdevice-${FFMPEG_LIBRARY_VERSION}.lib
|
||||
${LIBDIR}/ffmpeg/lib/avutil-${FFMPEG_LIBRARY_VERSION_AVU}.lib
|
||||
${LIBDIR}/ffmpeg/lib/swscale-2.lib
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_IMAGE_OPENEXR)
|
||||
set(OPENEXR_ROOT_DIR ${LIBDIR}/openexr)
|
||||
set(OPENEXR_VERSION "2.1")
|
||||
windows_find_package(OPENEXR REQUIRED)
|
||||
if(NOT OPENEXR_FOUND)
|
||||
warn_hardcoded_paths(OpenEXR)
|
||||
set(OPENEXR ${LIBDIR}/openexr)
|
||||
set(OPENEXR_INCLUDE_DIR ${OPENEXR}/include)
|
||||
set(OPENEXR_INCLUDE_DIRS ${OPENEXR_INCLUDE_DIR} ${OPENEXR}/include/OpenEXR)
|
||||
set(OPENEXR_LIBPATH ${OPENEXR}/lib)
|
||||
set(OPENEXR_LIBRARIES
|
||||
optimized ${OPENEXR_LIBPATH}/Iex-2_2.lib
|
||||
optimized ${OPENEXR_LIBPATH}/Half.lib
|
||||
optimized ${OPENEXR_LIBPATH}/IlmImf-2_2.lib
|
||||
optimized ${OPENEXR_LIBPATH}/Imath-2_2.lib
|
||||
optimized ${OPENEXR_LIBPATH}/IlmThread-2_2.lib
|
||||
debug ${OPENEXR_LIBPATH}/Iex-2_2_d.lib
|
||||
debug ${OPENEXR_LIBPATH}/Half_d.lib
|
||||
debug ${OPENEXR_LIBPATH}/IlmImf-2_2_d.lib
|
||||
debug ${OPENEXR_LIBPATH}/Imath-2_2_d.lib
|
||||
debug ${OPENEXR_LIBPATH}/IlmThread-2_2_d.lib
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_IMAGE_TIFF)
|
||||
# Try to find tiff first then complain and set static and maybe wrong paths
|
||||
windows_find_package(TIFF)
|
||||
if(NOT TIFF_FOUND)
|
||||
warn_hardcoded_paths(libtiff)
|
||||
set(TIFF_LIBRARY ${LIBDIR}/tiff/lib/libtiff.lib)
|
||||
set(TIFF_INCLUDE_DIR ${LIBDIR}/tiff/include)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_JACK)
|
||||
set(JACK_INCLUDE_DIRS
|
||||
${LIBDIR}/jack/include/jack
|
||||
${LIBDIR}/jack/include
|
||||
)
|
||||
set(JACK_LIBRARIES optimized ${LIBDIR}/jack/lib/libjack.lib debug ${LIBDIR}/jack/lib/libjack_d.lib)
|
||||
endif()
|
||||
|
||||
if(WITH_PYTHON)
|
||||
set(PYTHON_VERSION 3.5) # CACHE STRING)
|
||||
|
||||
string(REPLACE "." "" _PYTHON_VERSION_NO_DOTS ${PYTHON_VERSION})
|
||||
# Use shared libs for vc2008 and vc2010 until we actually have vc2010 libs
|
||||
set(PYTHON_LIBRARY ${LIBDIR}/python/lib/python${_PYTHON_VERSION_NO_DOTS}.lib)
|
||||
unset(_PYTHON_VERSION_NO_DOTS)
|
||||
|
||||
# Shared includes for both vc2008 and vc2010
|
||||
set(PYTHON_INCLUDE_DIR ${LIBDIR}/python/include/python${PYTHON_VERSION})
|
||||
|
||||
# uncached vars
|
||||
set(PYTHON_INCLUDE_DIRS "${PYTHON_INCLUDE_DIR}")
|
||||
set(PYTHON_LIBRARIES "${PYTHON_LIBRARY}")
|
||||
endif()
|
||||
|
||||
if(WITH_BOOST)
|
||||
if(WITH_CYCLES_OSL)
|
||||
set(boost_extra_libs wave)
|
||||
endif()
|
||||
if(WITH_INTERNATIONAL)
|
||||
list(APPEND boost_extra_libs locale)
|
||||
endif()
|
||||
if(WITH_OPENVDB)
|
||||
list(APPEND boost_extra_libs iostreams)
|
||||
endif()
|
||||
set(Boost_USE_STATIC_RUNTIME ON) # prefix lib
|
||||
set(Boost_USE_MULTITHREADED ON) # suffix -mt
|
||||
set(Boost_USE_STATIC_LIBS ON) # suffix -s
|
||||
if (WITH_WINDOWS_FIND_MODULES)
|
||||
find_package(Boost COMPONENTS date_time filesystem thread regex system ${boost_extra_libs})
|
||||
endif (WITH_WINDOWS_FIND_MODULES)
|
||||
if(NOT Boost_FOUND)
|
||||
warn_hardcoded_paths(BOOST)
|
||||
set(BOOST ${LIBDIR}/boost)
|
||||
set(BOOST_INCLUDE_DIR ${BOOST}/include)
|
||||
if(MSVC12)
|
||||
set(BOOST_LIBPATH ${BOOST}/lib)
|
||||
set(BOOST_POSTFIX "vc120-mt-s-1_60.lib")
|
||||
set(BOOST_DEBUG_POSTFIX "vc120-mt-sgd-1_60.lib")
|
||||
else()
|
||||
set(BOOST_LIBPATH ${BOOST}/lib)
|
||||
set(BOOST_POSTFIX "vc140-mt-s-1_60.lib")
|
||||
set(BOOST_DEBUG_POSTFIX "vc140-mt-sgd-1_60.lib")
|
||||
endif()
|
||||
set(BOOST_LIBRARIES
|
||||
optimized libboost_date_time-${BOOST_POSTFIX}
|
||||
optimized libboost_filesystem-${BOOST_POSTFIX}
|
||||
optimized libboost_regex-${BOOST_POSTFIX}
|
||||
optimized libboost_system-${BOOST_POSTFIX}
|
||||
optimized libboost_thread-${BOOST_POSTFIX}
|
||||
debug libboost_date_time-${BOOST_DEBUG_POSTFIX}
|
||||
debug libboost_filesystem-${BOOST_DEBUG_POSTFIX}
|
||||
debug libboost_regex-${BOOST_DEBUG_POSTFIX}
|
||||
debug libboost_system-${BOOST_DEBUG_POSTFIX}
|
||||
debug libboost_thread-${BOOST_DEBUG_POSTFIX}
|
||||
)
|
||||
if(WITH_CYCLES_OSL)
|
||||
set(BOOST_LIBRARIES ${BOOST_LIBRARIES}
|
||||
optimized libboost_wave-${BOOST_POSTFIX}
|
||||
debug libboost_wave-${BOOST_DEBUG_POSTFIX})
|
||||
endif()
|
||||
if(WITH_INTERNATIONAL)
|
||||
set(BOOST_LIBRARIES ${BOOST_LIBRARIES}
|
||||
optimized libboost_locale-${BOOST_POSTFIX}
|
||||
debug libboost_locale-${BOOST_DEBUG_POSTFIX})
|
||||
endif()
|
||||
else() # we found boost using find_package
|
||||
set(BOOST_INCLUDE_DIR ${Boost_INCLUDE_DIRS})
|
||||
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_INCLUDE_DIRS ${OPENIMAGEIO}/include)
|
||||
set(OIIO_OPTIMIZED optimized OpenImageIO optimized OpenImageIO_Util)
|
||||
set(OIIO_DEBUG debug OpenImageIO_d debug OpenImageIO_Util_d)
|
||||
set(OPENIMAGEIO_LIBRARIES ${OIIO_OPTIMIZED} ${OIIO_DEBUG})
|
||||
set(OPENIMAGEIO_LIBPATH ${OPENIMAGEIO}/lib)
|
||||
set(OPENIMAGEIO_DEFINITIONS "-DUSE_TBB=0")
|
||||
set(OPENCOLORIO_DEFINITIONS "-DOCIO_STATIC_BUILD")
|
||||
set(OPENIMAGEIO_IDIFF "${OPENIMAGEIO}/bin/idiff.exe")
|
||||
add_definitions(-DOIIO_STATIC_BUILD)
|
||||
endif()
|
||||
|
||||
if(WITH_LLVM)
|
||||
set(LLVM_ROOT_DIR ${LIBDIR}/llvm CACHE PATH "Path to the LLVM installation")
|
||||
file(GLOB LLVM_LIBRARY_OPTIMIZED ${LLVM_ROOT_DIR}/lib/*.lib)
|
||||
|
||||
if(EXISTS ${LLVM_ROOT_DIR}/debug/lib)
|
||||
foreach(LLVM_OPTIMIZED_LIB ${LLVM_LIBRARY_OPTIMIZED})
|
||||
get_filename_component(LIBNAME ${LLVM_OPTIMIZED_LIB} ABSOLUTE)
|
||||
list(APPEND LLVM_LIBS optimized ${LIBNAME})
|
||||
endforeach(LLVM_OPTIMIZED_LIB)
|
||||
|
||||
file(GLOB LLVM_LIBRARY_DEBUG ${LLVM_ROOT_DIR}/debug/lib/*.lib)
|
||||
|
||||
foreach(LLVM_DEBUG_LIB ${LLVM_LIBRARY_DEBUG})
|
||||
get_filename_component(LIBNAME ${LLVM_DEBUG_LIB} ABSOLUTE)
|
||||
list(APPEND LLVM_LIBS debug ${LIBNAME})
|
||||
endforeach(LLVM_DEBUG_LIB)
|
||||
|
||||
set(LLVM_LIBRARY ${LLVM_LIBS})
|
||||
else()
|
||||
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_LIBRARIES OpenColorIO)
|
||||
set(OPENCOLORIO_LIBPATH ${LIBDIR}/opencolorio/lib)
|
||||
set(OPENCOLORIO_DEFINITIONS)
|
||||
endif()
|
||||
|
||||
if(WITH_OPENVDB)
|
||||
set(BLOSC_LIBRARIES optimized ${LIBDIR}/blosc/lib/libblosc.lib debug ${LIBDIR}/blosc/lib/libblosc_d.lib)
|
||||
set(TBB_LIBRARIES optimized ${LIBDIR}/tbb/lib/tbb.lib debug ${LIBDIR}/tbb/lib/tbb_debug.lib)
|
||||
set(TBB_INCLUDE_DIR ${LIBDIR}/tbb/include)
|
||||
set(OPENVDB ${LIBDIR}/openvdb)
|
||||
set(OPENVDB_INCLUDE_DIRS ${OPENVDB}/include ${TBB_INCLUDE_DIR})
|
||||
set(OPENVDB_LIBRARIES optimized openvdb debug openvdb_d ${TBB_LIBRARIES} ${BLOSC_LIBRARIES})
|
||||
set(OPENVDB_LIBPATH ${LIBDIR}/openvdb/lib)
|
||||
endif()
|
||||
|
||||
if(WITH_ALEMBIC)
|
||||
set(ALEMBIC ${LIBDIR}/alembic)
|
||||
set(ALEMBIC_INCLUDE_DIR ${ALEMBIC}/include)
|
||||
set(ALEMBIC_INCLUDE_DIRS ${ALEMBIC_INCLUDE_DIR})
|
||||
set(ALEMBIC_LIBPATH ${ALEMBIC}/lib)
|
||||
set(ALEMBIC_LIBRARIES optimized alembic debug alembic_d)
|
||||
endif()
|
||||
|
||||
if(WITH_MOD_CLOTH_ELTOPO)
|
||||
set(LAPACK ${LIBDIR}/lapack)
|
||||
# set(LAPACK_INCLUDE_DIR ${LAPACK}/include)
|
||||
set(LAPACK_LIBPATH ${LAPACK}/lib)
|
||||
set(LAPACK_LIBRARIES
|
||||
${LIBDIR}/lapack/lib/libf2c.lib
|
||||
${LIBDIR}/lapack/lib/clapack_nowrap.lib
|
||||
${LIBDIR}/lapack/lib/BLAS_nowrap.lib
|
||||
)
|
||||
endif()
|
||||
|
||||
if(WITH_OPENSUBDIV)
|
||||
set(OPENSUBDIV_INCLUDE_DIR ${LIBDIR}/opensubdiv/include)
|
||||
set(OPENSUBDIV_LIBPATH ${LIBDIR}/opensubdiv/lib)
|
||||
set(OPENSUBDIV_LIBRARIES ${OPENSUBDIV_LIBPATH}/osdCPU.lib ${OPENSUBDIV_LIBPATH}/osdGPU.lib)
|
||||
find_package(OpenSubdiv)
|
||||
endif()
|
||||
|
||||
if(WITH_SDL)
|
||||
set(SDL ${LIBDIR}/sdl)
|
||||
set(SDL_INCLUDE_DIR ${SDL}/include)
|
||||
set(SDL_LIBPATH ${SDL}/lib)
|
||||
# MinGW TODO: Update MinGW to SDL2
|
||||
if(NOT CMAKE_COMPILER_IS_GNUCC)
|
||||
set(SDL_LIBRARY SDL2)
|
||||
else()
|
||||
set(SDL_LIBRARY SDL)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Audio IO
|
||||
if(WITH_SYSTEM_AUDASPACE)
|
||||
set(AUDASPACE_INCLUDE_DIRS ${LIBDIR}/audaspace/include/audaspace)
|
||||
set(AUDASPACE_LIBRARIES ${LIBDIR}/audaspace/lib/audaspace.lib)
|
||||
set(AUDASPACE_C_INCLUDE_DIRS ${LIBDIR}/audaspace/include/audaspace)
|
||||
set(AUDASPACE_C_LIBRARIES ${LIBDIR}/audaspace/lib/audaspace-c.lib)
|
||||
set(AUDASPACE_PY_INCLUDE_DIRS ${LIBDIR}/audaspace/include/audaspace)
|
||||
set(AUDASPACE_PY_LIBRARIES ${LIBDIR}/audaspace/lib/audaspace-py.lib)
|
||||
endif()
|
||||
|
||||
# used in many places so include globally, like OpenGL
|
||||
blender_include_dirs_sys("${PTHREADS_INCLUDE_DIRS}")
|
||||
|
||||
#find signtool
|
||||
SET(ProgramFilesX86_NAME "ProgramFiles(x86)") #env dislikes the ( )
|
||||
find_program(SIGNTOOL_EXE signtool
|
||||
HINTS
|
||||
"$ENV{${ProgramFilesX86_NAME}}/Windows Kits/10/bin/x86/"
|
||||
"$ENV{ProgramFiles}/Windows Kits/10/bin/x86/"
|
||||
"$ENV{${ProgramFilesX86_NAME}}/Windows Kits/8.1/bin/x86/"
|
||||
"$ENV{ProgramFiles}/Windows Kits/8.1/bin/x86/"
|
||||
"$ENV{${ProgramFilesX86_NAME}}/Windows Kits/8.0/bin/x86/"
|
||||
"$ENV{ProgramFiles}/Windows Kits/8.0/bin/x86/"
|
||||
)
|
||||
@@ -1014,6 +1014,9 @@ context_type_map = {
|
||||
"active_bone": ("EditBone", False),
|
||||
"active_gpencil_frame": ("GreasePencilLayer", True),
|
||||
"active_gpencil_layer": ("GPencilLayer", True),
|
||||
"active_gpencil_brush": ("GPencilSculptBrush", False),
|
||||
"active_gpencil_palette": ("GPencilPalette", True),
|
||||
"active_gpencil_palettecolor": ("GPencilPaletteColor", True),
|
||||
"active_node": ("Node", False),
|
||||
"active_object": ("Object", False),
|
||||
"active_operator": ("Operator", False),
|
||||
|
||||
@@ -151,8 +151,8 @@ static btScalar EdgeSeparation(const btBox2dShape* poly1, const btTransform& xf1
|
||||
int index = 0;
|
||||
btScalar minDot = BT_LARGE_FLOAT;
|
||||
|
||||
if( count2 > 0 )
|
||||
index = (int) normal1.minDot( vertices2, count2, minDot);
|
||||
if( count2 > 0 )
|
||||
index = (int) normal1.minDot( vertices2, count2, minDot);
|
||||
|
||||
btVector3 v1 = b2Mul(xf1, vertices1[edge1]);
|
||||
btVector3 v2 = b2Mul(xf2, vertices2[index]);
|
||||
@@ -174,9 +174,9 @@ static btScalar FindMaxSeparation(int* edgeIndex,
|
||||
|
||||
// Find edge normal on poly1 that has the largest projection onto d.
|
||||
int edge = 0;
|
||||
btScalar maxDot;
|
||||
if( count1 > 0 )
|
||||
edge = (int) dLocal1.maxDot( normals1, count1, maxDot);
|
||||
btScalar maxDot;
|
||||
if( count1 > 0 )
|
||||
edge = (int) dLocal1.maxDot( normals1, count1, maxDot);
|
||||
|
||||
// Get the separation for the edge normal.
|
||||
btScalar s = EdgeSeparation(poly1, xf1, edge, poly2, xf2);
|
||||
|
||||
@@ -232,8 +232,8 @@ void btCompoundCollisionAlgorithm::processCollision (const btCollisionObjectWrap
|
||||
m_compoundShapeRevision = compoundShape->getUpdateRevision();
|
||||
}
|
||||
|
||||
if (m_childCollisionAlgorithms.size()==0)
|
||||
return;
|
||||
if (m_childCollisionAlgorithms.size()==0)
|
||||
return;
|
||||
|
||||
const btDbvt* tree = compoundShape->getDynamicAabbTree();
|
||||
//use a dynamic aabb tree to cull potential child-overlaps
|
||||
|
||||
2
extern/clew/README.blender
vendored
2
extern/clew/README.blender
vendored
@@ -1,5 +1,5 @@
|
||||
Project: OpenCL Wrangler
|
||||
URL: https://github.com/OpenCLWrangler/clew
|
||||
License: Apache 2.0
|
||||
Upstream version: 277db43
|
||||
Upstream version: 309a653
|
||||
Local modifications: None
|
||||
|
||||
23
extern/clew/src/clew.c
vendored
23
extern/clew/src/clew.c
vendored
@@ -137,6 +137,17 @@ PFNCLCREATEFROMGLTEXTURE3D __clewCreateFromGLTexture3D = NULL;
|
||||
#endif
|
||||
PFNCLGETGLCONTEXTINFOKHR __clewGetGLContextInfoKHR = NULL;
|
||||
|
||||
static CLEW_DYNLIB_HANDLE dynamic_library_open_find(const char **paths) {
|
||||
int i = 0;
|
||||
while (paths[i] != NULL) {
|
||||
CLEW_DYNLIB_HANDLE lib = CLEW_DYNLIB_OPEN(paths[i]);
|
||||
if (lib != NULL) {
|
||||
return lib;
|
||||
}
|
||||
++i;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void clewExit(void)
|
||||
{
|
||||
@@ -151,11 +162,15 @@ static void clewExit(void)
|
||||
int clewInit()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
const char *path = "OpenCL.dll";
|
||||
const char *paths[] = {"OpenCL.dll", NULL};
|
||||
#elif defined(__APPLE__)
|
||||
const char *path = "/Library/Frameworks/OpenCL.framework/OpenCL";
|
||||
const char *paths[] = {"/Library/Frameworks/OpenCL.framework/OpenCL", NULL};
|
||||
#else
|
||||
const char *path = "libOpenCL.so";
|
||||
const char *paths[] = {"libOpenCL.so",
|
||||
"libOpenCL.so.0",
|
||||
"libOpenCL.so.1",
|
||||
"libOpenCL.so.2",
|
||||
NULL};
|
||||
#endif
|
||||
|
||||
int error = 0;
|
||||
@@ -167,7 +182,7 @@ int clewInit()
|
||||
}
|
||||
|
||||
// Load library
|
||||
module = CLEW_DYNLIB_OPEN(path);
|
||||
module = dynamic_library_open_find(paths);
|
||||
|
||||
// Check for errors
|
||||
if (module == NULL)
|
||||
|
||||
@@ -1048,7 +1048,6 @@ int curve_fit_cubic_to_points_refit_db(
|
||||
{
|
||||
const uint knots_len = points_len;
|
||||
struct Knot *knots = malloc(sizeof(Knot) * knots_len);
|
||||
knots[0].next = NULL;
|
||||
|
||||
#ifndef USE_CORNER_DETECT
|
||||
(void)r_corner_index_array;
|
||||
@@ -1085,7 +1084,6 @@ int curve_fit_cubic_to_points_refit_db(
|
||||
|
||||
knots[i].heap_node = NULL;
|
||||
knots[i].index = i;
|
||||
knots[i].index = i;
|
||||
knots[i].can_remove = true;
|
||||
knots[i].is_removed = false;
|
||||
knots[i].is_corner = false;
|
||||
@@ -1155,8 +1153,8 @@ int curve_fit_cubic_to_points_refit_db(
|
||||
add_vn_vnvn(k->tan[0], tan_prev, tan_next, dims);
|
||||
normalize_vn(k->tan[0], dims);
|
||||
copy_vnvn(k->tan[1], k->tan[0], dims);
|
||||
k->handles[0] = len_prev / 3;
|
||||
k->handles[1] = len_next / 3;
|
||||
k->handles[0] = len_prev / 3;
|
||||
k->handles[1] = len_next / -3;
|
||||
}
|
||||
#else
|
||||
if (knots_len < 2) {
|
||||
@@ -1185,8 +1183,8 @@ int curve_fit_cubic_to_points_refit_db(
|
||||
add_vn_vnvn(k->tan[0], tan_prev, tan_next, dims);
|
||||
normalize_vn(k->tan[0], dims);
|
||||
copy_vnvn(k->tan[1], k->tan[0], dims);
|
||||
k->handles[0] = len_prev / 3;
|
||||
k->handles[1] = len_next / 3;
|
||||
k->handles[0] = len_prev / 3;
|
||||
k->handles[1] = len_next / -3;
|
||||
|
||||
copy_vnvn(tan_prev, tan_next, dims);
|
||||
len_prev = len_next;
|
||||
@@ -1201,8 +1199,8 @@ int curve_fit_cubic_to_points_refit_db(
|
||||
tan_prev, &points[0 * dims], &points[1 * dims], dims);
|
||||
copy_vnvn(knots[0].tan[0], tan_prev, dims);
|
||||
copy_vnvn(knots[0].tan[1], tan_prev, dims);
|
||||
knots[0].handles[0] = len_prev / 3;
|
||||
knots[0].handles[1] = len_prev / 3;
|
||||
knots[0].handles[0] = len_prev / 3;
|
||||
knots[0].handles[1] = len_prev / -3;
|
||||
|
||||
for (uint i_curr = 1, i_next = 2; i_next < knots_len; i_curr = i_next++) {
|
||||
struct Knot *k = &knots[i_curr];
|
||||
@@ -1215,8 +1213,8 @@ int curve_fit_cubic_to_points_refit_db(
|
||||
add_vn_vnvn(k->tan[0], tan_prev, tan_next, dims);
|
||||
normalize_vn(k->tan[0], dims);
|
||||
copy_vnvn(k->tan[1], k->tan[0], dims);
|
||||
k->handles[0] = len_prev / 3;
|
||||
k->handles[1] = len_next / 3;
|
||||
k->handles[0] = len_prev / 3;
|
||||
k->handles[1] = len_next / -3;
|
||||
|
||||
copy_vnvn(tan_prev, tan_next, dims);
|
||||
len_prev = len_next;
|
||||
@@ -1224,8 +1222,8 @@ int curve_fit_cubic_to_points_refit_db(
|
||||
copy_vnvn(knots[knots_len - 1].tan[0], tan_next, dims);
|
||||
copy_vnvn(knots[knots_len - 1].tan[1], tan_next, dims);
|
||||
|
||||
knots[knots_len - 1].handles[0] = len_next / 3;
|
||||
knots[knots_len - 1].handles[1] = len_next / 3;
|
||||
knots[knots_len - 1].handles[0] = len_next / 3;
|
||||
knots[knots_len - 1].handles[1] = len_next / -3;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -62,7 +62,7 @@ struct XMLReadState : public XMLReader {
|
||||
: scene(NULL),
|
||||
smooth(false),
|
||||
shader(NULL),
|
||||
dicing_rate(0.0f)
|
||||
dicing_rate(1.0f)
|
||||
{
|
||||
tfm = transform_identity();
|
||||
}
|
||||
@@ -197,6 +197,9 @@ static void xml_read_camera(XMLReadState& state, pugi::xml_node node)
|
||||
xml_read_int(&cam->width, node, "width");
|
||||
xml_read_int(&cam->height, node, "height");
|
||||
|
||||
cam->full_width = cam->width;
|
||||
cam->full_height = cam->height;
|
||||
|
||||
xml_read_node(state, cam, node);
|
||||
|
||||
cam->matrix = state.tfm;
|
||||
@@ -412,53 +415,14 @@ static void xml_read_mesh(const XMLReadState& state, pugi::xml_node node)
|
||||
xml_read_int_array(verts, node, "verts");
|
||||
xml_read_int_array(nverts, node, "nverts");
|
||||
|
||||
#if 0
|
||||
if(xml_equal_string(node, "subdivision", "catmull-clark")) {
|
||||
/* create subd mesh */
|
||||
SubdMesh sdmesh;
|
||||
|
||||
/* create subd vertices */
|
||||
for(size_t i = 0; i < P.size(); i++)
|
||||
sdmesh.add_vert(P[i]);
|
||||
|
||||
/* create subd faces */
|
||||
int index_offset = 0;
|
||||
|
||||
for(size_t i = 0; i < nverts.size(); i++) {
|
||||
if(nverts[i] == 4) {
|
||||
int v0 = verts[index_offset + 0];
|
||||
int v1 = verts[index_offset + 1];
|
||||
int v2 = verts[index_offset + 2];
|
||||
int v3 = verts[index_offset + 3];
|
||||
|
||||
sdmesh.add_face(v0, v1, v2, v3);
|
||||
}
|
||||
else {
|
||||
for(int j = 0; j < nverts[i]-2; j++) {
|
||||
int v0 = verts[index_offset];
|
||||
int v1 = verts[index_offset + j + 1];
|
||||
int v2 = verts[index_offset + j + 2];
|
||||
|
||||
sdmesh.add_face(v0, v1, v2);
|
||||
}
|
||||
}
|
||||
|
||||
index_offset += nverts[i];
|
||||
}
|
||||
|
||||
/* finalize subd mesh */
|
||||
sdmesh.finish();
|
||||
|
||||
/* parameters */
|
||||
SubdParams sdparams(mesh, shader, smooth);
|
||||
xml_read_float(&sdparams.dicing_rate, node, "dicing_rate");
|
||||
|
||||
DiagSplit dsplit(sdparams);
|
||||
sdmesh.tessellate(&dsplit);
|
||||
mesh->subdivision_type = Mesh::SUBDIVISION_CATMULL_CLARK;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
else if(xml_equal_string(node, "subdivision", "linear")) {
|
||||
mesh->subdivision_type = Mesh::SUBDIVISION_LINEAR;
|
||||
}
|
||||
|
||||
if(mesh->subdivision_type == Mesh::SUBDIVISION_NONE) {
|
||||
/* create vertices */
|
||||
mesh->verts = P;
|
||||
|
||||
@@ -513,72 +477,65 @@ static void xml_read_mesh(const XMLReadState& state, pugi::xml_node node)
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* create vertices */
|
||||
mesh->verts = P;
|
||||
|
||||
size_t num_ngons = 0;
|
||||
size_t num_corners = 0;
|
||||
for(size_t i = 0; i < nverts.size(); i++) {
|
||||
num_ngons += (nverts[i] == 4) ? 0 : 1;
|
||||
num_corners += nverts[i];
|
||||
}
|
||||
mesh->reserve_subd_faces(nverts.size(), num_ngons, num_corners);
|
||||
|
||||
/* create subd_faces */
|
||||
int index_offset = 0;
|
||||
|
||||
for(size_t i = 0; i < nverts.size(); i++) {
|
||||
mesh->add_subd_face(&verts[index_offset], nverts[i], shader, smooth);
|
||||
index_offset += nverts[i];
|
||||
}
|
||||
|
||||
/* uv map */
|
||||
if(xml_read_float_array(UV, node, "UV")) {
|
||||
ustring name = ustring("UVMap");
|
||||
Attribute *attr = mesh->subd_attributes.add(ATTR_STD_UV, name);
|
||||
float3 *fdata = attr->data_float3();
|
||||
|
||||
#if 0
|
||||
if(subdivide_uvs) {
|
||||
attr->flags |= ATTR_SUBDIVIDED;
|
||||
}
|
||||
#endif
|
||||
|
||||
index_offset = 0;
|
||||
for(size_t i = 0; i < nverts.size(); i++) {
|
||||
for(int j = 0; j < nverts[i]; j++) {
|
||||
*(fdata++) = make_float3(UV[index_offset++]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* setup subd params */
|
||||
if(!mesh->subd_params) {
|
||||
mesh->subd_params = new SubdParams(mesh);
|
||||
}
|
||||
SubdParams& sdparams = *mesh->subd_params;
|
||||
|
||||
sdparams.dicing_rate = state.dicing_rate;
|
||||
xml_read_float(&sdparams.dicing_rate, node, "dicing_rate");
|
||||
sdparams.dicing_rate = std::max(0.1f, sdparams.dicing_rate);
|
||||
|
||||
state.scene->camera->update();
|
||||
sdparams.camera = state.scene->camera;
|
||||
sdparams.objecttoworld = state.tfm;
|
||||
}
|
||||
|
||||
/* temporary for test compatibility */
|
||||
mesh->attributes.remove(ATTR_STD_VERTEX_NORMAL);
|
||||
}
|
||||
|
||||
/* Patch */
|
||||
|
||||
static void xml_read_patch(const XMLReadState& state, pugi::xml_node node)
|
||||
{
|
||||
/* read patch */
|
||||
Patch *patch = NULL;
|
||||
|
||||
vector<float3> P;
|
||||
xml_read_float3_array(P, node, "P");
|
||||
|
||||
if(xml_equal_string(node, "type", "bilinear")) {
|
||||
/* bilinear patch */
|
||||
if(P.size() == 4) {
|
||||
LinearQuadPatch *bpatch = new LinearQuadPatch();
|
||||
|
||||
for(int i = 0; i < 4; i++)
|
||||
P[i] = transform_point(&state.tfm, P[i]);
|
||||
memcpy(bpatch->hull, &P[0], sizeof(bpatch->hull));
|
||||
|
||||
patch = bpatch;
|
||||
}
|
||||
else
|
||||
fprintf(stderr, "Invalid number of control points for bilinear patch.\n");
|
||||
}
|
||||
else if(xml_equal_string(node, "type", "bicubic")) {
|
||||
/* bicubic patch */
|
||||
if(P.size() == 16) {
|
||||
BicubicPatch *bpatch = new BicubicPatch();
|
||||
|
||||
for(int i = 0; i < 16; i++)
|
||||
P[i] = transform_point(&state.tfm, P[i]);
|
||||
memcpy(bpatch->hull, &P[0], sizeof(bpatch->hull));
|
||||
|
||||
patch = bpatch;
|
||||
}
|
||||
else
|
||||
fprintf(stderr, "Invalid number of control points for bicubic patch.\n");
|
||||
}
|
||||
else
|
||||
fprintf(stderr, "Unknown patch type.\n");
|
||||
|
||||
if(patch) {
|
||||
/* add mesh */
|
||||
Mesh *mesh = xml_add_mesh(state.scene, transform_identity());
|
||||
|
||||
mesh->used_shaders.push_back(state.shader);
|
||||
|
||||
/* split */
|
||||
SubdParams sdparams(mesh);
|
||||
xml_read_float(&sdparams.dicing_rate, node, "dicing_rate");
|
||||
|
||||
DiagSplit dsplit(sdparams);
|
||||
dsplit.split_quad(patch);
|
||||
|
||||
delete patch;
|
||||
|
||||
/* temporary for test compatibility */
|
||||
mesh->attributes.remove(ATTR_STD_VERTEX_NORMAL);
|
||||
}
|
||||
}
|
||||
|
||||
/* Light */
|
||||
|
||||
static void xml_read_light(XMLReadState& state, pugi::xml_node node)
|
||||
@@ -676,9 +633,6 @@ static void xml_read_scene(XMLReadState& state, pugi::xml_node scene_node)
|
||||
else if(string_iequals(node.name(), "mesh")) {
|
||||
xml_read_mesh(state, node);
|
||||
}
|
||||
else if(string_iequals(node.name(), "patch")) {
|
||||
xml_read_patch(state, node);
|
||||
}
|
||||
else if(string_iequals(node.name(), "light")) {
|
||||
xml_read_light(state, node);
|
||||
}
|
||||
@@ -739,7 +693,7 @@ void xml_read_file(Scene *scene, const char *filepath)
|
||||
state.tfm = transform_identity();
|
||||
state.shader = scene->default_surface;
|
||||
state.smooth = false;
|
||||
state.dicing_rate = 0.1f;
|
||||
state.dicing_rate = 1.0f;
|
||||
state.base = path_dirname(filepath);
|
||||
|
||||
xml_read_include(state, path_filename(filepath));
|
||||
|
||||
@@ -369,12 +369,14 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
|
||||
description="Size of a micropolygon in pixels",
|
||||
min=0.1, max=1000.0,
|
||||
default=1.0,
|
||||
subtype="PIXEL"
|
||||
)
|
||||
cls.preview_dicing_rate = FloatProperty(
|
||||
name="Preview Dicing Rate",
|
||||
description="Size of a micropolygon in pixels during preview render",
|
||||
min=0.1, max=1000.0,
|
||||
default=8.0,
|
||||
subtype="PIXEL"
|
||||
)
|
||||
|
||||
cls.max_subdivisions = IntProperty(
|
||||
@@ -1007,8 +1009,8 @@ class CyclesObjectSettings(bpy.types.PropertyGroup):
|
||||
)
|
||||
|
||||
cls.dicing_rate = FloatProperty(
|
||||
name="Dicing Rate",
|
||||
description="Multiplier for scene dicing rate",
|
||||
name="Dicing Scale",
|
||||
description="Multiplier for scene dicing rate (located in the Geometry Panel)",
|
||||
min=0.1, max=1000.0,
|
||||
default=1.0,
|
||||
)
|
||||
|
||||
@@ -36,6 +36,8 @@ bool BlenderSync::sync_dupli_particle(BL::Object& b_ob,
|
||||
if(!b_psys)
|
||||
return false;
|
||||
|
||||
object->hide_on_missing_motion = true;
|
||||
|
||||
/* test if we need particle data */
|
||||
if(!object->mesh->need_attribute(scene, ATTR_STD_PARTICLE))
|
||||
return false;
|
||||
|
||||
@@ -698,7 +698,7 @@ protected:
|
||||
|
||||
/* Object Key */
|
||||
|
||||
enum { OBJECT_PERSISTENT_ID_SIZE = 8 };
|
||||
enum { OBJECT_PERSISTENT_ID_SIZE = 16 };
|
||||
|
||||
struct ObjectKey {
|
||||
void *parent;
|
||||
|
||||
@@ -713,14 +713,14 @@ BVHNode* BVHBuild::create_leaf_node(const BVHRange& range,
|
||||
* can not control.
|
||||
*/
|
||||
typedef StackAllocator<256, int> LeafStackAllocator;
|
||||
typedef StackAllocator<256, BVHReference> LeafReferenceStackAllocator;
|
||||
|
||||
vector<int, LeafStackAllocator> p_type[PRIMITIVE_NUM_TOTAL];
|
||||
vector<int, LeafStackAllocator> p_index[PRIMITIVE_NUM_TOTAL];
|
||||
vector<int, LeafStackAllocator> p_object[PRIMITIVE_NUM_TOTAL];
|
||||
vector<BVHReference, LeafStackAllocator> p_ref[PRIMITIVE_NUM_TOTAL];
|
||||
vector<BVHReference, LeafReferenceStackAllocator> p_ref[PRIMITIVE_NUM_TOTAL];
|
||||
|
||||
/* TODO(sergey): In theory we should be able to store references. */
|
||||
typedef StackAllocator<256, BVHReference> LeafReferenceStackAllocator;
|
||||
vector<BVHReference, LeafReferenceStackAllocator> object_references;
|
||||
|
||||
uint visibility[PRIMITIVE_NUM_TOTAL] = {0};
|
||||
|
||||
@@ -117,6 +117,7 @@ set(SRC_SVM_HEADERS
|
||||
svm/svm.h
|
||||
svm/svm_attribute.h
|
||||
svm/svm_blackbody.h
|
||||
svm/svm_bump.h
|
||||
svm/svm_camera.h
|
||||
svm/svm_closure.h
|
||||
svm/svm_convert.h
|
||||
|
||||
@@ -236,6 +236,14 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
|
||||
/* If node is leaf, fetch triangle list. */
|
||||
if(node_addr < 0) {
|
||||
float4 leaf = kernel_tex_fetch(__bvh_leaf_nodes, (-node_addr-1));
|
||||
|
||||
if((__float_as_uint(leaf.z) & visibility) == 0) {
|
||||
/* Pop. */
|
||||
node_addr = traversal_stack[stack_ptr].addr;
|
||||
--stack_ptr;
|
||||
continue;
|
||||
}
|
||||
|
||||
int prim_addr = __float_as_int(leaf.x);
|
||||
|
||||
#if BVH_FEATURE(BVH_INSTANCING)
|
||||
|
||||
@@ -240,6 +240,14 @@ ccl_device uint BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
|
||||
/* If node is leaf, fetch triangle list. */
|
||||
if(node_addr < 0) {
|
||||
float4 leaf = kernel_tex_fetch(__bvh_leaf_nodes, (-node_addr-1));
|
||||
|
||||
if((__float_as_uint(leaf.z) & visibility) == 0) {
|
||||
/* Pop. */
|
||||
node_addr = traversal_stack[stack_ptr].addr;
|
||||
--stack_ptr;
|
||||
continue;
|
||||
}
|
||||
|
||||
int prim_addr = __float_as_int(leaf.x);
|
||||
|
||||
#if BVH_FEATURE(BVH_INSTANCING)
|
||||
|
||||
@@ -73,7 +73,11 @@ ccl_device_inline AttributeDescriptor find_attribute(KernelGlobals *kg, const Sh
|
||||
AttributeDescriptor desc;
|
||||
desc.element = (AttributeElement)attr_map.y;
|
||||
|
||||
if(ccl_fetch(sd, prim) == PRIM_NONE && desc.element != ATTR_ELEMENT_MESH) {
|
||||
if(ccl_fetch(sd, prim) == PRIM_NONE &&
|
||||
desc.element != ATTR_ELEMENT_MESH &&
|
||||
desc.element != ATTR_ELEMENT_VOXEL &&
|
||||
desc.element != ATTR_ELEMENT_OBJECT)
|
||||
{
|
||||
return attribute_not_found();
|
||||
}
|
||||
|
||||
|
||||
@@ -112,7 +112,7 @@ ccl_device_noinline void kernel_branched_path_surface_indirect_light(KernelGloba
|
||||
}
|
||||
|
||||
kernel_path_indirect(kg,
|
||||
indirect_sd,
|
||||
indirect_sd,
|
||||
emission_sd,
|
||||
rng,
|
||||
&bsdf_ray,
|
||||
@@ -224,7 +224,7 @@ ccl_device void kernel_branched_path_subsurface_scatter(KernelGlobals *kg,
|
||||
kg,
|
||||
rng,
|
||||
&bssrdf_sd,
|
||||
indirect_sd,
|
||||
indirect_sd,
|
||||
emission_sd,
|
||||
throughput,
|
||||
num_samples_inv,
|
||||
|
||||
@@ -45,9 +45,9 @@ ccl_device_inline void path_state_init(KernelGlobals *kg,
|
||||
state->volume_bounce = 0;
|
||||
|
||||
if(kernel_data.integrator.use_volumes) {
|
||||
/* initialize volume stack with volume we are inside of */
|
||||
kernel_volume_stack_init(kg, stack_sd, ray, state->volume_stack);
|
||||
/* seed RNG for cases where we can't use stratified samples */
|
||||
/* Initialize volume stack with volume we are inside of. */
|
||||
kernel_volume_stack_init(kg, stack_sd, state, ray, state->volume_stack);
|
||||
/* Seed RNG for cases where we can't use stratified samples .*/
|
||||
state->rng_congruential = lcg_init(*rng + sample*0x51633e2d);
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -132,7 +132,13 @@ ccl_device_inline float path_rng_1D(KernelGlobals *kg, ccl_addr_space RNG *rng,
|
||||
#endif
|
||||
}
|
||||
|
||||
ccl_device_inline void path_rng_2D(KernelGlobals *kg, ccl_addr_space RNG *rng, int sample, int num_samples, int dimension, float *fx, float *fy)
|
||||
/* Temporary workaround for Pascal cards, otherwise AA does not work properly. */
|
||||
#if defined(__KERNEL_GPU__) && __CUDA_ARCH__ >= 600
|
||||
__device__ __forceinline__
|
||||
#else
|
||||
ccl_device_inline
|
||||
#endif
|
||||
void path_rng_2D(KernelGlobals *kg, ccl_addr_space RNG *rng, int sample, int num_samples, int dimension, float *fx, float *fy)
|
||||
{
|
||||
#ifdef __CMJ__
|
||||
if(kernel_data.integrator.sampling_pattern == SAMPLING_PATTERN_CMJ) {
|
||||
|
||||
@@ -113,16 +113,7 @@ CCL_NAMESPACE_BEGIN
|
||||
# ifdef __KERNEL_OPENCL_AMD__
|
||||
# define __CL_USE_NATIVE__
|
||||
# define __KERNEL_SHADING__
|
||||
# define __MULTI_CLOSURE__
|
||||
# define __PASSES__
|
||||
# define __BACKGROUND_MIS__
|
||||
# define __LAMP_MIS__
|
||||
# define __AO__
|
||||
# define __CAMERA_MOTION__
|
||||
# define __OBJECT_MOTION__
|
||||
# define __HAIR__
|
||||
# define __BAKING__
|
||||
# define __TRANSPARENT_SHADOWS__
|
||||
# define __KERNEL_ADV_SHADING__
|
||||
# endif /* __KERNEL_OPENCL_AMD__ */
|
||||
|
||||
# ifdef __KERNEL_OPENCL_INTEL_CPU__
|
||||
@@ -723,20 +714,21 @@ enum ShaderDataFlag {
|
||||
SD_VOLUME_MIS = (1 << 19), /* use multiple importance sampling */
|
||||
SD_VOLUME_CUBIC = (1 << 20), /* use cubic interpolation for voxels */
|
||||
SD_HAS_BUMP = (1 << 21), /* has data connected to the displacement input */
|
||||
SD_HAS_DISPLACEMENT = (1 << 22), /* has true displacement */
|
||||
|
||||
SD_SHADER_FLAGS = (SD_USE_MIS|SD_HAS_TRANSPARENT_SHADOW|SD_HAS_VOLUME|
|
||||
SD_HAS_ONLY_VOLUME|SD_HETEROGENEOUS_VOLUME|
|
||||
SD_HAS_BSSRDF_BUMP|SD_VOLUME_EQUIANGULAR|SD_VOLUME_MIS|
|
||||
SD_VOLUME_CUBIC|SD_HAS_BUMP),
|
||||
SD_VOLUME_CUBIC|SD_HAS_BUMP|SD_HAS_DISPLACEMENT),
|
||||
|
||||
/* object flags */
|
||||
SD_HOLDOUT_MASK = (1 << 22), /* holdout for camera rays */
|
||||
SD_OBJECT_MOTION = (1 << 23), /* has object motion blur */
|
||||
SD_TRANSFORM_APPLIED = (1 << 24), /* vertices have transform applied */
|
||||
SD_NEGATIVE_SCALE_APPLIED = (1 << 25), /* vertices have negative scale applied */
|
||||
SD_OBJECT_HAS_VOLUME = (1 << 26), /* object has a volume shader */
|
||||
SD_OBJECT_INTERSECTS_VOLUME = (1 << 27), /* object intersects AABB of an object with volume shader */
|
||||
SD_OBJECT_HAS_VERTEX_MOTION = (1 << 28), /* has position for motion vertices */
|
||||
SD_HOLDOUT_MASK = (1 << 23), /* holdout for camera rays */
|
||||
SD_OBJECT_MOTION = (1 << 24), /* has object motion blur */
|
||||
SD_TRANSFORM_APPLIED = (1 << 25), /* vertices have transform applied */
|
||||
SD_NEGATIVE_SCALE_APPLIED = (1 << 26), /* vertices have negative scale applied */
|
||||
SD_OBJECT_HAS_VOLUME = (1 << 27), /* object has a volume shader */
|
||||
SD_OBJECT_INTERSECTS_VOLUME = (1 << 28), /* object intersects AABB of an object with volume shader */
|
||||
SD_OBJECT_HAS_VERTEX_MOTION = (1 << 29), /* has position for motion vertices */
|
||||
|
||||
SD_OBJECT_FLAGS = (SD_HOLDOUT_MASK|SD_OBJECT_MOTION|SD_TRANSFORM_APPLIED|
|
||||
SD_NEGATIVE_SCALE_APPLIED|SD_OBJECT_HAS_VOLUME|
|
||||
@@ -745,7 +737,7 @@ enum ShaderDataFlag {
|
||||
|
||||
#ifdef __SPLIT_KERNEL__
|
||||
# define SD_THREAD (get_global_id(1) * get_global_size(0) + get_global_id(0))
|
||||
# if defined(__SPLIT_KERNEL_AOS__)
|
||||
# if !defined(__SPLIT_KERNEL_SOA__)
|
||||
/* ShaderData is stored as an Array-of-Structures */
|
||||
# define ccl_soa_member(type, name) type soa_##name
|
||||
# define ccl_fetch(s, t) (s[SD_THREAD].soa_##t)
|
||||
|
||||
@@ -1010,7 +1010,8 @@ ccl_device bool kernel_volume_use_decoupled(KernelGlobals *kg, bool heterogeneou
|
||||
|
||||
ccl_device void kernel_volume_stack_init(KernelGlobals *kg,
|
||||
ShaderData *stack_sd,
|
||||
Ray *ray,
|
||||
const PathState *state,
|
||||
const Ray *ray,
|
||||
VolumeStack *stack)
|
||||
{
|
||||
/* NULL ray happens in the baker, does it need proper initialization of
|
||||
@@ -1031,9 +1032,12 @@ ccl_device void kernel_volume_stack_init(KernelGlobals *kg,
|
||||
return;
|
||||
}
|
||||
|
||||
kernel_assert(state->flag & PATH_RAY_CAMERA);
|
||||
|
||||
Ray volume_ray = *ray;
|
||||
volume_ray.t = FLT_MAX;
|
||||
|
||||
const uint visibility = (state->flag & PATH_RAY_ALL_VISIBILITY);
|
||||
int stack_index = 0, enclosed_index = 0;
|
||||
|
||||
#ifdef __VOLUME_RECORD_ALL__
|
||||
@@ -1042,7 +1046,7 @@ ccl_device void kernel_volume_stack_init(KernelGlobals *kg,
|
||||
&volume_ray,
|
||||
hits,
|
||||
2*VOLUME_STACK_SIZE,
|
||||
PATH_RAY_ALL_VISIBILITY);
|
||||
visibility);
|
||||
if(num_hits > 0) {
|
||||
int enclosed_volumes[VOLUME_STACK_SIZE];
|
||||
Intersection *isect = hits;
|
||||
@@ -1091,7 +1095,7 @@ ccl_device void kernel_volume_stack_init(KernelGlobals *kg,
|
||||
step < 2 * VOLUME_STACK_SIZE)
|
||||
{
|
||||
Intersection isect;
|
||||
if(!scene_intersect_volume(kg, &volume_ray, &isect, PATH_RAY_ALL_VISIBILITY)) {
|
||||
if(!scene_intersect_volume(kg, &volume_ray, &isect, visibility)) {
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -54,6 +54,7 @@ struct OSLGlobals {
|
||||
vector<OSL::ShaderGroupRef> surface_state;
|
||||
vector<OSL::ShaderGroupRef> volume_state;
|
||||
vector<OSL::ShaderGroupRef> displacement_state;
|
||||
vector<OSL::ShaderGroupRef> bump_state;
|
||||
OSL::ShaderGroupRef background_state;
|
||||
|
||||
/* attributes */
|
||||
|
||||
@@ -93,6 +93,7 @@ ustring OSLRenderServices::u_geom_numpolyvertices("geom:numpolyvertices");
|
||||
ustring OSLRenderServices::u_geom_trianglevertices("geom:trianglevertices");
|
||||
ustring OSLRenderServices::u_geom_polyvertices("geom:polyvertices");
|
||||
ustring OSLRenderServices::u_geom_name("geom:name");
|
||||
ustring OSLRenderServices::u_geom_undisplaced("geom:undisplaced");
|
||||
ustring OSLRenderServices::u_is_smooth("geom:is_smooth");
|
||||
#ifdef __HAIR__
|
||||
ustring OSLRenderServices::u_is_curve("geom:is_curve");
|
||||
@@ -127,8 +128,10 @@ OSLRenderServices::OSLRenderServices()
|
||||
|
||||
OSLRenderServices::~OSLRenderServices()
|
||||
{
|
||||
VLOG(2) << "OSL texture system stats:\n"
|
||||
<< osl_ts->getstats();
|
||||
if(osl_ts) {
|
||||
VLOG(2) << "OSL texture system stats:\n"
|
||||
<< osl_ts->getstats();
|
||||
}
|
||||
#ifdef WITH_PTEX
|
||||
ptex_cache->release();
|
||||
#endif
|
||||
|
||||
@@ -158,6 +158,7 @@ public:
|
||||
static ustring u_geom_trianglevertices;
|
||||
static ustring u_geom_polyvertices;
|
||||
static ustring u_geom_name;
|
||||
static ustring u_geom_undisplaced;
|
||||
static ustring u_is_smooth;
|
||||
static ustring u_is_curve;
|
||||
static ustring u_curve_thickness;
|
||||
|
||||
@@ -190,6 +190,48 @@ void OSLShader::eval_surface(KernelGlobals *kg, ShaderData *sd, PathState *state
|
||||
OSL::ShadingContext *octx = tdata->context[(int)ctx];
|
||||
int shader = sd->shader & SHADER_MASK;
|
||||
|
||||
/* automatic bump shader */
|
||||
if(kg->osl->bump_state[shader]) {
|
||||
/* save state */
|
||||
float3 P = sd->P;
|
||||
float3 dPdx = sd->dP.dx;
|
||||
float3 dPdy = sd->dP.dy;
|
||||
|
||||
/* set state as if undisplaced */
|
||||
if(sd->flag & SD_HAS_DISPLACEMENT) {
|
||||
float data[9];
|
||||
bool found = kg->osl->services->get_attribute(sd, true, OSLRenderServices::u_empty, TypeDesc::TypeVector,
|
||||
OSLRenderServices::u_geom_undisplaced, data);
|
||||
(void)found;
|
||||
assert(found);
|
||||
|
||||
memcpy(&sd->P, data, sizeof(float)*3);
|
||||
memcpy(&sd->dP.dx, data+3, sizeof(float)*3);
|
||||
memcpy(&sd->dP.dy, data+6, sizeof(float)*3);
|
||||
|
||||
object_position_transform(kg, sd, &sd->P);
|
||||
object_dir_transform(kg, sd, &sd->dP.dx);
|
||||
object_dir_transform(kg, sd, &sd->dP.dy);
|
||||
|
||||
globals->P = TO_VEC3(sd->P);
|
||||
globals->dPdx = TO_VEC3(sd->dP.dx);
|
||||
globals->dPdy = TO_VEC3(sd->dP.dy);
|
||||
}
|
||||
|
||||
/* execute bump shader */
|
||||
ss->execute(octx, *(kg->osl->bump_state[shader]), *globals);
|
||||
|
||||
/* reset state */
|
||||
sd->P = P;
|
||||
sd->dP.dx = dPdx;
|
||||
sd->dP.dy = dPdy;
|
||||
|
||||
globals->P = TO_VEC3(P);
|
||||
globals->dPdx = TO_VEC3(dPdx);
|
||||
globals->dPdy = TO_VEC3(dPdy);
|
||||
}
|
||||
|
||||
/* surface shader */
|
||||
if(kg->osl->surface_state[shader]) {
|
||||
ss->execute(octx, *(kg->osl->surface_state[shader]), *globals);
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@ shader node_normal_map(
|
||||
output normal Normal = NormalIn)
|
||||
{
|
||||
color mcolor = 2.0 * color(Color[0] - 0.5, Color[1] - 0.5, Color[2] - 0.5);
|
||||
int is_backfacing = backfacing();
|
||||
|
||||
if (space == "tangent") {
|
||||
vector tangent;
|
||||
@@ -34,9 +35,15 @@ shader node_normal_map(
|
||||
float is_smooth;
|
||||
|
||||
getattribute("geom:is_smooth", is_smooth);
|
||||
if (!is_smooth)
|
||||
if (!is_smooth) {
|
||||
ninterp = normalize(transform("world", "object", Ng));
|
||||
|
||||
/* the normal is already inverted, which is too soon for the math here */
|
||||
if (is_backfacing) {
|
||||
ninterp = -ninterp;
|
||||
}
|
||||
}
|
||||
|
||||
// get _unnormalized_ interpolated normal and tangent
|
||||
if (getattribute(attr_name, tangent) &&
|
||||
getattribute(attr_sign_name, tangent_sign) &&
|
||||
@@ -73,7 +80,12 @@ shader node_normal_map(
|
||||
|
||||
Normal = normalize(vector(mcolor));
|
||||
}
|
||||
|
||||
|
||||
/* invert normal for backfacing polygons */
|
||||
if (is_backfacing) {
|
||||
Normal = -Normal;
|
||||
}
|
||||
|
||||
if (Strength != 1.0)
|
||||
Normal = normalize(NormalIn + (Normal - NormalIn) * max(Strength, 0.0));
|
||||
}
|
||||
|
||||
@@ -181,6 +181,7 @@ CCL_NAMESPACE_END
|
||||
#include "svm_brick.h"
|
||||
#include "svm_vector_transform.h"
|
||||
#include "svm_voxel.h"
|
||||
#include "svm_bump.h"
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
@@ -294,6 +295,12 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ccl_a
|
||||
case NODE_CLOSURE_SET_NORMAL:
|
||||
svm_node_set_normal(kg, sd, stack, node.y, node.z);
|
||||
break;
|
||||
case NODE_ENTER_BUMP_EVAL:
|
||||
svm_node_enter_bump_eval(kg, sd, stack, node.y);
|
||||
break;
|
||||
case NODE_LEAVE_BUMP_EVAL:
|
||||
svm_node_leave_bump_eval(kg, sd, stack, node.y);
|
||||
break;
|
||||
# endif /* NODES_FEATURE(NODE_FEATURE_BUMP) */
|
||||
case NODE_HSV:
|
||||
svm_node_hsv(kg, sd, stack, node, &offset);
|
||||
|
||||
@@ -30,14 +30,14 @@ ccl_device AttributeDescriptor svm_node_attr_init(KernelGlobals *kg, ShaderData
|
||||
if(ccl_fetch(sd, object) != OBJECT_NONE) {
|
||||
desc = find_attribute(kg, sd, node.y);
|
||||
if(desc.offset == ATTR_STD_NOT_FOUND) {
|
||||
desc.element = ATTR_ELEMENT_NONE;
|
||||
desc = attribute_not_found();
|
||||
desc.offset = 0;
|
||||
desc.type = (NodeAttributeType)node.w;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* background */
|
||||
desc.element = ATTR_ELEMENT_NONE;
|
||||
desc = attribute_not_found();
|
||||
desc.offset = 0;
|
||||
desc.type = (NodeAttributeType)node.w;
|
||||
}
|
||||
|
||||
54
intern/cycles/kernel/svm/svm_bump.h
Normal file
54
intern/cycles/kernel/svm/svm_bump.h
Normal file
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Copyright 2011-2016 Blender Foundation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
/* Bump Eval Nodes */
|
||||
|
||||
ccl_device void svm_node_enter_bump_eval(KernelGlobals *kg, ShaderData *sd, float *stack, uint offset)
|
||||
{
|
||||
/* save state */
|
||||
stack_store_float3(stack, offset+0, ccl_fetch(sd, P));
|
||||
stack_store_float3(stack, offset+3, ccl_fetch(sd, dP).dx);
|
||||
stack_store_float3(stack, offset+6, ccl_fetch(sd, dP).dy);
|
||||
|
||||
/* set state as if undisplaced */
|
||||
const AttributeDescriptor desc = find_attribute(kg, sd, ATTR_STD_POSITION_UNDISPLACED);
|
||||
|
||||
if(desc.offset != ATTR_STD_NOT_FOUND) {
|
||||
float3 P, dPdx, dPdy;
|
||||
P = primitive_attribute_float3(kg, sd, desc, &dPdx, &dPdy);
|
||||
|
||||
object_position_transform(kg, sd, &P);
|
||||
object_dir_transform(kg, sd, &dPdx);
|
||||
object_dir_transform(kg, sd, &dPdy);
|
||||
|
||||
ccl_fetch(sd, P) = P;
|
||||
ccl_fetch(sd, dP).dx = dPdx;
|
||||
ccl_fetch(sd, dP).dy = dPdy;
|
||||
}
|
||||
}
|
||||
|
||||
ccl_device void svm_node_leave_bump_eval(KernelGlobals *kg, ShaderData *sd, float *stack, uint offset)
|
||||
{
|
||||
/* restore state */
|
||||
ccl_fetch(sd, P) = stack_load_float3(stack, offset+0);
|
||||
ccl_fetch(sd, dP).dx = stack_load_float3(stack, offset+3);
|
||||
ccl_fetch(sd, dP).dy = stack_load_float3(stack, offset+6);
|
||||
}
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
||||
@@ -277,6 +277,7 @@ ccl_device void svm_node_normal_map(KernelGlobals *kg, ShaderData *sd, float *st
|
||||
float3 color = stack_load_float3(stack, color_offset);
|
||||
color = 2.0f*make_float3(color.x - 0.5f, color.y - 0.5f, color.z - 0.5f);
|
||||
|
||||
bool is_backfacing = (ccl_fetch(sd, flag) & SD_BACKFACING) != 0;
|
||||
float3 N;
|
||||
|
||||
if(space == NODE_NORMAL_MAP_TANGENT) {
|
||||
@@ -306,6 +307,12 @@ ccl_device void svm_node_normal_map(KernelGlobals *kg, ShaderData *sd, float *st
|
||||
}
|
||||
else {
|
||||
normal = ccl_fetch(sd, Ng);
|
||||
|
||||
/* the normal is already inverted, which is too soon for the math here */
|
||||
if(is_backfacing) {
|
||||
normal = -normal;
|
||||
}
|
||||
|
||||
object_inverse_normal_transform(kg, sd, &normal);
|
||||
}
|
||||
|
||||
@@ -332,6 +339,11 @@ ccl_device void svm_node_normal_map(KernelGlobals *kg, ShaderData *sd, float *st
|
||||
N = safe_normalize(N);
|
||||
}
|
||||
|
||||
/* invert normal for backfacing polygons */
|
||||
if(is_backfacing) {
|
||||
N = -N;
|
||||
}
|
||||
|
||||
float strength = stack_load_float(stack, strength_offset);
|
||||
|
||||
if(strength != 1.0f) {
|
||||
|
||||
@@ -26,6 +26,8 @@ CCL_NAMESPACE_BEGIN
|
||||
/* SVM stack offsets with this value indicate that it's not on the stack */
|
||||
#define SVM_STACK_INVALID 255
|
||||
|
||||
#define SVM_BUMP_EVAL_STATE_SIZE 9
|
||||
|
||||
/* Nodes */
|
||||
|
||||
/* Known frequencies of used nodes, used for selective nodes compilation
|
||||
@@ -127,6 +129,8 @@ typedef enum ShaderNodeType {
|
||||
NODE_HAIR_INFO,
|
||||
NODE_UVMAP,
|
||||
NODE_TEX_VOXEL,
|
||||
NODE_ENTER_BUMP_EVAL,
|
||||
NODE_LEAVE_BUMP_EVAL,
|
||||
} ShaderNodeType;
|
||||
|
||||
typedef enum NodeAttributeType {
|
||||
@@ -374,7 +378,8 @@ typedef enum NodeTexVoxelSpace {
|
||||
typedef enum ShaderType {
|
||||
SHADER_TYPE_SURFACE,
|
||||
SHADER_TYPE_VOLUME,
|
||||
SHADER_TYPE_DISPLACEMENT
|
||||
SHADER_TYPE_DISPLACEMENT,
|
||||
SHADER_TYPE_BUMP,
|
||||
} ShaderType;
|
||||
|
||||
/* Closure */
|
||||
|
||||
@@ -856,27 +856,8 @@ void ShaderGraph::bump_from_displacement()
|
||||
/* connect the bump out to the set normal in: */
|
||||
connect(bump->output("Normal"), set_normal->input("Direction"));
|
||||
|
||||
/* connect bump output to normal input nodes that aren't set yet. actually
|
||||
* this will only set the normal input to the geometry node that we created
|
||||
* and connected to all other normal inputs already. */
|
||||
foreach(ShaderNode *node, nodes) {
|
||||
/* Don't connect normal to the bump node we're coming from,
|
||||
* otherwise it'll be a cycle in graph.
|
||||
*/
|
||||
if(node == bump) {
|
||||
continue;
|
||||
}
|
||||
foreach(ShaderInput *input, node->inputs) {
|
||||
if(!input->link && (input->flags() & SocketType::LINK_NORMAL))
|
||||
connect(set_normal->output("Normal"), input);
|
||||
}
|
||||
}
|
||||
|
||||
/* for displacement bump, clear the normal input in case the above loop
|
||||
* connected the setnormal out to the bump normalin */
|
||||
ShaderInput *bump_normal_in = bump->input("Normal");
|
||||
if(bump_normal_in)
|
||||
bump_normal_in->link = NULL;
|
||||
/* connect to output node */
|
||||
connect(set_normal->output("Normal"), output()->input("Normal"));
|
||||
|
||||
/* finally, add the copied nodes to the graph. we can't do this earlier
|
||||
* because we would create dependency cycles in the above loop */
|
||||
|
||||
@@ -177,6 +177,16 @@ LightManager::~LightManager()
|
||||
{
|
||||
}
|
||||
|
||||
bool LightManager::has_background_light(Scene *scene)
|
||||
{
|
||||
foreach(Light *light, scene->lights) {
|
||||
if(light->type == LIGHT_BACKGROUND) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void LightManager::disable_ineffective_light(Device *device, Scene *scene)
|
||||
{
|
||||
/* Make all lights enabled by default, and perform some preliminary checks
|
||||
|
||||
@@ -91,6 +91,9 @@ public:
|
||||
|
||||
void tag_update(Scene *scene);
|
||||
|
||||
/* Check whether there is a background light. */
|
||||
bool has_background_light(Scene *scene);
|
||||
|
||||
protected:
|
||||
/* Optimization: disable light which is either unsupported or
|
||||
* which doesn't contribute to the scene or which is only used for MIS
|
||||
|
||||
@@ -298,17 +298,17 @@ int Mesh::split_vertex(int vertex)
|
||||
|
||||
foreach(Attribute& attr, attributes.attributes) {
|
||||
if(attr.element == ATTR_ELEMENT_VERTEX) {
|
||||
vector<char> tmp(attr.data_sizeof());
|
||||
memcpy(&tmp[0], attr.data() + tmp.size()*vertex, tmp.size());
|
||||
attr.add(&tmp[0]);
|
||||
array<char> tmp(attr.data_sizeof());
|
||||
memcpy(tmp.data(), attr.data() + tmp.size()*vertex, tmp.size());
|
||||
attr.add(tmp.data());
|
||||
}
|
||||
}
|
||||
|
||||
foreach(Attribute& attr, subd_attributes.attributes) {
|
||||
if(attr.element == ATTR_ELEMENT_VERTEX) {
|
||||
vector<char> tmp(attr.data_sizeof());
|
||||
memcpy(&tmp[0], attr.data() + tmp.size()*vertex, tmp.size());
|
||||
attr.add(&tmp[0]);
|
||||
array<char> tmp(attr.data_sizeof());
|
||||
memcpy(tmp.data(), attr.data() + tmp.size()*vertex, tmp.size());
|
||||
attr.add(tmp.data());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -474,7 +474,7 @@ void Mesh::add_face_normals()
|
||||
bool flip = transform_negative_scaled;
|
||||
|
||||
if(triangles_size) {
|
||||
float3 *verts_ptr = &verts[0];
|
||||
float3 *verts_ptr = verts.data();
|
||||
|
||||
for(size_t i = 0; i < triangles_size; i++) {
|
||||
fN[i] = compute_face_normal(get_triangle(i), verts_ptr);
|
||||
@@ -500,7 +500,7 @@ void Mesh::add_vertex_normals()
|
||||
size_t triangles_size = num_triangles();
|
||||
|
||||
/* static vertex normals */
|
||||
if(!attributes.find(ATTR_STD_VERTEX_NORMAL)) {
|
||||
if(!attributes.find(ATTR_STD_VERTEX_NORMAL) && triangles_size) {
|
||||
/* get attributes */
|
||||
Attribute *attr_fN = attributes.find(ATTR_STD_FACE_NORMAL);
|
||||
Attribute *attr_vN = attributes.add(ATTR_STD_VERTEX_NORMAL);
|
||||
@@ -511,17 +511,17 @@ void Mesh::add_vertex_normals()
|
||||
/* compute vertex normals */
|
||||
memset(vN, 0, verts.size()*sizeof(float3));
|
||||
|
||||
if(triangles_size) {
|
||||
|
||||
for(size_t i = 0; i < triangles_size; i++)
|
||||
for(size_t j = 0; j < 3; j++)
|
||||
vN[get_triangle(i).v[j]] += fN[i];
|
||||
for(size_t i = 0; i < triangles_size; i++) {
|
||||
for(size_t j = 0; j < 3; j++) {
|
||||
vN[get_triangle(i).v[j]] += fN[i];
|
||||
}
|
||||
}
|
||||
|
||||
for(size_t i = 0; i < verts_size; i++) {
|
||||
vN[i] = normalize(vN[i]);
|
||||
if(flip)
|
||||
if(flip) {
|
||||
vN[i] = -vN[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -529,7 +529,7 @@ void Mesh::add_vertex_normals()
|
||||
Attribute *attr_mP = attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
|
||||
Attribute *attr_mN = attributes.find(ATTR_STD_MOTION_VERTEX_NORMAL);
|
||||
|
||||
if(has_motion_blur() && attr_mP && !attr_mN) {
|
||||
if(has_motion_blur() && attr_mP && !attr_mN && triangles_size) {
|
||||
/* create attribute */
|
||||
attr_mN = attributes.add(ATTR_STD_MOTION_VERTEX_NORMAL);
|
||||
|
||||
@@ -540,27 +540,79 @@ void Mesh::add_vertex_normals()
|
||||
/* compute */
|
||||
memset(mN, 0, verts.size()*sizeof(float3));
|
||||
|
||||
if(triangles_size) {
|
||||
for(size_t i = 0; i < triangles_size; i++) {
|
||||
for(size_t j = 0; j < 3; j++) {
|
||||
float3 fN = compute_face_normal(get_triangle(i), mP);
|
||||
mN[get_triangle(i).v[j]] += fN;
|
||||
}
|
||||
for(size_t i = 0; i < triangles_size; i++) {
|
||||
for(size_t j = 0; j < 3; j++) {
|
||||
float3 fN = compute_face_normal(get_triangle(i), mP);
|
||||
mN[get_triangle(i).v[j]] += fN;
|
||||
}
|
||||
}
|
||||
|
||||
for(size_t i = 0; i < verts_size; i++) {
|
||||
mN[i] = normalize(mN[i]);
|
||||
if(flip)
|
||||
if(flip) {
|
||||
mN[i] = -mN[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* subd vertex normals */
|
||||
if(!subd_attributes.find(ATTR_STD_VERTEX_NORMAL) && subd_faces.size()) {
|
||||
/* get attributes */
|
||||
Attribute *attr_vN = subd_attributes.add(ATTR_STD_VERTEX_NORMAL);
|
||||
float3 *vN = attr_vN->data_float3();
|
||||
|
||||
/* compute vertex normals */
|
||||
memset(vN, 0, verts.size()*sizeof(float3));
|
||||
|
||||
for(size_t i = 0; i < subd_faces.size(); i++) {
|
||||
SubdFace& face = subd_faces[i];
|
||||
float3 fN = face.normal(this);
|
||||
|
||||
for(size_t j = 0; j < face.num_corners; j++) {
|
||||
size_t corner = subd_face_corners[face.start_corner+j];
|
||||
vN[corner] += fN;
|
||||
}
|
||||
}
|
||||
|
||||
for(size_t i = 0; i < verts_size; i++) {
|
||||
vN[i] = normalize(vN[i]);
|
||||
if(flip) {
|
||||
vN[i] = -vN[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Mesh::add_undisplaced()
|
||||
{
|
||||
AttributeSet& attrs = (subdivision_type == SUBDIVISION_NONE) ? attributes : subd_attributes;
|
||||
|
||||
/* don't compute if already there */
|
||||
if(attrs.find(ATTR_STD_POSITION_UNDISPLACED)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* get attribute */
|
||||
Attribute *attr = attrs.add(ATTR_STD_POSITION_UNDISPLACED);
|
||||
attr->flags |= ATTR_SUBDIVIDED;
|
||||
|
||||
float3 *data = attr->data_float3();
|
||||
|
||||
/* copy verts */
|
||||
size_t size = attr->buffer_size(this, (subdivision_type == SUBDIVISION_NONE) ? ATTR_PRIM_TRIANGLE : ATTR_PRIM_SUBD);
|
||||
if(size) {
|
||||
memcpy(data, verts.data(), size);
|
||||
}
|
||||
}
|
||||
|
||||
void Mesh::pack_normals(Scene *scene, uint *tri_shader, float4 *vnormal)
|
||||
{
|
||||
Attribute *attr_vN = attributes.find(ATTR_STD_VERTEX_NORMAL);
|
||||
if(attr_vN == NULL) {
|
||||
/* Happens on objects with just hair. */
|
||||
return;
|
||||
}
|
||||
|
||||
float3 *vN = attr_vN->data_float3();
|
||||
uint shader_id = 0;
|
||||
@@ -568,7 +620,7 @@ void Mesh::pack_normals(Scene *scene, uint *tri_shader, float4 *vnormal)
|
||||
bool last_smooth = false;
|
||||
|
||||
size_t triangles_size = num_triangles();
|
||||
int *shader_ptr = (shader.size())? &shader[0]: NULL;
|
||||
int *shader_ptr = shader.data();
|
||||
|
||||
bool do_transform = transform_applied;
|
||||
Transform ntfm = transform_normal;
|
||||
@@ -580,7 +632,7 @@ void Mesh::pack_normals(Scene *scene, uint *tri_shader, float4 *vnormal)
|
||||
last_smooth = smooth[i];
|
||||
Shader *shader = (last_shader < used_shaders.size()) ?
|
||||
used_shaders[last_shader] : scene->default_surface;
|
||||
shader_id = scene->shader_manager->get_shader_id(shader, this, last_smooth);
|
||||
shader_id = scene->shader_manager->get_shader_id(shader, last_smooth);
|
||||
}
|
||||
|
||||
tri_shader[i] = shader_id;
|
||||
@@ -608,7 +660,7 @@ void Mesh::pack_verts(const vector<uint>& tri_prim_index,
|
||||
size_t verts_size = verts.size();
|
||||
|
||||
if(verts_size && subd_faces.size()) {
|
||||
float2 *vert_patch_uv_ptr = &vert_patch_uv[0];
|
||||
float2 *vert_patch_uv_ptr = vert_patch_uv.data();
|
||||
|
||||
for(size_t i = 0; i < verts_size; i++) {
|
||||
tri_patch_uv[i] = vert_patch_uv_ptr[i];
|
||||
@@ -617,16 +669,14 @@ void Mesh::pack_verts(const vector<uint>& tri_prim_index,
|
||||
|
||||
size_t triangles_size = num_triangles();
|
||||
|
||||
if(triangles_size) {
|
||||
for(size_t i = 0; i < triangles_size; i++) {
|
||||
Triangle t = get_triangle(i);
|
||||
tri_vindex[i] = make_uint4(t.v[0] + vert_offset,
|
||||
t.v[1] + vert_offset,
|
||||
t.v[2] + vert_offset,
|
||||
tri_prim_index[i + tri_offset]);
|
||||
for(size_t i = 0; i < triangles_size; i++) {
|
||||
Triangle t = get_triangle(i);
|
||||
tri_vindex[i] = make_uint4(t.v[0] + vert_offset,
|
||||
t.v[1] + vert_offset,
|
||||
t.v[2] + vert_offset,
|
||||
tri_prim_index[i + tri_offset]);
|
||||
|
||||
tri_patch[i] = (!subd_faces.size()) ? -1 : (triangle_patch[i]*8 + patch_offset);
|
||||
}
|
||||
tri_patch[i] = (!subd_faces.size()) ? -1 : (triangle_patch[i]*8 + patch_offset);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -636,8 +686,8 @@ void Mesh::pack_curves(Scene *scene, float4 *curve_key_co, float4 *curve_data, s
|
||||
|
||||
/* pack curve keys */
|
||||
if(curve_keys_size) {
|
||||
float3 *keys_ptr = &curve_keys[0];
|
||||
float *radius_ptr = &curve_radius[0];
|
||||
float3 *keys_ptr = curve_keys.data();
|
||||
float *radius_ptr = curve_radius.data();
|
||||
|
||||
for(size_t i = 0; i < curve_keys_size; i++)
|
||||
curve_key_co[i] = make_float4(keys_ptr[i].x, keys_ptr[i].y, keys_ptr[i].z, radius_ptr[i]);
|
||||
@@ -646,20 +696,18 @@ void Mesh::pack_curves(Scene *scene, float4 *curve_key_co, float4 *curve_data, s
|
||||
/* pack curve segments */
|
||||
size_t curve_num = num_curves();
|
||||
|
||||
if(curve_num) {
|
||||
for(size_t i = 0; i < curve_num; i++) {
|
||||
Curve curve = get_curve(i);
|
||||
int shader_id = curve_shader[i];
|
||||
Shader *shader = (shader_id < used_shaders.size()) ?
|
||||
used_shaders[shader_id] : scene->default_surface;
|
||||
shader_id = scene->shader_manager->get_shader_id(shader, this, false);
|
||||
for(size_t i = 0; i < curve_num; i++) {
|
||||
Curve curve = get_curve(i);
|
||||
int shader_id = curve_shader[i];
|
||||
Shader *shader = (shader_id < used_shaders.size()) ?
|
||||
used_shaders[shader_id] : scene->default_surface;
|
||||
shader_id = scene->shader_manager->get_shader_id(shader, false);
|
||||
|
||||
curve_data[i] = make_float4(
|
||||
__int_as_float(curve.first_key + curvekey_offset),
|
||||
__int_as_float(curve.num_keys),
|
||||
__int_as_float(shader_id),
|
||||
0.0f);
|
||||
}
|
||||
curve_data[i] = make_float4(
|
||||
__int_as_float(curve.first_key + curvekey_offset),
|
||||
__int_as_float(curve.num_keys),
|
||||
__int_as_float(shader_id),
|
||||
0.0f);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -668,13 +716,30 @@ void Mesh::pack_patches(uint *patch_data, uint vert_offset, uint face_offset, ui
|
||||
size_t num_faces = subd_faces.size();
|
||||
int ngons = 0;
|
||||
|
||||
if(num_faces) {
|
||||
for(size_t f = 0; f < num_faces; f++) {
|
||||
SubdFace face = subd_faces[f];
|
||||
for(size_t f = 0; f < num_faces; f++) {
|
||||
SubdFace face = subd_faces[f];
|
||||
|
||||
if(face.is_quad()) {
|
||||
if(face.is_quad()) {
|
||||
int c[4];
|
||||
memcpy(c, &subd_face_corners[face.start_corner], sizeof(int)*4);
|
||||
|
||||
*(patch_data++) = c[0] + vert_offset;
|
||||
*(patch_data++) = c[1] + vert_offset;
|
||||
*(patch_data++) = c[2] + vert_offset;
|
||||
*(patch_data++) = c[3] + vert_offset;
|
||||
|
||||
*(patch_data++) = f+face_offset;
|
||||
*(patch_data++) = face.num_corners;
|
||||
*(patch_data++) = face.start_corner + corner_offset;
|
||||
*(patch_data++) = 0;
|
||||
}
|
||||
else {
|
||||
for(int i = 0; i < face.num_corners; i++) {
|
||||
int c[4];
|
||||
memcpy(c, &subd_face_corners[face.start_corner], sizeof(int)*4);
|
||||
c[0] = subd_face_corners[face.start_corner + mod(i + 0, face.num_corners)];
|
||||
c[1] = subd_face_corners[face.start_corner + mod(i + 1, face.num_corners)];
|
||||
c[2] = verts.size() - num_subd_verts + ngons;
|
||||
c[3] = subd_face_corners[face.start_corner + mod(i - 1, face.num_corners)];
|
||||
|
||||
*(patch_data++) = c[0] + vert_offset;
|
||||
*(patch_data++) = c[1] + vert_offset;
|
||||
@@ -682,31 +747,12 @@ void Mesh::pack_patches(uint *patch_data, uint vert_offset, uint face_offset, ui
|
||||
*(patch_data++) = c[3] + vert_offset;
|
||||
|
||||
*(patch_data++) = f+face_offset;
|
||||
*(patch_data++) = face.num_corners;
|
||||
*(patch_data++) = face.num_corners | (i << 16);
|
||||
*(patch_data++) = face.start_corner + corner_offset;
|
||||
*(patch_data++) = 0;
|
||||
*(patch_data++) = subd_face_corners.size() + ngons + corner_offset;
|
||||
}
|
||||
else {
|
||||
for(int i = 0; i < face.num_corners; i++) {
|
||||
int c[4];
|
||||
c[0] = subd_face_corners[face.start_corner + mod(i + 0, face.num_corners)];
|
||||
c[1] = subd_face_corners[face.start_corner + mod(i + 1, face.num_corners)];
|
||||
c[2] = verts.size() - num_subd_verts + ngons;
|
||||
c[3] = subd_face_corners[face.start_corner + mod(i - 1, face.num_corners)];
|
||||
|
||||
*(patch_data++) = c[0] + vert_offset;
|
||||
*(patch_data++) = c[1] + vert_offset;
|
||||
*(patch_data++) = c[2] + vert_offset;
|
||||
*(patch_data++) = c[3] + vert_offset;
|
||||
|
||||
*(patch_data++) = f+face_offset;
|
||||
*(patch_data++) = face.num_corners | (i << 16);
|
||||
*(patch_data++) = face.start_corner + corner_offset;
|
||||
*(patch_data++) = subd_face_corners.size() + ngons + corner_offset;
|
||||
}
|
||||
|
||||
ngons++;
|
||||
}
|
||||
ngons++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1658,6 +1704,10 @@ void MeshManager::device_update(Device *device, DeviceScene *dscene, Scene *scen
|
||||
mesh->add_face_normals();
|
||||
mesh->add_vertex_normals();
|
||||
|
||||
if(mesh->need_attribute(scene, ATTR_STD_POSITION_UNDISPLACED)) {
|
||||
mesh->add_undisplaced();
|
||||
}
|
||||
|
||||
if(progress.get_cancel()) return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -215,6 +215,7 @@ public:
|
||||
void compute_bounds();
|
||||
void add_face_normals();
|
||||
void add_vertex_normals();
|
||||
void add_undisplaced();
|
||||
|
||||
void pack_normals(Scene *scene, uint *shader, float4 *vnormal);
|
||||
void pack_verts(const vector<uint>& tri_prim_index,
|
||||
|
||||
@@ -45,7 +45,7 @@ namespace Far {
|
||||
setNumBaseVertices(refiner, mesh.verts.size());
|
||||
setNumBaseFaces(refiner, mesh.subd_faces.size());
|
||||
|
||||
ccl::Mesh::SubdFace* face = &mesh.subd_faces[0];
|
||||
const ccl::Mesh::SubdFace* face = mesh.subd_faces.data();
|
||||
|
||||
for(int i = 0; i < mesh.subd_faces.size(); i++, face++) {
|
||||
setNumBaseFaceVertices(refiner, i, face->num_corners);
|
||||
@@ -57,7 +57,7 @@ namespace Far {
|
||||
template<>
|
||||
bool TopologyRefinerFactory<ccl::Mesh>::assignComponentTopology(TopologyRefiner& refiner, ccl::Mesh const& mesh)
|
||||
{
|
||||
ccl::Mesh::SubdFace* face = &mesh.subd_faces[0];
|
||||
const ccl::Mesh::SubdFace* face = mesh.subd_faces.data();
|
||||
|
||||
for(int i = 0; i < mesh.subd_faces.size(); i++, face++) {
|
||||
IndexArray face_verts = getBaseFaceVertices(refiner, i);
|
||||
@@ -195,7 +195,7 @@ public:
|
||||
verts[i].value = mesh->verts[i];
|
||||
}
|
||||
|
||||
OsdValue<float3>* src = &verts[0];
|
||||
OsdValue<float3>* src = verts.data();
|
||||
for(int i = 0; i < refiner->GetMaxLevel(); i++) {
|
||||
OsdValue<float3>* dest = src + refiner->GetLevel(i).GetNumVertices();
|
||||
Far::PrimvarRefiner(*refiner).Interpolate(i+1, src, dest);
|
||||
@@ -219,7 +219,7 @@ public:
|
||||
attr.resize(num_refiner_verts + num_local_points);
|
||||
attr.flags |= ATTR_FINAL_SIZE;
|
||||
|
||||
char* src = &attr.buffer[0];
|
||||
char* src = attr.buffer.data();
|
||||
|
||||
for(int i = 0; i < refiner->GetMaxLevel(); i++) {
|
||||
char* dest = src + refiner->GetLevel(i).GetNumVertices() * attr.data_sizeof();
|
||||
@@ -299,7 +299,9 @@ void Mesh::tessellate(DiagSplit *split)
|
||||
bool need_packed_patch_table = false;
|
||||
|
||||
if(subdivision_type == SUBDIVISION_CATMULL_CLARK) {
|
||||
osd_data.build_from_mesh(this);
|
||||
if(subd_faces.size()) {
|
||||
osd_data.build_from_mesh(this);
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
@@ -468,7 +470,7 @@ void Mesh::tessellate(DiagSplit *split)
|
||||
/* keep subdivision for corner attributes disabled for now */
|
||||
attr.flags &= ~ATTR_SUBDIVIDED;
|
||||
}
|
||||
else {
|
||||
else if(subd_faces.size()) {
|
||||
osd_data.subdivide_attribute(attr);
|
||||
|
||||
need_packed_patch_table = true;
|
||||
|
||||
@@ -4964,12 +4964,8 @@ void CurvesNode::constant_fold(const ConstantFolder& folder, ShaderInput *value_
|
||||
{
|
||||
ShaderInput *fac_in = input("Fac");
|
||||
|
||||
/* remove no-op node */
|
||||
if(!fac_in->link && fac == 0.0f) {
|
||||
folder.bypass(value_in->link);
|
||||
}
|
||||
/* evaluate fully constant node */
|
||||
else if(folder.all_inputs_constant()) {
|
||||
if(folder.all_inputs_constant()) {
|
||||
if (curves.size() == 0)
|
||||
return;
|
||||
|
||||
@@ -4982,6 +4978,11 @@ void CurvesNode::constant_fold(const ConstantFolder& folder, ShaderInput *value_
|
||||
|
||||
folder.make_constant(interp(value, result, fac));
|
||||
}
|
||||
/* remove no-op node */
|
||||
else if(!fac_in->link && fac == 0.0f) {
|
||||
/* link is not null because otherwise all inputs are constant */
|
||||
folder.bypass(value_in->link);
|
||||
}
|
||||
}
|
||||
|
||||
void CurvesNode::compile(SVMCompiler& compiler, int type, ShaderInput *value_in, ShaderOutput *value_out)
|
||||
|
||||
@@ -45,6 +45,7 @@ NODE_DEFINE(Object)
|
||||
SOCKET_UINT(random_id, "Random ID", 0);
|
||||
SOCKET_INT(pass_id, "Pass ID", 0);
|
||||
SOCKET_BOOLEAN(use_holdout, "Use Holdout", false);
|
||||
SOCKET_BOOLEAN(hide_on_missing_motion, "Hide on Missing Motion", false);
|
||||
SOCKET_POINT(dupli_generated, "Dupli Generated", make_float3(0.0f, 0.0f, 0.0f));
|
||||
SOCKET_POINT2(dupli_uv, "Dupli UV", make_float2(0.0f, 0.0f));
|
||||
|
||||
@@ -72,29 +73,42 @@ void Object::compute_bounds(bool motion_blur)
|
||||
BoundBox mbounds = mesh->bounds;
|
||||
|
||||
if(motion_blur && use_motion) {
|
||||
if(motion.pre == transform_empty() ||
|
||||
motion.post == transform_empty()) {
|
||||
MotionTransform mtfm = motion;
|
||||
|
||||
if(hide_on_missing_motion) {
|
||||
/* Hide objects that have no valid previous or next transform, for
|
||||
* example particle that stop existing. TODO: add support for this
|
||||
* case in the kernel so we don't get render artifacts. */
|
||||
bounds = BoundBox::empty;
|
||||
}
|
||||
else {
|
||||
DecompMotionTransform decomp;
|
||||
transform_motion_decompose(&decomp, &motion, &tfm);
|
||||
|
||||
bounds = BoundBox::empty;
|
||||
|
||||
/* todo: this is really terrible. according to pbrt there is a better
|
||||
* way to find this iteratively, but did not find implementation yet
|
||||
* or try to implement myself */
|
||||
for(float t = 0.0f; t < 1.0f; t += (1.0f/128.0f)) {
|
||||
Transform ttfm;
|
||||
|
||||
transform_motion_interpolate(&ttfm, &decomp, t);
|
||||
bounds.grow(mbounds.transformed(&ttfm));
|
||||
if(mtfm.pre == transform_empty() ||
|
||||
mtfm.post == transform_empty()) {
|
||||
bounds = BoundBox::empty;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* In case of missing motion information for previous/next frame,
|
||||
* assume there is no motion. */
|
||||
if(mtfm.pre == transform_empty()) {
|
||||
mtfm.pre = tfm;
|
||||
}
|
||||
if(mtfm.post == transform_empty()) {
|
||||
mtfm.post = tfm;
|
||||
}
|
||||
|
||||
DecompMotionTransform decomp;
|
||||
transform_motion_decompose(&decomp, &mtfm, &tfm);
|
||||
|
||||
bounds = BoundBox::empty;
|
||||
|
||||
/* todo: this is really terrible. according to pbrt there is a better
|
||||
* way to find this iteratively, but did not find implementation yet
|
||||
* or try to implement myself */
|
||||
for(float t = 0.0f; t < 1.0f; t += (1.0f/128.0f)) {
|
||||
Transform ttfm;
|
||||
|
||||
transform_motion_interpolate(&ttfm, &decomp, t);
|
||||
bounds.grow(mbounds.transformed(&ttfm));
|
||||
}
|
||||
}
|
||||
else {
|
||||
if(mesh->transform_applied) {
|
||||
@@ -345,28 +359,27 @@ void ObjectManager::device_update_object_transform(UpdateObejctTransformState *s
|
||||
* comes with deformed position in object space, or if we transform
|
||||
* the shading point in world space.
|
||||
*/
|
||||
Transform mtfm_pre = ob->motion.pre;
|
||||
Transform mtfm_post = ob->motion.post;
|
||||
MotionTransform mtfm = ob->motion;
|
||||
|
||||
/* In case of missing motion information for previous/next frame,
|
||||
* assume there is no motion. */
|
||||
if(!ob->use_motion || mtfm_pre == transform_empty()) {
|
||||
mtfm_pre = ob->tfm;
|
||||
if(!ob->use_motion || mtfm.pre == transform_empty()) {
|
||||
mtfm.pre = ob->tfm;
|
||||
}
|
||||
if(!ob->use_motion || mtfm_post == transform_empty()) {
|
||||
mtfm_post = ob->tfm;
|
||||
if(!ob->use_motion || mtfm.post == transform_empty()) {
|
||||
mtfm.post = ob->tfm;
|
||||
}
|
||||
|
||||
if(!mesh->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION)) {
|
||||
mtfm_pre = mtfm_pre * itfm;
|
||||
mtfm_post = mtfm_post * itfm;
|
||||
mtfm.pre = mtfm.pre * itfm;
|
||||
mtfm.post = mtfm.post * itfm;
|
||||
}
|
||||
else {
|
||||
flag |= SD_OBJECT_HAS_VERTEX_MOTION;
|
||||
}
|
||||
|
||||
memcpy(&objects_vector[object_index*OBJECT_VECTOR_SIZE+0], &mtfm_pre, sizeof(float4)*3);
|
||||
memcpy(&objects_vector[object_index*OBJECT_VECTOR_SIZE+3], &mtfm_post, sizeof(float4)*3);
|
||||
memcpy(&objects_vector[object_index*OBJECT_VECTOR_SIZE+0], &mtfm.pre, sizeof(float4)*3);
|
||||
memcpy(&objects_vector[object_index*OBJECT_VECTOR_SIZE+3], &mtfm.post, sizeof(float4)*3);
|
||||
}
|
||||
#ifdef __OBJECT_MOTION__
|
||||
else if(state->need_motion == Scene::MOTION_BLUR) {
|
||||
@@ -692,7 +705,7 @@ void ObjectManager::apply_static_transforms(DeviceScene *dscene, Scene *scene, u
|
||||
* Could be solved by moving reference counter to Mesh.
|
||||
*/
|
||||
if((mesh_users[object->mesh] == 1 && !object->mesh->has_surface_bssrdf) &&
|
||||
!object->mesh->has_true_displacement())
|
||||
!object->mesh->has_true_displacement() && object->mesh->subdivision_type == Mesh::SUBDIVISION_NONE)
|
||||
{
|
||||
if(!(motion_blur && object->use_motion)) {
|
||||
if(!object->mesh->transform_applied) {
|
||||
|
||||
@@ -51,6 +51,7 @@ public:
|
||||
uint visibility;
|
||||
MotionTransform motion;
|
||||
bool use_motion;
|
||||
bool hide_on_missing_motion;
|
||||
bool use_holdout;
|
||||
|
||||
float3 dupli_generated;
|
||||
|
||||
@@ -609,7 +609,7 @@ bool OSLCompiler::node_skip_input(ShaderNode *node, ShaderInput *input)
|
||||
return true;
|
||||
if(input->name() == "Displacement" && current_type != SHADER_TYPE_DISPLACEMENT)
|
||||
return true;
|
||||
if(input->name() == "Normal")
|
||||
if(input->name() == "Normal" && current_type != SHADER_TYPE_BUMP)
|
||||
return true;
|
||||
}
|
||||
else if(node->special_type == SHADER_SPECIAL_TYPE_BUMP) {
|
||||
@@ -684,6 +684,8 @@ void OSLCompiler::add(ShaderNode *node, const char *name, bool isfilepath)
|
||||
ss->Shader("surface", name, id(node).c_str());
|
||||
else if(current_type == SHADER_TYPE_DISPLACEMENT)
|
||||
ss->Shader("displacement", name, id(node).c_str());
|
||||
else if(current_type == SHADER_TYPE_BUMP)
|
||||
ss->Shader("displacement", name, id(node).c_str());
|
||||
else
|
||||
assert(0);
|
||||
|
||||
@@ -1055,6 +1057,12 @@ OSL::ShaderGroupRef OSLCompiler::compile_type(Shader *shader, ShaderGraph *graph
|
||||
generate_nodes(dependencies);
|
||||
output->compile(*this);
|
||||
}
|
||||
else if(type == SHADER_TYPE_BUMP) {
|
||||
/* generate bump shader */
|
||||
find_dependencies(dependencies, output->input("Normal"));
|
||||
generate_nodes(dependencies);
|
||||
output->compile(*this);
|
||||
}
|
||||
else if(type == SHADER_TYPE_VOLUME) {
|
||||
/* generate volume shader */
|
||||
find_dependencies(dependencies, output->input("Volume"));
|
||||
@@ -1116,10 +1124,10 @@ void OSLCompiler::compile(Scene *scene, OSLGlobals *og, Shader *shader)
|
||||
if(shader->used && graph && output->input("Surface")->link) {
|
||||
shader->osl_surface_ref = compile_type(shader, shader->graph, SHADER_TYPE_SURFACE);
|
||||
|
||||
if(shader->graph_bump)
|
||||
shader->osl_surface_bump_ref = compile_type(shader, shader->graph_bump, SHADER_TYPE_SURFACE);
|
||||
if(shader->graph_bump && shader->displacement_method != DISPLACE_TRUE)
|
||||
shader->osl_surface_bump_ref = compile_type(shader, shader->graph_bump, SHADER_TYPE_BUMP);
|
||||
else
|
||||
shader->osl_surface_bump_ref = shader->osl_surface_ref;
|
||||
shader->osl_surface_bump_ref = OSL::ShaderGroupRef();
|
||||
|
||||
shader->has_surface = true;
|
||||
}
|
||||
@@ -1147,13 +1155,9 @@ void OSLCompiler::compile(Scene *scene, OSLGlobals *og, Shader *shader)
|
||||
|
||||
/* push state to array for lookup */
|
||||
og->surface_state.push_back(shader->osl_surface_ref);
|
||||
og->surface_state.push_back(shader->osl_surface_bump_ref);
|
||||
|
||||
og->volume_state.push_back(shader->osl_volume_ref);
|
||||
og->volume_state.push_back(shader->osl_volume_ref);
|
||||
|
||||
og->displacement_state.push_back(shader->osl_displacement_ref);
|
||||
og->displacement_state.push_back(shader->osl_displacement_ref);
|
||||
og->bump_state.push_back(shader->osl_surface_bump_ref);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
@@ -221,6 +221,16 @@ void Shader::tag_update(Scene *scene)
|
||||
if(use_mis && has_surface_emission)
|
||||
scene->light_manager->need_update = true;
|
||||
|
||||
/* Special handle of background MIS light for now: for some reason it
|
||||
* has use_mis set to false. We are quite close to release now, so
|
||||
* better to be safe.
|
||||
*/
|
||||
if(this == scene->default_background &&
|
||||
scene->light_manager->has_background_light(scene))
|
||||
{
|
||||
scene->light_manager->need_update = true;
|
||||
}
|
||||
|
||||
/* quick detection of which kind of shaders we have to avoid loading
|
||||
* e.g. surface attributes when there is only a volume shader. this could
|
||||
* be more fine grained but it's better than nothing */
|
||||
@@ -240,6 +250,10 @@ void Shader::tag_update(Scene *scene)
|
||||
attributes.clear();
|
||||
foreach(ShaderNode *node, graph->nodes)
|
||||
node->attributes(this, &attributes);
|
||||
|
||||
if(has_displacement && displacement_method == DISPLACE_BOTH) {
|
||||
attributes.add(ATTR_STD_POSITION_UNDISPLACED);
|
||||
}
|
||||
|
||||
/* compare if the attributes changed, mesh manager will check
|
||||
* need_update_attributes, update the relevant meshes and clear it. */
|
||||
@@ -312,14 +326,11 @@ uint ShaderManager::get_attribute_id(AttributeStandard std)
|
||||
return (uint)std;
|
||||
}
|
||||
|
||||
int ShaderManager::get_shader_id(Shader *shader, Mesh *mesh, bool smooth)
|
||||
int ShaderManager::get_shader_id(Shader *shader, bool smooth)
|
||||
{
|
||||
/* get a shader id to pass to the kernel */
|
||||
int id = shader->id*2;
|
||||
|
||||
/* index depends bump since this setting is not in the shader */
|
||||
if(mesh && shader->displacement_method != DISPLACE_TRUE)
|
||||
id += 1;
|
||||
int id = shader->id;
|
||||
|
||||
/* smooth flag */
|
||||
if(smooth)
|
||||
id |= SHADER_SMOOTH_NORMAL;
|
||||
@@ -368,7 +379,7 @@ void ShaderManager::device_update_common(Device *device,
|
||||
if(scene->shaders.size() == 0)
|
||||
return;
|
||||
|
||||
uint shader_flag_size = scene->shaders.size()*4;
|
||||
uint shader_flag_size = scene->shaders.size()*2;
|
||||
uint *shader_flag = dscene->shader_flag.resize(shader_flag_size);
|
||||
uint i = 0;
|
||||
bool has_volumes = false;
|
||||
@@ -406,15 +417,14 @@ void ShaderManager::device_update_common(Device *device,
|
||||
flag |= SD_VOLUME_CUBIC;
|
||||
if(shader->graph_bump)
|
||||
flag |= SD_HAS_BUMP;
|
||||
|
||||
/* regular shader */
|
||||
shader_flag[i++] = flag;
|
||||
shader_flag[i++] = shader->pass_id;
|
||||
if(shader->displacement_method != DISPLACE_BUMP)
|
||||
flag |= SD_HAS_DISPLACEMENT;
|
||||
|
||||
/* shader with bump mapping */
|
||||
if(shader->graph_bump)
|
||||
if(shader->displacement_method != DISPLACE_TRUE && shader->graph_bump)
|
||||
flag |= SD_HAS_BSSRDF_BUMP;
|
||||
|
||||
/* regular shader */
|
||||
shader_flag[i++] = flag;
|
||||
shader_flag[i++] = shader->pass_id;
|
||||
|
||||
|
||||
@@ -173,7 +173,7 @@ public:
|
||||
uint get_attribute_id(AttributeStandard std);
|
||||
|
||||
/* get shader id for mesh faces */
|
||||
int get_shader_id(Shader *shader, Mesh *mesh = NULL, bool smooth = false);
|
||||
int get_shader_id(Shader *shader, bool smooth = false);
|
||||
|
||||
/* add default shaders to scene, to use as default for things that don't
|
||||
* have any shader assigned explicitly */
|
||||
|
||||
@@ -63,7 +63,6 @@ void SVMShaderManager::device_update(Device *device, DeviceScene *dscene, Scene
|
||||
|
||||
for(i = 0; i < scene->shaders.size(); i++) {
|
||||
svm_nodes.push_back(make_int4(NODE_SHADER_JUMP, 0, 0, 0));
|
||||
svm_nodes.push_back(make_int4(NODE_SHADER_JUMP, 0, 0, 0));
|
||||
}
|
||||
|
||||
foreach(Shader *shader, scene->shaders) {
|
||||
@@ -147,9 +146,8 @@ int SVMCompiler::stack_size(SocketType::Type type)
|
||||
return size;
|
||||
}
|
||||
|
||||
int SVMCompiler::stack_find_offset(SocketType::Type type)
|
||||
int SVMCompiler::stack_find_offset(int size)
|
||||
{
|
||||
int size = stack_size(type);
|
||||
int offset = -1;
|
||||
|
||||
/* find free space in stack & mark as used */
|
||||
@@ -176,6 +174,11 @@ int SVMCompiler::stack_find_offset(SocketType::Type type)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int SVMCompiler::stack_find_offset(SocketType::Type type)
|
||||
{
|
||||
return stack_find_offset(stack_size(type));
|
||||
}
|
||||
|
||||
void SVMCompiler::stack_clear_offset(SocketType::Type type, int offset)
|
||||
{
|
||||
int size = stack_size(type);
|
||||
@@ -648,6 +651,9 @@ void SVMCompiler::compile_type(Shader *shader, ShaderGraph *graph, ShaderType ty
|
||||
case SHADER_TYPE_DISPLACEMENT:
|
||||
clin = node->input("Displacement");
|
||||
break;
|
||||
case SHADER_TYPE_BUMP:
|
||||
clin = node->input("Normal");
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
break;
|
||||
@@ -664,6 +670,13 @@ void SVMCompiler::compile_type(Shader *shader, ShaderGraph *graph, ShaderType ty
|
||||
output->stack_offset = SVM_STACK_INVALID;
|
||||
}
|
||||
|
||||
/* for the bump shader we need add a node to store the shader state */
|
||||
int bump_state_offset = SVM_STACK_INVALID;
|
||||
if(type == SHADER_TYPE_BUMP) {
|
||||
bump_state_offset = stack_find_offset(SVM_BUMP_EVAL_STATE_SIZE);
|
||||
add_node(NODE_ENTER_BUMP_EVAL, bump_state_offset);
|
||||
}
|
||||
|
||||
if(shader->used) {
|
||||
if(clin->link) {
|
||||
bool generate = false;
|
||||
@@ -681,6 +694,9 @@ void SVMCompiler::compile_type(Shader *shader, ShaderGraph *graph, ShaderType ty
|
||||
generate = true;
|
||||
shader->has_displacement = true;
|
||||
break;
|
||||
case SHADER_TYPE_BUMP: /* generate bump shader */
|
||||
generate = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -697,13 +713,21 @@ void SVMCompiler::compile_type(Shader *shader, ShaderGraph *graph, ShaderType ty
|
||||
node->compile(*this);
|
||||
}
|
||||
|
||||
/* add node to restore state after bump shader has finished */
|
||||
if(type == SHADER_TYPE_BUMP) {
|
||||
add_node(NODE_LEAVE_BUMP_EVAL, bump_state_offset);
|
||||
}
|
||||
|
||||
/* if compile failed, generate empty shader */
|
||||
if(compile_failed) {
|
||||
svm_nodes.clear();
|
||||
compile_failed = false;
|
||||
}
|
||||
|
||||
add_node(NODE_END, 0, 0, 0);
|
||||
/* for bump shaders we fall thru to the surface shader, but if this is any other kind of shader it ends here */
|
||||
if(type != SHADER_TYPE_BUMP) {
|
||||
add_node(NODE_END, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void SVMCompiler::compile(Scene *scene,
|
||||
@@ -753,19 +777,22 @@ void SVMCompiler::compile(Scene *scene,
|
||||
shader->has_object_dependency = false;
|
||||
shader->has_integrator_dependency = false;
|
||||
|
||||
/* generate bump shader */
|
||||
if(shader->displacement_method != DISPLACE_TRUE && shader->graph_bump) {
|
||||
scoped_timer timer((summary != NULL)? &summary->time_generate_bump: NULL);
|
||||
compile_type(shader, shader->graph_bump, SHADER_TYPE_BUMP);
|
||||
global_svm_nodes[index].y = global_svm_nodes.size();
|
||||
global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
|
||||
}
|
||||
|
||||
/* generate surface shader */
|
||||
{
|
||||
scoped_timer timer((summary != NULL)? &summary->time_generate_surface: NULL);
|
||||
compile_type(shader, shader->graph, SHADER_TYPE_SURFACE);
|
||||
global_svm_nodes[index*2 + 0].y = global_svm_nodes.size();
|
||||
global_svm_nodes[index*2 + 1].y = global_svm_nodes.size();
|
||||
global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
|
||||
}
|
||||
|
||||
if(shader->graph_bump) {
|
||||
scoped_timer timer((summary != NULL)? &summary->time_generate_bump: NULL);
|
||||
compile_type(shader, shader->graph_bump, SHADER_TYPE_SURFACE);
|
||||
global_svm_nodes[index*2 + 1].y = global_svm_nodes.size();
|
||||
/* only set jump offset if there's no bump shader, as the bump shader will fall thru to this one if it exists */
|
||||
if(shader->displacement_method == DISPLACE_TRUE || !shader->graph_bump) {
|
||||
global_svm_nodes[index].y = global_svm_nodes.size();
|
||||
}
|
||||
global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
|
||||
}
|
||||
|
||||
@@ -773,8 +800,7 @@ void SVMCompiler::compile(Scene *scene,
|
||||
{
|
||||
scoped_timer timer((summary != NULL)? &summary->time_generate_volume: NULL);
|
||||
compile_type(shader, shader->graph, SHADER_TYPE_VOLUME);
|
||||
global_svm_nodes[index*2 + 0].z = global_svm_nodes.size();
|
||||
global_svm_nodes[index*2 + 1].z = global_svm_nodes.size();
|
||||
global_svm_nodes[index].z = global_svm_nodes.size();
|
||||
global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
|
||||
}
|
||||
|
||||
@@ -782,8 +808,7 @@ void SVMCompiler::compile(Scene *scene,
|
||||
{
|
||||
scoped_timer timer((summary != NULL)? &summary->time_generate_displacement: NULL);
|
||||
compile_type(shader, shader->graph, SHADER_TYPE_DISPLACEMENT);
|
||||
global_svm_nodes[index*2 + 0].w = global_svm_nodes.size();
|
||||
global_svm_nodes[index*2 + 1].w = global_svm_nodes.size();
|
||||
global_svm_nodes[index].w = global_svm_nodes.size();
|
||||
global_svm_nodes.insert(global_svm_nodes.end(), svm_nodes.begin(), svm_nodes.end());
|
||||
}
|
||||
|
||||
|
||||
@@ -99,6 +99,7 @@ public:
|
||||
int stack_assign(ShaderInput *input);
|
||||
int stack_assign_if_linked(ShaderInput *input);
|
||||
int stack_assign_if_linked(ShaderOutput *output);
|
||||
int stack_find_offset(int size);
|
||||
int stack_find_offset(SocketType::Type type);
|
||||
void stack_clear_offset(SocketType::Type type, int offset);
|
||||
void stack_link(ShaderInput *input, ShaderOutput *output);
|
||||
|
||||
@@ -57,7 +57,7 @@ void EdgeDice::reserve(int num_verts)
|
||||
|
||||
Attribute *attr_vN = mesh->attributes.add(ATTR_STD_VERTEX_NORMAL);
|
||||
|
||||
mesh_P = &mesh->verts[0];
|
||||
mesh_P = mesh->verts.data();
|
||||
mesh_N = attr_vN->data_float3();
|
||||
}
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ struct SubdParams {
|
||||
|
||||
test_steps = 3;
|
||||
split_threshold = 1;
|
||||
dicing_rate = 0.1f;
|
||||
dicing_rate = 1.0f;
|
||||
max_level = 12;
|
||||
camera = NULL;
|
||||
}
|
||||
|
||||
@@ -214,7 +214,7 @@ void PackedPatchTable::pack(Far::PatchTable* patch_table, int offset)
|
||||
}
|
||||
|
||||
table.resize(total_size());
|
||||
uint* data = &table[0];
|
||||
uint* data = table.data();
|
||||
|
||||
uint* array = data;
|
||||
uint* index = array + num_arrays * PATCH_ARRAY_SIZE;
|
||||
@@ -259,7 +259,7 @@ void PackedPatchTable::pack(Far::PatchTable* patch_table, int offset)
|
||||
|
||||
void PackedPatchTable::copy_adjusting_offsets(uint* dest, int doffset)
|
||||
{
|
||||
uint* src = &table[0];
|
||||
uint* src = table.data();
|
||||
|
||||
/* arrays */
|
||||
for(int i = 0; i < num_arrays; i++) {
|
||||
|
||||
@@ -43,7 +43,7 @@ namespace Far { struct PatchTable; }
|
||||
#define PATCH_NODE_SIZE 1
|
||||
|
||||
struct PackedPatchTable {
|
||||
vector<uint> table;
|
||||
array<uint> table;
|
||||
|
||||
size_t num_arrays;
|
||||
size_t num_indices;
|
||||
|
||||
@@ -401,6 +401,26 @@ TEST(render_graph, constant_fold_invert_fac_0)
|
||||
graph.finalize(&scene);
|
||||
}
|
||||
|
||||
/*
|
||||
* Tests:
|
||||
* - Folding of Invert with zero Fac and constant input.
|
||||
*/
|
||||
TEST(render_graph, constant_fold_invert_fac_0_const)
|
||||
{
|
||||
DEFINE_COMMON_VARIABLES(builder, log);
|
||||
|
||||
EXPECT_ANY_MESSAGE(log);
|
||||
CORRECT_INFO_MESSAGE(log, "Folding Invert::Color to constant (0.2, 0.5, 0.8).");
|
||||
|
||||
builder
|
||||
.add_node(ShaderNodeBuilder<InvertNode>("Invert")
|
||||
.set("Fac", 0.0f)
|
||||
.set("Color", make_float3(0.2f, 0.5f, 0.8f)))
|
||||
.output_color("Invert::Color");
|
||||
|
||||
graph.finalize(&scene);
|
||||
}
|
||||
|
||||
/*
|
||||
* Tests:
|
||||
* - Folding of MixRGB Add with all constant inputs (clamp false).
|
||||
@@ -1344,6 +1364,33 @@ TEST(render_graph, constant_fold_rgb_curves_fac_0)
|
||||
graph.finalize(&scene);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Tests:
|
||||
* - Folding of RGB Curves with zero Fac and all constant inputs.
|
||||
*/
|
||||
TEST(render_graph, constant_fold_rgb_curves_fac_0_const)
|
||||
{
|
||||
DEFINE_COMMON_VARIABLES(builder, log);
|
||||
|
||||
EXPECT_ANY_MESSAGE(log);
|
||||
CORRECT_INFO_MESSAGE(log, "Folding Curves::Color to constant (0.3, 0.5, 0.7).");
|
||||
|
||||
array<float3> curve;
|
||||
init_test_curve(curve, make_float3(0.0f, 0.25f, 1.0f), make_float3(1.0f, 0.75f, 0.0f), 257);
|
||||
|
||||
builder
|
||||
.add_node(ShaderNodeBuilder<RGBCurvesNode>("Curves")
|
||||
.set(&CurvesNode::curves, curve)
|
||||
.set(&CurvesNode::min_x, 0.1f)
|
||||
.set(&CurvesNode::max_x, 0.9f)
|
||||
.set("Fac", 0.0f)
|
||||
.set("Color", make_float3(0.3f, 0.5f, 0.7f)))
|
||||
.output_color("Curves::Color");
|
||||
|
||||
graph.finalize(&scene);
|
||||
}
|
||||
|
||||
/*
|
||||
* Tests:
|
||||
* - Folding of Vector Curves with all constant inputs.
|
||||
|
||||
@@ -1316,7 +1316,8 @@ void ControlParticles::finishControl(std::vector<ControlForces> &forces, LbmFloa
|
||||
if(cvweight>1.) { cvweight = 1.; }
|
||||
// thus cvweight is in the range of 0..influenceVelocity, currently not normalized by numCParts
|
||||
cvweight *= ivel;
|
||||
if(cvweight<0.) cvweight=0.; if(cvweight>1.) cvweight=1.;
|
||||
if(cvweight<0.) cvweight=0.;
|
||||
if(cvweight>1.) cvweight=1.;
|
||||
// LBM, FIXME todo use relaxation factor
|
||||
//pvel = (cvel*0.5 * cvweight) + (pvel * (1.0-cvweight));
|
||||
forces[i].weightVel = cvweight;
|
||||
|
||||
@@ -67,8 +67,10 @@ class IsoSurface :
|
||||
/*! set # of subdivisions, this has to be done before init! */
|
||||
void setSubdivs(int s) {
|
||||
if(mInitDone) errFatal("IsoSurface::setSubdivs","Changing subdivs after init!", SIMWORLD_INITERROR);
|
||||
if(s<1) s=1; if(s>10) s=10;
|
||||
mSubdivs = s; }
|
||||
if(s<1) s=1;
|
||||
if(s>10) s=10;
|
||||
mSubdivs = s;
|
||||
}
|
||||
int getSubdivs() { return mSubdivs;}
|
||||
/*! set full edge settings, this has to be done before init! */
|
||||
void setUseFulledgeArrays(bool set) {
|
||||
|
||||
@@ -433,6 +433,7 @@ extern GHOST_TSuccess GHOST_GetButtonState(GHOST_SystemHandle systemhandle,
|
||||
GHOST_TButtonMask mask,
|
||||
int *isDown);
|
||||
|
||||
#ifdef WITH_INPUT_NDOF
|
||||
/***************************************************************************************
|
||||
* Access to 3D mouse.
|
||||
***************************************************************************************/
|
||||
@@ -442,6 +443,7 @@ extern GHOST_TSuccess GHOST_GetButtonState(GHOST_SystemHandle systemhandle,
|
||||
* \param deadzone Deadzone of the 3D mouse (both for rotation and pan) relative to full range
|
||||
*/
|
||||
extern void GHOST_setNDOFDeadZone(float deadzone);
|
||||
#endif
|
||||
|
||||
|
||||
/***************************************************************************************
|
||||
|
||||
@@ -377,11 +377,13 @@ public:
|
||||
*/
|
||||
virtual GHOST_TSuccess getButtonState(GHOST_TButtonMask mask, bool& isDown) const = 0;
|
||||
|
||||
#ifdef WITH_INPUT_NDOF
|
||||
/**
|
||||
* Sets 3D mouse deadzone
|
||||
* \param deadzone: Deadzone of the 3D mouse (both for rotation and pan) relative to full range
|
||||
*/
|
||||
virtual void setNDOFDeadZone(float deadzone) = 0;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Toggles console
|
||||
|
||||
@@ -172,8 +172,10 @@ typedef enum {
|
||||
GHOST_kEventWheel, /// Mouse wheel event
|
||||
GHOST_kEventTrackpad, /// Trackpad event
|
||||
|
||||
#ifdef WITH_INPUT_NDOF
|
||||
GHOST_kEventNDOFMotion, /// N degree of freedom device motion event
|
||||
GHOST_kEventNDOFButton, /// N degree of freedom device button event
|
||||
#endif
|
||||
|
||||
GHOST_kEventKeyDown,
|
||||
GHOST_kEventKeyUp,
|
||||
@@ -478,6 +480,7 @@ typedef enum {
|
||||
GHOST_kFinished
|
||||
} GHOST_TProgress;
|
||||
|
||||
#ifdef WITH_INPUT_NDOF
|
||||
typedef struct {
|
||||
/** N-degree of freedom device data v3 [GSoC 2010] */
|
||||
// Each component normally ranges from -1 to +1, but can exceed that.
|
||||
@@ -497,6 +500,7 @@ typedef struct {
|
||||
GHOST_TButtonAction action;
|
||||
short button;
|
||||
} GHOST_TEventNDOFButtonData;
|
||||
#endif // WITH_INPUT_NDOF
|
||||
|
||||
typedef struct {
|
||||
/** The key code. */
|
||||
|
||||
@@ -406,12 +406,13 @@ GHOST_TSuccess GHOST_GetButtonState(GHOST_SystemHandle systemhandle,
|
||||
}
|
||||
|
||||
|
||||
#ifdef WITH_INPUT_NDOF
|
||||
void GHOST_setNDOFDeadZone(float deadzone)
|
||||
{
|
||||
GHOST_ISystem *system = GHOST_ISystem::getSystem();
|
||||
system->setNDOFDeadZone(deadzone);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void GHOST_setAcceptDragOperation(GHOST_WindowHandle windowhandle, GHOST_TInt8 canAccept)
|
||||
{
|
||||
|
||||
@@ -183,6 +183,7 @@ static int weight_pixel_format(PIXELFORMATDESCRIPTOR &pfd, PIXELFORMATDESCRIPTOR
|
||||
!(pfd.dwFlags & PFD_DOUBLEBUFFER) || /* Blender _needs_ this */
|
||||
!(pfd.iPixelType == PFD_TYPE_RGBA) ||
|
||||
(pfd.cDepthBits < 16) ||
|
||||
(pfd.cColorBits > 32) || /* 64 bit formats disable aero */
|
||||
(pfd.dwFlags & PFD_GENERIC_FORMAT)) /* no software renderers */
|
||||
{
|
||||
return 0;
|
||||
|
||||
@@ -22,9 +22,12 @@
|
||||
|
||||
/** \file ghost/intern/GHOST_EventNDOF.h
|
||||
* \ingroup GHOST
|
||||
* Declaration of GHOST_EventManager class.
|
||||
*/
|
||||
|
||||
#ifndef WITH_INPUT_NDOF
|
||||
# error NDOF code included in non-NDOF-enabled build
|
||||
#endif
|
||||
|
||||
#ifndef __GHOST_EVENTNDOF_H__
|
||||
#define __GHOST_EVENTNDOF_H__
|
||||
|
||||
|
||||
@@ -21,6 +21,10 @@
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#ifndef WITH_INPUT_NDOF
|
||||
# error NDOF code included in non-NDOF-enabled build
|
||||
#endif
|
||||
|
||||
#ifndef __GHOST_NDOFMANAGER_H__
|
||||
#define __GHOST_NDOFMANAGER_H__
|
||||
|
||||
|
||||
@@ -24,8 +24,6 @@
|
||||
#ifndef __GHOST_NDOFMANAGERCOCOA_H__
|
||||
#define __GHOST_NDOFMANAGERCOCOA_H__
|
||||
|
||||
#ifdef WITH_INPUT_NDOF
|
||||
|
||||
#include "GHOST_NDOFManager.h"
|
||||
|
||||
// Event capture is handled within the NDOF manager on Macintosh,
|
||||
@@ -40,6 +38,4 @@ public:
|
||||
bool available();
|
||||
};
|
||||
|
||||
|
||||
#endif // WITH_INPUT_NDOF
|
||||
#endif // #include guard
|
||||
|
||||
@@ -21,8 +21,6 @@
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#ifdef WITH_INPUT_NDOF
|
||||
|
||||
#define DEBUG_NDOF_DRIVER false
|
||||
|
||||
#include "GHOST_NDOFManagerCocoa.h"
|
||||
@@ -115,13 +113,15 @@ static void* load_func(void* module, const char* func_name)
|
||||
|
||||
#define LOAD_FUNC(name) name = (name##_ptr) load_func(module, #name)
|
||||
|
||||
static void* module; // handle to the whole driver
|
||||
|
||||
static bool load_driver_functions()
|
||||
{
|
||||
if (driver_loaded) {
|
||||
return true;
|
||||
}
|
||||
|
||||
void* module = dlopen("3DconnexionClient.framework/3DconnexionClient", RTLD_LAZY | RTLD_LOCAL);
|
||||
module = dlopen("3DconnexionClient.framework/3DconnexionClient", RTLD_LAZY | RTLD_LOCAL);
|
||||
|
||||
if (module) {
|
||||
LOAD_FUNC(SetConnexionHandlers);
|
||||
@@ -145,8 +145,6 @@ static bool load_driver_functions()
|
||||
|
||||
has_old_driver = (SetConnexionClientButtonMask == NULL);
|
||||
}
|
||||
|
||||
dlclose(module); // functions will remain loaded
|
||||
}
|
||||
#if DEBUG_NDOF_DRIVER
|
||||
else {
|
||||
@@ -161,6 +159,10 @@ static bool load_driver_functions()
|
||||
return driver_loaded;
|
||||
}
|
||||
|
||||
static void unload_driver()
|
||||
{
|
||||
dlclose(module);
|
||||
}
|
||||
|
||||
static void DeviceAdded(uint32_t unused)
|
||||
{
|
||||
@@ -210,7 +212,9 @@ static void DeviceEvent(uint32_t unused, uint32_t msg_type, void* msg_arg)
|
||||
case kConnexionCmdHandleButtons:
|
||||
{
|
||||
int button_bits = has_old_driver ? s->buttons8 : s->buttons;
|
||||
#ifdef DEBUG_NDOF_BUTTONS
|
||||
printf("button bits: 0x%08x\n", button_bits);
|
||||
#endif
|
||||
ndof_manager->updateButtons(button_bits, now);
|
||||
ghost_system->notifyExternalEventProcessed();
|
||||
break;
|
||||
@@ -266,6 +270,7 @@ GHOST_NDOFManagerCocoa::~GHOST_NDOFManagerCocoa()
|
||||
if (driver_loaded) {
|
||||
UnregisterConnexionClient(clientID);
|
||||
CleanupConnexionHandlers();
|
||||
unload_driver();
|
||||
|
||||
ghost_system = NULL;
|
||||
ndof_manager = NULL;
|
||||
@@ -276,5 +281,3 @@ bool GHOST_NDOFManagerCocoa::available()
|
||||
{
|
||||
return driver_loaded;
|
||||
}
|
||||
|
||||
#endif // WITH_INPUT_NDOF
|
||||
|
||||
@@ -21,8 +21,6 @@
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#ifdef WITH_INPUT_NDOF
|
||||
|
||||
#include "GHOST_NDOFManagerUnix.h"
|
||||
#include "GHOST_System.h"
|
||||
|
||||
@@ -144,5 +142,3 @@ bool GHOST_NDOFManagerUnix::processEvents()
|
||||
|
||||
return anyProcessed;
|
||||
}
|
||||
|
||||
#endif /* WITH_INPUT_NDOF */
|
||||
|
||||
@@ -24,8 +24,6 @@
|
||||
#ifndef __GHOST_NDOFMANAGERUNIX_H__
|
||||
#define __GHOST_NDOFMANAGERUNIX_H__
|
||||
|
||||
#ifdef WITH_INPUT_NDOF
|
||||
|
||||
#include "GHOST_NDOFManager.h"
|
||||
|
||||
/* Event capture is handled within the NDOF manager on Linux,
|
||||
@@ -43,5 +41,4 @@ private:
|
||||
bool m_available;
|
||||
};
|
||||
|
||||
#endif /* WITH_INPUT_NDOF */
|
||||
#endif /* __GHOST_NDOFMANAGERUNIX_H__ */
|
||||
|
||||
@@ -22,8 +22,6 @@
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#ifdef WITH_INPUT_NDOF // use contents of this file
|
||||
|
||||
#include "GHOST_NDOFManagerWin32.h"
|
||||
|
||||
|
||||
@@ -40,5 +38,3 @@ bool GHOST_NDOFManagerWin32::available()
|
||||
// always available since RawInput is built into Windows
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif // WITH_INPUT_NDOF
|
||||
|
||||
@@ -25,8 +25,6 @@
|
||||
#ifndef __GHOST_NDOFMANAGERWIN32_H__
|
||||
#define __GHOST_NDOFMANAGERWIN32_H__
|
||||
|
||||
#ifdef WITH_INPUT_NDOF
|
||||
|
||||
#include "GHOST_NDOFManager.h"
|
||||
|
||||
|
||||
@@ -37,6 +35,4 @@ public:
|
||||
bool available();
|
||||
};
|
||||
|
||||
|
||||
#endif // WITH_INPUT_NDOF
|
||||
#endif // #include guard
|
||||
|
||||
@@ -38,11 +38,13 @@
|
||||
|
||||
#include "GHOST_DisplayManager.h"
|
||||
#include "GHOST_EventManager.h"
|
||||
#include "GHOST_NDOFManager.h"
|
||||
#include "GHOST_TimerTask.h"
|
||||
#include "GHOST_TimerManager.h"
|
||||
#include "GHOST_WindowManager.h"
|
||||
|
||||
#ifdef WITH_INPUT_NDOF
|
||||
# include "GHOST_NDOFManager.h"
|
||||
#endif
|
||||
|
||||
GHOST_System::GHOST_System()
|
||||
: m_nativePixel(false),
|
||||
@@ -292,14 +294,12 @@ GHOST_TSuccess GHOST_System::getButtonState(GHOST_TButtonMask mask, bool& isDown
|
||||
return success;
|
||||
}
|
||||
|
||||
#ifdef WITH_INPUT_NDOF
|
||||
void GHOST_System::setNDOFDeadZone(float deadzone)
|
||||
{
|
||||
#ifdef WITH_INPUT_NDOF
|
||||
this->m_ndofManager->setDeadZone(deadzone);
|
||||
#else
|
||||
(void)deadzone;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
GHOST_TSuccess GHOST_System::init()
|
||||
{
|
||||
@@ -345,6 +345,7 @@ GHOST_TSuccess GHOST_System::exit()
|
||||
delete m_ndofManager;
|
||||
m_ndofManager = NULL;
|
||||
#endif
|
||||
|
||||
return GHOST_kSuccess;
|
||||
}
|
||||
|
||||
|
||||
@@ -48,7 +48,9 @@ class GHOST_Event;
|
||||
class GHOST_TimerManager;
|
||||
class GHOST_Window;
|
||||
class GHOST_WindowManager;
|
||||
#ifdef WITH_INPUT_NDOF
|
||||
class GHOST_NDOFManager;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Implementation of platform independent functionality of the GHOST_ISystem
|
||||
@@ -236,6 +238,7 @@ public:
|
||||
*/
|
||||
GHOST_TSuccess getButtonState(GHOST_TButtonMask mask, bool& isDown) const;
|
||||
|
||||
#ifdef WITH_INPUT_NDOF
|
||||
/***************************************************************************************
|
||||
* Access to 3D mouse.
|
||||
***************************************************************************************/
|
||||
@@ -245,6 +248,7 @@ public:
|
||||
* \param deadzone: Deadzone of the 3D mouse (both for rotation and pan) relative to full range
|
||||
*/
|
||||
void setNDOFDeadZone(float deadzone);
|
||||
#endif
|
||||
|
||||
/***************************************************************************************
|
||||
* Other (internal) functionality.
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
#include "GHOST_WindowWin32.h"
|
||||
|
||||
#ifdef WITH_INPUT_NDOF
|
||||
#include "GHOST_NDOFManagerWin32.h"
|
||||
#include "GHOST_NDOFManagerWin32.h"
|
||||
#endif
|
||||
|
||||
// Key code values not found in winuser.h
|
||||
@@ -125,9 +125,9 @@
|
||||
static void initRawInput()
|
||||
{
|
||||
#ifdef WITH_INPUT_NDOF
|
||||
#define DEVICE_COUNT 2
|
||||
#define DEVICE_COUNT 2
|
||||
#else
|
||||
#define DEVICE_COUNT 1
|
||||
#define DEVICE_COUNT 1
|
||||
#endif
|
||||
|
||||
RAWINPUTDEVICE devices[DEVICE_COUNT];
|
||||
|
||||
@@ -145,27 +145,29 @@ bool ConstraintSet::closeLoop(){
|
||||
//toggle=!toggle;
|
||||
//svd_boost_Macie(Jf,U,S,V,B,temp,1e-3*threshold,toggle);
|
||||
int ret = KDL::svd_eigen_HH(m_Jf,m_U,m_S,m_V,m_temp);
|
||||
if(ret<0)
|
||||
return false;
|
||||
if(ret<0)
|
||||
return false;
|
||||
|
||||
// the reference point and frame of the jacobian is the base frame
|
||||
// m_externalPose-m_internalPose is the twist to extend the end effector
|
||||
// to get the required pose => change the reference point to the base frame
|
||||
Twist twist_delta(diff(m_internalPose,m_externalPose));
|
||||
twist_delta=twist_delta.RefPoint(-m_internalPose.p);
|
||||
for(unsigned int i=0;i<6;i++)
|
||||
m_tdelta(i)=twist_delta(i);
|
||||
//TODO: use damping in constraintset inversion?
|
||||
for(unsigned int i=0;i<6;i++)
|
||||
if(m_S(i)<m_threshold){
|
||||
for(unsigned int i=0;i<6;i++)
|
||||
m_tdelta(i)=twist_delta(i);
|
||||
//TODO: use damping in constraintset inversion?
|
||||
for(unsigned int i=0;i<6;i++) {
|
||||
if(m_S(i)<m_threshold){
|
||||
m_B.row(i).setConstant(0.0);
|
||||
}else
|
||||
m_B.row(i) = m_U.col(i)/m_S(i);
|
||||
} else {
|
||||
m_B.row(i) = m_U.col(i)/m_S(i);
|
||||
}
|
||||
}
|
||||
|
||||
m_Jf_inv.noalias()=m_V*m_B;
|
||||
m_Jf_inv.noalias()=m_V*m_B;
|
||||
|
||||
m_chi.noalias()+=m_Jf_inv*m_tdelta;
|
||||
updateJacobian();
|
||||
m_chi.noalias()+=m_Jf_inv*m_tdelta;
|
||||
updateJacobian();
|
||||
// m_externalPose-m_internalPose in end effector frame
|
||||
// this is just to compare the pose, a different formula would work too
|
||||
return Equal(m_internalPose.Inverse()*m_externalPose,F_identity,m_threshold);
|
||||
|
||||
@@ -146,11 +146,11 @@ bool Scene::addObject(const std::string& name, Object* object, UncontrolledObjec
|
||||
|
||||
bool Scene::addConstraintSet(const std::string& name,ConstraintSet* task,const std::string& object1,const std::string& object2, const std::string& ee1, const std::string& ee2)
|
||||
{
|
||||
//Check if objects exist:
|
||||
ObjectMap::iterator object1_it = objects.find(object1);
|
||||
ObjectMap::iterator object2_it = objects.find(object2);
|
||||
if(object1_it==objects.end()||object2_it==objects.end())
|
||||
return false;
|
||||
//Check if objects exist:
|
||||
ObjectMap::iterator object1_it = objects.find(object1);
|
||||
ObjectMap::iterator object2_it = objects.find(object2);
|
||||
if(object1_it==objects.end()||object2_it==objects.end())
|
||||
return false;
|
||||
int ee1_index = object1_it->second->object->addEndEffector(ee1);
|
||||
int ee2_index = object2_it->second->object->addEndEffector(ee2);
|
||||
if (ee1_index < 0 || ee2_index < 0)
|
||||
@@ -159,11 +159,11 @@ bool Scene::addConstraintSet(const std::string& name,ConstraintSet* task,const s
|
||||
constraints.insert(ConstraintMap::value_type(name,new ConstraintSet_struct(
|
||||
task,object1_it,ee1_index,object2_it,ee2_index,
|
||||
Range(m_ncTotal,task->getNrOfConstraints()),Range(6*m_nsets,6))));
|
||||
if(!result.second)
|
||||
return false;
|
||||
m_ncTotal+=task->getNrOfConstraints();
|
||||
m_nsets+=1;
|
||||
return true;
|
||||
if(!result.second)
|
||||
return false;
|
||||
m_ncTotal+=task->getNrOfConstraints();
|
||||
m_nsets+=1;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Scene::addSolver(Solver* _solver){
|
||||
|
||||
@@ -60,7 +60,7 @@ bool WSDLSSolver::solve(const e_matrix& A, const e_vector& Wy, const e_vector& y
|
||||
e_scalar N, M;
|
||||
|
||||
// Create the Weighted jacobian
|
||||
m_AWq.noalias() = A*Wq;
|
||||
m_AWq.noalias() = A*Wq;
|
||||
for (i=0; i<m_nc; i++)
|
||||
m_WyAWq.row(i) = Wy(i)*m_AWq.row(i);
|
||||
|
||||
@@ -72,11 +72,11 @@ bool WSDLSSolver::solve(const e_matrix& A, const e_vector& Wy, const e_vector& y
|
||||
} else {
|
||||
ret = KDL::svd_eigen_HH(m_WyAWq,m_U,m_S,m_V,m_temp);
|
||||
}
|
||||
if(ret<0)
|
||||
return false;
|
||||
if(ret<0)
|
||||
return false;
|
||||
|
||||
m_Wy_ydot = Wy.array() * ydot.array();
|
||||
m_WqV.noalias() = Wq*m_V;
|
||||
m_WqV.noalias() = Wq*m_V;
|
||||
qdot.setZero();
|
||||
e_scalar maxDeltaS = e_scalar(0.0);
|
||||
e_scalar prevS = e_scalar(0.0);
|
||||
|
||||
@@ -115,7 +115,7 @@ static Transform g_transform;
|
||||
struct OpenSubdiv_GLMeshFVarData
|
||||
{
|
||||
OpenSubdiv_GLMeshFVarData() :
|
||||
texture_buffer(0) {
|
||||
texture_buffer(0), offset_buffer(0) {
|
||||
}
|
||||
|
||||
~OpenSubdiv_GLMeshFVarData()
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
|
Before Width: | Height: | Size: 4.4 MiB After Width: | Height: | Size: 4.4 MiB |
Binary file not shown.
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 16 KiB |
File diff suppressed because it is too large
Load Diff
|
Before Width: | Height: | Size: 671 KiB After Width: | Height: | Size: 702 KiB |
@@ -230,12 +230,13 @@ def dump_rna_messages(msgs, reports, settings, verbose=False):
|
||||
_rna = {getattr(bpy.types, cls) for cls in dir(bpy.types)}
|
||||
|
||||
# Classes which are attached to collections can be skipped too, these are api access only.
|
||||
for cls in _rna:
|
||||
for prop in cls.bl_rna.properties:
|
||||
if prop.type == 'COLLECTION':
|
||||
prop_cls = prop.srna
|
||||
if prop_cls is not None:
|
||||
blacklist_rna_class.add(prop_cls.__class__)
|
||||
# XXX This is not true, some of those show in UI, see e.g. tooltip of KeyingSets.active...
|
||||
#~ for cls in _rna:
|
||||
#~ for prop in cls.bl_rna.properties:
|
||||
#~ if prop.type == 'COLLECTION':
|
||||
#~ prop_cls = prop.srna
|
||||
#~ if prop_cls is not None:
|
||||
#~ blacklist_rna_class.add(prop_cls.__class__)
|
||||
|
||||
# Now here is the *ugly* hack!
|
||||
# Unfortunately, all classes we want to access are not available from bpy.types (OperatorProperties subclasses
|
||||
@@ -375,6 +376,7 @@ def dump_rna_messages(msgs, reports, settings, verbose=False):
|
||||
walk_keymap_hierarchy(lvl[3], msgsrc)
|
||||
|
||||
# Dump Messages
|
||||
operator_categories = {}
|
||||
def process_cls_list(cls_list):
|
||||
if not cls_list:
|
||||
return
|
||||
@@ -391,6 +393,16 @@ def dump_rna_messages(msgs, reports, settings, verbose=False):
|
||||
cls_id = bl_rna.identifier + "." + cls_id
|
||||
bl_rna = bl_rna.base
|
||||
return cls_id
|
||||
|
||||
def operator_category(cls):
|
||||
"""Extract operators' categories, as displayed in 'search' space menu."""
|
||||
# NOTE: keep in sync with C code in ui_searchbox_region_draw_cb__operator().
|
||||
if issubclass(cls, bpy.types.OperatorProperties) and "_OT_" in cls.__name__:
|
||||
cat_id = cls.__name__.split("_OT_")[0]
|
||||
if cat_id not in operator_categories:
|
||||
cat_str = cat_id.capitalize() + ":"
|
||||
operator_categories[cat_id] = cat_str
|
||||
|
||||
if verbose:
|
||||
print(cls_list)
|
||||
cls_list.sort(key=full_class_id)
|
||||
@@ -402,6 +414,7 @@ def dump_rna_messages(msgs, reports, settings, verbose=False):
|
||||
if (cls in blacklist_rna_class) or issubclass(cls, bpy.types.Operator):
|
||||
reports["rna_structs_skipped"].append(cls)
|
||||
else:
|
||||
operator_category(cls)
|
||||
walk_class(cls)
|
||||
# Recursively process subclasses.
|
||||
process_cls_list(cls.__subclasses__())
|
||||
@@ -409,6 +422,11 @@ def dump_rna_messages(msgs, reports, settings, verbose=False):
|
||||
# Parse everything (recursively parsing from bpy_struct "class"...).
|
||||
process_cls_list(bpy.types.ID.__base__.__subclasses__())
|
||||
|
||||
# Finalize generated 'operator categories' messages.
|
||||
for cat_str in operator_categories.values():
|
||||
process_msg(msgs, bpy.app.translations.contexts.operator_default, cat_str, "Generated operator category",
|
||||
reports, check_ctxt_rna, settings)
|
||||
|
||||
# And parse keymaps!
|
||||
from bpy_extras.keyconfig_utils import KM_HIERARCHY
|
||||
walk_keymap_hierarchy(KM_HIERARCHY, "KM_HIERARCHY")
|
||||
|
||||
@@ -153,7 +153,7 @@ class SpellChecker:
|
||||
"realtime",
|
||||
"rekey",
|
||||
"remesh",
|
||||
"reprojection",
|
||||
"reprojection", "reproject",
|
||||
"resize",
|
||||
"restpose",
|
||||
"retarget", "retargets", "retargeting", "retargeted",
|
||||
@@ -197,6 +197,7 @@ class SpellChecker:
|
||||
"unmute",
|
||||
"unpremultiply",
|
||||
"unprojected",
|
||||
"unprotect",
|
||||
"unreacted",
|
||||
"unregister",
|
||||
"unselected", "unselectable",
|
||||
@@ -476,6 +477,12 @@ class SpellChecker:
|
||||
"wpaint",
|
||||
"uvwarp",
|
||||
|
||||
# UOC (Ugly Operator Categories)
|
||||
"cachefile",
|
||||
"paintcurve",
|
||||
"ptcache",
|
||||
"dpaint",
|
||||
|
||||
# Algorithm/library names
|
||||
"ashikhmin", # Ashikhmin-Shirley
|
||||
"beckmann",
|
||||
@@ -493,6 +500,7 @@ class SpellChecker:
|
||||
"musgrave",
|
||||
"nayar",
|
||||
"netravali",
|
||||
"ogawa",
|
||||
"oren",
|
||||
"preetham",
|
||||
"prewitt",
|
||||
|
||||
@@ -169,7 +169,7 @@ def do_previews(do_objects, do_groups, do_scenes, do_data_intern):
|
||||
scene.objects.unlink(bpy.data.objects[render_context.camera, None])
|
||||
if render_context.lamp:
|
||||
scene.objects.unlink(bpy.data.objects[render_context.lamp, None])
|
||||
bpy.data.scenes.remove(scene)
|
||||
bpy.data.scenes.remove(scene, do_unlink=True)
|
||||
scene = None
|
||||
else:
|
||||
rna_backup_restore(scene, render_context.backup_scene)
|
||||
|
||||
@@ -365,6 +365,7 @@ class AlignObjects(Operator):
|
||||
)
|
||||
align_mode = EnumProperty(
|
||||
name="Align Mode:",
|
||||
description="Side of object to use for alignment",
|
||||
items=(('OPT_1', "Negative Sides", ""),
|
||||
('OPT_2', "Centers", ""),
|
||||
('OPT_3', "Positive Sides", ""),
|
||||
@@ -373,10 +374,11 @@ class AlignObjects(Operator):
|
||||
)
|
||||
relative_to = EnumProperty(
|
||||
name="Relative To:",
|
||||
items=(('OPT_1', "Scene Origin", ""),
|
||||
('OPT_2', "3D Cursor", ""),
|
||||
('OPT_3', "Selection", ""),
|
||||
('OPT_4', "Active", ""),
|
||||
description="Reference location to align to",
|
||||
items=(('OPT_1', "Scene Origin", "Use the Scene Origin as the position for the selected objects to align to"),
|
||||
('OPT_2', "3D Cursor", "Use the 3D cursor as the position for the selected objects to align to"),
|
||||
('OPT_3', "Selection", "Use the selected objects as the position for the selected objects to align to"),
|
||||
('OPT_4', "Active", "Use the active object as the position for the selected objects to align to"),
|
||||
),
|
||||
default='OPT_4',
|
||||
)
|
||||
|
||||
@@ -900,9 +900,13 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
|
||||
split = layout.split()
|
||||
col = split.column()
|
||||
|
||||
engine = bpy.context.scene.render.engine
|
||||
if engine == "CYCLES" and md == ob.modifiers[-1] and bpy.context.scene.cycles.feature_set == "EXPERIMENTAL":
|
||||
col.label(text="Preview:")
|
||||
scene = bpy.context.scene
|
||||
engine = scene.render.engine
|
||||
show_adaptive_options = (engine == "CYCLES" and md == ob.modifiers[-1] and
|
||||
scene.cycles.feature_set == "EXPERIMENTAL")
|
||||
|
||||
if show_adaptive_options:
|
||||
col.label(text="View:")
|
||||
col.prop(md, "levels", text="Levels")
|
||||
col.label(text="Render:")
|
||||
col.prop(ob.cycles, "use_adaptive_subdivision", text="Adaptive")
|
||||
@@ -917,11 +921,26 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
|
||||
|
||||
col = split.column()
|
||||
col.label(text="Options:")
|
||||
col.prop(md, "use_subsurf_uv")
|
||||
|
||||
sub = col.column()
|
||||
sub.active = (not show_adaptive_options) or (not ob.cycles.use_adaptive_subdivision)
|
||||
sub.prop(md, "use_subsurf_uv")
|
||||
|
||||
col.prop(md, "show_only_control_edges")
|
||||
if hasattr(md, "use_opensubdiv"):
|
||||
col.prop(md, "use_opensubdiv")
|
||||
|
||||
if show_adaptive_options and ob.cycles.use_adaptive_subdivision:
|
||||
col = layout.column(align=True)
|
||||
col.scale_y = 0.6
|
||||
col.separator()
|
||||
col.label("Final Dicing Rate:")
|
||||
col.separator()
|
||||
|
||||
render = max(scene.cycles.dicing_rate * ob.cycles.dicing_rate, 0.1)
|
||||
preview = max(scene.cycles.preview_dicing_rate * ob.cycles.dicing_rate, 0.1)
|
||||
col.label("Render %.2f px, Preview %.2f px" % (render, preview))
|
||||
|
||||
def SURFACE(self, layout, ob, md):
|
||||
layout.label(text="Settings are inside the Physics tab")
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
|
||||
from bpy.types import Menu, UIList
|
||||
from bpy.app.translations import pgettext_iface as iface_
|
||||
|
||||
|
||||
def gpencil_stroke_placement_settings(context, layout):
|
||||
@@ -52,6 +53,34 @@ def gpencil_stroke_placement_settings(context, layout):
|
||||
row.prop(ts, "use_gpencil_stroke_endpoints")
|
||||
|
||||
|
||||
def gpencil_active_brush_settings_simple(context, layout):
|
||||
brush = context.active_gpencil_brush
|
||||
|
||||
col = layout.column()
|
||||
col.label("Active Brush: ")
|
||||
|
||||
row = col.row(align=True)
|
||||
row.operator_context = 'EXEC_REGION_WIN'
|
||||
row.operator_menu_enum("gpencil.brush_change", "brush", text="", icon='BRUSH_DATA')
|
||||
row.prop(brush, "name", text="")
|
||||
|
||||
col.prop(brush, "line_width", slider=True)
|
||||
row = col.row(align=True)
|
||||
row.prop(brush, "use_random_pressure", text='', icon='RNDCURVE')
|
||||
row.prop(brush, "pen_sensitivity_factor", slider=True)
|
||||
row.prop(brush, "use_pressure", text='', icon='STYLUS_PRESSURE')
|
||||
row = col.row(align=True)
|
||||
row.prop(brush, "use_random_strength", text='', icon='RNDCURVE')
|
||||
row.prop(brush, "strength", slider=True)
|
||||
row.prop(brush, "use_strength_pressure", text='', icon='STYLUS_PRESSURE')
|
||||
row = col.row(align=True)
|
||||
row.prop(brush, "jitter", slider=True)
|
||||
row.prop(brush, "use_jitter_pressure", text='', icon='STYLUS_PRESSURE')
|
||||
row = col.row()
|
||||
row.prop(brush, "angle", slider=True)
|
||||
row.prop(brush, "angle_factor", text="Factor", slider=True)
|
||||
|
||||
|
||||
class GreasePencilDrawingToolsPanel:
|
||||
# subclass must set
|
||||
# bl_space_type = 'IMAGE_EDITOR'
|
||||
@@ -197,6 +226,10 @@ class GreasePencilStrokeEditPanel:
|
||||
if gpd:
|
||||
col.prop(gpd, "show_stroke_direction", text="Show Directions")
|
||||
|
||||
if is_3d_view:
|
||||
layout.separator()
|
||||
layout.operator("gpencil.reproject")
|
||||
|
||||
|
||||
class GreasePencilBrushPanel:
|
||||
# subclass must set
|
||||
@@ -460,29 +493,7 @@ class GPENCIL_PIE_settings_palette(Menu):
|
||||
col.prop(palcolor, "fill_alpha", text="", slider=True)
|
||||
|
||||
# S Brush settings
|
||||
col = pie.column()
|
||||
col.label("Active Brush: ")
|
||||
|
||||
row = col.row()
|
||||
row.operator_context = 'EXEC_REGION_WIN'
|
||||
row.operator_menu_enum("gpencil.brush_change", "brush", text="", icon='BRUSH_DATA')
|
||||
row.prop(brush, "name", text="")
|
||||
|
||||
col.prop(brush, "line_width", slider=True)
|
||||
row = col.row(align=True)
|
||||
row.prop(brush, "use_random_pressure", text='', icon='RNDCURVE')
|
||||
row.prop(brush, "pen_sensitivity_factor", slider=True)
|
||||
row.prop(brush, "use_pressure", text='', icon='STYLUS_PRESSURE')
|
||||
row = col.row(align=True)
|
||||
row.prop(brush, "use_random_strength", text='', icon='RNDCURVE')
|
||||
row.prop(brush, "strength", slider=True)
|
||||
row.prop(brush, "use_strength_pressure", text='', icon='STYLUS_PRESSURE')
|
||||
row = col.row(align=True)
|
||||
row.prop(brush, "jitter", slider=True)
|
||||
row.prop(brush, "use_jitter_pressure", text='', icon='STYLUS_PRESSURE')
|
||||
row = col.row()
|
||||
row.prop(brush, "angle", slider=True)
|
||||
row.prop(brush, "angle_factor", text="Factor", slider=True)
|
||||
gpencil_active_brush_settings_simple(context, pie)
|
||||
|
||||
# N - Active Layer
|
||||
col = pie.column()
|
||||
@@ -749,6 +760,10 @@ class GPENCIL_MT_palettecolor_specials(Menu):
|
||||
layout.operator("gpencil.palettecolor_unlock_all", icon='UNLOCKED', text="UnLock All")
|
||||
layout.operator("gpencil.palettecolor_copy", icon='PASTEDOWN', text="Copy Color")
|
||||
|
||||
layout.separator()
|
||||
|
||||
layout.operator("gpencil.palettecolor_select", icon='COLOR', text="Select Strokes")
|
||||
|
||||
|
||||
class GreasePencilDataPanel:
|
||||
# subclass must set
|
||||
@@ -830,7 +845,10 @@ class GreasePencilDataPanel:
|
||||
split.prop(gpl, "show_points")
|
||||
|
||||
# Offsets + Parenting (where available)
|
||||
split = layout.split(percentage=0.5)
|
||||
if context.space_data.type == 'VIEW_3D':
|
||||
split = layout.split(percentage=0.5)
|
||||
else:
|
||||
split = layout.column() # parenting is not available in 2D editors...
|
||||
split.active = not gpl.lock
|
||||
|
||||
# Offsets - Color Tint
|
||||
@@ -864,10 +882,10 @@ class GreasePencilDataPanel:
|
||||
row.active = not gpl.lock
|
||||
|
||||
if gpl.active_frame:
|
||||
lock_status = "Locked" if gpl.lock_frame else "Unlocked"
|
||||
lock_label = "Frame: %d (%s)" % (gpl.active_frame.frame_number, lock_status)
|
||||
lock_status = iface_("Locked") if gpl.lock_frame else iface_("Unlocked")
|
||||
lock_label = iface_("Frame: %d (%s)") % (gpl.active_frame.frame_number, lock_status)
|
||||
else:
|
||||
lock_label = "Lock Frame"
|
||||
lock_label = iface_("Lock Frame")
|
||||
row.prop(gpl, "lock_frame", text=lock_label, icon='UNLOCKED')
|
||||
row.operator("gpencil.active_frame_delete", text="", icon='X')
|
||||
|
||||
@@ -952,10 +970,13 @@ class GreasePencilPaletteColorPanel:
|
||||
sub.operator("gpencil.palettecolor_move", icon='TRIA_UP', text="").direction = 'UP'
|
||||
sub.operator("gpencil.palettecolor_move", icon='TRIA_DOWN', text="").direction = 'DOWN'
|
||||
|
||||
col.separator()
|
||||
sub = col.column(align=True)
|
||||
row = layout.row()
|
||||
sub = row.row(align=True)
|
||||
sub.label(text="Isolate:") # based on active color only
|
||||
sub.operator("gpencil.palettecolor_isolate", icon='LOCKED', text="").affect_visibility = False
|
||||
sub.operator("gpencil.palettecolor_isolate", icon='RESTRICT_VIEW_OFF', text="").affect_visibility = True
|
||||
sub = row.row(align=True)
|
||||
sub.label(text="Lock:") # based on other stuff...
|
||||
sub.operator("gpencil.stroke_lock_color", icon='BORDER_RECT', text="")
|
||||
sub.operator("gpencil.palette_lock_layer", icon='COLOR', text="")
|
||||
|
||||
@@ -963,9 +984,7 @@ class GreasePencilPaletteColorPanel:
|
||||
if pcolor:
|
||||
self.draw_palettecolors(layout, pcolor)
|
||||
|
||||
# ----------------------------------------------
|
||||
# Draw palette colors
|
||||
# ----------------------------------------------
|
||||
def draw_palettecolors(self, layout, pcolor):
|
||||
# color settings
|
||||
split = layout.split(percentage=0.5)
|
||||
@@ -998,6 +1017,7 @@ class GreasePencilPaletteColorPanel:
|
||||
|
||||
|
||||
class GreasePencilToolsPanel:
|
||||
# For use in "2D" Editors without their own toolbar
|
||||
# subclass must set
|
||||
# bl_space_type = 'IMAGE_EDITOR'
|
||||
# bl_options = {'DEFAULT_CLOSED'}
|
||||
@@ -1027,4 +1047,8 @@ class GreasePencilToolsPanel:
|
||||
layout.separator()
|
||||
layout.separator()
|
||||
|
||||
gpencil_active_brush_settings_simple(context, layout)
|
||||
|
||||
layout.separator()
|
||||
|
||||
gpencil_stroke_placement_settings(context, layout)
|
||||
|
||||
@@ -345,7 +345,9 @@ class RENDER_PT_stamp(RenderButtonsPanel, Panel):
|
||||
layout.prop(rd, "use_stamp")
|
||||
col = layout.column()
|
||||
col.active = rd.use_stamp
|
||||
col.prop(rd, "stamp_font_size", text="Font Size")
|
||||
row = col.row()
|
||||
row.prop(rd, "stamp_font_size", text="Font Size")
|
||||
row.prop(rd, "use_stamp_labels", text="Draw labels")
|
||||
|
||||
row = col.row()
|
||||
row.column().prop(rd, "stamp_foreground", slider=True)
|
||||
|
||||
@@ -916,7 +916,11 @@ class CLIP_PT_stabilization(CLIP_PT_reconstruction_panel, Panel):
|
||||
|
||||
layout.prop(stab, "anchor_frame")
|
||||
|
||||
layout.prop(stab, "use_stabilize_rotation")
|
||||
row = layout.row(align=True)
|
||||
row.prop(stab, "use_stabilize_rotation", text="Rotation", toggle=True)
|
||||
sub = row.row(align=True)
|
||||
sub.active = stab.use_stabilize_rotation
|
||||
sub.prop(stab, "use_stabilize_scale", text="Scale", toggle=True)
|
||||
|
||||
box = layout.box()
|
||||
row = box.row(align=True)
|
||||
@@ -938,51 +942,44 @@ class CLIP_PT_stabilization(CLIP_PT_reconstruction_panel, Panel):
|
||||
sub.menu('CLIP_MT_stabilize_2d_specials', text="",
|
||||
icon='DOWNARROW_HLT')
|
||||
|
||||
row = box.row()
|
||||
row.label(text="Tracks For Rotation / Scale")
|
||||
row = box.row()
|
||||
row.active = stab.use_stabilize_rotation
|
||||
row.template_list("UI_UL_list", "stabilization_rotation_tracks", stab, "rotation_tracks",
|
||||
stab, "active_rotation_track_index", rows=2)
|
||||
# Usually we don't hide things from iterface, but here every pixel of
|
||||
# vertical space is precious.
|
||||
if stab.use_stabilize_rotation:
|
||||
box.label(text="Tracks For Rotation / Scale")
|
||||
row = box.row()
|
||||
row.template_list("UI_UL_list", "stabilization_rotation_tracks",
|
||||
stab, "rotation_tracks",
|
||||
stab, "active_rotation_track_index", rows=2)
|
||||
|
||||
sub = row.column(align=True)
|
||||
sub = row.column(align=True)
|
||||
|
||||
sub.operator("clip.stabilize_2d_rotation_add", icon='ZOOMIN', text="")
|
||||
sub.operator("clip.stabilize_2d_rotation_remove", icon='ZOOMOUT', text="")
|
||||
sub.operator("clip.stabilize_2d_rotation_add", icon='ZOOMIN', text="")
|
||||
sub.operator("clip.stabilize_2d_rotation_remove", icon='ZOOMOUT', text="")
|
||||
|
||||
sub.menu('CLIP_MT_stabilize_2d_rotation_specials', text="",
|
||||
icon='DOWNARROW_HLT')
|
||||
sub.menu('CLIP_MT_stabilize_2d_rotation_specials', text="",
|
||||
icon='DOWNARROW_HLT')
|
||||
|
||||
row = layout.row()
|
||||
row.active = stab.use_stabilize_rotation
|
||||
row.prop(stab, "use_stabilize_scale")
|
||||
if stab.use_autoscale:
|
||||
row = layout.row(align=True)
|
||||
row.prop(stab, "use_autoscale")
|
||||
row.prop(stab, "scale_max", text="Max")
|
||||
else:
|
||||
layout.prop(stab, "use_autoscale")
|
||||
row.prop(stab, "use_autoscale")
|
||||
sub = row.row()
|
||||
sub.active = stab.use_autoscale
|
||||
sub.prop(stab, "scale_max", text="Max")
|
||||
|
||||
layout.separator()
|
||||
layout.label(text="Expected Position")
|
||||
layout.prop(stab, "target_pos", text="")
|
||||
layout.prop(stab, "target_rot")
|
||||
if stab.use_autoscale:
|
||||
layout.label(text="Auto Scale Factor: %5.3f" % (1.0 / stab.target_zoom))
|
||||
else:
|
||||
layout.prop(stab, "target_zoom")
|
||||
col = layout.column(align=True)
|
||||
row = col.row(align=True)
|
||||
# Hrm, how to make it more obvious label?
|
||||
row.prop(stab, "target_position", text="")
|
||||
col.prop(stab, "target_rotation")
|
||||
row = col.row(align=True)
|
||||
row.prop(stab, "target_scale")
|
||||
row.active = not stab.use_autoscale
|
||||
|
||||
layout.separator()
|
||||
row = layout.row()
|
||||
row.active = 0 < len(stab.tracks.values())
|
||||
row.prop(stab, "influence_location")
|
||||
|
||||
col = layout.column()
|
||||
col.active = stab.use_stabilize_rotation and 0 < len(stab.rotation_tracks.values())
|
||||
row = col.row()
|
||||
row.prop(stab, "influence_rotation")
|
||||
row = col.row()
|
||||
row.prop(stab, "influence_scale")
|
||||
col = layout.column(align=True)
|
||||
col.prop(stab, "influence_location")
|
||||
sub = col.column(align=True)
|
||||
sub.active = stab.use_stabilize_rotation
|
||||
sub.prop(stab, "influence_rotation")
|
||||
sub.prop(stab, "influence_scale")
|
||||
|
||||
layout.prop(stab, "filter_type")
|
||||
|
||||
|
||||
@@ -1177,15 +1177,16 @@ class USERPREF_PT_input(Panel):
|
||||
sub.prop(walk, "view_height")
|
||||
sub.prop(walk, "jump_height")
|
||||
|
||||
col.separator()
|
||||
col.label(text="NDOF Device:")
|
||||
sub = col.column(align=True)
|
||||
sub.prop(inputs, "ndof_sensitivity", text="NDOF Sensitivity")
|
||||
sub.prop(inputs, "ndof_orbit_sensitivity", text="NDOF Orbit Sensitivity")
|
||||
sub.prop(inputs, "ndof_deadzone", text="NDOF Deadzone")
|
||||
sub = col.column(align=True)
|
||||
sub.row().prop(inputs, "ndof_view_navigate_method", expand=True)
|
||||
sub.row().prop(inputs, "ndof_view_rotate_method", expand=True)
|
||||
if inputs.use_ndof:
|
||||
col.separator()
|
||||
col.label(text="NDOF Device:")
|
||||
sub = col.column(align=True)
|
||||
sub.prop(inputs, "ndof_sensitivity", text="NDOF Sensitivity")
|
||||
sub.prop(inputs, "ndof_orbit_sensitivity", text="NDOF Orbit Sensitivity")
|
||||
sub.prop(inputs, "ndof_deadzone", text="NDOF Deadzone")
|
||||
sub = col.column(align=True)
|
||||
sub.row().prop(inputs, "ndof_view_navigate_method", expand=True)
|
||||
sub.row().prop(inputs, "ndof_view_rotate_method", expand=True)
|
||||
|
||||
row.separator()
|
||||
|
||||
|
||||
@@ -1000,8 +1000,7 @@ class VIEW3D_MT_select_gpencil(Menu):
|
||||
layout.operator("gpencil.select_all", text="(De)select All").action = 'TOGGLE'
|
||||
layout.operator("gpencil.select_all", text="Inverse").action = 'INVERT'
|
||||
layout.operator("gpencil.select_linked", text="Linked")
|
||||
#layout.operator_menu_enum("gpencil.select_grouped", "type", text="Grouped")
|
||||
layout.operator("gpencil.select_grouped", text="Grouped")
|
||||
layout.operator_menu_enum("gpencil.select_grouped", "type", text="Grouped")
|
||||
|
||||
layout.separator()
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ set(INC
|
||||
../makesrna
|
||||
../windowmanager
|
||||
../../../intern/guardedalloc
|
||||
../../../intern/utfconv
|
||||
)
|
||||
|
||||
set(INC_SYS
|
||||
|
||||
@@ -109,7 +109,7 @@ AbcCameraReader::AbcCameraReader(const Alembic::Abc::IObject &object, ImportSett
|
||||
ICamera abc_cam(m_iobject, kWrapExisting);
|
||||
m_schema = abc_cam.getSchema();
|
||||
|
||||
get_min_max_time(m_schema, m_min_time, m_max_time);
|
||||
get_min_max_time(m_iobject, m_schema, m_min_time, m_max_time);
|
||||
}
|
||||
|
||||
bool AbcCameraReader::valid() const
|
||||
|
||||
@@ -190,7 +190,7 @@ AbcCurveReader::AbcCurveReader(const Alembic::Abc::IObject &object, ImportSettin
|
||||
ICurves abc_curves(object, kWrapExisting);
|
||||
m_curves_schema = abc_curves.getSchema();
|
||||
|
||||
get_min_max_time(m_curves_schema, m_min_time, m_max_time);
|
||||
get_min_max_time(m_iobject, m_curves_schema, m_min_time, m_max_time);
|
||||
}
|
||||
|
||||
bool AbcCurveReader::valid() const
|
||||
|
||||
@@ -30,6 +30,10 @@
|
||||
|
||||
#include <Alembic/AbcCoreOgawa/All.h>
|
||||
|
||||
#ifdef WIN32
|
||||
# include "utfconv.h"
|
||||
#endif
|
||||
|
||||
#include "abc_camera.h"
|
||||
#include "abc_curves.h"
|
||||
#include "abc_hair.h"
|
||||
@@ -44,6 +48,7 @@ extern "C" {
|
||||
#include "DNA_curve_types.h"
|
||||
#include "DNA_mesh_types.h"
|
||||
#include "DNA_modifier_types.h"
|
||||
#include "DNA_object_types.h"
|
||||
#include "DNA_scene_types.h"
|
||||
#include "DNA_space_types.h" /* for FILE_MAX */
|
||||
|
||||
@@ -66,6 +71,54 @@ extern "C" {
|
||||
using Alembic::Abc::TimeSamplingPtr;
|
||||
using Alembic::Abc::OBox3dProperty;
|
||||
|
||||
|
||||
/* ************************************************************************** */
|
||||
|
||||
/* This kinda duplicates CreateArchiveWithInfo, but Alembic does not seem to
|
||||
* have a version supporting streams. */
|
||||
static Alembic::Abc::OArchive create_archive(std::ostream *ostream,
|
||||
const std::string &filename,
|
||||
const std::string &scene_name,
|
||||
const Alembic::Abc::Argument &arg0,
|
||||
const Alembic::Abc::Argument &arg1,
|
||||
bool ogawa)
|
||||
{
|
||||
Alembic::Abc::MetaData md = GetMetaData(arg0, arg1);
|
||||
md.set(Alembic::Abc::kApplicationNameKey, "Blender");
|
||||
md.set(Alembic::Abc::kUserDescriptionKey, scene_name);
|
||||
|
||||
time_t raw_time;
|
||||
time(&raw_time);
|
||||
char buffer[128];
|
||||
|
||||
#if defined _WIN32 || defined _WIN64
|
||||
ctime_s(buffer, 128, &raw_time);
|
||||
#else
|
||||
ctime_r(&raw_time, buffer);
|
||||
#endif
|
||||
|
||||
const std::size_t buffer_len = strlen(buffer);
|
||||
if (buffer_len > 0 && buffer[buffer_len - 1] == '\n') {
|
||||
buffer[buffer_len - 1] = '\0';
|
||||
}
|
||||
|
||||
md.set(Alembic::Abc::kDateWrittenKey, buffer);
|
||||
|
||||
Alembic::Abc::ErrorHandler::Policy policy = GetErrorHandlerPolicyFromArgs(arg0, arg1);
|
||||
|
||||
#ifdef WITH_ALEMBIC_HDF5
|
||||
if (!ogawa) {
|
||||
return Alembic::Abc::OArchive(Alembic::AbcCoreHDF5::WriteArchive(), filename, md, policy);
|
||||
}
|
||||
#else
|
||||
static_cast<void>(filename);
|
||||
static_cast<void>(ogawa);
|
||||
#endif
|
||||
|
||||
Alembic::AbcCoreOgawa::WriteArchive archive_writer;
|
||||
return Alembic::Abc::OArchive(archive_writer(ostream, md), Alembic::Abc::kWrapExisting, policy);
|
||||
}
|
||||
|
||||
/* ************************************************************************** */
|
||||
|
||||
ExportSettings::ExportSettings()
|
||||
@@ -175,7 +228,7 @@ void AbcExporter::getShutterSamples(double step, bool time_relative,
|
||||
/* sample all frame */
|
||||
if (shutter_open == 0.0 && shutter_close == 1.0) {
|
||||
for (double t = 0; t < 1.0; t += step) {
|
||||
samples.push_back(t / time_factor);
|
||||
samples.push_back((t + m_settings.frame_start) / time_factor);
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -184,7 +237,7 @@ void AbcExporter::getShutterSamples(double step, bool time_relative,
|
||||
const double time_inc = (shutter_close - shutter_open) / nsamples;
|
||||
|
||||
for (double t = shutter_open; t <= shutter_close; t += time_inc) {
|
||||
samples.push_back(t / time_factor);
|
||||
samples.push_back((t + m_settings.frame_start) / time_factor);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -246,26 +299,25 @@ void AbcExporter::operator()(Main *bmain, float &progress, bool &was_canceled)
|
||||
|
||||
Alembic::Abc::Argument arg(md);
|
||||
|
||||
#ifdef WITH_ALEMBIC_HDF5
|
||||
if (!m_settings.export_ogawa) {
|
||||
m_archive = Alembic::Abc::CreateArchiveWithInfo(Alembic::AbcCoreHDF5::WriteArchive(),
|
||||
m_filename,
|
||||
"Blender",
|
||||
scene_name,
|
||||
Alembic::Abc::ErrorHandler::kThrowPolicy,
|
||||
arg);
|
||||
}
|
||||
else
|
||||
/* Use stream to support unicode character paths on Windows. */
|
||||
if (m_settings.export_ogawa) {
|
||||
#ifdef WIN32
|
||||
UTF16_ENCODE(m_filename);
|
||||
std::wstring wstr(m_filename_16);
|
||||
m_out_file.open(wstr.c_str(), std::ios::out | std::ios::binary);
|
||||
UTF16_UN_ENCODE(m_filename);
|
||||
#else
|
||||
m_out_file.open(m_filename, std::ios::out | std::ios::binary);
|
||||
#endif
|
||||
{
|
||||
m_archive = Alembic::Abc::CreateArchiveWithInfo(Alembic::AbcCoreOgawa::WriteArchive(),
|
||||
m_filename,
|
||||
"Blender",
|
||||
scene_name,
|
||||
Alembic::Abc::ErrorHandler::kThrowPolicy,
|
||||
arg);
|
||||
}
|
||||
|
||||
m_archive = create_archive(&m_out_file,
|
||||
m_filename,
|
||||
scene_name,
|
||||
Alembic::Abc::ErrorHandler::kThrowPolicy,
|
||||
arg,
|
||||
m_settings.export_ogawa);
|
||||
|
||||
/* Create time samplings for transforms and shapes. */
|
||||
|
||||
TimeSamplingPtr trans_time = createTimeSampling(m_settings.frame_step_xform);
|
||||
@@ -325,16 +377,18 @@ void AbcExporter::operator()(Main *bmain, float &progress, bool &was_canceled)
|
||||
break;
|
||||
}
|
||||
|
||||
double f = *begin;
|
||||
setCurrentFrame(bmain, f);
|
||||
const double frame = *begin;
|
||||
|
||||
if (shape_frames.count(f) != 0) {
|
||||
/* 'frame' is offset by start frame, so need to cancel the offset. */
|
||||
setCurrentFrame(bmain, frame - m_settings.frame_start);
|
||||
|
||||
if (shape_frames.count(frame) != 0) {
|
||||
for (int i = 0, e = m_shapes.size(); i != e; ++i) {
|
||||
m_shapes[i]->write();
|
||||
}
|
||||
}
|
||||
|
||||
if (xform_frames.count(f) == 0) {
|
||||
if (xform_frames.count(frame) == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#define __ABC_EXPORTER_H__
|
||||
|
||||
#include <Alembic/Abc/All.h>
|
||||
#include <fstream>
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <vector>
|
||||
@@ -75,6 +76,7 @@ class AbcExporter {
|
||||
|
||||
const char *m_filename;
|
||||
|
||||
std::ofstream m_out_file;
|
||||
Alembic::Abc::OArchive m_archive;
|
||||
unsigned int m_trans_sampling_index, m_shape_sampling_index;
|
||||
|
||||
|
||||
@@ -968,7 +968,8 @@ AbcMeshReader::AbcMeshReader(const IObject &object, ImportSettings &settings)
|
||||
|
||||
IPolyMesh ipoly_mesh(m_iobject, kWrapExisting);
|
||||
m_schema = ipoly_mesh.getSchema();
|
||||
get_min_max_time(m_schema, m_min_time, m_max_time);
|
||||
|
||||
get_min_max_time(m_iobject, m_schema, m_min_time, m_max_time);
|
||||
}
|
||||
|
||||
bool AbcMeshReader::valid() const
|
||||
@@ -1120,7 +1121,8 @@ AbcSubDReader::AbcSubDReader(const IObject &object, ImportSettings &settings)
|
||||
|
||||
ISubD isubd_mesh(m_iobject, kWrapExisting);
|
||||
m_schema = isubd_mesh.getSchema();
|
||||
get_min_max_time(m_schema, m_min_time, m_max_time);
|
||||
|
||||
get_min_max_time(m_iobject, m_schema, m_min_time, m_max_time);
|
||||
}
|
||||
|
||||
bool AbcSubDReader::valid() const
|
||||
|
||||
@@ -201,7 +201,7 @@ AbcNurbsReader::AbcNurbsReader(const IObject &object, ImportSettings &settings)
|
||||
: AbcObjectReader(object, settings)
|
||||
{
|
||||
getNurbsPatches(m_iobject);
|
||||
get_min_max_time(m_schemas[0].first, m_min_time, m_max_time);
|
||||
get_min_max_time(m_iobject, m_schemas[0].first, m_min_time, m_max_time);
|
||||
}
|
||||
|
||||
bool AbcNurbsReader::valid() const
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user