forked from bartvdbraak/blender
svn merge -r41723:41751 ^/trunk/blender
This commit is contained in:
commit
eadb192986
@ -214,8 +214,10 @@ endif()
|
||||
option(WITH_PYTHON_INSTALL "Copy system python into the blender install folder" ON)
|
||||
|
||||
# Cycles
|
||||
option(WITH_CYCLES "Enable Cycles Render Engine" OFF)
|
||||
OPTION(WITH_CYCLES_TEST "Build cycles test application" OFF)
|
||||
option(WITH_CYCLES "Enable cycles Render Engine" OFF)
|
||||
option(WITH_CYCLES_TEST "Build cycles test application" OFF)
|
||||
option(WITH_CYCLES_CUDA_BINARIES "Build cycles CUDA binaries" OFF)
|
||||
set(CYCLES_CUDA_BINARIES_ARCH sm_13 sm_20 sm_21 CACHE STRING "CUDA architectures to build binaries for")
|
||||
|
||||
# disable for now, but plan to support on all platforms eventually
|
||||
option(WITH_MEM_JEMALLOC "Enable malloc replacement (http://www.canonware.com/jemalloc)" OFF)
|
||||
|
@ -162,7 +162,7 @@ if cxx:
|
||||
|
||||
if sys.platform=='win32':
|
||||
if env['CC'] in ['cl', 'cl.exe']:
|
||||
platform = 'win64-vc' if bitness == 64 else 'win32-vc'
|
||||
platform = 'win64-vc' if bitness == 64 else 'win32-vc'
|
||||
elif env['CC'] in ['gcc']:
|
||||
platform = 'win32-mingw'
|
||||
|
||||
|
@ -180,6 +180,18 @@ BF_JEMALLOC_LIB_STATIC = '${BF_JEMALLOC_LIBPATH}/libjemalloc.a'
|
||||
|
||||
WITH_BF_CYCLES = False
|
||||
|
||||
WITH_BF_OIIO = True
|
||||
BF_OIIO = LIBDIR + '/openimageio'
|
||||
BF_OIIO_INC = BF_OIIO + '/include'
|
||||
BF_OIIO_LIB = 'OpenImageIO'
|
||||
BF_OIIO_LIBPATH = BF_OIIO + '/lib'
|
||||
|
||||
WITH_BF_BOOST = True
|
||||
BF_BOOST = LIBDIR + '/boost'
|
||||
BF_BOOST_INC = BF_BOOST + '/include'
|
||||
BF_BOOST_LIB = 'boost_date_time-mt boost_filesystem-mt boost_regex-mt boost_system-mt boost_thread-mt'
|
||||
BF_BOOST_LIBPATH = BF_BOOST + '/lib'
|
||||
|
||||
WITH_BF_OPENMP = True
|
||||
|
||||
#Ray trace optimization
|
||||
|
@ -156,7 +156,7 @@ def validate_arguments(args, bc):
|
||||
'WITH_BF_JEMALLOC', 'WITH_BF_STATICJEMALLOC', 'BF_JEMALLOC', 'BF_JEMALLOC_INC', 'BF_JEMALLOC_LIBPATH', 'BF_JEMALLOC_LIB', 'BF_JEMALLOC_LIB_STATIC',
|
||||
'BUILDBOT_BRANCH',
|
||||
'WITH_BF_3DMOUSE', 'WITH_BF_STATIC3DMOUSE', 'BF_3DMOUSE', 'BF_3DMOUSE_INC', 'BF_3DMOUSE_LIB', 'BF_3DMOUSE_LIBPATH', 'BF_3DMOUSE_LIB_STATIC',
|
||||
'WITH_BF_CYCLES',
|
||||
'WITH_BF_CYCLES', 'WITH_BF_CYCLES_BINARIES' 'BF_CYCLES_BINARIES_ARCH',
|
||||
'WITH_BF_OIIO', 'WITH_BF_STATICOIIO', 'BF_OIIO', 'BF_OIIO_INC', 'BF_OIIO_LIB', 'BF_OIIO_LIB_STATIC', 'BF_OIIO_LIBPATH',
|
||||
'WITH_BF_BOOST', 'WITH_BF_STATICBOOST', 'BF_BOOST', 'BF_BOOST_INC', 'BF_BOOST_LIB', 'BF_BOOST_LIB_STATIC', 'BF_BOOST_LIBPATH'
|
||||
]
|
||||
|
@ -49,198 +49,198 @@ CSuffixes = ['.c', '.C']
|
||||
CXXSuffixes = ['.cc', '.cpp', '.cxx', '.c++', '.C++']
|
||||
|
||||
def get_msvctoolkit_paths():
|
||||
"""Return a 4-tuple of (INCLUDE, LIB, PATH, TOOLKIT) as the values of those
|
||||
three environment variables that should be set in order to execute
|
||||
the MSVC .NET tools properly, if the information wasn't available
|
||||
from the registry."""
|
||||
"""Return a 4-tuple of (INCLUDE, LIB, PATH, TOOLKIT) as the values of those
|
||||
three environment variables that should be set in order to execute
|
||||
the MSVC .NET tools properly, if the information wasn't available
|
||||
from the registry."""
|
||||
|
||||
MSToolkitDir = None
|
||||
paths = {}
|
||||
exe_path = ''
|
||||
lib_path = ''
|
||||
include_path = ''
|
||||
MSToolkitDir = None
|
||||
paths = {}
|
||||
exe_path = ''
|
||||
lib_path = ''
|
||||
include_path = ''
|
||||
|
||||
# First, we get the shell folder for this user:
|
||||
if not SCons.Util.can_read_reg:
|
||||
raise SCons.Errors.InternalError, "No Windows registry module was found"
|
||||
# First, we get the shell folder for this user:
|
||||
if not SCons.Util.can_read_reg:
|
||||
raise SCons.Errors.InternalError, "No Windows registry module was found"
|
||||
|
||||
# look for toolkit
|
||||
if os.environ.has_key('VCToolkitInstallDir'):
|
||||
MSToolkitDir = os.path.normpath(os.environ['VCToolkitInstallDir'])
|
||||
else:
|
||||
# last resort -- default install location
|
||||
MSToolkitDir = r'C:\Program Files\Microsoft Visual C++ Toolkit 2003'
|
||||
# look for toolkit
|
||||
if os.environ.has_key('VCToolkitInstallDir'):
|
||||
MSToolkitDir = os.path.normpath(os.environ['VCToolkitInstallDir'])
|
||||
else:
|
||||
# last resort -- default install location
|
||||
MSToolkitDir = r'C:\Program Files\Microsoft Visual C++ Toolkit 2003'
|
||||
|
||||
# look for platform sdk
|
||||
if os.environ.has_key('MSSdk'):
|
||||
PlatformSDKDir = os.path.normpath(os.environ['MSSdk'])
|
||||
else:
|
||||
try:
|
||||
PlatformSDKDir = SCons.Util.RegGetValue(SCons.Util.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\MicrosoftSDK\Directories\Install Dir')[0]
|
||||
PlatformSDKDir = str(PlatformSDKDir)
|
||||
except SCons.Util.RegError:
|
||||
raise SCons.Errors.InternalError, "The Platform SDK directory was not found in the registry or in the `MSSdk` environment variable."
|
||||
# look for platform sdk
|
||||
if os.environ.has_key('MSSdk'):
|
||||
PlatformSDKDir = os.path.normpath(os.environ['MSSdk'])
|
||||
else:
|
||||
try:
|
||||
PlatformSDKDir = SCons.Util.RegGetValue(SCons.Util.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\MicrosoftSDK\Directories\Install Dir')[0]
|
||||
PlatformSDKDir = str(PlatformSDKDir)
|
||||
except SCons.Util.RegError:
|
||||
raise SCons.Errors.InternalError, "The Platform SDK directory was not found in the registry or in the `MSSdk` environment variable."
|
||||
|
||||
# look for DX Sdk (expecting DX9)
|
||||
# dxsdk docs have a directory key, look for it, extract path
|
||||
#dxsdkdocs = ""
|
||||
DXsdkDir = ""
|
||||
#try:
|
||||
# dxsdkdocs = SCons.Util.RegGetValue(SCons.Util.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\DirectX SDK\DX9SDK Doc Path')
|
||||
#except SCons.Util.RegError:
|
||||
# raise SCons.Errors.InternalError, "The DXSDK directory was not found in the registry."
|
||||
if os.environ.has_key('DXSDK_DIR'):
|
||||
DXsdkDir = os.path.normpath(os.environ['DXSDK_DIR'])
|
||||
# look for DX Sdk (expecting DX9)
|
||||
# dxsdk docs have a directory key, look for it, extract path
|
||||
#dxsdkdocs = ""
|
||||
DXsdkDir = ""
|
||||
#try:
|
||||
# dxsdkdocs = SCons.Util.RegGetValue(SCons.Util.HKEY_LOCAL_MACHINE, r'SOFTWARE\Microsoft\DirectX SDK\DX9SDK Doc Path')
|
||||
#except SCons.Util.RegError:
|
||||
# raise SCons.Errors.InternalError, "The DXSDK directory was not found in the registry."
|
||||
if os.environ.has_key('DXSDK_DIR'):
|
||||
DXsdkDir = os.path.normpath(os.environ['DXSDK_DIR'])
|
||||
|
||||
#DXsdkDir = os.path.split(dxsdkdocs[0])[0]
|
||||
DXsdkDir = os.path.split(DXsdkDir)[0]
|
||||
#DXsdkDir = os.path.split(dxsdkdocs[0])[0]
|
||||
DXsdkDir = os.path.split(DXsdkDir)[0]
|
||||
|
||||
include_path = r'%s\include;%s\include;%s\include' % (MSToolkitDir, PlatformSDKDir, DXsdkDir)
|
||||
lib_path = r'%s\lib;%s\lib;%s\lib' % (MSToolkitDir, PlatformSDKDir, DXsdkDir)
|
||||
exe_path = r'%s\bin;%s\bin\win95;%s\bin' % (MSToolkitDir, PlatformSDKDir, PlatformSDKDir)
|
||||
return (include_path, lib_path, exe_path, PlatformSDKDir)
|
||||
include_path = r'%s\include;%s\include;%s\include' % (MSToolkitDir, PlatformSDKDir, DXsdkDir)
|
||||
lib_path = r'%s\lib;%s\lib;%s\lib' % (MSToolkitDir, PlatformSDKDir, DXsdkDir)
|
||||
exe_path = r'%s\bin;%s\bin\win95;%s\bin' % (MSToolkitDir, PlatformSDKDir, PlatformSDKDir)
|
||||
return (include_path, lib_path, exe_path, PlatformSDKDir)
|
||||
|
||||
def validate_vars(env):
|
||||
"""Validate the PDB, PCH, and PCHSTOP construction variables."""
|
||||
if env.has_key('PCH') and env['PCH']:
|
||||
if not env.has_key('PCHSTOP'):
|
||||
raise SCons.Errors.UserError, "The PCHSTOP construction must be defined if PCH is defined."
|
||||
if not SCons.Util.is_String(env['PCHSTOP']):
|
||||
raise SCons.Errors.UserError, "The PCHSTOP construction variable must be a string: %r"%env['PCHSTOP']
|
||||
"""Validate the PDB, PCH, and PCHSTOP construction variables."""
|
||||
if env.has_key('PCH') and env['PCH']:
|
||||
if not env.has_key('PCHSTOP'):
|
||||
raise SCons.Errors.UserError, "The PCHSTOP construction must be defined if PCH is defined."
|
||||
if not SCons.Util.is_String(env['PCHSTOP']):
|
||||
raise SCons.Errors.UserError, "The PCHSTOP construction variable must be a string: %r"%env['PCHSTOP']
|
||||
|
||||
def pch_emitter(target, source, env):
|
||||
"""Sets up the PDB dependencies for a pch file, and adds the object
|
||||
file target."""
|
||||
"""Sets up the PDB dependencies for a pch file, and adds the object
|
||||
file target."""
|
||||
|
||||
validate_vars(env)
|
||||
validate_vars(env)
|
||||
|
||||
pch = None
|
||||
obj = None
|
||||
pch = None
|
||||
obj = None
|
||||
|
||||
for t in target:
|
||||
if SCons.Util.splitext(str(t))[1] == '.pch':
|
||||
pch = t
|
||||
if SCons.Util.splitext(str(t))[1] == '.obj':
|
||||
obj = t
|
||||
for t in target:
|
||||
if SCons.Util.splitext(str(t))[1] == '.pch':
|
||||
pch = t
|
||||
if SCons.Util.splitext(str(t))[1] == '.obj':
|
||||
obj = t
|
||||
|
||||
if not obj:
|
||||
obj = SCons.Util.splitext(str(pch))[0]+'.obj'
|
||||
if not obj:
|
||||
obj = SCons.Util.splitext(str(pch))[0]+'.obj'
|
||||
|
||||
target = [pch, obj] # pch must be first, and obj second for the PCHCOM to work
|
||||
target = [pch, obj] # pch must be first, and obj second for the PCHCOM to work
|
||||
|
||||
if env.has_key('PDB') and env['PDB']:
|
||||
env.SideEffect(env['PDB'], target)
|
||||
env.Precious(env['PDB'])
|
||||
if env.has_key('PDB') and env['PDB']:
|
||||
env.SideEffect(env['PDB'], target)
|
||||
env.Precious(env['PDB'])
|
||||
|
||||
return (target, source)
|
||||
return (target, source)
|
||||
|
||||
def object_emitter(target, source, env, parent_emitter):
|
||||
"""Sets up the PDB and PCH dependencies for an object file."""
|
||||
"""Sets up the PDB and PCH dependencies for an object file."""
|
||||
|
||||
validate_vars(env)
|
||||
validate_vars(env)
|
||||
|
||||
parent_emitter(target, source, env)
|
||||
parent_emitter(target, source, env)
|
||||
|
||||
if env.has_key('PDB') and env['PDB']:
|
||||
env.SideEffect(env['PDB'], target)
|
||||
env.Precious(env['PDB'])
|
||||
if env.has_key('PDB') and env['PDB']:
|
||||
env.SideEffect(env['PDB'], target)
|
||||
env.Precious(env['PDB'])
|
||||
|
||||
if env.has_key('PCH') and env['PCH']:
|
||||
env.Depends(target, env['PCH'])
|
||||
if env.has_key('PCH') and env['PCH']:
|
||||
env.Depends(target, env['PCH'])
|
||||
|
||||
return (target, source)
|
||||
return (target, source)
|
||||
|
||||
def static_object_emitter(target, source, env):
|
||||
return object_emitter(target, source, env,
|
||||
SCons.Defaults.StaticObjectEmitter)
|
||||
return object_emitter(target, source, env,
|
||||
SCons.Defaults.StaticObjectEmitter)
|
||||
|
||||
def shared_object_emitter(target, source, env):
|
||||
return object_emitter(target, source, env,
|
||||
SCons.Defaults.SharedObjectEmitter)
|
||||
return object_emitter(target, source, env,
|
||||
SCons.Defaults.SharedObjectEmitter)
|
||||
|
||||
pch_builder = SCons.Builder.Builder(action='$PCHCOM', suffix='.pch', emitter=pch_emitter)
|
||||
res_builder = SCons.Builder.Builder(action='$RCCOM', suffix='.res')
|
||||
|
||||
def pdbGenerator(env, target, source, for_signature):
|
||||
if target and env.has_key('PDB') and env['PDB']:
|
||||
return ['/PDB:%s'%target[0].File(env['PDB']).get_string(for_signature),
|
||||
'/DEBUG']
|
||||
if target and env.has_key('PDB') and env['PDB']:
|
||||
return ['/PDB:%s'%target[0].File(env['PDB']).get_string(for_signature),
|
||||
'/DEBUG']
|
||||
|
||||
def win32ShlinkTargets(target, source, env, for_signature):
|
||||
listCmd = []
|
||||
dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
|
||||
if dll: listCmd.append("/out:%s"%dll.get_string(for_signature))
|
||||
listCmd = []
|
||||
dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
|
||||
if dll: listCmd.append("/out:%s"%dll.get_string(for_signature))
|
||||
|
||||
implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX')
|
||||
if implib: listCmd.append("/implib:%s"%implib.get_string(for_signature))
|
||||
implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX')
|
||||
if implib: listCmd.append("/implib:%s"%implib.get_string(for_signature))
|
||||
|
||||
return listCmd
|
||||
return listCmd
|
||||
|
||||
def win32ShlinkSources(target, source, env, for_signature):
|
||||
listCmd = []
|
||||
listCmd = []
|
||||
|
||||
deffile = env.FindIxes(source, "WIN32DEFPREFIX", "WIN32DEFSUFFIX")
|
||||
for src in source:
|
||||
if src == deffile:
|
||||
# Treat this source as a .def file.
|
||||
listCmd.append("/def:%s" % src.get_string(for_signature))
|
||||
else:
|
||||
# Just treat it as a generic source file.
|
||||
listCmd.append(src)
|
||||
return listCmd
|
||||
deffile = env.FindIxes(source, "WIN32DEFPREFIX", "WIN32DEFSUFFIX")
|
||||
for src in source:
|
||||
if src == deffile:
|
||||
# Treat this source as a .def file.
|
||||
listCmd.append("/def:%s" % src.get_string(for_signature))
|
||||
else:
|
||||
# Just treat it as a generic source file.
|
||||
listCmd.append(src)
|
||||
return listCmd
|
||||
|
||||
def win32LibEmitter(target, source, env):
|
||||
# SCons.Tool.msvc.validate_vars(env)
|
||||
# SCons.Tool.msvc.validate_vars(env)
|
||||
|
||||
dll = env.FindIxes(target, "SHLIBPREFIX", "SHLIBSUFFIX")
|
||||
no_import_lib = env.get('no_import_lib', 0)
|
||||
dll = env.FindIxes(target, "SHLIBPREFIX", "SHLIBSUFFIX")
|
||||
no_import_lib = env.get('no_import_lib', 0)
|
||||
|
||||
if not dll:
|
||||
raise SCons.Errors.UserError, "A shared library should have exactly one target with the suffix: %s" % env.subst("$SHLIBSUFFIX")
|
||||
if not dll:
|
||||
raise SCons.Errors.UserError, "A shared library should have exactly one target with the suffix: %s" % env.subst("$SHLIBSUFFIX")
|
||||
|
||||
if env.get("WIN32_INSERT_DEF", 0) and \
|
||||
not env.FindIxes(source, "WIN32DEFPREFIX", "WIN32DEFSUFFIX"):
|
||||
if env.get("WIN32_INSERT_DEF", 0) and \
|
||||
not env.FindIxes(source, "WIN32DEFPREFIX", "WIN32DEFSUFFIX"):
|
||||
|
||||
# append a def file to the list of sources
|
||||
source.append(env.ReplaceIxes(dll,
|
||||
"SHLIBPREFIX", "SHLIBSUFFIX",
|
||||
"WIN32DEFPREFIX", "WIN32DEFSUFFIX"))
|
||||
# append a def file to the list of sources
|
||||
source.append(env.ReplaceIxes(dll,
|
||||
"SHLIBPREFIX", "SHLIBSUFFIX",
|
||||
"WIN32DEFPREFIX", "WIN32DEFSUFFIX"))
|
||||
|
||||
if env.has_key('PDB') and env['PDB']:
|
||||
env.SideEffect(env['PDB'], target)
|
||||
env.Precious(env['PDB'])
|
||||
if env.has_key('PDB') and env['PDB']:
|
||||
env.SideEffect(env['PDB'], target)
|
||||
env.Precious(env['PDB'])
|
||||
|
||||
if not no_import_lib and \
|
||||
not env.FindIxes(target, "LIBPREFIX", "LIBSUFFIX"):
|
||||
# Append an import library to the list of targets.
|
||||
target.append(env.ReplaceIxes(dll,
|
||||
"SHLIBPREFIX", "SHLIBSUFFIX",
|
||||
"LIBPREFIX", "LIBSUFFIX"))
|
||||
# and .exp file is created if there are exports from a DLL
|
||||
target.append(env.ReplaceIxes(dll,
|
||||
"SHLIBPREFIX", "SHLIBSUFFIX",
|
||||
"WIN32EXPPREFIX", "WIN32EXPSUFFIX"))
|
||||
if not no_import_lib and \
|
||||
not env.FindIxes(target, "LIBPREFIX", "LIBSUFFIX"):
|
||||
# Append an import library to the list of targets.
|
||||
target.append(env.ReplaceIxes(dll,
|
||||
"SHLIBPREFIX", "SHLIBSUFFIX",
|
||||
"LIBPREFIX", "LIBSUFFIX"))
|
||||
# and .exp file is created if there are exports from a DLL
|
||||
target.append(env.ReplaceIxes(dll,
|
||||
"SHLIBPREFIX", "SHLIBSUFFIX",
|
||||
"WIN32EXPPREFIX", "WIN32EXPSUFFIX"))
|
||||
|
||||
return (target, source)
|
||||
return (target, source)
|
||||
|
||||
def prog_emitter(target, source, env):
|
||||
#SCons.Tool.msvc.validate_vars(env)
|
||||
#SCons.Tool.msvc.validate_vars(env)
|
||||
|
||||
if env.has_key('PDB') and env['PDB']:
|
||||
env.SideEffect(env['PDB'], target)
|
||||
env.Precious(env['PDB'])
|
||||
if env.has_key('PDB') and env['PDB']:
|
||||
env.SideEffect(env['PDB'], target)
|
||||
env.Precious(env['PDB'])
|
||||
|
||||
return (target,source)
|
||||
return (target,source)
|
||||
|
||||
def RegServerFunc(target, source, env):
|
||||
if env.has_key('register') and env['register']:
|
||||
ret = regServerAction([target[0]], [source[0]], env)
|
||||
if ret:
|
||||
raise SCons.Errors.UserError, "Unable to register %s" % target[0]
|
||||
else:
|
||||
print "Registered %s sucessfully" % target[0]
|
||||
return ret
|
||||
return 0
|
||||
if env.has_key('register') and env['register']:
|
||||
ret = regServerAction([target[0]], [source[0]], env)
|
||||
if ret:
|
||||
raise SCons.Errors.UserError, "Unable to register %s" % target[0]
|
||||
else:
|
||||
print "Registered %s sucessfully" % target[0]
|
||||
return ret
|
||||
return 0
|
||||
|
||||
regServerAction = SCons.Action.Action("$REGSVRCOM")
|
||||
regServerCheck = SCons.Action.Action(RegServerFunc, None)
|
||||
@ -248,106 +248,106 @@ shlibLinkAction = SCons.Action.Action('${TEMPFILE("$SHLINK $SHLINKFLAGS $_SHLINK
|
||||
compositeLinkAction = shlibLinkAction + regServerCheck
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for MSVC++ to an Environment."""
|
||||
static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
|
||||
"""Add Builders and construction variables for MSVC++ to an Environment."""
|
||||
static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
|
||||
|
||||
for suffix in CSuffixes:
|
||||
static_obj.add_action(suffix, SCons.Defaults.CAction)
|
||||
shared_obj.add_action(suffix, SCons.Defaults.ShCAction)
|
||||
for suffix in CSuffixes:
|
||||
static_obj.add_action(suffix, SCons.Defaults.CAction)
|
||||
shared_obj.add_action(suffix, SCons.Defaults.ShCAction)
|
||||
|
||||
for suffix in CXXSuffixes:
|
||||
static_obj.add_action(suffix, SCons.Defaults.CXXAction)
|
||||
shared_obj.add_action(suffix, SCons.Defaults.ShCXXAction)
|
||||
for suffix in CXXSuffixes:
|
||||
static_obj.add_action(suffix, SCons.Defaults.CXXAction)
|
||||
shared_obj.add_action(suffix, SCons.Defaults.ShCXXAction)
|
||||
|
||||
SCons.Tool.createStaticLibBuilder(env)
|
||||
SCons.Tool.createSharedLibBuilder(env)
|
||||
SCons.Tool.createProgBuilder(env)
|
||||
SCons.Tool.createStaticLibBuilder(env)
|
||||
SCons.Tool.createSharedLibBuilder(env)
|
||||
SCons.Tool.createProgBuilder(env)
|
||||
|
||||
env['CCPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Zi /Fd%s"%File(PDB)) or ""}'])
|
||||
env['CCPCHFLAGS'] = SCons.Util.CLVar(['${(PCH and "/Yu%s /Fp%s"%(PCHSTOP or "",File(PCH))) or ""}'])
|
||||
env['CCCOMFLAGS'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo$TARGET $CCPCHFLAGS $CCPDBFLAGS'
|
||||
env['CC'] = 'cl'
|
||||
env['CCFLAGS'] = SCons.Util.CLVar('/nologo')
|
||||
env['CCCOM'] = '$CC $CCFLAGS $CCCOMFLAGS'
|
||||
env['SHCC'] = '$CC'
|
||||
env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
|
||||
env['SHCCCOM'] = '$SHCC $SHCCFLAGS $CCCOMFLAGS'
|
||||
env['CXX'] = '$CC'
|
||||
env['CXXFLAGS'] = SCons.Util.CLVar('$CCFLAGS $( /TP $)')
|
||||
env['CXXCOM'] = '$CXX $CXXFLAGS $CCCOMFLAGS'
|
||||
env['SHCXX'] = '$CXX'
|
||||
env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
|
||||
env['SHCXXCOM'] = '$SHCXX $SHCXXFLAGS $CCCOMFLAGS'
|
||||
env['CPPDEFPREFIX'] = '/D'
|
||||
env['CPPDEFSUFFIX'] = ''
|
||||
env['INCPREFIX'] = '/I'
|
||||
env['INCSUFFIX'] = ''
|
||||
env['OBJEMITTER'] = static_object_emitter
|
||||
env['SHOBJEMITTER'] = shared_object_emitter
|
||||
env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
|
||||
env['CCPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Zi /Fd%s"%File(PDB)) or ""}'])
|
||||
env['CCPCHFLAGS'] = SCons.Util.CLVar(['${(PCH and "/Yu%s /Fp%s"%(PCHSTOP or "",File(PCH))) or ""}'])
|
||||
env['CCCOMFLAGS'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo$TARGET $CCPCHFLAGS $CCPDBFLAGS'
|
||||
env['CC'] = 'cl'
|
||||
env['CCFLAGS'] = SCons.Util.CLVar('/nologo')
|
||||
env['CCCOM'] = '$CC $CCFLAGS $CCCOMFLAGS'
|
||||
env['SHCC'] = '$CC'
|
||||
env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
|
||||
env['SHCCCOM'] = '$SHCC $SHCCFLAGS $CCCOMFLAGS'
|
||||
env['CXX'] = '$CC'
|
||||
env['CXXFLAGS'] = SCons.Util.CLVar('$CCFLAGS $( /TP $)')
|
||||
env['CXXCOM'] = '$CXX $CXXFLAGS $CCCOMFLAGS'
|
||||
env['SHCXX'] = '$CXX'
|
||||
env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
|
||||
env['SHCXXCOM'] = '$SHCXX $SHCXXFLAGS $CCCOMFLAGS'
|
||||
env['CPPDEFPREFIX'] = '/D'
|
||||
env['CPPDEFSUFFIX'] = ''
|
||||
env['INCPREFIX'] = '/I'
|
||||
env['INCSUFFIX'] = ''
|
||||
env['OBJEMITTER'] = static_object_emitter
|
||||
env['SHOBJEMITTER'] = shared_object_emitter
|
||||
env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
|
||||
|
||||
env['RC'] = 'rc'
|
||||
env['RCFLAGS'] = SCons.Util.CLVar('')
|
||||
env['RCCOM'] = '$RC $_CPPDEFFLAGS $_CPPINCFLAGS $RCFLAGS /fo$TARGET $SOURCES'
|
||||
CScan = env.get_scanner('.c')
|
||||
if CScan:
|
||||
CScan.add_skey('.rc')
|
||||
env['BUILDERS']['RES'] = res_builder
|
||||
env['RC'] = 'rc'
|
||||
env['RCFLAGS'] = SCons.Util.CLVar('')
|
||||
env['RCCOM'] = '$RC $_CPPDEFFLAGS $_CPPINCFLAGS $RCFLAGS /fo$TARGET $SOURCES'
|
||||
CScan = env.get_scanner('.c')
|
||||
if CScan:
|
||||
CScan.add_skey('.rc')
|
||||
env['BUILDERS']['RES'] = res_builder
|
||||
|
||||
include_path, lib_path, exe_path, sdk_path = get_msvctoolkit_paths()
|
||||
env.PrependENVPath('INCLUDE', include_path)
|
||||
env.PrependENVPath('LIB', lib_path)
|
||||
env.PrependENVPath('PATH', exe_path)
|
||||
include_path, lib_path, exe_path, sdk_path = get_msvctoolkit_paths()
|
||||
env.PrependENVPath('INCLUDE', include_path)
|
||||
env.PrependENVPath('LIB', lib_path)
|
||||
env.PrependENVPath('PATH', exe_path)
|
||||
|
||||
env['ENV']['CPU'] = 'i386'
|
||||
env['ENV']['MSSDK'] = sdk_path
|
||||
env['ENV']['BkOffice'] = sdk_path
|
||||
env['ENV']['Basemake'] = sdk_path + "\\Include\\BKOffice.Mak"
|
||||
env['ENV']['INETSDK'] = sdk_path
|
||||
env['ENV']['MSSDK'] = sdk_path
|
||||
env['ENV']['MSTOOLS'] = sdk_path
|
||||
env['ENV']['TARGETOS'] = 'WINNT'
|
||||
env['ENV']['APPVER'] = '5.0'
|
||||
env['ENV']['CPU'] = 'i386'
|
||||
env['ENV']['MSSDK'] = sdk_path
|
||||
env['ENV']['BkOffice'] = sdk_path
|
||||
env['ENV']['Basemake'] = sdk_path + "\\Include\\BKOffice.Mak"
|
||||
env['ENV']['INETSDK'] = sdk_path
|
||||
env['ENV']['MSSDK'] = sdk_path
|
||||
env['ENV']['MSTOOLS'] = sdk_path
|
||||
env['ENV']['TARGETOS'] = 'WINNT'
|
||||
env['ENV']['APPVER'] = '5.0'
|
||||
|
||||
env['CFILESUFFIX'] = '.c'
|
||||
env['CXXFILESUFFIX'] = '.cc'
|
||||
env['CFILESUFFIX'] = '.c'
|
||||
env['CXXFILESUFFIX'] = '.cc'
|
||||
|
||||
env['PCHCOM'] = '$CXX $CXXFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo${TARGETS[1]} /Yc$PCHSTOP /Fp${TARGETS[0]} $CCPDBFLAGS'
|
||||
env['BUILDERS']['PCH'] = pch_builder
|
||||
env['PCHCOM'] = '$CXX $CXXFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo${TARGETS[1]} /Yc$PCHSTOP /Fp${TARGETS[0]} $CCPDBFLAGS'
|
||||
env['BUILDERS']['PCH'] = pch_builder
|
||||
|
||||
env['AR'] = 'lib.exe' #'"' +sdk_path + '\\bin\\Win64\\lib.exe"'
|
||||
env['ARFLAGS'] = SCons.Util.CLVar('/nologo')
|
||||
env['ARCOM'] = "${TEMPFILE('$AR $ARFLAGS /OUT:$TARGET $SOURCES')}"
|
||||
env['AR'] = 'lib.exe' #'"' +sdk_path + '\\bin\\Win64\\lib.exe"'
|
||||
env['ARFLAGS'] = SCons.Util.CLVar('/nologo')
|
||||
env['ARCOM'] = "${TEMPFILE('$AR $ARFLAGS /OUT:$TARGET $SOURCES')}"
|
||||
|
||||
env['SHLINK'] = '$LINK'
|
||||
env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS /dll')
|
||||
env['_SHLINK_TARGETS'] = win32ShlinkTargets
|
||||
env['_SHLINK_SOURCES'] = win32ShlinkSources
|
||||
env['SHLINKCOM'] = compositeLinkAction
|
||||
env['SHLIBEMITTER']= win32LibEmitter
|
||||
env['LINK'] = 'link.exe' #'"' +sdk_path + '\\bin\\Win64\\' + 'link.exe"'
|
||||
env['LINKFLAGS'] = SCons.Util.CLVar('/nologo')
|
||||
env['_PDB'] = pdbGenerator
|
||||
env["TEMPFILE"] = SCons.Platform.win32.TempFileMunge
|
||||
env['LINKCOM'] = '${TEMPFILE("$LINK $LINKFLAGS /OUT:$TARGET $( $_LIBDIRFLAGS $) $_LIBFLAGS $_PDB $SOURCES")}'
|
||||
env['PROGEMITTER'] = prog_emitter
|
||||
env['LIBDIRPREFIX']='/LIBPATH:'
|
||||
env['LIBDIRSUFFIX']=''
|
||||
env['LIBLINKPREFIX']=''
|
||||
env['LIBLINKSUFFIX']='$LIBSUFFIX'
|
||||
env['SHLINK'] = '$LINK'
|
||||
env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS /dll')
|
||||
env['_SHLINK_TARGETS'] = win32ShlinkTargets
|
||||
env['_SHLINK_SOURCES'] = win32ShlinkSources
|
||||
env['SHLINKCOM'] = compositeLinkAction
|
||||
env['SHLIBEMITTER']= win32LibEmitter
|
||||
env['LINK'] = 'link.exe' #'"' +sdk_path + '\\bin\\Win64\\' + 'link.exe"'
|
||||
env['LINKFLAGS'] = SCons.Util.CLVar('/nologo')
|
||||
env['_PDB'] = pdbGenerator
|
||||
env["TEMPFILE"] = SCons.Platform.win32.TempFileMunge
|
||||
env['LINKCOM'] = '${TEMPFILE("$LINK $LINKFLAGS /OUT:$TARGET $( $_LIBDIRFLAGS $) $_LIBFLAGS $_PDB $SOURCES")}'
|
||||
env['PROGEMITTER'] = prog_emitter
|
||||
env['LIBDIRPREFIX']='/LIBPATH:'
|
||||
env['LIBDIRSUFFIX']=''
|
||||
env['LIBLINKPREFIX']=''
|
||||
env['LIBLINKSUFFIX']='$LIBSUFFIX'
|
||||
|
||||
env['WIN32DEFPREFIX'] = ''
|
||||
env['WIN32DEFSUFFIX'] = '.def'
|
||||
env['WIN32_INSERT_DEF'] = 0
|
||||
env['WIN32DEFPREFIX'] = ''
|
||||
env['WIN32DEFSUFFIX'] = '.def'
|
||||
env['WIN32_INSERT_DEF'] = 0
|
||||
|
||||
env['WIN32EXPPREFIX'] = ''
|
||||
env['WIN32EXPSUFFIX'] = '.exp'
|
||||
env['WIN32EXPPREFIX'] = ''
|
||||
env['WIN32EXPSUFFIX'] = '.exp'
|
||||
|
||||
env['REGSVRACTION'] = regServerCheck
|
||||
env['REGSVR'] = os.path.join(SCons.Platform.win32.get_system_root(),'System32','regsvr32')
|
||||
env['REGSVRFLAGS'] = '/s '
|
||||
env['REGSVRCOM'] = '$REGSVR $REGSVRFLAGS $TARGET'
|
||||
env['REGSVRACTION'] = regServerCheck
|
||||
env['REGSVR'] = os.path.join(SCons.Platform.win32.get_system_root(),'System32','regsvr32')
|
||||
env['REGSVRFLAGS'] = '/s '
|
||||
env['REGSVRCOM'] = '$REGSVR $REGSVRFLAGS $TARGET'
|
||||
|
||||
|
||||
def exists(env):
|
||||
return env.Detect('cl')
|
||||
return env.Detect('cl')
|
||||
|
@ -8,7 +8,9 @@ include(cmake/external_libs.cmake)
|
||||
|
||||
# Build Flags
|
||||
|
||||
set(GCC_OPTIM_FLAGS "-ffast-math -msse -msse2 -msse3 -mtune=native")
|
||||
if(WITH_RAYOPTIMIZATION AND SUPPORT_SSE_BUILD)
|
||||
set(GCC_OPTIM_FLAGS "-ffast-math -msse -msse2 -msse3")
|
||||
endif()
|
||||
|
||||
if(APPLE)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_OPTIM_FLAGS}")
|
||||
@ -30,6 +32,9 @@ if(UNIX AND NOT APPLE)
|
||||
set(RTTI_DISABLE_FLAGS "-fno-rtti -DBOOST_NO_RTTI -DBOOST_NO_TYPEID")
|
||||
endif()
|
||||
|
||||
# not needed yet, is for open shading language
|
||||
set(RTTI_DISABLE_FLAGS "")
|
||||
|
||||
# Definitions and Includes
|
||||
|
||||
add_definitions(${BOOST_DEFINITIONS} ${OPENIMAGEIO_DEFINITIONS})
|
||||
@ -49,6 +54,10 @@ if(WITH_CYCLES_PARTIO)
|
||||
add_definitions(-DWITH_PARTIO)
|
||||
endif()
|
||||
|
||||
if(WITH_CYCLES_CUDA_BINARIES)
|
||||
add_definitions(-DWITH_CUDA_BINARIES)
|
||||
endif()
|
||||
|
||||
add_definitions(-DWITH_OPENCL)
|
||||
add_definitions(-DWITH_CUDA)
|
||||
add_definitions(-DWITH_MULTI)
|
||||
@ -72,3 +81,4 @@ add_subdirectory(kernel)
|
||||
add_subdirectory(render)
|
||||
add_subdirectory(subd)
|
||||
add_subdirectory(util)
|
||||
|
||||
|
@ -24,10 +24,13 @@ defs.append('WITH_MULTI')
|
||||
defs.append('WITH_CUDA')
|
||||
|
||||
if env['OURPLATFORM'] in ('win32-mingw'):
|
||||
cxxflags.append('-fno-rtti -ffast-math -msse -msse2 -msse3 -mtune=native'.split())
|
||||
ccflags.append('-ffast-math -msse -msse2 -msse3 -mtune=native'.split())
|
||||
defs.append('BOOST_NO_RTTI BOOST_NO_TYPEID'.split())
|
||||
|
||||
if env['WITH_BF_RAYOPTIMIZATION']:
|
||||
cxxflags.append('-ffast-math -msse -msse2 -msse3'.split())
|
||||
ccflags.append('-ffast-math -msse -msse2 -msse3'.split())
|
||||
# not needed yet, is for open shading language
|
||||
# cxxflags.append('-fno-rtti'.split())
|
||||
# defs.append('BOOST_NO_RTTI BOOST_NO_TYPEID'.split())
|
||||
|
||||
incs.extend('. bvh render device kernel kernel/osl kernel/svm util subd'.split())
|
||||
incs.extend('#intern/guardedalloc #source/blender/makesrna #source/blender/makesdna'.split())
|
||||
incs.extend('#source/blender/blenloader ../../source/blender/makesrna/intern'.split())
|
||||
|
@ -350,7 +350,7 @@ def find_node_input(node, name):
|
||||
def panel_node_draw(layout, id, output_type, input_name):
|
||||
if not id.node_tree:
|
||||
layout.prop(id, "use_nodes", icon='NODETREE')
|
||||
return
|
||||
return False
|
||||
|
||||
ntree = id.node_tree
|
||||
|
||||
@ -360,6 +360,8 @@ def panel_node_draw(layout, id, output_type, input_name):
|
||||
else:
|
||||
input = find_node_input(node, input_name)
|
||||
layout.template_node_view(ntree, node, input);
|
||||
|
||||
return True
|
||||
|
||||
class CyclesLamp_PT_lamp(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Lamp"
|
||||
@ -411,8 +413,9 @@ class CyclesLamp_PT_nodes(CyclesButtonsPanel, Panel):
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
||||
mat = context.lamp
|
||||
panel_node_draw(layout, mat, 'OUTPUT_LAMP', 'Surface')
|
||||
lamp = context.lamp
|
||||
if not panel_node_draw(layout, lamp, 'OUTPUT_LAMP', 'Surface'):
|
||||
layout.prop(lamp, "color")
|
||||
|
||||
class CyclesWorld_PT_surface(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Surface"
|
||||
@ -425,8 +428,9 @@ class CyclesWorld_PT_surface(CyclesButtonsPanel, Panel):
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
||||
mat = context.world
|
||||
panel_node_draw(layout, mat, 'OUTPUT_WORLD', 'Surface')
|
||||
world = context.world
|
||||
if not panel_node_draw(layout, world, 'OUTPUT_WORLD', 'Surface'):
|
||||
layout.prop(world, "horizon_color", text="Color")
|
||||
|
||||
class CyclesWorld_PT_volume(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Volume"
|
||||
@ -457,7 +461,8 @@ class CyclesMaterial_PT_surface(CyclesButtonsPanel, Panel):
|
||||
layout = self.layout
|
||||
|
||||
mat = context.material
|
||||
panel_node_draw(layout, mat, 'OUTPUT_MATERIAL', 'Surface')
|
||||
if not panel_node_draw(layout, mat, 'OUTPUT_MATERIAL', 'Surface'):
|
||||
layout.prop(mat, "diffuse_color")
|
||||
|
||||
class CyclesMaterial_PT_volume(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Volume"
|
||||
@ -730,7 +735,22 @@ def get_panels():
|
||||
bpy.types.TEXTURE_PT_distortednoise,
|
||||
bpy.types.TEXTURE_PT_voxeldata,
|
||||
bpy.types.TEXTURE_PT_pointdensity,
|
||||
bpy.types.TEXTURE_PT_pointdensity_turbulence]
|
||||
bpy.types.TEXTURE_PT_pointdensity_turbulence,
|
||||
bpy.types.PARTICLE_PT_context_particles,
|
||||
bpy.types.PARTICLE_PT_emission,
|
||||
bpy.types.PARTICLE_PT_hair_dynamics,
|
||||
bpy.types.PARTICLE_PT_cache,
|
||||
bpy.types.PARTICLE_PT_velocity,
|
||||
bpy.types.PARTICLE_PT_rotation,
|
||||
bpy.types.PARTICLE_PT_physics,
|
||||
bpy.types.PARTICLE_PT_boidbrain,
|
||||
bpy.types.PARTICLE_PT_render,
|
||||
bpy.types.PARTICLE_PT_draw,
|
||||
bpy.types.PARTICLE_PT_children,
|
||||
bpy.types.PARTICLE_PT_field_weights,
|
||||
bpy.types.PARTICLE_PT_force_fields,
|
||||
bpy.types.PARTICLE_PT_vertexgroups,
|
||||
bpy.types.PARTICLE_PT_custom_props]
|
||||
|
||||
def register():
|
||||
bpy.types.RENDER_PT_render.append(draw_device)
|
||||
|
@ -229,8 +229,17 @@ void BlenderSync::sync_objects(BL::SpaceView3D b_v3d)
|
||||
}
|
||||
|
||||
object_free_duplilist(*b_ob);
|
||||
|
||||
/* check if we should render duplicator */
|
||||
hide = true;
|
||||
BL::Object::particle_systems_iterator b_psys;
|
||||
|
||||
for(b_ob->particle_systems.begin(b_psys); b_psys != b_ob->particle_systems.end(); ++b_psys)
|
||||
if(b_psys->settings().use_render_emitter())
|
||||
hide = false;
|
||||
}
|
||||
else {
|
||||
|
||||
if(!hide) {
|
||||
/* object itself */
|
||||
Transform tfm = get_transform(b_ob->matrix_world());
|
||||
sync_object(*b_ob, 0, *b_ob, tfm, visibility);
|
||||
|
@ -85,3 +85,16 @@ if(WITH_CYCLES_BLENDER)
|
||||
add_definitions(-DBLENDER_PLUGIN)
|
||||
endif()
|
||||
|
||||
###########################################################################
|
||||
# CUDA
|
||||
|
||||
if(WITH_CYCLES_CUDA_BINARIES)
|
||||
find_package(CUDA) # Try to auto locate CUDA toolkit
|
||||
if(CUDA_FOUND)
|
||||
message(STATUS "CUDA nvcc = ${CUDA_NVCC_EXECUTABLE}")
|
||||
else()
|
||||
message(STATUS "CUDA compiler not found, disabling WITH_CYCLES_CUDA_BINARIES")
|
||||
set(WITH_CYCLES_CUDA_BINARIES OFF)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
|
@ -223,6 +223,10 @@ public:
|
||||
if(path_exists(cubin))
|
||||
return cubin;
|
||||
|
||||
#ifdef WITH_CUDA_BINARIES
|
||||
fprintf(stderr, "CUDA binary kernel for this graphics card not found.\n");
|
||||
return "";
|
||||
#else
|
||||
/* if not, find CUDA compiler */
|
||||
string nvcc = cuCompilerPath();
|
||||
|
||||
@ -260,6 +264,7 @@ public:
|
||||
printf("Kernel compilation finished in %.2lfs.\n", time_dt() - starttime);
|
||||
|
||||
return cubin;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool load_kernels()
|
||||
|
@ -83,6 +83,32 @@ set(SRC_UTIL_HEADERS
|
||||
../util/util_transform.h
|
||||
../util/util_types.h
|
||||
)
|
||||
# CUDA module
|
||||
|
||||
if(WITH_CYCLES_CUDA_BINARIES)
|
||||
if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
|
||||
set(CUDA_BITS 64)
|
||||
else()
|
||||
set(CUDA_BITS 32)
|
||||
endif()
|
||||
|
||||
set(cuda_sources kernel.cu ${headers} ${svm_headers})
|
||||
set(cuda_cubins)
|
||||
|
||||
foreach(arch ${CYCLES_CUDA_BINARIES_ARCH})
|
||||
set(cuda_cubin kernel_${arch}.cubin)
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${cuda_cubin}
|
||||
COMMAND ${CUDA_NVCC_EXECUTABLE} -arch=${arch} -m${CUDA_BITS} --cubin ${CMAKE_CURRENT_SOURCE_DIR}/kernel.cu --use_fast_math -o ${CMAKE_CURRENT_BINARY_DIR}/${cuda_cubin} --ptxas-options="-v" --maxrregcount=24 --opencc-options -OPT:Olimit=0 -I${CMAKE_CURRENT_SOURCE_DIR}/../util -I${CMAKE_CURRENT_SOURCE_DIR}/svm -DCCL_NAMESPACE_BEGIN= -DCCL_NAMESPACE_END= -DNVCC
|
||||
DEPENDS ${cuda_sources})
|
||||
|
||||
delayed_install("${CMAKE_CURRENT_BINARY_DIR}" "${cuda_cubin}" ${CYCLES_INSTALL_PATH}/lib)
|
||||
list(APPEND cuda_cubins ${cuda_cubin})
|
||||
endforeach()
|
||||
|
||||
add_custom_target(cycles_kernel_cuda ALL DEPENDS ${cuda_cubins})
|
||||
endif()
|
||||
|
||||
# OSL module
|
||||
|
||||
|
@ -43,7 +43,7 @@ template<typename T> struct texture {
|
||||
return data[index];
|
||||
}
|
||||
|
||||
__m128 fetch_m128(int index)
|
||||
/*__m128 fetch_m128(int index)
|
||||
{
|
||||
kernel_assert(index >= 0 && index < width);
|
||||
return ((__m128*)data)[index];
|
||||
@ -53,7 +53,7 @@ template<typename T> struct texture {
|
||||
{
|
||||
kernel_assert(index >= 0 && index < width);
|
||||
return ((__m128i*)data)[index];
|
||||
}
|
||||
}*/
|
||||
|
||||
float interp(float x)
|
||||
{
|
||||
|
@ -68,8 +68,11 @@ __device float3 bsdf_ashikhmin_velvet_eval_reflect(const ShaderData *sd, const S
|
||||
float cosNH = dot(m_N, H);
|
||||
float cosHO = fabsf(dot(I, H));
|
||||
|
||||
if(!(fabsf(cosNH) < 1.0f-1e-5f && cosHO > 1e-5f))
|
||||
return make_float3(0, 0, 0);
|
||||
|
||||
float cosNHdivHO = cosNH / cosHO;
|
||||
cosNHdivHO = fmaxf(cosNHdivHO, 0.00001f);
|
||||
cosNHdivHO = fmaxf(cosNHdivHO, 1e-5f);
|
||||
|
||||
float fac1 = 2 * fabsf(cosNHdivHO * cosNO);
|
||||
float fac2 = 2 * fabsf(cosNHdivHO * cosNI);
|
||||
@ -86,6 +89,7 @@ __device float3 bsdf_ashikhmin_velvet_eval_reflect(const ShaderData *sd, const S
|
||||
*pdf = 0.5f * M_1_PI_F;
|
||||
return make_float3(out, out, out);
|
||||
}
|
||||
|
||||
return make_float3(0, 0, 0);
|
||||
}
|
||||
|
||||
@ -116,31 +120,36 @@ __device int bsdf_ashikhmin_velvet_sample(const ShaderData *sd, const ShaderClos
|
||||
float cosNH = dot(m_N, H);
|
||||
float cosHO = fabsf(dot(sd->I, H));
|
||||
|
||||
float cosNHdivHO = cosNH / cosHO;
|
||||
cosNHdivHO = fmaxf(cosNHdivHO, 0.00001f);
|
||||
if(fabsf(cosNO) > 1e-5f && fabsf(cosNH) < 1.0f-1e-5f && cosHO > 1e-5f) {
|
||||
float cosNHdivHO = cosNH / cosHO;
|
||||
cosNHdivHO = fmaxf(cosNHdivHO, 1e-5f);
|
||||
|
||||
float fac1 = 2 * fabsf(cosNHdivHO * cosNO);
|
||||
float fac2 = 2 * fabsf(cosNHdivHO * cosNI);
|
||||
float fac1 = 2 * fabsf(cosNHdivHO * cosNO);
|
||||
float fac2 = 2 * fabsf(cosNHdivHO * cosNI);
|
||||
|
||||
float sinNH2 = 1 - cosNH * cosNH;
|
||||
float sinNH4 = sinNH2 * sinNH2;
|
||||
float cotangent2 = (cosNH * cosNH) / sinNH2;
|
||||
float sinNH2 = 1 - cosNH * cosNH;
|
||||
float sinNH4 = sinNH2 * sinNH2;
|
||||
float cotangent2 = (cosNH * cosNH) / sinNH2;
|
||||
|
||||
float D = expf(-cotangent2 * m_invsigma2) * m_invsigma2 * M_1_PI_F / sinNH4;
|
||||
float G = min(1.0f, min(fac1, fac2)); // TODO: derive G from D analytically
|
||||
float D = expf(-cotangent2 * m_invsigma2) * m_invsigma2 * M_1_PI_F / sinNH4;
|
||||
float G = min(1.0f, min(fac1, fac2)); // TODO: derive G from D analytically
|
||||
|
||||
float power = 0.25f * (D * G) / cosNO;
|
||||
float power = 0.25f * (D * G) / cosNO;
|
||||
|
||||
*eval = make_float3(power, power, power);
|
||||
*eval = make_float3(power, power, power);
|
||||
|
||||
#ifdef __RAY_DIFFERENTIALS__
|
||||
// TODO: find a better approximation for the retroreflective bounce
|
||||
*domega_in_dx = (2 * dot(m_N, sd->dI.dx)) * m_N - sd->dI.dx;
|
||||
*domega_in_dy = (2 * dot(m_N, sd->dI.dy)) * m_N - sd->dI.dy;
|
||||
*domega_in_dx *= 125.0f;
|
||||
*domega_in_dy *= 125.0f;
|
||||
// TODO: find a better approximation for the retroreflective bounce
|
||||
*domega_in_dx = (2 * dot(m_N, sd->dI.dx)) * m_N - sd->dI.dx;
|
||||
*domega_in_dy = (2 * dot(m_N, sd->dI.dy)) * m_N - sd->dI.dy;
|
||||
*domega_in_dx *= 125.0f;
|
||||
*domega_in_dy *= 125.0f;
|
||||
#endif
|
||||
} else
|
||||
}
|
||||
else
|
||||
*pdf = 0.0f;
|
||||
}
|
||||
else
|
||||
*pdf = 0.0f;
|
||||
|
||||
return LABEL_REFLECT|LABEL_DIFFUSE;
|
||||
|
@ -373,8 +373,14 @@ bool cuLibraryInit()
|
||||
/* cuda 4.0 */
|
||||
CUDA_LIBRARY_FIND(cuCtxSetCurrent);
|
||||
|
||||
#ifndef WITH_CUDA_BINARIES
|
||||
#ifdef _WIN32
|
||||
return false; /* runtime build doesn't work at the moment */
|
||||
#else
|
||||
if(cuCompilerPath() == "")
|
||||
return false;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* success */
|
||||
result = true;
|
||||
@ -401,7 +407,15 @@ string cuCompilerPath()
|
||||
else
|
||||
nvcc = path_join(defaultpath, executable);
|
||||
|
||||
return (path_exists(nvcc))? nvcc: "";
|
||||
if(path_exists(nvcc))
|
||||
return nvcc;
|
||||
|
||||
#ifndef _WIN32
|
||||
if(system("which nvcc") == 0)
|
||||
return "nvcc";
|
||||
#endif
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
@ -766,7 +766,7 @@ __device_inline float __uint_as_float(uint i)
|
||||
|
||||
/* Interpolation */
|
||||
|
||||
template<class A, class B> __device_inline A lerp(const A& a, const A& b, const B& t)
|
||||
template<class A, class B> A lerp(const A& a, const A& b, const B& t)
|
||||
{
|
||||
return (A)(a * ((B)1 - t) + b * t);
|
||||
}
|
||||
|
@ -46,12 +46,13 @@
|
||||
|
||||
/* SIMD Types */
|
||||
|
||||
/* not needed yet, will be for qbvh
|
||||
#ifndef __KERNEL_GPU__
|
||||
|
||||
#include <emmintrin.h>
|
||||
#include <xmmintrin.h>
|
||||
|
||||
#endif
|
||||
#endif*/
|
||||
|
||||
#ifndef _WIN32
|
||||
#ifndef __KERNEL_GPU__
|
||||
|
@ -233,10 +233,13 @@ class FollowActiveQuads(Operator):
|
||||
bl_label = "Follow Active Quads"
|
||||
bl_options = {'REGISTER', 'UNDO'}
|
||||
|
||||
mode = bpy.props.EnumProperty(items=(("EVEN", "Even", "Space all UVs evently"), ("LENGTH", "Length", "Average space UVs edge length of each loop")),
|
||||
name="Edge Length Mode",
|
||||
description="Method to space UV edge loops",
|
||||
default="LENGTH")
|
||||
mode = bpy.props.EnumProperty(
|
||||
name="Edge Length Mode",
|
||||
description="Method to space UV edge loops",
|
||||
items=(('EVEN', "Even", "Space all UVs evently"),
|
||||
('LENGTH', "Length", "Average space UVs edge length of each loop")),
|
||||
default='LENGTH',
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
|
@ -552,9 +552,9 @@ class LightMapPack(Operator):
|
||||
|
||||
PREF_CONTEXT = bpy.props.EnumProperty(
|
||||
name="Selection",
|
||||
items=(("SEL_FACES", "Selected Faces", "Space all UVs evently"),
|
||||
("ALL_FACES", "All Faces", "Average space UVs edge length of each loop"),
|
||||
("ALL_OBJECTS", "Selected Mesh Object", "Average space UVs edge length of each loop")
|
||||
items=(('SEL_FACES', "Selected Faces", "Space all UVs evently"),
|
||||
('ALL_FACES', "All Faces", "Average space UVs edge length of each loop"),
|
||||
('ALL_OBJECTS', "Selected Mesh Object", "Average space UVs edge length of each loop")
|
||||
),
|
||||
)
|
||||
|
||||
|
@ -71,7 +71,7 @@ class DATA_PT_skeleton(ArmatureButtonsPanel, Panel):
|
||||
flow.prop(arm, "use_deform_envelopes", text="Envelopes")
|
||||
flow.prop(arm, "use_deform_preserve_volume", text="Quaternion")
|
||||
|
||||
if context.scene.render.engine == "BLENDER_GAME":
|
||||
if context.scene.render.engine == 'BLENDER_GAME':
|
||||
layout.row().prop(arm, "deform_method", expand=True)
|
||||
|
||||
|
||||
@ -289,7 +289,7 @@ class DATA_PT_iksolver_itasc(ArmatureButtonsPanel, Panel):
|
||||
row.prop(itasc, "damping_max", text="Damp", slider=True)
|
||||
row.prop(itasc, "damping_epsilon", text="Eps", slider=True)
|
||||
|
||||
from bl_ui.properties_animviz import (
|
||||
from .properties_animviz import (
|
||||
MotionPathButtonsPanel,
|
||||
OnionSkinButtonsPanel,
|
||||
)
|
||||
|
@ -18,7 +18,7 @@
|
||||
|
||||
# <pep8 compliant>
|
||||
import bpy
|
||||
from bpy.types import Panel
|
||||
from bpy.types import Panel, Menu
|
||||
from rna_prop_ui import PropertyPanel
|
||||
|
||||
|
||||
@ -33,12 +33,12 @@ class CameraButtonsPanel():
|
||||
return context.camera and (engine in cls.COMPAT_ENGINES)
|
||||
|
||||
|
||||
class CAMERA_MT_presets(bpy.types.Menu):
|
||||
class CAMERA_MT_presets(Menu):
|
||||
bl_label = "Camera Presets"
|
||||
preset_subdir = "camera"
|
||||
preset_operator = "script.execute_preset"
|
||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
||||
draw = bpy.types.Menu.draw_preset
|
||||
draw = Menu.draw_preset
|
||||
|
||||
|
||||
class DATA_PT_context_camera(CameraButtonsPanel, Panel):
|
||||
|
@ -18,6 +18,7 @@
|
||||
|
||||
# <pep8 compliant>
|
||||
import bpy
|
||||
from bpy.types import Panel
|
||||
from rna_prop_ui import PropertyPanel
|
||||
|
||||
|
||||
@ -32,7 +33,7 @@ class DataButtonsPanel():
|
||||
return context.speaker and (engine in cls.COMPAT_ENGINES)
|
||||
|
||||
|
||||
class DATA_PT_context_speaker(DataButtonsPanel, bpy.types.Panel):
|
||||
class DATA_PT_context_speaker(DataButtonsPanel, Panel):
|
||||
bl_label = ""
|
||||
bl_options = {'HIDE_HEADER'}
|
||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
||||
@ -52,7 +53,7 @@ class DATA_PT_context_speaker(DataButtonsPanel, bpy.types.Panel):
|
||||
split.template_ID(space, "pin_id")
|
||||
|
||||
|
||||
class DATA_PT_speaker(DataButtonsPanel, bpy.types.Panel):
|
||||
class DATA_PT_speaker(DataButtonsPanel, Panel):
|
||||
bl_label = "Sound"
|
||||
COMPAT_ENGINES = {'BLENDER_RENDER'}
|
||||
|
||||
@ -71,7 +72,7 @@ class DATA_PT_speaker(DataButtonsPanel, bpy.types.Panel):
|
||||
row.prop(speaker, "pitch")
|
||||
|
||||
|
||||
class DATA_PT_distance(DataButtonsPanel, bpy.types.Panel):
|
||||
class DATA_PT_distance(DataButtonsPanel, Panel):
|
||||
bl_label = "Distance"
|
||||
COMPAT_ENGINES = {'BLENDER_RENDER'}
|
||||
|
||||
@ -94,7 +95,7 @@ class DATA_PT_distance(DataButtonsPanel, bpy.types.Panel):
|
||||
col.prop(speaker, "distance_reference", text="Reference")
|
||||
|
||||
|
||||
class DATA_PT_cone(DataButtonsPanel, bpy.types.Panel):
|
||||
class DATA_PT_cone(DataButtonsPanel, Panel):
|
||||
bl_label = "Cone"
|
||||
COMPAT_ENGINES = {'BLENDER_RENDER'}
|
||||
|
||||
@ -116,7 +117,7 @@ class DATA_PT_cone(DataButtonsPanel, bpy.types.Panel):
|
||||
col.prop(speaker, "cone_volume_outer", text="Outer")
|
||||
|
||||
|
||||
class DATA_PT_custom_props_speaker(DataButtonsPanel, PropertyPanel, bpy.types.Panel):
|
||||
class DATA_PT_custom_props_speaker(DataButtonsPanel, PropertyPanel, Panel):
|
||||
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
||||
_context_path = "object.data"
|
||||
_property_type = bpy.types.Speaker
|
||||
|
@ -406,7 +406,7 @@ class SceneButtonsPanel():
|
||||
bl_context = "scene"
|
||||
|
||||
|
||||
class SCENE_PT_game_navmesh(SceneButtonsPanel, bpy.types.Panel):
|
||||
class SCENE_PT_game_navmesh(SceneButtonsPanel, Panel):
|
||||
bl_label = "Navigation mesh"
|
||||
bl_default_closed = True
|
||||
COMPAT_ENGINES = {'BLENDER_GAME'}
|
||||
|
@ -612,7 +612,7 @@ class MATERIAL_PT_flare(MaterialButtonsPanel, Panel):
|
||||
col.prop(halo, "flare_subflare_size", text="Subsize")
|
||||
|
||||
|
||||
class MATERIAL_PT_game_settings(MaterialButtonsPanel, bpy.types.Panel):
|
||||
class MATERIAL_PT_game_settings(MaterialButtonsPanel, Panel):
|
||||
bl_label = "Game Settings"
|
||||
COMPAT_ENGINES = {'BLENDER_GAME'}
|
||||
|
||||
@ -637,7 +637,7 @@ class MATERIAL_PT_game_settings(MaterialButtonsPanel, bpy.types.Panel):
|
||||
row.prop(game, "face_orientation", text="")
|
||||
|
||||
|
||||
class MATERIAL_PT_physics(MaterialButtonsPanel, bpy.types.Panel):
|
||||
class MATERIAL_PT_physics(MaterialButtonsPanel, Panel):
|
||||
bl_label = "Physics"
|
||||
COMPAT_ENGINES = {'BLENDER_GAME'}
|
||||
|
||||
|
@ -280,7 +280,7 @@ class OBJECT_PT_relations_extras(ObjectButtonsPanel, Panel):
|
||||
row.prop(ob, "slow_parent_offset", text="Offset")
|
||||
|
||||
|
||||
from bl_ui.properties_animviz import (
|
||||
from .properties_animviz import (
|
||||
MotionPathButtonsPanel,
|
||||
OnionSkinButtonsPanel,
|
||||
)
|
||||
|
@ -131,7 +131,7 @@ class ConstraintButtonsPanel():
|
||||
self.space_template(layout, con)
|
||||
|
||||
def IK(self, context, layout, con):
|
||||
if context.object.pose.ik_solver == "ITASC":
|
||||
if context.object.pose.ik_solver == 'ITASC':
|
||||
layout.prop(con, "ik_type")
|
||||
getattr(self, 'IK_' + con.ik_type)(context, layout, con)
|
||||
else:
|
||||
|
@ -21,7 +21,7 @@ import bpy
|
||||
from bpy.types import Panel
|
||||
from rna_prop_ui import PropertyPanel
|
||||
|
||||
from bl_ui.properties_physics_common import (
|
||||
from .properties_physics_common import (
|
||||
point_cache_ui,
|
||||
effector_weights_ui,
|
||||
basic_force_field_settings_ui,
|
||||
|
@ -20,7 +20,7 @@
|
||||
import bpy
|
||||
from bpy.types import Menu, Panel
|
||||
|
||||
from bl_ui.properties_physics_common import (
|
||||
from .properties_physics_common import (
|
||||
point_cache_ui,
|
||||
effector_weights_ui,
|
||||
)
|
||||
@ -60,61 +60,59 @@ class PHYSICS_PT_cloth(PhysicButtonsPanel, Panel):
|
||||
|
||||
md = context.cloth
|
||||
ob = context.object
|
||||
cloth = md.settings
|
||||
|
||||
if md:
|
||||
cloth = md.settings
|
||||
split = layout.split()
|
||||
|
||||
split = layout.split()
|
||||
split.active = cloth_panel_enabled(md)
|
||||
|
||||
split.active = cloth_panel_enabled(md)
|
||||
col = split.column()
|
||||
|
||||
col = split.column()
|
||||
col.label(text="Presets:")
|
||||
sub = col.row(align=True)
|
||||
sub.menu("CLOTH_MT_presets", text=bpy.types.CLOTH_MT_presets.bl_label)
|
||||
sub.operator("cloth.preset_add", text="", icon='ZOOMIN')
|
||||
sub.operator("cloth.preset_add", text="", icon='ZOOMOUT').remove_active = True
|
||||
|
||||
col.label(text="Presets:")
|
||||
sub = col.row(align=True)
|
||||
sub.menu("CLOTH_MT_presets", text=bpy.types.CLOTH_MT_presets.bl_label)
|
||||
sub.operator("cloth.preset_add", text="", icon='ZOOMIN')
|
||||
sub.operator("cloth.preset_add", text="", icon='ZOOMOUT').remove_active = True
|
||||
col.label(text="Quality:")
|
||||
col.prop(cloth, "quality", text="Steps", slider=True)
|
||||
|
||||
col.label(text="Quality:")
|
||||
col.prop(cloth, "quality", text="Steps", slider=True)
|
||||
col.label(text="Material:")
|
||||
col.prop(cloth, "mass")
|
||||
col.prop(cloth, "structural_stiffness", text="Structural")
|
||||
col.prop(cloth, "bending_stiffness", text="Bending")
|
||||
|
||||
col.label(text="Material:")
|
||||
col.prop(cloth, "mass")
|
||||
col.prop(cloth, "structural_stiffness", text="Structural")
|
||||
col.prop(cloth, "bending_stiffness", text="Bending")
|
||||
col = split.column()
|
||||
|
||||
col = split.column()
|
||||
col.label(text="Damping:")
|
||||
col.prop(cloth, "spring_damping", text="Spring")
|
||||
col.prop(cloth, "air_damping", text="Air")
|
||||
|
||||
col.label(text="Damping:")
|
||||
col.prop(cloth, "spring_damping", text="Spring")
|
||||
col.prop(cloth, "air_damping", text="Air")
|
||||
col.prop(cloth, "use_pin_cloth", text="Pinning")
|
||||
sub = col.column()
|
||||
sub.active = cloth.use_pin_cloth
|
||||
sub.prop_search(cloth, "vertex_group_mass", ob, "vertex_groups", text="")
|
||||
sub.prop(cloth, "pin_stiffness", text="Stiffness")
|
||||
|
||||
col.prop(cloth, "use_pin_cloth", text="Pinning")
|
||||
sub = col.column()
|
||||
sub.active = cloth.use_pin_cloth
|
||||
sub.prop_search(cloth, "vertex_group_mass", ob, "vertex_groups", text="")
|
||||
sub.prop(cloth, "pin_stiffness", text="Stiffness")
|
||||
col.label(text="Pre roll:")
|
||||
col.prop(cloth, "pre_roll", text="Frame")
|
||||
|
||||
col.label(text="Pre roll:")
|
||||
col.prop(cloth, "pre_roll", text="Frame")
|
||||
# Disabled for now
|
||||
"""
|
||||
if cloth.vertex_group_mass:
|
||||
layout.label(text="Goal:")
|
||||
|
||||
# Disabled for now
|
||||
"""
|
||||
if cloth.vertex_group_mass:
|
||||
layout.label(text="Goal:")
|
||||
col = layout.column_flow()
|
||||
col.prop(cloth, "goal_default", text="Default")
|
||||
col.prop(cloth, "goal_spring", text="Stiffness")
|
||||
col.prop(cloth, "goal_friction", text="Friction")
|
||||
"""
|
||||
|
||||
col = layout.column_flow()
|
||||
col.prop(cloth, "goal_default", text="Default")
|
||||
col.prop(cloth, "goal_spring", text="Stiffness")
|
||||
col.prop(cloth, "goal_friction", text="Friction")
|
||||
"""
|
||||
key = ob.data.shape_keys
|
||||
|
||||
key = ob.data.shape_keys
|
||||
|
||||
if key:
|
||||
col.label(text="Rest Shape Key:")
|
||||
col.prop_search(cloth, "rest_shape_key", key, "key_blocks", text="")
|
||||
if key:
|
||||
col.label(text="Rest Shape Key:")
|
||||
col.prop_search(cloth, "rest_shape_key", key, "key_blocks", text="")
|
||||
|
||||
|
||||
class PHYSICS_PT_cloth_cache(PhysicButtonsPanel, Panel):
|
||||
|
@ -17,13 +17,16 @@
|
||||
# ##### END GPL LICENSE BLOCK #####
|
||||
|
||||
# <pep8 compliant>
|
||||
import bpy
|
||||
|
||||
from bl_ui.properties_physics_common import (
|
||||
import bpy
|
||||
from bpy.types import Panel
|
||||
|
||||
from .properties_physics_common import (
|
||||
point_cache_ui,
|
||||
effector_weights_ui,
|
||||
)
|
||||
|
||||
|
||||
class PhysicButtonsPanel():
|
||||
bl_space_type = 'PROPERTIES'
|
||||
bl_region_type = 'WINDOW'
|
||||
@ -33,10 +36,10 @@ class PhysicButtonsPanel():
|
||||
def poll(cls, context):
|
||||
ob = context.object
|
||||
rd = context.scene.render
|
||||
return (ob and ob.type == 'MESH') and (not rd.use_game_engine) and (context.dynamic_paint)
|
||||
return (ob and ob.type == 'MESH') and (not rd.use_game_engine) and context.dynamic_paint
|
||||
|
||||
|
||||
class PHYSICS_PT_dynamic_paint(PhysicButtonsPanel, bpy.types.Panel):
|
||||
class PHYSICS_PT_dynamic_paint(PhysicButtonsPanel, Panel):
|
||||
bl_label = "Dynamic Paint"
|
||||
|
||||
def draw(self, context):
|
||||
@ -45,82 +48,81 @@ class PHYSICS_PT_dynamic_paint(PhysicButtonsPanel, bpy.types.Panel):
|
||||
md = context.dynamic_paint
|
||||
ob = context.object
|
||||
|
||||
if md:
|
||||
layout.prop(md, "ui_type", expand=True)
|
||||
layout.prop(md, "ui_type", expand=True)
|
||||
|
||||
if (md.ui_type == "CANVAS"):
|
||||
canvas = md.canvas_settings
|
||||
|
||||
if (not canvas):
|
||||
layout.operator("dpaint.type_toggle", text="Add Canvas").type = 'CANVAS'
|
||||
if md.ui_type == 'CANVAS':
|
||||
canvas = md.canvas_settings
|
||||
|
||||
if canvas is None:
|
||||
layout.operator("dpaint.type_toggle", text="Add Canvas").type = 'CANVAS'
|
||||
else:
|
||||
layout.operator("dpaint.type_toggle", text="Remove Canvas", icon='X').type = 'CANVAS'
|
||||
|
||||
surface = canvas.canvas_surfaces.active
|
||||
|
||||
row = layout.row()
|
||||
row.template_list(canvas, "canvas_surfaces", canvas.canvas_surfaces, "active_index", rows=2)
|
||||
|
||||
col = row.column(align=True)
|
||||
col.operator("dpaint.surface_slot_add", icon='ZOOMIN', text="")
|
||||
col.operator("dpaint.surface_slot_remove", icon='ZOOMOUT', text="")
|
||||
|
||||
if surface:
|
||||
layout.prop(surface, "name")
|
||||
layout.prop(surface, "surface_format")
|
||||
|
||||
col = layout.column()
|
||||
if surface.surface_format != 'VERTEX':
|
||||
col.label(text="Quality:")
|
||||
col.prop(surface, "image_resolution")
|
||||
col.prop(surface, "use_antialiasing")
|
||||
|
||||
col = layout.column()
|
||||
col.label(text="Frames:")
|
||||
split = col.split()
|
||||
|
||||
col = split.column(align=True)
|
||||
col.prop(surface, "frame_start", text="Start")
|
||||
col.prop(surface, "frame_end", text="End")
|
||||
|
||||
split.prop(surface, "frame_substeps")
|
||||
|
||||
elif md.ui_type == 'BRUSH':
|
||||
brush = md.brush_settings
|
||||
engine = context.scene.render.engine
|
||||
|
||||
if brush is None:
|
||||
layout.operator("dpaint.type_toggle", text="Add Brush").type = 'BRUSH'
|
||||
else:
|
||||
layout.operator("dpaint.type_toggle", text="Remove Brush", icon='X').type = 'BRUSH'
|
||||
|
||||
split = layout.split()
|
||||
|
||||
col = split.column()
|
||||
col.prop(brush, "absolute_alpha")
|
||||
col.prop(brush, "paint_erase")
|
||||
col.prop(brush, "paint_wetness", text="Wetness")
|
||||
|
||||
col = split.column()
|
||||
if engine == 'BLENDER_RENDER':
|
||||
sub = col.column()
|
||||
sub.active = (brush.paint_source != 'PARTICLE_SYSTEM')
|
||||
sub.prop(brush, "use_material")
|
||||
if brush.use_material and brush.paint_source != 'PARTICLE_SYSTEM' and engine == 'BLENDER_RENDER':
|
||||
col.prop(brush, "material", text="")
|
||||
col.prop(brush, "paint_alpha", text="Alpha Factor")
|
||||
else:
|
||||
layout.operator("dpaint.type_toggle", text="Remove Canvas", icon='X').type = 'CANVAS'
|
||||
|
||||
surface = canvas.canvas_surfaces.active
|
||||
row = layout.row()
|
||||
row.template_list(canvas, "canvas_surfaces", canvas.canvas_surfaces, "active_index", rows=2)
|
||||
|
||||
col = row.column(align=True)
|
||||
col.operator("dpaint.surface_slot_add", icon='ZOOMIN', text="")
|
||||
col.operator("dpaint.surface_slot_remove", icon='ZOOMOUT', text="")
|
||||
|
||||
if surface:
|
||||
layout.prop(surface, "name")
|
||||
layout.prop(surface, "surface_format", expand=False)
|
||||
col = layout.column()
|
||||
|
||||
if surface.surface_format != "VERTEX":
|
||||
col.label(text="Quality:")
|
||||
col.prop(surface, "image_resolution")
|
||||
col.prop(surface, "use_antialiasing")
|
||||
|
||||
col = layout.column()
|
||||
col.label(text="Frames:")
|
||||
split = col.split()
|
||||
|
||||
col = split.column(align=True)
|
||||
col.prop(surface, "frame_start", text="Start")
|
||||
col.prop(surface, "frame_end", text="End")
|
||||
|
||||
col = split.column()
|
||||
col.prop(surface, "frame_substeps")
|
||||
|
||||
elif (md.ui_type == "BRUSH"):
|
||||
brush = md.brush_settings
|
||||
engine = context.scene.render.engine
|
||||
|
||||
if (not brush):
|
||||
layout.operator("dpaint.type_toggle", text="Add Brush").type = 'BRUSH'
|
||||
else:
|
||||
layout.operator("dpaint.type_toggle", text="Remove Brush", icon='X').type = 'BRUSH'
|
||||
|
||||
split = layout.split()
|
||||
|
||||
col = split.column()
|
||||
col.prop(brush, "absolute_alpha")
|
||||
col.prop(brush, "paint_erase")
|
||||
col.prop(brush, "paint_wetness", text="Wetness")
|
||||
|
||||
col = split.column()
|
||||
if (engine == 'BLENDER_RENDER'):
|
||||
sub = col.column()
|
||||
sub.active = (brush.paint_source != "PARTICLE_SYSTEM");
|
||||
sub.prop(brush, "use_material")
|
||||
if brush.use_material and brush.paint_source != "PARTICLE_SYSTEM" and (engine == 'BLENDER_RENDER'):
|
||||
col.prop(brush, "material", text="")
|
||||
col.prop(brush, "paint_alpha", text="Alpha Factor")
|
||||
else:
|
||||
col.prop(brush, "paint_color", text="")
|
||||
col.prop(brush, "paint_alpha", text="Alpha")
|
||||
col.prop(brush, "paint_color", text="")
|
||||
col.prop(brush, "paint_alpha", text="Alpha")
|
||||
|
||||
|
||||
class PHYSICS_PT_dp_advanced_canvas(PhysicButtonsPanel, bpy.types.Panel):
|
||||
class PHYSICS_PT_dp_advanced_canvas(PhysicButtonsPanel, Panel):
|
||||
bl_label = "Dynamic Paint Advanced"
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
md = context.dynamic_paint
|
||||
return md and (md.ui_type == "CANVAS") and (md.canvas_settings) and (md.canvas_settings.canvas_surfaces.active)
|
||||
return md and md.ui_type == 'CANVAS' and md.canvas_settings and md.canvas_settings.canvas_surfaces.active
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
@ -129,75 +131,70 @@ class PHYSICS_PT_dp_advanced_canvas(PhysicButtonsPanel, bpy.types.Panel):
|
||||
surface = canvas.canvas_surfaces.active
|
||||
ob = context.object
|
||||
|
||||
layout.prop(surface, "surface_type", expand=False)
|
||||
surface_type = surface.surface_type
|
||||
|
||||
layout.prop(surface, "surface_type")
|
||||
layout.separator()
|
||||
|
||||
# dissolve
|
||||
if (surface.surface_type == "PAINT"):
|
||||
if surface_type == 'PAINT':
|
||||
split = layout.split(percentage=0.35)
|
||||
col = split.column()
|
||||
col.label(text="Wetmap drying:")
|
||||
split.label(text="Wetmap drying:")
|
||||
|
||||
col = split.column()
|
||||
split = col.split(percentage=0.7)
|
||||
col = split.column()
|
||||
col.prop(surface, "dry_speed", text="Time")
|
||||
col = split.column()
|
||||
col.prop(surface, "use_dry_log", text="Slow")
|
||||
|
||||
if (surface.surface_type != "WAVE"):
|
||||
split.prop(surface, "dry_speed", text="Time")
|
||||
split.prop(surface, "use_dry_log", text="Slow")
|
||||
|
||||
if surface_type != 'WAVE':
|
||||
split = layout.split(percentage=0.35)
|
||||
col = split.column()
|
||||
if (surface.surface_type == "DISPLACE"):
|
||||
col.prop(surface, "use_dissolve", text="Dissolve:")
|
||||
elif (surface.surface_type == "WEIGHT"):
|
||||
if surface_type == 'WEIGHT':
|
||||
col.prop(surface, "use_dissolve", text="Fade:")
|
||||
else:
|
||||
col.prop(surface, "use_dissolve", text="Dissolve:")
|
||||
col = split.column()
|
||||
col.active = surface.use_dissolve
|
||||
split = col.split(percentage=0.7)
|
||||
col = split.column()
|
||||
col.prop(surface, "dissolve_speed", text="Time")
|
||||
col = split.column()
|
||||
col.prop(surface, "use_dissolve_log", text="Slow")
|
||||
|
||||
split.prop(surface, "dissolve_speed", text="Time")
|
||||
split.prop(surface, "use_dissolve_log", text="Slow")
|
||||
|
||||
# per type settings
|
||||
if (surface.surface_type == "DISPLACE"):
|
||||
if surface_type == 'DISPLACE':
|
||||
layout.prop(surface, "use_incremental_displace")
|
||||
if (surface.surface_format == "VERTEX"):
|
||||
split = layout.split()
|
||||
col = split.column()
|
||||
col.prop(surface, "depth_clamp")
|
||||
col = split.column()
|
||||
col.prop(surface, "displace_factor")
|
||||
|
||||
if (surface.surface_type == "WAVE"):
|
||||
if surface.surface_format == 'VERTEX':
|
||||
row = layout.row()
|
||||
row.prop(surface, "depth_clamp")
|
||||
row.prop(surface, "displace_factor")
|
||||
|
||||
elif surface_type == 'WAVE':
|
||||
layout.prop(surface, "wave_open_borders")
|
||||
|
||||
|
||||
split = layout.split()
|
||||
|
||||
|
||||
col = split.column(align=True)
|
||||
col.prop(surface, "wave_timescale")
|
||||
col.prop(surface, "wave_speed")
|
||||
|
||||
|
||||
col = split.column(align=True)
|
||||
col.prop(surface, "wave_damping")
|
||||
col.prop(surface, "wave_spring")
|
||||
|
||||
|
||||
layout.separator()
|
||||
layout.prop(surface, "brush_group", text="Brush Group")
|
||||
|
||||
class PHYSICS_PT_dp_canvas_output(PhysicButtonsPanel, bpy.types.Panel):
|
||||
|
||||
class PHYSICS_PT_dp_canvas_output(PhysicButtonsPanel, Panel):
|
||||
bl_label = "Dynamic Paint Output"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
md = context.dynamic_paint
|
||||
if (not (md and (md.ui_type == "CANVAS") and (md.canvas_settings))):
|
||||
if not (md and md.ui_type == 'CANVAS' and md.canvas_settings):
|
||||
return 0
|
||||
surface = context.dynamic_paint.canvas_settings.canvas_surfaces.active
|
||||
return (surface and not (surface.surface_format=="VERTEX" and (surface.surface_type=="DISPLACE" or surface.surface_type=="WAVE")))
|
||||
return surface and not (surface.surface_format == 'VERTEX' and (surface.surface_type in {'DISPLACE', 'WAVE'}))
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
@ -205,90 +202,89 @@ class PHYSICS_PT_dp_canvas_output(PhysicButtonsPanel, bpy.types.Panel):
|
||||
canvas = context.dynamic_paint.canvas_settings
|
||||
surface = canvas.canvas_surfaces.active
|
||||
ob = context.object
|
||||
|
||||
|
||||
surface_type = surface.surface_type
|
||||
|
||||
# vertex format outputs
|
||||
if (surface.surface_format == "VERTEX"):
|
||||
if (surface.surface_type == "PAINT"):
|
||||
if surface.surface_format == 'VERTEX':
|
||||
if surface_type == 'PAINT':
|
||||
# toggle active preview
|
||||
layout.prop(surface, "preview_id")
|
||||
|
||||
|
||||
# paintmap output
|
||||
row = layout.row()
|
||||
row.prop_search(surface, "output_name", ob.data, "vertex_colors", text="Paintmap layer: ")
|
||||
ic = 'ZOOMIN'
|
||||
if (surface.output_exists(object=ob, index=0)):
|
||||
if surface.output_exists(object=ob, index=0):
|
||||
ic = 'ZOOMOUT'
|
||||
col = row.column(align=True)
|
||||
col.operator("dpaint.output_toggle", icon=ic, text="").index = 0
|
||||
|
||||
else:
|
||||
ic = 'ZOOMIN'
|
||||
|
||||
row.operator("dpaint.output_toggle", icon=ic, text="").index = 0
|
||||
|
||||
# wetmap output
|
||||
row = layout.row()
|
||||
row.prop_search(surface, "output_name2", ob.data, "vertex_colors", text="Wetmap layer: ")
|
||||
ic = 'ZOOMIN'
|
||||
if (surface.output_exists(object=ob, index=1)):
|
||||
if surface.output_exists(object=ob, index=1):
|
||||
ic = 'ZOOMOUT'
|
||||
col = row.column(align=True)
|
||||
col.operator("dpaint.output_toggle", icon=ic, text="").index = 1
|
||||
if (surface.surface_type == "WEIGHT"):
|
||||
else:
|
||||
ic = 'ZOOMIN'
|
||||
|
||||
row.operator("dpaint.output_toggle", icon=ic, text="").index = 1
|
||||
|
||||
elif surface_type == 'WEIGHT':
|
||||
row = layout.row()
|
||||
row.prop_search(surface, "output_name", ob, "vertex_groups", text="Vertex Group: ")
|
||||
ic = 'ZOOMIN'
|
||||
if (surface.output_exists(object=ob, index=0)):
|
||||
if surface.output_exists(object=ob, index=0):
|
||||
ic = 'ZOOMOUT'
|
||||
col = row.column(align=True)
|
||||
col.operator("dpaint.output_toggle", icon=ic, text="").index = 0
|
||||
else:
|
||||
ic = 'ZOOMIN'
|
||||
|
||||
row.operator("dpaint.output_toggle", icon=ic, text="").index = 0
|
||||
|
||||
# image format outputs
|
||||
if (surface.surface_format == "IMAGE"):
|
||||
col = layout.column()
|
||||
col.operator("dpaint.bake", text="Bake Image Sequence", icon='MOD_DYNAMICPAINT')
|
||||
col.prop_search(surface, "uv_layer", ob.data, "uv_textures", text="UV layer:")
|
||||
if surface.surface_format == 'IMAGE':
|
||||
layout.operator("dpaint.bake", text="Bake Image Sequence", icon='MOD_DYNAMICPAINT')
|
||||
layout.prop_search(surface, "uv_layer", ob.data, "uv_textures", text="UV layer:")
|
||||
layout.separator()
|
||||
|
||||
col.separator()
|
||||
col = layout.column()
|
||||
col.prop(surface, "image_output_path", text="")
|
||||
split = layout.split()
|
||||
col = split.column()
|
||||
col.prop(surface, "image_fileformat", text="")
|
||||
col = split.column()
|
||||
col.prop(surface, "premultiply", text="Premultiply alpha")
|
||||
col.separator()
|
||||
|
||||
if (surface.surface_type == "PAINT"):
|
||||
|
||||
layout.prop(surface, "image_output_path", text="")
|
||||
row = layout.row()
|
||||
row.prop(surface, "image_fileformat", text="")
|
||||
row.prop(surface, "premultiply", text="Premultiply alpha")
|
||||
|
||||
if surface_type == 'PAINT':
|
||||
split = layout.split(percentage=0.4)
|
||||
col = split.column()
|
||||
col.prop(surface, "do_output1", text="Paintmaps:")
|
||||
sub = split.column()
|
||||
split.prop(surface, "do_output1", text="Paintmaps:")
|
||||
sub = split.row()
|
||||
sub.active = surface.do_output1
|
||||
sub.prop(surface, "output_name", text="")
|
||||
|
||||
|
||||
split = layout.split(percentage=0.4)
|
||||
col = split.column()
|
||||
col.prop(surface, "do_output2", text="Wetmaps:")
|
||||
sub = split.column()
|
||||
split.prop(surface, "do_output2", text="Wetmaps:")
|
||||
sub = split.row()
|
||||
sub.active = surface.do_output2
|
||||
sub.prop(surface, "output_name2", text="")
|
||||
else:
|
||||
col = layout.column()
|
||||
col.prop(surface, "output_name", text="Filename: ")
|
||||
if (surface.surface_type == "DISPLACE"):
|
||||
if surface_type == 'DISPLACE':
|
||||
col.prop(surface, "displace_type", text="Displace Type")
|
||||
col.prop(surface, "depth_clamp")
|
||||
if (surface.surface_type == "WAVE"):
|
||||
elif surface_type == 'WAVE':
|
||||
col.prop(surface, "depth_clamp", text="Wave Clamp")
|
||||
|
||||
class PHYSICS_PT_dp_canvas_initial_color(PhysicButtonsPanel, bpy.types.Panel):
|
||||
|
||||
class PHYSICS_PT_dp_canvas_initial_color(PhysicButtonsPanel, Panel):
|
||||
bl_label = "Dynamic Paint Initial Color"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
md = context.dynamic_paint
|
||||
if (not (md and (md.ui_type == "CANVAS") and (md.canvas_settings))):
|
||||
if not (md and md.ui_type == 'CANVAS' and md.canvas_settings):
|
||||
return 0
|
||||
surface = context.dynamic_paint.canvas_settings.canvas_surfaces.active
|
||||
return (surface and surface.surface_type=="PAINT")
|
||||
return (surface and surface.surface_type == 'PAINT')
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
@ -301,27 +297,28 @@ class PHYSICS_PT_dp_canvas_initial_color(PhysicButtonsPanel, bpy.types.Panel):
|
||||
layout.separator()
|
||||
|
||||
# dissolve
|
||||
if (surface.init_color_type == "COLOR"):
|
||||
if surface.init_color_type == 'COLOR':
|
||||
layout.prop(surface, "init_color")
|
||||
|
||||
if (surface.init_color_type == "TEXTURE"):
|
||||
|
||||
elif surface.init_color_type == 'TEXTURE':
|
||||
layout.prop(surface, "init_texture")
|
||||
layout.prop_search(surface, "init_layername", ob.data, "uv_textures", text="UV Layer:")
|
||||
|
||||
if (surface.init_color_type == "VERTEX_COLOR"):
|
||||
|
||||
elif surface.init_color_type == 'VERTEX_COLOR':
|
||||
layout.prop_search(surface, "init_layername", ob.data, "vertex_colors", text="Color Layer: ")
|
||||
|
||||
class PHYSICS_PT_dp_effects(PhysicButtonsPanel, bpy.types.Panel):
|
||||
|
||||
class PHYSICS_PT_dp_effects(PhysicButtonsPanel, Panel):
|
||||
bl_label = "Dynamic Paint Effects"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
md = context.dynamic_paint
|
||||
if (not (md and (md.ui_type == "CANVAS") and (md.canvas_settings))):
|
||||
return False;
|
||||
if not (md and md.ui_type == 'CANVAS' and md.canvas_settings):
|
||||
return False
|
||||
surface = context.dynamic_paint.canvas_settings.canvas_surfaces.active
|
||||
return surface and (surface.surface_type == "PAINT")
|
||||
return (surface and surface.surface_type == 'PAINT')
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
@ -331,75 +328,75 @@ class PHYSICS_PT_dp_effects(PhysicButtonsPanel, bpy.types.Panel):
|
||||
|
||||
layout.prop(surface, "effect_ui", expand=True)
|
||||
|
||||
if surface.effect_ui == "SPREAD":
|
||||
if surface.effect_ui == 'SPREAD':
|
||||
layout.prop(surface, "use_spread")
|
||||
col = layout.column()
|
||||
col.active = surface.use_spread
|
||||
split = col.split()
|
||||
sub = split.column()
|
||||
sub.prop(surface, "spread_speed")
|
||||
sub = split.column()
|
||||
sub.prop(surface, "color_spread_speed")
|
||||
|
||||
elif surface.effect_ui == "DRIP":
|
||||
row = layout.row()
|
||||
row.active = surface.use_spread
|
||||
row.prop(surface, "spread_speed")
|
||||
row.prop(surface, "color_spread_speed")
|
||||
|
||||
elif surface.effect_ui == 'DRIP':
|
||||
layout.prop(surface, "use_drip")
|
||||
|
||||
col = layout.column()
|
||||
col.active = surface.use_drip
|
||||
effector_weights_ui(self, context, surface.effector_weights)
|
||||
split = layout.split()
|
||||
|
||||
layout.label(text="Surface Movement:")
|
||||
split = layout.split()
|
||||
col = split.column()
|
||||
col.prop(surface, "drip_velocity", slider=True)
|
||||
col = split.column()
|
||||
col.prop(surface, "drip_acceleration", slider=True)
|
||||
row = layout.row()
|
||||
row.prop(surface, "drip_velocity", slider=True)
|
||||
row.prop(surface, "drip_acceleration", slider=True)
|
||||
|
||||
elif surface.effect_ui == "SHRINK":
|
||||
elif surface.effect_ui == 'SHRINK':
|
||||
layout.prop(surface, "use_shrink")
|
||||
col = layout.column()
|
||||
col.active = surface.use_shrink
|
||||
col.prop(surface, "shrink_speed")
|
||||
|
||||
|
||||
class PHYSICS_PT_dp_cache(PhysicButtonsPanel, bpy.types.Panel):
|
||||
row = layout.row()
|
||||
row.active = surface.use_shrink
|
||||
row.prop(surface, "shrink_speed")
|
||||
|
||||
|
||||
class PHYSICS_PT_dp_cache(PhysicButtonsPanel, Panel):
|
||||
bl_label = "Dynamic Paint Cache"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
md = context.dynamic_paint
|
||||
return md and (md.ui_type == "CANVAS") and (md.canvas_settings) and \
|
||||
(md.canvas_settings.canvas_surfaces.active) and (md.canvas_settings.canvas_surfaces.active.uses_cache)
|
||||
return (md and
|
||||
md.ui_type == 'CANVAS' and
|
||||
md.canvas_settings and
|
||||
md.canvas_settings.canvas_surfaces.active and
|
||||
md.canvas_settings.canvas_surfaces.active.uses_cache)
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
||||
surface = context.dynamic_paint.canvas_settings.canvas_surfaces.active
|
||||
cache = surface.point_cache
|
||||
|
||||
|
||||
point_cache_ui(self, context, cache, (cache.is_baked is False), 'DYNAMIC_PAINT')
|
||||
|
||||
|
||||
class PHYSICS_PT_dp_brush_source(PhysicButtonsPanel, bpy.types.Panel):
|
||||
class PHYSICS_PT_dp_brush_source(PhysicButtonsPanel, Panel):
|
||||
bl_label = "Dynamic Paint Source"
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
md = context.dynamic_paint
|
||||
return md and (md.ui_type == "BRUSH") and (md.brush_settings)
|
||||
return md and md.ui_type == 'BRUSH' and md.brush_settings
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
||||
brush = context.dynamic_paint.brush_settings
|
||||
ob = context.object
|
||||
|
||||
|
||||
split = layout.split()
|
||||
col = split.column()
|
||||
col.prop(brush, "paint_source")
|
||||
|
||||
if brush.paint_source == "PARTICLE_SYSTEM":
|
||||
if brush.paint_source == 'PARTICLE_SYSTEM':
|
||||
col.prop_search(brush, "particle_system", ob, "particle_systems", text="")
|
||||
if brush.particle_system:
|
||||
col.label(text="Particle effect:")
|
||||
@ -408,83 +405,86 @@ class PHYSICS_PT_dp_brush_source(PhysicButtonsPanel, bpy.types.Panel):
|
||||
sub.prop(brush, "solid_radius", text="Solid Radius")
|
||||
col.prop(brush, "use_particle_radius", text="Use Particle's Radius")
|
||||
col.prop(brush, "smooth_radius", text="Smooth radius")
|
||||
|
||||
|
||||
if brush.paint_source in {'DISTANCE', 'VOLUME_DISTANCE', 'POINT'}:
|
||||
col.prop(brush, "paint_distance", text="Paint Distance")
|
||||
split = layout.row().split(percentage=0.4)
|
||||
sub = split.column()
|
||||
if brush.paint_source == 'DISTANCE':
|
||||
sub.prop(brush, "proximity_project")
|
||||
if brush.paint_source == "VOLUME_DISTANCE":
|
||||
elif brush.paint_source == 'VOLUME_DISTANCE':
|
||||
sub.prop(brush, "proximity_inverse")
|
||||
|
||||
|
||||
sub = split.column()
|
||||
if brush.paint_source == 'DISTANCE':
|
||||
column = sub.column()
|
||||
column.active = brush.proximity_project
|
||||
column.prop(brush, "ray_direction")
|
||||
sub.prop(brush, "proximity_falloff")
|
||||
if brush.proximity_falloff == "RAMP":
|
||||
if brush.proximity_falloff == 'RAMP':
|
||||
col = layout.row().column()
|
||||
col.separator()
|
||||
col.prop(brush, "proximity_ramp_alpha", text="Only Use Alpha")
|
||||
col.template_color_ramp(brush, "paint_ramp", expand=True)
|
||||
|
||||
class PHYSICS_PT_dp_brush_velocity(PhysicButtonsPanel, bpy.types.Panel):
|
||||
|
||||
|
||||
class PHYSICS_PT_dp_brush_velocity(PhysicButtonsPanel, Panel):
|
||||
bl_label = "Dynamic Paint Velocity"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
md = context.dynamic_paint
|
||||
return md and (md.ui_type == "BRUSH") and (md.brush_settings)
|
||||
return md and md.ui_type == 'BRUSH' and md.brush_settings
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
||||
brush = context.dynamic_paint.brush_settings
|
||||
ob = context.object
|
||||
|
||||
|
||||
split = layout.split()
|
||||
|
||||
col = split.column()
|
||||
col.prop(brush, "velocity_alpha")
|
||||
col.prop(brush, "velocity_color")
|
||||
col = split.column()
|
||||
col.prop(brush, "velocity_depth")
|
||||
sub = layout.row().column()
|
||||
sub.active = (brush.velocity_alpha or brush.velocity_color or brush.velocity_depth)
|
||||
sub.prop(brush, "max_velocity")
|
||||
sub.template_color_ramp(brush, "velocity_ramp", expand=True)
|
||||
|
||||
split.prop(brush, "velocity_depth")
|
||||
|
||||
col = layout.column()
|
||||
col.active = (brush.velocity_alpha or brush.velocity_color or brush.velocity_depth)
|
||||
col.prop(brush, "max_velocity")
|
||||
col.template_color_ramp(brush, "velocity_ramp", expand=True)
|
||||
layout.separator()
|
||||
split = layout.split()
|
||||
col = split.column()
|
||||
col.prop(brush, "do_smudge")
|
||||
col = split.column()
|
||||
col.active = brush.do_smudge
|
||||
col.prop(brush, "smudge_strength")
|
||||
|
||||
class PHYSICS_PT_dp_brush_wave(PhysicButtonsPanel, bpy.types.Panel):
|
||||
|
||||
row = layout.row()
|
||||
row.prop(brush, "do_smudge")
|
||||
sub = row.row()
|
||||
sub.active = brush.do_smudge
|
||||
sub.prop(brush, "smudge_strength")
|
||||
|
||||
|
||||
class PHYSICS_PT_dp_brush_wave(PhysicButtonsPanel, Panel):
|
||||
bl_label = "Dynamic Paint Waves"
|
||||
bl_options = {'DEFAULT_CLOSED'}
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
md = context.dynamic_paint
|
||||
return md and (md.ui_type == "BRUSH") and (md.brush_settings)
|
||||
return md and md.ui_type == 'BRUSH' and md.brush_settings
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
||||
brush = context.dynamic_paint.brush_settings
|
||||
ob = context.object
|
||||
|
||||
|
||||
layout.prop(brush, "wave_type")
|
||||
if (brush.wave_type != "REFLECT"):
|
||||
split = layout.split(percentage=0.5)
|
||||
col = split.column()
|
||||
col.prop(brush, "wave_factor")
|
||||
col = split.column()
|
||||
col.prop(brush, "wave_clamp")
|
||||
if brush.wave_type != 'REFLECT':
|
||||
row = layout.row()
|
||||
row.prop(brush, "wave_factor")
|
||||
row.prop(brush, "wave_clamp")
|
||||
|
||||
|
||||
def register():
|
||||
bpy.utils.register_module(__name__)
|
||||
|
@ -20,7 +20,7 @@
|
||||
import bpy
|
||||
from bpy.types import Panel
|
||||
|
||||
from bl_ui.properties_physics_common import (
|
||||
from .properties_physics_common import (
|
||||
basic_force_field_settings_ui,
|
||||
basic_force_field_falloff_ui,
|
||||
)
|
||||
|
@ -40,151 +40,149 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel, Panel):
|
||||
layout = self.layout
|
||||
|
||||
md = context.fluid
|
||||
fluid = md.settings
|
||||
|
||||
if md:
|
||||
fluid = md.settings
|
||||
row = layout.row()
|
||||
if fluid is None:
|
||||
row.label("Built without fluids")
|
||||
return
|
||||
|
||||
row = layout.row()
|
||||
if fluid is None:
|
||||
row.label("Built without fluids")
|
||||
return
|
||||
row.prop(fluid, "type")
|
||||
if fluid.type not in {'NONE', 'DOMAIN', 'PARTICLE', 'FLUID'}:
|
||||
row.prop(fluid, "use", text="")
|
||||
|
||||
row.prop(fluid, "type")
|
||||
if fluid.type not in {'NONE', 'DOMAIN', 'PARTICLE', 'FLUID'}:
|
||||
row.prop(fluid, "use", text="")
|
||||
layout = layout.column()
|
||||
if fluid.type not in {'NONE', 'DOMAIN', 'PARTICLE', 'FLUID'}:
|
||||
layout.active = fluid.use
|
||||
|
||||
layout = layout.column()
|
||||
if fluid.type not in {'NONE', 'DOMAIN', 'PARTICLE', 'FLUID'}:
|
||||
layout.active = fluid.use
|
||||
if fluid.type == 'DOMAIN':
|
||||
layout.operator("fluid.bake", text="Bake (Req. Memory:" + " %s)" % fluid.memory_estimate, icon='MOD_FLUIDSIM')
|
||||
split = layout.split()
|
||||
|
||||
if fluid.type == 'DOMAIN':
|
||||
layout.operator("fluid.bake", text="Bake (Req. Memory:" + " %s)" % fluid.memory_estimate, icon='MOD_FLUIDSIM')
|
||||
split = layout.split()
|
||||
col = split.column()
|
||||
col.label(text="Resolution:")
|
||||
col.prop(fluid, "resolution", text="Final")
|
||||
col.label(text="Render Display:")
|
||||
col.prop(fluid, "render_display_mode", text="")
|
||||
|
||||
col = split.column()
|
||||
col.label(text="Resolution:")
|
||||
col.prop(fluid, "resolution", text="Final")
|
||||
col.label(text="Render Display:")
|
||||
col.prop(fluid, "render_display_mode", text="")
|
||||
col = split.column()
|
||||
col.label()
|
||||
col.prop(fluid, "preview_resolution", text="Preview")
|
||||
col.label(text="Viewport Display:")
|
||||
col.prop(fluid, "viewport_display_mode", text="")
|
||||
|
||||
col = split.column()
|
||||
col.label()
|
||||
col.prop(fluid, "preview_resolution", text="Preview")
|
||||
col.label(text="Viewport Display:")
|
||||
col.prop(fluid, "viewport_display_mode", text="")
|
||||
split = layout.split()
|
||||
|
||||
split = layout.split()
|
||||
col = split.column()
|
||||
col.label(text="Time:")
|
||||
sub = col.column(align=True)
|
||||
sub.prop(fluid, "start_time", text="Start")
|
||||
sub.prop(fluid, "end_time", text="End")
|
||||
|
||||
col = split.column()
|
||||
col.label(text="Time:")
|
||||
sub = col.column(align=True)
|
||||
sub.prop(fluid, "start_time", text="Start")
|
||||
sub.prop(fluid, "end_time", text="End")
|
||||
col = split.column()
|
||||
col.label()
|
||||
col.prop(fluid, "use_speed_vectors")
|
||||
col.prop(fluid, "use_reverse_frames")
|
||||
|
||||
col = split.column()
|
||||
col.label()
|
||||
col.prop(fluid, "use_speed_vectors")
|
||||
col.prop(fluid, "use_reverse_frames")
|
||||
layout.prop(fluid, "filepath", text="")
|
||||
|
||||
layout.prop(fluid, "filepath", text="")
|
||||
elif fluid.type == 'FLUID':
|
||||
split = layout.split()
|
||||
|
||||
elif fluid.type == 'FLUID':
|
||||
split = layout.split()
|
||||
col = split.column()
|
||||
col.label(text="Volume Initialization:")
|
||||
col.prop(fluid, "volume_initialization", text="")
|
||||
col.prop(fluid, "use_animated_mesh")
|
||||
|
||||
col = split.column()
|
||||
col.label(text="Volume Initialization:")
|
||||
col.prop(fluid, "volume_initialization", text="")
|
||||
col.prop(fluid, "use_animated_mesh")
|
||||
col = split.column()
|
||||
col.label(text="Initial Velocity:")
|
||||
col.prop(fluid, "initial_velocity", text="")
|
||||
|
||||
col = split.column()
|
||||
col.label(text="Initial Velocity:")
|
||||
col.prop(fluid, "initial_velocity", text="")
|
||||
elif fluid.type == 'OBSTACLE':
|
||||
split = layout.split()
|
||||
|
||||
elif fluid.type == 'OBSTACLE':
|
||||
split = layout.split()
|
||||
col = split.column()
|
||||
col.label(text="Volume Initialization:")
|
||||
col.prop(fluid, "volume_initialization", text="")
|
||||
col.prop(fluid, "use_animated_mesh")
|
||||
|
||||
col = split.column()
|
||||
col.label(text="Volume Initialization:")
|
||||
col.prop(fluid, "volume_initialization", text="")
|
||||
col.prop(fluid, "use_animated_mesh")
|
||||
col = split.column()
|
||||
col.label(text="Slip Type:")
|
||||
col.prop(fluid, "slip_type", text="")
|
||||
if fluid.slip_type == 'PARTIALSLIP':
|
||||
col.prop(fluid, "partial_slip_factor", slider=True, text="Amount")
|
||||
|
||||
col = split.column()
|
||||
col.label(text="Slip Type:")
|
||||
col.prop(fluid, "slip_type", text="")
|
||||
if fluid.slip_type == 'PARTIALSLIP':
|
||||
col.prop(fluid, "partial_slip_factor", slider=True, text="Amount")
|
||||
col.label(text="Impact:")
|
||||
col.prop(fluid, "impact_factor", text="Factor")
|
||||
|
||||
col.label(text="Impact:")
|
||||
col.prop(fluid, "impact_factor", text="Factor")
|
||||
elif fluid.type == 'INFLOW':
|
||||
split = layout.split()
|
||||
|
||||
elif fluid.type == 'INFLOW':
|
||||
split = layout.split()
|
||||
col = split.column()
|
||||
col.label(text="Volume Initialization:")
|
||||
col.prop(fluid, "volume_initialization", text="")
|
||||
col.prop(fluid, "use_animated_mesh")
|
||||
row = col.row()
|
||||
row.active = not fluid.use_animated_mesh
|
||||
row.prop(fluid, "use_local_coords")
|
||||
|
||||
col = split.column()
|
||||
col.label(text="Volume Initialization:")
|
||||
col.prop(fluid, "volume_initialization", text="")
|
||||
col.prop(fluid, "use_animated_mesh")
|
||||
row = col.row()
|
||||
row.active = not fluid.use_animated_mesh
|
||||
row.prop(fluid, "use_local_coords")
|
||||
col = split.column()
|
||||
col.label(text="Inflow Velocity:")
|
||||
col.prop(fluid, "inflow_velocity", text="")
|
||||
|
||||
col = split.column()
|
||||
col.label(text="Inflow Velocity:")
|
||||
col.prop(fluid, "inflow_velocity", text="")
|
||||
elif fluid.type == 'OUTFLOW':
|
||||
split = layout.split()
|
||||
|
||||
elif fluid.type == 'OUTFLOW':
|
||||
split = layout.split()
|
||||
col = split.column()
|
||||
col.label(text="Volume Initialization:")
|
||||
col.prop(fluid, "volume_initialization", text="")
|
||||
col.prop(fluid, "use_animated_mesh")
|
||||
|
||||
col = split.column()
|
||||
col.label(text="Volume Initialization:")
|
||||
col.prop(fluid, "volume_initialization", text="")
|
||||
col.prop(fluid, "use_animated_mesh")
|
||||
split.column()
|
||||
|
||||
split.column()
|
||||
elif fluid.type == 'PARTICLE':
|
||||
split = layout.split()
|
||||
|
||||
elif fluid.type == 'PARTICLE':
|
||||
split = layout.split()
|
||||
col = split.column()
|
||||
col.label(text="Influence:")
|
||||
col.prop(fluid, "particle_influence", text="Size")
|
||||
col.prop(fluid, "alpha_influence", text="Alpha")
|
||||
|
||||
col = split.column()
|
||||
col.label(text="Influence:")
|
||||
col.prop(fluid, "particle_influence", text="Size")
|
||||
col.prop(fluid, "alpha_influence", text="Alpha")
|
||||
col = split.column()
|
||||
col.label(text="Type:")
|
||||
col.prop(fluid, "use_drops")
|
||||
col.prop(fluid, "use_floats")
|
||||
col.prop(fluid, "show_tracer")
|
||||
|
||||
col = split.column()
|
||||
col.label(text="Type:")
|
||||
col.prop(fluid, "use_drops")
|
||||
col.prop(fluid, "use_floats")
|
||||
col.prop(fluid, "show_tracer")
|
||||
layout.prop(fluid, "filepath", text="")
|
||||
|
||||
layout.prop(fluid, "filepath", text="")
|
||||
elif fluid.type == 'CONTROL':
|
||||
split = layout.split()
|
||||
|
||||
elif fluid.type == 'CONTROL':
|
||||
split = layout.split()
|
||||
col = split.column()
|
||||
col.label(text="")
|
||||
col.prop(fluid, "quality", slider=True)
|
||||
col.prop(fluid, "use_reverse_frames")
|
||||
|
||||
col = split.column()
|
||||
col.label(text="")
|
||||
col.prop(fluid, "quality", slider=True)
|
||||
col.prop(fluid, "use_reverse_frames")
|
||||
col = split.column()
|
||||
col.label(text="Time:")
|
||||
sub = col.column(align=True)
|
||||
sub.prop(fluid, "start_time", text="Start")
|
||||
sub.prop(fluid, "end_time", text="End")
|
||||
|
||||
col = split.column()
|
||||
col.label(text="Time:")
|
||||
sub = col.column(align=True)
|
||||
sub.prop(fluid, "start_time", text="Start")
|
||||
sub.prop(fluid, "end_time", text="End")
|
||||
split = layout.split()
|
||||
|
||||
split = layout.split()
|
||||
col = split.column()
|
||||
col.label(text="Attraction Force:")
|
||||
sub = col.column(align=True)
|
||||
sub.prop(fluid, "attraction_strength", text="Strength")
|
||||
sub.prop(fluid, "attraction_radius", text="Radius")
|
||||
|
||||
col = split.column()
|
||||
col.label(text="Attraction Force:")
|
||||
sub = col.column(align=True)
|
||||
sub.prop(fluid, "attraction_strength", text="Strength")
|
||||
sub.prop(fluid, "attraction_radius", text="Radius")
|
||||
|
||||
col = split.column()
|
||||
col.label(text="Velocity Force:")
|
||||
sub = col.column(align=True)
|
||||
sub.prop(fluid, "velocity_strength", text="Strength")
|
||||
sub.prop(fluid, "velocity_radius", text="Radius")
|
||||
col = split.column()
|
||||
col.label(text="Velocity Force:")
|
||||
sub = col.column(align=True)
|
||||
sub.prop(fluid, "velocity_strength", text="Strength")
|
||||
sub.prop(fluid, "velocity_radius", text="Radius")
|
||||
|
||||
|
||||
class PHYSICS_PT_domain_gravity(PhysicButtonsPanel, Panel):
|
||||
|
@ -20,7 +20,7 @@
|
||||
import bpy
|
||||
from bpy.types import Panel
|
||||
|
||||
from bl_ui.properties_physics_common import (
|
||||
from .properties_physics_common import (
|
||||
point_cache_ui,
|
||||
effector_weights_ui,
|
||||
)
|
||||
@ -47,60 +47,59 @@ class PHYSICS_PT_smoke(PhysicButtonsPanel, Panel):
|
||||
md = context.smoke
|
||||
ob = context.object
|
||||
|
||||
if md:
|
||||
layout.prop(md, "smoke_type", expand=True)
|
||||
layout.prop(md, "smoke_type", expand=True)
|
||||
|
||||
if md.smoke_type == 'DOMAIN':
|
||||
domain = md.domain_settings
|
||||
if md.smoke_type == 'DOMAIN':
|
||||
domain = md.domain_settings
|
||||
|
||||
split = layout.split()
|
||||
split = layout.split()
|
||||
|
||||
split.enabled = not domain.point_cache.is_baked
|
||||
split.enabled = not domain.point_cache.is_baked
|
||||
|
||||
col = split.column()
|
||||
col.label(text="Resolution:")
|
||||
col.prop(domain, "resolution_max", text="Divisions")
|
||||
col.label(text="Time:")
|
||||
col.prop(domain, "time_scale", text="Scale")
|
||||
col.label(text="Border Collisions:")
|
||||
col.prop(domain, "collision_extents", text="")
|
||||
col = split.column()
|
||||
col.label(text="Resolution:")
|
||||
col.prop(domain, "resolution_max", text="Divisions")
|
||||
col.label(text="Time:")
|
||||
col.prop(domain, "time_scale", text="Scale")
|
||||
col.label(text="Border Collisions:")
|
||||
col.prop(domain, "collision_extents", text="")
|
||||
|
||||
col = split.column()
|
||||
col.label(text="Behavior:")
|
||||
col.prop(domain, "alpha")
|
||||
col.prop(domain, "beta", text="Temp. Diff.")
|
||||
col.prop(domain, "vorticity")
|
||||
col.prop(domain, "use_dissolve_smoke", text="Dissolve")
|
||||
sub = col.column()
|
||||
sub.active = domain.use_dissolve_smoke
|
||||
sub.prop(domain, "dissolve_speed", text="Time")
|
||||
sub.prop(domain, "use_dissolve_smoke_log", text="Slow")
|
||||
col = split.column()
|
||||
col.label(text="Behavior:")
|
||||
col.prop(domain, "alpha")
|
||||
col.prop(domain, "beta", text="Temp. Diff.")
|
||||
col.prop(domain, "vorticity")
|
||||
col.prop(domain, "use_dissolve_smoke", text="Dissolve")
|
||||
sub = col.column()
|
||||
sub.active = domain.use_dissolve_smoke
|
||||
sub.prop(domain, "dissolve_speed", text="Time")
|
||||
sub.prop(domain, "use_dissolve_smoke_log", text="Slow")
|
||||
|
||||
elif md.smoke_type == 'FLOW':
|
||||
elif md.smoke_type == 'FLOW':
|
||||
|
||||
flow = md.flow_settings
|
||||
flow = md.flow_settings
|
||||
|
||||
split = layout.split()
|
||||
split = layout.split()
|
||||
|
||||
col = split.column()
|
||||
col.prop(flow, "use_outflow")
|
||||
col.label(text="Particle System:")
|
||||
col.prop_search(flow, "particle_system", ob, "particle_systems", text="")
|
||||
col = split.column()
|
||||
col.prop(flow, "use_outflow")
|
||||
col.label(text="Particle System:")
|
||||
col.prop_search(flow, "particle_system", ob, "particle_systems", text="")
|
||||
|
||||
sub = col.column()
|
||||
sub.active = not md.flow_settings.use_outflow
|
||||
sub = col.column()
|
||||
sub.active = not md.flow_settings.use_outflow
|
||||
|
||||
sub.prop(flow, "initial_velocity", text="Initial Velocity")
|
||||
sub = sub.column()
|
||||
sub.active = flow.initial_velocity
|
||||
sub.prop(flow, "velocity_factor", text="Multiplier")
|
||||
sub.prop(flow, "initial_velocity", text="Initial Velocity")
|
||||
sub = sub.column()
|
||||
sub.active = flow.initial_velocity
|
||||
sub.prop(flow, "velocity_factor", text="Multiplier")
|
||||
|
||||
sub = split.column()
|
||||
sub.active = not md.flow_settings.use_outflow
|
||||
sub.label(text="Initial Values:")
|
||||
sub.prop(flow, "use_absolute")
|
||||
sub.prop(flow, "density")
|
||||
sub.prop(flow, "temperature")
|
||||
sub = split.column()
|
||||
sub.active = not md.flow_settings.use_outflow
|
||||
sub.label(text="Initial Values:")
|
||||
sub.prop(flow, "use_absolute")
|
||||
sub.prop(flow, "density")
|
||||
sub.prop(flow, "temperature")
|
||||
|
||||
|
||||
class PHYSICS_PT_smoke_groups(PhysicButtonsPanel, Panel):
|
||||
|
@ -20,7 +20,7 @@
|
||||
import bpy
|
||||
from bpy.types import Panel
|
||||
|
||||
from bl_ui.properties_physics_common import (
|
||||
from .properties_physics_common import (
|
||||
point_cache_ui,
|
||||
effector_weights_ui,
|
||||
)
|
||||
@ -39,8 +39,6 @@ class PhysicButtonsPanel():
|
||||
def poll(cls, context):
|
||||
ob = context.object
|
||||
rd = context.scene.render
|
||||
# return (ob and ob.type == 'MESH') and (not rd.use_game_engine)
|
||||
# i really hate touching things i do not understand completely .. but i think this should read (bjornmose)
|
||||
return (ob and (ob.type == 'MESH' or ob.type == 'LATTICE'or ob.type == 'CURVE')) and (not rd.use_game_engine) and (context.soft_body)
|
||||
|
||||
|
||||
@ -53,22 +51,21 @@ class PHYSICS_PT_softbody(PhysicButtonsPanel, Panel):
|
||||
md = context.soft_body
|
||||
ob = context.object
|
||||
|
||||
if md:
|
||||
softbody = md.settings
|
||||
softbody = md.settings
|
||||
|
||||
# General
|
||||
split = layout.split()
|
||||
split.enabled = softbody_panel_enabled(md)
|
||||
# General
|
||||
split = layout.split()
|
||||
split.enabled = softbody_panel_enabled(md)
|
||||
|
||||
col = split.column()
|
||||
col.label(text="Object:")
|
||||
col.prop(softbody, "friction")
|
||||
col.prop(softbody, "mass")
|
||||
col.prop_search(softbody, "vertex_group_mass", ob, "vertex_groups", text="Mass:")
|
||||
col = split.column()
|
||||
col.label(text="Object:")
|
||||
col.prop(softbody, "friction")
|
||||
col.prop(softbody, "mass")
|
||||
col.prop_search(softbody, "vertex_group_mass", ob, "vertex_groups", text="Mass:")
|
||||
|
||||
col = split.column()
|
||||
col.label(text="Simulation:")
|
||||
col.prop(softbody, "speed")
|
||||
col = split.column()
|
||||
col.label(text="Simulation:")
|
||||
col.prop(softbody, "speed")
|
||||
|
||||
|
||||
class PHYSICS_PT_softbody_cache(PhysicButtonsPanel, Panel):
|
||||
|
@ -44,7 +44,7 @@ class TEXTURE_MT_envmap_specials(Menu):
|
||||
layout.operator("texture.envmap_clear", icon='FILE_REFRESH')
|
||||
layout.operator("texture.envmap_clear_all", icon='FILE_REFRESH')
|
||||
|
||||
from bl_ui.properties_material import active_node_mat
|
||||
from .properties_material import active_node_mat
|
||||
|
||||
|
||||
def context_tex_datablock(context):
|
||||
@ -726,7 +726,7 @@ class TEXTURE_PT_pointdensity(TextureButtonsPanel, Panel):
|
||||
col.prop(pd, "falloff", text="")
|
||||
if pd.falloff == 'SOFT':
|
||||
col.prop(pd, "falloff_soft")
|
||||
if pd.falloff == "PARTICLE_VELOCITY":
|
||||
if pd.falloff == 'PARTICLE_VELOCITY':
|
||||
col.prop(pd, "falloff_speed_scale")
|
||||
|
||||
col.prop(pd, "use_falloff_curve")
|
||||
|
@ -26,7 +26,7 @@ class GRAPH_HT_header(Header):
|
||||
bl_space_type = 'GRAPH_EDITOR'
|
||||
|
||||
def draw(self, context):
|
||||
from bl_ui.space_dopesheet import dopesheet_filter
|
||||
from .space_dopesheet import dopesheet_filter
|
||||
|
||||
layout = self.layout
|
||||
|
||||
|
@ -312,19 +312,19 @@ class IMAGE_MT_uvs_select_mode(Menu):
|
||||
|
||||
else:
|
||||
prop = layout.operator("wm.context_set_string", text="Vertex", icon='UV_VERTEXSEL')
|
||||
prop.value = "VERTEX"
|
||||
prop.value = 'VERTEX'
|
||||
prop.data_path = "tool_settings.uv_select_mode"
|
||||
|
||||
prop = layout.operator("wm.context_set_string", text="Edge", icon='UV_EDGESEL')
|
||||
prop.value = "EDGE"
|
||||
prop.value = 'EDGE'
|
||||
prop.data_path = "tool_settings.uv_select_mode"
|
||||
|
||||
prop = layout.operator("wm.context_set_string", text="Face", icon='UV_FACESEL')
|
||||
prop.value = "FACE"
|
||||
prop.value = 'FACE'
|
||||
prop.data_path = "tool_settings.uv_select_mode"
|
||||
|
||||
prop = layout.operator("wm.context_set_string", text="Island", icon='UV_ISLANDSEL')
|
||||
prop.value = "ISLAND"
|
||||
prop.value = 'ISLAND'
|
||||
prop.data_path = "tool_settings.uv_select_mode"
|
||||
|
||||
|
||||
|
@ -26,7 +26,7 @@ class NLA_HT_header(Header):
|
||||
bl_space_type = 'NLA_EDITOR'
|
||||
|
||||
def draw(self, context):
|
||||
from bl_ui.space_dopesheet import dopesheet_filter
|
||||
from .space_dopesheet import dopesheet_filter
|
||||
|
||||
layout = self.layout
|
||||
|
||||
|
@ -456,7 +456,7 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel, Panel):
|
||||
elif strip.type == 'TRANSFORM':
|
||||
self.draw_panel_transform(strip)
|
||||
|
||||
elif strip.type == "MULTICAM":
|
||||
elif strip.type == 'MULTICAM':
|
||||
layout.prop(strip, "multicam_source")
|
||||
|
||||
row = layout.row(align=True)
|
||||
|
@ -92,7 +92,7 @@ class TIME_HT_header(Header):
|
||||
row.operator("anim.keyframe_delete", text="", icon='KEY_DEHLT')
|
||||
|
||||
|
||||
class TIME_MT_marker(bpy.types.Menu):
|
||||
class TIME_MT_marker(Menu):
|
||||
bl_label = "Marker"
|
||||
|
||||
def draw(self, context):
|
||||
|
@ -743,7 +743,7 @@ class USERPREF_PT_file(Panel):
|
||||
sub.active = paths.use_auto_save_temporary_files
|
||||
sub.prop(paths, "auto_save_time", text="Timer (mins)")
|
||||
|
||||
from bl_ui.space_userpref_keymap import InputKeyMapPanel
|
||||
from .space_userpref_keymap import InputKeyMapPanel
|
||||
|
||||
|
||||
class USERPREF_MT_ndof_settings(Menu):
|
||||
|
@ -1538,10 +1538,10 @@ class VIEW3D_MT_edit_mesh_extrude(Menu):
|
||||
bl_label = "Extrude"
|
||||
|
||||
_extrude_funcs = {
|
||||
"VERT": lambda layout: layout.operator("mesh.extrude_vertices_move", text="Vertices Only"),
|
||||
"EDGE": lambda layout: layout.operator("mesh.extrude_edges_move", text="Edges Only"),
|
||||
"FACE": lambda layout: layout.operator("mesh.extrude_faces_move", text="Individual Faces"),
|
||||
"REGION": lambda layout: layout.operator("view3d.edit_mesh_extrude_move_normal", text="Region"),
|
||||
'VERT': lambda layout: layout.operator("mesh.extrude_vertices_move", text="Vertices Only"),
|
||||
'EDGE': lambda layout: layout.operator("mesh.extrude_edges_move", text="Edges Only"),
|
||||
'FACE': lambda layout: layout.operator("mesh.extrude_faces_move", text="Individual Faces"),
|
||||
'REGION': lambda layout: layout.operator("view3d.edit_mesh_extrude_move_normal", text="Region"),
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
@ -1551,11 +1551,11 @@ class VIEW3D_MT_edit_mesh_extrude(Menu):
|
||||
|
||||
menu = []
|
||||
if mesh.total_face_sel:
|
||||
menu += ["REGION", "FACE"]
|
||||
menu += ['REGION', 'FACE']
|
||||
if mesh.total_edge_sel and (select_mode[0] or select_mode[1]):
|
||||
menu += ["EDGE"]
|
||||
menu += ['EDGE']
|
||||
if mesh.total_vert_sel and select_mode[0]:
|
||||
menu += ["VERT"]
|
||||
menu += ['VERT']
|
||||
|
||||
# should never get here
|
||||
return menu
|
||||
|
@ -6,7 +6,7 @@
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* Contributor(s): Miika Hämäläinen
|
||||
* Contributor(s): Miika Hämäläinen
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
@ -24,7 +24,7 @@ typedef struct PaintSurfaceData {
|
||||
struct PaintAdjData *adj_data; /* adjacency data for current surface */
|
||||
|
||||
struct PaintBakeData *bData; /* temporary per step data used for frame calculation */
|
||||
unsigned int total_points;
|
||||
int total_points;
|
||||
|
||||
} PaintSurfaceData;
|
||||
|
||||
@ -66,7 +66,7 @@ void dynamicPaint_cacheUpdateFrames(struct DynamicPaintSurface *surface);
|
||||
int dynamicPaint_surfaceHasColorPreview(struct DynamicPaintSurface *surface);
|
||||
int dynamicPaint_outputLayerExists(struct DynamicPaintSurface *surface, struct Object *ob, int index);
|
||||
void dynamicPaintSurface_updateType(struct DynamicPaintSurface *surface);
|
||||
void dynamicPaintSurface_setUniqueName(struct DynamicPaintSurface *surface, char *basename);
|
||||
void dynamicPaintSurface_setUniqueName(struct DynamicPaintSurface *surface, const char *basename);
|
||||
void dynamicPaint_resetPreview(struct DynamicPaintCanvasSettings *canvas);
|
||||
struct DynamicPaintSurface *get_activeSurface(struct DynamicPaintCanvasSettings *canvas);
|
||||
|
||||
|
@ -116,6 +116,22 @@ int ray_hit_boundbox(struct BoundBox *bb, float ray_start[3], float ray_normal[3
|
||||
void *object_tfm_backup(struct Object *ob);
|
||||
void object_tfm_restore(struct Object *ob, void *obtfm_pt);
|
||||
|
||||
typedef struct ObjectTfmProtectedChannels {
|
||||
float loc[3], dloc[3];
|
||||
float size[3], dsize[3];
|
||||
float rot[3], drot[3];
|
||||
float quat[4], dquat[4];
|
||||
float rotAxis[3], drotAxis[3];
|
||||
float rotAngle, drotAngle;
|
||||
} ObjectTfmProtectedChannels;
|
||||
|
||||
void object_tfm_protected_backup(const struct Object *ob,
|
||||
ObjectTfmProtectedChannels *obtfm);
|
||||
|
||||
void object_tfm_protected_restore(struct Object *ob,
|
||||
const ObjectTfmProtectedChannels *obtfm,
|
||||
const short protectflag);
|
||||
|
||||
void object_handle_update(struct Scene *scene, struct Object *ob);
|
||||
void object_sculpt_modifiers_changed(struct Object *ob);
|
||||
|
||||
|
@ -181,6 +181,7 @@ set(SRC
|
||||
BKE_deform.h
|
||||
BKE_depsgraph.h
|
||||
BKE_displist.h
|
||||
BKE_dynamicpaint.h
|
||||
BKE_effect.h
|
||||
BKE_fcurve.h
|
||||
BKE_fluidsim.h
|
||||
|
@ -6,7 +6,7 @@
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* Contributor(s): Miika Hämäläinen
|
||||
* Contributor(s): Miika Hämäläinen
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
@ -120,9 +120,9 @@ typedef struct VolumeGrid {
|
||||
Bounds3D grid_bounds; /* whole grid bounds */
|
||||
|
||||
Bounds3D *bounds; /* (x*y*z) precalculated grid cell bounds */
|
||||
unsigned int *s_pos; /* (x*y*z) t_index begin id */
|
||||
unsigned int *s_num; /* (x*y*z) number of t_index points */
|
||||
unsigned int *t_index; /* actual surface point index,
|
||||
int *s_pos; /* (x*y*z) t_index begin id */
|
||||
int *s_num; /* (x*y*z) number of t_index points */
|
||||
int *t_index; /* actual surface point index,
|
||||
access: (s_pos+s_num) */
|
||||
} VolumeGrid;
|
||||
|
||||
@ -145,8 +145,8 @@ typedef struct PaintBakeNormal {
|
||||
typedef struct PaintBakeData {
|
||||
/* point space data */
|
||||
PaintBakeNormal *bNormal;
|
||||
unsigned int *s_pos; /* index to start reading point sample realCoord */
|
||||
unsigned int *s_num; /* num of realCoord samples */
|
||||
int *s_pos; /* index to start reading point sample realCoord */
|
||||
int *s_num; /* num of realCoord samples */
|
||||
Vec3f *realCoord; /* current pixel center world-space coordinates for each sample
|
||||
* ordered as (s_pos+s_num)*/
|
||||
|
||||
@ -193,18 +193,18 @@ typedef struct EffVelPoint {
|
||||
#define ADJ_ON_MESH_EDGE (1<<0)
|
||||
|
||||
typedef struct PaintAdjData {
|
||||
unsigned int *n_target; /* array of neighbouring point indexes,
|
||||
int *n_target; /* array of neighbouring point indexes,
|
||||
for single sample use (n_index+neigh_num) */
|
||||
unsigned int *n_index; /* index to start reading n_target for each point */
|
||||
unsigned int *n_num; /* num of neighs for each point */
|
||||
unsigned int *flags; /* vertex adjacency flags */
|
||||
unsigned int total_targets; /* size of n_target */
|
||||
int *n_index; /* index to start reading n_target for each point */
|
||||
int *n_num; /* num of neighs for each point */
|
||||
int *flags; /* vertex adjacency flags */
|
||||
int total_targets; /* size of n_target */
|
||||
} PaintAdjData;
|
||||
|
||||
/***************************** General Utils ******************************/
|
||||
|
||||
/* Set canvas error string to display at the bake report */
|
||||
static int setError(DynamicPaintCanvasSettings *canvas, char *string)
|
||||
static int setError(DynamicPaintCanvasSettings *canvas, const char *string)
|
||||
{
|
||||
/* Add error to canvas ui info label */
|
||||
BLI_snprintf(canvas->error, sizeof(canvas->error), string);
|
||||
@ -339,7 +339,7 @@ static int surface_duplicateNameExists(void *arg, const char *name)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void dynamicPaintSurface_setUniqueName(DynamicPaintSurface *surface, char *basename)
|
||||
void dynamicPaintSurface_setUniqueName(DynamicPaintSurface *surface, const char *basename)
|
||||
{
|
||||
char name[64];
|
||||
BLI_strncpy(name, basename, sizeof(name)); /* in case basename is surface->name use a copy */
|
||||
@ -488,7 +488,7 @@ static void scene_setSubframe(Scene *scene, float subframe)
|
||||
|
||||
#define BRUSH_USES_VELOCITY (1<<0)
|
||||
|
||||
static int surface_getBrushFlags(DynamicPaintSurface *surface, Scene *scene, Object *ob)
|
||||
static int surface_getBrushFlags(DynamicPaintSurface *surface, Scene *scene)
|
||||
{
|
||||
Base *base = NULL;
|
||||
GroupObject *go = NULL;
|
||||
@ -704,7 +704,7 @@ static void surfaceGenerateGrid(struct DynamicPaintSurface *surface)
|
||||
for (i=0; i<sData->total_points; i++) {
|
||||
int co[3], j;
|
||||
for (j=0; j<3; j++) {
|
||||
co[j] = floor((bData->realCoord[bData->s_pos[i]].v[j] - grid->grid_bounds.min[j])/dim[j]*grid->dim[j]);
|
||||
co[j] = (int)floor((bData->realCoord[bData->s_pos[i]].v[j] - grid->grid_bounds.min[j])/dim[j]*grid->dim[j]);
|
||||
CLAMP(co[j], 0, grid->dim[j]-1);
|
||||
}
|
||||
|
||||
@ -972,7 +972,7 @@ struct DynamicPaintSurface *dynamicPaint_createNewSurface(DynamicPaintCanvasSett
|
||||
surface->wave_damping = 0.05f;
|
||||
surface->wave_speed = 1.0f;
|
||||
surface->wave_timescale = 1.0f;
|
||||
surface->wave_spring = 0.20;
|
||||
surface->wave_spring = 0.20f;
|
||||
|
||||
BLI_snprintf(surface->image_output_path, sizeof(surface->image_output_path), "%sdynamicpaint", U.textudir);
|
||||
BLI_cleanup_dir(NULL, surface->image_output_path);
|
||||
@ -1516,7 +1516,9 @@ static void dynamicPaint_applySurfaceDisplace(DynamicPaintSurface *surface, Deri
|
||||
/*
|
||||
* Apply canvas data to the object derived mesh
|
||||
*/
|
||||
static struct DerivedMesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData *pmd, Scene *scene, Object *ob, DerivedMesh *dm)
|
||||
static struct DerivedMesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData *pmd,
|
||||
Object *ob,
|
||||
DerivedMesh *dm)
|
||||
{
|
||||
DerivedMesh *result = CDDM_copy(dm);
|
||||
|
||||
@ -1801,7 +1803,7 @@ static void dynamicPaint_frameUpdate(DynamicPaintModifierData *pmd, Scene *scene
|
||||
BKE_ptcache_id_from_dynamicpaint(&pid, ob, surface);
|
||||
pid.cache->startframe = surface->start_frame;
|
||||
pid.cache->endframe = surface->end_frame;
|
||||
BKE_ptcache_id_time(&pid, scene, scene->r.cfra, NULL, NULL, NULL);
|
||||
BKE_ptcache_id_time(&pid, scene, (float)scene->r.cfra, NULL, NULL, NULL);
|
||||
|
||||
/* reset non-baked cache at first frame */
|
||||
if((int)scene->r.cfra == surface->start_frame && !(cache->flag & PTCACHE_BAKED))
|
||||
@ -1843,7 +1845,7 @@ struct DerivedMesh *dynamicPaint_Modifier_do(DynamicPaintModifierData *pmd, Scen
|
||||
dynamicPaint_frameUpdate(pmd, scene, ob, dm);
|
||||
|
||||
/* Return output mesh */
|
||||
return dynamicPaint_Modifier_apply(pmd, scene, ob, dm);
|
||||
return dynamicPaint_Modifier_apply(pmd, ob, dm);
|
||||
}
|
||||
|
||||
|
||||
@ -2068,7 +2070,7 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface)
|
||||
|
||||
PaintUVPoint *tempPoints = NULL;
|
||||
Vec3f *tempWeights = NULL;
|
||||
MVert *mvert = NULL;
|
||||
/* MVert *mvert = NULL; */ /* UNUSED */
|
||||
MFace *mface = NULL;
|
||||
MTFace *tface = NULL;
|
||||
Bounds2D *faceBB = NULL;
|
||||
@ -2079,7 +2081,7 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface)
|
||||
if (surface->format != MOD_DPAINT_SURFACE_F_IMAGESEQ) return setError(canvas, "Can't bake non-\"image sequence\" formats.");
|
||||
|
||||
numOfFaces = dm->getNumFaces(dm);
|
||||
mvert = dm->getVertArray(dm);
|
||||
/* mvert = dm->getVertArray(dm); */ /* UNUSED */
|
||||
mface = dm->getFaceArray(dm);
|
||||
|
||||
/* get uv layer */
|
||||
@ -3039,7 +3041,7 @@ static void dynamicPaint_brushMeshCalculateVelocity(Scene *scene, Object *ob, Dy
|
||||
}
|
||||
|
||||
/* calculate velocity for object center point */
|
||||
static void dynamicPaint_brushObjectCalculateVelocity(Scene *scene, Object *ob, DynamicPaintBrushSettings *brush, Vec3f *brushVel, float timescale)
|
||||
static void dynamicPaint_brushObjectCalculateVelocity(Scene *scene, Object *ob, Vec3f *brushVel, float timescale)
|
||||
{
|
||||
float prev_obmat[4][4];
|
||||
float cur_loc[3] = {0.0f}, prev_loc[3] = {0.0f};
|
||||
@ -3076,7 +3078,12 @@ static void dynamicPaint_brushObjectCalculateVelocity(Scene *scene, Object *ob,
|
||||
/*
|
||||
* Paint a brush object mesh to the surface
|
||||
*/
|
||||
static int dynamicPaint_paintMesh(DynamicPaintSurface *surface, DynamicPaintBrushSettings *brush, Object *canvasOb, Object *brushOb, BrushMaterials *bMats, Scene *scene, float timescale)
|
||||
static int dynamicPaint_paintMesh(DynamicPaintSurface *surface,
|
||||
DynamicPaintBrushSettings *brush,
|
||||
Object *brushOb,
|
||||
BrushMaterials *bMats,
|
||||
Scene *scene,
|
||||
float timescale)
|
||||
{
|
||||
PaintSurfaceData *sData = surface->data;
|
||||
PaintBakeData *bData = sData->bData;
|
||||
@ -3449,7 +3456,10 @@ static int dynamicPaint_paintMesh(DynamicPaintSurface *surface, DynamicPaintBrus
|
||||
/*
|
||||
* Paint a particle system to the surface
|
||||
*/
|
||||
static int dynamicPaint_paintParticles(DynamicPaintSurface *surface, ParticleSystem *psys, DynamicPaintBrushSettings *brush, Object *canvasOb, float timescale)
|
||||
static int dynamicPaint_paintParticles(DynamicPaintSurface *surface,
|
||||
ParticleSystem *psys,
|
||||
DynamicPaintBrushSettings *brush,
|
||||
float timescale)
|
||||
{
|
||||
ParticleSettings *part=psys->part;
|
||||
ParticleData *pa = NULL;
|
||||
@ -3686,7 +3696,7 @@ static int dynamicPaint_paintParticles(DynamicPaintSurface *surface, ParticleSys
|
||||
|
||||
/* paint a single point of defined proximity radius to the surface */
|
||||
static int dynamicPaint_paintSinglePoint(DynamicPaintSurface *surface, float *pointCoord, DynamicPaintBrushSettings *brush,
|
||||
Object *canvasOb, Object *brushOb, BrushMaterials *bMats, Scene *scene, float timescale)
|
||||
Object *brushOb, BrushMaterials *bMats, Scene *scene, float timescale)
|
||||
{
|
||||
int index;
|
||||
PaintSurfaceData *sData = surface->data;
|
||||
@ -3694,7 +3704,7 @@ static int dynamicPaint_paintSinglePoint(DynamicPaintSurface *surface, float *po
|
||||
Vec3f brushVel;
|
||||
|
||||
if (brush->flags & MOD_DPAINT_USES_VELOCITY)
|
||||
dynamicPaint_brushObjectCalculateVelocity(scene, brushOb, brush, &brushVel, timescale);
|
||||
dynamicPaint_brushObjectCalculateVelocity(scene, brushOb, &brushVel, timescale);
|
||||
|
||||
/*
|
||||
* Loop through every surface point
|
||||
@ -4208,7 +4218,7 @@ static void dynamicPaint_doEffectStep(DynamicPaintSurface *surface, float *force
|
||||
float closest_d[2];
|
||||
|
||||
/* adjust drip speed depending on wetness */
|
||||
float w_factor = pPoint_prev->wetness*0.5 - 0.025f;
|
||||
float w_factor = pPoint_prev->wetness*0.5f - 0.025f;
|
||||
if (w_factor <= 0) continue;
|
||||
|
||||
/* get force affect points */
|
||||
@ -4283,7 +4293,7 @@ void dynamicPaint_doWaveStep(DynamicPaintSurface *surface, float timescale)
|
||||
average_dist /= sData->adj_data->total_targets;
|
||||
|
||||
/* determine number of required steps */
|
||||
steps = ceil((WAVE_TIME_FAC*timescale*surface->wave_timescale) / (average_dist/wave_speed/3));
|
||||
steps = (int)ceil((WAVE_TIME_FAC*timescale*surface->wave_timescale) / (average_dist/wave_speed/3));
|
||||
CLAMP(steps, 1, 15);
|
||||
timescale /= steps;
|
||||
|
||||
@ -4472,12 +4482,12 @@ static int dynamicPaint_surfaceHasMoved(DynamicPaintSurface *surface, Object *ob
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int surface_needsVelocityData(DynamicPaintSurface *surface, Scene *scene, Object *ob)
|
||||
static int surface_needsVelocityData(DynamicPaintSurface *surface, Scene *scene, Object *UNUSED(ob))
|
||||
{
|
||||
if (surface->effect & MOD_DPAINT_EFFECT_DO_DRIP)
|
||||
return 1;
|
||||
|
||||
if (surface_getBrushFlags(surface, scene, ob) & BRUSH_USES_VELOCITY)
|
||||
if (surface_getBrushFlags(surface, scene) & BRUSH_USES_VELOCITY)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
@ -4783,16 +4793,16 @@ static int dynamicPaint_doStep(Scene *scene, Object *ob, DynamicPaintSurface *su
|
||||
|
||||
/* Paint a particle system */
|
||||
BKE_animsys_evaluate_animdata(scene, &brush->psys->part->id, brush->psys->part->adt, BKE_curframe(scene), ADT_RECALC_ANIM);
|
||||
dynamicPaint_paintParticles(surface, brush->psys, brush, ob, timescale);
|
||||
dynamicPaint_paintParticles(surface, brush->psys, brush, timescale);
|
||||
}
|
||||
}
|
||||
/* Object center distance: */
|
||||
else if (brush->collision == MOD_DPAINT_COL_POINT && brushObj != ob) {
|
||||
dynamicPaint_paintSinglePoint(surface, brushObj->loc, brush, ob, brushObj, &bMats, scene, timescale);
|
||||
dynamicPaint_paintSinglePoint(surface, brushObj->loc, brush, brushObj, &bMats, scene, timescale);
|
||||
}
|
||||
/* Mesh volume/proximity: */
|
||||
else if (brushObj != ob) {
|
||||
dynamicPaint_paintMesh(surface, brush, ob, brushObj, &bMats, scene, timescale);
|
||||
dynamicPaint_paintMesh(surface, brush, brushObj, &bMats, scene, timescale);
|
||||
}
|
||||
|
||||
/* free temp material data */
|
||||
@ -4878,4 +4888,4 @@ int dynamicPaint_calculateFrame(DynamicPaintSurface *surface, Scene *scene, Obje
|
||||
}
|
||||
|
||||
return dynamicPaint_doStep(scene, cObject, surface, timescale, 0.0f);
|
||||
}
|
||||
}
|
||||
|
@ -1499,6 +1499,71 @@ void object_mat3_to_rot(Object *ob, float mat[][3], short use_compat)
|
||||
}
|
||||
}
|
||||
|
||||
void object_tfm_protected_backup(const Object *ob,
|
||||
ObjectTfmProtectedChannels *obtfm)
|
||||
{
|
||||
|
||||
#define TFMCPY( _v) (obtfm->_v = ob->_v)
|
||||
#define TFMCPY3D( _v) copy_v3_v3(obtfm->_v, ob->_v)
|
||||
#define TFMCPY4D( _v) copy_v4_v4(obtfm->_v, ob->_v)
|
||||
|
||||
TFMCPY3D(loc);
|
||||
TFMCPY3D(dloc);
|
||||
TFMCPY3D(size);
|
||||
TFMCPY3D(dsize);
|
||||
TFMCPY3D(rot);
|
||||
TFMCPY3D(drot);
|
||||
TFMCPY4D(quat);
|
||||
TFMCPY4D(dquat);
|
||||
TFMCPY3D(rotAxis);
|
||||
TFMCPY3D(drotAxis);
|
||||
TFMCPY(rotAngle);
|
||||
TFMCPY(drotAngle);
|
||||
|
||||
#undef TFMCPY
|
||||
#undef TFMCPY3D
|
||||
#undef TFMCPY4D
|
||||
|
||||
}
|
||||
|
||||
void object_tfm_protected_restore(Object *ob,
|
||||
const ObjectTfmProtectedChannels *obtfm,
|
||||
const short protectflag)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i= 0; i < 3; i++) {
|
||||
if (protectflag & (OB_LOCK_LOCX<<i)) {
|
||||
ob->loc[i]= obtfm->loc[i];
|
||||
ob->dloc[i]= obtfm->dloc[i];
|
||||
}
|
||||
|
||||
if (protectflag & (OB_LOCK_SCALEX<<i)) {
|
||||
ob->size[i]= obtfm->size[i];
|
||||
ob->dsize[i]= obtfm->dsize[i];
|
||||
}
|
||||
|
||||
if (protectflag & (OB_LOCK_ROTX<<i)) {
|
||||
ob->rot[i]= obtfm->rot[i];
|
||||
ob->drot[i]= obtfm->drot[i];
|
||||
|
||||
ob->quat[i + 1]= obtfm->quat[i + 1];
|
||||
ob->dquat[i + 1]= obtfm->dquat[i + 1];
|
||||
|
||||
ob->rotAxis[i]= obtfm->rotAxis[i];
|
||||
ob->drotAxis[i]= obtfm->drotAxis[i];
|
||||
}
|
||||
}
|
||||
|
||||
if ((protectflag & OB_LOCK_ROT4D) && (protectflag & OB_LOCK_ROTW)) {
|
||||
ob->quat[0]= obtfm->quat[0];
|
||||
ob->dquat[0]= obtfm->dquat[0];
|
||||
|
||||
ob->rotAngle= obtfm->rotAngle;
|
||||
ob->drotAngle= obtfm->drotAngle;
|
||||
}
|
||||
}
|
||||
|
||||
/* see pchan_apply_mat4() for the equivalent 'pchan' function */
|
||||
void object_apply_mat4(Object *ob, float mat[][4], const short use_compat, const short use_parent)
|
||||
{
|
||||
|
@ -122,7 +122,7 @@ static int ptcache_extra_datasize[] = {
|
||||
/* forward declerations */
|
||||
static int ptcache_file_compressed_read(PTCacheFile *pf, unsigned char *result, unsigned int len);
|
||||
static int ptcache_file_compressed_write(PTCacheFile *pf, unsigned char *in, unsigned int in_len, unsigned char *out, int mode);
|
||||
static int ptcache_file_write(PTCacheFile *pf, void *f, unsigned int tot, unsigned int size);
|
||||
static int ptcache_file_write(PTCacheFile *pf, const void *f, unsigned int tot, unsigned int size);
|
||||
static int ptcache_file_read(PTCacheFile *pf, void *f, unsigned int tot, unsigned int size);
|
||||
|
||||
/* Common functions */
|
||||
@ -656,12 +656,12 @@ static int ptcache_smoke_read(PTCacheFile *pf, void *smoke_v)
|
||||
return 1;
|
||||
}
|
||||
#else // WITH_SMOKE
|
||||
static int ptcache_smoke_totpoint(void *UNUSED(smoke_v), int UNUSED(cfra)) { return 0; };
|
||||
static void ptcache_smoke_read(PTCacheFile *UNUSED(pf), void *UNUSED(smoke_v)) {}
|
||||
static int ptcache_smoke_totpoint(void *UNUSED(smoke_v), int UNUSED(cfra)) { return 0; }
|
||||
static int ptcache_smoke_read(PTCacheFile *UNUSED(pf), void *UNUSED(smoke_v)) { return 0; }
|
||||
static int ptcache_smoke_write(PTCacheFile *UNUSED(pf), void *UNUSED(smoke_v)) { return 0; }
|
||||
#endif // WITH_SMOKE
|
||||
|
||||
static int ptcache_dynamicpaint_totpoint(void *sd, int cfra)
|
||||
static int ptcache_dynamicpaint_totpoint(void *sd, int UNUSED(cfra))
|
||||
{
|
||||
DynamicPaintSurface *surface = (DynamicPaintSurface*)sd;
|
||||
|
||||
@ -680,7 +680,7 @@ static int ptcache_dynamicpaint_write(PTCacheFile *pf, void *dp_v)
|
||||
ptcache_file_write(pf, DPAINT_CACHE_VERSION, 1, sizeof(char)*4);
|
||||
|
||||
if(surface->format != MOD_DPAINT_SURFACE_F_IMAGESEQ && surface->data) {
|
||||
unsigned int total_points=surface->data->total_points;
|
||||
int total_points=surface->data->total_points;
|
||||
unsigned int in_len;
|
||||
unsigned char *out;
|
||||
|
||||
@ -1261,7 +1261,7 @@ static int ptcache_file_read(PTCacheFile *pf, void *f, unsigned int tot, unsigne
|
||||
{
|
||||
return (fread(f, size, tot, pf->fp) == tot);
|
||||
}
|
||||
static int ptcache_file_write(PTCacheFile *pf, void *f, unsigned int tot, unsigned int size)
|
||||
static int ptcache_file_write(PTCacheFile *pf, const void *f, unsigned int tot, unsigned int size)
|
||||
{
|
||||
return (fwrite(f, size, tot, pf->fp) == tot);
|
||||
}
|
||||
|
@ -687,4 +687,4 @@ void BLI_end_threaded_malloc(void)
|
||||
thread_levels--;
|
||||
if(thread_levels==0)
|
||||
MEM_set_lock_callback(NULL, NULL);
|
||||
}
|
||||
}
|
||||
|
@ -2125,11 +2125,61 @@ static void lib_link_nodetree(FileData *fd, Main *main)
|
||||
}
|
||||
}
|
||||
|
||||
static void do_versions_socket_default_value(bNodeSocket *sock)
|
||||
{
|
||||
bNodeSocketValueFloat *valfloat;
|
||||
bNodeSocketValueVector *valvector;
|
||||
bNodeSocketValueRGBA *valrgba;
|
||||
|
||||
if (sock->default_value)
|
||||
return;
|
||||
|
||||
switch (sock->type) {
|
||||
case SOCK_FLOAT:
|
||||
valfloat = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueFloat), "default socket value");
|
||||
valfloat->value = sock->ns.vec[0];
|
||||
valfloat->min = sock->ns.min;
|
||||
valfloat->max = sock->ns.max;
|
||||
valfloat->subtype = PROP_NONE;
|
||||
break;
|
||||
case SOCK_VECTOR:
|
||||
valvector = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueVector), "default socket value");
|
||||
copy_v3_v3(valvector->value, sock->ns.vec);
|
||||
valvector->min = sock->ns.min;
|
||||
valvector->max = sock->ns.max;
|
||||
valvector->subtype = PROP_NONE;
|
||||
break;
|
||||
case SOCK_RGBA:
|
||||
valrgba = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueRGBA), "default socket value");
|
||||
copy_v4_v4(valrgba->value, sock->ns.vec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void do_versions_nodetree_default_value(bNodeTree *ntree)
|
||||
{
|
||||
bNode *node;
|
||||
bNodeSocket *sock;
|
||||
for (node=ntree->nodes.first; node; node=node->next) {
|
||||
for (sock=node->inputs.first; sock; sock=sock->next)
|
||||
do_versions_socket_default_value(sock);
|
||||
for (sock=node->outputs.first; sock; sock=sock->next)
|
||||
do_versions_socket_default_value(sock);
|
||||
}
|
||||
for (sock=ntree->inputs.first; sock; sock=sock->next)
|
||||
do_versions_socket_default_value(sock);
|
||||
for (sock=ntree->outputs.first; sock; sock=sock->next)
|
||||
do_versions_socket_default_value(sock);
|
||||
}
|
||||
|
||||
static void lib_nodetree_init_types_cb(void *UNUSED(data), ID *UNUSED(id), bNodeTree *ntree)
|
||||
{
|
||||
bNode *node;
|
||||
|
||||
ntreeInitTypes(ntree);
|
||||
|
||||
/* need to do this here instead of in do_versions, otherwise next function can crash */
|
||||
do_versions_nodetree_default_value(ntree);
|
||||
|
||||
/* XXX could be replaced by do_versions for new nodes */
|
||||
for (node=ntree->nodes.first; node; node=node->next)
|
||||
@ -7247,53 +7297,6 @@ static void do_version_bone_roll_256(Bone *bone)
|
||||
do_version_bone_roll_256(child);
|
||||
}
|
||||
|
||||
static void do_versions_socket_default_value(bNodeSocket *sock)
|
||||
{
|
||||
bNodeSocketValueFloat *valfloat;
|
||||
bNodeSocketValueVector *valvector;
|
||||
bNodeSocketValueRGBA *valrgba;
|
||||
|
||||
if (sock->default_value)
|
||||
return;
|
||||
|
||||
switch (sock->type) {
|
||||
case SOCK_FLOAT:
|
||||
valfloat = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueFloat), "default socket value");
|
||||
valfloat->value = sock->ns.vec[0];
|
||||
valfloat->min = sock->ns.min;
|
||||
valfloat->max = sock->ns.max;
|
||||
valfloat->subtype = PROP_NONE;
|
||||
break;
|
||||
case SOCK_VECTOR:
|
||||
valvector = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueVector), "default socket value");
|
||||
copy_v3_v3(valvector->value, sock->ns.vec);
|
||||
valvector->min = sock->ns.min;
|
||||
valvector->max = sock->ns.max;
|
||||
valvector->subtype = PROP_NONE;
|
||||
break;
|
||||
case SOCK_RGBA:
|
||||
valrgba = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueRGBA), "default socket value");
|
||||
copy_v4_v4(valrgba->value, sock->ns.vec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void do_versions_nodetree_default_value(bNodeTree *ntree)
|
||||
{
|
||||
bNode *node;
|
||||
bNodeSocket *sock;
|
||||
for (node=ntree->nodes.first; node; node=node->next) {
|
||||
for (sock=node->inputs.first; sock; sock=sock->next)
|
||||
do_versions_socket_default_value(sock);
|
||||
for (sock=node->outputs.first; sock; sock=sock->next)
|
||||
do_versions_socket_default_value(sock);
|
||||
}
|
||||
for (sock=ntree->inputs.first; sock; sock=sock->next)
|
||||
do_versions_socket_default_value(sock);
|
||||
for (sock=ntree->outputs.first; sock; sock=sock->next)
|
||||
do_versions_socket_default_value(sock);
|
||||
}
|
||||
|
||||
static void do_versions_nodetree_dynamic_sockets(bNodeTree *ntree)
|
||||
{
|
||||
bNodeSocket *sock;
|
||||
|
@ -41,7 +41,7 @@ struct wmWindowManager;
|
||||
|
||||
/* space_image.c, exported for transform */
|
||||
struct Image *ED_space_image(struct SpaceImage *sima);
|
||||
void ED_space_image_set(struct bContext *C, struct SpaceImage *sima, struct Scene *scene, struct Object *obedit, struct Image *ima);
|
||||
void ED_space_image_set(struct SpaceImage *sima, struct Scene *scene, struct Object *obedit, struct Image *ima);
|
||||
|
||||
struct ImBuf *ED_space_image_acquire_buffer(struct SpaceImage *sima, void **lock_r);
|
||||
void ED_space_image_release_buffer(struct SpaceImage *sima, void *lock);
|
||||
|
@ -700,6 +700,9 @@ static int childof_set_inverse_exec (bContext *C, wmOperator *op)
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
/* nullify inverse matrix first */
|
||||
unit_m4(data->invmat);
|
||||
|
||||
/* try to find a pose channel */
|
||||
// TODO: get from context instead?
|
||||
if (ob && ob->pose)
|
||||
@ -733,18 +736,15 @@ static int childof_set_inverse_exec (bContext *C, wmOperator *op)
|
||||
where_is_pose(scene, ob);
|
||||
}
|
||||
else if (ob) {
|
||||
Object workob;
|
||||
/* use what_does_parent to find inverse - just like for normal parenting.
|
||||
* NOTE: what_does_parent uses a static workob defined in object.c
|
||||
*/
|
||||
Object workob = {{0}};
|
||||
|
||||
/* use what_does_parent to find inverse - just like for normal parenting */
|
||||
what_does_parent(scene, ob, &workob);
|
||||
invert_m4_m4(data->invmat, workob.obmat);
|
||||
}
|
||||
else
|
||||
unit_m4(data->invmat);
|
||||
|
||||
|
||||
WM_event_add_notifier(C, NC_OBJECT|ND_CONSTRAINT, ob);
|
||||
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
|
@ -24,6 +24,7 @@
|
||||
|
||||
#include "BLI_blenlib.h"
|
||||
#include "BLI_string.h"
|
||||
#include "BLI_utildefines.h"
|
||||
|
||||
#include "DNA_dynamicpaint_types.h"
|
||||
#include "DNA_modifier_types.h"
|
||||
@ -52,7 +53,7 @@
|
||||
#include "WM_types.h"
|
||||
#include "WM_api.h"
|
||||
|
||||
static int surface_slot_add_exec(bContext *C, wmOperator *op)
|
||||
static int surface_slot_add_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
{
|
||||
DynamicPaintModifierData *pmd = 0;
|
||||
Object *cObject = CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
|
||||
@ -94,7 +95,7 @@ void DPAINT_OT_surface_slot_add(wmOperatorType *ot)
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
}
|
||||
|
||||
static int surface_slot_remove_exec(bContext *C, wmOperator *op)
|
||||
static int surface_slot_remove_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
{
|
||||
DynamicPaintModifierData *pmd = 0;
|
||||
Object *cObject = CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
|
||||
@ -418,4 +419,4 @@ void DPAINT_OT_bake(wmOperatorType *ot)
|
||||
/* api callbacks */
|
||||
ot->exec= dynamicpaint_bake_exec;
|
||||
ot->poll= ED_operator_object_active_editable;
|
||||
}
|
||||
}
|
||||
|
@ -936,7 +936,8 @@ static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip,
|
||||
draw_marker_slide_zones(sc, track, marker, cur_pos, 1, 0, 0, width, height);
|
||||
draw_marker_slide_zones(sc, track, marker, cur_pos, 0, 0, 0, width, height);
|
||||
|
||||
if(fp) fp+= 2;
|
||||
if(fp)
|
||||
fp+= 2;
|
||||
}
|
||||
}
|
||||
|
||||
@ -950,20 +951,19 @@ static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip,
|
||||
while(track) {
|
||||
if((track->flag&TRACK_HIDDEN)==0) {
|
||||
int act= track==act_track;
|
||||
marker= BKE_tracking_get_marker(track, framenr);
|
||||
|
||||
if(!act) {
|
||||
marker= BKE_tracking_get_marker(track, framenr);
|
||||
|
||||
if(MARKER_VISIBLE(sc, marker)) {
|
||||
if(MARKER_VISIBLE(sc, marker)) {
|
||||
if(!act) {
|
||||
copy_v2_v2(cur_pos, fp ? fp : marker->pos);
|
||||
|
||||
draw_marker_areas(sc, track, marker, cur_pos, width, height, 0, 1);
|
||||
draw_marker_slide_zones(sc, track, marker, cur_pos, 0, 1, 0, width, height);
|
||||
}
|
||||
}
|
||||
|
||||
if(MARKER_VISIBLE(sc, marker) && fp)
|
||||
fp+= 2;
|
||||
if(fp)
|
||||
fp+= 2;
|
||||
}
|
||||
}
|
||||
|
||||
track= track->next;
|
||||
|
@ -804,7 +804,7 @@ static int image_open_exec(bContext *C, wmOperator *op)
|
||||
RNA_property_update(C, &pprop->ptr, pprop->prop);
|
||||
}
|
||||
else if(sima) {
|
||||
ED_space_image_set(C, sima, scene, obedit, ima);
|
||||
ED_space_image_set(sima, scene, obedit, ima);
|
||||
iuser= &sima->iuser;
|
||||
}
|
||||
else {
|
||||
@ -1420,7 +1420,7 @@ static int image_new_exec(bContext *C, wmOperator *op)
|
||||
RNA_property_update(C, &ptr, prop);
|
||||
}
|
||||
else if(sima)
|
||||
ED_space_image_set(C, sima, scene, obedit, ima);
|
||||
ED_space_image_set(sima, scene, obedit, ima);
|
||||
|
||||
// XXX other users?
|
||||
BKE_image_signal(ima, (sima)? &sima->iuser: NULL, IMA_SIGNAL_USER_NEW_IMAGE);
|
||||
|
@ -83,9 +83,10 @@ Image *ED_space_image(SpaceImage *sima)
|
||||
}
|
||||
|
||||
/* called to assign images to UV faces */
|
||||
void ED_space_image_set(bContext *C, SpaceImage *sima, Scene *scene, Object *obedit, Image *ima)
|
||||
void ED_space_image_set(SpaceImage *sima, Scene *scene, Object *obedit, Image *ima)
|
||||
{
|
||||
ED_uvedit_assign_image(CTX_data_main(C), scene, obedit, ima, sima->image);
|
||||
/* context may be NULL, so use global */
|
||||
ED_uvedit_assign_image(G.main, scene, obedit, ima, sima->image);
|
||||
|
||||
/* change the space ima after because uvedit_face_visible uses the space ima
|
||||
* to check if the face is displayed in UV-localview */
|
||||
@ -100,13 +101,10 @@ void ED_space_image_set(bContext *C, SpaceImage *sima, Scene *scene, Object *obe
|
||||
if(sima->image && sima->image->id.us==0)
|
||||
sima->image->id.us= 1;
|
||||
|
||||
if(C) {
|
||||
if(obedit)
|
||||
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
|
||||
|
||||
ED_area_tag_redraw(CTX_wm_area(C));
|
||||
|
||||
}
|
||||
if(obedit)
|
||||
WM_main_add_notifier(NC_GEOM|ND_DATA, obedit->data);
|
||||
|
||||
WM_main_add_notifier(NC_SPACE|ND_SPACE_IMAGE, NULL);
|
||||
}
|
||||
|
||||
ImBuf *ED_space_image_acquire_buffer(SpaceImage *sima, void **lock_r)
|
||||
|
@ -406,7 +406,7 @@ static int draw_tface__set_draw_legacy(MTFace *tface, int has_mcol, int matnr)
|
||||
}
|
||||
}
|
||||
|
||||
static int draw_mcol__set_draw_legacy(MTFace *tface, int has_mcol, int matnr)
|
||||
static int draw_mcol__set_draw_legacy(MTFace *UNUSED(tface), int has_mcol, int UNUSED(matnr))
|
||||
{
|
||||
if (has_mcol) return 1;
|
||||
else return 2;
|
||||
|
@ -99,6 +99,7 @@ void ED_view3d_camera_lock_init(View3D *v3d, RegionView3D *rv3d)
|
||||
int ED_view3d_camera_lock_sync(View3D *v3d, RegionView3D *rv3d)
|
||||
{
|
||||
if(ED_view3d_camera_lock_check(v3d, rv3d)) {
|
||||
ObjectTfmProtectedChannels obtfm;
|
||||
Object *root_parent;
|
||||
|
||||
if((U.uiflag & USER_CAM_LOCK_NO_PARENT)==0 && (root_parent= v3d->camera->parent)) {
|
||||
@ -117,7 +118,10 @@ int ED_view3d_camera_lock_sync(View3D *v3d, RegionView3D *rv3d)
|
||||
mul_m4_m4m4(diff_mat, v3d->camera->imat, view_mat);
|
||||
|
||||
mul_m4_m4m4(parent_mat, root_parent->obmat, diff_mat);
|
||||
|
||||
object_tfm_protected_backup(root_parent, &obtfm);
|
||||
object_apply_mat4(root_parent, parent_mat, TRUE, FALSE);
|
||||
object_tfm_protected_restore(root_parent, &obtfm, root_parent->protectflag);
|
||||
|
||||
ob_update= v3d->camera;
|
||||
while(ob_update) {
|
||||
@ -127,7 +131,10 @@ int ED_view3d_camera_lock_sync(View3D *v3d, RegionView3D *rv3d)
|
||||
}
|
||||
}
|
||||
else {
|
||||
object_tfm_protected_backup(v3d->camera, &obtfm);
|
||||
ED_view3d_to_object(v3d->camera, rv3d->ofs, rv3d->viewquat, rv3d->dist);
|
||||
object_tfm_protected_restore(v3d->camera, &obtfm, v3d->camera->protectflag);
|
||||
|
||||
DAG_id_tag_update(&v3d->camera->id, OB_RECALC_OB);
|
||||
WM_main_add_notifier(NC_OBJECT|ND_TRANSFORM, v3d->camera);
|
||||
}
|
||||
@ -346,6 +353,7 @@ typedef struct ViewOpsData {
|
||||
double timer_lastdraw;
|
||||
|
||||
float oldquat[4];
|
||||
float viewquat[4]; /* working copy of rv3d->viewquat */
|
||||
float trackvec[3];
|
||||
float mousevec[3]; /* dolly only */
|
||||
float reverse, dist0;
|
||||
@ -408,6 +416,7 @@ static void viewops_data_create(bContext *C, wmOperator *op, wmEvent *event)
|
||||
ED_view3d_camera_lock_init(vod->v3d, vod->rv3d);
|
||||
|
||||
vod->dist0= rv3d->dist;
|
||||
copy_qt_qt(vod->viewquat, rv3d->viewquat);
|
||||
copy_qt_qt(vod->oldquat, rv3d->viewquat);
|
||||
vod->origx= vod->oldx= event->x;
|
||||
vod->origy= vod->oldy= event->y;
|
||||
@ -643,13 +652,13 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
|
||||
|
||||
q1[0]= cos(phi);
|
||||
mul_v3_fl(q1+1, sin(phi));
|
||||
mul_qt_qtqt(rv3d->viewquat, q1, vod->oldquat);
|
||||
mul_qt_qtqt(vod->viewquat, q1, vod->oldquat);
|
||||
|
||||
if (vod->use_dyn_ofs) {
|
||||
/* compute the post multiplication quat, to rotate the offset correctly */
|
||||
copy_qt_qt(q1, vod->oldquat);
|
||||
conjugate_qt(q1);
|
||||
mul_qt_qtqt(q1, q1, rv3d->viewquat);
|
||||
mul_qt_qtqt(q1, q1, vod->viewquat);
|
||||
|
||||
conjugate_qt(q1); /* conj == inv for unit quat */
|
||||
copy_v3_v3(rv3d->ofs, vod->ofs);
|
||||
@ -671,7 +680,7 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
|
||||
const float sensitivity = 0.0035f;
|
||||
|
||||
/* Get the 3x3 matrix and its inverse from the quaternion */
|
||||
quat_to_mat3( m,rv3d->viewquat);
|
||||
quat_to_mat3( m,vod->viewquat);
|
||||
invert_m3_m3(m_inv,m);
|
||||
|
||||
/* Determine the direction of the x vector (for rotating up and down) */
|
||||
@ -682,7 +691,7 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
|
||||
phi = sensitivity * -(y - vod->oldy);
|
||||
q1[0] = cos(phi);
|
||||
mul_v3_v3fl(q1+1, xvec, sin(phi));
|
||||
mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, q1);
|
||||
mul_qt_qtqt(vod->viewquat, vod->viewquat, q1);
|
||||
|
||||
if (vod->use_dyn_ofs) {
|
||||
conjugate_qt(q1); /* conj == inv for unit quat */
|
||||
@ -696,7 +705,7 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
|
||||
q1[0] = cos(phi);
|
||||
q1[1] = q1[2] = 0.0;
|
||||
q1[3] = sin(phi);
|
||||
mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, q1);
|
||||
mul_qt_qtqt(vod->viewquat, vod->viewquat, q1);
|
||||
|
||||
if (vod->use_dyn_ofs) {
|
||||
conjugate_qt(q1);
|
||||
@ -711,7 +720,7 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
|
||||
int i;
|
||||
float viewquat_inv[4];
|
||||
float zaxis[3]={0,0,1};
|
||||
invert_qt_qt(viewquat_inv, rv3d->viewquat);
|
||||
invert_qt_qt(viewquat_inv, vod->viewquat);
|
||||
|
||||
mul_qt_v3(viewquat_inv, zaxis);
|
||||
|
||||
@ -736,7 +745,7 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
|
||||
* for testing roll */
|
||||
rotation_between_vecs_to_quat(viewquat_align, zaxis_test, zaxis);
|
||||
normalize_qt(viewquat_align);
|
||||
mul_qt_qtqt(viewquat_align, rv3d->viewquat, viewquat_align);
|
||||
mul_qt_qtqt(viewquat_align, vod->viewquat, viewquat_align);
|
||||
normalize_qt(viewquat_align);
|
||||
invert_qt_qt(viewquat_align_inv, viewquat_align);
|
||||
|
||||
@ -766,7 +775,7 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
|
||||
}
|
||||
}
|
||||
|
||||
copy_qt_qt(rv3d->viewquat, quat_best);
|
||||
copy_qt_qt(vod->viewquat, quat_best);
|
||||
rv3d->view= view; /* if we snap to a rolled camera the grid is invalid */
|
||||
|
||||
break;
|
||||
@ -777,7 +786,11 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
|
||||
vod->oldy= y;
|
||||
|
||||
/* avoid precision loss over time */
|
||||
normalize_qt(rv3d->viewquat);
|
||||
normalize_qt(vod->viewquat);
|
||||
|
||||
/* use a working copy so view rotation locking doesnt overwrite the locked
|
||||
* rotation back into the view we calculate with */
|
||||
copy_qt_qt(rv3d->viewquat, vod->viewquat);
|
||||
|
||||
ED_view3d_camera_lock_sync(vod->v3d, rv3d);
|
||||
|
||||
|
@ -370,6 +370,7 @@ static int view3d_setcameratoview_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
{
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
RegionView3D *rv3d= CTX_wm_region_view3d(C);
|
||||
ObjectTfmProtectedChannels obtfm;
|
||||
|
||||
copy_qt_qt(rv3d->lviewquat, rv3d->viewquat);
|
||||
rv3d->lview= rv3d->view;
|
||||
@ -377,7 +378,12 @@ static int view3d_setcameratoview_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
rv3d->lpersp= rv3d->persp;
|
||||
}
|
||||
|
||||
object_tfm_protected_backup(v3d->camera, &obtfm);
|
||||
|
||||
ED_view3d_to_object(v3d->camera, rv3d->ofs, rv3d->viewquat, rv3d->dist);
|
||||
|
||||
object_tfm_protected_restore(v3d->camera, &obtfm, v3d->camera->protectflag);
|
||||
|
||||
DAG_id_tag_update(&v3d->camera->id, OB_RECALC_OB);
|
||||
rv3d->persp = RV3D_CAMOB;
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* Contributor(s): Miika Hämäläinen
|
||||
* Contributor(s): Miika Hämäläinen
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
|
@ -6,7 +6,7 @@
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* Contributor(s): Miika Hämäläinen
|
||||
* Contributor(s): Miika Hämäläinen
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
|
@ -514,7 +514,7 @@ static void rna_SpaceImageEditor_image_set(PointerRNA *ptr, PointerRNA value)
|
||||
SpaceImage *sima= (SpaceImage*)(ptr->data);
|
||||
bScreen *sc= (bScreen*)ptr->id.data;
|
||||
|
||||
ED_space_image_set(NULL, sima, sc->scene, sc->scene->obedit, (Image*)value.data);
|
||||
ED_space_image_set(sima, sc->scene, sc->scene->obedit, (Image*)value.data);
|
||||
}
|
||||
|
||||
static EnumPropertyItem *rna_SpaceImageEditor_draw_channels_itemf(bContext *UNUSED(C), PointerRNA *ptr,
|
||||
|
@ -115,7 +115,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
|
||||
faceMap = MEM_callocN(sizeof(*faceMap) * maxFaces, "build modifier faceMap");
|
||||
for(i = 0; i < maxFaces; ++i) faceMap[i] = i;
|
||||
|
||||
frac = BKE_curframe(md->scene) - bmd->start / bmd->length;
|
||||
frac = (BKE_curframe(md->scene) - bmd->start) / bmd->length;
|
||||
CLAMP(frac, 0.0f, 1.0f);
|
||||
|
||||
numFaces = dm->getNumFaces(dm) * frac;
|
||||
|
@ -6,7 +6,7 @@
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* Contributor(s): Miika Hämäläinen
|
||||
* Contributor(s): Miika Hämäläinen
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*
|
||||
@ -21,6 +21,8 @@
|
||||
|
||||
#include "MEM_guardedalloc.h"
|
||||
|
||||
#include "BLI_utildefines.h"
|
||||
|
||||
#include "BKE_cdderivedmesh.h"
|
||||
#include "BKE_dynamicpaint.h"
|
||||
#include "BKE_modifier.h"
|
||||
@ -53,7 +55,7 @@ static void freeData(ModifierData *md)
|
||||
dynamicPaint_Modifier_free(pmd);
|
||||
}
|
||||
|
||||
static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
|
||||
static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
|
||||
{
|
||||
DynamicPaintModifierData *pmd = (DynamicPaintModifierData*)md;
|
||||
CustomDataMask dataMask = 0;
|
||||
@ -88,8 +90,8 @@ static CustomDataMask requiredDataMask(Object *ob, ModifierData *md)
|
||||
|
||||
static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
|
||||
DerivedMesh *dm,
|
||||
int useRenderParams,
|
||||
int isFinalCalc)
|
||||
int UNUSED(useRenderParams),
|
||||
int UNUSED(isFinalCalc))
|
||||
{
|
||||
DynamicPaintModifierData *pmd = (DynamicPaintModifierData*) md;
|
||||
|
||||
@ -120,7 +122,7 @@ static void updateDepgraph(ModifierData *md, DagForest *forest,
|
||||
}
|
||||
}
|
||||
|
||||
static int dependsOnTime(ModifierData *md)
|
||||
static int dependsOnTime(ModifierData *UNUSED(md))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
@ -143,8 +145,8 @@ static void foreachIDLink(ModifierData *md, Object *ob,
|
||||
}
|
||||
}
|
||||
|
||||
static void foreachTexLink(ModifierData *md, Object *ob,
|
||||
TexWalkFunc walk, void *userData)
|
||||
static void foreachTexLink(ModifierData *UNUSED(md), Object *UNUSED(ob),
|
||||
TexWalkFunc UNUSED(walk), void *UNUSED(userData))
|
||||
{
|
||||
//walk(userData, ob, md, ""); /* re-enable when possible */
|
||||
}
|
||||
|
@ -1,21 +1,21 @@
|
||||
/*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software(ListBase *lb); you can redistribute it and/or
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation(ListBase *lb); either version 2
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version. The Blender
|
||||
* Foundation also sells licenses for use in proprietary software under
|
||||
* the Blender License. See http://www.blender.org/BL/ for information
|
||||
* about this.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY(ListBase *lb); without even the implied warranty of
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program(ListBase *lb); if not, write to the Free Software Foundation,
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2005 Blender Foundation.
|
||||
|
@ -53,7 +53,7 @@ void register_node_type_sh_bsdf_glass(ListBase *lb)
|
||||
{
|
||||
static bNodeType ntype;
|
||||
|
||||
node_type_base(&ntype, SH_NODE_BSDF_GLASS, "Glass BSDF", NODE_CLASS_SHADER, 0);
|
||||
node_type_base(&ntype, SH_NODE_BSDF_GLASS, "Glass BSDF", NODE_CLASS_SHADER, NODE_OPTIONS);
|
||||
node_type_compatibility(&ntype, NODE_NEW_SHADING);
|
||||
node_type_socket_templates(&ntype, sh_node_bsdf_glass_in, sh_node_bsdf_glass_out);
|
||||
node_type_size(&ntype, 150, 60, 200);
|
||||
|
@ -53,7 +53,7 @@ void register_node_type_sh_bsdf_glossy(ListBase *lb)
|
||||
{
|
||||
static bNodeType ntype;
|
||||
|
||||
node_type_base(&ntype, SH_NODE_BSDF_GLOSSY, "Glossy BSDF", NODE_CLASS_SHADER, 0);
|
||||
node_type_base(&ntype, SH_NODE_BSDF_GLOSSY, "Glossy BSDF", NODE_CLASS_SHADER, NODE_OPTIONS);
|
||||
node_type_compatibility(&ntype, NODE_NEW_SHADING);
|
||||
node_type_socket_templates(&ntype, sh_node_bsdf_glossy_in, sh_node_bsdf_glossy_out);
|
||||
node_type_size(&ntype, 150, 60, 200);
|
||||
|
@ -144,7 +144,6 @@ void register_node_type_sh_geom(ListBase *lb)
|
||||
|
||||
node_type_base(&ntype, SH_NODE_GEOMETRY, "Geometry", NODE_CLASS_INPUT, NODE_OPTIONS);
|
||||
node_type_compatibility(&ntype, NODE_OLD_SHADING);
|
||||
node_type_compatibility(&ntype, NODE_OLD_SHADING);
|
||||
node_type_socket_templates(&ntype, NULL, sh_node_geom_out);
|
||||
node_type_size(&ntype, 120, 80, 160);
|
||||
node_type_init(&ntype, node_shader_init_geometry);
|
||||
|
@ -75,7 +75,7 @@ void register_node_type_sh_tex_environment(ListBase *lb)
|
||||
{
|
||||
static bNodeType ntype;
|
||||
|
||||
node_type_base(&ntype, SH_NODE_TEX_ENVIRONMENT, "Environment Texture", NODE_CLASS_TEXTURE, 0);
|
||||
node_type_base(&ntype, SH_NODE_TEX_ENVIRONMENT, "Environment Texture", NODE_CLASS_TEXTURE, NODE_OPTIONS);
|
||||
node_type_compatibility(&ntype, NODE_NEW_SHADING);
|
||||
node_type_socket_templates(&ntype, sh_node_tex_environment_in, sh_node_tex_environment_out);
|
||||
node_type_size(&ntype, 150, 60, 200);
|
||||
|
@ -67,7 +67,7 @@ void register_node_type_sh_tex_gradient(ListBase *lb)
|
||||
{
|
||||
static bNodeType ntype;
|
||||
|
||||
node_type_base(&ntype, SH_NODE_TEX_GRADIENT, "Gradient Texture", NODE_CLASS_TEXTURE, 0);
|
||||
node_type_base(&ntype, SH_NODE_TEX_GRADIENT, "Gradient Texture", NODE_CLASS_TEXTURE, NODE_OPTIONS);
|
||||
node_type_compatibility(&ntype, NODE_NEW_SHADING);
|
||||
node_type_socket_templates(&ntype, sh_node_tex_gradient_in, sh_node_tex_gradient_out);
|
||||
node_type_size(&ntype, 150, 60, 200);
|
||||
|
@ -75,7 +75,7 @@ void register_node_type_sh_tex_image(ListBase *lb)
|
||||
{
|
||||
static bNodeType ntype;
|
||||
|
||||
node_type_base(&ntype, SH_NODE_TEX_IMAGE, "Image Texture", NODE_CLASS_TEXTURE, 0);
|
||||
node_type_base(&ntype, SH_NODE_TEX_IMAGE, "Image Texture", NODE_CLASS_TEXTURE, NODE_OPTIONS);
|
||||
node_type_compatibility(&ntype, NODE_NEW_SHADING);
|
||||
node_type_socket_templates(&ntype, sh_node_tex_image_in, sh_node_tex_image_out);
|
||||
node_type_size(&ntype, 150, 60, 200);
|
||||
|
@ -72,7 +72,7 @@ void register_node_type_sh_tex_magic(ListBase *lb)
|
||||
{
|
||||
static bNodeType ntype;
|
||||
|
||||
node_type_base(&ntype, SH_NODE_TEX_MAGIC, "Magic Texture", NODE_CLASS_TEXTURE, 0);
|
||||
node_type_base(&ntype, SH_NODE_TEX_MAGIC, "Magic Texture", NODE_CLASS_TEXTURE, NODE_OPTIONS);
|
||||
node_type_compatibility(&ntype, NODE_NEW_SHADING);
|
||||
node_type_socket_templates(&ntype, sh_node_tex_magic_in, sh_node_tex_magic_out);
|
||||
node_type_size(&ntype, 150, 60, 200);
|
||||
|
@ -73,7 +73,7 @@ void register_node_type_sh_tex_musgrave(ListBase *lb)
|
||||
{
|
||||
static bNodeType ntype;
|
||||
|
||||
node_type_base(&ntype, SH_NODE_TEX_MUSGRAVE, "Musgrave Texture", NODE_CLASS_TEXTURE, 0);
|
||||
node_type_base(&ntype, SH_NODE_TEX_MUSGRAVE, "Musgrave Texture", NODE_CLASS_TEXTURE, NODE_OPTIONS);
|
||||
node_type_compatibility(&ntype, NODE_NEW_SHADING);
|
||||
node_type_socket_templates(&ntype, sh_node_tex_musgrave_in, sh_node_tex_musgrave_out);
|
||||
node_type_size(&ntype, 150, 60, 200);
|
||||
|
@ -69,7 +69,7 @@ void register_node_type_sh_tex_sky(ListBase *lb)
|
||||
{
|
||||
static bNodeType ntype;
|
||||
|
||||
node_type_base(&ntype, SH_NODE_TEX_SKY, "Sky Texture", NODE_CLASS_TEXTURE, 0);
|
||||
node_type_base(&ntype, SH_NODE_TEX_SKY, "Sky Texture", NODE_CLASS_TEXTURE, NODE_OPTIONS);
|
||||
node_type_compatibility(&ntype, NODE_NEW_SHADING);
|
||||
node_type_socket_templates(&ntype, sh_node_tex_sky_in, sh_node_tex_sky_out);
|
||||
node_type_size(&ntype, 150, 60, 200);
|
||||
|
@ -68,7 +68,7 @@ void register_node_type_sh_tex_voronoi(ListBase *lb)
|
||||
{
|
||||
static bNodeType ntype;
|
||||
|
||||
node_type_base(&ntype, SH_NODE_TEX_VORONOI, "Voronoi Texture", NODE_CLASS_TEXTURE, 0);
|
||||
node_type_base(&ntype, SH_NODE_TEX_VORONOI, "Voronoi Texture", NODE_CLASS_TEXTURE, NODE_OPTIONS);
|
||||
node_type_compatibility(&ntype, NODE_NEW_SHADING);
|
||||
node_type_socket_templates(&ntype, sh_node_tex_voronoi_in, sh_node_tex_voronoi_out);
|
||||
node_type_size(&ntype, 150, 60, 200);
|
||||
|
@ -71,7 +71,7 @@ void register_node_type_sh_tex_wave(ListBase *lb)
|
||||
{
|
||||
static bNodeType ntype;
|
||||
|
||||
node_type_base(&ntype, SH_NODE_TEX_WAVE, "Wave Texture", NODE_CLASS_TEXTURE, 0);
|
||||
node_type_base(&ntype, SH_NODE_TEX_WAVE, "Wave Texture", NODE_CLASS_TEXTURE, NODE_OPTIONS);
|
||||
node_type_compatibility(&ntype, NODE_NEW_SHADING);
|
||||
node_type_socket_templates(&ntype, sh_node_tex_wave_in, sh_node_tex_wave_out);
|
||||
node_type_size(&ntype, 150, 60, 200);
|
||||
|
@ -47,6 +47,7 @@ struct CSG_VertexIteratorDescriptor;
|
||||
struct ColorBand;
|
||||
struct CurveMapping;
|
||||
struct Curve;
|
||||
struct DerivedMesh;
|
||||
struct EditBone;
|
||||
struct EditFace;
|
||||
struct EditMesh;
|
||||
@ -77,6 +78,7 @@ struct RenderEngine;
|
||||
struct RenderEngineType;
|
||||
struct RenderLayer;
|
||||
struct RenderResult;
|
||||
struct Scene;
|
||||
struct ScrArea;
|
||||
struct SculptSession;
|
||||
struct ShadeInput;
|
||||
@ -217,7 +219,7 @@ int ED_space_image_show_uvedit(struct SpaceImage *sima, struct Object *obedit){r
|
||||
int ED_space_image_show_render(struct SpaceImage *sima){return 0;}
|
||||
int ED_space_image_show_paint(struct SpaceImage *sima){return 0;}
|
||||
void ED_space_image_paint_update(struct wmWindowManager *wm, struct ToolSettings *settings){}
|
||||
void ED_space_image_set(struct bContext *C, struct SpaceImage *sima, struct Scene *scene, struct Object *obedit, struct Image *ima){}
|
||||
void ED_space_image_set(struct SpaceImage *sima, struct Scene *scene, struct Object *obedit, struct Image *ima){}
|
||||
struct ImBuf *ED_space_image_buffer(struct SpaceImage *sima){return (struct ImBuf *) NULL;}
|
||||
void ED_screen_set_scene(struct bContext *C, struct Scene *scene){}
|
||||
void ED_space_clip_set(struct bContext *C, struct SpaceClip *sc, struct MovieClip *clip){}
|
||||
|
Loading…
Reference in New Issue
Block a user