Merge branch 'gooseberry' into temp_motionpaths
Conflicts: source/blender/blenkernel/intern/object.c
This commit is contained in:
181
CMakeLists.txt
181
CMakeLists.txt
@@ -197,11 +197,10 @@ option(WITH_PYTHON "Enable Embedded Python API (only disable for develop
|
||||
option(WITH_PYTHON_SECURITY "Disables execution of scripts within blend files by default" ON)
|
||||
mark_as_advanced(WITH_PYTHON) # dont want people disabling this unless they really know what they are doing.
|
||||
mark_as_advanced(WITH_PYTHON_SECURITY) # some distributions see this as a security issue, rather than have them patch it, make a build option.
|
||||
set(WITH_PYTHON_SECURITY ON CACHE BOOL "ON" FORCE) # temp force on.
|
||||
|
||||
option(WITH_PYTHON_SAFETY "Enable internal API error checking to track invalid data to prevent crash on access (at the expense of some effeciency, only enable for development)." OFF)
|
||||
mark_as_advanced(WITH_PYTHON_SAFETY)
|
||||
option(WITH_PYTHON_MODULE "Enable building as a python module which runs without a user interface, like running regular blender in background mode (experimental, only enable for development)" OFF)
|
||||
option(WITH_PYTHON_MODULE "Enable building as a python module which runs without a user interface, like running regular blender in background mode (experimental, only enable for development), installs to PYTHON_SITE_PACKAGES (or CMAKE_INSTALL_PREFIX if WITH_INSTALL_PORTABLE is enabled)." OFF)
|
||||
if(APPLE)
|
||||
option(WITH_PYTHON_FRAMEWORK "Enable building using the Python available in the framework (OSX only)" OFF)
|
||||
endif()
|
||||
@@ -261,6 +260,10 @@ endif()
|
||||
# (unix defaults to System OpenJPEG On)
|
||||
option(WITH_SYSTEM_OPENJPEG "Use the operating systems OpenJPEG library" OFF)
|
||||
|
||||
if(UNIX AND NOT APPLE)
|
||||
option(WITH_SYSTEM_EIGEN3 "Use the systems Eigen3 library" OFF)
|
||||
endif()
|
||||
|
||||
|
||||
# Modifiers
|
||||
option(WITH_MOD_FLUID "Enable Elbeem Modifier (Fluid Simulation)" ON)
|
||||
@@ -271,6 +274,10 @@ option(WITH_MOD_REMESH "Enable Remesh Modifier" ON)
|
||||
# mark_as_advanced(WITH_MOD_CLOTH_ELTOPO)
|
||||
option(WITH_MOD_OCEANSIM "Enable Ocean Modifier" OFF)
|
||||
|
||||
# Alembic
|
||||
option(WITH_ALEMBIC "Enable Alembic Support" OFF)
|
||||
option(WITH_HDF5 "Enable HDF5 Support for Alembic" OFF)
|
||||
|
||||
# Image format support
|
||||
option(WITH_OPENIMAGEIO "Enable OpenImageIO Support (http://www.openimageio.org)" ON)
|
||||
option(WITH_IMAGE_OPENEXR "Enable OpenEXR Support (http://www.openexr.com)" ${_init_IMAGE_OPENEXR})
|
||||
@@ -309,6 +316,9 @@ endif()
|
||||
# Compression
|
||||
option(WITH_LZO "Enable fast LZO compression (used for pointcache)" ON)
|
||||
option(WITH_LZMA "Enable best LZMA compression, (used for pointcache)" ON)
|
||||
if(UNIX AND NOT APPLE)
|
||||
option(WITH_SYSTEM_LZO "Use the system LZO library" OFF)
|
||||
endif()
|
||||
|
||||
# Camera/motion tracking
|
||||
option(WITH_LIBMV "Enable libmv structure from motion library" ON)
|
||||
@@ -352,7 +362,7 @@ option(WITH_CYCLES_STANDALONE "Build cycles standalone application" OFF)
|
||||
option(WITH_CYCLES_STANDALONE_GUI "Build cycles standalone with GUI" OFF)
|
||||
option(WITH_CYCLES_OSL "Build Cycles with OSL support" ${_init_CYCLES_OSL})
|
||||
option(WITH_CYCLES_CUDA_BINARIES "Build cycles CUDA binaries" OFF)
|
||||
set(CYCLES_CUDA_BINARIES_ARCH sm_20 sm_21 sm_30 sm_35 sm_50 CACHE STRING "CUDA architectures to build binaries for")
|
||||
set(CYCLES_CUDA_BINARIES_ARCH sm_20 sm_21 sm_30 sm_35 sm_50 sm_52 CACHE STRING "CUDA architectures to build binaries for")
|
||||
mark_as_advanced(CYCLES_CUDA_BINARIES_ARCH)
|
||||
unset(PLATFORM_DEFAULT)
|
||||
option(WITH_CYCLES_LOGGING "Build cycles with logging support" ON)
|
||||
@@ -388,6 +398,7 @@ option(WITH_BOOST "Enable features depending on boost" ON)
|
||||
|
||||
# Unit testsing
|
||||
option(WITH_GTESTS "Enable GTest unit testing" OFF)
|
||||
option(WITH_TESTS_PERFORMANCE "Enable performance tests" OFF)
|
||||
|
||||
|
||||
# Documentation
|
||||
@@ -437,6 +448,13 @@ if(MSVC)
|
||||
set(CPACK_INSTALL_PREFIX ${CMAKE_GENERIC_PROGRAM_FILES}/${})
|
||||
endif()
|
||||
|
||||
# Experimental support of C++11
|
||||
option(WITH_CPP11 "Build with C++11 standard enabled, for development use only!" OFF)
|
||||
mark_as_advanced(WITH_CPP11)
|
||||
|
||||
# Dependency graph
|
||||
option(WITH_LEGACY_DEPSGRAPH "Build Blender with legacy dependency graph" ON)
|
||||
|
||||
# avoid using again
|
||||
option_defaults_clear()
|
||||
|
||||
@@ -626,17 +644,23 @@ if(NOT WITH_BOOST)
|
||||
|
||||
set_and_warn(WITH_CYCLES OFF)
|
||||
set_and_warn(WITH_AUDASPACE OFF)
|
||||
set_and_warn(WITH_ALEMBIC OFF)
|
||||
set_and_warn(WITH_INTERNATIONAL OFF)
|
||||
|
||||
set_and_warn(WITH_OPENAL OFF) # depends on AUDASPACE
|
||||
set_and_warn(WITH_GAMEENGINE OFF) # depends on AUDASPACE
|
||||
elseif(WITH_CYCLES OR WITH_OPENIMAGEIO OR WITH_AUDASPACE OR WITH_INTERNATIONAL)
|
||||
elseif(WITH_CYCLES OR WITH_OPENIMAGEIO OR WITH_AUDASPACE OR WITH_ALEMBIC OR WITH_INTERNATIONAL)
|
||||
# Keep enabled
|
||||
else()
|
||||
# Enabled but we don't need it
|
||||
set(WITH_BOOST OFF)
|
||||
endif()
|
||||
|
||||
# disable hdf5 if Alembic is disabled
|
||||
if(NOT WITH_ALEMBIC)
|
||||
set(WITH_HDF5 OFF)
|
||||
endif()
|
||||
|
||||
# auto enable openimageio for cycles
|
||||
if(WITH_CYCLES)
|
||||
set(WITH_OPENIMAGEIO ON)
|
||||
@@ -663,6 +687,7 @@ if(WITH_GHOST_SDL OR WITH_HEADLESS)
|
||||
set(WITH_X11_XINPUT OFF)
|
||||
set(WITH_X11_XF86VMODE OFF)
|
||||
set(WITH_GHOST_XDND OFF)
|
||||
set(WITH_INPUT_IME OFF)
|
||||
endif()
|
||||
|
||||
if(WITH_CPU_SSE)
|
||||
@@ -797,6 +822,21 @@ if(UNIX AND NOT APPLE)
|
||||
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 py34. remove for now.
|
||||
# find_package(PythonLibs)
|
||||
@@ -1031,75 +1071,31 @@ if(UNIX AND NOT APPLE)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# XXX Maybe most of this section should go into an llvm module?
|
||||
if(WITH_LLVM)
|
||||
find_package_wrapper(LLVM)
|
||||
|
||||
if(LLVM_ROOT_DIR)
|
||||
if(NOT DEFINED LLVM_VERSION)
|
||||
find_program(LLVM_CONFIG llvm-config-${LLVM_VERSION} HINTS ${LLVM_ROOT_DIR}/bin NO_CMAKE_PATH)
|
||||
endif()
|
||||
if(NOT LLVM_CONFIG)
|
||||
find_program(LLVM_CONFIG llvm-config HINTS ${LLVM_ROOT_DIR}/bin NO_CMAKE_PATH)
|
||||
endif()
|
||||
else()
|
||||
if(NOT DEFINED LLVM_VERSION)
|
||||
find_program(LLVM_CONFIG llvm-config-${LLVM_VERSION})
|
||||
endif()
|
||||
if(NOT LLVM_CONFIG)
|
||||
find_program(LLVM_CONFIG llvm-config)
|
||||
endif()
|
||||
if(NOT LLVM_FOUND)
|
||||
set(WITH_LLVM OFF)
|
||||
message(STATUS "LLVM not found")
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED LLVM_VERSION)
|
||||
execute_process(COMMAND ${LLVM_CONFIG} --version
|
||||
OUTPUT_VARIABLE LLVM_VERSION
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
set(LLVM_VERSION ${LLVM_VERSION} CACHE STRING "Version of LLVM to use")
|
||||
endif()
|
||||
if(NOT DEFINED LLVM_ROOT_DIR)
|
||||
execute_process(COMMAND ${LLVM_CONFIG} --prefix
|
||||
OUTPUT_VARIABLE LLVM_ROOT_DIR
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
set(LLVM_ROOT_DIR ${LLVM_ROOT_DIR} CACHE PATH "Path to the LLVM installation")
|
||||
endif()
|
||||
if(NOT DEFINED LLVM_LIBPATH)
|
||||
execute_process(COMMAND ${LLVM_CONFIG} --libdir
|
||||
OUTPUT_VARIABLE LLVM_LIBPATH
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
set(LLVM_LIBPATH ${LLVM_LIBPATH} CACHE PATH "Path to the LLVM library path")
|
||||
mark_as_advanced(LLVM_LIBPATH)
|
||||
endif()
|
||||
|
||||
if(LLVM_STATIC)
|
||||
find_library(LLVM_LIBRARY
|
||||
NAMES LLVMAnalysis # first of a whole bunch of libs to get
|
||||
PATHS ${LLVM_LIBPATH})
|
||||
else()
|
||||
find_library(LLVM_LIBRARY
|
||||
NAMES LLVM-${LLVM_VERSION}
|
||||
PATHS ${LLVM_LIBPATH})
|
||||
endif()
|
||||
|
||||
|
||||
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}")
|
||||
endif()
|
||||
else()
|
||||
message(FATAL_ERROR "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")
|
||||
set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -Wl,--version-script='${CMAKE_SOURCE_DIR}/source/creator/blender.map'")
|
||||
endif()
|
||||
|
||||
if(WITH_ALEMBIC)
|
||||
find_package_wrapper(Alembic)
|
||||
set(ALEMBIC_LIBRARIES ${ALEMBIC_LIBRARIES} ${BOOST_LIBRARIES})
|
||||
if(NOT ALEMBIC_HDF5_FOUND AND WITH_HDF5)
|
||||
message(STATUS "Alembic is compiled without HDF5 support, disabling HDF5 options")
|
||||
set(WITH_HDF5 OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_HDF5)
|
||||
find_package_wrapper(HDF5)
|
||||
endif()
|
||||
|
||||
# OpenSuse needs lutil, ArchLinux not, for now keep, can avoid by using --as-needed
|
||||
@@ -1128,6 +1124,25 @@ if(UNIX AND NOT APPLE)
|
||||
# GNU Compiler
|
||||
if(CMAKE_COMPILER_IS_GNUCC)
|
||||
set(PLATFORM_CFLAGS "-pipe -fPIC -funsigned-char -fno-strict-aliasing")
|
||||
|
||||
if(NOT "${CMAKE_C_COMPILER_VERSION}" VERSION_LESS "5.0")
|
||||
# GCC5 uses gnu11, until we update, force c89
|
||||
# though some c11 features can still be used.
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu89")
|
||||
endif()
|
||||
|
||||
# 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(INFO "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")
|
||||
@@ -1852,14 +1867,14 @@ elseif(APPLE)
|
||||
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_BINARY "${LIBDIR}/python/bin/python${PYTHON_VERSION}") # not used yet
|
||||
# set(PYTHON_EXECUTABLE "${LIBDIR}/python/bin/python${PYTHON_VERSION}") # not used yet
|
||||
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(PYTHON_INCLUDE_DIR "/Library/Frameworks/Python.framework/Versions/${PYTHON_VERSION}/include/python${PYTHON_VERSION}m")
|
||||
set(PYTHON_BINARY "/Library/Frameworks/Python.framework/Versions/${PYTHON_VERSION}/bin/python${PYTHON_VERSION}")
|
||||
set(PYTHON_EXECUTABLE "/Library/Frameworks/Python.framework/Versions/${PYTHON_VERSION}/bin/python${PYTHON_VERSION}")
|
||||
#set(PYTHON_LIBRARY python${PYTHON_VERSION})
|
||||
set(PYTHON_LIBPATH "/Library/Frameworks/Python.framework/Versions/${PYTHON_VERSION}/lib/python${PYTHON_VERSION}/config-${PYTHON_VERSION}m")
|
||||
#set(PYTHON_LINKFLAGS "-u _PyMac_Error -framework Python") # won't build with this enabled
|
||||
@@ -2169,6 +2184,12 @@ if(WITH_CYCLES)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_ALEMBIC)
|
||||
if(NOT WITH_BOOST)
|
||||
message(FATAL_ERROR "Alembic requires WITH_BOOST, the library may not have been found. Configure BOOST or disable WITH_ALEMBIC")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_INTERNATIONAL)
|
||||
if(NOT WITH_BOOST)
|
||||
message(FATAL_ERROR "Internationalization requires WITH_BOOST, the library may not have been found. Configure BOOST or disable WITH_INTERNATIONAL")
|
||||
@@ -2232,6 +2253,9 @@ if(WITH_IMAGE_REDCODE)
|
||||
set(REDCODE_INC ${REDCODE})
|
||||
endif()
|
||||
|
||||
if(NOT WITH_SYSTEM_EIGEN3)
|
||||
set(EIGEN3_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/extern/Eigen3)
|
||||
endif()
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Configure OpenGL.
|
||||
@@ -2493,6 +2517,7 @@ if(CMAKE_COMPILER_IS_GNUCC)
|
||||
ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_MISSING_INCLUDE_DIRS -Wmissing-include-dirs)
|
||||
ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_NO_DIV_BY_ZERO -Wno-div-by-zero)
|
||||
ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_TYPE_LIMITS -Wtype-limits)
|
||||
ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_FORMAT_SIGN -Wformat-signedness)
|
||||
|
||||
# gcc 4.2 gives annoying warnings on every file with this
|
||||
if(NOT "${CMAKE_C_COMPILER_VERSION}" VERSION_LESS "4.3")
|
||||
@@ -2520,6 +2545,16 @@ if(CMAKE_COMPILER_IS_GNUCC)
|
||||
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_MISSING_INCLUDE_DIRS -Wmissing-include-dirs)
|
||||
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_DIV_BY_ZERO -Wno-div-by-zero)
|
||||
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_TYPE_LIMITS -Wtype-limits)
|
||||
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_ERROR_RETURN_TYPE -Werror=return-type)
|
||||
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_ERROR_DECLARATION_AFTER_STATEMENT -Werror=declaration-after-statement)
|
||||
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_ERROR_IMPLICIT_FUNCTION_DECLARATION -Werror=implicit-function-declaration)
|
||||
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_CHAR_SUBSCRIPTS -Wno-char-subscripts)
|
||||
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_UNKNOWN_PRAGMAS -Wno-unknown-pragmas)
|
||||
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_POINTER_ARITH -Wpointer-arith)
|
||||
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_UNUSED_PARAMETER -Wunused-parameter)
|
||||
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_WRITE_STRINGS -Wwrite-strings)
|
||||
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_UNDEF -Wundef)
|
||||
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_FORMAT_SIGN -Wformat-signedness)
|
||||
|
||||
# gcc 4.2 gives annoying warnings on every file with this
|
||||
if(NOT "${CMAKE_C_COMPILER_VERSION}" VERSION_LESS "4.3")
|
||||
@@ -2653,6 +2688,16 @@ if(WITH_PYTHON)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_CPP11)
|
||||
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
||||
elseif(MSVC12)
|
||||
# Nothing special is needed, C++11 features are available by default.
|
||||
else()
|
||||
message(FATAL_ERROR "Compiler ${CMAKE_C_COMPILER_ID} is not supported for C++11 build yet")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Include warnings first, so its possible to disable them with user defined flags
|
||||
# eg: -Wno-uninitialized
|
||||
set(CMAKE_C_FLAGS "${C_WARNINGS} ${CMAKE_C_FLAGS} ${PLATFORM_CFLAGS}")
|
||||
|
@@ -65,7 +65,7 @@ ifneq "$(findstring cycles, $(MAKECMDGOALS))" ""
|
||||
BUILD_CMAKE_ARGS:=$(BUILD_CMAKE_ARGS) -C"$(BLENDER_DIR)/build_files/cmake/config/cycles_standalone.cmake"
|
||||
endif
|
||||
ifneq "$(findstring headless, $(MAKECMDGOALS))" ""
|
||||
BUILD_DIR:=$(BUILD_DIR)_bpy
|
||||
BUILD_DIR:=$(BUILD_DIR)_headless
|
||||
BUILD_CMAKE_ARGS:=$(BUILD_CMAKE_ARGS) -C"$(BLENDER_DIR)/build_files/cmake/config/blender_headless.cmake"
|
||||
endif
|
||||
ifneq "$(findstring bpy, $(MAKECMDGOALS))" ""
|
||||
@@ -171,7 +171,7 @@ help: FORCE
|
||||
@echo ""
|
||||
@echo "Package Targets"
|
||||
@echo " * package_debian - build a debian package"
|
||||
@echo " * package_pacman - build an arch linux pacmanpackage"
|
||||
@echo " * package_pacman - build an arch linux pacman package"
|
||||
@echo " * package_archive - build an archive package"
|
||||
@echo ""
|
||||
@echo "Testing Targets (not associated with building blender)"
|
||||
@@ -218,7 +218,7 @@ package_debian: FORCE
|
||||
cd build_files/package_spec ; DEB_BUILD_OPTIONS="parallel=$(NPROCS)" sh ./build_debian.sh
|
||||
|
||||
package_pacman: FORCE
|
||||
cd build_files/package_spec/pacman ; MAKEFLAGS="-j$(NPROCS)" makepkg --asroot
|
||||
cd build_files/package_spec/pacman ; MAKEFLAGS="-j$(NPROCS)" makepkg
|
||||
|
||||
package_archive: FORCE
|
||||
make -C "$(BUILD_DIR)" -s package_archive
|
||||
|
90
SConstruct
90
SConstruct
@@ -470,6 +470,14 @@ if env['OURPLATFORM']=='darwin':
|
||||
################### End Automatic configuration for OSX ##################
|
||||
#############################################################################
|
||||
|
||||
if env['OURPLATFORM'] == 'linux' and not env['C_COMPILER_ID']:
|
||||
command = ["%s"%env['CC'], "--version"]
|
||||
line = btools.get_command_output(command)
|
||||
if line.startswith('gcc'):
|
||||
env['C_COMPILER_ID'] = 'gcc'
|
||||
elif 'clang' in line[0]:
|
||||
env['C_COMPILER_ID'] = 'clang'
|
||||
|
||||
if env['WITH_BF_OPENMP'] == 1:
|
||||
if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
|
||||
env['CCFLAGS'].append('/openmp')
|
||||
@@ -480,6 +488,13 @@ if env['WITH_BF_OPENMP'] == 1:
|
||||
else:
|
||||
env.Append(CCFLAGS=['-fopenmp'])
|
||||
|
||||
if env['WITH_BF_CPP11']:
|
||||
if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
|
||||
# Nothing special is needed, C++11 features are available by default.
|
||||
pass
|
||||
else:
|
||||
env['CXXFLAGS'].append('-std=c++11')
|
||||
|
||||
#check for additional debug libnames
|
||||
|
||||
if env.has_key('BF_DEBUG_LIBS'):
|
||||
@@ -751,6 +766,9 @@ if B.targets != ['cudakernels']:
|
||||
data_to_c_simple("release/datafiles/preview_cycles.blend")
|
||||
|
||||
# --- glsl ---
|
||||
data_to_c_simple("source/blender/gpu/shaders/gpu_program_smoke_frag.glsl")
|
||||
data_to_c_simple("source/blender/gpu/shaders/gpu_program_smoke_color_frag.glsl")
|
||||
|
||||
data_to_c_simple("source/blender/gpu/shaders/gpu_shader_simple_frag.glsl")
|
||||
data_to_c_simple("source/blender/gpu/shaders/gpu_shader_simple_vert.glsl")
|
||||
data_to_c_simple("source/blender/gpu/shaders/gpu_shader_material.glsl")
|
||||
@@ -764,6 +782,9 @@ if B.targets != ['cudakernels']:
|
||||
data_to_c_simple("source/blender/gpu/shaders/gpu_shader_fx_ssao_frag.glsl")
|
||||
data_to_c_simple("source/blender/gpu/shaders/gpu_shader_fx_dof_frag.glsl")
|
||||
data_to_c_simple("source/blender/gpu/shaders/gpu_shader_fx_dof_vert.glsl")
|
||||
data_to_c_simple("source/blender/gpu/shaders/gpu_shader_fx_dof_hq_frag.glsl")
|
||||
data_to_c_simple("source/blender/gpu/shaders/gpu_shader_fx_dof_hq_vert.glsl")
|
||||
data_to_c_simple("source/blender/gpu/shaders/gpu_shader_fx_dof_hq_geo.glsl")
|
||||
data_to_c_simple("source/blender/gpu/shaders/gpu_shader_fx_lib.glsl")
|
||||
data_to_c_simple("source/blender/gpu/shaders/gpu_shader_fx_depth_resolve.glsl")
|
||||
data_to_c_simple("source/blender/gpu/shaders/gpu_shader_fx_vert.glsl")
|
||||
@@ -796,6 +817,13 @@ if B.targets != ['cudakernels']:
|
||||
data_to_c_simple("release/datafiles/brushicons/fill.png")
|
||||
data_to_c_simple("release/datafiles/brushicons/flatten.png")
|
||||
data_to_c_simple("release/datafiles/brushicons/grab.png")
|
||||
data_to_c_simple("release/datafiles/brushicons/hairadd.png")
|
||||
data_to_c_simple("release/datafiles/brushicons/haircomb.png")
|
||||
data_to_c_simple("release/datafiles/brushicons/haircut.png")
|
||||
data_to_c_simple("release/datafiles/brushicons/hairlength.png")
|
||||
data_to_c_simple("release/datafiles/brushicons/hairpuff.png")
|
||||
data_to_c_simple("release/datafiles/brushicons/hairsmooth.png")
|
||||
data_to_c_simple("release/datafiles/brushicons/hairweight.png")
|
||||
data_to_c_simple("release/datafiles/brushicons/inflate.png")
|
||||
data_to_c_simple("release/datafiles/brushicons/layer.png")
|
||||
data_to_c_simple("release/datafiles/brushicons/lighten.png")
|
||||
@@ -861,19 +889,21 @@ B.init_lib_dict()
|
||||
|
||||
##### END SETUP ##########
|
||||
|
||||
if B.targets != ['cudakernels']:
|
||||
# Put all auto configuration run-time tests here
|
||||
## Auto-configuration run-time tests
|
||||
|
||||
from FindSharedPtr import FindSharedPtr
|
||||
from FindUnorderedMap import FindUnorderedMap
|
||||
from FindSharedPtr import FindSharedPtr
|
||||
from FindUnorderedMap import FindUnorderedMap
|
||||
|
||||
conf = Configure(env)
|
||||
old_linkflags = conf.env['LINKFLAGS']
|
||||
conf.env.Append(LINKFLAGS=env['PLATFORM_LINKFLAGS'])
|
||||
FindSharedPtr(conf)
|
||||
FindUnorderedMap(conf)
|
||||
conf.env['LINKFLAGS'] = old_linkflags
|
||||
env = conf.Finish()
|
||||
conf = Configure(env)
|
||||
old_linkflags = conf.env['LINKFLAGS']
|
||||
conf.env.Append(LINKFLAGS=env['PLATFORM_LINKFLAGS'])
|
||||
|
||||
# Put all tests here
|
||||
FindSharedPtr(conf)
|
||||
FindUnorderedMap(conf)
|
||||
|
||||
conf.env['LINKFLAGS'] = old_linkflags
|
||||
env = conf.Finish()
|
||||
|
||||
# End of auto configuration
|
||||
|
||||
@@ -1005,14 +1035,16 @@ if env['OURPLATFORM']!='darwin':
|
||||
dir=os.path.join(env['BF_INSTALLDIR'], VERSION, 'scripts', 'addons','cycles', 'kernel')
|
||||
source=os.listdir('intern/cycles/kernel')
|
||||
if '__pycache__' in source: source.remove('__pycache__')
|
||||
source.remove('kernel.cpp')
|
||||
source.remove('CMakeLists.txt')
|
||||
source.remove('SConscript')
|
||||
source.remove('svm')
|
||||
source.remove('closure')
|
||||
source.remove('geom')
|
||||
source.remove('shaders')
|
||||
source.remove('osl')
|
||||
source.remove('split')
|
||||
source=['intern/cycles/kernel/'+s for s in source]
|
||||
source.append('intern/cycles/util/util_atomic.h')
|
||||
source.append('intern/cycles/util/util_color.h')
|
||||
source.append('intern/cycles/util/util_half.h')
|
||||
source.append('intern/cycles/util/util_math.h')
|
||||
@@ -1038,6 +1070,12 @@ if env['OURPLATFORM']!='darwin':
|
||||
if '__pycache__' in source: source.remove('__pycache__')
|
||||
source=['intern/cycles/kernel/geom/'+s for s in source]
|
||||
scriptinstall.append(env.Install(dir=dir,source=source))
|
||||
# split
|
||||
dir=os.path.join(env['BF_INSTALLDIR'], VERSION, 'scripts', 'addons','cycles', 'kernel', 'split')
|
||||
source=os.listdir('intern/cycles/kernel/split')
|
||||
if '__pycache__' in source: source.remove('__pycache__')
|
||||
source=['intern/cycles/kernel/split/'+s for s in source]
|
||||
scriptinstall.append(env.Install(dir=dir,source=source))
|
||||
|
||||
# licenses
|
||||
dir=os.path.join(env['BF_INSTALLDIR'], VERSION, 'scripts', 'addons','cycles', 'license')
|
||||
@@ -1167,9 +1205,37 @@ if env['OURPLATFORM']=='linuxcross':
|
||||
textlist = []
|
||||
texttargetlist = []
|
||||
for tp, tn, tf in os.walk('release/text'):
|
||||
tf.remove("readme.html")
|
||||
for f in tf:
|
||||
textlist.append(tp+os.sep+f)
|
||||
|
||||
def readme_version_patch():
|
||||
readme_src = "release/text/readme.html"
|
||||
readme_dst = os.path.abspath(os.path.normpath(os.path.join(env['BF_BUILDDIR'], "readme.html")))
|
||||
|
||||
if not os.path.exists(readme_dst) or (os.path.getmtime(readme_dst) < os.path.getmtime(readme_src)):
|
||||
f = open(readme_src, "r")
|
||||
data = f.read()
|
||||
f.close()
|
||||
|
||||
data = data.replace("BLENDER_VERSION", VERSION)
|
||||
f = open(readme_dst, "w")
|
||||
f.write(data)
|
||||
f.close()
|
||||
|
||||
textlist.append(readme_dst)
|
||||
|
||||
readme_version_patch()
|
||||
del readme_version_patch
|
||||
|
||||
|
||||
'''Command(
|
||||
"release/text/readme.html"
|
||||
|
||||
)
|
||||
Command("file.out", "file.in", Copy(env['BF_INSTALLDIR'], "release/text/readme.html"))
|
||||
'''
|
||||
|
||||
# Font licenses
|
||||
textlist.append('release/datafiles/LICENSE-bfont.ttf.txt')
|
||||
if env['WITH_BF_INTERNATIONAL']:
|
||||
|
@@ -28,8 +28,8 @@ getopt \
|
||||
--long source:,install:,tmp:,info:,threads:,help,no-sudo,with-all,with-opencollada,\
|
||||
ver-ocio:,ver-oiio:,ver-llvm:,ver-osl:,\
|
||||
force-all,force-python,force-numpy,force-boost,force-ocio,force-oiio,force-llvm,force-osl,force-opencollada,\
|
||||
force-ffmpeg,\
|
||||
skip-python,skip-numpy,skip-boost,skip-ocio,skip-openexr,skip-oiio,skip-llvm,skip-osl,skip-ffmpeg,skip-opencollada,\
|
||||
force-ffmpeg,force-alembic,\
|
||||
skip-python,skip-numpy,skip-boost,skip-ocio,skip-openexr,skip-oiio,skip-llvm,skip-osl,skip-ffmpeg,skip-opencollada,skip-alembic,\
|
||||
required-numpy: \
|
||||
-- "$@" \
|
||||
)
|
||||
@@ -95,6 +95,9 @@ ARGUMENTS_INFO="\"COMMAND LINE ARGUMENTS:
|
||||
--with-opencollada
|
||||
Build and install the OpenCOLLADA libraries.
|
||||
|
||||
--with-alembic
|
||||
Build and install the Alembic library.
|
||||
|
||||
--ver-ocio=<ver>
|
||||
Force version of OCIO library.
|
||||
|
||||
@@ -144,6 +147,9 @@ ARGUMENTS_INFO="\"COMMAND LINE ARGUMENTS:
|
||||
--force-ffmpeg
|
||||
Force the rebuild of FFMpeg.
|
||||
|
||||
--force-alembic
|
||||
Force the rebuild of Alembic.
|
||||
|
||||
Note about the --force-foo options:
|
||||
* They obviously only have an effect if those libraries are built by this script
|
||||
(i.e. if there is no available and satisfactory package)!
|
||||
@@ -180,6 +186,9 @@ ARGUMENTS_INFO="\"COMMAND LINE ARGUMENTS:
|
||||
--skip-ffmpeg
|
||||
Unconditionally skip FFMpeg installation/building.
|
||||
|
||||
--skip-alembic
|
||||
Unconditionally skip Alembic installation/building.
|
||||
|
||||
--required-numpy
|
||||
Use this in case your distro features a valid python package, but no matching Numpy one.
|
||||
It will force compilation of both python and numpy\""
|
||||
@@ -264,6 +273,11 @@ MP3LAME_DEV=""
|
||||
OPENJPEG_USE=false
|
||||
OPENJPEG_DEV=""
|
||||
|
||||
ALEMBIC_VERSION="1.5.5"
|
||||
ALEMBIC_VERSION_MIN="1.5.5"
|
||||
ALEMBIC_FORCE_REBUILD=false
|
||||
ALEMBIC_SKIP=false
|
||||
|
||||
# Switch to english language, else some things (like check_package_DEB()) won't work!
|
||||
LANG_BACK=$LANG
|
||||
LANG=""
|
||||
@@ -423,6 +437,9 @@ while true; do
|
||||
--force-ffmpeg)
|
||||
FFMPEG_FORCE_REBUILD=true; shift; continue
|
||||
;;
|
||||
--force-alembic)
|
||||
ALEMBIC_FORCE_REBUILD=true; shift; continue
|
||||
;;
|
||||
--skip-python)
|
||||
PYTHON_SKIP=true; shift; continue
|
||||
;;
|
||||
@@ -453,6 +470,9 @@ while true; do
|
||||
--skip-ffmpeg)
|
||||
FFMPEG_SKIP=true; shift; continue
|
||||
;;
|
||||
--skip-alembic)
|
||||
ALEMBIC_SKIP=true; shift; continue
|
||||
;;
|
||||
--required-numpy)
|
||||
NUMPY_REQUIRED=true; shift; continue
|
||||
;;
|
||||
@@ -510,9 +530,12 @@ OSL_SOURCE_REPO_UID="22ee5ea298fd215430dfbd160b5aefd507f06db0"
|
||||
OSL_SOURCE_REPO_BRANCH="blender-fixes"
|
||||
|
||||
OPENCOLLADA_SOURCE=( "https://github.com/KhronosGroup/OpenCOLLADA.git" )
|
||||
OPENCOLLADA_REPO_UID="18da7f4109a8eafaa290a33f5550501cc4c8bae8"
|
||||
OPENCOLLADA_REPO_UID="3335ac164e68b2512a40914b14c74db260e6ff7d"
|
||||
FFMPEG_SOURCE=( "http://ffmpeg.org/releases/ffmpeg-$FFMPEG_VERSION.tar.bz2" )
|
||||
|
||||
ALEMBIC_SOURCE=( "https://code.google.com/p/alembic/" )
|
||||
ALEMBIC_REPO_UID=( "1_05_05" )
|
||||
|
||||
|
||||
##### Generic Helpers #####
|
||||
|
||||
@@ -839,6 +862,7 @@ compile_Boost() {
|
||||
# Rebuild dependecies as well!
|
||||
OIIO_FORCE_REBUILD=true
|
||||
OSL_FORCE_REBUILD=true
|
||||
ALEMBIC_FORCE_REBUILD=true
|
||||
|
||||
prepare_opt
|
||||
|
||||
@@ -1374,7 +1398,7 @@ EOF
|
||||
cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst"
|
||||
cmake_d="$cmake_d -D LLVM_ENABLE_FFI=ON"
|
||||
cmake_d="$cmake_d -D LLVM_TARGETS_TO_BUILD=X86"
|
||||
cmake_d="$cmake_d -D -DLLVM_ENABLE_TERMINFO=OFF"
|
||||
cmake_d="$cmake_d -D LLVM_ENABLE_TERMINFO=OFF"
|
||||
|
||||
if [ -d $_FFI_INCLUDE_DIR ]; then
|
||||
cmake_d="$cmake_d -D FFI_INCLUDE_DIR=$_FFI_INCLUDE_DIR"
|
||||
@@ -1537,7 +1561,7 @@ clean_OpenCOLLADA() {
|
||||
|
||||
compile_OpenCOLLADA() {
|
||||
# To be changed each time we make edits that would modify the compiled results!
|
||||
opencollada_magic=8
|
||||
opencollada_magic=9
|
||||
_init_opencollada
|
||||
|
||||
# Clean install if needed!
|
||||
@@ -1706,6 +1730,165 @@ compile_FFmpeg() {
|
||||
fi
|
||||
}
|
||||
|
||||
#### Build ALEMBIC ####
|
||||
_init_alembic() {
|
||||
_src=$SRC/Alembic-$ALEMBIC_VERSION
|
||||
_hg=false
|
||||
_inst=$INST/alembic-$ALEMBIC_VERSION
|
||||
_inst_shortcut=$INST/alembic
|
||||
}
|
||||
|
||||
clean_alembic() {
|
||||
_init_alembic
|
||||
_clean
|
||||
}
|
||||
|
||||
compile_alembic() {
|
||||
# To be changed each time we make edits that would modify the compiled result!
|
||||
alembic_magic=1
|
||||
_init_alembic
|
||||
|
||||
# Clean install if needed!
|
||||
magic_compile_check alembic-$ALEMBIC_VERSION $alembic_magic
|
||||
if [ $? -eq 1 -o $ALEMBIC_FORCE_REBUILD == true ]; then
|
||||
clean_alembic
|
||||
fi
|
||||
|
||||
if [ ! -d $_inst ]; then
|
||||
INFO "Building Alembic-$ALEMBIC_VERSION"
|
||||
|
||||
prepare_opt
|
||||
|
||||
if [ ! -d $_src ]; then
|
||||
mkdir -p $SRC
|
||||
hg clone -u $ALEMBIC_REPO_UID $ALEMBIC_SOURCE $_src
|
||||
fi
|
||||
|
||||
cd $_src
|
||||
|
||||
# XXX Ugly patching hack!
|
||||
# Alembice cmake files are erratic, to say the least
|
||||
# have to manually disable a bunch of crap here
|
||||
cat << EOF | patch -p1
|
||||
--- a/CMakeLists.txt Mon Jul 28 10:09:21 2014 -0700
|
||||
+++ b/CMakeLists.txt Thu Oct 16 15:03:27 2014 +0200
|
||||
@@ -57,9 +57,9 @@
|
||||
${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH} )
|
||||
SET( VERSION ${PROJECT_VERSION} )
|
||||
|
||||
-SET( ALEMBIC_NO_TESTS FALSE )
|
||||
-SET( ALEMBIC_NO_BOOTSTRAP FALSE )
|
||||
-SET( ALEMBIC_NO_OPENGL FALSE )
|
||||
+SET( ALEMBIC_NO_TESTS TRUE )
|
||||
+SET( ALEMBIC_NO_BOOTSTRAP TRUE )
|
||||
+SET( ALEMBIC_NO_OPENGL TRUE )
|
||||
|
||||
MESSAGE(STATUS "CMAKE SYSTEM NAME = ${CMAKE_SYSTEM_NAME}" )
|
||||
|
||||
@@ -306,15 +306,15 @@
|
||||
ENDIF()
|
||||
|
||||
# Include PyAlembic stuff
|
||||
-IF(DEFINED USE_PYALEMBIC AND NOT USE_PYALEMBIC)
|
||||
- MESSAGE(STATUS "Skipping Alembic Python bindings")
|
||||
-ELSE()
|
||||
- MESSAGE(STATUS "About to include Python cmake files")
|
||||
- ADD_SUBDIRECTORY( python )
|
||||
-ENDIF()
|
||||
+#IF(DEFINED USE_PYALEMBIC AND NOT USE_PYALEMBIC)
|
||||
+# MESSAGE(STATUS "Skipping Alembic Python bindings")
|
||||
+#ELSE()
|
||||
+# MESSAGE(STATUS "About to include Python cmake files")
|
||||
+# ADD_SUBDIRECTORY( python )
|
||||
+#ENDIF()
|
||||
|
||||
# Example code not supported
|
||||
-ADD_SUBDIRECTORY( examples )
|
||||
+#ADD_SUBDIRECTORY( examples )
|
||||
|
||||
# Uncomment to build python docs Makefile (requires Sphinx)
|
||||
# Run `make docs` from build root
|
||||
|
||||
EOF
|
||||
|
||||
cat << EOF | patch -p1
|
||||
--- a/lib/Alembic/Util/CMakeLists.txt Mon Jul 28 10:09:21 2014 -0700
|
||||
+++ b/lib/Alembic/Util/CMakeLists.txt Thu Oct 16 15:03:27 2014 +0200
|
||||
@@ -65,7 +65,7 @@
|
||||
DESTINATION include/Alembic/Util
|
||||
PERMISSIONS OWNER_READ GROUP_READ WORLD_READ )
|
||||
|
||||
-IF( NOT ALEMBIC_NO_TESTS )
|
||||
- ADD_SUBDIRECTORY( Tests )
|
||||
-ENDIF()
|
||||
+#IF( NOT ALEMBIC_NO_TESTS )
|
||||
+# ADD_SUBDIRECTORY( Tests )
|
||||
+#ENDIF()
|
||||
|
||||
EOF
|
||||
|
||||
cat << EOF | patch -p1
|
||||
--- a/python/CMakeLists.txt Mon Jul 28 10:09:21 2014 -0700
|
||||
+++ b/python/CMakeLists.txt Thu Oct 16 14:20:25 2014 +0200
|
||||
@@ -35,4 +35,4 @@
|
||||
|
||||
ADD_SUBDIRECTORY( PyAlembic )
|
||||
ADD_SUBDIRECTORY( PyAbcOpenGL )
|
||||
-ADD_SUBDIRECTORY( examples )
|
||||
+#ADD_SUBDIRECTORY( examples )
|
||||
|
||||
EOF
|
||||
|
||||
# Always refresh the whole build!
|
||||
# XXX 'build' directory is included in Alembic sources, don't touch that
|
||||
if [ -d blender_build ]; then
|
||||
rm -rf blender_build
|
||||
fi
|
||||
mkdir blender_build
|
||||
cd blender_build
|
||||
|
||||
# XXX Alembic cmake doesn't take these as options
|
||||
# XXX Alembic creates a subfolder itself ... rather than fix their
|
||||
# stupid build files, just expect this here by using $INST as prefix
|
||||
export ALEMBIC_INSTALL_PREFIX=$INST
|
||||
|
||||
cmake_d="-D CMAKE_BUILD_TYPE=Release"
|
||||
cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$INST"
|
||||
cmake_d="$cmake_d -D BUILD_SHARED_LIBS=ON"
|
||||
cmake_d="$cmake_d -D BUILD_STATIC_LIBS=ON"
|
||||
cmake_d="$cmake_d -D USE_PYTHON=OFF"
|
||||
cmake_d="$cmake_d -D USE_PYALEMBIC=OFF"
|
||||
cmake_d="$cmakd_d -D ALEMBIC_PYTHON_INCLUDE_DIR=/use/include/python2.7" # XXX BAD
|
||||
cmake_d="$cmakd_d -D ALEMBIC_PYTHON_LIBRARY=/use/lib/python2.7" # XXX BAD
|
||||
cmake_d="$cmake_d -D USE_PYILMBASE=OFF"
|
||||
cmake_d="$cmake_d -D ILMBASE_ROOT=$INST/openexr"
|
||||
cmake_d="$cmake_d -D ALEMBIC_ILMBASE_HALF_LIB=$INST/openexr/lib/libHalf.la"
|
||||
cmake_d="$cmake_d -D ALEMBIC_ILMBASE_IEX_LIB=$INST/openexr/lib/libIex-2_1.la"
|
||||
cmake_d="$cmake_d -D ALEMBIC_ILMBASE_ILMTHREAD_LIB=$INST/openexr/lib/libIlmThread-2_1.la"
|
||||
cmake_d="$cmake_d -D ALEMBIC_ILMBASE_IMATH_LIB=$INST/openexr/lib/libImath-2_1.la"
|
||||
|
||||
cmake $cmake_d ../
|
||||
|
||||
make -j$THREADS && make install
|
||||
make clean
|
||||
|
||||
if [ -d $_inst ]; then
|
||||
_create_inst_shortcut
|
||||
else
|
||||
ERROR "Alembic-$ALEMBIC_VERSION failed to compile, exiting"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
magic_compile_set alembic-$ALEMBIC_VERSION $alembic_magic
|
||||
|
||||
cd $CWD
|
||||
INFO "Done compiling Alembic-$ALEMBIC_VERSION!"
|
||||
else
|
||||
INFO "Own Alembic-$ALEMBIC_VERSION is up to date, nothing to do!"
|
||||
INFO "If you want to force rebuild of this lib, use the --force-alembic option."
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
#### Install on DEB-like ####
|
||||
get_package_version_DEB() {
|
||||
@@ -1812,7 +1995,7 @@ install_DEB() {
|
||||
OGG_DEV="libogg-dev"
|
||||
THEORA_DEV="libtheora-dev"
|
||||
|
||||
_packages="gawk cmake cmake-curses-gui scons build-essential libjpeg-dev libpng-dev \
|
||||
_packages="gawk cmake cmake-curses-gui scons mercurial build-essential libjpeg-dev libpng-dev \
|
||||
libfreetype6-dev libx11-dev libxi-dev wget libsqlite3-dev libbz2-dev \
|
||||
libncurses5-dev libssl-dev liblzma-dev libreadline-dev $OPENJPEG_DEV \
|
||||
libopenal-dev libglew-dev libglewmx-dev yasm $THEORA_DEV $VORBIS_DEV $OGG_DEV \
|
||||
@@ -1992,7 +2175,8 @@ install_DEB() {
|
||||
if [ $? -eq 0 ]; then
|
||||
install_packages_DEB libboost-locale$boost_version-dev libboost-filesystem$boost_version-dev \
|
||||
libboost-regex$boost_version-dev libboost-system$boost_version-dev \
|
||||
libboost-thread$boost_version-dev libboost-wave$boost_version-dev
|
||||
libboost-thread$boost_version-dev libboost-python$boost_version-dev \
|
||||
libboost-program-options$boost_version-dev libboost-wave$boost_version-dev
|
||||
clean_Boost
|
||||
else
|
||||
compile_Boost
|
||||
@@ -2125,6 +2309,14 @@ install_DEB() {
|
||||
# fi
|
||||
compile_FFmpeg
|
||||
fi
|
||||
|
||||
if $ALEMBIC_SKIP; then
|
||||
WARNING "Skipping Alembic installation, as requested..."
|
||||
else
|
||||
install_packages_DEB libhdf5-dev
|
||||
install_packages_DEB libpython2.7-dev # XXX nasty hack, should be done better ...
|
||||
compile_alembic
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
@@ -2287,7 +2479,7 @@ install_RPM() {
|
||||
OGG_DEV="libogg-devel"
|
||||
THEORA_DEV="libtheora-devel"
|
||||
|
||||
_packages="gcc gcc-c++ make scons libtiff-devel freetype-devel libjpeg-devel\
|
||||
_packages="gcc gcc-c++ make scons libtiff-devel libjpeg-devel\
|
||||
libpng-devel libX11-devel libXi-devel wget ncurses-devel \
|
||||
readline-devel $OPENJPEG_DEV openal-soft-devel \
|
||||
glew-devel yasm $THEORA_DEV $VORBIS_DEV $OGG_DEV patch \
|
||||
@@ -2301,7 +2493,7 @@ install_RPM() {
|
||||
if [ $RPM = "FEDORA" -o $RPM = "RHEL" ]; then
|
||||
OPENEXR_DEV="openexr-devel"
|
||||
|
||||
_packages="$_packages libsqlite3x-devel fftw-devel SDL-devel"
|
||||
_packages="$_packages freetype-devel libsqlite3x-devel fftw-devel SDL-devel"
|
||||
|
||||
if $WITH_ALL; then
|
||||
_packages="$_packages jack-audio-connection-kit-devel"
|
||||
@@ -2339,7 +2531,7 @@ install_RPM() {
|
||||
elif [ $RPM = "SUSE" ]; then
|
||||
OPENEXR_DEV="libopenexr-devel"
|
||||
|
||||
_packages="$_packages cmake sqlite3-devel fftw3-devel libSDL-devel"
|
||||
_packages="$_packages cmake freetype2-devel sqlite3-devel fftw3-devel libSDL-devel"
|
||||
|
||||
PRINT ""
|
||||
install_packages_RPM $_packages
|
||||
@@ -3030,6 +3222,12 @@ print_info() {
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -d $INST/alembic ]; then
|
||||
_1="-D ALEMBIC_ROOT_DIR=$INST/alembic"
|
||||
PRINT " $_1"
|
||||
_buildargs="$_buildargs $_1"
|
||||
fi
|
||||
|
||||
PRINT ""
|
||||
PRINT "Or even simpler, just run (in your blender-source dir):"
|
||||
PRINT " make -j$THREADS BUILD_CMAKE_ARGS=\"$_buildargs\""
|
||||
@@ -3099,6 +3297,13 @@ print_info() {
|
||||
PRINT "BF_FFMPEG_LIB = 'avformat avcodec swscale avutil avdevice `print_info_ffmpeglink`'"
|
||||
fi
|
||||
|
||||
if [ "$ALEMBIC_SKIP" = false ]; then
|
||||
PRINT "WITH_BF_ALEMBIC = True"
|
||||
if [ -d $INST/alembic ]; then
|
||||
PRINT "BF_ALEMBIC = '$INST/alembic'"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$WITH_ALL" = false ]; then
|
||||
PRINT "WITH_BF_3DMOUSE = False"
|
||||
# No libspacenav in official arch repos...
|
||||
|
@@ -166,6 +166,19 @@ BF_BOOST_LIBPATH = '${BF_BOOST}/lib'
|
||||
# Ocean Simulation
|
||||
WITH_BF_OCEANSIM = True
|
||||
|
||||
# Alembic
|
||||
WITH_BF_HDF5 = False
|
||||
WITH_BF_ALEMBIC = True
|
||||
WITH_BF_STATICALEMBIC = True
|
||||
BF_ALEMBIC = '/opt/lib/alembic'
|
||||
BF_ALEMBIC_INC = '${BF_ALEMBIC}/include'
|
||||
BF_ALEMBIC_LIBPATH = '${BF_ALEMBIC}/lib/static'
|
||||
BF_ALEMBIC_LIB_STATIC = '${BF_ALEMBIC_LIBPATH}/libAlembicAbcGeom.a ${BF_ALEMBIC_LIBPATH}/libAlembicAbc.a ' + \
|
||||
'${BF_ALEMBIC_LIBPATH}/libAlembicAbcCollection.a ${BF_ALEMBIC_LIBPATH}/libAlembicAbcCoreFactory.a ' + \
|
||||
'${BF_ALEMBIC_LIBPATH}/libAlembicAbcCoreOgawa.a ${BF_ALEMBIC_LIBPATH}/libAlembicAbcMaterial.a ' + \
|
||||
'${BF_ALEMBIC_LIBPATH}/libAlembicOgawa.a ${BF_ALEMBIC_LIBPATH}/libAlembicAbcCoreAbstract.a ' + \
|
||||
'${BF_ALEMBIC_LIBPATH}/libAlembicUtil.a'
|
||||
|
||||
# Compilation and optimization
|
||||
BF_DEBUG = False
|
||||
REL_CCFLAGS = ['-DNDEBUG', '-O2', '-msse', '-msse2'] # C & C++
|
||||
|
@@ -166,6 +166,19 @@ BF_BOOST_LIBPATH = '${BF_BOOST}/lib'
|
||||
# Ocean Simulation
|
||||
WITH_BF_OCEANSIM = True
|
||||
|
||||
# Alembic
|
||||
WITH_BF_HDF5 = False
|
||||
WITH_BF_ALEMBIC = True
|
||||
WITH_BF_STATICALEMBIC = True
|
||||
BF_ALEMBIC = '/opt/lib/alembic'
|
||||
BF_ALEMBIC_INC = '${BF_ALEMBIC}/include'
|
||||
BF_ALEMBIC_LIBPATH = '${BF_ALEMBIC}/lib/static'
|
||||
BF_ALEMBIC_LIB_STATIC = '${BF_ALEMBIC_LIBPATH}/libAlembicAbcGeom.a ${BF_ALEMBIC_LIBPATH}/libAlembicAbc.a ' + \
|
||||
'${BF_ALEMBIC_LIBPATH}/libAlembicAbcCollection.a ${BF_ALEMBIC_LIBPATH}/libAlembicAbcCoreFactory.a ' + \
|
||||
'${BF_ALEMBIC_LIBPATH}/libAlembicAbcCoreOgawa.a ${BF_ALEMBIC_LIBPATH}/libAlembicAbcMaterial.a ' + \
|
||||
'${BF_ALEMBIC_LIBPATH}/libAlembicOgawa.a ${BF_ALEMBIC_LIBPATH}/libAlembicAbcCoreAbstract.a ' + \
|
||||
'${BF_ALEMBIC_LIBPATH}/libAlembicUtil.a'
|
||||
|
||||
# Compilation and optimization
|
||||
BF_DEBUG = False
|
||||
REL_CCFLAGS = ['-DNDEBUG', '-O2', '-msse', '-msse2'] # C & C++
|
||||
|
@@ -5,3 +5,5 @@ WITH_BF_CYCLES_CUDA_BINARIES = True
|
||||
|
||||
WITH_BF_CYCLES_OSL = False # OSL never worked on OSX 32bit !
|
||||
|
||||
WITH_BF_COLLADA = False # we drop 32bit, newest collada is only x86_64 !
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
CC = "../lib/darwin-9.x.universal/clang-omp-3.5/bin/clang"
|
||||
CXX = "../lib/darwin-9.x.universal/clang-omp-3.5/bin/clang++"
|
||||
|
||||
MACOSX_ARCHITECTURE = 'x86_64' # valid archs: ppc, i386, ppc64, x86_64
|
||||
|
||||
WITH_BF_CYCLES_CUDA_BINARIES = True
|
||||
|
||||
|
@@ -120,6 +120,19 @@ WITH_BF_FFTW3 = True
|
||||
WITH_BF_STATICFFTW3 = True
|
||||
WITH_BF_OCEANSIM = True
|
||||
|
||||
# Alembic
|
||||
WITH_BF_HDF5 = False
|
||||
WITH_BF_ALEMBIC = True
|
||||
WITH_BF_STATICALEMBIC = True
|
||||
BF_ALEMBIC = '/opt/lib/alembic'
|
||||
BF_ALEMBIC_INC = '${BF_ALEMBIC}/include'
|
||||
BF_ALEMBIC_LIBPATH = '${BF_ALEMBIC}/lib/static'
|
||||
BF_ALEMBIC_LIB_STATIC = '${BF_ALEMBIC_LIBPATH}/libAlembicAbcGeom.a ${BF_ALEMBIC_LIBPATH}/libAlembicAbc.a ' + \
|
||||
'${BF_ALEMBIC_LIBPATH}/libAlembicAbcCollection.a ${BF_ALEMBIC_LIBPATH}/libAlembicAbcCoreFactory.a ' + \
|
||||
'${BF_ALEMBIC_LIBPATH}/libAlembicAbcCoreOgawa.a ${BF_ALEMBIC_LIBPATH}/libAlembicAbcMaterial.a ' + \
|
||||
'${BF_ALEMBIC_LIBPATH}/libAlembicOgawa.a ${BF_ALEMBIC_LIBPATH}/libAlembicAbcCoreAbstract.a ' + \
|
||||
'${BF_ALEMBIC_LIBPATH}/libAlembicUtil.a'
|
||||
|
||||
# Compilation and optimization
|
||||
BF_DEBUG = False
|
||||
REL_CCFLAGS = ['-DNDEBUG', '-O2', '-msse', '-msse2'] # C & C++
|
||||
|
@@ -120,6 +120,19 @@ WITH_BF_FFTW3 = True
|
||||
WITH_BF_STATICFFTW3 = True
|
||||
WITH_BF_OCEANSIM = True
|
||||
|
||||
# Alembic
|
||||
WITH_BF_HDF5 = False
|
||||
WITH_BF_ALEMBIC = True
|
||||
WITH_BF_STATICALEMBIC = True
|
||||
BF_ALEMBIC = '/opt/lib/alembic'
|
||||
BF_ALEMBIC_INC = '${BF_ALEMBIC}/include'
|
||||
BF_ALEMBIC_LIBPATH = '${BF_ALEMBIC}/lib/static'
|
||||
BF_ALEMBIC_LIB_STATIC = '${BF_ALEMBIC_LIBPATH}/libAlembicAbcGeom.a ${BF_ALEMBIC_LIBPATH}/libAlembicAbc.a ' + \
|
||||
'${BF_ALEMBIC_LIBPATH}/libAlembicAbcCollection.a ${BF_ALEMBIC_LIBPATH}/libAlembicAbcCoreFactory.a ' + \
|
||||
'${BF_ALEMBIC_LIBPATH}/libAlembicAbcCoreOgawa.a ${BF_ALEMBIC_LIBPATH}/libAlembicAbcMaterial.a ' + \
|
||||
'${BF_ALEMBIC_LIBPATH}/libAlembicOgawa.a ${BF_ALEMBIC_LIBPATH}/libAlembicAbcCoreAbstract.a ' + \
|
||||
'${BF_ALEMBIC_LIBPATH}/libAlembicUtil.a'
|
||||
|
||||
# Compilation and optimization
|
||||
BF_DEBUG = False
|
||||
REL_CCFLAGS = ['-DNDEBUG', '-O2', '-msse', '-msse2'] # C & C++
|
||||
|
@@ -124,10 +124,12 @@ else:
|
||||
directory = 'public_html/download'
|
||||
|
||||
try:
|
||||
filename = os.path.join(directory, packagename)
|
||||
zf = z.open(package)
|
||||
f = file(os.path.join(directory, packagename), "wb")
|
||||
f = file(filename, "wb")
|
||||
|
||||
shutil.copyfileobj(zf, f)
|
||||
os.chmod(filename, 0644)
|
||||
|
||||
zf.close()
|
||||
z.close()
|
||||
|
@@ -116,6 +116,8 @@ else:
|
||||
|
||||
if config.find('player') != -1:
|
||||
scons_options.append('BF_BUILDDIR=%s_player' % (build_dir))
|
||||
elif config.find('cuda') != -1:
|
||||
scons_options.append('BF_BUILDDIR=%s_cuda' % (build_dir))
|
||||
else:
|
||||
scons_options.append('BF_BUILDDIR=%s' % (build_dir))
|
||||
|
||||
@@ -140,7 +142,7 @@ else:
|
||||
|
||||
retcode = subprocess.call(cur_scons_cmd + scons_options)
|
||||
if retcode != 0:
|
||||
print('Error building rules wuth config ' + config)
|
||||
print('Error building rules with config ' + config)
|
||||
sys.exit(retcode)
|
||||
|
||||
sys.exit(0)
|
||||
|
103
build_files/cmake/Modules/FindAlembic.cmake
Normal file
103
build_files/cmake/Modules/FindAlembic.cmake
Normal file
@@ -0,0 +1,103 @@
|
||||
# - Find Alembic library
|
||||
# Find the native Alembic includes and library
|
||||
# This module defines
|
||||
# ALEMBIC_INCLUDE_DIRS, where to find Alembic headers.
|
||||
# ALEMBIC_LIBRARIES, libraries to link against to use Alembic.
|
||||
# ALEMBIC_ROOT_DIR, The base directory to search for Alembic.
|
||||
# This can also be an environment variable.
|
||||
# ALEMBIC_FOUND, If false, do not try to use Alembic.
|
||||
# ALEMBIC_HDF5_FOUND, indicates whether Alembic supports HDF5
|
||||
|
||||
#=============================================================================
|
||||
# Copyright 2013 Blender Foundation.
|
||||
#
|
||||
# Distributed under the OSI-approved BSD License (the "License");
|
||||
# see accompanying file Copyright.txt for details.
|
||||
#
|
||||
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the License for more information.
|
||||
#=============================================================================
|
||||
|
||||
# If ALEMBIC_ROOT_DIR was defined in the environment, use it.
|
||||
IF(NOT ALEMBIC_ROOT_DIR AND NOT $ENV{ALEMBIC_ROOT_DIR} STREQUAL "")
|
||||
SET(ALEMBIC_ROOT_DIR $ENV{ALEMBIC_ROOT_DIR})
|
||||
ENDIF()
|
||||
|
||||
SET(_alembic_SEARCH_DIRS
|
||||
${ALEMBIC_ROOT_DIR}
|
||||
/usr/local
|
||||
/sw # Fink
|
||||
/opt/local # DarwinPorts
|
||||
/opt/csw # Blastwave
|
||||
/opt/lib/alembic
|
||||
)
|
||||
|
||||
SET(_alembic_FIND_COMPONENTS
|
||||
AlembicAbc
|
||||
AlembicAbcCoreAbstract
|
||||
AlembicAbcGeom
|
||||
AlembicAbcCoreOgawa
|
||||
AlembicOgawa
|
||||
AlembicUtil
|
||||
)
|
||||
|
||||
FIND_PATH(ALEMBIC_INCLUDE_DIR
|
||||
NAMES
|
||||
Alembic/Abc/All.h
|
||||
HINTS
|
||||
${_alembic_SEARCH_DIRS}
|
||||
PATH_SUFFIXES
|
||||
include
|
||||
)
|
||||
|
||||
SET(_alembic_LIBRARIES)
|
||||
FOREACH(COMPONENT ${_alembic_FIND_COMPONENTS})
|
||||
STRING(TOUPPER ${COMPONENT} UPPERCOMPONENT)
|
||||
|
||||
FIND_LIBRARY(ALEMBIC_${UPPERCOMPONENT}_LIBRARY
|
||||
NAMES
|
||||
${COMPONENT}
|
||||
HINTS
|
||||
${_alembic_SEARCH_DIRS}
|
||||
PATH_SUFFIXES
|
||||
lib
|
||||
lib/static
|
||||
)
|
||||
MARK_AS_ADVANCED(ALEMBIC_${UPPERCOMPONENT}_LIBRARY)
|
||||
LIST(APPEND _alembic_LIBRARIES "${ALEMBIC_${UPPERCOMPONENT}_LIBRARY}")
|
||||
ENDFOREACH()
|
||||
|
||||
# Sepcial handling of optional libraries
|
||||
FIND_LIBRARY(ALEMBIC_ALEMBICABCCOREHDF5_LIBRARY
|
||||
NAMES
|
||||
AlembicAbcCoreHDF5
|
||||
HINTS
|
||||
${_alembic_SEARCH_DIRS}
|
||||
PATH_SUFFIXES
|
||||
lib
|
||||
lib/static
|
||||
)
|
||||
MARK_AS_ADVANCED(ALEMBIC_ALEMBICABCCOREHDF5_LIBRARY)
|
||||
IF(ALEMBIC_ALEMBICABCCOREHDF5_LIBRARY)
|
||||
LIST(APPEND _alembic_LIBRARIES "${ALEMBIC_ALEMBICABCCOREHDF5_LIBRARY}")
|
||||
SET(ALEMBIC_HDF5_FOUND TRUE)
|
||||
ELSE()
|
||||
SET(ALEMBIC_HDF5_FOUND FALSE)
|
||||
ENDIF()
|
||||
|
||||
# handle the QUIETLY and REQUIRED arguments and set ALEMBIC_FOUND to TRUE if
|
||||
# all listed variables are TRUE
|
||||
INCLUDE(FindPackageHandleStandardArgs)
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Alembic DEFAULT_MSG
|
||||
_alembic_LIBRARIES ALEMBIC_INCLUDE_DIR)
|
||||
|
||||
IF(ALEMBIC_FOUND)
|
||||
SET(ALEMBIC_LIBRARIES ${_alembic_LIBRARIES})
|
||||
SET(ALEMBIC_INCLUDE_DIRS ${ALEMBIC_INCLUDE_DIR})
|
||||
ENDIF(ALEMBIC_FOUND)
|
||||
|
||||
MARK_AS_ADVANCED(
|
||||
ALEMBIC_INCLUDE_DIR
|
||||
ALEMBIC_LIBRARIES
|
||||
)
|
56
build_files/cmake/Modules/FindEigen3.cmake
Normal file
56
build_files/cmake/Modules/FindEigen3.cmake
Normal file
@@ -0,0 +1,56 @@
|
||||
# - Find Eigen3 library
|
||||
# Find the native Eigen3 includes and library
|
||||
# This module defines
|
||||
# EIGEN3_INCLUDE_DIRS, where to find spnav.h, Set when
|
||||
# EIGEN3_INCLUDE_DIR is found.
|
||||
# EIGEN3_ROOT_DIR, The base directory to search for Eigen3.
|
||||
# This can also be an environment variable.
|
||||
# EIGEN3_FOUND, If false, do not try to use Eigen3.
|
||||
#
|
||||
#=============================================================================
|
||||
# Copyright 2015 Blender Foundation.
|
||||
#
|
||||
# Distributed under the OSI-approved BSD License (the "License");
|
||||
# see accompanying file Copyright.txt for details.
|
||||
#
|
||||
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the License for more information.
|
||||
#=============================================================================
|
||||
|
||||
# If EIGEN3_ROOT_DIR was defined in the environment, use it.
|
||||
IF(NOT EIGEN3_ROOT_DIR AND NOT $ENV{EIGEN3_ROOT_DIR} STREQUAL "")
|
||||
SET(EIGEN3_ROOT_DIR $ENV{EIGEN3_ROOT_DIR})
|
||||
ENDIF()
|
||||
|
||||
SET(_eigen3_SEARCH_DIRS
|
||||
${EIGEN3_ROOT_DIR}
|
||||
/usr/local
|
||||
/sw # Fink
|
||||
/opt/local # DarwinPorts
|
||||
/opt/csw # Blastwave
|
||||
)
|
||||
|
||||
FIND_PATH(EIGEN3_INCLUDE_DIR
|
||||
NAMES
|
||||
# header has no '.h' suffix
|
||||
Eigen/Eigen
|
||||
HINTS
|
||||
${_eigen3_SEARCH_DIRS}
|
||||
PATH_SUFFIXES
|
||||
include/eigen3
|
||||
)
|
||||
|
||||
# handle the QUIETLY and REQUIRED arguments and set EIGEN3_FOUND to TRUE if
|
||||
# all listed variables are TRUE
|
||||
INCLUDE(FindPackageHandleStandardArgs)
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Eigen3 DEFAULT_MSG
|
||||
EIGEN3_INCLUDE_DIR)
|
||||
|
||||
IF(EIGEN3_FOUND)
|
||||
SET(EIGEN3_INCLUDE_DIRS ${EIGEN3_INCLUDE_DIR})
|
||||
ENDIF(EIGEN3_FOUND)
|
||||
|
||||
MARK_AS_ADVANCED(
|
||||
EIGEN3_INCLUDE_DIR
|
||||
)
|
75
build_files/cmake/Modules/FindHDF5.cmake
Normal file
75
build_files/cmake/Modules/FindHDF5.cmake
Normal file
@@ -0,0 +1,75 @@
|
||||
# - Find HDF5 library
|
||||
# Find the native hdf5 includes and library
|
||||
# This module defines
|
||||
# HDF5_INCLUDE_DIRS, where to find hdf5 headers.
|
||||
# HDF5_LIBRARIES, libraries to link against to use hdf5.
|
||||
# HDF5_ROOT_DIR, The base directory to search for hdf5.
|
||||
# This can also be an environment variable.
|
||||
# HDF5_FOUND, If false, do not try to use hdf5.
|
||||
|
||||
#=============================================================================
|
||||
# Copyright 2013 Blender Foundation.
|
||||
#
|
||||
# Distributed under the OSI-approved BSD License (the "License");
|
||||
# see accompanying file Copyright.txt for details.
|
||||
#
|
||||
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the License for more information.
|
||||
#=============================================================================
|
||||
|
||||
# If HDF5_ROOT_DIR was defined in the environment, use it.
|
||||
IF(NOT HDF5_ROOT_DIR AND NOT $ENV{HDF5_ROOT_DIR} STREQUAL "")
|
||||
SET(HDF5_ROOT_DIR $ENV{HDF5_ROOT_DIR})
|
||||
ENDIF()
|
||||
|
||||
SET(_hdf5_SEARCH_DIRS
|
||||
${HDF5_ROOT_DIR}
|
||||
/usr/local
|
||||
/sw # Fink
|
||||
/opt/local # DarwinPorts
|
||||
/opt/csw # Blastwave
|
||||
/opt/lib/hdf5
|
||||
)
|
||||
|
||||
SET(_hdf5_FIND_COMPONENTS
|
||||
hdf5
|
||||
hdf5_hl
|
||||
)
|
||||
|
||||
FIND_PATH(_hdf5_INCLUDE_DIRS
|
||||
NAMES
|
||||
hdf5.h
|
||||
HINTS
|
||||
${_hdf5_SEARCH_DIRS}
|
||||
)
|
||||
|
||||
SET(_hdf5_LIBRARIES)
|
||||
FOREACH(COMPONENT ${_hdf5_FIND_COMPONENTS})
|
||||
STRING(TOUPPER ${COMPONENT} UPPERCOMPONENT)
|
||||
|
||||
FIND_LIBRARY(HDF5_${UPPERCOMPONENT}_LIBRARY
|
||||
NAMES
|
||||
${COMPONENT}
|
||||
HINTS
|
||||
${_hdf5_SEARCH_DIRS}
|
||||
)
|
||||
MARK_AS_ADVANCED(HDF5_${UPPERCOMPONENT}_LIBRARY)
|
||||
LIST(APPEND _hdf5_LIBRARIES "${HDF5_${UPPERCOMPONENT}_LIBRARY}")
|
||||
ENDFOREACH()
|
||||
|
||||
# handle the QUIETLY and REQUIRED arguments and set HDF5_FOUND to TRUE if
|
||||
# all listed variables are TRUE
|
||||
INCLUDE(FindPackageHandleStandardArgs)
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(hdf5 DEFAULT_MSG
|
||||
_hdf5_LIBRARIES _hdf5_INCLUDE_DIRS)
|
||||
|
||||
IF(HDF5_FOUND)
|
||||
SET(HDF5_LIBRARIES ${_hdf5_LIBRARIES})
|
||||
SET(HDF5_INCLUDE_DIRS ${_hdf5_INCLUDE_DIRS})
|
||||
ENDIF(HDF5_FOUND)
|
||||
|
||||
MARK_AS_ADVANCED(
|
||||
HDF5_INCLUDE_DIRS
|
||||
HDF5_LIBRARIES
|
||||
)
|
94
build_files/cmake/Modules/FindLLVM.cmake
Normal file
94
build_files/cmake/Modules/FindLLVM.cmake
Normal file
@@ -0,0 +1,94 @@
|
||||
# - Find LLVM library
|
||||
# Find the native LLVM includes and library
|
||||
# This module defines
|
||||
# LLVM_INCLUDE_DIRS, where to find LLVM.h, Set when LLVM_INCLUDE_DIR is found.
|
||||
# LLVM_LIBRARIES, libraries to link against to use LLVM.
|
||||
# LLVM_ROOT_DIR, The base directory to search for LLVM.
|
||||
# This can also be an environment variable.
|
||||
# LLVM_FOUND, If false, do not try to use LLVM.
|
||||
#
|
||||
# also defined, but not for general use are
|
||||
# LLVM_LIBRARY, where to find the LLVM library.
|
||||
|
||||
#=============================================================================
|
||||
# Copyright 2015 Blender Foundation.
|
||||
#
|
||||
# Distributed under the OSI-approved BSD License (the "License");
|
||||
# see accompanying file Copyright.txt for details.
|
||||
#
|
||||
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the License for more information.
|
||||
#=============================================================================
|
||||
|
||||
if(LLVM_ROOT_DIR)
|
||||
if(DEFINED LLVM_VERSION)
|
||||
find_program(LLVM_CONFIG llvm-config-${LLVM_VERSION} HINTS ${LLVM_ROOT_DIR}/bin NO_CMAKE_PATH)
|
||||
endif()
|
||||
if(NOT LLVM_CONFIG)
|
||||
find_program(LLVM_CONFIG llvm-config HINTS ${LLVM_ROOT_DIR}/bin NO_CMAKE_PATH)
|
||||
endif()
|
||||
else()
|
||||
if(DEFINED LLVM_VERSION)
|
||||
message(running llvm-config-${LLVM_VERSION})
|
||||
find_program(LLVM_CONFIG llvm-config-${LLVM_VERSION})
|
||||
endif()
|
||||
if(NOT LLVM_CONFIG)
|
||||
find_program(LLVM_CONFIG llvm-config)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED LLVM_VERSION)
|
||||
execute_process(COMMAND ${LLVM_CONFIG} --version
|
||||
OUTPUT_VARIABLE LLVM_VERSION
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
set(LLVM_VERSION ${LLVM_VERSION} CACHE STRING "Version of LLVM to use")
|
||||
endif()
|
||||
if(NOT LLVM_ROOT_DIR)
|
||||
execute_process(COMMAND ${LLVM_CONFIG} --prefix
|
||||
OUTPUT_VARIABLE LLVM_ROOT_DIR
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
set(LLVM_ROOT_DIR ${LLVM_ROOT_DIR} CACHE PATH "Path to the LLVM installation")
|
||||
endif()
|
||||
if(NOT LLVM_LIBPATH)
|
||||
execute_process(COMMAND ${LLVM_CONFIG} --libdir
|
||||
OUTPUT_VARIABLE LLVM_LIBPATH
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
set(LLVM_LIBPATH ${LLVM_LIBPATH} CACHE PATH "Path to the LLVM library path")
|
||||
mark_as_advanced(LLVM_LIBPATH)
|
||||
endif()
|
||||
|
||||
if(LLVM_STATIC)
|
||||
find_library(LLVM_LIBRARY
|
||||
NAMES LLVMAnalysis # first of a whole bunch of libs to get
|
||||
PATHS ${LLVM_LIBPATH})
|
||||
else()
|
||||
find_library(LLVM_LIBRARY
|
||||
NAMES LLVM-${LLVM_VERSION}
|
||||
PATHS ${LLVM_LIBPATH})
|
||||
endif()
|
||||
|
||||
|
||||
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}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
|
||||
# handle the QUIETLY and REQUIRED arguments and set SDL2_FOUND to TRUE if
|
||||
# all listed variables are TRUE
|
||||
INCLUDE(FindPackageHandleStandardArgs)
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LLVM DEFAULT_MSG
|
||||
LLVM_LIBRARY)
|
||||
|
||||
MARK_AS_ADVANCED(
|
||||
LLVM_LIBRARY
|
||||
)
|
||||
|
68
build_files/cmake/Modules/FindLZO.cmake
Normal file
68
build_files/cmake/Modules/FindLZO.cmake
Normal file
@@ -0,0 +1,68 @@
|
||||
# - Find LZO library
|
||||
# Find the native LZO includes and library
|
||||
# This module defines
|
||||
# LZO_INCLUDE_DIRS, where to find lzo1x.h, Set when
|
||||
# LZO_INCLUDE_DIR is found.
|
||||
# LZO_LIBRARIES, libraries to link against to use LZO.
|
||||
# LZO_ROOT_DIR, The base directory to search for LZO.
|
||||
# This can also be an environment variable.
|
||||
# LZO_FOUND, If false, do not try to use LZO.
|
||||
#
|
||||
# also defined, but not for general use are
|
||||
# LZO_LIBRARY, where to find the LZO library.
|
||||
|
||||
#=============================================================================
|
||||
# Copyright 2015 Blender Foundation.
|
||||
#
|
||||
# Distributed under the OSI-approved BSD License (the "License");
|
||||
# see accompanying file Copyright.txt for details.
|
||||
#
|
||||
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the License for more information.
|
||||
#=============================================================================
|
||||
|
||||
# If LZO_ROOT_DIR was defined in the environment, use it.
|
||||
IF(NOT LZO_ROOT_DIR AND NOT $ENV{LZO_ROOT_DIR} STREQUAL "")
|
||||
SET(LZO_ROOT_DIR $ENV{LZO_ROOT_DIR})
|
||||
ENDIF()
|
||||
|
||||
SET(_lzo_SEARCH_DIRS
|
||||
${LZO_ROOT_DIR}
|
||||
/usr/local
|
||||
/sw # Fink
|
||||
/opt/local # DarwinPorts
|
||||
/opt/csw # Blastwave
|
||||
)
|
||||
|
||||
FIND_PATH(LZO_INCLUDE_DIR lzo/lzo1x.h
|
||||
HINTS
|
||||
${_lzo_SEARCH_DIRS}
|
||||
PATH_SUFFIXES
|
||||
include
|
||||
)
|
||||
|
||||
FIND_LIBRARY(LZO_LIBRARY
|
||||
NAMES
|
||||
lzo2
|
||||
HINTS
|
||||
${_lzo_SEARCH_DIRS}
|
||||
PATH_SUFFIXES
|
||||
lib64 lib
|
||||
)
|
||||
|
||||
# handle the QUIETLY and REQUIRED arguments and set LZO_FOUND to TRUE if
|
||||
# all listed variables are TRUE
|
||||
INCLUDE(FindPackageHandleStandardArgs)
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LZO DEFAULT_MSG
|
||||
LZO_LIBRARY LZO_INCLUDE_DIR)
|
||||
|
||||
IF(LZO_FOUND)
|
||||
SET(LZO_LIBRARIES ${LZO_LIBRARY})
|
||||
SET(LZO_INCLUDE_DIRS ${LZO_INCLUDE_DIR})
|
||||
ENDIF(LZO_FOUND)
|
||||
|
||||
MARK_AS_ADVANCED(
|
||||
LZO_INCLUDE_DIR
|
||||
LZO_LIBRARY
|
||||
)
|
@@ -40,7 +40,6 @@ FIND_PATH(PCRE_INCLUDE_DIR pcre.h
|
||||
${_pcre_SEARCH_DIRS}
|
||||
PATH_SUFFIXES
|
||||
include
|
||||
include
|
||||
)
|
||||
|
||||
FIND_LIBRARY(PCRE_LIBRARY
|
||||
|
@@ -14,6 +14,7 @@
|
||||
# PYTHON_INCLUDE_CONFIG_DIRS
|
||||
# PYTHON_LIBRARIES
|
||||
# PYTHON_LIBPATH, Used for installation
|
||||
# PYTHON_SITE_PACKAGES, Used for installation (as a Python module)
|
||||
# PYTHON_LINKFLAGS
|
||||
# PYTHON_ROOT_DIR, The base directory to search for Python.
|
||||
# This can also be an environment variable.
|
||||
@@ -65,6 +66,14 @@ IF(DEFINED PYTHON_LIBPATH)
|
||||
SET(_IS_LIB_PATH_DEF ON)
|
||||
ENDIF()
|
||||
|
||||
STRING(REPLACE "." "" _PYTHON_VERSION_NO_DOTS ${PYTHON_VERSION})
|
||||
|
||||
SET(_python_SEARCH_DIRS
|
||||
${PYTHON_ROOT_DIR}
|
||||
"$ENV{HOME}/py${_PYTHON_VERSION_NO_DOTS}"
|
||||
"/opt/py${_PYTHON_VERSION_NO_DOTS}"
|
||||
"/opt/lib/python-${PYTHON_VERSION}"
|
||||
)
|
||||
|
||||
# only search for the dirs if we havn't already
|
||||
IF((NOT _IS_INC_DEF) OR (NOT _IS_INC_CONF_DEF) OR (NOT _IS_LIB_DEF) OR (NOT _IS_LIB_PATH_DEF))
|
||||
@@ -74,14 +83,7 @@ IF((NOT _IS_INC_DEF) OR (NOT _IS_INC_CONF_DEF) OR (NOT _IS_LIB_DEF) OR (NOT _IS_
|
||||
"dm;dmu;du;d" # debug
|
||||
)
|
||||
|
||||
STRING(REPLACE "." "" _PYTHON_VERSION_NO_DOTS ${PYTHON_VERSION})
|
||||
|
||||
SET(_python_SEARCH_DIRS
|
||||
${PYTHON_ROOT_DIR}
|
||||
"$ENV{HOME}/py${_PYTHON_VERSION_NO_DOTS}"
|
||||
"/opt/py${_PYTHON_VERSION_NO_DOTS}"
|
||||
"/opt/lib/python-${PYTHON_VERSION}"
|
||||
)
|
||||
|
||||
FOREACH(_CURRENT_ABI_FLAGS ${_python_ABI_FLAGS})
|
||||
#IF(CMAKE_BUILD_TYPE STREQUAL Debug)
|
||||
@@ -146,6 +148,7 @@ IF((NOT _IS_INC_DEF) OR (NOT _IS_INC_CONF_DEF) OR (NOT _IS_LIB_DEF) OR (NOT _IS_
|
||||
ENDIF()
|
||||
|
||||
IF(PYTHON_LIBRARY AND PYTHON_LIBPATH AND PYTHON_INCLUDE_DIR AND PYTHON_INCLUDE_CONFIG_DIR)
|
||||
SET(_PYTHON_ABI_FLAGS "${_CURRENT_ABI_FLAGS}")
|
||||
break()
|
||||
ELSE()
|
||||
# ensure we dont find values from 2 different ABI versions
|
||||
@@ -168,7 +171,6 @@ IF((NOT _IS_INC_DEF) OR (NOT _IS_INC_CONF_DEF) OR (NOT _IS_LIB_DEF) OR (NOT _IS_
|
||||
UNSET(_CURRENT_PATH)
|
||||
|
||||
UNSET(_python_ABI_FLAGS)
|
||||
UNSET(_python_SEARCH_DIRS)
|
||||
ENDIF()
|
||||
|
||||
UNSET(_IS_INC_DEF)
|
||||
@@ -187,17 +189,41 @@ IF(PYTHONLIBSUNIX_FOUND)
|
||||
SET(PYTHON_INCLUDE_DIRS ${PYTHON_INCLUDE_DIR} ${PYTHON_INCLUDE_CONFIG_DIR})
|
||||
SET(PYTHON_LIBRARIES ${PYTHON_LIBRARY})
|
||||
|
||||
FIND_FILE(PYTHON_SITE_PACKAGES
|
||||
NAMES
|
||||
# debian specific
|
||||
dist-packages
|
||||
site-packages
|
||||
HINTS
|
||||
${PYTHON_LIBPATH}/python${PYTHON_VERSION}
|
||||
)
|
||||
|
||||
# we need this for installation
|
||||
# XXX No more valid with debian-like py3.4 packages...
|
||||
# GET_FILENAME_COMPONENT(PYTHON_LIBPATH ${PYTHON_LIBRARY} PATH)
|
||||
|
||||
# not used
|
||||
# SET(PYTHON_BINARY ${PYTHON_EXECUTABLE} CACHE STRING "")
|
||||
# not required for build, just used when bundling Python.
|
||||
FIND_PROGRAM(
|
||||
PYTHON_EXECUTABLE
|
||||
NAMES
|
||||
"python${PYTHON_VERSION}${_PYTHON_ABI_FLAGS}"
|
||||
"python${PYTHON_VERSION}"
|
||||
"python"
|
||||
HINTS
|
||||
${_python_SEARCH_DIRS}
|
||||
PATH_SUFFIXES bin
|
||||
)
|
||||
ENDIF()
|
||||
|
||||
UNSET(_PYTHON_VERSION_NO_DOTS)
|
||||
UNSET(_PYTHON_ABI_FLAGS)
|
||||
UNSET(_python_SEARCH_DIRS)
|
||||
|
||||
MARK_AS_ADVANCED(
|
||||
PYTHON_INCLUDE_DIR
|
||||
PYTHON_INCLUDE_CONFIG_DIR
|
||||
PYTHON_LIBRARY
|
||||
PYTHON_LIBPATH
|
||||
PYTHON_SITE_PACKAGES
|
||||
PYTHON_EXECUTABLE
|
||||
)
|
||||
|
@@ -60,7 +60,8 @@ if(EXISTS ${SOURCE_DIR}/.git)
|
||||
execute_process(COMMAND git log HEAD..@{u}
|
||||
WORKING_DIRECTORY ${SOURCE_DIR}
|
||||
OUTPUT_VARIABLE _git_below_check
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
ERROR_QUIET)
|
||||
if(NOT _git_below_check STREQUAL "")
|
||||
# If there're commits between HEAD and upstream this means
|
||||
# that we're reset-ed to older revision. Use it's hash then.
|
||||
|
@@ -28,13 +28,17 @@ if not sys.version.startswith("3"):
|
||||
sys.version.partition(" ")[0])
|
||||
sys.exit(1)
|
||||
|
||||
from cmake_consistency_check_config import IGNORE, UTF8_CHECK, SOURCE_DIR
|
||||
from cmake_consistency_check_config import (
|
||||
IGNORE,
|
||||
UTF8_CHECK,
|
||||
SOURCE_DIR,
|
||||
BUILD_DIR,
|
||||
)
|
||||
|
||||
|
||||
import os
|
||||
from os.path import join, dirname, normpath, splitext
|
||||
|
||||
print("Scanning:", SOURCE_DIR)
|
||||
|
||||
global_h = set()
|
||||
global_c = set()
|
||||
global_refs = {}
|
||||
@@ -134,6 +138,7 @@ def cmake_get_src(f):
|
||||
|
||||
if found:
|
||||
cmake_base = dirname(f)
|
||||
cmake_base_bin = os.path.join(BUILD_DIR, os.path.relpath(cmake_base, SOURCE_DIR))
|
||||
|
||||
while it is not None:
|
||||
i += 1
|
||||
@@ -154,6 +159,8 @@ def cmake_get_src(f):
|
||||
|
||||
# replace dirs
|
||||
l = l.replace("${CMAKE_CURRENT_SOURCE_DIR}", cmake_base)
|
||||
l = l.replace("${CMAKE_CURRENT_BINARY_DIR}", cmake_base_bin)
|
||||
l = l.strip('"')
|
||||
|
||||
if not l:
|
||||
pass
|
||||
@@ -193,13 +200,16 @@ def cmake_get_src(f):
|
||||
raise Exception("unknown file type - not c or h %s -> %s" % (f, new_file))
|
||||
|
||||
elif context_name == "INC":
|
||||
if os.path.isdir(new_file):
|
||||
if new_file.startswith(BUILD_DIR):
|
||||
# assume generated path
|
||||
pass
|
||||
elif os.path.isdir(new_file):
|
||||
new_path_rel = os.path.relpath(new_file, cmake_base)
|
||||
|
||||
if new_path_rel != l:
|
||||
print("overly relative path:\n %s:%d\n %s\n %s" % (f, i, l, new_path_rel))
|
||||
|
||||
## Save time. just replace the line
|
||||
# # Save time. just replace the line
|
||||
# replace_line(f, i - 1, new_path_rel)
|
||||
|
||||
else:
|
||||
@@ -230,10 +240,6 @@ def cmake_get_src(f):
|
||||
filen.close()
|
||||
|
||||
|
||||
for cmake in source_list(SOURCE_DIR, is_cmake):
|
||||
cmake_get_src(cmake)
|
||||
|
||||
|
||||
def is_ignore(f):
|
||||
for ig in IGNORE:
|
||||
if ig in f:
|
||||
@@ -241,73 +247,83 @@ def is_ignore(f):
|
||||
return False
|
||||
|
||||
|
||||
# First do stupid check, do these files exist?
|
||||
print("\nChecking for missing references:")
|
||||
is_err = False
|
||||
errs = []
|
||||
for f in (global_h | global_c):
|
||||
if f.endswith("dna.c"):
|
||||
continue
|
||||
def main():
|
||||
|
||||
if not os.path.exists(f):
|
||||
refs = global_refs[f]
|
||||
if refs:
|
||||
for cf, i in refs:
|
||||
errs.append((cf, i))
|
||||
else:
|
||||
raise Exception("CMake referenecs missing, internal error, aborting!")
|
||||
is_err = True
|
||||
print("Scanning:", SOURCE_DIR)
|
||||
|
||||
errs.sort()
|
||||
errs.reverse()
|
||||
for cf, i in errs:
|
||||
print("%s:%d" % (cf, i))
|
||||
# Write a 'sed' script, useful if we get a lot of these
|
||||
# print("sed '%dd' '%s' > '%s.tmp' ; mv '%s.tmp' '%s'" % (i, cf, cf, cf, cf))
|
||||
for cmake in source_list(SOURCE_DIR, is_cmake):
|
||||
cmake_get_src(cmake)
|
||||
|
||||
# First do stupid check, do these files exist?
|
||||
print("\nChecking for missing references:")
|
||||
is_err = False
|
||||
errs = []
|
||||
for f in (global_h | global_c):
|
||||
if f.startswith(BUILD_DIR):
|
||||
continue
|
||||
|
||||
if not os.path.exists(f):
|
||||
refs = global_refs[f]
|
||||
if refs:
|
||||
for cf, i in refs:
|
||||
errs.append((cf, i))
|
||||
else:
|
||||
raise Exception("CMake referenecs missing, internal error, aborting!")
|
||||
is_err = True
|
||||
|
||||
errs.sort()
|
||||
errs.reverse()
|
||||
for cf, i in errs:
|
||||
print("%s:%d" % (cf, i))
|
||||
# Write a 'sed' script, useful if we get a lot of these
|
||||
# print("sed '%dd' '%s' > '%s.tmp' ; mv '%s.tmp' '%s'" % (i, cf, cf, cf, cf))
|
||||
|
||||
|
||||
if is_err:
|
||||
raise Exception("CMake referenecs missing files, aborting!")
|
||||
del is_err
|
||||
del errs
|
||||
if is_err:
|
||||
raise Exception("CMake referenecs missing files, aborting!")
|
||||
del is_err
|
||||
del errs
|
||||
|
||||
# now check on files not accounted for.
|
||||
print("\nC/C++ Files CMake doesnt know about...")
|
||||
for cf in sorted(source_list(SOURCE_DIR, is_c)):
|
||||
if not is_ignore(cf):
|
||||
if cf not in global_c:
|
||||
print("missing_c: ", cf)
|
||||
# now check on files not accounted for.
|
||||
print("\nC/C++ Files CMake doesnt know about...")
|
||||
for cf in sorted(source_list(SOURCE_DIR, is_c)):
|
||||
if not is_ignore(cf):
|
||||
if cf not in global_c:
|
||||
print("missing_c: ", cf)
|
||||
|
||||
# check if automake builds a corrasponding .o file.
|
||||
'''
|
||||
if cf in global_c:
|
||||
out1 = os.path.splitext(cf)[0] + ".o"
|
||||
out2 = os.path.splitext(cf)[0] + ".Po"
|
||||
out2_dir, out2_file = out2 = os.path.split(out2)
|
||||
out2 = os.path.join(out2_dir, ".deps", out2_file)
|
||||
if not os.path.exists(out1) and not os.path.exists(out2):
|
||||
print("bad_c: ", cf)
|
||||
'''
|
||||
# check if automake builds a corrasponding .o file.
|
||||
'''
|
||||
if cf in global_c:
|
||||
out1 = os.path.splitext(cf)[0] + ".o"
|
||||
out2 = os.path.splitext(cf)[0] + ".Po"
|
||||
out2_dir, out2_file = out2 = os.path.split(out2)
|
||||
out2 = os.path.join(out2_dir, ".deps", out2_file)
|
||||
if not os.path.exists(out1) and not os.path.exists(out2):
|
||||
print("bad_c: ", cf)
|
||||
'''
|
||||
|
||||
print("\nC/C++ Headers CMake doesnt know about...")
|
||||
for hf in sorted(source_list(SOURCE_DIR, is_c_header)):
|
||||
if not is_ignore(hf):
|
||||
if hf not in global_h:
|
||||
print("missing_h: ", hf)
|
||||
print("\nC/C++ Headers CMake doesnt know about...")
|
||||
for hf in sorted(source_list(SOURCE_DIR, is_c_header)):
|
||||
if not is_ignore(hf):
|
||||
if hf not in global_h:
|
||||
print("missing_h: ", hf)
|
||||
|
||||
if UTF8_CHECK:
|
||||
# test encoding
|
||||
import traceback
|
||||
for files in (global_c, global_h):
|
||||
for f in sorted(files):
|
||||
if os.path.exists(f):
|
||||
# ignore outside of our source tree
|
||||
if "extern" not in f:
|
||||
i = 1
|
||||
try:
|
||||
for l in open(f, "r", encoding="utf8"):
|
||||
i += 1
|
||||
except UnicodeDecodeError:
|
||||
print("Non utf8: %s:%d" % (f, i))
|
||||
if i > 1:
|
||||
traceback.print_exc()
|
||||
if UTF8_CHECK:
|
||||
# test encoding
|
||||
import traceback
|
||||
for files in (global_c, global_h):
|
||||
for f in sorted(files):
|
||||
if os.path.exists(f):
|
||||
# ignore outside of our source tree
|
||||
if "extern" not in f:
|
||||
i = 1
|
||||
try:
|
||||
for l in open(f, "r", encoding="utf8"):
|
||||
i += 1
|
||||
except UnicodeDecodeError:
|
||||
print("Non utf8: %s:%d" % (f, i))
|
||||
if i > 1:
|
||||
traceback.print_exc()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
@@ -74,3 +74,6 @@ IGNORE = (
|
||||
UTF8_CHECK = True
|
||||
|
||||
SOURCE_DIR = os.path.normpath(os.path.abspath(os.path.normpath(os.path.join(os.path.dirname(__file__), "..", ".."))))
|
||||
|
||||
# doesn't have to exist, just use as reference
|
||||
BUILD_DIR = os.path.normpath(os.path.abspath(os.path.normpath(os.path.join(SOURCE_DIR, "..", "build"))))
|
||||
|
@@ -29,18 +29,19 @@ Example linux usage
|
||||
Windows not supported so far
|
||||
"""
|
||||
|
||||
from project_info import (SIMPLE_PROJECTFILE,
|
||||
SOURCE_DIR,
|
||||
CMAKE_DIR,
|
||||
PROJECT_DIR,
|
||||
source_list,
|
||||
is_project_file,
|
||||
is_c_header,
|
||||
# is_py,
|
||||
cmake_advanced_info,
|
||||
cmake_compiler_defines,
|
||||
project_name_get,
|
||||
)
|
||||
from project_info import (
|
||||
SIMPLE_PROJECTFILE,
|
||||
SOURCE_DIR,
|
||||
CMAKE_DIR,
|
||||
PROJECT_DIR,
|
||||
source_list,
|
||||
is_project_file,
|
||||
is_c_header,
|
||||
# is_py,
|
||||
cmake_advanced_info,
|
||||
cmake_compiler_defines,
|
||||
project_name_get,
|
||||
)
|
||||
|
||||
|
||||
import os
|
||||
|
@@ -22,26 +22,27 @@
|
||||
|
||||
# <pep8 compliant>
|
||||
|
||||
"""
|
||||
r"""
|
||||
Example Linux usage:
|
||||
python ~/blender-git/blender/build_files/cmake/cmake_qtcreator_project.py ~/blender-git/cmake
|
||||
|
||||
Example Win32 usage:
|
||||
c:\Python32\python.exe c:\blender_dev\blender\build_files\cmake\cmake_qtcreator_project.py c:\blender_dev\cmake_build
|
||||
|
||||
example linux usage
|
||||
python ~/blender-git/blender/build_files/cmake/cmake_qtcreator_project.py ~/blender-git/cmake
|
||||
"""
|
||||
|
||||
from project_info import (SIMPLE_PROJECTFILE,
|
||||
SOURCE_DIR,
|
||||
# CMAKE_DIR,
|
||||
PROJECT_DIR,
|
||||
source_list,
|
||||
is_project_file,
|
||||
is_c_header,
|
||||
is_py,
|
||||
cmake_advanced_info,
|
||||
cmake_compiler_defines,
|
||||
project_name_get,
|
||||
)
|
||||
from project_info import (
|
||||
SIMPLE_PROJECTFILE,
|
||||
SOURCE_DIR,
|
||||
# CMAKE_DIR,
|
||||
PROJECT_DIR,
|
||||
source_list,
|
||||
is_project_file,
|
||||
is_c_header,
|
||||
is_py,
|
||||
cmake_advanced_info,
|
||||
cmake_compiler_defines,
|
||||
project_name_get,
|
||||
)
|
||||
|
||||
import os
|
||||
import sys
|
||||
@@ -63,18 +64,19 @@ def create_qtc_project_main():
|
||||
if SIMPLE_PROJECTFILE:
|
||||
# --- qtcreator specific, simple format
|
||||
PROJECT_NAME = "Blender"
|
||||
with open(os.path.join(PROJECT_DIR, "%s.files" % PROJECT_NAME), 'w') as f:
|
||||
FILE_NAME = PROJECT_NAME.lower()
|
||||
with open(os.path.join(PROJECT_DIR, "%s.files" % FILE_NAME), 'w') as f:
|
||||
f.write("\n".join(files_rel))
|
||||
|
||||
with open(os.path.join(PROJECT_DIR, "%s.includes" % PROJECT_NAME), 'w') as f:
|
||||
with open(os.path.join(PROJECT_DIR, "%s.includes" % FILE_NAME), 'w') as f:
|
||||
f.write("\n".join(sorted(list(set(os.path.dirname(f)
|
||||
for f in files_rel if is_c_header(f))))))
|
||||
|
||||
qtc_prj = os.path.join(PROJECT_DIR, "%s.creator" % PROJECT_NAME)
|
||||
qtc_prj = os.path.join(PROJECT_DIR, "%s.creator" % FILE_NAME)
|
||||
with open(qtc_prj, 'w') as f:
|
||||
f.write("[General]\n")
|
||||
|
||||
qtc_cfg = os.path.join(PROJECT_DIR, "%s.config" % PROJECT_NAME)
|
||||
qtc_cfg = os.path.join(PROJECT_DIR, "%s.config" % FILE_NAME)
|
||||
if not os.path.exists(qtc_cfg):
|
||||
with open(qtc_cfg, 'w') as f:
|
||||
f.write("// ADD PREDEFINED MACROS HERE!\n")
|
||||
|
@@ -321,6 +321,9 @@ macro(setup_liblinks
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(WITH_LZO AND WITH_SYSTEM_LZO)
|
||||
target_link_libraries(${target} ${LZO_LIBRARIES})
|
||||
endif()
|
||||
if(WITH_SYSTEM_GLEW)
|
||||
target_link_libraries(${target} ${BLENDER_GLEW_LIBRARIES})
|
||||
endif()
|
||||
@@ -418,6 +421,12 @@ macro(setup_liblinks
|
||||
if(WITH_LLVM)
|
||||
target_link_libraries(${target} ${LLVM_LIBRARY})
|
||||
endif()
|
||||
if(WITH_ALEMBIC)
|
||||
target_link_libraries(${target} ${ALEMBIC_LIBRARIES})
|
||||
endif()
|
||||
if(WITH_HDF5)
|
||||
target_link_libraries(${target} ${HDF5_LIBRARIES})
|
||||
endif()
|
||||
if(WIN32 AND NOT UNIX)
|
||||
target_link_libraries(${target} ${PTHREADS_LIBRARIES})
|
||||
endif()
|
||||
@@ -495,6 +504,7 @@ macro(SETUP_BLENDER_SORTED_LIBS)
|
||||
bf_editor_object
|
||||
bf_editor_armature
|
||||
bf_editor_physics
|
||||
bf_editor_hair
|
||||
bf_editor_render
|
||||
bf_editor_screen
|
||||
bf_editor_sculpt_paint
|
||||
@@ -513,14 +523,15 @@ macro(SETUP_BLENDER_SORTED_LIBS)
|
||||
bf_ikplugin
|
||||
bf_modifiers
|
||||
bf_bmesh
|
||||
bf_gpu
|
||||
bf_blenkernel
|
||||
bf_physics
|
||||
bf_nodes
|
||||
bf_rna
|
||||
bf_gpu
|
||||
bf_blenloader
|
||||
bf_imbuf
|
||||
bf_blenlib
|
||||
bf_depsgraph
|
||||
bf_intern_ghost
|
||||
bf_intern_string
|
||||
bf_avi
|
||||
@@ -539,7 +550,6 @@ macro(SETUP_BLENDER_SORTED_LIBS)
|
||||
ge_phys_dummy
|
||||
ge_phys_bullet
|
||||
bf_intern_smoke
|
||||
extern_minilzo
|
||||
extern_lzma
|
||||
extern_colamd
|
||||
ge_logic_ketsji
|
||||
@@ -558,6 +568,8 @@ macro(SETUP_BLENDER_SORTED_LIBS)
|
||||
ge_videotex
|
||||
bf_dna
|
||||
bf_blenfont
|
||||
bf_pointcache_alembic
|
||||
bf_pointcache
|
||||
bf_intern_audaspace
|
||||
bf_intern_mikktspace
|
||||
bf_intern_dualcon
|
||||
@@ -593,6 +605,10 @@ macro(SETUP_BLENDER_SORTED_LIBS)
|
||||
list(APPEND BLENDER_SORTED_LIBS extern_eltopo)
|
||||
endif()
|
||||
|
||||
if(NOT WITH_SYSTEM_LZO)
|
||||
list(APPEND BLENDER_SORTED_LIBS extern_minilzo)
|
||||
endif()
|
||||
|
||||
if(NOT WITH_SYSTEM_GLEW)
|
||||
list(APPEND BLENDER_SORTED_LIBS ${BLENDER_GLEW_LIBRARIES})
|
||||
endif()
|
||||
@@ -955,6 +971,20 @@ macro(remove_strict_flags)
|
||||
|
||||
endmacro()
|
||||
|
||||
macro(remove_extra_strict_flags)
|
||||
if(CMAKE_COMPILER_IS_GNUCC)
|
||||
remove_cc_flag("-Wunused-parameter")
|
||||
endif()
|
||||
|
||||
if(CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||
remove_cc_flag("-Wunused-parameter")
|
||||
endif()
|
||||
|
||||
if(MSVC)
|
||||
# TODO
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
# note, we can only append flags on a single file so we need to negate the options.
|
||||
# at the moment we cant shut up ffmpeg deprecations, so use this, but will
|
||||
# probably add more removals here.
|
||||
|
@@ -27,7 +27,8 @@ if(EXISTS ${CMAKE_SOURCE_DIR}/.git/)
|
||||
execute_process(COMMAND git rev-parse --short @{u}
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
OUTPUT_VARIABLE MY_WC_HASH
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
ERROR_QUIET)
|
||||
endif()
|
||||
endif()
|
||||
set(BUILD_REV ${MY_WC_HASH})
|
||||
@@ -111,3 +112,9 @@ elseif(UNIX)
|
||||
"tar.bz2")
|
||||
endif()
|
||||
|
||||
unset(MAJOR_VERSION)
|
||||
unset(MINOR_VERSION)
|
||||
unset(PATCH_VERSION)
|
||||
|
||||
unset(BUILD_REV)
|
||||
|
||||
|
@@ -12,9 +12,9 @@ blender_version_char=$(sed -ne 's/.*BLENDER_VERSION_CHAR.*\([a-z]\)$/\1/p' $blen
|
||||
# map the version a -> 1
|
||||
# not to be confused with blender's internal subversions
|
||||
if [ "$blender_version_char" ]; then
|
||||
blender_version_full=${blender_version}.$(expr index abcdefghijklmnopqrstuvwxyz $blender_version_char)
|
||||
blender_version_full=${blender_version}.$(expr index abcdefghijklmnopqrstuvwxyz $blender_version_char)
|
||||
else
|
||||
blender_version_full=${blender_version}
|
||||
blender_version_full=${blender_version}
|
||||
fi
|
||||
|
||||
blender_ver_string=$blender_version+git$blender_version_full
|
||||
@@ -60,7 +60,7 @@ package() {
|
||||
cd $srcdir/build
|
||||
make DESTDIR="$pkgdir" install
|
||||
python -m compileall \
|
||||
$pkgdir/usr/share/blender/$blender_version/scripts/startup \
|
||||
$pkgdir/usr/share/blender/$blender_version/scripts/modules \
|
||||
$pkgdir/usr/share/blender/$blender_version/scripts/addons
|
||||
$pkgdir/usr/share/blender/$blender_version/scripts/startup \
|
||||
$pkgdir/usr/share/blender/$blender_version/scripts/modules \
|
||||
$pkgdir/usr/share/blender/$blender_version/scripts/addons
|
||||
}
|
||||
|
@@ -52,9 +52,9 @@ BF_OPENEXR = '/usr'
|
||||
# BF_OPENEXR_INC = '${BF_OPENEXR}/include/OpenEXR ${BF_OPENEXR}/include'
|
||||
|
||||
BF_OPENEXR_INC = '${BF_OPENEXR}/include/OpenEXR'
|
||||
BF_OPENEXR_LIB = 'Half IlmImf Iex Imath '
|
||||
BF_OPENEXR_LIB = 'Half IlmImf-2_1 Iex-2_1 Imath-2_1 '
|
||||
BF_OPENEXR_LIB_STATIC = '${BF_OPENEXR}/lib/libHalf.a ${BF_OPENEXR}/lib/libIlmImf.a ${BF_OPENEXR}/lib/libIex.a ${BF_OPENEXR}/lib/libImath.a ${BF_OPENEXR}/lib/libIlmThread.a'
|
||||
# BF_OPENEXR_LIBPATH = '${BF_OPENEXR}/lib'
|
||||
BF_OPENEXR_LIBPATH = '${BF_OPENEXR}/lib'
|
||||
|
||||
|
||||
WITH_BF_DDS = True
|
||||
@@ -226,11 +226,25 @@ BF_3DMOUSE_LIB_STATIC = '${BF_3DMOUSE_LIBPATH}/libspnav.a'
|
||||
#Freestyle
|
||||
WITH_BF_FREESTYLE = True
|
||||
|
||||
# HDF5
|
||||
WITH_BF_HDF5 = True
|
||||
BF_HDF5 = '/usr'
|
||||
BF_HDF5_LIB = 'hdf5 hdf5_hl'
|
||||
BF_HDF5_LIBPATH='${BF_HDF5}/lib'
|
||||
|
||||
# Alembic
|
||||
WITH_BF_ALEMBIC = True
|
||||
BF_ALEMBIC = '/opt/lib/alembic'
|
||||
BF_ALEMBIC_LIB = 'AlembicAbcGeom AlembicAbc AlembicAbcCollection AlembicAbcCoreFactory AlembicAbcCoreHDF5 AlembicAbcCoreAbstract AlembicAbcCoreOgawa AlembicAbcMaterial AlembicOgawa AlembicUtil'
|
||||
BF_ALEMBIC_INC = '${BF_ALEMBIC}/include'
|
||||
BF_ALEMBIC_LIBPATH='${BF_ALEMBIC}/lib/static'
|
||||
|
||||
##
|
||||
CC = 'gcc'
|
||||
CXX = 'g++'
|
||||
|
||||
CCFLAGS = ['-pipe','-fPIC','-funsigned-char','-fno-strict-aliasing','-D_LARGEFILE_SOURCE', '-D_FILE_OFFSET_BITS=64','-D_LARGEFILE64_SOURCE']
|
||||
CCFLAGS = ['-pipe','-fPIC','-funsigned-char','-fno-strict-aliasing', '-D_LARGEFILE_SOURCE', '-D_FILE_OFFSET_BITS=64','-D_LARGEFILE64_SOURCE']
|
||||
CFLAGS = ['-std=gnu89']
|
||||
CXXFLAGS = []
|
||||
|
||||
CPPFLAGS = []
|
||||
|
@@ -204,10 +204,20 @@ def setup_staticlibs(lenv):
|
||||
libincs += Split(lenv['BF_OIIO_LIBPATH'])
|
||||
if lenv['WITH_BF_STATICOIIO']:
|
||||
statlibs += Split(lenv['BF_OIIO_LIB_STATIC'])
|
||||
|
||||
if lenv['WITH_BF_HDF5']:
|
||||
libincs += Split(lenv['BF_HDF5_LIBPATH'])
|
||||
|
||||
if lenv['WITH_BF_ALEMBIC']:
|
||||
libincs += Split(lenv['BF_ALEMBIC_LIBPATH'])
|
||||
if lenv['WITH_BF_STATICALEMBIC']:
|
||||
statlibs += Split(lenv['BF_ALEMBIC_LIB_STATIC'])
|
||||
|
||||
if lenv['WITH_BF_OPENEXR']:
|
||||
libincs += Split(lenv['BF_OPENEXR_LIBPATH'])
|
||||
if lenv['WITH_BF_STATICOPENEXR']:
|
||||
statlibs += Split(lenv['BF_OPENEXR_LIB_STATIC'])
|
||||
|
||||
if lenv['WITH_BF_ZLIB'] and lenv['WITH_BF_STATICZLIB']:
|
||||
statlibs += Split(lenv['BF_ZLIB_LIB_STATIC'])
|
||||
|
||||
@@ -283,8 +293,16 @@ def setup_syslibs(lenv):
|
||||
if not lenv['WITH_BF_STATICOCIO']:
|
||||
syslibs += Split(lenv['BF_OCIO_LIB'])
|
||||
|
||||
if lenv['WITH_BF_HDF5']:
|
||||
syslibs += Split(lenv['BF_HDF5_LIB'])
|
||||
|
||||
if lenv['WITH_BF_ALEMBIC']:
|
||||
if not lenv['WITH_BF_STATICALEMBIC']:
|
||||
syslibs += Split(lenv['BF_ALEMBIC_LIB'])
|
||||
|
||||
if lenv['WITH_BF_OPENEXR'] and not lenv['WITH_BF_STATICOPENEXR']:
|
||||
syslibs += Split(lenv['BF_OPENEXR_LIB'])
|
||||
|
||||
if lenv['WITH_BF_ZLIB'] and not lenv['WITH_BF_STATICZLIB']:
|
||||
syslibs += Split(lenv['BF_ZLIB_LIB'])
|
||||
if lenv['WITH_BF_TIFF'] and not lenv['WITH_BF_STATICTIFF']:
|
||||
@@ -372,7 +390,23 @@ def propose_priorities():
|
||||
def creator(env):
|
||||
sources = ['creator.c']# + Blender.buildinfo(env, "dynamic") + Blender.resources
|
||||
|
||||
incs = ['#/intern/guardedalloc', '#/source/blender/blenlib', '#/source/blender/blenkernel', '#/source/blender/editors/include', '#/source/blender/blenloader', '#/source/blender/imbuf', '#/source/blender/renderconverter', '#/source/blender/render/extern/include', '#/source/blender/windowmanager', '#/source/blender/makesdna', '#/source/blender/makesrna', '#/source/gameengine/BlenderRoutines', '#/extern/glew/include', '#/source/blender/gpu', env['BF_OPENGL_INC']]
|
||||
incs = ['#/intern/guardedalloc',
|
||||
'#/source/blender/blenlib',
|
||||
'#/source/blender/blenkernel',
|
||||
'#/source/blender/depsgraph',
|
||||
'#/source/blender/editors/include',
|
||||
'#/source/blender/blenloader',
|
||||
'#/source/blender/imbuf',
|
||||
'#/source/blender/renderconverter',
|
||||
'#/source/blender/render/extern/include',
|
||||
'#/source/blender/windowmanager',
|
||||
'#/source/blender/makesdna',
|
||||
'#/source/blender/makesrna',
|
||||
'#/source/blender/pointcache',
|
||||
'#/source/gameengine/BlenderRoutines',
|
||||
'#/extern/glew/include',
|
||||
'#/source/blender/gpu',
|
||||
env['BF_OPENGL_INC']]
|
||||
|
||||
defs = []
|
||||
|
||||
@@ -441,7 +475,7 @@ def buildinfo(lenv, build_type):
|
||||
no_upstream = False
|
||||
|
||||
try :
|
||||
build_hash = btools.get_command_output(['git', 'rev-parse', '--short', '@{u}']).strip()
|
||||
build_hash = btools.get_command_output(['git', 'rev-parse', '--short', '@{u}'], stderr=subprocess.STDOUT).strip()
|
||||
except subprocess.CalledProcessError:
|
||||
# assume branch has no upstream configured
|
||||
build_hash = btools.get_command_output(['git', 'rev-parse', '--short', 'HEAD']).strip()
|
||||
@@ -630,7 +664,7 @@ def WinPyBundle(target=None, source=None, env=None):
|
||||
py_tar+= '/release/python' + env['BF_PYTHON_VERSION'].replace('.','') + '.tar.gz'
|
||||
|
||||
py_target = env.subst(env['BF_INSTALLDIR']).lstrip("#")
|
||||
py_target = os.path.join(py_target, VERSION, 'python', 'lib')
|
||||
py_target = os.path.join(py_target, VERSION, 'python')
|
||||
def printexception(func,path,ex):
|
||||
if os.path.exists(path): #do not report if path does not exist. eg on a fresh build.
|
||||
print str(func) + ' failed on ' + str(path)
|
||||
@@ -670,6 +704,8 @@ def WinPyBundle(target=None, source=None, env=None):
|
||||
py_dir += '/release/site-packages'
|
||||
# grr, we have to do one by one because the dir exists
|
||||
for f in os.listdir(py_dir):
|
||||
if f == '.svn':
|
||||
continue
|
||||
fn_src = os.path.join(py_dir, f)
|
||||
fn_dst = os.path.join(py_target, f)
|
||||
|
||||
@@ -816,6 +852,8 @@ def AppIt(target=None, source=None, env=None):
|
||||
instname = env['LCGDIR'][1:] # made libiomp5 part of blender libs
|
||||
cmd = 'ditto --arch %s %s/openmp/lib/libiomp5.dylib %s/%s.app/Contents/Resources/lib/'%(osxarch, instname, installdir, binary) # copy libiomp5
|
||||
commands.getoutput(cmd)
|
||||
cmd = 'cp %s/openmp/LICENSE.txt %s/LICENSE-libiomp5.txt'%(instname, installdir) # copy libiomp5 license
|
||||
commands.getoutput(cmd)
|
||||
|
||||
# extract copy system python, be sure to update other build systems
|
||||
# when making changes to the files that are copied.
|
||||
@@ -839,6 +877,7 @@ def UnixPyBundle(target=None, source=None, env=None):
|
||||
|
||||
py_src = env.subst( env['BF_PYTHON_LIBPATH'] + '/python'+env['BF_PYTHON_VERSION'] )
|
||||
py_target = env.subst( dir + '/python/' + target_lib + '/python'+env['BF_PYTHON_VERSION'] )
|
||||
py_target_bin = env.subst(dir + '/python/bin')
|
||||
|
||||
# This is a bit weak, but dont install if its been installed before, makes rebuilds quite slow.
|
||||
if os.path.exists(py_target):
|
||||
@@ -858,6 +897,11 @@ def UnixPyBundle(target=None, source=None, env=None):
|
||||
except:
|
||||
pass
|
||||
|
||||
# install the executable
|
||||
run("rm -rf '%s'" % py_target_bin)
|
||||
os.makedirs(py_target_bin)
|
||||
run("cp '%s' '%s'" % (env.subst(env['BF_PYTHON_BINARY']), py_target_bin))
|
||||
|
||||
run("cp -R '%s' '%s'" % (py_src, os.path.dirname(py_target)))
|
||||
run("rm -rf '%s/distutils'" % py_target)
|
||||
run("rm -rf '%s/lib2to3'" % py_target)
|
||||
|
@@ -182,7 +182,8 @@ def validate_arguments(args, bc):
|
||||
'WITH_BF_BOOST', 'WITH_BF_STATICBOOST', 'BF_BOOST', 'BF_BOOST_INC', 'BF_BOOST_LIB', 'BF_BOOST_LIB_INTERNATIONAL', 'BF_BOOST_LIB_STATIC', 'BF_BOOST_LIBPATH',
|
||||
'WITH_BF_LIBMV', 'WITH_BF_LIBMV_SCHUR_SPECIALIZATIONS',
|
||||
'WITH_BF_CYCLES_OSL', 'WITH_BF_STATICOSL', 'BF_OSL', 'BF_OSL_INC', 'BF_OSL_LIB', 'BF_OSL_LIBPATH', 'BF_OSL_LIB_STATIC', 'BF_OSL_COMPILER',
|
||||
'WITH_BF_LLVM', 'WITH_BF_STATICLLVM', 'BF_LLVM', 'BF_LLVM_LIB', 'BF_LLVM_LIBPATH', 'BF_LLVM_LIB_STATIC', 'BF_PROGRAM_LINKFLAGS'
|
||||
'WITH_BF_LLVM', 'WITH_BF_STATICLLVM', 'BF_LLVM', 'BF_LLVM_LIB', 'BF_LLVM_LIBPATH', 'BF_LLVM_LIB_STATIC', 'BF_PROGRAM_LINKFLAGS',
|
||||
'WITH_BF_ALEMBIC', 'BF_ALEMBIC', 'BF_ALEMBIC_INC', 'BF_ALEMBIC_LIB', 'BF_ALEMBIC_LIBPATH',
|
||||
]
|
||||
|
||||
# Have options here that scons expects to be lists
|
||||
@@ -198,7 +199,8 @@ def validate_arguments(args, bc):
|
||||
'C_WARN', 'CC_WARN', 'CXX_WARN',
|
||||
'LLIBS', 'PLATFORM_LINKFLAGS', 'MACOSX_ARCHITECTURE', 'MACOSX_SDK', 'XCODE_CUR_VER', 'C_COMPILER_ID',
|
||||
'BF_CYCLES_CUDA_BINARIES_ARCH', 'BF_PROGRAM_LINKFLAGS', 'MACOSX_DEPLOYMENT_TARGET',
|
||||
'WITH_BF_CYCLES_DEBUG', 'WITH_BF_CYCLES_LOGGING'
|
||||
'WITH_BF_CYCLES_DEBUG', 'WITH_BF_CYCLES_LOGGING',
|
||||
'WITH_BF_CPP11', 'WITH_BF_LEGACY_DEPSGRAPH',
|
||||
]
|
||||
|
||||
|
||||
@@ -580,6 +582,19 @@ def read_opts(env, cfg, args):
|
||||
(BoolVariable('WITH_BF_LIBMV_SCHUR_SPECIALIZATIONS', 'Enable fixed-size schur specializations', True)),
|
||||
|
||||
(BoolVariable('WITH_BF_COMPOSITOR', 'Enable the tile based nodal compositor', True)),
|
||||
|
||||
(BoolVariable('WITH_BF_HDF5', 'Use HDF5 if true', False)),
|
||||
('BF_HDF5', 'HDF5 base path', ''),
|
||||
('BF_HDF5_LIB', 'HDF5 library', ''),
|
||||
('BF_HDF5_LIBPATH', 'HDF5 library path', ''),
|
||||
|
||||
(BoolVariable('WITH_BF_ALEMBIC', 'Use Alembic if true', False)),
|
||||
(BoolVariable('WITH_BF_STATICALEMBIC', 'Staticly link to Alembic', False)),
|
||||
('BF_ALEMBIC', 'Alembic base path', ''),
|
||||
('BF_ALEMBIC_INC', 'Alembic include path', ''),
|
||||
('BF_ALEMBIC_LIB', 'Alembic library', ''),
|
||||
('BF_ALEMBIC_LIB_STATIC', 'Alembic static libraries', ''),
|
||||
('BF_ALEMBIC_LIBPATH', 'Alembic library path', ''),
|
||||
) # end of opts.AddOptions()
|
||||
|
||||
localopts.AddVariables(
|
||||
@@ -653,7 +668,11 @@ def read_opts(env, cfg, args):
|
||||
('BF_LLVM_LIBPATH', 'LLVM library path', ''),
|
||||
('BF_LLVM_LIB_STATIC', 'LLVM static library', ''),
|
||||
|
||||
('BF_PROGRAM_LINKFLAGS', 'Link flags applied only to final binaries (blender and blenderplayer, not makesrna/makesdna)', '')
|
||||
('BF_PROGRAM_LINKFLAGS', 'Link flags applied only to final binaries (blender and blenderplayer, not makesrna/makesdna)', ''),
|
||||
|
||||
(BoolVariable('WITH_BF_CPP11', '"Build with C++11 standard enabled, for development use only!', False)),
|
||||
|
||||
(BoolVariable('WITH_BF_LEGACY_DEPSGRAPH', 'Build Blender with legacy dependency graph', True)),
|
||||
) # end of opts.AddOptions()
|
||||
|
||||
return localopts
|
||||
|
2382
doc/doxygen/Doxyfile
2382
doc/doxygen/Doxyfile
File diff suppressed because it is too large
Load Diff
@@ -10,26 +10,14 @@
|
||||
* \ingroup intern
|
||||
*/
|
||||
|
||||
/** \defgroup boolop boolop
|
||||
* \ingroup intern
|
||||
*/
|
||||
|
||||
/** \defgroup ctr container
|
||||
* \ingroup intern
|
||||
*/
|
||||
|
||||
/** \defgroup decimation decimation
|
||||
* \ingroup intern
|
||||
*/
|
||||
|
||||
/** \defgroup elbeem elbeem
|
||||
* \ingroup intern
|
||||
*/
|
||||
|
||||
/** \defgroup bsp bsp
|
||||
* \ingroup intern
|
||||
*/
|
||||
|
||||
/** \defgroup iksolver iksolver
|
||||
* \ingroup intern
|
||||
*/
|
@@ -93,36 +93,44 @@
|
||||
|
||||
/* ================================ */
|
||||
|
||||
/** \defgroup blender blender */
|
||||
/** \defgroup blender Blender */
|
||||
|
||||
/** \defgroup blf blenfont
|
||||
/** \defgroup blf BlenFont
|
||||
* \ingroup blender
|
||||
*/
|
||||
|
||||
/** \defgroup bke blenkernel
|
||||
/** \defgroup bke BlenKernel
|
||||
* \ingroup blender
|
||||
*/
|
||||
|
||||
/** \defgroup bli blenlib
|
||||
/** \defgroup bli BlenLib
|
||||
* \ingroup blender
|
||||
*/
|
||||
|
||||
/** \defgroup nodes nodes
|
||||
/** \defgroup depsgraph Dependency Graph
|
||||
* \ingroup blender
|
||||
*/
|
||||
|
||||
/** \defgroup cmpnodes cmpnodes
|
||||
/** \defgroup bph Physics
|
||||
* \ingroup blender
|
||||
*/
|
||||
|
||||
/** \defgroup nodes Nodes
|
||||
* \ingroup blender
|
||||
*/
|
||||
|
||||
/** \defgroup cmpnodes Nodes (Compositor)
|
||||
* \ingroup nodes
|
||||
*/
|
||||
|
||||
/** \defgroup shdnodes shdnodes
|
||||
/** \defgroup shdnodes Nodes (Shader)
|
||||
* \ingroup nodes
|
||||
*/
|
||||
|
||||
/** \defgroup texnodes texnodes
|
||||
/** \defgroup texnodes Nodes (Texture)
|
||||
* \ingroup nodes
|
||||
*/
|
||||
/** \defgroup modifiers modifiers
|
||||
/** \defgroup modifiers Object Modifiers
|
||||
* \ingroup blender
|
||||
*/
|
||||
|
||||
@@ -132,29 +140,29 @@
|
||||
* \ingroup blender
|
||||
*/
|
||||
|
||||
/** \defgroup ikplugin ikplugin
|
||||
/** \defgroup ikplugin IK Plugin
|
||||
* \ingroup blender
|
||||
*/
|
||||
|
||||
/** \defgroup DNA sDNA
|
||||
/** \defgroup DNA Struct DNA (File Format)
|
||||
* \ingroup blender data
|
||||
*/
|
||||
/** \defgroup RNA RNA
|
||||
/** \defgroup RNA RNA (Data API)
|
||||
* \ingroup blender data
|
||||
*/
|
||||
|
||||
/** \defgroup blenloader .blend read and write functions
|
||||
/** \defgroup blenloader Blend file IO
|
||||
* \ingroup blender data
|
||||
* \todo check if \ref blo and \ref blenloader groups can be
|
||||
* merged in docs.
|
||||
*/
|
||||
|
||||
/** \defgroup quicktime quicktime
|
||||
/** \defgroup quicktime QuickTime
|
||||
* \ingroup blender
|
||||
|
||||
/** \defgroup gui GUI */
|
||||
|
||||
/** \defgroup wm windowmanager
|
||||
/** \defgroup wm Window Manager
|
||||
* \ingroup blender gui
|
||||
*/
|
||||
|
||||
@@ -324,7 +332,7 @@
|
||||
* \ingroup externformats
|
||||
*/
|
||||
|
||||
/** \defgroup imbuf IMage Buffer
|
||||
/** \defgroup imbuf Image Buffer (ImBuf)
|
||||
* \ingroup blender
|
||||
*/
|
||||
|
@@ -20,15 +20,15 @@ constraint_type = 2
|
||||
physics_id_1 = object_1.getPhysicsId()
|
||||
physics_id_2 = object_2.getPhysicsId()
|
||||
|
||||
# Use bottom right edge of Object1 for hinge position
|
||||
# use bottom right edge of Object1 for hinge position
|
||||
edge_position_x = 1.0
|
||||
edge_position_y = 0.0
|
||||
edge_position_z = -1.0
|
||||
|
||||
# use Object1 y axis for angle to point hinge
|
||||
# rotate the pivot z axis about 90 degrees
|
||||
edge_angle_x = 0.0
|
||||
edge_angle_y = 1.0
|
||||
edge_angle_z = 0.0
|
||||
edge_angle_y = 0.0
|
||||
edge_angle_z = 90.0
|
||||
|
||||
# create an edge constraint
|
||||
constraints.createConstraint(physics_id_1, physics_id_2,
|
||||
|
@@ -1,16 +1,19 @@
|
||||
"""
|
||||
.. _operator-execution_context:
|
||||
|
||||
Execution Context
|
||||
-----------------
|
||||
|
||||
When calling an operator you may want to pass the execution context.
|
||||
|
||||
This determines the context thats given to the operator to run in, and weather
|
||||
invoke() is called or execute().
|
||||
This determines the context that is given for the operator to run in, and whether
|
||||
invoke() is called or only execute().
|
||||
|
||||
'EXEC_DEFAULT' is used by default but you may want the operator to take user
|
||||
interaction with 'INVOKE_DEFAULT'.
|
||||
'EXEC_DEFAULT' is used by default, running only the execute() method, but you may
|
||||
want the operator to take user interaction with 'INVOKE_DEFAULT' which will also
|
||||
call invoke() if existing.
|
||||
|
||||
The execution context is as a non keyword, string argument in:
|
||||
The execution context is one of:
|
||||
('INVOKE_DEFAULT', 'INVOKE_REGION_WIN', 'INVOKE_REGION_CHANNELS',
|
||||
'INVOKE_REGION_PREVIEW', 'INVOKE_AREA', 'INVOKE_SCREEN', 'EXEC_DEFAULT',
|
||||
'EXEC_REGION_WIN', 'EXEC_REGION_CHANNELS', 'EXEC_REGION_PREVIEW', 'EXEC_AREA',
|
||||
|
@@ -3,7 +3,7 @@ PropertyGroup Example
|
||||
+++++++++++++++++++++
|
||||
|
||||
PropertyGroups can be used for collecting custom settings into one value
|
||||
to avoid many indervidual settings mixed in together.
|
||||
to avoid many individual settings mixed in together.
|
||||
"""
|
||||
|
||||
import bpy
|
||||
|
@@ -6,7 +6,7 @@ Custom properties can be added to any subclass of an :class:`ID`,
|
||||
:class:`Bone` and :class:`PoseBone`.
|
||||
|
||||
These properties can be animated, accessed by the user interface and python
|
||||
like blenders existing properties.
|
||||
like Blender's existing properties.
|
||||
"""
|
||||
|
||||
import bpy
|
||||
|
@@ -1,12 +1,11 @@
|
||||
"""
|
||||
Extending Menus
|
||||
+++++++++++++++
|
||||
When creating menus for addons you can't reference menus in blenders default
|
||||
When creating menus for addons you can't reference menus in Blender's default
|
||||
scripts.
|
||||
Instead, the addon can add menu items to existing menus.
|
||||
|
||||
Instead the addon can add menu items to existing menus.
|
||||
|
||||
The function menu_draw acts like Menu.draw
|
||||
The function menu_draw acts like :class:`Menu.draw`.
|
||||
"""
|
||||
import bpy
|
||||
|
||||
|
@@ -1,21 +1,20 @@
|
||||
"""
|
||||
Basic Menu Example
|
||||
++++++++++++++++++
|
||||
This script is a simple menu, menus differ from panels in that they must
|
||||
Here is an example of a simple menu. Menus differ from panels in that they must
|
||||
reference from a header, panel or another menu.
|
||||
|
||||
Notice the 'CATEGORY_MT_name' :class:`Menu.bl_idname`, this is a naming
|
||||
Notice the 'CATEGORY_MT_name' in :class:`Menu.bl_idname`, this is a naming
|
||||
convention for menus.
|
||||
|
||||
.. note::
|
||||
|
||||
Menu subclasses must be registered before referencing them from blender.
|
||||
|
||||
.. note::
|
||||
Menu's have their :class:`Layout.operator_context` initialized as
|
||||
'EXEC_REGION_WIN' rather then 'INVOKE_DEFAULT', so if the operator context
|
||||
needs to initialize inputs from the :class:`Operator.invoke` function
|
||||
then this needs to be explicitly set.
|
||||
Menus have their :class:`Layout.operator_context` initialized as
|
||||
'EXEC_REGION_WIN' rather than 'INVOKE_DEFAULT' (see :ref:`Execution Context <operator-execution_context>`).
|
||||
If the operator context needs to initialize inputs from the
|
||||
:class:`Operator.invoke` function, then this needs to be explicitly set.
|
||||
"""
|
||||
import bpy
|
||||
|
||||
|
@@ -11,51 +11,54 @@ Physics Constraints (bge.constraints)
|
||||
.. literalinclude:: ../examples/bge.constraints.py
|
||||
:lines: 6-
|
||||
|
||||
.. function:: createConstraint(physicsid, physicsid2, constrainttype, [pivotX, pivotY, pivotZ, [axisX, axisY, axisZ, [flag]]]])
|
||||
.. function:: createConstraint(physicsid_1, physicsid_2, constraint_type, pivot_X, pivot_y, pivot_z, axis_x, axis_y, axis_z, flag)
|
||||
|
||||
Creates a constraint.
|
||||
|
||||
:arg physicsid: the physics id of the first object in constraint
|
||||
:type physicsid: int
|
||||
Constraints types:
|
||||
- :class:`POINTTOPOINT_CONSTRAINT`
|
||||
- :class:`LINEHINGE_CONSTRAINT`
|
||||
- :class:`ANGULAR_CONSTRAINT`
|
||||
- :class:`CONETWIST_CONSTRAINT`
|
||||
- :class:`VEHICLE_CONSTRAINT`
|
||||
- :class:`GENERIC_6DOF_CONSTRAINT`
|
||||
|
||||
:arg physicsid2: the physics id of the second object in constraint
|
||||
:type physicsid2: int
|
||||
:arg physicsid_1: the physics id of the first object in constraint.
|
||||
:type physicsid_1: int
|
||||
|
||||
:arg constrainttype: the type of the constraint. The constraint types are:
|
||||
|
||||
- :class:`POINTTOPOINT_CONSTRAINT`
|
||||
- :class:`LINEHINGE_CONSTRAINT`
|
||||
- :class:`ANGULAR_CONSTRAINT`
|
||||
- :class:`CONETWIST_CONSTRAINT`
|
||||
- :class:`VEHICLE_CONSTRAINT`
|
||||
- :class:`GENERIC_6DOF_CONSTRAINT`
|
||||
:arg physicsid_2: the physics id of the second object in constraint.
|
||||
:type physicsid_2: int
|
||||
|
||||
:arg constrainttype: the type of the constraint.
|
||||
:type constrainttype: int
|
||||
|
||||
:arg pivotX: pivot X position
|
||||
:type pivotX: float
|
||||
:arg pivot_X: pivot X position (optional).
|
||||
:type pivot_X: float
|
||||
|
||||
:arg pivotY: pivot Y position
|
||||
:type pivotY: float
|
||||
:arg pivot_Y: pivot Y position (optional).
|
||||
:type pivot_Y: float
|
||||
|
||||
:arg pivotZ: pivot Z position
|
||||
:type pivotZ: float
|
||||
:arg pivot_Z: pivot Z position (optional).
|
||||
:type pivot_Z: float
|
||||
|
||||
:arg axisX: X axis
|
||||
:type axisX: float
|
||||
:arg axis_X: X axis angle in degrees (optional).
|
||||
:type axis_X: float
|
||||
|
||||
:arg axisY: Y axis
|
||||
:type axisY: float
|
||||
:arg axis_Y: Y axis angle in degrees (optional).
|
||||
:type axis_Y: float
|
||||
|
||||
:arg axisZ: Z axis
|
||||
:type axisZ: float
|
||||
:arg axis_Z: Z axis angle in degrees (optional).
|
||||
:type axis_Z: float
|
||||
|
||||
:arg flag: 128 to disable collision between linked bodies
|
||||
:arg flag: 128 to disable collision between linked bodies (optional).
|
||||
:type flag: int
|
||||
|
||||
:return: a constraint wrapper.
|
||||
:rtype: :class:`bge.types.KX_ConstraintWrapper`
|
||||
|
||||
.. attribute:: error
|
||||
|
||||
Simbolic constant string that indicates error.
|
||||
Symbolic constant string that indicates error.
|
||||
|
||||
.. function:: exportBulletFile(filename)
|
||||
|
||||
|
@@ -66,7 +66,7 @@ Constants
|
||||
.. data:: KX_BLENDER_GLSL_MATERIAL
|
||||
|
||||
Materials approximating blender materials with GLSL.
|
||||
|
||||
|
||||
.. DATA:: VSYNC_OFF
|
||||
|
||||
Disables vsync
|
||||
@@ -87,6 +87,7 @@ Constants
|
||||
|
||||
Right eye being used during stereoscopic rendering.
|
||||
|
||||
|
||||
*********
|
||||
Functions
|
||||
*********
|
||||
@@ -94,47 +95,55 @@ Functions
|
||||
.. function:: getWindowWidth()
|
||||
|
||||
Gets the width of the window (in pixels)
|
||||
|
||||
|
||||
:rtype: integer
|
||||
|
||||
.. function:: getWindowHeight()
|
||||
|
||||
Gets the height of the window (in pixels)
|
||||
|
||||
|
||||
:rtype: integer
|
||||
|
||||
.. function:: setWindowSize(width, height)
|
||||
|
||||
Set the width and height of the window (in pixels). This also works for fullscreen applications.
|
||||
|
||||
|
||||
:type width: integer
|
||||
:type height: integer
|
||||
|
||||
.. function:: setFullScreen(enable)
|
||||
|
||||
Set whether or not the window should be fullscreen.
|
||||
|
||||
|
||||
:type enable: bool
|
||||
|
||||
.. function:: getFullScreen()
|
||||
|
||||
Returns whether or not the window is fullscreen.
|
||||
|
||||
|
||||
:rtype: bool
|
||||
|
||||
.. function:: getDisplayDimensions()
|
||||
|
||||
Get the actual display dimensions, in pixels, of the physical display (e.g., the monitor).
|
||||
|
||||
:type dimension: list [width,heigh]
|
||||
|
||||
.. function:: makeScreenshot(filename)
|
||||
|
||||
Writes a screenshot to the given filename.
|
||||
|
||||
If filename starts with // the image will be saved relative to the current directory.
|
||||
If the filename contains # it will be replaced with the frame number.
|
||||
|
||||
The standalone player saves .png files. It does not support color space conversion
|
||||
or gamma correction.
|
||||
|
||||
When run from Blender, makeScreenshot supports all Blender image file formats like PNG, TGA, Jpeg and OpenEXR.
|
||||
Gamma, Colorspace conversion and Jpeg compression are taken from the Render settings panels.
|
||||
|
||||
Writes an image file with the current displayed frame.
|
||||
|
||||
The image is written to *'filename'*. The path may be absolute (eg. "/home/foo/image") or relative when started with
|
||||
"//" (eg. "//image"). Note that absolute paths are not portable between platforms.
|
||||
If the filename contains a "#", it will be replaced by an incremental index so that screenshots can be taken multiple
|
||||
times without overwriting the previous ones (eg. "image-#").
|
||||
|
||||
Settings for the image are taken from the render settings (file format and respective settings, gamma and colospace
|
||||
conversion, etc). The image resolution matches the framebuffer, meaning, the window size and aspect ratio.
|
||||
When running from the standalone player, instead of the embedded player, only PNG files are supported. Additional
|
||||
color conversions are also not supported.
|
||||
|
||||
:arg filename: path and name of the file to write
|
||||
:type filename: string
|
||||
|
||||
|
||||
@@ -146,65 +155,29 @@ Functions
|
||||
.. function:: showMouse(visible)
|
||||
|
||||
Enables or disables the operating system mouse cursor.
|
||||
|
||||
|
||||
:type visible: boolean
|
||||
|
||||
|
||||
.. function:: setMousePosition(x, y)
|
||||
|
||||
Sets the mouse cursor position.
|
||||
|
||||
|
||||
:type x: integer
|
||||
:type y: integer
|
||||
|
||||
|
||||
.. function:: setBackgroundColor(rgba)
|
||||
|
||||
Sets the window background color.
|
||||
|
||||
Sets the window background color. (Deprecated: use KX_WorldInfo.background_color)
|
||||
|
||||
:type rgba: list [r, g, b, a]
|
||||
|
||||
|
||||
.. function:: setMistColor(rgb)
|
||||
|
||||
Sets the mist color.
|
||||
|
||||
:type rgb: list [r, g, b]
|
||||
|
||||
|
||||
.. function:: setAmbientColor(rgb)
|
||||
|
||||
Sets the color of ambient light.
|
||||
|
||||
:type rgb: list [r, g, b]
|
||||
|
||||
|
||||
.. function:: setMistStart(start)
|
||||
|
||||
Sets the mist start value. Objects further away than start will have mist applied to them.
|
||||
|
||||
:type start: float
|
||||
|
||||
|
||||
.. function:: setMistEnd(end)
|
||||
|
||||
Sets the mist end value. Objects further away from this will be colored solid with
|
||||
the color set by setMistColor().
|
||||
|
||||
:type end: float
|
||||
|
||||
|
||||
.. function:: disableMist()
|
||||
|
||||
Disables mist.
|
||||
|
||||
.. note:: Set any of the mist properties to enable mist.
|
||||
|
||||
|
||||
.. function:: setEyeSeparation(eyesep)
|
||||
|
||||
Sets the eye separation for stereo mode. Usually Focal Length/30 provides a confortable value.
|
||||
|
||||
|
||||
:arg eyesep: The distance between the left and right eye.
|
||||
:type eyesep: float
|
||||
|
||||
@@ -212,21 +185,21 @@ Functions
|
||||
.. function:: getEyeSeparation()
|
||||
|
||||
Gets the current eye separation for stereo mode.
|
||||
|
||||
|
||||
:rtype: float
|
||||
|
||||
|
||||
|
||||
.. function:: setFocalLength(focallength)
|
||||
|
||||
Sets the focal length for stereo mode. It uses the current camera focal length as initial value.
|
||||
|
||||
:arg focallength: The focal length.
|
||||
|
||||
:arg focallength: The focal length.
|
||||
:type focallength: float
|
||||
|
||||
.. function:: getFocalLength()
|
||||
|
||||
Gets the current focal length for stereo mode.
|
||||
|
||||
|
||||
:rtype: float
|
||||
|
||||
.. function:: getStereoEye()
|
||||
@@ -241,7 +214,7 @@ Functions
|
||||
.. function:: setMaterialMode(mode)
|
||||
|
||||
Set the material mode to use for OpenGL rendering.
|
||||
|
||||
|
||||
:type mode: KX_TEXFACE_MATERIAL, KX_BLENDER_MULTITEX_MATERIAL, KX_BLENDER_GLSL_MATERIAL
|
||||
|
||||
.. note:: Changes will only affect newly created scenes.
|
||||
@@ -250,14 +223,14 @@ Functions
|
||||
.. function:: getMaterialMode(mode)
|
||||
|
||||
Get the material mode to use for OpenGL rendering.
|
||||
|
||||
|
||||
:rtype: KX_TEXFACE_MATERIAL, KX_BLENDER_MULTITEX_MATERIAL, KX_BLENDER_GLSL_MATERIAL
|
||||
|
||||
|
||||
.. function:: setGLSLMaterialSetting(setting, enable)
|
||||
|
||||
Enables or disables a GLSL material setting.
|
||||
|
||||
|
||||
:type setting: string (lights, shaders, shadows, ramps, nodes, extra_textures)
|
||||
:type enable: boolean
|
||||
|
||||
@@ -265,43 +238,43 @@ Functions
|
||||
.. function:: getGLSLMaterialSetting(setting, enable)
|
||||
|
||||
Get the state of a GLSL material setting.
|
||||
|
||||
|
||||
:type setting: string (lights, shaders, shadows, ramps, nodes, extra_textures)
|
||||
:rtype: boolean
|
||||
|
||||
.. function:: setAnisotropicFiltering(level)
|
||||
|
||||
Set the anisotropic filtering level for textures.
|
||||
|
||||
|
||||
:arg level: The new anisotropic filtering level to use
|
||||
:type level: integer (must be one of 1, 2, 4, 8, 16)
|
||||
|
||||
|
||||
.. note:: Changing this value can cause all textures to be recreated, which can be slow.
|
||||
|
||||
|
||||
.. function:: getAnisotropicFiltering()
|
||||
|
||||
Get the anisotropic filtering level used for textures.
|
||||
|
||||
|
||||
:rtype: integer (one of 1, 2, 4, 8, 16)
|
||||
|
||||
.. function:: setMipmapping(value)
|
||||
|
||||
Change how to use mipmapping.
|
||||
|
||||
|
||||
:type value: RAS_MIPMAP_NONE, RAS_MIPMAP_NEAREST, RAS_MIPMAP_LINEAR
|
||||
|
||||
|
||||
.. note:: Changing this value can cause all textures to be recreated, which can be slow.
|
||||
|
||||
.. function:: getMipmapping()
|
||||
|
||||
Get the current mipmapping setting.
|
||||
|
||||
|
||||
:rtype: RAS_MIPMAP_NONE, RAS_MIPMAP_NEAREST, RAS_MIPMAP_LINEAR
|
||||
|
||||
|
||||
.. function:: drawLine(fromVec,toVec,color)
|
||||
|
||||
Draw a line in the 3D scene.
|
||||
|
||||
|
||||
:arg fromVec: the origin of the line
|
||||
:type fromVec: list [x, y, z]
|
||||
:arg toVec: the end of the line
|
||||
@@ -313,7 +286,7 @@ Functions
|
||||
.. function:: enableMotionBlur(factor)
|
||||
|
||||
Enable the motion blur effect.
|
||||
|
||||
|
||||
:arg factor: the ammount of motion blur to display.
|
||||
:type factor: float [0.0 - 1.0]
|
||||
|
||||
|
@@ -23,15 +23,14 @@ base class --- :class:`PyObjectPlus`
|
||||
:arg axis:
|
||||
:type axis: integer
|
||||
|
||||
.. note::
|
||||
For each axis:
|
||||
* Lowerlimit == Upperlimit -> axis is locked
|
||||
* Lowerlimit > Upperlimit -> axis is free
|
||||
* Lowerlimit < Upperlimit -> axis it limited in that range
|
||||
.. note::
|
||||
* Lowerlimit == Upperlimit -> axis is locked
|
||||
* Lowerlimit > Upperlimit -> axis is free
|
||||
* Lowerlimit < Upperlimit -> axis it limited in that range
|
||||
|
||||
For PHY_LINEHINGE_CONSTRAINT = 2 or PHY_ANGULAR_CONSTRAINT = 3:
|
||||
|
||||
PHY_LINEHINGE_CONSTRAINT = 2 or PHY_ANGULAR_CONSTRAINT = 3:
|
||||
axis = 3 is a constraint limit, with low/high limit value
|
||||
|
||||
* 3: X axis angle
|
||||
|
||||
:arg value0 (min): Set the minimum limit of the axis
|
||||
@@ -39,7 +38,8 @@ base class --- :class:`PyObjectPlus`
|
||||
:arg value1 (max): Set the maximum limit of the axis
|
||||
:type value1: float
|
||||
|
||||
PHY_CONE_TWIST_CONSTRAINT = 3:
|
||||
For PHY_CONE_TWIST_CONSTRAINT = 4:
|
||||
|
||||
axis = 3..5 are constraint limits, high limit values
|
||||
* 3: X axis angle
|
||||
* 4: Y axis angle
|
||||
@@ -50,7 +50,8 @@ base class --- :class:`PyObjectPlus`
|
||||
:arg value1 (max): Set the maximum limit of the axis
|
||||
:type value1: float
|
||||
|
||||
PHY_GENERIC_6DOF_CONSTRAINT = 12:
|
||||
For PHY_GENERIC_6DOF_CONSTRAINT = 12:
|
||||
|
||||
axis = 0..2 are constraint limits, with low/high limit value
|
||||
* 0: X axis position
|
||||
* 1: Y axis position
|
||||
@@ -132,10 +133,10 @@ base class --- :class:`PyObjectPlus`
|
||||
Returns the contraint type (read only)
|
||||
|
||||
:type: integer
|
||||
- 1 = :class:`~bge.constraints.POINTTOPOINT_CONSTRAINT`
|
||||
- 2 = :class:`~bge.constraints.LINEHINGE_CONSTRAINT`
|
||||
- 3 = :class:`~bge.constraints.ANGULAR_CONSTRAINT`
|
||||
- 4 = :class:`~bge.constraints.CONETWIST_CONSTRAINT`
|
||||
- 11 = :class:`~bge.constraints.VEHICLE_CONSTRAINT`
|
||||
- 12 = :class:`~bge.constraints.GENERIC_6DOF_CONSTRAINT`
|
||||
|
||||
* 1 = POINTTOPOINT_CONSTRAINT
|
||||
* 2 = LINEHINGE_CONSTRAINT
|
||||
* 3 = ANGULAR_CONSTRAINT (aka LINEHINGE_CONSTRAINT)
|
||||
* 4 = CONETWIST_CONSTRAINT
|
||||
* 11 = VEHICLE_CONSTRAINT
|
||||
* 12 = GENERIC_6DOF_CONSTRAINT
|
||||
|
@@ -7,6 +7,26 @@ base class --- :class:`KX_GameObject`
|
||||
|
||||
.. class:: KX_FontObject(KX_GameObject)
|
||||
|
||||
TODO.
|
||||
A Font object.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
# Display a message about the exit key using a Font object.
|
||||
import bge
|
||||
|
||||
co = bge.logic.getCurrentController()
|
||||
font = co.owner
|
||||
|
||||
exit_key = bge.events.EventToString(bge.logic.getExitKey())
|
||||
|
||||
if exit_key.endswith("KEY"):
|
||||
exit_key = exit_key[:-3]
|
||||
|
||||
font.text = "Press key '%s' to quit the game." % exit_key
|
||||
|
||||
.. attribute:: text
|
||||
|
||||
The text displayed by this Font object.
|
||||
|
||||
:type: string
|
||||
|
||||
|
@@ -78,6 +78,14 @@ base class --- :class:`SCA_IObject`
|
||||
|
||||
The object must have a physics controller for the mass to be applied, otherwise the mass value will be returned as 0.0.
|
||||
|
||||
.. attribute:: isSuspendDynamics
|
||||
|
||||
The object's dynamic state (read-only).
|
||||
|
||||
:type: boolean
|
||||
|
||||
.. seealso:: :py:meth:`suspendDynamics` and :py:meth:`restoreDynamics` allow you to change the state.
|
||||
|
||||
.. attribute:: linearDamping
|
||||
|
||||
The object's linear damping, also known as translational damping. Can be set simultaneously with angular damping using the :py:meth:`setDamping` method.
|
||||
@@ -155,6 +163,18 @@ base class --- :class:`SCA_IObject`
|
||||
|
||||
:type: :class:`KX_GameObject` or None
|
||||
|
||||
.. attribute:: collisionGroup
|
||||
|
||||
The object's collision group.
|
||||
|
||||
:type: bitfield
|
||||
|
||||
.. attribute:: collisionMask
|
||||
|
||||
The object's collision mask.
|
||||
|
||||
:type: bitfield
|
||||
|
||||
.. attribute:: collisionCallbacks
|
||||
|
||||
A list of functions to be called when a collision occurs.
|
||||
@@ -432,6 +452,12 @@ base class --- :class:`SCA_IObject`
|
||||
If true, the object's and children's debug properties will be displayed on screen.
|
||||
|
||||
:type: boolean
|
||||
|
||||
.. attribute:: currentLodLevel
|
||||
|
||||
The index of the level of detail (LOD) currently used by this object (read-only).
|
||||
|
||||
:type: int
|
||||
|
||||
.. method:: endObject()
|
||||
|
||||
@@ -647,13 +673,19 @@ base class --- :class:`SCA_IObject`
|
||||
:arg angular_damping: Angular ("rotational") damping factor.
|
||||
:type angular_damping: float ∈ [0, 1]
|
||||
|
||||
.. method:: suspendDynamics()
|
||||
.. method:: suspendDynamics([ghost])
|
||||
|
||||
Suspends physics for this object.
|
||||
|
||||
:arg ghost: When set to `True`, collisions with the object will be ignored, similar to the "ghost" checkbox in
|
||||
Blender. When `False` (the default), the object becomes static but still collide with other objects.
|
||||
:type ghost: bool
|
||||
|
||||
.. seealso:: :py:attr:`isSuspendDynamics` allows you to inspect whether the object is in a suspended state.
|
||||
|
||||
.. method:: restoreDynamics()
|
||||
|
||||
Resumes physics for this object.
|
||||
Resumes physics for this object. Also reinstates collisions; the object will no longer be a ghost.
|
||||
|
||||
.. note::
|
||||
|
||||
|
@@ -83,6 +83,12 @@ base class --- :class:`PyObjectPlus`
|
||||
|
||||
This can be set directly from python to avoid using the :class:`KX_SceneActuator`.
|
||||
|
||||
.. attribute:: world
|
||||
|
||||
The current active world, (read-only).
|
||||
|
||||
:type: :class:`KX_WorldInfo`
|
||||
|
||||
.. attribute:: suspended
|
||||
|
||||
True if the scene is suspended, (read-only).
|
||||
@@ -119,21 +125,27 @@ base class --- :class:`PyObjectPlus`
|
||||
|
||||
:type: list
|
||||
|
||||
.. attribute:: pre_draw_setup
|
||||
|
||||
A list of callables to be run before the drawing setup (i.e., before the model view and projection matrices are computed).
|
||||
|
||||
:type: list
|
||||
|
||||
.. attribute:: gravity
|
||||
|
||||
The scene gravity using the world x, y and z axis.
|
||||
|
||||
:type: Vector((gx, gy, gz))
|
||||
|
||||
.. method:: addObject(object, other, time=0)
|
||||
.. method:: addObject(object, reference, time=0)
|
||||
|
||||
Adds an object to the scene like the Add Object Actuator would.
|
||||
|
||||
:arg object: The object to add
|
||||
:arg object: The (name of the) object to add.
|
||||
:type object: :class:`KX_GameObject` or string
|
||||
:arg other: The object's center to use when adding the object
|
||||
:type other: :class:`KX_GameObject` or string
|
||||
:arg time: The lifetime of the added object, in frames. A time of 0 means the object will last forever.
|
||||
:arg reference: The (name of the) object which position, orientation, and scale to copy (optional), if the object to add is a light and there is not reference the light's layer will be the same that the active layer in the blender scene.
|
||||
:type reference: :class:`KX_GameObject` or string
|
||||
:arg time: The lifetime of the added object, in frames. A time of 0 means the object will last forever (optional).
|
||||
:type time: integer
|
||||
:return: The newly added object.
|
||||
:rtype: :class:`KX_GameObject`
|
||||
|
79
doc/python_api/rst/bge_types/bge.types.KX_WorldInfo.rst
Normal file
79
doc/python_api/rst/bge_types/bge.types.KX_WorldInfo.rst
Normal file
@@ -0,0 +1,79 @@
|
||||
KX_WordlInfo(PyObjectPlus)
|
||||
=============================
|
||||
|
||||
.. module:: bge.types
|
||||
|
||||
base class --- :class:`PyObjectPlus`
|
||||
|
||||
.. class:: KX_WorldInfo(PyObjectPlus)
|
||||
|
||||
A wolrd object.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
# Set the mist color to red.
|
||||
import bge
|
||||
|
||||
sce = bge.logic.getCurrentScene()
|
||||
|
||||
sce.world.mistColor = [1.0, 0.0, 0.0]
|
||||
|
||||
.. data:: KX_MIST_QUADRATIC
|
||||
|
||||
Type of quadratic attenuation used to fade mist.
|
||||
|
||||
.. data:: KX_MIST_LINEAR
|
||||
|
||||
Type of linear attenuation used to fade mist.
|
||||
|
||||
.. data:: KX_MIST_INV_QUADRATIC
|
||||
|
||||
Type of inverse quadratic attenuation used to fade mist.
|
||||
|
||||
.. attribute:: mistEnable
|
||||
|
||||
Return the state of the mist.
|
||||
|
||||
:type: bool
|
||||
|
||||
.. attribute:: mistStart
|
||||
|
||||
The mist start point.
|
||||
|
||||
:type: float
|
||||
|
||||
.. attribute:: mistDistance
|
||||
|
||||
The mist distance fom the start point to reach 100% mist.
|
||||
|
||||
:type: float
|
||||
|
||||
.. attribute:: mistIntensity
|
||||
|
||||
The mist intensity.
|
||||
|
||||
:type: float
|
||||
|
||||
.. attribute:: mistType
|
||||
|
||||
The type of mist - must be KX_MIST_QUADRATIC, KX_MIST_LINEAR or KX_MIST_INV_QUADRATIC
|
||||
|
||||
.. attribute:: mistColor
|
||||
|
||||
The color of the mist. Black = [0.0, 0.0, 0.0], White = [1.0, 1.0, 1.0].
|
||||
Mist and background color sould always set to the same color.
|
||||
|
||||
:type: :class:`mathutils.Vector`
|
||||
|
||||
.. attribute:: backgroundColor
|
||||
|
||||
The color of the background. Black = [0.0, 0.0, 0.0], White = [1.0, 1.0, 1.0].
|
||||
Mist and background color sould always set to the same color.
|
||||
|
||||
:type: :class:`mathutils.Vector`
|
||||
|
||||
.. attribute:: ambientColor
|
||||
|
||||
The color of the ambient light. Black = [0.0, 0.0, 0.0], White = [1.0, 1.0, 1.0].
|
||||
|
||||
:type: :class:`mathutils.Vector`
|
@@ -23,8 +23,14 @@ base class --- :class:`SCA_ILogicBrick`
|
||||
|
||||
.. attribute:: frequency
|
||||
|
||||
The frequency for pulse mode sensors.
|
||||
|
||||
The frequency for pulse mode sensors. (Deprecated: use SCA_ISensor.skippedTicks)
|
||||
|
||||
:type: integer
|
||||
|
||||
.. attribute:: skippedTicks
|
||||
|
||||
Number of logic ticks skipped between 2 active pulses
|
||||
|
||||
:type: integer
|
||||
|
||||
.. attribute:: level
|
||||
|
@@ -86,9 +86,15 @@ Consider the calculations that might go into working out the object's final tran
|
||||
To avoid expensive recalculations every time a property is modified, Blender defers making the actual calculations until they are needed.
|
||||
|
||||
However, while the script runs you may want to access the updated values.
|
||||
In this case you need to call :class:`bpy.types.Scene.update` after modifying values, for example:
|
||||
|
||||
This can be done by calling :class:`bpy.types.Scene.update` after modifying values which recalculates all data that is tagged to be updated.
|
||||
.. code-block:: python
|
||||
|
||||
bpy.context.object.location = 1, 2, 3
|
||||
bpy.context.scene.update()
|
||||
|
||||
|
||||
Now all dependent data (child objects, modifiers, drivers... etc) has been recalculated and is available to the script.
|
||||
|
||||
Can I redraw during the script?
|
||||
-------------------------------
|
||||
|
@@ -138,19 +138,9 @@ def handle_args():
|
||||
parser.add_argument("-T", "--sphinx-theme",
|
||||
dest="sphinx_theme",
|
||||
type=str,
|
||||
default='default',
|
||||
help=
|
||||
# see SPHINX_THEMES below
|
||||
"Sphinx theme (default='default')\n"
|
||||
"Available themes\n"
|
||||
"----------------\n"
|
||||
"(Blender Foundation) blender-org\n" # naiad
|
||||
"(Sphinx) agogo, basic, epub, haiku, nature, "
|
||||
"scrolls, sphinxdoc, traditional\n",
|
||||
# choices=['naiad', 'blender-org'] + # bf
|
||||
# ['agogo', 'basic', 'epub',
|
||||
# 'haiku', 'nature', 'scrolls',
|
||||
# 'sphinxdoc', 'traditional'], # sphinx
|
||||
default="classic",
|
||||
help="Sphinx theme (default='classic'), "
|
||||
"see: http://sphinx-doc.org/theming.html",
|
||||
required=False)
|
||||
|
||||
parser.add_argument("-N", "--sphinx-named-output",
|
||||
@@ -267,6 +257,7 @@ else:
|
||||
"bpy.props",
|
||||
"bpy.types", # supports filtering
|
||||
"bpy.utils",
|
||||
"bpy.utils.previews",
|
||||
"bpy_extras",
|
||||
"gpu",
|
||||
"mathutils",
|
||||
@@ -419,23 +410,7 @@ BLENDER_ZIP_FILENAME = "%s.zip" % REFERENCE_NAME
|
||||
|
||||
# -------------------------------SPHINX-----------------------------------------
|
||||
|
||||
SPHINX_THEMES = {'bf': ['blender-org'], # , 'naiad',
|
||||
'sphinx': ['agogo',
|
||||
'basic',
|
||||
'default',
|
||||
'epub',
|
||||
'haiku',
|
||||
'nature',
|
||||
'scrolls',
|
||||
'sphinxdoc',
|
||||
'traditional']}
|
||||
|
||||
available_themes = SPHINX_THEMES['bf'] + SPHINX_THEMES['sphinx']
|
||||
if ARGS.sphinx_theme not in available_themes:
|
||||
print("Please choose a theme among: %s" % ', '.join(available_themes))
|
||||
sys.exit()
|
||||
|
||||
if ARGS.sphinx_theme in SPHINX_THEMES['bf']:
|
||||
if ARGS.sphinx_theme == "blender-org":
|
||||
SPHINX_THEME_DIR = os.path.join(ARGS.output_dir, ARGS.sphinx_theme)
|
||||
SPHINX_THEME_SVN_DIR = os.path.join(SCRIPT_DIR, ARGS.sphinx_theme)
|
||||
|
||||
@@ -480,9 +455,11 @@ ClassMethodDescriptorType = type(dict.__dict__['fromkeys'])
|
||||
MethodDescriptorType = type(dict.get)
|
||||
GetSetDescriptorType = type(int.real)
|
||||
StaticMethodType = type(staticmethod(lambda: None))
|
||||
from types import (MemberDescriptorType,
|
||||
MethodType,
|
||||
)
|
||||
from types import (
|
||||
MemberDescriptorType,
|
||||
MethodType,
|
||||
FunctionType,
|
||||
)
|
||||
|
||||
_BPY_STRUCT_FAKE = "bpy_struct"
|
||||
_BPY_PROP_COLLECTION_FAKE = "bpy_prop_collection"
|
||||
@@ -659,19 +636,26 @@ def pyfunc2sphinx(ident, fw, module_name, type_name, identifier, py_func, is_cla
|
||||
func_type = "function"
|
||||
|
||||
# ther rest are class methods
|
||||
elif arg_str.startswith("(self, "):
|
||||
arg_str = "(" + arg_str[7:]
|
||||
elif arg_str.startswith("(self, ") or arg_str == "(self)":
|
||||
arg_str = "()" if (arg_str == "(self)") else ("(" + arg_str[7:])
|
||||
func_type = "method"
|
||||
elif arg_str.startswith("(cls, "):
|
||||
arg_str = "(" + arg_str[6:]
|
||||
arg_str = "()" if (arg_str == "(cls)") else ("(" + arg_str[6:])
|
||||
func_type = "classmethod"
|
||||
else:
|
||||
func_type = "staticmethod"
|
||||
|
||||
fw(ident + ".. %s:: %s%s\n\n" % (func_type, identifier, arg_str))
|
||||
if py_func.__doc__:
|
||||
write_indented_lines(ident + " ", fw, py_func.__doc__)
|
||||
doc = py_func.__doc__
|
||||
if (not doc) or (not doc.startswith(".. %s:: " % func_type)):
|
||||
fw(ident + ".. %s:: %s%s\n\n" % (func_type, identifier, arg_str))
|
||||
ident_temp = ident + " "
|
||||
else:
|
||||
ident_temp = ident
|
||||
|
||||
if doc:
|
||||
write_indented_lines(ident_temp, fw, doc)
|
||||
fw("\n")
|
||||
del doc, ident_temp
|
||||
|
||||
if is_class:
|
||||
write_example_ref(ident + " ", fw, module_name + "." + type_name + "." + identifier)
|
||||
@@ -887,7 +871,7 @@ def pymodule2sphinx(basepath, module_name, module, title):
|
||||
module_dir_value_type.sort(key=lambda triple: str(triple[2]))
|
||||
|
||||
for attribute, value, value_type in module_dir_value_type:
|
||||
if value_type == types.FunctionType:
|
||||
if value_type == FunctionType:
|
||||
pyfunc2sphinx("", fw, module_name, None, attribute, value, is_class=False)
|
||||
elif value_type in {types.BuiltinMethodType, types.BuiltinFunctionType}: # both the same at the moment but to be future proof
|
||||
# note: can't get args from these, so dump the string as is
|
||||
@@ -942,19 +926,24 @@ def pymodule2sphinx(basepath, module_name, module, title):
|
||||
fw(value.__doc__)
|
||||
else:
|
||||
fw(".. class:: %s\n\n" % type_name)
|
||||
write_indented_lines(" ", fw, value.__doc__, False)
|
||||
write_indented_lines(" ", fw, value.__doc__, True)
|
||||
else:
|
||||
fw(".. class:: %s\n\n" % type_name)
|
||||
fw("\n")
|
||||
|
||||
write_example_ref(" ", fw, module_name + "." + type_name)
|
||||
|
||||
descr_items = [(key, descr) for key, descr in sorted(value.__dict__.items()) if not key.startswith("__")]
|
||||
descr_items = [(key, descr) for key, descr in sorted(value.__dict__.items()) if not key.startswith("_")]
|
||||
|
||||
for key, descr in descr_items:
|
||||
if type(descr) == ClassMethodDescriptorType:
|
||||
py_descr2sphinx(" ", fw, descr, module_name, type_name, key)
|
||||
|
||||
# needed for pure python classes
|
||||
for key, descr in descr_items:
|
||||
if type(descr) == FunctionType:
|
||||
pyfunc2sphinx(" ", fw, module_name, type_name, key, descr, is_class=True)
|
||||
|
||||
for key, descr in descr_items:
|
||||
if type(descr) == MethodDescriptorType:
|
||||
py_descr2sphinx(" ", fw, descr, module_name, type_name, key)
|
||||
@@ -1265,6 +1254,7 @@ def pyrna2sphinx(basepath):
|
||||
fw("\n\n")
|
||||
|
||||
subclass_ids = [s.identifier for s in structs.values() if s.base is struct if not rna_info.rna_id_ignore(s.identifier)]
|
||||
subclass_ids.sort()
|
||||
if subclass_ids:
|
||||
fw("subclasses --- \n" + ", ".join((":class:`%s`" % s) for s in subclass_ids) + "\n\n")
|
||||
|
||||
@@ -1572,7 +1562,7 @@ def write_sphinx_conf_py(basepath):
|
||||
if ARGS.sphinx_theme != 'default':
|
||||
fw("html_theme = '%s'\n" % ARGS.sphinx_theme)
|
||||
|
||||
if ARGS.sphinx_theme in SPHINX_THEMES['bf']:
|
||||
if ARGS.sphinx_theme == "blender-org":
|
||||
fw("html_theme_path = ['../']\n")
|
||||
# copied with the theme, exclude else we get an error [#28873]
|
||||
fw("html_favicon = 'favicon.ico'\n") # in <theme>/static/
|
||||
@@ -1633,6 +1623,7 @@ def write_rst_contents(basepath):
|
||||
|
||||
# py modules
|
||||
"bpy.utils",
|
||||
"bpy.utils.previews",
|
||||
"bpy.path",
|
||||
"bpy.app",
|
||||
"bpy.app.handlers",
|
||||
@@ -1987,7 +1978,7 @@ def main():
|
||||
copy_function=shutil.copy)
|
||||
|
||||
# eventually, copy the theme dir
|
||||
if ARGS.sphinx_theme in SPHINX_THEMES['bf']:
|
||||
if ARGS.sphinx_theme == "blender-org":
|
||||
if os.path.exists(SPHINX_THEME_DIR):
|
||||
shutil.rmtree(SPHINX_THEME_DIR, True)
|
||||
shutil.copytree(SPHINX_THEME_SVN_DIR,
|
||||
|
7
extern/CMakeLists.txt
vendored
7
extern/CMakeLists.txt
vendored
@@ -26,11 +26,14 @@
|
||||
# Otherwise we get warnings here that we cant fix in external projects
|
||||
remove_strict_flags()
|
||||
|
||||
add_subdirectory(colamd)
|
||||
add_subdirectory(rangetree)
|
||||
add_subdirectory(wcwidth)
|
||||
add_subdirectory(libmv)
|
||||
|
||||
if(WITH_OPENNL)
|
||||
add_subdirectory(colamd)
|
||||
endif()
|
||||
|
||||
if(WITH_BULLET)
|
||||
if(NOT WITH_SYSTEM_BULLET)
|
||||
add_subdirectory(bullet2)
|
||||
@@ -66,7 +69,7 @@ if(WITH_IMAGE_REDCODE)
|
||||
add_subdirectory(libredcode)
|
||||
endif()
|
||||
|
||||
if(WITH_LZO)
|
||||
if(WITH_LZO AND NOT WITH_SYSTEM_LZO)
|
||||
add_subdirectory(lzo)
|
||||
endif()
|
||||
|
||||
|
1
extern/bullet2/src/Bullet-C-Api.h
vendored
1
extern/bullet2/src/Bullet-C-Api.h
vendored
@@ -171,6 +171,7 @@ extern "C" {
|
||||
/* Convex Hull */
|
||||
PL_DECLARE_HANDLE(plConvexHull);
|
||||
plConvexHull plConvexHullCompute(float (*coords)[3], int count);
|
||||
void plConvexHullDelete(plConvexHull hull);
|
||||
int plConvexHullNumVertices(plConvexHull hull);
|
||||
int plConvexHullNumFaces(plConvexHull hull);
|
||||
void plConvexHullGetVertex(plConvexHull hull, int n, float coords[3], int *original_index);
|
||||
|
@@ -15,7 +15,7 @@ subject to the following restrictions:
|
||||
|
||||
|
||||
/**
|
||||
* @mainpage Bullet Documentation
|
||||
* @page Bullet Documentation
|
||||
*
|
||||
* @section intro_sec Introduction
|
||||
* Bullet is a Collision Detection and Rigid Body Dynamics Library. The Library is Open Source and free for commercial use, under the ZLib license ( http://opensource.org/licenses/zlib-license.php ).
|
||||
|
@@ -413,6 +413,12 @@ plConvexHull plConvexHullCompute(float (*coords)[3], int count)
|
||||
return reinterpret_cast<plConvexHull>(computer);
|
||||
}
|
||||
|
||||
void plConvexHullDelete(plConvexHull hull)
|
||||
{
|
||||
btConvexHullComputer *computer(reinterpret_cast< btConvexHullComputer* >(hull));
|
||||
delete computer;
|
||||
}
|
||||
|
||||
int plConvexHullNumVertices(plConvexHull hull)
|
||||
{
|
||||
btConvexHullComputer *computer(reinterpret_cast< btConvexHullComputer* >(hull));
|
||||
|
24
extern/clew/include/clew.h
vendored
24
extern/clew/include/clew.h
vendored
@@ -2751,6 +2751,30 @@ CLEW_FUN_EXPORT PFNCLGETGLCONTEXTINFOKHR __clewGetGLContextInfoKH
|
||||
#endif
|
||||
#define clGetGLContextInfoKHR CLEW_GET_FUN(__clewGetGLContextInfoKHR )
|
||||
|
||||
/* cl_ext */
|
||||
|
||||
/******************************************
|
||||
* cl_nv_device_attribute_query extension *
|
||||
******************************************/
|
||||
/* cl_nv_device_attribute_query extension - no extension #define since it has no functions */
|
||||
#define CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV 0x4000
|
||||
#define CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV 0x4001
|
||||
#define CL_DEVICE_REGISTERS_PER_BLOCK_NV 0x4002
|
||||
#define CL_DEVICE_WARP_SIZE_NV 0x4003
|
||||
#define CL_DEVICE_GPU_OVERLAP_NV 0x4004
|
||||
#define CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV 0x4005
|
||||
#define CL_DEVICE_INTEGRATED_MEMORY_NV 0x4006
|
||||
|
||||
/*********************************
|
||||
* cl_amd_device_attribute_query *
|
||||
*********************************/
|
||||
#define CL_DEVICE_PROFILING_TIMER_OFFSET_AMD 0x4036
|
||||
|
||||
/*********************************
|
||||
* cl_arm_printf extension
|
||||
*********************************/
|
||||
#define CL_PRINTF_CALLBACK_ARM 0x40B0
|
||||
#define CL_PRINTF_BUFFERSIZE_ARM 0x40B1
|
||||
|
||||
#define CLEW_SUCCESS 0 //!< Success error code
|
||||
#define CLEW_ERROR_OPEN_FAILED -1 //!< Error code for failing to open the dynamic library
|
||||
|
2
extern/libmv/CMakeLists.txt
vendored
2
extern/libmv/CMakeLists.txt
vendored
@@ -48,7 +48,7 @@ if(WITH_LIBMV OR WITH_GTESTS OR (WITH_CYCLES AND WITH_CYCLES_LOGGING))
|
||||
)
|
||||
|
||||
list(APPEND INC_SYS
|
||||
../Eigen3
|
||||
${EIGEN3_INCLUDE_DIRS}
|
||||
${PNG_INCLUDE_DIRS}
|
||||
${ZLIB_INCLUDE_DIRS}
|
||||
)
|
||||
|
2
extern/libmv/bundle.sh
vendored
2
extern/libmv/bundle.sh
vendored
@@ -141,7 +141,7 @@ if(WITH_LIBMV OR WITH_GTESTS OR (WITH_CYCLES AND WITH_CYCLES_LOGGING))
|
||||
)
|
||||
|
||||
list(APPEND INC_SYS
|
||||
../Eigen3
|
||||
\${EIGEN3_INCLUDE_DIRS}
|
||||
\${PNG_INCLUDE_DIRS}
|
||||
\${ZLIB_INCLUDE_DIRS}
|
||||
)
|
||||
|
14
extern/libmv/intern/stub.cc
vendored
14
extern/libmv/intern/stub.cc
vendored
@@ -179,20 +179,20 @@ void libmv_reconstructionDestroy(
|
||||
|
||||
/* ************ Feature detector ************ */
|
||||
|
||||
libmv_Features *libmv_detectFeaturesByte(const unsigned char */*image_buffer*/,
|
||||
libmv_Features *libmv_detectFeaturesByte(const unsigned char * /*image_buffer*/,
|
||||
int /*width*/,
|
||||
int /*height*/,
|
||||
int /*channels*/,
|
||||
libmv_DetectOptions */*options*/) {
|
||||
libmv_DetectOptions * /*options*/) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct libmv_Features *libmv_detectFeaturesFloat(
|
||||
const float */*image_buffer*/,
|
||||
const float * /*image_buffer*/,
|
||||
int /*width*/,
|
||||
int /*height*/,
|
||||
int /*channels*/,
|
||||
libmv_DetectOptions */*options*/) {
|
||||
libmv_DetectOptions * /*options*/) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -247,7 +247,7 @@ void libmv_cameraIntrinsicsSetThreads(
|
||||
}
|
||||
|
||||
void libmv_cameraIntrinsicsExtractOptions(
|
||||
const libmv_CameraIntrinsics */*libmv_intrinsics*/,
|
||||
const libmv_CameraIntrinsics * /*libmv_intrinsics*/,
|
||||
libmv_CameraIntrinsicsOptions *camera_intrinsics_options) {
|
||||
memset(camera_intrinsics_options, 0, sizeof(libmv_CameraIntrinsicsOptions));
|
||||
camera_intrinsics_options->focal_length = 1.0;
|
||||
@@ -355,7 +355,7 @@ void libmv_autoTrackSetOptions(libmv_AutoTrack* /*libmv_autotrack*/,
|
||||
|
||||
int libmv_autoTrackMarker(libmv_AutoTrack* /*libmv_autotrack*/,
|
||||
const libmv_TrackRegionOptions* /*libmv_options*/,
|
||||
libmv_Marker */*libmv_tracker_marker*/,
|
||||
libmv_Marker * /*libmv_tracker_marker*/,
|
||||
libmv_TrackRegionResult* /*libmv_result*/)
|
||||
{
|
||||
return 0;
|
||||
@@ -390,7 +390,7 @@ void libmv_FrameAccessorDestroy(libmv_FrameAccessor* /*frame_accessor*/)
|
||||
}
|
||||
|
||||
int64_t libmv_frameAccessorgetTransformKey(
|
||||
const libmv_FrameTransform */*transform*/)
|
||||
const libmv_FrameTransform * /*transform*/)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
1
extern/libmv/libmv/autotrack/autotrack.cc
vendored
1
extern/libmv/libmv/autotrack/autotrack.cc
vendored
@@ -154,6 +154,7 @@ bool AutoTrack::TrackMarker(Marker* tracked_marker,
|
||||
frame_accessor_,
|
||||
&tracked_image);
|
||||
if (!tracked_key) {
|
||||
frame_accessor_->ReleaseImage(reference_key);
|
||||
LG << "Couldn't get frame for tracked marker: " << tracked_marker;
|
||||
return false;
|
||||
}
|
||||
|
25
extern/libmv/libmv/multiview/homography.cc
vendored
25
extern/libmv/libmv/multiview/homography.cc
vendored
@@ -179,8 +179,12 @@ void GetNormalizedPoints(const Mat &original_points,
|
||||
class HomographySymmetricGeometricCostFunctor {
|
||||
public:
|
||||
HomographySymmetricGeometricCostFunctor(const Vec2 &x,
|
||||
const Vec2 &y)
|
||||
: x_(x), y_(y) { }
|
||||
const Vec2 &y) {
|
||||
xx_ = x(0);
|
||||
xy_ = x(1);
|
||||
yx_ = y(0);
|
||||
yy_ = y(1);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
bool operator()(const T *homography_parameters, T *residuals) const {
|
||||
@@ -189,8 +193,8 @@ class HomographySymmetricGeometricCostFunctor {
|
||||
|
||||
Mat3 H(homography_parameters);
|
||||
|
||||
Vec3 x(T(x_(0)), T(x_(1)), T(1.0));
|
||||
Vec3 y(T(y_(0)), T(y_(1)), T(1.0));
|
||||
Vec3 x(T(xx_), T(xy_), T(1.0));
|
||||
Vec3 y(T(yx_), T(yy_), T(1.0));
|
||||
|
||||
Vec3 H_x = H * x;
|
||||
Vec3 Hinv_y = H.inverse() * y;
|
||||
@@ -199,18 +203,19 @@ class HomographySymmetricGeometricCostFunctor {
|
||||
Hinv_y /= Hinv_y(2);
|
||||
|
||||
// This is a forward error.
|
||||
residuals[0] = H_x(0) - T(y_(0));
|
||||
residuals[1] = H_x(1) - T(y_(1));
|
||||
residuals[0] = H_x(0) - T(yx_);
|
||||
residuals[1] = H_x(1) - T(yy_);
|
||||
|
||||
// This is a backward error.
|
||||
residuals[2] = Hinv_y(0) - T(x_(0));
|
||||
residuals[3] = Hinv_y(1) - T(x_(1));
|
||||
residuals[2] = Hinv_y(0) - T(xx_);
|
||||
residuals[3] = Hinv_y(1) - T(xy_);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
const Vec2 &x_;
|
||||
const Vec2 &y_;
|
||||
// TODO(sergey): Think of better naming.
|
||||
double xx_, xy_;
|
||||
double yx_, yy_;
|
||||
};
|
||||
|
||||
// Termination checking callback used for homography estimation.
|
||||
|
@@ -36,7 +36,7 @@ set(INC
|
||||
)
|
||||
|
||||
set(INC_SYS
|
||||
../../../Eigen3
|
||||
${EIGEN3_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
set(SRC
|
||||
|
2
extern/libmv/third_party/ceres/bundle.sh
vendored
2
extern/libmv/third_party/ceres/bundle.sh
vendored
@@ -129,7 +129,7 @@ set(INC
|
||||
)
|
||||
|
||||
set(INC_SYS
|
||||
../../../Eigen3
|
||||
${EIGEN3_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
set(SRC
|
||||
|
6
extern/rangetree/range_tree_c_api.h
vendored
6
extern/rangetree/range_tree_c_api.h
vendored
@@ -14,8 +14,8 @@
|
||||
02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef RANGE_TREE_C_API_H
|
||||
#define RANGE_TREE_C_API_H
|
||||
#ifndef __RANGE_TREE_C_API_H__
|
||||
#define __RANGE_TREE_C_API_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@@ -59,4 +59,4 @@ unsigned int range_tree_uint_allocation_lower_bound(const RangeTreeUInt *rt);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __DUALCON_H__ */
|
||||
#endif /* __RANGE_TREE_C_API_H__ */
|
||||
|
@@ -77,6 +77,27 @@
|
||||
# define LG_SIZEOF_INT 2
|
||||
#endif
|
||||
|
||||
/************************/
|
||||
/* Function prototypes. */
|
||||
|
||||
#if (LG_SIZEOF_PTR == 3 || LG_SIZEOF_INT == 3)
|
||||
ATOMIC_INLINE uint64_t atomic_add_uint64(uint64_t *p, uint64_t x);
|
||||
ATOMIC_INLINE uint64_t atomic_sub_uint64(uint64_t *p, uint64_t x);
|
||||
ATOMIC_INLINE uint64_t atomic_cas_uint64(uint64_t *v, uint64_t old, uint64_t _new);
|
||||
#endif
|
||||
|
||||
ATOMIC_INLINE uint32_t atomic_add_uint32(uint32_t *p, uint32_t x);
|
||||
ATOMIC_INLINE uint32_t atomic_sub_uint32(uint32_t *p, uint32_t x);
|
||||
ATOMIC_INLINE uint32_t atomic_cas_uint32(uint32_t *v, uint32_t old, uint32_t _new);
|
||||
|
||||
ATOMIC_INLINE size_t atomic_add_z(size_t *p, size_t x);
|
||||
ATOMIC_INLINE size_t atomic_sub_z(size_t *p, size_t x);
|
||||
ATOMIC_INLINE size_t atomic_cas_z(size_t *v, size_t old, size_t _new);
|
||||
|
||||
ATOMIC_INLINE unsigned atomic_add_u(unsigned *p, unsigned x);
|
||||
ATOMIC_INLINE unsigned atomic_sub_u(unsigned *p, unsigned x);
|
||||
ATOMIC_INLINE unsigned atomic_cas_u(unsigned *v, unsigned old, unsigned _new);
|
||||
|
||||
/******************************************************************************/
|
||||
/* 64-bit operations. */
|
||||
#if (LG_SIZEOF_PTR == 3 || LG_SIZEOF_INT == 3)
|
||||
|
@@ -19,6 +19,8 @@
|
||||
#
|
||||
# ***** END LGPL LICENSE BLOCK *****
|
||||
|
||||
remove_extra_strict_flags()
|
||||
|
||||
set(INC
|
||||
.
|
||||
FX
|
||||
|
@@ -97,7 +97,7 @@ bool AUD_OpenALDevice::AUD_OpenALHandle::pause(bool keep)
|
||||
return false;}
|
||||
|
||||
AUD_OpenALDevice::AUD_OpenALHandle::AUD_OpenALHandle(AUD_OpenALDevice* device, ALenum format, boost::shared_ptr<AUD_IReader> reader, bool keep) :
|
||||
m_isBuffered(false), m_reader(reader), m_keep(keep), m_format(format), m_current(0), m_bytepos(0),
|
||||
m_isBuffered(false), m_reader(reader), m_keep(keep), m_format(format), m_current(0),
|
||||
m_eos(false), m_loopcount(0), m_stop(NULL), m_stop_data(NULL), m_status(AUD_STATUS_PLAYING),
|
||||
m_device(device)
|
||||
{
|
||||
@@ -208,8 +208,6 @@ bool AUD_OpenALDevice::AUD_OpenALHandle::stop()
|
||||
if(!m_isBuffered)
|
||||
alDeleteBuffers(CYCLE_BUFFERS, m_buffers);
|
||||
|
||||
m_bytepos = 0;
|
||||
|
||||
for(AUD_HandleIterator it = m_device->m_playingSounds.begin(); it != m_device->m_playingSounds.end(); it++)
|
||||
{
|
||||
if(it->get() == this)
|
||||
@@ -271,61 +269,55 @@ bool AUD_OpenALDevice::AUD_OpenALHandle::seek(float position)
|
||||
alSourcef(m_source, AL_SEC_OFFSET, position);
|
||||
else
|
||||
{
|
||||
int offset = (int)(position * m_reader->getSpecs().rate);
|
||||
m_reader->seek(offset);
|
||||
m_reader->seek((int)(position * m_reader->getSpecs().rate));
|
||||
m_eos = false;
|
||||
|
||||
ALint info;
|
||||
|
||||
alGetSourcei(m_source, AL_SOURCE_STATE, &info);
|
||||
|
||||
if(info != AL_PLAYING)
|
||||
// we need to stop playing sounds as well to clear the buffers
|
||||
// this might cause clicks, but fixes a bug regarding position determination
|
||||
if(info == AL_PAUSED || info == AL_PLAYING)
|
||||
alSourceStop(m_source);
|
||||
|
||||
alSourcei(m_source, AL_BUFFER, 0);
|
||||
m_current = 0;
|
||||
|
||||
ALenum err;
|
||||
if((err = alGetError()) == AL_NO_ERROR)
|
||||
{
|
||||
if(info == AL_PAUSED)
|
||||
alSourceStop(m_source);
|
||||
int length;
|
||||
AUD_DeviceSpecs specs = m_device->m_specs;
|
||||
specs.specs = m_reader->getSpecs();
|
||||
m_device->m_buffer.assureSize(m_device->m_buffersize * AUD_DEVICE_SAMPLE_SIZE(specs));
|
||||
|
||||
alSourcei(m_source, AL_BUFFER, 0);
|
||||
m_current = 0;
|
||||
|
||||
ALenum err;
|
||||
if((err = alGetError()) == AL_NO_ERROR)
|
||||
for(int i = 0; i < CYCLE_BUFFERS; i++)
|
||||
{
|
||||
int length;
|
||||
AUD_DeviceSpecs specs = m_device->m_specs;
|
||||
specs.specs = m_reader->getSpecs();
|
||||
m_device->m_buffer.assureSize(m_device->m_buffersize * AUD_DEVICE_SAMPLE_SIZE(specs));
|
||||
length = m_device->m_buffersize;
|
||||
m_reader->read(length, m_eos, m_device->m_buffer.getBuffer());
|
||||
|
||||
for(int i = 0; i < CYCLE_BUFFERS; i++)
|
||||
if(length == 0)
|
||||
{
|
||||
length = m_device->m_buffersize;
|
||||
m_reader->read(length, m_eos, m_device->m_buffer.getBuffer());
|
||||
|
||||
if(length == 0)
|
||||
{
|
||||
// AUD_XXX: TODO: don't fill all buffers and enqueue them later
|
||||
length = 1;
|
||||
memset(m_device->m_buffer.getBuffer(), 0, length * AUD_DEVICE_SAMPLE_SIZE(specs));
|
||||
}
|
||||
|
||||
alBufferData(m_buffers[i], m_format, m_device->m_buffer.getBuffer(),
|
||||
length * AUD_DEVICE_SAMPLE_SIZE(specs), specs.rate);
|
||||
|
||||
if(alGetError() != AL_NO_ERROR)
|
||||
break;
|
||||
// AUD_XXX: TODO: don't fill all buffers and enqueue them later
|
||||
length = 1;
|
||||
memset(m_device->m_buffer.getBuffer(), 0, length * AUD_DEVICE_SAMPLE_SIZE(specs));
|
||||
}
|
||||
|
||||
if(m_loopcount != 0)
|
||||
m_eos = false;
|
||||
alBufferData(m_buffers[i], m_format, m_device->m_buffer.getBuffer(),
|
||||
length * AUD_DEVICE_SAMPLE_SIZE(specs), specs.rate);
|
||||
|
||||
alSourceQueueBuffers(m_source, CYCLE_BUFFERS, m_buffers);
|
||||
m_bytepos = offset;
|
||||
if(alGetError() != AL_NO_ERROR)
|
||||
break;
|
||||
}
|
||||
|
||||
alSourceRewind(m_source);
|
||||
}
|
||||
else {
|
||||
m_bytepos = offset;
|
||||
if(m_loopcount != 0)
|
||||
m_eos = false;
|
||||
|
||||
alSourceQueueBuffers(m_source, CYCLE_BUFFERS, m_buffers);
|
||||
}
|
||||
|
||||
alSourceRewind(m_source);
|
||||
}
|
||||
|
||||
if(m_status == AUD_STATUS_STOPPED)
|
||||
@@ -350,8 +342,14 @@ float AUD_OpenALDevice::AUD_OpenALHandle::getPosition()
|
||||
|
||||
if(!m_isBuffered)
|
||||
{
|
||||
int queued;
|
||||
|
||||
// this usually always returns CYCLE_BUFFERS
|
||||
alGetSourcei(m_source, AL_BUFFERS_QUEUED, &queued);
|
||||
|
||||
AUD_Specs specs = m_reader->getSpecs();
|
||||
position += (m_bytepos) / specs.rate;
|
||||
position += (m_reader->getPosition() - m_device->m_buffersize *
|
||||
queued) / (float)specs.rate;
|
||||
}
|
||||
|
||||
return position;
|
||||
@@ -956,7 +954,6 @@ void AUD_OpenALDevice::updateStreams()
|
||||
|
||||
// unqueue buffer (warning: this might fail for slow early returning sources (none exist so far) if the buffer was not queued due to recent changes - has to be tested)
|
||||
alSourceUnqueueBuffers(sound->m_source, 1, &sound->m_buffers[sound->m_current]);
|
||||
sound->m_bytepos += length;
|
||||
ALenum err;
|
||||
if((err = alGetError()) != AL_NO_ERROR)
|
||||
{
|
||||
|
@@ -75,8 +75,6 @@ private:
|
||||
/// The first buffer to be read next.
|
||||
int m_current;
|
||||
|
||||
/// Amount of buffers already passed to OpenAL for processing. Used for proper timing
|
||||
unsigned int m_bytepos;
|
||||
/// Whether the stream doesn't return any more data.
|
||||
bool m_eos;
|
||||
|
||||
|
@@ -119,13 +119,11 @@ void AUD_AnimateableProperty::write(const float* data, int position, int count)
|
||||
{
|
||||
m_unknown.push_back(Unknown(pos, position - 1));
|
||||
|
||||
// if the buffer was not animated before, we copy the previous static value
|
||||
if(pos == 0)
|
||||
{
|
||||
for(int i = 0; i < position; i++)
|
||||
memcpy(buf + i * m_count, data, m_count * sizeof(float));
|
||||
}
|
||||
else
|
||||
updateUnknownCache(pos, position - 1);
|
||||
pos = 1;
|
||||
|
||||
updateUnknownCache(pos, position - 1);
|
||||
}
|
||||
// otherwise it's not at the end, let's check if some unknown part got filled
|
||||
else
|
||||
|
@@ -222,7 +222,7 @@ static PyMethodDef meth_getcdevice[] = {
|
||||
};
|
||||
|
||||
extern "C" {
|
||||
extern void *sound_get_factory(void *sound);
|
||||
extern void *BKE_sound_get_factory(void *sound);
|
||||
}
|
||||
|
||||
static PyObject *AUD_getSoundFromPointer(PyObject *self, PyObject *args)
|
||||
@@ -231,7 +231,7 @@ static PyObject *AUD_getSoundFromPointer(PyObject *self, PyObject *args)
|
||||
|
||||
if (PyArg_Parse(args, "l:_sound_from_pointer", &lptr)) {
|
||||
if (lptr) {
|
||||
boost::shared_ptr<AUD_IFactory>* factory = (boost::shared_ptr<AUD_IFactory>*) sound_get_factory((void *) lptr);
|
||||
boost::shared_ptr<AUD_IFactory>* factory = (boost::shared_ptr<AUD_IFactory>*) BKE_sound_get_factory((void *) lptr);
|
||||
|
||||
if (factory) {
|
||||
Factory *obj = (Factory *)Factory_empty();
|
||||
|
@@ -44,7 +44,8 @@ AUD_Sequencer::AUD_Sequencer(AUD_Specs specs, float fps, bool muted) :
|
||||
m_distance_model(AUD_DISTANCE_MODEL_INVERSE_CLAMPED),
|
||||
m_volume(1, 1.0f),
|
||||
m_location(3),
|
||||
m_orientation(4)
|
||||
m_orientation(4),
|
||||
m_recursive(false)
|
||||
{
|
||||
AUD_Quaternion q;
|
||||
m_orientation.write(q.get());
|
||||
|
@@ -201,6 +201,8 @@ public:
|
||||
* \param entry The entry to remove.
|
||||
*/
|
||||
void remove(boost::shared_ptr<AUD_SequencerEntry> entry);
|
||||
|
||||
bool m_recursive;
|
||||
};
|
||||
|
||||
#endif //__AUD_SEQUENCER_H__
|
||||
|
@@ -78,6 +78,9 @@ AUD_Specs AUD_SequencerReader::getSpecs() const
|
||||
|
||||
void AUD_SequencerReader::read(int& length, bool& eos, sample_t* buffer)
|
||||
{
|
||||
if (m_sequence->m_recursive)
|
||||
return;
|
||||
|
||||
AUD_MutexLock lock(*m_sequence);
|
||||
|
||||
if(m_sequence->m_status != m_status)
|
||||
@@ -192,7 +195,9 @@ void AUD_SequencerReader::read(int& length, bool& eos, sample_t* buffer)
|
||||
v2 -= v;
|
||||
m_device.setListenerVelocity(v2 * m_sequence->m_fps);
|
||||
|
||||
m_sequence->m_recursive = true;
|
||||
m_device.read(reinterpret_cast<data_t*>(buffer + specs.channels * pos), len);
|
||||
m_sequence->m_recursive = false;
|
||||
|
||||
pos += len;
|
||||
time += float(len) / float(specs.rate);
|
||||
|
@@ -64,7 +64,7 @@ elseif(CMAKE_COMPILER_IS_GNUCC)
|
||||
set(CYCLES_AVX_KERNEL_FLAGS "-ffast-math -msse -msse2 -msse3 -mssse3 -msse4.1 -mavx -mfpmath=sse")
|
||||
endif()
|
||||
if(CXX_HAS_AVX2)
|
||||
set(CYCLES_AVX2_KERNEL_FLAGS "-ffast-math -msse -msse2 -msse3 -mssse3 -msse4.1 -mavx -mavx2 -mfma -mlzcnt -mbmi -mbmi2 -mfpmath=sse")
|
||||
set(CYCLES_AVX2_KERNEL_FLAGS "-ffast-math -msse -msse2 -msse3 -mssse3 -msse4.1 -mavx -mavx2 -mfma -mlzcnt -mbmi -mbmi2 -mf16c -mfpmath=sse")
|
||||
endif()
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffast-math")
|
||||
elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||
@@ -80,7 +80,7 @@ elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||
set(CYCLES_AVX_KERNEL_FLAGS "-ffast-math -msse -msse2 -msse3 -mssse3 -msse4.1 -mavx")
|
||||
endif()
|
||||
if(CXX_HAS_AVX2)
|
||||
set(CYCLES_AVX2_KERNEL_FLAGS "-ffast-math -msse -msse2 -msse3 -mssse3 -msse4.1 -mavx -mavx2 -mfma -mlzcnt -mbmi -mbmi2")
|
||||
set(CYCLES_AVX2_KERNEL_FLAGS "-ffast-math -msse -msse2 -msse3 -mssse3 -msse4.1 -mavx -mavx2 -mfma -mlzcnt -mbmi -mbmi2 -mf16c")
|
||||
endif()
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffast-math")
|
||||
endif()
|
||||
@@ -152,6 +152,27 @@ add_definitions(
|
||||
-DWITH_MULTI
|
||||
)
|
||||
|
||||
TEST_UNORDERED_MAP_SUPPORT()
|
||||
if(HAVE_STD_UNORDERED_MAP_HEADER)
|
||||
if(HAVE_UNORDERED_MAP_IN_STD_NAMESPACE)
|
||||
add_definitions(-DCYCLES_STD_UNORDERED_MAP)
|
||||
else()
|
||||
if(HAVE_UNORDERED_MAP_IN_TR1_NAMESPACE)
|
||||
add_definitions(-DCYCLES_STD_UNORDERED_MAP_IN_TR1_NAMESPACE)
|
||||
else()
|
||||
add_definitions(-DCYCLES_NO_UNORDERED_MAP)
|
||||
message(STATUS "Replacing unordered_map/set with map/set (warning: slower!)")
|
||||
endif()
|
||||
endif()
|
||||
else()
|
||||
if(HAVE_UNORDERED_MAP_IN_TR1_NAMESPACE)
|
||||
add_definitions(-DCYCLES_TR1_UNORDERED_MAP)
|
||||
else()
|
||||
add_definitions(-DCYCLES_NO_UNORDERED_MAP)
|
||||
message(STATUS "Replacing unordered_map/set with map/set (warning: slower!)")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Logging capabilities using GLog library.
|
||||
if(WITH_CYCLES_LOGGING)
|
||||
add_definitions(-DWITH_CYCLES_LOGGING)
|
||||
|
@@ -34,12 +34,8 @@ cycles.Depends('../../source/blender/makesrna/intern/RNA_blender_cpp.h', 'makesr
|
||||
|
||||
sources = cycles.Glob('bvh/*.cpp') + cycles.Glob('device/*.cpp') + cycles.Glob('kernel/*.cpp') + cycles.Glob('render/*.cpp') + cycles.Glob('subd/*.cpp') + cycles.Glob('util/*.cpp') + cycles.Glob('blender/*.cpp')
|
||||
|
||||
sources.append(path.join('kernel', 'kernels', 'cpu', 'kernel.cpp'))
|
||||
sources.remove(path.join('util', 'util_view.cpp'))
|
||||
sources.remove(path.join('kernel', 'kernel_sse2.cpp'))
|
||||
sources.remove(path.join('kernel', 'kernel_sse3.cpp'))
|
||||
sources.remove(path.join('kernel', 'kernel_sse41.cpp'))
|
||||
sources.remove(path.join('kernel', 'kernel_avx.cpp'))
|
||||
sources.remove(path.join('kernel', 'kernel_avx2.cpp'))
|
||||
|
||||
incs = []
|
||||
defs = []
|
||||
@@ -47,6 +43,18 @@ cxxflags = Split(env['CXXFLAGS'])
|
||||
|
||||
defs += env['BF_GL_DEFINITIONS']
|
||||
|
||||
if env['WITH_UNORDERED_MAP_SUPPORT']:
|
||||
if env['UNORDERED_MAP_HEADER'] == 'unordered_map':
|
||||
if env['UNORDERED_MAP_NAMESPACE'] == 'std':
|
||||
defs.append('CYCLES_STD_UNORDERED_MAP')
|
||||
elif env['UNORDERED_MAP_NAMESPACE'] == 'std::tr1':
|
||||
defs.append('CYCLES_STD_UNORDERED_MAP_IN_TR1_NAMESPACE')
|
||||
elif env['UNORDERED_MAP_NAMESPACE'] == 'std::tr1':
|
||||
defs.append('CYCLES_TR1_UNORDERED_MAP')
|
||||
else:
|
||||
print("-- Replacing unordered_map/set with map/set (warning: slower!)")
|
||||
defs.append('CYCLES_NO_UNORDERED_MAP')
|
||||
|
||||
defs.append('CCL_NAMESPACE_BEGIN=namespace ccl {')
|
||||
defs.append('CCL_NAMESPACE_END=}')
|
||||
|
||||
@@ -128,13 +136,13 @@ else:
|
||||
|
||||
if (env['C_COMPILER_ID'] == 'gcc' and env['CCVERSION'] >= '4.6') or (env['C_COMPILER_ID'] == 'clang' and env['CCVERSION'] >= '3.1'):
|
||||
kernel_flags['avx'] = kernel_flags['sse41'] + ' -mavx'
|
||||
kernel_flags['avx2'] = kernel_flags['avx'] + ' -mavx2 -mfma -mlzcnt -mbmi -mbmi2'
|
||||
kernel_flags['avx2'] = kernel_flags['avx'] + ' -mavx2 -mfma -mlzcnt -mbmi -mbmi2 -mf16c'
|
||||
|
||||
for kernel_type in kernel_flags.keys():
|
||||
defs.append('WITH_KERNEL_' + kernel_type.upper())
|
||||
|
||||
for kernel_type in kernel_flags.keys():
|
||||
kernel_source = path.join('kernel', 'kernel_' + kernel_type + '.cpp')
|
||||
kernel_source = path.join('kernel', 'kernels', 'cpu', 'kernel_' + kernel_type + '.cpp')
|
||||
kernel_cxxflags = Split(env['CXXFLAGS'])
|
||||
kernel_cxxflags.append(kernel_flags[kernel_type].split())
|
||||
kernel_defs = defs[:]
|
||||
|
@@ -96,6 +96,12 @@ macro(cycles_target_link_libraries target)
|
||||
${CMAKE_DL_LIBS}
|
||||
${PLATFORM_LINKLIBS}
|
||||
)
|
||||
if(WITH_ALEMBIC)
|
||||
target_link_libraries(
|
||||
${target}
|
||||
${ALEMBIC_LIBRARIES}
|
||||
)
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
# Application build targets
|
||||
@@ -106,6 +112,23 @@ if(WITH_CYCLES_STANDALONE)
|
||||
cycles_xml.cpp
|
||||
cycles_xml.h
|
||||
)
|
||||
|
||||
if(WITH_ALEMBIC)
|
||||
list(APPEND SRC
|
||||
cycles_alembic.cpp
|
||||
cycles_alembic.h
|
||||
)
|
||||
add_definitions(-DWITH_ALEMBIC)
|
||||
include_directories(
|
||||
SYSTEM
|
||||
${ALEMBIC_INCLUDE_DIRS}
|
||||
)
|
||||
endif()
|
||||
|
||||
if(WITH_HDF5)
|
||||
add_definitions(-DWITH_HDF5)
|
||||
endif()
|
||||
|
||||
add_executable(cycles ${SRC})
|
||||
cycles_target_link_libraries(cycles)
|
||||
|
||||
|
426
intern/cycles/app/cycles_alembic.cpp
Normal file
426
intern/cycles/app/cycles_alembic.cpp
Normal file
@@ -0,0 +1,426 @@
|
||||
/*
|
||||
* Copyright 2015 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.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <sstream>
|
||||
#include <algorithm>
|
||||
#include <iterator>
|
||||
|
||||
#include <Alembic/AbcCoreOgawa/ReadWrite.h>
|
||||
#ifdef WITH_HDF5
|
||||
#include <Alembic/AbcCoreHDF5/ReadWrite.h>
|
||||
#endif
|
||||
#include <Alembic/Abc/IArchive.h>
|
||||
#include <Alembic/Abc/IObject.h>
|
||||
#include <Alembic/Abc/ISampleSelector.h>
|
||||
#include <Alembic/Abc/ICompoundProperty.h>
|
||||
#include <Alembic/Abc/IScalarProperty.h>
|
||||
#include <Alembic/Abc/IArrayProperty.h>
|
||||
#include <Alembic/Abc/ArchiveInfo.h>
|
||||
#include <Alembic/AbcGeom/IPolyMesh.h>
|
||||
|
||||
#include "camera.h"
|
||||
#include "film.h"
|
||||
#include "graph.h"
|
||||
#include "integrator.h"
|
||||
#include "light.h"
|
||||
#include "mesh.h"
|
||||
#include "nodes.h"
|
||||
#include "object.h"
|
||||
#include "shader.h"
|
||||
#include "scene.h"
|
||||
|
||||
#include "subd_mesh.h"
|
||||
#include "subd_patch.h"
|
||||
#include "subd_split.h"
|
||||
|
||||
#include "util_debug.h"
|
||||
#include "util_foreach.h"
|
||||
#include "util_path.h"
|
||||
#include "util_transform.h"
|
||||
#include "util_xml.h"
|
||||
|
||||
#include "cycles_alembic.h"
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
using namespace Alembic;
|
||||
using namespace Abc;
|
||||
using namespace AbcGeom;
|
||||
|
||||
#define ABC_SAFE_CALL_BEGIN \
|
||||
try {
|
||||
|
||||
#define ABC_SAFE_CALL_END \
|
||||
} \
|
||||
catch (Alembic::Util::Exception e) { \
|
||||
printf("%s", e.what()); \
|
||||
}
|
||||
|
||||
|
||||
/* File */
|
||||
|
||||
static const std::string g_sep(";");
|
||||
|
||||
static void visitProperties(std::stringstream &ss, ICompoundProperty, std::string &);
|
||||
|
||||
template <class PROP>
|
||||
static void visitSimpleArrayProperty(std::stringstream &ss, PROP iProp, const std::string &iIndent)
|
||||
{
|
||||
std::string ptype = "ArrayProperty ";
|
||||
size_t asize = 0;
|
||||
|
||||
AbcA::ArraySamplePtr samp;
|
||||
index_t maxSamples = iProp.getNumSamples();
|
||||
for (index_t i = 0 ; i < maxSamples; ++i) {
|
||||
iProp.get(samp, ISampleSelector( i ));
|
||||
asize = samp->size();
|
||||
};
|
||||
|
||||
std::string mdstring = "interpretation=";
|
||||
mdstring += iProp.getMetaData().get("interpretation");
|
||||
|
||||
std::stringstream dtype;
|
||||
dtype << "datatype=";
|
||||
dtype << iProp.getDataType();
|
||||
|
||||
std::stringstream asizestr;
|
||||
asizestr << ";arraysize=";
|
||||
asizestr << asize;
|
||||
|
||||
mdstring += g_sep;
|
||||
|
||||
mdstring += dtype.str();
|
||||
|
||||
mdstring += asizestr.str();
|
||||
|
||||
ss << iIndent << " " << ptype << "name=" << iProp.getName()
|
||||
<< g_sep << mdstring << g_sep << "numsamps="
|
||||
<< iProp.getNumSamples() << std::endl;
|
||||
}
|
||||
|
||||
template <class PROP>
|
||||
static void visitSimpleScalarProperty(std::stringstream &ss, PROP iProp, const std::string &iIndent)
|
||||
{
|
||||
std::string ptype = "ScalarProperty ";
|
||||
size_t asize = 0;
|
||||
|
||||
const AbcA::DataType &dt = iProp.getDataType();
|
||||
const Alembic::Util ::uint8_t extent = dt.getExtent();
|
||||
Alembic::Util::Dimensions dims(extent);
|
||||
AbcA::ArraySamplePtr samp = AbcA::AllocateArraySample( dt, dims );
|
||||
index_t maxSamples = iProp.getNumSamples();
|
||||
for (index_t i = 0 ; i < maxSamples; ++i) {
|
||||
iProp.get(const_cast<void*>(samp->getData()), ISampleSelector( i ));
|
||||
asize = samp->size();
|
||||
};
|
||||
|
||||
std::string mdstring = "interpretation=";
|
||||
mdstring += iProp.getMetaData().get("interpretation");
|
||||
|
||||
std::stringstream dtype;
|
||||
dtype << "datatype=";
|
||||
dtype << dt;
|
||||
|
||||
std::stringstream asizestr;
|
||||
asizestr << ";arraysize=";
|
||||
asizestr << asize;
|
||||
|
||||
mdstring += g_sep;
|
||||
|
||||
mdstring += dtype.str();
|
||||
|
||||
mdstring += asizestr.str();
|
||||
|
||||
ss << iIndent << " " << ptype << "name=" << iProp.getName()
|
||||
<< g_sep << mdstring << g_sep << "numsamps="
|
||||
<< iProp.getNumSamples() << std::endl;
|
||||
}
|
||||
|
||||
static void visitCompoundProperty(std::stringstream &ss, ICompoundProperty iProp, std::string &ioIndent)
|
||||
{
|
||||
std::string oldIndent = ioIndent;
|
||||
ioIndent += " ";
|
||||
|
||||
std::string interp = "schema=";
|
||||
interp += iProp.getMetaData().get("schema");
|
||||
|
||||
ss << ioIndent << "CompoundProperty " << "name=" << iProp.getName()
|
||||
<< g_sep << interp << std::endl;
|
||||
|
||||
visitProperties(ss, iProp, ioIndent);
|
||||
|
||||
ioIndent = oldIndent;
|
||||
}
|
||||
|
||||
static void visitProperties(std::stringstream &ss, ICompoundProperty iParent, std::string &ioIndent )
|
||||
{
|
||||
std::string oldIndent = ioIndent;
|
||||
for (size_t i = 0 ; i < iParent.getNumProperties() ; i++) {
|
||||
PropertyHeader header = iParent.getPropertyHeader(i);
|
||||
|
||||
if (header.isCompound()) {
|
||||
visitCompoundProperty(ss, ICompoundProperty(iParent, header.getName()), ioIndent);
|
||||
}
|
||||
else if (header.isScalar()) {
|
||||
visitSimpleScalarProperty(ss, IScalarProperty(iParent, header.getName()), ioIndent);
|
||||
}
|
||||
else {
|
||||
assert(header.isArray());
|
||||
visitSimpleArrayProperty(ss, IArrayProperty(iParent, header.getName()), ioIndent);
|
||||
}
|
||||
}
|
||||
|
||||
ioIndent = oldIndent;
|
||||
}
|
||||
|
||||
static void visitObject(std::stringstream &ss, IObject iObj, std::string iIndent, AbcArchiveInfoLevel info_level)
|
||||
{
|
||||
// Object has a name, a full name, some meta data,
|
||||
// and then it has a compound property full of properties.
|
||||
std::string path = iObj.getFullName();
|
||||
|
||||
if (iObj.isInstanceRoot()) {
|
||||
if (path != "/") {
|
||||
ss << "Object " << "name=" << path
|
||||
<< " [Instance " << iObj.instanceSourcePath() << "]"
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
else if (iObj.isInstanceDescendant()) {
|
||||
/* skip non-root instances to avoid repetition */
|
||||
return;
|
||||
}
|
||||
else {
|
||||
if (path != "/") {
|
||||
ss << "Object " << "name=" << path << std::endl;
|
||||
}
|
||||
|
||||
if (info_level >= ABC_INFO_PROPERTIES) {
|
||||
// Get the properties.
|
||||
ICompoundProperty props = iObj.getProperties();
|
||||
visitProperties(ss, props, iIndent);
|
||||
}
|
||||
|
||||
// now the child objects
|
||||
for (size_t i = 0 ; i < iObj.getNumChildren() ; i++) {
|
||||
visitObject(ss, IObject(iObj, iObj.getChildHeader(i).getName()), iIndent, info_level);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static std::string abc_archive_info(IArchive &archive, AbcArchiveInfoLevel info_level)
|
||||
{
|
||||
std::stringstream ss;
|
||||
|
||||
ss << "Alembic Archive Info for "
|
||||
<< Alembic::AbcCoreAbstract::GetLibraryVersion()
|
||||
<< std::endl;;
|
||||
|
||||
std::string appName;
|
||||
std::string libraryVersionString;
|
||||
Alembic::Util::uint32_t libraryVersion;
|
||||
std::string whenWritten;
|
||||
std::string userDescription;
|
||||
GetArchiveInfo(archive,
|
||||
appName,
|
||||
libraryVersionString,
|
||||
libraryVersion,
|
||||
whenWritten,
|
||||
userDescription);
|
||||
|
||||
if (appName != "") {
|
||||
ss << " file written by: " << appName << std::endl;
|
||||
ss << " using Alembic : " << libraryVersionString << std::endl;
|
||||
ss << " written on : " << whenWritten << std::endl;
|
||||
ss << " user description : " << userDescription << std::endl;
|
||||
ss << std::endl;
|
||||
}
|
||||
else {
|
||||
// ss << argv[1] << std::endl;
|
||||
ss << " (file doesn't have any ArchiveInfo)"
|
||||
<< std::endl;
|
||||
ss << std::endl;
|
||||
}
|
||||
|
||||
if (info_level >= ABC_INFO_OBJECTS)
|
||||
visitObject(ss, archive.getTop(), "", info_level);
|
||||
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
/* ========================================================================= */
|
||||
|
||||
struct AbcReadState {
|
||||
Scene *scene; /* scene pointer */
|
||||
float time;
|
||||
Transform tfm; /* current transform state */
|
||||
bool smooth; /* smooth normal state */
|
||||
int shader; /* current shader */
|
||||
string base; /* base path to current file*/
|
||||
float dicing_rate; /* current dicing rate */
|
||||
Mesh::DisplacementMethod displacement_method;
|
||||
};
|
||||
|
||||
static ISampleSelector get_sample_selector(const AbcReadState &state)
|
||||
{
|
||||
return ISampleSelector(state.time, ISampleSelector::kFloorIndex);
|
||||
}
|
||||
|
||||
static Mesh *add_mesh(Scene *scene, const Transform& tfm)
|
||||
{
|
||||
/* create mesh */
|
||||
Mesh *mesh = new Mesh();
|
||||
scene->meshes.push_back(mesh);
|
||||
|
||||
/* create object*/
|
||||
Object *object = new Object();
|
||||
object->mesh = mesh;
|
||||
object->tfm = tfm;
|
||||
scene->objects.push_back(object);
|
||||
|
||||
return mesh;
|
||||
}
|
||||
|
||||
static void read_mesh(const AbcReadState &state, IPolyMesh object)
|
||||
{
|
||||
/* add mesh */
|
||||
Mesh *mesh = add_mesh(state.scene, state.tfm);
|
||||
mesh->used_shaders.push_back(state.shader);
|
||||
|
||||
/* read state */
|
||||
int shader = state.shader;
|
||||
bool smooth = state.smooth;
|
||||
|
||||
mesh->displacement_method = state.displacement_method;
|
||||
|
||||
ISampleSelector ss = get_sample_selector(state);
|
||||
IPolyMeshSchema schema = object.getSchema();
|
||||
|
||||
IPolyMeshSchema::Sample sample;
|
||||
schema.get(sample, ss);
|
||||
|
||||
int totverts = sample.getPositions()->size();
|
||||
int totfaces = sample.getFaceCounts()->size();
|
||||
const V3f *P = sample.getPositions()->get();
|
||||
const int32_t *verts = sample.getFaceIndices()->get();
|
||||
const int32_t *nverts = sample.getFaceCounts()->get();
|
||||
|
||||
/* create vertices */
|
||||
mesh->verts.reserve(totverts);
|
||||
for(int i = 0; i < totverts; i++) {
|
||||
mesh->verts.push_back(make_float3(P[i].x, P[i].y, P[i].z));
|
||||
}
|
||||
|
||||
/* create triangles */
|
||||
int index_offset = 0;
|
||||
|
||||
for(int i = 0; i < totfaces; i++) {
|
||||
int n = nverts[i];
|
||||
/* XXX TODO only supports tris and quads atm,
|
||||
* need a proper tessellation algorithm in cycles.
|
||||
*/
|
||||
if (n > 4) {
|
||||
printf("%d-sided face found, only triangles and quads are supported currently", n);
|
||||
n = 4;
|
||||
}
|
||||
|
||||
for(int j = 0; j < n-2; j++) {
|
||||
int v0 = verts[index_offset];
|
||||
int v1 = verts[index_offset + j + 1];
|
||||
int v2 = verts[index_offset + j + 2];
|
||||
|
||||
assert(v0 < (int)totverts);
|
||||
assert(v1 < (int)totverts);
|
||||
assert(v2 < (int)totverts);
|
||||
|
||||
mesh->add_triangle(v0, v1, v2, shader, smooth);
|
||||
}
|
||||
|
||||
index_offset += n;
|
||||
}
|
||||
|
||||
/* temporary for test compatibility */
|
||||
mesh->attributes.remove(ATTR_STD_VERTEX_NORMAL);
|
||||
}
|
||||
|
||||
static void read_object(const AbcReadState &state, IObject object)
|
||||
{
|
||||
for (int i = 0; i < object.getNumChildren(); ++i) {
|
||||
IObject child = object.getChild(i);
|
||||
const MetaData &metadata = child.getMetaData();
|
||||
|
||||
if (IPolyMeshSchema::matches(metadata)) {
|
||||
read_mesh(state, IPolyMesh(child, kWrapExisting));
|
||||
}
|
||||
else {
|
||||
read_object(state, child);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void read_archive(Scene *scene, IArchive archive, const char *filepath)
|
||||
{
|
||||
AbcReadState state;
|
||||
|
||||
state.scene = scene;
|
||||
state.time = 0.0f; // TODO
|
||||
state.tfm = transform_identity();
|
||||
state.shader = scene->default_surface;
|
||||
state.smooth = false;
|
||||
state.dicing_rate = 0.1f;
|
||||
state.base = path_dirname(filepath);
|
||||
|
||||
read_object(state, archive.getTop());
|
||||
|
||||
scene->params.bvh_type = SceneParams::BVH_STATIC;
|
||||
}
|
||||
|
||||
void abc_read_ogawa_file(Scene *scene, const char *filepath, AbcArchiveInfoLevel info_level)
|
||||
{
|
||||
IArchive archive;
|
||||
ABC_SAFE_CALL_BEGIN
|
||||
archive = IArchive(AbcCoreOgawa::ReadArchive(), filepath, ErrorHandler::kThrowPolicy);
|
||||
ABC_SAFE_CALL_END
|
||||
|
||||
if (archive) {
|
||||
if (info_level >= ABC_INFO_BASIC)
|
||||
printf("%s", abc_archive_info(archive, info_level).c_str());
|
||||
|
||||
read_archive(scene, archive, filepath);
|
||||
}
|
||||
}
|
||||
|
||||
void abc_read_hdf5_file(Scene *scene, const char *filepath, AbcArchiveInfoLevel info_level)
|
||||
{
|
||||
#ifdef WITH_HDF5
|
||||
IArchive archive;
|
||||
ABC_SAFE_CALL_BEGIN
|
||||
archive = IArchive(AbcCoreHDF5::ReadArchive(), filepath, ErrorHandler::kThrowPolicy);
|
||||
ABC_SAFE_CALL_END
|
||||
|
||||
if (archive) {
|
||||
if (info_level >= ABC_INFO_BASIC)
|
||||
printf("%s", abc_archive_info(archive, info_level).c_str());
|
||||
|
||||
read_archive(scene, archive, filepath);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
36
intern/cycles/app/cycles_alembic.h
Normal file
36
intern/cycles/app/cycles_alembic.h
Normal file
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright 2015 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.
|
||||
*/
|
||||
|
||||
#ifndef __CYCLES_ALEMBIC_H__
|
||||
#define __CYCLES_ALEMBIC_H__
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
class Scene;
|
||||
|
||||
enum AbcArchiveInfoLevel {
|
||||
ABC_INFO_NONE = 0,
|
||||
ABC_INFO_BASIC,
|
||||
ABC_INFO_OBJECTS,
|
||||
ABC_INFO_PROPERTIES,
|
||||
};
|
||||
|
||||
void abc_read_ogawa_file(Scene *scene, const char *filepath, AbcArchiveInfoLevel info_level = ABC_INFO_NONE);
|
||||
void abc_read_hdf5_file(Scene *scene, const char *filepath, AbcArchiveInfoLevel info_level = ABC_INFO_NONE);
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
||||
#endif /* __CYCLES_XML_H__ */
|
@@ -24,6 +24,7 @@
|
||||
#include "util_stats.h"
|
||||
#include "util_string.h"
|
||||
#include "util_task.h"
|
||||
#include "util_logging.h"
|
||||
|
||||
using namespace ccl;
|
||||
|
||||
@@ -66,7 +67,7 @@ int main(int argc, const char **argv)
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (debug) {
|
||||
if(debug) {
|
||||
util_logging_start();
|
||||
util_logging_verbosity_set(verbosity);
|
||||
}
|
||||
|
@@ -21,6 +21,7 @@
|
||||
#include "device.h"
|
||||
#include "scene.h"
|
||||
#include "session.h"
|
||||
#include "integrator.h"
|
||||
|
||||
#include "util_args.h"
|
||||
#include "util_foreach.h"
|
||||
@@ -37,13 +38,23 @@
|
||||
#endif
|
||||
|
||||
#include "cycles_xml.h"
|
||||
#ifdef WITH_ALEMBIC
|
||||
#include "cycles_alembic.h"
|
||||
#endif
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
enum FileType {
|
||||
FILETYPE_XML = 0,
|
||||
FILETYPE_ABC_HDF5,
|
||||
FILETYPE_ABC_OGAWA,
|
||||
};
|
||||
|
||||
struct Options {
|
||||
Session *session;
|
||||
Scene *scene;
|
||||
string filepath;
|
||||
FileType filetype;
|
||||
int width, height;
|
||||
SceneParams scene_params;
|
||||
SessionParams session_params;
|
||||
@@ -120,11 +131,25 @@ static void scene_init()
|
||||
{
|
||||
options.scene = new Scene(options.scene_params, options.session_params.device);
|
||||
|
||||
/* Read XML */
|
||||
xml_read_file(options.scene, options.filepath.c_str());
|
||||
/* Read file */
|
||||
switch (options.filetype) {
|
||||
case FILETYPE_XML:
|
||||
xml_read_file(options.scene, options.filepath.c_str());
|
||||
break;
|
||||
#ifdef WITH_ALEMBIC
|
||||
case FILETYPE_ABC_OGAWA:
|
||||
abc_read_ogawa_file(options.scene, options.filepath.c_str());
|
||||
break;
|
||||
case FILETYPE_ABC_HDF5:
|
||||
abc_read_hdf5_file(options.scene, options.filepath.c_str());
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
/* Camera width/height override? */
|
||||
if (!(options.width == 0 || options.height == 0)) {
|
||||
if(!(options.width == 0 || options.height == 0)) {
|
||||
options.scene->camera->width = options.width;
|
||||
options.scene->camera->height = options.height;
|
||||
}
|
||||
@@ -272,6 +297,7 @@ static void keyboard(unsigned char key)
|
||||
else if(key == 'i')
|
||||
options.interactive = !(options.interactive);
|
||||
|
||||
/* Navigation */
|
||||
else if(options.interactive && (key == 'w' || key == 'a' || key == 's' || key == 'd')) {
|
||||
Transform matrix = options.session->scene->camera->matrix;
|
||||
float3 translate;
|
||||
@@ -294,6 +320,25 @@ static void keyboard(unsigned char key)
|
||||
|
||||
options.session->reset(session_buffer_params(), options.session_params.samples);
|
||||
}
|
||||
|
||||
/* Set Max Bounces */
|
||||
else if(options.interactive && (key == '0' || key == '1' || key == '2' || key == '3')) {
|
||||
int bounce;
|
||||
switch(key) {
|
||||
case '0': bounce = 0; break;
|
||||
case '1': bounce = 1; break;
|
||||
case '2': bounce = 2; break;
|
||||
case '3': bounce = 3; break;
|
||||
default: bounce = 0; break;
|
||||
}
|
||||
|
||||
options.session->scene->integrator->max_bounce = bounce;
|
||||
|
||||
/* Update and Reset */
|
||||
options.session->scene->integrator->need_update = true;
|
||||
|
||||
options.session->reset(session_buffer_params(), options.session_params.samples);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -335,6 +380,16 @@ static void options_parse(int argc, const char **argv)
|
||||
/* shading system */
|
||||
string ssname = "svm";
|
||||
|
||||
/* input file type */
|
||||
string filetypes = "auto, xml";
|
||||
#ifdef WITH_ALEMBIC
|
||||
filetypes += ", alembic_ogawa";
|
||||
#ifdef WITH_HDF5
|
||||
filetypes += ", alembic_hdf5";
|
||||
#endif
|
||||
#endif
|
||||
string filetype = "auto";
|
||||
|
||||
/* parse options */
|
||||
ArgParse ap;
|
||||
bool help = false, debug = false;
|
||||
@@ -350,6 +405,7 @@ static void options_parse(int argc, const char **argv)
|
||||
"--quiet", &options.quiet, "In background mode, don't print progress messages",
|
||||
"--samples %d", &options.session_params.samples, "Number of samples to render",
|
||||
"--output %s", &options.session_params.output_path, "File path to write output image",
|
||||
"--filetype %s", &filetype, ("File type: " + filetypes).c_str(),
|
||||
"--threads %d", &options.session_params.threads, "CPU Rendering Threads",
|
||||
"--width %d", &options.width, "Window width in pixel",
|
||||
"--height %d", &options.height, "Window height in pixel",
|
||||
@@ -367,7 +423,7 @@ static void options_parse(int argc, const char **argv)
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (debug) {
|
||||
if(debug) {
|
||||
util_logging_start();
|
||||
util_logging_verbosity_set(verbosity);
|
||||
}
|
||||
@@ -377,7 +433,8 @@ static void options_parse(int argc, const char **argv)
|
||||
printf("Devices:\n");
|
||||
|
||||
foreach(DeviceInfo& info, devices) {
|
||||
printf(" %s%s\n",
|
||||
printf(" %-10s%s%s\n",
|
||||
Device::string_from_type(info.type).c_str(),
|
||||
info.description.c_str(),
|
||||
(info.display_device)? " (display)": "");
|
||||
}
|
||||
@@ -394,6 +451,21 @@ static void options_parse(int argc, const char **argv)
|
||||
else if(ssname == "svm")
|
||||
options.scene_params.shadingsystem = SHADINGSYSTEM_SVM;
|
||||
|
||||
if(filetype == "auto") {
|
||||
string extension = options.filepath.substr(options.filepath.find_last_of(".") + 1);
|
||||
|
||||
if (extension == "xml")
|
||||
options.filetype = FILETYPE_XML;
|
||||
else if (extension == "abc")
|
||||
options.filetype = FILETYPE_ABC_OGAWA;
|
||||
}
|
||||
else if(filetype == "xml")
|
||||
options.filetype = FILETYPE_XML;
|
||||
else if(filetype == "alembic_ogawa")
|
||||
options.filetype = FILETYPE_ABC_OGAWA;
|
||||
else if(filetype == "alembic_hdf5")
|
||||
options.filetype = FILETYPE_ABC_HDF5;
|
||||
|
||||
#ifndef WITH_CYCLES_STANDALONE_GUI
|
||||
options.session_params.background = true;
|
||||
#endif
|
||||
|
@@ -42,6 +42,9 @@
|
||||
#include "util_xml.h"
|
||||
|
||||
#include "cycles_xml.h"
|
||||
#ifdef WITH_ALEMBIC
|
||||
#include "cycles_alembic.h"
|
||||
#endif
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
@@ -55,6 +58,16 @@ struct XMLReadState {
|
||||
string base; /* base path to current file*/
|
||||
float dicing_rate; /* current dicing rate */
|
||||
Mesh::DisplacementMethod displacement_method;
|
||||
|
||||
XMLReadState()
|
||||
: scene(NULL),
|
||||
smooth(false),
|
||||
shader(0),
|
||||
dicing_rate(0.0f),
|
||||
displacement_method(Mesh::DISPLACE_BUMP)
|
||||
{
|
||||
tfm = transform_identity();
|
||||
}
|
||||
};
|
||||
|
||||
/* Attribute Reading */
|
||||
@@ -225,21 +238,21 @@ static ShaderSocketType xml_read_socket_type(pugi::xml_node node, const char *na
|
||||
|
||||
if(attr) {
|
||||
string value = attr.value();
|
||||
if (string_iequals(value, "float"))
|
||||
if(string_iequals(value, "float"))
|
||||
return SHADER_SOCKET_FLOAT;
|
||||
else if (string_iequals(value, "int"))
|
||||
else if(string_iequals(value, "int"))
|
||||
return SHADER_SOCKET_INT;
|
||||
else if (string_iequals(value, "color"))
|
||||
else if(string_iequals(value, "color"))
|
||||
return SHADER_SOCKET_COLOR;
|
||||
else if (string_iequals(value, "vector"))
|
||||
else if(string_iequals(value, "vector"))
|
||||
return SHADER_SOCKET_VECTOR;
|
||||
else if (string_iequals(value, "point"))
|
||||
else if(string_iequals(value, "point"))
|
||||
return SHADER_SOCKET_POINT;
|
||||
else if (string_iequals(value, "normal"))
|
||||
else if(string_iequals(value, "normal"))
|
||||
return SHADER_SOCKET_NORMAL;
|
||||
else if (string_iequals(value, "closure color"))
|
||||
else if(string_iequals(value, "closure color"))
|
||||
return SHADER_SOCKET_CLOSURE;
|
||||
else if (string_iequals(value, "string"))
|
||||
else if(string_iequals(value, "string"))
|
||||
return SHADER_SOCKET_STRING;
|
||||
else
|
||||
fprintf(stderr, "Unknown shader socket type \"%s\" for attribute \"%s\".\n", value.c_str(), name);
|
||||
@@ -381,6 +394,10 @@ static void xml_read_shader_graph(const XMLReadState& state, Shader *shader, pug
|
||||
for(pugi::xml_node node = graph_node.first_child(); node; node = node.next_sibling()) {
|
||||
ShaderNode *snode = NULL;
|
||||
|
||||
/* ToDo: Add missing nodes
|
||||
* RGBCurvesNode, VectorCurvesNode, RGBRampNode and ConvertNode (RGB -> BW).
|
||||
*/
|
||||
|
||||
if(string_iequals(node.name(), "image_texture")) {
|
||||
ImageTextureNode *img = new ImageTextureNode();
|
||||
|
||||
@@ -391,6 +408,8 @@ static void xml_read_shader_graph(const XMLReadState& state, Shader *shader, pug
|
||||
xml_read_enum(&img->projection, ImageTextureNode::projection_enum, node, "projection");
|
||||
xml_read_float(&img->projection_blend, node, "projection_blend");
|
||||
|
||||
/* ToDo: Interpolation */
|
||||
|
||||
snode = img;
|
||||
}
|
||||
else if(string_iequals(node.name(), "environment_texture")) {
|
||||
@@ -419,25 +438,25 @@ static void xml_read_shader_graph(const XMLReadState& state, Shader *shader, pug
|
||||
* Socket names must be stored in the extra lists instead. */
|
||||
/* read input values */
|
||||
for(pugi::xml_node param = node.first_child(); param; param = param.next_sibling()) {
|
||||
if (string_iequals(param.name(), "input")) {
|
||||
if(string_iequals(param.name(), "input")) {
|
||||
string name;
|
||||
if (!xml_read_string(&name, param, "name"))
|
||||
if(!xml_read_string(&name, param, "name"))
|
||||
continue;
|
||||
|
||||
ShaderSocketType type = xml_read_socket_type(param, "type");
|
||||
if (type == SHADER_SOCKET_UNDEFINED)
|
||||
if(type == SHADER_SOCKET_UNDEFINED)
|
||||
continue;
|
||||
|
||||
osl->input_names.push_back(ustring(name));
|
||||
osl->add_input(osl->input_names.back().c_str(), type);
|
||||
}
|
||||
else if (string_iequals(param.name(), "output")) {
|
||||
else if(string_iequals(param.name(), "output")) {
|
||||
string name;
|
||||
if (!xml_read_string(&name, param, "name"))
|
||||
if(!xml_read_string(&name, param, "name"))
|
||||
continue;
|
||||
|
||||
ShaderSocketType type = xml_read_socket_type(param, "type");
|
||||
if (type == SHADER_SOCKET_UNDEFINED)
|
||||
if(type == SHADER_SOCKET_UNDEFINED)
|
||||
continue;
|
||||
|
||||
osl->output_names.push_back(ustring(name));
|
||||
@@ -493,10 +512,6 @@ static void xml_read_shader_graph(const XMLReadState& state, Shader *shader, pug
|
||||
xml_read_int(&magic->depth, node, "depth");
|
||||
snode = magic;
|
||||
}
|
||||
else if(string_iequals(node.name(), "noise_texture")) {
|
||||
NoiseTextureNode *dist = new NoiseTextureNode();
|
||||
snode = dist;
|
||||
}
|
||||
else if(string_iequals(node.name(), "wave_texture")) {
|
||||
WaveTextureNode *wave = new WaveTextureNode();
|
||||
xml_read_enum(&wave->type, WaveTextureNode::type_enum, node, "type");
|
||||
@@ -507,6 +522,11 @@ static void xml_read_shader_graph(const XMLReadState& state, Shader *shader, pug
|
||||
xml_read_float3(&normal->direction, node, "direction");
|
||||
snode = normal;
|
||||
}
|
||||
else if(string_iequals(node.name(), "bump")) {
|
||||
BumpNode *bump = new BumpNode();
|
||||
xml_read_bool(&bump->invert, node, "invert");
|
||||
snode = bump;
|
||||
}
|
||||
else if(string_iequals(node.name(), "mapping")) {
|
||||
snode = new MappingNode();
|
||||
}
|
||||
@@ -561,6 +581,9 @@ static void xml_read_shader_graph(const XMLReadState& state, Shader *shader, pug
|
||||
else if(string_iequals(node.name(), "background")) {
|
||||
snode = new BackgroundNode();
|
||||
}
|
||||
else if(string_iequals(node.name(), "holdout")) {
|
||||
snode = new HoldoutNode();
|
||||
}
|
||||
else if(string_iequals(node.name(), "absorption_volume")) {
|
||||
snode = new AbsorptionVolumeNode();
|
||||
}
|
||||
@@ -569,7 +592,14 @@ static void xml_read_shader_graph(const XMLReadState& state, Shader *shader, pug
|
||||
}
|
||||
else if(string_iequals(node.name(), "subsurface_scattering")) {
|
||||
SubsurfaceScatteringNode *sss = new SubsurfaceScatteringNode();
|
||||
//xml_read_enum(&sss->falloff, SubsurfaceScatteringNode::falloff_enum, node, "falloff");
|
||||
|
||||
string falloff;
|
||||
xml_read_string(&falloff, node, "falloff");
|
||||
if(falloff == "cubic")
|
||||
sss->closure = CLOSURE_BSSRDF_CUBIC_ID;
|
||||
else
|
||||
sss->closure = CLOSURE_BSSRDF_GAUSSIAN_ID;
|
||||
|
||||
snode = sss;
|
||||
}
|
||||
else if(string_iequals(node.name(), "geometry")) {
|
||||
@@ -613,6 +643,7 @@ static void xml_read_shader_graph(const XMLReadState& state, Shader *shader, pug
|
||||
snode = new InvertNode();
|
||||
}
|
||||
else if(string_iequals(node.name(), "mix")) {
|
||||
/* ToDo: Tag Mix case for optimization */
|
||||
MixNode *mix = new MixNode();
|
||||
xml_read_enum(&mix->type, MixNode::type_enum, node, "type");
|
||||
xml_read_bool(&mix->use_clamp, node, "use_clamp");
|
||||
@@ -637,10 +668,10 @@ static void xml_read_shader_graph(const XMLReadState& state, Shader *shader, pug
|
||||
snode = new SeparateHSVNode();
|
||||
}
|
||||
else if(string_iequals(node.name(), "combine_xyz")) {
|
||||
snode = new CombineHSVNode();
|
||||
snode = new CombineXYZNode();
|
||||
}
|
||||
else if(string_iequals(node.name(), "separate_xyz")) {
|
||||
snode = new SeparateHSVNode();
|
||||
snode = new SeparateXYZNode();
|
||||
}
|
||||
else if(string_iequals(node.name(), "hsv")) {
|
||||
snode = new HSVNode();
|
||||
@@ -1028,13 +1059,28 @@ static void xml_read_light(const XMLReadState& state, pugi::xml_node node)
|
||||
xml_read_float(&light->sizev, node, "sizev");
|
||||
xml_read_float3(&light->axisu, node, "axisu");
|
||||
xml_read_float3(&light->axisv, node, "axisv");
|
||||
|
||||
|
||||
/* Portal? (Area light only) */
|
||||
xml_read_bool(&light->is_portal, node, "is_portal");
|
||||
|
||||
/* Generic */
|
||||
xml_read_float(&light->size, node, "size");
|
||||
xml_read_float3(&light->dir, node, "dir");
|
||||
xml_read_float3(&light->co, node, "P");
|
||||
light->co = transform_point(&state.tfm, light->co);
|
||||
|
||||
/* Settings */
|
||||
xml_read_bool(&light->cast_shadow, node, "cast_shadow");
|
||||
xml_read_bool(&light->use_mis, node, "use_mis");
|
||||
xml_read_int(&light->samples, node, "samples");
|
||||
xml_read_int(&light->max_bounces, node, "max_bounces");
|
||||
|
||||
/* Ray Visibility */
|
||||
xml_read_bool(&light->use_diffuse, node, "use_diffuse");
|
||||
xml_read_bool(&light->use_glossy, node, "use_glossy");
|
||||
xml_read_bool(&light->use_transmission, node, "use_transmission");
|
||||
xml_read_bool(&light->use_scatter, node, "use_scatter");
|
||||
|
||||
state.scene->lights.push_back(light);
|
||||
}
|
||||
|
||||
@@ -1109,6 +1155,25 @@ static void xml_read_state(XMLReadState& state, pugi::xml_node node)
|
||||
state.displacement_method = Mesh::DISPLACE_BOTH;
|
||||
}
|
||||
|
||||
/* Alembic */
|
||||
static void xml_read_alembic(const XMLReadState& state, pugi::xml_node node)
|
||||
{
|
||||
#ifdef WITH_ALEMBIC
|
||||
string filepath;
|
||||
|
||||
if(xml_read_string(&filepath, node, "file")) {
|
||||
filepath = path_join(state.base, filepath);
|
||||
|
||||
if(xml_equal_string(node, "type", "hdf5"))
|
||||
abc_read_hdf5_file(state.scene, filepath.c_str(), ABC_INFO_BASIC);
|
||||
else if(xml_equal_string(node, "type", "ogawa"))
|
||||
abc_read_ogawa_file(state.scene, filepath.c_str(), ABC_INFO_BASIC);
|
||||
else
|
||||
abc_read_ogawa_file(state.scene, filepath.c_str(), ABC_INFO_BASIC); /* default */
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Scene */
|
||||
|
||||
static void xml_read_include(const XMLReadState& state, const string& src);
|
||||
@@ -1158,6 +1223,9 @@ static void xml_read_scene(const XMLReadState& state, pugi::xml_node scene_node)
|
||||
if(xml_read_string(&src, node, "src"))
|
||||
xml_read_include(state, src);
|
||||
}
|
||||
else if(string_iequals(node.name(), "alembic")) {
|
||||
xml_read_alembic(state, node);
|
||||
}
|
||||
else
|
||||
fprintf(stderr, "Unknown node \"%s\".\n", node.name());
|
||||
}
|
||||
@@ -1178,7 +1246,8 @@ static void xml_read_include(const XMLReadState& state, const string& src)
|
||||
XMLReadState substate = state;
|
||||
substate.base = path_dirname(path);
|
||||
|
||||
xml_read_scene(substate, doc);
|
||||
pugi::xml_node cycles = doc.child("cycles");
|
||||
xml_read_scene(substate, cycles);
|
||||
}
|
||||
else {
|
||||
fprintf(stderr, "%s read error: %s\n", src.c_str(), parse_result.description());
|
||||
|
@@ -31,10 +31,12 @@ set(SRC
|
||||
blender_session.cpp
|
||||
blender_shader.cpp
|
||||
blender_sync.cpp
|
||||
blender_texture.cpp
|
||||
|
||||
CCL_api.h
|
||||
blender_sync.h
|
||||
blender_session.h
|
||||
blender_texture.h
|
||||
blender_util.h
|
||||
)
|
||||
|
||||
|
@@ -30,8 +30,10 @@ bl_info = {
|
||||
|
||||
import bpy
|
||||
|
||||
from . import engine
|
||||
from . import version_update
|
||||
from . import (
|
||||
engine,
|
||||
version_update,
|
||||
)
|
||||
|
||||
|
||||
class CyclesRender(bpy.types.RenderEngine):
|
||||
@@ -65,8 +67,8 @@ class CyclesRender(bpy.types.RenderEngine):
|
||||
def render(self, scene):
|
||||
engine.render(self)
|
||||
|
||||
def bake(self, scene, obj, pass_type, pixel_array, num_pixels, depth, result):
|
||||
engine.bake(self, obj, pass_type, pixel_array, num_pixels, depth, result)
|
||||
def bake(self, scene, obj, pass_type, object_id, pixel_array, num_pixels, depth, result):
|
||||
engine.bake(self, obj, pass_type, object_id, pixel_array, num_pixels, depth, result)
|
||||
|
||||
# viewport render
|
||||
def view_update(self, context):
|
||||
|
@@ -59,11 +59,11 @@ def render(engine):
|
||||
_cycles.render(engine.session)
|
||||
|
||||
|
||||
def bake(engine, obj, pass_type, pixel_array, num_pixels, depth, result):
|
||||
def bake(engine, obj, pass_type, object_id, pixel_array, num_pixels, depth, result):
|
||||
import _cycles
|
||||
session = getattr(engine, "session", None)
|
||||
if session is not None:
|
||||
_cycles.bake(engine.session, obj.as_pointer(), pass_type, pixel_array.as_pointer(), num_pixels, depth, result.as_pointer())
|
||||
_cycles.bake(engine.session, obj.as_pointer(), pass_type, object_id, pixel_array.as_pointer(), num_pixels, depth, result.as_pointer())
|
||||
|
||||
|
||||
def reset(engine, data, scene):
|
||||
|
@@ -66,6 +66,7 @@ enum_panorama_types = (
|
||||
('FISHEYE_EQUIDISTANT', "Fisheye Equidistant", "Ideal for fulldomes, ignore the sensor dimensions"),
|
||||
('FISHEYE_EQUISOLID', "Fisheye Equisolid",
|
||||
"Similar to most fisheye modern lens, takes sensor dimensions into consideration"),
|
||||
('MIRRORBALL', "Mirror Ball", "Uses the mirror ball mapping"),
|
||||
)
|
||||
|
||||
enum_curve_primitives = (
|
||||
@@ -393,6 +394,12 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
|
||||
default=0,
|
||||
)
|
||||
|
||||
cls.use_animated_seed = BoolProperty(
|
||||
name="Use Animated Seed",
|
||||
description="Use different seed values (and hence noise patterns) at different frames",
|
||||
default=False,
|
||||
)
|
||||
|
||||
cls.sample_clamp_direct = FloatProperty(
|
||||
name="Clamp Direct",
|
||||
description="If non-zero, the maximum value for a direct sample, "
|
||||
@@ -456,6 +463,12 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
|
||||
description="Use BVH spatial splits: longer builder time, faster render",
|
||||
default=False,
|
||||
)
|
||||
cls.debug_use_triangle_storage = BoolProperty(
|
||||
name="Use Triangle Storage",
|
||||
description="use special storage with aligned triangle coordinates for faster "
|
||||
"intesection check in expense of higher memory usage",
|
||||
default=True,
|
||||
)
|
||||
cls.use_cache = BoolProperty(
|
||||
name="Cache BVH",
|
||||
description="Cache last built BVH to disk for faster re-render if no geometry changed",
|
||||
@@ -504,6 +517,19 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
|
||||
),
|
||||
)
|
||||
|
||||
cls.use_camera_cull = BoolProperty(
|
||||
name="Use Camera Cull",
|
||||
description="Allow objects to be culled based on the camera frustum",
|
||||
default=False,
|
||||
)
|
||||
|
||||
cls.camera_cull_margin = FloatProperty(
|
||||
name="Camera Cull Margin",
|
||||
description="Margin for the camera space culling",
|
||||
default=0.1,
|
||||
min=0.0, max=5.0
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def unregister(cls):
|
||||
del bpy.types.Scene.cycles
|
||||
@@ -693,6 +719,12 @@ class CyclesLampSettings(bpy.types.PropertyGroup):
|
||||
"reduces noise for area lamps and sharp glossy materials",
|
||||
default=False,
|
||||
)
|
||||
cls.is_portal = BoolProperty(
|
||||
name="Is Portal",
|
||||
description="Use this area lamp to guide sampling of the background, "
|
||||
"note that this will make the lamp invisible",
|
||||
default=False,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def unregister(cls):
|
||||
@@ -877,6 +909,12 @@ class CyclesObjectBlurSettings(bpy.types.PropertyGroup):
|
||||
default=1,
|
||||
)
|
||||
|
||||
cls.use_camera_cull = BoolProperty(
|
||||
name="Use Camera Cull",
|
||||
description="Allow this object and it's duplicators to be culled by camera space culling",
|
||||
default=False,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def unregister(cls):
|
||||
del bpy.types.Object.cycles
|
||||
|
@@ -18,7 +18,11 @@
|
||||
|
||||
import bpy
|
||||
|
||||
from bpy.types import Panel, Menu, Operator
|
||||
from bpy.types import (
|
||||
Panel,
|
||||
Menu,
|
||||
Operator,
|
||||
)
|
||||
|
||||
|
||||
class CYCLES_MT_sampling_presets(Menu):
|
||||
@@ -56,7 +60,15 @@ def use_cpu(context):
|
||||
return (device_type == 'NONE' or cscene.device == 'CPU')
|
||||
|
||||
|
||||
def draw_samples_info(layout, cscene):
|
||||
def use_branched_path(context):
|
||||
cscene = context.scene.cycles
|
||||
device_type = context.user_preferences.system.compute_device_type
|
||||
|
||||
return (cscene.progressive == 'BRANCHED_PATH' and device_type != 'OPENCL')
|
||||
|
||||
|
||||
def draw_samples_info(layout, context):
|
||||
cscene = context.scene.cycles
|
||||
integrator = cscene.progressive
|
||||
|
||||
# Calculate sample values
|
||||
@@ -86,7 +98,7 @@ def draw_samples_info(layout, cscene):
|
||||
|
||||
# Draw interface
|
||||
# Do not draw for progressive, when Square Samples are disabled
|
||||
if (integrator == 'BRANCHED_PATH') or (cscene.use_square_samples and integrator == 'PATH'):
|
||||
if use_branched_path(context) or (cscene.use_square_samples and integrator == 'PATH'):
|
||||
col = layout.column(align=True)
|
||||
col.scale_y = 0.6
|
||||
col.label("Total Samples:")
|
||||
@@ -110,6 +122,7 @@ class CyclesRender_PT_sampling(CyclesButtonsPanel, Panel):
|
||||
|
||||
scene = context.scene
|
||||
cscene = scene.cycles
|
||||
device_type = context.user_preferences.system.compute_device_type
|
||||
|
||||
row = layout.row(align=True)
|
||||
row.menu("CYCLES_MT_sampling_presets", text=bpy.types.CYCLES_MT_sampling_presets.bl_label)
|
||||
@@ -117,7 +130,9 @@ class CyclesRender_PT_sampling(CyclesButtonsPanel, Panel):
|
||||
row.operator("render.cycles_sampling_preset_add", text="", icon="ZOOMOUT").remove_active = True
|
||||
|
||||
row = layout.row()
|
||||
row.prop(cscene, "progressive", text="")
|
||||
sub = row.row()
|
||||
sub.active = device_type != 'OPENCL'
|
||||
sub.prop(cscene, "progressive", text="")
|
||||
row.prop(cscene, "use_square_samples")
|
||||
|
||||
split = layout.split()
|
||||
@@ -125,11 +140,15 @@ class CyclesRender_PT_sampling(CyclesButtonsPanel, Panel):
|
||||
col = split.column()
|
||||
sub = col.column(align=True)
|
||||
sub.label("Settings:")
|
||||
sub.prop(cscene, "seed")
|
||||
|
||||
seed_sub = sub.row(align=True)
|
||||
seed_sub.prop(cscene, "seed")
|
||||
seed_sub.prop(cscene, "use_animated_seed", text="", icon="TIME")
|
||||
|
||||
sub.prop(cscene, "sample_clamp_direct")
|
||||
sub.prop(cscene, "sample_clamp_indirect")
|
||||
|
||||
if cscene.progressive == 'PATH':
|
||||
if cscene.progressive == 'PATH' or use_branched_path(context) == False:
|
||||
col = split.column()
|
||||
sub = col.column(align=True)
|
||||
sub.label(text="Samples:")
|
||||
@@ -163,7 +182,7 @@ class CyclesRender_PT_sampling(CyclesButtonsPanel, Panel):
|
||||
layout.row().prop(cscene, "use_layer_samples")
|
||||
break
|
||||
|
||||
draw_samples_info(layout, cscene)
|
||||
draw_samples_info(layout, context)
|
||||
|
||||
|
||||
class CyclesRender_PT_volume_sampling(CyclesButtonsPanel, Panel):
|
||||
@@ -303,6 +322,11 @@ class CyclesRender_PT_performance(CyclesButtonsPanel, Panel):
|
||||
subsub.enabled = not rd.use_border
|
||||
subsub.prop(rd, "use_save_buffers")
|
||||
|
||||
sub.prop(cscene, "use_camera_cull")
|
||||
subsub = col.column()
|
||||
subsub.active = cscene.use_camera_cull
|
||||
subsub.prop(cscene, "camera_cull_margin")
|
||||
|
||||
col = split.column(align=True)
|
||||
|
||||
col.label(text="Viewport:")
|
||||
@@ -320,6 +344,7 @@ class CyclesRender_PT_performance(CyclesButtonsPanel, Panel):
|
||||
|
||||
col.label(text="Acceleration structure:")
|
||||
col.prop(cscene, "debug_use_spatial_splits")
|
||||
col.prop(cscene, "debug_use_triangle_storage")
|
||||
|
||||
|
||||
class CyclesRender_PT_layer_options(CyclesButtonsPanel, Panel):
|
||||
@@ -413,6 +438,48 @@ class CyclesRender_PT_layer_passes(CyclesButtonsPanel, Panel):
|
||||
col.prop(rl, "use_pass_environment")
|
||||
|
||||
|
||||
class CyclesRender_PT_views(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Views"
|
||||
bl_context = "render_layer"
|
||||
|
||||
def draw_header(self, context):
|
||||
rd = context.scene.render
|
||||
self.layout.prop(rd, "use_multiview", text="")
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
||||
scene = context.scene
|
||||
rd = scene.render
|
||||
rv = rd.views.active
|
||||
|
||||
layout.active = rd.use_multiview
|
||||
basic_stereo = (rd.views_format == 'STEREO_3D')
|
||||
|
||||
row = layout.row()
|
||||
row.prop(rd, "views_format", expand=True)
|
||||
|
||||
if basic_stereo:
|
||||
row = layout.row()
|
||||
row.template_list("RENDERLAYER_UL_renderviews", "name", rd, "stereo_views", rd.views, "active_index", rows=2)
|
||||
|
||||
row = layout.row()
|
||||
row.label(text="File Suffix:")
|
||||
row.prop(rv, "file_suffix", text="")
|
||||
|
||||
else:
|
||||
row = layout.row()
|
||||
row.template_list("RENDERLAYER_UL_renderviews", "name", rd, "views", rd.views, "active_index", rows=2)
|
||||
|
||||
col = row.column(align=True)
|
||||
col.operator("scene.render_view_add", icon='ZOOMIN', text="")
|
||||
col.operator("scene.render_view_remove", icon='ZOOMOUT', text="")
|
||||
|
||||
row = layout.row()
|
||||
row.label(text="Camera Suffix:")
|
||||
row.prop(rv, "camera_suffix", text="")
|
||||
|
||||
|
||||
class Cycles_PT_post_processing(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Post Processing"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
@@ -456,7 +523,16 @@ class CyclesCamera_PT_dof(CyclesButtonsPanel, Panel):
|
||||
sub = col.row()
|
||||
sub.active = cam.dof_object is None
|
||||
sub.prop(cam, "dof_distance", text="Distance")
|
||||
col.prop(dof_options, "fstop")
|
||||
|
||||
hq_support = dof_options.is_hq_supported
|
||||
sub = col.column(align=True)
|
||||
sub.label("Viewport:")
|
||||
subhq = sub.column()
|
||||
subhq.active = hq_support
|
||||
subhq.prop(dof_options, "use_high_quality")
|
||||
sub.prop(dof_options, "fstop")
|
||||
if dof_options.use_high_quality and hq_support:
|
||||
sub.prop(dof_options, "blades")
|
||||
|
||||
col = split.column()
|
||||
|
||||
@@ -490,11 +566,16 @@ class Cycles_PT_context_material(CyclesButtonsPanel, Panel):
|
||||
ob = context.object
|
||||
slot = context.material_slot
|
||||
space = context.space_data
|
||||
is_sortable = len(ob.material_slots) > 1
|
||||
|
||||
if ob:
|
||||
rows = 1
|
||||
if (is_sortable):
|
||||
rows = 4
|
||||
|
||||
row = layout.row()
|
||||
|
||||
row.template_list("MATERIAL_UL_matslots", "", ob, "material_slots", ob, "active_material_index", rows=1)
|
||||
row.template_list("MATERIAL_UL_matslots", "", ob, "material_slots", ob, "active_material_index", rows=rows)
|
||||
|
||||
col = row.column(align=True)
|
||||
col.operator("object.material_slot_add", icon='ZOOMIN', text="")
|
||||
@@ -502,6 +583,12 @@ class Cycles_PT_context_material(CyclesButtonsPanel, Panel):
|
||||
|
||||
col.menu("MATERIAL_MT_specials", icon='DOWNARROW_HLT', text="")
|
||||
|
||||
if is_sortable:
|
||||
col.separator()
|
||||
|
||||
col.operator("object.material_slot_move", icon='TRIA_UP', text="").direction = 'UP'
|
||||
col.operator("object.material_slot_move", icon='TRIA_DOWN', text="").direction = 'DOWN'
|
||||
|
||||
if ob.mode == 'EDIT':
|
||||
row = layout.row(align=True)
|
||||
row.operator("object.material_slot_assign", text="Assign")
|
||||
@@ -597,8 +684,8 @@ class CyclesObject_PT_motion_blur(CyclesButtonsPanel, Panel):
|
||||
sub.prop(cob, "motion_steps", text="Steps")
|
||||
|
||||
|
||||
class CyclesObject_PT_ray_visibility(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Ray Visibility"
|
||||
class CyclesObject_PT_cycles_settings(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Cycles Settings"
|
||||
bl_context = "object"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
|
||||
@@ -613,8 +700,10 @@ class CyclesObject_PT_ray_visibility(CyclesButtonsPanel, Panel):
|
||||
layout = self.layout
|
||||
|
||||
ob = context.object
|
||||
cob = ob.cycles
|
||||
visibility = ob.cycles_visibility
|
||||
|
||||
layout.label(text="Ray Visibility:")
|
||||
flow = layout.column_flow()
|
||||
|
||||
flow.prop(visibility, "camera")
|
||||
@@ -626,6 +715,9 @@ class CyclesObject_PT_ray_visibility(CyclesButtonsPanel, Panel):
|
||||
if ob.type != 'LAMP':
|
||||
flow.prop(visibility, "shadow")
|
||||
|
||||
layout.label(text="Performance:")
|
||||
layout.prop(cob, "use_camera_cull")
|
||||
|
||||
|
||||
class CYCLES_OT_use_shading_nodes(Operator):
|
||||
"""Enable nodes on a material, world or lamp"""
|
||||
@@ -652,9 +744,14 @@ def find_node(material, nodetype):
|
||||
if material and material.node_tree:
|
||||
ntree = material.node_tree
|
||||
|
||||
active_output_node = None
|
||||
for node in ntree.nodes:
|
||||
if getattr(node, "type", None) == nodetype:
|
||||
return node
|
||||
if getattr(node, "is_active_output", True):
|
||||
return node
|
||||
if not active_output_node:
|
||||
active_output_node = node
|
||||
return active_output_node
|
||||
|
||||
return None
|
||||
|
||||
@@ -691,7 +788,10 @@ class CyclesLamp_PT_preview(CyclesButtonsPanel, Panel):
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
return context.lamp and CyclesButtonsPanel.poll(context)
|
||||
return context.lamp and \
|
||||
not (context.lamp.type == 'AREA' and
|
||||
context.lamp.cycles.is_portal) \
|
||||
and CyclesButtonsPanel.poll(context)
|
||||
|
||||
def draw(self, context):
|
||||
self.layout.template_preview(context.lamp)
|
||||
@@ -729,13 +829,21 @@ class CyclesLamp_PT_lamp(CyclesButtonsPanel, Panel):
|
||||
sub.prop(lamp, "size", text="Size X")
|
||||
sub.prop(lamp, "size_y", text="Size Y")
|
||||
|
||||
if cscene.progressive == 'BRANCHED_PATH':
|
||||
col.prop(clamp, "samples")
|
||||
col.prop(clamp, "max_bounces")
|
||||
if not (lamp.type == 'AREA' and clamp.is_portal):
|
||||
sub = col.column(align=True)
|
||||
if use_branched_path(context):
|
||||
sub.prop(clamp, "samples")
|
||||
sub.prop(clamp, "max_bounces")
|
||||
|
||||
col = split.column()
|
||||
col.prop(clamp, "cast_shadow")
|
||||
col.prop(clamp, "use_multiple_importance_sampling", text="Multiple Importance")
|
||||
|
||||
sub = col.column(align=True)
|
||||
sub.active = not (lamp.type == 'AREA' and clamp.is_portal)
|
||||
sub.prop(clamp, "cast_shadow")
|
||||
sub.prop(clamp, "use_multiple_importance_sampling", text="Multiple Importance")
|
||||
|
||||
if lamp.type == 'AREA':
|
||||
col.prop(clamp, "is_portal", text="Portal")
|
||||
|
||||
if lamp.type == 'HEMI':
|
||||
layout.label(text="Not supported, interpreted as sun lamp")
|
||||
@@ -747,7 +855,9 @@ class CyclesLamp_PT_nodes(CyclesButtonsPanel, Panel):
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
return context.lamp and CyclesButtonsPanel.poll(context)
|
||||
return context.lamp and not (context.lamp.type == 'AREA' and
|
||||
context.lamp.cycles.is_portal) and \
|
||||
CyclesButtonsPanel.poll(context)
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
@@ -930,7 +1040,7 @@ class CyclesWorld_PT_settings(CyclesButtonsPanel, Panel):
|
||||
sub = col.column(align=True)
|
||||
sub.active = cworld.sample_as_light
|
||||
sub.prop(cworld, "sample_map_resolution")
|
||||
if cscene.progressive == 'BRANCHED_PATH':
|
||||
if use_branched_path(context):
|
||||
sub.prop(cworld, "samples")
|
||||
|
||||
col = split.column()
|
||||
@@ -1032,7 +1142,7 @@ class CyclesMaterial_PT_settings(CyclesButtonsPanel, Panel):
|
||||
sub = col.column()
|
||||
sub.active = use_cpu(context)
|
||||
sub.prop(cmat, "volume_sampling", text="")
|
||||
col.prop(cmat, "volume_interpolation", text="")
|
||||
sub.prop(cmat, "volume_interpolation", text="")
|
||||
col.prop(cmat, "homogeneous_volume", text="Homogeneous")
|
||||
|
||||
layout.separator()
|
||||
@@ -1117,7 +1227,8 @@ class CyclesTexture_PT_mapping(CyclesButtonsPanel, Panel):
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
node = context.texture_node
|
||||
return node and CyclesButtonsPanel.poll(context)
|
||||
# TODO(sergey): perform a faster/nicer check?
|
||||
return node and hasattr(node, 'texture_mapping') and CyclesButtonsPanel.poll(context)
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
@@ -1341,13 +1452,21 @@ class CyclesScene_PT_simplify(CyclesButtonsPanel, Panel):
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
||||
rd = context.scene.render
|
||||
scene = context.scene
|
||||
rd = scene.render
|
||||
|
||||
layout.active = rd.use_simplify
|
||||
split = layout.split()
|
||||
|
||||
row = layout.row()
|
||||
row.prop(rd, "simplify_subdivision", text="Subdivision")
|
||||
row.prop(rd, "simplify_child_particles", text="Child Particles")
|
||||
col = split.column()
|
||||
col.label(text="Viewport:")
|
||||
col.prop(rd, "simplify_subdivision", text="Subdivision")
|
||||
col.prop(rd, "simplify_child_particles", text="Child Particles")
|
||||
|
||||
col = split.column()
|
||||
col.label(text="Render:")
|
||||
col.prop(rd, "simplify_subdivision_render", text="Subdivision")
|
||||
col.prop(rd, "simplify_child_particles_render", text="Child Particles")
|
||||
|
||||
|
||||
def draw_device(self, context):
|
||||
@@ -1420,6 +1539,7 @@ def get_panels():
|
||||
"DATA_PT_vertex_colors",
|
||||
"DATA_PT_camera",
|
||||
"DATA_PT_camera_display",
|
||||
"DATA_PT_camera_stereoscopy",
|
||||
"DATA_PT_camera_safe_areas",
|
||||
"DATA_PT_lens",
|
||||
"DATA_PT_speaker",
|
||||
|
@@ -21,10 +21,8 @@ import bpy
|
||||
from bpy.app.handlers import persistent
|
||||
|
||||
|
||||
def check_is_new_shading_material(material):
|
||||
if not material.node_tree:
|
||||
return False
|
||||
for node in material.node_tree.nodes:
|
||||
def check_is_new_shading_ntree(node_tree):
|
||||
for node in node_tree.nodes:
|
||||
# If material has any node with ONLY new shading system
|
||||
# compatibility then it's considered a Cycles material
|
||||
# and versioning code would need to perform on it.
|
||||
@@ -44,6 +42,24 @@ def check_is_new_shading_material(material):
|
||||
return False
|
||||
|
||||
|
||||
def check_is_new_shading_material(material):
|
||||
if not material.node_tree:
|
||||
return False
|
||||
return check_is_new_shading_ntree(material.node_tree)
|
||||
|
||||
|
||||
def check_is_new_shading_world(world):
|
||||
if not world.node_tree:
|
||||
return False
|
||||
return check_is_new_shading_ntree(world.node_tree)
|
||||
|
||||
|
||||
def check_is_new_shading_lamp(lamp):
|
||||
if not lamp.node_tree:
|
||||
return False
|
||||
return check_is_new_shading_ntree(lamp.node_tree)
|
||||
|
||||
|
||||
def foreach_notree_node(nodetree, callback, traversed):
|
||||
if nodetree in traversed:
|
||||
return
|
||||
@@ -61,6 +77,16 @@ def foreach_cycles_node(callback):
|
||||
foreach_notree_node(material.node_tree,
|
||||
callback,
|
||||
traversed)
|
||||
for world in bpy.data.worlds:
|
||||
if check_is_new_shading_world(world):
|
||||
foreach_notree_node(world.node_tree,
|
||||
callback,
|
||||
traversed)
|
||||
for lamp in bpy.data.lamps:
|
||||
if check_is_new_shading_world(lamp):
|
||||
foreach_notree_node(lamp.node_tree,
|
||||
callback,
|
||||
traversed)
|
||||
|
||||
|
||||
def mapping_node_order_flip(node):
|
||||
|
@@ -72,7 +72,7 @@ struct BlenderCamera {
|
||||
Transform matrix;
|
||||
};
|
||||
|
||||
static void blender_camera_init(BlenderCamera *bcam, BL::RenderSettings b_render, BL::Scene b_scene)
|
||||
static void blender_camera_init(BlenderCamera *bcam, BL::RenderSettings b_render)
|
||||
{
|
||||
memset(bcam, 0, sizeof(BlenderCamera));
|
||||
|
||||
@@ -95,7 +95,7 @@ static void blender_camera_init(BlenderCamera *bcam, BL::RenderSettings b_render
|
||||
bcam->full_height = render_resolution_y(b_render);
|
||||
}
|
||||
|
||||
static float blender_camera_focal_distance(BL::Object b_ob, BL::Camera b_camera)
|
||||
static float blender_camera_focal_distance(BL::RenderEngine b_engine, BL::Object b_ob, BL::Camera b_camera)
|
||||
{
|
||||
BL::Object b_dof_object = b_camera.dof_object();
|
||||
|
||||
@@ -103,14 +103,16 @@ static float blender_camera_focal_distance(BL::Object b_ob, BL::Camera b_camera)
|
||||
return b_camera.dof_distance();
|
||||
|
||||
/* for dof object, return distance along camera Z direction */
|
||||
Transform obmat = transform_clear_scale(get_transform(b_ob.matrix_world()));
|
||||
BL::Array<float, 16> b_ob_matrix;
|
||||
b_engine.camera_model_matrix(b_ob, b_ob_matrix);
|
||||
Transform obmat = get_transform(b_ob_matrix);
|
||||
Transform dofmat = get_transform(b_dof_object.matrix_world());
|
||||
Transform mat = transform_inverse(obmat) * dofmat;
|
||||
|
||||
return fabsf(transform_get_column(&mat, 3).z);
|
||||
}
|
||||
|
||||
static void blender_camera_from_object(BlenderCamera *bcam, BL::Object b_ob, bool skip_panorama = false)
|
||||
static void blender_camera_from_object(BlenderCamera *bcam, BL::RenderEngine b_engine, BL::Object b_ob, bool skip_panorama = false)
|
||||
{
|
||||
BL::ID b_ob_data = b_ob.data();
|
||||
|
||||
@@ -146,6 +148,9 @@ static void blender_camera_from_object(BlenderCamera *bcam, BL::Object b_ob, boo
|
||||
case 2:
|
||||
bcam->panorama_type = PANORAMA_FISHEYE_EQUISOLID;
|
||||
break;
|
||||
case 3:
|
||||
bcam->panorama_type = PANORAMA_MIRRORBALL;
|
||||
break;
|
||||
case 0:
|
||||
default:
|
||||
bcam->panorama_type = PANORAMA_EQUIRECTANGULAR;
|
||||
@@ -181,10 +186,10 @@ static void blender_camera_from_object(BlenderCamera *bcam, BL::Object b_ob, boo
|
||||
|
||||
bcam->apertureblades = RNA_int_get(&ccamera, "aperture_blades");
|
||||
bcam->aperturerotation = RNA_float_get(&ccamera, "aperture_rotation");
|
||||
bcam->focaldistance = blender_camera_focal_distance(b_ob, b_camera);
|
||||
bcam->focaldistance = blender_camera_focal_distance(b_engine, b_ob, b_camera);
|
||||
bcam->aperture_ratio = RNA_float_get(&ccamera, "aperture_ratio");
|
||||
|
||||
bcam->shift.x = b_camera.shift_x();
|
||||
bcam->shift.x = b_engine.camera_shift_x(b_ob);
|
||||
bcam->shift.y = b_camera.shift_y();
|
||||
|
||||
bcam->sensor_width = b_camera.sensor_width();
|
||||
@@ -303,7 +308,7 @@ static void blender_camera_sync(Camera *cam, BlenderCamera *bcam, int width, int
|
||||
&cam->viewplane, &aspectratio, &sensor_size);
|
||||
|
||||
/* panorama sensor */
|
||||
if (bcam->type == CAMERA_PANORAMA && bcam->panorama_type == PANORAMA_FISHEYE_EQUISOLID) {
|
||||
if(bcam->type == CAMERA_PANORAMA && bcam->panorama_type == PANORAMA_FISHEYE_EQUISOLID) {
|
||||
float fit_xratio = (float)bcam->full_width*bcam->pixelaspect.x;
|
||||
float fit_yratio = (float)bcam->full_height*bcam->pixelaspect.y;
|
||||
bool horizontal_fit;
|
||||
@@ -380,7 +385,7 @@ static void blender_camera_sync(Camera *cam, BlenderCamera *bcam, int width, int
|
||||
void BlenderSync::sync_camera(BL::RenderSettings b_render, BL::Object b_override, int width, int height)
|
||||
{
|
||||
BlenderCamera bcam;
|
||||
blender_camera_init(&bcam, b_render, b_scene);
|
||||
blender_camera_init(&bcam, b_render);
|
||||
|
||||
/* pixel aspect */
|
||||
bcam.pixelaspect.x = b_render.pixel_aspect_x();
|
||||
@@ -402,8 +407,10 @@ void BlenderSync::sync_camera(BL::RenderSettings b_render, BL::Object b_override
|
||||
b_ob = b_override;
|
||||
|
||||
if(b_ob) {
|
||||
blender_camera_from_object(&bcam, b_ob);
|
||||
bcam.matrix = get_transform(b_ob.matrix_world());
|
||||
BL::Array<float, 16> b_ob_matrix;
|
||||
blender_camera_from_object(&bcam, b_engine, b_ob);
|
||||
b_engine.camera_model_matrix(b_ob, b_ob_matrix);
|
||||
bcam.matrix = get_transform(b_ob_matrix);
|
||||
}
|
||||
|
||||
/* sync */
|
||||
@@ -414,8 +421,9 @@ void BlenderSync::sync_camera(BL::RenderSettings b_render, BL::Object b_override
|
||||
void BlenderSync::sync_camera_motion(BL::Object b_ob, float motion_time)
|
||||
{
|
||||
Camera *cam = scene->camera;
|
||||
|
||||
Transform tfm = get_transform(b_ob.matrix_world());
|
||||
BL::Array<float, 16> b_ob_matrix;
|
||||
b_engine.camera_model_matrix(b_ob, b_ob_matrix);
|
||||
Transform tfm = get_transform(b_ob_matrix);
|
||||
tfm = blender_camera_matrix(tfm, cam->type);
|
||||
|
||||
if(tfm != cam->matrix) {
|
||||
@@ -433,10 +441,10 @@ void BlenderSync::sync_camera_motion(BL::Object b_ob, float motion_time)
|
||||
|
||||
/* Sync 3D View Camera */
|
||||
|
||||
static void blender_camera_view_subset(BL::RenderSettings b_render, BL::Scene b_scene, BL::Object b_ob, BL::SpaceView3D b_v3d,
|
||||
static void blender_camera_view_subset(BL::RenderEngine b_engine, BL::RenderSettings b_render, BL::Scene b_scene, BL::Object b_ob, BL::SpaceView3D b_v3d,
|
||||
BL::RegionView3D b_rv3d, int width, int height, BoundBox2D *view_box, BoundBox2D *cam_box);
|
||||
|
||||
static void blender_camera_from_view(BlenderCamera *bcam, BL::Scene b_scene, BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height, bool skip_panorama = false)
|
||||
static void blender_camera_from_view(BlenderCamera *bcam, BL::RenderEngine b_engine, BL::Scene b_scene, BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height, bool skip_panorama = false)
|
||||
{
|
||||
/* 3d view parameters */
|
||||
bcam->nearclip = b_v3d.clip_start();
|
||||
@@ -449,13 +457,13 @@ static void blender_camera_from_view(BlenderCamera *bcam, BL::Scene b_scene, BL:
|
||||
BL::Object b_ob = (b_v3d.lock_camera_and_layers())? b_scene.camera(): b_v3d.camera();
|
||||
|
||||
if(b_ob) {
|
||||
blender_camera_from_object(bcam, b_ob, skip_panorama);
|
||||
blender_camera_from_object(bcam, b_engine, b_ob, skip_panorama);
|
||||
|
||||
if(!skip_panorama && bcam->type == CAMERA_PANORAMA) {
|
||||
/* in panorama camera view, we map viewplane to camera border */
|
||||
BoundBox2D view_box, cam_box;
|
||||
|
||||
blender_camera_view_subset(b_scene.render(), b_scene, b_ob, b_v3d, b_rv3d, width, height,
|
||||
blender_camera_view_subset(b_engine, b_scene.render(), b_scene, b_ob, b_v3d, b_rv3d, width, height,
|
||||
&view_box, &cam_box);
|
||||
|
||||
bcam->pano_viewplane = view_box.make_relative_to(cam_box);
|
||||
@@ -493,7 +501,7 @@ static void blender_camera_from_view(BlenderCamera *bcam, BL::Scene b_scene, BL:
|
||||
bcam->matrix = transform_inverse(get_transform(b_rv3d.view_matrix()));
|
||||
}
|
||||
|
||||
static void blender_camera_view_subset(BL::RenderSettings b_render, BL::Scene b_scene, BL::Object b_ob, BL::SpaceView3D b_v3d,
|
||||
static void blender_camera_view_subset(BL::RenderEngine b_engine, BL::RenderSettings b_render, BL::Scene b_scene, BL::Object b_ob, BL::SpaceView3D b_v3d,
|
||||
BL::RegionView3D b_rv3d, int width, int height, BoundBox2D *view_box, BoundBox2D *cam_box)
|
||||
{
|
||||
BoundBox2D cam, view;
|
||||
@@ -501,16 +509,16 @@ static void blender_camera_view_subset(BL::RenderSettings b_render, BL::Scene b_
|
||||
|
||||
/* get viewport viewplane */
|
||||
BlenderCamera view_bcam;
|
||||
blender_camera_init(&view_bcam, b_render, b_scene);
|
||||
blender_camera_from_view(&view_bcam, b_scene, b_v3d, b_rv3d, width, height, true);
|
||||
blender_camera_init(&view_bcam, b_render);
|
||||
blender_camera_from_view(&view_bcam, b_engine, b_scene, b_v3d, b_rv3d, width, height, true);
|
||||
|
||||
blender_camera_viewplane(&view_bcam, width, height,
|
||||
&view, &view_aspect, &sensor_size);
|
||||
|
||||
/* get camera viewplane */
|
||||
BlenderCamera cam_bcam;
|
||||
blender_camera_init(&cam_bcam, b_render, b_scene);
|
||||
blender_camera_from_object(&cam_bcam, b_ob, true);
|
||||
blender_camera_init(&cam_bcam, b_render);
|
||||
blender_camera_from_object(&cam_bcam, b_engine, b_ob, true);
|
||||
|
||||
blender_camera_viewplane(&cam_bcam, cam_bcam.full_width, cam_bcam.full_height,
|
||||
&cam, &cam_aspect, &sensor_size);
|
||||
@@ -520,7 +528,8 @@ static void blender_camera_view_subset(BL::RenderSettings b_render, BL::Scene b_
|
||||
*cam_box = cam * (1.0f/cam_aspect);
|
||||
}
|
||||
|
||||
static void blender_camera_border_subset(BL::RenderSettings b_render,
|
||||
static void blender_camera_border_subset(BL::RenderEngine b_engine,
|
||||
BL::RenderSettings b_render,
|
||||
BL::Scene b_scene,
|
||||
BL::SpaceView3D b_v3d,
|
||||
BL::RegionView3D b_rv3d,
|
||||
@@ -531,7 +540,7 @@ static void blender_camera_border_subset(BL::RenderSettings b_render,
|
||||
{
|
||||
/* Determine camera viewport subset. */
|
||||
BoundBox2D view_box, cam_box;
|
||||
blender_camera_view_subset(b_render, b_scene, b_ob, b_v3d, b_rv3d, width, height,
|
||||
blender_camera_view_subset(b_engine, b_render, b_scene, b_ob, b_v3d, b_rv3d, width, height,
|
||||
&view_box, &cam_box);
|
||||
|
||||
/* Determine viewport subset matching given border. */
|
||||
@@ -539,7 +548,7 @@ static void blender_camera_border_subset(BL::RenderSettings b_render,
|
||||
*result = cam_box.subset(border);
|
||||
}
|
||||
|
||||
static void blender_camera_border(BlenderCamera *bcam, BL::RenderSettings b_render, BL::Scene b_scene, BL::SpaceView3D b_v3d,
|
||||
static void blender_camera_border(BlenderCamera *bcam, BL::RenderEngine b_engine, BL::RenderSettings b_render, BL::Scene b_scene, BL::SpaceView3D b_v3d,
|
||||
BL::RegionView3D b_rv3d, int width, int height)
|
||||
{
|
||||
bool is_camera_view;
|
||||
@@ -568,7 +577,8 @@ static void blender_camera_border(BlenderCamera *bcam, BL::RenderSettings b_rend
|
||||
|
||||
/* Determine camera border inside the viewport. */
|
||||
BoundBox2D full_border;
|
||||
blender_camera_border_subset(b_render,
|
||||
blender_camera_border_subset(b_engine,
|
||||
b_render,
|
||||
b_scene,
|
||||
b_v3d,
|
||||
b_rv3d,
|
||||
@@ -587,7 +597,8 @@ static void blender_camera_border(BlenderCamera *bcam, BL::RenderSettings b_rend
|
||||
bcam->border.top = b_render.border_max_y();
|
||||
|
||||
/* Determine viewport subset matching camera border. */
|
||||
blender_camera_border_subset(b_render,
|
||||
blender_camera_border_subset(b_engine,
|
||||
b_render,
|
||||
b_scene,
|
||||
b_v3d,
|
||||
b_rv3d,
|
||||
@@ -601,14 +612,14 @@ static void blender_camera_border(BlenderCamera *bcam, BL::RenderSettings b_rend
|
||||
void BlenderSync::sync_view(BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height)
|
||||
{
|
||||
BlenderCamera bcam;
|
||||
blender_camera_init(&bcam, b_scene.render(), b_scene);
|
||||
blender_camera_from_view(&bcam, b_scene, b_v3d, b_rv3d, width, height);
|
||||
blender_camera_border(&bcam, b_scene.render(), b_scene, b_v3d, b_rv3d, width, height);
|
||||
blender_camera_init(&bcam, b_scene.render());
|
||||
blender_camera_from_view(&bcam, b_engine, b_scene, b_v3d, b_rv3d, width, height);
|
||||
blender_camera_border(&bcam, b_engine, b_scene.render(), b_scene, b_v3d, b_rv3d, width, height);
|
||||
|
||||
blender_camera_sync(scene->camera, &bcam, width, height);
|
||||
}
|
||||
|
||||
BufferParams BlenderSync::get_buffer_params(BL::RenderSettings b_render, BL::Scene b_scene, BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, Camera *cam, int width, int height)
|
||||
BufferParams BlenderSync::get_buffer_params(BL::RenderSettings b_render, BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, Camera *cam, int width, int height)
|
||||
{
|
||||
BufferParams params;
|
||||
bool use_border = false;
|
||||
|
@@ -37,15 +37,14 @@ void curveinterp_v3_v3v3v3v3(float3 *p, float3 *v1, float3 *v2, float3 *v3, floa
|
||||
void interp_weights(float t, float data[4]);
|
||||
float shaperadius(float shape, float root, float tip, float time);
|
||||
void InterpolateKeySegments(int seg, int segno, int key, int curve, float3 *keyloc, float *time, ParticleCurveData *CData);
|
||||
bool ObtainCacheParticleUV(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool background, int uv_num);
|
||||
bool ObtainCacheParticleVcol(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool background, int vcol_num);
|
||||
bool ObtainCacheParticleData(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool background);
|
||||
void ExportCurveSegments(Scene *scene, Mesh *mesh, ParticleCurveData *CData);
|
||||
void ExportCurveTrianglePlanes(Mesh *mesh, ParticleCurveData *CData,
|
||||
float3 RotCam, bool is_ortho);
|
||||
void ExportCurveTriangleGeometry(Mesh *mesh, ParticleCurveData *CData, int resolution);
|
||||
void ExportCurveTriangleUV(Mesh *mesh, ParticleCurveData *CData, int vert_offset, int resol, float3 *uvdata);
|
||||
void ExportCurveTriangleVcol(Mesh *mesh, ParticleCurveData *CData, int vert_offset, int resol, uchar4 *cdata);
|
||||
void ExportCurveTriangleUV(ParticleCurveData *CData, int vert_offset, int resol, float3 *uvdata);
|
||||
void ExportCurveUV(Mesh *mesh, ParticleCurveData *CData, ustring name, bool active_render, int primitive, int vert_offset, int resol);
|
||||
void ExportCurveTriangleVcol(ParticleCurveData *CData, int vert_offset, int resol, uchar4 *cdata);
|
||||
void ExportCurveVcol(Mesh *mesh, ParticleCurveData *CData, ustring name, int primitive, int vert_offset, int resol);
|
||||
|
||||
ParticleCurveData::ParticleCurveData()
|
||||
{
|
||||
@@ -119,214 +118,338 @@ void InterpolateKeySegments(int seg, int segno, int key, int curve, float3 *keyl
|
||||
curveinterp_v3_v3v3v3v3(keyloc, &ckey_loc1, &ckey_loc2, &ckey_loc3, &ckey_loc4, t);
|
||||
}
|
||||
|
||||
bool ObtainCacheParticleData(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool background)
|
||||
static void ObtainCacheParticleData(Mesh *mesh, BL::Object b_ob, BL::ParticleSystem b_psys, const Transform &itfm,
|
||||
ParticleCurveData *CData, bool background)
|
||||
{
|
||||
int curvenum = 0;
|
||||
int keyno = 0;
|
||||
|
||||
if(!(mesh && b_mesh && b_ob && CData))
|
||||
return false;
|
||||
|
||||
Transform tfm = get_transform(b_ob->matrix_world());
|
||||
Transform itfm = transform_quick_inverse(tfm);
|
||||
|
||||
BL::Object::modifiers_iterator b_mod;
|
||||
for(b_ob->modifiers.begin(b_mod); b_mod != b_ob->modifiers.end(); ++b_mod) {
|
||||
if((b_mod->type() == b_mod->type_PARTICLE_SYSTEM) && (background ? b_mod->show_render() : b_mod->show_viewport())) {
|
||||
BL::ParticleSystemModifier psmd((const PointerRNA)b_mod->ptr);
|
||||
BL::ParticleSystem b_psys((const PointerRNA)psmd.particle_system().ptr);
|
||||
BL::ParticleSettings b_part((const PointerRNA)b_psys.settings().ptr);
|
||||
|
||||
if((b_part.render_type() == BL::ParticleSettings::render_type_PATH) && (b_part.type() == BL::ParticleSettings::type_HAIR)) {
|
||||
int mi = clamp(b_part.material()-1, 0, mesh->used_shaders.size()-1);
|
||||
int shader = mesh->used_shaders[mi];
|
||||
int draw_step = background ? b_part.render_step() : b_part.draw_step();
|
||||
int totparts = b_psys.particles.length();
|
||||
int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_part.draw_percentage() / 100.0f);
|
||||
int totcurves = totchild;
|
||||
|
||||
if(b_part.child_type() == 0)
|
||||
totcurves += totparts;
|
||||
|
||||
if(totcurves == 0)
|
||||
continue;
|
||||
|
||||
int ren_step = (1 << draw_step) + 1;
|
||||
if (b_part.kink() == BL::ParticleSettings::kink_SPIRAL)
|
||||
ren_step += b_part.kink_extra_steps();
|
||||
|
||||
PointerRNA cpsys = RNA_pointer_get(&b_part.ptr, "cycles");
|
||||
|
||||
CData->psys_firstcurve.push_back(curvenum);
|
||||
CData->psys_curvenum.push_back(totcurves);
|
||||
CData->psys_shader.push_back(shader);
|
||||
|
||||
float radius = get_float(cpsys, "radius_scale") * 0.5f;
|
||||
BL::ParticleSettings b_part((const PointerRNA)b_psys.settings().ptr);
|
||||
int mi = clamp(b_part.material()-1, 0, mesh->used_shaders.size()-1);
|
||||
int shader = mesh->used_shaders[mi];
|
||||
int draw_step = background ? b_part.render_step() : b_part.draw_step();
|
||||
int totparts = b_psys.particles.length();
|
||||
int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_part.draw_percentage() / 100.0f);
|
||||
int totcurves = totchild;
|
||||
|
||||
CData->psys_rootradius.push_back(radius * get_float(cpsys, "root_width"));
|
||||
CData->psys_tipradius.push_back(radius * get_float(cpsys, "tip_width"));
|
||||
CData->psys_shape.push_back(get_float(cpsys, "shape"));
|
||||
CData->psys_closetip.push_back(get_boolean(cpsys, "use_closetip"));
|
||||
if(b_part.child_type() == 0)
|
||||
totcurves += totparts;
|
||||
|
||||
int pa_no = 0;
|
||||
if(!(b_part.child_type() == 0))
|
||||
pa_no = totparts;
|
||||
if(totcurves == 0)
|
||||
return;
|
||||
|
||||
int num_add = (totparts+totchild - pa_no);
|
||||
CData->curve_firstkey.reserve(CData->curve_firstkey.size() + num_add);
|
||||
CData->curve_keynum.reserve(CData->curve_keynum.size() + num_add);
|
||||
CData->curve_length.reserve(CData->curve_length.size() + num_add);
|
||||
CData->curvekey_co.reserve(CData->curvekey_co.size() + num_add*ren_step);
|
||||
CData->curvekey_time.reserve(CData->curvekey_time.size() + num_add*ren_step);
|
||||
int ren_step = (1 << draw_step) + 1;
|
||||
if(b_part.kink() == BL::ParticleSettings::kink_SPIRAL)
|
||||
ren_step += b_part.kink_extra_steps();
|
||||
|
||||
for(; pa_no < totparts+totchild; pa_no++) {
|
||||
int keynum = 0;
|
||||
CData->curve_firstkey.push_back(keyno);
|
||||
|
||||
float curve_length = 0.0f;
|
||||
float3 pcKey;
|
||||
for(int step_no = 0; step_no < ren_step; step_no++) {
|
||||
float nco[3];
|
||||
b_psys.co_hair(*b_ob, pa_no, step_no, nco);
|
||||
float3 cKey = make_float3(nco[0], nco[1], nco[2]);
|
||||
cKey = transform_point(&itfm, cKey);
|
||||
if(step_no > 0) {
|
||||
float step_length = len(cKey - pcKey);
|
||||
if(step_length == 0.0f)
|
||||
continue;
|
||||
curve_length += step_length;
|
||||
}
|
||||
CData->curvekey_co.push_back(cKey);
|
||||
CData->curvekey_time.push_back(curve_length);
|
||||
pcKey = cKey;
|
||||
keynum++;
|
||||
}
|
||||
keyno += keynum;
|
||||
PointerRNA cpsys = RNA_pointer_get(&b_part.ptr, "cycles");
|
||||
|
||||
int keyno = CData->curvekey_co.size();
|
||||
int curvenum = CData->curve_keynum.size();
|
||||
|
||||
CData->curve_keynum.push_back(keynum);
|
||||
CData->curve_length.push_back(curve_length);
|
||||
curvenum++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
CData->psys_firstcurve.push_back(curvenum);
|
||||
CData->psys_curvenum.push_back(totcurves);
|
||||
CData->psys_shader.push_back(shader);
|
||||
|
||||
return true;
|
||||
}
|
||||
float radius = get_float(cpsys, "radius_scale") * 0.5f;
|
||||
|
||||
bool ObtainCacheParticleUV(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool background, int uv_num)
|
||||
{
|
||||
if(!(mesh && b_mesh && b_ob && CData))
|
||||
return false;
|
||||
CData->psys_rootradius.push_back(radius * get_float(cpsys, "root_width"));
|
||||
CData->psys_tipradius.push_back(radius * get_float(cpsys, "tip_width"));
|
||||
CData->psys_shape.push_back(get_float(cpsys, "shape"));
|
||||
CData->psys_closetip.push_back(get_boolean(cpsys, "use_closetip"));
|
||||
|
||||
CData->curve_uv.clear();
|
||||
int pa_no = 0;
|
||||
if(!(b_part.child_type() == 0))
|
||||
pa_no = totparts;
|
||||
|
||||
BL::Object::modifiers_iterator b_mod;
|
||||
for(b_ob->modifiers.begin(b_mod); b_mod != b_ob->modifiers.end(); ++b_mod) {
|
||||
if((b_mod->type() == b_mod->type_PARTICLE_SYSTEM) && (background ? b_mod->show_render() : b_mod->show_viewport())) {
|
||||
BL::ParticleSystemModifier psmd((const PointerRNA)b_mod->ptr);
|
||||
BL::ParticleSystem b_psys((const PointerRNA)psmd.particle_system().ptr);
|
||||
BL::ParticleSettings b_part((const PointerRNA)b_psys.settings().ptr);
|
||||
int num_add = (totparts+totchild - pa_no);
|
||||
CData->curve_firstkey.reserve(CData->curve_firstkey.size() + num_add);
|
||||
CData->curve_keynum.reserve(CData->curve_keynum.size() + num_add);
|
||||
CData->curve_length.reserve(CData->curve_length.size() + num_add);
|
||||
CData->curvekey_co.reserve(CData->curvekey_co.size() + num_add*ren_step);
|
||||
CData->curvekey_time.reserve(CData->curvekey_time.size() + num_add*ren_step);
|
||||
|
||||
if((b_part.render_type() == BL::ParticleSettings::render_type_PATH) && (b_part.type() == BL::ParticleSettings::type_HAIR)) {
|
||||
int totparts = b_psys.particles.length();
|
||||
int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_part.draw_percentage() / 100.0f);
|
||||
int totcurves = totchild;
|
||||
|
||||
if (b_part.child_type() == 0)
|
||||
totcurves += totparts;
|
||||
|
||||
if (totcurves == 0)
|
||||
for(; pa_no < totparts+totchild; pa_no++) {
|
||||
int keynum = 0;
|
||||
CData->curve_firstkey.push_back(keyno);
|
||||
|
||||
float curve_length = 0.0f;
|
||||
float3 pcKey;
|
||||
for(int step_no = 0; step_no < ren_step; step_no++) {
|
||||
float nco[3];
|
||||
b_psys.co_hair(b_ob, pa_no, step_no, nco);
|
||||
float3 cKey = make_float3(nco[0], nco[1], nco[2]);
|
||||
cKey = transform_point(&itfm, cKey);
|
||||
if(step_no > 0) {
|
||||
float step_length = len(cKey - pcKey);
|
||||
if(step_length == 0.0f)
|
||||
continue;
|
||||
|
||||
int pa_no = 0;
|
||||
if(!(b_part.child_type() == 0))
|
||||
pa_no = totparts;
|
||||
|
||||
int num_add = (totparts+totchild - pa_no);
|
||||
CData->curve_uv.reserve(CData->curve_uv.size() + num_add);
|
||||
|
||||
BL::ParticleSystem::particles_iterator b_pa;
|
||||
b_psys.particles.begin(b_pa);
|
||||
for(; pa_no < totparts+totchild; pa_no++) {
|
||||
/* Add UVs */
|
||||
BL::Mesh::tessface_uv_textures_iterator l;
|
||||
b_mesh->tessface_uv_textures.begin(l);
|
||||
|
||||
float3 uv = make_float3(0.0f, 0.0f, 0.0f);
|
||||
if(b_mesh->tessface_uv_textures.length())
|
||||
b_psys.uv_on_emitter(psmd, *b_pa, pa_no, uv_num, &uv.x);
|
||||
CData->curve_uv.push_back(uv);
|
||||
|
||||
if(pa_no < totparts && b_pa != b_psys.particles.end())
|
||||
++b_pa;
|
||||
}
|
||||
curve_length += step_length;
|
||||
}
|
||||
CData->curvekey_co.push_back(cKey);
|
||||
CData->curvekey_time.push_back(curve_length);
|
||||
pcKey = cKey;
|
||||
keynum++;
|
||||
}
|
||||
}
|
||||
keyno += keynum;
|
||||
|
||||
return true;
|
||||
CData->curve_keynum.push_back(keynum);
|
||||
CData->curve_length.push_back(curve_length);
|
||||
curvenum++;
|
||||
}
|
||||
}
|
||||
|
||||
bool ObtainCacheParticleVcol(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, ParticleCurveData *CData, bool background, int vcol_num)
|
||||
static void ObtainCacheParticleUV(Mesh * /*mesh*/, BL::Object /*b_ob*/, BL::Mesh b_mesh, BL::ParticleSystem b_psys, BL::ParticleSystemModifier b_psmd,
|
||||
ParticleCurveData *CData, bool background, int uv_num)
|
||||
{
|
||||
if(!(mesh && b_mesh && b_ob && CData))
|
||||
return false;
|
||||
BL::ParticleSettings b_part((const PointerRNA)b_psys.settings().ptr);
|
||||
int totparts = b_psys.particles.length();
|
||||
int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_part.draw_percentage() / 100.0f);
|
||||
int totcurves = totchild;
|
||||
|
||||
if(b_part.child_type() == 0)
|
||||
totcurves += totparts;
|
||||
|
||||
CData->curve_vcol.clear();
|
||||
if(totcurves == 0)
|
||||
return;
|
||||
|
||||
BL::Object::modifiers_iterator b_mod;
|
||||
for(b_ob->modifiers.begin(b_mod); b_mod != b_ob->modifiers.end(); ++b_mod) {
|
||||
if((b_mod->type() == b_mod->type_PARTICLE_SYSTEM) && (background ? b_mod->show_render() : b_mod->show_viewport())) {
|
||||
BL::ParticleSystemModifier psmd((const PointerRNA)b_mod->ptr);
|
||||
BL::ParticleSystem b_psys((const PointerRNA)psmd.particle_system().ptr);
|
||||
BL::ParticleSettings b_part((const PointerRNA)b_psys.settings().ptr);
|
||||
int pa_no = 0;
|
||||
if(!(b_part.child_type() == 0))
|
||||
pa_no = totparts;
|
||||
|
||||
if((b_part.render_type() == BL::ParticleSettings::render_type_PATH) && (b_part.type() == BL::ParticleSettings::type_HAIR)) {
|
||||
int totparts = b_psys.particles.length();
|
||||
int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_part.draw_percentage() / 100.0f);
|
||||
int totcurves = totchild;
|
||||
|
||||
if (b_part.child_type() == 0)
|
||||
totcurves += totparts;
|
||||
int num_add = (totparts+totchild - pa_no);
|
||||
CData->curve_uv.reserve(CData->curve_uv.size() + num_add);
|
||||
|
||||
if (totcurves == 0)
|
||||
BL::ParticleSystem::particles_iterator b_pa;
|
||||
b_psys.particles.begin(b_pa);
|
||||
for(; pa_no < totparts+totchild; pa_no++) {
|
||||
/* Add UVs */
|
||||
BL::Mesh::tessface_uv_textures_iterator l;
|
||||
b_mesh.tessface_uv_textures.begin(l);
|
||||
|
||||
float3 uv = make_float3(0.0f, 0.0f, 0.0f);
|
||||
if(b_mesh.tessface_uv_textures.length())
|
||||
b_psys.uv_on_emitter(b_psmd, *b_pa, pa_no, uv_num, &uv.x);
|
||||
CData->curve_uv.push_back(uv);
|
||||
|
||||
if(pa_no < totparts && b_pa != b_psys.particles.end())
|
||||
++b_pa;
|
||||
}
|
||||
}
|
||||
|
||||
static void ObtainCacheParticleVcol(Mesh * /*mesh*/, BL::Object /*b_ob*/, BL::Mesh b_mesh, BL::ParticleSystem b_psys, BL::ParticleSystemModifier b_psmd,
|
||||
ParticleCurveData *CData, bool background, int vcol_num)
|
||||
{
|
||||
BL::ParticleSettings b_part((const PointerRNA)b_psys.settings().ptr);
|
||||
int totparts = b_psys.particles.length();
|
||||
int totchild = background ? b_psys.child_particles.length() : (int)((float)b_psys.child_particles.length() * (float)b_part.draw_percentage() / 100.0f);
|
||||
int totcurves = totchild;
|
||||
|
||||
if(b_part.child_type() == 0)
|
||||
totcurves += totparts;
|
||||
|
||||
if(totcurves == 0)
|
||||
return;
|
||||
|
||||
int pa_no = 0;
|
||||
if(!(b_part.child_type() == 0))
|
||||
pa_no = totparts;
|
||||
|
||||
int num_add = (totparts+totchild - pa_no);
|
||||
CData->curve_vcol.reserve(CData->curve_vcol.size() + num_add);
|
||||
|
||||
BL::ParticleSystem::particles_iterator b_pa;
|
||||
b_psys.particles.begin(b_pa);
|
||||
for(; pa_no < totparts+totchild; pa_no++) {
|
||||
/* Add vertex colors */
|
||||
BL::Mesh::tessface_vertex_colors_iterator l;
|
||||
b_mesh.tessface_vertex_colors.begin(l);
|
||||
|
||||
float3 vcol = make_float3(0.0f, 0.0f, 0.0f);
|
||||
if(b_mesh.tessface_vertex_colors.length())
|
||||
b_psys.mcol_on_emitter(b_psmd, *b_pa, pa_no, vcol_num, &vcol.x);
|
||||
CData->curve_vcol.push_back(vcol);
|
||||
|
||||
if(pa_no < totparts && b_pa != b_psys.particles.end())
|
||||
++b_pa;
|
||||
}
|
||||
}
|
||||
|
||||
/* A little bit of templated code here to avoid much duplication for parent/child strands:
|
||||
* Most attributes are the same for both types, but some are handled slightly differently.
|
||||
* These attributes are handled by templated utility functions that automatically get selected by type.
|
||||
*/
|
||||
template <typename StrandsT>
|
||||
struct StrandsTraits;
|
||||
|
||||
template<>
|
||||
struct StrandsTraits<BL::Strands>
|
||||
{
|
||||
typedef BL::StrandsCurve curve_t;
|
||||
typedef BL::StrandsVertex vertex_t;
|
||||
|
||||
static float3 get_location(BL::Strands b_strands, int index)
|
||||
{
|
||||
float *co = (b_strands.has_motion_state())? b_strands.motion_state[index].location() : b_strands.vertices[index].location();
|
||||
return make_float3(co[0], co[1], co[2]);
|
||||
}
|
||||
static float3 get_uv(BL::Strands /*b_strands*/, int /*index*/, int /*uv_num*/)
|
||||
{
|
||||
return make_float3(0.0f, 0.0f, 0.0f);
|
||||
}
|
||||
static float3 get_vcol(BL::Strands /*b_strands*/, int /*index*/, int /*vcol_num*/)
|
||||
{
|
||||
return make_float3(0.0f, 0.0f, 0.0f);
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
struct StrandsTraits<BL::StrandsChildren>
|
||||
{
|
||||
typedef BL::StrandsChildCurve curve_t;
|
||||
typedef BL::StrandsChildVertex vertex_t;
|
||||
|
||||
static float3 get_location(BL::StrandsChildren b_strands, int index)
|
||||
{
|
||||
float *co = b_strands.vertices[index].location();
|
||||
return make_float3(co[0], co[1], co[2]);
|
||||
}
|
||||
static float3 get_uv(BL::StrandsChildren b_strands, int index, int uv_num)
|
||||
{
|
||||
if (uv_num < b_strands.num_curve_uv_layers()) {
|
||||
size_t offset = uv_num * b_strands.curves.length();
|
||||
float *uv = b_strands.curve_uvs[offset + index].uv();
|
||||
return make_float3(uv[0], uv[1], 0.0f);
|
||||
}
|
||||
else
|
||||
return make_float3(0.0f, 0.0f, 0.0f);
|
||||
}
|
||||
static float3 get_vcol(BL::StrandsChildren b_strands, int index, int vcol_num)
|
||||
{
|
||||
if (vcol_num < b_strands.num_curve_vcol_layers()) {
|
||||
size_t offset = vcol_num * b_strands.curves.length();
|
||||
float *vcol = b_strands.curve_vcols[offset + index].vcol();
|
||||
return make_float3(vcol[0], vcol[1], vcol[2]);
|
||||
}
|
||||
else
|
||||
return make_float3(0.0f, 0.0f, 0.0f);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename StrandsT>
|
||||
static bool ObtainCacheStrandsData(Mesh *mesh, BL::Scene /*b_scene*/, BL::Object /*b_parent*/, BL::DupliObject /*b_dupli_ob*/, BL::ParticleSystem b_psys, StrandsT b_strands, const Transform &/*itfm*/,
|
||||
ParticleCurveData *CData, bool /*background*/)
|
||||
{
|
||||
typedef StrandsTraits<StrandsT> traits;
|
||||
typedef typename traits::curve_t CurveT;
|
||||
|
||||
BL::ParticleSettings b_part((const PointerRNA)b_psys.settings().ptr);
|
||||
PointerRNA cpsys = RNA_pointer_get(&b_part.ptr, "cycles");
|
||||
|
||||
int mi = clamp(b_part.material()-1, 0, mesh->used_shaders.size()-1);
|
||||
int shader = mesh->used_shaders[mi];
|
||||
|
||||
int totcurves = b_strands.curves.length();
|
||||
int totvert = b_strands.vertices.length();
|
||||
|
||||
int keyno = CData->curvekey_co.size();
|
||||
int curvenum = CData->curve_keynum.size();
|
||||
|
||||
CData->psys_firstcurve.push_back(curvenum);
|
||||
CData->psys_curvenum.push_back(totcurves);
|
||||
CData->psys_shader.push_back(shader);
|
||||
|
||||
float radius = get_float(cpsys, "radius_scale") * 0.5f;
|
||||
|
||||
CData->psys_rootradius.push_back(radius * get_float(cpsys, "root_width"));
|
||||
CData->psys_tipradius.push_back(radius * get_float(cpsys, "tip_width"));
|
||||
CData->psys_shape.push_back(get_float(cpsys, "shape"));
|
||||
CData->psys_closetip.push_back(get_boolean(cpsys, "use_closetip"));
|
||||
|
||||
CData->curve_firstkey.reserve(CData->curve_firstkey.size() + totcurves);
|
||||
CData->curve_keynum.reserve(CData->curve_keynum.size() + totcurves);
|
||||
CData->curve_length.reserve(CData->curve_length.size() + totcurves);
|
||||
CData->curvekey_co.reserve(CData->curvekey_co.size() + totvert);
|
||||
CData->curvekey_time.reserve(CData->curvekey_time.size() + totvert);
|
||||
|
||||
int icurve = 0;
|
||||
int ivert = 0;
|
||||
for(; icurve < totcurves; ++icurve) {
|
||||
CurveT b_curve = b_strands.curves[icurve];
|
||||
int numverts = b_curve.size();
|
||||
int showverts = b_curve.render_size();
|
||||
int usedverts = 0;
|
||||
CData->curve_firstkey.push_back(keyno);
|
||||
|
||||
float curve_length = 0.0f;
|
||||
float3 pcKey;
|
||||
for(int cvert = 0; cvert < showverts; ++cvert) {
|
||||
float3 cKey = traits::get_location(b_strands, ivert + cvert);
|
||||
|
||||
if(cvert > 0) {
|
||||
float step_length = len(cKey - pcKey);
|
||||
if(step_length == 0.0f)
|
||||
continue;
|
||||
|
||||
int pa_no = 0;
|
||||
if(!(b_part.child_type() == 0))
|
||||
pa_no = totparts;
|
||||
|
||||
int num_add = (totparts+totchild - pa_no);
|
||||
CData->curve_vcol.reserve(CData->curve_vcol.size() + num_add);
|
||||
|
||||
BL::ParticleSystem::particles_iterator b_pa;
|
||||
b_psys.particles.begin(b_pa);
|
||||
for(; pa_no < totparts+totchild; pa_no++) {
|
||||
/* Add vertex colors */
|
||||
BL::Mesh::tessface_vertex_colors_iterator l;
|
||||
b_mesh->tessface_vertex_colors.begin(l);
|
||||
|
||||
float3 vcol = make_float3(0.0f, 0.0f, 0.0f);
|
||||
if(b_mesh->tessface_vertex_colors.length())
|
||||
b_psys.mcol_on_emitter(psmd, *b_pa, pa_no, vcol_num, &vcol.x);
|
||||
CData->curve_vcol.push_back(vcol);
|
||||
|
||||
if(pa_no < totparts && b_pa != b_psys.particles.end())
|
||||
++b_pa;
|
||||
}
|
||||
curve_length += step_length;
|
||||
}
|
||||
CData->curvekey_co.push_back(cKey);
|
||||
CData->curvekey_time.push_back(curve_length);
|
||||
pcKey = cKey;
|
||||
usedverts++;
|
||||
}
|
||||
}
|
||||
keyno += usedverts;
|
||||
ivert += numverts;
|
||||
|
||||
CData->curve_keynum.push_back(usedverts);
|
||||
CData->curve_length.push_back(curve_length);
|
||||
curvenum++;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void set_resolution(Mesh *mesh, BL::Mesh *b_mesh, BL::Object *b_ob, BL::Scene *scene, bool render)
|
||||
template <typename StrandsT>
|
||||
static bool ObtainCacheStrandsUV(Mesh * /*mesh*/, BL::Scene /*b_scene*/, BL::Object /*b_parent*/, BL::DupliObject /*b_dupli_ob*/, BL::ParticleSystem /*b_psys*/, StrandsT b_strands,
|
||||
ParticleCurveData *CData, bool /*background*/, int uv_num)
|
||||
{
|
||||
typedef StrandsTraits<StrandsT> traits;
|
||||
|
||||
// BL::ParticleSettings b_part((const PointerRNA)b_psys.settings().ptr);
|
||||
|
||||
int totcurves = b_strands.curves.length();
|
||||
|
||||
CData->curve_uv.reserve(CData->curve_uv.size() + totcurves);
|
||||
|
||||
int icurve = 0;
|
||||
for(; icurve < totcurves; ++icurve) {
|
||||
CData->curve_uv.push_back(traits::get_uv(b_strands, icurve, uv_num));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename StrandsT>
|
||||
static bool ObtainCacheStrandsVcol(Mesh * /*mesh*/, BL::Scene /*b_scene*/, BL::Object /*b_parent*/, BL::DupliObject /*b_dupli_ob*/, BL::ParticleSystem /*b_psys*/, StrandsT b_strands,
|
||||
ParticleCurveData *CData, bool /*background*/, int vcol_num)
|
||||
{
|
||||
typedef StrandsTraits<StrandsT> traits;
|
||||
|
||||
// BL::ParticleSettings b_part((const PointerRNA)b_psys.settings().ptr);
|
||||
|
||||
int totcurves = b_strands.curves.length();
|
||||
|
||||
CData->curve_vcol.reserve(CData->curve_vcol.size() + totcurves);
|
||||
|
||||
int icurve = 0;
|
||||
for(; icurve < totcurves; ++icurve) {
|
||||
CData->curve_vcol.push_back(traits::get_vcol(b_strands, icurve, vcol_num));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void set_resolution(BL::Object *b_ob, BL::Scene *scene, bool render)
|
||||
{
|
||||
BL::Object::modifiers_iterator b_mod;
|
||||
for(b_ob->modifiers.begin(b_mod); b_mod != b_ob->modifiers.end(); ++b_mod) {
|
||||
if ((b_mod->type() == b_mod->type_PARTICLE_SYSTEM) && ((b_mod->show_viewport()) || (b_mod->show_render()))) {
|
||||
if((b_mod->type() == b_mod->type_PARTICLE_SYSTEM) && ((b_mod->show_viewport()) || (b_mod->show_render()))) {
|
||||
BL::ParticleSystemModifier psmd((const PointerRNA)b_mod->ptr);
|
||||
BL::ParticleSystem b_psys((const PointerRNA)psmd.particle_system().ptr);
|
||||
b_psys.set_resolution(*scene, *b_ob, (render)? 2: 1);
|
||||
@@ -513,7 +636,7 @@ void ExportCurveTriangleGeometry(Mesh *mesh, ParticleCurveData *CData, int resol
|
||||
|
||||
ybasis = normalize(cross(xbasis, v2));
|
||||
|
||||
for (; subv <= 1; subv++) {
|
||||
for(; subv <= 1; subv++) {
|
||||
float3 ickey_loc = make_float3(0.0f,0.0f,0.0f);
|
||||
float time = 0.0f;
|
||||
|
||||
@@ -581,7 +704,7 @@ void ExportCurveSegments(Scene *scene, Mesh *mesh, ParticleCurveData *CData)
|
||||
}
|
||||
}
|
||||
|
||||
if (num_curves > 0) {
|
||||
if(num_curves > 0) {
|
||||
VLOG(1) << "Exporting curve segments for mesh " << mesh->name;
|
||||
}
|
||||
|
||||
@@ -621,7 +744,7 @@ void ExportCurveSegments(Scene *scene, Mesh *mesh, ParticleCurveData *CData)
|
||||
}
|
||||
|
||||
/* check allocation */
|
||||
if((mesh->curve_keys.size() != num_keys) || (mesh->curves.size() != num_curves)) {
|
||||
if((mesh->curve_keys.size() != num_keys) || (mesh->curves.size() != num_curves)) {
|
||||
VLOG(1) << "Allocation failed, clearing data";
|
||||
mesh->curve_keys.clear();
|
||||
mesh->curves.clear();
|
||||
@@ -629,7 +752,7 @@ void ExportCurveSegments(Scene *scene, Mesh *mesh, ParticleCurveData *CData)
|
||||
}
|
||||
}
|
||||
|
||||
static void ExportCurveSegmentsMotion(Scene *scene, Mesh *mesh, ParticleCurveData *CData, int time_index)
|
||||
static void ExportCurveSegmentsMotion(Mesh *mesh, ParticleCurveData *CData, int time_index)
|
||||
{
|
||||
VLOG(1) << "Exporting curve motion segments for mesh " << mesh->name
|
||||
<< ", time index " << time_index;
|
||||
@@ -705,7 +828,7 @@ static void ExportCurveSegmentsMotion(Scene *scene, Mesh *mesh, ParticleCurveDat
|
||||
}
|
||||
}
|
||||
|
||||
void ExportCurveTriangleUV(Mesh *mesh, ParticleCurveData *CData, int vert_offset, int resol, float3 *uvdata)
|
||||
void ExportCurveTriangleUV(ParticleCurveData *CData, int vert_offset, int resol, float3 *uvdata)
|
||||
{
|
||||
if(uvdata == NULL)
|
||||
return;
|
||||
@@ -750,7 +873,40 @@ void ExportCurveTriangleUV(Mesh *mesh, ParticleCurveData *CData, int vert_offset
|
||||
}
|
||||
}
|
||||
|
||||
void ExportCurveTriangleVcol(Mesh *mesh, ParticleCurveData *CData, int vert_offset, int resol, uchar4 *cdata)
|
||||
void ExportCurveUV(Mesh *mesh, ParticleCurveData *CData, ustring name, bool active_render, int primitive, int vert_offset, int resol)
|
||||
{
|
||||
AttributeStandard std = (active_render)? ATTR_STD_UV: ATTR_STD_NONE;
|
||||
Attribute *attr_uv;
|
||||
|
||||
if(primitive == CURVE_TRIANGLES) {
|
||||
if(active_render)
|
||||
attr_uv = mesh->attributes.add(std, name);
|
||||
else
|
||||
attr_uv = mesh->attributes.add(name, TypeDesc::TypePoint, ATTR_ELEMENT_CORNER);
|
||||
|
||||
float3 *uv = attr_uv->data_float3();
|
||||
|
||||
ExportCurveTriangleUV(CData, vert_offset, resol, uv);
|
||||
}
|
||||
else {
|
||||
if(active_render)
|
||||
attr_uv = mesh->curve_attributes.add(std, name);
|
||||
else
|
||||
attr_uv = mesh->curve_attributes.add(name, TypeDesc::TypePoint, ATTR_ELEMENT_CURVE);
|
||||
|
||||
float3 *uv = attr_uv->data_float3();
|
||||
|
||||
if(uv) {
|
||||
size_t i = 0;
|
||||
|
||||
for(size_t curve = 0; curve < CData->curve_uv.size(); curve++)
|
||||
if(!(CData->curve_keynum[curve] <= 1 || CData->curve_length[curve] == 0.0f))
|
||||
uv[i++] = CData->curve_uv[curve];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ExportCurveTriangleVcol(ParticleCurveData *CData, int vert_offset, int resol, uchar4 *cdata)
|
||||
{
|
||||
if(cdata == NULL)
|
||||
return;
|
||||
@@ -782,6 +938,31 @@ void ExportCurveTriangleVcol(Mesh *mesh, ParticleCurveData *CData, int vert_offs
|
||||
}
|
||||
}
|
||||
|
||||
void ExportCurveVcol(Mesh *mesh, ParticleCurveData *CData, ustring name, int primitive, int vert_offset, int resol)
|
||||
{
|
||||
if(primitive == CURVE_TRIANGLES) {
|
||||
Attribute *attr_vcol = mesh->attributes.add(name, TypeDesc::TypeColor, ATTR_ELEMENT_CORNER_BYTE);
|
||||
|
||||
uchar4 *cdata = attr_vcol->data_uchar4();
|
||||
|
||||
ExportCurveTriangleVcol(CData, vert_offset, resol, cdata);
|
||||
}
|
||||
else {
|
||||
Attribute *attr_vcol = mesh->curve_attributes.add(name, TypeDesc::TypeColor, ATTR_ELEMENT_CURVE);
|
||||
|
||||
float3 *fdata = attr_vcol->data_float3();
|
||||
|
||||
if(fdata) {
|
||||
size_t i = 0;
|
||||
|
||||
for(size_t curve = 0; curve < CData->curve_vcol.size(); curve++)
|
||||
if(!(CData->curve_keynum[curve] <= 1 || CData->curve_length[curve] == 0.0f))
|
||||
fdata[i++] = color_srgb_to_scene_linear(CData->curve_vcol[curve]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Hair Curve Sync */
|
||||
|
||||
void BlenderSync::sync_curve_settings()
|
||||
@@ -856,8 +1037,61 @@ void BlenderSync::sync_curve_settings()
|
||||
curve_system_manager->tag_update(scene);
|
||||
}
|
||||
|
||||
void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool motion, int time_index)
|
||||
struct CurvesPSysData {
|
||||
CurvesPSysData(BL::ParticleSystemModifier b_psmd=PointerRNA_NULL, BL::ParticleSystem b_psys=PointerRNA_NULL,
|
||||
BL::Strands b_strands=PointerRNA_NULL, BL::StrandsChildren b_strands_children=PointerRNA_NULL) :
|
||||
b_psmd(b_psmd), b_psys(b_psys), b_strands(b_strands), b_strands_children(b_strands_children)
|
||||
{}
|
||||
|
||||
BL::ParticleSystemModifier b_psmd;
|
||||
BL::ParticleSystem b_psys;
|
||||
BL::Strands b_strands;
|
||||
BL::StrandsChildren b_strands_children;
|
||||
};
|
||||
|
||||
static void curves_get_psys_data(std::vector<CurvesPSysData> &b_psys_list, BL::Scene b_scene, BL::Object b_ob, BL::Object b_parent, BL::DupliObject b_dupli_ob, bool preview)
|
||||
{
|
||||
BL::Object::modifiers_iterator b_mod;
|
||||
for(b_ob.modifiers.begin(b_mod); b_mod != b_ob.modifiers.end(); ++b_mod) {
|
||||
if((b_mod->type() == b_mod->type_PARTICLE_SYSTEM) && (preview ? b_mod->show_viewport() : b_mod->show_render())) {
|
||||
BL::ParticleSystemModifier b_psmd((const PointerRNA)b_mod->ptr);
|
||||
BL::ParticleSystem b_psys((const PointerRNA)b_psmd.particle_system().ptr);
|
||||
BL::ParticleSettings b_part((const PointerRNA)b_psys.settings().ptr);
|
||||
|
||||
if((b_part.render_type() == BL::ParticleSettings::render_type_PATH) && (b_part.type() == BL::ParticleSettings::type_HAIR)) {
|
||||
int settings = preview ? 1 : 2;
|
||||
|
||||
BL::StrandsChildren b_strands_children = PointerRNA_NULL;
|
||||
BL::Strands b_strands = PointerRNA_NULL;
|
||||
|
||||
if (b_dupli_ob && b_parent) {
|
||||
b_strands_children = b_dupli_ob.strands_children_new(b_scene, b_parent, b_psys, settings);
|
||||
if (!b_strands_children)
|
||||
b_strands = b_dupli_ob.strands_new(b_scene, b_parent, b_psys, settings);
|
||||
}
|
||||
|
||||
b_psys_list.push_back(CurvesPSysData(b_psmd, b_psys, b_strands, b_strands_children));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void curves_free_psys_data(std::vector<CurvesPSysData> &b_psys_list, BL::DupliObject b_dupli_ob)
|
||||
{
|
||||
/* free temporary strands data */
|
||||
for (int i = 0; i < b_psys_list.size(); ++i) {
|
||||
CurvesPSysData &psys_data = b_psys_list[i];
|
||||
if (psys_data.b_strands)
|
||||
b_dupli_ob.strands_free(psys_data.b_strands);
|
||||
if (psys_data.b_strands_children)
|
||||
b_dupli_ob.strands_children_free(psys_data.b_strands_children);
|
||||
}
|
||||
}
|
||||
|
||||
void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_parent, bool motion, int time_index, BL::DupliObject b_dupli_ob)
|
||||
{
|
||||
BL::Object b_ob = (b_dupli_ob ? b_dupli_ob.object() : b_parent);
|
||||
|
||||
if(!motion) {
|
||||
/* Clear stored curve data */
|
||||
mesh->curve_keys.clear();
|
||||
@@ -886,29 +1120,48 @@ void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool
|
||||
ParticleCurveData CData;
|
||||
|
||||
if(!preview)
|
||||
set_resolution(mesh, &b_mesh, &b_ob, &b_scene, true);
|
||||
set_resolution(&b_ob, &b_scene, true);
|
||||
|
||||
ObtainCacheParticleData(mesh, &b_mesh, &b_ob, &CData, !preview);
|
||||
Transform tfm = get_transform(b_ob.matrix_world());
|
||||
Transform itfm = transform_quick_inverse(tfm);
|
||||
|
||||
/* obtain camera parameters */
|
||||
float3 RotCam;
|
||||
Camera *camera = scene->camera;
|
||||
if(camera->type == CAMERA_ORTHOGRAPHIC) {
|
||||
Transform &ctfm = camera->matrix;
|
||||
RotCam = -make_float3(ctfm.x.z, ctfm.y.z, ctfm.z.z);
|
||||
}
|
||||
else {
|
||||
Transform &ctfm = camera->matrix;
|
||||
RotCam = transform_point(&itfm, make_float3(ctfm.x.w, ctfm.y.w, ctfm.z.w));
|
||||
}
|
||||
bool is_ortho_camera = camera->type == CAMERA_ORTHOGRAPHIC;
|
||||
|
||||
std::vector<CurvesPSysData> b_psys_list;
|
||||
curves_get_psys_data(b_psys_list, b_scene, b_ob, b_parent, b_dupli_ob, preview);
|
||||
|
||||
for (int i = 0; i < b_psys_list.size(); ++i) {
|
||||
CurvesPSysData &psys_data = b_psys_list[i];
|
||||
if (psys_data.b_strands_children)
|
||||
/* use child strands cache */
|
||||
ObtainCacheStrandsData(mesh, b_scene, b_parent, b_dupli_ob, psys_data.b_psys, psys_data.b_strands_children,
|
||||
itfm, &CData, !preview);
|
||||
else if (psys_data.b_strands)
|
||||
/* use parent strands cache */
|
||||
ObtainCacheStrandsData(mesh, b_scene, b_parent, b_dupli_ob, psys_data.b_psys, psys_data.b_strands,
|
||||
itfm, &CData, !preview);
|
||||
else {
|
||||
/* use object data */
|
||||
ObtainCacheParticleData(mesh, b_ob, psys_data.b_psys,
|
||||
itfm, &CData, !preview);
|
||||
}
|
||||
}
|
||||
|
||||
/* add hair geometry to mesh */
|
||||
if(primitive == CURVE_TRIANGLES) {
|
||||
if(triangle_method == CURVE_CAMERA_TRIANGLES) {
|
||||
/* obtain camera parameters */
|
||||
float3 RotCam;
|
||||
Camera *camera = scene->camera;
|
||||
Transform &ctfm = camera->matrix;
|
||||
if(camera->type == CAMERA_ORTHOGRAPHIC) {
|
||||
RotCam = -make_float3(ctfm.x.z, ctfm.y.z, ctfm.z.z);
|
||||
}
|
||||
else {
|
||||
Transform tfm = get_transform(b_ob.matrix_world());
|
||||
Transform itfm = transform_quick_inverse(tfm);
|
||||
RotCam = transform_point(&itfm, make_float3(ctfm.x.w,
|
||||
ctfm.y.w,
|
||||
ctfm.z.w));
|
||||
}
|
||||
bool is_ortho = camera->type == CAMERA_ORTHOGRAPHIC;
|
||||
ExportCurveTrianglePlanes(mesh, &CData, RotCam, is_ortho);
|
||||
ExportCurveTrianglePlanes(mesh, &CData, RotCam, is_ortho_camera);
|
||||
}
|
||||
else {
|
||||
ExportCurveTriangleGeometry(mesh, &CData, resolution);
|
||||
@@ -917,7 +1170,7 @@ void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool
|
||||
}
|
||||
else {
|
||||
if(motion)
|
||||
ExportCurveSegmentsMotion(scene, mesh, &CData, time_index);
|
||||
ExportCurveSegmentsMotion(mesh, &CData, time_index);
|
||||
else
|
||||
ExportCurveSegments(scene, mesh, &CData);
|
||||
}
|
||||
@@ -955,33 +1208,31 @@ void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool
|
||||
int vcol_num = 0;
|
||||
|
||||
for(b_mesh.tessface_vertex_colors.begin(l); l != b_mesh.tessface_vertex_colors.end(); ++l, vcol_num++) {
|
||||
ustring name = ustring(l->name().c_str());
|
||||
|
||||
if(!mesh->need_attribute(scene, ustring(l->name().c_str())))
|
||||
continue;
|
||||
|
||||
ObtainCacheParticleVcol(mesh, &b_mesh, &b_ob, &CData, !preview, vcol_num);
|
||||
CData.curve_vcol.clear();
|
||||
|
||||
if(primitive == CURVE_TRIANGLES) {
|
||||
Attribute *attr_vcol = mesh->attributes.add(
|
||||
ustring(l->name().c_str()), TypeDesc::TypeColor, ATTR_ELEMENT_CORNER_BYTE);
|
||||
|
||||
uchar4 *cdata = attr_vcol->data_uchar4();
|
||||
|
||||
ExportCurveTriangleVcol(mesh, &CData, tri_num * 3, used_res, cdata);
|
||||
}
|
||||
else {
|
||||
Attribute *attr_vcol = mesh->curve_attributes.add(
|
||||
ustring(l->name().c_str()), TypeDesc::TypeColor, ATTR_ELEMENT_CURVE);
|
||||
|
||||
float3 *fdata = attr_vcol->data_float3();
|
||||
|
||||
if(fdata) {
|
||||
size_t i = 0;
|
||||
|
||||
for(size_t curve = 0; curve < CData.curve_vcol.size(); curve++)
|
||||
if(!(CData.curve_keynum[curve] <= 1 || CData.curve_length[curve] == 0.0f))
|
||||
fdata[i++] = color_srgb_to_scene_linear(CData.curve_vcol[curve]);
|
||||
for (int i = 0; i < b_psys_list.size(); ++i) {
|
||||
CurvesPSysData &psys_data = b_psys_list[i];
|
||||
if (psys_data.b_strands_children)
|
||||
/* use child strands cache */
|
||||
ObtainCacheStrandsVcol(mesh, b_scene, b_parent, b_dupli_ob, psys_data.b_psys, psys_data.b_strands_children,
|
||||
&CData, !preview, vcol_num);
|
||||
else if (psys_data.b_strands)
|
||||
/* use parent strands cache */
|
||||
ObtainCacheStrandsVcol(mesh, b_scene, b_parent, b_dupli_ob, psys_data.b_psys, psys_data.b_strands,
|
||||
&CData, !preview, vcol_num);
|
||||
else {
|
||||
/* use object data */
|
||||
ObtainCacheParticleVcol(mesh, b_ob, b_mesh, psys_data.b_psys, psys_data.b_psmd,
|
||||
&CData, !preview, vcol_num);
|
||||
}
|
||||
}
|
||||
|
||||
ExportCurveVcol(mesh, &CData, name, primitive, tri_num * 3, used_res);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -992,47 +1243,39 @@ void BlenderSync::sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool
|
||||
|
||||
for(b_mesh.tessface_uv_textures.begin(l); l != b_mesh.tessface_uv_textures.end(); ++l, uv_num++) {
|
||||
bool active_render = l->active_render();
|
||||
AttributeStandard std = (active_render)? ATTR_STD_UV: ATTR_STD_NONE;
|
||||
ustring name = ustring(l->name().c_str());
|
||||
|
||||
/* UV map */
|
||||
if(mesh->need_attribute(scene, name) || mesh->need_attribute(scene, std)) {
|
||||
Attribute *attr_uv;
|
||||
|
||||
ObtainCacheParticleUV(mesh, &b_mesh, &b_ob, &CData, !preview, uv_num);
|
||||
|
||||
if(primitive == CURVE_TRIANGLES) {
|
||||
if(active_render)
|
||||
attr_uv = mesh->attributes.add(std, name);
|
||||
else
|
||||
attr_uv = mesh->attributes.add(name, TypeDesc::TypePoint, ATTR_ELEMENT_CORNER);
|
||||
|
||||
float3 *uv = attr_uv->data_float3();
|
||||
|
||||
ExportCurveTriangleUV(mesh, &CData, tri_num * 3, used_res, uv);
|
||||
}
|
||||
if(!(mesh->need_attribute(scene, name) || (active_render && mesh->need_attribute(scene, ATTR_STD_UV))))
|
||||
continue;
|
||||
|
||||
CData.curve_uv.clear();
|
||||
|
||||
for (int i = 0; i < b_psys_list.size(); ++i) {
|
||||
CurvesPSysData &psys_data = b_psys_list[i];
|
||||
if (psys_data.b_strands_children)
|
||||
/* use child strands cache */
|
||||
ObtainCacheStrandsUV(mesh, b_scene, b_parent, b_dupli_ob, psys_data.b_psys, psys_data.b_strands_children,
|
||||
&CData, !preview, uv_num);
|
||||
else if (psys_data.b_strands)
|
||||
/* use parent strands cache */
|
||||
ObtainCacheStrandsUV(mesh, b_scene, b_parent, b_dupli_ob, psys_data.b_psys, psys_data.b_strands,
|
||||
&CData, !preview, uv_num);
|
||||
else {
|
||||
if(active_render)
|
||||
attr_uv = mesh->curve_attributes.add(std, name);
|
||||
else
|
||||
attr_uv = mesh->curve_attributes.add(name, TypeDesc::TypePoint, ATTR_ELEMENT_CURVE);
|
||||
|
||||
float3 *uv = attr_uv->data_float3();
|
||||
|
||||
if(uv) {
|
||||
size_t i = 0;
|
||||
|
||||
for(size_t curve = 0; curve < CData.curve_uv.size(); curve++)
|
||||
if(!(CData.curve_keynum[curve] <= 1 || CData.curve_length[curve] == 0.0f))
|
||||
uv[i++] = CData.curve_uv[curve];
|
||||
}
|
||||
/* use object data */
|
||||
ObtainCacheParticleUV(mesh, b_ob, b_mesh, psys_data.b_psys, psys_data.b_psmd,
|
||||
&CData, !preview, uv_num);
|
||||
}
|
||||
}
|
||||
|
||||
ExportCurveUV(mesh, &CData, name, active_render, primitive, tri_num * 3, used_res);
|
||||
}
|
||||
}
|
||||
|
||||
curves_free_psys_data(b_psys_list, b_dupli_ob);
|
||||
|
||||
if(!preview)
|
||||
set_resolution(mesh, &b_mesh, &b_ob, &b_scene, false);
|
||||
set_resolution(&b_ob, &b_scene, false);
|
||||
|
||||
mesh->compute_bounds();
|
||||
}
|
||||
|
@@ -229,7 +229,13 @@ static void mikk_compute_tangents(BL::Mesh b_mesh, BL::MeshTextureFaceLayer *b_l
|
||||
|
||||
/* Create Volume Attribute */
|
||||
|
||||
static void create_mesh_volume_attribute(BL::Object b_ob, Mesh *mesh, ImageManager *image_manager, AttributeStandard std, float frame)
|
||||
static void create_mesh_volume_attribute(BL::Object b_ob,
|
||||
Mesh *mesh,
|
||||
ImageManager *image_manager,
|
||||
AttributeStandard std,
|
||||
float frame,
|
||||
AttributeStandard special_std = ATTR_STD_NONE,
|
||||
bool from_alpha = false)
|
||||
{
|
||||
BL::SmokeDomainSettings b_domain = object_smoke_domain_find(b_ob);
|
||||
|
||||
@@ -240,17 +246,35 @@ static void create_mesh_volume_attribute(BL::Object b_ob, Mesh *mesh, ImageManag
|
||||
VoxelAttribute *volume_data = attr->data_voxel();
|
||||
bool is_float, is_linear;
|
||||
bool animated = false;
|
||||
AttributeStandard data_attr = (special_std == ATTR_STD_NONE) ? std : special_std;
|
||||
|
||||
volume_data->manager = image_manager;
|
||||
volume_data->slot = image_manager->add_image(Attribute::standard_name(std),
|
||||
volume_data->slot = image_manager->add_image(Attribute::standard_name(data_attr),
|
||||
b_ob.ptr.data, animated, frame, is_float, is_linear, INTERPOLATION_LINEAR, true);
|
||||
volume_data->from_alpha = from_alpha;
|
||||
}
|
||||
|
||||
static void create_mesh_volume_attributes(Scene *scene, BL::Object b_ob, Mesh *mesh, float frame)
|
||||
{
|
||||
/* for smoke volume rendering */
|
||||
if(mesh->need_attribute(scene, ATTR_STD_VOLUME_DENSITY))
|
||||
create_mesh_volume_attribute(b_ob, mesh, scene->image_manager, ATTR_STD_VOLUME_DENSITY, frame);
|
||||
if(mesh->need_attribute(scene, ATTR_STD_VOLUME_DENSITY)) {
|
||||
/* Special case: we re-map density to A channel of Color texture
|
||||
* if both attributes are requested.
|
||||
*/
|
||||
AttributeStandard special_std = ATTR_STD_VOLUME_DENSITY;
|
||||
bool from_alpha = false;
|
||||
if(mesh->need_attribute(scene, ATTR_STD_VOLUME_COLOR)) {
|
||||
special_std = ATTR_STD_VOLUME_COLOR;
|
||||
from_alpha = true;
|
||||
}
|
||||
create_mesh_volume_attribute(b_ob,
|
||||
mesh,
|
||||
scene->image_manager,
|
||||
ATTR_STD_VOLUME_DENSITY,
|
||||
frame,
|
||||
special_std,
|
||||
from_alpha);
|
||||
}
|
||||
if(mesh->need_attribute(scene, ATTR_STD_VOLUME_COLOR))
|
||||
create_mesh_volume_attribute(b_ob, mesh, scene->image_manager, ATTR_STD_VOLUME_COLOR, frame);
|
||||
if(mesh->need_attribute(scene, ATTR_STD_VOLUME_FLAME))
|
||||
@@ -302,7 +326,7 @@ static void attr_create_uv_map(Scene *scene,
|
||||
BL::Mesh b_mesh,
|
||||
const vector<int>& nverts)
|
||||
{
|
||||
if (b_mesh.tessface_uv_textures.length() != 0) {
|
||||
if(b_mesh.tessface_uv_textures.length() != 0) {
|
||||
BL::Mesh::tessface_uv_textures_iterator l;
|
||||
|
||||
for(b_mesh.tessface_uv_textures.begin(l); l != b_mesh.tessface_uv_textures.end(); ++l) {
|
||||
@@ -324,15 +348,15 @@ static void attr_create_uv_map(Scene *scene,
|
||||
size_t i = 0;
|
||||
|
||||
for(l->data.begin(t); t != l->data.end(); ++t, ++i) {
|
||||
fdata[0] = get_float3(t->uv1());
|
||||
fdata[1] = get_float3(t->uv2());
|
||||
fdata[2] = get_float3(t->uv3());
|
||||
fdata[0] = get_float3(t->uv1());
|
||||
fdata[1] = get_float3(t->uv2());
|
||||
fdata[2] = get_float3(t->uv3());
|
||||
fdata += 3;
|
||||
|
||||
if(nverts[i] == 4) {
|
||||
fdata[0] = get_float3(t->uv1());
|
||||
fdata[1] = get_float3(t->uv3());
|
||||
fdata[2] = get_float3(t->uv4());
|
||||
fdata[0] = get_float3(t->uv1());
|
||||
fdata[1] = get_float3(t->uv3());
|
||||
fdata[2] = get_float3(t->uv4());
|
||||
fdata += 3;
|
||||
}
|
||||
}
|
||||
@@ -634,8 +658,10 @@ static void create_subd_mesh(Scene *scene, Mesh *mesh, BL::Mesh b_mesh, PointerR
|
||||
|
||||
/* Sync */
|
||||
|
||||
Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated, bool hide_tris)
|
||||
Mesh *BlenderSync::sync_mesh(BL::Object b_parent, bool object_updated, bool hide_tris, BL::DupliObject b_dupli_ob)
|
||||
{
|
||||
BL::Object b_ob = (b_dupli_ob ? b_dupli_ob.object() : b_parent);
|
||||
|
||||
/* When viewport display is not needed during render we can force some
|
||||
* caches to be releases from blender side in order to reduce peak memory
|
||||
* footprint during synchronization process.
|
||||
@@ -646,7 +672,6 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated, bool hide_tri
|
||||
|
||||
/* test if we can instance or if the object is modified */
|
||||
BL::ID b_ob_data = b_ob.data();
|
||||
BL::ID key = (BKE_object_is_modified(b_ob))? b_ob: b_ob_data;
|
||||
BL::Material material_override = render_layer.material_override;
|
||||
|
||||
/* find shader indices */
|
||||
@@ -668,16 +693,39 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated, bool hide_tri
|
||||
}
|
||||
|
||||
/* test if we need to sync */
|
||||
bool use_mesh_geometry = render_layer.use_surfaces || render_layer.use_hair;
|
||||
int requested_geometry_flags = Mesh::GEOMETRY_NONE;
|
||||
if(render_layer.use_surfaces) {
|
||||
requested_geometry_flags |= Mesh::GEOMETRY_TRIANGLES;
|
||||
}
|
||||
if(render_layer.use_hair) {
|
||||
requested_geometry_flags |= Mesh::GEOMETRY_CURVES;
|
||||
}
|
||||
Mesh *mesh;
|
||||
|
||||
if(!mesh_map.sync(&mesh, key)) {
|
||||
bool need_update;
|
||||
BL::CacheLibrary b_cachelib = b_parent.cache_library();
|
||||
bool use_dupli_override = b_dupli_ob && b_cachelib &&
|
||||
(b_cachelib.source_mode() == BL::CacheLibrary::source_mode_CACHE ||
|
||||
b_cachelib.display_mode() == BL::CacheLibrary::display_mode_RESULT);
|
||||
if (use_dupli_override) {
|
||||
/* if a dupli override (cached data) is used, identify the mesh by object and parent together,
|
||||
* so that individual per-dupli overrides are possible.
|
||||
*/
|
||||
MeshKey key = MeshKey(b_parent, b_ob);
|
||||
need_update = mesh_map.sync(&mesh, b_ob, b_parent, key);
|
||||
}
|
||||
else {
|
||||
BL::ID key = (BKE_object_is_modified(b_ob))? b_ob: b_ob_data;
|
||||
need_update = mesh_map.sync(&mesh, key);
|
||||
}
|
||||
|
||||
if(!need_update) {
|
||||
/* if transform was applied to mesh, need full update */
|
||||
if(object_updated && mesh->transform_applied);
|
||||
/* test if shaders changed, these can be object level so mesh
|
||||
* does not get tagged for recalc */
|
||||
else if(mesh->used_shaders != used_shaders);
|
||||
else if(use_mesh_geometry != mesh->geometry_synced);
|
||||
else if(requested_geometry_flags != mesh->geometry_flags);
|
||||
else {
|
||||
/* even if not tagged for recalc, we may need to sync anyway
|
||||
* because the shader needs different mesh attributes */
|
||||
@@ -711,7 +759,7 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated, bool hide_tri
|
||||
mesh->used_shaders = used_shaders;
|
||||
mesh->name = ustring(b_ob_data.name().c_str());
|
||||
|
||||
if(use_mesh_geometry) {
|
||||
if(requested_geometry_flags != Mesh::GEOMETRY_NONE) {
|
||||
/* mesh objects does have special handle in the dependency graph,
|
||||
* they're ensured to have properly updated.
|
||||
*
|
||||
@@ -722,7 +770,9 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated, bool hide_tri
|
||||
b_ob.update_from_editmode();
|
||||
|
||||
bool need_undeformed = mesh->need_attribute(scene, ATTR_STD_GENERATED);
|
||||
BL::Mesh b_mesh = object_to_mesh(b_data, b_ob, b_scene, true, !preview, need_undeformed);
|
||||
BL::Mesh b_mesh = (use_dupli_override)?
|
||||
dupli_to_mesh(b_data, b_scene, b_parent, b_dupli_ob, !preview, need_undeformed):
|
||||
object_to_mesh(b_data, b_ob, b_scene, true, !preview, need_undeformed);
|
||||
|
||||
if(b_mesh) {
|
||||
if(render_layer.use_surfaces && !hide_tris) {
|
||||
@@ -735,17 +785,17 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated, bool hide_tri
|
||||
}
|
||||
|
||||
if(render_layer.use_hair)
|
||||
sync_curves(mesh, b_mesh, b_ob, false);
|
||||
sync_curves(mesh, b_mesh, b_parent, false, 0, b_dupli_ob);
|
||||
|
||||
if(can_free_caches) {
|
||||
b_ob.cache_release();
|
||||
b_ob.cache_release(false);
|
||||
}
|
||||
|
||||
/* free derived mesh */
|
||||
b_data.meshes.remove(b_mesh);
|
||||
}
|
||||
mesh->geometry_synced = true;
|
||||
}
|
||||
mesh->geometry_flags = requested_geometry_flags;
|
||||
|
||||
/* displacement method */
|
||||
if(cmesh.data) {
|
||||
@@ -781,8 +831,9 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated, bool hide_tri
|
||||
return mesh;
|
||||
}
|
||||
|
||||
void BlenderSync::sync_mesh_motion(BL::Object b_ob, Object *object, float motion_time)
|
||||
void BlenderSync::sync_mesh_motion(BL::Object b_parent, Object *object, float motion_time, BL::DupliObject b_dupli_ob)
|
||||
{
|
||||
BL::Object b_ob = (b_dupli_ob ? b_dupli_ob.object() : b_parent);
|
||||
/* ensure we only sync instanced meshes once */
|
||||
Mesh *mesh = object->mesh;
|
||||
|
||||
@@ -841,7 +892,9 @@ void BlenderSync::sync_mesh_motion(BL::Object b_ob, Object *object, float motion
|
||||
|
||||
if(ccl::BKE_object_is_deform_modified(b_ob, b_scene, preview)) {
|
||||
/* get derived mesh */
|
||||
b_mesh = object_to_mesh(b_data, b_ob, b_scene, true, !preview, false);
|
||||
b_mesh = (b_dupli_ob && b_parent)?
|
||||
dupli_to_mesh(b_data, b_scene, b_parent, b_dupli_ob, !preview, false):
|
||||
object_to_mesh(b_data, b_ob, b_scene, true, !preview, false);
|
||||
}
|
||||
|
||||
if(!b_mesh) {
|
||||
@@ -931,7 +984,7 @@ void BlenderSync::sync_mesh_motion(BL::Object b_ob, Object *object, float motion
|
||||
|
||||
/* hair motion */
|
||||
if(numkeys)
|
||||
sync_curves(mesh, b_mesh, b_ob, true, time_index);
|
||||
sync_curves(mesh, b_mesh, b_parent, true, time_index, b_dupli_ob);
|
||||
|
||||
/* free derived mesh */
|
||||
b_data.meshes.remove(b_mesh);
|
||||
|
@@ -90,14 +90,17 @@ static uint object_ray_visibility(BL::Object b_ob)
|
||||
|
||||
/* Light */
|
||||
|
||||
void BlenderSync::sync_light(BL::Object b_parent, int persistent_id[OBJECT_PERSISTENT_ID_SIZE], BL::Object b_ob, Transform& tfm)
|
||||
void BlenderSync::sync_light(BL::Object b_parent, int persistent_id[OBJECT_PERSISTENT_ID_SIZE], BL::Object b_ob, Transform& tfm, bool *use_portal)
|
||||
{
|
||||
/* test if we need to sync */
|
||||
Light *light;
|
||||
ObjectKey key(b_parent, persistent_id, b_ob);
|
||||
|
||||
if(!light_map.sync(&light, b_ob, b_parent, key))
|
||||
if(!light_map.sync(&light, b_ob, b_parent, key)) {
|
||||
if(light->is_portal)
|
||||
*use_portal = true;
|
||||
return;
|
||||
}
|
||||
|
||||
BL::Lamp b_lamp(b_ob.data());
|
||||
|
||||
@@ -171,6 +174,14 @@ void BlenderSync::sync_light(BL::Object b_parent, int persistent_id[OBJECT_PERSI
|
||||
|
||||
light->max_bounces = get_int(clamp, "max_bounces");
|
||||
|
||||
if(light->type == LIGHT_AREA)
|
||||
light->is_portal = get_boolean(clamp, "is_portal");
|
||||
else
|
||||
light->is_portal = false;
|
||||
|
||||
if(light->is_portal)
|
||||
*use_portal = true;
|
||||
|
||||
/* visibility */
|
||||
uint visibility = object_ray_visibility(b_ob);
|
||||
light->use_diffuse = (visibility & PATH_RAY_DIFFUSE) != 0;
|
||||
@@ -182,7 +193,7 @@ void BlenderSync::sync_light(BL::Object b_parent, int persistent_id[OBJECT_PERSI
|
||||
light->tag_update(scene);
|
||||
}
|
||||
|
||||
void BlenderSync::sync_background_light()
|
||||
void BlenderSync::sync_background_light(bool use_portal)
|
||||
{
|
||||
BL::World b_world = b_scene.world();
|
||||
|
||||
@@ -191,19 +202,20 @@ void BlenderSync::sync_background_light()
|
||||
PointerRNA cworld = RNA_pointer_get(&b_world.ptr, "cycles");
|
||||
bool sample_as_light = get_boolean(cworld, "sample_as_light");
|
||||
|
||||
if(sample_as_light) {
|
||||
if(sample_as_light || use_portal) {
|
||||
/* test if we need to sync */
|
||||
Light *light;
|
||||
ObjectKey key(b_world, 0, b_world);
|
||||
|
||||
if(light_map.sync(&light, b_world, b_world, key) ||
|
||||
world_recalc ||
|
||||
b_world.ptr.data != world_map)
|
||||
world_recalc ||
|
||||
b_world.ptr.data != world_map)
|
||||
{
|
||||
light->type = LIGHT_BACKGROUND;
|
||||
light->map_resolution = get_int(cworld, "sample_map_resolution");
|
||||
light->shader = scene->default_background;
|
||||
|
||||
light->use_mis = sample_as_light;
|
||||
|
||||
int samples = get_int(cworld, "samples");
|
||||
if(get_boolean(cscene, "use_square_samples"))
|
||||
light->samples = samples * samples;
|
||||
@@ -222,8 +234,53 @@ void BlenderSync::sync_background_light()
|
||||
|
||||
/* Object */
|
||||
|
||||
Object *BlenderSync::sync_object(BL::Object b_parent, int persistent_id[OBJECT_PERSISTENT_ID_SIZE], BL::DupliObject b_dupli_ob,
|
||||
Transform& tfm, uint layer_flag, float motion_time, bool hide_tris)
|
||||
static bool object_boundbox_clip(Scene *scene,
|
||||
BL::Object b_ob,
|
||||
Transform& tfm,
|
||||
float margin)
|
||||
{
|
||||
Camera *cam = scene->camera;
|
||||
Transform& worldtondc = cam->worldtondc;
|
||||
BL::Array<float, 24> boundbox = b_ob.bound_box();
|
||||
float3 bb_min = make_float3(FLT_MAX, FLT_MAX, FLT_MAX),
|
||||
bb_max = make_float3(-FLT_MAX, -FLT_MAX, -FLT_MAX);
|
||||
bool all_behind = true;
|
||||
for(int i = 0; i < 8; ++i) {
|
||||
float3 p = make_float3(boundbox[3 * i + 0],
|
||||
boundbox[3 * i + 1],
|
||||
boundbox[3 * i + 2]);
|
||||
p = transform_point(&tfm, p);
|
||||
p = transform_point(&worldtondc, p);
|
||||
if(p.z >= -margin) {
|
||||
all_behind = false;
|
||||
}
|
||||
p /= p.z;
|
||||
bb_min = min(bb_min, p);
|
||||
bb_max = max(bb_max, p);
|
||||
}
|
||||
if(!all_behind) {
|
||||
if(bb_min.x >= 1.0f + margin ||
|
||||
bb_min.y >= 1.0f + margin ||
|
||||
bb_max.x <= -margin ||
|
||||
bb_max.y <= -margin)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
Object *BlenderSync::sync_object(BL::Object b_parent,
|
||||
int persistent_id[OBJECT_PERSISTENT_ID_SIZE],
|
||||
BL::DupliObject b_dupli_ob,
|
||||
Transform& tfm,
|
||||
uint layer_flag,
|
||||
float motion_time,
|
||||
bool hide_tris,
|
||||
bool use_camera_cull,
|
||||
float camera_cull_margin,
|
||||
bool *use_portal)
|
||||
{
|
||||
BL::Object b_ob = (b_dupli_ob ? b_dupli_ob.object() : b_parent);
|
||||
bool motion = motion_time != 0.0f;
|
||||
@@ -232,7 +289,7 @@ Object *BlenderSync::sync_object(BL::Object b_parent, int persistent_id[OBJECT_P
|
||||
if(object_is_light(b_ob)) {
|
||||
/* don't use lamps for excluded layers used as mask layer */
|
||||
if(!motion && !((layer_flag & render_layer.holdout_layer) && (layer_flag & render_layer.exclude_layer)))
|
||||
sync_light(b_parent, persistent_id, b_ob, tfm);
|
||||
sync_light(b_parent, persistent_id, b_ob, tfm, use_portal);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@@ -241,6 +298,11 @@ Object *BlenderSync::sync_object(BL::Object b_parent, int persistent_id[OBJECT_P
|
||||
if(!object_is_mesh(b_ob))
|
||||
return NULL;
|
||||
|
||||
/* Perform camera space culling. */
|
||||
if(use_camera_cull && object_boundbox_clip(scene, b_ob, tfm, camera_cull_margin)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* key to lookup object */
|
||||
ObjectKey key(b_parent, persistent_id, b_ob);
|
||||
Object *object;
|
||||
@@ -265,7 +327,7 @@ Object *BlenderSync::sync_object(BL::Object b_parent, int persistent_id[OBJECT_P
|
||||
|
||||
/* mesh deformation */
|
||||
if(object->mesh)
|
||||
sync_mesh_motion(b_ob, object, motion_time);
|
||||
sync_mesh_motion(b_parent, object, motion_time, b_dupli_ob);
|
||||
}
|
||||
|
||||
return object;
|
||||
@@ -280,7 +342,10 @@ Object *BlenderSync::sync_object(BL::Object b_parent, int persistent_id[OBJECT_P
|
||||
bool use_holdout = (layer_flag & render_layer.holdout_layer) != 0;
|
||||
|
||||
/* mesh sync */
|
||||
object->mesh = sync_mesh(b_ob, object_updated, hide_tris);
|
||||
if (b_dupli_ob)
|
||||
object->mesh = sync_mesh(b_parent, object_updated, hide_tris, b_dupli_ob);
|
||||
else
|
||||
object->mesh = sync_mesh(b_ob, object_updated, hide_tris);
|
||||
|
||||
/* special case not tracked by object update flags */
|
||||
|
||||
@@ -356,7 +421,7 @@ Object *BlenderSync::sync_object(BL::Object b_parent, int persistent_id[OBJECT_P
|
||||
object->random_id ^= hash_int(hash_string(b_parent.name().c_str()));
|
||||
|
||||
/* dupli texture coordinates */
|
||||
if (b_dupli_ob) {
|
||||
if(b_dupli_ob) {
|
||||
object->dupli_generated = 0.5f*get_float3(b_dupli_ob.orco()) - make_float3(0.5f, 0.5f, 0.5f);
|
||||
object->dupli_uv = get_float2(b_dupli_ob.uv());
|
||||
}
|
||||
@@ -466,6 +531,15 @@ void BlenderSync::sync_objects(BL::SpaceView3D b_v3d, float motion_time)
|
||||
mesh_motion_synced.clear();
|
||||
}
|
||||
|
||||
PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
|
||||
bool allow_camera_cull = scene->camera->type != CAMERA_PANORAMA &&
|
||||
!b_scene.render().use_multiview() &&
|
||||
get_boolean(cscene, "use_camera_cull");
|
||||
float camera_cull_margin = 0.0f;
|
||||
if(allow_camera_cull) {
|
||||
camera_cull_margin = get_float(cscene, "camera_cull_margin");
|
||||
}
|
||||
|
||||
/* object loop */
|
||||
BL::Scene::object_bases_iterator b_base;
|
||||
BL::Scene b_sce = b_scene;
|
||||
@@ -476,6 +550,7 @@ void BlenderSync::sync_objects(BL::SpaceView3D b_v3d, float motion_time)
|
||||
int dupli_settings = preview ? 1 : 2;
|
||||
|
||||
bool cancel = false;
|
||||
bool use_portal = false;
|
||||
|
||||
for(; b_sce && !cancel; b_sce = b_sce.background_set()) {
|
||||
for(b_sce.object_bases.begin(b_base); b_base != b_sce.object_bases.end() && !cancel; ++b_base) {
|
||||
@@ -487,6 +562,12 @@ void BlenderSync::sync_objects(BL::SpaceView3D b_v3d, float motion_time)
|
||||
if(!hide) {
|
||||
progress.set_sync_status("Synchronizing object", b_ob.name());
|
||||
|
||||
PointerRNA cobject = RNA_pointer_get(&b_ob.ptr, "cycles");
|
||||
bool use_camera_cull = allow_camera_cull && get_boolean(cobject, "use_camera_cull");
|
||||
if(use_camera_cull) {
|
||||
/* Need to have proper projection matrix. */
|
||||
scene->camera->update();
|
||||
}
|
||||
if(b_ob.is_duplicator() && !object_render_hide_duplis(b_ob)) {
|
||||
/* dupli objects */
|
||||
b_ob.dupli_list_create(b_scene, dupli_settings);
|
||||
@@ -506,7 +587,16 @@ void BlenderSync::sync_objects(BL::SpaceView3D b_v3d, float motion_time)
|
||||
BL::Array<int, OBJECT_PERSISTENT_ID_SIZE> persistent_id = b_dup->persistent_id();
|
||||
|
||||
/* sync object and mesh or light data */
|
||||
Object *object = sync_object(b_ob, persistent_id.data, *b_dup, tfm, ob_layer, motion_time, hide_tris);
|
||||
Object *object = sync_object(b_ob,
|
||||
persistent_id.data,
|
||||
*b_dup,
|
||||
tfm,
|
||||
ob_layer,
|
||||
motion_time,
|
||||
hide_tris,
|
||||
use_camera_cull,
|
||||
camera_cull_margin,
|
||||
&use_portal);
|
||||
|
||||
/* sync possible particle data, note particle_id
|
||||
* starts counting at 1, first is dummy particle */
|
||||
@@ -526,7 +616,16 @@ void BlenderSync::sync_objects(BL::SpaceView3D b_v3d, float motion_time)
|
||||
if(!object_render_hide(b_ob, true, true, hide_tris)) {
|
||||
/* object itself */
|
||||
Transform tfm = get_transform(b_ob.matrix_world());
|
||||
sync_object(b_ob, NULL, PointerRNA_NULL, tfm, ob_layer, motion_time, hide_tris);
|
||||
sync_object(b_ob,
|
||||
NULL,
|
||||
PointerRNA_NULL,
|
||||
tfm,
|
||||
ob_layer,
|
||||
motion_time,
|
||||
hide_tris,
|
||||
use_camera_cull,
|
||||
camera_cull_margin,
|
||||
&use_portal);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -537,7 +636,7 @@ void BlenderSync::sync_objects(BL::SpaceView3D b_v3d, float motion_time)
|
||||
progress.set_sync_status("");
|
||||
|
||||
if(!cancel && !motion) {
|
||||
sync_background_light();
|
||||
sync_background_light(use_portal);
|
||||
|
||||
/* handle removed data and modified pointers */
|
||||
if(light_map.post_sync())
|
||||
|
@@ -76,7 +76,7 @@ bool BlenderSync::sync_dupli_particle(BL::Object b_ob, BL::DupliObject b_dup, Ob
|
||||
|
||||
psys->particles.push_back(pa);
|
||||
|
||||
if (object->particle_index != psys->particles.size() - 1)
|
||||
if(object->particle_index != psys->particles.size() - 1)
|
||||
scene->object_manager->tag_update(scene);
|
||||
object->particle_system = psys;
|
||||
object->particle_index = psys->particles.size() - 1;
|
||||
|
@@ -25,6 +25,7 @@
|
||||
#include "util_md5.h"
|
||||
#include "util_opengl.h"
|
||||
#include "util_path.h"
|
||||
#include "util_types.h"
|
||||
|
||||
#ifdef WITH_OSL
|
||||
#include "osl.h"
|
||||
@@ -70,7 +71,7 @@ static const char *PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce)
|
||||
return "";
|
||||
}
|
||||
|
||||
static PyObject *init_func(PyObject *self, PyObject *args)
|
||||
static PyObject *init_func(PyObject * /*self*/, PyObject *args)
|
||||
{
|
||||
PyObject *path, *user_path;
|
||||
int headless;
|
||||
@@ -90,7 +91,7 @@ static PyObject *init_func(PyObject *self, PyObject *args)
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
static PyObject *create_func(PyObject *self, PyObject *args)
|
||||
static PyObject *create_func(PyObject * /*self*/, PyObject *args)
|
||||
{
|
||||
PyObject *pyengine, *pyuserpref, *pydata, *pyscene, *pyregion, *pyv3d, *pyrv3d;
|
||||
int preview_osl;
|
||||
@@ -162,14 +163,14 @@ static PyObject *create_func(PyObject *self, PyObject *args)
|
||||
return PyLong_FromVoidPtr(session);
|
||||
}
|
||||
|
||||
static PyObject *free_func(PyObject *self, PyObject *value)
|
||||
static PyObject *free_func(PyObject * /*self*/, PyObject *value)
|
||||
{
|
||||
delete (BlenderSession*)PyLong_AsVoidPtr(value);
|
||||
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
static PyObject *render_func(PyObject *self, PyObject *value)
|
||||
static PyObject *render_func(PyObject * /*self*/, PyObject *value)
|
||||
{
|
||||
BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(value);
|
||||
|
||||
@@ -183,14 +184,14 @@ static PyObject *render_func(PyObject *self, PyObject *value)
|
||||
}
|
||||
|
||||
/* pixel_array and result passed as pointers */
|
||||
static PyObject *bake_func(PyObject *self, PyObject *args)
|
||||
static PyObject *bake_func(PyObject * /*self*/, PyObject *args)
|
||||
{
|
||||
PyObject *pysession, *pyobject;
|
||||
PyObject *pypixel_array, *pyresult;
|
||||
const char *pass_type;
|
||||
int num_pixels, depth;
|
||||
int num_pixels, depth, object_id;
|
||||
|
||||
if(!PyArg_ParseTuple(args, "OOsOiiO", &pysession, &pyobject, &pass_type, &pypixel_array, &num_pixels, &depth, &pyresult))
|
||||
if(!PyArg_ParseTuple(args, "OOsiOiiO", &pysession, &pyobject, &pass_type, &object_id, &pypixel_array, &num_pixels, &depth, &pyresult))
|
||||
return NULL;
|
||||
|
||||
BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(pysession);
|
||||
@@ -207,14 +208,14 @@ static PyObject *bake_func(PyObject *self, PyObject *args)
|
||||
|
||||
python_thread_state_save(&session->python_thread_state);
|
||||
|
||||
session->bake(b_object, pass_type, b_bake_pixel, (size_t)num_pixels, depth, (float *)b_result);
|
||||
session->bake(b_object, pass_type, object_id, b_bake_pixel, (size_t)num_pixels, depth, (float *)b_result);
|
||||
|
||||
python_thread_state_restore(&session->python_thread_state);
|
||||
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
static PyObject *draw_func(PyObject *self, PyObject *args)
|
||||
static PyObject *draw_func(PyObject * /*self*/, PyObject *args)
|
||||
{
|
||||
PyObject *pysession, *pyv3d, *pyrv3d;
|
||||
|
||||
@@ -234,7 +235,7 @@ static PyObject *draw_func(PyObject *self, PyObject *args)
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
static PyObject *reset_func(PyObject *self, PyObject *args)
|
||||
static PyObject *reset_func(PyObject * /*self*/, PyObject *args)
|
||||
{
|
||||
PyObject *pysession, *pydata, *pyscene;
|
||||
|
||||
@@ -260,7 +261,7 @@ static PyObject *reset_func(PyObject *self, PyObject *args)
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
static PyObject *sync_func(PyObject *self, PyObject *value)
|
||||
static PyObject *sync_func(PyObject * /*self*/, PyObject *value)
|
||||
{
|
||||
BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(value);
|
||||
|
||||
@@ -273,7 +274,7 @@ static PyObject *sync_func(PyObject *self, PyObject *value)
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
static PyObject *available_devices_func(PyObject *self, PyObject *args)
|
||||
static PyObject *available_devices_func(PyObject * /*self*/, PyObject * /*args*/)
|
||||
{
|
||||
vector<DeviceInfo>& devices = Device::available_devices();
|
||||
PyObject *ret = PyTuple_New(devices.size());
|
||||
@@ -288,7 +289,7 @@ static PyObject *available_devices_func(PyObject *self, PyObject *args)
|
||||
|
||||
#ifdef WITH_OSL
|
||||
|
||||
static PyObject *osl_update_node_func(PyObject *self, PyObject *args)
|
||||
static PyObject *osl_update_node_func(PyObject * /*self*/, PyObject *args)
|
||||
{
|
||||
PyObject *pynodegroup, *pynode;
|
||||
const char *filepath = NULL;
|
||||
@@ -390,7 +391,7 @@ static PyObject *osl_update_node_func(PyObject *self, PyObject *args)
|
||||
|
||||
/* find socket socket */
|
||||
BL::NodeSocket b_sock(PointerRNA_NULL);
|
||||
if (param->isoutput) {
|
||||
if(param->isoutput) {
|
||||
b_sock = b_node.outputs[param->name.string()];
|
||||
/* remove if type no longer matches */
|
||||
if(b_sock && b_sock.bl_idname() != socket_type) {
|
||||
@@ -444,7 +445,7 @@ static PyObject *osl_update_node_func(PyObject *self, PyObject *args)
|
||||
|
||||
removed = false;
|
||||
|
||||
for (b_node.inputs.begin(b_input); b_input != b_node.inputs.end(); ++b_input) {
|
||||
for(b_node.inputs.begin(b_input); b_input != b_node.inputs.end(); ++b_input) {
|
||||
if(used_sockets.find(b_input->ptr.data) == used_sockets.end()) {
|
||||
b_node.inputs.remove(*b_input);
|
||||
removed = true;
|
||||
@@ -452,7 +453,7 @@ static PyObject *osl_update_node_func(PyObject *self, PyObject *args)
|
||||
}
|
||||
}
|
||||
|
||||
for (b_node.outputs.begin(b_output); b_output != b_node.outputs.end(); ++b_output) {
|
||||
for(b_node.outputs.begin(b_output); b_output != b_node.outputs.end(); ++b_output) {
|
||||
if(used_sockets.find(b_output->ptr.data) == used_sockets.end()) {
|
||||
b_node.outputs.remove(*b_output);
|
||||
removed = true;
|
||||
@@ -464,7 +465,7 @@ static PyObject *osl_update_node_func(PyObject *self, PyObject *args)
|
||||
Py_RETURN_TRUE;
|
||||
}
|
||||
|
||||
static PyObject *osl_compile_func(PyObject *self, PyObject *args)
|
||||
static PyObject *osl_compile_func(PyObject * /*self*/, PyObject *args)
|
||||
{
|
||||
const char *inputfile = NULL, *outputfile = NULL;
|
||||
|
||||
@@ -479,7 +480,7 @@ static PyObject *osl_compile_func(PyObject *self, PyObject *args)
|
||||
}
|
||||
#endif
|
||||
|
||||
static PyObject *system_info_func(PyObject *self, PyObject *value)
|
||||
static PyObject *system_info_func(PyObject * /*self*/, PyObject * /*value*/)
|
||||
{
|
||||
string system_info = Device::device_capabilities();
|
||||
return PyUnicode_FromString(system_info.c_str());
|
||||
|
@@ -100,7 +100,8 @@ void BlenderSession::create_session()
|
||||
start_resize_time = 0.0;
|
||||
|
||||
/* create scene */
|
||||
scene = new Scene(scene_params, session_params.device);
|
||||
bool free_data_after_update = background && !scene_params.persistent_data;
|
||||
scene = new Scene(scene_params, session_params.device, free_data_after_update);
|
||||
|
||||
/* setup callbacks for builtin image support */
|
||||
scene->image_manager->builtin_image_info_cb = function_bind(&BlenderSession::builtin_image_info, this, _1, _2, _3, _4, _5, _6, _7);
|
||||
@@ -133,7 +134,7 @@ void BlenderSession::create_session()
|
||||
}
|
||||
|
||||
/* set buffer parameters */
|
||||
BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_scene, b_v3d, b_rv3d, scene->camera, width, height);
|
||||
BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_v3d, b_rv3d, scene->camera, width, height);
|
||||
session->reset(buffer_params, session_params.samples);
|
||||
|
||||
b_engine.use_highlight_tiles(session_params.progressive_refine == false);
|
||||
@@ -186,7 +187,7 @@ void BlenderSession::reset_session(BL::BlendData b_data_, BL::Scene b_scene_)
|
||||
sync->sync_integrator();
|
||||
sync->sync_camera(b_render, b_engine.camera_override(), width, height);
|
||||
|
||||
BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_scene, PointerRNA_NULL, PointerRNA_NULL, scene->camera, width, height);
|
||||
BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, PointerRNA_NULL, PointerRNA_NULL, scene->camera, width, height);
|
||||
session->reset(buffer_params, session_params.samples);
|
||||
|
||||
b_engine.use_highlight_tiles(session_params.progressive_refine == false);
|
||||
@@ -331,9 +332,9 @@ static ShaderEvalType get_shader_type(const string& pass_type)
|
||||
return SHADER_EVAL_BAKE;
|
||||
}
|
||||
|
||||
static BL::RenderResult begin_render_result(BL::RenderEngine b_engine, int x, int y, int w, int h, const char *layername)
|
||||
static BL::RenderResult begin_render_result(BL::RenderEngine b_engine, int x, int y, int w, int h, const char *layername, const char *viewname)
|
||||
{
|
||||
return b_engine.begin_result(x, y, w, h, layername);
|
||||
return b_engine.begin_result(x, y, w, h, layername, viewname);
|
||||
}
|
||||
|
||||
static void end_render_result(BL::RenderEngine b_engine, BL::RenderResult b_rr, bool cancel, bool do_merge_results)
|
||||
@@ -350,10 +351,10 @@ void BlenderSession::do_write_update_render_tile(RenderTile& rtile, bool do_upda
|
||||
int h = params.height;
|
||||
|
||||
/* get render result */
|
||||
BL::RenderResult b_rr = begin_render_result(b_engine, x, y, w, h, b_rlay_name.c_str());
|
||||
BL::RenderResult b_rr = begin_render_result(b_engine, x, y, w, h, b_rlay_name.c_str(), b_rview_name.c_str());
|
||||
|
||||
/* can happen if the intersected rectangle gives 0 width or height */
|
||||
if (b_rr.ptr.data == NULL) {
|
||||
if(b_rr.ptr.data == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -366,10 +367,10 @@ void BlenderSession::do_write_update_render_tile(RenderTile& rtile, bool do_upda
|
||||
|
||||
BL::RenderLayer b_rlay = *b_single_rlay;
|
||||
|
||||
if (do_update_only) {
|
||||
if(do_update_only) {
|
||||
/* update only needed */
|
||||
|
||||
if (rtile.sample != 0) {
|
||||
if(rtile.sample != 0) {
|
||||
/* sample would be zero at initial tile update, which is only needed
|
||||
* to tag tile form blender side as IN PROGRESS for proper highlight
|
||||
* no buffers should be sent to blender yet
|
||||
@@ -397,7 +398,7 @@ void BlenderSession::update_render_tile(RenderTile& rtile)
|
||||
* be updated in blender side
|
||||
* would need to be investigated a bit further, but for now shall be fine
|
||||
*/
|
||||
if (!b_engine.is_preview())
|
||||
if(!b_engine.is_preview())
|
||||
do_write_update_render_tile(rtile, true);
|
||||
else
|
||||
do_write_update_render_tile(rtile, false);
|
||||
@@ -408,20 +409,22 @@ void BlenderSession::render()
|
||||
/* set callback to write out render results */
|
||||
session->write_render_tile_cb = function_bind(&BlenderSession::write_render_tile, this, _1);
|
||||
session->update_render_tile_cb = function_bind(&BlenderSession::update_render_tile, this, _1);
|
||||
session->clear_database_cb = function_bind(&BlenderSession::clear_blender_database, this);
|
||||
|
||||
/* get buffer parameters */
|
||||
SessionParams session_params = BlenderSync::get_session_params(b_engine, b_userpref, b_scene, background);
|
||||
BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_scene, b_v3d, b_rv3d, scene->camera, width, height);
|
||||
BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_v3d, b_rv3d, scene->camera, width, height);
|
||||
|
||||
/* render each layer */
|
||||
BL::RenderSettings r = b_scene.render();
|
||||
BL::RenderSettings::layers_iterator b_iter;
|
||||
BL::RenderSettings::layers_iterator b_layer_iter;
|
||||
BL::RenderResult::views_iterator b_view_iter;
|
||||
|
||||
for(r.layers.begin(b_iter); b_iter != r.layers.end(); ++b_iter) {
|
||||
b_rlay_name = b_iter->name();
|
||||
for(r.layers.begin(b_layer_iter); b_layer_iter != r.layers.end(); ++b_layer_iter) {
|
||||
b_rlay_name = b_layer_iter->name();
|
||||
|
||||
/* temporary render result to find needed passes */
|
||||
BL::RenderResult b_rr = begin_render_result(b_engine, 0, 0, 1, 1, b_rlay_name.c_str());
|
||||
/* temporary render result to find needed passes and views */
|
||||
BL::RenderResult b_rr = begin_render_result(b_engine, 0, 0, 1, 1, b_rlay_name.c_str(), NULL);
|
||||
BL::RenderResult::layers_iterator b_single_rlay;
|
||||
b_rr.layers.begin(b_single_rlay);
|
||||
|
||||
@@ -456,39 +459,50 @@ void BlenderSession::render()
|
||||
}
|
||||
}
|
||||
|
||||
/* free result without merging */
|
||||
end_render_result(b_engine, b_rr, true, false);
|
||||
|
||||
buffer_params.passes = passes;
|
||||
scene->film->pass_alpha_threshold = b_iter->pass_alpha_threshold();
|
||||
scene->film->pass_alpha_threshold = b_layer_iter->pass_alpha_threshold();
|
||||
scene->film->tag_passes_update(scene, passes);
|
||||
scene->film->tag_update(scene);
|
||||
scene->integrator->tag_update(scene);
|
||||
|
||||
/* update scene */
|
||||
sync->sync_camera(b_render, b_engine.camera_override(), width, height);
|
||||
sync->sync_data(b_v3d, b_engine.camera_override(), &python_thread_state, b_rlay_name.c_str());
|
||||
for(b_rr.views.begin(b_view_iter); b_view_iter != b_rr.views.end(); ++b_view_iter) {
|
||||
b_rview_name = b_view_iter->name();
|
||||
|
||||
/* update number of samples per layer */
|
||||
int samples = sync->get_layer_samples();
|
||||
bool bound_samples = sync->get_layer_bound_samples();
|
||||
/* set the current view */
|
||||
b_engine.active_view_set(b_rview_name.c_str());
|
||||
|
||||
if(samples != 0 && (!bound_samples || (samples < session_params.samples)))
|
||||
session->reset(buffer_params, samples);
|
||||
else
|
||||
session->reset(buffer_params, session_params.samples);
|
||||
/* update scene */
|
||||
sync->sync_camera(b_render, b_engine.camera_override(), width, height);
|
||||
sync->sync_data(b_v3d, b_engine.camera_override(), &python_thread_state, b_rlay_name.c_str());
|
||||
|
||||
/* render */
|
||||
session->start();
|
||||
session->wait();
|
||||
/* update number of samples per layer */
|
||||
int samples = sync->get_layer_samples();
|
||||
bool bound_samples = sync->get_layer_bound_samples();
|
||||
|
||||
if(samples != 0 && (!bound_samples || (samples < session_params.samples)))
|
||||
session->reset(buffer_params, samples);
|
||||
else
|
||||
session->reset(buffer_params, session_params.samples);
|
||||
|
||||
/* render */
|
||||
session->start();
|
||||
session->wait();
|
||||
|
||||
if(session->progress.get_cancel())
|
||||
break;
|
||||
}
|
||||
|
||||
/* free result without merging */
|
||||
end_render_result(b_engine, b_rr, true, false);
|
||||
|
||||
if(session->progress.get_cancel())
|
||||
break;
|
||||
}
|
||||
|
||||
/* clear callback */
|
||||
session->write_render_tile_cb = NULL;
|
||||
session->update_render_tile_cb = NULL;
|
||||
session->write_render_tile_cb = function_null;
|
||||
session->update_render_tile_cb = function_null;
|
||||
session->clear_database_cb = function_null;
|
||||
|
||||
/* free all memory used (host and device), so we wouldn't leave render
|
||||
* engine with extra memory allocated
|
||||
@@ -500,18 +514,22 @@ void BlenderSession::render()
|
||||
sync = NULL;
|
||||
}
|
||||
|
||||
static void populate_bake_data(BakeData *data, BL::BakePixel pixel_array, const int num_pixels)
|
||||
static void populate_bake_data(BakeData *data, const int object_id, BL::BakePixel pixel_array, const int num_pixels)
|
||||
{
|
||||
BL::BakePixel bp = pixel_array;
|
||||
|
||||
int i;
|
||||
for(i=0; i < num_pixels; i++) {
|
||||
data->set(i, bp.primitive_id(), bp.uv(), bp.du_dx(), bp.du_dy(), bp.dv_dx(), bp.dv_dy());
|
||||
if(bp.object_id() == object_id) {
|
||||
data->set(i, bp.primitive_id(), bp.uv(), bp.du_dx(), bp.du_dy(), bp.dv_dx(), bp.dv_dy());
|
||||
} else {
|
||||
data->set_null(i);
|
||||
}
|
||||
bp = bp.next();
|
||||
}
|
||||
}
|
||||
|
||||
void BlenderSession::bake(BL::Object b_object, const string& pass_type, BL::BakePixel pixel_array, const size_t num_pixels, const int depth, float result[])
|
||||
void BlenderSession::bake(BL::Object b_object, const string& pass_type, const int object_id, BL::BakePixel pixel_array, const size_t num_pixels, const int /*depth*/, float result[])
|
||||
{
|
||||
ShaderEvalType shader_type = get_shader_type(pass_type);
|
||||
size_t object_index = OBJECT_NONE;
|
||||
@@ -543,7 +561,7 @@ void BlenderSession::bake(BL::Object b_object, const string& pass_type, BL::Bake
|
||||
|
||||
/* get buffer parameters */
|
||||
SessionParams session_params = BlenderSync::get_session_params(b_engine, b_userpref, b_scene, background);
|
||||
BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_scene, b_v3d, b_rv3d, scene->camera, width, height);
|
||||
BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_v3d, b_rv3d, scene->camera, width, height);
|
||||
|
||||
scene->bake_manager->set_shader_limit((size_t)b_engine.tile_x(), (size_t)b_engine.tile_y());
|
||||
scene->bake_manager->set_baking(true);
|
||||
@@ -567,7 +585,7 @@ void BlenderSession::bake(BL::Object b_object, const string& pass_type, BL::Bake
|
||||
|
||||
BakeData *bake_data = scene->bake_manager->init(object, tri_offset, num_pixels);
|
||||
|
||||
populate_bake_data(bake_data, pixel_array, num_pixels);
|
||||
populate_bake_data(bake_data, object_id, pixel_array, num_pixels);
|
||||
|
||||
/* set number of samples */
|
||||
session->tile_manager.set_samples(session_params.samples);
|
||||
@@ -601,7 +619,7 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult b_rr, BL::Re
|
||||
|
||||
vector<float> pixels(params.width*params.height*4);
|
||||
|
||||
if (!do_update_only) {
|
||||
if(!do_update_only) {
|
||||
/* copy each pass */
|
||||
BL::RenderLayer::passes_iterator b_iter;
|
||||
|
||||
@@ -619,10 +637,12 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult b_rr, BL::Re
|
||||
b_pass.rect(&pixels[0]);
|
||||
}
|
||||
}
|
||||
|
||||
/* copy combined pass */
|
||||
if(buffers->get_pass_rect(PASS_COMBINED, exposure, rtile.sample, 4, &pixels[0]))
|
||||
b_rlay.rect(&pixels[0]);
|
||||
else {
|
||||
/* copy combined pass */
|
||||
BL::RenderPass b_combined_pass(b_rlay.passes.find_by_type(BL::RenderPass::type_COMBINED, b_rview_name.c_str()));
|
||||
if(buffers->get_pass_rect(PASS_COMBINED, exposure, rtile.sample, 4, &pixels[0]))
|
||||
b_combined_pass.rect(&pixels[0]);
|
||||
}
|
||||
|
||||
/* tag result as updated */
|
||||
b_engine.update_result(b_rr);
|
||||
@@ -692,7 +712,7 @@ void BlenderSession::synchronize()
|
||||
|
||||
/* reset if needed */
|
||||
if(scene->need_reset()) {
|
||||
BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_scene, b_v3d, b_rv3d, scene->camera, width, height);
|
||||
BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_v3d, b_rv3d, scene->camera, width, height);
|
||||
session->reset(buffer_params, session_params.samples);
|
||||
|
||||
/* reset time */
|
||||
@@ -747,7 +767,7 @@ bool BlenderSession::draw(int w, int h)
|
||||
/* reset if requested */
|
||||
if(reset) {
|
||||
SessionParams session_params = BlenderSync::get_session_params(b_engine, b_userpref, b_scene, background);
|
||||
BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_scene, b_v3d, b_rv3d, scene->camera, width, height);
|
||||
BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_v3d, b_rv3d, scene->camera, width, height);
|
||||
bool session_pause = BlenderSync::get_session_pause(b_scene, background);
|
||||
|
||||
if(session_pause == false) {
|
||||
@@ -764,7 +784,7 @@ bool BlenderSession::draw(int w, int h)
|
||||
update_status_progress();
|
||||
|
||||
/* draw */
|
||||
BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_scene, b_v3d, b_rv3d, scene->camera, width, height);
|
||||
BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_v3d, b_rv3d, scene->camera, width, height);
|
||||
DeviceDrawParams draw_params;
|
||||
|
||||
if(session->params.display_buffer_linear) {
|
||||
@@ -841,6 +861,9 @@ void BlenderSession::update_status_progress()
|
||||
scene += " | " + b_scene.name();
|
||||
if(b_rlay_name != "")
|
||||
scene += ", " + b_rlay_name;
|
||||
|
||||
if(b_rview_name != "")
|
||||
scene += ", " + b_rview_name;
|
||||
}
|
||||
else {
|
||||
BLI_timestr(total_time, time_str, sizeof(time_str));
|
||||
@@ -869,7 +892,7 @@ void BlenderSession::update_status_progress()
|
||||
last_progress = progress;
|
||||
}
|
||||
|
||||
if (session->progress.get_error()) {
|
||||
if(session->progress.get_error()) {
|
||||
string error = session->progress.get_error_message();
|
||||
if(error != last_error) {
|
||||
/* TODO(sergey): Currently C++ RNA API doesn't let us to
|
||||
@@ -981,6 +1004,18 @@ void BlenderSession::builtin_image_info(const string &builtin_name, void *builti
|
||||
|
||||
is_float = true;
|
||||
}
|
||||
else {
|
||||
/* TODO(sergey): Check we're indeed in shader node tree. */
|
||||
PointerRNA ptr;
|
||||
RNA_pointer_create(NULL, &RNA_Node, builtin_data, &ptr);
|
||||
BL::Node b_node(ptr);
|
||||
if(b_node.is_a(&RNA_ShaderNodeTexPointDensity)) {
|
||||
BL::ShaderNodeTexPointDensity b_point_density_node(b_node);
|
||||
channels = 4;
|
||||
width = height = depth = b_point_density_node.resolution();
|
||||
is_float = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool BlenderSession::builtin_image_pixels(const string &builtin_name, void *builtin_data, unsigned char *pixels)
|
||||
@@ -1000,18 +1035,19 @@ bool BlenderSession::builtin_image_pixels(const string &builtin_name, void *buil
|
||||
|
||||
unsigned char *image_pixels;
|
||||
image_pixels = image_get_pixels_for_frame(b_image, frame);
|
||||
size_t num_pixels = ((size_t)width) * height;
|
||||
|
||||
if(image_pixels) {
|
||||
memcpy(pixels, image_pixels, width * height * channels * sizeof(unsigned char));
|
||||
memcpy(pixels, image_pixels, num_pixels * channels * sizeof(unsigned char));
|
||||
MEM_freeN(image_pixels);
|
||||
}
|
||||
else {
|
||||
if(channels == 1) {
|
||||
memset(pixels, 0, width * height * sizeof(unsigned char));
|
||||
memset(pixels, 0, num_pixels * sizeof(unsigned char));
|
||||
}
|
||||
else {
|
||||
unsigned char *cp = pixels;
|
||||
for(int i = 0; i < width * height; i++, cp += channels) {
|
||||
for(size_t i = 0; i < num_pixels; i++, cp += channels) {
|
||||
cp[0] = 255;
|
||||
cp[1] = 0;
|
||||
cp[2] = 255;
|
||||
@@ -1023,7 +1059,7 @@ bool BlenderSession::builtin_image_pixels(const string &builtin_name, void *buil
|
||||
|
||||
/* premultiply, byte images are always straight for blender */
|
||||
unsigned char *cp = pixels;
|
||||
for(int i = 0; i < width * height; i++, cp += channels) {
|
||||
for(size_t i = 0; i < num_pixels; i++, cp += channels) {
|
||||
cp[0] = (cp[0] * cp[3]) >> 8;
|
||||
cp[1] = (cp[1] * cp[3]) >> 8;
|
||||
cp[2] = (cp[2] * cp[3]) >> 8;
|
||||
@@ -1052,18 +1088,19 @@ bool BlenderSession::builtin_image_float_pixels(const string &builtin_name, void
|
||||
|
||||
float *image_pixels;
|
||||
image_pixels = image_get_float_pixels_for_frame(b_image, frame);
|
||||
size_t num_pixels = ((size_t)width) * height;
|
||||
|
||||
if(image_pixels) {
|
||||
memcpy(pixels, image_pixels, width * height * channels * sizeof(float));
|
||||
memcpy(pixels, image_pixels, num_pixels * channels * sizeof(float));
|
||||
MEM_freeN(image_pixels);
|
||||
}
|
||||
else {
|
||||
if(channels == 1) {
|
||||
memset(pixels, 0, width * height * sizeof(float));
|
||||
memset(pixels, 0, num_pixels * sizeof(float));
|
||||
}
|
||||
else {
|
||||
float *fp = pixels;
|
||||
for(int i = 0; i < width * height; i++, fp += channels) {
|
||||
for(int i = 0; i < num_pixels; i++, fp += channels) {
|
||||
fp[0] = 1.0f;
|
||||
fp[1] = 0.0f;
|
||||
fp[2] = 1.0f;
|
||||
@@ -1089,11 +1126,12 @@ bool BlenderSession::builtin_image_float_pixels(const string &builtin_name, void
|
||||
int width = resolution.x * amplify;
|
||||
int height = resolution.y * amplify;
|
||||
int depth = resolution.z * amplify;
|
||||
size_t num_pixels = ((size_t)width) * height * depth;
|
||||
|
||||
if(builtin_name == Attribute::standard_name(ATTR_STD_VOLUME_DENSITY)) {
|
||||
SmokeDomainSettings_density_grid_get_length(&b_domain.ptr, &length);
|
||||
|
||||
if(length == width*height*depth) {
|
||||
if(length == num_pixels) {
|
||||
SmokeDomainSettings_density_grid_get(&b_domain.ptr, pixels);
|
||||
return true;
|
||||
}
|
||||
@@ -1103,7 +1141,7 @@ bool BlenderSession::builtin_image_float_pixels(const string &builtin_name, void
|
||||
* as 1500..3000 K with the first part faded to zero density */
|
||||
SmokeDomainSettings_flame_grid_get_length(&b_domain.ptr, &length);
|
||||
|
||||
if(length == width*height*depth) {
|
||||
if(length == num_pixels) {
|
||||
SmokeDomainSettings_flame_grid_get(&b_domain.ptr, pixels);
|
||||
return true;
|
||||
}
|
||||
@@ -1112,7 +1150,7 @@ bool BlenderSession::builtin_image_float_pixels(const string &builtin_name, void
|
||||
/* the RGB is "premultiplied" by density for better interpolation results */
|
||||
SmokeDomainSettings_color_grid_get_length(&b_domain.ptr, &length);
|
||||
|
||||
if(length == width*height*depth*4) {
|
||||
if(length == num_pixels*4) {
|
||||
SmokeDomainSettings_color_grid_get(&b_domain.ptr, pixels);
|
||||
return true;
|
||||
}
|
||||
@@ -1120,9 +1158,41 @@ bool BlenderSession::builtin_image_float_pixels(const string &builtin_name, void
|
||||
|
||||
fprintf(stderr, "Cycles error: unexpected smoke volume resolution, skipping\n");
|
||||
}
|
||||
else {
|
||||
/* TODO(sergey): Check we're indeed in shader node tree. */
|
||||
PointerRNA ptr;
|
||||
RNA_pointer_create(NULL, &RNA_Node, builtin_data, &ptr);
|
||||
BL::Node b_node(ptr);
|
||||
if(b_node.is_a(&RNA_ShaderNodeTexPointDensity)) {
|
||||
BL::ShaderNodeTexPointDensity b_point_density_node(b_node);
|
||||
int length;
|
||||
b_point_density_node.calc_point_density(b_scene, &length, &pixels);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void BlenderSession::clear_blender_database()
|
||||
{
|
||||
const bool is_interface_locked = b_engine.render() &&
|
||||
b_engine.render().use_lock_interface();
|
||||
const bool can_free_database = BlenderSession::headless || is_interface_locked;
|
||||
if(!can_free_database) {
|
||||
/* Database might be used by the interface, can not free it at all. */
|
||||
return;
|
||||
}
|
||||
for(BL::Scene b_sce = b_scene; b_sce; b_sce = b_sce.background_set()) {
|
||||
BL::Scene::object_bases_iterator b_base;
|
||||
for(b_sce.object_bases.begin(b_base);
|
||||
b_base != b_sce.object_bases.end();
|
||||
++b_base)
|
||||
{
|
||||
BL::Object b_ob = b_base->object();
|
||||
b_ob.cache_release(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
||||
|
@@ -52,7 +52,7 @@ public:
|
||||
/* offline render */
|
||||
void render();
|
||||
|
||||
void bake(BL::Object b_object, const string& pass_type, BL::BakePixel pixel_array, const size_t num_pixels, const int depth, float pixels[]);
|
||||
void bake(BL::Object b_object, const string& pass_type, const int object_id, BL::BakePixel pixel_array, const size_t num_pixels, const int depth, float pixels[]);
|
||||
|
||||
void write_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderTile& rtile);
|
||||
void write_render_tile(RenderTile& rtile);
|
||||
@@ -90,6 +90,7 @@ public:
|
||||
BL::SpaceView3D b_v3d;
|
||||
BL::RegionView3D b_rv3d;
|
||||
string b_rlay_name;
|
||||
string b_rview_name;
|
||||
|
||||
string last_status;
|
||||
string last_error;
|
||||
@@ -108,6 +109,8 @@ protected:
|
||||
void builtin_image_info(const string &builtin_name, void *builtin_data, bool &is_float, int &width, int &height, int &depth, int &channels);
|
||||
bool builtin_image_pixels(const string &builtin_name, void *builtin_data, unsigned char *pixels);
|
||||
bool builtin_image_float_pixels(const string &builtin_name, void *builtin_data, float *pixels);
|
||||
|
||||
void clear_blender_database();
|
||||
};
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
@@ -22,6 +22,7 @@
|
||||
#include "scene.h"
|
||||
#include "shader.h"
|
||||
|
||||
#include "blender_texture.h"
|
||||
#include "blender_sync.h"
|
||||
#include "blender_util.h"
|
||||
|
||||
@@ -106,7 +107,7 @@ static ShaderSocketType convert_socket_type(BL::NodeSocket b_socket)
|
||||
}
|
||||
}
|
||||
|
||||
static void set_default_value(ShaderInput *input, BL::Node b_node, BL::NodeSocket b_sock, BL::BlendData b_data, BL::ID b_id)
|
||||
static void set_default_value(ShaderInput *input, BL::NodeSocket b_sock, BL::BlendData b_data, BL::ID b_id)
|
||||
{
|
||||
/* copy values for non linked inputs */
|
||||
switch(input->type) {
|
||||
@@ -179,53 +180,59 @@ static bool is_output_node(BL::Node b_node)
|
||||
|| b_node.is_a(&RNA_ShaderNodeOutputLamp));
|
||||
}
|
||||
|
||||
static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scene, ShaderGraph *graph, BL::ShaderNodeTree b_ntree, BL::ShaderNode b_node)
|
||||
static ShaderNode *add_node(Scene *scene,
|
||||
BL::RenderEngine b_engine,
|
||||
BL::BlendData b_data,
|
||||
BL::Scene b_scene,
|
||||
ShaderGraph *graph,
|
||||
BL::ShaderNodeTree b_ntree,
|
||||
BL::ShaderNode b_node)
|
||||
{
|
||||
ShaderNode *node = NULL;
|
||||
|
||||
/* existing blender nodes */
|
||||
if (b_node.is_a(&RNA_ShaderNodeRGBCurve)) {
|
||||
if(b_node.is_a(&RNA_ShaderNodeRGBCurve)) {
|
||||
BL::ShaderNodeRGBCurve b_curve_node(b_node);
|
||||
RGBCurvesNode *curves = new RGBCurvesNode();
|
||||
curvemapping_color_to_array(b_curve_node.mapping(), curves->curves, RAMP_TABLE_SIZE, true);
|
||||
node = curves;
|
||||
}
|
||||
if (b_node.is_a(&RNA_ShaderNodeVectorCurve)) {
|
||||
if(b_node.is_a(&RNA_ShaderNodeVectorCurve)) {
|
||||
BL::ShaderNodeVectorCurve b_curve_node(b_node);
|
||||
VectorCurvesNode *curves = new VectorCurvesNode();
|
||||
curvemapping_color_to_array(b_curve_node.mapping(), curves->curves, RAMP_TABLE_SIZE, false);
|
||||
node = curves;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeValToRGB)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeValToRGB)) {
|
||||
RGBRampNode *ramp = new RGBRampNode();
|
||||
BL::ShaderNodeValToRGB b_ramp_node(b_node);
|
||||
colorramp_to_array(b_ramp_node.color_ramp(), ramp->ramp, RAMP_TABLE_SIZE);
|
||||
ramp->interpolate = b_ramp_node.color_ramp().interpolation() != BL::ColorRamp::interpolation_CONSTANT;
|
||||
node = ramp;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeRGB)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeRGB)) {
|
||||
ColorNode *color = new ColorNode();
|
||||
color->value = get_node_output_rgba(b_node, "Color");
|
||||
node = color;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeValue)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeValue)) {
|
||||
ValueNode *value = new ValueNode();
|
||||
value->value = get_node_output_value(b_node, "Value");
|
||||
node = value;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeCameraData)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeCameraData)) {
|
||||
node = new CameraNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeInvert)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeInvert)) {
|
||||
node = new InvertNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeGamma)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeGamma)) {
|
||||
node = new GammaNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeBrightContrast)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeBrightContrast)) {
|
||||
node = new BrightContrastNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeMixRGB)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeMixRGB)) {
|
||||
BL::ShaderNodeMixRGB b_mix_node(b_node);
|
||||
MixNode *mix = new MixNode();
|
||||
mix->type = MixNode::type_enum[b_mix_node.blend_type()];
|
||||
@@ -236,44 +243,44 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
mix->use_clamp = b_mix_node.use_clamp();
|
||||
node = mix;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeSeparateRGB)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeSeparateRGB)) {
|
||||
node = new SeparateRGBNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeCombineRGB)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeCombineRGB)) {
|
||||
node = new CombineRGBNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeSeparateHSV)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeSeparateHSV)) {
|
||||
node = new SeparateHSVNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeCombineHSV)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeCombineHSV)) {
|
||||
node = new CombineHSVNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeSeparateXYZ)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeSeparateXYZ)) {
|
||||
node = new SeparateXYZNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeCombineXYZ)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeCombineXYZ)) {
|
||||
node = new CombineXYZNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeHueSaturation)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeHueSaturation)) {
|
||||
node = new HSVNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeRGBToBW)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeRGBToBW)) {
|
||||
node = new ConvertNode(SHADER_SOCKET_COLOR, SHADER_SOCKET_FLOAT);
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeMath)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeMath)) {
|
||||
BL::ShaderNodeMath b_math_node(b_node);
|
||||
MathNode *math = new MathNode();
|
||||
math->type = MathNode::type_enum[b_math_node.operation()];
|
||||
math->use_clamp = b_math_node.use_clamp();
|
||||
node = math;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeVectorMath)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeVectorMath)) {
|
||||
BL::ShaderNodeVectorMath b_vector_math_node(b_node);
|
||||
VectorMathNode *vmath = new VectorMathNode();
|
||||
vmath->type = VectorMathNode::type_enum[b_vector_math_node.operation()];
|
||||
node = vmath;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeVectorTransform)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeVectorTransform)) {
|
||||
BL::ShaderNodeVectorTransform b_vector_transform_node(b_node);
|
||||
VectorTransformNode *vtransform = new VectorTransformNode();
|
||||
vtransform->type = VectorTransformNode::type_enum[b_vector_transform_node.type()];
|
||||
@@ -281,7 +288,7 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
vtransform->convert_to = VectorTransformNode::convert_space_enum[b_vector_transform_node.convert_to()];
|
||||
node = vtransform;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeNormal)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeNormal)) {
|
||||
BL::Node::outputs_iterator out_it;
|
||||
b_node.outputs.begin(out_it);
|
||||
|
||||
@@ -289,7 +296,7 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
norm->direction = get_node_output_vector(b_node, "Normal");
|
||||
node = norm;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeMapping)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeMapping)) {
|
||||
BL::ShaderNodeMapping b_mapping_node(b_node);
|
||||
MappingNode *mapping = new MappingNode();
|
||||
|
||||
@@ -297,31 +304,31 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
|
||||
node = mapping;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeFresnel)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeFresnel)) {
|
||||
node = new FresnelNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeLayerWeight)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeLayerWeight)) {
|
||||
node = new LayerWeightNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeAddShader)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeAddShader)) {
|
||||
node = new AddClosureNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeMixShader)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeMixShader)) {
|
||||
node = new MixClosureNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeAttribute)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeAttribute)) {
|
||||
BL::ShaderNodeAttribute b_attr_node(b_node);
|
||||
AttributeNode *attr = new AttributeNode();
|
||||
attr->attribute = b_attr_node.attribute_name();
|
||||
node = attr;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeBackground)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeBackground)) {
|
||||
node = new BackgroundNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeHoldout)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeHoldout)) {
|
||||
node = new HoldoutNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeBsdfAnisotropic)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeBsdfAnisotropic)) {
|
||||
BL::ShaderNodeBsdfAnisotropic b_aniso_node(b_node);
|
||||
AnisotropicBsdfNode *aniso = new AnisotropicBsdfNode();
|
||||
|
||||
@@ -340,10 +347,10 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
|
||||
node = aniso;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeBsdfDiffuse)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeBsdfDiffuse)) {
|
||||
node = new DiffuseBsdfNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeSubsurfaceScattering)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeSubsurfaceScattering)) {
|
||||
BL::ShaderNodeSubsurfaceScattering b_subsurface_node(b_node);
|
||||
|
||||
SubsurfaceScatteringNode *subsurface = new SubsurfaceScatteringNode();
|
||||
@@ -359,7 +366,7 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
|
||||
node = subsurface;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeBsdfGlossy)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeBsdfGlossy)) {
|
||||
BL::ShaderNodeBsdfGlossy b_glossy_node(b_node);
|
||||
GlossyBsdfNode *glossy = new GlossyBsdfNode();
|
||||
|
||||
@@ -379,7 +386,7 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
}
|
||||
node = glossy;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeBsdfGlass)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeBsdfGlass)) {
|
||||
BL::ShaderNodeBsdfGlass b_glass_node(b_node);
|
||||
GlassBsdfNode *glass = new GlassBsdfNode();
|
||||
switch(b_glass_node.distribution()) {
|
||||
@@ -395,7 +402,7 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
}
|
||||
node = glass;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeBsdfRefraction)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeBsdfRefraction)) {
|
||||
BL::ShaderNodeBsdfRefraction b_refraction_node(b_node);
|
||||
RefractionBsdfNode *refraction = new RefractionBsdfNode();
|
||||
switch(b_refraction_node.distribution()) {
|
||||
@@ -411,7 +418,7 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
}
|
||||
node = refraction;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeBsdfToon)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeBsdfToon)) {
|
||||
BL::ShaderNodeBsdfToon b_toon_node(b_node);
|
||||
ToonBsdfNode *toon = new ToonBsdfNode();
|
||||
switch(b_toon_node.component()) {
|
||||
@@ -424,7 +431,7 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
}
|
||||
node = toon;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeBsdfHair)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeBsdfHair)) {
|
||||
BL::ShaderNodeBsdfHair b_hair_node(b_node);
|
||||
HairBsdfNode *hair = new HairBsdfNode();
|
||||
switch(b_hair_node.component()) {
|
||||
@@ -437,64 +444,64 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
}
|
||||
node = hair;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeBsdfTranslucent)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeBsdfTranslucent)) {
|
||||
node = new TranslucentBsdfNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeBsdfTransparent)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeBsdfTransparent)) {
|
||||
node = new TransparentBsdfNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeBsdfVelvet)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeBsdfVelvet)) {
|
||||
node = new VelvetBsdfNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeEmission)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeEmission)) {
|
||||
node = new EmissionNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeAmbientOcclusion)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeAmbientOcclusion)) {
|
||||
node = new AmbientOcclusionNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeVolumeScatter)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeVolumeScatter)) {
|
||||
node = new ScatterVolumeNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeVolumeAbsorption)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeVolumeAbsorption)) {
|
||||
node = new AbsorptionVolumeNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeNewGeometry)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeNewGeometry)) {
|
||||
node = new GeometryNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeWireframe)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeWireframe)) {
|
||||
BL::ShaderNodeWireframe b_wireframe_node(b_node);
|
||||
WireframeNode *wire = new WireframeNode();
|
||||
wire->use_pixel_size = b_wireframe_node.use_pixel_size();
|
||||
node = wire;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeWavelength)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeWavelength)) {
|
||||
node = new WavelengthNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeBlackbody)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeBlackbody)) {
|
||||
node = new BlackbodyNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeLightPath)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeLightPath)) {
|
||||
node = new LightPathNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeLightFalloff)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeLightFalloff)) {
|
||||
node = new LightFalloffNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeObjectInfo)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeObjectInfo)) {
|
||||
node = new ObjectInfoNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeParticleInfo)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeParticleInfo)) {
|
||||
node = new ParticleInfoNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeHairInfo)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeHairInfo)) {
|
||||
node = new HairInfoNode();
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeBump)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeBump)) {
|
||||
BL::ShaderNodeBump b_bump_node(b_node);
|
||||
BumpNode *bump = new BumpNode();
|
||||
bump->invert = b_bump_node.invert();
|
||||
node = bump;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeScript)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeScript)) {
|
||||
#ifdef WITH_OSL
|
||||
if(scene->shader_manager->use_osl()) {
|
||||
/* create script node */
|
||||
@@ -510,16 +517,16 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
* Socket names must be stored in the extra lists instead. */
|
||||
BL::Node::inputs_iterator b_input;
|
||||
|
||||
for (b_script_node.inputs.begin(b_input); b_input != b_script_node.inputs.end(); ++b_input) {
|
||||
for(b_script_node.inputs.begin(b_input); b_input != b_script_node.inputs.end(); ++b_input) {
|
||||
script_node->input_names.push_back(ustring(b_input->name()));
|
||||
ShaderInput *input = script_node->add_input(script_node->input_names.back().c_str(),
|
||||
convert_socket_type(*b_input));
|
||||
set_default_value(input, b_node, *b_input, b_data, b_ntree);
|
||||
set_default_value(input, *b_input, b_data, b_ntree);
|
||||
}
|
||||
|
||||
BL::Node::outputs_iterator b_output;
|
||||
|
||||
for (b_script_node.outputs.begin(b_output); b_output != b_script_node.outputs.end(); ++b_output) {
|
||||
for(b_script_node.outputs.begin(b_output); b_output != b_script_node.outputs.end(); ++b_output) {
|
||||
script_node->output_names.push_back(ustring(b_output->name()));
|
||||
script_node->add_output(script_node->output_names.back().c_str(),
|
||||
convert_socket_type(*b_output));
|
||||
@@ -543,9 +550,12 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
|
||||
node = script_node;
|
||||
}
|
||||
#else
|
||||
(void)b_data;
|
||||
(void)b_ntree;
|
||||
#endif
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeTexImage)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeTexImage)) {
|
||||
BL::ShaderNodeTexImage b_image_node(b_node);
|
||||
BL::Image b_image(b_image_node.image());
|
||||
ImageTextureNode *image = new ImageTextureNode();
|
||||
@@ -555,7 +565,8 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
*/
|
||||
bool is_builtin = b_image.packed_file() ||
|
||||
b_image.source() == BL::Image::source_GENERATED ||
|
||||
b_image.source() == BL::Image::source_MOVIE;
|
||||
b_image.source() == BL::Image::source_MOVIE ||
|
||||
b_engine.is_preview();
|
||||
|
||||
if(is_builtin) {
|
||||
/* for builtin images we're using image datablock name to find an image to
|
||||
@@ -578,7 +589,7 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
image->use_alpha = b_image.use_alpha();
|
||||
|
||||
/* TODO(sergey): Does not work properly when we change builtin type. */
|
||||
if (b_image.is_updated()) {
|
||||
if(b_image.is_updated()) {
|
||||
scene->image_manager->tag_reload_image(image->filename,
|
||||
image->builtin_data,
|
||||
(InterpolationType)b_image_node.interpolation());
|
||||
@@ -591,14 +602,15 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
get_tex_mapping(&image->tex_mapping, b_image_node.texture_mapping());
|
||||
node = image;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeTexEnvironment)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeTexEnvironment)) {
|
||||
BL::ShaderNodeTexEnvironment b_env_node(b_node);
|
||||
BL::Image b_image(b_env_node.image());
|
||||
EnvironmentTextureNode *env = new EnvironmentTextureNode();
|
||||
if(b_image) {
|
||||
bool is_builtin = b_image.packed_file() ||
|
||||
b_image.source() == BL::Image::source_GENERATED ||
|
||||
b_image.source() == BL::Image::source_MOVIE;
|
||||
b_image.source() == BL::Image::source_MOVIE ||
|
||||
b_engine.is_preview();
|
||||
|
||||
if(is_builtin) {
|
||||
int scene_frame = b_scene.frame_current();
|
||||
@@ -615,7 +627,7 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
env->use_alpha = b_image.use_alpha();
|
||||
|
||||
/* TODO(sergey): Does not work properly when we change builtin type. */
|
||||
if (b_image.is_updated()) {
|
||||
if(b_image.is_updated()) {
|
||||
scene->image_manager->tag_reload_image(env->filename,
|
||||
env->builtin_data,
|
||||
INTERPOLATION_LINEAR);
|
||||
@@ -626,41 +638,41 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
get_tex_mapping(&env->tex_mapping, b_env_node.texture_mapping());
|
||||
node = env;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeTexGradient)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeTexGradient)) {
|
||||
BL::ShaderNodeTexGradient b_gradient_node(b_node);
|
||||
GradientTextureNode *gradient = new GradientTextureNode();
|
||||
gradient->type = GradientTextureNode::type_enum[(int)b_gradient_node.gradient_type()];
|
||||
get_tex_mapping(&gradient->tex_mapping, b_gradient_node.texture_mapping());
|
||||
node = gradient;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeTexVoronoi)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeTexVoronoi)) {
|
||||
BL::ShaderNodeTexVoronoi b_voronoi_node(b_node);
|
||||
VoronoiTextureNode *voronoi = new VoronoiTextureNode();
|
||||
voronoi->coloring = VoronoiTextureNode::coloring_enum[(int)b_voronoi_node.coloring()];
|
||||
get_tex_mapping(&voronoi->tex_mapping, b_voronoi_node.texture_mapping());
|
||||
node = voronoi;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeTexMagic)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeTexMagic)) {
|
||||
BL::ShaderNodeTexMagic b_magic_node(b_node);
|
||||
MagicTextureNode *magic = new MagicTextureNode();
|
||||
magic->depth = b_magic_node.turbulence_depth();
|
||||
get_tex_mapping(&magic->tex_mapping, b_magic_node.texture_mapping());
|
||||
node = magic;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeTexWave)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeTexWave)) {
|
||||
BL::ShaderNodeTexWave b_wave_node(b_node);
|
||||
WaveTextureNode *wave = new WaveTextureNode();
|
||||
wave->type = WaveTextureNode::type_enum[(int)b_wave_node.wave_type()];
|
||||
get_tex_mapping(&wave->tex_mapping, b_wave_node.texture_mapping());
|
||||
node = wave;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeTexChecker)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeTexChecker)) {
|
||||
BL::ShaderNodeTexChecker b_checker_node(b_node);
|
||||
CheckerTextureNode *checker = new CheckerTextureNode();
|
||||
get_tex_mapping(&checker->tex_mapping, b_checker_node.texture_mapping());
|
||||
node = checker;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeTexBrick)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeTexBrick)) {
|
||||
BL::ShaderNodeTexBrick b_brick_node(b_node);
|
||||
BrickTextureNode *brick = new BrickTextureNode();
|
||||
brick->offset = b_brick_node.offset();
|
||||
@@ -670,20 +682,20 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
get_tex_mapping(&brick->tex_mapping, b_brick_node.texture_mapping());
|
||||
node = brick;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeTexNoise)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeTexNoise)) {
|
||||
BL::ShaderNodeTexNoise b_noise_node(b_node);
|
||||
NoiseTextureNode *noise = new NoiseTextureNode();
|
||||
get_tex_mapping(&noise->tex_mapping, b_noise_node.texture_mapping());
|
||||
node = noise;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeTexMusgrave)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeTexMusgrave)) {
|
||||
BL::ShaderNodeTexMusgrave b_musgrave_node(b_node);
|
||||
MusgraveTextureNode *musgrave = new MusgraveTextureNode();
|
||||
musgrave->type = MusgraveTextureNode::type_enum[(int)b_musgrave_node.musgrave_type()];
|
||||
get_tex_mapping(&musgrave->tex_mapping, b_musgrave_node.texture_mapping());
|
||||
node = musgrave;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeTexCoord)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeTexCoord)) {
|
||||
BL::ShaderNodeTexCoord b_tex_coord_node(b_node);
|
||||
TextureCoordinateNode *tex_coord = new TextureCoordinateNode();
|
||||
tex_coord->from_dupli = b_tex_coord_node.from_dupli();
|
||||
@@ -693,7 +705,7 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
}
|
||||
node = tex_coord;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeTexSky)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeTexSky)) {
|
||||
BL::ShaderNodeTexSky b_sky_node(b_node);
|
||||
SkyTextureNode *sky = new SkyTextureNode();
|
||||
sky->type = SkyTextureNode::type_enum[(int)b_sky_node.sky_type()];
|
||||
@@ -703,14 +715,14 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
get_tex_mapping(&sky->tex_mapping, b_sky_node.texture_mapping());
|
||||
node = sky;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeNormalMap)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeNormalMap)) {
|
||||
BL::ShaderNodeNormalMap b_normal_map_node(b_node);
|
||||
NormalMapNode *nmap = new NormalMapNode();
|
||||
nmap->space = NormalMapNode::space_enum[(int)b_normal_map_node.space()];
|
||||
nmap->attribute = b_normal_map_node.uv_map();
|
||||
node = nmap;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeTangent)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeTangent)) {
|
||||
BL::ShaderNodeTangent b_tangent_node(b_node);
|
||||
TangentNode *tangent = new TangentNode();
|
||||
tangent->direction_type = TangentNode::direction_type_enum[(int)b_tangent_node.direction_type()];
|
||||
@@ -718,13 +730,41 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
tangent->attribute = b_tangent_node.uv_map();
|
||||
node = tangent;
|
||||
}
|
||||
else if (b_node.is_a(&RNA_ShaderNodeUVMap)) {
|
||||
else if(b_node.is_a(&RNA_ShaderNodeUVMap)) {
|
||||
BL::ShaderNodeUVMap b_uvmap_node(b_node);
|
||||
UVMapNode *uvm = new UVMapNode();
|
||||
uvm->attribute = b_uvmap_node.uv_map();
|
||||
uvm->from_dupli = b_uvmap_node.from_dupli();
|
||||
node = uvm;
|
||||
}
|
||||
else if(b_node.is_a(&RNA_ShaderNodeTexPointDensity)) {
|
||||
BL::ShaderNodeTexPointDensity b_point_density_node(b_node);
|
||||
PointDensityTextureNode *point_density = new PointDensityTextureNode();
|
||||
point_density->filename = b_point_density_node.name();
|
||||
point_density->space =
|
||||
PointDensityTextureNode::space_enum[(int)b_point_density_node.space()];
|
||||
point_density->interpolation =
|
||||
(InterpolationType)b_point_density_node.interpolation();
|
||||
point_density->builtin_data = b_point_density_node.ptr.data;
|
||||
|
||||
/* Transformation form world space to texture space. */
|
||||
BL::Object b_ob(b_point_density_node.object());
|
||||
if(b_ob) {
|
||||
float3 loc, size;
|
||||
point_density_texture_space(b_point_density_node, loc, size);
|
||||
point_density->tfm =
|
||||
transform_translate(-loc) * transform_scale(size) *
|
||||
transform_inverse(get_transform(b_ob.matrix_world()));
|
||||
}
|
||||
|
||||
/* TODO(sergey): Use more proper update flag. */
|
||||
if(true) {
|
||||
scene->image_manager->tag_reload_image(point_density->filename,
|
||||
point_density->builtin_data,
|
||||
point_density->interpolation);
|
||||
}
|
||||
node = point_density;
|
||||
}
|
||||
|
||||
if(node)
|
||||
graph->add(node);
|
||||
@@ -734,7 +774,7 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
|
||||
static bool node_use_modified_socket_name(ShaderNode *node)
|
||||
{
|
||||
if (node->special_type == SHADER_SPECIAL_TYPE_SCRIPT)
|
||||
if(node->special_type == SHADER_SPECIAL_TYPE_SCRIPT)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
@@ -744,14 +784,14 @@ static ShaderInput *node_find_input_by_name(ShaderNode *node, BL::Node b_node, B
|
||||
{
|
||||
string name = b_socket.name();
|
||||
|
||||
if (node_use_modified_socket_name(node)) {
|
||||
if(node_use_modified_socket_name(node)) {
|
||||
BL::Node::inputs_iterator b_input;
|
||||
bool found = false;
|
||||
int counter = 0, total = 0;
|
||||
|
||||
for (b_node.inputs.begin(b_input); b_input != b_node.inputs.end(); ++b_input) {
|
||||
if (b_input->name() == name) {
|
||||
if (!found)
|
||||
for(b_node.inputs.begin(b_input); b_input != b_node.inputs.end(); ++b_input) {
|
||||
if(b_input->name() == name) {
|
||||
if(!found)
|
||||
counter++;
|
||||
total++;
|
||||
}
|
||||
@@ -761,10 +801,10 @@ static ShaderInput *node_find_input_by_name(ShaderNode *node, BL::Node b_node, B
|
||||
}
|
||||
|
||||
/* rename if needed */
|
||||
if (name == "Shader")
|
||||
if(name == "Shader")
|
||||
name = "Closure";
|
||||
|
||||
if (total > 1)
|
||||
if(total > 1)
|
||||
name = string_printf("%s%d", name.c_str(), counter);
|
||||
}
|
||||
|
||||
@@ -775,14 +815,14 @@ static ShaderOutput *node_find_output_by_name(ShaderNode *node, BL::Node b_node,
|
||||
{
|
||||
string name = b_socket.name();
|
||||
|
||||
if (node_use_modified_socket_name(node)) {
|
||||
if(node_use_modified_socket_name(node)) {
|
||||
BL::Node::outputs_iterator b_output;
|
||||
bool found = false;
|
||||
int counter = 0, total = 0;
|
||||
|
||||
for (b_node.outputs.begin(b_output); b_output != b_node.outputs.end(); ++b_output) {
|
||||
if (b_output->name() == name) {
|
||||
if (!found)
|
||||
for(b_node.outputs.begin(b_output); b_output != b_node.outputs.end(); ++b_output) {
|
||||
if(b_output->name() == name) {
|
||||
if(!found)
|
||||
counter++;
|
||||
total++;
|
||||
}
|
||||
@@ -792,18 +832,24 @@ static ShaderOutput *node_find_output_by_name(ShaderNode *node, BL::Node b_node,
|
||||
}
|
||||
|
||||
/* rename if needed */
|
||||
if (name == "Shader")
|
||||
if(name == "Shader")
|
||||
name = "Closure";
|
||||
|
||||
if (total > 1)
|
||||
if(total > 1)
|
||||
name = string_printf("%s%d", name.c_str(), counter);
|
||||
}
|
||||
|
||||
return node->output(name.c_str());
|
||||
}
|
||||
|
||||
static void add_nodes(Scene *scene, BL::BlendData b_data, BL::Scene b_scene, ShaderGraph *graph, BL::ShaderNodeTree b_ntree,
|
||||
const ProxyMap &proxy_input_map, const ProxyMap &proxy_output_map)
|
||||
static void add_nodes(Scene *scene,
|
||||
BL::RenderEngine b_engine,
|
||||
BL::BlendData b_data,
|
||||
BL::Scene b_scene,
|
||||
ShaderGraph *graph,
|
||||
BL::ShaderNodeTree b_ntree,
|
||||
const ProxyMap &proxy_input_map,
|
||||
const ProxyMap &proxy_output_map)
|
||||
{
|
||||
/* add nodes */
|
||||
BL::ShaderNodeTree::nodes_iterator b_node;
|
||||
@@ -818,7 +864,7 @@ static void add_nodes(Scene *scene, BL::BlendData b_data, BL::Scene b_scene, Sha
|
||||
BL::ShaderNode output_node(PointerRNA_NULL);
|
||||
|
||||
for(b_ntree.nodes.begin(b_node); b_node != b_ntree.nodes.end(); ++b_node) {
|
||||
if (is_output_node(*b_node)) {
|
||||
if(is_output_node(*b_node)) {
|
||||
BL::ShaderNodeOutputMaterial b_output_node(*b_node);
|
||||
|
||||
if(b_output_node.is_active_output()) {
|
||||
@@ -834,10 +880,10 @@ static void add_nodes(Scene *scene, BL::BlendData b_data, BL::Scene b_scene, Sha
|
||||
|
||||
/* add nodes */
|
||||
for(b_ntree.nodes.begin(b_node); b_node != b_ntree.nodes.end(); ++b_node) {
|
||||
if (b_node->mute() || b_node->is_a(&RNA_NodeReroute)) {
|
||||
if(b_node->mute() || b_node->is_a(&RNA_NodeReroute)) {
|
||||
/* replace muted node with internal links */
|
||||
BL::Node::internal_links_iterator b_link;
|
||||
for (b_node->internal_links.begin(b_link); b_link != b_node->internal_links.end(); ++b_link) {
|
||||
for(b_node->internal_links.begin(b_link); b_link != b_node->internal_links.end(); ++b_link) {
|
||||
ProxyNode *proxy = new ProxyNode(convert_socket_type(b_link->to_socket()));
|
||||
|
||||
input_map[b_link->from_socket().ptr.data] = proxy->inputs[0];
|
||||
@@ -846,10 +892,10 @@ static void add_nodes(Scene *scene, BL::BlendData b_data, BL::Scene b_scene, Sha
|
||||
graph->add(proxy);
|
||||
}
|
||||
}
|
||||
else if (b_node->is_a(&RNA_ShaderNodeGroup) || b_node->is_a(&RNA_NodeCustomGroup)) {
|
||||
else if(b_node->is_a(&RNA_ShaderNodeGroup) || b_node->is_a(&RNA_NodeCustomGroup)) {
|
||||
|
||||
BL::ShaderNodeTree b_group_ntree(PointerRNA_NULL);
|
||||
if (b_node->is_a(&RNA_ShaderNodeGroup))
|
||||
if(b_node->is_a(&RNA_ShaderNodeGroup))
|
||||
b_group_ntree = BL::ShaderNodeTree(((BL::NodeGroup)(*b_node)).node_tree());
|
||||
else
|
||||
b_group_ntree = BL::ShaderNodeTree(((BL::NodeCustomGroup)(*b_node)).node_tree());
|
||||
@@ -868,7 +914,7 @@ static void add_nodes(Scene *scene, BL::BlendData b_data, BL::Scene b_scene, Sha
|
||||
|
||||
input_map[b_input->ptr.data] = proxy->inputs[0];
|
||||
|
||||
set_default_value(proxy->inputs[0], *b_node, *b_input, b_data, b_ntree);
|
||||
set_default_value(proxy->inputs[0], *b_input, b_data, b_ntree);
|
||||
}
|
||||
for(b_node->outputs.begin(b_output); b_output != b_node->outputs.end(); ++b_output) {
|
||||
ProxyNode *proxy = new ProxyNode(convert_socket_type(*b_output));
|
||||
@@ -880,33 +926,41 @@ static void add_nodes(Scene *scene, BL::BlendData b_data, BL::Scene b_scene, Sha
|
||||
output_map[b_output->ptr.data] = proxy->outputs[0];
|
||||
}
|
||||
|
||||
if (b_group_ntree)
|
||||
add_nodes(scene, b_data, b_scene, graph, b_group_ntree, group_proxy_input_map, group_proxy_output_map);
|
||||
if(b_group_ntree) {
|
||||
add_nodes(scene,
|
||||
b_engine,
|
||||
b_data,
|
||||
b_scene,
|
||||
graph,
|
||||
b_group_ntree,
|
||||
group_proxy_input_map,
|
||||
group_proxy_output_map);
|
||||
}
|
||||
}
|
||||
else if (b_node->is_a(&RNA_NodeGroupInput)) {
|
||||
else if(b_node->is_a(&RNA_NodeGroupInput)) {
|
||||
/* map each socket to a proxy node */
|
||||
for(b_node->outputs.begin(b_output); b_output != b_node->outputs.end(); ++b_output) {
|
||||
ProxyMap::const_iterator proxy_it = proxy_input_map.find(b_output->identifier());
|
||||
if (proxy_it != proxy_input_map.end()) {
|
||||
if(proxy_it != proxy_input_map.end()) {
|
||||
ProxyNode *proxy = proxy_it->second;
|
||||
|
||||
output_map[b_output->ptr.data] = proxy->outputs[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (b_node->is_a(&RNA_NodeGroupOutput)) {
|
||||
else if(b_node->is_a(&RNA_NodeGroupOutput)) {
|
||||
BL::NodeGroupOutput b_output_node(*b_node);
|
||||
/* only the active group output is used */
|
||||
if (b_output_node.is_active_output()) {
|
||||
if(b_output_node.is_active_output()) {
|
||||
/* map each socket to a proxy node */
|
||||
for(b_node->inputs.begin(b_input); b_input != b_node->inputs.end(); ++b_input) {
|
||||
ProxyMap::const_iterator proxy_it = proxy_output_map.find(b_input->identifier());
|
||||
if (proxy_it != proxy_output_map.end()) {
|
||||
if(proxy_it != proxy_output_map.end()) {
|
||||
ProxyNode *proxy = proxy_it->second;
|
||||
|
||||
input_map[b_input->ptr.data] = proxy->inputs[0];
|
||||
|
||||
set_default_value(proxy->inputs[0], *b_node, *b_input, b_data, b_ntree);
|
||||
set_default_value(proxy->inputs[0], *b_input, b_data, b_ntree);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -914,30 +968,36 @@ static void add_nodes(Scene *scene, BL::BlendData b_data, BL::Scene b_scene, Sha
|
||||
else {
|
||||
ShaderNode *node = NULL;
|
||||
|
||||
if (is_output_node(*b_node)) {
|
||||
if (b_node->ptr.data == output_node.ptr.data) {
|
||||
if(is_output_node(*b_node)) {
|
||||
if(b_node->ptr.data == output_node.ptr.data) {
|
||||
node = graph->output();
|
||||
}
|
||||
}
|
||||
else {
|
||||
node = add_node(scene, b_data, b_scene, graph, b_ntree, BL::ShaderNode(*b_node));
|
||||
node = add_node(scene,
|
||||
b_engine,
|
||||
b_data,
|
||||
b_scene,
|
||||
graph,
|
||||
b_ntree,
|
||||
BL::ShaderNode(*b_node));
|
||||
}
|
||||
|
||||
if(node) {
|
||||
/* map node sockets for linking */
|
||||
for(b_node->inputs.begin(b_input); b_input != b_node->inputs.end(); ++b_input) {
|
||||
ShaderInput *input = node_find_input_by_name(node, *b_node, *b_input);
|
||||
if (!input) {
|
||||
if(!input) {
|
||||
/* XXX should not happen, report error? */
|
||||
continue;
|
||||
}
|
||||
input_map[b_input->ptr.data] = input;
|
||||
|
||||
set_default_value(input, *b_node, *b_input, b_data, b_ntree);
|
||||
set_default_value(input, *b_input, b_data, b_ntree);
|
||||
}
|
||||
for(b_node->outputs.begin(b_output); b_output != b_node->outputs.end(); ++b_output) {
|
||||
ShaderOutput *output = node_find_output_by_name(node, *b_node, *b_output);
|
||||
if (!output) {
|
||||
if(!output) {
|
||||
/* XXX should not happen, report error? */
|
||||
continue;
|
||||
}
|
||||
@@ -951,6 +1011,10 @@ static void add_nodes(Scene *scene, BL::BlendData b_data, BL::Scene b_scene, Sha
|
||||
BL::NodeTree::links_iterator b_link;
|
||||
|
||||
for(b_ntree.links.begin(b_link); b_link != b_ntree.links.end(); ++b_link) {
|
||||
/* Ignore invalid links to avoid unwanted cycles created in graph. */
|
||||
if(!b_link->is_valid()) {
|
||||
continue;
|
||||
}
|
||||
/* get blender link data */
|
||||
BL::NodeSocket b_from_sock = b_link->from_socket();
|
||||
BL::NodeSocket b_to_sock = b_link->to_socket();
|
||||
@@ -959,10 +1023,10 @@ static void add_nodes(Scene *scene, BL::BlendData b_data, BL::Scene b_scene, Sha
|
||||
ShaderInput *input = 0;
|
||||
|
||||
PtrOutputMap::iterator output_it = output_map.find(b_from_sock.ptr.data);
|
||||
if (output_it != output_map.end())
|
||||
if(output_it != output_map.end())
|
||||
output = output_it->second;
|
||||
PtrInputMap::iterator input_it = input_map.find(b_to_sock.ptr.data);
|
||||
if (input_it != input_map.end())
|
||||
if(input_it != input_map.end())
|
||||
input = input_it->second;
|
||||
|
||||
/* either node may be NULL when the node was not exported, typically
|
||||
@@ -972,10 +1036,22 @@ static void add_nodes(Scene *scene, BL::BlendData b_data, BL::Scene b_scene, Sha
|
||||
}
|
||||
}
|
||||
|
||||
static void add_nodes(Scene *scene, BL::BlendData b_data, BL::Scene b_scene, ShaderGraph *graph, BL::ShaderNodeTree b_ntree)
|
||||
static void add_nodes(Scene *scene,
|
||||
BL::RenderEngine b_engine,
|
||||
BL::BlendData b_data,
|
||||
BL::Scene b_scene,
|
||||
ShaderGraph *graph,
|
||||
BL::ShaderNodeTree b_ntree)
|
||||
{
|
||||
static const ProxyMap empty_proxy_map;
|
||||
add_nodes(scene, b_data, b_scene, graph, b_ntree, empty_proxy_map, empty_proxy_map);
|
||||
add_nodes(scene,
|
||||
b_engine,
|
||||
b_data,
|
||||
b_scene,
|
||||
graph,
|
||||
b_ntree,
|
||||
empty_proxy_map,
|
||||
empty_proxy_map);
|
||||
}
|
||||
|
||||
/* Sync Materials */
|
||||
@@ -1001,7 +1077,7 @@ void BlenderSync::sync_materials(bool update_all)
|
||||
if(b_mat->use_nodes() && b_mat->node_tree()) {
|
||||
BL::ShaderNodeTree b_ntree(b_mat->node_tree());
|
||||
|
||||
add_nodes(scene, b_data, b_scene, graph, b_ntree);
|
||||
add_nodes(scene, b_engine, b_data, b_scene, graph, b_ntree);
|
||||
}
|
||||
else {
|
||||
ShaderNode *closure, *out;
|
||||
@@ -1044,7 +1120,7 @@ void BlenderSync::sync_world(bool update_all)
|
||||
if(b_world && b_world.use_nodes() && b_world.node_tree()) {
|
||||
BL::ShaderNodeTree b_ntree(b_world.node_tree());
|
||||
|
||||
add_nodes(scene, b_data, b_scene, graph, b_ntree);
|
||||
add_nodes(scene, b_engine, b_data, b_scene, graph, b_ntree);
|
||||
|
||||
/* volume */
|
||||
PointerRNA cworld = RNA_pointer_get(&b_world.ptr, "cycles");
|
||||
@@ -1130,7 +1206,7 @@ void BlenderSync::sync_lamps(bool update_all)
|
||||
|
||||
BL::ShaderNodeTree b_ntree(b_lamp->node_tree());
|
||||
|
||||
add_nodes(scene, b_data, b_scene, graph, b_ntree);
|
||||
add_nodes(scene, b_engine, b_data, b_scene, graph, b_ntree);
|
||||
}
|
||||
else {
|
||||
ShaderNode *closure, *out;
|
||||
|
@@ -36,6 +36,7 @@
|
||||
#include "util_debug.h"
|
||||
#include "util_foreach.h"
|
||||
#include "util_opengl.h"
|
||||
#include "util_hash.h"
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
@@ -111,7 +112,7 @@ bool BlenderSync::sync_recalc()
|
||||
|
||||
if(b_ob->is_updated_data()) {
|
||||
BL::Object::particle_systems_iterator b_psys;
|
||||
for (b_ob->particle_systems.begin(b_psys); b_psys != b_ob->particle_systems.end(); ++b_psys)
|
||||
for(b_ob->particle_systems.begin(b_psys); b_psys != b_ob->particle_systems.end(); ++b_psys)
|
||||
particle_system_map.set_recalc(*b_ob);
|
||||
}
|
||||
}
|
||||
@@ -150,6 +151,7 @@ void BlenderSync::sync_data(BL::SpaceView3D b_v3d, BL::Object b_override, void *
|
||||
sync_integrator();
|
||||
sync_film();
|
||||
sync_shaders();
|
||||
sync_images();
|
||||
sync_curve_settings();
|
||||
|
||||
mesh_synced.clear(); /* use for objects and motion sync */
|
||||
@@ -194,6 +196,9 @@ void BlenderSync::sync_integrator()
|
||||
integrator->filter_glossy = get_float(cscene, "blur_glossy");
|
||||
|
||||
integrator->seed = get_int(cscene, "seed");
|
||||
if(get_boolean(cscene, "use_animated_seed"))
|
||||
integrator->seed = hash_int_2d(b_scene.frame_current(), get_int(cscene, "seed"));
|
||||
|
||||
integrator->sampling_pattern = (SamplingPattern)RNA_enum_get(&cscene, "sampling_pattern");
|
||||
|
||||
integrator->layer_flag = render_layer.layer;
|
||||
@@ -360,6 +365,39 @@ void BlenderSync::sync_render_layers(BL::SpaceView3D b_v3d, const char *layer)
|
||||
}
|
||||
}
|
||||
|
||||
/* Images */
|
||||
void BlenderSync::sync_images()
|
||||
{
|
||||
/* Sync is a convention for this API, but currently it frees unused buffers. */
|
||||
|
||||
const bool is_interface_locked = b_engine.render() &&
|
||||
b_engine.render().use_lock_interface();
|
||||
if(is_interface_locked == false && BlenderSession::headless == false) {
|
||||
/* If interface is not locked, it's possible image is needed for
|
||||
* the display.
|
||||
*/
|
||||
return;
|
||||
}
|
||||
/* Free buffers used by images which are not needed for render. */
|
||||
BL::BlendData::images_iterator b_image;
|
||||
for(b_data.images.begin(b_image);
|
||||
b_image != b_data.images.end();
|
||||
++b_image)
|
||||
{
|
||||
/* TODO(sergey): Consider making it an utility function to check
|
||||
* whether image is considered builtin.
|
||||
*/
|
||||
const bool is_builtin = b_image->packed_file() ||
|
||||
b_image->source() == BL::Image::source_GENERATED ||
|
||||
b_image->source() == BL::Image::source_MOVIE ||
|
||||
b_engine.is_preview();
|
||||
if(is_builtin == false) {
|
||||
b_image->buffers_free();
|
||||
}
|
||||
/* TODO(sergey): Free builtin images not used by any shader. */
|
||||
}
|
||||
}
|
||||
|
||||
/* Scene Parameters */
|
||||
|
||||
SceneParams BlenderSync::get_scene_params(BL::Scene b_scene, bool background, bool is_cpu)
|
||||
@@ -397,6 +435,8 @@ SceneParams BlenderSync::get_scene_params(BL::Scene b_scene, bool background, bo
|
||||
params.use_qbvh = false;
|
||||
}
|
||||
|
||||
params.use_bvh_triangle_storage = RNA_boolean_get(&cscene, "debug_use_triangle_storage");
|
||||
|
||||
return params;
|
||||
}
|
||||
|
||||
|
@@ -68,7 +68,7 @@ public:
|
||||
BL::Scene b_scene,
|
||||
bool background);
|
||||
static bool get_session_pause(BL::Scene b_scene, bool background);
|
||||
static BufferParams get_buffer_params(BL::RenderSettings b_render, BL::Scene b_scene, BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, Camera *cam, int width, int height);
|
||||
static BufferParams get_buffer_params(BL::RenderSettings b_render, BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, Camera *cam, int width, int height);
|
||||
|
||||
private:
|
||||
/* sync */
|
||||
@@ -83,18 +83,30 @@ private:
|
||||
void sync_curve_settings();
|
||||
|
||||
void sync_nodes(Shader *shader, BL::ShaderNodeTree b_ntree);
|
||||
Mesh *sync_mesh(BL::Object b_ob, bool object_updated, bool hide_tris);
|
||||
void sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_ob, bool motion, int time_index = 0);
|
||||
Object *sync_object(BL::Object b_parent, int persistent_id[OBJECT_PERSISTENT_ID_SIZE], BL::DupliObject b_dupli_ob,
|
||||
Transform& tfm, uint layer_flag, float motion_time, bool hide_tris);
|
||||
void sync_light(BL::Object b_parent, int persistent_id[OBJECT_PERSISTENT_ID_SIZE], BL::Object b_ob, Transform& tfm);
|
||||
void sync_background_light();
|
||||
void sync_mesh_motion(BL::Object b_ob, Object *object, float motion_time);
|
||||
Mesh *sync_mesh(BL::Object b_parent, bool object_updated, bool hide_tris, BL::DupliObject b_dupli_ob = PointerRNA_NULL);
|
||||
void sync_curves(Mesh *mesh, BL::Mesh b_mesh, BL::Object b_parent, bool motion, int time_index = 0, BL::DupliObject b_dupli_ob = PointerRNA_NULL);
|
||||
Object *sync_object(BL::Object b_parent,
|
||||
int persistent_id[OBJECT_PERSISTENT_ID_SIZE],
|
||||
BL::DupliObject b_dupli_ob,
|
||||
Transform& tfm,
|
||||
uint layer_flag,
|
||||
float motion_time,
|
||||
bool hide_tris,
|
||||
bool use_camera_cull,
|
||||
float camera_cull_margin,
|
||||
bool *use_portal);
|
||||
void sync_light(BL::Object b_parent, int persistent_id[OBJECT_PERSISTENT_ID_SIZE], BL::Object b_ob, Transform& tfm, bool *use_portal);
|
||||
void sync_background_light(bool use_portal);
|
||||
void sync_mesh_motion(BL::Object b_parent, Object *object, float motion_time, BL::DupliObject b_dupli_ob = PointerRNA_NULL);
|
||||
|
||||
void sync_camera_motion(BL::Object b_ob, float motion_time);
|
||||
|
||||
/* particles */
|
||||
bool sync_dupli_particle(BL::Object b_ob, BL::DupliObject b_dup, Object *object);
|
||||
|
||||
/* Images. */
|
||||
void sync_images();
|
||||
|
||||
/* util */
|
||||
void find_shader(BL::ID id, vector<uint>& used_shaders, int default_shader);
|
||||
bool BKE_object_is_modified(BL::Object b_ob);
|
||||
@@ -108,7 +120,7 @@ private:
|
||||
|
||||
id_map<void*, Shader> shader_map;
|
||||
id_map<ObjectKey, Object> object_map;
|
||||
id_map<void*, Mesh> mesh_map;
|
||||
id_map<MeshKey, Mesh> mesh_map;
|
||||
id_map<ObjectKey, Light> light_map;
|
||||
id_map<ParticleSystemKey, ParticleSystem> particle_system_map;
|
||||
set<Mesh*> mesh_synced;
|
||||
|
116
intern/cycles/blender/blender_texture.cpp
Normal file
116
intern/cycles/blender/blender_texture.cpp
Normal file
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
* Copyright 2011-2015 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.
|
||||
*/
|
||||
|
||||
#include "blender_texture.h"
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
namespace {
|
||||
|
||||
/* Point density helpers. */
|
||||
|
||||
static void density_texture_space_invert(float3& loc,
|
||||
float3& size)
|
||||
{
|
||||
if(size.x != 0.0f) size.x = 0.5f/size.x;
|
||||
if(size.y != 0.0f) size.y = 0.5f/size.y;
|
||||
if(size.z != 0.0f) size.z = 0.5f/size.z;
|
||||
|
||||
loc = loc*size - make_float3(0.5f, 0.5f, 0.5f);
|
||||
}
|
||||
|
||||
static void density_object_texture_space(BL::Object b_ob,
|
||||
float radius,
|
||||
float3& loc,
|
||||
float3& size)
|
||||
{
|
||||
if(b_ob.type() == BL::Object::type_MESH) {
|
||||
BL::Mesh b_mesh(b_ob.data());
|
||||
loc = get_float3(b_mesh.texspace_location());
|
||||
size = get_float3(b_mesh.texspace_size());
|
||||
}
|
||||
else {
|
||||
/* TODO(sergey): Not supported currently. */
|
||||
}
|
||||
/* Adjust texture space to include density points on the boundaries. */
|
||||
size = size + make_float3(radius, radius, radius);
|
||||
density_texture_space_invert(loc, size);
|
||||
}
|
||||
|
||||
static void density_particle_system_texture_space(
|
||||
BL::Object b_ob,
|
||||
BL::ParticleSystem b_particle_system,
|
||||
float radius,
|
||||
float3& loc,
|
||||
float3& size)
|
||||
{
|
||||
if(b_particle_system.settings().type() == BL::ParticleSettings::type_HAIR) {
|
||||
/* TODO(sergey): Not supported currently. */
|
||||
return;
|
||||
}
|
||||
Transform tfm = get_transform(b_ob.matrix_world());
|
||||
Transform itfm = transform_inverse(tfm);
|
||||
float3 min = make_float3(FLT_MAX, FLT_MAX, FLT_MAX),
|
||||
max = make_float3(-FLT_MAX, -FLT_MAX, -FLT_MAX);
|
||||
float3 particle_size = make_float3(radius, radius, radius);
|
||||
for(int i = 0; i < b_particle_system.particles.length(); ++i) {
|
||||
BL::Particle particle = b_particle_system.particles[i];
|
||||
float3 location = get_float3(particle.location());
|
||||
location = transform_point(&itfm, location);
|
||||
min = ccl::min(min, location - particle_size);
|
||||
max = ccl::max(max, location + particle_size);
|
||||
}
|
||||
/* Calculate texture space from the particle bounds. */
|
||||
loc = (min + max) * 0.5f;
|
||||
size = (max - min) * 0.5f;
|
||||
density_texture_space_invert(loc, size);
|
||||
}
|
||||
|
||||
} /* namespace */
|
||||
|
||||
void point_density_texture_space(BL::ShaderNodeTexPointDensity b_point_density_node,
|
||||
float3& loc,
|
||||
float3& size)
|
||||
{
|
||||
/* Fallback values. */
|
||||
loc = make_float3(0.0f, 0.0f, 0.0f);
|
||||
size = make_float3(0.0f, 0.0f, 0.0f);
|
||||
BL::Object b_ob(b_point_density_node.object());
|
||||
if(!b_ob) {
|
||||
return;
|
||||
}
|
||||
if(b_point_density_node.point_source() ==
|
||||
BL::ShaderNodeTexPointDensity::point_source_PARTICLE_SYSTEM)
|
||||
{
|
||||
BL::ParticleSystem b_particle_system(
|
||||
b_point_density_node.particle_system());
|
||||
if(b_particle_system) {
|
||||
density_particle_system_texture_space(b_ob,
|
||||
b_particle_system,
|
||||
b_point_density_node.radius(),
|
||||
loc,
|
||||
size);
|
||||
}
|
||||
}
|
||||
else {
|
||||
density_object_texture_space(b_ob,
|
||||
b_point_density_node.radius(),
|
||||
loc,
|
||||
size);
|
||||
}
|
||||
}
|
||||
|
||||
CCL_NAMESPACE_END
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2011-2013 Blender Foundation
|
||||
* Copyright 2011-2015 Blender Foundation
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -14,15 +14,18 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef __BLACKBODY_H__
|
||||
#define __BLACKBODY_H__
|
||||
#ifndef __BLENDER_TEXTURE_H__
|
||||
#define __BLENDER_TEXTURE_H__
|
||||
|
||||
#include "util_vector.h"
|
||||
#include <stdlib.h>
|
||||
#include "blender_sync.h"
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
vector<float> blackbody_table_build();
|
||||
void point_density_texture_space(BL::ShaderNodeTexPointDensity b_point_density_node,
|
||||
float3& loc,
|
||||
float3& size);
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
||||
#endif /* __BLACKBODY_H__ */
|
||||
#endif /* __BLENDER_TEXTURE_H__ */
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user