forked from bartvdbraak/blender
Merging r42533 through r42601 from trunk into soc-2011-tomato
This commit is contained in:
commit
b865c0314f
12
SConstruct
12
SConstruct
@ -272,7 +272,7 @@ if 'blenderlite' in B.targets:
|
||||
if k not in B.arguments:
|
||||
env[k] = v
|
||||
|
||||
# Extended OSX_SDK and 3D_CONNEXION_CLIENT_LIBRARY detection for OSX
|
||||
# Extended OSX_SDK and 3D_CONNEXION_CLIENT_LIBRARY and JAckOSX detection for OSX
|
||||
if env['OURPLATFORM']=='darwin':
|
||||
print B.bc.OKGREEN + "Detected Xcode version: -- " + B.bc.ENDC + env['XCODE_CUR_VER'][:9] + " --"
|
||||
print "Available " + env['MACOSX_SDK_CHECK']
|
||||
@ -291,6 +291,16 @@ if env['OURPLATFORM']=='darwin':
|
||||
else:
|
||||
env.Append(LINKFLAGS=['-Xlinker','-weak_framework','-Xlinker','3DconnexionClient'])
|
||||
|
||||
# for now, Mac builders must download and install the JackOSX framework
|
||||
# necessary header file lives here when installed:
|
||||
# /Library/Frameworks/Jackmp.framework/Versions/A/Headers/jack.h
|
||||
if env['WITH_BF_JACK'] == 1:
|
||||
if not os.path.exists('/Library/Frameworks/Jackmp.framework'):
|
||||
print "JackOSX install not found, disabling WITH_BF_JACK" # avoid build errors !
|
||||
env['WITH_BF_JACK'] = 0
|
||||
else:
|
||||
env.Append(LINKFLAGS=['-Xlinker','-weak_framework','-Xlinker','Jackmp'])
|
||||
|
||||
if env['WITH_BF_OPENMP'] == 1:
|
||||
if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'):
|
||||
env['CCFLAGS'].append('/openmp')
|
||||
|
@ -96,6 +96,7 @@ WITH_BF_JACK = True
|
||||
|
||||
# Cycles
|
||||
WITH_BF_CYCLES = True
|
||||
WITH_BF_CYCLES_CUDA_BINARIES = True
|
||||
|
||||
WITH_BF_OIIO = True
|
||||
WITH_BF_STATICOIIO = True
|
||||
|
@ -95,5 +95,5 @@ WITH_BF_OCEANSIM = True
|
||||
|
||||
# Compilation and optimization
|
||||
BF_DEBUG = False
|
||||
REL_CCFLAGS = ['-O2'] # C & C++
|
||||
REL_CCFLAGS = ['-O2', '-msse', '-msse2'] # C & C++
|
||||
PLATFORM_LINKFLAGS = ['-L/home/sources/staticlibs/lib64']
|
||||
|
@ -96,6 +96,7 @@ WITH_BF_JACK = True
|
||||
|
||||
# Cycles
|
||||
WITH_BF_CYCLES = True
|
||||
WITH_BF_CYCLES_CUDA_BINARIES = True
|
||||
|
||||
WITH_BF_OIIO = True
|
||||
WITH_BF_STATICOIIO = True
|
||||
@ -116,5 +117,5 @@ WITH_BF_OCEANSIM = True
|
||||
|
||||
# Compilation and optimization
|
||||
BF_DEBUG = False
|
||||
REL_CCFLAGS = ['-O2'] # C & C++
|
||||
REL_CCFLAGS = ['-O2', '-msse', '-msse2'] # C & C++
|
||||
PLATFORM_LINKFLAGS = ['-L/home/sources/staticlibs/lib64']
|
||||
|
@ -148,12 +148,12 @@ BF_CXX = '/usr'
|
||||
WITH_BF_STATICCXX = False
|
||||
BF_CXX_LIB_STATIC = '${BF_CXX}/lib/libstdc++.a'
|
||||
|
||||
# TODO - set proper paths here (add precompiled to lib/ ? )
|
||||
WITH_BF_JACK = False
|
||||
BF_JACK = '/usr'
|
||||
BF_JACK_INC = '${BF_JACK}/include/jack'
|
||||
# we use simply jack framework
|
||||
WITH_BF_JACK = True
|
||||
BF_JACK = '/Library/Frameworks/Jackmp.framework'
|
||||
BF_JACK_INC = '${BF_JACK}/headers'
|
||||
BF_JACK_LIB = 'jack'
|
||||
BF_JACK_LIBPATH = '${BF_JACK}/lib'
|
||||
BF_JACK_LIBPATH = '${BF_JACK}'
|
||||
|
||||
WITH_BF_SNDFILE = True
|
||||
BF_SNDFILE = LIBDIR + '/sndfile'
|
||||
|
@ -1,4 +1,4 @@
|
||||
.TH "BLENDER" "1" "October 17, 2011" "Blender Blender 2\&.60 (sub 0)"
|
||||
.TH "BLENDER" "1" "December 10, 2011" "Blender Blender 2\&.60 (sub 7)"
|
||||
|
||||
.SH NAME
|
||||
blender \- a 3D modelling and rendering package
|
||||
@ -15,7 +15,7 @@ Use Blender to create TV commercials, to make technical visualizations, business
|
||||
http://www.blender.org
|
||||
.SH OPTIONS
|
||||
|
||||
Blender 2.59 (sub 4)
|
||||
Blender 2.60 (sub 7)
|
||||
Usage: blender [args ...] [file] [args ...]
|
||||
.br
|
||||
.SS "Render Options:"
|
||||
@ -378,11 +378,10 @@ Arguments are executed in the order they are given. eg
|
||||
\fIBLENDER_USER_CONFIG\fR Directory for user configuration files.
|
||||
\fIBLENDER_USER_SCRIPTS\fR Directory for user scripts.
|
||||
\fIBLENDER_SYSTEM_SCRIPTS\fR Directory for system wide scripts.
|
||||
\fIBLENDER_USER_DATAFILES\fR Directory for user data files (icons, translations, ..).
|
||||
\fIBLENDER_USER_DAT`AFILES\fR Directory for user data files (icons, translations, ..).
|
||||
\fIBLENDER_SYSTEM_DATAFILES\fR Directory for system wide data files.
|
||||
\fIBLENDER_SYSTEM_PYTHON\fR Directory for system python libraries.
|
||||
\fITMP\fR or \fITMPDIR\fR Store temporary files here.
|
||||
\fISDL_AUDIODRIVER\fR LibSDL audio driver \- alsa, esd, dma.
|
||||
\fIPYTHONHOME\fR Path to the python directory, eg. /usr/lib/python.
|
||||
.br
|
||||
.br
|
||||
|
58
extern/libmv/CMakeLists.txt
vendored
58
extern/libmv/CMakeLists.txt
vendored
@ -148,23 +148,23 @@ if(WIN32)
|
||||
third_party/glog/src/vlog_is_on.cc
|
||||
third_party/glog/src/windows/port.cc
|
||||
|
||||
third_party/glog/src/utilities.h
|
||||
third_party/glog/src/stacktrace_generic-inl.h
|
||||
third_party/glog/src/config.h
|
||||
third_party/glog/src/stacktrace.h
|
||||
third_party/glog/src/stacktrace_x86_64-inl.h
|
||||
third_party/glog/src/base/googleinit.h
|
||||
third_party/glog/src/base/mutex.h
|
||||
third_party/glog/src/base/commandlineflags.h
|
||||
third_party/glog/src/stacktrace_generic-inl.h
|
||||
third_party/glog/src/stacktrace_libunwind-inl.h
|
||||
third_party/glog/src/stacktrace_powerpc-inl.h
|
||||
third_party/glog/src/stacktrace_x86-inl.h
|
||||
third_party/glog/src/config.h
|
||||
third_party/glog/src/stacktrace_libunwind-inl.h
|
||||
third_party/glog/src/stacktrace_x86_64-inl.h
|
||||
third_party/glog/src/utilities.h
|
||||
third_party/glog/src/base/commandlineflags.h
|
||||
third_party/glog/src/base/googleinit.h
|
||||
third_party/glog/src/base/mutex.h
|
||||
third_party/glog/src/windows/config.h
|
||||
third_party/glog/src/windows/port.h
|
||||
third_party/glog/src/windows/glog/log_severity.h
|
||||
third_party/glog/src/windows/glog/logging.h
|
||||
third_party/glog/src/windows/glog/raw_logging.h
|
||||
third_party/glog/src/windows/glog/vlog_is_on.h
|
||||
third_party/glog/src/windows/glog/logging.h
|
||||
third_party/glog/src/windows/glog/log_severity.h
|
||||
third_party/glog/src/windows/port.h
|
||||
third_party/glog/src/windows/config.h
|
||||
)
|
||||
|
||||
list(APPEND INC
|
||||
@ -184,7 +184,7 @@ if(WIN32)
|
||||
string(REPLACE "${FLAG}" "Od" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
|
||||
endforeach()
|
||||
endif()
|
||||
else(WIN32)
|
||||
else()
|
||||
list(APPEND SRC
|
||||
third_party/glog/src/utilities.cc
|
||||
third_party/glog/src/symbolize.cc
|
||||
@ -194,25 +194,26 @@ else(WIN32)
|
||||
third_party/glog/src/demangle.cc
|
||||
third_party/glog/src/raw_logging.cc
|
||||
|
||||
third_party/glog/src/utilities.h
|
||||
third_party/glog/src/stacktrace_generic-inl.h
|
||||
third_party/glog/src/config.h
|
||||
third_party/glog/src/config_freebsd.h
|
||||
third_party/glog/src/config_linux.h
|
||||
third_party/glog/src/config_mac.h
|
||||
third_party/glog/src/demangle.h
|
||||
third_party/glog/src/stacktrace.h
|
||||
third_party/glog/src/stacktrace_x86_64-inl.h
|
||||
third_party/glog/src/symbolize.h
|
||||
third_party/glog/src/base/googleinit.h
|
||||
third_party/glog/src/base/mutex.h
|
||||
third_party/glog/src/base/commandlineflags.h
|
||||
third_party/glog/src/stacktrace_generic-inl.h
|
||||
third_party/glog/src/stacktrace_libunwind-inl.h
|
||||
third_party/glog/src/stacktrace_powerpc-inl.h
|
||||
third_party/glog/src/stacktrace_x86-inl.h
|
||||
third_party/glog/src/config.h
|
||||
third_party/glog/src/demangle.h
|
||||
third_party/glog/src/stacktrace_libunwind-inl.h
|
||||
third_party/glog/src/stacktrace_x86_64-inl.h
|
||||
third_party/glog/src/symbolize.h
|
||||
third_party/glog/src/utilities.h
|
||||
third_party/glog/src/base/commandlineflags.h
|
||||
third_party/glog/src/base/googleinit.h
|
||||
third_party/glog/src/base/mutex.h
|
||||
third_party/glog/src/glog/log_severity.h
|
||||
third_party/glog/src/glog/logging.h
|
||||
third_party/glog/src/glog/raw_logging.h
|
||||
third_party/glog/src/glog/vlog_is_on.h
|
||||
third_party/glog/src/glog/logging.h
|
||||
third_party/glog/src/glog/log_severity.h
|
||||
third_party/glog/src/config_linux.h
|
||||
)
|
||||
|
||||
list(APPEND INC
|
||||
@ -220,6 +221,9 @@ else(WIN32)
|
||||
)
|
||||
endif()
|
||||
|
||||
add_definitions(-DV3DLIB_ENABLE_SUITESPARSE -DGOOGLE_GLOG_DLL_DECL=)
|
||||
add_definitions(
|
||||
-DV3DLIB_ENABLE_SUITESPARSE
|
||||
-DGOOGLE_GLOG_DLL_DECL=
|
||||
)
|
||||
|
||||
blender_add_lib(extern_libmv "${SRC}" "${INC}" "${INC_SYS}")
|
||||
|
@ -36,6 +36,10 @@
|
||||
|
||||
#include <string>
|
||||
|
||||
#if defined(__APPLE__) // always first include for jack weaklinking !
|
||||
#include <weakjack.h>
|
||||
#endif
|
||||
|
||||
#include <jack.h>
|
||||
#include <ringbuffer.h>
|
||||
|
||||
|
@ -257,7 +257,7 @@ SessionParams BlenderSync::get_session_params(BL::Scene b_scene, bool background
|
||||
PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
|
||||
|
||||
/* feature set */
|
||||
bool experimental = (RNA_enum_get(&cscene, "feature_set") != 0);
|
||||
params.experimental = (RNA_enum_get(&cscene, "feature_set") != 0);
|
||||
|
||||
/* device type */
|
||||
params.device_type = DEVICE_CPU;
|
||||
@ -266,14 +266,14 @@ SessionParams BlenderSync::get_session_params(BL::Scene b_scene, bool background
|
||||
vector<DeviceType> types = Device::available_types();
|
||||
DeviceType dtype;
|
||||
|
||||
if(!experimental || RNA_enum_get(&cscene, "gpu_type") == 0)
|
||||
if(!params.experimental || RNA_enum_get(&cscene, "gpu_type") == 0)
|
||||
dtype = DEVICE_CUDA;
|
||||
else
|
||||
dtype = DEVICE_OPENCL;
|
||||
|
||||
if(device_type_available(types, dtype))
|
||||
params.device_type = dtype;
|
||||
else if(experimental && device_type_available(types, DEVICE_OPENCL))
|
||||
else if(params.experimental && device_type_available(types, DEVICE_OPENCL))
|
||||
params.device_type = DEVICE_OPENCL;
|
||||
else if(device_type_available(types, DEVICE_CUDA))
|
||||
params.device_type = DEVICE_CUDA;
|
||||
|
@ -112,7 +112,7 @@ public:
|
||||
virtual void *osl_memory() { return NULL; }
|
||||
|
||||
/* load/compile kernels, must be called before adding tasks */
|
||||
virtual bool load_kernels() { return true; }
|
||||
virtual bool load_kernels(bool experimental) { return true; }
|
||||
|
||||
/* tasks */
|
||||
virtual void task_add(DeviceTask& task) = 0;
|
||||
|
@ -214,6 +214,21 @@ public:
|
||||
return string("CUDA ") + deviceName;
|
||||
}
|
||||
|
||||
bool support_device(bool experimental)
|
||||
{
|
||||
if(!experimental) {
|
||||
int major, minor;
|
||||
cuDeviceComputeCapability(&major, &minor, cuDevId);
|
||||
|
||||
if(major <= 1 && minor <= 2) {
|
||||
cuda_error(string_printf("CUDA device supported only with shader model 1.3 or up, found %d.%d.", major, minor));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
string compile_kernel()
|
||||
{
|
||||
/* compute cubin name */
|
||||
@ -236,11 +251,11 @@ public:
|
||||
if(path_exists(cubin))
|
||||
return cubin;
|
||||
|
||||
#ifdef WITH_CUDA_BINARIES
|
||||
#if defined(WITH_CUDA_BINARIES) && defined(_WIN32)
|
||||
if(major <= 1 && minor <= 2)
|
||||
cuda_error(string_printf("CUDA device supported only with shader model 1.3 or up, found %d.%d.", major, minor));
|
||||
else
|
||||
cuda_error("CUDA binary kernel for this graphics card not found.");
|
||||
cuda_error(string_printf("CUDA binary kernel for this graphics card shader model (%d.%d) not found.", major, minor));
|
||||
return "";
|
||||
#else
|
||||
/* if not, find CUDA compiler */
|
||||
@ -283,12 +298,15 @@ public:
|
||||
#endif
|
||||
}
|
||||
|
||||
bool load_kernels()
|
||||
bool load_kernels(bool experimental)
|
||||
{
|
||||
/* check if cuda init succeeded */
|
||||
if(cuContext == 0)
|
||||
return false;
|
||||
|
||||
if(!support_device(experimental))
|
||||
return false;
|
||||
|
||||
/* get kernel */
|
||||
string cubin = compile_kernel();
|
||||
|
||||
|
@ -132,10 +132,10 @@ public:
|
||||
return desc.str();
|
||||
}
|
||||
|
||||
bool load_kernels()
|
||||
bool load_kernels(bool experimental)
|
||||
{
|
||||
foreach(SubDevice& sub, devices)
|
||||
if(!sub.device->load_kernels())
|
||||
if(!sub.device->load_kernels(experimental))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
|
@ -365,7 +365,7 @@ public:
|
||||
return md5.get_hex();
|
||||
}
|
||||
|
||||
bool load_kernels()
|
||||
bool load_kernels(bool experimental)
|
||||
{
|
||||
/* verify if device was initialized */
|
||||
if(!device_initialized) {
|
||||
|
@ -410,7 +410,7 @@ void Session::run()
|
||||
/* load kernels */
|
||||
progress.set_status("Loading render kernels (may take a few minutes the first time)");
|
||||
|
||||
if(!device->load_kernels()) {
|
||||
if(!device->load_kernels(params.experimental)) {
|
||||
string message = device->error_message();
|
||||
if(message == "")
|
||||
message = "Failed loading render kernel, see console for errors";
|
||||
|
@ -43,6 +43,7 @@ public:
|
||||
string output_path;
|
||||
|
||||
bool progressive;
|
||||
bool experimental;
|
||||
int samples;
|
||||
int tile_size;
|
||||
int min_size;
|
||||
@ -59,6 +60,7 @@ public:
|
||||
output_path = "";
|
||||
|
||||
progressive = false;
|
||||
experimental = false;
|
||||
samples = INT_MAX;
|
||||
tile_size = 64;
|
||||
min_size = 64;
|
||||
@ -75,6 +77,7 @@ public:
|
||||
&& output_path == params.output_path
|
||||
/* && samples == params.samples */
|
||||
&& progressive == params.progressive
|
||||
&& experimental == params.experimental
|
||||
&& tile_size == params.tile_size
|
||||
&& min_size == params.min_size
|
||||
&& threads == params.threads
|
||||
|
@ -41,8 +41,9 @@ __device_inline float3 transform(const Transform *t, const float3 a)
|
||||
{
|
||||
float4 b = make_float4(a.x, a.y, a.z, 1.0f);
|
||||
float3 c = make_float3(dot(t->x, b), dot(t->y, b), dot(t->z, b));
|
||||
float w = dot(t->w, b);
|
||||
|
||||
return c/dot(t->w, b);
|
||||
return (w != 0.0f)? c/w: make_float3(0.0f, 0.0f, 0.0f);
|
||||
}
|
||||
|
||||
__device_inline float3 transform_direction(const Transform *t, const float3 a)
|
||||
|
@ -54,7 +54,7 @@ def abspath(path, start=None, library=None):
|
||||
"""
|
||||
if path.startswith("//"):
|
||||
if library:
|
||||
start = abspath(_os.path.dirname(library.filepath))
|
||||
start = _os.path.dirname(abspath(library.filepath))
|
||||
return _os.path.join(_os.path.dirname(_bpy.data.filepath)
|
||||
if start is None else start,
|
||||
path[2:],
|
||||
|
@ -65,19 +65,45 @@ def load_image(imagepath,
|
||||
|
||||
# TODO: recursive
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Utility Functions
|
||||
|
||||
def _image_load_placeholder(path):
|
||||
name = bpy.path.basename(path)
|
||||
if type(name) == bytes:
|
||||
name = name.decode('utf-8', "replace")
|
||||
image = bpy.data.images.new(name, 128, 128)
|
||||
# allow the path to be resolved later
|
||||
image.filepath = path
|
||||
image.source = 'FILE'
|
||||
return image
|
||||
|
||||
def _image_load(path):
|
||||
import bpy
|
||||
|
||||
if convert_callback:
|
||||
path = convert_callback(path)
|
||||
|
||||
image = bpy.data.images.load(path)
|
||||
try:
|
||||
image = bpy.data.images.load(path)
|
||||
except RuntimeError:
|
||||
image = None
|
||||
|
||||
if verbose:
|
||||
print(" image loaded '%s'" % path)
|
||||
if image:
|
||||
print(" image loaded '%s'" % path)
|
||||
else:
|
||||
print(" image load failed '%s'" % path)
|
||||
|
||||
# image path has been checked so the path could not be read for some
|
||||
# reason, so be sure to return a placeholder
|
||||
if place_holder:
|
||||
image = _image_load_placeholder(path)
|
||||
|
||||
return image
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
|
||||
if verbose:
|
||||
print("load_image('%s', '%s', ...)" % (imagepath, dirname))
|
||||
|
||||
@ -103,11 +129,9 @@ def load_image(imagepath,
|
||||
if os.path.exists(nfilepath):
|
||||
return _image_load(nfilepath)
|
||||
|
||||
# None of the paths exist so return placeholder
|
||||
if place_holder:
|
||||
image = bpy.data.images.new(bpy.path.basename(imagepath), 128, 128)
|
||||
# allow the path to be resolved later
|
||||
image.filepath = imagepath
|
||||
return image
|
||||
return _image_load_placeholder(imagepath)
|
||||
|
||||
# TODO comprehensiveImageLoad also searched in bpy.config.textureDir
|
||||
return None
|
||||
|
@ -38,7 +38,7 @@ class ANIM_OT_keying_set_export(Operator):
|
||||
bl_label = "Export Keying Set..."
|
||||
|
||||
filepath = StringProperty(
|
||||
name="File Path",
|
||||
subtype='FILE_PATH',
|
||||
)
|
||||
filter_folder = BoolProperty(
|
||||
name="Filter folders",
|
||||
|
@ -413,7 +413,12 @@ class CLIP_OT_setup_tracking_scene(Operator):
|
||||
|
||||
@staticmethod
|
||||
def _setupCamera(context):
|
||||
sc = context.space_data
|
||||
clip = sc.clip
|
||||
tracking = clip.tracking
|
||||
|
||||
camob = CLIP_OT_setup_tracking_scene._findOrCreateCamera(context)
|
||||
cam = camob.data
|
||||
|
||||
# Remove all constraints to be sure motion is fine
|
||||
camob.constraints.clear()
|
||||
@ -423,6 +428,9 @@ class CLIP_OT_setup_tracking_scene(Operator):
|
||||
con.use_active_clip = True
|
||||
con.influence = 1.0
|
||||
|
||||
cam.sensor_width = tracking.camera.sensor_width
|
||||
cam.lens = tracking.camera.focal_length
|
||||
|
||||
@staticmethod
|
||||
def _setupViewport(context):
|
||||
sc = context.space_data
|
||||
|
@ -30,9 +30,7 @@ class EditExternally(Operator):
|
||||
bl_options = {'REGISTER'}
|
||||
|
||||
filepath = StringProperty(
|
||||
name="File Path",
|
||||
description="Path to an image file",
|
||||
maxlen=1024,
|
||||
subtype='FILE_PATH',
|
||||
)
|
||||
|
||||
def _editor_guess(self, context):
|
||||
|
@ -22,6 +22,7 @@ import bpy
|
||||
from bpy.types import Operator
|
||||
from mathutils import Vector
|
||||
|
||||
|
||||
def randomize_selected(seed, delta, loc, rot, scale, scale_even, scale_min):
|
||||
|
||||
import random
|
||||
@ -46,7 +47,7 @@ def randomize_selected(seed, delta, loc, rot, scale, scale_even, scale_min):
|
||||
vec = rand_vec(rot)
|
||||
|
||||
rotation_mode = obj.rotation_mode
|
||||
if rotation_mode in ('QUATERNION', 'AXIS_ANGLE'):
|
||||
if rotation_mode in {'QUATERNION', 'AXIS_ANGLE'}:
|
||||
obj.rotation_mode = 'XYZ'
|
||||
|
||||
if delta:
|
||||
|
@ -457,8 +457,8 @@ class WM_OT_context_cycle_enum(Operator):
|
||||
|
||||
|
||||
class WM_OT_context_cycle_array(Operator):
|
||||
'''Set a context array value.
|
||||
Useful for cycling the active mesh edit mode'''
|
||||
'''Set a context array value. '''
|
||||
'''Useful for cycling the active mesh edit mode'''
|
||||
bl_idname = "wm.context_cycle_array"
|
||||
bl_label = "Context Array Cycle"
|
||||
bl_options = {'UNDO', 'INTERNAL'}
|
||||
@ -748,8 +748,6 @@ class WM_OT_path_open(Operator):
|
||||
bl_label = ""
|
||||
|
||||
filepath = StringProperty(
|
||||
name="File Path",
|
||||
maxlen=1024,
|
||||
subtype='FILE_PATH',
|
||||
)
|
||||
|
||||
@ -1085,8 +1083,7 @@ class WM_OT_keyconfig_activate(Operator):
|
||||
bl_label = "Activate Keyconfig"
|
||||
|
||||
filepath = StringProperty(
|
||||
name="File Path",
|
||||
maxlen=1024,
|
||||
subtype='FILE_PATH',
|
||||
)
|
||||
|
||||
def execute(self, context):
|
||||
@ -1116,8 +1113,7 @@ class WM_OT_appconfig_activate(Operator):
|
||||
bl_label = "Activate Application Configuration"
|
||||
|
||||
filepath = StringProperty(
|
||||
name="File Path",
|
||||
maxlen=1024,
|
||||
subtype='FILE_PATH',
|
||||
)
|
||||
|
||||
def execute(self, context):
|
||||
@ -1203,8 +1199,7 @@ class WM_OT_keyconfig_import(Operator):
|
||||
bl_label = "Import Key Configuration..."
|
||||
|
||||
filepath = StringProperty(
|
||||
name="File Path",
|
||||
description="Filepath to write file to",
|
||||
subtype='FILE_PATH',
|
||||
default="keymap.py",
|
||||
)
|
||||
filter_folder = BoolProperty(
|
||||
@ -1270,8 +1265,7 @@ class WM_OT_keyconfig_export(Operator):
|
||||
bl_label = "Export Key Configuration..."
|
||||
|
||||
filepath = StringProperty(
|
||||
name="File Path",
|
||||
description="Filepath to write file to",
|
||||
subtype='FILE_PATH',
|
||||
default="keymap.py",
|
||||
)
|
||||
filter_folder = BoolProperty(
|
||||
@ -1513,8 +1507,7 @@ class WM_OT_addon_install(Operator):
|
||||
)
|
||||
|
||||
filepath = StringProperty(
|
||||
name="File Path",
|
||||
description="File path to write file to",
|
||||
subtype='FILE_PATH',
|
||||
)
|
||||
filter_folder = BoolProperty(
|
||||
name="Filter folders",
|
||||
|
@ -546,6 +546,11 @@ class VIEW3D_PT_tools_brush(PaintPanel, Panel):
|
||||
row.prop(brush, "strength", text="Strength", slider=True)
|
||||
row.prop(brush, "use_pressure_strength", text="")
|
||||
|
||||
if tool == 'ROTATE':
|
||||
row = col.row(align=True)
|
||||
row.prop(brush, "strength", text="Strength", slider=True)
|
||||
row.prop(brush, "use_pressure_strength", text="")
|
||||
|
||||
if tool != 'SMOOTH':
|
||||
col.separator()
|
||||
|
||||
|
@ -94,6 +94,7 @@ struct DerivedMesh {
|
||||
BVHCache bvhCache;
|
||||
struct GPUDrawObject *drawObject;
|
||||
DerivedMeshType type;
|
||||
float auto_bump_scale;
|
||||
|
||||
/* Misc. Queries */
|
||||
|
||||
@ -578,6 +579,7 @@ void DM_vertex_attributes_from_gpu(DerivedMesh *dm,
|
||||
struct GPUVertexAttribs *gattribs, DMVertexAttribs *attribs);
|
||||
|
||||
void DM_add_tangent_layer(DerivedMesh *dm);
|
||||
void DM_calc_auto_bump_scale(DerivedMesh *dm);
|
||||
|
||||
/* Set object's bounding box based on DerivedMesh min/max data */
|
||||
void DM_set_object_boundbox(struct Object *ob, DerivedMesh *dm);
|
||||
|
@ -42,7 +42,7 @@ extern "C" {
|
||||
* and keep comment above the defines.
|
||||
* Use STRINGIFY() rather than defining with quotes */
|
||||
#define BLENDER_VERSION 260
|
||||
#define BLENDER_SUBVERSION 7
|
||||
#define BLENDER_SUBVERSION 8
|
||||
|
||||
#define BLENDER_MINVERSION 250
|
||||
#define BLENDER_MINSUBVERSION 0
|
||||
|
@ -184,6 +184,7 @@ void DM_init(DerivedMesh *dm, DerivedMeshType type,
|
||||
DM_init_funcs(dm);
|
||||
|
||||
dm->needsFree = 1;
|
||||
dm->auto_bump_scale = -1.0f;
|
||||
}
|
||||
|
||||
void DM_from_template(DerivedMesh *dm, DerivedMesh *source, DerivedMeshType type,
|
||||
@ -1831,6 +1832,159 @@ void DM_add_tangent_layer(DerivedMesh *dm)
|
||||
MEM_freeN(vtangents);
|
||||
}
|
||||
|
||||
void DM_calc_auto_bump_scale(DerivedMesh *dm)
|
||||
{
|
||||
/* int totvert= dm->getNumVerts(dm); */ /* UNUSED */
|
||||
int totface= dm->getNumFaces(dm);
|
||||
|
||||
MVert * mvert = dm->getVertArray(dm);
|
||||
MFace * mface = dm->getFaceArray(dm);
|
||||
MTFace * mtface = dm->getFaceDataArray(dm, CD_MTFACE);
|
||||
|
||||
if(mtface)
|
||||
{
|
||||
double dsum = 0.0;
|
||||
int nr_accumulated = 0;
|
||||
int f;
|
||||
|
||||
for ( f=0; f<totface; f++ )
|
||||
{
|
||||
{
|
||||
float * verts[4], * tex_coords[4];
|
||||
const int nr_verts = mface[f].v4!=0 ? 4 : 3;
|
||||
int i, is_degenerate;
|
||||
|
||||
verts[0]=mvert[mface[f].v1].co; verts[1]=mvert[mface[f].v2].co; verts[2]=mvert[mface[f].v3].co;
|
||||
tex_coords[0]=mtface[f].uv[0]; tex_coords[1]=mtface[f].uv[1]; tex_coords[2]=mtface[f].uv[2];
|
||||
if(nr_verts==4)
|
||||
{
|
||||
verts[3]=mvert[mface[f].v4].co;
|
||||
tex_coords[3]=mtface[f].uv[3];
|
||||
}
|
||||
|
||||
// discard degenerate faces
|
||||
is_degenerate = 0;
|
||||
if( equals_v3v3(verts[0], verts[1]) || equals_v3v3(verts[0], verts[2]) || equals_v3v3(verts[1], verts[2]) ||
|
||||
equals_v2v2(tex_coords[0], tex_coords[1]) || equals_v2v2(tex_coords[0], tex_coords[2]) || equals_v2v2(tex_coords[1], tex_coords[2]) )
|
||||
{
|
||||
is_degenerate = 1;
|
||||
}
|
||||
|
||||
// verify last vertex as well if this is a quad
|
||||
if ( is_degenerate==0 && nr_verts==4 )
|
||||
{
|
||||
if( equals_v3v3(verts[3], verts[0]) || equals_v3v3(verts[3], verts[1]) || equals_v3v3(verts[3], verts[2]) ||
|
||||
equals_v2v2(tex_coords[3], tex_coords[0]) || equals_v2v2(tex_coords[3], tex_coords[1]) || equals_v2v2(tex_coords[3], tex_coords[2]) )
|
||||
{
|
||||
is_degenerate = 1;
|
||||
}
|
||||
|
||||
// verify the winding is consistent
|
||||
if ( is_degenerate==0 )
|
||||
{
|
||||
float prev_edge[2];
|
||||
int is_signed = 0;
|
||||
sub_v2_v2v2(prev_edge, tex_coords[0], tex_coords[3]);
|
||||
|
||||
i = 0;
|
||||
while ( is_degenerate==0 && i<4 )
|
||||
{
|
||||
float cur_edge[2], signed_area;
|
||||
sub_v2_v2v2(cur_edge, tex_coords[(i+1)&0x3], tex_coords[i]);
|
||||
signed_area = prev_edge[0]*cur_edge[1] - prev_edge[1]*cur_edge[0];
|
||||
if ( i==0 ) is_signed = signed_area<0.0f ? 1 : 0;
|
||||
else if((is_signed!=0)!=(signed_area<0.0f)) is_degenerate=1;
|
||||
|
||||
if ( is_degenerate==0 )
|
||||
{
|
||||
copy_v2_v2(prev_edge, cur_edge);
|
||||
++i;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// proceed if not a degenerate face
|
||||
if ( is_degenerate==0 )
|
||||
{
|
||||
int nr_tris_to_pile=0;
|
||||
// quads split at shortest diagonal
|
||||
int offs = 0; // initial triangulation is 0,1,2 and 0, 2, 3
|
||||
if ( nr_verts==4 )
|
||||
{
|
||||
float pos_len_diag0, pos_len_diag1;
|
||||
float vtmp[3];
|
||||
sub_v3_v3v3(vtmp, verts[2], verts[0]);
|
||||
pos_len_diag0 = dot_v3v3(vtmp, vtmp);
|
||||
sub_v3_v3v3(vtmp, verts[3], verts[1]);
|
||||
pos_len_diag1 = dot_v3v3(vtmp, vtmp);
|
||||
|
||||
if(pos_len_diag1<pos_len_diag0)
|
||||
offs=1; // alter split
|
||||
else if(pos_len_diag0==pos_len_diag1) // do UV check instead
|
||||
{
|
||||
float tex_len_diag0, tex_len_diag1;
|
||||
|
||||
sub_v2_v2v2(vtmp, tex_coords[2], tex_coords[0]);
|
||||
tex_len_diag0 = dot_v2v2(vtmp, vtmp);
|
||||
sub_v2_v2v2(vtmp, tex_coords[3], tex_coords[1]);
|
||||
tex_len_diag1 = dot_v2v2(vtmp, vtmp);
|
||||
|
||||
if(tex_len_diag1<tex_len_diag0)
|
||||
{
|
||||
offs=1; // alter split
|
||||
}
|
||||
}
|
||||
}
|
||||
nr_tris_to_pile = nr_verts-2 ;
|
||||
if ( nr_tris_to_pile==1 || nr_tris_to_pile==2 )
|
||||
{
|
||||
const int indices[] = {offs+0, offs+1, offs+2, offs+0, offs+2, (offs+3)&0x3 };
|
||||
int t;
|
||||
for ( t=0; t<nr_tris_to_pile; t++ )
|
||||
{
|
||||
float f2x_area_uv;
|
||||
float * p0 = verts[indices[t*3+0]];
|
||||
float * p1 = verts[indices[t*3+1]];
|
||||
float * p2 = verts[indices[t*3+2]];
|
||||
|
||||
float edge_t0[2], edge_t1[2];
|
||||
sub_v2_v2v2(edge_t0, tex_coords[indices[t*3+1]], tex_coords[indices[t*3+0]]);
|
||||
sub_v2_v2v2(edge_t1, tex_coords[indices[t*3+2]], tex_coords[indices[t*3+0]]);
|
||||
|
||||
f2x_area_uv = fabsf(edge_t0[0]*edge_t1[1] - edge_t0[1]*edge_t1[0]);
|
||||
if ( f2x_area_uv>FLT_EPSILON )
|
||||
{
|
||||
float norm[3], v0[3], v1[3], f2x_surf_area, fsurf_ratio;
|
||||
sub_v3_v3v3(v0, p1, p0);
|
||||
sub_v3_v3v3(v1, p2, p0);
|
||||
cross_v3_v3v3(norm, v0, v1);
|
||||
|
||||
f2x_surf_area = len_v3(norm);
|
||||
fsurf_ratio = f2x_surf_area/f2x_area_uv; // tri area divided by texture area
|
||||
|
||||
++nr_accumulated;
|
||||
dsum += (double)(fsurf_ratio);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// finalize
|
||||
{
|
||||
const float avg_area_ratio = (nr_accumulated>0) ? ((float)(dsum / nr_accumulated)) : 1.0f;
|
||||
const float use_as_render_bump_scale = sqrtf(avg_area_ratio); // use width of average surface ratio as your bump scale
|
||||
dm->auto_bump_scale = use_as_render_bump_scale;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
dm->auto_bump_scale = 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
void DM_vertex_attributes_from_gpu(DerivedMesh *dm, GPUVertexAttribs *gattribs, DMVertexAttribs *attribs)
|
||||
{
|
||||
CustomData *vdata, *fdata, *tfdata = NULL;
|
||||
@ -1851,6 +2005,15 @@ void DM_vertex_attributes_from_gpu(DerivedMesh *dm, GPUVertexAttribs *gattribs,
|
||||
else
|
||||
tfdata = fdata;
|
||||
|
||||
/* calc auto bump scale if necessary */
|
||||
#if 0
|
||||
if(dm->auto_bump_scale<=0.0f)
|
||||
DM_calc_auto_bump_scale(dm);
|
||||
#else
|
||||
dm->auto_bump_scale = 1.0f; // will revert this after release
|
||||
#endif
|
||||
|
||||
|
||||
/* add a tangent layer if necessary */
|
||||
for(b = 0; b < gattribs->totlayer; b++)
|
||||
if(gattribs->layer[b].type == CD_TANGENT)
|
||||
|
@ -384,6 +384,7 @@ void brush_reset_sculpt(Brush *br)
|
||||
br->sub_col[1] = 1.000000;
|
||||
break;
|
||||
case SCULPT_TOOL_ROTATE:
|
||||
br->alpha = 1.0;
|
||||
break;
|
||||
case SCULPT_TOOL_SMOOTH:
|
||||
br->flag &= ~BRUSH_SPACE_ATTEN;
|
||||
|
@ -273,7 +273,7 @@ static void emDM_drawMappedFaces(
|
||||
{
|
||||
EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
|
||||
EditFace *efa;
|
||||
int i, draw;
|
||||
int i, draw, flush;
|
||||
const int skip_normals= !glIsEnabled(GL_LIGHTING); /* could be passed as an arg */
|
||||
|
||||
/* GL_ZERO is used to detect if drawing has started or not */
|
||||
@ -352,7 +352,11 @@ static void emDM_drawMappedFaces(
|
||||
}
|
||||
}
|
||||
|
||||
if (draw==2) {
|
||||
flush= (draw==2);
|
||||
if (!skip_normals && !flush && efa->next)
|
||||
flush|= efa->mat_nr != efa->next->mat_nr;
|
||||
|
||||
if (flush) {
|
||||
glEnd();
|
||||
poly_prev= GL_ZERO; /* force glBegin */
|
||||
|
||||
@ -419,8 +423,11 @@ static void emDM_drawMappedFaces(
|
||||
}
|
||||
}
|
||||
|
||||
flush= (draw==2);
|
||||
if (!skip_normals && !flush && efa->next)
|
||||
flush|= efa->mat_nr != efa->next->mat_nr;
|
||||
|
||||
if (draw==2) {
|
||||
if (flush) {
|
||||
glEnd();
|
||||
poly_prev= GL_ZERO; /* force glBegin */
|
||||
|
||||
|
@ -325,8 +325,8 @@ int BKE_mesh_validate_arrays( Mesh *me,
|
||||
if (dverts) {
|
||||
MDeformVert *dv;
|
||||
for(i=0, dv= dverts; i<totvert; i++, dv++) {
|
||||
MDeformWeight *dw= dv->dw;
|
||||
unsigned int j= 0;
|
||||
MDeformWeight *dw;
|
||||
unsigned int j;
|
||||
|
||||
for(j=0, dw= dv->dw; j < dv->totweight; j++, dw++) {
|
||||
/* note, greater then max defgroups is accounted for in our code, but not < 0 */
|
||||
@ -337,6 +337,13 @@ int BKE_mesh_validate_arrays( Mesh *me,
|
||||
vert_weights_fixed= TRUE;
|
||||
}
|
||||
}
|
||||
else if (dw->weight < 0.0f || dw->weight > 1.0f) {
|
||||
PRINT(" vertex deform %u, group %d has weight: %f\n", i, dw->def_nr, dw->weight);
|
||||
if (do_fixes) {
|
||||
CLAMP(dw->weight, 0.0f, 1.0f);
|
||||
vert_weights_fixed= TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (dw->def_nr < 0) {
|
||||
PRINT(" vertex deform %u, has invalid group %d\n", i, dw->def_nr);
|
||||
|
@ -48,6 +48,7 @@
|
||||
#include "BLI_ghash.h"
|
||||
#include "BLI_path_util.h"
|
||||
#include "BLI_string.h"
|
||||
#include "BLI_threads.h"
|
||||
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_tracking.h"
|
||||
@ -881,6 +882,8 @@ MovieTrackingContext *BKE_tracking_context_new(MovieClip *clip, MovieClipUser *u
|
||||
context->clip= clip;
|
||||
context->user= *user;
|
||||
|
||||
BLI_begin_threaded_malloc();
|
||||
|
||||
return context;
|
||||
}
|
||||
|
||||
@ -907,6 +910,8 @@ static void track_context_free(void *customdata)
|
||||
|
||||
void BKE_tracking_context_free(MovieTrackingContext *context)
|
||||
{
|
||||
BLI_end_threaded_malloc();
|
||||
|
||||
tracks_map_free(context->tracks_map, track_context_free);
|
||||
|
||||
MEM_freeN(context);
|
||||
|
@ -56,6 +56,7 @@ int BLI_create_symlink(const char *path, const char *to);
|
||||
struct direntry;
|
||||
|
||||
int BLI_is_dir(const char *path);
|
||||
int BLI_is_file(const char *path);
|
||||
void BLI_dir_create_recursive(const char *dir);
|
||||
double BLI_dir_free_space(const char *dir);
|
||||
char *BLI_current_working_dir(char *dir, const int maxlen);
|
||||
|
@ -471,6 +471,12 @@ int BLI_is_dir(const char *file)
|
||||
return S_ISDIR(BLI_exists(file));
|
||||
}
|
||||
|
||||
int BLI_is_file(const char *path)
|
||||
{
|
||||
int mode= BLI_exists(path);
|
||||
return (mode && !S_ISDIR(mode));
|
||||
}
|
||||
|
||||
LinkNode *BLI_file_read_as_lines(const char *name)
|
||||
{
|
||||
FILE *fp= fopen(name, "r");
|
||||
|
@ -12676,6 +12676,16 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
|
||||
}
|
||||
}
|
||||
|
||||
if (main->versionfile < 260 || (main->versionfile == 260 && main->subversionfile < 8))
|
||||
{
|
||||
Brush *brush;
|
||||
|
||||
for (brush= main->brush.first; brush; brush= brush->id.next) {
|
||||
if (brush->sculpt_tool == SCULPT_TOOL_ROTATE)
|
||||
brush->alpha= 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
/* put compatibility code here until next subversion bump */
|
||||
{
|
||||
MovieClip *clip;
|
||||
|
@ -798,7 +798,7 @@ void ANIM_keying_sets_menu_setup (bContext *C, const char title[], const char op
|
||||
for (ks= builtin_keyingsets.first; ks; ks=ks->next, i--) {
|
||||
/* only show KeyingSet if context is suitable */
|
||||
if (ANIM_keyingset_context_ok_poll(C, ks))
|
||||
uiItemEnumO_value(layout, ks->name, ICON_NONE, op_name, "type", i);
|
||||
uiItemIntO(layout, ks->name, ICON_NONE, op_name, "type", i);
|
||||
}
|
||||
|
||||
uiPupMenuEnd(C, pup);
|
||||
|
@ -5492,6 +5492,11 @@ wmOperator *uiContextActiveOperator(const struct bContext *C)
|
||||
ARegion *ar_ctx= CTX_wm_region(C);
|
||||
uiBlock *block;
|
||||
|
||||
/* background mode */
|
||||
if (ar_ctx == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* scan active regions ui */
|
||||
for(block=ar_ctx->uiblocks.first; block; block=block->next) {
|
||||
if (block->ui_operator) {
|
||||
|
@ -459,10 +459,15 @@ static int reports_to_text_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
*/
|
||||
str = BKE_reports_string(reports, (G.f & G_DEBUG)? RPT_DEBUG : RPT_INFO);
|
||||
|
||||
write_text(txt, str);
|
||||
MEM_freeN(str);
|
||||
if (str) {
|
||||
write_text(txt, str);
|
||||
MEM_freeN(str);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
else {
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
}
|
||||
|
||||
static void UI_OT_reports_to_textblock(wmOperatorType *ot)
|
||||
|
@ -2481,22 +2481,14 @@ void uiPupMenuOkee(bContext *C, const char *opname, const char *str, ...)
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
/* note, only call this is the file exists,
|
||||
* the case where the file does not exist so can be saved without a
|
||||
* popup must be checked for already, since saving from here
|
||||
* will free the operator which will break invoke().
|
||||
* The operator state for this is implicitly OPERATOR_RUNNING_MODAL */
|
||||
void uiPupMenuSaveOver(bContext *C, wmOperator *op, const char *filename)
|
||||
{
|
||||
size_t len= strlen(filename);
|
||||
|
||||
if(len==0)
|
||||
return;
|
||||
|
||||
if(filename[len-1]=='/' || filename[len-1]=='\\') {
|
||||
uiPupMenuError(C, "Cannot overwrite a directory");
|
||||
WM_operator_free(op);
|
||||
return;
|
||||
}
|
||||
if(BLI_exists(filename)==0)
|
||||
operator_cb(C, op, 1);
|
||||
else
|
||||
confirm_operator(C, op, "Save Over", filename);
|
||||
confirm_operator(C, op, "Save Over", filename);
|
||||
}
|
||||
|
||||
void uiPupMenuNotice(bContext *C, const char *str, ...)
|
||||
|
@ -873,12 +873,10 @@ static int similar_face_select_exec(bContext *C, wmOperator *op)
|
||||
/* here was an edge-mode only select flush case, has to be generalized */
|
||||
EM_selectmode_flush(em);
|
||||
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
|
||||
BKE_mesh_end_editmesh(me, em);
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
BKE_mesh_end_editmesh(me, em);
|
||||
return OPERATOR_CANCELLED;
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
/* ***************************************************** */
|
||||
@ -1092,12 +1090,10 @@ static int similar_edge_select_exec(bContext *C, wmOperator *op)
|
||||
/* here was an edge-mode only select flush case, has to be generalized */
|
||||
EM_selectmode_flush(em);
|
||||
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
|
||||
BKE_mesh_end_editmesh(me, em);
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
BKE_mesh_end_editmesh(me, em);
|
||||
return OPERATOR_CANCELLED;
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
/* ********************************* */
|
||||
@ -1135,7 +1131,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
|
||||
|
||||
if (!ok || !deselcount) { /* no data selected OR no more data to select*/
|
||||
BKE_mesh_end_editmesh(me, em);
|
||||
return 0;
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
if(mode == SIMVERT_FACE) {
|
||||
@ -1166,7 +1162,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
|
||||
deselcount--;
|
||||
if (!deselcount) {/*have we selected all posible faces?, if so return*/
|
||||
BKE_mesh_end_editmesh(me, em);
|
||||
return selcount;
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1184,7 +1180,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
|
||||
deselcount--;
|
||||
if (!deselcount) {/*have we selected all posible faces?, if so return*/
|
||||
BKE_mesh_end_editmesh(me, em);
|
||||
return selcount;
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1198,7 +1194,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
|
||||
|
||||
if (!base_dvert || base_dvert->totweight == 0) {
|
||||
BKE_mesh_end_editmesh(me, em);
|
||||
return selcount;
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
for(eve= em->verts.first; eve; eve= eve->next) {
|
||||
@ -1216,7 +1212,7 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
|
||||
deselcount--;
|
||||
if (!deselcount) { /*have we selected all posible faces?, if so return*/
|
||||
BKE_mesh_end_editmesh(me, em);
|
||||
return selcount;
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -1230,12 +1226,10 @@ static int similar_vert_select_exec(bContext *C, wmOperator *op)
|
||||
|
||||
if(selcount) {
|
||||
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
|
||||
BKE_mesh_end_editmesh(me, em);
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
BKE_mesh_end_editmesh(me, em);
|
||||
return OPERATOR_CANCELLED;
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
static int select_similar_exec(bContext *C, wmOperator *op)
|
||||
|
@ -7510,10 +7510,11 @@ static int select_axis_exec(bContext *C, wmOperator *op)
|
||||
EditSelection *ese = em->selected.last;
|
||||
|
||||
|
||||
if(ese==NULL)
|
||||
if (ese==NULL || ese->type != EDITVERT) {
|
||||
BKE_report(op->reports, RPT_WARNING, "This operator requires an active vertex (last selected)");
|
||||
return OPERATOR_CANCELLED;
|
||||
|
||||
if(ese->type==EDITVERT) {
|
||||
}
|
||||
else {
|
||||
EditVert *ev;
|
||||
EditVert *act_vert= (EditVert*)ese->data;
|
||||
float value= act_vert->co[axis];
|
||||
|
@ -893,7 +893,7 @@ static int object_delete_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Main *bmain= CTX_data_main(C);
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
const short use_global= RNA_boolean_get(op->ptr, "global");
|
||||
const short use_global= RNA_boolean_get(op->ptr, "use_global");
|
||||
/* int islamp= 0; */ /* UNUSED */
|
||||
|
||||
if(CTX_data_edit_object(C))
|
||||
@ -951,7 +951,7 @@ void OBJECT_OT_delete(wmOperatorType *ot)
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
|
||||
RNA_def_boolean(ot->srna, "global", 0, "Delete Globally", "Remove object from all scenes");
|
||||
RNA_def_boolean(ot->srna, "use_global", 0, "Delete Globally", "Remove object from all scenes");
|
||||
}
|
||||
|
||||
/**************************** Copy Utilities ******************************/
|
||||
|
@ -608,7 +608,9 @@ void OBJECT_OT_hook_remove(wmOperatorType *ot)
|
||||
ot->poll= hook_op_edit_poll;
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
/* this operator removes modifier which isn't stored in local undo stack,
|
||||
so redoing it from redo panel gives totally weird results */
|
||||
ot->flag= /*OPTYPE_REGISTER|*/OPTYPE_UNDO;
|
||||
|
||||
/* properties */
|
||||
prop= RNA_def_enum(ot->srna, "modifier", DummyRNA_NULL_items, 0, "Modifier", "Modifier number to remove");
|
||||
@ -794,7 +796,9 @@ void OBJECT_OT_hook_assign(wmOperatorType *ot)
|
||||
ot->poll= hook_op_edit_poll;
|
||||
|
||||
/* flags */
|
||||
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
|
||||
/* this operator changes data stored in modifier which doesn't get pushed to undo stack,
|
||||
so redoing it from redo panel gives totally weird results */
|
||||
ot->flag= /*OPTYPE_REGISTER|*/OPTYPE_UNDO;
|
||||
|
||||
/* properties */
|
||||
prop= RNA_def_enum(ot->srna, "modifier", DummyRNA_NULL_items, 0, "Modifier", "Modifier number to assign to");
|
||||
|
@ -338,9 +338,9 @@ void ED_keymap_object(wmKeyConfig *keyconf)
|
||||
WM_keymap_add_item(keymap, "OBJECT_OT_move_to_layer", MKEY, KM_PRESS, 0, 0);
|
||||
|
||||
WM_keymap_add_item(keymap, "OBJECT_OT_delete", XKEY, KM_PRESS, 0, 0);
|
||||
RNA_boolean_set(WM_keymap_add_item(keymap, "OBJECT_OT_delete", XKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "global", TRUE);
|
||||
RNA_boolean_set(WM_keymap_add_item(keymap, "OBJECT_OT_delete", XKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "use_global", TRUE);
|
||||
WM_keymap_add_item(keymap, "OBJECT_OT_delete", DELKEY, KM_PRESS, 0, 0);
|
||||
RNA_boolean_set(WM_keymap_add_item(keymap, "OBJECT_OT_delete", DELKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "global", TRUE);
|
||||
RNA_boolean_set(WM_keymap_add_item(keymap, "OBJECT_OT_delete", DELKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "use_global", TRUE);
|
||||
|
||||
WM_keymap_add_menu(keymap, "INFO_MT_add", AKEY, KM_PRESS, KM_SHIFT, 0);
|
||||
|
||||
|
@ -1763,10 +1763,13 @@ static int set_wpaint(bContext *C, wmOperator *UNUSED(op)) /* toggle */
|
||||
/* for switching to/from mode */
|
||||
static int paint_poll_test(bContext *C)
|
||||
{
|
||||
Object *ob= CTX_data_active_object(C);
|
||||
if(CTX_data_edit_object(C))
|
||||
return 0;
|
||||
if(CTX_data_active_object(C)==NULL)
|
||||
return 0;
|
||||
if(!ob->data || ((ID *)ob->data)->lib)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -648,9 +648,11 @@ static float brush_strength(Sculpt *sd, StrokeCache *cache, float feather)
|
||||
return feather;
|
||||
|
||||
case SCULPT_TOOL_GRAB:
|
||||
case SCULPT_TOOL_ROTATE:
|
||||
return feather;
|
||||
|
||||
case SCULPT_TOOL_ROTATE:
|
||||
return alpha*pressure*feather;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@ -1502,13 +1504,20 @@ static void do_rotate_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnod
|
||||
float bstrength= ss->cache->bstrength;
|
||||
float an[3];
|
||||
int n;
|
||||
float m[3][3];
|
||||
float m[4][4], rot[4][4], lmat[4][4], ilmat[4][4];
|
||||
static const int flip[8] = { 1, -1, -1, 1, -1, 1, 1, -1 };
|
||||
float angle = ss->cache->vertex_rotation * flip[ss->cache->mirror_symmetry_pass];
|
||||
|
||||
calc_sculpt_normal(sd, ob, an, nodes, totnode);
|
||||
|
||||
axis_angle_to_mat3(m, an, angle);
|
||||
unit_m4(m);
|
||||
unit_m4(lmat);
|
||||
|
||||
copy_v3_v3(lmat[3], ss->cache->location);
|
||||
invert_m4_m4(ilmat, lmat);
|
||||
axis_angle_to_mat4(rot, an, angle);
|
||||
|
||||
mul_serie_m4(m, lmat, rot, ilmat, NULL, NULL, NULL, NULL, NULL);
|
||||
|
||||
#pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
|
||||
for(n=0; n<totnode; n++) {
|
||||
@ -1532,7 +1541,7 @@ static void do_rotate_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnod
|
||||
const float fade = bstrength*tex_strength(ss, brush, origco[vd.i], test.dist,
|
||||
an, origno[vd.i], NULL);
|
||||
|
||||
mul_v3_m3v3(proxy[vd.i], m, origco[vd.i]);
|
||||
mul_v3_m4v3(proxy[vd.i], m, origco[vd.i]);
|
||||
sub_v3_v3(proxy[vd.i], origco[vd.i]);
|
||||
mul_v3_fl(proxy[vd.i], fade);
|
||||
|
||||
@ -3160,7 +3169,7 @@ static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, Object *ob, st
|
||||
dx = cache->mouse[0] - cache->initial_mouse[0];
|
||||
dy = cache->mouse[1] - cache->initial_mouse[1];
|
||||
|
||||
cache->vertex_rotation = -atan2(dx, dy);
|
||||
cache->vertex_rotation = -atan2(dx, dy) * cache->bstrength;
|
||||
|
||||
sd->draw_anchored = 1;
|
||||
copy_v2_v2(sd->anchored_initial_mouse, cache->initial_mouse);
|
||||
|
@ -212,6 +212,7 @@ static void clip_panel_operator_redo_operator(const bContext *C, Panel *pa, wmOp
|
||||
}
|
||||
}
|
||||
|
||||
/* TODO de-duplicate redo panel functions - campbell */
|
||||
static void clip_panel_operator_redo(const bContext *C, Panel *pa)
|
||||
{
|
||||
wmOperator *op= WM_operator_last_redo(C);
|
||||
@ -224,7 +225,7 @@ static void clip_panel_operator_redo(const bContext *C, Panel *pa)
|
||||
|
||||
block= uiLayoutGetBlock(pa->layout);
|
||||
|
||||
if(ED_undo_valid(C, op->type->name)==0)
|
||||
if (!WM_operator_check_ui_enabled(C, op->type->name))
|
||||
uiLayoutSetEnabled(pa->layout, 0);
|
||||
|
||||
/* note, blockfunc is a default but->func, use Handle func to allow button callbacks too */
|
||||
|
@ -715,7 +715,7 @@ int file_draw_check_exists(SpaceFile *sfile)
|
||||
if(RNA_boolean_get(sfile->op->ptr, "check_existing")) {
|
||||
char filepath[FILE_MAX];
|
||||
BLI_join_dirfile(filepath, sizeof(filepath), sfile->params->dir, sfile->params->file);
|
||||
if(BLI_exists(filepath) && !BLI_is_dir(filepath)) {
|
||||
if(BLI_is_file(filepath)) {
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
@ -1143,8 +1143,8 @@ int file_directory_exec(bContext *C, wmOperator *UNUSED(unused))
|
||||
BLI_dir_create_recursive(sfile->params->dir);
|
||||
}
|
||||
|
||||
/* special case, user may have pasted a fulepath into the directory */
|
||||
if(BLI_exists(sfile->params->dir) && BLI_is_dir(sfile->params->dir) == 0) {
|
||||
/* special case, user may have pasted a filepath into the directory */
|
||||
if(BLI_is_file(sfile->params->dir)) {
|
||||
char path[sizeof(sfile->params->dir)];
|
||||
BLI_strncpy(path, sfile->params->dir, sizeof(path));
|
||||
BLI_split_dirfile(path, sfile->params->dir, sfile->params->file, sizeof(sfile->params->dir), sizeof(sfile->params->file));
|
||||
|
@ -483,6 +483,7 @@ void node_tree_from_ID(ID *id, bNodeTree **ntree, bNodeTree **edittree, int *tre
|
||||
}
|
||||
else {
|
||||
*ntree= NULL;
|
||||
*edittree= NULL;
|
||||
if(treetype) *treetype= 0;
|
||||
}
|
||||
}
|
||||
|
@ -513,7 +513,7 @@ static int draw_tface_mapped__set_draw(void *userData, int index)
|
||||
|
||||
static int draw_em_tf_mapped__set_draw(void *userData, int index)
|
||||
{
|
||||
struct {DerivedMesh *dm; EditMesh *em; short has_mcol; short has_mtface;} *data = userData;
|
||||
struct {EditMesh *em; short has_mcol; short has_mtface; MFace *mf; MTFace *tf;} *data = userData;
|
||||
EditMesh *em = data->em;
|
||||
EditFace *efa= EM_get_face_for_index(index);
|
||||
MTFace *tface;
|
||||
@ -631,14 +631,12 @@ static void draw_mesh_text(Scene *scene, Object *ob, int glsl)
|
||||
|
||||
static int compareDrawOptions(void *userData, int cur_index, int next_index)
|
||||
{
|
||||
DerivedMesh *dm= (DerivedMesh*) userData;
|
||||
MFace *mf = DM_get_face_data_layer(dm, CD_MFACE);
|
||||
MTFace *tf = DM_get_face_data_layer(dm, CD_MTFACE);
|
||||
struct { MFace *mf; MTFace *tf; } *data = userData;
|
||||
|
||||
if(mf && mf[cur_index].mat_nr != mf[next_index].mat_nr)
|
||||
if(data->mf && data->mf[cur_index].mat_nr != data->mf[next_index].mat_nr)
|
||||
return 0;
|
||||
|
||||
if(tf && tf[cur_index].tpage != tf[next_index].tpage)
|
||||
if(data->tf && data->tf[cur_index].tpage != data->tf[next_index].tpage)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
@ -646,14 +644,12 @@ static int compareDrawOptions(void *userData, int cur_index, int next_index)
|
||||
|
||||
static int compareDrawOptionsEm(void *userData, int cur_index, int next_index)
|
||||
{
|
||||
struct {DerivedMesh *dm; EditMesh *em; short has_mcol; short has_mtface;} *data= userData;
|
||||
MFace *mf = DM_get_face_data_layer(data->dm, CD_MFACE);
|
||||
MTFace *tf = DM_get_face_data_layer(data->dm, CD_MTFACE);
|
||||
struct {EditMesh *em; short has_mcol; short has_mtface; MFace *mf; MTFace *tf;} *data= userData;
|
||||
|
||||
if(mf && mf[cur_index].mat_nr != mf[next_index].mat_nr)
|
||||
if(data->mf && data->mf[cur_index].mat_nr != data->mf[next_index].mat_nr)
|
||||
return 0;
|
||||
|
||||
if(tf && tf[cur_index].tpage != tf[next_index].tpage)
|
||||
if(data->tf && data->tf[cur_index].tpage != data->tf[next_index].tpage)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
@ -673,12 +669,13 @@ void draw_mesh_textured_old(Scene *scene, View3D *v3d, RegionView3D *rv3d, Objec
|
||||
glColor4f(1.0f,1.0f,1.0f,1.0f);
|
||||
|
||||
if(ob->mode & OB_MODE_EDIT) {
|
||||
struct {DerivedMesh *dm; EditMesh *em; short has_mcol; short has_mtface;} data;
|
||||
struct {EditMesh *em; short has_mcol; short has_mtface; MFace *mf; MTFace *tf;} data;
|
||||
|
||||
data.dm = dm;
|
||||
data.em= me->edit_mesh;
|
||||
data.has_mcol= CustomData_has_layer(&me->edit_mesh->fdata, CD_MCOL);
|
||||
data.has_mtface= CustomData_has_layer(&me->edit_mesh->fdata, CD_MTFACE);
|
||||
data.mf= DM_get_face_data_layer(dm, CD_MFACE);
|
||||
data.tf= DM_get_face_data_layer(dm, CD_MTFACE);
|
||||
|
||||
dm->drawMappedFacesTex(dm, draw_em_tf_mapped__set_draw, compareDrawOptionsEm, &data);
|
||||
}
|
||||
@ -696,10 +693,15 @@ void draw_mesh_textured_old(Scene *scene, View3D *v3d, RegionView3D *rv3d, Objec
|
||||
dm->drawFacesTex(dm, draw_tface__set_draw_legacy, NULL, NULL);
|
||||
}
|
||||
else {
|
||||
struct { MFace *mf; MTFace *tf; } userData;
|
||||
|
||||
if(!CustomData_has_layer(&dm->faceData,CD_TEXTURE_MCOL))
|
||||
add_tface_color_layer(dm);
|
||||
|
||||
dm->drawFacesTex(dm, draw_tface__set_draw, compareDrawOptions, dm);
|
||||
userData.mf = DM_get_face_data_layer(dm, CD_MFACE);
|
||||
userData.tf = DM_get_face_data_layer(dm, CD_MTFACE);
|
||||
|
||||
dm->drawFacesTex(dm, draw_tface__set_draw, compareDrawOptions, &userData);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2381,7 +2381,7 @@ static void draw_dm_edges_sharp(DerivedMesh *dm)
|
||||
* return 2 for the active face so it renders with stipple enabled */
|
||||
static int draw_dm_faces_sel__setDrawOptions(void *userData, int index, int *UNUSED(drawSmooth_r))
|
||||
{
|
||||
struct { DerivedMesh *dm; unsigned char *cols[3]; EditFace *efa_act; } * data = userData;
|
||||
struct { unsigned char *cols[3]; EditFace *efa_act; int *orig_index; } * data = userData;
|
||||
EditFace *efa = EM_get_face_for_index(index);
|
||||
unsigned char *col;
|
||||
|
||||
@ -2401,17 +2401,16 @@ static int draw_dm_faces_sel__setDrawOptions(void *userData, int index, int *UNU
|
||||
|
||||
static int draw_dm_faces_sel__compareDrawOptions(void *userData, int index, int next_index)
|
||||
{
|
||||
struct { DerivedMesh *dm; unsigned char *cols[3]; EditFace *efa_act; } *data = userData;
|
||||
int *orig_index= DM_get_face_data_layer(data->dm, CD_ORIGINDEX);
|
||||
struct { unsigned char *cols[3]; EditFace *efa_act; int *orig_index; } *data = userData;
|
||||
EditFace *efa;
|
||||
EditFace *next_efa;
|
||||
unsigned char *col, *next_col;
|
||||
|
||||
if(!orig_index)
|
||||
if(!data->orig_index)
|
||||
return 0;
|
||||
|
||||
efa= EM_get_face_for_index(orig_index[index]);
|
||||
next_efa= EM_get_face_for_index(orig_index[next_index]);
|
||||
efa= EM_get_face_for_index(data->orig_index[index]);
|
||||
next_efa= EM_get_face_for_index(data->orig_index[next_index]);
|
||||
|
||||
if(efa == next_efa)
|
||||
return 1;
|
||||
@ -2431,12 +2430,12 @@ static int draw_dm_faces_sel__compareDrawOptions(void *userData, int index, int
|
||||
/* also draws the active face */
|
||||
static void draw_dm_faces_sel(DerivedMesh *dm, unsigned char *baseCol, unsigned char *selCol, unsigned char *actCol, EditFace *efa_act)
|
||||
{
|
||||
struct { DerivedMesh *dm; unsigned char *cols[3]; EditFace *efa_act; } data;
|
||||
data.dm= dm;
|
||||
struct { unsigned char *cols[3]; EditFace *efa_act; int *orig_index; } data;
|
||||
data.cols[0] = baseCol;
|
||||
data.cols[1] = selCol;
|
||||
data.cols[2] = actCol;
|
||||
data.efa_act = efa_act;
|
||||
data.orig_index = DM_get_face_data_layer(dm, CD_ORIGINDEX);
|
||||
|
||||
dm->drawMappedFaces(dm, draw_dm_faces_sel__setDrawOptions, GPU_enable_material, draw_dm_faces_sel__compareDrawOptions, &data, 0);
|
||||
}
|
||||
|
@ -96,6 +96,7 @@ static void view3d_panel_operator_redo_operator(const bContext *C, Panel *pa, wm
|
||||
}
|
||||
}
|
||||
|
||||
/* TODO de-duplicate redo panel functions - campbell */
|
||||
static void view3d_panel_operator_redo(const bContext *C, Panel *pa)
|
||||
{
|
||||
wmOperator *op= WM_operator_last_redo(C);
|
||||
@ -108,7 +109,7 @@ static void view3d_panel_operator_redo(const bContext *C, Panel *pa)
|
||||
|
||||
block= uiLayoutGetBlock(pa->layout);
|
||||
|
||||
if(ED_undo_valid(C, op->type->name)==0)
|
||||
if (!WM_operator_check_ui_enabled(C, op->type->name))
|
||||
uiLayoutSetEnabled(pa->layout, 0);
|
||||
|
||||
/* note, blockfunc is a default but->func, use Handle func to allow button callbacks too */
|
||||
|
@ -294,7 +294,8 @@ static void createTransTexspace(TransInfo *t)
|
||||
|
||||
/* ********************* edge (for crease) ***** */
|
||||
|
||||
static void createTransEdge(TransInfo *t) {
|
||||
static void createTransEdge(TransInfo *t)
|
||||
{
|
||||
EditMesh *em = ((Mesh *)t->obedit->data)->edit_mesh;
|
||||
TransData *td = NULL;
|
||||
EditEdge *eed;
|
||||
@ -1919,8 +1920,8 @@ static void get_face_center(float *cent, EditMesh *em, EditVert *eve)
|
||||
}
|
||||
}
|
||||
|
||||
//way to overwrite what data is edited with transform
|
||||
//static void VertsToTransData(TransData *td, EditVert *eve, BakeKey *key)
|
||||
/* way to overwrite what data is edited with transform
|
||||
* static void VertsToTransData(TransData *td, EditVert *eve, BakeKey *key) */
|
||||
static void VertsToTransData(TransInfo *t, TransData *td, EditMesh *em, EditVert *eve)
|
||||
{
|
||||
td->flag = 0;
|
||||
@ -1952,33 +1953,6 @@ static void VertsToTransData(TransInfo *t, TransData *td, EditMesh *em, EditVert
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void createTransBMeshVerts(TransInfo *t, BME_Mesh *bm, BME_TransData_Head *td) {
|
||||
BME_Vert *v;
|
||||
BME_TransData *vtd;
|
||||
TransData *tob;
|
||||
int i;
|
||||
|
||||
tob = t->data = MEM_callocN(td->len*sizeof(TransData), "TransObData(Bevel tool)");
|
||||
|
||||
for (i=0,v=bm->verts.first;v;v=v->next) {
|
||||
if ( (vtd = BME_get_transdata(td,v)) ) {
|
||||
tob->loc = vtd->loc;
|
||||
tob->val = &vtd->factor;
|
||||
copy_v3_v3(tob->iloc,vtd->co);
|
||||
copy_v3_v3(tob->center,vtd->org);
|
||||
copy_v3_v3(tob->axismtx[0],vtd->vec);
|
||||
tob->axismtx[1][0] = vtd->max ? *vtd->max : 0;
|
||||
tob++;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
/* since td is a memarena, it can hold more transdata than actual elements
|
||||
* (i.e. we can't depend on td->len to determine the number of actual elements) */
|
||||
t->total = i;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void createTransEditVerts(bContext *C, TransInfo *t)
|
||||
{
|
||||
ToolSettings *ts = CTX_data_tool_settings(C);
|
||||
|
@ -126,8 +126,8 @@ static int ed_undo_step(bContext *C, int step, const char *undoname)
|
||||
ScrArea *sa= CTX_wm_area(C);
|
||||
|
||||
/* undo during jobs are running can easily lead to freeing data using by jobs,
|
||||
or they can just lead to freezing job in some other cases */
|
||||
if(WM_jobs_has_running(CTX_wm_manager(C))) {
|
||||
* or they can just lead to freezing job in some other cases */
|
||||
if (WM_jobs_test(CTX_wm_manager(C), CTX_data_scene(C))) {
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
@ -341,13 +341,24 @@ int ED_undo_operator_repeat(bContext *C, struct wmOperator *op)
|
||||
int ret= 0;
|
||||
|
||||
if(op) {
|
||||
wmWindowManager *wm= CTX_wm_manager(C);
|
||||
struct Scene *scene= CTX_data_scene(C);
|
||||
|
||||
ARegion *ar= CTX_wm_region(C);
|
||||
ARegion *ar1= BKE_area_find_region_type(CTX_wm_area(C), RGN_TYPE_WINDOW);
|
||||
|
||||
if(ar1)
|
||||
CTX_wm_region_set(C, ar1);
|
||||
|
||||
if(WM_operator_repeat_check(C, op) && WM_operator_poll(C, op->type)) {
|
||||
if ( (WM_operator_repeat_check(C, op)) &&
|
||||
(WM_operator_poll(C, op->type)) &&
|
||||
/* note, undo/redo cant run if there are jobs active,
|
||||
* check for screen jobs only so jobs like material/texture/world preview
|
||||
* (which copy their data), wont stop redo, see [#29579]],
|
||||
*
|
||||
* note, - WM_operator_check_ui_enabled() jobs test _must_ stay in sync with this */
|
||||
(WM_jobs_test(wm, scene) == 0))
|
||||
{
|
||||
int retval;
|
||||
|
||||
if (G.f & G_DEBUG)
|
||||
|
@ -83,7 +83,8 @@ typedef enum GPUBuiltin {
|
||||
GPU_INVERSE_OBJECT_MATRIX = 8,
|
||||
GPU_VIEW_POSITION = 16,
|
||||
GPU_VIEW_NORMAL = 32,
|
||||
GPU_OBCOLOR = 64
|
||||
GPU_OBCOLOR = 64,
|
||||
GPU_AUTO_BUMPSCALE = 128
|
||||
} GPUBuiltin;
|
||||
|
||||
typedef enum GPUBlendMode {
|
||||
@ -129,7 +130,7 @@ void GPU_material_free(struct Material *ma);
|
||||
void GPU_materials_free(void);
|
||||
|
||||
void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double time, int mipmap);
|
||||
void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4], float obcol[4]);
|
||||
void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4], float obcol[4], float autobumpscale);
|
||||
void GPU_material_unbind(GPUMaterial *material);
|
||||
int GPU_material_bound(GPUMaterial *material);
|
||||
|
||||
@ -162,6 +163,7 @@ typedef enum GPUDynamicType {
|
||||
GPU_DYNAMIC_OBJECT_VIEWIMAT = 3,
|
||||
GPU_DYNAMIC_OBJECT_IMAT = 4,
|
||||
GPU_DYNAMIC_OBJECT_COLOR = 5,
|
||||
GPU_DYNAMIC_OBJECT_AUTOBUMPSCALE = 15,
|
||||
GPU_DYNAMIC_LAMP_FIRST = 6,
|
||||
GPU_DYNAMIC_LAMP_DYNVEC = 6,
|
||||
GPU_DYNAMIC_LAMP_DYNCO = 7,
|
||||
|
@ -344,6 +344,8 @@ const char *GPU_builtin_name(GPUBuiltin builtin)
|
||||
return "varnormal";
|
||||
else if(builtin == GPU_OBCOLOR)
|
||||
return "unfobcolor";
|
||||
else if(builtin == GPU_AUTO_BUMPSCALE)
|
||||
return "unfobautobumpscale";
|
||||
else
|
||||
return "";
|
||||
}
|
||||
|
@ -60,6 +60,7 @@
|
||||
#include "BKE_node.h"
|
||||
#include "BKE_object.h"
|
||||
#include "BKE_scene.h"
|
||||
#include "BKE_DerivedMesh.h"
|
||||
|
||||
#include "BLI_threads.h"
|
||||
#include "BLI_blenlib.h"
|
||||
@ -1155,11 +1156,14 @@ int GPU_enable_material(int nr, void *attribs)
|
||||
if(gattribs && GMS.gmatbuf[nr]) {
|
||||
/* bind glsl material and get attributes */
|
||||
Material *mat = GMS.gmatbuf[nr];
|
||||
float auto_bump_scale;
|
||||
|
||||
gpumat = GPU_material_from_blender(GMS.gscene, mat);
|
||||
GPU_material_vertex_attributes(gpumat, gattribs);
|
||||
GPU_material_bind(gpumat, GMS.gob->lay, GMS.glay, 1.0, !(GMS.gob->mode & OB_MODE_TEXTURE_PAINT));
|
||||
GPU_material_bind_uniforms(gpumat, GMS.gob->obmat, GMS.gviewmat, GMS.gviewinv, GMS.gob->col);
|
||||
|
||||
auto_bump_scale = GMS.gob->derivedFinal != NULL ? GMS.gob->derivedFinal->auto_bump_scale : 1.0f;
|
||||
GPU_material_bind_uniforms(gpumat, GMS.gob->obmat, GMS.gviewmat, GMS.gviewinv, GMS.gob->col, auto_bump_scale);
|
||||
GMS.gboundmat= mat;
|
||||
|
||||
/* for glsl use alpha blend mode, unless it's set to solid and
|
||||
|
@ -94,7 +94,7 @@ struct GPUMaterial {
|
||||
/* for passing uniforms */
|
||||
int viewmatloc, invviewmatloc;
|
||||
int obmatloc, invobmatloc;
|
||||
int obcolloc;
|
||||
int obcolloc, obautobumpscaleloc;
|
||||
|
||||
ListBase lamps;
|
||||
};
|
||||
@ -212,7 +212,8 @@ static int GPU_material_construct_end(GPUMaterial *material)
|
||||
material->invobmatloc = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_INVERSE_OBJECT_MATRIX));
|
||||
if(material->builtins & GPU_OBCOLOR)
|
||||
material->obcolloc = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_OBCOLOR));
|
||||
|
||||
if(material->builtins & GPU_AUTO_BUMPSCALE)
|
||||
material->obautobumpscaleloc = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_AUTO_BUMPSCALE));
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -273,7 +274,7 @@ void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double tim
|
||||
}
|
||||
}
|
||||
|
||||
void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4], float obcol[4])
|
||||
void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4], float viewinv[][4], float obcol[4], float autobumpscale)
|
||||
{
|
||||
if(material->pass) {
|
||||
GPUShader *shader = GPU_pass_shader(material->pass);
|
||||
@ -300,7 +301,9 @@ void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float v
|
||||
CLAMP(col[3], 0.0f, 1.0f);
|
||||
GPU_shader_uniform_vector(shader, material->obcolloc, 4, 1, col);
|
||||
}
|
||||
|
||||
if(material->builtins & GPU_AUTO_BUMPSCALE) {
|
||||
GPU_shader_uniform_vector(shader, material->obautobumpscaleloc, 1, 1, &autobumpscale);
|
||||
}
|
||||
/* update lamps */
|
||||
for(nlink=material->lamps.first; nlink; nlink=nlink->next) {
|
||||
lamp= nlink->data;
|
||||
@ -1087,8 +1090,7 @@ static void do_material_tex(GPUShadeInput *shi)
|
||||
/* ntap bumpmap image */
|
||||
int iBumpSpace;
|
||||
float ima_x, ima_y;
|
||||
float hScale = 0.1f; // compatibility adjustment factor for all bumpspace types
|
||||
float hScaleTex = 13.0f; // factor for scaling texspace bumps
|
||||
float hScale;
|
||||
|
||||
float imag_tspace_dimension_x = 1024.0f; // only used for texture space variant
|
||||
float aspect = 1.0f;
|
||||
@ -1097,16 +1099,35 @@ static void do_material_tex(GPUShadeInput *shi)
|
||||
GPUNodeLink *vR1, *vR2;
|
||||
GPUNodeLink *dBs, *dBt, *fDet;
|
||||
|
||||
hScale = 0.1; // compatibility adjustment factor for all bumpspace types
|
||||
if( mtex->texflag & MTEX_BUMP_TEXTURESPACE )
|
||||
hScale = hScaleTex;
|
||||
hScale = 13.0f; // factor for scaling texspace bumps
|
||||
else if(found_deriv_map!=0)
|
||||
hScale = 1.0f;
|
||||
|
||||
// resolve texture resolution
|
||||
if( (mtex->texflag & MTEX_BUMP_TEXTURESPACE) || found_deriv_map ) {
|
||||
ImBuf *ibuf= BKE_image_get_ibuf(tex->ima, &tex->iuser);
|
||||
ima_x= 512.0f; ima_y= 512.f; // prevent calling textureSize, glsl 1.3 only
|
||||
if(ibuf) {
|
||||
ima_x= ibuf->x;
|
||||
ima_y= ibuf->y;
|
||||
aspect = ((float) ima_y) / ima_x;
|
||||
}
|
||||
}
|
||||
|
||||
// The negate on norfac is done because the
|
||||
// normal in the renderer points inward which corresponds
|
||||
// to inverting the bump map. Should this ever change
|
||||
// this negate must be removed.
|
||||
norfac = -hScale * mtex->norfac;
|
||||
if(found_deriv_map) norfac /= sqrtf(ima_x*ima_y);
|
||||
|
||||
tnorfac = GPU_uniform(&norfac);
|
||||
|
||||
if(found_deriv_map)
|
||||
GPU_link(mat, "math_multiply", tnorfac, GPU_builtin(GPU_AUTO_BUMPSCALE), &tnorfac);
|
||||
|
||||
if(GPU_link_changed(stencil))
|
||||
GPU_link(mat, "math_multiply", tnorfac, stencil, &tnorfac);
|
||||
|
||||
@ -1153,17 +1174,6 @@ static void do_material_tex(GPUShadeInput *shi)
|
||||
iBumpSpacePrev = iBumpSpace;
|
||||
}
|
||||
|
||||
// resolve texture resolution
|
||||
if( (mtex->texflag & MTEX_BUMP_TEXTURESPACE) || found_deriv_map ) {
|
||||
ImBuf *ibuf= BKE_image_get_ibuf(tex->ima, &tex->iuser);
|
||||
ima_x= 512.0f; ima_y= 512.f; // prevent calling textureSize, glsl 1.3 only
|
||||
if(ibuf) {
|
||||
ima_x= ibuf->x;
|
||||
ima_y= ibuf->y;
|
||||
aspect = ((float) ima_y) / ima_x;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(found_deriv_map) {
|
||||
GPU_link( mat, "mtex_bump_deriv",
|
||||
@ -1703,6 +1713,7 @@ GPUShaderExport *GPU_shader_export(struct Scene *scene, struct Material *ma)
|
||||
{ GPU_OBJECT_MATRIX, GPU_DYNAMIC_OBJECT_MAT, GPU_DATA_16F },
|
||||
{ GPU_INVERSE_OBJECT_MATRIX, GPU_DYNAMIC_OBJECT_IMAT, GPU_DATA_16F },
|
||||
{ GPU_OBCOLOR, GPU_DYNAMIC_OBJECT_COLOR, GPU_DATA_4F },
|
||||
{ GPU_AUTO_BUMPSCALE, GPU_DYNAMIC_OBJECT_AUTOBUMPSCALE, GPU_DATA_1F },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
|
@ -255,7 +255,7 @@ typedef struct Curve {
|
||||
#define CU_STRETCH 128
|
||||
#define CU_OFFS_PATHDIST 256
|
||||
#define CU_FAST 512 /* Font: no filling inside editmode */
|
||||
#define CU_RETOPO 1024
|
||||
/* #define CU_RETOPO 1024 */ /* DEPRECATED */
|
||||
#define CU_DS_EXPAND 2048
|
||||
#define CU_PATH_RADIUS 4096 /* make use of the path radius if this is enabled (default for new curves) */
|
||||
#define CU_DEFORM_FILL 8192 /* fill 2d curve after deformation */
|
||||
|
@ -94,7 +94,7 @@ typedef struct MSticky {
|
||||
|
||||
typedef struct MSelect {
|
||||
int index;
|
||||
int type;
|
||||
int type; /* EDITVERT/EDITEDGE/EDITFACE */
|
||||
} MSelect;
|
||||
|
||||
typedef struct MTFace {
|
||||
@ -196,11 +196,6 @@ typedef struct MRecast{
|
||||
#define ME_SHARP (1<<9) /* only reason this flag remains a 'short' */
|
||||
|
||||
/* puno = vertexnormal (mface) */
|
||||
/* render assumes flips to be ordered like this */
|
||||
#define ME_FLIPV1 1
|
||||
#define ME_FLIPV2 2
|
||||
#define ME_FLIPV3 4
|
||||
#define ME_FLIPV4 8
|
||||
#define ME_PROJXY 16
|
||||
#define ME_PROJXZ 32
|
||||
#define ME_PROJYZ 64
|
||||
@ -216,11 +211,6 @@ typedef struct MRecast{
|
||||
#define ME_SMOOTH 1
|
||||
#define ME_FACE_SEL 2
|
||||
/* flag ME_HIDE==16 is used here too */
|
||||
/* mselect->type */
|
||||
#define ME_VSEl 0
|
||||
#define ME_ESEl 1
|
||||
#define ME_FSEL 2
|
||||
|
||||
/* mtface->flag */
|
||||
#define TF_SELECT 1 /* use MFace hide flag (after 2.43), should be able to reuse after 2.44 */
|
||||
#define TF_ACTIVE 2 /* deprecated! */
|
||||
|
@ -421,8 +421,8 @@ typedef struct SoftBody {
|
||||
#define OB_SB_SELF 512
|
||||
#define OB_SB_FACECOLL 1024
|
||||
#define OB_SB_EDGECOLL 2048
|
||||
#define OB_SB_COLLFINAL 4096 /* deprecated */
|
||||
#define OB_SB_BIG_UI 8192
|
||||
/* #define OB_SB_COLLFINAL 4096 */ /* deprecated */
|
||||
/* #define OB_SB_BIG_UI 8192 */ /* deprecated */
|
||||
#define OB_SB_AERO_ANGLE 16384
|
||||
|
||||
/* sb->solverflags */
|
||||
|
@ -553,23 +553,6 @@ typedef struct SpaceClip {
|
||||
#define BUTS_CONSTRAINT 13
|
||||
#define BUTS_EFFECTS 14
|
||||
|
||||
/* sbuts->tab new (deprecated) */
|
||||
#define TAB_SHADING_MAT 0
|
||||
#define TAB_SHADING_TEX 1
|
||||
#define TAB_SHADING_RAD 2
|
||||
#define TAB_SHADING_WORLD 3
|
||||
#define TAB_SHADING_LAMP 4
|
||||
|
||||
#define TAB_OBJECT_OBJECT 0
|
||||
#define TAB_OBJECT_PHYSICS 1
|
||||
#define TAB_OBJECT_PARTICLE 2
|
||||
|
||||
#define TAB_SCENE_RENDER 0
|
||||
#define TAB_SCENE_WORLD 1
|
||||
#define TAB_SCENE_ANIM 2
|
||||
#define TAB_SCENE_SOUND 3
|
||||
#define TAB_SCENE_SEQUENCER 4
|
||||
|
||||
/* buts->mainb new */
|
||||
#define BCONTEXT_RENDER 0
|
||||
#define BCONTEXT_SCENE 1
|
||||
@ -684,7 +667,7 @@ enum FileSortTypeE {
|
||||
|
||||
|
||||
/* Selection Flags in filesel: struct direntry, unsigned char selflag */
|
||||
#define ACTIVE_FILE (1<<1)
|
||||
/* #define ACTIVE_FILE (1<<1) */ /* UNUSED */
|
||||
#define HILITED_FILE (1<<2)
|
||||
#define SELECTED_FILE (1<<3)
|
||||
#define EDITING_FILE (1<<4)
|
||||
|
@ -510,7 +510,7 @@ typedef struct ColorMapping {
|
||||
#define MTEX_BLEND_SAT 11
|
||||
#define MTEX_BLEND_VAL 12
|
||||
#define MTEX_BLEND_COLOR 13
|
||||
#define MTEX_NUM_BLENDTYPES 14
|
||||
/* free for use */
|
||||
#define MTEX_SOFT_LIGHT 15
|
||||
#define MTEX_LIN_LIGHT 16
|
||||
|
||||
|
@ -469,7 +469,7 @@ static const char *rna_ensure_property_description(PropertyRNA *prop)
|
||||
}
|
||||
|
||||
#ifdef WITH_INTERNATIONAL
|
||||
if((U.transopts&USER_DOTRANSLATE) && (U.transopts&USER_TR_TOOLTIPS))
|
||||
if(description && (U.transopts&USER_DOTRANSLATE) && (U.transopts&USER_TR_TOOLTIPS))
|
||||
description= BLF_gettext(description);
|
||||
#endif
|
||||
|
||||
|
@ -1404,7 +1404,7 @@ static void rna_def_scene_actuator(BlenderRNA *brna)
|
||||
prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
|
||||
RNA_def_property_enum_sdna(prop, NULL, "type");
|
||||
RNA_def_property_enum_items(prop, prop_type_items);
|
||||
RNA_def_property_ui_text(prop, "Scene", "");
|
||||
RNA_def_property_ui_text(prop, "Mode", "");
|
||||
RNA_def_property_update(prop, NC_LOGIC, NULL);
|
||||
|
||||
//XXX filter only camera objects
|
||||
|
@ -1080,7 +1080,7 @@ static void rna_def_fmodifier(BlenderRNA *brna)
|
||||
prop= RNA_def_property(srna, "blend_out", PROP_FLOAT, PROP_NONE);
|
||||
RNA_def_property_float_sdna(prop, NULL, "blendout");
|
||||
RNA_def_property_float_funcs(prop, NULL, NULL, "rna_FModifier_blending_range");
|
||||
RNA_def_property_ui_text(prop, "Blend Out", "Number of frames from start frame for influence to fade out");
|
||||
RNA_def_property_ui_text(prop, "Blend Out", "Number of frames from end frame for influence to fade out");
|
||||
RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_PROP, NULL);
|
||||
|
||||
/* influence */
|
||||
|
@ -572,7 +572,7 @@ void rna_Main_armatures_tag(Main *bmain, int value) { tag_main_lb(&bmain->armatu
|
||||
void rna_Main_actions_tag(Main *bmain, int value) { tag_main_lb(&bmain->action, value); }
|
||||
void rna_Main_particles_tag(Main *bmain, int value) { tag_main_lb(&bmain->particle, value); }
|
||||
void rna_Main_gpencil_tag(Main *bmain, int value) { tag_main_lb(&bmain->gpencil, value); }
|
||||
void rna_Main_movieclips_tag(Main *bmain, int value) { tag_main_lb(&bmain->text, value); }
|
||||
void rna_Main_movieclips_tag(Main *bmain, int value) { tag_main_lb(&bmain->movieclip, value); }
|
||||
|
||||
static int rna_Main_cameras_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_CA); }
|
||||
static int rna_Main_scenes_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_SCE); }
|
||||
|
@ -2072,6 +2072,8 @@ static void rna_def_object(BlenderRNA *brna)
|
||||
|
||||
prop= RNA_def_property(srna, "delta_scale", PROP_FLOAT, PROP_XYZ);
|
||||
RNA_def_property_float_sdna(prop, NULL, "dscale");
|
||||
RNA_def_property_ui_range(prop, -FLT_MAX, FLT_MAX, 1, 3);
|
||||
RNA_def_property_float_array_default(prop, default_scale);
|
||||
RNA_def_property_ui_text(prop, "Delta Scale", "Extra scaling added to the scale of the object");
|
||||
RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_internal_update");
|
||||
|
||||
|
@ -186,9 +186,7 @@ static void deformVerts_do(HookModifierData *hmd, Object *ob, DerivedMesh *dm,
|
||||
float fac;
|
||||
const int *origindex_ar;
|
||||
|
||||
/* if DerivedMesh is present and has original index data,
|
||||
* use it
|
||||
*/
|
||||
/* if DerivedMesh is present and has original index data, use it */
|
||||
if(dm && (origindex_ar= dm->getVertDataArray(dm, CD_ORIGINDEX))) {
|
||||
for(i= 0, index_pt= hmd->indexar; i < hmd->totindex; i++, index_pt++) {
|
||||
if(*index_pt < numVerts) {
|
||||
@ -251,12 +249,8 @@ static void deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData,
|
||||
int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
|
||||
{
|
||||
HookModifierData *hmd = (HookModifierData*) md;
|
||||
DerivedMesh *dm = get_dm(ob, NULL, derivedData, NULL, 0);
|
||||
|
||||
deformVerts_do(hmd, ob, dm, vertexCos, numVerts);
|
||||
|
||||
if(derivedData != dm)
|
||||
dm->release(dm);
|
||||
deformVerts_do(hmd, ob, derivedData, vertexCos, numVerts);
|
||||
}
|
||||
|
||||
static void deformVertsEM(ModifierData *md, Object *ob, struct EditMesh *editData,
|
||||
|
@ -87,6 +87,7 @@ PyInit_gpu(void)
|
||||
PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_VIEWIMAT);
|
||||
PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_IMAT);
|
||||
PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_COLOR);
|
||||
PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_OBJECT_AUTOBUMPSCALE);
|
||||
PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNVEC);
|
||||
PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNCO);
|
||||
PY_MODULE_ADD_CONSTANT(m, GPU_DYNAMIC_LAMP_DYNIMAT);
|
||||
|
@ -1932,11 +1932,13 @@ static int ntap_bump_compute(NTapBump *ntap_bump, ShadeInput *shi, MTex *mtex, T
|
||||
float *nvec = texres->nor;
|
||||
texres->nor = NULL;
|
||||
|
||||
if( mtex->texflag & MTEX_BUMP_TEXTURESPACE ) {
|
||||
if(tex->ima)
|
||||
Hscale *= 13.0f; // appears to be a sensible default value
|
||||
} else
|
||||
Hscale *= 0.1f; // factor 0.1 proved to look like the previous bump code
|
||||
if(found_deriv_map==0) {
|
||||
if( mtex->texflag & MTEX_BUMP_TEXTURESPACE ) {
|
||||
if(tex->ima)
|
||||
Hscale *= 13.0f; // appears to be a sensible default value
|
||||
} else
|
||||
Hscale *= 0.1f; // factor 0.1 proved to look like the previous bump code
|
||||
}
|
||||
|
||||
if( !ntap_bump->init_done ) {
|
||||
copy_v3_v3(ntap_bump->vNacc, shi->vn);
|
||||
@ -1958,15 +1960,21 @@ static int ntap_bump_compute(NTapBump *ntap_bump, ShadeInput *shi, MTex *mtex, T
|
||||
}
|
||||
|
||||
if(found_deriv_map) {
|
||||
float dBdu, dBdv;
|
||||
float dBdu, dBdv, auto_bump = 1.0f;
|
||||
float s = 1; // negate this if flipped texture coordinate
|
||||
texco_mapping(shi, tex, mtex, co, dx, dy, texvec, dxt, dyt);
|
||||
rgbnor = multitex_mtex(shi, mtex, texvec, dxt, dyt, texres);
|
||||
|
||||
if(shi->obr->ob->derivedFinal)
|
||||
{
|
||||
auto_bump = shi->obr->ob->derivedFinal->auto_bump_scale;
|
||||
auto_bump /= sqrtf((float) (dimx*dimy));
|
||||
}
|
||||
|
||||
// this variant using a derivative map is described here
|
||||
// http://mmikkelsen3d.blogspot.com/2011/07/derivative-maps.html
|
||||
dBdu = Hscale*dimx*(2*texres->tr-1);
|
||||
dBdv = Hscale*dimy*(2*texres->tg-1);
|
||||
dBdu = auto_bump*Hscale*dimx*(2*texres->tr-1);
|
||||
dBdv = auto_bump*Hscale*dimy*(2*texres->tg-1);
|
||||
|
||||
dHdx = dBdu*dxt[0] + s * dBdv*dxt[1];
|
||||
dHdy = dBdu*dyt[0] + s * dBdv*dyt[1];
|
||||
|
@ -191,6 +191,7 @@ struct wmOperatorTypeMacro *WM_operatortype_macro_define(struct wmOperatorType *
|
||||
int WM_operator_poll (struct bContext *C, struct wmOperatorType *ot);
|
||||
int WM_operator_poll_context(struct bContext *C, struct wmOperatorType *ot, int context);
|
||||
int WM_operator_call (struct bContext *C, struct wmOperator *op);
|
||||
int WM_operator_call_notest(struct bContext *C, struct wmOperator *op);
|
||||
int WM_operator_repeat (struct bContext *C, struct wmOperator *op);
|
||||
int WM_operator_repeat_check(const struct bContext *C, struct wmOperator *op);
|
||||
int WM_operator_name_call (struct bContext *C, const char *opstring, int context, struct PointerRNA *properties);
|
||||
@ -206,6 +207,7 @@ void WM_operator_properties_gesture_border(struct wmOperatorType *ot, int exten
|
||||
void WM_operator_properties_gesture_straightline(struct wmOperatorType *ot, int cursor);
|
||||
void WM_operator_properties_select_all(struct wmOperatorType *ot);
|
||||
|
||||
int WM_operator_check_ui_enabled(const struct bContext *C, const char *idname);
|
||||
wmOperator *WM_operator_last_redo(const struct bContext *C);
|
||||
|
||||
/* MOVE THIS SOMEWHERE ELSE */
|
||||
|
@ -597,12 +597,36 @@ static int wm_operator_exec(bContext *C, wmOperator *op, int repeat)
|
||||
|
||||
}
|
||||
|
||||
/* for running operators with frozen context (modal handlers, menus) */
|
||||
/* simply calls exec with basic checks */
|
||||
static int wm_operator_exec_notest(bContext *C, wmOperator *op)
|
||||
{
|
||||
int retval= OPERATOR_CANCELLED;
|
||||
|
||||
if(op==NULL || op->type==NULL || op->type->exec==NULL)
|
||||
return retval;
|
||||
|
||||
retval= op->type->exec(C, op);
|
||||
OPERATOR_RETVAL_CHECK(retval);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* for running operators with frozen context (modal handlers, menus)
|
||||
*
|
||||
* warning: do not use this within an operator to call its self! [#29537] */
|
||||
int WM_operator_call(bContext *C, wmOperator *op)
|
||||
{
|
||||
return wm_operator_exec(C, op, 0);
|
||||
}
|
||||
|
||||
/* this is intended to be used when an invoke operator wants to call exec on its self
|
||||
* and is basically like running op->type->exec() directly, no poll checks no freeing,
|
||||
* since we assume whoever called invokle will take care of that */
|
||||
int WM_operator_call_notest(bContext *C, wmOperator *op)
|
||||
{
|
||||
return wm_operator_exec_notest(C, op);
|
||||
}
|
||||
|
||||
/* do this operator again, put here so it can share above code */
|
||||
int WM_operator_repeat(bContext *C, wmOperator *op)
|
||||
{
|
||||
|
@ -802,7 +802,7 @@ int WM_operator_confirm(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
|
||||
int WM_operator_filesel(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
|
||||
{
|
||||
if (RNA_property_is_set(op->ptr, "filepath")) {
|
||||
return WM_operator_call(C, op);
|
||||
return WM_operator_call_notest(C, op); /* call exec direct */
|
||||
}
|
||||
else {
|
||||
WM_event_add_fileselect(C, op);
|
||||
@ -907,6 +907,15 @@ int WM_operator_winactive(bContext *C)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* return FALSE, if the UI should be disabled */
|
||||
int WM_operator_check_ui_enabled(const bContext *C, const char *idname)
|
||||
{
|
||||
wmWindowManager *wm= CTX_wm_manager(C);
|
||||
Scene *scene= CTX_data_scene(C);
|
||||
|
||||
return !(ED_undo_valid(C, idname)==0 || WM_jobs_test(wm, scene));
|
||||
}
|
||||
|
||||
wmOperator *WM_operator_last_redo(const bContext *C)
|
||||
{
|
||||
wmWindowManager *wm= CTX_wm_manager(C);
|
||||
@ -940,7 +949,7 @@ static uiBlock *wm_block_create_redo(bContext *C, ARegion *ar, void *arg_op)
|
||||
uiBlockSetHandleFunc(block, ED_undo_operator_repeat_cb_evt, arg_op);
|
||||
layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, width, UI_UNIT_Y, style);
|
||||
|
||||
if(ED_undo_valid(C, op->type->name)==0)
|
||||
if (!WM_operator_check_ui_enabled(C, op->type->name))
|
||||
uiLayoutSetEnabled(layout, 0);
|
||||
|
||||
if(op->type->flag & OPTYPE_MACRO) {
|
||||
@ -1628,7 +1637,7 @@ static void WM_OT_open_mainfile(wmOperatorType *ot)
|
||||
static int wm_link_append_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
|
||||
{
|
||||
if(RNA_property_is_set(op->ptr, "filepath")) {
|
||||
return WM_operator_call(C, op);
|
||||
return WM_operator_call_notest(C, op);
|
||||
}
|
||||
else {
|
||||
/* XXX TODO solve where to get last linked library from */
|
||||
@ -1994,6 +2003,7 @@ static int wm_save_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(
|
||||
{
|
||||
char name[FILE_MAX];
|
||||
int check_existing=1;
|
||||
int ret;
|
||||
|
||||
/* cancel if no active window */
|
||||
if (CTX_wm_window(C) == NULL)
|
||||
@ -2018,16 +2028,20 @@ static int wm_save_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(
|
||||
check_existing = 0;
|
||||
|
||||
if (G.save_over) {
|
||||
if (check_existing)
|
||||
if (check_existing && BLI_exists(name)) {
|
||||
uiPupMenuSaveOver(C, op, name);
|
||||
else {
|
||||
wm_save_as_mainfile_exec(C, op);
|
||||
ret= OPERATOR_RUNNING_MODAL;
|
||||
}
|
||||
} else {
|
||||
else {
|
||||
ret= wm_save_as_mainfile_exec(C, op);
|
||||
}
|
||||
}
|
||||
else {
|
||||
WM_event_add_fileselect(C, op);
|
||||
ret= OPERATOR_RUNNING_MODAL;
|
||||
}
|
||||
|
||||
return OPERATOR_RUNNING_MODAL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void WM_OT_save_mainfile(wmOperatorType *ot)
|
||||
|
@ -8,6 +8,7 @@
|
||||
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_main.h"
|
||||
#include "BKE_DerivedMesh.h"
|
||||
|
||||
#include "BL_BlenderShader.h"
|
||||
#include "BL_Material.h"
|
||||
@ -146,7 +147,8 @@ void BL_BlenderShader::Update(const RAS_MeshSlot & ms, RAS_IRasterizer* rasty )
|
||||
else
|
||||
obcol[0]= obcol[1]= obcol[2]= obcol[3]= 1.0f;
|
||||
|
||||
GPU_material_bind_uniforms(gpumat, obmat, viewmat, viewinvmat, obcol);
|
||||
float auto_bump_scale = ms.m_pDerivedMesh!=0 ? ms.m_pDerivedMesh->auto_bump_scale : 1.0f;
|
||||
GPU_material_bind_uniforms(gpumat, obmat, viewmat, viewinvmat, obcol, auto_bump_scale);
|
||||
|
||||
mAlphaBlend = GPU_material_alpha_blend(gpumat, obcol);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user